-
Notifications
You must be signed in to change notification settings - Fork 1
/
day13.tal
216 lines (166 loc) · 3.39 KB
/
day13.tal
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
~library/macros.tal
~library/devices.tal
( variables )
|0000
( init )
|0100 @program
;on-arg-char .Console/vector DEO2
BRK !
@on-arg-char
.Console/read DEI ( char )
DUP #0a EQU ,&complete JCN
;argv #00 ,&argptr LDR ADD2 STA
,&argptr LDR INC ,&argptr STR
BRK !
&complete
POP
;arg-received JMP2
&argptr $1
@argv $20
( arg is in @argv )
@arg-received
LIT ': EMIT
;argv ;print JSR2
LF
;open-file JSR2
;read-byte ;parse-lines JSR2
( ;dump-dots JSR2 )
( ;dump-folds JSR2 )
#00 [ ;fold-inside STA ]
;folds [ ;current-fold STA2 ]
( theme )
#05af .System/r DEO2
#05af .System/g DEO2
#05af .System/b DEO2
;on-frame .Screen/vector DEO2
&done
BRK
@on-frame
;process-folds-anim JSR2 POP
;erase-dots JSR2
;render-dots JSR2
[ ;&framecounter *INC2 ]
BRK
[ &framecounter $2 ]
@current-fold $2
( -- again )
@process-folds-anim
[ ;current-fold LDA2 ]
( fold* )
LDA2k ( fold* x )
DUP2 #ffff EQU2 ,&done JCN
( fold* x )
POP2
( fold* )
DUP2 ;anim-fold JSR2
LF
NOT ,&fold-done JCN
POP2
#01
RTN
&fold-done
( fold* )
#0003 ADD2
[ ;current-fold STA2 ]
#01 RTN
&done
( fold* ffff )
POP2 POP2
#00
RTN
( fold* -- again )
@anim-fold
( are we inside already? )
[ ;fold-inside LDA ] #01 EQU ,&folding-inside JCN
( if scale is 0, the outside fold is done )
[ ;fold-scale LDA2 ] #0000 EQU2 ,&outside-done JCN
P< "outside >P
[ ;fold-scale *DEC2 ]
P< "scale= >P [ ;fold-scale LDA2 ] DBGSHORTDECn POP2
;save-dots JSR2
;process-fold JSR2
;save-dots2 JSR2
;restore-dots JSR2
#01 ( run again )
RTN
&outside-done
#01 [ ;fold-inside STA ]
POP2
#01 ( run again )
RTN
&folding-inside
( if scale is maximal, the inside fold is done )
[ ;fold-scale LDA2 ] #001f EQU2 ,&inside-done JCN
P< "inside >P
[ ;fold-scale *INC2 ]
P< "scale= >P [ ;fold-scale LDA2 ] DBGSHORTDECn POP2
;save-dots JSR2
;process-fold JSR2
;save-dots2 JSR2
;restore-dots JSR2
#01 ( run again )
RTN
&inside-done
P< "finishing >P
#0020 [ ;fold-scale STA2 ]
;process-fold JSR2
;distinct-dots JSR2
;save-dots JSR2
;save-dots2 JSR2
[ ;render-scale LDA2 ] #002c MUL2 20// [ ;render-scale STA2 ]
( restart outside for next fold )
#00 [ ;fold-inside STA ]
( fold complete, don't run again )
#00
RTN
@post-fold-draw-dots
;draw-dots JSR2
RTN
@render-scale 0008
( -- )
@render-dots
;dots3 ( dots* )
&next
LDA2k ( dots* x )
DUP2 #ffff EQU2 ,&done JCN
OVR2 2++ LDA2 ( dots* x y )
[ ;render-scale LDA2 ] MUL2 20//
DUP2 [ ;render-scale LDA2 ] 20// ADD2
DO
DUP2 .Screen/y DEO2
OVR2 [ ;render-scale LDA2 ] MUL2 20//
DUP2 [ ;render-scale LDA2 ] 20// ADD2
DO
DUP2 .Screen/x DEO2
#03 .Screen/pixel DEO
LOOP
LOOP
POP2
4++
,&next JMP
&done
( dots* ffff )
POP2 POP2
RTN
( -- )
@erase-dots
#01 .Screen/auto DEO
#0000 .Screen/height DEI2 DO
DUP2 .Screen/y DEO2
#0000 .Screen/x DEO2
#0000 .Screen/width DEI2 DO
#01 .Screen/pixel DEO
LOOP
LOOP
RTN
@open-file
;argv .File/name DEO2
#0001 .File/length DEO2
RTN
( -- next-byte )
@read-byte
#00 ;&byte STA ( clear byte so that EOF reads as zero )
;&byte .File/read DEO2
LIT &byte 00 ( <- this byte is patched by the two previous instructions! )
RTN
~day13_lib.tal