RETRODREAMSAMIGA & SPECTRUM
Menu

Storia · POKE

POKE

Come un numero scritto nel posto giusto dava vite infinite sullo ZX Spectrum.

Un'istruzione del BASIC che scrive un byte in memoria è diventata il trucco di una generazione: i lettori scoprivano i POKE, le riviste li pubblicavano e gli editori si proteggevano. Ancora oggi ci sono banche dati che li conservano gioco per gioco, ed emulatori che vanno a cercarli da soli.

POKE di giochi
11
da provare
7
fonti
47

Un byte alla volta

Per lo Spectrum, tutto ciò che sta in memoria sono byte, numeri tra 0 e 255. Il manuale del BASIC, scritto da Steven Vickers, ti chiede di immaginare la memoria come una lunga fila di scatole numerate, ciascuna con un byte dentro. Le scatole da 0 a 16383 sono ROM: hanno il coperchio di vetro, e puoi solo leggere ciò che ci hanno messo in fabbrica. Le successive sono RAM, e quelle puoi aprirle e cambiarle [1].

Per leggere una scatola c'è PEEK: PEEK 0 ti dà il primo byte della ROM. Per scrivere c'è POKE, nella forma POKE indirizzo, valore. L'esempio del manuale è POKE 31000,57, e PRINT PEEK 31000 mostra che il 57 è rimasto lì. Il valore deve essere tra -255 e 255, e ai negativi lo Spectrum somma 256 [1].

La RAM è organizzata per zone. A 16384 comincia l'immagine dello schermo, a 22528 i colori di ogni posizione (gli attributi), a 23296 la memoria della stampante e da 23552 a 23733 le variabili di sistema; solo dopo vengono il programma in BASIC, le sue variabili e, lassù in alto, gli stack e i grafici definiti dall'utente [1]. Su uno Spectrum da 16K, le scatole sopra 32767 non esistono nemmeno [1].

Il manuale non nascondeva il rischio: il POKE ti dà un potere immenso sul computer, e un potere di distruzione altrettanto grande, perché un valore sbagliato all'indirizzo sbagliato butta via in un istante un programma che ha richiesto ore di scrittura. Ma rassicurava subito dopo: non fai nessun danno permanente alla macchina [1]. È con questa istruzione che si è fatto il trucco di una generazione.

Come si guadagna una vita

Un gioco in codice macchina conserva il numero di vite in una di queste scatole, e da qualche parte nel codice c'è un'istruzione che gliene toglie una quando muori. In Manic Miner della Bug-Byte, il disassemblaggio completo del gioco lo mostra senza margine di dubbio: le vite stanno all'indirizzo 33879 e, all'indirizzo 35136, c'è l'istruzione DEC (HL), che diminuisce quel numero di uno [2].

Nel processore Z80, l'istruzione DEC (HL) è il byte 53, e il byte 0 è NOP, un'istruzione che non fa nulla [3]. Il famoso POKE 35136,0 scambia l'una con l'altra: il gioco continua a passare di lì quando muori, ma non scala più nulla, e le vite diventano infinite [4]. Per questo le liste di trucchi insegnavano anche la strada del ritorno: POKE 35136,53 disattiva il trucco [5].

Jet Set Willy, della Software Projects, fa lo stesso. La routine che toglie una vita va a prendere il numero all'indirizzo 34252 e ha il suo DEC (HL) a 35899, ed è lì che cade il POKE 35899,0 [6][7].

Non sempre si cancellava l'istruzione che scala. In un trucco per Chuckie Egg pubblicato su Your Spectrum, Andrew Pennell avvertiva che il suo POKE non rimuoveva nessun DEC: cambiava un salto, il che funzionava, ma faceva comparire il messaggio di fine partita un certo numero di volte a metà partita [8]. Un altro valore che compare spesso nelle liste è il 201, il codice dell'istruzione RET, che fa tornare da una routine [3]: in Saboteur!, per esempio, POKE 40004,201 ti toglie i cani di mezzo [9].

E attenzione alle versioni, perché gli indirizzi cambiano da un'edizione all'altra. Manic Miner fu ripubblicato dalla Software Projects, e lì il POKE delle vite non è più 35136 ma 35142 [5]. I POKE che vedi in questa pagina sono delle edizioni indicate.

Bastava uno zero nel posto giusto perché il gioco si dimenticasse di toglierti la vita.

Sacchi di lettere

Su Crash, i trucchi vivevano nella sezione Playing Tips, che portava soluzioni e stratagemmi per facilitare i giochi. Nei primi anni era Robin Candy a curarla, e nell'aprile 1986 la rivista arrivò a regalare un supplemento solo con i suoi trucchi; poi venne Hannah Smith [10]. Quando lei se ne andò, un ragazzo di 15 anni di Ludlow, Nick Roberts, scrisse per chiedere il posto e, due mesi dopo, era lui il curatore dei trucchi [11].

La materia prima arrivava per posta. Roberts ricorda sacchi di lettere ogni settimana, con mappe e cassette piene di routine di POKE, che lui sceglieva da pubblicare. Cercava anche POKE per conto suo, frugando nel codice dei giochi con un Multiface, e racconta che era sempre un'emozione trovarci messaggi lasciati dai programmatori [11].

Sinclair User pubblicava le scoperte nelle lettere dei lettori, con nome e città. Nell'agosto 1984, tre lettori del Merseyside, del Wiltshire e di Birmingham mandarono il POKE delle vite infinite di Jet Set Willy [12]. Due anni dopo, la rivista aveva un angolino dei POKE con i classici da consultare al volo: Manic Miner, Jet Set Willy, Atic Atac [13].

Su Your Sinclair, la sezione dei trucchi si chiamò all'inizio Hack Free Zone, per distinguersi da Hacking Away, che era quella dei POKE da digitare; nel 1987 le due si unirono in Tipshop. L'erede di Hacking Away fu Practical Pokes, presentata soprattutto da Jon North, con POKE da digitare e per il Multiface [14]. Nel gennaio 1991 era ancora lì, e si apriva con Jon North che prometteva POKE in quantità [15].

In Spagna, MicroHobby aveva Tokes & Pokes. Nel dicembre 1990, un lettore di Barcellona scriveva per dire che non capiva la spiegazione di come si mettevano i pokes sul suo Spectrum +2; la rivista rispondeva che era la più semplice possibile e, nello stesso numero, tornava a spiegarlo in un riquadro a parte [16].

Arrivare prima del gioco

Scrivere il POKE era la parte facile; il difficile era arrivare alla memoria prima che il gioco partisse. Il metodo classico, spiegato da MicroHobby: invece di LOAD, scrivevi MERGE "", che carica il piccolo programma in BASIC all'inizio della cassetta e si ferma senza eseguirlo. Si fermava il nastro, si modificava la riga con il RANDOMIZE USR, che è quella che avvia il codice macchina, e si mettevano i POKE immediatamente prima [16].

Nelle riviste inglesi era uguale. Per Jet Set Willy, Sinclair User diceva di caricare con MERGE "", fermare il nastro, aggiungere la riga 37 POKE 35899,0, scrivere GOTO 10 e rimettere in riproduzione la cassetta [12]. Ma MicroHobby avvertiva che questo funzionava solo nei giochi non protetti: caricamenti turbo, a più di 2000 baud, o a colori oscillanti lo rendevano impraticabile [16].

E le protezioni erano sempre di più. Speedlock, di David Aubrey-Jones e David Looker, passò circa un anno a essere inviato agli editori senza che nessuno lo prendesse, finché la Ocean lo usò per la prima volta in Daley Thompson's Decathlon, che Crash recensì nel novembre 1984. Aubrey-Jones racconta di averlo fatto perché era sempre più stufo del tempo che richiedeva il caricamento normale [17]. Con protezioni così, copiare la cassetta con un programma di copia divenne quasi impossibile, e i caricatori dovevano essere smontati a mano [18].

Per quei giochi, le riviste pubblicavano listati di hack: programmi in BASIC, spesso con righe di DATA piene di codice macchina, che prendevano il controllo del caricamento e inserivano i POKE lungo la strada. Non era una scienza esatta: una di queste routine per Underwurlde, pubblicata su Crash, veniva a sostituirne un'altra, del numero precedente, che non funzionava [19].

Nel gennaio 1991, Your Sinclair insegnava a smontare Speedlock 1 e 2. La versione 2 aveva sei routine di decrittazione, e parte del codice verificava se c'era un Multiface collegato. Il codice sfruttava trucchi dello Z80, come il registro R e i salti che dipendono dalla parità, e cominciava di proposito con spazzatura, per farti pensare di essere all'indirizzo sbagliato [15].

Il pulsante rosso

Nel febbraio 1986, Sinclair User presentava il Multiface One, della Romantic Robot. Premendo un pulsante, copiava il programma in esecuzione su dischetto, microdrive o Wafadrive, e permetteva di vedere cosa c'era in memoria e di fare POKE per arrivare ai punteggi alti [20].

Il segreto stava nell'hardware. Il pulsante attiva l'interrupt non mascherabile dello Z80, e il Multiface prende il controllo della macchina con la sua ROM [21]. Siccome le protezioni dell'epoca agivano soprattutto durante il caricamento, o subito dopo, un gioco preso a metà era già intero e senza protezione in memoria [21].

Per barare, bastava fermare il gioco, scrivere l'indirizzo e il valore e tornare al punto in cui eri, senza MERGE né listati. Le riviste cominciarono a pubblicare POKE per Multiface tutti i mesi [21]. C'erano perfino programmi per gli 8 KB di RAM dell'apparecchio stesso, come Lifeguard, che analizzava la memoria durante il gioco per scoprire quali indirizzi cambiare [21].

Dopo il Multiface One, per lo Spectrum da 48K, vennero il Multiface 128, nell'aprile 1987, e il Multiface 3, nel novembre di quell'anno, per i modelli Amstrad che il 128 non supportava [21].

Pirati o curiosi?

Un apparecchio che copiava qualsiasi gioco con un pulsante non era innocente, e nessuno fingeva che lo fosse. La stessa Sinclair User apriva la recensione del Multiface ricordando che le macchine per le copie di sicurezza sono sempre controverse, e che questa sarebbe stata la più controversa di tutte [20].

Il confine tra trucco e pirateria era sottile. MicroHobby diceva ai lettori che il modo migliore di mettere i pokes era con un transfer [16], e tra i programmi di copia più noti c'era Trans Express, anch'esso della Romantic Robot [18]. Andrew Pennell, nel trucco di Chuckie Egg, preferì non pubblicare un caricatore suo, per non pestare i piedi a nessuno, e usò una versione modificata del caricatore del gioco stesso [8].

Anche le protezioni avevano un prezzo. Quando la Ocean adottò Speedlock, il forum dei lettori di Crash ne discusse per mesi, e ci fu chi si lamentò che i giochi caricavano peggio [17].

A volte era lo stesso editore a mandare POKE. Nel 1984, i giocatori di Jet Set Willy morivano senza sosta in vari punti dopo essere passati dalla soffitta. La Software Projects assicurò a Sinclair User che non era un errore, ma un modo deliberato di rendere più difficile la fine del gioco, e pubblicò quattro POKE per annullarlo [12]. Il disassemblaggio moderno del gioco lo tratta per quello che era, un errore, e spiega che quei POKE lo correggono, insieme ad altri problemi [7].

I POKE oggi

I POKE sono sopravvissuti nei file .POK, un formato creato per il programma SGD per applicare POKE agli snapshot prima di aprire l'emulatore. Ogni trucco comincia con una riga N, con il nome; le righe M e Z contengono i POKE, dove Z è l'ultimo, con il banco di memoria, l'indirizzo, il valore nuovo e il valore originale, per poterlo annullare; un valore di 256 significa che il programma ti chiede il numero; e una Y chiude il file [22].

Nel file di Manic Miner conservato nello ZXDB, la riga delle vite infinite è Z 8 35136 0 53 [23]. L'8 significa che il banco si ignora, come in tutti i giochi da 48K, lo 0 è il valore nuovo e il 53 l'originale [22]: lo stesso DEC (HL) che il disassemblaggio trova a quell'indirizzo [3][2].

Lo ZXDB, la banca dati creata da Einar Saukas che alimenta Spectrum Computing, associa a ogni gioco il suo file di POKE e la lista degli articoli di rivista in cui è apparso, con collegamento alle pagine digitalizzate [23]. The Tipshop raccoglie i trucchi pubblicati nelle riviste, con l'indicazione del numero e della pagina da cui provengono [5].

Gli emulatori fanno il resto. Fuse cerca da solo un GAME.POK quando apri il GAME.TAP, e ha un cercatore di POKE simile al Lifeguard del Multiface: cerchi il numero di vite che hai, ne perdi una, cerchi il nuovo numero, e presto resta un solo indirizzo. Nell'esempio del manuale di Fuse, l'istruzione che scala la vita viene poi sostituita da un NOP [24], esattamente ciò che fa il POKE 35136,0 in Manic Miner.

Prova tu

Non ti serve un gioco per provare. Tra gli indirizzi 23552 e 23733 ci sono le variabili di sistema, che conservano lo stato dello Spectrum stesso. Il manuale dice che puoi sbirciarle con PEEK e che alcune si possono cambiare con POKE, con profitto [25].

Solo alcune. Il manuale segna con una X quelle da non toccare, perché il sistema può bloccarsi, e con una N quelle che non hanno effetto duraturo [25]. Quelle che ti proponiamo sono fuori da queste due liste e occupano un solo byte; quelle da due byte conservano prima il byte meno significativo, al contrario di quanto ci si aspetterebbe [25].

Sullo Spectrum da 48K, le parole chiave non si scrivono lettera per lettera: all'inizio della riga il cursore è in modo K, e il tasto che premi dà la parola scritta su di esso [26]. E se qualcosa va storto, non rompi nulla; basta riavviare [1].

POKE famosi

Funzionano solo sulla versione originale del gioco, caricata da cassetta; un'altra edizione può organizzare la memoria in modo diverso.

GiocoEditoreAnnoPOKEEffetto[n]
Manic MinerBug-Byte1983POKE 35136,0Vite infinite[23][5][4][13]
Jet Set WillySoftware Projects1984POKE 35899,0Vite infinite[27][28][7][12][13]
Atic AtacUltimate Play The Game1983POKE 36519,0Vite infinite[29][30][13]
Knight LoreUltimate Play The Game1984POKE 53567,0Vite infinite[31][32]
Chuckie EggA'n'F Software1983POKE 42837,0Vite infinite[33][8]
UnderwurldeUltimate Play The Game1984POKE 59375,0Vite infinite[34][19]
Head over HeelsOcean Software1987POKE 42195,0Vite infinite[35][36]
Renegade (48K)Imagine Software1987POKE 40366,0Tempo infinito[37][38]
Horace Goes SkiingSinclair Research1983POKE 29270,0Niente traffico[39][40]
Sabre WulfUltimate Play The Game1984POKE 39702,30Niente mostri[41][42]
Saboteur!Durell Software1985POKE 40004,201Niente cani[43][9]

Prova tu

Ecco uno ZX Spectrum 128 che gira nel browser. Scrivi uno di questi POKE, premi ENTER e guarda cosa cambia nella macchina; nessuno rompe nulla, e per tornare all'inizio basta riavviare.

Accendi lo Spectrum 128, scegli 128 BASIC e scrivi il comando lettera per lettera, poi ENTER. Su un vero 48K la parola POKE esce da un solo tasto, la O, e la virgola è Symbol Shift con N.

  • POKE 23609,255PIPAllunga il clic che la tastiera emette a ogni tasto, che di serie è a 0.
  • POKE 23561,10REPDELUn tasto tenuto premuto comincia a ripetersi dopo 10/50 di secondo, invece dei 35/50 di serie.
  • POKE 23562,1REPPERUna volta iniziata, la ripetizione avviene ogni 1/50 di secondo, invece di 5/50.
  • POKE 23608,255RASPAllunga il ronzio di avviso, quello che senti quando la riga è troppo lunga o la memoria è piena; il normale è 64.
  • POKE 23692,255SCR CTLo schermo smette di fermarsi a chiedere scroll? e continua a scorrere per 254 righe; per non fermarsi mai, i programmi ripetevano il POKE.
  • POKE 23693,14ATTR PCambia i colori permanenti in inchiostro giallo su carta blu (8 × 1 + 6 = 14), come PAPER 1: INK 6, e vedi l'effetto su ciò che scrivi dopo e sull'intero schermo dopo CLS.
  • POKE 23658,8FLAGS2Attiva il CAPS LOCK, che è il bit 3 di questa variabile; POKE 23658,0 lo disattiva di nuovo.

© 1982 Sinclair Research Ltd

Fonti

  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)