14 - processor model now has a program counter

This commit is contained in:
Kartik K. Agaram 2014-07-11 21:13:26 -07:00
parent d00338ee4a
commit ff8b3afd09
1 changed files with 48 additions and 46 deletions

94
mu.arc
View File

@ -12,52 +12,54 @@
(each (name . body) fns
(= function*.name body)))
(def run (instrs (o fn-args) (o returned))
(each instr instrs
(unless returned
;? (prn instr)
;? (prn memory*)
(let delim (or (pos '<- instr) -1)
(with (oarg (if (>= delim 0)
(cut instr 0 delim))
op (instr (+ delim 1))
arg (cut instr (+ delim 2)))
;? (prn op " " oarg)
(case op
loadi
(= (memory* oarg.0.1) arg.0)
add
(= (memory* oarg.0.1)
(+ (memory* arg.0.1) (memory* arg.1.1)))
sub
(= (memory* oarg.0.1)
(- (memory* arg.0.1) (memory* arg.1.1)))
mul
(= (memory* oarg.0.1)
(* (memory* arg.0.1) (memory* arg.1.1)))
div
(= (memory* oarg.0.1)
(/ (real (memory* arg.0.1)) (memory* arg.1.1)))
idiv
(= (memory* oarg.0.1)
(trunc:/ (memory* arg.0.1) (memory* arg.1.1))
(memory* oarg.1.1)
(mod (memory* arg.0.1) (memory* arg.1.1)))
read
(= (memory* oarg.0.1)
; hardcoded channel for now
(memory* pop.fn-args.1))
reply
(= returned (annotate 'result arg))
; else user-defined function
(let results (run function*.op arg)
;? (prn "== " memory*)
(each o oarg
;? (prn o)
(= (memory* o.1) (memory* pop.results.1))))
)))))
;? (prn "return")
rep.returned)
(def run (instrs (o fn-args))
(ret result nil
(for pc 0 (< pc len.instrs) (++ pc)
(let instr instrs.pc
;? (prn instr)
;? (prn memory*)
(let delim (or (pos '<- instr) -1)
(with (oarg (if (>= delim 0)
(cut instr 0 delim))
op (instr (+ delim 1))
arg (cut instr (+ delim 2)))
;? (prn op " " oarg)
(case op
loadi
(= (memory* oarg.0.1) arg.0)
add
(= (memory* oarg.0.1)
(+ (memory* arg.0.1) (memory* arg.1.1)))
sub
(= (memory* oarg.0.1)
(- (memory* arg.0.1) (memory* arg.1.1)))
mul
(= (memory* oarg.0.1)
(* (memory* arg.0.1) (memory* arg.1.1)))
div
(= (memory* oarg.0.1)
(/ (real (memory* arg.0.1)) (memory* arg.1.1)))
idiv
(= (memory* oarg.0.1)
(trunc:/ (memory* arg.0.1) (memory* arg.1.1))
(memory* oarg.1.1)
(mod (memory* arg.0.1) (memory* arg.1.1)))
read
(= (memory* oarg.0.1)
; hardcoded channel for now
(memory* pop.fn-args.1))
reply
(do (= result arg)
(break))
; else user-defined function
(let results (run function*.op arg)
;? (prn "== " memory*)
(each o oarg
;? (prn o)
(= (memory* o.1) (memory* pop.results.1))))
)))))
;? (prn "return " result)
))
(awhen cdr.argv
(each file it