Milestone 3 : Refined the CopyMarioToORAM routine and moved it inside of the NMI, now it works as designed. Also refactored the 'actor' data that drives the function; See sprMario, sprMario_x, sprMario_y. Now to draw a character all I need is this routine, and 3 arrays; one with tile indexes, and one each of x and y offsets for each of those tiles. Then I can draw the entire thing in the right way given an X,Y starting point.
This commit is contained in:
6
defines.S
Normal file
6
defines.S
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
playerx=$0010
|
||||||
|
playery=$0011
|
||||||
|
curSpriteAttrOffset=$0012
|
||||||
|
curSpriteTileOffset=$0013
|
||||||
|
curSpriteXOffset=$0014
|
||||||
|
curSpriteYOffset=$0015
|
||||||
107
nesgame.S
107
nesgame.S
@@ -8,6 +8,8 @@
|
|||||||
.inesmap 0 ;; use mapper 0; NROM, no bank swapping
|
.inesmap 0 ;; use mapper 0; NROM, no bank swapping
|
||||||
.inesmir 1 ;; background mirroring (we don't care for now)
|
.inesmir 1 ;; background mirroring (we don't care for now)
|
||||||
|
|
||||||
|
.include "defines.S"
|
||||||
|
|
||||||
;; For NESASM, we need to tell it where each bank begins.
|
;; For NESASM, we need to tell it where each bank begins.
|
||||||
|
|
||||||
.bank 0
|
.bank 0
|
||||||
@@ -166,38 +168,58 @@ _MAIN_LoadPaletteLoop:
|
|||||||
LDA #%00010000 ;; turn on sprites, no more background color
|
LDA #%00010000 ;; turn on sprites, no more background color
|
||||||
STA $2001 ;; Write to PPU Control Register 2
|
STA $2001 ;; Write to PPU Control Register 2
|
||||||
LDX #$0
|
LDX #$0
|
||||||
_MAIN_CopyMarioToOAM:
|
|
||||||
LDA sprMario, x
|
LDA #$80
|
||||||
STA $0200, x
|
STA playerx
|
||||||
INX
|
STA playery
|
||||||
CPX #$20
|
LDA #$0
|
||||||
BNE _MAIN_CopyMarioToOAM
|
STA curSpriteAttrOffset
|
||||||
LDX #$0
|
STA curSpriteTileOffset
|
||||||
_MAIN_MoveMarioToPlayer_x:
|
STA curSpriteXOffset
|
||||||
LDA playerx
|
STA curSpriteYOffset
|
||||||
ADC $0203, x
|
|
||||||
STA $0203, x
|
|
||||||
INX
|
|
||||||
INX
|
|
||||||
INX
|
|
||||||
INX
|
|
||||||
CPX #$20
|
|
||||||
BNE _MAIN_MoveMarioToPlayer_x
|
|
||||||
LDX #$0
|
|
||||||
_MAIN_MoveMarioToPlayer_y:
|
|
||||||
LDA playery
|
|
||||||
ADC $0200, x
|
|
||||||
STA $0200, x
|
|
||||||
INX
|
|
||||||
INX
|
|
||||||
INX
|
|
||||||
INX
|
|
||||||
CPX #$20
|
|
||||||
BNE _MAIN_MoveMarioToPlayer_y
|
|
||||||
_MAIN_loop:
|
_MAIN_loop:
|
||||||
JMP _MAIN_loop ;; Loop forever
|
JMP _MAIN_loop ;; Loop forever
|
||||||
|
|
||||||
NMI:
|
NMI:
|
||||||
|
LDX #$0
|
||||||
|
_NMI_CopyMarioToOAM:
|
||||||
|
LDA playery
|
||||||
|
LDY curSpriteYOffset
|
||||||
|
CLC
|
||||||
|
ADC sprMario_off_y, x
|
||||||
|
STA $0200, y
|
||||||
|
LDA #$4
|
||||||
|
ADC curSpriteYOffset
|
||||||
|
STA curSpriteYOffset
|
||||||
|
|
||||||
|
LDY curSpriteTileOffset
|
||||||
|
LDA sprMario, x
|
||||||
|
STA $0201, y
|
||||||
|
LDA #$4
|
||||||
|
CLC
|
||||||
|
ADC curSpriteTileOffset
|
||||||
|
STA curSpriteTileOffset
|
||||||
|
|
||||||
|
LDA #$00
|
||||||
|
LDY curSpriteAttrOffset
|
||||||
|
STA $0202, y
|
||||||
|
LDA #$4
|
||||||
|
CLC
|
||||||
|
ADC curSpriteAttrOffset
|
||||||
|
STA curSpriteAttrOffset
|
||||||
|
|
||||||
|
LDA playerx
|
||||||
|
LDY curSpriteXOffset
|
||||||
|
ADC sprMario_off_x, x
|
||||||
|
STA $0203, y
|
||||||
|
LDA #$4
|
||||||
|
CLC
|
||||||
|
ADC curSpriteXOffset
|
||||||
|
STA curSpriteXOffset
|
||||||
|
|
||||||
|
INX
|
||||||
|
CPX #08
|
||||||
|
BNE _MAIN_CopyMarioToOAM
|
||||||
;; We need to copy all our OAM data to put sprites on screen during
|
;; We need to copy all our OAM data to put sprites on screen during
|
||||||
;; vblank. $2003 is the PPU OAM address, so we're going to tell it
|
;; vblank. $2003 is the PPU OAM address, so we're going to tell it
|
||||||
;; to pull OAM from $0200, and do a DMA transfer.
|
;; to pull OAM from $0200, and do a DMA transfer.
|
||||||
@@ -221,31 +243,12 @@ NMI:
|
|||||||
palette:
|
palette:
|
||||||
.db $0F,$31,$32,$33,$0F,$35,$36,$37,$0F,$39,$3A,$3B,$0F,$3D,$3E,$0F
|
.db $0F,$31,$32,$33,$0F,$35,$36,$37,$0F,$39,$3A,$3B,$0F,$3D,$3E,$0F
|
||||||
.db $0F,$1C,$15,$14,$0F,$02,$38,$3C,$0F,$1C,$15,$14,$0F,$02,$38,$3C
|
.db $0F,$1C,$15,$14,$0F,$02,$38,$3C,$0F,$1C,$15,$14,$0F,$02,$38,$3C
|
||||||
playerx:
|
|
||||||
.db $08
|
|
||||||
playery:
|
|
||||||
.db $08
|
|
||||||
curSprIndex:
|
|
||||||
.db $00
|
|
||||||
;; I put the OAM copy here instead of $0200 because I want to
|
|
||||||
;; allow me to initialize some basic sprite organizations (such as
|
|
||||||
;; mario standing) without having to do a bunch of pokes into my
|
|
||||||
;; OAM copy, because the only thing that ever actually changes is
|
|
||||||
;; the X and Y position. But I couldn't get the NMI copying to work
|
|
||||||
;; correctly when trying to set a bank to .org at $0200; I'm probably
|
|
||||||
;; just doing it wrong, but for now this works.
|
|
||||||
sprMario:
|
sprMario:
|
||||||
;; each 4-byte pair goes directly into the OAM
|
.db $00,$01,$02,$03,$04,$05,$06,$07
|
||||||
.db $00,$00,$00 ; mario top left Y,tile,attrs
|
sprMario_off_x:
|
||||||
sprMario_x:
|
.db $00,$08,$00,$08,$00,$08,$00,$08
|
||||||
.db $00 ; mario top left X
|
sprMario_off_y:
|
||||||
.db $00,$01,$00,$08 ; mario top right
|
.db $00,$00,$08,$08,$10,$10,$18,$18
|
||||||
.db $08,$02,$00,$00 ; mario middle left
|
|
||||||
.db $08,$03,$00,$08 ; mario middle right
|
|
||||||
.db $10,$04,$00,$00 ; mario middle bottom left
|
|
||||||
.db $10,$05,$00,$08 ; mario middle bottom right
|
|
||||||
.db $18,$06,$00,$00 ; mario bottom left
|
|
||||||
.db $18,$07,$00,$08 ; mario bottom right
|
|
||||||
|
|
||||||
.bank 1
|
.bank 1
|
||||||
.org $FFFA
|
.org $FFFA
|
||||||
|
|||||||
Reference in New Issue
Block a user