
Es lebe der Standard!

Hercules Graphic Adapter meets Trash 80

Helmut Bernhardt


Genau besehen hat es auch Vorteile, daß der Industriestandard einen
so niedrigen Standard hat. Insbesondere die Hercules-Karte, die dort
schon nicht unbedingt als schlechteste Video-Karte gilt, ist schon
fast zum TRS80 kompatibel. Ja, nicht ganz zu dem, aber doch schon
zum GenieIIIs-Video-Interface. Wie im GIIIs gibt es dort eine 2K große
Text-Video-Seite (80x25 Zeichen) und ebenso memory mapped. Zusätz-
lich bietet die Hercules aber auch noch einen 2K großen Attribut-
-Speicher, womit sich für jedes Zeichen auf dem Bildschirm einzeln
Attribute setzen lassen. Und schließlich wird auf der Hercules wie im
GenieIIIs mit 2 HRG-Pages mit je 32K Größe (ebenfalls bei beiden
memory mapped) Grafik dargestellt. Bei beiden Geräten wird alles von
einem CRTC6845 gesteuert.

Die maßgeblichste Inkompatibilität ist die Tatsache, daß bei der Her-
cules Text- und Attribut-Seicher ineinander verschoben sind. Dort
werden innerhalb eines lineren 4K-Bereichs alle geradzahlien Adres-
sen für Textzeichen und alle ungeradzahligen Adressen für die dazu-
gehörigen Attribute verwendet. Weniger störend sind die 10Bit-Port-
adressen des Industrie-Standards, mit denen die internen Register der
Karte angesprochen werden. A8 und A9 kann man der Karte bei Z80-
Portzugriffen einfach vorgaukeln.

Folgende Tabelle stellt die Ähnlichkeiten und Abweichungen zwischen
Hercules und GenieIIIs-Video-Interface zusammen:

Funktion		Hercules		GenieIIIs
-----------------------------------------------------------------
Text-Speicher		B0000-B0FFF (mit A=0)	3800(3C00)-3FFF
Attribut-Speicher	B0000-B0FFF (mit A=1)	nicht vorhanden
HRG-Seite 0		B0000-B7FFF		8000-FFFF
HRG-Seite 1		B0000-BBFFF		8000-FFFF
CRTC6845-Ports		3B4H/3B5H		F6H/F7H
-----------------------------------------------------------------

Diese Ähnlichkeit ließ mich vor längerer Zeit schon mal darüber brü-
ten, wie man die Hercules anstelle des dort recht lausigen Video-
-Interface in TRS80 und Genie-Rechnern einsetzen könnte. Zunächst
dachte ich an einen Adapter, der mir die nötige Adreßübersetzung macht
und die Verbindung zwischen Genie-CPU-Board und Hercules herstellt.
Dann dachte ich daran, daß sich dieser Aufwand für das ebenfalls recht
lausige Genie-CPU-Board nicht lohnt. Inzwichen ist um diesen reinen
Adapter ein ganzes CPU-Baord gewachsen, das noch einiges mehr bietet
als das Genie-CPU-Board und dabei auf die Maße einer Europa-Karte
geschrumpft ist. Das Board enthält all das, was mir bislang lieb ge-
worden ist:

[1]  H64180-CPU
[2]  2 serielle Schnittstellen
[3]  1MB RAM bestehend aus 8 mal 511000-Megachips
[4]  auf 1MB erweiterte MMU des HD64180
[5]  27128-EPROM mit Level II BASIC und Initialisierungen
[6]  ECB-Bus mit Buspufferung und IM2- und DMA-fähiger Steuerung
[7]  Interface zur Hercules
[8]  komfortables Switching für memory mapped I/O


(hier HerculesGenie02.jpg einfügen
Bank-Switching, Adressdecoder, Hercules-Interface)


Damit steht mir ein voll Genie1-kompatibler (nur Spiele lassen sich
ohne Bauklötzchengrafik nicht so richtig spielen) Computer zur Verfü-
gung. Die Hercules stellt mir dafür den Standard-64x16-Bildchirm,
eine 80-Zeichen-Karte und zwei hochauflösende Grafikseiten mit je
720x348 Punkten zur Verfügung, und das alles für 10,-DM.

Die eigentlichen Kosten fallen bei der Beschaffung der RAMs an. Zuge-
geben - 256K hätten's beim Genie auch getan, aber das Teil-Layout mit
CPU, RAMs, EPROM, RAM-Steuerung und Treibern für die V24-Schnitt-
stellen brauchte ich nur aus der Schublade zu ziehen und beim Rest
habe ich mir dann auch keine große Mühe mehr gemacht. So ist


Der Aufbau der Karte

zu einem richtigen kleinen Abenteuer geworden. Das Layout beschränkt
sich auf einseitge Leiterbahnführung und versucht, dort so viele
Verbindungen unterzubringen, wie irgend möglich. Nur im hinteren Teil
der Karte (der aus der Schublade), war es möglich, alles mit
Drahtbrücken zu erledigen - bis auf das EPROM, das muß auch von Hand
verdrahtet werden, dort sind nur D0-7, +5V und GND angeschlossen. Was
von Hand zu verdrahten ist, kann aus der Verdrahtungsliste ersehen
werden.

Wer nun immer noch glaubt, daß er dieses Projekt durchstehen kann, und
von mir zum Selbstkostenpreis ein geätztes, ungebohrtes Board bekommen
hat, muß zunächst mal 1-2 Stunden mit der Bohrmaschine zubringen. Die
3 Stecker für VG64-Leiste, für die Pfostenfeld-Leiste zum Aufstecken
der Hercules-Karte und die Pfostenfeld-Leiste für die seriellen
Schnittstellen müssen 1mm-Bohrungen erhalten, alle anderen Bohrungen
sind in 0,8mm niederzubringen.

Wenn man sich davon wieder erholt hat, legt man sämtliche Drahtbrücken
(Drahtbrücken- und Bestückunpsplan) und fängt dann erst an, Klein-
teile und IC-Sockel einzulöten.  Da die Drahtbrücken teilweise recht
eng liegen, sollte grundsätzlich dünner Kuper-Lackdraht verwendet
werden. Bei Drahtbrücken, die +5V und GND führen sollen (solche
Brücken enden meistens an etwas breiteren  Leiterbahnen), ist etwas
dickerer isolierter Schaltdraht vorzuziehen.

Es sei noch gesagt, daß im dichter besiedelten vorderen Bereich (beim
Busstecker) in der ersten Reihe ein IC nicht zu bestücken  ist. Weil
der Platz halt da war, habe ich da vorsichthalber mal die Lötaugen
hinterlegt, damit es spätere Bastler bei Erweiterungen einfacher
haben.

Auf der Busplatine oder frei improvisiert auf dem CPU-Board müssen die
CPU-Signale /BUSRQ, /RESET, /WAIT, /MMI und /INT0 mit 10kOhm an +5V
gelegt werden. /INT1 und /INT2 müssen direkt am HD64180 über 10k an
+5V gelegt werden. Wenn diese Eingänge nicht genutzt werden, genügt
ein gemeinsamer Widerstand.

Die 62polige Steckleiste zum Anschluß der Hercules ist für eine spezi-
elle, besonders kleine Karte gedacht, die direkt neben dem für
PC-Karten üblichen Platinenrand-Stecker zwei Reihen Durchkontak-
tierungen aufweist, die freundlicherweise im RM2,54 Rastermaß angelegt
sind und eine Weite von 1 mm haben. Wenn hier von der Bestückungseite
eine zweireihige Buchsenleiste eingelötet wird, und auf dem CPU-Board
die Pfostenfeld-Leiste mit etwa um 1cm verlängerten Beinchen einge-
lötet wird, können beide Karten direkt aufeinander gesteckt werden.

Der Fernseher darf leider nicht der alte vom Genie1 bleiben. Die Her-
cules benötigt einen TTL-Monitor (ohne Gehäuse und Netzteil bekommt
man sowas im Elektronik-Ramsch-Versandhandel für ca.  40,-DM). Ander-
erseits gibt es auch TTL/BAS-Wandler, denen man aber ein aus "Video"
und "Intensity" zusammengeführtes Signal anstelle des reinen Video-
-Signals zuführen sollte, um nicht auf die Helligkeitssteuerung der
Hercules verzichten zu müssen.


(hier HerculesGenie04.jpg einfügen
RAM-Steuerung, ECB-Bus-Steuerung)


Programmierung der Hercules-Karte

Interne Ports (die Portdressen sind die auf die 8Bit-Decodierung
durch das Interface reduzierten Adresen; im PC müssen zusätzlich A8
und A9 high sein)

B4H  Adressregister des CRTC6845
B5H  Datenregister des CRTC6845
B8H  Display-Betriebsart-Steuerkanal
B9H  Display-Status-Kanal
BBH  Light-Pen Flip Flop zurücksetzen
BCH  Drucker-Datenort
BDH  Drucker-Statusport
BEH  Drucker-Steuerkanal
BFH  Konfigurations-Schalter

Für die Programmierung des CRTC6845 ist ein Datenblatt erforderlich.
Durch Trial-and-Error Methoden soll man es schaffen können, den
Monitor dauerhaft zu dissablen. Es sei nur soviel gesagt, daß der CRTC
eine ganze Menge Datenregister besitzt, wovon nur die ersten 16 rele-
vant sind. Sie haben alle die Adresse B5H. Auf welches dieser Register
jeweils über Port B5H zugegrifen werden kann, bestimmt der Eintrag in
das Adressregister B4H. Die Initialisierungsroutine im ROM enthält an
der Adrese 3000H 5 Tabellen mit je 16 Daten für die ersten 16
Datenregister des CRTC und eine Routine, die dem CRTC diese Daten ein-
verleibt. Wenn HL auf den Anfang der jeweiligen Tabelle zeigt. Dort
mag sich der Softi informieren, der lieber noch exotischere Bild-
schirm-Formate einstellen möchte. Die grundsätzliche Bedeutung der
CRTC-Register ist aus mc 1/88 S.113 zu entnehmen.

Der Display-Betriebsart-Steuerkanal (Port B8H) der Hercules reagiert
nur auf die Bits 1, 3, 5 und 7. Die geradzahligen Datenbits haben dort
keine Funktion. Da die Einstellungen dieses Registers für die
Adreßübersetzung des Interface zur Hercules von Bedeutung sind, wurde
dieser Port auf dem CPU-Board  nachgebildet und um die geradzahligen
Bits bereichert. Setzen und Zurücksetzen einzelner Bits dieses Ports
durch Auslesen, Bit verändern und Zurückschreiben ist also nicht
möglich. Man muß dafür im RAM über den Zustand des Ports Buch führen.

In der folgenden Tabelle sind die Funktionen der einzelnen Bits des
erweiterten Ports B8H zusammengestellt. Die urgsprünglichen Funktionen
des Ports auf der Hercules, die nach wie vor gelten, sind mit #
markiert.


Display-Mode-Control-Port, B8H

D0 =0:  1K Video-RAM bei 03C00-03FFF (64x16), Keyboard bei 3800-38FF
   =1:  2K Video-RAM bei 03800-03FFF (80x25), Keyboard disabled
D1 =0:  Text-Video-Mode enabled,  HRG disabled			#
   =1:  HRG enabled, Text-Video disabled			#
D2 =0:  ROM bei 00000-036FF (nur bei /RD, bei /WR RAM)
   =1:  oRM disabled, bei 00000-O36FF liegt RAM
D3 =0:  die Hercules gibt kein Video-Signal an den Monitor	#
   =1:  das Video-Signal der Karte gelangt zum Monitor		#
D4 =0:  Floppy, Drucker u.s.w. bei 037EX memory mapped
   =1:  037EX ist RAM, Floppy u.s.w. über Ports EXH
D5 =0:  D7=1 des Attribut-Bytes bedeutet "heller Hintergrund"	#
   =1:  D7=1 des Attribut-Bytes bedeutet "Blinken"		#
D6 =0:  Text- bzw HRG-RAM sind freigegeben
   =1:  Text- bzw HRG-RAM gesperrt, dort RAM eingblendet
D7 =0:  HRG: Page O selected					#
        Text: 2K Textspeicher eingestellt
   =1:  HRG: Page 1 selected					#
        Text: 2K Attributspeicher eingstellt


(hier HerculesTerminal06.jpg einfügen
Bestückungs- und Drahtbrücken-Plan / Teil-Layout)

Die Einteilung des 1MB-Speichers

Der HD64180 (in der hier verwendeten DIL64-Form) kann nur 512K Spei-
cher adressieren. Um den vollen 1MB-Speicher zu nutzen, muß durch zwei
weitere Bits eines Ports (D0 und D1 von Port F4H) ein Banking von
256-K-Blocks dem Banking der MMU des HD64180 überlagert werden. Die
Selektion  eines der 4 256K-Blocks erfolgt mit A8 des HD64180 und
D0/D1 von Port F4H. Aus diesen 3 Signalen werden die Adressen A18 und
A19 für das RAM hergeleitet.

Port F4H  CPU      RAM     256K-
D1   DO   A18    A19  A18  -Block
----------------------------------
 X    X    0      0    0     0
 0    0    1      0    1     1
 0    1    1      0    1     1
 1    0    1      1    0     2
 1    1    1      1    0     3
----------------------------------

Wenn A18 der CPU low ist, wird immer der unterste 256K-Block ange-
wählt. Wenn A18 high ist, wird einer der 3 anderen Blocks selektiert.
Welcher djeser 3 Blocks selektiert wird, hängt von den Zutänden von
D0 und D1 des Ports F4H ab. Diese Vorgaben gelten sowohl für die MMU
als auch für den DMA-Controller.

Nach einem RESET ist die MMU des HD64180 immer so eingetellt, daß der
logische 64K-Z80-Adreßraum in den unteren 64K des unteren 256K-Blocks
liegt. Um die Standard-Software (Newdos/80, CP/M) zu fahren, braucht
die MMU nicht umrogrammiert zu werden. Die Decodierung von RAM und
memory mapped I/O schließt auch die Adressen A16-A19 mit ein, so daß
diese Baugruppen im Physikalischen Adressraum 00000H-03FFFH liegen. Nur
der HRG-Speicher der Hercules-Karte mit 2mal 32K wäre bei 08000H
eingeblendet etwas lästig und wurde deshalb an das obere Speicherende
bei 0F0000H verbannt. Für die MMU und den DMAC des HD64180 sind dies
die Adressen 70000H-7FFFFH, wobei D0 und D1 von Port F4H gesetzt sein
müssen, damit der HRG-Speicher adressiert wird.

Neben der Grundeinstellung (D7 an Port F4H low, Zustand nach RESET)
gibt es noch eine andere Lage für die memory mapped Baugruppen. Wenn
7=1 an Port F4H ausgegeben wird, liegen ROM, Floppy, Drucker, Tasta-
tur und Text-Video-RAM bei 0C000H-0FFFFH und die untersten 16K sind
RAM.

Und schließlich läßt sich innerhalb dieser 16K (wo auch immer die
memory mapped Baugruppen eingeblendet sind) sehr komfortabel umkonfi-
gurieren, darüber gibt die Tabelle der Bedeutung der Bits des erwei-
terten Ports B8H und die Map der Speipcheraufteilung Auskunft. In allen
Bereichen, wo die jeweilige memory mapped Baugruppe ausgeblendet ist,
liegt dann automatisch RAM vor.


Der Text-Bildwiederholseicher

Die Hercules-Karte stellt im Text-Modus einen 2K großen Bildwiederhol-
speicher für Text und einen 2K großen Attribut-Speicher zur Verfügung.
Diese Speicher sind ineinander verschoben; innerhalb eines linearen
4K-Bereichs stellen die geraden Adressen den Text-Speicher und die un-
geraden Adressen den Attribut-Speicher dar.

Video-Attribute waren aber damals, als der TRS-80 geboren wurde, noch
unbezahlbarer Luxus. Deshalb scheint der Attribut-Speicher der Hercu-
les der Kompatibjlität zum TRS-80 im Wege zu stehen. Der TRS-80
braucht einen zusammenhängenden Bildwiederhol-Speicher von 1K Größe
(und manche jüngeren Brüder können auch mit 2K Textspeicher umgehen).

Dieses unlösbare Problem läßt sich dadurch lösen, daß beim Text-Modus
die Aressen A0-A10 der CPU (2K-Bereich) auf die Adressen A1-A11 der
Hercules-Karte gelegt werden. Diese Umsetzung darf aber nur bei Zu-
griff auf den Text- und den Attribut-Speicher erolgen. Bei HRG-Be-
trieb und bei Zugriff auf die Ports der Karte müssen alle Adressen
direkt durchgeschaltet werden. Die für das Selektieren von Text- oder
Attribut-Speicher zuständige Adresse A0 (zur Hercules) wird im Text-
-Modus von D7 des erweiterten Ports B8H und bei Zugriff auf Hercules-
-Ports und HRG-Speicher von A0 der CPU bedient. Diese Adressteuerung
wird von PAL3 und einem 74LS157-Multiplexer erledigt.

Die damit auf 2K reinen Text-Speicher (und nach Umschalten 2K reinen
Attriut-Speicher) beschränkte Bildschirmseite ist aber für den TRS-
80, der nur 1K bei 3C00H dafür vorsieht, immer noch zu groß. Deshalb
kann mit D0=0 an Port B8H (Einstellung nach der Initialisierung im
ROM) die Freigabe nur der oberen Hälfte des Text-Speichers im Bereich
C000-3FFF vorgegeben werden. Für das TRS-80-Format 64x16 Zeichen muß
dann aber auch der CRTC-6845 entsprechend programmiert werden. Dies
wird ebenfalls durch die Initialisierung im ROM erledigt. Das Betriebs-
system findet dann beim anschließenden Booten eine voll TRS-80-
-kompatible Maschine vor.

Wenn D0=1 an Port B8H ausgegeben wird, ist der volle 2K-Text-Speicher
im Bereich 3800-3FFF verfügbar. Um eine vernünftige Darstellung auf
dem Bildschirm zu haben, muß dann aber auch der CRTC6845 entsprechend
initialisiert werden. Jm 80x25-Modus ist die Tastatur dann aber nicht
mehr zugänglich. Für das Aulesen der Tastatur muß dann immer erst in
den 64x16-Modus zurückgeschaltet werden und nach dem Auslesen der
Tastatur für weitere Bildschirm-Ausgaben wieder der 80x25-Modus ein-
gestellt werden. Wenn dabei die Register des CRTC-6845 in Ruhe gelas-
sen werden und nur mit D0 von Port B8H geschaltet wird, bleibt die
Darstellung auf dem Bildschirm unbeeinträchtigt. Die Umschaltung be-
trifft dann nur die Zugriffmöglichkeiten der CPU auf den Bildwieder-
holspeicher. Das für die Darstellung des Bildpeichers auf dem Moni-
tor verantwortliche Auslesen des 6845 wird dadurch nicht belangt.

Die Initialisierungs-Routine im ROM füllt zunächst den gesamten Attri-
but-Speicher mit dem Standard-Wert 7. Das bedeutet, daß die Zeichen
auf dunklem Hintergrund mit normaler Helligkeit dargestellt werden,
wenn der Attribut-Speicher bei der Textausgabe nicht berücksichtigt
wird.

Es sind allerdings dies die Zeichen entsprechend Big Blue's Ver-
ständnis von ASCII-Code. Die Zeichen mit den Codes 5BH-5FH und 7BH-7FH
sind grundsätzlich die amerikanischen Zeichen (geschweifte und eckige
Klamnern u.s.w.). Den deutschen Umlauten und auch allen anderen nati-
onalen Sonderzeichen sind feste ASCII-Codes mit gesetztem Bit7 zuge-
ordnet. Das hat den Nachteil, daß bei allen von Standard-Programmen
unter MEWDOS und CP/M ausgegebenen Texten anstelle der deutschen Um-
laute die entsprechenden amerikanischen Zeichen erscheinen. Ein Vor-
teil besteht aber auch darin, daß amerikanische Sonderzeichen und
sämtliche nationalen Umlaute gleichzeitig dargestellt werden können.
Für Soft-Freaks besteht hier ein weites Betätigungsfeld in der Anpas-
sung von Tastatur-Treibern und Standard-Programmen.


Die Bildchirm-Attribute

Wenn mit D1=1 und D7=1 an Port B8h die Text-Betriebsart und der Attri-
butspeicher eingeschaltet werden, kann im Adressbereich des Text-Spei-
chers ein Attribut-Byte eingetragen werden, das die Darstellung des
ASCII-Zeichens auf gleicher Adresse im Text-Speicher beeinflußt. Die
Attribut-Bits wirken nur auf das eine Zeichen und nicht auf den gesam-
ten Bildschirm. Wenn mit Attributen gearbeitet werden soll, muß für
jedes Zeichen im Text-Speicher auch ein Byte im Attribut-Speicher ein-
getragen werden. Beim Scrollen muß auch der Attribut-Speicher genauo
wie der Text-Speicher verschoben werden.

Die Bits 3 und 7 eines Attribut-Bytes haben eigenständige Funktionen,
während die Bits 0-2 und die Bits 4-6 in Kombination miteinander zu
benutzen sind:

D7:	die Wirkung von D7 eines Attribut-Bytes hängt davon ab,
	welcher Wert für D5 an Port B8H ausgegeben wurde.
    Port B8H, D5=0:
	D7(Attribut) =0:  Zeichen erscheint auf dunklem Hintergrund
		     =1:  Zeichen erscheint vor halbhellem Hintergrund
    Port B8H, D5=1:
	D7(Attribut) =0:  kein blinkendes Zeichen
		     =1:  Zeichen wird blinkend dargestellt
		 D3  =0:  normale Helligkeit der Darstellung
	   	     =1:  Highlighting

D0-D2, D4-D6  
  D6 D5 D4 D2 D1 D0   Bedeutung
  ----------------------------------------------
  0  0  0  0  0  0    Zeichen nicht dargestellt
  0  0  0  0  0  1    unterstrichen dargestellt
  0  0  0  1  1  1    normale Darstellung
  1  1  1  0  0  0    invere Darstellung
  ----------------------------------------------

Die HRG der Hercules-Karte

Mit 720x348 Punkten Auflösung und 2 Seiten läßt sich schon sehr schöne
Grafik auf die Mattscheibe bringen. Diese Auflösung benötigt natürlich
auch Speicherraum für die beiden 32K-Pages. Diese Bereiche analog zum
GenieIIIs einfach in den logischen Adreßraum der nach RESET eingestellten
(unteren physikalischen) 64K zu legen, erscheint etwas unzweckmäig zu
sein. Es müßte dann eine Hälfte des ohnehin nur 64K großen, direkt
erreichbaren Arbeitspeichers ausgeschaltet werden. Für Grafik-Anwendungen
müßte man sich festlegen, in welcher Häfte der 64K die Grafikroutinen
laufen sollen.

Hier ist der HRG-Speicher ans obere Ende des physikalischen 1MB-Spei-
chers verbannt worden. Das Besudeln des Grafik-Seichers erfolgt im
einfachsten Fall durch blockweise Übertragung per DMA. Wer aber trotz-
dem gerne dirrekt in das HRG-RAM schreiben möchte, kann sich dieses 
durch die in die untere oder obere Hälfte seines 64K-Arbeits-
speichers einblenden.

Mach einem RESET ist die Text-Betriebsart eingstellt. Mit D1=1 an
Port B8H läßt sich auf die HRG-Betriebsart "Half-Mode" umstellen, wenn
in Port BFH D0=1 eingetragen ist. Dabei ist die untere Hälfte (Page 0)
erreichbar. Um auch die Page 1 erreichen zu können, muß auch D1=1 an
Port BFH ausgegeben werden.

Während der Grafik-Betriebsart ist der Text-Bildspeicher nicht zugäng-
lich. Da dieser aber physikalicher Bestandteil der Page 0 der HRG
ist, wird der Inhalt des Textspeichers bei Grafikausgaben an Page 0
überschrieben. Gleiches gilt für den Attribut-Seicher.


Die Tastatur

Dieses Gerät erleidet hier die größten Einbußen in der Präsenz. So ist
der Bereich, in dem die Tastatur ausgelesen werden kann, auf den dafür
nötigen Platz von 256 Adressen bechränkt. In der 64x16-Text-Betriebs-
art (D0=0 an Port B8H, die einzige Einstellung, in der die Tastatur
erreichbar ist) stehen bei 3900H-3BFFH ein paar Byte frei verfügbaren
Speichers bereit. Auch der Speicher para1lel zur Tastatur kann bei
eingeblendeter Tastatur beschrieben werden; Auslesen läßt er sich
nur, wenn auf Grafik-Betriebsart umgestellt wird.

Beim Arbeiten im 80x25-Textmodus ist die Tastatur nicht erreichbar.
Dann liegt ab 3800H Bildwiederhol-Speicher vor. Um die Tastatur
zwichendurch auszulesen, muß mit D0=0 an Port B8H vorübergehend auf
1K Video-RAM umgeschaltet werden. Da das aber nicht den Zugriff des
CRTC6845 auf den Bildspeicher beeinflußt, zeigt sich das Umschalten
nicht in der Darstellung auf dem Bildschirm.                      

Wenn es auch Wahnsinn ist, eine Tastatur memory-mapped als offene
Matrix an einen Computer anzuschließen, weil bei höheren Taktraten und
längeren Anschlußleitungen Probleme zu erwarten sind, kommt man bei
einem TRS-80-kompatiblen Rechner um diesen Unsinn nicht herum, wenn
auch der Betrieb von OLDDOS/80 und der darunter laufenden Prograrnme
möglich sein soll.

Ein einfaches Interface (Abb.7) kann auf einem Stück Lochraster-
platine in Fädeltechnik aufgebaut werden und mit einer VG64-
Steckerleiste an den ECB-Bus gesteckt werden. Die Tastatur kann
daran über ein nicht zu langes, 16poliges Kabel angeschlossen werden.


Die Freigabe des ROMs

Wie es sich für einen Trash-80-komatiblen Computer gehört, liegen
nach dem Einchalt-RESET die 12K Löffel-II-BASIC bei 0000H-2FFFH im
ROM rum. Zusätzlich wurde hier auch der Bereich 3000H-36FFH als ROM
decodiert. Hier sind die nötigen Initialisierungen der HD64180-CPU und
der Hercules-Karte untergebracht. Der Einsprung bei 3050H muß im
Level-II-ROM anstelle des ersten Sprungbefehls nach RST 00H gepatcht
werden. Die Initialisierung endet mit einem Sprung an das dort vorher
vorhandene Sprungziel 0674H.

Wenn D7 an Port F4H high ausgegeben wird, verschiebt sich die Lage des
ROM-Inhalt von 0000-36FF nach C000-F6FF. Das ist zwar wenig sinnvoll/
weil der Stoff auf dieser Adresslage nicht läuft, ließ sich aber wegen
des für CP/M nötigen Verschiebens des memory mapped I/O nach F7E0-FFFF
nicht verhindern. Wenn das ROM aber ausgeschaltet wird (D2 an Port B8H
high), stört es dort nicht mehr.

Das Abchalten des ROMs über D2 an Port B8H läßt sich natürlich auch
in der ursrünglichen Lage bei 00000H durchführen. Da das ROM ohnehin
nur beim Lesen freigegeben wird und beim Schreiben RAM eingeblendet
ist (auch wenn das ROM nicht abgeschaltet ist) kann das Kopieren des
ROM-Inhaltes in das RAM durch ein einfaches LDIR auf sich selbst (HL =
DE = 0) erfolgen. Das wird in der Initialisierung vorsichtshalber auch
schon mal gemacht.


Floppy, Drucker und der ganze Rest

Damit die Abwärtskompatibilität zum TRS-80 beibehalten wird, liegen
diese Komponenten memory mapped bei 37EXH. Allerdings wurde die Option
eingebaut, anstelle dieser Memory-Adressen auch de entprechenden
Ports EOH-EFH für das Ansprechen dieser Einheiten benutzen zu können.
Dafür wird mit D4=1 an Port B8H auf Betrieb über Ports umgeschaltet.

Wer von seinem alten Genie oder TRS80 her noch einen RB-EXP1 Control-
ler besitzt, hat damit ein weiterhin brauchbares Gerät vorliegen.
Diesem Board muß nur noch ein VG64-Stecker spendiert werden. Dieser
Stecker wird auf einen 2cm breiten Strefen Lochraster-Platine gelö-
tet, der wiederum mit zwei schmalen Streifen Pertinax oder Sonstigem
Kunststoff mit dem RB-EXP1 verschraubt wird (Abb.6). Auf der Lötseite
werden dann die ECB-Signale des Steckers mit den entsprechenden
Punkten der beiden Anschlußstecker des EXP1 verbunden.


(hier HerculesGenieEXP1.jpg rechts neben der Tabelle einfügen
ECB-Bus-Anschluß der RB-EXP1)


Anschluß des RB-EXP1 Controllers an den ECB-Bus

ECB-Bus   Signal  RB-EXP1
  Pin
---------------------------------------
  2c        D0     Pin 9    24poliger
 14c        D1     Pin 10   Stecker
  4c        D2     Pin 11
  4a        D3     Pin 13
  5a        D4     P3n 14
  2a        D5     pin 15
  3a        D6     Pin 16
  3c        D7     Pin 17
  5c        A0     Pin 8
  7c        A1     Pin 7
  6a        A2     Pin 6
  6c        A3     Pin 5                   
  1a        +5V    Pin 24
 32a        GND    Pin 12
---------------------------------------
 13a        +12V   Pin 11   16poliger
 15a        -5V     Pin 1   Stecker 
 21c        /INT    Pin 4
 31c       /RESET   Pin 5 
---------------------------------------
z.B. 23a   /FLO   Pins 2,14   74LS155

Da das Freigabe-Signal für den Controller bereits auf dem CPU-Board er-
zeugt wird und auch schon die Umschaltmöglichkeiten beinhaltet, sollte
lieber dieses Signal verwendet werden als das auf dem EXP1 hergelei-
tete Signal /37EX. Dafür wird das Signal /FLO von PAL1 auf dem CPU-
-Board über eine nicht benutzte ECB-Leitung an den Controller geführt
und dort an die Pins 2 und 14 des 74LS155 gelegt. Die beiden 74LS30
beim 16poligen Stecker, die vorher das Signal /37EX und die Drucker-
-Freigabe über Port FDH geliefert haben, können enternt werden. Die
Verwendung des Signals /FLO erübrigt auch die Zuführung der Signale,
die in obiger Tabelle nicht angeführt sind und bei Verwendung des EXP1
im Genie oder TR-S80 zusätzlich angeschlossen werden mußten.


RAM-Speicher satt

Grundsätzlich besteht der gesamte physikalische Adreßraum von 1MB aus
RAM-Speicher. Nur dort, wo irgendwelche memory mapped I/O-Baugruppen
eingeblendet werden, ist der RAM-Speicher nicht erreichbar. Durch Ab-
schalten der mm I/O-Baugruppen wird dort dann automatisch der ent-
sprechende RAM-Bereich eingeblendet.

Im Bereich des ROMs (00000-003FF) und der Tastatur (03800-038FF), wenn
diese im 64x16-Textmodus erreichbar ist, kann der RAM-Speicher auch
beschrieben werden, ohne daß ROM bzw. Tastatur ausgeschaltet werden
müssen. Nur zum Lesen dieser RAM-Bereiche müssen diese Einheiten
ausgeblendet werden.



(hier HerculesGenieMemoryMap.jpg einfügen
Memory Map)


Ein entscheidender Nachteil des Industrie-Standards sei zum Schluß
noch erwähnt. Um das vom Genie her bekannte Flickern bei Ausgaben auf
den Bildschirm zu verhindern, lassen modernere Hercules-Karten einen
Zugriff auf das Video-RAM nur zu, wenn der Elektronenstrahl vom
rechten zum linken Bildrand zurückläuft und dabei dunkel gesteuert
ist. Die CPU wird während der Zeit des Strahlrücklaufs mit einem
Wait (/IO_CH_RDY, Pin A10 des PC-Slots) ruhiggehalten. Offensichtlich
ist das Wait-Timing bei HD64180 anders als beim 80286 im PC-AT, denn
die Hercules macht im Genie nur bis 5MHz Systemtakt mit; bei höheren
Takten erscheint nur noch Müll auf dem Fernseher.

Es gibt aber auch Hercules-Karten, die sich wie ein normales Genie-
-Video-Interface ohne Rücksicht auf Flickern beschreiben lassen,
Eventuell läßt sich damit dann der für das CPU-Board als machbar zu
erwartende Takt von 9,216 MHz fahren. Wahrscheinlich muß dann aber ein
Wait aus dem Freigabesignal /HA18 für die Speicher der Hercules-Karte
erzeugt werden, das den Zugriff der CPU um 1 oder 2 Takte verlängert.
Da ich eine solche Karte aber nicht habe, will ich darüber auch nicht
weiter nachdenken.

Das System verfügt noch nicht über eine Reset-Schaltung. Diese kann im
einfachsten Fall durch Kurzschließen von /RESET (ECB-Bus, 31c) mit
GND über einem Taster bereitgestellt werden. Da aber während der Zeit,
in der der Taster gedrückt ist, kein Refresh der dynamischen RAMs
erolgt, gehen bei einem Reset Daten verloren. Eine einfache Schaltung
mit einem 555-Timer und einem Taster erzeugt sowohl beim Einschalten
als auch beim Betätigen des Tasters ein getimtes /RESET-Signal, das
ein längeres Ausbleiben des Refresh verhindert (Abb.5).



(hier HerculesGenieReset.jp6 einfügen)


Freie Verdrahtung auf der Lötseite

Signal  IC,Typ,Pin --- IC,Typ,Pin  ...
D0	18,273,8	10,27128,11
D1	18,273,7	10,27128,12
D2	18,273,4	10,27128,13;  PC-Slot,A7
D3	18,273,13	10,27128,15
D4	18,273,8	10,27128,16;  PC-Slot,A5
D5	18,273,14	10,27128,17
D6	18,273,17	10,27128,18
D7	18,273,18	10,27128,19
D0	17,64180,34	30,125,5
D1	17,64180,35	30,125,2
D2	17,64180,36	38,245,4
D3	17,64180,37	38,245,5
D4	17,64180,38	38,245,3
D5	17,64180,39	38,245,9
D6	17,64180,40	30,125,11
D7	17,64180,41	31,174,13	
/HALT	17,64180,56	VG64-Leiste,25c
/REF	17,64180,57	VG64-Leiste,28a
/IOE	1,PAL1,1	17,64180,58;  19,32,10;  PC-Slot,A10;  33,245,7;
	37,PAL2,13
/ME	16,32,4		17,64180,59;  19,32,13;  33,245,2;  37,PAL2,14
/LIR	17,64180,61	37,PAL2,23
/WR	17,64180,62	19,32,12;  33,245,9;  37,PAL2,3
/RD	1,PAL1,2	17,64180,63;  19,32,1;  33,245,8;  37,PAL2,1
CLK	17,64180,64	VG64-Leiste,29c
/WAIT	17,64180,4	VG64-Leiste,10,a;  PC-Slot,A10
/BUSAK	17,64180,5	37,PAL2,2
/BUSRQ	17,64180,6	VG64-Leiste,11a
/RESET	18,273,1	17,64180,7;  15,04,5;  31,174,1;  VG64-Leiste,31c
/NMI	17,64180,8	VG64-Leiste,20c
/INT0	17,64180,9	VG64-Leiste,21c
/ST	17,64180,12	35,245,2
A0	17,64180,13	10,27128,10;  25,PAL3,7;  32,157,2;  38,245,2
A1	17,64180,14	10,27128,9;  32,157,14/3;  36,245,6
A2	17,64180,15	10,27128,8;  32,157,13/5;  36,245,3
A3	17,64180,16	10,27128,7;  32,157,11/6;  36,245,4
A4	17,64180,17	10,27128,6;  25,PAL3,16;  32,157,10;  35,245,5
A5	17,64180,18	10,27128,5;  25,PAL3,6;  36,245,7
A6	17,64180,19	10,27128,4;  25,PAL3,5;  36,245,8
A7	17,64180,20	10,27128,3;  25,PAL3,4;  36,245,9
A8	1,PAL1,6	10,27,128,24;  17,64180,21;  25,PAL3,3;  35,245,3
A9	1,PAL1,5	10,27,128,25;  17,64180,22;  25,PAL3,2;  35,345,4
A10	1,PAL1,4	10,27,128,21;  17,64180,23;  25,PAL3,1;  35,345,5
A11	1,PAL1,3	10,27,128,23;  17,64180,24;  35,345,7
A12	17,64180,25;  10,27128,2;  20,86,5;  28,30,12;  33,245,5
A13	17,64180,26;  10,27128,27;  20,86,9;  20,30,11;  33,245,6
A14	17,64180,27;  20,86,2;  35,245,6
A15	17,64180,28;  20,86,12;  33,245,3
A15	17,64180,29;  12,157,5;  27,02,11;  35,245,4
A17	17,64180,30;  12,157,11;  27,02,12;  35,245,8
A18	17,64180,31;  24,00,5;  21,08,13/2; 35,245,9
A18'	21,08,4;  11,157,14
A19'	21,08,5;  11,157,2
B81	18,273,6;  25,PAL3,9;  29,125,4;  16,32,5;  15,04,9
/B81	18,273,16;  25,PAL3,11
Q0	30,125,5;  16,32,10
Q1	30,125,2;  21,08,12
X	16,32,8;  21,08,1
Y	24,00,6;  15,32,9
/M016	26,20,8;  1,PAL1,14
/M1216	28,30,8;  1,PAL1,22
MFxxxx	26,20,6;  1,PAL1,18
/OUTB8	37,PAL2,19;  9,273,11
/OUTF4	37,PAL2,18;  31,174,9
/INF4	37,PAL2,17;  30,125,10
/ADR	37,PAL2,15;  1,PAL1,17
/ROM	1,PAL1,20;  10,27128,20;  10,27128,22
/FLO	1,PAL1,16;  37,PAL2,19;  VG64-Leiste,z.B.23c
/KB	1,PAL1,19;  37,PAL2,20;  VG64-Leiste,z.B.23a
/RAM	1,PAL1,22;  16,32,1
/HA18	1,PAL1,21;  PC-Slot,A13
HA15	20,86,11;  PC-Slot,A16
HA14	20,86,3;  PC-Slot,A17
HA11	29,125,6;  PC-Slot,A20
RESET	15,04,6;  PC-Slot,B2
SEL	16,32,6;  32,157,1
+5V	22,1489,14; 20,86,14;  17,64180,32;  10,27128,28;  4,RAM,9
+5V	1,PAL1,24;  2,RAM,9
+5V	25,PAL3,20;  PC-Slot,A12/A14/A15/B29
GND	10,27128,14;  20,86,7;  26,20,7
GND	17,64180,33;10,04,7;  V24-Stecker,9/10
+12V	23,1488,14;  VG64-Leiste,13a
-12V	23,1488,1;  VG64-Leiste,14a


(hier HerculesGenie16 einfügen)


;Initialisierung der Hercules-Karte und der HD64180-CPU
;im Sonder-ROM-Bereich ab 3000H
;
;Diese Routinen werden aus dem ROM heraus angesprungen
;und übergeben zum Schluß wieder an die TRS-80 Boot-
;Routine. Dafür muß das ROM ab 0000H folgendermaßen
;geändert werden:
;vorher				nachher
0000	DI			0000	DI
0001	XOR	A		0001    XOR	A
0002	JP	0674h		0002	JP	3050h
;
;Die Initialisierung schließt mit JP  0674H ab.

attrib	EQU	07h     	;D7= nicht blinkend bzw
				;normaler Hintergrund
				;D6-D4=0, D2-D0=1
				;normale Darstellung
mode	EQU	0		;D7=0   HRG-Page 0
				;D5=1   Blinken erlaubt
				;D3=1   Video-Signal aktiv
				;D0=0   Text-Betribsart
config	EQU	3		;D0=1   HRG erlaubt
				;D1=1   HRG-Page 2 enabled
;
;
	Org	3000h		;Anfang Sonder-ROM
;
;Initialisierungdaten für den CRTC6845
;64*16-TRS80-Standard-Einstellung
tab	DEFB	6eh,40h,50h,0ah,14h,06h,10h,12h
	DEFB	02h,0eh,29h,09h,04h,00h,00h,00h
;80*25-Modus
	DEFB	6eh,50h,58h,0ch,1fh,02h,19h,1bh
	DEFB	02h,09h,29h,09h,00h,00h,00h,00h
;64*24-Modus
	DEFB    6eh,40h,50h,0ah,1bh,09h,18h,19h
	DEFB    02h,0ah,29h,09h,02h,00h,00h,00h
;64*32 interlaced
	DEFB	6eh,40h,50h,0ah,13h,02h,10h,11h
	DEFB	03h,0fh,2fh,0fh,00h,00h,00h,00h
;92*22-Modus
	DEFB	70h,5ch,61h,08h,1dh,08h,16h,19h
	DEFB	02h,0bh,29h,09h,00h,00h,00h,00h
;
	LD	SP,8000
	LD	A,1
	OUT	(0f4h),a	;obere 256K einstellen
	LD	A,81h		;Attribut-Speicher mit
	OUT	(0b8h),A	;Standard-Wert füllen
	LD	HL,3800h	;Video-RAM ab 3800h
	LD	A,attrib
	LD	(HL),A
	LD	DE,3001h
	LD	BC,07ffh	;2K Speicher
	PUSH	HL
	PUSH	DE
	PUSH	BC
	LDIR
	POP	BC
	POP	DE
	POP	HL
	LD	A,1		;Umschalten auf Text
	OUT	(0b8h),A	;-Seicher
	LD	A,' '		;mit Blanks füllen
	LD	(HL),A
	LDIR
	LD	HL,0		;ROM-nhalt ins RAM
	LD	DE,0		;kopieren
	LD	BC,3700h
	LDID
;
;HD64180 initialisieren
	LD	A,10h		;WAITs: Memory 0,  I/O 2 
	DB	0edh,39h,32h    ;OUT=  (DCNTL),A
	LD	A,83h		;Refresh-Control
	DB	0edh,39h,36h	;optimieren
	LD	A,44h		;Common 0-32K, Bank 32-64K
	DB	0edh,39h,3ah	;einstellen
	XOR	A		;Common als Bank benutzen
	DB	0edh,39h,3ah    ;Bank bei 08000-0FFFF
;
;CRTC6845 für 64*16 Zeichen initialisieren
	LD	HL,tab		;HL => CRTC-Parameter
	CALL	setcrtc		;raus an CRTC
;
;Video-Signal einschalten
	LD	A,08h		;Video-Siynal aktiv
	OUT	(0b8h),A	;Video bei 3c00-3fff
				;Text-Modus eingesch.
				;Blinken gesperrt
	JP	0674h		;und weiter im TRS80-
				;Boot-Gebaren

CRTC-6845  initialisieren	;(HL => Parameterliste)
setcrtc	XOR	A		;für Video-Mode-Umschal-
	OUT	(0bfh),A	;tung nötig
	LD	B,16 		;16 Bytes ausgeben
	LD	C,0b5h		;CRTC-Daten-Port
	XOR	A		;CRTC-Register-Nr ab 0
crtclp	OUT	(0b4h),A	;1. Regsiter
	INC	A		;A => nächstes Register
	OUTI			;raus das Zeugs
	JR	NZ,crtclp
	LA	A,config       ;HG voll freigeben
	OUT     (0bfh),A
	RET
	END


Assembler-Listing für PAL1
PAL20L8
Helmut Bernhardt         22.01.89
Erzeugen der mm Freigabesignale
ioe rd a10 a11 a9 a8 nc b80 b81 b82 b84 gnd
b86 m016 nc flo adr mfxxxx kb rom ha18 ram m1216 vcc

/ha18 = /b86 */b81 */b80 */m1216 *a11 *a10
      + /b86 */b81 * b80 */m1216 *a11
      + /b86 * b81 */mfxxxx

/kb   = /b86 */b80 */rd */m1216 *a11 */a10 */a9 */a8

/flo  = /b84 */m1216 */a11 *a10 *a9 *a8 */adr
      +  b84 */ioe */adr

/rom  = /b82 */m016 *m1216 */rd
      + /b82 */m1216 */a11 */a10 */rd
      + /b82 */m1216 */a11 * a10 *a9 */rd
      + /b82 */m1216 */a11 * a10 *a9 */a8 */rd

/ram  = ioe *ha18 *kb *flo *rom


Assembler-Listing für PAL2
PAL20L8
Helmut Bernhardt        24.01.89
I/O-Decoder und Datentreiber-Steuerung
rd busak wr a0 a2 a3 a4 a1 a5 a6 a7 gnd
ioe me adr herc inf4 outf4 outb8 flo kb rein lir vcc

/inf4  = /ioe /rd *a7 *a6 *a5 *a4 */a3 *a2 */a1 */a0

/outf4 = /ioe */wr *a7 *a6 *a5 *a4 */a3 *a2 */a1 */a0

/outb8 = /ioe */wr *a7 */a6 *a5 *a4 *a3 */a2 */a1 */a0

/adr   = a7 *a6 *a5 */a4

/herc  = /ioe *a7 */a6 *a5 *a4

/rein  = busak */ioe */lir
       + /ioe */rd *inf4 *herc
       + /busak *rd
       + /flo */rd
       + /kb */rd


Assembler-Listing für PAL3
PAL16L8
Helmut Bernhardt	23.01.89
Adreßübersetzung für die Hercules-Karte
a10 a9 a8 a7 a6 a5 a0 me b81 gnd
b87 ha0 ha5 ha6ha7 a4 ha8 ha9 ha10 vcc

/ha0  = /me * /b81 * /87
      + /me *  b81 * /a0
      * /me * /a0

/ha5  = /me * /b81 * /a4
      + /me *  b81 * /a5
      +  me * /a5

/ha6  = /me * /b81 * /a5
      + /me *  b81 * /a6
      +  me *  a6

/ha7  = /me * /b81 * /a6
      + /me *  b81 * /a7
      +  me * /a7

/ha8  = /me * /b81 * /a7
      + /me *  b81 * /a8

/ha10 = /me * /b81 * /a9
      + /me *  b81 * /a10


Pinbelegung des V24-Steckers CN2

Signal	Pin	Pin	Signal
------------------------------
/CTS1	1	 2	TXS1
/RTS0	3	 4	RXA0
/CTS0	5	 6	RXA1
TXA0	7	 8	TXA1
GND	9	10	GND

