home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / rainbow / msdos / decus / RB139 / rb-tsr.lzh / RB-TSR.ASM next >
Assembly Source File  |  1986-11-03  |  3KB  |  112 lines

  1. ; RB-TSR.ASM
  2. ; Grabs firmware calls for Level 2 character input
  3. ; adapted from "Writing Desk accessories" by Tom Wadlow
  4. ;    BYTE magazine, Fall 1985 IBM issue, page 108
  5. ; Modified for Rainbow by Booth Hartley
  6. ;
  7. ; To build into an executable program:
  8. ; MASM RB-TSR;
  9. ; LINK RB-TSR;
  10. ; EXE2BIN RB-TSR RB-TSR.COM
  11. ;
  12. RB_firmware             equ     18h
  13. DOS_function            equ     21h
  14. DOS_terminate_resident  equ     27h
  15. get_vector              equ     35h
  16. set_vector              equ     25h
  17. ;
  18. cseg segment
  19.         assume  cs:cseg,ds:cseg
  20.         org     100h
  21. start:
  22.         jmp     initialize
  23. old_firmware  dd      ;set aside a double word for old keyboard vector
  24. n_chars_avail   db      0       ;number of chars avail
  25. char_buf        db      'a',0
  26. orig_di         dw
  27. ;
  28. keyboard_interceptor    proc far
  29.         assume  cs:cseg,ds:nothing
  30.         sti
  31.         cmp     di,2    ;is this a level 2 char_input request?        
  32.         jz      ki4
  33.         cmp     di,4    ;is this a level 2 status request?
  34.         jnz     ki2     ;jump if not
  35. ki4:    mov     orig_di,di     ;save di
  36.         mov     al,n_chars_avail   ;first see if we already have a char
  37.         cmp     al,0
  38.         jne     ki5     ;jump if have one
  39.         pushf           ;push flags to simulate an INT call
  40.         mov     di,6
  41.         assume  ds:nothing
  42.         call    old_firmware   ;use old firmware interrupt
  43.         cmp     cl,0    ;did we get a char?
  44.         je      ki1     ;jump if not
  45.         cmp     cl,01h  ;see if char in level 2 buffer
  46.         jne     ki3
  47.         mov     di,2    ;level 2 char input
  48.         jmp     ki2     ;use the char from level 2 buffer
  49. ;        
  50. ki3:
  51. ; check for lower case z. If found, convert to upper case
  52.         cmp     al,'z' 
  53.         jne     ki0     ;jump if not z
  54.         mov     al,'Z'
  55.         jmp     ki6
  56. ; same for upper case Z
  57. ki0:    cmp     al,'Z'  
  58.         jne     ki6
  59.         mov     al,'z'
  60. ki6:
  61.         mov     char_buf,al     ;put char into buffer
  62.         mov     al,1
  63.         mov     n_chars_avail,al
  64. ki5:    ; we know that there is a char in char_buf
  65.         mov     cl,0ffh ;say that char is avail
  66.         mov     di,orig_di
  67.         cmp     di,4    ;status only
  68.         je      ki1
  69.         dec     n_chars_avail
  70.         mov     al,n_chars_avail
  71.         mov     ah,0
  72.         mov     di,ax
  73.         mov     al,char_buf[di]
  74. ki1:    iret            ;return from the interrupt
  75. ;
  76. ;the following processes other functions by transferring control to
  77. ;the old handler
  78. ki2:
  79.         assume ds:nothing
  80.         jmp     old_firmware
  81. keyboard_interceptor    endp
  82. ;
  83. ;Application code should end here
  84. ;
  85. initialize:
  86.         mov     bx,cs
  87.         mov     ds,bx   ;ds points to code seg
  88. ; get the old firmware vector
  89.         mov     al,RB_firmware
  90.         mov     ah,get_vector
  91.         int     DOS_function
  92. ; save it
  93.         mov      word ptr old_firmware,bx
  94.         mov      word ptr old_firmware[2],es
  95. ;
  96. ;Set the firmware vector to our routine
  97.         mov     bx,cs
  98.         mov     ds,bx
  99.         mov     dx,offset keyboard_interceptor
  100.         mov     al,RB_firmware
  101.         mov     ah,set_vector 
  102.         int     DOS_function
  103. ;
  104.         mov     bx,cs
  105.         mov     ds,bx
  106.         mov     dx,offset initialize    ;point to the end of the resident code
  107.         int     DOS_terminate_resident
  108. ;
  109. cseg    ends
  110.         end     start
  111.