Nächstes Update.
postpone war noch fehlerhaft. Ich wusste nicht dass postpone compile und
[compile] ablöst und abhängig davon ist ob die zu "postponende"
Definition immediate ist oder nicht.
Folgender Teil des Test-Suits schlug deshalb fehl:
1 | ": GT1 123 ;"_s;
|
2 | ": GT4 postpone GT1 ; immediate"_s;
|
3 | ": GT5 GT4 ;"_s;
|
Anstatt dass die Stacktiefe gleich blieb pushte GT5 bereits während dem
compilieren 123 auf den Stack.
Der Fix war zwar flott eingebaut, funktionierte aber wegen einer
gemeinen Eigenheit des Thumb2 Assemblers nicht sofort. Und zwar benutze
ich zum Compilieren von Funktionsaufrufen das Wort "compile,".
compile, löst lange Funktionsaufrufe mit der Instruktion blx auf. In der
blx Instruktion ist das unterste Bit für den Wechsel zw. Thumb und ARM
Instruction Set reserviert. Ein gesetztes Bit steht hierbei für Thumb,
ein gelöschtes für ARM. Weil der ARMv7-M ja kein ARM kann hab ich
innerhalb von compile, stets #1 zur Adresse dazuaddiert.
Das geht aber nur so lange gut, solange Forth intern selbst nur gerade
Adressen an compile, übergibt. Innerhalb der Definition von postpone
lade ich nun aber das Symbol einer Funktion direkt via Pseudoload
Der Assembler ist so smart und setzt dabei automatisch das untereste
Bit. Zählt man jetzt in compile, noch #1 dazu, dann explodiert der
Funktionsaufruf natürlich... :D