PETSCII

Aus C64-Wiki
(Weitergeleitet von ASCII-Code)
Zur Navigation springenZur Suche springen

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.

ASCII-Codes des C64


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.

In 6502-Assembler[1]:

       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 Sprache:english

Quellen[Bearbeiten | Quelltext bearbeiten]