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;
}
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<blockOff.size()) {
// turn it into call
addr=blockOff[addr];
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;
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);
}