
sx microprogram

notation

src->dest
alu(src1 op src2)->dest
mR(ads)->dest
src->mW(ads)

short hand

sp+1  =  alu(sp+1)->sp
sp-1  =  alu(sp-1)->sp
pc+1  =  pc+1->pc
pc+arg = pc+arg->pc

alu op = 
  {add,sub,mul,div,band,bor,bxor,not,
  eq,ne,lt,le,ge,gt,shl,shr,mod,inc,dec}

fetch:  
  mR(pc)->ir, dispatch

bop: 
  mR(sp)->ff
  sp-1
  alu(ts op ff)->ts, pc+1, fetch

uop:
  alu(ts op ?)->ts, pc+1, fetch

get:
  sp+1
  ts->mW(sp)		; push ts
  alu(fp-arg)->tbus, mR(tbus)->ts, pc+1, fetch

put:
  alu(fp-arg)->tbus, ts->mW(tbus)
  mR(sp)->ts		; pop ts
  sp-1, pc+1, fetch

ld:
  sp+1
  ts->mW(sp)		; push ts
  mR(arg)->ts, pc+1, fetch

st:
  ts->mW(arg)
  mR(sp)->ts		; pop ts
  sp-1, pc+1, fetch

ldx:  {ads idx}
  mR(sp)->ff	 	; pop ads
  sp-1
  alu(ff+ts)->tbus, mR(tbus)->ts, pc+1, fetch

stx:  {ads idx val}
  mR(sp)->nx		; pop idx
  sp-1
  mR(sp)->ff		; pop ads
  alu(nx+ff)->tbus, ts->mW(tbus)
  sp-1
  mR(sp)->ts		; pop ts
  sp-1, pc+1, fetch

lit:
  sp+1
  ts->mW(sp)		; push ts
  arg->ts, pc+1, fetch

jmp:
  pc+arg, fetch

jt:
  alu(ts=0), ifTrue j3
j2:
  pc+arg, mR(sp)->ts	; pop ts
  sp-1, fetch
j3:
  pc+1, mR(sp)->ts	; pop ts
  sp-1, fetch

jf:
  alu(ts=0), ifTrue j2
  pc+1, mR(sp)->ts	; pop ts
  sp-1, fetch

call:
  store ret ads both in ts and frame

  sp+1
  ts->mW(sp), pc+1 ; push ts
  pc->ts	; ret ads
  arg->nx	; save call ads 
  mR(arg)->ir	; get fun.fs
  alu(fp+arg)->tbus, fp->mW(tbus) ; save old fp
  alu(fp+arg)->fp->sp ; new fp,sp
  ts->mW(sp+1)	; save ret ads
  alu(nx+1)->pc, fetch ; jump to body

call:
  store ret ads on ts only

  sp+1
  ts->mW(sp), pc+1 ; push ts
  pc->ts	; ret ads
  arg->nx	; save call ads
  mR(arg)->ir	; get fun.fs
  alu(fp+arg)->tbus, fp->mW(tbus) ; save old fp
  alu(fp+arg)->fp->sp ; new fp,sp
  alu(nx+1)->pc, fetch ; jump to body

ret:  
  ret with retads on ts
  retv with retads in frame

  sp->ff
  alu(fp=ff), ifFalse r2
  ts->pc  			; do ret
  alu(fp-arg)->sp
  mR(sp)->ts			; pop ts
  sp-1
  mR(fp)->fp, fetch		; restore fp
r2:				; do retv
  alu(fp+1)->tbus, mR(tbus)->pc ; ret ads
  alu(fp-arg)->sp
  mR(fp)->fp, fetch
  
ret:
  return ads is in frame

  alu(fp+1)->tbus, mR(tbus)->pc ; restore ret ads
  sp->ff
  alu(fp=ff), ifFalse r2 ; do retv
  alu(fp-arg)->sp	; restore sp
  mR(sp)->ts		; pop ts
  sp-1
  mR(fp)->fp, fetch	; restore fp
r2:
  alu(fp-arg)->sp
  mR(fp)->fp, fetch
  
inc:
dec:
sys:
case:
array:
end:
  trap


End
8 July 2006

