--- /dev/null
+(import (chicken io)
+ (chicken process-context)
+ matchable
+ mars visualizer parser)
+
+(define (make-color-map progs colors)
+ (let loop ((entries '())
+ (progs-left progs)
+ (colors-left colors))
+ (if (null? progs-left)
+ entries
+ (let ((this-prog (car progs-left))
+ (this-col (car colors-left)))
+ (loop (cons (cons (prog-name this-prog) this-col) entries)
+ (cdr progs-left)
+ (cdr colors-left))))))
+
+(define (run-mars-with-vis files iters core-size)
+ (print "Iters: " iters ", core size: " core-size "\n")
+ (let* ((progs (map
+ (lambda (fname)
+ (string->prog (with-input-from-file fname read-string)))
+ files))
+ (colors '("red" "blue" "green" "magenta" "cyan"))
+ (color-map (make-color-map progs colors))
+ (vis (make-vis 640 480 core-size color-map))
+ (core (make-core 8000 (make-instr 'DAT 'F 'immediate 0 'immediate 0)
+ (lambda (i n)
+ (vis 'update-owner i n))))
+ (queues (run-mars core (install-progs core progs) iters)))
+ (for-each (lambda (q)
+ (print "Final queue for " (queue-owner q) ":")
+ (dump-queue q core)
+ (print))
+ queues)
+ (print* "Press enter to finish...")
+ (read-line)))
+
+
+(define (print-usage)
+ (print "Usage: run-mars [-h|--help]\n"
+ " run-mars [-c|--core size] [-i|--iterations n] warrior1.red [warrior2.red [...]]"))
+
+(define (main)
+ (let loop ((args (cdr (argv)))
+ (iters 10000)
+ (core-size 8000))
+ (match args
+ ((or () ((or "-h" "--help")))
+ (print-usage))
+ (((or "-i" "--iterations") istr rest ...)
+ (loop rest (string->number istr) core-size))
+ (((or "-c" "--core-size") cstr rest ...)
+ (loop rest iters (string->number cstr)))
+ ((files ...)
+ (run-mars-with-vis files iters core-size)))))
+(main)