                        Chapter  6
                        
                    MOUSE Services Routine
                    ----------------------

 1. Introduction

    For system which supports the MOUSE, the ROM BIOS contains two mouse-
    related services, a PD ISR and a PD DSR (see Figure 1-1):

     * PD ISR
       The BIOS PD Interrupt Service Routine (ISR) is invoked via H/W INT
       74h each time the mouse is moved or the mouse button is pressed
       while the  mouse is enabled.  
       PD ISR stores the PD data temporarily in the PD buffer, when it 
       accummulates the PD data to reach the package size, it will pass a
       package of PD data through the system stack to the mouse driver.

     * PD DSR
       The BIOS PD Device Service Routine (DSR) is invoked via S/W INT 15h,
       AH=0C2h.  It is different from the keyboard DSR. PD DSR provides 
       some functions to initialize mouse, enable/disable mouse, set the 
       mouse configurations such as sample rate, resolution ..., and so on,
       but it doesn't provide users access to the PD data.


 <ÄÄ H/W ÄÄ>³<ÄÄÄÄ BIOS Level ÄÄÄÄÄÄÄÄ>³<ÄÄÄÄÄ User's Level ÄÄÄÄÄÄÄÄÄÄÄÄ>
    Level

   PD H/W    ÚÄÄÄÄÄÄÄÄ¿                ÚÄÄÄÄÄÄÄÄ¿       ÚÄÄÄÄÄÄÄÄ¿
   Interrupt ³        ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>³ System ÃÄÄÄÄÄÄ>³ MOUSE  ÃÄÄ> MOUSE
    (IRQ 12) ³ PD ISR ³   ÚÄÄÄÄÄÄÄÄÄÄÄ¿³ Stack  ³       ³ Driver ³    AP
   ÚÄÄÄÄÄÄÄÄ>³        ³<Ä>³ PD buffer ³ÀÄÄÄÄÄÄÄÄÙ       ÀÄÄÄÄÂÄÄÄÙ
   ³         ³ INT 74h³   ÀÄÄÄÄÄÄÄÄÄÄÄÙ                      ³
   ³         ³        ³   ÚÄÄÄÄÄÄÄÄÄÄÄ¿                      ³
   ³         ³        ³<Ä>³ PD flags  ³                      ³
 ÚÄÁÄÄ¿      ÀÄÄÄÄÄÄÄÄÙ Ú>ÀÄÄÄÄÄÄÄÄÄÄÄÙ                      ³
 ³ PD ³<¿               ³   Extended                         ³
 ÀÄÄÄÄÙ ³               ³   BIOS Data                        ³
        ³    ÚÄÄÄÄÄÄÄÄ¿ ³                                    ³
        ³    ³        ÃÄÙ                                    ³
        ³    ³ PD DSR ³                                      ³
        ÀÄÄÄÄ´        ³                                      ³
             ³ INT 15h³<ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
             ³ AH=0C2h³
             ³        ³
             ÀÄÄÄÄÄÄÄÄÙ

              Figure 1-1. The roles of the PD ISR and PD DSR
              ----------------------------------------------

 2. PD ISR (INT 74h) Operation

    2.1 PD H/W Architecture
        Please refer to Keyboard Services (Figure 2-1) for PD H/W
        architecture.  It must use the keyboard controller 8042 to support
        the PS/2 MOUSE.

    2.2 PD Data
        The data structure that PD ISR passes onto the device driver is 
        called "package".  Normally, one package contains 3 bytes as shown:

          1st byte - status
                bit 0 - left button status
                      - 1 : pressed
                bit 1 - right button status
                      - 1 : pressed
                bit 2 - reserved (must be 0)
                bit 3 - reserved (must be 1)
                bit 4 - X data sign
                      - 1 negative
                bit 5 - Y data sign
                      - 1 negative
                bit 6 - X data overflow
                      - 1 overflow
                bit 7 - Y data overflow
                      - 1 overflow
          2nd byte - X data
                bit 0 - least significant bit
                bit 7 - most  significant bit
          3rd byte - Y data
                bit 0 - least significant bit
                bit 7 - most  significant bit

    2.3 PD ISR Processing
        The PD ISR simply collects one package of the PD data in PD buffer,
        and maintains the PD flags.  PD buffer and PD flags are all in the
        extended BIOS data area as shown:

        022h        device drive far call offset
        024h        device drive far call segment
        026h        pointing device flag
                    bit 7   -- command in progress
                    bit 6   -- resend
                    bit 5   -- acknowledge
                    bit 4   -- error
                    bit 3   -- reserved = 0
                    bit 2-0 -- index count of input data

        027h        pointing device flag
                    bit 7   -- device drive far call flag
                    bit 6   -- Pointer device interface initialization ok
                    bit 5-3 -- reserved
                    bit 2-0 -- package size
        028h-02Fh   Pointing device buffer

        When PD ISR collects the PD data to reach the package size, it will
        pass a package of PD data through the system stack to the mouse 
        driver.


 3. PD DSR (INT 15h, AH=0C2h) Operation

    PD DSR initializes the mouse to function as follows:

       For all functions of the pointing device, the output is as follows:
               (cy) = 0 -- operation successfully completed
                    = 1 -- unsuccesful operation
               (ah) = status
                       00 - no error
                       01 - invalid function call
                       02 - invalid function input
                       03 - error
                       04 - reserved
                       05 - no far call installed
                       06 - reserved

        ENABLE OR DISABLE POINTING DEVICE
        input:
                (ah) = c2h
                (al) = 0 
                (bh) = 0        disable the pointing device
                     = 1        enable  the pointing device
                     > 1        Invalid function call
        output: See the note as described above.

        RESET POINTING DEVICE
        input:
                (ah) = c2h
                (al) = 1 
        output: See the note as described above.
                bx = device ID if operation is successful

        Notes:
              After reset, the pointing device situation is
              described as follows:
              - It is disabled unless the flag of pointing device   
                interface initialization is set.
              - Sample rate at 100 reports/sec
              - Resolution at 4 counts/millimeter
              - Scaling at 1 to 1
              - Package size remain unchanged

        SET SAMPLE RATE
        input:
                (ah) = c2h
                (al) = 2 
                (bh) = rate value
                     = 0   - 10 reports/sec
                     = 1   - 20 reports/sec
                     = 2   - 40 reports/sec
                     = 3   - 60 reports/sec
                     = 4   - 80 reports/sec
                     = 5   -100 reports/sec
                     = 6   -200 reports/sec
                     > 6   -Invalid input
                        
        output: See the note as described above.

        SET RESOLUTION
        input:
                (ah) = c2h
                (al) = 3 
                (bh) - resolution value
                     = 0    - 1 count /mm
                     = 1    - 2 counts/mm
                     = 2    - 4 counts/mm
                     = 3    - 8 counts/mm  
                     > 3    - Invalid input

        output: See the note as described above.

        READ DEVICE TYPE
        input:
                (ah) = c2h
                (al) = 4 

        output: See the note as described above.
                If operation is successfully completed then
                (bh) = device ID

        INITIALIZATION
        input:
                (ah) = c2h
                (al) = 5 
                (bh) - data package size
                     = 1    -  1 byte
                     = 2    -  2 bytes
                     = 3    -  3 bytes
                     = 4    -  4 bytes
                     = 5    -  5 bytes
                     = 6    -  6 bytes
                     = 7    -  7 bytes
                     = 8    -  8 bytes
                     > 8    -  Invalid input
 
        output: See the note as described above.
                The pointing device state is as follows:
                . Disabled
                . Sample rate at 100 reports/sec
                . Resolution at 4 counts/millimeter
                . Scaling at 1 to 1


        EXTENDED COMMAND
        input:
                (ah) = c2h
                (al) = 6 
                (bh) = 0      return status

        output: See the note as described above.

                If operation is successfully completed then
                (bl) - status byte 1
                        bit 7 = 0 - reserved
                        bit 6 = 0 - stream mode
                              = 1 - remote mode
                        bit 5 = 1 - pointer enable
                        bit 4 = 0 - 1:1 scaling
                              = 1 - 2:1 scaling  
                        bit 3 = 0 - reserved
                        bit 2 = 1 - left butten pressed
                        bit 1 = 0 - reserved
                        bit 0 = 1 - right butten pressed
                (cl) - status byte 2
                        00  - 1 count /mm
                        01  - 2 counts/mm
                        02  - 4 counts/mm
                        03  - 8 counts/mm

                (dl) - status byte 3
                        0a  - 10 reports/sec
                        14  - 20 reports/sec
                        2b  - 40 reports/sec
                        3c  - 60 reports/sec
                        50  - 80 reports/sec
                        64  -100 reports/sec
                        c8  -200 reports/sec

        input:
                (ah) = c2h
                (al) = 6 
                (bh) = 1      set scaling to 1:1
        output: See the note as described above.

        input:
                (ah) = c2h
                (al) = 6 
                (bh) = 2      set scaling to 2:1
        output: See the note as described above.

        input:
                (ah) = c2h
                (al) = 6 
                (bh) > 2      Illegal function call
        output: See the note as described above.


        DEVICE DRIVER FAR CALL
        input:
                (ah) = c2h
                (al) = 7 
                (es) = segment pointer     
                (bx) = offset  pointer
        output:
                none

