Assembler-Code für Z80 testen

OP #2686415
Lesenswert?

Ich suche eine Möglichkeit, einen in Textform vorliegenden 
Assembler-Programmcode (NOP, POP AF) für einen Zilog Z80 unter einem 
Windows auf einem x86/x64 zu testen. Es sollten die Register und Flags 
angezeigt werden können und mein Assembler-Programm es sollte mir in 
irgendeiner Form als Maschinencode (00, F1) ausgeben werde. Schön wäre 
Einzelschrittmöglichkeit (und Anzeige der Register/Flags dabei). Was 
brauche ich dafür? Wer kennt etwas?
Moderator Persönliche Seite #2686502
Lesenswert?

Andi $nachname schrieb:
> und mein Assembler-Programm es sollte mir in
> irgendeiner Form als Maschinencode (00, F1) ausgeben werde.

Dafür brauchst du (vor dem von Winne genannten Emulator) erstmal
einen Assembler.  Am besten einen, der zu den Pseudo-Ops und
Opcodes deines Quelltextes passt. ;-)  Wenn ich mich recht
erinnere, gab es da (mindestens) zwei verschiedene "Geschmacks-
richtungen".

p.s.: Ich denke, dass das gar nicht so "Offtopic" ist, sondern
irgendwie sowohl der Assembler als auch der Emulator noch ganz
gut unter "PC Hard- und Software" passen.
Gast #2686814
Lesenswert?

Jörg Wunsch schrieb:
> Dafür brauchst du (vor dem von Winne genannten Emulator) erstmal
> einen Assembler.

Hallo,

bei Zilog kann man eine moderne IDE für den eZ80 herunterladen. Der 
Befehlssatz ist eine Erweiterung des Z80, man kann also Z80-Assembler 
damit übersetzen. Einen reinen Softwaresimulator gibt es da aber nicht.

http://www.zilog.com/docs/ez80/devtools/fl0023.pdf

Gruss Reinhard
OP #2688232
Lesenswert?

Reinhard Kern schrieb:
> Jörg Wunsch schrieb:
>> Dafür brauchst du (vor dem von Winne genannten Emulator) erstmal
>> einen Assembler.
>
> Hallo,
>
> bei Zilog kann man eine moderne IDE für den eZ80 herunterladen. Der
> Befehlssatz ist eine Erweiterung des Z80, man kann also Z80-Assembler
> damit übersetzen.

Danke für den Tipp, diese ZDS2 muss ich mir mal genauer anschauen.

http://www.zilog.com/index.php?option=com_zcm&task=sdlp&softtype_id=3

Aber vielleicht kann mir mal jemand schon vorab weiterhelfen. Ich will 
eine Warteschleife bauen, die ich vorab leider nicht testen kann. Ich 
brauche den Maschinencode dafür:

        LD A,0A
:loop   NOP
        DJNZ loop

Also Akku mit #10 laden, einmal nix machen und dann A um eins 
erniedrigen und solange in die Schleife springen, wie A ungleich 0 ist.

In Maschinencode würde das wie folgt aussehen:

        3E 0A
        00
        10 ??

Wer kann mir sagen, was bei ?? stehen muss. Das ist eindeutig bestimmt, 
da es ein relativer Sprung ist.

BTW: Ist ja nun bescheuert, dass das zu PC Hard- & Software verschoben 
worden ist.
OP #2688265
Lesenswert?

Stephan Henning schrieb:
> LD A,0A
> :loop   NOP
>         DJNZ A,loop
>
> oder
>
>       LD a,0Ah
> loop: dec a
>       djnz loop
>
> wobei ich nicht weis ob DJNZ N,marke bei Z80 konform ist.

Ist es nicht. Bei DJNZ LABEL ist klar, dass der Akku gemeint ist, das 
DJNZ N,marke ist also falsch.

Edith: Ich korrigiere, es ist tatsächlich das B-Register, dass bei DJNZ 
bearbeitet wird. Das ändert aber mal nichts grundsätzliches am relativen 
Sprung.

> Das ist über 20 Jahre her. Variante 2 funktioniert definitiv

Variante 2 macht zweimal ein Dekrement von A. Funktioniert zwar, ist 
aber falsch.

Außerdem will ich lediglich die Sprungweite (bzw. den zu kodierenden 
Wert) wissen.
Gast #2688504
Lesenswert?

Andi $nachname schrieb:
> Außerdem will ich lediglich die Sprungweite (bzw. den zu kodierenden
> Wert) wissen.
1
                               INIT20: RTCDEL
2
02E7     06  08                        LD      B,8
3
02E9     10  FE                        DJNZ    $

D.h. der Sprung auf sich selbst ist 0FEH = -2 (es wird modulo 256 
gerechnet), da der Programmzähler nach dem Lesen des Befehls auf 02EBH 
steht.

Für n Bytes weiter zurück entsprechend n weniger, für Sprünge nach vorne 
n mehr, also positive Zahlen.

Gruss Reinhard
OP #2688787
Lesenswert?

Reinhard Kern schrieb:
> Andi $nachname schrieb:
>> Außerdem will ich lediglich die Sprungweite (bzw. den zu kodierenden
>> Wert) wissen.
>
>
1
>                                INIT20: RTCDEL
2
> 02E7     06  08                        LD      B,8
3
> 02E9     10  FE                        DJNZ    $
4
>
>
> D.h. der Sprung auf sich selbst ist 0FEH = -2 (es wird modulo 256
> gerechnet), da der Programmzähler nach dem Lesen des Befehls auf 02EBH
> steht.

Das heißt während der Befehl abgearbeitet wird ist der Programmcounter 
schon auf den nächsten Befehl getrimmt. Ich finde das ist ganz schön 
ineffizient, tut der Prozessor da doch irgendwas, was er vielleicht gar 
nicht braucht. Na gut, die Chipentwickler werden schon wissen warum man 
es genau so macht.
Moderator Persönliche Seite #2688813
Lesenswert?

Andi $nachname schrieb:
> Ich finde das ist ganz schön
> ineffizient, tut der Prozessor da doch irgendwas, was er vielleicht gar
> nicht braucht.

Du denkst viel zu sehr "in Software".  Für eine Hardwareaktion ist
das Weiterzählen eines Zählers nicht ineffizient, es passiert einfach
so, gewissermaßen "nebenbei".  Bei einem Sprung muss der PC ohnehin
neu geladen werden, da ist es völlig egal, welchen Zustand er davor
hatte.
#2689019
Lesenswert?

Das ist ein ganz simples Maschinenmodell: Wenn ein Code-Byte gelesen 
wird, wird der PC autoincrementiert.

Der djnz-Befehl sieht dann diesen PC-Wert, wenn er abgearbeitet wird.

Das macht die ASM-Programmiererei zumindest in dieser Beziehung sehr 
einfach.

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