vc3/vm/asm.h
2025-03-30 05:37:39 +02:00

70 lines
1.7 KiB
C

#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);