diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 69 | ||||
-rw-r--r-- | src/uxn.h | 2 |
2 files changed, 34 insertions, 37 deletions
@@ -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(); |
@@ -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 | ||
19 | typedef struct { | 21 | typedef struct { |
20 | u8 ptr, kptr, error; | 22 | u8 ptr, kptr, error; |