X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=jars.git;a=blobdiff_plain;f=mars.scm;h=f2e3d99a982474520cbdc9b6be3ce875c195b396;hp=2f4db9de8672d3b44b66020ad03437e68253f1d5;hb=871e290a730e6f7a2e6c7dd8ffb754f2007d5f74;hpb=d77eebde986b6bd5e5c25c40523920dfcac96f13 diff --git a/mars.scm b/mars.scm index 2f4db9d..f2e3d99 100644 --- a/mars.scm +++ b/mars.scm @@ -17,7 +17,10 @@ ;; (define core (make-vector core-size '())) - +(define (addr+ . args) + (foldl (lambda (a b) + (modulo (+ a b core-size) core-size)) + 0 args)) ;;; Instructions ;; @@ -67,10 +70,11 @@ (define (execute-instr ptr) (let* ((instr (vector-ref core ptr)) - (A-operand (eval-operand (instr-A-mode instr) (instr-A-num) ptr)) - (B-operand (eval-operand (instr-B-mode instr) (instr-B-num) ptr))) + (A-pointer (eval-operand (instr-A-mode instr) (instr-A-num) ptr)) + (B-pointer (eval-operand (instr-B-mode instr) (instr-B-num) ptr)) + (modifier (instr-modifier instr))) (case (instr-opcode instr) - ((DAT)) + ((DAT) '()) ;Game over, man, game over! ((MOV)) ((ADD)) ((SUB)) @@ -90,11 +94,27 @@ (define (eval-operand mode num ptr) (case mode - ((immediate)) - ((direct)) - ((indirect-A)) - ((indirect-B)) - ((pre-indirect-A)) - ((pre-indirect-B)) - ((post-indirect-A)) - ((post-indirect-B)))) + ((immediate) 0) + ((direct) num) + ((indirect-A) (addr+ num (instr-A-num (vector-ref core (addr+ ptr num))))) + ((indirect-B) (addr+ num (instr-B-num (vector-ref core (addr+ ptr num))))) + ((pre-indirect-A) + (let ((aux-instr (vector-ref core (addr+ ptr num)))) + (instr-set-A-num! aux-instr (addr+ -1 (instr-A-num aux-instr))) + (addr+ num (instr-A-num aux-instr)))) + ((pre-indirect-B) + (let ((aux-instr (vector-ref core (addr+ ptr num)))) + (instr-set-B-num! aux-instr (addr+ -1 (instr-B-num aux-instr))) + (addr+ num (instr-B-num aux-instr)))) + ((post-indirect-A) + (let* ((aux-instr (vector-ref core (addr+ ptr num))) + (old-A-num (instr-A-num aux-instr))) + (instr-set-A-num! aux-instr (addr+ 1 (instr-A-num aux-instr))) + (addr+ num old-A-num))) + ((post-indirect-B) + (let* ((aux-instr (vector-ref core (addr+ ptr num))) + (old-B-num (instr-B-num aux-instr))) + (instr-set-B-num! aux-instr (addr+ 1 (instr-B-num aux-instr))) + (addr+ num old-B-num))) + (else + (error "Unrecognized mode" mode))))