home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / ASM / PMODN021.ZIP / KB.ASM < prev    next >
Encoding:
Assembly Source File  |  1999-01-19  |  3.7 KB  |  136 lines

  1. ; Original TASM code written by Tran
  2. ; Ported to NASM by Ike (a.k.a. Ivan Tomac)
  3.  
  4. %include "pmode.inc"
  5.  
  6. global  _kbtbl0
  7. global  _kbtbl1
  8. global  _kbchar
  9. global  _kbshift
  10. global  _kbhit
  11.  
  12. global  _initkb
  13. global  _resetkb
  14. global  _getch
  15. global  _clearkb
  16.  
  17. opmirq1         dd      0               ; old IRQ1 vektor
  18. ormirq1         dd      0               ; old real mode IRQ1 vektor
  19.  
  20. _kbtbl0         times 80h db    0       ; non-sticky keyboard table
  21. _kbtbl1         times 80h db    0       ; sticky keyboard table
  22. _kbchar         db      0               ; last key that was hit
  23. _kbshift        db      0               ; shift states for lask key
  24. _kbhit          db      0               ; 0=no key hit, 1=key hit available
  25.  
  26. kbrmirqbuf      times 21 db     0
  27.  
  28. kbxtbl          db      0,14,'1234567890-=',16,15,'qwertyuiop[]',13,0
  29.                 db      "asdfghjkl;'`",0,'\zxcvbnm,./',0,'*',0,32,0
  30.                 db      1,2,3,4,5,6,7,8,9,10,0,0,19,25,21,'-',23,'5'
  31.                 db      24,'+',20,26,22,17,18,0,0,0,11,12
  32.                 times 27h db    0
  33.                 db      0,14,'!@#$%^&*()_+',16,15,'QWERTYUIOP{}',13,0
  34.                 db      'ASDFGHJKL:"~',0,'|ZXCVBNM<>?',0,'*',0,32,0
  35.                 db      1,2,3,4,5,6,7,8,9,10,0,0,19,25,21,'-',23,'5'
  36.                 db      24,'+',20,26,22,17,18,0,0,0,11,12
  37.                 times 27h db    0
  38.  
  39. irq1:
  40.         push eax
  41.         push ebx
  42.         push ds
  43.         mov ds,[cs:_seldata]
  44.         in al,60h
  45.         movzx ebx,al
  46.         btr ebx,7
  47.         setnc al
  48.         mov [_kbtbl0+ebx],al
  49.         or [_kbtbl1+ebx],al
  50.         or al,al
  51.         jz short irq1d
  52.         mov ah,[_kbtbl0+2ah]
  53.         or ah,[_kbtbl0+36h]
  54.         mov bh,ah
  55.         shl bh,7
  56.         add bl,bh
  57.         movzx ebx,bl
  58.         mov al,[kbxtbl+ebx]
  59.         or al,al
  60.         jz short irq1d
  61.         mov [_kbchar],al
  62.         mov BYTE [_kbhit],1
  63.         mov al,[_kbtbl0+1dh]
  64.         shl al,1
  65.         or al,[_kbtbl0+38h]
  66.         shl al,1
  67.         or al,ah
  68.         mov [_kbshift],al
  69. irq1d:
  70.         pop ds
  71.         pop ebx
  72.         mov al,20h
  73.         out 20h,al
  74.         pop eax
  75.         sti
  76.         iretd
  77.  
  78. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  79. ; Initialize keyboard handler
  80. ; Out:
  81. ;   EAX,BX,EDX,EDI - ?
  82. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  83.  
  84. _initkb:
  85.         mov bl,1
  86.         call [_getirqvect]
  87.         mov [opmirq1],edx
  88.         mov edx,irq1
  89.         call [_setirqvect]
  90.         mov edi,kbrmirqbuf
  91.         call _rmpmirqset
  92.         mov [ormirq1],eax
  93.         ret
  94.  
  95. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  96. ; Reset keyboard handler
  97. ; Out:
  98. ;   EAX,BX,EDX - ?
  99. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  100.  
  101. _resetkb:
  102.         mov bl,1
  103.         mov eax,[ormirq1]
  104.         call _rmpmirqfree
  105.         mov edx,[opmirq1]
  106.         jmp [_setirqvect]
  107.  
  108. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  109. ; Get the last character pressed
  110. ; Out:
  111. ;   AL - case adjusted character
  112. ;   AH - shift state bits: 0=SHIFT, 1=ALT, 2=CTRL
  113. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  114.  
  115. _getch:
  116.         cmp BYTE [_kbhit],0
  117.         je _getch
  118.         mov BYTE [_kbhit],0
  119.         mov ax,word [_kbchar]
  120.         ret
  121.  
  122. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  123. ; Clear all kb stuff
  124. ; Out:
  125. ;   EAX,ECX,EDI - ?
  126. ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  127.  
  128. _clearkb:
  129.         mov edi,_kbtbl0
  130.         xor eax,eax
  131.         mov ecx,40h
  132.         rep stosd
  133.         mov BYTE [_kbshift],0
  134.         mov BYTE [_kbhit],0
  135.         ret
  136.