Daniel Laube schrieb:
> verbraucht werden. Und hier verstehe ich es nichtmehr. Wie kommen 607
> Takte zusammen? Ich verstehe die ganze Architektur auch nicht ganz, sind
> das irgendwie verschachtelte schleifen oder läuft das so ab: temp2 immer
> weiter dekremieren bis er null ist und danach temp1 dekremiert bis er 0
> ist?
Am einfachsten ist es, wenn du im Simulator da einfach mal in
Einzelschritten durchgehst. Dazu die Konstanten auf kleinere Werte
runtersetzen, sonst stepst du dir einen Wolf.
Ja, die sind ineinander geschachtelt!
mal etwas mehr Leerraum und ein paar Pfeile reingesetzt
ldi temp1, $21
+-----> WGLOOP0: ldi temp2, $C9
|
| +-> WGLOOP1: dec temp2
| +------ brne WGLOOP1
|
| dec temp1
+------------- brne WGLOOP0
ret
temp2 wird also solange runtergezählt, bis es 0 geworden ist. Was
passiert danach? Danach wird temp1 runtergezählt und wenn es noch nicht
0 ist, dann gehts zurück an die Stelle, an der temp2 wieder mit $C9
geladen wird und anschliessend wird temp2 wieder runtergezählt, bis es 0
geworden ist. Wieder wird temp1 um 1 vermindert und wenn es nicht 0 ist,
gehts zurück an die Stelle, an der temp2 mit C9 geladen wird und wieder
wird temp2 solange runtergezählt bis es 0 geworden ist. usw. usw.
Irgendwann ist dann auch temp1 zu 0 geworden und der Rücksprung
unterbleibt.
Wie die 603 zustande kommen, sollte für dich allerdings nachvollziehbar
sein. $C9 ist eine Hexzahl. In Dezimaler Schreibweise wäre das 201. Und
ein Durchgang durch die temp2-Schleife dauert 3 Takte. Die SChleife wird
201 mal wiederholt bei 3 Takten, das macht 603 Takte. Der letze
Durchgang ist ein wenig anders, weil dann der Sprung zu WGLOOP1 nicht
genommen wird und ehe die Schleiferei losging wurde an temp2 der Wert C9
zugewiesen, was ja ebenfalls ein paar Takte dauert.
Aus Sicht der temp1 Schleife
ldi temp1, $21
WGLOOP0:
mache irgendwas
dec temp1
brne WGLOOP0
dauert dieses "mache irgendwas" 603 + unterbliebender-Branch + "Lade
temp2" Takte. Dazu kommen dann noch die Anzahl der Takte um temp1
runterzuzählen und den Sprung nach WGLOOP0 zu machen.