aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/words/qdo.asm
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
commit67d25d837ac55f28a366c0a3b262e439a6e75fc3 (patch)
treedf7715c7724c5935ab87c807f3b8b4ef529315e3 /amforth-6.5/common/words/qdo.asm
parente0d6784e89dba33226c0edb815bb974486fa7c48 (diff)
Add AmForth
Diffstat (limited to 'amforth-6.5/common/words/qdo.asm')
-rw-r--r--amforth-6.5/common/words/qdo.asm54
1 files changed, 54 insertions, 0 deletions
diff --git a/amforth-6.5/common/words/qdo.asm b/amforth-6.5/common/words/qdo.asm
new file mode 100644
index 0000000..491d06c
--- /dev/null
+++ b/amforth-6.5/common/words/qdo.asm
@@ -0,0 +1,54 @@
+; ( n1|u1 n2|u2 -- ) R( -- | loop-sys ) (C: -- do-sys)
+; Compiler
+; start a ?do .. [+]loop control structure
+
+.if cpu_msp430==1
+ IMMED(XT_QDO,3,"?do",DOCOLON)
+.endif
+
+.if cpu_avr8==1
+
+VE_QDO:
+ .dw $0003
+ .db "?do",0
+ .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+XT_QDO:
+ .dw DO_COLON
+PFA_QDO:
+.endif
+ .dw XT_COMPILE
+ .dw XT_QDOCHECK
+ .dw XT_IF
+ .dw XT_DO
+ .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+ .dw XT_TO_L ; then follows at the end.
+ .dw XT_EXIT
+
+; there is no special runtime for ?do, the do runtime
+; gets wrapped with the sequence
+; ... ?do-check if do ..... loop then
+; with
+; : ?do-check ( n1 n2 -- n1 n2 true | false )
+; 2dup = dup >r if 2drop then r> invert ;
+
+.if cpu_msp430==1
+ HEADLESS(XT_QDOCHECK,DOCOLON)
+.endif
+
+.if cpu_avr8==1
+XT_QDOCHECK:
+ .dw DO_COLON
+PFA_QDOCHECK:
+.endif
+ .dw XT_2DUP
+ .dw XT_EQUAL
+ .dw XT_DUP
+ .dw XT_TO_R
+ .dw XT_DOCONDBRANCH
+ DEST(PFA_QDOCHECK1)
+ .dw XT_2DROP
+PFA_QDOCHECK1:
+ .dw XT_R_FROM
+ .dw XT_INVERT
+ .dw XT_EXIT