GRAPHICS VDUDie Grafik-Routinen BBBA: GRA INITIALISEInitialisiere Die Abteilungen des Betriebssystems: Die Grafik-VDUdie Grafik-VDU. Eingaben: keine Ausgaben: keine Unverändert: IX,IY Die Abteilungen des Betriebssystems: Die Grafik-VDUDie Grafik-VDU wird komplett initialisiert. Betroffen sind: - Die Sprungleisten: die IndirectionsDie Indirections der Grafik-VDU
- Grafik-PAPER := 0 (Hintergrund-Tinte)
- Grafik-PEN := 1 (Vordergrund-Tinte)
- Grafik-WINDOW := ganzer Bildschirm
- ORIGIN 0,0
- MOVE 0,0
CPC 664 und 6128 zusätzlich: - Die Grafik-VDU: Hintergrund-ModusHintergrund-Modus := opaque (deckend)
- Linienmaske := &FF (durchgezogene Linie)
- Erster-Punkt := wird immer gesetzt
BBBD: GRA RESETSetze Die Abteilungen des Betriebssystems: Die Grafik-VDUdie Grafik-VDU zurück. Eingaben: keine Ausgaben: keine Unverändert: IX,IY Kleine Initialisierung der Grafik-VDU. Es werden nur Die Sprungleisten: die Indirectionsdie Indirections auf die Standard-Routinen eingestellt. Bei CPC 664 und 6128 werden zusätzlich auch der Grafik-Hintergrund-Modus, Die Grafik-VDU: Die Linienmaskedie Linienmaske und die Erster-Punkt-Option auf ihre Default-Werte eingestellt. BBC0: GRA MOVE ABSOLUTEBewege den Grafik-Cursor zur angegebenen Position. Eingaben: DE = X-Koordinate und HL = Y-Koordinate des Zielpunktes Ausgaben: keine Unverändert: IX,IY Die Zielkoordinaten werden Adressierungsarten der Z80: Relativrelativ zum Origin angegeben und sind vorzeichenbehaftet (-32768 bis +32767). BBC3: GRA MOVE RELATIVEBewege den Grafik-Cursor Adressierungsarten der Z80: Relativrelativ zur momentanen Position. Eingaben: DE = X-Versatz und HL = Y-Versatz Ausgaben: keine Unverändert: IX,IY Die Zielkoordinaten werden Adressierungsarten der Z80: Relativrelativ zur aktuellen Position des Grafikcursors angegeben und sind vorzeichenbehaftet (-32768 bis +32767). BBC6: GRA ASK CURSORErfrage die momentane Die verwendeten Abkürzungen bedeuten: x:X- und Y-Koordinate des Grafik-Cursors. Eingaben: keine Ausgaben: DE = X-Koordinate HL = Y-Koordinate Unverändert: BC,IX,IY Die Grafik-VDU: Die KoordinatenDie Koordinaten werden Adressierungsarten der Z80: Relativrelativ zum Origin angegeben und sind vorzeichenbehaftet (-32768 bis +32767). BBC9: GRA SET ORIGINLege den Bezugspunkt für die Adressierungsarten der Z80: Absolutabsolute Cursor-Positionierung neu fest. Eingaben: DE = X-Koordinate HL = Y-Koordinate Ausgaben: keine Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur linken unteren Ecke mit den Koordinaten (0,0) und vorzeichenbehaftet (-32768 bis +32767). BBCC: GRA GET ORIGINErfrage den momentanen Grafik-Nullpunkt. Eingaben: keine Ausgaben: DE = X-Koordinate und HL = Y-Koordinate Unverändert: AF,BC,IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur linken unteren Ecke mit den Koordinaten (0,0) und vorzeichenbehaftet (-32768 bis +32767). BBCF: GRA WIN WIDTHLege den linken und rechten Rand des Grafik-Fensters fest. Eingaben: DE und HL enthalten die X-Koordinaten der linken und rechten Grenze. Ausgaben: keine Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur linken unteren Ecke mit den Koordinaten (0,0) und vorzeichenbehaftet (-32768 bis +32767). DE und HL bestimmen die linke und rechte, innere Fenstergrenze, wobei der kleinere Wert automatisch für den linken Rand genommen wird. DE und HL werden eventuell soweit verkleinert, bis das Die Text-VDU: FensterFenster auf den Bildschirm passt. Außerdem werden die Fenstergrenzen auf ganze Datentypen: Bytes links = DE and &FFF8 rechts = HL or &0007 BBD2: GRA WIN HEIGHTLege den oberen und unteren Rand des Grafikfensters fest. Eingaben: DE und HL enthalten die Y-Koordinaten der oberen und unteren Fenstergrenze. Ausgaben: keine Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur linken unteren Ecke mit den Koordinaten (0,0) und vorzeichenbehaftet (-32768 bis +32767). DE und HL geben die obere und untere, innere Grenze des Grafikfensters an, wobei automatisch der kleinere Wert für die untere Grenze benutzt wird. DE und HL werden soweit verkleinert, bis das Die Text-VDU: FensterFenster auf den Bildschirm passt. Außerdem werden Die Grafik-VDU: Die Koordinatendie Koordinaten auf Rasterzeilen-Grenzen erweitert. Da eine Rasterzeile des Monitorbildes zwei logische Grafikzeilen umfasst, ergeben sich (wenn DE < HL) die tatsächlichen Grenzen zu: oben = HL or &0001 unten = DE and &FFFE BBD5: GRA GET W WIDTHErfrage den linken und rechten Rand des Grafik-Fensters. Eingaben: keine Ausgaben: DE und HL = linke und rechte Fenstergrenze Unverändert: BC,IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur linken unteren Ecke mit den Koordinaten (0,0) und vorzeichenbehaftet (-32768 bis +32767). Angegeben werden die inneren Grenzen, also die X-Koordinaten des ersten und des letzten Punktes innerhalb des Fensters. BBD8: GRA GET W HEIGHTErfrage den oberen und unteren Rand des Grafik-Fensters. Eingaben: keine Ausgaben: DE und HL enthalten die Y-Koordinate der oberen und unteren Fenstergrenze. Unverändert: BC,IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur linken unteren Ecke mit den Koordinaten (0,0) und vorzeichenbehaftet (-32768 bis +32767). Es werden die inneren Fenstergrenzen angegeben, also die Y-Koordinaten der obersten und der untersten Zeile des Grafikfensters. BBDB: GRA CLEAR WINDOWLösche die Anzeige im Grafik- Die Text-VDU: FensterFenster. Eingaben: keine Ausgaben: keine Unverändert: IX,IY Das Grafikfenster wird mit der Grafik-PAPER-INK gelöscht. Der Grafikcursor wird zum Origin bewegt. BBDE: GRA SET PENLege die Die Bildausgabe: Tinten und FarbenTinte des Zeichenstiftes neu fest. Eingaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Nummer der Vordergrund-Tinte (Grafik-PEN-INK)
Ausgaben: keine
Unverändert: BC,DE,HL,IX,IY
Die Tintennummer wird mit 1, 3 oder 15 maskiert, um einen im momentan eingestellten Bildschirm-Modus gültigen Wert zu erhalten. Die Grafik-PEN-INK wird benutzt für PLOT, DRAW und um Zeichen an der Position des Grafikcursors auszugeben. Bei CPC 664 und 6128 ist sie auch eine der Die Bildausgabe: Tinten und FarbenTinten, die die Füllfläche für &GRAPHICS VDU: BD52: GRA FILLBD52 GRA FILL. BBE1: GRA GET PENErfrage die momentane Die Bildausgabe: Tinten und FarbenTinte des Zeichenstiftes. Eingaben: keine
Ausgaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Nummer der Vordergrund-Tinte (Grafik-PEN-INK)
Unverändert: BC,DE,HL,IX,IY
BBE4: GRA SET PAPERLege die Hintergrund-Tinte für Die Abteilungen des Betriebssystems: Die Grafik-VDUdie Grafik-VDU neu fest. Eingaben: Operationen: BD5B / 349A / 349A: FLO SUBA = neue Hintergrund-Tinte (Grafik-PAPER-INK)
Ausgaben: keine
Unverändert: BC,DE,HL,IX,IY
Die Tintennummer wird mit 1, 3 oder 15 maskiert, um einen im momentan eingestellten Bildschirm-Modus gültigen Wert zu erhalten. Die Grafik-PAPER-INK wird benutzt, um das Grafikfenster zu löschen und um den Hintergrund von Buchstaben zu zeichnen, die an der Position des Grafikcursors ausgegeben werden. Außerdem wird beim Erklärung der Anschlussbelegung: TestTesten von Punkten außerhalb des Grafikfensters immer diese Die Bildausgabe: Tinten und FarbenTinte angegeben. Garbage Collection: ... beim CPC 664 und 6128Beim CPC 664 und 6128 wird beim Zeichnen von Linien für jedes Null-Bit in der Linienmaske die Grafik-Paper-Ink benutzt, wenn der Die Grafik-VDU: Hintergrund-ModusHintergrund-Modus opaque (deckend) ist. BBE7: GRA GET PAPERErfrage die momentane Hintergrund-Tinte. Eingaben: keine
Ausgaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Hintergrund-Tinte (Grafik-PAPER-INK)
Unverändert: BC,DE,HL,IX,IY
BBEA: GRA PLOT ABSOLUTESetze einen Punkt auf die angegebenen Position. Eingaben: DE = X-Koordinate und HL = Y-Koordinate. Ausgaben: keine Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zum ORIGIN und vorzeichenbehaftet (-32768 bis +32767). Der Punkt wird mit der aktuellen Vordergrund-Tinte (Grafik-PEN-INK) gesetzt und dabei entsprechend dem Grafik-Vordergrundmodus mit der Die Bildausgabe: Tinten und FarbenTinte (INK) des alten Punktes verknuepft. Liegt der Punkt außerhalb des Grafikfensters, wird er nicht gesetzt. Der Punkt wird gesetzt, indem Die Indirections der Firmware-Packs: BDDC: IND GRA PLOTIND GRA PLOT aufgerufen wird. BBED: GRA PLOT RELATIVESetze einen Punkt Adressierungsarten der Z80: Relativrelativ zur momentanen Position des Grafik-Cursors. Eingaben: DE = X-Versatz und HL = Y-Versatz. Ausgaben: keine Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur aktuellen Position des Grafikcursors und vorzeichenbehaftet (-32768 bis +32767). Ansonsten wie &GRAPHICS VDU: BBEA: GRA PLOT ABSOLUTEBBEA GRA PLOT ABSOLUTE BBF0: GRA TEST ABSOLUTEErklärung der Anschlussbelegung: TestTeste, welche Tintennummer der Punkt auf der angegebenen Position hat. Eingaben: DE = X-Koordinate und HL = Y-Koordinate des zu testenden Punktes. Ausgaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Die Bildausgabe: Tinten und FarbenTinte (INK) des Punktes Unverändert: IX,IY Die Grafik-VDU: Die KoordinatenDie Koordinaten sind Adressierungsarten der Z80: Relativrelativ zum ORIGIN und vorzeichenbehaftet (-32768 bis +32767). Wird ein Punkt außerhalb des Grafikfensters getestet, so wird die aktuelle Hintergrung-Tinte (Grafik-PAPER-INK) zurückgegeben. BBF3: GRA TEST RELATIVEErklärung der Anschlussbelegung: TestTeste, welche Tintennummer ein Punkt Adressierungsarten der Z80: Relativrelativ zur aktuellen Lage des Grafik-Cursors hat. Eingaben: DE = X-Versatz und HL = Y-Versatz. Ausgaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Die Bildausgabe: Tinten und FarbenTinte (INK) des Punktes Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur aktuellen Position des Grafikcursors und vorzeichenbehaftet (-32768 bis 32767). Wird ein Punkt außerhalb des Grafikfensters getestet, so wird die aktuelle Hintergrund-Tinte (Grafik-PAPER-INK) zurückgegeben. BBF6: GRA LINE ABSOLUTEZiehe eine Linie von der momentanen Position des Grafik-Cursors zur angegebenen Adressierungsarten der Z80: Absolutabsoluten Position. Eingaben: DE = X-Koordinate und HL = Y-Koordinate des Zielpunktes. Ausgaben: keine Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zum ORIGIN und Vorzeichenbehaftet (-32768 bis +32767). Von der aktuellen Position des Grafikcursors wird eine Linie zur angegebenen Position gezogen. Dafür wird die Vordergrund-Tinte (Grafik-PEN-INK) benutzt und bei allen Punkten entsprechend dem Grafik-Vordergrund-Modus mit der alten Die Bildausgabe: Tinten und FarbenTinte (INK) des Punktes verknuepft. Die Linie wird durch Aufruf von Die Indirections der Firmware-Packs: BDE2: IND GRA LINEIND GRA LINE gezeichnet. Bei CPC 664 und 6128 bestimmt noch zusätzlich Die Grafik-VDU: Die Linienmaskedie Linienmaske, wie die einzelnen Punkte der Linie gesetzt werden. Für jedes Null-Bit wird die Grafik-Paper-Tinte und der Grafik-Hintergrundmodus benutzt. BBF9: GRA LINE RELATIVEZiehe eine Linie zu einer Position Adressierungsarten der Z80: Relativrelativ zur aktuellen Lage des Grafik-Cursors. Eingaben: DE = X-Versatz und HL = Y-Versatz Ausgaben: keine Unverändert: IX,IY Die Koordinatenangaben sind Adressierungsarten der Z80: Relativrelativ zur aktuellen Position des Grafikcursors und vorzeichenbehaftet (-32768 bis +32767). Ansonsten wie &GRAPHICS VDU: BBF6: GRA LINE ABSOLUTEBBF6 GRA LINE ABSOLUTE. BBFC: GRA WR CHARZeichne einen Buchstaben an der Position des Grafik-Cursors. Eingaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Zeichencode
Ausgaben: keine
Unverändert: IX,IY
Alle Zeichen werden ausgedruckt, Controlcodes werden nicht befolgt. Die Zeichen werden so ausgegeben, dass der Grafikcursor auf der linken, oberen Ecke der Zeichenmatrix liegt. Danach wird der Grafikcursor um einen Buchstaben nach rechts bewegt, also je nach Bildschirm-Modus um 8, 16 oder 32 Koordinateneinheiten. Zum Zeichnen des Zeichens wird Die Indirections der Firmware-Packs: BDE8: IND SCR WRITEIND SCR WRITE benutzt. Deshalb werden alle Einstellungen der Grafik-VDU befolgt, aber keine der Text-VDU (außer natürlich der TAG-Einstellung). Diese Einstellungen sind: - Grenzen des Grafikfensters,
- Grafik-PEN-INK,
- Grafik-PAPER-INK und
- Grafikmodus (Verknüpfung mit der alten Die Bildausgabe: Tinten und FarbenTinte der Punkte).
Garbage Collection: ... beim CPC 464Beim CPC gibt es nur einen Grafikmodus für die Vordergrund-Pixel (der Hintergrund ist immer deckend=opaque), bei den CPCs 664 und 6128 muss man noch zwischen Vordergrund- und Die Grafik-VDU: Hintergrund-ModusHintergrund-Modus unterscheiden. Letzterer wird als Default wie Garbage Collection: ... beim CPC 464beim CPC 464 auf opaque eingestellt. Die zweite Wahlmöglichkeit ist transparent. Hier werden die Hintergrundpixel einfach nicht geplottet. BD43: GRA DEFAULTnur CPC 664 und 6128. Stelle die Standardwerte für die verschiedenen Optionen der Grafik-VDU ein. Eingaben: keine Ausgaben: keine Unverändert: IX,IY Diese Routine nimmt folgende Einstellungen vor: - Grafik-Vordergrund-Modus = opaque Bis auf den ersten Punkt, der auch Garbage Collection: ... beim CPC 464beim CPC 464 wählbar ist, werden alle zusätzliche Optionen der CPCs 664 und 6128 so eingestellt, dass die Grafik-Ausgabe der des CPC 464 entspricht. BD46: GRA SET BACKnur CPC 664 und 6128. Setze den Die Grafik-VDU: Hintergrund-ModusHintergrund-Modus der Grafik-VDU. Eingaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Die Grafik-VDU: Hintergrund-ModusHintergrund-Modus Ausgaben: keine Unverändert: AF,BC,DE,HL,IX,IY Mit diesem Vektor kann festgelegt werden, ob Hintergrund-Punkte gezeichnet werden sollen (opaque) oder nicht (transparent). Das entspricht dem Die Grafik-VDU: Hintergrund-ModusHintergrund-Modus der Text-VDU, bezieht sich hier jedoch auf die Hintergrund-Pixel in Linien (hervorgerufen durch eine entsprechende Einstellung des Pixel-Masken: MaskenbytesMaskenbytes) und in Buchstaben, wenn man &GRAPHICS VDU: BBFC: GRA WR CHARBBFC GRA WR CHAR (nicht Garbage Collection: ... beim CPC 464beim CPC 464!!) benutzt. Operationen: BD5B / 349A / 349A: FLO SUBA=0 -> opaque (default)
A>0 -> transparent
BD49: GRA SET FIRSTnur CPC 664 und 6128. Setze die Erster-Punkt-Option für die zu zeichnenden Linien. Eingaben: Operationen: BD5B / 349A / 349A: FLO SUBA=Erster-Punkt-Flag
Ausgaben: keine
Unverändert: AF,BC,DE,HL,IX,IY
Speziell, wenn der Grafik-Vordergrundmodus auf 'XOR' eingestellt ist, ist es sinnvoll, auch die Erster-Punkt-Option zu löschen (ersten Punkt einer Linie nicht zeichnen). Dadurch wird vermieden, dass in Streckenzügen die Eckpunkte zweimal gezeichnet und damit wieder gelöscht werden. Das wäre speziell dann äußerst ungünstig, wenn man einen geschlossenen Streckenzug nachher mit &GRAPHICS VDU: BD52: GRA FILLBD52 GRA FILL ausmalen moechte. Der Algorithmus würde dann nämlich durch die Loecher an den Knickpunkten 'auslaufen'. Operationen: BD5B / 349A / 349A: FLO SUBA=0 -> Ersten Punkt nicht zeichnen (aus)
A>0 -> Ersten Punkt zeichnen (ein) (default)
BD4C: GRA SET LINE MASKnur CPC 664 und 6128. Lege die Punktmaske für Linien neu fest. Eingaben: Operationen: BD5B / 349A / 349A: FLO SUBA=Punktmaske
Ausgaben: keine
Unverändert: AF,BC,DE,HL,IX,IY
Mit Hilfe dieser Maske ist es möglich, entweder gebrochene (gepunktete) Linien oder auch zweifarbig gemusterte Linien zu zeichnen (Leider nicht Garbage Collection: ... beim CPC 464beim CPC 464). Die Punktmaske ist bitsignifikant. Wenn eine Linie gezeichnet wird, wird die Maske einmal rotiert und so das nächste Datenbreite: Bits Durch das Rotieren ist die nur 8 Datenbreite: Bits Leider optimieren die Linien-Algorithmen der Grafik-VDU ein wenig, wodurch das Ergebnis hinterher nicht mehr ganz so optimal ist: Alle eher vertikalen Linien (|dX| < |dY|) werden von unten nach oben und alle eher horizontalen Linien (|dX| > |dY|) werden de facto von links nach rechts gezeichnet, und die Maske auch in dieser Richtung angewendet. BD4F: GRA FROM USERnur CPC 664 und 6128. Konvertiere die User-Koordinaten (Adressierungsarten der Z80: Relativrelativ zum Origin) in Basiskoordinaten (Adressierungsarten der Z80: Relativrelativ zur linken unteren Ecke). Eingaben: DE = User-X-Koordinate HL = User-Y-Koordinate Ausgaben: DE = Basis-X-Koordinate HL = Basis-Y-Koordinate Unverändert: BC,IX,IY Die Basis-Koordinaten sind die 'Low-Level-Koordinaten', die vor allem vom MAIN FIRMWARE JUMPBLOCK: SCREEN PACK - Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Leider wird im Schneider CPC hierfür eine äußerst interessante Art der Rundung benutzt: Es wird immer zum Origin hin gerundet. So liegen in Die Kodierung der Tintennummern in den Bildschirm-Bytes: Mode 2: Mit Ausnahme von Die verwendeten Abkürzungen bedeuten: x:X in Die 3 verschiedenen Betriebsarten der PIO 8255: Modus 0 BD52: GRA FILLnur CPC 664 und 6128. Male eine beliebige Fläche aus. Eingaben: Operationen: BD5B / 349A / 349A: FLO SUBA = Ausmalfarbe (nicht expandiert)
HL= Bufferadresse
DE= Bufferlänge
Ausgaben: CY=1 -> Fläche vollständig ausgemalt
CY=0 -> nicht oder nicht vollständig ausgemalt
Unverändert: IX,IY
Der Füllalgorithmus malt jede beliebige, umrandete Fläche aus, ist sehr schnell und funktioniert sogar korrekt (gar nicht so selbstverständlich). Als Startpunkt gilt dabei die aktuelle Position des Grafik-Cursors. Dieser wird beim Ausmalen nicht verschoben. Als Füllgrenze gelten: - Das Grafik-Fenster, - Punkte, die in der Ausmalfarbe gesetzt sind und - Punkte, die in der Grafik-Vordergrundfarbe gesetzt sind. Dabei gelten diagonal verbundene Punkte auch als Grenze, d.h. die von der Grafik VDU gemalten Linien sind geeignet, die zu füllende Fläche zu begrenzen. Ein CY=0 als Rückgabe-Bedingung kann folgende Gründe haben: Entweder liegt der Grafik-Cursor außerhalb des Grafik-Fensters oder auf einem Pixel mit einer begrenzenden Die Bildausgabe: Tinten und FarbenTinte. Dann wird überhaupt nichts ausgemalt. Oder der zur Verfügung gestellte Puffer war zu klein. Dann wurde die Fläche nicht vollständig ausgemalt. Der Puffer dient dazu, Verzweigungspunkte der auszumalenden Fläche zu speichern. Für die meisten einfachen Formen kommt man dabei mit 10 Punkten 'dicke' aus. Bei komplizierteren Figuren muss man entsprechend mehr Platz zur Verfügung stellen. Die Fill-Routine benötigt dabei 7 Datentypen: Bytes |