# PEEK e POKE

PEEK e POKE, in informatica, sono due istruzioni utilizzate nel linguaggio di programmazione BASIC per accedere al contenuto di un particolare indirizzo di memoria.
PEEK è una funzione che restituisce il valore memorizzato nella cella di memoria specificata mentre POKE è un comando che serve per effettuare la corrispondente operazione di scrittura.

## Caratteristiche

Gli indirizzi delle locazioni delle istruzioni POKE e PEEK possono riferirsi sia a normali celle di memoria sia a registri hardware mappati in memoria della CPU ma anche di coprocessori aggiuntivi, come chip sonori o chip video. Un esempio di codice che controlla un chip tramite istruzioni POKE è il seguente, che modifica uno dei registri del MOS VIC-II del Commodore 64 per impostare il bordo dello schermo di colore nero:
Ogni home computer dell'epoca antecedente ai PC compatibili IBM aveva un proprio schema di utilizzo della memoria: i programmi dell'utente, i dati di questi, la memoria video, lo spazio per il codice del sistema operativo venivano indirizzati in differenti aree della memoria. Per questo motivo le istruzioni PEEK e POKE non erano portabili da un modello all'altro ed i programmi funzionavano solo sui sistemi per cui erano stati scritti.

## Sintassi

Le istruzioni possono essere chiamate sia in modalità diretta, inserendole al prompt dell'interprete, sia in modalità indiretta, ossia all'interno di un programma. In entrambi i casi la loro sintassi è la seguente:
I parametri indirizzo_di_memoria e valore possono essere anche espressioni complesse basta che il loro risultato sia un indirizzo di memoria o un valore valido. Un indirizzo valido è un indirizzo che ricade nello spazio di indirizzi della CPU del computer, ossia l'insieme degli indirizzi che la CPU è in grado di gestire direttamente. Un valore valido è un valore che può essere memorizzato in una cella di memoria, ossia la più piccola unità di memorizzazione ammessa dal tipo di memoria usato.
Ad esempio, un tipico home computer dei primi anni ottanta era generalmente basato su CPU ad 8 bit come lo Zilog Z80 o il MOS 6502. Questi processori avevano in genere uno spazio di indirizzi a 16 bit con il quale potevano indirizzare un massimo di 64 Kilobyte di memoria, sia essa RAM o ROM: l'unità di queste memorie è il byte. In questo caso l'intervallo di valori ammessi per indirizzo_di_memoria spazia da 0 a 65.535 (2$^{16}$-1) mentre valore può spaziare da 0 a 255 (2$^8$-1).

## Utilizzo nei videogiochi

Negli home computer ad 8 bit il più comune metodo di avvio dei videogiochi era quello di caricare gli stessi in memoria da una cassetta e poi di lanciarli. Si diffuse perciò la pratica di modificare il codice del gioco prima del suo avvio in modo da poter ottenere dei vantaggi quali vite infinite, invisibilità, immunità ed altro. Tali trucchi venivano generalmente ottenuti ricorrendo alla modifica di particolari locazioni di memoria del codice del gioco mediante l'utilizzo del comando POKE. Esistevano anche delle cartucce per i Commodore 64, gli ZX Spectrum e gli Amstrad CPC che permettevano di "congelare" il gioco in esecuzione, modificare il codice e riprenderne l'esecuzione.
Ad esempio, in Knight Lore per lo ZX Spectrum l'immunità poteva essere ottenuta inserendo il seguente comando:
In questo caso il valore 201 corrisponde all'istruzione in linguaggio macchina RET, che fa uscire in anticipo dalla porzione di codice che controlla le collisioni del giocatore, evitando quindi che questo possa morire. Diverse riviste del settore pubblicavano elenchi di queste POKE per i giochi, ottenute in genere mediante reverse engineering sul codice del titolo per individuare le locazioni di memoria usate per la memorizzazione di dati quali il numero di vite o il rilevamento delle collisioni.
L'uso dei trucchi basati sulle POKE è divenuto progressivamente sempre più difficile per via del nascere di sistemi di protezione dalle copie o di sistemi per impedire le modifiche del codice. I giochi per i computer moderni rendono tale pratica quasi impossibile dato che i sistemi operativi implementano degli schemi di protezione della memoria virtuale per evitare che programmi esterni possano accedere all'area di memoria assegnata ad una particolare applicazione.