aboutsummaryrefslogtreecommitdiff
path: root/src/interrupts.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/interrupts.s')
-rw-r--r--src/interrupts.s101
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