NEXT (AVR ATmega)
Am Beispiel des amForth von M.Trute für die AVR ATmega Prozessorfamilie wird gezeigt, wie ein NEXT
auch auf einer Harvard–Speichereinteilung aufgesetzt werden kann. Richtungsweisend dafür war der Beitrag von Ron Minke in den Jahren 2004 und 2005 in der Zeitschrift “Vijgeblaadje”, herausgegeben von der niederländischen Forthgruppe. Nachgedruck im Sonderheft AVR (2007)
Das NEXT
aus dem amforth von M.Trute für die AVR ATmega Prozessoren nutzt die Eigenschaften der Prozessorfamilie aus, über die Registerpaare X, Y und Z indirekte Operationen ausführen zu können. Insbesondere kann durch das Z-Register ein indirekter Sprung zum nächsten Stück Maschinencode ausgeführt werden. Da das amforth indirect threaded code ist, werden zwei indirekte Ladevorgänge benötigt um diesen Sprung zu machen.
Eine AVR 8-bit Microcontrollerbesonderheit: Der Flash besteht
aus 16-bit Zellen, die zugehörige lpm
(load program memory) liest aber 8-bit weise. Drum wird der Zeiger jeweils verdoppelt.
DO_NEXT: ; 24 CPU cycles to ijmp brts DO_INTERRUPT movw zl, XL ; Z <-- IP lsl zl ; Z * 2 rol zh ; lpm wl, Z+ ; W <-- (Z) lpm wh, Z+ ; adiw XL, 1 ; INC IP DO_EXECUTE: ; 12 cpu cycles to ijmp movw zl, wl ; Z <-- W lsl zl ; Z * 2 rol zh ; lpm temp0, Z+ ; temp <-- (Z) lpm temp1, Z+ ; movw zl, temp0 ; Z <-- temp ijmp ; JMP (Z) == PC <-- Z
Quellen
Ron Minke, „Forth von der Pike auf“, in: Forth Magazin „Vierte Dimension“, Sonderheft AVR (2007).
Matthias Trute, amforth-2.7.