Nachdem vor einiger Zeit die Sprungtabelle des Kernal-Editors behandelt wurde, geht es diesmal um die Hires- und Multicolor- Grafikroutinen im C 128-ROM. Sie erlauben mit wenig Aufwand die Programmierung faszinierender Grafiken in Assembler. Bei der Anwendung der Routinen ist zu beachten, daß diese im Basic-ROM von $4000-$AFFF liegen. Deshalb muß man zum Aufruf entweder das JSRFAR-Unterprogramm des Betriebssystems benutzen(s. "Speicherverwaltung 2: Betriebssystemroutinen") oder man blendet das ROM mit BANK 15 in Basic bzw. LDA #$00:STA $FF00 in Maschinensprache ein. Dann genügen einfache JSR-Befehle, allerdings muß das aufrufende Programm dazu unterhalb $4000 in Bank 0 liegen. Die zu übergebenden Parameter sind häufig die gleichen wie bei den entsprechenden Basic-Befehlen, bei evt. Unklarheiten sollte man also dort im C 128-Handbuch nachsehen. Angaben wie $1131/$1132 bedeuten, daß es sich um 16-Bit-Werte handelt, wobei wie üblich in der ersten Speicherstelle das Low-, in der zweiten das High-Byte abzulegen ist. A/X/Y stehen für die Prozessorregister. Die Adressen $1131-$1134 spielen bei den Routinen DOT, DRAW, BOX, CIRCLE und RDOT eine besondere Rolle: Sie verhalten sich wie ein "Grafikcursor", d. h. sie enthalten nach der Ausführung den letzen angesprochenen Bildpunkt und dienen gleichzeitig als Anfangspunkt für den nächsten Zeichenbefehl. Daher kann man sich häufig das Neusetzen einiger Koordinaten ersparen. Zur Demonstration befinden sich auf der Diskette die Programme "ASS-GRAFIK.OBJ" und "LIGHTBIKES-OBJ"(kommentierte Quelltexte "ASS-GRAFIK.SRC" und "LIGHTBIKES.SRC" im Hypra-Ass-Format, auch in Basic lad- und listbar). Das erste erzeugt eine Multicolor-Grafik auf dem Bildschirm, beim zweiten handelt es sich um die mit einer Länge von 174 Bytes wohl kürzeste Umsetzung der "Tron"-Spielidee(Linien ziehen und nicht kollidieren) aller Zeiten. Mit Betätigen eines Feuerknopfes beginnt man eine Spielrunde, nach einer Kollision ist der Bildschirmrahmen in der Farbe des Verlierers. Beide Programme werden mit BANK 15:BOOT"Name" geladen und gestartet, bei "LIGHTBIKES.OBJ" sollte man vorher einen Reset durchführen. D i e G r a f i k r o u t i n e n GRAPHIC($6B6C) Setzt Anzeigemodus und reserviert(falls nötig) Speicher für Grafik und Video-RAM($1C00-3FFF), ein vorhandenes Basic-Programm wird nach $4000 verschoben. Handelt es sich um einen gemischten Grafik/Text-Modus(2 oder 4), so kann man die Umschaltzeile(Grafikzeile+48) danach in Speicherstelle $0A34 festlegen(Standard: 208). X: Anzeigemodus(0-5, wie in Basic) GRAPHICMEM($9F4F) Reserviert Speicher für Grafik, ohne diese einzuschalten. GRAPHICCLR($A022) Gibt für Grafik reservierten Speicherbereich frei und verschiebt ein Basic-Programm zurück nach $1C00. Achtung: Im Gegensatz zum entsprechenden Basic-Befehl wird die Grafik nicht ausgeschaltet, also vorher GRAPHIC mit X=0 oder 5 verwenden! GCOLOR($6A5C) Legt Farben für folgende Grafikbefehle fest. Im Multicolormodus kann die Hintergrundfarbe($D021) auch ohne diese Routine bestimmt werden. $0086: Vordergrundfarbe $0084: Multicolor-Farbe 1 $0085: Multicolor-Farbe 2 $D021: Hintergrundfarbe GCLEAR($6B30) Löscht Grafik und setzt Farben gemäß GCOLOR für ganzen Bildschirm. SETCOL($6B39) Setzt Farben(außer Multicolor 2) für ganzen Bildschirm ohne Löschen der Grafik. SETMULTI2($6B17) Setzt Multicolor-Farbe 2 für ganzen Bildschirm. DOT($AF75) Setzt(oder löscht) Punkt. $1131/$1132: X-Koordinate(Hires: 0-319, Multicolor: 0-159) $1133/$1134: Y-Koordinate(0-199) $0083: Farbquelle(0/1: Löschen/Vordergrundfarbe, bei Mul- ticolor zusätzlich 2/3 für Multicolor-Farben 1/2) $116B: Punktbreite(0: normal, 1: doppelt) DRAW($AF72) Zieht Linie von X1,Y1 nach X2,Y2. $1131/$1132: X1-Koordinate $1133/$1134: Y1-Koordinate $1135/$1136: X2-Koordinate $1137/$1138: Y2-Koordinate $0083: Farbquelle(wie bei DOT) $116B: Punktbreite(wie bei DOT) BOX($62D7) Zeichnet Rechteck mit Ecken X1,Y1 und X2,Y2. Das Rechteck läßt sich drehen(Rotationswinkel) und ausfüllen. $1150/$1151: X1-Koordinate $1152/$1153: Y1-Koordinate $115C/$115D: X2-Koordinate $115E/$115F: Y2-Koordinate $1154/$1155: Rotationswinkel(in Grad) $0083: Farbquelle(wie bei DOT) $116B: Punktbreite(wie bei DOT) X: Flag für Ausfüllen(0: nein, 1: ja) CIRCLE($66DF) Zeichnet um Rotationswinkel gedrehten Kreis-/Ellipsenausschnitt von Startwinkel bis Endwinkel. $1150/$1151: X-Koordinate des Mittelpunktes $1152/$1153: Y-Koordinate des Mittelpunktes $1154/$1155: Radius in X-Richtung $1156/$1157: Radius in Y-Richtung $115C/$115D: Startwinkel(in Grad) $115E/$115F: Endwinkel(in Grad) A/Y: Rotationswinkel(in Grad) $0083: Farbquelle(wie bei DOT) $116B: Punktbreite(wie bei DOT) PAINT($61BD) Füllt Bereich um X,Y bis zu einer Grenze in der Füllfarbe(Modus=0) oder einer beliebigen Farbe(Modus=1). $1131/$1132: X-Koordinate $1133/$1134: Y-Koordinate $0083: Farbquelle(wie bei DOT) X: Modus RDOT($9C49) Liefert Punktfarbe an X,Y in Akku. $1131/$1132: X-Koordinate $1133/$1134: Y-Koordinate $008B: muß 0 sein CHAR($68DB) Schreibt Zeichen normal oder invers in Grafik. A: ASCII-Code des Zeichens X: Zeile(0-24) Y: Spalte(0-39) $113D: Invers-Flag(0: normal, 128: invers) $1168: High-Byte des Zeichensatzes($D0: Groß/Grafik, $D8: Groß/Klein) $0083: Farbquelle(wie bei DOT) TEXT($6866) Gibt in Bank 1 liegenden String auf Grafikschirm aus. Mit ASCII-Code 14 im String kann vom standardmäßigen Groß-/Grafik- auf den Groß-/Klein-Zeichensatz gewechselt werden. $0024/$0025: Adresse des Strings in Bank 1 $116E: Länge des Strings $115E: Spalte(0-39) $115F: Zeile(0-24) $113D: Invers-Flag(0: normal, 128: invers) $0083: Farbquelle(wie bei DOT) Thomas Klein
Dateien: ASS-GRAFIK.OBJ: Grafikdemo ASS-GRAFIK.SRC: Quelltext im Hypra-Ass-Format ASS-GRAFIK.TXT: formatierter Quelltext als ASCII-File LIGHTBIKES.OBJ: Tron-Spiel mit Multicolor-Grafik LIGHTBIKES.SRC: Quelltext im Hypra-Ass-Format LIGHTBIKES.TXT: formatierter Quelltext als ASCII-File