// // Created by william on 12/07/24. // #include #include "nametable_window.h" #define NAMETABLE_BANK_SIZE 0x0400 void nametable_window_init(NesNametableWindow *window) { int win_size = pattern_display_get_size(NW_ROW_TILE_COUNT); window->sdl_context = window_init("Nametable", win_size, win_size, NW_SCALE); pattern_display_init(&window->pattern_display, window->sdl_context.renderer, NW_ROW_TILE_COUNT, NW_ROW_TILE_COUNT - 2, 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); byte **nametables = (byte **) data; int bank = addr / NAMETABLE_BANK_SIZE; int bank_addr = addr % NAMETABLE_BANK_SIZE; switch (bank) { case 0: case 1: return &nametables[0][bank_addr]; default: return &nametables[1][bank_addr]; } } void nametable_window_update(NesNametableWindow *window, byte *nametable_0, byte *nametable_1) { byte **nametables[2]; nametables[0] = &nametable_0; nametables[1] = &nametable_1; pattern_display_build(&window->pattern_display, &nametable_window_read_byte, nametables); } 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); }