Articolo pubblicato sul n. 31 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel giugno 1984
Commodore 64 Seconda puntata del nostro viaggio all'interno del commodore 64. In questo numero completeremo la nostra carrellata sui modi carattere del 6567 con l'extended background color mode e la possibilita' di scrolling fine, e ci occuperemo degli ambienti di grafica alta risoluzione del 64. Listati in queste pagine anche le relative routine per implementare una pagina grafica (hgr o multicolor) senza sprecare Ram basic, nonche' due applicazioni: un programma Titolatrice illustrera' un esempio di scrolling fine e il famoso MATH PACK (gia' presentato sul n. 16 per il VIC-20) permettera' anche ai 64isti di studiarsi qualche funzioncina matematica. Sempreche' ne abbiano voglia !!! L'extended background color mode Il nome sta per modo colore di fondo esteso. Grazie a questa ulteriore possibilita' offerta dal VIC ][, e' possibile, limitando a 64 il numero dei caratteri visualizzabili, scegliere fra fra 4 colori di fondo per ognuna delle 1000 locazioni di schermo. I codici dei quattro colori di fondo scelti andranno POKE-ati in opportuni registri del 6567, precisamente: 53281 col. di sfondo n. 1 53282 " " 2 53283 " " 3 53284 " " 4 Per attivare il modo carattere colore di fondo esteso bisogna eseguire un POKE 53265,PEEK(53265)OR64 per tornare ai caratteri standard POKE 53265,PEEK(53265)AND191 La limitazione del numero di caratteri visualizzabili a soli 64 (contro i 256 del modo standard o multicolor), e' dovuta al fatto che, degli 8 bit del codice schermo di ogni carattere, i primi due, i piu' significativi, non sono usati dal 6567 per selezionare il carattere nel generatore, ma per scegliere il colore di fondo da abbinare al carattere generato dai rimanenti 6 bit. E, come e' facile verificare, con 6 bit si possono selezionare solo 64 caratteri diversi (2^6=64). Se i bit 6 e 7 del codice sono una coppia di zeri, il colore di fondo usato sara' quello pokeato in 53281; se abbiamo la coppia 01, il colore e' quello di 53282. Con la coppia 10 scegliamo il colore di 53283, infine con la coppia 11, il colore di 53284. Facciamo un esempio: dopo aver attivato il modo colore di fondo esteso con la POKE sopra segnalata ed aver scelto i 4 colori da collocare nei byte 53281...53284, proviamo a schiacciare qualche tasto. Per selezionare il colore di sfondo #2 basta usare lo shift prima di qualsiasi tasto. Per i colori #3 e #4, bisogna andare in RVS ON e rispettivamente usare o non usare lo shift. Questo perche' i codici di schermo dei caratteri shiftati (ragionando in binario) iniziano tutti con 01, i reverse con 10 i reverse+shift con 11. Es.: il carattere A ha codice di schermo 1. In binario, formato 8bit: colore c a r a t t e r e 0 0 0 0 0 0 0 1 shift A e' 65 colore c a r a t t e r e 0 1 0 0 0 0 0 1 reverse A e' 129 colore c a r a t t e r e 1 0 0 0 0 0 0 1 reverse shift A e' 193 colore c a r a t t e r e 1 1 0 0 0 0 0 1
Srolling fine Come solo ben pochi altri personal, il Commodore 64 permette di eseguire lo scrolling fine di schermo (di un solo pixel per volta) nelle quattro direzioni. Si usa per far entrare "in campo" lentamente nuove informazioni mentre lentamente vecchie informazioni spariscono dalla parte opposta. Il programma Titolatrice listato in queste pagine, ne e' un esempio. Dando run vengono richieste le linee da mostrare, in sequenza, lentamente (max 100). Si da' il via battendo return all'ultima richiesta di input. Il vic 6567 svolge gran parte del lavoro, ma non tutto. Per implementere lo scrolling fine bisogna scrivere un programma opportuno, preferibilmente in linguaggio macchina, se non si desidera uno scrolling esasperatamente lento. La prima cosa da fare, e' passare al modo 38 colonne per lo scrolling orizzontale o al modo 24 righe se si desidera quello verticale. Cio' per far posto alle nuove informazioni prima dello scrolling vero e proprio. Per il movimento verticale verso l'alto, i passi sono: 1) Passare al modo 24 righe 2) Impostare il registro di scrolling verticale al valore massimo (tutto lo schermo si abbassa di 8 pixel, nascondendo sotto il bordo inferiore la 25-sima riga) 3) Riempire la riga 25 con le informazioni da mostrare 4) Variare lentamente il registro di scrolling in modo da far apparire la riga 25 e far scomparire la prima 5) Con una routine in linguaggio macchina per muovere il contenuto dello schermo di una posizione verso l'alto 6) Ritornare al passo 2
Per il movimento orizzontale l'algoritmo e' sostanzialmente lo stesso: uniche ovvie differenze sono: a) il modo da usare e' quello a 38 colonne. b) si agisce sul registro di scrolling orizzontale. c) i nuovi dati andranno posizionati sull'estrema colonna di destra o di sinistra a seconda della direzione dello scroll.
Diamo ora l'elenco delle POKE da usare: POKE 53270,PEEK(53270)AND 247 seleziona il modo 38 colonne. POKE 53270,PEEK(53270) OR 8 ritorna al modo standard 40 colonne. POKE 53265,PEEK(53265)AND 247 seleziona il modo 24 righe. POKE 53265,PEEK(53265) OR 8 ritorna al modo 25 righe.
Con X e Y compresi tra 0 e 7 tramite le due seguenti poke, si impostano i registri di scrolling orizzontale e verticale: POKE 53270,(PEEK(53270) AND 248) OR X - orizzontale POKE 53265,(PEEK(53265) AND 248) OR Y - verticale.
L'alta risoluzione Passiamo ora a descrivere i modi grafici Bit-Map del VIC ][. Come per il modo caratteri anche qui distinguiamo un modo Standard e un modo Multicolor. Tanto per cambiare, quest'ultimo, a spese della risoluzione orizzontale, che anche in questo caso risulta dimezzata, permette di usare 4 colori per ogni pixel: piu' precisamente tre colori piu' il colore di sfondo. La risoluzione massima e' di 320 X 200 pixel ed e' data dal modo bit-map standard. La griglia risulta essere composta da 64000 punti che mappati in RAM necessitano di 64000 bit (detti anche 8000 Byte). In altre parole, ogni pagina grafica mostrata su video e' l'immagine di 8000 byte di RAM. Per attivare il Bit-Mapping (sembra uno sport !!) bisogna settare (=portare a 1) il bit 5 del registro locato a 53265. cio' avviene col comando: POKE 53265,PEEK(53265) OR 32 per ritornare in ambiente testo basta resettere il medesimo bit con: POKE 53265,PEEK(53265) AND 223 Per passare al modo Multicolor, bisogna eseguire in aggiunta un: POKE 53270,PEEK(53270) OR 16 mentre per disattivare il Multicolor: POKE 53270,PEEK(53270) AND 239 L'inizio degli 8000 byte destinati ad ospitare la pagina grafica, si seleziona all'interno del banco da 16K prescelto, allo stesso modo dell'inizio della mappa carattere discusso sul numero scorso. Il comando e': POKE 53272,(PEEK(53272) AND 240) OR A sapendo che A=0 pone l'inizio a $0000 A=2 " " $0800 A=4 " " $1000 A=6 " " $1800 A=8 " " $2000 I byte della mappa grafica sono visualizzati nel seguente modo: la prima riga di schermo mostra i primi 320 byte, la seconda riga i secondi 320, e cosi' via per tutte le 25 righe di schermo. A sua volta, ogni riga, alta 8 pixel, e' composta da 40 pacchetti di 8 byte l'uno. Si dia uno sguardo alla figura 1. Di fatto, il modo Bit-Map, non e' che un'estensione del modo caratteri programmabili. E' come se ogni pacchettino di 8 byte fosse un carattere in RAM e ben 1000 caratteri diversi fossero visualizzati uno accanto all'altro, contemporaneamente, sullo schermo. Vediamo ora come e' possibile accendere, settare, punti sullo schermo, una volta definita e mostrata su video la pagina grafica. Nel caso di grafica 320 x 200, la massima, per accendere un pixel ad una determinata coordinata (X,Y), basta porre a 1 il bit corrispondente (all'interno di qualche byte), nella pagina grafica. E' necessario calcolare 2 valori: il byte da modificare e, all'interno di esso, il bit da porre a 1. Senza dilungarci ulteriormente in calcoli, riporti, divisioni intere, e resti (tantopiu' che certamente vi fidate !!), diamo qui di seguito le due formule gia' belle e fatte. Se fissiamo l'origine (0,0) in alto a sinistra, l'indirizzo del byte all'interno della mappa grafica sara' dato da: P = 320 * INT(Y/8) + 8 * INT(X/8) + Y AND 7 Il bit da settare e': B = 7 - (X AND 7) Se I e' l'indirizzo del primo byte della mappa: POKE P + I, PEEK(P + I) OR 2 ^ B accendera' il pixel alla coordinata (X,Y) con cui sono stati calcolati P e B. Utilizzando il modo multicolor, l'affare si complica un tantino. Il P calcolato precedentemente resta invariato. All'interno del byte trovato, bisogna settare due bit per ogni pixel da visualizzare, e prima di fare questo, bisogna resettarli a 00: cio' e' indispensabile se si vuole cambiare colore a un pixel gia' acceso. Per resettare due bit all'interno di un byte, si esegue un AND logico tra il byte da modificare e un'opportuna maschera di 8 bit. Supponiamo di pokeare la coppia di bit 01 nella terza e quarta posizione di un byte che contiene: 1 1 0 1 1 1 1 0 la maschera sara' 1 1 1 1 0 0 1 1 : eseguendo l' AND logico tra questi due byte otterremo: 1 1 0 1 0 0 1 0 Con un OR logico con 0 0 0 0 0 1 0 0, otterremo: 1 1 0 1 0 1 1 0 che e' appunto il byte da cui siamo partiti con la coppia 01 inserita nel posto voluto. La scelta dei colori avviene in un modo assai interessante, anche se un po' macchinoso da gestire. In alta risoluzione standard, ad ogni bit a 1 corrisponde un pixel del colore indicato nei 4 bit piu' alti del corrispondente byte in pagina testo. Ogni bit a 0, visualizza un pixel del colore indicato nei 4 bit di ordine piu' basso, sempre dello stesso byte. L a pagina grafica, risulta cosi' suddivisibile in 1000 regioni, corrispondenti alle 1000 posizioni di schermo: per ognuna di queste e' cosi' possibile scegliere il colore pixel e il colore fondo. In grafica multicolor, ad ogni coppia di bit, corrisponde un bipixel (di larghezza doppia). La coppia 00, seleziona il colore pokeato in 53281 (colore schemo). La coppia 01 seleziona il colore dato dai 4 bit di ordine piu' alto del byte corrispondente in mappa video; la coppia 10, il colore dei 4 bit di ordine piu' basso; la coppia 11 il colore indicato nella mappa colore, sempre nella locazione corrispondente alle coordinate (X,Y) del pixel. Particolari tecnici Le due routine presentate, Grafica Hgr e Grafica Mcl, provvedono rispettivamente a gestire la grafica alta risoluzione nei modi Standard e Multicolor. Le linee listate inizializzano le due grafiche. A partire dalla linea 150 in poi e' possibile posizionare il programma basic che sfrutta tale ambiente di grafica. Si assegna alla variabile X l'ascissa, ad Y l'ordinata, se si usa il multicolor, a C il colore: 0,1,2,3. GOSUB 60 settera' il pixel voluto. Anche se la risoluzione orizzontale, in multicolor, risulta dimezzata, e' stato lasciato tra 0 319 il campo di variabilita' della X, in modo da poter facilmente passare da una grafica all' altra, senza modificare i programmi ospite. Naturalmente, in multicolor, l'ascissa (ad es.) 198 e 199 individuano lo stesso pixel in campo. La mappa grafica, per non sprecare Ram basic, e' stata posta negli ultimi 8K dei 64 disponibili, a partire quindi dal byte 57344. Questa scelta, ha portato a complicare un po' la gestione della grafica, ma ha il considerevole vantaggio di non sprecare Ram utente. Per meglio comprendere il funzionamento delle due ruotine, e' bene a questo punto descrivere la gestione della memoria del Commodore 64. La Ram interna alla macchina e' di 64k byte, anche se, come tutti sanno, da basic ne sono accessibili soltanto 38. Essendo infatti il 6510 un microprocessore che indirizza al piu' 64k fra Ram e Rom, ed essendo necessaria "un po'" di Rom per il basic e per il sistema operativo e un po' di Ram per il video e le variabili di sistema, e' facile convincersi che 64k da basic sono davvero impensabili. Di fatto pero' i sessantaquattrocapparam ci stanno. Dove?? La Ram per cosi' dire "in piu'", "doppia" la Rom esistente. E' come se sotto la Rom ci sia (viva) della Ram, in qualche modo utilizzabile. Tanto per cominciare, una PEEK eseguita in una zona di memoria doppia Ram-Rom, ritorna il contenuto della Rom: una POKE nella stessa zona, di contro, resta memorizzata in Ram. A questo punto e' d'obbligo chiedersi se e' possibile leggere qualcosa da una di queste Ram. E' un po' complicato, ma e' possibile: non da basic, ma da linguaggio macchina. La locazione 1 della memoria del 64 e' una porta I/O del 6510. Settando opportunamente alcuni bit di questa cella, e' possibile manipolare l'organizzazione della memoria. Portando a 0 il bit 0 di tale registro, la Rom del basic ($A000-$BFFF) viene disattivata e contemporaneamente emerge la Ram sottostante. Facendo lo stesso con il bit 1 potremo "sganciare" il sistema operativo ($E000-$FFFF). Disattivando da linguaggio macchina la Rom del basic, non si hanno problemi di alcun tipo. E' superfluo dire che al L.M., del basic non gliene frega proprio nulla !!! Un tantino piu' delicato e' sganciare il sistema operativo. Cio' perche' ogni 60-simo di secondo, il microprocessore, anche se sta eseguendo un programma in linguaggio macchina, e' brutalmente interrotto da un interrupt e obbligato a eseguire la routine di scansione della tastiera che risiede in Rom. Se al momento dell'interrupt la Rom non c'e', succede un macello: il processore cerca di eseguire una routine che...."non c'e'" (leggi blocco totale del sistema !!).E' come togliere, di nascosto, l'acqua dalla piscina a un tuffatore accanito che continuamente si butta dal trampolino (ih! ih!). Fortunatamente si puo' raggirare l'ostacolo semplicemente avvertendo il tuffatore di non buttarsi per qualche attimo (anzi: tuffati ...... quando lo dico io !!!!). Ritornando ai nostri chip, e' possibile mascherare questo l'interrupt dando da L.M. il comando SEI (set interrupt disable), ossia rendedo il microprocessore sordo a qualsiasi richiesta di interruzione mascherabile. In definitiva, per settare un bit della Ram alternativa al sistema operativo e' necessario:
Semplice, no ? Math Pack 64 Questo programma e' gia stato presentato sul n.16 di MC in versione VIC-20. Come per molti altri programmi ancora in cantiere, si sta cercando di modificare i piu' interessanti anche per il 64. Questo, in particolare risulta essere abbastanza "preciso-spiaccicato-identico" alla versione per vic, per quel che concerne le avvertenze e le modalita' d'uso. Le modifice stanno sostanzialmente nelle routine in linguaggio macchina adoperate, e nel fatto che non bisogna spostare l'inizio della memoria Ram per fare largo alla pagina grafica, come accadeva per il vic. Il Math Pack permette lo studio di funzioni continue (o con discontinuita' eliminabile) del tipo y=f(x): funzioni reali di variabile reale. Dando Run, subito dopo la pausa di initializzazione, appare il menu (bello, vero?). E' possibile tracciare il grafico di una funzione, ricercare i punti di intersezione con l'asse X (i cosiddetti zeri); calcolare massimi e minimi relativi; il valore di y, y', y'' in un punto; approssimare l'integrale definito col metodo delle suddivisioni. Tutte le tecniche adoperate per lo studio, non hanno la pretesa di sostituire il metedo analitico-manuale-sudereccio; non c'e' da stupirsi se con funzioni particolarmente contorte (come chi le inserisce), qualche zero non venga azzeccato o qualche massimo sia scambiato per un minimo. Ritornano all'artistico menu' (c'e' voluta qualche ora per partorirlo), con l'opzione 1 si input-a la funzione da studiare. L'opzione 2 permette di impostare l'intervallo di cui e' richesto il grafico. Questa operazione e' obbligatoria e va ripetuta se si cambia funzione. La scelta 3 serve appunto per tracciare il grafico di f. Si puo' far tracciare o meno gli assi cartesiani (ammesso che la funzione li intersechi) e se si vuole, si puo' sovrapporre il grafico alla funzione precedentemente tracciata. Per far si' che la funzione tracciata occupi in altezza tutti i 200 pixel disponibili, vengono dapprima calcolati i punti di massimo e minimo assoluti (relativi all'intervallo considerato) e poi, con semplici trasformazioni lineari, ogni y e' plottata proporzionalmente nel punto giusto dello schermo. Se e' richiesto che la funzione sia sovrapposta alla precedente, come coefficienti di dilatazione o contrazione del campo sono adoperati quelli relativi alla funzione prima tracciata, per non falsare la scala. L'opzione 4 riguarda l'integrazione della funzione in memoria, nel senso di area sottesa alla curva. Per calcolare l'area, oltre all'intervallo bisogna indicare il numero di suddivisioni da effettuare. Un maggior numero significa una maggior precisione di calcolo, ma anche un tempo di computazione piu' lungo. Generalmente 100-200 suddivisioni sono piu' che sufficienti. Se da menu e' schiacciato il tasto 5, e' possibile input-are un qualsiasi valore di ascissa per conoscere in quel punto il valore della funzione, della sua derivata prima e seconda. Per tornare al menu, cancellare il video con Shift + Clr/Home e battere [RETURN]. Con l'opzioni 6 e 7 vengono ricercati massimi, minimi e gli zeri della funzione. In tutti i casi bisogna indicare l'intervallo in cui va effettuata la ricerca. Terminata questa fase, dopo l'apparizione della stringa "STOP !", con la pressione di qualsiasi tasto si torna al menu. Cio' vale anche quando si vuol passare dal modo grafico al menu. L'opzione 8 esegue esattamente il contrario: da menu si passa al grafico precedentemente tracciato. Buon divertimento ! Impaginato originale... Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui |