I believe it would be interesting to understand the inners of the keyboard. You just have to plug it into the joystick port and voilĂ ! But that has not been so easy as I did not have any software to communicate with the keyboard...
The learning keyboard is divided into 9 rows and 12 columns. Each key is dedicated to a specific "real" key: letters (both uppercase and lowercase), numbers, colors, computations (plus qnd minus signs, multiply, divide, equal sign) and function keys (erase, cancel, validate, stop, help, etc.)
Row 1: 0 1 2 3 4 5 6 7 8 9 # Zap Row 2: Black White Red Orange Yellow Green Blue Violet # # Eraser Eraser Row 3: # # # # # # # # # Up # # Row 4: A B C D E F Uppercase # Left Kermit Right # Row 5: G H I J K L Lowercase # # Down # # Row 6: M N O P Q R Print Oops # # # Stop Row 7: S T U V W X Unknown # # # # # Row 8: Y Z ! ? , . Unknown Help # # Go # Row 9: Space Space + - * / = # # # # #
The fastest way to understand the way it works is to create a simple BASIC program and press the different keys of the keyboard.
10 PRINT PDL(0), PDL(1) 20 REM 30 GOTO 10
The X and Y coordinates change based on the key
pressed. When a key is pressed, the X/Y address is set to
the joystick softswitches $C064 (X axis) $C065 (Y axis)
which can then be read by a program.
- Keys on the X-axis are every ~14 pixels
- Keys on the Y-axis are every ~18 pixels
- The uppper-left key (0) is at X=6, Y=8
- The possible X-values are between 6 and 160
- The possible Y-values are between 8 and 138
Now, let's write some code to communicate with the keyboard and collect the X/Y coordinates of the key pressed:
*
* Jim Henson's Muppet Learning Keys
*
* (c) 1984, Henson Associates Inc.
* (s) 2007, Antoine Vignau
*
mx %11
org $2000
lst off
*--------------------------------------
joyBTN = $fd
joyX = $fe
joyY = $ff
*--------------------------------------
jsr $fc58
]lp jsr readJOY
lda joyX
jsr getXaxis
jsr $fdda
lda #" "
jsr $fded
lda joyY
jsr getYaxis
jsr $fdda
lda #$8d
jsr $fded
lda $c000
bpl ]lp
bit $c010
rts
*-------------------------------------- Key to Axis
*
* The following routine returns
* - for the X axis: 0 to B
* - for the Y axis: 0 to 8
getXaxis cmp #$48
bcc getYaxis
clc
adc #$0a
getYaxis and #$f0
lsr
lsr
lsr
lsr
rts
*-------------------------------------- Lecture joystick
readJOY php
sei
lda $c061
and #$80
sta joyBTN
readJOY1 lda $c036
pha
and #$7f
sta $c036
ldx #128
ldy #0
lda $c070
]lp lda $c064
bpl readJOY2
xba
xba
iny
iny
readJOY2 dex
bne ]lp
sty joyX
ldx #128
ldy #0
lda $c070
]lp lda $c065
bpl readJOY3
xba
xba
iny
iny
readJOY3 dex
bne ]lp
sty joyY
pla
sta $c036
plp
rts
The code above is IIgs compliant but must be rewritten for other 8-bit Apple IIs.
Antoine, June 2008