- Ce sujet contient 14 réponses, 4 participants et a été mis à jour pour la dernière fois par
PZAWA, le il y a 7 années et 10 mois.
-
CréateurSujet
-
18 mai 2017 à 16 h 58 min #3675
Ancien Membre
- Level 7
- Messages : 402
Je cherche une routine très simple et rapide pour lire le clavier en attaquant directement le hardware
-
CréateurSujet
-
AuteurRéponses
-
20 mai 2017 à 14 h 13 min #3741
PZAWA
- Level 6
- Messages : 316
Salut,
oauu c’est plus compliqué que je ne pensais… pour la lecture d’une touche pas de problème mais apres ca se corse. La doc nous dit qu’il faut faire pulse kdat (le mettre en phase basse) pendant au moins 1us.
Mais comment le faire pulser ??? après pas mal de prise de tête j’ai trouvé qu’apparemment en mettant le CIA en mode output et après input ça semble fonctionner. (et pas oublier de lire le registre d’interruption).
Voila le programme de test qui affiche dans le cli la valeur de $bfec01 lorsque une touche est presse (sans conversion « keystrobe ») en gras la partie qui nous intéresse.
start:
move.l 4,a6
lea dosname(PC),a1
move.l #33,d0
jsr -552(A6) ; Open library
tst d0
beq error
move.l d0,dosptr
showmsg:
move.l d0,a5
jsr -60(a5) ; dos_output
tst d0
beq.w end
move.l d0,dosoutptr
move.l d0,d1 ; dos_output
move.l #msg,d2 ; msgptr
move.l msglen,d3 ; len msg
jsr -48(a5) ; write ouput
initMain:
move.w $dff01c,saveintena
move.w #$7fff,$dff09a ; disable int
keytest:
move.b $bfec01,d0 ;read keyboard
move.l d0,d4 ;save on d4
btst #0,d4 ;key pressed ?
beq.s .suitemouse ;no so skip
move.l #STRBUFFER,A0 ;
bsr.w ConvVal2StrHexFunct ; convert value from keyboard
move.l dosoutptr,d1 ; dos_output
move.l #STRBUFFER,d2 ; str hex value
move.l #$4,d3 ; len msg
jsr -48(a5) ; write ouput
bset #6,$bfee01 ; CIA Output: ack with KDAT LOW ???
nop ; wait in case ofhave to write something ??
bclr #6,$bfee01 ; CIA Input : end of ack with KDAT HIGH ???
nop ;wait in case of
.suitekey:
move.b $bfed01,d0 ; by reading int reg of cia we ack int ???
.suitemouse
btst #6,$bfe001
bne keytest
end:
;– Restaure INT
move.w saveintena,d5
or.w #$c000,d5
move.w d5,$dff09a
move.l dosptr,a1
jsr -414(A6) ;close dos
rts
error:
move.l #-1,D0
rtsdosptr dc.l $0
dosname dc.b « dos.library »,0
msg dc.b « Keyboard Test (press mouse to quit) »,0,0
msglen dc.l msglen-msg
STRBUFFER dc.l 0,0,0,0,0,0,0,0,0,0,0
dosoutptr dc.l 0
saveintena dc.w 0mais j’avoue que c’est un peu fait au pif d’après la doc. Donc absolument pas certain si il n’y a pas de connerie dans la façon de faire…
21 mai 2017 à 7 h 27 min #3750Ancien Membre
- Level 7
- Messages : 402
Merci PZAWA!
Je me souvenais qu’il y avait une histoire de tempo…
J’ai une erreur d’exécution quand j’assemble avec VASM, je ne sais pas encore pourquoi, je regarde dès j’ai un peu de temps
21 mai 2017 à 12 h 50 min #3752donamiga
- Level 5
- Messages : 249
avec une interruption clavier, ça marchait sur un a1200 :
lea keybinterruption(pc),a0
move.l a0,$68.w ; ou (a1) avec a1=vbr
move.w #$c008,$9akeybinterruption:
movem.l d0-d7/a0-a6,-(sp)
andi.w #8,$dff01e
beq nointbtst #3,$bfed01 ; CIA-A ICR controle interruption. bit 3 = Serial Port int.
beq nokeylea $bfec01,a0 ; CIA-A SP données series clavier
moveq #0,d0
move.b (a0),d0
clr.b (a0)
not d0
ror.b #1,d0
move.b d0,bufkeybset #6,$bfee01 ; CIA-A CRA controle. bit 6=SPMODE =1 (sortie)
moveq #50,d0 ; peut etre remplacé par un delay CIA-Timer
dbf d0,*
bclr #6,$bfee01 ; CIA-A CRA bit 6=SPMODE = 0 (entrée)nokey: move.w #8,$dff09c
noint: movem.l (sp)+,d0-d7/a0-a6
rte21 mai 2017 à 13 h 18 min #3753PZAWA
- Level 6
- Messages : 316
Merci donAmiga
Donc il me manquais un delai pour la pulsation de KDAT.
Désolé Majikeyric: j’avais oublié d’inclure la fonction conv2hex et puis j’avais laissé quelques taches.
Donc le programme de test de lecture hardware de clavier dans le cli (et sans utiliser d »interruption) complet et compilé sous devpac2 devient:
start:
move.l 4,a6
lea dosname(PC),a1
move.l #33,d0
jsr -552(A6) ; Open library
tst d0
beq error
move.l d0,dosptr
showmsg:
move.l d0,a5
jsr -60(a5) ; dos_output
tst d0
beq.w end
move.l d0,dosoutptr
move.l d0,d1 ; dos_output
move.l #msg,d2 ; msgptr
move.l msglen,d3 ; len msg
jsr -48(a5) ; write ouput
initMain:
move.w $dff01c,saveintena
move.w #$7fff,$dff09a ; disable int
main:
keytest:
move.b $bfec01,d0 ; read keyboard
btst #0,d0 ; key pressed
beq.s .suitemouse ; no skip
;rawkey conversion
ror.b #1,d0
not.b d0
; show rawkey on dos output
move.l #STRBUFFER,A0 ; where convert
bsr.w ConvByte2StrHexFunct ; convert value from keyboard
move.l dosoutptr,d1 ; dos_output
move.l #STRBUFFER,d2 ; str hex value
move.l #$2,d3 ; len msg
jsr -48(a5) ; write ouput
; Acknowledge keyboard
bset #6,$bfee01 ; CIA Output: ack with KDAT LOW ???
moveq #50,d0 ; delai
dbf d0,*
bclr #6,$bfee01 ; CIA Input : end of ack with KDAT HIGH ???
.suitekey:
move.b $bfed01,d0 ; by reading int reg of cia we ack int ???
.suitemouse:
btst #6,$bfe001
bne.w main
end:
;– Restaure INT
move.w saveintena,d5
or.w #$c000,d5
move.w d5,$dff09a
move.l dosptr,a1
jsr -414(A6) ;close dos
rts
error:
move.l #-1,D0
rtsdosptr dc.l $0
dosname dc.b « dos.library »,0
msg dc.b « Keyboard Test (left mouse to quit) »,$0A,0
msglen dc.l msglen-msg
STRBUFFER dc.l 0,0,0,0,0,0,0,0,0,0,0
dosoutptr dc.l 0
saveintena dc.w 0
; CONVERSION HEXADECIMALE
;Notre fonction qui convertie le premier octet de D0 en valeur Hexa text dans un buffer pointer par A0
ConvByte2StrHexFunct: ;IN: D0 Value to Convert, A0=>String to fill Dec. OUT=>A0=Ao(in) FILL
movem.l D1/A0/A1,-(SP)
lea HEXACHAR(PC),A1 ; LOAD HexChar table
.Conv:
move.w D0,D1 ; val on d1
ror.w #4,D1 ; upper 4
and.w #$0F,D1 ; 4bits onlyt
move.b (A1,D1),(A0)+ ; get hex and write
and.w #$0F,D0 ; lower 4
move.b (A1,D0),(A0)+ ; get hex and write
.End:
move.b #0,(A0) ; END STRING
movem.l (SP)+,D1/A0/A1
rts
HEXACHAR DC.B « 0123456789ABCDEF »Maintenant il faut que je teste sur un Vrai Amiga.
22 mai 2017 à 22 h 34 min #3818PZAWA
- Level 6
- Messages : 316
Bon bein testée sur mon A600 et pas vraiment concluant. Cela marche lorsque on presse tranquillement quelques touches, mais il suffit de jouer un peu plus agressivement avec les touches du claviers pour qu’il se bloque
Et le délaie entre le out/in du CIA ne change rien du tout …
Je vais devoir regarder plus en détail en testant sur mon A500 (j’ai des doutes sur l’état de mon A600)…
J’espère seulement ne pas trop polluer ce post ?
23 mai 2017 à 0 h 59 min #3820donamiga
- Level 5
- Messages : 249
la plupart des progs utilisant le clavier en hardware (jeux) utilisent l’interruption clavier. meme les trainers (atx skol).
voir le fichier keyboard.s du kit de dev de WHDload
le delay est fait avec le vhpos (dans une interruption).int movem.l d0-d1/a0-a1,-(a7)
lea (_custom),a0
lea (_ciaa),a1
;check if keyboard has caused interrupt
btst #INTB_PORTS,(intreqr+1,a0)
beq .end
btst #CIAICRB_SP,(ciaicr,a1)
beq .end
;read keycode
move.b (ciasdr,a1),d0
;set output mode (handshake)
or.b #CIACRAF_SPMODE,(ciacra,a1)
;calculate rawkeycode
not.b d0
ror.b #1,d0move.l a0,-(a7)
lea (_keycode),a0 ;no ‘,pc’ because used absolut sometimes
move.b d0,(a0)
move.l (a7)+,a0;better would be to use the cia-timer to wait, but we arn’t know if
;they are otherwise used, so using the rasterbeam
;required minimum waiting is 75 µs, one rasterline is 63.5 µs
;a loop of 3 results in min=127µs max=190.5µs
moveq #3-1,d1
.wait1 move.b (vhposr,a0),d0
.wait2 cmp.b (vhposr,a0),d0
beq .wait2
dbf d1,.wait1;set input mode
and.b #~(CIACRAF_SPMODE),(ciacra,a1)
.end move.w #INTF_PORTS,(intreq,a0)
;to avoid timing problems on very fast machines we do another
;custom access
tst.w (intreqr,a0)
movem.l (a7)+,d0-d1/a0-a1
rte23 mai 2017 à 23 h 04 min #3843PZAWA
- Level 6
- Messages : 316
Salut DonAmiga :) et merci pour l’exemple
Je n’ai pas encore tester avec une interruption mais je voulais d’abord le faire sans. Même si c’est Majikeyric (J’espère que la routine de DonAmiga te suffit ? ) qui a ouvert la discussion, j’avoue en avoir fait maintenant une affaire personnel : comment lire le clavier par le hardware et sans passer par une interruption ?
J’avais déjà fait la modif avec une attente de raster pour être à peu prés certain du délai mais cela ne change rien: En fait dans mon code il suffit de supprimer le test si une touche est pressée (btst #0,d0 ; key pressed
beq.s .suitemouse ; no skip) pour que tout fonctionne sans bloquerComme si il fallait mettre le délaie entre la lecture et le in/out du CIA. Autre chose que j’ai remarqué: lorsque le délaie entre le in/out est trop long, la dernière touche pressée se bloque (c’est a dire la lecture de $bfec01 renvoi toujours la valeur de cette dernière pressée). Il faut presser une autre touche pour « débloquer ».
Quand j’aurai un peu de temps j’approfondirai le sujet je dégagerai les dosouput et à la place je mettrai des sons: cela allégera le listing et ce sera le meilleur des tests.
Enfin moralité de l’histoire: toujours tester sur un Vrai Amiga
30 mai 2017 à 16 h 04 min #4636Ancien Membre
- Level 7
- Messages : 402
Merci PZAWA et DonAmiga, ça marche super bien !!!
Perso je préfère passer par une interruption clavier vu qu’elle est immédiatement générée dès que le CIA à reçu le keycode de la touche appuyée\relachée. J’imagine que c’est ce qu’il y a de plus efficace. Plutôt que de scruter le clavier à chaque VBL et peut être perdre des appuis touches.
2 juin 2017 à 23 h 02 min #4988PZAWA
- Level 6
- Messages : 316
Cool merci surtout donAmiga
Mieux vaut passer par interruption pour une raison qui tue: impossible d’identifié (en tout cas je n’y suis pas arrivé) l’état de plusieurs touches en même temps en pooling.
Et je confirme mes dernières constatation: sans interruption, en mettant le délai avant (au moins 3 raster d’attente) l' »acknowledgement ». Dans ce dernier, entre le in/out du cia, aucun délai et j’obtiens un clavier musical suffisamment réactif mais à une condition: staccato obligatoire (en legato ça bloque
)
16 août 2017 à 13 h 41 min #10487donamiga
- Level 5
- Messages : 249
deterrage
juste pour dire que l’ancien membre, Majikeyric, est un des codeurs du jeu Lumberjack. Voir les 2 remakes Lumberjack et Lumberjack Reloaded sorti en juin
http://eab.abime.net/showthread.php?t=87505
http://eab.abime.net/showthread.php?t=86205
voir la video de Pixel Nation « Lumberjack in real forest » :
21 août 2017 à 11 h 32 min #11195StaffJim Neray
- Level 22
- Messages : 7236
Le jeu a été codé par Cobe. Codé en blitz d’ailleurs si je ne m’abuse.
Majikeyric ( @Speccy ) avait lui codé l’original sur C64 dont la version Amiga est inspirée.
A500 - A500 Plus - A600 HD - A1200 - A2000 - A3000 - A4000T - CD32 - C=64 - 1040STE - ...
Mon Amiga 500 Plus : A590, 2MB Chip, 2MB Fast, HD 1,2GB, Floppy ext.
Mon Amiga 1200 : Blizzard 1260, 2MB Chip, 256MB Fast, HD 80GB, Overdrive CD
- Micromiga.com - La boutique Amiga -26 août 2017 à 19 h 38 min #11637PZAWA
- Level 6
- Messages : 316
Pourquoi Majikeyric ne fait plus partie des membres
Il s’est désinscrit ?
27 août 2017 à 11 h 38 min #11687StaffJim Neray
- Level 22
- Messages : 7236
@Pzawa : En résumant très vite; Un membre a fait un commentaire qui ne lui était pas forcément destiné et qu’il a mal pris. Du coup je lui ai dit sur le ton de la plaisanterie qu’il avait du passer une mauvaise journée. Et … bah a priori il n’avait pas envie de plaisanter et il a demandé de supprimer son compte. Bref au final rien de très conséquent juste un mal entendu qui a glissé trop vite.
A500 - A500 Plus - A600 HD - A1200 - A2000 - A3000 - A4000T - CD32 - C=64 - 1040STE - ...
Mon Amiga 500 Plus : A590, 2MB Chip, 2MB Fast, HD 1,2GB, Floppy ext.
Mon Amiga 1200 : Blizzard 1260, 2MB Chip, 256MB Fast, HD 80GB, Overdrive CD
- Micromiga.com - La boutique Amiga -27 août 2017 à 12 h 52 min #11692PZAWA
- Level 6
- Messages : 316
Merci pour ta réponse. Je me rappel effectivement de cet épisode … c’est quand même dommage
-
AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.