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