init
This commit is contained in:
commit
fc0bf0edb7
64
clearmem.asm
Normal file
64
clearmem.asm
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; The iNES Header contains a total of 16 bytes with
|
||||||
|
;; flags at $7FF0
|
||||||
|
;; https://www.nesdev.org/wiki/INES
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
.segment "HEADER"
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A ; 4 bytes with chars NES\n
|
||||||
|
.byte $02 ; 1 byte how many 16kb in pgm-rom
|
||||||
|
.byte $01 ; 1 byte how many 8kb chr-rom
|
||||||
|
.byte %00000000 ; Horiz mirroring, nothing else
|
||||||
|
.byte %00000000 ; Flags 7 - nothing
|
||||||
|
.byte $00 ; Flags 8 - no PGM-RAM
|
||||||
|
.byte $00 ; NTSC
|
||||||
|
.byte $00 ; no PGM-RAM
|
||||||
|
.byte $00,$00,$00,$00,$00 ; unused padding to complete 16bytes
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; PGM-ROM code located at $8000
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
.segment "CODE"
|
||||||
|
.org $8000 ; start of program rom
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
RESET:
|
||||||
|
sei ; set interrupt disable - disable all IRQ
|
||||||
|
cld ; clear decimal mode BCD flag (unused)
|
||||||
|
ldx #$FF ;
|
||||||
|
txs ; initialize stack pointer at $01FF
|
||||||
|
|
||||||
|
;;;;; LOOP ALL MEMORY POSITIONS FROM 00 to FF clearing
|
||||||
|
|
||||||
|
lda #$0 ; A = $0
|
||||||
|
inx ; increment X from $FF to $0
|
||||||
|
MemLoop:
|
||||||
|
sta $0,x ; store the value of A (zero) into $0 + X
|
||||||
|
dex ; X--
|
||||||
|
bne MemLoop ; loop back to MemLoop if X is not 0
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; NMI Handler - executed every time NMI interrupt
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
NMI:
|
||||||
|
rti ;return from interrupt
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; IRQ Handler - executed every time IRQ interrupt
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
IRQ:
|
||||||
|
rti ;return from interrupt
|
||||||
|
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; SEGMENTS
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
.segment "VECTORS"
|
||||||
|
.org $FFFA ; 6502 will always start at $FFFA
|
||||||
|
.word NMI ; address of the NMI Handler label
|
||||||
|
.word RESET ; address of the RESET Handler label
|
||||||
|
.word IRQ ; address of the IRQ Handler label
|
18
exercises/blank.asm
Normal file
18
exercises/blank.asm
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
Reset: ; TODO:
|
||||||
|
; Load the A register with the literal hexadecimal value $82
|
||||||
|
; Load the X register with the literal decimal value 82
|
||||||
|
; Load the Y register with the value that is inside memory position $82
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
19
exercises/exercise01.asm
Normal file
19
exercises/exercise01.asm
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
Reset: ; TODO:
|
||||||
|
lda #$82 ; Load the A register with the literal hexadecimal value $82
|
||||||
|
ldx #82 ; Load the X register with the literal decimal value 82
|
||||||
|
ldy $82 ; Load the Y register with the value that is inside memory position $82
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
23
exercises/exercise02.asm
Normal file
23
exercises/exercise02.asm
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset: ; TODO:
|
||||||
|
lda #$A
|
||||||
|
ldx %11111111
|
||||||
|
sta $80
|
||||||
|
stx $81
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
28
exercises/exercise03.asm
Normal file
28
exercises/exercise03.asm
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset: ; TODO:
|
||||||
|
lda #15
|
||||||
|
tax
|
||||||
|
tay
|
||||||
|
txa
|
||||||
|
tya
|
||||||
|
|
||||||
|
ldx #6
|
||||||
|
txa
|
||||||
|
tay
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
29
exercises/exercise04.asm
Normal file
29
exercises/exercise04.asm
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset: ; TODO:
|
||||||
|
cld
|
||||||
|
|
||||||
|
lda #100
|
||||||
|
|
||||||
|
clc
|
||||||
|
adc #5
|
||||||
|
|
||||||
|
sec
|
||||||
|
sbc #10 ; 95 5F BUT ITS 5E?
|
||||||
|
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
36
exercises/exercise05.asm
Normal file
36
exercises/exercise05.asm
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset: ; TODO:
|
||||||
|
cld
|
||||||
|
|
||||||
|
lda #$A
|
||||||
|
ldx #%1010
|
||||||
|
|
||||||
|
sta $80
|
||||||
|
stx $81
|
||||||
|
|
||||||
|
lda #10
|
||||||
|
clc
|
||||||
|
adc $80
|
||||||
|
adc $81
|
||||||
|
|
||||||
|
sta $82
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
37
exercises/exercise06.asm
Normal file
37
exercises/exercise06.asm
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset: ; TODO:
|
||||||
|
cld
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
ldx #2
|
||||||
|
ldy #3
|
||||||
|
inx
|
||||||
|
iny
|
||||||
|
|
||||||
|
clc
|
||||||
|
adc #1
|
||||||
|
|
||||||
|
dex
|
||||||
|
dey
|
||||||
|
|
||||||
|
sec
|
||||||
|
sbc #1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
32
exercises/exercise07.asm
Normal file
32
exercises/exercise07.asm
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset:
|
||||||
|
cld
|
||||||
|
lda #10
|
||||||
|
sta $80
|
||||||
|
|
||||||
|
inc $80
|
||||||
|
dec $80
|
||||||
|
|
||||||
|
jmp Reset
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;.org $FFFC
|
||||||
|
;.word Start
|
||||||
|
;.word Start
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
32
exercises/exercise08.asm
Normal file
32
exercises/exercise08.asm
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset:
|
||||||
|
ldy #10
|
||||||
|
|
||||||
|
Loop:
|
||||||
|
tya
|
||||||
|
sta $80,Y
|
||||||
|
dey
|
||||||
|
bpl Loop
|
||||||
|
|
||||||
|
jmp Reset
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
31
exercises/exercise09.asm
Normal file
31
exercises/exercise09.asm
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
.segment "HEADER" ; Don’t forget to always add the iNES header to your ROM files
|
||||||
|
.org $7FF0
|
||||||
|
.byte $4E,$45,$53,$1A,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
.segment "CODE" ; Define a segment called "CODE" for the PRG-ROM at $8000
|
||||||
|
.org $8000
|
||||||
|
|
||||||
|
Reset:
|
||||||
|
|
||||||
|
ldy #1
|
||||||
|
|
||||||
|
Loop:
|
||||||
|
clc
|
||||||
|
adc #1
|
||||||
|
cmp #10
|
||||||
|
bne Loop
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
NMI: ; NMI handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
IRQ: ; IRQ handler
|
||||||
|
rti ; doesn't do anything
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.segment "VECTORS" ; Add addresses with vectors at $FFFA
|
||||||
|
.org $FFFA
|
||||||
|
.word NMI ; Put 2 bytes with the NMI address at memory position $FFFA
|
||||||
|
.word Reset ; Put 2 bytes with the break address at memory position $FFFC
|
||||||
|
.word IRQ ; Put 2 bytes with the IRQ address at memory position $FFFE
|
16
exercises/nes.cfg
Normal file
16
exercises/nes.cfg
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
MEMORY {
|
||||||
|
ZP: start = $0000, size = $0100, type = rw, file = "";
|
||||||
|
OAM: start = $0200, size = $0100, type = rw, file = "";
|
||||||
|
RAM: start = $0300, size = $0500, type = rw, file = "";
|
||||||
|
HDR: start = $7FF0, size = $0010, type = ro, file = %O, fill = yes, fillval = $00;
|
||||||
|
PRG: start = $8000, size = $8000, type = ro, file = %O, fill = yes, fillval = $00;
|
||||||
|
CHR: start = $0000, size = $2000, type = ro, file = %O, fill = yes, fillval = $00;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEGMENTS {
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
HEADER: load = HDR, type = ro;
|
||||||
|
CODE: load = PRG, type = ro, start = $8000;
|
||||||
|
CHARS: load = CHR, type = ro, optional = yes;
|
||||||
|
VECTORS: load = PRG, type = ro, start = $FFFA;
|
||||||
|
}
|
16
nes.cfg
Normal file
16
nes.cfg
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
MEMORY {
|
||||||
|
ZP: start = $0000, size = $0100, type = rw, file = "";
|
||||||
|
OAM: start = $0200, size = $0100, type = rw, file = "";
|
||||||
|
RAM: start = $0300, size = $0500, type = rw, file = "";
|
||||||
|
HDR: start = $7FF0, size = $0010, type = ro, file = %O, fill = yes, fillval = $00;
|
||||||
|
PRG: start = $8000, size = $8000, type = ro, file = %O, fill = yes, fillval = $00;
|
||||||
|
CHR: start = $0000, size = $2000, type = ro, file = %O, fill = yes, fillval = $00;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEGMENTS {
|
||||||
|
ZEROPAGE: load = ZP, type = zp;
|
||||||
|
HEADER: load = HDR, type = ro;
|
||||||
|
CODE: load = PRG, type = ro, start = $8000;
|
||||||
|
CHARS: load = CHR, type = ro, optional = yes;
|
||||||
|
VECTORS: load = PRG, type = ro, start = $FFFA;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user