Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
.segment "HEADER"
.byte "NES", $1A ; iNES header identifier
.byte 2 ; 2x 16KB PRG code
.byte 1 ; 1x 8KB CHR data
.byte 0, 0 ; mapper 0, vertical mirroring
;;;;;;;;;;;;;;;
;;; "nes" linker config requires a STARTUP section, even if it's empty
.segment "STARTUP"
.segment "CODE"
reset:
sei ; disable IRQs
cld ; disable decimal mode
ldx #$40
stx $4017 ; dsiable APU frame IRQ
ldx #$ff ; Set up stack
txs ; +
inx ; now X = 0
stx $2000 ; disable NMI
stx $2001 ; disable rendering
stx $4010 ; disable DMC IRQs
@vblankwait1: ; First wait for vlbank to make sure PPU is ready
bit $2002
bpl @vblankwait1
@clrmem:
lda #$00
sta $0000, x
sta $0100, x
sta $0200, x
sta $0400, x
sta $0500, x
sta $0600, x
sta $0700, x
lda #$fe
sta $0300, x
inx
bne @clrmem
@vblankwait2: ; Second wait for vblank, PPU is ready after this
bit $2002
bpl @vblankwait2
.if 0 ; Enable this to work on Nestopia
lda #$3f ; Set PPU address to BG palette RAM ($3F00)
sta $2006
lda #$00
sta $2006
lda #$00
sta $2007
sta $2007
@vblankwait3:
bit $2002
bpl @vblankwait3
.endif
lda #%10000000 ; intensify blues
sta $2001
@forever:
jmp @forever
nmi:
rti
;;;;;;;;;;;;;;
.segment "VECTORS"
.word 0, 0, 0 ; Unused
;; When an NMI happens (once per frame if enabled) the label nmi:
.word nmi
;; When the processor first turns on or is reset, it will jump to the
;; label reset:
.word reset
;; External interrupt IRQ is not used in this tutorial
.word 0
;;;;;;;;;;;;;;
.segment "CHARS"
.incbin "mario.chr" ; includes 8KB graphics from SMB1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment