// // Created by william on 12/23/23. // #include "include/cpu.h" #include "include/system.h" #include "memory.h" #include #include #include "log.h" void system_init(System *system) { byte *registers_base_addr = &system->ram[PPU_REGISTERS_BASE_ADDR]; byte *oam_dma_register = &system->ram[PPU_REGISTER_OAM_DMA_ADDR]; cpu_init(&system->cpu); ppu_init(&system->ppu, registers_base_addr, oam_dma_register); system->mapper = get_mapper(MAPPER_TYPE_SIMPLE); system->cycle_count = 7; } void system_start(System *system) { address pc = mem_get_word(system, 0xfffc); system->cpu.program_counter = pc; } void system_loop(System *system) { assert(CPU_CLOCK_DIVISOR > PPU_CLOCK_DIVISOR); unsigned int master_cycle_per_frame = MASTER_CLOCK / FRAME_RATE; unsigned int cpu_cycle_per_frame = master_cycle_per_frame / CPU_CLOCK_DIVISOR; unsigned int ppu_cycle_per_cpu_cycle = CPU_CLOCK_DIVISOR / PPU_CLOCK_DIVISOR; long frame = 1; long cpu_cycle_count = 0; while (true) { log_info("Frame %d", frame); while (system->cycle_count < cpu_cycle_per_frame * frame) { if (cpu_cycle_count == system->cycle_count) { cpu_cycle(system); } cpu_cycle_count++; for (int ppu_c = 0; ppu_c < ppu_cycle_per_cpu_cycle; ppu_c++) { ppu_cycle(&system->ppu); } } frame++; usleep(17000); // Wait 16.6666ms } } void system_uninit(System *system) { }