diff options
Diffstat (limited to 'src/uxn')
-rw-r--r-- | src/uxn/devices/ppu.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/uxn/devices/ppu.c b/src/uxn/devices/ppu.c index 97b5e4f..61e4d26 100644 --- a/src/uxn/devices/ppu.c +++ b/src/uxn/devices/ppu.c | |||
@@ -142,10 +142,6 @@ static Uint32 unpack_icon_lut_flipx[256] = { | |||
142 | 0x11111111 | 142 | 0x11111111 |
143 | }; | 143 | }; |
144 | 144 | ||
145 | EWRAM_BSS | ||
146 | static u32 *backbuffer_bg0[32 * 20 * sizeof(Tile) / 4]; | ||
147 | EWRAM_BSS | ||
148 | static u32 *backbuffer_bg1[32 * 20 * sizeof(Tile) / 4]; | ||
149 | static u32 dirty_tiles[20] = {0}; | 145 | static u32 dirty_tiles[20] = {0}; |
150 | 146 | ||
151 | void | 147 | void |
@@ -194,13 +190,13 @@ puticn(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Ui | |||
194 | 190 | ||
195 | if (flipy) flipy = 7; | 191 | if (flipy) flipy = 7; |
196 | 192 | ||
197 | if (x >= 240 || y >= 160) return; | 193 | if (x >= SCREEN_WIDTH || y >= SCREEN_HEIGHT) return; |
198 | 194 | ||
199 | if (color != 0x05 && color != 0x0a && color != 0x0f) { | 195 | if (color != 0x05 && color != 0x0a && color != 0x0f) { |
200 | u64 mask = ~((u64)0xFFFFFFFF << shift); | 196 | u64 mask = ~((u64)0xFFFFFFFF << shift); |
201 | 197 | ||
202 | for (v = 0; v < 8; v++, layerptr++) { | 198 | for (v = 0; v < 8; v++, layerptr++) { |
203 | if ((y + v) >= 160) break; | 199 | if ((y + v) >= SCREEN_HEIGHT) break; |
204 | 200 | ||
205 | sprline = sprite[v ^ flipy]; | 201 | sprline = sprite[v ^ flipy]; |
206 | u64 data = (u64)(lut_expand[sprline] * (color & 3)) << shift; | 202 | u64 data = (u64)(lut_expand[sprline] * (color & 3)) << shift; |
@@ -213,7 +209,7 @@ puticn(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Ui | |||
213 | } | 209 | } |
214 | } else { | 210 | } else { |
215 | for (v = 0; v < 8; v++, layerptr++) { | 211 | for (v = 0; v < 8; v++, layerptr++) { |
216 | if ((y + v) >= 160) break; | 212 | if ((y + v) >= SCREEN_HEIGHT) break; |
217 | 213 | ||
218 | sprline = sprite[v ^ flipy]; | 214 | sprline = sprite[v ^ flipy]; |
219 | u64 mask = ~((u64)(lut_expand[sprline] * 0xF) << shift); | 215 | u64 mask = ~((u64)(lut_expand[sprline] * 0xF) << shift); |
@@ -246,13 +242,13 @@ putchr(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, | |||
246 | 242 | ||
247 | if (flipy) flipy = 7; | 243 | if (flipy) flipy = 7; |
248 | 244 | ||
249 | if (x >= 240 || y >= 160) return; | 245 | if (x >= SCREEN_WIDTH || y >= SCREEN_HEIGHT) return; |
250 | 246 | ||
251 | u64 mask = ~((u64)0xFFFFFFFF << shift); | 247 | u64 mask = ~((u64)0xFFFFFFFF << shift); |
252 | u32 colconst = (color >> 2) * 0x11111111; | 248 | u32 colconst = (color >> 2) * 0x11111111; |
253 | 249 | ||
254 | for (v = 0; v < 8; v++, layerptr++) { | 250 | for (v = 0; v < 8; v++, layerptr++) { |
255 | if ((y + v) >= 160) break; | 251 | if ((y + v) >= SCREEN_HEIGHT) break; |
256 | 252 | ||
257 | sprline1 = sprite[v ^ flipy]; | 253 | sprline1 = sprite[v ^ flipy]; |
258 | sprline2 = sprite[(v ^ flipy) | 8]; | 254 | sprline2 = sprite[(v ^ flipy) | 8]; |
@@ -315,13 +311,27 @@ initppu(Ppu *p, Uint8 hor, Uint8 ver, Uint8 pad) { | |||
315 | BG_CTRL(1) = BG_CHARBLOCK(cb_bg) | BG_SCREENBLOCK(sb_idx) | BG_PRIORITY(2); | 311 | BG_CTRL(1) = BG_CHARBLOCK(cb_bg) | BG_SCREENBLOCK(sb_idx) | BG_PRIORITY(2); |
316 | 312 | ||
317 | // Clear tile memory. | 313 | // Clear tile memory. |
318 | p->fg = backbuffer_bg0; | ||
319 | p->bg = backbuffer_bg1; | ||
320 | for (size_t i = 0; i < 32 * 20 * 8; ++i) { | 314 | for (size_t i = 0; i < 32 * 20 * 8; ++i) { |
321 | p->fg[i] = 0; | 315 | p->fg[i] = 0; |
322 | p->bg[i] = 0; | 316 | p->bg[i] = 0; |
323 | } | 317 | } |
324 | 318 | ||
319 | // Use DMA to clear VRAM. | ||
320 | u32 fill = 0; | ||
321 | u32 tile_clear_ctrl = (32 * 20 * 8) | DMA_DST_INC | DMA_SRC_FIXED | DMA_NOW | DMA_CHUNK_32 | DMA_ENABLE; | ||
322 | DMA_SRC(3) = &fill; | ||
323 | DMA_DST(3) = p->fg; | ||
324 | DMA_CTRL(3) = tile_clear_ctrl; | ||
325 | DMA_DST(3) = p->bg; | ||
326 | DMA_CTRL(3) = tile_clear_ctrl; | ||
327 | |||
328 | p->fg = (u32*) (MEM_VRAM + (56 * 1024)); | ||
329 | p->bg = (u32*) (MEM_VRAM + (76 * 1024)); | ||
330 | DMA_DST(3) = p->fg; | ||
331 | DMA_CTRL(3) = tile_clear_ctrl; | ||
332 | DMA_DST(3) = p->bg; | ||
333 | DMA_CTRL(3) = tile_clear_ctrl; | ||
334 | |||
325 | // Initialize default palette. | 335 | // Initialize default palette. |
326 | PAL_BUFFER_BG[0] = COLOR_BLACK; | 336 | PAL_BUFFER_BG[0] = COLOR_BLACK; |
327 | PAL_BUFFER_BG[1] = COLOR_WHITE; | 337 | PAL_BUFFER_BG[1] = COLOR_WHITE; |