X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=jars.git;a=blobdiff_plain;f=mars.scm;h=e97d2ba7a1efe90b601709981ed6cc2faafeb3fe;hp=a9ba7c54a274200769eb3d2292e2f8c224e3afca;hb=d7a887f10bfff04a5820d34615db3f2e5f1d37ea;hpb=47ac8e0ad3cc6cf75a637c1491059aaede68f4f4 diff --git a/mars.scm b/mars.scm index a9ba7c5..e97d2ba 100644 --- a/mars.scm +++ b/mars.scm @@ -79,7 +79,9 @@ ;;; Memory setup and addressing ;; - (define (make-core core-size initial-instr . set-functions) + (define INITIAL-INSTR (make-instr 'DAT 'F 'immediate 0 'immediate 0)) + + (define (make-core core-size . set-functions) (let ((core-vec (make-vector core-size '())) (names-vec (make-vector core-size '()))) (define (norm-addr i) @@ -105,7 +107,7 @@ (print)) (let loop ((i 0)) (unless (>= i core-size) - (vector-set! core-vec i (initial-instr 'make-copy)) + (vector-set! core-vec i (INITIAL-INSTR 'make-copy)) (loop (+ i 1)))) (lambda args (match args @@ -205,24 +207,25 @@ (define (dump-prog prog) (print (prog->string prog))) - + + ;;; Executive function ;; (define (run-mars core queues steps-left) - (cond - ((<= steps-left 0) queues) ;Tie between remaining players - ((null? queues) queues) ;Everyone's dead - (else - (let* ((queue (car queues)) - (remaining-queues (cdr queues)) - (ptrs (queue-ptrs queue)) - (new-ptrs (execute-instr core (car ptrs) (queue-owner queue)))) - (if (null? new-ptrs) - (run-mars core remaining-queues (- steps-left 1)) - (begin - (queue-set-ptrs! queue (append (cdr ptrs) new-ptrs)) - (run-mars core (append remaining-queues (list queue)) (- steps-left 1)))))))) + (if (or (<= steps-left 0) + (null? queues) + (= (length queues) 1)) + queues + (let* ((queue (car queues)) + (remaining-queues (cdr queues)) + (ptrs (queue-ptrs queue)) + (new-ptrs (execute-instr core (car ptrs) (queue-owner queue)))) + (if (null? new-ptrs) + (run-mars core remaining-queues (- steps-left 1)) + (begin + (queue-set-ptrs! queue (append (cdr ptrs) new-ptrs)) + (run-mars core (append remaining-queues (list queue)) (- steps-left 1))))))) (define (execute-instr core ptr name) ;; (print ptr "\t" (core ptr '->string) "\t(" name ")")