Forum: PC Hard- und Software Assembler-Code für Z80 testen


von A. $. (mikronom)


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?

: Verschoben durch Moderator
von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Ich würde die Original Assembler/monitor programme auf dem EMU laufen 
lassen, dummerweise habe ich noch keinen gefunden der auch auf XP oder 
höher läuft, habe aber auch nicht richtig gesucht.
anders meine 6502 emus die laufen auch unter XP

z.B. http://a800win.atari-area.prv.pl/

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Auch eine adresse

http://www.zock.com/

von Reinhard Kern (Gast)


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

von Route_66 (Gast)


Lesenswert?

Hallo!
Hier ist ein günstiger, aber leider nicht kostefreier, Simulator, 
Assembler, Disassembler und BASIC-Compiler für Z80 erhältlich. 
Zusätzlich gibt es das noch für 8085, PIC und AVR.
http://www.oshonsoft.com/z80.html

von A. $. (mikronom)


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.

von Stephan H. (stephan-)


Lesenswert?

LD A,0A
:loop   NOP
        DJNZ A,loop

ich denke ehr so:

      LD B,0Ah
loop: djnz loop

djnz bezieht sich auf B.

von A. $. (mikronom)


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.

von Reinhard Kern (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
% cat djnz.lis 
2
Z80-Assembler           Release 1.1                             Page 1
3
Source file: djnz.s
4
Title:       
5
6
LOC   OBJECT CODE   LINE   STMT SOURCE CODE
7
0000  06 0a            1      1         ld      b, 10
8
0002  00               2      2 l1:     nop
9
0003  10 fd            3      3         djnz    l1

Wurde übrigens damit erzeugt:

http://download-mirror.savannah.gnu.org/releases/z80asm/

Ja, nix IDE, altmodischer Kommandozeilenassembler. ;-)

von A. $. (mikronom)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Uhu U. (uhu)


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.

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
Noch kein Account? Hier anmelden.