PETSCII
PETSCII steht für "PET Standard Code of Information Interchange" und wird manchmal auch als CBM-ASCII bezeichnet. PETSCII basiert zu einem Teil auf dem ASCII-Standard, enthält aber zusätzliche Zeichen, z.B. Grafikzeichen zum Erstellen von Blockgrafik oder weitere Steuerzeichen. Jedes PETSCII-Byte (0-255) kodiert entweder ein Steuerzeichen (0-31 und 128-159) oder ein darstellbares Zeichen. Neben der Nutzung in BASIC-Zeichenketten wird PETSCII auch für den Tastaturpuffer und in der internen Darstellung von BASIC-Programmen benutzt, dazu siehe Artikel Speicherbelegung (BASIC).
Abgrenzung zu ASCII und Bildschirmcode[Bearbeiten | Quelltext bearbeiten]
ASCII (englische Abkürzung für American Standard Code for Information Interchange) ist eine 7-Bit-Zeichencodierung und entspricht der US-Variante von ISO 646.
Das Commodore 64 Bedienerhandbuch nutzt den Begriff "ASCII" zwar für die durch den C64 genutzte Zeichencodierung; diese weicht jedoch signifikant vom Standard-ASCII ab.
Wegen dieser Abweichungen hat sich inzwischen der Begriff "PETSCII" für die "Commodore-ASCII-Variante" durchgesetzt.
Ein grundsätzlicher Unterschied ist, dass im aktuellen ASCII-Standard sowohl Groß- als auch Kleinbuchstaben definiert sind und die Großbuchstaben beim Code 65 und die Kleinbuchstaben bei Code 97 beginnen.
PETSCII dagegen bietet im Groß-/Grafikzeichenmodus gar keine Kleinbuchstaben, und im Klein-/Großschriftmodus liegen die Kleinbuchstaben ab Code 65 und die Großbuchstaben ab Code 97, sind also gegenüber ASCII gerade vertauscht.
PETSCII beruht auf der Version von ASCII aus 1963, nicht auf der von fast allen anderen ASCII-Computern verwendeten Version von 1967.
Dies äußert sich u. a. in den Zeichen „Pfeil nach Oben“ (↑) und „Pfeil nach Links“ (←) sowie in dem Nur-Großbuchstaben-Modus (die Codes ab 96 waren im 1963er Standard nicht definiert), die in ASCII 1967 nicht mehr vorgesehen waren.
Bildschirmcode kodiert alle darstellbaren Zeichen inklusive der inversen Zeichen, enthält aber anders als PETSCII keine Steuerzeichen. Außerdem werden die Symbole anders codiert (z.B. hat das "A" Bildschirmcode 1, aber PETSCII-Code 65).
Die PETSCII-Code-Tabelle des C64[Bearbeiten | Quelltext bearbeiten]
Die Tabelle wird in 6 Spalten angezeigt. Links steht in jeder Spalte der PETSCII-Code, dahinter das zugehörige Zeichen des Groß-/Grafik-Modus bzw. bei Steuerzeichen die Bedeutung. Rechts daneben folgt das entsprechende Zeichen des Groß-/Klein-Modus, falls es sich von dem ersten Zeichen unterscheidet.
Aufgeführt sind hier nur die Codes bis 191, denn ab Code 192 wiederholen sich die Zeichen:
Codes 192-223 wie Codes 96-127 Codes 224-254 wie Codes 160-190 Code 255 wie Code 126
Eine vollständige Tabelle mit allen PETSCII-Codes, korrespondierenden ASCII- und Bildschirmcodes sowie Beschreibungen findet man unter PETSCII-Tabelle.

Umwandlungsroutinen[Bearbeiten | Quelltext bearbeiten]
Von PETSCII nach Bildschirmcode. Steuerzeichen werden dabei zu dem Bildschirmcode umgewandelt, den man im ”quote”-Modus zu sehen bekommt, also innerhalb von Anführungszeichen in BASIC-Programmen. Beispielsweise das reverse Herz für das Steuerzeichen mit dem PETSCII-Code 147 zum löschen des Bildschirminhalts.
CMP #$FF
BEQ pi
PHA
LSR
LSR
LSR
LSR
LSR
TAX
PLA
EOR tab,X
RTS
pi: LDA #$5E
RTS
tab: .byte $80,$00,$40,$20,$40,$C0,$80,$80
Dieser Algorithmus in einer Hochsprache ausgedrückt (Pascal):
FUNCTION PetsciiToScreenCode(value: Byte): Byte;
CONST table: ARRAY[0..7] OF Byte = ($80,$00,$40,$20,$40,$c0,$80,$80);
BEGIN
IF value = 255 THEN PetsciiToScreenCode := 96 (* pi *)
ELSE PetsciiToScreenCode := table[value SHR 5] XOR value;
END;
Das folgende BASIC-Programm überprüft die Ergebnisse der Assembler-Routine. Nachdem die Routine durch das Unterprogramm ab Zeile 1000 in den Speicher gePOKEt wurde, wird jeder Wert von 0 bis 255 a) an die Routine übergeben und b) nach einem " (CHR$(34)) auf dem Bildschirm ausgegeben und das Ergebnis aus dem Bildschirmspeicher ausgelesen. Die Ergebnisse werden in den Arrays A() und B() gespeichert. Bei der Ausgabe werden drei Steuerzeichen auch nach " direkt ausgeführt: RETURN, DEL, und SHIFT+RETURN. Diese Werte müssen im B()-Array korrigiert werden (Zeile 80). Dann werden die Ergebnisse in den beiden Arrays verglichen, Abweichungen ausgegeben und gezählt.
10 GOSUB 1000:A$=CHR$(147)+CHR$(34) 20 DIM A(255),B(255) 30 FOR I=0 TO 255 40 : POKE 780,I:SYS A:A(I)=PEEK(780) 50 : PRINT A$;CHR$(I):B(I)=PEEK(1025) 60 NEXT 70 REM RETURN,DEL,SHIFT+RETURN FIX 80 B(13)=141:B(20)=148:B(141)=205 100 E=0:PRINT"PRUEFE..." 110 FOR I=0 TO 255 120 : IF A(I)<>B(I) THEN E=E+1:PRINT I,A(I),B(I) 130 NEXT 140 PRINT E;"FEHLER" 999 END 1000 A=49152:I=0 1010 READ N:IF N=-1 THEN RETURN 1020 POKE A+I,N:I=I+1:GOTO 1010 10000 DATA 201,255,240,12,72,74,74,74 10010 DATA 74,74,170,104,93,19,192,96 10020 DATA 169,94,96 10030 DATA 128,0,64,32,64,192,128,128 10040 DATA -1
Die beiden folgenden Beispiele machen etwas ähnliches wie die Assembler-Routine. Sie unterscheiden sich in den Werten der Tabelle und enthalten eine zusätzliche bitweise und-Verknüpfung (und die Addition sollte eigentlich eine bitweise oder-Verknüpfung sein (|-Operator in beiden Sprachen)).
In Python[2]:
sc = ([0x80, 0x20, 0x00, 0x40, 0xC0, 0x60, 0x40, 0x60][c >> 5] + (c & 0x1f)) if c != 255 else 94
In Java[3]:
int sc = c!=255?(new int[]{0x80, 0x20, 0x00, 0x40, 0xC0, 0x60, 0x40, 0x60}[c >> 5] + (c & 0x1f)):94;
Verwandte Themen[Bearbeiten | Quelltext bearbeiten]
Weblinks[Bearbeiten | Quelltext bearbeiten]
| Wikipedia: CBM-ASCII |
| Wikipedia: ASCII |
| Wikipedia: PETSCII |
- PETSCII zu C64-Characters bei sta.C64.org

- PETSCII zu C64-Keycodes bei sta.C64.org

- PETSCII Reference bei style64.org

- Character Set/PETSCII/Keyboard
in Ultimate Commodore 64 Reference - "PETSCII Codes in Listings" bei C64-Wiki.com]

- PETSCII Grafik-Wettbewerb mit über 100 Beiträgen auf der CSDb

- PETSCII Grafiken
Quellen[Bearbeiten | Quelltext bearbeiten]
- ↑ Thema: Screencodes vs. PetASCII auf Forum64.de
- ↑ github.com/c1570/CrankThePRINT
- ↑ Thema: Darstellung von String-Zeichen im Basic Listing auf Forum64.de