Do you know the Muppet show? In 1984, a keyboard was released for our Apple IIs: Jim Henson's Muppet Learning Keyboard.

    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 and 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) : 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
    When there are no keys pressed, the X and Y softswitches values are above the limits of 160 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
    Update, May 2018