C 64
Grafik

Bewegte Grafik und Text mischen

Wer an Sprites denkt, stellt sich meist kleine Männchen oder Raumschiffe vor. Aber auch beim Einsatz in Anwendungsprogrammen können Sprites zur grafischen Illustration sehr nützlich sein.

Als ich die Grafik entwarf, wollte ich ein Programm unter folgenden Gesichtspunkten schreiben: kein Spielkram und von Basic aus verwendbar. Damit diese Erweiterung auch mit anderen Basic-Erweiterungen ohne weiteres funktioniert, sollten die Befehle über »SYS« aufgerufen werden. Nun sollte es kein Allerweltsprogramm sein, sondern irgend etwas Neues. Da fielen mir die Sprites ein. Mit dem richtigen Programm könnten damit kleine aber deutliche Grafiken erstellt werden, zum Beispiel Niederschlags-Temperatur- oder Umsatztabellen. Als ideal fand ich vier Sprites hintereinander und das zweimal untereinander. Das gibt eine Auflösung von immerhin 95 x 42 = 4032 Punkten. Damit läßt sich schon einiges machen. Zur Handhabung werden vier Routinen benötigt. Eine zum Einschalten der Grafik, eine zum Setzen beziehungsweise Löschen der Punkte und eine zum schnellen Löschen der gesamten Grafik. Weiterhin noch eine, die die ganze Grafik auf eine Farbe setzt.

Das Einschalten und Positionieren der Grafik

Dazu sind vier Parameter nötig, zwei für die x,y-Koordinaten und zwei für die x,y-Ausdehnung, also das Spreizen der Sprites. Je nachdem, ob gespreizt oder nicht, werden die Koordinaten berechnet und in die jeweiligen Register abgelegt. Zum Schluß werden noch alle Sprites aktiviert. Der Einfachheit halber kann x nur Werte zwischen 0 und 255 haben. Bei x=255 und ungespreizt ragt die Grafik sowieso schon aus dem Bildschirm heraus. Auch sollte man mit dem y-Wert nicht zu hoch gehen, da sonst die Grafik möglicherweise oben in den Bildschirm hereinkommt. Diese Einschränkungen sind aber in den meisten Fällen unwesentlich.

Das Setzen beziehungsweise Löschen von einem Punkt

Dazu muß genau das Byte errechnet werden, in dem sich der Punkt befindet. Dafür braucht man nur die obere Spritereihe zu betrachten. Sie ist genau eine Speicherseite (256 Byte) groß. Sollte nun die y-Koordinate größer als 20 sein, so wird einfach eine Seite weitergeblättert, das heißt das Hi-Byte des Zeigers inkrementieren. Als erstes wird das Sprite errechnet. Es wird solange #24 (= eine Spritelänge) vom x-Wert abgezogen bis der x-Wert kleiner als 24 (24 <x<=0) ist. So ist man praktisch im ersten Spriteblock gelandet. Nun wird vom x-Wert solange #8 abgezogen, bis der x-Wert kleiner als 8 (8<x>=0) ist. Jetzt weiß man, welches Bit gesetzt werden soll, und welches Byte in der Reihe gemeint ist (eins von dreien).

Nun der y-Wert. Ist er größer als 20, dann muß das Hi-Byte des Zeigers inkrementiert und vom y-Wert 21 abgezogen werden. Man will ja die Byteposition in einem Spriteblock errechnen. Ist der y-Wert jetzt noch größer als 0 so müssen noch einmal 3 * y dazugezählt werden, denn ein Sprite hat die Ausdehnung von 3 Byte. Damit hat man das Byte, das in einem Spriteblock verändert werden soll. Nun wird das Low-Byte des jeweiligen Sprites dazuaddiert und in der Zeropage für den Zeiger abgelegt. Nachdem das Bytemuster hergestellt ist, kann nun der Punkt gelöscht beziehungsweise gesetzt werden.

Das Löschen der Grafik und Setzen der Farbe versteht sich wohl von selbst. Das Ausschalten der Grafik geschieht durch POKE 53269,0.

Die Befehlsliste sieht dann so aus:

SYS PLOT, 0 , x-Wert , y-WertPunkt löschen
SYS PLOT, 1 , x-Wert , y-WertPunkt setzen
SYS SET, x-Pos. , y-Pos. , x-spreizen , y-spreizenGrafik ein
SYS COLOR,Farbcode Farbe setzen
SYS CLSGrafik löschen

Die Routine INIT bereitet das RAM auf S-Grafik vor. Sie schiebt den Speicher- und Programmstart auf $0A00, davor liegt jetzt der Speicher für die Sprites. Danach wird ein Kaltstart durchgeführt, das heißt der Basicspeicher gelöscht.

Technische Daten:

Sprites von $0800 bis $09FF

S-Grafik ab $C000 bis C1A0

Basic-RAM ab $0A00

Anwendung der S-Grafik:

Mit ein wenig Routine läßt sich mit der S-Grafik viel realisieren. Setzt man zum Beispiel die Farbe der oberen Spritereihe auf Rot und die der unteren Reihe auf Grün, so hat man einen roten und einen grünen Bereich. Nun kann man bei Säulengrafiken sofort erkennen, wo es kritisch wird (zum Beispiel Alkoholkonsum). Die Möglichkeiten sind fast unbegrenzt. Dazu kommt, daß man ja die Grafik überall hinschieben kann und auch noch spreizen kann. Sie kann im Textmodus beschriftet werden, im »Dunklen« aufbereitet werden, ruckzuck invertiert werden und so weiter.

Man lädt die S-Grafik mit LOAD"S-GRAFIK“,8,1 (Bild 1). Nun kann S-Grafik ohne Bedenken eingesetzt werden.

Achtung! Wenn sich ein Basicprogramm im Speicher befindet, wird es durch Aufruf der Routine INIT gelöscht

Der Grundgedanke zum Setzen eines Punktes.

Zum Beispiel (34/23)
A: 34 : 24 = 1 Rest 10

Der Punkt befindet sich in Sprite 1 und ist das 10 Bit
B: 10 : 8 = 1 Rest 2

Der Punkt befindet sich im 1. Byte, als 2. Bit

Y(=23) ist größer als 20, also wird Grundadresse 2 gewählt (Grundadresse 1 = $0800, Grundadresse 2 = $0900
C: 23-21 = 2

Das Byte befindet sich in der unteren Spritereihe in Reihe 2, das heißt 2*3 Byte müssen zur Adresse zugezählt werden.

Daraus ergibt sich:

64Grundadresse von Sprite 0, Rechnung A
+1Byte aus Rechnung B
+2*3Byte aus Rechnung C
+$0900Grundadresse der 2. Spritereihe
=Adresse des Bytes, in der sich der Punkt befindet.

Dazu ist noch zu bemerken, daß eine Spritereihe mit Sprite 0 beginnt. Wem das jetzt noch zu theoretisch ist, schaut sich einfach das Listing des Demo-Programms (Bild 2) an.

(F. Espitalier/rg)
10 rem**********************************
20 rem*            s-grafik            *
30 rem*      frederic espitalier       *
40 rem**********************************
50 fora=49152to49568:readx:pokea,x
60 c=c+x:nexta
70 if c<>52597thenprint"fehler in datas":stop
80 sys49547
100 data32,253,174,32,158,183,224,96,48,6,162,14,32,55,164,96,142,159,193,32
110 data253,174,32,158,183,224,42,16,237,142,160,193,162,0,173,159,193,201
120 data24,48,6,56,233,24,232,208,246,141,159,193,169,8,133,188,189,155,193
130 data133,187,173,160,193,201,21,48,11,230,188,173,160,193,56,233,21,141
140 data160,193,173,159,193,162,0,201,7,48,8,240,6,56,233,8,232,208,244,41,7
150 data73,7,168,169,1,136,48,3,10,208,250,141,161,193,173,160,193,240,8,10
160 data24,109,160,193,141,160,193,138,24,109,160,193,24,101,187,133,187,96
170 data32,0,192,173,161,193,160,0,17,187,145,187,96,32,253,174,32,158,183
180 data224,2,48,3,76,10,192,224,1,240,226,32,0,192,173,161,193,73,255,160,0
190 data49,187,145,187,96,169,0,162,0,157,0,8,157,0,9,232,208,247,96,32,253
200 data174,32,158,183,138,162,8,157,38,208,202,208,250,96,160,39,162,8,152
210 data157,247,7,136,202,208,248,32,253,174,32,158,183,142,159,193,32,253
220 data174,32,158,183,142,160,193,32,253,174,32,158,183,224,2,48,3,76,10
230 data192,189,149,193,141,29,208,169,34,141,162,193,189,151,193,141,161
240 data193,162,0,142,16,208,173,159,193,157,0,208,157,8,208,224,6,240,28,24
250 data109,161,193,205,159,193,176,11,72,173,16,208,13,162,193,141,16,208
260 data104,232,232,14,162,193,76,21,193,32,253,174,32,158,183,224,2,48,3,76
270 data10,192,189,149,193,141,23,208,173,160,193,141,1,208,141,3,208,141,5
280 data208,141,7,208,24,125,153,193,141,9,208,141,11,208,141,13,208,141,15
290 data208,169,255,141,21,208,96,169,0,162,0,189,0,8,73,255,157,0,8,189,0,9
300 data73,255,157,0,9,232,208,237,96,169,10,133,44,141,130,2,76,148,227,0
310 data255,24,48,21,42,0,64,128,192,234,0
Bild 1. Der Basic-Lader für die S-Grafik
1 poke53280,14:poke53281,6:print"{lblu}"
10 plot=49299
11 cls=49331
12 farbe=49345
13 set=49361
14 inv =49523
20 sys cls
100 printchr$(14)"{clr}{wht}S-GRAFIK{lblu}"
110 print"{down}(C) by FCS 1984"
130 print"{down}{down}{down}   Aufloesung   : 96*42 = 4032 Punkte"
131 print"{down}   Zoom         : je 2x nach x und y"
132 print"{down}   Position     : variabel"
133 print"{down}   Farben       : variabel,eine zur Zeit"
134 print"{down}   Extras       : Grafik invertieren"
136 forn=1to9999:geta$:ifa$=""thennext
140 sys set,100,100,1,1:print"{clr}":sys farbe,14
141 print"Ideal fuer Funktionsdarstellungen:"
150 forn=-20to20step1
160 y=.1*n^2:y=41-y
170 sys plot,1,n+45,y:next
171 forn=-20to20step1
172 y=.1*n^2:y=41-y
173 sys plot,1,n+48,y:next
174 forn=-20to20step1
175 y=.1*n^2:y=41-y
176 sys plot,1,n+51,y:next
177 forn=-20to20step1
178 y=.1*n^2:y=41-y
179 sys plot,1,n+54,y:next
190 sys inv:forn=1to9999:geta$:ifa$=""thennext
200 sys cls:sys farbe,13
201 print"{clr}Ideal fuer Mini-Grafiken"
210 print"{down}{down}Schnell erstellt, im Text Modus"
211 print"{down}Kann ueberall im Bildschirm stehen"
212 forx=0to95step8:ready:gosub 1000:next
213 print"{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}":forn=1to9999:geta$:ifa$=""thennext
214 print"mal so,";
215 sys set,100,100,0,1
216 forn=1to9999:geta$:ifa$=""thennext
217 print"mal so";:sys set,100,100,1,0
218 forn=1to9999:geta$:ifa$=""thennext
219 print" oder so.":sys set,100,100,0,0
220 forn=1to9999:geta$:ifa$=""thennext
230 forn=0to255:sys set,n,100,0,0:forf=1ton-200:nextf,n
240 sys set,100,100,1,1
250 forn=0to15:sys farbe,n:forf=0to400:nextf,n
300 c=53248:print"{clr}"
310 sys cls
320 sys set,100,100,1,1
330 sys farbe,5:forn=43to46:pokec+n,2:next
340 poke53280,1:poke53281,1:print"{blk}"
350 forn=20to21:form=0to95:sys plot,1,m,n:nextm,n
360 forx=0to4*13step13:read y:gosub500:next
370 print"{clr}z.B. Gewinne Verluste bei einer Wahl"
380 print"{down}{down}{down}{down}{down}{down}{down}{down}Gewinne                       +         "
381 print"{down}{down}{down}Verluste                      -   "
382 print"{down}{down}          A  B  C{$a0}{$a0}D{$a0}{$a0}{$a0}E"
499 end
500 s=1:ss=(y*-1)+20:ifss<20thens=-1
501 for n=xtox+10:form=20tosssteps:sys plot,1,n,m:nextm,n:return
1000 forn=xtox+6:form=41-yto41:sys plot,1,n,m:nextm,n:return
2000 data2,10,8,17,22,41,33,29,18,1,3,7
3000 data +16,-9,+7,+12,-17
Bild 2. Ein Demo-Programm mit S-Grafik
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →