1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,101 @@ |
1 |
+( devices ) |
|
2 |
+ |
|
3 |
+|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 &debug $1 &halt $1 ] |
|
4 |
+|10 @Console [ &pad $8 &write $1 ] |
|
5 |
+|a0 @File [ &vector $2 &success $2 &offset-hs $2 &offset-ls $2 &name $2 &length $2 &load $2 &save $2 ] |
|
6 |
+ |
|
7 |
+( vectors ) |
|
8 |
+ |
|
9 |
+|0100 @reset |
|
10 |
+ ( |
|
11 |
+ Set the log level for helping to debug stuff. |
|
12 |
+ Its value is the bitwise OR of all the following output types: |
|
13 |
+ #01 prints the number of lines in the source code, |
|
14 |
+ #04 dumps all defined labels at end, and |
|
15 |
+ #08 prints the heap usage. |
|
16 |
+ ) |
|
17 |
+ #0d ;asma/log-level STA |
|
18 |
+ |
|
19 |
+ ( |
|
20 |
+ Assemble the source code into an output ROM file. |
|
21 |
+ |
|
22 |
+ If all you want is to use asma.tal to assemble files, insert a BRK |
|
23 |
+ after this statement. |
|
24 |
+ ) |
|
25 |
+ ;&source-file ;&dest-file ;asma-assemble-file JSR2 |
|
26 |
+ |
|
27 |
+ ( |
|
28 |
+ If an error has occurred, BRK here, otherwise continue. (The error |
|
29 |
+ message will already have been printed to the Console in |
|
30 |
+ asma-assemble-file.) |
|
31 |
+ ) |
|
32 |
+ ;asma/error LDA2 #0000 EQU2 JMP BRK |
|
33 |
+ |
|
34 |
+ ( |
|
35 |
+ Load the output ROM over the currently running program, almost as if |
|
36 |
+ we loaded the ROM with uxnemu directly! |
|
37 |
+ |
|
38 |
+ It's not a totally pristine environment, as File/load doesn't zero out |
|
39 |
+ memory beyond the end of the file. So if the assembled program assumes |
|
40 |
+ that all memory above it is zero, it may misbehave. |
|
41 |
+ |
|
42 |
+ Asma itself doesn't use the zero page, but this example code writes a |
|
43 |
+ DEO2 instruction to 0x00ff. In order to execute File/load and have the |
|
44 |
+ CPU continue at memory location 0x0100, we write the final DEO2 |
|
45 |
+ instruction there and jump there as our final act. |
|
46 |
+ |
|
47 |
+ Just in case the assembled code is zero-length (which can occur when |
|
48 |
+ assembling an empty source file), we write a BRK to the reset vector so |
|
49 |
+ that will prevent an infinite loop. |
|
50 |
+ ) |
|
51 |
+ ;&dest-file .File/name DEO2 |
|
52 |
+ #0000 .File/offset-ls DEO2 |
|
53 |
+ #ff00 .File/length DEO2 |
|
54 |
+ #0100 .File/load |
|
55 |
+ LIT DEO2 #00ff STA |
|
56 |
+ LIT BRK #0100 STA |
|
57 |
+ #00ff JMP2 |
|
58 |
+ |
|
59 |
+ &source-file |
|
60 |
+ "projects/examples/demos/piano.tal 00 |
|
61 |
+ &dest-file |
|
62 |
+ "bin/asma-boot.rom 00 |
|
63 |
+ |
|
64 |
+include projects/library/asma.tal |
|
65 |
+ |
|
66 |
+( |
|
67 |
+ Heap, a large temporary area for keeping track of labels. More complex |
|
68 |
+ programs need more of this space. If there's insufficient space then the |
|
69 |
+ assembly process will fail, but having extra space above what the most |
|
70 |
+ complex program needs provides no benefit. |
|
71 |
+ |
|
72 |
+ This heap, and the buffers below, are free to be used to hold temporary |
|
73 |
+ data between assembly runs, and do not need to be initialized with any |
|
74 |
+ particular contents to use the assembler. |
|
75 |
+) |
|
76 |
+ |
|
77 |
+@asma-heap |
|
78 |
+ |
|
79 |
+|e000 &end |
|
80 |
+ |
|
81 |
+( |
|
82 |
+ Buffer for use with loading source code. |
|
83 |
+ The minimum size is the length of the longest token plus one, which is |
|
84 |
+ 0x21 to keep the same capability of the C assembler. |
|
85 |
+ Larger sizes are more efficient, provided there is enough |
|
86 |
+ heap space to keep track of all the labels. |
|
87 |
+) |
|
88 |
+ |
|
89 |
+@asma-read-buffer |
|
90 |
+ |
|
91 |
+|f800 &end |
|
92 |
+ |
|
93 |
+( |
|
94 |
+ Buffer for use with writing output. |
|
95 |
+ The minimum size is 1, and larger sizes are more efficient. |
|
96 |
+) |
|
97 |
+ |
|
98 |
+@asma-write-buffer |
|
99 |
+ |
|
100 |
+|ffff &end |
|
101 |
+ |
0 | 102 |
similarity index 88% |
1 | 103 |
rename from projects/software/asma.tal |
2 | 104 |
rename to projects/library/asma.tal |
... | ... |
@@ -1,11 +1,3 @@ |
1 |
-( devices ) |
|
2 |
- |
|
3 |
-|00 @System [ &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 &debug $1 &halt $1 ] |
|
4 |
-|10 @Console [ &pad $8 &write $1 ] |
|
5 |
-|a0 @File [ &vector $2 &success $2 &offset-hs $2 &offset-ls $2 &name $2 &length $2 &load $2 &save $2 ] |
|
6 |
- |
|
7 |
-( vectors ) |
|
8 |
- |
|
9 | 1 |
( |
10 | 2 |
Asma - an in-Uxn assembler |
11 | 3 |
|
... | ... |
@@ -19,61 +11,6 @@ |
19 | 11 |
examples of asma's usage and can be discarded. |
20 | 12 |
) |
21 | 13 |
|
22 |
-|0100 @reset |
|
23 |
- ( |
|
24 |
- Set the log level for helping to debug stuff. |
|
25 |
- Its value is the bitwise OR of all the following output types: |
|
26 |
- #01 prints the number of lines in the source code, |
|
27 |
- #04 dumps all defined labels at end, and |
|
28 |
- #08 prints the heap usage. |
|
29 |
- ) |
|
30 |
- #09 ;asma/log-level STA |
|
31 |
- |
|
32 |
- ( |
|
33 |
- Assemble the source code into an output ROM file. |
|
34 |
- |
|
35 |
- If all you want is to use asma.tal to assemble files, insert a BRK |
|
36 |
- after this statement. |
|
37 |
- ) |
|
38 |
- ;&source-file ;&dest-file ;asma-assemble-file JSR2 |
|
39 |
- |
|
40 |
- ( |
|
41 |
- If an error has occurred, BRK here, otherwise continue. (The error |
|
42 |
- message will already have been printed to the Console in |
|
43 |
- asma-assemble-file.) |
|
44 |
- ) |
|
45 |
- ;asma/error LDA2 #0000 EQU2 JMP BRK |
|
46 |
- |
|
47 |
- ( |
|
48 |
- Load the output ROM over the currently running program, almost as if |
|
49 |
- we loaded the ROM with uxnemu directly! |
|
50 |
- |
|
51 |
- It's not a totally pristine environment, as File/load doesn't zero out |
|
52 |
- memory beyond the end of the file. So if the assembled program assumes |
|
53 |
- that all memory above it is zero, it may misbehave. |
|
54 |
- |
|
55 |
- Asma itself doesn't use the zero page, but this example code writes a |
|
56 |
- DEO2 instruction to 0x00ff. In order to execute File/load and have the |
|
57 |
- CPU continue at memory location 0x0100, we write the final DEO2 |
|
58 |
- instruction there and jump there as our final act. |
|
59 |
- |
|
60 |
- Just in case the assembled code is zero-length (which can occur when |
|
61 |
- assembling an empty source file), we write a BRK to the reset vector so |
|
62 |
- that will prevent an infinite loop. |
|
63 |
- ) |
|
64 |
- ;&dest-file .File/name DEO2 |
|
65 |
- #0000 .File/offset-ls DEO2 |
|
66 |
- #ff00 .File/length DEO2 |
|
67 |
- #0100 .File/load |
|
68 |
- LIT DEO2 #00ff STA |
|
69 |
- LIT BRK #0100 STA |
|
70 |
- #00ff JMP2 |
|
71 |
- |
|
72 |
- &source-file |
|
73 |
- "projects/examples/demos/piano.tal 00 |
|
74 |
- &dest-file |
|
75 |
- "bin/asma-boot.rom 00 |
|
76 |
- |
|
77 | 14 |
( |
78 | 15 |
Common macros for use later on. |
79 | 16 |
) |
... | ... |
@@ -919,39 +856,3 @@ include projects/library/heap.tal |
919 | 856 |
&EOR :&DUP :&EQU "EOR 00 |
920 | 857 |
&SFT $2 $2 "SFT 00 |
921 | 858 |
|
922 |
-( |
|
923 |
- Heap, a large temporary area for keeping track of labels. More complex |
|
924 |
- programs need more of this space. If there's insufficient space then the |
|
925 |
- assembly process will fail, but having extra space above what the most |
|
926 |
- complex program needs provides no benefit. |
|
927 |
- |
|
928 |
- This heap, and the buffers below, are free to be used to hold temporary |
|
929 |
- data between assembly runs, and do not need to be initialized with any |
|
930 |
- particular contents to use the assembler. |
|
931 |
-) |
|
932 |
- |
|
933 |
-@asma-heap |
|
934 |
- |
|
935 |
-|e000 &end |
|
936 |
- |
|
937 |
-( |
|
938 |
- Buffer for use with loading source code. |
|
939 |
- The minimum size is the length of the longest token plus one, which is |
|
940 |
- 0x21 to keep the same capability of the C assembler. |
|
941 |
- Larger sizes are more efficient, provided there is enough |
|
942 |
- heap space to keep track of all the labels. |
|
943 |
-) |
|
944 |
- |
|
945 |
-@asma-read-buffer |
|
946 |
- |
|
947 |
-|f800 &end |
|
948 |
- |
|
949 |
-( |
|
950 |
- Buffer for use with writing output. |
|
951 |
- The minimum size is 1, and larger sizes are more efficient. |
|
952 |
-) |
|
953 |
- |
|
954 |
-@asma-write-buffer |
|
955 |
- |
|
956 |
-|ffff &end |
|
957 |
- |