From 81a0ae0672d430f4db51a7b90223cac8d1439d14 Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Wed, 25 Oct 2023 06:40:08 +0200 Subject: [PATCH] Convert to MBC5 --- .gitignore | 5 +- .vscode/launch.json | 1 - DMGTRIS.GBC | Bin 32768 -> 0 bytes Makefile | 50 +----------- README.md | 2 +- bin/DMGTRIS.GBC | Bin 0 -> 65536 bytes project.mk | 6 +- src/bankid.asm | 32 ++++++++ src/constants.asm | 2 +- src/include/globals.asm | 6 ++ src/main.asm | 105 +++---------------------- src/res/gameplay_map.inc | 2 +- src/res/tiles.inc | 2 +- src/res/title_map.inc | 2 +- src/sfx.asm | 17 ++++- src/sram.asm | 160 +++++++++++++++++++++++++++++++++++++++ 16 files changed, 234 insertions(+), 158 deletions(-) delete mode 100644 DMGTRIS.GBC create mode 100644 bin/DMGTRIS.GBC create mode 100644 src/bankid.asm create mode 100644 src/sram.asm diff --git a/.gitignore b/.gitignore index 82cc879..419b327 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ -/bin/ /obj/ /dep/ /res/ /tools/** /src/res/sources/*.z80 /src/res/sources/*.inc -DMGTRIS.sav +/bin/*.map +/bin/*.sym +/bin/*.sav diff --git a/.vscode/launch.json b/.vscode/launch.json index 38a3f7a..f009285 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,6 @@ "request": "launch", "name": "Launch in Emulicious", "program": "${workspaceFolder}\\bin\\DMGTRIS.gbc", - "emuliciousPath": "K:\\TGM\\dmgtris\\tools", "port": 58870, "stopOnEntry": false, "preLaunchTask": "buildrom" diff --git a/DMGTRIS.GBC b/DMGTRIS.GBC deleted file mode 100644 index acee39715de8570c7a2cf38bd5d6d7c4aa260f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 res/$*.pb16.size - -# Define how to compress files using the PackBits8 codec -# Compressor script requires Python 3 -res/%.pb8: res/% src/tools/pb8.py - @$(MKDIR_P) $(@D) - $(PY) src/tools/pb8.py $< res/$*.pb8 - -res/%.pb8.size: res/% - @$(MKDIR_P) $(@D) - $(call filesize,$<,8) > res/$*.pb8.size - -############################################### -# # -# COMPILATION # -# # -############################################### # How to build a ROM $(BINDIR)/%.$(ROMEXT) $(BINDIR)/%.sym $(BINDIR)/%.map: $(patsubst src/%.asm,$(OBJDIR)/%.o,$(SRCS)) @$(MKDIR_P) $(@D) - $(RGBASM) $(ASFLAGS) -o $(OBJDIR)/build_date.o src/res/build_date.asm - $(RGBLINK) $(LDFLAGS) -m $(BINDIR)/$*.map -n $(BINDIR)/$*.sym -o $(BINDIR)/$*.$(ROMEXT) $^ $(OBJDIR)/build_date.o \ + $(RGBLINK) $(LDFLAGS) -m $(BINDIR)/$*.map -n $(BINDIR)/$*.sym -o $(BINDIR)/$*.$(ROMEXT) $^ \ && $(RGBFIX) -v $(FIXFLAGS) $(BINDIR)/$*.$(ROMEXT) # `.mk` files are auto-generated dependency lists of the "root" ASM files, to save a lot of hassle. diff --git a/README.md b/README.md index 5cbd270..3a480ab 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ ScoreIncrement points are then awarded. ## Playing -You can build the game yourself, or use the binary [here](https://git.villadelfia.org/villadelfia/dmgtris/raw/branch/master/DMGTRIS.GBC) or [here](https://github.com/Villadelfia/DMGTRIS/raw/master/DMGTRIS.GBC). +You can build the game yourself, or use the binary [here](https://git.villadelfia.org/villadelfia/dmgtris/raw/branch/master/bin/DMGTRIS.GBC) or [here](https://github.com/Villadelfia/DMGTRIS/raw/master/bin/DMGTRIS.GBC). The game should run in any accurate emulator. For Windows or Linux using Wine [bgb](https://bgb.bircd.org/) is generally regarded as the best option. For macOS [SameBoy](https://sameboy.github.io/) comes recommended. diff --git a/bin/DMGTRIS.GBC b/bin/DMGTRIS.GBC new file mode 100644 index 0000000000000000000000000000000000000000..309339fd567ad2ac66097b2d15db56ea2d03b134 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/project.mk b/project.mk index a106ecc..ddf59e6 100644 --- a/project.mk +++ b/project.mk @@ -15,16 +15,12 @@ ROMNAME := DMGTRIS ROMEXT := GBC # Mapper -MAPPER := 0x03 +MAPPER := 0x1B # Extra assembler flags # Do not insert nop after halt ASFLAGS += -h -# Extra linker flags -# Tiny Rom -LDFLAGS += -t - # Extra fix flags # Set as gbc compatible FIXFLAGS += -c diff --git a/src/bankid.asm b/src/bankid.asm new file mode 100644 index 0000000..71ba494 --- /dev/null +++ b/src/bankid.asm @@ -0,0 +1,32 @@ +; DMGTRIS +; Copyright (C) 2023 - Randy Thiemann + +; 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 . + + +IF !DEF(BANKID_ASM) +DEF BANKID_ASM EQU 1 + + +SECTION "Bank ID 0", ROM0[$0] + db $00 + +SECTION "Bank ID 1", ROMX[$4000], BANK[1] + db $01 + +SECTION "Bank ID 2", ROMX[$4000], BANK[2] + db $02 + + +ENDC diff --git a/src/constants.asm b/src/constants.asm index 44116b0..e219018 100644 --- a/src/constants.asm +++ b/src/constants.asm @@ -65,7 +65,7 @@ CHARMAP "|", 126 CHARMAP "#", 125 -SECTION "Static Data", ROM0 +SECTION "Static Data", ROMX, BANK[1] sLeady:: db " READY? " sGo:: db " GO " sPause:: diff --git a/src/include/globals.asm b/src/include/globals.asm index 39eb04b..c4f0e80 100644 --- a/src/include/globals.asm +++ b/src/include/globals.asm @@ -93,6 +93,10 @@ MACRO lb ld \1, (LOW(\2) << 8) | LOW(\3) ENDM +DEF SAVE_MAGIC_0 EQU "D" +DEF SAVE_MAGIC_1 EQU "M" +DEF SAVE_MAGIC_2 EQU "G" +DEF SAVE_MAGIC_3 EQU "3" DEF PALETTE_REGULAR EQU %11100100 DEF PALETTE_INVERTED EQU %00011011 @@ -211,5 +215,7 @@ DEF FIELD_TOP_LEFT EQU $9800+1 DEF EASTER_0 EQU $9845 DEF EASTER_1 EQU $9865 +DEF rBANKID EQU $4000 + ENDC diff --git a/src/main.asm b/src/main.asm index f83d15f..acf9f8c 100644 --- a/src/main.asm +++ b/src/main.asm @@ -45,17 +45,6 @@ wInitialH:: ds 1 wInitialL:: ds 1 -SECTION "Persistent Globals", SRAM -rMagic:: ds 4 -rSwapABState:: ds 1 -rRNGModeState:: ds 1 -rRotModeState:: ds 1 -rDropModeState:: ds 1 -rSpeedCurveState:: ds 1 -rAlways20GState:: ds 1 -rSelectedStartLevel:: ds 2 - - SECTION "Stack", WRAM0 wStack:: ds STACK_SIZE + 1 @@ -95,6 +84,13 @@ Main:: ldh [rKEY1], a stop .notgbc + ; Initialize the mapper. + ld a, CART_SRAM_ENABLE + ld [rRAMG], a + xor a, a + ld [rRAMB], a + ld a, BANK("Static Data") + ld [rROMB0], a ; We use a single set of tiles for the entire game, so we copy it at the start. ld de, Tiles @@ -107,91 +103,8 @@ Main:: call SetNumberSpritePositions call CopyOAMHandler - ; Enable RAM. (Not actually needed since we don't ACTUALLY use an MBC, but without this emulators shit the bed.) - ld hl, rRAMG - ld a, CART_SRAM_ENABLE - ld [hl], a - - ; Check for save data. - ld a, [rMagic] - cp a, "D" - jr nz, .nosavedata - ld a, [rMagic+1] - cp a, "M" - jr nz, .nosavedata - ld a, [rMagic+2] - cp a, "G" - jr nz, .nosavedata - ld a, [rMagic+3] - cp a, "2" - jr nz, .nosavedata - -.savedata - 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, [rSelectedStartLevel] - ldh [hStartSpeed], a - ld a, [rSelectedStartLevel+1] - ldh [hStartSpeed+1], a - jr .otherinit - -.nosavedata - ld a, "D" - ld [rMagic], a - ld a, "M" - ld [rMagic+1], a - ld a, "G" - ld [rMagic+2], a - ld a, "2" - ld [rMagic+3], 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, RNG_MODE_TGM3 - ld [rRNGModeState], a - ld [wRNGModeState], a - - ld a, ROT_MODE_ARSTI - ld [rRotModeState], a - ld [wRotModeState], a - - ld a, DROP_MODE_SONIC - 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 hl, sSpeedCurve - ld a, l - ldh [hStartSpeed], a - ld [rSelectedStartLevel], a - ld a, h - ldh [hStartSpeed+1], a - ld [rSelectedStartLevel+1], a - -.otherinit + ; Other initialization. + call RestoreSRAM call TimeInit call IntrInit call InputInit diff --git a/src/res/gameplay_map.inc b/src/res/gameplay_map.inc index a299213..885f03a 100644 --- a/src/res/gameplay_map.inc +++ b/src/res/gameplay_map.inc @@ -19,7 +19,7 @@ IF !DEF(GAMEPLAY_MAP_INC) DEF GAMEPLAY_MAP_INC EQU 1 -SECTION "Gameplay Tilemap", ROM0 +SECTION "Gameplay Tilemap", ROMX, BANK[1] GameplayTilemap:: DB $02,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$03,$09,$01,$01,$01,$01,$01,$01,$09 diff --git a/src/res/tiles.inc b/src/res/tiles.inc index 3c58ceb..cacb0f7 100644 --- a/src/res/tiles.inc +++ b/src/res/tiles.inc @@ -18,7 +18,7 @@ IF !DEF(TILES_INC) DEF TILES_INC EQU 1 -SECTION "Tile data", ROM0 +SECTION "Tile data", ROMX, BANK[1] Tiles:: DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF diff --git a/src/res/title_map.inc b/src/res/title_map.inc index f190f69..c2d9a81 100644 --- a/src/res/title_map.inc +++ b/src/res/title_map.inc @@ -19,7 +19,7 @@ IF !DEF(TITLE_MAP_INC) DEF TITLE_MAP_INC EQU 1 -SECTION "Title Screen Tilemap", ROM0 +SECTION "Title Screen Tilemap", ROMX, BANK[1] TitleScreenTilemap:: DB $C3,$5B,$4C,$59,$4F,$5A,$5D,$4C,$01,$59 DB $5A,$61,$4C,$01,$FA,$FB,$FC,$FD,$FE,$FF diff --git a/src/sfx.asm b/src/sfx.asm index b65f009..4da20dd 100644 --- a/src/sfx.asm +++ b/src/sfx.asm @@ -61,7 +61,7 @@ DEF REG_WAVE_PATTERN_E EQU $3E DEF REG_WAVE_PATTERN_F EQU $3F -SECTION "SFX Data", ROM0 +SECTION "SFX Data", ROMX, BANK[2] sSFXPieceI:: db REG_NR12_CH1_VOLEV, $00, REG_NR14_CH1_FRQHI, $80, REG_NR22_CH2_VOLEV, $00, REG_NR24_CH2_FRQHI, $80 db REG_NR32_CH3_VOLUM, $00, REG_NR34_CH3_FRQHI, $80, REG_NR42_CH4_VOLEV, $00, REG_NR44_CH4_CNTRL, $80 @@ -2431,6 +2431,12 @@ SFXKill:: ; This play routine must be called every frame. SFXPlay:: + ; Bank to SFX bank. + ld a, [rBANKID] + ld e, a + ld a, BANK("SFX Data") + ld [rROMB0], a + ; Load the playhead position into HL. ldh a, [hPlayhead] ld l, a @@ -2439,7 +2445,10 @@ SFXPlay:: ; Nothing to do if it's a null ptr. or a, l - ret z + jr nz, .getRegister + ld a, e + ld [rROMB0], a + ret ; Otherwise, get the register to write to. .getRegister @@ -2449,6 +2458,8 @@ SFXPlay:: ; If it's $FE, then we're done. Check if there's more for us in the queue. cp a, $FE jr nz, :+ + ld a, e + ld [rROMB0], a call SFXProcessQueue ret @@ -2473,6 +2484,8 @@ SFXPlay:: ldh [hPlayhead], a ld a, h ldh [hPlayhead+1], a + ld a, e + ld [rROMB0], a ret diff --git a/src/sram.asm b/src/sram.asm new file mode 100644 index 0000000..96f32b4 --- /dev/null +++ b/src/sram.asm @@ -0,0 +1,160 @@ +; DMGTRIS +; Copyright (C) 2023 - Randy Thiemann + +; 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 . + + +IF !DEF(SRAM_ASM) +DEF SRAM_ASM EQU 1 + + +INCLUDE "globals.asm" + + +SECTION "Persistent Globals", SRAM +rMagic:: ds 4 +rCheck:: ds 6 +rSwapABState:: ds 1 +rRNGModeState:: ds 1 +rRotModeState:: ds 1 +rDropModeState:: ds 1 +rSpeedCurveState:: ds 1 +rAlways20GState:: ds 1 +rSelectedStartLevel:: ds 2 + + +SECTION "SRAM Functions", ROM0 +InitializeSRAM: + ; Set the magic id. + ld a, SAVE_MAGIC_0 + ld [rMagic], a + ld a, SAVE_MAGIC_1 + ld [rMagic+1], a + ld a, SAVE_MAGIC_2 + ld [rMagic+2], a + ld a, SAVE_MAGIC_3 + ld [rMagic+3], a + + ; Load defaults. + 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_SONIC + 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 + ; Falls through to the next label! + + +PartiallyInitializeSRAM: + ; Save build data. + ld a, LOW(__UTC_YEAR__) + ld [rCheck], a + ld a, __UTC_MONTH__ + ld [rCheck+1], a + ld a, __UTC_DAY__ + ld [rCheck+2], a + ld a, __UTC_HOUR__ + ld [rCheck+3], a + ld a, __UTC_MINUTE__ + ld [rCheck+4], a + ld a, __UTC_SECOND__ + ld [rCheck+5], a + + ; Set to the default start level. + ld hl, sSpeedCurve + ld a, l + ldh [hStartSpeed], a + ld [rSelectedStartLevel], a + ld a, h + ldh [hStartSpeed+1], a + ld [rSelectedStartLevel+1], a + ret + + +RestoreSRAM:: + ; Check if our SRAM is initialized at all. + ; If not, we load all the defaults. + ld a, [rMagic] + cp a, SAVE_MAGIC_0 + jr nz, InitializeSRAM + ld a, [rMagic+1] + cp a, SAVE_MAGIC_1 + jr nz, InitializeSRAM + ld a, [rMagic+2] + cp a, SAVE_MAGIC_2 + jp nz, InitializeSRAM + ld a, [rMagic+3] + cp a, SAVE_MAGIC_3 + jp nz, InitializeSRAM + + ; If SRAM is initialized, we still need to check if it's for this exact build. + ; If not, wipe data that is no longer valid. + ld a, [rCheck] + cp a, LOW(__UTC_YEAR__) + jr nz, PartiallyInitializeSRAM + ld a, [rCheck+1] + cp a, __UTC_MONTH__ + jr nz, PartiallyInitializeSRAM + ld a, [rCheck+2] + cp a, __UTC_DAY__ + jr nz, PartiallyInitializeSRAM + ld a, [rCheck+3] + cp a, __UTC_HOUR__ + jr nz, PartiallyInitializeSRAM + ld a, [rCheck+4] + cp a, __UTC_MINUTE__ + jr nz, PartiallyInitializeSRAM + ld a, [rCheck+5] + cp a, __UTC_SECOND__ + jr nz, PartiallyInitializeSRAM + + ; SRAM is initialized and for this build, so we can load the data. + 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, [rSelectedStartLevel] + ldh [hStartSpeed], a + ld a, [rSelectedStartLevel+1] + ldh [hStartSpeed+1], a + ret + + +ENDC