PAC-Man Bug Level 256



  • Für alle die es wie mich amüsiert, dass schon seit Anbeginn der Programmierung Fehler gemacht wurden:

    http://www.wusstestdu.net/#12411

    😃



  • Ich hasse Websiten wo man Javascript aktivieren muss um Content zu sehen. 🙄
    Aber wieso wird bei einem Überlauf einer Variable anderer Speicher überschrieben?



  • Ins blaue geraten: Zum Erhöhen der Variable wird ein 16-/32-bit-Befehl verwendet, obwohl es nur eine 8-bit-Variable ist.



  • Laut Wikipedia benutzt der Automat eine Z80-CPU. Die hat zwar auch 16-bit Additions- und -Inkrement-Insturktionen, die aber nur mit Registerpaaren (HL,DE,IX,IY wenn mich mein Gedächtnis nicht täuscht). Operationen auch Speicher finden aber normalerweise nur byteweise statt und eine Speicherzelle kann auch direkt als Zieloperand für Addition und Inkremntierung dienen. Etwas seltsam ist der Bug also schon. Ich vermute mal, dass weder Quell- noch Objektcode irgenwo veröffentlicht wurden, so das man nicht direkt nachschauen kann.



  • Kurzfassung:

    Für Level-Nummern <= 7 zeichnet das Spiel N = Level-Nummer Früchte.
    Bei Level 256 gibt's nen Registerüberlauf, also ist die Level-Nummer danach 0. 0 ist <= 7, also versucht das Spiel 0 Früchte zu zeichnen.

    Da der Author wohl nicht mit Fruit-Count == 0 gerechnet hat, hat er keine kopfgesteuerte sondern eine fussgesteuerte Schleife programmiert. D.h. der Count wird vor dem Vergleich gegen 0 erstmal dekrementiert, dabei wird aus 0 255, und dadurch macht der Loop insgesamt 256 Durchläufe, "zeichnet" also 256 "Früchte".

    Die Daten um welche Frucht es sich handelt stehen in einer Tabelle. Die hat natürlich keine 256 Einträge. Und der Platz wo die Früchte hingezeichnet werden ist auch nicht gross genug für 256 Früchte.
    Dadurch werden dann etliche Speicherbereiche mit völligem Unsinn überschreiben.

    Details sind hier zu finden:

    http://www.donhodges.com/how_high_can_you_get2.htm



  • @hustbaer: Super Erklärung! Danke! 🙂



  • Typische Programmierer-Qualitätssicherung 😉 Aaaach bis über Level 200 kommt sowieso keiner 😃


Anmelden zum Antworten