Das Final Expansion beinhaltet 512KB SRAM und 512KB Flash. Um auf den erweiterten Speicher Zugreifen zu können, muss man den Speicher stückweise einblenden. Der Grund dafür ist der beschränkte Adressraum des 6502 Prozessor, der immer nur 64KB gleichzeitig 'sehen' kann. Beim VC-20 sind die 'freien' Adressräume auf 4 x 8KB + 3KB beschränkt. Siehe Bild Memory MAP:
Das Final Expansion hat zwei Register um das
Modul per Software zu konfigurieren. Die Register werden wie
Speicherzellen
zugegriffen und können beschrieben und gelesen werden. Die
Register
haben wie jede Speicherzelle 8 Bit. Nach einem (Hard-) Reset bzw. nach
dem Einschalten steht 0 in beiden Register.
Mit Register 1 stellt man die Betriebsart der Final Expansion ein. Das Register befindet sich an der Adresse 39938 ($9c02). Mit POKE 39938,X wird der Wert der Variablen X in das Register1 geschrieben. Mit PEEK(39938) kann man den Wert des Register1 auslesen.
Die obersten drei Bits von Register1 (Bit 5,6 und 7) sind für
die Betriebsart zuständig.
Die unteren 5 Bits (Bit 0 bis 4) sind Zusatzinformation
zur eingestellten Betriebsart. Man kann also Betriebsart und Zusatzinfo
per + oder OR zusammenbauen und dann per POKE in das Register schreiben
(Register 1: bbbzzzzz).
b .. Betriebstart
z .. Zusatzinfo
Mit Register2 kann man die von der FE belegten Ressourcen freigeben (deaktivieren). Das Register befindet sich an der Adresse 39939 ($9c03). Mit POKE 39939,Y wird der Wert der Variablen Y in das Register2 geschrieben. Mit PEEK(39939) kann man den Wert des Register2 auslesen.
Der VC-20 hat 5 freie Adressräume (Speicher Blöcke). Die FE kann jedem dieser 5 Blöcke Speicher zuordnen. Dh. es wird ein Teil des FE Speichers in einem oder mehreren Blöcken des VC-20 eingeblendet (Banking).
Die unteren 5 Bits (Bit 0 bis Bit 4) des Register2 steuern die Sichtbarkeit der 5 Speicher Blöcke im VC-20. Eine 0 blendet den zugehörigen Block ein, eine 1 blendet den Block aus. Das Ausblenden der Speicher Blöcke benötigt man, um die Kompatibilität zu anderen Modulen zu ermöglichen.
Das oberste Bit (Bit 7) des Register 2 steuert die Sichtbarkeit der Register. Eine 0 blendet die beiden Register ein, eine 1 blendet beide Register aus (deaktiviert die Register).
Achtung:
Wenn die Register ausgeblendet werden, dann gibt es für die
Software
keine Möglichkeit mehr die Konfiguration zu ändern. Erst nach
einem
Reset werden die Register wieder sichtbar.
Das Ausblenden der Register macht man, damit fremde Software nicht
unbeabsichtigt die Konfiguration der FE ändern kann. Damit wird
die
Kompatibilität zu jeder erdenklichen Software hergestellt.
Bit 0 ... Sichbarkeit des VC-20 Speicherblock 0 (Blk0 - $0400-$0FFF)
Bit 1 ... Sichbarkeit des VC-20 Speicherblock 1 (Blk1 - $2000-$3FFF)
Bit 2 ... Sichbarkeit des VC-20 Speicherblock 2 (Blk2 - $4000-$5FFF)
Bit 3 ... Sichbarkeit des VC-20 Speicherblock 3 (Blk3 - $6000-$7FFF)
Bit 4 ... Sichbarkeit des VC-20 Speicherblock 5 (Blk5 - $A000-$BFFF)
Bit 5 ... 1: invertiert A13
Bit 6 ... 1: invertiert A14
Bit 7 ... Sichtbarkeit des IO-3 (Register 1 und 2)
Damit man den gesamten Speicher der Final Expansion erreichen kann,
muss man den Speicher stückweise einblenden. Dazu stehen
verschiedne
Betriebsarten zur
Verfügung, um alle Erfordernisse abdecken zu können.
Nach einem Reset (rote Taste oder nach dem Einschalten) sind alle Bits der Register auf 0, deshalb befindet sich die FE nach einem Reset immer im Startmodus. Mit POKE 39938,0 kann man den Startmodus auch programatisch aktivieren.
Lesezugriffe kommen aus dem ROM (Flash) Bank 0.
Scheibzugriffe gehen in das RAM Bank 1.
Der Block 0 des VC-20 (3K Erweiterung) ist ausgeschaltet.
Der Startmodus ist für maximale Kompatibilität zu anderen Modulen konzipiert. Damit die FE möglichst keine Kollision mit fremde Module hat, belegt die FE nach einem Reset nur Block 5 (Speicherbereicjh $A000 - $BFFF). Block 5 muss aktiv sein, denn sonst könnte man nicht automatisch die Firmware der FE starten
Da die FE im Startmodus nur Block 5 belegt, kann man die FE einfach deaktivieren indem man die Blk5 Leitung auftrennt (zb. durch einen Schalter).
Die Register sind im Startmodus deaktiviert, dazu dient das Lockbit. Das Lockbit funktioniert nur im Startmodus, um Kollisionen mit Module zu vermeiden die auch Register an denselben Adressen verwenden.
Das Lockbit kann gelöscht werden indem man einen Schreibzugriff (POKE) im Block 5 ausführt. Ein Lesezugriff (PEEK) setzt das Lockbit wieder. Dadurch können Programme die im Block 5 laufen nicht versehentlich in ein FE Register schreiben, solange man sich im Startmodus befindet.
Im Startmodus ist nur der VC-20 Block 5 belegt. Gelesen wird aus dem Flash an der Adresse $6000 (Flash Block 3, oberster Block der ersten 32K Bank - Bank 0). Schreibzugriffe gehen aber immer in das SRAM. dadurch kann die Firmware ganz einfach in das SRAM kopiert werden. Schreibzugriffe auf Block 5 gehen ins SRAM an der Adresse $E000 (SRAM Block 7, oberster Block der zweiten 32K Bank - Bank 1). Schaltet man in den SRAM 1 Modus liegt SRAM Block 7 genau im Block 5 des VC-20.
Mit POKE 39938,64 aktiviert man den Flash Speicher der Final Expansion.
Lesezugriffe kommen aus dem ROM (Flash), und zwar aus der eingestellten Bank.
Scheibzugriffe gehen in das RAM Bank 1.
Der Block 0 des VC-20 (3K Erweiterung) ist eingeschaltet.
Die 512KB des Flashs werden dabei in 16 Seiten zu je 32KB aufgeteilt, von denen je eine eingeblendet werden kann. Diese 32KB sind wiederum in 4 Blöcke zu je 8 KB aufgeteilt, die an den VC-20 Adressen $2000 (Block 1), $4000 (Block 2), $6000 (Block 3) und $A000 (Block 5), eingeblendet werden.
Die Zusatzinfo in dem Register (zzzzz) selektiert den jeweiligen 32KB Block des Flashs. In 512KB hat man 16 mal 32KB Blöcke. Die Zusatzinfo kann also die Werte 0 bis 15 annehmen. Aufmerksame Leser werden jetzt sagen, die Zusatzinfo hat 5 Bits also 32 Werte. Richtig, die Final Expansion könnte auch 1MB Chips adressieren, aber die bekommt man nicht als DIL zu kaufen deshalb wurde darauf verzichtet.
Mit POKE 39938,128 aktiviert man das SRAM der Final Expansion.
Lesezugriffe kommen immer aus dem RAM Bank 1.
Scheibzugriffe gehen in das RAM Bank 1 oder optional in die Bank 2.
Der Block 0 des VC-20 (3K Erweiterung) ist eingeschaltet. Das
Bit 0 des Register 1 steuert den Schreibschutz.
Es sind bis zu 35KB des SRAM eingeblendet (4 x 8KB + 3KB) an den Adressen $0400 (Block 0), $2000 (Block 1), $4000 (Block 2), $6000 (Block 3) und $A000 (Block 5). Die 3KB Erweiterung (VC-20 Blk0) kommt aus Bank 0 (die ersten 32KB im SRAM) des SRAM. Die vier 8 KB Blöcke im VC-20 (Blk 1 bis Blk 5) kommen aus Bank 1 des SRAM (die zweiten 32KB im SRAM). Damit sind alle Lücken im VC-20 mit RAM gefüllt und damit der Maxmimal Ausbau an möglicher Speichererweiterung erreicht.
Die Zusatzinfo in dem Register 1 (zzzzz) steuert den
Schreibzugriff der
RAM Blöcke. Bit 4 steuert Blk 5, Bit 3 steuert Blk 3, Bit 2
steuert Blk
2, Bit 1 steuert Blk 1 und Bit 0 steuert Blk 0. Wenn das Bit 0 gesetzt
ist,
dann kann der RAM Block 0 nur gelesen und nicht beschrieben werden (1:
Schreibschutz = ein).
Die Bits der Blöcke 1 bis 5 steuern das Ziel des Schreibzugriff. Wenn das Bit gelöscht ist (0), dann schreibt man in die Bank 1 des RAM. Ist das Bit gesetzt (1), dann schreibt man in die Bank 2 des RAM.
Indem man das Ziel einer Schreiboperation ändert, bewirkt man auch eine Art Schreibschutz. Einen Schreibschutz benötigt man, um ein ROM Modul zu emulieren. Erst schreibt man den ROM Inhalt in den RAM und dann schützt man ihn vor weiterem überschreiben.
Wozu braucht man das:
Manche Spiel Module überschreiben sich selbst (absichtlich), damit
sie nicht im RAM laufen.
Mit POKE 39938,192 aktiviert man den RAM Modus 2 der Final Expansion.
Lesezugriffe kommen aus dem RAM Bank 1 oder optional aus der Bank 2.
Scheibzugriffe gehen immer in das RAM Bank 1.
Der Block 0 des VC-20 (3K Erweiterung) ist eingeschaltet. Das
Bit 0 des Register 1 steuert den Schreibschutz.
Es sind bis zu 35KB des SRAM eingeblendet (4 x 8KB + 3KB) an den Adressen $0400 (Block 0), $2000 (Block 1), $4000 (Block 2), $6000 (Block 3) und $A000 (Block 5). Die 3KB Erweiterung (VC-20 Blk0) kommt aus Bank 0 (die ersten 32KB im SRAM) des SRAM. Die vier 8 KB Blöcke im VC-20 (Blk 1 bis Blk 5) kommen aus Bank 1 des SRAM (die zweiten 32KB im SRAM). Damit sind alle Lücken im VC-20 mit RAM gefüllt und damit der Maxmimal Ausbau an möglicher Speichererweiterung erreicht.
Die Zusatzinfo in dem Register 1 (zzzzz) steuert den Zugriff der
RAM Blöcke. Bit 4 steuert Blk 5, Bit 3 steuert Blk 3, Bit 2
steuert Blk
2, Bit 1 steuert Blk 1 und Bit 0 steuert Blk 0.
Wenn das Bit 0 gesetzt ist, dann kann der RAM Block 0 nur gelesen und nicht beschrieben werden.
Die Bits der Blöcke 1 bis 5 steuern den Lesezugriff. Wenn das Bit gelöscht ist (0), dann liest man aus der Bank 1 des RAM. Ist das Bit gesetzt (1), dann liest man aus der Bank 2 des RAM
Man hat auf diese Weise 64KB (statt 32KB) RAM im Zugriff. Dabei kann der RAM in Bank 2 nicht überschrieben werden. Der Ram in Bank 2 wirkt also schreibgeschützt (wie ROM). Dadurch kann man Programme laufen lassen ohne den Zugriff auf das RAM zu verlieren, man hat quasi ein RAM unter einem "ROM", so wie beim C-64.
Wozu braucht man das:
Man könnte zb. einen Maschinen Monitor programmieren der auf Bank
2 läuft, aber den gesamten Speicher in Bank 1 anzeigt. Dieser
Monitor würde quasi keinen Speicherplatz für sich brauchen.
Mit POKE 39938,160 aktiviert man den Super RAM Modus der Final Expansion.
Lesezugriffe kommen aus dem RAM und zwar aus der eingestellten Bank.
Scheibzugriffe gehen in das RAM und zwar in die eingestellte Bank.
Der Block 0 des VC-20 (3K Erweiterung) ist eingeschaltet.
Es sind 32KB des SRAM eingeblendet (4 x 8KB) an den Adressen $2000 (Block 1), $4000 (Block 2), $6000 (Block 3) und $A000 (Block 5). Die Betriebsart Super RAM ist ganz ähnlich wie der Flash-Lese-Modus, nur dass eben RAM statt EEprom eingeblendet wird und so der Zugriff auf die gesamten 512KB RAM möglich wird.
Die Zusatzinfo in dem Register (zzzzz) selektiert den 32KB Block
des
SRAM. In 512KB hat man 16 mal 32KB Blöcke. Die Zusatzinfo kann
also die
Werte 0 bis 15 annehmen. Was macht man bei einem 8 Bit Rechner wie dem
VC-20 mit einem halben Megabyte RAM?
Wer weiss was findigen Entwicklern so einfallen wird, - man könnte zB. locker 3 ganze Disketten darin speichern ...
Mit POKE 39938,96 aktiviert man den RAM/ROM Modus der Final Expansion.
Lesezugriffe kommen aus dem RAM Bank 1 oder optional aus dem ROM Bank 0.
Scheibzugriffe gehen immer in das RAM, entweder in die Bank 1 (RAM Modus) oder in die Bank 2 (ROM Modus).
Der Block 0 des VC-20 (3K Erweiterung) ist eingeschaltet. Das
Bit 0 des Register 1 steuert den Schreibschutz.
Es sind bis zu 35KB des SRAM eingeblendet (4 x 8KB + 3KB) an den Adressen $0400 (Block 0), $2000 (Block 1), $4000 (Block 2), $6000 (Block 3) und $A000 (Block 5). Die 3KB Erweiterung (VC-20 Blk0) kommt aus Bank 0 (die ersten 32KB im SRAM) des SRAM. Die vier 8 KB Blöcke im VC-20 (Blk 1 bis Blk 5) kommen aus Bank 1 des SRAM (die zweiten 32KB im SRAM). Damit sind alle Lücken im VC-20 mit RAM gefüllt und damit der Maxmimal Ausbau an möglicher Speichererweiterung erreicht.
Die Zusatzinfo in dem Register 1 (zzzzz) steuert den Zugriff der
VC-20 Blöcke. Bit 4 steuert Blk 5, Bit 3 steuert Blk 3, Bit 2
steuert Blk
2, Bit 1 steuert Blk 1 und Bit 0 steuert Blk 0.
Wenn das Bit 0 gesetzt ist, dann kann der RAM Block 0 nur gelesen und nicht beschrieben werden.
Die Bits der Blöcke 1 bis 5 steuern den Zugriff. Wenn das Bit gelöscht ist (0), dann greift man auf die RAM Bank 1 zu. Ist das Bit gesetzt (1), dann liest man aus der Bank 0 des ROM (Flash) und schreibt in die Bank 2 des RAM.
Man hat auf diese Weise eine beliebige Mixture aus RAM und ROM
im Zugriff. Im ROM Modus kann
der RAM in Bank 2 beschrieben werden. Dadurch kann man einfach ROM Code
in die RAM Bank 2 kopieren.
Wozu braucht man das:
Die Firmware kann sich den ROM Block aktivieren wo der Code gerade
ausgeführt wird. Zugleich hat man Zugriff auf den restlichen RAM.
Mit POKE 39938,32 aktiviert man den Flash Modus der Final Expansion.
Lesezugriffe kommen aus dem ROM der eingestellten Bank.
Scheibzugriffe gehen in das ROM (Flash) in die eingestellte Bank.
Der Block 0 des VC-20 (3K Erweiterung) ist eingeschaltet.
In diesem Modus ist es möglich das Flash zu beschreiben und zu löschen. Dabei muss die spezielle Kommandofolge eingehalten werden, die der Hersteller des Flashs dafür vorgesehen hat (siehe AM29F040 Datanblatt).
Das Banking erfolgt analog zum normalen Super ROM Modus.
Der FE Firmware Flasher (fe3flash) verwendet diese Betriebsart.
Alle genannten Waren- oder Firmenbezeichnungen könnten Eigentum der jeweiligen Besitzer sein. Alle Informationen werden ohne Rücksicht auf die evtl. Rechts- oder Patentlage ausschließlich zu Ausbildungszwecken erteilt. Jegliche Verwendung geschieht ausdrücklich auf eigene Gefahr.
Also melden Sie sich nicht bei mir, wenn Ihr VC-20, Ihr CPLD oder Ihr PC nicht mehr funktionieren sollte, das Feuer auf die ganze Wohnung, das Haus, den Straßenzug oder die Stadt übergreift oder der dabei entstehende Rauch das Klima um 30 Grad erwärmt, Millionen verdursten und verhungern und der Rest von Aliens gekapert wird, die dann kommen, weil es endlich ausreichend kuschelig warm ist... also seien Sie gewarnt und bedenken Sie Ihr Handeln sorgfältig!