// // Created by william on 12/23/23. // #include "include/cpu.h" #include "include/system.h" #include "memory.h" #include #include #include "cpu.h" System current_sys; void system_init() { byte *registers_base_addr = mem_get_ptr(PPU_REGISTERS_BASE_ADDR); byte *oam_dma_register = mem_get_ptr(PPU_REGISTER_OAM_DMA_ADDR); cpu_init(); ppu_init(registers_base_addr, oam_dma_register); current_sys.mapper = get_mapper(MAPPER_TYPE_SIMPLE); current_sys.cycle_count = 7; } void system_start() { address pc = mem_get_word(0xfffc); cpu_get_state()->program_counter = pc; } void system_loop() { 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 (current_sys.cycle_count < cpu_cycle_per_frame * frame) { if (cpu_cycle_count == current_sys.cycle_count) { cpu_cycle(); } cpu_cycle_count++; for (int ppu_c = 0; ppu_c < ppu_cycle_per_cpu_cycle; ppu_c++) { ppu_cycle(); } } frame++; usleep(17000); // Wait 16.6666ms } } void system_uninit() { } unsigned int system_get_cycles() { return current_sys.cycle_count; } void system_add_cycles(unsigned int cycles) { current_sys.cycle_count += cycles; } Mapper *system_get_mapper() { return ¤t_sys.mapper; }