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

C'est le lieu des discussions diverses et variées, mais toujours en rapport avec le thème général du forum et dans l'esprit de celui-ci.

Modérateurs : Papy.G, fneck, Carl

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 11:08

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!

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 11:20

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.
:(

Daniel
Messages : 11827
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

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

Message par Daniel » 28 août 2019 11:22

As-tu le code binaire ? C'est peut-être le désassembleur qui a transformé le OUT en IN ?
Daniel
L'obstacle augmente mon ardeur.

Patrick
Messages : 962
Enregistré le : 16 mai 2009 09:30
Localisation : Clermont-Ferrand

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

Message par Patrick » 28 août 2019 11:27

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.
Patrick

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 11:40

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.

Avatar du membre
gilles
Messages : 1851
Enregistré le : 07 août 2008 13:44
Localisation : Nantes
Contact :

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

Message par gilles » 28 août 2019 11:44

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.

Patrick
Messages : 962
Enregistré le : 16 mai 2009 09:30
Localisation : Clermont-Ferrand

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

Message par Patrick » 28 août 2019 11:56

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.
Patrick

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 12:46

L'oppcode a l'air correct (mais peut-être mal documenté sur les tables!):
0.JPG
0.JPG (189.08 Kio) Vu 421 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!]
Modifié en dernier par Xavier_AL le 28 août 2019 13:02, modifié 1 fois.

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 12:52

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…

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 12:58

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é.

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 13:01

Daniel a aussi soulevé un problème qu'il me faudra corriger pour la gestion de cet oppcode.

Merci à tous !

hlide
Messages : 1032
Enregistré le : 29 nov. 2017 10:23

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

Message par hlide » 28 août 2019 13:21

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.
Modifié en dernier par hlide le 28 août 2019 13:29, modifié 1 fois.

Avatar du membre
gilles
Messages : 1851
Enregistré le : 07 août 2008 13:44
Localisation : Nantes
Contact :

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

Message par gilles » 28 août 2019 13:28

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)

hlide
Messages : 1032
Enregistré le : 29 nov. 2017 10:23

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

Message par hlide » 28 août 2019 13:38

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).

Avatar du membre
Xavier_AL
Messages : 628
Enregistré le : 06 déc. 2017 20:30

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

Message par Xavier_AL » 28 août 2019 23:11

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 !

Répondre