; inner
; @ indirect
; + the instruction after this one (i.e. this is code)
; X+ the instruction after X
; ! word address of label
#define n 0
#define I n(fp)
#define R ++n(fp)
#define W ++n(fp)
#define CA ++n(fp)
#define b ++n(fp)
#define STACKw ++n(fp)
#define STACKb ++n(fp)
#define STACKf ++n(fp)
#define STACKl ++n(fp)
#define STACKp ++n(fp)
#define STACKc ++n(fp)
#define STACKm ++n(fp)
#define STACKmp ++n(fp)
colon:
+
consp I, R
movp W, I
JMP next
semi :
+
headp R, I
tail R, R
next:
movp @I, W
movp I+, I
run :
movp @W, C
movp W+, W
JMP C
; MAIN
outer :
!execute
nop
nop ; when we get back here, 2 x 2gross should be on the d stack
jmp start_restart
start_restart:
movp outer, I
consp main, R
JMP next
main:
!colon
dup[b]
semi
#define push[t] n : cons[t] n, STACK[t]
#define pop[t] n : head[t] n, STACK[t] tail STACK[t], STACK[t]
header("EXECUTE")
execute:
+
headp W, STACKp
tail STACKp, STACKp
jmp run
header("CONSTANT[t]")
constant[t]:
:
; !create
; !comma)
; !scode)
; @WA -> CA
movt t, @W
; PSH CA -> SP
const t, STACK[t]
jmp next
header(4, "DROP[t]") ; ::
drop[t]:
+
tail STACK[t], STACK[t]
JMP next
header("DUP[t]") ; A::A::
dupb:
+
headb STACKb, ++n(fp)
consb n[fp], STACKb
JMP next
dupw:
+
headw STACKw, ++n(fp)
consw n[fp], STACKw
JMP next
dupf:
+
headf STACKf, ++n(fp)
consf f[fp], STACKf
JMP next
dupl:
+
headl STACKl, ++n(fp)
consl n(fp), STACKl
JMP next
header("2DUP[t]") ; A::A::A::
twodup[t]:
+
head[t] STACK[t], t
cons[t] t, STACK[t]
cons[t] t, STACK[t]
JMP next
header("SWAP[t]") ; B::A::
swap[t] :
+
pop[t] t1
pop[t] t2
cons[t] t2, STACK[t]
cons[t] t1, STACK[t]
JMP next
header("OVER") ; B::A::B::
over[t] :
+
tail STACK[t], t1
head[t] t1, t2
cons[t] t2, STACK[t]
JMP next
header("RROT") ; C::B::A::
rrot[t]:
+
pop[t] t1
pop[t] t2
pop[t] t3
cons[t] t1, STACK[t]
cons[t] t2, STACK[t]
cons[t] t3, STACK[t]
JMP next
header("LROT") ; B::C::A::
lrot[t]:
+
pop[t] t1
pop[t] t2
pop[t] t3
cons[t] t1, STACK[t]
cons[t] t3, STACK[t]
cons[t] t2, STACK[t]
JMP next
header("2OVER") ; C::A::B::C::
twoover[t]:
+
tail t1, STACK[t]
tail t2, t1
head t3, t2
cons[t] t3, STACK[t]
JMP next
header("2SWAP") ; C::B::A:: funny this looks the same as RROT
twoswap[t]:
+
pop[t] t1
pop[t] t2
pop[t] t3
cons[t] t1, STACK[t]
cons[t] t2, STACK[t]
cons[t] t3, STACK[t]
JMP next
|