Ich bin gerade beim Testen eines eigenen Emulators für den Motorola
MC68020. Als "Referenz" dient mir der Musashi Emulator. Bei folgendem
Befehl verhalten sich beide Emulatoren unterschiedlich, aber ich bin mir
nicht sicher, welches Ergebnis der Realität entspricht.
1
moves.b a7, (a7)+
In a7 steht testweise 0xFFFF0008. Mein Emulator schreibt auf Adresse
0xFFFF0008 den Wert 0x08, während Musashi den Wert 0x0A schreibt. Ich
tendiere ja dazu einem ausgereiften Emulator gegen einem neu
geschriebenen Recht zu geben, aber eigentlich ist mein Verständnis, daß
hier der Wert von A7 auf die von A7 adressierte Speicherstelle zu
schreiben ist und danach der Wert von A7 zu incrementieren ist (und
nicht der incrementierte Wert zu schreiben).
Aber wie verhält sich der MC68020 tatsächlich? Möglich wäre ja auch, daß
direkt nach dem Lesen aus A7 incrementiert wird (also post increment
nach Lesen von A7 und nicht nach Befehlsabarbeitung) und damit dann
tatsächlich A7+2 geschrieben werden würde. Oder anders ausgedrückt: wann
wird incrementiert? Nach Lesen von A7 oder nach Abarbeitung des Befehls?
Vielen Dank für die Hilfe schon mal!
Sven S. schrieb:> Aber wie verhält sich der MC68020 tatsächlich?
Dein Emulator arbeitet richtig.
Aber ist das nicht völlig egal? Wozu sollte denn der gezeigt Befehl
taugen außer dem Prozessor den Stack zu ruinieren?
Hallo Sven,
ich habe früher sehr viele Jahre mit dem 68020 in Assembler programmiert
- VMEbus usw. Leider habe ich keine Maschine mehr zur Verfügung um das
an einem lebenden Objekt zu verifizieren.
Nach meinem Verständnis ist das eindeutig ein postincrement, d.h. A7
wird NACH dem byte transfer erhöht.
Gruß
Bernd
Wenn Ihr mir dem Mschinencode mal aufschreibt und ein 68010 oder ein
68332 diesen Befehlt auch unterstützt, kann ich evtl mal nachgucken was
der macht.
Ich habe nur den fbug oder den CPU32Bug auf den ollen Platinen.. (KatCe)
Gruß,
Holm
For either of the two following examples, which use the same address register as both source and destination, the value stored is undefined. The current implementations of the MC68010, CPU32 and MC68020 store the incremented or decremented value od An.
3
4
MOVES.x An,(An)+
5
MOVES.x An,-(An)
scheint also doch der Musashi Emulator recht zu haben
Gruss Micha
Hallo alle zusammen und vielen Dank für die Rückmeldungen. Ihr seid
super.
Der Maschinencode ist:
1
0E1F F800
Und der 68010 kennt den Befehl bereits.
Zur Frage, ob der Befehl Sinn macht: Der Code ist bei einem
automatischen Test rausgepurzelt, der verschiedene Kombinationen
gegeneinander ausprobiert. Der Befehl ist gültig und ich wäre gern so
akkurat wie möglich. Und ich denke die Frage, wann jetzt genau
incrementiert wird, ist noch für andere opCodes relevant. Daher der
Versuch das zu klären. Vielen Dank für eure Hilfe! Und es wäre super,
wenn sich das am real target verifizieren ließe :-)
Sven S. schrieb:> Aber wie verhält sich der MC68020 tatsächlich? Möglich wäre ja auch, daß> direkt nach dem Lesen aus A7 incrementiert wird (also post increment> nach Lesen von A7 und nicht nach Befehlsabarbeitung) und damit dann> tatsächlich A7+2 geschrieben werden würde. Oder anders ausgedrückt: wann> wird incrementiert? Nach Lesen von A7 oder nach Abarbeitung des Befehls?> Vielen Dank für die Hilfe schon mal!
Bei movem gibt es einen Unterschied: Bsp.: movem.l a0-a3, -(a0) 68k
schreibt a0 unverändert, >68020 schreibt den dekrementierten Wert
Beim normalen move wird "After the operand address is used, it is
incremented by one, two, or four depending on the size of the operand:
byte, word, or long word, respectively"
Einzige Ausnahme afaik: A7/Stack, wird immer min. um 2 de/inkrementiert.
Micha schrieb:
...
> und zwar S.164 (acrobat-reader-zählung)
...
Hallo Micha und danke. Sehr konkreter Hinweis, dem ich mich wohl beugen
muß. Sowas in der Art hatte ich "befürchtet". Eigentlich im Recht, aber
die Wirklichkeit sieht anders aus ;-)
Arc Net schrieb:
...
> Bei movem gibt es einen Unterschied: Bsp.: movem.l a0-a3, -(a0) 68k
...
Hallo Arc Net und danke. Dann muß ich bei movem auch noch aufpassen.
Ich kann mir nicht erklären was die 0010 bei 2000 im Speicher zu suchen
hat. Eine 2000 hätte ich ja für plausibel gehalten, aber A7 ist doch
irgendwie auch der Stackpointer? Ich habe über die Dinger so gut wie
Alles vergessen.
Gruß,
Holm