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 schwarzweiß)
^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)