diff --git a/src/engine/cmdStreamOps.cpp b/src/engine/cmdStreamOps.cpp index 5266614c6..965fcdbeb 100644 --- a/src/engine/cmdStreamOps.cpp +++ b/src/engine/cmdStreamOps.cpp @@ -579,9 +579,9 @@ void reloc(unsigned char* buf, size_t len, unsigned int sourceAddr, unsigned int break; } switch (buf[i]) { - case 0xf5: // call + case 0xf5: // calli case 0xfa: { // jmp - unsigned int addr=buf[i+1]|(buf[i+2]<<8)|(buf[i+3]<<8)|(buf[i+4]<<24); + unsigned int addr=buf[i+1]|(buf[i+2]<<8)|(buf[i+3]<<16)|(buf[i+4]<<24); addr+=delta; buf[i+1]=addr&0xff; buf[i+2]=(addr>>8)&0xff; @@ -589,6 +589,13 @@ void reloc(unsigned char* buf, size_t len, unsigned int sourceAddr, unsigned int buf[i+4]=(addr>>24)&0xff; break; } + case 0xf8: { // call + unsigned short addr=buf[i+1]|(buf[i+2]<<8); + addr+=delta; + buf[i+1]=addr&0xff; + buf[i+2]=(addr>>8)&0xff; + break; + } } i+=insLen; } @@ -622,9 +629,9 @@ SafeWriter* stripNops(SafeWriter* s, unsigned char* speedDial) { break; } switch (buf[i]) { - case 0xf5: // call + case 0xf5: // calli case 0xfa: { // jmp - unsigned int addr=buf[i+1]|(buf[i+2]<<8)|(buf[i+3]<<8)|(buf[i+4]<<24); + unsigned int addr=buf[i+1]|(buf[i+2]<<8)|(buf[i+3]<<16)|(buf[i+4]<<24); try { addr=addrTable[addr]; buf[i+1]=addr&0xff; @@ -636,6 +643,17 @@ SafeWriter* stripNops(SafeWriter* s, unsigned char* speedDial) { } break; } + case 0xf8: { // call + unsigned int addr=buf[i+1]|(buf[i+2]<<8); + try { + addr=addrTable[addr]; + buf[i+1]=addr&0xff; + buf[i+2]=(addr>>8)&0xff; + } catch (std::out_of_range& e) { + logW("address %x is not mappable!",addr); + } + break; + } } if (buf[i]!=0xf1) { s->write(&buf[i],insLen); @@ -1139,15 +1157,23 @@ SafeWriter* DivEngine::saveCommand() { break; } if (buf[j]==0xf4) { // callsym - unsigned int addr=buf[j+1]|(buf[j+2]<<8)|(buf[j+3]<<8)|(buf[j+4]<<24); + unsigned int addr=buf[j+1]|(buf[j+2]<<8)|(buf[j+3]<<16)|(buf[j+4]<<24); if (addr>8)&0xff; - buf[j+3]=(addr>>16)&0xff; - buf[j+4]=(addr>>24)&0xff; + if (addr<=0xffff) { + buf[j]=0xf8; + buf[j+1]=addr&0xff; + buf[j+2]=(addr>>8)&0xff; + buf[j+3]=0xf1; + buf[j+4]=0xf1; + } else { + buf[j]=0xf5; + buf[j+1]=addr&0xff; + buf[j+2]=(addr>>8)&0xff; + buf[j+3]=(addr>>16)&0xff; + buf[j+4]=(addr>>24)&0xff; + } } else { logE("requested symbol %d is out of bounds!",addr); } diff --git a/src/gui/csPlayer.cpp b/src/gui/csPlayer.cpp index 5f74011da..2e36837fb 100644 --- a/src/gui/csPlayer.cpp +++ b/src/gui/csPlayer.cpp @@ -126,7 +126,7 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned break; case 0xf0: if (addr+3>=bufLen) return "???"; - return fmt::sprintf("opt %.2x%.2x%.2x",(int)buf[addr+1],(int)buf[addr+2],(int)buf[addr+3]); + return fmt::sprintf("opt $%.2x%.2x%.2x",(int)buf[addr+1],(int)buf[addr+2],(int)buf[addr+3]); break; case 0xf1: return "nop"; @@ -136,11 +136,11 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned break; case 0xf4: if (addr+2>=bufLen) return "???"; - return fmt::sprintf("callsym %.4x",(int)(buf[addr+1]|(buf[addr+2]<<8))); + return fmt::sprintf("callsym $%.4x",(int)(buf[addr+1]|(buf[addr+2]<<8))); break; case 0xf5: if (addr+4>=bufLen) return "???"; - return fmt::sprintf("call %.8x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8)|(buf[addr+3]<<16)|(buf[addr+4]<<24))); + 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: { if (addr+1>=bufLen) return "???"; @@ -155,16 +155,16 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned } case 0xf8: if (addr+2>=bufLen) return "???"; - return fmt::sprintf("call %.4x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8))); + return fmt::sprintf("call $%.4x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8))); break; case 0xf9: return "ret"; break; case 0xfa: - return fmt::sprintf("jmp %.8x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8)|(buf[addr+3]<<16)|(buf[addr+4]<<24))); + return fmt::sprintf("jmp $%.8x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8)|(buf[addr+3]<<16)|(buf[addr+4]<<24))); break; case 0xfb: - return fmt::sprintf("rate %.8x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8)|(buf[addr+3]<<16)|(buf[addr+4]<<24))); + return fmt::sprintf("rate $%.8x",(unsigned int)(buf[addr+1]|(buf[addr+2]<<8)|(buf[addr+3]<<16)|(buf[addr+4]<<24))); break; case 0xfc: if (addr+2>=bufLen) return "???";