-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommodore64.txt
More file actions
341 lines (309 loc) · 11.1 KB
/
Commodore64.txt
File metadata and controls
341 lines (309 loc) · 11.1 KB
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
337
338
339
340
341
100 REM BASIC Month 7: Make-a-Face
110 REM http://RetroBattlestations.com
120 REM written by FozzTexx
200 REM Initialize variables
210 DIM GD$(5, 5):REM Face grid is 5x5
220 DIM BK(25, 6):REM There are 25 blocks with up to 6 faces each
230 DIM CL$(16):REM Codes to print to change color
240 IV$ = CHR$(18):OV$ = CHR$(146):OC$ = CHR$(154)
250 GOSUB 2110:REM Read everything from DATA
260 POKE 53281,15
270 OX = 5:OY = 3
500 REM Face editor
510 PRINT CHR$(147): REM Clear the screen
520 PRINT CHR$(142);CL$(0):REM Set graphics charset and black text
530 GOSUB 1910
540 GX = 0:GY = 0
550 K$ = "":GOSUB 1410
600 GET K$:IF K$ = "" THEN 600
610 IF K$ = "I" OR K$ = "J" OR K$ = "K" OR K$ = "M" THEN GOSUB 1410
620 IF K$ = "W" OR K$ = "A" OR K$ = "S" OR K$ = "Z" THEN GOSUB 1510
630 IF K$ = "F" THEN GOSUB 1710
640 IF K$ = "E" THEN GOTO 3010
700 GOTO 600
1000 REM Move cursor to X,Y
1010 POKE 781,Y:POKE 782,X
1020 POKE 783,0:SYS 65520
1030 RETURN
1100 REM Display tile TN at GX,GY
1110 FOR I = 0 TO 2
1120 X = GX * 3 + OX:Y = GY * 3 + I + OY
1130 GOSUB 1010
1140 PRINT MID$(TL$(TN),I*9+1,9);OV$;OC$;
1150 NEXT I
1160 RETURN
1200 REM Display grid location GX,GY
1210 GS$ = GD$(GX,GY)
1220 BN = ASC(GS$) - 65:FC = ASC(MID$(GS$,2)) - 49
1230 TN = BK(BN, FC)
1240 GOSUB 1110
1250 RETURN
1300 REM Display cursor CS$ at GX,GY
1310 X = GX * 3 + OX:Y = OY - 1:GOSUB 1010:PRINT LEFT$(CS$,9);
1320 Y = 5 * 3 + OY:GOSUB 1010:PRINT MID$(CS$,10,9);
1330 FOR I = 0 TO 2
1340 X = OX - 1:Y = GY * 3 + OY + I:GOSUB 1010:PRINT MID$(CS$,19+I*3,3);
1350 X = 5 * 3 + OX:GOSUB 1010:PRINT MID$(CS$,28+I*3,3);
1360 NEXT I
1370 RETURN
1400 REM Move cursor
1410 IF K$ = "I" THEN NY = GY - 1:IF NY < 0 THEN NY = 4
1420 IF K$ = "J" THEN NX = GX - 1:IF NX < 0 THEN NX = 4
1430 IF K$ = "K" THEN NX = GX + 1:IF NX > 4 THEN NX = 0
1440 IF K$ = "M" THEN NY = GY + 1:IF NY > 4 THEN NY = 0
1450 IF GX <> NX OR GY <> NY THEN CS$ = CB$:GOSUB 1310
1460 GX = NX:GY = NY:CS$ = CR$:GOSUB 1310
1470 RETURN
1500 REM Swap block
1510 IF K$ = "W" THEN NY = GY - 1:IF NY < 0 THEN NY = 4
1520 IF K$ = "A" THEN NX = GX - 1:IF NX < 0 THEN NX = 4
1530 IF K$ = "S" THEN NX = GX + 1:IF NX > 4 THEN NX = 0
1540 IF K$ = "Z" THEN NY = GY + 1:IF NY > 4 THEN NY = 0
1550 OB$ = GD$(GX,GY):GD$(GX,GY) = GD$(NX,NY):GD$(NX,NY) = OB$
1560 GOSUB 1210
1570 PX = GX:PY = GY:GX = NX:GY = NY
1580 GOSUB 1210
1590 REM Restore GX,GY and let move cursor routine do RETURN
1600 GX = PX:GY = PY:GOTO 1410
1700 REM Flip or roll a block
1710 GS$ = GD$(GX,GY)
1720 BN = ASC(GS$) - 65:FC = ASC(MID$(GS$,2)) - 49
1730 FC = FC + 1:IF FC > 5 OR BK(BN,FC) = 0 THEN FC = 0
1740 GD$(GX,GY) = CHR$(65 + BN) + CHR$(49 + FC)
1750 REM Display tile and let that subroutine do RETURN
1760 GOTO 1210
1800 REM Convert encoded D$ to decoded C$
1810 C = ASC(D$):D = ASC(MID$(D$, 2))
1820 D = (D - 1) AND 63
1830 CL = INT(D / 4):D = D AND 3
1840 C = (C - 32 + D * 64 AND 127) + 32
1850 C$ = OV$:IF D >= 2 THEN C$ = IV$
1860 IF C >= 128 AND C < 160 THEN C = C + 32
1870 C$ = C$ + CL$(CL) + CHR$(C)
1880 RETURN
1900 REM Display instructions and grid
1910 X = OX + 5 * 3 + 2 + 4:Y = OY
1920 GOSUB 1010:PRINT "IJKM TO MOVE"
1930 X1 = X:X = X + 5:Y = Y + 1
1940 GOSUB 1010:PRINT "CURSOR"
1950 X = X1:Y = Y + 1
1960 GOSUB 1010:PRINT "WASZ TO SWAP"
1970 Y = Y + 1
1980 GOSUB 1010:PRINT "F TO FLIP"
2000 REM Display entire grid
2010 FOR GN = 0 TO 24
2020 GY = INT(GN / 5):GX = GN - GY * 5
2030 GOSUB 1210
2040 NEXT GN
2050 RETURN
2100 REM Read colors, cursor, tiles, blocks from DATA
2110 PRINT "Setting up tiles"
2120 MX = 16 + 12 + 150 * 9 + 25 * 6 + 25:LC = 0
2130 FOR I = 0 TO 15
2140 PC = INT(LC / MX * 100):PRINT STR$(PC);"%";CHR$(13);CHR$(145);
2150 READ CL
2160 CL$(I) = CHR$(CL)
2170 LC = LC + 1
2180 NEXT I
2190 REM Read grid cursor from DATA
2200 CR$ = "":CB$ = "":B$ = " " + CHR$(0) + CHR$(0)
2210 FOR I = 1 TO 12
2220 PC = INT(LC / MX * 100):PRINT STR$(PC);"%";CHR$(13);CHR$(145);
2230 READ D$:GOSUB 1810
2240 CR$ = CR$ + C$:CB$ = CB$ + B$
2250 LC = LC + 1
2260 NEXT I
2270 REM Load tiles from DATA
2280 READ TN:DIM TL$(TN):REM Tiles for each face
2290 MX = 16 + 12 + TN * 9 + 25 * 6 + 25
2300 FOR I = 1 TO TN
2310 T$ = ""
2320 FOR J = 1 TO 9
2330 PC = INT(LC / MX * 100):PRINT STR$(PC);"%";CHR$(13);CHR$(145);
2340 READ D$:IF LEN(D$) > 2 THEN D$ = MID$(D$, 2)
2350 GOSUB 1810
2360 T$ = T$ + C$
2370 LC = LC + 1
2380 NEXT J
2390 TL$(I) = T$
2400 NEXT I
2410 FOR I = 0 TO 24
2420 FOR J = 0 TO 5
2430 PC = INT(LC / MX * 100):PRINT STR$(PC);"%";CHR$(13);CHR$(145);
2440 BK(I, J) = 0
2450 LC = LC + 1
2460 NEXT J
2470 Y = INT(I / 5):X = I - Y * 5
2480 GD$(X,Y) = CHR$(65+I) + "1"
2490 NEXT I
2500 REM Read blocks from DATA
2510 READ BN:IF BN = -1 THEN RETURN
2520 PC = INT(LC / MX * 100):PRINT STR$(PC);"%";CHR$(13);CHR$(145);
2530 READ TN:FOR I = 1 TO TN
2540 READ T:BK(BN-1, I-1) = T
2550 LC = LC + 1
2560 NEXT I
2570 GOTO 2510
3000 REM Lines 3000-3990 are the optional block and tile editor
3010 PRINT CHR$(147): REM Clear the screen
3020 GS$ = GD$(GX,GY)
3030 EB = ASC(GS$) - 65:FC = ASC(MID$(GS$,2)) - 49
3040 PRINT "BLOCK: ";EB
3100 REM Display all faces of block
3110 FOR K = 0 TO 5
3120 GY = INT(K / 3):GX = K - GY * 3
3130 GY = GY * 2:GX = GX * 2
3140 TN = BK(EB, K)
3150 IF TN > 0 THEN GOSUB 1110:X = GX*3+OX:Y = GY*3+OY-1:GOSUB 1010:PRINT TN
3160 NEXT K
3170 GX = 0:GY = 0:FC = 0
3180 GOSUB 3310
3200 FX = 0:FY = 0:K$ = "":GOSUB 3410
3210 GET K$:IF K$ = "" THEN 3210
3220 IF K$ = "I" OR K$ = "J" OR K$ = "K" OR K$ = "M" THEN GOSUB 3410
3230 IF K$ = CHR$(13) THEN GOSUB 3610
3240 IF K$ >= "1" AND K$ <= "6" THEN GOSUB 3810
3250 IF K$ = "Q" THEN GOTO 510
3260 GOTO 3210
3300 REM Display tile code of selected face
3310 TN = BK(EB, FC):IV = 0
3320 FOR K = 1 TO 9
3330 FY = INT((K - 1) / 3):FX = K - 1 - FY*3
3340 GOSUB 3510
3350 NEXT K
3360 RETURN
3400 REM Move cursor to another tile square
3410 IF K$ = "I" THEN NY = FY - 1:IF NY < 0 THEN NY = 2
3420 IF K$ = "J" THEN NX = FX - 1:IF NX < 0 THEN NX = 2
3430 IF K$ = "K" THEN NX = FX + 1:IF NX > 2 THEN NX = 0
3440 IF K$ = "M" THEN NY = FY + 1:IF NY > 2 THEN NY = 0
3450 IV = 0:GOSUB 3510
3460 FX = NX:FY = NY
3470 IV = 1:GOSUB 3510
3480 RETURN
3500 REM Display tile cursor
3510 SQ = FY * 3 + FX
3520 C$ = MID$(TL$(TN), SQ*3+1, 3):GOSUB 3910
3530 X = FX*3 + OX:Y = FY*2 + OY + 11:GOSUB 1010
3540 IF IV THEN PRINT IV$;
3550 PRINT D$;OV$;
3560 RETURN
3600 REM Ask user for encoded character
3610 X = 5:Y = 20:GOSUB 1010
3620 PRINT "VALUE: ";
3630 D$ = ""
3640 GET KK$:IF KK$ = "" THEN 3640
3650 K = ASC(KK$) - 32:IF K < 0 OR K > 63 THEN 3640
3660 PRINT KK$;
3670 D$ = D$ + KK$:IF LEN(D$) < 2 THEN 3640
3680 GOSUB 1010:PRINT " "
3690 GOSUB 1810
3700 SQ = FY * 3 + FX
3710 T$ = LEFT$(TL$(TN), SQ*3) + C$ + MID$(TL$(TN), SQ*3+4)
3720 TL$(TN) = T$
3730 GOSUB 1110
3740 GOTO 3510:REM Let display tile cursor subroutine do RETURN
3800 REM Choose another face
3810 FC = ASC(K$) - 49
3820 GY = INT(FC / 3):GX = FC - GY * 3
3830 GX = GX * 2:GY = GY * 2
3840 TN = BK(EB, FC)
3850 GOSUB 1110:GOSUB 3310
3860 K$ = "":GOTO 3410 :REM Let display tile code subroutine do RETURN
3900 REM Convert character C$ to encoded D$
3910 V = 1 - INT((ASC(C$) - 18) / 128)
3920 L$ = MID$(C$,2,1):C = ASC(MID$(C$,3))
3930 FOR L = 0 TO 15:IF CL$(L) <> L$ THEN NEXT L
3940 IF C >= 160 AND C < 192 THEN C = C - 32
3950 D = INT((C + 256 - 32 AND 255) / 64)
3960 C = C - D * 64:REM Remove multiplier from C
3970 D = (D + V * 2 + L * 4 + 33 AND 63) + 32:REM Make 0 equal A
3980 D$ = CHR$(C) + CHR$(D)
3990 RETURN
4000 REM Colors
4010 DATA 144,5,28,159,156,30,31,158,129,149,150,151,152,153,154,155
4100 REM Grid cursor
4110 DATA BB,BB,BB,BD,BD,BD,AD,AD,AD,AB,AB,AB
5000 DATA 61 :REM Number of tiles
5010 DATA " A"," A"," A"," A"," A"," A"," A"," A"," A"
5020 DATA " ="," =",IL,IL," K"," K"," K"," K"," K"
5030 DATA " K"," K"," K",IJ," =",?J,TJ," =",JJ
5040 DATA " K"," K"," K"," K",=L," K",IJ," =",?J
5050 DATA ?L," ="," ="," K"," K",?L," K"," K"," K"
5060 DATA " ="," ="," ="," ="," ="," ="," ="," ="," ="
5070 DATA " ="," =",ID,ID," C"," C"," C"," C"," C"
5080 DATA " C"," C"," C"," C",=D," C",IB," =",?B
5090 DATA ?D," ="," ="," C"," C",?D," C"," C"," C"
5100 DATA " K"," K"," K"," K"," K"," K"," K"," K"," K"
5110 DATA " ="," ="," =",=B," =",=B,*B,#B,+B
5120 DATA " =",ID," C"," ="," C"," C",ID," C"," C"
5130 DATA " C"," C"," C"," C"," C",AB," C",BD," ="
5140 DATA " C"," C"," C",AD," C"," C"," =",BD," C"
5150 DATA " C",?D," ="," C"," C"," ="," C"," C",?D
5160 DATA " K"," K",IJ," K",IJ," =",?J,?L," ="
5170 DATA " =",."B," ="," =",."B," =",1B,."B,1B
5180 DATA ?J," K"," K"," =",?J," K"," =",IL,IJ
5190 DATA " C"," C",IB," C"," C"," ="," C"," C",?D
5200 DATA 5F,#F,)F,."F," =",VD,*F,#F,+F
5210 DATA 5F,#F,)F,UD," =",."F,*F,#F,+F
5220 DATA ?B," C"," C"," ="," C"," C",ID," C"," C"
5230 DATA 5B,1B,)B,."B," =",."B,*B,#B,+B
5240 DATA ?L," ="," ="," K",?L," ="," K"," K",?L
5250 DATA " ="," ="," =",LJ,YJ,[J,XJ,OL,XJ
5260 DATA " ="," =",IL," =",IL," K",IL," K"," K"
5270 DATA " C"," C"," C"," C"," C"," C"," C"," C"," C"
5280 DATA AB," ="," ="," C"," ="," ="," C"," C",BB
5290 DATA " ="," =",AD," ="," ="," C",BB," C"," C"
5300 DATA ?D," =",ID," C",."D," C",IB," =",?B
5310 DATA LJ,XL,[J,EL," K",GL,\J,OL,^J
5320 DATA ID,IB," ="," C",?D," ="," C"," C",?D
5330 DATA " =",BB," C",AD," C"," C"," C"," C"," C"
5340 DATA " C",BB," ="," C"," C",AB," C"," C"," C"
5350 DATA " =",?B,?D," =",ID," C",ID," C"," C"
5360 DATA " C"," C"," C",?B," C"," C"," ="," =",?B
5370 DATA " C"," C"," C"," C"," C",IB,IB," ="," ="
5380 DATA " C"," C"," C"," C",":D"," C"," C"," C"," C"
5390 DATA " =",IL," K"," ="," K"," K",IL," K"," K"
5400 DATA " ="," ="," =",IH," G",?D," ="," ="," ="
5410 DATA " =",=B," ="," ="," C"," =",UD," C",VD
5420 DATA " K",?L," ="," K"," K"," ="," K"," K",?L
5430 DATA \B,OD,^B," ="," ="," ="," ="," ="," ="
5440 DATA " =",=B," ="," =",=B," =",1B,=B,1B
5450 DATA " K"," K"," K"," K"," K"," K",IJ," =",?J
5460 DATA " K"," K"," K",AL," K"," K"," =",BL," K"
5470 DATA ?L," =",IL," K"," K"," K"," K"," K"," K"
5480 DATA " K"," K"," K"," K"," K",AJ," K",BL," ="
5490 DATA BL," K"," K"," =",\J," K"," ="," =",AL
5500 DATA " K"," K",BL," K",^J," =",AJ," ="," ="
5510 DATA AJ," ="," ="," K",[J," ="," K"," K",BJ
5520 DATA " ="," =",AL," =",LJ," K",BJ," K"," K"
5530 DATA " K",BJ," ="," K"," K",AJ," K"," K"," K"
5540 DATA " K"," K",IJ," K"," K"," ="," K"," K",?L
5550 DATA " C"," C",IB," C",IB," =",?B,?D," ="
5560 DATA ?D," =",ID," C",=D," C",IB," =",?B
5570 DATA ?B," C"," C"," =",?B," C"," =",ID,IB
5580 DATA " ="," ="," =",LJ,YJ,[J,XJ," K",XJ
5590 DATA " C"," C",BD," C",^B," ="," ="," ="," ="
5600 DATA " ="," ="," ="," =",":B"," ="," ="," ="," ="
5610 DATA BD," C"," C"," =",\B," C"," ="," =",AD
6000 REM Which tiles are on which blocks
6010 DATA 1,5,2,7,37,42,59
6020 DATA 2,4,3,8,39,55, 3,4,4,9,40,10
6030 DATA 4,5,3,12,41,39,52
6040 DATA 5,4,5,13,40,56, 6,3,10,14,42
6050 DATA 7,5,11,15,2,45,10, 8,3,6,32,51
6060 DATA 9,6,11,19,4,42,60,10
6070 DATA 10,4,10,20,35,53
6080 DATA 11,4,16,21,5,10, 12,3,6,33,52
6090 DATA 13,4,17,31,38,57
6100 DATA 14,4,6,34,33,40
6110 DATA 15,6,18,22,16,49,61,6
6120 DATA 16,4,23,27,44,54
6130 DATA 17,4,24,28,46,50
6140 DATA 18,4,25,36,43,31
6150 DATA 19,6,26,29,47,46,34,48
6160 DATA 20,4,23,27,43,52
6170 DATA 21,4,6,27,34,51, 22,3,10,27,44
6180 DATA 23,4,6,30,48,58, 24,3,10,27,43
6190 DATA 25,5,6,27,18,33,10
6200 DATA -1