summaryrefslogtreecommitdiff
path: root/masm/gen.h
diff options
context:
space:
mode:
Diffstat (limited to 'masm/gen.h')
-rw-r--r--masm/gen.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/masm/gen.h b/masm/gen.h
new file mode 100644
index 0000000..19f575c
--- /dev/null
+++ b/masm/gen.h
@@ -0,0 +1,118 @@
+/* Copyright (c) 2024 Freya Murphy */
+
+#ifndef __GEN_H__
+#define __GEN_H__
+
+#include <mlimits.h>
+#include <mips32.h>
+#include <stdint.h>
+
+#include "parse.h"
+#include "tab.h"
+
+// predefine
+struct generator;
+
+///
+/// a section
+///
+struct section {
+ // name
+ struct string name;
+
+ // alignment
+ size_t align;
+
+ // data
+ char *data;
+ size_t len;
+ size_t size;
+
+ // permissions
+ bool read;
+ bool write;
+ bool execute;
+
+ /// reference table
+ struct reference_table reftab;
+};
+
+void section_free(struct section *section);
+
+///
+/// instruction generation state
+///
+
+struct gen_ins_state {
+ // rd,rst,rt
+ enum mips32_register rd;
+ enum mips32_register rs;
+ enum mips32_register rt;
+
+ // immd
+ uint16_t immd;
+
+ // offset(base)
+ uint16_t offset;
+ enum mips32_register base;
+
+ // target
+ uint32_t target;
+
+ // current referencd label
+ struct string *label;
+};
+
+///
+/// grammer type
+///
+
+enum grammer_type {
+ GMR_RD,
+ GMR_RS,
+ GMR_RT,
+ GMR_IMMD,
+ GMR_OFFSET,
+ GMR_OFFSET_BASE,
+ GMR_TARGET,
+ GMR_HI,
+ GMR_LO,
+};
+
+///
+/// generates assembley
+/// from a parser stream
+///
+struct generator {
+ struct parser parser;
+
+ // current instruction table
+ size_t instructions_len;
+ union mips32_instruction *instructions;
+
+ // current grammer table
+ size_t grammers_len;
+ struct mips32_grammer *grammers;
+
+ // segments
+ size_t sections_len;
+ size_t sections_size;
+ struct section *sections;
+
+ // current section
+ struct section *current;
+
+ // symbol table
+ struct symbol_table symtab;
+};
+
+/* generate the input as mips32r6 */
+int generate_mips32r6(struct generator *gen);
+
+/* initalize a generator */
+int generator_init(const char *file, struct generator *gen);
+
+/* free a generator */
+void generator_free(struct generator *gen);
+
+#endif /* __GEN_H__ */