SX microprogram


notation

transfer source to dest :  src->dest
alu operation to dest   :  alu(src1 op src2)->dest
memory read to dest     :  mR(ads)->dest
memory write from src   :  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}

Microprogram

fetch:  
  mR(pc)->ir, decode

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: ; jump
  pc+arg, mR(sp)->ts    ; pop ts
  sp-1, fetch
j3: ; not jump
  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 fetch

End
8 July 2006