0 .. this is nut v2.0
0 .. add ld, st, ldy, sty
0 .. eliminate rt, save -> pushe, new -> sys 3  5 jan 2005
0 .s
0 xe
0 xe1
0 xe2
0 xfp
0 xsp
0 xrv
0 ye
0 ye1
0 ye2
0 yfp
0 ysp
0 yrv
0 de
0 de1
0 de2
0 dfp
0 dsp
0 drv
0 sM
0 sT
0 ss2
0 sarg
0 sfs
0 sk
0 snil
0 add
0 sub
0 inc
0 eq
0 lt
0 gt
0 isnil
0 isatom
0 pass1
0 pass2
0 mR
0 mW
0 lmar
0 pushe
0 sys
0 recur
0 ret
0 jmp
0 jT
0 jF
0 switchop
0 .m
0 .. start of microprogram
0 .. <start>
0 .. if e = NIL return NIL
0 :begin 	xe isnil jT /exit ;
1   	xe isatom jT /decode ;
2 .. e1 = tail e
2   	xe inc lmar ;
3   	mR sM de1 ;
4 ..  e2 = tail e1
4   	xe1 inc lmar ;
5   	mR sM de2 ;
6 ..  e = head e
6   	xe pass1 lmar ;
7   	mR sM de ;
8 .. <decode>
8 :decode 	switchop ;
9 .. <xlit> retval = arg
9 :xlit  	sarg pass2 sT drv  ret ;
10 .. <xadd>  e1 = head e1
10 :xadd 	xe1 pass1 lmar ;
11   	mR sM de1 ;
12 ..  e1 = eval e1
12   	xe1 pass1 sT pushe recur ;
13   	xrv pass1 sT de1 ;
14 ..  e2 = head e2
14   	xe2 pass1 lmar ;
15   	mR sM de2 ;
16 ..  e2 = eval e2
16   	xe2 pass1 sT pushe recur ;
17   	xrv pass1 sT de2 ;
18 ..  retval = e1 + e2
18   	xe1 ye2 ss2 add sT drv ret ;
19 .. <xsub>
19 :xsub 	xe1 pass1 lmar ;
20   	mR sM de1 ;
21 ..  e1 = eval e1
21   	xe1 pass1 sT pushe recur ;
22   	xrv pass1 sT de1 ;
23 ..  e2 = head e2
23   	xe2 pass1 lmar ;
24   	mR sM de2 ;
25 ..  e2 = eval e2
25   	xe2 pass1 sT pushe recur ;
26   	xrv pass1 sT de2 ;
27 ..  retval = e1 - e2
27   	xe1 ye2 ss2 sub sT drv ret ;
28 .. <xeq>
28 :xeq 	xe1 pass1 lmar ;
29   	mR sM de1 ;
30 ..  e1 = eval e1
30   	xe1 pass1 sT pushe recur ;
31   	xrv pass1 sT de1 ;
32 ..  e2 = head e2
32   	xe2 pass1 lmar ;
33   	mR sM de2 ;
34 ..  e2 = eval e2
34   	xe2 pass1 sT pushe recur ;
35   	xrv pass1 sT de2 ;
36 ..  retval = e1 == e2
36   	xe1 ye2 ss2 eq sT drv ret ;
37 .. <xlt>
37 :xlt 	xe1 pass1 lmar ;
38   	mR sM de1 ;
39 ..  e1 = eval e1
39   	xe1 pass1 sT pushe recur ;
40   	xrv pass1 sT de1 ;
41 ..  e2 = head e2
41   	xe2 pass1 lmar ;
42   	mR sM de2 ;
43 ..  e2 = eval e2
43   	xe2 pass1 sT pushe recur ;
44   	xrv pass1 sT de2 ;
45 ..  retval = e1 < e2
45   	xe1 ye2 ss2 lt sT drv ret ;
46 .. <xgt>
46 :xgt 	xe1 pass1 lmar ;
47   	mR sM de1 ;
48 ..  e1 = eval e1
48   	xe1 pass1 sT pushe recur ;
49   	xrv pass1 sT de1 ;
50 ..  e2 = head e2
50   	xe2 pass1 lmar ;
51   	mR sM de2 ;
52 ..  e2 = eval e2
52   	xe2 pass1 sT pushe recur ;
53   	xrv pass1 sT de2 ;
54 ..  retval = e1 > e2
54   	xe1 ye2 ss2 gt sT drv ret ;
55 .. <xfun>
55 .. SS[sp+k] = fp;		// new frame
55 :xfun	xsp sk add lmar ;
56 	xfp pass1 mW ;
57 .. fp = sp+k;
57 	xsp sk add sT dfp ;
58 .. sp = fp;
58 	xfp pass1 sT dsp ;
59 .. e1 = head(e1);
59 	xe1 pass1 lmar ;
60 	mR sM de1 ;
61 .. retval = eval4(e1);
61 	xe1 pass1 sT pushe recur ;
62 .. sp = fp - fs;		// delete frame
62 	xfp sfs sub sT dsp ;
63 .. fp = SS[fp];
63 	xfp pass1 lmar ;
64 	mR sM dfp ret ;
65 .. <xget> return SS[fp-arg]
65 :xget 	xfp sarg sub lmar ;
66 	mR sM drv ret ;
67 .. <xld> return M[arg]
67 :xld 	sarg pass2 lmar ;
68 	mR sM drv ret ;
69 .. <xput> e1 = head(e1)
69 :xput 	xe1 pass1 lmar ;
70 	mR sM de1 ;
71 .. v = eval4(e1)
71 	xe1 pass1 sT pushe recur ;
72 .. SS[fp-arg] = v
72 	xfp sarg sub lmar ;
73 	xrv pass1 mW ret ;
74 .. <xst> e1 = head(e1)
74 :xst 	xe1 pass1 lmar ;
75 	mR sM de1 ;
76 .. v = eval4(e1)
76 	xe1 pass1 sT pushe recur ;
77 .. M[arg] = v
77 	sarg pass2 lmar ;
78 	xrv pass1 mW ret ;
79 .. <xcall> while e1 != NIL
79 :xcall 	xe1 isnil jT /ewhile ;
80 .. e2 = head(e1)
80 	xe1 pass1 lmar ;
81 	mR sM de2 ;
82 .. v = eval4(e)
82 	xe2 pass1 sT pushe recur ;
83 .. push(v)
83 	xsp inc sT dsp lmar ;
84 	xrv pass1 mW ;
85 .. e1 = tail(e1)
85 	xe1 inc lmar ;
86 	mR sM de1 jmp /xcall ;
87 .. v = eval4(arg)
87 :ewhile	sarg pass2 sT pushe recur ;
88 	ret ;
89 .. <xif>
89 .. e1 = head(e1)
89 :xif	xe1 pass1 lmar ;
90 	mR sM de1 ;
91 .. v = eval4(e1)
91 	xe1 pass1 sT pushe recur ;
92 .. if( v != 0){
92 	xrv isnil jT /ifelse ;
93 .. e2 = head(e2)
93 	xe2 pass1 lmar ;
94 	mR sM de2 ;
95 .. v = eval4(e2)
95 	xe2 pass1 sT pushe recur ;
96 .. return v
96 	ret ;
97 .. }else{ e2 = tail(e2);
97 :ifelse	xe2 inc lmar ;
98 	mR sM de2 ;
99 .. e2 = head(e2)
99 	xe2 pass1 lmar ;
100 	mR sM de2 ;
101 .. v = eval4(e2)
101 	xe2 pass1 pushe recur ;
102 .. return v
102 	ret ;
103 .. }
103 .. <xwhile>
103 .. e1 = head(e1)
103 :xwhile	xe1 pass1 lmar ;
104 	mR sM de1 ;
105 .. e2 = head(e2)
105 	xe2 pass1 lmar ;
106 	mR sM de2 ;
107 .. e = eval4(e1)
107 	xe1 pass1 sT pushe recur ;
108 .. use retval for e
108 .. while( e != NIL ){
108 :wloop	xrv isnil jT /ewloop ;
109 .. v = eval4(e2);	// body
109 	xe2 pass1 sT pushe recur ;
110 	xrv pass1 sT de ;
111 .. e = eval4(e1);	// cond
111 	xe1 pass1 sT pushe recur ;
112 	jmp /wloop ;
113 .. }
113 .. return v;
113 :ewloop	xe pass1 sT drv ret ;
114 .. <xdo>
114 .. while( e1 != NIL ){
114 :xdo	xe1 isnil jT /edo ;
115 .. e = head(e1)
115 	xe1 pass1 lmar ;
116 	mR sM de ;
117 .. v = eval4(e)
117 	xe pass1 sT pushe recur ;
118 .. e1 = tail(e1)
118 	xe1 inc lmar ;
119 	mR sM de1 jmp /xdo ;
120 .. }
120 .. return v
120 :edo	ret ;
121 .. <xldx>
121 .. e1 = head(e1)
121 :xldx	xe1 pass1 lmar ;
122 	mR sM de1 ;
123 .. e = eval4(e1)	// index
123 	xe1 pass1 sT pushe recur ;
124 .. v = SS[fp-arg] + e
124 	xfp sarg sub lmar ;
125 :xldx1	mR sM de1 ;
126 	xe1 yrv ss2 add lmar ;
127 .. v = heap[v]
127 .. return v
127 	mR sM drv ret ;
128 .. <xldy>
128 :xldy	xe1 pass1 lmar ;
129 	mR sM de1 ;
130 .. e = eval4(e1)	// index
130 	xe1 pass1 sT pushe recur ;
131 .. v = M[arg] + e
131 	sarg pass2 lmar jmp /xldx1 ;
132 .. <xstx>
132 .. e1 = head(e1)
132 :xstx	xe1 pass1 lmar ;
133 	mR sM de1 ;
134 .. rv = eval4(e1)	// index
134 	xe1 pass1 sT pushe recur ;
135 .. rt = SS[fp-arg]
135 	xfp sarg sub lmar ;
136 :xstx1	mR sM de1 ;
137 	xe1 yrv ss2 add sT de1 ;
138 .. e2 = head(e2)
138 	xe2 pass1 lmar ;
139 	mR sM de2 ;
140 .. rv = eval4(e2)	// value
140 	xe2 pass1 sT pushe recur ;
141 .. M[e1] = rv return
141 	xe1 pass1 lmar ;
142 	xrv pass1 mW ret ;
143 .. <xsty>
143 .. e1 = head(e1)
143 :xsty	xe1 pass1 lmar ;
144 	mR sM de1 ;
145 .. rv = eval4(e1)	// index
145 	xe1 pass1 sT pushe recur ;
146 .. rt = M[arg]
146 	sarg pass2 lmar jmp /xstx1 ;
147 .. <xsys>
147 .. e1 = head(e1)
147 :xsys	xe1 pass1 lmar ;
148 	mR sM de1 ;
149 .. v = eval4(e1)
149 	xe1 pass1 sT pushe recur ;
150 	sys ret ;
151 ..  <exit>  retval = NIL
151 :exit 	snil pass2 sT drv ret ;
152 .e
