Page 1 sur 3

[carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 11:08
par Xavier_AL
Salut à tous,

Actuellement sur l'étude d'un périphérique pour ZX81 de transfère au protocole Centronics...

Je suis tombé sur un mystère mystérieux difficilement explicâble (pas électrique).

J'explique donc ce que je n'ai pas compris...

La carte comporte un micro-programme assembleur qui contrôle la carte en ROM...

Aucunes informations ne sont envoyés à la carte (adresse réservée ou IRQ).

Voilà la routine d’envoie:

Code : Tout sélectionner

   PUSH HL
    LD A,$0A
    CALL Lb2935 ; [10549] send chr$(10)
    POP HL
(...)
Lb2935:
    PUSH AF
Lb2936:
    IN A,($3F) ; Reset Centronics card.
    RRCA
    JR C, Lb2936 ; [$2936:10550]
    POP AF
    IN A,($2F) ; Send the ASCII char ?
    RET ; ==========================

Bon, à première vu... tous ces codes ne vous disent rien...

Mais, seuls les cinq dernières ligne ont attiré mon attention !

On a des IN pas de OUT, et le registre A(f) semble envoyé avec le "IN A,($2F)".

Sans connaitre le matériel, on ne peut pas savoir (j'ai pas la carte, seulement la ROM)...

Mais, en gros, la lecture " IN A,($3F) ; Reset Centronics card." test le compteur binaire du buffer d'envoi.

"10000000"= Bit 0 envoyé.
"01000000"= Bit 1 envoyé.
(...)

"00000001"= Bit 7 envoyé.
Donc, une rotation RRCA (rotation du registre A vers la droite), remet à zéro le train d'impulsion de 8 bits pour la validation de l'information, au cas où la carte se serai arrêter en chemin.

Donc, le Buffer de validation est à "00000000".

Après, c'est plutôt délirant !

" LD A,$0A"
"IN A,($2F)" ! (On efface la valeur à envoyer ... et A est ... perdu.)
Donc, comme tout se passe en interne, la carte peut envoyer un train de 8 bits comme une grande...

Mais, cette valeur de "A", n'est jamais envoyée à la carte!
Et c'est l'objet de mon trouble...

Oui, je sais, il y a plus grave dans la vie, mais je voulais partager la cause de mes insomnies actuelles.
C'est méchant, et je m'en excuse.

Enfin, pour le moment, je me dis que c'est magique, et qu'il n'y a pas d'explications.

Donc, pas de buffer à une adresse fixe pour faire un miroir de A.
Pas de "OUT" de A, seulement une requête d'information de ?validation? non utilisée!
Le \ACK ou le \error de l'imprimante aurai pu attendre pour l'envoie de l'information... mais, bon.

Comme vous le voyez mes préoccupations sont futiles et simplistes.
Mais, j'avoue que c'est le seul de mes problèmes en ce moment, ça et ma pelouse.

Vive le temps libre des RTTs et mes nuits!

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 11:20
par Xavier_AL
ReSalut à tous, et aux autres…

Il n'y a pas une histoire de pile… et A serai placée toujours au même endroit en mémoire haute!
Non, la hauteur de la mémoire peut-être modifiée… donc, elle est flottante.
:(

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 11:22
par Daniel
As-tu le code binaire ? C'est peut-être le désassembleur qui a transformé le OUT en IN ?

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 11:27
par Patrick
Sans voir l'ensemble du code et sans le matériel, le bout de code suivant :

Code : Tout sélectionner

Lb2936:
    IN A,($3F) ; Reset Centronics card.
    RRCA
    JR C, Lb2936 ; [$2936:10550]
M'évoque plutôt l'attente du passage à 0 du bit 0 du port d'E/S $3F. Je ne vois pas pourquoi il y aurait un envoi sériel de l'octet de données sur une interface Centronics, donc parallèle.
Après, effectivement, l'envoi du caractère semble bizarre.

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 11:40
par Xavier_AL
Oui, Daniel , ce n'est pas bête de vérifier, je regarde… car le désassembleur est de mon cru ! (bugg?)

Patrick, pour le "carry", je pense qu'il vérifie la présence des 8bits avant d'envoyer… mais, là c'est pas logique pour du Centronics…
C'est apparemment un buffer 8 bits d'état, à "128", ça tourne 8 fois, et à "1"... une fois.
Peut-être une lecture du Clock de l'imprimante pour synchroniser l'envoie des packets 8bits.

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 11:44
par gilles
il y a peut être une astuce:

16 Bit I/O portsOfficially the Z80 has an 8 bit I/O port address space. When using the I/Oports, the 16 address lines are used. And in fact, the high 8 bit do actually havesome value, so you can use 65536 ports after all.IN r,(C),OUT (C),r, andthe Block I/O instructions actually place the entire BC register on the addressbus. SimilaryIN A,(n)andOUT (n),Aput A×256 + n on the address bus.TheINI/INIR/IND/INDRinstructions use BC after decrementing B, and theOUTI/OTIR/OUTD/OTDRinstructions before.

https://sam.speccy.cz/asm/undoc_z80_documented.pdf

Même sur une instruction IN, le registre A serait positionné sur le bus pour l'octet de poids fort ce qui permet à une interface de le lire.

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 11:56
par Patrick
Gilles, j'avais pensé à un truc comme ça.
Donc la donnée est présente sur le bus en même temps que l'adresse du port à écrire. Si le port $2F est en écriture seule (R/W n'est pas câblé) ça peut marcher.
Dommage de ne pas avoir la carte.

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 12:46
par Xavier_AL
L'oppcode a l'air correct (mais peut-être mal documenté sur les tables!):
0.JPG
0.JPG (189.08 Kio) Consulté 4401 fois
($DB) : reste non conventionnel pour une lecture de port… on utilise plutôt ($)

Ok !
Donc, "IN A,(xx)" > Reg A = Port ( RegA en octet haut et xx en octet bas)

ça envoie A, et ça récupère A sur le port lu !
IN A,( regA;Port)
La carte lit donc les données du port complet en assignant A au port xx.
Mais ce n'est pas documenté partout… et mon émulo. fait un AND $FF sur l'octet haut, car le port est en 8bits !

http://clrhome.org/table/

Donc, on a un "OUT" muet vers la carte, avec un retour de A ignoré.
ça évite probablement le câblage séparé d'un IN et D'un OUT sur la carte, et une gestion différente des adresses ($2E-$3F).

… Et la ROM n'est pas complète !
Sûrement délocalisée en hard.

Cela prouve sans équivoque, que nous avons affaire à une technologie alien.

[edit: Bon, j'ai la médaille de bronze!]

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 12:52
par Xavier_AL
il y a peut être une astuce:
Bravo Gilles…

J'ai mis un quart d'heure à trouver!
:D

Merci Patrick… les grand esprits se rencontrent…

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 12:58
par Xavier_AL
La carte est ici, mais difficile de voir quoi que ce soit…
http://zx81.ordi5.free.fr/memotech/MT07_IF/

J'ai essayé de refaire le plan, mais il y a un circuit programmable pour le décodage d'adresse… Donc, j'ai laissé tombé.

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 13:01
par Xavier_AL
Daniel a aussi soulevé un problème qu'il me faudra corriger pour la gestion de cet oppcode.

Merci à tous !

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 13:21
par hlide
OPCODE, abbréviation de OPeration CODE.

IN A,(n) ---> Présente sur le bus d'adresse 16-bit la valeur n en a[7..0] et le contenu du registre A en a[15..8], A contient ensuite la valeur lue sur le bus de donnée. Pas mal de spécificité en effet parmi ces opcodes de ce type. Et le port I/O est bien sur 16-bit en fait mais charge au hardware de l'exploiter ou pas.
IN A,(C) ---> Présente sur le bus d'adresse 16-bit le contenu du registre C en a[7..0] et le contenu du registre B en a[15..8], A contient ensuite la valeur lue sur le bus de donnée. Toujours sur 16-bit mais charge au hardware de l'exploiter ou pas.

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 13:28
par gilles
la lecture pour faire une écriture est une astuce classique pour des roms, sur des consoles prévues pour lire une eprom sur cartouche la lecture à des adresses spéciales va positionner des registres, par exemple pour faire du bankswitch et avoir plus d'espace.
Il est probable que des clones récents de Z80 ne vont pas implémenter cette astuce par contre et l'interface ne marchera peut être pas sur une machine comme le ZX spectrum Next (en tout cas c'est un bon test à faire dessus)

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 13:38
par hlide
A noter qu'il y a l'instruction non officielle "IN F,(C)" qui n'affecte pas de registre à part certains flags de F.

J'ai vu des cas où on pouvait utiliser un IN ou OUT sans se servir de donnée : c'est le simple fait de faire un /IOREQ à une adresse de port qui enclenche une action particulière du côté hardware (les /RD et /WD ne sont pas pris en compte).

Re: [carte Centronics] La joie de la rétro-ingégneurie.

Publié : 28 août 2019 23:11
par Xavier_AL
L'instruction est présente sur l'émulo…

Code : Tout sélectionner

       Case 219 ' IN A,(n)
            regA = inb((regA * 256) Or nxtpcb)
            local_tstates = local_tstates + 11
        End Select
Où nxtpcb est le n° du port 8bits.

"In F,(n)" non documenté …

Code : Tout sélectionner

       Case ??? ' IN F,(n)
            regF = inb((regA * 256) Or nxtpcb)
            local_tstates = local_tstates + 11
        End Select
Ce ne serai pas le "IN C,(n)", car C fait parti des flag de AF

Les 8 flags de F:

Code : Tout sélectionner

Public fS As Long
Public fZ As Long ' <- Zéro
Public f5 As Long 
Public fH As Long
Public f3 As Long
Public fPV As Long ' <- Positif
Public fN As Long ' <- Negatif
Public fC As Long ' <- carry
Y a des flags qui ne bougent pas beaucoup !