-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtexter.asm
336 lines (328 loc) · 12.7 KB
/
texter.asm
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
; * WORK IN PROGRESS, PLEASE IGNORE.
; * This is the source code for the program used in
; https://powdertoy.co.uk/Browse/View.html?ID=???????
start:
mov sp, 0
mov r10, 0
mov r11, 1
bump r10
.loop:
call read_character
cmp r0, 8
je .backspace
cmp r0, 126
ja .emit_broken
sub r0, 32
jc .emit_broken
.emit:
mov r0, [code_points.code_point_ptrs+r0]
mov r1, r0
shr r1, 12
and r0, 0x0FFF
add r0, code_points.code_point_base
.send_loop:
send r11, [r0]
send r11, [r0+1]
add r0, 2
sub r1, 1
jnz .send_loop
jmp .loop
.emit_broken:
mov r0, 127
jmp .emit
.backspace:
; TODO
jmp .loop
read_character:
.wait_loop:
wait r3 ; * Wait for a bump. r3 should be checked but
; as in this demo there's no other peripheral,
; it's fine this way.
js .wait_loop
bump r10 ; * Ask for character code.
.recv_loop:
recv r0, r10 ; * Receive character code.
jnc .recv_loop ; * The carry bit it set if something is received.
ret
code_points:
.code_point_base:
.code_point_32:
dw 0x0000, 0x1000, 0x0000, 0x1000, 0x0000, 0x1000, 0x0000, 0x1000, 0x0000
dw 0x1000
.code_point_33:
dw 0x00FF, 0x18D0, 0x0050, 0x1040, 0x0000, 0x1000
.code_point_34:
dw 0x0018, 0x1000, 0x00F0, 0x1000, 0x0018, 0x1000, 0x00F0, 0x1000, 0x0000
dw 0x1000
.code_point_35:
dw 0x0002, 0x1310, 0x002F, 0x1FE0, 0x0013, 0x1310, 0x002F, 0x1FE0, 0x0013
dw 0x1200, 0x0000, 0x1000
.code_point_36:
dw 0x001E, 0x11C0, 0x0033, 0x14C0, 0x00FF, 0x1FF0, 0x0031, 0x1CC0, 0x0034
dw 0x1B00, 0x0000, 0x1000
.code_point_37:
dw 0x0078, 0x11C0, 0x00CC, 0x1780, 0x00B7, 0x1C00, 0x000F, 0x1780, 0x00B4
dw 0x1CC0, 0x00D0, 0x1B40, 0x0000, 0x1000
.code_point_38:
dw 0x007D, 0x1F40, 0x00C3, 0x10C0, 0x00C6, 0x1CC0, 0x0070, 0x1B40, 0x0003
dw 0x1DC0, 0x0000, 0x1040
.code_point_39:
dw 0x001C, 0x1000, 0x00F4, 0x1000, 0x0000, 0x1000
.code_point_40:
dw 0x001F, 0x1D00, 0x0074, 0x1740, 0x00D0, 0x11C0, 0x0000, 0x1000
.code_point_41:
dw 0x00D0, 0x11C0, 0x0074, 0x1740, 0x001F, 0x1D00, 0x0000, 0x1000
.code_point_42:
dw 0x0013, 0x1100, 0x0077, 0x1740, 0x000B, 0x1800, 0x0077, 0x1740, 0x0013
dw 0x1100, 0x0000, 0x1000
.code_point_43:
dw 0x0002, 0x1000, 0x0003, 0x1000, 0x002F, 0x1E00, 0x0003, 0x1000, 0x0002
dw 0x1000, 0x0000, 0x1000
.code_point_44:
dw 0x0000, 0x101C, 0x0000, 0x10F0, 0x0000, 0x1000, 0x0000, 0x1000
.code_point_45:
dw 0x0003, 0x1000, 0x0003, 0x1000, 0x0003, 0x1000, 0x0003, 0x1000, 0x0000
dw 0x1000
.code_point_46:
dw 0x0000, 0x11C0, 0x0000, 0x1040, 0x0000, 0x1000
.code_point_47:
dw 0x0000, 0x1080, 0x0000, 0x1B80, 0x000B, 0x1800, 0x00B8, 0x1000, 0x0080
dw 0x1000, 0x0000, 0x1000
.code_point_48:
dw 0x002F, 0x1F00, 0x00B4, 0x12C0, 0x00D2, 0x10C0, 0x00E0, 0x12C0, 0x003F
dw 0x1F00, 0x0000, 0x1000
.code_point_49:
dw 0x0008, 0x1000, 0x0034, 0x1040, 0x00FF, 0x1FC0, 0x0000, 0x1040, 0x0000
dw 0x1000
.code_point_50:
dw 0x0034, 0x13C0, 0x00E0, 0x1DC0, 0x00C2, 0x18C0, 0x00D6, 0x10C0, 0x007C
dw 0x10C0, 0x0000, 0x1000
.code_point_51:
dw 0x0034, 0x1380, 0x00D0, 0x10C0, 0x00C2, 0x10C0, 0x00D3, 0x11C0, 0x007D
dw 0x1F40, 0x0000, 0x1000
.code_point_52:
dw 0x0003, 0x1C00, 0x000D, 0x1C00, 0x0034, 0x1C00, 0x00D1, 0x1840, 0x00FF
dw 0x1FC0, 0x0000, 0x1000
.code_point_53:
dw 0x00FE, 0x1180, 0x00C7, 0x10C0, 0x00C7, 0x10C0, 0x00C7, 0x10C0, 0x00C2
dw 0x1F40, 0x0000, 0x1000
.code_point_54:
dw 0x001F, 0x1F40, 0x0077, 0x10C0, 0x00C3, 0x10C0, 0x00C3, 0x11C0, 0x00C1
dw 0x1F40, 0x0000, 0x1000
.code_point_55:
dw 0x00C0, 0x1140, 0x00C0, 0x1BC0, 0x00C2, 0x1C00, 0x00DB, 0x1000, 0x00FC
dw 0x1000, 0x0040, 0x1000
.code_point_56:
dw 0x003D, 0x1F40, 0x00E3, 0x11C0, 0x00C3, 0x10C0, 0x00D3, 0x11C0, 0x007D
dw 0x1F40, 0x0000, 0x1000
.code_point_57:
dw 0x003C, 0x1240, 0x00E3, 0x10C0, 0x00C3, 0x10C0, 0x00D3, 0x14C0, 0x007F
dw 0x1F40, 0x0000, 0x1000
.code_point_58:
dw 0x000D, 0x11C0, 0x0004, 0x1040, 0x0000, 0x1000
.code_point_59:
dw 0x0000, 0x1070, 0x000D, 0x13C0, 0x0004, 0x1000, 0x0000, 0x1000
.code_point_60:
dw 0x0000, 0x1C00, 0x0003, 0x1B00, 0x0003, 0x1700, 0x000E, 0x12C0, 0x000C
dw 0x10C0, 0x0000, 0x1000
.code_point_61:
dw 0x0003, 0x1300, 0x0003, 0x1300, 0x0003, 0x1300, 0x0003, 0x1300, 0x0003
dw 0x1300, 0x0000, 0x1000
.code_point_62:
dw 0x000C, 0x10C0, 0x000E, 0x12C0, 0x0003, 0x1700, 0x0003, 0x1B00, 0x0000
dw 0x1C00, 0x0000, 0x1000
.code_point_63:
dw 0x0074, 0x1000, 0x00D0, 0x1440, 0x00C2, 0x1CC0, 0x00CB, 0x1000, 0x007C
dw 0x1000, 0x0000, 0x1000
.code_point_64:
dw 0x001F, 0x1F40, 0x00B4, 0x11C0, 0x00DB, 0x18C0, 0x00CD, 0x1CC0, 0x00CC
dw 0x1CC0, 0x00C7, 0x1C80, 0x003D, 0x1840, 0x0000, 0x1000
.code_point_65:
dw 0x001F, 0x1FC0, 0x0074, 0x1C00, 0x00D0, 0x1C00, 0x0074, 0x1C00, 0x001F
dw 0x1FC0, 0x0000, 0x1000
.code_point_66:
dw 0x00FF, 0x1FC0, 0x00C3, 0x10C0, 0x00C3, 0x10C0, 0x00A7, 0x15C0, 0x003D
dw 0x1F40, 0x0000, 0x1000
.code_point_67:
dw 0x001F, 0x1F40, 0x0070, 0x11C0, 0x00C0, 0x10C0, 0x00D0, 0x11C0, 0x0074
dw 0x1340, 0x0000, 0x1000
.code_point_68:
dw 0x00FF, 0x1FC0, 0x00C0, 0x10C0, 0x00D0, 0x10C0, 0x0074, 0x11C0, 0x001F
dw 0x1F40, 0x0000, 0x1000
.code_point_69:
dw 0x00FF, 0x1FC0, 0x00C3, 0x10C0, 0x00C3, 0x10C0, 0x00C2, 0x10C0, 0x0080
dw 0x11C0, 0x0000, 0x1000
.code_point_70:
dw 0x00FF, 0x1FC0, 0x00C3, 0x1000, 0x00C3, 0x1000, 0x00C2, 0x1000, 0x00D0
dw 0x1000, 0x0000, 0x1000
.code_point_71:
dw 0x001F, 0x1F40, 0x0070, 0x11C0, 0x00C2, 0x10C0, 0x00D3, 0x11C0, 0x0073
dw 0x1F40, 0x0000, 0x1000
.code_point_72:
dw 0x00FF, 0x1FC0, 0x0043, 0x1040, 0x0003, 0x1000, 0x0043, 0x1040, 0x00FF
dw 0x1FC0, 0x0000, 0x1000
.code_point_73:
dw 0x0040, 0x1040, 0x00FF, 0x1FC0, 0x0040, 0x1040, 0x0000, 0x1000
.code_point_74:
dw 0x0000, 0x11C0, 0x0000, 0x10C0, 0x0040, 0x11C0, 0x00FF, 0x1F40, 0x0040
dw 0x1000, 0x0000, 0x1000
.code_point_75:
dw 0x00FF, 0x1FC0, 0x0047, 0x1040, 0x001E, 0x1C00, 0x0070, 0x1B40, 0x00C0
dw 0x12C0, 0x0000, 0x1080, 0x0000, 0x1000
.code_point_76:
dw 0x00FF, 0x1FC0, 0x0040, 0x10C0, 0x0000, 0x10C0, 0x0000, 0x10C0, 0x0000
dw 0x1180, 0x0000, 0x1000
.code_point_77:
dw 0x00FF, 0x1FC0, 0x0038, 0x1000, 0x001E, 0x1000, 0x0007, 0x1800, 0x001E
dw 0x1000, 0x0038, 0x1000, 0x00FF, 0x1FC0, 0x0000, 0x1000
.code_point_78:
dw 0x00FF, 0x1FC0, 0x0074, 0x1000, 0x000E, 0x1000, 0x0002, 0x1C00, 0x0040
dw 0x1740, 0x00FF, 0x1FC0, 0x0000, 0x1000
.code_point_79:
dw 0x001F, 0x1F40, 0x0074, 0x11C0, 0x00D0, 0x10C0, 0x00C0, 0x11C0, 0x0074
dw 0x1740, 0x001F, 0x1D00, 0x0000, 0x1000
.code_point_80:
dw 0x00FF, 0x1FC0, 0x00C1, 0x1C40, 0x00D0, 0x1C00, 0x0075, 0x1C00, 0x001F
dw 0x1400, 0x0000, 0x1000
.code_point_81:
dw 0x001F, 0x1F40, 0x0074, 0x11C0, 0x00C0, 0x10C0, 0x00D0, 0x1DC0, 0x0074
dw 0x1740, 0x001F, 0x1DC0, 0x0000, 0x1040
.code_point_82:
dw 0x00FF, 0x1FC0, 0x00C3, 0x1440, 0x00C3, 0x1400, 0x00D3, 0x1D00, 0x007C
dw 0x13C0, 0x0000, 0x1040
.code_point_83:
dw 0x003D, 0x1280, 0x00E7, 0x10C0, 0x00D3, 0x14C0, 0x00C3, 0x19C0, 0x0070
dw 0x1F40, 0x0000, 0x1000
.code_point_84:
dw 0x00D0, 0x1000, 0x00C0, 0x1040, 0x00FF, 0x1FC0, 0x00C0, 0x1040, 0x00D0
dw 0x1000, 0x0000, 0x1000
.code_point_85:
dw 0x00FF, 0x1F40, 0x0000, 0x12C0, 0x0000, 0x10C0, 0x0000, 0x11C0, 0x0000
dw 0x1740, 0x00FF, 0x1D00, 0x0000, 0x1000
.code_point_86:
dw 0x00FF, 0x1400, 0x0002, 0x1F00, 0x0000, 0x11C0, 0x0002, 0x1F00, 0x00FF
dw 0x1400, 0x0000, 0x1000
.code_point_87:
dw 0x00FD, 0x1400, 0x0007, 0x1FC0, 0x0000, 0x1A00, 0x001F, 0x1C00, 0x0000
dw 0x1A00, 0x0007, 0x1FC0, 0x00FD, 0x1400, 0x0000, 0x1000
.code_point_88:
dw 0x00D0, 0x11C0, 0x0039, 0x1F00, 0x000F, 0x1400, 0x000B, 0x1C00, 0x003C
dw 0x1B00, 0x00D0, 0x11C0, 0x0000, 0x1040
.code_point_89:
dw 0x00F0, 0x1000, 0x002D, 0x1000, 0x0007, 0x1FC0, 0x002D, 0x1000, 0x00F0
dw 0x1000, 0x0000, 0x1000
.code_point_90:
dw 0x00C0, 0x17C0, 0x00C0, 0x1EC0, 0x00C3, 0x19C0, 0x00DE, 0x10C0, 0x00F8
dw 0x10C0, 0x00E0, 0x10C0, 0x0000, 0x1000
.code_point_91:
dw 0x00FF, 0x1FC0, 0x00C0, 0x10C0, 0x0080, 0x1080, 0x0000, 0x1000
.code_point_92:
dw 0x00E0, 0x1000, 0x002E, 0x1000, 0x0002, 0x1E00, 0x0000, 0x12C0, 0x0000
dw 0x1000
.code_point_93:
dw 0x0080, 0x1080, 0x00C0, 0x10C0, 0x00FF, 0x1FC0, 0x0000, 0x1000
.code_point_94:
dw 0x0078, 0x1000, 0x00D0, 0x1000, 0x0078, 0x1000, 0x0000, 0x1000
.code_point_95:
dw 0x0000, 0x10C0, 0x0000, 0x10C0, 0x0000, 0x10C0, 0x0000, 0x10C0, 0x0000
dw 0x10C0, 0x0000, 0x1000
.code_point_96:
dw 0x00E0, 0x1000, 0x0018, 0x1000, 0x0000, 0x1000
.code_point_97:
dw 0x0005, 0x1340, 0x000C, 0x1CC0, 0x000C, 0x1CC0, 0x0007, 0x1FC0, 0x0000
dw 0x1040
.code_point_98:
dw 0x00FF, 0x1FC0, 0x004D, 0x10C0, 0x000D, 0x10C0, 0x0007, 0x1F40, 0x0000
dw 0x1000
.code_point_99:
dw 0x0007, 0x1F40, 0x000D, 0x10C0, 0x000D, 0x11C0, 0x0002, 0x1200, 0x0000
dw 0x1000
.code_point_100:
dw 0x0002, 0x1F40, 0x000B, 0x11C0, 0x004C, 0x10C0, 0x00FF, 0x1FC0, 0x0000
dw 0x1040
.code_point_101:
dw 0x0007, 0x1F40, 0x000C, 0x1CC0, 0x000C, 0x1CC0, 0x0007, 0x1880, 0x0000
dw 0x1000
.code_point_102:
dw 0x007F, 0x1FC0, 0x00D3, 0x1040, 0x00C2, 0x1000, 0x0000, 0x1000
.code_point_103:
dw 0x0003, 0x1D18, 0x000E, 0x130C, 0x000C, 0x130C, 0x000B, 0x1FF4, 0x0000
dw 0x1000
.code_point_104:
dw 0x00FF, 0x1FC0, 0x000D, 0x1040, 0x000E, 0x1000, 0x0007, 0x1FC0, 0x0000
dw 0x1040
.code_point_105:
dw 0x0001, 0x1040, 0x0073, 0x1FC0, 0x0010, 0x1040, 0x0000, 0x1000
.code_point_106:
dw 0x0000, 0x1008, 0x0001, 0x100C, 0x0033, 0x1FF4, 0x0000, 0x1000
.code_point_107:
dw 0x00FF, 0x1FC0, 0x0002, 0x1C00, 0x000B, 0x1700, 0x001C, 0x11C0, 0x0000
dw 0x1040
.code_point_108:
dw 0x00FF, 0x1F40, 0x0000, 0x11C0, 0x0000, 0x10C0, 0x0000, 0x1100
.code_point_109:
dw 0x000F, 0x1FC0, 0x0009, 0x1000, 0x0007, 0x1E00, 0x0009, 0x1040, 0x0007
dw 0x1FC0, 0x0000, 0x1000
.code_point_110:
dw 0x000F, 0x1FC0, 0x000D, 0x1000, 0x000C, 0x1040, 0x0007, 0x1FC0, 0x0000
dw 0x1000
.code_point_111:
dw 0x0007, 0x1F40, 0x000D, 0x10C0, 0x000C, 0x11C0, 0x0007, 0x1F40, 0x0000
dw 0x1000
.code_point_112:
dw 0x000F, 0x1FFC, 0x000D, 0x10C0, 0x000C, 0x11C0, 0x0007, 0x1F40, 0x0000
dw 0x1000
.code_point_113:
dw 0x0007, 0x1F40, 0x000D, 0x10C0, 0x000C, 0x11C0, 0x000F, 0x1FFD, 0x0004
dw 0x1001
.code_point_114:
dw 0x000F, 0x1FC0, 0x0003, 0x1400, 0x000D, 0x1000, 0x0000, 0x1000
.code_point_115:
dw 0x0003, 0x11C0, 0x000C, 0x1CC0, 0x000C, 0x1CC0, 0x0005, 0x1300, 0x0000
dw 0x1000
.code_point_116:
dw 0x000C, 0x1000, 0x00FF, 0x1F40, 0x000C, 0x11C0, 0x0000, 0x1040
.code_point_117:
dw 0x000F, 0x1F40, 0x0004, 0x10C0, 0x0000, 0x11C0, 0x000F, 0x1FC0, 0x0004
dw 0x1040
.code_point_118:
dw 0x000F, 0x1F00, 0x0000, 0x11C0, 0x0000, 0x1780, 0x000F, 0x1E00, 0x0000
dw 0x1000
.code_point_119:
dw 0x000F, 0x1F40, 0x0004, 0x11C0, 0x0002, 0x1F00, 0x0004, 0x11C0, 0x000F
dw 0x1F40, 0x0000, 0x1000
.code_point_120:
dw 0x000F, 0x17C0, 0x0002, 0x1C40, 0x0004, 0x1E00, 0x000F, 0x17C0, 0x0000
dw 0x1000
.code_point_121:
dw 0x000F, 0x1D0C, 0x0000, 0x174C, 0x0000, 0x11F4, 0x000F, 0x1F40, 0x0000
dw 0x1000
.code_point_122:
dw 0x000D, 0x13C0, 0x000C, 0x1EC0, 0x000F, 0x18C0, 0x000E, 0x11C0, 0x0000
dw 0x1000
.code_point_123:
dw 0x0003, 0x1000, 0x00BC, 0x1F80, 0x00C0, 0x10C0, 0x0000, 0x1000
.code_point_124:
dw 0x00BF, 0x1FD0, 0x0000, 0x1000
.code_point_125:
dw 0x00C0, 0x10C0, 0x00BC, 0x1F80, 0x0003, 0x1000, 0x0000, 0x1000
.code_point_126:
dw 0x0007, 0x1800, 0x000D, 0x1000, 0x0007, 0x1400, 0x0001, 0x1C00, 0x000B
dw 0x1000, 0x0000, 0x1000
.code_point_65533:
dw 0x0007, 0x1400, 0x001F, 0x1D00, 0x007F, 0x1F40, 0x01E3, 0x1FD0, 0x03CF
dw 0x1330, 0x01E0, 0x1BD0, 0x007F, 0x1F40, 0x001F, 0x1D00, 0x0007, 0x1400
dw 0x0000, 0x1000
.code_point_ptrs:
dw 0x5000, 0x300A, 0x5010, 0x601A, 0x6026, 0x7032, 0x6040, 0x304C, 0x4052
dw 0x405A, 0x6062, 0x606E, 0x407A, 0x5082, 0x308C, 0x6092, 0x609E, 0x50AA
dw 0x60B4, 0x60C0, 0x60CC, 0x60D8, 0x60E4, 0x60F0, 0x60FC, 0x6108, 0x3114
dw 0x411A, 0x6122, 0x612E, 0x613A, 0x6146, 0x8152, 0x6162, 0x616E, 0x617A
dw 0x6186, 0x6192, 0x619E, 0x61AA, 0x61B6, 0x41C2, 0x61CA, 0x71D6, 0x61E4
dw 0x81F0, 0x7200, 0x720E, 0x621C, 0x7228, 0x6236, 0x6242, 0x624E, 0x725A
dw 0x6268, 0x8274, 0x7284, 0x6292, 0x729E, 0x42AC, 0x52B4, 0x42BE, 0x42C6
dw 0x62CE, 0x32DA, 0x52E0, 0x52EA, 0x52F4, 0x52FE, 0x5308, 0x4312, 0x531A
dw 0x5324, 0x432E, 0x4336, 0x533E, 0x4348, 0x6350, 0x535C, 0x5366, 0x5370
dw 0x537A, 0x4384, 0x538C, 0x4396, 0x539E, 0x53A8, 0x63B2, 0x53BE, 0x53C8
dw 0x53D2, 0x43DC, 0x23E4, 0x43E8, 0x63F0, 0xA3FC
code_points_end: