... | ... |
@@ -145,7 +145,7 @@ RTN |
145 | 145 |
@draw-cursor ( -- ) |
146 | 146 |
|
147 | 147 |
( clear last cursor ) |
148 |
- #fff8 .Screen/addr DEO2 |
|
148 |
+ ;cursor .Screen/addr DEO2 |
|
149 | 149 |
.pointer/x PEK2 .Screen/x DEO2 |
150 | 150 |
.pointer/y PEK2 .Screen/y DEO2 |
151 | 151 |
#30 .Screen/color DEO |
... | ... |
@@ -153,7 +153,6 @@ RTN |
153 | 153 |
.Mouse/x DEI2 .pointer/x POK2 |
154 | 154 |
.Mouse/y DEI2 .pointer/y POK2 |
155 | 155 |
( draw new cursor ) |
156 |
- ;cursor .Screen/addr DEO2 |
|
157 | 156 |
.pointer/x PEK2 .Screen/x DEO2 |
158 | 157 |
.pointer/y PEK2 .Screen/y DEO2 |
159 | 158 |
( colorize on state ) |
... | ... |
@@ -503,7 +503,7 @@ RTN |
503 | 503 |
@draw-cursor ( -- ) |
504 | 504 |
|
505 | 505 |
( clear last cursor ) |
506 |
- #fff8 .Screen/addr DEO2 |
|
506 |
+ ;cursor-icn .Screen/addr DEO2 |
|
507 | 507 |
.pointer/x PEK2 .Screen/x DEO2 |
508 | 508 |
.pointer/y PEK2 .Screen/y DEO2 |
509 | 509 |
#30 .Screen/color DEO |
... | ... |
@@ -511,7 +511,6 @@ RTN |
511 | 511 |
.Mouse/x DEI2 .pointer/x POK2 |
512 | 512 |
.Mouse/y DEI2 .pointer/y POK2 |
513 | 513 |
( draw new cursor ) |
514 |
- ;cursor-icn .Screen/addr DEO2 |
|
515 | 514 |
.pointer/x PEK2 .Screen/x DEO2 |
516 | 515 |
.pointer/y PEK2 .Screen/y DEO2 |
517 | 516 |
( colorize on state ) |
... | ... |
@@ -1,21 +1,20 @@ |
1 |
-( game of life |
|
1 |
+( Game Of Life |
|
2 | 2 |
Any live cell with fewer than two live neighbours dies, as if by underpopulation. |
3 |
- Any live cell with two or three live neighbours lives on to the next generation. |
|
4 |
- Any live cell with more than three live neighbours dies, as if by overpopulation. |
|
5 |
- Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction. ) |
|
3 |
+ Any live cell with two or three live neighbours lives on to the next generation. |
|
4 |
+ Any live cell with more than three live neighbours dies, as if by overpopulation. |
|
5 |
+ Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction. ) |
|
6 | 6 |
|
7 | 7 |
%+ { ADD } %- { SUB } %* { MUL } %/ { DIV } |
8 | 8 |
%< { LTH } %> { GTH } %= { EQU } %! { NEQ } |
9 | 9 |
%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 } |
10 | 10 |
%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 } |
11 | 11 |
|
12 |
-%INCR { #01 + } %DECR { #01 - } |
|
13 |
-%TOS { #00 SWP } %TOB { SWP POP } |
|
14 |
-%RTN { JMP2r } |
|
15 |
-%MOD { DUP2 / * - } |
|
16 |
-%SFL { #40 SFT SFT } |
|
12 |
+%INCR { #01 + } %DECR { #01 - } |
|
13 |
+%TOS { #00 SWP } %TOB { SWP POP } |
|
14 |
+%RTN { JMP2r } %MOD { DUP2 / * - } |
|
15 |
+%SFL { #40 SFT SFT } |
|
17 | 16 |
|
18 |
-%WIDTH { #40 } %HEIGHT { #40 } |
|
17 |
+%WIDTH { #40 } %HEIGHT { #40 } |
|
19 | 18 |
%BANK1 { #8000 } %BANK2 { #a000 } |
20 | 19 |
|
21 | 20 |
%GET-SIZE { WIDTH TOS #0008 // HEIGHT TOS ** } |
... | ... |
@@ -24,14 +23,15 @@ |
24 | 23 |
|
25 | 24 |
|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 ] |
26 | 25 |
|20 @Screen [ &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &color $1 ] |
26 |
+|80 @Controller [ &vector $2 &button $1 &key $1 ] |
|
27 | 27 |
|90 @Mouse [ &vector $2 &x $2 &y $2 &state $1 &chord $1 ] |
28 | 28 |
|
29 | 29 |
( variables ) |
30 | 30 |
|
31 | 31 |
|0000 |
32 | 32 |
|
33 |
-@timer $1 |
|
34 |
-@anchor [ &x $2 &y $2 ] |
|
33 |
+@world [ &paused $1 &frame $1 &count $2 ] |
|
34 |
+@anchor [ &x $2 &y $2 ] |
|
35 | 35 |
@pointer [ &x $2 &y $2 ] |
36 | 36 |
|
37 | 37 |
( program ) |
... | ... |
@@ -39,13 +39,14 @@ |
39 | 39 |
|0100 ( -> ) |
40 | 40 |
|
41 | 41 |
( theme ) |
42 |
- #ef05 .System/r DEO2 |
|
43 |
- #cf05 .System/g DEO2 |
|
44 |
- #2f05 .System/b DEO2 |
|
42 |
+ #02fe .System/r DEO2 |
|
43 |
+ #02fc .System/g DEO2 |
|
44 |
+ #02f2 .System/b DEO2 |
|
45 | 45 |
|
46 | 46 |
( vectors ) |
47 | 47 |
;on-frame .Screen/vector DEO2 |
48 | 48 |
;on-mouse .Mouse/vector DEO2 |
49 |
+ ;on-control .Controller/vector DEO2 |
|
49 | 50 |
|
50 | 51 |
( glider ) |
51 | 52 |
#07 #03 ;set-cell JSR2 |
... | ... |
@@ -57,13 +58,17 @@ |
57 | 58 |
.Screen/width DEI2 #0002 // WIDTH TOS -- .anchor/x POK2 |
58 | 59 |
.Screen/height DEI2 #0002 // HEIGHT TOS -- .anchor/y POK2 |
59 | 60 |
|
61 |
+ #01 .world/paused POK |
|
62 |
+ |
|
60 | 63 |
BRK |
61 | 64 |
|
62 | 65 |
@on-frame ( -> ) |
63 | 66 |
|
64 | 67 |
.Mouse/state DEI #00 = #01 JNZ [ BRK ] |
68 |
+ .world/paused PEK #00 ! #01 JNZ [ BRK ] |
|
65 | 69 |
|
66 |
- .timer PEK #01 + [ DUP ] .timer POK |
|
70 |
+ ( incr frame ) .world/frame PEK INCR [ DUP ] .world/frame POK |
|
71 |
+ ( reset count ) #0000 .world/count POK2 |
|
67 | 72 |
|
68 | 73 |
#10 MOD #00 ! #01 JNZ [ BRK ] |
69 | 74 |
|
... | ... |
@@ -88,12 +93,17 @@ BRK |
88 | 93 |
|
89 | 94 |
;draw-grid JSR2 |
90 | 95 |
|
96 |
+ ( draw cell count ) |
|
97 |
+ .anchor/x PEK2 .Screen/x DEO2 |
|
98 |
+ .anchor/y PEK2 HEIGHT #02 * TOS ++ .Screen/y DEO2 |
|
99 |
+ .world/count PEK2 #22 ;draw-short JSR2 |
|
100 |
+ |
|
91 | 101 |
BRK |
92 | 102 |
|
93 | 103 |
@on-mouse ( -> ) |
94 | 104 |
|
95 | 105 |
( clear last cursor ) |
96 |
- #fff8 .Screen/addr DEO2 |
|
106 |
+ ;cursor .Screen/addr DEO2 |
|
97 | 107 |
.pointer/x PEK2 .Screen/x DEO2 |
98 | 108 |
.pointer/y PEK2 .Screen/y DEO2 |
99 | 109 |
#30 .Screen/color DEO |
... | ... |
@@ -103,7 +113,6 @@ BRK |
103 | 113 |
.Mouse/y DEI2 .pointer/y POK2 |
104 | 114 |
|
105 | 115 |
( draw new cursor ) |
106 |
- ;cursor .Screen/addr DEO2 |
|
107 | 116 |
.pointer/x PEK2 .Screen/x DEO2 |
108 | 117 |
.pointer/y PEK2 .Screen/y DEO2 |
109 | 118 |
|
... | ... |
@@ -124,6 +133,16 @@ BRK |
124 | 133 |
|
125 | 134 |
BRK |
126 | 135 |
|
136 |
+@on-control ( -> ) |
|
137 |
+ |
|
138 |
+ .Controller/key DEI #00 ! #01 JNZ [ BRK ] |
|
139 |
+ |
|
140 |
+ .Controller/key DEI #20 ! ,&no-toggle JNZ |
|
141 |
+ .world/paused PEK #01 ! .world/paused POK |
|
142 |
+ &no-toggle |
|
143 |
+ |
|
144 |
+BRK |
|
145 |
+ |
|
127 | 146 |
@draw-grid ( -- ) |
128 | 147 |
|
129 | 148 |
#00 HEIGHT |
... | ... |
@@ -133,11 +152,11 @@ BRK |
133 | 152 |
#00 WIDTH |
134 | 153 |
&hor |
135 | 154 |
OVR TOS #0002 ** .anchor/x PEK2 ++ .Screen/x DEO2 |
136 |
- OVR DUPr STHr ,get-cell JSR #01 + .Screen/color DEO |
|
137 |
- SWP #01 + SWP |
|
155 |
+ OVR DUPr STHr ,get-cell JSR INCR .Screen/color DEO |
|
156 |
+ SWP INCR SWP |
|
138 | 157 |
DUP2 ! ,&hor JNZ |
139 | 158 |
POP2 POPr |
140 |
- SWP #01 + SWP |
|
159 |
+ SWP INCR SWP |
|
141 | 160 |
DUP2 ! ,&ver JNZ |
142 | 161 |
POP2 |
143 | 162 |
|
... | ... |
@@ -194,10 +213,10 @@ RTN |
194 | 213 |
( neighbours ) DUP2r STH2r ,get-neighbours JSR |
195 | 214 |
( state ) STH2r ;get-cell JSR2 |
196 | 215 |
,run-cell JSR |
197 |
- SWP #01 + SWP |
|
216 |
+ SWP INCR SWP |
|
198 | 217 |
DUP2 ! ,&hor JNZ |
199 | 218 |
POP2 POPr |
200 |
- SWP #01 + SWP |
|
219 |
+ SWP INCR SWP |
|
201 | 220 |
DUP2 ! ,&ver JNZ |
202 | 221 |
POP2 |
203 | 222 |
|
... | ... |
@@ -222,6 +241,8 @@ RTN |
222 | 241 |
( get index ) |
223 | 242 |
HEIGHT MOD SWP WIDTH MOD SWP |
224 | 243 |
WIDTH #08 / TOS ROT TOS ** ROT #08 / TOS ++ [ BANK2 ++ ] |
244 |
+ ( incr count ) |
|
245 |
+ .world/count PEK2 #0001 ADD2 .world/count POK2 |
|
225 | 246 |
( save in buffer ) |
226 | 247 |
STH2 |
227 | 248 |
DUP2 POP #08 MOD #01 SWP SFL |
... | ... |
@@ -230,5 +251,33 @@ RTN |
230 | 251 |
|
231 | 252 |
RTN |
232 | 253 |
|
254 |
+@draw-short ( short* color -- ) |
|
255 |
+ |
|
256 |
+ STH SWP |
|
257 |
+ DUP #04 SFT TOS #0008 ** ;font-hex ++ .Screen/addr DEO2 |
|
258 |
+ ( draw ) DUPr STHr .Screen/color DEO |
|
259 |
+ #0f AND TOS #0008 ** ;font-hex ++ .Screen/addr DEO2 |
|
260 |
+ .Screen/x DEI2 #0008 ++ .Screen/x DEO2 |
|
261 |
+ ( draw ) DUPr STHr .Screen/color DEO |
|
262 |
+ DUP #04 SFT TOS #0008 ** ;font-hex ++ .Screen/addr DEO2 |
|
263 |
+ .Screen/x DEI2 #0008 ++ .Screen/x DEO2 |
|
264 |
+ ( draw ) DUPr STHr .Screen/color DEO |
|
265 |
+ #0f AND TOS #0008 ** ;font-hex ++ .Screen/addr DEO2 |
|
266 |
+ .Screen/x DEI2 #0008 ++ .Screen/x DEO2 |
|
267 |
+ ( draw ) STHr .Screen/color DEO |
|
268 |
+ |
|
269 |
+RTN |
|
270 |
+ |
|
271 |
+@font-hex ( 0-F ) |
|
272 |
+[ |
|
273 |
+ 007c 8282 8282 827c 0030 1010 1010 1010 |
|
274 |
+ 007c 8202 7c80 80fe 007c 8202 1c02 827c |
|
275 |
+ 000c 1424 4484 fe04 00fe 8080 7c02 827c |
|
276 |
+ 007c 8280 fc82 827c 007c 8202 1e02 0202 |
|
277 |
+ 007c 8282 7c82 827c 007c 8282 7e02 827c |
|
278 |
+ 007c 8202 7e82 827e 00fc 8282 fc82 82fc |
|
279 |
+ 007c 8280 8080 827c 00fc 8282 8282 82fc |
|
280 |
+ 007c 8280 f080 827c 007c 8280 f080 8080 ] |
|
281 |
+ |
|
233 | 282 |
@cursor [ |
234 |
- 80c0 e0f0 f8e0 1000 ] |
|
235 | 283 |
\ No newline at end of file |
284 |
+ 80c0 e0f0 f8e0 1000 ] |
... | ... |
@@ -256,7 +256,7 @@ RTN |
256 | 256 |
@draw-cursor ( -- ) |
257 | 257 |
|
258 | 258 |
( clear last cursor ) |
259 |
- #fff8 .Screen/addr DEO2 |
|
259 |
+ ;cursor .Screen/addr DEO2 |
|
260 | 260 |
.pointer/x PEK2 .Screen/x DEO2 |
261 | 261 |
.pointer/y PEK2 .Screen/y DEO2 |
262 | 262 |
#30 .Screen/color DEO |
... | ... |
@@ -264,7 +264,6 @@ RTN |
264 | 264 |
.Mouse/x DEI2 .pointer/x POK2 |
265 | 265 |
.Mouse/y DEI2 .pointer/y POK2 |
266 | 266 |
( draw new cursor ) |
267 |
- ;cursor .Screen/addr DEO2 |
|
268 | 267 |
.pointer/x PEK2 .Screen/x DEO2 |
269 | 268 |
.pointer/y PEK2 .Screen/y DEO2 |
270 | 269 |
( colorize on state ) |
... | ... |
@@ -106,7 +106,7 @@ RTN |
106 | 106 |
@draw-cursor ( -- ) |
107 | 107 |
|
108 | 108 |
( clear last cursor ) |
109 |
- #fff8 .Screen/addr DEO2 |
|
109 |
+ ;cursor .Screen/addr DEO2 |
|
110 | 110 |
.pointer/x PEK2 .Screen/x DEO2 |
111 | 111 |
.pointer/y PEK2 .Screen/y DEO2 |
112 | 112 |
#30 .Screen/color DEO |
... | ... |
@@ -116,7 +116,6 @@ RTN |
116 | 116 |
.Mouse/y DEI2 .pointer/y POK2 |
117 | 117 |
|
118 | 118 |
( draw new cursor ) |
119 |
- ;cursor .Screen/addr DEO2 |
|
120 | 119 |
.pointer/x PEK2 .Screen/x DEO2 |
121 | 120 |
.pointer/y PEK2 .Screen/y DEO2 |
122 | 121 |
|
... | ... |
@@ -239,7 +239,7 @@ RTN |
239 | 239 |
@draw-cursor ( -- ) |
240 | 240 |
|
241 | 241 |
( clear last cursor ) |
242 |
- #fff8 .Screen/addr DEO2 |
|
242 |
+ ;pointer_icn .Screen/addr DEO2 |
|
243 | 243 |
.pointer/x PEK2 .Screen/x DEO2 |
244 | 244 |
.pointer/y PEK2 .Screen/y DEO2 |
245 | 245 |
#30 .Screen/color DEO |
... | ... |
@@ -249,7 +249,6 @@ RTN |
249 | 249 |
.Mouse/y DEI2 .pointer/y POK2 |
250 | 250 |
|
251 | 251 |
( draw new cursor ) |
252 |
- ;pointer_icn .Screen/addr DEO2 |
|
253 | 252 |
.pointer/x PEK2 .Screen/x DEO2 |
254 | 253 |
.pointer/y PEK2 .Screen/y DEO2 |
255 | 254 |
#33 .Mouse/state DEI #00 NEQ #02 MUL SUB .Screen/color DEO |