diff options
author | Sudipto Mallick <smlckz@disroot.org> | 2024-06-20 00:19:16 +0000 |
---|---|---|
committer | Sudipto Mallick <smlckz@disroot.org> | 2024-06-20 00:19:16 +0000 |
commit | 028b1b969122d3a2a219ac935b71211a5d7027cf (patch) | |
tree | ce348aa8003ed975c02e853d29aae0e41311cccf /pp.awk | |
download | vor-main.tar.gz |
First commit main
Diffstat (limited to 'pp.awk')
-rw-r--r-- | pp.awk | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/pp.awk b/pp.awk new file mode 100644 index 0000000..3c13872 --- /dev/null +++ b/pp.awk @@ -0,0 +1,98 @@ +BEGIN { + last_word = 0 +} + +$1 == ".defword" { + define_word($2, "vor_" $2, $3, $4) + next +} + +$1 == ".defvar" { + define_word($2, "vor_get_variable_address", $3) + print("\t.balign\t4") + print("\t.4byte\t" $2 "\n") + next +} + +$1 == ".defwort" { + wortname = "vor_" $2 + define_word($2, wortname, $3, $4) + print("\t.section\t.text.vor") + print("\t.thumb_func") + print(wortname ":") + print("\tpush\t{lr}") + next +} + +$1 == ".dkw" { + define_word($2, "vor_" $2) + kurzwort_body($2, 3) + next +} + +$1 == ".dkws" { + define_word($3, "vor_" $3, $2) + kurzwort_body($3, 4) + next +} + +$1 == ".worte" { + for (i = 2; i <= NF; i++) + print("\tbl\tvor_" $i) + next +} + +$1 == ".wortende" { + print("\tpop\t{pc}") + print("\t.fnsize\t" wortname) + next +} + +$1 == ".literal" { + print("\tbl\tvor_lit") + print("\t.4byte\t" $2) + next +} + +{ print } + +END { + if (last_word) + printf("\t.set\tvor_last_word, %s\n", last_word) +} + +function kurzwort_body(name, i) { + print("\t.section\t.text.vor") + print("\t.thumb_func") + print("vor_" name ":") + print("\tpush\t{lr}") + for (; i <= NF; i++) { + if ($i ~ /^#/) { + print("\tbl\tvor_lit") + print("\t.4byte\t" substr($i, 2)) + } else { + print("\tbl\tvor_" $i) + } + } + print("\tpop\t{pc}") + print("\t.fnsize\tvor_" name "\n") +} + +function define_word(name, to_call, str, flags) { + if (!flags) flags = 0 + if (!str) { + str = "\"" name "\"" + gsub(/_/, "-", str) + } + printf("\t.rodata\n") + printf("vor_word_%s:\n", name) + printf("\t.4byte\t%s\n", last_word) + last_word = "vor_word_" name + printf("\t.4byte\t%s\n", to_call) + printf("\t.2byte\t%s\n", flags) + printf("\t.2byte\tvor_wordstrsize_%s\n", name) + printf("vor_wordstr_%s:\n", name) + printf("\t.ascii\t%s\n", str) + printf("\t.set\tvor_wordstrsize_%s, . - vor_wordstr_%s\n\n", name, name) +} + |