RETRODREAMSAMIGA & SPECTRUM
Menu

Histoire · POKE

POKEs

Comment un nombre écrit au bon endroit donnait des vies infinies sur le ZX Spectrum.

Une instruction du BASIC qui écrit un octet en mémoire est devenue la triche de toute une génération : les lecteurs découvraient les POKEs, les magazines les publiaient et les éditeurs se protégeaient. Aujourd'hui encore, des bases de données les conservent jeu par jeu, et des émulateurs vont les chercher tout seuls.

POKEs de jeux
11
à essayer
7
sources
47

Un octet à la fois

Pour le Spectrum, tout ce qui se trouve en mémoire, ce sont des octets, des nombres entre 0 et 255. Le manuel du BASIC, écrit par Steven Vickers, vous demande d'imaginer la mémoire comme une longue rangée de boîtes numérotées, chacune contenant un octet. Les boîtes de 0 à 16383 sont la ROM : elles ont un couvercle de verre, et vous ne pouvez lire que ce qu'on y a mis à l'usine. Les suivantes sont la RAM, et celles-là, vous pouvez les ouvrir et les modifier [1].

Pour lire une boîte, il y a PEEK : PEEK 0 vous donne le premier octet de la ROM. Pour écrire, il y a POKE, sous la forme POKE adresse, valeur. L'exemple du manuel est POKE 31000,57, et PRINT PEEK 31000 montre que le 57 y est bien resté. La valeur doit être comprise entre -255 et 255, et aux valeurs négatives le Spectrum ajoute 256 [1].

La RAM est rangée par zones. À 16384 commence l'image de l'écran, à 22528 les couleurs de chaque position (les attributs), à 23296 la mémoire de l'imprimante et de 23552 à 23733 les variables système ; ensuite seulement viennent le programme en BASIC, ses variables et, tout en haut, les piles et les graphismes définis par l'utilisateur [1]. Sur un Spectrum de 16K, les boîtes au-dessus de 32767 n'existent même pas [1].

Le manuel ne cachait pas le risque : POKE vous donne un pouvoir immense sur l'ordinateur, et un pouvoir de destruction tout aussi grand, car une mauvaise valeur à la mauvaise adresse efface en un instant un programme qui a demandé des heures à écrire. Mais il rassurait aussitôt : vous ne faites aucun mal permanent à la machine [1]. C'est avec cette instruction que s'est faite la triche de toute une génération.

Comment on gagne une vie

Un jeu en code machine garde le nombre de vies dans l'une de ces boîtes, et quelque part dans le code se trouve une instruction qui en retire une quand vous mourez. Dans Manic Miner de Bug-Byte, le désassemblage complet du jeu le montre sans aucun doute possible : les vies sont à l'adresse 33879 et, à l'adresse 35136, se trouve l'instruction DEC (HL), qui diminue ce nombre de un [2].

Sur le processeur Z80, l'instruction DEC (HL) est l'octet 53, et l'octet 0 est NOP, une instruction qui ne fait rien [3]. Le célèbre POKE 35136,0 remplace l'une par l'autre : le jeu continue de passer par là quand vous mourez, mais ne décompte plus rien, et les vies deviennent infinies [4]. C'est pourquoi les listes d'astuces enseignaient aussi le chemin du retour : POKE 35136,53 désactive la triche [5].

Jet Set Willy, de Software Projects, fait la même chose. La routine qui retire une vie va chercher le nombre à l'adresse 34252 et a son DEC (HL) en 35899, et c'est là que tombe le POKE 35899,0 [6][7].

On n'effaçait pas toujours l'instruction qui décompte. Dans une astuce pour Chuckie Egg publiée dans Your Spectrum, Andrew Pennell prévenait que son POKE ne supprimait aucun DEC : il modifiait un saut, ce qui fonctionnait, mais faisait apparaître le message de fin de partie plusieurs fois en cours de jeu [8]. Une autre valeur qui revient souvent dans les listes est 201, le code de l'instruction RET, qui fait revenir d'une routine [3] : dans Saboteur!, par exemple, POKE 40004,201 écarte les chiens de votre chemin [9].

Et attention aux versions, car les adresses changent d'une édition à l'autre. Manic Miner a été réédité par Software Projects, et là le POKE des vies n'est plus 35136 mais 35142 [5]. Les POKEs que vous voyez sur cette page sont ceux des éditions indiquées.

Il suffisait d'un zéro au bon endroit pour que le jeu oublie de vous retirer une vie.

Des sacs de lettres

Dans Crash, les triches vivaient dans la rubrique Playing Tips, qui apportait solutions et astuces pour faciliter les jeux. Les premières années, c'était Robin Candy qui s'en chargeait, et en avril 1986 le magazine a même offert un supplément consacré uniquement à ses astuces ; ensuite est venue Hannah Smith [10]. Quand elle est partie, un garçon de 15 ans de Ludlow, Nick Roberts, a écrit pour demander la place et, deux mois plus tard, c'était lui le responsable des astuces [11].

La matière première arrivait par la poste. Roberts se souvient de sacs de lettres chaque semaine, avec des cartes et des cassettes pleines de routines de POKEs, qu'il choisissait pour publication. Il cherchait aussi des POKEs de son côté, en fouillant le code des jeux avec un Multiface, et raconte que c'était toujours une émotion d'y trouver des messages laissés par les programmeurs [11].

Sinclair User publiait les découvertes dans le courrier des lecteurs, avec nom et ville. En août 1984, trois lecteurs du Merseyside, du Wiltshire et de Birmingham ont envoyé le POKE des vies infinies de Jet Set Willy [12]. Deux ans plus tard, le magazine avait un petit coin des POKEs avec les classiques à consulter rapidement : Manic Miner, Jet Set Willy, Atic Atac [13].

Dans Your Sinclair, la rubrique d'astuces s'est d'abord appelée Hack Free Zone, pour se distinguer de Hacking Away, celle des POKEs à taper ; en 1987 les deux ont fusionné dans Tipshop. La remplaçante de Hacking Away a été Practical Pokes, présentée surtout par Jon North, avec des POKEs à taper et pour le Multiface [14]. En janvier 1991, elle était toujours là, et s'ouvrait sur Jon North promettant des POKEs en quantité [15].

En Espagne, MicroHobby avait Tokes & Pokes. En décembre 1990, un lecteur de Barcelone écrivait qu'il ne comprenait pas l'explication de la façon d'entrer des pokes sur son Spectrum +2 ; le magazine répondait qu'elle était la plus simple possible et, dans le même numéro, l'expliquait à nouveau dans un encadré à part [16].

Arriver avant le jeu

Écrire le POKE était la partie facile ; le difficile était d'atteindre la mémoire avant que le jeu ne démarre. La méthode classique, expliquée par MicroHobby : au lieu de LOAD, on tapait MERGE "", qui charge le petit programme en BASIC du début de la cassette et s'arrête sans l'exécuter. On arrêtait la bande, on éditait la ligne avec le RANDOMIZE USR, celle qui lance le code machine, et on plaçait les POKEs juste avant [16].

Dans les magazines anglais, c'était pareil. Pour Jet Set Willy, Sinclair User faisait charger avec MERGE "", arrêter la bande, ajouter la ligne 37 POKE 35899,0, taper GOTO 10 et relancer la cassette [12]. Mais MicroHobby prévenait que cela ne marchait qu'avec les jeux non protégés : les chargements turbo, à plus de 2000 bauds, ou à couleurs oscillantes le rendaient impraticable [16].

Et les protections se multipliaient. Speedlock, de David Aubrey-Jones et David Looker, a été envoyé aux éditeurs pendant environ un an sans qu'aucun ne s'y intéresse, jusqu'à ce qu'Ocean l'utilise pour la première fois dans Daley Thompson's Decathlon, que Crash a testé en novembre 1984. Aubrey-Jones raconte qu'il l'a créé parce qu'il en avait de plus en plus assez du temps que prenait le chargement normal [17]. Avec de telles protections, copier la cassette avec un programme de copie est devenu presque impossible, et les chargeurs devaient être désassemblés à la main [18].

Pour ces jeux, les magazines publiaient des listings de hack : des programmes en BASIC, souvent avec des lignes de DATA pleines de code machine, qui prenaient le contrôle du chargement et glissaient les POKEs au passage. Ce n'était pas une science exacte : l'une de ces routines pour Underwurlde, publiée dans Crash, venait en remplacer une autre, du numéro précédent, qui ne fonctionnait pas [19].

En janvier 1991, Your Sinclair apprenait à désassembler les Speedlock 1 et 2. La version 2 comptait six routines de déchiffrement, et une partie du code vérifiait si un Multiface était branché. Le code exploitait des astuces du Z80, comme le registre R et les sauts qui dépendent de la parité, et commençait volontairement par des octets sans signification, pour vous faire croire que vous étiez à la mauvaise adresse [15].

Le bouton rouge

En février 1986, Sinclair User présentait le Multiface One, de Romantic Robot. D'une pression sur un bouton, il copiait le programme en cours d'exécution sur disquette, microdrive ou Wafadrive, et permettait de voir ce qu'il y avait en mémoire et de faire des POKEs pour atteindre les meilleurs scores [20].

Le secret était dans le matériel. Le bouton déclenche l'interruption non masquable du Z80, et le Multiface prend le contrôle de la machine avec sa propre ROM [21]. Comme les protections de l'époque agissaient surtout pendant le chargement, ou juste après, un jeu interrompu en pleine partie était déjà entier et non protégé en mémoire [21].

Pour tricher, il suffisait de mettre le jeu en pause, de taper l'adresse et la valeur et de revenir là où vous étiez, sans MERGE ni listings. Les magazines se sont mis à publier des POKEs pour Multiface tous les mois [21]. Il existait même des programmes pour les 8 Ko de RAM de l'appareil lui-même, comme Lifeguard, qui analysait la mémoire pendant le jeu pour découvrir quelles adresses modifier [21].

Après le Multiface One, pour le Spectrum 48K, sont venus le Multiface 128, en avril 1987, et le Multiface 3, en novembre de la même année, pour les modèles Amstrad que le 128 ne prenait pas en charge [21].

Pirates ou curieux ?

Un appareil qui copiait n'importe quel jeu d'un bouton n'était pas innocent, et personne ne prétendait le contraire. Sinclair User elle-même ouvrait son test du Multiface en rappelant que les machines de copie de sauvegarde sont toujours controversées, et que celle-ci allait être la plus controversée de toutes [20].

La frontière entre triche et piratage était mince. MicroHobby disait à ses lecteurs que la meilleure façon d'entrer les pokes était avec un transfer [16], et parmi les programmes de copie les plus connus figurait Trans Express, lui aussi de Romantic Robot [18]. Andrew Pennell, dans l'astuce pour Chuckie Egg, a préféré ne pas publier son propre chargeur, pour ne marcher sur les pieds de personne, et a utilisé une version modifiée du chargeur du jeu lui-même [8].

Les protections avaient aussi un prix. Quand Ocean a adopté Speedlock, le forum des lecteurs de Crash en a débattu pendant des mois, et certains se sont plaints que les jeux se chargeaient désormais moins bien [17].

Parfois, c'était l'éditeur lui-même qui envoyait des POKEs. En 1984, des joueurs de Jet Set Willy mouraient sans arrêt à plusieurs endroits après être passés par le grenier. Software Projects a assuré à Sinclair User qu'il ne s'agissait pas d'un bug, mais d'une façon délibérée de rendre la fin du jeu plus difficile, et a publié quatre POKEs pour l'annuler [12]. Le désassemblage moderne du jeu le traite pour ce qu'il était, un bug, et explique que ces POKEs le corrigent, ainsi que d'autres problèmes [7].

Les POKEs aujourd'hui

Les POKEs ont survécu dans des fichiers .POK, un format créé pour le programme SGD afin d'appliquer des POKEs à des snapshots avant d'ouvrir l'émulateur. Chaque triche commence par une ligne N, avec son nom ; les lignes M et Z contiennent les POKEs, Z étant la dernière, avec la banque de mémoire, l'adresse, la nouvelle valeur et la valeur d'origine, pour pouvoir annuler ; une valeur de 256 signifie que le programme vous demande le nombre ; et un Y ferme le fichier [22].

Dans le fichier de Manic Miner conservé dans ZXDB, la ligne des vies infinies est Z 8 35136 0 53 [23]. Le 8 signifie que la banque est ignorée, comme dans tous les jeux 48K, le 0 est la nouvelle valeur et le 53 la valeur d'origine [22] : le même DEC (HL) que le désassemblage trouve à cette adresse [3][2].

ZXDB, la base de données créée par Einar Saukas qui alimente Spectrum Computing, associe à chaque jeu son fichier de POKEs et la liste des articles de magazine où il est apparu, avec un lien vers les pages numérisées [23]. The Tipshop rassemble les astuces publiées dans les magazines, avec l'indication du numéro et de la page d'où elles viennent [5].

Les émulateurs font le reste. Fuse cherche tout seul un GAME.POK quand vous ouvrez GAME.TAP, et possède un chercheur de POKEs semblable au Lifeguard du Multiface : vous cherchez le nombre de vies que vous avez, vous en perdez une, vous cherchez le nouveau nombre, et il ne reste vite plus qu'une adresse. Dans l'exemple du manuel de Fuse, l'instruction qui décompte la vie est ensuite remplacée par un NOP [24], exactement ce que fait le POKE 35136,0 dans Manic Miner.

Essayez vous-même

Pas besoin d'un jeu pour essayer. Entre les adresses 23552 et 23733 se trouvent les variables système, qui conservent l'état du Spectrum lui-même. Le manuel dit que vous pouvez les examiner avec PEEK et que certaines peuvent être modifiées avec POKE, avec profit [25].

Certaines seulement. Le manuel marque d'un X celles auxquelles il ne faut pas toucher, car le système peut planter, et d'un N celles qui n'ont pas d'effet durable [25]. Celles que nous vous proposons sont hors de ces deux listes et n'occupent qu'un octet ; celles de deux octets stockent d'abord l'octet de poids faible, contrairement à ce qu'on pourrait attendre [25].

Sur le Spectrum 48K, les mots-clés ne s'épellent pas : en début de ligne, le curseur est en mode K, et la touche sur laquelle vous appuyez donne le mot inscrit dessus [26]. Et si quelque chose tourne mal, vous n'abîmez rien ; il suffit de redémarrer [1].

POKEs célèbres

Ils ne marchent que sur la version d'origine du jeu, chargée depuis la cassette ; une autre édition peut organiser sa mémoire autrement.

JeuÉditeurAnnéePOKEEffet[n]
Manic MinerBug-Byte1983POKE 35136,0Vies infinies[23][5][4][13]
Jet Set WillySoftware Projects1984POKE 35899,0Vies infinies[27][28][7][12][13]
Atic AtacUltimate Play The Game1983POKE 36519,0Vies infinies[29][30][13]
Knight LoreUltimate Play The Game1984POKE 53567,0Vies infinies[31][32]
Chuckie EggA'n'F Software1983POKE 42837,0Vies infinies[33][8]
UnderwurldeUltimate Play The Game1984POKE 59375,0Vies infinies[34][19]
Head over HeelsOcean Software1987POKE 42195,0Vies infinies[35][36]
Renegade (48K)Imagine Software1987POKE 40366,0Temps infini[37][38]
Horace Goes SkiingSinclair Research1983POKE 29270,0Pas de circulation[39][40]
Sabre WulfUltimate Play The Game1984POKE 39702,30Pas de monstres[41][42]
Saboteur!Durell Software1985POKE 40004,201Pas de chiens[43][9]

Essayez vous-même

Voici un ZX Spectrum 128 qui tourne dans le navigateur. Tapez l'un de ces POKEs, appuyez sur ENTER et voyez ce qui change dans la machine ; aucun n'abîme quoi que ce soit, et pour revenir au début il suffit de redémarrer.

Allumez le Spectrum 128, choisissez 128 BASIC et tapez la commande lettre par lettre, puis ENTER. Sur un vrai 48K, le mot POKE sort d'une seule touche, le O, et la virgule se fait avec Symbol Shift et N.

  • POKE 23609,255PIPAllonge le clic que fait le clavier à chaque touche, qui vaut 0 à l'origine.
  • POKE 23561,10REPDELUne touche maintenue enfoncée commence à se répéter au bout de 10/50 de seconde, au lieu des 35/50 d'origine.
  • POKE 23562,1REPPERUne fois lancée, la répétition a lieu toutes les 1/50 de seconde, au lieu de 5/50.
  • POKE 23608,255RASPAllonge le bourdonnement d'avertissement, celui que vous entendez quand la ligne est trop longue ou que la mémoire est pleine ; la valeur normale est 64.
  • POKE 23692,255SCR CTL'écran cesse de s'arrêter pour demander scroll? et continue de défiler pendant 254 lignes ; pour ne jamais s'arrêter, les programmes répétaient le POKE.
  • POKE 23693,14ATTR PChange les couleurs permanentes en encre jaune sur papier bleu (8 × 1 + 6 = 14), comme PAPER 1: INK 6, et vous voyez l'effet sur ce que vous tapez ensuite et sur tout l'écran après CLS.
  • POKE 23658,8FLAGS2Active le CAPS LOCK, qui est le bit 3 de cette variable ; POKE 23658,0 le désactive à nouveau.

© 1982 Sinclair Research Ltd

Sources

  1. [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. [2]Manic Miner: Routine at 34574 (Main loop) · SkoolKit (desmontagem completa do Manic Miner, Richard Dymond)
  3. [3]Z80 Opcode Table · ClrHome
  4. [4]Manic Miner: Pokes · SkoolKit (desmontagem completa do Manic Miner, Richard Dymond)
  5. [5]Manic Miner (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  6. [6]Jet Set Willy: Routine at 35841 (Lose a life) · SkoolKit (desmontagem completa do Jet Set Willy, Richard Dymond)
  7. [7]Jet Set Willy: Pokes · SkoolKit (desmontagem completa do Jet Set Willy, Richard Dymond)
  8. [8]Chuckie Egg (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  9. [9]Saboteur! (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  10. [10]Crash (magazine) · Wikipedia
  11. [11]The story of Crash magazine · Eurogamer (Graeme Mason), 2017
  12. [12]Sinclair User n.º 29 (agosto de 1984), Letters: Hints for Jet Setters · Sinclair User (digitalização no Internet Archive), 1984
  13. [13]Sinclair User n.º 53 (agosto de 1986), Poke corner · Sinclair User (digitalização no Internet Archive), 1986
  14. [14]Your Sinclair · Wikipedia
  15. [15]Your Sinclair n.º 61 (janeiro de 1991): Practical Pokes e Speedlock · Your Sinclair (digitalização no Internet Archive), 1991
  16. [16]MicroHobby n.º 205 (dezembro de 1990): Tokes & Pokes · MicroHobby (digitalização no Internet Archive), 1990
  17. [17]The One David · Crash n.º 44 (Richard Eddy), Crash Online, 1987
  18. [18]ZX Spectrum software · Wikipedia
  19. [19]Underwurlde (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  20. [20]Sinclair User n.º 47 (fevereiro de 1986), Back up your troubles · Sinclair User (John Lambert; digitalização no Internet Archive), 1986
  21. [21]Multiface · Wikipedia
  22. [22]FAQ: File formats (POK Format v1.20) · World of Spectrum
  23. [23]Manic Miner (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  24. [24]fuse(1): The Poke Finder e The Poke Memory · Fuse, the Free Unix Spectrum Emulator (manual, Debian)
  25. [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. [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. [27]Jet Set Willy (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  28. [28]Jet Set Willy (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  29. [29]Atic Atac (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  30. [30]Atic Atac (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  31. [31]Knight Lore (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  32. [32]Knight Lore (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  33. [33]Chuckie Egg (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  34. [34]Underwurlde (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  35. [35]Head over Heels (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  36. [36]Head over Heels (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  37. [37]Renegade (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  38. [38]Renegade (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  39. [39]Horace Goes Skiing (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  40. [40]Horace Goes Skiing (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  41. [41]Sabre Wulf (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  42. [42]Sabre Wulf (dicas, POKEs e hacks publicados nas revistas) · The Tipshop
  43. [43]Saboteur! (ficha com o ficheiro .POK e as referências nas revistas) · Spectrum Computing (ZXDB)
  44. [44]Spectrum ROM: 23609, PIP · SkoolKit (The Complete Spectrum ROM Disassembly, de Ian Logan e Frank O'Hara)
  45. [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. [46]Spectrum ROM: 23693, ATTR-P · SkoolKit (The Complete Spectrum ROM Disassembly, de Ian Logan e Frank O'Hara)
  47. [47]Spectrum ROM: 23658, FLAGS2 · SkoolKit (The Complete Spectrum ROM Disassembly, de Ian Logan e Frank O'Hara)