90 lines
2.5 KiB
C++
90 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include "vm.hpp"
|
|
#include <cstdint>
|
|
#include <print>
|
|
|
|
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;
|
|
};
|
|
|
|
}
|