Blame view

Documentation/input/atarikbd.txt 25.5 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
  Intelligent Keyboard (ikbd) Protocol
  
  
  1. Introduction
  
  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
3f6dee9b2   Matt LaPlante   Fix some typos in...
13
  variety of new computer products. Product variations in a number of
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  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.
  
  3. Keyboard
  
  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:
      0xF6            status report
      0xF7            absolute mouse position record
fff9289b2   Matt LaPlante   Fix typos in Docu...
33
      0xF8-0xFB       relative mouse position records (lsbs determined by
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
                       mouse button states)
      0xFC            time-of-day
      0xFD            joystick report (both sticks)
      0xFE            joystick 0 event
      0xFF            joystick 1 event
  
  The two shift keys return different scan codes in this mode. The ENTER key
  and the RETurn key are also distinct.
  
  4. Mouse
  
  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.
  
  4.1 Relative Position Reporting
  
  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
  (regardless of keyboard mode):
      %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.
  
  4.2 Absolute Position reporting
  
  The ikbd can also maintain absolute mouse position. Commands exist for
d6bc8ac9e   Matt LaPlante   Fix typos in Docu...
87
  resetting the mouse position, setting X/Y scaling, and interrogating the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  current mouse position.
  
  4.3 Mouse Cursor Key Mode
  
  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).
  
  5. Joystick
  
  5.1 Joystick Event Reporting
4ae0edc21   Matt LaPlante   Fix typos in /Doc...
105
  In this mode, the ikbd generates a record whenever the joystick position is
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
  changed (i.e. for each opening or closing of a joystick switch or trigger).
  
  The joystick event record is two bytes of the form:
      %1111111x           ; Joystick event marker
                          ; where x is Joystick 0 or 1
      %x000yyyy           ; where yyyy is the stick position
                          ; and x is the trigger
  
  5.2 Joystick Interrogation
  
  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.
  
  The ikbd response to joystick interrogation is a three byte report of the form
      0xFD                ; joystick report header
      %x000yyyy           ; Joystick 0
      %x000yyyy           ; Joystick 1
                          ; where x is the trigger
                          ; and yyy is the stick position
  
  5.3 Joystick Monitoring
  
  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).
  
  5.4 Fire Button Monitoring
  
  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).
  
  5.5 Joystick Key Code Mode
  
  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).
  
  6. Time-of-Day Clock
  
  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.
  
  7. Status Inquiries
  
  The current state of ikbd modes and parameters may be found by sending status
  inquiry commands that correspond to the ikbd set commands.
  
  8. Power-Up Mode
  
  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
01dd2fbf0   Matt LaPlante   typo fixes
172
  0xF0 is returned. (This code will be used to indicate the version/release of
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
174
175
176
177
178
179
180
  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
a982ac06b   Matt LaPlante   misc doc and kcon...
181
  both buttons are logically connected to it. If a mouse disable command is
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
  received while port 0 is presumed to be a mouse, the button is logically
a982ac06b   Matt LaPlante   misc doc and kcon...
183
  assigned to Joystick1 (until the mouse is reenabled by another mouse command).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  
  9. ikbd Command Set
  
  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).
  
  9.1 RESET
  
      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).
  
  9.2. SET MOUSE BUTTON ACTION
  
      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
                          ; mss=100, mouse buttons act like keys 
  
  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.
  
  9.3 SET RELATIVE MOUSE POSITION REPORTING
  
      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.
  
  9.4 SET ABSOLUTE MOUSE POSITIONING
  
      0x09
      XMSB                ; X maximum (in scaled mouse clicks)
      XLSB
      YMSB                ; Y maximum (in scaled mouse clicks)
      YLSB
  	
  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.
  
  9.5 SET MOUSE KEYCODE MOSE
  
      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.
  
  9..6 SET MOUSE THRESHOLD
  
      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).
  
  9.7 SET MOUSE SCALE
  
      0x0C
5d3f083d8   Matt LaPlante   Fix typos in /Doc...
279
280
      X                   ; horizontal mouse ticks per internal X
      Y                   ; vertical mouse ticks per internal Y
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  
  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).
  
  9.8 INTERROGATE MOUSE POSITION
  
      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.
  
  9.9 LOAD MOUSE POSITION
  
      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.
  
  9.10 SET Y=0 AT BOTTOM
  
      0x0F
  
  This command makes the origin of the Y axis to be at the bottom of the
5d3f083d8   Matt LaPlante   Fix typos in /Doc...
325
  logical coordinate system internal to the ikbd for all relative or absolute
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
  mouse motion. This causes mouse motion toward the user to be negative in sign
  and away from the user to be positive.
  
  9.11 SET Y=0 AT TOP
  
      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.
  
  9.12 RESUME
  
      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.
  
  9.13 DISABLE MOUSE
  
      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.
  
  9.14 PAUSE OUTPUT
  
      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).
  
  0.15 SET JOYSTICK EVENT REPORTING
  
      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.
  
  9.16 SET JOYSTICK INTERROGATION MODE
  
      0x15
  
  Disables JOYSTICK EVENT REPORTING. Host must send individual JOYSTICK
  INTERROGATE commands to sense joystick state.
  
  9.17 JOYSTICK INTERROGATE
  
      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.
  
  9.18 SET JOYSTICK MONITORING
  
      0x17
2fe0ae78c   Matt LaPlante   Fix typos in Docu...
408
      rate                ; time between samples in hundredths of a second
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
409
410
411
412
413
      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
01dd2fbf0   Matt LaPlante   typo fixes
414
  Sets the ikbd to do nothing but monitor the serial command line, maintain the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
  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.
  
  9.19 SET FIRE BUTTON MONITORING
  
      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.
  
  9.20 SET JOYSTICK KEYCODE MODE
  
      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
01dd2fbf0   Matt LaPlante   typo fixes
447
                          ; until horizontal cursor keystrokes are generated
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
449
                          ; after RX has elapsed
      VY                  ; length (in tenths of seconds) of joystick closure
01dd2fbf0   Matt LaPlante   typo fixes
450
                          ; until vertical cursor keystrokes are generated
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
                          ; 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.
  
  9.21 DISABLE JOYSTICKS
  
      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.)
  
  9.22 TIME-OF-DAY CLOCK SET
  
      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.
  
  9.23 INTERROGATE TIME-OF-DAT CLOCK
  
      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.
  
  9.24 MEMORY LOAD
  
      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.
  
  9.25 MEMORY READ
  
      0x21
      ADRMSB              ; address in controller
      ADRLSB              ; memory to be read
      Returns:
              0xF6        ; status header
              0x20        ; memory access
              { data }    ; 6 data bytes starting at ADR
6c28f2c0f   Matt LaPlante   Fix typos in Docu...
522
  This command permits the host to read from the ikbd controller memory.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
  
  9.26 CONTROLLER EXECUTE
  
      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.
  
  9.27 STATUS INQUIRIES
  	
      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.
  
      Valid STATUS INQUIRY commands are:
  
              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.
  
  
  10. SCAN CODES
5d3f083d8   Matt LaPlante   Fix typos in /Doc...
596
597
  The key scan codes returned by the ikbd are chosen to simplify the
  implementation of GSX.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
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
678
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
705
  
  GSX Standard Keyboard Mapping.
  
  Hex	Keytop
  01	Esc
  02	1
  03	2
  04	3
  05	4
  06	5
  07	6
  08	7
  09	8
  0A	9
  0B	0
  0C	-
  0D	==
  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	'
  29	`
  2A	(LEFT) SHIFT
  2B	\
  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