[FORTH] Fonction KEYF sur DCMOTO

Couvre tous les domaines de l'émulation ou de la virtualisation ainsi que les discussions sur les divers outils associés.

Modérateurs : Papy.G, fneck, Carl

Répondre
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

[FORTH] Fonction KEYF sur DCMOTO

Message par Dominique »

Une observation au sujet du clavier - Version 2015.06.04 - MO5 v1.1

Selon le livre "Forth pour Thomson MO5" qui accompagne la K7, P34 la fonction KEYF doit retourner 48
(je suppose décimal) si aucune touche n'est appuyée.
Sur l'émulateur elle retourne 58 comme le montre le test :

Code : Tout sélectionner

DECIMAL
: TEST 100 1 DO KEYF . LOOP ;

TEST  58 58 58 .....
as-tu une explication ?
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [FORTH] Fonction KEYF sur DCMOTO

Message par __sam__ »

As tu le code ASM de KEYF? à partir de là on peut comprendre ce qu'il se passe. Le "F" final indidque que c'et un flag et je me serai attendu à ce quelle retourne uniquement 0/1.
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
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [FORTH] Fonction KEYF sur DCMOTO

Message par Dominique »

Ok . Voici le ASM de Keyf

Code : Tout sélectionner

                      ;****************
                      ;* LE MOT KEYF
                      ;****************
                      w_keyf
 5A78 84                      FCB $84 
 5A79 4B4559                  FCC "KEY"
 5A7C C6                      FCB $80+'F
 5A7D 5A67                    FDB w_pick
                      cf_keyf
 5A7F 5A81                    FDB c_keyf
                      c_keyf
 5A81 3F                      SWI    
 5A82 0C                      FCB $0C               
 5A83 4F                      CLRA                      
 5A84 0EB4                    JMP    PUSH   
Dernière modification par Dominique le 13 févr. 2017 12:18, modifié 1 fois.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [FORTH] Fonction KEYF sur DCMOTO

Message par __sam__ »

Alors cela appelle la routine KTST du moniteur MO5. Cette routine met le bit 7 du CCR du processeur à 1 si une touche et appuyée et à 0 sinon. Si c'est à 1, alors B contient la valeur du code ASCII de la touche (doc moniteur issue du "manuel technique du mo5"). Le fait que tu obtienne 58 ou 48 n'est pas significatif car aucune touche n'est appuyée quand tu fais le test. J'imagine que la routine laisse dans B la valeur qu'il avait précédemment.

Corrolaire: la routine KEYF est intrinsèquement buggée car elle ne teste pas la valeur du flag processeur Z pour savoir si B contient un code ASCII interprétable ou n'importe quoi. (edit c'est faux, lire après)

[EDIT] MAIS, un grand MAIS, le commentaire dans code source de la rom MO5 précise

Code : Tout sélectionner

*    KEYTST est un test rapide des touches qui retourne avec :                *
*       Z=1   B=$34                             (PAS DE TOUCHE ENFONCEE)      * 
*       Z=0   B=NUMERO PHYSIOUE DE TOUCHE       (UNE TOUCHE ENFONCEE)         *
Donc il est possible de ne pas tester la valeur du flag Z mais tester par rapport à $34. Or ce $34 et suspect car le code source dit plus loin

Code : Tout sélectionner

KEYTST  EQU     *
        LDD     BLOCZ           BLOCZ = 0000.       
        STD     TEMP            Flag pour les touches Basic, Control et Shift.    
        LDB     #%01110010      Position de la derniere touche clavier (BASIC)
KBSCAN  EQU     *
        STB     PRB-PRA,U       Envoi du code position de la touche       
        LDA     PRB-PRA,U       Out clavier (bit7=0 ==> touche enfoncee).        
        BMI     NXTKEY          NXTKEY : test de la touche suivante.     
        LDA     #1              On va donc tester si BASIC,CTRL,SHIFT 
        CMPB    #%01110010      BAS1C ? Flag=l          
        BEQ     SAVFLG              
        LSLA                    Flag control = 2  
        CMPB    #%01101010      Control ?         
        BEQ     SAVFLG          Oui, idem    
        LSLA                    Flag shift = 4  
        CMPB    #%01110000      Shift ?        
        BNE     EXREAD          Non, c'est une autre touche du clavier.     
SAVFLG  EQU     *
        STA     TEMP            Positionne le flag.(Prior:CTRL,SHIFT,BASIC).    
NXTKEY  EQU     *
        INC     TEMP+1          Touche suivante.      
        SUBB    #2              Envoi code touche suivante :codes de 2 en 2.  
        BPL     KBSCAN          Sortie si aucune touche enfoncee.     
EXREAD  EQU     *
        LDD     TEMP            A = flag, B = numero de la touche dans TABASC    
        STD     3,S             Sauvegarde dans la pile pour les appelants.  
        CMPB    #$3A            Z = 1 si pas de touche enfoncee.    
        RTS                       
que c'est $3A (se référer au CMPB final) Et $3A = 58.. c'est ce que tu recois. :D

Mais ce que cela dit aussi c'est que la doc du moniteur dans "Le manuel technique du MO5" dit n'importe quoi. D'une part ca n'est pas un code ASCII qui est retourné mais un code physique. Ca n'est pas non plus le bit 7 qui est modifié, mais le bit Z (problème de TYPO lors de la saisie du texte par une secrétaire à l'époque? Le bit Z s'est transformé en bit 7 visuellement très similaire). Le commentaire du code source est aussi faux car il parle de $34 au lieur de $3A... là encore ca sent le pb de relecture de caractère car 4 et A sont visuellement très proches.

Bref en résumé la doc du FORTH indique un peu n'importe quoi à son tour ce qui n'est pas étonnant quand on voit les incohérences du code source et du commentaire. C'est bel et bien 3Ah (58 en décimal) qu'on récupère quand on appuie pas sur une touche.
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
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [FORTH] Fonction KEYF sur DCMOTO

Message par Daniel »

Cette confusion entre $34 et $3A m'a fait immédiatement soupçonner une erreur d'OCR, car le texte du listing a été obtenu moitié par OCR et moitié à la main (en l'occcurence c'est moi la secrétaire :wink: ). Ni moi, ni l'OCR ne prétendons être infaillibles.

J'ai donc repris les scans originaux de Fool-DupleX pour vérifier. Il n'y a pas de doute, l'erreur ($34) est bien dans le commentaire du document original. Le code lui-même, avec $3A, est juste car je l'ai comparé à la ROM du vrai MO5. D'ailleurs, dans ce document, je garantis qu'il n'y a aucune erreur de code, car quand on l'assemble il est identique au bit près à la ROM physique. Par contre, dans les commentaires, certaines petites coquilles de l'OCR ont pu m'échapper, malgré tout le soin apporté à la vérification.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Dominique
Messages : 828
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: [FORTH] Fonction KEYF sur DCMOTO

Message par Dominique »

Waouu ! Merci pour cette enquête précise et parfaitement documentée.
Tout ça m'arrange bien de pouvoir mettre un test KEYF = 58 ? et vérifier si une touche a été appuyée.

Code : Tout sélectionner

: ?INPUT 
           KEYF DUP 58 < IF                          ; KEYF < 58 ?
                           UP DOWN LEFT RIGHT        ; Si oui teste si Down Left Right ou Up
                           14 = IF                   ; Teste si touche "Q"
                                  PARAM              ; Si oui ouvre "saisie Paramètres"
                                  ENDIF              ; Fin IF
                         ELSE DROP                   ; si KEYF >= 58 jette la valeur dupliquée
                         ENDIF ;
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [FORTH] Fonction KEYF sur DCMOTO

Message par Daniel »

Pour enfoncer encore un peu le clou, voici la table des codes physiques des touches MO5 :

Code : Tout sélectionner

/*=================================================================\
| Clavier MO5                                  |
\==================================================================/
   | 0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f
 ------------------------------------------------------------------
 0 | N   EFF J   H   U   Y   7   6   ,   INS K   G   I   T   8   5
 1 | .   HOM L   F   O   R   9   4   @   RGT M   D   P   E   0   3
 2 | SPC DWN B   S   /   Z   -   2   X   LFT V   Q   *   A   +   1
 3 | W   UP  C   RAZ ENT CNT ACC STP MAJ BAS
On voit que le code $34 existe, c'est la touche ENTREE.
On voit aussi que le code le plus élevé est $39, c'est la touche BASIC.
Retourner $3A en l'absence de touche est parfaitement logique, retourner $34 serait parfaitement incohérent. cqfd.
Daniel
L'obstacle augmente mon ardeur.
XavInca

.

Message par XavInca »

.
Dernière modification par XavInca le 13 févr. 2017 23:10, modifié 3 fois.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [FORTH] Fonction KEYF sur DCMOTO

Message par Daniel »

Cette hypothèse est totalement infondée. Ce n'est pas bien d'écrire n'importe quoi pour nous embrouiller davantage.
Quand on ne sait pas il vaut mieux s'abstenir, ou alors vérifier avant d'avancer des explications farfelues. Voici le scan original :
ktst.png
ktst.png (40.81 Kio) Consulté 7151 fois
Il y a donc, comme le disait __sam__, deux graves erreurs en 4 lignes dans le manuel technique :evil:

[Edit]
Ce message répondait à une hypothèse de XavInca (effacée ensuite) sur la mauvaise qualité du scan ou de la conversion DjVu.
Dernière modification par Daniel le 14 févr. 2017 08:04, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.
XavInca

.

Message par XavInca »

.
Dernière modification par XavInca le 13 févr. 2017 23:10, modifié 2 fois.
Répondre