Dein GIIs - die 4 unbekannten Wesen

A: Hardware-Erweiterung für 1 MB RAM

Die 128 Refreshzyklen des Z80 lassen sich auf 256 Zyklen erweitern,
was die Verwendung von 41256-RAMs ermöglicht (Abb. 3). Dadurch kann jeder
Z80-Computer auf mindestens das vierfache Speichervolumen aufgebohrt
werden, indem man die vorhandenen 4164-RAMs durch 41256-Typen ersetzt.
Die beiden zusätzlich nötigen Adressen kann ein I/O-adressiertes Latch
liefern (Abb. 1). Damit kann man zwischen vier Blocks mit je 64 kB um-
schalten.

Dabei würden dann aber der Stack, Interrupt-Serviceroutinen und al-
les an Software abgekniffen werden, was für eine einwandfreie Funktion
nötig ist. Der Z80 würde sich in der neuen Bank, wo noch kein Programm
enthalten ist, verlaufen. Deshalb muß ein Teilbereich des Speichers auch
beim Umschalten der Bank erhalten bleiben, wo der Z80 alles Lebenswich-
tige vorfindet.

Im Genie III s ist das mit vier Banks in Form von vier Reihen 4164-
RAMs so gelöst, daß mit dem Zustand von Bit 0 des Ports F9h festgelegt
wird, ob der Adreßbereich 0000h-3FFFh oder der Bereich E000h-FFFFh nicht
mit umgeschaltet wird (Common-Bereich):

Port F9h, Bit 0:
	0: Common = 0000h-3FFFh
	1: Common = E000h-FFFFh

Die Auswahl unter den vier Banks geschieht mit den Bits 6 und 7 desselben
Ports:
Port F9h, Bits 6, 7:
	00: Bank 0
	01: Bank 1
	10: Bank 2
	11: Bank 3

Unabhängig von der eingeschalteten Bank wird bei Zugriff auf den als
Common definierten Bereich immer auf den RAM-Block 0 zurückgeschaltet.
Das wird durch entsprechende Steuerung der CAS*-Freigabesignale für die
vier RAM-Reihen erreicht (Abb. 4).

Zur Vorgabe der Adressen A16 und A17 für 41256-RAMs anstelle der
ursprünglichen 4164-RAMs wurde ein unter der Portadresse F3h decodiertes
Latch 74LS273 herangezogen, dessen Ausgänge Q0 und Q1 diese Adressen
liefern. Damit läßt sich innerhalb eines 256-kB-Blocks (8 Stück 41256-
RAMs) vorgeben, welches Viertel der RAM-Bausteine ansprechbar sein soll.
Die RAM-Reihe selbst wird weiterhin über Port F9h, Bits 6 und 7 selek-
tiert. Das Zusammenspiel beider Ports bei der Adressierung jeweils eines
Blocks zu 64 kB veranschaulicht die Abb. 6.

Das Umschalten auf die RAM-Reihe 0 beim Zugriff auf den als Common
definierten Adreßbereich (Port F9h, Bit 0) leistet eine entsprechende
Schaltung im GIIIs. Die Common-Bedingung wird auf Wunsch (s. u.) auch bei
der Umschaltung innerhalb der Viertel der 41256-Chips beachtet: Die Se-
lektion des unteren Viertels einer Reihe 41256-RAMs wird Uber die Steue-
rung des Pins 1 (Select) des 74LS157-Multiplexers in der abgebildeten
Schaltung erreicht. Das wäre prinzipiell durch die AND-Verknüpfung der
beiden low aktiven Signale COML* und COMH* (U84, 74LS00, Pins 12 und 13)
möglich. Wenn eines dieser Signale low ist, wird Uber low am SEL-Eingang
des Multiplexers GND auf die Ausgänge durchgeschaltet und nicht die Bits
Q0 und Q1 des Latch. COML* und COMH* werden low, also aktiv, wenn der
unten bzw. oben im 64-kB-Adreßraum als Common definierte Speicherbereich
angesprochen wird.

Hier wurde aber zusätzlich die Möglichkeit geschaffen, über Q7 des
Latch (Port F3h, Bit 7) die Steuerung des SEL-Eingangs des Multiplexers
zu unterbinden. Wenn D7 des Ports F3h high ausgegeben ist (Bit im Output
gesetzt), wird die automatische Umschaltung auf das untere Viertel einer
256K-RAM-Reihe unterbunden. Dann ist nur noch die ursprüngliche Steuerung
der CAS*-Freigabesignale vom Zugriff auf den festgelegten Common-Bereich
belangt (Selektion einer RAM-Reihe, aber nicht des unteren Viertels).

Das Verhalten des Computers läßt sich mit Q7=1 aus dem Normalverhalten
(nur 1 aktiver Common-Bereich, 16 Banks) in einen zweiten Zustand
umschalten: Es gibt dann 6 Blocks zu je 256 kB (Port F3h, Bits 0 und 1)
mit je einem eigenen Common-Bereich an der durch Port F9h, Bit 0 defi-
nierten Adresse. Jeder dieser Blocks kann unabhängig hiervon je nach Port
F9, Bits 6 und 7 eine der vier RAM-Reihen benutzen. Das entspricht der
parallelen Existenz von vier Computern mit je vier Banks zu 64 kB.

In anderen Worten: Wahlweise stellt die hier vorgestellte Schaltung
einem Computer 1 MB RAM zur Verfügung, oder vier voneinander unabhängige
Computer verwalten je 256 kB RAM. Die zweite Variante entspricht dem
Originalzustand des GIIIs - mal vier. Das Nebeneinander der nunmehr 16
Blocks zu je 64 kB ist in Abb. 5 b und c dargestellt.

Da das verwendete Latch 74LS273 aber 8 Bits verfügbar hat, sollte
damit weiteres Tune-Up verwirklicht werden.

Der Bildwiederholspeicher und der Zeichengenerator sind 6116LP15-
RAMs. Diese Einheiten können unter Verwendung von 6264LP15-Speichern
ebenfalls vervierfacht werden, wenn deren zusätzliche Adreßleitungen A11
und A12 mit den Ausgängen 02 und 03 des Latch beschaltet werden. Über D2
und D3 am Port F3h läßt sich einer von vier Bildwiederholspeichern mit
eigenem Zeichengenerator-RAM selektieren.

Und schließlich sollte auch noch der HRG-Speicher von 64 auf 256 kB
durch Austausch der 4164-RAMs gegen 41256-Typen auf acht Pages aufgebohrt
werden. Die Selektion eines Viertels des neuen Speichers sollte über D4
und D5 am Port F3h erfolgen. Innerhalb des adressierten Viertels könnte
dann weiterhin wie bisher eine von zwei Pages zu 32 kB gewählt werden.
Die alte Software würde dadurch in ihrer Funktionsfähigkeit nicht beein-
trächtigt werden.

Aus nicht verständlichen Gründen funktionierte das Umschalten bei
einem Versuch nicht, Q4 und Q5 als Adressen A16 und A17 über einen Mul-
tiplexer 74LS157 (auch 74HC157) auf die neuen 41256-RAMs des HRG-Spei-
chers zu legen. Sein Pin 1 wurde durch das gleiche Signal gesteuert wie
die beiden schon existierenden Multiplexer. Evtl, kann die Verwendung
eines S- anstatt des LS- bzw. HC-Typs das Problem lösen. Vielleicht kann
uns jemand mit einem Tip weiterhelfen?

Auch eine andere Funktion, die nach Schaltplan einwandfrei arbeiten
sollte, versagte den Dienst. Durch NAND-Verknüpfung von Q6 des Latch und
MWR* sollte erreicht werden, daß bei high gesetztem Bit 6 im Port F3h
beim Lesen des Speichers auf Computer 0 geschaltet wird, und nur beim
Schreiben der RAM-Speicher des mit DO und D1 festgelegten Computers an-
gesprochen wird. Damit wäre es besonders einfach geworden, den Speicher-
inhalt von Computer Nr. 0 auf seine drei Nachbarn zu übertragen, um sie
mit Initial-Information zu laden. Das hätte der Fähigkeit des EG 64 MBA
entsprochen, mit einem einfachen LDIR den ROM-Inhalt auf das parallele
RAM zu kopieren. Auch dieses Feature funktioniert wider Erwarten nicht.

Im Layout wurden trotzdem die Schaltungen dieser nicht funktionie-
renden Elemente beibehalten. Evtl, gelingt es noch, diese Features später
zum Laufen zu kriegen. Ansonsten steht einer anderweitigen Verwendung der
Latch-Ausgänge Q4, Q5 und Q6 nichts im Wege. Die im folgenden beschrie-
bene Software kommt ohne diese Funktionen aus. Die nicht funktionsfähigen
Teile der Schaltung haben insb. auch keinen negativen Effekt auf sie, so
daß sie im Hinblick auf späteres Gelingen durchaus bereits bestückt wer-
den können.

Die drei Gruppen zu je zwei Bits am Port F3h sind voneinander unab-
hängig ansprechbar. So kann z.B. über D2 und D3 zwischen mehreren Bild-
schirmen und Zeichensätzen gewählt werden, D4 und D5 können im Graphik-
speicher einen Spooler mit luxuriöser Kapazität zur Verfügung stellen,
während D0 und D1 ständig low bleiben, also gewissermaßen im Computer Nr.
0 gearbeitet wird. Und Computer Nr. 3 kann eine Graphik ändern, die Com-
puter Nr. 1 erstellte usw..




B: Die Software zur Umschaltung zwischen vier Rechnern

Während dieser Text entsteht, lauert im selben Gehäuse, aber dennoch
in einem zweiten Computer ZEUS mit dem Quelltext des Programms, das nun
vorgestellt werden soll. So kann während der Arbeit mal eben hinüberge-
schaltet werden, um vergessene Einzelheiten ins Gedächtnis zurückzurufen.
Und damit ist auch schon gesagt, was das Ganze soll. Wir sozial Schwa-
chen, die sich nur einen Rechner leisten können, brauchen auf den Komfort
mehrerer Maschinen nun nicht mehr zu verzichten.

Da gibt es Blocks, RAM-Reihen, Banks, Adreßräume usw.. Um die Ver-
wirrung in Grenzen zu halten, schlagen wir folgende Sprachregelung vor:
Ein Block ist eine bestimmte Datenmenge, die gleichzeitig bearbeitet
wird. Eine RAM-Reihe sind acht Speicherchips 41256, die über Port F9h,
Bits 6 und 7 gleichzeitig selektiert sind. Funktional gesehen ist es
sinnvoll, sie als Banks zu bezeichnen. Die Speicherviertel innerhalb
einer Reihe von 41256-RAMs, um die es in diesem Beitrag geht, sollen hier
Computer genannt werden, denn das Programm verwirklicht das Konzept von
vier Rechnern, die einander auf Knopfdruck abwechseln.

 Dieser Knopfdruck sollte nicht aus Versehen erfolgen können. Deshalb
wird mit der Kombination von Shift-CTRL und einer Taste von 0-3 im Zif-
fernblock umgeschaltet. Dazwischen liegen rd. 35 cm, so daß Zufälle aus-
geschlossen sind. Gleichwohl wäre ein solches Versehen nicht tragisch,
denn eine Umschaltung ist sowohl mit, wie auch ohne Absicht erlaubt und
ungefährlich. Alle Speicherinhalte bleiben bestehen, sogar die restliche
Blinkzeit eines Cursors wird auf die Nanosekunde genau beim Zurückschal-
ten nachgeholt. Der Tastendruck wird während der Interrupt-Bearbeitung
erkannt. Hierzu wird ein CALL nach 45BEh (Erkennen der Dreitastenbefehle)
an der Stelle 4601h umgeleitet (Z. 490 im Listing).

Das alte Lied: Wohin mit Erweiterungen des Betriebssystems? Diesmal
mußte ein Speicherbereich dran glauben, der von TCS bei der Modifikation
des Microsoft-Interpreters offenbar vergessen wurde. Ab 0000h wird weder
nach dem Einschalten noch bei einem Reset gelesen, denn dann ist das
Boot-EPROM aktiviert. In diesem Speicher-Niemandsland wird vom Programm
erkannt, ob Shift-CTRL-Ziffer gedrückt wurde. Dazu stehen aber nur 8
Bytes bis zum Beginn der RST-08h-Routine zur Verfügung. Deshalb verab-
schiedet sich das neue RST 00h an der Stelle 0007h kurzerhand aus der
Bank 0 und macht in Bank 1 weiter, wo das Betriebssystem erst wieder bei
0100h (Zeichensatz-Puffer) Platz beansprucht.

Diese Umschaltung geschieht mit dem Bit 0 von Port F9h. Da die nor-
male Arbeitsbank Bank 1 ist, wobei Common unten in Bank 0 liegt, ist der
Trick simpel: Das Common-Bit wird auf 1 gesetzt, so daß die CPU, ohne es
zu merken, nun auch unten in Bank 1 liest, denn: Common, d. h. der Be-
reich, wo immer in Bank 0 gearbeitet wird, liegt jetzt ab E000h. Im Li-
sting hat dieses Programmsegment das Label rst00 (Z. 664). Es liegt so-
wohl in Bank 0 als auch in Bank 1 bereit, so daß die Umschaltung aus
beiden Banks auf die gleiche Weise geschieht. Es wird einfach D0 des
Ports F9h invertiert.

Beim Umschalten aus Bank 0 (Common unten) wird die scheinbar naht-
lose Fortsetzung in Bank 1 gefunden (Label bank1). Beim Zurückschalten
aber muß rechtzeitig vor dem Erreichen der anschließenden RST-08h-Routine
zur Fortsetzung der INT-Serviceroutine gesprungen werden. Deswegen wurde
zuvor in Bank 1 HL mit 45BEh geladen, der Adresse, wo es weitergehen soll
(s. o.). In Z. 495 wurde zu diesem Zweck der Befehl JP (HL) (Code E9h) in
Bank 0 ans Ende dieses Segments gepatcht.

Nachdem HL die Adresse der Fortsetzung enthält, wird die Tastatur in
3880h und 38C0h nach den Tasten Shift und CTRL sowie nach den Ziffern 0-3
im Dezimalblock befragt. Wenn diese Tastenkombination nicht gedrückt
wurde, will der User offenbar nicht den Computer wechseln. Es erfolgt ein

Rücksprung nach 0000h, wo wieder die alte Bank-Konfiguration eingestellt
wird. Es ist, als wäre nichts geschehen.

Wurde aber Shift-CTRL-Ziffer eingegeben, wird zunächst der Ziffern-
code in einen Zähler für die gewünschte Computer-Nr. umgerechnet und nach
B geladen. Da sich die vier Computer außer der CPU natürlich auch alle
Ports teilen müssen, werden die Zustände der beiden einzig wirklich le-
benswichtigen, FAh und F9h, zwischengepuffert, jener sofort, dieser etwas
später. Bei dieser Gelegenheit wird auf FAh das Bit 5 gesetzt, um einen
Schreibschutz für den Adreßbereich des ehemaligen TRS-80-ROMs zu errei-
chen. Es könnte ja sein, daß ein Programm ihn als Sektorpuffer o. ä. be-
nutzt.

In der Folge bekommt die Umschaltroutine auch ihren eigenen Stack.
Das muß sein, weil er z. B. bei BASIC im Himem liegt, wo ja jetzt die
Bank 0 selektiert ist; der Stack wäre unerreichbar! Der alte Stapelzeiger
wird gepuffert. Je nach dem kurz zuvor aufgesetzten Computer-Zähler wird
so oft zum Ausgangswert -15h (=+EBh) 15h addiert, bis die Nr. des zu-
ständigen Computers im Akku steht.

Die Zahl 15h ergibt sich folgendermaßen: Beispielsweise bei der Se-
lektion von RAM 1, Bildschirm und Zeichensatz Nr. 1 und Graphikspeicher
Nr. 1 liegt am Port F3h der Wert xx01.0101b an (xx sind die beiden Steu-
erbits, die keinem eigenen Computer zugeordnet sind). Abgesehen von den
Bits 6 und 7 ist das die Zahl 15h. Um einen Computer höher zu gehen, wird
deshalb 15h addiert. Der so gewonnene Output für den Port F3h wird an die
Adresse mit dem Label newcomp gepatcht.

Jetzt müssen alle Register gerettet werden, weil die benachbarten
Computer nicht jeder eine eigene CPU haben. Die INT-Routine hat die
Hälfte dieser Arbeit schon erledigt, so daß nur noch die Indexregister
und der alternative Registersatz gepushed zu werden brauchen.

Nun kann umgeschaltet werden. Das Bit 7 wird zuvor gesetzt, damit
bei Common-Einstellung nicht in die Bank 0 des Computers Nr. 0 zurückge-
schaltet wird. Modifikationen, die der User oder das System dort vorge-
nommen hat, sollen ja nicht für alle vier Computer gelten.

Nach dem Umschalten auf einen Nachbarcomputer wird alles wieder re-
stauriert. Es beginnt mit dem Output auf den Port F9h, der aber zunächst
noch in E zwischengelagert wird. Zur Restauration des Bildschirmformats
(auch den Video-Controller gibt es nur einmal) müssen nämlich noch im
oberen Common-Bereich, der ja z. Zt. noch selektiert ist, die CRTC-Para-
meter aus 37F0h-37FFh ausgelesen und auf den Controller ausgegeben wer-
den.

Diese Video-Codes liegen nun wiederum im unteren Common. Also hilft
nur eine Umschaltung auf Bank 0, die beide Common-Bereiche gleichzeitig
zugänglich macht. Daher der Umweg Uber das Unterprogramm vidpar, das die
komplette Bank 0 verwalten kann. Zur Erinnerung: Der Arbeitsspeicher ist
die Bank 1, daher diese Umstände, vidpar macht sich die Arbeit leicht,
indem es ein fertiges Unterprogramm des Betriebssystems ab 3551h aufruft,
das die Codes an den Video-Controller ausgibt. Zuletzt schaltet es wieder
auf Bank 1, Common oben und kehrt zurück.

Jetzt werden auch der Port FAh, die CPU-Arbeitsregister und der
Stackpointer restauriert. Wohlgemerkt sind es die Registerinhalte, die
der Nachbarcomputer irgendwann zuvor für sich selber auf den eigenen
Stack der Umschaltroutine gelegt hat. Was soeben gerettet wurde, liegt im
alten Computer sicher. Mit dem abschließenden Sprung nach 0000h (Label
rst00) wird Common wieder nach unten verlegt und die INT-Routine - dies-
mal diejenige des neuen Computers - zuende bearbeitet.

Außer der Umschaltung mit dem komplizierten Tastendruck geht es auch
durch Aufruf des Programms mit seinem Namen. Um dabei nicht jedesmal die
Floppy rotieren zu lassen, ist es hier eine Systemdatei, so daß sie
gleich beim Booten in den Speicher geladen wird. Sie erledigt verschie-
dene Aufgaben:

Bevor die Umschaltroutine arbeiten kann, sind etliche Initialisie-
rungen notwendig. Hauptsächlich muß natürlich der Computer Nr. 0 auf die
drei Nachbarn kopiert werden, damit die CPU nach dem Umschalten sofort
sinnvollen Code lesen kann. Bei Testläufen hat es sich erwiesen, daß nur
vom Computer 0 aus die Kopie stattfinden darf. Es könnte ja sein, daß der
User ein wenig damit herumexperimentieren möchte oder sein digital be-
reits ebenso verseuchtes Kind nicht weiß, daß Mama oder Papa schon den
Rechner wechselte. Deshalb wird bald nach dem Einsprung (Label test0)
überprüft, ob die Bits 0 und 1 unseres neuen Systembytes 2 (zuständig für
den Hauptspeicher) beide auf 0 stehen. Ist das nicht der Fall, wird ein-
fach nur der derzeit selektierte Computer angezeigt. Diese Anzeige kann
auch mit einem dem Aufruf folgenden Fragezeichen erhalten werden.

Ein weiteres Argument kann dem Befehl folgen: Wenn eine Ziffer von
0-4 eingegeben wurde, wird der so angewählte Computer selektiert. Aller-
dings nur dann, wenn zuvor die Initialisierung stattgefunden hat. Das
merkt das Programm daran, ob an der Stelle 0000h in der Bank 1 bereits
der Befehl DI steht. Ist das nicht der Fall, wird mit einer Fehlermeldung
das Unternehmen abgebrochen. Wenn aber alles klar ist, ergibt die einge-
gebene Ziffer bereits die gewünschte Computer-Nr.. Es kann daher in Bank
1 an der Stelle switch mitten in die RST-00h-Routine gesprungen werden,
wobei die Ermittlung des Computers und - sehr wichtig! - die Tastaturab-
frage übersprungen werden.

Zusätzlich gibt es folgende Argumente: Wie in G-DOS üblich, kann das
Ein- und Ausschalten des Features der vier Computer mit J (für "ja") und
N (für "nein") erfolgen. J wird auch angenommen, wenn kein Argument
folgt. N kann in jedem der vier Computer eingegeben werden. Dann bleibt
immer dasselbe Viertel der 41256-RAMs selektiert, um in diesem Computer
beispielsweise eine unverfälschte INT-Routine zu Testzwecken zu haben.
Dennoch kann mit SYS,BK,n (n = Nr. des Computers) umgeschaltet werden;
nur die Tastenkombination Shift-CTRL-n ist deaktiviert. Und dies gilt
auch nur für den gerade selektierten Computer. Mit R (für "recover")
werden die vier Computer reaktiviert, wenn ein zwischenzeitliches Reset
oder ein SYS,BK,N es abschaltete. Auch hier muß zuvor bereits die Ini-
tialisierung erfolgt sein, sonst wird ein Fehler gemeldet.

Falls die Initialisierung der Nachbarcomputer gewünscht wird und
erlaubt ist, wird’s jetzt hektisch: Im Verlauf der nächsten Mikrosekunden
werden der Stackpointer, das Systembyte 0 (Port F9h) und das Systembyte 1
(Port FAh) als Initialwerte in die RST-00h-Routine gepatcht. Deren kür-
zerer Teil, der in Bank 0 liegen soll, wird nach 0000h verschoben. Das
bereits erwähnte Byte E9h für JP (HL) kommt dahinter. Durch verschiedene
Manipulationen der beiden Systembytes 0 und 1 werden Bildschirme aus- und
wieder angeknipst, expandiert und wieder komprimiert, Tastaturen abge-
würgt, Zeichensätze freigegeben, Common-Bereiche umdefiniert und der-
gleichen mehr. Es würde zu weit führen, das hier im einzelnen zu erläu-
tern. Die Kommentare im Listing protokollieren es jeweils. Eine Hilfe zum
Verständnis kann auch die Tabelle am Ende dieses Abschnitts geben.

Die Kopie des Hauptspeichers kann nicht auf einen Schlag geschehen.
Das liegt daran, daß jeweils ein Common-Bereich erforderlich ist, der
immer in der Bank 0 arbeitet. Das Feature, das mit Q6 des Latches ermög-
licht werden sollte, funktionierte ja leider nicht. Soll also beispiels-
weise im Common-Adreßraum gerade die Bank 2 kopiert werden, ist sie ein-
fach nicht da. Daher wird das Unterprogramm COPY, das später erklärt
werden soll, sowohl in das obere als auch in das untere Common kopiert.
Die beiden Routinen bearbeiten dann jeweils nur eine Speicherhälfte von
viermal 32 kB. Mit dem oben residierenden Kopierprogramm wird gleich
VIDPAR mitverschoben.

Zuerst wird der Bildschirm vervierfacht. Dazu muß er zunächst in
einen Puffer im unteren Adreßraum der Bank 1 kopiert werden. Er findet
Platz hinter dem Zeichensatzpuffer ab 1100h. Beim Schreiben des gewählten
Zeichensatzes in die drei benachbarten Zeichengeneratoren steht das
Adreß-LSB des gerade bearbeiteten Zeichens im Bildschirm an der Stelle
3C00h. Um den dadurch veränderten Bildschirm nicht umständlich restau-
rieren zu müssen, erfolgt zuerst die Kopie des Zeichensatzes, erst an-
schließend wird der Bildschirminhalt aus dem Puffer in den Bildwieder-
holspeicher geladen. Das Zeichen von 3C00h wurde im Puffer ja nicht ver-
ändert. Die Auswahl des gerade aktuellen Bildschirms bzw. Zeichensatzes
geschieht Über die Bits 2 und 3 des Ports F3h.

Um die beiden Kopierroutinen aufrufen zu können, ist ab Z. 576 wie-
der einiges Banking erforderlich. Auch hier mag der Verweis auf die Kom-
mentare und die Tabelle ausreichen. Die Routinen selbst arbeiten folgen-
dermaßen:

Am Label copy wird ein Zähler mit 32 aufgesetzt. Die Datenmenge, für
die der erforderliche Puffer ausreicht, beträgt 1 kB. 32 kB pro Bank
übernimmt eins der beiden Kopierprogramme. Gleich anschließend wird die-
ser Zähler gerettet und derjenige für die Banks geladen. Jetzt wird aus
jeder Bank des Computers Nr. 0 ein Block zu 1 kB in den Puffer geholt.
Schließlich wird in der inneren Schleife, welche die drei Nachbarcomputer
abzählt, der Pufferinhalt auf die Nachbarn kopiert. Um die Adresse des zu
bearbeitenden 1-kB-Blocks zu aktualisieren, genügt es, ihr MSB um 4 zu
erhöhen (ab Z. 654), denn 0400h = 1 kB.

Um die Adressen beim Blocktransferbefehl LDIR nicht zu zerstören,
müssen sie fortlaufend gerettet und wieder restauriert werden. Neben den
LDIR-Befehlen selbst sind es diese PUSHes und POPs, die beim Kopieren die
meiste Zeit verbrauchen. Insgesamt läuft das Programm deshalb etwa drei-
einhalb Sekunden, bei immerhin einem Megabyte eine erträgliche Zeit. Um
möglichst schnelle 8-Bit-Befehle anwenden zu können, werden nur die MSBs
geladen. Die LSBs betragen immer 00h, so daß sie nicht berücksichtigt
werden müssen. Diese - im Computer-Maßstab - extrem langwierige Prozedur
läuft jedoch nur nach dem Aufruf des Programms ab. Nach der Initialisie-
rung geschieht das Umschalten zwischen den Computern hundertmal schneller
als ein Blinzeln.

Nach den Kopiervorgängen bleibt nur noch übrig, die Systembytes 0
und 1 sowie den Stackpointer zu restaurieren. Mit RET wird ins DOS zu-
rückgekehrt.

Wie gesagt, müssen sich die vier Computer die gesamte Hardware tei-
len, lediglich die Speicherbausteine haben sie für sich. Der User muß
deshalb wissen, daß gewisse Einschränkungen in Kauf zu nehmen sind. So
ist es beispielsweise nicht möglich, mit der seriellen Schnittstelle auf
Computer Nr. 0 eine Mailbox anzurufen und zwischendurch damit einen se-
riellen Drucker zu bedienen. Die Schnittstelle wird beim Umschalten nicht
berücksichtigt. Dasselbe gilt für die Floppies, die PIO und evtl, ange-
schlossene Peripherie auf dem Systembus. Dennoch können alle Bauteile von
allen Computern benutzt werden. Es darf eben nur nicht umgeschaltet wer-
den, wenn sich z. B. gerade die Floppy dreht.

In der hier vorgestellten Form ist das Programm Teil der Systemdatei
SYS25/SYS. Dies erschien sinnvoll, weil es ganz entschieden ins Be-
triebssystem gehört und notfalls auch unter Mini-DOS mitten in einem
Programmablauf abrufbar sein sollte. Da die Library des Genie III s schon
voll ist, wird es mit dem SYS-Befehl (hier SYS,BK für "BANK") aktiviert,
der an dieser Stelle bereits vorgestellt wurde. So erklärt sich das Vor-
geplänkel am Beginn des Listings, wo zum alten Inhalt von SYS25/SYS (Be-
dienung der F-Tasten) der Test auf den neuen Requestcode DBh für SYS,BK
eingefügt wurde. Was zwischen den Zeilen 27 und 405 steht, ist mit
LIST OFF ausgespart, denn die F-Tasten sind hier nicht unser Thema. Dies
gilt auch für die Label-Definitionen bis Z. 22.

Es gibt keine Einschränkungen des Speicherplatzes. Nach dem Laden
steht SYS25/SYS zunächst im DOS-Overlay-Bereich ab 4D00h, der für diese
Zwecke vorgesehen und reserviert ist. Die Bereiche, die die RST-00h-Rou-
tine und das Unterprogramm vidpar belegen, sind völlig frei und werden
weder vom Betriebssystem noch von den Autoren bekannten Anwenderprogram-
men beansprucht. Für das RAM-Floppy-Programm MEMDISK/CMD gilt sogar, daß
es vor dem Aufruf bereits aktiviert sein darf. Es wird nicht Uberschrie-
ben, auch nicht die Dateien, die in der RAM-Floppy stehen. Alles wird
einfach in die Nachbarcomputer hinüberkopiert und kann auch von dort aus
benutzt werden.

Wie sich herausstellte, kann aber leider nicht unter BASIC
CMD'SYS,BK<,J>' eingegeben werden, um BASIC/CMD solo oder gar mit bereits
geladenem Programm in die drei Nachbarcomputer hinüberzukopieren. Viel-
leicht gelingt es in der Folge, das ebenfalls noch zu ermöglichen.
Einstweilen muß es unter DOS geschehen, wonach dann in jedem der vier
Computer BASIC/CMD gesondert gestartet werden muß. Auf jeden Fall aber
kann nach erfolgter Initialisierung mitten im Lauf eines BASIC-Programms
auf einen Nachbarcomputer umgeschaltet werden. Mit anderen Programmen
sind bisher diese Schwierigkeiten nicht aufgetreten. Im Zweifelsfall
hilft immer die Methode, die eben für BASIC beschrieben wurde.

Eine weitere Besonderheit muß beim Betrieb mit BASIC beachtet wer-
den. In der RST-00h-Routine kehrt der Akku mit einem Wert >0 zurück
(Output für den Port F9h). Das Z-Flag ist rückgesetzt, d. h. die NZ-Be-
dingung ist gegeben. BASIC versteht das als DOS-Fehler, gibt eine ent-
sprechende Meldung aus und sagt ‘READY’. Deshalb kann man zwar ohne wei-
teres den Befehl CMD"SYS,BK,n' (n ist die Computer-Nr.) über die Tastatur
eingeben, wenn es aber innerhalb eines Programms geschieht, wird dieses
wegen des angeblich auf getretenen Fehlers abgebrochen. Das wäre mit ge-
ringen Modifikationen zu beheben gewesen, die aber Speicherplatz im
kostbareren oberen Adreßraum gekostet hätten. So wurde darauf verzichtet,
denn eine Umschaltung, die ein BASIC-Programm selbsttätig steuert, ist
praxisfern.

Das Verändern von SYS-Files und das Implementieren eines neuen Lib-
rary-Befehls (auch in der Zweit-Lib mit SYS) wurde hier schon mehrfach
gezeigt. Es soll nicht erneut erklärt werden. Wer sich scheut, auf diese
Weise ins Betriebssystem einzugreifen, kann das Programm in der Zeile 421
mit ORG 5200h beginnen und ein CMD-File daraus machen. Dann muß das END-
Statement die Startadresse sidekck haben. Ansonsten ändert sich dabei
nichts.

Zuletzt sollen noch diejenigen Datenbits der hier erwähnten Ports
erläutert werden, die für das Programm von Belang sind:

Sollte es mit der Software zur Verwirklichung von 4 Computern in
einem Schwierigkeiten geben, kann Arnulf Sopp weiterhelfen.

4D00		00023		ORG	4d00h
4D00	FEFB	00024	sys25	CP	0fbh		;Lib-Befehl F# ?
4D02	2822	00025 		JR	Z,fkey		;falls ja
4004	FEDB	00026		CP	0dbh		;Lib-Befehls SYS,BK ?
4D06	CA2A50	00027 		JP 	Z,sidekck	;falls ja
		00405
		00406
		00407	;***************************************************
		00408	;
		00009	;           Sidekick für das Genie IIIs
		00010	;           4 Computer in einem Gehäuse
		00411	;
		00412	;       Hardware: 1 MB RAM, 8 kB Bildschirm,
		00413	;       16 kB Zeichensatz, 256 kB Graphik
		00414	;
		00415	;       (C) 1986 by Arnulf Sopp
		00416	;       starring:   Helmut Bernhardt
		00417	;
		00418	;***************************************************
		00419
		00420	;Test, ob vier Computer bereits initialisiert sind
5015	DBF9	00421	tstinit	I	A,(0f9h)	;Systembyte 0
5017	57	00422		LD	D,A		;retten
5018	F601	00423		OR	01h		;unten Bank 1 selektieren
501A	F3	00424		DI			;vorsichtshalber 
501B	D3F9	00425		OUT	(0f9h),A
501D	3A0000	00426		LD	A,(0000h)	;Anf. der RST-00-Routine
5020	FEF3	00427		CP	0f3h		;steht dort bereits DI ?
5022	7A	00428		LD	A,D		;Systembyte 0
5023	D3F9	00429		OUT	(0f9h),A	;restaurieren
5025	C8	00430		RET	Z		;o. k., falls schon DI
5026	E1	00431		POP	HL		;RET-Adresse vom Stack
5027	C3224D	00432	jperr	JP	error	;raus mit Fehlerbeding.
		00433
		00434	;Tests, ob Befehl mit Argument eingegeben wurde
502A	DBF3	00435	sidekck	IN	A,(0f3h)	;Systembyte 2
502C	E603	00436		AND	03h		;nur Hauptspeicher-Bits
502E	4F	00437		LD	C,A		;retten
502F	CDD54C	00438		CALL	4cd5h		;folgt etwas dem Befehl?
5032	2841	00439		JR	Z,test0		;falls nein
5034	7E	00440		LD	A,(HL)		;was folgt?
5035	FE52	00441		CP	’R’		;Recover 4 Computer?
5037	200A	00442		JR	NZ,norecov	;falls nein
5039	CD1550	00443		CALL	tstinit		;schon initialisiert?
503C	3EC9	00444		LD	A,0c9h		;RET-Befehl
503E	329150	00445		LD	(retrecv),A	;dort patchen
5041	1838	00446		JR	init		;dort weiter
5043	FE4A	00447	norecov CP	’J’		;'ja' für initialisieren?
5045	282E	00448		JR	Z,test0		;falls ja
5047	FE4E	00449		CP	’N’		;’nein' für abschalten?
5049	2007	00450		JR	NZ,notoff	;falls nicht
504B	21BE45	00451		LD	HL,45beh	;alte Adr. in   INT-Routine
504E	220146	00452		LD	(4601h),HL	;dort restaurieren
5051	C9	00453		RET			;dann Ende
5052	FE3F	00454	notoff	CP	’?’		;Status-Abfrage?
5054	2819	00455		JR	Z,dspcmp1	;falls ja
5056	FE30	00456		CP	’O’		;Computer-Nr.eingegeben?
5058	38CD	00457		JR	C,jperr		;falls falsche  Eingabe
505A	FE34	00458		CP	’4’		;nur Comp. Nr.  0-3
505C	30C9	00459		JR	NC,jperr	;falls falsche  Eingabe
		00460
		00461	;neuen Computer selektieren, falls schon initialisiert
505E	E603	00462		AND	03h		;ASCII -> binär 0-3
5060 	3C	00463		INC	A		;für Zähler B:  1-4
5061	47	00464		LD	B,A		;Computerzähler aufsetzen
5062	CD1550	00465		CALL	tstinit		;schon initialisiert?
5065	E1	00466		POP	HL		;RET-Adresse
5066	DBF9	00467		IN	A,(0f9h)	;Systembyte 0
5068	F601	00468		OR	01h		;Common oben, Bk. 1 unten
506A	D3F9	00469		OUT	(0f9h),A	;Systembyte neu ausgeben
506C	C31E00	00470		JP	switch-rst00	;dort Computer umschalten
		00471
		00472	;aktuelle Computer-Nr. anzeigen
506F	79	00473	dspcmp1	LD	A,C		;Computer-Nr.
5070	F630	00474   dspcmp2	OR	30h		;binär -> ASCII
5072	C33300	00475		JP	0033h		;anzeigen und raus
		00476
		00477	;falls Comp. Nr. 0, dann initialisieren, sonst anzeigen
5075	79	00478	test0	LD	A,C		;Computer-Nr.
5076	B7	00479		OR	A		;Nr. 0 selektiert?
5077	20F7	00480 		JR	NZ,dspcmp2	;nur anzeigen, falls nein
5079	D3F3	00481		OUT	(0f3h),A	;auch Video Nr. 0 usw.
		00482
		00483	;INT-Patch in SYS0, RST-00-Routine für Bank 0 verschieben
507B	ED73D75100484		init	LD	(spbuf1),SP ;Initialstack
507F	216B51	00485		LD	HL,rst00	;RST-00h-Routine
5082	010700	00486		LD	BC,bank1-rst00	;Länge der Rout, in Bk. 0
5085	50	00487		LD	D,B		;DE <- Zieladresse 0000
5086	58	00488		LD	E,B
5087	F3	00489		DI			;DISABLE INTERUPT
5088	ED53014600490		LD	(4601h),DE	;CALL 0000 statt 45BE
508C	EDB0	00491		LDIR	;RST-00-Routine ->  Bank 0
		00492
		00493	;Befehl zum Weitersprung schließt RST-00-R. in Bank 0 ab
508E	3EE9	00494		LD	A,0e9h		;Befehl JP (HL)
5090	12	00495		LD	(DE),A	;dahinter patchen (0007h)
		00496
		00497	;Rout. zur Kopie der ob. Speicherhälfte nach 3800 laden
5091	DBFA	00498	retrecv	IN	A,(0fah)	;Systembyte 1
5093	F5	00499		PUSH	AF		;retten
5094	32C851	00500		LD	(fabuf),A	;Patch in RST 00, Bank 1
5097	F611	00501		OR	11h		;Großbildsch. , mm-I/O aus
5099	D3FA	00502		OUT	(0fah),A	;Systembyte 1 neu ausgeb.
509B	08	00503		EX	AF,AF’		;nochmals retten
509C	213751	00504		LD	HL,copy	;Kopierprg. f. ob. Hälfte
509F	110038	00505		LD	DE,combot	;im unt. Common-Bereich
50A2	0E34	00506		LD	C,rst00-copy	;Länge der Routine
50A4	EDB0	00507		LDIR			;nach 3800 übertragen
		00508
		00509	;Routine zur Restauration der Bildschirmparameter und
		00510	;zur Kopie der unteren Speicherhälfte nach F600 laden
50A6	DBF9	00511		IN	A,(0f9h)	;Systembyte 0
50A8	F5	00512		PUSH	AF		;retten
50A9	F601	00513		OR	01h		;Common oben, Bank 1 unt.
50AB	F5	00514		PUSH	AF		;nochmals retten
50AC	32BD51	00515		LD	(f9buf),A	;Patch in RST 00, Bank 1
50AF	D3F9	00516		OUT	(0f9h),A	;geänd. Systemb. ausgeben
50B1	212E51	00517		LD	HL,vidpar	;CRTC-Restaur., Kopierr.
50B4	1100F6	00518		LD	DE,comtop	;im oberen Common-Bereich
50B7	0E3D	00519		LD	C,rst00-vidpar	;Länge der Routine
50B9	EDB0	00520		LDIR			;nach F600 kopieren
		00521
		00522	;RST-00-Routine für Bank 1 in diese Bank nach 0000 laden
50BB	50	00523		LD	D,B		; DE <- 0000h, wie oben
50BC	58	00524		LD	E,B	;(Zieladr. RST-00-Rout.)
50BD	0E70	00525		LD	C,endrst00-rst00    ;Länge RST-00-R.
50BF	EDB0	00526		LDIR                    ;RST-00-Routine -> Bank 1
		00527
		00528	;memory-mapped I/O einschalten, Zeichen-RAM freigeben 
50C1	F602	00529		OR	02h		;Zeichensatz freigeben
50C3	D3F9	00530		OUT	(0f9h),A
50C5	08	00531		EX	AF,AF’		;geändertes Systembyte 1
50C6	F5	00532		PUSH	AF		;wird noch gebraucht
50C7	E6FE	00533		AND	0feh		;mm-I/O einblenden
50C9	D3FA	00534		OUT	(0fah),A	;Systembyte 1 neu ausgeb.
		00535
		00536	;Großbildschirm ab 3800 in Bank 1 ab 1100 zwischenspeich.
50CB	210038	00537		LD	HL,3800h	;Anfang Bildschirm
50CE	110011	00538		LD	DE,1100h	;Anfang Puffer
50D1	0608	00539		LD	B,08h		;BC <- Länge 2 kB
50D3	EDB0	00540		LDIR			;Bildschirm puffern
		00541
		00542	;Zeichensatz in 3 neue Zeichengeneratoren kopieren
		00543	;(3 obere Viertel der beiden 6264)
50D5	0603	00544		 LD	B,03h		;3 Bildsch. u. Zeichens.
50D7	C5	00545	vidloop	PUSH	BC		;Bildschirmzähler retten
50D8	78	00546		LD	A,B		;Bildschirm-Nr.
50D9	07	00547		RLCA			;Bit 0-1 -> 2-3
50DA	07	00548		RLCA
50DB	D3F3	00549		OUT	(0f3h),A	;Bildschirmseite selekt.
50DD	2601	00550		LD	H,01h		;HL <- Beginn Zeichensatz
50DF	AF	00551		XOR	A		;ab ASCII 00
50E0	32003C	00552	chrlop1	LD	(3c00h),A	;LSB Zeichenadresse
50E3	08	00553		EX	AF,AF’		;retten
50E4	1684	00554		LD	D,84h		;MSB in D
50E6	0610	00555		LD	B,10h		;16 Bytes pro Zeichen
50E8	7E	00556	chrlop2	LD	A,(HL)		;1 Byte aus dem Puffer
50E9	12	00557		LD	(DE),A		;ins Zeichensatz-RAM
50EA	23	00558		INC	HL		;auf nächstes Byte
50EB	7A	00559		LD	A,D		;Adreß-MSB
50EC	C608	00560		ADD	A,08		;um 2 kB erhöhen
50EE	57	00561		LD	D,A		;neues MSB
50EF	10F7	00562		DJNZ	chrlop2		;bis 1 Zeichen eingelesen
50F1	08	00563		EX	AF,AF’		;LSB Zeichenadresse
50F2	3C	00564		INC	A		;nächster ASCII-Wert
50F3	20EB	00565		JR	NZ,chrlop1	;bis 256 Zeichen eingel.
		00566
		00567	;Bildschirm aus dem Puffer in 3 neue Video-Speicher kop.
		00568	;(3 obere Viertel des einzelnen 6264)
50F5	1638	00569 		LD	D,38h		;Bildschirmadresse
50F7	0608	00570		LD	B,08h		;BC <- Bildschirmlänge
50F9	EDB0	00571		LDIR			;Bi1dschirmseite füllen
50FB	C1	00572		POP	BC		;Bildschirmzähler
50FC	10D9	00573		DJNZ	vidloop		;bis 4 Bildschirme fertig
		00574
		00575	;Vorber. d. Hauptspeicherkopien, Aufruf d. Kopierroutinen
50FE	F1	00576		POP	AF		;Systembyte 1
50FF	D3FA	00577		OUT	(0fah),A	;mm-I/0 ausblenden
5101	F1	00578		POP	AF		;Systembyte 0
5102	D3F9	00579		OUT	(0f9h),A	;Common oben, Bank 1 unt.
5104	60	00580 		LD	H,B		;untere Speicherhälfte
5105	16F7	00581		LD	D,comtop+256/256  ;DE <- Pufferadr.
5107	ED73255100582		LD	(spbuf2),SP	;Stackpointer retten
510B	3100F7	00583		LD	SP,comtop+256	;eig. Stack im ob. Common
510E	CD09F6	00584		CALL	copy+offset1	;unteren Speicher kopier.
5111	212D40	00585		LD	HL,402dh	;DOS-Ready als RET-Adr.
5114	E5	00586		PUSH	HL		;auf den Initial-Stack
5115	E6FE	00587		AND	0feh		;Common unten
5117	D3F9	00588		OUT	(0f9h),A	;Systembyte 0 neu ausgeb.
5119	210080	00589		LD	HL,8000h	;obere Speicherhälfte
511C	1630	00590		LD	D,30h		;DE <- Pufferadresse
511E	310039	00591		LD	SP,combot+256	;Stack im unteren Common
5121	CD0038	00592		CALL	copy-offset2	;oberen Speicher kopieren
5124	310000	00593		LD	SP,0000h	;Stackptr. restaurieren
5125		00594	spbuf2	EQU	$-2		;(variabel)
5127	F1	00595		POP	AF		;altes Systembyte 0
5128	D3F9	00596		OUT	(0f9h),A	;restaurieren
512A	F1	00597		POP	AF		;dto. Systembyte 1
512B	D3FA	00598		OUT	(0fah),A    
512D	C9	00599		RET			;zurück i. Betriebssystem
		00600
		00601	;Bildschirm-Parameter restaurieren (Arbeitsadresse F600) 
F600		00602	comtop	EQU	0f600h		;im oberen  Common-Bereich
A4D2		00603   offset1	EQU	comtop-$	;für Kopie  d. unt. Hälfte
512E	D3F9	00604	vidpar	OUT	(0f9h),A	;Bank 0 selektieren
5130	CD5135	00605		CALL	3551h		;Videoparameter setzen
5133	7B	00606		LD	A,E		;Systembyte 0
5134	D3F9	00607		OUT	(0f9h),A	;restaurieren
5136	C9	00608           RET
		00609
		00610	;Speicher von Computer Nr. 0 auf Nachbarcomputer kopieren
		00611	;(Arb.-adr. 3800 f. ob. Hälfte o. hinter vidpar f. unten)
3800		00612	combot	EQU	3800h		;im unteren Common-Ber.
1937		00613	offset2	EQU	$-combot	;für Kopie  der ob. Hälfte
		00614
		00615	;32 Blocks zu je 1 kB in 3 Computer mit je 4 Banks kop.
5137	0620	00616	copy	LD	B,32		;32 Blocks zu 1 kB kop.
5139	C5	00617	coplop1	PUSH	BC		;Blockzähler retten
		00618
		00619	;1 Block zu je 1 kB vor Kopie im Puffer Zwischenspeichern
513A	0604	00620		LD	B,4		;4 Banks
513C	C5	00621	coplop2	PUSH	BC		;Bankzähler retten
513D	E5	00622		PUSH	HL		;dto. Zeiger
513E	D5	00623		PUSH	DE
513F	0604	00624		LD	B,04h		;0400 = 1 kB
5141	EDB0	00625		LDIR			;Block puffern
5143	E1	00626		POP	HL		;Quelle und Ziel tauschen
5144	D1	00627		POP	DE
		00628
		00629	;1 Block zu je 1 kB in 1 Bank von 3 Computern kopieren
5145	0603	00630		LD	B,3		;Zähler 3 Nachbarcomputer
5147	C5	00631	coplop3	PUSH	BC		;Computerzähler retten
5148	78	00632		LD	A,B		;lfd. Computer-Nr.
5149	D3F3	00633		OUT	(0f3h),A	;Computer selektieren
514B	0604	00634		LD	B,04h		;1 kB
514D	E5	00635		PUSH	HL		;Zeiger retten
514E	D5	00636		PUSH	DE
514F	EDB0	00637		LDIR			;1 Block in Nachbarcomp.
5151	D1	00638		POP	DE		;Zeiger restaurieren
5152	E1	00639		POP	HL      
5153	C1	00640		POP	BC		;dto. Computerzähler
5154	10F1	00641		DJNZ	coplop3		;bis 1 Bl. in 4 C., 1 Bk.
		00642
		00643	;dasselbe in der nächsthöheren Bank
5156	AF	00644		XOR	A		;Computer Nr. 0 selekt.
5157	D3F3	00645		OUT	(0f3h),A
5159	DBF9	00646		IN	A,(0f9h)	;Systembyte 0
515B	C640	00647		ADD	A,40h		;1 Bank höher
515D	D3F9	00648		OUT	(0f9h),A	;selektieren
515F	EB	00649		EX	DE,HL		;Zeiger rücktauschen
5160	C1	00650		POP	BC		;Bankzähler
5161	10D9	00651		DJNZ	coplop2		;b. 1 Bl. in 3 C., 4 Bks.
		00652
		00653	;dasselbe für den nächsten Block der Speicherhälfte
5163	24	00654		INC	H		;auf nächsten Block
5164	24	00655		INC	H		;(= 0400 addieren)
5165	24	00656		INC	H
5166	24	00657		INC	H
5167	C1	00658		POP	BC		;Blockzähler
5168	10CF	00659		DJNZ	coplop1		;bis 1 Memory-Hälfte kop.
516A	C9	00660		RET			;zum Aufrufer
		00661
		00662	;RST-00h-Rout., Segment in Bank 0 u. 1 (Arbeitsadr. 0000)
		00663	;von Bank 0 auf Bank 1 und umgekehrt schalten
516B	F3	00664	rst00	DI			;keine Störungen
516C	DBF9	00665 		IN	A,(0f9h		;Systembyte 0
516E	EE01	00666		XOR	01h		;Bank 0 <-> 1
5170	D3F9	00667		OUT	(0f9h),A
		00668	;in Bank 0 an der Adresse 0007 folgt hier JP (HL)
		00669
		00670	;Fortsetzung in Bank 1 ab 0007
		00671	;INT-Forts. sichern, prüfen, ob Sh.-CTRL-Ziffer gedrückt
5172	21BE45	00672	bank1	LD	HL,45beh	;Forts, d. INT-Routine
5175	3A8038	00673		LD	A,(3880h)	;Tastatur Steuerzeichen
5178	FE03	00674		CP	03h		;Shift-CTRL gedrückt?
517A	20EF	00675		JR	NZ,rst00	;falls nein
517C	3AC038	00676		LD	A,(38c0h)	;Tastatur Ziffernblock
517F	E60F	00677		AND	0fh		;0  -   3   gedrückt?
5181	28E8	00678		JR	Z,rst00		;falls nein
		00679
		00680	;Tastendruck erfolgt, Zähler für Computer-Nr. aufsetzen
5183	0600	00681		LD	B,00h		;Anfangsw. Computer-Nr.
5185	04	00682	getcomp	INC	B		;B hochzählen
5186	0F	00683		RRCA			;Tastenbit ins Cy
5187	30FC	00684		JR	NC,getcomp	;falls noch nicht gefund.
		00685
		00686	;Systembytes, Stack und Adresse der Programmforts, retten
		00687	;(ab hier auch Bearbeitung mit Befehl SYS,BK,n)
5189	DBFA	00688	switch	IN	A,(0fah)	;Systembyte 1
518B	E6DF	00689		AND	0dfh		;Schreibschutz aufheben
518D	D3FA	00690		OUT	(0fah),A	;Systembyte neu ausgeben
518F	F620	00691		OR	20h		;Schreibschutz 0000-2FFF
5191	325D00	00692		LD	(fabuf-rst00)	;Systembyte 1 retten
5194	ED736C0000693		LD	(spbuf1-rst00),SP   ;SP retten
5198	3100F7	00694		LD	SP,comtop+256	;eigener Stack im Common
519B	E5	00695		PUSH	HL		;Fortsetzungsadresse
519C	DBF9	00696		IN	A,(0f9h)	;Systembyte 0
519E	325200	00697		LD	(f9buf-rst00),A	;retten
		00698
		00699	;Nachbarcomp. errechnen (RAM, Video, Zeichens., HRG-RAM)
51A1	3EEB	00700		LD	A,0ebh		; -15,  Anfw. Comp. & Video
51A3	C615	00701	getall	ADD	A,15h		;Cmp., Vid. u. Grph. ab 0
51A5	10FC	00702		DJNZ	getall		;bis neuer Comp, errechn.
51A7	324A00	00703		LD	(newcomp-rst00),A   ;dort patchen
		00704
		00705	;alle Alternativregister des bisherigen Computers retten
51AA	08	00706		EX	AF,AF’
51AB	D9	00707		EXX
51AC	DDE5	00708		PUSH	IX
51AE	FDE5	00709		PUSH	IY
51B0	F5	00710		PUSH	AF
51B1	E5	00711		PUSH	HL
51B2	D5	00712		PUSH	DE
51B3	C5	00713		PUSH	BC
		00714
		00715	;neuen Computer selektieren, dessen Videoparameter setzen
51B4	3E00	00716		LD	A,00h		;Output für Port F3
51B5		00717	newcomp	EQU	$-1		;je nach Tastendruck
5186	E63F	00718		AND	3fh		;Steuerbits ausmaskieren
51B8	F680	00719		OR      80h		;Common nur comp.-intern
51BA	D3F3	00720		OUT	(0f3h),A	;Nachbarcomputer    selekt.
51BC	1E00	00721		LD	E,00h		;Systembyte 0 (kommt In
51BD		00722	f9buf	EQU	$-1		;vidpar in den Akku)
51BE	21F037	00723		LD	HL,37f0h	;dort CRTC-Parameter
51C1	0610	00724		LD	B,10h		;16 Codes
51C3	AF	00725		XOR	A		;ab CRTC-Register 0
51C4	CD00F6	00726		CALL	vidpar+offset1	;Video-Attribute    restaur.
		00727
		00728	;Systembytes, Register usw. restaur. und Programm forts.
51C7	3E00	00729		LD	A,00h		;Systembyte 1
51C8		00730	fabuf	EQU	$-1		;je nach dem
51C9	D3FA	00731		OUT	(0fah),A	;restaurieren
51CB	C1	00732		POP	BC		;alle Register restaur.
51CC	D1	00733		POP	DE
51CD	E1	00734		POP	HL
51CE	F1	00735		POP	AF
51CF	FDE1	00736		POP	IY
51D1	DDE1	00737		POP	IX
51D3	D9	00738		EXX			;in den Alternativsatz
51D4	08	00739		EX	AF,AF’
51D5	E1	00740		POP	HL		;Fortsetzungsadresse
51D6	310000	00741		LD	SP,0000h	;SP restaurieren
51D7		00742	spbuf1	EQU	$-2		;(variabel)
51D9	1890	00743		JR	rst00		;umschalten und zurück
		00744	endrst00
		00745
4D00		00746	END	sys25			;dort Einsprung

00000 Fehler


 10 REM: Testprogramm, beschränkt sich auf das Umschalten des Bildschirms.
 20 REM: Die vier Bildschirme wechseln einander ab. Zuvor muß das Initiali-
 30 REM: sierungsprogramm mit SYS,BK<,J> vom DOS aus aufgerufen worden sein.
 40 REM:
 50 A=INP(&HF3):REM		Zustand des neuen Systembytes 2
 60 A=AAND&HF3:REM		Video-Bits  ausmaskieren
 70 B=B+&H04:REM		Video-Bits  hochschalten
 80 B=BAND&H0C:REM		höhere Bits nicht belangen
 90 OUTSHF3,A+B:REM		auf nächsten Bildschirm wechseln
100 F0RI=0T0100:NEXT:REM	ein bißchen warten
110 G0TO60:REM			dasselbe Spielchen von vorne


Dasselbe in Assembler:

5200		00001	ORG	5200h
5200	DBF3	00002	Start	IN	A,(0f3h)	;Systembyte 2
5202	C604	00003	loop	ADD A,04h		;nächste Bildschirmseite
5204	E60F	00004		AND	0fh		;nur bis Bit 3
5206	D3F3	00005		OUT	(0f3h),A	;neu ausgeben
5208	08	00006 		EX	AF, AF’		;retten
5209	010080	00007		LD	BC,8000h	;Zähler für Verzögerung
520C	0B	00008	delay	DEC	BC		;herunterzählen
520D	78	00009		LD	A,B		;prüfen, ob Zähler
520E	B1	00010		OR	C		;schon abgelaufen
520F	20FB	00011		JR	NZ,delay	;falls noch nicht
5211	08	00012		EX	AF,AF’		;Systembyte 2
5212	18EE	00013		JR	loop		;und von vorne
5200		00014	END	Start			;dort Einsprung

00000 Fehler



C: Einbau des Erweiterungsboards und Anschluß
der damit erzeugten / dafür benötigten Signale

Da die meisten der für diese Schaltung benötigten Signale direkt vom
Z80 geliefert werden, war es zweckmäßig, ein Board zu entwerfen, das an-
stelle des Z80 in dessen Sockel gesteckt wird und den Prozessor selbst
aufnimmt. Damit sind dann nur noch zehn Signale über freie Verdrahtung
mit dem CPU-Board zu verbinden. Diese Leitungen sind an einen zweireihi-
gen Pfostenstecker geführt. Die Signale COML* und COMH* werden von den
Pins 12 und 13 von U84, 74LS00 abgenommen und in beliebiger Anordnung an
die Pins 3 und 4 des Steckers geführt. MWR* an Pin 5 des Steckers ist von
Pin 8 von U52 (74LS32) zu beziehen, SYSRES* an Pin 6 des Steckers kommt
von Pin 13 von U68, 74LS74.

Die Adressen A16 und A17 für die dynamischen RAMs (für den Arbeits-
speicher an den Pins 1 und 2 und für den HRG-Speicher an den Pins 9 und
10 des Steckers S2) können nicht direkt an die RAMs gelegt werden. Sie
müssen gemultiplext an ihre jeweiligen Pins 1 geführt werden. Dafür ist
zunächst die Computerplatine auszubauen und die Pins 1 aller 32 (Ar-
beitsspeicher) sowie 8 RAMs (Graphik) untereinander zu verbinden.

Dann werden auf U35 und U15 (beide 74S157) je ein 74S157-IC mit den
Pins 1, 8, 15 und 16 huckepack aufgelötet. Dafür muß das untere IC aus
der Fassung genommen werden, um es nicht versehentlich in derselben
festzulöten. Selbstverständlich müssen beim Auf einander löten beide ICs
die gleiche Orientierung haben (Kerbe auf der gleichen Seite). Die nicht
verbundenen Pins des oberen ICs werden um ca. 45* hochgebogen, um
keinen Kontakt mit dem unteren zu haben.

An die Pins 13 und 14 des auf U35 angebrachten 74S157 (hier genügt
auch ein 74LS157) werden zwei isolierte Litzen gelötet, die an die Pins 1
und 2 des Steckers geführt werden. Zwei Litzen, die an die Pins 13 und 14
des auf U15 gesetzten ICs gelötet sind, werden an die Pins 9 und 10 des
Steckers geführt. In beiden Fällen spielt die Anordnung der beiden Lei-
tungen keine Rolle. Die Pins 12 der beiden Huckepack-ICs werden je über
einen 33-Ω-Widerstand mit dem Pin 1 eines der benachbarten 41256-RAMs
verbunden. Dafür muß das jeweilige RAM-IC aus der Fassung genommen und
der Draht vorsichtig mit wenig Lötzinn an das obere dicke Ende des Pins 1
gelötet werden. Es ist ebenso möglich, bei herausgenommener Mutterplatine
den Widerstand um deren Rand herum auf die Lötseite zu führen. Es kann
zweckmäßig sein, den in die Leitung eingefügten 33-Ω-Widerstand mit
einem Stück Schrumpf schlauch davor zu bewahren, Kontakt mit irgendwelchen
IC-Pins zu bekommen.

Die zur Vervierfachung von Video-RAM und Zeichengenerator (BIG4,
BIG5 und BIG6) benötigten 6264LP15-ICs passen nicht mehr in die Fassungen
der 6116LP15-RAMs. Hier hilft folgende Vorgehensweise: Die 6116-RAMs
werden aus den Fassungen genommen. Die drei Kondensatoren an den Stirn-
seiten der Sockel werden ausgelötet und auf dem Rücken der 6264-RAMs mit
kurzen Drahtstücken zwischen die Pins 14 und 28 gelötet. Die Pins 26 und
28 jedes 6264-Bausteins werden miteinander verbunden. Das IC, das in den
Sockel von BIG4 gesteckt werden soll, muß an der Stirnseite (mit Kerbe)
so weit beschliffen werden, daß es neben U87 mit den überstehenden Pins
1, 2, 27 und 28 in den Sockel paßt. Die beiden anderen 6264-ICs passen
ohne zusätzliche Maßnahmen mit den links überstehenden vier Pins in die
Sockel. Vor den Einstecken werden aber die Pins 23 aller drei RAMs um
45* abgebogen.

Die Pins 2 aller drei Speicher werden miteinander und mit dem Pin 8
des Steckers S2 des 4XG3s-Boards verbunden. Auch die hochgebogenen Pins
23 werden untereinander und mit dem Pin 7 des Steckers S2 verbunden. An
die Pins 27 der RAMs werden folgende Signale gelegt (die vorher an die
Pins 21 der 6116-Bausteine gelangt waren):

Pin 27 von RAM-IC	Signal	von	IC Typ Pin
	BIG4		61WR *	U54	32	3
	BIG5, BIG6 	CHRWR*	U5	244	1

Sollten beim Einbau der Aus-1-mach-4-Erweiterung Fragen oder Pro-
bleme auftreten, kann sich der Bastler an Helmut Bernhardt wenden. Unge-
bohrte Leerplatinen bietet er zum Selbstkostenpreis an.

Abb. 8: Bestückungsplan der Platine (leicht vergrößert)

S1: 2 einreihige Steckerleisten für den 280-Sockel auf der Mutterplatine,
je 20 Pins

S2: 1 zweireihiger geknickter Pfostenstecker, 12 Pins

Abb. 9a: Platine des Bankers, Bestückungsseite mit Drahtbrücken (leicht vergrößert)

Abb. 9b: Platine des Bankers, Lötseite






D: Eine nützliche Anwendung für das Bit Q6

In Abschnitt A dieses Artikels müssen wir leider zugeben, daß die
vereinfachte und beschleunigte Kopie des Computers Nr. 0 auf seine drei
Nachbarn mit Hilfe eines gesetzten Bit 6 im Port F3h leider nicht funk-
tionierte. Auf dieses Feature kann auch verzichtet werden. Es würde die
Kopierzeit von ohnehin nur dreieinhalb Sekunden um vielleicht eine halbe
Sekunde verringern können. Da man nur einmal, höchstens zweimal am Tag
diese Initialisierung vornimmt, ist die Wartezeit nicht so wichtig. Um Q6
aber nicht zu verschenken, haben wir es bis zum Aufspüren des Fehlers
einer anderen interessanten Verwendung zugeführt:

Das Boot-EPROM des Genie III s ist ohne Treiber direkt mit der CPU
verbunden. Daher ist es grundsätzlich möglich, Daten nicht nur aus dem
EPROM zu lesen, sondern es auch damit zu beschreiben. Es gibt dazwischen
keinen unidirektionalen Treiber, der diese Datenrichtung verbieten würde.
Nun kann freilich in einem ROM nicht schreibenderweise etwas geändert
werden, denn es ist eben ein Read-Only-Memory. Es ist jedoch möglich, ein
statisches RAM parallel dazu zu stecken. Dazu muß lediglich das WR*-Sig-
nal der CPU auf den WE*-Pin des RAMs gelegt werden. Eine einfache Logik
trifft die Auswahl zwischen dem EPROM und dem statischen RAM. Die Abb. 10
zeigt die Beschaltung der nunmehr zwei Speicherbausteine anstelle des
bisherigen EPROMs, nämlich dieses selbst und ein statisches RAM des Typs
6264.

Ein möglichst kurzes Flachbandkabel sitzt mit einem 28-poligen
Ouetschstecker im EPROM-Sockel. An seinem anderen Ende ist eine Lochra-
sterplatine entweder direkt aufgelötet oder mit einer Pfostensteckerver-
bindung befestigt. Fast alle Signale aus dem Sockel werden auf die kor-
respondierenden Pins der beiden Bausteine einfach durchgeschleift. Nur
das Signal ROMEN* (ROM-enable) muß auf die in der Abbildung beschriebene
Weise mit Bit 6 des Ports F3h verknüpft werden, um eine Auswahl zwischen
dem EPROM und dem neuen statischen RAM treffen zu können. Außerdem wird
MWR* von S2 des Bankers, Pin 5 dem Pin 27 (WE*) des RAMs zugeführt.

Q6 wird an Pin 5 des 74LS274 auf der Lötseite der Banker-Platine
abgegriffen und auf einen freien Pin von S2 geführt, so daß sich die
Verbindung mit der RAM/EPROM-Bank vereinfacht. Es ist nicht erforderlich,
die weiterführende Leiterbahn zum 74LS00 zu durchtrennen und gegen GND zu
legen, denn das Kopierfeature funktioniert vorerst sowieso nicht. Es kann
also nichts passieren, und nach der Korrektur des Fehlers ist weniger
Restaurationsarbeit erforderlich (falls man überhaupt noch restaurieren
will, nachdem man die Vorzüge dieser ROM/RAM-Bank erkannt hat).

Der Platz zwischen dem EPROM-Sockel und der Zusatzplatine für den
Banker ist so eng, daß zwar das EPROM noch eben dazwischen paßte, der
neue Ouetschstecker jedoch nicht mehr ohne weiteres. Um die Zusatzplatine
dennoch fest und kontaktsicher in den Sockel der CPU stecken zu können,
empfiehlt es sich, das Deckelteil des Steckers nach dem Anquetschen des
Kabels wieder zu entfernen und die hochstehenden Spitzen der Kontakt-
klemmen abzuschleifen. Diese werden anschließend mit Isolierband beklebt,
damit sie nicht die Lötseite der Zusatzplatine berühren können.

Wer den Banker nicht, wohl aber das parallele RAM neben dem EPROM
einbauen möchte, kann sich diese Mühe sparen. Dann steht allerdings
selbstredend nicht das Bit 6 des Ports F3h zur Verfügung. Ein Umschalter,
der anstelle von Q6 wahlweise GND oder über einen Widerstand von 10 kΩ +5V an 
die zugehörigen Eingänge des NAND-Gatters legt, erfüllt denselben
Zweck.

Um beim Einschalten oder nach einem Reset auf jeden Fall das Boot-
EPROM zu erreichen, bekommt es den Zustand 0 des Bits 6 zugeordnet. Wenn
Q6 aber 1 lautet, ist das RAM selektiert.

Der zugängliche Adreßraum dieser neu geschaffenen EPROM/RAM-Bank ist
12 kB groß (0000-2FFFh). Das Original-EPROM des Genie III s (2732) belegt
davon nur 4 kB (0000-0FFFh) . Es kann einfach durch einen 2764 ersetzt
werden, in dessen doppelt großem Speicherplatz interessante Features un-
tergebracht werden können. Der 28-polige Sockel führt auch an den vier
bisher nicht benutzten zusätzlichen Pins die dafür erforderlichen Signa-
le. Das statische RAM 6264 belegt von vornherein den doppelten Adreßraum
von 8 kB (0000-1FFFh).

Bei 1 MB Hauptspeicher grenzt die vergleichsweise bescheidene Zugabe
von 8 kB an Memory-Raffgier, aber bei dem Konzept von vier Computern
existiert ohne relativ aufwendiges Banking kein gemeinsamer Speicher, der
zur Übergabe von Daten geeignet wäre. Dies ist in der EPROM/RAM-Bank der
Fall. Wird nämlich Bit 2 des Ports FAh low gesetzt, dann ist ursprünglich
auf jeden Fall im Adreßraum 0-12 kB das EPROM ansprechbar. Mit dieser
Modifikation ist es nun, je nach Q6, wahlweise das EPROM oder das RAM. So
können die vier Computer dort bei Selektion des RAMs auf bequeme Weise
miteinander kommunizieren.

Eine andere Anwendung ist für Tüftler interessant, die das Boot-
EPROM gerne nach ihrem eigenen Geschmack ändern möchten. Wenn in seinem
Adreßraum auch ein RAM liegt, kann eine Versuchsversion des neuen EPROM-
Inhalts dort probegefahren werden, ohne gleich ein EPROM dafür zu opfern.
Hier empfiehlt es sich, das Flachkabel nach außen zu verlegen, um beim
Einstecken eines neuen EPROMs nicht jedesmal den Computer zerlegen zu
müssen. Nun ist es zwar nicht möglich, einfach durch Aufruf mit dem Pro-
grammnamen den EPROM-Code ins parallele RAM zu laden und dort zu starten.
Das anschließend gelistete Programm besorgt das aber.

Die Datei muß zuvor zwischengepuffert werden, um sie anschließend
nach dem Umschalten auf die EPROM/RAM-Bank und der Selektion des RAMs
dort ablegen zu können. Die Programm-Laderoutine des G-DOS (Einsprung an
4419h) verfrachtet aber Programme immer gleich an ihre Bestimmungsadres-
se, was in diesem Falle mit der Fehlermeldung 'Ladeversuch auf ROM-Spei-
cherplatz' quittiert würde. Deshalb muß diese Routine (in Grossers DOS-
Buch LOADP genannt) zuvor durch einen Patch geändert werden:

An der Stelle 4C4Dh in SYS0 wird das MSB der Ladeadresse eines Re-
cords gelesen. In dem hier vorgestellten Programm wird dort eine Umlei-
tung (Label devia) gezapt, die feststellt, wie dieses MSB lautet. Wenn
die Adresse unterhalb 3000h liegt, muß es sich um den Code für das neue
EPROM handeln, den wir zunächst puffern wollen. Deshalb wird dann in Z.
41 das Bit 7 des MSB gesetzt, so daß z. B. aus der Adresse 0500h die
Adresse 8500h wird. So steht nach dem Laden das Programm ab 8000h im
Speicher.

Im ersten Segment der Laderoutine muß nun noch der Patch in SYS0
rückgängig gemacht werden. Schließlich sorgt noch eine Sicherung dafür,
daß ein fehlerhaft geladenes Programm nicht die Testbedingungen ver-
fälscht: Bei einem auf getretenen Fehler ist die NZ-Bedingung erfüllt. In
diesem Fall erfolgt einfach unverrichteter Dinge eine Rückkehr ins DOS
(Z. 18).

Wenn aber alles geklappt hat, wird zunächst in der EPROM/RAM-Bank
das RAM selektiert, indem das Bit 6 des neuen Systembytes 2 (Port F3h)
high gesetzt wird. Danach wird Uber das Systembyte 1 die Bank zugeschal-
tet. Jetzt ist von 0000-1FFFh das statische RAM zugänglich. Die Zeiger
für die Quelle (Puffer ab 8000h), das Ziel (RAM ab 0000h) und der Zähler
für die Programmlänge (2000h) werden aufgesetzt und der Code an seinen
Bestimmungsort geladen.

Die DOS-Laderoutine legt die Einsprungsadresse eines Programms in
4403h ab. Von dort wird sie nach HL geladen, so daß mit JP (HL) das Pro-
gramm angesprungen werden kann. Für ein Boot-EPROM wird diese Adresse
immer 0000h sein, aber auf diese Weise kann auch ein beliebiges anderes
Programm in der neuen Bank abgearbeitet werden.

Beim Einsprung in das Boot-Programm wird geprüft, ob die F1-Taste
gedrückt ist, um anstelle eines Boot im Monitor zu bleiben. Das Laden des
Programms dauert je nach Größe lange genug, um nach dem Aufruf der Lade-
routine rechtzeitig diese Taste zu erreichen. So können sowohl die Boot-
fähigkeit des neuen EPROM-Inhalts als auch der vielleicht modifizierte
Monitor getestet werden.

Der Loader benutzt hier für den neuen EPROM-Inhalt den Filenamen
BOOTEPRH/CMD. Das ist natürlich willkürlich. Der Name kann beliebig dem
eigenen Geschmack angepaßt werden. Es muß auch nicht unbedingt ein Boot-
Programm sein. Diese Routine lädt, was sie erwischt, und springt sie dann
an.

Abb. 12: Schaltung für die EPROM/RAM-Bank

Abb. 13: Verdrahtungsplan (Lötseite)

		00001 ;*********************************************************
		00002 ; Routine zum Laden von Programmen, die im statischen RAM
		00003 ; neben dem Boot-EPROM (0000-1FFF) laufen sollen
		00004 ;
		00005 ; (C) 1986 by Arnulf Sopp
		00006 ;*********************************************************
		00007
3000		00008	0RG	3000h
		00009
		00010	;Umleitung im UP LOADP (Programm laden) in SYS0 setzen,
		00011	;Programm BOOTEPRH/CMD nach 8000 verschoben laden
3000	212C30	00012	Start	LD	HL,devia	;Umleitung zur Modifikat.
3003	224E4C	00013		LD	(4c4eh),HL	;in LOADP patchen
3006	213530	00014		LD	HL,doscall	;Zeiger auf DOS-Befehl
3009	CD1944	00015		CALL	4419h		;diesen ausführen
300C	21654C	00016		LD	HL,4c65h	;alten Code in LOADP
300F	224E4C	00017		LD	(4c4eh),HL	;restaurieren
3012	C0	00018		RET	NZ		;Ende, falls Fehler
		00019
		00020	;EPROM/RAM-Bank und dort wiederum das RAM selektieren
3013	F3	00021		DI			;es wird brenzlig
3014	DBF3	00022		IN	A,(0f3h)	;Systembyte 2
3016	F640	00023		OR	40h		;RAM statt EPROM
3018	D3F3	00024		OUT	(0f3h),A	;selektieren
301A	3EC0	00025		LD	A,0c0h		;auf RAM/EPROM-Bank
301C	D3FA	00026		OUT	(0fah),A	;Bank freigeben
		00027   
		00028	;Prg. von 8000 nach 0000 im Boot-RAM laden und anspringen
301E	210080	00029		LD	HL,8000h	;Puffer des Boot-Progr.
3021	55	00030		LD	D,L		;DE <- 0000
3022	5D	00031		LD	E,L		;(= Zieladresse)
3023	010020	00032		LD	BC,2000h	;Programmlänge
3026	EDB0	00033		LDIR			;Programm ins Boot-RAM
3028	2A0344	00034		LD	HL,(4403h)	;Puffer der Startadresse
302B	E9	00035		JP	(HL)	;Programm anspringen
		00036   
 		00037	;Patch in LOADP: Code bis 3000 soll nach 8000 ff. kommen
302C	CD654C	00038	devia	CALL	4c65h		;MSB Ladeadresse holen
302F	FE30	00039		CP	30h		;zum Boot-Progr. gehörig?
3031	D0	00040		RET	NC		;norm. weiter, falls nein
3032	F680	00041		OR	80h		;ab 8000 laden
3034	C9	00042		RET			;normal weiter
		00043   
		00044	;DOS-Befehl zum Laden des neuen Boot-Programms
3035	4C	00045	doscall DM  ’LOAD,BOOTEPRH/CMD’,0dh ;DOS-Bef., ENTER
		00046
3000		00047	END	start	;dort Einsprung
        
00000 Fehler
        
devia	302C		doscall	3035	start	3000
4D00		00023	ORG	4d00h
4D00	FEFB	00024	sys25	CP	0fbh		;Lib-Befehl F# ?
4D02	2822	00025		JR	Z,fkey		;falls  ja
4D04	FEDB	00026		CP	0dbh		;Lib-Befehls SYS,BK ?
4D06	CA2A50	00027		JP	Z,sidekck	;falls ja



C: Einbau des Erweiterungsboards und Anschluß
der damit erzeugten / dafür benötigten Signale

Da die meisten der für diese Schaltung benötigten Signale direkt vom
Z80 geliefert werden, war es zweckmäßig, ein Board zu entwerfen, das an-
stelle des Z80 in dessen Sockel gesteckt wird und den Prozessor selbst
aufnimmt. Damit sind dann nur noch zehn Signale über freie Verdrahtung
mit dem CPU-Board zu verbinden. Diese Leitungen sind an einen zweireihi-
gen Pfostenstecker geführt. Die Signale COML* und COMH* werden von den
Pins 12 und 13 von U84, 74LS00 abgenommen und in beliebiger Anordnung an
die Pins 3 und 4 des Steckers geführt. MWR* an Pin 5 des Steckers ist von
Pin 8 von U52 (74LS32) zu beziehen, SYSRES* an Pin 6 des Steckers kommt
von Pin 13 von U68, 74LS74.

Die Adressen A16 und A17 für die dynamischen RAMs (für den Arbeits-
speicher an den Pins 1 und 2 und für den HRG-Speicher an den Pins 9 und
10 des Steckers S2) können nicht direkt an die RAMs gelegt werden. Sie
müssen gemultiplext an ihre jeweiligen Pins 1 geführt werden. Dafür ist
zunächst die Computerplatine auszubauen und die Pins 1 aller 32 (Ar-
beitsspeicher) sowie 8 RAMs (Graphik) untereinander zu verbinden.

Dann werden auf U35 und U15 (beide 74S157) je ein 74S157-IC mit den
Pins 1, 8, 15 und 16 huckepack aufgelötet. Dafür muß das untere IC aus
der Fassung genommen werden, um es nicht versehentlich in derselben
festzulöten. Selbstverständlich müssen beim Aufeinanderlöten beide ICs
die gleiche Orientierung haben (Kerbe auf der gleichen Seite). Die nicht
verbundenen Pins des oberen ICs werden um ca. 45’ hochgebogen, um
keinen Kontakt mit dem unteren zu haben.

An die Pins 13 und 14 des auf U35 angebrachten 74S157 (hier genügt
auch ein 74LS157) werden zwei isolierte Litzen gelötet, die an die Pins 1
und 2 des Steckers geführt werden. Zwei Litzen, die an die Pins 13 und 14
des auf U15 gesetzten ICs gelötet sind, werden an die Pins 9 und 10 des
Steckers geführt. In beiden Fällen spielt die Anordnung der beiden Lei-
tungen keine Rolle. Die Pins 12 der beiden Huckepack-ICs werden je über
einen 33-Ω-Widerstand mit dem Pin 1 eines der benachbarten 41256-RAMs
verbunden. Dafür muß das jeweilige RAM-IC aus der Fassung genommen und
der Draht vorsichtig mit wenig Lötzinn an das obere dicke Ende des Pins 1
gelötet werden. Es ist ebenso möglich, bei herausgenommener Mutterplatine
den Widerstand um deren Rand herum auf die Lötseite zu führen. Es kann
zweckmäßig sein, den in die Leitung eingefügten 33-Ω-Widerstand mit
einem Stück Schrumpf schlauch davor zu bewahren, Kontakt mit irgendwelchen
IC-Pins zu bekommen.

Die zur Vervierfachung von Video-RAM und Zeichengenerator (BIG4,
BIG5 und BIG6) benötigten 6264LP15-ICS passen nicht mehr in die Fassungen
der 6116LP15-RAMs. Hier hilft folgende Vorgehensweise: Die 6116-RAMs
werden aus den Fassungen genommen. Die drei Kondensatoren an den Stirn-
seiten der Sockel werden ausgelötet und auf dem Rücken der 6264-RAMs mit
kurzen Drahtstücken zwischen die Pins 14 und 28 gelötet. Die Pins 26 und
28 jedes 6264-Bausteins werden miteinander verbunden. Das IC, das in den
Sockel von BIG4 gesteckt werden soll, muß an der Stirnseite (mit Kerbe)
so weit beschliffen werden, daß es neben U87 mit den über stehenden Pins
1, 2, 27 und 28 in den Sockel paßt. Die beiden anderen 6264-ICs passen
ohne zusätzliche Maßnahmen mit den links Uber stehenden vier Pins in die
Sockel. Vor den Einstecken werden aber die Pins 23 aller drei RAMs um
45° abgebogen.

Die Pins 2 aller drei Speicher werden miteinander und mit dem Pin 8
des Steckers S2 des 4XG3s-Boards verbunden. Auch die hochgebogenen Pins
23 werden untereinander und mit dem Pin 7 des Steckers S2 verbunden. An
die Pins 27 der RAMs werden folgende Signale gelegt (die vorher an die
Pins 21 der 6116-Bausteine gelangt waren):

Pin 27 von RAM-IC		Signal von	IC	Typ	Pin
		BIG4		61WR*		U54	32	3
		BIG5, BIG6	CHRWR*		U5	244	1

Sollten beim Einbau der Aus-1-mach-4-Erweiterung Fragen oder Pro-
bleme auftreten, kann sich der Bastler an Helmut Bernhardt wenden. Unge-
bohrte Leerplatinen bietet er zum Selbstkostenpreis an.

Abb. 8: Bestückungsplan der Platine (leicht vergrößert)
S1: 2 einreihige Steckerleisten für den 280-Sockel
auf der Mutterplatine, je 20 Pins
S2: 1 zweireihiger geknickter Pfostenstecker, 12 Pins

Abb. 9b: Platine des Bankers, Lötseite

Abb. 9a: Platine des Bankers, Bestückungsseite
mit Drahtbrücken (leicht vergrößert)





D: Eine nützliche Anwendung für das Bit Q6

In Abschnitt A dieses Artikels müssen wir leider zugeben, daß die
vereinfachte und beschleunigte Kopie des Computers Nr. 0 auf seine drei
Nachbarn mit Hilfe eines gesetzten Bit 6 im Port F3h leider nicht funk-
tionierte. Auf dieses Feature kann auch verzichtet werden. Es würde die
Kopierzeit von ohnehin nur dreieinhalb Sekunden um vielleicht eine halbe
Sekunde verringern können. Da man nur einmal, höchstens zweimal am Tag
diese Initialisierung vornimmt, ist die Wartezeit nicht so wichtig. Um Q6
aber nicht zu verschenken, haben wir es bis zum Aufspüren des Fehlers
einer anderen interessanten Verwendung zugeführt:

Das Boot-EPROM des Genie III s ist ohne Treiber direkt mit der CPU
verbunden. Daher ist es grundsätzlich möglich, Daten nicht nur aus dem
EPROM zu lesen, sondern es auch damit zu beschreiben. Es gibt dazwischen
keinen unidirektionalen Treiber, der diese Datenrichtung verbieten würde.
Nun kann freilich in einem ROM nicht schreibenderweise etwas geändert
werden, denn es ist eben ein Read-Only-Memory. Es ist jedoch möglich, ein
statisches RAM parallel dazu zu stecken. Dazu muß lediglich das WR*-Sig-
nal der CPU auf den WE*-Pin des RAMs gelegt werden. Eine einfache Logik
trifft die Auswahl zwischen dem EPROM und dem statischen RAM. Die Abb. 10
zeigt die Beschaltung der nunmehr zwei Speicherbausteine anstelle des
bisherigen EPROMs, nämlich dieses selbst und ein statisches RAM des Typs
6264.

Ein möglichst kurzes Flachbandkabel sitzt mit einem 28-poligen
Ouetschstecker im EPROM-Sockel. An seinem anderen Ende ist eine Lochra-
sterplatine entweder direkt aufgelötet oder mit einer Pfostensteckerver-
bindung befestigt. Fast alle Signale aus dem Sockel werden auf die kor-
respondierenden Pins der beiden Bausteine einfach durchgeschleift. Nur
das Signal ROMEN* (ROM-enable) muß auf die in der Abbildung beschriebene
Weise mit Bit 6 des Ports F3h verknüpft werden, um eine Auswahl zwischen
dem EPROM und dem neuen statischen RAM treffen zu können. Außerdem wird
MWR* von S2 des Bankers, Pin 5 dem Pin 27 (WE*) des RAMs zugeführt.

Q6 wird an Pin 5 des 74LS274 auf der Lötseite der Banker-Platine
abgegriffen und auf einen freien Pin von S2 geführt, so daß sich die
Verbindung mit der RAM/EPROM-Bank vereinfacht. Es ist nicht erforderlich,
die weiterführende Leiterbahn zum 74LS00 zu durchtrennen und gegen GND zu
legen, denn das Kopierfeature funktioniert vorerst sowieso nicht. Es kann
also nichts passieren, und nach der Korrektur des Fehlers ist weniger
Restaurationsarbeit erforderlich (falls man überhaupt noch restaurieren
will, nachdem man die Vorzüge dieser ROM/RAM-Bank erkannt hat).

Der Platz zwischen dem EPROM-Sockel und der Zusatzplatine für den
Banker ist so eng, daß zwar das EPROM noch eben dazwischen paßte, der
neue Ouetschstecker jedoch nicht mehr ohne weiteres. Um die Zusatzplatine
dennoch fest und kontaktsicher in den Sockel der CPU stecken zu können,
empfiehlt es sich, das Deckelteil des Steckers nach dem Anquetschen des
Kabels wieder zu entfernen und die hochstehenden Spitzen der Kontakt-
klemmen abzuschleifen. Diese werden anschließend mit Isolierband beklebt,
damit sie nicht die Lötseite der Zusatzplatine berühren können.

Wer den Banker nicht, wohl aber das parallele RAM neben dem EPROM
einbauen möchte, kann sich diese Mühe sparen. Dann steht allerdings
selbstredend nicht das Bit 6 des Ports F3h zur Verfügung. Ein Umschalter,
der anstelle von Q6 wahlweise GND oder über einen Widerstand von 10 kΩ
+5V an die zugehörigen Eingänge des NAND-Gatters legt, erfüllt denselben
Zweck.

Um beim Einschalten oder nach einem Reset auf jeden Fall das Boot-
EPROM zu erreichen, bekommt es den Zustand 0 des Bits 6 zugeordnet. Wenn
Q6 aber 1 lautet, ist das RAM selektiert.

Der zugängliche Adreßraum dieser neu geschaffenen EPROM/RAM-Bank ist
12 kB groß (0000-2FFFh). Das Original-EPROM des Genie III s (2732) belegt
davon nur 4 kB (0000-0FFFh). Es kann einfach durch einen 2764 ersetzt
werden, in dessen doppelt großem Speicherplatz interessante Features un-
tergebracht werden können. Der 28-polige Sockel führt auch an den vier
bisher nicht benutzten zusätzlichen Pins die dafür erforderlichen Signa-
le. Das statische RAM 6264 belegt von vornherein den doppelten Adreßraum
von 8 kB (0000-1FFFh).

Bei 1 MB Hauptspeicher grenzt die vergleichsweise bescheidene Zugabe
von 8 kB an Memory-Raffgier, aber bei dem Konzept von vier Computern
existiert ohne relativ aufwendiges Banking kein gemeinsamer Speicher, der
zur Übergabe von Daten geeignet wäre. Dies ist in der EPROM/RAM-Bank der
Fall. Wird nämlich Bit 2 des Ports FAh low gesetzt, dann ist ursprünglich
auf jeden Fall im Adreßraum 0-12 kB das EPROM ansprechbar. Mit dieser
Modifikation ist es nun, je nach Q6, wahlweise das EPROM oder das RAM. So
können die vier Computer dort bei Selektion des RAMs auf bequeme Weise
miteinander kommunizieren.

Eine andere Anwendung ist für Tüftler interessant, die das Boot-
EPROM gerne nach ihrem eigenen Geschmack ändern möchten. Wenn in seinem
Adreßraum auch ein RAM liegt, kann eine Versuchsversion des neuen EPROM-
Inhalts dort probegefahren werden, ohne gleich ein EPROM dafür zu opfern.
Hier empfiehlt es sich, das Flachkabel nach außen zu verlegen, um beim
Einstecken eines neuen EPROMs nicht jedesmal den Computer zerlegen zu
müssen. Nun ist es zwar nicht möglich, einfach durch Aufruf mit dem Pro-
grammnamen den EPROM-Code ins parallele RAM zu laden und dort zu starten.
Das anschließend gelistete Programm besorgt das aber.

Die Datei muß zuvor zwischengepuffert werden, um sie anschließend
nach dem Umschalten auf die EPROM/RAM-Bank und der Selektion des RAMs
dort ablegen zu können. Die Programm-Laderoutine des G-DOS (Einsprung an
4419h) verfrachtet aber Programme immer gleich an ihre Bestimmungsadres-
se, was in diesem Falle mit der Fehlermeldung 'Ladeversuch auf ROM-Spei-
cherplatz' quittiert würde. Deshalb muß diese Routine (in Grossers DOS-
Buch LOADP genannt) zuvor durch einen Patch geändert werden:

An der Stelle 4C4Dh in SYS0 wird das MSB der Ladeadresse eines Re-
cords gelesen. In dem hier vorgestellten Programm wird dort eine Umlei-
tung (Label devia) gezapt, die feststellt, wie dieses MSB lautet. Wenn
die Adresse unterhalb 3000h liegt, muß es sich um den Code für das neue
EPROM handeln, den wir zunächst puffern wollen. Deshalb wird dann in Z.
41 das Bit 7 des MSB gesetzt, so daß z. B. aus der Adresse 0500h die
Adresse 8500h wird. So steht nach dem Laden das Programm ab 8000h im
Speicher.

Im ersten Segment der Laderoutine muß nun noch der Patch in SYS0
rückgängig gemacht werden. Schließlich sorgt noch eine Sicherung dafür,
daß ein fehlerhaft geladenes Programm nicht die Testbedingungen ver-
fälscht: Bei einem aufgetretenen Fehler ist die NZ-Bedingung erfüllt. In
diesem Fall erfolgt einfach unverrichteter Dinge eine Rückkehr ins DOS
(Z. 18).

Wenn aber alles geklappt hat, wird zunächst in der EPROM/RAM-Bank
das RAM selektiert, indem das Bit 6 des neuen Systembytes 2 (Port F3h)
high gesetzt wird. Danach wird über das Systembyte 1 die Bank zugeschal-
tet. Jetzt ist von 0000-1FFFh das statische RAM zugänglich. Die Zeiger
für die Quelle (Puffer ab 8000h), das Ziel (RAM ab 0000h) und der Zähler
für die Programmlänge (2000h) werden aufgesetzt und der Code an seinen
Bestimmungsort geladen.

Die DOS-Laderoutine legt die Einsprungsadresse eines Programms in
4403h ab. Von dort wird sie nach HL geladen, so daß mit JP (HL) das Pro-
gramm angesprungen werden kann. Für ein Boot-EPROM wird diese Adresse
immer 0000h sein, aber auf diese Weise kann auch ein beliebiges anderes

Programm in der neuen Bank abgearbeitet werden.

Beim Einsprung in das Boot-Programm wird geprüft, ob die F1-Taste
gedrückt ist, um anstelle eines Boot im Monitor zu bleiben. Das Laden des
Programms dauert je nach Größe lange genug, um nach dem Aufruf der Lade-
routine rechtzeitig diese Taste zu erreichen. So können sowohl die Boot-
fähigkeit des neuen EPROM-Inhalts als auch der vielleicht modifizierte
Monitor getestet werden.

Der Loader benutzt hier für den neuen EPROM-Inhalt den Filenamen
BOOTEPRH/CMD. Das ist natürlich willkürlich. Der Name kann beliebig dem
eigenen Geschmack angepaßt werden. Es muß auch nicht unbedingt ein Boot-
Programm sein. Diese Routine lädt, was sie erwischt, und springt sie dann
an.
 
Falls Schwierigkeiten beim Einbau oder Betrieb des Statt-ROM-RAMs
auftreten (auch solo ohne den Banker), können beide Autoren weiterhelfen.


		00001	;********************************************************
		00002	; Routine zum Laden von Programmen, die im statischen RAM
		00003	; neben dem Boot-EPROM (0000-1FFF) laufen sollen
		00004	;
		00005	;   (C) 1986 by Arnulf Sopp
		00006	;********************************************************
		00007
3000		00008	ORG	3000h
		00009
		00010	;Umleitung im UP LOADP (Programm laden) in SYS0 setzen,
 		00011	;Programm BOOTEPRH/CMD nach 8000 verschoben laden
3000	212C30	00012	start	LD	HL,devia	;Umleitung zur Modifikat.
3003    224E4C	00013		LD	(4c4eh),HL	;in LOADP patchen
3006    213530	00014		LD	HL,doscall	;Zeiger auf DOS-Befehl
3009    CD1944	00015		CALL	4419h		;diesen ausführen
300C    21654C	00016		LD	HL,4c65h	;alten Code in LOADP
300F    224E4C	00017		LD	(4c4eh),HL	;restaurieren
3012    C0	00018		RET	NZ 		;Ende, falls Fehler
 		00019
		00020	;EPROM/RAM-Bank und dort wiederum das RAM selektieren
3013    F3	00021		DI			;es wird brenzlig
3014    DBF3	00022		IN	A,(0f3h)	;Systembyte 2
3016    F640	00023		OR	40h		;RAM statt EPROM
3018    D3F3	00024		OUT	(0f3h),A	;selektieren
301A    3EC0	00025		LD	A,0c0h		;auf RAM/EPROM-Bank
301C    D3FA	00026		OUT	(0fah),A	;Bank freigeben
		00027
		00028	;Prg. von 8000 nach 0000 im Boot-RAM laden und anspringen
301E    210080	00029		LD	HL,8000h	;Puffer des Boot-Progr.
3021    55	00030		LD	D,L		;DE <- 0000
3022    5D	00031		LD	E,L		;( = Zieladresse)
3023    010020	00032		LD	BC,2000h	;Programmlänge
3026    EDB0	00033		LDIR			;Programm ins Boot-RAM
3028    2A0344	00034		LD	HL,(4403h)	;Puffer der Startadresse
302B    E9	00035		JP	(HL)		;Programm anspringen
		00036
		00037	;Patch in LOADP: Code bis 3000 soll nach 8000 ff. kommen
302C    CD654C	00038	devia	CALL	4c65h		;MSB Ladeadresse holen
302F    FE30	00039		CP	30h		;zum Boot-Progr. gehörig?
3031    D0	00040		RET	NC		;norm. weiter, falls nein
3032    F680	00041		OR	80h		;ab 8000 laden
3034    C9	00042		RET			;normal weiter
		00043
		00044	;DOS-Befehl zum Laden des neuen Boot-Programms
3035	4C	00045	doscall	DM	’LOAD,BOOTEPRH/CMD’,0dh ;DOS-Bef., ENTER
		00046
3000		00047		END	start		;dort Einsprung
        
00000 Fehler
        
devia   302C		doscall  3035   start   3000


Helmut Bernhardt, Arnulf Sopp


Anmerkung der Redaktion: 
Diese PDF wurde von Helmut Bernhardt, Arnulf Sopp und Fritz Chwolka aus den
Resten der Altpapiersammlung wieder zurechtgebastelt. Mai 2015




                              





