57 lines
1.5 KiB
C
57 lines
1.5 KiB
C
|
//
|
||
|
// Created by william on 12/23/23.
|
||
|
//
|
||
|
|
||
|
#include "include/cpu.h"
|
||
|
#include "include/system.h"
|
||
|
#include "memory.h"
|
||
|
#include <unistd.h>
|
||
|
#include <assert.h>
|
||
|
#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) {
|
||
|
}
|