home *** CD-ROM | disk | FTP | other *** search
/ Mega CD-ROM 1 / megacd_rom_1.zip / megacd_rom_1 / FREEMACS / FAKE101.ZIP / FAKE101.ASM next >
Assembly Source File  |  1989-10-05  |  5KB  |  242 lines

  1. ;method cribbed from some pibterm code.  Thanks to Phil Burns for making
  2. ;the source available...
  3.  
  4. bios_data    segment at 40h
  5.         org 1Ah
  6. buffer_head    dw ?            ;pointer to keyboard buffer head
  7. buffer_tail    dw ?            ;pointer to keyboard buffer tail
  8.         org 80h
  9. buffer_start    dw ?            ;starting keyboard buffer address
  10. buffer_end    dw ?            ;ending keyboard buffer address
  11. bios_data    ends
  12.  
  13. code    segment
  14.     assume    cs:code
  15.  
  16.     org    100h
  17. start:
  18.     jmp    start_1
  19.  
  20. keyboard      label dword
  21. old9h         dw 2 dup (?)        ;old interrupt 9h vector
  22.  
  23. ;We look up the codes that we'll be modifying in our_codes.
  24. ;The replacements are in ctrl_codes or alt_codes.
  25.  
  26. our_codes    label    byte
  27.     db    72            ;Up Arrow
  28.     db    74            ;Minus
  29.     db    76            ;Five
  30.     db    78            ;Plus
  31.     db    80            ;Down Arrow
  32.     db    82            ;Ins
  33.     db    83            ;Del
  34.     db    15            ;Tab
  35.     db    53            ;/
  36.     db    55            ;Asterisk
  37.     db    57            ;Space
  38. ctrl_gate    label    byte        ;above this, we don't add ctrl-
  39.     db    71            ;Home
  40.     db    73            ;Pg Up
  41.     db    79            ;End
  42.     db    81            ;Pg Dn
  43.     db    75            ;Left Arrow
  44.     db    77            ;Right Arrow
  45.     db    1            ;-Esc
  46.     db    14            ;Back Space
  47.     db    26            ;{
  48.     db    27            ;}
  49.     db    28            ;Return
  50.     db    39            ;;
  51.     db    40            ;'
  52.     db    41            ;`
  53.     db    43            ;\
  54.     db    51            ;,
  55.     db    52            ;.
  56. codes_count    equ    $-our_codes
  57.  
  58. ctrl_codes    label    byte
  59.     db    141            ;C-Up Arrow
  60.     db    142            ;C-Minus
  61.     db    143            ;C-Five
  62.     db    144            ;C-Plus
  63.     db    145            ;C-Down Arrow
  64.     db    146            ;C-Ins
  65.     db    147            ;C-Del
  66.     db    148            ;C-Tab
  67.     db    149            ;C-Slash
  68.     db    150            ;C-Asterisk
  69.     db    167            ;C-         Fake for Freemacs
  70.  
  71. alt_codes    label    byte
  72.     db    152            ;M-Up Arrow
  73.     db    74            ;M-Minus
  74.     db    76            ;M-Five
  75.     db    78            ;M-Plus
  76.     db    160            ;M-Down Arrow
  77.     db    162            ;M-Ins
  78.     db    163            ;M-Del
  79.     db    165            ;M-Tab
  80.     db    164            ;M-Slash
  81.     db    55            ;M-Asterisk
  82.     db    168            ;M-         Fake for Freemacs
  83.  
  84.     db    151            ;M-Home
  85.     db    153            ;M-Pg Up
  86.     db    159            ;M-End
  87.     db    161            ;M-Pg Dn
  88.     db    155            ;M-Left Arrow
  89.     db    157            ;M-Right Arrow
  90.     db    1            ;M-Esc
  91.     db    14            ;M-Back Space
  92.     db    26            ;M-{
  93.     db    27            ;M-}
  94.     db    28            ;M-Return
  95.     db    39            ;M-;
  96.     db    40            ;M-'
  97.     db    41            ;M-`
  98.     db    43            ;M-\
  99.     db    51            ;M-,
  100.     db    52            ;M-.
  101.  
  102.  
  103.  
  104. ;-----------------------------------------------------------------------------
  105. ;KBINT handles interrupt 9 and generates new extended keycodes.
  106. ;-----------------------------------------------------------------------------
  107. kbint    proc near
  108.     sti                ;interrupts on
  109.     push    ax            ;save AX and BX
  110.     push    bx
  111.     push    cx
  112.     push    di
  113.     push    es
  114.  
  115.     in    al,60h            ;read scan code
  116.     push    cs
  117.     pop    es
  118.     mov    di,offset our_codes    ;look it up in the table.
  119.     mov    cx,codes_count
  120.     cld
  121.     repne    scasb
  122.     je    our_key            ;see if we should do ctrl versions.
  123. oldint:
  124.     pop    es
  125.     pop    di
  126.     pop    cx
  127.     pop    bx            ;restore AX and BX
  128.     pop    ax
  129.     jmp    keyboard        ;exit to BIOS handler
  130. ;
  131. ;Generate extended codes for Ctrl-
  132. ;
  133. our_key:
  134.     mov    ah,2            ;get shift key status
  135.     int    16h
  136.     and    al,0fh            ;just consider the four shift keys.
  137.     cmp    al,4            ;Just Ctrl key pressed?
  138.     jnz    checkalt        ;no, then check Alt key
  139.     cmp    di,offset ctrl_gate    ;Should we do these?
  140.     ja    oldint            ;no - let the bios do them.
  141.     mov    bl,cs:[ctrl_codes - our_codes + di - 1]
  142.     jmp    short process        ;process it
  143. ;
  144. ;Generate extended codes for Alt-
  145. ;
  146. checkalt:
  147.     cmp    al,8            ;Just Alt key pressed?
  148.     jnz    oldint            ;no, then exit to BIOS
  149.     mov    bl,cs:[alt_codes - our_codes + di - 1]
  150.  
  151. ;
  152. ;Reset the keyboard and clear the interrupt.
  153. ;
  154. process:
  155.     in    al,61h            ;read control port value
  156.     mov    ah,al            ;save it in AH
  157.     or    al,80h            ;set the high bit
  158.     out    61h,al            ;reset keyboard
  159.     mov    al,ah            ;retrieve original value
  160.     out    61h,al            ;enable keyboard
  161.     cli
  162.     mov    al,20h            ;end the interrupt
  163.     out    20h,al
  164.     sti
  165. ;
  166. ;Insert the new keycode into the keyboard buffer.
  167. ;
  168.     mov    ah,bl            ;transfer code to AH
  169.     xor    al,al            ;zero AL
  170.     push    dx            ;save DX and DS
  171.     push    ds
  172.     mov    bx,bios_data        ;point DS to BIOS data area
  173.     mov    ds,bx
  174.     assume    ds:bios_data
  175.     cli                ;interrupts off
  176.     mov    bx,buffer_tail        ;get current tail address
  177.     mov    dx,bx            ;transfer it to DX
  178.     add    dx,2            ;advance to next position
  179.     cmp    dx,buffer_end        ;wrap around if necessary
  180.     jne    buffer
  181.     mov    dx,buffer_start
  182. buffer:
  183.     cmp    dx,buffer_head        ;is the buffer full?
  184.     je    kbexit            ;yes, then exit now
  185.     mov    [bx],ax            ;insert keycode into buffer
  186.     mov    buffer_tail,dx        ;advance tail
  187. kbexit:
  188.     sti                ;enable interrupts
  189.     pop    ds            ;restore registers
  190.     assume ds:nothing
  191.     pop    dx
  192.  
  193.     pop    es
  194.     pop    di
  195.     pop    cx
  196.     pop    bx
  197.     pop    ax
  198.     iret                ;and exit
  199. kbint    endp
  200.  
  201. start_1:
  202. ;
  203. ;Determine whether or not the BIOS supports extended keyboard functions.
  204. ;
  205.     mov    ah,5            ;write FFFFh to keyboard buffer
  206.     mov    cx,0FFFFh
  207.     int    16h
  208.     mov    ah,10h            ;then read it back
  209.     int    16h
  210.     cmp    ax,0FFFFh        ;is AX set correctly?
  211.     je    is_ext_kbd        ;yes, then don't reset INT 9
  212. ;
  213. ;Point the interrupt 9 vector to the internal keyboard handler.
  214. ;
  215.     push    es
  216.     assume    es:nothing
  217.     mov    ax,3509h        ;get current vector
  218.     int    21h
  219.     mov    old9h,bx        ;save it
  220.     mov    old9h[2],es
  221.     mov    ax,2509h            ;then reset it
  222.     mov    dx,offset kbint
  223.     int    21h
  224.     pop    es
  225.     assume    es:code
  226.     mov    dx,offset start_1        ;TSR
  227.     int    27h
  228. ;
  229. ;They already have an extended keyboard.
  230. ;
  231. is_ext_kbd:
  232.     mov    dx,offset is_extended_msg
  233.     mov    ah,9
  234.     int    21h
  235.     int    20h
  236.  
  237. is_extended_msg    db    'You already have an extended keyboard$'
  238.  
  239. code    ends
  240.  
  241.     end    start
  242.