diff --git a/src/tools/aindump/macros.c b/src/tools/aindump/macros.c index 8be9a44..7af2ce9 100644 --- a/src/tools/aindump/macros.c +++ b/src/tools/aindump/macros.c @@ -123,11 +123,12 @@ static bool global_check(struct dasm_state *dasm, int32_t *args) { return is_global(dasm, args[0]); } -#define GLOBALREF_check global_check -#define GLOBALREFREF_check global_check -#define GLOBALINC_check global_check -#define GLOBALDEC_check global_check -#define GLOBALASSIGN_check global_check +#define GLOBALREF_check global_check +#define GLOBALREFREF_check global_check +#define GLOBALINC_check global_check +#define GLOBALDEC_check global_check +#define GLOBALASSIGN_check global_check +#define F_GLOBALASSIGN_check global_check static void global_emit(struct dasm_state *dasm, int32_t *args) { @@ -144,6 +145,13 @@ static void GLOBALASSIGN_emit(struct dasm_state *dasm, int32_t *args) fprintf(dasm->out, " %d", args[1]); } +static void F_GLOBALASSIGN_emit(struct dasm_state *dasm, int32_t *args) +{ + union { int32_t i; float f; } v = { .i = args[1] }; + dasm_print_identifier(dasm, dasm->ain->globals[args[0]].name); + fprintf(dasm->out, " %f", v.f); +} + static bool struct_check(struct dasm_state *dasm, int32_t *args) { return is_member(dasm, args[0]); @@ -205,27 +213,28 @@ struct macrodef { }; struct macrodef macrodefs[] = { - DEFMACRO(LOCALREF, PUSHLOCALPAGE, PUSH, REF), - DEFMACRO(LOCALREFREF, PUSHLOCALPAGE, PUSH, REFREF), - DEFMACRO(LOCALINC, PUSHLOCALPAGE, PUSH, INC), - DEFMACRO(LOCALDEC, PUSHLOCALPAGE, PUSH, DEC), - DEFMACRO(LOCALASSIGN, PUSHLOCALPAGE, PUSH, PUSH, ASSIGN, POP), - DEFMACRO(LOCALASSIGN2, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN), - DEFMACRO(F_LOCALASSIGN, PUSHLOCALPAGE, PUSH, F_PUSH, F_ASSIGN, POP), - DEFMACRO(S_LOCALASSIGN, PUSHLOCALPAGE, PUSH, REF, DELETE, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN), - DEFMACRO(LOCALCREATE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, DUP2, NEW, ASSIGN, POP, POP, POP), - DEFMACRO(LOCALDELETE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, PUSH, ASSIGN, POP), - DEFMACRO(GLOBALREF, PUSHGLOBALPAGE, PUSH, REF), - DEFMACRO(GLOBALREFREF, PUSHGLOBALPAGE, PUSH, REFREF), - DEFMACRO(GLOBALINC, PUSHGLOBALPAGE, PUSH, INC), - DEFMACRO(GLOBALDEC, PUSHGLOBALPAGE, PUSH, DEC), - DEFMACRO(GLOBALASSIGN, PUSHGLOBALPAGE, PUSH, PUSH, ASSIGN, POP), - DEFMACRO(STRUCTREF, PUSHSTRUCTPAGE, PUSH, REF), - DEFMACRO(STRUCTREFREF, PUSHSTRUCTPAGE, PUSH, REFREF), - DEFMACRO(STRUCTINC, PUSHSTRUCTPAGE, PUSH, INC), - DEFMACRO(STRUCTDEC, PUSHSTRUCTPAGE, PUSH, DEC), - DEFMACRO(STRUCTASSIGN, PUSHSTRUCTPAGE, PUSH, PUSH, ASSIGN, POP), - DEFMACRO(PUSHVMETHOD, PUSHSTRUCTPAGE, PUSH, DUP_U2, PUSH, REF, SWAP, PUSH, ADD, REF), + DEFMACRO(LOCALREF, PUSHLOCALPAGE, PUSH, REF), + DEFMACRO(LOCALREFREF, PUSHLOCALPAGE, PUSH, REFREF), + DEFMACRO(LOCALINC, PUSHLOCALPAGE, PUSH, INC), + DEFMACRO(LOCALDEC, PUSHLOCALPAGE, PUSH, DEC), + DEFMACRO(LOCALASSIGN, PUSHLOCALPAGE, PUSH, PUSH, ASSIGN, POP), + DEFMACRO(LOCALASSIGN2, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN), + DEFMACRO(F_LOCALASSIGN, PUSHLOCALPAGE, PUSH, F_PUSH, F_ASSIGN, POP), + DEFMACRO(S_LOCALASSIGN, PUSHLOCALPAGE, PUSH, REF, DELETE, PUSHLOCALPAGE, SWAP, PUSH, SWAP, ASSIGN), + DEFMACRO(LOCALCREATE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, DUP2, NEW, ASSIGN, POP, POP, POP), + DEFMACRO(LOCALDELETE, PUSHLOCALPAGE, PUSH, DUP2, REF, DELETE, PUSH, ASSIGN, POP), + DEFMACRO(GLOBALREF, PUSHGLOBALPAGE, PUSH, REF), + DEFMACRO(GLOBALREFREF, PUSHGLOBALPAGE, PUSH, REFREF), + DEFMACRO(GLOBALINC, PUSHGLOBALPAGE, PUSH, INC), + DEFMACRO(GLOBALDEC, PUSHGLOBALPAGE, PUSH, DEC), + DEFMACRO(GLOBALASSIGN, PUSHGLOBALPAGE, PUSH, PUSH, ASSIGN, POP), + DEFMACRO(F_GLOBALASSIGN, PUSHGLOBALPAGE, PUSH, F_PUSH, F_ASSIGN, POP), + DEFMACRO(STRUCTREF, PUSHSTRUCTPAGE, PUSH, REF), + DEFMACRO(STRUCTREFREF, PUSHSTRUCTPAGE, PUSH, REFREF), + DEFMACRO(STRUCTINC, PUSHSTRUCTPAGE, PUSH, INC), + DEFMACRO(STRUCTDEC, PUSHSTRUCTPAGE, PUSH, DEC), + DEFMACRO(STRUCTASSIGN, PUSHSTRUCTPAGE, PUSH, PUSH, ASSIGN, POP), + DEFMACRO(PUSHVMETHOD, PUSHSTRUCTPAGE, PUSH, DUP_U2, PUSH, REF, SWAP, PUSH, ADD, REF), }; struct macro_node { @@ -287,19 +296,6 @@ static void add_macro(struct macrodef *macro) parent->emit = macro->emit; } -static void print_node(struct macro_node *node, int indent) -{ - for (int i = 0; i < indent; i++) { - fputc('\t', stderr); - } - - fprintf(stderr, "%s\n", instructions[node->opcode].name); - - for (int i = 0; i < node->nr_children; i++) { - print_node(&node->children[i], indent+1); - } -} - // Transform macro list into a tree. static void create_macro_tree(void) { @@ -308,10 +304,6 @@ static void create_macro_tree(void) for (size_t i = 0; i < sizeof(macrodefs)/sizeof(*macrodefs); i++) { add_macro(¯odefs[i]); } - - for (int i = 0; i < macros->nr_children; i++) { - print_node(¯os->children[i], 0); - } } static struct macro_node *match_rewind(struct dasm_state *dasm, struct macro_node *match) diff --git a/src/tools/ainedit/ainedit.h b/src/tools/ainedit/ainedit.h index 6d44680..cb3ee7c 100644 --- a/src/tools/ainedit/ainedit.h +++ b/src/tools/ainedit/ainedit.h @@ -47,6 +47,7 @@ enum asm_pseudo_opcode { PO_GLOBALINC, PO_GLOBALDEC, PO_GLOBALASSIGN, + PO_F_GLOBALASSIGN, PO_STRUCTREF, PO_STRUCTREFREF, PO_STRUCTINC, diff --git a/src/tools/ainedit/asm.c b/src/tools/ainedit/asm.c index 291500f..a8d7469 100644 --- a/src/tools/ainedit/asm.c +++ b/src/tools/ainedit/asm.c @@ -55,31 +55,32 @@ KHASH_MAP_INIT_STR(string_ht, size_t); } const struct instruction asm_pseudo_ops[NR_PSEUDO_OPS - PSEUDO_OP_OFFSET] = { - PSEUDO_OP(PO_CASE, ".CASE", 2), - PSEUDO_OP(PO_DEFAULT, ".DEFAULT", 1), - PSEUDO_OP(PO_STR, ".STR", 2), - PSEUDO_OP(PO_MSG, ".MSG", 2), - MACRO(PO_LOCALREF, ".LOCALREF", 1, 10), - MACRO(PO_LOCALREFREF, ".LOCALREFREF", 1, 10), - MACRO(PO_LOCALINC, ".LOCALINC", 1, 10), - MACRO(PO_LOCALDEC, ".LOCALDEC", 1, 10), - MACRO(PO_LOCALASSIGN, ".LOCALASSIGN", 2, 18), - MACRO(PO_LOCALASSIGN2, ".LOCALASSIGN2", 1, 14), - MACRO(PO_F_LOCALASSIGN, ".F_LOCALASSIGN", 2, 18), - MACRO(PO_S_LOCALASSIGN, ".S_LOCALASSIGN", 1, 26), - MACRO(PO_LOCALDELETE, ".LOCALDELETE", 1, 24), - MACRO(PO_LOCALCREATE, ".LOCALCREATE", 2, 34), - MACRO(PO_GLOBALREF, ".GLOBALREF", 1, 10), - MACRO(PO_GLOBALREFREF, ".GLOBALREFREF", 1, 10), - MACRO(PO_GLOBALINC, ".GLOBALINC", 1, 10), - MACRO(PO_GLOBALDEC, ".GLOBALDEC", 1, 10), - MACRO(PO_GLOBALASSIGN, ".GLOBALASSIGN", 2, 18), - MACRO(PO_STRUCTREF, ".STRUCTREF", 2, 10), - MACRO(PO_STRUCTREFREF, ".STRUCTREFREF", 2, 10), - MACRO(PO_STRUCTINC, ".STRUCTINC", 2, 10), - MACRO(PO_STRUCTDEC, ".STRUCTDEC", 2, 10), - MACRO(PO_STRUCTASSIGN, ".STRUCTASSIGN", 3, 18), - MACRO(PO_PUSHVMETHOD, ".PUSHVMETHOD", 2, 30), + PSEUDO_OP(PO_CASE, ".CASE", 2), + PSEUDO_OP(PO_DEFAULT, ".DEFAULT", 1), + PSEUDO_OP(PO_STR, ".STR", 2), + PSEUDO_OP(PO_MSG, ".MSG", 2), + MACRO(PO_LOCALREF, ".LOCALREF", 1, 10), + MACRO(PO_LOCALREFREF, ".LOCALREFREF", 1, 10), + MACRO(PO_LOCALINC, ".LOCALINC", 1, 10), + MACRO(PO_LOCALDEC, ".LOCALDEC", 1, 10), + MACRO(PO_LOCALASSIGN, ".LOCALASSIGN", 2, 18), + MACRO(PO_LOCALASSIGN2, ".LOCALASSIGN2", 1, 14), + MACRO(PO_F_LOCALASSIGN, ".F_LOCALASSIGN", 2, 18), + MACRO(PO_S_LOCALASSIGN, ".S_LOCALASSIGN", 1, 26), + MACRO(PO_LOCALDELETE, ".LOCALDELETE", 1, 24), + MACRO(PO_LOCALCREATE, ".LOCALCREATE", 2, 34), + MACRO(PO_GLOBALREF, ".GLOBALREF", 1, 10), + MACRO(PO_GLOBALREFREF, ".GLOBALREFREF", 1, 10), + MACRO(PO_GLOBALINC, ".GLOBALINC", 1, 10), + MACRO(PO_GLOBALDEC, ".GLOBALDEC", 1, 10), + MACRO(PO_GLOBALASSIGN, ".GLOBALASSIGN", 2, 18), + MACRO(PO_F_GLOBALASSIGN, ".F_GLOBALASSIGN", 2, 18), + MACRO(PO_STRUCTREF, ".STRUCTREF", 2, 10), + MACRO(PO_STRUCTREFREF, ".STRUCTREFREF", 2, 10), + MACRO(PO_STRUCTINC, ".STRUCTINC", 2, 10), + MACRO(PO_STRUCTDEC, ".STRUCTDEC", 2, 10), + MACRO(PO_STRUCTASSIGN, ".STRUCTASSIGN", 3, 18), + MACRO(PO_PUSHVMETHOD, ".PUSHVMETHOD", 2, 30), }; struct string_table { @@ -685,6 +686,16 @@ void handle_pseudo_op(struct asm_state *state, struct parse_instruction *instr) asm_write_opcode(state, POP); break; } + case PO_F_GLOBALASSIGN: { + asm_write_opcode(state, PUSHGLOBALPAGE); + asm_write_opcode(state, PUSH); + asm_write_argument(state, asm_resolve_arg(state, PUSH, T_GLOBAL, kv_A(*instr->args, 0)->text)); + asm_write_opcode(state, F_PUSH); + asm_write_argument(state, asm_resolve_arg(state, F_PUSH, T_FLOAT, kv_A(*instr->args, 1)->text)); + asm_write_opcode(state, F_ASSIGN); + asm_write_opcode(state, POP); + break; + } case PO_STRUCTREF: { asm_write_opcode(state, PUSHSTRUCTPAGE); asm_write_opcode(state, PUSH);