diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 66 |
1 files changed, 50 insertions, 16 deletions
@@ -89,22 +89,56 @@ system_talk(Device *d, u8 b0, u8 w) { | |||
89 | 89 | ||
90 | void | 90 | void |
91 | screen_talk(Device *d, u8 b0, u8 w) { | 91 | screen_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 | ||