Convert to MBC5

This commit is contained in:
Randy Thiemann 2023-10-25 06:40:08 +02:00
parent de8f10f348
commit 81a0ae0672
16 changed files with 234 additions and 158 deletions

5
.gitignore vendored
View File

@ -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

1
.vscode/launch.json vendored
View File

@ -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"

Binary file not shown.

View File

@ -43,7 +43,7 @@ INCDIRS = src/ src/include/
WARNINGS = all extra
ASFLAGS = -p 0xFF $(addprefix -i,$(INCDIRS)) $(addprefix -W,$(WARNINGS))
LDFLAGS = -p 0xFF
FIXFLAGS = -p 0xFF -l 0x33 -r 0x02 -v -i $(GAMEID) -k $(LICENSEE) -t $(TITLE) -n $(VERSION) -m $(MAPPER)
FIXFLAGS = -p 0xFF -l 0x33 -r 0x04 -v -i $(GAMEID) -k $(LICENSEE) -t $(TITLE) -n $(VERSION) -m $(MAPPER)
# The list of "root" ASM files that RGBASM will be invoked on
SRCS = $(wildcard src/*.asm)
@ -52,11 +52,7 @@ SRCS = $(wildcard src/*.asm)
# Use this to override the above
include project.mk
################################################
# #
# TARGETS #
# #
################################################
# `all` (Default target): build the ROM
all: $(ROM)
@ -77,52 +73,12 @@ rebuild:
$(MAKE) all
.PHONY: rebuild
################################################
# #
# RESOURCE FILES #
# #
################################################
# By default, asset recipes convert files in `res/` into other files in `res/`
# This line causes assets not found in `res/` to be also looked for in `src/res/`
# "Source" assets can thus be safely stored there without `make clean` removing them
VPATH := src
res/%.1bpp: res/%.png
@$(MKDIR_P) $(@D)
$(RGBGFX) -d 1 -o $@ $<
# Define how to compress files using the PackBits16 codec
# Compressor script requires Python 3
res/%.pb16: res/% src/tools/pb16.py
@$(MKDIR_P) $(@D)
$(PY) src/tools/pb16.py $< res/$*.pb16
res/%.pb16.size: res/%
@$(MKDIR_P) $(@D)
$(call filesize,$<,16) > 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.

View File

@ -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.

BIN
bin/DMGTRIS.GBC Normal file

Binary file not shown.

View File

@ -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

32
src/bankid.asm Normal file
View File

@ -0,0 +1,32 @@
; 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(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

View File

@ -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::

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

160
src/sram.asm Normal file
View File

@ -0,0 +1,160 @@
; 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"
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