16-bit call... B E T A

This commit is contained in:
tildearrow 2025-04-06 04:59:01 -05:00
parent 9227695bb0
commit e9911ab0aa
2 changed files with 42 additions and 16 deletions

View file

@ -579,9 +579,9 @@ void reloc(unsigned char* buf, size_t len, unsigned int sourceAddr, unsigned int
break; break;
} }
switch (buf[i]) { switch (buf[i]) {
case 0xf5: // call case 0xf5: // calli
case 0xfa: { // jmp 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; addr+=delta;
buf[i+1]=addr&0xff; buf[i+1]=addr&0xff;
buf[i+2]=(addr>>8)&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; buf[i+4]=(addr>>24)&0xff;
break; 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; i+=insLen;
} }
@ -622,9 +629,9 @@ SafeWriter* stripNops(SafeWriter* s, unsigned char* speedDial) {
break; break;
} }
switch (buf[i]) { switch (buf[i]) {
case 0xf5: // call case 0xf5: // calli
case 0xfa: { // jmp 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 { try {
addr=addrTable[addr]; addr=addrTable[addr];
buf[i+1]=addr&0xff; buf[i+1]=addr&0xff;
@ -636,6 +643,17 @@ SafeWriter* stripNops(SafeWriter* s, unsigned char* speedDial) {
} }
break; 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) { if (buf[i]!=0xf1) {
s->write(&buf[i],insLen); s->write(&buf[i],insLen);
@ -1139,15 +1157,23 @@ SafeWriter* DivEngine::saveCommand() {
break; break;
} }
if (buf[j]==0xf4) { // callsym 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<blockOff.size()) { if (addr<blockOff.size()) {
// turn it into call // turn it into call
addr=blockOff[addr]; addr=blockOff[addr];
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]=0xf5;
buf[j+1]=addr&0xff; buf[j+1]=addr&0xff;
buf[j+2]=(addr>>8)&0xff; buf[j+2]=(addr>>8)&0xff;
buf[j+3]=(addr>>16)&0xff; buf[j+3]=(addr>>16)&0xff;
buf[j+4]=(addr>>24)&0xff; buf[j+4]=(addr>>24)&0xff;
}
} else { } else {
logE("requested symbol %d is out of bounds!",addr); logE("requested symbol %d is out of bounds!",addr);
} }

View file

@ -126,7 +126,7 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned
break; break;
case 0xf0: case 0xf0:
if (addr+3>=bufLen) return "???"; 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; break;
case 0xf1: case 0xf1:
return "nop"; return "nop";
@ -136,11 +136,11 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned
break; break;
case 0xf4: case 0xf4:
if (addr+2>=bufLen) return "???"; 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; break;
case 0xf5: case 0xf5:
if (addr+4>=bufLen) return "???"; 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; break;
case 0xf7: { case 0xf7: {
if (addr+1>=bufLen) return "???"; if (addr+1>=bufLen) return "???";
@ -155,16 +155,16 @@ String disasmCmd(unsigned char* buf, size_t bufLen, unsigned int addr, unsigned
} }
case 0xf8: case 0xf8:
if (addr+2>=bufLen) return "???"; 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; break;
case 0xf9: case 0xf9:
return "ret"; return "ret";
break; break;
case 0xfa: 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; break;
case 0xfb: 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; break;
case 0xfc: case 0xfc:
if (addr+2>=bufLen) return "???"; if (addr+2>=bufLen) return "???";