diff --git a/external/parallel-rdp/CMakeLists.txt b/external/parallel-rdp/CMakeLists.txt index 90ef404b..141615f7 100644 --- a/external/parallel-rdp/CMakeLists.txt +++ b/external/parallel-rdp/CMakeLists.txt @@ -65,6 +65,7 @@ target_include_directories(parallel-rdp PUBLIC .. ../../src/frontend ../../src/frontend/imgui + ../../src/frontend/imgui/debugger ../../src ../imgui ../imgui/imgui diff --git a/src/common.hpp b/src/common.hpp index 6208c4ae..7bc5c389 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -36,4 +36,10 @@ using m128 = __m128i; #define FD(x) (((x) >> 6) & 0x1F) #define FT(x) RT(x) #define FS(x) RD(x) -#define BASE(x) RS(x) \ No newline at end of file +#define BASE(x) RS(x) +#define VT(x) (((x) >> 16) & 0x1F) +#define VS(x) (((x) >> 11) & 0x1F) +#define VD(x) (((x) >> 6) & 0x1F) +#define E(x) BASE(x) +#define ELEMENT_INDEX(i) (7 - (i)) +#define BYTE_INDEX(i) (15 - (i)) \ No newline at end of file diff --git a/src/frontend/imgui/CMakeLists.txt b/src/frontend/imgui/CMakeLists.txt index 365f2745..2341ab52 100644 --- a/src/frontend/imgui/CMakeLists.txt +++ b/src/frontend/imgui/CMakeLists.txt @@ -33,4 +33,4 @@ target_include_directories(frontend-imgui PUBLIC ../../../external/parallel-rdp/parallel-rdp-standalone/vulkan ../../../external/parallel-rdp/parallel-rdp-standalone/util ../../../external/parallel-rdp/parallel-rdp-standalone/volk) -target_link_libraries(frontend-imgui PUBLIC ws2_32 SDL2main SDL2 imgui nfd fmt) \ No newline at end of file +target_link_libraries(frontend-imgui PUBLIC SDL2main SDL2 imgui nfd fmt) \ No newline at end of file diff --git a/src/frontend/imgui/debugger.hpp b/src/frontend/imgui/debugger.hpp index 1357cabb..64b4bf82 100644 --- a/src/frontend/imgui/debugger.hpp +++ b/src/frontend/imgui/debugger.hpp @@ -8,135 +8,79 @@ #include struct Core; - -const std::map> cpuInstr = { +// TODO: Fix syntax +static std::map> cpuInstr = { {0b000000, special}, {0b000001, regimm}, - {0b000010, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b000011, [](u32 instr) { - return fmt::format("jal {:08X}", instr & 0x3FFFFFF); - }}, {0b000100, [](u32 instr) { - return fmt::format("beq {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b000101, [](u32 instr) { - return fmt::format("bne {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b000110, [](u32 instr) { - return fmt::format("blez {}", gprStr[RS(instr)]); - }}, {0b000111, [](u32 instr) { - return fmt::format("bgtz {}", gprStr[RS(instr)]); - }}, {0b001000, [](u32 instr) { - return fmt::format("addi {}, {:04X}", gprStr[RS(instr)], instr & 0xFFFF); - }}, {0b001001, [](u32 instr) { - return fmt::format("addiu {}, {:04X}", gprStr[RS(instr)], instr & 0x3FFFFFF); - }}, {0b001010, [](u32 instr) { - return fmt::format("slti {}, {}, {:04X}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xFFFF); - }}, {0b001011, [](u32 instr) { - return fmt::format("sltiu {}, {}, {:04X}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xFFFF); - }}, {0b001100, [](u32 instr) { - return fmt::format("andi {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b001101, [](u32 instr) { - return fmt::format("ori {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b001110, [](u32 instr) { - return fmt::format("xori {}", gprStr[RS(instr)]); - }}, {0b001111, [](u32 instr) { - return fmt::format("lui {}", gprStr[RS(instr)]); - }}, {0b010000, cop0decode - }, {0b010001, cop1decode - }, {0b010010, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b010011, [](u32 instr) { - return fmt::format("jal {:08X}", instr & 0x3FFFFFF); - }}, {0b010100, [](u32 instr) { - return fmt::format("beq {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b010101, [](u32 instr) { - return fmt::format("bne {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b010110, [](u32 instr) { - return fmt::format("blez {}", gprStr[RS(instr)]); - }}, {0b010111, [](u32 instr) { - return fmt::format("bgtz {}", gprStr[RS(instr)]); - }}, {0b011000, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b011001, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b011010, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b011011, [](u32 instr) { - return fmt::format("jal {:08X}", instr & 0x3FFFFFF); - }}, {0b011100, [](u32 instr) { - return fmt::format("beq {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b011101, [](u32 instr) { - return fmt::format("bne {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b011110, [](u32 instr) { - return fmt::format("blez {}", gprStr[RS(instr)]); - }}, {0b011111, [](u32 instr) { - return fmt::format("bgtz {}", gprStr[RS(instr)]); - }}, {0b100000, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b100001, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b100010, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b100011, [](u32 instr) { - return fmt::format("jal {:08X}", instr & 0x3FFFFFF); - }}, {0b100100, [](u32 instr) { - return fmt::format("beq {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b100101, [](u32 instr) { - return fmt::format("bne {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b100110, [](u32 instr) { - return fmt::format("blez {}", gprStr[RS(instr)]); - }}, {0b100111, [](u32 instr) { - return fmt::format("bgtz {}", gprStr[RS(instr)]); - }}, {0b101000, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b101001, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b101010, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b101011, [](u32 instr) { - return fmt::format("jal {:08X}", instr & 0x3FFFFFF); - }}, {0b101100, [](u32 instr) { - return fmt::format("beq {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b101101, [](u32 instr) { - return fmt::format("bne {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b101110, [](u32 instr) { - return fmt::format("blez {}", gprStr[RS(instr)]); - }}, {0b101111, [](u32 instr) { - return fmt::format("bgtz {}", gprStr[RS(instr)]); - }}, {0b110000, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b110001, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b110010, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b110011, [](u32 instr) { - return fmt::format("jal {:08X}", instr & 0x3FFFFFF); - }}, {0b110100, [](u32 instr) { - return fmt::format("beq {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b110101, [](u32 instr) { - return fmt::format("bne {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b110110, [](u32 instr) { - return fmt::format("blez {}", gprStr[RS(instr)]); - }}, {0b110111, [](u32 instr) { - return fmt::format("bgtz {}", gprStr[RS(instr)]); - }}, {0b111000, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b111001, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b111010, [](u32 instr) { - return fmt::format("j {:08X}", instr & 0x3FFFFFF); - }}, {0b111011, [](u32 instr) { - return fmt::format("jal {:08X}", instr & 0x3FFFFFF); - }}, {0b111100, [](u32 instr) { - return fmt::format("beq {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b111101, [](u32 instr) { - return fmt::format("bne {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); - }}, {0b111110, [](u32 instr) { - return fmt::format("blez {}", gprStr[RS(instr)]); - }}, {0b111111, [](u32 instr) { - return fmt::format("bgtz {}", gprStr[RS(instr)]); - }} + {0b000010, [](u32 instr) { return fmt::format("j {:08X}", instr & 0x3FFFFFF); }}, + {0b000011, [](u32 instr) { return fmt::format("jal {:08X}", instr & 0x3FFFFFF); }}, + {0b000100, [](u32 instr) { return fmt::format("beq {}, {}, {:04X}", gprStr[RS(instr)], gprStr[RT(instr)], instr & 0xffff); }}, + {0b000101, [](u32 instr) { return fmt::format("bne {}, {}, {:04X}", gprStr[RS(instr)], gprStr[RT(instr)], instr & 0xffff); }}, + {0b000110, [](u32 instr) { return fmt::format("blez {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); }}, + {0b000111, [](u32 instr) { return fmt::format("bgtz {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); }}, + {0b001000, [](u32 instr) { return fmt::format("addi {}, {:04X}", gprStr[RS(instr)], instr & 0xFFFF); }}, + {0b001001, [](u32 instr) { return fmt::format("addiu {}, {:04X}", gprStr[RS(instr)], instr & 0x3FFFFFF); }}, + {0b001010, [](u32 instr) { return fmt::format("slti {}, {}, {:04X}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xFFFF); }}, + {0b001011, [](u32 instr) { return fmt::format("sltiu {}, {}, {:04X}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xFFFF); }}, + {0b001100, [](u32 instr) { return fmt::format("andi {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b001101, [](u32 instr) { return fmt::format("ori {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b001110, [](u32 instr) { return fmt::format("xori {}", gprStr[RS(instr)]); }}, + {0b001111, [](u32 instr) { return fmt::format("lui {}", gprStr[RS(instr)]); }}, + {0b010000, cop0decode}, + {0b010001, cop1decode}, + {0b010010, rspDecode}, + {0b010011, [](u32 instr) { return fmt::format("RESERVED"); }}, + {0b010100, [](u32 instr) { return fmt::format("beql {}, {}, {:04X}", gprStr[RS(instr)], gprStr[RT(instr)], instr & 0xffff); }}, + {0b010101, [](u32 instr) { return fmt::format("bnel {}, {}, {:04X}", gprStr[RS(instr)], gprStr[RT(instr)], instr & 0xffff); }}, + {0b010110, [](u32 instr) { return fmt::format("blezl {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); }}, + {0b010111, [](u32 instr) { return fmt::format("bgtzl {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); }}, + {0b011000, [](u32 instr) { return fmt::format("daddi {}, {}, {}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xFFFF);}}, + {0b011001, [](u32 instr) { return fmt::format("daddiu {}, {}, {}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xFFFF); }}, + {0b011010, [](u32 instr) { return fmt::format("ldl {:08X}", instr & 0x3FFFFFF); }}, + {0b011011, [](u32 instr) { return fmt::format("ldr {:08X}", instr & 0x3FFFFFF); }}, + {0b011100, [](u32 instr) { return fmt::format("RESERVED"); }}, + {0b011101, [](u32 instr) { return fmt::format("RESERVED"); }}, + {0b011110, [](u32 instr) { return fmt::format("RESERVED"); }}, + {0b011111, [](u32 instr) { return fmt::format("RESERVED"); }}, + {0b100000, [](u32 instr) { return fmt::format("lb {:08X}", instr & 0x3FFFFFF); }}, + {0b100001, [](u32 instr) { return fmt::format("lh {:08X}", instr & 0x3FFFFFF); }}, + {0b100010, [](u32 instr) { return fmt::format("lwl {:08X}", instr & 0x3FFFFFF); }}, + {0b100011, [](u32 instr) { return fmt::format("lw {:08X}", instr & 0x3FFFFFF); }}, + {0b100100, [](u32 instr) { return fmt::format("lbu {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b100101, [](u32 instr) { return fmt::format("lhu {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b100110, [](u32 instr) { return fmt::format("lwr {}", gprStr[RS(instr)]); }}, + {0b100111, [](u32 instr) { return fmt::format("lwu {}", gprStr[RS(instr)]); }}, + {0b101000, [](u32 instr) { return fmt::format("sb {:08X}", instr & 0x3FFFFFF); }}, + {0b101001, [](u32 instr) { return fmt::format("sh {:08X}", instr & 0x3FFFFFF); }}, + {0b101010, [](u32 instr) { return fmt::format("swl {:08X}", instr & 0x3FFFFFF); }}, + {0b101011, [](u32 instr) { return fmt::format("sw {:08X}", instr & 0x3FFFFFF); }}, + {0b101100, [](u32 instr) { return fmt::format("sdl {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b101101, [](u32 instr) { return fmt::format("sdr {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b101110, [](u32 instr) { return fmt::format("swr {}", gprStr[RS(instr)]); }}, + {0b101111, [](u32 instr) { return fmt::format("cache", gprStr[RS(instr)]); }}, + {0b110000, [](u32 instr) { return fmt::format("ll {:08X}", instr & 0x3FFFFFF); }}, + {0b110001, [](u32 instr) { return fmt::format("lwc1 {:08X}", instr & 0x3FFFFFF); }}, + {0b110010, [](u32 instr) { return fmt::format("lwc2 {:08X}", instr & 0x3FFFFFF); }}, + {0b110011, [](u32 instr) { return fmt::format("RESERVED"); }}, + {0b110100, [](u32 instr) { return fmt::format("lld {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b110101, [](u32 instr) { return fmt::format("ldc1 {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b110110, [](u32 instr) { return fmt::format("ldc2 {}", gprStr[RS(instr)]); }}, + {0b110111, [](u32 instr) { return fmt::format("ld {}", gprStr[RS(instr)]); }}, + {0b111000, [](u32 instr) { return fmt::format("sc {:08X}", instr & 0x3FFFFFF); }}, + {0b111001, [](u32 instr) { return fmt::format("swc1 {:08X}", instr & 0x3FFFFFF); }}, + {0b111010, [](u32 instr) { return fmt::format("swc2 {:08X}", instr & 0x3FFFFFF); }}, + {0b111011, [](u32 instr) { return fmt::format("RESERVED"); }}, + {0b111100, [](u32 instr) { return fmt::format("scd {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b111101, [](u32 instr) { return fmt::format("sdc1 {}, {}", gprStr[RS(instr)], gprStr[RT(instr)]); }}, + {0b111110, [](u32 instr) { return fmt::format("sdc2 {}", gprStr[RS(instr)]); }}, + {0b111111, [](u32 instr) { return fmt::format("sd {}", gprStr[RS(instr)]); }} }; struct Debugger { + util::CircularBuffer<20, std::string> disassembled; + inline void Decode(u32 instr) { + const u8 mask = (instr >> 26) & 0x3f; + disassembled.PushValue(cpuInstr[mask](instr)); + } }; \ No newline at end of file diff --git a/src/frontend/imgui/debugger/cpu/decode.hpp b/src/frontend/imgui/debugger/cpu/decode.hpp index 0ecc9aae..faf5b116 100644 --- a/src/frontend/imgui/debugger/cpu/decode.hpp +++ b/src/frontend/imgui/debugger/cpu/decode.hpp @@ -65,14 +65,14 @@ inline std::string regimm(u32 instr) { u8 mask = ((instr >> 16) & 0x1F); // 000r_rccc switch (mask) { // TODO: named constants for clearer code - case 0x00: return fmt::format("bltz {}", gprStr[RS(instr)]); - case 0x01: return fmt::format("bgez {}", gprStr[RS(instr)]); - case 0x02: return fmt::format("bltzl {}", gprStr[RS(instr)]); - case 0x03: return fmt::format("bgezl {}", gprStr[RS(instr)]); - case 0x10: return fmt::format("bltzal {}", gprStr[RS(instr)]); - case 0x11: return fmt::format("bgezal {}", gprStr[RS(instr)]); - case 0x12: return fmt::format("bltzall {}", gprStr[RS(instr)]); - case 0x13: return fmt::format("bgezall {}", gprStr[RS(instr)]); + case 0x00: return fmt::format("bltz {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x01: return fmt::format("bgez {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x02: return fmt::format("bltzl {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x03: return fmt::format("bgezl {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x10: return fmt::format("bltzal {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x11: return fmt::format("bgezal {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x12: return fmt::format("bltzall {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x13: return fmt::format("bgezall {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); default: return fmt::format("INVALID ({:08X})", instr); } } \ No newline at end of file diff --git a/src/frontend/imgui/debugger/debugger_common.hpp b/src/frontend/imgui/debugger/debugger_common.hpp index ef219028..13ca8b91 100644 --- a/src/frontend/imgui/debugger/debugger_common.hpp +++ b/src/frontend/imgui/debugger/debugger_common.hpp @@ -1,7 +1,7 @@ #pragma once #include -const std::string gprStr[32] = { +static const std::string gprStr[32] = { "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", "t0", "t1", "t2", "t3", @@ -12,7 +12,7 @@ const std::string gprStr[32] = { "gp", "sp", "s8", "ra" }; -const std::string cop0Str[32] = { +static const std::string cop0Str[32] = { "Index", "Random", "EntryLo0", "EntryLo1", "Context", "PageMask", "Wired", "r7", "BadVAddr", "Count", "EntryHi", "Compare", @@ -23,7 +23,7 @@ const std::string cop0Str[32] = { "TagLo", "TagHi", "ErrorEPC", "r31" }; -const std::string fgrStr[32] = { +static const std::string fgrStr[32] = { "fgr0", "fgr1", "fgr2", "fgr3", "fgr4", "fgr5", "fgr6", "fgr7", "fgr8", "fgr9", "fgr10", "fgr11", @@ -34,6 +34,33 @@ const std::string fgrStr[32] = { "fgr28", "fgr29", "fgr30", "fgr31" }; -const std::string rspStr[] = { +static const std::string vprStr[32] = { + "vpr0", "vpr1", "vpr2", "vpr3", + "vpr4", "vpr5", "vpr6", "vpr7", + "vpr8", "vpr9", "vpr10", "vpr11", + "vpr12", "vpr13", "vpr14", "vpr15", + "vpr16", "vpr17", "vpr18", "vpr19", + "vpr20", "vpr21", "vpr22", "vpr23", + "vpr24", "vpr25", "vpr26", "vpr27", + "vpr28", "vpr29", "vpr30", "vpr31" +}; +static const std::string vprByteStr[16] = { + "e0_8", "e1_8", "e2_8", "e3_8", + "e4_8", "e5_8", "e6_8", "e7_8", + "e8_8", "e9_8", "e10_8", "e11_8", + "e12_8", "e13_8", "e14_8", "e15_8" +}; + +static const std::string vprElementStr[8] = { + "e0_16", "e2_16", "e4_16", "e6_16", + "e8_16", "e10_16", "e12_16", "e14_16" +}; + +static const std::string vprWordStr[4] = { + "e0_32", "e4_32", "e8_32", "e12_32" +}; + +static const std::string rspControlStr[4] = { + "vco", "vcc", "vce", "vce" }; \ No newline at end of file diff --git a/src/frontend/imgui/debugger/rsp/decode.hpp b/src/frontend/imgui/debugger/rsp/decode.hpp index d6c087b2..835bfe2b 100644 --- a/src/frontend/imgui/debugger/rsp/decode.hpp +++ b/src/frontend/imgui/debugger/rsp/decode.hpp @@ -22,8 +22,8 @@ inline std::string rspSpecial(u32 instr) { inline std::string rspRegimm(u32 instr) { u8 mask = ((instr >> 16) & 0x1F); switch(mask) { - case 0x00: return fmt::format("[rsp]: bltz {}", gprStr[RS(instr)]); - case 0x01: return fmt::format("[rsp]: bgez {}", gprStr[RS(instr)]); + case 0x00: return fmt::format("[rsp]: bltz {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); + case 0x01: return fmt::format("[rsp]: bgez {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); default: return fmt::format("INVALID ({:08X})", instr); } } @@ -31,7 +31,7 @@ inline std::string rspRegimm(u32 instr) { inline std::string lwc2(u32 instr) { u8 mask = (instr >> 11) & 0x1F; switch(mask) { - case 0x04: return fmt::format("lqv", instr); + case 0x04: return fmt::format("[rsp]: lqv {}[{}], {:02X}({})", vprStr[VT(instr)], vprByteStr[BYTE_INDEX(E(instr))], instr & 0x7F, gprStr[BASE(instr)]); default: return fmt::format("INVALID ({:08X})", instr); } } @@ -39,7 +39,7 @@ inline std::string lwc2(u32 instr) { inline std::string swc2(u32 instr) { u8 mask = (instr >> 11) & 0x1F; switch(mask) { - //case 0x04: rsp.sqv(instr); break; + case 0x04: return fmt::format("[rsp]: sqv {}[{}], {:02X}({})", vprStr[VT(instr)], vprByteStr[BYTE_INDEX(E(instr))], instr & 0x7F, gprStr[BASE(instr)]); default: return fmt::format("INVALID ({:08X})", instr); } } @@ -50,15 +50,15 @@ inline std::string cop2decode(u32 instr) { switch(mask) { case 0x00: switch(mask_sub) { - //case 0x02: rsp.cfc2(instr); break; + case 0x02: return fmt::format("[rsp]: cfc2 {}, {}", gprStr[RT(instr)], rspControlStr[RD(instr) & 3]); default: return fmt::format("INVALID ({:08X})", instr); } break; - //case 0x13: rsp.vabs(instr); break; - //case 0x1D: rsp.vsar(instr); break; - //case 0x21: rsp.veq(instr); break; - //case 0x22: rsp.vne(instr); break; - //case 0x33: rsp.vmov(instr); break; + case 0x13: return fmt::format("[rsp]: vabs {}, {}, {}", vprStr[VD(instr)], vprStr[VS(instr)], vprStr[VT(instr)]); + case 0x1D: return fmt::format("[rsp]: vsar {}, {}, {}", vprStr[VD(instr)], vprStr[VS(instr)], vprStr[VT(instr)]); + case 0x21: return fmt::format("[rsp]: veq {}, {}, {}", vprStr[VD(instr)], vprStr[VS(instr)], vprStr[VT(instr)]); + case 0x22: return fmt::format("[rsp]: vne {}, {}, {}", vprStr[VD(instr)], vprStr[VS(instr)], vprStr[VT(instr)]); + case 0x33: return fmt::format("[rsp]: vmov {}[{}], {}[{}]", vprStr[VD(instr)], vprElementStr[DE(instr)], vprStr[VT(instr)], vprElementStr[E(instr)]); default: return fmt::format("INVALID ({:08X})", instr); } } @@ -66,8 +66,8 @@ inline std::string cop2decode(u32 instr) { inline std::string rspCop0Decode(u32 instr) { u8 mask = (instr >> 21) & 0x1F; switch(mask) { - //case 0x00: rsp.mfc0(rdp, instr); break; - //case 0x04: rsp.mtc0(mi, regs, rdp, instr); break; + case 0x00: return fmt::format("[rsp]: mfc0 {}, {}", gprStr[RT(instr)], cop0Str[RD(instr)]); + case 0x04: return fmt::format("[rsp]: mtc0 {}, {}", gprStr[RT(instr)], cop0Str[RD(instr)]); default: return fmt::format("INVALID ({:08X})", instr); } } @@ -79,9 +79,9 @@ inline std::string rspDecode(u32 instr) { case 0x01: return regimm(instr); case 0x02: return fmt::format("[rsp]: j {:04X}", instr & 0xffff); case 0x03: return fmt::format("[rsp]: jal {:04X}", instr & 0xffff); - case 0x04: return fmt::format("[rsp]: beq {}, {}", gprStr[RT(instr)], gprStr[RS(instr)]); - case 0x05: return fmt::format("[rsp]: bne {}, {}", gprStr[RT(instr)], gprStr[RS(instr)]); - case 0x07: return fmt::format("[rsp]: bgtz {}", gprStr[RS(instr)]); + case 0x04: return fmt::format("[rsp]: beq {}, {}, {:04X}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xffff); + case 0x05: return fmt::format("[rsp]: bne {}, {}, {:04X}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xffff); + case 0x07: return fmt::format("[rsp]: bgtz {}, {:04X}", gprStr[RS(instr)], instr & 0xffff); case 0x08: case 0x09: return fmt::format("[rsp]: addi {}, {}, {:04X}", gprStr[RT(instr)], gprStr[RS(instr)], instr & 0xffff); case 0x0C: return fmt::format("[rsp]: andi {}, {}, {:04X}", instr); diff --git a/src/frontend/imgui/widgets.cpp b/src/frontend/imgui/widgets.cpp index f8cbedb8..1c61ee6a 100644 --- a/src/frontend/imgui/widgets.cpp +++ b/src/frontend/imgui/widgets.cpp @@ -41,9 +41,9 @@ void Window::MainMenuBar(n64::Core& core) { void Window::DebuggerWindow(n64::Core& core) const { ImGui::PushFont(uiFont); ImGui::Begin("Debugger"); - if(ImGui::Button("Step")) { - core.debuggerState.gdb->config.step(&core); - } + ImGui::PushFont(codeFont); + ImGui::Text("%s", core.Decode(core.mem.Read(core.cpu.regs, core.cpu.regs.pc, core.cpu.regs.pc)).c_str()); + ImGui::PopFont(); ImGui::End(); ImGui::PopFont(); } \ No newline at end of file diff --git a/src/n64/CMakeLists.txt b/src/n64/CMakeLists.txt index 7af6c102..5a745c51 100644 --- a/src/n64/CMakeLists.txt +++ b/src/n64/CMakeLists.txt @@ -12,7 +12,7 @@ target_link_libraries(n64 PUBLIC core) target_include_directories(n64 PUBLIC . .. - ../frontend/imgui + ../frontend/imgui/debugger ../../external ../../external/imgui/imgui ../../external/imgui/imgui/backends diff --git a/src/n64/Core.hpp b/src/n64/Core.hpp index 5155f721..df1e260c 100644 --- a/src/n64/Core.hpp +++ b/src/n64/Core.hpp @@ -23,7 +23,6 @@ struct Core { bool romLoaded = false; SDL_GameController* gamepad; bool gamepadConnected = false; - DebuggerState debuggerState; bool done = false; std::string rom; Mem mem; diff --git a/src/n64/core/CMakeLists.txt b/src/n64/core/CMakeLists.txt index 108e9960..019bebe9 100644 --- a/src/n64/core/CMakeLists.txt +++ b/src/n64/core/CMakeLists.txt @@ -45,13 +45,12 @@ target_include_directories(core PUBLIC . .. ../.. + ../../frontend/imgui/debugger ../../../external ../../../external/imgui/imgui + ../../../external/imgui/imgui/debugger ../../../external/imgui/imgui/backends ../../../external/capstone/include mmio) target_link_libraries(core PUBLIC SDL2main SDL2 fmt cpu parallel-rdp capstone) -if(WIN32) - -endif() diff --git a/src/n64/core/RSP.hpp b/src/n64/core/RSP.hpp index e7645ead..67be6f33 100644 --- a/src/n64/core/RSP.hpp +++ b/src/n64/core/RSP.hpp @@ -87,17 +87,13 @@ union SPDMADRAMAddr { union VPR { s16 selement[8]; u16 element[8]; - u8 byte[8]; + u8 byte[16]; u32 word[4]; }; struct Mem; struct Registers; -#define VT(x) (((x) >> 16) & 0x1F) -#define VS(x) (((x) >> 11) & 0x1F) -#define VD(x) (((x) >> 6) & 0x1F) -#define E(x) (((x) >> 21) & 0x1F) #define DE(x) (((x) >> 11) & 0x1F) #define CLEAR_SET(val, clear, set) do { \ if(clear) (val) = 0; \ diff --git a/src/n64/core/rsp/instructions.cpp b/src/n64/core/rsp/instructions.cpp index c9932744..c39a4e2d 100644 --- a/src/n64/core/rsp/instructions.cpp +++ b/src/n64/core/rsp/instructions.cpp @@ -3,10 +3,6 @@ #include namespace n64 { - -#define ELEMENT_INDEX(i) (7 - (i)) -#define BYTE_INDEX(i) (15 - (i)) - inline bool AcquireSemaphore(RSP& rsp) { if(rsp.semaphore) { return true; diff --git a/src/util.hpp b/src/util.hpp index 7f8a51f3..3c4a1c4a 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -152,7 +152,7 @@ struct CircularBuffer { CircularBuffer() : head(0) { memset(raw.data(), 0, size * sizeof(T)); } - + // make it scroll void PushValue(T val) { raw[head] = val; head++;