119 lines
2.6 KiB
C
119 lines
2.6 KiB
C
|
#include <clib/exec_protos.h>
|
||
|
#include <clib/intuition_protos.h>
|
||
|
#include <clib/graphics_protos.h>
|
||
|
#include <graphics/gfxbase.h>
|
||
|
#include <hardware/custom.h>
|
||
|
#include <hardware/dmabits.h>
|
||
|
#include <exec/memory.h>
|
||
|
|
||
|
#include <time.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
extern struct GfxBase *GfxBase;
|
||
|
extern far struct Custom custom;
|
||
|
|
||
|
#define COPIES (100)
|
||
|
|
||
|
int main(void) {
|
||
|
// reserve two 320x200 bitplanes
|
||
|
// take over the system
|
||
|
// for 1000 loops
|
||
|
// * run blitter copies, setting up new registers each time
|
||
|
// * do CPU copies
|
||
|
// give the system back
|
||
|
// print the timings of each
|
||
|
|
||
|
struct View *OldView;
|
||
|
ULONG OldCopper;
|
||
|
UWORD OldDMACON, OldINTENA, OldINTREQ, OldADKCON;
|
||
|
unsigned int startTime[2], blitTime[2], copyTime[2];
|
||
|
|
||
|
unsigned char *source, *target, check;
|
||
|
|
||
|
ULONG blitTimeFinal, copyTimeFinal;
|
||
|
|
||
|
int i, j;
|
||
|
|
||
|
OldView = ((struct GfxBase *)GfxBase)->ActiView;
|
||
|
OldCopper = (ULONG)((struct GfxBase *)GfxBase)->copinit;
|
||
|
|
||
|
LoadView(NULL);
|
||
|
WaitTOF();
|
||
|
WaitTOF();
|
||
|
OwnBlitter();
|
||
|
WaitBlit();
|
||
|
Forbid();
|
||
|
|
||
|
OldDMACON = custom.dmaconr | 0x8000;
|
||
|
OldINTENA = custom.intenar | 0x8000;
|
||
|
OldINTREQ = custom.intreqr | 0x8000;
|
||
|
OldADKCON = custom.adkconr | 0x8000;
|
||
|
|
||
|
custom.dmacon = DMAF_SETCLR | DMAF_BLITTER;
|
||
|
custom.dmacon = DMAF_AUDIO | DMAF_DISK | DMAF_SPRITE | DMAF_COPPER | DMAF_RASTER;
|
||
|
|
||
|
source = AllocMem(320 * 200 / 8, MEMF_CHIP | MEMF_CLEAR);
|
||
|
target = AllocMem(320 * 200 / 8, MEMF_CHIP | MEMF_CLEAR);
|
||
|
|
||
|
*(source) = 1;
|
||
|
|
||
|
timer(startTime);
|
||
|
|
||
|
for (i = 0; i < COPIES; ++i) {
|
||
|
// a and d
|
||
|
custom.bltcon0 = (1 << 8) + (1 << 11);
|
||
|
custom.bltcon1 = 0;
|
||
|
custom.bltapt = source;
|
||
|
custom.bltdpt = target;
|
||
|
custom.bltamod = 0;
|
||
|
custom.bltdmod = 0;
|
||
|
custom.bltsize = (320 / 16) + (200 << 6);
|
||
|
|
||
|
WaitBlit();
|
||
|
}
|
||
|
|
||
|
timer(blitTime);
|
||
|
|
||
|
for (i = 0; i < COPIES; ++i) {
|
||
|
for (j = 0; j < (320 * 200 / 8); ++j) {
|
||
|
target[j] = source[j];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
timer(copyTime);
|
||
|
|
||
|
check = *(source);
|
||
|
|
||
|
FreeMem(source, 320 * 200 / 8);
|
||
|
FreeMem(target, 320 * 200 / 8);
|
||
|
|
||
|
custom.dmacon = 0x7FFF;
|
||
|
custom.dmacon = OldDMACON;
|
||
|
|
||
|
custom.intena = 0x7FFF;
|
||
|
custom.intena = OldINTENA;
|
||
|
|
||
|
custom.intreq = 0x7FFF;
|
||
|
custom.intreq = OldINTREQ;
|
||
|
|
||
|
custom.adkcon = 0x7FFF;
|
||
|
custom.adkcon = OldADKCON;
|
||
|
|
||
|
custom.cop1lc = OldCopper;
|
||
|
LoadView(OldView);
|
||
|
WaitTOF();
|
||
|
WaitTOF();
|
||
|
WaitBlit();
|
||
|
DisownBlitter();
|
||
|
Permit();
|
||
|
|
||
|
blitTimeFinal = (blitTime[0] - startTime[0]) * 1000000 + (blitTime[1] - startTime[1]);
|
||
|
copyTimeFinal = (copyTime[0] - blitTime[0]) * 1000000 + (copyTime[1] - blitTime[1]);
|
||
|
|
||
|
printf("Number of 320x200/8 copies: %d\n", COPIES);
|
||
|
printf("Blitter (microsecond): %d\n", blitTimeFinal);
|
||
|
printf("CPU (microsecond): %d\n", copyTimeFinal);
|
||
|
|
||
|
return 0;
|
||
|
}
|