[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. Contient des rubriques électroniques.

Modérateurs : Papy.G, fneck, Carl

Xavier_AL

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

Message 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!
Xavier_AL

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

Message 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.
:(
Daniel
Messages : 17408
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

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

Message par Daniel »

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 : 2019
Inscription : 16 mai 2009 09:30
Localisation : Clermont-Ferrand

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

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

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

Message 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.
Avatar de l’utilisateur
gilles
Messages : 2782
Inscription : 07 août 2008 13:44
Localisation : Nantes
Contact :

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

Message 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.
Patrick
Messages : 2019
Inscription : 16 mai 2009 09:30
Localisation : Clermont-Ferrand

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

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

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

Message 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é 4391 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!]
Dernière modification par Xavier_AL le 28 août 2019 13:02, modifié 1 fois.
Xavier_AL

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

Message 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…
Xavier_AL

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

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

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

Message par Xavier_AL »

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

Merci à tous !
Avatar de l’utilisateur
hlide
Messages : 3495
Inscription : 29 nov. 2017 10:23

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

Message 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.
Dernière modification par hlide le 28 août 2019 13:29, modifié 1 fois.
Avatar de l’utilisateur
gilles
Messages : 2782
Inscription : 07 août 2008 13:44
Localisation : Nantes
Contact :

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

Message 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)
Avatar de l’utilisateur
hlide
Messages : 3495
Inscription : 29 nov. 2017 10:23

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

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

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

Message 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 !
Répondre