[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

[FORTH] Fonction KEYF sur DCMOTO

Messagede Dominique » 13 Fév 2017 01:58

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 ?
Avatar de l’utilisateur
Dominique
 
Messages: 465
Inscription: 09 Mar 2010 14:37
Localisation: Limoges

Re: [FORTH] Fonction KEYF sur DCMOTO

Messagede __sam__ » 13 Fév 2017 09:01

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.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
surprise pour thomson...
__sam__
 
Messages: 3515
Inscription: 18 Sep 2010 12:08
Localisation: Brest et parfois les Flandres

Re: [FORTH] Fonction KEYF sur DCMOTO

Messagede Dominique » 13 Fév 2017 09:41

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 édition par Dominique le 13 Fév 2017 13:18, édité 1 fois.
Avatar de l’utilisateur
Dominique
 
Messages: 465
Inscription: 09 Mar 2010 14:37
Localisation: Limoges

Re: [FORTH] Fonction KEYF sur DCMOTO

Messagede __sam__ » 13 Fév 2017 11:39

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.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
surprise pour thomson...
__sam__
 
Messages: 3515
Inscription: 18 Sep 2010 12:08
Localisation: Brest et parfois les Flandres

Re: [FORTH] Fonction KEYF sur DCMOTO

Messagede Daniel » 13 Fév 2017 13:12

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.
Daniel
 
Messages: 9206
Inscription: 01 Mai 2007 18:30
Localisation: Vaucluse

Re: [FORTH] Fonction KEYF sur DCMOTO

Messagede Dominique » 13 Fév 2017 13:13

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 ;
Avatar de l’utilisateur
Dominique
 
Messages: 465
Inscription: 09 Mar 2010 14:37
Localisation: Limoges

Re: [FORTH] Fonction KEYF sur DCMOTO

Messagede Daniel » 13 Fév 2017 15:50

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.
Daniel
 
Messages: 9206
Inscription: 01 Mai 2007 18:30
Localisation: Vaucluse

.

Messagede XavInca » 13 Fév 2017 16:28

.
Dernière édition par XavInca le 14 Fév 2017 00:10, édité 3 fois.
XavInca
 

Re: [FORTH] Fonction KEYF sur DCMOTO

Messagede Daniel » 13 Fév 2017 17:26

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) Vu 242 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 édition par Daniel le 14 Fév 2017 09:04, édité 1 fois.
Daniel
L'obstacle augmente mon ardeur.
Daniel
 
Messages: 9206
Inscription: 01 Mai 2007 18:30
Localisation: Vaucluse

.

Messagede XavInca » 13 Fév 2017 19:18

.
Dernière édition par XavInca le 14 Fév 2017 00:10, édité 2 fois.
XavInca
 


Retourner vers Emulateurs et utilitaires

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron