1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,52 @@ |
1 |
+( |
|
2 |
+ heap functions |
|
3 |
+ |
|
4 |
+ The heap is an area of memory that is written from the bottom up. These |
|
5 |
+ are a few convenience functions to do that writing. |
|
6 |
+ |
|
7 |
+ There is a global short called "heap" that must be written to before using |
|
8 |
+ these functions, otherwise the zero page and program memory could be |
|
9 |
+ overwritten. |
|
10 |
+ |
|
11 |
+ A simple program could use all unallocated memory for the heap like so: |
|
12 |
+ |
|
13 |
+ |0100 @reset |
|
14 |
+ ;my-heap ;heap STA2 |
|
15 |
+ |
|
16 |
+ (the rest of your code) |
|
17 |
+ |
|
18 |
+ @my-heap |
|
19 |
+ |
|
20 |
+ Note that if there is a risk that the heap may overflow its bounds, it is |
|
21 |
+ strongly recommended to check where it is writing to. ";heap LDA2" will |
|
22 |
+ tell you where the next byte is written. |
|
23 |
+) |
|
24 |
+ |
|
25 |
+@heap $2 |
|
26 |
+ |
|
27 |
+@append-heap-byte ( byte -- ) |
|
28 |
+ ,heap LDR2 ( byte heap* ) |
|
29 |
+ INC2k ,heap STR2 |
|
30 |
+ STA |
|
31 |
+ JMP2r |
|
32 |
+ |
|
33 |
+@append-heap-short ( short^ -- ) |
|
34 |
+ ,heap LDR2 ( short^ heap* ) |
|
35 |
+ INC2k INC2 ,heap STR2 |
|
36 |
+ STA2 |
|
37 |
+ JMP2r |
|
38 |
+ |
|
39 |
+@append-heap-string ( string* -- ) |
|
40 |
+ ( copies a null-terminated string onto the heap, including the null ) |
|
41 |
+ STH2 ,heap LDR2 ( heap* / string* ) |
|
42 |
+ #01 JMP ( skip past INC2r ) |
|
43 |
+ |
|
44 |
+ &loop |
|
45 |
+ INC2r ( heap* / string* ) |
|
46 |
+ LDAkr DUPr STH2k STAr ( heap* / string* byte ) |
|
47 |
+ INC2 |
|
48 |
+ LITr f7 JCNr ( f7 is the value ",&loop" would produce ) |
|
49 |
+ POP2r ( heap* ) |
|
50 |
+ ,heap STR2 |
|
51 |
+ JMP2r |
|
52 |
+ |
... | ... |
@@ -143,9 +143,9 @@ |
143 | 143 |
|
144 | 144 |
@asma-print-heap-usage ( -- ) |
145 | 145 |
;asma/log-level LDA #08 AND #00 EQU ,&skip JCN |
146 |
- ;asma/heap LDA2 ;asma-heap SUB2 ;asma-print-short JSR2 |
|
146 |
+ ;heap LDA2 ;asma-heap SUB2 ;asma-print-short JSR2 |
|
147 | 147 |
;&str1 ;asma-print-string JSR2 |
148 |
- ;asma-heap/end ;asma/heap LDA2 SUB2 ;asma-print-short JSR2 |
|
148 |
+ ;asma-heap/end ;heap LDA2 SUB2 ;asma-print-short JSR2 |
|
149 | 149 |
;&str2 ;asma-print-string JSR2 |
150 | 150 |
&skip |
151 | 151 |
JMP2r |
... | ... |
@@ -242,7 +242,7 @@ |
242 | 242 |
;asma/error STA2 |
243 | 243 |
;asma-trees/labels STA2 |
244 | 244 |
;asma-trees/macros STA2 |
245 |
- ;asma-heap ;asma/heap STA2 |
|
245 |
+ ;asma-heap ;heap STA2 |
|
246 | 246 |
;asma-opcodes/_entry ;asma-trees/opcodes STA2 |
247 | 247 |
( fall through ) |
248 | 248 |
|
... | ... |
@@ -339,7 +339,7 @@ include projects/library/file-read-chunks.tal |
339 | 339 |
@asma [ |
340 | 340 |
&pass $1 &state $1 &line $2 &break $1 &eof $1 |
341 | 341 |
&token $2 &orig-token $2 |
342 |
- &heap $2 &addr $2 &written-addr $2 &flush-fn $2 |
|
342 |
+ &addr $2 &written-addr $2 &flush-fn $2 |
|
343 | 343 |
&src-filename $2 &dest-filename $2 |
344 | 344 |
&error $2 &log-level $1 |
345 | 345 |
] |
... | ... |
@@ -559,27 +559,7 @@ include projects/library/file-read-chunks.tal |
559 | 559 |
;asma-write-buffer .File/save DEO2 |
560 | 560 |
JMP2r |
561 | 561 |
|
562 |
-@asma-append-heap-byte ( dummy byte -- dummy ) |
|
563 |
- ;asma/heap LDA2 |
|
564 |
- OVR2 OVR2 STA POP |
|
565 |
- INC2 ;asma/heap STA2 |
|
566 |
- POP |
|
567 |
- JMP2r |
|
568 |
- |
|
569 |
-@asma-append-heap-short ( dummy short* -- dummy ) |
|
570 |
- SWP |
|
571 |
- ,asma-append-heap-byte JSR |
|
572 |
- ,asma-append-heap-byte JMP ( tail call ) |
|
573 |
- |
|
574 |
-@asma-append-heap-string ( string* -- ) |
|
575 |
- LDAk |
|
576 |
- DUP ,asma-append-heap-byte JSR |
|
577 |
- ,&keep-going JCN |
|
578 |
- POP2 JMP2r |
|
579 |
- |
|
580 |
- &keep-going |
|
581 |
- INC2 |
|
582 |
- ,asma-append-heap-string JMP |
|
562 |
+include projects/library/heap.tal |
|
583 | 563 |
|
584 | 564 |
@asma-traverse-tree ( incoming-ptr* -- binary-ptr* 00 if key found |
585 | 565 |
OR node-incoming-ptr* 01 if key not found ) |
... | ... |
@@ -615,12 +595,12 @@ include projects/library/binary-tree.tal |
615 | 595 |
;asma-msg-macro ;asma/error STA2 |
616 | 596 |
JMP2r |
617 | 597 |
|
618 |
- ¬-exist |
|
598 |
+ ¬-exist ( incoming-ptr* ) |
|
619 | 599 |
( define macro by creating new node ) |
620 |
- ;asma/heap LDA2 SWP2 STA2 |
|
621 |
- #0000 ;asma-append-heap-short JSR2 ( less-than pointer ) |
|
622 |
- #0000 ;asma-append-heap-short JSR2 ( greater-than pointer ) |
|
623 |
- ;asma/token LDA2 ;asma-append-heap-string JSR2 ( key ) |
|
600 |
+ ;heap LDA2 SWP2 STA2 |
|
601 |
+ #0000 ;append-heap-short JSR2 ( less-than pointer ) |
|
602 |
+ #0000 ;append-heap-short JSR2 ( greater-than pointer ) |
|
603 |
+ ;asma/token LDA2 ;append-heap-string JSR2 ( key ) |
|
624 | 604 |
#04 asma-STATE-SET |
625 | 605 |
JMP2r |
626 | 606 |
|
... | ... |
@@ -630,12 +610,12 @@ include projects/library/binary-tree.tal |
630 | 610 |
|
631 | 611 |
@asma-macro-body |
632 | 612 |
;asma/state LDA #10 AND ,&skip JCN |
633 |
- ;asma/token LDA2 ;asma-append-heap-string JSR2 |
|
613 |
+ ;asma/token LDA2 ;append-heap-string JSR2 |
|
634 | 614 |
&skip |
635 | 615 |
JMP2r |
636 | 616 |
|
637 | 617 |
@asma-macro-end |
638 |
- #00 ;asma-append-heap-byte JSR2 |
|
618 |
+ #00 ;append-heap-byte JSR2 |
|
639 | 619 |
#14 asma-STATE-CLEAR |
640 | 620 |
JMP2r |
641 | 621 |
|
... | ... |
@@ -643,7 +623,7 @@ include projects/library/binary-tree.tal |
643 | 623 |
;asma-trees/labels ,asma-label-helper JSR |
644 | 624 |
,&already-existed JCN |
645 | 625 |
|
646 |
- #0000 ;asma-append-heap-short JSR2 ( data2: subtree incoming ptr ) |
|
626 |
+ #0000 ;append-heap-short JSR2 ( data2: subtree incoming ptr ) |
|
647 | 627 |
|
648 | 628 |
&already-existed |
649 | 629 |
#0002 ADD2 ;asma-trees/scope STA2 |
... | ... |
@@ -665,14 +645,14 @@ include projects/library/binary-tree.tal |
665 | 645 |
|
666 | 646 |
&new-label ( incoming-ptr* ) |
667 | 647 |
( define label by creating new node ) |
668 |
- ;asma/heap LDA2 SWP2 STA2 |
|
669 |
- #0000 ;asma-append-heap-short JSR2 ( less-than pointer ) |
|
670 |
- #0000 ;asma-append-heap-short JSR2 ( greater-than pointer ) |
|
671 |
- ;asma/token LDA2 ;asma-append-heap-string JSR2 ( key ) |
|
648 |
+ ;heap LDA2 SWP2 STA2 |
|
649 |
+ #0000 ;append-heap-short JSR2 ( less-than pointer ) |
|
650 |
+ #0000 ;append-heap-short JSR2 ( greater-than pointer ) |
|
651 |
+ ;asma/token LDA2 ;append-heap-string JSR2 ( key ) |
|
672 | 652 |
|
673 |
- ;asma/heap LDA2 |
|
653 |
+ ;heap LDA2 |
|
674 | 654 |
|
675 |
- ;asma/addr LDA2 ;asma-append-heap-short JSR2 ( data1: address ) |
|
655 |
+ ;asma/addr LDA2 ;append-heap-short JSR2 ( data1: address ) |
|
676 | 656 |
#00 JMP2r |
677 | 657 |
|
678 | 658 |
@asma-pad-absolute |
... | ... |
@@ -862,8 +842,8 @@ include projects/library/binary-tree.tal |
862 | 842 |
|
863 | 843 |
@asma-include-filename |
864 | 844 |
#08 asma-STATE-CLEAR |
865 |
- ;asma/heap LDA2 |
|
866 |
- ;asma/token LDA2 ;asma-append-heap-string JSR2 |
|
845 |
+ ;heap LDA2 |
|
846 |
+ ;asma/token LDA2 ;append-heap-string JSR2 |
|
867 | 847 |
;asma-assemble-file-pass JSR2 |
868 | 848 |
;asma/break LDAk INC ROT ROT STA |
869 | 849 |
JMP2r |