#ifndef NES_H_ #define NES_H_ #include "cart.h" #include "apu.h" #include "ppu.h" #include "input.h" #include "e6502/e6502.h" #define nes_clock_master_num (945U * 1000U * 1000U) #define nes_clock_master_den (44U) #define nes_clock_cpu_div (12U) #define nes_clock_ppu_div (4U) #define nes_clock_apu_div (24U) #define nes_chr_page_size (0x1000U) #define nes_vram_page_size (0x0400U) #define nes_prg_rom_page_size (0x4000U) #define nes_mem_ram_start (0x0000U) #define nes_mem_ram_size (0x0800U) #define nes_mem_ppu_start (0x2000U) #define nes_mem_ppu_size (0x2000U) #define nes_mem_apu_start (0x4000U) #define nes_mem_apu_size (0x0020U) #define nes_mem_exp_start (0x4020U) #define nes_mem_exp_size (0x1FE0U) #define nes_mem_wram_start (0x6000U) #define nes_mem_wram_size (0x2000U) #define nes_mem_rom_start (0x8000U) #define nes_mem_rom_size (0x8000U) #define nes_ppu_mem_size (0x4000U) #define nes_ppu_map_size (0x8U) #define nes_ppu_dma_reg (0x4014U) #define nes_input_1_reg (0x4016U) #define nes_input_2_reg (0x4017U) #define nes_input_set_reg (0x4016U) #define nes_apu_map_size (0x20U) typedef struct { e6502_Core cpu; nes_ppu ppu; nes_apu apu; nes_input input; uint8_t ram[nes_mem_ram_size]; nes_cart cart; } nes; uint8_t nes_mem_read(nes*, uint16_t addr); void nes_mem_write(nes*, uint16_t addr, uint8_t); int nes_init(nes*, int audio_freq); void nes_done(nes*); int nes_setup_cart(nes*); void nes_reset(nes*); nes_ppu_Result nes_step(nes*, int* run); #endif // NES_H_