# M68HC05 Code intepretieren



## osion (13. Mrz 2022)

Hallo

Ich soll ermitteln, welche Zahl am Ende unter der Speicheradresse $00FF gespeichert wird.
Welche Zahl wird für den Accumulator gebraucht?


----------



## Jw456 (13. Mrz 2022)

Bein Rücksprung aus einem Call wird die Adresse vom Stack gepopt. der SP wird neu gesetzt der Speicherinhalt wir normalerweise nicht gelöscht.

es wird 0104 enthalten sein.

Da Motorola  doch zuerst das High dann Low Byte im Ram speichert, sollte es $01 sein.
Bei einer X86 CPU wäre es $04


----------



## Jw456 (13. Mrz 2022)

ich glaube es war so beim 6800 bei einem JSR zuerst wird das HSB  Push und dann das LSB 

00FC  01
00FD  07
00FE   01
00FF   04


----------



## mihe7 (13. Mrz 2022)

osion hat gesagt.:


> Welche Zahl wird für den Accumulator gebraucht?


Äh, das SUB ist hier keine Anweisung sondern eine Sprungmarke. Der Opcode 81 steht für RTS.


----------



## Jw456 (13. Mrz 2022)

Der Accumulator wird in dem Programm garnicht benutzt, verändert.

00FF   07


----------



## osion (13. Mrz 2022)

Jw456 hat gesagt.:


> Bein Rücksprung aus einem Call wird die Adresse vom Stack gepopt. der SP wird neu gesetzt der Speicherinhalt wir normalerweise nicht gelöscht.
> 
> es wird 0104 enthalten sein.
> 
> ...





Jw456 hat gesagt.:


> ich glaube es war so beim 6800 bei einem JSR zuerst wird das HSB  Push und dann das LSB
> 
> 00FC  01
> 00FD  07
> ...


Die Lösung laut Unterlagen wäre 07. Ich bin ein wenig verwirrt. 

Ablauf:
1. Setzt den Stapelzeiger an den Anfang des Stapels zurück.
2. Rufe zweimal eine SUB auf
3. Ende des Programms

Also speichere ich im Stack die Werte ab, welche aufsteigend abgefragt werden. Am Ende habe ich somit 07..richtig soweit?



mihe7 hat gesagt.:


> Äh, das SUB ist hier keine Anweisung sondern eine Sprungmarke. Der Opcode 81 steht für RTS.


Ah das erklärt einiges, aber der SUB gibt ja nichts zurück....


----------



## Jw456 (13. Mrz 2022)

osion hat gesagt.:


> Also speichere ich im Stack die Werte ab, welche aufsteigend abgefragt werden. Am Ende habe ich somit 07..richtig soweit?


ja 07
nach dem ersten Call ist es 04 
nach dem zweiten und prog ende 07


----------



## mihe7 (13. Mrz 2022)

osion hat gesagt.:


> Ah das erklärt einiges, aber der SUB gibt ja nichts zurück....


Das Unterprogramm muss ja nichts zurückgeben.



osion hat gesagt.:


> Also speichere ich im Stack die Werte ab, welche aufsteigend abgefragt werden. Am Ende habe ich somit 07..richtig soweit?


?!?
Du hast eine JSR-Anweisung, die legt die Rücksprungadresse auf den Stack und führt einen unbedingten Sprung an die angegebene Adresse (SUB) aus.

Die Anweisung an Adresse 0101 ist CD 02 00 (JSR SUB), benötigt also drei Bytes, daher ist die Rücksprungadresse 0101 + 3 = 0104. 

Die wird auf den Stack gelegt. Der Stackpointer SP ist zunächst $FF. D. h. an Adresse $FF wird die 04 abgelegt, an Adresse $FE die 01 (falls LSB first), der Stackpointer ist dann $FD.

Anschließend findet der Sprung nach 0200 statt. Dort findet sich ein RTS. RTS holt die Rücksprungadresse vom Stack und führt den unbedingten Sprung dorthin aus. Es wird also die Adresse 0104 vom Stack gelesen, der Stackpointer ist dann wieder $FF, der Sprung nach 0104 wird ausgeführt.

An Adresse 0104 findet sich nun wieder die Anweisung CD 02 00 (JSR SUB), benötigt also drei Bytes, daher ist die Rücksprungadresse 0104 + 3 = 0107.

Die wird auf den Stack gelegt. Der Stackpointer SP ist zunächst $FF. D. h. an Adresse $FF wird die 07 abgelegt, an Adresse $FE die 01 (falls LSB first), der Stackpointer ist dann $FD.

Anschließend findet der Sprung nach 0200 statt. Dort findet sich ein RTS. RTS holt die Rücksprungadresse vom Stack und führt den unbedingten Sprung dorthin aus. Es wird also die Adresse 0107 vom Stack gelesen, der Stackpointer ist dann wieder $FF, der Sprung nach 0107 wird ausgeführt.

An $FF steht nach wie vor die 07.


----------



## osion (27. Mrz 2022)

mihe7 hat gesagt.:


> Das Unterprogramm muss ja nichts zurückgeben.
> 
> 
> ?!?
> ...


Also CD (1) 01 (2) 00 (3)?


----------



## mihe7 (29. Mrz 2022)

osion hat gesagt.:


> Also CD (1) 01 (2) 00 (3)?


Was willst Du mir damit sagen?


----------



## osion (29. Mrz 2022)

mihe7 hat gesagt.:


> Was willst Du mir damit sagen?


Soweit ich verstehe, ist das ein 3 Wort Befehl, d. h. der Zähler PC wird um 3 erhöht....also0101 + 3 = 0104


----------



## Jw456 (29. Mrz 2022)

osion hat gesagt.:


> Soweit ich verstehe, ist das ein 3 Wort Befehl, d. h. der Zähler PC wird um 3 erhöht....also0101 + 3 = 0104


Ja aber die Frage war was nach den zweiten JSR nach dem Rücksprung an adresse 00FF steht. Und das wurde auch schon gesagt.
In den ersten beiten Spalten  hast du doch den Hexdump


----------



## Jw456 (29. Mrz 2022)

JSR ist ein Unterprogramm Aufruf (Call)  es wird zu der Adresse gesprungen die im Befehl ist. Dazu wird der PC Programmcounter auf die Adresse gesetzt hier 0x0200.

Für den Rückweg aus denn Unterprogramm wir die Rücksprung Adresse auf den Stack gelegt. Das ist in diesem Fall  0x0107.  Wenn in dem Unterprogramm ein RST Befehl erkannt wird, wird die Adresse auf die der SP zeigt gelesen und in den PC geladen.  
Somit geht es bei dem nächsten Befehl  vom Hauptprogramm weiter.


----------



## mihe7 (29. Mrz 2022)

osion hat gesagt.:


> Soweit ich verstehe, ist das ein 3 Wort Befehl, d. h. der Zähler PC wird um 3 erhöht....also0101 + 3 = 0104


Jein. Der Befehl JSR benötigt 1 Byte (OpCode) zzgl. 2 Bytes für die Adresse. Macht insgesamt 3 Bytes. Da es sich um einen Sprung handelt, wird der PC nicht um 3 erhöht sondern eben auf diese Adresse gesetzt. Zuvor wird die Rücksprungadresse noch auf den Stack gelegt.


----------

