1990-Club80-31 S.25-32 ## Club 80 Projekt: ### Bau einer Terminal-Karte auf Basis der PC-Hercules-Karte Der GENIE 1 mit Hercules-Karte als Video-Interface ist ja ganz witzig aber für die meisten Club-Mitglieder uninteressant, weil die Strippenzieherei einfach zu aufwendig ist und die Festlegung auf die GENIE-Kompatibilität zu beengend ist. Um das günstige Preis/Leistungs-Verhältnis der Hercules allgemeiner zugänglich zu machen, wurde angeregt, als Projekt im Club 80 eine Terminal-Karte zu bauen, die zusammen mit der Hercules in jedem Computer als Konsole eingesetzt werden kann. Das Terminal soll mit Z80-Power und entsprechender Betriebssoftware fast ein eigenständiger Text-/Grafik-Computer sein, der in Arbeitsteilung mit der CPU Video-Ausgaben erledigt. Da eine EGA- oder VGA-Karte ähnlich wie die Hercules-Karte funktioniert (erweiterter I/O-Adreßbereich, anderer Memory-Adreßbereich), ist das Prinzip auch auf diese Karten anwendbar. Es bestehen dort aber bei den über die IBM-Vorgaben hinausgehenden Features unterschiedliche Lösungen, die nicht ausreichend dokumentiert sind. Außerdem benötigen diese Karten Monitore, deren Preise weit über den Aktionsradius des Bastlers hinausgehen, so daß wir uns zunächst auf die Hercules-Karte beschränken sollten. Wenn wir das im Griff haben, können wir immer noch überlegen, ob wir nach den Sternen greifen wollen. Von Andreas Magnus habe ich als letzte Meldung vor längerer Zeit erfahren, daß er auch schon einen entsprechenden Artikel ins Info gesetzt hat; ich weiß allerdings nicht, was er dort schon angekündigt hat. Deshalb möge man mir nachsehen, wenn einige Aussagen hier zum zweiten mal erscheinen. Da inzwischen schon etwas festere Vorstellungen bestehen, ist dieser Beitrag aber unumgänglich. Die Kommunikation der Terminal-Karte mit der CPU soll über einen bidirektionalen Parallelport (Datenaustausch) und einen Statusport (Handshaking) erfolgen. Zwischen CPU und Terminal werden Befehle der CPU an das Terminal vereinbart, die das Terminal zur selbständigen Bearbeitung der Hercules anregen. Die bisherige Vorstellung sieht dabei im Textmodus die Emulation eines Televideo 950 Terminals und im Grafikmodus die eines Tektronix 4014 Grafikterminals vor. Während für die Hardware des Terminals schon feste Vorstellungen bestehen, ist für die Betriebssoftware noch alles offen. Zur Erstellung eines Betriebsprogramms für das Terminal sind alle Club-Mitglieder herzlich eingeladen. Der Umfang der zu erstellenden Software ist so groß, daß jedes Gramm Gehirnschmalz im Club gefragt ist. Durch das Herumwerkeln mehrerer Programmierer ist die Funktion eines Software-Koordinators nötig (Freiwillige bitte vortreten !). Dieser Job bedeutet, einen Überblick über die Gesamtarbeit zu gewinnen, diese in Module zu unterteilen und die Zusammenarbeit der einzelnen Module durch Festlegen von gemeinsam genutzten Datenfeldern und zu übernehmenden und zu übergebenden Parametern der einzelnen Module (in den CPU-Registern) zu gewährleisten. Diese Vorgaben sind von den Programmierern der einzelnen Module einzuhalten. Wer dazu Vorstellungen hat, möge bitte nicht durch bescheidene Zurückhaltung versuchen, einen guten Eindruck zu machen. Auch wenn jemand zu Teilaspekten der Betriebssoftware Ideen hat und die Programmierung dieses Parts übernehmen möchte (oder auch nur seine Idee einbringen möchte), kann er einen wertvollen Beitrag zu dem Projekt leisten. Als Bestechung in Naturalien bekommt jeder, der sich an dem Projekt beteiligt, von mir eine geätzte Terminalkarte geschenkt, die er allerdings selbst und mit eigener Finanzierung der Bauteile aufbauen muß. Hercules-Karten kann ich auch günstig beibringen (zur Zeit für 40,-DM). Wer den Job des Software-Koordinators übernehmen will, bekommt auch die Hercules geschenkt (wenn der Club mit seinem gewaltigen Konto das nicht übernehmen will, stifte ich die Karte). Um das ganze Projekt etwas konkreter darzustellen, will ich im folgenden die bestehenden Vorstellungen zur Hardware und Software, wie Andreas Magnus und ich uns das vorstellen, breittreten. Wie gesagt, davon ist noch nichts endgültig. Insbesondere bei der Software-Vorstellung kann noch alles ganz anders gestaltet werden. Das Folgende ist also nur als Diskussionsgrundlage zu werten. So könnte die Hardware aussehen: Das Terminal ist ein Z80-Computer mit 32K Arbeitsspeicher und 32K Hercules-Video-RAM. Nach dem Einschalten besteht der Arbeitsspeicher beim Lesen aus EPROM und beim Schreiben aus RAM. Durch ein LDIR wird der EPROM-Inhalt bei der Initialisierung ins RAM kopiert. Danach wird das EPROM abgeschaltet und beim Lesen und Schreiben in den unteren 32K erreicht der Z80 das RAM. Die oberen 32K des Z80 sind dem Video-RAM der Hercules vorbehalten. Hier können die beiden 32K HRG-Pages der Hercules bzw. das Text-/ Attribut-Video-RAM eingeblendet werden. Im Textmodus bietet die Hercules-Karte 8 linear hintereinander liegende Seiten mit je 4K Text-/Attribut-Speicher. Im I/O-Adreßraum des Terminal-Z80 sind die Hercules-internen Ports, das Interface zum Host-Computer, ein Latch zur Einstellung der Konfiguration des Terminals und ein Tastatur-Interface unterzubringen. Zur Vereinfachung der Hardware scheinen folgende Portadressen die sinnvollsten zu sein:
      B0H-BFH   interne Ports der Hercules-Karte
                   (siehe Artikel zur Hercules im GENIE)
      00H       Status-Register des Interface zum Host-Computer
      01H       Daten-Register des Interface zum Host-Computer
      02H       Konfigurations-Latch
      03H       Tastatur

    Das Konfigurations-Latch unterstützt bislang folgende Befehle:

      OUT  (02H),0  Einschalten des Text-/Attribut-Speichers im Textmodus
                    bzw. der HRG-Seite 0 im Grafik-Modus
      OUT  (02H),1  Einschalten der HRG-Seite 1; im Text-Modus ist der
                    Text-Speicher nicht verfügbar
      OUT  (02H),2  im Bereich 0-32K ist bei Leseoperationen das EPROM
                    eingeblendet
      OUT  (02H),3  sowohl beim Lesen als auch beim Schreiben liegt im Be-
                    reich 0-32K RAM vor
      OUT  (02H),5  und danach
      OUT  (02H),4  Zurücksetzen des Interface der PC-XT-Tastatur
Die Ausgabe der Werte 6-15 kann für weitere Konfigurations-Einstellungen benutzt werden. D0 gibt dabei jeweils den Pegel einer entsprechenden Steuerleitung wieder (Q3-Q7 des 74LS259-Latch) und D1-D3 geben vor, welche Steuerleitung geschaltet werden soll. Die Portadressen, unter denen das Terminal für den Host-Computer erreichbar sein soll, lassen sich über Jumper in Schritten von 4 beliebig einstellen. Die Basisadresse X+0 ist das Status-Register. D0 des Status-Registers zeigt an, ob das Terminal ein weiteres Byte annehmen kann:
      D0=0 :  das Terminal kann ein weiteres Byte annehmen
        =1 :  es darf noch kein weiteres Byte an das Terminal ausgegeben
              werden
    D7 gibt an, ob das Terminal bei der Ausgabe von Daten an den Host ein
    neues Byte bereitgestellt hat:
      D7=0 :  es steht kein neues Byte des Terminals bereit
        =1 :  das Terminal hat ein neues Byte ausgegeben

    Je nach Zustand der Bits 0 und 7 des Status-Ports kann die CPU an den
    Daten-Port X+1 ein weiters Byte ausgeben bzw. von dort ein weiteres
    Byte abholen.

    Für den Z80 des Terminals liegen die Adressen der Ports des Interface
    fest (00H = Status-Register; 01H = Daten-Register). Durch Lesen des
    Satus-Registers kann der Terminal-Z80 feststellen, ob er Daten entge-
    gennehmen kann/muß bzw. ausgeben kann/muß:
      D0=0 :  es kann/muß ein weiteres Byte an den Host ausgegeben werden
              (der Host hat das letzte Byte abgeholt)
        =1 :  es darf noch kein weiteres Byte an den Host ausgegeben wer-
              den
      D7=0 :  es liegt kein neues Byte vom Host vor
        =1 :  der Host hat ein neues Byte ausgegeben, das abzuholen ist

    Zur Vereinfachung der Kommunikation zwischen Host und Terminal wird
    am Terminal-Z80 ein Interrupt erzeugt, wenn der Host ein neues Datum
    ausgegeben hat.
Als Tastatur kann wahlweise eine 8Bit-Parallel-ASCII-Tastatur oder eine serielle PC-XT-Tastatur verwendet werden. Beide Interfaces sind bei der bislang bestehenden Prototypen-Karte vorhanden und können durch Jumper selektiert werden. Wenn von der Tastatur ein Byte gekommen ist, wird am Terminal-Z80 ein /NMI ausgelöst. Und das sollte die Software unterstützen:
    In allen vorgesehenen Betriebsmodi des Terminals sind Umschaltbefehle
    möglich, die in einen jeweils anderen Modus umschalten oder sonstige
    Spezialaufgaben erledigen:
      1)  Einschalten des TVI 950 Textmodus (Grundeinstellung)
      2)  Einschalten des Tektronix 4014 Grafikmodus
      3)  Umschalten zwischen Local Mode und OnLine-Betrieb
      4)  Übernehmen eines Maschinenprogramms vom Host;
          Der Befehl enthält als Parameter Ladeadresse, Länge und Call-Adr.
      5)  Umschalten zwischen Video- und Drucker-Ausgabe
      6)  Übernahme eines Initialisierungsstrings und der Bit-Grafik-Ein-
          leitung für den jeweils an der Hercules angeschlossenen Drucker
      7)  Hardcopy des Bildschirmes (sowohl Text als auch Grafik, was
          gerade eingestellt ist)
Die ersten 3 Punkte machen schon ein recht ansehnliches Terminal aus. Die Übernahme und optionale Ausführung von Maschinenprogrammen hat hauptsächlich in der Entwicklungsphase der Software ihre Bedeutung. Außerdem erlaubt sie auch später noch den Mißbrauch der Z80-Power des Terminals für Anwenderzwecke. Der Punkt 5 erschlägt mit dem Terminal auch gleich eine Drucker-Schnittstelle. Die Punkte 6 und 7 drängen sich bei der gemeinsamen Lage von Video- und Drucker-Interface geradezu auf. Als Grundstock an Treiberroutinen müssen die Initialisierung des Textbildschirms und des Grafikbildschirms sowie ein Tastatur-Treiber vorhanden sein. Für die beiden Video-Modi muß je ein Interpreter für die im jeweiligen Modus gültigen Control-Codes und Escape-Sequenzen existieren, der auch immer die oben angeführten globalen Umschaltbefehle mit berücksichtigt. Die Befehle des Terminals Grip 5.x Um irgendwo anzufangen, habe ich mir die Leistungen der GRIP 5.X von Conitec als Vorlage für das Hercules-Terminal herangezogen. Dort werden ebenfalls ein TVI 950 Textterminal und ein Tektronix 4014 Grafikterminal unterstützt, eine Tastatur und ein Drucker angeschlossen und ähnliche Zusatzleistungen bereitgestellt. Die mit dem Hercules-Terminal möglichen Befehle der GRIP seien im Folgenden mit knapper Beschreibung zusammengestellt. Alle Features der GRIP, die sich bei derselben als unschön erwiesen haben, sind hier garnicht erst aufgeführt.
    ESC ESC  'A'	1BH 1BH 41H	TVI 950 Textmodus einschalten
    				(Einstellung nach RESET)
    TVI 950 Steuercodes:
    ^H	08H	Cursor nach links
    ^I	09H	Cursor nach rechts (mit Scroll)
    ^K	0BH	Cursor eine Zeile hoch
    ^V	16H	Cursor eine Zeile runter (mit Scroll)
    ^J	0AH	Line Feed (wie ^V)
    ^M	0DH	Carriage Return, Cursor an den Zeilenanfang
    ^_	0FH	Neue Zeile (= Carriage Return + Line Feed)
    ^^	1EH	Cursor Home (Zeile 0, Spalte 0)  ohne ClrScr
    ^Z	1AH	Bildschirm löschen
    ^L	0CH	Form Feed (:= Clear Screen + Cursor Home)
    ^G      07H	Rabatz auslösen (muß außerhalb des Terminals
    		erzeugt werden)

    TVI 950 Escape-Sequenzen;
    ESC '+'		Form Feed (wie ^L)
    ESC ';'		Form Feed (wie ^L)
    ESC '.' a	Cursor Attribut setzen
    	a = '0'	unsichtbarer Cursor
                '1'	Blinkender Block  (nach Reset)
    	    '2' stehender Block
    	    '3' blinkender Unterstrich
    	    '4' stehender Unterstrich
    	    '5' '6' '7' diverse User Cursor
    ESC '=' y x	Cursorposition setzen
    ESC '?'		Corsorposition abfragen
    		Antwort:  y  x
    	y	Zeilennummer + 20H
    	x	Spaltennummer + 20H
    		bei Antwort auf die Abfrage ist in (y, x, cr)
    		das Bit 7 gesetzt
    ESC '1'		Bildschirm um 1 Zeile hochscrollen
    ESC '2'		Bildschirm um 1 Spalte nach rechts scrollen
    ESC '3'		Bildschirm um 1 Zeile runterscrollen
    ESC '4'		Bildschirm um 1 Spalte nach links scrollen
    	der Cursor bewegt sich mit dem Text bis zum Rand
    ESC 'E'		Leerzeile an der Cursorposition einfügen
    ESC 'R'		Zeile an Cursorposition löschen
    	die nachfolgenden Zeilen werden entsprechend bewegt
    ESC 'T'		Zeile ab Cursor bis Ende löschen
    ESC 'Y'		Zeile ab Cursor bis Ende löschen
    ESC 'G' x	Zeichenattribute setzen
    	x: D0=1: Zeichen unsichtbar		möglich
    	   D1=1: Zeichen durchgestrichen	nicht möglich
    	   D2=1: Zeichen invers dargestellt	möglich
    	   D3=1: Zeichen unterstichen		nicht möglich
    	   D4,D5 = 0,0: Subscript		nicht möglich
    		   0,1: Indexschrift		nicht möglich
    		   1,0: Superscript		nicht möglich
    		   1,1: normale Schrift default	möglich
    	D6=1:   Breitschrift			nicht möglich
    	D7      ist immer low auszugeben
    ESC ')'		Invertieren einschalten
    ESC '('		Invertieren ausschalten
    ESC 'n'		Bildschirm eingeschaltet
    ESC 'o'		Bildschirm dunkel
    ESC '$'		Strichgraphik ein	Multiplan-kompatibel
    ESC '%'		Strichgraphik aus	Zeichen anstelle der
    					Großbuchstaben

    ESC ESC 'T'	Tektronix-Grundmodus einschalten

    Tektronix-Control-Codes

    ^M	0DH	Alphamodus ein, Cursor an den Anfang der Zeile,
    		Zeile der letzten Grafikposition setzen
    ^_	1FH	Alphamodus ein, Inkrementalmodus aus Curdor auf
    		die letzten Grafik-Koordinaten setzen
    ^Ö	1CH	Punktmodus aus
    ^U	1DH	Vektormodus ein; der erste Vektor wird
    		nicht gezeichnet, die Koordinaten werden
    		als neuer Anfangspunkt übernommen
    ^G	07H	Sonderfunktion (nach ^U): der Vektor wird
    		doch gezeichnet
    ^^	1EH	Inkrementalmodus ein
    ^Q	11H	lösche mit Schwarz (Hintergrundfarbe)
    ^R	12H	zeichne invers (Vordergrund schwarz<=>weiß)
    ^S	13H	zeichne mit weiß(=> Vordergrundfarbe)
    		die letzten drei Steuercodes sind nicht Bestandteil
    		des Tektronix-Befehlssatzes sondern Erweiterungen
    		der GRIP

    Tektronix-ESC-Sequenzen

    ESC '^L'	Clear Screen, Alphamodus ein, Cursor
    ESC '1' 	Bildschirm um 1 Zeile hochscrollen
    E5c '2'		Bildschirm um 1 Spalte nach rechts scrollen
    ESC '3'		Bildschirm um 1 Zeile runterscrollen
    ESC '4'		Bildschirm um 1 Spalte nach links scrollen
    	die letzte Grafik-Koordinate scrollt mit, die Posi-
    	tion relativ zum Nullpunkt ändert sich also
    ESC 'G' X	Zeichenattribute für Alpamodus setzen
    		Attribute sind die gleichen wie bei TVI 950
    ESC '~'		Vektortyp := durchgehende Linie (default)
    ESC 'a'		Vektortyp := gepunktete Linie
    ESC 'b'		Vektortyp := Strichpunk Linie
    ESC 'c'		Vektortyp := kurz gestichelte Linie
    ESC 'd'		Vektortyp := lang gestichelte Linie
    ESC 'F'		Fülle Fläche, in der der Grafik-Cursor steht
    		mit Muster des Zeichens 7FH

    Der Vektormodus (mit ^U einschalten)

    Bei der Hercules beträgt die Grafikauflösung 720 (x) * 348 (y) Punkte.
    Der Ursprung (0,0) liegt unten links. Eine Koordinate wird durch 2
    10Bit-Werte angegeben, die als 4 Bytes mit 5 signifikanten Bits
    (D4-D0) an das Terminal übertragen werden. Welche Funktion das jeweil-
    ige Byte hat, wird durch D5-D7 codiert:

    	0,0,1	obere 3 Bit der Y-Koordinate
    	0,1,1	untere 3 Bit der Y-Koordinate
    	0,0,1	obere 3 Bit der X-Koordinate
    	0,1,0	untere 3 Bit der X-Koordinate

    Die Übertragung erfolgt in der Reihenfolge: Yhigh, Ylow, Xhigh, Xlow
    Folgende Formate zur Datenübergabe sin erlaubt:
    	Yhigh,Xlow		für die nicht übergebene Anteile
    	Yhigh,Xhigh,Xlow	der Koordinaten werden die zuletzt
    	Ylow,Xlow		übergebenen Werte wieder verwandt
    	Xlow

    Mit dem Empfang des Xlow-Bytes ist die Übertragung eines Koordinaten-
    Wertepaares abgeschlossen, das Terminal zeichnet dann einen Vektor
    vom letzten Koordinatenpunkt zum neu angegebenen Punkt.

    Der Inkrementalmodus

    zeichnet von der letzten Grafik-Koordinate in 1-Punkt-Schritten
    weiter, die Werte (X,Y) des Grafik-Cursors laufen mit. Die Richtung
    wird durch die folgenden Zeichen vorgegeben:

    	F    D    E		'F' nach oben links
    				'D' nach oben
    	B    *    A		'E' nach oben rechts
    				'B' nach links
    	J    H    I		'A' nach rechts   u.s.w.

    Durch 'P' 'Q' 'R' 'T' werden die Zeichenmodi eingestellt. Ein
    Modus ist so lange wirksam, bis ein neuer eingeschaltet wird. Nach
    dem Einschalten des Inkrementalmodus muß einer dieser Befehle folgen:

    ' '	Punkte nicht zeichnen, nur Grafik-Cursor bewegen
    'P'	Punkte zeichnen (weiß, wie ^S)
    'Q'	Punkte löschen (schwarz, wie ^Q)
    'R'	Punkte invertieren (wie ^R)