.s xe xe1 xe2 xfp xsp xrv xrt ye ye1 ye2 yfp ysp yrv yrt de de1 de2 dfp dsp drv drt sM sT ss2 sarg sfs sk snil add sub inc eq lt gt isnil isatom pass1 pass2 mR mW lmar save new sys recur ret jmp jT jF switchop .m .. start of microprogram .. .. if e = NIL return NIL :begin xe isnil jT /exit ; xe isatom jT /decode ; .. e1 = tail e xe inc lmar ; mR sM de1 ; .. e2 = tail e1 xe1 inc lmar ; mR sM de2 ; .. e = head e xe pass1 lmar ; mR sM de ; .. :decode switchop ; .. retval = arg :xlit sarg pass2 sT drv ret ; .. e1 = head e1 :xadd xe1 pass1 lmar ; mR sM de1 ; .. e1 = eval e1 save ; xe1 pass1 sT de recur ; xrv pass1 sT de1 ; .. e2 = head e2 xe2 pass1 lmar ; mR sM de2 ; .. e2 = eval e2 save ; xe2 pass1 sT de recur ; xrv pass1 sT de2 ; .. retval = e1 + e2 xe1 ye2 ss2 add sT drv ret ; .. :xsub xe1 pass1 lmar ; mR sM de1 ; .. e1 = eval e1 save ; xe1 pass1 sT de recur ; xrv pass1 sT de1 ; .. e2 = head e2 xe2 pass1 lmar ; mR sM de2 ; .. e2 = eval e2 save ; xe2 pass1 sT de recur ; xrv pass1 sT de2 ; .. retval = e1 + e2 xe1 ye2 ss2 sub sT drv ret ; .. :xeq xe1 pass1 lmar ; mR sM de1 ; .. e1 = eval e1 save ; xe1 pass1 sT de recur ; xrv pass1 sT de1 ; .. e2 = head e2 xe2 pass1 lmar ; mR sM de2 ; .. e2 = eval e2 save ; xe2 pass1 sT de recur ; xrv pass1 sT de2 ; .. retval = e1 + e2 xe1 ye2 ss2 eq sT drv ret ; .. :xlt xe1 pass1 lmar ; mR sM de1 ; .. e1 = eval e1 save ; xe1 pass1 sT de recur ; xrv pass1 sT de1 ; .. e2 = head e2 xe2 pass1 lmar ; mR sM de2 ; .. e2 = eval e2 save ; xe2 pass1 sT de recur ; xrv pass1 sT de2 ; .. retval = e1 + e2 xe1 ye2 ss2 lt sT drv ret ; .. :xgt xe1 pass1 lmar ; mR sM de1 ; .. e1 = eval e1 save ; xe1 pass1 sT de recur ; xrv pass1 sT de1 ; .. e2 = head e2 xe2 pass1 lmar ; mR sM de2 ; .. e2 = eval e2 save ; xe2 pass1 sT de recur ; xrv pass1 sT de2 ; .. retval = e1 > e2 xe1 ye2 ss2 gt sT drv ret ; .. .. SS[sp+k] = fp; // new frame :xfun xsp sk add lmar ; xfp pass1 mW ; .. fp = sp+k; xsp sk add sT dfp ; .. sp = fp; xfp pass1 sT dsp ; .. e1 = head(e1); xe1 pass1 lmar ; mR sM de1 ; .. retval = eval4(e1); save ; xe1 pass1 sT de recur ; .. sp = fp - fs; // delete frame xfp sfs sub sT dsp ; .. fp = SS[fp]; xfp pass1 lmar ; mR sM dfp ret ; .. return SS[fp-arg] :xget xfp sarg sub lmar ; mR sM drv ret ; .. e1 = head(e1) :xput xe1 pass1 lmar ; mR sM de1 ; .. v = eval4(e1) save ; xe1 pass1 sT de recur ; .. SS[fp-arg] = v xfp sarg sub lmar ; xrv pass1 mW ret ; .. while e1 != NIL :xcall xe1 isnil jT /ewhile ; .. e2 = head(e1) xe1 pass1 lmar ; mR sM de2 ; .. v = eval4(e) save ; xe2 pass1 sT de recur ; .. push(v) xsp inc sT dsp lmar ; xrv pass1 mW ; .. e1 = tail(e1) xe1 inc lmar ; mR sM de1 jmp /xcall ; .. v = eval4(arg) :ewhile save ; sarg pass2 sT de recur ; ret ; .. .. e1 = head(e1) :xif xe1 pass1 lmar ; mR sM de1 ; .. v = eval4(e1) save ; xe1 pass1 sT de recur ; .. if( v != 0){ xrv isnil jT /ifelse ; .. e2 = head(e2) xe2 pass1 lmar ; mR sM de2 ; .. v = eval4(e2) save ; xe2 pass1 sT de recur ; .. return v ret ; .. }else{ e2 = tail(e2); :ifelse xe2 inc lmar ; mR sM de2 ; .. e2 = head(e2) xe2 pass1 lmar ; mR sM de2 ; .. v = eval4(e2) save ; xe2 pass1 de recur ; .. return v ret ; .. } .. .. e1 = head(e1) :xwhile xe1 pass1 lmar ; mR sM de1 ; .. e2 = head(e2) xe2 pass1 lmar ; mR sM de2 ; .. e = eval4(e1) save ; xe1 pass1 sT de recur ; .. use retval for e .. while( e != NIL ){ :wloop xrv isnil jT /ewloop ; .. v = eval4(e2); // body save ; xe2 pass1 sT de recur ; xrv pass1 sT de ; .. e = eval4(e1); // cond save ; xe1 pass1 sT de recur ; jmp /wloop ; .. } .. return v; :ewloop xe pass1 sT drv ret ; .. .. while( e1 != NIL ){ :xdo xe1 isnil jT /edo ; .. e = head(e1) xe1 pass1 lmar ; mR sM de ; .. v = eval4(e) save recur ; .. e1 = tail(e1) xe1 inc lmar ; mR sM de1 jmp /xdo ; .. } .. return v :edo ret ; .. .. e1 = head(e1) :xnew xe1 pass1 lmar ; mR sM de1 ; .. v = eval4(e1) save ; xe1 pass1 sT de recur ; .. v = new(v) .. return v new ret ; .. .. e1 = head(e1) :xldx xe1 pass1 lmar ; mR sM de1 ; .. e = eval4(e1) // index save ; xe1 pass1 sT de recur ; .. v = SS[fp-arg] + e xfp sarg sub lmar ; mR sM drt ; xrt yrv ss2 add lmar ; .. v = heap[v] .. return v mR sM drv ret ; .. .. e1 = head(e1) :xstx xe1 pass1 lmar ; mR sM de1 ; .. rv = eval4(e1) // index save ; xe1 pass1 sT de recur ; .. rt = SS[fp-arg] xfp sarg sub lmar ; mR sM drt ; .. e1 = rt + rv xrt yrv ss2 add sT de1 ; .. e2 = head(e2) xe2 pass1 lmar ; mR sM de2 ; .. rv = eval4(e2) // value save ; xe2 pass1 sT de recur ; .. M[e1] = rv return xe1 pass1 lmar ; xrv pass1 mW ret ; .. .. e1 = head(e1) :xsys xe1 pass1 lmar ; mR sM de1 ; .. v = eval4(e1) save ; xe1 pass1 sT de recur ; sys ret ; .. retval = NIL :exit snil pass2 sT drv ret ; .e