home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / programming / misc_programming / int16.spc < prev    next >
Text File  |  1990-01-05  |  12KB  |  321 lines

  1.  
  2.         Specification of Keyboard Software Interrupt ( INT 16H )
  3.         --------------------------------------------------------
  4.  
  5. description:
  6.         Both INT 9h and INT 16h are keyboard interrupt.
  7.         INT 9h is keyboard interrupt handler which puts scan code/ASCII
  8.         code in keyboard buffer. Whereas INT 16h provides some function
  9.         to get the scan code/ASCII code from keyboard buffer.
  10.         In conclusion, we can consider INT 9h as hardware interrupt
  11.         service routine which serves as an interface between keyboard
  12.         and system(keyboard buffer), INT 16h is a software interrupt
  13.         service routine which serves as an interface between keyboard 
  14.         buffer and users.
  15.  
  16. function:       (keyboard I/O) 
  17.  
  18.          (ah) = 0   Read key
  19.          (ah) = 1   Read status
  20.          (ah) = 2   Return current shift status
  21.          (ah) = 3   Set typematic rate 
  22.          (ah) = 4   reserved
  23.          (ah) = 5   Write key
  24.          (ah) = 6 - 0fh reserved
  25.          (ah) = 10h Extented read key
  26.          (ah) = 11h Extented read status 
  27.          (ah) = 12h Extented return current shift status
  28.          (ah) = 13h - 0efh reserved     
  29.          (ah) = 0f0h -- Speed control
  30.         *(ah) = 0f1h -- Read speed status
  31.          (ah) = 0f2h -- Reserved
  32.         *(ah) = 0f4h -- Cache control
  33.         *(ah) = 0f5h -- Write Protect for disk
  34.          (ah) = 0f6h - 0ffh -- Reserved
  35.  
  36. NOTE:
  37.        1. * -- is Acer support special function only for i386 or i386SX
  38.           model.
  39.  
  40.        2. This interrupt must check if the current LED flag is equal to
  41.           the previous flag to insure whether it is changed or not.
  42.           If the LED flag is changed, indicating the user must have pressed
  43.           the key that affects the flag, this routine will send command to
  44.           the keyboard controller to correct the LED.
  45.           It seems redundant to do this action because the keyboard 
  46.           hardware interrupt (INT 9) supported by BIOS does this action too.
  47.           By consideration of one case,  INT 9 may be intercepted by
  48.           other application program which can ignore the setting of LED;
  49.           this rountine can correct this error now.
  50.  
  51. reference BIOS data area:
  52.  
  53.         40:17   keyboard flag 1
  54.         40:18   keyboard flag 2
  55.         40:1A   keyboard buffer head pointer
  56.         40:1C   keyboard buffer tail pointer
  57.         40:1E - 3D keyboard buffer
  58.         40:80   keyboard buffer starting address
  59.         40:82   keyboard buffer ending address
  60.         40:96   keyboard flag 3
  61.         40:97   keyboard LED flag
  62.  
  63. Note:   
  64.     1. If function number (AH) > 12h, AH = AH - 12h will be returned. This
  65.        is checked by IBM PC 3270 Emulation.
  66.  
  67.     2. Function 0,1,10h, and 11h must check if the current LED flag 
  68.        is equal to the previous flag to insure whether it is changed 
  69.        or not. If the LED flag is changed, update the LED.
  70.  
  71.     3. Check mode_indicator_update flag (bit 6 of 40:97) before update 
  72.        the LED.
  73.  
  74.     4. Remember to disable H/W interrupt when it access the BIOS data,
  75.        for preventing INT 9 access the same BIOS data at the same time.
  76.  
  77.  
  78. READ KEY
  79.         description:
  80.                 This function will read a set of scan code/ASCII code from
  81.                 keyboard buffer.  It will take the code away from keyboard
  82.                 buffer.  If the keyboard buffer is empty, it will wait
  83.                 until there is at least one pair of data available.
  84.  
  85.     input:    (ah) = 0
  86.  
  87.     output:    (ah) = scan code 
  88.                 (al) = ASCII char
  89.  
  90. Note:   
  91.     1. If the keyboard buffer is empty, call Keyboard Device Busy function
  92.        (INT 15h, AX=9002h)
  93.  
  94.     2. Throw away the invalid code (scan code <> 0 and ASCII char = 0F0h) 
  95.  
  96.     3. This function support the codes for 84-keys-compatible keyboard, so
  97.        it is necessary to do the following transformations:
  98.  
  99.        (1) Throw away the code for 101-keys keyboard such as F11, F12, ...
  100.            key (scan code > 84h) 
  101.  
  102.        (2) If the scan code <> 0 and the ASCII char = 0E0h, transfer the
  103.            ASCII char to 00h 
  104.  
  105.        (3) If the scan code = 0E0h, transfer it to the associated scan code 
  106.            ('Enter' & '/' keys at the Keypad of 101-key keyboard)
  107.  
  108.  
  109. READ STATUS
  110.         description:
  111.                 This function will return the keyboard buffer status
  112.                 to user, that is, it will tell the user whether krystroke
  113.                 is available or not. 
  114.  
  115.     input:    (ah) = 1
  116.  
  117.     output:    (zf) = 1 -- no keystroke queued
  118.                    (zf) = 0 -- keystroke is available in queue, key in ax
  119.  
  120. Note:   
  121.     1. If the keystroke is available in queue, fetch the code but don't 
  122.        take it away from the queue (that is, don't adjust the head pointer).
  123.        And it is the same as the Function 0 to support the codes for
  124.        84-keys-compatible keyboard. 
  125.  
  126.  
  127. RETURN CURRENT SHIFT STATUS
  128.         description:
  129.                 Whenever a "shift" key is pressed, no scan code/ASCII
  130.                 code is put into keyboard buffer. Instead, a shift
  131.                 status(one bit) is set. This function will tell you
  132.                 which key is depressed or which mode is set.
  133.  
  134.     input:    (ah) = 2
  135.  
  136.     output:    (al) = shift status
  137.         bit 0 = 1 -- right-shift   depressed
  138.         bit 1 = 1 -- left-shift    depressed
  139.         bit 2 = 1 -- ctrl-shift    depressed
  140.         bit 3 = 1 -- alt-shift     depressed
  141.         bit 4 = 1 -- scroll mode   set
  142.         bit 5 = 1 -- num lock mode set
  143.         bit 6 = 1 -- caps mode     set
  144.         bit 7 = 1 -- insert mode   set
  145.         Note :  All the other registers is restored.
  146.  
  147.  
  148. SET TYPEMATIC RATE
  149.         description:
  150.                 If a key(except shift status keys) is depressed, the
  151.                 keyboard handler will repeat the key until the key
  152.                 is released. This function supports the user to set
  153.                 typematic rate and delay time. The typematic rate is 
  154.                 the rate that the handler repeat the key. Delay time
  155.                 is the time between the first keystroke (normal) and
  156.                 the second keystroke (repeated).
  157.                 
  158.         input:  (ah) = 03h  
  159.                 (bl) - typematic rate (bit4-0)
  160.  
  161.                        00h = 30.0      10h = 7.5
  162.                        01h = 26.7      11h = 6.7
  163.                        02h = 24.0      12h = 6.0
  164.                        03h = 21.8      13h = 5.5
  165.                        04h = 20.0      14h = 5.0
  166.                        05h = 18.5      15h = 4.6
  167.                        06h = 17.1      16h = 4.3
  168.                        07h = 16.0      17h = 4.0
  169.                        08h = 15.0      18h = 3.7
  170.                        09h = 13.3      19h = 3.3
  171.                        0ah = 12.0      1ah = 3.0
  172.                        0bh = 10.9      1bh = 2.7
  173.                        0ch = 10.0      1ch = 2.5
  174.                        0dh =  9.2      1dh = 2.3
  175.                        0eh =  8.5      1eh = 2.1
  176.                        0fh =  8.0      1fh = 2.0
  177.  
  178.                 (bh) - delay value    (bit1-0)  
  179.  
  180.                        00h = 250ms      
  181.                        01h = 500ms       
  182.                        02h = 750ms      
  183.                        03h = 1000ms     
  184.  
  185.         output:
  186.                 none
  187.  
  188. WRITE KEY
  189.         description:
  190.                 This function will put scan code/ASCII code (supported
  191.                 by user) into keyboard buffer as if you strike a key.
  192.  
  193.         input:  (ah) = 5       
  194.                 (cl) - ASCII code       
  195.                 (ch) - scan code        
  196.  
  197.         output:
  198.                 none
  199.  
  200. EXTENEDED READ KEY
  201.         description:
  202.                 This function is corresponding to ah = 0, but supports
  203.                 the 101/102 keyboard.
  204.         
  205.         input:  (ah) = 10h      
  206.  
  207.         output: (ah) = scan code 
  208.                 (al) = ASCII code
  209.  
  210. Note:   
  211.  1. This function is corresponding to ah = 0, but supports the 101/102
  212.     keyboard.  So it is not necessary to do the transformations following
  213.     by the Note 3 of the Function 0.
  214.  
  215.  
  216. EXTENDED READ STATUS
  217.         description:
  218.                 This function is corresponding to ah = 1, but supports
  219.                 the 101/102 keyboard.
  220.  
  221.         input:  (ah) = 11h
  222.                  
  223.      output:  (zf) = 1 -- no keystroke queued
  224.                 (zf) = 0 -- keystroke is available in queue, key in ax
  225.  
  226. Note:   
  227.  1. This function is corresponding to ah = 1, but supports the 101/102
  228.     keyboard.  So it is not necessary to do the transformations following
  229.     by the Note 3 of the Function 0.
  230.  
  231.  
  232. EXTENDED RETURN CURRENT SHIFT STATUS
  233.         description:
  234.                 This function is corresponding to ah = 2, but supports
  235.                 the 101/102 keyboard.
  236.  
  237.        input:   (ah) = 12h  
  238.  
  239.        output:  
  240.  
  241.                 (al) = bits from (40:17)              
  242.  
  243.                 bit     7       ins_key_active
  244.                 bit     6       caps_key_active 
  245.                 bit     5       numlock_key_active
  246.                 bit     4       scroll_lock_active
  247.                 bit     3       alt_key_depress
  248.                 bit     2       control_key_depressed
  249.                 bit     1       left_shift_key_depressed
  250.                 bit     0       right_shift_key_depressed
  251.  
  252.  
  253.                 (ah) = bits for left and right ctl    
  254.                        and alt keys from (40:18) and (40:96)    
  255.                                              
  256.                 bit    0 ----- left_ctl_shift
  257.                 bit    1 ----- left_alt_shift
  258.                 bit    2 ----- right_ctl_shift
  259.                 bit    3 ----- right_alt_shift
  260.                 bit    4 ----- scroll_shift
  261.                 bit    5 ----- num_shift
  262.                 bit    6 ----- caps_shift
  263.                 bit    7 ----- sys_shift                                  
  264.  
  265.  
  266. SPEED CONTROL  
  267.         input:
  268.              (ah) = 0f0h
  269.                  *(al) = 0 ====> Set 6M
  270.                   (al) = 1 ====> Set 8M
  271.                   (al) = 2 ====> Set top speed
  272.                   (al) = 3 ====> Set toggle
  273.                  √(al) = 4 ====> Set 10M mode
  274.                  √(al) = 5 ====> Set 12M mode
  275.                   (al) = 6 ====> Reserved
  276.                  √(al) = 7 ====> Set PC mode
  277.                   (al) = 8 ====> Set smart mode
  278.                   (al) = 9 ====> CX = Scale (0--7)
  279.                                  Set speed scale
  280.  
  281. NOTE:
  282.        1. * -- is reserved on Acer 1100/33c and 1100SX(p9).
  283.        2. √ -- is supported by Acer 1100/20 and 1100/16 model only, other
  284.                model is reserved.
  285.        3. When set to top speed on 1100/25/20c and 1100/33c, cache on/off 
  286.           depend on status of CMOS.
  287.  
  288.  
  289.  
  290. READ SPEED MODE OR SPEED SCALE
  291.         
  292.         input:
  293.              (ah) = 0f1h
  294.         output:
  295.  
  296.              (ax) = 0 ====> 6M
  297.              (ax) = 1 ====> 8M
  298.              (ax) = 2 ====> Top speed
  299.              (ax) = 3 ====> Reserved
  300.              (ax) = 4 ====> 10M
  301.              (ax) = 5 ====> 12M
  302.              (ax) = 6 ====> Reserved
  303.              (ax) = 7 ====> PC
  304.              (ax) = 8 ====> Smart mode
  305.              (ax) = 9 ====> CX = SCALE (0--7)
  306.  
  307.  
  308. CACHE CONTROL  
  309.         input:
  310.              (ah) = 0f4h
  311.                   (al) = 0 ====> return cache controller status
  312.                   (al) = 1 ====> set cache on
  313.                   (al) = 2 ====> set cache off
  314.         output:
  315.                   (ah) = 0 ====> successful
  316.                   (cy) = 0 ====> successful
  317.                   (al) = 1 ====> cache on status
  318.                   (al) = 2 ====> cache off status
  319.                   (ah) = 1 ====> error
  320.                   (cy) = 1 ====> error
  321.