Forum: Mikrocontroller und Digitale Elektronik Z80 Simulator IDE Assembler Code Problem


von Daniel (Gast)


Lesenswert?

Hi, ich möchte folgenden Assembler Code testen.
1
INIT:  LD HL,FTABLE
2
       LD B,1
3
       LD C,255
4
FOR:   LD (HL),B
5
       SLA B
6
       JP NC,ENDIF
7
       LD A,B
8
       XOR 065H
9
       LD B,A
10
ENDIF: INC HL
11
       DEC C
12
       JP NZ,FOR
13
END:   LD (HL),0

Dem Simulator gefällt die 1. Zeile nicht:
0001 Error: Invalid argument of the instruction

Liegt wohl daran das er FTABLE nicht kennt. FTABLE ist ein 256 Byte (256 
Elemente) großes Array. WIe erzeuge ich den ein Array in Assembler?
Programmiere sonst nur C.

Habs mit LD FTABLE, 00H versucht, aber damit geht es auch nicht. Kann 
mir jemand weiterhelfen?

von Micha (Gast)


Lesenswert?

Ich weiß nicht, welche Syntax der Assembler bevorzugt, aber Du kannst ja 
mal folgendes anhängen:
FTABLE: defs 256
oder
FTABLE: .defs 256
falls er das alles nicht frisst, mach einfach:
FTABLE: NOP
damit hat er dann die Marke und benutzt einfach die 256 Byte nach dem 
Programm

von Michael_ (Gast)


Lesenswert?

Oh, es ist schon sehr lange her. Aber ich denke, du mußt dem HL eine 
physische Speicherzelle zuweisen. Natürlich muß die im RAM sein.

von Reiner.S (Gast)


Lesenswert?

Im Macro-80 von Microsoft ist es DS (Define Space).
Z.B.
INIT:  LD HL,FTABLE
       LD B,1
       LD C,255
FOR:   LD (HL),B
       SLA B
       JP NC,ENDIF
       LD A,B
       XOR 065H
       LD B,A
ENDIF: INC HL
       DEC C
       JP NZ,FOR
END:   LD (HL),0

DSEG
FTABLE: DS 255

Für DEC C, JP NZ, FOR ist es besser DJNZ FOR zuverwenden, aber dann muss 
im Register B die Laufvariable stehen!
DJNZ Ziel = Dekrementiere B und springe falls nicht Null

von Daniel (Gast)


Lesenswert?

Hey vielen Dank.

FTABLE: defs 256 hat auf Anhieb geklappt.

An welcher Hex-Adresse befindet sich das Array, ist das willkürlich?
Hab mir den Memory Editor angeguckt und er schreibt die Werte in das 
Array beginnend an der Hex-Adresse 0x00. Also im SPeicher 0x00.

Ich vermute das kommt daher, das FTABLE in der 1. Zeile befindet bzw. 
der 1. Befehl ist?

von Reiner.S (Gast)


Lesenswert?

Den Speicherplatz kann mit ORG Anweisung festlegen.

ORG 0x0100
CSEG        Hier startet das CODE-Segemt

ORG 0x200
DSEG        Hier startet das DATEN-Segment
FTABLE DS 255

Bei CPM Programmen muss das CODE-Segnent immer bei 0x0100 beginnen.

von Michael_ (Gast)


Lesenswert?

Na klar, mit ORG den Speicherbeginn definieren.
Normal sind am Anfang aber die Sprungadressen.
Entweder ab 00h oder wie bei CPM ab 100h.
Es kommt nun darauf an, ob es etwas kleines wie ein Mikrocontroller oder 
etwas großes wie unter CPM werden soll.
Wenn der Code verschiebbar sein soll, dann braucht man noch DE für den 
oberen Teil der Adresse.

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Hi danke sehr.
Ich habe den gesamten Code mal reingepackt, weil ich noch nicht alles 
verstehe.

Zuerst wurde ja das Array FTABLE generiert (1.Abschnitt des Codes).

Danach erfolgt der Algorithmus der im Bild "algo.png) zu sehen ist. Es 
wird immer ein Byte genommen und auf das FTABLE gegeben, was mich 
interessiert ist was nach dem FTABLE rauskommt? Das versuche ich aus dem 
Assembler Code herauszufinden.

Zuerst wird das 0.Element mit dem 8.Element aus dem Array DATA 
verwendet, danach das 1.Element mit dem 9.Element und zum Schluss das 
7.Element mit dem 15. Element

Um das besser zu verstehen bin ich dabei das im Z80 Simulator zu 
simulieren, kriege aber noch Fehlermedlungen.

Ich hab die Vermutung das im 1. Durchlauf das 8.Element aus dem DATA 
Array (IX+8) mit dem 8.Element aus der FTABLE addiert wird und das 
Ergebnis wird mit dem 0.Element XOR verknüpft anschließend wird das 
Ergebnis wieder zum 0. DATA-Element addiert?

Ein Zahlenbeispiel:
Das 0.Element aus DATA ist 72dez und das 8.Element aus DATA eine 82dez
Das 8.Element aus FTABLE ist 101.

So nach dem Code wird das 8. DATA-Element zu dem 8.Element aus FTABLE 
addiert, ergibt 183.

Das Ergebnis wird nun mit dem 0. DATA-Element XOR verknüpft ergibt 255.
Die 255 wird zum Schluss im 1. Durchlauf zum 0.DATA-Element addiert.

Hab ich das so richtig verstanden?
1
FTABLE: defs 256
2
DATA:  defs 16
3
TEMP:  defs 16
4
INIT:    LD HL,FTABLE
5
         LD B,1
6
         LD C,255
7
FOR:     LD (HL),B
8
         SLA B
9
         JP NC,ENDIF
10
         LD A,B
11
         XOR 065H
12
         LD B,A
13
ENDIF:   INC HL
14
         DEC C
15
         JP NZ,FOR
16
END1:    LD (HL),0
17
18
;Funtion Pi anwenden
19
20
PI:      LD IX,DATA
21
         LD IY,TEMP
22
NEXT:    LD E,(IX+8)
23
         LD D,0
24
         LD HL,FTABLE
25
         ADD HL,DE
26
         LD A,(HL)
27
         XOR (IX)
28
         LD HL,FTABLE
29
         LD E,A
30
         LD D,0
31
         ADD HL,DE
32
         LD B,(HL)
33
         LD (IY),B
34
         INC IY
35
         LD E,(IX)
36
         LD D,0
37
         LD HL,FTABLE
38
         ADD HL,DE
39
         LD A,(HL)
40
         XOR (IX+8)
41
         LD HL,FTABLE
42
         LD E,A
43
         LD D,0
44
         ADD HL,DE
45
         LD B,(HL)
46
         LD (IY),B
47
         INC IX
48
END:     INC IY
49
         repeat NEXT to END 7 more times
50
         memcpy $16$ bytes from TEMP to DATA

von Daniel (Gast)


Lesenswert?

Im Grunde würde es mir reichen das zu simulieren dann kann ich auch 
kontrollieren ob das stimmt was ich vermute.

Hab aber noch das Problem das ich den Code nicht zum Laufen bekomme.
Dazu musste ich noch ein Array DATA erstellen und mit Testwerten füllen:

Hab die Stellen markiert die der Simulator nicht versteht
(Unrecognized instruction).
Was stimmt mit den markierten Zeilen nicht?
1
FTABLE: defs 256
2
DATA:  defs 16
3
TEMP:  defs 16
4
5
MakeArray:   
6
      ld a,2         
7
      ld b,255         
8
      ld hl,(DATA)                
9
ArrayLoop:                      
10
      ld (hl),a                    
11
      inc hl                         
12
      add a,2                       
13
      djnz ArrayLoop 
14
15
INIT:    LD HL,FTABLE
16
         LD B,1
17
         LD C,255
18
FOR:     LD (HL),B
19
         SLA B
20
         JP NC,ENDIF
21
         LD A,B
22
         XOR 065H
23
         LD B,A
24
ENDIF:   INC HL
25
         DEC C
26
         JP NZ,FOR
27
END1:    LD (HL),0
28
29
;Funtion Pi anwenden
30
31
PI:      LD IX,DATA
32
         LD IY,TEMP
33
NEXT:    LD E,(IX+8)
34
         LD D,0
35
         LD HL,FTABLE
36
         ADD HL,DE
37
         LD A,(HL)
38
      >> XOR (IX)
39
         LD HL,FTABLE
40
         LD E,A
41
         LD D,0
42
         ADD HL,DE
43
         LD B,(HL)
44
      >> LD (IY),B
45
         INC IY
46
      >> LD E,(IX)
47
         LD D,0
48
         LD HL,FTABLE
49
         ADD HL,DE
50
         LD A,(HL)
51
         XOR (IX+8)
52
         LD HL,FTABLE
53
         LD E,A
54
         LD D,0
55
         ADD HL,DE
56
         LD B,(HL)
57
      >> LD (IY),B
58
         INC IX
59
END:     INC IY
60
         repeat NEXT to END 7 more times
61
         memcpy $16$ bytes from TEMP to DATA

von Reinhard Kern (Gast)


Lesenswert?

Daniel schrieb:
>>> XOR (IX)

IX, IY müssen mit Displacement angegeben werden, also XOR (IX+0). Gilt 
auch für LD usw. Warum besorgst du dir nicht eine Befehlsliste des Z80?

Gruss Reinhard

von Daniel (Gast)


Lesenswert?

Hi hab mir das Buch von Rodnay Zaks besorgt das sind über 630 gescannte 
Seite wo man leider nicht suchen kann. Hatte das mit dem (IX+0) noch 
nicht gefunden gehabt.

Hm jetzt hab ich das Programm zwar zum Laufen gebracht, aber das bringt 
mich doch nicht weiter.

Vielleicht versuch ich das mal so aufzubröseln:
1
PI:      LD IX,DATA
2
         LD IY,TEMP
3
NEXT:    LD E,(IX+8)
4
         LD D,0
5
         LD HL,FTABLE
6
         ADD HL,DE
7
         LD A,(HL)
8
         XOR (IX+0)
1
LD  E,(IX+8)
Damit wird der Inhalt der Speicherstelle (8. Arrayelement aus DATA in 
ein 8-Bit Register geladen z.B. 82dez.
D und E wird zusammengefügt so das man ein 16Bit Register hat.
1
LD  HL,FTABLE
2
    ADD HL,DE
Wird mit den 2 Zeilen die 82dez zu jedem Wert aus FTABLE addiert oder 
nur das 8.Arrayfeld aus FTABLE?

von Reinhard Kern (Gast)


Lesenswert?

Daniel schrieb:
> Damit wird der Inhalt der Speicherstelle (8. Arrayelement aus DATA in
> ein 8-Bit Register geladen z.B. 82dez.
> D und E wird zusammengefügt so das man ein 16Bit Register hat.
> LD  HL,FTABLE
>     ADD HL,DE

DE ist 82, HL ist die Adresse einer Tabelle, addiert zeigt HL auf den 
82ten Eintrag in der Tabelle.

Gruss Reinhard

von Michael_ (Gast)


Lesenswert?

Warum nimmst du eigentlich so ein altes System?
Die das mal vor Jahrzehnten gemacht haben, die haben die Feinheiten 
vergessen und müßten erst nachschlagen.
Und es wurden auch Programme mit undokumentierten Befehlen gemacht. Die 
liefen jedoch nicht auf allen CPU.

Aber aus Neugier, was für einen Simulator benutzt du?

von Daniel (Gast)


Lesenswert?

Aha, das heisst also das man nur mit "runden Klammern" auf den Inhalt 
zugreift, ohne Klammer ist es einfach nur eine Adresse die man übergibt.


Das würde bedeuten das in den letzten zwei Zeilen
1
PI:      LD IX,DATA
2
         LD IY,TEMP
3
NEXT:    LD E,(IX+8)
4
         LD D,0
5
         LD HL,FTABLE
6
         ADD HL,DE
7
      >> LD A,(HL)
8
      >> XOR (IX+0)

Auf den Inhalt der Speicherstelle die um 82 Positionen erhöht wurde mit 
dem Inhalt der Speicherstelle von (IX+0) XOR verknüpfe.

von Daniel (Gast)


Lesenswert?

Hi, der ganze Assembler Code ist ein uraltes Verschlüsselungsverfahren. 
Da es keine Dokumentation ausser dem Assembler Code gibt muss ich damit 
auf die Verschlüsselungsstruktur zurückschließen...

Hab keine andere Wahl, daher versuche ich den Code Stück für Stück zu 
zerlegen und zu verstehen :/

Ich nutze das "Z80 Simulator IDE" Programm zum Simulieren. Ist leider 
eine Testversion und die darf man 30mal aufrufen und schließt sich 
automatisch nach 120min -.-

von Michael_ (Gast)


Lesenswert?

Unter was läuft dein Programm, CP/M .....
Bin gerade auf diese Seite gestoßen:
http://www.z80.info/z80emu.htm#EMU_MISC
Hier hab ich mir das geholt
Z80-CPU-Emulator (V 5.2b) Full version, Z80 and/or CP/M 2.2 Emulator, By 
: Joan Riff
Z80-CPU-Emulator (V 5.2b) the file above, download it from my site

und DDR:
http://www.jens-mueller.org/jkcemu/index.html
Diese sind alle auf z80-Basis.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Hier findest du recht gute Übersichten über die Opcodes vom Z80:

http://clrhome.org/table/
http://www.z80.info/z80code.htm

Mark

von Daniel (Gast)


Lesenswert?

@Michael_
Hier hab ich die Software her:
http://www.oshonsoft.com/z80.html

Läuft auf Win7, ich find es einfacher als alles über eine Console 
bedienen zu müssen.

25€ ist nicht viel, aber nur für paar Mal benutzen lohnt es sich nicht.

Hab mir gerade den Emulator von Joan Riff, gibt es dazu eine Doku wie 
man das Programm verwendet?

von Reinhard Kern (Gast)


Lesenswert?

Daniel schrieb:
> Aha, das heisst also das man nur mit "runden Klammern" auf den Inhalt
> zugreift, ohne Klammer ist es einfach nur eine Adresse die man übergibt.

Du meinst wahrscheinlich schon das Richtige. In deinem Buch findest du 
sicher was über Adressierungsarten (das gilt allgemein, nicht nur für 
Z80). Runde Klammern bedeuten i.d.R. "Register-Indirekt", d.h. das 
Register enthält nicht die Daten, sondern die Adresse der Daten. Deshalb 
gibt es auch manche Befehle in beiden Formen:

LD   BC,HL
LD   BC,(HL)

Gruss Reinhard

von Erich (Gast)


Lesenswert?

@Reinhard Kern

Hallo Reinhard,
hast entweder ganz viel vergessen oder nicht aufgepaßt:
Diese "Befehle"
>LD   BC,HL
>LD   BC,(HL)
gib es beide definitiv NICHT beim Z80.

Gruss

von Reinhard Kern (Gast)


Lesenswert?

Erich schrieb:
> Diese "Befehle"
>>LD   BC,HL
>>LD   BC,(HL)
> gib es beide definitiv NICHT beim Z80.

Hätte heissen müssen
LD   BC,Adresse
LD   BC,(Adresse)

Ist tatsächlich schon lange her, habe im Handbuch von 1979 nachgeschaut.

Gruss Reinhard

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.