nesemu/gui/nametable_window.c

55 lines
1.7 KiB
C

//
// Created by william on 12/07/24.
//
#include <assert.h>
#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);
}