This repository has been archived on 2026-05-18. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
nesgame/include/graphics.S

141 lines
3.5 KiB
ArmAsm

.require "defines.S"
;; Function : paletteLoad
;;
;; Given the address of a palette in ROM or RAM, and the
;; index of which palette to load (0=3F00, 1=3F10), load a
;; palette into the PPU
;;
;; arguments are on the stack (in push order):
;; - 00 or 10, lyte byte of PPU palette address to load
;; - Low byte of palette address
;; - High byte of palette address
paletteLoad:
.invoke storeStackReturn
PLA
STA curPaletteHi
PLA
STA curPaletteLo
LDA $2002 ; The PPU Memory address at $2006 expects
; the high byte of the palette address first,
; then the low byte, but we can't know
; which one it's expecting right now, so we
; read the PPU status at $2002 to reset the
; high/low latch on $2006.
LDA #$3F ; palettes live at $3F00 and $3F10
STA $2006
PLA
STA $2006
LDX #$00
_loop:
LDA (curPaletteLo), y ; Loop over each index of the byte array at
STA $2007 ; 'palette', store each one into the accumulator
INY ; and then store the accumulator into the PPU
CPY #$20 ; .. compare X to 20 (size of 'palette'), and
BNE _loop ; loop as long as the Zero flag isn't set (NE)
.invoke restoreStackReturn
RTS
;; Function : backgroundLoad
;;
;; Given the address of a set of background tiles, and the
;; address of their attribute data, load the background into the PPU
;;
;; arguments on the stack (in push order):
;; - Length of background attribute data
;; - Hi byte of background attribute data address
;; - Lo byte of background attribute data address
;; - Length of background data
;; - Hi byte of background data address
;; - Lo byte of background data address
backgroundLoad:
.invoke storeStackReturn
PLA
STA curBackgroundLo
PLA
STA curBackgroundHi
PLA
STA curBackgroundLen
PLA
STA curBackgroundAttrLo
PLA
STA curBackgroundAttrHi
PLA
STA curBackgroundAttrLen
LDA $2002 ; reset the PPU hi/low latch
LDA #$20
STA $2006 ; PPU address data is written high then low
LDA #$00
STA $2006
LDY #$00
_loadbgloop:
LDA (curBackgroundLo), y
STA $2007
INY
CPY curBackgroundLen
BNE _loadbgloop
LDA $2002 ; reset the PPU latch again
LDA #$23
STA $2006
LDA #$C0
STA $2006
LDY #$00
_loadattrloop:
LDA (curBackgroundAttrLo), y
STA $2007
INY
CPY curBackgroundAttrLen
BNE _loadattrloop
.invoke restoreStackReturn
RTS
;; Function : oamInsertMultiSprite
;;
;; Given the address of a multisprite, and its length (number of
;; subsprites), load the multisprite into the OAM memory at
;; index 0.
;;
;; Arguments on the stack:
;; - Length of multisprite
;; - High byte of multisprite's address
;; - Low byte of multisprite's address
;;
;; FIXME: Need to keep a list of all multisprites so I can append
;; new ones to the list, and remove dead ones; right now this all
;; presumes $0200 is the root for the multisprite, which will stop
;; being true once I have more than one.
oamInsertMultiSprite:
.invoke storeStackReturn
LDX #$0
LDY #$0
PLA
STA curSpriteLen
PLA
STA curSpriteDataHi
PLA
STA curSpriteDataLo
;; ----
_looptop:
LDA playery ; set Y position
CLC
ADC (curSpriteDataLo), y
STA (curSpriteOAMIndexLo), y
INY
LDA (curSpriteDataLo), y ; set tile number
STA (curSpriteOAMIndexLo), y
INY
LDA (curSpriteDataLo), y
STA (curSpriteOAMIndexLo), y
INY
LDA playerx ; set X position
CLC
ADC (curSpriteDataLo), y
STA (curSpriteOAMIndexLo), y
INY
INX ; increment the sprite counter
CPX curSpriteLen ; any more sprites in the current multisprite?
BNE _looptop
.invoke restoreStackReturn
RTS