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.
PETSCII ist zu unterscheiden vom Bildschirmcode; letzterer kodiert alle darstellbaren Zeichen ohne Steuerzeichen, aber inklusive der inversen Zeichen.
ASCII (englische Abkürzung für American Standard Code for Information Interchange) ist die Bezeichnung, die im Commodore 64 Bedienerhandbuch für den hier beschriebenen Code benutzt wird. Der Begriff PETSCII kommt dort nicht vor. Deshalb kann dieser Artikel auch unter "ASCII" aufgerufen werden. Der Commodore ASCII-Code beruht auf der 1963er-Version von ASCII, nicht auf der von fast allen anderen ASCII-Computern verwendeten 1967er-Version. Dies äußert sich u. a. in den Zeichen „Pfeil nach Oben“ (↑) und „Pfeil nach Links“ (←) sowie in dem Nur-Großbuchstaben-Modus, die in ASCII 1967 nicht mehr vorgesehen waren.
Von BASIC aus können Zeichen anhand ihres PETSCII-Codes per CHR$-Befehl ausgegeben werden. PRINT CHR$(65) gibt z.B. ein A aus.
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).
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