dmgtris/src/sram.asm

698 lines
13 KiB
NASM

; DMGTRIS
; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com>
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
IF !DEF(SRAM_ASM)
DEF SRAM_ASM EQU 1
INCLUDE "globals.asm"
MACRO PROFILE
UNION
rProfileData\1:: ds 64
NEXTU
rProfileName\1:: ds 3
rSwapABState\1:: ds 1
rRNGModeState\1:: ds 1
rRotModeState\1:: ds 1
rDropModeState\1:: ds 1
rSpeedCurveState\1:: ds 1
rAlways20GState\1:: ds 1
rSelectedStartLevel\1:: ds 2
rFilterMode\1:: ds 1
rBGMode\1:: ds 1
rUnused\1:: ds (64-13)
ENDU
ENDM
SECTION "Persistent Globals", SRAM
rCheck:: ds 6
rLastProfile:: ds 1
UNION
rProfileData:: ds PROFILE_SIZE
NEXTU
rProfileName:: ds 3
rSwapABState:: ds 1
rRNGModeState:: ds 1
rRotModeState:: ds 1
rDropModeState:: ds 1
rSpeedCurveState:: ds 1
rAlways20GState:: ds 1
rSelectedStartLevel:: ds 2
rFilterMode:: ds 1
rBGMode:: ds 1
rUnused:: ds (PROFILE_SIZE - 13) ; 13 = sum of the above
ENDU
PROFILE 0
PROFILE 1
PROFILE 2
PROFILE 3
PROFILE 4
PROFILE 5
PROFILE 6
PROFILE 7
PROFILE 8
PROFILE 9
rScoreTableDMGT:: ds (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
rScoreTableTGM1:: ds (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
rScoreTableTGM3:: ds (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
rScoreTableDEAT:: ds (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
rScoreTableSHIR:: ds (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
rScoreTableCHIL:: ds (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
rScoreTableMYCO:: ds (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
SECTION "SRAM Variables", WRAM0
wTarget:: ds 1
SECTION "SRAM Functions", ROM0
; Check if our SRAM is initialized and of the correct version.
; Restores it if so, otherwise initializes it.
RestoreSRAM::
ld a, [rCheck]
cp a, "D"
jp nz, InitializeSRAM
ld a, [rCheck+1]
cp a, "M"
jp nz, InitializeSRAM
ld a, [rCheck+2]
cp a, "G"
jp nz, InitializeSRAM
ld a, [rCheck+3]
cp a, "T"
jp nz, InitializeSRAM
ld a, [rCheck+4]
or a, a
jp nz, InitializeSRAM
ld a, [rCheck+5]
cp a, 4
jp nz, InitializeSRAM
; SRAM is initialized and for this build, so we can load the data.
TrustedLoad:
ld a, [rSwapABState]
ld [wSwapABState], a
ld a, [rRNGModeState]
ld [wRNGModeState], a
ld a, [rRotModeState]
ld [wRotModeState], a
ld a, [rDropModeState]
ld [wDropModeState], a
ld a, [rSpeedCurveState]
ld [wSpeedCurveState], a
ld a, [rAlways20GState]
ld [wAlways20GState], a
ld a, [rProfileName]
ld [wProfileName], a
ld a, [rProfileName+1]
ld [wProfileName+1], a
ld a, [rProfileName+2]
ld [wProfileName+2], a
ld a, [rFilterMode]
ldh [hFilterMode], a
ld a, [rBGMode]
ld [wBGMode], a
; Restore the start level.
ld b, BANK_OTHER
rst RSTSwitchBank
ld a, [rSelectedStartLevel]
ld c, a
ld a, [rSelectedStartLevel+1]
ld b, a
ld a, [rSpeedCurveState]
ld d, a
add a, d
add a, d
ld e, a
ld d, 0
ld hl, .jumps
add hl, de
ld de, SCURVE_ENTRY_SIZE
jp hl
.jumps
jp .dmgt
jp .tgm1
jp .tgm3
jp .deat
jp .shir
jp .chil
jp .myco
jp .fallback
.dmgt
ld hl, sDMGTSpeedCurve
jp .search
.tgm1
ld hl, sTGM1SpeedCurve
jp .search
.tgm3
ld hl, sTGM3SpeedCurve
jp .search
.deat
ld hl, sDEATSpeedCurve
jp .search
.shir
ld hl, sSHIRSpeedCurve
jp .search
.chil
ld hl, sCHILSpeedCurve
jp .search
.myco
ld hl, sMYCOSpeedCurve
jp .search
.search
; HL = Speed curve table
; BC = Start level
; DE = Speed curve entry size
ld a, [hl+]
cp a, c
jr nz, .notfound
ld a, [hl]
cp a, b
jr nz, .notfound
; Found it!
dec hl
ld a, l
ldh [hStartSpeed], a
ld a, h
ldh [hStartSpeed+1], a
jp RSTRestoreBank
.notfound
dec hl
add hl, de
ld a, [hl]
cp a, $FF
jr nz, .search
.fallback
ld a, SCURVE_DMGT
ld [rSpeedCurveState], a
ld [wSpeedCurveState], a
ld hl, sDMGTSpeedCurve
ld a, l
ldh [hStartSpeed], a
ld a, h
ldh [hStartSpeed+1], a
xor a, a
ld [rSelectedStartLevel], a
ld [rSelectedStartLevel+1], a
jp RSTRestoreBank
; Initializes SRAM with default values.
InitializeSRAM:
; Set the magic id.
ld a, "D"
ld [rCheck], a
ld a, "M"
ld [rCheck+1], a
ld a, "G"
ld [rCheck+2], a
ld a, "T"
ld [rCheck+3], a
xor a, a
ld [rCheck+4], a
ld a, 4
ld [rCheck+5], a
xor a, a
ld [rLastProfile], a
; Load defaults.
ld a, "P"
ld [rProfileName], a
ld [wProfileName], a
ld a, "R"
ld [rProfileName+1], a
ld [wProfileName+1], a
ld a, "0"
ld [rProfileName+2], a
ld [wProfileName+2], a
ld a, BUTTON_MODE_NORM
ld [rSwapABState], a
ld [wSwapABState], a
ld a, RNG_MODE_TGM3
ld [rRNGModeState], a
ld [wRNGModeState], a
ld a, ROT_MODE_ARSTI
ld [rRotModeState], a
ld [wRotModeState], a
ld a, DROP_MODE_FIRM
ld [rDropModeState], a
ld [wDropModeState], a
ld a, SCURVE_DMGT
ld [rSpeedCurveState], a
ld [wSpeedCurveState], a
ld a, HIG_MODE_OFF
ld [rAlways20GState], a
ld [wAlways20GState], a
ld a, FILTER_MODE_DLRU
ld [rFilterMode], a
ldh [hFilterMode], a
ld a, BG_MODE_LITE
ld [rBGMode], a
ld [wBGMode], a
; Set to the default start level.
ld hl, sDMGTSpeedCurve
ld a, l
ldh [hStartSpeed], a
ld a, h
ldh [hStartSpeed+1], a
xor a, a
ld [rSelectedStartLevel], a
ld [rSelectedStartLevel+1], a
; Copy this profile to the other two.
ld hl, rProfileData0
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData1
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData2
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData3
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData4
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData5
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData6
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData7
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData8
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld hl, rProfileData9
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
ld a, "1"
ld [rProfileName1+2], a
ld a, "2"
ld [rProfileName2+2], a
ld a, "3"
ld [rProfileName3+2], a
ld a, "4"
ld [rProfileName4+2], a
ld a, "5"
ld [rProfileName5+2], a
ld a, "6"
ld [rProfileName6+2], a
ld a, "7"
ld [rProfileName7+2], a
ld a, "8"
ld [rProfileName8+2], a
ld a, "9"
ld [rProfileName9+2], a
ld a, 6
ld [wSelected], a
call ResetScores
ld a, 5
ld [wSelected], a
call ResetScores
ld a, 4
ld [wSelected], a
call ResetScores
ld a, 3
ld [wSelected], a
call ResetScores
ld a, 2
ld [wSelected], a
call ResetScores
ld a, 1
ld [wSelected], a
call ResetScores
xor a, a
ld [wSelected], a
; Set the default scores.
ResetScores::
ld a, [wSelected]
ld b, a
add a, b
add a, b
ld c, a
ld b, 0
ld hl, .jumps
add hl, bc
jp hl
.jumps
jp .dmgt
jp .tgm1
jp .tgm3
jp .deat
jp .shir
jp .chil
jp .myco
.dmgt
ld hl, rScoreTableDMGT
ld de, sHiscoreDefaultData
ld bc, (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
jp UnsafeMemCopy
.tgm1
ld hl, rScoreTableTGM1
ld de, sHiscoreDefaultData
ld bc, (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
jp UnsafeMemCopy
.tgm3
ld hl, rScoreTableTGM3
ld de, sHiscoreDefaultData
ld bc, (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
jp UnsafeMemCopy
.deat
ld hl, rScoreTableDEAT
ld de, sHiscoreDefaultData
ld bc, (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
jp UnsafeMemCopy
.shir
ld hl, rScoreTableSHIR
ld de, sHiscoreDefaultData
ld bc, (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
jp UnsafeMemCopy
.chil
ld hl, rScoreTableCHIL
ld de, sHiscoreDefaultData
ld bc, (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
jp UnsafeMemCopy
.myco
ld hl, rScoreTableMYCO
ld de, sHiscoreDefaultData
ld bc, (HISCORE_ENTRY_COUNT * HISCORE_ENTRY_SIZE)
jp UnsafeMemCopy
NextProfile::
ld a, [rLastProfile]
inc a
cp a, 10
jr nz, .update
xor a, a
.update
jp ChangeProfile
; Change to profile number in A.
ChangeProfile::
.backup
ld [wTarget], a
ld a, [rLastProfile]
or a, a
jr z, .first
cp a, 1
jr z, .second
cp a, 2
jr z, .third
cp a, 3
jr z, .fourth
cp a, 4
jr z, .fifth
cp a, 5
jr z, .sixth
cp a, 6
jr z, .seventh
cp a, 7
jr z, .eighth
cp a, 8
jr z, .ninth
cp a, 9
jr z, .tenth
ret
.first
ld hl, rProfileData0
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.second
ld hl, rProfileData1
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.third
ld hl, rProfileData2
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.fourth
ld hl, rProfileData3
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.fifth
ld hl, rProfileData4
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.sixth
ld hl, rProfileData5
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.seventh
ld hl, rProfileData6
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.eighth
ld hl, rProfileData7
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.ninth
ld hl, rProfileData8
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.tenth
ld hl, rProfileData9
ld de, rProfileData
ld bc, 64
call UnsafeMemCopy
jr .restore
.restore
ld a, [wTarget]
ld [rLastProfile], a
or a, a
jr z, .lfirst
cp a, 1
jr z, .lsecond
cp a, 2
jr z, .lthird
cp a, 3
jr z, .lfourth
cp a, 4
jr z, .lfifth
cp a, 5
jr z, .lsixth
cp a, 6
jr z, .lseventh
cp a, 7
jr z, .leighth
cp a, 8
jr z, .lninth
cp a, 9
jp z, .ltenth
ret
.lfirst
ld hl, rProfileData
ld de, rProfileData0
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.lsecond
ld hl, rProfileData
ld de, rProfileData1
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.lthird
ld hl, rProfileData
ld de, rProfileData2
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.lfourth
ld hl, rProfileData
ld de, rProfileData3
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.lfifth
ld hl, rProfileData
ld de, rProfileData4
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.lsixth
ld hl, rProfileData
ld de, rProfileData5
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.lseventh
ld hl, rProfileData
ld de, rProfileData6
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.leighth
ld hl, rProfileData
ld de, rProfileData7
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.lninth
ld hl, rProfileData
ld de, rProfileData8
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
.ltenth
ld hl, rProfileData
ld de, rProfileData9
ld bc, 64
call UnsafeMemCopy
jp TrustedLoad
ResetProfile::
ld a, "P"
ld [rProfileName], a
ld [wProfileName], a
ld a, "R"
ld [rProfileName+1], a
ld [wProfileName+1], a
ld a, [rLastProfile]
add a, "0"
ld [rProfileName+2], a
ld [wProfileName+2], a
ld a, BUTTON_MODE_NORM
ld [rSwapABState], a
ld [wSwapABState], a
ld a, RNG_MODE_TGM3
ld [rRNGModeState], a
ld [wRNGModeState], a
ld a, ROT_MODE_ARSTI
ld [rRotModeState], a
ld [wRotModeState], a
ld a, DROP_MODE_FIRM
ld [rDropModeState], a
ld [wDropModeState], a
ld a, SCURVE_DMGT
ld [rSpeedCurveState], a
ld [wSpeedCurveState], a
ld a, HIG_MODE_OFF
ld [rAlways20GState], a
ld [wAlways20GState], a
ld a, FILTER_MODE_DLRU
ld [rFilterMode], a
ldh [hFilterMode], a
; Set to the default start level.
ld hl, sDMGTSpeedCurve
ld a, l
ldh [hStartSpeed], a
ld a, h
ldh [hStartSpeed+1], a
xor a, a
ld [rSelectedStartLevel], a
ld [rSelectedStartLevel+1], a
ret
ENDC