Moin.
Ich versuche gerade das DO_NEXT des amforth zuverstehen. Suchen in
der mailing list ergab dazu "no result". Gibt es da ein link zu einer
Erklärung?
Kommentiert (aber nicht unbedingt verstanden) habe ich das bisher so:
DO_NEXT: ; 24 CPU cycles to ijmp
C:001c0e f06e brts DO_INTERRUPT
C:001c0f 01fd movw zl, XL ; READ IP: Z <-- IP
C:001c10 + readflashcell wl, wh
C:001c10 0fee lsl zl ; Z*2
C:001c11 1fff rol zh
C:001c12 9185 lpm wl, Z+ ; w <-- (Z)
C:001c13 9195 lpm wh, Z+
C:001c14 9611 adiw XL, 1 ; INC IP
DO_EXECUTE: ; 12 cpu cycles to ijmp
C:001c15 01fc movw zl, wl ; Z <-- W
C:001c16 + readflashcell temp0,temp1
C:001c16 0fee lsl zl ; Z*2
C:001c17 1fff rol zh
C:001c18 9105 lpm temp0, Z+ ; temp <-- (Z)
C:001c19 9115 lpm temp1, Z+
C:001c1a 01f8 movw zl, temp0 ; Z <-- temp
C:001c1b 9409 ijmp ; jump (Z)
Da gibt es also 3 indirekte Ladevorgäng und gleich 2x die
Multiplikation mit 2.
IP ist ein 16Bit Zähler.
- Warum wird der x2 genommen um von der so ermittelten Addresse im
Flash den Wert für W zu holen?
- Der Wert in W ist nun ein Zeiger dorthin, wo der ausführbare Code
beginnt, oder?
Warum muss der wiederum erst noch x2 genommen werden, um dann über
diesen Zeiger einen Zeiger zu holen von dort den PC zu laden?
Irgendwie blicke ich gerade nicht durch. Ist das nicht eine Stufe
zuviel "indirect threading code" ?
Michael
|