home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1993 May / SIMTEL_0593.ISO / msdos / keyboard / dvorak86.asm < prev    next >
Assembly Source File  |  1983-07-31  |  5KB  |  159 lines

  1.     page 62,132
  2. ; keyboard program for ibm pc
  3. ; from page 404 of May 1983 BYTE magazine;
  4.  
  5.  
  6.  
  7. kb_data equ     60h     ;keyboard data port
  8. kb_ctl  equ     61h     ;keyboard control port
  9.  
  10. data    segment at 40h
  11.         org     17h
  12. kb_flag label   byte    ;ram keyboard flag byte
  13.  
  14. data    ends
  15. cseg    segment
  16. assume  cs:cseg,ds:data
  17.  
  18. dvorak  db      ?       ;dvorak flag
  19.         org     100h
  20.  
  21. start:  mov     dx, 5Ch        ;set ds:dx to loc 5ch in program prefix
  22.         mov    al,9        ;set the keyboard interrupt (int9)
  23.         mov    ah,25h      ; to ds:dx via DOS function call
  24.     int     21h
  25.     mov     di,dx   ;move keyboard routine down so it starts
  26.         mov     si,keyadr       ; at loc 5ch in program prefix
  27.         mov     cx,keylen       ; (saves space)
  28.         jmp     finish
  29.  
  30.  
  31. ;keyboard interrupt routine.  copy beginning of IBM PC ROM routne to 
  32. ;allow easy jump to later ROM code
  33.  
  34. keybrd: push    ax      ;Save registers used
  35.         push    bx
  36.         push    cx
  37.         push    dx
  38.         push    si
  39.         push    di
  40.         push    ds
  41.         push    es
  42.         cld
  43.         mov     ax,data
  44.         mov     ds,ax
  45.         sti
  46.         in      al,kb_data      ;get key code
  47.         push    ax
  48.         in      al,kb_ctl       ;restore keyboard
  49.         mov     ah,al
  50.         or      al,80h
  51.         out     kb_ctl,al
  52.         xchg    ah,al
  53.         out     kb_ctl,al
  54.         pop     ax
  55.         mov     ah,al   ;save key code
  56.  
  57. ;end of copied ROM code.  Start special translations
  58.  
  59.         cmp     al,0ffh ;overrun?
  60.         jz      romkey
  61.         mov     di,tabadr       ;translate key code
  62.         cmp     cs:dvorak,28    ;use dvorak table?
  63.         jnz     keybr0
  64.         mov     di,tabddr       ;y
  65. keybr0: and     al,7fh          ;kill make/break bit
  66.         call    tran
  67.         test    ah,80h          ;break code?
  68.         jnz     romky0
  69.  
  70.         test    kb_flag,4       ;no. Ctrl key presse
  71.         mov     di,ctadr
  72.         jz      altran
  73.         cmp     al,28           ;yep. enter key? (use dvorak?)
  74.         jz    keybr2
  75. keybr1: cmp    al,1            ;escape key?  (leave dvorak?)
  76.         jnz     tran
  77. keybr2: mov     cs:dvorak,al
  78.         jmp     far ptr k26     ;restore regs and reti
  79.                 
  80. altran:    test    kb_flag,8       ;alt key pressed?
  81.         jz      romkey
  82.         mov     di,oaltlc
  83.         test    kb_flag,43h     ;shift?
  84.         jz      tran
  85.         mov     di,oaltuc
  86.  
  87. tran:   call    trans
  88.         jnz     romkey
  89.         jmp     far ptr k61
  90.  
  91. romky0: or      al,80h
  92. romkey: mov     ah,al
  93.         jmp             far ptr romadr
  94.  
  95. ;translate routine.  Replaces byte in string [di] by byte following
  96. ; matched byte.  Returns Z if no match found; NZ if match found.
  97.  
  98. trans:  cmp     al,cs:[di]
  99.         jz      xfnd
  100.         inc     di
  101.         inc     di
  102.         cmp     byte ptr cs:[di],0
  103.         jnz     trans
  104.         or      al,al
  105.         ret                             ;RNZ
  106. xfnd:   mov     al,cs:1[di]
  107.         ret                             ;RZ
  108.  
  109.  
  110. finish: rep     movsb
  111.         mov     dx,di           ;end pgm but leave keyboard resident
  112.         int     27h
  113.  
  114. table   db      43,42,74,43,0   ;backslash -> left shift, keypad- -> backslash
  115.  
  116. ;for a Dvorak keyboard use
  117.  
  118. tabled  db   16,40,17,51,18,52,19,25,20,21,21,33,22,34,23,46,24,19,25,38,26,53
  119.         db   30,30,31,24,32,18,33,22,34,23,35,32,36,35,37,20,38,49,39,31,40,12
  120.         db   44,39,45,16,46,36,47,37,48,45,49,48,50,50,51,17,52,47,53,44,0
  121.  
  122. ctable  db      15,15,72,21     ;ctl_backtab-> ctl-O, ctl-uparrow->ctl-u
  123.         db      80,10,0 ;ctl-downarrow->ctl-j
  124.  
  125. altlc   db      30,132,46,135,18,130,49,164,24,148,22,129,23,161,51,174,52,175
  126.         db      02,173,53,168,03,253,13,240,32,235,0
  127. altuc   db      30,142,46,128,18,138,49,165,24,153,22,154,02,173,53,168,05,156
  128.         db      41,247,13,241,32,127,0
  129.  
  130. keyend:
  131.  
  132.  
  133. cseg    ends
  134.  
  135. rom     segment         at 0f000h ;IBM ROM BIOS keyboard entry points
  136.         assume  cs:rom
  137.         org     0e9a8h
  138. romadr  label   far             ;perform all bu initial processing
  139.  
  140.         org     0ea5eh
  141. k26     label   far             ;restore registers and return
  142.  
  143.         org     0ea81h
  144. k1234   label   far             ;reboot (ctl-alt-del addr)
  145.         org     0ec0ch
  146. k61     label   far             ;store char in keyboard buffer and return
  147. rom     ends
  148.  
  149. keyadr  equ     (offset keybrd - offset start) + 100h
  150. keylen  equ     offset keyend - offset keybrd
  151. tabadr  equ     (offset table - offset keybrd) + 5Ch
  152.  
  153. tabddr  equ     (offset tabled - offset keybrd) + 5Ch
  154. ctadr   equ     (offset ctable - offset keybrd) + 5Ch
  155. oaltlc  equ     (offset altlc - offset keybrd) + 5Ch
  156. oaltuc  equ     (offset altuc - offset keybrd) + 5Ch
  157.  
  158.  
  159.         end     start