;;; ;;; An implementation of the Memory Array Redcode Simulator (MARS) ;;; (import (chicken io) (chicken string) matchable) ;;; 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 (run players step) (cond ((> step max-steps) players) ;Tie between remaining players ((null? players) '()) ;Somehow we have no players remaining (else (let ((player (car players)) (other-players (cdr players))) (if (null? ptrs) (run other-players (+ step 1)) ;Player is out (let* ((ptrs (player-ptrs player)) (new-ptrs (execute-instr (car ptrs)))) (player-set-ptrs! (append (cdr ptrs) new-ptrs)) (run (append other-players (list player)) (+ step 1)))))))) (define (execute-instr ptr) (let ((instr (vector-ref core ptr))) (case (instr-opcode instr) ((DAT)) ((MOV)) ((ADD)) ((SUB)) ((MUL)) ((DIV)) ((MOD)) ((JMP)) ((JMN)) ((DJN)) ((SEQ CMP)) ((SNE)) ((SLT)) ((SPL)) ((NOP)) (else (error "Unrecognised opcode" (instr-opcode instr))))))