Una Chiave per il Desktop Publishing

Corso di PostScript - Marco A. Calamari

Ottava Puntata


Apriamo questa puntata a favore di chi sta cimentandosi nel debugging dei primi programmi PostScript, utilizzando i noti operatori pstack e ==, già definiti nelle prime puntate di questo corso.

Un esempio di debugging

Come ricorderete, questi operatori stampano sullo standard output (cioè sul video del terminale che utilizzate) rispettivamente una copia dei contenuti dello stack, che viene lasciato inalterato, oppure l'oggetto in cima allo stack, rimuovendolo da esso. In effetti, la rappresentazione degli oggetti PostScript che i due operatori producono è uguale (pstack usa proprio == come subroutine), ed è simile a quella che verrebbe utilizzata per definire in PostScript gli oggetti stessi; i nomi sono perciò preceduti dal carattere /, le stringhe sono racchiuse fra parentesi tonde, le procedure fra parentesi graffe, i vettori fra parentesi quadre, ed i valori numerici o booleani hanno la normale rappresentazione. Nel caso lo stack contenga oggetti di tipo non rappresentabile, questi operatori tentano di fornire comunque qualche informazione; ad esempio, nel caso di un oggetto operatore producono --operatorname--, cioè il nome dell'operatore racchiuso tra doppi trattini, nel caso di un oggetto composito come un dizionario producono la stringa -dicttype-, e nello stesso modo si comportano per oggetti che non possiedono una rappresentazione come l'oggetto tipo mark, per il quale viene prodotta la stringa -marktype-.

In molti casi si preferisce avere una rappresentazione più semplice degli oggetti; possono allora essere utili i due operatori stack e =, i quali producono (utilizzando internamente l'operatore cvs), la rappresentazione del valore degli oggetti tipo numero, stringa, valore logico, nome od operatore, e si limitano a stampare la stringa --nostringval-- in tutti gli altri casi.

Nell'utilizzo degli operatori = ed == è necessario prestare attenzione al fatto che i loro nomi non sono formati da caratteri speciali, come ad esempio [ o /, e quindi devono essere preceduti e seguiti, come tutti gli altri nomi composti da soli caratteri alfabetici, da spazi bianchi od altri caratteri delimitatori.

Merito una tirata d'orecchi per l'omissione, fino a questo momento, della definizione di un operatore indispensabile in qualunque attività di debugging, cioè quello che permette di far comparire un messaggio sullo standard output quando il programma passa in un certo punto; spero che la banalità del nome dell'operatore, che è print, abbia permesso, a coloro che ne avessero sentito il bisogno, di scoprirlo da soli. L'operatore print preleva dallo stack un oggetto, che deve essere di tipo stringa, e lo stampa sullo standard output. La stringa può essere sia definita esplicitamente che ottenuta convertendo un altro oggetto a stringa; è consigliabile che ogni operatore print sia seguito da un flush, il quale, forzando la scrittura del buffer di output, assicura che il messaggio desiderato appaia sul terminale nel momento esatto in cui viene emesso.

Un semplice esempio di debugging utilizzando l'operatore print è il seguente:

...

(\nSono passato di qui,\n) print

(\n\n) X 20 string cvs ( e X vale )

print print print flush

...

che produce a terminale, supponendo che X sia una variabile reale col valore di 3.14 al momento dell'esecuzione, la stampa

Sono passato di qui,

e X vale 3.14

La stampa di immagine digitalizzate

Le immagini grafiche che abbiamo stampate durante questo corso sono state realizzate per mezzo degli operatori PostScript in modo equivalente a quello che un artista grafico usa quando lavora con china e retini, oppure con i programmi Illustrator '88 e FreeHand; sono cioè immagini di tipo vettoriale.

La maggior parte delle immagini che vengono trattate in forma elettronica non appartengono però a questo tipo, ma a quello delle immagini digitalizzate o bitmap; esempi tipici sono le immagini ottenute da scanner o da un segnale di tipo televisivo. Una bitmap viene ottenuta dividendo l'immagine in piccole zone di uguali dimensioni, dette pixel, e registrando per ciascuna di esse il valore del tono di grigio (eventualmente solo bianco e nero), sotto forma di caratteri binari su di un opportuno supporto informatico.

Il linguaggio PostScript permette di stampare questo tipo di immagini con l'utilizzo dell'operatore image; questo operatore interpreta i codici di carattere di una stringa, e li converte in una serie di bit che descrivono i valori dei toni di grigio dei singoli pixel, iniziando dall'angolo in basso a sinistra dell'immagine.

Si noti che i caratteri che formano la stringa interpretata non si limiteranno in generale al solo set ASCII, con codici da 0 a 127, ma potranno assumere anche i valori da 128 a 255, che non hanno solitamente nessun equivalente stampabile. Questo modo di memorizzare le stringhe è molto efficiente, ma trasforma il file del programma che lo contiene da un semplice file di testo ad un file binario, che a differenza del primo non è facilmente trasportabile attraverso linee di comunicazione, e nemmeno interpretabile su tipi diversi di computer.

Per questo motivo, sacrificando la compattezza in favore della generalità e della trasportabilità, si preferisce, all'interno di programmi PostScript, memorizzare queste stringhe sotto forma di caratteri esadecimali; in questo modo un carattere (8 bit) di una bitmap viene memorizzato usando due caratteri stampabili, che appartengono sempre al subset ASCII 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Ne consegue che un file contenente una bitmap memorizzata in questo modo è lungo il doppio di quello che sarebbe necessario memorizzandola come caratteri binari.

Facciamo un esempio, e supponiamo che quattro pixel consecutivi di una bitmap, digitalizzata con 16 toni di grigio, siano

8 1 8 15

significando grigio-medio, quasi-nero, grigio-medio, bianco; espressi come codici binari essi saranno

0100 0001 0100 1111

poiché un carattere di otto bit può contenerne due, essi verrebbero memorizzati come

01000001 01001111

corrispondenti ai codici carattere

65 79

che essendo inferiori a 127 corrispondono alle lettere

A O

La memorizzazione come caratteri esadecimali avverrà invece traducendo direttamente i precedenti gruppi di 4 bit, ed esprimendo i valori con i codici esadecimali

8 1 8 F

compattati poi nella stringa 818F.

L'operatore image stampa i pixel, risultanti dal processo di conversione della stringa esadecimale, in un quadrato unitario, iniziando dall'angolo in basso a sinistra che si trova nell'origine. In questo modo, l'immagine riprodotta dall'operatore image sarà compressa in un quadrato di un punto di lato (1/72 di pollice). Prima di utilizzare image, sarà quindi necessario traslare l'origine opportunamente con l'operatore translate, e scalare gli assi con scale; il precedente sistema di coordinate dovrà poi ovviamente essere ripristinato.

L'operatore image richiede cinque argomenti, che nell'ordine sono:

  1. Larghezza della bitmap, cioè il numero di pixel per riga della bitmap, espresso come numero intero;
  2. Altezza della bitmap, cioè il numero di righe della bitmap, espresso come numero intero;
  3. Profondità della bitmap, cioè il numero di bit necessari per definire il massimo numero di toni di grigio della bitmap, espresso come numero intero da 1 (bianco/nero) a 8 (256 toni di grigio);
  4. Matrice di trasformazione della bitmap, cioè il vettore (simile alla CTM descritta nella IV puntata per lo stato grafico) che mappa la bitmap nel quadrato unitario. Per una bitmap di m righe per n colonne ed inizio in basso a sinistra questo vettore sarà [ n 0 0 m 0 0 ], mentre nel caso più frequente di inizio in alto a sinistra sarà [ n 0 0 -m 0 0 ];
  5. Procedura di ottenimento dati, cioè la procedura che l'interprete PostScript deve eseguire ogni volta che necessita di altri dati per tracciare l'immagine digitalizzata.

La procedura deve lasciare sullo stack un oggetto di tipo stringa che contenga i dati della bitmap; l'operatore image preleverà questa stringa dallo stack e la interpreterà per ottenere i pixel. Se la stringa non descrive l'immagine completa, image chiamerà nuovamente la procedura per ottenere nuovi dati, e ripeterà la chiamata fino a quando la bitmap non sarà stata completata. Un eventuale residuo della stringa al termine di ogni linea della bitmap o della bitmap stessa verrà semplicemente ignorato. La procedura è libera di usare qualunque mezzo per ottenere la stringa; può infatti semplicemente contenerla, ottenerla leggendo un file esterno, od addirittura leggendo i dati nel file stesso del programma in esecuzione.

Un esempio

Il Programma 1, che è riportato nel Listato 1, produce, una volta downloadato su una stampante PostScript, la stampa riportata in Figura 1.

Tralasciando le solite procedure iniziali di conversione di unità di misura e di stampa cornice, le parti più importanti del programma sono la procedura stampaBitmap e le inizializzazioni svolte nel programma principale. Le variabili inizializzate sono autoesplicative; si noti che si è scelto di fornire il numero di pixel che compongono orizzontalmente e verticalmente la bitmap e le dimensioni geometriche di un singolo pixel, ricavando come variabili dipendenti le dimensioni geometriche della bitmap da usare per scalare gli assi; questo è stato fatto per evidenziare che image produrrebbe una bitmap inscritta in un quadrato unitario, e che i valori per cui è necessario scalare gli assi sono proprio le dimensioni geometriche della bitmap. In realtà è più probabile che vengano fornite queste ultime ed il numero di pixel che compongono orizzontalmente e verticalmente la bitmap, e che si debbano ricavare le dimensioni del pixel come variabili dipendenti.

La procedura stampaBitmap pone ordinatamente sullo stack gli argomenti richiesti dall'operatore image, ed esegue poi quest'ultimo, provocando così la lettura dei dati posti nel programma principale e la stampa della bitmap.

Tralasciamo per un attimo il modo di funzionamento della procedura di ottenimento dati, che analizzeremo più avanti, ed esaminiamo il risultato del programma. L'immagine è stata stampata in verticale e con i pixel della grandezza da noi richiesta; se però il sistema di coordinate fosse stato precedentemente scalato e ruotato, l'immagine avrebbe risentito anche di queste modifiche, risultando di dimensioni ed orientamento corretti, ma rispetto al sistema di riferimento attivo al momento dell'esecuzione della procedura. Questo modo di funzionare dell'operatore image (e più in generale del PostScript) permette, come già evidenziato nelle precedenti puntate, di scrivere programmi di stampa bitmap che possono poi essere inseriti in programmi di stampa di documenti senza nessuna modifica.

Per coloro che sono dotati di pazienza, il Listato 2 contiene una bitmap che può essere sostituita alla parte corrispondente del Programma 1, e che produrrà un risultato a sorpresa (l'immagine originale è più grande e con i toni di grigio, ma ho avuto pietà delle vostre dita).

Gli oggetti di tipo file

La procedura che preleva i dati, passata come argomento all'operatore image, era

{currentfile StringaBitmap readhexstring pop}

e contiene due operatori che non abbiamo mai incontrato, e che sono essenziali per la comprensione del suo funzionamento.

Il secondo di essi, readhexstring, preleva dallo stack due argomenti, un oggetto di tipo file ed una stringa, legge dal file un certo numero di caratteri ASCII, che vengono interpretati come valori esadecimali, convertiti in caratteri binari, ed infine immagazzinati nella stringa passata come argomento. La stringa viene poi posta sullo stack insieme al valore logico true; se durante la lettura dei caratteri dal file viene incontrata la sua fine, sullo stack viene posta una sottostringa contenente solo i caratteri effettivamente letti, insieme al valore logico false.

Esistono altri due operatori simili che utilizzano gli stessi argomenti di readhexstring:

- l'operatore readline legge una intera linea dal file, fino al primo carattere di newline e la memorizza nella stringa;

- l'operatore readstring legge un numero di caratteri pari alla lunghezza della stringa, senza trattare in maniera particolare i caratteri speciali come newline.

L'operatore currentfile, che è il cuore della procedura, pone il file correntemente eseguito, cioè lo standard input, sullo stack degli operandi, permettendo di prelevare i caratteri che readhexstring deve leggere dallo stesso file che contiene il programma, iniziando dal carattere successivo a quello di invocazione della procedura (in questo caso la riga successiva alla chiamata di stampaBitmap).

Un momento, direte voi, la LaserWriter che sto utilizzando non possiede nessun disco, quindi non può certo avere dei file al suo interno. Giusto! Si deve però tener presente che gli oggetti di tipo file del PostScript sono generalizzazioni dei semplici file che conosciamo; per chiarire meglio il concetto è necessario fare una breve digressione.

In PostScript un oggetto di tipo file è definito come una sequenza di caratteri, terminata da un carattere di fine file; queste sequenze di caratteri possono essere memorizzate permanentemente da qualche parte (ad esempio su un file di un disco), o possono giungere attraverso uno dei canali di comunicazione di cui è dotato l'interprete PostScript. Gli oggetti di tipo file sono il mezzo tramite cui l'interprete PostScript riceve i comandi e scambia dati con l'ambiente esterno. I file PostScript possono essere di due tipi; di input e di output; esistono poi due file predefiniti, che sono interni all'interprete PostScript stesso, e che sono lo standard input e lo standard output. I caratteri che rappresentano il programma da eseguire giungono normalmente attraverso lo standard input, ed i messaggi che la stampante invia al terminale vengono scritti sullo standard output.

Esistono, in PostScript come negli altri linguaggi, tutta una serie di comandi che permettono di creare file, aprirli, chiuderli, farne la directory, cancellarli e così via. Accade però che la maggior parte delle periferiche PostScript esistenti (con eccezione di modelli molto costosi come la Apple LaserWriter NTX o la QMS 810 Turbo o delle unità di fotocomposizione) non siano dotate, per motivi di economia, di un filesystem (cioè di dischi) proprio, e quindi i relativi interpreti PostScript non possiedano questi operatori.

È questo il caso della Apple LaserWriter; la versione dell'interprete PostScript contenuto in questa stampante non possiede i comandi che gestiscono i file su disco, ma si limita ai soli file interni dell'interprete ed ai comandi che su di essi agiscono. L'utilizzo di questi operatori, dei quali abbiamo già esaminato i principali, rappresenta il solo modo che i possessori di una stampante laser non dotata di filesystem (cioè la maggior parte di noi) ha per utilizzare gli oggetti di tipo file.

Per questo motivo limiteremo il discorso agli operatori che abbiamo descritto, riservandoci di ampliarlo con la trattazione di quelli utilizzabili in presenza di un filesystem nel caso che i numero di lettori ce lo richiedessero.

Modalità di funzionamento di una periferica PostScript

Le modalità di funzionamento di una periferica PostScript sono tre; rispettivamente server, interattiva ed emulazione. La più importante è senza dubbio quella di server, in cui essa esegue ininterrottamente la stessa sequenza di operazioni:

  1. per prima cosa prepara un ambiente pulito per l'esecuzione di un nuovo programma;
  2. quindi esegue il programma interpretando i caratteri che le giungono dallo standard input, che può essere uno qualunque dei canali di cui la periferica è dotata;
  3. infine, quando viene incontrata una condizione di fine file od un errore, la periferica termina il lavoro in corso e ripete l'intera sequenza di operazioni.

La modalità interattiva è quella che viene attivata quando si esegue il comando executive; da questo momento in poi la periferica PostScript si comporta, come ben sappiamo, nello stesso modo di un personal computer che stia eseguendo l'interprete Basic. I comandi vengono scritti una linea per volta con possibilità di eseguire correzioni, ed eseguiti quando la linea viene terminata battendo RETURN. In questa modalità l'interprete PostScript deve preoccuparsi di fare l'eco dei caratteri ricevuti, fornire il prompt e controllare il cursore.

L'ultima modalità, quella di emulazione, carica sull'interprete un programma scritto in PostScript e memorizzato nelle ROM del controller, che simula il funzionamento di una particolare varietà di stampante o di plotter. Da questo momento in poi tutti i caratteri ricevuti non verranno più interpretati come operatori PostScript, ma come comandi della particolare periferica emulata. In particolari implementazioni del PostScript, la modalità di emulazione può non essere presente, oppure possono esserne previste più di una, selezionabili di solito mediante uno switch oppure via software.

Un comune tipo di emulazione, che tutte le stampanti laser a 300 punti/pollice (tipo Apple LaserWriter) possiedono, è quella Diablo 630, una stampante a margherita molto diffusa; altri tipi possono essere quello HPGL (presente ad esempio nella stampante PostScript QMS 810 Turbo), che è lo standard di comunicazione supportato dai plotter Hewlett-Packard e di molte altre marche, oppure HP-JetScript, che è il protocollo delle diffusissime stampanti laser Hewlett-Packard.

I canali di comunicazione

Una periferica PostScript, come abbiamo detto, riceve i comandi eseguendo un oggetto di tipo file; questo oggetto può essere collegato con un file reale su disco, ma più comunemente è associato ad un canale di comunicazione. I canali di comunicazione possono essere di tipi diversi;

Alcune periferiche PostScript possiedono poi canali di comunicazione dedicati al filesystem, che nella maggior parte dei casi sono canali SCSI (Small Computer System Interface). A questi canali vengono collegati i dischi che il controller utilizza per il suo filesystem.

La EEPROM ed i parametri non volatili

Le periferiche PostScript sono dotate di un notevole numero di parametri che controllano il loro funzionamento. Alcuni di questi parametri necessitano di essere permanentemente conservati; è per questo motivo che tutti i controller PostScript in commercio sono dotati di una EEPROM (Electrically Erasable Programmable Read Only Memory - Memoria a sola lettura programmabile e cancellabile elettricamente), in cui tali parametri vengono conservati a sistema non alimentato.

Il numero ed il tipo dei parametri presenti in una particolare periferica può variare; essi sono di solito elencati, insieme agli operatori da utilizzare per modificarli, in una sezione apposita del manuale d'uso della periferica.

Tutti questi parametri sono conservati ed acceduti per mezzo di uno speciale dizionario statusdict, che è separato da systemdict e da userdict, dove, come sappiamo, sono normalmente definiti rispettivamente gli operatori PostScript standard e le procedure definite dall'utente.

Per modificare uno dei parametri persistenti, è necessario utilizzare un programma PostScript che acceda statusdict esplicitamente, eseguendo i comandi statusdict begin.

Come abbiamo visto nel programma di soppressione della pagina di prova (settima puntata), per poter modificare i parametri in statusdict è necessario uscire da loop di server mediante l'apposito operatore exitserver, a cui deve essere inoltre fornito un numero intero che costituisce una password di protezione. Una volta usciti dal loop di server, e prima della successiva fine file, potranno essere eseguiti tutti gli operatori che cambiano il valore di parametri persistenti

La protezione della password è necessaria per due motivi:

- Le stampanti PostScript sono spesso installate in ambiente di rete, non è consigliabile che chiunque possa eseguire modifiche permanenti allo stato della stampante, che potrebbero compromettere il lavoro di altri;

- La EEPROM installata nel controller può essere riscritta per un numero limitato di volte (da 10.000 a 100.000); potrebbe accadere che continui cambiamenti dei parametri danneggino questo componente, rendendo quindi inutilizzabile la funzione di memorizzazione dei parametri persistenti.

Per limitare ulteriormente il numero di riscritture è consigliabile, dovendo scrivere un programma che debba modificare un parametro persistente, strutturarlo in modo da testare lo stato del parametro, ed eseguire l'operazione di scrittura solo se effettivamente necessaria.

Definiremo ora alcuni operatori che leggono o scrivono i più comuni parametri persistenti:

Si ponga particolare cautela nel modificare la password, che normalmente a macchina nuova è uguale a 0. Infatti nel caso essa venga modificata per errore o se ne dimentichi il nuovo valore, non è più possibile modificare i parametri persistenti, e si rende necessario l'intervento di un tecnico specializzato per rendere di nuovo completamente operativa la stampante.

... to be continued.

Nella prossima puntata torneremo ad occuparci di font; otterremo alcuni effetti speciali interessanti e modificheremo uno dei font residenti nella stampante.


%!PS-Adobe-2.0
%%Title: Programma di stampa di una bitmap
%%Creator: Corso PostScript - parte VIII - programma 1
%%For: Corso PostScript BIT
%%CreationDate: (4-10-1989) (15:56)
%%BoundingBox: 28 30 566 811
%%EndComments
%%EndProlog
%
% Procedura inch
% Argomenti: XInches / XPoints
% Converte misure da pollici
% a punti tipografici.
/inch { 72 mul } def
%
% Procedura tracciaCornice
% Argomenti: - / -
% Traccia una cornice su pagina
% A4 a mezzo pollice dal margine.
/tracciaCornice {
gsave newpath
0.5 inch 0.5 inch moveto
7.3 inch 0 inch rlineto
0 inch 10.5 inch rlineto
-7.3 inch 0 inch rlineto
closepath
.05 inch setlinewidth
0 setgray stroke
grestore
} def
%
% Procedura stampaBitmap
% Argomenti: - / -
% Variabili Globali:
% LarghezzaBitmap
% AltezzaBitmap
% NumeroBitBitmap
% StringaBitmap
% Procedura per la lettura e stampa di una
% bitmap con toni di grigio
/stampaBitmap {
gsave
LarghezzaBitmap
AltezzaBitmap
NumeroBitBitmap
[LarghezzaBitmap 0 0 AltezzaBitmap neg 0 AltezzaBitmap]
{currentfile StringaBitmap readhexstring pop}
image
grestore
}def
%
%
% Programma principale
%
% Incapsulamento e tracciatura della cornice
gsave
tracciaCornice
%
% Inizializzazione parametri bitmap
% (si noti che il pixel può non essere quadrato)
/LarghezzaBitmap 20 def
/AltezzaBitmap 15 def
/NumeroBitBitmap 8 def
/LarghezzaPixel 0.3 inch def
/AltezzaPixel 0.3 inch def
/StringaBitmap LarghezzaBitmap NumeroBitBitmap mul
8 div ceiling cvi string def
%
% Traslazione e scalatura assi per stampa
1.2 inch 3.5 inch translate
LarghezzaPixel LarghezzaBitmap mul
AltezzaPixel AltezzaBitmap mul
scale
%
% Esecuzione procedura; le righe seguenti alla chiamata
% della procedura stampaBitmap vengono lette dall'operatore
% readhexstring fino al completamento dei dati necessari
% alla definizione della bitmap.
stampaBitmap
0000000000000000000000000000000000000000
00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00
00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00
000000000000FFFFFFFFFF000000000000FFFF00
00FFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFF00
00DDDDDDDDDD0000FFFFFF00FFFFFFFFFFFFFF00
00BBBBBBBBBBBB0000FFFFFFFFFFFFFFFFFFFF00
00999999999999990000FFFFFFFFFFFFFFFFFF00
0077777777777777770000FFFFFFFFFFFFFFFF00
005555555555555555550000FFFFFFFFFFFFFF00
00333333333333333333330000FFFFFFFFFFFF00
0011111111111111111111110000FFFFFFFFFF00
000000000000000000000000000000FFFFFFFF00
0000000000000000000000000000000000000000
%
% Rimozione incapsulamento e stampa
grestore
showpage
%
%%Trailer
%%EOF

/LarghezzaBitmap 136 def
/AltezzaBitmap 313 def
/NumeroBitBitmap 1 def
/LarghezzaPixel 0.015 inch def
/AltezzaPixel 0.015 inch def
/StringaBitmap LarghezzaBitmap NumeroBitBitmap mul
8 div ceiling cvi string def
%
3.2 inch 3.7 inch translate
LarghezzaPixel LarghezzaBitmap mul
AltezzaPixel AltezzaBitmap mul
scale
%
stampaBitmap
0000000000000000000000000000000000
0000000000000000000000000000000000
2108000000000000044210001000000008
35A8000000000000121130000000000000
2514000200000000008010000000000144
21800000000000000A28A8800000000002
3108000000000000010412600000000121
210800020000000010A009000000000010
2108000000000000040280000000000008
21080002000000000220F6100000000045
21080000000000001111F8000000000000
23080002000000000889E7000000000040
31180000000000000440B8000000000024
23080002000000201207F0000000000001
211800000000000000BFF8000000000020
2F300004000000B40AFFF8000000000010
23580000000001EA57FFF8000000000008
23100000000002BFFF3FFC000000000001
21180004000007FFFF5FF8000000000010
22000000000007FFFE2FFD400000000008
6310000400000FFFFE0FFD000000000002
2110000000000FFFD605FC000000000000
6210000400001FFF8010FC000000000009
A210000000001FFF00307E000000000000
6200000400003FFFA0103B400000000000
2310020000003FFF8008BD800000000208
2200000000003FFFC6046EC00000000004
4210000800003FFFE542FB600000000002
2200020000003FFFC685FFD00000000000
4230000000003FFFE5C5FBE08000000208
2200000800003FFFED8BFF600000000002
4A70000000003FFFEDD7FBA04000000100
2620000800007FFFEBDBF7D02000000009
4230040000007FFFE9D7FBE80000000000
2200000800007FFFEBB7F7A00000000104
4620000000027FFFFB57FB900000000000
4220000000017FFFD7B7EA000000000008
4420000000027FFFFBAFF3000000000101
422000100001EBFFD7F7D5900000000000
44200000000067FFD0A0F7FC0000000024
442000000000E1FFD00037FC0000000200
44400010000060FFEA802BFC0000000004
442000000000E07F80081FC00000000001
554000100000503FC0006E000000000120
4CD000040000401F90005E000000000008
444000000000600C4000F8000000000001
44400000000410000403B0000000000040
48400020001048000004C0000000000004
8440000000180000000780000000000040
4880000000000400000A80000000000000
8840000000280000002A00000000000004
0000000000180000000400001080000002
0000000000100190015000048848000000
00000000000803C0040000000000000022
00000000000007C0100000000000000000
0000000000000FC0040000000000000000
0000000000000FC0100000000000000004
0000000000000FE0000000000000000000
00000040000007C0200000000000000005
91800000000007E0000000000000000000
08000000000005C0200000000000000000
9100004000000000800000000000000008
1100000000000000200000000000000000
1100200000000000800000000000000004
1200004000000001400000000000000000
3300002000000001400000000000000004
1100000000000004800000000000000000
1200000000000003400000000000000004
2200008000000005A00000000000000000
220000000000000A800000000000000000
220000000800000FE00000000000000000
2000008000000015800000000000000000
260000000000001EE00000000000000000
2000000000000A2BA00000000000000000
CC0000000000043FC80000000000000001
640001000000005FE00000000000000000
040000000000047FD40000000000000000
440000000000007FE80000000000000000
44000100000000BFF80000000000000000
44000000000000FFE80000000000000000
48000000040808FFF80000000000000000
C8000100020701FFF00000000000000000
08000000050588FFD00000000000000000
C8000000060280FFF00000000000000002
08000200070000FFE00000000000000000
88000000078100FFA00000000000000000
8000000007C4C07FE00000000000000000
9000020007F300FFA00000000000000000
9000000007FF00FFC00000003ABC000004
1000000007FFC0FF400000018003000002
1000000007FFE0FFC000000C0000C00000
9000040007FFE0FF400000300000300001
0000020007FFE1FF8000004000000C0000
2000000007FFE1FE800000804000060008
2000000007FFE1FF800002000000030000
2000040007FFE1FE800002000000118000
2000000007FFF1FF000004000000008008
0000000007FFFDFE800008002004008000
200000000FFFFFFF80001000900008C008
0000080007FFFFFE80001000A000004004
400004000FFFFFFF000020102000004002
0000000007FFFFFF800000069000084000
000000000FFFFFFE800060014000006010
000008000FFFFFFF80000004B000044004
0000000017FFFFFF000040012800104002
000000001FFFFFFF80004000000008C010
000008000FFFFFFF40004000000090C000
000000002FFFFFFF800040000001408004
000000001FFFFFFFC00020000000318020
0000100037FFFFFFA00020000004C18002
000000003FFFFFFFC00020000002E20011
000000003FFFFFFFC00010000001060100
000000003FFFFFFFE000100000040C0088
000000003FFFFFFFF00008000000180044
000000007FFFFE7FB00006000000300202
000020003FFFF81FF80001000000C00020
000000007FFFF83FD80000C00003000009
000000003FFFFA9FFC000038001C000104
000020007FFFF55FEC000007ABE0000020
000000003FFFB88FFE0000005400000008
000000003FFFBE5FFF0000000000000002
000000003FFFBC1FFF8000000000001020
000040001FFFBE5FFFC000000000000402
000000001FFFFE2FFFE000000000000010
000000000FFF3E0BFFF000000000000202
000000001FFFBE07FFFC00000000000100
000040000FFFBF03FFFE00000000000092
000000001FFFBF43FFFF80000000000000
000000000FFFBFB5FFFFC0000000000010
000040001FFFBFCFFFFFF0000000000104
000000001FFF7CA3FEFFFC000000000080
000000001FFF7008FFFFFF000000000020
000000001FFF3802FFFFFFE00000000004
000080001FFFE5007FFFFFF40000000001
000000001FFFF4803FFFFFFE0000000220
000000001FFFF40BFFFFFFFC0000000010
000080001FFFFC5FFFFFFFFE0000000004
000000001FFFFE2FFFFFFFFC0000000201
000000001FFFFC17FFFFFFFE0000000040
000000801FFFFE0BDFFFFFFC0000000220
000000201FFFFE850FFFFFFE0000000008
000000001FFFFF4207FFFFFC0000000400
000001000FFFFF408FF7FFFE0000000044
000200003FFFFF9047FFFFFC0000000020
000003000FFFFFC827FFFFFE0000000204
000001803FFFFF060BFFFFFC0000001122
0000000127FFFE0383FFFFFE0000000001
000400009FFFFC00F3FFFFFC0000000090
0000000057FFF8003FFFFFFE0000000800
000400001FFFB0008BFFFFFC0000000094
000000004BFFD02820FFFFFE0000000402
000000002FFFE48294FFFFFC0000000240
000800001FFF9228C07FFFFE0000004011
000000002FFEA891A0FFFFFC0000002000
08045000AFFE80646A3FBFFE0000000908
040108006FF94112909FFFFC0000000044
0004A000D7F60888255FFFFE0000004200
0A0240005FE802429A9FFFFC0000002010
00010000ABB0697FEFCFFFFE0000001082
092A80005FC297EB77EFEFFC0000000011
0480000057517FFDDAE7FFFD0000000800
00200000AB8EFFFFFFF7FFFC0000010488
0A1000005E3BFFFFFFF3F7FA0000000004
00000000D56FFFFFFFFBFFFC0000004041
040000006E7FFFFFFFF9FFFC0000000800
0200000098BFFFFFFFFDFFFA0000000421
09000000EBFFFFFFFFFDFBFC0000000208
00000020D5FFFFFFFFFCFDFC0000010080
0500000037FFFFFFFFFEFFFA0000008044
004000005BFFFFFC1FFE7FFC0000002800
0400000037FFFFC001FE7DFC0000000112
01000000DFFFFF40007F3FFE0000000001
080002004FFFFC20009F7EF40000011100
05480000F7FFF902008F3FFC0000000888
002000045FFFE0A80007BEFC0000000041
0554000077FFE0300007BFFE0000008000
004800005FFFC01C00059F740000002210
0A4000007FFFC0240001DFFC0000000088
014000005FFF80120003DF7C0000022004
044000007FFF80040008DFF60000001222
014000005FFF80000005CFBC0000000001
244000007FFF80000015EFFA0000000010
024000005FFF00000051EFBC0000024208
214000007FFF8000002BEFFC0000000100
014000005FFF80000005CFBC0000000001
244000007FFF80000015EFFA0000000010
024000005FFF00000051EFBC0000024208
214000007FFF8000002BEFFC0000000100
040200003FFF8000015BE7AA0000001044
028000005FFFC000002FF7FC0000008000
005000087FFFE000014FF7DC0000080821
220800043FFFF000001FFBEC0000000408
005400006FFFF800007FF7D40000014100
250000002FFFFD0001FFFBFC0000000044
200000004FFFFF8007FFFBD40000005000
0200000023FFFFFFFFFFFBFC00001208A4
2100002005FFFFFFFFFFFFD40000000000
0400000002FFFFFFFFFFF7FA0000014005
02900000017FFFFFFFFFFFEC0000001240
00040800003FFFFFFFFFF7EC0000100020
02B00400005FFFFFFFFEFFEC0000090410
00080006003FFFFFFFFFFFF40000004008
02A0080C05FFFFFFFFFEFFEC0000002204
0000000403FFFFFFFFFFFFF60000081122
128000004FFFFFFFFFFEFFE80000008000
000000000FFFFFFFFFFFFFEC0000040048
050000009FFFFFFFFFFEF7F40000004101
008000A04FFFFFFFFFFFFFEC0000042840
122000818FBFFFFFFFFEEFE80000020024
001003C00FBFFFFFFFFFF7F40000000500
052907F4075FFFFFFFFEEFE80000012008
00541FF1421FFFFFFFFEF7E80000100044
05001FE820BFFFFFFFFEEFF40000001200
00007F80001FFFFFFFFEEFE80000040112
0500FF28205FFFFFFFFEE7E80000029080
0000FC00003FFFFFFFFEE3F40000000002
0515F851207FFFFFFFFEE1E80000000941
0002E00123FFFFFFFFFFEBE80000804020
05290AA011FFFFFFFFFDE3E80000120410
0000801009FFFFFFFFFFE1E80000004101
0500002621FFFFFFFFFDE3E80000800010
0000000001FFFFFFFFFFE3E80000021108
0500800001FFFFFFFFFDE3E00000110082
0024000001FFFFFFFFFFE1E80000009020
0211400001FFFFFFFFFDE3E80001080200
0155000011FFFFFFFFFFE9E00000404084
0000800001FFFFFFFFFDE3D80000241022
0200800029FFFFFFFFFDE5E00000010801
0101000885FFFFFFFFFDE3E80000004480
00084000C1FFFFFFFFFDE1D00004080009
01252009A0FFFFFFFFFDE7E000024450A0
0001004591FFFFFFFFFDE1D00000000404
0103002300FFFFFFFFFDE3E00000020020
0000000200FFFFFFFFFDE5D00002204200
0102400029FFFFFFFFFFE3D00001122104
0001100002FFFFFFFFFFE3D00000011090
0100490201FFFFFFFFFFE3D00000000002
0001240013FFFFFFFFFFE3D00001108880
0480920201FFFFFFFFFFE1C00000080042
0012540201FF3FFFFFFFE3A00000044211
0008000001FEDFFFFFFFE3C00004020808
0420000001FFBFFFFFFFE3A00000400100
0015400001FFDFFFFFFFC3C00000120004
0400200001FFDFFFFFFC03800002014882
0000000001FF5FFFFFC003A00000000041
0424A80001FF1FFFFF0283800000440010
0811040001FF47FFFC2803A00000214400
0000400001FF3FFFE28003800002001208
08252004A1FE7FFFD40000000000080084
1412900009FFFFFEA00000000001012040
0004000CA7FFFFFA400000000000401222
082280020FFFFFF7800000000000088000
14144008A7FFFFDA400000000000024011
000500020FFFFFF5A00000000000002108
280800094FFFFEDA800000000001111081
0444000427FFFF6EC00000000000088820
202A800A8FFFFBF5400000000000004010
141000024FFFFFBFE00000000001441104
420800090FFFFFD5400000000000020882
282200048FFFFFFFE00000000000214040
541000094FFFFFFFE00000000001002420
840800048FFFFFFFF00000000000280210
5420000A0FFFFFFFF00000000000050108
840800128FFFFFFFF0000000000000A084
5000004D0FFFFFFFF80000000002201000
AA5000228FFFFFFFF80000000000100442
1000004A0FFFFFFFE00000000001050020
DA0001298FFFFFFFC00000000000002201
200000860FFFFFFF00000D400000200010
AA0001518FFFFFFE000140140001040848
540001040FFFFFFC000800020000028102
A90000528FFFFFF8000008008000900800
6C0000A90FFFFFF0002000004000008020
000000040BFFFFD00080080420000A4812
00000052A1FFFFE0000000021002400201
000000244BFFFFA0010024008800010090
00000012A1FFFFC0040090000800484008
0000002517FFFF40000604004804002204
00000014C1FFFF800401A0000802020022
004000050BFFFE80000140004800911000
00000012A3FFFF00040000000808008A25
0000000489FFFF80000000028804080100
0000001543FFFF00040000010800848021
0080000553FFFF80020000073010004808
000000000BFFFF40010000142004240484
0000001543FFFFC0008000004001008041
0080000017FFFFA0004000018020004000
00000000007FFFE0003000060010242044
00000010007FFFE0000A0070040A000421
00800000003FFFF80000AD000101049100
00000000003FFFFC000000000088400028
00400000003FFFFE000000001040208000
00000010001FFFFF80000000040508144A
00000008001FFFFFE00000000040000000
00400000001FFFFFF80000041221048401
00000000000FFFFFFF0000000014804128
00000008000FFFFFFFF400000100401400
004000040007FFFFFFFF81040892240084
000000000000FFFFFFFF40800000010040
00000000000005FFFFFF90440015004404
00400008000001FFFFFF8A011280A02022
00000000000000E3FFFE40480000120101
0000000400000001FFFF22020814008810
0040000000000000FFFE11208202804104
00000000000000007FFA08080100280080
00000008000000003FFC81025010022824
00400000000000003FE848A00409008402
00000004000000001DF420110104400080
00000000000000000F420A884040104041
0040000000000000140000402022042210
00000004000000000202A2091400810008
0000000000000000000010800120402044
0000800000000000000000000000000000

Copyright © 1985: Marco A. Calamari