Fonctionnement hard du LEP sur TO9
Modérateurs : Papy.G, fneck, Carl
Fonctionnement hard du LEP sur TO9
Bonjour,
Je cherche à comprendre comment fonctionne le lecteur de cassette sur To9, d'un point de vue programmeur.
Jusqu'ici, en parcourant une doc célèbre, j'ai compris que le LEP était pilotable via un bit du PIA (6846), et un autre du 6821 system.
Pour le 6846:
- Moteur à l'arrêt, le bit 7 à 1 d'E7C3 sert à savoir si le lecteur est branché. Mais il sert aussi à recevoir les bits de lecture quand le moteur est allumé.
Pour le 6821 system:
- Quand le bit 2 d'E7CA est positionné en sortie (écriture), il permet d'allumer ou d'éteindre le lecteur de K7. A priori, il faudrait mettre 0 pour lancer le moteur, et 1 pour l'éteindre. C'est pas clair.
Questions:
- Est-ce que ce que j'ai écrit avant est juste et complet (ce qui m'étonnerait vu que je ne sais pas comment se passe l'écriture)?
- Quel algorithme faut-il utiliser pour décoder les informations lues sur le lecteur de K7? J'aurai besoin de savoir quels timings il faut respecter pour recevoir les infos, etc.
- Quid de l'écriture sur K7? Comment le faire en hard également?
J'attends quelques réponses, et j'affinerai mes questions en fonction.
Pour info, ces questions sont dans le cadre de l'émulateur que je code à mes temps perdus.
Merci à ceux qui me liront et me répondront.
a+
Je cherche à comprendre comment fonctionne le lecteur de cassette sur To9, d'un point de vue programmeur.
Jusqu'ici, en parcourant une doc célèbre, j'ai compris que le LEP était pilotable via un bit du PIA (6846), et un autre du 6821 system.
Pour le 6846:
- Moteur à l'arrêt, le bit 7 à 1 d'E7C3 sert à savoir si le lecteur est branché. Mais il sert aussi à recevoir les bits de lecture quand le moteur est allumé.
Pour le 6821 system:
- Quand le bit 2 d'E7CA est positionné en sortie (écriture), il permet d'allumer ou d'éteindre le lecteur de K7. A priori, il faudrait mettre 0 pour lancer le moteur, et 1 pour l'éteindre. C'est pas clair.
Questions:
- Est-ce que ce que j'ai écrit avant est juste et complet (ce qui m'étonnerait vu que je ne sais pas comment se passe l'écriture)?
- Quel algorithme faut-il utiliser pour décoder les informations lues sur le lecteur de K7? J'aurai besoin de savoir quels timings il faut respecter pour recevoir les infos, etc.
- Quid de l'écriture sur K7? Comment le faire en hard également?
J'attends quelques réponses, et j'affinerai mes questions en fonction.
Pour info, ces questions sont dans le cadre de l'émulateur que je code à mes temps perdus.
Merci à ceux qui me liront et me répondront.
a+
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Fonctionnement hard du LEP sur TO9
Le 6848 fait deux choses, et pas une seule: Comme tu l'as vu le b7 de E7C3 décode le 0/1 lu par la logique du lecteur K7. Mais il fait aussi l'écriture par la sortie CT0 (timeout-timer). J'ai le souvenir d'avoir vu le moniteur TO7 dessassemblé. Le TO9 marche pareil. Cela t'aiderait bien à comprendre. Mais l'idée que j'ai retenue pour l'écriture c'est que la routine ROM encode les 0/1 à sérialiser en modifiant la période du timer. Donc pour émuler le lecteur K7 au plus bas niveau, l'émulation précise du 6848 est indispensable, mais je sais que tu l'as déjà
On remarque que l'encodage/décodage est asymétrique. Le TO génère des signaux analogiques directement envoyés sur la bande K7, et récupère des niveau logiques décodés par l'électronique du lecteur K7. Cela explique que le lecteur K7 était relativement plus cher sur TO7 que sur MO5 où le décodage est 100% logiciel.
On remarque que l'encodage/décodage est asymétrique. Le TO génère des signaux analogiques directement envoyés sur la bande K7, et récupère des niveau logiques décodés par l'électronique du lecteur K7. Cela explique que le lecteur K7 était relativement plus cher sur TO7 que sur MO5 où le décodage est 100% logiciel.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Fonctionnement hard du LEP sur TO9
En fait, je n'ai pas tout dit. J'avais aussi lu la doc Savema du To9 et j'étais tombé sur la routine de test d'écriture du LEP.
Sauf que, sur le coup, je n'ai pas compris comment ils pouvaient écrire un truc sur le LEP juste en bidouillant les timings du 6846 (pas 6848 ). Du coup, ce que tu me dis me semble plus clair. Mais c'est un procédé complètement inhabituel. Ca m'a bloqué.
Sinon, pour la lecture, cela ne me dit pas s'il faut respecter des timings pour lire E7C3. J'ai bien tenté de tracer la lecture à partir d'E815, mais mon debugueur se plante dans l'extramoniteur.
Est-ce que tu aurais un petit bout de code clair à ce sujet?
Sauf que, sur le coup, je n'ai pas compris comment ils pouvaient écrire un truc sur le LEP juste en bidouillant les timings du 6846 (pas 6848 ). Du coup, ce que tu me dis me semble plus clair. Mais c'est un procédé complètement inhabituel. Ca m'a bloqué.
Sinon, pour la lecture, cela ne me dit pas s'il faut respecter des timings pour lire E7C3. J'ai bien tenté de tracer la lecture à partir d'E815, mais mon debugueur se plante dans l'extramoniteur.
Est-ce que tu aurais un petit bout de code clair à ce sujet?
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Fonctionnement hard du LEP sur TO9
Il faudrait que je fasse de l'archéologie pour retrouver le bout de code que je pense avoir vu. Je pense que c'était dans une discussion de logicielsmoto en revanche. C'est d'ailleurs ch*ant: il circulait il y a 16ans les codes sources des rom thomson, mais depuis ya plus rien de trouvable par google.
A priori pour lire les bits en E7C3 oui il faut respecter les timing pour tous les bits de l'octets une fois détecté le bit de départ (c'est du classique pour une liaison série). Il me semble effectivement avoir lu une doc (SAVEMA?) qui fait cela: 1 bit tous les 1111cycles cpu (soit 1.1ms) nous donne le 900bauds attendu.
A priori pour lire les bits en E7C3 oui il faut respecter les timing pour tous les bits de l'octets une fois détecté le bit de départ (c'est du classique pour une liaison série). Il me semble effectivement avoir lu une doc (SAVEMA?) qui fait cela: 1 bit tous les 1111cycles cpu (soit 1.1ms) nous donne le 900bauds attendu.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Fonctionnement hard du LEP sur TO9
Il y a cette page : http://dcmoto.free.fr/documentation/source.html__sam__ a écrit :il circulait il y a 16ans les codes sources des rom thomson, mais depuis ya plus rien de trouvable par google.
Sinon, il y a l'outil de désassemblage de dcmoto. Voici les routines de lecture/écriture d'un octet cassette TO :
Extraites de la ROM du T9000
Code : Tout sélectionner
---------------------------------
Ecriture octet cassette
---------------------------------
FCAD 3404 PSHS B
FCAF CC006E LDD #$006E
FCB2 FDE7C6 STD $E7C6
FCB5 C606 LDB #$06
FCB7 B6E7C0 LDA $E7C0
FCBA 8401 ANDA #$01
FCBC 27F9 BEQ $FCB7
FCBE 10B3E7C6 CMPD $E7C6
FCC2 5C INCB
FCC3 C1B0 CMPB #$B0
FCC5 2420 BCC $FCE7
FCC7 1F98 TFR B,A
FCC9 840F ANDA #$0F
FCCB 810F CMPA #$0F
FCCD 26E8 BNE $FCB7
FCCF 1A01 ORCC #$01
FCD1 66E4 ROR ,S
FCD3 2509 BCS $FCDE
FCD5 866E LDA #$6E
FCD7 B7E7C7 STA $E7C7
FCDA CB06 ADDB #$06
FCDC 20D9 BRA $FCB7
FCDE 864E LDA #$4E
FCE0 B7E7C7 STA $E7C7
FCE3 CB02 ADDB #$02
FCE5 20D0 BRA $FCB7
FCE7 3584 PULS B,PC
---------------------------------
Lecture octet cassette
---------------------------------
FCE9 B6E7C3 LDA $E7C3
FCEC 2BFB BMI $FCE9
FCEE 9667 LDA /$67
FCF0 44 LSRA
FCF1 4A DECA
FCF2 12 NOP
FCF3 26FC BNE $FCF1
FCF5 B6E7C3 LDA $E7C3
FCF8 2BEF BMI $FCE9
FCFA 8E0008 LDX #$0008
FCFD 9667 LDA /$67
FCFF 4A DECA
FD00 12 NOP
FD01 26FC BNE $FCFF
FD03 B6E7C3 LDA $E7C3
FD06 2B03 BMI $FD0B
FD08 1CFE ANDCC #$FE
FD0A F51A01 BITB $1A01
FD0D 56 RORB
FD0E 301F LEAX -$01,X
FD10 26EB BNE $FCFD
FD12 9667 LDA /$67
FD14 44 LSRA
FD15 4A DECA
FD16 26FD BNE $FD15
FD18 E764 STB $04,S
FD1A 39 RTS
- Un octet commence par un bit de start (à 1) et se termine par deux bits de stop (à 0).
- Un bit 0 est constitué de 5 périodes d'un signal à 4500 Hz
- Un bit 1 est constitué de 7 périodes d'un signal à 6300 Hz
Remarquez que 4500/5 = 6300/7 = 900 bauds
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
Re: Fonctionnement hard du LEP sur TO9
Merci Daniel.
Re: Fonctionnement hard du LEP sur TO9
Est-ce qu'il y a une doc disponible qui parle des bits de start et de stop et de tout le bousin concernant la gestion du lecteur de K7 sur To?
Re: Fonctionnement hard du LEP sur TO9
A ma connaissance il n'y a aucune documentation décrivant précisément l'enregistrement sur cassette TO. Les documentations techniques des magnétophones MK90-090 et MK97-070 donnent de vagues informations : fréquence du signal de synchronisation, fréquence et nombre de périodes des bits 0 et 1. Rien sur la structure d'un octet, ni sur la structure d'un bloc, ni sur la structure d'un fichier.
Pour aller plus loin, il faut désassembler les routines du moniteur et observer les fichiers .wav d'enregistrements de cassettes.
Pour aller plus loin, il faut désassembler les routines du moniteur et observer les fichiers .wav d'enregistrements de cassettes.
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
Re: Fonctionnement hard du LEP sur TO9
Est-ce qu'il y a une feinte pour l'extinction et l'allumage logiciel du moteur?
A priori, ce serait le bit 2 d'E7CA qui jouerait ce rôle.
Si je considère que la valeur 0 vaut allumage, et 1 pour l'extinction alors, au reset, la ROM de mon To9 fait un allumage puis une extinction puis un allumage du moteur. Ensuite, quand je passe au basic et que je fais un LOAD "CASS:", le Basic envoie un ordre d'allumage alors qu'il est déjà allumé. Si je considère maintenant que le 1 vaut extinction, il faut tout inverser, et le Basic m'envoie donc un ordre d'extinction quand je lance le LOAD, le moteur étant déjà éteint.
Je n'ai pas de thomson avec lecteur de K7 à ma portée, mais il me semble que le lecteur de K7 est en mode extinction quand je passe au basic. Puis il s'allume quand je lance un LOAD. J'en conclue que les ordres d'allumage et d'extinction ne se font pas exactement en positionnant le bit 2 d'E7CA.
Une piste me ferait le plus grand bien. Y a t-il un connaisseur qui peut m'aiguiller?
Merci.
A priori, ce serait le bit 2 d'E7CA qui jouerait ce rôle.
Si je considère que la valeur 0 vaut allumage, et 1 pour l'extinction alors, au reset, la ROM de mon To9 fait un allumage puis une extinction puis un allumage du moteur. Ensuite, quand je passe au basic et que je fais un LOAD "CASS:", le Basic envoie un ordre d'allumage alors qu'il est déjà allumé. Si je considère maintenant que le 1 vaut extinction, il faut tout inverser, et le Basic m'envoie donc un ordre d'extinction quand je lance le LOAD, le moteur étant déjà éteint.
Je n'ai pas de thomson avec lecteur de K7 à ma portée, mais il me semble que le lecteur de K7 est en mode extinction quand je passe au basic. Puis il s'allume quand je lance un LOAD. J'en conclue que les ordres d'allumage et d'extinction ne se font pas exactement en positionnant le bit 2 d'E7CA.
Une piste me ferait le plus grand bien. Y a t-il un connaisseur qui peut m'aiguiller?
Merci.
Re: Fonctionnement hard du LEP sur TO9
Le moteur est contrôlé par la broche CA2 (broche 39) du PIA système (6821)
0 = MOTOR ON
1 = MOTOR OFF
Le fonctionnement du 6821 est assez complexe, il serait trop long de l'expliquer ici.
Il faut lire la datasheet, en particulier la fin de la page 8 et la page 10, qui décrivent les différents modes de fonctionnement de CA2.
http://dcmoto.free.fr/documentation/6821ds/index.html
Le comportement des TO est bien celui que tu décris :
- A l'initialisation de l'ordinateur le magnétophone ne tourne pas quand on appuie sur PLAY. Même comportement s'il n'est pas connecté.
- Pour démarrer le moteur, il faut donner un ordre : MOTORON, ou SKIPF, ou LOAD, ou SAVE etc.
0 = MOTOR ON
1 = MOTOR OFF
Le fonctionnement du 6821 est assez complexe, il serait trop long de l'expliquer ici.
Il faut lire la datasheet, en particulier la fin de la page 8 et la page 10, qui décrivent les différents modes de fonctionnement de CA2.
http://dcmoto.free.fr/documentation/6821ds/index.html
Le comportement des TO est bien celui que tu décris :
- A l'initialisation de l'ordinateur le magnétophone ne tourne pas quand on appuie sur PLAY. Même comportement s'il n'est pas connecté.
- Pour démarrer le moteur, il faut donner un ordre : MOTORON, ou SKIPF, ou LOAD, ou SAVE etc.
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
Re: Fonctionnement hard du LEP sur TO9
Des news...
J'ai pris un peu de temps pour essayer d'implémenter la lecture hard du LEP sur mon émulateur.
Voilà ce que j'ai fait:
- Le moteur du LEP est activable par la ligne CA2. Cette ligne correspond en fait au bit 3 d'E7CA (valeur 8 ). Je pensais à la base que le 2 de CA2 signifiait "bit 2" mais c'était une erreur. Bref, quand le bit vaut 0, cela active le LEP. Et l'état 1 désactive le LEP.
- Je lis chaque octet d'un fichier .k7 en le décomposant en 11 bits. Avec 1 bit de start à 0, suivi des bits de l'octet dans l'ordre du plus faible au plus fort, puis de 2 bits de stop à 1.
- Je balance chacun des 11 bits tous les 1111 cycles sur le bit 7 d'E7C3 (en respectant bien sûr l'état d'allumage du lecteur)
- Sinon, quand le moteur est éteint, j'indique bien la présence du LEP
Voilà ce que ça donne:
- Le To9 émulé reconnait bien la présence du LEP
- Quand je lance un LOAD "CASS:", le basic allume bien le lecteur et je balance bien les bits tous les 1111 cycles, jusqu'au dernier octet du fichier .k7
- Problème: le Basic ne trouve rien sur la cassette émulée
J'ai tracé l’exécution à partir du LOAD. J'ai également décomposé les routines de la rom de mon To9. Je dois dire qu'elles sont quasi imbitables du premier coup d'oeil. Je me suis également inspiré des routines du To7 ci-avant. Et, malgré ça, je n'ai pas réussi à solutionner mon problème.
Comme je n'ai pas assez de temps pour creuser l'affaire, je reviens ici des fois qu'une petite feinte vous sauterait aux yeux.
Merci.
J'ai pris un peu de temps pour essayer d'implémenter la lecture hard du LEP sur mon émulateur.
Voilà ce que j'ai fait:
- Le moteur du LEP est activable par la ligne CA2. Cette ligne correspond en fait au bit 3 d'E7CA (valeur 8 ). Je pensais à la base que le 2 de CA2 signifiait "bit 2" mais c'était une erreur. Bref, quand le bit vaut 0, cela active le LEP. Et l'état 1 désactive le LEP.
- Je lis chaque octet d'un fichier .k7 en le décomposant en 11 bits. Avec 1 bit de start à 0, suivi des bits de l'octet dans l'ordre du plus faible au plus fort, puis de 2 bits de stop à 1.
- Je balance chacun des 11 bits tous les 1111 cycles sur le bit 7 d'E7C3 (en respectant bien sûr l'état d'allumage du lecteur)
- Sinon, quand le moteur est éteint, j'indique bien la présence du LEP
Voilà ce que ça donne:
- Le To9 émulé reconnait bien la présence du LEP
- Quand je lance un LOAD "CASS:", le basic allume bien le lecteur et je balance bien les bits tous les 1111 cycles, jusqu'au dernier octet du fichier .k7
- Problème: le Basic ne trouve rien sur la cassette émulée
J'ai tracé l’exécution à partir du LOAD. J'ai également décomposé les routines de la rom de mon To9. Je dois dire qu'elles sont quasi imbitables du premier coup d'oeil. Je me suis également inspiré des routines du To7 ci-avant. Et, malgré ça, je n'ai pas réussi à solutionner mon problème.
Comme je n'ai pas assez de temps pour creuser l'affaire, je reviens ici des fois qu'une petite feinte vous sauterait aux yeux.
Merci.
Re: Fonctionnement hard du LEP sur TO9
Comment l'émulateur génère-t-il les séquences de synchronisation et les espaces inter-blocs ?
Le fichier k7 ne contient ni les séquences de synchronisation, ni les espaces nécessaires entre les blocs pour permettre au programme de les traiter. Le problème vient certainement de là.
Le fichier k7 ne contient ni les séquences de synchronisation, ni les espaces nécessaires entre les blocs pour permettre au programme de les traiter. Le problème vient certainement de là.
Daniel
L'obstacle augmente mon ardeur.
L'obstacle augmente mon ardeur.
Re: Fonctionnement hard du LEP sur TO9
L'émulateur ne génère rien car je pensais que le fichier .k7 était un bête dump des octets décodés de la cassette.
Du coup, comment je dois procéder pour combler les "trous"? J'aurai besoin de détails techniques.
Merci et Joyeux Noël.
Du coup, comment je dois procéder pour combler les "trous"? J'aurai besoin de détails techniques.
Merci et Joyeux Noël.
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Fonctionnement hard du LEP sur TO9
C'est le problème principal quand on doit ré-générer les WAV depuis un format K7. Dans le format K7 il n'y a pas des délais inter-blocs et ceux-ci peuvent être plus ou moins longs suivant le soft qui les lit (par exemple: ils sont bien plus long quand on sauve un programme BASIC en ASCII ou dans sa version tokenisée, parce que la re-lecture de l'ascii prend du temps en plus pour tokeniser les données).
Pour re-introduire ces délais, il faut procéder expérimentalement et typiquement permettre à l'utilisateur de le modifier au cas par cas suivant le programme qui exploite le LEP.
Tu peux trouver ici le code source d'un utilitaire que j'avais fait pour convertir les K7 en WAV. Il contient une machine à état qui ré-introduite les délais manquants du fichier K7 en ré-interprétant certains blocs. Cependant perso j'oublierais à présent cette option car il y a mieux!
En effet, Daniel a sorti un nouveau format le LEP qui contient tous ces délais (c'est un peu l'équivalent du format HFE mais pour cassettes), et qui donc évite de faire des hypothèses qui ne marcheront jamais complètement. Tu devrais peut-être faire lire un fichier LEP à l'émulateur au lieu du vieux fichier K7 qui ne contient pas toute les info.
Bonnes fêtes à toi aussi.
Pour re-introduire ces délais, il faut procéder expérimentalement et typiquement permettre à l'utilisateur de le modifier au cas par cas suivant le programme qui exploite le LEP.
Tu peux trouver ici le code source d'un utilitaire que j'avais fait pour convertir les K7 en WAV. Il contient une machine à état qui ré-introduite les délais manquants du fichier K7 en ré-interprétant certains blocs. Cependant perso j'oublierais à présent cette option car il y a mieux!
En effet, Daniel a sorti un nouveau format le LEP qui contient tous ces délais (c'est un peu l'équivalent du format HFE mais pour cassettes), et qui donc évite de faire des hypothèses qui ne marcheront jamais complètement. Tu devrais peut-être faire lire un fichier LEP à l'émulateur au lieu du vieux fichier K7 qui ne contient pas toute les info.
Bonnes fêtes à toi aussi.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Fonctionnement hard du LEP sur TO9
Merci __sam__. Je vais m'inspirer de ton automate d'états et on verra bien.
Du coup, est-ce que dcmoto procède de la même façon pour lire les fichiers .k7 et .k5?
Du coup, est-ce que dcmoto procède de la même façon pour lire les fichiers .k7 et .k5?