aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c79
1 files changed, 49 insertions, 30 deletions
diff --git a/src/main.c b/src/main.c
index c15a9e3..60be453 100644
--- a/src/main.c
+++ b/src/main.c
@@ -129,36 +129,55 @@ system_talk(Device *d, u8 b0, u8 w) {
129IWRAM_CODE 129IWRAM_CODE
130void 130void
131screen_talk(Device *d, u8 b0, u8 w) { 131screen_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}