domenica 16 agosto 2020

Giochi della rivista SUPER COMMODORE n. 3 1985 per Commodore VIC-20


Istruzioni di Caratteri giganti

Questa breve routine in linguaggio macchina espande un carattere, facendolo apparire sullo schermo quattro volte più grande rispetto alla misura normale. I caratteri giganti possono comporre titoli o essere usati per una grande varietà di altri scopi. Il programma, che presentiamo nelle due versioni per C64 e VIC 20, è compatibile con tutte le stampanti Commodore. Caratteri giganti possono servire per comporre titoli, per insegnare l'alfabeto ai bambini in programmi educativi o per molte altre cose ancora. Potreste costruire tali caratteri per mezzo dei simboli grafici disponibili sulla tastiera del vostro computer, ma per fare ciò sono necessarie molte prove e molto tempo; inoltre creare un intero alfabeto comporterebbe un grande spreco di memoria. Il modo più semplice per mostrare una lettera enorme, senza fare prove laboriose o usare molta memoria, è quello di leggere, tramite istruzioni PEEK, l'area di memoria ROM generatrice di caratteri e stampare uno spazio pieno (cioè in reverse) per ogni bit che vale 1; se invece il bit vale O, si stampa uno spazio semplice. Lo svantaggio principale di questo metodo è che ogni carattere visualizzato sarebbe otto volte più grande di uno normale, occupando un'area di ben 64 spazi, che è decisamente eccessiva: sullo schermo del VIC infatti non si riuscirebbe a stampare più di quattro lettere! Per aggirare questo problema (mantenendo comunque l'idea di leggere la ROM) possiamo tuttavia utilizzare alcuni caratteri grafici, come vedremo nel prossimo paragrafo.

I caratteri "quarto di quadrato"
Provate a battere la sequenza IKBVDCF tenendo premuto il tasto Commodore. I sette caratteri che appaiono sullo schermo, assieme allo spazio, formano metà del set grafico "quarto di quadrato"; l'altra metà si ottiene premendo gli stessi tasti in modo reverse. Abbiamo così in totale 16 caratteri, uno per ogni possibile combinazione dei quattro "quarti di quadrato" accesi o spenti. Questi simboli grafici ci permettono di costruire uno schermo a media risoluzione, meno complicato da programmare di quello ad alta risoluzione e in ogni caso più potente del sistema a bassa risoluzione illustrato precedentemente. Invece di comandare l'accensione di caratteri interi, si controllano dei grandi "pixel" (punti dello schermo), ognuno dei quali è grande un quarto di un carattere intero. In tal modo lo schermo di un VIC 20 acquista una risoluzione di 44x46 "megapunti" (ognuno dei quali è composto da 4x4=16 pixel), mentre la risoluzione di un C64 diventa 80x50. Questo è il concetto su cui è basato il programma che vi presentiamo. Il procedimento seguito consiste nel leggere la ROM dei caratteri e tradurre ogni bit in un "megapunto", stampando il corrispondente carattere grafico "quarto di quadrato". Si potrebbe farlo in BASIC, utilizzando una gran quantità di PEEK e di POKE, ma il linguaggio macchina è decisamente più veloce ed elegante. Il programma è facile da usare: dopo averlo digitato e salvato, battete RUN. Una breve routine in linguaggio macchina viene memorizzata tramite istruzioni POKE; per attivarla dovete effettuare due POKE e un comando SYS:
POKE249,0: POKE250,1: SYS828
A questo punto dovrebbe apparire una grande "A" maiuscola, larga quattro caratteri e altrettanto alta. Provate ora a premere simultaneamente Commodore e SHIFT per ottenere il set minuscolo, tornate col cursore sulla linea contenente le POKE e premete RETURN: in tal modo apparirà una grande "a" minuscola. Se poi modificate in 129 il valore memorizzato nella locazione 250, allora la lettera gigante apparirà in reverse. Una volta che avete salvato il programma, e lo avete fatto girare, battete NEW per cancellarlo (ciò non influirà sulla routine in linguaggio macchina, che è memorizzata nel buffer di cassetta). Digitate le seguenti linee:
10 MK=7:REM - PER IL VIC 20 MK=3
20 PRINT"[CLR]";
30 FORX=0TO255
40 Y=(XANDMK)-4:POKE249,Y
50 IFXANDMK THENPRINT"[4 SU]";
60 POKE250,X:SYS828
70 NEXT
Battete RUN e l'intero set di caratteri Commodore sfilerà sullo schermo. Attenzione: non potete salvare questo programmino di esempio su nastro, in quanto ogni operazione effettuata usando il registratore cancella la routine dal buffer di cassetta. La parte alta del carattere gigante compare nella posizione in cui si trova il cursore al momento in cui viene eseguito il comando SYS, il valore memorizzato tramite POKE nella locazione 249 determina di quanti spazi deve avanzare il cursore prima della stampa. Questo numero deve essere compreso tra 0 e 17 con il VIC oppure tra O e 35 con il C64. Il numero che dovete poi memorizzare nella locazione 250 è invece il codice di schermo (non il codice ASCII!) del carattere che volete stampare. I valori tra 1 e 26 sono le lettere A-Z, da 48 a 57 abbiamo le cifre 0-9, e gli altri valori inferiori a 128 corrispondono ai rimanenti simboli sulla tastiera. Da 128 a 255 ci sono gli stessi caratteri in reverse; ad esempio, se volete una S dovete usare il codice 19, mentre per ottenere la S in reverse bisogna usare il codice 19+128=147. Dopo aver effettuato le POKE nelle locazioni 249 e 250 digitate SYS 828 e il carattere gigante apparirà istantaneamente.

Tre vantaggi e un inconveniente
Il programma in linguaggio macchina fa apparire sullo schermo gli appropriati caratteri "quarto di quadrato", usando la routine PRINT (indirizzo $FFD2) del sistema operativo Kernal e non memorizzando direttamente i caratteri nella mappa di schermo. Con questo metodo è necessario commutare più volte tra REVERSE ON e REVERSE OFF durante la stampa, e ciò rende l'operazione piuttosto laboriosa. Tuttavia ci sono dei grossi vantaggi usando la routine in $FFD2: vediamoli. Il primo consiste nel fatto che la versione per il VIC 20 non deve tener conto di quali espansioni di memoria siano eventualmente connesse. Se invece utilizzassimo la mappa di schermo, andremmo incontro a grossi problemi, poiché essa viene rilocata usando alcune espansioni. Un altro vantaggio è che i caratteri giganti possono essere inviati ad una qualsiasi stampante Commodore, effettuando solo un piccolo cambiamento nel programma che memorizza la routine (vedi la linea 951 nel programma del C64 e la linea 923 in quello del VIC); questo cambiamento consiste nel sostituire un valore in un'istruzione DATA, in modo tale che per posizionare la lettera gigante vengano stampati degli spazi anziché dei cursori a destra. Per azionare la stampante digitate
OPEN4,4: CMD4: POKE249,xx: POKE250,yy: SYS828
Ricordatevi di sostituire a xx la posizione in cui volete che avvenga la stampa e a yy il codice di schermo. Se potete, regolate a zero la spaziatura tra le righe della stampante, in modo che non ci sia spazio tra i caratteri grafici che compongono la lettera gigante. Quando avete finito di stampare usate le istruzioni PRINT#4:CLOSE4 per chiudere correttamente il canale con la stampante. Sfortunatamente le stampanti non consentono movimenti di cursore verso l'alto, per cui è possibile stampare un solo carattere gigante per riga. Per aggirare questa limitazione potreste muovere manualmente la carta all'indietro, oppure usare un programma che stampi su carta una copia del contenuto dello schermo. Il terzo vantaggio è dato dalla flessibilità della routine PRINT del Kernal: potete stampare lettere giganti in qualsiasi punto dello schermo e con qualsiasi colore (semplicemente modificando il colore del cursore). È infine possibile anche mescolare caratteri maiuscoli, minuscoli e simboli grafici nella medesima schermata. L'unico piccolo inconveniente è che ogni riga termina con un carattere CR (a capo), e a causa di ciò non è possibile stampare una lettera gigante all'estremità destra dello schermo.

Come funziona
Il programma BASIC comprende due cicli di istruzioni POKE. Il primo memorizza nelle locazioni 688-703 i codici ASCII modificati dei caratteri grafici "quarto di quadrato". I valori sono modificati perché contengono un flag (il bit 6) che, se vale 1, segnala che il carattere deve comparire in reverse; infatti il codice ASCII (a differenza di quello di schermo) non distingue tra i caratteri normali e quelli in reverse. Prima di stampare il carattere il bit 6 viene posto a zero effettuando un AND del codice con $BF (191). Il secondo ciclo memorizza la routine in linguaggio macchina nell'area che inizia dalla locazione 828 (quindi nel buffer di cassetta). La routine è scritta in modo da poter essere rilocata: se avete bisogno del buffer per un altro programma in linguaggio macchina, oppure se avete la necessità di usare il registratore, allora potete memorizzare la routine in qualsiasi altra zona di RAM (il primo ciclo non può però essere spostato). Se usate la memoria BASIC, fate attenzione a proteggere la routine contro une eventuale cancellazione da parte dei programmi BASIC. Per chi si interessa di linguaggio macchina diamo una breve spiegazione del funzionamento della routine. Innanzitutto viene stabilito quale set di caratteri si usa (maiuscolo/grafico oppure minuscolo/maiuscolo), modificando di conseguenza un puntatore in pagina zero. Il valore del codice di schermo viene quindi moltiplicato per 8 e addizionato al puntatore, ottenendo l'indirizzo relativo al carattere desiderato. A questo punto i byte della ROM-caratteri vengono letti due per volta; effettuando alternativamente degli shift a sinistra dei byte (ASL) e delle rotazioni a sinistra dell'accumulatore (ROL), viene generato un numero compreso tra 0 e 15, che serve ad indicare (puntando all'elemento appropriato della tavola 688-703) quale dei 16 caratteri "quarto di quadrato") debba essere utilizzato. Successivamente si testa il bit 6 (reverse si/ no) ed infine viene effettuato un JSR $FFD2 per stampare il carattere. La routine ricomincia quindi il ciclo per ricavare i successivi bit da decodificare.


Giochi:

1) Superturbo
2) Reversi
3) Caratteri giganti
4) Deflector
5) Magic Draw
6) Print Sound

Nota: nel file immagine trovate, oltre al superturbo vero e proprio (vedi "TURBO/VIC"), anche il generatore, ossia il programma che ho digitato e che va a generare il superturbo. Non ve ne fate nulla ma l'ho aggiunto per completezza.

super_1985_3_vic20.rar

Nessun commento:

Posta un commento