|
- #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);
- }
|