From 598ba1aaa37e55b3a4feeb40b9e8f62792e77f04 Mon Sep 17 00:00:00 2001 From: Hat Kid <6624576+Hat-Kid@users.noreply.github.com> Date: Fri, 13 Oct 2023 00:07:37 +0200 Subject: [PATCH] jak3: add missing files and implement `pexcw` (#3084) Some files were in the `banned_objects` list and were thus excluded from the `all_objs` file. Also implements the `pexcw` instruction which is only used in `hfrag` code. --- decompiler/Disasm/InstructionDecode.cpp | 4 +++- decompiler/Disasm/OpcodeInfo.cpp | 4 ++++ decompiler/Disasm/OpcodeInfo.h | 1 + decompiler/analysis/atomic_op_builder.cpp | 1 + decompiler/analysis/mips2c.cpp | 2 ++ decompiler/config/jak3/jak3_config.jsonc | 2 +- decompiler/config/jak3/ntsc_v1/hacks.jsonc | 5 +++++ game/mips2c/mips2c_private.h | 8 ++++++++ goal_src/jak3/build/all_objs.json | 7 +++++++ goal_src/jak3/engine/debug/manipulator.gc | 9 +++++++++ goal_src/jak3/engine/gfx/background/hfrag/hfrag-vu1.gc | 9 +++++++++ goal_src/jak3/engine/gfx/background/hfrag/hfrag.gc | 9 +++++++++ goal_src/jak3/engine/physics/ragdoll-edit.gc | 9 +++++++++ goal_src/jak3/engine/target/gun/gun-states.gc | 9 +++++++++ goal_src/jak3/engine/util/script.gc | 9 +++++++++ goal_src/jak3/levels/city/common/ff-squad-control.gc | 9 +++++++++ .../gsrc/skeleton_creation/init_folder_struct_jak3.py | 6 +++++- 17 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 goal_src/jak3/engine/debug/manipulator.gc create mode 100644 goal_src/jak3/engine/gfx/background/hfrag/hfrag-vu1.gc create mode 100644 goal_src/jak3/engine/gfx/background/hfrag/hfrag.gc create mode 100644 goal_src/jak3/engine/physics/ragdoll-edit.gc create mode 100644 goal_src/jak3/engine/target/gun/gun-states.gc create mode 100644 goal_src/jak3/engine/util/script.gc create mode 100644 goal_src/jak3/levels/city/common/ff-squad-control.gc diff --git a/decompiler/Disasm/InstructionDecode.cpp b/decompiler/Disasm/InstructionDecode.cpp index 7b455d8eb5..bad6403771 100644 --- a/decompiler/Disasm/InstructionDecode.cpp +++ b/decompiler/Disasm/InstructionDecode.cpp @@ -556,8 +556,10 @@ static InstructionKind decode_mmi3(OpcodeFields fields) { case 0b11011: ASSERT(fields.rs() == 0); return IK::PCPYH; + case 0b11110: + return IK::PEXCW; default: - ASSERT(false); + ASSERT_MSG(false, fmt::format("unknown mmi3: 0b{:b}\n", fields.MMI_func())); return IK::UNKNOWN; } } diff --git a/decompiler/Disasm/OpcodeInfo.cpp b/decompiler/Disasm/OpcodeInfo.cpp index 91084eb556..804d36bed8 100644 --- a/decompiler/Disasm/OpcodeInfo.cpp +++ b/decompiler/Disasm/OpcodeInfo.cpp @@ -317,6 +317,10 @@ void init_opcode_info() { drd_srs_srt(def(IK::PXOR, "pxor").gpr128()); // Parallel Exclusive Or def(IK::PEXEW, "pexew").gpr128().dst_gpr(FT::RD).src_gpr(FT::RT); // Parallel Exchange Even Word + def(IK::PEXCW, "pexcw") + .gpr128() + .dst_gpr(FT::RD) + .src_gpr(FT::RT); // Parallel Exchange Center Word drd_srt_ssa(def(IK::PSLLW, "psllw").gpr128()); // Parallel Shift Left Logical Word drd_srt_ssa(def(IK::PSLLH, "psllh").gpr128()); // Parallel Shift Left Logical Halfword diff --git a/decompiler/Disasm/OpcodeInfo.h b/decompiler/Disasm/OpcodeInfo.h index 121230ffca..1656526e72 100644 --- a/decompiler/Disasm/OpcodeInfo.h +++ b/decompiler/Disasm/OpcodeInfo.h @@ -182,6 +182,7 @@ enum class InstructionKind { PNOR, PCPYH, PINTEH, + PEXCW, // COP1 / FPU ADDS, diff --git a/decompiler/analysis/atomic_op_builder.cpp b/decompiler/analysis/atomic_op_builder.cpp index d424175577..b1f0126a4a 100644 --- a/decompiler/analysis/atomic_op_builder.cpp +++ b/decompiler/analysis/atomic_op_builder.cpp @@ -364,6 +364,7 @@ std::unique_ptr make_asm_op(const Instruction& i0, int idx) { case InstructionKind::PMADDH: case InstructionKind::PMULTH: case InstructionKind::PEXEW: + case InstructionKind::PEXCW: case InstructionKind::PNOR: case InstructionKind::PCPYH: case InstructionKind::PINTEH: diff --git a/decompiler/analysis/mips2c.cpp b/decompiler/analysis/mips2c.cpp index 77eff6f4b6..f020f26e3b 100644 --- a/decompiler/analysis/mips2c.cpp +++ b/decompiler/analysis/mips2c.cpp @@ -1176,6 +1176,8 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output, return handle_generic_op2(i0, instr_str, "cvtsw"); case InstructionKind::PEXEW: return handle_generic_op2(i0, instr_str, "pexew"); + case InstructionKind::PEXCW: + return handle_generic_op2(i0, instr_str, "pexcw"); case InstructionKind::SQRTS: return handle_generic_op2(i0, instr_str, "sqrts"); case InstructionKind::PLZCW: diff --git a/decompiler/config/jak3/jak3_config.jsonc b/decompiler/config/jak3/jak3_config.jsonc index bc529d94fa..3b9a05e2dd 100644 --- a/decompiler/config/jak3/jak3_config.jsonc +++ b/decompiler/config/jak3/jak3_config.jsonc @@ -8,7 +8,7 @@ // if you want to filter to only some object names. // it will make the decompiler much faster. "allowed_objects": [], - "banned_objects": ["script", "ragdoll-edit", "gun-states", "manipulator", "hfrag", "hfrag-vu1", "ff-squad-control"], + "banned_objects": [], //////////////////////////// // CODE ANALYSIS OPTIONS diff --git a/decompiler/config/jak3/ntsc_v1/hacks.jsonc b/decompiler/config/jak3/ntsc_v1/hacks.jsonc index e864bf1104..2e4b3989ba 100644 --- a/decompiler/config/jak3/ntsc_v1/hacks.jsonc +++ b/decompiler/config/jak3/ntsc_v1/hacks.jsonc @@ -108,6 +108,11 @@ "adgif-shader<-texture!", // jak 3 + "command-get-process", + "(method 16 ragdoll-edit-info)", + "(anon-function 4 gun-states)", + "(method 10 manipulator)", + "(method 46 ff-squad-control)", "borrow-city-expansion", "(method 26 level-group)", "(anon-function 65 temple-obs)", diff --git a/game/mips2c/mips2c_private.h b/game/mips2c/mips2c_private.h index 634c32e66c..efbe99a698 100644 --- a/game/mips2c/mips2c_private.h +++ b/game/mips2c/mips2c_private.h @@ -482,6 +482,14 @@ struct ExecutionContext { gprs[dst].du32[3] = s.du32[3]; } + void pexcw(int dst, int src) { + auto s = gpr_src(src); + gprs[dst].du32[0] = s.du32[0]; + gprs[dst].du32[1] = s.du32[2]; + gprs[dst].du32[2] = s.du32[1]; + gprs[dst].du32[3] = s.du32[3]; + } + void pcgtw(int rd, int rs, int rt) { auto s = gpr_src(rs); auto t = gpr_src(rt); diff --git a/goal_src/jak3/build/all_objs.json b/goal_src/jak3/build/all_objs.json index fcbd1bf857..290d02e75b 100644 --- a/goal_src/jak3/build/all_objs.json +++ b/goal_src/jak3/build/all_objs.json @@ -291,6 +291,7 @@ ["region", "region", 5, ["GAME"], "engine/level"], ["fma-sphere", "fma-sphere", 5, ["GAME"], "engine/anim"], ["prim-beam-h", "prim-beam-h", 5, ["GAME"], "engine/common-obs"], +["script", "script", 5, ["GAME"], "engine/util"], ["generic-obs", "generic-obs", 5, ["GAME"], "engine/common-obs"], ["lightning", "lightning", 5, ["GAME"], "engine/gfx/generic/lightning"], ["light-trails-h", "light-trails-h", 5, ["GAME"], "engine/gfx/sprite/particles"], @@ -319,6 +320,7 @@ ["task-arrow", "task-arrow", 5, ["GAME"], "engine/game/task"], ["projectile", "projectile", 5, ["GAME"], "engine/common-obs"], ["ragdoll", "ragdoll", 5, ["GAME"], "engine/physics"], +["ragdoll-edit", "ragdoll-edit", 5, ["GAME"], "engine/physics"], ["lightjak-wings", "lightjak-wings", 5, ["GAME"], "engine/target"], ["target-handler", "target-handler", 5, ["GAME"], "engine/target"], ["target-anim", "target-anim", 5, ["GAME"], "engine/target"], @@ -336,6 +338,7 @@ ["gun-yellow-shot", "gun-yellow-shot", 5, ["GAME"], "engine/target/gun"], ["gun-red-shot", "gun-red-shot", 5, ["GAME"], "engine/target/gun"], ["gun-dark-shot", "gun-dark-shot", 5, ["GAME"], "engine/target/gun"], +["gun-states", "gun-states", 5, ["GAME"], "engine/target/gun"], ["board-util", "board-util", 5, ["GAME"], "engine/target/board"], ["target-board", "target-board", 5, ["GAME"], "engine/target/board"], ["board-part", "board-part", 5, ["GAME"], "engine/target/board"], @@ -393,6 +396,7 @@ ["anim-tester", "anim-tester", 5, ["GAME"], "engine/debug"], ["viewer", "viewer", 5, ["GAME"], "engine/debug"], ["part-tester", "part-tester", 5, ["GAME"], "engine/debug"], +["manipulator", "manipulator", 5, ["GAME"], "engine/debug"], ["editable-h", "editable-h", 5, ["GAME"], "engine/debug"], ["editable", "editable", 5, ["GAME"], "engine/debug"], ["editable-player", "editable-player", 5, ["GAME"], "engine/debug"], @@ -943,6 +947,8 @@ ["towerb-vis", "towerb-vis", 5, ["TOWB"], "levels/tower"], ["hfrag-vu1-h", "hfrag-vu1-h", 5, ["HGA", "WIN", "DST"], "engine/gfx/background/hfrag"], ["hfrag-common", "hfrag-common", 5, ["HGA", "WIN", "DST"], "engine/gfx/background/hfrag"], +["hfrag-vu1", "hfrag-vu1", 5, ["HGA", "WIN", "DST"], "engine/gfx/background/hfrag"], +["hfrag", "hfrag", 5, ["HGA", "WIN", "DST"], "engine/gfx/background/hfrag"], ["hfrag-work", "hfrag-work", 5, ["HGA", "WIN", "DST"], "engine/gfx/background/hfrag"], ["hfrag-texture-anim", "hfrag-texture-anim", 5, ["HGA", "WIN", "DST"], "engine/gfx/background/hfrag"], ["desert-mood", "desert-mood", 5, ["HGA", "WIN", "DST"], "levels/desert"], @@ -2409,6 +2415,7 @@ ["mh-squad-member", "mh-squad-member", 5, ["CWI"], "levels/city/common"], ["metalhead-flitter", "metalhead-flitter", 5, ["CWI"], "levels/city/traffic/citizen"], ["kg-squad-control", "kg-squad-control", 5, ["CWI"], "levels/city/common"], +["ff-squad-control", "ff-squad-control", 5, ["CWI"], "levels/city/common"], ["mh-squad-control", "mh-squad-control", 5, ["CWI"], "levels/city/common"], ["cty-borrow-manager", "cty-borrow-manager", 5, ["CWI"], "levels/city/common"], ["ctywide-init", "ctywide-init", 5, ["CWI"], "levels/city/common"], diff --git a/goal_src/jak3/engine/debug/manipulator.gc b/goal_src/jak3/engine/debug/manipulator.gc new file mode 100644 index 0000000000..0479fa63b9 --- /dev/null +++ b/goal_src/jak3/engine/debug/manipulator.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; name: manipulator.gc +;; name in dgo: manipulator +;; dgos: GAME + +;; DECOMP BEGINS + diff --git a/goal_src/jak3/engine/gfx/background/hfrag/hfrag-vu1.gc b/goal_src/jak3/engine/gfx/background/hfrag/hfrag-vu1.gc new file mode 100644 index 0000000000..220449b459 --- /dev/null +++ b/goal_src/jak3/engine/gfx/background/hfrag/hfrag-vu1.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; name: hfrag-vu1.gc +;; name in dgo: hfrag-vu1 +;; dgos: HGA, WIN, DST + +;; DECOMP BEGINS + diff --git a/goal_src/jak3/engine/gfx/background/hfrag/hfrag.gc b/goal_src/jak3/engine/gfx/background/hfrag/hfrag.gc new file mode 100644 index 0000000000..76632c541e --- /dev/null +++ b/goal_src/jak3/engine/gfx/background/hfrag/hfrag.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; name: hfrag.gc +;; name in dgo: hfrag +;; dgos: HGA, WIN, DST + +;; DECOMP BEGINS + diff --git a/goal_src/jak3/engine/physics/ragdoll-edit.gc b/goal_src/jak3/engine/physics/ragdoll-edit.gc new file mode 100644 index 0000000000..a766cf4ee1 --- /dev/null +++ b/goal_src/jak3/engine/physics/ragdoll-edit.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; name: ragdoll-edit.gc +;; name in dgo: ragdoll-edit +;; dgos: GAME + +;; DECOMP BEGINS + diff --git a/goal_src/jak3/engine/target/gun/gun-states.gc b/goal_src/jak3/engine/target/gun/gun-states.gc new file mode 100644 index 0000000000..11eeea1608 --- /dev/null +++ b/goal_src/jak3/engine/target/gun/gun-states.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; name: gun-states.gc +;; name in dgo: gun-states +;; dgos: GAME + +;; DECOMP BEGINS + diff --git a/goal_src/jak3/engine/util/script.gc b/goal_src/jak3/engine/util/script.gc new file mode 100644 index 0000000000..4c122a0826 --- /dev/null +++ b/goal_src/jak3/engine/util/script.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; name: script.gc +;; name in dgo: script +;; dgos: GAME + +;; DECOMP BEGINS + diff --git a/goal_src/jak3/levels/city/common/ff-squad-control.gc b/goal_src/jak3/levels/city/common/ff-squad-control.gc new file mode 100644 index 0000000000..ee4f857e89 --- /dev/null +++ b/goal_src/jak3/levels/city/common/ff-squad-control.gc @@ -0,0 +1,9 @@ +;;-*-Lisp-*- +(in-package goal) + +;; name: ff-squad-control.gc +;; name in dgo: ff-squad-control +;; dgos: CWI + +;; DECOMP BEGINS + diff --git a/scripts/gsrc/skeleton_creation/init_folder_struct_jak3.py b/scripts/gsrc/skeleton_creation/init_folder_struct_jak3.py index 524d0c4ba4..5be82b0676 100644 --- a/scripts/gsrc/skeleton_creation/init_folder_struct_jak3.py +++ b/scripts/gsrc/skeleton_creation/init_folder_struct_jak3.py @@ -175,7 +175,9 @@ engine_files = { "light-trails": "gfx/sprite/particles", "lightning-new": "gfx/generic/lightning", + "hfrag": "gfx/background/hfrag", "hfrag-h": "gfx/background/hfrag", + "hfrag-vu1": "gfx/background/hfrag", "hfrag-vu1-h": "gfx/background/hfrag", "hfrag-common": "gfx/background/hfrag", "hfrag-work": "gfx/background/hfrag", @@ -376,7 +378,9 @@ path_overrides = { "jak-pilot-hcar+0-ag": "engine/target", "rapid-gunner": "levels/stadium", "spydroid": "levels/common/enemy", - "credits": "levels/title" + "credits": "levels/title", + "ragdoll-edit": "engine/physics", + "manipulator": "engine/debug" } # i can be smarter than this...i swear....refactor eventually!