2
3
4
5
6
7
8
9
10
11
12
13
20#include <gimbal/strings/gimbal_string_buffer.h>
21#include "../types/evmu_typedefs.h"
22#include "../evmu_api.h"
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#define EVMU_OPCODE_NOP 0x00
41#define EVMU_OPCODE_BR 0x01
42#define EVMU_OPCODE_LD 0x02
43#define EVMU_OPCODE_LD_IND 0x04
44#define EVMU_OPCODE_CALL 0x08
45#define EVMU_OPCODE_CALLR 0x10
46#define EVMU_OPCODE_BRF 0x11
47#define EVMU_OPCODE_ST 0x12
48#define EVMU_OPCODE_ST_IND 0x14
49#define EVMU_OPCODE_CALLF 0x20
50#define EVMU_OPCODE_JMPF 0x21
51#define EVMU_OPCODE_MOV 0x22
52#define EVMU_OPCODE_MOV_IND 0x24
53#define EVMU_OPCODE_JMP 0x28
54#define EVMU_OPCODE_MUL 0x30
55#define EVMU_OPCODE_BEI 0x31
56#define EVMU_OPCODE_BE 0x32
57#define EVMU_OPCODE_BE_IND 0x34
58#define EVMU_OPCODE_DIV 0x40
59#define EVMU_OPCODE_BNEI 0x41
60#define EVMU_OPCODE_BNE 0x42
61#define EVMU_OPCODE_BNE_IND 0x44
62#define EVMU_OPCODE_BPC 0x48
63#define EVMU_OPCODE_LDF 0x50
64#define EVMU_OPCODE_STF 0x51
65#define EVMU_OPCODE_DBNZ 0x52
66#define EVMU_OPCODE_DBNZ_IND 0x54
67#define EVMU_OPCODE_PUSH 0x60
68#define EVMU_OPCODE_INC 0x62
69#define EVMU_OPCODE_INC_IND 0x64
70#define EVMU_OPCODE_BP 0x68
71#define EVMU_OPCODE_POP 0x70
72#define EVMU_OPCODE_DEC 0x72
73#define EVMU_OPCODE_DEC_IND 0x74
74#define EVMU_OPCODE_BZ 0x80
75#define EVMU_OPCODE_ADDI 0x81
76#define EVMU_OPCODE_ADD 0x82
77#define EVMU_OPCODE_ADD_IND 0x84
78#define EVMU_OPCODE_BN 0x88
79#define EVMU_OPCODE_BNZ 0x90
80#define EVMU_OPCODE_ADDCI 0x91
81#define EVMU_OPCODE_ADDC 0x92
82#define EVMU_OPCODE_ADDC_IND 0x94
83#define EVMU_OPCODE_RET 0xa0
84#define EVMU_OPCODE_SUBI 0xa1
85#define EVMU_OPCODE_SUB 0xa2
86#define EVMU_OPCODE_SUB_IND 0xa4
87#define EVMU_OPCODE_NOT1 0xa8
88#define EVMU_OPCODE_RETI 0xb0
89#define EVMU_OPCODE_SUBCI 0xb1
90#define EVMU_OPCODE_SUBC 0xb2
91#define EVMU_OPCODE_SUBC_IND 0xb4
92#define EVMU_OPCODE_ROR 0xc0
93#define EVMU_OPCODE_LDC 0xc1
94#define EVMU_OPCODE_XCH 0xc2
95#define EVMU_OPCODE_XCH_IND 0xc4
96#define EVMU_OPCODE_CLR1 0xc8
97#define EVMU_OPCODE_RORC 0xd0
98#define EVMU_OPCODE_ORI 0xd1
99#define EVMU_OPCODE_OR 0xd2
100#define EVMU_OPCODE_OR_IND 0xd4
101#define EVMU_OPCODE_ROL 0xe0
102#define EVMU_OPCODE_ANDI 0xe1
103#define EVMU_OPCODE_AND 0xe2
104#define EVMU_OPCODE_AND_IND 0xe4
105#define EVMU_OPCODE_SET1 0xe8
106#define EVMU_OPCODE_ROLC 0xf0
107#define EVMU_OPCODE_XORI 0xf1
108#define EVMU_OPCODE_XOR 0xf2
109#define EVMU_OPCODE_XOR_IND 0xf4
113
114
115
116#define EVMU_ISA_PSW_SYSTEM_POS 3
117#define EVMU_ISA_PSW_SYSTEM_MASK 0x8
118#define EVMU_ISA_PSW_CY_POS 2
119#define EVMU_ISA_PSW_CY_MASK 0x4
120#define EVMU_ISA_PSW_AC_POS 1
121#define EVMU_ISA_PSW_AC_MASK 0x2
122#define EVMU_ISA_PSW_OV_POS 0
123#define EVMU_ISA_PSW_OV_MASK 0x1
124#define EVMU_ISA_PSW_NONE 0x0
128
129
130
132#define EVMU_ISA_ARG_FORMAT_PACK(...)
136#define EVMU_ISA_ARG_FORMAT_UNPACK(argFormat, field)
137 ((argFormat >> (field * 8u
)) & 0xff
)
140#define EVMU_ISA_ARGC(argFmt)
179
180
181
182
183
184
185
195} EvmuInstructionFormat;
203} EVMU_INSTRUCTION_BYTE;
228} EvmuDecodedInstruction;
237 size_t* pBytes) GBL_NOEXCEPT;
241 EvmuDecodedInstruction* pDecoded) GBL_NOEXCEPT;
246#define EVMU_ISA_ARG_FORMAT_PACK_3(arg1, arg2, arg3)
248 (((EvmuIsaArgFormat)arg1 & 0xffu
) << ((EvmuIsaArgFormat)EVMU_ISA_ARG1 * 8
)) |
249 (((EvmuIsaArgFormat)arg2 & 0xffu
) << ((EvmuIsaArgFormat)EVMU_ISA_ARG2 * 8
)) |
250 (((EvmuIsaArgFormat)arg3 & 0xffu
) << ((EvmuIsaArgFormat)EVMU_ISA_ARG3 * 8
)))
252#define EVMU_ISA_ARG_FORMAT_PACK_2(a, b) (EVMU_ISA_ARG_FORMAT_PACK_3
(a, b, EVMU_ISA_ARG_TYPE_NONE))
254#define EVMU_ISA_ARG_FORMAT_PACK_1(a) (EVMU_ISA_ARG_FORMAT_PACK_2
(a, EVMU_ISA_ARG_TYPE_NONE))
#define EVMU_EXPORT
Define used for adding attributes to export public symbols.
#define EVMU_ISA_ARG_FORMAT_UNPACK(argFormat, field)
Unpacks the given field from the EvmuIsaArgFormat provided as argFormat.
EVMU_ISA_ARG
Enumeration for each argument position in an EvmuIaArgFormat.
@ EVMU_ISA_ARG2
Second argument.
@ EVMU_ISA_ARG3
Third argument.
@ EVMU_ISA_ARG1
First argument.
@ EVMU_ISA_ARG_COUNT
Size of argument pack.
EVMU_ISA_ARG_TYPE
Enumeration with every type of instruction argument.
@ EVMU_ISA_ARG_TYPE_INDIRECT_2
2-bit indirection mode
@ EVMU_ISA_ARG_TYPE_BIT_3
3-bit bit position
@ EVMU_ISA_ARG_TYPE_COUNT
Number of different types.
@ EVMU_ISA_ARG_TYPE_ABSOLUTE_12
12-bit absolute address
@ EVMU_ISA_ARG_TYPE_DIRECT_9
9-bit direct address
@ EVMU_ISA_ARG_TYPE_ABSOLUTE_16
16-bit absolute address
@ EVMU_ISA_ARG_TYPE_RELATIVE_16
16-bit relative address
@ EVMU_ISA_ARG_TYPE_RELATIVE_8
8-bit relative address
@ EVMU_ISA_ARG_TYPE_NONE
No Argument.
@ EVMU_ISA_ARG_TYPE_IMMEDIATE_8
8-bit immediate value
uint32_t EvmuIsaFlags
Flags type for EvmuInstructionFormat::flags.
const EvmuInstructionFormat * EvmuIsa_format(EvmuWord firstByte)
Fetches information on an instruction from the internal database.
EVMU_RESULT EvmuIsa_fetch(EvmuInstruction *pEncoded, const void *pBuffer, size_t *pBytes)
Fetches an encoded instruction from a buffer.
EVMU_RESULT EvmuIsa_decode(const EvmuInstruction *pEncoded, EvmuDecodedInstruction *pDecoded)
Decodes an instruction into an EvmuDecodedInstruction.
#define EVMU_ISA_ARG_FORMAT_PACK(...)
Packs the given argument types into an EvmuIsaArgFormat.
EVMU_INSTRUCTION_BYTE
Enumeration containing each byte within an encoded EvmuInstruction.
@ EVMU_INSTRUCTION_BYTE_OPCODE
First byte of an encoded instruction (opcode)
@ EVMU_INSTRUCTION_BYTE_2
Second byte of an encoded instruction (if present)
@ EVMU_INSTRUCTION_BYTE_MAX
Maximum number of bytes in an encoded instruction (1 for padding)
@ EVMU_INSTRUCTION_BYTE_3
Third byte of an encoded instruction (if present)
uint32_t EvmuIsaArgFormat
Type for holding encoded instruction argument types in EvmuInstructionFormat::args.
uint8_t EvmuWord
Represents a single 8-bit CPU word.
Represents an instruction which has been decoded.
EvmuWord opcode
Opcode byte (see Instruction Opcodes)
EvmuOperands operands
Decoded operands.
Contains a collection of bytes, representing an encoded instruction.
uint8_t byteCount
Byte size of instruciton data.
uint8_t bytes[EVMU_INSTRUCTION_BYTE_MAX]
Raw instruction byte data.
Contains the decoded operands of an instruction.
uint16_t direct
9-bit direct address
uint8_t immediate
8-bit immediate data
uint16_t absolute
12 or 16-bit absolute address
uint8_t bit
3-bit bit offset
uint16_t relative16
16-bit relative address
int8_t relative8
8-bit relative address
uint8_t indirect
2-bit indirection mode