//called by ppu.tick() when Hcounter=0 void CPU::scanline() { status.lineclocks = lineclocks(); //forcefully sync S-CPU to other processors, in case chips are not communicating synchronize_ppu(); synchronize_smp(); synchronize_coprocessor(); system.scanline(); if(vcounter() == 0) { //HDMA init triggers once every frame status.hdma_init_position = (cpu_version == 1 ? 12 + 8 - dma_counter() : 12 + dma_counter()); status.hdma_init_triggered = false; status.auto_joypad_counter = 0; } //DRAM refresh occurs once every scanline if(cpu_version == 2) status.dram_refresh_position = 530 + 8 - dma_counter(); status.dram_refreshed = false; //HDMA triggers once every visible scanline if(vcounter() <= (ppu.overscan() == false ? 224 : 239)) { status.hdma_position = 1104; status.hdma_triggered = false; } }
void CPU::scanline() { synchronize_smp(); synchronize_ppu(); synchronize_coprocessor(); system.scanline(); if(vcounter() == 0) hdma_init(); queue.enqueue(534, QueueEvent::DramRefresh); if(vcounter() <= (ppu.overscan() == false ? 224 : 239)) { queue.enqueue(1104 + 8, QueueEvent::HdmaRun); } if(vcounter() == input.latchy) { queue.enqueue(input.latchx, QueueEvent::ControllerLatch); } bool nmi_valid = status.nmi_valid; status.nmi_valid = vcounter() >= (ppu.overscan() == false ? 225 : 240); if(!nmi_valid && status.nmi_valid) { status.nmi_line = true; if(status.nmi_enabled) status.nmi_transition = true; } else if(nmi_valid && !status.nmi_valid) { status.nmi_line = false; } if(status.auto_joypad_poll_enabled && vcounter() == (ppu.overscan() == false ? 227 : 242)) { input.poll(); run_auto_joypad_poll(); } }