vc5/src/builder.hpp
2026-01-14 23:11:19 +01:00

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;
};
}