diff options
author | Bad Diode <bd@badd10de.dev> | 2021-11-10 09:37:40 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-11-10 09:37:40 +0100 |
commit | 574aca9c0d34348f8d8543bcd6533ed8df330061 (patch) | |
tree | e050eb822efa027b5082dc77ecb6d6df818ad630 /src | |
parent | 882ae2a693a50cdfa072462be2d57b93078cf916 (diff) | |
download | uxngba-574aca9c0d34348f8d8543bcd6533ed8df330061.tar.gz uxngba-574aca9c0d34348f8d8543bcd6533ed8df330061.zip |
Add screen auto vector
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 79 | ||||
-rw-r--r-- | src/uxn.h | 1 |
2 files changed, 50 insertions, 30 deletions
@@ -129,36 +129,55 @@ system_talk(Device *d, u8 b0, u8 w) { | |||
129 | IWRAM_CODE | 129 | IWRAM_CODE |
130 | void | 130 | void |
131 | screen_talk(Device *d, u8 b0, u8 w) { | 131 | screen_talk(Device *d, u8 b0, u8 w) { |
132 | if(w && b0 == 0xe) { | 132 | if (w) { |
133 | u16 x = mempeek16(d->dat, 0x8); | 133 | switch (b0) { |
134 | u16 y = mempeek16(d->dat, 0xa); | 134 | case 0x1: { |
135 | u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; | 135 | d->vector = mempeek16(d->dat, 0x0); |
136 | u8 *layer = d->dat[0xe] >> 4 & 0x1 ? ppu.fg : ppu.bg; | 136 | } break; |
137 | u8 mode = d->dat[0xe] >> 5; | 137 | case 0xe: { |
138 | u8 color = d->dat[0xf] & 0xf; | 138 | u16 x = mempeek16(d->dat, 0x8); |
139 | if(!mode) { | 139 | u16 y = mempeek16(d->dat, 0xa); |
140 | ppu_pixel(layer, x, y, d->dat[0xe] & 0x3); | 140 | u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; |
141 | } else if(mode-- & 0x1) { | 141 | u8 *layer = d->dat[0xe] >> 4 & 0x1 ? ppu.fg : ppu.bg; |
142 | u8 flipx = mode & 0x2; | 142 | u8 mode = d->dat[0xe] >> 5; |
143 | u8 flipy = mode & 0x4; | 143 | u8 color = d->dat[0xf] & 0xf; |
144 | ppu_1bpp(layer, x, y, addr, color, flipx, flipy); | 144 | if(!mode) { |
145 | } else { | 145 | ppu_pixel(layer, x, y, d->dat[0xe] & 0x3); |
146 | u8 flipx = mode & 0x2; | 146 | } else if(mode-- & 0x1) { |
147 | u8 flipy = mode & 0x4; | 147 | u8 flipx = mode & 0x2; |
148 | ppu_2bpp(layer, x, y, addr, color, flipx, flipy); | 148 | u8 flipy = mode & 0x4; |
149 | } | 149 | ppu_1bpp(layer, x, y, addr, color, flipx, flipy); |
150 | } else if(w && b0 == 0xf) { | 150 | } else { |
151 | u16 x = mempeek16(d->dat, 0x8); | 151 | u8 flipx = mode & 0x2; |
152 | u16 y = mempeek16(d->dat, 0xa); | 152 | u8 flipy = mode & 0x4; |
153 | u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; | 153 | ppu_2bpp(layer, x, y, addr, color, flipx, flipy); |
154 | u8 *layer = d->dat[0xf] >> 6 & 0x1 ? ppu.fg : ppu.bg; | 154 | } |
155 | u8 color = d->dat[0xf] & 0xf; | 155 | if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 1); } |
156 | u8 flipx = (d->dat[0xf] >> 0x4) & 0x1; | 156 | if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 1); } |
157 | u8 flipy = (d->dat[0xf] >> 0x5) & 0x1; | 157 | } break; |
158 | if(d->dat[0xf] >> 0x7 & 0x1) { | 158 | case 0xf: { |
159 | ppu_2bpp(layer, x, y, addr, color, flipx, flipy); | 159 | u16 x = mempeek16(d->dat, 0x8); |
160 | } else { | 160 | u16 y = mempeek16(d->dat, 0xa); |
161 | ppu_1bpp(layer, x, y, addr, color, flipx, flipy); | 161 | u8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; |
162 | u8 *layer = d->dat[0xf] >> 6 & 0x1 ? ppu.fg : ppu.bg; | ||
163 | u8 color = d->dat[0xf] & 0xf; | ||
164 | u8 flipx = (d->dat[0xf] >> 0x4) & 0x1; | ||
165 | u8 flipy = (d->dat[0xf] >> 0x5) & 0x1; | ||
166 | if(d->dat[0xf] >> 0x7 & 0x1) { | ||
167 | ppu_2bpp(layer, x, y, addr, color, flipx, flipy); | ||
168 | if(d->dat[0x6] & 0x04) { | ||
169 | mempoke16(d->dat, 0xc, mempeek16(d->dat, 0xc) + 16); | ||
170 | } | ||
171 | } else { | ||
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 | } | ||
176 | } | ||
177 | if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 8); } | ||
178 | if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 8); } | ||
179 | } break; | ||
180 | default: break; | ||
162 | } | 181 | } |
163 | } | 182 | } |
164 | } | 183 | } |
@@ -29,6 +29,7 @@ typedef struct { | |||
29 | typedef struct Device { | 29 | typedef struct Device { |
30 | struct Uxn *u; | 30 | struct Uxn *u; |
31 | u8 addr, dat[16], *mem; | 31 | u8 addr, dat[16], *mem; |
32 | u16 vector; | ||
32 | void (*talk)(struct Device *d, u8, u8); | 33 | void (*talk)(struct Device *d, u8, u8); |
33 | } Device; | 34 | } Device; |
34 | 35 | ||