Commodore BASIC

Da Wikipedia, l'enciclopedia libera.

Il Commodore BASIC, noto anche come PET BASIC, è il dialetto del linguaggio BASIC usato nella linea a 8 bit degli home computer della Commodore International, a partire dal PET del 1977 fino al C128 del 1985. Il suo nucleo era basato sul Microsoft BASIC adattato per il processore 6502. Date le sue origini, condivideva gran parte del codice con altri BASIC per 6502 del periodo, come l'Applesoft BASIC.

Storia[modifica | modifica wikitesto]

Bill Gates offrì inizialmente una licenza basata sul pagamento di una royalty di 3 dollari per ogni installazione del suo interprete ma Jack Tramiel, il capo di Commodore, rifiutò la proposta con la frase "Sono già sposato", e proponendo un accordo sulla base di un esborso unico di 25.000 dollari per una licenza perpetua ed illimitata (circolano differenti versioni sull'importo pagato, che oscilla a seconda delle fonti tra 10.000 e 30.000 dollari). Microsoft era allora una società ancora piccola ed alla ricerca perpetua di fondi, per cui Gates accettò la proposta e concesse a Commodore l'utilizzo del suo Microsoft BASIC con la licenza senza royalty[1]. Parallelamente anche la Apple era riuscita ad ottenere una licenza perpetua senza ulteriori royalty per l'AppleBASIC: entrambi si dimostrarono due pessimi affari per la piccola Microsoft date le altissime vendite che ebbero nel corso degli anni successivi i computer prodotti da Commodore ed Apple.

Versioni e caratteristiche[modifica | modifica wikitesto]

Una lista in ordine cronologico delle versioni del CBM BASIC, insieme ai computer per i quali erano state scritte e alle loro caratteristiche:

BASIC 1.0[modifica | modifica wikitesto]

  • V1.0: PET 2001 con la sua "tastiera gommosa" e il registratore di cassette (Datassette) integrato (PET originale)
    • bug: array limitati a 256 elementi
    • bug: il comando PEEK falliva per locazioni di memoria superiori a $C000
Il Commodore BASIC 2.0 su un Commodore 64

BASIC 2.0[modifica | modifica wikitesto]

  • 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,<x> e vedere il risultato...

BASIC 4.0[modifica | modifica wikitesto]

  • V4.0: serie PET/CBM 4000/8000 (e ultime versioni del PET 2001)
    • operazioni su disco: DLOAD,DSAVE,COPY,SCRATCH, etc (15 in tutto)
    • variabili di stato per gli errori su disco: DS,DS$

BASIC 4+[modifica | modifica wikitesto]

  • 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 quasi subito dal 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.

BASIC 3.5[modifica | modifica wikitesto]

La versione 3.5 su un Commodore 16
  • V3.5: C16/116, Plus/4
    • comandi grafici e sonori
    • gestione porta joystick: JOY
    • conversione esadecimale: DEC(),HEX$()
    • lettura flessibile dati DATA: RESTORE [numeroriga]
    • 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

BASIC 7.0[modifica | modifica wikitesto]

  • 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 diffuse[modifica | modifica wikitesto]

BASIC 10[modifica | modifica wikitesto]

  • V10: Commodore 65 (prototipo mai diffuso)
    • comandi grafici e video: PALETTE,GENLOCK
    • gestione mouse: MOUSE,RMOUSE
    • gestione file testuali sequenziali: TYPE
    • editazione programmi: FIND,CHANGE
    • gestione della memoria: DMA, FRE(«code>012</code»)
    • comandi non implementati: PAINT,LOCATE,SCALE,WIDTH,SET,VIEWPORT
      PASTE,CUT

Dettagli tecnici[modifica | modifica wikitesto]

  • Una caratteristica molto interessante 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 comandi 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.
  • 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 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 listato sorgente.
  • Nonostante le righe fossero numerate, l'ordine di esecuzione delle stesse non seguiva l'ordine numerico ma piuttosto l'ordine con 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 di salto, 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, ottenuta premendo contemporaneamente al tasto della lettera il tasto "SHIFT" (la versione shiftata appariva sotto forma di un simbolo grafico). Il token abbreviato era equivalente a quello completo e come tale appariva nel "listato" del programma. Siccome i listati erano salvati in memoria nella forma in cui erano inseriti, l'uso dei token al posto dei comandi scritti per estevo permetteva di ridurre la dimensione del programma memorizzato.
  • Il formato numerico nativo del Commodore BASIC, così come nel caso del suo progenitore Microsoft 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 1 byte per l'esponente e 3 per la mantissa. Questo causava problemi nelle applicazioni gestionali in quanto l'accuratezza della virgola mobile con 3 byte di mantissa è di circa 6,5 cifre decimali, e gli errori di arrotondamento erano comuni. Commodore, invece, optò per una mantissa di 4 byte, che rese il suo BASIC molto più preciso, e quindi più adatto al mondo degli affari rispetto a molti altri BASIC del periodo.
  • I nomi delle variabili erano 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 delle parole chiave 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, pur rendendo il codice meno leggibile, permette di risparmiare la (poca) memoria a disposizione ai quei tempi (la RAM necessaria per memorizzare gli spazi).

Nonostante riduca la leggibilità, questa caratteristica può rendere il codice ambiguo per il sistema:

 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

ma la tokenizzazione (ossia l'individuazione dei token da parte del sistema) riconoscerà un'unica forma, la prima nell'esempio precedente, perché vengono individuati tutti i token presenti nell'ordine della scrittura: IF, TAN, THEN e STOP (ST è una variabile riservata, ma non ha un token ed è gestita dalla routine di gestione delle variabili come un'eccezione).

Estensioni[modifica | modifica wikitesto]


Note[modifica | modifica wikitesto]

  1. ^ Affermazione di Jack Tramiel alle celebrazioni del 25º Anniversario del Commodore 64 al Computer History Museum, avvenuto il 10 dicembre 2007 [1][2]

Bibliografia[modifica | modifica wikitesto]

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-00-4 (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.


Collegamenti esterni[modifica | modifica wikitesto]