Browse code

Optimized life.tal

neauoire authored on 08/08/2021 03:03:13
Showing 2 changed files
... ...
@@ -54,9 +54,9 @@ then
54 54
 fi
55 55
 
56 56
 echo "Assembling.."
57
-./bin/uxnasm projects/examples/devices/controller.tal bin/controller.rom
57
+./bin/uxnasm projects/examples/demos/life.tal bin/life.rom
58 58
 
59 59
 echo "Running.."
60
-./bin/uxnemu bin/controller.rom
60
+./bin/uxnemu bin/life.rom
61 61
 
62 62
 echo "Done."
... ...
@@ -9,8 +9,6 @@
9 9
 %++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 }
10 10
 %<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }
11 11
 
12
-%INCR { SWP #01 + SWP }
13
-%DECR { SWP #01 - SWP }
14 12
 %TOS  { #00 SWP } %TOB  { SWP POP }
15 13
 %RTN  { JMP2r }   %MOD  { DUP2 / * - }
16 14
 %MOD8 { #07 AND } %MOD2 { #01 AND }
... ...
@@ -23,6 +21,7 @@
23 21
 
24 22
 %GET-SIZE { WIDTH TOS 8// HEIGHT TOS ** }
25 23
 %GET-ITERATORS { SWP2k POP SWP POP }
24
+%GET-ITER { OVR2 SWP POP OVR SWP }
26 25
 
27 26
 ( devices )
28 27
 
... ...
@@ -35,7 +34,7 @@
35 34
 
36 35
 |0000
37 36
 
38
-@world   [ &paused $1 &frame $1 &count $2 ]
37
+@world   [ &frame $1 &count $2 ]
39 38
 @anchor  [ &x $2 &y $2 ]
40 39
 @pointer [ &x $2 &y $2 ]
41 40
 
... ...
@@ -44,9 +43,9 @@
44 43
 |0100 ( -> )
45 44
 
46 45
 	( theme ) 
47
-	#02fe .System/r DEO2 
48
-	#02fc .System/g DEO2 
49
-	#02f2 .System/b DEO2
46
+	#02cf .System/r DEO2 
47
+	#02ff .System/g DEO2 
48
+	#024f .System/b DEO2
50 49
 
51 50
 	( vectors )
52 51
 	;on-frame   .Screen/vector DEO2
... ...
@@ -63,14 +62,15 @@
63 62
 	.Screen/width DEI2 2// WIDTH TOS -- .anchor/x STZ2
64 63
 	.Screen/height DEI2 2// HEIGHT TOS -- .anchor/y STZ2
65 64
 
66
-	#01 .world/paused STZ
65
+BRK
66
+
67
+@on-frame-paused ( -> )
67 68
 
68 69
 BRK
69 70
 
70 71
 @on-frame ( -> )
71 72
 	
72 73
 	.Mouse/state DEI #00 = #01 JCN [ BRK ]
73
-	.world/paused LDZ #00 ! #01 JCN [ BRK ]
74 74
 
75 75
 	( incr frame ) .world/frame LDZ #01 + [ DUP ] .world/frame STZ
76 76
 	( reset count ) #0000 .world/count STZ2
... ...
@@ -78,33 +78,71 @@ BRK
78 78
 	#03 AND #00 = #01 JCN [ BRK ] 
79 79
 
80 80
 	( clear buffer )
81
-	BANK2 DUP2 GET-SIZE ++
81
+	BANK2 STH2k GET-SIZE ++ STH2r
82 82
 	&clear-loop
83
-		OVR2 #0000 SWP2 STA2
84
-		SWP2 #0002 ++ SWP2
85
-		NEQ2k ,&clear-loop JCN
83
+		DUP2 #0000 SWP2 STA2
84
+		#0002 ++ GTH2k ,&clear-loop JCN
86 85
 	POP2 POP2
87 86
 
88
-	;run-grid JSR2
87
+	( run grid )
88
+	#00 HEIGHT
89
+	&ver
90
+		#00 WIDTH
91
+		&hor
92
+			GET-ITERATORS
93
+			( x y ) DUP2
94
+			( neighbours ) DUP2 ;get-neighbours JSR2
95
+			( state ) ROT ROT ;get-cell JSR2
96
+			,run-cell JSR
97
+			SWP #01 + SWP
98
+			LTHk ,&hor JCN
99
+		POP2
100
+		SWP #01 + SWP
101
+		LTHk ,&ver JCN
102
+	POP2
89 103
 
90 104
 	( move buffer )
91
-	BANK2 DUP2 GET-SIZE ++
105
+	BANK2 DUP2 GET-SIZE ++ SWP2
92 106
 	&copy-loop
93
-		OVR2 DUP2 LDA2 
107
+		DUP2 LDA2k
94 108
 		SWP2 #2000 -- STA2
95
-		SWP2 #0002 ++ SWP2
96
-		NEQ2k ,&copy-loop JCN
109
+		#0002 ++ 
110
+		GTH2k ,&copy-loop JCN
97 111
 	POP2 POP2
98 112
 
99 113
 	;draw-grid JSR2
100 114
 
101
-	( draw cell count )
102
-	.anchor/x LDZ2 .Screen/x DEO2
103
-	.anchor/y LDZ2 HEIGHT #02 * TOS ++ .Screen/y DEO2
104
-	.world/count LDZ2 #02 ;draw-short JSR2
105
-
106 115
 BRK
107 116
 
117
+@run-cell ( x y neighbours state -- )
118
+	
119
+	#00 = ,&dead JCN
120
+	&alive
121
+		DUP #02 < ,&dies JCN
122
+		DUP #03 > ,&dies JCN
123
+		&lives POP ,save-cell JSR RTN
124
+		&dies POP POP2 RTN
125
+	&dead
126
+		DUP #03 = ,&birth JCN POP POP2 RTN
127
+		&birth POP ,save-cell JSR RTN
128
+
129
+RTN
130
+
131
+@save-cell ( x y -- )
132
+	
133
+	( get index )
134
+	HEIGHT MOD SWP WIDTH MOD SWP
135
+	WIDTH #08 / TOS ROT TOS ** ROT #08 / TOS ++ [ BANK2 ++ ]
136
+	( incr count )
137
+	.world/count LDZ2 #0001 ADD2 .world/count STZ2
138
+	( save in buffer )
139
+	STH2
140
+	DUP2 POP MOD8 #01 SWP SFL 
141
+	LDAkr STHr SWP ORA
142
+	STH2r STA
143
+
144
+RTN
145
+
108 146
 @on-mouse ( -> )
109 147
 	
110 148
 	( clear last cursor )
... ...
@@ -139,25 +177,32 @@ BRK
139 177
 	.Controller/key DEI #00 ! #01 JCN [ BRK ]
140 178
 
141 179
 	.Controller/key DEI #20 ! ,&no-toggle JCN
142
-		.world/paused LDZ #01 ! .world/paused STZ
143
-	&no-toggle
180
+		;on-frame
181
+		.Screen/vector DEI2 ;on-frame-paused == ,&swap JCN
182
+			POP2 ;on-frame-paused
183
+			&swap
184
+		.Screen/vector DEO2
185
+		&no-toggle
144 186
 
145 187
 BRK
146 188
 
147 189
 @draw-grid ( -- )
190
+	
191
+	( draw cell count )
192
+	.anchor/x LDZ2 .Screen/x DEO2
193
+	.anchor/y LDZ2 HEIGHT #02 * TOS ++ .Screen/y DEO2
194
+	.world/count LDZ2 #03 ;draw-short JSR2
148 195
 
149
-	#00 HEIGHT
196
+	HEIGHT #00
150 197
 	&ver
151
-		OVR TOS 2** .anchor/y LDZ2 ++ .Screen/y DEO2
152
-		#00 WIDTH
198
+		DUP TOS 2** .anchor/y LDZ2 ++ .Screen/y DEO2
199
+		WIDTH #00
153 200
 		&hor
154
-			OVR TOS 2** .anchor/x LDZ2 ++ .Screen/x DEO2
155
-			GET-ITERATORS ,get-cell JSR #01 + .Screen/pixel DEO
156
-			INCR
157
-			NEQk ,&hor JCN
201
+			DUP TOS 2** .anchor/x LDZ2 ++ .Screen/x DEO2
202
+			GET-ITER ,get-cell JSR #01 + .Screen/pixel DEO
203
+			#01 + GTHk ,&hor JCN
158 204
 		POP2
159
-		INCR
160
-		NEQk ,&ver JCN
205
+		#01 + GTHk ,&ver JCN
161 206
 	POP2
162 207
 
163 208
 RTN
... ...
@@ -189,67 +234,18 @@ RTN
189 234
 
190 235
 @get-neighbours ( x y -- neighbours )
191 236
 	
192
-	( -1,-1 ) DUP2 #01 - DECR ,get-cell JSR STH
237
+	( -1,-1 ) DUP2 #01 - [ SWP #01 - SWP ] ,get-cell JSR STH
193 238
 	(  0,-1 ) DUP2 #01 -      ,get-cell JSR STH ADDr
194
-	( +1,-1 ) DUP2 #01 - INCR ,get-cell JSR STH ADDr
195
-	( -1, 0 ) DUP2       DECR ,get-cell JSR STH ADDr
196
-	( +1, 0 ) DUP2       INCR ,get-cell JSR STH ADDr
197
-	( -1,+1 ) DUP2 #01 + DECR ,get-cell JSR STH ADDr
239
+	( +1,-1 ) DUP2 #01 - [ SWP #01 + SWP ] ,get-cell JSR STH ADDr
240
+	( -1, 0 ) DUP2       [ SWP #01 - SWP ] ,get-cell JSR STH ADDr
241
+	( +1, 0 ) DUP2       [ SWP #01 + SWP ] ,get-cell JSR STH ADDr
242
+	( -1,+1 ) DUP2 #01 + [ SWP #01 - SWP ] ,get-cell JSR STH ADDr
198 243
 	(  0,+1 ) DUP2 #01 +      ,get-cell JSR STH ADDr
199
-	( +1,+1 )      #01 + INCR ,get-cell JSR STH ADDr
244
+	( +1,+1 )      #01 + [ SWP #01 + SWP ] ,get-cell JSR STH ADDr
200 245
 	STHr
201 246
 
202 247
 RTN
203 248
 
204
-@run-grid ( -- )
205
-	
206
-	#00 HEIGHT
207
-	&ver
208
-		#00 WIDTH
209
-		&hor
210
-			GET-ITERATORS
211
-			( x y ) DUP2
212
-			( neighbours ) DUP2 ,get-neighbours JSR
213
-			( state ) ROT ROT ;get-cell JSR2
214
-			,run-cell JSR
215
-			INCR
216
-			NEQk ,&hor JCN
217
-		POP2
218
-		INCR
219
-		NEQk ,&ver JCN
220
-	POP2
221
-
222
-RTN 
223
-
224
-@run-cell ( x y neighbours state -- )
225
-	
226
-	#00 = ,&dead JCN
227
-	&alive
228
-		DUP #02 < ,&dies JCN
229
-		DUP #03 > ,&dies JCN
230
-		&lives POP ,save-cell JSR RTN
231
-		&dies POP POP2 RTN
232
-	&dead
233
-		DUP #03 = ,&birth JCN POP POP2 RTN
234
-		&birth POP ,save-cell JSR RTN
235
-
236
-RTN
237
-
238
-@save-cell ( x y -- )
239
-	
240
-	( get index )
241
-	HEIGHT MOD SWP WIDTH MOD SWP
242
-	WIDTH #08 / TOS ROT TOS ** ROT #08 / TOS ++ [ BANK2 ++ ]
243
-	( incr count )
244
-	.world/count LDZ2 #0001 ADD2 .world/count STZ2
245
-	( save in buffer )
246
-	STH2
247
-	DUP2 POP MOD8 #01 SWP SFL 
248
-	LDAkr STHr SWP ORA
249
-	STH2r STA
250
-
251
-RTN
252
-
253 249
 @draw-short ( short* color -- )
254 250
 
255 251
 	STH SWP