Erin
79c367dc18
- Changed instruction encoding to be faster to match on - Implemented all instructions defined in spec - Bytecode validation - Assembler - Implemented 5 level paging (based on SV57) - Implemented some degree of interrupts (though not fully adhering the spec yet)
61 lines
1.9 KiB
C
61 lines
1.9 KiB
C
/* HoleyBytes Bytecode representation in C
|
|
* Requires C23 compiler or better
|
|
*/
|
|
|
|
#pragma once
|
|
#include <assert.h>
|
|
#include <stdint.h>
|
|
|
|
typedef enum hbbc_Opcode: uint8_t {
|
|
hbbc_Op_NOP, hbbc_Op_ADD, hbbc_Op_MUL, hbbc_Op_AND, hbbc_Op_OR, hbbc_Op_XOR, hbbc_Op_SL,
|
|
hbbc_Op_SR, hbbc_Op_SRS, hbbc_Op_CMP, hbbc_Op_CMPU, hbbc_Op_DIR, hbbc_Op_NEG, hbbc_Op_NOT,
|
|
hbbc_Op_ADDI, hbbc_Op_MULI, hbbc_Op_ANDI, hbbc_Op_ORI, hbbc_Op_XORI, hbbc_Op_SLI, hbbc_Op_SRI,
|
|
hbbc_Op_SRSI, hbbc_Op_CMPI, hbbc_Op_CMPUI, hbbc_Op_CP, hbbc_Op_SWA, hbbc_Op_LI, hbbc_Op_LD,
|
|
hbbc_Op_ST, hbbc_Op_BMC, hbbc_Op_BRC, hbbc_Op_JMP, hbbc_Op_JEQ, hbbc_Op_JNE, hbbc_Op_JLT,
|
|
hbbc_Op_JGT, hbbc_Op_JLTU, hbbc_Op_JGTU, hbbc_Op_ECALL, hbbc_Op_ADDF, hbbc_Op_MULF,
|
|
hbbc_Op_DIRF, hbbc_Op_ADDFI, hbbc_Op_MULFI,
|
|
} hbbc_Opcode;
|
|
|
|
static_assert(sizeof(hbbc_Opcode) == 1);
|
|
|
|
#pragma pack(push, 1)
|
|
typedef struct hbbc_ParamBBBB
|
|
{ uint8_t _0; uint8_t _1; uint8_t _2; uint8_t _3; }
|
|
hbbc_ParamBBBB;
|
|
static_assert(sizeof(hbbc_ParamBBBB) == 4);
|
|
|
|
typedef struct hbbc_ParamBBB
|
|
{ uint8_t _0; uint8_t _1; uint8_t _2; }
|
|
hbbc_ParamBBB;
|
|
static_assert(sizeof(hbbc_ParamBBB) == 3);
|
|
|
|
typedef struct hbbc_ParamBBDH
|
|
{ uint8_t _0; uint8_t _1; uint64_t _2; uint16_t _3; }
|
|
hbbc_ParamBBDH;
|
|
static_assert(sizeof(hbbc_ParamBBDH) == 12);
|
|
|
|
typedef struct hbbc_ParamBBDB
|
|
{ uint8_t _0; uint8_t _1; uint64_t _2; uint8_t _3; }
|
|
hbbc_ParamBBDB;
|
|
static_assert(sizeof(hbbc_ParamBBDB) == 11);
|
|
|
|
typedef struct hbbc_ParamBBD
|
|
{ uint8_t _0; uint8_t _1; uint64_t _2; }
|
|
hbbc_ParamBBD;
|
|
static_assert(sizeof(hbbc_ParamBBD) == 10);
|
|
|
|
typedef struct hbbc_ParamBB
|
|
{ uint8_t _0; uint8_t _1; }
|
|
hbbc_ParamBB;
|
|
static_assert(sizeof(hbbc_ParamBB) == 2);
|
|
|
|
typedef struct hbbc_ParamBD
|
|
{ uint8_t _0; uint64_t _1; }
|
|
hbbc_ParamBD;
|
|
static_assert(sizeof(hbbc_ParamBD) == 9);
|
|
|
|
typedef uint64_t hbbc_ParamD;
|
|
static_assert(sizeof(hbbc_ParamD) == 8);
|
|
|
|
#pragma pack(pop)
|