Wie ein fehlerhafter 68030-Befehl das Booten des Mac Classic II ermöglichte
- Apple machte im ROM des Macintosh Classic II einen Fehler, der den Bootvorgang hätte verhindern können. Die Motorola-MC68030-CPU führte jedoch einen undefinierten Befehl aus, verhinderte so den Absturz und ermöglichte einen erfolgreichen Start.
MAME und Mac-Emulation
- MAME ist ein Emulator, der viele verschiedene Arcade-Spiele unterstützt, und gilt als einer der vollständigsten Emulatoren für Mac-Modelle auf 68000-Basis.
- Der Autor wollte das Problem des Mac Classic II mit MAME lösen und stellte fest, dass das System im 24-Bit-Adressmodus normal bootet, im 32-Bit-Adressmodus jedoch fehlschlägt.
24-Bit- vs. 32-Bit-Adressmodus
- Der Motorola-68000-Prozessor verfügte über 24 Adressleitungen, und Apple nutzte die übrigen 8 Bit zum Speichern von Flags.
- Neuere Maschinen und Prozessoren unterstützten einen 32-Bit-Adressraum; um Kompatibilitätsprobleme zu lösen, wurden deshalb zwei Modi angeboten.
Analyse der Ursache
- Um herauszufinden, warum der Classic II in MAME im 32-Bit-Modus nicht bootet, wurde der Code mit dem Debugger nachverfolgt.
- Laut Apples technischer Dokumentation bedeutet
0000000F, dass eine Ausnahme aufgetreten ist, und 00000001 steht für einen Busfehler.
Analyse des ROM-Codes
- Im ROM-Code wurde ein Befehl entdeckt, der auf eine falsche Adresse zugreift.
- Dieser Befehl speichert eine falsche Adresse im Register A1, was zu einem Sad-Mac-Fehler führt.
Unterschiede zur Hardware
- Auf echter Hardware verändert der fehlerhafte Befehl den Wert von A1 und macht daraus eine gültige Adresse.
- Der Emulator von MAME verarbeitet diesen Befehl nicht korrekt, sodass A1 die falsche Adresse behält.
Fazit
- Apple war sich des möglichen Bugs im ROM des Classic II offenbar nicht bewusst, und der fehlerhafte 68030-Befehl verbarg ihn.
- MAME behebt das Problem, indem der Bug im ROM gepatcht wird, sodass der Classic II booten kann.
- Dieser Fall zeigt, dass Emulatoren neue Erkenntnisse über Hardware liefern können.
1 Kommentare
Hacker-News-Kommentare
Jemand teilt die Erfahrung, eine undokumentierte Anweisung des MC68030 entdeckt zu haben. Diese Anweisung verändert den Wert des A1-Registers und führt einen Read-Modify-Write-Buszyklus aus.
Es wird erwähnt, dass es viele Bugreports zur Emulation der CAS-Anweisung gab.
Es werden Erinnerungen an den Amiga 2000 und den 68000-Prozessor geteilt.
Die meisten CPUs haben undokumentierte Anweisungen, und 68k ist keine Ausnahme.
Es seien Versuche nötig, um das genaue Verhalten der undokumentierten Anweisung des MC68030 zu verstehen.
Es wird Bewunderung für die Effizienz der UI des Mac-Debuggers geäußert.
Jemand fragt sich, ob diese Anweisung zu Kopierschutzzwecken verwendet wurde und ob sie auf allen 68030 auftritt.
Es wird gefragt, ob auch der "040/060" diese "undokumentierte Anweisung" unterstützt.