Computer / Programmazione / Z80 · 26 febbraio 2019 0

LM80C: BASIC!

Il successivo, logico, passo per il mio LM80C, una volta che sono riuscito a impostare una comunicazione seriale funzioante fra il mio Z80 ed il computer remoto (rappresentato dal mio desktop), è quello (ovviamente) di provare qualcosa di utile con questo piccolo pezzo di hardware. Perciò, cos’è la cosa più utile che un computer ad 8 bit, costruito per riportare alle radici degli home computer, dovrebbe fare? Ovviamente… BASIC!! Dalla fine anni ’70 e per tutti gli anni ’80 il BASIC è stato il più usato e conosciuto linguaggio di programmazione: la sua adozione così diffusa è stata aiutata dal fatto che praticamente ogni home computer aveva un interprete BASIC integrato. Non solo, praticamente ogni interprete BASIC derivava dal BASIC di Microsoft: questo è stato l’elemento che ha aiutato la diffusione del BASIC dato che quasi tutti gli interpreti erano capaci di far girare lo stesso codice, con dei piccoli cambiamenti (dovuti ai differenti hardware per cui i software erano stati scritti).

I primi home computer non erano macchine potenti: dato che all’epoca la RAM era molto costosa, spesso più costosa della stessa CPU, queste macchine erano assemblato con piccoli quantitativi di memoria. Non era raro avere solo 1, 2 o 4 KB di RAM: i Sinclair ZX80 e ZX81 avevano solo 1 KB di memoria, e così anche il Commodore VIC-20. Le prime versioni dell’Apple II arrivarono con 4 KB che potevano essere espanse a 48 KB: impressionante, vero? Il primo BASIC che fu scritto dalla Microsoft fu l’Altair BASIC per l’Altair 8800: stava in 4 KB di RAM (e, ovviamente, necessitava di un’espansione di memoria dato che l’8800 non aveva di serie tutto quel quantitativo di RAM). Se si volevano più funzionalità si poteva acquistare una versione più sofisticata, che richiedeva l’espansione da 8 KB. Dato che le schede RAM erano molto costose, molti utenti iniziarono a scrivere i loro interpreti BASIC: uno degli interpreti più diffusi fu il Tiny BASIC, chiamato così perché era “tiny”, ossia “piccolo”. Infatti, risiedeva in 2/3 KB di RAM. La Microsoft scrisse diverse versioni del suo interprete per un sacco di macchine: il NASCOM BASIC fu scritto per i computer della NASCOM, alcune macchine basate sulla CPU Z80, e derivato dal BASIC di Microsoft con alcune migliorie. Grant Searle ha fatto un lavoro fantastico adattando questo BASIC al suo computer Z80: ha preso i sorgenti del NASCOM BASIC, li ha modificati per poterli compilare con un assembler moderno ed ha eliminato alcune caratteristiche inutile. Il risultato è un interprete che risiede in meno di 8 KB di ROM: in questo calcolo è incluso il codice di inizializzazione, che imposta l’hardware del suo computer. Io ho preso questi codici e li ho adattati per girare sul mio hardware, che è molto diverso da quello del computer di Grant: lui usa un Motorola 68B50 come periferica seriale, connesso ad un MAX232 per convertire i segnali da livello TTL a livello seriale. Questo perché il computer di Grant è stato costruito più di una decina d’anni fa, quando i PC avevano ancora la porta seriale. Oggigiorno, l’USB ha soppiantato la vecchia interfaccia RS232 perciò ho adottato un più moderno module FT232 per convertire i segnali seriali in qualcosa che può essere gestito da una porta USB. Ho, inoltre, deciso di optare per lo Z80 SIO dato che questa periferica può gestire i segnali della catena di interrupt dei chip della famiglia Z80.

Dopo aver scritto il codice nella EEPROM e collegato il modulo FT232, ho aperto il canale seriale dell’LM80C e sono stato eccitatissimo quando ho visto sul terminale che il computer mi stava chiedendo di scegliere fra un avvio a caldo o a freddo! Un avvio a caldo tiene in RAM il precedente programma che l’utente ha inserito nel sistema mentre un avvio a freddo è come uno spegnimento/riaccensione: il sistema dimentica cosa c’era nella sua memoria ed imposta l’ambiente per un riavvio pulito.

Il BASIC di NASCOM è un interprete molto interessante: in meno di 8 KB risiedono un sacco di comandi diversi. Quelli che seguono solo quelli integrati nella nostra versione:

SGN, INT, ABS, USR, FRE, INP, POS, SQR, RND, LOG, EXP, COS, SIN, TAN, ATN, PEEK, DEEK, LEN, STR$, VAL, ASC, CHR$, LEFT$, RIGHT$, MID$, END, FOR, NEXT, DATA, INPUT, DIM, READ, LET, GOTO, RUN, IF, RESTORE, GOSUB, RETURN, REM, STOP, OUT, ON, NULL, WAIT, DEF, POKE, DOKE, LINES, CLS, WIDTH, MONITOR, PRINT, CONT, LIST, CLEAR, NEW, TAB, TO, FN, SPC, THEN, NOT, STEP, +, -, *, /, ^, AND, OR, >, <, =

Se ne volete sapere di più vi consiglio la lettura del manuale del BASIC di NASCOM. Tenete bene a mente che questo BASIC gestisce ogni numero come un intero CON SEGNO nell’intervallo -32.768 / +32.767, in ogni parte di esso, funzioni incluse. Perciò ogni numero più grande di 32.767 apparirà come un numero negativo, ed ogni numero passato ad esempio ad una funzione come POKE o similare deve essere nel formato del complemento a 2. Una veloce conversioni la si può ottenere semplicemente sottraendo il numero desiderato da 65.536: ad esempio, per puntare alla cella di RAM con indirizzo 49.152 dobbiamo inserire: 49.152-65.536= -16.384.

Nel mio repository troverete 2 file: bootloader.asm e bas32k.asm. Sono richiesti entrambi, perché il primo è il codice del bootloader che imposta la comunicazione seriale fra il computer ed il sistema remoto e poi chiede che tipo di avvio si desidera. Il secondo è proprio l’interprete BASIC: dopo l’avvio, chiede il valore più alto della RAM da usarsi per l’interprete. Potete premere INVIO se volete che l’interprete utilizzi tutta la memoria libera. Dopo alcuni attimi verrà mostrato il quantitativo di memoria libera ed il nostro LM80C sarà pronto per accettare ed eseguire i comandi:

LM80C: BASIC

LM80C: BASIC

Dato che il codice è stato diviso in 2 file dovete fare 2 scritture per scrivere il codice nella EEPROM: bootloader.asm, una volta compilato, va scritto a partire dalla locazione $0000 mentre bas32k.asm al momento va scritto dalla posizione $01B0. Questo valore può cambiare in futuro dato che la dimensione del bootloader può variare a causa di modifiche al codice, perciò prima di scrivere il BASIC controllate la cella di inizio attuale nel file asm.

Ecco un video del BASIC in azione:

Il codice sarà disponibile a breve sul mio repository su GitHub.