FE3:Handbuch/Internals: Unterschied zwischen den Versionen
Tw (Diskussion | Beiträge) |
Tw (Diskussion | Beiträge) (→Speichererweiterung) |
||
| (26 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 2: | Zeile 2: | ||
<br /> | <br /> | ||
== Final Expansion Intern (Technik und Programmierung) == | == Final Expansion Intern (Technik und Programmierung) == | ||
| + | |||
| + | <br /> | ||
| + | |||
| + | === 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. | 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. | ||
| − | + | <br /> | |
| + | <gallery mode="standard"> | ||
| + | Vc20-v2-1.GIF|Block Schema | ||
| + | Vc20-v2-2.GIF|Speicher Darstellung | ||
| + | Vc20-v2-3.GIF|Bauteil Beschaltung | ||
| + | FE3-Schematic.jpg|FE3 Schematic | ||
| + | </gallery> | ||
| − | + | <br /> | |
| + | === 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). | ||
<br /> | <br /> | ||
| − | ==== | + | ===== 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). | ||
| + | |||
| + | <pre> | ||
| + | b .. Betriebstart | ||
| + | z .. Zusatzinfo | ||
| + | </pre> | ||
| + | |||
| + | <br /> | ||
| + | ===== 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). | ||
| + | |||
| + | '''<u>Achtung</u>:''' 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. | ||
| + | |||
| + | <pre> | ||
| + | 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) | ||
| + | </pre> | ||
| + | |||
| + | |||
| + | '''<u>Banking</u>:''' | ||
| + | |||
| + | 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. | ||
| + | |||
| + | <br /> | ||
| + | === Betriebsarten der Final Expansion === | ||
| + | |||
| + | <br /> | ||
| + | ===== 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. | ||
| + | |||
| + | <br /> | ||
| + | |||
| + | ===== 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. | ||
| + | |||
| + | <br /> | ||
| + | |||
| + | ===== 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. | ||
| + | |||
| + | <br /> | ||
| + | ===== 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. | ||
| + | |||
| + | <br /> | ||
| + | ===== 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 ... | ||
| + | |||
| + | <br /> | ||
| + | |||
| + | ===== 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. | ||
| + | |||
| + | <br /> | ||
| + | ===== 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. | ||
| + | |||
| + | <br /> | ||
| + | == VIC-20 Speicherbelegung == | ||
| + | |||
| + | Der VIC hat je nach Speichererweiterung eine unterschiedliche Speicherbelegung: | ||
| + | |||
| + | {| class="wikitable" | ||
| + | ! width=8% | Speicherbereich (hex) | ||
| + | ! width=8% | Speicherbereich (dezimal) | ||
| + | ! width=18% | Grundausführung | ||
| + | ! width=18% | Speichererweiterung 3 KByte | ||
| + | ! width=18% | Speichererweiterung 8, 16, 24 KByte | ||
| + | |- align="center" | ||
| + | | $E000-$FFFF || 57344-65535 || Kernal-ROM || Kernal-ROM || Kernal-ROM | ||
| + | |- align="center" | ||
| + | | $C000-$DFFF || 49152-57343 || BASIC-ROM || BASIC-ROM || BASIC-ROM | ||
| + | |- align="center" | ||
| + | | $A000-$BFFF || 40960-49151 || (externe 8 KByte ROM-Erweiterung) || (externe 8 K ROM-Erweiterung) || class="hintergrundfarbe9" |8 KByte RAM (Speichererweiterung) | ||
| + | |- align="center" | ||
| + | | $9C00-$9FFF || 39936-40959 || (I/O3 - externe I/O-Bausteine) || (I/O3 - externe I/O-Bausteine) || (I/O3 - externe I/O-Bausteine) | ||
| + | |- align="center" | ||
| + | | $9800-$9BFF || 38912-39935 || (I/O2 - externe I/O-Bausteine) || (I/O2 - externe I/O-Bausteine) || (I/O2 - externe I/O-Bausteine) | ||
| + | |- align="center" | ||
| + | | $9600-$97FF || 38400-38911 | ||
| + | | class="hintergrundfarbe8" | Farb-RAM (4-Bit) | ||
| + | | class="hintergrundfarbe8" | Farb-RAM (4-Bit) | ||
| + | | class="hintergrundfarbe8" | unbenutztes Farb-Ram (4-Bit) | ||
| + | |- align="center" | ||
| + | | $9400-$95FF || 37888-38399 | ||
| + | | class="hintergrundfarbe8" | unbenutztes Farb-Ram (4-Bit) | ||
| + | | class="hintergrundfarbe8" | unbenutztes Farb-Ram (4-Bit) | ||
| + | | class="hintergrundfarbe8" | Farb-RAM (4-Bit) | ||
| + | |- align="center" | ||
| + | | $9130-$93FF || 37168-37887 || (unbenutzter IO-Bereich) || (unbenutzter IO-Bereich) || (unbenutzter IO-Bereich) | ||
| + | |- align="center" | ||
| + | | $9120-$912F || 37152-37167 || VIA#2 (IO-Bereich) || VIA#2 (IO-Bereich) || VIA#2 (IO-Bereich) | ||
| + | |- align="center" | ||
| + | | $9110-$911F || 37136-37151 || VIA#1 (IO-Bereich) || VIA#1 (IO-Bereich) || VIA#1 (IO-Bereich) | ||
| + | |- align="center" | ||
| + | | $9010-$910F || 36880-37135 || (unbenutzter IO-Bereich) || (unbenutzter IO-Bereich) || (unbenutzter IO-Bereich) | ||
| + | |- align="center" | ||
| + | | $9000-$900F || 36864-36879 || VIC IO-Bereich || VIC IO-Bereich || VIC IO-Bereich | ||
| + | |- align="center" | ||
| + | | $8000-$8FFF || 32768-36863 || Char-ROM || Char-ROM || Char-ROM | ||
| + | |- align="center" | ||
| + | | $6000-$7FFF || 24576-32767 || - || - | ||
| + | | class="hintergrundfarbe9" |8kB RAM (Speicherweiterung) | ||
| + | |- align="center" | ||
| + | | $4000-$5FFF || 16384-24575 || - || - | ||
| + | | class="hintergrundfarbe9" |8kB RAM (Speicherweiterung) | ||
| + | |- align="center" | ||
| + | | $2000-$3FFF || 8192-16383 || - || - | ||
| + | | class="hintergrundfarbe9" |8kB RAM (Speicherweiterung) | ||
| + | |- align="center" | ||
| + | | $1E00-$1FFF || 7680-8191 | ||
| + | | class="hintergrundfarbe3" | Bildschirmspeicher | ||
| + | | class="hintergrundfarbe3" | Bildschirmspeicher | ||
| + | | class="hintergrundfarbe9" rowspan=2 | 3,5 KByte RAM | ||
| + | |- align="center" | ||
| + | | $1200-$1DFF || 4608-7679 | ||
| + | | class="hintergrundfarbe9" rowspan=2 | 3,5 KByte RAM | ||
| + | | class="hintergrundfarbe9" rowspan=2 | 3,5 KByte RAM | ||
| + | |- align="center" | ||
| + | | $1000-$11FF || 4096-4607 | ||
| + | | class="hintergrundfarbe3" | Bildschirmspeicher | ||
| + | |- align="center" | ||
| + | | $0400-$0FFF || 1024-4095 || - | ||
| + | | class="hintergrundfarbe9" |3 KByte RAM (Speicherweiterung) || - | ||
| + | |- align="center" | ||
| + | | $0000-$03FF || 0-1023 | ||
| + | | class="hintergrundfarbe5" | Zeropage, Stack, erw. Zeropage | ||
| + | | class="hintergrundfarbe5" | Zeropage, Stack, erw. Zeropage | ||
| + | | class="hintergrundfarbe5" | Zeropage, Stack, erw. Zeropage | ||
| + | |} | ||
| + | |||
| + | <br /> | ||
| + | |||
| + | == Downloads == | ||
| + | |||
| + | * Firmware: [[Media:FE3FirmwareR022D.zip|Firmware R022D]] (Dank an Dirk Vroomen) | ||
| + | * Firmware: [[Media:FE3_CPLD_V3-2.zip|CPLD Design]] (Jedec und Sourcen) | ||
| + | * Schaltbild: [[Media:FE3-Schematic.jpg|FE3 Schematic]] | ||
| + | * Schaltbild: [[Media:VC20 schematic.pdf|VIC-20 Schematic]] | ||
| + | * Datasheet: [[Media:Atmel-CPLD-ATF1504AS(L)-Datasheet.pdf|Atmel CPLD ATF1504]] | ||
| + | * Aufbauanleitung: [[Media:FE3 Rev 11 Assembly.pdf|FE3 Rev.11 (PDF)]] | ||
| + | |||
| + | |||
| + | <br /> | ||
| + | |||
| + | == Links == | ||
[https://web.archive.org/web/20110530025234/http://vc20final.t-winkler.net/docu/internals.html alte Doku] | [https://web.archive.org/web/20110530025234/http://vc20final.t-winkler.net/docu/internals.html alte Doku] | ||
Aktuelle Version vom 2. September 2019, 23:54 Uhr
Inhaltsverzeichnis
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
- Firmware: Firmware R022D (Dank an Dirk Vroomen)
- Firmware: CPLD Design (Jedec und Sourcen)
- Schaltbild: FE3 Schematic
- Schaltbild: VIC-20 Schematic
- Datasheet: Atmel CPLD ATF1504
- Aufbauanleitung: FE3 Rev.11 (PDF)