1989-Club80-10 Nr.28 S.78-99 ## 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ätzlich 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 Hercules Text- und Attribut-Seicher ineinander verschoben sind. Dort werden innerhalb eines lineren 4K-Bereichs alle geradzahligen Adressen für Textzeichen und alle ungeradzahligen Adressen für die dazugehörigen Attribute verwendet. Weniger störend sind die 10Bit-Portadressen 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 geworden 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 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. Zugegeben - 256K hätten's beim Genie auch getan, aber das Teil-Layout mit CPU, RAMs, EPROM, RAM-Steuerung und Treibern für die V24-Schnittstellen 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, Kleinteile und IC-Sockel einzulöten. Da die Drahtbrücken teilweise recht eng liegen, sollte grundsätzlich dünner Kupfer-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 10k-Ohm 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 spezielle, besonders kleine Karte gedacht, die direkt neben dem für PC-Karten üblichen Platinenrand-Stecker zwei Reihen Durchkontaktierungen 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 eingelötet wird, können beide Karten direkt aufeinander gesteckt werden. Der Fernseher darf leider nicht der alte vom Genie1 bleiben. Die Hercules benötigt einen TTL-Monitor (ohne Gehäuse und Netzteil bekommt man sowas im Elektronik-Ramsch-Versandhandel für ca. 40,-DM). Andererseits 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. RAM-Steuerung, ECB-Bus-Steuerung Programmierung der Hercules-Karte Interne Ports (die Portdressen sind die auf die 8Bit-Decodierung durch das Interface reduzierten Adressen; 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 disablen. Es sei nur soviel gesagt, daß der CRTC eine ganze Menge Datenregister besitzt, wovon nur die ersten 16 relevant sind. Sie haben alle die Adresse B5H. Auf welches dieser Register jeweils über Port B5H zugegriffen werden kann, bestimmt der Eintrag in das Adressregister B4H. Die Initialisierungsroutine im ROM enthält an der Adresse 3000H 5 Tabellen mit je 16 Daten für die ersten 16 Datenregister des CRTC und eine Routine, die dem CRTC diese Daten einverleibt. Wenn HL auf den Anfang der jeweiligen Tabelle zeigt. Dort mag sich der Softi informieren, der lieber noch exotischere Bildschirm-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: | ROM disabled, bei 00000-036FF 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 0 selected | #
|  | Text: 2K Textspeicher eingestellt |
| =1: | HRG: Page 1 selected | #
|  | Text: 2K Attributspeicher eingstellt |
Bestückungs- und Drahtbrücken-Plan Teil-Layout (von der Bestückungsseite gesehen) Die Einteilung des 1MB-Speichers Der HD64180 (in der hier verwendeten DIL64-Form) kann nur 512K Speicher 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 angewählt. Wenn A18 high ist, wird einer der 3 anderen Blocks selektiert. Welcher djeser 3 Blocks selektiert wird, hängt von den Zustä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 umprogrammiert 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 D7=1 an Port F4H ausgegeben wird, liegen ROM, Floppy, Drucker, Tastatur 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 umkonfigurieren, darüber gibt die Tabelle der Bedeutung der Bits des erweiterten 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-Bildwiederholspeicher Die Hercules-Karte stellt im Text-Modus einen 2K großen Bildwiederholspeicher 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 ungeraden 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 Hercules der Kompatibilitä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 Adressen A0-A10 der CPU (2K-Bereich) auf die Adressen A1-A11 der Hercules-Karte gelegt werden. Diese Umsetzung darf aber nur bei Zugriff auf den Text- und den Attribut-Speicher erfolgen. Bei HRG-Betrieb 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 Betriebssystem 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 eingestellt werden. Wenn dabei die Register des CRTC-6845 in Ruhe gelassen werden und nur mit D0 von Port B8H geschaltet wird, bleibt die Darstellung auf dem Bildschirm unbeeinträchtigt. Die Umschaltung betrifft dann nur die Zugriffmöglichkeiten der CPU auf den Bildwiederholspeicher. Das für die Darstellung des Bildpeichers auf dem Monitor verantwortliche Auslesen des 6845 wird dadurch nicht belangt. Die Initialisierungs-Routine im ROM füllt zunächst den gesamten Attribut-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 Verständnis von ASCII-Code. Die Zeichen mit den Codes 5BH-5FH und 7BH-7FH sind grundsätzlich die amerikanischen Zeichen (geschweifte und eckige Klammern u.s.w.). Den deutschen Umlauten und auch allen anderen nationalen Sonderzeichen sind feste ASCII-Codes mit gesetztem Bit7 zugeordnet. Das hat den Nachteil, daß bei allen von Standard-Programmen unter MEWDOS und CP/M ausgegebenen Texten anstelle der deutschen Umlaute die entsprechenden amerikanischen Zeichen erscheinen. Ein Vorteil 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 Anpassung von Tastatur-Treibern und Standard-Programmen. Die Bildchirm-Attribute Wenn mit D1=1 und D7=1 an Port B8h die Text-Betriebsart und der Attributspeicher eingeschaltet werden, kann im Adressbereich des Text-Speichers 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 gesamten Bildschirm. Wenn mit Attributen gearbeitet werden soll, muß für jedes Zeichen im Text-Speicher auch ein Byte im Attribut-Speicher eingetragen werden. Beim Scrollen muß auch der Attribut-Speicher genauo wie der Text-Speicher verschoben werden.
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älfte der 64K die Grafikroutinen laufen sollen. Hier ist der HRG-Speicher ans obere Ende des physikalischen 1MB-Speichers verbannt worden. Das Besudeln des Grafik-Seichers erfolgt im einfachsten Fall durch blockweise Übertragung per DMA. Wer aber trotzdem gerne direkt in das HRG-RAM schreiben möchte, kann sich dieses durch die in die untere oder obere Hälfte seines 64K-Arbeitsspeichers einblenden. Nach 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änglich. 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-Speicher. 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-Betriebsart (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 parallel 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 Programme möglich sein soll. Ein einfaches Interface (Abb.7) kann auf einem Stück Lochrasterplatine 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-kompatiblen Computer gehört, liegen nach dem Einschalt-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 Abschalten 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 die entprechenden Ports E0H-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 Controller 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 Streifen 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.
Anschluß des RB-EXP1 Controllers an den ECB-Bus
ECB-Bus Pin | Signal | RB-EXP1
2c | D0 | Pin 9 | 24poliger
14c | D1 | Pin 10 | Stecker
4c | D2 | Pin 11 |
4a | D3 | Pin 13 |
5a | D4 | Pin 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 erzeugt wird und auch schon die Umschaltmöglichkeiten beinhaltet, sollte lieber dieses Signal verwendet werden als das auf dem EXP1 hergeleitete 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 Abschalten der mm I/O-Baugruppen wird dort dann automatisch der entsprechende RAM-Bereich eingeblendet. Im Bereich des ROMs (00000-002FF) 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. 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 einen Taster bereitgestellt werden. Da aber während der Zeit, in der der Taster gedrückt ist, kein Refresh der dynamischen RAMs erfolgt, 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). 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 A16 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 ;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=1 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-Betriebsart
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 | ;-Speicher
| LD | A,' ' | ;mit Blanks füllen
| LD | (HL),A
| LDIR
| LD | HL,0 | ;ROM-Inhalt 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-Signal aktiv
| OUT | (0b8h),A | ;Video bei 3C00-3fff
|  |  | ;Text-Modus eingesch.
|  |  | ;Blinken gesperrt
| JP | 0674h | ;und weiter im TRS80-
|  |  | ;Boot-Gebaren
;
;CRTC-6845 initialisieren
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 |
| LD | A,config | ;HRG 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