32 KB (EP)ROM-Simulator 120 ns / 70 ns mit RP2040
2025-04-22:
Zum 'Spielen' mit älteren Prozessoren braucht man in der Regel Programmspeicher
bzw. Simulatoren für DIL24/28/32-Gehäuse, die sich möglichst zügig umprogrammieren
lassen. Frühere Ausführungen für ROM-Simulatoren wurden vielfach per LPT1 angesprochen,
was mit heutigen PCs kaum noch möglich ist. Heutzutage bietet es sich an, einen
schnellen Controller verwenden, der die Simulation mit Daten aus dem internen
RAM per Software erledigt. Hier wird ein RP2040 verwendet.
Der RP2040 kann zum einen seriell angelieferte Daten (RS232, USB) entgegennehmen
und in seinem internen RAM speichern und ist zum anderen auf Grund seiner hohen
Taktfrequenz gut geeignet, diese schnell als Datenbytes auszugeben. Die nachfolgend
gezeigte Schaltung basiert auf dem RP2040 Pico-Board, das genug GPIO-Leitungen
frei hat, um die an den Eingängen GPIO0 – GPIO14 angelegte Adresse einzulesen
und an den Ausgängen GPIO15 – GPIO22 das zugehörige Byte auszugeben.
Da ältere CPUs in der Regel mit 5 V Pegeln arbeiten, werden für die Adressleitungen
74LVC541-Puffer benötigt, um passende 3,3 V Pegel für den RP2040 zu erhalten.
Ausgangsseitig gibt es einen Puffer 74HCT541, der zu den angelegten 3,3 V Pegeln
5 V Pegel ausgibt. Zudem hat der HCT541 idealerweise zwei Freigabeeingänge,
die bestens zu den Signalen /CS und /OE passen.
Die eingefügten 'pullup/pulldown'-Widerstände sorgen für passive Ein- und Ausgänge der Schaltung. Die Versorgungsspannung kann aus den Pins 28 bzw. 32 des simulierten ROMs oder vom USB-Eingang des Pico-Boards zur Verfügung gestellt werden. Mit D3 könnte auch aus Pin 24 VCC entnommen werden oder man verbindet die Pins 24 und 32, um sich die Diode zu sparen.
Ein RP2040 kann maximal ein ROM mit 256 KB simulieren, weshalb hier für eine mögliche Erweiterung ein 34-pol. Pfostenstecker gewählt wurde, der auch das /Reset-Signal liefern kann. Die Daten werden über eine PIO-simulierte RS232-Schnittstelle mit 500 kB empfangen. Dadurch können auch ältere Rechner (ggf. std. Baudrate einstellen) Dateien im Intel-Hex oder Motorola S-Format übertragen. Da es sich hierbei um ASCII-Dateien handelt, reicht die Ausgabe über einen COMx-Port mit 'TYPE' als DOS-Befehl oder aus Windows heraus.
Beispiel für eine batch-Datei die als 'post-build'-Anweisung verwendet werden kann:
MODE com__: baud=500000 data=8 parity=n
TYPE DEMO.hex >com__
Mit MODE werden zunächst die Übertragungsparamter eingestellt und mit TYPE dann 'DEMO.hex' ausgegeben. __ steht für die Nummer der COM-Schnittstelle.
Nach Initialisierung des Programms wird die Routine 'rom_simulation()' ausgeführt, die permanent die Adressleitungen einliest und das zugehörige Datenbyte aus dem 'rom_puffer[]' an PIO1-SM0 übergibt, welches die schnelle Ausgabe erledigt. Bei 200 MHz Taktfrequenz des RP2040 beträgt die max. Zugriffszeit 120 ns. 70 ns werden bei 360 MHz erreicht. Da jeder Zeichenempfang diese Routine per ISR unterbricht, wird mit jedem ser. Zeichen automatisch ein /Reset ausgelöst. Ein separater RESET-Befehl ist daher nicht notwendig und der Zielprozessor startet erneut mit neuen, gültigen Daten.
Damit je nach Speicherbelegung und Beschaltung des DIL-Sockels im Zielsystem
und benötigter ROM-Größe 2716 – 27128 die Daten an der richtigen Adresse im
'rom_puffer[]' liegen, kann die übertragene Adresse maskiert
=Sxxxx<CR> (Maske = xxxx - 1)
und mit einem Offset versehen werden:
=Oxxxx<CR>.
Da der ROM-Simulator die Versorgungsspannung aus dem Zielsystem bezieht und
bis zu 8 Programme in seinem FLASH abspeichern kann, kann er auch 'stand alone'
arbeiten. Dazu wird beim Programmstart das zuletzt unter Index = 0 abgelegte
Programm ins RAM geladen. Für das Abspeichern gibt es den Befehl
=R{index}<CR>,
der optional das aktuelle Programm an bis zu acht unterschiedlichen Stellen
sichern kann: Index 0 – 7. Fehlt eine Angabe des Index wird 0 gewählt. Zurückgelesen
werden diese Bereiche mit dem Befehl
=L{index}<CR>
- ebenfalls mit default = 0 wie beim Programmstart.
Das Programm ist ein Projekt für Segger Embedded Studio und die Bilder zeigen Schaltung, Aufbau und das Adapterkabel; ferner: Daten für die Platinenfertigung.
Durch das direkt aufgelötete Pico-Board spart man sich Stiftleisten, verengt jedoch den Platz für den USB-Stecker. Für einmaliges Programmieren kann man sich die Kunststoffummantelung des Steckers passend abschneiden.
Beim Adapterkabel sind die jeweils nebeneinanderliegenden Anschlüsse verdreht,
da der 'vituelle' Pin 1 des Pfostensteckers leider an Pin 28 eines DIL28 Steckers
enden würde und nicht an Pin 1. Alternativ kann man die Pfostenleiste von
der Unterseite bestücken oder die einzelenen Adern des Flachkabels auftrennen
und passend an eine DILxx-Fassung anlöten. Es empfiehlt sich 2 x DILxx-Fassungen
übereinander zu stecken, um bei abgenutzten (verbogenen) Kontakten nicht
erneut löten zu müssen und um je nach Bestückung im Zielsystem
ggf. das Anschlußkabel höher zu führen.
An die rote /Reset-Leitung kann man bei Bedarf eine Klemmprüfspitze anschließen.
Beim originalen RP2040 Pico-Board sind nicht alle GPIO-Pins frei verfügbar,
was letztlich den simulierten Adressbereich auf 32 KB begrenzt. Zu geringen
Kosten gibt es Pico-Boards, bei denen GPIO0 - GPIO29 an den Stiftleisten verfügbar
sind. Ferner sind diese auch mit Flash-Speichern bis zu 16 MB erhältlich.
Hiermit können dann Speicher mit bis zu 256 KB simuliert werden. Das Schaltbild
könnte so aussehen:
Die Pinreihen des 34-pol. Steckverbinders sind so angepasst, daß eine externe Verdrehung nicht mehr notwendig ist. Die Beschaltung für RES+ ist optional.
2025-04-26:
Bei der neuen Programmversion "rom_simul_core1"
wird die Routine 'rom_simulation()' vom Core1 des RP2040 ausgeführt und
von ISRs des Core0 nicht mehr unterbrochen. Ein /Reset-Impuls wird nun nicht
mehr bei jedem RX-Zeichen ausgelöst sondern nur noch beim Laden von Programmen
aus dem internen Flash-Speicher oder beim Empfang von .hex oder .srec Dateien.
Für die gezielte Ausgabe von /Reset gibt es nun den Befehl:
"==<CR>"