diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 79 |
1 files changed, 49 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 | } |