#pragma once #include "vm.hpp" #include #include namespace vc5 { using namespace vc5; class Builder { public: Builder(uint8_t* data) : m_data(data) { } void nop(); void hlt(); void jmp_reg(Reg op1); void jmp_imm(uint16_t op1); void jnz_reg(Reg op1, Reg op2); void jnz_imm(Reg op1, uint16_t op2); void mov_reg(Reg dst, Reg src); void mov_imm(Reg dst, uint16_t imm); void load_word_reg(Reg dst, Reg addr, uint16_t offset); void load_word_imm(Reg dst, uint16_t addr); void store_word_reg(Reg dst, uint16_t offset, Reg op2); void store_word_imm(uint16_t dst, Reg op2); void load_byte_reg(Reg dst, Reg addr, uint16_t offset); void load_byte_imm(Reg dst, uint16_t addr); void store_byte_reg(Reg dst, uint16_t offset, Reg op2); void store_byte_imm(uint16_t dst, Reg op2); void cmp_reg(Reg op1, Reg op2); void cmp_imm(Reg op1, uint16_t op2); void or_reg(Reg dst, Reg op1, Reg op2); void and_reg(Reg dst, Reg op1, Reg op2); void xor_reg(Reg dst, Reg op1, Reg op2); void shl_reg(Reg dst, Reg op1, Reg op2); void rshl_reg(Reg dst, Reg op1, Reg op2); void shr_reg(Reg dst, Reg op1, Reg op2); void rshr_reg(Reg dst, Reg op1, Reg op2); void add_reg(Reg dst, Reg op1, Reg op2); void sub_reg(Reg dst, Reg op1, Reg op2); void rsub_reg(Reg dst, Reg op1, Reg op2); void or_imm(Reg dst, Reg op1, uint16_t op2); void and_imm(Reg dst, Reg op1, uint16_t op2); void xor_imm(Reg dst, Reg op1, uint16_t op2); void shl_imm(Reg dst, Reg op1, uint16_t op2); void rshl_imm(Reg dst, Reg op1, uint16_t op2); void shr_imm(Reg dst, Reg op1, uint16_t op2); void rshr_imm(Reg dst, Reg op1, uint16_t op2); void add_imm(Reg dst, Reg op1, uint16_t op2); void sub_imm(Reg dst, Reg op1, uint16_t op2); void rsub_imm(Reg dst, Reg op1, uint16_t op2); void reti(); void lvcd_reg(Reg op1); void lvcd_imm(uint16_t op1); void lkbd_reg(Reg op1); void lkbd_imm(uint16_t op1); void dskr(Reg dst, Reg op1); void dskw(Reg dst, Reg op1); uint16_t ip() const { return m_ip & 0xffff; } void set_ip(uint16_t ip) { m_ip = ip; } inline void push(uint16_t v) { m_data[m_ip] = v >> 8; m_data[m_ip + 1] = v & 0xff; m_ip += 2; } private: void binary_reg(Reg dst, Reg op1, Reg op2, Op op); void binary_imm(Reg dst, Reg op1, uint16_t op2, Op op); uint8_t* m_data; size_t m_ip = 0; }; }