From a1f2f613305cf0da4c1e73c40c1281766ee45a08 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Mon, 12 Jan 2015 10:27:28 -0800 Subject: 544 - text modes now called 'retro' & 'cursor' Other options considered for 'retro': 'teletype': perhaps most accurate, but arcane 'chat': captures that you have to hit 'enter', but not the rendering 'wrap': captures the auto-wrap when printing text but not that you have to hit 'enter' when typing 'text': useful as a synonym of 'chat' while conveying more information in other meanings, but too generic, nobody will get it Why do the input and output options have to be entangled like this? --- chessboard-cursor.mu | 223 +++++++++++++++++++++++++++++++++++++++++++++++++ chessboard-rawterm.mu | 224 -------------------------------------------------- chessboard-retro.mu | 93 +++++++++++++++++++++ chessboard.mu | 93 --------------------- mu.arc | 4 +- stdin.mu | 2 +- 6 files changed, 319 insertions(+), 320 deletions(-) create mode 100644 chessboard-cursor.mu delete mode 100644 chessboard-rawterm.mu create mode 100644 chessboard-retro.mu delete mode 100644 chessboard.mu diff --git a/chessboard-cursor.mu b/chessboard-cursor.mu new file mode 100644 index 00000000..c4f19c40 --- /dev/null +++ b/chessboard-cursor.mu @@ -0,0 +1,223 @@ +;; data structure: board +(primitive square) +(address square-address (square)) ; pointer. verbose but sadly necessary for now +(array file (square)) ; ranks and files are arrays of squares +(address file-address (file)) +(address file-address-address (file-address)) ; pointer to a pointer +(array board (file-address)) +(address board-address (board)) + +(function read-board [ + (default-space:space-address <- new space: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) + (len:integer <- list-length initial-position:list-address) + (correct-length?:boolean <- equal len:integer 64:literal) + (assert correct-length?:boolean (("chessboard had incorrect size" literal))) + (b:board-address <- new board:literal 8:literal) + (col:integer <- copy 0:literal) + (curr:list-address <- copy initial-position:list-address) + { begin + (done?:boolean <- equal col:integer 8:literal) + (break-if done?:boolean) + (file:file-address-address <- index-address b:board-address/deref col:integer) + (file:file-address-address/deref curr:list-address <- read-file curr:list-address) + (col:integer <- add col:integer 1:literal) + (loop) + } + (reply b:board-address) +]) + +(function read-file [ + (default-space:space-address <- new space:literal 30:literal) + (cursor:list-address <- next-input) + (result:file-address <- new file:literal 8:literal) + (row:integer <- copy 0:literal) + { begin + (done?:boolean <- equal row:integer 8:literal) + (break-if done?:boolean) + (src:tagged-value-address <- list-value-address cursor:list-address) + (dest:square-address <- index-address result:file-address/deref row:integer) + (dest:square-address/deref <- get src:tagged-value-address/deref payload:offset) ; unsafe typecast + (cursor:list-address <- list-next cursor:list-address) + (row:integer <- add row:integer 1:literal) + (loop) + } + (reply result:file-address cursor:list-address) +]) + +(function print-board [ + (default-space:space-address <- new space:literal 30:literal) + (b:board-address <- next-input) + (row:integer <- copy 7:literal) + ; print each row + { begin + (done?:boolean <- less-than row:integer 0:literal) + (break-if done?:boolean) + ; print rank number as a legend + (rank:integer <- add row:integer 1:literal) + (print-primitive rank:integer) + (print-primitive ((" | " literal))) + ; print each square in the row + (col:integer <- copy 0:literal) + { begin + (done?:boolean <- equal col:integer 8: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))) + (col:integer <- add col:integer 1:literal) + (loop) + } + (row:integer <- subtract row:integer 1:literal) + (cursor-to-next-line) + (loop) + } + ; print file letters as legend + (print-primitive ((" +----------------" literal))) + (cursor-to-next-line) + (print-primitive ((" a b c d e f g h" literal))) + (cursor-to-next-line) +]) + +;; data structure: move +(and-record move [ + from:integer-integer-pair + to:integer-integer-pair +]) + +(address move-address (move)) + +(function read-move [ + (default-space:space-address <- new space:literal 30:literal) + (a:character <- copy ((#\a literal))) + (file-base:integer <- character-to-integer a:character) + (one:character <- copy ((#\1 literal))) + (rank-base:integer <- character-to-integer one:character) + ; get from-file + (c:character <- wait-for-key) + (print-primitive c:character) + { begin + (quit:boolean <- equal c:character ((#\q literal))) + (break-unless quit:boolean) + (reply nil:literal) + } + (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 7:literal) + (assert below-max:boolean (("from-file too high" literal))) + ; get from-rank + (c:character <- 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 <= '8') + (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 7: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 0:literal) + (assert above-min:boolean (("to-file too low" literal))) + (below-max:boolean <- lesser-or-equal to-file:integer 7: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 <= '8') + (above-min:boolean <- greater-or-equal to-rank:integer 0:literal) + (assert above-min:boolean (("to-rank too low" literal))) + (below-max:boolean <- lesser-or-equal to-rank:integer 7: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-space:space-address <- new space: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) + (from-rank:integer <- get x:integer-integer-pair 1:offset) + (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) + (to-rank:integer <- get x:integer-integer-pair 1:offset) + (f:file-address <- index 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 [ + (default-space:space-address <- new space:literal 30:literal) + (b:board-address <- read-board) + (cursor-mode) + { begin + (clear-screen) + (print-primitive (("Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves." literal))) + (cursor-to-next-line) + (cursor-to-next-line) + (print-board b:board-address) + (cursor-to-next-line) + (print-primitive (("Type in your move as -. For example: 'a2-a4'. Currently very unforgiving of typos; exactly five letters, no , no uppercase." literal))) + (cursor-to-next-line) + (print-primitive (("Hit 'q' to exit." literal))) + (cursor-to-next-line) + (print-primitive (("move: " literal))) + (m:move-address <- read-move) + (break-unless m:move-address) + (b:board-address <- make-move b:board-address m:move-address) + (loop) + } + (cursor-to-next-line) +]) + +; tests todo: +; print board +; accept move +; print move +; board updates on move +; die on invalid move +; 'q' exits +; 'q' exits anywhere in move +; 'q' exits on second move +; +; backspace, ctrl-u diff --git a/chessboard-rawterm.mu b/chessboard-rawterm.mu deleted file mode 100644 index fdb17dcb..00000000 --- a/chessboard-rawterm.mu +++ /dev/null @@ -1,224 +0,0 @@ -;; data structure: board -(primitive square) -(address square-address (square)) ; pointer. verbose but sadly necessary for now -(array file (square)) ; ranks and files are arrays of squares -(address file-address (file)) -(address file-address-address (file-address)) ; pointer to a pointer -(array board (file-address)) -(address board-address (board)) - -(function read-board [ - (default-space:space-address <- new space: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) - (len:integer <- list-length initial-position:list-address) - (correct-length?:boolean <- equal len:integer 64:literal) - (assert correct-length?:boolean (("chessboard had incorrect size" literal))) - (b:board-address <- new board:literal 8:literal) - (col:integer <- copy 0:literal) - (curr:list-address <- copy initial-position:list-address) - { begin - (done?:boolean <- equal col:integer 8:literal) - (break-if done?:boolean) - (file:file-address-address <- index-address b:board-address/deref col:integer) - (file:file-address-address/deref curr:list-address <- read-file curr:list-address) - (col:integer <- add col:integer 1:literal) - (loop) - } - (reply b:board-address) -]) - -(function read-file [ - (default-space:space-address <- new space:literal 30:literal) - (cursor:list-address <- next-input) - (result:file-address <- new file:literal 8:literal) - (row:integer <- copy 0:literal) - { begin - (done?:boolean <- equal row:integer 8:literal) - (break-if done?:boolean) - (src:tagged-value-address <- list-value-address cursor:list-address) - (dest:square-address <- index-address result:file-address/deref row:integer) - (dest:square-address/deref <- get src:tagged-value-address/deref payload:offset) ; unsafe typecast - (cursor:list-address <- list-next cursor:list-address) - (row:integer <- add row:integer 1:literal) - (loop) - } - (reply result:file-address cursor:list-address) -]) - -(function print-board [ - (default-space:space-address <- new space:literal 30:literal) - (b:board-address <- next-input) - (row:integer <- copy 7:literal) - ; print each row - { begin - (done?:boolean <- less-than row:integer 0:literal) - (break-if done?:boolean) - ; print rank number as a legend - (rank:integer <- add row:integer 1:literal) - (print-primitive rank:integer) - (print-primitive ((" | " literal))) - ; print each square in the row - (col:integer <- copy 0:literal) - { begin - (done?:boolean <- equal col:integer 8: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))) - (col:integer <- add col:integer 1:literal) - (loop) - } - (row:integer <- subtract row:integer 1:literal) - (cursor-to-next-line) - (loop) - } - ; print file letters as legend - (print-primitive ((" +----------------" literal))) - (cursor-to-next-line) - (print-primitive ((" a b c d e f g h" literal))) - (cursor-to-next-line) -]) - -;; data structure: move -(and-record move [ - from:integer-integer-pair - to:integer-integer-pair -]) - -(address move-address (move)) - -(function read-move [ - (default-space:space-address <- new space:literal 30:literal) - (a:character <- copy ((#\a literal))) - (file-base:integer <- character-to-integer a:character) - (one:character <- copy ((#\1 literal))) - (rank-base:integer <- character-to-integer one:character) - ; get from-file - (c:character <- wait-for-key) - (print-primitive c:character) - { begin - (quit:boolean <- equal c:character ((#\q literal))) - (break-unless quit:boolean) - (reply nil:literal) - } - (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 7:literal) - (assert below-max:boolean (("from-file too high" literal))) - ; get from-rank - (c:character <- 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 <= '8') - (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 7: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 0:literal) - (assert above-min:boolean (("to-file too low" literal))) - (below-max:boolean <- lesser-or-equal to-file:integer 7: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 <= '8') - (above-min:boolean <- greater-or-equal to-rank:integer 0:literal) - (assert above-min:boolean (("to-rank too low" literal))) - (below-max:boolean <- lesser-or-equal to-rank:integer 7: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-space:space-address <- new space: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) - (from-rank:integer <- get x:integer-integer-pair 1:offset) - (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) - (to-rank:integer <- get x:integer-integer-pair 1:offset) - (f:file-address <- index 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 [ - (default-space:space-address <- new space:literal 30:literal) - (b:board-address <- read-board) - (console-on) - { begin - (clear-screen) - (print-primitive (("Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves." literal))) - (cursor-to-next-line) - (cursor-to-next-line) - (print-board b:board-address) - (cursor-to-next-line) - (print-primitive (("Type in your move as -. For example: 'a2-a4'. Currently very unforgiving of typos; exactly five letters, no , no uppercase." literal))) - (cursor-to-next-line) - (print-primitive (("Hit 'q' to exit." literal))) - (cursor-to-next-line) - (print-primitive (("move: " literal))) - (m:move-address <- read-move) - (break-unless m:move-address) - (b:board-address <- make-move b:board-address m:move-address) - (loop) - } - (cursor-to-next-line) - (console-off) -]) - -; tests todo: -; print board -; accept move -; print move -; board updates on move -; die on invalid move -; 'q' exits -; 'q' exits anywhere in move -; 'q' exits on second move -; -; backspace, ctrl-u diff --git a/chessboard-retro.mu b/chessboard-retro.mu new file mode 100644 index 00000000..e9fbd101 --- /dev/null +++ b/chessboard-retro.mu @@ -0,0 +1,93 @@ +;; data structure: board +(primitive square) +(address square-address (square)) ; pointer. verbose but sadly necessary for now +(array file (square)) ; ranks and files are arrays of squares +(address file-address (file)) +(address file-address-address (file-address)) ; pointer to a pointer +(array board (file-address)) +(address board-address (board)) + +(function read-board [ + (default-space:space-address <- new space: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) +;? (print-primitive (("list-length\n" literal))) + (len:integer <- list-length initial-position:list-address) + (correct-length?:boolean <- equal len:integer 64:literal) + (assert correct-length?:boolean "chessboard had incorrect size") + (b:board-address <- new board:literal 8:literal) + (col:integer <- copy 0:literal) + (curr:list-address <- copy initial-position:list-address) + { begin + (done?:boolean <- equal col:integer 8:literal) + (break-if done?:boolean) +;? (print-primitive col:integer) +;? (print-primitive (("\n" literal))) + (file:file-address-address <- index-address b:board-address/deref col:integer) + (file:file-address-address/deref curr:list-address <- read-file curr:list-address) + (col:integer <- add col:integer 1:literal) + (loop) + } + (reply b:board-address) +]) + +(function read-file [ + (default-space:space-address <- new space:literal 30:literal) + (cursor:list-address <- next-input) + (result:file-address <- new file:literal 8:literal) + (row:integer <- copy 0:literal) + { begin + (done?:boolean <- equal row:integer 8:literal) + (break-if done?:boolean) +;? (print-primitive ((" " literal))) +;? (print-primitive row:integer) +;? (print-primitive (("\n" literal))) + (src:tagged-value-address <- list-value-address cursor:list-address) + (dest:square-address <- index-address result:file-address/deref row:integer) + (dest:square-address/deref <- get src:tagged-value-address/deref payload:offset) ; unsafe typecast + (cursor:list-address <- list-next cursor:list-address) + (row:integer <- add row:integer 1:literal) + (loop) + } + (reply result:file-address cursor:list-address) +]) + +(function print-board [ + (default-space:space-address <- new space:literal 30:literal) + (b:board-address <- next-input) + (row:integer <- copy 7:literal) + ; print each row + { begin + (done?:boolean <- less-than row:integer 0:literal) + (break-if done?:boolean) + ; print each square in the row + (col:integer <- copy 0:literal) + { begin + (done?:boolean <- equal col:integer 8: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))) + (col:integer <- add col:integer 1:literal) + (loop) + } + (print-primitive (("\n" literal))) + (row:integer <- subtract row:integer 1:literal) + (loop) + } +]) + +(function main [ +;? (print-primitive (("\u2654 \u265a" literal))) + (default-space:space-address <- new space:literal 30:literal) + (b:board-address <- read-board) + (print-board b:board-address) +]) diff --git a/chessboard.mu b/chessboard.mu deleted file mode 100644 index e9fbd101..00000000 --- a/chessboard.mu +++ /dev/null @@ -1,93 +0,0 @@ -;; data structure: board -(primitive square) -(address square-address (square)) ; pointer. verbose but sadly necessary for now -(array file (square)) ; ranks and files are arrays of squares -(address file-address (file)) -(address file-address-address (file-address)) ; pointer to a pointer -(array board (file-address)) -(address board-address (board)) - -(function read-board [ - (default-space:space-address <- new space: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) -;? (print-primitive (("list-length\n" literal))) - (len:integer <- list-length initial-position:list-address) - (correct-length?:boolean <- equal len:integer 64:literal) - (assert correct-length?:boolean "chessboard had incorrect size") - (b:board-address <- new board:literal 8:literal) - (col:integer <- copy 0:literal) - (curr:list-address <- copy initial-position:list-address) - { begin - (done?:boolean <- equal col:integer 8:literal) - (break-if done?:boolean) -;? (print-primitive col:integer) -;? (print-primitive (("\n" literal))) - (file:file-address-address <- index-address b:board-address/deref col:integer) - (file:file-address-address/deref curr:list-address <- read-file curr:list-address) - (col:integer <- add col:integer 1:literal) - (loop) - } - (reply b:board-address) -]) - -(function read-file [ - (default-space:space-address <- new space:literal 30:literal) - (cursor:list-address <- next-input) - (result:file-address <- new file:literal 8:literal) - (row:integer <- copy 0:literal) - { begin - (done?:boolean <- equal row:integer 8:literal) - (break-if done?:boolean) -;? (print-primitive ((" " literal))) -;? (print-primitive row:integer) -;? (print-primitive (("\n" literal))) - (src:tagged-value-address <- list-value-address cursor:list-address) - (dest:square-address <- index-address result:file-address/deref row:integer) - (dest:square-address/deref <- get src:tagged-value-address/deref payload:offset) ; unsafe typecast - (cursor:list-address <- list-next cursor:list-address) - (row:integer <- add row:integer 1:literal) - (loop) - } - (reply result:file-address cursor:list-address) -]) - -(function print-board [ - (default-space:space-address <- new space:literal 30:literal) - (b:board-address <- next-input) - (row:integer <- copy 7:literal) - ; print each row - { begin - (done?:boolean <- less-than row:integer 0:literal) - (break-if done?:boolean) - ; print each square in the row - (col:integer <- copy 0:literal) - { begin - (done?:boolean <- equal col:integer 8: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))) - (col:integer <- add col:integer 1:literal) - (loop) - } - (print-primitive (("\n" literal))) - (row:integer <- subtract row:integer 1:literal) - (loop) - } -]) - -(function main [ -;? (print-primitive (("\u2654 \u265a" literal))) - (default-space:space-address <- new space:literal 30:literal) - (b:board-address <- read-board) - (print-board b:board-address) -]) diff --git a/mu.arc b/mu.arc index f8277029..ac186e8f 100644 --- a/mu.arc +++ b/mu.arc @@ -671,9 +671,9 @@ (do1 nil ($.charterm-bold)) non-bold-mode (do1 nil ($.charterm-normal)) - console-on + cursor-mode (do1 nil (if (no ($.current-charterm)) ($.open-charterm))) - console-off + retro-mode (do1 nil (if ($.current-charterm) ($.close-charterm))) ; graphics diff --git a/stdin.mu b/stdin.mu index b1905d2b..b5362f5b 100644 --- a/stdin.mu +++ b/stdin.mu @@ -1,6 +1,6 @@ (function main [ (default-space:space-address <- new space:literal 30:literal) - (console-on) + (cursor-mode) (clear-screen) ; hook up stdin (stdin:channel-address <- init-channel 1:literal) -- cgit 1.4.1-2-gfad0