#pragma once #include "vm.h" #include <stddef.h> #include <stdint.h> typedef enum { LineTy_Label, LineTy_DataImm, LineTy_DataLabel, LineTy_Nop, LineTy_Hlt, LineTy_Jmp_Label, LineTy_Mov8_MemImm_Imm, LineTy_Mov8_MemImm_Reg, LineTy_Mov16_Reg_Reg, LineTy_Mov16_Reg_Imm, LineTy_Mov16_Reg_MemReg, LineTy_Mov16_MemReg_Reg, LineTy_In_Imm, LineTy_Lit_Imm, LineTy_Lit_Label, LineTy_IRet, LineTy_Or_Reg_Imm, LineTy_And_Reg_Imm, LineTy_Add_Reg_Imm, LineTy_Sub_Reg_Imm, } LineTy; typedef struct { union { int label; struct { uint16_t imm; uint16_t reg; }; }; } Ex; typedef struct { LineTy ty; Ex dst; Ex op1; Ex op2; uint16_t offset; } Line; Line s_label(int label); Line s_data_i(uint16_t data); Line s_data_l(int label); Line s_nop(void); Line s_hlt(void); Line s_jmp_l(int op1_label); Line s_mov8_mi_i(uint16_t dst_imm, uint16_t op2_imm); Line s_mov8_mi_reg(uint16_t dst_imm, Reg op2_reg); Line s_mov16_r_r(Reg dst_reg, Reg op2_reg); Line s_mov16_r_i(Reg dst_reg, uint16_t op2_imm); Line s_mov16_r_mr(Reg dst_reg, Reg op2_reg, uint16_t op2_offset); Line s_mov16_mr_r(Reg dst_reg, uint16_t dst_offset, Reg op2_reg); Line s_in_i(Reg dst_reg, uint16_t op1_imm); Line s_lit_i(uint16_t op1_imm); Line s_lit_l(int op1_label); Line s_iret(void); Line s_or_r_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm); Line s_and_r_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm); Line s_add_r_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm); Line s_sub_r_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm); void assemble_to_binary(uint16_t* out, const Line* lines, size_t lines_size);