| ... | ... |
@@ -99,6 +99,9 @@ |
| 99 | 99 |
;asma/src-filename LDA2 ;asma-assemble-file-pass JSR2 |
| 100 | 100 |
asma-IF-ERROR ,&error JCN |
| 101 | 101 |
|
| 102 |
+ ( flush output buffer ) |
|
| 103 |
+ ;asma-output/ptr LDA2 ;asma-write-buffer SUB2 ;asma/flush-fn LDA2 JSR2 |
|
| 104 |
+ |
|
| 102 | 105 |
;asma-trees/labels ;asma-print-labels JSR2 ( DEBUG ) |
| 103 | 106 |
;asma-print-line-count JSR2 ( DEBUG ) |
| 104 | 107 |
;asma-print-heap-usage JSR2 ( DEBUG ) |
| ... | ... |
@@ -270,9 +273,6 @@ |
| 270 | 273 |
|
| 271 | 274 |
asma-IF-ERROR ,&error JCN |
| 272 | 275 |
|
| 273 |
- ( flush output buffer ) |
|
| 274 |
- ;asma-output/ptr LDA2 ;asma-write-buffer SUB2 ;asma/flush-fn LDA2 JSR2 |
|
| 275 |
- |
|
| 276 | 276 |
&error |
| 277 | 277 |
POP2 POP2 POP2 POP2 POP2 |
| 278 | 278 |
JMP2r |
| ... | ... |
@@ -288,45 +288,56 @@ include projects/library/file-read-chunks.tal |
| 288 | 288 |
of the last token in the chunk. |
| 289 | 289 |
) |
| 290 | 290 |
|
| 291 |
-@asma-assemble-chunk ( line^ ptr* len^ -- assembled-up-to-ptr* ) |
|
| 292 |
- ROT2k ( line^ ptr* len^ ptr* len^ line^ ) |
|
| 293 |
- ;asma/line STA2 ( line^ ptr* len^ ptr* len^ ) |
|
| 294 |
- ADD2 #0001 SUB2 NIP2 ( line^ ptr* last-ptr* ) |
|
| 295 |
- SWP2 STH2k ( line^ last-ptr* ptr* / ptr* ) |
|
| 296 |
- ,&loop JMP |
|
| 297 |
- |
|
| 298 |
- &next-char-pop ( line^ last-ptr* ptr* char / start-of-token* ) |
|
| 299 |
- POP |
|
| 300 |
- INC2 |
|
| 301 |
- &loop ( line^ last-ptr* ptr* / start-of-token* ) |
|
| 302 |
- LTH2k ,&end JCN |
|
| 303 |
- LDAk ( line^ last-ptr* ptr* char / start-of-token* ) |
|
| 304 |
- DUP #20 GTH ,&next-char-pop JCN |
|
| 305 |
- |
|
| 306 |
- #00 OVR2 ( line^ last-ptr* ptr* char 00 ptr* / start-of-token* ) |
|
| 307 |
- STA STH2r ( line^ last-ptr* ptr* char start-of-token* ) |
|
| 308 |
- ,asma-assemble-token JSR ( line^ last-ptr* ptr* char ) |
|
| 291 |
+@asma-assemble-chunk ( line^ chunk* len^ -- line^ assembled-up-to-chunk* ) |
|
| 292 |
+ ROT2 STH2 ( chunk* len^ / line^ ) |
|
| 293 |
+ OVR2 ADD2 ( chunk* end-chunk* / line^ ) |
|
| 294 |
+ OVR2 ;asma-read-buffer EQU2 STH |
|
| 295 |
+ DUP2 ;asma-read-buffer/end NEQ2 |
|
| 296 |
+ STHr AND ;asma/eof STA |
|
| 297 |
+ SWP2 STH2k ( end-chunk* chunk* / line^ start-of-token* ) |
|
| 298 |
+ |
|
| 299 |
+ &loop ( end-chunk* char* / line^ start-of-token* ) |
|
| 300 |
+ LDAk #21 LTH ,&whitespace JCN |
|
| 301 |
+ INC2 ,&loop JMP |
|
| 302 |
+ |
|
| 303 |
+ &whitespace ( end-chunk* ws-char* / line^ start-of-token* ) |
|
| 304 |
+ GTH2k ,&within-chunk JCN |
|
| 305 |
+ ;asma/eof LDA ,&eof JCN |
|
| 306 |
+ |
|
| 307 |
+ ( reached the end of the chunk, start-of-token* is where we assembled up to ) |
|
| 308 |
+ POP2 POP2 STH2r STH2r SWP2 JMP2r |
|
| 309 |
+ |
|
| 310 |
+ &within-chunk ( end-chunk* ws-char* / line^ start-of-token* ) |
|
| 311 |
+ LDAk #0a NEQ ( end-chunk* ws-char* not-newline / line^ start-of-token* ) |
|
| 312 |
+ #00 OVR2 STA |
|
| 313 |
+ STH2r ,asma-assemble-token JSR ( end-chunk* ws-char* not-newline / line^ ) |
|
| 314 |
+ JMP INC2r ( end-chunk* ws-char* / line^ ) |
|
| 309 | 315 |
asma-IF-ERROR ,&error JCN |
| 310 |
- |
|
| 311 |
- #0a NEQ ,¬-newline JCN ( line^ last-ptr* ptr* ) |
|
| 312 |
- ROT2 INC2 ( last-ptr* ptr* line+1^ ) |
|
| 313 |
- DUP2 ;asma/line STA2 |
|
| 314 |
- ROT2 ROT2 ( line^ last-ptr* ptr* ) |
|
| 315 |
- ¬-newline |
|
| 316 |
- |
|
| 317 |
- INC2 DUP2 STH2 ( line^ last-ptr* ptr* / start-of-token* ) |
|
| 316 |
+ ;asma/break LDA ,&break JCN |
|
| 317 |
+ INC2 STH2k ( end-chunk* start-of-token* / line^ start-of-token* ) |
|
| 318 | 318 |
,&loop JMP |
| 319 | 319 |
|
| 320 |
- &end |
|
| 321 |
- POP2 POP2 STH2r |
|
| 322 |
- JMP2r |
|
| 320 |
+ &break ( end-chunk* ws-char* / line^ ) |
|
| 321 |
+ ( the read buffer has been invalidated, ws-char* plus one is where we assembled up to ) |
|
| 322 |
+ ;asma/break LDA #01 SUB ;asma/break STA |
|
| 323 |
+ INC2 NIP2 ( assembled-up-to-ptr* / line^ ) |
|
| 324 |
+ STH2r SWP2 JMP2r |
|
| 323 | 325 |
|
| 324 |
- &error |
|
| 325 |
- POP POP2 POP2 |
|
| 326 |
+ &error ( end-chunk* ws-char* / line^ ) |
|
| 327 |
+ ( return no progress with assembly to make file-read-chunks exit ) |
|
| 328 |
+ POP2 POP2 STH2r ;asma-read-buffer |
|
| 326 | 329 |
JMP2r |
| 327 | 330 |
|
| 331 |
+ &eof ( end-chunk* ws-char* / line^ start-of-token* ) |
|
| 332 |
+ ( reached the end of file, end-chunk* is safe to write since the buffer is bigger ) |
|
| 333 |
+ ( return no progress with assembly to make file-read-chunks exit ) |
|
| 334 |
+ POP2 ( end-chunk* / line^ start-of-token* ) |
|
| 335 |
+ #00 ROT ROT STA ( / line^ start-of-token* ) |
|
| 336 |
+ STH2r ,asma-assemble-token JSR ( / line^ ) |
|
| 337 |
+ STH2r ;asma-read-buffer JMP2r |
|
| 338 |
+ |
|
| 328 | 339 |
@asma [ |
| 329 |
- &pass $1 &state $1 &line $2 |
|
| 340 |
+ &pass $1 &state $1 &line $2 &break $1 &eof $1 |
|
| 330 | 341 |
&token $2 &orig-token $2 |
| 331 | 342 |
&heap $2 &addr $2 &written-addr $2 &flush-fn $2 |
| 332 | 343 |
&src-filename $2 &dest-filename $2 |
| ... | ... |
@@ -338,10 +349,11 @@ include projects/library/file-read-chunks.tal |
| 338 | 349 |
The main routine to assemble a single token. |
| 339 | 350 |
asma/state contains several meaningful bits: |
| 340 | 351 |
0x02 we are in a comment, |
| 341 |
- 0x04 we are in a macro body, and |
|
| 342 |
- 0x08 we are in a macro body that we are ignoring |
|
| 352 |
+ 0x04 we are in a macro body, |
|
| 353 |
+ 0x08 we are expecting an include filename, and |
|
| 354 |
+ 0x10 we are in a macro body that we are ignoring |
|
| 343 | 355 |
(because the macro was already defined in a previous pass). |
| 344 |
- Since 0x08 never appears without 0x04, the lowest bit set in asma/state is |
|
| 356 |
+ Since 0x10 never appears without 0x04, the lowest bit set in asma/state is |
|
| 345 | 357 |
always 0x00, 0x02, or 0x04, which is very handy for use with jump tables. |
| 346 | 358 |
The lowest bit set can be found easily by #00 (n) SUBk AND. |
| 347 | 359 |
) |
| ... | ... |
@@ -384,11 +396,15 @@ include projects/library/file-read-chunks.tal |
| 384 | 396 |
:asma-first-char-normal/_entry |
| 385 | 397 |
:asma-first-char-comment/_entry |
| 386 | 398 |
:asma-first-char-macro/_entry |
| 399 |
+ $2 ( invalid position ) |
|
| 400 |
+ $2 ( empty tree for include ) |
|
| 387 | 401 |
|
| 388 | 402 |
&body-routines |
| 389 | 403 |
:asma-normal-body |
| 390 | 404 |
:asma-ignore |
| 391 | 405 |
:asma-macro-body |
| 406 |
+ $2 ( invalid position ) |
|
| 407 |
+ :asma-include-filename |
|
| 392 | 408 |
|
| 393 | 409 |
@asma-parse-hex-digit ( charcode -- 00-0f if valid hex |
| 394 | 410 |
OR 10-ff otherwise ) |
| ... | ... |
@@ -644,18 +660,18 @@ include projects/library/file-read-chunks.tal |
| 644 | 660 |
JMP2r |
| 645 | 661 |
|
| 646 | 662 |
&ignore-macro |
| 647 |
- #0c asma-STATE-SET |
|
| 663 |
+ #14 asma-STATE-SET |
|
| 648 | 664 |
JMP2r |
| 649 | 665 |
|
| 650 | 666 |
@asma-macro-body |
| 651 |
- ;asma/state LDA #08 AND ,&skip JCN |
|
| 667 |
+ ;asma/state LDA #10 AND ,&skip JCN |
|
| 652 | 668 |
;asma/token LDA2 ;asma-append-heap-string JSR2 |
| 653 | 669 |
&skip |
| 654 | 670 |
JMP2r |
| 655 | 671 |
|
| 656 | 672 |
@asma-macro-end |
| 657 | 673 |
#00 ;asma-append-heap-byte JSR2 |
| 658 |
- #0c asma-STATE-CLEAR |
|
| 674 |
+ #14 asma-STATE-CLEAR |
|
| 659 | 675 |
JMP2r |
| 660 | 676 |
|
| 661 | 677 |
@asma-label-define |
| ... | ... |
@@ -706,6 +722,7 @@ include projects/library/file-read-chunks.tal |
| 706 | 722 |
,&valid JCN |
| 707 | 723 |
|
| 708 | 724 |
;asma-msg-hex ;asma/error STA2 |
| 725 |
+ POP2 |
|
| 709 | 726 |
JMP2r |
| 710 | 727 |
|
| 711 | 728 |
&valid |
| ... | ... |
@@ -860,14 +877,30 @@ include projects/library/file-read-chunks.tal |
| 860 | 877 |
,¯o-loop JMP |
| 861 | 878 |
|
| 862 | 879 |
¬-macro |
| 880 |
+ POP2 |
|
| 881 |
+ ;&include-string ;asma-strcmp-tree JSR2 ,¬-include JCN |
|
| 882 |
+ POP2 ( discard dummy after-node-key* ) |
|
| 883 |
+ #08 asma-STATE-SET |
|
| 884 |
+ JMP2r |
|
| 885 |
+ |
|
| 886 |
+ ¬-include |
|
| 863 | 887 |
;asma-msg-label ;asma/error STA2 |
| 864 | 888 |
&error |
| 865 |
- POP2 |
|
| 866 | 889 |
JMP2r |
| 867 | 890 |
|
| 868 | 891 |
&too-deep |
| 869 |
- ;asma-msg-too-deep ;asma/error STA2 |
|
| 870 | 892 |
POP2 |
| 893 |
+ ;asma-msg-too-deep ;asma/error STA2 |
|
| 894 |
+ JMP2r |
|
| 895 |
+ |
|
| 896 |
+ &include-string "include 00 |
|
| 897 |
+ |
|
| 898 |
+@asma-include-filename |
|
| 899 |
+ #08 asma-STATE-CLEAR |
|
| 900 |
+ ;asma/heap LDA2 |
|
| 901 |
+ ;asma/token LDA2 ;asma-append-heap-string JSR2 |
|
| 902 |
+ ;asma-assemble-file-pass JSR2 |
|
| 903 |
+ ;asma/break LDAk INC ROT ROT STA |
|
| 871 | 904 |
JMP2r |
| 872 | 905 |
|
| 873 | 906 |
( Error messages ) |