Memory

ROM an, ROM aus

Nachdem wir also mit dem Adressdecoder durchaus zufrieden sind, müssen wir uns noch einen Weg überlegen, die /ROMOFF-Leitung per Software steuerbar zu machen. Wenn es schon beim BIOS-Update Test äußerst nützlich ist einfach nur eine Brücke umzustecken und damit das ROM zu deaktivieren, wie praktisch muss es erst sein, dies einfach durch Beschreiben einer Speicherstelle zu tun.

Was wir also brauchen, ist ein IO-Pin, der die /ROMOFF-Leitung steuert. Zusätzlich muss dieser Pin beim Einschalten des Systems einen definierten Zustand haben, damit sichergestellt ist, daß zu diesem Zeitpunkt das ROM eingeblendet ist. Passende Pins finden wir an der VIA und am UART. Die Portpins der VIA beispielsweise sind initial als Eingänge geschaltet und per internem Pullup high. Auch die OUT1 und OUT2-Pins des UART sind initial high. Gegen den UART-Ansatz spricht, dass sich diese Pins  nur über ein Write-Only-Register setzen lassen und es keine Möglichkeit gibt, den Zustand dieser Pins über irgendein UART-Register abzufragen.

Dekoder, die Dritte

Bekanntlich dekodiert unser GAL die oberen 8bit des Adressbus, um den Bereich $8000-$ffff unter RAM, IO-Bereich und ROM einzuteilen. Die unteren 32k werden am Decoder vorbei direkt von der Adressleitung A15 selektiert. Das Memory-Mapping, das sich daraus ergibt, ist - zur Wiederholung - wie folgt:

 

BereichWas
$0000 - $7fffRAM
$8000 - $cfffRAM
$d000 - $dfffIO-Bereich
$e000 - $ffffROM

Die letzte Änderung am Decoder war, das ROM bei Bedarf ausblendbar zu machen. Dieser Mechanismus hat sich beim Test von BIOS-Updates als pures Gold erwiesen, da man ums neu Brennen des EEPROM herumkommt. Das spart Zeit und schont Material.

Noch schlauerer Decoder

Wir sind jetzt also fast in der Lage, das RAM unter dem ROM zu nutzen. Hineinschreiben geht, lesen noch nicht. Da ist das ROM noch im Weg. Wir müssen also einen Weg finden, die GAL-Logik von außen zu beeinflussen. Unser GAL hat noch genügend Eingänge, sodass wir einen Pin zum ROM-Ein-/Ausschalter machen wollen. Lesezugriffe nach $e000-$ffff sollen also nur noch dann im ROM landen, wenn es “eingeschaltet” ist. Sonst wollen wir ins RAM. Die wiederum erweiterte Logik im GAL sieht jetzt so aus:

Schlauer(er) Decoder

Im Rahmen unserer Reihe “Kleine Verbesserungen an der Architektur” ist heute der Adressdekoder dran. Dieser entscheidet bekanntlich anhand der am Adressbus anliegenden Adresse (oder genauergesagt deren höheren 8bit), welcher Baustein an der entsprechenden Adresse eingeblendet werden soll. Durch den Umstand, dass die oberen 8k dem ROM gehören, lassen sich die darunterliegenden 8k RAM nicht ohne weiteres nutzen. Die für die Selektierung des ROMs und der oberen 32k RAM sehen folgendermaßen aus:

Schaltplan

Damit Klarheit darüber herrscht, worum es überhaupt geht, haben wir den Schaltplan in die einzelnen Gruppen (Prozessor+ Freunde, Speicher, UART) zerlegt.

Die aktuelle Stückliste liest sich laut Eagle folgendermaßen:

Part    Value          Device
C1      100n          C5/3          
C3      1n            C-EU025-025X050
C4      10n            C-EU025-025X050
C5      10µF          CPOL-EUE2,5-6E
C6      100n          C5/3          
C7      100n          C5/3          
C8      100n          C5/3          
C12      1µF            CPOL-EUE2,5-6E
C13      100n          C5/3          
C14      100n          C5/3          
C15      100n          C5/3           
C16      1µF            CPOL-EUE2,5-6E
C17      1µF            CPOL-EUE2,5-6E
C18      1µF            CPOL-EUE2,5-6E
C19      1µF            CPOL-EUE2,5-6E
IC1      CY62256LL-PC  CY62256LL-PC  
IC3      CY62256LL-PC  CY62256LL-PC  
IC4      NE555          NE555        
IC5      28c64          2864          
IC6      16550 UART    XR-16C550P    
IC8      74LS06N        74LS06N      
IC9      GAL22V10      22V10        
IC10    MAX232        MAX232         
QG1      2MHz          XO-14
QG2      1.8432MHz      XO-14
R2      3.3k          R-EU_0204/7
R3      1M            R-EU_0204/7
R4      1M            R-EU_0204/7
R5      3.3k          R-EU_0204/7
R6      3.3k          R-EU_0204/7
R7      3.3k          R-EU_0204/7
R8      3.3k          R-EU_0204/7
R9      4.7k          R-EU_0204/7
S1      DTE6          DTE6
U1      65c02          G65SC02P
U3      65c22          G65SC22P
V1      74138N        74138N
V2      74LS00N        74LS00N
X2      RS232          F09HP

CPU Der 65c02-Prozessor nebst Oszillator und RESET-Schaltung, welche aus dem Commodore-PET übernommen wurde und dem GAL, der zu Dekodierung des Adressbereichs von $8000 bis $ffff dient. Nicht zu sehen ist der Pull-Up-Widerstand für die BE (Bus Enable)-Leitung der WDC-Variante des 65x02, ohne den der Prozessor in einen Tri-State-Zustand geht und sich vom Bus abkoppelt.

... kein Spaß - Murphy schlägt zu

Neben all den ermutigenden Experimenten gibt es natürlich auch immer mal wieder Rückschläge. Mittlerweile haben wir schon ein durchaus komplexes Gebilde auf dem Steckbrett, welches ja per se nicht die ideale Plattform ist, um so etwas zu bauen.

So wie aktuell gerade mein “Steckschwein” ein sehr merkwürdiges Verhalten an den Tag legt, ohne dass an der Schaltung etwas geändert worden wäre (Marko ist Zeuge).

Vorab nochmal der Ablauf unserer Upload-Routine, mit der wir das Steckschwein via RS232 mit Code befüttern: