Commodore 128 – appunti sul BASIC 7.0 – Parte #01

In queste righe farò un excursus sulle notevoli capacità del Basic 7.0 incorporate nel Commodore128, ultimo computer ad 8-bit della Commodore uscito nel 1985.
Innanzi tutto una breve storia: il C128 era nato per sostituire il C64 e le sue capacità lasciavano presagire il meglio. Aveva infatti 3 modalità operative: C128 che usava una CPU 8502 con 128 Kbyte RAM; una modalità C64 uguale identica al C64 compatibile con tutte le sue periferiche e cartucce i classici 64Kbyte RAM; ed in più una CPU Z80 per far funzionare il C128 in modalità CP/M, il predecessore di Ms-Dos. Sia la modalità C128 che CP/M usando un monitor Commodore come il 1084 permetteva di usare una modalità ad 80 colonne con risoluzione 640×200 il che gli consentiva di fungere anche da macchina per ufficio.
Vendette svariati milioni di esemplari ma venne ben presto dismesso per due motivi principali: l’enorme successo del C64 (in quegli anni rinnovato nella veste C64C simile al C128) e al fatto che la Commodore ormai si stava impegnando a fondo nel suo primo computer a 16-bit, l’Amiga 1000 con CPU Motorola 68000 come l’Apple Macintosh e l’Atari ST.

Il C128 resta quindi l’ultima macchina 8-bit prodotta dalla Commodore. Qui ci concentreremo sulle caratteristiche uniche del BASIC 7.0: è quindi inutile concentrarci sulle capacità di base del tutto uguali a quelle del C64 ma metterò in rilievo le differenze coi BASIC degli altri 8-bit Commodore.

Comandi essenziali da disco

Per formattare un disco basta il comando HEADER “nome_disco”, id ; con uno solo non
serve. Quindi basta ad esempio HEADER “my-disk”

  • per caricare un programma basic da disco DLOAD “nome_prog”, id
  • per salvarlo DSAVE “nome_disco”, id
  • per verificare se il programma nel computer è uguale a quello scritto su disco DVERIFY “nome_prog”, id

in tutti questi comandi se non si inserisce l’id del disco si presuppone il device numero 8; se si hanno due drive si può scrivere ad esempio DLOAD “xxx”, 9

Gestione tastiera e cicli

il basic 7.0 dispone di alcuni notevoli comandi per i cicli che rappresentavano una forma iniziale di programmazione strutturata, senza ricorrere a troppi GOTO e GOSUB come nel C64.
Il primo è DO…LOOP UNTIL. Per spiegarlo bene ecco un brevissimo esempio:

10 DO: SCNCLR: INPUT”INSERISCI UN NUMERO “; A
20 LOOP WHILE A = 0
30 PRINT “HAI INSERITO ”;A

Il programma inizia il cliclo in riga 10 e chiede un numero. Ma in 20 non prosegue fino a quando
non si inserisce un numero maggiore di zero. In pratica è come il programma in BASIC 2.0
seguente:

10 INPUT”INSERISCI UN NUMERO “;A
20 IF A=0 THEN GOTO10
30 IF A > 0 THEN GOTO 50
40 END
50 PRINT “HAI INSERITO “;A

Ma cosa succede se dobbiamo inserire più diuna istruzione dopo il THEN o dopo l’ELSE? Il BASIC 7 ci porta in aiuta un altro esempio diprogrammazione strutturata, BEGIN…BEND:

10 INPUT “INSERISCI UN NUMERO “;A
20 IF A<100 THEN BEGIN:
30 PRINT “HAI INSERITO “;A
40 SLEEP 2: REM PAUSA DI 2 SECONDI
50 FOR X=1 TO A
60 PRINT “RIGA “;X;CHR$(13)
70 NEXT X
80 PRINT “TUTTO BENE”:BEND: ELSE PRINT “IL NUMERO INSERITO E’TROPPO ALTO!”
90 END

Inserisco un numero; se è 100 comincia il iclo strutturato che stampa X volte il numero inserito dopo il BEGIN. In riga 80 viene eseguito il BEND se la condizione in riga 20 non è valida e quindi non viene stampato nulla. Vediamo quindi fare un giochino: il computer pensa un numero e l’utente deve indovinarlo.

10 INPUT “COME TI CHIAMI? “;A$
20 N=INT(RND(1)+50)
30 DO: INPUT “numero “; X
40 IF X < N THEN BEGIN:
50 PRINT”IL MIO NUMERO E’ PIU’ GRANDE!”
60 T=T+1:BEND: ELSE BEGIN:
70 PRINT “IL MIO NUMERO E’ PIU’ ALTO!”
80 T=T+1: BEND:LOOP UNTIL X=N
90 PRINT “BRAVO “;A$;” HAI INDOVINATO IL MIO NUMERO!”

PRINT USING

una feature molto interessante del basic 7.0 è PRINT USING che permette di formattare cifre o numeri nella maniera voluta. Ad esempio se volessimo visualizzare 1000,35 euro useremo la seguente istruzione (mettoE per euro dato che allora quando il C128 uscì manco si sapeva cosa fosse…):

PRINT USING “#E######.##”;A

significa che la variabile A conterrà una cifra con due decimali (dopo il punto preceduto da max 6 cifre, la lettera della moneta e il # prima di E significa ch quest’ultimo dovrà essere messo prima dell’ultimo numero a sinistra. Quindi ad esempio 100,35 euro verrà scritto come E100.35 contenuto nella variabile A.

Gestione da tastiera

Col C64 per poter scegliere fra una serie di opzioni non si poteva fare a meno dell’uso di INPUT. Col Basic 7.0 c’è una funzione invece molto potente: GETKEY. Ha la sintassi GETKEY A$ dove A$ è un tasto premuto. Come si vede la riga 20 scritta in BASIC 7.0 è molto più elegante:

5 REM C=64
10 PRINT "PREMI INVIO PER CONTINUARE"
20 GET A$ : IF A$ <> CHR$(13) THEN GOTO 10
30 PRINT “ORA CONTINUO”

in Basic 7.0

10 PRINT “PREMI INVIO PER CONTINUARE”
20 DO: GETKEY A$: LOOP UNTIL A$<>CHR(13)
30 PRINT “ORA CONTINUO”

si può usare anche per scelte varie

10 PRINT “A – OPZIONE 1”
20 PRINT “B – OPZIONE 2”
30 PRINT “C – OPZIONE 3”
40 PRINT “D – OPZIONE 4”
50 DO: GETKEY A\$: LOOP UNTIL A\$>CHR$(100)
60 PRINT “HAI PREMUTO “;A$

Debug dei programmi

Il Basic 7.0 del C128 mette a disposzione un efficiente sistema di debug dei programmi, che vedremo di seguito:

HELP – visualizza la riga in cui si è verificato un errore; basta premere il tasto HELP-TRAP – localizza il cursore sul punto dell’errore, da una piegazione e continua. Di solito viene messa come prima riga di un programma:

5 TRAP 1000
10 PRINT “DIVISIONI”;CHR$(13)
20 INPUT “NUMERO 1”;A
30 INPUT “NUMERO 2”;B
40 PRINT A/B
1000 IF B = 0 END

La gestione errori viene inviata alla riga 1000 e poi vengono chiesti due numeri. Si sa (almeno spero) che la divisione per zero genera un errore “division by zero”; quindi se si tenta di usare un valore zero in B il programma viene finito…o fatelo ricominciare voi per esercizio!

TRON e TROFF

Quando si scrive un programma lungo è difficile intercettare l’errore. Se dalla linea di comando si scrive TRON (che sta per TraceON) il C128 fa vedere in che ordine esegue le righe (ad esempio un DO al posto sbagliato così come un GOTO o GOSUB senza un RETURN). Ma poiché può metterci un po’ di tempo meglio piazare TRON all’interno di una riga di programma in cui si ha il sospetto che ci sia l’errore.
L’equivalente è TROFF (TraceOFF) che disabilita la scansione del programma.

Prima lezione finita con le caratteristiche essenziali del BASIC 7.0 che useremo maggiormente. La prossima lezione tratterà qualcosa di più succoso: la gestione della grafica.

Have your say