Invalid Opcode - cmovlne



  • Hi!

    Ich probiere seit mehreren Stunden das Spiel "Casino Empire" zum Laufen zu bringen. Der bricht beim Starten der Missionen immer mit einer Fehlermeldung ab.
    Im Forum zu dem Spiel steht nur, dass noch jemand dasselbe Problem hat, aber keine Lösung.

    Ich hab einfach mal selbst ein wenig experimentiert. Ich habe die exe disassembliert (ich weiß 🙄 ), und habe mir die Stelle angegesehen, an der der Fehler liegt. Da steht folgender Opcode:
    0F 4F C1 entspricht lt. dem disassembler: cmovlne eax, ecx

    Dieser Opcode ist mir vollkommen unbekannt, und wie es aussieht meiner CPU auch (k6-2), der fehler ist nämlich eine invalid opcode exception.

    In der exe kommen noch einige solche komischen opcode vor, alle fangen mit cmov an.

    Wieso machen die in ein fertiges Spiel ungültige Opcodes rein?! 😕
    Weiß vielleicht jemand genau, wofür die opcodes da sind oder welche cpu man braucht? evtl. kann man sie dann durch gültige ersetzen...

    p.s.:
    Ein Update zu dem Spiel gibt es nicht, nur ein "fake" Update; es nennt sich selbst dummy-update und macht gar nichts. 😕

    p.p.s.:
    Ich hab die Originalcd, es hat also nichts mit dem Kopierschutz zu tun (das intro kommt ja).



  • http://x86.ddj.com/secrets/opcodes/cmov.htm

    vielleicht hilft dir das. Das solltest du aber patchen können



  • Ich habs auf die brutalo tour gemacht: Im Hexeditor alle diese opcodes durch 90h ersetzt. Jetzt läufts. 🙂

    Das verstehe wer will. 😕



  • 😞

    Es läuft doch nicht ganz korrekt. Wenn ich ein Kassenhäuschen bauen will, stürzt er mit einer ungültigen Seite ab. 😞

    So ein Mist, dieses Spiel!



  • hol dir mal nen neueren prozessor. 🙂



  • danke für diese hilfreiche Antwort. 😉

    Dann müsste ich mir einen komplett neuen Rechner zulegen, denn:
    Neue CPU passt nicht ins Board -> Neues Board.
    neues Board = atx -> netzteil passt nicht -> neues netzteil
    neues board = ram ist zu lahm -> neuer Ram.

    Und das hab ich im Moment nicht vor.



  • Du kannst dir genau diese drei Komponenten in einem Upgrade Kit für 200-300 EUR zulegen.



  • Original erstellt von cd9000:
    **:(

    Es läuft doch nicht ganz korrekt. Wenn ich ein Kassenhäuschen bauen will, stürzt er mit einer ungültigen Seite ab. 😞

    So ein Mist, dieses Spiel!**

    Klar, so kanns ja net funjktionieren, wenn du alle cmovs einfach wegpatcht. Ein cmovXX ist, sofern die angegebene Bedingung erfüllt ist, einen move, ansonsten ein NOP. indem du einfach die befehle gekillt hast, verhält sich das Programm normal, solange die Bedingung nicht erfüllt ist. Aber wenn die Bedingung mal erfüllt ist, fehlt das mov. cmovCC existiert seit dem Pentium Pro/P6, wundert mich dass das im K6-2 noch nicht drin ist...



  • Das ist jetzt erstmal ein wenig theorethisch, aber vielleicht kann jemand damit ja ne praktische Lösung entwerfen.
    Es müsste eigentlich funktionieren, wenn ein Exception-Handler installiert wird, der prüft ob der InvalidOpcode ein cmovCC ist, und dann diese Funktion "emuliert".
    Ist zwar lahm könnte aber gehen, ansonsten bugreport senden, vielleicht tut euch da ein Entwickler den gefallen und jagt den Source nochmal durch den Compiler aber dann mit nem geringeren Befehlssatz.
    Oder gibt es die Firma nicht mehr?



  • Original erstellt von kingruedi:
    **http://x86.ddj.com/secrets/opcodes/cmov.htm

    vielleicht hilft dir das. Das solltest du aber patchen können**

    die seite ist gut :p



  • Naja, patchen mach ich eigentlich nicht so gerne... wegen der rechtslage... 🙄

    Ich hab mal getestet im inline assembler von vc++ diese Anweisung auszuführen. Kompiliert wird es ohne Probleme, nur beim Starten kommt wieder "ungültige Anweisung".

    Es bleibt mir wohl nichts anderes übrig als auf ein Update zu warten.



  • Wieso? Du hast ja auch alles mit nop's ersetzt, ist doch auch patchen 😉 Versuch's doch einfach mal.



  • Eine andere Idee für nen Patch wäre hinten an den original Code CMOVcc "Emulationen" anzuhängen, und dann die entsprechenden CMovccs durch calls zu ersetzen.
    Ein CMovcc ist 3 byte groß, ich nehme an das wird kaum reichen.
    In dem Fall, dass es nicht reich, müßtest du den Code gut analysieren, und hoffen, das nach jedem CMovcc die gleiche Operation folgt. Die könntest du dann mit in deine "Emulation" aufnehmen.

    Das "könnte" funktionieren, CMovccs haben sonst nämlich noch die Eigenschaft der Atomarität, die du nur mit viel aufwand "emulieren" könntest. Ich nehme jedoch an, dass sich darauf vorerst verzichten lassen könnte.

    mfg
    -bg-



  • Wenn es nicht zu viele cmov's gibt, könnte man für jeden auch seine eigene Routine schreiben (das wäre eine Lösung, wenn auf jeden cmov nicht die gleiche Anweisung folgt).
    Wenn total kompliziert wird (es folgt nicht immer die gleiche Anweisung nach den cmov's und es gibt auch noch recht viele davon) könnte man ein Programm schreiben, dass dies automatisch macht. Nur die Frage ob hier der Aufwand nicht langsam unnötig hoch wird 😃



  • Ich glaube das mit den exceptions funktioniert wohl noch am besten.
    Bin gerade am erarbeiten einer Lösung.
    Denn Code könnte mensch dann einfach hinten dran pflanzen und den Startvektor passend umbiegen (ala Virus), dann müsste es gehen.
    Problematisch könnte es allerdings mit dem Stack-frame werden, aber ich glaube das krieg ich noch hin.

    mfg
    -bg-



  • Okay. Bitte nicht weitererzählen: 🙂
    Ich hab mir in der exe einfach eine Stelle gesucht, die ziemlich sicher nie ausgeführt wird. Da habe ich dann emulationscode reingeschrieben. Jeden cmovCC habe ich dann durch einen far call dorthin ersetzt. Das ging ganz gut weil nach jedem cmovCC dieselben Befehle standen.

    Nach ein paar dummen Fehlern (jaja, ret und retf) habe ich es geschafft:
    Jetzt läuft das Spiel endlich! 😃



  • Ist das eigentlich ein DOS Spiel?



  • Nein. Ein recht aktuelles Windowsspiel.

    Es hat eine 2D-Isometrische Ansicht, vom Stil ungefähr wie "Die Sims". Damit keine falschen Vermutungen aufkommen: Die Sims mag ich nicht. 🙂


Anmelden zum Antworten