How to use the MOVE16 instruction in a 68040
Submitted By:
Unknown
Rating:
Not rated (
Rate It)
#include <proto/exec.h>
#include <exec/execbase.h>
#include <exec/memory.h>
#include <proto/dos.h>
#include <stdio.h>
#include <stdlib.h>
#define MEMSIZE (1024000L)
void __regargs MoveMem(ULONG *,ULONG *,ULONG);
void __regargs MoveMem16(ULONG *,ULONG *,ULONG);
void main(void);
struct tt {
long days;
long minutes;
long ticks;
} tt,tt2;
void main()
{
unsigned long cpu68040;
register unsigned int i;
ULONG *src1,*src2;
ULONG *org1,*org2,*tptr1,*tptr2;
ULONG tlong;
double q,q2;
double q3,q4;
struct ExecBase **execbaseptr=(struct ExecBase **)4;
struct ExecBase *execbase;
execbase = *execbaseptr;
cpu68040 = execbase->AttnFlags;
if (cpu68040 & AFF_68040)
cpu68040 = 0xffL;
else
cpu68040 = 0L;
if (!cpu68040)
{
printf("You need a 68040 system\n");
exit(0);
}
execbase = *execbaseptr;
cpu68040 = execbase->AttnFlags;
if (cpu68040 & AFF_FPU40)
cpu68040 = 0xffL;
else
cpu68040 = 0L;
if (!cpu68040)
{
printf("You need a 68040 system With a Math Chip Builtin\n");
exit(0);
}
if (!(org1 = src1 = (ULONG *)AllocMem(MEMSIZE+16,MEMF_FAST)))
{
printf("No FAST mem\n");
exit(0);
}
tlong = (ULONG)src1;
tlong &= 0xfffffff0L;
tlong += 0x10L;
src1 = (ULONG *)tlong;
if (!(org2 = src2 = (ULONG *)AllocMem(MEMSIZE+16,MEMF_FAST)))
{
FreeMem(org1,MEMSIZE+16);
printf("No Fast mem\n");
exit(0);
}
tlong = (ULONG)src2;
tlong &= 0xfffffff0L;
tlong += 0x10L;
src2 = (ULONG *)tlong;
Forbid();
DateStamp((struct DateStamp *)&tt);
for(i=0;i<10;i++)
MoveMem(src1,src2,(MEMSIZE/16));
DateStamp((struct DateStamp *)&tt2);
q = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q2 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q = q2 - q;
DateStamp((struct DateStamp *)&tt);
for(i=0;i<10;i++)
MoveMem16(src1,src2,(MEMSIZE/16));
DateStamp((struct DateStamp *)&tt2);
q3 = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q4 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q3 = q4 - q3;
Permit();
FreeMem((char *)org1,MEMSIZE+16);
FreeMem((char *)org2,MEMSIZE+16);
printf("**FAST TO FAST**\n");
printf("MoveMem = %3.4lf secs\n",q);
printf("MoveMem16 = %3.4lf secs\n",q3);
if (!(org1 = src1 = (ULONG *)AllocMem(MEMSIZE+16,MEMF_FAST)))
{
printf("No FAST mem\n");
exit(0);
}
tlong = (ULONG)src1;
tlong &= 0xfffffff0L;
tlong += 0x10L;
src1 = (ULONG *)tlong;
if (!(org2 = src2 = (ULONG *)AllocMem(MEMSIZE+16,MEMF_CHIP)))
{
FreeMem(org1,MEMSIZE+16);
printf("No CHIP mem\n");
exit(0);
}
tlong = (ULONG)src2;
tlong &= 0xfffffff0L;
tlong += 0x10L;
src2 = (ULONG *)tlong;
Forbid();
DateStamp((struct DateStamp *)&tt);
for(i=0;i<10;i++)
MoveMem(src1,src2,(MEMSIZE/16));
DateStamp((struct DateStamp *)&tt2);
q = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q2 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q = q2 - q;
DateStamp((struct DateStamp *)&tt);
for(i=0;i<10;i++)
MoveMem16(src1,src2,(MEMSIZE/16));
DateStamp((struct DateStamp *)&tt2);
q3 = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q4 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q3 = q4 - q3;
Permit();
printf("**Fast to CHIP**\n");
printf("MoveMem = %3.4lf secs\n",q);
printf("MoveMem16 = %3.4lf secs\n",q3);
Forbid();
DateStamp((struct DateStamp *)&tt);
for(i=0;i<10;i++)
MoveMem(src2,src1,(MEMSIZE/16));
DateStamp((struct DateStamp *)&tt2);
q = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q2 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q = q2 - q;
DateStamp((struct DateStamp *)&tt);
for(i=0;i<10;i++)
MoveMem16(src2,src1,(MEMSIZE/16));
DateStamp((struct DateStamp *)&tt2);
q3 = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q4 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q3 = q4 - q3;
Permit();
printf("**CHIP to Fast**\n");
printf("MoveMem = %3.4lf secs\n",q);
printf("MoveMem16 = %3.4lf secs\n",q3);
Forbid();
tptr1 = src2;
tlong = (ULONG)src2;
tlong += (MEMSIZE/2);
tptr2 = (ULONG *)tlong;
DateStamp((struct DateStamp *)&tt);
for(i=0;i<20;i++)
MoveMem(tptr1,tptr2,(MEMSIZE/32));
DateStamp((struct DateStamp *)&tt2);
q = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q2 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q = q2 - q;
DateStamp((struct DateStamp *)&tt);
for(i=0;i<20;i++)
MoveMem16(tptr1,tptr2,(MEMSIZE/32));
DateStamp((struct DateStamp *)&tt2);
q3 = ( (double)(tt.ticks + (tt.minutes * 60L * 50L)))/50.0;
q4 = ( (double)(tt2.ticks + (tt2.minutes * 60L * 50L)))/50.0;
q3 = q4 - q3;
Permit();
printf("**CHIP to CHIP**\n");
printf("MoveMem = %3.4lf secs\n",q);
printf("MoveMem16 = %3.4lf secs\n",q3);
FreeMem((char *)org1,MEMSIZE+16);
FreeMem((char *)org2,MEMSIZE+16);
}