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?
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
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
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?
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.
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.
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?
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?
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
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:LDIX,DATA
2
LDIY,TEMP
3
NEXT:LDE,(IX+8)
4
LDD,0
5
LDHL,FTABLE
6
ADDHL,DE
7
LDA,(HL)
8
XOR(IX+0)
1
LDE,(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
LDHL,FTABLE
2
ADDHL,DE
Wird mit den 2 Zeilen die 82dez zu jedem Wert aus FTABLE addiert oder
nur das 8.Arrayfeld aus FTABLE?
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
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?
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:LDIX,DATA
2
LDIY,TEMP
3
NEXT:LDE,(IX+8)
4
LDD,0
5
LDHL,FTABLE
6
ADDHL,DE
7
>>LDA,(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.
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 -.-
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.
@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?
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
@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
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