about summary refs log blame commit diff stats
path: root/mu.arc
blob: 4ed77070558d9b6df6427d3c7298e22b89ee6096 (plain) (tree)
1
2
3
4
5
6

                                                               
             


                                    






                             
 















































                                                                  
 

               
                 
                            
                    
                      
                
; things that a future assembler will need separate memory for:
;   code; types; args channel
(def clear ()
  (= types* (obj
              integer (obj size 1)
              address (obj size 1)))
  (= memory* (table))
  (= function* (table)))
(clear)

(def add-fns (fns)
  (each (name . body) fns
    (= function*.name body)))

(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
;?     (prn file)
    (add-fns readfile.file))
;?   (prn function*)
  (run function*!main)
  (prn memory*))