home *** CD-ROM | disk | FTP | other *** search
/ Profi Club / Profi_Club_2_1992_-_de.d64 / grafik-1.txt < prev    next >
Text File  |  2023-02-26  |  24KB  |  218 lines

  1.       Grafik-Loader, Grafik-Demo
  2.         und Grafik-Routinen
  3.  
  4. Grafik mit dem C64
  5. Wem bisher die Grafik mit dem C64 ein Buch mit sieben Siegeln war, der kann jetzt mit den hier vorgestellten Routinen Grafik programmieren und einbinden. Ein Demo-Programm zeigt, was mit diesen Routinen und wenig BASIC-Grundkenntnissen m{CBM-C}glich ist.
  6.  
  7. Ein C128-Benutzer hat keine besonderen Schwierigkeiten, Grafiken zu programmieren, denn sein Rechner besitzt eine Anzahl von Grafikbefehlen, mit denen sich eine Menge anfangen l{CBM-F}{CBM-V}t. Die Ergebnisse k{CBM-C}nnen sich sehen lassen. Doch was tut unser C128-Programmierer, wenn er seine Werke an seinen Freundeskreis weitergeben will, der aus C64-Benutzern besteht? Im C64-Modus gibt es leider keinerlei Grafikbefehle.
  8. N{CBM-C}tig w{CBM-F}re es zumindest, zu wissen, wie Grafiken in den C64 eingeladen werden k{CBM-C}nnen und wie der Grafikmodus eingeschaltet wird. Damit lie{CBM-V}en sich selbstgestaltete, mit dem C128 entwickelte Titelbilder vorzeigen, wom{CBM-C}glich noch mit interruptgesteuerter Titelmusik, die mit geeigneten Programmen f{CBM-X}r den C64 leicht erstellt werden kann. Es gibt auch viele C64-Anwender, die gerne Grafiken programmieren w{CBM-X}rden, jedoch das n{CBM-C}tige Wissen dazu nicht besitzen. Aus diesem Grunde wollen wir uns heute mit Grafik auf dem C64 befassen.
  9. Wenn es sich nur um Grafiken handelt, die sp{CBM-F}ter in ein eigenes Programm eingebunden werden, ist die Verwendung eines Grafikprogrammes zu empfehlen - oder eine BASIC-Erweiterung, die Grafikbefehle kennt. Wenn aber Grafiken etwa erst im Programm aufgrund von eingegebenen Daten erstellt werden sollen, ist schon ein gewisses Ma{CBM-V} an Wissen erforderlich.
  10. Was wir zur Anfertigung von HiRes-Grafiken kennen m{CBM-X}ssen, sind zwei Register des VIC-Chips, eine I/O-Adresse, eine Adresse in den Systempages, absolutes Laden und Speichern sowie die Organisation des Grafikspeichers und die Aufteilung des Hauptspeichers.
  11.  
  12. Speicherbedarf:
  13. Eine HiRes-Grafik ben{CBM-C}tigt neun KByte Speicherplatz. Davon entfallen acht KByte auf die Grafikdaten und ein KByte auf die Farbinformation. Wenn neun KByte Speicherplatz ben{CBM-C}tigt werden, hei{CBM-V}t dies nicht, da{CBM-V} f{CBM-X}r BASIC dann neun KByte weniger zur Verf{CBM-X}gung stehen. Je nachdem, wie wir den Speicherbereich f{CBM-X}r die Grafik festlegen, kostet es nichts oder bis zu 17 KByte.
  14.  
  15. Der VIC-Bereich:
  16. Der f{CBM-X}r die Bildschirmausgabe verantwortliche VIC-Chip kann nur einen Speicherbereich von 16 KByte bearbeiten. In diesem 16-KByte-Bereich m{CBM-X}ssen sich daher sowohl der Grafikbereich als auch das Video-RAM, das im Grafikmodus der Tr{CBM-F}ger der Farbinformation ist, befinden. Der VIC-Bereich kann in 16-KByte-Schritten frei im Speicher verschoben werden.
  17. Hierzu m{CBM-X}ssen zwei Leitungen, die den VIC steuern, auf die entsprechenden Pegel gebracht werden. Das geschieht analog zum Ansprechen des Userports. Der zweite CIA-Chip (Complex Interface Adapter) besitzt die Portregister A und B. Nachdem ein Wert in diese Portregister geschrieben wurde, liegt diese Information an den Portleitungen an, sofern die Bits des dazugeh{CBM-C}rigen Datenrichtungsregisters den Zustand  "Schreiben" signalisieren.
  18. W{CBM-F}hrend Port B mit dem Userport verbunden ist, sind die Leitungen PA0 und PA1 von Port A mit dem VIC-Chip verbunden. Das Portregister A vom CIA-2 besitzt die I/O-Adresse $DD00 oder dezimal 56576. Die beiden untersten Bits in Adresse $DD00 m{CBM-X}ssen, da die Leitungen low-aktiv sind, f{CBM-X}r die vier VIC-Bereiche folgenderma{CBM-V}en gesetzt werden:
  19.  
  20. 0  $0000-$3FFF  11  3
  21. 1  $4000-$7FFF  10  2
  22. 2  $8000-$BFFF  01  1
  23. 3  $C000-$FFFF  00  0
  24.  
  25. Durch Undieren mit $FC werden die untersten beiden Bits auf null gesetzt, w{CBM-F}hrend die {CBM-X}brigen erhalten bleiben. Mit einer Oder-Verkn{CBM-X}pfung k{CBM-C}nnen die beiden Bits danach entsprechend gesetzt werden. Ist VB der gew{CBM-X}nschte VIC-Bereich, erfolgt die Einstellung in BASIC mit:
  26.  
  27. POKE 56576,PEEK(56576) AND 252 OR (3-VB)
  28. Voreingestellt ist der VIC-Bereich null. Das R{CBM-X}ckstellen in den Normalzustand erfolgt mit:
  29.  
  30. POKE 56576,PEEK(56576) AND 252 OR 3
  31.  
  32. Nachdem der VIC-Bereich festgelegt ist, ist zu bestimmen, wo in diesem 16-KByte-Bereich sich der Grafikbereich und wo sich das Video-RAM zu befinden hat. Hierf{CBM-X}r ist ein VIC-Register zust{CBM-F}ndig, das sich an Adresse $D018 befindet. Ausgew{CBM-F}hlt werden k{CBM-C}nnen die unteren oder oberen acht KByte des VIC-Bereiches f{CBM-X}r den Grafikspeicher. Das Video-RAM ist daraufhin so zu w{CBM-F}hlen, da{CBM-V} es in den jeweils anderen acht KByte liegt.
  33. Bit drei des angesprochenen VIC-Registers bestimmt den Grafikbereich, die oberen vier Bits das Video-RAM, das in Ein-KByte-Schritten frei positionierbar ist. Bit null wird von der CPU immer auf eins gesetzt. Nach dem Verlassen des Grafikmodus mu{CBM-V} das Register wieder auf den urspr{CBM-X}nglichen Wert zur{CBM-X}ckgesetzt werden, da die Bits eins bis drei nicht nur f{CBM-X}r die Festlegung des Grafikbereiches zust{CBM-F}ndig sind, sondern im Textmodus auch die Lage des Zeichensatzes bestimmen. Ist GB der Grafikbereich mit den Werten null oder acht KByte und VR der Video-RAM-Bereich mit Werten von null bis 15 KByte, so erfolgt die Festlegung durch:
  34.  
  35. POKE53272,16*VR+GB
  36.  
  37. Die R{CBM-X}ckstellung f{CBM-X}r den Textmodus mit POKE53272,20 oder POKE53272,21 setzt, wenn der VIC-Bereich null wieder angew{CBM-F}hlt ist, das Video-RAM auf die Adresse $0400 und den Zeichensatz auf die Adresse $1000, wo der VIC-Chip, aber nicht die CPU, den ROM-Zeichensatz zu sehen pflegt.
  38.  
  39. Grafik einschalten:
  40. Die Festlegung von Bereichen ist wichtig, n{CBM-X}tzt aber herzlich wenig, wenn Grafik nicht sichtbar wird, weil sie nicht eingeschaltet ist. Hierzu mu{CBM-V} Bit f{CBM-X}nf des VIC-Registers an Adresse $D011 auf eins gesetzt werden:
  41.  
  42. POKE53265,PEEK(53265)OR32
  43.  
  44. Durch Nullsetzen dieses Bits gelangen wir wieder in den Textmodus:
  45.  
  46. POKE53265,PEEK(53265)AND223
  47.  
  48. --------------------------------------
  49.        Klare Farbverh{CBM-F}ltnisse
  50. --------------------------------------
  51.  
  52. Das Video-RAM enth{CBM-F}lt im Grafikmodus die Farbinformation. Befindet sich darin irgendwelcher Schrott, etwa Textdaten, so wirkt dies auf die Grafikdarstellung sehr st{CBM-C}rend. Blieb die Positionierung des Video-RAMs unver{CBM-F}ndert, sorgt PRINTCHR$(147) f{CBM-X}r klare Farbverh{CBM-F}ltnisse. Das Video-RAM wird vollst{CBM-F}ndig mit Leerzeichen aufgef{CBM-X}llt. Dadurch wird f{CBM-X}r den gesamten Grafikbildschirm die Hintergrundfarbe Schwarz und die Vordergrundfarbe Rot gew{CBM-F}hlt.
  53. Wurde das Video-RAM allerdings verlegt, damit etwa der Inhalt des Textbildschirms erhalten bleibt, l{CBM-C}scht PRINTCHR$(147) nur den Textbildschirm und l{CBM-F}{CBM-V}t das neue Video-RAM unber{CBM-X}hrt, da die Routinen zur Zeichenausgabe sich nicht um VIC-Register k{CBM-X}mmern, sondern die Videoadresse der Speicherstelle 648 entnehmen. Wollen wir f{CBM-X}r klare Farbverh{CBM-F}ltnisse im neuen Video-RAM sorgen, m{CBM-X}ssen wir vor unserer PRINTCHR$(147)-Anweisung das High-Byte der Video-RAM-Adresse in die besagte Speicherstelle schreiben. Mit VB als VIC-Bereich und VR als Video-RAM-Bereich ergibt sich:
  54.  
  55. POKE648,64*VB+4*VR
  56.  
  57. Das Zur{CBM-X}ckstellen auf den alten Wert erfolgt mit POKE648,4.
  58. Es gilt jetzt zu kl{CBM-F}ren, welche Speicherbereiche f{CBM-X}r die Grafik in Frage kommen und f{CBM-X}r welchen Zweck die eine oder andere Konstellation mehr oder weniger g{CBM-X}nstig ist.
  59.  
  60. --------------------------------------
  61.      G{CBM-X}nstige Speicherbereiche
  62. --------------------------------------
  63.  
  64. Grafikbereich $0000 bis $1FFF:
  65. Dieser Speicherbereich ist aus zwei Gr{CBM-X}nden ungeeignet. Er enth{CBM-F}lt zum einen wichtige Systemadressen, die vom BASIC-Interpreter und von Betriebssytemroutinen dringend ben{CBM-C}tigt werden. Zum anderen sieht der VIC-Chip den Bereich von $1000 bis $1FFF als Zeichensatz-ROM an und w{CBM-X}rde daher in der unteren Bildschirmh{CBM-F}lfte nur die Buchstaben des Zeichensatzgenerators zeigen.
  66.  
  67. Grafik-Bereich $2000 bis $2FFF:
  68. Beim C128 geht der Grafikspeicher von Adresse $2000 bis $3F3F. Dieser Bereich ist in BASIC auch f{CBM-X}r den C64 zu empfehlen, wenn Grafiken gespeichert werden sollen oder der Grafikspeicher mit PEEK-Anweisungen abgefragt werden soll. Allerdings ist einiges zu ber{CBM-X}cksichtigen. Sind die Programml{CBM-F}nge und der Variablenspeicherbedarf sehr klein, so da{CBM-V} der Speicherplatz von $0801 bis $1FFF f{CBM-X}r BASIC gen{CBM-X}gt, kann dieser Grafikbereich problemlos ben{CBM-X}tzt werden.
  69. Nur eines sollte nicht vergessen werden: Die Grafik ist vor dem {SHIFT--}berschreiben durch Variablen zu sch{CBM-X}tzen. Ebenfalls mu{CBM-V} Sorge getragen werden, da{CBM-V} Variablen nicht durch Grafikinformationen {CBM-X}berschrieben werden k{CBM-C}nnen. Dazu ist das BASIC-Ende auf den Beginn des Grafikbereiches herabzusetzen:
  70.  
  71. POKE56,32:CLR
  72.  
  73. Die CLR-Anweisung zur {SHIFT--}bernahme des Wertes in die diversen Variablenzeiger ist notwendig. Da die CLR-Anweisung alle Variablen l{CBM-C}scht, sollte die eben genannte Anweisung gleich am Programmanfang stehen.
  74.  
  75. Sechs KByte Speicherplatz f{CBM-X}r BASIC sind schon herzlich wenig. Der C128 greift beim Einschalten der Grafik zu einem Trick. Dieser besteht aus dem Kopieren von Programm und Variablen nach oben hinter den Grafikbereich, dem Aktualisieren von Zeigern und Linkadressen sowie dem Heraufsetzen der BASIC-Anfangsadresse. Da nicht nur die Variablenzeiger umgestellt wurden, sondern auch der Programmzeiger, geht es hinterher, im Programm, das sich jetzt an neuen Adressen befindet, weiter, als ob nichts geschehen w{CBM-F}re. Dies mit dem C64 in BASIC nachzuvollziehen, ist etwas aufwendig. Doch bietet sich ein Ausweg. Wir setzen entweder per Hand oder durch ein Nachladeprogramm den BASIC-Anfang hoch, bevor das eigentliche Programm geschrieben oder geladen wird:
  76.  
  77. POKE44,64:POKE16384,0:NEW
  78.  
  79. Die NEW-Anweisung sollte nicht fehlen, da sie f{CBM-X}r die Aktualisierung der Variablenzeiger sorgt. Die Positionierung des Grafikspeichers ab Adresse $2000 bietet den Vorteil, da{CBM-V} dieser Bereich f{CBM-X}r LOAD-, SAVE-, POKE- und PEEK-Anweisungen zug{CBM-F}nglich ist. Au{CBM-V}erdem h{CBM-F}lt sich der eingeb{CBM-X}{CBM-V}te BASIC-Speicherplatz in Grenzen. Auf 14 KByte f{CBM-X}r Programm und Variablen m{CBM-X}ssen wir verzichten, so da{CBM-V} noch 24 KByte verbleiben.
  80.  
  81. Grafikbereich $4000 bis $5FFF:
  82. Dieser Bereich ist m{CBM-C}glich, aber wenig sinnvoll, da durch diese Positionierung nur entweder vorne 14 oder hinten 15 KByte verbleiben.
  83.  
  84. Grafik-Bereich $6000 bis $7FFF:
  85. Der Bereich ist nicht {CBM-X}bel. Auf das Hochsetzen des BASIC-Anfanges kann verzichtet werden. Wenn wir das Video-RAM an die Adresse $5C00 legen, bleiben uns vorne 21 KByte {CBM-X}brig. Das sind nur drei KByte weniger als im Bereich ab $2000. Am Programmanfang sollte das BASIC-Ende herabgesetzt werden mit:
  86.  
  87. POKE56,92:CLR
  88.  
  89. Diese M{CBM-C}glichkeit ist wegen der unproblematischen Handhabung empfehlenswert.
  90.  
  91. Grafikbereich $8000 bis $9FFF:
  92. Ein ungeeigneter Speicherbereich, da der VIC-Chip den ROM-Zeichensatz auch ab Adresse $9000 zu sehen pflegt. Die untere Bildschirmh{CBM-F}lfte w{CBM-F}re daher mit Buchstaben gef{CBM-X}llt.
  93.  
  94. Grafikbereich $A000-$BFFF:
  95. Man m{CBM-C}chte vielleicht meinen, hier liege das BASIC-ROM, und daher sei diese Plazierung nicht m{CBM-C}glich. Jedoch liegt unter diesem ROM ein RAM. Schreibbefehle -  etwa beim Einladen in den Speicher - oder POKE-Befehle greifen auf das RAM zu, w{CBM-F}hrend Lesebefehle - etwa beim Saven des Speicherinhalts - oder PEEK-Befehle auf das ROM zugreifen.
  96. Soll lediglich eine Grafik geladen oder erzeugt werden, ist dieser Speicherbereich geeignet, jedoch gibt es Besseres. F{CBM-X}r das Absaven ist er nicht {CBM-X}bel, da mit wenigen Bytes Maschinensprache das Speichern kein Problem ist. Allerdings gehen auch hier noch f{CBM-X}nf KByte BASIC-Speicher verloren, da das Video-RAM wegen des Zeichengenerators ab $9000 auf $8C00 zu legen ist. Doch 33 KByte bleiben immerhin.
  97. Grafikbereich $C000 bis $DFFF:
  98. Dem VIC-CHIP w{CBM-F}re dieser Bereich schon recht, jedoch ist er in BASIC schwerlich nutzbar zu machen, denn ab $D000 befinden sich die I/O-Adressen, auf die normalerweise statt auf das darunterliegende RAM zugegriffen wird. Au{CBM-V}erdem w{CBM-F}re es schade, wenn der Bereich von $C000 bis $CFFF, der von BASIC aus f{CBM-X}r allerlei Daten, besonders f{CBM-X}r Maschinensprache zu nutzen ist, von Grafikdaten belegt w{CBM-X}rde.
  99.  
  100. Grafikbereich $E000 bis $FFFF:
  101. Dieser Bereich ist einfach Spitze. Kein einziges Byte vom BASIC-Speicher geht verloren. Die vollen 38 KByte stehen zur Verf{CBM-X}gung. Da wegen des I/O-Bereiches das Video-RAM in den Bereich von $C000 bis $CFFF zu legen ist, am besten wohl auf $CC00, m{CBM-X}ssen wir eben auf ein KByte dieses zweiten von BASIC aus voll zu nutzenden Speicherbereiches verzichten. Da dieser Bereich der optimale ist, w{CBM-F}re zu {CBM-X}berlegen, ob nicht durch ein paar kurze Maschinenroutinen auch die unter dem ROM oder I/O liegenden RAM-Bereiche voll f{CBM-X}r Grafik nutzbar gemacht werden sollten.
  102. Zusammenfassend k{CBM-C}nnen wir sagen: Die besten Bereiche f{CBM-X}r die Grafik sind, ausgedr{CBM-X}ckt in VIC-Bereichen (VB), Grafikbereichen (GB) und Video-RAM-Bereichen (VR):
  103. Grafik Farbe  KB VB GB  VR   zu {CBM-F}ndern
  104. --------------------------------------
  105. $2000  $1C00  24  0  8  7  ASIC-Anfang
  106. $6000  $5C00  21  1  8  7   BASIC-Ende
  107. $A000  $8C00  33  2  8  3   BASIC-Ende
  108. $E000  $CC00  38  3  8  3       nichts
  109. $E000  $DC00  38  3  8  7       nichts
  110.  
  111. Geeignet in BASIC sind in dieser Tabelle die ersten beiden Beispiele zum Erstellen von Grafiken, die beiden letzten nicht eingeklammerten nur zum Einladen. Mit zus{CBM-F}tzlichen Maschinenroutinen k{CBM-C}nnten alle Bereiche voll Verwendung finden.
  112.  
  113. Damit ist das Wichtigste {CBM-X}ber das Einschalten der Grafik gesagt. Eine HiRes-Grafik w{CBM-X}rde sichtbar, wenn sie sich im daf{CBM-X}r vorgesehenen Speicher bef{CBM-F}nde. Wie aber l{CBM-F}{CBM-V}t sich ein Bild dorthin bef{CBM-C}rdern? Der einfachste Fall ist, da{CBM-V} ein fertiges Bild auf Diskette vorhanden ist und nur geladen zu werden braucht. Die LOAD-Anweisung von BASIC ist allerdings mit Nachteilen behaftet und kaum brauchbar. Am besten findet die LOAD-Routine des Kernals Verwendung. Dadurch werden wichtige Zeiger f{CBM-X}r das BASIC-Programm nicht verstellt, und es findet auch kein erneuter Programmstart statt. Vergleichbar ist diese Routine mit der BLOAD-Anweisung des BASIC 7.0. Mit zwei SYS- und drei POKE-Befehlen lassen sich Daten an Speicheradressen Ihrer Wahl laden:
  114.  
  115. SYS 57812 FI$,8,0
  116.  
  117. Dies ist die n{CBM-C}tige Vorbereitung, um der Laderoutine den Filenamen, die Ger{CBM-F}teadresse und die Ladeart bekanntzugeben. Ist der letzte Parameter eine Eins, werden die Daten absolut geladen, also an die Adresse, wo sie beim Abspeichern im Hauptspeicher gelegen hatten. Wird aber, wie in unserem Fall, eine Null gew{CBM-F}hlt, kann die Ladeadresse nach Wunsch bestimmt werden:
  118.  
  119. POKE 780,0
  120.  
  121. Dieser POKE-Befehl signalisiert, da{CBM-V} ein Ladevorgang stattfinden soll. W{CBM-X}rde statt einer Null eine Eins in die Speicherstelle 780 {CBM-X}bergeben werden, f{CBM-F}nde kein Ladevorgang, sondern ein Verify statt.
  122.  
  123. POKE 781,0:POKE 782,64*VB+4*GB
  124.  
  125. Beim absoluten Laden sind diese zwei POKE-Befehle {CBM-X}berfl{CBM-X}ssig. Wir aber wollen unabh{CBM-F}ngig von der im File vermerkten Ladeanfangsadresse die Daten in den Bereich des Rechnerhauptspeichers bekommen, den wir in unserem Programm daf{CBM-X}r vorgesehen haben. In die Speicherstelle 781 ist das Low-Byte der Adresse zu schreiben, das systembedingt null zu sein hat, in die Speicherstelle 782 schreiben wir das High-Byte unserer Ladeadresse. Aus den Gr{CBM-C}{CBM-V}en VB f{CBM-X}r den VIC-Bereich und GB f{CBM-X}r den Grafikbereich errechnet sich das Adressen-High-Byte durch 64*VB+4*GB:
  126.  
  127. SYS 65493
  128.  
  129. Nachdem alle Vorbereitungen getroffen sind, kann mit SYS65493 die Laderoutine des Kernals aufgerufen werden. Wenn vorher die Grafik eingeschaltet wurde, l{CBM-F}{CBM-V}t sich auf dem Bildschirm beobachten, wie das Bild sich langsam aufbaut.
  130.  
  131. --------------------------------------
  132.      Ladeprogramm f{CBM-X}r Grafiken
  133. --------------------------------------
  134.  
  135. Das Arbeiten mit Grafik ist nicht besonders schwierig, wenn Programme oder erforderliche Routinen zur Verf{CBM-X}gung stehen. Die Programme HIRES-LOADER.OF und HIRES-LOADER.MF sind einerseits komplette Programme zum Betrachten von HiRes-Grafiken, andererseits k{CBM-C}nnen sie als Routinen zum Einbinden in Ihre eigenen Programme angesehen werden. Das Einbinden von Grafikbildern in Ihre C64-Programme ist kein Problem mehr. Beide Programme sind anpa{CBM-V}bar an Ihre pers{CBM-C}nlichen Bed{CBM-X}rfnisse.
  136. Daf{CBM-X}r sorgt eine ab{CBM-F}nderbare Voreinstellung in den Programmzeilen 120 bis 150. Das Programm HIRES-LOADER.OF ist f{CBM-X}r HiRes-Grafiken ohne Farbinformation. Files, die nur die reinen Grafdikdaten enthalten, sind an ihrer L{CBM-F}nge von 32 oder 33 Blocks leicht zu erkennen. Die Voreinstellung von VB=3, GB=8 und VR=3 sorgt daf{CBM-X}r, da{CBM-V} keinerlei BASIC-Speicher f{CBM-X}r die Grafik verlorengeht. Es kann allerdings sein, da{CBM-V} Sie vielleicht Bilder mit interruptgesteuerter Hintergrundmusik untermalen m{CBM-C}chten. Wenn Musikdaten oder Musikroutinen mit den Bereichen von $CC00 bis $CFFF f{CBM-X}r das Video-RAM oder $E000 bis $FFFF f{CBM-X}r die Grafik kollidieren sollten, so k{CBM-C}nnen Sie etwa folgende Einstellung w{CBM-F}hlen:
  137.  
  138. 120 POKE 56,92:CLR
  139. 130 VB=1
  140. 140 GB=8
  141. 150 VR=7
  142.  
  143. Die Routinen selbst brauchen nicht ver{CBM-F}ndert zu werden, da diese auf die besagten Variablen Bezug nehmen. Vier Routinen stehen Ihnen zur Verf{CBM-X}gung:
  144.  
  145. 210 Grafik an
  146. 260 Grafik aus
  147. 310 Farbe  kl{CBM-F}ren
  148. 330 Grafik laden
  149.  
  150. Mit diesen Routinen ist das Hauptprogramm schnell geschrieben. In Zeile 380 wird der Anwender nach dem Namen der zu ladenden Grafik gefragt. In der Zeile 390 wird mit GOSUB310 das neue Video-RAM ges{CBM-F}ubert und mit GOSUB210 die Grafikausgabe angeschaltet. GOSUB330 in Zeile 400 l{CBM-F}dt die Grafik, deren Namen in FI$ vermerkt ist. Nach dem Warten auf einen Tastendruck in Zeile 410 wird in Zeile 420 mit GOSUB260 wieder in den Textmodus zur{CBM-X}ckgeschaltet.
  151.  
  152. --------------------------------------
  153.       HiRes-Grafik mit Farbe
  154. --------------------------------------
  155.  
  156. HiRes-Grafiken brauchen nicht unbedingt nur einfarbig zu sein. Eine Hintergrund- und Vordergrundfarbe kann zwar nicht f{CBM-X}r jeden einzelnen Punkt festgelegt werden, jedoch f{CBM-X}r jede einzelne von tausend aus acht mal acht Bildpunkten bestehenden Fl{CBM-F}chen. Beim C128 liegt die ein KByte umfassende Farbinformation vor den eigentlichen Grafikdaten im Hauptspeicher. Wenn wir mit dem C64 solche HiRes-Grafiken laden wollen, m{CBM-X}ssen wir entweder f{CBM-X}r dieselbe Anordnung von Video-RAM und Grafikspeicher sorgen oder mit OPEN- und GET#-Befehlen laden und die Daten sodann splitten.
  157. Am einfachsten ist die erste M{CBM-C}glichkeit zu realisieren. Beim Programm HIRES-LOADER.MF wurde in den Zeilen 120 bis 150 eine entsprechende Bereichswahl vorgenommen. Die Ladeanfangsadresse mu{CBM-V} sich jetzt auf die Lage des Video-RAMs beziehen. Beim POKE-Befehl in Zeile 340 wurde daher die Variable GB durch VR ersetzt. Ansonsten blieb alles beim alten. HiRes-Grafiken mit Farbinformation lassen sich ebenfalls durch die Filel{CBM-F}nge leicht von solchen ohne Farbinformation unterscheiden. Die Filel{CBM-F}nge betr{CBM-F}gt entweder 36 oder 37 Blocks. 33 Blocks ohne Farbe oder 37 mit Farbe entstehen, wenn der Ersteller der Grafik sich nicht genau merkt, ab welcher Adresse die Grafikdaten zu Ende sind, und daher nicht nur 8000 Bytes, sondern acht KBytes speichert.
  158. Ob ohne BASIC-Erweiterung oder spezielle Maschinenroutinen die Grafikprogrammierung in BASIC 2.0 sinnvoll ist, l{CBM-F}{CBM-V}t sich nur im Einzelfall beantworten. Ein Zeichen- oder Malprogramm sollte schon mit annehmbarer Geschwindigkeit ablaufen. Wenn es gilt, gef{CBM-X}llte Figuren zu erzeugen, d{CBM-X}rfte die Programmierung in reinem V2.0-BASIC sicherlich die Geduld des Anwenders auf eine harte Probe stellen. In vielen F{CBM-F}llen allerdings bestehen Grafiken nur aus wenigen Strichen oder Kurven, wie etwa bei der Darstellung mathematischer Funktionen oder geometrischer K{CBM-C}rper. F{CBM-X}r solche Strichgrafiken ist auch die Geschwindigkeit von BASIC ausreichend.
  159.  
  160. --------------------------------------
  161.     Grafiken selbst programmieren
  162. --------------------------------------
  163.  
  164. Um Ihnen zu zeigen, was mit einigen kurzen Grafikroutinen m{CBM-C}glich ist, befindet sich auf Ihrer Diskette das Programm GRAFIK-DEMO. Dieses sollten Sie einmal einladen und starten. Im Grafikmodus lassen sich Texte schreiben, Hinter- und Vordergrundfarbe f{CBM-X}r den gesamten Bildschirm sowie f{CBM-X}r den Raum, den ein Zeichen einnimmt, einzeln festlegen. Sie k{CBM-C}nnen alle vorhandenen Zeichens{CBM-F}tze ausw{CBM-F}hlen, im C64-Modus des C128 sogar zus{CBM-F}tzlich noch den deutschen Zeichensatz ben{CBM-X}tzen, Punkte setzen und Linien, Rechtecke und Kreise malen.
  165. Mit der Punktfunktion lassen sich beliebige Figuren entwerfen. Eine Sinusfunktion wird vorgef{CBM-X}hrt. Im Programm GRAFIK-DEMO finden sich noch zwei Routinen, die den Bildwechsel durch Auf- und Abblendwirkung etwas interessanter machen. Wenn Sie zwei verschiedene Grafikbereiche verwenden, k{CBM-C}nnen Sie, w{CBM-F}hrend ein Bild auf dem Monitor sichtbar ist, bereits ein weiteres laden oder erzeugen. Der Wechsel zum anderen Bild vollzieht sich dann entweder {CBM-X}bergangslos im Nu oder mit Hilfe eines Ab- und Aufblendvorganges.
  166. GRAFIK-DEMO kann durch Maschinenroutinen alle geeigneten RAM-Bereiche ausn{CBM-X}tzen. Zu Beginn des Programmes findet sich die Routinensammlung, anstelle des Hauptprogrammes, das das Demo enth{CBM-F}lt, k{CBM-C}nnen Sie Ihr eigenes Programm erfassen.
  167. Damit Sie beim C64 nicht m{CBM-X}hsam per Hand alle Zeilen des Hauptprogrammes l{CBM-C}schen m{CBM-X}ssen, finden Sie ein Programm namens GRAFIK-ROUTINEN auf Ihrer Diskette. Dieses erscheint nicht im Auswahlmen{CBM-X} der Play Back Diskette, da hier ja wegen des fehlenden Hauptprogramms nichts ablaufen kann. Nachdem Sie dieses Programm geladen haben, k{CBM-C}nnen Sie darangehen, Ihre eigenen Grafiken zu programmieren. GRAFIK-ROUTINEN stellt folgende Routinen zur Verf{CBM-X}gung:
  168.  
  169. Grundroutinen
  170. 180 Bereichswahl: VB,GB,VR
  171. 430 Grafik an
  172. 480 Grafik aus
  173. 530 Farbe kl{CBM-F}ren: VF,HF
  174. 560 Bild l{CBM-C}schen
  175. 590 Grafik laden: FG,FI$
  176. 650 Grafik saven: FG,FI$
  177.  
  178. Zeichenroutinen
  179.    760 Pixel setzen: X,Y,FA,LO
  180.    820 Linie: X1,Y1,X2,Y2
  181.    880 Rechteck: X1,Y1,X2,Y2
  182.    930 Kreis: XM,YM,R
  183.   1000 Cursor: X,Y
  184.   1030 Textausgabe: TX$,GZ,FA
  185.   1020 Cursor,Textausgabe
  186.  
  187. 180 Bereichswahl:
  188. Der Grafikbereich ist auf die Werte VB=3, GB=8 und VR=7 voreingestellt. Wenn Sie einen anderen Bereich w{CBM-X}nschen, k{CBM-C}nnen Sie die Zeilen 150 bis 170 {CBM-F}ndern. Wollen Sie im Programm einen zweiten Bereich ben{CBM-X}tzen, k{CBM-C}nnen Sie nach entsprechender {SHIFT-+}nderung der Parameter VB, GB und VR die Bereichswahl durch GOSUB 180 aufrufen. Dort werden die Variablenwerte VA, GA, VH und GH, die die Adressen des Grafikbereiches und des Video-RAMs beziehungsweise das Adressen-High-Byte enthalten, entsprechend ge{CBM-F}ndert. Die {CBM-X}brigen Grafikroutinen greifen nachher auf den neuen Bereich zu. Der Bildschirm wird allerdings erst nach nochmaligem Anschalten der Grafik durch GOSUB 430 auf den neuen Bereich umgeschaltet.
  189.  
  190. 430 Grafik an:
  191. Diese Routine wird ben{CBM-C}tigt, um den Bildschirm vom Textmodus in den Grafikmodus umzuschalten oder von einem Grafikbereich in den anderen.
  192.  
  193. 480 Grafik aus:
  194. Der Grafikmodus wird aus- und der Textmodus eingeschaltet.
  195.  
  196. 530 Farbe kl{CBM-F}ren:
  197. Mit dieser Routine werden in Windeseile die Vordergrundfarbe und die Hintergrundfarbe f{CBM-X}r den gesamten Bildschirm gesetzt. Eine Grafik kann unsichtbar gemacht werden, wenn Hintergrund- und Vordergrundfarbe gleich sind. Vor dem Aufruf sind die gew{CBM-X}nschten Farbwerte an die Variablen VF und HF zu {CBM-X}bergeben, etwa:
  198.  
  199. VF=6:HF=6:GOSUB530
  200. VF=1:HF=0:GOSUB530
  201.  
  202. Im ersten Fall wird der Bildschirm blau. Eine zuvor sichtbare Grafik wird unsichtbar. Im zweiten Fall wird der Bildschirmhintergrund schwarz und der Bildschirmvordergrund wei{CBM-V}. Wenn zuvor eine Grafik unsichtbar gemacht wurde, wird sie jetzt wieder sichtbar.
  203.  
  204. 560 Bild l{CBM-C}schen:
  205. Der gesamte Grafikspeicher wird mit Nullbytes beschrieben. Eine zuvor sichtbare Grafik verschwindet dadurch auf Nimmerwiedersehen. Auf dem Bildschirm ist anschlie{CBM-V}end nur noch die Hintergrundfarbe zu sehen. Vor dem ersten Einschalten des Grafikmodus, sofern nicht bereits vorher eine Grafik erzeugt oder geladen wurde, sollte die Farbe gekl{CBM-F}rt und das Bild gel{CBM-C}scht werden.
  206.  
  207. 590 Grafik laden:
  208. Als Parameter ist der Filename in der Variablen FI$ zu {CBM-X}bergeben. Die Variable FG bestimmt die Art der Grafik. Im Normalfall ist FG null. Dies ist die richtige Einstellung f{CBM-X}r HiRes-Grafiken ohne zus{CBM-F}tzliche Farbinformation. Sind im zu ladenden File allerdings die Farbdaten mitgespeichert, so ist FG auf den Wert eins zu setzen:
  209.  
  210. FG=0:FI$="BILD OHNE FARBE":GOSUB590
  211. FG=1:FI$="BILD MIT FARBE":GOSUB590
  212.  
  213. 650 Grafik saven:
  214. Wenn die Farbinformationen mitgespeichert werden sollen, so wird dies auch hier durch FG=1 bestimmt.
  215.  
  216. FG=0:FI$="BILD OHNE FARBE":GOSUB650
  217. FG=1:FI$="BILD MIT FARBE":GOSUB650
  218.