micro step of R1 chip 10 June 99 Each line is one time step. Notation // comment line name : macro name *name macro expansion (substitute with macro body) destination = source single transfer of data between two registers e1 ; e2 event 1 is concurrent with event 2 M[ads] memory at address specified by register ads Registers : mar, mdr, ir, ip, sp, fp, x, y, z mar memory address register mdr memory data register ir instruction register ip instruction pointer (program counter) sp stack pointer fp frame pointer x,y,z alu registers ALU : alu( function ) Begin the micro steps main : while ( 1 ) { *ifetch ir = mdr switch( ir ) { 0 : *lit 1 : *lval . . . } } ifetch : mar = ip mdr = M[mar] ; ip++ push : sp++ mar = sp M[mar] = mdr pushx : mdr = x *push pushz : mdr = z *push pop : mar = sp mdr = M[mar] ; sp-- popx : *pop x = mdr popy : *pop y = mdr lit : *ifetch // fetch arg *push lval : *ifetch // fetch arg x = fp y = mdr z = alu(+) *pushz lvalg : // same as *lit rval : *ifetch x = fp y = mdr z = alu(+) mar = z mdr = M[mar] *push rvalg : *ifetch mar = mdr mdr = M[mar] *push fetch : (ads -- val) mar = sp mdr = M[mar] ; sp-- mar = mdr *push set : (ads,val - - ) *popx *popy mar = x mdr = y M[mar] = mdr index : // is same as *add jmp : *ifetch ip = mdr jz : *ifetch if cond then ip = mdr call : ( - - retads) mdr = ip *push // ---------- stack frame---- hi ads sp -> top of stack stack area sp' ip' fp -> fp' local var // -------------------------------- func : x = sp mdr = fp *push // push fp fp = sp mdr = ip *push // push ip *pushx // push sp sp++ ret0 : sp = fp mar = fp ; sp++ mdr = M[mar] fp = mdr // pop fp' mar = sp mdr = M[mar] ; sp++ ip = mdr // pop ip' mar = sp mdr = M[mar] sp = mdr // pop sp' ret1 : *popx *ret0 *pushx add : *popx *popy z = alu(+) *pushz Other instructions not yet implemented : sub, mul, div, minus, not, and, or, lt, le, eq, ne, ge, gt in, out