Universal Cartridge 2
Inhaltsverzeichnis
Die Universal Cartridge 2 (UC2)
Die UC-2 gehört zur Familie der Universal Cartridge (UC Modul). Es ist ein Steckmodul für die Homecomputer C64 und c128 von Commodore. In das UC Modul kann man eines oder mehrere Programme speichern bequem per Knopfdruck starten. Mit einem PC Programm (siehe UC-Builder) kann man eine eigene, individuelle Programmsammlung erstellen.
Allgemeine Informationen zu UC-Module: Universal Cartridge
Technische Spezifikation
- 512KB FLASH Speicher (zB. AM29F040)
- 512KB SRAM Speicher
- ein Banking Register
- ein Control Register
UC-2 im Commodore C64
Das UC-2 Modul läuft im Commodore C64 und unterstützt alle Standard Betriebsmodi für C64 Module. Es startet im 16K Modus und startet automatisch ein Menü Programm (UC-Menü). Der Autostart am C64 funktioniert nur, wenn man die Signale /EXROM und/oder /GAME setzt, ein c128 startet dann automatisch im C64 Modus.
Ab Board Revision 6c kann man per Jumper einstellen, ob das Modul an einem C64 oder einem c128 läuft. Dazu sollte die Multi Jedec Datei in den CPLD programmiert werden. Es können auch die Jedec Dateien für C64 und c128 verwendet werden, aber dann ist der Jumper wirkungslos.
Vor Board Revision 6c muss man die entsprechende Jedec Datei verwenden, je nachdem ob das Modul ein einem C64 oder einem c128 laufen soll.
UC-2 im Commodore c128
Das UC-2 Modul läuft im Commodore c128 und unterstützt beide Betriebsmodi (16K und 32K). Es startet automatisch ein Menü Programm (UC-Menü). Der Computer startet im c128 Modus, wenn die Signale /EXROM und /GAME nicht verwendet werden. Deshalb ist eine eigene Jedec Datei notwendig, wenn man den c128 Modus starten möchte.
Ab Board Revision 6c kann man per Jumper einstellen, ob das Modul an einem C64 oder einem c128 läuft. Dazu sollte die Multi Jedec Datei in den CPLD programmiert werden. Es können auch die Jedec Dateien für C64 und c128 verwendet werden, aber dann ist der Jumper wirkungslos.
Vor Board Revision 6c muss man die entsprechende Jedec Datei verwenden, je nachdem ob das Modul ein einem C64 oder einem c128 laufen soll.
Aufbau und Inbetriebnahme
Der Aufbau des UC2 Modul ist sehr simpel. Es kann sehr einfach selbst nachgebaut werden. Die Bauteile sind günstig und gut erhältlich. Auf SMD Bauteile wurde weitgehend verzichtet, damit es einfacher zu löten ist. Nur die 6 Stütz Kondensatoren zu je 100nF sind in SMD Technik ausgeführt.
Bauteile auf der UC-2 Platine
- ein CPLD ATF-1504
- ein FLASH Speicher mit 512KB (zB. AM29F040)
- optional ein SRAM mit 512KB
- optional Reset Taster A (Reset nur C64)
- optional Reset Taster B (Reset C64 und UC2)
- optional eine Diode für den Reset
- optional ein Spannungsregler 3,3V plus zweimal 10µF
- Kleinzeug: Stützkondensatoren
Für die Programmierung des Flash und des CPLD wird ein Programmiergerät benötigt. Der Flash kann optional auch vom C64 aus programmiert werden.
Der Reset Taster A kann ggf. weg gelassen werden, wenn man bereits einen Reset Taster am C64 hat.
Der Reset Taster B ist notwendig, damit man die UC2 zurücksetzen kann ohne den C64 ausschalten zu müssen.
Manche Module benötigen kein SRAM, dann kann man das SRAM einfach weg lassen (zB. COMAL-80).
Der Spannungsregler 3,3V ist nur notwendig, wenn man CPLD Typen verwendet die mit 3,3V laufen.
Welchen Zweck haben zwei Reset Taster? Angenommen man startet ein Modul Programm, das per Reset gestartet wird (zb. Jupiter Lander). Sobald das Programm gestartet ist, verhält sich die UC2 exakt wie das Modul Programm. Mit jedem C64 Reset kann man das Modul Programm jederzeit neu starten oder zurücksetzen. Wenn ich jedoch zurück ins UC2 Menü möchte, dann muss man den Reset B benutzen. Das wirkt dann wie aus- einschalten des C64.
Aufbau
Notwendige Werkzeuge für den Aufbau des UC2 Modul sind:
- Lötkolben oder Lötstation
- Zinn
Die IC sollten gesockelt werden, zumindest das FLASH und der CPLD. Wenn man alle Bauteile direkt einlötet, kann man den Flash Speicher nur noch auf der Platine programmieren. Den CPLD kann man direkt auf der Platine gar nicht mehr programmieren.
Am besten man fängt mit den Kondensatoren an (niedere Bauteile zuerst). Es sind 6 Stück zu je 100nF (vier für den CPLD und je einer für die Speicherbausteine). Wenn man einen 3,3V CPLD (ATF1505ASV) verwendet, dann müssen auch der 3,3V Regler und die beiden Kondensatoren zu je 10µF eingelötet werden. Im Falle eines 5V CPLD (ATF1504AS) kann man auf den Regler verzichten, aber es muss dir 5V Brücke geschlossen werden. Optional kann man eine drei polige Stiftleiste mit einem Jumper einbauen, wodurch die Platine konfigurierbar wird (Auswahl 3,3V oder 5V). Bei der Lösung mit dem Jumper muss aber die 3,3V Verbindung geöffnet (aufgekratzt) werden. Danach kommen die 3 IC Sockel. Optional kann man die beiden Taster einlöten oder mit Drähten verbinden. Nun kommt der RAM Chip in den Sockel. Vorsichtig, damit kein Pin verbogen wird beim rein drücken in den Sockel.
Der nächste Schritt ist die Programmierung des CPLD (falls der nicht schon programmiert ist). Es eignen sich die 5V Typen (ATF-1504AS, ATF-1504ASL) und auch die 3,3V Typen (ATF-1504ASV, ATF-1504ASVL). Für die 3,3V Typen muss der 3,3V Stabi und die beiden Kondensatoren eingebaut werden. Für die Programmierung benötigt man ein geeignetes Programmiergerät, siehe Doku zum ATF-1504. Wenn der Programmiervorgang erfolgreich war, dann kann man den CPLD in den Sockel setzen. Eine Ecke ist abgeflacht, diese Markierung muss übereinstimmen bei Sockel und IC.
Als letztes erfolgt die Programmierung des FLASH Speicher. Dazu können die meisten modernen EPROM Programmiergeräte (zB. TL866) verwendet werden. Dieser Schritt kann ggf. öfters wiederholt werden, wenn man andere UC2 Image Dateien probieren will. Am Ende kommt der Flash Baustein in seinen Sockel.
Die Programmierung des FLASH Baustein kann ggf. auch am C64 direkt stattfinden. Dazu dient das Utility UC2-Flasher. Allerdings benötigt man dazu einen Massenspeicher, der 512KB große Dateien verarbeiten kann. Es eignet sich zum Beispiel ein SD2IEC dafür. Der Vorgang dauert aber ziemlich lange, die Geschwindigkeit hängt ab von der Art wie der Massenspeicher zugegriffen wird. Mit Jiffy DOS ist die Dauer des Flash Vorgang deutlich verkürzt.
Inbetriebnahme
Wenn das Board fertig gelötet, der CPLD programmiert und eingesetzt ist, dann steht einer Inbetriebnahme nichts mehr im Wege.
Der Inhalt des Flash Speicher sollte eine garantiert funktionierende Image Datei sein. Ich verwende dazu die Datei 'MENU.BIN' aus dem ZIP Archiv mit den 'Beispiel Images'. Das Image enthält alle Arten von Programmen und auch den UC-FB, der mit der Taste <F1> gestartet werden kann. Wenn nun das UC-Menü erscheint, dann kann es schon mal nicht mehr allzu weit fehlen. Man kann kurz alle Programme starten und damit prüfen, ob das UC2 Modul einwandfrei arbeitet.
Wenn das UC-Menü nach dem einschalten nicht erscheint, dann bitte sofort abschalten. Ich teste dann den C64 ohne Modul, ggf. den Inhalt des Flash Speicher und auch den Inhalt des CPLD.
Falls Flash Speicher und CPLD in Ordnung sind, kann man mal ganz ohne jeden IC am UC2 Modul starten. Der C64 sollte normal starten, als wenn kein Modul angesteckt wäre. Man kann auch den CPLD in den Sockel stecken und der C64 sollte mit 30K freien Speicher starten (8K Modus). Ohne CPLD darf kein Speicher auf dem UC2 Modul sein, denn dann hängen die Select Leitungen in der Luft.
Der SRAM muss nicht gesteckt sein, der ist immer optional. Das UC-Menü sollte trotzdem kommen, auch wenn das SRAM nicht vorhanden ist. Man kann auch alle PRG (OneFiler) und CRT im Modus 'ROM' ohne den SRAM starten. Nur für die CRT Dateien die im Cartridge Modus laufen, benötigt man den SRAM Baustein. Der UC-Filebrowser ist auch eine 8KB CRT Datei, deswegen benötigt der auch ein funktionierendes SRAM.
Wenn das UC-Menü nicht kommt, obwohl Flash Speicher und CPLD in Ordnung sind, dann liegt es wohl an der Platine selbst. In diesem Fall empfehle ich eine optische Kontrolle der Lötstellen und den Einsatz eines Ohmmeter. Bitte kontrollieren Sie mit dem Ohmmeter folgende Dinge:
- liegt der Anschluss GND an den IC Pins an
- liegt der Anschluss 5V an den IC Pins an
- gibt es einen Kurzschluss zwischen GND und 5V
- liegt GND an einem PIN am C64 Port an
- liegt GND an einem IC PIN wo kein Ground sein sollte
- zuletzt mit dem Schaltbild alle Leitungen kontrollieren (Adressbus, Datenbus, Steuerleitungen, Verbindungen vom CPLD zu den Chips und zum C64 Connector)
Technik der UC2
Die Technik des UC2 Modul besteht aus einem CPLD und zweier Speicherbausteine.
CPLD Baustein
Dank dieses programmierbaren Logik Baustein (CPLD ATF-1504AS) ist das Design der UC2 extrem reduziert und einfach. Der CPLD ersetzt etliche TTL Bausteine und erhöht gleichzeitig die Flexibilität, weil man bei Bedarf die Logik sehr einfach und schnell ändern und anpassen kann.
Der CPLD muss mit der UC2 Jedec Datei programmiert werden. Die Programmierung des CPLD kann mit einem Programmiergerät (zB. GALEP-5) oder einem JTAG Programmer durchgeführt werden. Weitere Informationen zum CPLD und zu der Programmierung über JTAG stehen auf der ATF-150x Seite.
Mit der R4 Platine kann man nun auch die 3,3V CPLD Typen verwenden (ATF1504-ASV). Die R4 hat einen 3,3V Regler. Die Bestückung des Regler und der beiden 10µF Kondensatoren ist optional und für 5V CPLD nicht notwendig. Man muss aber die gewünschte Spannung einstellen. Dazu kann man eine Steckleiste einlöten (Auswahl durch Steckbrücke) oder man lötet einfach einen Draht ein.
Mit der R5 Platine ist die 3,3V Versorgung für den CPLD (ASV Type) vorbelegt. Man kann auf die Stiftleiste und die 3,3V Drahtbrücke verzichten, wenn man 3,3V CPLD verwendet. Wenn man einen 5V CPLD verwendet, und den Regler nicht einbaut, muss die 5V Drahtbrücke (oder die Stiftleiste + Steckbrücke) eingelötet werden.
ACHTUNG: Wenn man den 3,3V Regler einlötet und 5V CPLD verwendet, dann muss man die 3,3V Verbindung J1 trennen! Einfach mit dem Cutter die Verbindung J1 vorsichtig trennen.
- Folgende CPLD Typen sind getestet und funktionieren
- ATF1504-AS (5V Type)
- ATF1504-ASV (3,3V Type)
- ATF1504-ASL (5V low Power)
- ATF1504-ASVL (3,3V low Power)
Das JEDEC File ist für alle 4 Typen das selbe.
Es gibt auch Jedec Dateien, um das UC-2 Modul kompatibel zu machen zu anderen Cartridges, zB. EasyFlash und Magic-Desk. Dadurch kann man die UC-2 für Spiele nutzen, die nur für andere Hardware verfügbar sind. Zum Beispiel gibt es das großartige Spiel 'Prince of Persia' nur für das EasyFlash. Mit dem EF Jedec kann man 'Prince of Persia' auf einer UC-2 spielen.
Speicher
Die beiden Speicherbausteine (Flash und SRAM) sind am Adressbus (A0 bis A13) und am Datenbus des C64 angeschlossen. Die Steuerung (Chip-Select und Write-Enable) wird vom CPLD gesteuert. Der CPLD entscheidet, ob und welcher der beiden Speicher im Adressraum des C64 eingeblendet wird. Beim SRAM und FLASH gibt es die Möglichkeit, es schreibend zuzugreifen. Der Flash kann natürlich nur über die Hersteller spezifischen Magic Bytes schreiben zugegriffen werden.
Mögliche Adressräume im C64:
- LoROM ($8000 bis $9FFF)
- HiROM ($A000 bis $BFFF oder $E000 bis $FFFF im Ultimax Mode)
- IO1 Bereich ($DE00 bis $DEFF)
- IO2 Bereich ($DF00 bis $DFFF)
- der SRAM kann im Bereich $4000 bis $BFFF schreibend zugegriffen werden
Mögliche Adressräume im c128:
- LoROM ($8000 bis $BFFF)
- HiROM ($C000 bis $FEFF)
- IO1 Bereich ($DE00 bis $DEFF)
- IO2 Bereich ($DF00 bis $DFFF)
- der SRAM kann im Bereich $8000 bis $BFFF schreibend zugegriffen werden
Der Flash Speicher in dem UC2 Modul wird nur als 'Massenspeicher' benutzt.
Im Falle, der Benutzer startet ein Programm vom Typ PRG (One-Filer), wird das Programm ab $0801 in den Speicher des C64 geladen. Danach schaltet sich das UC2 ab und es wird das Programm mit RUN gestartet. Das RAM im UC2 Modul ist da nie involviert.
Ein Programm vom Typ BIN oder BLK wird an beliebiger Adresse geladen. Im Falle von BIN wird die Ladeadresse aufgrund der ersten beiden Bytes der Datei ermittelt. Der Typ BLK wird ab der Adresse geladen, die in der CSV Datei steht. Nach dem Laden der Datei wird die Startoption ausgeführt, die in der CSV Datei definiert wurde.
Alle anderen Programmtypen (8K, 16K und Ultimax) benötigen das RAM der UC2. Das Programm wird in den UC2 RAM geladen und die Signale /GAME und /EXROM werden je nach Modul Typ gesetzt. Danach wird der RAM schreib-geschützt und ein Reset des C64 ausgelöst. Das UC2 Modul verhält sich dann exakt wie ein einfaches 8K oder 16K Modul.
Im Ultimax Modus können nur bestimmte Paket Größen verwendet werden: 1K, 2K, 4K, 8K und 16K
Das Paket wird gespiegelt, sodass immer 16K zur Gänze ausgefüllt sind.
Eine Stärke des UC2 Modul ist, dass der UC2 RAM schreib geschützt werden kann. Dadurch erscheint das flexible RAM wie ein ROM, das nicht überschrieben werden kann.
Und dadurch kann man Modul Dateien (8K CRT, 16k CRT und Ultimax CRT) auch von Diskette oder SD-Karte laden. Für diesen Zweck gibt es den modifizierten FB (File Browser). Man kann damit direkt auf CRT Dateien zugreifen und diese 'starten'.
CPLD als Register
Die Logik im CPLD implementiert intern zwei Register zur Konfiguration der UC2.
Die Register können vom C64 aus nur schreibend und lesend zugegriffen werden. Der Schreibzugriff kann im ganzen IO-1 Adressbereich erfolgen (Adresse $DExx). Der Zugriff auf die Register kann aber auch abgeschaltet werden, sodass die Einstellungen der UC2 nicht mehr versehentlich verändert werden können.
- Die Register haben 11 Ausgänge zur Steuerung der UC2 Hardware
- fünf Pins dienen dem Banking und selektieren eine 16K Bank (32 Banks)
- zwei Pins steuern Signale zum C64 (/EXROM und /GAME)
- vier Pins steuern den Zugriff auf die Speicher Bausteine (FLASH und SRAM: OE, CS, WE)
Nach dem Einschalten des C64 (oder einem B Reset) sind alle Ausgänge der Register auf Low (Grundzustand).
Das schaltet die Speicher auf Bank 0, selektiert das FLASH und schaltet den C64 in den Cartridge Modus '16K'.
Im FLASH ist auf Bank 0 ganz am Anfang der UC-Loader gespeichert der nun das UC-Menü anzeigt ...
Commodore c128
Das UC-2 funktioniert auch am Commodore c128. Dazu muss ein anderes Jedec File in den CPLD geschrieben werden.
Die neue CPLD Logik lässt die Signale /EXROM und /GAME am Cartridge Port auf logisch high. Dadurch ist das Modul auf einem C64 unsichtbar. Die Register am IO-1 sind aber weiterhin sichtbar, wodurch das Modul per POKE Befehl auch am C64 aktiviert werden kann.
Die Funktionsweise ist ansonsten identisch zu einer C64 Version des Jedec File.
Freezer Funktion
Das UC-2 funktioniert auch als Freezer Modul. Allerdings ist die Software noch im experimentellen Zustand. Die Voraussetzungen sind Hardware Revision 7 (oder ein Patch Draht auf der Rev. 6a) und eine spezielle Logik im CPLD.
Bei einer Platinen Revision vor 7 muss ein Draht eingelötet werden. Die Freezer Funktion braucht das NMI Signal vom C64 Erweiterungsport.
Die neue CPLD Logik implementiert zwei zusätzliche Flip Flops. Das eine FF ist ein Bit im Control Register und aktiviert die Freezer Funktion. Das zweite FF wird gesetzt durch das NMI Signal, wenn die Funktion durch das erste FF aktiviert ist. Wenn nun beide FF gesetzt sind, dann aktiviert sich das UC-2 im Ultimax Modus. Die CPU ladet den NMI Vektor aus dem UC-2 EPROM und führt den Code aus. Durch lesen des UC-2 Control Register wird das zweite FF zurückgesetzt.
Die neue NMI Funktionalität erlaubt auch die Rückkehr ins UC-Menu trotz deaktiviertem IO Port. Normalerweise kann man das UC Modul nur durch einen Reset reaktivieren, wenn das Modul deaktiviert und das IO Register deaktiviert wurde. Das funktioniert, weil die UC Register immer sichtbar sind, solange das zweite FF gesetzt ist.
Die neue CPLD Logik ist 100% kompatibel zur alten Logik. Alle bestehenden UC Images funktionieren auch in der Hardware Revision 7.
Programmierung der UC2 (C64 Modus)
Für die UC2 gibt es fertige Software:
- UC-Builder --- ein Tool für die Windows Kommandozeile für die Erstellung eigener Image Dateien
- UC-Loader --- dieser Code ist in jeder UC Image Datei als Startcode und zur Programm Auswahl (UC Menü)
- UC-FB --------- ein optionaler Datei Browser auf Basis des bewährten Tool FB
Eigener Startcode
Der Startcode (UC-Loader) kann durch eigenen Code ersetzt werden.
Der eigene Code kann mit einem Assembler wie zB. dem DASM erstellt werden. Der UC-Builder schreibt den Startcode immer ganz am Anfang der UC Image Datei. Normalerweise verwendet der UC-Builder immer automatisch den internen Startcode (UC-Loader). Wenn der UC-Builder aber eine Datei namens UC2-loader.prg findet, dann verwendet er diese Datei als Startcode und schreibt es an den Anfang der Image Datei.
Wenn man eigene Software für das UC2 Modul entwickeln möchte sind folgende Infos nützlich:
- das UC2 Modul startet immer im 16K Cartridge Modus (passende Initialisierung!)
- das UC2 Register liegt im ganzen Bereich IO-1 ($DExx)
- die selektierte Bank hat immer eine Größe von 16KB (auch wenn nur 8KB sichtbar sind)
- je nach Modus 'sieht' der C64 8KB ab $8000, 16KB ab $8000 oder 8KB ab $8000 und 8KB ab $E000
- es ist möglich, ein eigenes Menü Programm zu verwenden das vom UC-Builder in eine Image Datei geschrieben wird
- der UC RAM hat 2 Banks und hat pro Bank auch immer eine Größe von 16KB
- zum LESEN kann nur entweder FLASH oder RAM eingeblendet sein
- das SCHREIBEN in den UC RAM funktioniert immer, wenn Schreiben erlaubt ist (UC Register -- write enable)
- das Schreibfenster ist gespiegelt und liegt von $4000 bis $8000 und von $8000 bis $C000
- der IO Bereich (IO-1 und IO-2) enthält beim LESENDEN Zugriff die obersten 512 Bytes des UC RAM (selektierte Bank)
- über den IO Bereich IO-2 kann der UC RAM geschrieben werden, wenn Schreiben erlaubt und der Flash Speicher selektiert ist (UC Register -- write enable)
- über den IO Bereich IO-1 kann der UC RAM geschrieben werden, wenn Schreiben erlaubt und der Flash Speicher selektiert und das IO Register ausgeschaltet ist
Eigener File Browser Code
Der File Browser (UC-FB) kann durch eigenen Code ersetzt werden.
Der eigene Code kann mit einem Assembler wie zB. dem DASM erstellt werden. Der UC-Builder schreibt den FB Code in eine UC Image Datei, wenn in der CSV Datei ein Menü Eintrag 'F1' existiert. Normalerweise verwendet der UC-Builder immer automatisch den internen File Browser (UC-FB). Wenn der UC-Builder aber eine Datei namens UC2-FB.prg findet, dann verwendet er diese Datei als File Browser. Der eigene File Browser kann dann vom UC-Menü mit der Taste <F1> gestartet werden.
Durch die bloße Existenz der Datei UC2-FB.prg wird also generell ein eigener Code verwendet. Alternativ dazu kann ein eigener File Browser Code auch ganz einfach in der CSV Datei eingebunden werden. Dazu benötigt man nur eine ganz normale Zeile in der CSV Datei, wobei der Menüeintrag "F1" heißen muss.
Wenn man einen eigenen FB Code entwickeln möchte sind folgende Infos nützlich:
- der Code kann wie bei jedem Menü Eintrag vom Typ PRG, 8K, 16K, Ultimax oder CRT sein
- nach dem Start durch die Taste <F1> ist das IO Register sichtbar, das Modul kann also noch konfiguriert werden
Die Register
Die beiden UC2 Register liegen im IO-1 Block an Adresse $DE02 und $DE03. Die Register können gelesen und geschrieben werden. Die UC Register können 'versteckt' werden (UC Register B -- IO disable). Nachdem das Bit gesetzt wird kann das UC2 Modul nicht mehr konfiguriert werden. Die UC Register sind erst nach einem Hard Reset wieder sichtbar.
- UC2 Register A
- Bit 0 --- Banking A14
- Bit 1 --- Banking A15
- Bit 2 --- Banking A16
- Bit 3 --- Banking A17
- Bit 4 --- Banking A18
- UC2 Register B
- Bit 2 --- MAX Machine Mode
- Bit 3 --- IO Register disable (1 - Register sind unsichtbar)
- Bit 4 --- SRAM write enable (1 - SRAM kann beschrieben werden)
- Bit 5 --- SRAM select (1 - RAM, 0 - FLASH)
- Bit 6 --- Signal /GAME (GAME und EXROM bestimmen den C64 Cartridge Modus)
- Bit 7 --- Signal /EXROM (GAME und EXROM bestimmen den C64 Cartridge Modus)
Der MAX Machine Modus ermöglicht den Betrieb der UC2 in einer MAX Machine (der normale Betrieb ist nur für eine C64 Hardware gedacht). Der Modul Port der MAX Machine ist unterschiedlich zum Modulport des C64 (betrifft PIN 6-10 und 13).
Sobald das Bit für 'MAX Machine Mode' gesetzt ist, gelten folgende Umstände:
- der Modul Betriebsmodus ist beschränkt auf Ultimax (/Game low, /EXROM hi) und 16K (/Game low, /EXROM low)
- IO-1 selektiert UC RAM in der Bank 1 (2K Zusatz RAM ab $0800 für MAX BASIC)
- IO-2 ist verbunden mit /EXROM (PIN 9 und 10)
Der Modul RAM
Der RAM des UC2 Modul ist gedacht als "ROM Ersatz", den man sehr schnell und einfach beschreiben kann. Dadurch kann man ROM Module einfach als CRT Datei laden und ausführen.
Will man den RAM aber als 512K Speichererweiterung benutzen, dann muss man folgende Dinge beachten. Beim C64 liegt RAM im gesamten 64K Adressraum. Dieser C64 eigene RAM wird immer beschrieben, auch wenn ein ROM oder das UC-RAM sichtbar sind. Die einzige Ausnahme ist, wenn der C64 sich im Ultimax Modus befindet. Nur im Ultimax Modus kann man den UC2 RAM beschreiben, ohne gleichzeitig einen C64 eigenen RAM zu beschreiben. Die Methode ist also, in den Ultimax Modus zu wechseln (/GAME = 0 und /EXROM = 1), ein oder mehrere Bytes zu schreiben und wieder in den normalen Zustand zurück zu kehren.
Das UC-Ram ist zusätzlich sichtbar im IO Adress-Bereich (IO-1 und IO-2). Damit hat man bis zu 512 Byte zusätzlichen Speicher zur Verfügung. Der Speicher kann auch mit Schreibschutz betrieben werden, wodurch man quasi ein ROM im IO Bereich sieht. Lesend sind immer die ganzen 512 Byte verfügbar. Schreibend sind nur 256 Bytes des IO-2 verfügbar. Der IO-1 Bereich kann schreibend zugegriffen werden, wenn das UC Register ausgeblendet ist (IO Register disable). Der Schreibzugriff ins UC RAM über den IO Bereich funktioniert nur, wenn schreiben erlaubt ist (SRAM write enable Bit) und der Flash Speicher selektiert ist (SRAM select Bit = 0).
Das RAM im IO Bereich ist nutzbar, selbst wenn der C64 im Modus "kein Modul" läuft (/EXROM =1 und /GAME = 1). Das bietet eine ideale Sprungleiste für eine "unsichtbare" Modul Software. Man denke zB. an eine BASIC Erweiterung, zusätzliche Befehle für das BASIC. Normalerweise kostet ein Modul immer 8KB Speicher, der C64 meldet sich mit 30KB frei statt wie sonst 38KB. Mit einem "unsichtbaren Modul" kann man wie gewohnt 38KB freien Speicher haben, und doch auch glz. die Befehlserweiterung. Dazu verbiegt man die Vektoren für BASIC Erweiterung auf den IO Bereich (IO-2). Da liegt nun ein Code, der das Modul einschaltet, den gewünschten Code ausführt und danach das Modul wieder deaktiviert.
Programmierung der UC2 (c128 Modus)
Das UC-2 Modul funktioniert auch in einem Commodore c128. Allerdings startet der Rechner automatisch im C64 Modus, wenn ein UC-2 Modul im Erweiterungsport steckt. Das liegt daran, weil das UC-2 Modul nach einem Reset die Signale /EXROM und /GAME auf Low ziehen. Das ist notwendig, damit man einen automatischen Programmstart des UC-Menü hat.
Das UC-2 Modul unterstützt auch den nativen c128 Modus. Im c128 Modus werden die Signale /EXROM und /GAME nach einem Reset auf logisch High gesetzt. Dadurch startet der c128 im Modus c128 und nicht als C64. Für den Betrieb der UC-2 als c128 Modul braucht es eine eigene Jedec Datei(C128 Jedec). Ab UC-2 Revision 6c kann der c128 Modus per Jumper (JP2) eingestellt werden.
Ein c128 Modul unterstützt ein 32K großes Eprom an der Adresse $8000 bis $BFFF (MID) und $C000 bis $FFEF (HIGH). Beim Banking wäre es also nur logisch auf 32K große Seiten zu setzen. Bei einer Speichergröße von 512K wären das dann 16 Seiten zu 32K. Aus technischen Gründen ist das Banking beim UC-2-128 aber auf 16K große Seiten eingestellt. Es gibt also 32 Seiten zu je 16K, was die Granularität des Banking Register angeht.
Die Seitengröße im c128 Modus ist 32K. Das Bit 0 des Banking Register ist daher scheinbar überflüssig. Mit gesetztem Bit 0 legt man die oberen 16K der Seite herunter auf die Adresse der unteren Seite ($8000). Mit anderen Worten: man kann wahlweise mit 16K Seiten arbeiten oder mit 32K Seiten. Bei 32K großen Seiten muss man das Banking Register mit geraden Zahlen beschreiben (also Bit 0 immer Null).
Was spricht für die Seitengröße von 16K bzw. 32K:
- 16K Seiten haben keinen Konflikt mit dem IO Bereich ($Dxxx)
- 16K Seiten haben keinen Konflikt mit dem Kernal($E000 bis $FFFF)
- 16K Seiten haben keinen Konflikt mit den obersten 256 Byte (MMU und Fix-ROM)
- 16K Seiten sind notwendig, wenn man den UC-RAM beschreiben will ohne Konflikte mit der MMU
- 32K Seiten sind praktisch für große Programme
- 32K Seiten sind notwendig, wenn man Modul Programme hat die den Bereich nutzen (zB. COMAL-80 für den c128)
Für die UC-2 im c128 Modus gibt es dieselbe Software wie für die UC-2 beim C64:
- UC-Builder ------ ein Tool für die Windows Kommandozeile für die Erstellung eigener Image Dateien
- UC-Loader-128 -- dieser Code ist in jeder UC Image Datei als Startcode und zur Programm Auswahl (UC Menü)
- UC-FB-128 ------- ein optionaler Datei Browser auf Basis des bewährten Tool FB
Eigener Startcode
Der Startcode (UC-Loader) kann durch eigenen Code ersetzt werden.
Der eigene Code kann mit einem Assembler wie zB. dem DASM erstellt werden. Der UC-Builder schreibt den Startcode immer ganz am Anfang der UC Image Datei. Normalerweise verwendet der UC-Builder immer automatisch den internen Startcode (UC-Loader). Wenn der UC-Builder aber eine Datei namens UC2-loader-128.prg findet, dann verwendet er diese Datei als Startcode und schreibt es an den Anfang der Image Datei.
Wenn man eigene Software für das UC2 Modul entwickeln möchte sind folgende Infos nützlich:
- das UC2 Modul startet immer im C128 Modus als "32K im externen ROM" (passende Initialisierung!)
- das UC2 Register liegt im ganzen Bereich IO-1 ($DExx)
- die selektierte Bank hat immer eine Größe von 32KB
- es ist möglich, ein eigenes Menü Programm zu verwenden das vom UC-Builder in eine Image Datei geschrieben wird
- der UC RAM hat 16 Banks zu je 32K (genau wie der FLASH Speicher)
- zum LESEN kann nur entweder FLASH oder RAM eingeblendet sein
- das SCHREIBEN in den UC RAM funktioniert immer, wenn Schreiben erlaubt ist (UC-2 Control Register)
- das Schreibfenster hat nur 16K und liegt an der Adresse $8000 bis $C000
- der IO Bereich (IO-2) kann optional 256 Bytes des UC RAM spiegeln
- über den IO Bereich IO-2 kann der UC RAM geschrieben werden, wenn Schreiben erlaubt und der Flash Speicher selektiert ist (UC-2 Control Register)
Eigener File Browser Code
Der File Browser (UC-FB) kann durch eigenen Code ersetzt werden.
Der eigene Code kann mit einem Assembler wie zB. dem DASM erstellt werden. Der UC-Builder schreibt den FB Code in eine UC Image Datei, wenn in der CSV Datei ein Menü Eintrag 'F1' existiert. Normalerweise verwendet der UC-Builder immer automatisch den internen File Browser (UC-FB-128). Wenn der UC-Builder aber eine Datei namens UC2-FB128.prg findet, dann verwendet er diese Datei als File Browser. Der eigene File Browser kann dann vom UC-Menü mit der Taste <F1> gestartet werden.
Durch die bloße Existenz der Datei UC2-FB128.prg wird also generell ein eigener Code verwendet. Alternativ dazu kann ein eigener File Browser Code auch ganz einfach in der CSV Datei eingebunden werden. Dazu benötigt man nur eine ganz normale Zeile in der CSV Datei, wobei der Menüeintrag "F1" heißen muss.
Wenn man einen eigenen FB Code entwickeln möchte sind folgende Infos nützlich:
- der Code kann wie bei jedem Menü Eintrag vom Typ PRG128 oder CRT128 sein
- nach dem Start durch die Taste <F1> ist das IO Register sichtbar, das Modul kann also noch konfiguriert werden
Die Register
Die beiden UC2 Register liegen im IO-1 Block an Adresse $DE02 und $DE03. Die Register können gelesen und geschrieben werden. Die UC Register können 'versteckt' werden (UC Register B -- IO disable). Nachdem das Bit gesetzt wird kann das UC2 Modul nicht mehr konfiguriert werden. Die UC Register sind erst nach einem Hard Reset wieder sichtbar.
- UC2 Register A ($DE02)
- Bit 0 --- Banking A14
- Bit 1 --- Banking A15
- Bit 2 --- Banking A16
- Bit 3 --- Banking A17
- Bit 4 --- Banking A18
- UC2 Register B ($DE03)
- Bit 2 --- MAX Machine Mode
- Bit 3 --- IO Register disable (1 - Register sind unsichtbar)
- Bit 4 --- SRAM write enable (1 - SRAM kann beschrieben werden)
- Bit 5 --- SRAM select (1 - RAM, 0 - FLASH)
- Bit 6 --- Signal /GAME (GAME und EXROM bestimmen den C64 Cartridge Modus)
- Bit 7 --- Signal /EXROM (GAME und EXROM bestimmen den C64 Cartridge Modus)
Der Modul RAM
Der RAM des UC-2 Modul ist gedacht als "ROM Ersatz", den man sehr schnell und einfach beschreiben kann. Dadurch kann man ROM Module einfach als CRT128 Datei laden und ausführen.
Will man den RAM aber als 512K Speichererweiterung benutzen, dann muss man folgende Dinge beachten. Beim C128 liegt RAM im gesamten 64K Adressraum. Dieser C128 eigene RAM wird immer beschrieben, auch wenn ein ROM oder das UC-RAM sichtbar sind. Leider hat Commodore genau wie beim C64 nicht vorgesehen, dass man RAM in einem Modul hat. Deshalb ist ein Schreiben in den Modul Speicher nicht vorgesehen, alle Schreibzugriffe laufen in das interne RAM des c128. Oder anders gesagt, man kann das UC RAM nicht beschreiben, ohne den Inhalt des internen RAM zu zerstören.
Das UC-Ram kann zusätzlich im IO-2 Bereich eingeblendet werden. Damit hat man 256 Byte zusätzlichen Speicher zur Verfügung, der nicht der Sichtbarkeit des Modulspeicher unterliegt. Der IO-2 ist sichtbar, wenn er in der MMU selektiert wird. Damit ist mit dem IO Bereich ein Stück Modulspeicher sichtbar, ideal für ein API oder eine Befehlserweiterung.
Der IO-2 kann auch ohne Schreibschutz betrieben werden. Man hat dadurch ein paar Byte um etwas zu speichern, unabhängig vom herkömmlichen RAM Bereich des Rechner.
Entwicklung und erste Prototypen
Mein erster Versuch ein C64 Modul zu machen war die UC1. Das Ziel ist aber wesentlich mehr Speicher zur Verfügung zu stellen. Die erste Überlegung war die UC1 zu erweitern. Ein zweites D-Latch und ein paar Änderungen im GAL führen zur UC2. Allerdings hätte man dann neben den beiden Speicherbausteinen noch DREI weitere IC benötigt. Die Alternative ist ein CPLD statt einem GAL und zweier TTL.
Der CPLD hat den Nachteil, dass man für die Programmierung spezielle Hardware benötigt (JTAG Adapter).
- Es gibt aber auch Vorteile
- es braucht weniger Platz auf der Platine
- es braucht weniger Strom
- die Register können auch gelesen werden
- das Konzept hat Platz für komplexe Erweiterungen
Support für andere Modul Typen
MagicDesk
Beim UC-2 Modul kann man ein MagicDesk Modul emulieren über ein passendes Jedec File für den CPLD. Allerdings funktioniert das nur bis zur halben EPROM Größe. Der Grund ist, die Page Größe bei MagicDesk ist 8KB und bei dem UC Modul 16KB. Für jede Page im MagicDesk Modus bekommt man 8KB und benötigt aber eine 16KB Page, die oberen 8KB der UC Page ist leider nicht nutzbar.
Das MagicDesk Modul ist eine EPROM Cartridge mit bis zu einem MB. Das Banking wird über ein Register an der Adresse $DE00 (IO-1) gesteuert. Das Modul startet im 8KB Modus des C64. Die Bits 0 bis 5 dienen zur Auswahl der 8K Bank.
Das Bit 7 des Register steuert das Signal /EXROM. Nach einem Reset wird Low ausgegeben, wodurch der C64 im 8K Modul Modus startet. Durch schreiben von $80 an die Adresse IO-1 wird das Modul deaktiviert.
Das Bit 6 des Register steuert die Sichtbarkeit des IO Register. Damit kann man verhindern, dass ein deaktiviertes Modul wieder eingeschaltet wird. Die 1MB Module verwenden Bit 6 für das Banking. Manche Module unterstützen das Bit 6 gar nicht, andere schalten die Funktion von Bit 6 per Jumper Brücken.
EasyFlash
Beim UC-2 Modul kann man ein EasyFlash Modul teilweise emulieren über ein passendes Jedec File für den CPLD. Dadurch laufen auf dem UC-2 Modul viele Programme, die für das EasyFlash gemacht worden sind, wie zB. das Spiel 'Prince of Persia'.
Das EasyFlash Modul ist eine FLASH Cartridge mit einer Größe von einem MB. Es unterstützt alle Modul Typen des C64 (8K, 16K, UltiMax). Die beiden Flash Bausteine können vom C64 aus beschrieben werden. Das EasyFlash hat SRAM, von dem 256 Bytes eingeblendet werden an der Adresse $DFxx (IO-2). Für das EasyFlash gibt es ein BIOS, das die Funktionalität des Modul unterstützt. Das Modul startet im UltiMax Modus des C64 oder optional deaktiviert (per Jumper steuerbar).
Das Banking wird über ein Register an der Adresse $DE00 (IO-1) gesteuert. Ein zweites Register an der Adresse $DE02 steuert die Funktionen es Modul.
MultiMax
Für das UC-2 und das UC-1.5 Modul existiert ein modifiziertes MultiMax Image. Damit kann man das MultiMax Modul emulieren auf dem UC Modul. Das MultiMax läuft exakt gleich wie auf einer echten MultiMax Hardware.
Das MultiMax Modul ist eine Speicher Cartridge, die alle klassischen UltiMax Spiele beinhaltet die es gibt. Dazu gibt es ein nett gemachtes Menü, über das die Spiele ausgewählt und gestartet werden.
COMAL-80
Beim UC-2 Modul kann man ein COMAL-80 Modul emulieren über ein passendes Jedec File für den CPLD. Allerdings kann das COMAL bauartbedingt nur 128KB des Modul Speicher nutzen. Prinzipiell lässt sich aber der gesamte Speicher zugreifen.
Es funktionieren alle Comal-80 Images die ich so gefunden habe, auch das 128K große PAKMA Comal-80.
Das SRAM ist unnötig für COMAL-80, man kann es einfach weg lassen.
Das Comal-80 Modul ist eine EPROM Cartridge mit bis zu 96KB (drei EPROM zu je 32K). Die EPROM's U1 und U2 beinhalten das eigentliche COMAL. Der dritte Sockel U3 ist normalerweise frei. Man kann da COMAL Erweiterungen installieren (ZB. die Super Chip Erweiterung). Mit einer kleinen Hardware Modifikation unterstützt das Modul sogar 4 EPROM's (insgesamt 128KB), zB. die PAKMA Erweiterung nützt die ganzen 128KB.
Das Banking wird über ein Register an IO-1 (Adresse $DE00) gesteuert. Das Bit 0 steuert A14 von allen EPROM und wählt damit die unteren 16K oder die oberen 16K. Die Bits 1 und 2 wählen eines der EPROM aus (00=U1, 01=U2, 02=U3). Mit 11 würde man das optionale vierte EPROM selektieren, allerdings ist im Modul kein vierter Sockel vorhanden. Der Hardware Umbau erfordert zwei Dioden und ein 64K EPROM. Mit den zwei Dioden kombiniert man die Selektion von U3 und U4.
Das Bit 6 des Register steuert die Signale /EXROM und /GAME. Nach einem Reset wird Low ausgegeben, wodurch der C64 im 16K Modul Modus startet. Durch schreiben von $40 an die Adresse IO-1 wird das Modul deaktiviert. Spätere COMAL Module können /EXROM und /GAME separat steuern über Bit 5 und 6. Damit könnte man auch in den 8K und in den UltiMax Modus wechseln, das wird aber von keiner COMAL Version unterstützt. Um sicher zu stellen, dass die Modul Abschaltung funktioniert, sollte man daher zum abschalten des Modul den Wert $60 in das Register schreiben. Das funktioniert mit allen COMAL Modulen.
Mit einem speziellen Jedec File wird nun auch COMAL-80 für den Commodore c128 unterstützt. Diese spezielle Version hat beide COMAL Versionen (v2.02 für den c128, v2.01 für den C64) in einem Modul.
Das COMAL-80 Paket im Download beinhaltet 3 Versionen:
- COMAL-80 für C64
- COMAL-80 für c128
- COMAL-80 hybrid für c128 (Bootmenü für c128 oder C64 Modus)
PageFox
Das UC-2 kann man mit einer speziellen JEDEC Datei in ein PageFox Modul verwandeln. Es werden dabei nur die ersten 64K des FLASH Speicher benutzt und zweimal 16K des SRAM. Das JEDEC ist im Test und wird veröffentlicht sobald alle Funktionen getestet sind.
Der Standard Betrieb der UC-2 sieht vor, dass man den C64 RESET abkoppelt vom Reset der UC-2 Cartridge (ZWEI Reset Kreise).
Daraus resultiert die Tatsache, dass das UC-2 zwei Reset Taster hat (links: C64 / rechts: C64 + UC-2).
Das macht durchaus Sinn im regulären UC-2 Betrieb mit einem UC-Menü.
Die Spezialfälle COMAL-80 und PageFox jedoch erfordern, dass ein C64 Reset auch das UC-2 Modul zurücksetzen (EIN Reset Kreis).
Der Grund: wenn man einen RESET auslöst, während gerade nicht BANK 0 selektiert ist, dann startet der C64 u.U. nicht richtig.
Lösung:
Die Trennung in zwei RESET Kreise erfolgt über die Diode D1 am UC-2 Modul. Für einen Betrieb mit EINEM Reset Kreis ersetzt man die Diode einfach durch eine Brücke (oder macht zusätzlich eine Brücke).
Für den Betrieb mit einem RESET Kreis:
- spart man sich die Diode
- spart man sich auch den rechten Taster
- lötet eine Brücke ein statt der Diode
Letztlich stört aber weder die Diode noch der Taster.
Man kann die Diode einfach überbrücken und schon reagiert das Modul mit einem C64 Reset.
Der linke und rechte Taster sind in diesem Fall gleichwertig.
News
- 20.09.2021 -- UC-2 voll funktionsfähig
- 08.10.2021 -- Release der UC2
- 01.08.2023 -- Hardware Revision 7 alpha Version
- 09.10.2023 -- Unterstützung für c128 generell und COMAL-80 für c128
Downloads
- Gerber Dateien Rev.6a
- Jedec für den CPLD (RAM im IO Bereich und Max Machine Mode)
- Jedec für den CPLD (B-Jedec: nur C64, ohne Max Machine Mode, ohne RAM im IO Bereich)
- Jedec für den CPLD (EF-1 kompatibel, für EasyFlash Images zB. 'Prince of Persia')
- MultiMax Image für die UC-1.5 und UC-2
- 'Prince of Persia' Image für UC2 (dazu benötigt wird das EF Jedec)
- 'COMAL-80' Paket für Commodore C64 und c128 v1.02 (spezielle Jedec Dateien für die UC2)