#include #include #include "mnemonics.h" #include "nqasm.h" #include "lexer.h" #include "parser.h" #include "vector.h" struct label { const char *name; uint16_t addr; }; uint16_t addr; #define DEFINE_VECTOR(name, arraytype, arrayname, initsize) \ static struct name { \ struct vector v; \ arraytype arrayname[]; \ } *name; \ \ static int name ## _init(void) \ { \ return !(name = vector_init(initsize, sizeof (arraytype), sizeof *name)); \ } \ \ static arraytype *name ## _append(void) \ { \ struct vector *v = &name->v; \ arraytype *e = vector_append(&v); \ name = (struct name *)v; \ return e; \ } DEFINE_VECTOR(labels, struct label, l, 8) DEFINE_VECTOR(instrs, struct instruction, i, 256) void add_instruction(const struct instruction *inst) { struct instruction *i = instrs_append(); if (!i) { fprintf(stderr, "unable to allocate instruction\n"); exit(1); } *i = *inst; addr += 2; } static void assemble_instruction(const struct instruction *inst) { const struct mnemonic *mnem = &mnemonics[inst->mnem]; uint16_t bits = mnem->bits; const struct operand *ops = mnem->operands; const struct argument *args = inst->args.args; for (int i = 0; i < 3 && ops[i].type; i++) { bits |= args[i].value << ops[i].shift; } printf("%04x\n", bits); } void add_label(const char *name) { struct label *l = labels_append(); if (!l) { fprintf(stderr, "unable to allocate label\n"); exit(1); } *l = (struct label) { .name = name, .addr = addr }; } int main(int argc, char **argv) { labels_init(); instrs_init(); yyparse(); for (size_t i = 0; i < instrs->v.count; i++) { assemble_instruction(instrs->i + i); } return 0; }