Programmazione in PASCAL su Z80

(Avvertenza: non ho ancora sperimentato quanto esposto in queste pagine, percio' potrebbero esserci degli errori)

La Alfa Sistemi (www.alfa-sistemi.it), oltre a realizzare diverse schede applicative basate sullo Z80 adatte sia a scopi didattici che professionali, mette a disposizione gratuitamente un compilatore PASCAL per Z80 derivato dal vecchio TurboPascal per CP/M della Borland. Il compilatore gira sotto emulazione CP/M in una finestra DOS (l'emulatore viene anch'esso fornito con il compilatore) e produce file eseguibili dallo Z80.

Del TurboPascal non possono essere usate le istruzioni che hanno a che fare con l'I/O su dispositivi periferici o di accesso ai files, in quanto manca il supporto hardware e il sistema operativo per la loro gestione. Tutte le funzioni e procedure che hanno invece a che fare con il trattamento delle informazioni (calcoli matematici, operazioni sulle stringhe ecc..) possono essere usate. L'accesso alle porte di I/O e alla memoria si effettua attraverso i due array predefiniti Port[ ] e Mem[ ].

La mappa di memoria di un sistema in grado di usare questo PASCAL e' la seguente:

Indirizzo Utilizzo
0000H
00FFH
256 byte, pagina 0 della EPROM con jump al programma e jumps per gli interrupt. E
P
R
O
M

3
2
K

0100H
1FC8H
7881 byte, libreria funzioni del PASCAL
1FC9H
7FFFH
24631 byte, spazio per il programma
8000H
80FFH
256 byte, pagina 0 della RAM con gli indirizzi di arrivo dei jump dalla pag.0 della EPROM, qui possono essere messi i jump verso i gestori di  INT e NMI. R
A
M

3
2
K

8100H
817FH
128 byte, qui possono essere messi i vettori di interrupt per l'IM2
8180H
81FFH
128 byte, qui può essere messo lo STACK.
8200H
FFFFH
32256 byte RAM, spazio dati. I dati del programma si trovano agli indirizzi più alti, lo spazio da 8200H in poi può essere usato per memorizzare dati qualsiasi.
Volendo realizzare un programma da mettere sulla EPROM di una generica scheda a Z80, al momento della compilazione si deve sempre specificare come indirizzo iniziale del programma il valore 1FC9H. Viene prodotto un file oggetto (contenente anche la libreria di funzioni del PASCAL) che deve essere caricato in EPROM all'indirizzo 0100H.

All'indirizzo 0000H della EPROM va caricato un file contenente i 256 byte della pagina zero.

Il compilatore consente anche di specificare l'indirizzo finale della memoria utilizzabile per i dati. Se invece di specificare l'ultimo indirizzo fisico della RAM si imposta un'indirizzo inferiore allora tutti i byte da quel punto in poi dovrebbero essere liberi. A mio avviso, visto che il PASCAL utilizza pesantemente lo stack per il passaggio parametri, si potrebbero lasciare 1 o 2 kbyte liberi in cima alla RAM ed allocare li lo stack, però dovrei fare delle prove per verificare se si può fare. Quindi come indirizzo finale della RAM usabile per i dati si potrebbe specificare FBFF (1K libero) o F7FF (2K liberi).
 

La pagina 0


 

I primi 256 byte della EPROM devono contenere i valori qui sopra riportati. Si riconosce un iniziale JP 256 (C30001) che all'accensione (o dopo un reset) indirizza la CPU al programma principale (che inizia per l'appunto all'indirizzo 256 o 0100H).

In corrispondenza degli indirizzi 08H 10H 18H 20H 28H 30H 38H ci sono dei jump verso indirizzi della pagina 0 della RAM. Per semplicita' mnemonica 08H viene indirizzato a 8008H, 18H a 8018H e così via. In questo modo è possibile creare delle routine in assembler o in PASCAL richiamabili con le istruzioni RST dello Z80.

Ma la cosa più importante sono i jump presenti agli indirizzi 0038H e 0066H, che corrispondono agli indirizzi a cui il processore salta quando riceve un interrupt INT o NMI rispettivamente. Sapendo che a 0038H c'è un jump verso l'indirizzo 8038H e in 0066H verso 8066H si possono creare dei gestori di interrupt in PASCAL. A questo riguardo vedere la pagina con la struttura standard per un programma in grado di usare gli interrupt.
 

Lo Stack
Un programma all'inizio può impostare la posizione dello stack della CPU. All'accensione il valore dello stack pointer vale 0, ma non so quali variazioni vengano introdotte dall'avvio della libreria di funzioni. Alfa Sistemi consiglia di impostare lo SP (stack pointer) a 8200H ma probabilmente è possibile dargli un po' di spazio in più allocandolo in un paio di kbyte liberi in cima alla RAM.

Il programma andrebbe quindi compilato a partire da 1FC9 con limite F7FF, e dovrebbe contenere all'inizio l'impostazione dello SP a 0. Questa impostazione può essere messa appena prima della definizione dei jump per gli interrupt: inline($31/$00/$00); { LD SP,0 }
Quando la CPU deve salvare un dato (16bit) nello stack, memorizza i byte agli indirizzi SP-1 e SP-2. Pertanto se SP inizialmente vale 0 i due byte vengono memorizzati agli indirizzi 0-1=65535 e 0-2=65534, ed infine SP assume il valore 65534.
 

L'assembler
Le istruzioni in codice macchina per lo Z80 possono essere inserite con il comando inline e devono essere espresse con i codici esadecimali delle singole istruzioni, non è cioè ammesso l'uso dell'assembler mnemonico.


Pagina realizzata da Claudio Fin
Ultimo aggiornamento 23-9-2000