Articolo pubblicato sul n. 60 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel febbraio 1987

MCmicrocomputer


Commodore 128:
Grafica 640 x 200

(prima parte)

di Andrea de Prisco

Dedicheremo alcuni articoli di 128 da zero a un bit del Commodore 128. Precisamente al bit 7 del registro 25 del video display chip 8563 che permette di selezionare il modo grafico 640x200, altrimenti non disponibile.Copertina del numero di MCmicrocomputer contenente l'articolo

 

Il vizietto

 

Mamma Commodore certamente non è nuova per queste cose: poteva mai fare un computer completo di tutto?

 A dire il vero una volta, col Plus 4 un tentativo l'aveva fatto: è stato un vero fallimento, solo pochi esemplari venduti prima di uscire rapidamente di produzione. Sarà forse perché l'utente medio di computer Commodore è smanettomane per antonomasia (eccezion fatta per quelli che comprano il 64 solo per giocare). E a dire il vero, a "noi" smanettomani, i computer chiusi, non aperti cioè a nuove esperienze hard e soft, fanno un po' schifo. Il 128 non fa eccezione: grafica 640x200 solo se sei in grado di farla saltare fuori. Il bello è... senza che il costruttore di dica come fare (su quel maledetto "manuale" fornito con la macchina).

Fortunatamente un po' di documentazione non ufficiale siamo riusciti a trovarla (naturalmente oltre oceano) e il modo grafico ad altissima risoluzione salta fuori settando un opportuno bit dell'8563. Poi però bisogna fare un po' di ruotine in linguaggio macchina per pulire il video  grafico, per plottare punti, linee, rettangoli, cerchi, riempire aree, scrivere caratteri, e tanti altri eccetera-eccetera limitati solo dalla fantasia di chi programma.

Questo mese vedremo come attivare la pagina grafica, pulire il video e plottare i punti: il minimo indispensabile per fare qualche applicazione. Infine presenteremo un programma MATH PACK (sì è proprio il solito, ndr) che permette di studiare funzioni matematiche reali di variabile reale (quasi, viste le limitazioni intrinseche dei computer).

 

Grafica 640 x 200

 

Per passare al modo grafico di altissima risoluzione basta scrivere il valore $87 (decimale 135) nel registro 25 del VDC. $87 per settare il bit 7 di tale registro e scrollare la pagina video tutta a destra in modo da non mostrare quell'orribile brulichio di pixel (tavanata galattica) presente ad esempio nell'apertura di nobili programmi come Superscript e Superbase ad opera della Precision Software.

I colori disponibili in tale grafica sono 16 anche se visualizzabili solo uno alla volta, uguale per tutti i pixel in campo. A tal scopo, i 4 bit più significativi del registro 26 permettono di scegliere il colore della grafica, nel modo già visto precedentemente per i caratteri e per il colore di fondo, ovvero specificando quali componenti cromantiche (blu, rosso, verde) vogliamo e se desideriamo l'intensità doppia.

In definitiva, per selezionare la pagina grafica è sufficiente la linea basic:

 

POKE DEC("D600"),25:POKE DEC("D601"),135

 

ricordiamo che le due poke devono essere date sulla stessa linea, pena il non riconoscimento del comando, da parte dell'8563. Per tornare al modo testo (se ancora non abbiamo modificato la video ram) basta eseguire la linea:

 

POKE DEC("D600"),25:POKE DEC("D601"),71

 

Chi avrà provato ad accedere all'altissima risoluzione con le poke viste prima, avrà certamente notato lo schermo pieno di pixel accesi un po' dappertutto. Non sono buttati lì a caso, ma quello che vediamo è, sotto forma di bit, tutto il contenuto della video ram, compreso il generatore dei caratteri, la pagina testo e la pagina colore.

Perché mi dice ciò? Risposta: per il semplice fatto che ripulendo la pagina video, ovvero resettando tutti i bit in modo da avere un campo assolutamente vergine per disegnare in alta risoluzione, perderemo anche il generatore dei caratteri che dovrà essere ricaricato se vogliamo tornare al modo testo 80 colonne.

In figura 1 è mostrato il listatino basic per ripulire la video ram: lo abbiamo riportato solo per completezza, da basic l'operazione è così lenta che viene voglia di spegnere il computer e mettersi a piangere. Ovviamente in queste pagine è presente anche la versione in linguaggio macchina (che, di contro, fa solo rattristire un po').

Per ricaricare in ram il generatore dei caratteri, ripetiamo, se per disegnare abbiamo ripulito la memoria, è disponibile una apposita routine di sistema operativo locata all'indirizzo decimale 52748 del banco 15. Ovvero, per tornare al modo testo, oltre alle  due POKE sopra indicate, sarà necessario effettuare anche:

 

SYS 52748

 

Se ci troviamo in linguaggio macchina, effettueremo (oltre a ripristinare il registro 25):

 

JSR $CE0C

 

essendo $CE0C esattamente 52748 in esadecimale. Semplice no?

 

La pagina grafica

 

 Dicevamo che ad ogni pixel del video ad altissima risoluzione corrisponde un bit della video ram. Nella fattispecie, se tale bit è a 1 vedremo un pixel acceso nella posizione corrispondente nello schermo, se tale è a 0 il corrispondente pixel sarà spento. Corrispondente come da figura 2: abbiamo che la prima linea di pixel è immagine dei primi 80 byte la seconda linea dei secondi e così via. Nell'ambito di ogni byte bisognerà settare il bit opportuno, tenuto conto che il bit 7 di un byte è quello alla sua estrema sinistra e il bit 0 è quello alla sua destra, come mostrato in figura 3.

Detto questo, proviamo ad accendere il pixel di coordinate (200,100). Come di consueto l'origine (0,0) è posta in alto a sinistra quindi il range di valori per la X è compreso tra 0 e 639, quello della Y tra 0 e 199.

Per il momento dimentichiamo le complicazioni indotte dall'8563 e la sua memoria indirettamente accessibile e riduciamo il problema al calcolo del byte da modificare (all'interno dei 16000 che ci necessitano) e in questo il bit da settare, in funzione del pixel cui siamo interessati (nel nostro esempio (200,100)). Dato che il nostro pixel giace sulla 101-esima linea certamente le prime 100 file di byte non saranno interessate all'accensione di tale pixel. Nell'ambito della linea 101, dato che ogni 8 pixel un byte, il byte interessato sarà dato dal dividere l'ascissa per 8: 200 diviso 8 fa 25. In tale byte (dato da 100*80+25) setteremo il bit 7-RESTO(X/8), ovvero se X/8 dà come resto 0 (il nostro caso), setteremo il bit 7, se X/8 dà come resto 1, il bit 6 e così via.

 

Le routine in L.M.

 

 In figura 4 è mostrata la "routine" in linguaggio macchina per passare al modo grafico. Essa sfrutta una routine del sistema operativo, posta a $CDCC (prendente nota) del banco 15 che permetta di mandare il valore posto nel registro A, al registro del VDC indicato nel registro X. nel caso nostro metteremo in X il valore $19 (25 in esadecimale, il registro che permette di accedere al modo grafico) e nel registro A il valore $87, come già detto. Un salto a $CDCC e la pagina grafica è servita. Da tastiera o da basic, per accedere alla routine di figura 4, che se siamo interessati la digiteremo tramite il monitor interno al 128, basterà il comando SYS 4864.

In figura 5 è mostrata la ruotine che permette di ritornare al modo testo, ovviamente perdendo il contenuto della pagina grafica. Si manda al registro $19 il valore $47 e con la subruotine del S.O. locata all'indirizzo $CE0C si riimmettono i caratteri nel generatore dei caratteri nella video ram. Prima di finire, viene ripulito il video mandando un codice ascii $93 (per gli amici "cuoricino") alla routine $FFD2 che lo "printa" sullo schermo. Da basic digiteremo, per tornare al modo caratteri 80 colonne, SYS 4871.

La routine HCLEAR di figura 6 pulisce il video grafico riempendo di 0 tutta la ram dell'integrato video. Per fare ciò si avvale dei due registri $12 e $13 per puntare il byte interessato e del registro $1F per spedire lo zero purificatore. Ricordiamo che i puntatori $12 e $13 si autoincrementano man mano che mandiamo dati tramite $1F: per questo motivo è sufficiente solo inizializzarli al primo byte e non curarci più di loro. Ciò che faremo è solo di mandare 16k zeri l'uno dopo l'altro.

Infine, in figura 7 è mostrata la routine che plotta il punto dato. Essendo molto lunga, a causa dei calcoli che bisogna compiere per trovare byte e bit cercato, non la commenteremo nei minimi dettagli. Tra le cose che desideriamo dirvi, il fatto che la routine controlla se il punto passato è o no all'interno del range plottabile, in modo da scartare richieste fuori campo. Il controllo per pixel di coordinata negativa, pun non essendo necessaria, è stato messo in previsione di future espansioni della ruotine, come la possibilità di CLIP-ing di aree di video. Ritorneremo in seguito sull'argomento.

Per l'interfacciamento da BASIC o da tastiera, è necessario passare alla routine nel registro A la parte bassa dell'ascissa, nel registro X la parte alta (dato che l'ascissa può assumere valori fino a 639, maggiori quindi di 255) e nel registro Y l'ordinata del punto. In pratica, per plottare il punto di coordinate (X1,Y1) scriveremo:

 

SYS 4928,X1 AND 255,X1/256,Y1

 

essendo X1 AND 255 la parte bassa e X1/256 la parte alta di X1.

 

MATH PACK

 

Il programma listato in queste pagine, è il glorioso Math Pack che i lettori più anziani, soprattutto se precedentemente vichinghi o post-vichinghi, dovrebbero già conoscere. Ne è stata infatti già presentata versione per il glorioso VIC-20, successivamente modificata per la grafica del 64 e ora per quella del 128.

Il programma è sostanzialmente lo stesso: solo poche modifiche sono state fatte, alcune come da richiesta di lettori, altre indotte dalla particolare architettura dello strano Commodore 128. Ad esempio, non è più possibile tornare al grafico precedentemente tracciato, dato che quando visualizziamo testi ad 80 colonne, necessariamente dobbiamo cariacare nella video ram il generatore di caratteri (calpestando pezzi di disegno).

 La miglioria apportata consiste nella possibilità di sganciare l'autoscaling e selezionare così, manualmente, la porzione di piano cartesiano che desideriamo vedere. Nella precedente versione, infatti, se disegnavamo una funzione, questa era plottata in modo che il suo massimo assoluto (nell'intervallo) toccava il limite superiore dello schermo e il suo minimo quello inferiore. Se da un lato tale sistema permetteva un'agevole visualizzazione di funzioni di cui non conoscevamo l'andamento e quindi in quale parte di piano capitava, nel caso di funzioni asintotiche il tutto si risolveva in una ingiusta compressione di tutto il grafico, tanto da comprometterne la leggibilità.

Dando il RUN al programma, dopo pochi secondi appare il menu composto da 8 opzioni. L'ultima, di Quit, come è facile supporre serve per uscire dal programma.

Per inserire una funzione si seleziona l'opzione 1 e si digita una qualunque espressione in cui sia presente la variabile X. Si noti che la sintassi è quella normale del Basic quindi sono neccessarie tutte le parentesi che il basic richiede. Non scriveremo sen x ma SIN(X), asterisco per moltiplicare, freccetta in su per l'elevazione a potenza.

L'opzione 2 permette di inserire l'intervallo di ascissa di cui desideriamo il tracciamento del grafico. Tale opzione si usa quando vogliamo inserire un secondo intervallo di tracciamento: il primo è richiesto anche con l'opzione 3 che serve appunto per far tracciare il grafico. In questa è chiesto se di desiderano o meno gli assi cartesiani e se vogliamo l'auto scaling. Tulle le risposte per default sono pari a SI e per negarne una si indica chiaramente NO.

Le ultime 4 opzioni permettono rispettivamente di calcolare l'integrale definito su un intervallo, la derivata prima e seconda nonché il valore stesso della funzione in un determinato punto, la ricerca dei massimi e dei minimi e delle soluzioni reali.

Quando richiesto si dovrà inserire un intervallo e nel caso dell'integrale definito anche il numero delle suddivisioni. Valori alti (alcune centinaia) permettono un calcolo più accurato con tempi di attesa lunghi, mentre con valori bassi abbiamo esattamente il contrario: tempi di risposta veloci ma bassa precisione del risultato. Generalmente 100 dovrebbe rappresentare un buon compromesso velocità-precisione. Buon divertimento.

 


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