EPROM-Trans - Die Super-Erweiterung
Der ROM-Speicher des C 64 ließ sich bislang nur mit Steckplatinen im Expansion-Port vergrößern. Mit einem raffinierten Trick geht es auch intern.

Wen hat es nicht schon geärgert, daß die Grundversion des C 64 kein Monitorprogramm aufweist, das nach dem Einschalten des Computers sofort zur Verfügung steht? Deshalb wurde eine Möglichkeit gesucht (und gefunden), mit der man Maschinenprogramme von einem festinstalliertem EPROM in den Bereich $C000 bis $CFFF transformieren kann, ohne für das EPROM vorhandenen Speicherplatz in Anspruch zu nehmen.
Um diese Schaltung zu realisieren, wurde bei den C 64-Entwicklern einiges abgeguckt. Es soll hier nicht die Funktionsweise des C 64 im Detail erläutert werden (das würde zu weit führen), doch läßt es sich für das Verständnis dieser Schaltung nicht vermeiden, auf den Speicherbereich $A000 bis $BFFF (hier liegt das Basic-ROM) näher einzugehen.
Wird dieser Bereich angesprochen, so wird das Basic-ROM über das sogenannte PLA-Chip (Programable-Logic-Array), auch Adreßraummanager genannt, unter bestimmten Voraussetzungen (zum Beispiel Lesen) aktiviert, das heißt der CE (Chip-Enable)-Anschluß auf Low-Potential gelegt. Drückt man zum Beispiel »RETURN«, so wird zur Adresse $A560 gesprungen. Diese liegt im Speicherbereich, in dem das Basic-ROM liegt. Dieses ROM ist folglich aktiviert, und das dort stehende Maschinenprogramm (Eingabe einer Zeile) wird abgearbeitet.
Wie aus Bild 1 ersichtlich, wurde dieser Bereich ($A000 bis $BFFF) benutzt. Über diesem ROM-Bereich liegt zum einen das »EPROM-Trans« ($A000 bis $AFFF) und zum anderen die EPROMs 1 bis 3 ($B000 bis $BFFF). In letzteren steht jeweils ein beliebiges Programm (bis 4 KByte), welches in den Bereich $C000 bis $CFFF transformiert werden soll. Ich habe zum Beispiel in EPROM 1 den »SMON« und in EPROM 2 »Fast Tape« abgelegt, EPROM 3 ist noch unbenutzt. Das Maschinenprogramm in EPROM-Trans (siehe Listing) soll den Inhalt des jeweils selektierten EPROMs 1 bis 3 von dem Bereich $B000 bis $BFFF in den Bereich $C000 bis $CFFF transformieren.

Wie kann dies jedoch funktionieren, wenn in diesem Bereich wie oben erwähnt, beim Lesen immer das Basic-ROM aktiviert ist? Für die Speichertransformation wird der Inhalt des Basic-ROMs nicht benötigt. Drückt man nun einen der drei Taster (Bild 2), wird die CE-Leitung des Basic-ROMs auf die Zusatzschaltung umgeleitet. Ist folglich ein Taster gedrückt, dann ist das Basic-ROM nicht mehr ansprechbar; kein Taster gedrückt entspricht dem Normalzustand des Computers.

Wie aus dem Listing ersichtlich, liegt bei der Adresse $0560 (≙ $A560) des Maschinenprogramms beim EPROM-Trans ein Sprungbefehl zur Adresse $A000, wo dann die Speichertransformation startet und mit einem Sprungbefehl nach $C000 endet. Will man diese Speichertransformation starten, muß der Computer zur Adresse $A560 oder $A000 springen. Wie oben schon erwähnt, wird die Adresse $A560 automatisch beim Drücken der »RETURN«-Taste angesprungen. Wird zum Beispiel EPROM 1 durch Betätigen von Taster 1 selektiert und dann »RETURN« gedrückt, startet das Maschinenprogramm in EPROM-Trans. Nun wird mit Adreßbit A12 zwischen den Bereichen $Axxx und $Bxxx hin- und hergeschaltet und so der komplette Inhalt von EPROM 1 nach $C000 bis $CFFF kopiert. Am Ende der Transformation wird das Programm durch den JMP-Befehl gestartet, so daß sich zum Beispiel der SMON gleich mit seiner Registeranzeige meldet. Nach Loslassen des Tasters steht auch das Basic-ROM wieder zur Verfügung.
Ein eventuell vorhandenes Basic-Programm wird während der Speichertransformation selbstverständlich nicht beschädigt. Änderungen sind nur im Bereich $C000 bis $CFFF zu registrieren. Die Transformation weist keine Zeitprobleme auf; wenn man »RETURN« betätigt (≙ Start der Transformation), meldet sich auch gleich der SMON (um beim Beispiel zu bleiben).
In EPROM 1 bis 3 wird das Maschinenprogramm so abgelegt, wie es auch in $C000 bis $CFFF stehen würde, da ja $B000 nach $C000, $B001 nach $C001 und $BFFF nach $CFFF transformiert wird.
In Bild 2 ist die Steuerung der CE-Eingänge der einzelnen EPROMs und des Basic-ROMs dargestellt.
Das IC 74LS139 besteht aus zwei 1 auf 4 Demultiplexer DM1 und DM2. Je nach Codierung der Eingangsadresse (A0 und A1) wird der Eingang E auf den entsprechenden Ausgang D0 bis D3 gelegt (Tabelle 1), ansonsten haben die Ausgänge High-Potential.
Taster | DMI | Basic | A12 | Basic-ROM | EPROM-Trans | EPROM 1 | EPROM 2 | EPROM 3 | |
---|---|---|---|---|---|---|---|---|---|
A0 | A1 | ||||||||
kein Taster gedrückt | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | |
Taster T1 gedrückt | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | |
Taster T2 gedrückt | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | |
Taster T3 gedrückt | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
0 ≙ LOW-Potential / 1 ≙ HIGH-Potential
Realisierung der Hardware
Mit DM1 erfolgt die eigentliche Selektierung der EPROMs. Es bestehen vier Möglichkeiten: Basic-ROM und EPROM 1 bis 3. Der Adreßcode ist abhängig von den Schaltzuständen der Taster T1 bis T3. Aktiviert werden alle EPROMs mit »Active Low« (Low-Potential). BASIC ist die Leitung, die normalerweise das Basic-ROM aktiviert, also dann Low-Pegel hat, wenn im Bereich $A000 bis $BFFF gelesen wird. Dieses Signal ist an die Eingänge E der Demultiplexer DM1 und DM2 geführt. Liegt BASIC auf, kann kein Baustein aktiviert werden, denn die Ausgänge D0 bis D3 von DM1 und DM2 sind high oder entsprechend dem Pegel an E (hier dann auch high). Am CE-Eingang vom Basic-ROM steht folglich ein High-Pegel, entsprechendes gilt für EPROM-Trans. Die Ausgänge D1 bis D3 von DM1 werden invertiert, so daß an den betreffenden Eingängen der NAND-Gatter Low-Potential liegt. Bekanntlich ist aber der Ausgang eines NAND-Gatters nur dann low, wenn beide Eingänge high sind. Folglich werden EPROM 1 bis 3 nicht aktiviert. Kommen wir jetzt zum interessanteren Teil: Basic für LOW. Als erstes wollen wir prüfen, ob der Computer »normal« arbeitet, wenn keine Taste gedrückt ist:
- keine Taste gedrückt:
Wenn BASIC low ist, muß in diesem Fall das Basic-ROM aktiviert werden. Durch die Tasterstellungen liegt an den Eingängen A0, A1 von DM1 Low-Potential. Dies bedeutet, die Information an E (BASIC = low) wird zum Ausgang D0 (vergleiche Tabelle 1) übertragen. Das Basic-ROM wird also aktiviert (unabhängig von A12). EPROM 1 bis 3 können nicht aktiviert werden, da die Ausgänge D1 bis D3 von DM1 High-Potential führen (siehe oben). Aber was ist mit EPROM-Trans? Hier (DM2) wird das Eingangssignal E auf den Ausgang D2 übertragen, wenn A0 low und A1 high ist. A1 ist aber abhängig vom CE-Signal des Basic-ROMs. Ist dieses aktiviert (low), kann EPROM-Trans nicht aktiviert werden. Der Computer arbeitet in diesem Fall also völlig normal.
- Taster T1 wird gedrückt
Wird Taster T1 gedrückt, liegt an A0 von DM1 über den Pull-up-Widerstand (1,5 kOhm) high, A1 bleibt über T2 und T3 auf low. Diese Adreßcodierung bedeutet, daß die Information an E auf den Ausgang D1 übertragen wird. Durch den Inverter liegt also am NAND-Gatter (Pin 1) high.
Als Adresse an DM2 liegt an A1 jetzt high, da das Basic-ROM nicht aktiviert wird. A0 ist abhängig vom Adreßbit A12. Wie erwähnt ist A12 für den Bereich $Axxx low. Die Eingangsinformation (low) wird auf D2 gelegt und EPROM-Trans wird aktiviert. An Pin 2 vom NAND-Gatter liegt Low-Potential (high von D3 invertiert), weshalb EPROM 1 nicht aktiviert wird. Wechselt Adreßbit A12 seinen Zustand (von $Axxx → $Bxxx) wird Eingang E von DM2 mit Ausgang D3 zusammengeschaltet, denn A0=0 und A1=1. EPROM-Trans wird nicht mehr aktiviert (D2 → High). An D3 liegt nun aber Low-Potential welches über einen Inverter auf das NAND-Gatter (Pin 2) geführt wird. An Pin 1 und 2 dieses Gatters liegt folglich high und am Ausgang liegt Low-Pegel. EPROM 1 wird aktiviert.
- Taster T2/T3 wird gedrückt
Das Prinzip ist das gleiche wie eben beschrieben. Es ändert sich nur die Adreßcodierung von DM1.
Kernal oder Basic-ROM?
Um ein Kabelgewirr zu vermeiden »zapft« man am besten ein ROM im Computer an, das heißt man erstellt eine Adapterplatine, auf der sämtliche zusätzliche EPROMs sowie das entwendete ROM Platz finden und Adreß- und Datenbus parallel verbunden werden. Diese Platine wird dann in den Steckplatz des herausgenommenen ROMs wie ein einzelnes IC gesteckt, wobei die Anschlüsse des ROMs direkt verbunden sind, während die zusätzlichen Anschlüsse der EPROMs (±, CE, OE, …) extern herausgeführt werden. Welches ROM man verwendet, hängt von den ganz individuellen Wünschen ab. Ich habe mich für das Kernal entschieden, da ich so für ein geändertes Betriebssystem gleich einen EPROM-Steckplatz mit vorgesehen habe, so daß zum Beispiel diejenigen, die eine Betriebssystem-Erweiterung benutzen, ohne Änderungen die Adapterplatine nach dem Layout Bild 3 oben verwenden können. Dieser zusätzliche Steckplatz »Kernal neu« (EPROM vom Typ 2764) ist 100%ig zum Kernal verdrahtet, das heißt man kann nur einen der beiden Kernalplätze besetzen. Die folgende Beschreibung bezieht sich auf das Entfernen des Kernal-ROMs.


Man erstellt sich zunächst die beiden Platinen nach den Layouts in Bild 3. Nachdem die angedeuteten Löcher für Bauteile und Drahtbrücken gebohrt (1 mm) sind, beginnt das Bestücken, wobei es ratsam ist, mit den von den Abmessungen niedrigsten Bauteilen zu beginnen. So ergibt sich folgende Reihenfolge: Drahtbrücken, Widerstände, Fassungen. Der Adaptersockel wird unter die IC-Fassung des auf dieser Platine vorgesehenen Platzes für das Kernal festgelötet, da er ja quasi nur eine Verlängerung der Kernal-Pins ist. Dies muß so durchgeführt werden, daß der Adaptersockel möglichst rechtwinklig zur Platine steht und in eine 24polige IC-Fassung paßt. Am einfachsten kann dieses realisiert werden, wenn man den Adaptersockel in eine 24polige Fassung steckt, und dann anlötet und ausrichtet.
Zwischen Zusatzplatine und Adapterplatine werden sieben Verbindungskabel gezogen, wobei die zugehörigen Anschlußpunkte den Bestückungsplänen Bild 4 zu entnehmen sind. Auf der Adapterplatine kann man hierbei eine Steckverbindung (10polig) vorsehen (zum Beispiel: Typ MS-25-10; Völkner-Elektronik, Postfach 5330, 33 Braunschweig; Preis 3,25 Mark), damit die beiden Platinen nicht starr miteinander verbunden sind.

Die Taster T1 bis T3 werden als letztes — eventuell erst nach dem Einbau — nach Bild 4 unten angeschlossen. Die Qualität der Taster ist unbedeutend, da der Faktor des Prellens keine Rolle spielt.
Verwendet man das hier abgebildete Platinenlayout, so müssen EPROM 1 bis 3 vom Typ 2532 sein, EPROM-Trans vom Typ 2716. Hier sollten wir noch einmal einen Blick auf Bild 5 werfen: Bis auf die CE-Anschlüsse, die zur Zusatzplatine geführt werden, sind die Leitungen fest mit den des Kernal-ROMs verdrahtet (also Adreß- und Datenbus). Die restlichen epromspezifischen Anschlüsse (OE, Vpp, PRG) werden je nach Typ für EPROM-Lesen fest auf low oder high gelegt. Die Stromversorgung liegt beim Kernal an den Pins 12 (Masse) und 24 (Vcc = 5V); A12 entspricht Pin 21.

Einbau in den Computer
Zum Öffnen des Computers (vorher sämtliche Peripherie abziehen inklusive Stromversorgung, Achtung Garantieverlust) müssen die drei Schrauben an der vorderen Unterseite gelöst werden. Hinten sind Ober- und Unterteil des Gehäuses nur zusammengesteckt, so daß durch Anheben des Oberteils sich beide Gehäuseteile trennen lassen (Bild 6).
Jetzt müssen die beiden Steckverbindungen für Tastatur und Leuchtdiode gelöst werden, so daß beide Gehäuseteile völlig getrennt sind.
Als nächstes entfernt man das Kernal-ROM (Steckplatz U4) und steckt dieses in den entsprechenden Sockel auf der Adapterplatine gemäß dem Bestückungsplan.
Sollte das ROM fest eingelötet sein, so ist dies unter Verwendung von Entlötlitze und einer guten Lötstation (nicht mit irgendeinem Lötkolben) herauszulöten. An diesem freigewordenen Platz wird dann ein 24poliger IC-Sockel eingesetzt.
Um die Leitungen BASIC und Basic-ROM zu erhalten, ist im Computer die Leiterbahn nach Bild 7 aufzutrennen. Hierzu nimmt man einen kleinen Schraubenzieher und unterbricht die Leiterbahn durch vorsichtiges Kratzen. Die grüne Schutzschicht auf der Leiterbahn wird an beiden Seiten (rechts und links von der Unterbrechung) entfernt, so daß das Kupfer sichtbar wird. Nun wird an diesen Stellen jeweils ein flexibles Kabel mit etwas Fingerspitzengefühl angelötet. Die eine Leitung entspricht dann BASIC (vom PLA), die andere Basic-ROM (zu CE dieses ROMs) und sind als solche bezeichnet auf der Zusatzplatine zu finden und entsprechend zu verdrahten (eventuell mit Steckverbindung auf der Zusatzplatine).

Diejenigen, die anstatt des Kernals das Basic-ROM anzapfen möchten, finden den Anschluß BASIC an Pin 20 vom Sockel des Basic-ROMs beziehungsweise der Adapterplatine, und Basic-ROM an Pin 20 des ROMs selber, wo die Leitungen dann anzuschließen sind. Am einfachsten ist dies wohl durch Herausbiegen des Pins am Basic-ROM (Achtung: nicht abbrechen) zu bewerkstelligen, so daß dieser nicht im Sockel steckt und ein Kabel angelötet werden kann.
Die Zusatzplatine ist so ausgelegt, daß man sie mit an den Schrauben, die auch zur Befestigung der Tastatur dienen, installieren kann. Ob man sie in der linken oder rechten Seite anbringt, ist völlig belanglos, nur sollte man die Taster auf der Gegenseite befestigen, beziehungsweise vorher prüfen, ob die Einbautiefe der Taster gering genug ist, so daß diese sich nicht mit der Zusatzplatine berühren.
Die Taster werden an dem oberen Gehäuseteil über der Tastatur montiert, wobei man darauf achten sollte, daß genügend Platz für die ausgewählten Taster zur Verfügung steht (Durchmesser; am besten vom Inneren des Gehäuses anpassen).
Ist die Adapterplatine so aufgesteckt, daß die Kerben der ICs in Richtung Kassettenport zeigen und mit EPROM-Trans, dem Kernal und mindestens einem EPROM 1 bis 3 bestückt, sind wir fertig und können den Computer wieder zusammenbauen.
Eventuell kann die Abschirmung — dies ist die Pappe mit der Alu-Schicht — so aufgeschnitten werden, daß beim Verlegen der Kabel von Adapter- zur Zusatzplatine keine Probleme auftreten.
Die Steckverbindung Tastatur — Computer kann nur in einer Richtung aufgesteckt werden; bei der Leuchtdiode zeigt das rote Kabel zum Ein-Aus-Schalter.
Gehäuse zusammenschrauben, fertig.
Ich betreibe diese Schaltung seit etwa 6 Monaten und möchte sie nicht mehr missen. Was ich damit aber zum Ausdruck bringen will, ist, daß die Stromversorgung den zusätzlichen Belastungen gewachsen ist; auch sind bis dato noch keine Wärmeprobleme aufgetreten.
Mir ist bekannt, daß sich viele C64-Besitzer schwer dazu durchringen können, ihren Computer äußerlich oder innerlich (Achtung! Garantieverlust) zu verändern. Diesmal ist es aber, glaube ich, eine Überlegung wert. Alle, die nicht die Möglichkeit zum Herstellen der Platinen haben, können sich an den Verlag wenden. Lesen Sie dazu unseren Hardware-Leserservice.
(Peter Rausche/aw),A000 A2 00 LDX #00 Block 1 ,A002 BD 00 B0 LDA B000,X ,A005 9D 00 C0 STA C000,X ,A008 E8 INX ,A009 D0 F7 BNE A002 ,A00B A2 00 LDX #00 Block 2 ,A00D BD 00 B1 LDA B100,X ,A010 9D 00 C1 STA C100,X ,A013 E8 INX ,A014 D0 F7 BNE A00D ,A016 A2 00 LDX #00 Block 3 ,A018 BD 00 B2 LDA B200,X ,A01B 9D 00 C2 STA C200,X ,A01E E8 INX ,A01F D0 F7 BNE A018 ,A021 A2 00 LDX #00 Block 4 ,A023 BD 00 B3 LDA B300,X ,A026 9D 00 C3 STA C300,X ,A029 E8 INX ,A02A D0 F7 BNE A023 ,A02C A2 00 LDX #00 Block 5 ,A02E BD 00 B4 LDA B400,X ,A031 9D 00 C4 STA C400,X ,A034 E8 INX ,A035 D0 F7 BNE A02E ,A037 A2 00 LDX #00 Block 6 ,A039 BD 00 B5 LDA B500,X ,A03C 9D 00 C5 STA C500,X ,A03F E8 INX ,A040 D0 F7 BNE A039 ,A042 A2 00 LDX #00 Block 7 ,A044 BD 00 B6 LDA B600,X ,A047 9D 00 C6 STA C600,X ,A04A E8 INX ,A04B D0 F7 BNE A044 ,A04D A2 00 LDX #00 Block 8 ,A04F BD 00 B7 LDA B700,X ,A052 9D 00 C7 STA C700,X ,A055 E8 INX ,A056 D0 F7 BNE A04F ,A058 A2 00 LDX #00 Block 9 ,A05A BD 00 B8 LDA B800,X ,A05D 9D 00 C8 STA C800,X ,A060 E8 INX ,A061 D0 F7 BNE A05A ,A063 A2 00 LDX #00 Block 10 ,A065 BD 00 B9 LDA B900,X ,A068 9D 00 C9 STA C900,X ,A06B E8 INX ,A06C D0 F7 BNE A065 ,A06E A2 00 LDX #00 Block 11 ,A070 BD 00 BA LDA BA00,X ,A073 9D 00 CA STA CA00,X ,A076 E8 INX ,A077 D0 F7 BNE A070 ,A079 A2 00 LDX #00 Block 12 ,A07B BD 00 BB LDA BB00,X ,A07E 9D 00 CB STA CB00,X ,A081 E8 INX ,A082 D0 F7 BNE A07B ,A084 A2 00 LDX #00 Block 13 ,A086 BD 00 BC LDA BC00,X ,A089 9D 00 CC STA CC00,X ,A08C E8 INX ,A08D D0 F7 BNE A086 ,A08F A2 00 LDX #00 Block 14 ,A091 BD 00 BD LDA BD00,X ,A094 9D 00 CD STA CD00,X ,A097 E8 INX ,A098 D0 F7 BNE A091 ,A09A A2 00 LDX #00 Block 15 ,A09C BD 00 BE LDA BE00,X ,A09F 9D 00 CE STA CE00,X ,A0A2 E8 INX ,A0A3 D0 F7 BNE A09C ,A0A5 A2 00 LDX #00 Block 16 ,A0A7 BD 00 BF LDA BF00,X ,A0AA 9D 00 CF STA CF00,X ,A0AD E8 INX ,A0AE D0 F7 BNE A0A7 ,A0B0 4C 00 C0 JMP C000 -------------------------------------- . . Sprung: Start . ,A560 4C 00 A0 JMP A000
10 for i=32768 to 32947 20 read x:poke i,x: s=s+x: next 30 data 162, 0,189, 0,176,157, 0,192,232,208,247,162, 0,189, 0,177,157 40 data 0,193,232,208,247,162, 0,189, 0,178,157, 0,194,232,208,247,162 50 data 0,189, 0,179,157, 0,195,232,208,247,162, 0,189, 0,180,157, 0 60 data 196,232,208,247,162, 0,189, 0,181,157, 0,197,232,208,247,162, 0 70 data 189, 0,182,157, 0,198,232,208,247,162, 0,189, 0,183,157, 0,199 80 data 232,208,247,162, 0,189, 0,184,157, 0,200,232,208,247,162, 0,189 90 data 0,185,157, 0,201,232,208,247,162, 0,189, 0,186,157, 0,202,232 100 data 208,247,162, 0,189, 0,187,157, 0,203,232,208,247,162, 0,189, 0 110 data 188,157, 0,204,232,208,247,162, 0,189, 0,189,157, 0,205,232,208 120 data 247,162, 0,189, 0,190,157, 0,206,232,208,247,162, 0,189, 0,191 130 data 157, 0,207,232,208,247, 76, 0,192,247 140 if s<> 25763 then print "data-fehler !": end 150 poke 34144,76:poke 34145,0:poke 34146,160 160 print "o.k."