rjw | 1f88458 | 2022-01-06 17:20:42 +0800 | [diff] [blame^] | 1 | ==================================== |
| 2 | Intelligent Keyboard (ikbd) Protocol |
| 3 | ==================================== |
| 4 | |
| 5 | |
| 6 | Introduction |
| 7 | ============ |
| 8 | |
| 9 | The Atari Corp. Intelligent Keyboard (ikbd) is a general purpose keyboard |
| 10 | controller that is flexible enough that it can be used in a variety of |
| 11 | products without modification. The keyboard, with its microcontroller, |
| 12 | provides a convenient connection point for a mouse and switch-type joysticks. |
| 13 | The ikbd processor also maintains a time-of-day clock with one second |
| 14 | resolution. |
| 15 | 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 |
| 17 | keyswitches, mouse resolution, etc. can be accommodated. |
| 18 | The ikbd communicates with the main processor over a high speed bi-directional |
| 19 | serial interface. It can function in a variety of modes to facilitate |
| 20 | different applications of the keyboard, joysticks, or mouse. Limited use of |
| 21 | the controller is possible in applications in which only a unidirectional |
| 22 | communications medium is available by carefully designing the default modes. |
| 23 | |
| 24 | Keyboard |
| 25 | ======== |
| 26 | |
| 27 | The keyboard always returns key make/break scan codes. The ikbd generates |
| 28 | keyboard scan codes for each key press and release. The key scan make (key |
| 29 | closure) codes start at 1, and are defined in Appendix A. For example, the |
| 30 | ISO key position in the scan code table should exist even if no keyswitch |
| 31 | exists in that position on a particular keyboard. The break code for each key |
| 32 | is obtained by ORing 0x80 with the make code. |
| 33 | |
| 34 | The 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 | |
| 49 | The two shift keys return different scan codes in this mode. The ENTER key |
| 50 | and the RETurn key are also distinct. |
| 51 | |
| 52 | Mouse |
| 53 | ===== |
| 54 | |
| 55 | The mouse port should be capable of supporting a mouse with resolution of |
| 56 | approximately 200 counts (phase changes or 'clicks') per inch of travel. The |
| 57 | mouse should be scanned at a rate that will permit accurate tracking at |
| 58 | velocities up to 10 inches per second. |
| 59 | The ikbd can report mouse motion in three distinctly different ways. It can |
| 60 | report relative motion, absolute motion in a coordinate system maintained |
| 61 | within the ikbd, or by converting mouse motion into keyboard cursor control |
| 62 | key equivalents. |
| 63 | The mouse buttons can be treated as part of the mouse or as additional |
| 64 | keyboard keys. |
| 65 | |
| 66 | Relative Position Reporting |
| 67 | --------------------------- |
| 68 | |
| 69 | In relative position mode, the ikbd will return relative mouse position |
| 70 | records whenever a mouse event occurs. A mouse event consists of a mouse |
| 71 | button being pressed or released, or motion in either axis exceeding a |
| 72 | settable threshold of motion. Regardless of the threshold, all bits of |
| 73 | resolution are returned to the host computer. |
| 74 | Note that the ikbd may return mouse relative position reports with |
| 75 | significantly more than the threshold delta x or y. This may happen since no |
| 76 | relative mouse motion events will be generated: (a) while the keyboard has |
| 77 | been 'paused' ( the event will be stored until keyboard communications is |
| 78 | resumed) (b) while any event is being transmitted. |
| 79 | |
| 80 | The 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 | |
| 89 | Note that the value of the button state bits should be valid even if the |
| 90 | MOUSE BUTTON ACTION has set the buttons to act like part of the keyboard. |
| 91 | If the accumulated motion before the report packet is generated exceeds the |
| 92 | +127...-128 range, the motion is broken into multiple packets. |
| 93 | Note that the sign of the delta y reported is a function of the Y origin |
| 94 | selected. |
| 95 | |
| 96 | Absolute Position reporting |
| 97 | --------------------------- |
| 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 |
| 101 | current mouse position. |
| 102 | |
| 103 | Mouse Cursor Key Mode |
| 104 | --------------------- |
| 105 | |
| 106 | The ikbd can translate mouse motion into the equivalent cursor keystrokes. |
| 107 | The number of mouse clicks per keystroke is independently programmable in |
| 108 | each axis. The ikbd internally maintains mouse motion information to the |
| 109 | highest resolution available, and merely generates a pair of cursor key events |
| 110 | for each multiple of the scale factor. |
| 111 | Mouse motion produces the cursor key make code immediately followed by the |
| 112 | break code for the appropriate cursor key. The mouse buttons produce scan |
| 113 | codes above those normally assigned for the largest envisioned keyboard (i.e. |
| 114 | LEFT=0x74 & RIGHT=0x75). |
| 115 | |
| 116 | Joystick |
| 117 | ======== |
| 118 | |
| 119 | Joystick Event Reporting |
| 120 | ------------------------ |
| 121 | |
| 122 | In this mode, the ikbd generates a record whenever the joystick position is |
| 123 | changed (i.e. for each opening or closing of a joystick switch or trigger). |
| 124 | |
| 125 | The 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 | |
| 132 | Joystick Interrogation |
| 133 | ---------------------- |
| 134 | |
| 135 | The current state of the joystick ports may be interrogated at any time in |
| 136 | this mode by sending an 'Interrogate Joystick' command to the ikbd. |
| 137 | |
| 138 | The 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 | |
| 146 | Joystick Monitoring |
| 147 | ------------------- |
| 148 | |
| 149 | A mode is available that devotes nearly all of the keyboard communications |
| 150 | time to reporting the state of the joystick ports at a user specifiable rate. |
| 151 | It remains in this mode until reset or commanded into another mode. The PAUSE |
| 152 | command in this mode not only stop the output but also temporarily stops |
| 153 | scanning the joysticks (samples are not queued). |
| 154 | |
| 155 | Fire Button Monitoring |
| 156 | ---------------------- |
| 157 | |
| 158 | A mode is provided to permit monitoring a single input bit at a high rate. In |
| 159 | this mode the ikbd monitors the state of the Joystick 1 fire button at the |
| 160 | maximum rate permitted by the serial communication channel. The data is packed |
| 161 | 8 bits per byte for transmission to the host. The ikbd remains in this mode |
| 162 | until reset or commanded into another mode. The PAUSE command in this mode not |
| 163 | only stops the output but also temporarily stops scanning the button (samples |
| 164 | are not queued). |
| 165 | |
| 166 | Joystick Key Code Mode |
| 167 | ---------------------- |
| 168 | |
| 169 | The ikbd may be commanded to translate the use of either joystick into the |
| 170 | equivalent cursor control keystroke(s). The ikbd provides a single breakpoint |
| 171 | velocity joystick cursor. |
| 172 | Joystick events produce the make code, immediately followed by the break code |
| 173 | for the appropriate cursor motion keys. The trigger or fire buttons of the |
| 174 | joysticks produce pseudo key scan codes above those used by the largest key |
| 175 | matrix envisioned (i.e. JOYSTICK0=0x74, JOYSTICK1=0x75). |
| 176 | |
| 177 | Time-of-Day Clock |
| 178 | ================= |
| 179 | |
| 180 | The ikbd also maintains a time-of-day clock for the system. Commands are |
| 181 | available to set and interrogate the timer-of-day clock. Time-keeping is |
| 182 | maintained down to a resolution of one second. |
| 183 | |
| 184 | Status Inquiries |
| 185 | ================ |
| 186 | |
| 187 | The current state of ikbd modes and parameters may be found by sending status |
| 188 | inquiry commands that correspond to the ikbd set commands. |
| 189 | |
| 190 | Power-Up Mode |
| 191 | ============= |
| 192 | |
| 193 | The keyboard controller will perform a simple self-test on power-up to detect |
| 194 | major controller faults (ROM checksum and RAM test) and such things as stuck |
| 195 | keys. 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 |
| 197 | keyboard error). If the controller self-test completes without error, the code |
| 198 | 0xF0 is returned. (This code will be used to indicate the version/release of |
| 199 | the ikbd controller. The first release of the ikbd is version 0xF0, should |
| 200 | there be a second release it will be 0xF1, and so on.) |
| 201 | The ikbd defaults to a mouse position reporting with threshold of 1 unit in |
| 202 | either axis and the Y=0 origin at the top of the screen, and joystick event |
| 203 | reporting mode for joystick 1, with both buttons being logically assigned to |
| 204 | the mouse. After any joystick command, the ikbd assumes that joysticks are |
| 205 | connected to both Joystick0 and Joystick1. Any mouse command (except MOUSE |
| 206 | DISABLE) then causes port 0 to again be scanned as if it were a mouse, and |
| 207 | both buttons are logically connected to it. If a mouse disable command is |
| 208 | received while port 0 is presumed to be a mouse, the button is logically |
| 209 | assigned to Joystick1 (until the mouse is reenabled by another mouse command). |
| 210 | |
| 211 | ikbd Command Set |
| 212 | ================ |
| 213 | |
| 214 | This section contains a list of commands that can be sent to the ikbd. Command |
| 215 | codes (such as 0x00) which are not specified should perform no operation |
| 216 | (NOPs). |
| 217 | |
| 218 | RESET |
| 219 | ----- |
| 220 | |
| 221 | :: |
| 222 | |
| 223 | 0x80 |
| 224 | 0x01 |
| 225 | |
| 226 | N.B. The RESET command is the only two byte command understood by the ikbd. |
| 227 | Any byte following an 0x80 command byte other than 0x01 is ignored (and causes |
| 228 | the 0x80 to be ignored). |
| 229 | A reset may also be caused by sending a break lasting at least 200mS to the |
| 230 | ikbd. |
| 231 | Executing the RESET command returns the keyboard to its default (power-up) |
| 232 | mode and parameter settings. It does not affect the time-of-day clock. |
| 233 | The RESET command or function causes the ikbd to perform a simple self-test. |
| 234 | If the test is successful, the ikbd will send the code of 0xF0 within 300mS |
| 235 | of receipt of the RESET command (or the end of the break, or power-up). The |
| 236 | ikbd will then scan the key matrix for any stuck (closed) keys. Any keys found |
| 237 | closed will cause the break scan code to be generated (the break code arriving |
| 238 | without being preceded by the make code is a flag for a key matrix error). |
| 239 | |
| 240 | SET 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 | |
| 254 | This command sets how the ikbd should treat the buttons on the mouse. The |
| 255 | default mouse button action mode is %00000000, the buttons are treated as part |
| 256 | of the mouse logically. |
| 257 | When buttons act like keys, LEFT=0x74 & RIGHT=0x75. |
| 258 | |
| 259 | SET RELATIVE MOUSE POSITION REPORTING |
| 260 | ------------------------------------- |
| 261 | |
| 262 | :: |
| 263 | |
| 264 | 0x08 |
| 265 | |
| 266 | Set relative mouse position reporting. (DEFAULT) Mouse position packets are |
| 267 | generated asynchronously by the ikbd whenever motion exceeds the setable |
| 268 | threshold in either axis (see SET MOUSE THRESHOLD). Depending upon the mouse |
| 269 | key mode, mouse position reports may also be generated when either mouse |
| 270 | button is pressed or released. Otherwise the mouse buttons behave as if they |
| 271 | were keyboard keys. |
| 272 | |
| 273 | SET 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 | |
| 284 | Set absolute mouse position maintenance. Resets the ikbd maintained X and Y |
| 285 | coordinates. |
| 286 | In this mode, the value of the internally maintained coordinates does NOT wrap |
| 287 | between 0 and large positive numbers. Excess motion below 0 is ignored. The |
| 288 | command sets the maximum positive value that can be attained in the scaled |
| 289 | coordinate system. Motion beyond that value is also ignored. |
| 290 | |
| 291 | SET MOUSE KEYCODE MOSE |
| 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 | |
| 300 | Set mouse monitoring routines to return cursor motion keycodes instead of |
| 301 | either RELATIVE or ABSOLUTE motion records. The ikbd returns the appropriate |
| 302 | cursor keycode after mouse travel exceeding the user specified deltas in |
| 303 | either axis. When the keyboard is in key scan code mode, mouse motion will |
| 304 | cause the make code immediately followed by the break code. Note that this |
| 305 | command is not affected by the mouse motion origin. |
| 306 | |
| 307 | SET 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 | |
| 316 | This command sets the threshold before a mouse event is generated. Note that |
| 317 | it does NOT affect the resolution of the data returned to the host. This |
| 318 | command is valid only in RELATIVE MOUSE POSITIONING mode. The thresholds |
| 319 | default to 1 at RESET (or power-up). |
| 320 | |
| 321 | SET 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 | |
| 330 | This command sets the scale factor for the ABSOLUTE MOUSE POSITIONING mode. |
| 331 | In this mode, the specified number of mouse phase changes ('clicks') must |
| 332 | occur before the internally maintained coordinate is changed by one |
| 333 | (independently scaled for each axis). Remember that the mouse position |
| 334 | information is available only by interrogating the ikbd in the ABSOLUTE MOUSE |
| 335 | POSITIONING mode unless the ikbd has been commanded to report on button press |
| 336 | or release (see SET MOSE BUTTON ACTION). |
| 337 | |
| 338 | INTERROGATE 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 | |
| 356 | The INTERROGATE MOUSE POSITION command is valid when in the ABSOLUTE MOUSE |
| 357 | POSITIONING mode, regardless of the setting of the MOUSE BUTTON ACTION. |
| 358 | |
| 359 | LOAD 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 | |
| 371 | This command allows the user to preset the internally maintained absolute |
| 372 | mouse position. |
| 373 | |
| 374 | SET Y=0 AT BOTTOM |
| 375 | ----------------- |
| 376 | |
| 377 | :: |
| 378 | |
| 379 | 0x0F |
| 380 | |
| 381 | This command makes the origin of the Y axis to be at the bottom of the |
| 382 | logical coordinate system internal to the ikbd for all relative or absolute |
| 383 | mouse motion. This causes mouse motion toward the user to be negative in sign |
| 384 | and away from the user to be positive. |
| 385 | |
| 386 | SET Y=0 AT TOP |
| 387 | -------------- |
| 388 | |
| 389 | :: |
| 390 | |
| 391 | 0x10 |
| 392 | |
| 393 | Makes the origin of the Y axis to be at the top of the logical coordinate |
| 394 | system within the ikbd for all relative or absolute mouse motion. (DEFAULT) |
| 395 | This causes mouse motion toward the user to be positive in sign and away from |
| 396 | the user to be negative. |
| 397 | |
| 398 | RESUME |
| 399 | ------ |
| 400 | |
| 401 | :: |
| 402 | |
| 403 | 0x11 |
| 404 | |
| 405 | Resume sending data to the host. Since any command received by the ikbd after |
| 406 | its output has been paused also causes an implicit RESUME this command can be |
| 407 | thought of as a NO OPERATION command. If this command is received by the ikbd |
| 408 | and it is not PAUSED, it is simply ignored. |
| 409 | |
| 410 | DISABLE MOUSE |
| 411 | ------------- |
| 412 | |
| 413 | :: |
| 414 | |
| 415 | 0x12 |
| 416 | |
| 417 | All mouse event reporting is disabled (and scanning may be internally |
| 418 | disabled). Any valid mouse mode command resumes mouse motion monitoring. (The |
| 419 | valid mouse mode commands are SET RELATIVE MOUSE POSITION REPORTING, SET |
| 420 | ABSOLUTE MOUSE POSITIONING, and SET MOUSE KEYCODE MODE. ) |
| 421 | N.B. If the mouse buttons have been commanded to act like keyboard keys, this |
| 422 | command DOES affect their actions. |
| 423 | |
| 424 | PAUSE OUTPUT |
| 425 | ------------ |
| 426 | |
| 427 | :: |
| 428 | |
| 429 | 0x13 |
| 430 | |
| 431 | Stop sending data to the host until another valid command is received. Key |
| 432 | matrix 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 |
| 434 | allows the output to be resumed. If in the JOYSTICK EVENT REPORTING mode, |
| 435 | joystick events are also queued. |
| 436 | Mouse motion should be accumulated while the output is paused. If the ikbd is |
| 437 | in RELATIVE MOUSE POSITIONING REPORTING mode, motion is accumulated beyond the |
| 438 | normal threshold limits to produce the minimum number of packets necessary for |
| 439 | transmission when output is resumed. Pressing or releasing either mouse button |
| 440 | causes any accumulated motion to be immediately queued as packets, if the |
| 441 | mouse is in RELATIVE MOUSE POSITION REPORTING mode. |
| 442 | Because of the limitations of the microcontroller memory this command should |
| 443 | be used sparingly, and the output should not be shut of for more than <tbd> |
| 444 | milliseconds at a time. |
| 445 | The output is stopped only at the end of the current 'even'. If the PAUSE |
| 446 | OUTPUT command is received in the middle of a multiple byte report, the packet |
| 447 | will still be transmitted to conclusion and then the PAUSE will take effect. |
| 448 | When the ikbd is in either the JOYSTICK MONITORING mode or the FIRE BUTTON |
| 449 | MONITORING mode, the PAUSE OUTPUT command also temporarily stops the |
| 450 | monitoring process (i.e. the samples are not enqueued for transmission). |
| 451 | |
| 452 | SET JOYSTICK EVENT REPORTING |
| 453 | ---------------------------- |
| 454 | |
| 455 | :: |
| 456 | |
| 457 | 0x14 |
| 458 | |
| 459 | Enter JOYSTICK EVENT REPORTING mode (DEFAULT). Each opening or closure of a |
| 460 | joystick switch or trigger causes a joystick event record to be generated. |
| 461 | |
| 462 | SET JOYSTICK INTERROGATION MODE |
| 463 | ------------------------------- |
| 464 | |
| 465 | :: |
| 466 | |
| 467 | 0x15 |
| 468 | |
| 469 | Disables JOYSTICK EVENT REPORTING. Host must send individual JOYSTICK |
| 470 | INTERROGATE commands to sense joystick state. |
| 471 | |
| 472 | JOYSTICK INTERROGATE |
| 473 | -------------------- |
| 474 | |
| 475 | :: |
| 476 | |
| 477 | 0x16 |
| 478 | |
| 479 | Return a record indicating the current state of the joysticks. This command |
| 480 | is valid in either the JOYSTICK EVENT REPORTING mode or the JOYSTICK |
| 481 | INTERROGATION MODE. |
| 482 | |
| 483 | SET 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 | |
| 496 | Sets the ikbd to do nothing but monitor the serial command line, maintain the |
| 497 | time-of-day clock, and monitor the joystick. The rate sets the interval |
| 498 | between joystick samples. |
| 499 | N.B. The user should not set the rate higher than the serial communications |
| 500 | channel will allow the 2 bytes packets to be transmitted. |
| 501 | |
| 502 | SET 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 | |
| 512 | Set the ikbd to do nothing but monitor the serial command line, maintain the |
| 513 | time-of-day clock, and monitor the fire button on Joystick 1. The fire button |
| 514 | is scanned at a rate that causes 8 samples to be made in the time it takes for |
| 515 | the previous byte to be sent to the host (i.e. scan rate = 8/10 * baud rate). |
| 516 | The sample interval should be as constant as possible. |
| 517 | |
| 518 | SET 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 | |
| 541 | In this mode, joystick 0 is scanned in a way that simulates cursor keystrokes. |
| 542 | On initial closure, a keystroke pair (make/break) is generated. Then up to Rn |
| 543 | tenths of seconds later, keystroke pairs are generated every Tn tenths of |
| 544 | seconds. After the Rn breakpoint is reached, keystroke pairs are generated |
| 545 | every Vn tenths of seconds. This provides a velocity (auto-repeat) breakpoint |
| 546 | feature. |
| 547 | Note that by setting RX and/or Ry to zero, the velocity feature can be |
| 548 | disabled. The values of TX and TY then become meaningless, and the generation |
| 549 | of cursor 'keystrokes' is set by VX and VY. |
| 550 | |
| 551 | DISABLE JOYSTICKS |
| 552 | ----------------- |
| 553 | |
| 554 | :: |
| 555 | |
| 556 | 0x1A |
| 557 | |
| 558 | Disable the generation of any joystick events (and scanning may be internally |
| 559 | disabled). Any valid joystick mode command resumes joystick monitoring. (The |
| 560 | joystick mode commands are SET JOYSTICK EVENT REPORTING, SET JOYSTICK |
| 561 | INTERROGATION MODE, SET JOYSTICK MONITORING, SET FIRE BUTTON MONITORING, and |
| 562 | SET JOYSTICK KEYCODE MODE.) |
| 563 | |
| 564 | TIME-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 | |
| 577 | All time-of-day data should be sent to the ikbd in packed BCD format. |
| 578 | Any digit that is not a valid BCD digit should be treated as a 'don't care' |
| 579 | and not alter that particular field of the date or time. This permits setting |
| 580 | only some subfields of the time-of-day clock. |
| 581 | |
| 582 | INTERROGATE 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 | |
| 599 | MEMORY 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 | |
| 610 | This command permits the host to load arbitrary values into the ikbd |
| 611 | controller memory. The time between data bytes must be less than 20ms. |
| 612 | |
| 613 | MEMORY 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 | |
| 626 | This command permits the host to read from the ikbd controller memory. |
| 627 | |
| 628 | CONTROLLER EXECUTE |
| 629 | ------------------ |
| 630 | |
| 631 | :: |
| 632 | |
| 633 | 0x22 |
| 634 | ADRMSB ; address of subroutine in |
| 635 | ADRLSB ; controller memory to be called |
| 636 | |
| 637 | This command allows the host to command the execution of a subroutine in the |
| 638 | ikbd controller memory. |
| 639 | |
| 640 | STATUS 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 | |
| 670 | The STATUS INQUIRY commands request the ikbd to return either the current mode |
| 671 | or the parameters associated with a given command. All status reports are |
| 672 | padded to form 8 byte long return packets. The responses to the status |
| 673 | requests are designed so that the host may store them away (after stripping |
| 674 | off the status report header byte) and later send them back as commands to |
| 675 | ikbd to restore its state. The 0 pad bytes will be treated as NOPs by the |
| 676 | ikbd. |
| 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 | |
| 699 | It is the (host) programmer's responsibility to have only one unanswered |
| 700 | inquiry in process at a time. |
| 701 | STATUS INQUIRY commands are not valid if the ikbd is in JOYSTICK MONITORING |
| 702 | mode or FIRE BUTTON MONITORING mode. |
| 703 | |
| 704 | |
| 705 | SCAN CODES |
| 706 | ========== |
| 707 | |
| 708 | The key scan codes returned by the ikbd are chosen to simplify the |
| 709 | implementation of GSX. |
| 710 | |
| 711 | GSX Standard Keyboard Mapping |
| 712 | |
| 713 | ======= ============ |
| 714 | Hex Keytop |
| 715 | ======= ============ |
| 716 | 01 Esc |
| 717 | 02 1 |
| 718 | 03 2 |
| 719 | 04 3 |
| 720 | 05 4 |
| 721 | 06 5 |
| 722 | 07 6 |
| 723 | 08 7 |
| 724 | 09 8 |
| 725 | 0A 9 |
| 726 | 0B 0 |
| 727 | 0C \- |
| 728 | 0D \= |
| 729 | 0E BS |
| 730 | 0F TAB |
| 731 | 10 Q |
| 732 | 11 W |
| 733 | 12 E |
| 734 | 13 R |
| 735 | 14 T |
| 736 | 15 Y |
| 737 | 16 U |
| 738 | 17 I |
| 739 | 18 O |
| 740 | 19 P |
| 741 | 1A [ |
| 742 | 1B ] |
| 743 | 1C RET |
| 744 | 1D CTRL |
| 745 | 1E A |
| 746 | 1F S |
| 747 | 20 D |
| 748 | 21 F |
| 749 | 22 G |
| 750 | 23 H |
| 751 | 24 J |
| 752 | 25 K |
| 753 | 26 L |
| 754 | 27 ; |
| 755 | 28 ' |
| 756 | 29 \` |
| 757 | 2A (LEFT) SHIFT |
| 758 | 2B \\ |
| 759 | 2C Z |
| 760 | 2D X |
| 761 | 2E C |
| 762 | 2F V |
| 763 | 30 B |
| 764 | 31 N |
| 765 | 32 M |
| 766 | 33 , |
| 767 | 34 . |
| 768 | 35 / |
| 769 | 36 (RIGHT) SHIFT |
| 770 | 37 { NOT USED } |
| 771 | 38 ALT |
| 772 | 39 SPACE BAR |
| 773 | 3A CAPS LOCK |
| 774 | 3B F1 |
| 775 | 3C F2 |
| 776 | 3D F3 |
| 777 | 3E F4 |
| 778 | 3F F5 |
| 779 | 40 F6 |
| 780 | 41 F7 |
| 781 | 42 F8 |
| 782 | 43 F9 |
| 783 | 44 F10 |
| 784 | 45 { NOT USED } |
| 785 | 46 { NOT USED } |
| 786 | 47 HOME |
| 787 | 48 UP ARROW |
| 788 | 49 { NOT USED } |
| 789 | 4A KEYPAD - |
| 790 | 4B LEFT ARROW |
| 791 | 4C { NOT USED } |
| 792 | 4D RIGHT ARROW |
| 793 | 4E KEYPAD + |
| 794 | 4F { NOT USED } |
| 795 | 50 DOWN ARROW |
| 796 | 51 { NOT USED } |
| 797 | 52 INSERT |
| 798 | 53 DEL |
| 799 | 54 { NOT USED } |
| 800 | 5F { NOT USED } |
| 801 | 60 ISO KEY |
| 802 | 61 UNDO |
| 803 | 62 HELP |
| 804 | 63 KEYPAD ( |
| 805 | 64 KEYPAD / |
| 806 | 65 KEYPAD * |
| 807 | 66 KEYPAD * |
| 808 | 67 KEYPAD 7 |
| 809 | 68 KEYPAD 8 |
| 810 | 69 KEYPAD 9 |
| 811 | 6A KEYPAD 4 |
| 812 | 6B KEYPAD 5 |
| 813 | 6C KEYPAD 6 |
| 814 | 6D KEYPAD 1 |
| 815 | 6E KEYPAD 2 |
| 816 | 6F KEYPAD 3 |
| 817 | 70 KEYPAD 0 |
| 818 | 71 KEYPAD . |
| 819 | 72 KEYPAD ENTER |
| 820 | ======= ============ |