Diddl: überarbeitet 29 Juni 09
Siehe auch FE3 Internal Doku
Die 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:
Register:
Die Final Expansion hat zwei Register um das Modul 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.
Register1:
Mit Register1 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 (Register1: bbbzzzzz).
b .. Betriebstart
z .. Zusatzinfo
Register2:
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 Register2 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)
Banking:
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.
Die Final Expansion kennt 5 Betriebsarten:
-
Start Modus (000zzzzz):
Nach einem Reset 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.
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 EEPROM an der Adresse $6000 (EEPROM 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.
-
Flash-Lese-Modus (010zzzzz):
Mit POKE 39938,64 aktiviert man den Flash-Speicher (EEPROM) der Final Expansion für lesende Zugriffe. 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.
-
RAM Modus (100zzzzz):
Mit POKE 39938,128 aktiviert man das SRAM der Final Expansion. 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 des SRAM (die ersten 32KB im SRAM). Die drei 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 (zzzzz) steuert den Schreibschutz 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 ein Bit 1 ist, dann kann der RAM Block nur gelesen und nicht beschrieben werden (1: Schreibschutz = ein).
Den 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, damit sie nicht im RAM laufen.
-
Super RAM Modus (101zzzzz):
Mit POKE 39938,160 aktiviert man den Super RAM Modus der Final Expansion. 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 ...
-
Modul Aus Modus
Diese Betriebsart wurde obsolet durch die Einführung des Register2. Wenn man alle relevanten Bits setzt im Register 2 (POKE 39939,255) deaktiviert man die Final Expansion komplett. Dies ist unabhängig von der verwendeten Betriebsart. Durch setzen einzelner Bits kann man die FE teilweise deaktiveren.
Wenn die FE deaktiviert wurde, kann si nur durch einen Reset eingeschaltet werden.
-
Flash-Schreib-Modus (001zzzzz):
Mit POKE 39938,32 aktiviert man den Flash-Schreib-Modus der Final Expansion. 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.
Das Banking erfolgt analog zum normalen Flash-Lese-Modus.
Der FE Firmware Flasher (fe3flash) verwendet diese Betriebsart.