-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathO.LOGIC
More file actions
485 lines (485 loc) · 7.73 KB
/
O.LOGIC
File metadata and controls
485 lines (485 loc) · 7.73 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
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
10PROCheader("and")
20and%=P%
30FORo%=0TO3STEP3
40P%=and%
50[:OPTo%
60CPX#stkbot%-2
70BCSunderflow
80LDAstk%+1,X
90ANDstk%+3,X
100STAstk%+3,X
110LDAstk%+2,X
120ANDstk%+4,X
130STAstk%+4,X
140INX:INX
150RTS
160.underflow
170LDA#estku%
180JMP(svct%)
190]:NEXTo%
200PROCheader("or")
210or%=P%
220FORo%=0TO3STEP3
230P%=or%
240[:OPTo%
250CPX#stkbot%-2
260BCSunderflow
270LDAstk%+1,X
280ORAstk%+3,X
290STAstk%+3,X
300LDAstk%+2,X
310ORAstk%+4,X
320STAstk%+4,X
330INX:INX
340RTS
350.underflow
360LDA#estku%
370JMP(svct%)
380]:NEXTo%
390PROCheader("xor")
400xor%=P%
410FORo%=0TO3STEP3
420P%=xor%
430[:OPTo%
440CPX#stkbot%-2
450BCSunderflow
460LDAstk%+1,X
470EORstk%+3,X
480STAstk%+3,X
490LDAstk%+2,X
500EORstk%+4,X
510STAstk%+4,X
520INX:INX
530RTS
540.underflow
550LDA#estku%
560JMP(svct%)
570]:NEXTo%
580PROCheader("not")
590not%=P%
600FORo%=0TO3STEP3
610P%=not%
620[:OPTo%
630CPX#stkbot%
640BEQunderflow
650LDAstk%+1,X
660EOR#&FF
670STAstk%+1,X
680LDAstk%+2,X
690EOR#&FF
700STAstk%+2,X
710RTS
720.underflow
730LDA#estku%
740JMP(svct%)
750]:NEXTo%
760PROCheader("toggle")
770toggle%=P%
780FORo%=0TO3STEP3
790P%=toggle%
800[:OPTo%
810CPX#stkbot%-2
820BCSunderflow
830LDA(stk%+3,X)
840EORstk%+1,X
850STA(stk%+3,X)
860INX:INX:INX:INX
870RTS
880.underflow
890LDA#estku%
900JMP(svct%)
910]:NEXTo%
920PROCheader("=")
930equal%=P%
940FORo%=0TO3STEP3
950P%=equal%
960[:OPTo%
970CPX#stkbot%-2
980BCSunderflow
990LDAstk%+1,X
1000CMPstk%+3,X
1010BNEfalse
1020LDAstk%+2,X
1030CMPstk%+4,X
1040BNEfalse
1050LDA#&FF
1060STAstk%+3,X
1070STAstk%+4,X
1080INX:INX
1090RTS
1100.false
1110LDA#&00
1120STAstk%+3,X
1130STAstk%+4,X
1140INX:INX
1150RTS
1160.underflow
1170LDA#estku%
1180JMP(svct%)
1190]:NEXTo%
1200PROCheader(">")
1210greater%=P%
1220FORo%=0TO3STEP3
1230P%=greater%
1240[:OPTo%
1250CPX#stkbot%-2
1260BCSunderflow
1270SEC
1280LDAstk%+1,X
1290SBCstk%+3,X
1300LDAstk%+2,X
1310SBCstk%+4,X
1320BPLfalse
1330LDA#&FF
1340STAstk%+4,X
1350STAstk%+3,X
1360INX:INX
1370RTS
1380.false
1390LDA#&00
1400STAstk%+4,X
1410STAstk%+3,X
1420INX:INX
1430RTS
1440.underflow
1450LDA#estku%
1460JMP(svct%)
1470]:NEXTo%
1480PROCheader("<")
1490less%=P%
1500FORo%=0TO3STEP3
1510P%=less%
1520[:OPTo%
1530CPX#stkbot%-2
1540BCSunderflow
1550SEC
1560LDAstk%+3,X
1570SBCstk%+1,X
1580LDAstk%+4,X
1590SBCstk%+2,X
1600BPLfalse
1610LDA#&FF
1620STAstk%+4,X
1630STAstk%+3,X
1640INX:INX
1650RTS
1660.false
1670LDA#&00
1680STAstk%+4,X
1690STAstk%+3,X
1700INX:INX
1710RTS
1720.underflow
1730LDA#estku%
1740JMP(svct%)
1750]:NEXTo%
1760PROCheader("0>")
1770zerogreater%=P%
1780FORo%=0TO3STEP3
1790P%=zerogreater%
1800[:OPTo%
1810CPX#stkbot%
1820BEQunderflow
1830LDAstk%+2,X
1840BMIzerofalse
1850BNEzerotrue
1860LDAstk%+1,X
1870BNEzerotrue
1880.zerofalse
1890LDA#&00
1900STAstk%+1,X
1910STAstk%+2,X
1920RTS
1930.zerotrue
1940LDA#&FF
1950STAstk%+1,X
1960STAstk%+2,X
1970RTS
1980.underflow
1990LDA#estku%
2000JMP(svct%)
2010]:NEXTo%
2020PROCheader("0<")
2030zeroless%=P%
2040FORo%=0TO3STEP3
2050P%=zeroless%
2060[:OPTo%
2070CPX#stkbot%
2080BEQunderflow
2090LDAstk%+2,X
2100ASL A
2110BCSzerotrue
2120LDA#&00
2130STAstk%+1,X
2140STAstk%+2,X
2150RTS
2160.zerotrue
2170LDA#&FF
2180STAstk%+1,X
2190STAstk%+2,X
2200RTS
2210.underflow
2220LDA#estku%
2230JMP(svct%)
2240]:NEXTo%
2250PROCheader("0=")
2260zeroequal%=P%
2270FORo%=0TO3STEP3
2280P%=zeroequal%
2290[:OPTo%
2300CPX#stkbot%
2310BEQunderflow
2320LDAstk%+1,X
2330ORAstk%+2,X
2340BEQzerotrue
2350LDA#&00
2360STAstk%+1,X
2370STAstk%+2,X
2380RTS
2390.zerotrue
2400LDA#&FF
2410STAstk%+1,X
2420STAstk%+2,X
2430RTS
2440.underflow
2450LDA#estku%
2460JMP(svct%)
2470]:NEXTo%
2480PROCheader("u>")
2490ugreater%=P%
2500FORo%=0TO3STEP3
2510P%=ugreater%
2520[:OPTo%
2530CPX#stkbot%-2
2540BCSunderflow
2550LDAstk%+4,X
2560CMPstk%+2,X
2570BCCufalse
2580BNEutrue
2590LDAstk%+3,X
2600CMPstk%+1,X
2610BCCufalse
2620BEQufalse
2630.utrue
2640INX:INX
2650LDA#&FF
2660STAstk%+1,X
2670STAstk%+2,X
2680RTS
2690.ufalse
2700INX:INX
2710LDA#&00
2720STAstk%+1,X
2730STAstk%+2,X
2740RTS
2750.underflow
2760LDA#estku%
2770JMP(svct%)
2780]:NEXTo%
2790PROCheader("u<")
2800uless%=P%
2810FORo%=0TO3STEP3
2820P%=uless%
2830[:OPTo%
2840CPX#stkbot%-2
2850BCSunderflow
2860LDAstk%+2,X
2870CMPstk%+4,X
2880BCCufalse
2890BNEutrue
2900LDAstk%+1,X
2910CMPstk%+3,X
2920BCCufalse
2930BEQufalse
2940.utrue
2950INX:INX
2960LDA#&FF
2970STAstk%+1,X
2980STAstk%+2,X
2990RTS
3000.ufalse
3010INX:INX
3020LDA#&00
3030STAstk%+1,X
3040STAstk%+2,X
3050RTS
3060.underflow
3070LDA#estku%
3080JMP(svct%)
3090]:NEXTo%
3100PROCheader("?branch")
3110branch%=P%
3120FORo%=0TO3STEP3
3130P%=branch%
3140[:OPTo%
3150CPX#stkbot%
3160BEQunderflow
3170INX:INX
3180LDAstk%,X
3190BNEreturn
3200LDAstk%-1,X
3210.return
3220RTS
3230.underflow
3240LDA#estku%
3250JMP(svct%)
3260]:NEXTo%
3270PROCheader("(do)")
3280bdo%=P%
3290FORo%=0TO3STEP3
3300P%=bdo%
3310[:OPTo%
3320CPX#stkbot%-2
3330BCSunderflow
3340TXA:TAY
3350LDAstk%+1,X
3360STAsc%
3370LDAstk%+2,X
3380STAsc%+1
3390LDAstk%+3,X
3400STAsc%+2
3410LDAstk%+4,X
3420LDXasp%
3430CPX#astktop%+2
3440BCCoverflow
3450DEX:DEX:DEX:DEX
3460STAastk%+4,X
3470LDAsc%+2
3480STAastk%+3,X
3490LDAsc%+1
3500STAastk%+2,X
3510LDAsc%
3520STAastk%+1,X
3530STXasp%
3540TYA:TAX
3550INX:INX:INX:INX
3560RTS
3570.underflow
3580LDA#estku%
3590JMP(svct%)
3600.overflow
3610LDA#eastko%
3620JMP(svct%)
3630]:NEXTo%
3640PROCheader("(loop)")
3650bloop%=P%
3660FORo%=0TO3STEP3
3670P%=bloop%
3680[:OPTo%
3690TXA:TAY
3700LDXasp%
3710CPX#astkbot%-2
3720BCSunderflow
3730INCastk%+1,X
3740BNEcheck
3750INCastk%+2,X
3760.check
3770CLC
3780LDAastk%+3,X
3790SBCastk%+1,X
3800LDAastk%+4,X
3810SBCastk%+2,X
3820ASLA
3830TYA:TAX
3840RTS
3850.underflow
3860LDA#eastku%
3870JMP(svct%)
3880]:NEXTo%
3890PROCheader("(+loop)")
3900bplusloop%=P%
3910FORo%=0TO3STEP3
3920P%=bplusloop%
3930[:OPTo%
3940CPX#stkbot%
3950BEQunderflow
3960LDAstk%+2,X
3970TAY
3980LDAstk%+1,X
3990INX:INX
4000STXsc%
4010LDXasp%
4020CPX#astkbot%-2
4030BCSaunderflow
4040CLC
4050ADCastk%+1,X
4060STAastk%+1,X
4070TYA
4080ADCastk%+2,X
4090STAastk%+2,X
4100TYA
4110BMInegative
4120CLC
4130LDAastk%+3,X
4140SBCastk%+1,X
4150LDAastk%+4,X
4160SBCastk%+2,X
4170ASLA
4180LDXsc%
4190RTS
4200.negative
4210SEC
4220LDAastk%+1,X
4230SBCastk%+3,X
4240LDAastk%+2,X
4250SBCastk%+4,X
4260ASLA
4270LDXsc%
4280RTS
4290.underflow
4300LDA#estku%
4310JMP(svct%)
4320.aunderflow
4330LDA#eastku%
4340JMP(svct%)
4350]:NEXTo%
4360PROCheader("leave")
4370leave%=P%
4380FORo%=0TO3STEP3
4390P%=leave%
4400[:OPTo%
4410TXA:TAY
4420LDXasp%
4430CPX#astkbot%-2
4440BCSunderflow
4450LDAastk%+3,X
4460STAastk%+1,X
4470LDAastk%+4,X
4480STAastk%+2,X
4490TYA:TAX
4500RTS
4510.underflow
4520LDA#eastku%
4530JMP(svct%)
4540]:NEXTo%
4550OSCLI("EXEC E.LOGIC")
4560END
4570DEFPROCheader(name$)
4580PRINT:PRINT
4590PRINT" *** ";~P%;" nfa '";name$;"'"
4600LETxhere%=P%
4610LETspan%=LEN(name$)
4620?P%=span%
4630PROCsetbit(7,P%)
4640LETP%=P%+1
4650IFspan% > length%THENspan%=length%
4660FORi%=1TOspan%
4670?P%=ASC(MID$(name$,i%,1))
4680LETP%=P%+1
4690NEXTi%
4700PRINT" *** ";~P%;" lfa (";~last%;")"
4710PROCsetbit(7,P%-1)
4720PROCpoke(last%,P%)
4730LETP%=P%+2
4740LETlast%=xhere%
4750LETlabel%=label%+1
4760PRINT:PRINT
4770ENDPROC
4780DEFPROCsetbit(bit%,addr%)
4790?addr%=?addr%OR(2^bit%)
4800ENDPROC
4810DEFPROCpoke(val%,addr%)
4820?addr%=val%MOD256
4830?(addr%+1)=val%DIV256
4840ENDPROC
4850DEFFNliteral(value%):[:OPTo%:JSRlit%:]:PROCpoke(value%,P%):P%=P%+2:=o%