From b0510402aba80e534c85ba29aa8ffa6d7c5a2c17 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Wed, 16 Jun 2021 21:11:01 +0200 Subject: [PATCH] Add DEMO variant --- Makefile | 32 ++++++-- asm/bossDoor.s | 16 ++++ asm/code_080043E8.s | 5 ++ asm/code_080A3BD0.s | 11 +++ asm/code_080A5574.s | 29 +++++++ asm/fileScreen.s | 45 +++++++++++ asm/object3A.s | 4 + asm/playerItem/playerItem15.s | 24 ++++++ asm/sub_0807CA18.s | 113 ++++++++++++++++++++++++++- data/const/playerItem/playerItem15.s | 15 +++- data/data_08132B30.s | 2 + data/sprite_table.s | 5 ++ include/structures.h | 2 + linker.ld | 7 +- src/audio.c | 42 ++++++++++ src/code_0805436C.c | 2 + src/code_0805F9A0.c | 32 +++++++- src/eeprom.c | 9 +++ src/game.c | 13 +++ src/intro.c | 18 +++++ src/main.c | 17 +++- src/room.c | 24 ++++++ src/save.c | 51 +++++++++++- src/sub_080A3B84.c | 2 + tmc_demo.sha1 | 1 + tmc_eu.sha1 | 1 + tmc_jp.sha1 | 1 + 27 files changed, 511 insertions(+), 12 deletions(-) create mode 100644 tmc_demo.sha1 create mode 100644 tmc_eu.sha1 create mode 100644 tmc_jp.sha1 diff --git a/Makefile b/Makefile index 7d2aedb6..f18c9cb9 100644 --- a/Makefile +++ b/Makefile @@ -5,17 +5,34 @@ COMPARE ?= 0 CPP := $(CC) -E LD := $(DEVKITARM)/bin/arm-none-eabi-ld -GAME_VERSION := THEMINISHCAP +GAME_VERSION ?= USA REVISION := 0 GAME_LANGUAGE := ENGLISH TITLE := GBAZELDA MC -GAME_CODE := BZME MAKER_CODE := 01 +ifeq ($(GAME_VERSION), USA) +GAME_CODE := BZME +BUILD_NAME := tmc +else +ifeq ($(GAME_VERSION), DEMO) +GAME_CODE := BZHE +BUILD_NAME := tmc +else +ifeq ($(GAME_VERSION), JP) +GAME_CODE := BZMJ +BUILD_NAME := tmc +else +$(error unknown version $(GAME_VERSION)) +endif +endif +endif + + SHELL := /bin/bash -o pipefail -BUILD_NAME := tmc + ROM := $(BUILD_NAME).gba OBJ_DIR := build/$(BUILD_NAME) @@ -120,11 +137,11 @@ MAKEFLAGS += --no-print-directory AUTO_GEN_TARGETS := all: $(ROM) - @$(SHA1) tmc.sha1 + @$(SHA1) $(BUILD_NAME).sha1 # kept for backwards compat compare: $(ROM) - @$(SHA1) tmc.sha1 + @$(SHA1) $(BUILD_NAME).sha1 setup: $(TOOLDIRS) @@ -205,3 +222,8 @@ $(ELF): $(OBJS) linker.ld $(ROM): $(ELF) $(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x9000000 $< $@ + +usa: ; @$(MAKE) GAME_VERSION=USA +demo: ; @$(MAKE) GAME_VERSION=DEMO +jp: ; @$(MAKE) GAME_VERSION=JP +eu: ; @$(MAKE) GAME_VERSION=EU \ No newline at end of file diff --git a/asm/bossDoor.s b/asm/bossDoor.s index 408d22b4..9e68f193 100644 --- a/asm/bossDoor.s +++ b/asm/bossDoor.s @@ -591,7 +591,11 @@ sub_0808C650: @ 0x0808C650 movs r0, #0 b _0808C674 .align 2, 0 +.ifdef DEMO +_0808C66C: .4byte gUnk_02036BB0 +.else _0808C66C: .4byte gUnk_02036BB8 +.endif _0808C670: ldr r1, _0808C678 @ =gUnk_02036BB8 movs r0, #1 @@ -599,7 +603,11 @@ _0808C674: str r0, [r1] pop {r4, pc} .align 2, 0 +.ifdef DEMO +_0808C678: .4byte gUnk_02036BB0 +.else _0808C678: .4byte gUnk_02036BB8 +.endif thumb_func_start sub_0808C67C sub_0808C67C: @ 0x0808C67C @@ -607,7 +615,11 @@ sub_0808C67C: @ 0x0808C67C ldr r0, [r0] bx lr .align 2, 0 +.ifdef DEMO +_0808C684: .4byte gUnk_02036BB0 +.else _0808C684: .4byte gUnk_02036BB8 +.endif thumb_func_start sub_0808C688 sub_0808C688: @ 0x0808C688 @@ -618,4 +630,8 @@ sub_0808C688: @ 0x0808C688 str r0, [r1] pop {pc} .align 2, 0 +.ifdef DEMO +_0808C698: .4byte gUnk_02036BB0 +.else _0808C698: .4byte gUnk_02036BB8 +.endif diff --git a/asm/code_080043E8.s b/asm/code_080043E8.s index 349924f6..dc71580b 100644 --- a/asm/code_080043E8.s +++ b/asm/code_080043E8.s @@ -2254,7 +2254,12 @@ gUnk_08007CAC:: @ 08007CAC .incbin "baserom.gba", 0x007CAC, 0x000005B gUnk_08007D07:: @ 08007D07 +.ifdef DEMO +@ TODO only one byte differs + .incbin "baserom_demo.gba", 0x007D07, 0x00000CF +.else .incbin "baserom.gba", 0x007D07, 0x00000CF +.endif non_word_aligned_thumb_func_start sub_08007DD6 sub_08007DD6: @ 0x08007DD6 diff --git a/asm/code_080A3BD0.s b/asm/code_080A3BD0.s index 328566f3..b3807006 100644 --- a/asm/code_080A3BD0.s +++ b/asm/code_080A3BD0.s @@ -1206,6 +1206,10 @@ _080A45A2: thumb_func_start sub_080A45A4 sub_080A45A4: @ 0x080A45A4 +.ifdef DEMO + bx lr + .align 2, 0 +.else push {lr} bl FlushSprites ldr r0, _080A45C4 @ =gUnk_02032EC0 @@ -1244,6 +1248,7 @@ _080A45E0: .align 2, 0 _080A4600: .4byte gUnk_0812814C _080A4604: .4byte gMenu +.endif thumb_func_start sub_080A4608 sub_080A4608: @ 0x080A4608 @@ -2890,9 +2895,15 @@ _080A52DC: .4byte gInput _080A52E0: cmp r4, #0x10 bne _080A52EC +.ifdef DEMO + movs r0, #0x6d + bl SoundReq + b _080A5336 +.else movs r0, #0xb bl sub_080A4E84 b _080A530A +.endif _080A52EC: ldr r0, _080A5314 @ =gMenu adds r0, #0x10 diff --git a/asm/code_080A5574.s b/asm/code_080A5574.s index d8bfcee6..51824e3f 100644 --- a/asm/code_080A5574.s +++ b/asm/code_080A5574.s @@ -202,7 +202,11 @@ _080A570C: cmp r0, #1 bne _080A575E ldrb r3, [r2, #3] + .ifdef DEMO + movs r4, #0 + .else movs r1, #0 + .endif cmp r3, #2 beq _080A572E cmp r3, #2 @@ -223,23 +227,48 @@ _080A572E: ldrb r0, [r0] cmp r0, #0 beq _080A574E + .ifdef DEMO + movs r4, #8 + .else movs r1, #8 + .endif cmp r3, #0 bne _080A574E + .ifdef DEMO + movs r4, #7 + .else movs r1, #7 + .endif b _080A5752 .align 2, 0 _080A5744: .4byte gMenu _080A5748: +.ifdef DEMO + movs r0, #0x6d + bl SoundReq + b _080A574E +_080A574C: + movs r0, #0x6d + bl SoundReq +.else movs r1, #9 b _080A5752 _080A574C: movs r1, #0xa +.endif _080A574E: + .ifdef DEMO + cmp r4, #0 + .else cmp r1, #0 + .endif beq _080A575E _080A5752: + .ifdef DEMO + adds r0, r4, #0 + .else adds r0, r1, #0 + .endif bl sub_080A4E84 movs r0, #0x6a bl SoundReq diff --git a/asm/fileScreen.s b/asm/fileScreen.s index d743ac41..eee2baba 100755 --- a/asm/fileScreen.s +++ b/asm/fileScreen.s @@ -5,6 +5,45 @@ .text +.ifdef DEMO + thumb_func_start HandleGameplayScreen +HandleGameplayScreen: @ 08051A28 + push {r4, lr} + ldr r1, _08051A68 @ =0x030010A0 + ldr r0, [r1, #0x00] + adds r0, #0x01 + str r0, [r1, #0x00] + ldr r1, _08051A6C @ =0x080FC55C + ldr r4, _08051A70x @ =0x03001000 + ldrb r0, [r4, #0x03] + lsls r0, r0, #0x02 + adds r0, r0, r1 + ldr r0, [r0, #0x00] + bl _call_via_r0 + ldr r0, _08051A74x @ =0x02002A40 + movs r2, #0x95 + lsls r2, r2, #0x03 + adds r1, r0, r2 + ldr r0, [r1, #0x00] + cmp r0, #0x00 + beq _08051A64 + subs r0, #0x01 + str r0, [r1, #0x00] + cmp r0, #0x00 + bne _08051A64 + movs r0, #0x07 + movs r1, #0x02 + bl DoFade + movs r0, #0x03 + strb r0, [r4, #0x03] +_08051A64: + pop {r4, pc} + .byte 0x00, 0x00 +_08051A68: .4byte 0x030010A0 @TODO ptr +_08051A6C: .4byte 0x080FC55C @TODO ptr +_08051A70x: .4byte 0x03001000 @TODO ptr +_08051A74x: .4byte 0x02002A40 @TODO ptr +.else thumb_func_start HandleGameplayScreen HandleGameplayScreen: @ 0x08051988 push {lr} @@ -24,6 +63,8 @@ HandleGameplayScreen: @ 0x08051988 _080519A4: .4byte gScreenTransition _080519A8: .4byte gUnk_080FC9D8 _080519AC: .4byte gMain +.endif + thumb_func_start sub_080519B0 sub_080519B0: @ 0x080519B0 @@ -382,6 +423,9 @@ _08051D28: .4byte gScreenTransition thumb_func_start sub_08051D2C sub_08051D2C: @ 0x08051D2C +.ifdef DEMO + .incbin "baserom_demo.gba", 0x051df4, 0x14 @nocheckin +.else push {lr} movs r0, #7 movs r1, #8 @@ -390,6 +434,7 @@ sub_08051D2C: @ 0x08051D2C bl InitScreen pop {pc} .align 2, 0 +.endif thumb_func_start InitializeEntities InitializeEntities: @ 0x08051D40 diff --git a/asm/object3A.s b/asm/object3A.s index a884af27..859edc8b 100644 --- a/asm/object3A.s +++ b/asm/object3A.s @@ -223,7 +223,11 @@ _0808C828: bl sub_0801E49C pop {r4, r5, r6, pc} .align 2, 0 +.ifdef DEMO +_0808C83C: .4byte gUnk_02036BB0 +.else _0808C83C: .4byte gUnk_02036BB8 +.endif thumb_func_start sub_0808C840 sub_0808C840: @ 0x0808C840 diff --git a/asm/playerItem/playerItem15.s b/asm/playerItem/playerItem15.s index 90211b70..d8aeb205 100644 --- a/asm/playerItem/playerItem15.s +++ b/asm/playerItem/playerItem15.s @@ -199,3 +199,27 @@ _080A31FC: _080A3200: pop {r4, r5, pc} .align 2, 0 + + + + +// DEMO only functions + +.ifdef DEMO +// @nocheckin +thumb_func_start HandleChooseDemoScreen +HandleChooseDemoScreen: @ 0x080A2E18 +.incbin "baserom_demo.gba", 0x0a2e18, 0x28 + +thumb_func_start sub_080A2E40 +sub_080A2E40: @ 0x080A2E40 +.incbin "baserom_demo.gba", 0x0a2e40, 0x14c + +thumb_func_start sub_080A2F8C +sub_080A2F8C: @ 0x080A2F8C +.incbin "baserom_demo.gba", 0x0A2F8C, 0x44 + +thumb_func_start sub_080A2FD0 +sub_080A2FD0: @ 0x080A2FD0 +.incbin "baserom_demo.gba", 0x0A2FD0, 0x210 +.endif diff --git a/asm/sub_0807CA18.s b/asm/sub_0807CA18.s index a4a4631a..34669d14 100644 --- a/asm/sub_0807CA18.s +++ b/asm/sub_0807CA18.s @@ -4,7 +4,117 @@ .syntax unified .text - + +.ifdef DEMO +thumb_func_start sub_0807CA18 +sub_0807CA18: + push {r4, r5, r6, lr} + ldr r4, _0807CA38 @ =0x02002A40 + ldrh r1, [r4, #0x00] + movs r0, #0x80 + lsls r0, r0, #0x01 + cmp r1, r0 + beq _0807C9BA + movs r2, #0x00 + strb r2, [r4, #0x00] + movs r3, #0x01 + strb r3, [r4, #0x01] + strb r3, [r4, #0x08] + adds r1, r4, #0x0 + adds r1, #0xAA + movs r0, #0x18 + strb r0, [r1, #0x00] + adds r1, #0x01 + strb r0, [r1, #0x00] + subs r1, #0x23 + movs r0, #0x22 + strb r0, [r1, #0x00] + adds r1, #0x01 + movs r0, #0x15 + strb r0, [r1, #0x00] + adds r0, r4, #0x0 + adds r0, #0x8A + strb r2, [r0, #0x00] + adds r0, #0x01 + strb r2, [r0, #0x00] + adds r0, #0x05 + strb r3, [r0, #0x00] + adds r1, #0x03 + movs r0, #0x90 + strh r0, [r1, #0x00] + adds r1, #0x02 + movs r0, #0x38 + strh r0, [r1, #0x00] +_0807C9BA: + adds r5, r4, #0x0 + adds r5, #0x80 + ldrb r0, [r5, #0x00] + cmp r0, #0x00 + bne _0807C9CE + ldr r0, _0807CA3C @ =0x0811DFF4 + adds r1, r5, #0x0 + movs r2, #0x05 + bl MemCopy +_0807C9CE: + ldr r1, _0807CA40 @ =0x0811EF10 + movs r6, #0x80 + lsls r6, r6, #0x12 + ldrb r0, [r6, #0x04] + lsls r0, r0, #0x02 + adds r0, r0, r1 + ldr r0, [r0, #0x00] + ldr r2, _0807CA44 @ =0x000004B4 + adds r1, r4, #0x0 + bl MemCopy + ldrb r0, [r6, #0x07] + adds r2, r0, #0x0 + cmp r2, #0x00 + bne _0807CA04 + movs r0, #0x97 + strb r0, [r5, #0x00] + adds r1, r4, #0x0 + adds r1, #0x81 + movs r0, #0x7F + strb r0, [r1, #0x00] + adds r1, #0x01 + movs r0, #0xDD + strb r0, [r1, #0x00] + adds r0, r4, #0x0 + adds r0, #0x83 + strb r2, [r0, #0x00] +_0807CA04: + movs r0, #0xA0 + bl ModHealth + ldr r0, _0807CA48 @ =0xFFFFD8F1 + bl ModRupees + ldr r0, _0807CA4C @ =0x02000010 + ldrb r1, [r0, #0x07] + lsls r0, r1, #0x01 + adds r0, r0, r1 + ldr r1, _0807CA50 @ =0x0811DFF9 + adds r0, r0, r1 + movs r1, #0x95 + lsls r1, r1, #0x03 + adds r2, r4, r1 + ldrb r1, [r6, #0x04] + adds r0, r0, r1 + ldrb r1, [r0, #0x00] + lsls r0, r1, #0x03 + subs r0, r0, r1 + lsls r0, r0, #0x05 + adds r0, r0, r1 + lsls r0, r0, #0x04 + str r0, [r2, #0x00] + movs r0, #0x01 + pop {r4, r5, r6, pc} +_0807CA38: .4byte 0x02002A40 @TODO ptr +_0807CA3C: .4byte 0x0811DFF4 @TODO ptr +_0807CA40: .4byte 0x0811EF10 @TODO ptr +_0807CA44: .4byte 0x000004B4 +_0807CA48: .4byte 0xFFFFD8F1 +_0807CA4C: .4byte 0x02000010 @TODO ptr +_0807CA50: .4byte 0x0811DFF9 @TODO ptr +.else thumb_func_start sub_0807CA18 sub_0807CA18: @ 0x0807CA18 push {lr} @@ -61,3 +171,4 @@ _0807CA78: .align 2, 0 _0807CA7C: .4byte gSave _0807CA80: .4byte gUnk_0811E470 +.endif diff --git a/data/const/playerItem/playerItem15.s b/data/const/playerItem/playerItem15.s index 4e7e02f0..b97be21a 100644 --- a/data/const/playerItem/playerItem15.s +++ b/data/const/playerItem/playerItem15.s @@ -7,6 +7,19 @@ gUnk_08127270:: @ 08127270 .4byte sub_080A3084 .4byte sub_080A310C - + gUnk_08127278:: @ 08127278 .incbin "baserom.gba", 0x127278, 0x0000008 + +.ifdef DEMO +@ TODO choose demo screen +something: + .4byte sub_080A2E40 + .4byte sub_080A2FD0 + .4byte sub_080A2F8C + +something2:: +.incbin "baserom_demo.gba", 0x127c98, 0x38 @nocheckin +.endif + + diff --git a/data/data_08132B30.s b/data/data_08132B30.s index 43525397..4536feb3 100644 --- a/data/data_08132B30.s +++ b/data/data_08132B30.s @@ -2477,6 +2477,7 @@ gUnk_0813A7F0:: @ 0813A7F0 .4byte gUnk_08133FDC .4byte gUnk_08133FDC .4byte gUnk_08133FDC + .ifndef DEMO .4byte gUnk_08139108 .4byte gUnk_081391D0 .4byte gUnk_081391FC @@ -2485,6 +2486,7 @@ gUnk_0813A7F0:: @ 0813A7F0 .4byte gUnk_08133FDC .4byte gUnk_08133FDC .4byte gUnk_08133FDC + .endif .4byte gUnk_081395D8 .4byte gUnk_08139714 .4byte gUnk_08138848 diff --git a/data/sprite_table.s b/data/sprite_table.s index 0d54adbb..eee54c38 100644 --- a/data/sprite_table.s +++ b/data/sprite_table.s @@ -9,3 +9,8 @@ gUnk_089FB770:: @ 089FB770 gUnk_089FB780:: @ 089FB780 .incbin "baserom.gba", 0x9FB780, 0x0000F44 + +@ More sprites in demo +.ifdef DEMO + .incbin "baserom_demo.gba", 0x9FD0F4, 0x984c +.endif diff --git a/include/structures.h b/include/structures.h index 4b5d3e17..a94d66ce 100644 --- a/include/structures.h +++ b/include/structures.h @@ -30,6 +30,8 @@ typedef struct { s32 signature; u8 field_0x4; u8 listenForKeyPresses; + u8 field_0x6; + u8 field_0x7; } struct_02000010; extern struct_02000010 gUnk_02000010; diff --git a/linker.ld b/linker.ld index f093f9f7..bdb25db7 100644 --- a/linker.ld +++ b/linker.ld @@ -152,10 +152,15 @@ SECTIONS { . = 0x00036A38; gCurrentWindow = .; . = 0x00036A40; gNewWindow = .; . = 0x00036A50; gEEPROMConfig = .; + . = 0x00036A50; gUnk_02036A50 = .; /* DEMO is 8 bytes earlier due to missing eeprom*/ . = 0x00036A58; gUnk_02036A58 = .; - . = 0x00036AD8; gUnk_02036AD8 = .; + . = 0x00036AD0; gUnk_02036AD0 = .; /* DEMO is 8 bytes earlier due to missing eeprom*/ + . = 0x00036AD8; gUnk_02036AD8 = .; + . = 0x00036BB0; gUnk_02036BB0 = .; /* DEMO is 8 bytes earlier due to missing eeprom*/ . = 0x00036BB8; gUnk_02036BB8 = .; + . = 0x00036BB8; gMPlayTracksDEMO = .; /* DEMO is 8 bytes earlier due to missing eeprom*/ . = 0x00036BC0; gMPlayTracks = .; + . = 0x00038558; gUnk_02038558 = .; /* DEMO is 8 bytes earlier due to missing eeprom*/ . = 0x00038560; gUnk_02038560 = .; . = 0x00040000; } >ewram diff --git a/src/audio.c b/src/audio.c index 580a940e..39e1cfdd 100644 --- a/src/audio.c +++ b/src/audio.c @@ -742,7 +742,11 @@ extern const SongHeader sfx21F; extern const SongHeader sfx220; extern const SongHeader sfx221; +#ifdef DEMO +extern MusicPlayerTrack gMPlayTracksDEMO[]; +#else extern MusicPlayerTrack gMPlayTracks[]; +#endif extern MusicPlayerInfo gMPlayInfos[0x1C]; extern u8 gMPlayMemAccArea[0x10]; @@ -783,6 +787,43 @@ typedef enum { MUSIC_PLAYER_BGM, } MusicPlayerE; + +#ifdef DEMO +const MusicPlayer gMusicPlayers[] = { + [MUSIC_PLAYER_00] = { &gMPlayInfos[0x08], &gMPlayTracksDEMO[0x00], 2, 1 }, + [MUSIC_PLAYER_PLY_VO] = { &gMPlayInfos[0x12], &gMPlayTracksDEMO[0x02], 1, 1 }, + [MUSIC_PLAYER_02] = { &gMPlayInfos[0x13], &gMPlayTracksDEMO[0x03], 1, 1 }, + [MUSIC_PLAYER_03] = { &gMPlayInfos2[0x2], &gMPlayTracksDEMO[0x04], 2, 1 }, + [MUSIC_PLAYER_04] = { &gMPlayInfos[0x1B], &gMPlayTracksDEMO[0x06], 2, 1 }, + [MUSIC_PLAYER_05] = { &gMPlayInfos[0x03], &gMPlayTracksDEMO[0x08], 2, 1 }, + [MUSIC_PLAYER_06] = { &gMPlayInfos[0x07], &gMPlayTracksDEMO[0x0A], 2, 1 }, + [MUSIC_PLAYER_07] = { &gMPlayInfos[0x11], &gMPlayTracksDEMO[0x0C], 2, 1 }, + [MUSIC_PLAYER_08] = { &gMPlayInfos2[0x1], &gMPlayTracksDEMO[0x0E], 2, 1 }, + [MUSIC_PLAYER_09] = { &gMPlayInfos[0x06], &gMPlayTracksDEMO[0x10], 2, 1 }, + [MUSIC_PLAYER_0A] = { &gMPlayInfos[0x14], &gMPlayTracksDEMO[0x12], 2, 1 }, + [MUSIC_PLAYER_0B] = { &gMPlayInfos2[0x3], &gMPlayTracksDEMO[0x14], 2, 1 }, + [MUSIC_PLAYER_0C] = { &gMPlayInfos[0x19], &gMPlayTracksDEMO[0x16], 2, 1 }, + [MUSIC_PLAYER_0D] = { &gMPlayInfos[0x02], &gMPlayTracksDEMO[0x18], 2, 1 }, + [MUSIC_PLAYER_0E] = { &gMPlayInfos[0x0E], &gMPlayTracksDEMO[0x1A], 2, 1 }, + [MUSIC_PLAYER_0F] = { &gMPlayInfos[0x18], &gMPlayTracksDEMO[0x1C], 2, 1 }, + [MUSIC_PLAYER_10] = { &gMPlayInfos[0x05], &gMPlayTracksDEMO[0x1E], 2, 1 }, + [MUSIC_PLAYER_11] = { &gMPlayInfos[0x1A], &gMPlayTracksDEMO[0x20], 2, 1 }, + [MUSIC_PLAYER_12] = { &gMPlayInfos[0x0D], &gMPlayTracksDEMO[0x22], 2, 1 }, + [MUSIC_PLAYER_13] = { &gMPlayInfos[0x00], &gMPlayTracksDEMO[0x24], 2, 1 }, + [MUSIC_PLAYER_14] = { &gMPlayInfos[0x0A], &gMPlayTracksDEMO[0x26], 2, 1 }, + [MUSIC_PLAYER_15] = { &gMPlayInfos[0x0C], &gMPlayTracksDEMO[0x28], 2, 1 }, + [MUSIC_PLAYER_16] = { &gMPlayInfos[0x17], &gMPlayTracksDEMO[0x2A], 2, 1 }, + [MUSIC_PLAYER_17] = { &gMPlayInfos[0x01], &gMPlayTracksDEMO[0x2C], 2, 1 }, + [MUSIC_PLAYER_18] = { &gMPlayInfos[0x0B], &gMPlayTracksDEMO[0x2E], 2, 1 }, + [MUSIC_PLAYER_19] = { &gMPlayInfos[0x15], &gMPlayTracksDEMO[0x30], 2, 1 }, + [MUSIC_PLAYER_1A] = { &gMPlayInfos[0x09], &gMPlayTracksDEMO[0x32], 2, 1 }, + [MUSIC_PLAYER_1B] = { &gMPlayInfos2[0x0], &gMPlayTracksDEMO[0x34], 2, 1 }, + [MUSIC_PLAYER_1C] = { &gMPlayInfos[0x0F], &gMPlayTracksDEMO[0x36], 2, 1 }, + [MUSIC_PLAYER_1D] = { &gMPlayInfos[0x16], &gMPlayTracksDEMO[0x38], 2, 1 }, + [MUSIC_PLAYER_1E] = { &gMPlayInfos[0x04], &gMPlayTracksDEMO[0x3A], 0xc, 0 }, + [MUSIC_PLAYER_BGM] = { &gMPlayInfos[0x10], &gMPlayTracksDEMO[0x46], 0xc, 0 }, +}; +#else const MusicPlayer gMusicPlayers[] = { [MUSIC_PLAYER_00] = { &gMPlayInfos[0x08], &gMPlayTracks[0x00], 2, 1 }, [MUSIC_PLAYER_PLY_VO] = { &gMPlayInfos[0x12], &gMPlayTracks[0x02], 1, 1 }, @@ -817,6 +858,7 @@ const MusicPlayer gMusicPlayers[] = { [MUSIC_PLAYER_1E] = { &gMPlayInfos[0x04], &gMPlayTracks[0x3A], 0xc, 0 }, [MUSIC_PLAYER_BGM] = { &gMPlayInfos[0x10], &gMPlayTracks[0x46], 0xc, 0 }, }; +#endif const Song gSongTable[] = { [SFX_NONE] = { &sfxNone, MUSIC_PLAYER_BGM, MUSIC_PLAYER_BGM }, diff --git a/src/code_0805436C.c b/src/code_0805436C.c index 61dfa3e0..21934343 100644 --- a/src/code_0805436C.c +++ b/src/code_0805436C.c @@ -265,5 +265,7 @@ u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { */ void sub_08054870(void) { + #ifndef DEMO gUnk_080FE2A0[gMenu.menuType](); + #endif } diff --git a/src/code_0805F9A0.c b/src/code_0805F9A0.c index 856357d5..612c4371 100644 --- a/src/code_0805F9A0.c +++ b/src/code_0805F9A0.c @@ -4,9 +4,14 @@ #include "functions.h" extern u16 gUnk_081092D4; -extern u8 gUnk_02036AD8; extern u8 gUnk_081094CE; +#ifdef DEMO +extern u8 gUnk_02036AD0; +extern u8 gUnk_02036A50; +#else +extern u8 gUnk_02036AD8; extern u8 gUnk_02036A58; +#endif extern void* gUnk_081092AC[]; typedef struct { @@ -59,7 +64,11 @@ void sub_0805F820(WStruct* r0, u32* r1) { VStruct* temp3; if (r0->unk4 - r0->unk6 > 0) { + #ifdef DEMO + sub_08002724(r1, &gUnk_02036A50); + #else sub_08002724(r1, &gUnk_02036A58); + #endif if (r0->unk1 == 0) { u32 tmp = sub_0805F7A0(*r1); uVar6 = tmp & 0xf; @@ -77,7 +86,11 @@ void sub_0805F820(WStruct* r0, u32* r1) { uVar3 = uVar4; } + #ifdef DEMO + puVar8 = &gUnk_02036A50 + uVar6; + #else puVar8 = &gUnk_02036A58 + uVar6; + #endif temp2 = r0->unk8; temp = gUnk_0810942E[r0->unk3].filler0[r0->unk2 * 2]; uVar7 = r0->unk6; @@ -120,23 +133,40 @@ void sub_0805F918(u32 idx, u32 idx2, void* dest) { u8* temp; u8* temp2; + #ifdef DEMO + MemFill32(sub_0805F8F8(idx2), &gUnk_02036AD0, 0xe0); + #else MemFill32(sub_0805F8F8(idx2), &gUnk_02036AD8, 0xe0); + #endif puVar1 = gUnk_081092AC[idx]; temp = &gUnk_081094CE + idx2 * 0xc0; idx3 = 0; for (i = 0; i < 3; i++) { + #ifdef DEMO + puVar2 = &gUnk_02036A50; + sub_08002724(puVar1, &gUnk_02036A50); + #else puVar2 = &gUnk_02036A58; sub_08002724(puVar1, &gUnk_02036A58); + #endif puVar1 += 0x40; for (j = 0; j < 8; j++) { + #ifdef DEMO + sub_080026C4(puVar2, &gUnk_02036AD0, temp, idx3); + #else sub_080026C4(puVar2, &gUnk_02036AD8, temp, idx3); + #endif puVar2++; idx3++; } } + #ifdef DEMO + LoadResourceAsync((const void*)&gUnk_02036AD0, (u32)dest, 0xe0); + #else LoadResourceAsync((const void*)&gUnk_02036AD8, (u32)dest, 0xe0); + #endif } u32 sub_0805F9A0(u32 r0) { diff --git a/src/eeprom.c b/src/eeprom.c index 4ea218b3..945c788f 100644 --- a/src/eeprom.c +++ b/src/eeprom.c @@ -1,6 +1,10 @@ #include "global.h" #include "gba/eeprom.h" +#ifdef DEMO +const u8 unk[] = {0xff, 0xff, 0xff, 0xff}; +const u8 padding[0x18] = {}; +#else typedef struct EEPROMConfig { u32 unk_00; u16 size; @@ -9,6 +13,7 @@ typedef struct EEPROMConfig { // u8 filler[3]; } EEPROMConfig; + const char EEPROM_V124[] = "EEPROM_V124"; extern const EEPROMConfig* gEEPROMConfig; const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; @@ -16,6 +21,8 @@ const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; u16 EEPROMWrite(u16, const u16*, u8); + + u16 EEPROMConfigure(u16 unk_1) { u16 ret; @@ -248,3 +255,5 @@ u16 EEPROMWrite0_8k_Check(u16 address, const u16* data) { } const char thing[0x1c] = "\xff\xff\xff\xff"; + +#endif \ No newline at end of file diff --git a/src/game.c b/src/game.c index 49fe233f..4117416d 100644 --- a/src/game.c +++ b/src/game.c @@ -61,10 +61,15 @@ void sub_0805212C(void) { gMenu.transitionTimer--; if (gMenu.transitionTimer == 0) { sub_080520C4(2); + #ifdef DEMO + SoundReq(0x80080000); + DoFade(7,4); + #else sub_08052418(0, 0); gScreen.lcd.displayControl |= 0x600; gFadeControl.field_0x4 = 0xffff; DoFade(4, 0x10); + #endif } } } else { @@ -72,6 +77,13 @@ void sub_0805212C(void) { } } +#ifdef DEMO +void sub_080521A0(void) { + if (gFadeControl.active == 0) { + DoSoftReset(); + } +} +#else void sub_080521A0(void) { s32 temp3; u32 temp2; @@ -147,6 +159,7 @@ void sub_080521A0(void) { break; } } +#endif void sub_080522F4(void) { switch (gMenu.menuType) { diff --git a/src/intro.c b/src/intro.c index 8eca40dc..33e87e6c 100644 --- a/src/intro.c +++ b/src/intro.c @@ -104,6 +104,24 @@ static void HandleNintendoCapcomLogos(void) { gScreen.bg.bg1Updated = 1; DoFade(6, 8); advance = ADVANCE_NONE; + #ifdef DEMO + if (gUnk_02000010.listenForKeyPresses == 0) { + if ((gInput.heldKeys & 0x204) == 0x204) { // TODO + gUnk_02000010.field_0x7 = 1; + SoundReq(0x73); + } + else { + if ((gInput.heldKeys & 0x104) == 0x104) { // TODO + gUnk_02000010.field_0x7 = 2; + SoundReq(0xcd); + } + else { + gUnk_02000010.field_0x7 = 0; + } + } + } + #endif + } else { if (advance == ADVANCE_TIMER_EXPIRED) { advance = ADVANCE_KEY_PRESSED; diff --git a/src/main.c b/src/main.c index 78e9fdd0..3fa19e65 100644 --- a/src/main.c +++ b/src/main.c @@ -12,13 +12,20 @@ extern void HandleIntroScreen(void); extern void HandleChooseFileScreen(void); +extern void HandleChooseDemoScreen(void); extern void HandleGameplayScreen(void); extern void HandleGameOverScreen(void); extern void HandleCreditsScreen(void); extern void HandleDebugTextScreen(void); static void (*const sScreenHandlers[])(void) = { - [SCREEN_INTRO] = HandleIntroScreen, [SCREEN_CHOOSE_FILE] = HandleChooseFileScreen, + [SCREEN_INTRO] = HandleIntroScreen, + #ifdef DEMO + [SCREEN_CHOOSE_FILE] = HandleChooseDemoScreen, + #else + [SCREEN_CHOOSE_FILE] = HandleChooseFileScreen, + #endif + [SCREEN_GAMEPLAY] = HandleGameplayScreen, [SCREEN_GAME_OVER] = HandleGameOverScreen, [SCREEN_CREDITS] = HandleCreditsScreen, [SCREEN_DEBUG_TEXT] = HandleDebugTextScreen, }; @@ -83,7 +90,11 @@ void AgbMain(void) { // Interrupt handlers that are loaded into RAM. extern u8 sub_080B197C[]; extern u8 gUnk_030056F0[]; +#ifdef DEMO +extern u8 gUnk_02038558[]; +#else extern u8 gUnk_02038560[]; +#endif extern u8 gUnk_080B2CD8[]; extern u8 gUnk_080B2CD8_2[]; extern u8 gUnk_080B2CD8_3[]; @@ -105,7 +116,11 @@ static void sub_08055F70(void) { size = (u32)gUnk_080B2CD8_2 - (u32)gUnk_080B2CD8_3; if (size != 0) { + #ifdef DEMO + MemCopy(gUnk_080B2CD8_3, gUnk_02038558, size); + #else MemCopy(gUnk_080B2CD8_3, gUnk_02038560, size); + #endif } DispReset(0); diff --git a/src/room.c b/src/room.c index c2b1f07b..5e9deac0 100644 --- a/src/room.c +++ b/src/room.c @@ -2161,8 +2161,18 @@ u32 sub_0804CD0C() { return 1; } +#ifdef DEMO +void nullsub_251() { + if (gUnk_02000000->saveFileId != 0 && GetInventoryValue(0x40) == 0) { + SetTileType(0x365,0x349,1); + SetTileType(0x365,0x34a,1); + SetTileType(0x365,0x34b,1); + } +} +#else void nullsub_251() { } +#endif u32 sub_0804CD14() { return 1; @@ -2288,8 +2298,18 @@ u32 sub_0804CE38() { return 1; } +#ifdef DEMO +void nullsub_262() { + if (GetInventoryValue(0x41) == 0) { + SetTileType(0x365,0x287,2); + SetTileType(0x365,0x288,2); + SetTileType(0x365,0x289,2); + } +} +#else void nullsub_262() { } +#endif u32 sub_0804CE40() { return 1; @@ -5049,6 +5069,10 @@ void sub_0804EC00(void) { if ((s32)gSave.windcrests > -1) { LoadRoomEntityList(&gUnk_080F4E10); } + #ifdef DEMO + SetTileType(0x177,0x5b4,1); + SetTileType(0x177,0x5f4,1); + #endif } void sub_0804EC98(void) { diff --git a/src/save.c b/src/save.c index 749b6730..8b751914 100644 --- a/src/save.c +++ b/src/save.c @@ -41,10 +41,20 @@ u32 DataCompare(u32 address, const void* data, u32 size); const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500, 0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 }; -const char gUnk_0811E470[6] = "LINK"; +const char gUnk_0811E470[4] = "LINK"; + +#ifdef DEMO +const u8 unknown[] = { 0x0, 0x0f, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f, 0x08, 0x05, 0x05, 0x00, 0x00 }; +#else +const u8 padding[2] = {0,0}; +#endif static SaveResult (*const sSaveHandlers[])(u32) = { HandleSaveInit, HandleSaveInProgress, HandleSaveDone }; + +#ifdef DEMO +asm(".incbin \"baserom_demo.gba\", 0x11e010, 0xf0c"); // @nocheckin +#else static const char sSignatureLong[32] = "AGBZELDA:THE MINISH CAP:ZELDA 5"; // Save file is untouched @@ -60,7 +70,7 @@ const SaveFileEEPROMAddresses gSaveFileEEPROMAddresses[] = { { 0x500, 0x30, 0x10 { 0x20, 0, 0, 0, 0x1000 }, { 0x20, 0x60, 0x1060, 0xf80, 0x1f80 }, { 0x8, 0xfa0, 0x1fa0, 0xfa0, 0x1fa0 } }; - +#endif void sub_0807CD9C() { sub_080530C8(); } @@ -122,7 +132,12 @@ SaveResult HandleSaveDone(u32 arg0) { return result; } + u32 InitSaveData(void) { +#ifdef DEMO + CpuSet(NULL,&gSave,0x4b4); + return 1; +#else const SaveFileEEPROMAddresses* eepromAddresses; u32 error; @@ -147,40 +162,71 @@ u32 InitSaveData(void) { DataWrite(eepromAddresses->address1, sSignatureLong, eepromAddresses->size); } return 1; +#endif } u32 WriteSaveFile(u32 index, SaveFile* saveFile) { + #ifdef DEMO + return 1; + #else return DataDoubleWriteWithStatus(index, saveFile); + #endif } u32 Write_02000000(struct_02000000* arg0) { + #ifdef DEMO + return 1; + #else return DataDoubleWriteWithStatus(3, arg0); + #endif } u32 sub_0807CF1C(u8* arg0) { + #ifdef DEMO + return 1; + #else return DataDoubleWriteWithStatus(5, arg0); + #endif } s32 ReadSaveFile(u32 index, SaveFile* saveFile) { + #ifdef DEMO + return 1; + #else return DataDoubleReadWithStatus(index, saveFile); + #endif } u32 Read_02000000(struct_02000000* arg0) { + #ifdef DEMO + return 0; + #else return DataDoubleReadWithStatus(3, arg0); + #endif } u32 sub_0807CF3C(u8* arg0) { + #ifdef DEMO + return 0; + #else return DataDoubleReadWithStatus(5, arg0); + #endif } + + void SetFileStatusDeleted(u32 index) { + #ifndef DEMO const SaveFileEEPROMAddresses* eepromAddresses; eepromAddresses = GetSaveFileEEPROMAddresses(index); WriteSaveFileStatus(eepromAddresses->checksum2, &sSaveDescDeleted); WriteSaveFileStatus(eepromAddresses->checksum1, &sSaveDescDeleted); + #endif } + +#ifndef DEMO void SetFileStatusInit(u32 index) { const SaveFileEEPROMAddresses* eepromAddresses; const SaveFileStatus* fileStatus; @@ -406,3 +452,4 @@ bool32 DataCompare(u32 address, const void* data, u32 size) { } return TRUE; } +#endif \ No newline at end of file diff --git a/src/sub_080A3B84.c b/src/sub_080A3B84.c index b4df18d0..af806c36 100644 --- a/src/sub_080A3B84.c +++ b/src/sub_080A3B84.c @@ -7,6 +7,7 @@ extern void (*const gUnk_081280C4[])(); void DrawKinstoneMenu(void) { + #ifndef DEMO gScreenTransition.field_0x24[8] = 2; FlushSprites(); gUnk_081280C4[gMenu.menuType](); @@ -18,6 +19,7 @@ void DrawKinstoneMenu(void) { sub_080AD9B0(); sub_080AD918(); gScreenTransition.field_0x24[8] = 0; + #endif } extern void gUnk_081280DC; diff --git a/tmc_demo.sha1 b/tmc_demo.sha1 new file mode 100644 index 00000000..c96b5d47 --- /dev/null +++ b/tmc_demo.sha1 @@ -0,0 +1 @@ +63fcad218f9047b6a9edbb68c98bd0dec322d7a1 tmc_demo.gba diff --git a/tmc_eu.sha1 b/tmc_eu.sha1 new file mode 100644 index 00000000..878d050b --- /dev/null +++ b/tmc_eu.sha1 @@ -0,0 +1 @@ +cff199b36ff173fb6faf152653d1bccf87c26fb7 tmc_eu.gba diff --git a/tmc_jp.sha1 b/tmc_jp.sha1 new file mode 100644 index 00000000..6ffa3cda --- /dev/null +++ b/tmc_jp.sha1 @@ -0,0 +1 @@ +6c5404a1effb17f481f352181d0f1c61a2765c5d tmc_jp.gba