From 519cb33c15b3d95d186bd62c283a3183e2300365 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 14 Mar 2022 10:25:51 +0100 Subject: Update screen vector with new auto changes --- roms/screen.rom | Bin 785 -> 1019 bytes src/main.c | 69 ++++++++++++++++++++++++++------------------------------ src/uxn.h | 2 ++ 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/roms/screen.rom b/roms/screen.rom index ced1f64..9f23112 100644 Binary files a/roms/screen.rom and b/roms/screen.rom differ diff --git a/src/main.c b/src/main.c index 60be453..e73a740 100644 --- a/src/main.c +++ b/src/main.c @@ -135,47 +135,42 @@ screen_talk(Device *d, u8 b0, u8 w) { d->vector = mempeek16(d->dat, 0x0); } break; case 0xe: { - u16 x = mempeek16(d->dat, 0x8); - u16 y = mempeek16(d->dat, 0xa); - u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; - u8 *layer = d->dat[0xe] >> 4 & 0x1 ? ppu.fg : ppu.bg; - u8 mode = d->dat[0xe] >> 5; - u8 color = d->dat[0xf] & 0xf; - if(!mode) { - ppu_pixel(layer, x, y, d->dat[0xe] & 0x3); - } else if(mode-- & 0x1) { - u8 flipx = mode & 0x2; - u8 flipy = mode & 0x4; - ppu_1bpp(layer, x, y, addr, color, flipx, flipy); - } else { - u8 flipx = mode & 0x2; - u8 flipy = mode & 0x4; - ppu_2bpp(layer, x, y, addr, color, flipx, flipy); - } - if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 1); } - if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 1); } + u16 x, y; + u8 layer = d->dat[0xe] & 0x40; + DEVPEEK16(x, 0x8); + DEVPEEK16(y, 0xa); + ppu_pixel(layer ? ppu.fg : ppu.bg, x, y, d->dat[0xe] & 0x3); + if(d->dat[0x6] & 0x01) DEVPOKE16(0x8, x + 1); /* auto x+1 */ + if(d->dat[0x6] & 0x02) DEVPOKE16(0xa, y + 1); /* auto y+1 */ } break; case 0xf: { - u16 x = mempeek16(d->dat, 0x8); - u16 y = mempeek16(d->dat, 0xa); - u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; - u8 *layer = d->dat[0xf] >> 6 & 0x1 ? ppu.fg : ppu.bg; + u16 x, y, dx, dy, addr; + u8 twobpp = !!(d->dat[0xf] & 0x80); + DEVPEEK16(x, 0x8); + DEVPEEK16(y, 0xa); + DEVPEEK16(addr, 0xc); + u8 n = d->dat[0x6] >> 4; + dx = (d->dat[0x6] & 0x01) << 3; + dy = (d->dat[0x6] & 0x02) << 2; + if(addr > 0x10000 - ((n + 1) << (3 + twobpp))) { + return; + } + u8 *layer = (d->dat[0xf] & 0x40) ? ppu.fg : ppu.bg; u8 color = d->dat[0xf] & 0xf; - u8 flipx = (d->dat[0xf] >> 0x4) & 0x1; - u8 flipy = (d->dat[0xf] >> 0x5) & 0x1; - if(d->dat[0xf] >> 0x7 & 0x1) { - ppu_2bpp(layer, x, y, addr, color, flipx, flipy); - if(d->dat[0x6] & 0x04) { - mempoke16(d->dat, 0xc, mempeek16(d->dat, 0xc) + 16); - } - } else { - ppu_1bpp(layer, x, y, addr, color, flipx, flipy); - if(d->dat[0x6] & 0x04) { - mempoke16(d->dat, 0xc, mempeek16(d->dat, 0xc) + 8); + u8 flipx = d->dat[0xf] & 0x10; + u8 flipy = d->dat[0xf] & 0x20; + for(size_t i = 0; i <= n; i++) { + u8 *sprite = &d->mem[addr]; + if (twobpp) { + ppu_2bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); + } else { + ppu_1bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); } + addr += (d->dat[0x6] & 0x04) << (1 + twobpp); } - if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 8); } - if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 8); } + DEVPOKE16(0xc, addr); /* auto addr+length */ + DEVPOKE16(0x8, x + dx); /* auto x+8 */ + DEVPOKE16(0xa, y + dy); /* auto y+8 */ } break; default: break; } @@ -464,7 +459,7 @@ int main(void) { init_sound(); // Main loop. - uxn_eval(&u, 0x0100); + uxn_eval(&u, PAGE_PROGRAM); PROF_INIT(); while(true) { bios_vblank_wait(); diff --git a/src/uxn.h b/src/uxn.h index 6f01405..5d68528 100644 --- a/src/uxn.h +++ b/src/uxn.h @@ -15,6 +15,8 @@ WITH REGARD TO THIS SOFTWARE. */ #define PAGE_PROGRAM 0x0100 +#define DEVPEEK16(o, x) { (o) = (d->dat[(x)] << 8) + d->dat[(x) + 1]; } +#define DEVPOKE16(x, y) { d->dat[(x)] = (y) >> 8; d->dat[(x) + 1] = (y); } typedef struct { u8 ptr, kptr, error; -- cgit v1.2.1