C 64
Grafik

HiRes im Griff

Sie möchten ein Spiel mit einer tollen Grafik programmieren und haben nicht genug Speicherplatz? Dann brauchen Sie »Grafik-Wandler«, ein Programm, das HiRes- in LoRes-Grafiken umrechnet und dabei automatisch den Zeichensatz ändert und speichert.

Beim Programmieren von Spielen mit mehreren HiRes-Grafiken stößt man immer wieder auf das gleiche Problem. Der Speicherplatz des C 64 reicht nicht, denn jede Grafik verschlingt 8KByte RAM. Sie werden sich nun fragen, wie aber um alles in der Welt wird das bei professionellen Spielen gemacht, bei denen zehn oder mehr Grafik-Seiten existieren? Nun, diese Spiele nutzen die Grafikfähigkeiten des C 64 gar nicht aus, sondern arbeiten mit einem geänderten Zeichensatz auf dem ganz normalen Textbildschirm. Dadurch benötigen solche Grafiken nur noch 1 KByte RAM. Mit »Grafik-Wandler« (Listing 1) lassen sich nun auch sehr einfach solche Bilder aus einer HiRes-Grafik erzeugen. Dabei wird der entsprechende Textbildschirm und der erforderliche Zeichensatz automatisch errechnet und auf Diskette oder Kassette gespeichert. »Grafik-Wandler« kann aber noch mehr. Doppelte 8x 8Bit-Kombinationen werden erkannt und eliminiert, damit kein Zeichen zuviel belegt wird (maximal 1000 verschiedene 8x 8Bit-Kombinationen können auf einer Grafikseite auftauchen, aber nur maximal 256 können umgewandelt werden). Der fertige Bildschirm sowie der dazugehörige Zeichensatz werden abgespeichert (natürlich unter der Adresse, die gewünscht wird), gewünschte Zeichen (zum Beispiel Buchstaben, Ziffern) werden nicht umgewandelt, und das alles geschieht auch noch blitzschnell, weil die erforderliche Such- und Rechenroutine in Maschinensprache geschrieben wurde.

Soll eine HiRes-Grafik in eine LoRes-Grafik gewandelt werden, so muß sich die zu wandelnde Grafik (33 Blöcke) auf der Diskette befinden. Es werden nur Grafikbildschirme akzeptiert, die im Bereich von $2000 bis $3FFF liegen. HiRes-Grafiken, die in anderen Bereichen liegen, sind mit einem Diskettenmonitor, zum Beispiel dem SMON, entsprechend anzupassen. Ist das geschehen, kann das Programm »Grafik-Wandler« (Listing 1) mit:

LOAD" Name",8 geladen und mit RUN gestartet werden.

Nun erscheinen nacheinander folgende Fragen auf dem

Bildschirm (Zeilen 1200 bis 1240):

NAME HIRESBILD? (Die Grafik mit diesem Namen wird geladen.)
NAME LORESBILD? (Unter diesem Namen wird die LoRes-Grafik auf Diskette gespeichert.)
START-ADRESSE? (an diese Adresse wird das LoRes-Bild später geladen »1024«.)
NAME DES ZEICHENSATZES? (Unter diesem Namen wird der Zeichensatz auf der Diskette gespeichert.)
START-ADRESSE? (an diese Adresse wird der Zeichensatz später geladen »8192«.)

Sind alle Fragen beantwortet, wird die zu wandelnde Grafik geladen und auf dem Bildschirm dargestellt. Soll die LoRes-Grafik auf einer anderen Diskette gespeichert werden, läßt sich jetzt die Diskette wechseln. Weiter geht's mit einer beliebigen Taste.

Die Zeilen 1320 bis 1340 belegen die Speicherstellen 36864 bis 37119 (89000 bis $90FF) mit »0«. In den Zeilen 1380 bis 1400 werden dann die Zeichen, die nicht umgewandelt werden sollen, mit »l« gekennzeichnet. Die erforderlichen DATAs sind in den Zeilen ab 2080 zu finden. Sie enthalten die Bildschirmcodes der betreffenden Zeichen (also 1 für »A«, 2 für »B« und so weiter). Sollen keine Zeichen gewandelt werden, ist anstelle der DATAs die Zahl »32« erforderlich. Das letzte Zeichen ist eine Zahl kleiner Null. In den Zeilen 1440 bis 1460 wird die Maschinenroutine gelesen. Die Zeilen 1500 und 1510 sowie 1590 und 1600 schalten kurzfristig das HiRes-Bild ein und wieder aus.

Jetzt wird's spannend. Nach dem Löschen des Bildschirms wird die Maschinenroutine aufgerufen (1640), die in zirka drei bis acht Sekunden den Bildschirm mit ASCII-Zeichen füllt und im Hintergrund den dafür erforderlichen Zeichensatz anlegt. Die Anordnung der Zeichen läßt eine gewisse Ähnlichkeit mit dem HiRes-Bild erkennen (ein vergleichbares Basic-Programm hat über vierzig Minuten gerechnet). Falls die Anzahl der verschiedenen 8 x 8-Blöcke zu groß ist, wird vom Maschinenprogramm in Adresse 255 eine entsprechen. de Flagge gesetzt und in Abhängigkeit von dieser innerhalb des Basic-Teils zu Zeile 2030 gesprungen. Das Bild kann dann nicht umgerechnet werden oder die Anzahl der Zeichen, die nicht gewandelt werden sollen, ist zu groß. Überprüfen Sie dann, ob diese Zeichen wirklich alle erforderlich sind. Andern Sie gegebenenfalls das Grafikbild. (Daß das Bild nicht umgerechnet werden kann, hat nichts mit dem Programm zu tun. Auch »von Hand« werden aus 256 verschiedenen Zeichen nicht mehr.) Sollte die Anzahl der Zeichen aber ausreichen, so werden Lo- und Hi-Byte der Startadressen berechnet (1720, 1730) und der Bildschirm und der Zeichensatz auf Diskette gespeichert (1770 bis 1830 und 1870 bis 1930) (Kassettenbenutzer brauchen nur iin den Zeilen 1280, 1770 und 1870 die »8« In eine »l« zu ändern). Zum Schluß kommt noch eine Meldung, daß das Programm fertig ist und wieviele Zeichen noch übrig sind.

Möchten Sie sich nun das LoRes-Bild anschauen, ist das Demo-Programm (Listing 2) zu laden. In Zeile 150 muß für »28*« der entsprechende Name für den Zeichensatz eingesetzt werden. Das gleiche gilt für Zeile 160. Nur ist hier »LO*« durch den Namen der LoRes-Grafik zu ersetzen. Das Demo-Programm erwartet das LoRes-Bild ab Adresse »1024« und den Zeichensatz ab Adresse »8192«.

(Norbert Haas/ah)
1000 rem ******************************
1010 rem *                            *
1020 rem * grafik wandler        1.86 *
1030 rem *                            *
1040 rem * norbert haas               *
1050 rem * muehlenweg 3               *
1060 rem * 5205 st. augustin 1        *
1070 rem *                            *
1080 rem ******************************
1090 :
1100 rem farben setzen, basic-ende auf 8191
1110 :
1120 print chr$(144);chr$(147);:poke 56,32:poke 53280,11:poke 53281,12
1130 :
1140 rem hiresbild schon geladen ?
1150 :
1160 l=l+1:if l=2 then 1320
1170 :
1180 rem eingabe namen und startadressen
1190 :
1200 print:input" name hiresbild ";hb$
1210 print:input" name loresbild ";lb$
1220 print:input" startadresse ";s1
1230 print:input" name zeichensatz ";zs$
1240 print:input" startadresse ";s2
1250 :
1260 rem lade hiresbild absolut
1270 :
1280 load hb$+"*",8,1
1290 :
1300 rem alle zeichen zulassen
1310 :
1320 for i=0 to 255
1330 poke 36864+i,0
1340 next
1350 :
1360 rem markieren der nichtzugelassenen zeichen
1370 :
1380 read c:if c<0 then 1440
1390 poke 36864+c,1
1400 goto 1380
1410 :
1420 rem lies maschinenroutine
1430 :
1440 for i=32768 to 33049
1450 read a:poke i,a
1460 next
1470 :
1480 rem hires-grafik an
1490 :
1500 poke 53265,peek(53265) or 32
1510 poke 53272,peek(53272) or 8
1520 :
1530 rem taste
1540 :
1550 get q$:if q$="" then 1550
1560 :
1570 rem hires-grafik aus
1580 :
1590 poke 53265,peek(53265) and 223
1600 poke 53272,peek(53272) and 247
1610 :
1620 rem bildschirm leer, aufruf maschinenroutine
1630 :
1640 print chr$(147);:sys 32768
1650 :
1660 rem alles ok ?
1670 :
1680 if peek(255)=1 then 2030
1690 :
1700 rem errechnen lo- und hibyte der startadressen
1710 :
1720 h1=int(s1/256):l1=s1-256*h1
1730 h2=int(s2/256):l2=s2-256*h2
1740 :
1750 rem speichern bildschirm
1760 :
1770 open 2,8,2,lb$+",p,w"
1780 print#2,chr$(l1);
1790 print#2,chr$(h1);
1800 for i=0 to 999
1810 print#2,chr$(peek(1024+i));
1820 next
1830 close 2
1840 :
1850 rem speichern zeichensatz
1860 :
1870 open 2,8,2,zs$+",p,w"
1880 print#2,chr$(l2);
1890 print#2,chr$(h2);
1900 for i=0 to 2047
1910 print#2,chr$(peek(16384+i));
1920 next
1930 close 2
1940 :
1950 rem ende ok
1960 :
1970 print chr$(147):print" fertig."
1980 print:print" anzahl freier zeichen:";255-peek(828)
1990 poke 56,160:clr:end
2000 :
2010 rem ende fehler
2020 :
2030 print chr$(147):print" zu viele verschiedene blocks."
2040 goto 1990
2050 :
2060 rem bildschirmcodes (!) erwuenschter zeichen
2070 :
2080 data 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
2090 data 32,46,48,49,50,51,52,53,54,55,56,57,160,-1
2100 :
2110 rem maschinenprogramm
2120 :
2130 data 120,165,  1, 41,251,133,  1,162,  0,160
2140 data 208,134,252,132,253,162,  0,160, 64,134
2150 data 254,132,255,162,  8,160,  0,177,252,145
2160 data 254,200,208,249,230,253,230,255,202,208
2170 data 242,165,  1,  9,  4,133,  1, 88,162,  0
2180 data 160, 32,134,254,132,255,162,  0,160, 64
2190 data 134,252,132,253,162,  0,160,  4,134,249
2200 data 132,250,162,  0,142, 60,  3,174, 60,  3
2210 data 189,  0,144,240, 23, 24,165,252,105,  8
2220 data 133,252,144,  2,230,253,238, 60,  3,240
2230 data   2,208,230,169,  1,133,255, 96, 24,160
2240 data   7,177,254,240,  1, 56,153,  0,145,136
2250 data  16,245,176, 34, 24,165,254,105,  8,133
2260 data 254,144,  2,230,255,230,249,208,  2,230
2270 data 250,165,254,201, 64,208,217,165,255,201
2280 data  63,208,211,169,  0,133,255, 96,173, 60
2290 data   3,160,  0,145,249,160,  7,185,  0,145
2300 data 145,252,136, 16,248, 24,165,254,105,  8
2310 data 133,254,144,  2,230,255,230,249,208,  2
2320 data 230,250,165,254,201, 64,208,  8,165,255
2330 data 201, 63,208,  2,240,203,166,254,164,255
2340 data 134,247,132,248,166,249,164,250,134,180
2350 data 132,181,160,  7,177,247,217,  0,145,208
2360 data  19,136, 16,246,160,  0,173, 60,  3,145
2370 data 180,160,  7,169,  0,145,247,136, 16,251
2380 data  24,165,247,105,  8,133,247,144,  2,230
2390 data 248,230,180,208,  2,230,181,165,247,201
2400 data  64,208,205,165,248,201, 63,208,199, 76
2410 data  85,128
Listing 1. »Grafik-Wandler« — Ein Programm zur Umrechnung einer HiRes- in eine LoRes-Grafik.
5 rem  1. textbildschirm ab 1024
10 rem 2. zeichensatz    ab 8192
20 rem
30 rem norbert haas 2.85
40 rem
100 for i=828 to 925
110 read j:k=k+j:poke i,j
120 next
130 if k<>9604 then print"datenfehler.":stop
140 print"{clr}{down}{down}sys 828:new"
150 print"{down}{down}load";chr$(34);"zs*";chr$(34);",8,1"
160 print"{down}{down}{down}{down}load";chr$(34);"lo*";chr$(34);",8,1"
170 print"{home}";
180 poke 198,3:poke 631,13:poke 632,13:poke 633,13
190 end
1000 data120,165,  1, 41,251,133,  1,169,  0,133
1010 data 34,169, 32,133, 35,169,  0,133, 36,169
1020 data208,133, 37,160,  0,177, 36,145, 34, 24
1030 data165, 34,105,  1,133, 34,165, 35,105,  0
1040 data133, 35, 24,165, 36,105,  1,133, 36,165
1050 data 37,105,  0,133, 37,165, 36,201,255,208
1060 data220,165, 37,201,223,208,214,165,  1,  9
1070 data  4,133,  1, 88,173, 24,208, 41,240,  9
1080 data  8,141, 24,208,169,  1,133, 43,169, 48
1090 data133, 44,169,  0,141,  0, 48, 96
Listing 2. Demo-Programm zum »Grafik-Wandler«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →