#include "memory.h" void nes_apu_init(nes_APU* apu, nes_APU_Memory* mem, int freq) { // TODO } int nes_apu_hsync(nes_APU* apu, nes_Memory* core_mem) { nes_APU_Memory* mem = &core_mem->apu; for (int i = 0; i < core_mem->apu.n_events; ++i) { int reg = core_mem->apu.events[i].reg; int val = core_mem->apu.events[i].val; switch (reg) { // TODO: 0x00 - 0x13 // TODO: 0x15 case 0x17: // Frame Counter apu->frame_reg = val & ( apu_Frame_Mode | apu_Frame_Inhibit); apu->frame = 0; apu->frame_delay = 0; if (val & apu_Frame_Mode) { // TODO /* nes_apu_clock_quarter_frame(apu); nes_apu_clock_half_frame(apu); */ } if (val & apu_Frame_Inhibit) { mem->status &= ~apu_Status_Frame_Int; } break; } } core_mem->apu.n_events = 0; // Frame advance apu->frame_delay += nes_apu_hsync_ticks; if (apu->frame_delay >= nes_apu_quarter_frame_ticks) { apu->frame_delay -= nes_apu_quarter_frame_ticks; int end = 0; int quarter_frame = 1; int half_frame = 0; if (1 == apu->frame) { half_frame = 1; } if (apu->frame_reg & apu_Frame_Mode) { if (3 == apu->frame) { quarter_frame = 0; } else if (4 <= apu->frame) { half_frame = 1; end = 1; } } else { if (3 <= apu->frame) { half_frame = 1; end = 1; } } if (half_frame) { // TODO //nes_apu_clock_half_frame(apu); } if (quarter_frame) { // TODO //nes_apu_clock_quarter_frame(apu); } if (end) { if (0 == apu->frame_reg) { mem->status |= apu_Status_Frame_Int; } apu->frame = 0; } else { apu->frame++; } } // TODO: DMC Interrupt return (mem->status & apu_Status_Frame_Int); }