0 .. sx2 microprogram v 1.0   14 July 2006
0 ..
0 .s
0 x.ts
0 x.fp
0 x.nx
0 y.ff
0 y.arg
0 y.u
0 b.tbus
0 b.dbus
0 b.sp
0 d.fp
0 d.ts
0 d.v
0 d.u
0 a.tbus
0 a.pc
0 a.sp
0 a.fp
0 j.pc1
0 j.pcarg
0 j.tbus
0 so.sp
0 so.spx
0 si.inc
0 si.dec
0 si.k
0 si.tbus
0 w.v1
0 w.v2
0 w.v3
0 w.v4
0 w.varg
0 z.dbus
0 z.ts
0 t.v
0 t.pc
0 t.bus
0 u.iru
0 u.dbus
0 alu.add
0 alu.sub
0 alu.inc
0 alu.dec
0 alu.add2
0 alu.z
0 alu.eq
0 alu.op
0 alu.p1
0 alu.p2
0 .. load registers
0 lir
0 lts
0 lfp
0 lsp
0 lnx
0 lff
0 lpc
0 lv1
0 lv2
0 lv3
0 lv4
0 lvarg
0 lu
0 mR
0 mW
0 .. next micro ads
0 ifT
0 ifF
0 ifu0
0 ifp0
0 ifargm
0 skipu
0 decode
0 trap
0 .m
0 :fetch
0 ..  mR(pc)->ir, dispatch
0   a.pc mR lir decode ;
1 :bop
1 ..  mR(sp)->ff
1 ..  sp-1
1 ..  alu(ts op ff)->ts, pc+1, fetch
1   so.sp si.dec lsp a.sp mR b.dbus lff ;
2   x.ts y.ff alu.op b.tbus t.bus lts j.pc1 lpc /fetch ;
3 :uop
3 ..  alu(ts op ?)->ts, pc+1, fetch
3   x.ts alu.op b.tbus t.bus lts j.pc1 lpc /fetch ;
4 :get
4 ..  sp+1
4 ..  ts->mW(sp)		; push ts
4 ..  alu(fp-arg)->tbus, mR(tbus)->ts, pc+1, fetch
4   so.spx si.inc lsp a.sp d.ts mW ;
5   x.fp y.arg alu.sub a.tbus mR b.dbus t.bus lts j.pc1 lpc /fetch ;
6 :get1
6 ..  push ts, v[arg]->ts
6   so.spx si.inc lsp a.sp d.ts mW w.v1 t.v lts j.pc1 lpc /fetch ;
7 :get2
7   so.spx si.inc lsp a.sp d.ts mW w.v2 t.v lts j.pc1 lpc /fetch ;
8 :get3
8   so.spx si.inc lsp a.sp d.ts mW w.v3 t.v lts j.pc1 lpc /fetch ;
9 :get4
9   so.spx si.inc lsp a.sp d.ts mW w.v4 t.v lts j.pc1 lpc /fetch ;
10 :put
10 ..  alu(fp-arg)->tbus, ts->mW(tbus)
10 ..  mR(sp)->ts		; pop ts
10 ..  sp-1, pc+1, fetch
10   x.fp y.arg alu.sub a.tbus d.ts mW ;
11 :popts
11   so.sp si.dec lsp a.sp mR b.dbus t.bus lts j.pc1 lpc /fetch ;
12 :put1
12 ..  ts->v[arg], pop ts
12   z.ts lv1 so.sp si.dec lsp a.sp mR b.dbus t.bus lts j.pc1 lpc /fetch ;
13 :put2
13   z.ts lv2 so.sp si.dec lsp a.sp mR b.dbus t.bus lts j.pc1 lpc /fetch ;
14 :put3
14   z.ts lv3 so.sp si.dec lsp a.sp mR b.dbus t.bus lts j.pc1 lpc /fetch ;
15 :put4
15   z.ts lv4 so.sp si.dec lsp a.sp mR b.dbus t.bus lts j.pc1 lpc /fetch ;
16 :ld
16 ..  sp+1
16 ..  ts->mW(sp)		; push ts
16 ..  mR(arg)->ts, pc+1, fetch
16   so.spx si.inc lsp a.sp d.ts mW ;
17   y.arg alu.p2 a.tbus mR b.dbus t.bus lts j.pc1 lpc /fetch ;
18 :st
18 ..  ts->mW(arg)
18 ..  mR(sp)->ts		; pop ts
18 ..  sp-1, pc+1, fetch
18   d.ts y.arg alu.p2 a.tbus mW /popts ;
19 :ldx
19 ..  mR(sp)->ff	 	; pop ads
19 ..  sp-1
19 ..  alu(ff+ts)->tbus, mR(tbus)->ts, pc+1, fetch
19   so.sp si.dec lsp a.sp mR b.dbus lff ;
20   x.ts y.ff alu.add a.tbus mR b.dbus t.bus lts j.pc1 lpc /fetch ;
21 :stx
21 ..  mR(sp)->nx		; pop idx
21 ..  sp-1
21 ..  mR(sp)->ff		; pop ads
21 ..  alu(nx+ff)->tbus, ts->mW(tbus)
21 ..  sp-1
21 ..  mR(sp)->ts		; pop ts
21 ..  sp-1, pc+1, fetch
21   so.sp si.dec lsp a.sp mR b.dbus lnx ;
22   so.sp si.dec lsp a.sp mR b.dbus lff ;
23   x.nx y.ff alu.add a.tbus d.ts mW /popts ;
24 :lit
24 ..  sp+1
24 ..  ts->mW(sp)		; push ts
24 ..  arg->ts, pc+1, fetch
24   so.spx si.inc lsp a.sp d.ts mW y.arg alu.p2 b.tbus t.bus lts j.pc1 lpc /fetch ;
25 :jmp
25   j.pcarg lpc /fetch ;
26 :jt
26 ..  alu(ts=0), ifTrue j3  ; if true, don't jump
26   x.ts alu.z ifT /j3 ;
27 :j2
27 ..  <jump>
27 ..  pc+arg, mR(sp)->ts	; pop ts
27 ..  sp-1, fetch
27   j.pcarg lpc so.sp si.dec lsp a.sp mR b.dbus t.bus lts /fetch ;
28 :jf
28 ..  alu(ts=0), ifTrue j2 ; if true,  jump
28   x.ts alu.z ifT /j2 ;
29 :j3
29 ..  <don't jump>
29 ..  pc+1, mR(sp)->ts	; pop ts
29 ..  sp-1, fetch
29   j.pc1 lpc so.sp si.dec lsp a.sp mR b.dbus t.bus lts /fetch ;
30 :call
30 .. ; call, keep ret ads on ts
30 ..  push ts, pc+1					; flush ts
30 ..  pc->ts, arg->pc, if u=0 fetch	; save ret ads
30 .. <save v>
30 ..    alu(fp-u)->fp, skipu
30 ..    vn->mW(fp), fp+1->fp
30 ..    ... repeat to v1, fetch
30   so.spx si.inc lsp a.sp d.ts mW j.pc1 lpc ;
31   t.pc lts y.arg alu.p2 j.tbus lpc ifu0 /fetch ;
32 .. <save v>
32   x.fp y.u alu.sub b.tbus lfp skipu ;
33   w.v4 a.fp d.v mW x.fp alu.inc b.tbus lfp ;
34   w.v3 a.fp d.v mW x.fp alu.inc b.tbus lfp ;
35   w.v2 a.fp d.v mW x.fp alu.inc b.tbus lfp ;
36   w.v1 a.fp d.v mW x.fp alu.inc b.tbus lfp /fetch ;
37 :fun
37 ..  ; fun.p.u.k
37 ..  fp->mW(sp+k), sp+k->sp 		; save old fp, new sp
37 ..  sp->fp						; new fp
37 ..  sp+1, u->mW(sp), iru->u		; push u
37 ..  pc+1, if p=0 fetch
37 .. <cache v>
37 ..    alu(fp-u)->fp, skipu
37 ..    mR(fp)->vn, fp+1->fp
37 ..    ..  repeat to v1, fetch
37   si.k lsp so.spx a.sp d.fp mW ;
38   b.sp lfp ;
39   si.inc so.spx lsp a.sp d.u mW u.iru lu ;
40   j.pc1 lpc ifp0 /fetch ;
41 :cachev
41   x.fp y.u alu.sub b.tbus lfp skipu ;
42   a.fp mR z.dbus lv4 x.fp alu.inc b.tbus lfp ;
43   a.fp mR z.dbus lv3 x.fp alu.inc b.tbus lfp ;
44   a.fp mR z.dbus lv2 x.fp alu.inc b.tbus lfp ;
45   a.fp mR z.dbus lv1 x.fp alu.inc b.tbus lfp /fetch ;
46 :ret
46 .. ; ret with retads on TS
46 .. ; retv with retads on frame
46 ..  sp-1->ff
46 ..  alu(fp=ff), ifFalse r2	; do retv
46 .. <doret>
46 ..  ts->pc  			; do ret
46 ..  mR(sp)->u			; pop u
46 ..  alu(fp-arg)->sp
46 ..  pop ts
46 ..  mR(fp)->fp, if u=0 fetch ; restore fp
46 ..  <cache v>, fetch
46   si.dec so.spx b.sp lff ;
47   x.fp y.ff alu.eq ifF /r2 ;
48 .. <doret>
48   x.ts alu.p1 j.tbus lpc ;
49   so.sp a.sp mR u.dbus lu ;
50   x.fp y.arg alu.sub si.tbus lsp ;
51   so.sp si.dec lsp a.sp mR b.dbus t.bus lts ifu0 /r3 ;
52   a.fp mR b.dbus lfp /cachev ;
53 :r2
53 .. <doretv>
53 ..  alu(fp+2)->tbus, mR(tbus)->ff ; ret ads
53 ..  ff->pc
53 ..  alu(fp+1)->tbus, mR(tbus)->u  ; pop u
53 ..  alu(fp-arg)->sp, if u=0 r3 ; skip cachev
53 ..  mR(fp)->fp cachev
53   x.fp alu.add2 a.tbus mR b.dbus lff ;
54   y.ff alu.p2 j.tbus lpc ;
55   x.fp alu.inc a.tbus mR u.dbus lu ;
56   x.fp y.arg alu.sub si.tbus lsp ifu0 /r3 ;
57   a.fp mR b.dbus lfp /cachev ;
58 :r3
58 ..  <ret end>
58   a.fp mR b.dbus lfp /fetch ;
59 :inc
59 ..  ts->nx, v[arg]->ts  if arg > maxv inc2
59 ..  <update v>
59 ..  alu(ts+1)->ts
59 ..  ts->v[arg], nx->ts, pc+1, fetch
59   x.ts alu.p1 b.tbus lnx w.varg t.v lts ifargm /inc2 ;
60   x.ts alu.inc b.tbus t.bus lts ;
61   z.ts lvarg x.nx alu.p1 b.tbus t.bus lts j.pc1 lpc /fetch ;
62 :inc2
62 ..  <update SS>
62 ..  alu(fp-arg)->tbus, mR(tbus)->ts
62 ..  alu(ts+1)->ts
62 ..  alu(fp-arg)->tbus, ts->mW(tbus)
62 ..  nx->ts, pc+1, fetch
62   x.fp y.arg alu.sub a.tbus mR b.dbus t.bus lts ;
63   x.ts alu.inc b.tbus t.bus lts ;
64   x.fp y.arg alu.sub a.tbus d.ts mW ;
65   x.nx alu.p1 b.tbus t.bus lts j.pc1 lpc /fetch ;
66 :dec
66 ..  ts->nx, v[arg]->ts  if arg > maxv inc2
66 ..  <update v>
66 ..  alu(ts-1)->ts
66 ..  ts->v[arg], nx->ts, pc+1, fetch
66   x.ts alu.p1 b.tbus lnx w.varg t.v lts ifargm /dec2 ;
67   x.ts alu.dec b.tbus t.bus lts ;
68   z.ts lvarg x.nx alu.p1 b.tbus t.bus lts j.pc1 lpc /fetch ;
69 :dec2
69 ..  <update SS>
69 ..  alu(fp-arg)->tbus, mR(tbus)->ts
69 ..  alu(ts-1)->ts
69 ..  alu(fp-arg)->tbus, ts->mW(tbus)
69 ..  nx->ts, pc+1, fetch
69   x.fp y.arg alu.sub a.tbus mR b.dbus t.bus lts ;
70   x.ts alu.dec b.tbus t.bus lts ;
71   x.fp y.arg alu.sub a.tbus d.ts mW ;
72   x.nx alu.p1 b.tbus t.bus lts j.pc1 lpc /fetch ;
73 :sys
73 :array
73 :end
73   trap j.pc1 lpc /fetch ;
74 ..
74 .e
