about summary refs log tree commit diff stats
path: root/chessboard.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-01-01 11:11:02 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-01-01 11:20:54 -0800
commitce3518f362743d7a004f952358864748eecf8c0d (patch)
treecd9677d5d2653d34eeb3094796a50523bf94b66d /chessboard.mu
parenta03b8aea543689d1fdb8c7b70ffdec9678833db6 (diff)
downloadmu-ce3518f362743d7a004f952358864748eecf8c0d.tar.gz
478 - snapshot while debugging chessboard
This took a couple of hours to track down. I had to shrink down to a 2x2
chessboard, isolate a half-move (just a square to clear) that triggered
an error, then hard-code the half-move to make it non-interactive, then
copy my changes over to the non-cursor version in chessboard.mu, then
start debugging trace. And then I found I was using an 'index-address'
rather than 'index' to go from a board to a file-address inside
'make-move'. And that was corrupting the array of file pointers.

Things I wish I had to help me here:
  a) a type checker.
  b) more speed. Are lists slowing down super-linearly? need an arc
  profiler.
  c) a side channel for traces even when the program is in cursor mode.
  I do have that (hence the 'new-trace' before calling main), but for
  some reason it wasn't convenient. Just had to buckle down, I think.
  d) the right '#ifdef's to switch between hard-coded move and
  interactive move, text vs cursor mode, etc.
  e) just in general better curation of traces to easily see what's
  going on. But that's just a pipe dream.
Diffstat (limited to 'chessboard.mu')
-rw-r--r--chessboard.mu145
1 files changed, 126 insertions, 19 deletions
diff --git a/chessboard.mu b/chessboard.mu
index e0a79656..5402bd95 100644
--- a/chessboard.mu
+++ b/chessboard.mu
@@ -1,23 +1,24 @@
 (function read-board [
   (default-scope:scope-address <- new scope:literal 30:literal)
-  (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal
-                                              N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal
-                                              B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal
-                                              Q:literal P:literal _:literal _:literal _:literal _:literal p:literal q:literal
-                                              K:literal P:literal _:literal _:literal _:literal _:literal p:literal k:literal
-                                              B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal
-                                              N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal
-                                              R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal)
-  ; assert(length(initial-position) == 64)
+  (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal)
+;?   (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal
+;?                                               N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal
+;?                                               B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal
+;?                                               Q:literal P:literal _:literal _:literal _:literal _:literal p:literal q:literal
+;?                                               K:literal P:literal _:literal _:literal _:literal _:literal p:literal k:literal
+;?                                               B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal
+;?                                               N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal
+;?                                               R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal)
+  ; assert(length(initial-position) == 4)
 ;?   (print-primitive (("list-length\n" literal)))
   (len:integer <- list-length initial-position:list-address)
-  (correct-length?:boolean <- equal len:integer 64:literal)
+  (correct-length?:boolean <- equal len:integer 4:literal)
   (assert correct-length?:boolean "chessboard had incorrect size")
-  (b:board-address <- new board:literal 8:literal)
+  (b:board-address <- new board:literal 2:literal)
   (col:integer <- copy 0:literal)
   (curr:list-address <- copy initial-position:list-address)
   { begin
-    (done?:boolean <- equal col:integer 8:literal)
+    (done?:boolean <- equal col:integer 2:literal)
     (break-if done?:boolean)
 ;?     (print-primitive col:integer)
 ;?     (print-primitive (("\n" literal)))
@@ -32,10 +33,10 @@
 (function read-file [
   (default-scope:scope-address <- new scope:literal 30:literal)
   (cursor:list-address <- next-input)
-  (result:file-address <- new file:literal 8:literal)
+  (result:file-address <- new file:literal 2:literal)
   (row:integer <- copy 0:literal)
   { begin
-    (done?:boolean <- equal row:integer 8:literal)
+    (done?:boolean <- equal row:integer 2:literal)
     (break-if done?:boolean)
 ;?     (print-primitive (("  " literal)))
 ;?     (print-primitive row:integer)
@@ -53,7 +54,7 @@
 (function print-board [
   (default-scope:scope-address <- new scope:literal 30:literal)
   (b:board-address <- next-input)
-  (row:integer <- copy 7:literal)
+  (row:integer <- copy 1:literal)
   ; print each row
   { begin
     (done?:boolean <- less-than row:integer 0:literal)
@@ -61,23 +62,129 @@
     ; print each square in the row
     (col:integer <- copy 0:literal)
     { begin
-      (done?:boolean <- equal col:integer 8:literal)
+      (done?:boolean <- equal col:integer 2:literal)
       (break-if done?:boolean)
       (f:file-address <- index b:board-address/deref col:integer)
       (s:square <- index f:file-address/deref row:integer)
-      (print-primitive s:square)
-      (print-primitive ((" " literal)))
+;?       (print-primitive s:square)
+;?       (print-primitive ((" " literal)))
       (col:integer <- add col:integer 1:literal)
       (loop)
     }
-    (print-primitive (("\n" literal)))
+;?     (print-primitive (("\n" literal)))
     (row:integer <- subtract row:integer 1:literal)
     (loop)
   }
 ])
 
+(and-record move [
+  from:integer-integer-pair
+  to:integer-integer-pair
+])
+
+(address move-address (move))
+
+(function read-move [
+  (a:character <- copy ((#\a literal)))
+  (file-base:integer <- character-to-integer a:character)
+;?   (file-base:integer <- subtract file-base:integer 1:literal)
+  (one:character <- copy ((#\1 literal)))
+  (rank-base:integer <- character-to-integer one:character)
+;?   (rank-base:integer <- subtract rank-base:integer 1:literal)
+  ; get from-file
+  (c:character <- copy ((#\a literal))) ;wait-for-key)
+;?   (print-primitive c:character)
+  (from-file:integer <- character-to-integer c:character)
+  (from-file:integer <- subtract from-file:integer file-base:integer)
+  ; assert('a' <= from-file <= 'h')
+  (above-min:boolean <- greater-or-equal from-file:integer 0:literal)
+  (assert above-min:boolean (("from-file too low" literal)))
+  (below-max:boolean <- lesser-or-equal from-file:integer 1:literal)
+  (assert below-max:boolean (("from-file too high" literal)))
+  ; get from-rank
+  (c:character <- copy ((#\1 literal))) ;wait-for-key)
+;?   (print-primitive c:character)
+  (from-rank:integer <- character-to-integer c:character)
+  (from-rank:integer <- subtract from-rank:integer rank-base:integer)
+  ; assert(1 <= from-rank <= 2)
+  (above-min:boolean <- greater-or-equal from-rank:integer 0:literal)
+  (assert above-min:boolean (("from-rank too low" literal)))
+  (below-max:boolean <- lesser-or-equal from-rank:integer 1:literal)
+  (assert below-max:boolean (("from-rank too high" literal)))
+;?   ; slurp hyphen
+;?   (c:character <- wait-for-key)
+;?   (print-primitive c:character)
+;?   (hyphen?:boolean <- equal c:character ((#\- literal)))
+;?   (assert hyphen?:boolean (("expected hyphen" literal)))
+;?   ; get to-file
+;?   (c:character <- wait-for-key)
+;?   (print-primitive c:character)
+;?   (to-file:integer <- character-to-integer c:character)
+;?   (to-file:integer <- subtract to-file:integer file-base:integer)
+;?   ; assert('a' <= to-file <= 'h')
+;?   (above-min:boolean <- greater-or-equal to-file:integer 1:literal)
+;?   (assert above-min:boolean (("to-file too low" literal)))
+;?   (below-max:boolean <- lesser-or-equal to-file:integer 2:literal)
+;?   (assert below-max:boolean (("to-file too high" literal)))
+;?   ; get to-rank
+;?   (c:character <- wait-for-key)
+;?   (print-primitive c:character)
+;?   (to-rank:integer <- character-to-integer c:character)
+;?   (to-rank:integer <- subtract to-rank:integer rank-base:integer)
+;?   ; assert(1 <= to-rank <= 2)
+;?   (above-min:boolean <- greater-or-equal to-rank:integer 1:literal)
+;?   (assert above-min:boolean (("to-rank too low" literal)))
+;?   (below-max:boolean <- lesser-or-equal to-rank:integer 2:literal)
+;?   (assert below-max:boolean (("to-rank too high" literal)))
+  ; construct the move object
+  (result:move-address <- new move:literal)
+  (f:integer-integer-pair-address <- get-address result:move-address/deref from:offset)
+  (dest:integer-address <- get-address f:integer-integer-pair-address/deref 0:offset)
+  (dest:integer-address/deref <- copy from-file:integer)
+  (dest:integer-address <- get-address f:integer-integer-pair-address/deref 1:offset)
+  (dest:integer-address/deref <- copy from-rank:integer)
+;?   (t0:integer-integer-pair-address <- get-address result:move-address/deref to:offset)
+;?   (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 0:offset)
+;?   (dest:integer-address/deref <- copy to-file:integer)
+;?   (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 1:offset)
+;?   (dest:integer-address/deref <- copy to-rank:integer)
+  (reply result:move-address)
+])
+
+(function make-move [
+  (default-scope:scope-address <- new scope:literal 30:literal)
+  (b:board-address <- next-input)
+  (m:move-address <- next-input)
+  (x:integer-integer-pair <- get m:move-address/deref from:offset)
+  (from-file:integer <- get x:integer-integer-pair 0:offset)
+;?   (print-primitive (("\n" literal)))
+;?   (print-primitive from-file:integer)
+;?   (print-primitive (("\n" literal)))
+  (from-rank:integer <- get x:integer-integer-pair 1:offset)
+;?   (print-primitive from-rank:integer)
+;?   (print-primitive (("\n" literal)))
+  (f:file-address <- index b:board-address/deref from-file:integer)
+  (src:square-address <- index-address f:file-address/deref from-rank:integer)
+;?   (x:integer-integer-pair <- get m:move-address/deref to:offset)
+;?   (to-file:integer <- get x:integer-integer-pair 0:offset)
+;? ;?   (print-primitive to-file:integer)
+;? ;?   (print-primitive (("\n" literal)))
+;?   (to-rank:integer <- get x:integer-integer-pair 1:offset)
+;? ;?   (print-primitive to-rank:integer)
+;? ;?   (print-primitive (("\n" literal)))
+;?   (f:file-address <- index-address b:board-address/deref to-file:integer)
+;?   (dest:square-address <- index-address f:file-address/deref to-rank:integer)
+;?   (dest:square-address/deref <- copy src:square-address/deref)
+  (src:square-address/deref <- copy _:literal)
+  (reply b:board-address)
+])
+
 (function main [
 ;?   (print-primitive (("\u2654 \u265a" literal)))
+  (default-scope:scope-address <- new scope:literal 30:literal)
   (b:board-address <- read-board)
   (print-board b:board-address)
+  (m:move-address <- read-move)
+  (b:board-address <- make-move b:board-address m:move-address)
+  (print-board b:board-address)
 ])