aboutsummaryrefslogtreecommitdiff
path: root/space/src/vectors/reset.s
diff options
context:
space:
mode:
Diffstat (limited to 'space/src/vectors/reset.s')
-rw-r--r--space/src/vectors/reset.s76
1 files changed, 76 insertions, 0 deletions
diff --git a/space/src/vectors/reset.s b/space/src/vectors/reset.s
new file mode 100644
index 0000000..afc9fa5
--- /dev/null
+++ b/space/src/vectors/reset.s
@@ -0,0 +1,76 @@
+.segment "CODE"
+
+reset:
+ ;; Ignore IRQs and disable decimal mode.
+ sei
+ cld
+
+ ;; Disable APU frame IRQ.
+ ldx #$40
+ stx APU::FRAME_COUNTER
+
+ ;; Set up the stack register with the proper value.
+ ldx #$ff
+ txs
+
+ ;; And now disable, in this order, NMI, rendering and DMC IRQs. Note that
+ ;; `x` was set to $ff, so increasing it by one results in a zero, which is
+ ;; the value then stored in the aforementioned memory locations.
+ inx
+ stx PPU::CONTROL
+ stx PPU::MASK
+ stx APU::DMC
+
+ ;;;
+ ;; NOTE: If you are using a mapper which needs some special configuration,
+ ;; now it would be a good time set it up. I am not using a special mapper,
+ ;; so there's nothing from me to do here.
+ ;;;
+
+ ;; First of the two VBLANK waits.
+@vblankwait1:
+ bit PPU::STATUS
+ bpl @vblankwait1
+
+ ;; Clear RAM memory. Notice that we are not clearing $200-$2ff, this is done
+ ;; later.
+ ldx #0
+ lda #0
+@ram_reset_loop:
+ sta $000, x
+ sta $100, x
+ sta $300, x
+ sta $400, x
+ sta $500, x
+ sta $600, x
+ sta $700, x
+ inx
+ bne @ram_reset_loop
+
+ ;; Reset sprites by moving them off-screen.
+ lda #$ef
+@sprite_reset_loop:
+ sta $200, x
+ inx
+ bne @sprite_reset_loop
+
+ ;; Write "sprites" into OAM.
+ OAM_WRITE_SPRITES
+
+ ;; Last VBLANK wait.
+@vblankwait2:
+ bit PPU::STATUS
+ bpl @vblankwait2
+
+ ;; Reset palettes.
+ PPU_ADDR $3F00
+
+ lda #$0F
+ ldx #$20
+@palettes_reset_loop:
+ sta PPU::DATA
+ dex
+ bne @palettes_reset_loop
+
+ ;; Jump into the main subroutine.
+ jmp main