;*****************************************
;** MACRO pour l'acces au clavier       **
;*****************************************
;*     NOTE:                             *
;*    Si la fonction NEW_key est utilise *
;*     alors Tablekey contient en        *
;*     permanence les touche enfoncees.  *
;*     il ne faut pas oublier de lancer  *           
;*     HOLD_key en fin de programme.     *
;*****************************************

NEW_KEY MACRO  
 JMP INST_KEY 

TABLEkey  DB 127 DUP(0)
LASTkey   DB 0
HOLDint09 DD 0


NEW_KEYB: 
 cli
 push di
 push bx
 push ax
 push ds
 mov ax,seg tablekey
 mov ds,ax
 mov di,offset tablekey
 in al,60h
 push ax
 in al,61h
 mov ah,al
 or al,10000000b
 out 61h,al
 mov al,ah
 out 61h,al
 pop ax
 cmp al,lastkey
 je endkeyb
 mov lastkey,al
 mov bl,al
 and bl,01111111b
 xor bh,bh
 mov ah,bh
 test al,10000000b
 jnz lache
 inc ah

lache:
 lea di,tablekey
 mov ds:[bx+di],ah
 
endkeyb:
 mov al,20h
 out 20h,al
 pop ds
 pop ax
 pop bx
 pop di
 sti
IRET

INST_KEY:
  MOV  AX,3509H
  INT  21H
  MOV  WORD PTR[HOLDint09+2],ES
  MOV  WORD PTR[HOLDint09],BX      ;Sauve l'adresse de l'int 09.
  
  PUSH DS
  MOV  AX,SEG NEW_KEYB
  MOV  DS,AX
  MOV  DX,OFFSET NEW_KEYB
  MOV  AX,2509H
  INT  21H                        ;Remplace par le nouveau  gestionaire.
  POP  DS
ENDM


HOLD_KEY MACRO
  PUSH DS
  MOV  AX,WORD PTR[HOLDint09+2]
  MOV  DS,AX
  MOV  DX,WORD PTR[HOLDint09]
  MOV  AX,2509H
  INT  21H
  POP DS
ENDM

KEY MACRO Touche
  XOR  BH,BH
  MOV  BL,TOUCHE
  PUSH DS
  MOV  AX,SEG TABLEKEY
  MOV  DS,AX
  LEA  SI,TABLEKEY
  ADD  SI,BX
  CLD
  LODSB
  CMP AL,1
  POP DS
ENDM
