80 lines
2.2 KiB
C
80 lines
2.2 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_Imm,
|
|
LineTy_And_Imm,
|
|
LineTy_Add_Imm,
|
|
LineTy_Sub_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_r(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_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm);
|
|
Line s_and_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm);
|
|
Line s_add_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm);
|
|
Line s_sub_i(Reg dst_reg, Reg op1_reg, uint16_t op2_imm);
|
|
|
|
#define s_push_r(REG) s_add_i(Rsp, Rsp, 2), s_mov16_mr_r(Rsp, 0, REG)
|
|
|
|
#define s_pop_r(REG) s_mov16_r_mr(REG, Rsp, 2), s_sub_i(Rsp, Rsp, 2)
|
|
|
|
void assemble_to_binary(uint16_t* out, const Line* lines, size_t lines_size);
|
|
|
|
#define fmt_binary(VAL) \
|
|
(VAL) >> 7 & 1 ? '1' : '0', (VAL) >> 6 & 1 ? '1' : '0', \
|
|
(VAL) >> 5 & 1 ? '1' : '0', (VAL) >> 4 & 1 ? '1' : '0', \
|
|
(VAL) >> 3 & 1 ? '1' : '0', (VAL) >> 2 & 1 ? '1' : '0', \
|
|
(VAL) >> 1 & 1 ? '1' : '0', (VAL) >> 0 & 1 ? '1' : '0'
|