summary refs log tree commit diff stats
path: root/pp.awk
diff options
context:
space:
mode:
Diffstat (limited to 'pp.awk')
-rw-r--r--pp.awk98
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)
+}
+