# Sinclair BASIC

Il Sinclair BASIC (dal nome di Sir Clive Sinclair) è un dialetto del linguaggio di programmazione BASIC utilizzato negli home computer ad 8 bit prodotti da Sinclair Research e Timex Sinclair. L'interprete del Sinclair BASIC fu sviluppato da Nine Tiles Networks Ltd..

## Storia

Sviluppato nel 1979, nacque originariamente per essere incluso nei 4 KB di ROM del Sinclair ZX80 e, a causa di questo ridotto quantitativo di memoria, risultò essere nella sua versione iniziale una implementazione incompleta del BASIC standard ANSI del 1978. Il linguaggio evolvette da questa prima versione fino a quella quasi completa integrata nei 16 KB di ROM dello ZX Spectrum, passando per una versione intermedia inserita negli 8 KB di ROM dei computer Sinclair ZX81 e Timex Sinclair 1000.

## Caratteristiche
### Operazioni matematiche e funzioni

* I numeri sono memorizzati in cinque byte in virgola mobile (4 di mantissa e 1 di esponente), con un range compreso tra ±2,9·10$^{−39}$ e ±1,7·10$^{38}$ e una precisione di 9,6 cifre decimali.
* Oltre alle quattro operazioni aritmetiche, sono disponibili: elevamento a potenza, seno, coseno, tangente, logaritmi naturali ed esponenziali, valore assoluto e intero, radice quadrata, pi greco e generatore di numeri casuali.
* I numeri binari possono essere usati direttamente nelle espressioni del BASIC grazie alla funzione BIN.
* L'utente può creare delle funzioni con il comando DEF FN, richiamabili con FN.

### Operazioni logiche

* Gli operatori “=”, “>”, “<”, “>=”, “<=” e “<>” possono essere impiegati per confrontare valori numerici o stringhe alfanumeriche.
* Sono disponibili anche le operazioni logiche AND, OR, NOT.

### Operazioni sulle stringhe

Le operazioni tra stringhe includono, oltre ai già detti confronti, la concatenazione, effettuabile con l'operatore “+”. Altre funzioni specifiche riguardanti le stringhe sono VAL (conversione da stringa a numero), VAL$, STR$ (conversione da numero a stringa) e LEN. Infine, le funzioni CHR$ e CODE convertono codici ASCII in caratteri e viceversa.

### Altre caratteristiche

* Mediante le istruzioni READ e RESTORE è possibile leggere dati statici memorizzati nel programma per mezzo dell'istruzione DATA.
* Non c'è orologio in tempo reale che però è ottenibile tramite programmazione.

### Nomi delle variabili

* Le variabili numeriche ammettono nomi alfanumerici incomincianti per lettera. Il BASIC non distingue tra maiuscole e minuscole, e gli spazi sono ignorati.
* Le variabili e le matrici di tipo stringa ammettono nomi di una lettera seguita dal simbolo “$”
* Le variabili di controllo dei cicli FOR-NEXT e le matrici numeriche ammettono infine nomi di una lettera singola.

## Nei modelli di "Spectrum"
### ZX Spectrum

Sullo ZX Spectrum c'erano 86 parole riservate al Sinclair BASIC: queste includevano comandi (ce n'erano 50), funzioni (31) ed altre parole chiave (5), inserite attraverso uno specifico sistema delle macchine Sinclair. I comandi più comuni richiedevano la pressione di un singolo tasto: ad esempio, la pressione del tasto "P" causava l'apparizione dell'intera stringa PRINT (comando). I comandi di uso meno frequente richiedevano delle sequenze di tasti più complesso: ad esempio, BEEP richiedeva la pressione dei tasti CAPS SHIFT e SYMBOL SHIFT per accedere alla modalità estesa della tastiera (gli ultimi modelli integravano il tasto EXTENDED MODE che sostituiva questa combinazione), poi si doveva tenere premuto il tasto SYMBOL SHIFT e contemporaneamente premere il tasto "Z". Le parole chiave erano indicate sulla tastiera con uno schema a colori che indicava la sequenza di tasti SHIFT che era necessaria. Normalmente i programmi non si avviano da soli dopo il caricamento ma occorre lanciarli con RUN; mentre il salvataggio può però avvenire anche in modo da impostare l'avvio automatico.
Le parole chiave (quelle sottolineate sono funzioni) erano:
    ABS, ACS, AND$^1$, ASN, AT, ATN, ATTR, BEEP, BIN, BORDER, BRIGHT$^7$, CAT$^2$, CHR$$^3$, CIRCLE, CLEAR, CLOSE#$^2$, CLS, CODE$^3$, CONTINUE, COPY, COS, DATA, DEF FN, DIM, DRAW, ERASE$^2$, EXP, FLASH$^7$, FN, FOR, FORMAT$^2$, GO SUB, GO TO, IF$^4$, IN, INK$^7$, INKEY$$^3$, INPUT, INT, INVERSE$^7$, LEN, LET$^5$, LINE, LIST, LLIST, LN, LOAD, LPRINT, MERGE, MOVE$^2$, NEW, NEXT, NOT$^1$, OPEN#$^2$, OR$^1$, OUT, OVER$^7$, PAPER$^7$, PAUSE, PEEK, PI, PLOT, POINT, POKE, PRINT, RANDOMIZE, READ, REM, RESTORE, RETURN, RND, RUN, SAVE, SCREEN$$^3$, SGN, SIN, SQR, STEP, STR$$^3$, TAB, TAN, THEN $^4$, TO, USR$^8$, VAL$^{3,6}$, VAL$$^3$, VERIFY
I comandi presenti solo sullo ZX81 e sui suoi cloni, sul TS1000 e sul Timex Sinclair 1500 erano:
    FAST, SCROLL, SLOW, UNPLOT, GOSUB, GOTO (questi ultimi sullo Spectrum erano sostituiti da GO SUB e GO TO)
Sullo ZX Spectrum ogni parola riservata era assegnata ad un carattere il cui codice era compreso fra 165 e 255 della tabella ASCII che veniva espanso utilizzando facendo riferimento ad una tavola di token residente in ROM. Come conseguenza di ciò, in un programma le parole riservate occupavano giusto 1 byte di memoria, un metodo che garantiva un ottimo risparmio di memoria rispetto ai sistemi di memorizzazione tradizionali lettera-per-lettera (un sistema utilizzato anche sui computer Commodore). L'interprete BASIC poteva, inoltre, riconoscere i comandi o le funzioni analizzando un singolo byte del listato.
Gli Spectrum della serie 128K (lo ZX Spectrum 128, +2, +3, +2A e +2B) introdussero un sistema di inserimento delle parole chiave del BASIC convenzionale, lettera-per-lettera, nonché 2 nuovi comandi nessuno dei quali presenti o riconosciuti dall'interprete BASIC dei precedenti modelli a 48K:
* PLAY (che pilotava il chip sonoro AY-3-8910 dello Spectrum 128K)
* SPECTRUM (che impostava lo Spectrum 128K in modalità compatibile Spectrum 48K)
Vi erano inoltre alcune specificità:
* Le funzioni AND, NOT e OR erano operatori logici.
* CAT, ERASE, FORMAT e MOVE erano stati inizialmente pensati per essere utilizzati con delle periferiche ma al momento del lancio dello ZX Spectrum questi comandi non erano stati ancora implementati ed il loro uso generava un errore ("Invalid Stream"). Successivamente essi furono implementati nella shadow ROM dello ZX Interface 1 ed usati per lo ZX Microdrive (la shadow ROM era indirizzata quando l'interprete BASIC trovava un errore: per questo motivo molti comandi per il Microdrive utilizzavano un carattere "*").
* I nomi delle variabili di tipo stringa dovevano essere lunghe 1 solo carattere: LET A=5, LET Apples=5 e LET A$="Hello" sono tutte dichiarazioni valide, mentre non lo è LET APPLES$="Fruit".
* A differenza di altri dialetti BASIC, il Sinclair BASIC non includeva l'operatore ELSE nella clausola IF–THEN(–ELSE). Per questo motivo il controllo 10 IF V=5 THEN GO TO 50 ELSE GO TO 100 diventava 10 IF V=5 THEN GO TO 50 20 GO TO 100
* LET è obbligatorio (es.: LET A=1 ma mai A=1), a differenza di molti altri dialetti BASIC.
* La funzione VAL non valutava solo i numeri ma anche intere espressioni. Per esempio, dato LET A$="3*3+4+COS(0)" il comando PRINT VAL(A$) restituiva 14.
* INK, PAPER, FLASH, BRIGHT, OVER e INVERSE impostavano gli attribuiti per la visualizzazione del testo e della grafica sullo schermo: potevano operare come comandi, ed in questo caso modificavano tutti i successivi output fino ad una nuova modifica delle impostazioni, oppure come parametro di PRINT, ed in questo caso la modifica era annullata al termine della sua esecuzione.
* Poteva essere avviata l'esecuzione di linguaggio macchina usando la funzione USR passandogli come valore l'indirizzo di memoria a cui iniziava il codice ed ottenendo come risultato il contenuto dell'intero registro BC (su altri computer basati sullo Z80 veniva restituito il valore del registro HL), per cui: LET A=USR 30000 iniziava l'esecuzione del codice macchina presente all'indirizzo 30000 e, dopo il suo completamento, memorizzava il valore della coppia di byte costituenti il registro BC nella variabile a, che poteva essere utilizzata dal programma chiamante.
A differenza dei dialetti BASIC per home computer derivati dal Microsoft BASIC, le funzioni LEFT$, MID$ e RIGHT$ del Sinclair BASIC accedevano alle stringhe come array: ad esempio, A$ (5 TO 10) restituiva una sottostringa contenente i caratteri di A$ compresi fra il 5° ed il 10°. Come nei moderni linguaggi di programmazione quali il Python, era possibile rimpiazzare i comandi LEFT$ e RIGHT$ semplicemente omettendo la parte sinistra o destra del parametro: per questo motivo A$ ( TO 5) è equivalente a LEFT$(A$,5).

## Timex BASIC

Il dialetto Timex BASIC, utilizzato nei compatibili Spectrum come il Timex Sinclair 2068 (ma non nel Timex Computer 2048 che utilizzava il Sinclair BASIC tradizionale) aveva le seguenti parole chiave aggiuntive:
* DELETE cancellava un intervallo di linee del programma BASIC
* FREE era una funzione che restituiva il quantitativo di memoria libera.
* ON ERR era una funzione che intercettava gli errori, utilizzata principalmente per salti condizionali ON ERR GO TO o ON ERR GO SUB.
* RESET resettava la macchina e le periferiche.
* SOUND pilotava il chip audio AY-3-8192.
* STICK leggeva la posizione del joystick interno (Timex Sinclair 2090).