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:
2012-11-03 16:45:38 -04:00
parent 9b89a6788e
commit c5be4abf62
2 changed files with 61 additions and 52 deletions

6
defines.S Normal file
View File

@@ -0,0 +1,6 @@
playerx=$0010
playery=$0011
curSpriteAttrOffset=$0012
curSpriteTileOffset=$0013
curSpriteXOffset=$0014
curSpriteYOffset=$0015

107
nesgame.S
View File

@@ -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