| ... | ... |
@@ -200,7 +200,8 @@ do |
| 200 | 200 |
_with_0:write('( automatically generated code below )\n')
|
| 201 | 201 |
_with_0:write('( see etc/asma.moon for instructions )\n')
|
| 202 | 202 |
_with_0:write('\n(')
|
| 203 |
- _with_0:write(fmt('label', 'less than', 'greater than', 'key', 'data )'))
|
|
| 203 |
+ _with_0:write(fmt('label', 'less', 'greater', 'key', 'binary'))
|
|
| 204 |
+ _with_0:write(fmt('', 'than', 'than', 'string', 'data )'))
|
|
| 204 | 205 |
_with_0:write('\n')
|
| 205 | 206 |
for name, tree in spairs(trees) do |
| 206 | 207 |
_with_0:write(('@%s\n'):format(name))
|
| ... | ... |
@@ -229,7 +230,43 @@ do |
| 229 | 230 |
end |
| 230 | 231 |
_with_0:write('\n')
|
| 231 | 232 |
end |
| 232 |
- _with_0:write('@asma-heap\n\n')
|
|
| 233 |
+ _with_0:write([[( |
|
| 234 |
+ Heap, a large temporary area for keeping track of labels. More complex |
|
| 235 |
+ programs need more of this space. If there's insufficient space then the |
|
| 236 |
+ assembly process will fail, but having extra space above what the most |
|
| 237 |
+ complex program needs provides no benefit. |
|
| 238 |
+ |
|
| 239 |
+ This heap, and the buffers below, are free to be used to hold temporary |
|
| 240 |
+ data between assembly runs, and do not need to be initialized with any |
|
| 241 |
+ particular contents to use the assembler. |
|
| 242 |
+) |
|
| 243 |
+ |
|
| 244 |
+@asma-heap |
|
| 245 |
+ |
|
| 246 |
+|ff00 &end |
|
| 247 |
+ |
|
| 248 |
+( |
|
| 249 |
+ Buffer for use with loading source code. |
|
| 250 |
+ The minimum size is the length of the longest token plus one, which is |
|
| 251 |
+ 0x21 to keep the same capability of the C assembler. |
|
| 252 |
+ Larger sizes are more efficient, provided there is enough |
|
| 253 |
+ heap space to keep track of all the labels. |
|
| 254 |
+) |
|
| 255 |
+ |
|
| 256 |
+@asma-read-buffer |
|
| 257 |
+ |
|
| 258 |
+|ff80 &end |
|
| 259 |
+ |
|
| 260 |
+( |
|
| 261 |
+ Buffer for use with writing output. |
|
| 262 |
+ The minimum size is 1, and larger sizes are more efficient. |
|
| 263 |
+) |
|
| 264 |
+ |
|
| 265 |
+@asma-write-buffer |
|
| 266 |
+ |
|
| 267 |
+|ffff &end |
|
| 268 |
+ |
|
| 269 |
+]]) |
|
| 233 | 270 |
_with_0:close() |
| 234 | 271 |
end |
| 235 | 272 |
return os.execute('mv projects/software/asma.usm.tmp projects/software/asma.usm')
|
| ... | ... |
@@ -141,7 +141,8 @@ with assert io.open 'projects/software/asma.usm.tmp', 'w' |
| 141 | 141 |
\write '( automatically generated code below )\n' |
| 142 | 142 |
\write '( see etc/asma.moon for instructions )\n' |
| 143 | 143 |
\write '\n('
|
| 144 |
- \write fmt 'label', 'less than', 'greater than', 'key', 'data )' |
|
| 144 |
+ \write fmt 'label', 'less', 'greater', 'key', 'binary' |
|
| 145 |
+ \write fmt '', 'than', 'than', 'string', 'data )' |
|
| 145 | 146 |
\write '\n' |
| 146 | 147 |
for name, tree in spairs trees |
| 147 | 148 |
\write '@%s\n'\format name |
| ... | ... |
@@ -163,7 +164,43 @@ with assert io.open 'projects/software/asma.usm.tmp', 'w' |
| 163 | 164 |
'' |
| 164 | 165 |
\write fmt label, lefts[k] or ' $2', rights[k] or ' $2', unpack v |
| 165 | 166 |
\write '\n' |
| 166 |
- \write '@asma-heap\n\n' |
|
| 167 |
+ \write [[( |
|
| 168 |
+ Heap, a large temporary area for keeping track of labels. More complex |
|
| 169 |
+ programs need more of this space. If there's insufficient space then the |
|
| 170 |
+ assembly process will fail, but having extra space above what the most |
|
| 171 |
+ complex program needs provides no benefit. |
|
| 172 |
+ |
|
| 173 |
+ This heap, and the buffers below, are free to be used to hold temporary |
|
| 174 |
+ data between assembly runs, and do not need to be initialized with any |
|
| 175 |
+ particular contents to use the assembler. |
|
| 176 |
+) |
|
| 177 |
+ |
|
| 178 |
+@asma-heap |
|
| 179 |
+ |
|
| 180 |
+|ff00 &end |
|
| 181 |
+ |
|
| 182 |
+( |
|
| 183 |
+ Buffer for use with loading source code. |
|
| 184 |
+ The minimum size is the length of the longest token plus one, which is |
|
| 185 |
+ 0x21 to keep the same capability of the C assembler. |
|
| 186 |
+ Larger sizes are more efficient, provided there is enough |
|
| 187 |
+ heap space to keep track of all the labels. |
|
| 188 |
+) |
|
| 189 |
+ |
|
| 190 |
+@asma-read-buffer |
|
| 191 |
+ |
|
| 192 |
+|ff80 &end |
|
| 193 |
+ |
|
| 194 |
+( |
|
| 195 |
+ Buffer for use with writing output. |
|
| 196 |
+ The minimum size is 1, and larger sizes are more efficient. |
|
| 197 |
+) |
|
| 198 |
+ |
|
| 199 |
+@asma-write-buffer |
|
| 200 |
+ |
|
| 201 |
+|ffff &end |
|
| 202 |
+ |
|
| 203 |
+]] |
|
| 167 | 204 |
\close! |
| 168 | 205 |
os.execute 'mv projects/software/asma.usm.tmp projects/software/asma.usm' |
| 169 | 206 |
|
| ... | ... |
@@ -8,6 +8,16 @@ |
| 8 | 8 |
|0100 |
| 9 | 9 |
;reset JMP2 |
| 10 | 10 |
|
| 11 |
+( |
|
| 12 |
+ Asma's public interface. |
|
| 13 |
+ These routines are what are expected to be called from programs that bundle |
|
| 14 |
+ Asma into bigger projects. |
|
| 15 |
+) |
|
| 16 |
+ |
|
| 17 |
+( |
|
| 18 |
+ Common macros for use later on. |
|
| 19 |
+) |
|
| 20 |
+ |
|
| 11 | 21 |
%asma-IF-ERROR { ;asma/error LDA2 ORA }
|
| 12 | 22 |
%asma-LOG { #01 }
|
| 13 | 23 |
( |
| ... | ... |
@@ -19,6 +29,14 @@ |
| 19 | 29 |
%asma-DEO2 { asma-LOG NEQ JMP DEO2k POP POP2 }
|
| 20 | 30 |
%asma-DEO { asma-LOG NEQ JMP DEOk POP2 }
|
| 21 | 31 |
|
| 32 |
+( |
|
| 33 |
+ Debugging routines. These all output extra information to the Console. |
|
| 34 |
+ These can be stripped out to save space, once the references to them are |
|
| 35 |
+ removed. Look for the word DEBUG later on to find these references: the |
|
| 36 |
+ lines that contain that word can be deleted to strip out the functionality |
|
| 37 |
+ cleanly. |
|
| 38 |
+) |
|
| 39 |
+ |
|
| 22 | 40 |
@asma-dump-sublabels ( incoming-ptr* -- ) |
| 23 | 41 |
LDA2 |
| 24 | 42 |
ORAk ,&valid-incoming-ptr JCN |
| ... | ... |
@@ -82,11 +100,10 @@ |
| 82 | 100 |
;asma-trees/labels ;asma-dump-labels JSR2 |
| 83 | 101 |
;asma/line LDA2 .Console/short #04 asma-DEO2 |
| 84 | 102 |
;&lines .Console/string #04 asma-DEO2 |
| 85 |
- #0000 DIV |
|
| 86 | 103 |
BRK |
| 87 | 104 |
|
| 88 | 105 |
&filename |
| 89 |
- ( "test.usm 00 ) |
|
| 106 |
+ "test.usm 00 |
|
| 90 | 107 |
"projects/examples/gui/label.usm 00 |
| 91 | 108 |
|
| 92 | 109 |
&lines [ 20 "lines 20 "in 20 "total. 0a 00 ] |
| ... | ... |
@@ -175,9 +192,21 @@ |
| 175 | 192 |
POP POP2 POP2 |
| 176 | 193 |
JMP2r |
| 177 | 194 |
|
| 178 |
-@asma [ &pass $1 &state $1 &line $2 &token $2 &orig-token $2 &heap $2 &addr $2 &written-addr $2 &scope-addr $2 &error $2 ] |
|
| 195 |
+@asma [ &pass $1 &state $1 &line $2 &token $2 &orig-token $2 &heap $2 &addr $2 &written-addr $2 &flush-fn $2 &scope-addr $2 &error $2 ] |
|
| 179 | 196 |
@asma-trees [ &labels $2 ¯os $2 &opcodes $2 &scope $2 ] |
| 180 | 197 |
|
| 198 |
+( |
|
| 199 |
+ The main routine to assemble a single token. |
|
| 200 |
+ asma/state contains several meaningful bits: |
|
| 201 |
+ 0x02 we are in a comment, |
|
| 202 |
+ 0x04 we are in a macro body, and |
|
| 203 |
+ 0x08 we are in a macro body that we are ignoring |
|
| 204 |
+ (because the macro was already defined in a previous pass). |
|
| 205 |
+ Since 0x08 never appears without 0x04, the lowest bit set in asma/state is |
|
| 206 |
+ always 0x00, 0x02, or 0x04, which is very handy for use with jump tables. |
|
| 207 |
+ The lowest bit set can be found easily by #00 (n) SUBk AND. |
|
| 208 |
+) |
|
| 209 |
+ |
|
| 181 | 210 |
@asma-assemble-token ( string-ptr* -- ) |
| 182 | 211 |
DUP2 .Console/string #02 asma-DEO2 |
| 183 | 212 |
#0a .Console/char #02 asma-DEO |
| ... | ... |
@@ -195,8 +224,6 @@ |
| 195 | 224 |
LITr 00 STH2 ( / end* char end* 00 end* ) |
| 196 | 225 |
STAr ( / end* char end* ) |
| 197 | 226 |
|
| 198 |
- ( find lowest set bit of assembler/state |
|
| 199 |
- in C, this would be i & -i ) |
|
| 200 | 227 |
#00 ;asma/state LDA SUBk AND ( tree-offset* / end* ) |
| 201 | 228 |
DUP2 ;&first-char-trees ADD2 ( tree-offset* incoming-ptr* / end* ) |
| 202 | 229 |
;asma-traverse-tree JSR2 |
| ... | ... |
@@ -213,7 +240,7 @@ |
| 213 | 240 |
|
| 214 | 241 |
¬-found ( tree-offset* dummy* / end* ) |
| 215 | 242 |
POP2 POP2r |
| 216 |
- ;&first-char-dispatch ADD2 LDA2 |
|
| 243 |
+ ;&body-routines ADD2 LDA2 |
|
| 217 | 244 |
JMP2 ( tail call ) |
| 218 | 245 |
|
| 219 | 246 |
&first-char-trees |
| ... | ... |
@@ -221,7 +248,7 @@ |
| 221 | 248 |
:asma-first-char-comment/_entry |
| 222 | 249 |
:asma-first-char-macro/_entry |
| 223 | 250 |
|
| 224 |
- &first-char-dispatch |
|
| 251 |
+ &body-routines |
|
| 225 | 252 |
:asma-normal-body |
| 226 | 253 |
:asma-ignore |
| 227 | 254 |
:asma-macro-body |
| ... | ... |
@@ -421,7 +448,12 @@ |
| 421 | 448 |
POP2r ROT ROT POP2 |
| 422 | 449 |
JMP2r |
| 423 | 450 |
|
| 424 |
-( actions based on first character ) |
|
| 451 |
+( |
|
| 452 |
+ First character routines. |
|
| 453 |
+ The following routines (that don't have a FORTH-like signature) are called |
|
| 454 |
+ to deal with tokens that begin with particular first letters, or (for |
|
| 455 |
+ -body routines) tokens that fail to match any first letter in their tree. |
|
| 456 |
+) |
|
| 425 | 457 |
|
| 426 | 458 |
%asma-STATE-SET { ;asma/state LDA ORA ;asma/state STA }
|
| 427 | 459 |
%asma-STATE-CLEAR { #ff EOR ;asma/state LDA AND ;asma/state STA }
|
| ... | ... |
@@ -457,7 +489,9 @@ |
| 457 | 489 |
JMP2r |
| 458 | 490 |
|
| 459 | 491 |
@asma-macro-body |
| 492 |
+ ;asma/state LDA #08 AND ,&skip JCN |
|
| 460 | 493 |
;asma/token LDA2 ;asma-append-heap-string JSR2 |
| 494 |
+ &skip |
|
| 461 | 495 |
JMP2r |
| 462 | 496 |
|
| 463 | 497 |
@asma-macro-end |
| ... | ... |
@@ -673,7 +707,7 @@ |
| 673 | 707 |
;asma-msg-label ;asma/error STA2 |
| 674 | 708 |
JMP2r |
| 675 | 709 |
|
| 676 |
-( messages ) |
|
| 710 |
+( Error messages ) |
|
| 677 | 711 |
|
| 678 | 712 |
@asma-msg-hex "Invalid 20 "hexadecimal 00 |
| 679 | 713 |
@asma-msg-zero-page "Address 20 "not 20 "in 20 "zero 20 "page 00 |
| ... | ... |
@@ -688,7 +722,8 @@ |
| 688 | 722 |
( automatically generated code below ) |
| 689 | 723 |
( see etc/asma.moon for instructions ) |
| 690 | 724 |
|
| 691 |
-( label less than greater than key data ) |
|
| 725 |
+( label less greater key binary |
|
| 726 |
+ than than string data ) |
|
| 692 | 727 |
|
| 693 | 728 |
@asma-first-char-comment |
| 694 | 729 |
&_entry $2 $2 ') 00 :asma-comment-end |
| ... | ... |
@@ -838,5 +873,39 @@ |
| 838 | 873 |
&EOR $2 $2 "EOR 00 |
| 839 | 874 |
&SFT $2 $2 "SFT 00 |
| 840 | 875 |
|
| 876 |
+( |
|
| 877 |
+ Heap, a large temporary area for keeping track of labels. More complex |
|
| 878 |
+ programs need more of this space. If there's insufficient space then the |
|
| 879 |
+ assembly process will fail, but having extra space above what the most |
|
| 880 |
+ complex program needs provides no benefit. |
|
| 881 |
+ |
|
| 882 |
+ This heap, and the buffers below, are free to be used to hold temporary |
|
| 883 |
+ data between assembly runs, and do not need to be initialized with any |
|
| 884 |
+ particular contents to use the assembler. |
|
| 885 |
+) |
|
| 886 |
+ |
|
| 841 | 887 |
@asma-heap |
| 842 | 888 |
|
| 889 |
+|ff00 &end |
|
| 890 |
+ |
|
| 891 |
+( |
|
| 892 |
+ Buffer for use with loading source code. |
|
| 893 |
+ The minimum size is the length of the longest token plus one, which is |
|
| 894 |
+ 0x21 to keep the same capability of the C assembler. |
|
| 895 |
+ Larger sizes are more efficient, provided there is enough |
|
| 896 |
+ heap space to keep track of all the labels. |
|
| 897 |
+) |
|
| 898 |
+ |
|
| 899 |
+@asma-read-buffer |
|
| 900 |
+ |
|
| 901 |
+|ff80 &end |
|
| 902 |
+ |
|
| 903 |
+( |
|
| 904 |
+ Buffer for use with writing output. |
|
| 905 |
+ The minimum size is 1, and larger sizes are more efficient. |
|
| 906 |
+) |
|
| 907 |
+ |
|
| 908 |
+@asma-write-buffer |
|
| 909 |
+ |
|
| 910 |
+|ffff &end |
|
| 911 |
+ |