Przeglądaj źródła

Fix ROM read addr mask; Fix interrupt logic; add VBlank NMI

v2
Nathaniel Walizer 9 miesięcy temu
rodzic
commit
eec711f630
4 zmienionych plików z 20 dodań i 5 usunięć
  1. +3
    -2
      src/f6502.c
  2. +14
    -3
      src/nes.c
  3. +1
    -0
      src/nes.h
  4. +2
    -0
      src/nese.c

+ 3
- 2
src/f6502.c Wyświetl plik

@@ -39,7 +39,7 @@ static inline uint8_t f6502_read(nes_Memory* mem,
return mem->ram[addr];
#else
if (addr >= 0x8000U) {
return mem->rom_bank[(addr - 0x8000U) >> 13][addr & 0x1FFFFU];
return mem->rom_bank[(addr - 0x8000U) >> 13][addr & 0x1FFFU];
}

switch (addr & 0x6000U) {
@@ -1548,5 +1548,6 @@ int f6502_step(f6502_Core* core, int clocks) {
}
*/
clocks_elapsed += f6502_check_interrupts(core);
return (clocks_elapsed + f6502_do_step(core, clocks));
return ( f6502_do_step(core, clocks - clocks_elapsed) +
clocks_elapsed);
}

+ 14
- 3
src/nes.c Wyświetl plik

@@ -6,6 +6,14 @@

void nes_init(nes* sys) {
f6502_init(&sys->core);
// TODO: Init PPU
// TODO: Init APU
}

void nes_reset(nes* sys) {
f6502_reset(&sys->core);
// TODO: Reset PPU
// TODO: Reset APU
}

void nes_done(nes* sys) {
@@ -15,7 +23,11 @@ void nes_done(nes* sys) {
static int nes_vsync(nes* sys) {
int status = 0;

// TODO: PPU Set VBlank flag
sys->core.memory.ppu.status |= ppu_Status_VBlank;
if (sys->core.memory.ppu.ctrl & ppu_Control_VBlank) {
f6502_set_NMI(&sys->core, 1);
}

// TODO: APU Sync
// TODO: APU Frame IRQ

@@ -25,8 +37,6 @@ static int nes_vsync(nes* sys) {
status = nese_update_input(&sys->input);
}

// TODO: NMI

return status;
}

@@ -56,6 +66,7 @@ static int nes_hsync(nes* sys) {

switch (sys->ppu.scanline) {
case nes_ppu_prerender_line:
f6502_set_NMI(&sys->core, 0);
sys->core.memory.ppu.status &= ~( ppu_Status_VBlank |
ppu_Status_Hit);
nes_ppu_find_hit_line(&sys->ppu, &sys->core.memory.ppu);


+ 1
- 0
src/nes.h Wyświetl plik

@@ -17,6 +17,7 @@ typedef struct {
} nes;

void nes_init(nes*);
void nes_reset(nes*);
void nes_done(nes*);
int nes_loop(nes*);



+ 2
- 0
src/nese.c Wyświetl plik

@@ -39,6 +39,8 @@ int nese_start(nes* sys, const char* filename) {

nes_init(sys);

nes_reset(sys);

nes_loop(sys);

if (cart_data) nese_unmap_file(cart_data, filesize);


Ładowanie…
Anuluj
Zapisz