diff --git a/aspMain.us.rev1.toml b/aspMain.us.rev1.toml new file mode 100644 index 0000000..8692a08 --- /dev/null +++ b/aspMain.us.rev1.toml @@ -0,0 +1,11 @@ +text_offset = 0xC40FF0 +text_size = 0x1000 +text_address = 0x04001000 +rom_file_path = "mm.us.rev1_uncompressed.z64" +output_file_path = "rsp/aspMain.cpp" +output_function_name = "aspMain" +extra_indirect_branch_targets = [ + 0x1F80, 0x1250, 0x1154, 0x1094, 0x1E0C, 0x1514, 0x1E7C, 0x1C90, + 0x1180, 0x1808, 0x11E8, 0x1ADC, 0x1B6C, 0x1194, 0x1EF8, 0x1240, + 0x17C0, 0x186C, 0x1A58, 0x18BC, 0x1ABC, 0x1ACC, 0x1A80, 0x1BD4 +] diff --git a/include/rsp.h b/include/rsp.h index 394920f..17f8f90 100644 --- a/include/rsp.h +++ b/include/rsp.h @@ -3,6 +3,7 @@ #include "rsp_vu.h" #include "recomp.h" +#include enum class RspExitReason { Invalid, @@ -16,21 +17,48 @@ extern uint8_t dmem[]; extern uint16_t rspReciprocals[512]; extern uint16_t rspInverseSquareRoots[512]; -#define RSP_MEM_W(offset, addr) \ - (*reinterpret_cast(dmem + (0xFFF & ((offset) + (addr))))) - -#define RSP_MEM_H(offset, addr) \ - (*reinterpret_cast(dmem + (0xFFF & (((offset) + (addr)) ^ 2)))) - -#define RSP_MEM_HU(offset, addr) \ - (*reinterpret_cast(dmem + (0xFFF & (((offset) + (addr)) ^ 2)))) - #define RSP_MEM_B(offset, addr) \ (*reinterpret_cast(dmem + (0xFFF & (((offset) + (addr)) ^ 3)))) #define RSP_MEM_BU(offset, addr) \ (*reinterpret_cast(dmem + (0xFFF & (((offset) + (addr)) ^ 3)))) - + +static inline uint32_t RSP_MEM_W_LOAD(uint32_t offset, uint32_t addr) { + uint32_t out; + for (int i = 0; i < 4; i++) { + reinterpret_cast(&out)[i ^ 3] = RSP_MEM_BU(offset + i, addr); + } + return out; +} + +static inline void RSP_MEM_W_STORE(uint32_t offset, uint32_t addr, uint32_t val) { + for (int i = 0; i < 4; i++) { + RSP_MEM_BU(offset + i, addr) = reinterpret_cast(&val)[i ^ 3]; + } +} + +static inline uint32_t RSP_MEM_HU_LOAD(uint32_t offset, uint32_t addr) { + uint16_t out; + for (int i = 0; i < 2; i++) { + reinterpret_cast(&out)[(i + 2) ^ 3] = RSP_MEM_BU(offset + i, addr); + } + return out; +} + +static inline uint32_t RSP_MEM_H_LOAD(uint32_t offset, uint32_t addr) { + int16_t out; + for (int i = 0; i < 2; i++) { + reinterpret_cast(&out)[(i + 2) ^ 3] = RSP_MEM_BU(offset + i, addr); + } + return out; +} + +static inline void RSP_MEM_H_STORE(uint32_t offset, uint32_t addr, uint32_t val) { + for (int i = 0; i < 2; i++) { + RSP_MEM_BU(offset + i, addr) = reinterpret_cast(&val)[(i + 2) ^ 3]; + } +} + #define RSP_ADD32(a, b) \ ((int32_t)((a) + (b))) diff --git a/njpgdspMain.us.rev1.toml b/njpgdspMain.us.rev1.toml new file mode 100644 index 0000000..9b7f219 --- /dev/null +++ b/njpgdspMain.us.rev1.toml @@ -0,0 +1,6 @@ +text_offset = 0xC438B0 +text_size = 0xAF0 +text_address = 0x04001080 +rom_file_path = "mm.us.rev1_uncompressed.z64" +output_file_path = "rsp/njpgdspMain.cpp" +output_function_name = "njpgdspMain"