aboutsummaryrefslogtreecommitdiff
path: root/examples/wrapper.s
diff options
context:
space:
mode:
authorMiquel Sabaté Solà <msabate@suse.com>2023-09-22 14:05:19 +0200
committerMiquel Sabaté Solà <mikisabate@gmail.com>2025-02-04 20:58:02 +0100
commitbc87587330e9265b23861d0f763fdb1612e5f632 (patch)
tree2576cea91325dc3739c9c494e20f6ceb47faefb4 /examples/wrapper.s
downloadcode.nes-bc87587330e9265b23861d0f763fdb1612e5f632.tar.gz
code.nes-bc87587330e9265b23861d0f763fdb1612e5f632.zip
Initial commit
Add the basic structure and the first example: managing controller input. Signed-off-by: Miquel Sabaté Solà <msabate@suse.com>
Diffstat (limited to 'examples/wrapper.s')
-rw-r--r--examples/wrapper.s90
1 files changed, 90 insertions, 0 deletions
diff --git a/examples/wrapper.s b/examples/wrapper.s
new file mode 100644
index 0000000..673c697
--- /dev/null
+++ b/examples/wrapper.s
@@ -0,0 +1,90 @@
+;;;
+;; This is an empty wrapper for the NES. It does some basic hardware
+;; initialization and finally calls a `Main` subroutine that is to be provided
+;; by another file. After that, it loops indefinitely.
+;;
+;; There are some variations of this file already, I just took it from
+;; NESHacker: https://github.com/NesHacker (definitely check his Youtube
+;; channel, it's extra-dope!); originally licensed under the MIT License.
+;;;
+
+.import Main
+
+.segment "HEADER"
+ .byte $4E, $45, $53, $1A ; iNES header identifier
+ .byte 2 ; 2x 16KB PRG-ROM Banks
+ .byte 1 ; 1x 8KB CHR-ROM
+ .byte $01, $00 ; mapper 0, vertical mirroring
+
+.segment "VECTORS"
+ .addr nmi
+ .addr reset
+ .addr 0
+
+.segment "STARTUP"
+
+.segment "CHARS"
+
+.segment "CODE"
+
+.proc nmi
+ bit $2002
+ lda #0
+ sta $2006
+ sta $2006
+ rti
+.endproc
+
+.proc ResetPalettes
+ bit $2002
+ lda #$3f
+ sta $2006
+ lda #$00
+ sta $2006
+ lda #$0F
+ ldx #$20
+@paletteLoadLoop:
+ sta $2007
+ dex
+ bne @paletteLoadLoop
+ rts
+.endproc
+
+.proc reset
+ sei
+ cld
+ ldx #%01000000
+ stx $4017
+ ldx #$ff
+ txs
+ ldx #0
+ stx $2000
+ stx $2001
+ stx $4010
+ bit $2002
+@vblankWait1:
+ bit $2002
+ bpl @vblankWait1
+@clearMemory:
+ lda #$00
+ sta $0000, x
+ sta $0100, x
+ sta $0200, x
+ sta $0300, x
+ sta $0400, x
+ sta $0500, x
+ sta $0600, x
+ sta $0700, x
+ inx
+ bne @clearMemory
+@vblankWait2:
+ bit $2002
+ bpl @vblankWait2
+ jsr ResetPalettes
+main:
+ jsr Main
+ lda #%00001000
+ sta $2001
+endlessLoop:
+ jmp endlessLoop
+.endproc