Zum Spielen mit älteren Prozessoren braucht man in der Regel Programmspeicher bzw. Simulatoren für DIL-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. Der RP2040 kann zum einen seriell angelieferte Daten entgegennehmen und in seinem internen RAM speichern und ist zum anderen auf Grund seinen hohen Taktrate gut geeignet, diese schnell als Datenbytes auszugeben. Die gezeigte Schaltung basiert auf dem RP2040 Pico-Board, das genug GPIO-Leitungen frei hat, um die an 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 die 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 liefert. Zudem hat er idealerweise zwei Freigabeeingänge, die bestens zu den Signalen /CS und /OE passen. 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 ein 'type' wie es im Beispiel 'bas.bat' gezeigt wird. 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. Damit je nach Speicherbelegung im Zielsystem und benötigter ROM-Größe 2732 – 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>". Der ROM-Simulator kann 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. Platinen bzw. die Fertigungsdateien dafür könnte ich bei Interesse bereitstellen.
Bei der eingangs gezeigten Schaltung ist Q1 schlecht gezeichnet und falsch. Es muß ein NPN Typ sein wie z.B. BC817. Das Layout der Leiterplatte stimmt dennoch. Um das Schaltbild nicht einfach zu wiederholen, wird ein Schaltbild gezeigt, welches Speicher mit bis zu 256 KB simulieren kann. Dabei wird kein original Pico-Board verwendet, sondern die Ausführung eines anderen Anbieters, welches alle GPIO-Leitungen frei verfügbar auf den Stiftleisten herausgeführt hat. Diese Boards kosten <= 2,50 Euro und sind auch mit 4 bzw. 16 MB Flash-Speicher mit der Zusatzbezeichnung 'Ultimate' erhältlich. Nebenbei: Für Anwendungen mit dem ADC dürfte der dort verwendete LDO wegen geringeren Rauschens von Vorteil sein. Das oben gezeigte Programm ist leicht angepasst worden. Der für die Baudrate verwendete PIO0-SM0 Teiler verwendet nun den ganzzahligen und fraktionalen Teil damit 'krumme' Baudraten wie zum Beispiel 460800 Baud genauer eingestellt werden können. Dann gibt es eine neue Version, bei der nun Core1 des RP2040 allein den Ablauf der Simulationsroutine erledigt. Der Vorteil ist, daß Interrupts beim RX-Empfang die Routine nicht mehr unterbrechen und zwangsläufig ein /Reset ausgegeben werden muß. Soll statt RS232 die USB-Schnittstelle verwendet werden (Arduino-IDE), müssen Unterbrechungen durch ISRs auf jeden Fall vermieden werden, was nur mit Core1 ereichbar ist. Unter http://mino-elektronik.de/Gemischtes/ROM-Simulator.html finden sich die neuen Versionen und auch die Fertigungsdaten für die Platine.
:
Bearbeitet durch User
Wäre es mit dem gezeigten ROM-Simulator möglich, einen 2716 EPROM (2 Kbit, 11 Adressleitungen, 8 Datenleitungen, 5V-Pegel) zu simulieren? Gibt es dafür Besonderheiten bei der Adressmaske oder beim Offset, oder kann der 2716 direkt abgebildet werden?
Da beim 2716 Pin 21 (Vpp) wohl auf Vcc liegt, würde das einem 2732 entsprechen, bei dem der Code in der oberen Hälfte des Speichers liegt (A11 = '1'). Dafür könnte man beim erzeugten .hex-Code die Speicheradresse mit einem Offset von 0x800 versehen. Alternativ verbindet man Pin 21 nicht, wodurch dann durch den 'pull-down'-Widerstand A11 = '0' wird. Da ich 2708/2716 garnicht mehr auf dem Schirm hatte, hatte ich MIN_ROM_SIZE auf 0x1000 gesetzt. Die aktuellen Versionen sind jetzt für den 2716 (0x800) angepaßt!
Die interessante Frage ist noch ob so ein Simulator auch wirklich in jedem alten System funktioniert. Die Hardwaresimulation ist ja durchaus anspruchsvoll wie man an der hohen notwendigen Taktfrequenz sieht. Und damals hat ja auch nicht jeder immer perfekt nach Datenblatt die Hardware designt. Da koennte es schon auch ein paar Geraete geben wo das Timing zu knapp ist. Vanye
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.