From cc83fef9b00e32ff9e3912938ae57df928a7f892 Mon Sep 17 00:00:00 2001 From: cassidoxa Date: Sun, 13 Aug 2023 18:55:52 -0400 Subject: [PATCH] Shops VRAM transfer --- framehook.asm | 20 ++++++++++++++++++++ ram.asm | 8 +++++--- shopkeeper.asm | 28 +++++++++++++++++++--------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/framehook.asm b/framehook.asm index d889082..6f5b374 100644 --- a/framehook.asm +++ b/framehook.asm @@ -35,7 +35,27 @@ PostNMIHookAction: .return STZ.w NMIAux ; zero bank byte of NMI hook pointer + + JSR.w TransferItemGFX LDA.b INIDISPQ : STA.w INIDISP ; thing we wrote over, turn screen back on JML.l PostNMIHookReturn ;-------------------------------------------------------------------------------- +TransferItemGFX: +; Only used for shops now but could be used for anything. We should look at how door rando does this +; and try to unify one approach. + REP #$30 + LDX.w ItemQueuePtr : BEQ .done + - + LDA.w ItemGFXQueue,X : STA.w ItemGFXPtr + LDA.w ItemTargetQueue,X : STA.w ItemGFXTarget + PHX + JSL.l TransferItemToVRAM + REP #$10 + PLX + DEX #2 + BPL - + + STZ.w ItemQueuePtr + .done + SEP #$30 +RTS diff --git a/ram.asm b/ram.asm index 9000afc..3a09259 100644 --- a/ram.asm +++ b/ram.asm @@ -189,9 +189,11 @@ RaceGameFlag = $7E021B ; MessageJunk = $7E0223 ; Zeroed but never used (?) ; ShopPurchaseFlag = $7E0224 ; $01 = Shop purchase item receipt. -;CoolScratch = $7E0226 ; 0x5A bytes of free ram -SpriteID = $7E0230 ; 0x0A bytes - ; +;CoolScratch = $7E0224 ; 0x5C bytes of free ram +ItemQueuePtr = $7E0226 ; Pointer into Item GFX and VRAM target queues. Word length. +SpriteID = $7E0230 ; 0x0A bytes. Receipt ID for main loop sprite we're handling. +ItemGFXQueue = $7E0230 ; Pointers to decompressed item tiles deferred to NMI loading. $10 bytes +ItemTargetQueue = $7E0240 ; Pointers to VRAM targets for ItemGFXQueue. $10 bytes AncillaVelocityZ = $7E0294 ; 0x0A bytes AncillaZCoord = $7E029E ; 0x0A bytes ; diff --git a/shopkeeper.asm b/shopkeeper.asm index c85e873..b6cdd25 100644 --- a/shopkeeper.asm +++ b/shopkeeper.asm @@ -136,7 +136,7 @@ SpritePrep_ShopKeeper: TAY REP #$30 LDA.b 1,s : TAX : LDA.l .tile_offsets, X : TAX - JSR LoadTile + JSR.w SetupTileTransfer PLY : PLX INY #4 @@ -144,11 +144,13 @@ SpritePrep_ShopKeeper: INX #8 JMP - .stop + REP #$20 + LDA.w ItemQueuePtr + DEC #2 + AND.w #$00E + STA.w ItemQueuePtr + SEP #$20 - ;LDA.b #Shopkeeper_UploadVRAMTilesLong>>16 : STA.w NMIAux+2 - ;LDA.b #Shopkeeper_UploadVRAMTilesLong>>8 : STA.w NMIAux+1 - ;LDA.b #Shopkeeper_UploadVRAMTilesLong>>0 : STA.w NMIAux - .done LDA.l ShopType : BIT.b #$20 : BEQ .notTakeAll ; Take-all .takeAll @@ -188,7 +190,7 @@ dw $0100, $0000 ;-------------------------------------------------------------------------------- ; X - Tile Buffer Offset ; Y - Item ID -LoadTile: +SetupTileTransfer: LDA.l ShopType : BIT.w #$0010 : BNE .alt_vram TXA : LSR #2 CLC : ADC.w #!FREE_TILE @@ -197,10 +199,18 @@ LoadTile: TXA : LSR #2 CLC : ADC.w #!FREE_TILE_ALT .store_target - STA.w ItemGFXTarget + LDX.w ItemQueuePtr + STA.w ItemTargetQueue,X + TYA : ASL : TAX - LDA.l StandingItemGraphicsOffsets,X : STA.w ItemGFXPtr - JSL.l TransferItemToVRAM + LDA.l StandingItemGraphicsOffsets,X + LDX.w ItemQueuePtr + STA.w ItemGFXQueue,X + + TXA + INC #2 + AND.w #$000E + STA.w ItemQueuePtr TDC REP #$10 ; set 16-bit index registers SEP #$20