// // Created by william on 7/23/24. // #include "dbg_nametable.h" #include "../include/ppu.h" #include "../include/system.h" #include "../include/rom.h" // TODO: Add support for palettes #define NAMETABLE_ROW_DRAW_WIDTH (NAMETABLE_ROW_WIDTH * PATTERN_DRAW_SIZE) DebugNameTable dbg_nametable; void dbg_nametable_init() { dbg_nametable.vertical_mirroring = rom_get()->nametable_mirrored; } void dbg_nametable_build_bank(byte *nametable, DebugTile *bank) { for (int i = 0; i < NAMETABLE_BANK_SIZE; i++) { DebugTile *tile = &bank[i]; tile->tile_id = nametable[i]; } } void dbg_nametable_update() { dbg_nametable_build_bank(ppu_get_state()->memory.nametable_0, dbg_nametable.bank_0); dbg_nametable_build_bank(ppu_get_state()->memory.nametable_1, dbg_nametable.bank_1); } static inline DebugTile *dbg_nametable_get_bank(int bank) { if (dbg_nametable.vertical_mirroring) { if (bank % 2 == 0) { return dbg_nametable.bank_0; } return dbg_nametable.bank_1; } // Horizontal mirroring if (bank < 2) { return dbg_nametable.bank_0; } return dbg_nametable.bank_1; } void dbg_nametable_render_bank(int bank, pixel *buffer) { DebugTile *table = dbg_nametable_get_bank(bank); int pattern_bank = ppu_get_state()->bg_pattern_table_addr >> 12; for (int i = 0; i < NAMETABLE_BANK_SIZE; i++) { int pattern_id = table[i].tile_id; // Tile Index: // 0000 00RR RRRC CCCC // || |||+ ++++-- Tile column // ++ +++-------- Tile row int row = (i & ~(NAMETABLE_ROW_WIDTH - 1)) >> 5; int col = i & (NAMETABLE_ROW_WIDTH - 1); int tile_pixel_addr = (row * PATTERN_DRAW_SIZE * PATTERN_DRAW_SIZE * NAMETABLE_ROW_WIDTH) + (col * PATTERN_DRAW_SIZE); pixel *tile_buffer = &buffer[tile_pixel_addr]; dbg_pattern_draw(pattern_id, pattern_bank, tile_buffer, NAMETABLE_ROW_DRAW_WIDTH); } }