Files
alttpr-baserom/shopkeeper.asm
2018-01-20 00:15:04 -05:00

356 lines
11 KiB
NASM

;================================================================================
; Randomize 300 Rupee NPC
;--------------------------------------------------------------------------------
Set300RupeeNPCItem:
INC $0D80, X ; thing we wrote over
PHA : PHP
REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way
CMP.w #291 : BNE +
LDA RupeeNPC_MoldormCave : TAY ; load moldorm cave value into Y
BRA .done
+ CMP.w #286 : BNE +
LDA RupeeNPC_NortheastDarkSwampCave : TAY ; load northeast dark swamp cave value into Y
BRA .done
+
LDY.b #$46 ; default to a normal 300 rupees
.done
PLP : PLA
RTL
;--------------------------------------------------------------------------------
; 291 - Moldorm Cave
; 286 - Northeast Dark Swamp Cave
;--------------------------------------------------------------------------------
!BIGRAM = "$7EC900";
;--------------------------------------------------------------------------------
!SPRITE_OAM = "$7EC025"
; A = Tile ID
macro UploadOAM(dest)
PHA : PHP
PHA
REP #$20 ; set 16-bit accumulator
LDA.w #$0000 : STA.l !SPRITE_OAM
STA.l !SPRITE_OAM+2
LDA.w #$0200 : STA.l !SPRITE_OAM+6
SEP #$20 ; set 8-bit accumulator
LDA.b <dest> : STA.l !SPRITE_OAM+4
LDA $01,s
JSL.l GetSpritePalette
STA !SPRITE_OAM+5 : STA !SPRITE_OAM+13
PLA
JSL.l IsNarrowSprite : BCS .narrow
BRA .done
.narrow
REP #$20 ; set 16-bit accumulator
LDA.w #$0000 : STA.l !SPRITE_OAM+7
STA.l !SPRITE_OAM+14
LDA.w #$0800 : STA.l !SPRITE_OAM+9
LDA.w #$3400 : STA.l !SPRITE_OAM+11
.done
PLP : PLA
endmacro
;--------------------------------------------------------------------------------
; $0A : Digit Offset
; $0C-$0D : Value to Display
; $0E-$0F : Base Coordinate
;--------------------------------------------------------------------------------
macro DrawDigit(value,offset)
STZ $0A ; clear digit buffer
LDA $0C ; load value
--
CMP.w <value> : !BLT ++
!SUB.w <value>
INC $0A
BRA --
++
STA $0C ; save value
CPY.b #$FF : BNE +
LDY.b <offset>
LDA $0E : !ADD.w .digit_offsets, Y : STA $0E
+
LDA $0E : STA !BIGRAM, X : INX : INX
LDA.w #56 : STA !BIGRAM, X : INX : INX
LDY $0A : TYA : ASL : TAY : LDA .digit_properties, Y : STA !BIGRAM, X : INX : INX
LDA.w #$0000 : STA !BIGRAM, X : INX : INX
LDA $0E : !ADD.w #$0008 : STA $0E ; move offset 8px right
endmacro
;--------------------------------------------------------------------------------
!COLUMN_LOW = "$7F5020"
!COLUMN_HIGH = "$7F5021"
DrawPrice:
PHX : PHY : PHP
LDY.b #$FF
LDX #$00 ; clear bigram pointer
LDA $0C : CMP.w #1000 : !BLT + : BRL .len4 : +
CMP.w #100 : !BLT + : BRL .len3 : +
CMP.w #10 : !BLT + : BRL .len2 : +
CMP.w #1 : !BLT + : BRL .len1 : +
.len4
%DrawDigit(#1000,#6)
.len3
%DrawDigit(#100,#4)
.len2
%DrawDigit(#10,#2)
.len1
%DrawDigit(#1,#0)
SEP #$20 ; set 8-bit accumulator
TXA : LSR #3 : STA $06 ; request 1-4 OAM slots
;ASL #2 : JSL.l OAM_AllocateFromRegionB ; request 4-16 bytes
ASL #2
PHA
LDA $22 : CMP !COLUMN_LOW : !BLT .off
CMP !COLUMN_HIGH : !BGE .off
.on
PLA : JSL.l OAM_AllocateFromRegionB : BRA + ; request 4-16 bytes
.off
PLA : JSL.l OAM_AllocateFromRegionA ; request 4-16 bytes
+
TXA : LSR #3
PLP : PLY : PLX
RTS
;--------------------------------------------------------------------------------
.digit_properties
dw $0230, $0231, $0202, $0203, $0212, $0213, $0222, $0223, $0232, $0233
;--------------------------------------------------------------------------------
.digit_offsets
dw 4, 0, -4, -8
;--------------------------------------------------------------------------------
!TILE_UPLOAD_OFFSET_OVERRIDE = "$7F5042"
!FREE_TILE_BUFFER = "#$1180"
SpritePrep_ShopKeeper:
REP #$20 ; set 16-bit accumulator
LDA.w !FREE_TILE_BUFFER : STA !TILE_UPLOAD_OFFSET_OVERRIDE
SEP #$20 ; set 8-bit accumulator
LDA.b #$32 ; item
JSL.l GetSpriteID ; convert loot id to sprite id
JSL.l GetAnimatedSpriteTile_variable
REP #$20 ; set 16-bit accumulator
LDA.w !FREE_TILE_BUFFER+$80 : STA !TILE_UPLOAD_OFFSET_OVERRIDE
SEP #$20 ; set 8-bit accumulator
LDA.b #$51 ; item
JSL.l GetSpriteID ; convert loot id to sprite id
JSL.l GetAnimatedSpriteTile_variable
REP #$20 ; set 16-bit accumulator
LDA.w !FREE_TILE_BUFFER+$100 : STA !TILE_UPLOAD_OFFSET_OVERRIDE
SEP #$20 ; set 8-bit accumulator
LDA.b #$6C ; item
JSL.l GetSpriteID ; convert loot id to sprite id
JSL.l GetAnimatedSpriteTile_variable
STA $FFFFFF
LDA #$80 : STA $2100
JSR UploadVRAMTiles
LDA #$0F : STA $2100
RTL
;--------------------------------------------------------------------------------
UploadVRAMTiles:
LDA $4300 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters
;--------------------------------------------------------------------------------
LDA #$01 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode
LDA #$18 : STA $4301 ; set bus B destination to VRAM register
LDA #$80 : STA $2115 ; set VRAM to increment by 2 on high register write
LDA #$80 : STA $4302 ; set bus A source address to tile buffer
LDA #$A1 : STA $4303
LDA #$7E : STA $4304
LDA #$40 : STA $4305 : STZ $4306 ; set transfer size to 0x40
STZ $2116 ; set WRAM register source address
LDA #$5C : STA $2117
LDA #$01 : STA $420B ; begin DMA transfer
LDA #$40 : STA $4305 : STZ $4306 ; set transfer size to 0x40
STZ $2116 ; set WRAM register source address
LDA #$5D : STA $2117
LDA #$01 : STA $420B ; begin DMA transfer
LDA #$40 : STA $4305 : STZ $4306 ; set transfer size to 0x40
LDA #$20 : STA $2116 ; set WRAM register source address
LDA #$5C : STA $2117
LDA #$01 : STA $420B ; begin DMA transfer
LDA #$40 : STA $4305 : STZ $4306 ; set transfer size to 0x40
LDA #$20 : STA $2116 ; set WRAM register source address
LDA #$5D : STA $2117
LDA #$01 : STA $420B ; begin DMA transfer
LDA #$40 : STA $4305 : STZ $4306 ; set transfer size to 0x40
LDA #$40 : STA $2116 ; set WRAM register source address
LDA #$5C : STA $2117
LDA #$01 : STA $420B ; begin DMA transfer
LDA #$40 : STA $4305 : STZ $4306 ; set transfer size to 0x40
LDA #$40 : STA $2116 ; set WRAM register source address
LDA #$5D : STA $2117
LDA #$01 : STA $420B ; begin DMA transfer
;--------------------------------------------------------------------------------
PLA : STA $4306 ; restore DMA parameters
PLA : STA $4305 ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters
RTS
;--------------------------------------------------------------------------------
!COLUMN_LOW = "$7F5020"
!COLUMN_HIGH = "$7F5021"
Sprite_ShopKeeper:
PHB : PHK : PLB
JSL.l Sprite_PlayerCantPassThrough
; Draw Shopkeeper
LDA.b #$02 : STA $06 ; request 2 OAM slots
LDA #$08 : JSL.l OAM_AllocateFromRegionA ; request 8 bytes
LDA.b #$02 : STA $06 ; request 2 OAM slots
STZ $07
LDA $1A : AND #$10 : BEQ +
LDA.b #.oam_shopkeeper_f1 : STA $08
LDA.b #.oam_shopkeeper_f1>>8 : STA $09
BRA ++
+
LDA.b #.oam_shopkeeper_f2 : STA $08
LDA.b #.oam_shopkeeper_f2>>8 : STA $09
++
;LDA.b #$01 : STA.l !SKIP_EOR
JSL.l Sprite_DrawMultiple_quantity_preset
LDA $90 : !ADD.b #$04*2 : STA $90 ; increment oam pointer
LDA $92 : INC #2 : STA $92
; Draw Items
LDA.b #$03 : STA $06 ; request 3 OAM slots
LDA $20 : CMP.b #$60 : !BGE .below
.above
LDA #$0C : JSL.l OAM_AllocateFromRegionA : BRA + ; request 12 bytes
.below
LDA #$0C : JSL.l OAM_AllocateFromRegionB ; request 12 bytes
+
LDA.b #$03 : STA $06 ; request 3 OAM slots
STZ $07
LDA.b #.oam_items : STA $08
LDA.b #.oam_items>>8 : STA $09
JSL.l Sprite_DrawMultiple_quantity_preset
LDA $90 : !ADD.b #$04*3 : STA $90 ; increment oam pointer
LDA $92 : INC #3 : STA $92
LDA.b #$00 : STA.l !SKIP_EOR
; $22
; 0x48 - Left
; 0x60 - Midpoint 1
; 0x78 - Center
; 0x90 - Midpoint 2
; 0xA8 - Right
LDA.b #$00 : STA !COLUMN_LOW
LDA.b #$60 : STA !COLUMN_HIGH
REP #$20 ; set 16-bit accumulator
LDA.w #80 : STA $0C ; set value
LDA.w #-40 : STA $0E ; set coordinate
JSR.w DrawPrice
SEP #$20 : STA $06 ; set 8-bit accumulator & store result
PHA
STZ $07
LDA.b #!BIGRAM : STA $08
LDA.b #!BIGRAM>>8 : STA $09
LDA.b #$7E : PHA : PLB ; set data bank to $7E
JSL.l Sprite_DrawMultiple_quantity_preset
PHK : PLB
LDA 1,s
ASL #2 : !ADD $90 : STA $90 ; increment oam pointer
PLA
!ADD $92 : STA $92
LDA.b #$60 : STA !COLUMN_LOW
LDA.b #$90 : STA !COLUMN_HIGH
REP #$20 ; set 16-bit accumulator
LDA.w #100 : STA $0C ; set value
LDA.w #8 : STA $0E ; set coordinate
JSR.w DrawPrice
SEP #$20 : STA $06 ; set 8-bit accumulator & store result
PHA
STZ $07
LDA.b #!BIGRAM : STA $08
LDA.b #!BIGRAM>>8 : STA $09
LDA.b #$7E : PHA : PLB ; set data bank to $7E
JSL.l Sprite_DrawMultiple_quantity_preset
PHK : PLB
LDA 1,s
ASL #2 : !ADD $90 : STA $90 ; increment oam pointer
PLA
!ADD $92 : STA $92
LDA.b #$90 : STA !COLUMN_LOW
LDA.b #$FF : STA !COLUMN_HIGH
REP #$20 ; set 16-bit accumulator
LDA.w #300 : STA $0C ; set value
LDA.w #56 : STA $0E ; set coordinate
JSR.w DrawPrice
SEP #$20 : STA $06 ; set 8-bit accumulator & store result
PHA
STZ $07
LDA.b #!BIGRAM : STA $08
LDA.b #!BIGRAM>>8 : STA $09
LDA.b #$7E : PHA : PLB ; set data bank to $7E
JSL.l Sprite_DrawMultiple_quantity_preset
PHK : PLB
LDA 1,s
ASL #2 : !ADD $90 : STA $90 ; increment oam pointer
PLA
!ADD $92 : STA $92
PLB
RTL
;--------------------------------------------------------------------------------
.oam_shopkeeper_f1
dw 0, -8 : db $00, $0C, $00, $02
dw 0, 0 : db $10, $0C, $00, $02
.oam_shopkeeper_f2
dw 0, -8 : db $00, $0C, $00, $02
dw 0, 0 : db $10, $4C, $00, $02
;--------------------------------------------------------------------------------
.oam_items
dw -40, 40 : db $C0, $08, $00, $02
dw 8, 40 : db $C2, $08, $00, $02
dw 56, 40 : db $C4, $08, $00, $02
;--------------------------------------------------------------------------------
.oam_prices
dw -48, 56 : db $30, $02, $00, $00
dw -40, 56 : db $31, $02, $00, $00
dw -32, 56 : db $02, $02, $00, $00
dw -24, 56 : db $03, $02, $00, $00
dw 0, 56 : db $12, $02, $00, $00
dw 8, 56 : db $13, $02, $00, $00
dw 16, 56 : db $22, $02, $00, $00
dw 24, 56 : db $23, $02, $00, $00
dw 48, 56 : db $32, $02, $00, $00
dw 56, 56 : db $33, $02, $00, $00
dw 64, 56 : db $30, $02, $00, $00
dw 72, 56 : db $31, $02, $00, $00
;--------------------------------------------------------------------------------