aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-03-14 10:25:51 +0100
committerBad Diode <bd@badd10de.dev>2022-03-14 10:25:51 +0100
commit519cb33c15b3d95d186bd62c283a3183e2300365 (patch)
tree290a66f8cd29d166c71b79d8299ff92dbfe758b1
parent92dce67f97a128d88ce98ab1c9da23b12a61c51c (diff)
downloaduxngba-519cb33c15b3d95d186bd62c283a3183e2300365.tar.gz
uxngba-519cb33c15b3d95d186bd62c283a3183e2300365.zip
Update screen vector with new auto changes
-rw-r--r--roms/screen.rombin785 -> 1019 bytes
-rw-r--r--src/main.c69
-rw-r--r--src/uxn.h2
3 files changed, 34 insertions, 37 deletions
diff --git a/roms/screen.rom b/roms/screen.rom
index ced1f64..9f23112 100644
--- a/roms/screen.rom
+++ b/roms/screen.rom
Binary files 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) {
135 d->vector = mempeek16(d->dat, 0x0); 135 d->vector = mempeek16(d->dat, 0x0);
136 } break; 136 } break;
137 case 0xe: { 137 case 0xe: {
138 u16 x = mempeek16(d->dat, 0x8); 138 u16 x, y;
139 u16 y = mempeek16(d->dat, 0xa); 139 u8 layer = d->dat[0xe] & 0x40;
140 u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; 140 DEVPEEK16(x, 0x8);
141 u8 *layer = d->dat[0xe] >> 4 & 0x1 ? ppu.fg : ppu.bg; 141 DEVPEEK16(y, 0xa);
142 u8 mode = d->dat[0xe] >> 5; 142 ppu_pixel(layer ? ppu.fg : ppu.bg, x, y, d->dat[0xe] & 0x3);
143 u8 color = d->dat[0xf] & 0xf; 143 if(d->dat[0x6] & 0x01) DEVPOKE16(0x8, x + 1); /* auto x+1 */
144 if(!mode) { 144 if(d->dat[0x6] & 0x02) DEVPOKE16(0xa, y + 1); /* auto y+1 */
145 ppu_pixel(layer, x, y, d->dat[0xe] & 0x3);
146 } else if(mode-- & 0x1) {
147 u8 flipx = mode & 0x2;
148 u8 flipy = mode & 0x4;
149 ppu_1bpp(layer, x, y, addr, color, flipx, flipy);
150 } else {
151 u8 flipx = mode & 0x2;
152 u8 flipy = mode & 0x4;
153 ppu_2bpp(layer, x, y, addr, color, flipx, flipy);
154 }
155 if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 1); }
156 if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 1); }
157 } break; 145 } break;
158 case 0xf: { 146 case 0xf: {
159 u16 x = mempeek16(d->dat, 0x8); 147 u16 x, y, dx, dy, addr;
160 u16 y = mempeek16(d->dat, 0xa); 148 u8 twobpp = !!(d->dat[0xf] & 0x80);
161 u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; 149 DEVPEEK16(x, 0x8);
162 u8 *layer = d->dat[0xf] >> 6 & 0x1 ? ppu.fg : ppu.bg; 150 DEVPEEK16(y, 0xa);
151 DEVPEEK16(addr, 0xc);
152 u8 n = d->dat[0x6] >> 4;
153 dx = (d->dat[0x6] & 0x01) << 3;
154 dy = (d->dat[0x6] & 0x02) << 2;
155 if(addr > 0x10000 - ((n + 1) << (3 + twobpp))) {
156 return;
157 }
158 u8 *layer = (d->dat[0xf] & 0x40) ? ppu.fg : ppu.bg;
163 u8 color = d->dat[0xf] & 0xf; 159 u8 color = d->dat[0xf] & 0xf;
164 u8 flipx = (d->dat[0xf] >> 0x4) & 0x1; 160 u8 flipx = d->dat[0xf] & 0x10;
165 u8 flipy = (d->dat[0xf] >> 0x5) & 0x1; 161 u8 flipy = d->dat[0xf] & 0x20;
166 if(d->dat[0xf] >> 0x7 & 0x1) { 162 for(size_t i = 0; i <= n; i++) {
167 ppu_2bpp(layer, x, y, addr, color, flipx, flipy); 163 u8 *sprite = &d->mem[addr];
168 if(d->dat[0x6] & 0x04) { 164 if (twobpp) {
169 mempoke16(d->dat, 0xc, mempeek16(d->dat, 0xc) + 16); 165 ppu_2bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy);
170 } 166 } else {
171 } else { 167 ppu_1bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy);
172 ppu_1bpp(layer, x, y, addr, color, flipx, flipy);
173 if(d->dat[0x6] & 0x04) {
174 mempoke16(d->dat, 0xc, mempeek16(d->dat, 0xc) + 8);
175 } 168 }
169 addr += (d->dat[0x6] & 0x04) << (1 + twobpp);
176 } 170 }
177 if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 8); } 171 DEVPOKE16(0xc, addr); /* auto addr+length */
178 if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 8); } 172 DEVPOKE16(0x8, x + dx); /* auto x+8 */
173 DEVPOKE16(0xa, y + dy); /* auto y+8 */
179 } break; 174 } break;
180 default: break; 175 default: break;
181 } 176 }
@@ -464,7 +459,7 @@ int main(void) {
464 init_sound(); 459 init_sound();
465 460
466 // Main loop. 461 // Main loop.
467 uxn_eval(&u, 0x0100); 462 uxn_eval(&u, PAGE_PROGRAM);
468 PROF_INIT(); 463 PROF_INIT();
469 while(true) { 464 while(true) {
470 bios_vblank_wait(); 465 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.
15*/ 15*/
16 16
17#define PAGE_PROGRAM 0x0100 17#define PAGE_PROGRAM 0x0100
18#define DEVPEEK16(o, x) { (o) = (d->dat[(x)] << 8) + d->dat[(x) + 1]; }
19#define DEVPOKE16(x, y) { d->dat[(x)] = (y) >> 8; d->dat[(x) + 1] = (y); }
18 20
19typedef struct { 21typedef struct {
20 u8 ptr, kptr, error; 22 u8 ptr, kptr, error;