diff options
Diffstat (limited to 'src/interrupts.s')
| -rw-r--r-- | src/interrupts.s | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/interrupts.s b/src/interrupts.s new file mode 100644 index 0000000..8c53af7 --- /dev/null +++ b/src/interrupts.s @@ -0,0 +1,101 @@ +.segment "CODE" + +.proc nmi + ;; Should we skip it? + bit Globals::zp_flags + + ;; If we are on a dev environment, account for any frame drops. + .ifdef PARTIAL + bpl @account_for_frame_drop + .else + bpl @end + .endif + + ;; Save registers. + pha + txa + pha + tya + pha + + ;; Sprite DMA. + lda #$00 + sta OAM::m_address + lda #$02 + sta OAM::m_dma + + ;; Are we paused? If so skip timers, PAL handler and the likes. + lda #%00001000 + and Globals::zp_flags + bne @ppu_registers + + ;; PAL-specific code + .ifdef PAL + jsr Driver::pal_handler + .endif + + ;; TODO: some actions here will depend on the status of the game... + lda Globals::zp_flags + and #%00000001 + bne @ppu_registers + + ;; Increase the random seed. + inc Prng::zp_rand + + ;; Decrease title timer. + lda Title::zp_title_timer + beq @ppu_registers + dec Title::zp_title_timer + +@ppu_registers: + ;; Should we update PPU registers? + bit Globals::zp_flags + bvc @scroll + + ;; Zero out the `ppu` flag. + lda #%10111111 + and Globals::zp_flags + sta Globals::zp_flags + + bit PPU::m_status + + ;; Update the PPU control/mask registers with shadowed values. + lda PPU::zp_mask + sta PPU::m_mask + lda PPU::zp_control + sta PPU::m_control + +@scroll: + ;; Always reset the scroll just in case. + bit PPU::m_status + lda #$00 + sta PPU::m_scroll + sta PPU::m_scroll + + ;; Unblock the main code. + lda #%01111111 + and Globals::zp_flags + sta Globals::zp_flags + + ;; Restore registers. + pla + tay + pla + tax + pla + +@end: + rti + + ;; If we are on a dev environment, account for any frame drops. +.ifdef PARTIAL +@account_for_frame_drop: + inc Debug::zp_frame_drops + rti +.endif +.endproc + +;; Unused. +.proc irq + rti +.endproc |
