aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/amforth-interpreter.asm
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/avr8/amforth-interpreter.asm')
-rw-r--r--amforth-6.5/avr8/amforth-interpreter.asm33
1 files changed, 33 insertions, 0 deletions
diff --git a/amforth-6.5/avr8/amforth-interpreter.asm b/amforth-6.5/avr8/amforth-interpreter.asm
new file mode 100644
index 0000000..1d72745
--- /dev/null
+++ b/amforth-6.5/avr8/amforth-interpreter.asm
@@ -0,0 +1,33 @@
+; the inner interpreter.
+
+DO_COLON:
+ push XH
+ push XL ; PUSH IP
+ movw XL, wl
+ adiw xl, 1
+DO_NEXT:
+.if WANT_INTERRUPTS == 1
+ cp isrflag, zerol
+ brne DO_INTERRUPT
+.endif
+ movw zl, XL ; READ IP
+ readflashcell wl, wh
+ adiw XL, 1 ; INC IP
+
+DO_EXECUTE:
+ movw zl, wl
+ readflashcell temp0,temp1
+ movw zl, temp0
+ ijmp
+
+.if WANT_INTERRUPTS == 1
+DO_INTERRUPT:
+ ; here we deal with interrupts the forth way
+ savetos
+ mov tosl, isrflag
+ clr tosh
+ clr isrflag
+ ldi wl, LOW(XT_ISREXEC)
+ ldi wh, HIGH(XT_ISREXEC)
+ rjmp DO_EXECUTE
+.endif \ No newline at end of file