cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

atarikbd.rst (27288B)


      1====================================
      2Intelligent Keyboard (ikbd) Protocol
      3====================================
      4
      5
      6Introduction
      7============
      8
      9The Atari Corp. Intelligent Keyboard (ikbd) is a general purpose keyboard
     10controller that is flexible enough that it can be used in a variety of
     11products without modification. The keyboard, with its microcontroller,
     12provides a convenient connection point for a mouse and switch-type joysticks.
     13The ikbd processor also maintains a time-of-day clock with one second
     14resolution.
     15The ikbd has been designed to be general enough that it can be used with a
     16variety of new computer products. Product variations in a number of
     17keyswitches, mouse resolution, etc. can be accommodated.
     18The ikbd communicates with the main processor over a high speed bi-directional
     19serial interface. It can function in a variety of modes to facilitate
     20different applications of the keyboard,  joysticks, or mouse. Limited use of
     21the controller is possible in applications in which only a unidirectional
     22communications medium is available by carefully designing the default modes.
     23
     24Keyboard
     25========
     26
     27The keyboard always returns key make/break scan codes. The ikbd generates
     28keyboard scan codes for each key press and release. The key scan make (key
     29closure) codes start at 1, and are defined in Appendix A. For example, the
     30ISO key position in the scan code table should exist even if no keyswitch
     31exists in that position on a particular keyboard. The break code for each key
     32is obtained by ORing 0x80 with the make code.
     33
     34The special codes 0xF6 through 0xFF are reserved for use as follows:
     35
     36=================== ====================================================
     37    Code            Command
     38=================== ====================================================
     39    0xF6            status report
     40    0xF7            absolute mouse position record
     41    0xF8-0xFB       relative mouse position records (lsbs determined by
     42                    mouse button states)
     43    0xFC            time-of-day
     44    0xFD            joystick report (both sticks)
     45    0xFE            joystick 0 event
     46    0xFF            joystick 1 event
     47=================== ====================================================
     48
     49The two shift keys return different scan codes in this mode. The ENTER key
     50and the RETurn key are also distinct.
     51
     52Mouse
     53=====
     54
     55The mouse port should be capable of supporting a mouse with resolution of
     56approximately 200 counts (phase changes or 'clicks') per inch of travel. The
     57mouse should be scanned at a rate that will permit accurate tracking at
     58velocities up to 10 inches per second.
     59The ikbd can report mouse motion in three distinctly different ways. It can
     60report relative motion, absolute motion in a coordinate system maintained
     61within the ikbd, or by converting mouse motion into keyboard cursor control
     62key equivalents.
     63The mouse buttons can be treated as part of the mouse or as additional
     64keyboard keys.
     65
     66Relative Position Reporting
     67---------------------------
     68
     69In relative position mode, the ikbd will return relative mouse position
     70records whenever a mouse event occurs. A mouse event consists of a mouse
     71button being pressed or released, or motion in either axis exceeding a
     72settable threshold of motion. Regardless of the threshold, all bits of
     73resolution are returned to the host computer.
     74Note that the ikbd may return mouse relative position reports with
     75significantly more than the threshold delta x or y. This may happen since no
     76relative mouse motion events will be generated: (a) while the keyboard has
     77been 'paused' ( the event will be stored until keyboard communications is
     78resumed) (b) while any event is being transmitted.
     79
     80The relative mouse position record is a three byte record of the form
     81(regardless of keyboard mode)::
     82
     83    %111110xy           ; mouse position record flag
     84                        ; where y is the right button state
     85                        ; and x is the left button state
     86    X                   ; delta x as twos complement integer
     87    Y                   ; delta y as twos complement integer
     88
     89Note that the value of the button state bits should be valid even if the
     90MOUSE BUTTON ACTION has set the buttons to act like part of the keyboard.
     91If the accumulated motion before the report packet is generated exceeds the
     92+127...-128 range, the motion is broken into multiple packets.
     93Note that the sign of the delta y reported is a function of the Y origin
     94selected.
     95
     96Absolute Position reporting
     97---------------------------
     98
     99The ikbd can also maintain absolute mouse position. Commands exist for
    100resetting the mouse position, setting X/Y scaling, and interrogating the
    101current mouse position.
    102
    103Mouse Cursor Key Mode
    104---------------------
    105
    106The ikbd can translate mouse motion into the equivalent cursor keystrokes.
    107The number of mouse clicks per keystroke is independently programmable in
    108each axis. The ikbd internally maintains mouse motion information to the
    109highest resolution available, and merely generates a pair of cursor key events
    110for each multiple of the scale factor.
    111Mouse motion produces the cursor key make code immediately followed by the
    112break code for the appropriate cursor key. The mouse buttons produce scan
    113codes above those normally assigned for the largest envisioned keyboard (i.e.
    114LEFT=0x74 & RIGHT=0x75).
    115
    116Joystick
    117========
    118
    119Joystick Event Reporting
    120------------------------
    121
    122In this mode, the ikbd generates a record whenever the joystick position is
    123changed (i.e. for each opening or closing of a joystick switch or trigger).
    124
    125The joystick event record is two bytes of the form::
    126
    127    %1111111x           ; Joystick event marker
    128                        ; where x is Joystick 0 or 1
    129    %x000yyyy           ; where yyyy is the stick position
    130                        ; and x is the trigger
    131
    132Joystick Interrogation
    133----------------------
    134
    135The current state of the joystick ports may be interrogated at any time in
    136this mode by sending an 'Interrogate Joystick' command to the ikbd.
    137
    138The ikbd response to joystick interrogation is a three byte report of the form::
    139
    140    0xFD                ; joystick report header
    141    %x000yyyy           ; Joystick 0
    142    %x000yyyy           ; Joystick 1
    143                        ; where x is the trigger
    144                        ; and yyy is the stick position
    145
    146Joystick Monitoring
    147-------------------
    148
    149A mode is available that devotes nearly all of the keyboard communications
    150time to reporting the state of the joystick ports at a user specifiable rate.
    151It remains in this mode until reset or commanded into another mode. The PAUSE
    152command in this mode not only stop the output but also temporarily stops
    153scanning the joysticks (samples are not queued).
    154
    155Fire Button Monitoring
    156----------------------
    157
    158A mode is provided to permit monitoring a single input bit at a high rate. In
    159this mode the ikbd monitors the state of the Joystick 1 fire button at the
    160maximum rate permitted by the serial communication channel. The data is packed
    1618 bits per byte for transmission to the host. The ikbd remains in this mode
    162until reset or commanded into another mode. The PAUSE command in this mode not
    163only stops the output but also temporarily stops scanning the button (samples
    164are not queued).
    165
    166Joystick Key Code Mode
    167----------------------
    168
    169The ikbd may be commanded to translate the use of either joystick into the
    170equivalent cursor control keystroke(s). The ikbd provides a single breakpoint
    171velocity joystick cursor.
    172Joystick events produce the make code, immediately followed by the break code
    173for the appropriate cursor motion keys. The trigger or fire buttons of the
    174joysticks produce pseudo key scan codes above those used by the largest key
    175matrix envisioned (i.e. JOYSTICK0=0x74, JOYSTICK1=0x75).
    176
    177Time-of-Day Clock
    178=================
    179
    180The ikbd also maintains a time-of-day clock for the system. Commands are
    181available to set and interrogate the timer-of-day clock. Time-keeping is
    182maintained down to a resolution of one second.
    183
    184Status Inquiries
    185================
    186
    187The current state of ikbd modes and parameters may be found by sending status
    188inquiry commands that correspond to the ikbd set commands.
    189
    190Power-Up Mode
    191=============
    192
    193The keyboard controller will perform a simple self-test on power-up to detect
    194major controller faults (ROM checksum and RAM test) and such things as stuck
    195keys. Any keys down at power-up are presumed to be stuck, and their BREAK
    196(sic) code is returned (which without the preceding MAKE code is a flag for a
    197keyboard error). If the controller self-test completes without error, the code
    1980xF0 is returned. (This code will be used to indicate the version/release of
    199the ikbd controller. The first release of the ikbd is version 0xF0, should
    200there be a second release it will be 0xF1, and so on.)
    201The ikbd defaults to a mouse position reporting with threshold of 1 unit in
    202either axis and the Y=0 origin at the top of the screen, and joystick event
    203reporting mode for joystick 1, with both buttons being logically assigned to
    204the mouse. After any joystick command, the ikbd assumes that joysticks are
    205connected to both Joystick0 and Joystick1. Any mouse command (except MOUSE
    206DISABLE) then causes port 0 to again be scanned as if it were a mouse, and
    207both buttons are logically connected to it. If a mouse disable command is
    208received while port 0 is presumed to be a mouse, the button is logically
    209assigned to Joystick1 (until the mouse is reenabled by another mouse command).
    210
    211ikbd Command Set
    212================
    213
    214This section contains a list of commands that can be sent to the ikbd. Command
    215codes (such as 0x00) which are not specified should perform no operation
    216(NOPs).
    217
    218RESET
    219-----
    220
    221::
    222
    223    0x80
    224    0x01
    225
    226N.B. The RESET command is the only two byte command understood by the ikbd.
    227Any byte following an 0x80 command byte other than 0x01 is ignored (and causes
    228the 0x80 to be ignored).
    229A reset may also be caused by sending a break lasting at least 200mS to the
    230ikbd.
    231Executing the RESET command returns the keyboard to its default (power-up)
    232mode and parameter settings. It does not affect the time-of-day clock.
    233The RESET command or function causes the ikbd to perform a simple self-test.
    234If the test is successful, the ikbd will send the code of 0xF0 within 300mS
    235of receipt of the RESET command (or the end of the break, or power-up). The
    236ikbd will then scan the key matrix for any stuck (closed) keys. Any keys found
    237closed will cause the break scan code to be generated (the break code arriving
    238without being preceded by the make code is a flag for a key matrix error).
    239
    240SET MOUSE BUTTON ACTION
    241-----------------------
    242
    243::
    244
    245    0x07
    246    %00000mss           ; mouse button action
    247                        ;       (m is presumed = 1 when in MOUSE KEYCODE mode)
    248                        ; mss=0xy, mouse button press or release causes mouse
    249                        ;  position report
    250                        ;  where y=1, mouse key press causes absolute report
    251                        ;  and x=1, mouse key release causes absolute report
    252                        ; mss=100, mouse buttons act like keys
    253
    254This command sets how the ikbd should treat the buttons on the mouse. The
    255default mouse button action mode is %00000000, the buttons are treated as part
    256of the mouse logically.
    257When buttons act like keys, LEFT=0x74 & RIGHT=0x75.
    258
    259SET RELATIVE MOUSE POSITION REPORTING
    260-------------------------------------
    261
    262::
    263
    264    0x08
    265
    266Set relative mouse position reporting. (DEFAULT) Mouse position packets are
    267generated asynchronously by the ikbd whenever motion exceeds the setable
    268threshold in either axis (see SET MOUSE THRESHOLD). Depending upon the mouse
    269key mode, mouse position reports may also be generated when either mouse
    270button is pressed or released. Otherwise the mouse buttons behave as if they
    271were keyboard keys.
    272
    273SET ABSOLUTE MOUSE POSITIONING
    274------------------------------
    275
    276::
    277
    278    0x09
    279    XMSB                ; X maximum (in scaled mouse clicks)
    280    XLSB
    281    YMSB                ; Y maximum (in scaled mouse clicks)
    282    YLSB
    283
    284Set absolute mouse position maintenance. Resets the ikbd maintained X and Y
    285coordinates.
    286In this mode, the value of the internally maintained coordinates does NOT wrap
    287between 0 and large positive numbers. Excess motion below 0 is ignored. The
    288command sets the maximum positive value that can be attained in the scaled
    289coordinate system. Motion beyond that value is also ignored.
    290
    291SET MOUSE KEYCODE MODE
    292----------------------
    293
    294::
    295
    296    0x0A
    297    deltax              ; distance in X clicks to return (LEFT) or (RIGHT)
    298    deltay              ; distance in Y clicks to return (UP) or (DOWN)
    299
    300Set mouse monitoring routines to return cursor motion keycodes instead of
    301either RELATIVE or ABSOLUTE motion records. The ikbd returns the appropriate
    302cursor keycode after mouse travel exceeding the user specified deltas in
    303either axis. When the keyboard is in key scan code mode, mouse motion will
    304cause the make code immediately followed by the break code. Note that this
    305command is not affected by the mouse motion origin.
    306
    307SET MOUSE THRESHOLD
    308-------------------
    309
    310::
    311
    312    0x0B
    313    X                   ; x threshold in mouse ticks (positive integers)
    314    Y                   ; y threshold in mouse ticks (positive integers)
    315
    316This command sets the threshold before a mouse event is generated. Note that
    317it does NOT affect the resolution of the data returned to the host. This
    318command is valid only in RELATIVE MOUSE POSITIONING mode. The thresholds
    319default to 1 at RESET (or power-up).
    320
    321SET MOUSE SCALE
    322---------------
    323
    324::
    325
    326    0x0C
    327    X                   ; horizontal mouse ticks per internal X
    328    Y                   ; vertical mouse ticks per internal Y
    329
    330This command sets the scale factor for the ABSOLUTE MOUSE POSITIONING mode.
    331In this mode, the specified number of mouse phase changes ('clicks') must
    332occur before the internally maintained coordinate is changed by one
    333(independently scaled for each axis). Remember that the mouse position
    334information is available only by interrogating the ikbd in the ABSOLUTE MOUSE
    335POSITIONING mode unless the ikbd has been commanded to report on button press
    336or release (see SET MOUSE BUTTON ACTION).
    337
    338INTERROGATE MOUSE POSITION
    339--------------------------
    340
    341::
    342
    343    0x0D
    344    Returns:
    345            0xF7       ; absolute mouse position header
    346    BUTTONS
    347            0000dcba   ; where a is right button down since last interrogation
    348                       ; b is right button up since last
    349                       ; c is left button down since last
    350                       ; d is left button up since last
    351            XMSB       ; X coordinate
    352            XLSB
    353            YMSB       ; Y coordinate
    354            YLSB
    355
    356The INTERROGATE MOUSE POSITION command is valid when in the ABSOLUTE MOUSE
    357POSITIONING mode, regardless of the setting of the MOUSE BUTTON ACTION.
    358
    359LOAD MOUSE POSITION
    360-------------------
    361
    362::
    363
    364    0x0E
    365    0x00                ; filler
    366    XMSB                ; X coordinate
    367    XLSB                ; (in scaled coordinate system)
    368    YMSB                ; Y coordinate
    369    YLSB
    370
    371This command allows the user to preset the internally maintained absolute
    372mouse position.
    373
    374SET Y=0 AT BOTTOM
    375-----------------
    376
    377::
    378
    379    0x0F
    380
    381This command makes the origin of the Y axis to be at the bottom of the
    382logical coordinate system internal to the ikbd for all relative or absolute
    383mouse motion. This causes mouse motion toward the user to be negative in sign
    384and away from the user to be positive.
    385
    386SET Y=0 AT TOP
    387--------------
    388
    389::
    390
    391    0x10
    392
    393Makes the origin of the Y axis to be at the top of the logical coordinate
    394system within the ikbd for all relative or absolute mouse motion. (DEFAULT)
    395This causes mouse motion toward the user to be positive in sign and away from
    396the user to be negative.
    397
    398RESUME
    399------
    400
    401::
    402
    403    0x11
    404
    405Resume sending data to the host. Since any command received by the ikbd after
    406its output has been paused also causes an implicit RESUME this command can be
    407thought of as a NO OPERATION command. If this command is received by the ikbd
    408and it is not PAUSED, it is simply ignored.
    409
    410DISABLE MOUSE
    411-------------
    412
    413::
    414
    415    0x12
    416
    417All mouse event reporting is disabled (and scanning may be internally
    418disabled). Any valid mouse mode command resumes mouse motion monitoring. (The
    419valid mouse mode commands are SET RELATIVE MOUSE POSITION REPORTING, SET
    420ABSOLUTE MOUSE POSITIONING, and SET MOUSE KEYCODE MODE. )
    421N.B. If the mouse buttons have been commanded to act like keyboard keys, this
    422command DOES affect their actions.
    423
    424PAUSE OUTPUT
    425------------
    426
    427::
    428
    429    0x13
    430
    431Stop sending data to the host until another valid command is received. Key
    432matrix activity is still monitored and scan codes or ASCII characters enqueued
    433(up to the maximum supported by the microcontroller) to be sent when the host
    434allows the output to be resumed. If in the JOYSTICK EVENT REPORTING mode,
    435joystick events are also queued.
    436Mouse motion should be accumulated while the output is paused. If the ikbd is
    437in RELATIVE MOUSE POSITIONING REPORTING mode, motion is accumulated beyond the
    438normal threshold limits to produce the minimum number of packets necessary for
    439transmission when output is resumed. Pressing or releasing either mouse button
    440causes any accumulated motion to be immediately queued as packets, if the
    441mouse is in RELATIVE MOUSE POSITION REPORTING mode.
    442Because of the limitations of the microcontroller memory this command should
    443be used sparingly, and the output should not be shut of for more than <tbd>
    444milliseconds at a time.
    445The output is stopped only at the end of the current 'even'. If the PAUSE
    446OUTPUT command is received in the middle of a multiple byte report, the packet
    447will still be transmitted to conclusion and then the PAUSE will take effect.
    448When the ikbd is in either the JOYSTICK MONITORING mode or the FIRE BUTTON
    449MONITORING mode, the PAUSE OUTPUT command also temporarily stops the
    450monitoring process (i.e. the samples are not enqueued for transmission).
    451
    452SET JOYSTICK EVENT REPORTING
    453----------------------------
    454
    455::
    456
    457    0x14
    458
    459Enter JOYSTICK EVENT REPORTING mode (DEFAULT). Each opening or closure of a
    460joystick switch or trigger causes a joystick event record to be generated.
    461
    462SET JOYSTICK INTERROGATION MODE
    463-------------------------------
    464
    465::
    466
    467    0x15
    468
    469Disables JOYSTICK EVENT REPORTING. Host must send individual JOYSTICK
    470INTERROGATE commands to sense joystick state.
    471
    472JOYSTICK INTERROGATE
    473--------------------
    474
    475::
    476
    477    0x16
    478
    479Return a record indicating the current state of the joysticks. This command
    480is valid in either the JOYSTICK EVENT REPORTING mode or the JOYSTICK
    481INTERROGATION MODE.
    482
    483SET JOYSTICK MONITORING
    484-----------------------
    485
    486::
    487
    488    0x17
    489    rate                ; time between samples in hundredths of a second
    490    Returns: (in packets of two as long as in mode)
    491            %000000xy   ; where y is JOYSTICK1 Fire button
    492                        ; and x is JOYSTICK0 Fire button
    493            %nnnnmmmm   ; where m is JOYSTICK1 state
    494                        ; and n is JOYSTICK0 state
    495
    496Sets the ikbd to do nothing but monitor the serial command line, maintain the
    497time-of-day clock, and monitor the joystick. The rate sets the interval
    498between joystick samples.
    499N.B. The user should not set the rate higher than the serial communications
    500channel will allow the 2 bytes packets to be transmitted.
    501
    502SET FIRE BUTTON MONITORING
    503--------------------------
    504
    505::
    506
    507    0x18
    508    Returns: (as long as in mode)
    509            %bbbbbbbb   ; state of the JOYSTICK1 fire button packed
    510                        ; 8 bits per byte, the first sample if the MSB
    511
    512Set the ikbd to do nothing but monitor the serial command line, maintain the
    513time-of-day clock, and monitor the fire button on Joystick 1. The fire button
    514is scanned at a rate that causes 8 samples to be made in the time it takes for
    515the previous byte to be sent to the host (i.e. scan rate = 8/10 * baud rate).
    516The sample interval should be as constant as possible.
    517
    518SET JOYSTICK KEYCODE MODE
    519-------------------------
    520
    521::
    522
    523    0x19
    524    RX                  ; length of time (in tenths of seconds) until
    525                        ; horizontal velocity breakpoint is reached
    526    RY                  ; length of time (in tenths of seconds) until
    527                        ; vertical velocity breakpoint is reached
    528    TX                  ; length (in tenths of seconds) of joystick closure
    529                        ; until horizontal cursor key is generated before RX
    530                        ; has elapsed
    531    TY                  ; length (in tenths of seconds) of joystick closure
    532                        ; until vertical cursor key is generated before RY
    533                        ; has elapsed
    534    VX                  ; length (in tenths of seconds) of joystick closure
    535                        ; until horizontal cursor keystrokes are generated
    536                        ; after RX has elapsed
    537    VY                  ; length (in tenths of seconds) of joystick closure
    538                        ; until vertical cursor keystrokes are generated
    539                        ; after RY has elapsed
    540
    541In this mode, joystick 0 is scanned in a way that simulates cursor keystrokes.
    542On initial closure, a keystroke pair (make/break) is generated. Then up to Rn
    543tenths of seconds later, keystroke pairs are generated every Tn tenths of
    544seconds. After the Rn breakpoint is reached, keystroke pairs are generated
    545every Vn tenths of seconds. This provides a velocity (auto-repeat) breakpoint
    546feature.
    547Note that by setting RX and/or Ry to zero, the velocity feature can be
    548disabled. The values of TX and TY then become meaningless, and the generation
    549of cursor 'keystrokes' is set by VX and VY.
    550
    551DISABLE JOYSTICKS
    552-----------------
    553
    554::
    555
    556    0x1A
    557
    558Disable the generation of any joystick events (and scanning may be internally
    559disabled). Any valid joystick mode command resumes joystick monitoring. (The
    560joystick mode commands are SET JOYSTICK EVENT REPORTING, SET JOYSTICK
    561INTERROGATION MODE, SET JOYSTICK MONITORING, SET FIRE BUTTON MONITORING, and
    562SET JOYSTICK KEYCODE MODE.)
    563
    564TIME-OF-DAY CLOCK SET
    565---------------------
    566
    567::
    568
    569    0x1B
    570    YY                  ; year (2 least significant digits)
    571    MM                  ; month
    572    DD                  ; day
    573    hh                  ; hour
    574    mm                  ; minute
    575    ss                  ; second
    576
    577All time-of-day data should be sent to the ikbd in packed BCD format.
    578Any digit that is not a valid BCD digit should be treated as a 'don't care'
    579and not alter that particular field of the date or time. This permits setting
    580only some subfields of the time-of-day clock.
    581
    582INTERROGATE TIME-OF-DAT CLOCK
    583-----------------------------
    584
    585::
    586
    587    0x1C
    588    Returns:
    589            0xFC        ; time-of-day event header
    590            YY          ; year (2 least significant digits)
    591            MM          ; month
    592            DD          ; day
    593            hh          ; hour
    594            mm          ; minute
    595            ss          ; second
    596
    597    All time-of-day is sent in packed BCD format.
    598
    599MEMORY LOAD
    600-----------
    601
    602::
    603
    604    0x20
    605    ADRMSB              ; address in controller
    606    ADRLSB              ; memory to be loaded
    607    NUM                 ; number of bytes (0-128)
    608    { data }
    609
    610This command permits the host to load arbitrary values into the ikbd
    611controller memory. The time between data bytes must be less than 20ms.
    612
    613MEMORY READ
    614-----------
    615
    616::
    617
    618    0x21
    619    ADRMSB              ; address in controller
    620    ADRLSB              ; memory to be read
    621    Returns:
    622            0xF6        ; status header
    623            0x20        ; memory access
    624            { data }    ; 6 data bytes starting at ADR
    625
    626This command permits the host to read from the ikbd controller memory.
    627
    628CONTROLLER EXECUTE
    629------------------
    630
    631::
    632
    633    0x22
    634    ADRMSB              ; address of subroutine in
    635    ADRLSB              ; controller memory to be called
    636
    637This command allows the host to command the execution of a subroutine in the
    638ikbd controller memory.
    639
    640STATUS INQUIRIES
    641----------------
    642
    643::
    644
    645    Status commands are formed by inclusively ORing 0x80 with the
    646    relevant SET command.
    647
    648    Example:
    649    0x88 (or 0x89 or 0x8A)  ; request mouse mode
    650    Returns:
    651            0xF6        ; status response header
    652            mode        ; 0x08 is RELATIVE
    653                        ; 0x09 is ABSOLUTE
    654                        ; 0x0A is KEYCODE
    655            param1      ; 0 is RELATIVE
    656                        ; XMSB maximum if ABSOLUTE
    657                        ; DELTA X is KEYCODE
    658            param2      ; 0 is RELATIVE
    659                        ; YMSB maximum if ABSOLUTE
    660                        ; DELTA Y is KEYCODE
    661            param3      ; 0 if RELATIVE
    662                        ; or KEYCODE
    663                        ; YMSB is ABSOLUTE
    664            param4      ; 0 if RELATIVE
    665                        ; or KEYCODE
    666                        ; YLSB is ABSOLUTE
    667            0           ; pad
    668            0
    669
    670The STATUS INQUIRY commands request the ikbd to return either the current mode
    671or the parameters associated with a given command. All status reports are
    672padded to form 8 byte long return packets. The responses to the status
    673requests are designed so that the host may store them away (after stripping
    674off the status report header byte) and later send them back as commands to
    675ikbd to restore its state. The 0 pad bytes will be treated as NOPs by the
    676ikbd.
    677
    678    Valid STATUS INQUIRY commands are::
    679
    680            0x87    mouse button action
    681            0x88    mouse mode
    682            0x89
    683            0x8A
    684            0x8B    mnouse threshold
    685            0x8C    mouse scale
    686            0x8F    mouse vertical coordinates
    687            0x90    ( returns       0x0F Y=0 at bottom
    688                            0x10 Y=0 at top )
    689            0x92    mouse enable/disable
    690                    ( returns       0x00 enabled)
    691                            0x12 disabled )
    692            0x94    joystick mode
    693            0x95
    694            0x96
    695            0x9A    joystick enable/disable
    696                    ( returns       0x00 enabled
    697                            0x1A disabled )
    698
    699It is the (host) programmer's responsibility to have only one unanswered
    700inquiry in process at a time.
    701STATUS INQUIRY commands are not valid if the ikbd is in JOYSTICK MONITORING
    702mode or FIRE BUTTON MONITORING mode.
    703
    704
    705SCAN CODES
    706==========
    707
    708The key scan codes returned by the ikbd are chosen to simplify the
    709implementation of GSX.
    710
    711GSX Standard Keyboard Mapping
    712
    713======= ============
    714Hex	Keytop
    715======= ============
    71601	Esc
    71702	1
    71803	2
    71904	3
    72005	4
    72106	5
    72207	6
    72308	7
    72409	8
    7250A	9
    7260B	0
    7270C	\-
    7280D	\=
    7290E	BS
    7300F	TAB
    73110	Q
    73211	W
    73312	E
    73413	R
    73514	T
    73615	Y
    73716	U
    73817	I
    73918	O
    74019	P
    7411A	[
    7421B	]
    7431C	RET
    7441D	CTRL
    7451E	A
    7461F	S
    74720	D
    74821	F
    74922	G
    75023	H
    75124	J
    75225	K
    75326	L
    75427	;
    75528	'
    75629	\`
    7572A	(LEFT) SHIFT
    7582B	\\
    7592C	Z
    7602D	X
    7612E	C
    7622F	V
    76330	B
    76431	N
    76532	M
    76633	,
    76734	.
    76835	/
    76936	(RIGHT) SHIFT
    77037	{ NOT USED }
    77138	ALT
    77239	SPACE BAR
    7733A	CAPS LOCK
    7743B	F1
    7753C	F2
    7763D	F3
    7773E	F4
    7783F	F5
    77940	F6
    78041	F7
    78142	F8
    78243	F9
    78344	F10
    78445	{ NOT USED }
    78546	{ NOT USED }
    78647	HOME
    78748	UP ARROW
    78849	{ NOT USED }
    7894A	KEYPAD -
    7904B	LEFT ARROW
    7914C	{ NOT USED }
    7924D	RIGHT ARROW
    7934E	KEYPAD +
    7944F	{ NOT USED }
    79550	DOWN ARROW
    79651	{ NOT USED }
    79752	INSERT
    79853	DEL
    79954	{ NOT USED }
    8005F	{ NOT USED }
    80160	ISO KEY
    80261	UNDO
    80362	HELP
    80463	KEYPAD (
    80564	KEYPAD /
    80665	KEYPAD *
    80766	KEYPAD *
    80867	KEYPAD 7
    80968	KEYPAD 8
    81069	KEYPAD 9
    8116A	KEYPAD 4
    8126B	KEYPAD 5
    8136C	KEYPAD 6
    8146D	KEYPAD 1
    8156E	KEYPAD 2
    8166F	KEYPAD 3
    81770	KEYPAD 0
    81871	KEYPAD .
    81972	KEYPAD ENTER
    820======= ============