FE3:Handbuch/Internals

Aus
Wechseln zu: Navigation, Suche


Final Expansion Intern (Technik und Programmierung)


Speichererweiterung

Das Final Expansion beinhaltet 512KB SRAM und 512KB Flash Speicher. 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.



FE3 Control Register

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. Beide Register liegen im IO Bereich des VC0-20 (IO-3).


Register 1 ($9c02)

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 Register 1 geschrieben. Mit PEEK(39938) kann man den Wert des Register 1 auslesen.

Die obersten drei Bits von Register 1 (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


Register 2 ($9c03)

Mit Register 2 kann man die von der FE3 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 Register 2 geschrieben. Mit PEEK(39939) kann man den Wert des Register 2 auslesen.

Der VC-20 hat 5 freie Adressräume (Speicher Blöcke). Die FE3 kann jedem dieser 5 Blöcke Speicher zuordnen. Dh. es wird ein Teil des Speichers der FE3 in einem oder mehreren Blöcken des VC-20 eingeblendet (Banking).

Die unteren 5 Bits (Bit 0 bis Bit 4) des Register 2 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 Hardware Kompatibilität zu anderen Modulen zu ermöglichen, also andere Module gleichzeitig nutzen zu können.

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 FE3 ä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 verschiedene Betriebsarten zur Verfügung, um alle Erfordernisse abdecken zu können.


Betriebsarten der Final Expansion


Start Modus (000zzzzz)
Nach einem Hard-Reset (rote Reset Taste oder nach dem Einschalten) sind alle Bits der Register auf 0, deshalb befindet sich die FE3 nach einem Reset immer im Startmodus. Mit POKE 39938,0 kann man den Startmodus auch programmatisch 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 FE3 möglichst keine Kollision mit fremde Module hat, belegt die FE3 nach einem Reset nur Block 5 (Speicherbereich $A000 - $BFFF). Block 5 muss aktiv sein, denn sonst könnte man nicht automatisch die Firmware der FE3 starten.

Da die FE3 im Startmodus nur Block 5 belegt, kann man die FE3 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 Register der FE3 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.


Super ROM Modus (010zzzzz)

Mit POKE 39938,64 aktiviert man den Super ROM Modus 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.


RAM 1 Modus (100zzzzz)

Mit POKE 39938,128 aktiviert man den RAM Modus 1 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 der Maxmimalausbau 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. 


RAM 2 Modus (110zzzzz)

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 Maxmimalausbau 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.


Super RAM Modus (101zzzzz)

Mit POKE 39938,160 aktiviert man den Super RAM Modus der Final Expansion.

  • Lesezugriffe kommen aus dem RAM und zwar aus der eingestellten Bank
  • Schreibzugriffe 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 ...


RAM / ROM Modus (011zzzzz)

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.
  • Schreibzugriffe 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 Maxmimalausbau 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 Mixtur 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.


Flash-Schreib-Modus (001zzzzz)

Mit POKE 39938,32 aktiviert man den Flash Modus der Final Expansion.

  • Lesezugriffe kommen aus dem ROM der eingestellten Bank.
  • Schreibzugriffe 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 Kommando Folge eingehalten werden, die der Hersteller des Flashs dafür vorgesehen hat (siehe AM29F040 Datanblatt).

Das Banking erfolgt analog zum normalen Super ROM Modus.

Der FE3 Firmware Flasher (fe3flash) verwendet diese Betriebsart.


VIC-20 Speicherbelegung

Der VIC hat je nach Speichererweiterung eine unterschiedliche Speicherbelegung:

Speicherbereich (hex) Speicherbereich (dezimal) Grundausführung Speichererweiterung 3 KByte Speichererweiterung 8, 16, 24 KByte
$E000-$FFFF 57344-65535 Kernal-ROM Kernal-ROM Kernal-ROM
$C000-$DFFF 49152-57343 BASIC-ROM BASIC-ROM BASIC-ROM
$A000-$BFFF 40960-49151 (externe 8 KByte ROM-Erweiterung) (externe 8 K ROM-Erweiterung) 8 KByte RAM (Speichererweiterung)
$9C00-$9FFF 39936-40959 (I/O3 - externe I/O-Bausteine) (I/O3 - externe I/O-Bausteine) (I/O3 - externe I/O-Bausteine)
$9800-$9BFF 38912-39935 (I/O2 - externe I/O-Bausteine) (I/O2 - externe I/O-Bausteine) (I/O2 - externe I/O-Bausteine)
$9600-$97FF 38400-38911 Farb-RAM (4-Bit) Farb-RAM (4-Bit) unbenutztes Farb-Ram (4-Bit)
$9400-$95FF 37888-38399 unbenutztes Farb-Ram (4-Bit) unbenutztes Farb-Ram (4-Bit) Farb-RAM (4-Bit)
$9130-$93FF 37168-37887 (unbenutzter IO-Bereich) (unbenutzter IO-Bereich) (unbenutzter IO-Bereich)
$9120-$912F 37152-37167 VIA#2 (IO-Bereich) VIA#2 (IO-Bereich) VIA#2 (IO-Bereich)
$9110-$911F 37136-37151 VIA#1 (IO-Bereich) VIA#1 (IO-Bereich) VIA#1 (IO-Bereich)
$9010-$910F 36880-37135 (unbenutzter IO-Bereich) (unbenutzter IO-Bereich) (unbenutzter IO-Bereich)
$9000-$900F 36864-36879 VIC IO-Bereich VIC IO-Bereich VIC IO-Bereich
$8000-$8FFF 32768-36863 Char-ROM Char-ROM Char-ROM
$6000-$7FFF 24576-32767 - - 8kB RAM (Speicherweiterung)
$4000-$5FFF 16384-24575 - - 8kB RAM (Speicherweiterung)
$2000-$3FFF 8192-16383 - - 8kB RAM (Speicherweiterung)
$1E00-$1FFF 7680-8191 Bildschirmspeicher Bildschirmspeicher 3,5 KByte RAM
$1200-$1DFF 4608-7679 3,5 KByte RAM 3,5 KByte RAM
$1000-$11FF 4096-4607 Bildschirmspeicher
$0400-$0FFF 1024-4095 - 3 KByte RAM (Speicherweiterung) -
$0000-$03FF 0-1023 Zeropage, Stack, erw. Zeropage Zeropage, Stack, erw. Zeropage Zeropage, Stack, erw. Zeropage


Downloads



Links

alte Doku