; ( -- ) System
; R(i*x - j*x )
; interpret input word by word. may throw exceptions
VE_INTERPRET:
.db $09, "interpret"
.dw VE_HEAD
.set VE_HEAD = VE_INTERPRET
XT_INTERPRET:
.dw DO_COLON
PFA_INTERPRET:
PFA_INTERPRET1:
.dw XT_BL
.dw XT_WORD
.dw XT_DUP
.dw XT_CFETCH
.dw XT_GREATERZERO
.dw XT_DOCONDBRANCH
.dw PFA_INTERPRET4
.dw XT_FIND
.dw XT_QDUP
.dw XT_EQUALZERO
.dw XT_DOCONDBRANCH
.dw PFA_INTERPRET2
.dw XT_NUMBER
; check state
.dw XT_STATE
.dw XT_FETCH
.dw XT_NOTEQUALZERO
.dw XT_DOCONDBRANCH
.dw PFA_INTERPRET9
;
.dw XT_COMPILE
.dw XT_DOLITERAL
.dw XT_COMMA
PFA_INTERPRET9:
.dw XT_DOBRANCH
.dw PFA_INTERPRET3
PFA_INTERPRET2:
; either compile or execute
.dw XT_GREATERZERO
.dw XT_DOCONDBRANCH
.dw PFA_INTERPRET5
; flag was 1: always execute
.dw XT_EXECUTE
.dw XT_DOBRANCH
.dw PFA_INTERPRET6
PFA_INTERPRET5:
; check state
.dw XT_STATE
.dw XT_FETCH
.dw XT_EQUALZERO
.dw XT_DOCONDBRANCH
.dw PFA_INTERPRET7
; state is zero, execute xt
.dw XT_EXECUTE
.dw XT_DOBRANCH
.dw PFA_INTERPRET8
PFA_INTERPRET7:
.dw XT_COMMA
PFA_INTERPRET8:
PFA_INTERPRET6:
PFA_INTERPRET3:
.dw XT_DOBRANCH
.dw PFA_INTERPRET1
PFA_INTERPRET4:
.dw XT_DROP
.dw XT_EXIT