atarikbd.rst 26.6 KB
Newer Older
1
====================================
L
Linus Torvalds 已提交
2
Intelligent Keyboard (ikbd) Protocol
3
====================================
L
Linus Torvalds 已提交
4 5


6 7
Introduction
============
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15

The Atari Corp. Intelligent Keyboard (ikbd) is a general purpose keyboard
controller that is flexible enough that it can be used in a variety of
products without modification. The keyboard, with its microcontroller,
provides a convenient connection point for a mouse and switch-type joysticks.
The ikbd processor also maintains a time-of-day clock with one second
resolution.
The ikbd has been designed to be general enough that it can be used with a
16
variety of new computer products. Product variations in a number of
L
Linus Torvalds 已提交
17 18 19 20 21 22 23
keyswitches, mouse resolution, etc. can be accommodated.
The ikbd communicates with the main processor over a high speed bi-directional
serial interface. It can function in a variety of modes to facilitate
different applications of the keyboard,  joysticks, or mouse. Limited use of
the controller is possible in applications in which only a unidirectional
communications medium is available by carefully designing the default modes.

24 25
Keyboard
========
L
Linus Torvalds 已提交
26 27 28 29 30 31 32 33 34

The keyboard always returns key make/break scan codes. The ikbd generates
keyboard scan codes for each key press and release. The key scan make (key
closure) codes start at 1, and are defined in Appendix A. For example, the
ISO key position in the scan code table should exist even if no keyswitch
exists in that position on a particular keyboard. The break code for each key
is obtained by ORing 0x80 with the make code.

The special codes 0xF6 through 0xFF are reserved for use as follows:
35 36 37 38

=================== ====================================================
    Code            Command
=================== ====================================================
L
Linus Torvalds 已提交
39 40
    0xF6            status report
    0xF7            absolute mouse position record
41
    0xF8-0xFB       relative mouse position records (lsbs determined by
42
                    mouse button states)
L
Linus Torvalds 已提交
43 44 45 46
    0xFC            time-of-day
    0xFD            joystick report (both sticks)
    0xFE            joystick 0 event
    0xFF            joystick 1 event
47
=================== ====================================================
L
Linus Torvalds 已提交
48 49 50 51

The two shift keys return different scan codes in this mode. The ENTER key
and the RETurn key are also distinct.

52 53
Mouse
=====
L
Linus Torvalds 已提交
54 55 56 57 58 59 60 61 62 63 64 65

The mouse port should be capable of supporting a mouse with resolution of
approximately 200 counts (phase changes or 'clicks') per inch of travel. The
mouse should be scanned at a rate that will permit accurate tracking at
velocities up to 10 inches per second.
The ikbd can report mouse motion in three distinctly different ways. It can
report relative motion, absolute motion in a coordinate system maintained
within the ikbd, or by converting mouse motion into keyboard cursor control
key equivalents.
The mouse buttons can be treated as part of the mouse or as additional
keyboard keys.

66 67
Relative Position Reporting
---------------------------
L
Linus Torvalds 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80

In relative position mode, the ikbd will return relative mouse position
records whenever a mouse event occurs. A mouse event consists of a mouse
button being pressed or released, or motion in either axis exceeding a
settable threshold of motion. Regardless of the threshold, all bits of
resolution are returned to the host computer.
Note that the ikbd may return mouse relative position reports with
significantly more than the threshold delta x or y. This may happen since no
relative mouse motion events will be generated: (a) while the keyboard has
been 'paused' ( the event will be stored until keyboard communications is
resumed) (b) while any event is being transmitted.

The relative mouse position record is a three byte record of the form
81 82
(regardless of keyboard mode)::

L
Linus Torvalds 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95
    %111110xy           ; mouse position record flag
                        ; where y is the right button state
                        ; and x is the left button state
    X                   ; delta x as twos complement integer
    Y                   ; delta y as twos complement integer

Note that the value of the button state bits should be valid even if the
MOUSE BUTTON ACTION has set the buttons to act like part of the keyboard.
If the accumulated motion before the report packet is generated exceeds the
+127...-128 range, the motion is broken into multiple packets.
Note that the sign of the delta y reported is a function of the Y origin
selected.

96 97
Absolute Position reporting
---------------------------
L
Linus Torvalds 已提交
98 99

The ikbd can also maintain absolute mouse position. Commands exist for
100
resetting the mouse position, setting X/Y scaling, and interrogating the
L
Linus Torvalds 已提交
101 102
current mouse position.

103 104
Mouse Cursor Key Mode
---------------------
L
Linus Torvalds 已提交
105 106 107 108 109 110 111 112 113 114 115

The ikbd can translate mouse motion into the equivalent cursor keystrokes.
The number of mouse clicks per keystroke is independently programmable in
each axis. The ikbd internally maintains mouse motion information to the
highest resolution available, and merely generates a pair of cursor key events
for each multiple of the scale factor.
Mouse motion produces the cursor key make code immediately followed by the
break code for the appropriate cursor key. The mouse buttons produce scan
codes above those normally assigned for the largest envisioned keyboard (i.e.
LEFT=0x74 & RIGHT=0x75).

116 117
Joystick
========
L
Linus Torvalds 已提交
118

119 120
Joystick Event Reporting
------------------------
L
Linus Torvalds 已提交
121

122
In this mode, the ikbd generates a record whenever the joystick position is
L
Linus Torvalds 已提交
123 124
changed (i.e. for each opening or closing of a joystick switch or trigger).

125 126
The joystick event record is two bytes of the form::

L
Linus Torvalds 已提交
127 128 129 130 131
    %1111111x           ; Joystick event marker
                        ; where x is Joystick 0 or 1
    %x000yyyy           ; where yyyy is the stick position
                        ; and x is the trigger

132 133
Joystick Interrogation
----------------------
L
Linus Torvalds 已提交
134 135 136 137

The current state of the joystick ports may be interrogated at any time in
this mode by sending an 'Interrogate Joystick' command to the ikbd.

138 139
The ikbd response to joystick interrogation is a three byte report of the form::

L
Linus Torvalds 已提交
140 141 142 143 144 145
    0xFD                ; joystick report header
    %x000yyyy           ; Joystick 0
    %x000yyyy           ; Joystick 1
                        ; where x is the trigger
                        ; and yyy is the stick position

146 147
Joystick Monitoring
-------------------
L
Linus Torvalds 已提交
148 149 150 151 152 153 154

A mode is available that devotes nearly all of the keyboard communications
time to reporting the state of the joystick ports at a user specifiable rate.
It remains in this mode until reset or commanded into another mode. The PAUSE
command in this mode not only stop the output but also temporarily stops
scanning the joysticks (samples are not queued).

155 156
Fire Button Monitoring
----------------------
L
Linus Torvalds 已提交
157 158 159 160 161 162 163 164 165

A mode is provided to permit monitoring a single input bit at a high rate. In
this mode the ikbd monitors the state of the Joystick 1 fire button at the
maximum rate permitted by the serial communication channel. The data is packed
8 bits per byte for transmission to the host. The ikbd remains in this mode
until reset or commanded into another mode. The PAUSE command in this mode not
only stops the output but also temporarily stops scanning the button (samples
are not queued).

166 167
Joystick Key Code Mode
----------------------
L
Linus Torvalds 已提交
168 169 170 171 172 173 174 175 176

The ikbd may be commanded to translate the use of either joystick into the
equivalent cursor control keystroke(s). The ikbd provides a single breakpoint
velocity joystick cursor.
Joystick events produce the make code, immediately followed by the break code
for the appropriate cursor motion keys. The trigger or fire buttons of the
joysticks produce pseudo key scan codes above those used by the largest key
matrix envisioned (i.e. JOYSTICK0=0x74, JOYSTICK1=0x75).

177 178
Time-of-Day Clock
=================
L
Linus Torvalds 已提交
179 180 181 182 183

The ikbd also maintains a time-of-day clock for the system. Commands are
available to set and interrogate the timer-of-day clock. Time-keeping is
maintained down to a resolution of one second.

184 185
Status Inquiries
================
L
Linus Torvalds 已提交
186 187 188 189

The current state of ikbd modes and parameters may be found by sending status
inquiry commands that correspond to the ikbd set commands.

190 191
Power-Up Mode
=============
L
Linus Torvalds 已提交
192 193 194 195 196 197

The keyboard controller will perform a simple self-test on power-up to detect
major controller faults (ROM checksum and RAM test) and such things as stuck
keys. Any keys down at power-up are presumed to be stuck, and their BREAK
(sic) code is returned (which without the preceding MAKE code is a flag for a
keyboard error). If the controller self-test completes without error, the code
M
Matt LaPlante 已提交
198
0xF0 is returned. (This code will be used to indicate the version/release of
L
Linus Torvalds 已提交
199 200 201 202 203 204 205 206
the ikbd controller. The first release of the ikbd is version 0xF0, should
there be a second release it will be 0xF1, and so on.)
The ikbd defaults to a mouse position reporting with threshold of 1 unit in
either axis and the Y=0 origin at the top of the screen, and joystick event
reporting mode for joystick 1, with both buttons being logically assigned to
the mouse. After any joystick command, the ikbd assumes that joysticks are
connected to both Joystick0 and Joystick1. Any mouse command (except MOUSE
DISABLE) then causes port 0 to again be scanned as if it were a mouse, and
M
Matt LaPlante 已提交
207
both buttons are logically connected to it. If a mouse disable command is
L
Linus Torvalds 已提交
208
received while port 0 is presumed to be a mouse, the button is logically
M
Matt LaPlante 已提交
209
assigned to Joystick1 (until the mouse is reenabled by another mouse command).
L
Linus Torvalds 已提交
210

211 212
ikbd Command Set
================
L
Linus Torvalds 已提交
213 214 215 216 217

This section contains a list of commands that can be sent to the ikbd. Command
codes (such as 0x00) which are not specified should perform no operation
(NOPs).

218 219 220 221
RESET
-----

::
L
Linus Torvalds 已提交
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

    0x80
    0x01

N.B. The RESET command is the only two byte command understood by the ikbd.
Any byte following an 0x80 command byte other than 0x01 is ignored (and causes
the 0x80 to be ignored).
A reset may also be caused by sending a break lasting at least 200mS to the
ikbd.
Executing the RESET command returns the keyboard to its default (power-up)
mode and parameter settings. It does not affect the time-of-day clock.
The RESET command or function causes the ikbd to perform a simple self-test.
If the test is successful, the ikbd will send the code of 0xF0 within 300mS
of receipt of the RESET command (or the end of the break, or power-up). The
ikbd will then scan the key matrix for any stuck (closed) keys. Any keys found
closed will cause the break scan code to be generated (the break code arriving
without being preceded by the make code is a flag for a key matrix error).

240 241 242 243
SET MOUSE BUTTON ACTION
-----------------------

::
L
Linus Torvalds 已提交
244 245 246 247 248 249 250 251

    0x07
    %00000mss           ; mouse button action
                        ;       (m is presumed = 1 when in MOUSE KEYCODE mode)
                        ; mss=0xy, mouse button press or release causes mouse
                        ;  position report
                        ;  where y=1, mouse key press causes absolute report
                        ;  and x=1, mouse key release causes absolute report
252
                        ; mss=100, mouse buttons act like keys
L
Linus Torvalds 已提交
253 254 255 256 257 258

This command sets how the ikbd should treat the buttons on the mouse. The
default mouse button action mode is %00000000, the buttons are treated as part
of the mouse logically.
When buttons act like keys, LEFT=0x74 & RIGHT=0x75.

259 260 261 262
SET RELATIVE MOUSE POSITION REPORTING
-------------------------------------

::
L
Linus Torvalds 已提交
263 264 265 266 267 268 269 270 271 272

    0x08

Set relative mouse position reporting. (DEFAULT) Mouse position packets are
generated asynchronously by the ikbd whenever motion exceeds the setable
threshold in either axis (see SET MOUSE THRESHOLD). Depending upon the mouse
key mode, mouse position reports may also be generated when either mouse
button is pressed or released. Otherwise the mouse buttons behave as if they
were keyboard keys.

273 274 275 276
SET ABSOLUTE MOUSE POSITIONING
------------------------------

::
L
Linus Torvalds 已提交
277 278 279 280 281 282

    0x09
    XMSB                ; X maximum (in scaled mouse clicks)
    XLSB
    YMSB                ; Y maximum (in scaled mouse clicks)
    YLSB
283

L
Linus Torvalds 已提交
284 285 286 287 288 289 290
Set absolute mouse position maintenance. Resets the ikbd maintained X and Y
coordinates.
In this mode, the value of the internally maintained coordinates does NOT wrap
between 0 and large positive numbers. Excess motion below 0 is ignored. The
command sets the maximum positive value that can be attained in the scaled
coordinate system. Motion beyond that value is also ignored.

291 292 293 294
SET MOUSE KEYCODE MOSE
----------------------

::
L
Linus Torvalds 已提交
295 296 297 298 299 300 301 302 303 304 305 306

    0x0A
    deltax              ; distance in X clicks to return (LEFT) or (RIGHT)
    deltay              ; distance in Y clicks to return (UP) or (DOWN)

Set mouse monitoring routines to return cursor motion keycodes instead of
either RELATIVE or ABSOLUTE motion records. The ikbd returns the appropriate
cursor keycode after mouse travel exceeding the user specified deltas in
either axis. When the keyboard is in key scan code mode, mouse motion will
cause the make code immediately followed by the break code. Note that this
command is not affected by the mouse motion origin.

307 308 309 310
SET MOUSE THRESHOLD
-------------------

::
L
Linus Torvalds 已提交
311 312 313 314 315 316 317 318 319 320

    0x0B
    X                   ; x threshold in mouse ticks (positive integers)
    Y                   ; y threshold in mouse ticks (positive integers)

This command sets the threshold before a mouse event is generated. Note that
it does NOT affect the resolution of the data returned to the host. This
command is valid only in RELATIVE MOUSE POSITIONING mode. The thresholds
default to 1 at RESET (or power-up).

321 322 323 324
SET MOUSE SCALE
---------------

::
L
Linus Torvalds 已提交
325 326

    0x0C
M
Matt LaPlante 已提交
327 328
    X                   ; horizontal mouse ticks per internal X
    Y                   ; vertical mouse ticks per internal Y
L
Linus Torvalds 已提交
329 330 331 332 333 334 335 336 337

This command sets the scale factor for the ABSOLUTE MOUSE POSITIONING mode.
In this mode, the specified number of mouse phase changes ('clicks') must
occur before the internally maintained coordinate is changed by one
(independently scaled for each axis). Remember that the mouse position
information is available only by interrogating the ikbd in the ABSOLUTE MOUSE
POSITIONING mode unless the ikbd has been commanded to report on button press
or release (see SET MOSE BUTTON ACTION).

338 339 340 341
INTERROGATE MOUSE POSITION
--------------------------

::
L
Linus Torvalds 已提交
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358

    0x0D
    Returns:
            0xF7       ; absolute mouse position header
    BUTTONS
            0000dcba   ; where a is right button down since last interrogation
                       ; b is right button up since last
                       ; c is left button down since last
                       ; d is left button up since last
            XMSB       ; X coordinate
            XLSB
            YMSB       ; Y coordinate
            YLSB

The INTERROGATE MOUSE POSITION command is valid when in the ABSOLUTE MOUSE
POSITIONING mode, regardless of the setting of the MOUSE BUTTON ACTION.

359 360 361 362
LOAD MOUSE POSITION
-------------------

::
L
Linus Torvalds 已提交
363 364 365 366 367 368 369 370 371 372 373

    0x0E
    0x00                ; filler
    XMSB                ; X coordinate
    XLSB                ; (in scaled coordinate system)
    YMSB                ; Y coordinate
    YLSB

This command allows the user to preset the internally maintained absolute
mouse position.

374 375 376 377
SET Y=0 AT BOTTOM
-----------------

::
L
Linus Torvalds 已提交
378 379 380 381

    0x0F

This command makes the origin of the Y axis to be at the bottom of the
M
Matt LaPlante 已提交
382
logical coordinate system internal to the ikbd for all relative or absolute
L
Linus Torvalds 已提交
383 384 385
mouse motion. This causes mouse motion toward the user to be negative in sign
and away from the user to be positive.

386 387 388 389
SET Y=0 AT TOP
--------------

::
L
Linus Torvalds 已提交
390 391 392 393 394 395 396 397

    0x10

Makes the origin of the Y axis to be at the top of the logical coordinate
system within the ikbd for all relative or absolute mouse motion. (DEFAULT)
This causes mouse motion toward the user to be positive in sign and away from
the user to be negative.

398 399 400 401
RESUME
------

::
L
Linus Torvalds 已提交
402 403 404 405 406 407 408 409

    0x11

Resume sending data to the host. Since any command received by the ikbd after
its output has been paused also causes an implicit RESUME this command can be
thought of as a NO OPERATION command. If this command is received by the ikbd
and it is not PAUSED, it is simply ignored.

410 411 412 413
DISABLE MOUSE
-------------

::
L
Linus Torvalds 已提交
414 415 416 417 418 419 420 421 422 423

    0x12

All mouse event reporting is disabled (and scanning may be internally
disabled). Any valid mouse mode command resumes mouse motion monitoring. (The
valid mouse mode commands are SET RELATIVE MOUSE POSITION REPORTING, SET
ABSOLUTE MOUSE POSITIONING, and SET MOUSE KEYCODE MODE. )
N.B. If the mouse buttons have been commanded to act like keyboard keys, this
command DOES affect their actions.

424 425 426 427
PAUSE OUTPUT
------------

::
L
Linus Torvalds 已提交
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451

    0x13

Stop sending data to the host until another valid command is received. Key
matrix activity is still monitored and scan codes or ASCII characters enqueued
(up to the maximum supported by the microcontroller) to be sent when the host
allows the output to be resumed. If in the JOYSTICK EVENT REPORTING mode,
joystick events are also queued.
Mouse motion should be accumulated while the output is paused. If the ikbd is
in RELATIVE MOUSE POSITIONING REPORTING mode, motion is accumulated beyond the
normal threshold limits to produce the minimum number of packets necessary for
transmission when output is resumed. Pressing or releasing either mouse button
causes any accumulated motion to be immediately queued as packets, if the
mouse is in RELATIVE MOUSE POSITION REPORTING mode.
Because of the limitations of the microcontroller memory this command should
be used sparingly, and the output should not be shut of for more than <tbd>
milliseconds at a time.
The output is stopped only at the end of the current 'even'. If the PAUSE
OUTPUT command is received in the middle of a multiple byte report, the packet
will still be transmitted to conclusion and then the PAUSE will take effect.
When the ikbd is in either the JOYSTICK MONITORING mode or the FIRE BUTTON
MONITORING mode, the PAUSE OUTPUT command also temporarily stops the
monitoring process (i.e. the samples are not enqueued for transmission).

452 453 454 455
SET JOYSTICK EVENT REPORTING
----------------------------

::
L
Linus Torvalds 已提交
456 457 458 459 460 461

    0x14

Enter JOYSTICK EVENT REPORTING mode (DEFAULT). Each opening or closure of a
joystick switch or trigger causes a joystick event record to be generated.

462 463 464 465
SET JOYSTICK INTERROGATION MODE
-------------------------------

::
L
Linus Torvalds 已提交
466 467 468 469 470 471

    0x15

Disables JOYSTICK EVENT REPORTING. Host must send individual JOYSTICK
INTERROGATE commands to sense joystick state.

472 473 474 475
JOYSTICK INTERROGATE
--------------------

::
L
Linus Torvalds 已提交
476 477 478 479 480 481 482

    0x16

Return a record indicating the current state of the joysticks. This command
is valid in either the JOYSTICK EVENT REPORTING mode or the JOYSTICK
INTERROGATION MODE.

483 484 485 486
SET JOYSTICK MONITORING
-----------------------

::
L
Linus Torvalds 已提交
487 488

    0x17
489
    rate                ; time between samples in hundredths of a second
L
Linus Torvalds 已提交
490 491 492 493 494 495
    Returns: (in packets of two as long as in mode)
            %000000xy   ; where y is JOYSTICK1 Fire button
                        ; and x is JOYSTICK0 Fire button
            %nnnnmmmm   ; where m is JOYSTICK1 state
                        ; and n is JOYSTICK0 state

M
Matt LaPlante 已提交
496
Sets the ikbd to do nothing but monitor the serial command line, maintain the
L
Linus Torvalds 已提交
497 498 499 500 501
time-of-day clock, and monitor the joystick. The rate sets the interval
between joystick samples.
N.B. The user should not set the rate higher than the serial communications
channel will allow the 2 bytes packets to be transmitted.

502 503 504 505
SET FIRE BUTTON MONITORING
--------------------------

::
L
Linus Torvalds 已提交
506 507 508 509 510 511 512 513 514 515 516 517

    0x18
    Returns: (as long as in mode)
            %bbbbbbbb   ; state of the JOYSTICK1 fire button packed
                        ; 8 bits per byte, the first sample if the MSB

Set the ikbd to do nothing but monitor the serial command line, maintain the
time-of-day clock, and monitor the fire button on Joystick 1. The fire button
is scanned at a rate that causes 8 samples to be made in the time it takes for
the previous byte to be sent to the host (i.e. scan rate = 8/10 * baud rate).
The sample interval should be as constant as possible.

518 519 520 521
SET JOYSTICK KEYCODE MODE
-------------------------

::
L
Linus Torvalds 已提交
522 523 524 525 526 527 528 529 530 531 532 533 534

    0x19
    RX                  ; length of time (in tenths of seconds) until
                        ; horizontal velocity breakpoint is reached
    RY                  ; length of time (in tenths of seconds) until
                        ; vertical velocity breakpoint is reached
    TX                  ; length (in tenths of seconds) of joystick closure
                        ; until horizontal cursor key is generated before RX
                        ; has elapsed
    TY                  ; length (in tenths of seconds) of joystick closure
                        ; until vertical cursor key is generated before RY
                        ; has elapsed
    VX                  ; length (in tenths of seconds) of joystick closure
M
Matt LaPlante 已提交
535
                        ; until horizontal cursor keystrokes are generated
L
Linus Torvalds 已提交
536 537
                        ; after RX has elapsed
    VY                  ; length (in tenths of seconds) of joystick closure
M
Matt LaPlante 已提交
538
                        ; until vertical cursor keystrokes are generated
L
Linus Torvalds 已提交
539 540 541 542 543 544 545 546 547 548 549 550
                        ; after RY has elapsed

In this mode, joystick 0 is scanned in a way that simulates cursor keystrokes.
On initial closure, a keystroke pair (make/break) is generated. Then up to Rn
tenths of seconds later, keystroke pairs are generated every Tn tenths of
seconds. After the Rn breakpoint is reached, keystroke pairs are generated
every Vn tenths of seconds. This provides a velocity (auto-repeat) breakpoint
feature.
Note that by setting RX and/or Ry to zero, the velocity feature can be
disabled. The values of TX and TY then become meaningless, and the generation
of cursor 'keystrokes' is set by VX and VY.

551 552 553 554
DISABLE JOYSTICKS
-----------------

::
L
Linus Torvalds 已提交
555 556 557 558 559 560 561 562 563

    0x1A

Disable the generation of any joystick events (and scanning may be internally
disabled). Any valid joystick mode command resumes joystick monitoring. (The
joystick mode commands are SET JOYSTICK EVENT REPORTING, SET JOYSTICK
INTERROGATION MODE, SET JOYSTICK MONITORING, SET FIRE BUTTON MONITORING, and
SET JOYSTICK KEYCODE MODE.)

564 565 566 567
TIME-OF-DAY CLOCK SET
---------------------

::
L
Linus Torvalds 已提交
568 569 570 571 572 573 574 575 576 577 578 579 580 581

    0x1B
    YY                  ; year (2 least significant digits)
    MM                  ; month
    DD                  ; day
    hh                  ; hour
    mm                  ; minute
    ss                  ; second

All time-of-day data should be sent to the ikbd in packed BCD format.
Any digit that is not a valid BCD digit should be treated as a 'don't care'
and not alter that particular field of the date or time. This permits setting
only some subfields of the time-of-day clock.

582 583 584 585
INTERROGATE TIME-OF-DAT CLOCK
-----------------------------

::
L
Linus Torvalds 已提交
586 587 588 589 590 591 592 593 594 595 596 597 598

    0x1C
    Returns:
            0xFC        ; time-of-day event header
            YY          ; year (2 least significant digits)
            MM          ; month
            DD          ; day
            hh          ; hour
            mm          ; minute
            ss          ; second

    All time-of-day is sent in packed BCD format.

599 600 601 602
MEMORY LOAD
-----------

::
L
Linus Torvalds 已提交
603 604 605 606 607 608 609 610 611 612

    0x20
    ADRMSB              ; address in controller
    ADRLSB              ; memory to be loaded
    NUM                 ; number of bytes (0-128)
    { data }

This command permits the host to load arbitrary values into the ikbd
controller memory. The time between data bytes must be less than 20ms.

613 614 615 616
MEMORY READ
-----------

::
L
Linus Torvalds 已提交
617 618 619 620 621 622 623 624 625

    0x21
    ADRMSB              ; address in controller
    ADRLSB              ; memory to be read
    Returns:
            0xF6        ; status header
            0x20        ; memory access
            { data }    ; 6 data bytes starting at ADR

626
This command permits the host to read from the ikbd controller memory.
L
Linus Torvalds 已提交
627

628 629 630 631
CONTROLLER EXECUTE
------------------

::
L
Linus Torvalds 已提交
632 633 634 635 636 637 638 639

    0x22
    ADRMSB              ; address of subroutine in
    ADRLSB              ; controller memory to be called

This command allows the host to command the execution of a subroutine in the
ikbd controller memory.

640 641 642 643 644
STATUS INQUIRIES
----------------

::

L
Linus Torvalds 已提交
645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
    Status commands are formed by inclusively ORing 0x80 with the
    relevant SET command.

    Example:
    0x88 (or 0x89 or 0x8A)  ; request mouse mode
    Returns:
            0xF6        ; status response header
            mode        ; 0x08 is RELATIVE
                        ; 0x09 is ABSOLUTE
                        ; 0x0A is KEYCODE
            param1      ; 0 is RELATIVE
                        ; XMSB maximum if ABSOLUTE
                        ; DELTA X is KEYCODE
            param2      ; 0 is RELATIVE
                        ; YMSB maximum if ABSOLUTE
                        ; DELTA Y is KEYCODE
            param3      ; 0 if RELATIVE
                        ; or KEYCODE
                        ; YMSB is ABSOLUTE
            param4      ; 0 if RELATIVE
                        ; or KEYCODE
                        ; YLSB is ABSOLUTE
            0           ; pad
            0

The STATUS INQUIRY commands request the ikbd to return either the current mode
or the parameters associated with a given command. All status reports are
padded to form 8 byte long return packets. The responses to the status
requests are designed so that the host may store them away (after stripping
off the status report header byte) and later send them back as commands to
ikbd to restore its state. The 0 pad bytes will be treated as NOPs by the
ikbd.

678
    Valid STATUS INQUIRY commands are::
L
Linus Torvalds 已提交
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704

            0x87    mouse button action
            0x88    mouse mode
            0x89
            0x8A
            0x8B    mnouse threshold
            0x8C    mouse scale
            0x8F    mouse vertical coordinates
            0x90    ( returns       0x0F Y=0 at bottom
                            0x10 Y=0 at top )
            0x92    mouse enable/disable
                    ( returns       0x00 enabled)
                            0x12 disabled )
            0x94    joystick mode
            0x95
            0x96
            0x9A    joystick enable/disable
                    ( returns       0x00 enabled
                            0x1A disabled )

It is the (host) programmer's responsibility to have only one unanswered
inquiry in process at a time.
STATUS INQUIRY commands are not valid if the ikbd is in JOYSTICK MONITORING
mode or FIRE BUTTON MONITORING mode.


705 706
SCAN CODES
==========
L
Linus Torvalds 已提交
707

M
Matt LaPlante 已提交
708 709
The key scan codes returned by the ikbd are chosen to simplify the
implementation of GSX.
L
Linus Torvalds 已提交
710

711
GSX Standard Keyboard Mapping
L
Linus Torvalds 已提交
712

713
======= ============
L
Linus Torvalds 已提交
714
Hex	Keytop
715
======= ============
L
Linus Torvalds 已提交
716 717 718 719 720 721 722 723 724 725 726
01	Esc
02	1
03	2
04	3
05	4
06	5
07	6
08	7
09	8
0A	9
0B	0
727 728
0C	\-
0D	\=
L
Linus Torvalds 已提交
729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
0E	BS
0F	TAB
10	Q
11	W
12	E
13	R
14	T
15	Y
16	U
17	I
18	O
19	P
1A	[
1B	]
1C	RET
1D	CTRL
1E	A
1F	S
20	D
21	F
22	G
23	H
24	J
25	K
26	L
27	;
28	'
756
29	\`
L
Linus Torvalds 已提交
757
2A	(LEFT) SHIFT
758
2B	\\
L
Linus Torvalds 已提交
759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
2C	Z
2D	X
2E	C
2F	V
30	B
31	N
32	M
33	,
34	.
35	/
36	(RIGHT) SHIFT
37	{ NOT USED }
38	ALT
39	SPACE BAR
3A	CAPS LOCK
3B	F1
3C	F2
3D	F3
3E	F4
3F	F5
40	F6
41	F7
42	F8
43	F9
44	F10
45	{ NOT USED }
46	{ NOT USED }
47	HOME
48	UP ARROW
49	{ NOT USED }
4A	KEYPAD -
4B	LEFT ARROW
4C	{ NOT USED }
4D	RIGHT ARROW
4E	KEYPAD +
4F	{ NOT USED }
50	DOWN ARROW
51	{ NOT USED }
52	INSERT
53	DEL
54	{ NOT USED }
5F	{ NOT USED }
60	ISO KEY
61	UNDO
62	HELP
63	KEYPAD (
64	KEYPAD /
65	KEYPAD *
66	KEYPAD *
67	KEYPAD 7
68	KEYPAD 8
69	KEYPAD 9
6A	KEYPAD 4
6B	KEYPAD 5
6C	KEYPAD 6
6D	KEYPAD 1
6E	KEYPAD 2
6F	KEYPAD 3
70	KEYPAD 0
71	KEYPAD .
72	KEYPAD ENTER
820
======= ============