14 - processor model now has a program counter
This commit is contained in:
parent
d00338ee4a
commit
ff8b3afd09
94
mu.arc
94
mu.arc
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue