La Place des Développeurs Souris sur MSX Comment ça marche ?
aoineko
Membre non connecté
Conseiller Municipal
Hello,
Je compte ajouter le support des souris dans ma lib MSXgl et du coup, j'aimerais bien savoir comment ça marche ?
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 ?
Je compte ajouter le support des souris dans ma lib MSXgl et du coup, j'aimerais bien savoir comment ça marche ?
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.
Bastion Rebel
Membre non connecté
Conseiller Municipal
non le port joystick !!
j'ai ca si ca t'interesse !!
j'ai ca si ca t'interesse !!
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
aoineko
Membre non connecté
Conseiller Municipal
Oui, ça me permettra de tester sur un vrai MSX
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.
Vous auriez de la lecture sur le sujet ?
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.
Vous auriez de la lecture sur le sujet ?
On est toujours ignorant avant de savoir.
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
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
MSX un jour, MSX toujours !
ericb59
Membre non connecté
Conseiller Municipal
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
TurboSEB
Membre non connecté
Conseiller Municipal
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).
Questioncon de Béotien à la TurboSEB :
- possible dans le port manette A ?
- possible 2 souris en même temps ? Edité par TurboSEB Le 13/08/2022 à 11h36
Question
- 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)
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
aoineko
Membre non connecté
Conseiller Municipal
@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.
Faudra que je relise à tête reposée.
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.
Faudra que je relise à tête reposée.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
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
Edité par ericb59 Le 14/08/2022 à 09h08
aoineko
Membre non connecté
Conseiller Municipal
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 !
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
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.
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.
TurboSEB
Membre non connecté
Conseiller Municipal
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. Edité par TurboSEB Le 14/08/2022 à 19h25
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. Edité par TurboSEB Le 14/08/2022 à 19h25
MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
ericb59
Membre non connecté
Conseiller Municipal
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.
aoineko
Membre non connecté
Conseiller Municipal
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.
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.
aoineko
Membre non connecté
Conseiller Municipal
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 ?
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.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie