home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / ctask.zip / TSKKBD.ASM < prev    next >
Assembly Source File  |  1988-03-01  |  5KB  |  336 lines

  1. ;
  2. ;    CTask - Keyboard handler module.
  3. ;
  4. ;    Public Domain Software written by
  5. ;        Thomas Wagner
  6. ;        Patschkauer Weg 31
  7. ;        D-1000 Berlin 33
  8. ;        West Germany
  9. ;
  10. ;    This module traps the keyboard interrupts to allow task switching
  11. ;    on waiting for a character.
  12. ;    All characters are put into a (word)pipe, and can either be
  13. ;    read directly from the pipe, or through the normal INT 16 channels.
  14. ;
  15.     name    tskkbd
  16.     .model    large
  17. ;
  18.     public    _tsk_install_kbd
  19.     public    _tsk_remove_kbd
  20. ;
  21.     public    _t_read_key
  22.     public    _t_wait_key
  23.     public    _t_keyhit
  24. ;
  25.     include    tsk.mac
  26. ;
  27. BUFSIZE    =    80    ; max. number of chars in pipe
  28. ;
  29. intseg    segment at 0
  30.         org    09h*4
  31. hwdoff        dw    ?    ; keyboard hardware interrupt
  32. hwdseg        dw    ?
  33.         org    16h*4
  34. kbdoff        dw    ?    ; keyboard I/O interrupt
  35. kbdseg        dw    ?
  36. ;
  37. intseg    ends
  38. ;
  39. ;----------------------------------------------------------------------------
  40. ;
  41. ;    Variables
  42. ;
  43.     .data?
  44. ;
  45. key_avail    wpipe <>
  46. ;
  47. buffer        dw    BUFSIZE dup(?)
  48. ;
  49.     .code
  50. ;
  51. kbd_flag    db    0
  52. ;
  53. ;    Original Interrupt-Entries
  54. ;
  55. savhwd        label    dword        ; original hardware int entry
  56. savhwdoff    dw    ?
  57. savhwdseg    dw    ?
  58. ;
  59. savkbd        label    dword        ; original keyboard I/O entry
  60. savkbdoff    dw    ?
  61. savkbdseg    dw    ?
  62. ;
  63. ;
  64. ;---------------------------------------------------------------------------
  65. ;
  66.     .code
  67. ;
  68.     extrn    _create_wpipe: far
  69.     extrn    _delete_wpipe: far
  70.     extrn    _read_wpipe: far
  71.     extrn    _check_wpipe: far
  72.     extrn    _c_write_wpipe: far
  73. ;
  74. ;
  75. ;    void tsk_install_kbd (void)
  76. ;
  77. ;        Install keyboard handler
  78. ;
  79. _tsk_install_kbd    proc    far
  80. ;
  81.     mov    ax,BUFSIZE
  82.     push    ax
  83.     mov    ax,offset buffer
  84.     push    ds
  85.     push    ax
  86.     mov    ax,offset key_avail
  87.     push    ds
  88.     push    ax
  89.     call    _create_wpipe
  90.     add    sp,10
  91. ;
  92. ;    Save old interrupt vectors
  93. ;
  94.         push    es
  95.     xor    ax,ax
  96.     mov    es,ax
  97. ;
  98.         assume  es:intseg
  99. ;
  100.     mov    ax,kbdoff
  101.     mov    savkbdoff,ax
  102.     mov    ax,kbdseg
  103.     mov    savkbdseg,ax
  104. ;
  105.     mov    ax,hwdoff
  106.     mov    savhwdoff,ax
  107.     mov    ax,hwdseg
  108.     mov    savhwdseg,ax
  109. ;
  110. ;    Enter new Interrupt-Entries
  111. ;
  112.     cli
  113.     mov    kbdoff,offset kbdentry
  114.     mov    kbdseg,cs
  115.     mov    hwdoff,offset hwdentry
  116.     mov    hwdseg,cs
  117.     sti
  118.         pop     es
  119. ;
  120.     ret
  121. ;
  122.     assume    es:nothing
  123. ;
  124. _tsk_install_kbd    endp
  125. ;
  126. ;
  127. ;    void tsk_remove_kbd (void)
  128. ;
  129. ;        Un-install keyboard handler
  130. ;
  131. _tsk_remove_kbd    proc    far
  132. ;
  133. ;    Delete pipe
  134. ;
  135.     mov    ax,offset key_avail
  136.     push    ds
  137.     push    ax
  138.     call    _delete_wpipe
  139.     add    sp,4
  140. ;
  141.         push    es
  142.     xor    ax,ax
  143.     mov    es,ax
  144. ;
  145.         assume  es:intseg
  146. ;
  147. ;    Restore interrupt entries
  148. ;
  149.     cli
  150. ;
  151.     mov    ax,savkbdoff
  152.     mov    kbdoff,ax
  153.     mov    ax,savkbdseg
  154.     mov    kbdseg,ax
  155. ;
  156.     mov    ax,savhwdoff
  157.     mov    hwdoff,ax
  158.     mov    ax,savhwdseg
  159.     mov    hwdseg,ax
  160. ;
  161.     sti
  162. ;
  163.         pop     es
  164.     ret
  165. ;
  166.     assume    es:nothing
  167. ;
  168. _tsk_remove_kbd    endp
  169. ;
  170. ;
  171. ;---------------------------------------------------------------------------
  172. ;
  173. ;    int t_read_key (void)
  174. ;
  175. ;    Waits for key from keyboard. Returns char in lower byte,
  176. ;    Scan-Code in upper byte.
  177. ;
  178. _t_read_key    proc    far
  179. ;
  180.     xor    ax,ax        ; no timeout
  181.     push    ax
  182.     push    ax
  183.     mov    ax,offset key_avail
  184.     push    ds
  185.     push    ax
  186.     call    _read_wpipe
  187.     add    sp,8
  188.     ret
  189. ;    
  190. _t_read_key    endp
  191. ;
  192. ;
  193. ;    int t_wait_key (dword timeout)
  194. ;
  195. ;    Waits for key from keyboard. Returns char in lower byte,
  196. ;    Scan-Code in upper byte.
  197. ;
  198. _t_wait_key    proc    far
  199. ;
  200.     push    bp
  201.     mov    bp,sp
  202.     push    8[bp]        ; timeout
  203.     push    6[bp]
  204.     mov    ax,offset key_avail
  205.     push    ds
  206.     push    ax
  207.     call    _read_wpipe
  208.     add    sp,8
  209.     pop    bp
  210.     ret
  211. ;    
  212. _t_wait_key    endp
  213. ;
  214. ;
  215. ;    int t_keyhit (void)
  216. ;
  217. ;    Checks if char is available. Returns -1 if not, else the
  218. ;    character value. The character remains in the buffer.
  219. ;
  220. _t_keyhit    proc    far
  221. ;
  222.     mov    ax,offset key_avail
  223.     push    ds
  224.     push    ax
  225.     call    _check_wpipe
  226.     add    sp,4
  227.     ret
  228. ;
  229. _t_keyhit    endp
  230. ;
  231. ;---------------------------------------------------------------------------
  232. ;
  233. ;    INT 9 - Keyboard hardware interrupt
  234. ;
  235. hwdentry    proc    far
  236. ;
  237.     pushf
  238.     call    cs:savhwd    ; process key
  239.     push    ds
  240.     push    es
  241.     push    ax
  242.     push    bx
  243.     push    cx
  244.     push    dx
  245.     mov    ax,seg dgroup
  246.     mov    ds,ax
  247.     mov    es,ax
  248. ;
  249.     mov    ah,1
  250.     pushf
  251.     call    cs:savkbd    ; check if char available
  252.     jz    hwd_ret        ; return if not
  253. ;
  254.     xor    ah,ah    
  255.     pushf
  256.     call    cs:savkbd    ; get the key
  257. ;
  258.     push    ax        ; push key
  259.     mov    ax,offset key_avail
  260.     push    ds
  261.     push    ax
  262.     call    _c_write_wpipe
  263.     add    sp,6
  264. ;
  265. hwd_ret:
  266.     pop    dx
  267.     pop    cx
  268.     pop    bx
  269.     pop    ax
  270.     pop    es
  271.     pop    ds
  272.     iret
  273. ;
  274. hwdentry    endp
  275. ;
  276. ;---------------------------------------------------------------------------
  277. ;
  278. ;    INT 16 - Keyboard I/O
  279. ;
  280. kbdentry    proc    far
  281. ;
  282.     cmp    ah,2
  283.     jb    kbd_funcs
  284.     jmp    cs:savkbd    ; pass on functions >= 2
  285. ;    
  286. kbd_funcs:
  287.     sti
  288.     push    ds
  289.     push    es
  290.     push    dx
  291.     push    cx
  292.     push    bx
  293.     mov    bx,seg dgroup
  294.     mov    ds,bx
  295.     mov    es,bx
  296. ;
  297.     cmp    ah,1
  298.     jb    kbd_read
  299. ;
  300.     mov    bx,offset key_avail
  301.     push    ds
  302.     push    bx
  303.     call    _check_wpipe
  304.     add    sp,4
  305.     cmp    ax,0ffffh
  306.     jne    kbd_gotone
  307.     xor    ax,ax
  308. kbd_gotone:
  309.     pop    bx
  310.     pop    cx
  311.     pop    dx
  312.     pop    es
  313.     pop    ds
  314.     ret    2
  315. ;
  316. kbd_read:
  317.     xor    ax,ax
  318.     push    ax
  319.     push    ax
  320.     mov    bx,offset key_avail
  321.     push    ds
  322.     push    bx
  323.     call    _read_wpipe
  324.     add    sp,8
  325.     pop    bx
  326.     pop    cx
  327.     pop    dx
  328.     pop    es
  329.     pop    ds
  330.     iret
  331. ;
  332. kbdentry    endp
  333. ;
  334.     end
  335.  
  336.