4.Intelligent Keyboard (ikbd) Protocol¶
4.1.Introduction¶
The Atari Corp. Intelligent Keyboard (ikbd) is a general purpose keyboardcontroller that is flexible enough that it can be used in a variety ofproducts 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 secondresolution.The ikbd has been designed to be general enough that it can be used with avariety of new computer products. Product variations in a number ofkeyswitches, mouse resolution, etc. can be accommodated.The ikbd communicates with the main processor over a high speed bi-directionalserial interface. It can function in a variety of modes to facilitatedifferent applications of the keyboard, joysticks, or mouse. Limited use ofthe controller is possible in applications in which only a unidirectionalcommunications medium is available by carefully designing the default modes.
4.2.Keyboard¶
The keyboard always returns key make/break scan codes. The ikbd generateskeyboard scan codes for each key press and release. The key scan make (keyclosure) codes start at 1, and are defined in Appendix A. For example, theISO key position in the scan code table should exist even if no keyswitchexists in that position on a particular keyboard. The break code for each keyis obtained by ORing 0x80 with the make code.
The special codes 0xF6 through 0xFF are reserved for use as follows:
Code | Command |
|---|---|
0xF6 | status report |
0xF7 | absolute mouse position record |
0xF8-0xFB | relative mouse position records (lsbs determined bymouse 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 keyand the RETurn key are also distinct.
4.3.Mouse¶
The mouse port should be capable of supporting a mouse with resolution ofapproximately 200 counts (phase changes or ‘clicks’) per inch of travel. Themouse should be scanned at a rate that will permit accurate tracking atvelocities up to 10 inches per second.The ikbd can report mouse motion in three distinctly different ways. It canreport relative motion, absolute motion in a coordinate system maintainedwithin the ikbd, or by converting mouse motion into keyboard cursor controlkey equivalents.The mouse buttons can be treated as part of the mouse or as additionalkeyboard keys.
4.3.1.Relative Position Reporting¶
In relative position mode, the ikbd will return relative mouse positionrecords whenever a mouse event occurs. A mouse event consists of a mousebutton being pressed or released, or motion in either axis exceeding asettable threshold of motion. Regardless of the threshold, all bits ofresolution are returned to the host computer.Note that the ikbd may return mouse relative position reports withsignificantly more than the threshold delta x or y. This may happen since norelative mouse motion events will be generated: (a) while the keyboard hasbeen ‘paused’ ( the event will be stored until keyboard communications isresumed) (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 stateX ; delta x as twos complement integerY ; delta y as twos complement integer
Note that the value of the button state bits should be valid even if theMOUSE 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 originselected.
4.3.2.Absolute Position reporting¶
The ikbd can also maintain absolute mouse position. Commands exist forresetting the mouse position, setting X/Y scaling, and interrogating thecurrent mouse position.
4.3.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 ineach axis. The ikbd internally maintains mouse motion information to thehighest resolution available, and merely generates a pair of cursor key eventsfor each multiple of the scale factor.Mouse motion produces the cursor key make code immediately followed by thebreak code for the appropriate cursor key. The mouse buttons produce scancodes above those normally assigned for the largest envisioned keyboard (i.e.LEFT=0x74 & RIGHT=0x75).
4.4.Joystick¶
4.4.1.Joystick Event Reporting¶
In this mode, the ikbd generates a record whenever the joystick position ischanged (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
4.4.2.Joystick Interrogation¶
The current state of the joystick ports may be interrogated at any time inthis 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
4.4.3.Joystick Monitoring¶
A mode is available that devotes nearly all of the keyboard communicationstime 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 PAUSEcommand in this mode not only stop the output but also temporarily stopsscanning the joysticks (samples are not queued).
4.4.4.Fire Button Monitoring¶
A mode is provided to permit monitoring a single input bit at a high rate. Inthis mode the ikbd monitors the state of the Joystick 1 fire button at themaximum rate permitted by the serial communication channel. The data is packed8 bits per byte for transmission to the host. The ikbd remains in this modeuntil reset or commanded into another mode. The PAUSE command in this mode notonly stops the output but also temporarily stops scanning the button (samplesare not queued).
4.4.5.Joystick Key Code Mode¶
The ikbd may be commanded to translate the use of either joystick into theequivalent cursor control keystroke(s). The ikbd provides a single breakpointvelocity joystick cursor.Joystick events produce the make code, immediately followed by the break codefor the appropriate cursor motion keys. The trigger or fire buttons of thejoysticks produce pseudo key scan codes above those used by the largest keymatrix envisioned (i.e. JOYSTICK0=0x74, JOYSTICK1=0x75).
4.5.Time-of-Day Clock¶
The ikbd also maintains a time-of-day clock for the system. Commands areavailable to set and interrogate the timer-of-day clock. Time-keeping ismaintained down to a resolution of one second.
4.6.Status Inquiries¶
The current state of ikbd modes and parameters may be found by sending statusinquiry commands that correspond to the ikbd set commands.
4.7.Power-Up Mode¶
The keyboard controller will perform a simple self-test on power-up to detectmajor controller faults (ROM checksum and RAM test) and such things as stuckkeys. 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 akeyboard error). If the controller self-test completes without error, the code0xF0 is returned. (This code will be used to indicate the version/release ofthe ikbd controller. The first release of the ikbd is version 0xF0, shouldthere be a second release it will be 0xF1, and so on.)The ikbd defaults to a mouse position reporting with threshold of 1 unit ineither axis and the Y=0 origin at the top of the screen, and joystick eventreporting mode for joystick 1, with both buttons being logically assigned tothe mouse. After any joystick command, the ikbd assumes that joysticks areconnected to both Joystick0 and Joystick1. Any mouse command (except MOUSEDISABLE) then causes port 0 to again be scanned as if it were a mouse, andboth buttons are logically connected to it. If a mouse disable command isreceived while port 0 is presumed to be a mouse, the button is logicallyassigned to Joystick1 (until the mouse is reenabled by another mouse command).
4.8.ikbd Command Set¶
This section contains a list of commands that can be sent to the ikbd. Commandcodes (such as 0x00) which are not specified should perform no operation(NOPs).
4.8.1.RESET¶
0x800x01
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 causesthe 0x80 to be ignored).A reset may also be caused by sending a break lasting at least 200mS to theikbd.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 300mSof receipt of the RESET command (or the end of the break, or power-up). Theikbd will then scan the key matrix for any stuck (closed) keys. Any keys foundclosed will cause the break scan code to be generated (the break code arrivingwithout being preceded by the make code is a flag for a key matrix error).
4.8.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. Thedefault mouse button action mode is %00000000, the buttons are treated as partof the mouse logically.When buttons act like keys, LEFT=0x74 & RIGHT=0x75.
4.8.3.SET RELATIVE MOUSE POSITION REPORTING¶
0x08
Set relative mouse position reporting. (DEFAULT) Mouse position packets aregenerated asynchronously by the ikbd whenever motion exceeds the setablethreshold in either axis (see SET MOUSE THRESHOLD). Depending upon the mousekey mode, mouse position reports may also be generated when either mousebutton is pressed or released. Otherwise the mouse buttons behave as if theywere keyboard keys.
4.8.4.SET ABSOLUTE MOUSE POSITIONING¶
0x09XMSB ; X maximum (in scaled mouse clicks)XLSBYMSB ; Y maximum (in scaled mouse clicks)YLSB
Set absolute mouse position maintenance. Resets the ikbd maintained X and Ycoordinates.In this mode, the value of the internally maintained coordinates does NOT wrapbetween 0 and large positive numbers. Excess motion below 0 is ignored. Thecommand sets the maximum positive value that can be attained in the scaledcoordinate system. Motion beyond that value is also ignored.
4.8.5.SET MOUSE KEYCODE MODE¶
0x0Adeltax ; 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 ofeither RELATIVE or ABSOLUTE motion records. The ikbd returns the appropriatecursor keycode after mouse travel exceeding the user specified deltas ineither axis. When the keyboard is in key scan code mode, mouse motion willcause the make code immediately followed by the break code. Note that thiscommand is not affected by the mouse motion origin.
4.8.6.SET MOUSE THRESHOLD¶
0x0BX ; 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 thatit does NOT affect the resolution of the data returned to the host. Thiscommand is valid only in RELATIVE MOUSE POSITIONING mode. The thresholdsdefault to 1 at RESET (or power-up).
4.8.7.SET MOUSE SCALE¶
0x0CX ; horizontal mouse ticks per internal XY ; vertical mouse ticks per internal Y
This command sets the scale factor for the ABSOLUTE MOUSE POSITIONING mode.In this mode, the specified number of mouse phase changes (‘clicks’) mustoccur before the internally maintained coordinate is changed by one(independently scaled for each axis). Remember that the mouse positioninformation is available only by interrogating the ikbd in the ABSOLUTE MOUSEPOSITIONING mode unless the ikbd has been commanded to report on button pressor release (see SET MOUSE BUTTON ACTION).
4.8.8.INTERROGATE MOUSE POSITION¶
0x0DReturns: 0xF7 ; absolute mouse position headerBUTTONS 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 MOUSEPOSITIONING mode, regardless of the setting of the MOUSE BUTTON ACTION.
4.8.9.LOAD MOUSE POSITION¶
0x0E0x00 ; fillerXMSB ; X coordinateXLSB ; (in scaled coordinate system)YMSB ; Y coordinateYLSB
This command allows the user to preset the internally maintained absolutemouse position.
4.8.10.SET Y=0 AT BOTTOM¶
0x0F
This command makes the origin of the Y axis to be at the bottom of thelogical coordinate system internal to the ikbd for all relative or absolutemouse motion. This causes mouse motion toward the user to be negative in signand away from the user to be positive.
4.8.11.SET Y=0 AT TOP¶
0x10
Makes the origin of the Y axis to be at the top of the logical coordinatesystem 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 fromthe user to be negative.
4.8.12.RESUME¶
0x11
Resume sending data to the host. Since any command received by the ikbd afterits output has been paused also causes an implicit RESUME this command can bethought of as a NO OPERATION command. If this command is received by the ikbdand it is not PAUSED, it is simply ignored.
4.8.13.DISABLE MOUSE¶
0x12
All mouse event reporting is disabled (and scanning may be internallydisabled). Any valid mouse mode command resumes mouse motion monitoring. (Thevalid mouse mode commands are SET RELATIVE MOUSE POSITION REPORTING, SETABSOLUTE MOUSE POSITIONING, and SET MOUSE KEYCODE MODE. )N.B. If the mouse buttons have been commanded to act like keyboard keys, thiscommand DOES affect their actions.
4.8.14.PAUSE OUTPUT¶
0x13
Stop sending data to the host until another valid command is received. Keymatrix activity is still monitored and scan codes or ASCII characters enqueued(up to the maximum supported by the microcontroller) to be sent when the hostallows 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 isin RELATIVE MOUSE POSITIONING REPORTING mode, motion is accumulated beyond thenormal threshold limits to produce the minimum number of packets necessary fortransmission when output is resumed. Pressing or releasing either mouse buttoncauses any accumulated motion to be immediately queued as packets, if themouse is in RELATIVE MOUSE POSITION REPORTING mode.Because of the limitations of the microcontroller memory this command shouldbe 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 PAUSEOUTPUT command is received in the middle of a multiple byte report, the packetwill 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 BUTTONMONITORING mode, the PAUSE OUTPUT command also temporarily stops themonitoring process (i.e. the samples are not enqueued for transmission).
4.8.15.SET JOYSTICK EVENT REPORTING¶
0x14
Enter JOYSTICK EVENT REPORTING mode (DEFAULT). Each opening or closure of ajoystick switch or trigger causes a joystick event record to be generated.
4.8.16.SET JOYSTICK INTERROGATION MODE¶
0x15
Disables JOYSTICK EVENT REPORTING. Host must send individual JOYSTICKINTERROGATE commands to sense joystick state.
4.8.17.JOYSTICK INTERROGATE¶
0x16
Return a record indicating the current state of the joysticks. This commandis valid in either the JOYSTICK EVENT REPORTING mode or the JOYSTICKINTERROGATION MODE.
4.8.18.SET JOYSTICK MONITORING¶
0x17rate ; time between samples in hundredths of a secondReturns: (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
Sets the ikbd to do nothing but monitor the serial command line, maintain thetime-of-day clock, and monitor the joystick. The rate sets the intervalbetween joystick samples.N.B. The user should not set the rate higher than the serial communicationschannel will allow the 2 bytes packets to be transmitted.
4.8.19.SET FIRE BUTTON MONITORING¶
0x18Returns: (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 thetime-of-day clock, and monitor the fire button on Joystick 1. The fire buttonis scanned at a rate that causes 8 samples to be made in the time it takes forthe 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.
4.8.20.SET JOYSTICK KEYCODE MODE¶
0x19RX ; length of time (in tenths of seconds) until ; horizontal velocity breakpoint is reachedRY ; length of time (in tenths of seconds) until ; vertical velocity breakpoint is reachedTX ; length (in tenths of seconds) of joystick closure ; until horizontal cursor key is generated before RX ; has elapsedTY ; length (in tenths of seconds) of joystick closure ; until vertical cursor key is generated before RY ; has elapsedVX ; length (in tenths of seconds) of joystick closure ; until horizontal cursor keystrokes are generated ; after RX has elapsedVY ; length (in tenths of seconds) of joystick closure ; until vertical cursor keystrokes are generated ; 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 Rntenths of seconds later, keystroke pairs are generated every Tn tenths ofseconds. After the Rn breakpoint is reached, keystroke pairs are generatedevery Vn tenths of seconds. This provides a velocity (auto-repeat) breakpointfeature.Note that by setting RX and/or Ry to zero, the velocity feature can bedisabled. The values of TX and TY then become meaningless, and the generationof cursor ‘keystrokes’ is set by VX and VY.
4.8.21.DISABLE JOYSTICKS¶
0x1A
Disable the generation of any joystick events (and scanning may be internallydisabled). Any valid joystick mode command resumes joystick monitoring. (Thejoystick mode commands are SET JOYSTICK EVENT REPORTING, SET JOYSTICKINTERROGATION MODE, SET JOYSTICK MONITORING, SET FIRE BUTTON MONITORING, andSET JOYSTICK KEYCODE MODE.)
4.8.22.TIME-OF-DAY CLOCK SET¶
0x1BYY ; year (2 least significant digits)MM ; monthDD ; dayhh ; hourmm ; minutess ; 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 settingonly some subfields of the time-of-day clock.
4.8.23.INTERROGATE TIME-OF-DAT CLOCK¶
0x1CReturns: 0xFC ; time-of-day event header YY ; year (2 least significant digits) MM ; month DD ; day hh ; hour mm ; minute ss ; secondAll time-of-day is sent in packed BCD format.
4.8.24.MEMORY LOAD¶
0x20ADRMSB ; address in controllerADRLSB ; memory to be loadedNUM ; number of bytes (0-128){ data }This command permits the host to load arbitrary values into the ikbdcontroller memory. The time between data bytes must be less than 20ms.
4.8.25.MEMORY READ¶
0x21ADRMSB ; address in controllerADRLSB ; memory to be readReturns: 0xF6 ; status header 0x20 ; memory access { data } ; 6 data bytes starting at ADRThis command permits the host to read from the ikbd controller memory.
4.8.26.CONTROLLER EXECUTE¶
0x22ADRMSB ; address of subroutine inADRLSB ; controller memory to be called
This command allows the host to command the execution of a subroutine in theikbd controller memory.
4.8.27.STATUS INQUIRIES¶
Status commands are formed by inclusively ORing 0x80 with therelevant SET command.Example:0x88 (or 0x89 or 0x8A) ; request mouse modeReturns: 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 modeor the parameters associated with a given command. All status reports arepadded to form 8 byte long return packets. The responses to the statusrequests are designed so that the host may store them away (after strippingoff the status report header byte) and later send them back as commands toikbd to restore its state. The 0 pad bytes will be treated as NOPs by theikbd.
Valid STATUS INQUIRY commands are:
0x87 mouse button action0x88 mouse mode0x890x8A0x8B mnouse threshold0x8C mouse scale0x8F mouse vertical coordinates0x90 ( returns 0x0F Y=0 at bottom 0x10 Y=0 at top )0x92 mouse enable/disable ( returns 0x00 enabled) 0x12 disabled )0x94 joystick mode0x950x960x9A joystick enable/disable ( returns 0x00 enabled 0x1A disabled )
It is the (host) programmer’s responsibility to have only one unansweredinquiry in process at a time.STATUS INQUIRY commands are not valid if the ikbd is in JOYSTICK MONITORINGmode or FIRE BUTTON MONITORING mode.
4.9.SCAN CODES¶
The key scan codes returned by the ikbd are chosen to simplify theimplementation of GSX.
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 |