From bf7abe99ef06ee11aab060fba17badb2f2855c70 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 6 Apr 2025 04:24:17 -0500 Subject: [PATCH] speed dial commands and disassembly --- src/engine/cmdStream.cpp | 6 ++++++ src/engine/cmdStreamOps.cpp | 28 +++++++++++++++++++++++++++- src/gui/csPlayer.cpp | 30 +++++++++++++++++++++++------- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/engine/cmdStream.cpp b/src/engine/cmdStream.cpp index 6865adb8e..19fc883ed 100644 --- a/src/engine/cmdStream.cpp +++ b/src/engine/cmdStream.cpp @@ -121,6 +121,12 @@ bool DivCSPlayer::tick() { case 0xcf: command=next-0xb4; break; + case 0xd0: case 0xd1: case 0xd2: case 0xd3: + case 0xd4: case 0xd5: case 0xd6: case 0xd7: + case 0xd8: case 0xd9: case 0xda: case 0xdb: + case 0xdc: case 0xdd: case 0xde: case 0xdf: + command=fastCmds[next-0xd0]; + break; case 0xf0: // placeholder stream.readC(); stream.readC(); diff --git a/src/engine/cmdStreamOps.cpp b/src/engine/cmdStreamOps.cpp index d09a9801c..d33222b81 100644 --- a/src/engine/cmdStreamOps.cpp +++ b/src/engine/cmdStreamOps.cpp @@ -937,6 +937,32 @@ SafeWriter* DivEngine::saveCommand() { } // set speed dial commands (TODO) + for (int h=0; hgetFinalBuf(); + for (size_t i=0; isize();) { + int insLen=getInsLength(buf[i],_EXT(buf,i,chanStream[h]->size()),sortedCmd); + if (insLen<1) { + logE("INS %x NOT IMPLEMENTED...",buf[i]); + break; + } + if (buf[i]==0xf7) { + // find whether this command is in speed dial + for (int j=0; j<16; j++) { + if (buf[i+1]==sortedCmd[j]) { + buf[i]=0xd0+j; + // move everything to the left + for (int k=i+2; kwriteC(sortedCmd[i]); - if (sortedCmdPopularity[i]) logD("- %s: %d",cmdName[sortedCmd[i]],sortedCmdPopularity[i]); + if (sortedCmdPopularity[i]) logD("- %s ($%.2x): %d",cmdName[sortedCmd[i]],sortedCmd[i],sortedCmdPopularity[i]); } return w; diff --git a/src/gui/csPlayer.cpp b/src/gui/csPlayer.cpp index 6f5defc92..5f74011da 100644 --- a/src/gui/csPlayer.cpp +++ b/src/gui/csPlayer.cpp @@ -22,7 +22,7 @@ #include "imgui.h" #include "guiConst.h" -String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr) { +String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned char* speedDial) { if (addr>=bufLen) return "???"; if (buf[addr]<0xb4) { @@ -107,9 +107,17 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr) { case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: case 0xd8: case 0xd9: case 0xda: case 0xdb: - case 0xdc: case 0xdd: case 0xde: case 0xdf: - return "qcmd"; + case 0xdc: case 0xdd: case 0xde: case 0xdf: { + unsigned char cmd=speedDial[buf[addr]&15]; + int cmdLen=DivCS::getCmdLength(cmd); + if ((addr+cmdLen)>=bufLen) return "???"; + String ret=fmt::sprintf("qcmd%d %s",buf[addr]-0xd0,(cmd=bufLen) return "???"; return fmt::sprintf("call %.8x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8)|(buf[addr+3]<<16)|(buf[addr+4]<<24))); break; - case 0xf7: - return "cmd"; + case 0xf7: { + if (addr+1>=bufLen) return "???"; + int cmdLen=DivCS::getCmdLength(buf[addr+1]); + if ((addr+1+cmdLen)>=bufLen) return "???"; + String ret=fmt::sprintf("cmd %s",(buf[addr+1]=bufLen) return "???"; return fmt::sprintf("call %.4x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8))); @@ -309,7 +325,7 @@ void FurnaceGUI::drawCSPlayer() { if (state->trace[j]==0) { ImGui::TextUnformatted("..."); } else { - String dis=disasmCmd(buf,bufSize,state->trace[j]); + String dis=disasmCmd(buf,bufSize,state->trace[j],cs->getFastCmds()); ImGui::Text("%.4x: %s",state->trace[j],dis.c_str()); } } @@ -384,7 +400,7 @@ void FurnaceGUI::drawCSPlayer() { } ImGui::TableNextColumn(); - String dis=disasmCmd(i.data,8,0); + String dis=disasmCmd(i.data,8,0,cs->getFastCmds()); ImGui::Text("%s",dis.c_str()); // jmp/ret separator