+;;;
+;;; An implementation of the Memory Array Redcode Simulator (MARS)
+;;;
+
+;;; Constants
+;;
+
+(define core-size 8000)
+(define max-steps 10000)
+
+
+;;; Memory setup
+;;
+
+(define core (make-vector core-size '()))
+
+
+;;; Instructions
+;;
+
+(define (make-instr opcode modifier addrA modeA addrB modeB))
+
+
+;;; Players
+;;
+
+(define (make-player name . ptrs)
+ (cons name ptrs))
+
+(define (player-ptrs player)
+ (cdr player))
+
+(define (player-name player)
+ (car player))
+
+(define (player-set-ptrs! player ptrs)
+ (set-cdr! player ptrs))
+
+
+;;; Main loop
+;;
+
+(define (list-rot l)
+ (if (> (length l) 1)
+ (append (cdr l) (list (car l)))
+ l))
+
+(define (run playerA playerB step)
+ (cond
+ ((> step max-steps) 'tie)
+ ((null? (player-ptrs playerA) playerB))
+ ((null? (player-ptrs playerB) playerA))
+ (else
+ (let ((ptrs (player-ptrs playerA)))
+ (player-set-ptrs! (append (cdr ptrs)
+ (execute-instr (car ptrs)))))
+ (run playerB player A (+ step 1)))))
+
+(define (execute-instr ptr)
+ (let ((instr (vector-ref core ptr)))
+ (match instr
+ ())))
+