Reference articles on history, science, culture and more
Encyclopedia

PETSCII

Character encoding on Commodore computers

Image credit is listed at the end of this article.

PETSCII (PET Standard Code of Information Interchange), also known as CBM ASCII, is the character set used in Commodore Business Machines' 8-bit home computers.

This character set was first used by the PET from 1977, and was subsequently used by the CBM-II, VIC-20, Commodore 64, Commodore 16, Commodore 116, Plus/4, and Commodore 128. However, the Amiga personal computer family instead uses standard ISO/IEC 8859-1.

01History

The character set was largely designed by Leonard Tramiel (the son of Commodore CEO Jack Tramiel) and PET designer Chuck Peddle. The graphic characters of PETSCII were one of the extensions Commodore specified for Commodore BASIC when laying out desired changes to Microsoft's existing 6502 BASIC to Microsoft's Ric Weiland in 1977. The VIC-20 used the same pixel-for-pixel font as the PET, although the characters appeared wider due to the VIC's 22-column screen. The Commodore 64, however, used a slightly re-designed, heavy upper-case font, essentially a thicker version of the PET's, in order to avoid color artifacts created by the machine's higher resolution screen. The C64's lowercase characters are identical to the lowercase characters in the Atari 8-bit computers ATASCII font (released 2.75 years earlier).

Peddle claims the inclusion of card suit symbols was spurred by the demand that it should be easy to write card games on the PET (as part of the specification list he received).

PETSCII Chart as displayed on the Commodore 64 in shifted and unshifted modes. (Not shown are control codes, as well as characters in the 0xC0-0xFF range, which are the standard uppercase keycodes returned from the keyboard, and which are duplicated to the range 0x60-0x7F.)
PETSCII Chart as displayed on the Commodore 64 in shifted and unshifted modes. (Not shown are control codes, as well as characters in the 0xC0-0xFF range, which are the standard uppercase keycodes returned from the keyboard, and which are duplicated to the range 0x60-0x7F.)

02Specifications

"Unshifted" PETSCII is based on the 1963 version of ASCII (rather than the 1967 version, which most if not all other computer character sets based on ASCII use). It has only uppercase letters, an up-arrow instead of caret ^ at 0x5E and a left-arrow instead of an underscore _ at 0x5F. In all versions except the original Commodore PET, it also has a British pound sign £ instead of the backslash \ at 0x5C. Other characters added in ASCII-1967 (lowercase letters, the grave accent, curly braces, vertical bar, and tilde) do not exist in PETSCII. Codes 0xA0, 0xDF are allotted to CBM-specific block graphics characters, horizontal and vertical lines, hatches, shades, triangles, circles and card suits.

PETSCII also has a "shifted" mode (also called "business mode"), which changes the uppercase letters at 0x41, 0x5A to lowercase, and changes the graphics at 0xC1, 0xDA to uppercase letters. Upper- and lower-case are swapped from where ASCII has them. The mode is toggled by holding one of the SHIFT keys and then pressing and releasing the Commodore key. The shift can be done by POKEing location 59468 with the value 14 to select the alternative set or 12 to revert to standard. On the Commodore 64, the sets are alternated by flipping bit 2 of the byte 53272. On some models of PET, this can also be achieved via special control code PRINT CHR$(14) which adjust the line spacing as well as changing the character set; the POKE method is still available and does not alter the line spacing.

Included in PETSCII are cursor and screen control codes, such as {HOME}, {CLR}, {RVS ON}, and {RVS OFF} (the latter two activating/deactivating reverse-video character display). The control codes appeared in program listings as reverse-video graphic characters, although some computer magazines, in their efforts to provide more clearly readable listings, pretty-printed the codes using their actual names in curly braces, like the above examples. This is unambiguous as PETSCII has no curly brace characters.

Different mappings are used for storing characters (the "interchange" mapping, as used by CHR$()) and displaying characters (the "video" mapping). For example, to display the characters "@ABC" on screen by directly writing into the screen memory, one would POKE the decimal values 0, 1, 2, and 3 rather than 64, 65, 66, and 67.

The keyboard by default provides access to the lower half of the code page. Pressing Shift and a key gives the corresponding upper half code point. Some PETSCII code points cannot be printed and are only used for keyboard input (e.g. F1, RUN/STOP).

03Character set

The tables below represent the "interchange" PETSCII encoding, as used by CHR$().

Control characters are defined in the ranges 0x00, 0x1F and 0x80, 0x9F, although which control characters are defined and what they are defined as varies between systems. The tables below exclude control characters, the encoding of control characters in discussed in § Control characters.

The ranges 0x60, 0x7F and 0xE0, 0xFF are duplicate ranges, although what they duplicate varies between systems. On the Commodore PET, they duplicate 0x20, 0x3F and 0xA0, 0xBF, respectively; on the Commodore VIC-20, 64, 16, and 128 they duplicate 0xC0, 0xDF and 0xA0, 0xBF, respectively. While these characters are visually duplicates, they are semantically different; for example, on the Commodore PET, code points 0x2C and 0x6C both produce a comma character, but only 0x2C functions as a delimiter between input fields.

Graphic characters are mostly identical across systems, with the exceptions of 0x5C (which is \ on the Commodore PET, and £ on other systems), 0xDE (which is U+1FB95 CHECKER BOARD FILL on the Commodore PET and VIC-20, and U+1FB96 INVERSE CHECKER BOARD FILL on other systems), and the range 0x60, 0x7F (which duplicates a different range on Commodore PET). Additionally, in Commodore PET 2001's shifted character set, uppercase and lowercase letters are swapped relative to other systems'.

Unicode equivalents

PETSCII characters are represented in the Unicode standard in various blocks:

Standard

The following tables represent the PETSCII encoding used on the Commodore VIC-20, 64, 16, and 128.

Unshifted

Unshifted PETSCII
0 1 2 3 4 5 6 7 8 9 A B C D E F
0x
1x
2x  SP  ! "
    $ % & ' ( )
      + , - . /
      3x 0 1 2 3 4 5 6 7 8 9
      < = > ?
      4x @ A B C D E F G H I J K L M N O
      5x P Q R S T U V W X Y Z [ £ ]
      6x 🭲 🭸 🭷 🭶 🭺 🭱 🭴 🭼 🭽
      7x 🭾 🭻 🭰 🭵 🮌 π
      8x
      9x
      Ax NBSP 🮏 🮇
      Bx 🮈 🮂 🮃 🭿
      Cx 🭲 🭸 🭷 🭶 🭺 🭱 🭴 🭼 🭽
      Dx 🭾 🭻 🭰 🭵 🮌 π
      Ex NBSP 🮏 🮇
      Fx 🮈 🮂 🮃 🭿 π
        Differs between PETSCII variants.

      Shifted

      Shifted PETSCII
      0 1 2 3 4 5 6 7 8 9 A B C D E F
      0x
      1x
      2x  SP  ! "
        $ % & ' ( )
          + , - . /
          3x 0 1 2 3 4 5 6 7 8 9
          < = > ?
          4x @ a b c d e f g h i j k l m n o
          5x p q r s t u v w x y z [ £ ]
          6x A B C D E F G H I J K L M N O
          7x P Q R S T U V W X Y Z 🮌 🮕/🮖 🮘
          8x
          9x
          Ax NBSP 🮏 🮙 🮇
          Bx 🮈 🮂 🮃
          Cx A B C D E F G H I J K L M N O
          Dx P Q R S T U V W X Y Z 🮌 🮕/🮖 🮘
          Ex NBSP 🮏 🮙 🮇
          Fx 🮈 🮂 🮃 🮕/🮖
            Differs between PETSCII variants.

          Commodore PET

          Unshifted

          Unshifted PETSCII (PET)
          0 1 2 3 4 5 6 7 8 9 A B C D E F
          0x
          1x
          2x  SP  ! "
            $ % & ' ( )
              + , - . /
              3x 0 1 2 3 4 5 6 7 8 9
              < = > ?
              4x @ A B C D E F G H I J K L M N O
              5x P Q R S T U V W X Y Z [ \ ]
              6x  SP  ! "
                $ % & ' ( )
                  + , - . /
                  7x 0 1 2 3 4 5 6 7 8 9
                  < = > ?
                  8x
                  9x
                  Ax NBSP 🮏 🮇
                  Bx 🮈 🮂 🮃 🭿
                  Cx 🭲 🭸 🭷 🭶 🭺 🭱 🭴 🭼 🭽
                  Dx 🭾 🭻 🭰 🭵 🮌 π
                  Ex NBSP 🮏 🮇
                  Fx 🮈 🮂 🮃 🭿 π
                    Differs from standard PETSCII.

                  Shifted

                  Shifted PETSCII (PET)
                  0 1 2 3 4 5 6 7 8 9 A B C D E F
                  0x
                  1x
                  2x  SP  ! "
                    $ % & ' ( )
                      + , - . /
                      3x 0 1 2 3 4 5 6 7 8 9
                      < = > ?
                      4x @ a b c d e f g h i j k l m n o
                      5x p q r s t u v w x y z [ \ ]
                      6x  SP  ! "
                        $ % & ' ( )
                          + , - . /
                          7x 0 1 2 3 4 5 6 7 8 9
                          < = > ?
                          8x
                          9x
                          Ax NBSP 🮏 🮙 🮇
                          Bx 🮈 🮂 🮃
                          Cx A B C D E F G H I J K L M N O
                          Dx P Q R S T U V W X Y Z 🮌 🮕 🮘
                          Ex NBSP 🮏 🮙 🮇
                          Fx 🮈 🮂 🮃 🮕
                            Displayed case matches the Commodore PET 8032. The opposite case is used on the Commodore PET 2001.   Differs from standard PETSCII.
                          PET 2001 keyboard layout, illustrating PETSCII graphics characters
                          PET 2001 keyboard layout, illustrating PETSCII graphics characters

                          04Control characters

                          While the graphic characters were mostly shared between Commodore systems, the control characters frequently varied. The follow table describes what the control characters represent on the Commodore PET 2001, Commodore PET 8032, VIC-20, Commodore 64, Commodore 16, Commodore 128 (40 and 80 column modes).

                          PETSCII control characters
                          HexDecimalPET 2001PET 8032VIC-20C64C16C128 (40 col)C128 (80 col)
                          000, N/a
                          011, N/a
                          022, N/aUNDERLINE ON
                          033STOP
                          044, N/a
                          055, N/aWHITE
                          066, N/a
                          077, N/aBELL, N/aBELL
                          088, N/aLOCK CASE, N/a
                          099, N/aTABUNLOCK CASETAB
                          0A10, N/aLINE FEED
                          0B11, N/aUNLOCK CASE
                          0C12, N/aLOCK CASE
                          0D13RETURN
                          0E14, N/aLOWER CASE
                          0F15, N/aSET WINDOW TOP, N/aFLASH ON
                          1016, N/a
                          1117CURSOR DOWN
                          1218REVERSE ON
                          1319HOME
                          1420DEL
                          1521, N/aKILL LINE, N/a
                          1622, N/aERASE TO RIGHT, N/a
                          1723, N/a
                          1824, N/aTAB SET/CLEAR
                          1925, N/aSCROLL UP, N/a
                          1A26, N/a
                          1B27, N/aESC, N/aESC
                          1C28, N/aRED
                          1D29CURSOR RIGHT
                          1E30, N/aGREEN
                          1F31, N/aBLUE
                          80128, N/a
                          81129, N/aORANGEDARK PURPLE
                          82130, N/aFLASH ON, N/aUNDERLINE OFF
                          83131, N/aRUN
                          84132, N/aFLASH OFF, N/a
                          85133, N/aF1
                          86134, N/aF3
                          87135, N/aDOUBLE BELLF5
                          88136, N/aF7
                          89137, N/aTAB SET/CLEARF2
                          8A138, N/aF4
                          8B139, N/aF6
                          8C140, N/aF8HELPF8
                          8D141SHIFT + RETURN
                          8E142, N/aUPPER CASE
                          8F143, N/aSET WINDOW END, N/aFLASH OFF
                          90144, N/aBLACK
                          91145CURSOR UP
                          92146REVERSE OFF
                          93147CLEAR
                          94148INST
                          95149, N/aINSERT LINE ABOVE, N/aBROWNDARK YELLOW
                          96150, N/aERASE TO LEFT, N/aPINKYELLOW-GREENPINK
                          97151, N/aDARK GRAYPINKDARK GRAYDARK CYAN
                          98152, N/aMEDIUM GRAYBLUE-GREENMEDIUM GRAY
                          99153, N/aSCROLL DOWN, N/aLIGHT GREENLIGHT BLUELIGHT GREEN
                          9A154, N/aLIGHT BLUEDARK BLUELIGHT BLUE
                          9B155, N/aLIGHT GRAYLIGHT GREENLIGHT GRAY
                          9C156, N/aPURPLE
                          9D157CURSOR LEFT
                          9E158, N/aYELLOW
                          9F159, N/aCYAN

                          The colors of the VIC-20 and C64/128 are listed in the VIC-II article.

                          05Base 128

                          Out of PETSCII's first 192 codes, there are 128 graphic characters: 32-127 and 160-192. This permits "base128"-style encodings in DATA statements, or perhaps between PETSCII-speaking machines. This can also include control characters, which are visible when quoted, although which control characters are defined varies between systems.

                          The primary application for a "Base 128" encoding is in DATA statements in Commodore BASIC. Binary data can be stored with relatively low overhead, allowing one character of data to encode seven bits of data. On a standard 80-character line, typically four characters are used for the line number, and two characters for the abbreviated DATA statement (dA). Since the comma and colon are significant to BASIC, a quote character is also needed, leaving 73 characters for data. At seven bits per character, one DATA line could store 511 bits of binary data, for 79% efficiency. If three-digit line numbers are used, efficiency increases to 80%. If two-digit line numbers are used, efficiency is 82%.

                          Line NumbersData chars per LineBits per LineEfficiencyMax. LinesMax. Total Data Bytes
                          1-9765320.831259598
                          10-99755250.820312905,906
                          100-999745180.80937590058,275
                          1000-9999735110.79843759,000574,875
                          10000-65535725040.787555,5363.5 MB (approx.)

                          For storing binary data in Commodore BASIC, it appears that two- or three-digit line numbers are typically the best choice.

                          Base 164

                          164 PETSCII characters are representable in quoted strings; theoretically, then, Base 164 is possible. This adds in the color values, the function keys, and cursor controls.

                          Watch videos about PETSCIIExplainers and documentaries on YouTube (opens in a new tab)

                          Sources and credits

                          This article is adapted from the Wikipedia article PETSCII, written by its contributors and licensed under CC BY-SA 4.0. Fathomly has changed the layout, removed citation markers, navigation and maintenance notices, and adjusted punctuation. This adapted version is shared under the same license. For references, see the original article.

                          Images, from Wikimedia Commons:

                          Fathomly is not affiliated with or endorsed by the Wikimedia Foundation. Spotted a problem? Tell us.