--- /dev/null
+(import (chicken io)
+ (chicken pathname)
+ (chicken process-context)
+ matchable
+ srfi-13
+ mars parser)
+
+(define (load-progs filenames)
+ (map (lambda (filename)
+ (string->prog (with-input-from-file filename read-string)))
+ filenames))
+
+(define (print-help)
+ (print "Commands:\n"
+ "q:\tPrint current process queues\n"
+ "c:\tClear and reinitialize core\n"
+ "d:\tDump list of instructions around each process instruction pointer\n"
+ "s, n:\tStep to next iteration\n"
+ "x:\tQuit debugger"))
+
+(define (mars-debugger core-size filenames)
+ (let* ((core (make-core core-size))
+ (progs (load-progs filenames))
+ (queues (install-progs core progs)))
+ (print "JaRS Redcode Debugger. Enter 'h' for help.")
+ (let loop ()
+ (print* "> ")
+ (if
+ (match (string-tokenize (read-line))
+ (("h")
+ (print-help)
+ #t)
+ (("q")
+ (print queues)
+ #t)
+ (("c")
+ (print "Reinitializing...")
+ (set! core (make-core core-size))
+ (set! queues (install-progs core progs))
+ #t)
+ (("d")
+ (dump-queues queues core)
+ #t)
+ ((or ("s") ("n") ())
+ (set! queues (run-mars core queues 1 1))
+ (dump-queues queues core)
+ #t)
+ (("x")
+ #f)
+ (other
+ (print "Error: unrecognised command '" other "'")
+ #t))
+ (loop)
+ (print "Bye.")))))
+
+(define (print-usage)
+ (print "Usage: run-mars [-h|--help]\n"
+ " run-mars [-c|--core size]\n"
+ " warrior1.red [warrior2.red [...]]"))
+
+(define (main)
+ (let loop ((args (cdr (argv)))
+ (core-size 8000))
+ (match args
+ ((or () ((or "-h" "--help")))
+ (print-usage))
+ (((or "-c" "--core-size") cstr rest ...)
+ (loop rest (string->number cstr)))
+ ((filenames ...)
+ (mars-debugger core-size filenames)))))
+
+(main)