Vai al contenuto
PLC Forum


Zilog Z80


baltimora

Messaggi consigliati

Salve a tutti, mi è sorta la necessità di apportare delle modifiche software su delle schede (un po’ vecchiotte) per il controllo di alcune macchine gestite da un Zilog Z80.

Ho cercato di documentarmi in merito facendo delle ricerche sulla rete, ma ho trovato molto poco, non ho compreso con esattezza con quale linguaggio si programmano, (da qualche parte ho letto in pascal, da qualche altra parte ho letto in BASIC ecc.), non sono riuscito neanche a trovare qualche esauriente manuale in Italiano.

Volevo chiedervi se qualcuno sa darmi delle informazioni in merito, e soprattutto, onde evitare di dover riscrivere integralmente il programma, se esiste un disassemblatore per poter risalire al codice sorgente contenuto nella EPROM.

Grazie

Modificato: da baltimora
Link al commento
Condividi su altri siti


Il manuale lo pui trovare qui, ovviamnete in inglese.

Che io ricordi (sono passati più di 20 anni da quando lo usavo) si programma in Assembler. Efficienti compilatori in linguaggi evoluti, a parte il PL-M80 per lo 8085, non me ne ricordo per qui micro.

Disassemblare le EPROM è fattibile in teoria, in pratica dipende dalla liunghezza del programma. Non disponendo dei sorgenti ti trovi con tutte le chiamate ed i salti con indirizzo fisico e non è per niente facile da leggere. Se sai dove inserire la/le modofca/he, è abbastanza facile. Nel puto dove iniziare la modifica inserisci un salto ad una locazione libera della EPROM più alta. A quella locazione scrivi la modifica. Se le modifiche sono più di una ripeti l'operzione N volte quante sono le modifiche. Dove hai scritto i salti non fai altro che leggere la memoria, modificare in codice macchina inseredo il salto in condizionato (C3 xxxx lo ricordo ancora a memoria), poi riscrivi la memoria, ci vuole qualche minuto ma fa tutto il programmatore di EPROM. Io di queste modifiche ne ho fatte parecchie quando mettevo a punto i programi: con circa 30k di programma, ai tempi, tra assemblaggio, link/locate e scrittura di 16 EPROM, se ne andavono più di 2 ore, mentre in codice macchina me la cavavo con una decina di minuti tongue.gif

Link al commento
Condividi su altri siti

Bè, x me non sembra così facile fare una modifica, in quando non so proprio da dove iniziare, in realtà dovrei solo variare dei tempi di lavorazione, (ma su molte schede e con tempi diversi). Se ho ben capito dovrei lavorare con codici esadecimale convertendoli volta per volta???????????

Se solo riuscissi a trovare un buon disassemblatore sarebbe tutto piu semplice.

Il linguaggio Assembler per il Z80 è uguale o simile a quello utilizzato per i PIC?

Ciao

Link al commento
Condividi su altri siti

Il linguaggio assembler Z80 è quasi identico a quello dello 8085. Con l'assembler dei PIC non ha similitudini, cambiano le metodologie dei registri, dei salti e dei mnemonici oltre al codice macchina.

Se devi solo variare dei tempi hai bisogno di capire dove sono memorizzate le costanti dei temporizzatori, quindi le cambi direttamente in codice macchina.

Disassemblatori, forse, ne puoi reperire in rete. Però se il programma è un po' complesso diventa un lavoro improbo capire dove e come andare a lavorare.....

Link al commento
Condividi su altri siti

Piccolo consiglio,

Non affidarti troppo ai disassembler, perche' se nel programma ci sono delle tabelle di dati , il disassembler non le riconosce te le trasforma il righe di codice inesistenti...

Link al commento
Condividi su altri siti

Ciao,

guarda un po proprio in questi giorni ero alle prese con un sistema embedded da me progettatocon uno z80.

Volevo fare una domanda a chi lo ha usato da tanto tempo:

sto provando ad usare un compilatore "C" per lo Z80 del tipo cross ma non riesco a capire quale istruzione mi permetta di attivare in uscita o in entrata le porte dello z80 con l'attivazione del pin iorq.

Ne ho visti diversi, ma tutti in versione prova senza manuale.

Per esempio quello che mi piaceva per via dell'interfaccia è quello dell'Avocet ADC-Z80, ma sul sito non c'è il manuale.

Secondo voi come devo fare a risolvere il problema delle porte?

Grazie.

Link al commento
Condividi su altri siti

Il problema dei compilatori, per i vecchi micro come lo Z80, è l'0ttimizzazione, in genere scarsa. Se non esistono istruzioni specifiche per gestire gli I/O devi fare un'assegnazione assoluta di una variabile char o boolean all'indirizzo delle periferia interessata.

Meglio sarebbe se il compilatore accettase lo ASm in linea, a questo punto inserisci alcune linee di assembler.

Link al commento
Condividi su altri siti

Ciao Livio,

certamente se il compilatore non prevede l'istruzione per l'IO è dura farsela da solo.

Come faccio ad assegnare l'indirizzo della porta ad una variabile se il compilatore non sa neanche che è una porta e che deve commutare il piedino IORQ?

Probabilmente la soluzione è un mix tra ASM e C, nei compilatori supportati.

Link al commento
Condividi su altri siti

ti do un consiglio matrix, scegli i dspic o i pic .

ci sono diversi compilatori e molto seri .

Il dspic lo programmi con C30 in ambiente mplab, con simulatore di debug ect.

Puoi scrivere ingressi ed uscite e fare quello che vuoi .E' un 16 bit con funzioni hw dsp , e costa circa 7-8 euro

io ne sto usando due per il generatore di segnali da campo , a dopo poco tempo riesci ad usarlo benino , con una serie di documenti pdf su quello che ti serve , i registri , l'architettura , il compilatore ect .

Lo Z80 facciamolo programamre a faggin

biggrin.gif

Link al commento
Condividi su altri siti

Ciao Waterword,

grazie del consiglio, anch'io uso mplab per i pic dal f84 al f877.

Ancora non ho provato i dspic, ma non mancherà.

Il problema non è l'MCU o CPU nel mio caso, ma una mia soddisfazione personale realezzare un grosso MCU con lo Z80(ci puoi mettere fino a 255 porte, hai 64K di spazio da allocare tra ram e rom, e poi costa una sciocchezza con poco più di 1 euro lo prendi sulla rete.)

Comunque leggendo qua e la ho forse risolto il problema del compilatore C. Sono riucito a trovare il manuale di quello della Hi-Tec (io uso quello della Hi-Tec per il PIC in Mplab) e dice qualcosina anche su I/O.

Comunque se qualcuno ha da aggiungere lo faccia pure.

A chi dovesse interessare lo schema della scheda Z80 me lo faccia sapere che gliela posto.

Link al commento
Condividi su altri siti

Si potresti postare lo schema

Non capisco per quale motivo non si riesca a capire come utilizzare le porte.

Ma tu acquisti solo il processore, e poi interfacci esternamente la ram , la flash ect oppure e' un microcontrollore ?

Lo Z81 della zilog e' un micro .

Se fosse un processore , costa poco , ma assemblare e reperire tutti i componenti poi ti conviene?

Fammi spere

ciao

Link al commento
Condividi su altri siti

Ciao Walterword,

si, io possiedo una CPU (microprocessore) Z80 e la interfaccio con RAM, ROM e le periferiche di I/O.

Il problema non è l'ardware, ma le istruzioni del compilatore per comandare le porte, vale a dire le modifiche di stato sul pin IORQ.

Provo ad allegare lo schema, è un po grosso perchè è molto lungo.

Per la convenienza credo proprio di si, non hai limiti di ROM/RAM (64k da gestire) e poi il vantaggio di avere fino a 255 periferiche di I/O ed il costo di tutto quanto non supera i 10 euro.

Z80-board

Link al commento
Condividi su altri siti

Il link è vuoto, si apre la pagina ma non c'è figura!

Sono decenni che non uso lo Z80 però alcune cose le ricordo.

Tramite "equ"[equate] (o l'equivalente del tuo compilatore) assegni ad una variabile l'indirizzo della periferica IORQ. Poi, usando il puntatore alla variabile, puoi leggere e scrivere il byte. Essendo IORQ un bit dovrai fare dei mascheramenti.

I moderni compilatori "C" dei microcontrollori hanno delle "built in functuion" proprio per gestire situazioni simili. Puoi ovviare costruendoti una macro o un function ad hoc.

Link al commento
Condividi su altri siti

Ciao Livio,

è strano, il link funziona, a me lo apre.

Quello che dici è esatto. Infatti alcuni ASM per Z80 ho trovato l'istruzione OUT ed IN per scrivere o leggere nella porta.

Come la potrei implementare?

Mi daresti un'idea?

Grazie.

Ri-posto il link.

Z80-board

Link al commento
Condividi su altri siti

Scusami, ma mi sono dimenticato di precisarlo prima:

d'accordo che ad una variabile assegno la locazione della porta e poi ci invio o ricevo dati puntando alla variabile; ma il problema è come faccio a dire al compilatore che quell'indirizzo è un indirizzo di I/O e non di memoria? Ci sarà di sicuro un qualcosa da anteporre all'indirizzo affinchè il compilatore "capisca" che quell'indirizzo è un undirizzo di I/O (in un compilatore ho visto la "[at]" prima dell'indirizzo per specificare che si tratta di un indirizzo di I/O). Ora ogni compilatore, non esistendo uno standard per l'hardware, usa un suo sistema per identificare questo"coso" che si antepone all'indirizzo di I/O.

Perdonatemi se mi sono dilungato, ma se ho detto delle fesserie vi prego di corrergermi.

Grazie.

Link al commento
Condividi su altri siti

Per il link: quasi sicuramente non ho un programma per visualizzare *.png su questo PC

Per il compilatore.

Al compilatore non interessa se l'indirizzo è RAM, EPROM o periferia. E' il linker-locator che fa le distinzioni.

Ammettiamo che le porte di I/O siano agli indirizzi 0-255 (0-FFh). Se voglio che Pippo sia un out di periferica e Pluto sia un input di peirferica, avendo assegnato, p.e., gli out 0-7Fh e gli In tra 80h e FFh, farò ad esempio

Pippo equ 00

Pluto equ 80h

o con altre direttive equivalenti del compilatore in uso.

A questo punto quando si punta all'indirizzo di Pluto o di Pippo si punta alla locazione specifica.

Il problema fondamentale è un altro. L'istuzione di In e di Out vanno anche a settare il chip selector di periferia, quindi bisognerebbe prima selezionare il chip selector. Dovrei andarmi a rilegere i manuali dello Z80 per rinfrescare un poco le cognizioni sulla periferia per i dettagli, però il succo è quello che spiegato più sopra.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Ciao Livio,

ho rimesso un file in formato jpg.

Z80-Board.jpg

Scusami, ma forse ho le idee un po confuse.

Se scrivo:

PortAIN equ 00

PortBOUT equ 80h

RAM equ 80h

Come fa il compilatore a capire che RAM si tratta di una locazione nella ram e PortBOUT di una locazione di I/O?

Lo può solo capire con un'istruzione che gli dica che quella locazione è di I/O perchè lo Z80 per selezionare l'accesso alla memoria o alle periferiche pone rispettivamente a zero /IORQ e /MEMRQ.

Grazie

Link al commento
Condividi su altri siti

Scusami, ma probabilmente è il provider che mi fornisce lo spazio web che fa i capricci con il link.

Prova a fare un copia-incolla dell'indirizzo in una nuova finestra del browser e vedrai che funziona.

Link al commento
Condividi su altri siti

OK Ho copiato e funge. Il circuito è canonico.

Quello dici è vero. Bisogna settare IORQ per distinguere la periferia dalla memeoria. Le istruzioni di Out lo fanno automaticamente. Anche RABBIT, che ha un'architettura molto simile, anzi il core sembra sia proprio un derivato di Z80, esegue direttamente da "C" l'istruzione di In-Out. Ora io non ricordo come si setta e resetta l'Input Output ReQuest dello Z80, bisogna leggere il manuale ed agire di conseguenza.

Io comunque cercherei di capire se il compilatore accetta l'assembler in linea; lo fanno qausi tutti i "C" compiler per micro; poi farei una macro in asm e ingliberei quella quasi fosse una built in function.

Link al commento
Condividi su altri siti

Perfetto!!

Certamente, il compilatore accetta le routine in ASM e le istruzioni del processore per l'IO delle porte sono proprio IN e OUT sul set di istruzioni del manuale.

Potrei chiederti una bozza di questa routine in ASM?

Se vuoi darci un'occhiata, il compilatore è un FREE e si chiama SDCC e lo trovi a questo link:

SDCC

E' eccezionale in quanto è retargettable per tante CPU / MCU.

Link al commento
Condividi su altri siti

Le istruzioni IN e OUT lavorano sul byte. Se vuoi scrivere sulla periferia devi caricare il valore nell'accumulatore poi esegui OUT xx, dove xx è il byte che identifica la tua periferia; se non ho visto male tu però sfrutti solo 2 bit di indirizzo per I/0. Riassumendo:

in "C" scrivi nella variabile "indirizzo" l'indirizzo del dato che vuoi scrivere, poi in asm fai

LDA indirizzo ; carica il valore del dato da scrivere in periferia

OUT (00000zx)b ; scrive il dato nella periferica indirizzata da zx binario

ovviamente "indirizzo" è una variabile integer da 16 bits

Il mnemonico è quello dello 8051 perchè quello dell Z80 non lo ricordo, ma è simile

Per leggere farai:

IN (000000zx)b ; carica in acumulatore il dato dalla periferica

STA "indirizzo" ; memorizza dato nella locazione indirizzata

Link al commento
Condividi su altri siti

Grazie Livio.

Mi metterò al lavoro al più presto.

Volevo chiederti anche una seconda cosa:

secondo te, avendo visto lo schema, per pilotare un display LCD devo per forza usare due porte di output (una per i dati ed una per i segnali di controllo), vero?

Correggimi se sbaglio, non posso utilizzare una sola porta per entrambi in modalità 4 bit perchè la porta viene controllata a 8 bit per volta e non singolarmente come ad esempio per i PIC.

Grazie.

Link al commento
Condividi su altri siti

Per curiosità ho dato un'occhiata al manuale del compilatore e ho trovato questo:

3.4.2 Z80/Z180 Storage Class Language Extensions

3.4.2.1 sfr (in/out to 8-bit addresses)

The Z80 family has separate address spaces for memory and input/output memory. I/O memory is accessed with special instructions, e.g.:

sfr at 0x78 IoPort; /* define a var in I/O space at 78h called IoPort */

Writing 0x01 to this variable generates the assembly code:

3E 01 ld a,#0x01

D3 78 out (_IoPort),a

Per quanto riguarda il pilotaggio del display puoi usare una sola porta, naturalmente quando invii i dati non devi cambiare i bit di controllo e viceversa.

Ciao.

Link al commento
Condividi su altri siti

Si può usare una sola porta ma devi fare i mascheramenti dei bit inutillizzati. Per esempio scrivi il dato nel nibble basso, poi aspetti il tempo previsto dal display, quindi nel nibble alto scivi il comando avendo cura di mantenere sempre invariato il nibble basso.

Se dovessi farlo io, userei 8 bits per i dati ed una porta separata per i comandi.

Se non ci sono problemi di Hw limitato si spende un poco di più, mi si guadagna tanto in salute e affidabilità

D3 78, è il codice macchina dell'istruzione OUT(D3h) alla porta 78h. Usando l'asm scriveresti in mnemonico solo OUT 78h

Link al commento
Condividi su altri siti

Ciao Giacomo,

era appunto quello che avevo trovato sul manuale del compilatore.

Secondo te, come posso implementare la libreria per l'LCD con una sola porta?

Qui sotto ti linko un file che uso per il PIC.

Come potrei modificarlo per adattarlo con l'hardware da me proposto?

Grazie.

LCD16x2.c

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...