// // Created by william on 12/07/24. // #include #include "nametable_window.h" #define NAMETABLE_BANK_SIZE 0x0400 void nametable_window_init(NesNametableWindow *window, byte *nametable_0, byte *nametable_1) { int win_size = pattern_display_get_size(NW_ROW_TILE_COUNT); window->sdl_context = window_init("Nametable", win_size, win_size, NW_SCALE); window->nametable_0 = nametable_0; window->nametable_1 = nametable_1; pattern_display_init(&window->pattern_display, window->sdl_context.renderer, NW_ROW_TILE_COUNT, NW_ROW_TILE_COUNT, PATTERN_DISPLAY_DYNAMIC); } void nametable_window_uninit(NesNametableWindow *window) { pattern_display_uninit(&window->pattern_display); window_uninit(window->sdl_context); } static byte *nametable_window_read_byte(address addr, void *data) { assert(addr < NAMETABLE_BANK_SIZE * 4); assert(data != NULL); NesNametableWindow *window = (NesNametableWindow *) data; int bank = addr / NAMETABLE_BANK_SIZE; int bank_addr = addr % NAMETABLE_BANK_SIZE; switch (bank) { case 0: case 1: return &window->nametable_0[bank_addr]; default: return &window->nametable_1[bank_addr]; } } void nametable_window_update(NesNametableWindow *window) { pattern_display_build(&window->pattern_display, &nametable_window_read_byte, window); } void nametable_window_render(NesNametableWindow *window) { SDL_RenderClear(window->sdl_context.renderer); pattern_display_render(&window->pattern_display, window->sdl_context.renderer); } void nametable_window_present(NesNametableWindow *window) { SDL_RenderPresent(window->sdl_context.renderer); }