From 326b8f294e7c71a9396cd436ff14add99fed75b1 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 28 Apr 2022 16:09:12 -0600 Subject: [PATCH] Shifted uppercase font. Used FEATURE_NEW_TEXT flag --- fonttest/font.gb | Bin 0 -> 8192 bytes stats/font.2bpp | Bin 0 -> 8192 bytes stats/main.asm | 1336 +++++++++++++++++++++++----------------------- 3 files changed, 670 insertions(+), 666 deletions(-) create mode 100755 fonttest/font.gb create mode 100644 stats/font.2bpp diff --git a/fonttest/font.gb b/fonttest/font.gb new file mode 100755 index 0000000000000000000000000000000000000000..cc173b4d919876a6a34e12a9c55ea0cdad649d46 GIT binary patch literal 8192 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 C@xzw@ literal 0 HcmV?d00001 diff --git a/stats/font.2bpp b/stats/font.2bpp new file mode 100644 index 0000000000000000000000000000000000000000..c0ce111d8c91c6791e0f7d8603c0374435079ca3 GIT binary patch literal 8192 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 - db - db <<4| - db <<5 - db $00 - dl
-endmacro - -macro StripeStart(xPos, length) - LDA $C8 - CLC - ADC.w # - XBA - STA $1002,x - - LDA.w #*2-1 - XBA - LDA #$0500 - STA $1004,x -endmacro - -macro StripeTile() - STA $1006,x - INX - INX -endmacro - -macro StripeEnd() - INX - INX - INX - INX -endmacro - -HexToDecStats: - PHA - PHA - LDA.w #$0000 - STA $7F5003 : STA $7F5005 : STA $7F5006 ; clear digit storage - PLA - - - CMP.w #10000 : !BLT + - PHA : SEP #$20 : LDA $7F5003 : INC : STA $7F5003 : REP #$20 : PLA - !SUB.w #10000 : BRA - - + - - CMP.w #1000 : !BLT + - PHA : SEP #$20 : LDA $7F5004 : INC : STA $7F5004 : REP #$20 : PLA - !SUB.w #1000 : BRA - - + - - CMP.w #100 : !BLT + - PHA : SEP #$20 : LDA $7F5005 : INC : STA $7F5005 : REP #$20 : PLA - !SUB.w #100 : BRA - - + - - CMP.w #10 : !BLT + - PHA : SEP #$20 : LDA $7F5006 : INC : STA $7F5006 : REP #$20 : PLA - !SUB.w #10 : BRA - - + - - CMP.w #1 : !BLT + - PHA : SEP #$20 : LDA $7F5007 : INC : STA $7F5007 : REP #$20 : PLA - !SUB.w #1 : BRA - - + - PLA -RTL - -LastHexDigit: - TYA - AND #$000F - PHA - TYA - LSR #4 - TAY - CLC - LDA !StatsBottom - BNE + - ; Upper half - PLA - ADC #$3D40 - RTS -+ ; Lower half - PLA - ADC #$3D50 - RTS - -FindLine: - LDY.w #$0000 - -- LDA.w CreditsStats,y - STZ !StatsBottom - CMP #$FFFF - BEQ .noLine - - XBA - AND #$01FF - CMP !LineNumber - BEQ .lineFound - - INC - INC !StatsBottom - CMP !LineNumber - BEQ .lineFound - - INY #8 - BRA - - -.lineFound - SEC - RTS - -.noLine - CLC - RTS - -!FRAMES_PER_SECOND = 60 -!FRAMES_PER_MINUTE = 60*60 -!FRAMES_PER_HOUR = 60*60*60 -!MAX_FRAME_COUNT = 59*60+59*60+59*60+99 - -macro CountUnits(framesPerUnit, unitCounter) - STZ -?loop: - LDA !ValueLow - SEC - SBC.w # - STA !Temp - LDA !ValueHigh - SBC.w #>>16 - BCC ?end - STA !ValueHigh - LDA !Temp - STA !ValueLow - INC - BRA ?loop -?end: -endmacro - -!ColonOffset = $83 -!PeriodOffset = $80 -!BlankTile = #$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 #$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 #$001F ; X XXXX - CLC - ADC $C8 - XBA - STA $1002,x - - ; == Write Stripe header (Length of data) == - LDA.w #4*2-1 ; 4 tiles = 8 bytes - XBA - STA $1004,x - PHX - - ; == Load tile base (upper or lower half of white two-line zero) == - LDA !StatsBottom - BNE + - LDA #$3D40 - BRA ++ -+ LDA #$3D50 -++ STA !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 !ValueLow - - ; == Shift value == - LDA.w CreditsStats+2,y; CCC- ---- BBBB SSSS - AND.w #$000F ; SSSS - BEQ + - TAX - LDA !ValueLow -- LSR - DEX - BNE - - STA !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 !ValueLow - STA !ValueLow - - ; == Cap value == - LDA.w CreditsStats+3,y; ---- ---- CCC- ---- - LSR #5 - AND.w #$0007 ; CCC - BEQ + - ASL : TAX - LDA.l ValueCaps,x - CMP !ValueLow - !BGE + - STA !ValueLow -+ - ; == Display value == - LDA !ValueLow - JSL HexToDecStats - PLX - STZ !RemoveZero - - LDA $7F5004 - AND #$00FF - CMP !RemoveZero - BNE + - LDA !BlankTile - BRA ++ -+ DEC !RemoveZero - CLC - ADC !Temp -++ %StripeTile() - - LDA $7F5005 - AND #$00FF - CMP !RemoveZero - BNE + - LDA !BlankTile - BRA ++ -+ DEC !RemoveZero - CLC - ADC !Temp -++ %StripeTile() - - LDA $7F5006 - AND #$00FF - CMP !RemoveZero - BNE + - LDA !BlankTile - BRA ++ -+ DEC !RemoveZero - CLC - ADC !Temp -++ %StripeTile() - - LDA $7F5007 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - %StripeEnd() -.endStats - - ;JSR RenderLineNumber - - 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 #$001F ; X XXXX - CLC - ADC $C8 - XBA - STA $1002,x - - ; == Write Stripe header (Length of data) == - LDA.w #11*2-1 ; 11 tiles = 22 bytes - XBA - STA $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 !ValueLow - INC !StatsPtr - INC !StatsPtr - LDA.b [!StatsPtr] - STA !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 !Hours - CMP.w #100 - !BLT + -++ LDA.w #99 - STA !Hours - LDA.w #59 - STA !Minutes - STA !Seconds - STA !ValueLow -+ - - ; == Load tile base (upper or lower half of white two-line zero) == - LDA !StatsBottom - BNE + - LDA #$3D40 - BRA ++ -+ LDA #$3D50 -++ STA !Temp - - PLX - - ; == Display value == - LDA !Hours - JSL HexToDecStats - - LDA $7F5006 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - LDA $7F5007 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - LDA.w #!ColonOffset - CLC - ADC !Temp - %StripeTile() - - LDA !Minutes - JSL HexToDecStats - LDA $7F5006 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - LDA $7F5007 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - LDA.w #!ColonOffset - CLC - ADC !Temp - %StripeTile() - - LDA !Seconds - JSL HexToDecStats - LDA $7F5006 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - LDA $7F5007 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - LDA.w #!PeriodOffset - CLC - ADC !Temp - %StripeTile() - - LDA !ValueLow - JSL HexToDecStats - LDA $7F5006 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - LDA $7F5007 - AND #$00FF - CLC - ADC !Temp - %StripeTile() - - %StripeEnd() - JMP .endStats - - -RenderLineNumber: - %StripeStart(0, 3) - - STZ !StatsBottom - LDA $CA - TAY - AND #$0001 - BEQ + - DEY - INC !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 $2101 - - ; increment on writes to $2119 - LDA.b #$80 : STA $2115 - - ; set bank of the source address (see below) - LDA.b #FontGfx>>16 : STA $02 - - REP #$30 - - ; vram target address is $7000 (word) - LDA.w #$7000 : STA $2116 - - ; $00[3] = $0E8000 (offset for the font data) - LDA.w #FontGfx : STA $00 - - ; going to write 0x1000 bytes (0x800 words) - LDX.w #FontGfxEnd-FontGfx/2-1 - -.nextWord - - ; read a word from the font data - LDA [$00] : STA $2118 - - ; increment source address by 2 - INC $00 : INC $00 - - DEX : BPL .nextWord - - SEP #$30 - JSL LoadFullItemTilesCredits - - RTL - -LoadFullItemTilesCredits: - ; Based on CopyFontToVram(Bank00) - ; copies font graphics to VRAM (for BG3) - - ; increment on writes to $2119 - LDA.b #$80 : STA $2115 - - ; set bank of the source address (see below) - LDA.b #FileSelectNewGraphics>>16 : STA $02 - - 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 - - ; $00[3] = $0E8000 (offset for the font data) - LDA.w #FileSelectNewGraphics : STA $00 - - ; going to write 0x1000 bytes (0x800 words) - LDX.w #$800-1 - - .nextWord - - ; read a word from the font data - LDA [$00] : STA $2118 - - ; increment source address by 2 - INC $00 : INC $00 - - DEX : BPL .nextWord - - SEP #$30 - - RTL - -CheckFontTable: - TAY - PHB - PHK - PLB - LDA.w FontTable,Y - PLB - RTL - -NearEnding: - STZ.w $012A ; disable triforce helper thread - JSL LoadCustomHudPalette - REP #$10 - JSL AltBufferTable_credits - JSR DrawEndingItems -JML.l $00ec03 ; PaletteFilter_InitTheEndSprite - -EndingItems: - ; This function is not strictly needed, simply updating the tracker - ; every frame, but it is useful for debuging, so should be left in. - REP #$10 - JSR DrawEndingItems - REP #$20 - LDX.b #$0e -RTL - -DrawEndingItems: - JSL DrawPlayerFile_credits - JSL SetItemLayoutPriority - SEP #$30 - LDA.b #$01 : STA $14 -RTS - -FontTable: - incbin stats/fonttable.bin - -CreditsStats: -incsrc stats/statConfig.asm -dw $FFFF - -org $0eedd9 - JSL EndingItems - -org $0eedaf - JSL NearEnding - -org $0EE651 - JSL LoadModifiedFont - -org $0EE828 - JSL PreparePointer - LDA [!CreditsPtr],Y - NOP -org $0EE83F - LDA [!CreditsPtr],Y - NOP -org $0EE853 - LDA [!CreditsPtr],Y - NOP - AND.w #$00ff - ASL A - JSL CheckFontTable - -org $0ee86d - JSL RenderCreditsStatCounter - JMP.w AfterDeathCounterOutput - -org $0ee8fd - AfterDeathCounterOutput: +lorom + +!ADD = "CLC : ADC" +!SUB = "SEC : SBC" +!BLT = "BCC" +!BGE = "BCS" + +org $238000 +incsrc stats/creditsnew.asm + +FontGfx: +if !FEATURE_NEW_TEXT + incbin stats/font.2bpp +else + incbin stats/font.gb +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 + + +; Original addresses +!LineNumber = $CA ; 2 bytes + +PreparePointer: + LDA.w #$2300 + STA.b !CreditsPtr+1 + LDA.w #CreditsLineTable + STA.b !CreditsPtr + LDA [!CreditsPtr],Y + STA.b !CreditsPtr + 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 +; End of data: 1111 1111 1111 1111 + +; X X offset (measured in 8x8 tiles) +; L Line number +; B Amount of bits to keep after shifting (0000 = 16 bits, 0001 = 1 bit, 1111 = 15 bits) +; S Amount of bits to right shift the value by (0000 = 0 bits, 1111 = 15 bits) +; C Value cap +; 000 No cap +; 001 9 +; 010 99 +; 011 999 +; 100 9999 +; 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 + +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 + +macro AddStat(address, type, shiftRight, bits, digits, xPos, lineNumber) + db <<2|<<9|>>8 + db + db <<4| + db <<5 + db $00 + dl
+endmacro + +macro StripeStart(xPos, length) + LDA $C8 + CLC + ADC.w # + XBA + STA $1002,x + + LDA.w #*2-1 + XBA + LDA #$0500 + STA $1004,x +endmacro + +macro StripeTile() + STA $1006,x + INX + INX +endmacro + +macro StripeEnd() + INX + INX + INX + INX +endmacro + +HexToDecStats: + PHA + PHA + LDA.w #$0000 + STA $7F5003 : STA $7F5005 : STA $7F5006 ; clear digit storage + PLA + - + CMP.w #10000 : !BLT + + PHA : SEP #$20 : LDA $7F5003 : INC : STA $7F5003 : REP #$20 : PLA + !SUB.w #10000 : BRA - + + - + CMP.w #1000 : !BLT + + PHA : SEP #$20 : LDA $7F5004 : INC : STA $7F5004 : REP #$20 : PLA + !SUB.w #1000 : BRA - + + - + CMP.w #100 : !BLT + + PHA : SEP #$20 : LDA $7F5005 : INC : STA $7F5005 : REP #$20 : PLA + !SUB.w #100 : BRA - + + - + CMP.w #10 : !BLT + + PHA : SEP #$20 : LDA $7F5006 : INC : STA $7F5006 : REP #$20 : PLA + !SUB.w #10 : BRA - + + - + CMP.w #1 : !BLT + + PHA : SEP #$20 : LDA $7F5007 : INC : STA $7F5007 : REP #$20 : PLA + !SUB.w #1 : BRA - + + + PLA +RTL + +LastHexDigit: + TYA + AND #$000F + PHA + TYA + LSR #4 + TAY + CLC + LDA !StatsBottom + BNE + + ; Upper half + PLA + ADC #$3D40 + RTS ++ ; Lower half + PLA + ADC #$3D50 + RTS + +FindLine: + LDY.w #$0000 + +- LDA.w CreditsStats,y + STZ !StatsBottom + CMP #$FFFF + BEQ .noLine + + XBA + AND #$01FF + CMP !LineNumber + BEQ .lineFound + + INC + INC !StatsBottom + CMP !LineNumber + BEQ .lineFound + + INY #8 + BRA - + +.lineFound + SEC + RTS + +.noLine + CLC + RTS + +!FRAMES_PER_SECOND = 60 +!FRAMES_PER_MINUTE = 60*60 +!FRAMES_PER_HOUR = 60*60*60 +!MAX_FRAME_COUNT = 59*60+59*60+59*60+99 + +macro CountUnits(framesPerUnit, unitCounter) + STZ +?loop: + LDA !ValueLow + SEC + SBC.w # + STA !Temp + LDA !ValueHigh + SBC.w #>>16 + BCC ?end + STA !ValueHigh + LDA !Temp + STA !ValueLow + INC + BRA ?loop +?end: +endmacro + +!ColonOffset = $83 +!PeriodOffset = $80 +!BlankTile = #$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 #$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 #$001F ; X XXXX + CLC + ADC $C8 + XBA + STA $1002,x + + ; == Write Stripe header (Length of data) == + LDA.w #4*2-1 ; 4 tiles = 8 bytes + XBA + STA $1004,x + PHX + + ; == Load tile base (upper or lower half of white two-line zero) == + LDA !StatsBottom + BNE + + LDA #$3D40 + BRA ++ ++ LDA #$3D50 +++ STA !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 !ValueLow + + ; == Shift value == + LDA.w CreditsStats+2,y; CCC- ---- BBBB SSSS + AND.w #$000F ; SSSS + BEQ + + TAX + LDA !ValueLow +- LSR + DEX + BNE - + STA !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 !ValueLow + STA !ValueLow + + ; == Cap value == + LDA.w CreditsStats+3,y; ---- ---- CCC- ---- + LSR #5 + AND.w #$0007 ; CCC + BEQ + + ASL : TAX + LDA.l ValueCaps,x + CMP !ValueLow + !BGE + + STA !ValueLow ++ + ; == Display value == + LDA !ValueLow + JSL HexToDecStats + PLX + STZ !RemoveZero + + LDA $7F5004 + AND #$00FF + CMP !RemoveZero + BNE + + LDA !BlankTile + BRA ++ ++ DEC !RemoveZero + CLC + ADC !Temp +++ %StripeTile() + + LDA $7F5005 + AND #$00FF + CMP !RemoveZero + BNE + + LDA !BlankTile + BRA ++ ++ DEC !RemoveZero + CLC + ADC !Temp +++ %StripeTile() + + LDA $7F5006 + AND #$00FF + CMP !RemoveZero + BNE + + LDA !BlankTile + BRA ++ ++ DEC !RemoveZero + CLC + ADC !Temp +++ %StripeTile() + + LDA $7F5007 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + %StripeEnd() +.endStats + + ;JSR RenderLineNumber + + 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 #$001F ; X XXXX + CLC + ADC $C8 + XBA + STA $1002,x + + ; == Write Stripe header (Length of data) == + LDA.w #11*2-1 ; 11 tiles = 22 bytes + XBA + STA $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 !ValueLow + INC !StatsPtr + INC !StatsPtr + LDA.b [!StatsPtr] + STA !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 !Hours + CMP.w #100 + !BLT + +++ LDA.w #99 + STA !Hours + LDA.w #59 + STA !Minutes + STA !Seconds + STA !ValueLow ++ + + ; == Load tile base (upper or lower half of white two-line zero) == + LDA !StatsBottom + BNE + + LDA #$3D40 + BRA ++ ++ LDA #$3D50 +++ STA !Temp + + PLX + + ; == Display value == + LDA !Hours + JSL HexToDecStats + + LDA $7F5006 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + LDA $7F5007 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + LDA.w #!ColonOffset + CLC + ADC !Temp + %StripeTile() + + LDA !Minutes + JSL HexToDecStats + LDA $7F5006 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + LDA $7F5007 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + LDA.w #!ColonOffset + CLC + ADC !Temp + %StripeTile() + + LDA !Seconds + JSL HexToDecStats + LDA $7F5006 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + LDA $7F5007 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + LDA.w #!PeriodOffset + CLC + ADC !Temp + %StripeTile() + + LDA !ValueLow + JSL HexToDecStats + LDA $7F5006 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + LDA $7F5007 + AND #$00FF + CLC + ADC !Temp + %StripeTile() + + %StripeEnd() + JMP .endStats + + +RenderLineNumber: + %StripeStart(0, 3) + + STZ !StatsBottom + LDA $CA + TAY + AND #$0001 + BEQ + + DEY + INC !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 $2101 + + ; increment on writes to $2119 + LDA.b #$80 : STA $2115 + + ; set bank of the source address (see below) + LDA.b #FontGfx>>16 : STA $02 + + REP #$30 + + ; vram target address is $7000 (word) + LDA.w #$7000 : STA $2116 + + ; $00[3] = $0E8000 (offset for the font data) + LDA.w #FontGfx : STA $00 + + ; going to write 0x1000 bytes (0x800 words) + LDX.w #FontGfxEnd-FontGfx/2-1 + +.nextWord + + ; read a word from the font data + LDA [$00] : STA $2118 + + ; increment source address by 2 + INC $00 : INC $00 + + DEX : BPL .nextWord + + SEP #$30 + JSL LoadFullItemTilesCredits + + RTL + +LoadFullItemTilesCredits: + ; Based on CopyFontToVram(Bank00) + ; copies font graphics to VRAM (for BG3) + + ; increment on writes to $2119 + LDA.b #$80 : STA $2115 + + ; set bank of the source address (see below) + LDA.b #FileSelectNewGraphics>>16 : STA $02 + + 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 + + ; $00[3] = $0E8000 (offset for the font data) + LDA.w #FileSelectNewGraphics : STA $00 + + ; going to write 0x1000 bytes (0x800 words) + LDX.w #$800-1 + + .nextWord + + ; read a word from the font data + LDA [$00] : STA $2118 + + ; increment source address by 2 + INC $00 : INC $00 + + DEX : BPL .nextWord + + SEP #$30 + + RTL + +CheckFontTable: + TAY + PHB + PHK + PLB + LDA.w FontTable,Y + PLB + RTL + +NearEnding: + STZ.w $012A ; disable triforce helper thread + JSL LoadCustomHudPalette + REP #$10 + JSL AltBufferTable_credits + JSR DrawEndingItems +JML.l $00ec03 ; PaletteFilter_InitTheEndSprite + +EndingItems: + ; This function is not strictly needed, simply updating the tracker + ; every frame, but it is useful for debuging, so should be left in. + REP #$10 + JSR DrawEndingItems + REP #$20 + LDX.b #$0e +RTL + +DrawEndingItems: + JSL DrawPlayerFile_credits + JSL SetItemLayoutPriority + SEP #$30 + LDA.b #$01 : STA $14 +RTS + +FontTable: + incbin stats/fonttable.bin + +CreditsStats: +incsrc stats/statConfig.asm +dw $FFFF + +org $0eedd9 + JSL EndingItems + +org $0eedaf + JSL NearEnding + +org $0EE651 + JSL LoadModifiedFont + +org $0EE828 + JSL PreparePointer + LDA [!CreditsPtr],Y + NOP +org $0EE83F + LDA [!CreditsPtr],Y + NOP +org $0EE853 + LDA [!CreditsPtr],Y + NOP + AND.w #$00ff + ASL A + JSL CheckFontTable + +org $0ee86d + JSL RenderCreditsStatCounter + JMP.w AfterDeathCounterOutput + +org $0ee8fd + AfterDeathCounterOutput: