From 7ef8c1e594f3e82e82c007d9e084e8061d1fd863 Mon Sep 17 00:00:00 2001 From: artemus Date: Fri, 20 Feb 2026 20:22:03 +1030 Subject: [PATCH 1/2] code mostly aligned --- Makefile | 45 +- code/bank0.s | 94 ++- code/bank1.s | 8 + code/bank2.s | 613 +++++++++++++++++- code/bank3Cutscenes.s | 11 + code/code_3035.s | 2 +- code/fileManagement.s | 23 + code/seasons/roomSpecificTileChanges.s | 14 + code/textbox.s | 10 + include/emptyfill.s | 12 +- include/macros.s | 20 +- object_code/common/enemies/cucco.s | 2 +- .../interactions/creditsTextHorizontal.s | 12 + .../common/interactions/creditsTextVertical.s | 33 +- .../common/interactions/doorController.s | 12 +- object_code/common/items/magnetBall.s | 5 + .../common/specialObjects/commonCode.s | 3 + object_code/common/specialObjects/link.s | 7 + object_code/seasons/enemies/gohma.s | 9 + .../disappearingSidescrollPlatform.s | 31 + .../seasons/interactions/flyingRooster.s | 7 + scripts/common/commonScripts.s | 9 + scripts/seasons/scripts.s | 3 + seasons.s | 20 +- tools/build/verify-checksum.sh | 47 +- 25 files changed, 1001 insertions(+), 51 deletions(-) diff --git a/Makefile b/Makefile index 3d6283b54..f02873e09 100755 --- a/Makefile +++ b/Makefile @@ -144,15 +144,16 @@ GFX_PRECMP_DIR = 'precompressed/gfx_compressible' OBJS = $(BUILD_DIR)/$(GAME).o $(BUILD_DIR)/audio.o -# All .bin/.png gfx files and paths. Include _jp variants when building JP. +# All .bin/.png gfx files and paths. Include _ variants when building JP/EU. GFX_UNCMP_PATHS = $(GFX_UNCMP_DIR)/common $(GFX_UNCMP_DIR)/$(GAME) GFX_CMP_PATHS = $(GFX_CMP_DIR)/common $(GFX_CMP_DIR)/$(GAME) GFX_PRECMP_PATHS = $(GFX_PRECMP_DIR)/common $(GFX_PRECMP_DIR)/$(GAME) -ifeq ($(REGION), jp) -GFX_UNCMP_PATHS += $(GFX_UNCMP_DIR)/common_jp $(GFX_UNCMP_DIR)/$(GAME)_jp -GFX_CMP_PATHS += $(GFX_CMP_DIR)/common_jp $(GFX_CMP_DIR)/$(GAME)_jp -GFX_PRECMP_PATHS += $(GFX_PRECMP_DIR)/common_jp $(GFX_PRECMP_DIR)/$(GAME)_jp +ifneq ($(filter jp eu,$(REGION)),) +REGION_SUFFIX = _$(REGION) +GFX_UNCMP_PATHS += $(GFX_UNCMP_DIR)/common$(REGION_SUFFIX) $(GFX_UNCMP_DIR)/$(GAME)$(REGION_SUFFIX) +GFX_CMP_PATHS += $(GFX_CMP_DIR)/common$(REGION_SUFFIX) $(GFX_CMP_DIR)/$(GAME)$(REGION_SUFFIX) +GFX_PRECMP_PATHS += $(GFX_PRECMP_DIR)/common$(REGION_SUFFIX) $(GFX_PRECMP_DIR)/$(GAME)$(REGION_SUFFIX) endif # All .bin gfx files @@ -195,9 +196,9 @@ endif ROOMLAYOUTFILES = $(wildcard rooms/$(GAME)/small/*.bin) ROOMLAYOUTFILES += $(wildcard rooms/$(GAME)/large/*.bin) -ifeq ($(REGION), jp) -ROOMLAYOUTFILES += $(wildcard rooms/$(GAME)_jp/small/*.bin) -ROOMLAYOUTFILES += $(wildcard rooms/$(GAME)_jp/large/*.bin) +ifneq ($(filter jp eu,$(REGION)),) +ROOMLAYOUTFILES += $(wildcard rooms/$(GAME)$(REGION_SUFFIX)/small/*.bin) +ROOMLAYOUTFILES += $(wildcard rooms/$(GAME)$(REGION_SUFFIX)/large/*.bin) endif ROOMLAYOUTFILES := $(ROOMLAYOUTFILES:.bin=.cmp) @@ -206,8 +207,8 @@ ROOMLAYOUTFILES := $(foreach file, $(ROOMLAYOUTFILES), \ COLLISIONFILES = $(wildcard tileset_layouts/$(GAME)/tilesetCollisions*.bin) -ifeq ($(REGION), jp) -COLLISIONFILES += $(wildcard tileset_layouts/$(GAME)_jp/tilesetCollisions*.bin) +ifneq ($(filter jp eu,$(REGION)),) +COLLISIONFILES += $(wildcard tileset_layouts/$(GAME)$(REGION_SUFFIX)/tilesetCollisions*.bin) endif COLLISIONFILES := $(COLLISIONFILES:.bin=.cmp) @@ -216,8 +217,8 @@ COLLISIONFILES := $(foreach file, $(COLLISIONFILES), \ MAPPINGINDICESFILES = $(wildcard tileset_layouts/$(GAME)/tilesetMappings*.bin) -ifeq ($(REGION), jp) -MAPPINGINDICESFILES += $(wildcard tileset_layouts/$(GAME)_jp/tilesetMappings*.bin) +ifneq ($(filter jp eu,$(REGION)),) +MAPPINGINDICESFILES += $(wildcard tileset_layouts/$(GAME)$(REGION_SUFFIX)/tilesetMappings*.bin) endif MAPPINGINDICESFILES := $(foreach file, $(MAPPINGINDICESFILES), \ $(BUILD_DIR)/tileset_layouts/$(notdir $(file))) @@ -277,8 +278,8 @@ $(BUILD_DIR)/$(GAME).o: $(GAME).s $(TEXT_DATA_FILE) $(BUILD_DIR)/textDefines.s M $(BUILD_DIR)/%.o: code/%.s | $(BUILD_DIR) $(CC) -o $@ $(CFLAGS) $< -ifeq ($(REGION), jp) -$(BUILD_DIR)/rooms/%.cmp: rooms/$(GAME)_jp/small/%.bin | $(BUILD_DIR)/rooms +ifneq ($(filter jp eu,$(REGION)),) +$(BUILD_DIR)/rooms/%.cmp: rooms/$(GAME)$(REGION_SUFFIX)/small/%.bin | $(BUILD_DIR)/rooms @echo "Compressing $< to $@..." @$(PYTHON) tools/build/compressRoomLayout.py $< $@ $(OPTIMIZE) endif @@ -352,7 +353,7 @@ endif ifeq ($(BUILD_VANILLA),true) # Precompressed copy rules for vanilla builds. -# For JP, game_jp source rules are listed first to take priority over the +# For JP/EU, game_ source rules are listed first to take priority over the # generic game rules (which serve as fallback for shared files). define define_precmp_copy_rule $(BUILD_DIR)/$(1)/%.$(2): precompressed/$(1)/$(3)/%.$(2) | $(BUILD_DIR)/$(1) @@ -360,10 +361,10 @@ $(BUILD_DIR)/$(1)/%.$(2): precompressed/$(1)/$(3)/%.$(2) | $(BUILD_DIR)/$(1) @cp $$< $$@ endef -ifeq ($(REGION), jp) -$(eval $(call define_precmp_copy_rule,tileset_layouts,bin,$(GAME)_jp)) -$(eval $(call define_precmp_copy_rule,tileset_layouts,cmp,$(GAME)_jp)) -$(eval $(call define_precmp_copy_rule,rooms,cmp,$(GAME)_jp)) +ifneq ($(filter jp eu,$(REGION)),) +$(eval $(call define_precmp_copy_rule,tileset_layouts,bin,$(GAME)$(REGION_SUFFIX))) +$(eval $(call define_precmp_copy_rule,tileset_layouts,cmp,$(GAME)$(REGION_SUFFIX))) +$(eval $(call define_precmp_copy_rule,rooms,cmp,$(GAME)$(REGION_SUFFIX))) endif $(eval $(call define_precmp_copy_rule,tileset_layouts,bin,$(GAME))) @@ -406,10 +407,10 @@ $(BUILD_DIR)/tileset_layouts/tilesetCollisions%.cmp: tileset_layouts/$(GAME)/til @$(PYTHON) tools/build/compressTilesetLayoutData.py $< $@ 0 $(BUILD_DIR)/tileset_layouts/collisionsDictionary.bin # Generate large room compression rules for each group prefix (04, 05, 06). -# For JP, the _jp source directory rules are listed first to take priority. +# For JP/EU, the _ source directory rules are listed first to take priority. define define_large_room_rules -ifeq ($(REGION), jp) -$(BUILD_DIR)/rooms/room$(1)%.cmp: rooms/$(GAME)_jp/large/room$(1)%.bin | $(BUILD_DIR)/rooms +ifneq ($(filter jp eu,$(REGION)),) +$(BUILD_DIR)/rooms/room$(1)%.cmp: rooms/$(GAME)$(REGION_SUFFIX)/large/room$(1)%.bin | $(BUILD_DIR)/rooms @echo "Compressing $$< to $$@..." @$$(PYTHON) tools/build/compressRoomLayout.py $$< $$@ -d rooms/$(GAME)/dictionary$(2).bin endif diff --git a/code/bank0.s b/code/bank0.s index 0df634ae9..90b8b8819 100644 --- a/code/bank0.s +++ b/code/bank0.s @@ -222,9 +222,13 @@ bitTable: .ifdef REGION_JP .ASC "AZ7J" - .else + .endif + .ifdef REGION_US .asc "AZ7E" .endif + .ifdef REGION_EU + .asc "AZ7P" + .endif .else ; ROM_AGES .asc "ZELDA NAYRU" @@ -1256,21 +1260,54 @@ loadGfxHeader: ldh a,(/dev/null +if md5sum -c ${FILENAME}.md5 2>/dev/null; then + exit 0 +fi + +# MD5 mismatch: do a bank-by-bank comparison with the reference ROM +GAME_CAP="$(echo "${GAME:0:1}" | tr '[:lower:]' '[:upper:]')${GAME:1}" +REGION_UP="$(echo "$REGION" | tr '[:lower:]' '[:upper:]')" +REFERENCE="../${GAME_CAP} ${REGION_UP} Reference.gbc" + +if [ ! -f "$REFERENCE" ]; then + echo "Reference ROM not found: $REFERENCE" + exit 1 +fi + +python3 - "${FILENAME}.gbc" "$REFERENCE" <<'EOF' +import sys + +BANK_SIZE = 0x4000 +built_path, ref_path = sys.argv[1], sys.argv[2] + +with open(built_path, 'rb') as f: + built = f.read() +with open(ref_path, 'rb') as f: + ref = f.read() + +total_banks = len(ref) // BANK_SIZE +print() +print("Bank-by-bank comparison vs reference ROM:") +print(" Bank | Match % | Bytes matched") +print("--------|-----------|---------------") +total_matched = 0 +total_bytes = total_banks * BANK_SIZE +for bank in range(total_banks): + s = bank * BANK_SIZE + e = s + BANK_SIZE + b = built[s:e] + r = ref[s:e] + n = min(len(b), len(r)) + matched = sum(b[i] == r[i] for i in range(n)) + total_matched += matched + pct = matched / BANK_SIZE * 100 + print(f" {bank:02x} | {pct:6.2f}% | [{matched}/{BANK_SIZE}]") +print("--------|-----------|---------------") +total_pct = total_matched / total_bytes * 100 +print(f" Total | {total_pct:6.2f}% | [{total_matched}/{total_bytes}]") +EOF From 54c04716ef0a65dc8058815faf5f72dd1a57e23a Mon Sep 17 00:00:00 2001 From: artemus Date: Fri, 20 Feb 2026 21:40:25 +1030 Subject: [PATCH 2/2] fix some refs --- .../common/interactions/doorController.s | 4 +- object_code/common/items/magnetBall.s | 3 ++ .../common/specialObjects/commonCode.s | 19 ++++++++- object_code/common/specialObjects/link.s | 41 ++++++++++++++++--- .../disappearingSidescrollPlatform.s | 10 ++++- .../seasons/interactions/flyingRooster.s | 2 +- 6 files changed, 67 insertions(+), 12 deletions(-) diff --git a/object_code/common/interactions/doorController.s b/object_code/common/interactions/doorController.s index fed129e61..ca49fd3a0 100644 --- a/object_code/common/interactions/doorController.s +++ b/object_code/common/interactions/doorController.s @@ -65,11 +65,11 @@ interactionCode1e: ld (de),a .ifdef REGION_EU - ld a,($d033) + ld a,(w7TextboxMap+$33) ; why??? inc a ret nz - jp $4703 + jp @checkRespawnLink .else ret .endif diff --git a/object_code/common/items/magnetBall.s b/object_code/common/items/magnetBall.s index 40e3ca23f..37e3c517d 100644 --- a/object_code/common/items/magnetBall.s +++ b/object_code/common/items/magnetBall.s @@ -351,9 +351,12 @@ itemCode29: ld (hl),a .ifdef REGION_EU ret nz + + ; Zero out var33? xor a ld (de),a .endif + ret @loadBIntoAngleIfLinkLeftOfBallElseLoadC: diff --git a/object_code/common/specialObjects/commonCode.s b/object_code/common/specialObjects/commonCode.s index 9e1071959..63cd37ed6 100644 --- a/object_code/common/specialObjects/commonCode.s +++ b/object_code/common/specialObjects/commonCode.s @@ -1155,8 +1155,14 @@ companionRespawn: ldi (hl),a + .endif + +.ifdef REGION_EU + call objectCheckTileCollision_allowHoles + jr c,@invalidPosition +.else call objectCheckSimpleCollision jr nz,@invalidPosition +.endif call objectGetPosition call checkCollisionForCompanion @@ -1467,14 +1473,23 @@ companionCheckCanSpawn: ldi a,(hl) ld e,SpecialObject.yh ld (de),a + +.ifdef REGION_EU + add a,$05 + ld b,a + ld a,(hl) + ld c,a + ld e,SpecialObject.xh + ld (de),a + call getTileCollisionsAtPosition +.else ld a,(hl) ld e,SpecialObject.xh ld (de),a call objectGetTileCollisions jr z,@canSpawn -.ifdef REGION_EU - .db 0 0 .endif + pop af jp itemDelete diff --git a/object_code/common/specialObjects/link.s b/object_code/common/specialObjects/link.s index aeb784041..693a203cd 100644 --- a/object_code/common/specialObjects/link.s +++ b/object_code/common/specialObjects/link.s @@ -4746,7 +4746,7 @@ specialObjectUpdateAdjacentWallsBitset: ld c,(hl) call calculateAdjacentWallsBitset -.ifdef ROM_AGES +.if defined(ROM_AGES) || defined(REGION_EU) ld b,a ld hl,@data-1 -- @@ -4764,6 +4764,7 @@ specialObjectUpdateAdjacentWallsBitset: ret ++ ld a,b ++++ ld e,SpecialObject.adjacentWallsBitset ld (de),a ret @@ -4771,6 +4772,10 @@ specialObjectUpdateAdjacentWallsBitset: @data: .db $db $c3 .db $ee $cc +.ifdef REGION_EU + .db $99 $81 + .db $66 $60 +.endif .db $00 .else +++ @@ -4779,12 +4784,38 @@ specialObjectUpdateAdjacentWallsBitset: ret .endif +/* +; don't know what this is yet... .ifdef REGION_EU - .db 0 0 0 0 0 0 0 0 - .db 0 0 0 0 0 0 0 0 - .db 0 0 0 0 0 0 0 0 - .db 0 0 0 0 0 + ld b,a + ld hl,@data-1 +- + inc hl + ldi a,(hl) + or a + jr z,+ + cp b + jr nz,- + ld a,(hl) + ldh (