Il Commodore BASIC è il dialetto del linguaggio BASIC usato nella linea a 8 bit degli home computer della Commodore International, a partire dal PET del 1977 al C128 del 1985. Il suo nucleo era basato sul Microsoft BASIC per il processore 6502, su licenza della giovane, squattrinata Microsoft, sulla base di un accordo forfetario senza ulteriori diritti da parte di Microsoft. Date le sue origini, condivideva gran parte del codice con altri BASIC per 6502 del periodo, come l'Applesoft BASIC (che, come il CBM BASIC era sottoposto ad una licenza forfetaria con Microsoft; alla fine dei conti, un pessimo affare per MS, viste le alte vendite degli Apple ed in particolare degli home computer a 8 bit della Commodore).
Una caratteristica molto utile dell'interprete BASIC residente in ROM e del KERNAL era l'ottima implementazione dell'editor a tutto schermo, che permetteva agli utenti di inserire e modificare ordini diretti o righe di programma ovunque sullo schermo — semplicemente premendo il tasto RETURN ogni volta che il cursore si trovava su una riga contenente una istruzione BASIC valida. Ciò segnava un enorme passo avanti nelle interfacce di inserimento programmi in confronto ai BASIC presenti sugli home computer dell'epoca, che in genere utilizzavano degli editor di riga, richiamati da comandi EDIT o similari.
Versioni e caratteristiche
Una lista di versioni del CBM BASIC in ordine cronologico, insieme alle loro caratteristiche:
Versioni rilasciate
- V1.0: PET 2001 con la sua "tastiera gommosa" e il registratore di cassette (Datassette) integrato (PET originale)
- bug: arrays limitati a 256 elementi
- bug: il comando PEEK falliva per locazioni di memoria superiori a $C000
- V2.0: PET 2001 con una tastiera "vera" e ROM aggiornate; VIC-20; C64
- corretti la maggior parte degli errori della 1.0
- Easter egg del PET – inserire
WAIT 6502, e vedere il risultato...
- V4+ : serie CBM-II (Modelli B e P)
- aggiunti i comandi
DCLEAR,BANK,BLOAD,BSAVE,DISPOSE. Questi comandi verranno poi implementati tutti sul C128 (successore della serie CBM-II che fu un disastro e venne ritirata dal quasi subito mercato) tranne DISPOSE in quanto non più necessario a causa di una diversa gestione dello stack. I token dei comandi sono però diversi tra CBM-II e C128 limitando la portabilità binaria dei sorgenti.
- V3.5: C16/116, Plus/4
- comandi grafici e sonori
- gestione porta joystick:
JOY
- conversione esadecimale:
DEC(),HEX$()
- lettura flessibile dati
DATA: RESTORE *
- funzione di ricerca stringhe:
INSTR
- formattazione della stampa:
PRINT USING,PUDEF
- supporto all'esecuzione codice per condizioni(IF) che risultano false:
ELSE
- cicli strutturati:
DO,LOOP,WHILE,UNTIL,EXIT
- assegnazione funzioni ai tasti funzione:
KEY (anche modalità diretta)
- inserimento/editazione programmi:
AUTO,DELETE,RENUMBER
- gestione dinamica degli errori:
TRAP,RESUME,ERR$()
- istruzioni di debug (tracing):
TRON,TROFF
- Monitor di sistema :
MONITOR
- Easter egg sul C(1)16 e Plus/4 –
SYS 52650
- V7.0: C128
- ulteriori comandi grafici e sonori, inclusa la gestione degli sprite
- gestione paddle e penna ottica:
POT,PEN
- funzione di or esclusivo:
XOR
- recupero indirizzo delle variabili:
POINTER
- gestione finestre in modalità testo:
WINDOW
- istruzione di attesa temporizzata:
SLEEP
- gestione della memoria:
BANK,SWAP,FETCH,STASH
- ulteriori operazioni su disco:
BOOT,BLOAD,BSAVE,DVERIFY,DCLEAR
- regolazione della velocità della CPU:
FAST,SLOW (2 e 1 Mhz rispettivamente)
- comando non documentato:
RREG (legge i registri della CPU dopo l'esecuzione di un comando SYS)
- comandi non documentati e non funzionanti:
OFF,QUIT
- Easter egg su C128 –
SYS 32800,123,45,6
Versioni mai rilasciate
- V10 : Commodore 65 (prototipo mai rilasciato)
- comandi grafici e video:
PALETTE,GENLOCK
- gestione mouse :
MOUSE,RMOUSE
- gestione file testuali sequenziali:
TYPE
- editazione programmi:
FIND,CHANGE
- gestione della memoria:
DMA, FRE(<0>|<1>|<2>)
- comandi non implementati:
PAINT,LOCATE,SCALE,WIDTH,SET,VIEWPORT
PASTE,CUT
Dettagli tecnici
- Così come l'interprete originale del Microsoft BASIC, su cui è basato, il Commodore BASIC è estremamente lento in confronto al linguaggio macchina. Test hanno dimostrato che per copiare 16 kilobyte di memoria dalla ROM alla RAM ci vuole meno di un secondo in linguaggio macchina, ma più di 2 minuti in BASIC. Per cercare di far fronte alla lentezza dell'interprete, i programmatori cominciarono ad usare vari di trucchi per velocizzare l'esecuzione. Uno era quello di memorizzare valori interi usati frequentemente all'interno di variabili piuttosto che usarli direttamente, dal momento che interpretare il nome di una variabile portava via meno tempo rispetto all'estrapolazione del numero dal sorgente.
- Nonostante le righe fossero numerate, l'ordine di esecuzione delle stesse non seguiva l'ordine numerico, ma piuttosto ordine in cui erano immagazzinate in memoria. All'atto dell'inserimento del codice, le righe venivano automaticamente riordinate per seguire l'ordine numerico, ma andando a modificare (tramite le istruzioni POKE) la memoria in cui veniva memorizzato il programma, si poteva rovinare la numerazione, ribaltandola o anche dando la stessa numerazione a tutte le righe, senza che ciò interferisse con l'esecuzione del programma (a parte le istruzioni,come ad esempio
GOSUB che necessitano di un numero riga come parametro). La stessa caratteristica, comunque, poteva essere usata per rinumerare le righe di programma, in modo da far spazio a nuove istruzioni, nel caso si fosse utilizzato un incremento unitario tra una riga e l'altra non lasciando spazio per ulteriori linee di codice.
- I token del Commodore BASIC potevano essere abbreviati inserendo la prima lettera, seguita dalla seconda shiftata (la versione shiftata appariva sottoforma di un simbolo). Il token abbreviato era equivalente a quello completo e come tale appariva nel
LISTato del programma.
- Il formato numerico nativo, così come il suo progenitore MS BASIC, era la virgola mobile. Tutte le operazioni aritmetiche venivano eseguite usando numeri in questo formato; le operazioni tra interi implicavano la conversione degli operandi avanti e indietro dal formato a virgola mobile. Molte implementazioni di BASIC del periodo usavano un byte per l'esponente e tre per la mantissa. Questo causava problemi nelle applicazioni gestionali in quanto l'accuratezza della virgola mobile con tre byte di mantissa è di circa 6,5 cifre decimali, e gli errori di arrotondamento erano comuni. Commodore, invece, optò per una mantissa di quattro byte, che rese il loro BASIC molto più preciso e quindi più adatto al mondo degli affari di molti altri BASIC del periodo.
- Nomi delle variabili limitati a due caratteri di lunghezza: i caratteri che eccedono questo limite vengono ignorati. Questo significa che i nomi "AREA" ed "ARENA" si riferiscono alla stessa variabile "AR"
- Individuazione automatica dei token del linguaggio senza bisogno di spazi che separano i vari elementi grammaticali.
- Esempio. È possibile scrivere
10 FORK=1TO10:PRINTK;"-ESIMO CICLO":NEXTK
Usando gli spazi si otterrebbe invece:
10 FOR K=1 TO 10:PRINT K; "-ESIMO CICLO":NEXT K
Questa caratteristica, nonostante renda il codice meno leggibile, permette di risparmiare la (poca) memoria a disposizione ai quei tempi (la memoria necessaria per memorizzare gli spazi).
Oltre a ridurre la leggibilita', questa caratteristica puo' rendere il codice ambiguo:
IFSTAND64THENSTOP
contiene diverse "combinazioni" di token validi (alcune semanticamente significative ed altre no):
IF S TAN D64 THEN STOP
IF ST AND 64 THEN STOP
Estensioni
Riferimenti
BASIC 2.0:
- Angerhausen, M.; Becker, Dr. A.; English, L.; Gerits, K. (1983, 84). The Anatomy of the Commodore 64. Abacus Software (US ed.) / First Publishing Ltd. (UK ed.). ISBN 0-948015-004 (UK ed.). LA versione originale in tedesco è pubblicata da Data Becker GmbH, Düsseldorf.
BASIC 7.0:
- Jarvis, Dennis; Springer, Jim D. (1987). BASIC 7.0 Internals. Grand Rapids, Michigan: Abacus Software, Inc. ISBN 0-916439-71-2.
Linguaggi di programmazione
Commodore BASIC | Commodore BASIC | Commodore BASIC