000
21.04.2014, 14:22 Uhr
timetube
|
Hallo Leute,
ich habe mich in den letzten Jahren in meiner Freizeit immer mal wieder mit der Entwicklung eines eigenen Z80 Emulators befasst. Mehr so zur Spielerei "just for fun".
Über die Osterfeiertage nun habe ich diesen Emulator, inklusive einiger Testprojekte, veröffentlicht.
Natürlich gibt es mittlerweile unzählige, tolle Z80 Emulationen, dennoch habe ich mal versucht einen etwas anderen Ansatz zu wählen.
Dieser Emulator will nicht der schnellste sein, er dekodiert daher nicht über die üblichen Tabellen oder "BigSwitches", sondern über eine Logik, wie sie Cristian Dinu sie in seinem Dokument (see the acknowledgements section at http://www.z80.info/decoding.htm) beschrieben hat. Eine tolle Arbeit, die mich sehr inspiriert hat diesen Emulator, nach dem darin beschriebenen Verfahren, zu entwickeln. Vielen Dank Cristian.
Darüber hinaus unterstützt dieser Emulator, über eine einzige BUS-Funktion, den Zustand jedes einzelnen Logischen Pins des Z80-Chips in einer nahezu authentischen Weise. Ein an diesem Interface mitgeschnittenes Traces-Logfile, kann, über ein geeignetes z.B. Gnuplot Script, ein fast authentisches Logikanalyse-Diagramm erstellen.
Damit ist dieser Emulator ideal für Lehr- und Lernzwecke geeignet.
Wer wissen möchte welche dokumentierten und nicht dokumentierten OpCodes dieser Emulator unterstützt, der möge sich das Projekt Z80Test erstellen. Dieses gibt dann eine Liste in der Form (siehe weiter unten) aus.
Das Projekt libZ80Test führt wahlweise die legendären Test-Programme "zexall" und "zexdoc" aus. Da diese ursprünglich für CP/M entwickelt wurden, wird der CP/M Console-Output simuliert. Ansonsten ist es der original Programmcode, wie er auch u.A. vom YAZE Team verwendet wird. YAZE, ein sehr sehenswertes Projekt, von dem ich viel gelernt habe. http://www.mathematik.uni-ulm.de/users/ag/yaze-ag/ Das Projekt CPM 2.2 muss hier wohl nicht weiter beschrieben werden. Die CP/M Console wird über Telnet angebunden, was leicht verschiedene Terminaltemulationen ermöglicht (ANSI / VT100...) Über die Emulatorconsole können Programmcode zwischen CP/M System/Disks und Host-PC ausgetauscht werden. Diese parallel laufende Monitor ist beliebig erweiterbar, soll nur ein Muster sein.
Das Projekt QtZX80 ist ein vollwertiger ZX80 Qt-Emulator, welcher die original ROM-Codes des ZX80 verwendet. Hier wird besonders deutlich gemacht, wie nahe diese Emulation an der realen Z80-CPU liegt. Dieses ZX80 System verwendet derart trickreich selbst die Interrupt-ACK und Refreshsignale am BUS der Z80 CPU, dass mir kein weiterer Z80 Emulator bekannt ist, der ohne Tricks und Eingriffe in den Programmablauf, diesen ZX80 so naturgetreu emulieren kann. <stolz>
Dann noch das Projekt TK-80 ein NEC Trainings-Kit 80 Emulator, der mir mehr dazu diente mal mit so einem native! graphisches Uferinterface (Qt) herum zuspielen. Da ist noch einiges dran zu tun, dennoch macht das Teil schon Spaß und liegt somit bei.
Alle diese Projekte benötigen natürlich das Projekt Z80 (libZ80.so) um ausgeführt werden zu können. Diese shared Library muss daher zuvor erstellt und an eine Stelle kopiert werden, wo sie über das Environment LD_LIBRARY_PATH auch gefunden werden kann. Das Makefile versucht daher einen symbolischen Link unter ${HOME}/lib anzulegen.
Ach ja, um auch die Z80/8080A Programme erstellen zu können, braucht Ihr neben einer Linux/Qt Buildumgebung auch den ZMAC, einen sehr leistungsfähigen und zu den gängigen Z80 Assemblern kompatiblen Cross-Assembler.
Ich verwende zmac 1.3, a Z80 macro cross-assembler. Public domain by Bruce Norskog and others.
Quellcode: | -HL- -IX- -IY- -IR- -SP- -AF- -BC- -DE- -HL- -PC-: M1 .. .. .. .. : Mnemonics 4042,sZyhxpNc,0000,4040,0000,4040,0000,0020,3435,ff29,ffff,0000,ffff 0004: dd c4 c6 c7 : CALL NZ, c7c6h; 4 4042,sZyhxpNc,0000,4040,0000,4040,0000,0021,3435,ff29,ffff,0000,ffff 0002: dd c5 : PUSH BC ; 4 4042,sZyhxpNc,0000,4040,0000,4040,0000,0022,3433,ff29,ffff,0000,ffff 0003: dd c6 c8 : ADD c8h ; 4 0809,szyhXpnC,0000,4040,0000,4040,0000,0023,3433,ff29,ffff,0000,ffff 0002: dd c7 : RST 00h ; 4 0809,szyhXpnC,0000,4040,0000,4040,0000,0024,3431,ff29,ffff,0000,ffff 0002: dd c8 : RET Z ; 4 0809,szyhXpnC,0000,4040,0000,4040,0000,0025,3431,ff29,ffff,0000,ffff 0002: dd c9 : RET ; 4 0809,szyhXpnC,0000,4040,0000,4040,0000,0026,3433,ff29,ffff,0000,ffff 0004: dd ca cc cd : JP Z, cdcch ; 4 0809,szyhXpnC,0000,4040,0000,4040,0000,0027,3433,ff29,ffff,0000,ffff 0004: dd cb cd 00 : LD B, RLC (IX-51) ; 23 0844,sZyhxPnc,0000,4040,0000,4040,0000,0029,3433,ff29,ffff,0000,ffff 0004: dd cb cd 01 : LD C, RLC (IX-51) ; 23 0844,sZyhxPnc,0000,4040,0000,4040,0000,002b,3433,ff29,ffff,0000,ffff 0004: dd cb cd 02 : LD D, RLC (IX-51) ; 23 0844,sZyhxPnc,0000,0040,0000,4040,0000,002d,3433,ff29,ffff,0000,ffff 0004: dd cb cd 03 : LD E, RLC (IX-51) ; 23 0844,sZyhxPnc,0000,0000,0000,4040,0000,002f,3433,ff29,ffff,0000,ffff 0004: dd cb cd 04 : LD H, RLC (IX-51) ; 23 0844,sZyhxPnc,0000,0000,0000,4040,0000,0031,3433,ff29,ffff,0000,ffff 0004: dd cb cd 05 : LD L, RLC (IX-51) ; 23 0844,sZyhxPnc,0000,0000,0000,4040,0000,0033,3433,ff29,ffff,0000,ffff 0004: dd cb cd 06 : RLC (IX-51) ; 23 0844,sZyhxPnc,0000,0000,0000,4040,0000,0035,3433,ff29,ffff,0000,ffff 0004: dd cb cd 07 : LD A, RLC (IX-51) ; 23 0044,sZyhxPnc,0000,0000,0000,4040,0000,0037,3433,ff29,ffff,0000,ffff 0004: dd cb cd 08 : LD B, RRC (IX-51) ; 23 -AF- --Flag-- -BC- -DE- -HL- -IX- -IY- -IR- -SP- -AF- -BC- -DE- -HL- -PC-: M1 .. .. .. .. : Mnemonics 0044,sZyhxPnc,0000,0000,0000,4040,0000,0039,3433,ff29,ffff,0000,ffff 0004: dd cb cd 09 : LD C, RRC (IX-51); 23 0044,sZyhxPnc,0000,0000,0000,4040,0000,003b,3433,ff29,ffff,0000,ffff 0004: dd cb cd 0a : LD D, RRC (IX-51) ; 23 0044,sZyhxPnc,0000,0000,0000,4040,0000,003d,3433,ff29,ffff,0000,ffff 0004: dd cb cd 0b : LD E, RRC (IX-51) ; 23 0044,sZyhxPnc,0000,0000,0000,4040,0000,003f,3433,ff29,ffff,0000,ffff 0004: dd cb cd 0c : LD H, RRC (IX-51) ; 23 0044,sZyhxPnc,0000,0000,0000,4040,0000,0041,3433,ff29,ffff,0000,ffff 0004: dd cb cd 0d : LD L, RRC (IX-51) ; 23 0044,sZyhxPnc,0000,0000,0000,4040,0000,0043,3433,ff29,ffff,0000,ffff 0004: dd cb cd 0e : RRC (IX-51)
|
Obwohl die beigelegten Testprogramme der Emulation schon einiges abverlangen, kann ich nicht für die vollständige Abarbeitung aller Z80 Codes garantieren. Hier seit Ihr aufgefordert mitzuhelfen. Es heißt also nicht "Finded Nemo" sondern "Findert die Fehle".
Also, wer das Projekt anschauen und ausprobieren möchte, hier nun der Link zu den Sources:
Yet Another, Another Z80 Emulator
Wer an diesen Projekten mitarbeiten möchte, kann das natürlich gerne tun. Er sei hiermit herzlichst eingeladen. Ich würde Dich dann als Developer in das Projekt eintragen, so dass Du zwanglos und eigenständig mitwirken kannst.
In diesem Sinne, frohe Ostern und viel Spaß mit diesem Emulator.
TimeTube @notwendig -- "Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt." Ein Stein. Dieser Post wurde am 21.04.2014 um 15:18 Uhr von timetube editiert. |