16-bit call... B E T A
This commit is contained in:
parent
9227695bb0
commit
e9911ab0aa
|
@ -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];
|
||||||
buf[j]=0xf5;
|
if (addr<=0xffff) {
|
||||||
buf[j+1]=addr&0xff;
|
buf[j]=0xf8;
|
||||||
buf[j+2]=(addr>>8)&0xff;
|
buf[j+1]=addr&0xff;
|
||||||
buf[j+3]=(addr>>16)&0xff;
|
buf[j+2]=(addr>>8)&0xff;
|
||||||
buf[j+4]=(addr>>24)&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 {
|
} else {
|
||||||
logE("requested symbol %d is out of bounds!",addr);
|
logE("requested symbol %d is out of bounds!",addr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 "???";
|
||||||
|
|
Loading…
Reference in a new issue