aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c66
1 files changed, 50 insertions, 16 deletions
diff --git a/src/main.c b/src/main.c
index 73a74e1..7d77051 100644
--- a/src/main.c
+++ b/src/main.c
@@ -89,22 +89,56 @@ system_talk(Device *d, u8 b0, u8 w) {
89 89
90void 90void
91screen_talk(Device *d, u8 b0, u8 w) { 91screen_talk(Device *d, u8 b0, u8 w) {
92 if(w && b0 == 0xe) { 92 if (w) {
93 Uint16 x = mempeek16(d->dat, 0x8); 93 switch (b0) {
94 Uint16 y = mempeek16(d->dat, 0xa); 94 case 0x1: {
95 Uint8 layer = d->dat[0xe] >> 4 & 0x1; 95 d->vector = mempeek16(d->dat, 0x0);
96 ppu_pixel(layer, x, y, d->dat[0xe] & 0x3); 96 } break;
97 reqdraw = 1; 97 case 0xe: {
98 } else if(w && b0 == 0xf) { 98 u16 x = mempeek16(d->dat, 0x8);
99 Uint16 x = mempeek16(d->dat, 0x8); 99 u16 y = mempeek16(d->dat, 0xa);
100 Uint16 y = mempeek16(d->dat, 0xa); 100 u8 *addr = &d->mem[mempeek16(d->dat, 0xc)];
101 Uint8 layer = d->dat[0xf] >> 0x6 & 0x1; 101 u8 *layer = d->dat[0xe] >> 4 & 0x1 ? pixels_fg : pixels_bg;
102 Uint8 *addr = &d->mem[mempeek16(d->dat, 0xc)]; 102 u8 mode = d->dat[0xe] >> 5;
103 if(d->dat[0xf] >> 0x7 & 0x1) 103 u8 color = d->dat[0xf] & 0xf;
104 ppu_2bpp(layer, x, y, addr, d->dat[0xf] & 0xf, d->dat[0xf] >> 0x4 & 0x1, d->dat[0xf] >> 0x5 & 0x1); 104 if(!mode) {
105 else 105 ppu_pixel(layer, x, y, d->dat[0xe] & 0x3);
106 ppu_1bpp(layer, x, y, addr, d->dat[0xf] & 0xf, d->dat[0xf] >> 0x4 & 0x1, d->dat[0xf] >> 0x5 & 0x1); 106 } else if(mode-- & 0x1) {
107 reqdraw = 1; 107 u8 flipx = mode & 0x2;
108 u8 flipy = mode & 0x4;
109 ppu_1bpp(layer, x, y, addr, color, flipx, flipy);
110 } else {
111 u8 flipx = mode & 0x2;
112 u8 flipy = mode & 0x4;
113 ppu_2bpp(layer, x, y, addr, color, flipx, flipy);
114 }
115 if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 1); }
116 if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 1); }
117 } break;
118 case 0xf: {
119 u16 x = mempeek16(d->dat, 0x8);
120 u16 y = mempeek16(d->dat, 0xa);
121 u8 *addr = &d->mem[mempeek16(d->dat, 0xc)];
122 u8 *layer = d->dat[0xf] >> 6 & 0x1 ? pixels_fg : pixels_bg;
123 u8 color = d->dat[0xf] & 0xf;
124 u8 flipx = (d->dat[0xf] >> 0x4) & 0x1;
125 u8 flipy = (d->dat[0xf] >> 0x5) & 0x1;
126 if(d->dat[0xf] >> 0x7 & 0x1) {
127 ppu_2bpp(layer, x, y, addr, color, flipx, flipy);
128 if(d->dat[0x6] & 0x04) {
129 mempoke16(d->dat, 0xc, mempeek16(d->dat, 0xc) + 16);
130 }
131 } else {
132 ppu_1bpp(layer, x, y, addr, color, flipx, flipy);
133 if(d->dat[0x6] & 0x04) {
134 mempoke16(d->dat, 0xc, mempeek16(d->dat, 0xc) + 8);
135 }
136 }
137 if(d->dat[0x6] & 0x01) { mempoke16(d->dat, 0x8, x + 8); }
138 if(d->dat[0x6] & 0x02) { mempoke16(d->dat, 0xa, y + 8); }
139 } break;
140 default: break;
141 }
108 } 142 }
109} 143}
110 144