C 16
Tips & Tricks

Zeichensatz selbstgemacht

Wollen Sie einen eigenen Zeichensatz definieren? »Charmachine« ermöglicht Ihnen dies in einer komfortablen Weise. Da Sie auch mehrfarbige Zeichen erzeugen können, ist es besonders für Grafiken interessant.

Die Möglichkeiten des C 16/116 im Bereich der hochauflösenden Bitmap-Grafik sind schier riesig. Doch für viele Programme, die grafischer Unterstützung bedürfen, sind die nach dem Befehl GRAPHIC 1-4 noch vorhandenen 2 KByte nicht ausreichend. In diesem Fall muß der ebenfalls hochauflösende und/oder mehrfarbige Zeichensatz aushelfen. »Charmachine« dient dazu, diesen bequem editieren zu können.

Nun zum Umgang mit dem Programm. Nachdem Sie das Programm (Listing) eingetippt und gestartet haben, erscheint in der linken oberen Ecke des Bildschirms ein 8x8 Punkte großes Feld. Rechts daneben sind die Befehle von »Charmachine« zu sehen. Im unteren Teil des Bildschirms befindet sich ein Feld, in dem alle 256 möglichen Zeichen abgebildet sind. Es handelt sich dabei um die positiven Zeichen beider Zeichensätze (also des Groß-Klein- und des Groß-Grafik-Satzes). Die negativen Zeichen beim C 16/116 können nicht gesondert verändert werden, sie zeigen immer genau die Negative ihrer entsprechenden positiven Zeichen.

In diesem Feld können Sie einen Cursor bewegen und sich das zu verändernde Zeichen aussuchen. Das Zeichen unter dem Cursor wird unterhalb des 8x8-Feldes hochauflösend (hiRes) und mehrfarbig (multicolor) dargestellt. Steht nun der Cursor auf dem richtigen Zeichen, so drücken Sie die Taste P (P=pick). Das Zeichen wird augenblicklich im 8x8-Punktefeld dargestellt, und der Cursor befindet sich ebenfalls dort. Sie können nun das Zeichen ändern mit SPACE für Punkt löschen (SPACE = unplot), Z für Punkt setzen (Cursor nach rechts) und X für Punkt setzen (Cursor nach unten) (Z/X = plot). Man kann das ganze Feld löschen mit C (=Clear) und invertieren mit R (=reverse). Ist das Zeichen fertig editiert, so kehren Sie mit M (=select mode) in den Wählmodus zurück. Hier können Sie mit den Tasten 1 und 2 (=colors) die Multicolorfarben des Zeichens über »multi« ändern sowie den Zeichensatz speichern mit S (= SAVE) und neu laden mit L (=LOAD von Diskette). Der Befehl C (=COPY) erlaubt Ihnen, das sich noch im 8x8-Feld befindliche Zeichen in ein anderes Zeichen zu kopieren, das mit dem Cursor ausgesucht wird.

Wenn Sie einen fertigen gespeicherten Zeichensatz in ein eigenes Programm einbauen wollen, so müssen Sie diesen mit LOAD"name" 8,1 laden und dann den Befehl NEW eingeben. An den Anfang Ihres Programms müssen Sie die Befehle setzen, die in Zeile 10 von »Charmachine« (Listing) stehen. Sie dienen dazu, den Zeichensatz vor dem Überschreiben durch Strings zu schützen. Der C 16/116 hat dann noch 10 KByte Speicher frei. Um den Zeichensatz schließlich einzuschalten, müssen Sie folgende POKEs eingeben:

POKE 65298,0 (Flag für Zeichensatz aus ROM oder RAM),
POKE 65299,56 (Anfangsadresse des Zeichensatzes im RAM),
POKE 65287,8+(16)+128

Beim letzten Befehl steht 8 für 40 Zeichen, (16) für Multicolor (wahlweise), 128 für Darstellung der Zeichensätze Groß+Klein und Groß+Grafik. Ohne 128 wird nur einer dieser Zeichensätze, aber mit seinen negativen Zeichen, dargestellt.

Der undefinierte Zeichensatz liegt im Speicherbereich von 14336 bis 16383 ($3800 bis $3FFF).

Nun zu einigen Besonderheiten des Programms. Beim Kopieren des Zeichensatzes vom ROM ins RAM greift das Programm auf den Monitor des C 16/116 zurück. Vom Programm aus wird in den Monitor gesprungen und dort mit dem Befehl T (=TRANSVERE) der Zeichensatz von ROM ins RAM geschrieben. Um in den Monitor und wieder zurück zu kommen, wird der »programmierte Direktmodus« benutzt, wobei die erforderlichen Befehle auf den Bildschirm gedruckt werden und durch Auffüllen des Tastaturpuffers mit dem ASCII-Code der RETURN-Taste nach dem Programmabbruch mit END ausgeführt werden. Dieses wird in den Zeilen 20010 bis 20050 bei »Charmachine« vollzogen.

Dasselbe Verfahren wird beim Speichern des Zeichensatzes in den Zeilen 1052 bis 1060 angewandt, nur mit dem Monitorbefehl S (=SAVE).

Die Maschinenroutinen, die ab der Zeile 21010 eingelesen werden, dienen zum schnellen Umrechnen der Bits eines Zeichens in die Byte-Folge des 8x8-Feldes auf dem Bildschirm, sowie dem umgekehrten Vorgang, Zeichen direkt nach den Punkte-Anordnungen im 8x8-Feld umzudefinieren.

Die erste Routine startet ab der Adresse 864 und wird im Programm in Zeile 620 aufgerufen, die zweite ab 950 und wird in Zeile 720 aufgerufen.

In der abgebildeten Tabelle finden Sie eine Variablenliste für »Charmachine«.

(Jens Engel/kn)
Variablenliste
L = Ladeflag
F1,F2,F3 = Multicolorfarben
T,W = Schleifenvariablen
X = Cursorposition horizontal
Y = Cursorposition vertikal
B = Zeichen unter Cursor
X1 = Letzte X-Position
Y1 = Letzte Y-Position
AD = Adresse der linken oberen Ecke des Feldes
A$,B$ = gedrückte Taste
CH = aktuelles Zeichen
C1 = Adresse des aktuellen Zeichens im Zeichensatz
C2,C3 = Hi-, Lowbyte von C1
Y2 = Speicher für Y
NA$ = Filename
Q = Lesevariable für READ
Tabelle. Variablenliste zu »Charmachine«
1 rem ********************************
2 rem ***      char-machine        ***
3 rem ***written 1985 by jens engel***
4 rem ********************************
9 ifl=1thenl=0:goto20
10 poke51,255:poke52,55:poke55,255:poke56,55:clr
12 goto20000
20 poke65298,0:poke65299,56:poke65287,152
22 ifpeek(864)<>169thengosub21000
90 f1=2:f2=0:f3=4:color0,15,2:color1,3,7:color4,1:color2,2,0:color3,2,4
100 print"{rvon}{clr}        {SHIFT-POUND}{SHIFT-POUND}        {rvon} CharMachine "
102 print"{rvon}        {SHIFT-POUND}{SHIFT-POUND}"
104 print"{rvon}        {SHIFT-POUND}{SHIFT-POUND}           Commands:"
106 print"{rvon}        {SHIFT-POUND}{SHIFT-POUND}  {SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}"
108 print"{rvon}        {SHIFT-POUND}{SHIFT-POUND}{$a0}{$a0}{SHIFT-POUND}{SHIFT-POUND} Space=unplot {SHIFT-POUND} X/Z=dot{SHIFT-POUND}{SHIFT-POUND}"
110 print"{rvon}        {SHIFT-POUND}{SHIFT-POUND}  {SHIFT-POUND}{SHIFT-POUND} Crsr=move    {SHIFT-POUND} C=clear{SHIFT-POUND}{SHIFT-POUND}"
112 print"{rvon}        {SHIFT-POUND}{SHIFT-POUND}{$a0} {SHIFT-POUND}{SHIFT-POUND} R=reverse    {SHIFT-POUND} L=load {SHIFT-POUND}{SHIFT-POUND}"
114 print"{rvon}        {SHIFT-POUND}{SHIFT-POUND}  {SHIFT-POUND}{SHIFT-POUND} M=select mode{SHIFT-POUND} S=save {SHIFT-POUND}{SHIFT-POUND}"
116 print"{rvon}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}  {SHIFT-POUND}{SHIFT-POUND} 1,2 =colors  {SHIFT-POUND} P=pick {SHIFT-POUND}{SHIFT-POUND}"
118 print"{rvon}            {SHIFT-POUND}{SHIFT-POUND} n=new char   {SHIFT-POUND} O=copy {SHIFT-POUND}{SHIFT-POUND}"
120 print"{rvon}   @     @  {SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}{SHIFT-POUND}"
122 print" hires multi"
124 print"{rvon}{down}             Written 1985 by Jens Engel"
130 fort=0to7:forw=0to31:poke3676+w+t*40,t*32+w:nextw,t:poke3676,86
140 poke2048+409,92
180 x=0:y=0:b=0
190 goto300
200 x1=7:y1=7:ad=3072
250 getkeya$
255 gosub500
258 ifa$="x"thenb=0:a$="{down}":gosub500
260 ifa$="z"thenb=0:a$="{rght}":gosub500
262 ifa$=" "thenb=32:a$="{rght}":gosub500
264 ifa$="c"thenprint"{home}";:fort=0to7:print"        ":next:a$="":x=0:y=0:gosub510
266 ifa$="m"then700
268 ifa$="r"thengosub800
290 poke52,55:goto250
300 x1=31:y1=7:ad=3676
350 getkeya$
355 gosub500
357 poke3475,b:poke3481,b
360 ifa$="p"thengoto600
362 ifa$="o"thench=y*32+x:c1=14336+ch*8:c2=int(c1/256):c3=c1-c2*256
364 ifa$="o"thenpoke3,c3:poke4,c2:sys950
370 ifa$="1"thenf1=f1+1:iff1=8thenf1=0:color0,15,f1:elsecolor0,15,f1
372 ifa$="2"thenf2=f2+1:iff2=8thenf2=0:color3,2,f2:elsecolor3,2,f2
380 ifa$="s"then1000
382 ifa$="l"then2000
384 ifa$="n"thenrun
390 poke52,55:goto350
500 pokead+x+y*40,b
510 ifa$="{rght}"thenifx<x1thenx=x+1
512 ifa$="{left}"thenifx>0thenx=x-1
514 ifa$="{up}"thenify>0theny=y-1
516 ifa$="{down}"thenify<y1theny=y+1
520 b=peek(ad+x+y*40):pokead+x+y*40,86
590 return
600 rem **change to edit-modus
610 ch=y*32+x:c1=14336+ch*8:c2=int(c1/256):c3=c1-c2*256
615 print"{home}";:fort=0to7:print"        ":next
620 poke3,c3:poke4,c2:sys864:b=peek(3072):x=0:y2=y:y=0
640 goto200
700 rem **change to select-modus
710 poke3072+x+y*40,b:x=ch-y2*32:y=y2:b=ch
720 sys950
740 goto300
800 poke3072+x+y*40,b:ifb=32thenb=0:goto805
802 b=32
805 fort=0to7:forw=0to7
810 ifpeek(3072+t+w*40)=0thenpoke3072+t+w*40,32:nextw,t:return
820 poke3072+t+w*40,0:nextw,t:return
1000 rem** char saven
1010 print"{clr}{down}{down}save char-set:"
1020 print"{down}name:";:inputna$
1030 print"{down}ok?":getkeyb$
1050 poke65287,8:poke1339,peek(65301)
1052 print"{clr}s "chr$(34);na$;chr$(34)",8,3800,3fff"
1054 print"{down}{down}x":print"{down}run20":print"{down}{down}{down}{down}mO{up}{up}";
1060 poke1319,13:poke1320,19:fort=0to5:poke1321+t,13:next:poke239,7:end
2000 rem** char laden
2010 print"{clr}{down}{down}load char-set:"
2020 print"{down}name:";:inputna$
2030 print"{down}ok?":getkeyb$
2040 l=1:loadna$,8,1
9999 end
20000 rem **char-set copieren
20005 poke1339,peek(65301)
20010 print"{clr}{down}{down}t d000 d800 3800"
20020 print"{down}x"
20030 print"{down}run20"
20040 print"{down}{down}mO{up}{up}";
20050 poke1319,13:poke1320,19:fort=0to5:poke1321+t,13:next:poke239,7:end
21000 rem **mc-data einlesen
21010 fort=0to207:readq:poke864+t,q:next
21020 return
21100 data169,0,133,210,133,250,169,12
21102 data133,211,160,0,132,5,132,6
21104 data162,0,234,234,234,56,102,250
21106 data165,250,164,5,49,3,240,6
21108 data169,0,160,0,145,210,234,234
21110 data230,210,208,2,230,211,232,224
21112 data8,208,227,162,0,234,234,234
21114 data169,0,133,250,24,165,210,105
21116 data32,133,210,165,211,105,0,133
21118 data211,234,230,5,165,5,201,8
21120 data208,195,96,0,0,0,169,0
21122 data133,210,133,250,169,12,133,211
21124 data160,0,132,5,132,6,162,0
21126 data76,12,4,56,102,250,160,0
21128 data177,210,208,10,165,250,164,5
21130 data17,3,145,3,234,234,230,210
21132 data208,2,230,211,232,224,8,208
21134 data227,162,0,234,234,234,169,0
21136 data133,250,24,165,210,105,32,133
21138 data210,165,211,105,0,133,211,234
21140 data230,5,165,5,201,8,208,195
21142 data96,0,0,0,169,0,160,0
21144 data145,3,200,145,3,200,145,3
21146 data200,145,3,200,145,3,200,145
21148 data3,200,145,3,200,145,3,76
21150 data203,3,0,0,0,0,0,0
Listing zu »Charmachine«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →