#include #include #include #include #include #include #include #include "system/blitter.h" #include "system/copper.h" #include "system/system.h" #include "screen.h" #include "types.h" #include "bun.h" extern struct Custom far custom; // this should be large enough to hold one bitplane of the largest object // you are blitting, plus one additional word on each side #define SCRATCH_AREA_WIDTH_BYTES (8) #define SCRATCH_AREA_HEIGHT_ROWS (34) #define SCRATCH_AREA_MEMORY_SIZE (SCRATCH_AREA_WIDTH_BYTES * SCRATCH_AREA_HEIGHT_ROWS) volatile short *dbg = (volatile short *)0x100; unsigned char *scratchArea; struct ScreenSetup screenSetup; struct CurrentScreen currentScreen; void *copperlistBitplanePointers[8][2]; void *copperlistSpritePointers[8]; #define offsetof(s, m) &((struct s *)0)->m uint16_t custom_color = (uint16_t)offsetof(Custom, color); uint16_t custom_sprite = (uint16_t)offsetof(Custom, sprpt); uint16_t custom_sprite_control = (uint16_t)offsetof(Custom, spr); uint16_t chip spriteData[200]; uint16_t spritePositionsEachLine[256][2]; void calculageSpritePositionsEachLine() { int i; for (i = 0; i < 255; ++i) { } } #define SPRPOS(x, y) (((y & 0xff) << 8) + ((x & 0x1fe) >> 1)) #define SPRCTL(x, y, height) ( \ ((height & 0xff) << 8) + \ ((y & 0x100) >> 6) + \ ((height & 0x100) >> 7) + \ (x & 1) \ ) int main(void) { uint16_t *copperlist, *currentCopperlist, result; int i, x, y, height, plane; struct BunRenderer bunRenderer; color_t colors[8]; colors[0] = 0x09b8; colors[1] = 0x0000; colors[2] = 0x0fff; colors[3] = 0x000f; printf("%p\n", &spriteData); printf("setting up, i haven't crashed...yet.\n"); x = 150; y = 100; height = y + 98; printf("%d, %d, %d\n", x, y, height); spriteData[0] = SPRPOS(x, y); spriteData[1] = SPRCTL(x, y, height); printf("%0x %0x\n", spriteData[0], spriteData[1]); for (i = 2; i < 198; ++i) { spriteData[i] = 0xffff; } spriteData[198] = 0x0000; spriteData[199] = 0x0000; setupScreen(&screenSetup, SCREEN_WIDTH, SCREEN_HEIGHT, 3); setupInitialCurrentScreen(&screenSetup, ¤tScreen); //setupBunRenderer(&bunRenderer, &screenSetup, ¤tScreen); // blitter copy the first bitplane row down to the second copperlist = prepareNewCopperlist(); takeOverSystem(); setCopperlist(copperlist); setUpDisplay((uint32_t)screenSetup.bitplanes); currentCopperlist = addDisplayToCopperlist( copperlist, &screenSetup, ¤tScreen, &copperlistBitplanePointers ); currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist); *(currentCopperlist++) = custom_color; *(currentCopperlist++) = 0x000; *(currentCopperlist++) = custom_color + 2; *(currentCopperlist++) = 0x000; *(currentCopperlist++) = custom_color + 4; *(currentCopperlist++) = 0xfff; *(currentCopperlist++) = custom_color + 6; *(currentCopperlist++) = 0x00F; // sprites *(currentCopperlist++) = custom_color + 34; *(currentCopperlist++) = 0xF0F; *(currentCopperlist++) = custom_color + 36; *(currentCopperlist++) = 0xFF0; *(currentCopperlist++) = custom_color + 38; *(currentCopperlist++) = 0x00F; *(currentCopperlist++) = custom_sprite; *(currentCopperlist++) = ((uint32_t)&spriteData >> 16); *(currentCopperlist++) = custom_sprite + 2; *(currentCopperlist++) = ((uint32_t)&spriteData & 0xffff); for (y = 0; y < 256; ++y) { if (y > 100) { *(currentCopperlist++) = custom_sprite_control; *(currentCopperlist++) = SPRPOS(60 + y, y); *(currentCopperlist++) = custom_sprite_control + 2; *(currentCopperlist++) = SPRCTL(60 + y, y, 0); } *(currentCopperlist++) = 1 + (31 << 1) + ((44 + y) << 8); *(currentCopperlist++) = 0xFFFE; *(currentCopperlist++) = custom_color; *(currentCopperlist++) = 0x9b8; *(currentCopperlist++) = 1 + ((31 + (320 / 4)) << 1) + ((44 + y) << 8); *(currentCopperlist++) = 0xFFFE; *(currentCopperlist++) = custom_color; *(currentCopperlist++) = 0x000; } endCopperlist(currentCopperlist); for (i = 0; i < 200; ++i) { /* swapCurrentScreenBuffer(&screenSetup, ¤tScreen); for (plane = 0; plane < 2; ++plane) { custom.bltcon0 = 0xc0 + (1 << 8); custom.bltcon1 = 0; custom.bltadat = 0x0000; custom.bltafwm = 0xffff; custom.bltalwm = 0xffff; custom.bltdpt = currentScreen.planes[plane]; custom.bltdmod = 0; custom.bltsize = screenSetup.byteWidth / 2 + (screenSetup.height << 6); WaitBlit(); } //renderBunFrame(i, &bunRenderer); updateDisplayInCopperList( &screenSetup, ¤tScreen, copperlistBitplanePointers ); */ WaitTOF(); } /* for (i = 0; i < 200; ++i) { WaitTOF(); } */ giveBackSystem(); for (i = 10; i < 50; ++i) { printf("%x ", copperlist[i]); } teardownScreen(&screenSetup); freeCopperlist(copperlist); teardownBunRenderer(); return 0; }