Initial commit.
authorplugd <plugd@thelambdalab.xyz>
Thu, 14 Nov 2019 00:03:04 +0000 (01:03 +0100)
committerplugd <plugd@thelambdalab.xyz>
Thu, 14 Nov 2019 13:11:41 +0000 (14:11 +0100)
mars.scm [new file with mode: 0644]
vis.scm [new file with mode: 0644]

diff --git a/mars.scm b/mars.scm
new file mode 100644 (file)
index 0000000..57e3e13
--- /dev/null
+++ b/mars.scm
@@ -0,0 +1,63 @@
+;;;
+;;; 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
+      ())))
+               
diff --git a/vis.scm b/vis.scm
new file mode 100644 (file)
index 0000000..6ae005b
--- /dev/null
+++ b/vis.scm
@@ -0,0 +1,48 @@
+;; Visualization experiments
+
+(import (chicken io)
+        (chicken process)
+        (chicken port)
+        (chicken string))
+
+;; Generic Wish interface
+
+(define wish-in '())
+(define wish-out '())
+
+(define (wish-startup w h)
+  (let-values (((in-port out-port id) (process (conc "wish -geometry " w "x" h))))
+    (set! wish-in in-port)
+    (set! wish-out out-port)))
+
+(define (wish-shutdown)
+  (wish% "destroy .")
+  (close-input-port wish-in)
+  (close-output-port wish-out))
+
+(define (wish% . args)
+  (with-output-to-port wish-out
+    (lambda ()
+      (apply print args))))
+
+;; High-level visualization commands
+
+(define (visualizer-open w h)
+  (wish-startup w h)
+  (wish% "canvas .c -width " w " -height " h " -bg black")
+  (wish% "pack .c")
+  (wish% "image create photo core -width " w " -height " h " -palette 256/256/256")
+  (wish% ".c create image 0 0 -anchor nw -image core"))
+
+(define (set-pixel x y col)
+  (wish% "core put " col " -to " x " " y))
+
+(define (visualizer-close)
+  (wish-shutdown))
+
+;; Test code
+
+(visualizer-open 640 480)
+(set-pixel 10 10 "red")
+(sleep 3)
+(visualizer-close)