Z80 Emulation auf dem Arduino

Gast #7201930
Lesenswert?

Vorne weg: Dieser Thread ist ausschließlich zum Spaß an der 
Beschäftigung mit Z80 MCUs als Vintage Hobby. Dieser Thread richtet sich 
an Interessierte aus dieser Zeit, die ein wenig Lust haben, wieder mit 
dem Z80 Befehlssatz zu spielen.

Vor einigen Jahrzehnten hatte ich Spaß am Programmieren und Basteln mit 
der Z80 CPU. Vor kurzem bin ich auf diese Arduino Library gestoßen

https://github.com/jkingsman/Z80Mega

und überlege mir, was man lustiges damit anstellen könnte.
Eigentlich fehlt in der Library ein kleines Z80 Assembler Beispiel zum 
Blinken der "LED_BUILTIN" beim Arduino.
Vielleicht sollte man mal einen Benchmark schreiben, um zu sehen, wie 
schnell die Emulation läuft.
Gast #7201979
Lesenswert?

Na ja... so eine Emulation auf einem AVR zum laufen bringen ist eine 
echte Herausforderung. Das bringt Spaß. Einen alten Sinclair Rechner 
wieder instand setzen und darauf Programmieren bring auch Spaß.

Aber ich befürchte, du wirst ziemlich schnell sehen, warum niemand diese 
Emulation benutzt.
#7202018
Lesenswert?

chris_ schrieb:
> Eigentlich fehlt in der Library ein kleines Z80 Assembler Beispiel zum
> Blinken der "LED_BUILTIN" beim Arduino.
> Vielleicht sollte man mal einen Benchmark schreiben, um zu sehen, wie
> schnell die Emulation läuft.

wenn Du RunCPM auf dem Arduino Due laufen laesst kann man ueber BDOS/Z80 
Assembler auch die GPIOs schalten.

Schau Dir dazu mal folgendes BASIC-Programm an, welches per READ/DATA 
ein Assembler-Program laufen laesst ;)
https://github.com/MockbaTheBorg/RunCPM/blob/master/ArduinoInterface/LED.BAS
Gast #7202019
Lesenswert?

CPM auf einem Arduino wäre eine lustige Sache.
Laut Beschreibung soll die Library nur auf einem Arduino Mega laufen.

https://github.com/jkingsman/Z80Mega

Beim ersten Überfliegen der Sourcen sehe ich aber keinerlei 
Prozessorabhängigkeit. Insofern sollte die Library auf jedem Arduino 
Framwork laufen sofern der Prozessor ausreichend Speicher besitzt 
(ESP32, PiPico, STM32 derivate).
Gast #7202023
Lesenswert?

von Ein Kommentar (Gast)
24.09.2022 18:33

>Na ja... so eine Emulation auf einem AVR zum laufen bringen ist eine
>echte Herausforderung. Das bringt Spaß.

Mit dem ArduinoMega geht das natürlich schneller.

Ich hab's grad mal probiert:

Start 19:50

1. Zum Schrank laufen und ArduinoMega holen
2. Library als ZIP runter laden und in den Libraries Ordner kopieren
3. ArduinoMegaADK auswählen
4. Beispiel flashen
5. Serial Terminal auf 9600 Baud auswählen

19:55: der simulierte Z80 meldet sich per Arduino Serial Monitor
Gast #7202046
Lesenswert?

Hallo

chris_ schrieb:
> 19:55: der simulierte Z80 meldet sich per Arduino Serial Monitor

Und dann?
Die Frage ist nicht (!) ironisch sondern ernsthaft gemeint.

Was macht man dann mit so einen "Z80" der ja in der Praxis dann fast 
immer noch einen PC (Laptop, Smartphone, Tablett) bracht um den Serial 
Monitor Ausgaben darzustellen.

Was konnte man mit einen Z80 eigentlich sinnvoll machen (Auch hier 
wieder: Keine Ironie, keine Hetze sondern eine ernst gemeinte Frage)?

Und mit sinnvoll meine ich sinnvolle, einen Vorteile, Vereinfachungen, 
Spaß bringende Anwendungen.

Warum sollte man sich einen Z80 mit all seinen Beschränkungen antun, 
wenn ein auch schon (fast) Historischer und aus der Zeit gefallener 
ATMega 8 oder ein PIC 16F84 deutlich mehr leisten, die GUI und 
Entwicklungsumgebungen wesentlich Anwendungsfreundlicher und dabei sogar 
meist kostenlos sind.

Nur um die rosarote Nostalgiebrille zu tragen und sich selbst was 
vorzumachen (der Körper wird nämlich nicht auf einmal wieder Jung, 
vertane  Chancen eröffnen sich nicht neu, geliebte Leute und Freund 
werden nicht auferstehen...) ?

Wenn ich den Wikipedia Artikel richtig interpretiere gibt es auch heute 
noch "Z80"er die aber wohl außer den Prozessorkern wenig mit den 
Original Z80 (Systeme) gemeinsam haben (?).
Warum dann einen Z80 Emulieren - man kann doch scheinbar immer noch ein 
"Original" nutzen wenn man will (Wohl dann auch mit Zeitgemäßer 
Entwicklungsumgebung und  Programmern)?
Gast #7202048
Lesenswert?

Guido L. (guidol1970)
24.09.2022 19:42
>wenn Du RunCPM auf dem Arduino Due laufen laesst kann man ueber BDOS/Z80
>Assembler auch die GPIOs schalten.
https://github.com/MockbaTheBorg/RunCPM/tree/master/RunCPM

Leider ist die CPU von RunCPM nicht in der Arduino üblichen Form als 
Library gekapselt.

Es wäre interesant, die Performance der beiden CPU-Implementierungen 
vergleichen zu können.
Ich habe gerade mal versucht, die Leistungdaten von
https://github.com/jkingsman/Z80Mega
zu "Benchmarken":
Simulation: ArduinoMega
Flash: 63476 Bytes
Ram: 7054 Bytes

Instruction Speed ermittelt mit
1
  uint32_t startTime = micros();
2
  for (int n = 0; n < 1000; n++)
3
  {
4
    StepZ80(&cpu);
5
  }
6
  uint32_t duration_us = micros() - startTime;
7
  Serial.print("instructions per microsecond (mean):"); Serial.println(1.0/(duration_us/1000));

instructions per microsecond (mean):0.17

Wie liegt eigentlich der Z80 im Normalfall?
Gast #7202053
Lesenswert?

Pre Z80 (Gast)
>Und dann?
>Die Frage ist nicht (!) ironisch sondern ernsthaft gemeint.

>Was macht man dann mit so einen "Z80" der ja in der Praxis dann fast
>immer noch einen PC (Laptop, Smartphone, Tablett) bracht um den Serial
>Monitor Ausgaben darzustellen.

Die CPU braucht keinen PC(Latop, Smartphone, Tablett) oder ähnliches. 
Mit den IO-Funktionen kann man auch einfach nur eine LED blinken lassen 
oder einen Roboter, Waschmaschine, Heizung oder was auch immer steuern.
Aber klar .. wie ich im Eingangspost schon erwähnte: Das ganze macht 
vermutlich keinen Sinn, aber ich habe grad Spaß drann.
Gast #7202062
Lesenswert?

Da zufälligerweise gerade ein NucleoF303K8 vor meiner Nase auf dem 
Schreibtisch liegt,

https://os.mbed.com/platforms/ST-Nucleo-F303K8/

habe ich den Benchmark mal darauf geflasht (exact den gleichen Code wie 
auf dem ArduinoMega):

Flash: 62744
Ram: 1652
instructions per microsecond (mean):0.50

Die CPU läuft auf dem STM32F303 also ca. 3 mal schneller als auf dem 
ArduinoMega.
FCPU ArduinMega:16MHz
FCPU STM32F303K8: 72MHz
70MHz/16MHz=4.5

Seltsam: der Ram-Verbrauch ist deutlich kleiner als beim Atmega
und:Obwohl fast die 4.5 fache Clock und 32 Bit ist es auf dem STM nur 3 
mal schneller.
Gast #7202266
Lesenswert?

Spasseshalber habe ich den Benchmark Code mal auf den ESP32 geflasht.
Er lief erst mal nicht. Ich musste die Variable für die Zeitmessung auf 
float umstellen. Scheinbar gibt es beim Compiler Unterschiede zum 
Compiler für den AVR und den STM32.

Der Benchmark sieht jetzt so aus:
1
  uint32_t startTime = micros();
2
  for (int n = 0; n < 1000; n++)
3
  {
4
    StepZ80(&cpu);
5
  }
6
  float duration_us = micros() - startTime;
7
  Serial.print("instructions per microsecond (mean):"); Serial.println(1.0 / (duration_us / 1000));

Die Benutzung der Z80 Lib
https://github.com/jkingsman/Z80Mega
auf dem ESP32 ergibt für die Simulation der CPU:

Flash: 253250 Bytes
Ram: 14036 Bytes
instructions per microsecond (mean): 2.11

Die Z80 Simulation läuft damit auf dem ESP32 als 4x schneller als auf 
dem STM32F303K8 bzw. 12x schneller als auf dem Atmega.

Ich schätze mal, dass bei einem 4MHz getakteten Z80 die 
Ausführungsgeschwindigkeit bei ca. 500.000 Instruktionen/Sec liegt. 
Damit wäre die Simulation auf einem Core des ESP32 etwa 4x schneller.
Gast #7202268
Lesenswert?

Bernd:
>Pre Z80 schrieb:
>> Was konnte man mit einen Z80 eigentlich sinnvoll machen
>https://de.wikipedia.org/wiki/Zilog_Z80#Verwendung

Aus dem Text:
"Anfangs wurde der Z80 häufig in Arcade-Spielen eingesetzt, so in 
Galaxian (1979) und Pac-Man, aber auch der Mikrocomputer Intertec 
Superbrain nutzte den Prozessor. Der Z80 hat sich dabei bis Ende der 
1980er Jahre als Spiele-Prozessor bewährt. Um gewünschte Effekte zu 
erzielen, setzten Automaten-Hersteller später auch bis zu drei Z80 
parallel ein."

Nach dem obigen Benchmark zu urteilen kann der ESP32 mit der Z80 Arduino 
Library 4 Z80 Kerne auf einem seiner Kerne mit der Geschwindigkeit eines 
4MHz getakteten Z80 simulieren. Das dürfte für so ein Arkade Spiel 
reichen.

Dass die Verwendung des Z80 für Spiele als erstes genannt ist dürfte der 
Neigung der schreibenden Autoren geschuldet sein.
Ich hätte die größte Verbreitung eher in Maschinensteuerungen erwartet. 
Die Verwendung als Steuerungs-CPU interessiert mich eher.
Gast #7202272
Lesenswert?

Die Fae´rben sind super.
Da ist nicht schrecklich.
Auf der Beispielseite sind verschiedene Desktops Beispiele abgebildet.
https://www.youtube.com/watch?v=B62k7iKK2rU

chris_ schrieb:
> Peter K. (os2fan2)
> 24.09.2022 21:17
>
>> http://www.symbos.de/
>
> Uhh .. das ist aber arg farbig. Da darf man nicht rot grün blind sein.
> Ich vermute, ein PiPico könnte für sowas inclusive Monitoransteuerung
> reichen.
Gast #7202282
Lesenswert?

Wolfgang (Gast)
25.09.2022 07:22

>Es gibt nicht "den Arduino". Der Unterschied zwischen einem Arduino Due
>und einem Arduino Uno ist nun mal beträchtlich.

Echt jetzt?
Man Leute, lest mal den Thread zumindest in groben Zügen durch, bevor 
ihr etwas postet.
Gast #7202498
Lesenswert?

Peter K. (os2fan2)
25.09.2022 07:25

>Hier sieht man SymAmp:-) (Winamp Clone im Einsatz)
>https://www.youtube.com/watch?v=IlOkLrhfZFA

Ist nur bei mir kein Ton im Video? Ich hätte vermutet, dass der Winamp 
Clone Sound erzeugt.
Die Frage ist: Die Leistung eines Z80 würde vielleicht gerade reichen, 
um die Daten aus dem Speicher zu einem DAC zu schaufeln, aber von MP3 
ist das weit entfernt.
Gast #7202515
Lesenswert?

chris_ schrieb:
> Ist nur bei mir kein Ton im Video?

Ab etwa 2:30 kommt welcher. Man muss aber schon recht hartgesotten sein, 
um der ... äh, "hochauflösenden" Graphik bis dahin gebannt zuzugucken.

Allerdings habe ich leichte Zweifel daran, daß der Ton irgendwas mit 
dem Z80-System zu tun hat, das hier zu sehen ist.
Beitrag #7202677 wurde von einem Moderator gelöscht.
Gast #7202826
Lesenswert?

chris_ schrieb:
> Obwohl fast die 4.5 fache Clock und 32 Bit
> ist es auf dem STM nur 3 mal schneller.

Das ist überhaupt nicht seltsam. 32 Bit breite Register nützen dir 
nichts, wenn  du nur mit 8 Bit Daten arbeitest. Zudem braucht ein STM32 
für viele Dinge mehr CPU Takte und Befehle, als ein AVR.

Bei gleicher Taktfrequenz kann ein STM32 durchaus langsamer sein, als 
ein AVR. Insbesondere wenn das Programm viel an den I/O Pins herum 
wackelt.
Gast #7202899
Lesenswert?

Stefan ⛄ F. (stefanus)
25.09.2022 16:35
>Das ist überhaupt nicht seltsam. 32 Bit breite Register nützen dir
>nichts, wenn  du nur mit 8 Bit Daten arbeitest. Zudem braucht ein STM32
>für viele Dinge mehr CPU Takte und Befehle, als ein AVR.

Die Begründung ist mir dann auch eingefallen. Ein wenig könnten die 
32Bit doch bringen, da der Z80 auch ein paar Befehle, die 16 Bit 
benutzen wie z.B. die Adressierungsarten über HL, BC oder den PC.
Etwas positive ist mir dann doch die Geschwindigkeit des ESP32 
aufgefallen. Allerdings wundert mich der enorme Flash Bedarf, da muss 
das Framework irgend was riesiges mitziehen .. vielleicht den gesamten 
WIFI-Stack.
Beitrag "Re: Z80 Emulation auf dem Arduino"

Der Speicherbedarf der Library auf dem Arduino-Mega ist meiner Meinung 
nach auch viel zu hoch: Eigentlich sollte es möglich sein, den Z80 mit 
<8kB Flash und 256Byte Ram zu simulieren.

Wenn es die verwendete Simulation hier
https://www.mikrocontroller.net/articles/AVR_CP/M als Arduino-Lib
gäbe, wäre das super. Allerdings wäre das Ganze dann nicht mehr auf 
andere Architekturen portabel, was auch wieder blööd ist.

Falls man der Aktion, einen Z80 zu simulieren etwas nützliches 
abgewinnen will: Man kann auch ohne CPM einen Basic Interpreter laufen 
lassen.

http://searle.x10host.com/z80/SimpleZ80.html

Das Arduino Projekt hat hier einer mit der Lib dazu erstellt:
https://github.com/tmacauley/Z80Pico/tree/master/examples/GrantSearle7ChipZ80
Gast #7246577
Lesenswert?

chris_ schrieb:
> Wie liegt eigentlich der Z80 im Normalfall?

Schon vergessen? Im Mittel braucht der Z80 pro Instruktion 4 Taktzyklen. 
Also ein historischer Z80 mit 4 MHz Takt arbeitet 1 Instruktion pro µs 
ab. Damit liegt er so etwa gleichauf mit sowas wie klassischen PIC16, 
die aber deutlich weniger Speicher adressieren können. Nun ja, neuere 
Z80 vertragen 20 MHz Takt und da sind so etwa 5 Instruktionen/µs drin. 
Ich schreibe hier immer 'so etwa', weil der Z80 eben verschiedene 
Befehlslängen und Interface-Sequenzen einschließlich Wait und 
dazugehörige Waitstates kennt. Er ist eben kein Controller, sondern ein 
Prozessor.

Allerdings sind solche Emulationen mir immer suspekt, denn was soll es 
heißen: "19:55: der simulierte Z80 meldet sich per Arduino Serial 
Monitor". Der Z80 meldet sich überhaupt nicht. Und zwar nie und 
nirgends. Was sich da melden kann, ist ein Programm, das von ihm 
(virtuell) ausgeführt wird. Also wenn man das so sehen will, dann eine 
Art Script, ausgeführt auf einem passenden Interpreter. Und der wiederum 
ausgeführt auf einem Interpreter für diesen Interpreter.

W.S.
Gast #7246612
Lesenswert?

W.S. schrieb:

> Im Mittel braucht der Z80 pro Instruktion 4 Taktzyklen.

Nie im Leben.

Wenn mich mein Gedächtnis nicht trügt, braucht der kürzeste
Befehl 4 Takte (der längste liegt bei 19 Takten oder so.)

Im Mittel 8 Takte je Befehl haut m.E. schon ganz gut hin.
Moderator Persönliche Seite #7246648
Lesenswert?

Grummler schrieb:
> Wenn mich mein Gedächtnis nicht trügt, braucht der kürzeste
> Befehl 4 Takte

Korrekt, siehe auch https://clrhome.org/table/

NOP allein braucht schon 4 cycles.

Apropos Z80-Emulator: Siehe auch STECCY. Diese Emulation bildet 
timinggenau einen Z80 mit 3,5MHz ab, kann aber mittels Turbo-Taste um 
ein Vielfaches beschleunigt werden. Der Emulator läuft aber auf einem 
STM32 und nicht auf einem Arduino.
Moderator Persönliche Seite #7246694
Lesenswert?

chris_ schrieb:
> Du meinst jetzt so einen wie den hier:
> https://store.arduino.cc/products/portenta-h7

Nee, das Teil ist viel zu fett und zu teuer dafür. :-)

Ich meine einen STM32F407VET6. Das im STECCY-Artikel verlinkte Board 
kostete Anfang 2020 noch knapp 10 EUR. Mittlerweile leider wegen der 
STM32-Knappheit 40 EUR. Ich hoffe, das gibt sich bald wieder.
Gast #7246724
Lesenswert?

Frank M. (ukw) (Moderator)
>Ich meine einen STM32F407VET6. Das im STECCY-Artikel verlinkte Board
https://stm32-base.org/boards/STM32F407VET6-STM32-F4VE-V2.0

Es wird ja praktischerweise von STM mit STM32duino unterstützt.

https://github.com/stm32duino/Arduino_Core_STM32

Man kann also direkt die Z80 Library darauf laufen lassen:

https://github.com/jkingsman/Z80Mega/blob/master/src/Z80.c

Oben habe ich ja den Benchmark für das mit nur 72Mhz getaktete Nucleo 
F303K8 gemacht:
Beitrag "Re: Z80 Emulation auf dem Arduino"

Steccy ist ja ein sehr schönes Projekt. Vielleicht könnte man deren Z80 
Emulation in eine Library fassen, aber sie scheint ziemlich viele 
Abhängigkeiten zu anderen Modulen zu haben:
https://github.com/ukw100/STECCY/blob/main/src/z80/z80.c
Moderator Persönliche Seite #7246768
Lesenswert?

chris_ schrieb:
> aber sie scheint ziemlich viele Abhängigkeiten zu anderen Modulen zu
> haben:

Ja, weil gleichzeitig auch die Spectrum-ZX-Hardware emuliert wird. Eine 
Kapselung des reinen Z80-Emulators kann man machen, wird bei STECCY aber 
höchstwahrscheinlich zu Performance-Einbußen führen, da die 
Original-ZX-Spectrum-Peripherie von Sinclair ziemlich eng mit dem Z80 
"verzahnt" wurde.

Zum Beispiel wurde ein "gleichzeitiger" RAM-Zugriff über den ULA-Chip 
zur Bilddarstellung realisiert, indem dieser mal kurz reingrätscht und 
die Z80 immer wieder zyklisch stoppt... Es gibt da noch viele andere 
Tricks, die damals genutzt wurden, um den ZX-Spectrum preisgünstig ohne 
viel Hardware-Aufwand herzustellen.

Wenn ich mal Lust und Zeit habe, kann ich den reinen Z80-Emulator aus 
STECCY herausoperieren...
Gast #7247663
Lesenswert?

>Eine Kapselung des reinen Z80-Emulators kann man machen, wird bei STECCY aber 
höchstwahrscheinlich zu Performance-Einbußen führen, da die 
Original-ZX-Spectrum-Peripherie von Sinclair ziemlich eng mit dem Z80
"verzahnt" wurde.

Ohja, das klingt kompliziert. Wahrscheinlich ist es eher nicht machbar.

Es wäre natürlich schon schön, wenn man die einzelnen Chips als 
Softwaremodule hätte und sie einfach "zusammenstöpseln" kann.

Im Moment habe ich die Spektrum Platine oben herumliegen, die darauf 
wartet, mühselig bestückt zu werden ...
Angehängte Dateien:
Gast #7247680
Lesenswert?

chris_ schrieb:
> was man lustiges damit anstellen könnte.
Man könnte auf dem AVR einen Z80 emulieren der einen 6502 emuliert 🙄
Wenn man dann noch den AVR auf dem stm32 emuliert und den dann auf einem 
RiscV, der von einem Raspi emuliert wird, der von einem Ryzen emuliert 
wird ...

.. Viele Lichtjahre von der Sinnhaftigeit entfernt dringt die 
Emulatorprise in Galaxien vor, die nie ein Mensch zuvor gesehen hat.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren