Default to no visualization.
[jars.git] / run-mars.scm
index 63daf47..01dd271 100644 (file)
@@ -1,3 +1,6 @@
+;; run-mars: command-line utility for running redcode programs
+;;
+
 (import (chicken io)
         (chicken process-context)
         matchable
              (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))))))
+        (if (null? colors-left)
+            (error "Not enough colours in colour map!")
+            (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")
+(define (mars-runner files iters core-size visualization min-queue-count)
+  (print "Iters: " iters ", core size: " core-size)
   (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)))
-  
+         (core (if visualization
+                   (let* ((colors '("red" "blue" "green" "magenta" "cyan"))
+                          (color-map (make-color-map progs colors))
+                          (vis (make-vis 640 480 core-size color-map)))
+                     (make-core core-size (lambda (i n)
+                                            (vis 'update-owner i n))))
+                   (make-core core-size)))
+         (queues (run-mars core (install-progs core progs) iters min-queue-count)))
+    (dump-queues queues core)
+    (when visualization
+      (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 [...]]"))
+         "       run-mars [-c|--core size]\n"
+         "                [-i|--iterations iters]\n"
+         "                [-v|--visualization]\n"
+         "                [-m|--min-queue-count]\n"
+         "                warrior1.red [warrior2.red [...]]"))
 
 (define (main)
   (let loop ((args (cdr (argv)))
              (iters 10000)
-             (core-size 8000))
+             (core-size 8000)
+             (visualization #f)
+             (min-queue-count 2))
     (match args
       ((or () ((or "-h" "--help")))
        (print-usage))
       (((or "-i" "--iterations") istr rest ...)
-       (loop rest (string->number istr) core-size))
+       (loop rest (string->number istr) core-size visualization min-queue-count))
       (((or "-c" "--core-size") cstr rest ...)
-       (loop rest iters (string->number cstr)))
+       (loop rest iters (string->number cstr) visualization min-queue-count))
+      (((or "-v" "--visualization") rest ...)
+       (loop rest iters core-size #t min-queue-count))
+      (((or "-m" "--min-queue-count") mstr rest ...)
+       (loop rest iters core-size visualization (string->number mstr)))
       ((files ...)
-       (run-mars-with-vis files iters core-size)))))
+       (mars-runner files iters core-size visualization min-queue-count)))))
+
 (main)