-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Apple M0110 Keyboard Protocol
Mac 128k/512k/Plus Keyboard pinout
.---------,
| 1 2 3 4 | 1 GND
| | 2 Clock
| | 3 Data
`---___---' 4 5V
from front of connector
CLOCK is always from KEYBOARD. DATA are sent with MSB first.
1) IDLE: both lines are high.
CLOCK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DATA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2) KEYBOARD->HOST: HOST reads bit on rising edge.
CLOCK ~~~~~~~~~~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~~~~~~~~~
DATA ~~~~~~~~~~~~X777777X666666X555555X444444X333333X222222X111111X000000X~~~~~~~
<--> 160us(clock low)
<---> 180us(clock high)
3) HOST->KEYBOARD: HOST asserts bit on falling edge.
CLOCK ~~~~~~~~~~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~|__|~~~~~~~~~~~
DATA ~~~~~~|_____X777777X666666X555555X444444X333333X222222X111111X000000X~~~~~~~
<----> 840us(request to send by host) <---> 80us(hold DATA)
<--> 180us(clock low)
<---> 220us(clock high)
Inquiry 0x10 get key event with block
Instant 0x12 get key event
Model 0x14 get model number(M0110 responds with 0x09)
bit 7 1 if another device connected(used when keypad exists?)
bit4-6 next device model number
bit1-3 keyboard model number
bit 0 always 1
Test 0x16 test(ACK:0x7D/NAK:0x77)
Raw Code:
bit 7 key state(0:press 1:release)
bit 6-1 scan code(see below)
bit 0 always 1
Model Code Layout Made in Desc
---------------------------------------------------------------------
M0110(GS536) 0x03 US USA
M0110(GS624) 0x09 US USA
M0110F 0x03 French Ireland https://github.com/tmk/tmk_keyboard/issues/771
M0110A(M923) 0x0B US
M0110AJ(M839) 0x0B US
M0110AJ(A615) 0x0B US
M0120(BCG9GRM0120) 0x11
M0120 & M0110(G536) 0x13
M0120 & M0110(G624) 0x19
M0120 & M0110A(M923) 0x1B
.
All keys on M0120 keypad are prefixed with 0x79 simply:
press: 0x79, 0xDD
release: 0x79, 0xUU
where DD = <raw code> and UU = <raw code> | 0x80
,---------------------------------------------------------. ,---------------.
| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *|
|---------------------------------------------------------| |---------------|
|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|-----------------------------------------------------' | |---------------|
|CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|---------------------------------------------------------| |---------------|
|Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|---------------------------------------------------------' |-----------|Ent|
|Optio|Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
`---------------------------------------------------------' `---------------'
,---------------------------------------------------------. ,---------------.
| 65| 25| 27| 29| 2B| 2F| 2D| 35| 39| 33| 3B| 37| 31| 67| |+0F|*11|*1B|*05|
|---------------------------------------------------------| |---------------|
| 61| 19| 1B| 1D| 1F| 23| 21| 41| 45| 3F| 47| 43| 3D| | |+33|+37|+39|+1D|
|-----------------------------------------------------' | |---------------|
| 73| 01| 03| 05| 07| 0B| 09| 4D| 51| 4B| 53| 4F| 49| |+2D|+2F|+31|*0D|
|---------------------------------------------------------| |---------------|
| 71| 0D| 0F| 11| 13| 17| 5B| 5D| 27| 5F| 59| 71|+1B| |+27|+29|+2B| |
|---------------------------------------------------------' |-----------|+19|
| 75| 6F| 63 | 55|+0D|+05|+11| | +25|+03| |
`---------------------------------------------------------' `---------------'
[+] press: 0x79, 0xDD / release: 0x79, 0xUU
[*] press: 0x71, 0x79, 0xDD / release: 0xF1, 0x79, 0xUU
where DD = <raw code> and UU = <raw code> | 0x80
On M0110A Keypad keys and Arrow keys are preceded by 0x79 and some of the keys(=, /, * and +) are preceded by 0x71 on press and 0xF1 on release in addtion.
On M0110A note that Arrow keys and Calc keys(+,*,/,= on keypad) share same byte sequence like below. Preceding 0x71 and 0xF1 means press and release event of SHIFT. This causes a very confusing situation, it is difficult or impossible to tell Calc key from Arrow key plus SHIFT in some cases.
press release
---------------- ----------------
Left: 0x79, 0x0D 0x79, 0x8D
Right: 0x79, 0x05 0x79, 0x85
Up: 0x79, 0x1B 0x79, 0x9B
Down: 0x79, 0x11 0x79, 0x91
Pad+: 0x71, 0x79, 0x0D 0xF1, 0x79, 0x8D
Pad*: 0x71, 0x79, 0x05 0xF1, 0x79, 0x85
Pad/: 0x71, 0x79, 0x1B 0xF1, 0x79, 0x9B
Pad=: 0x71, 0x79, 0x11 0xF1, 0x79, 0x91
TMK converer uses following scan codes instead of M0110 raw codes. The scan codes are converted from raw codes basically like below. MSB(bit7) is set when key is released.
scancode = ((raw&0x80) | ((raw&0x7F)>>1))
And keys on keypad are converted exceptionally.
,---------------------------------------------------------. ,---------------.
| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backs| |Clr| -|Lft|Rgt|
|---------------------------------------------------------| |---------------|
|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| | 7| 8| 9|Up |
|---------------------------------------------------------| |---------------|
|CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6|Dn |
|---------------------------------------------------------| |---------------|
|Shift | Z| X| C| V| B| N| M| ,| ,| /| | | 1| 2| 3| |
`---------------------------------------------------------' |-----------|Ent|
|Opt|Mac | Space |Enter|Opt| | 0| .| |
`------------------------------------------------' `---------------'
,---------------------------------------------------------. ,---------------.
| 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 4E| 46| 42|
|---------------------------------------------------------| |---------------|
| 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4D|
|---------------------------------------------------------| |---------------|
| 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 48|
|---------------------------------------------------------| |---------------|
| 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 38| | 53| 54| 55| |
`---------------------------------------------------------' |-----------| 4C|
| 3A| 37| 31 | 34| 3A| | 52| 41| |
`------------------------------------------------' `---------------'
,---------------------------------------------------------.
| 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33|
|---------------------------------------------------------|
| 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| 2A|
|------------------------------------------------------ |
| 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| |
|---------------------------------------------------------|
| 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 0A| 38|
`---------------------------------------------------------'
| 3A| 37| 34 | 31| 3A|
`------------------------------------------------'
,---------------------------------------------------------. ,---------------.
| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Bcksp| |Clr| =| /| *|
|---------------------------------------------------------| |---------------|
|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| | | 7| 8| 9| -|
|-----------------------------------------------------' | |---------------|
|CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return| | 4| 5| 6| +|
|---------------------------------------------------------| |---------------|
|Shift | Z| X| C| V| B| N| M| ,| ,| /|Shft|Up | | 1| 2| 3| |
|---------------------------------------------------------' |-----------|Ent|
|Optio|Mac | Space | \|Lft|Rgt|Dn | | 0| .| |
`---------------------------------------------------------' `---------------'
,---------------------------------------------------------. ,---------------.
| 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18| 33| | 47| 68| 6D| 62|
|---------------------------------------------------------| |---------------|
| 30| 0C| 0D| 0E| 0F| 10| 11| 20| 22| 1F| 23| 21| 1E| | | 59| 5B| 5C| 4E|
|-----------------------------------------------------' | |---------------|
| 39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24| | 56| 57| 58| 66|
|---------------------------------------------------------| |---------------|
| 38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 38| 4D| | 53| 54| 55| |
|---------------------------------------------------------' |-----------| 4C|
| 3A| 37| 31 | 2A| 46| 42| 48| | 52| 41| |
`---------------------------------------------------------' `---------------'
Discussion thread
Source code
Technical Info for 128K/512K and Plus
- https://www.apple.asimov.net/documentation/macintosh/Mac%20Hardware%20Info%20-%20Mac%20128K.pdf
- https://www.apple.asimov.net/documentation/macintosh/Mac%20Hardware%20Info%20-%20Mac%20Plus.pdf
Protocol:
- Page 20 of Tech Info for 128K/512K
- http://www.mac.linux-m68k.org/devel/plushw.php
Connector:
- Page 20 of Tech Info for 128K/512K
Signaling:
Raw/Scan codes:
- Page 22 of Tech Info for 128K/512K
- Page 07 of Tech Info for Plus
- http://m0115.web.fc2.com/m0110.jpg
- http://m0115.web.fc2.com/m0110a.jpg