Der PETSCII-Zeichensatz
Computer verwenden bis heute noch (zumindest unter DOS) einen Zeichensatz, der 1967 als ASCII (American Standard Code for Information Interchange) genormt wurde. Als Commodore in den Computermarkt vordrang, wollten sie die Grafikfähigkeiten des Rechners durch entsprechende Symbole erhöhen und „verbogen“ die Normung etwas. Der Commodore eigene Zeichensatz, basiert auf einem früheren ASCII-Entwurf von 1963 und wird liebevoll PETSCII (nach dem 1977 erschienenen Commodore PET) genannt.
Gebt ihr unter BASIC zum Beispiel mit
10 PRINT CHR$(147)
oder
20 PRINT “HALLO“
Zeichen auf dem Bildschirm aus, so wird dafür die PETSCII-Tabelle verwendet. In dieser finden sich neben sichtbaren Zeichen z. B. A, 1, ! oder “, auch nicht darstellbare Sonderzeichen z. B. CHR$(147), um den Bildschirm zu löschen.
Die wichtigsten darstellbaren Zeichen findet ihr in den nächsten beiden Bildern inkl. einem kleinen Basic-Programm, das genau diese Ausgabe erzeugt.
Die Angaben der Zeichen-Codes in den Bildern ist Hexadezimal (z. B. ist * = $2A = 42), bei Bedarf einfach mal die Zahlensysteme besuchen.
Der C64 bietet die Möglichkeit, eigene Zeichensätze zu erstellen. Er liefert auch gleich einen zweiten Zeichensatz mit. Dabei werden einige grafische Symbole geopfert, um Groß- und Kleinschreibung zu ermöglichen.
Es gibt auch noch eine Reihe von Steuerzeichen, mit denen ihr bei der Ausgabe z. B. den Bildschirmlöschen oder die Zeichenfarbe umstellen könnt. Vom BASIC aus könnt ihr diese z. B. mit CHR$(<zeichencode>) oder über PRINT “<steuercode>“ ausgeben. Ihr kennt bestimmt aus BASIC-Listings die lustigen Steuerzeichenzeilen.
Zunächst wird der Bildschirm gelöscht, dann der Cursor um drei Zeilen nach unten und um drei Zeichen nach rechts verschoben. Zum Schluß wird HALLO ausgegeben, wobei jeder Buchstabe eine andere Farbe erhält.
Unter Assembler geht es am einfachsten, wenn ihr diese Steuerzeichen mit der Kernal-Funktion CHAROUT, die ihr bei $FFD2 findet, ausgebt.
Hier nun die Liste mit den wichtigsten Steuerzeichen…
PETSCII dezimal | PETSCII hex | Funktion |
---|---|---|
147 | $93 | Bildschirm löschen und Cursor links oben in die Ecke setzen |
19 | $13 | Cursor nach links oben in die Ecke bewegen (home) |
29 | $1D | Cursor ein Zeichen nach rechts |
157 | $9D | Cursor ein Zeichen nach links |
17 | $11 | Cursor eine Zeile nach unten |
145 | $91 | Cursor eine Zeile nach oben |
32 | $20 | Leerzeichen ausgeben |
13 | $0D | Cursor an den Beginn der nächsten Zeile (Zeilenumbruch) |
18 | $12 | Invertieren an |
146 | $92 | Invertieren aus |
14 | $0E | Groß- & Kleinbuchstaben anschalten |
142 | $8E | Großbuchstaben und grafische Symbole anschalten |
144 | $90 | Zeichenfarbe auf schwarz setzen |
5 | $05 | Zeichenfarbe auf weiß setzen |
28 | $1C | Zeichenfarbe auf rot setzen |
159 | $9F | Zeichenfarbe auf türkis setzen |
156 | $9C | Zeichenfarbe auf lila setzen |
30 | $1E | Zeichenfarbe auf grün setzen |
31 | $1F | Zeichenfarbe auf blau setzen |
158 | $9E | Zeichenfarbe auf gelb setzen |
129 | $81 | Zeichenfarbe auf orange setzen |
149 | $95 | Zeichenfarbe auf braun setzen |
150 | $96 | Zeichenfarbe auf rosa setzen |
151 | $97 | Zeichenfarbe auf dunkelgrau setzen |
152 | $98 | Zeichenfarbe auf grau setzen |
153 | $99 | Zeichenfarbe auf hellgrün setzen |
154 | $9A | Zeichenfarbe auf hellblau setzen |
155 | $9B | Zeichenfarbe auf hellgrau setzen |
Arbeitet ihr mit Assembler (oder POKEs) direkt im Bildschirmspeicher, dann werdet ihr bestimmt darüber stolpern, dass ihr teilweise andere Codes verwenden müsst. Außerdem funktionieren dort die Steuerzeichen nicht! An der Stelle werden nämlich direkt die Zeichen aus dem Char-ROM verwendet.
BASIC Listing
Hier nun, wie versprochen, das BASIC-Listing (nicht schön, aber es läuft 😉 ).
10 s%=0:bv$=chr$(125):bh$=chr$(96) 20 print chr$(147):print; 30 if s%=0 then print " petscii (zeichensatz 1)";chr$(142) 40 if s%=1 then print " PETSCII (Zeichensatz 2)";chr$(14) 50 print:print " ";bv$;"0 1 2 3 4 5 6 7 8 9"; 60 if s%=0 then print " a b c d e f" 70 if s%=1 then print " A B C D E F" 80 print " ";bh$;bh$;bh$;chr$(219); 90 for i=1to32:printbh$;:next:print 100 for j=0 to 5 110 print " "; 120 print str$(2+j);" ";bv$;:fori=32+16*jto47+16*j 130 print chr$(i);" "; 140 next i 150 print:print " ";bv$ 160 next j 170 if s%=0 then print " a ";bv$; 180 if s%=1 then print " A ";bv$; 190 for i=160 to 175:print chr$(i);" ";:next i 200 print:print " ";bv$ 210 if s%=0 then print " b ";bv$; 220 if s%=1 then print " B ";bv$; 230 for i=176 to 191:print chr$(i);" ";:next i 240 print:print " ";bv$ 250 print 260 if s%=0 then print " umschalten mit space oder x=exit"; 270 if s%=1 then print " Umschalten mit SPACE oder X=Exit"; 280 get a$:if a$="" then goto 280 290 if a$=" " then s%=abs(s%-1):goto 20 300 if s%=1 then print chr$(142); 310 print chr$(147)
Wenn ich $41 nehme bekomme ich das PIK Zeichen. Wie in deinem Tutorial gezeigt. Aber es müste doch eigentlich ein “A” sein und das PIK eine $61?
Ich steh auf dem Schlauch xD
Ziemlich am Ende, im Absatz zwischen der Tabelle mit den Steuerzeichen und der Überschrift „BASIC Listing“ findest du deine Antwort.
Ja jetzt macht das Sinn! Ich danke dir für die Erleuchtung 😉
Super Webseite übrigens! Echt klasse Arbeit 🙂
Wer von euch an PETSCII Grafiken interessiert ist, empfehle ich aus nicht ganz uneigennützigen Gründen:
http://www.petscii.de
Hi, ich lese gerade diverse Seiten hier durch um das Programmieren im CBM Stdio zu lernen. Coole Seiten und tlw. super Erklärungen zur Hardware. Mein Problem aktuell ist folgendes. Wie kann ich in Assembler Steuerzeichen für den C64 ausgeben. Ich habe das so gelöst:
text”D0=U21″
byte $9D,$9D,$9D,$9D,$9D,$9D,$11,$11
Es soll aber möglich sein mit !pet”Hallo”,13,17,0 eine direkte Eingabe der Steuerzeichen zu machen, haut aber nicht hin bei mir (cbm stdio 3.0.0)
Gibt es einen Tipp? Oder am Besten ein kleines Beispiel?
Gruß und vielen Dank
Pit
Hallo,
!pet
ist ACME-Syntax, die kennt das CBM prg Studio leider nicht.Du kannst aber folgendes machen (CBM prg Studio 3.1.0 BETA)…
*=$0801
; 2014 SYS 2062
BYTE $0B,$08,$DE,$07,$9E,$20,$32,$30,$36,$32,$00,$00,$00
;*** Start des Programms
ldx #0
@loop
lda test,X
beq @exit
jsr $FFD2
inx
bne @loop
@exit
rts
test
BYTE 147,"HALLO",29,17,29,18,"WELT",146,150,"!",0
;Bildschirm löschen (147)
;"HALLO"
;CURSOR rechts (29), unten (17), rechts (29)
;REVERS AN (18)
;"WELT"
;REVERS AUS (146)
;FARBE hellrot (150)
;"!"
;ENDE der Ausgabe (0)