Hallo Besucher, der Thread wurde 6,4k mal aufgerufen und enthält 10 Antworten

letzter Beitrag von Diddl am

VC20 Final Expansion - INTERN - technische Doku

  • 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:


    vc20-v2-2.GIF



    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.

  • Wäre das nicht gut im Wiki aufgehoben ?


    Bitte, tu dir keinen Zwang an, setz es ruhig in die Wiki.



    Oder darf ich das auch nochmal auf meiner Website verewigen..?


    Selbstverständlich, ist mir eine Ehre.


    Ich schreibe es auch irgendwann mal auf Meine.








    Ach ja, was ich noch vergessen habe:



    Im EEPROM Modus gehen Schreibzugriffe ins SRAM. Der 6502 liest also aus dem EEPROM und schreibt in das 'darunter' liegende RAM, ahnlich wie beim C-64. Auf die Art und Weise kann man zb. einfach den gesamten Block 5 aus dem EEPROM in das RAM kopieren:

    Code
    1. AD=10*4096
    2. FOR I=AD TO AD+8191
    3. :POKE AD,PEEK(AD)
    4. :NEXT
  • Schön, dass hier die Doku entsteht. Sehr anschaulich, gut erklärt!


    Aber die verwendeten Begrifflichkeiten gefallen mir überhaupt nicht. Im Label-Thread hatten wir dieses Thema schon einmal: das Ding ist immer noch kein EEPROM, sondern ein Flash.


    In der Wikipedia kann man einiges über die Unterschiede zwischen diesen beiden Speicherbausteinen nachlesen. Der dort verwendete Begriff "Flash-EEPROM" ist mir allerdings noch nie irgendwo anders vorgekommen und ich finde ihn eher verwirrend.


    Besser fände ich die Modi "Flash lesen" und "Flash schreiben".

  • Besser fände ich die Modi "Flash lesen" und "Flash schreiben".


    Magst du es umschreiben und nochmals anhängen? Bitte? Einfach zitieren und dann die [] wieder weg.



    Ich fände es auch nicht so schlecht wenn es dann nochmals jemand aus Benutzersicht beschreibt, weil wir es wahrscheinlich immer etwas kompliziert beschreiben. EIn Freiwilliger?

  • 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:


    vc20-2.GIF


    Damit man den gesamten Speicher der Final Expansion erreichen kann, gibt es ein Register an der Adresse 39936 ($9c00). Nach einem (Hard-) Reset bzw. nach dem Einschalten steht 0 in dem Register. Mit POKE 39936,X wird der Wert der Variablen X in das Register geschrieben. Mit PEEK(39936) kann man den Wert im Register auslesen.


    Das Register hat wie jedes Byte genau 8 Bit. Die obersten drei Bits (Bit 5,6 und 7) stellt die Betriebsart der Final Expansion ein. 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: bbbzzzzz).



    Die Final Expansion kennt 6 Betriebsarten:


    • Flash-Lese-Modus (000zzzzz):



      Mit POKE 39936,0 aktiviert man den Flash-Speicher 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 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 39936,128 aktiviert man das SRAM der Final Expansion. Es sind 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). Und zwar 3KB im ersten 32KB Block und der ganze zweite Block der 512KB des SRAM. Damit sind alle Lücken im VC-20 mit RAM gefüllt und damit der Maxmimal Ausbau an Speichererweiterung erreicht.


      Die Zusatzinfo in dem Register (zzzzz) steuert den Schreibschutz der RAM Blöcke. Bit 4 steuert Block 4, Bit 3 steuert Block 3, Bit 2 steuert Block 2, Bit 1 steuert Block 1 und Bit 0 steuert Block 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 eine ROM Cartridge zu emulieren. Erst schreibt man den ROM Inhalt in den RAM und dann schützt man ihn vor weiterem überschreiben. Manche Spiele Cartridges überschreiben sich selbst, damit sie nicht im RAM laufen.


    • RAM ohne IO Modus (110zzzzz):


      Mit POKE 39936,192 deaktiviert man das Register der Final Expansion. Ansonsten ist diese Betriebsart exakt dieselbe wie der normale RAM Modus. Das Register deaktiviert man, um es vor versehentlichen Überschreiben durch Fremdsoftware zu schützen.


      Der Nachteil ist, man kann die Final Expansion nicht mehr konfigurieren, wenn das Register erst mal deaktiviert ist. Erst ein Hard Reset oder aus- einschalten macht das Register wieder sichtbar.


    • Super RAM Modus (101zzzzz):


      Mit POKE 39936,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 EEPROM 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 wir, - man könnte zB. locker 3 ganze Disketten darin speichern ...


    • Modul Aus Modus (111zzzzz):


      Mit POKE 39936,224 schalten man die Final Expansion aus. Der VC-20 'sieht' die Cartridge nicht mehr, er verhält sich als wenn sie gar nicht im Erweiterungs Slot stecken würde. Es ist weder EEPROM noch SRAM sichtbar, auch das Register ist ausgeblendet. Die Final Expansion lässt sich nur mehr durch einen Hard Reset oder durch aus- einschalten wieder aktivieren.


    • Flash-Schreib-Modus (001zzzzz):


      Mit POKE 39936,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.

  • Die technische Doku der FEv3 wurde aktualisiert. Die technischen Änderungen auf v3.1 erhöhen die Hardware Kompatibilität zu anderen VC-20 Module:

    • Register Adresse geändert auf 39938
    • Einführung eines zweiten Registers (Adresse 39938) zum Ausblenden von Ressourcen
    • Einführung einer neuen Betriebsart "Start"
    • Einführung eines Lockbits nur in der Betriebsart "Start"
    • Zwei Betriebsarten sind obsolet durch das neue zweite Register
  • Nachtrag zur FE v3.1:



    Die Bits 5 und 6 des Register 2 sind bisher ungenutzt.


    Mit der v3 konnte man nur 32KB Blöcke selektieren. Nun kann man einzelne 8KB Blöcke per Register 2 abschalten. Das bedeutet aber, dass man auf diese abgeschaltenen 8KB Blöcke niemals mehr hin kommt ...




    Deshalb verwende ich die zwei übrigen Bits um eine Exclusiv Oder Verknüpfung mit den Pins A13 und A14 zu machen. Auf diese Weise kommt man wieder an den gesamten 512KB großen Speicher ran, selbst wenn man nur ein einziges 8KB Fenster frei hat ... :D


    ----------


    Also Nachtrag:


    + A13 kann nun mit RB.5 invertiert (EOR) werden.
    + A14 kann nun mit RB.6 invertiert (EOR) werden.

  • Änderungen in der FE3. 2:



    3KB Block ist IMMER vorhanden, in allen Modi außer Modus Start. Ausblendbar durch Register 2 Bit 0. Die Lokation ist im RAM Bank 0 Adresse $400 bis $1000



    • Super ROM Modus: Schreibzugriffe gehen wie immer in das RAM Bank 1


    • Modus RAM 1 (0x80): Die Bits im Register 1 funktionieren pro Block. Lesezugriffe kommen immer aus Bank 1. Schreibzugriffe gehen in Bank 1 (Bit = 0) oder in Bank 2 (Bit = 1).
      Im Block 0 wirkt das Register 1 Bit (Bit 0) als Schreibschutz.


    • Modus RAM 2 (0xC0): Die Bits im Register 1 funktionieren pro Block. Schreibzugriffe gehen immer in Bank 1. Lesezugriffe kommen aus Bank 1 (Bit = 0) oder aus Bank 2 (Bit = 1).
      Im Block 0 wirkt das Register 1 Bit (Bit 0) als Schreibschutz.


    • Modus ROM/RAM (0x60): Die Bits im Register 1 funktionieren pro Block. Bits aus Register 0 schalten zwischen ROM (Bit = 1) und RAM (Bit = 0).


      ROM wird eingeblendet aus Bank 0, Schreibzugriffe gehen ins RAM in die Bank 2.
      RAM wird eingeblendet aus Bank 1.
      Im Block 0 wirkt das Register 1 Bit (Bit 0) als Schreibschutz.