ram.asm initial commit. Replaced all address defines with labels

Value defines styled without quotes, # moved to load/store/cmp site
Added registers.asm (copied from spannerisms JP disassembly)
Added a bunch of length annotations
Deleted old or trivial commented out code
Deleted: ganonfixes.asm, map.asm, seedtag.asm
Replaced obsolete credits.asm with creditsnew.asm
Moved scratch space at $7F5020-3F to mirrored WRAM (7E1E70-8F)
Moved clock RAM to mirrored WRAM (7E1E90-9F)
dialog.asm: FreeDungeonItemNotice preserves callee-preserved scratch RAM
Toast buffer moved to mirrored WRAM (7E1E0E-0F)
servicerequest.asm: long store to $012E converted to word length store
This commit is contained in:
cassidoxa
2022-11-05 00:50:25 -04:00
parent cafb0908a0
commit 43f753b517
72 changed files with 7706 additions and 7305 deletions

View File

@@ -6,7 +6,7 @@ lorom
!BGE = "BCS"
org $238000
incsrc stats/creditsnew.asm
incsrc stats/credits.asm
FontGfx:
if !FEATURE_NEW_TEXT
@@ -17,28 +17,27 @@ endif
FontGfxEnd:
; Custom addresses. Most are arbitrary. Feel free to make sure they're okay or moving them elsewhere within ZP
!CreditsPtr = $7C ; 3 bytes
!Temp = $B3 ; 2 bytes
!StatsBottom = $B5 ; 2 bytes
!StatsPtr = $B7 ; 3 bytes
!ValueLow = $BA ; 2 bytes
!ValueHigh = $BC ; 2 bytes
!Hours = $72 ; 2 bytes
!Minutes = $74 ; 2 bytes
!Seconds = $76 ; 2 bytes
!RemoveZero = $78 ; 2 bytes
CreditsPtr = $7C ; 3 bytes
Temp = $B3 ; 2 bytes
StatsBottom = $B5 ; 2 bytes
StatsPtr = $B7 ; 3 bytes
ValueLow = $BA ; 2 bytes
ValueHigh = $BC ; 2 bytes
Hours = $72 ; 2 bytes
Minutes = $74 ; 2 bytes
Seconds = $76 ; 2 bytes
RemoveZero = $78 ; 2 bytes
; Original addresses
!LineNumber = $CA ; 2 bytes
LineNumber = $CA ; 2 bytes
PreparePointer:
LDA.w #$2300
STA.b !CreditsPtr+1
STA.b CreditsPtr+1
LDA.w #CreditsLineTable
STA.b !CreditsPtr
LDA [!CreditsPtr],Y
STA.b !CreditsPtr
STA.b CreditsPtr
LDA.b [CreditsPtr],Y
STA.b CreditsPtr
LDY.w #$0000
RTL
@@ -84,30 +83,21 @@ BitMasks:
dw $3FFF
dw $7FFF
macro AddStat(address, type, shiftRight, bits, digits, xPos, lineNumber)
db <xPos><<2|<type><<9|<lineNumber>>>8
db <lineNumber>
db <bits><<4|<shiftRight>
db <digits><<5
db $00
dl <address>
endmacro
macro StripeStart(xPos, length)
LDA $C8
LDA.b $C8
CLC
ADC.w #<xPos>
XBA
STA $1002,x
STA.w $1002,x
LDA.w #<length>*2-1
XBA
LDA #$0500
STA $1004,x
LDA.w #$0500
STA.w $1004,x
endmacro
macro StripeTile()
STA $1006,x
STA.w $1006,x
INX
INX
endmacro
@@ -123,27 +113,27 @@ HexToDecStats:
PHA
PHA
LDA.w #$0000
STA $7F5003 : STA $7F5005 : STA $7F5006 ; clear digit storage
STA.l $7F5003 : STA.l $7F5005 : STA.l $7F5006 ; clear digit storage
PLA
-
CMP.w #10000 : !BLT +
PHA : SEP #$20 : LDA $7F5003 : INC : STA $7F5003 : REP #$20 : PLA
PHA : SEP #$20 : LDA.l $7F5003 : INC : STA.l $7F5003 : REP #$20 : PLA
!SUB.w #10000 : BRA -
+ -
CMP.w #1000 : !BLT +
PHA : SEP #$20 : LDA $7F5004 : INC : STA $7F5004 : REP #$20 : PLA
PHA : SEP #$20 : LDA.l $7F5004 : INC : STA.l $7F5004 : REP #$20 : PLA
!SUB.w #1000 : BRA -
+ -
CMP.w #100 : !BLT +
PHA : SEP #$20 : LDA $7F5005 : INC : STA $7F5005 : REP #$20 : PLA
PHA : SEP #$20 : LDA.l $7F5005 : INC : STA.l $7F5005 : REP #$20 : PLA
!SUB.w #100 : BRA -
+ -
CMP.w #10 : !BLT +
PHA : SEP #$20 : LDA $7F5006 : INC : STA $7F5006 : REP #$20 : PLA
PHA : SEP #$20 : LDA.l $7F5006 : INC : STA.l $7F5006 : REP #$20 : PLA
!SUB.w #10 : BRA -
+ -
CMP.w #1 : !BLT +
PHA : SEP #$20 : LDA $7F5007 : INC : STA $7F5007 : REP #$20 : PLA
PHA : SEP #$20 : LDA.l $7F5007 : INC : STA.l $7F5007 : REP #$20 : PLA
!SUB.w #1 : BRA -
+
PLA
@@ -151,13 +141,13 @@ RTL
LastHexDigit:
TYA
AND #$000F
AND.w #$000F
PHA
TYA
LSR #4
TAY
CLC
LDA !StatsBottom
LDA.b StatsBottom
BNE +
; Upper half
PLA
@@ -172,18 +162,18 @@ FindLine:
LDY.w #$0000
- LDA.w CreditsStats,y
STZ !StatsBottom
STZ.b StatsBottom
CMP #$FFFF
BEQ .noLine
XBA
AND #$01FF
CMP !LineNumber
AND.w #$01FF
CMP.b LineNumber
BEQ .lineFound
INC
INC !StatsBottom
CMP !LineNumber
INC.b StatsBottom
CMP.b LineNumber
BEQ .lineFound
INY #8
@@ -203,26 +193,26 @@ FindLine:
!MAX_FRAME_COUNT = 59*60+59*60+59*60+99
macro CountUnits(framesPerUnit, unitCounter)
STZ <unitCounter>
STZ.b <unitCounter>
?loop:
LDA !ValueLow
LDA.b ValueLow
SEC
SBC.w #<framesPerUnit>
STA !Temp
LDA !ValueHigh
STA.b Temp
LDA.b ValueHigh
SBC.w #<framesPerUnit>>>16
BCC ?end
STA !ValueHigh
LDA !Temp
STA !ValueLow
INC <unitCounter>
STA.b ValueHigh
LDA.b Temp
STA.b ValueLow
INC.b <unitCounter>
BRA ?loop
?end:
endmacro
!ColonOffset = $83
!PeriodOffset = $80
!BlankTile = #$883D
BlankTile = $883D
RenderCreditsStatCounter:
PHB
@@ -248,44 +238,44 @@ RenderCreditsStatCounter:
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND #$001F ; X XXXX
AND.w #$001F ; X XXXX
CLC
ADC $C8
ADC.w $C8
XBA
STA $1002,x
STA.w $1002,x
; == Write Stripe header (Length of data) ==
LDA.w #4*2-1 ; 4 tiles = 8 bytes
XBA
STA $1004,x
STA.w $1004,x
PHX
; == Load tile base (upper or lower half of white two-line zero) ==
LDA !StatsBottom
LDA.b StatsBottom
BNE +
LDA #$3D40
LDA.w #$3D40
BRA ++
+ LDA #$3D50
++ STA !Temp
+ LDA.w #$3D50
++ STA.b Temp
; == Load the actual stat word ==
LDA.w CreditsStats+5,y
STA.b !StatsPtr
STA.b StatsPtr
LDA.w CreditsStats+6,y
STA.b !StatsPtr+1
LDA.b [!StatsPtr]
STA !ValueLow
STA.b StatsPtr+1
LDA.b [StatsPtr]
STA.b ValueLow
; == Shift value ==
LDA.w CreditsStats+2,y; CCC- ---- BBBB SSSS
AND.w #$000F ; SSSS
BEQ +
TAX
LDA !ValueLow
LDA.b ValueLow
- LSR
DEX
BNE -
STA !ValueLow
STA.b ValueLow
+
; == Mask value ==
LDA.w CreditsStats+2,y; CCC- ---- BBBB SSSS
@@ -295,8 +285,8 @@ RenderCreditsStatCounter:
AND.w #$001E
TAX
LDA.l BitMasks,x
AND !ValueLow
STA !ValueLow
AND.b ValueLow
STA.b ValueLow
; == Cap value ==
LDA.w CreditsStats+3,y; ---- ---- CCC- ----
@@ -305,60 +295,58 @@ RenderCreditsStatCounter:
BEQ +
ASL : TAX
LDA.l ValueCaps,x
CMP !ValueLow
CMP.b ValueLow
!BGE +
STA !ValueLow
STA.b ValueLow
+
; == Display value ==
LDA !ValueLow
LDA.b ValueLow
JSL HexToDecStats
PLX
STZ !RemoveZero
STZ.b RemoveZero
LDA $7F5004
AND #$00FF
CMP !RemoveZero
LDA.l $7F5004
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA !BlankTile
LDA.w #BlankTile
BRA ++
+ DEC !RemoveZero
+ DEC.b RemoveZero
CLC
ADC !Temp
ADC.b Temp
++ %StripeTile()
LDA $7F5005
LDA.l $7F5005
AND #$00FF
CMP !RemoveZero
CMP.b RemoveZero
BNE +
LDA !BlankTile
LDA.w #BlankTile
BRA ++
+ DEC !RemoveZero
+ DEC.b RemoveZero
CLC
ADC !Temp
ADC.b Temp
++ %StripeTile()
LDA $7F5006
AND #$00FF
CMP !RemoveZero
LDA.l $7F5006
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA !BlankTile
LDA.w #BlankTile
BRA ++
+ DEC !RemoveZero
+ DEC.b RemoveZero
CLC
ADC !Temp
ADC.b Temp
++ %StripeTile()
LDA $7F5007
AND #$00FF
LDA.l $7F5007
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
%StripeEnd()
.endStats
;JSR RenderLineNumber
PLB
RTL
@@ -368,131 +356,131 @@ RenderCreditsStatCounter:
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND #$001F ; X XXXX
AND.w #$001F ; X XXXX
CLC
ADC $C8
ADC.b $C8
XBA
STA $1002,x
STA.w $1002,x
; == Write Stripe header (Length of data) ==
LDA.w #11*2-1 ; 11 tiles = 22 bytes
XBA
STA $1004,x
STA.w $1004,x
PHX
; == Load the actual stat words ==
LDA.w CreditsStats+5,y
STA.b !StatsPtr
STA.b StatsPtr
LDA.w CreditsStats+6,y
STA.b !StatsPtr+1
LDA.b [!StatsPtr]
STA !ValueLow
INC !StatsPtr
INC !StatsPtr
LDA.b [!StatsPtr]
STA !ValueHigh
STA.b StatsPtr+1
LDA.b [StatsPtr]
STA.b ValueLow
INC.b StatsPtr
INC.b StatsPtr
LDA.b [StatsPtr]
STA.b ValueHigh
CMP.w #!MAX_FRAME_COUNT>>16+1
!BGE ++
; == Convert total frames into hours, minutes, seconds and frames ==
%CountUnits(!FRAMES_PER_HOUR, !Hours)
%CountUnits(!FRAMES_PER_MINUTE, !Minutes)
%CountUnits(!FRAMES_PER_SECOND, !Seconds)
%CountUnits(!FRAMES_PER_HOUR, Hours)
%CountUnits(!FRAMES_PER_MINUTE, Minutes)
%CountUnits(!FRAMES_PER_SECOND, Seconds)
; == Cap at 99:59:59.59 ==
LDA !Hours
LDA.b Hours
CMP.w #100
!BLT +
++ LDA.w #99
STA !Hours
STA.b Hours
LDA.w #59
STA !Minutes
STA !Seconds
STA !ValueLow
STA.b Minutes
STA.b Seconds
STA.b ValueLow
+
; == Load tile base (upper or lower half of white two-line zero) ==
LDA !StatsBottom
LDA.b StatsBottom
BNE +
LDA #$3D40
LDA.w #$3D40
BRA ++
+ LDA #$3D50
++ STA !Temp
+ LDA.w #$3D50
++ STA.b Temp
PLX
; == Display value ==
LDA !Hours
LDA.b Hours
JSL HexToDecStats
LDA $7F5006
AND #$00FF
LDA.l $7F5006
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA $7F5007
AND #$00FF
LDA.l $7F5007
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA !Minutes
LDA.b Minutes
JSL HexToDecStats
LDA $7F5006
AND #$00FF
LDA.l $7F5006
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA $7F5007
AND #$00FF
LDA.l $7F5007
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA !Seconds
LDA.b Seconds
JSL HexToDecStats
LDA $7F5006
AND #$00FF
LDA.l $7F5006
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA $7F5007
AND #$00FF
LDA.l $7F5007
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA.w #!PeriodOffset
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA !ValueLow
LDA.b ValueLow
JSL HexToDecStats
LDA $7F5006
AND #$00FF
LDA.l $7F5006
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
LDA $7F5007
AND #$00FF
LDA.l $7F5007
AND.w #$00FF
CLC
ADC !Temp
ADC.b Temp
%StripeTile()
%StripeEnd()
@@ -502,13 +490,13 @@ RenderCreditsStatCounter:
RenderLineNumber:
%StripeStart(0, 3)
STZ !StatsBottom
LDA $CA
STZ.b StatsBottom
LDA.b $CA
TAY
AND #$0001
AND.w #$0001
BEQ +
DEY
INC !StatsBottom
INC.b StatsBottom
+
JSR LastHexDigit
PHA
@@ -530,21 +518,21 @@ LoadModifiedFont:
; copies font graphics to VRAM (for BG3)
; set name base table to vram $4000 (word)
LDA.b #$02 : STA $2101
LDA.b #$02 : STA.w OBSEL
; increment on writes to $2119
LDA.b #$80 : STA $2115
LDA.b #$80 : STA.w VMAIN
; set bank of the source address (see below)
LDA.b #FontGfx>>16 : STA $02
LDA.b #FontGfx>>16 : STA.b Scrap02
REP #$30
; vram target address is $7000 (word)
LDA.w #$7000 : STA $2116
LDA.w #$7000 : STA.w VMADDL
; $00[3] = $0E8000 (offset for the font data)
LDA.w #FontGfx : STA $00
LDA.w #FontGfx : STA.b Scrap00
; going to write 0x1000 bytes (0x800 words)
LDX.w #FontGfxEnd-FontGfx/2-1
@@ -552,10 +540,10 @@ LoadModifiedFont:
.nextWord
; read a word from the font data
LDA [$00] : STA $2118
LDA.b [$00] : STA.w VMDATAL
; increment source address by 2
INC $00 : INC $00
INC.b Scrap00 : INC.b Scrap00
DEX : BPL .nextWord
@@ -569,18 +557,18 @@ LoadFullItemTilesCredits:
; copies font graphics to VRAM (for BG3)
; increment on writes to $2119
LDA.b #$80 : STA $2115
LDA.b #$80 : STA.w VMAIN
; set bank of the source address (see below)
LDA.b #FileSelectNewGraphics>>16 : STA $02
LDA.b #FileSelectNewGraphics>>16 : STA.b Scrap02
REP #$30
; vram target address is $8000 (word) (Wraps to start of VRAM on normal SNES, but using the correct address so it works on extended VRAM machines)
LDA.w #$8000 : STA $2116
LDA.w #$8000 : STA.w VMADDL
; $00[3] = $0E8000 (offset for the font data)
LDA.w #FileSelectNewGraphics : STA $00
LDA.w #FileSelectNewGraphics : STA.b Scrap00
; going to write 0x1000 bytes (0x800 words)
LDX.w #$800-1
@@ -588,10 +576,10 @@ LoadFullItemTilesCredits:
.nextWord
; read a word from the font data
LDA [$00] : STA $2118
LDA.b [$00] : STA.w VMDATAL
; increment source address by 2
INC $00 : INC $00
INC.b Scrap00 : INC.b Scrap00
DEX : BPL .nextWord
@@ -629,7 +617,7 @@ DrawEndingItems:
JSL DrawPlayerFile_credits
JSL SetItemLayoutPriority
SEP #$30
LDA.b #$01 : STA $14
LDA.b #$01 : STA.b $14
RTS
FontTable:
@@ -650,13 +638,13 @@ org $0EE651
org $0EE828
JSL PreparePointer
LDA [!CreditsPtr],Y
LDA.b [CreditsPtr],Y
NOP
org $0EE83F
LDA [!CreditsPtr],Y
LDA.b [CreditsPtr],Y
NOP
org $0EE853
LDA [!CreditsPtr],Y
LDA.b [CreditsPtr],Y
NOP
AND.w #$00ff
ASL A