diff --git a/src/engine/cmdStreamOps.cpp b/src/engine/cmdStreamOps.cpp index ee32d4ff1..ae8b8a23e 100644 --- a/src/engine/cmdStreamOps.cpp +++ b/src/engine/cmdStreamOps.cpp @@ -785,7 +785,7 @@ SafeWriter* stripNops(SafeWriter* s) { return s; } -SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial) { +SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial, unsigned int* chanStreamOff) { std::unordered_map addrTable; SafeWriter* oldStream=s; unsigned char* buf=oldStream->getFinalBuf(); @@ -801,7 +801,7 @@ SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial) { break; } addrTable[i]=addr; - if (buf[i]!=0xd1) addr+=insLen; + if (buf[i]!=0xd1 && buf[i]!=0xd0) addr+=insLen; i+=insLen; } @@ -813,6 +813,14 @@ SafeWriter* stripNopsPacked(SafeWriter* s, unsigned char* speedDial) { break; } switch (buf[i]) { + case 0xd0: // ext (for channel offsets) + if (buf[i+3]==0) { + int ch=buf[i+1]; + if (ch>=0 && chwrite(&buf[i],insLen); } i+=insLen; @@ -1663,29 +1671,11 @@ SafeWriter* DivEngine::saveCommand(DivCSProgress* progress, DivCSOptions options globalStream=packStream(globalStream,sortedCmd); // 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 - { - unsigned char* buf=globalStream->getFinalBuf(); - for (size_t i=0; isize();) { - 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 && chtell(); - } - } - } - - i+=insLen; - } + for (int h=0; htell(); } // write results (convert addresses to big-endian if necessary)