From 1d1e1123f8b76c40ba57427367f34b6f5c61de85 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 20 Apr 2023 11:14:02 +0200 Subject: Clean up old ppu struct due to being unused --- src/ppu.c | 102 +++++++++++++++++++++++++++----------------------------------- 1 file changed, 45 insertions(+), 57 deletions(-) (limited to 'src/ppu.c') diff --git a/src/ppu.c b/src/ppu.c index 1d29725..d68ab8f 100644 --- a/src/ppu.c +++ b/src/ppu.c @@ -214,21 +214,17 @@ static u32 dirty_tiles[21] = {0}; void putcolors(u8 *addr) { - int i; - for(i = 0; i < 4; ++i) { - u8 - r = (*(addr + i / 2) >> (!(i % 2) << 2)) & 0x0f, - g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f, - b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f; - PAL_BUFFER_BG[i] = rgb15( + for(size_t i = 0; i < 4; ++i) { + u8 r = (*(addr + 0 + i / 2) >> (!(i % 2) << 2)) & 0x0f; + u8 g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f; + u8 b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f; + Color color = rgb15( (r << 1) | (r >> 3), (g << 1) | (g >> 3), (b << 1) | (b >> 3)); + PAL_BUFFER_BG[i] = color; for (size_t j = 0; j < 16; ++j) { - PAL_BUFFER_SPRITES[i * 16 + j] = rgb15( - (r << 1) | (r >> 3), - (g << 1) | (g >> 3), - (b << 1) | (b >> 3)); + PAL_BUFFER_SPRITES[i * 16 + j] = color; } } } @@ -241,9 +237,10 @@ ppu_pixel(u32 *layer, u16 x, u16 y, u8 clr) { size_t tile_y = y / 8; size_t start_col = x % 8; size_t start_row = y % 8; - size_t pos = (start_row + ((tile_x + tile_y * 32) * 8)); - size_t shift = start_col * 4; - layer[pos] = (layer[pos] & (~(0xF << shift))) | (clr << shift); + size_t shift_left = start_col * 4; + u32 *dst = &layer[start_row + (tile_x + tile_y * 32) * 8]; + u32 mask = 0xF << shift_left; + *dst = (*dst & ~mask) | (clr << shift_left); dirty_tiles[tile_y] |= 1 << tile_x; } @@ -318,7 +315,9 @@ screen_fill(u32 *layer, u16 x0, u16 y0, u16 x1, u16 y1, u8 clr) { // Special condition. If the screen is to be completely filled, use the DMA // instead. - if (x0 == 0 && x1 >= (SCREEN_WIDTH - 1) && y0 == 0 && y1 >= (SCREEN_HEIGHT - 1)) { + u16 max_width = SCREEN_WIDTH - 1; + u16 max_height = SCREEN_HEIGHT - 1; + if (x0 == 0 && x1 >= max_width && y0 == 0 && y1 >= max_height) { clear_screen(layer, clr); return; } @@ -722,25 +721,33 @@ putfontchar(u32 *layer, u16 tile_x, u16 tile_y, u8 ch, u8 color) { IWRAM_CODE void -flipbuf(Ppu *p) { - Tile *mem_fg = FG_FRONT; - Tile *mem_bg = BG_FRONT; - for (size_t j = 0; j < 20; ++j) { - if (dirty_tiles[j] == 0) { - continue; - } - - size_t k = 1; - for (size_t i = 0; i < 30; ++i, k <<= 1) { - if (dirty_tiles[j] & k) { - Tile *tile_fg = p->fg; - Tile *tile_bg = p->bg; - mem_fg[i + j * 32] = tile_fg[i + j * 32]; - mem_bg[i + j * 32] = tile_bg[i + j * 32]; - } - } - dirty_tiles[j] = 0; - } +flipbuf() { + // Copy the fg and bg layers fully with the DMA. + dma_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(40), 3); + // dma_sync_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(40)); + // + // TODO: dma the dirty lines instead of per tile copying. + // dma_copy((u32*)BG_FRONT, (u32*)BG_BACK, KB(20), 3); + // dma_sync_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(20)); + // dma_sync_copy((u32*)BG_FRONT, (u32*)BG_BACK, KB(20)); + // Tile *mem_fg = FG_FRONT; + // Tile *mem_bg = BG_FRONT; + // for (size_t j = 0; j < 20; ++j) { + // if (dirty_tiles[j] == 0) { + // continue; + // } + + // // size_t k = 1; + // // for (size_t i = 0; i < 30; ++i, k <<= 1) { + // // if (dirty_tiles[j] & k) { + // // Tile *tile_fg = FG_BACK; + // // Tile *tile_bg = BG_BACK; + // // mem_fg[i + j * 32] = tile_fg[i + j * 32]; + // // mem_bg[i + j * 32] = tile_bg[i + j * 32]; + // // } + // // } + // dirty_tiles[j] = 0; + // } } typedef struct KeyboardChar { @@ -781,12 +788,10 @@ update_cursor(u8 pos) { | OBJ_X_COORD(keyboard[cursor_position].x); } -int -initppu(Ppu *p, u8 hor, u8 ver) { - p->hor = hor; - p->ver = ver; - p->width = (8 * p->hor); - p->height = (8 * p->ver); +void +video_init() { + // Clear VRAM. + // dma_fill((u32*)MEM_VRAM, 0, KB(96), 3); // Initialize display mode and bg palette. DISP_CTRL = DISP_MODE_0 | DISP_BG_0 | DISP_BG_1 | DISP_OBJ; @@ -799,21 +804,6 @@ initppu(Ppu *p, u8 hor, u8 ver) { BG_CTRL(0) = BG_CHARBLOCK(cb_fg) | BG_SCREENBLOCK(sb_fg) | BG_PRIORITY(1); BG_CTRL(1) = BG_CHARBLOCK(cb_bg) | BG_SCREENBLOCK(sb_bg) | BG_PRIORITY(2); - // Clear front buffer. - p->fg = FG_FRONT; - p->bg = BG_FRONT; - - // Use DMA to clear VRAM. - u32 fill = 0; - dma_fill(p->fg, fill, KB(20), 3); - dma_fill(p->bg, fill, KB(20), 3); - - // Clear back buffer. - p->fg = FG_BACK; - p->bg = BG_BACK; - dma_fill(p->fg, fill, KB(20), 3); - dma_fill(p->bg, fill, KB(20), 3); - // Initialize default palette. PAL_BUFFER_BG[0] = COLOR_BLACK; PAL_BUFFER_BG[1] = COLOR_WHITE; @@ -856,6 +846,4 @@ initppu(Ppu *p, u8 hor, u8 ver) { OBJ_ATTR_0(127) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[cursor_position].y) | OBJ_HIDDEN; OBJ_ATTR_1(127) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[cursor_position].x); OBJ_ATTR_2(127) = (SPRITE_START_IDX + 0xdb) | OBJ_PAL_BANK(3); - - return 1; } -- cgit v1.2.1