1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
recipe init-board [
default-space:address:array:location <- new location:type, 30:literal
initial-position:address:array:integer <- next-ingredient
# assert(length(initial-position) == 64)
len:integer <- length initial-position:address:array:integer/deref
correct-length?:boolean <- equal len:integer, 64:literal
assert correct-length?:boolean, [chessboard had incorrect size]
# board is an array of pointers to files; file is an array of characters
board:address:array:address:array:character <- new location:type, 8:literal
col:integer <- copy 0:literal
{
done?:boolean <- equal col:integer, 8:literal
break-if done?:boolean
file:address:address:array:character <- index-address board:address:array:address:array:character/deref, col:integer
file:address:address:array:character/deref <- init-file initial-position:address:array:integer, col:integer
col:integer <- add col:integer, 1:literal
loop
}
reply board:address:array:address:array:character
]
recipe init-file [
default-space:address:array:location <- new location:type, 30:literal
position:address:array:integer <- next-ingredient
index:integer <- next-ingredient
index:integer <- multiply index:integer, 8:literal
result:address:array:character <- new character:type, 8:literal
row:integer <- copy 0:literal
{
done?:boolean <- equal row:integer, 8:literal
break-if done?:boolean
dest:address:character <- index-address result:address:array:character/deref, row:integer
dest:address:character/deref <- index position:address:array:integer/deref, index:integer
row:integer <- add row:integer, 1:literal
index:integer <- add index:integer, 1:literal
loop
}
reply result:address:array:character
]
recipe print-board [
default-space:address:array:location <- new location:type, 30:literal
screen:address <- next-ingredient
board:address:array:address:array:character <- next-ingredient
row:integer <- copy 7:literal # start printing from the top of the board
# print each row
{
done?:boolean <- lesser-than row:integer, 0:literal
break-if done?:boolean
# print rank number as a legend
rank:integer <- add row:integer, 1:literal
print-integer screen:address, rank:integer
s:address:array:character <- new [ | ]
print-string screen:address, s:address:array:character
# print each square in the row
col:integer <- copy 0:literal
{
done?:boolean <- equal col:integer, 8:literal
break-if done?:boolean
f:address:array:character <- index board:address:array:address:array:character/deref, col:integer
s:character <- index f:address:array:character/deref, row:integer
print-character screen:address, s:character
print-character screen:address, 32:literal # ' '
col:integer <- add col:integer, 1:literal
loop
}
row:integer <- subtract row:integer, 1:literal
cursor-to-next-line screen:address
loop
}
# print file letters as legend
s:address:array:character <- new [ +----------------]
print-string screen:address, s:address:array:character
screen:address <- cursor-to-next-line screen:address
#? screen:address <- print-character screen:address, 97:literal #? 1
s:address:array:character <- new [ a b c d e f g h]
screen:address <- print-string screen:address, s:address:array:character
screen:address <- cursor-to-next-line screen:address
]
scenario printing-the-board [
assume-screen 30:literal/width, 24:literal/height
run [
#? $print [AAA #? 1
#? ] #? 1
# layout in memory:
# R P _ _ _ _ p r
# N P _ _ _ _ p n
# B P _ _ _ _ p b
# Q P _ _ _ _ p q
# K P _ _ _ _ p k
# B P _ _ _ _ p B
# N P _ _ _ _ p n
# R P _ _ _ _ p r
1:address:array:integer/initial-position <- init-array 82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r, 78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n, 66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b, 81:literal/Q, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 113:literal/q, 75:literal/K, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 107:literal/k, 66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b, 78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n, 82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r
#? 82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r,
#? 78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n,
#? 66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b,
#? 81:literal/Q, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 113:literal/q,
#? 75:literal/K, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 107:literal/k,
#? 66:literal/B, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 98:literal/b,
#? 78:literal/N, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 110:literal/n,
#? 82:literal/R, 80:literal/P, 32:literal/blank, 32:literal/blank, 32:literal/blank, 32:literal/blank, 112:literal/p, 114:literal/r
#? $print [BBB #? 1
#? ] #? 1
#? $start-tracing #? 1
2:address:array:address:array:character/board <- init-board 1:address:array:integer/initial-position
#? $print [CCC #? 1
#? ] #? 1
screen:address <- print-board screen:address, 2:address:array:address:array:character/board
#? $print [DDD #? 1
#? ] #? 1
]
screen-should-contain [
# 012345678901234567890123456789
.8 | r n b q k b n r .
.7 | p p p p p p p p .
.6 | .
.5 | .
.4 | .
.3 | .
.2 | P P P P P P P P .
.1 | R N B Q K B N R .
. +---------------- .
. a b c d e f g h .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
]
]
|