Articolo pubblicato sul n. 37 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel gennaio 1985

MCmicrocomputer


Commodore 64
L'ADP Basic:
P come Plotter

(terza parte)

di Andrea de Prisco

Terzo appuntamento con l'ADP Basic, il tool di istruzioni per facilitare l'uso delle periferiche del Commodore 64. Dopo aver visto l'uso col driver 1541, questo mese, giocheremo le nostre carte con il plotter 1520, sempre della Commodore. Vedremo come è possibile scrivere, disegnare, cambiare rapidamente colore penna, formato carattere, direttamente da tastiera o da programma, senza impazzire con dodicimila OPEN. Copertina del numero di MCmicrocomputer contenente l'articoloComandi semplici, come vedremo: Write per scrivere, Move per movere la penna, Draw per tracciare linee.

20 comandi Plotter-oriented

D'ora in poi, chi ha un plotter 1520 potrà comunicare con questo tramite 20 nuove istruzioni Basic. Prima di spiegare dettagliatamente la loro implementazione a livello interprete, diamo la sintassi corretta per ognuna. Si suppone che chi legge sappia come normalmente funziona un plotter Commodore.

Il primo comando è PL e a seconda di cosa precede, ha 5 diversi significati:

1) PL ON : predispone il plotter come normale periferica di output. Corrisponde a un OPEN€£4,6 seguito da CMD€£4. Dopo tale comando, qualsiasi PRINT sarà dirottata su periferica.

2) PL OFF : riabilita il video quale periferica di output. Si usa per disattivare lo stato PL ON.

3) PL RESET : resetta il plotter, provocando il self test delle quattro penne colorate. Altri comandi inviati durante il reset vengono ignorati.

4) PL SMALL : predispone la scrittura con lettere minuscole normalmente e maiuscole se precedute da SHIFT. Se dato dopo PL ON, forza un PL OFF automaticamente (il video torna periferica di output)

5) PL CAP : predispone la scrittura con lettere maiuscole normalmente e minuscole se precedute da SHIFT. Valgono le stesse considerazioni di PL SMALL.

La veste un po' strana di questo comando (un prefisso, PL, e 5 diversi suffissi) è stata data per uniformare il funzionamento con i comandi per stampante che vedremo sul prossimo numero. Avremo anche lì PR ON, PR OFF, PR RESET, PR SMALL e PR CAP, con analogo significato. Ricordarsi di usare PL ON solo dopo aver scelto le varie opzioni di stampa (colore penna, dimensione carattere, rotazione), come vedremo più avanti.

Per stampare direttamente una o più linee, senza cambiare periferica di output, è disponibile il comando WRITE. La sua sintassi è identica a quella del comando PRINT del Basic Standard del Commodore 64. Ad esempio, potremmo scrivere:

WRITE "TOTALE = ";C1;" PUNTEGGIO = ";C2

o qualsiasi altra combinazione di stringhe e valori numerici.

Per cambiare il formato dei caratteri, è disponibile il comando SIZE, seguito da 10,20,40 o 80 a seconda del numero di caratteri per linea da stampare. Un parametro specificato diverso da quelli sopra elencati, genera il messaggio di errore ILLEGAL QUANTITY. Ad esempio, per passare al modo 80 colonne è sufficiente digitare:

SIZE 80

Il comando ROTATE serve per attivare la scrittura di caratteri orizzontali (per tabulazioni lungo il senso di scorrimento della carta). Più precisamente:

ROTATE ON : ruota i caratteri di novanta gradi in senzo orario.

ROTATE OFF : seleziona il modo caratteri verticali (modo standard)

Per cambiare colore penna si può procedere in due distinti modi: scrivendo direttamente (in inglese) il colore o con il comando COLOR che accetta come parametro un intero. Riassumendo:

+------+------------+----------------+

!colore!com. diretto!com. parametrico!

+------+------------+----------------+

!nero  !   BLACK    !     COLOR 0    !

!blu   !   BLUE     !     COLOR 1    !

!verde !   GREEN    !     COLOR 2    !

!rosso !   RED      !     COLOR 3    !

+------+------------+----------------+

indicando come parametro del comando COLOR un numero maggiore di 3, sarà interpretato Modulo 4 (il resto della divisione con 4). Per intenderci: COLOR 4 sarà di nuovo nero, COLOR 5 blu, COLOR 6 verde e così via.

E per quanto riguarda il Text Mode abbiamo finito: passiamo ad illustrare le istruzioni grafiche.

MOVE <Ascissa>,<Ordinata>

permette di spostare la testina di scrittura con la penna staccata dal foglio. Ascissa e Ordinata possono essere numeri, espressioni numeriche, variabili. Il plotter stesso ignora spostamenti oltre la cosiddetta Plottabe-Area, come ben spiegato sul manuale di istruzione dello stesso a pag. 16.

DRAW <Ascissa>,<Oridinata>

muove la testina di scrittura mantenendo appoggiata sul foglio la penna. In altre parole traccia linee dalla attuale posizione sino alla posizione specificata. Facciamo un esempio: disegnamo un bel quadrato al centro del foglio.

10 MOVE 120,0

20 DRAW 120,240

30 DRAW 360,240

40 DRAW 360,0

20 DRAW 120,0

Il comando HOME serve per riportare la penna nel punto di coordinate (0,0) detto di origine. Se vogliamo dichiarare un punto di origine diverso (un nuovo sistema di riferimento) è disponibile il comando SET. Per tracciare linee o spostare semplicemente la testina usando il nuvo sistema di riferimento si usano rispettivamente le istruzioni RELDRAW e RELMOVE. Facciamo un esempio, ridisegnamo il quadrato di cui sopra, facendo uso di un nuovo sistema di riferimento.

10 MOVE 240,0

20 SET

30 RELMOVE 120,120

40 RELDRAW 120,-120

50 RELDRAW -120,-120

60 RELDRAW -120,120

70 RELDRAW 120,120

   alla linea 10 abbiamo spostato la penna nel punto centrale del foglio e lì abbiamo dichiarato la nuova origine (linea 20). Segue (linee 30-70) il disegno vero e proprio del quadrato, relativo al nuovo sistema di riferimento.

   L'ultima istruzione di questo mese, il comando BROKEN, permette di usare diversi tipi di tratteggio per le linee. In fig. 1 la distinta dei tipi e il relativo programma che l'ha generata.

Due istruzioni nascoste (ma non troppo)

OFF e RESET dati senza alcun prefisso hanno un ben preciso significato. La prima disabilita l'ADP BASIC non rendendo più disponibili i nuovi comandi. Per rientrare in ambiente ADP è sufficiente digitare SYS 49152. RESET è più radicale: provoca un vero e proprio RESET di tutta la macchina, riinizializzando tutte le variabili interne con relativa perdita del programma BASIC mantenuto in memoria. In altre parole fate molta attenzione. Anche dopo il RESET, per riattivare l'ADP BASIC è sufficiente digitare SYS 49152.

General Remarks

I vari comandi presentati questo mese, fanno riferimento spesso e volentieri a tre subroutine listate a pag.XX.

La prima, usata dal costrutto PL ON e dal comando WRITE, apre un file di output col plotter: corrisponde semplicemente a un OPEN 60,6,0. Per non interferire con altri file aperti dall'utente, l'ADP BASIC usa sempre numeri molto alti per i propri file.

La seconda e la terza subroutine sono usate praticamente da tutti gli altri comandi, essendo di uso più generale. Sono un OPEN e un CLOSE file specificato nell' accumulatore+80, indirizzo secondario accumulatore. Ad esempio, se l'accumulatore contiene 5, una chiamata alla seconda subroutine provocherà un:

OPEN 85,6,5:CMD 85

una chiamata alla terza:

CLOSE 85

Il listato 1 implementa l'istruzione PL. La prima operazione è un salto alla CharGet Routine del sistema operativo. Questa, locata a partire dalla locazione $0073 (sì, in pagina zero, per velocizzarla al massimo), non fa altro che prelevare il byte successivo della linea che si sta eseguendo. Chiamata con JSR$0073, avanza di una posizione e preleva il byte; chiamata con JSR$0079 preleva il byte senza far avanzare il puntatore all'interno della linea.

Dunque, JSR$0079 per sapere cosa segue PL; 5 casi: ON, OFF, RESET, SMALL, CAP (tutti e 5 tokenizzati, l'intende). Altrimenti stampa Syntax Error grazie al JMP$C62B. I token dei 5 suffissi sono rispettivamente, in esaadecimale, $91, $E0, $DF, $E1 e $E2.

All'indirizzo $CA94 inizia il corpo di PL€£ON: l'unica operazione compiuta è un salto alla subroutine 1, la specifica output del canale aperto e un salto brutale all'istruzione DATA per continuare la normale esecuzione dello statament successivo, se c'e.

PL OFF inizia a $C9AF e semplicemente stampa un [RETURN], $0D in esadecimale e chiude canali e file aperti.

PL RESET spedisce un comando nullo al plotter dopo aver aperto un file con indirizzo secondario 7. Per fare questo (indirizzo $C96B) dopo aver inserito in A il numero 7, salta alla subroutine 2. Segue un PRINT CHR$(0) e un CLOSE tramite la subroutine 3.

PL SMALL, indirizzo $C9CC, analogamente apre un file con indirizzo secondario 6 e spara al device il codice $31 corrispondente al carattere "1".

PL CAP, indirizzo $C9CB, fa lo stesso, spedendo il codice ascii di "0".

Il listato 2 implementa l'istruzione HOME: per realizzarla, apre un file di indirizzo secondario 1 e spedisce una "H" (codice $48) al plotter.

Il listato 3 implementa SET sfruttando, per risparmiare byte, parte dell'istruzione HOME. Apre lo stesso file e dopo aver posto in A il codice ascii di "I" salta nel corpo di HOME che provvede a spedire A e a chiudere canale e file aperto.

  Il comando MOVE (listato 4) usa la subroutine 4. Questa non fa altro che spedire al plotter i valori posti dopo il comando (le coordinate). Più precisamente, apre un file di indirizzo secondario 1, spedisce una "M" (codice $4D), salta alla subroutine 4, chiude canale e file aperto.

Il comando DRAW (listato 5), analogamente, apre lo stesso file, spedisce una "D" e salta nel corpo di MOVE per inviare al plotter le coordinate.

Il listato 6 implementa il comando REL, che come visto può essere seguito solo da DRAW o da MOVE. Come per il comando PL, la prima operazione preleva il byte dopo REL. Confronta questo con i token di MOVE e DRAW ($E6 e $E7) e stampa SYNTAX ERROR se trova qualcosa di diverso. Il JSR$0073 di $CA2E serve per posizionare il puntatore al byte della linea eseguita, in corrispondenza del primo parametro. Apre un file di indirizzo secondario 1 e a seconda della presenza di MOVE o DRAW dopo REL, spedisce al plotter rispettivamente una "R" o una "J" prima di cedere il controllo a MOVE che invierà i parametri.

  Il listato 7 implementa l'istruzione COLOR: apre un file di indirizzo secondario 2 e spedisce al plotter un carattere compreso tra "0" e "3". Per fare questo, si avvale della routine del sistema operativo locata a partire dall'indirizzo $B79E: preleva dalla linea che si sta eseguendo il parametro (valutando eventualmente un'espressione) e lo pone in X. Segue una opportuna mascherazione per risalire al codice ascii del parametro (riportato all'intervallo 0...3 grazie a AND€£#$03). Dopo aver inviato il carattere così ottenuto al plotter, chiude canale e file aperto.

I listati 8, 9, 10 e 11 implementano rispettivamente i comandi BLACK, BLUE, GREEN, RED spedendo al plotter i caratteri "0", "1", "2" o "3" sempre dopo aver aperto un file di indirizzo secondario 2.

Il comando SIZE, implementato dal listato 12, per prima cosa controlla la regolarità del parametro passato. Se questo è diverso da 10, 20, 40 o 80 un messaggio ILLEGAL QUANTITY ERROR invaderà il vostro schermo. Dal byte $CAAD in poi, una semplice routine traforma 80 in 0, 40 in 1, 20 in 2 o 10 in 3: ciò perché tale è il parametro da inviare al plotter per cambiare formato di caratteri. Segue l'invio vero e proprio, questa volta sfruttando la routine del sistema operativo $BDCD che spedisce un numero contenuto in A (parte alta) e in X (parte bassa).

ROTATE (listato 13) grazie a JSR$0079 controlla se è seguito da ON o OFF e a seconda dei due casi, dopo aver aperto un file di indirizzo secondario 4, invia al plotter un "1" o uno "0".

Il comando BROKEN, dopo aver aperto un file di indirizzo secondario 5, esegue tre routine del sistema operativo. Con la prima valuta l'espressione che segue il comando BROKEN (anche un numero è un'espressione). La seconda converte tale valore in una sequenza di codici Ascii (es. il numero 123 nella stringa "123"). La terza la invia alla periferica.

L'ultimo listato L.M. implementa il comando WRITE che, come visto, permette un output diretto su plotter. Le prime tre linee servono per definire il plotter come periferica di output. JSR$AAA0 è un salto all'interpretazione dell'istruzione PRINT del Basic standard del Commodore 64. Segue la chiusura del canale e file aperti per l'uso.


Vedi anche:


Impaginato originale...


Clicca per ingrandire... Clicca per ingrandire...
Clicca per ingrandire... Clicca per ingrandire...
Clicca per ingrandire...  

Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui