strip opt commands

This commit is contained in:
tildearrow 2025-04-19 18:56:19 -05:00
parent 3407202f12
commit 470ae1b7a9

View file

@ -785,7 +785,7 @@ SafeWriter* stripNops(SafeWriter* s) {
return s; return s;
} }
SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial) { SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial, unsigned int* chanStreamOff) {
std::unordered_map<unsigned int,unsigned int> addrTable; std::unordered_map<unsigned int,unsigned int> addrTable;
SafeWriter* oldStream=s; SafeWriter* oldStream=s;
unsigned char* buf=oldStream->getFinalBuf(); unsigned char* buf=oldStream->getFinalBuf();
@ -801,7 +801,7 @@ SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial) {
break; break;
} }
addrTable[i]=addr; addrTable[i]=addr;
if (buf[i]!=0xd1) addr+=insLen; if (buf[i]!=0xd1 && buf[i]!=0xd0) addr+=insLen;
i+=insLen; i+=insLen;
} }
@ -813,6 +813,14 @@ SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial) {
break; break;
} }
switch (buf[i]) { switch (buf[i]) {
case 0xd0: // ext (for channel offsets)
if (buf[i+3]==0) {
int ch=buf[i+1];
if (ch>=0 && ch<DIV_MAX_CHANS) {
chanStreamOff[ch]=addrTable[i];
}
}
break;
case 0xd5: // calli case 0xd5: // calli
case 0xda: { // jmp case 0xda: { // 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]<<8)|(buf[i+4]<<24);
@ -842,7 +850,7 @@ SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial) {
break; break;
} }
} }
if (buf[i]!=0xd1) { if (buf[i]!=0xd1 && buf[i]!=0xd0) {
s->write(&buf[i],insLen); s->write(&buf[i],insLen);
} }
i+=insLen; i+=insLen;
@ -1663,29 +1671,11 @@ SafeWriter* DivEngine::saveCommand(DivCSProgress* progress, DivCSOptions options
globalStream=packStream(globalStream,sortedCmd); globalStream=packStream(globalStream,sortedCmd);
// PASS 8: remove nop's which may be produced by 32-bit call conversion // PASS 8: remove nop's which may be produced by 32-bit call conversion
globalStream=stripNopsPacked(globalStream,sortedCmd); // also find new offsets
globalStream=stripNopsPacked(globalStream,sortedCmd,chanStreamOff);
// PASS 9: find new offsets for (int h=0; h<chans; h++) {
{ chanStreamOff[h]+=w->tell();
unsigned char* buf=globalStream->getFinalBuf();
for (size_t i=0; i<globalStream->size();) {
int insLen=getInsLength(buf[i],_EXT(buf,i,globalStream->size()),sortedCmd);
if (insLen<1) {
logE("INS %x NOT IMPLEMENTED...",buf[i]);
break;
}
if (buf[i]==0xd0) {
if (buf[i+3]==0) {
int ch=buf[i+1];
if (ch>=0 && ch<chans) {
chanStreamOff[ch]=i+w->tell();
}
}
}
i+=insLen;
}
} }
// write results (convert addresses to big-endian if necessary) // write results (convert addresses to big-endian if necessary)