Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
z9001:grafik [2010/07/17 16:48] – Externe Bearbeitung 127.0.0.1z9001:grafik [2022/10/28 11:57] (aktuell) – [Nutzung mit BASIC] volkerp
Zeile 1: Zeile 1:
-====== z9001_grafik.htm ======+====== Grafikzusatz ======
  
-| {{../vplogo.gif?120x99}} |||  |+Der Z9001 ist im Standard-Zustand nicht vollgrafikfähig, da er lediglich Textmodus mit 40x24 bzw. 40x20 Zeichen bietet. Gleichwohl bietet das BASIC des Plotter-Moduls bzw. das im KC87.2x eingebaute BASIC86 jedoch Grafikbefehle. Allerdings sind dies nur Platzhalter in der Liste der verfügbaren BASIC-Befehle; ein vollständiger Code für diese Befehle muss außerhalb des BASIC als Treiber {{grafik.zip|}} hinzugeladen werden. 
 + 
 +{{uhr_4tel_grafik.jpg?100 }} Solche Treiber gibt es  
 +  * von Robotron für [[z9001:plotter|]],  
 +  * für den Grafikzusatz http://www.sax.de/~zander/z9001/module/pixgraf.html 
 +  * von mir einen **Viertel-Grafik**-Treiber für den unverbauten KC87 mit einer Auflösung von 80x48 Pixeln (, im Bild eine Analog-Uhr mit diesem Treiber).  
 +  * und einen Treiber für die [[z9001:erweiterungen:krtgrafik|]]. 
 + 
 +  
 +===== Der Grafik-Zusatz von robotron ===== 
 + 
 +Hinweis: der Nachbau dieser Vollgrafik ist nicht mehr empfehlenswert. Einfacher und vielseitiger ist die neu entwickelte [[z9001:erweiterungen:krtgrafik|]]. 
 + 
 +{{:z9001:grafz.jpg?100 |}} Der Grafik-Zusatz wurde leider nie von Robotron produziert, sondern stand nur zur Nachnutzung zur Verfügung (s. {{:z9001:nutzerkatalog2.pdf|Nutzerkatalog 2}}, Blatt 4). Technisch gesehen ist der Grafik-Zusatz eine zusätzliche Grafikkarte mit einer Auflösung von 256x192 Pixel und einer Farbtiefe von 1 Bit; es können eine Vorder- und eine Hintergrundfarbe aus 8 Farben gewählt werden; diese Farben gelten dann für das gesamte Bild. Die Umschaltung zwischen interner Bildausgabe und Grafik-Zusatz erfolgt im Original über Relais. Es ist entweder die interne Bildausgabe aktiv oder der Grafik-Zusatz, eine Overlay-Möglichkeit besteht nicht. Zur Textausgabe besitzt der Treiber für den Grafik-Zusatz einen 6x8-Pixel-Zeichensatz; damit sind 42 Zeichen/Zeile möglich. 
 + 
 +{{z9001_vollgrafik_robotron.jpg?400}}\\ KC mit originalem Grafikzusatz. Besitzer R. Kurth 
 + 
 +Im aktuellen JKCEMU von J. Müller (ab Version 0.6) http://www.jens-mueller.org/jkcemu/index.html wird der Robotron-Grafik-Zusatz emuliert: 
 + 
 +{{grafik_test.gif}} {{grafik_sinus.gif}}\\ Beispiel-Grafiken mit R+GRDEM2, meiner Adaption des Plotter-Demo-Programms. (Ein originales Testprogramm GRDEMO.SSS ist erst 2011 aufgetaucht) 
 + 
 +Der Grafikzusatz enthält einen externen Pixelspeicher von 6144 Byte (0..17FFh) (= 256x192 Pixel / 8 Pixel/Byte ). 
 + 
 +<code> 
 +Spalte     0..7 8    16         ...                   248..255 
 +Zeile    ------------------------------------------------------ 
 +      0  | 0000 0001 0002       ...                   001F    | 
 +      1  | 0020 0021 0022       ...                   003F    | 
 +         | ..                                                 | 
 +                                                            | 
 +                                                            | 
 +                                                            | 
 +                                                            | 
 +                                                            | 
 +    191  | 17E0 17E1 17E2       ...                   17FF    | 
 +         ------------------------------------------------------ 
 +</code> 
 + 
 +Dieser Speicher ist nicht direkt ansprechbar; er kann nur byteweise über Ports angesprochen werden. 
 + 
 +<code> 
 +port    0B8h            ; Farbe + Grafik ein/aus 
 +                        ; 7 6 5 4 3 2 1 0 
 +                        ; | +-+-+ | +-+-+ 
 +                        ; |       | 
 +                        ; |       PAPER (BGR) 
 +                        ; |     Grafik ein/aus 
 +                        ; |   INK (BGR) 
 +                        ; RAND 
 +port    0B9h            ; Adresse für internen Speicher 
 +                        ; die unteren Adressleitungen werden mit OUT (C) 
 +                        ; direkt ausgegeben, die oberen Adressdaten liegen 
 +                        ; über Register B auf dem Adressbus 
 +port    0BAh            ; Daten 
 +</code> 
 + 
 +Der Zugriff nutzt dabei die Eigenheit des Z80 aus, bei IN/OUT-Befehlen das gesamte Doppelregister AF bzw. BC auf den Adressbus zu legen. Hardwaremäßig wird erst mit der Ausgabe des Speicherinhalts die Adresse an die internen RAM's aktiv. Die Ausgabe der Adresse erfolgt in zwei Schritten: Erst Ausgabe der Adresse Low-Teil auf Port B9 (Ein Latch speichert den Wert), dann Ausgabe des Speicherinhalts auf den Datenbus und gleichzeitig die Ausgabe der Adresse High-Teil auf den Adressbus. Folgender Code zeigt die notwendigen Abläufe beim Schreibzugriff: 
 + 
 +<code> 
 +write:  ld      bc, (curadr)    ; current address in external RAM 
 +        ld      a, c            ; untere 8 Bit der Adresse 
 +        ld      c, port_0BAh    ; ausgeben auf Port 0B9h 
 +        out     (port_0B9h), a  ; out low address, auf High-Teil des Adressbusses  
 +                                ; liegt A, wird ignoriert 
 +        ld      a, (curbyte)    ; auszugebendes Byte 
 +                                ; in C steht der Port 0BAh 
 +        out     (c), a          ; out data and high address 
 +                                ; jetzt steht B auf dem High-Teil des Adressbusses,  
 +                                ; auf den Low-Adressen liegt der Port (wird ignoriert) 
 +                                ; und auf dem Datenbus liegt A 
 +</code> 
 + 
 +===== Der Plotter ===== 
 + 
 +{{a_XY4131b.jpg?100 }} Der Treiber unterstützt auch die alternative Grafikausgabe auf einen angeschlossenen Kleinplotter, s. [[z9001:plotter|]]. 
 + 
 +  
 +<WRAP clear></WRAP> 
 + 
 +===== Nutzung mit BASIC ===== 
 + 
 +Man benötigt: 2 RAM-Module, das Plotter-BASIC bzw. BASIC 86 (also einen KC87.2x oder das Plottergrafikmodul) und den Gerätetreiber. Zuerst muss der Gerätetreiber GRAF.COM geladen werden. Beim Start von BASIC ist memory end? **32700** (oder kleiner) anzugeben. 
 + 
 +Folgende Grafikbefehle gibt es im BASIC:\\ PSET, LINE, CIRCLE, PAINT, LABEL, SIZE, ZERO, HOME, GCLS, SCALE, SCREEN, POINT, XPOS, YPOS. 
 + 
 +Im Erweiterung zur Plotter-Anleitung können auch  XPOS, YPOS und (wenig sinnvoll) PAINT und POINT genutzt werden:  
 + 
 +  * **XPOS** liefert als Rückgabeparameter die x-Koordinate des letzten erreichten Punktes,  
 +  * **YPOS** die entsprechende y-Koordinate.  
 +  * **POINT(x,y)** liefert als Rückgabeparameter 0, wenn der Abfragepunkt x,y die Hintergrundfarbe, und 1, wenn der Abfragepunkt die Vordergrundfarbe hat. Im Plottertreiber liefert POINT immer 0.  
 +  * **PAINT (x,y)[,c[,d]]** ist undokumentiert, und weder im Plotter- noch im Vollgrafiktreiber realisiert. Im Plottertreiber ist PAINT im physischen Treiber mit einem Return kurzgeschlossen.  
 +  * **LINE** akzeptiert neben dem Parameter B auch den Parameter BF (box filled). Das ist jedoch nicht implementiert. 
 + 
 +Für die gemeinsame Programmierung von Vollgrafik und Plotter ist der **unterschiedlich große Zeichenbereich** zu beachten:  
 +  * Plotter: 2550x1800,  
 +  * Vollgrafik: 256x192.  
 +Zur Initialisierung beider Geräte dient der Befehl **SCREEN**:  
 +  * SCREEN 0,0 - Standardbildschirm,  
 +  * SCREEN 0,1 - Plotter (am E/A-Port) aktivieren,  
 +  * SCREEN 1 - Vollgrafik.  
 +Ein gleichzeitiger paralleler Betrieb von Vollgrafik und Plotter funktioniert nicht; es kann aber wechselweise auf beide Geräte (mit entsprechender Skalierung) derselbe Zeichenvorgang wiederholt werden. 
 + 
 +Die BASIC-Befehle sind bezogen auf die Vollgrafik in z9_gbas.pdf ({{http://www.sax.de/~zander/z9001/module/pixgraf.html|Grafik-Zusatz}} bei U. Zander beschrieben. Für die Plotter stehen die Befehle in den zugehörigen Handbüchern {{xy4131.pdf}} bzw. {{xy4140.pdf}} (s.a. [[z9001:plotter|]]). 
 + 
 +Mai 2009: Vermutlich stand das MSX-BASIC Vorlage für die Grafikbefehle. Auch die Auflösung von 256x192 Pixeln entspricht dem MSX-1-Standard. Die Befehle sind offenbar genauso wie im MSX-Standard definiert. (Quelle: MSX2 TECHNICAL HANDBOOK). In der  Ergänzung zur Bedienungsanleitung des KC87.2x {{:z9001:anleitung_kc87_2x.pdf|}} steht dazu: "//Die Syntax und Semantik der Grafik-Anweisungen entsprechen weitgehend dem internationalen Standard// und sind im Detail den Bedienungsanleitungen der grafischen Ausgabegeräte zu entnehmen."\ Der MSX1-Standard beschreibt folgende Befehle: 
 + 
 +  * **PSET %%{(%%X,Y) | STEP(X,Y)}[, <colour>[, <logical operation>]]** Draws the dot in the coordinate specified by (X,Y) on the graphic screen. 
 +  * **CIRCLE %%{(%%X,Y) | STEP(X,Y)},<radius>[, <colour>[, <start angle>[, <end angle>[, <proportion>]]]]** Draws a circle whose center is at (X,Y) and whose size depends on <radius>
 +  * **LINE %%[{(%%X1,Y1) | STEP(X1,Y1)}] - %%{(%%X2,Y2) | STEP(X2,Y2)}[, <colour>[, {B|BF}[, <logical operation>]]]** Draws a line or a rectangle on the screen. 
 +  * **PAINT %%{(%%X,Y) | STEP(X,Y)}[, <colour>[, <border colour>]]** Paints the area surrounded by specified <border colour> using <colour>
 +  * **SCREEN <screen mode>[...]** Sets the screen mode and so on. 
 +  * **function POINT (X,Y)** Returns the colour of the dot specified by coordinate (X,Y). 
 +  * **LABEL, SIZE, ZERO, HOME, GCLS, SCALE und die Funktionen XPOS und YPOS** gibt es in MSX nicht 
 + 
 +Randbemerkung: Interessanterweise werden in der Broschüre "BASIC-Anwenderprogramme und Hinweise zum Kleincomputer robotron KC 85/1 und KC 87" andere BASIC-Befehle beschrieben, die wohl ursprünglich geplant waren und offenbar auch schon implementiert wurden: MOVE x,y (zum Punkt bewegen); PLOT x,y (Linie zum Punkt zeichnen); POINT x,y (Punkt zeichnen); ZERO x,y; HOME; LABEL A$; SIZE xx,xy,yx,yy. 
 + 
 +{{gr3dfkt.gif}} {{n-eck.gif}}\\ 3D-Grafik (nach W.Hinze, Mikrocomputer, 1988); n-Eck (nach H.Völz) 
 + 
 +{{globus87.gif}} {{uhr.gif}}\\ Globus (nach H.Völz); Uhr (V.Pohlers) 
 + 
 +===== Treiber-Interna ===== 
 + 
 +Von Robotron gibt es zwei [[grafik|Treiber]] als Erweiterung zum BASIC86: Den Treiber GRPLOT.COM von der Kassette R0114 (Plotter-Kassette) und den Treiber GRAF.COM zum Grafik-Zusatz. Der Treiber GRAF.COM umfasst phys. Treiber sowohl für die Plotter XY4131 als auch für die Vollgrafik. Für die Textausgabe enthält der Vollgrafik-Treiber einen 6x8-Pixel-Zeichensatz (der gleiche wie bei den Druckertreibern). Der Treiber GRAF.COM ist somit universell nutzbar; belegt aber auch mehr Arbeitsspeicher. 
 + 
 +Vor Arbeit mit BASIC muss man den Grafik-Treiber GRAF.COM laden. Anschließend das Plotter-BASIC zu starten (BASIC-86). Bei Memory end ist 32700 (oder kleiner) anzugeben.\\ \\ Die Basicbefehle zur Grafik-Erweiterung springen auf eine Befehlsliste außerhalb des BASIC-Bereiches: die Liste wird auf A7D6...A7FD erwartet. Auf A7D6 (dez: -22570) muss C3 (JP) stehen, sonst ist keine Erweiterung geladen und die Grafikbefehle können nicht genutzt werden. 
 + 
 +prinzipieller Aufbau des Treibers GRAF.COM: 
 + 
 +| Sprungverteiler physische Treiber | 
 +| Treiber für Plotter, im Anschluss Zeichentabelle | 
 +| Treiber für Vollgrafik BASIC-Erweiterung (logischer Treiber) | 
 +| Zeichensatztabelle f. Treiber für Vollgrafik | 
 +| Sprungverteiler BASIC-Erweiterung (Adresse 0A7D6h) | 
 + 
 +Folgende Grafikbefehle gibt es im BASIC: PSET, LINE, CIRCLE, PAINT, LABEL, SIZE, ZERO, HOME, GCLS, SCALE, SCREEN, POINT, XPOS, YPOS. Alle diese Befehle werden vom logischen Treiber vollständig verarbeitet und führen deswegen nicht zu BASIC-Fehlern. Der BASIC-Treiber übernimmt die Analyse der Befehlszeile und die Skalierung der Koordinaten. Dann wird der Sprungverteiler für die physischen Treiber aufgerufen. 
 + 
 +^GRPLOT.BIN\\ Adr. 9800-A7FF ^ BASIC-Befehl ^ phys. Treiber Nr. ^ Bemerkung| 
 +|0A7D6h|pset|1| | 
 +|0A7D9h|line|2|LINE kennt den BOXED-Mode BF, dieser ist aber nicht implementiert| 
 +|0A7DCh|circle|3| | 
 +|0A7DFh|paint|4|PAINT (x,y)[,c[,d]] ist undokumentiert, und weder im Plotter- noch im Vollgrafiktreiber realisiert| 
 +|0A7E2h|label|5| | 
 +|0A7E5h|size|6| | 
 +|0A7E8h|zero|7| | 
 +|0A7EBh|home|8| | 
 +|0A7EEh|gcls|9| | 
 +|0A7F1h|scale|-|ist komplett im log. BASIC-Treiber implementiert, es gibt keinen korrespondierenden Aufruf im phys. Treiber| 
 +|0A7F4h|screen|-|ist komplett im log. BASIC-Treiber implementiert, es gibt keinen korrespondierenden Aufruf im phys. Treiber| 
 +|0A7F7h|point|10|POINT liefert für Plotter immer 0| 
 +|0A7FAh|xpos|11| | 
 +|0A7FDh|ypos|12| | 
 + 
 +Den reassemblierten und kommentieren Quellcode des Treibers GRAF.COM gibt es im Treiberpaket {{grafik.zip}}. 
 + 
 +===== Treiber für Pseudo-Grafik ===== 
 + 
 +Im Zeichensatz des Z9001 befinden sich spezielle Grafikzeichen, mit denen eine sogenannte "Viertel-Grafik" mit einer Auflösung von 80x48 "Pixel" realisiert werden kann. Mit meinem Treiber {{grafik.zip}} **GRAF14** können die BASIC-Grafik-Befehle mit dieser Auflösung genutzt werden und so ein bisschen Grafikprogrammierungsluft geschnuppert werden. Außerdem gibt es aus der Entwicklungsphase noch einen Grafiktreiber **GRAF11** mit der nativen Textauflösung von 40x24 "Pixeln"
 + 
 +{{grafik11_uhr.gif}} {{graftest2.gif}}\\ Grafik-Treiber GRAF11 für Testauflösung 40x24 "Pixel". Im Download-Paket ist auch eine angepasste Version des Uhrenprogramms UHR11.; Weiteres Beispiel mit einer frühen Testversion. Die kleinen Punkte sind 'gelöschte' Pixel bei einer Ansteuerung wie beim originalen Grafikzusatz; es wurden also immer 8 "Pixel" in einem Byte gleichzeitig bearbeitet. 
 + 
 +{{4tel_grafik_test1.gif}} {{globus14.gif}}\\ Grafik-Treiber GRAF14 für Auflösung 80x48 "Pixel". Im Download-Paket ist auch eine angepasste Version des Uhrenprogramms UHR14.; Das Globus-Programm, skaliert auf 80x48 Pixel. 
 + 
 +===== Grafik ala Kleinstrechnertipps 11 ===== 
 + 
 +Der Nachbau des robotron-Grafik-Zusatzes ist recht aufwändig. Günstiger erscheint mir eine Idee aus den Kleinstrechnertipps Nr. 11, die dort für den Z1013 vorgestellt wurde und mit nur 4 Schaltkreisen auskommt: 
 + 
 +Der Bildwiederholspeicher der internen Grafik wird 8fach parallel ausgeführt, diese 8 Ausgänge werden anstelle der Ausgabe des Zeichengenerators direkt auf den Bildschirm ausgegeben. 
 + 
 +Details s. [[z9001:erweiterungen:krtgrafik|]]
  
  • z9001/grafik.1279385309.txt.gz
  • Zuletzt geändert: 2010/07/21 22:00
  • (Externe Bearbeitung)