André's 8-bit Pages  Projects  Code  Resources  Tools  Forum
(by Google)

PET index - keyboards

The keyboard layout is sometimes a real hassle, because there are in fact quite some different keyboards. The very first one was the chicklet-type keyboard of the original PET. It actually represented the keyboard scan matrix quite nicely. The graphics keyboard is a direct descendant as it uses the same scan matrix.

The business keyboards however have differences. The first and most (if at all) known are the different so-called 50Hz and 60Hz models. Those numbers relate to the power supply line frequency in Europe and the USA resp. Because of this difference there were differences in the video controller, but Commodore also decided to have different keyboards. Later, however, in Europe and even Japan CBM sold nationalized CBM machines with german or other keyboards and character sets. Therefore I will in this document name the keyboards "chicklet", "graphics" and "business-**", where "**" is "us", "uk", "de" etc for the different countries.

  •  
    2020-10-29 Added the links section on how to replace PET keyboards or use them on a PC
  •  
    2015-02-01 Added finish and swedish keyboards (thanks to Ville Muikkula).
  •  
    2010-08-28 Added pictures of German and Japanese keyboards

I now have put my worksheet of the PET keyboard layout here. It is a graphical representation of the PET graphics and business-uk (50Hz) keyboards, with the keycaps and the row/column number in the scan matrix. There is a mapping for the UK (50Hz) business keyboard and the Graphics keyboard. For those of you who would like to send me other mappings, you can use the unix xfig program and the templates in petmaps.tar.gz. (If displaying postscript, use A4 paper format, 29.7cm x 21cm).

There also is my old, hand-drawn version. Unfortunately it is not high-quality, but I hope it helps. It is in klayout.png (150k). You may also see if you can recognize the prints on these images (courtesy Bo Zimmermann):

Chicklet keyboardimage of 2001 chicklet keyboard
image of PET graphics keyboard (main part)image of PET graphics keyboard (number pad)Graphics keyboard
Business keyboardimage of business keyboard (main part)image of business keyboard (number pad)

How is a keyboard read by the operating system? The CPU writes the keyboard row number into PIA1 PA 0-3, where the row number goes from 0 to 9. This is decoded into 10 select lines, each is set high unless the keyboard row matches with it, then it is set low. To each row line there are 8 keys attached that, if pressed, make contact with one of the 8 bits of PIA1 PB. Those inputs are read as high if no key is pressed (pullup resistors). Also if a key is pressed and the corresponding row select line is not low, the input is read high. But if a key is pressed and the row select line of that key is low, the corresponding PB bit is read 0, indicating that the key at the selected row and the position of the 0-bit is pressed. With 10 rows and 8 columns you get up to 80 keys. The keyboard scan matrix reflects this origanization.

The graphics keyboard

Graphics keyboard decoding table:

----+------------------------
row |  7  6  5  4  3  2  1  0
----+------------------------
 9  | 3D 2E FF 03 3C 20 5B 12
    |  =  . -- ^C  < sp  [ ^R   ^C = STOP, ^R = Reverse on
    |
 8  | 2D 30 00 3E FF 5D 40 00
    |  -  0 rs  > --  ] @  ls   rs = right shift, ls = left shift
    |
 7  | 2B 32 FF 3F 2C 4E 56 58
    |  +  2 --  ?  ,  n  v  x
    |
 6  | 33 31 0D 3B 4D 42 43 5A
    |  3  1 ^M  ;  m  b  c  z   ^M = return
    |
 5  | 2A 35 FF 3A 4B 48 46 53
    |  *  5 --  :  k  h  f  s
    |
 4  | 36 34 FF 4C 4A 47 44 41
    |  6  4 --  l  j  g  d  a
    |
 3  | 2F 38 FF 50 49 59 52 57
    |  /  8 --  p  i  y  r  w
    |
 2  | 39 37 5E 4F 55 54 45 51
    |  9  7  ^  o  u  t  e  q
    |
 1  | 14 11 FF 29 5C 27 24 22
    | ^T ^Q --  )  \  '  $  "   ^T = DEL, ^Q = cursor down
    |
 0  | 1d 13 5F 28 26 25 23 21
    | ^] ^S <-  (  &  %  #  !   ^] = cursor right, ^S = home
----+------------------------

The original gfx keyboard reflects the matrix perfectly:

          !  "  #  $  %  '  &  \  (  )  <-     ^s ^q ^] ^t
          q  w  e  r  t  y  u  i  o  p  ^       7  8  9  /
          a  s  d  f  g  h  j  k  l  : ^m       4  5  6  *
          z  x  c  v  b  n  m  ,  ;  ? ^m       1  2  3  +
         LS ^r  @  [  ]  SPACE <  > ^c  RS      0  .  -  =

The shift key always set the high bit, producing a graphic character.

The business keyboard

This is the us and en keyboard scan matrix. The upper ones are the en (50Hz) and the lower ones, if they differ, the us (60Hz) codes.

The keyboard is scanned by writing the row number into the row select port
($E810), then reading the column bits ($E812). Each bit that reads 0
represents a pressed key.

; 00 = Shift
; 10 = Repeat
; 80   flags unshiftable key
; FF = No key

Business keyboard decoding table:

----+------------------------
row |  7  6  5  4  3  2  1  0
----+------------------------
 9  | 16 04 3A 03 39 36 33 DF
    | ^V --  : ^C  9  6  3 <-   ^V = TAB + <- + DEL, ^C = STOP,
    |                            <- = left arrow
 8  | B1 2F 15 13 4D 20 58 12
    | k1  / ^U ^S  m sp  x ^R   k9 = keypad 9, ^U = RVS + A + L,
    |                           ^S = HOME, sp = space, ^R = RVS
 7  | B2 10 0F B0 2C 4E 56 5A   ^O = Z + A + L, rp = repeat
    | k2 rp ^O k0  ,  n  v  z
    |
 6  | B3 00 19 AE 2E 42 43 00
    | k3 rs ^Y k.  .  b  c ls   ^Y = left shift + TAB + I, k. = keypad .
    |                           ls = left shift, rs = right shift
 5  | B4 DB 4F 11 55 54 45 51   ^Q = cursor down
    | k4  [  o ^Q  u  t  e  q
    |    5D]
 4  | 14 50 49 DC 59 52 57 09
    | ^T  p  i  \  y  r  w ^I   ^T = DEL, ^I = TAB
    |          C0@
 3  | B6 C0 4C 0D 4A 47 44 41
    | k6  @  l ^M  j  g  d  a   ^M = return
    |    5B[
 2  | B5 3B 4B DD 48 46 53 9B
    | k5  ;  k  ]  h  f  s ^[   ^[ = ESC
    |    5C\   3B;
 1  | B9 06 DE B7 B0 37 34 31
    | k9 --  ^ k7  0  7  4  1
    |
 0  | 05 0E 1D B8 2D 38 35 32
    |  . ^N ^] k8  -  8  5  2   ^N = both shifts + 2, ^] = cursor right
----+------------------------

Hints

In Basic 4.0 CRTC the (PETSCII) values listed in the table below are recorded in location 151 [this makes distinguishing between the normal 0 key and the one on the numeric keypad impossible]; in older versions (and 4.0 without CRTC) the position in the table is recorded. The position is 8 * (9 - row) + (7 - column) + 1, i.e. starting at 1, incrementing left to right and top to bottom.

Control Codes

CONTROL CODES
=============

F: only on 4.0 fat-40, i.e. NOT on upgrade 4.0 roms.
8: only on 4.0 80 columns.
4B: only on 4.0 upgrade, B keyboard (maybe also on N keybd but I don't
    have a ROM to verify this)

+------+------------------------------+------------------------------------+
|ctrl- | unshifted                    | shifted (unshifted + 128)          |
+------+------------------------------+------------------------------------+
| C  3 | stop                         | load/run, dload"*/run, or dL"*/run |
| G  7 | bell                         | double bell                        |
| I  9 | tab (4B,F,8)                 | set/clear tab (4B,F,8)             |
| M 13 | return                       | fake return                        |
| N 14 | text mode (F,8)              | graphics mode (F,8)                |
| O 15 | set top of window (8)        | set bottom of window (8)           |
| P 16 | erase end of line (F)        | see note (no function)             |
| Q 17 | cursor down                  | cursor up                          |
| R 18 | reverse field on             | reverse field off                  |
| S 19 | cursor home                  | clear screen                       |
| T 20 | delete char left of cursor   | insert space at cursor             |
| U 21 | delete line (8)              | insert line (8)                    |
| V 22 | erase end of line (8)        | erase begin of line (F,8)          |
| Y 25 | scroll up (8)                | scroll down (8)                    |
| [ 26 | escape: end inst & quote mode| (no function)                      |
| ] 28 | cursor right                 | cursor left                        |
|      |                              | 255 pi (converted to 94)           |
+------+------------------------------+------------------------------------+

Note: on the 4.0-40-crtc version the code for "erase end of line" is
different from the 4.0-80 code. Note that the decimal notation of the
former (16, or $10) equals the hex notation of the latter ($16, or 22).
This suggests a typo while editing the assembly source for the other
version.

Larry Anderson wrote in a mail to cbm-hackers:

8032 control characters:

Function       CHR$    ESC/RVS     Keyboard Combination*
 BELL            7        G        [none]
 GRAPHICS      142     Shift N     both SHIFTS + "
 TEXT           14        N        [none]
 SCROLL DOWN   153     Shift Y     Left SHIFT + TAB + I
 SCROLL UP      25        Y        [none]
 SET BOTTOM    143     Shift O     Shift Z + A + L
 SET TOP        15        O        Z + A + L
 INSERT LINE   149     Shift U     Shift RVS + A + L
 DELETE  LINE   21        U        RVS + A + L
 ERASE BEGIN   150     Shift V     Shift TAB + <- + DEL
 ERASE END      22        V        TAB + <- + DEL
 SET/CLR TAB   137     Shift I     Shift TAB
 TAB             9        I        TAB

* Combination means press listed keys simultaneously for function.

8032 Window POKEs:
   Top - 224,(0-24)
Bottom - 225,(Top-24)
  Left - 226,(0-79)
 Right - 213,(Left-79)

The PET was also sold in other countries. Here are some bits of information about those models:

Japan

The Japanese PET has a Yen symbol on the keyboard, and no pound symbol. But it also has some Japanese characters. Here are some pictures of the Japanese model (Courtesy MikeS):

Japanese chicklet keyboard
Japanese graphics keyboard
Japanese screen character ROM (PDF)

Germany

This CBM 8296 has the German umlauts.

German business keyboard

Finland / Sweden

Ville Muikkula was so kind to send me the mappings for the swedish and finnish keyboard mapping (they were using the same mapping in both countries). The ROMs used are the swedish ones on the CBM archive.

Picture of the changed keys
Swedish/Finnish keyboard mapping

Some links to more information and replacement projects:

Keyboard replacements

Keyboards break down or get lost, so how can we replace a PET keyboard?

  • Using a C64 keyboard Steve Gray's project to replace a PET keyboard with a VIC20 or C64 keyboard
  • Petskey A commercial offering from Texelec for a PCB for a new PET graphics keyboard, using modern MX key switches

Using a PET keyboard on other machines

You can even use a PET keyboard on other machines, even though I don't recommend it (don't rip apart a PET for that!)

  • Teensy A project by TechTangent to use a Teensy controller to scan the keyboard and use it via USB on a PC
  • PET USB keyboard A commercial product to usei the PET keyboard on a PC via a USB and a small microcontroller.

More keyboard solutions

Other keyboard-related solutions for PETs

  • usb65 My usb65 project, that enables a 6502 to work as USB device and simulate a keyboard, or to work as a USB host and provide a keyboard for e.g. a PC. I've used it with my PET to use a PC USB keyboard and mouse.

Return to Homepage

Last modified: 2020-10-29
follow

Follow my 8-bit tweets on Mastodon (In new window) or Bluesky

discuss

Discuss my site on this 6502.org forum thread

(Forum registration required to post)

hot!

Dive into the retro feeling and build yourself a Micro-PET or a Multi-board Commodore 4032 replica

Need more speed? Speed up your 6502 computer with this 10 MHz 6502 CPU accelerator board

Interested in electronics design? Look at the design lesson I got from Bil Herd, the hardware designer of the C128

Want 64bit? - pimp the 6502 with the 65k processor design!