MSX Village forum

La Place des Développeurs Souris sur MSX Comment ça marche ?

aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 11/08/2022 à 13h24
Hello,
Je compte ajouter le support des souris dans ma lib MSXgl et du coup, j'aimerais bien savoir comment ça marche ? :hum
J'avais vu que dans le processeur graphique (MSX2 ?) il y avait des registres pour la gestion de la souris mais il me semble qu'on m'avait dit qu'ils n'étaient pas utilisé.
Du coup, comment ça marche ? Via le port RS-232 ?
Tous les modèles de souris de l'époque utilisaient le même système ?


On est toujours ignorant avant de savoir.
Github    
Bastion Rebel Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 21/09/2013 à 07h42

Messages: 1887

Le 11/08/2022 à 15h58
non le port joystick !!

j'ai ca si ca t'interesse !!
wp_20190522_18_32_37_pro_59ba1

wp_20190522_18_30_50_pro

wp_20190608_08_07_55_pro

wp_20190608_08_06_59_pro


TURBO-R FS-A1ST 512/128ko MSX2+ NMS 8250 F4 /Fix Audio /Ram 1/4Mb VDP9958 VRAM 192ko 2FDD SANYO WAVY PHC35J MSX2 NMS 8280 Ram 4Mb VDP9938 VRAM 192ko 2FDD NMS 8250 128/128ko 2FDD VG8235/39 128/128ko 1FDD SONY HB-F700D MSX1 MC810 32/16k VG 8020 64k HB75F 64k HX-22 64k RS232/ CX5M 32k HB501F EXT : My Exp 4X/[b] MegaFlashSCC 512ko/BERT R2/BEER CF/SUNRISE 2CF/FUNRICE V2.01/MAXIOL/MEGASCSI HDD-CD/SDMSX 1SD/FMPAC SRAM/NMS1205+1160/RS 232 Harukaze/GR8NET/DOS2/ HOMER V2 RAM512ko/Floppy Pack/MAXduino/ROM1664/FM Pak /GR8NET /AMIGA/ PC/ RaspB Pi(B) / ARDUINO
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 11/08/2022 à 16h34
Oui, ça me permettra de tester sur un vrai MSX :top
Tu peux me renvoyer ton catalogue en PM stp ? Il me semble que tu avais d'autres merveilles qui m'intéresse. Ça permettra de faire un envoi groupé.

Pour ce qui de la gestion de la souris côté logiciel j'ai trouvé qq infos sur MRC.
A priori y a des functions du BIOS mais uniquement sur MSX2 (et quelques MSX1).
Sinon, y a l'histoire du HIS pour détecter le périphérique, mais j'ai pas bien compris pour le moment. Je relirai ça à tête reposé.
Idem pour la lecture direct via le port du PSG... j'ai compris qu'il fallait lire 4 fois le port pour obtenir 2 entiers signés pour le déplacement X et Y, mais j'ai pas compris les histoires de timing. :gne
Vous auriez de la lecture sur le sujet ?


On est toujours ignorant avant de savoir.
Github    
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1512

Le 12/08/2022 à 05h42
Y a des infos dans pratique du MSX2 si je ne m'abuse, j'avais bricolé un truc en ASM y a longtemps avec un déplacement de souris. Mais en utilisant les routines du BIOS.
Je crois qu'il y a aussi des registres du vdp concernés (MSX2 only), et des variables système qui doivent stocker la position en abscisse et ordonnée, mais ce sont de vagues souvenirs :siffle


MSX un jour, MSX toujours ! :D
Site web    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 13/08/2022 à 09h31
Code C :
 
/*
 ___________________________________________________________
/               __           _                              \
|              / _|         (_)                             |
|             | |_ _   _ ___ _  ___  _ __                   |
|             |  _| | | / __| |/ _ \| '_ \                  |
|             | | | |_| \__ \ | (_) | | | |                 |
|             |_|  \__,_|___/_|\___/|_| |_| *               |
|                                                           |
|               The MSX C Library for SDCC                  |
|                   V1.2 - 08 2019                          |
|                                                           |
|                Eric Boez &  Fernando Garcia               |
|                                                           |
|          C   &   A S M    S O U R C E   C O D E           |
|                                                           |
|                                                           |
\___________________________________________________________/
*/
// Done with the help of GDX
//
// Mouse control function
// 
// Return the x and y offset of mouse in a 16 bits value.
// Return 0xFFFF if no mouse detected
// Mouse port codes are 
// Port 1 : 0x1310
// Port 2 : 0x6C20
//
unsigned int MouseRead(unsigned int MousePort) __naked
{
MousePort;
__asm
        ; Routine to read the mouse by direct accesses (works on MSX1/2/2+/turbo R)
        ;
        ; Input: DE = 01310h for mouse in port 1 (D = 00010011b, E = 00010000b)
        ;        DE = 06C20h for mouse in port 2 (D = 01101100b, E = 00100000b)
        ; Output: H = X-offset, L = Y-offset (H = L = 255 if no mouse)
 
        push ix
        ld ix,#0
        add ix,sp
        ld e,4(ix)
        ld d,5(ix)
        GTMOUS:
            di               ; DI useless if the routine is used during an interrupt
            ld  b,#30 ; Long delay for first read
            call    GTOFS2  ; Read bits 7-4 of the x-offset
            and #0x0F
            rlca
            rlca
            rlca
            rlca
            ld  c,a
            call    GTOFST  ; Read bits 3-0 of the x-offset
            and #0x0F
            or  c
            ld  h,a ; Store combined x-offset
            call    GTOFST  ; Read bits 7-4 of the y-offset
            and #0x0F
            rlca
            rlca
            rlca
            rlca
            ld  c,a
            call    GTOFST  ; Read bits 3-0 of the y-offset
            and #0x0F
            or c
            ld l,a          ; Store combined y-offset
            ei                 ; EI useless if the routine is used during an interrupt
            ld  b,#40
            call WAITMS
            pop ix
            ret
        GTOFST: ld b,#10
        GTOFS2: ld a,#15     ; Read PSG register 15 for mouse
            out (#0xA0),a
            in  a,(#0xA1)    ; preserve LED code/Kana state
            and #0x80
            or  d            ; mouse1 x0010011b / mouse2 x1101100b
;            ld a,d
            out (#0xA1),a    ; first pin8=1, at second pass pin8=0 and so on
            xor e            ; reverse pin 8 state
            ld d,a           ;
 
            call WAITMS        ; Wait before read : 100<>150 us for first read
                               ;                    50<>150 us for next reads
 
            ld a,#14
            out (#0xA0),a
            in a,(#0xA2)
            ret
        WAITMS:
            ld  a,b
        WTTR:
            djnz    WTTR
            .db  #0xED,#0x55   ; Back if Z80 (RETN on Z80, NOP on R800)
            rlca
            rlca
            ;add a,b
            ld  b,a
        WTTR2:
            djnz    WTTR2
            ld  b,a 
        WTTR3:
            djnz    WTTR3
            ret
__endasm;
}
 



Utilisation :

Code C :
 
    mx=125;   // Mouse start X position
    my=50;    // Mouse Start Y position
    PutSprite (0,0,mx,my,0);
    PutSprite (1,4,mx,my,0);
    PutSprite (2,8,mx,my,0);
    while (Inkey()!=27)   // Escape to Quit
    {
 
        MouseOffset=MouseRead(MousePort2);
        a=MouseOffset >> 8;
        b=MouseOffset & 0xFF;
        mx=mx-(a);
        my=my-(b);
      PutSprite (0,0,mx,my,0);
      PutSprite (1,4,mx,my,0);
      PutSprite (2,8,mx,my,0);
 
    }
 



Dans Fusion-C il y a aussi une version MouseReadTo, qui renvois les données vers une structure, ce qui est plus rapide, et inclus aussi l'état des boutons de la souris. Edité par ericb59 Le 13/08/2022 à 09h40


banniere-ericb59e
Site web    
TurboSEB Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 08/08/2010 à 20h57

Messages: 5886

Le 13/08/2022 à 11h34
Les programmes que j'utilise à la souris, nécessitent la souris connectée dans le port manette B, (la Lib de ericb59 semble le confirmé), cette souris possède 2 bouton de contrôle et peut être utilisé en tant que manette de jeu en appuyant au boot du MSX sur les 2 boutons (de mémoire).

Question con de Béotien à la TurboSEB : :D

- possible dans le port manette A ?
- possible 2 souris en même temps ? Edité par TurboSEB Le 13/08/2022 à 11h36



MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
   
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10731

Le 13/08/2022 à 14h41
TurboSEB :
peut être utilisé en tant que manette de jeu en appuyant au boot du MSX sur les 2 boutons (de mémoire).


c'est sur le bouton de gauche qu'il faut appuyer au boot du MSX pour transformer votre souris en joystick

mais pour avoir essayé c'est pas fait pour jouer :siffle


:noel
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 14/08/2022 à 02h16
@Eric59 J'utilise la même fonction trouvé sur MRC, mais c'est surtout la partie détection de la souris qui me pose problème.
D'après MRC, on est censé suivre le protocole MSX-HID pour connaitre le périphérique branché au port joystick.
J'ai lu les explications (https://www.msx.org/wiki/MSX-HID) mais j'ai pas tout compris. :gne
Faudra que je relise à tête reposée.


On est toujours ignorant avant de savoir.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 14/08/2022 à 09h08
Ce que tu cherches se trouve dans la HIDlib de Fabio Ricardo Schmidlin, dont tu as les sources ici : https://frs.badcoffee.info/tools.html

Edité par ericb59 Le 14/08/2022 à 09h08


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 14/08/2022 à 09h21
ericb59 :
Ce que tu cherches se trouve dans la HIDlib de Fabio Ricardo Schmidlin, dont tu as les sources ici : https://frs.badcoffee.info/tools.html


Super, merci ! :top


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 14/08/2022 à 18h16
granced :
Y a des infos dans pratique du MSX2 si je ne m'abuse


J'ai relu Pratique du MSX2, mais il y a seulement une version via le BIOS (qui ne fonctionne donc pas sur MSX1) et pas d'explication sur le fonctionnent "bas niveau".

ericb59 :
Ce que tu cherches se trouve dans la HIDlib de Fabio Ricardo Schmidlin, dont tu as les sources ici : https://frs.badcoffee.info/tools.html


Les explications qu'on y trouve semble être les mêmes qu'on trouve sur MRC (j'imagine que FRS a partagé sa doc).
Mais même en regardant le code et les explications, y a des trucs que je ne comprends toujours pas.
Ca m'embête car j'aime bien comprendre ce que je fais. ^^

Si on prend la fonction de lecture (à priori la détection marche de la même façon), y a 4 accès successifs en lecture sur le registre #14 du PSG après avoir écrit qq chose sur le registre #15.
Je comprends la finalité (récupérer 4 fois 4 bits qui représentent le déplacement X/Y de la souris), mais je ne comprends pas le processus.

En fait, je viens de regarder la fonction que j'utilise pour lire l'état du joystick et elle fonctionne sur le même principe (mais en une seule fois) : écriture dans le registre #15, puis lecture dans le #14.
C'est p'être ça le chainon manquant de ma compréhension. :hum
C'est quoi cette valeur qu'on écrit dans le registre #15 avant de lire l'état du port !?


On est toujours ignorant avant de savoir.
Github    
TurboSEB Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 08/08/2010 à 20h57

Messages: 5886

Le 14/08/2022 à 19h18
Une piste de recherche, la différence de fonctionnement mécanique qui abouti à un traitement numérique des données, entre une manette (1 a 2 simples interrupteurs actionnés en à un moment M avec un notion d'interruption dans le temps, genre on reste appuyer sur l'interrupteur durant un certain temps = une série de données durant ce temos ) et une souris (2 roues codeuses dans les deux sens de mouvement avec une électronique d'interrupteurs)

Y'a peut être une différence de traitement des données à ce niveau là. Du genre plus la souris est bougée vite, plus le curseur va vite, alors que c'est pas forcément le cas sur un jeu comme nemesis avec une manette. :tea Edité par TurboSEB Le 14/08/2022 à 19h25



MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 14/08/2022 à 19h36
aoineko :
C'est quoi cette valeur qu'on écrit dans le registre #15 avant de lire l'état du port !?


Registre 15 :
Ce registre permet de contrôler les broches des ports généraux à lire via le registre 14 ainsi
que l'état de la LED « code » ou « Kana » selon le type de clavier.
Bit 0 = Contrôle de la broche 6 du port général 1*
Bit 1 = Contrôle de la broche 7 du port général 1*
Bit 2 = Contrôle de la broche 6 du port général 2*
Bit 3 = Contrôle de la broche 7 du port général 2*
Bit 4 = Contrôle de la broche 8 du port général 1 (0 pour mode joystick standard)
Bit 5 = Contrôle de la broche 8 du port général 2 (0 pour mode joystick standard)
Bit 6 = Sélection du port général lisible via le registre 14 (1 pour port 2)
Bit 7 = Contrôle de la LED de la touche « code » ou « Kana ». (1 pour éteindre)
* Mettre à 1 si le port général est utilisé comme entrée (lecture).
Page

Donc tu mets à 1 les bit 0 à 4 pour pouvoir lire les données.


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 14/08/2022 à 20h09
Ca y est, je crois que j'ai compris ! :|
Dans le MSX Red Book, les bits #4 et #5 du registre 15 sont appelés « Pulse ».
A priori, c'est donc le fait de mettre ces bits à 1 qui "initie" le mode lecture du périphérique et c'est pourquoi dans le cas de la souris, ces bits sont reset après la première lecture.

Par contre, la fonction sur MRC ne respecte pas totalement le standard MSX.
Si j'ai bien compris, les 4 bits LSB du registre 15 devrait être à 1 et le bit #7 (Kana LED) devrait être préserver pour les machines japonaises.
Je posterai ma version corrigée.

EDIT: J'ai trouvé un article qui explique bien tout ça avec une fonction alternative (https://www.chibiakumas.com/z80/platform7.php#LessonP64). Le seul défaut par rapport à la version sur MRC, c'est qu'il n'y a pas le support des timing avec le R800.


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2907

Le 14/08/2022 à 23h20
J'obtiens les valeurs inverse de ce à quoi je m'attendais.
Quand je vais vers la droite, j'obtiens des valeurs négatives , et positives vers la gauche.
Pareil, verticalement ( vers le haut et vers le bas).
C'est normal ?


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie