Browse code

(wireworld.tal) Added wireworld implementation

neauoire authored on 21/01/2022 23:02:46
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,203 @@
1
+( wireworld )
2
+
3
+( 
4
+	#00 empty - black
5
+	#01 conductor - yellow
6
+	#02 electron tail - red
7
+	#03 electron head - blue 
8
+
9
+	RULES
10
+
11
+	- electron head(3), becomes electron tail(2)
12
+    - electron tail(2), becomes conductor(1)
13
+    - conductor(1), becomes electron head(3) 
14
+    	if there are exactly 1 or 2 electron heads around it. )
15
+
16
+%+  { ADD }  %-  { SUB }  %*  { MUL }  %/  { DIV }
17
+%<  { LTH }  %>  { GTH }  %=  { EQU }  %!  { NEQ }
18
+%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 }
19
+%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }
20
+
21
+%2*  { #10 SFT } %2/  { #01 SFT } %2**  { #10 SFT2 } %2//  { #01 SFT2 }
22
+%4*  { #20 SFT } %4/  { #02 SFT } %4**  { #20 SFT2 } %4//  { #02 SFT2 }
23
+%8*  { #30 SFT } %8/  { #03 SFT } %8**  { #30 SFT2 } %8//  { #03 SFT2 }
24
+%10* { #40 SFT } %10/ { #04 SFT } %10** { #40 SFT2 } %10// { #04 SFT2 }
25
+%20* { #50 SFT } %20/ { #05 SFT } %20** { #50 SFT2 } %20// { #05 SFT2 }
26
+
27
+%RTN   { JMP2r }
28
+%TOS { #00 SWP }
29
+
30
+%WIDTH { #40 }
31
+%HEIGHT { #40 }
32
+
33
+( devices )
34
+
35
+|00 @System     &vector $2 &wst      $1 &rst    $1 &pad    $4 &r      $2 &g      $2 &b      $2 &debug  $1 &halt $1
36
+|20 @Screen     &vector $2 &width    $2 &height $2 &pad    $2 &x      $2 &y      $2 &addr   $2 &pixel  $1 &sprite $1
37
+|80 @Controller &vector $2 &button   $1 &key    $1 &func   $1
38
+|90 @Mouse      &vector $2 &x        $2 &y      $2 &state  $1 &pad    $3 &modx   $2 &mody   $2
39
+
40
+|0000
41
+
42
+@color $1
43
+@pointer 
44
+	&x $2 &y $2
45
+@timer 
46
+	&frame $1 &pause $1
47
+
48
+( program )
49
+
50
+|0100 ( -> )
51
+
52
+	( theme ) 
53
+	#30ff .System/r DEO2 
54
+	#e00f .System/g DEO2 
55
+	#800f .System/b DEO2
56
+	( size )
57
+	#00 WIDTH 4** .Screen/width DEO2
58
+	#00 HEIGHT 4** .Screen/height DEO2
59
+	( vectors ) 
60
+	;on-frame .Screen/vector DEO2
61
+	;on-mouse .Mouse/vector DEO2
62
+	;on-button .Controller/vector DEO2
63
+	( setup )
64
+	#01 .color STZ
65
+	;redraw JSR2
66
+
67
+BRK
68
+
69
+@on-frame ( -> )
70
+
71
+	.timer/pause LDZ #00 = JMP BRK
72
+
73
+	.timer/frame LDZk 
74
+		#0f AND ,&no-run JCN ;run JSR2 &no-run
75
+		LDZk INC SWP STZ
76
+
77
+BRK
78
+
79
+@on-button ( -> )
80
+
81
+	.Controller/button DEI
82
+	DUP #01 ! ,&no-a JCN      #01 .color STZ &no-a
83
+	DUP #02 ! ,&no-b JCN      #02 .color STZ &no-b
84
+	DUP #04 ! ,&no-select JCN #03 .color STZ &no-select
85
+	DUP #08 ! ,&no-start JCN  #00 .color STZ &no-start
86
+	POP
87
+	.Controller/key DEI #20 ! ,&no-space JCN
88
+		.timer/pause LDZk #00 = SWP STZ &no-space
89
+
90
+BRK
91
+
92
+@on-mouse ( -> )
93
+
94
+	;pointer-icn .Screen/addr DEO2
95
+
96
+	( clear last cursor )
97
+	.pointer/x LDZ2 .Screen/x DEO2
98
+	.pointer/y LDZ2 .Screen/y DEO2
99
+	#40 .Screen/sprite DEO
100
+
101
+	( draw new cursor )
102
+	.Mouse/x DEI2 DUP2 .pointer/x STZ2 .Screen/x DEO2 
103
+	.Mouse/y DEI2 DUP2 .pointer/y STZ2 .Screen/y DEO2
104
+	#41 .Mouse/state DEI #00 ! + .timer/pause LDZ + .Screen/sprite DEO
105
+
106
+	.Mouse/state DEI #00 = ,&no-down JCN
107
+		( color ) .color LDZ
108
+		( cell* ) .Mouse/x DEI2 4// NIP .Mouse/y DEI2 4// NIP
109
+			;get-addr JSR2 STA
110
+		;redraw JSR2
111
+		&no-down
112
+
113
+BRK
114
+
115
+@redraw ( -- )
116
+
117
+	;cell-icn .Screen/addr DEO2
118
+	HEIGHT #00
119
+	&ver
120
+		DUP TOS 4** .Screen/y DEO2
121
+		STHk
122
+		WIDTH #00
123
+		&hor
124
+			DUP TOS 4** .Screen/x DEO2
125
+			DUP STHkr ,get-addr JSR LDA .Screen/sprite DEO
126
+			INC GTHk ,&hor JCN
127
+		POP2
128
+		POPr
129
+		INC GTHk ,&ver JCN
130
+	POP2
131
+
132
+RTN
133
+
134
+@run ( -- )
135
+
136
+	HEIGHT #00
137
+	&ver
138
+		STHk
139
+		WIDTH #00
140
+		&hor
141
+			( x,y ) DUP STHkr 
142
+			( cell ) DUP2 ,get-addr JSR STH2k LDA 
143
+			( transform ) ,transform JSR STH2r ( future ) #4000 ++ STA
144
+			INC GTHk ,&hor JCN
145
+		POP2
146
+		POPr
147
+		INC GTHk ,&ver JCN
148
+	POP2
149
+	;future-world ;past-world #4000 ;mcpy JSR2
150
+	,redraw JSR
151
+
152
+RTN
153
+
154
+@transform ( xy cell -- cell )
155
+
156
+	DUP #03 ! ,&no-head JCN POP POP2 #02 RTN &no-head
157
+	DUP #02 ! ,&no-tail JCN POP POP2 #01 RTN &no-tail
158
+	DUP #01 ! ,&no-cond JCN POP ,morph JSR #02 * INC RTN &no-cond
159
+	NIP NIP
160
+
161
+RTN
162
+
163
+@get-addr ( x y -- addr* )
164
+
165
+	TOS [ #00 WIDTH ] ** ROT TOS ++ ;past-world ++
166
+
167
+RTN
168
+
169
+@morph ( xy -- bool )
170
+
171
+	LITr 00
172
+	DUP2 SWP #01 - SWP #01 - ,get-addr JSR LDA #03 ! JMP INCr
173
+	DUP2 #01 - ,get-addr JSR LDA #03 ! JMP INCr
174
+	DUP2 SWP INC SWP #01 - ,get-addr JSR LDA #03 ! JMP INCr
175
+	DUP2 SWP #01 - SWP ,get-addr JSR LDA #03 ! JMP INCr
176
+	DUP2 SWP INC SWP ,get-addr JSR LDA #03 ! JMP INCr
177
+	DUP2 SWP #01 - SWP INC ,get-addr JSR LDA #03 ! JMP INCr
178
+	DUP2 INC ,get-addr JSR LDA #03 ! JMP INCr
179
+	SWP INC SWP INC ,get-addr JSR LDA #03 ! JMP INCr
180
+	STHkr #02 = STHr #01 = #0000 >>
181
+
182
+RTN
183
+
184
+@mcpy ( src* dst* len* -- )
185
+
186
+	SWP2 STH2
187
+	OVR2 ++ SWP2
188
+	&loop
189
+		LDAk STH2kr STA INC2r
190
+		INC2 GTH2k ,&loop JCN
191
+	POP2 POP2
192
+	POP2r
193
+
194
+JMP2r
195
+
196
+@pointer-icn 80c0 e0f0 f8e0 1000
197
+@cell-icn e0e0 e000 0000 0000
198
+
199
+@past-world
200
+
201
+$4000
202
+
203
+@future-world