this is as optimized as the code will reasonably get

we just need to blit less stuff
This commit is contained in:
John Bintz 2024-06-13 09:01:22 -04:00
parent 331b76e798
commit 686125592a
3 changed files with 92 additions and 52 deletions

88
bun.c
View File

@ -92,7 +92,7 @@ void bun_offRightSide(
uint8_t i, plane = 0; uint8_t i, plane = 0;
uint8_t shift = plusXValue & 15; uint8_t shift = plusXValue & 15;
uint8_t wordShift = (plusXValue >> 4); uint8_t wordShift = (plusXValue >> 4);
uint16_t bltalwm; uint16_t bltalwm, bltcon0, bltcon1, bltdmod, bltsize;
bunClear->memoryStartOffsetBytes = (y * screenSetup->byteWidth) + bunClear->memoryStartOffsetBytes = (y * screenSetup->byteWidth) +
screenSetup->byteWidth - COOL_BUN_WIDTH_BYTES + screenSetup->byteWidth - COOL_BUN_WIDTH_BYTES +
@ -106,9 +106,17 @@ void bun_offRightSide(
bltalwm += (1 << (15 - i)); bltalwm += (1 << (15 - i));
} }
bltcon0 = BLTCON0(0xc0, 0, 1, 0, 1, shift);
bltcon1 = BLTCON1(bunClear->direction, shift);
bltdmod = screenSetup->byteWidth - COOL_BUN_WIDTH_BYTES +
wordShift * 2;
bltsize = bunClear->widthWords + (bunClear->heightRows << 6);
for (plane = 0; plane < 2; ++plane) { for (plane = 0; plane < 2; ++plane) {
custom.bltcon0 = BLTCON0(0xc0, 0, 1, 0, 1, shift); custom.bltcon0 = bltcon0;
custom.bltcon1 = BLTCON1(bunClear->direction, shift); custom.bltcon1 = bltcon1;
custom.bltadat = 0xffff; custom.bltadat = 0xffff;
custom.bltbpt = coolbunPlaneStarts[BUN_OFF_LEFT_SIDE][plane]; custom.bltbpt = coolbunPlaneStarts[BUN_OFF_LEFT_SIDE][plane];
@ -119,10 +127,9 @@ void bun_offRightSide(
custom.bltalwm = bltalwm; custom.bltalwm = bltalwm;
custom.bltbmod = wordShift * 2; custom.bltbmod = wordShift * 2;
custom.bltdmod = screenSetup->byteWidth - COOL_BUN_WIDTH_BYTES + custom.bltdmod = bltdmod;
wordShift * 2;
custom.bltsize = bunClear->widthWords + (bunClear->heightRows << 6); custom.bltsize = bltsize;
WaitBlit(); WaitBlit();
} }
@ -139,7 +146,7 @@ void bun_offLeftSide(
uint8_t shift = minusXValue & 15; uint8_t shift = minusXValue & 15;
uint8_t wordShift = (minusXValue >> 4); uint8_t wordShift = (minusXValue >> 4);
uint8_t i; uint8_t i;
uint16_t bltalwm; uint16_t bltalwm, bltcon0, bltcon1, bltdmod, bltsize;
// y can't be 0 otherwise we will corrupt memory for now // y can't be 0 otherwise we will corrupt memory for now
if (y == 0) return; if (y == 0) return;
@ -155,10 +162,16 @@ void bun_offLeftSide(
bltalwm += (1 << i); bltalwm += (1 << i);
} }
bltcon0 = BLTCON0(0xc0, 0, 1, 0, 1, shift);
bltcon1 = BLTCON1(bunClear->direction, shift);
bltdmod = screenSetup->byteWidth - 4 + wordShift * 2;
bltsize = bunClear->widthWords + (bunClear->heightRows << 6);
for (plane = 0; plane < 2; ++plane) { for (plane = 0; plane < 2; ++plane) {
// shift left, so descending // shift left, so descending
custom.bltcon0 = BLTCON0(0xc0, 0, 1, 0, 1, shift); custom.bltcon0 = bltcon0;
custom.bltcon1 = BLTCON1(bunClear->direction, shift); custom.bltcon1 = bltcon1;
// a has a mask we're shifting // a has a mask we're shifting
custom.bltadat = 0xffff; custom.bltadat = 0xffff;
@ -172,9 +185,9 @@ void bun_offLeftSide(
custom.bltalwm = bltalwm; custom.bltalwm = bltalwm;
custom.bltbmod = wordShift * 2; custom.bltbmod = wordShift * 2;
custom.bltdmod = screenSetup->byteWidth - 4 + wordShift * 2; custom.bltdmod = bltdmod;
custom.bltsize = bunClear->widthWords + (bunClear->heightRows << 6); custom.bltsize = bltsize;
WaitBlit(); WaitBlit();
} }
@ -190,6 +203,7 @@ void bun_anywhere(
uint8_t plane; uint8_t plane;
uint8_t shift = x & 15; uint8_t shift = x & 15;
uint8_t needsExtraWord = shift != 0; uint8_t needsExtraWord = shift != 0;
uint16_t bltcon0, bltcon1, bltalwm, bltbmod, bltdmod, bltsize;
bunClear->memoryStartOffsetBytes = WORD_ALIGNED_BYTE_POSITION(screenSetup->width, x, y); bunClear->memoryStartOffsetBytes = WORD_ALIGNED_BYTE_POSITION(screenSetup->width, x, y);
@ -197,13 +211,23 @@ void bun_anywhere(
bunClear->widthWords = 2 + needsExtraWord; bunClear->widthWords = 2 + needsExtraWord;
bunClear->direction = BLITTER_ASCENDING; bunClear->direction = BLITTER_ASCENDING;
for (plane = 0; plane < 2; ++plane) {
// if we extend the bun area by a word, we only need one write
// buns will never interfere with a background so they don't need a mask // buns will never interfere with a background so they don't need a mask
// they do need the scratch area though bltcon0 = BLTCON0(0xc0, 0, 1, 0, 1, shift);
custom.bltcon0 = BLTCON0(0xc0, 0, 1, 0, 1, shift); bltcon1 = BLTCON1(bunClear->direction, shift);
custom.bltcon1 = BLTCON1(bunClear->direction, shift);
if (needsExtraWord) {
bltalwm = 0x0000;
} else {
bltalwm = 0xffff;
}
bltbmod = -(needsExtraWord * 2);
bltdmod = screenSetup->byteWidth - COOL_BUN_WIDTH_BYTES - (needsExtraWord * 2);
bltsize = bunClear->widthWords + (bunClear->heightRows << 6);
for (plane = 0; plane < 2; ++plane) {
custom.bltcon0 = bltcon0;
custom.bltcon1 = bltcon1;
custom.bltadat = 0xffff; custom.bltadat = 0xffff;
custom.bltbpt = coolbunPlaneStarts[BUN_ANYWHERE][plane]; custom.bltbpt = coolbunPlaneStarts[BUN_ANYWHERE][plane];
@ -212,15 +236,11 @@ void bun_anywhere(
// custom.bltdpt = screenSetup.memoryStart; // custom.bltdpt = screenSetup.memoryStart;
custom.bltafwm = 0xffff; custom.bltafwm = 0xffff;
if (needsExtraWord) { custom.bltalwm = bltalwm;
custom.bltalwm = 0x0000;
} else {
custom.bltalwm = 0xffff;
}
custom.bltbmod = -(needsExtraWord * 2); custom.bltbmod = bltbmod;
custom.bltdmod = screenSetup->byteWidth - COOL_BUN_WIDTH_BYTES - (needsExtraWord * 2); custom.bltdmod = bltdmod;
custom.bltsize = bunClear->widthWords + (bunClear->heightRows << 6); custom.bltsize = bltsize;
WaitBlit(); WaitBlit();
} }
@ -242,7 +262,7 @@ void renderBun(
if (x < -31) return; if (x < -31) return;
if (x > screenSetup->width + 31) return; if (x > screenSetup->width + 31) return;
if (y < 1) return; if (y < 1) return;
if (y > screenSetup->height- COOL_BUN_HEIGHT - 1) return; if (y > screenSetup->height - COOL_BUN_HEIGHT - 1) return;
if (x < 0) { if (x < 0) {
bun_offLeftSide( bun_offLeftSide(
@ -370,22 +390,30 @@ void clearCurrentBuns(
) { ) {
int bun, plane; int bun, plane;
struct BunClear *currentBunClear; struct BunClear *currentBunClear;
uint16_t bltcon0, bltcon1, bltdmod, bltsize;
if (!hasBunClear[bunRenderer->currentScreen->currentBuffer]) return; if (!hasBunClear[bunRenderer->currentScreen->currentBuffer]) return;
bltcon0 = 0xc0 + (1 << 8);
for (bun = 0; bun < BUN_COUNT; ++bun) { for (bun = 0; bun < BUN_COUNT; ++bun) {
currentBunClear = &bunClearForScreen[bunRenderer->currentScreen->currentBuffer][bun]; currentBunClear = &bunClearForScreen[bunRenderer->currentScreen->currentBuffer][bun];
bltcon1 = BLTCON1(currentBunClear->direction, 0);
bltdmod = bunRenderer->screenSetup->byteWidth - (currentBunClear->widthWords * 2);
bltsize = currentBunClear->widthWords + (currentBunClear->heightRows << 6);
for (plane = 0; plane < 2; ++plane) { for (plane = 0; plane < 2; ++plane) {
custom.bltcon0 = 0xc0 + (1 << 8); custom.bltcon0 = bltcon0;
custom.bltcon1 = BLTCON1(currentBunClear->direction, 0); custom.bltcon1 = bltcon1;
custom.bltadat = 0x0000; custom.bltadat = 0x0000;
custom.bltafwm = 0xffff; custom.bltafwm = 0xffff;
custom.bltalwm = 0xffff; custom.bltalwm = 0xffff;
custom.bltdpt = bunRenderer->currentScreen->planes[plane] + custom.bltdpt = bunRenderer->currentScreen->planes[plane] +
currentBunClear->memoryStartOffsetBytes; currentBunClear->memoryStartOffsetBytes;
custom.bltdmod = bunRenderer->screenSetup->byteWidth - (currentBunClear->widthWords * 2); custom.bltdmod = bltdmod;
custom.bltsize = currentBunClear->widthWords + (currentBunClear->heightRows << 6); custom.bltsize = bltsize;
WaitBlit(); WaitBlit();
} }
} }

BIN
main

Binary file not shown.

56
main.c
View File

@ -64,6 +64,37 @@ extern uint16_t chip SpriteCopperlist[];
extern uint16_t chip SpriteData[]; extern uint16_t chip SpriteData[];
extern uint16_t chip MaskBitplane[]; extern uint16_t chip MaskBitplane[];
void renderTopaz(void) {
int plane;
uint16_t bltcon0, bltcmod;
uint8_t *bltbpt;
bltcon0 = 0xca + (1 << 8) + (1 << 9) + (1 << 10) + (1 << 11);
bltcmod = screenSetup.byteWidth - 32;
bltbpt = TopazBitplanes;
for (plane = 0; plane < 3; ++plane) {
custom.bltcon0 = bltcon0;
custom.bltcon1 = 0;
custom.bltafwm = 0xffff;
custom.bltalwm = 0xffff;
custom.bltapt = MaskBitplane;
custom.bltbpt = bltbpt;
custom.bltcpt = currentScreen.planes[plane];
custom.bltdpt = currentScreen.planes[plane];
custom.bltamod = 0;
custom.bltbmod = 0;
custom.bltcmod = bltcmod;
custom.bltdmod = bltcmod;
custom.bltsize = 16 + (256 << 6);
bltbpt += 32 * 256;
WaitBlit();
}
}
int main(void) { int main(void) {
uint16_t *copperlist, *currentCopperlist, *currentCopperColors, result, *currentSpriteCopperlist; uint16_t *copperlist, *currentCopperlist, *currentCopperColors, result, *currentSpriteCopperlist;
uint32_t spriteDataPointer; uint32_t spriteDataPointer;
@ -78,7 +109,6 @@ int main(void) {
colors[2] = 0x0fff; colors[2] = 0x0fff;
colors[3] = 0x000f; colors[3] = 0x000f;
printf("%x\n", &SpriteData);
printf("setting up, i haven't crashed...yet.\n"); printf("setting up, i haven't crashed...yet.\n");
setupScreen(&screenSetup, SCREEN_WIDTH, SCREEN_HEIGHT, 3); setupScreen(&screenSetup, SCREEN_WIDTH, SCREEN_HEIGHT, 3);
@ -101,7 +131,7 @@ int main(void) {
&currentScreen, &currentScreen,
&copperlistBitplanePointers &copperlistBitplanePointers
); );
currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist); //currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist);
currentCopperColors = CopperColors; currentCopperColors = CopperColors;
currentSpriteCopperlist = SpriteCopperlist; currentSpriteCopperlist = SpriteCopperlist;
@ -198,26 +228,11 @@ int main(void) {
renderBunFrame(i, &bunRenderer); renderBunFrame(i, &bunRenderer);
renderTopaz();
/* /*
*/ */
for (plane = 0; plane < 3; ++plane) {
custom.bltcon0 = 0xca + (1 << 8) + (1 << 9) + (1 << 10) + (1 << 11);
custom.bltcon1 = 0;
custom.bltafwm = 0xffff;
custom.bltalwm = 0xffff;
custom.bltapt = MaskBitplane;
custom.bltbpt = TopazBitplanes + (plane * 32 * 256);
custom.bltcpt = currentScreen.planes[plane];
custom.bltdpt = currentScreen.planes[plane];
custom.bltamod = 0;
custom.bltbmod = 0;
custom.bltcmod = screenSetup.byteWidth - 32;
custom.bltdmod = screenSetup.byteWidth - 32;
custom.bltsize = 16 + (256 << 6);
WaitBlit();
}
/* /*
*(SpriteData) = SPRPOS(250, 44); *(SpriteData) = SPRPOS(250, 44);
@ -230,7 +245,6 @@ int main(void) {
copperlistBitplanePointers copperlistBitplanePointers
); );
WaitTOF(); WaitTOF();
if ((ciaa.ciapra >> 6) != 3) break; if ((ciaa.ciapra >> 6) != 3) break;
@ -255,8 +269,6 @@ int main(void) {
} }
*/ */
printf("%x %x", SPRPOS(250, 44), SPRCTL(250, 44, 44 + 256));
freeCopperlist(copperlist); freeCopperlist(copperlist);
teardownBunRenderer(); teardownBunRenderer();