67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
//
|
|
// 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);
|
|
}
|
|
} |