| ... | ... |
@@ -1,196 +1,103 @@ |
| 1 |
-local spairs |
|
| 2 |
-spairs = function(t) |
|
| 3 |
- local keys |
|
| 4 |
- do |
|
| 1 |
+local output = assert(io.open('.asma.tal', 'w'))
|
|
| 2 |
+local process_subtree |
|
| 3 |
+process_subtree = function(items) |
|
| 4 |
+ local middle = math.floor(#items / 2 + 1.25) |
|
| 5 |
+ local node = items[middle] |
|
| 6 |
+ if not node then |
|
| 7 |
+ return |
|
| 8 |
+ end |
|
| 9 |
+ node.left = process_subtree((function() |
|
| 5 | 10 |
local _accum_0 = { }
|
| 6 | 11 |
local _len_0 = 1 |
| 7 |
- for k in pairs(t) do |
|
| 8 |
- _accum_0[_len_0] = k |
|
| 9 |
- _len_0 = _len_0 + 1 |
|
| 10 |
- end |
|
| 11 |
- keys = _accum_0 |
|
| 12 |
- end |
|
| 13 |
- table.sort(keys) |
|
| 14 |
- local i = 0 |
|
| 15 |
- return function() |
|
| 16 |
- i = i + 1 |
|
| 17 |
- return keys[i], t[keys[i]] |
|
| 18 |
- end |
|
| 19 |
-end |
|
| 20 |
-local trees = {
|
|
| 21 |
- ['asma-opcodes'] = { }
|
|
| 22 |
-} |
|
| 23 |
-local opcodes_in_order = { }
|
|
| 24 |
-do |
|
| 25 |
- local wanted = false |
|
| 26 |
- for l in assert(io.lines('src/uxnasm.c')) do
|
|
| 27 |
- if l == 'static char ops[][4] = {' then
|
|
| 28 |
- wanted = true |
|
| 29 |
- elseif wanted then |
|
| 30 |
- if l == '};' then |
|
| 31 |
- break |
|
| 32 |
- end |
|
| 33 |
- for w in l:gmatch('[^%s",][^%s",][^%s",]') do
|
|
| 34 |
- if w ~= '---' then |
|
| 35 |
- trees['asma-opcodes'][w] = {
|
|
| 36 |
- ('"%s 00'):format(w),
|
|
| 37 |
- '' |
|
| 38 |
- } |
|
| 39 |
- end |
|
| 40 |
- table.insert(opcodes_in_order, w) |
|
| 12 |
+ for i, item in ipairs(items) do |
|
| 13 |
+ if i < middle then |
|
| 14 |
+ _accum_0[_len_0] = item |
|
| 15 |
+ _len_0 = _len_0 + 1 |
|
| 41 | 16 |
end |
| 42 | 17 |
end |
| 43 |
- end |
|
| 44 |
- assert(#opcodes_in_order == 32, 'didn\'t find 32 opcodes in assembler code!') |
|
| 45 |
-end |
|
| 46 |
-do |
|
| 47 |
- local representation = setmetatable({
|
|
| 48 |
- ['&'] = '26 00 ( & )' |
|
| 49 |
- }, {
|
|
| 50 |
- __index = function(self, c) |
|
| 51 |
- return ("'%s 00"):format(c)
|
|
| 52 |
- end |
|
| 53 |
- }) |
|
| 54 |
- local process |
|
| 55 |
- process = function(label, t) |
|
| 56 |
- trees[label] = { }
|
|
| 57 |
- for k, v in pairs(t) do |
|
| 58 |
- trees[label][('%02x'):format(k:byte())] = {
|
|
| 59 |
- representation[k], |
|
| 60 |
- (':%s'):format(v)
|
|
| 61 |
- } |
|
| 18 |
+ return _accum_0 |
|
| 19 |
+ end)()) |
|
| 20 |
+ node.right = process_subtree((function() |
|
| 21 |
+ local _accum_0 = { }
|
|
| 22 |
+ local _len_0 = 1 |
|
| 23 |
+ for i, item in ipairs(items) do |
|
| 24 |
+ if i > middle then |
|
| 25 |
+ _accum_0[_len_0] = item |
|
| 26 |
+ _len_0 = _len_0 + 1 |
|
| 27 |
+ end |
|
| 62 | 28 |
end |
| 63 |
- end |
|
| 64 |
- process('asma-first-char-normal', {
|
|
| 65 |
- ['%'] = 'asma-macro-define', |
|
| 66 |
- ['|'] = 'asma-pad-absolute', |
|
| 67 |
- ['$'] = 'asma-pad-relative', |
|
| 68 |
- ['@'] = 'asma-label-define', |
|
| 69 |
- ['&'] = 'asma-sublabel-define', |
|
| 70 |
- ['#'] = 'asma-literal-hex', |
|
| 71 |
- ['.'] = 'asma-literal-zero-addr', |
|
| 72 |
- [','] = 'asma-literal-rel-addr', |
|
| 73 |
- [';'] = 'asma-literal-abs-addr', |
|
| 74 |
- [':'] = 'asma-abs-addr', |
|
| 75 |
- ["'"] = 'asma-raw-char', |
|
| 76 |
- ['"'] = 'asma-raw-word', |
|
| 77 |
- ['{'] = 'asma-ignore',
|
|
| 78 |
- ['}'] = 'asma-ignore', |
|
| 79 |
- ['['] = 'asma-ignore', |
|
| 80 |
- [']'] = 'asma-ignore', |
|
| 81 |
- ['('] = 'asma-comment-start',
|
|
| 82 |
- [')'] = 'asma-comment-end', |
|
| 83 |
- ['~'] = 'asma-include' |
|
| 84 |
- }) |
|
| 85 |
- process('asma-first-char-macro', {
|
|
| 86 |
- ['('] = 'asma-comment-start',
|
|
| 87 |
- [')'] = 'asma-comment-end', |
|
| 88 |
- ['{'] = 'asma-ignore',
|
|
| 89 |
- ['}'] = 'asma-macro-end' |
|
| 90 |
- }) |
|
| 91 |
- process('asma-first-char-comment', {
|
|
| 92 |
- ['('] = 'asma-comment-more',
|
|
| 93 |
- [')'] = 'asma-comment-less' |
|
| 94 |
- }) |
|
| 29 |
+ return _accum_0 |
|
| 30 |
+ end)()) |
|
| 31 |
+ return node |
|
| 95 | 32 |
end |
| 96 |
-local traverse_node |
|
| 97 |
-traverse_node = function(t, min, max, lefts, rights) |
|
| 98 |
- local i = math.ceil((min + max) / 2) |
|
| 99 |
- if min < i then |
|
| 100 |
- lefts[t[i]] = (':&%s'):format(traverse_node(t, min, i - 1, lefts, rights))
|
|
| 101 |
- end |
|
| 102 |
- if i < max then |
|
| 103 |
- rights[t[i]] = (':&%s'):format(traverse_node(t, i + 1, max, lefts, rights))
|
|
| 104 |
- end |
|
| 105 |
- return t[i] |
|
| 106 |
-end |
|
| 107 |
-local traverse_tree |
|
| 108 |
-traverse_tree = function(t) |
|
| 109 |
- local lefts, rights = { }, { }
|
|
| 110 |
- local keys |
|
| 33 |
+local process_tree |
|
| 34 |
+process_tree = function(items) |
|
| 35 |
+ local sorted_items |
|
| 111 | 36 |
do |
| 112 | 37 |
local _accum_0 = { }
|
| 113 | 38 |
local _len_0 = 1 |
| 114 |
- for k in pairs(t) do |
|
| 115 |
- _accum_0[_len_0] = k |
|
| 39 |
+ for _index_0 = 1, #items do |
|
| 40 |
+ local item = items[_index_0] |
|
| 41 |
+ _accum_0[_len_0] = item |
|
| 116 | 42 |
_len_0 = _len_0 + 1 |
| 117 | 43 |
end |
| 118 |
- keys = _accum_0 |
|
| 44 |
+ sorted_items = _accum_0 |
|
| 119 | 45 |
end |
| 120 |
- table.sort(keys) |
|
| 121 |
- return lefts, rights, traverse_node(keys, 1, #keys, lefts, rights) |
|
| 122 |
-end |
|
| 123 |
-local ptr |
|
| 124 |
-ptr = function(s) |
|
| 125 |
- if s then |
|
| 126 |
- return (':&%s'):format(s)
|
|
| 46 |
+ table.sort(sorted_items, function(a, b) |
|
| 47 |
+ return a.order < b.order |
|
| 48 |
+ end); |
|
| 49 |
+ (process_subtree(sorted_items)).label = '&_entry' |
|
| 50 |
+ for _index_0 = 1, #items do |
|
| 51 |
+ local item = items[_index_0] |
|
| 52 |
+ output:write(('\t%-11s %-10s %-12s %s%s\n'):format(item.label, item.left and item.left.ref or ' $2', (item.right and item.right.ref or ' $2') .. item.extra, item.key, item.rest))
|
|
| 127 | 53 |
end |
| 128 |
- return ' $2' |
|
| 129 | 54 |
end |
| 130 |
-local ordered_opcodes |
|
| 131 |
-ordered_opcodes = function(t) |
|
| 132 |
- local i = 0 |
|
| 133 |
- return function() |
|
| 134 |
- i = i + 1 |
|
| 135 |
- local v = opcodes_in_order[i] |
|
| 136 |
- if t[v] then |
|
| 137 |
- return v, t[v] |
|
| 138 |
- elseif v then |
|
| 139 |
- return false, {
|
|
| 140 |
- '"--- 00', |
|
| 141 |
- '' |
|
| 142 |
- } |
|
| 55 |
+local parse_tree |
|
| 56 |
+parse_tree = function(it) |
|
| 57 |
+ local items = { }
|
|
| 58 |
+ for l in it do |
|
| 59 |
+ if l == '' then |
|
| 60 |
+ process_tree(items) |
|
| 61 |
+ output:write('\n')
|
|
| 62 |
+ return |
|
| 143 | 63 |
end |
| 144 |
- end |
|
| 145 |
-end |
|
| 146 |
-local printout = true |
|
| 147 |
-local fmt |
|
| 148 |
-fmt = function(...) |
|
| 149 |
- return (('\t%-11s %-10s %-12s %-14s %s '):format(...):gsub(' +$', '\n'))
|
|
| 150 |
-end |
|
| 151 |
-do |
|
| 152 |
- local _with_0 = assert(io.open('projects/library/asma.tal.tmp', 'w'))
|
|
| 153 |
- for l in assert(io.lines('projects/library/asma.tal')) do
|
|
| 154 |
- if l:match('--- cut here ---') then
|
|
| 155 |
- break |
|
| 64 |
+ local item = {
|
|
| 65 |
+ extra = '' |
|
| 66 |
+ } |
|
| 67 |
+ item.key, item.rest = l:match('^%s*%S+%s+%S+%s+%S+%s+(%S+)(.*)')
|
|
| 68 |
+ if item.key:match('^%&') then
|
|
| 69 |
+ item.extra = (' %s'):format(item.key)
|
|
| 70 |
+ item.key, item.rest = item.rest:match('^%s+(%S+)(.*)')
|
|
| 156 | 71 |
end |
| 157 |
- _with_0:write(l) |
|
| 158 |
- _with_0:write('\n')
|
|
| 159 |
- end |
|
| 160 |
- _with_0:write('( --- 8< ------- 8< --- cut here --- 8< ------- 8< --- )\n')
|
|
| 161 |
- _with_0:write('( automatically generated code below )\n')
|
|
| 162 |
- _with_0:write('( see etc/asma.moon for instructions )\n')
|
|
| 163 |
- _with_0:write('\n(')
|
|
| 164 |
- _with_0:write(fmt('label', 'less', 'greater', 'key', 'binary'))
|
|
| 165 |
- _with_0:write(fmt('', 'than', 'than', 'string', 'data )'))
|
|
| 166 |
- _with_0:write('\n')
|
|
| 167 |
- for name, tree in spairs(trees) do |
|
| 168 |
- _with_0:write(('@%s\n'):format(name))
|
|
| 169 |
- local lefts, rights, entry = traverse_tree(tree) |
|
| 170 |
- local sort_fn |
|
| 171 |
- if name == 'asma-opcodes' then |
|
| 172 |
- if rights[opcodes_in_order[1]] then |
|
| 173 |
- rights[opcodes_in_order[1]] = rights[opcodes_in_order[1]] .. ' &_disasm' |
|
| 174 |
- else |
|
| 175 |
- rights[opcodes_in_order[1]] = ' $2 &_disasm' |
|
| 176 |
- end |
|
| 177 |
- sort_fn = ordered_opcodes |
|
| 72 |
+ if item.key:match('^%"') then
|
|
| 73 |
+ item.order = item.key:sub(2) |
|
| 74 |
+ elseif item.key:match('^%x%x') then
|
|
| 75 |
+ item.order = string.char(tonumber(item.key, 16)) |
|
| 178 | 76 |
else |
| 179 |
- sort_fn = spairs |
|
| 77 |
+ error(('unknown key: %q'):format(item.key))
|
|
| 180 | 78 |
end |
| 181 |
- for k, v in sort_fn(tree) do |
|
| 182 |
- local label |
|
| 183 |
- if k == entry then |
|
| 184 |
- label = '&_entry' |
|
| 185 |
- elseif k then |
|
| 186 |
- label = ('&%s'):format(k)
|
|
| 187 |
- else |
|
| 188 |
- label = '' |
|
| 189 |
- end |
|
| 190 |
- _with_0:write(fmt(label, lefts[k] or ' $2', rights[k] or ' $2', unpack(v))) |
|
| 79 |
+ if item.order:match('^%a') then
|
|
| 80 |
+ item.label = ('&%s'):format(item.order)
|
|
| 81 |
+ elseif item.order:match('^.$') then
|
|
| 82 |
+ item.label = ('&%x'):format(item.order:byte())
|
|
| 83 |
+ else |
|
| 84 |
+ error(('unknown label: %q'):format(item.order))
|
|
| 191 | 85 |
end |
| 192 |
- _with_0:write('\n')
|
|
| 86 |
+ item.ref = (':%s'):format(item.label)
|
|
| 87 |
+ table.insert(items, item) |
|
| 88 |
+ end |
|
| 89 |
+end |
|
| 90 |
+local it = assert(io.lines('projects/library/asma.tal'))
|
|
| 91 |
+local waiting_for_cut = true |
|
| 92 |
+for l in it do |
|
| 93 |
+ output:write(l) |
|
| 94 |
+ output:write('\n')
|
|
| 95 |
+ if l:find('--- cut here ---', 1, true) then
|
|
| 96 |
+ waiting_for_cut = false |
|
| 97 |
+ end |
|
| 98 |
+ if not waiting_for_cut and '@' == l:sub(1, 1) then |
|
| 99 |
+ parse_tree(it) |
|
| 193 | 100 |
end |
| 194 |
- _with_0:close() |
|
| 195 | 101 |
end |
| 196 |
-return os.execute('mv projects/library/asma.tal.tmp projects/library/asma.tal')
|
|
| 102 |
+output:close() |
|
| 103 |
+return os.execute('mv .asma.tal projects/library/asma.tal')
|
| ... | ... |
@@ -1,10 +1,7 @@ |
| 1 | 1 |
-- |
| 2 | 2 |
-- Asma tree helper script |
| 3 | 3 |
-- |
| 4 |
+-- This script balances the trees at the end of projects/library/asma.tal. |
|
| 4 | 5 |
-- |
| 5 | 6 |
-- To run, you need Lua or LuaJIT, and just run etc/asma.lua from the top |
| 6 | 7 |
-- directory of Uxn's git repository: |
| ... | ... |
@@ -18,145 +15,60 @@ |
| 18 | 15 |
-- file changes. |
| 19 | 16 |
-- |
| 20 | 17 |
|
| 21 |
-spairs = (t) -> |
|
| 22 |
- keys = [ k for k in pairs t ] |
|
| 23 |
- table.sort keys |
|
| 24 |
- i = 0 |
|
| 25 |
- -> |
|
| 26 |
- i = i + 1 |
|
| 27 |
- keys[i], t[keys[i]] |
|
| 18 |
+output = assert io.open '.asma.tal', 'w' |
|
| 28 | 19 |
|
| 29 |
-trees = {
|
|
| 30 |
- ['asma-opcodes']: {}
|
|
| 31 |
-} |
|
| 20 |
+process_subtree = (items) -> |
|
| 21 |
+ middle = math.floor #items / 2 + 1.25 |
|
| 22 |
+ node = items[middle] |
|
| 23 |
+ if not node |
|
| 24 |
+ return |
|
| 25 |
+ node.left = process_subtree [ item for i, item in ipairs items when i < middle ] |
|
| 26 |
+ node.right = process_subtree [ item for i, item in ipairs items when i > middle ] |
|
| 27 |
+ node |
|
| 32 | 28 |
|
| 33 |
-opcodes_in_order = {}
|
|
| 29 |
+process_tree = (items) -> |
|
| 30 |
+ sorted_items = [ item for item in *items ] |
|
| 31 |
+ table.sort sorted_items, (a, b) -> a.order < b.order |
|
| 32 |
+ (process_subtree sorted_items).label = '&_entry' |
|
| 33 |
+ for item in *items |
|
| 34 |
+ output\write '\t%-11s %-10s %-12s %s%s\n'\format item.label, item.left and item.left.ref or ' $2', (item.right and item.right.ref or ' $2') .. item.extra, item.key, item.rest |
|
| 34 | 35 |
|
| 35 |
-do -- opcodes |
|
| 36 |
- wanted = false |
|
| 37 |
- for l in assert io.lines 'src/uxnasm.c' |
|
| 38 |
- if l == 'static char ops[][4] = {'
|
|
| 39 |
- wanted = true |
|
| 40 |
- elseif wanted |
|
| 41 |
- if l == '};' |
|
| 42 |
- break |
|
| 43 |
- for w in l\gmatch '[^%s",][^%s",][^%s",]' |
|
| 44 |
- if w != '---' |
|
| 45 |
- trees['asma-opcodes'][w] = {
|
|
| 46 |
- '"%s 00'\format w |
|
| 47 |
- '' |
|
| 48 |
- } |
|
| 49 |
- table.insert opcodes_in_order, w |
|
| 50 |
- assert #opcodes_in_order == 32, 'didn\'t find 32 opcodes in assembler code!' |
|
| 36 |
+parse_tree = (it) -> |
|
| 37 |
+ items = {}
|
|
| 38 |
+ for l in it |
|
| 39 |
+ if l == '' |
|
| 40 |
+ process_tree items |
|
| 41 |
+ output\write '\n' |
|
| 42 |
+ return |
|
| 43 |
+ item = { extra: '' }
|
|
| 44 |
+ item.key, item.rest = l\match '^%s*%S+%s+%S+%s+%S+%s+(%S+)(.*)' |
|
| 45 |
+ if item.key\match '^%&' |
|
| 46 |
+ item.extra = ' %s'\format item.key |
|
| 47 |
+ item.key, item.rest = item.rest\match '^%s+(%S+)(.*)' |
|
| 48 |
+ if item.key\match '^%"' |
|
| 49 |
+ item.order = item.key\sub 2 |
|
| 50 |
+ elseif item.key\match '^%x%x' |
|
| 51 |
+ item.order = string.char tonumber item.key, 16 |
|
| 52 |
+ else |
|
| 53 |
+ error 'unknown key: %q'\format item.key |
|
| 54 |
+ if item.order\match '^%a' |
|
| 55 |
+ item.label = '&%s'\format item.order |
|
| 56 |
+ elseif item.order\match '^.$' |
|
| 57 |
+ item.label = '&%x'\format item.order\byte! |
|
| 58 |
+ else |
|
| 59 |
+ error 'unknown label: %q'\format item.order |
|
| 60 |
+ item.ref = ':%s'\format item.label |
|
| 61 |
+ table.insert items, item |
|
| 51 | 62 |
|
| 52 |
-do -- first characters |
|
| 53 |
- representation = setmetatable {
|
|
| 54 |
- '&': '26 00 ( & )' |
|
| 55 |
- }, |
|
| 56 |
- __index: (c) => "'%s 00"\format c |
|
| 57 |
- process = (label, t) -> |
|
| 58 |
- trees[label] = {}
|
|
| 59 |
- for k, v in pairs t |
|
| 60 |
- trees[label]['%02x'\format k\byte!] = {
|
|
| 61 |
- representation[k] |
|
| 62 |
- ':%s'\format v |
|
| 63 |
- } |
|
| 64 |
- process 'asma-first-char-normal', |
|
| 65 |
- '%': 'asma-macro-define' |
|
| 66 |
- '|': 'asma-pad-absolute' |
|
| 67 |
- '$': 'asma-pad-relative' |
|
| 68 |
- '@': 'asma-label-define' |
|
| 69 |
- '&': 'asma-sublabel-define' |
|
| 70 |
- '#': 'asma-literal-hex' |
|
| 71 |
- '.': 'asma-literal-zero-addr' |
|
| 72 |
- ',': 'asma-literal-rel-addr' |
|
| 73 |
- ';': 'asma-literal-abs-addr' |
|
| 74 |
- ':': 'asma-abs-addr' |
|
| 75 |
- "'": 'asma-raw-char' |
|
| 76 |
- '"': 'asma-raw-word' |
|
| 77 |
- '{': 'asma-ignore'
|
|
| 78 |
- '}': 'asma-ignore' |
|
| 79 |
- '[': 'asma-ignore' |
|
| 80 |
- ']': 'asma-ignore' |
|
| 81 |
- '(': 'asma-comment-start'
|
|
| 82 |
- ')': 'asma-comment-end' |
|
| 83 |
- '~': 'asma-include' |
|
| 84 |
- process 'asma-first-char-macro', |
|
| 85 |
- '(': 'asma-comment-start'
|
|
| 86 |
- ')': 'asma-comment-end' |
|
| 87 |
- '{': 'asma-ignore'
|
|
| 88 |
- '}': 'asma-macro-end' |
|
| 89 |
- process 'asma-first-char-comment', |
|
| 90 |
- '(': 'asma-comment-more'
|
|
| 91 |
- ')': 'asma-comment-less' |
|
| 92 |
- |
|
| 93 |
-traverse_node = (t, min, max, lefts, rights) -> |
|
| 94 |
- i = math.ceil (min + max) / 2 |
|
| 95 |
- if min < i |
|
| 96 |
- lefts[t[i]] = ':&%s'\format traverse_node t, min, i - 1, lefts, rights |
|
| 97 |
- if i < max |
|
| 98 |
- rights[t[i]] = ':&%s'\format traverse_node t, i + 1, max, lefts, rights |
|
| 99 |
- return t[i] |
|
| 100 |
- |
|
| 101 |
-traverse_tree = (t) -> |
|
| 102 |
- lefts, rights = {}, {}
|
|
| 103 |
- keys = [ k for k in pairs t ] |
|
| 104 |
- table.sort keys |
|
| 105 |
- lefts, rights, traverse_node keys, 1, #keys, lefts, rights |
|
| 106 |
- |
|
| 107 |
-ptr = (s) -> |
|
| 108 |
- if s |
|
| 109 |
- return ':&%s'\format s |
|
| 110 |
- return ' $2' |
|
| 111 |
- |
|
| 112 |
-ordered_opcodes = (t) -> |
|
| 113 |
- i = 0 |
|
| 114 |
- -> |
|
| 115 |
- i = i + 1 |
|
| 116 |
- v = opcodes_in_order[i] |
|
| 117 |
- if t[v] |
|
| 118 |
- return v, t[v] |
|
| 119 |
- elseif v |
|
| 120 |
- return false, { '"--- 00', '' }
|
|
| 121 |
- |
|
| 122 |
-printout = true |
|
| 123 |
- |
|
| 124 |
-fmt = (...) -> |
|
| 125 |
- ('\t%-11s %-10s %-12s %-14s %s '\format(...)\gsub ' +$', '\n')
|
|
| 126 |
- |
|
| 127 |
-with assert io.open 'projects/library/asma.tal.tmp', 'w' |
|
| 128 |
- for l in assert io.lines 'projects/library/asma.tal' |
|
| 129 |
- if l\match '--- cut here ---' |
|
| 130 |
- break |
|
| 131 |
- \write l |
|
| 132 |
- \write '\n' |
|
| 133 |
- \write '( --- 8< ------- 8< --- cut here --- 8< ------- 8< --- )\n' |
|
| 134 |
- \write '( automatically generated code below )\n' |
|
| 135 |
- \write '( see etc/asma.moon for instructions )\n' |
|
| 136 |
- \write '\n('
|
|
| 137 |
- \write fmt 'label', 'less', 'greater', 'key', 'binary' |
|
| 138 |
- \write fmt '', 'than', 'than', 'string', 'data )' |
|
| 139 |
- \write '\n' |
|
| 140 |
- for name, tree in spairs trees |
|
| 141 |
- \write '@%s\n'\format name |
|
| 142 |
- lefts, rights, entry = traverse_tree tree |
|
| 143 |
- sort_fn = if name == 'asma-opcodes' |
|
| 144 |
- if rights[opcodes_in_order[1]] |
|
| 145 |
- rights[opcodes_in_order[1]] ..= ' &_disasm' |
|
| 146 |
- else |
|
| 147 |
- rights[opcodes_in_order[1]] = ' $2 &_disasm' |
|
| 148 |
- ordered_opcodes |
|
| 149 |
- else |
|
| 150 |
- spairs |
|
| 151 |
- for k, v in sort_fn tree |
|
| 152 |
- label = if k == entry |
|
| 153 |
- '&_entry' |
|
| 154 |
- elseif k |
|
| 155 |
- '&%s'\format k |
|
| 156 |
- else |
|
| 157 |
- '' |
|
| 158 |
- \write fmt label, lefts[k] or ' $2', rights[k] or ' $2', unpack v |
|
| 159 |
- \write '\n' |
|
| 160 |
- \close! |
|
| 161 |
-os.execute 'mv projects/library/asma.tal.tmp projects/library/asma.tal' |
|
| 63 |
+it = assert io.lines 'projects/library/asma.tal' |
|
| 64 |
+waiting_for_cut = true |
|
| 65 |
+for l in it |
|
| 66 |
+ output\write l |
|
| 67 |
+ output\write '\n' |
|
| 68 |
+ if l\find '--- cut here ---', 1, true |
|
| 69 |
+ waiting_for_cut = false |
|
| 70 |
+ if not waiting_for_cut and '@' == l\sub 1, 1 |
|
| 71 |
+ parse_tree it |
|
| 72 |
+output\close! |
|
| 73 |
+os.execute 'mv .asma.tal projects/library/asma.tal' |
|
| 162 | 74 |
|
| ... | ... |
@@ -908,17 +908,17 @@ |
| 908 | 908 |
&23 :&22 $2 "# 00 :asma-literal-hex |
| 909 | 909 |
&24 :&23 :&25 "$ 00 :asma-pad-relative |
| 910 | 910 |
&25 $2 $2 "% 00 :asma-macro-define |
| 911 |
- &26 :&24 :&29 26 00 ( & ) :asma-sublabel-define |
|
| 911 |
+ &26 :&24 :&2c 26 00 ( & ) :asma-sublabel-define |
|
| 912 | 912 |
&28 $2 $2 "( 00 :asma-comment-start |
| 913 |
- &29 :&28 :&2c ") 00 :asma-comment-end |
|
| 914 |
- &2c $2 :&2d ", 00 :asma-literal-rel-addr |
|
| 913 |
+ &29 :&28 $2 ") 00 :asma-comment-end |
|
| 914 |
+ &2c :&29 :&2d ", 00 :asma-literal-rel-addr |
|
| 915 | 915 |
&2d $2 $2 "- 00 :asma-zero-addr |
| 916 | 916 |
&_entry :&26 :&7b ". 00 :asma-literal-zero-addr |
| 917 | 917 |
&3a $2 $2 ": 00 :asma-abs-addr |
| 918 |
- &3b :&3a :&3d "; 00 :asma-literal-abs-addr |
|
| 919 |
- &3d $2 :&40 "= 00 :asma-abs-addr |
|
| 918 |
+ &3b :&3a $2 "; 00 :asma-literal-abs-addr |
|
| 919 |
+ &3d :&3b :&40 "= 00 :asma-abs-addr |
|
| 920 | 920 |
&40 $2 $2 "@ 00 :asma-label-define |
| 921 |
- &7b :&3b :&7d "{ 00 :asma-ignore
|
|
| 921 |
+ &7b :&3d :&7d "{ 00 :asma-ignore
|
|
| 922 | 922 |
&7c $2 $2 "| 00 :asma-pad-absolute |
| 923 | 923 |
&7d :&7c :&7e "} 00 :asma-ignore |
| 924 | 924 |
&7e $2 $2 "~ 00 :asma-include |