Merge pull request #177 from jdflyer/master

Shiftability
This commit is contained in:
TakaRikka 2022-01-18 22:05:13 -08:00 committed by GitHub
commit 6f4d068f1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 1886 additions and 1665 deletions

View File

@ -30,7 +30,9 @@ LDSCRIPT := $(BUILD_DIR)/ldscript.lcf
# Outputs
DOL := $(BUILD_DIR)/main.dol
DOL_SHIFT := $(BUILD_DIR)/main_shift.dol
ELF := $(DOL:.dol=.elf)
ELF_SHIFT := $(DOL_SHIFT:.dol=.elf)
MAP := $(BUILD_DIR)/dolzel2.map
# include list of object files
@ -94,8 +96,10 @@ SBSS_PDHR := 10
default: all
all: dirs $(DOL)
dol: $(DOL)
$(SHA1SUM) -c $(TARGET).sha1
all: dirs dol
# Make sure build directory exists before compiling anything
dirs:
@mkdir -p build
@ -103,15 +107,22 @@ dirs:
$(DOL): $(ELF) | tools
$(ELF2DOL) $< $@ $(SDATA_PDHR) $(SBSS_PDHR) $(TARGET_COL)
$(SHA1SUM) -c $(TARGET).sha1
clean:
rm -f -d -r $(BUILD_DIR)/libs
rm -f -d -r $(BUILD_DIR)/src
rm -f $(ELF)
rm -f $(DOL)
rm -f $(ELF_SHIFT)
rm -f $(DOL_SHIFT)
rm -f $(BUILD_DIR)/*.a
clean_game:
rm -r -f -d $(TARGET)/game
clean_assets:
rm -r -f -d game
clean_all:
rm -f -d -r build
@ -122,6 +133,7 @@ clean_rels:
tools: $(ELF2DOL)
assets:
@mkdir -p game
@cd game; $(PYTHON) ../tools/extract_game_assets.py ../$(IMAGENAME)
docs:
@ -136,6 +148,26 @@ $(ELF): $(LIBS) $(O_FILES)
@$(PYTHON) tools/lcf.py dol --output $(LDSCRIPT)
$(LD) -application $(LDFLAGS) -o $@ -lcf $(LDSCRIPT) @build/o_files $(LIBS)
$(ELF_SHIFT): $(DOL)
@echo $(O_FILES) > build/o_files
@$(PYTHON) tools/lcf.py dol_shift --output $(LDSCRIPT)
$(LD) -application $(LDFLAGS) -o $@ -lcf $(LDSCRIPT) @build/o_files $(LIBS)
@cp -v $(ELF_SHIFT) $(ELF)
$(DOL_SHIFT): $(ELF_SHIFT) | tools
$(ELF2DOL) $< $@ $(SDATA_PDHR) $(SBSS_PDHR) $(TARGET_COL)
@cp -v $(DOL_SHIFT) $(DOL)
shift: dirs $(DOL_SHIFT)
game: | shift rels
@mkdir -p game
@$(PYTHON) tools/package_game_assets.py game $(BUILD_DIR)
rungame: game
@echo If you are playing on a shifted game make sure Hyrule Field Speed hack is disabled in dolphin!
dolphin-emu $(BUILD_DIR)/game/sys/main.dol
#
$(BUILD_DIR)/%.o: %.cpp
@mkdir -p $(@D)
@ -157,4 +189,4 @@ include tools/elf2dol/Makefile
### Debug Print ###
print-% : ; $(info $* is a $(flavor $*) variable set to [$($*)]) @true
.PHONY: default all dirs clean tools docs print-%
.PHONY: default all dirs clean tools docs shift game rungame print-%

View File

@ -1,20 +0,0 @@
lbl_8026314C:
/* 8026314C 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80263150 7C 08 02 A6 */ mflr r0
/* 80263154 90 01 00 14 */ stw r0, 0x14(r1)
/* 80263158 93 E1 00 0C */ stw r31, 0xc(r1)
/* 8026315C 7C 7F 1B 78 */ mr r31, r3
/* 80263160 48 00 00 10 */ b lbl_80263170
lbl_80263164:
/* 80263164 7D 89 03 A6 */ mtctr r12
/* 80263168 4E 80 04 21 */ bctrl
/* 8026316C 3B FF 00 04 */ addi r31, r31, 4
lbl_80263170:
/* 80263170 81 9F 00 00 */ lwz r12, 0(r31)
/* 80263174 28 0C 00 00 */ cmplwi r12, 0
/* 80263178 40 82 FF EC */ bne lbl_80263164
/* 8026317C 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 80263180 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80263184 7C 08 03 A6 */ mtlr r0
/* 80263188 38 21 00 10 */ addi r1, r1, 0x10
/* 8026318C 4E 80 00 20 */ blr

View File

@ -1,20 +0,0 @@
lbl_80263190:
/* 80263190 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80263194 7C 08 02 A6 */ mflr r0
/* 80263198 90 01 00 14 */ stw r0, 0x14(r1)
/* 8026319C 93 E1 00 0C */ stw r31, 0xc(r1)
/* 802631A0 7C 7F 1B 78 */ mr r31, r3
/* 802631A4 48 00 00 10 */ b lbl_802631B4
lbl_802631A8:
/* 802631A8 7D 89 03 A6 */ mtctr r12
/* 802631AC 4E 80 04 21 */ bctrl
/* 802631B0 3B FF 00 04 */ addi r31, r31, 4
lbl_802631B4:
/* 802631B4 81 9F 00 00 */ lwz r12, 0(r31)
/* 802631B8 28 0C 00 00 */ cmplwi r12, 0
/* 802631BC 40 82 FF EC */ bne lbl_802631A8
/* 802631C0 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 802631C4 80 01 00 14 */ lwz r0, 0x14(r1)
/* 802631C8 7C 08 03 A6 */ mtlr r0
/* 802631CC 38 21 00 10 */ addi r1, r1, 0x10
/* 802631D0 4E 80 00 20 */ blr

View File

@ -1,51 +0,0 @@
lbl_80263090:
/* 80263090 94 21 FF E0 */ stwu r1, -0x20(r1)
/* 80263094 7C 08 02 A6 */ mflr r0
/* 80263098 90 01 00 24 */ stw r0, 0x24(r1)
/* 8026309C 39 61 00 20 */ addi r11, r1, 0x20
/* 802630A0 48 0F F1 3D */ bl _savegpr_29
/* 802630A4 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 802630A8 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 802630AC 38 63 02 D0 */ addi r3, r3, 0x2d0
/* 802630B0 4C C6 31 82 */ crclr 6
/* 802630B4 4B DA 3B 59 */ bl OSReport_Error
/* 802630B8 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 802630BC 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 802630C0 38 63 03 03 */ addi r3, r3, 0x303
/* 802630C4 4C C6 31 82 */ crclr 6
/* 802630C8 4B DA 3B 45 */ bl OSReport_Error
/* 802630CC 3B C0 00 00 */ li r30, 0
/* 802630D0 48 0D 8F 29 */ bl OSGetStackPointer
/* 802630D4 7C 7D 1B 78 */ mr r29, r3
/* 802630D8 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 802630DC 3B E3 A4 A0 */ addi r31, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 802630E0 48 00 00 20 */ b lbl_80263100
lbl_802630E4:
/* 802630E4 38 7F 03 28 */ addi r3, r31, 0x328
/* 802630E8 7F A4 EB 78 */ mr r4, r29
/* 802630EC 80 BD 00 00 */ lwz r5, 0(r29)
/* 802630F0 80 DD 00 04 */ lwz r6, 4(r29)
/* 802630F4 4C C6 31 82 */ crclr 6
/* 802630F8 4B DA 3B 15 */ bl OSReport_Error
/* 802630FC 83 BD 00 00 */ lwz r29, 0(r29)
lbl_80263100:
/* 80263100 28 1D 00 00 */ cmplwi r29, 0
/* 80263104 41 82 00 1C */ beq lbl_80263120
/* 80263108 3C 1D 00 01 */ addis r0, r29, 1
/* 8026310C 28 00 FF FF */ cmplwi r0, 0xffff
/* 80263110 41 82 00 10 */ beq lbl_80263120
/* 80263114 28 1E 00 10 */ cmplwi r30, 0x10
/* 80263118 3B DE 00 01 */ addi r30, r30, 1
/* 8026311C 41 80 FF C8 */ blt lbl_802630E4
lbl_80263120:
/* 80263120 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 80263124 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 80263128 38 63 00 C2 */ addi r3, r3, 0xc2
/* 8026312C 4C C6 31 82 */ crclr 6
/* 80263130 4B DA 3A DD */ bl OSReport_Error
/* 80263134 39 61 00 20 */ addi r11, r1, 0x20
/* 80263138 48 0F F0 F1 */ bl _restgpr_29
/* 8026313C 80 01 00 24 */ lwz r0, 0x24(r1)
/* 80263140 7C 08 03 A6 */ mtlr r0
/* 80263144 38 21 00 20 */ addi r1, r1, 0x20
/* 80263148 4E 80 00 20 */ blr

View File

@ -1,29 +0,0 @@
lbl_80262660:
/* 80262660 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262664 7C 08 02 A6 */ mflr r0
/* 80262668 90 01 00 14 */ stw r0, 0x14(r1)
/* 8026266C 93 E1 00 0C */ stw r31, 0xc(r1)
/* 80262670 93 C1 00 08 */ stw r30, 8(r1)
/* 80262674 7C 7E 1B 78 */ mr r30, r3
/* 80262678 7C 9F 23 78 */ mr r31, r4
/* 8026267C 4B FF FC 09 */ bl __ct__24DynamicModuleControlBaseFv
/* 80262680 3C 60 80 3C */ lis r3, __vt__20DynamicModuleControl@ha /* 0x803C34C0@ha */
/* 80262684 38 03 34 C0 */ addi r0, r3, __vt__20DynamicModuleControl@l /* 0x803C34C0@l */
/* 80262688 90 1E 00 0C */ stw r0, 0xc(r30)
/* 8026268C 38 00 00 00 */ li r0, 0
/* 80262690 90 1E 00 10 */ stw r0, 0x10(r30)
/* 80262694 90 1E 00 14 */ stw r0, 0x14(r30)
/* 80262698 90 1E 00 18 */ stw r0, 0x18(r30)
/* 8026269C 93 FE 00 1C */ stw r31, 0x1c(r30)
/* 802626A0 98 1E 00 20 */ stb r0, 0x20(r30)
/* 802626A4 98 1E 00 21 */ stb r0, 0x21(r30)
/* 802626A8 B0 1E 00 22 */ sth r0, 0x22(r30)
/* 802626AC 90 1E 00 24 */ stw r0, 0x24(r30)
/* 802626B0 90 1E 00 28 */ stw r0, 0x28(r30)
/* 802626B4 7F C3 F3 78 */ mr r3, r30
/* 802626B8 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 802626BC 83 C1 00 08 */ lwz r30, 8(r1)
/* 802626C0 80 01 00 14 */ lwz r0, 0x14(r1)
/* 802626C4 7C 08 03 A6 */ mtlr r0
/* 802626C8 38 21 00 10 */ addi r1, r1, 0x10
/* 802626CC 4E 80 00 20 */ blr

View File

@ -1,22 +0,0 @@
lbl_80262284:
/* 80262284 3C 80 80 3C */ lis r4, __vt__24DynamicModuleControlBase@ha /* 0x803C34F4@ha */
/* 80262288 38 04 34 F4 */ addi r0, r4, __vt__24DynamicModuleControlBase@l /* 0x803C34F4@l */
/* 8026228C 90 03 00 0C */ stw r0, 0xc(r3)
/* 80262290 38 00 00 00 */ li r0, 0
/* 80262294 B0 03 00 00 */ sth r0, 0(r3)
/* 80262298 B0 03 00 02 */ sth r0, 2(r3)
/* 8026229C 90 03 00 08 */ stw r0, 8(r3)
/* 802622A0 80 0D 8B B8 */ lwz r0, mFirst__24DynamicModuleControlBase(r13)
/* 802622A4 28 00 00 00 */ cmplwi r0, 0
/* 802622A8 40 82 00 08 */ bne lbl_802622B0
/* 802622AC 90 6D 8B B8 */ stw r3, mFirst__24DynamicModuleControlBase(r13)
lbl_802622B0:
/* 802622B0 80 0D 8B BC */ lwz r0, mLast__24DynamicModuleControlBase(r13)
/* 802622B4 90 03 00 04 */ stw r0, 4(r3)
/* 802622B8 80 83 00 04 */ lwz r4, 4(r3)
/* 802622BC 28 04 00 00 */ cmplwi r4, 0
/* 802622C0 41 82 00 08 */ beq lbl_802622C8
/* 802622C4 90 64 00 08 */ stw r3, 8(r4)
lbl_802622C8:
/* 802622C8 90 6D 8B BC */ stw r3, mLast__24DynamicModuleControlBase(r13)
/* 802622CC 4E 80 00 20 */ blr

View File

@ -1,52 +0,0 @@
lbl_802621CC:
/* 802621CC 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 802621D0 7C 08 02 A6 */ mflr r0
/* 802621D4 90 01 00 14 */ stw r0, 0x14(r1)
/* 802621D8 93 E1 00 0C */ stw r31, 0xc(r1)
/* 802621DC 93 C1 00 08 */ stw r30, 8(r1)
/* 802621E0 7C 7E 1B 79 */ or. r30, r3, r3
/* 802621E4 7C 9F 23 78 */ mr r31, r4
/* 802621E8 41 82 00 80 */ beq lbl_80262268
/* 802621EC 3C 80 80 3C */ lis r4, __vt__24DynamicModuleControlBase@ha /* 0x803C34F4@ha */
/* 802621F0 38 04 34 F4 */ addi r0, r4, __vt__24DynamicModuleControlBase@l /* 0x803C34F4@l */
/* 802621F4 90 1E 00 0C */ stw r0, 0xc(r30)
/* 802621F8 48 00 02 35 */ bl force_unlink__24DynamicModuleControlBaseFv
/* 802621FC 80 7E 00 04 */ lwz r3, 4(r30)
/* 80262200 28 03 00 00 */ cmplwi r3, 0
/* 80262204 41 82 00 0C */ beq lbl_80262210
/* 80262208 80 1E 00 08 */ lwz r0, 8(r30)
/* 8026220C 90 03 00 08 */ stw r0, 8(r3)
lbl_80262210:
/* 80262210 80 7E 00 08 */ lwz r3, 8(r30)
/* 80262214 28 03 00 00 */ cmplwi r3, 0
/* 80262218 41 82 00 0C */ beq lbl_80262224
/* 8026221C 80 1E 00 04 */ lwz r0, 4(r30)
/* 80262220 90 03 00 04 */ stw r0, 4(r3)
lbl_80262224:
/* 80262224 80 0D 8B B8 */ lwz r0, mFirst__24DynamicModuleControlBase(r13)
/* 80262228 7C 00 F0 40 */ cmplw r0, r30
/* 8026222C 40 82 00 0C */ bne lbl_80262238
/* 80262230 80 1E 00 08 */ lwz r0, 8(r30)
/* 80262234 90 0D 8B B8 */ stw r0, mFirst__24DynamicModuleControlBase(r13)
lbl_80262238:
/* 80262238 80 0D 8B BC */ lwz r0, mLast__24DynamicModuleControlBase(r13)
/* 8026223C 7C 00 F0 40 */ cmplw r0, r30
/* 80262240 40 82 00 0C */ bne lbl_8026224C
/* 80262244 80 1E 00 04 */ lwz r0, 4(r30)
/* 80262248 90 0D 8B BC */ stw r0, mLast__24DynamicModuleControlBase(r13)
lbl_8026224C:
/* 8026224C 38 00 00 00 */ li r0, 0
/* 80262250 90 1E 00 08 */ stw r0, 8(r30)
/* 80262254 90 1E 00 04 */ stw r0, 4(r30)
/* 80262258 7F E0 07 35 */ extsh. r0, r31
/* 8026225C 40 81 00 0C */ ble lbl_80262268
/* 80262260 7F C3 F3 78 */ mr r3, r30
/* 80262264 48 06 CA D9 */ bl __dl__FPv
lbl_80262268:
/* 80262268 7F C3 F3 78 */ mr r3, r30
/* 8026226C 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 80262270 83 C1 00 08 */ lwz r30, 8(r1)
/* 80262274 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262278 7C 08 03 A6 */ mtlr r0
/* 8026227C 38 21 00 10 */ addi r1, r1, 0x10
/* 80262280 4E 80 00 20 */ blr

View File

@ -1,13 +0,0 @@
lbl_802627C0:
/* 802627C0 38 A0 00 00 */ li r5, 0
/* 802627C4 48 00 00 14 */ b lbl_802627D8
lbl_802627C8:
/* 802627C8 A0 03 00 00 */ lhz r0, 0(r3)
/* 802627CC 7C A5 02 14 */ add r5, r5, r0
/* 802627D0 38 84 FF FE */ addi r4, r4, -2
/* 802627D4 38 63 00 02 */ addi r3, r3, 2
lbl_802627D8:
/* 802627D8 28 04 00 00 */ cmplwi r4, 0
/* 802627DC 40 82 FF EC */ bne lbl_802627C8
/* 802627E0 7C A3 2B 78 */ mr r3, r5
/* 802627E4 4E 80 00 20 */ blr

View File

@ -1,12 +0,0 @@
lbl_80262794:
/* 80262794 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262798 7C 08 02 A6 */ mflr r0
/* 8026279C 90 01 00 14 */ stw r0, 0x14(r1)
/* 802627A0 81 83 00 0C */ lwz r12, 0xc(r3)
/* 802627A4 81 8C 00 20 */ lwz r12, 0x20(r12)
/* 802627A8 7D 89 03 A6 */ mtctr r12
/* 802627AC 4E 80 04 21 */ bctrl
/* 802627B0 80 01 00 14 */ lwz r0, 0x14(r1)
/* 802627B4 7C 08 03 A6 */ mtlr r0
/* 802627B8 38 21 00 10 */ addi r1, r1, 0x10
/* 802627BC 4E 80 00 20 */ blr

View File

@ -1,56 +0,0 @@
lbl_80262AFC:
/* 80262AFC 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262B00 7C 08 02 A6 */ mflr r0
/* 80262B04 90 01 00 14 */ stw r0, 0x14(r1)
/* 80262B08 93 E1 00 0C */ stw r31, 0xc(r1)
/* 80262B0C 7C 7F 1B 78 */ mr r31, r3
/* 80262B10 80 03 00 28 */ lwz r0, 0x28(r3)
/* 80262B14 28 00 00 00 */ cmplwi r0, 0
/* 80262B18 40 82 00 50 */ bne lbl_80262B68
/* 80262B1C 80 1F 00 10 */ lwz r0, 0x10(r31)
/* 80262B20 28 00 00 00 */ cmplwi r0, 0
/* 80262B24 41 82 00 0C */ beq lbl_80262B30
/* 80262B28 38 60 00 01 */ li r3, 1
/* 80262B2C 48 00 00 84 */ b lbl_80262BB0
lbl_80262B30:
/* 80262B30 3C 60 80 26 */ lis r3, callback__20DynamicModuleControlFPv@ha /* 0x80262794@ha */
/* 80262B34 38 63 27 94 */ addi r3, r3, callback__20DynamicModuleControlFPv@l /* 0x80262794@l */
/* 80262B38 7F E4 FB 78 */ mr r4, r31
/* 80262B3C 4B DB 31 39 */ bl create__20mDoDvdThd_callback_cFPFPv_PvPv
/* 80262B40 90 7F 00 28 */ stw r3, 0x28(r31)
/* 80262B44 80 1F 00 28 */ lwz r0, 0x28(r31)
/* 80262B48 28 00 00 00 */ cmplwi r0, 0
/* 80262B4C 40 82 00 1C */ bne lbl_80262B68
/* 80262B50 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 80262B54 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 80262B58 38 63 01 DF */ addi r3, r3, 0x1df
/* 80262B5C 80 9F 00 1C */ lwz r4, 0x1c(r31)
/* 80262B60 4C C6 31 82 */ crclr 6
/* 80262B64 4B DA 40 A9 */ bl OSReport_Error
lbl_80262B68:
/* 80262B68 80 7F 00 28 */ lwz r3, 0x28(r31)
/* 80262B6C 28 03 00 00 */ cmplwi r3, 0
/* 80262B70 41 82 00 3C */ beq lbl_80262BAC
/* 80262B74 88 03 00 0C */ lbz r0, 0xc(r3)
/* 80262B78 2C 00 00 00 */ cmpwi r0, 0
/* 80262B7C 41 82 00 30 */ beq lbl_80262BAC
/* 80262B80 28 03 00 00 */ cmplwi r3, 0
/* 80262B84 41 82 00 18 */ beq lbl_80262B9C
/* 80262B88 38 80 00 01 */ li r4, 1
/* 80262B8C 81 83 00 10 */ lwz r12, 0x10(r3)
/* 80262B90 81 8C 00 08 */ lwz r12, 8(r12)
/* 80262B94 7D 89 03 A6 */ mtctr r12
/* 80262B98 4E 80 04 21 */ bctrl
lbl_80262B9C:
/* 80262B9C 38 00 00 00 */ li r0, 0
/* 80262BA0 90 1F 00 28 */ stw r0, 0x28(r31)
/* 80262BA4 38 60 00 01 */ li r3, 1
/* 80262BA8 48 00 00 08 */ b lbl_80262BB0
lbl_80262BAC:
/* 80262BAC 38 60 00 00 */ li r3, 0
lbl_80262BB0:
/* 80262BB0 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 80262BB4 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262BB8 7C 08 03 A6 */ mtlr r0
/* 80262BBC 38 21 00 10 */ addi r1, r1, 0x10
/* 80262BC0 4E 80 00 20 */ blr

View File

@ -1,58 +0,0 @@
lbl_80262F28:
/* 80262F28 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262F2C 7C 08 02 A6 */ mflr r0
/* 80262F30 90 01 00 14 */ stw r0, 0x14(r1)
/* 80262F34 93 E1 00 0C */ stw r31, 0xc(r1)
/* 80262F38 93 C1 00 08 */ stw r30, 8(r1)
/* 80262F3C 7C 7E 1B 78 */ mr r30, r3
/* 80262F40 48 0D F7 BD */ bl OSGetTime
/* 80262F44 80 7E 00 10 */ lwz r3, 0x10(r30)
/* 80262F48 81 83 00 38 */ lwz r12, 0x38(r3)
/* 80262F4C 7D 89 03 A6 */ mtctr r12
/* 80262F50 4E 80 04 21 */ bctrl
/* 80262F54 48 0D F7 A9 */ bl OSGetTime
/* 80262F58 80 7E 00 10 */ lwz r3, 0x10(r30)
/* 80262F5C 48 0D B8 4D */ bl OSUnlink
/* 80262F60 7C 7F 1B 78 */ mr r31, r3
/* 80262F64 48 0D F7 99 */ bl OSGetTime
/* 80262F68 2C 1F 00 00 */ cmpwi r31, 0
/* 80262F6C 40 82 00 28 */ bne lbl_80262F94
/* 80262F70 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 80262F74 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 80262F78 38 63 02 97 */ addi r3, r3, 0x297
/* 80262F7C 80 9E 00 10 */ lwz r4, 0x10(r30)
/* 80262F80 80 BE 00 14 */ lwz r5, 0x14(r30)
/* 80262F84 4C C6 31 82 */ crclr 6
/* 80262F88 4B DA 3C 85 */ bl OSReport_Error
/* 80262F8C 38 60 00 00 */ li r3, 0
/* 80262F90 48 00 00 58 */ b lbl_80262FE8
lbl_80262F94:
/* 80262F94 7F C3 F3 78 */ mr r3, r30
/* 80262F98 81 9E 00 0C */ lwz r12, 0xc(r30)
/* 80262F9C 81 8C 00 10 */ lwz r12, 0x10(r12)
/* 80262FA0 7D 89 03 A6 */ mtctr r12
/* 80262FA4 4E 80 04 21 */ bctrl
/* 80262FA8 80 0D 8B C0 */ lwz r0, sAllocBytes__20DynamicModuleControl(r13)
/* 80262FAC 7C 03 00 50 */ subf r0, r3, r0
/* 80262FB0 90 0D 8B C0 */ stw r0, sAllocBytes__20DynamicModuleControl(r13)
/* 80262FB4 80 7E 00 14 */ lwz r3, 0x14(r30)
/* 80262FB8 28 03 00 00 */ cmplwi r3, 0
/* 80262FBC 41 82 00 14 */ beq lbl_80262FD0
/* 80262FC0 38 80 00 00 */ li r4, 0
/* 80262FC4 48 06 B5 3D */ bl free__7JKRHeapFPvP7JKRHeap
/* 80262FC8 38 00 00 00 */ li r0, 0
/* 80262FCC 90 1E 00 14 */ stw r0, 0x14(r30)
lbl_80262FD0:
/* 80262FD0 7F C3 F3 78 */ mr r3, r30
/* 80262FD4 81 9E 00 0C */ lwz r12, 0xc(r30)
/* 80262FD8 81 8C 00 28 */ lwz r12, 0x28(r12)
/* 80262FDC 7D 89 03 A6 */ mtctr r12
/* 80262FE0 4E 80 04 21 */ bctrl
/* 80262FE4 38 60 00 01 */ li r3, 1
lbl_80262FE8:
/* 80262FE8 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 80262FEC 83 C1 00 08 */ lwz r30, 8(r1)
/* 80262FF0 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262FF4 7C 08 03 A6 */ mtlr r0
/* 80262FF8 38 21 00 10 */ addi r1, r1, 0x10
/* 80262FFC 4E 80 00 20 */ blr

View File

@ -1,20 +0,0 @@
lbl_80262BC4:
/* 80262BC4 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262BC8 7C 08 02 A6 */ mflr r0
/* 80262BCC 90 01 00 14 */ stw r0, 0x14(r1)
/* 80262BD0 93 E1 00 0C */ stw r31, 0xc(r1)
/* 80262BD4 7C 7F 1B 78 */ mr r31, r3
/* 80262BD8 80 63 00 10 */ lwz r3, 0x10(r3)
/* 80262BDC 28 03 00 00 */ cmplwi r3, 0
/* 80262BE0 41 82 00 14 */ beq lbl_80262BF4
/* 80262BE4 38 80 00 00 */ li r4, 0
/* 80262BE8 48 06 B9 19 */ bl free__7JKRHeapFPvP7JKRHeap
/* 80262BEC 38 00 00 00 */ li r0, 0
/* 80262BF0 90 1F 00 10 */ stw r0, 0x10(r31)
lbl_80262BF4:
/* 80262BF4 38 60 00 01 */ li r3, 1
/* 80262BF8 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 80262BFC 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262C00 7C 08 03 A6 */ mtlr r0
/* 80262C04 38 21 00 10 */ addi r1, r1, 0x10
/* 80262C08 4E 80 00 20 */ blr

View File

@ -1,22 +0,0 @@
lbl_80262C0C:
/* 80262C0C 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262C10 7C 08 02 A6 */ mflr r0
/* 80262C14 90 01 00 14 */ stw r0, 0x14(r1)
/* 80262C18 80 83 00 10 */ lwz r4, 0x10(r3)
/* 80262C1C 28 04 00 00 */ cmplwi r4, 0
/* 80262C20 41 82 00 2C */ beq lbl_80262C4C
/* 80262C24 80 C4 00 10 */ lwz r6, 0x10(r4)
/* 80262C28 80 06 00 08 */ lwz r0, 8(r6)
/* 80262C2C 54 05 00 3C */ rlwinm r5, r0, 0, 0, 0x1e
/* 80262C30 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 80262C34 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 80262C38 38 63 02 2E */ addi r3, r3, 0x22e
/* 80262C3C 80 06 00 0C */ lwz r0, 0xc(r6)
/* 80262C40 7C C5 02 14 */ add r6, r5, r0
/* 80262C44 4C C6 31 82 */ crclr 6
/* 80262C48 4B DA 3E 75 */ bl OSReport
lbl_80262C4C:
/* 80262C4C 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262C50 7C 08 03 A6 */ mtlr r0
/* 80262C54 38 21 00 10 */ addi r1, r1, 0x10
/* 80262C58 4E 80 00 20 */ blr

View File

@ -1,19 +0,0 @@
lbl_8026242C:
/* 8026242C 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262430 7C 08 02 A6 */ mflr r0
/* 80262434 90 01 00 14 */ stw r0, 0x14(r1)
/* 80262438 A0 03 00 00 */ lhz r0, 0(r3)
/* 8026243C 28 00 00 00 */ cmplwi r0, 0
/* 80262440 41 82 00 1C */ beq lbl_8026245C
/* 80262444 38 00 00 00 */ li r0, 0
/* 80262448 B0 03 00 00 */ sth r0, 0(r3)
/* 8026244C 81 83 00 0C */ lwz r12, 0xc(r3)
/* 80262450 81 8C 00 30 */ lwz r12, 0x30(r12)
/* 80262454 7D 89 03 A6 */ mtctr r12
/* 80262458 4E 80 04 21 */ bctrl
lbl_8026245C:
/* 8026245C 38 60 00 01 */ li r3, 1
/* 80262460 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262464 7C 08 03 A6 */ mtlr r0
/* 80262468 38 21 00 10 */ addi r1, r1, 0x10
/* 8026246C 4E 80 00 20 */ blr

View File

@ -1,3 +0,0 @@
lbl_80263218:
/* 80263218 80 63 00 1C */ lwz r3, 0x1c(r3)
/* 8026321C 4E 80 00 20 */ blr

View File

@ -1,32 +0,0 @@
lbl_80263000:
/* 80263000 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80263004 7C 08 02 A6 */ mflr r0
/* 80263008 90 01 00 14 */ stw r0, 0x14(r1)
/* 8026300C 93 E1 00 0C */ stw r31, 0xc(r1)
/* 80263010 93 C1 00 08 */ stw r30, 8(r1)
/* 80263014 7C 7E 1B 78 */ mr r30, r3
/* 80263018 80 63 00 10 */ lwz r3, 0x10(r3)
/* 8026301C 28 03 00 00 */ cmplwi r3, 0
/* 80263020 41 82 00 34 */ beq lbl_80263054
/* 80263024 38 80 00 00 */ li r4, 0
/* 80263028 48 06 B6 89 */ bl getSize__7JKRHeapFPvP7JKRHeap
/* 8026302C 7C 7F 1B 78 */ mr r31, r3
/* 80263030 80 7E 00 14 */ lwz r3, 0x14(r30)
/* 80263034 28 03 00 00 */ cmplwi r3, 0
/* 80263038 41 82 00 0C */ beq lbl_80263044
/* 8026303C 38 80 00 00 */ li r4, 0
/* 80263040 48 06 B6 71 */ bl getSize__7JKRHeapFPvP7JKRHeap
lbl_80263044:
/* 80263044 80 7E 00 10 */ lwz r3, 0x10(r30)
/* 80263048 80 03 00 20 */ lwz r0, 0x20(r3)
/* 8026304C 7C 7F 02 14 */ add r3, r31, r0
/* 80263050 48 00 00 08 */ b lbl_80263058
lbl_80263054:
/* 80263054 38 60 00 00 */ li r3, 0
lbl_80263058:
/* 80263058 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 8026305C 83 C1 00 08 */ lwz r30, 8(r1)
/* 80263060 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80263064 7C 08 03 A6 */ mtlr r0
/* 80263068 38 21 00 10 */ addi r1, r1, 0x10
/* 8026306C 4E 80 00 20 */ blr

View File

@ -1,7 +0,0 @@
lbl_80263070:
/* 80263070 88 03 00 20 */ lbz r0, 0x20(r3)
/* 80263074 54 00 17 3A */ rlwinm r0, r0, 2, 0x1c, 0x1d
/* 80263078 3C 60 80 3C */ lis r3, strings@ha /* 0x803C34B0@ha */
/* 8026307C 38 63 34 B0 */ addi r3, r3, strings@l /* 0x803C34B0@l */
/* 80263080 7C 63 00 2E */ lwzx r3, r3, r0
/* 80263084 4E 80 00 20 */ blr

View File

@ -1,5 +0,0 @@
lbl_80263200:
/* 80263200 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 80263204 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 80263208 38 63 00 DB */ addi r3, r3, 0xdb
/* 8026320C 4E 80 00 20 */ blr

View File

@ -1,15 +0,0 @@
lbl_8026275C:
/* 8026275C 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262760 7C 08 02 A6 */ mflr r0
/* 80262764 90 01 00 14 */ stw r0, 0x14(r1)
/* 80262768 38 00 00 00 */ li r0, 0
/* 8026276C 90 0D 8B C8 */ stw r0, sFileCache__20DynamicModuleControl(r13)
/* 80262770 90 0D 8B C0 */ stw r0, sAllocBytes__20DynamicModuleControl(r13)
/* 80262774 90 0D 8B C4 */ stw r0, sArchive__20DynamicModuleControl(r13)
/* 80262778 38 60 00 00 */ li r3, 0
/* 8026277C 4B FF FF 55 */ bl mountCallback__20DynamicModuleControlFPv
/* 80262780 38 60 00 01 */ li r3, 1
/* 80262784 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262788 7C 08 03 A6 */ mtlr r0
/* 8026278C 38 21 00 10 */ addi r1, r1, 0x10
/* 80262790 4E 80 00 20 */ blr

View File

@ -1,42 +0,0 @@
lbl_802622D0:
/* 802622D0 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 802622D4 7C 08 02 A6 */ mflr r0
/* 802622D8 90 01 00 14 */ stw r0, 0x14(r1)
/* 802622DC 93 E1 00 0C */ stw r31, 0xc(r1)
/* 802622E0 7C 7F 1B 78 */ mr r31, r3
/* 802622E4 A0 03 00 00 */ lhz r0, 0(r3)
/* 802622E8 28 00 00 00 */ cmplwi r0, 0
/* 802622EC 40 82 00 4C */ bne lbl_80262338
/* 802622F0 81 83 00 0C */ lwz r12, 0xc(r3)
/* 802622F4 81 8C 00 20 */ lwz r12, 0x20(r12)
/* 802622F8 7D 89 03 A6 */ mtctr r12
/* 802622FC 4E 80 04 21 */ bctrl
/* 80262300 7F E3 FB 78 */ mr r3, r31
/* 80262304 81 9F 00 0C */ lwz r12, 0xc(r31)
/* 80262308 81 8C 00 2C */ lwz r12, 0x2c(r12)
/* 8026230C 7D 89 03 A6 */ mtctr r12
/* 80262310 4E 80 04 21 */ bctrl
/* 80262314 2C 03 00 00 */ cmpwi r3, 0
/* 80262318 40 82 00 0C */ bne lbl_80262324
/* 8026231C 38 60 00 00 */ li r3, 0
/* 80262320 48 00 00 30 */ b lbl_80262350
lbl_80262324:
/* 80262324 A0 7F 00 02 */ lhz r3, 2(r31)
/* 80262328 28 03 FF FF */ cmplwi r3, 0xffff
/* 8026232C 40 80 00 0C */ bge lbl_80262338
/* 80262330 38 03 00 01 */ addi r0, r3, 1
/* 80262334 B0 1F 00 02 */ sth r0, 2(r31)
lbl_80262338:
/* 80262338 A0 7F 00 00 */ lhz r3, 0(r31)
/* 8026233C 28 03 FF FF */ cmplwi r3, 0xffff
/* 80262340 40 80 00 0C */ bge lbl_8026234C
/* 80262344 38 03 00 01 */ addi r0, r3, 1
/* 80262348 B0 1F 00 00 */ sth r0, 0(r31)
lbl_8026234C:
/* 8026234C 38 60 00 01 */ li r3, 1
lbl_80262350:
/* 80262350 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 80262354 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262358 7C 08 03 A6 */ mtlr r0
/* 8026235C 38 21 00 10 */ addi r1, r1, 0x10
/* 80262360 4E 80 00 20 */ blr

View File

@ -1,19 +0,0 @@
lbl_802623EC:
/* 802623EC 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 802623F0 7C 08 02 A6 */ mflr r0
/* 802623F4 90 01 00 14 */ stw r0, 0x14(r1)
/* 802623F8 A0 03 00 00 */ lhz r0, 0(r3)
/* 802623FC 28 00 00 00 */ cmplwi r0, 0
/* 80262400 40 82 00 18 */ bne lbl_80262418
/* 80262404 81 83 00 0C */ lwz r12, 0xc(r3)
/* 80262408 81 8C 00 24 */ lwz r12, 0x24(r12)
/* 8026240C 7D 89 03 A6 */ mtctr r12
/* 80262410 4E 80 04 21 */ bctrl
/* 80262414 48 00 00 08 */ b lbl_8026241C
lbl_80262418:
/* 80262418 38 60 00 01 */ li r3, 1
lbl_8026241C:
/* 8026241C 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262420 7C 08 03 A6 */ mtlr r0
/* 80262424 38 21 00 10 */ addi r1, r1, 0x10
/* 80262428 4E 80 00 20 */ blr

View File

@ -1,37 +0,0 @@
lbl_802626D0:
/* 802626D0 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 802626D4 7C 08 02 A6 */ mflr r0
/* 802626D8 90 01 00 14 */ stw r0, 0x14(r1)
/* 802626DC 93 E1 00 0C */ stw r31, 0xc(r1)
/* 802626E0 4B DA C7 0D */ bl mDoExt_getArchiveHeap__Fv
/* 802626E4 7C 7F 1B 78 */ mr r31, r3
/* 802626E8 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 802626EC 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 802626F0 38 63 00 E0 */ addi r3, r3, 0xe0
/* 802626F4 7F E4 FB 78 */ mr r4, r31
/* 802626F8 38 A0 00 00 */ li r5, 0
/* 802626FC 48 07 22 B9 */ bl mount__12JKRFileCacheFPCcP7JKRHeapPCc
/* 80262700 90 6D 8B C8 */ stw r3, sFileCache__20DynamicModuleControl(r13)
/* 80262704 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 80262708 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 8026270C 38 63 00 F3 */ addi r3, r3, 0xf3
/* 80262710 38 80 00 04 */ li r4, 4
/* 80262714 7F E5 FB 78 */ mr r5, r31
/* 80262718 38 C0 00 01 */ li r6, 1
/* 8026271C 48 07 30 C9 */ bl mount__10JKRArchiveFPCcQ210JKRArchive10EMountModeP7JKRHeapQ210JKRArchive15EMountDirection
/* 80262720 90 6D 8B C4 */ stw r3, sArchive__20DynamicModuleControl(r13)
/* 80262724 28 03 00 00 */ cmplwi r3, 0
/* 80262728 40 82 00 1C */ bne lbl_80262744
/* 8026272C 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 80262730 38 83 A4 A0 */ addi r4, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 80262734 38 64 00 FC */ addi r3, r4, 0xfc
/* 80262738 38 84 00 F3 */ addi r4, r4, 0xf3
/* 8026273C 4C C6 31 82 */ crclr 6
/* 80262740 4B DA 45 AD */ bl OSReport_Warning
lbl_80262744:
/* 80262744 80 6D 8B C4 */ lwz r3, sArchive__20DynamicModuleControl(r13)
/* 80262748 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 8026274C 80 01 00 14 */ lwz r0, 0x14(r1)
/* 80262750 7C 08 03 A6 */ mtlr r0
/* 80262754 38 21 00 10 */ addi r1, r1, 0x10
/* 80262758 4E 80 00 20 */ blr

View File

@ -1,37 +0,0 @@
lbl_80262364:
/* 80262364 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 80262368 7C 08 02 A6 */ mflr r0
/* 8026236C 90 01 00 14 */ stw r0, 0x14(r1)
/* 80262370 93 E1 00 0C */ stw r31, 0xc(r1)
/* 80262374 7C 7F 1B 78 */ mr r31, r3
/* 80262378 A0 83 00 00 */ lhz r4, 0(r3)
/* 8026237C 28 04 00 00 */ cmplwi r4, 0
/* 80262380 41 82 00 40 */ beq lbl_802623C0
/* 80262384 38 04 FF FF */ addi r0, r4, -1
/* 80262388 B0 1F 00 00 */ sth r0, 0(r31)
/* 8026238C A0 1F 00 00 */ lhz r0, 0(r31)
/* 80262390 28 00 00 00 */ cmplwi r0, 0
/* 80262394 40 82 00 40 */ bne lbl_802623D4
/* 80262398 81 83 00 0C */ lwz r12, 0xc(r3)
/* 8026239C 81 8C 00 30 */ lwz r12, 0x30(r12)
/* 802623A0 7D 89 03 A6 */ mtctr r12
/* 802623A4 4E 80 04 21 */ bctrl
/* 802623A8 7F E3 FB 78 */ mr r3, r31
/* 802623AC 81 9F 00 0C */ lwz r12, 0xc(r31)
/* 802623B0 81 8C 00 28 */ lwz r12, 0x28(r12)
/* 802623B4 7D 89 03 A6 */ mtctr r12
/* 802623B8 4E 80 04 21 */ bctrl
/* 802623BC 48 00 00 18 */ b lbl_802623D4
lbl_802623C0:
/* 802623C0 3C 60 80 3A */ lis r3, DynamicLink__stringBase0@ha /* 0x8039A4A0@ha */
/* 802623C4 38 63 A4 A0 */ addi r3, r3, DynamicLink__stringBase0@l /* 0x8039A4A0@l */
/* 802623C8 7F E4 FB 78 */ mr r4, r31
/* 802623CC 4C C6 31 82 */ crclr 6
/* 802623D0 4B DA 49 1D */ bl OSReport_Warning
lbl_802623D4:
/* 802623D4 38 60 00 01 */ li r3, 1
/* 802623D8 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 802623DC 80 01 00 14 */ lwz r0, 0x14(r1)
/* 802623E0 7C 08 03 A6 */ mtlr r0
/* 802623E4 38 21 00 10 */ addi r1, r1, 0x10
/* 802623E8 4E 80 00 20 */ blr

View File

@ -71,8 +71,8 @@ lbl_8033A060:
/* 8033A06C 80 63 00 30 */ lwz r3, 0x30(r3)
/* 8033A070 28 03 00 00 */ cmplwi r3, 0
/* 8033A074 40 82 00 10 */ bne lbl_8033A084
/* 8033A078 3C 60 80 46 */ lis r3, 0x8046 /* 0x80459BE0@ha */
/* 8033A07C 38 63 9B E0 */ addi r3, r3, 0x9BE0 /* 0x80459BE0@l */
/* 8033A078 3C 60 80 46 */ lis r3, _stack_end+0x3018@ha /* 0x80459BE0@ha */
/* 8033A07C 38 63 9B E0 */ addi r3, r3, _stack_end+0x3018@l /* 0x80459BE0@l */
/* 8033A080 48 00 00 04 */ b lbl_8033A084
lbl_8033A084:
/* 8033A084 48 00 12 21 */ bl OSSetArenaLo
@ -86,8 +86,8 @@ lbl_8033A084:
/* 8033A0A4 80 03 00 00 */ lwz r0, 0(r3)
/* 8033A0A8 28 00 00 02 */ cmplwi r0, 2
/* 8033A0AC 40 80 00 18 */ bge lbl_8033A0C4
/* 8033A0B0 3C 60 80 45 */ lis r3, 0x8045 /* 0x80457BC8@ha */
/* 8033A0B4 38 63 7B C8 */ addi r3, r3, 0x7BC8 /* 0x80457BC8@l */
/* 8033A0B0 3C 60 80 45 */ lis r3, _stack_end+0x1000@ha /* 0x80457BC8@ha */
/* 8033A0B4 38 63 7B C8 */ addi r3, r3, _stack_end+0x1000@l /* 0x80457BC8@l */
/* 8033A0B8 38 03 00 1F */ addi r0, r3, 0x1f
/* 8033A0BC 54 03 00 34 */ rlwinm r3, r0, 0, 0, 0x1a
/* 8033A0C0 48 00 11 E5 */ bl OSSetArenaLo
@ -96,8 +96,8 @@ lbl_8033A0C4:
/* 8033A0C8 80 63 00 34 */ lwz r3, 0x34(r3)
/* 8033A0CC 28 03 00 00 */ cmplwi r3, 0
/* 8033A0D0 40 82 00 10 */ bne lbl_8033A0E0
/* 8033A0D4 3C 60 81 70 */ lis r3, 0x8170 /* 0x81700000@ha */
/* 8033A0D8 38 63 00 00 */ addi r3, r3, 0x0000 /* 0x81700000@l */
/* 8033A0D4 3C 60 81 70 */ lis r3, __ArenaHi@ha /* 0x81700000@ha */
/* 8033A0D8 38 63 00 00 */ addi r3, r3, __ArenaHi@l /* 0x81700000@l */
/* 8033A0DC 48 00 00 04 */ b lbl_8033A0E0
lbl_8033A0E0:
/* 8033A0E0 48 00 11 BD */ bl OSSetArenaHi

View File

@ -31,11 +31,11 @@ lbl_80340B1C:
/* 80340B90 4B FF B4 71 */ bl OSClearContext
/* 80340B94 7F E3 FB 78 */ mr r3, r31
/* 80340B98 4B FF B2 A1 */ bl OSSetCurrentContext
/* 80340B9C 3C 60 80 45 */ lis r3, 0x8045 /* 0x80457BC8@ha */
/* 80340BA0 38 03 7B C8 */ addi r0, r3, 0x7BC8 /* 0x80457BC8@l */
/* 80340BA4 3C 60 80 45 */ lis r3, 0x8045 /* 0x80456BC8@ha */
/* 80340B9C 3C 60 80 45 */ lis r3, _stack_end+0x1000@ha /* 0x80457BC8@ha */
/* 80340BA0 38 03 7B C8 */ addi r0, r3, _stack_end+0x1000@l /* 0x80457BC8@l */
/* 80340BA4 3C 60 80 45 */ lis r3, _stack_end@ha /* 0x80456BC8@ha */
/* 80340BA8 90 1C 07 1C */ stw r0, 0x71c(r28)
/* 80340BAC 38 03 6B C8 */ addi r0, r3, 0x6BC8 /* 0x80456BC8@l */
/* 80340BAC 38 03 6B C8 */ addi r0, r3, _stack_end@l /* 0x80456BC8@l */
/* 80340BB0 90 1C 07 20 */ stw r0, 0x720(r28)
/* 80340BB4 3C 60 DE AE */ lis r3, 0xDEAE /* 0xDEADBABE@ha */
/* 80340BB8 38 03 BA BE */ addi r0, r3, 0xBABE /* 0xDEADBABE@l */

View File

@ -28,10 +28,10 @@ lbl_800032B0:
/* 80003318 3B A0 00 00 */ li r29, 0
/* 8000331C 3B C0 00 00 */ li r30, 0
/* 80003320 3B E0 00 00 */ li r31, 0
/* 80003324 3C 20 80 45 */ lis r1, 0x8045 /* 0x80457BC8@h */
/* 80003328 60 21 7B C8 */ ori r1, r1, 0x7BC8 /* 0x80457BC8@l */
/* 8000332C 3C 40 80 45 */ lis r2, 0x8045 /* 0x80459A00@h */
/* 80003330 60 42 9A 00 */ ori r2, r2, 0x9A00 /* 0x80459A00@l */
/* 80003334 3D A0 80 45 */ lis r13, 0x8045 /* 0x80458580@h */
/* 80003338 61 AD 85 80 */ ori r13, r13, 0x8580 /* 0x80458580@l */
/* 80003324 3C 20 80 45 */ lis r1, _stack_end+0x1000@h /* 0x80457BC8@h */
/* 80003328 60 21 7B C8 */ ori r1, r1, _stack_end+0x1000@l /* 0x80457BC8@l */
/* 8000332C 3C 40 80 45 */ lis r2, _SDA2_BASE_@h /* 0x80459A00@h */
/* 80003330 60 42 9A 00 */ ori r2, r2, _SDA2_BASE_@l /* 0x80459A00@l */
/* 80003334 3D A0 80 45 */ lis r13, _SDA_BASE_@h /* 0x80458580@h */
/* 80003338 61 AD 85 80 */ ori r13, r13, _SDA_BASE_@l /* 0x80458580@l */
/* 8000333C 4E 80 00 20 */ blr

View File

@ -2,5 +2,73 @@
#define DYNAMICLINK_H
#include "dolphin/types.h"
#include "dolphin/os/OSLink.h"
#include "m_Do/m_Do_dvd_thread.h"
#include "JSystem/JKernel/JKRFileCache.h"
struct DynamicModuleControlBase {
/* 0x00 */u16 mLinkCount;
/* 0x02 */u16 mDoLinkCount;
/* 0x04 */DynamicModuleControlBase* mPrev;
/* 0x08 */DynamicModuleControlBase* mNext;
/* 0x0C */ /*vtable*/
/* 802621CC */ virtual ~DynamicModuleControlBase();
/* 800188DC */ virtual const char* getModuleName() const;
/* 80263210 */ virtual int getModuleSize() const;
/* 80263200 */ virtual const char* getModuleTypeString() const;
/* 80262470 */ virtual void dump();
/* 802631FC */ virtual void dump2();
/* 802631DC */ virtual bool do_load();
/* 802631F4 */ virtual bool do_load_async();
/* 802631E4 */ virtual bool do_unload();
/* 802631D4 */ virtual BOOL do_link();
/* 802631EC */ virtual bool do_unlink();
/* 80262284 */ DynamicModuleControlBase();
/* 802622D0 */ bool link();
/* 80262364 */ bool unlink();
/* 802623EC */ bool load_async();
/* 8026242C */ bool force_unlink();
static inline DynamicModuleControlBase* getFirstClass() {return mFirst;}
inline DynamicModuleControlBase* getNextClass() {return mNext;}
static DynamicModuleControlBase* mFirst;
static DynamicModuleControlBase* mLast;
};
struct DynamicModuleControl : DynamicModuleControlBase {
/* 800188E4 */ virtual ~DynamicModuleControl();
/* 80263218 */ virtual const char* getModuleName() const;
/* 80263000 */ virtual int getModuleSize() const;
/* 80263070 */ virtual const char* getModuleTypeString() const;
virtual void dump() = 0;
/* 80262C0C */ virtual void dump2();
/* 802627E8 */ virtual bool do_load();
/* 80262AFC */ virtual bool do_load_async();
/* 80262BC4 */ virtual bool do_unload();
/* 80262C5C */ virtual BOOL do_link();
/* 80262F28 */ virtual bool do_unlink();
/* 80262660 */ DynamicModuleControl(char const*);
/* 802626D0 */ static JKRArchive* mountCallback(void*);
/* 8026275C */ bool initialize();
/* 80262794 */ static void* callback(void*);
/* 0x10 */OSModuleInfo* mModule;
/* 0x14 */void* mBss;
/* 0x18 */u32 unk_24;
/* 0x1c */const char* mName;
/* 0x20 */u8 mResourceType;
/* 0x21 */u8 unk_33;
/* 0x22 */u16 mChecksum;
/* 0x24 */s32 mSize;
/* 0x28 */mDoDvdThd_callback_c* mAsyncLoadCallback;
static u32 sAllocBytes;
static JKRArchive* sArchive;
static JKRFileCache* sFileCache;
};
#endif /* DYNAMICLINK_H */

View File

@ -221,4 +221,8 @@ inline JKRHeap* JKRGetCurrentHeap() {
return JKRHeap::getCurrentHeap();
}
inline u32 JKRGetMemBlockSize(JKRHeap* heap,void* block) {
return JKRHeap::getSize(block,heap);
}
#endif /* JKRHEAP_H */

View File

@ -126,15 +126,12 @@ private:
/* 0x10 */ JUTConsole* mDirectConsole;
}; // Size: 0x14
extern "C" {
void JUTSetReportConsole(JUTConsole*);
void JUTSetWarningConsole(JUTConsole*);
};
void JUTConsole_print_f_va_(JUTConsole*, const char*, va_list);
JUTConsole* JUTGetReportConsole();
JUTConsole* JUTGetWarningConsole();
void JUTReportConsole_f_va(const char*, va_list);
void JUTReportConsole_f(const char*, ...);
extern "C" void JUTConsole_print_f_va_(JUTConsole*, const char*, va_list);
extern "C" void JUTSetReportConsole(JUTConsole*);
extern "C" JUTConsole* JUTGetReportConsole();
extern "C" void JUTSetWarningConsole(JUTConsole*);
extern "C" JUTConsole* JUTGetWarningConsole();
extern "C" void JUTReportConsole_f_va(const char*, va_list);
extern "C" void JUTReportConsole_f(const char*, ...);
#endif /* JUTCONSOLE_H */

View File

@ -6,7 +6,13 @@
class dDrawPath_c : public dDlst_base_c {
public:
struct line_class {};
struct line_class {
/* 0x00 */ u8 unk0;
/* 0x01 */ u8 unk1;
/* 0x02 */ u8 unk2;
/* 0x03 */ u8 unk3;
/* 0x04 */ u16* unk4;
};
struct poly_class {};
@ -52,7 +58,7 @@ public:
virtual void isDrawPath() = 0;
virtual void preRenderingMap() = 0;
virtual void postRenderingMap() = 0;
virtual void getBackColor() const = 0;
virtual GXColor* getBackColor() const = 0;
};
class dRenderingFDAmap_c : public dRenderingMap_c {
@ -65,8 +71,8 @@ public:
/* 8002ABF8 */ virtual ~dRenderingFDAmap_c();
/* 8003D188 */ virtual void preRenderingMap();
/* 8003D320 */ virtual void postRenderingMap();
/* 8003D68C */ virtual void getDecoLineColor(int, int);
/* 8003D6B8 */ virtual void getDecorationLineWidth(int);
/* 8003D68C */ virtual GXColor* getDecoLineColor(int, int);
/* 8003D6B8 */ virtual s32 getDecorationLineWidth(int);
private:
/* 0x04 */ int field_0x4;

View File

@ -78,7 +78,7 @@ public:
/* 8003FF14 */ virtual void preDrawPath();
/* 8003FFC4 */ virtual void postDrawPath();
/* 800402C0 */ virtual void isDrawPath();
/* 8003FE4C */ virtual void getBackColor() const;
/* 8003FE4C */ virtual GXColor* getBackColor() const;
/* 800402E0 */ virtual bool getFirstDrawLayerNo();
/* 800402E8 */ virtual void getNextDrawLayerNo(int);
/* 800409E0 */ virtual void isDrawIconSingle(dTres_c::data_s const*, int, int, bool, bool,

View File

@ -1,8 +1,8 @@
#ifndef D_SAVE_D_SAVE_H
#define D_SAVE_D_SAVE_H
#include "MSL_C.PPCEABI.bare.H/MSL_Common/src/printf.h"
#include "MSL_C.PPCEABI.bare.H/MSL_Common/src/string.h"
#include "MSL_C.PPCEABI.bare.H/MSL_Common/Src/printf.h"
#include "MSL_C.PPCEABI.bare.H/MSL_Common/Src/string.h"
#include "SSystem/SComponent/c_xyz.h"
#include "dolphin/types.h"

View File

@ -990,6 +990,10 @@ inline void GXPosition2u16(u16 x, u16 y) {
GFX_FIFO(u16) = y;
}
inline void GXPosition1x16(u16 x) {
GFX_FIFO(u16) = x;
}
inline void GXEnd() {}
};

View File

@ -9,6 +9,7 @@ typedef float Mtx[3][4];
typedef float Mtx33[3][3];
typedef float Mtx23[2][3];
typedef f32 (*MtxP)[4];
typedef const f32 (*CMtxP)[4]; //Change name later?
extern "C" {
void PSMTXIdentity(Mtx matrix);

View File

@ -3,34 +3,40 @@
#include "dolphin/types.h"
struct OSModuleInfo {
u32 id;
OSModuleInfo* next;
OSModuleInfo* prev;
u32 num_sections;
u32 section_info_offset;
u32 name_offset;
u32 name_size;
u32 version;
u32 bss_size;
u32 rel_offset;
u32 imp_offset;
u32 imp_size;
u8 prolog_section;
u8 epilog_section;
u8 unresolved_section;
u8 bss_section;
u32 prolog;
u32 epilog;
u32 unresolved;
u32 align;
u32 bss_align;
u32 fix_size;
struct OSSectionInfo {
u32 mOffset;
u32 mSize;
};
struct OSSectionInfo {
u32 offset;
u32 size;
struct OSModuleInfo {
u32 mId;
OSModuleInfo* mNext;
OSModuleInfo* mPrev;
u32 mNumSections;
struct { //Needed to get an assert correct; very likely bigger
u32 sectionInfoOffset;
} info;
u32 mModuleNameOffset;
u32 mModuleNameSize;
u32 mModuleVersion;
u32 mBssSize;
u32 mRelocationTableOffset;
u32 mImportTableOffset;
u32 mImportTableSize;
u8 mPrologSection;
u8 mEpilogSection;
u8 mUnresolvedSection;
u8 mBssSection;
u32 (*prolog)();
void(*epilog)();
u32 mUnresolvedFuncOffset;
u32 mModuleAlignment;
u32 mBssAlignment;
u32 fixSize;
};
extern "C" BOOL OSLink(OSModuleInfo*);
extern "C" BOOL OSLinkFixed(OSModuleInfo*,u32);
extern "C" BOOL OSUnlink(OSModuleInfo*);
#endif /* OSLINK_H */

View File

@ -16,6 +16,8 @@ public:
public:
/* 800158FC */ virtual ~mDoDvdThd_command_c();
/* 80015B74 */ mDoDvdThd_command_c();
inline s32 sync() {return mIsDone;}
inline void destroy() {delete this;}
virtual s32 execute() = 0;
}; // Size = 0x14

View File

@ -1,8 +1,8 @@
#ifndef M_DO_M_DO_MTX_H
#define M_DO_M_DO_MTX_H
#include "SSystem/SComponent/c_Xyz.h"
#include "SSystem/SComponent/c_sXyz.h"
#include "SSystem/SComponent/c_xyz.h"
#include "SSystem/SComponent/c_sxyz.h"
#include "dolphin/mtx/mtx.h"
#include "dolphin/mtx/quat.h"
#include "dolphin/types.h"
@ -15,7 +15,7 @@ void mDoMtx_ZrotS(Mtx, s16);
void mDoMtx_YrotS(Mtx, s16);
void mDoMtx_XrotS(Mtx, s16);
void mDoMtx_YrotM(Mtx, s16);
void mDoMtx_MtxToRot(MtxP, csXyz*);
void mDoMtx_MtxToRot(CMtxP, csXyz*);
class mDoMtx_stack_c {
public:

View File

@ -6,7 +6,7 @@
#include "JSystem/JKernel/JKRThread.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "MSL_C.PPCEABI.bare.H/MSL_Common/src/printf.h"
#include "MSL_C.PPCEABI.bare.H/MSL_Common/Src/printf.h"
#include "dol2asm.h"
#include "dolphin/types.h"

View File

@ -258,7 +258,7 @@ asm void JUTConsole::print(char const* param_0) {
#pragma pop
/* 802E7F30-802E7F7C 2E2870 004C+00 1/1 1/1 0/0 .text JUTConsole_print_f_va_ */
void JUTConsole_print_f_va_(JUTConsole* console, const char* fmt, va_list args) {
extern "C" void JUTConsole_print_f_va_(JUTConsole* console, const char* fmt, va_list args) {
char buf[1024];
vsnprintf(buf, sizeof(buf), fmt, args);
console->print(buf);
@ -414,12 +414,12 @@ void JUTConsoleManager::setDirectConsole(JUTConsole* pConsole) {
static JUTConsole* sReportConsole;
/* 802E8520-802E8528 2E2E60 0008+00 1/1 1/1 0/0 .text JUTSetReportConsole */
void JUTSetReportConsole(JUTConsole* pConsole) {
extern "C" void JUTSetReportConsole(JUTConsole* pConsole) {
sReportConsole = pConsole;
}
/* 802E8528-802E8530 -00001 0008+00 0/0 0/0 0/0 .text JUTGetReportConsole */
JUTConsole* JUTGetReportConsole() {
extern "C" JUTConsole* JUTGetReportConsole() {
return sReportConsole;
}
@ -428,17 +428,17 @@ JUTConsole* JUTGetReportConsole() {
static JUTConsole* sWarningConsole;
/* 802E8530-802E8538 2E2E70 0008+00 1/1 1/1 0/0 .text JUTSetWarningConsole */
void JUTSetWarningConsole(JUTConsole* pConsole) {
extern "C" void JUTSetWarningConsole(JUTConsole* pConsole) {
sWarningConsole = pConsole;
}
/* 802E8538-802E8540 -00001 0008+00 0/0 0/0 0/0 .text JUTGetWarningConsole */
JUTConsole* JUTGetWarningConsole() {
extern "C" JUTConsole* JUTGetWarningConsole() {
return sWarningConsole;
}
/* 802E8540-802E85C8 2E2E80 0088+00 2/2 0/0 0/0 .text JUTReportConsole_f_va */
void JUTReportConsole_f_va(const char* fmt, va_list args) {
extern "C" void JUTReportConsole_f_va(const char* fmt, va_list args) {
char buf[256];
if (JUTGetReportConsole() == NULL) {
@ -450,7 +450,7 @@ void JUTReportConsole_f_va(const char* fmt, va_list args) {
}
/* 802E85C8-802E8648 2E2F08 0080+00 2/2 8/8 0/0 .text JUTReportConsole_f */
void JUTReportConsole_f(const char* fmt, ...) {
extern "C" void JUTReportConsole_f(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
JUTReportConsole_f_va(fmt, args);

View File

@ -4,7 +4,7 @@
//
#include "JSystem/JUtility/JUTDirectPrint.h"
#include "MSL_C.PPCEABI.bare.H/MSL_Common/src/printf.h"
#include "MSL_C.PPCEABI.bare.H/MSL_Common/Src/printf.h"
#include "Runtime.PPCEABI.H/__va_arg.h"
#include "dol2asm.h"
#include "dolphin/os/OSCache.h"

View File

@ -338,25 +338,25 @@ bool JUTException::searchPartialModule(u32 address, u32* module_id, u32* section
OSModuleInfo* module = *(OSModuleInfo**)0x800030C8;
while (module) {
OSSectionInfo* section = (OSSectionInfo*)module->section_info_offset;
for (u32 i = 0; i < module->num_sections; section++, i++) {
if (section->size) {
u32 addr = ALIGN_PREV(section->offset, 2);
if ((addr <= address) && (address < addr + section->size)) {
OSSectionInfo* section = (OSSectionInfo*)module->info.sectionInfoOffset;
for (u32 i = 0; i < module->mNumSections; section=section+1, i++) {
if (section->mSize) {
u32 addr = ALIGN_PREV(section->mOffset, 2);
if ((addr <= address) && (address < addr + section->mSize)) {
if (module_id)
*module_id = module->id;
*module_id = module->mId;
if (section_id)
*section_id = i;
if (section_offset)
*section_offset = address - addr;
if (name_offset)
*name_offset = module->name_offset;
*name_offset = module->mModuleNameOffset;
return true;
}
}
}
module = module->next;
module = module->mNext;
}
return false;

View File

@ -497,6 +497,9 @@ u8 __OSStartTime[4];
extern u8 data_80451634[4];
u8 data_80451634[4];
extern void* __ArenaHi;
extern void* _stack_end;
/* 80339F60-8033A440 3348A0 04E0+00 0/0 2/2 0/0 .text OSInit */
#pragma push
#pragma optimization_level 0

View File

@ -16,10 +16,7 @@ extern "C" static void OSNotifyUnlink();
extern "C" void OSSetStringTable();
extern "C" static void Relocate();
extern "C" static void Link();
extern "C" void OSLink();
extern "C" void OSLinkFixed();
extern "C" static void Undo();
extern "C" void OSUnlink();
extern "C" void __OSModuleInit();
//
@ -125,7 +122,7 @@ static asm void Link() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void OSLink() {
extern "C" asm BOOL OSLink(OSModuleInfo* info) {
nofralloc
#include "asm/dolphin/os/OSLink/OSLink.s"
}
@ -135,7 +132,7 @@ asm void OSLink() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void OSLinkFixed() {
extern "C" asm BOOL OSLinkFixed(OSModuleInfo* info, u32 unk) {
nofralloc
#include "asm/dolphin/os/OSLink/OSLinkFixed.s"
}
@ -201,7 +198,7 @@ static asm void Undo() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void OSUnlink() {
extern "C" asm BOOL OSUnlink(OSModuleInfo* info) {
nofralloc
#include "asm/dolphin/os/OSLink/OSUnlink.s"
}

View File

@ -119,6 +119,9 @@ static u8 RunQueueHint[4];
static u8 Reschedule[4 + 4 /* padding */];
/* 80340B1C-80340C74 33B45C 0158+00 0/0 1/1 0/0 .text __OSThreadInit */
extern void* _stack_end;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off

View File

@ -277,7 +277,7 @@ extern "C" static void cMtx_XrotM__FPA4_fs();
extern "C" static void JMAFastSqrt__Ff();
extern "C" static void dComIfGp_particle_set__FUlUsPC4cXyzPC5csXyzPC4cXyz();
extern "C" void cancelOriginalDemo__9daHorse_cFv();
extern "C" void __ct__10JAISoundIDFUl();
extern "C" void __ct__10JAISoundIDFUl(u32* this_replacement,u32 param_0);
extern "C" static void dComIfGp_getVibration__Fv();
extern "C" void __ct__4cXyzFfff();
extern "C" void onDemoJumpDistance__9daHorse_cFff();
@ -4970,8 +4970,8 @@ asm void daHorse_c::cancelOriginalDemo() {
#pragma pop
/* 807E27D0-807E27D8 -00001 0008+00 0/0 0/0 0/0 .text __ct__10JAISoundIDFUl */
JAISoundID::JAISoundID(u32 param_0) {
*(u32*)this = (u32)(param_0);
extern "C" void __ct__10JAISoundIDFUl(u32* this_replacement,u32 param_0) {
*(u32*)this_replacement = (u32)(param_0);
}
/* 807E27D8-807E27E8 010438 0010+00 1/1 0/0 0/0 .text dComIfGp_getVibration__Fv */

File diff suppressed because it is too large Load Diff

View File

@ -17,16 +17,25 @@ struct dRes_control_c {
/* 8003C2EC */ void getRes(char const*, s32, dRes_info_c*, int);
};
struct dMpath_n {
struct dTexObjAggregate_c {
/* 8003C85C */ void create();
/* 8003C8F4 */ void remove();
/* 8003D740 */ ~dTexObjAggregate_c();
/* 8003D740 */ ~dTexObjAggregate_c() {remove();};
inline dTexObjAggregate_c() {
for(int i = 0;i<7;i++) {
mTexObjs[i] = NULL;
}
}
GXTexObj* mTexObjs[7];
};
static u8 m_texObjAgg[28];
static dTexObjAggregate_c m_texObjAgg;
};
STATIC_ASSERT(sizeof(dMpath_n::dTexObjAggregate_c)==28);
//
// Forward References:
//
@ -78,9 +87,9 @@ extern "C" void _savegpr_28();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" extern u8 g_mDoMtx_identity[48 + 24 /* padding */];
extern "C" extern Mtx g_mDoMtx_identity;
extern "C" extern u8 g_dComIfG_gameInfo[122384];
extern "C" extern u8 g_clearColor[4];
extern "C" extern GXColor g_clearColor;
//
// Declarations:
@ -232,48 +241,49 @@ asm void dRenderingFDAmap_c::setTevSettingIntensityTextureToCI() const {
}
#pragma pop
/* ############################################################################################## */
/* 80451E08-80451E0C 000408 0004+00 3/3 0/0 0/0 .sdata2 @3836 */
SECTION_SDATA2 static u8 lit_3836[4] = {
0x00,
0x00,
0x00,
0x00,
};
/* 8003D0AC-8003D188 0379EC 00DC+00 1/1 0/0 0/0 .text drawBack__18dRenderingFDAmap_cCFv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dRenderingFDAmap_c::drawBack() const {
nofralloc
#include "asm/d/map/d_map_path/drawBack__18dRenderingFDAmap_cCFv.s"
void dRenderingFDAmap_c::drawBack() const {
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS,GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0,GX_VA_POS,GX_CLR_RGBA,GX_F32,0);
GXColor* colorPtr = getBackColor();
GXSetTevColor(GX_TEVREG0,*colorPtr);
GXBegin(GX_QUADS,GX_VTXFMT0,4);
GXPosition3f32(-field_0x8,-field_0xc,0);
GXPosition3f32(field_0x8,-field_0xc,0);
GXPosition3f32(field_0x8,field_0xc,0);
GXPosition3f32(-field_0x8,field_0xc,0);
GXEnd();
}
#pragma pop
/* ############################################################################################## */
/* 80451E0C-80451E10 00040C 0004+00 1/1 0/0 0/0 .sdata2 @3846 */
SECTION_SDATA2 static f32 lit_3846 = 1.0f;
/* 80451E10-80451E14 000410 0004+00 1/1 0/0 0/0 .sdata2 @3847 */
SECTION_SDATA2 static f32 lit_3847 = 0.5f;
/* 80451E14-80451E18 000414 0004+00 1/1 0/0 0/0 .sdata2 @3848 */
SECTION_SDATA2 static f32 lit_3848 = 10000.0f;
/* 80451E18-80451E20 000418 0008+00 1/1 0/0 0/0 .sdata2 @3850 */
SECTION_SDATA2 static f64 lit_3850 = 4503599627370496.0 /* cast u32 to float */;
/* 8003D188-8003D320 037AC8 0198+00 1/0 8/0 0/0 .text preRenderingMap__18dRenderingFDAmap_cFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dRenderingFDAmap_c::preRenderingMap() {
nofralloc
#include "asm/d/map/d_map_path/preRenderingMap__18dRenderingFDAmap_cFv.s"
void dRenderingFDAmap_c::preRenderingMap() {
GXSetViewport(0.0f,0.0f,field_0x1c,field_0x1e,0.0f,1.0f);
GXSetScissor(0,0,field_0x1c,field_0x1e);
GXSetNumChans(1);
GXSetNumTevStages(1);
GXSetChanCtrl(GX_COLOR0A0,GX_FALSE,GX_SRC_REG,GX_SRC_REG,GX_LIGHT_NULL,GX_DF_NONE,GX_AF_NONE);
GXSetAlphaCompare(GX_ALWAYS,0,GX_AOP_OR,GX_ALWAYS,0);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE,GX_ALWAYS,GX_FALSE);
GXSetBlendMode(GX_BM_NONE,GX_BL_SRC_ALPHA,GX_BL_INV_SRC_ALPHA,GX_LO_CLEAR);
GXColor color = g_clearColor;
GXSetFog(GX_FOG_NONE,0.0f,0.0f,0.0f,0.0f,color);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_FALSE);
GXSetNumIndStages(0);
GXSetClipMode(GX_FALSE);
setTevSettingNonTextureDirectColor();
float right = field_0x8*0.5f;
float top = field_0xc*0.5f;
Mtx44 matrix;
C_MTXOrtho(matrix,top,-top,-right,right,0.0f,10000.0f);
GXSetProjection(matrix,GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(g_mDoMtx_identity,GX_PNMTX0);
GXSetCurrentMtx(0);
drawBack();
}
#pragma pop
/* 8003D320-8003D3C0 037C60 00A0+00 1/0 7/1 0/0 .text postRenderingMap__18dRenderingFDAmap_cFv */
#pragma push
@ -285,29 +295,73 @@ asm void dRenderingFDAmap_c::postRenderingMap() {
}
#pragma pop
/* ############################################################################################## */
/* 80424678-80424684 051398 000C+00 1/1 0/0 0/0 .bss @3639 */
static u8 lit_3639[12];
/* 80424684-804246A0 0513A4 001C+00 2/2 5/5 0/0 .bss m_texObjAgg__8dMpath_n */
u8 dMpath_n::m_texObjAgg[28];
dMpath_n::dTexObjAggregate_c dMpath_n::m_texObjAgg;
/* Enabling the following definition will modify the following function to
* make the map look worse for extra speed in the emulator, especially in large
* areas such as hyrule field.
*/
//#define HYRULE_FIELD_SPEEDHACK
/* 8003D3C0-8003D68C 037D00 02CC+00 0/0 2/2 0/0 .text
* renderingDecoration__18dRenderingFDAmap_cFPCQ211dDrawPath_c10line_class */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dRenderingFDAmap_c::renderingDecoration(dDrawPath_c::line_class const* param_0) {
nofralloc
#include "asm/d/map/d_map_path/renderingDecoration__18dRenderingFDAmap_cFPCQ211dDrawPath_c10line_class.s"
void dRenderingFDAmap_c::renderingDecoration(dDrawPath_c::line_class const* line) {
s32 width = getDecorationLineWidth(line->unk1);
if (width<=0) {
return;
}
setTevSettingIntensityTextureToCI();
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS,GX_INDEX16);
GXSetVtxDesc(GX_VA_TEX0,GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0,GX_VA_POS,GX_POS_XY,GX_F32,0);
GXSetVtxAttrFmt(GX_VTXFMT0,GX_VA_TEX0,GX_POS_XYZ,GX_F32,0);
GXSetNumTevStages(1);
GXLoadTexObj(dMpath_n::m_texObjAgg.mTexObjs[6],GX_TEXMAP0);
u16* unk = line->unk4;
s32 unk2 = line->unk2;
GXSetLineWidth(width,GX_TO_ONE);
GXSetPointSize(width,GX_TO_ONE);
GXColor* lineColorPtr = getDecoLineColor(line->unk0&0x3f,line->unk1);
GXColor lineColor = *lineColorPtr;
GXSetTevColor(GX_TEVREG0,lineColor);
lineColor.r = lineColor.r-4;
GXSetTevColor(GX_TEVREG1,lineColor);
for (int i = 0; i<unk2; unk++,i++) {
#ifndef HYRULE_FIELD_SPEEDHACK
if(i<unk2-1) {
GXSetTevColorIn(GX_TEVSTAGE0,GX_CC_ZERO,GX_CC_ZERO,GX_CC_ZERO,GX_CC_C0);
GXSetTevColorOp(GX_TEVSTAGE0,GX_TEV_ADD,GX_TB_ZERO,GX_CS_SCALE_1,GX_TRUE,GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0,GX_CA_ZERO,GX_CA_ZERO,GX_CA_ZERO,GX_CA_KONST);
GXSetTevAlphaOp(GX_TEVSTAGE0,GX_TEV_ADD,GX_TB_ZERO,GX_CS_SCALE_1,GX_TRUE,GX_TEVPREV);
GXBegin(GX_LINESTRIP,GX_VTXFMT0,2);
GXPosition1x16(unk[0]);
GXTexCoord2f32(0,0);
GXPosition1x16(unk[1]);
GXTexCoord2f32(0,0);
}
GXSetTevColorIn(GX_TEVSTAGE0,GX_CC_ZERO,GX_CC_KONST,GX_CC_TEXC,GX_CC_C1);
GXSetTevColorOp(GX_TEVSTAGE0,GX_TEV_ADD,GX_TB_ZERO,GX_CS_SCALE_1,GX_TRUE,GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0,GX_CA_ZERO,GX_CA_ZERO,GX_CA_ZERO,GX_CA_TEXA);
GXSetTevAlphaOp(GX_TEVSTAGE0,GX_TEV_ADD,GX_TB_ZERO,GX_CS_SCALE_1,GX_TRUE,GX_TEVPREV);
#endif
GXBegin(GX_POINTS,GX_VTXFMT0,1);
GXPosition1x16(unk[0]);
GXTexCoord2f32(0,0);
GXEnd();
}
setTevSettingNonTextureDirectColor();
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS,GX_INDEX16);
GXSetVtxAttrFmt(GX_VTXFMT0,GX_VA_POS,GX_CLR_RGB,GX_F32,0);
}
#pragma pop
/* 8003D68C-8003D6B8 037FCC 002C+00 1/0 6/0 0/0 .text getDecoLineColor__18dRenderingFDAmap_cFii */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dRenderingFDAmap_c::getDecoLineColor(int param_0, int param_1) {
asm GXColor* dRenderingFDAmap_c::getDecoLineColor(int param_0, int param_1) {
nofralloc
#include "asm/d/map/d_map_path/getDecoLineColor__18dRenderingFDAmap_cFii.s"
}
@ -318,37 +372,12 @@ asm void dRenderingFDAmap_c::getDecoLineColor(int param_0, int param_1) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void dRenderingFDAmap_c::getDecorationLineWidth(int param_0) {
asm s32 dRenderingFDAmap_c::getDecorationLineWidth(int param_0) {
nofralloc
#include "asm/d/map/d_map_path/getDecorationLineWidth__18dRenderingFDAmap_cFi.s"
}
#pragma pop
/* 8003D6E4-8003D740 038024 005C+00 0/0 1/0 0/0 .text __sinit_d_map_path_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_d_map_path_cpp() {
nofralloc
#include "asm/d/map/d_map_path/__sinit_d_map_path_cpp.s"
}
#pragma pop
#pragma push
#pragma force_active on
REGISTER_CTORS(0x8003D6E4, __sinit_d_map_path_cpp);
#pragma pop
/* 8003D740-8003D790 038080 0050+00 1/1 0/0 0/0 .text __dt__Q28dMpath_n18dTexObjAggregate_cFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm dMpath_n::dTexObjAggregate_c::~dTexObjAggregate_c() {
nofralloc
#include "asm/d/map/d_map_path/__dt__Q28dMpath_n18dTexObjAggregate_cFv.s"
}
#pragma pop
/* ############################################################################################## */
/* 803A7C90-803A7CF8 004DB0 0068+00 0/0 12/12 0/0 .data __vt__18dRenderingFDAmap_c */
SECTION_DATA extern void* __vt__18dRenderingFDAmap_c[26] = {

View File

@ -635,7 +635,7 @@ SECTION_SDATA2 static u8 l_mapBaseColor[4] = {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void renderingDAmap_c::getBackColor() const {
asm GXColor* renderingDAmap_c::getBackColor() const {
nofralloc
#include "asm/d/map/d_map_path_dmap/getBackColor__16renderingDAmap_cCFv.s"
}

View File

@ -102,6 +102,10 @@ SECTION_INIT asm void __start() {
}
#pragma pop
extern void* _stack_end;
extern void* _SDA2_BASE_;
extern void* _SDA_BASE_;
/* 800032B0-80003340 0001B0 0090+00 1/1 0/0 0/0 .init __init_registers */
#pragma push
#pragma optimization_level 0

View File

@ -287,7 +287,7 @@ asm void mDoMtx_QuatConcat(Quaternion const* param_0, Quaternion const* param_1,
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void mDoMtx_MtxToRot(MtxP param_0, csXyz* param_1) {
asm void mDoMtx_MtxToRot(CMtxP param_0, csXyz* param_1) {
nofralloc
#include "asm/m_Do/m_Do_mtx/mDoMtx_MtxToRot__FPA4_CfP5csXyz.s"
}

View File

@ -1,98 +1,106 @@
#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <string.h>
#include <sys/param.h>
#ifndef MAX
//! Get the maximum of two values
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
//! Get the minimum of two values
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#define EI_NIDENT 16
#define ARRAY_COUNT(arr) (sizeof(arr)/sizeof((arr)[0]))
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
uint16_t e_type;
uint16_t e_machine;
uint32_t e_version;
uint32_t e_entry;
uint32_t e_phoff;
uint32_t e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
unsigned char e_ident[EI_NIDENT];
uint16_t e_type;
uint16_t e_machine;
uint32_t e_version;
uint32_t e_entry;
uint32_t e_phoff;
uint32_t e_shoff;
uint32_t e_flags;
uint16_t e_ehsize;
uint16_t e_phentsize;
uint16_t e_phnum;
uint16_t e_shentsize;
uint16_t e_shnum;
uint16_t e_shstrndx;
} Elf32_Ehdr;
#define EI_CLASS 4
#define EI_DATA 5
#define EI_VERSION 6
#define EI_PAD 7
#define EI_NIDENT 16
#define EI_CLASS 4
#define EI_DATA 5
#define EI_VERSION 6
#define EI_PAD 7
#define EI_NIDENT 16
#define ELFCLASS32 1
#define ELFDATA2MSB 2
#define EV_CURRENT 1
#define ELFCLASS32 1
#define ELFDATA2MSB 2
#define EV_CURRENT 1
#define ET_EXEC 2
#define EM_PPC 20
#define ET_EXEC 2
#define EM_PPC 20
typedef struct {
uint32_t p_type;
uint32_t p_offset;
uint32_t p_vaddr;
uint32_t p_paddr;
uint32_t p_filesz;
uint32_t p_memsz;
uint32_t p_flags;
uint32_t p_align;
uint32_t p_type;
uint32_t p_offset;
uint32_t p_vaddr;
uint32_t p_paddr;
uint32_t p_filesz;
uint32_t p_memsz;
uint32_t p_flags;
uint32_t p_align;
} Elf32_Phdr;
#define PT_LOAD 1
#define PF_R 4
#define PF_W 2
#define PF_X 1
#define PT_LOAD 1
#define PF_R 4
#define PF_W 2
#define PF_X 1
int verbosity = 0;
#if BYTE_ORDER == BIG_ENDIAN
#define swap32(x) (x)
#define swaf16(x) (x)
#define swap16(x) (x)
#else
static inline uint32_t swap32(uint32_t v) {
return (v >> 24) | ((v >> 8) & 0x0000FF00) | ((v << 8) & 0x00FF0000) | (v << 24);
static inline uint32_t swap32(uint32_t v)
{
return (v >> 24) |
((v >> 8) & 0x0000FF00) |
((v << 8) & 0x00FF0000) |
(v << 24);
}
static inline uint16_t swaf16(uint16_t v) {
return (v >> 8) | (v << 8);
static inline uint16_t swap16(uint16_t v)
{
return (v >> 8) | (v << 8);
}
#endif /* BIG_ENDIAN */
typedef struct {
uint32_t text_off[7];
uint32_t data_off[11];
uint32_t text_addr[7];
uint32_t data_addr[11];
uint32_t text_size[7];
uint32_t data_size[11];
uint32_t bss_addr;
uint32_t bss_size;
uint32_t entry;
uint32_t pad[7];
uint32_t text_off[7];
uint32_t data_off[11];
uint32_t text_addr[7];
uint32_t data_addr[11];
uint32_t text_size[7];
uint32_t data_size[11];
uint32_t bss_addr;
uint32_t bss_size;
uint32_t entry;
uint32_t pad[7];
} DOL_hdr;
#define HAVE_BSS 1
@ -105,435 +113,385 @@ typedef struct {
#define DOL_ALIGN(x) (((x) + DOL_ALIGNMENT - 1) & ~(DOL_ALIGNMENT - 1))
typedef struct {
DOL_hdr header;
int text_cnt;
int data_cnt;
uint32_t text_elf_off[7];
uint32_t text_elf_size[7];
uint32_t data_elf_off[11];
uint32_t data_elf_size[11];
uint32_t flags;
FILE* elf;
DOL_hdr header;
int text_cnt;
int data_cnt;
uint32_t text_elf_off[7];
uint32_t data_elf_off[11];
uint32_t flags;
FILE *elf;
} DOL_map;
// We need to track 2 PDHR sizes in the event this is for Wii, but for Gamecube
// we only need the first element(s).
uint32_t sdataSizes[2] = {0, 0};
uint32_t sbssSizes[2] = {0, 0};
uint32_t skip_phdr[32] = { 0 };
void usage(const char* name) {
fprintf(stderr, "Usage: %s [-h] [-v] [-s phdr] [--] elf-file dol-file\n", name);
fprintf(stderr, " Convert an ELF file to a DOL file (by segments)\n");
fprintf(stderr, " Options:\n");
fprintf(stderr, " -h Show this help\n");
fprintf(stderr, " -v Be more verbose (twice for even more)\n");
fprintf(stderr, " -s Skip PHDR\n");
void usage(const char *name)
{
fprintf(stderr, "Usage: %s [-h] [-v] [--] elf-file dol-file\n", name);
fprintf(stderr, " Convert an ELF file to a DOL file (by segments)\n");
fprintf(stderr, " Options:\n");
fprintf(stderr, " -h Show this help\n");
fprintf(stderr, " -v Be more verbose (twice for even more)\n");
}
#define die(x) \
{ \
fprintf(stderr, x "\n"); \
exit(1); \
}
#define perrordie(x) \
{ \
perror(x); \
exit(1); \
}
#define die(x) { fprintf(stderr, x "\n"); exit(1); }
#define perrordie(x) { perror(x); exit(1); }
void ferrordie(FILE* f, const char* str) {
if (ferror(f)) {
fprintf(stderr, "Error while ");
perrordie(str);
} else if (feof(f)) {
fprintf(stderr, "EOF while %s\n", str);
exit(1);
} else {
fprintf(stderr, "Unknown error while %s\n", str);
exit(1);
}
void ferrordie(FILE *f, const char *str)
{
if(ferror(f)) {
fprintf(stderr, "Error while ");
perrordie(str);
} else if(feof(f)) {
fprintf(stderr, "EOF while %s\n", str);
exit(1);
} else {
fprintf(stderr, "Unknown error while %s\n", str);
exit(1);
}
}
void add_bss(DOL_map* map, uint32_t paddr, uint32_t memsz) {
if (map->flags & HAVE_BSS) {
uint32_t start = swap32(map->header.bss_addr);
uint32_t size = swap32(map->header.bss_size);
uint32_t addr = (start + size);
if (addr == paddr) {
map->header.bss_size = swap32(size + memsz);
}
} else {
map->header.bss_addr = swap32(paddr);
map->header.bss_size = swap32(memsz);
map->flags |= HAVE_BSS;
}
void add_bss(DOL_map *map, uint32_t paddr, uint32_t memsz)
{
if(map->flags & HAVE_BSS) {
uint32_t curr_start = swap32(map->header.bss_addr);
uint32_t curr_size = swap32(map->header.bss_size);
if (paddr < curr_start)
map->header.bss_addr = swap32(paddr);
// Total BSS size should be the end of the last bss section minus the
// start of the first bss section.
if (paddr + memsz > curr_start + curr_size)
map->header.bss_size = swap32(paddr + memsz - curr_start);
} else {
map->header.bss_addr = swap32(paddr);
map->header.bss_size = swap32(memsz);
map->flags |= HAVE_BSS;
}
}
void increment_bss_size(DOL_map* map, uint32_t memsz) {
// because it can be byte swapped, we need to force the add via a temporary.
uint32_t preAdd = swap32(map->header.bss_size);
preAdd += memsz;
map->header.bss_size = swap32(preAdd);
void read_elf_segments(DOL_map *map, const char *elf)
{
int read, i;
Elf32_Ehdr ehdr;
if(verbosity >= 2)
fprintf(stderr, "Reading ELF file...\n");
map->elf = fopen(elf, "rb");
if(!map->elf)
perrordie("Could not open ELF file");
read = fread(&ehdr, sizeof(ehdr), 1, map->elf);
if(read != 1)
ferrordie(map->elf, "reading ELF header");
if(memcmp(&ehdr.e_ident[0], "\177ELF", 4))
die("Invalid ELF header");
if(ehdr.e_ident[EI_CLASS] != ELFCLASS32)
die("Invalid ELF class");
if(ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
die("Invalid ELF byte order");
if(ehdr.e_ident[EI_VERSION] != EV_CURRENT)
die("Invalid ELF ident version");
if(swap32(ehdr.e_version) != EV_CURRENT)
die("Invalid ELF version");
if(swap16(ehdr.e_type) != ET_EXEC)
die("ELF is not an executable");
if(swap16(ehdr.e_machine) != EM_PPC)
die("Machine is not PowerPC");
if(!swap32(ehdr.e_entry))
die("ELF has no entrypoint");
map->header.entry = ehdr.e_entry;
if(verbosity >= 2)
fprintf(stderr, "Valid ELF header found\n");
uint16_t phnum = swap16(ehdr.e_phnum);
uint32_t phoff = swap32(ehdr.e_phoff);
Elf32_Phdr *phdrs;
if(!phnum || !phoff)
die("ELF has no program headers");
if(swap16(ehdr.e_phentsize) != sizeof(Elf32_Phdr))
die("Invalid program header entry size");
phdrs = malloc(phnum * sizeof(Elf32_Phdr));
if(fseek(map->elf, phoff, SEEK_SET) < 0)
ferrordie(map->elf, "reading ELF program headers");
read = fread(phdrs, sizeof(Elf32_Phdr), phnum, map->elf);
if(read != phnum)
ferrordie(map->elf, "reading ELF program headers");
for(i=0; i<phnum; i++) {
if(swap32(phdrs[i].p_type) == PT_LOAD) {
uint32_t offset = swap32(phdrs[i].p_offset);
uint32_t paddr = swap32(phdrs[i].p_vaddr);
uint32_t filesz = swap32(phdrs[i].p_filesz);
uint32_t memsz = swap32(phdrs[i].p_memsz);
uint32_t flags = swap32(phdrs[i].p_flags);
if(memsz) {
if(verbosity >= 2)
fprintf(stderr, "PHDR %d: 0x%x [0x%x] -> 0x%08x [0x%x] flags 0x%x\n",
i, offset, filesz, paddr, memsz, flags);
if(flags & PF_X) {
// TEXT segment
if(!(flags & PF_R))
fprintf(stderr, "Warning: non-readable segment %d\n", i);
if(flags & PF_W)
fprintf(stderr, "Warning: writable and executable segment %d\n", i);
if(filesz > memsz) {
fprintf(stderr, "Error: TEXT segment %d memory size (0x%x) smaller than file size (0x%x)\n",
i, memsz, filesz);
exit(1);
} else if (memsz > filesz) {
add_bss(map, paddr + filesz, memsz - filesz);
}
if(map->text_cnt >= MAX_TEXT_SEGMENTS) {
die("Error: Too many TEXT segments");
}
map->header.text_addr[map->text_cnt] = swap32(paddr);
map->header.text_size[map->text_cnt] = swap32(filesz);
map->text_elf_off[map->text_cnt] = offset;
map->text_cnt++;
} else {
// DATA or BSS segment
if(!(flags & PF_R))
fprintf(stderr, "Warning: non-readable segment %d\n", i);
if(filesz == 0) {
// BSS segment
add_bss(map, paddr, memsz);
} else {
// DATA segment
if(filesz > memsz) {
fprintf(stderr, "Error: segment %d memory size (0x%x) is smaller than file size (0x%x)\n",
i, memsz, filesz);
exit(1);
}
if(map->data_cnt >= MAX_DATA_SEGMENTS) {
die("Error: Too many DATA segments");
}
map->header.data_addr[map->data_cnt] = swap32(paddr);
map->header.data_size[map->data_cnt] = swap32(filesz);
map->data_elf_off[map->data_cnt] = offset;
map->data_cnt++;
}
}
} else {
if(verbosity >= 1)
fprintf(stderr, "Skipping empty program header %d\n", i);
}
} else if(verbosity >= 1) {
fprintf(stderr, "Skipping program header %d of type %d\n", i, swap32(phdrs[i].p_type));
}
}
if(verbosity >= 2) {
fprintf(stderr, "Segments:\n");
for(i=0; i<map->text_cnt; i++) {
fprintf(stderr, " TEXT %d: 0x%08x [0x%x] from ELF offset 0x%x\n",
i, swap32(map->header.text_addr[i]), swap32(map->header.text_size[i]),
map->text_elf_off[i]);
}
for(i=0; i<map->data_cnt; i++) {
fprintf(stderr, " DATA %d: 0x%08x [0x%x] from ELF offset 0x%x\n",
i, swap32(map->header.data_addr[i]), swap32(map->header.data_size[i]),
map->data_elf_off[i]);
}
if(map->flags & HAVE_BSS)
fprintf(stderr, " BSS segment: 0x%08x [0x%x]\n", swap32(map->header.bss_addr),
swap32(map->header.bss_size));
}
}
void align_bss_size(DOL_map* map) {
map->header.bss_size = swap32(DOL_ALIGN(swap32(map->header.bss_size)));
void map_dol(DOL_map *map)
{
uint32_t fpos;
int i;
if(verbosity >= 2)
fprintf(stderr, "Laying out DOL file...\n");
fpos = DOL_ALIGN(sizeof(DOL_hdr));
for(i=0; i<map->text_cnt; i++) {
if(verbosity >= 2)
fprintf(stderr, " TEXT segment %d at 0x%x\n", i, fpos);
map->header.text_off[i] = swap32(fpos);
fpos = DOL_ALIGN(fpos + swap32(map->header.text_size[i]));
}
for(i=0; i<map->data_cnt; i++) {
if(verbosity >= 2)
fprintf(stderr, " DATA segment %d at 0x%x\n", i, fpos);
map->header.data_off[i] = swap32(fpos);
fpos = DOL_ALIGN(fpos + swap32(map->header.data_size[i]));
}
if(map->text_cnt == 0) {
if(verbosity >= 1)
fprintf(stderr, "Note: adding dummy TEXT segment to work around IOS bug\n");
map->header.text_off[0] = swap32(DOL_ALIGN(sizeof(DOL_hdr)));
}
if(map->data_cnt == 0) {
if(verbosity >= 1)
fprintf(stderr, "Note: adding dummy DATA segment to work around IOS bug\n");
map->header.data_off[0] = swap32(DOL_ALIGN(sizeof(DOL_hdr)));
}
}
void read_elf_segments(DOL_map* map, const char* elf, uint32_t sdata_pdhr, uint32_t sbss_pdhr,
const char* platform) {
int read, i;
Elf32_Ehdr ehdr;
int isWii = !(strcmp(platform, "wii")) ? 1 : 0;
#define BLOCK (1024*1024)
if (verbosity >= 2)
fprintf(stderr, "Reading ELF file...\n");
void fcpy(FILE *dst, FILE *src, uint32_t dst_off, uint32_t src_off, uint32_t size)
{
int left = size;
int read;
int written;
int block;
void *blockbuf;
map->elf = fopen(elf, "rb");
if (!map->elf)
perrordie("Could not open ELF file");
read = fread(&ehdr, sizeof(ehdr), 1, map->elf);
if (read != 1)
ferrordie(map->elf, "reading ELF header");
if (memcmp(&ehdr.e_ident[0], "\177ELF", 4))
die("Invalid ELF header");
if (ehdr.e_ident[EI_CLASS] != ELFCLASS32)
die("Invalid ELF class");
if (ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
die("Invalid ELF byte order");
if (ehdr.e_ident[EI_VERSION] != EV_CURRENT)
die("Invalid ELF ident version");
if (swap32(ehdr.e_version) != EV_CURRENT)
die("Invalid ELF version");
if (swaf16(ehdr.e_type) != ET_EXEC)
die("ELF is not an executable");
if (swaf16(ehdr.e_machine) != EM_PPC)
die("Machine is not PowerPC");
if (!swap32(ehdr.e_entry))
die("ELF has no entrypoint");
map->header.entry = ehdr.e_entry;
if (verbosity >= 2)
fprintf(stderr, "Valid ELF header found\n");
uint16_t phnum = swaf16(ehdr.e_phnum);
uint32_t phoff = swap32(ehdr.e_phoff);
Elf32_Phdr* phdrs;
if (!phnum || !phoff)
die("ELF has no program headers");
if (swaf16(ehdr.e_phentsize) != sizeof(Elf32_Phdr))
die("Invalid program header entry size");
phdrs = malloc(phnum * sizeof(Elf32_Phdr));
if (fseek(map->elf, phoff, SEEK_SET) < 0)
ferrordie(map->elf, "reading ELF program headers");
read = fread(phdrs, sizeof(Elf32_Phdr), phnum, map->elf);
if (read != phnum)
ferrordie(map->elf, "reading ELF program headers");
for (i = 0; i < phnum; i++) {
if(skip_phdr[i]) {
if(verbosity >= 1)
fprintf(stderr, "Skipping program header %d because -s\n", i);
continue;
}
if (swap32(phdrs[i].p_type) == PT_LOAD) {
uint32_t offset = swap32(phdrs[i].p_offset);
uint32_t paddr = swap32(phdrs[i].p_vaddr);
uint32_t filesz = swap32(phdrs[i].p_filesz);
uint32_t memsz = swap32(phdrs[i].p_memsz);
uint32_t flags = swap32(phdrs[i].p_flags);
if (memsz) {
if (verbosity >= 2)
fprintf(stderr, "PHDR %d: 0x%x [0x%x] -> 0x%08x [0x%x] flags 0x%x\n", i, offset,
filesz, paddr, memsz, flags);
if (flags & PF_X) {
// TEXT segment
if (!(flags & PF_R))
fprintf(stderr, "Warning: non-readable segment %d\n", i);
if (flags & PF_W)
fprintf(stderr, "Warning: writable and executable segment %d\n", i);
if (filesz > memsz) {
fprintf(stderr,
"Error: TEXT segment %d memory size (0x%x) smaller than file size "
"(0x%x)\n",
i, memsz, filesz);
exit(1);
} else if (memsz > filesz) {
add_bss(map, paddr + filesz, memsz - filesz);
}
if (map->text_cnt >= MAX_TEXT_SEGMENTS) {
die("Error: Too many TEXT segments");
}
map->header.text_addr[map->text_cnt] = swap32(paddr);
map->header.text_size[map->text_cnt] = swap32(DOL_ALIGN(filesz));
map->text_elf_off[map->text_cnt] = offset;
map->text_elf_size[map->text_cnt] = filesz;
map->text_cnt++;
} else {
// DATA or BSS segment
if (!(flags & PF_R))
fprintf(stderr, "Warning: non-readable segment %d\n", i);
if (filesz == 0) {
// BSS segment
add_bss(map, paddr, memsz);
// We need to keep PHDF sizes, so track these.
if (i == sbss_pdhr) {
sbssSizes[0] = memsz;
} else if (isWii && i == sbss_pdhr + 2) {
sbssSizes[1] = memsz;
}
} else {
// DATA segment
if (filesz > memsz) {
fprintf(stderr,
"Error: segment %d memory size (0x%x) is smaller than file "
"size (0x%x)\n",
i, memsz, filesz);
exit(1);
}
if (map->data_cnt >= MAX_DATA_SEGMENTS) {
die("Error: Too many DATA segments");
}
// Track sdata as well.
if (i == sdata_pdhr) {
sdataSizes[0] = memsz;
} else if (isWii && i == sdata_pdhr + 2) {
sdataSizes[1] = memsz;
}
map->header.data_addr[map->data_cnt] = swap32(paddr);
map->header.data_size[map->data_cnt] = swap32(DOL_ALIGN(filesz));
map->data_elf_off[map->data_cnt] = offset;
map->data_elf_size[map->data_cnt] = filesz;
map->data_cnt++;
}
}
} else {
if (verbosity >= 1)
fprintf(stderr, "Skipping empty program header %d\n", i);
}
} else if (verbosity >= 1) {
fprintf(stderr, "Skipping program header %d of type %d\n", i, swap32(phdrs[i].p_type));
}
}
align_bss_size(map);
increment_bss_size(map, sdataSizes[0]);
align_bss_size(map);
increment_bss_size(map, sdataSizes[1]);
align_bss_size(map);
increment_bss_size(map, sbssSizes[0]);
align_bss_size(map);
// .sbss2 is added without aligning the size
increment_bss_size(map, sbssSizes[1]);
if (verbosity >= 2) {
fprintf(stderr, "Segments:\n");
for (i = 0; i < map->text_cnt; i++) {
fprintf(stderr, " TEXT %d: 0x%08x [0x%x] from ELF offset 0x%x\n", i,
swap32(map->header.text_addr[i]), swap32(map->header.text_size[i]),
map->text_elf_off[i]);
}
for (i = 0; i < map->data_cnt; i++) {
fprintf(stderr, " DATA %d: 0x%08x [0x%x] from ELF offset 0x%x\n", i,
swap32(map->header.data_addr[i]), swap32(map->header.data_size[i]),
map->data_elf_off[i]);
}
if (map->flags & HAVE_BSS)
fprintf(stderr, " BSS segment: 0x%08x [0x%x]\n", swap32(map->header.bss_addr),
swap32(map->header.bss_size));
}
if(fseek(src, src_off, SEEK_SET) < 0)
ferrordie(src, "reading ELF segment data");
if(fseek(dst, dst_off, SEEK_SET) < 0)
ferrordie(dst, "writing DOL segment data");
blockbuf = malloc(MIN(BLOCK, left));
while(left) {
block = MIN(BLOCK, left);
read = fread(blockbuf, 1, block, src);
if(read != block) {
free(blockbuf);
ferrordie(src, "reading ELF segment data");
}
written = fwrite(blockbuf, 1, block, dst);
if(written != block) {
free(blockbuf);
ferrordie(dst, "writing DOL segment data");
}
left -= block;
}
free(blockbuf);
}
void map_dol(DOL_map* map) {
uint32_t fpos;
int i;
void fpad(FILE *dst, uint32_t dst_off, uint32_t size)
{
uint32_t i;
if (verbosity >= 2)
fprintf(stderr, "Laying out DOL file...\n");
fpos = DOL_ALIGN(sizeof(DOL_hdr));
for (i = 0; i < map->text_cnt; i++) {
if (verbosity >= 2)
fprintf(stderr, " TEXT segment %d at 0x%x\n", i, fpos);
map->header.text_off[i] = swap32(fpos);
fpos = DOL_ALIGN(fpos + swap32(map->header.text_size[i]));
}
for (i = 0; i < map->data_cnt; i++) {
if (verbosity >= 2)
fprintf(stderr, " DATA segment %d at 0x%x\n", i, fpos);
map->header.data_off[i] = swap32(fpos);
fpos = DOL_ALIGN(fpos + swap32(map->header.data_size[i]));
}
if (map->text_cnt == 0) {
if (verbosity >= 1)
fprintf(stderr, "Note: adding dummy TEXT segment to work around IOS bug\n");
map->header.text_off[0] = swap32(DOL_ALIGN(sizeof(DOL_hdr)));
}
if (map->data_cnt == 0) {
if (verbosity >= 1)
fprintf(stderr, "Note: adding dummy DATA segment to work around IOS bug\n");
map->header.data_off[0] = swap32(DOL_ALIGN(sizeof(DOL_hdr)));
}
if(fseek(dst, dst_off, SEEK_SET) < 0)
ferrordie(dst, "writing DOL segment data");
for(i=0; i<size; i++)
fputc(0, dst);
}
#define BLOCK (1024 * 1024)
void write_dol(DOL_map *map, const char *dol)
{
FILE *dolf;
int written;
int i;
void fcpy(FILE* dst, FILE* src, uint32_t dst_off, uint32_t src_off, uint32_t dst_size, uint32_t src_size) {
int left = src_size;
int read;
int written;
int block;
void* blockbuf;
char empty_buffer[8] = { 0,0,0,0,0,0,0,0 };
if (fseek(src, src_off, SEEK_SET) < 0)
ferrordie(src, "reading ELF segment data");
if (fseek(dst, dst_off, SEEK_SET) < 0)
ferrordie(dst, "writing DOL segment data");
blockbuf = malloc(MIN(BLOCK, left));
while (left) {
block = MIN(BLOCK, left);
read = fread(blockbuf, 1, block, src);
if (read != block) {
free(blockbuf);
ferrordie(src, "reading ELF segment data");
}
written = fwrite(blockbuf, 1, block, dst);
if (written != block) {
free(blockbuf);
ferrordie(dst, "writing DOL segment data");
}
left -= block;
}
left = dst_size - src_size;
while (left) {
block = MIN(sizeof(empty_buffer), left);
fwrite(empty_buffer, 1, block, dst);
left -= block;
}
free(blockbuf);
if(verbosity >= 2)
fprintf(stderr, "Writing DOL file...\n");
dolf = fopen(dol, "wb");
if(!dolf)
perrordie("Could not open DOL file");
if(verbosity >= 2) {
fprintf(stderr, "DOL header:\n");
for(i=0; i<MAX(1,map->text_cnt); i++)
fprintf(stderr, " TEXT %d @ 0x%08x [0x%x] off 0x%x\n", i,
swap32(map->header.text_addr[i]), swap32(map->header.text_size[i]),
swap32(map->header.text_off[i]));
for(i=0; i<MAX(1,map->data_cnt); i++)
fprintf(stderr, " DATA %d @ 0x%08x [0x%x] off 0x%x\n", i,
swap32(map->header.data_addr[i]), swap32(map->header.data_size[i]),
swap32(map->header.data_off[i]));
if(swap32(map->header.bss_addr) && swap32(map->header.bss_size))
fprintf(stderr, " BSS @ 0x%08x [0x%x]\n", swap32(map->header.bss_addr),
swap32(map->header.bss_size));
fprintf(stderr, " Entry: 0x%08x\n", swap32(map->header.entry));
fprintf(stderr, "Writing DOL header...\n");
}
// Write DOL header with aligned text and data section sizes
DOL_hdr aligned_header = map->header;
for(i=0; i<ARRAY_COUNT(aligned_header.text_size); i++)
aligned_header.text_size[i] = swap32(DOL_ALIGN(swap32(aligned_header.text_size[i])));
for(i=0; i<ARRAY_COUNT(aligned_header.data_size); i++)
aligned_header.data_size[i] = swap32(DOL_ALIGN(swap32(aligned_header.data_size[i])));
written = fwrite(&aligned_header, sizeof(DOL_hdr), 1, dolf);
if(written != 1)
ferrordie(dolf, "writing DOL header");
for(i=0; i<map->text_cnt; i++) {
uint32_t size = swap32(map->header.text_size[i]);
uint32_t padded_size = DOL_ALIGN(size);
if(verbosity >= 2)
fprintf(stderr, "Writing TEXT segment %d...\n", i);
fcpy(dolf, map->elf, swap32(map->header.text_off[i]), map->text_elf_off[i], size);
if (padded_size > size)
fpad(dolf, swap32(map->header.text_off[i]) + size, padded_size - size);
}
for(i=0; i<map->data_cnt; i++) {
uint32_t size = swap32(map->header.data_size[i]);
uint32_t padded_size = DOL_ALIGN(size);
if(verbosity >= 2)
fprintf(stderr, "Writing DATA segment %d...\n", i);
fcpy(dolf, map->elf, swap32(map->header.data_off[i]), map->data_elf_off[i], size);
if (padded_size > size)
fpad(dolf, swap32(map->header.data_off[i]) + size, padded_size - size);
}
if(verbosity >= 2)
fprintf(stderr, "All done!\n");
fclose(map->elf);
fclose(dolf);
}
void write_dol(DOL_map* map, const char* dol) {
FILE* dolf;
int written;
int i;
int main(int argc, char **argv)
{
char **arg;
if (verbosity >= 2)
fprintf(stderr, "Writing DOL file...\n");
if(argc < 2) {
usage(argv[0]);
return 1;
}
arg = &argv[1];
argc--;
dolf = fopen(dol, "wb");
if (!dolf)
perrordie("Could not open DOL file");
while(argc && *arg[0] == '-') {
if(!strcmp(*arg, "-h")) {
usage(argv[0]);
return 1;
} else if(!strcmp(*arg, "-v")) {
verbosity++;
} else if(!strcmp(*arg, "--")) {
arg++;
argc--;
break;
} else {
fprintf(stderr, "Unrecognized option %s\n", *arg);
usage(argv[0]);
return 1;
}
arg++;
argc--;
}
if(argc < 2) {
usage(argv[0]);
exit(1);
}
if (verbosity >= 2) {
fprintf(stderr, "DOL header:\n");
for (i = 0; i < MAX(1, map->text_cnt); i++)
fprintf(stderr, " TEXT %d @ 0x%08x [0x%06x] off 0x%08x\n", i,
swap32(map->header.text_addr[i]), swap32(map->header.text_size[i]),
swap32(map->header.text_off[i]));
for (i = 0; i < MAX(1, map->data_cnt); i++)
fprintf(stderr, " DATA %d @ 0x%08x [0x%06x] off 0x%08x\n", i,
swap32(map->header.data_addr[i]), swap32(map->header.data_size[i]),
swap32(map->header.data_off[i]));
if (swap32(map->header.bss_addr) && swap32(map->header.bss_size))
fprintf(stderr, " BSS @ 0x%08x [0x%06x]\n", swap32(map->header.bss_addr),
swap32(map->header.bss_size));
fprintf(stderr, " Entry: 0x%08x\n", swap32(map->header.entry));
fprintf(stderr, "Writing DOL header...\n");
}
const char *elf_file = arg[0];
const char *dol_file = arg[1];
written = fwrite(&map->header, sizeof(DOL_hdr), 1, dolf);
if (written != 1)
ferrordie(dolf, "writing DOL header");
DOL_map map;
for (i = 0; i < map->text_cnt; i++) {
if (verbosity >= 2)
fprintf(stderr, "Writing TEXT segment %d...\n", i);
fcpy(dolf, map->elf, swap32(map->header.text_off[i]), map->text_elf_off[i],
swap32(map->header.text_size[i]), map->text_elf_size[i]);
}
for (i = 0; i < map->data_cnt; i++) {
if (verbosity >= 2)
fprintf(stderr, "Writing DATA segment %d...\n", i);
fcpy(dolf, map->elf, swap32(map->header.data_off[i]), map->data_elf_off[i],
swap32(map->header.data_size[i]), map->data_elf_size[i]);
}
memset(&map, 0, sizeof(map));
if (verbosity >= 2)
fprintf(stderr, "All done!\n");
fclose(map->elf);
fclose(dolf);
}
int main(int argc, char** argv) {
char** arg;
if (argc < 2) {
usage(argv[0]);
return 1;
}
arg = &argv[1];
argc--;
while (argc && *arg[0] == '-') {
if (!strcmp(*arg, "-h")) {
usage(argv[0]);
return 1;
} else if (!strcmp(*arg, "-v")) {
verbosity++;
} else if (!strcmp(*arg, "-s")) {
arg++;
argc--;
skip_phdr[atoi(arg[0])] = 1;
} else if (!strcmp(*arg, "--")) {
arg++;
argc--;
break;
} else {
fprintf(stderr, "Unrecognized option %s\n", *arg);
usage(argv[0]);
return 1;
}
arg++;
argc--;
}
if (argc < 2) {
usage(argv[0]);
exit(1);
}
const char* elf_file = arg[0];
const char* dol_file = arg[1];
uint32_t sdata_pdhr = atoi(arg[2]);
uint32_t sbss_pdhr = atoi(arg[3]);
const char* platform = arg[4];
DOL_map map;
memset(&map, 0, sizeof(map));
read_elf_segments(&map, elf_file, sdata_pdhr, sbss_pdhr, platform);
map_dol(&map);
write_dol(&map, dol_file);
return 0;
}
read_elf_segments(&map, elf_file);
map_dol(&map);
write_dol(&map, dol_file);
return 0;
}

View File

@ -7,6 +7,13 @@ Usage: `python tools/extract_game_assets.py`
"""
fstInfoPosition = 0x424
bootPosition = 0x0
bootSize = 0x440
bi2Position = 0x440
bi2Size = 0x2000
apploaderPosition = 0x2440
dolInfoPosition = 0x420
numFileEntries = 0
"""
@ -94,7 +101,7 @@ Write the current folder to disk and return it's name/last entry number
def writeFolder(parsedFstBin, i):
folderPath = i["folderName"] + "/"
folderPath = i["folderName"] + "/"
lastEntryNumber = i["lastEntryNumber"]
if i["parentFolderEntryNumber"] == 0:
@ -125,6 +132,9 @@ def writeAssets(parsedFstBin, handler):
# Write the folder structure and files to disc
j = 0
folderStack = []
if not os.path.exists("./files/"):
os.makedirs("./files/")
os.chdir('./files/')
folderStack.append({"folderName": "./", "lastEntryNumber": numFileEntries})
for i in parsedFstBin:
j += 1
@ -143,6 +153,38 @@ def writeAssets(parsedFstBin, handler):
while folderStack[-1]["lastEntryNumber"] == j + 1:
folderStack.pop()
def writeSys(boot,bi2,apploader,dol,fst):
if not os.path.exists("./sys/"):
os.makedirs("./sys/")
open("./sys/boot.bin","wb").write(boot)
open("./sys/bi2.bin","wb").write(bi2)
open("./sys/apploader.img","wb").write(apploader)
open("./sys/main.dol","wb").write(dol)
open("./sys/fst.bin","wb").write(fst)
def getDolInfo(disc):
disc.seek(dolInfoPosition)
dolOffset = int.from_bytes(bytearray(disc.read(4)), byteorder="big")
dolSize = 0
for i in range(7):
disc.seek(dolOffset+(i*4))
segmentOffset = int.from_bytes(bytearray(disc.read(4)), byteorder="big")
disc.seek(dolOffset+0x90+(i*4))
segmentSize = int.from_bytes(bytearray(disc.read(4)), byteorder="big")
if (segmentOffset+segmentSize)>dolSize:
dolSize = segmentOffset + segmentSize
for i in range(11):
disc.seek(dolOffset+0x1c+(i*4))
dataOffset = int.from_bytes(bytearray(disc.read(4)), byteorder="big")
disc.seek(dolOffset+0xac+(i*4))
dataSize = int.from_bytes(bytearray(disc.read(4)), byteorder="big")
if (dataOffset+dataSize)>dolSize:
dolSize = dataOffset + dataSize
return dolOffset, dolSize
def extract(path):
with open(path, "rb") as f:
@ -150,10 +192,30 @@ def extract(path):
f.seek(fstInfoPosition)
fstOffset, fstSize = getFstInfo(f, fstInfoPosition)
f.seek(bootPosition)
bootBytes = bytearray(f.read(bootSize))
f.seek(bi2Position)
bi2Bytes = bytearray(f.read(bi2Size))
f.seek(apploaderPosition+0x14)
apploaderSize = int.from_bytes(bytearray(f.read(4)), byteorder="big")
f.seek(apploaderPosition+0x18)
trailerSize = int.from_bytes(bytearray(f.read(4)), byteorder="big")
apploaderMainSize = 0x20 + apploaderSize + trailerSize
f.seek(apploaderPosition)
apploaderBytes = bytearray(f.read(apploaderMainSize))
dolOffset, dolSize = getDolInfo(f)
f.seek(dolOffset)
dolBytes = bytearray(f.read(dolSize))
# Seek to fst.bin and retrieve it
f.seek(fstOffset)
fstBinBytes = bytearray(f.read(fstSize))
writeSys(bootBytes,bi2Bytes,apploaderBytes,dolBytes,fstBinBytes)
# Parse fst.bin
parsedFstBin = parseFstBin(fstBinBytes)
@ -162,7 +224,7 @@ def extract(path):
def main():
extract(sys.argv[1], "rb")
extract(sys.argv[1])
if __name__ == "__main__":

View File

@ -33,11 +33,17 @@ VERSION = "1.0"
sys.path.append("defs")
def lcf_generate(output_path):
def lcf_generate(output_path,shiftable,map_file):
"""Script for generating .lcf files"""
import module0
if shiftable == True:
print("Generating LCF for shiftability")
map_file = open(map_file,'r')
map_file = map_file.read()
map_file = map_file.splitlines()
# load symbols from compiled files
symbols = []
for archive in ARCHIVES:
@ -95,7 +101,24 @@ def lcf_generate(output_path):
if symbol["type"] == "LinkerGenerated": # linker handles these symbols
continue
file.write(f"\t\"{symbol['label']}\" = 0x{symbol['addr']:08X};\n")
addr = symbol['addr']
if shiftable==True:
for line in map_file:
literals_found = []
if type(symbol['name'])==str and line.find(' '+symbol['name']+' ')!=-1 and name[0] != "@" or type(symbol['label']) == str and line.find(' '+symbol['label']+' ')!=-1:
linesplit = line.split()
if len(linesplit) > 3 and linesplit[2]!="NOT":
if line.find("lit_")!=-1:
lbl = symbol['label']
for literal in literals_found:
if literal == lbl:
print("Warning! two literals with the same name found!\n"+lbl)
literals_found.append(symbol['label'])
addr = int(linesplit[2],16)
file.write(f"\t\"{symbol['label']}\" = 0x{addr:08X};\n")
else:
file.write(f"\t\"{symbol['label']}\" = 0x{addr:08X};\n")
file.write("\n")
# @stringBase0 is generated by the compiler. The dol2asm is using a trick to
@ -106,7 +129,18 @@ def lcf_generate(output_path):
file.write("\t/* @stringBase0 */\n")
for x in module0.SYMBOLS:
if x["type"] == "StringBase":
file.write('\t"%s" = 0x%08X;\n' % (x["label"], x["addr"]))
addr = x['addr']
if shiftable==True:
obj = (module0.TRANSLATION_UNITS[x['tu']].split('/')[-1])+'.o'
#print(obj)
for line in map_file:
if line.find(' '+obj)!=-1 and line.find(' '+x['name']+' ')!=-1 or line.find('\t'+obj)!=-1 and line.find(' '+x['name']+' ')!=-1:
linesplit = line.split()
if len(linesplit) > 3:
addr = int(linesplit[2],16)
file.write("\t\"%s\" = 0x%08X;\n" % (x['label'], addr))
else:
file.write("\t\"%s\" = 0x%08X;\n" % (x['label'], addr))
file.write("}\n")
file.write("\n")
@ -384,7 +418,20 @@ def lcf():
default="build/dolzel2/ldscript.lcf",
)
def dol(output_path):
lcf_generate(output_path)
lcf_generate(output_path,False,None)
@lcf.command(name="dol_shift")
@click.option(
"--output",
"-o",
"output_path",
required=False,
type=PathPath(file_okay=True, dir_okay=False),
default="build/dolzel2/ldscript.lcf",
)
@click.option('--map','-m','map_file',required=False,type=PathPath(file_okay=True, dir_okay=False), default="build/dolzel2/dolzel2.map")
def dol_shift(output_path,map_file):
lcf_generate(output_path,True,map_file)
@lcf.command(name="rel")

View File

@ -0,0 +1,467 @@
import os
import sys
import shutil
import extract_game_assets
from pathlib import Path
import hashlib
import struct
import ctypes
import oead
def sha1_from_data(data):
sha1 = hashlib.sha1()
sha1.update(data)
return sha1.hexdigest().upper()
def copy(path,destPath):
for root,dirs,files in os.walk(str(path)):
for file in files:
outputDir = destPath/Path(str(root))
#print(str(outputDir.absolute())+file)
if not outputDir.absolute().exists():
os.makedirs(outputDir.absolute())
outputFile = Path(str(outputDir.absolute())+"/"+str(file))
inFile = Path(str(Path(root).absolute())+"/"+str(file))
if not outputFile.exists():
print(str(inFile)+" -> "+str(outputFile))
shutil.copyfile(inFile,outputFile)
else:
inf = open(inFile,"rb")
inSum = sha1_from_data(bytearray(inf.read()))
outf = open(outputFile,"rb")
outSum = sha1_from_data(bytearray(outf.read()))
if inSum!=outSum:
print(str(inFile)+" -> "+str(outputFile))
shutil.copyfile(inFile,outputFile)
aMemRels = """d_a_alldie.rel
d_a_andsw2.rel
d_a_bd.rel
d_a_canoe.rel
d_a_cstaf.rel
d_a_demo_item.rel
d_a_door_bossl1.rel
d_a_econt.rel
d_a_e_dn.rel
d_a_e_fm.rel
d_a_e_ga.rel
d_a_e_hb.rel
d_a_e_nest.rel
d_a_e_rd.rel
d_a_fr.rel
d_a_grass.rel
d_a_kytag05.rel
d_a_kytag10.rel
d_a_kytag11.rel
d_a_kytag14.rel
d_a_mg_fish.rel
d_a_npc_besu.rel
d_a_npc_fairy_seirei.rel
d_a_npc_fish.rel
d_a_npc_henna.rel
d_a_npc_kakashi.rel
d_a_npc_kkri.rel
d_a_npc_kolin.rel
d_a_npc_maro.rel
d_a_npc_taro.rel
d_a_npc_tkj.rel
d_a_obj_bhashi.rel
d_a_obj_bkdoor.rel
d_a_obj_bosswarp.rel
d_a_obj_cboard.rel
d_a_obj_digplace.rel
d_a_obj_eff.rel
d_a_obj_fmobj.rel
d_a_obj_gptaru.rel
d_a_obj_hhashi.rel
d_a_obj_kanban2.rel
d_a_obj_kbacket.rel
d_a_obj_kgate.rel
d_a_obj_klift00.rel
d_a_obj_ktonfire.rel
d_a_obj_ladder.rel
d_a_obj_lv2candle.rel
d_a_obj_magne_arm.rel
d_a_obj_metalbox.rel
d_a_obj_mgate.rel
d_a_obj_nameplate.rel
d_a_obj_ornament_cloth.rel
d_a_obj_rope_bridge.rel
d_a_obj_stick.rel
d_a_obj_stonemark.rel
d_a_obj_swallshutter.rel
d_a_obj_swpropeller.rel
d_a_obj_swpush5.rel
d_a_obj_yobikusa.rel
d_a_scene_exit2.rel
d_a_shop_item.rel
d_a_sq.rel
d_a_swc00.rel
d_a_tag_ajnot.rel
d_a_tag_attack_item.rel
d_a_tag_cstasw.rel
d_a_tag_gstart.rel
d_a_tag_hinit.rel
d_a_tag_hjump.rel
d_a_tag_hstop.rel
d_a_tag_lv2prchk.rel
d_a_tag_magne.rel
d_a_tag_mhint.rel
d_a_tag_mstop.rel
d_a_tag_spring.rel
d_a_tag_statue_evt.rel
d_a_ykgr.rel"""
mMemRels = """d_a_andsw.rel
d_a_arrow.rel
d_a_bg.rel
d_a_bg_obj.rel
d_a_boomerang.rel
d_a_crod.rel
d_a_demo00.rel
d_a_disappear.rel
d_a_dmidna.rel
d_a_door_dbdoor00.rel
d_a_door_knob00.rel
d_a_door_shutter.rel
d_a_door_spiral.rel
d_a_dshutter.rel
d_a_ep.rel
d_a_hitobj.rel
d_a_kytag00.rel
d_a_kytag04.rel
d_a_kytag17.rel
d_a_mg_rod.rel
d_a_midna.rel
d_a_nbomb.rel
d_a_obj_brakeeff.rel
d_a_obj_burnbox.rel
d_a_obj_carry.rel
d_a_obj_ito.rel
d_a_obj_life_container.rel
d_a_obj_movebox.rel
d_a_obj_swpush.rel
d_a_obj_timer.rel
d_a_obj_yousei.rel
d_a_path_line.rel
d_a_scene_exit.rel
d_a_set_bgobj.rel
d_a_spinner.rel
d_a_suspend.rel
d_a_swhit0.rel
d_a_tag_allmato.rel
d_a_tag_attention.rel
d_a_tag_camera.rel
d_a_tag_chkpoint.rel
d_a_tag_event.rel
d_a_tag_evt.rel
d_a_tag_evtarea.rel
d_a_tag_evtmsg.rel
d_a_tag_howl.rel
d_a_tag_kmsg.rel
d_a_tag_lantern.rel
d_a_tag_mist.rel
d_a_tag_msg.rel
d_a_tag_push.rel
d_a_tag_telop.rel
d_a_tbox.rel
d_a_tbox2.rel
d_a_vrbox.rel
d_a_vrbox2.rel
f_pc_profile_lst.rel"""
#Because libarc is only geared toward reading from arcs I'm writing my own arc writer in this file
class HEADER:
RARC : int
length : int
headerLength : int
fileDataOffset : int
fileDataLen : int
fileDataLen2 : int
unk1 : int
unk2 : int
class INFO:
numNodes : int
firstNodeOffset : int
totalDirNum : int
firstDirOffset : int
stringTableLen : int
stringTableOffset : int
numDirsThatAreFiles : int
unk1 : int
unk2 : int
class NODE:
NAME : int
stringTableOffset: int
hash : int
numDirs : int
firstDirIndex : int
class DIRECTORY:
dirIndex : int
stringHash : int
type : int
stringOffset : int
fileOffset : int
fileLength : int
unk1 : int
def computeHash(string):
hash = 0
for char in string:
hash = hash*3
hash = hash + ord(char)
hash = ctypes.c_ushort(hash)
hash = hash.value
return hash
def addFile(index,sizeIndex,dirs,name,stringTable,paths,data):
file = DIRECTORY()
file.dirIndex = index
file.stringHash = computeHash(name)
file.type = 0xA500
file.stringOffset = stringTable.find(name)
path = None
for relPath in paths:
if str(relPath).find(name)!=-1:
path = relPath
file.unk1 = 0
fileData = open(path,"rb")
compressedData = oead.yaz0.compress(fileData.read())
padding = (0x20-(len(compressedData)%0x20))
file.fileLength = len(compressedData)
file.fileOffset = sizeIndex
sizeIndex = sizeIndex + file.fileLength + padding
data += compressedData
data += bytearray(padding)
fileData.close()
dirs.append(file)
return dirs,data,sizeIndex
def copyRelFiles(buildPath,aMemList,mMemList):
relArcPaths = []
for root,dirs,files in os.walk(str(buildPath/"rel")):
for file in files:
if file.find(".rel")!=-1:
relArcFound = False
for rel in aMemList:
if rel==file:
relArcFound = True
for rel in mMemList:
if rel==file:
relArcFound = True
fullPath = Path(root+"/"+file)
if relArcFound==False:
print(str(fullPath)+" -> "+str(buildPath/"game/files/rel/Final/Release"/file))
relSource = open(fullPath,"rb")
data = relSource.read()
relSource.close()
data = oead.yaz0.compress(data)
relNew = open(buildPath/"game/files/rel/Final/Release"/file,"wb")
relNew.write(data)
relNew.truncate()
relNew.close()
else:
relArcPaths.append(fullPath)
arcHeader = HEADER()
arcHeader.RARC = 0x52415243
arcHeader.headerLength = 0x20
arcHeader.unk1 = 0
arcHeader.unk2 = 0
infoBlock = INFO()
infoBlock.numNodes = 3
infoBlock.numDirsThatAreFiles = 142
rootNode = NODE()
rootNode.NAME = 0x524F4F54
rootNode.numDirs = 4
rootNode.firstDirIndex = 0
rootNode.hash = computeHash("rels")
aMemNode = NODE()
aMemNode.NAME = 0x414d454d
aMemNode.hash = computeHash("amem")
aMemNode.numDirs = 79
aMemNode.firstDirIndex = 4
mMemNode = NODE()
mMemNode.hash = computeHash("mmem")
mMemNode.NAME = 0x4d4d454d
mMemNode.numDirs = 59
mMemNode.firstDirIndex = 83
stringTable = ".\0..\0rels\0amem\0"
for rel in aMemList:
stringTable = stringTable+rel+'\0'
stringTable = stringTable+"mmem\0"
for rel in mMemList:
stringTable = stringTable+rel+'\0'
stringTable = stringTable+"\0\0\0\0\0\0"
rootNode.stringTableOffset = stringTable.find("rels")
aMemNode.stringTableOffset = stringTable.find("amem")
mMemNode.stringTableOffset = stringTable.find("mmem")
aMemDir = DIRECTORY()
aMemDir.dirIndex = 0xFFFF
aMemDir.type = 0x200
aMemDir.stringOffset = stringTable.find("amem")
aMemDir.stringHash = computeHash("amem")
aMemDir.fileOffset = 1
aMemDir.fileLength = 0x10
aMemDir.unk1 = 0
mMemDir = DIRECTORY()
mMemDir.dirIndex = 0xFFFF
mMemDir.type = 0x200
mMemDir.stringOffset = stringTable.find("mmem")
mMemDir.stringHash = computeHash("mmem")
mMemDir.fileOffset = 2
mMemDir.fileLength = 0x10
mMemDir.unk1 = 0
unkDir = DIRECTORY()
unkDir.dirIndex = 0xFFFF
unkDir.stringHash = 0x2E
unkDir.type = 0x200
unkDir.stringOffset = 0
unkDir.fileOffset = 0
unkDir.fileLength = 0x10
unkDir.unk1 = 0
unkDir2 = DIRECTORY()
unkDir2.dirIndex = 0xFFFF
unkDir2.stringHash = 0xB8
unkDir2.type = 0x200
unkDir2.stringOffset = 2
unkDir2.fileOffset = 0xFFFFFFFF
unkDir2.fileLength = 0x10
unkDir2.unk1 = 0
dirs = [aMemDir,mMemDir,unkDir,unkDir2]
data = bytearray()
dirIndex = 4
sizeIndex = 0
for rel in aMemList:
retdirs,retdata,retSize = addFile(dirIndex,sizeIndex,dirs,rel,stringTable,relArcPaths,data)
dirIndex = dirIndex+1
sizeIndex = retSize
dirs = retdirs
data = retdata
dirs.append(unkDir)
dirs.append(unkDir2)
dirIndex = dirIndex+2
for rel in mMemList:
retdirs,retdata,retSize = addFile(dirIndex,sizeIndex,dirs,rel,stringTable,relArcPaths,data)
dirIndex = dirIndex+1
sizeIndex = retSize
#print(hex(dirIndex))
dirs = retdirs
data = retdata
unkDir3 = DIRECTORY()
unkDir3.dirIndex = 0xFFFF
unkDir3.stringHash = 0x2E
unkDir3.type = 0x200
unkDir3.stringOffset = 0
unkDir3.fileOffset = 2
unkDir3.fileLength = 0x10
unkDir3.unk1 = 0
unkDir4 = DIRECTORY()
unkDir4.dirIndex = 0xFFFF
unkDir4.stringHash = 0xB8
unkDir4.type = 0x200
unkDir4.stringOffset = 2
unkDir4.fileOffset = 0
unkDir4.fileLength = 0x10
unkDir4.unk1 = 0
dirs.append(unkDir3)
dirs.append(unkDir4)
dirIndex = dirIndex+2
arcHeader.length = len(stringTable)+0x20+0x20+0x30+(len(dirs)*0x14)+len(data)
arcHeader.fileDataOffset=0x14E0
arcHeader.fileDataLen=len(data)
arcHeader.fileDataLen2=arcHeader.fileDataLen
infoBlock.firstNodeOffset = 0x20
infoBlock.firstDirOffset = 0x60
infoBlock.stringTableLen = len(stringTable)
infoBlock.stringTableOffset = 0xB80
infoBlock.unk1 = 0x100
infoBlock.unk2 = 0
infoBlock.totalDirNum = 0x8E
outputArcFile = open(buildPath/"game/files/RELS.arc","wb")
outputArcFile.seek(0)
outputArcFile.write(struct.pack(">IIIIIIII",arcHeader.RARC,arcHeader.length,arcHeader.headerLength,arcHeader.fileDataOffset,arcHeader.fileDataLen,arcHeader.unk1,arcHeader.fileDataLen2,arcHeader.unk2))
outputArcFile.write(struct.pack(">IIIIIIHHI",infoBlock.numNodes,infoBlock.firstNodeOffset,infoBlock.totalDirNum,infoBlock.firstDirOffset,infoBlock.stringTableLen,infoBlock.stringTableOffset,infoBlock.numDirsThatAreFiles,infoBlock.unk1,infoBlock.unk2))
outputArcFile.write(struct.pack(">IIHHI",rootNode.NAME,rootNode.stringTableOffset,rootNode.hash,rootNode.numDirs,rootNode.firstDirIndex))
outputArcFile.write(struct.pack(">IIHHI",aMemNode.NAME,aMemNode.stringTableOffset,aMemNode.hash,aMemNode.numDirs,aMemNode.firstDirIndex))
outputArcFile.write(struct.pack(">IIHHI",mMemNode.NAME,mMemNode.stringTableOffset,mMemNode.hash,mMemNode.numDirs,mMemNode.firstDirIndex))
outputArcFile.write(bytearray(16))
for dir in dirs:
outputArcFile.write(struct.pack(">HHHHIII",dir.dirIndex,dir.stringHash,dir.type,dir.stringOffset,dir.fileOffset,dir.fileLength,dir.unk1))
outputArcFile.write(bytearray(8))
strBytearray = bytearray()
strBytearray.extend(map(ord,stringTable))
outputArcFile.write(strBytearray)
outputArcFile.write(data)
outputArcFile.truncate()
outputArcFile.close()
def main(gamePath,buildPath):
if not gamePath.exists():
gamePath.mkdir(parents=True, exist_ok=True)
iso = Path("gz2e01.iso")
if not iso.exists() or not iso.is_file():
print("gz2e01.iso doesn't exist in project directory!")
sys.exit(1)
if not (gamePath/"files").exists() or not (gamePath/"sys").exists():
print("ISO is not extracted; extracting...")
previousDir = os.getcwd()
os.chdir(str(gamePath.absolute()))
extract_game_assets.extract("../" + str(iso))
os.chdir(previousDir)
print("Copying game files...")
copy(gamePath,buildPath.absolute())
print(str(buildPath/"main_shift.dol")+" -> "+str(buildPath/"game/sys/main.dol"))
shutil.copyfile(buildPath/"main_shift.dol",buildPath/"game/sys/main.dol")
copyRelFiles(buildPath,aMemRels.splitlines(),mMemRels.splitlines())
if __name__ == "__main__":
main(Path(sys.argv[1]),Path(sys.argv[2]))

View File

@ -7,4 +7,5 @@ colorama
ansiwrap
watchdog
python-Levenshtein
cxxfilt
cxxfilt
oead

View File

@ -351,7 +351,7 @@ def check(debug, rels, game_path, build_path):
CONSOLE.print(text)
try:
check_sha1(game_path, build_path, rels)
check_sha1(game_path/"files", build_path, rels)
text = Text(" OK")
text.stylize("bold green")
CONSOLE.print(text)