Browse Source

Fix SRAM mapping and mapper init sequence

v2
Nathaniel Walizer 8 months ago
parent
commit
e855d6fb47
5 changed files with 21 additions and 14 deletions
  1. +2
    -0
      Makefile
  2. +4
    -6
      src/cart.c
  3. +1
    -4
      src/f6502.c
  4. +10
    -1
      src/map/map001.c
  5. +4
    -3
      src/nes.c

+ 2
- 0
Makefile View File

@@ -41,6 +41,8 @@ NESE_SRCS += $(NESE_MAP_SRCS:%=$(MAPDIR)/%)
NESE_OBJS = $(NESE_SRCS:%.c=$(OBJDIR)/%.o)


nese: $(BINDIR)/nese

all: $(BINDIR)/nese

$(BINDIR)/test: CFLAGS += -DF6502_FLAT -DF6502_TEST -DF6502_TRACE


+ 4
- 6
src/cart.c View File

@@ -81,7 +81,7 @@ int nes_cart_load_mem(void* data, int size, nes* sys) {
LOGE("Failed to allocate mapper data");
status = -1;
} else {
// Default PGM ROM
// Default PRG ROM
if (mem->n_rom_banks > 2) {
mem->rom_bank[0] = prg_rom_page(mem, 0);
mem->rom_bank[1] = prg_rom_page(mem, 1);
@@ -94,6 +94,9 @@ int nes_cart_load_mem(void* data, int size, nes* sys) {
mem->rom_bank[3] = prg_rom_page(mem, 1);
}

// Default SRAM bank
mem->sram_bank = mem->sram;

// PPU Bank 0 - 7: Default pattern tables
for (int page = 0; page < 8; ++page) {
mem->ppu.bank[page] = chr_page(&mem->ppu, page);
@@ -109,11 +112,6 @@ int nes_cart_load_mem(void* data, int size, nes* sys) {
mem->ppu.bank[page] = mem->ppu.pal_bank;
}

// Map the SRAM bank to battery-backed SRAM if present
if (hdr->flags_6 & ines_Flag_Battery) {
mem->sram_bank = mem->sram;
}

if (mem->mapper.init) {
status = mem->mapper.init(&mem->mapper,
hdr, mem);


+ 1
- 4
src/f6502.c View File

@@ -20,9 +20,6 @@
#include "log.h"


// TOTO: Temp Hack
volatile uint8_t memval;

static inline uint8_t f6502_read_zp(nes_Memory* mem,
uint8_t addr) {
return mem->ram[addr];
@@ -143,7 +140,7 @@ static inline int f6502_write(nes_Memory* mem,
uint16_t addr, uint8_t val) {
int ret = 0;
#ifdef F6502_TRACE
printf("W $%04X <- %02X\n", addr, val);
// printf("W $%04X <- %02X\n", addr, val);
#endif
#ifdef F6502_FLAT
#ifdef F6502_TEST


+ 10
- 1
src/map/map001.c View File

@@ -22,7 +22,15 @@ static inline void mmc1_update_vram(map001_data* data,
nes_Mirror_Vertical,
nes_Mirror_Horizontal,
};
LOGD("Mirroring %d", mirror[data->reg_control & 0b11]);
#ifdef NESE_DEBUG
static const char* mirror_name[] = {
"1-screen, lower bank",
"1-screen, upper bank",
"Vertical mirroring",
"Horizontal mirroring",
};
#endif
LOGD("VRAM: %s", mirror_name[data->reg_control & 0b11]);
nes_ppu_set_mirroring(&mem->ppu,
mirror[data->reg_control & 0b11]);
}
@@ -102,6 +110,7 @@ static int map001_write_rom(nes_Mapper* map, nes_Memory* mem,
LOGD("Write $%04x < %02x", addr, val);

if (val & 0x80U) {
LOGD("Resetting");
data->reg_shift = 0b10000;
data->reg_control |= 0b01100;
mmc1_update_prg(data, mem);


+ 4
- 3
src/nes.c View File

@@ -15,13 +15,14 @@ void nes_init(nes* sys, void* plat) {
}

void nes_reset(nes* sys) {
f6502_reset(&sys->core);
// TODO: Reset PPU
// TODO: Reset APU
nes_Mapper* mapper = &sys->core.memory.mapper;
if (mapper->reset) {
mapper->reset(mapper, &sys->core.memory);
}
// TODO: Reset PPU
// TODO: Reset APU
// Do this last so we load the right reset vector!
f6502_reset(&sys->core);
}

void nes_done(nes* sys) {


Loading…
Cancel
Save