; *------------------------------------------------------------------------* ; * CLAVIER * ; *------------------------------------------------------------------------* ; Change le couple Scancode/ASCII d'une ou plusieurs touche du clavier. ; Pour les tests, la table TCFr est remplacé par la table TCAm car les tests sont effectués avec ; un clavier déjà en Français, la procédure le transforme donc en clavier Américain. CLAVIER SEGMENT ORG 100h ASSUME CS:CLAVIER JMP debut ;--Variables et constantes---------------------------------------------------- CLA_type_francais DB 1 ;--TYPE_FRANCAIS (CLAVIER) ; Si la variable est à 1, le clavier est Français ;>> Table clavier américain (a partir du Français, pour tests) TCAm: DB '&', 02, '1', 02 DB '1', 02, '!', 02 DB '‚', 03, '2', 03 DB '2', 03, '@', 03 DB '"', 04, '3', 04 DB '3', 04, '#', 04 DB 39, 05, '4', 05 DB '4', 05, '$', 05 DB '(', 06, '5', 06 DB '5', 06, '%', 06 DB '-', 07, '6', 07 DB '6', 07, '^', 07 DB 'Š', 08, '7', 08 DB '7', 08, '&', 08 DB '_', 09, '8', 09 DB '8', 09, '*', 09 DB '‡', 10, '9', 10 DB '9', 10, '(', 10 DB '…', 11, '0', 11 DB '0', 11, ')', 11 DB ')', 12, '-', 12 DB 'ø', 12, '_', 12 DB 'A', 16, 'Q', 16 DB 'a', 16, 'q', 16 DB 'Z', 17, 'W', 17 DB 'z', 17, 'w', 17 DB '‰', 26, '{', 26 DB 'ˆ', 26, '[', 26 DB '$', 27, ']', 27 DB 'œ', 27, '}', 27 DB 'Q', 30, 'A', 30 DB 'q', 30, 'a', 30 DB 'M', 39, ':', 39 DB 'm', 39, ';', 39 DB '-', 40, 39, 40 DB '"', 40, '%', 40 DB '%', 40, 00, 40 DB '*', 43, '\', 43 DB 'æ', 43, '|', 43 DB 'W', 44, 'Z', 44 DB 'w', 44, 'z', 44 DB ',', 50, 'm', 50 DB '?', 50, 'M', 50 DB ';', 51, ',', 51 DB '.', 51, '<', 51 DB ':', 52, '.', 52 DB '/', 52, '>', 52 DB 'õ', 53, '?', 53 DB '!', 53, '/', 53 DB '<', 86, '\', 86 DB '>', 86, '|', 86 DB '~', 03, 00, 79h DB '#', 04, 00, 7Ah DB '{', 05, 00, 7Bh DB '[', 06, 00, 7Ch DB '|', 07, 00, 7Dh DB '`', 08, 00, 7Eh DB '\', 09, 00, 7Fh DB '^', 10, 00, 80h DB '@', 11, 00, 81h DB ']', 12, 00, 82h DB '}', 13, 00, 83h DB 00, 00, 00, 00 ;>> Table clavier fran‡ais TCFr: DB '1', 02, '&', 02 DB '!', 02, '1', 02 DB '2', 03, '‚', 03 DB '@', 03, '2', 03 DB '3', 04, '"', 04 DB '#', 04, '3', 04 DB '4', 05, 39, 05 DB '$', 05, '4', 05 DB '5', 06, '(', 06 DB '%', 06, '5', 06 DB '6', 07, '-', 07 DB '^', 07, '6', 07 DB '7', 08, 'Š', 08 DB '&', 08, '7', 08 DB '8', 09, '_', 09 DB '*', 09, '8', 09 DB '9', 10, '‡', 10 DB '(', 10, '9', 10 DB '0', 11, '…', 11 DB ')', 11, '0', 11 DB '-', 12, ')', 12 DB '_', 12, 'ø', 12 DB 'Q', 16, 'A', 16 DB 'q', 16, 'a', 16 DB 'W', 17, 'Z', 17 DB 'w', 17, 'z', 17 DB '{', 26, '‰', 26 DB '[', 26, 'ˆ', 26 DB ']', 27, '$', 27 DB '}', 27, 'œ', 27 DB 'A', 30, 'Q', 30 DB 'a', 30, 'q', 30 DB ':', 39, 'M', 39 DB ';', 39, 'm', 39 DB 39, 40, '-', 40 DB '"', 40, '%', 40 DB 00, 40, '%', 40 DB '\', 43, '*', 43 DB '|', 43, 'æ', 43 DB 'Z', 44, 'W', 44 DB 'z', 44, 'w', 44 DB 'm', 50, ',', 50 DB 'M', 50, '?', 50 DB ',', 51, ';', 51 DB '<', 51, '.', 51 DB '.', 52, ':', 52 DB '>', 52, '/', 52 DB '?', 53, 'õ', 53 DB '/', 53, '!', 53 DB '\', 86, '<', 86 DB '|', 86, '>', 86 DB 00, 79h, '~', 03 DB 00, 7Ah, '#', 04 DB 00, 7Bh, '{', 05 DB 00, 7Ch, '[', 06 DB 00, 7Dh, '|', 07 DB 00, 7Eh, '`', 08 DB 00, 7Fh, '\', 09 DB 00, 80h, '^', 10 DB 00, 81h, '@', 11 DB 00, 82h, ']', 12 DB 00, 83h, '}', 13 DB 00, 00, 00, 00 ;----------------------------------------------------------------------------- ;--Proc‚dures----------------------------------------------------------------- affiche PROC ; Affiche un caractŠre. ; AL doit contenir le code ASCII. PUSH AX PUSH BX MOV AH, 0Eh MOV BX, 0007h INT 10h POP BX POP AX RET affiche ENDP ;--- CLA_veri_buffer PROC ;--VERIfi_BUFFER (CLAVIER) ; Vérifi la présence d'une nouvelle touche dans le buffer clavier. ; Entrée(s): aucune ; Sortie(s): AX = 0 si aucune touche appuyée ; Utilise: rien PUSH BX PUSH DS PUSH SI MOV AX, 40h MOV DS, AX MOV SI, 1Ah LODSW MOV BX, AX LODSW CMP AX, BX JE VERI_pas_touche MOV AX, BX JMP VERI_fin VERI_pas_touche: XOR AX, AX VERI_fin: POP SI POP DS POP BX RET CLA_veri_buffer ENDP ;--- CLA_donn_touche PROC ;--DONNe_TOUCHE (CLAVIER) ; Donne le ScanCone et l'ASCCII de la touche dans le buffer clavier. ; Entrée(s): aucune ; Sortie(s): AX: ScanCode/ASCII ; Utilise: rien PUSH BX PUSH DX PUSH ES PUSH DI PUSH DS PUSH SI MOV AX, 40h MOV DS, AX MOV ES, AX MOV SI, 1Ah LODSW MOV BX, AX LODSW CMP AX, BX JNE DONN_recupere_touche MOV AX, 0 JMP DONN_termine DONN_recupere_touche: MOV SI, BX LODSW MOV DX, AX CMP BX, 3Ch JNE DONN_inc_pointeur MOV BX, 1Eh JMP DONN_maj_pointeur DONN_inc_pointeur: ADD BX, 2 DONN_maj_pointeur: MOV DI, 1Ah MOV AX, BX STOSW DONN_conversion: MOV AX, DX POP SI POP DS CMP CLA_type_francais, 1 JNE DONN_termine CALL CLA_conv_francais DONN_termine: POP DI POP ES POP DX POP BX RET CLA_donn_touche ENDP ;--- CLA_conv_francais PROC ;--CONVersion_FRANCAIS (CLAVIER) ; Coverti le clavier am‚ricain en fran‡ais ; Entr‚e(s): AX: ScanCode/ASCII ; Sortie(s): AX: ScanCode/ASCII ; Utilise: rien PUSH BX PUSH DS PUSH SI MOV BX, CS MOV DS, BX MOV SI, OFFSET TCAm ; Remplacer par TCFr MOV BX, AX CLD CONV_compare: LODSW CMP AX, 0 JE CONV_bon CMP AX, BX JE CONV_change LODSW JMP CONV_compare CONV_change: LODSW JMP CONV_finit CONV_bon: MOV AX, BX CONV_finit: POP SI POP DS POP BX RET CLA_conv_francais ENDP ;----------------------------------------------------------------------------- debut: ;--Code de test---------------------------------------------------------------- MOV AX, CS ; CS = DS = ES MOV DS, AX ; MOV ES, AX ; retour_saisie: CALL CLA_veri_buffer ; Quelque chose dans le buffer clavier CMP AX, 0 ; JE retour_saisie ; NON CALL CLA_donn_touche ; OUI, récupère le scanCode et l'ASCII CMP AL, 27 ; Touche [Echap] appuyée JE fin ; OUI affichage: CALL affiche ; On affiche JMP retour_saisie ; Retour fin: INT 20h ; Fin ;----------------------------------------------------------------------------- CLAVIER ENDS END