POKEs
Wie eine Zahl an der richtigen Stelle auf dem ZX Spectrum unendlich viele Leben brachte.
Ein BASIC-Befehl, der ein Byte in den Speicher schreibt, wurde zum Schummeltrick einer ganzen Generation: Die Leser entdeckten die POKEs, die Zeitschriften druckten sie, und die Verlage schützten sich dagegen. Bis heute gibt es Datenbanken, die sie Spiel für Spiel sammeln, und Emulatoren, die sie von selbst holen.
- 11
- 7
- 47
Byte für Byte
Für den Spectrum besteht alles im Speicher aus Bytes, Zahlen zwischen 0 und 255. Das BASIC-Handbuch, geschrieben von Steven Vickers, bittet dich, dir den Speicher als lange Reihe nummerierter Kästchen vorzustellen, in jedem ein Byte. Die Kästchen von 0 bis 16383 sind ROM: Sie haben einen Glasdeckel, und du kannst nur lesen, was die Fabrik hineingelegt hat. Die folgenden sind RAM, und die kannst du öffnen und ändern [1].
Zum Lesen eines Kästchens gibt es PEEK: PEEK 0 liefert dir das erste Byte des ROM. Zum Schreiben gibt es POKE, in der Form POKE Adresse, Wert. Das Beispiel im Handbuch ist POKE 31000,57, und PRINT PEEK 31000 zeigt, dass die 57 dort geblieben ist. Der Wert muss zwischen -255 und 255 liegen, und zu negativen Werten addiert der Spectrum 256 [1].
Der RAM ist in Bereiche aufgeteilt. Bei 16384 beginnt das Bildschirmbild, bei 22528 die Farben jeder Position (die Attribute), bei 23296 der Druckerpuffer und von 23552 bis 23733 die Systemvariablen; erst danach kommen das BASIC-Programm, seine Variablen und ganz oben die Stapel und die benutzerdefinierten Grafiken [1]. Bei einem 16K-Spectrum gibt es die Kästchen oberhalb von 32767 gar nicht [1].
Das Handbuch verschwieg das Risiko nicht: POKE gibt dir enorme Macht über den Computer und eine ebenso große Macht, ihn zu zerstören, denn ein falscher Wert an der falschen Adresse wirft in einem Augenblick ein Programm weg, an dem du stundenlang geschrieben hast. Gleich danach beruhigte es aber: Der Maschine fügst du keinen bleibenden Schaden zu [1]. Mit diesem Befehl wurde eine ganze Generation zu Schummlern.
Wie man Leben gewinnt
Ein Spiel in Maschinencode speichert die Zahl der Leben in einem dieser Kästchen, und irgendwo im Code steht ein Befehl, der eins abzieht, wenn du stirbst. Bei Manic Miner von Bug-Byte zeigt die vollständige Disassemblierung des Spiels es ohne jeden Zweifel: Die Leben liegen an Adresse 33879, und an Adresse 35136 steht der Befehl DEC (HL), der diese Zahl um eins verringert [2].
Im Z80-Prozessor ist der Befehl DEC (HL) das Byte 53, und das Byte 0 ist NOP, ein Befehl, der nichts tut [3]. Das berühmte POKE 35136,0 tauscht den einen gegen den anderen: Das Spiel läuft weiterhin dort vorbei, wenn du stirbst, zieht aber nichts mehr ab, und die Leben werden unendlich [4]. Deshalb zeigten die Tipplisten auch den Rückweg: POKE 35136,53 schaltet den Trick wieder ab [5].
Jet Set Willy von Software Projects macht es genauso. Die Routine, die ein Leben abzieht, holt die Zahl von Adresse 34252 und hat ihr DEC (HL) bei 35899, und genau dort setzt POKE 35899,0 an [6][7].
Nicht immer wurde der Befehl gelöscht, der abzieht. In einem Tipp zu Chuckie Egg, veröffentlicht in Your Spectrum, warnte Andrew Pennell, dass sein POKE kein DEC entfernte: Er änderte einen Sprung, was funktionierte, aber mitten im Spiel ein paar Mal die Game-Over-Meldung erscheinen ließ [8]. Ein anderer Wert, der in den Listen oft auftaucht, ist 201, der Code des Befehls RET, der aus einer Routine zurückkehrt [3]: In Saboteur! zum Beispiel schafft dir POKE 40004,201 die Hunde aus dem Weg [9].
Und Vorsicht bei den Versionen, denn die Adressen ändern sich von Ausgabe zu Ausgabe. Manic Miner wurde von Software Projects neu herausgebracht, und dort ist das POKE für die Leben nicht mehr 35136, sondern 35142 [5]. Die POKEs auf dieser Seite gelten für die jeweils genannten Ausgaben.
Eine Null an der richtigen Stelle genügte, und das Spiel vergaß, dir ein Leben abzuziehen.
Säckeweise Post
In Crash lebten die Schummeleien in der Rubrik Playing Tips, die Lösungen und Tricks brachte, um die Spiele leichter zu machen. In den ersten Jahren machte sie Robin Candy, und im April 1986 legte die Zeitschrift sogar eine Beilage nur mit seinen Tipps bei; danach kam Hannah Smith [10]. Als sie ging, schrieb ein 15-jähriger Junge aus Ludlow, Nick Roberts, und bat um die Stelle, und zwei Monate später war er der Tipps-Redakteur [11].
Das Rohmaterial kam mit der Post. Roberts erinnert sich an Säcke voller Briefe jede Woche, mit Karten und Kassetten voller POKE-Routinen, aus denen er auswählte, was gedruckt wurde. Er suchte auch selbst nach POKEs, indem er mit einem Multiface den Code der Spiele durchstöberte, und erzählt, dass es immer ein aufregender Moment war, dort Botschaften der Programmierer zu finden [11].
Sinclair User druckte die Entdeckungen in den Leserbriefen, mit Name und Wohnort. Im August 1984 schickten drei Leser aus Merseyside, Wiltshire und Birmingham das POKE für unendliche Leben in Jet Set Willy [12]. Zwei Jahre später hatte die Zeitschrift eine kleine POKE-Ecke mit den Klassikern zum schnellen Nachschlagen: Manic Miner, Jet Set Willy, Atic Atac [13].
In Your Sinclair hieß die Tipps-Rubrik anfangs Hack Free Zone, um sich von Hacking Away abzugrenzen, der Rubrik mit den POKEs zum Abtippen; 1987 wurden beide zum Tipshop vereint. Nachfolgerin von Hacking Away war Practical Pokes, meist präsentiert von Jon North, mit POKEs zum Abtippen und für das Multiface [14]. Im Januar 1991 gab es sie noch immer, eröffnet von Jon North, der POKEs in Mengen versprach [15].
In Spanien hatte MicroHobby die Rubrik Tokes & Pokes. Im Dezember 1990 schrieb ein Leser aus Barcelona, er verstehe die Erklärung nicht, wie man Pokes in seinen Spectrum +2 bekommt; die Zeitschrift antwortete, sie sei so einfach wie möglich, und erklärte es in derselben Ausgabe in einem eigenen Kasten noch einmal [16].
Vor dem Spiel da sein
Das POKE zu schreiben war der leichte Teil; schwierig war es, vor dem Start des Spiels an den Speicher zu kommen. Die klassische Methode, erklärt von MicroHobby: Statt LOAD schriebst du MERGE "", das das kleine BASIC-Programm am Anfang der Kassette lädt und anhält, ohne es auszuführen. Man stoppte das Band, bearbeitete die Zeile mit RANDOMIZE USR, die den Maschinencode startet, und setzte die POKEs direkt davor [16].
In den englischen Zeitschriften war es genauso. Für Jet Set Willy ließ Sinclair User mit MERGE "" laden, das Band stoppen, die Zeile 37 POKE 35899,0 hinzufügen, GOTO 10 eingeben und die Kassette wieder abspielen [12]. Doch MicroHobby warnte, dass das nur bei ungeschützten Spielen funktionierte: Turbolader mit mehr als 2000 Baud oder flackernde Farben machten es undurchführbar [16].
Und es gab immer mehr Schutz. Speedlock von David Aubrey-Jones und David Looker wurde etwa ein Jahr lang an Verlage geschickt, ohne dass einer zugriff, bis Ocean es zum ersten Mal in Daley Thompson's Decathlon einsetzte, das Crash im November 1984 testete. Aubrey-Jones erzählt, er habe es entwickelt, weil ihn die Ladezeit des normalen Ladens immer mehr nervte [17]. Mit solchem Schutz wurde das Kopieren der Kassette mit einem Kopierprogramm fast unmöglich, und die Lader mussten von Hand zerlegt werden [18].
Für diese Spiele druckten die Zeitschriften Hack-Listings: BASIC-Programme, oft mit DATA-Zeilen voller Maschinencode, die das Laden übernahmen und unterwegs die POKEs einsetzten. Eine exakte Wissenschaft war das nicht: Eine solche Routine für Underwurlde, veröffentlicht in Crash, ersetzte eine andere aus der vorigen Ausgabe, die nicht funktionierte [19].
Im Januar 1991 zeigte Your Sinclair, wie man Speedlock 1 und 2 zerlegt. Version 2 hatte sechs Entschlüsselungsroutinen, und ein Teil des Codes prüfte, ob ein Multiface angeschlossen war. Der Code nutzte Tricks des Z80 wie das R-Register und Sprünge, die von der Parität abhängen, und begann absichtlich mit Müll, damit du dachtest, du wärst an der falschen Adresse [15].
Der rote Knopf
Im Februar 1986 stellte Sinclair User das Multiface One von Romantic Robot vor. Auf Knopfdruck kopierte es das laufende Programm auf Diskette, Microdrive oder Wafadrive, ließ dich in den Speicher schauen und POKEs setzen, um an die Highscores zu kommen [20].
Das Geheimnis lag in der Hardware. Der Knopf löst den nicht maskierbaren Interrupt des Z80 aus, und das Multiface übernimmt die Maschine mit seinem eigenen ROM [21]. Da der Schutz jener Zeit vor allem während des Ladens oder kurz danach wirkte, lag ein mitten im Lauf erwischtes Spiel bereits vollständig und ungeschützt im Speicher [21].
Zum Schummeln genügte es, das Spiel anzuhalten, Adresse und Wert einzugeben und an die Stelle zurückzukehren, an der du warst, ohne MERGE und ohne Listings. Die Zeitschriften druckten nun jeden Monat Multiface-POKEs [21]. Es gab sogar Programme für die 8 KB RAM des Geräts selbst, etwa Lifeguard, das den Speicher während des Spiels analysierte, um herauszufinden, welche Adressen man ändern musste [21].
Nach dem Multiface One für den 48K-Spectrum kamen das Multiface 128 im April 1987 und das Multiface 3 im November desselben Jahres, für die Amstrad-Modelle, die das 128 nicht unterstützte [21].
Piraten oder Neugierige?
Ein Gerät, das jedes Spiel auf Knopfdruck kopierte, war nicht harmlos, und niemand tat so, als wäre es das. Sinclair User selbst begann den Test des Multiface mit dem Hinweis, dass Geräte für Sicherheitskopien immer umstritten seien und dieses das umstrittenste von allen werden würde [20].
Die Grenze zwischen Schummeln und Raubkopieren war schmal. MicroHobby sagte den Lesern, der beste Weg, die Pokes einzusetzen, sei ein Transferprogramm [16], und zu den bekanntesten Kopierprogrammen gehörte Trans Express, ebenfalls von Romantic Robot [18]. Andrew Pennell verzichtete in seinem Tipp zu Chuckie Egg darauf, einen eigenen Lader zu veröffentlichen, um niemandem auf die Füße zu treten, und nutzte eine veränderte Version des Laders aus dem Spiel selbst [8].
Auch der Schutz hatte seinen Preis. Als Ocean Speedlock übernahm, diskutierte das Leserforum von Crash monatelang darüber, und manche beklagten, dass die Spiele nun schlechter luden [17].
Manchmal schickte der Verlag selbst POKEs. 1984 starben Spieler von Jet Set Willy nach dem Besuch des Dachbodens an mehreren Stellen immer wieder. Software Projects versicherte Sinclair User, das sei kein Fehler, sondern eine bewusste Art, das Spielende schwerer zu machen, und veröffentlichte vier POKEs, um es aufzuheben [12]. Die moderne Disassemblierung des Spiels behandelt es als das, was es war, einen Fehler, und erklärt, dass diese POKEs ihn beheben, neben anderen Problemen [7].
POKEs heute
Die POKEs überlebten in .POK-Dateien, einem Format, das für das Programm SGD geschaffen wurde, um POKEs auf Snapshots anzuwenden, bevor der Emulator startet. Jeder Schummeltrick beginnt mit einer Zeile N mit dem Namen; die Zeilen M und Z enthalten die POKEs, wobei Z das letzte ist, mit Speicherbank, Adresse, neuem Wert und ursprünglichem Wert, damit man es rückgängig machen kann; ein Wert von 256 bedeutet, dass das Programm dich nach der Zahl fragt; und ein Y schließt die Datei [22].
In der Datei zu Manic Miner, die in der ZXDB liegt, lautet die Zeile für unendliche Leben Z 8 35136 0 53 [23]. Die 8 bedeutet, dass die Bank ignoriert wird, wie bei allen 48K-Spielen, die 0 ist der neue Wert und die 53 der ursprüngliche [22]: dasselbe DEC (HL), das die Disassemblierung an dieser Adresse findet [3][2].
Die ZXDB, die von Einar Saukas geschaffene Datenbank hinter Spectrum Computing, verbindet jedes Spiel mit seiner POKE-Datei und der Liste der Zeitschriftenartikel, in denen es vorkam, mit Links zu den gescannten Seiten [23]. The Tipshop sammelt die in den Zeitschriften veröffentlichten Tipps, mit Angabe der Ausgabe und der Seite, aus der sie stammen [5].
Den Rest erledigen die Emulatoren. Fuse sucht von selbst nach einer GAME.POK, wenn du GAME.TAP öffnest, und hat einen POKE-Finder ähnlich dem Lifeguard des Multiface: Du suchst nach der Zahl deiner Leben, verlierst eins, suchst nach der neuen Zahl, und schnell bleibt eine Adresse übrig. Im Beispiel aus dem Fuse-Handbuch wird der Befehl, der das Leben abzieht, danach durch ein NOP ersetzt [24], genau das, was POKE 35136,0 in Manic Miner tut.
Probier es selbst
Zum Ausprobieren brauchst du kein Spiel. Zwischen den Adressen 23552 und 23733 liegen die Systemvariablen, die den Zustand des Spectrum selbst speichern. Das Handbuch sagt, dass du sie mit PEEK anschauen kannst und dass sich manche mit POKE sinnvoll ändern lassen [25].
Nur manche. Das Handbuch markiert mit einem X die, die man nicht anfassen sollte, weil das System abstürzen kann, und mit einem N die, deren Änderung keine bleibende Wirkung hat [25]. Die, die wir dir vorschlagen, stehen auf keiner der beiden Listen und belegen nur ein Byte; bei Variablen mit zwei Bytes kommt zuerst das niederwertige Byte, anders als man erwarten würde [25].
Auf dem 48K-Spectrum werden Schlüsselwörter nicht buchstabiert: Am Zeilenanfang steht der Cursor im K-Modus, und die Taste, die du drückst, liefert das Wort, das auf ihr steht [26]. Und wenn etwas schiefgeht, machst du nichts kaputt; ein Neustart genügt [1].
Berühmte POKEs
Sie funktionieren nur mit der Originalversion, von Kassette geladen; eine andere Ausgabe kann ihren Speicher anders belegen.
| Spiel | Verlag | Jahr | POKE | Wirkung | [n] |
|---|---|---|---|---|---|
| Manic Miner | Bug-Byte | 1983 | POKE 35136,0 | Unendliche Leben | [23][5][4][13] |
| Jet Set Willy | Software Projects | 1984 | POKE 35899,0 | Unendliche Leben | [27][28][7][12][13] |
| Atic Atac | Ultimate Play The Game | 1983 | POKE 36519,0 | Unendliche Leben | [29][30][13] |
| Knight Lore | Ultimate Play The Game | 1984 | POKE 53567,0 | Unendliche Leben | [31][32] |
| Chuckie Egg | A'n'F Software | 1983 | POKE 42837,0 | Unendliche Leben | [33][8] |
| Underwurlde | Ultimate Play The Game | 1984 | POKE 59375,0 | Unendliche Leben | [34][19] |
| Head over Heels | Ocean Software | 1987 | POKE 42195,0 | Unendliche Leben | [35][36] |
| Renegade (48K) | Imagine Software | 1987 | POKE 40366,0 | Unendliche Zeit | [37][38] |
| Horace Goes Skiing | Sinclair Research | 1983 | POKE 29270,0 | Kein Verkehr | [39][40] |
| Sabre Wulf | Ultimate Play The Game | 1984 | POKE 39702,30 | Keine Monster | [41][42] |
| Saboteur! | Durell Software | 1985 | POKE 40004,201 | Keine Hunde | [43][9] |
Probier es selbst
Hier läuft ein ZX Spectrum 128 im Browser. Tippe eines dieser POKEs ein, drück ENTER und sieh, was sich an der Maschine ändert; keines macht etwas kaputt, und um von vorn anzufangen, genügt ein Neustart.
Schalte den Spectrum 128 ein, wähle 128 BASIC und tippe den Befehl Buchstabe für Buchstabe, dann ENTER. Auf einem echten 48K kommt das Wort POKE von einer einzigen Taste, dem O, und das Komma ist Symbol Shift mit N.
POKE 23609,255Verlängert das Klicken der Tastatur bei jedem Tastendruck, das ab Werk auf 0 steht.POKE 23561,10Eine gedrückt gehaltene Taste beginnt nach 10/50 Sekunde zu wiederholen statt nach den werkseitigen 35/50.POKE 23562,1Hat die Wiederholung begonnen, kommt sie alle 1/50 Sekunde statt alle 5/50.POKE 23608,255Verlängert den Warnton, den du hörst, wenn die Zeile zu lang oder der Speicher voll ist; normal ist 64.POKE 23692,255Der Bildschirm hält nicht mehr mit der Frage scroll? an und läuft 254 Zeilen weiter; damit er nie anhielt, wiederholten Programme das POKE.POKE 23693,14Ändert die dauerhaften Farben auf gelbe Tinte auf blauem Papier (8 × 1 + 6 = 14), wie PAPER 1: INK 6, und du siehst die Wirkung an allem, was du danach schreibst, und nach CLS am ganzen Bildschirm.POKE 23658,8Schaltet CAPS LOCK ein, das Bit 3 dieser Variablen; POKE 23658,0 schaltet es wieder aus.
© 1982 Sinclair Research Ltd
Quellen
- [1]ZX Spectrum BASIC Programming, capítulo 24: The memory · Sinclair Research (manual de Steven Vickers; edição em linha do World of Spectrum), 1982
- [2]Manic Miner: Routine at 34574 (Main loop) · SkoolKit (desmontagem completa do Manic Miner, Richard Dymond)
- [3]Z80 Opcode Table · ClrHome
- [4]Manic Miner: Pokes · SkoolKit (desmontagem completa do Manic Miner, Richard Dymond)
- [5]Manic Miner (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [6]Jet Set Willy: Routine at 35841 (Lose a life) · SkoolKit (desmontagem completa do Jet Set Willy, Richard Dymond)
- [7]Jet Set Willy: Pokes · SkoolKit (desmontagem completa do Jet Set Willy, Richard Dymond)
- [8]Chuckie Egg (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [9]Saboteur! (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [10]Crash (magazine) · Wikipedia
- [11]The story of Crash magazine · Eurogamer (Graeme Mason), 2017
- [12]Sinclair User n.º 29 (agosto de 1984), Letters: Hints for Jet Setters · Sinclair User (digitalização no Internet Archive), 1984
- [13]Sinclair User n.º 53 (agosto de 1986), Poke corner · Sinclair User (digitalização no Internet Archive), 1986
- [14]Your Sinclair · Wikipedia
- [15]Your Sinclair n.º 61 (janeiro de 1991): Practical Pokes e Speedlock · Your Sinclair (digitalização no Internet Archive), 1991
- [16]MicroHobby n.º 205 (dezembro de 1990): Tokes & Pokes · MicroHobby (digitalização no Internet Archive), 1990
- [17]The One David · Crash n.º 44 (Richard Eddy), Crash Online, 1987
- [18]ZX Spectrum software · Wikipedia
- [19]Underwurlde (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [20]Sinclair User n.º 47 (fevereiro de 1986), Back up your troubles · Sinclair User (John Lambert; digitalização no Internet Archive), 1986
- [21]Multiface · Wikipedia
- [22]FAQ: File formats (POK Format v1.20) · World of Spectrum
- [23]Manic Miner (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [24]fuse(1): The Poke Finder e The Poke Memory · Fuse, the Free Unix Spectrum Emulator (manual, Debian)
- [25]ZX Spectrum BASIC Programming, capítulo 25: The system variables · Sinclair Research (manual de Steven Vickers; edição em linha do World of Spectrum), 1982
- [26]ZX Spectrum BASIC Programming, capítulo 1: Introduction · Sinclair Research (manual de Steven Vickers; edição em linha do World of Spectrum), 1982
- [27]Jet Set Willy (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [28]Jet Set Willy (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [29]Atic Atac (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [30]Atic Atac (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [31]Knight Lore (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [32]Knight Lore (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [33]Chuckie Egg (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [34]Underwurlde (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [35]Head over Heels (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [36]Head over Heels (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [37]Renegade (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [38]Renegade (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [39]Horace Goes Skiing (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [40]Horace Goes Skiing (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [41]Sabre Wulf (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [42]Sabre Wulf (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
- [43]Saboteur! (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
- [44]Spectrum ROM: 23609, PIP · SkoolKit (The Complete Spectrum ROM Disassembly, de Ian Logan e Frank O'Hara)
- [45]ZX Spectrum BASIC Programming, capítulo 16: Colours · Sinclair Research (manual de Steven Vickers; edição em linha do World of Spectrum), 1982
- [46]Spectrum ROM: 23693, ATTR-P · SkoolKit (The Complete Spectrum ROM Disassembly, de Ian Logan e Frank O'Hara)
- [47]Spectrum ROM: 23658, FLAGS2 · SkoolKit (The Complete Spectrum ROM Disassembly, de Ian Logan e Frank O'Hara)