Assembler-Ecke #15 -------------------- von Tim-Philipp Müller Hallo, ich hoffe, ihr verzeiht mir nochmal, daß die letzten beiden Assembler-Ecken ausgefallen sind (ich war zwei Monate lang im Ausland)... Diesmal geht es nicht direkt um die Programmierung - sondern darum, wie man am besten Cheats findet. Gerade dabei sind Assembler-Kenntnisse von Nutzen. Als Instrument am besten geeignet ist entweder ein Hardware-Freezer (wie zum Beispiel der Turbo-Freezer XL) oder ein Disk-Monitor. Beide sollten über einen Disassembler verfügen. Cheats werden in der Regel entweder als Speicheradresse angegeben oder als Byte und Sektor auf der Diskette. Letzteres ermöglicht auch Usern ohne Freezer, den Cheat zu verwenden. ----- 1. CHEATS PER FREEZER Das laufende Programm wird gestoppt und der Speicher mit dem Disassembler durchforstet. A. COMPILIERTE TURBO-BASIC PROGRAMME Ich habe es noch nie geschafft, in ein laufendes TB-Compilat zurückzukehren, ohne daß es abstürzt... B. ALLGEMEINE VORGEHENSWEISEN Am häufigsten gelangt man zum Ziel, indem man das Programm im Titelbild stoppt. Hier wird meist nur eine kleine Schleife abgearbeitet, die auf das Drücken von oder dem Trigger wartet. Danach wird dann in der Regel zu einer Routine gesprungen, die die Register auf ihre Anfangswerte setzt (Anzahl der Leben, Zeit, etc.) und danach den Screen aufbaut. Hier lohnt es sich, sich vorher die Startwerte anzuschauen. Man sollte außerdem auf verschiedene Zählroutinen und Zahlendarstellung achten: Je nach Routine kann die Anzahl der Leben um +-2 variieren. Nicht selten wird auch der Dezimalmodus verwendet, d.h., daß 92 als $92 gesetzt wird. Die Bewegungsroutinen der PM-Grafik sind meist in einem der beiden VBI- Interrupts untergebracht. Dort befinden sich in der Regel auch noch Unterprogramme, die Kollisionen abfragen. Hier hat man nun die Möglichkeit, bestimmte Zusammenstöße außer Kraft zu setzen und das Register, das im Falle einer Kollision erniedrigt wird (meist die Leben), auszumachen. Weiterhin wird im VBI oft die Zeit heruntergezählt. Für den Countdown könnten aber auch die Timer-Interrupts zuständig sein. Etwas mühsamer ist es, den Held beim Verlieren eines Lebens einzufrieren, in der Hoffnung, man befindet sich gerade an der Stelle, wo das Lebens- Register dezimiert wird. B. QUICK-PROGRAMME Bei Quick-Programmen lohnt es sich auch, einfach einmal mitten im Spiel den Variablenbereich $B000-$BFFF und die Page 6 $600-$6FF nach passenden Werten zu durchsuchen, die gesuchte Variable zu ändern (Held stirbt o.ä.) und dann die notierten Register noch einmal auf Änderungen zu vergleichen. C. ASSEMBLER-PROGRAMME Typische Speicherbereiche, in denen Variablen abgelegt werden, sind die Page 6 $600-$6FF 2.Hälfte der Page 0 $80- $FF Page 4 $400-$4FF. Ansonsten lohnt es sich, auch den Bereich direkt vor und nach dem Programmcode zu durchsuchen. Übrigens ist es oft viel einfacher, statt ein Register zu finden, einfach die betreffende Routine zu ändern, z.B. die Abfrageroutine, ob man schon null Leben oder Zeit erreicht hat. ----- 2. CHEATS PER DISK-MONITOR Mit dem Disk-Monitor geht das Ganze schon etwas schwerer. Die beste Chance hat man, wenn man nach den Init-Stellen sucht. Hat unser Held am Anfang also 3 Leben, suche ich zuerst einmal nach allen Bytefolgen für LDA #3 (also $A9 $03). Per Disassembler filtert man nun die Stellen, die Programmcode darstellen, heraus. Auf den LDA #3-Befehl folgt meist ein STA $xxxx. Im nächsten Schritt sucht man nun nach DEC $xxxx-Anweisungen (oder LDA $xxxx). Hier ist auch etwas Gespür gefragt. Kommt $xxxx in Frage, ändert man den Wert einfach einmal zur Probe und lädt das Programm. Klappt alles, hat man Glück gehabt. Ansonsten muß man halt die anderen Stellen probieren. Als nächstes ist es ja ebenso möglich, daß 3 Leben den Startwert 2 bedeuten (bei BMI-Befehl als Check). In Ausnahmefällen könnte es natürlich ebenso auch LDY #3 heißen... Führt all dies nicht zum gewünschten Erfolg, muß man sich eben etwas tiefer ins Programm einarbeiten (Programm- anfang herausfinden, Bootroutinen analysieren,etc.), was allerdings seine Zeit braucht... ----- 3. FREEZER-CHEATS MIT DEM DISKMONITOR BENUTZEN Nun hat man also den schon lange gesuchten Cheat, aber keinen Freezer, mit dem das Register manipulieren kann. Man kann nun probieren, das Register mit dem Monitor auf Disk zu suchen, d.h. nicht das Register direkt, sondern die Routinen, die das Register ändern. Dazu sucht man einfach nach passenden Bytefolgen (z.B. DEC Zeitregister) und ändert die danach folgenden Branch- Befehle. Es ist empfehlenswert, die Befehle zu ändern und nicht das Sprung- ziel! ----- 4. EINIGE WICHTIGE CODES LDA #xx $A9 DEC xxxx $CE LDA xx $A5 DEC xx $C6 LDA xxxx $AD LDY #xx $A0 INC xxxx $EE LDY xx $A4 INC xx $E6 LDY xxxx $AC LDX #xx $A2 BEQ $F0 LDX xx $A6 BNE $D0 LDX xxxx $AE BMI $30 BPL $10 CMP #xx $C9 BCC $90 CMP xx $C5 BCS $B0 CMP xxxx $CD Viel Spaß beim Cheat Hunting!