From 49182d13353e1f79b248b9229f404db09c9ca80d Mon Sep 17 00:00:00 2001 From: neauoire Date: Thu, 29 Apr 2021 10:10:07 -0700 Subject: [PATCH] Added mirroring to the PPU --- projects/examples/devices/screen.usm | 67 +++++++++++++++++++++++++--- src/emulator.c | 12 ++--- src/ppu.c | 20 ++++++--- src/ppu.h | 4 +- 4 files changed, 83 insertions(+), 20 deletions(-) diff --git a/projects/examples/devices/screen.usm b/projects/examples/devices/screen.usm index 9d7fbe1..8f41644 100644 --- a/projects/examples/devices/screen.usm +++ b/projects/examples/devices/screen.usm @@ -19,8 +19,8 @@ |0100 ( -> ) ( theme ) - #0c5f .System/r DEO2 - #022f .System/g DEO2 + #025f .System/r DEO2 + #0c2f .System/g DEO2 #0da4 .System/b DEO2 ( find screen center ) @@ -28,25 +28,78 @@ .Screen/height DEI2 #0002 DIV2 .center/y POK2 ( draw ) + ;draw-table JSR2 ;draw-sprites JSR2 + ;draw-circle JSR2 BRK @draw-sprites ( -- ) ;preview_icn .Screen/addr DEO2 - - #00 #ff + #00 #00 &loop ( move ) OVR #0f AND #40 SFT #02 DIV #00 SWP .center/x PEK2 #0040 SUB2 ADD2 .Screen/x DEO2 ( move ) OVR #f0 AND #02 DIV #00 SWP - .center/y PEK2 #0018 SUB2 ADD2 .Screen/y DEO2 + .center/y PEK2 #0040 SUB2 ADD2 .Screen/y DEO2 ( draw ) OVR .Screen/color DEO ( incr ) SWP #01 ADD SWP - DUP2 LTH ,&loop JNZ + DUP2 NEQ ,&loop JNZ POP2 RTN -@preview_icn [ 183c 66db db66 3c18 0000 183c 3c18 0000 ] \ No newline at end of file +@draw-table ( -- ) + + #00 #10 + &loop + OVR #08 MUL #00 SWP ;font_hex ADD2 .Screen/addr DEO2 + + ( x-axis ) + OVR #08 MUL #00 SWP + .center/x PEK2 #0040 SUB2 ADD2 .Screen/x DEO2 + .center/y PEK2 #0050 SUB2 .Screen/y DEO2 + ( draw ) #21 .Screen/color DEO + + ( y-axis ) + OVR #08 MUL #00 SWP + .center/y PEK2 #0040 SUB2 ADD2 .Screen/y DEO2 + .center/x PEK2 #0050 SUB2 .Screen/x DEO2 + ( draw ) #21 .Screen/color DEO + + ( incr ) SWP #01 ADD SWP + DUP2 LTH ,&loop JNZ + POP2 + +RTN + +@draw-circle ( -- ) + + ;preview_icn .Screen/addr DEO2 + + .center/x PEK2 #0048 ADD2 .Screen/x DEO2 + .center/y PEK2 #0030 ADD2 .Screen/y DEO2 + #21 .Screen/color DEO + .center/x PEK2 #0050 ADD2 .Screen/x DEO2 + #61 .Screen/color DEO + .center/x PEK2 #0048 ADD2 .Screen/x DEO2 + .center/y PEK2 #0038 ADD2 .Screen/y DEO2 + #a1 .Screen/color DEO + .center/x PEK2 #0050 ADD2 .Screen/x DEO2 + #f1 .Screen/color DEO + +RTN + +@preview_icn [ + 0f38 675f dfbf bfbf 0007 1820 2344 4848 ] + +@font_hex [ + 007c 8282 8282 827c 0030 1010 1010 1010 + 007c 8202 7c80 80fe 007c 8202 1c02 827c + 000c 1424 4484 fe04 00fe 8080 7c02 827c + 007c 8280 fc82 827c 007c 8202 1e02 0202 + 007c 8282 7c82 827c 007c 8282 7e02 827c + 007c 8202 7e82 827e 00fc 8282 fc82 82fc + 007c 8280 8080 827c 00fc 8282 8282 82fc + 007c 8280 f080 827c 007c 8280 f080 8080 ] \ No newline at end of file diff --git a/src/emulator.c b/src/emulator.c index 8a393a4..2b5c39c 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -224,11 +224,13 @@ screen_talk(Device *d, Uint8 b0, Uint8 w) Uint16 y = mempeek16(d->dat, 0xa); Uint8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; Uint8 *layer = d->dat[0xe] >> 4 & 0x1 ? ppu.fg : ppu.bg; - switch(d->dat[0xe] >> 5) { - case 0: putpixel(&ppu, layer, x, y, d->dat[0xe] & 0x3); break; - case 1: puticn(&ppu, layer, x, y, addr, d->dat[0xe] & 0xf); break; - case 2: putchr(&ppu, layer, x, y, addr, d->dat[0xe] & 0xf); break; - } + Uint8 mode = d->dat[0xe] >> 5; + if(!mode) + putpixel(&ppu, layer, x, y, d->dat[0xe] & 0x3); + else if(mode % 2) + puticn(&ppu, layer, x, y, addr, d->dat[0xe] & 0xf, d->dat[0xe] >> 6 & 0x1, d->dat[0xe] >> 7 & 0x1); + else + putchr(&ppu, layer, x, y, addr, d->dat[0xe] & 0xf, d->dat[0xe] >> 6 & 0x1, d->dat[0xe] >> 7 & 0x1); reqdraw = 1; } } diff --git a/src/ppu.c b/src/ppu.c index c1cbe2c..092b9bd 100644 --- a/src/ppu.c +++ b/src/ppu.c @@ -80,26 +80,34 @@ putpixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color) } void -puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) +puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy) { Uint16 v, h; for(v = 0; v < 8; v++) for(h = 0; h < 8; h++) { Uint8 ch1 = ((sprite[v] >> (7 - h)) & 0x1); if(ch1 == 1 || (color != 0x05 && color != 0x0a && color != 0x0f)) - putpixel(p, layer, x + h, y + v, ch1 ? color % 4 : color / 4); + putpixel(p, + layer, + x + (flipx ? 7 - h : h), + y + (flipy ? 7 - v : v), + ch1 ? color % 4 : color / 4); } } void -putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color) +putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy) { Uint16 v, h; for(v = 0; v < 8; v++) for(h = 0; h < 8; h++) { Uint8 ch1 = ((sprite[v] >> (7 - h)) & 0x1) * color; Uint8 ch2 = ((sprite[v + 8] >> (7 - h)) & 0x1) * color; - putpixel(p, layer, x + h, y + v, (((ch1 + ch2 * 2) + color / 4) & 0x3)); + putpixel(p, + layer, + x + (flipx ? 7 - h : h), + y + (flipy ? 7 - v : v), + (((ch1 + ch2 * 2) + color / 4) & 0x3)); } } @@ -118,8 +126,8 @@ drawdebugger(Ppu *p, Uint8 *stack, Uint8 ptr) Uint8 i, x, y, b; for(i = 0; i < 0x20; ++i) { /* memory */ x = ((i % 8) * 3 + 1) * 8, y = (i / 8 + 1) * 8, b = stack[i]; - puticn(p, p->bg, x, y, font[(b >> 4) & 0xf], 1 + (ptr == i) * 0x7); - puticn(p, p->bg, x + 8, y, font[b & 0xf], 1 + (ptr == i) * 0x7); + puticn(p, p->bg, x, y, font[(b >> 4) & 0xf], 1 + (ptr == i) * 0x7, 0, 0); + puticn(p, p->bg, x + 8, y, font[b & 0xf], 1 + (ptr == i) * 0x7, 0, 0); } for(x = 0; x < 0x20; ++x) { drawpixel(p, x, p->height / 2, 2); diff --git a/src/ppu.h b/src/ppu.h index 4d257e6..e3f930b 100644 --- a/src/ppu.h +++ b/src/ppu.h @@ -26,7 +26,7 @@ typedef struct Ppu { int initppu(Ppu *p, Uint8 hor, Uint8 ver, Uint8 pad); void putcolors(Ppu *p, Uint8 *addr); void putpixel(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 color); -void puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); -void putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color); +void puticn(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); +void putchr(Ppu *p, Uint8 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Uint8 flipx, Uint8 flipy); void drawppu(Ppu *p); void drawdebugger(Ppu *p, Uint8 *stack, Uint8 ptr);