Removing support for it is one thing, updating all tests another.
Chris Pressey
4 years ago
82 | 82 | defn = self.defn() |
83 | 83 | self.declare(defn.name, SymEntry(defn, defn.location)) |
84 | 84 | defns.append(defn) |
85 | while self.scanner.on('define', 'routine'): | |
86 | if self.scanner.consume('define'): | |
87 | name = self.scanner.token | |
88 | self.scanner.scan() | |
89 | routine = self.routine(name) | |
90 | else: | |
91 | routine = self.legacy_routine() | |
92 | name = routine.name | |
85 | while self.scanner.consume('define'): | |
86 | name = self.scanner.token | |
87 | self.scanner.scan() | |
88 | routine = self.routine(name) | |
93 | 89 | self.declare(name, SymEntry(routine, routine.location)) |
94 | 90 | routines.append(routine) |
95 | 91 | self.scanner.check_type('EOF') |
256 | 252 | if self.scanner.consume('trashes'): |
257 | 253 | trashes = set(self.labels()) |
258 | 254 | return (inputs, outputs, trashes) |
259 | ||
260 | def legacy_routine(self): | |
261 | self.scanner.expect('routine') | |
262 | name = self.scanner.token | |
263 | self.scanner.scan() | |
264 | (inputs, outputs, trashes) = self.constraints() | |
265 | type_ = RoutineType(inputs=inputs, outputs=outputs, trashes=trashes) | |
266 | if self.scanner.consume('@'): | |
267 | self.scanner.check_type('integer literal') | |
268 | block = None | |
269 | addr = int(self.scanner.token) | |
270 | self.scanner.scan() | |
271 | else: | |
272 | block = self.block() | |
273 | addr = None | |
274 | location = LocationRef(type_, name) | |
275 | return Routine( | |
276 | self.scanner.line_number, | |
277 | name=name, block=block, addr=addr, | |
278 | location=location | |
279 | ) | |
280 | 255 | |
281 | 256 | def routine(self, name): |
282 | 257 | type_ = self.defn_type() |
15 | 15 | |
16 | 16 | Rudimentary program. |
17 | 17 | |
18 | | routine main { | |
18 | | define main routine { | |
19 | 19 | | ld a, 0 |
20 | 20 | | add a, 1 |
21 | 21 | | } |
25 | 25 | |
26 | 26 | | // Welcome to my program. |
27 | 27 | | |
28 | | routine main { | |
28 | | define main routine { | |
29 | 29 | | ld a, 0 |
30 | 30 | | add a, 1 // We are adding the thing. |
31 | 31 | | sub a, 1 |
39 | 39 | |
40 | 40 | Hex literals. |
41 | 41 | |
42 | | routine main { | |
42 | | define main routine { | |
43 | 43 | | ld a, $ff |
44 | 44 | | add a, $01 |
45 | 45 | | } |
47 | 47 | |
48 | 48 | Syntax error. |
49 | 49 | |
50 | | routine foo ( | |
50 | | define foo routine ( | |
51 | 51 | | ld a, 0 |
52 | 52 | | add a, 1 |
53 | 53 | | ) |
64 | 64 | |
65 | 65 | Extern routines |
66 | 66 | |
67 | | routine chrout | |
67 | | define chrout routine | |
68 | 68 | | inputs a |
69 | 69 | | trashes a |
70 | 70 | | @ 65490 |
71 | 71 | | |
72 | | routine chrin | |
72 | | define chrin routine | |
73 | 73 | | outputs a |
74 | 74 | | trashes x |
75 | 75 | | @ 65487 |
77 | 77 | |
78 | 78 | Trash. |
79 | 79 | |
80 | | routine main { | |
80 | | define main routine { | |
81 | 81 | | trash a |
82 | 82 | | trash n |
83 | 83 | | } |
85 | 85 | |
86 | 86 | `nop`. |
87 | 87 | |
88 | | routine main | |
88 | | define main routine | |
89 | 89 | | { |
90 | 90 | | nop |
91 | 91 | | } |
93 | 93 | |
94 | 94 | If with not |
95 | 95 | |
96 | | routine foo { | |
96 | | define foo routine { | |
97 | 97 | | ld y, 0 |
98 | 98 | | cmp y, 10 |
99 | 99 | | if not z { |
105 | 105 | |
106 | 106 | Repeat loop |
107 | 107 | |
108 | | routine foo { | |
108 | | define foo routine { | |
109 | 109 | | ld y, 0 |
110 | 110 | | repeat { |
111 | 111 | | inc y |
116 | 116 | |
117 | 117 | "While" loop |
118 | 118 | |
119 | | routine foo inputs y { | |
119 | | define foo routine inputs y { | |
120 | 120 | | repeat { |
121 | 121 | | cmp y, 10 |
122 | 122 | | if not z { |
128 | 128 | |
129 | 129 | Repeat forever |
130 | 130 | |
131 | | routine foo inputs y { | |
131 | | define foo routine inputs y { | |
132 | 132 | | repeat { |
133 | 133 | | inc y |
134 | 134 | | } forever |
137 | 137 | |
138 | 138 | Repeat with not |
139 | 139 | |
140 | | routine foo inputs y { | |
140 | | define foo routine inputs y { | |
141 | 141 | | repeat { |
142 | 142 | | inc y |
143 | 143 | | } until not z |
148 | 148 | |
149 | 149 | | byte table[256] tab |
150 | 150 | | |
151 | | routine foo trashes a, x, c, z, v { | |
151 | | define foo routine trashes a, x, c, z, v { | |
152 | 152 | | ld x, 0 |
153 | 153 | | for x up to 15 { |
154 | 154 | | ld a, tab + x |
162 | 162 | |
163 | 163 | Other blocks. |
164 | 164 | |
165 | | routine main trashes a, x, c, z, v { | |
165 | | define main routine trashes a, x, c, z, v { | |
166 | 166 | | with interrupts off { |
167 | 167 | | save a, x, c { |
168 | 168 | | ld a, 0 |
182 | 182 | | buffer[2048] buf |
183 | 183 | | pointer ptr |
184 | 184 | | |
185 | | routine main { | |
185 | | define main routine { | |
186 | 186 | | } |
187 | 187 | = ok |
188 | 188 | |
192 | 192 | | word table[256] wmany |
193 | 193 | | vector (routine trashes a) table[256] vmany |
194 | 194 | | |
195 | | routine main { | |
195 | | define main routine { | |
196 | 196 | | ld x, 0 |
197 | 197 | | ld a, 0 |
198 | 198 | | st off, c |
214 | 214 | |
215 | 215 | | word table[512] many |
216 | 216 | | |
217 | | routine main | |
217 | | define main routine | |
218 | 218 | | inputs many |
219 | 219 | | outputs many |
220 | 220 | | trashes a, x, n, z |
226 | 226 | |
227 | 227 | | word table[0] many |
228 | 228 | | |
229 | | routine main | |
229 | | define main routine | |
230 | 230 | | inputs many |
231 | 231 | | outputs many |
232 | 232 | | trashes a, x, n, z |
238 | 238 | |
239 | 239 | | word table[48] many |
240 | 240 | | |
241 | | routine main | |
241 | | define main routine | |
242 | 242 | | inputs many |
243 | 243 | | outputs many |
244 | 244 | | trashes a, x, n, z |
255 | 255 | | typedef routine trashes a game_routine |
256 | 256 | | vector game_routine start_game |
257 | 257 | | |
258 | | routine main { | |
258 | | define main routine { | |
259 | 259 | | } |
260 | 260 | = ok |
261 | 261 | |
264 | 264 | | typedef byte frank |
265 | 265 | | typedef word frank |
266 | 266 | | |
267 | | routine main { | |
267 | | define main routine { | |
268 | 268 | | } |
269 | 269 | ? SyntaxError |
270 | 270 | |
279 | 279 | | |
280 | 280 | | byte lark: lives |
281 | 281 | | |
282 | | routine main { | |
282 | | define main routine { | |
283 | 283 | | ld a, lives |
284 | 284 | | } |
285 | 285 | = ok |
289 | 289 | | const w1 1000 |
290 | 290 | | const w1 word 0 |
291 | 291 | | |
292 | | routine main { | |
292 | | define main routine { | |
293 | 293 | | } |
294 | 294 | ? SyntaxError |
295 | 295 | |
297 | 297 | |
298 | 298 | | byte screen @ 1024 |
299 | 299 | | |
300 | | routine main { | |
300 | | define main routine { | |
301 | 301 | | ld a, 100 |
302 | 302 | | st a, screen |
303 | 303 | | shl screen |
309 | 309 | |
310 | 310 | | byte lives : 3 |
311 | 311 | | |
312 | | routine main { | |
312 | | define main routine { | |
313 | 313 | | ld a, lives |
314 | 314 | | st a, lives |
315 | 315 | | } |
319 | 319 | |
320 | 320 | | byte screen : 3 @ 1024 |
321 | 321 | | |
322 | | routine main { | |
322 | | define main routine { | |
323 | 323 | | ld a, lives |
324 | 324 | | st a, lives |
325 | 325 | | } |
332 | 332 | | word r2 @ 60000 |
333 | 333 | | word r3 : 2000 |
334 | 334 | | |
335 | | routine main { | |
335 | | define main routine { | |
336 | 336 | | } |
337 | 337 | = ok |
338 | 338 | |
340 | 340 | |
341 | 341 | | byte table[32] message : "WHAT DO YOU WANT TO DO NEXT?" |
342 | 342 | | |
343 | | routine main { | |
343 | | define main routine { | |
344 | 344 | | } |
345 | 345 | = ok |
346 | 346 | |
347 | 347 | Can't initialize anything but a byte table with a string. |
348 | 348 | |
349 | | word message : "WHAT DO YOU WANT TO DO NEXT?" | |
350 | | | |
351 | | routine main { | |
349 | | word message : "OUCH! WHAT DO YOU DO?" | |
350 | | | |
351 | | define main routine { | |
352 | 352 | | } |
353 | 353 | ? SyntaxError |
354 | 354 | |
356 | 356 | |
357 | 357 | | byte table[8] charmap : 0, 255, 129, 192, 0, 1, 2, 4 |
358 | 358 | | |
359 | | routine main { | |
359 | | define main routine { | |
360 | 360 | | } |
361 | 361 | = ok |
362 | 362 | |
363 | 363 | Can't access an undeclared memory location. |
364 | 364 | |
365 | | routine main { | |
365 | | define main routine { | |
366 | 366 | | ld a, 0 |
367 | 367 | | st a, lives |
368 | 368 | | } |
373 | 373 | | byte lives |
374 | 374 | | byte lives |
375 | 375 | | |
376 | | routine main { | |
376 | | define main routine { | |
377 | 377 | | ld a, 0 |
378 | 378 | | st a, lives |
379 | 379 | | } |
383 | 383 | |
384 | 384 | | byte a |
385 | 385 | | |
386 | | routine main { | |
386 | | define main routine { | |
387 | 387 | | } |
388 | 388 | ? SyntaxError |
389 | 389 | |
390 | 390 | | byte z |
391 | 391 | | |
392 | | routine main { | |
392 | | define main routine { | |
393 | 393 | | } |
394 | 394 | ? SyntaxError |
395 | 395 | |
396 | 396 | Can't call routine that hasn't been defined. |
397 | 397 | |
398 | | routine main { | |
398 | | define main routine { | |
399 | 399 | | ld x, 0 |
400 | 400 | | ld y, 1 |
401 | 401 | | call up |
407 | 407 | |
408 | 408 | | byte up |
409 | 409 | | |
410 | | routine main { | |
410 | | define main routine { | |
411 | 411 | | ld x, 0 |
412 | 412 | | ld y, 1 |
413 | 413 | | call up |
414 | 414 | | } |
415 | 415 | ? SyntaxError |
416 | 416 | |
417 | | routine main { | |
417 | | define main routine { | |
418 | 418 | | ld x, 0 |
419 | 419 | | ld y, 1 |
420 | 420 | | call x |
423 | 423 | |
424 | 424 | But you can call a routine that is yet to be defined, further on. |
425 | 425 | |
426 | | routine main { | |
426 | | define main routine { | |
427 | 427 | | ld x, 0 |
428 | 428 | | ld y, 1 |
429 | 429 | | call up |
430 | 430 | | call up |
431 | 431 | | } |
432 | | routine up { | |
432 | | define up routine { | |
433 | 433 | | ld a, 0 |
434 | 434 | | } |
435 | 435 | = ok |
436 | 436 | |
437 | 437 | Can't define two routines with the same name. |
438 | 438 | |
439 | | routine main { | |
439 | | define main routine { | |
440 | 440 | | inc x |
441 | 441 | | inc y |
442 | 442 | | } |
443 | | routine main { | |
443 | | define main routine { | |
444 | 444 | | ld x, 0 |
445 | 445 | | ld y, 1 |
446 | 446 | | } |
450 | 450 | |
451 | 451 | | byte table[256] tab |
452 | 452 | | |
453 | | routine main { | |
453 | | define main routine { | |
454 | 454 | | ld x, 0 |
455 | 455 | | ld y, 0 |
456 | 456 | | ld a, tab + x |
461 | 461 | | word one |
462 | 462 | | word table[256] many |
463 | 463 | | |
464 | | routine main { | |
464 | | define main routine { | |
465 | 465 | | ld x, 0 |
466 | 466 | | copy one, many + x |
467 | 467 | | copy word 0, many + x |
477 | 477 | | trashes a, x, z, n |
478 | 478 | | cinv @ 788 |
479 | 479 | | |
480 | | routine foo { | |
481 | | ld a, 0 | |
482 | | } | |
483 | | routine main { | |
480 | | define foo routine { | |
481 | | ld a, 0 | |
482 | | } | |
483 | | define main routine { | |
484 | 484 | | with interrupts off { |
485 | 485 | | copy foo, cinv |
486 | 486 | | } |
496 | 496 | | trashes a, x, z, n |
497 | 497 | | @ 788 |
498 | 498 | | |
499 | | routine main { | |
499 | | define main routine { | |
500 | 500 | | } |
501 | 501 | ? SyntaxError |
502 | 502 | |
508 | 508 | | trashes a, x, z, n |
509 | 509 | | cinv @ 788 |
510 | 510 | | |
511 | | routine foo { | |
512 | | ld a, 0 | |
513 | | } | |
514 | | routine main { | |
511 | | define foo routine { | |
512 | | ld a, 0 | |
513 | | } | |
514 | | define main routine { | |
515 | 515 | | with interrupts off { |
516 | 516 | | copy foo, cinv |
517 | 517 | | } |
527 | 527 | | trashes a, x, z, n |
528 | 528 | | cinv @ 788 |
529 | 529 | | |
530 | | routine foo { | |
531 | | ld a, 0 | |
532 | | } | |
533 | | routine main { | |
530 | | define foo routine { | |
531 | | ld a, 0 | |
532 | | } | |
533 | | define main routine { | |
534 | 534 | | with interrupts off { |
535 | 535 | | copy foo, cinv |
536 | 536 | | } |
547 | 547 | | outputs cinv, x |
548 | 548 | | trashes a, x, z, n |
549 | 549 | | cinv @ 788 |
550 | | routine main { | |
550 | | define main routine { | |
551 | 551 | | with interrupts off { |
552 | 552 | | copy foo, cinv |
553 | 553 | | } |
554 | 554 | | call cinv |
555 | 555 | | } |
556 | | routine foo { | |
556 | | define foo routine { | |
557 | 557 | | ld a, 0 |
558 | 558 | | } |
559 | 559 | = ok |
560 | 560 | |
561 | 561 | goto. |
562 | 562 | |
563 | | routine foo { | |
564 | | ld a, 0 | |
565 | | } | |
566 | | routine main { | |
563 | | define foo routine { | |
564 | | ld a, 0 | |
565 | | } | |
566 | | define main routine { | |
567 | 567 | | goto foo |
568 | 568 | | } |
569 | 569 | = ok |
570 | 570 | |
571 | | routine main { | |
571 | | define main routine { | |
572 | 572 | | goto foo |
573 | 573 | | } |
574 | | routine foo { | |
574 | | define foo routine { | |
575 | 575 | | ld a, 0 |
576 | 576 | | } |
577 | 577 | = ok |
578 | 578 | |
579 | 579 | | vector routine foo |
580 | 580 | | |
581 | | routine main { | |
581 | | define main routine { | |
582 | 582 | | goto foo |
583 | 583 | | } |
584 | 584 | = ok |
585 | 585 | |
586 | | routine main { | |
586 | | define main routine { | |
587 | 587 | | goto foo |
588 | 588 | | } |
589 | 589 | ? SyntaxError |
590 | 590 | |
591 | 591 | | byte foo |
592 | 592 | | |
593 | | routine main { | |
593 | | define main routine { | |
594 | 594 | | goto foo |
595 | 595 | | } |
596 | 596 | ? SyntaxError |
602 | 602 | | pointer ptrb |
603 | 603 | | byte foo |
604 | 604 | | |
605 | | routine main { | |
605 | | define main routine { | |
606 | 606 | | copy ^buf, ptr |
607 | 607 | | copy 123, [ptr] + y |
608 | 608 | | copy [ptr] + y, foo |
628 | 628 | | inc x |
629 | 629 | | } |
630 | 630 | | |
631 | | routine main | |
631 | | define main routine | |
632 | | outputs vec | |
633 | | trashes a, z, n | |
634 | | { | |
635 | | copy foo, vec | |
636 | | } | |
637 | = ok | |
638 | ||
639 | | typedef routine | |
640 | | inputs x | |
641 | | outputs x | |
642 | | trashes z, n | |
643 | | routine_type | |
644 | | | |
645 | | vector routine_type vec | |
646 | | | |
647 | | define foo routine_type | |
648 | | { | |
649 | | inc x | |
650 | | } | |
651 | | | |
652 | | define main routine | |
632 | 653 | | outputs vec |
633 | 654 | | trashes a, z, n |
634 | 655 | | { |