turn a bunch of addresses into fast rom
bunch of consistency clean ups in hooks
move zsnes to failures
This commit is contained in:
spannerisms
2022-12-30 03:07:15 -05:00
parent 36ca193b75
commit ff88437f8e
36 changed files with 2108 additions and 2133 deletions

View File

@@ -5,7 +5,7 @@ lorom
!BLT = "BCC"
!BGE = "BCS"
org $238000
org $A38000
incsrc stats/credits.asm
FontGfx:
@@ -41,8 +41,8 @@ PreparePointer:
LDY.w #$0000
RTL
; Regular stat: XXXX X00L LLLL LLLL BBBB SSSS CCC- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; Time stat: XXXX X01L LLLL LLLL ---- ---- ---- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; Regular stat: XXXX X00L LLLL LLLL BBBB SSSS CCC- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; Time stat: XXXX X01L LLLL LLLL ---- ---- ---- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; End of data: 1111 1111 1111 1111
; X X offset (measured in 8x8 tiles)
@@ -58,55 +58,55 @@ RTL
; A Memory Address
ValueCaps:
dw 0
dw 9
dw 99
dw 999
dw 9999
dw 9999 ; TODO - 5 digits need to be fixed at a later date
dw 0
dw 9
dw 99
dw 999
dw 9999
dw 9999 ; TODO - 5 digits need to be fixed at a later date
BitMasks:
dw $FFFF
dw $0001
dw $0003
dw $0007
dw $000F
dw $001F
dw $003F
dw $007F
dw $00FF
dw $01FF
dw $03FF
dw $07FF
dw $0FFF
dw $1FFF
dw $3FFF
dw $7FFF
dw $FFFF
dw $0001
dw $0003
dw $0007
dw $000F
dw $001F
dw $003F
dw $007F
dw $00FF
dw $01FF
dw $03FF
dw $07FF
dw $0FFF
dw $1FFF
dw $3FFF
dw $7FFF
macro StripeStart(xPos, length)
LDA.b $C8
CLC
ADC.w #<xPos>
XBA
STA.w $1002,x
LDA.w #<length>*2-1
XBA
LDA.w #$0500
STA.w $1004,x
LDA.b $C8
CLC
ADC.w #<xPos>
XBA
STA.w $1002,x
LDA.w #<length>*2-1
XBA
LDA.w #$0500
STA.w $1004,x
endmacro
macro StripeTile()
STA.w $1006,x
INX
INX
STA.w $1006,x
INX
INX
endmacro
macro StripeEnd()
INX
INX
INX
INX
INX
INX
INX
INX
endmacro
HexToDecStats:
@@ -140,52 +140,52 @@ HexToDecStats:
RTL
LastHexDigit:
TYA
AND.w #$000F
PHA
TYA
LSR #4
TAY
CLC
LDA.b StatsBottom
BNE +
; Upper half
PLA
ADC #$3D40
RTS
+ ; Lower half
PLA
ADC #$3D50
RTS
FindLine:
LDY.w #$0000
TYA
AND.w #$000F
PHA
TYA
LSR #4
TAY
CLC
LDA.b StatsBottom
BNE +
; Upper half
PLA
ADC #$3D40
RTS
+ ; Lower half
PLA
ADC #$3D50
RTS
FindLine:
LDY.w #$0000
- LDA.w CreditsStats,y
STZ.b StatsBottom
CMP #$FFFF
BEQ .noLine
XBA
AND.w #$01FF
CMP.b LineNumber
BEQ .lineFound
INC
INC.b StatsBottom
CMP.b LineNumber
BEQ .lineFound
INY #8
BRA -
- LDA.w CreditsStats,y
STZ.b StatsBottom
CMP #$FFFF
BEQ .noLine
XBA
AND.w #$01FF
CMP.b LineNumber
BEQ .lineFound
INC
INC.b StatsBottom
CMP.b LineNumber
BEQ .lineFound
INY #8
BRA -
.lineFound
SEC
RTS
SEC
RTS
.noLine
CLC
RTS
CLC
RTS
!FRAMES_PER_SECOND = 60
!FRAMES_PER_MINUTE = 60*60
@@ -193,20 +193,20 @@ FindLine:
!MAX_FRAME_COUNT = 59*60+59*60+59*60+99
macro CountUnits(framesPerUnit, unitCounter)
STZ.b <unitCounter>
STZ.b <unitCounter>
?loop:
LDA.b ValueLow
SEC
SBC.w #<framesPerUnit>
STA.b Temp
LDA.b ValueHigh
SBC.w #<framesPerUnit>>>16
BCC ?end
STA.b ValueHigh
LDA.b Temp
STA.b ValueLow
INC.b <unitCounter>
BRA ?loop
LDA.b ValueLow
SEC
SBC.w #<framesPerUnit>
STA.b Temp
LDA.b ValueHigh
SBC.w #<framesPerUnit>>>16
BCC ?end
STA.b ValueHigh
LDA.b Temp
STA.b ValueLow
INC.b <unitCounter>
BRA ?loop
?end:
endmacro
@@ -215,342 +215,342 @@ endmacro
BlankCreditsTile = $883D
RenderCreditsStatCounter:
PHB
PHK
PLB
JSR FindLine
BCS +
JMP .endStats
+
; XXXX X00L LLLL LLLL BBBB SSSS CCC- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; == Determine stat type ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR
AND.w #$0003 ; TT
CMP.w #$0000
BEQ .normalStat
JMP .timeStat
PHB
PHK
PLB
JSR FindLine
BCS +
JMP .endStats
+
; XXXX X00L LLLL LLLL BBBB SSSS CCC- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; == Determine stat type ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR
AND.w #$0003 ; TT
CMP.w #$0000
BEQ .normalStat
JMP .timeStat
.normalStat
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND.w #$001F ; X XXXX
CLC
ADC.w $C8
XBA
STA.w $1002,x
; == Write Stripe header (Length of data) ==
LDA.w #4*2-1 ; 4 tiles = 8 bytes
XBA
STA.w $1004,x
PHX
; == Load tile base (upper or lower half of white two-line zero) ==
LDA.b StatsBottom
BNE +
LDA.w #$3D40
BRA ++
+ LDA.w #$3D50
++ STA.b Temp
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND.w #$001F ; X XXXX
CLC
ADC.w $C8
XBA
STA.w $1002,x
; == Load the actual stat word ==
LDA.w CreditsStats+5,y
STA.b StatsPtr
LDA.w CreditsStats+6,y
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.b ValueLow
- LSR
DEX
BNE -
STA.b ValueLow
+
; == Mask value ==
LDA.w CreditsStats+2,y; CCC- ---- BBBB SSSS
;LSR #4
;AND.w #$000F ; BBBB
; == Write Stripe header (Length of data) ==
LDA.w #4*2-1 ; 4 tiles = 8 bytes
XBA
STA.w $1004,x
PHX
; == Load tile base (upper or lower half of white two-line zero) ==
LDA.b StatsBottom
BNE +
LDA.w #$3D40
BRA ++
+ LDA.w #$3D50
++ STA.b Temp
; == Load the actual stat word ==
LDA.w CreditsStats+5,y
STA.b StatsPtr
LDA.w CreditsStats+6,y
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.b ValueLow
- LSR
DEX
BNE -
STA.b ValueLow
+
; == Mask value ==
LDA.w CreditsStats+2,y; CCC- ---- BBBB SSSS
;LSR #4
;AND.w #$000F ; BBBB
LSR #3
AND.w #$001E
TAX
LDA.l BitMasks,x
AND.b ValueLow
STA.b ValueLow
; == Cap value ==
LDA.w CreditsStats+3,y; ---- ---- CCC- ----
LSR #5
AND.w #$0007 ; CCC
BEQ +
ASL : TAX
LDA.l ValueCaps,x
CMP.b ValueLow
!BGE +
STA.b ValueLow
+
; == Display value ==
LDA.b ValueLow
JSL HexToDecStats
PLX
STZ.b RemoveZero
LDA.l $7F5004
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA.w #BlankCreditsTile
BRA ++
+ DEC.b RemoveZero
CLC
ADC.b Temp
++ %StripeTile()
LDA.l $7F5005
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA.w #BlankCreditsTile
BRA ++
+ DEC.b RemoveZero
CLC
ADC.b Temp
++ %StripeTile()
LDA.l $7F5006
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA.w #BlankCreditsTile
BRA ++
+ DEC.b RemoveZero
CLC
ADC.b Temp
++ %StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
%StripeEnd()
TAX
LDA.l BitMasks,x
AND.b ValueLow
STA.b ValueLow
; == Cap value ==
LDA.w CreditsStats+3,y; ---- ---- CCC- ----
LSR #5
AND.w #$0007 ; CCC
BEQ +
ASL : TAX
LDA.l ValueCaps,x
CMP.b ValueLow
!BGE +
STA.b ValueLow
+
; == Display value ==
LDA.b ValueLow
JSL HexToDecStats
PLX
STZ.b RemoveZero
LDA.l $7F5004
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA.w #BlankCreditsTile
BRA ++
+ DEC.b RemoveZero
CLC
ADC.b Temp
++ %StripeTile()
LDA.l $7F5005
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA.w #BlankCreditsTile
BRA ++
+ DEC.b RemoveZero
CLC
ADC.b Temp
++ %StripeTile()
LDA.l $7F5006
AND.w #$00FF
CMP.b RemoveZero
BNE +
LDA.w #BlankCreditsTile
BRA ++
+ DEC.b RemoveZero
CLC
ADC.b Temp
++ %StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
%StripeEnd()
.endStats
PLB
RTL
PLB
RTL
.timeStat
; Output format: HH:MM:SS.FF
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND.w #$001F ; X XXXX
CLC
ADC.b $C8
XBA
STA.w $1002,x
; == Write Stripe header (Length of data) ==
LDA.w #11*2-1 ; 11 tiles = 22 bytes
XBA
STA.w $1004,x
PHX
; == Load the actual stat words ==
LDA.w CreditsStats+5,y
STA.b StatsPtr
LDA.w CreditsStats+6,y
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)
; == Cap at 99:59:59.59 ==
LDA.b Hours
CMP.w #100
!BLT +
++ LDA.w #99
STA.b Hours
LDA.w #59
STA.b Minutes
STA.b Seconds
STA.b ValueLow
; Output format: HH:MM:SS.FF
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA.w CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND.w #$001F ; X XXXX
CLC
ADC.b $C8
XBA
STA.w $1002,x
; == Write Stripe header (Length of data) ==
LDA.w #11*2-1 ; 11 tiles = 22 bytes
XBA
STA.w $1004,x
PHX
; == Load the actual stat words ==
LDA.w CreditsStats+5,y
STA.b StatsPtr
LDA.w CreditsStats+6,y
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)
; == Cap at 99:59:59.59 ==
LDA.b Hours
CMP.w #100
!BLT +
++ LDA.w #99
STA.b Hours
LDA.w #59
STA.b Minutes
STA.b Seconds
STA.b ValueLow
+
; == Load tile base (upper or lower half of white two-line zero) ==
LDA.b StatsBottom
BNE +
LDA.w #$3D40
BRA ++
+ LDA.w #$3D50
++ STA.b Temp
PLX
; == Display value ==
LDA.b Hours
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC.b Temp
%StripeTile()
LDA.b Minutes
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC.b Temp
%StripeTile()
LDA.b Seconds
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.w #!PeriodOffset
CLC
ADC.b Temp
%StripeTile()
LDA.b ValueLow
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
%StripeEnd()
JMP .endStats
; == Load tile base (upper or lower half of white two-line zero) ==
LDA.b StatsBottom
BNE +
LDA.w #$3D40
BRA ++
+ LDA.w #$3D50
++ STA.b Temp
PLX
; == Display value ==
LDA.b Hours
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC.b Temp
%StripeTile()
LDA.b Minutes
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC.b Temp
%StripeTile()
LDA.b Seconds
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.w #!PeriodOffset
CLC
ADC.b Temp
%StripeTile()
LDA.b ValueLow
JSL HexToDecStats
LDA.l $7F5006
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
LDA.l $7F5007
AND.w #$00FF
CLC
ADC.b Temp
%StripeTile()
%StripeEnd()
JMP .endStats
RenderLineNumber:
%StripeStart(0, 3)
STZ.b StatsBottom
LDA.b $CA
TAY
AND.w #$0001
BEQ +
DEY
INC.b StatsBottom
+
JSR LastHexDigit
PHA
JSR LastHexDigit
PHA
JSR LastHexDigit
%StripeTile()
PLA
%StripeTile()
PLA
%StripeTile()
%StripeEnd()
RTS
%StripeStart(0, 3)
STZ.b StatsBottom
LDA.b $CA
TAY
AND.w #$0001
BEQ +
DEY
INC.b StatsBottom
+
JSR LastHexDigit
PHA
JSR LastHexDigit
PHA
JSR LastHexDigit
%StripeTile()
PLA
%StripeTile()
PLA
%StripeTile()
%StripeEnd()
RTS
LoadModifiedFont:
; Based on CopyFontToVram(Bank00)
; copies font graphics to VRAM (for BG3)
; set name base table to vram $4000 (word)
LDA.b #$02 : STA.w OBSEL
; increment on writes to $2119
LDA.b #$80 : STA.w VMAIN
; set bank of the source address (see below)
LDA.b #FontGfx>>16 : STA.b Scrap02
REP #$30
; vram target address is $7000 (word)
LDA.w #$7000 : STA.w VMADDL
; $00[3] = $0E8000 (offset for the font data)
LDA.w #FontGfx : STA.b Scrap00
; going to write 0x1000 bytes (0x800 words)
LDX.w #FontGfxEnd-FontGfx/2-1
; Based on CopyFontToVram(Bank00)
; copies font graphics to VRAM (for BG3)
; set name base table to vram $4000 (word)
LDA.b #$02 : STA.w OBSEL
; increment on writes to $2119
LDA.b #$80 : STA.w VMAIN
; set bank of the source address (see below)
LDA.b #FontGfx>>16 : STA.b Scrap02
REP #$30
; vram target address is $7000 (word)
LDA.w #$7000 : STA.w VMADDL
; $00[3] = $0E8000 (offset for the font data)
LDA.w #FontGfx : STA.b Scrap00
; going to write 0x1000 bytes (0x800 words)
LDX.w #FontGfxEnd-FontGfx/2-1
.nextWord
; read a word from the font data
LDA.b [$00] : STA.w VMDATAL
; increment source address by 2
INC.b Scrap00 : INC.b Scrap00
DEX : BPL .nextWord
SEP #$30
; read a word from the font data
LDA.b [$00] : STA.w VMDATAL
; increment source address by 2
INC.b Scrap00 : INC.b Scrap00
DEX : BPL .nextWord
SEP #$30
JSL LoadFullItemTilesCredits
RTL
RTL
LoadFullItemTilesCredits:
; Based on CopyFontToVram(Bank00)
@@ -584,17 +584,17 @@ LoadFullItemTilesCredits:
DEX : BPL .nextWord
SEP #$30
RTL
RTL
CheckFontTable:
TAY
PHB
PHK
PLB
LDA.w FontTable,Y
PLB
RTL
TAY
PHB
PHK
PLB
LDA.w FontTable,Y
PLB
RTL
NearEnding:
STZ.w $012A ; disable triforce helper thread
@@ -602,7 +602,7 @@ NearEnding:
REP #$10
JSL AltBufferTable_credits
JSR DrawEndingItems
JML.l $00ec03 ; PaletteFilter_InitTheEndSprite
JML.l $80EC03 ; PaletteFilter_InitTheEndSprite
EndingItems:
; This function is not strictly needed, simply updating the tracker
@@ -621,20 +621,20 @@ DrawEndingItems:
RTS
FontTable:
incbin stats/fonttable.bin
incbin stats/fonttable.bin
CreditsStats:
incsrc stats/statConfig.asm
dw $FFFF
org $0eedd9
JSL EndingItems
org $0EEDD9
JSL EndingItems
org $0eedaf
org $0EEDAF
JSL NearEnding
org $0EE651
JSL LoadModifiedFont
JSL LoadModifiedFont
org $0EE828
JSL PreparePointer
@@ -646,13 +646,13 @@ org $0EE83F
org $0EE853
LDA.b [CreditsPtr],Y
NOP
AND.w #$00ff
ASL A
JSL CheckFontTable
org $0ee86d
JSL RenderCreditsStatCounter
JMP.w AfterDeathCounterOutput
org $0ee8fd
AfterDeathCounterOutput:
AND.w #$00FF
ASL A
JSL CheckFontTable
org $0EE86D
JSL RenderCreditsStatCounter
JMP.w AfterDeathCounterOutput
org $8EE8FD
AfterDeathCounterOutput: