Rework instructions size handling

This commit is contained in:
2023-06-01 16:49:13 +09:00
parent 8107b06da4
commit ea17cffaef
3 changed files with 333 additions and 296 deletions
+96 -58
View File
@@ -1,3 +1,4 @@
#include <stdint.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdbool.h>
@@ -8,12 +9,10 @@ const char *registers8[] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" };
const char *registers16[] = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di" };
void print_rm_operand(instruction_t inst, unsigned raw, u_int8_t operand, bool is16bit)
void print_rm_operand(unsigned inst_size, u_int8_t *binary, bool is16bit)
{
(void)inst;
(void)raw;
unsigned mod = operand >> 6;
unsigned rm = operand & 0b111;
unsigned mod = binary[1] >> 6;
unsigned rm = binary[1] & 0b111;
char disp[20] = {0};
if (mod == 0b11) {
@@ -21,13 +20,15 @@ void print_rm_operand(instruction_t inst, unsigned raw, u_int8_t operand, bool i
return;
}
if (mod == 0b10 || (mod == 0 && rm == 0b110)) {
// TODO: Understand how to retrieve disp low and high
snprintf(disp, sizeof(disp), "+%02x", 0);
if (mod == 0b10) {
snprintf(disp, sizeof(disp), "+%04x", binary[inst_size - 1] | (binary[inst_size - 2] << 8));
}
if (mod == 0 && rm == 0b110) {
snprintf(disp, sizeof(disp), "+%04x", (binary[inst_size - 1] << 8) | binary[inst_size - 2]);
}
if (mod == 0b01) {
// TODO: Understand how to retrieve disp low and high
// TODO: Here, the disp is signed.
int8_t disp_v = binary[inst_size - 1];
snprintf(disp, 20, "%c%x", disp_v < 0 ? '-' : '+', disp_v);
}
switch (rm)
@@ -43,49 +44,6 @@ void print_rm_operand(instruction_t inst, unsigned raw, u_int8_t operand, bool i
}
}
void print_instruction(unsigned addr, instruction_t inst, unsigned raw)
{
bool need_comma = strchr(inst.name, ' ');
u_int8_t operand = raw & (0xFF << (inst.size - 2));
printf("%04x: %0*x%-*s %s", addr, inst.size * 2, raw, 13 - inst.size * 2, "", inst.name);
for (int i = 0; inst.mode[i] != END; i++) {
if (need_comma)
printf(", ");
else
printf(" ");
need_comma = true;
switch (inst.mode[i]) {
case IMM8:
printf("%02x", raw & 0xFF);
break;
case IMM16:
printf("%02x%02x", raw & 0xFF, (raw & 0xFF00) >> 8);
break;
case REL8:
printf("%02x", addr + inst.size - (raw & 0xFF));
break;
case REL16:
printf("%04x", addr + inst.size - ((raw & 0xFF << 8) + (raw & 0xFF00 >> 8)));
break;
case REG8:
printf("%s", registers8[(operand & 0b111000) >> 3]);
break;
case REG16:
printf("%s", registers16[(operand & 0b111000) >> 3]);
break;
case R_M8:
print_rm_operand(inst, raw, operand, false);
break;
case R_M16:
print_rm_operand(inst, raw, operand, true);
break;
case END:
break;
}
}
printf("\n");
}
unsigned read_size(u_int8_t *binary, unsigned size)
{
unsigned ret = binary[0];
@@ -97,6 +55,48 @@ unsigned read_size(u_int8_t *binary, unsigned size)
return ret;
}
void print_instruction(unsigned addr, instruction_t inst, unsigned inst_size, u_int8_t *binary)
{
bool need_comma = strchr(inst.name, ' ');
printf("%04x: %0*x%-*s %s", addr, inst_size * 2, read_size(binary, inst_size), 13 - inst_size * 2, "", inst.name);
for (int i = 0; inst.mode[i] != END; i++) {
if (need_comma)
printf(", ");
else
printf(" ");
need_comma = true;
switch (inst.mode[i]) {
case IMM8:
printf("%02x", binary[inst_size - 1]);
break;
case IMM16:
printf("%04x", (binary[inst_size - 1] << 8) | binary[inst_size - 2]);
break;
case REL8:
printf("%02x", addr + inst_size - binary[inst_size - 1]);
break;
case REL16:
printf("%04x", addr + inst_size - ((binary[inst_size - 1] << 8) | binary[inst_size - 2]));
break;
case REG8:
printf("%s", registers8[(binary[1] & 0b111000) >> 3]);
break;
case REG16:
printf("%s", registers16[(binary[1] & 0b111000) >> 3]);
break;
case R_M8:
print_rm_operand(inst_size, binary, false);
break;
case R_M16:
print_rm_operand(inst_size, binary, true);
break;
case END:
break;
}
}
printf("\n");
}
instruction_t parse_inst(u_int8_t *binary, unsigned long size)
{
for (int i = 0; instructions[i].name; i++) {
@@ -114,6 +114,44 @@ instruction_t parse_inst(u_int8_t *binary, unsigned long size)
return invalid_instruction;
}
unsigned get_inst_size(instruction_t inst, u_int8_t *binary, unsigned bin_size)
{
unsigned size = 1;
bool has_extended_mod = false;
for (int i = 0; inst.mode[i] != END; i++) {
switch(inst.mode[i]) {
case IMM8:
case REL8:
size += 1;
break;
case IMM16:
case REL16:
size += 2;
break;
case R_M8:
case R_M16: {
if (bin_size < 2)
return 2;
unsigned mod = binary[1] >> 6;
unsigned rm = binary[1] & 0b111;
if (mod == 0b01)
size++;
else if (mod == 0b10 || (mod == 0 && rm == 0b110))
size += 2;
has_extended_mod = true;
break;
}
case REG16:
case REG8:
has_extended_mod = true;
break;
case END:
break;
}
}
return size + has_extended_mod;
}
int dasm(u_int8_t *binary, unsigned long size)
{
unsigned long pc = 0;
@@ -131,14 +169,14 @@ int dasm(u_int8_t *binary, unsigned long size)
while (pc < size) {
instruction_t inst = parse_inst(binary, size - pc);
if (pc + inst.size > size) {
unsigned inst_size = get_inst_size(inst, binary, size - pc);
if (pc + inst_size > size) {
printf("Invalid file. Missing operand for instruction: '%s'. (pc: %lx)\n", inst.name, pc);
return 1;
}
unsigned long raw = read_size(binary, inst.size);
print_instruction(pc, inst, raw);
pc += inst.size;
binary += inst.size;
print_instruction(pc, inst, inst_size, binary);
pc += inst_size;
binary += inst_size;
}
return 0;
}
-1
View File
@@ -38,7 +38,6 @@ typedef enum addressing_mode {
typedef struct instruction {
u_int8_t opcode;
const char *name;
unsigned size;
addressing_mode_t mode[5];
int extended;
} instruction_t;
+237 -237
View File
@@ -2,227 +2,227 @@
#include "dasm.h"
const instruction_t instructions[] = {
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x01, .extended = -1, .name = "add", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0x02, .extended = -1, .name = "add", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x03, .extended = -1, .name = "add", .mode = {REG16, R_M16, END}, .size = 3},
{.opcode = 0x04, .extended = -1, .name = "add al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x05, .extended = -1, .name = "add ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x06, .extended = -1, .name = "push es", .mode = {END}, .size = 1},
{.opcode = 0x07, .extended = -1, .name = "pop es", .mode = {END}, .size = 1},
{.opcode = 0x08, .extended = -1, .name = "or", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x09, .extended = -1, .name = "or", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0x0A, .extended = -1, .name = "or", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x0B, .extended = -1, .name = "or", .mode = {REG16, R_M16, END}, .size = 3},
{.opcode = 0x0C, .extended = -1, .name = "or al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x0D, .extended = -1, .name = "or ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x0E, .extended = -1, .name = "push cs", .mode = {END}, .size = 1},
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M8, REG8, END}},
{.opcode = 0x01, .extended = -1, .name = "add", .mode = {R_M16, REG16, END}},
{.opcode = 0x02, .extended = -1, .name = "add", .mode = {REG8, R_M8, END}},
{.opcode = 0x03, .extended = -1, .name = "add", .mode = {REG16, R_M16, END}},
{.opcode = 0x04, .extended = -1, .name = "add al", .mode = {IMM8, END}},
{.opcode = 0x05, .extended = -1, .name = "add ax", .mode = {IMM16, END}},
{.opcode = 0x06, .extended = -1, .name = "push es", .mode = {END}},
{.opcode = 0x07, .extended = -1, .name = "pop es", .mode = {END}},
{.opcode = 0x08, .extended = -1, .name = "or", .mode = {R_M8, REG8, END}},
{.opcode = 0x09, .extended = -1, .name = "or", .mode = {R_M16, REG16, END}},
{.opcode = 0x0A, .extended = -1, .name = "or", .mode = {REG8, R_M8, END}},
{.opcode = 0x0B, .extended = -1, .name = "or", .mode = {REG16, R_M16, END}},
{.opcode = 0x0C, .extended = -1, .name = "or al", .mode = {IMM8, END}},
{.opcode = 0x0D, .extended = -1, .name = "or ax", .mode = {IMM16, END}},
{.opcode = 0x0E, .extended = -1, .name = "push cs", .mode = {END}},
{.opcode = 0x10, .extended = -1, .name = "adc", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x11, .extended = -1, .name = "adc", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0x12, .extended = -1, .name = "adc", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x13, .extended = -1, .name = "adc", .mode = {REG16, R_M16, END}, .size = 3},
{.opcode = 0x14, .extended = -1, .name = "adc al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x15, .extended = -1, .name = "adc ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x16, .extended = -1, .name = "push ss", .mode = {END}, .size = 1},
{.opcode = 0x17, .extended = -1, .name = "pop ss", .mode = {END}, .size = 1},
{.opcode = 0x18, .extended = -1, .name = "sbb", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x19, .extended = -1, .name = "sbb", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0x1A, .extended = -1, .name = "sbb", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x1B, .extended = -1, .name = "sbb", .mode = {REG16, R_M16, END}, .size = 3},
{.opcode = 0x1C, .extended = -1, .name = "sbb al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x1D, .extended = -1, .name = "sbb ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x1E, .extended = -1, .name = "push ds", .mode = {END}, .size = 1},
{.opcode = 0x1F, .extended = -1, .name = "pop ds", .mode = {END}, .size = 1},
{.opcode = 0x20, .extended = -1, .name = "and", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x21, .extended = -1, .name = "and", .mode = {R_M16, REG16, END}, .size = 2},
{.opcode = 0x22, .extended = -1, .name = "and", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x23, .extended = -1, .name = "and", .mode = {REG16, R_M16, END}, .size = 2},
{.opcode = 0x24, .extended = -1, .name = "and al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x25, .extended = -1, .name = "and ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x10, .extended = -1, .name = "adc", .mode = {R_M8, REG8, END}},
{.opcode = 0x11, .extended = -1, .name = "adc", .mode = {R_M16, REG16, END}},
{.opcode = 0x12, .extended = -1, .name = "adc", .mode = {REG8, R_M8, END}},
{.opcode = 0x13, .extended = -1, .name = "adc", .mode = {REG16, R_M16, END}},
{.opcode = 0x14, .extended = -1, .name = "adc al", .mode = {IMM8, END}},
{.opcode = 0x15, .extended = -1, .name = "adc ax", .mode = {IMM16, END}},
{.opcode = 0x16, .extended = -1, .name = "push ss", .mode = {END}},
{.opcode = 0x17, .extended = -1, .name = "pop ss", .mode = {END}},
{.opcode = 0x18, .extended = -1, .name = "sbb", .mode = {R_M8, REG8, END}},
{.opcode = 0x19, .extended = -1, .name = "sbb", .mode = {R_M16, REG16, END}},
{.opcode = 0x1A, .extended = -1, .name = "sbb", .mode = {REG8, R_M8, END}},
{.opcode = 0x1B, .extended = -1, .name = "sbb", .mode = {REG16, R_M16, END}},
{.opcode = 0x1C, .extended = -1, .name = "sbb al", .mode = {IMM8, END}},
{.opcode = 0x1D, .extended = -1, .name = "sbb ax", .mode = {IMM16, END}},
{.opcode = 0x1E, .extended = -1, .name = "push ds", .mode = {END}},
{.opcode = 0x1F, .extended = -1, .name = "pop ds", .mode = {END}},
{.opcode = 0x20, .extended = -1, .name = "and", .mode = {R_M8, REG8, END}},
{.opcode = 0x21, .extended = -1, .name = "and", .mode = {R_M16, REG16, END}},
{.opcode = 0x22, .extended = -1, .name = "and", .mode = {REG8, R_M8, END}},
{.opcode = 0x23, .extended = -1, .name = "and", .mode = {REG16, R_M16, END}},
{.opcode = 0x24, .extended = -1, .name = "and al", .mode = {IMM8, END}},
{.opcode = 0x25, .extended = -1, .name = "and ax", .mode = {IMM16, END}},
{.opcode = 0x27, .extended = -1, .name = "daa", .mode = {END}, .size = 1},
{.opcode = 0x28, .extended = -1, .name = "sub", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x29, .extended = -1, .name = "sub", .mode = {R_M16, REG16, END}, .size = 2},
{.opcode = 0x2A, .extended = -1, .name = "sub", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x2B, .extended = -1, .name = "sub", .mode = {REG16, R_M16, END}, .size = 2},
{.opcode = 0x2C, .extended = -1, .name = "sub al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x2D, .extended = -1, .name = "sub ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x27, .extended = -1, .name = "daa", .mode = {END}},
{.opcode = 0x28, .extended = -1, .name = "sub", .mode = {R_M8, REG8, END}},
{.opcode = 0x29, .extended = -1, .name = "sub", .mode = {R_M16, REG16, END}},
{.opcode = 0x2A, .extended = -1, .name = "sub", .mode = {REG8, R_M8, END}},
{.opcode = 0x2B, .extended = -1, .name = "sub", .mode = {REG16, R_M16, END}},
{.opcode = 0x2C, .extended = -1, .name = "sub al", .mode = {IMM8, END}},
{.opcode = 0x2D, .extended = -1, .name = "sub ax", .mode = {IMM16, END}},
{.opcode = 0x2F, .extended = -1, .name = "das", .mode = {END}, .size = 1},
{.opcode = 0x30, .extended = -1, .name = "xor", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x31, .extended = -1, .name = "xor", .mode = {R_M16, REG16, END}, .size = 2},
{.opcode = 0x32, .extended = -1, .name = "xor", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x33, .extended = -1, .name = "xor", .mode = {REG16, R_M16, END}, .size = 2},
{.opcode = 0x34, .extended = -1, .name = "xor al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x35, .extended = -1, .name = "xor ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x2F, .extended = -1, .name = "das", .mode = {END}},
{.opcode = 0x30, .extended = -1, .name = "xor", .mode = {R_M8, REG8, END}},
{.opcode = 0x31, .extended = -1, .name = "xor", .mode = {R_M16, REG16, END}},
{.opcode = 0x32, .extended = -1, .name = "xor", .mode = {REG8, R_M8, END}},
{.opcode = 0x33, .extended = -1, .name = "xor", .mode = {REG16, R_M16, END}},
{.opcode = 0x34, .extended = -1, .name = "xor al", .mode = {IMM8, END}},
{.opcode = 0x35, .extended = -1, .name = "xor ax", .mode = {IMM16, END}},
{.opcode = 0x37, .extended = -1, .name = "aaa", .mode = {END}, .size = 1},
{.opcode = 0x38, .extended = -1, .name = "cmp", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x39, .extended = -1, .name = "cmp", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0x3A, .extended = -1, .name = "cmp", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x3B, .extended = -1, .name = "cmp", .mode = {REG16, R_M16, END}, .size = 3},
{.opcode = 0x3C, .extended = -1, .name = "cmp al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0x3D, .extended = -1, .name = "cmp ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x37, .extended = -1, .name = "aaa", .mode = {END}},
{.opcode = 0x38, .extended = -1, .name = "cmp", .mode = {R_M8, REG8, END}},
{.opcode = 0x39, .extended = -1, .name = "cmp", .mode = {R_M16, REG16, END}},
{.opcode = 0x3A, .extended = -1, .name = "cmp", .mode = {REG8, R_M8, END}},
{.opcode = 0x3B, .extended = -1, .name = "cmp", .mode = {REG16, R_M16, END}},
{.opcode = 0x3C, .extended = -1, .name = "cmp al", .mode = {IMM8, END}},
{.opcode = 0x3D, .extended = -1, .name = "cmp ax", .mode = {IMM16, END}},
{.opcode = 0x3F, .extended = -1, .name = "ass", .mode = {END}, .size = 1},
{.opcode = 0x40, .extended = -1, .name = "inc ax", .mode = {END}, .size = 1},
{.opcode = 0x41, .extended = -1, .name = "inc cx", .mode = {END}, .size = 1},
{.opcode = 0x42, .extended = -1, .name = "inc dx", .mode = {END}, .size = 1},
{.opcode = 0x43, .extended = -1, .name = "inc bx", .mode = {END}, .size = 1},
{.opcode = 0x44, .extended = -1, .name = "inc sp", .mode = {END}, .size = 1},
{.opcode = 0x45, .extended = -1, .name = "inc bp", .mode = {END}, .size = 1},
{.opcode = 0x46, .extended = -1, .name = "inc si", .mode = {END}, .size = 1},
{.opcode = 0x47, .extended = -1, .name = "inc di", .mode = {END}, .size = 1},
{.opcode = 0x48, .extended = -1, .name = "dec ax", .mode = {END}, .size = 1},
{.opcode = 0x49, .extended = -1, .name = "dec cx", .mode = {END}, .size = 1},
{.opcode = 0x4A, .extended = -1, .name = "dec dx", .mode = {END}, .size = 1},
{.opcode = 0x4B, .extended = -1, .name = "dec bx", .mode = {END}, .size = 1},
{.opcode = 0x4C, .extended = -1, .name = "dec sp", .mode = {END}, .size = 1},
{.opcode = 0x4D, .extended = -1, .name = "dec bp", .mode = {END}, .size = 1},
{.opcode = 0x4E, .extended = -1, .name = "dec si", .mode = {END}, .size = 1},
{.opcode = 0x4F, .extended = -1, .name = "dec di", .mode = {END}, .size = 1},
{.opcode = 0x50, .extended = -1, .name = "push ax", .mode = {END}, .size = 1},
{.opcode = 0x51, .extended = -1, .name = "push cx", .mode = {END}, .size = 1},
{.opcode = 0x52, .extended = -1, .name = "push dx", .mode = {END}, .size = 1},
{.opcode = 0x53, .extended = -1, .name = "push bx", .mode = {END}, .size = 1},
{.opcode = 0x54, .extended = -1, .name = "push sp", .mode = {END}, .size = 1},
{.opcode = 0x55, .extended = -1, .name = "push bp", .mode = {END}, .size = 1},
{.opcode = 0x56, .extended = -1, .name = "push si", .mode = {END}, .size = 1},
{.opcode = 0x57, .extended = -1, .name = "push di", .mode = {END}, .size = 1},
{.opcode = 0x58, .extended = -1, .name = "pop ax", .mode = {END}, .size = 1},
{.opcode = 0x59, .extended = -1, .name = "pop cx", .mode = {END}, .size = 1},
{.opcode = 0x5A, .extended = -1, .name = "pop dx", .mode = {END}, .size = 1},
{.opcode = 0x5B, .extended = -1, .name = "pop bx", .mode = {END}, .size = 1},
{.opcode = 0x5C, .extended = -1, .name = "pop sp", .mode = {END}, .size = 1},
{.opcode = 0x5D, .extended = -1, .name = "pop bp", .mode = {END}, .size = 1},
{.opcode = 0x5E, .extended = -1, .name = "pop si", .mode = {END}, .size = 1},
{.opcode = 0x5F, .extended = -1, .name = "pop di", .mode = {END}, .size = 1},
{.opcode = 0x70, .extended = -1, .name = "jo", .mode = {REL8, END}, .size = 2},
{.opcode = 0x71, .extended = -1, .name = "jno", .mode = {REL8, END}, .size = 2},
{.opcode = 0x72, .extended = -1, .name = "jc", .mode = {REL8, END}, .size = 2},
{.opcode = 0x73, .extended = -1, .name = "jnc", .mode = {REL8, END}, .size = 2},
{.opcode = 0x74, .extended = -1, .name = "jz", .mode = {REL8, END}, .size = 2},
{.opcode = 0x75, .extended = -1, .name = "jnz", .mode = {REL8, END}, .size = 2},
{.opcode = 0x76, .extended = -1, .name = "jna", .mode = {REL8, END}, .size = 2},
{.opcode = 0x77, .extended = -1, .name = "ja", .mode = {REL8, END}, .size = 2},
{.opcode = 0x78, .extended = -1, .name = "js", .mode = {REL8, END}, .size = 2},
{.opcode = 0x79, .extended = -1, .name = "jns", .mode = {REL8, END}, .size = 2},
{.opcode = 0x7A, .extended = -1, .name = "jpe", .mode = {REL8, END}, .size = 2},
{.opcode = 0x7B, .extended = -1, .name = "jpo", .mode = {REL8, END}, .size = 2},
{.opcode = 0x7C, .extended = -1, .name = "jl", .mode = {REL8, END}, .size = 2},
{.opcode = 0x7D, .extended = -1, .name = "jnl", .mode = {REL8, END}, .size = 2},
{.opcode = 0x7E, .extended = -1, .name = "jng", .mode = {REL8, END}, .size = 2},
{.opcode = 0x7F, .extended = -1, .name = "jg", .mode = {REL8, END}, .size = 2},
{.opcode = 0x80, .extended = 0, .name = "EXTENDED", .mode = {END}, .size = 1},
{.opcode = 0x81, .extended = 1, .name = "EXTENDED", .mode = {END}, .size = 1},
{.opcode = 0x83, .extended = 2, .name = "EXTENDED", .mode = {END}, .size = 1},
{.opcode = 0x84, .extended = -1, .name = "test", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x85, .extended = -1, .name = "test", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0x86, .extended = -1, .name = "xchg", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x87, .extended = -1, .name = "xchg", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0x88, .extended = -1, .name = "mov", .mode = {R_M8, REG8, END}, .size = 2},
{.opcode = 0x89, .extended = -1, .name = "mov", .mode = {R_M16, REG16, END}, .size = 2},
{.opcode = 0x8A, .extended = -1, .name = "mov", .mode = {REG8, R_M8, END}, .size = 2},
{.opcode = 0x8B, .extended = -1, .name = "mov", .mode = {REG16, R_M16, END}, .size = 3},
// {.opcode = 0x8C, .extended = -1, .name = "mov", .mode = {R_M16, sreg, END}, .size = 3},
{.opcode = 0x8D, .extended = -1, .name = "lea", .mode = {REG16, R_M16, END}, .size = 3},
// {.opcode = 0x8E, .extended = -1, .name = "mov", .mode = {sreg, R_M16, END}, .size = 3},
{.opcode = 0x8F, .extended = -1, .name = "pop", .mode = {R_M16, END}, .size = 3},
{.opcode = 0x90, .extended = -1, .name = "xchg ax,ax", .mode = {END}, .size = 1},
{.opcode = 0x91, .extended = -1, .name = "xchg cx,ax", .mode = {END}, .size = 1},
{.opcode = 0x92, .extended = -1, .name = "xchg dx,ax", .mode = {END}, .size = 1},
{.opcode = 0x93, .extended = -1, .name = "xchg bx,ax", .mode = {END}, .size = 1},
{.opcode = 0x94, .extended = -1, .name = "xchg sp,ax", .mode = {END}, .size = 1},
{.opcode = 0x95, .extended = -1, .name = "xchg bp,ax", .mode = {END}, .size = 1},
{.opcode = 0x96, .extended = -1, .name = "xchg si,ax", .mode = {END}, .size = 1},
{.opcode = 0x97, .extended = -1, .name = "xchg di,ax", .mode = {END}, .size = 1},
{.opcode = 0x98, .extended = -1, .name = "cbw", .mode = {END}, .size = 1},
{.opcode = 0x99, .extended = -1, .name = "cwd", .mode = {END}, .size = 1},
// {.opcode = 0x9A, .extended = -1, .name = "call", .mode = {CALL_INTER, END}, .size = 1},
{.opcode = 0x9B, .extended = -1, .name = "wait", .mode = {END}, .size = 1},
{.opcode = 0x9C, .extended = -1, .name = "pushf", .mode = {END}, .size = 1},
{.opcode = 0x9D, .extended = -1, .name = "popf", .mode = {END}, .size = 1},
{.opcode = 0x9E, .extended = -1, .name = "sahf", .mode = {END}, .size = 1},
{.opcode = 0x9F, .extended = -1, .name = "lahf", .mode = {END}, .size = 1},
// {.opcode = 0xA0, .extended = -1, .name = "mov al,%s", .mode = {moffs16, END}, .size = 1},
// {.opcode = 0xA1, .extended = -1, .name = "mov ax,%s", .mode = {moffs16, END}, .size = 1},
// {.opcode = 0xA2, .extended = -1, .name = "mov %s,al", .mode = {moffs16, END}, .size = 1},
// {.opcode = 0xA3, .extended = -1, .name = "mov %s,ax", .mode = {moffs16, END}, .size = 1},
{.opcode = 0xA4, .extended = -1, .name = "movsb", .mode = {END}, .size = 1},
{.opcode = 0xA5, .extended = -1, .name = "movsw", .mode = {END}, .size = 1},
{.opcode = 0xA6, .extended = -1, .name = "cmpsb", .mode = {END}, .size = 1},
{.opcode = 0xA7, .extended = -1, .name = "cmpsw", .mode = {END}, .size = 1},
{.opcode = 0xA8, .extended = -1, .name = "test al,", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xA9, .extended = -1, .name = "test ax,", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xAA, .extended = -1, .name = "stosb", .mode = {END}, .size = 1},
{.opcode = 0xAB, .extended = -1, .name = "stosw", .mode = {END}, .size = 1},
{.opcode = 0xAC, .extended = -1, .name = "lodsb", .mode = {END}, .size = 1},
{.opcode = 0xAD, .extended = -1, .name = "lodsw", .mode = {END}, .size = 1},
{.opcode = 0xAE, .extended = -1, .name = "scasb", .mode = {END}, .size = 1},
{.opcode = 0xAF, .extended = -1, .name = "scasw", .mode = {END}, .size = 1},
{.opcode = 0xB0, .extended = -1, .name = "mov al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB1, .extended = -1, .name = "mov cl", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB2, .extended = -1, .name = "mov dl", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB3, .extended = -1, .name = "mov bl", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB4, .extended = -1, .name = "mov ah", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB5, .extended = -1, .name = "mov ch", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB6, .extended = -1, .name = "mov dh", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB7, .extended = -1, .name = "mov bh", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xB8, .extended = -1, .name = "mov ax", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xB9, .extended = -1, .name = "mov cx", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xBA, .extended = -1, .name = "mov dx", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xBB, .extended = -1, .name = "mov bx", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xBC, .extended = -1, .name = "mov sp", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xBD, .extended = -1, .name = "mov bp", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xBE, .extended = -1, .name = "mov si", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xBF, .extended = -1, .name = "mov di", .mode = {IMM16, END}, .size = 3},
{.opcode = 0x3F, .extended = -1, .name = "ass", .mode = {END}},
{.opcode = 0x40, .extended = -1, .name = "inc ax", .mode = {END}},
{.opcode = 0x41, .extended = -1, .name = "inc cx", .mode = {END}},
{.opcode = 0x42, .extended = -1, .name = "inc dx", .mode = {END}},
{.opcode = 0x43, .extended = -1, .name = "inc bx", .mode = {END}},
{.opcode = 0x44, .extended = -1, .name = "inc sp", .mode = {END}},
{.opcode = 0x45, .extended = -1, .name = "inc bp", .mode = {END}},
{.opcode = 0x46, .extended = -1, .name = "inc si", .mode = {END}},
{.opcode = 0x47, .extended = -1, .name = "inc di", .mode = {END}},
{.opcode = 0x48, .extended = -1, .name = "dec ax", .mode = {END}},
{.opcode = 0x49, .extended = -1, .name = "dec cx", .mode = {END}},
{.opcode = 0x4A, .extended = -1, .name = "dec dx", .mode = {END}},
{.opcode = 0x4B, .extended = -1, .name = "dec bx", .mode = {END}},
{.opcode = 0x4C, .extended = -1, .name = "dec sp", .mode = {END}},
{.opcode = 0x4D, .extended = -1, .name = "dec bp", .mode = {END}},
{.opcode = 0x4E, .extended = -1, .name = "dec si", .mode = {END}},
{.opcode = 0x4F, .extended = -1, .name = "dec di", .mode = {END}},
{.opcode = 0x50, .extended = -1, .name = "push ax", .mode = {END}},
{.opcode = 0x51, .extended = -1, .name = "push cx", .mode = {END}},
{.opcode = 0x52, .extended = -1, .name = "push dx", .mode = {END}},
{.opcode = 0x53, .extended = -1, .name = "push bx", .mode = {END}},
{.opcode = 0x54, .extended = -1, .name = "push sp", .mode = {END}},
{.opcode = 0x55, .extended = -1, .name = "push bp", .mode = {END}},
{.opcode = 0x56, .extended = -1, .name = "push si", .mode = {END}},
{.opcode = 0x57, .extended = -1, .name = "push di", .mode = {END}},
{.opcode = 0x58, .extended = -1, .name = "pop ax", .mode = {END}},
{.opcode = 0x59, .extended = -1, .name = "pop cx", .mode = {END}},
{.opcode = 0x5A, .extended = -1, .name = "pop dx", .mode = {END}},
{.opcode = 0x5B, .extended = -1, .name = "pop bx", .mode = {END}},
{.opcode = 0x5C, .extended = -1, .name = "pop sp", .mode = {END}},
{.opcode = 0x5D, .extended = -1, .name = "pop bp", .mode = {END}},
{.opcode = 0x5E, .extended = -1, .name = "pop si", .mode = {END}},
{.opcode = 0x5F, .extended = -1, .name = "pop di", .mode = {END}},
{.opcode = 0x70, .extended = -1, .name = "jo", .mode = {REL8, END}},
{.opcode = 0x71, .extended = -1, .name = "jno", .mode = {REL8, END}},
{.opcode = 0x72, .extended = -1, .name = "jc", .mode = {REL8, END}},
{.opcode = 0x73, .extended = -1, .name = "jnc", .mode = {REL8, END}},
{.opcode = 0x74, .extended = -1, .name = "jz", .mode = {REL8, END}},
{.opcode = 0x75, .extended = -1, .name = "jnz", .mode = {REL8, END}},
{.opcode = 0x76, .extended = -1, .name = "jna", .mode = {REL8, END}},
{.opcode = 0x77, .extended = -1, .name = "ja", .mode = {REL8, END}},
{.opcode = 0x78, .extended = -1, .name = "js", .mode = {REL8, END}},
{.opcode = 0x79, .extended = -1, .name = "jns", .mode = {REL8, END}},
{.opcode = 0x7A, .extended = -1, .name = "jpe", .mode = {REL8, END}},
{.opcode = 0x7B, .extended = -1, .name = "jpo", .mode = {REL8, END}},
{.opcode = 0x7C, .extended = -1, .name = "jl", .mode = {REL8, END}},
{.opcode = 0x7D, .extended = -1, .name = "jnl", .mode = {REL8, END}},
{.opcode = 0x7E, .extended = -1, .name = "jng", .mode = {REL8, END}},
{.opcode = 0x7F, .extended = -1, .name = "jg", .mode = {REL8, END}},
{.opcode = 0x80, .extended = 0, .name = "EXTENDED", .mode = {END}},
{.opcode = 0x81, .extended = 1, .name = "EXTENDED", .mode = {END}},
{.opcode = 0x83, .extended = 2, .name = "EXTENDED", .mode = {END}},
{.opcode = 0x84, .extended = -1, .name = "test", .mode = {R_M8, REG8, END}},
{.opcode = 0x85, .extended = -1, .name = "test", .mode = {R_M16, REG16, END}},
{.opcode = 0x86, .extended = -1, .name = "xchg", .mode = {R_M8, REG8, END}},
{.opcode = 0x87, .extended = -1, .name = "xchg", .mode = {R_M16, REG16, END}},
{.opcode = 0x88, .extended = -1, .name = "mov", .mode = {R_M8, REG8, END}},
{.opcode = 0x89, .extended = -1, .name = "mov", .mode = {R_M16, REG16, END}},
{.opcode = 0x8A, .extended = -1, .name = "mov", .mode = {REG8, R_M8, END}},
{.opcode = 0x8B, .extended = -1, .name = "mov", .mode = {REG16, R_M16, END}},
// {.opcode = 0x8C, .extended = -1, .name = "mov", .mode = {R_M16, sreg, END}},
{.opcode = 0x8D, .extended = -1, .name = "lea", .mode = {REG16, R_M16, END}},
// {.opcode = 0x8E, .extended = -1, .name = "mov", .mode = {sreg, R_M16, END}},
{.opcode = 0x8F, .extended = -1, .name = "pop", .mode = {R_M16, END}},
{.opcode = 0x90, .extended = -1, .name = "xchg ax,ax", .mode = {END}},
{.opcode = 0x91, .extended = -1, .name = "xchg cx,ax", .mode = {END}},
{.opcode = 0x92, .extended = -1, .name = "xchg dx,ax", .mode = {END}},
{.opcode = 0x93, .extended = -1, .name = "xchg bx,ax", .mode = {END}},
{.opcode = 0x94, .extended = -1, .name = "xchg sp,ax", .mode = {END}},
{.opcode = 0x95, .extended = -1, .name = "xchg bp,ax", .mode = {END}},
{.opcode = 0x96, .extended = -1, .name = "xchg si,ax", .mode = {END}},
{.opcode = 0x97, .extended = -1, .name = "xchg di,ax", .mode = {END}},
{.opcode = 0x98, .extended = -1, .name = "cbw", .mode = {END}},
{.opcode = 0x99, .extended = -1, .name = "cwd", .mode = {END}},
// {.opcode = 0x9A, .extended = -1, .name = "call", .mode = {CALL_INTER, END}},
{.opcode = 0x9B, .extended = -1, .name = "wait", .mode = {END}},
{.opcode = 0x9C, .extended = -1, .name = "pushf", .mode = {END}},
{.opcode = 0x9D, .extended = -1, .name = "popf", .mode = {END}},
{.opcode = 0x9E, .extended = -1, .name = "sahf", .mode = {END}},
{.opcode = 0x9F, .extended = -1, .name = "lahf", .mode = {END}},
// {.opcode = 0xA0, .extended = -1, .name = "mov al,%s", .mode = {moffs16, END}},
// {.opcode = 0xA1, .extended = -1, .name = "mov ax,%s", .mode = {moffs16, END}},
// {.opcode = 0xA2, .extended = -1, .name = "mov %s,al", .mode = {moffs16, END}},
// {.opcode = 0xA3, .extended = -1, .name = "mov %s,ax", .mode = {moffs16, END}},
{.opcode = 0xA4, .extended = -1, .name = "movsb", .mode = {END}},
{.opcode = 0xA5, .extended = -1, .name = "movsw", .mode = {END}},
{.opcode = 0xA6, .extended = -1, .name = "cmpsb", .mode = {END}},
{.opcode = 0xA7, .extended = -1, .name = "cmpsw", .mode = {END}},
{.opcode = 0xA8, .extended = -1, .name = "test al,", .mode = {IMM8, END}},
{.opcode = 0xA9, .extended = -1, .name = "test ax,", .mode = {IMM16, END}},
{.opcode = 0xAA, .extended = -1, .name = "stosb", .mode = {END}},
{.opcode = 0xAB, .extended = -1, .name = "stosw", .mode = {END}},
{.opcode = 0xAC, .extended = -1, .name = "lodsb", .mode = {END}},
{.opcode = 0xAD, .extended = -1, .name = "lodsw", .mode = {END}},
{.opcode = 0xAE, .extended = -1, .name = "scasb", .mode = {END}},
{.opcode = 0xAF, .extended = -1, .name = "scasw", .mode = {END}},
{.opcode = 0xB0, .extended = -1, .name = "mov al", .mode = {IMM8, END}},
{.opcode = 0xB1, .extended = -1, .name = "mov cl", .mode = {IMM8, END}},
{.opcode = 0xB2, .extended = -1, .name = "mov dl", .mode = {IMM8, END}},
{.opcode = 0xB3, .extended = -1, .name = "mov bl", .mode = {IMM8, END}},
{.opcode = 0xB4, .extended = -1, .name = "mov ah", .mode = {IMM8, END}},
{.opcode = 0xB5, .extended = -1, .name = "mov ch", .mode = {IMM8, END}},
{.opcode = 0xB6, .extended = -1, .name = "mov dh", .mode = {IMM8, END}},
{.opcode = 0xB7, .extended = -1, .name = "mov bh", .mode = {IMM8, END}},
{.opcode = 0xB8, .extended = -1, .name = "mov ax", .mode = {IMM16, END}},
{.opcode = 0xB9, .extended = -1, .name = "mov cx", .mode = {IMM16, END}},
{.opcode = 0xBA, .extended = -1, .name = "mov dx", .mode = {IMM16, END}},
{.opcode = 0xBB, .extended = -1, .name = "mov bx", .mode = {IMM16, END}},
{.opcode = 0xBC, .extended = -1, .name = "mov sp", .mode = {IMM16, END}},
{.opcode = 0xBD, .extended = -1, .name = "mov bp", .mode = {IMM16, END}},
{.opcode = 0xBE, .extended = -1, .name = "mov si", .mode = {IMM16, END}},
{.opcode = 0xBF, .extended = -1, .name = "mov di", .mode = {IMM16, END}},
{.opcode = 0xC2, .extended = -1, .name = "ret", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xC3, .extended = -1, .name = "ret", .mode = {END}, .size = 1},
{.opcode = 0xC4, .extended = -1, .name = "les", .mode = {REG16, R_M16, END}, .size = 3},
{.opcode = 0xC5, .extended = -1, .name = "lds", .mode = {R_M16, REG16, END}, .size = 3},
{.opcode = 0xC6, .extended = -1, .name = "mov", .mode = {R_M16, IMM8, END}, .size = 4},
{.opcode = 0xC7, .extended = -1, .name = "mov", .mode = {R_M16, IMM16, END}, .size = 5},
{.opcode = 0xCA, .extended = -1, .name = "retf", .mode = {IMM16, END}, .size = 3},
{.opcode = 0xCB, .extended = -1, .name = "retf", .mode = {END}, .size = 1},
{.opcode = 0xCC, .extended = -1, .name = "int3", .mode = {END}, .size = 1},
{.opcode = 0xCD, .extended = -1, .name = "int", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xCE, .extended = -1, .name = "into", .mode = {END}, .size = 1},
{.opcode = 0xCF, .extended = -1, .name = "iret", .mode = {END}, .size = 1},
{.opcode = 0xC2, .extended = -1, .name = "ret", .mode = {IMM16, END}},
{.opcode = 0xC3, .extended = -1, .name = "ret", .mode = {END}},
{.opcode = 0xC4, .extended = -1, .name = "les", .mode = {REG16, R_M16, END}},
{.opcode = 0xC5, .extended = -1, .name = "lds", .mode = {R_M16, REG16, END}},
{.opcode = 0xC6, .extended = -1, .name = "mov", .mode = {R_M16, IMM8, END}},
{.opcode = 0xC7, .extended = -1, .name = "mov", .mode = {R_M16, IMM16, END}},
{.opcode = 0xCA, .extended = -1, .name = "retf", .mode = {IMM16, END}},
{.opcode = 0xCB, .extended = -1, .name = "retf", .mode = {END}},
{.opcode = 0xCC, .extended = -1, .name = "int3", .mode = {END}},
{.opcode = 0xCD, .extended = -1, .name = "int", .mode = {IMM8, END}},
{.opcode = 0xCE, .extended = -1, .name = "into", .mode = {END}},
{.opcode = 0xCF, .extended = -1, .name = "iret", .mode = {END}},
{.opcode = 0xD4, .extended = -1, .name = "aam", .mode = {END}, .size = 1},
{.opcode = 0xD5, .extended = -1, .name = "aad", .mode = {END}, .size = 1},
{.opcode = 0xD7, .extended = -1, .name = "xlatb", .mode = {END}, .size = 1},
{.opcode = 0xD4, .extended = -1, .name = "aam", .mode = {END}},
{.opcode = 0xD5, .extended = -1, .name = "aad", .mode = {END}},
{.opcode = 0xD7, .extended = -1, .name = "xlatb", .mode = {END}},
{.opcode = 0xE0, .extended = -1, .name = "loopne", .mode = {REL8, END}, .size = 2},
{.opcode = 0xE1, .extended = -1, .name = "loope", .mode = {REL8, END}, .size = 2},
{.opcode = 0xE2, .extended = -1, .name = "loop", .mode = {REL8, END}, .size = 2},
{.opcode = 0xE3, .extended = -1, .name = "jcxz", .mode = {REL8, END}, .size = 2},
{.opcode = 0xE4, .extended = -1, .name = "in al,%s", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xE5, .extended = -1, .name = "in ax,%s", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xE6, .extended = -1, .name = "out %s,al", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xE7, .extended = -1, .name = "out %s,ax", .mode = {IMM8, END}, .size = 2},
{.opcode = 0xE8, .extended = -1, .name = "call", .mode = {REL16, END}, .size = 3},
{.opcode = 0xE9, .extended = -1, .name = "jmp", .mode = {REL16, END}, .size = 3},
// {.opcode = 0xEA, .extended = -1, .name = "jmp", .mode = {CALL_INTER, END}, .size = 1},
{.opcode = 0xEB, .extended = -1, .name = "jmp short", .mode = {REL8, END}, .size = 2},
{.opcode = 0xEC, .extended = -1, .name = "in al,dx", .mode = {END}, .size = 1},
{.opcode = 0xED, .extended = -1, .name = "in ax,dx", .mode = {END}, .size = 1},
{.opcode = 0xEE, .extended = -1, .name = "out dx,al", .mode = {END}, .size = 1},
{.opcode = 0xEF, .extended = -1, .name = "out dx,ax", .mode = {END}, .size = 1},
{.opcode = 0xF0, .extended = -1, .name = "lock", .mode = {END}, .size = 1},
{.opcode = 0xF2, .extended = -1, .name = "repne", .mode = {END}, .size = 1},
{.opcode = 0xF3, .extended = -1, .name = "rep", .mode = {END}, .size = 1},
{.opcode = 0xF4, .extended = -1, .name = "hlt", .mode = {END}, .size = 1},
{.opcode = 0xF5, .extended = -1, .name = "cmc", .mode = {END}, .size = 1},
{.opcode = 0xE0, .extended = -1, .name = "loopne", .mode = {REL8, END}},
{.opcode = 0xE1, .extended = -1, .name = "loope", .mode = {REL8, END}},
{.opcode = 0xE2, .extended = -1, .name = "loop", .mode = {REL8, END}},
{.opcode = 0xE3, .extended = -1, .name = "jcxz", .mode = {REL8, END}},
{.opcode = 0xE4, .extended = -1, .name = "in al,%s", .mode = {IMM8, END}},
{.opcode = 0xE5, .extended = -1, .name = "in ax,%s", .mode = {IMM8, END}},
{.opcode = 0xE6, .extended = -1, .name = "out %s,al", .mode = {IMM8, END}},
{.opcode = 0xE7, .extended = -1, .name = "out %s,ax", .mode = {IMM8, END}},
{.opcode = 0xE8, .extended = -1, .name = "call", .mode = {REL16, END}},
{.opcode = 0xE9, .extended = -1, .name = "jmp", .mode = {REL16, END}},
// {.opcode = 0xEA, .extended = -1, .name = "jmp", .mode = {CALL_INTER, END}},
{.opcode = 0xEB, .extended = -1, .name = "jmp short", .mode = {REL8, END}},
{.opcode = 0xEC, .extended = -1, .name = "in al,dx", .mode = {END}},
{.opcode = 0xED, .extended = -1, .name = "in ax,dx", .mode = {END}},
{.opcode = 0xEE, .extended = -1, .name = "out dx,al", .mode = {END}},
{.opcode = 0xEF, .extended = -1, .name = "out dx,ax", .mode = {END}},
{.opcode = 0xF0, .extended = -1, .name = "lock", .mode = {END}},
{.opcode = 0xF2, .extended = -1, .name = "repne", .mode = {END}},
{.opcode = 0xF3, .extended = -1, .name = "rep", .mode = {END}},
{.opcode = 0xF4, .extended = -1, .name = "hlt", .mode = {END}},
{.opcode = 0xF5, .extended = -1, .name = "cmc", .mode = {END}},
{.opcode = 0xF8, .extended = -1, .name = "clc", .mode = {END}, .size = 1},
{.opcode = 0xF9, .extended = -1, .name = "stc", .mode = {END}, .size = 1},
{.opcode = 0xFA, .extended = -1, .name = "cli", .mode = {END}, .size = 1},
{.opcode = 0xFB, .extended = -1, .name = "sti", .mode = {END}, .size = 1},
{.opcode = 0xFC, .extended = -1, .name = "cld", .mode = {END}, .size = 1},
{.opcode = 0xFD, .extended = -1, .name = "std", .mode = {END}, .size = 1},
{.opcode = 0xF8, .extended = -1, .name = "clc", .mode = {END}},
{.opcode = 0xF9, .extended = -1, .name = "stc", .mode = {END}},
{.opcode = 0xFA, .extended = -1, .name = "cli", .mode = {END}},
{.opcode = 0xFB, .extended = -1, .name = "sti", .mode = {END}},
{.opcode = 0xFC, .extended = -1, .name = "cld", .mode = {END}},
{.opcode = 0xFD, .extended = -1, .name = "std", .mode = {END}},
{.name = NULL}
};
@@ -230,38 +230,38 @@ const instruction_t instructions[] = {
const instruction_t extended[][8] = {
// 0x80 extended
{
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x01, .extended = -1, .name = "or", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x02, .extended = -1, .name = "adc", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x03, .extended = -1, .name = "sbb", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x04, .extended = -1, .name = "and", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x05, .extended = -1, .name = "sub", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x06, .extended = -1, .name = "xor", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x07, .extended = -1, .name = "cmp", .mode = {R_M8, IMM8, END}, .size = 2},
{.opcode = 0x00, .extended = -2, .name = "add", .mode = {R_M8, IMM8, END}},
{.opcode = 0x01, .extended = -2, .name = "or", .mode = {R_M8, IMM8, END}},
{.opcode = 0x02, .extended = -2, .name = "adc", .mode = {R_M8, IMM8, END}},
{.opcode = 0x03, .extended = -2, .name = "sbb", .mode = {R_M8, IMM8, END}},
{.opcode = 0x04, .extended = -2, .name = "and", .mode = {R_M8, IMM8, END}},
{.opcode = 0x05, .extended = -2, .name = "sub", .mode = {R_M8, IMM8, END}},
{.opcode = 0x06, .extended = -2, .name = "xor", .mode = {R_M8, IMM8, END}},
{.opcode = 0x07, .extended = -2, .name = "cmp", .mode = {R_M8, IMM8, END}},
},
// 0x81 extended
{
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x01, .extended = -1, .name = "or", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x02, .extended = -1, .name = "adc", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x03, .extended = -1, .name = "sbb", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x04, .extended = -1, .name = "and", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x05, .extended = -1, .name = "sub", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x06, .extended = -1, .name = "xor", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x07, .extended = -1, .name = "cmp", .mode = {R_M16, IMM16, END}, .size = 3},
{.opcode = 0x00, .extended = -2, .name = "add", .mode = {R_M16, IMM16, END}},
{.opcode = 0x01, .extended = -2, .name = "or", .mode = {R_M16, IMM16, END}},
{.opcode = 0x02, .extended = -2, .name = "adc", .mode = {R_M16, IMM16, END}},
{.opcode = 0x03, .extended = -2, .name = "sbb", .mode = {R_M16, IMM16, END}},
{.opcode = 0x04, .extended = -2, .name = "and", .mode = {R_M16, IMM16, END}},
{.opcode = 0x05, .extended = -2, .name = "sub", .mode = {R_M16, IMM16, END}},
{.opcode = 0x06, .extended = -2, .name = "xor", .mode = {R_M16, IMM16, END}},
{.opcode = 0x07, .extended = -2, .name = "cmp", .mode = {R_M16, IMM16, END}},
},
// 0x83 extended
{
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M16, IMM8, END}, .size = 3},
{.opcode = 0x01, .extended = -1, .name = "invalid", .mode = {END}, .size = 1},
{.opcode = 0x02, .extended = -1, .name = "adc", .mode = {R_M16, IMM8, END}, .size = 3},
{.opcode = 0x03, .extended = -1, .name = "sbb", .mode = {R_M16, IMM8, END}, .size = 3},
{.opcode = 0x04, .extended = -1, .name = "invalid", .mode = {END}, .size = 1},
{.opcode = 0x05, .extended = -1, .name = "sub", .mode = {R_M16, IMM8, END}, .size = 3},
{.opcode = 0x06, .extended = -1, .name = "invalid", .mode = {END}, .size = 1},
{.opcode = 0x07, .extended = -1, .name = "cmp", .mode = {R_M16, IMM8, END}, .size = 3},
{.opcode = 0x00, .extended = -2, .name = "add", .mode = {R_M16, IMM8, END}},
{.opcode = 0x01, .extended = -2, .name = "invalid", .mode = {END}},
{.opcode = 0x02, .extended = -2, .name = "adc", .mode = {R_M16, IMM8, END}},
{.opcode = 0x03, .extended = -2, .name = "sbb", .mode = {R_M16, IMM8, END}},
{.opcode = 0x04, .extended = -2, .name = "invalid", .mode = {END}},
{.opcode = 0x05, .extended = -2, .name = "sub", .mode = {R_M16, IMM8, END}},
{.opcode = 0x06, .extended = -2, .name = "invalid", .mode = {END}},
{.opcode = 0x07, .extended = -2, .name = "cmp", .mode = {R_M16, IMM8, END}},
},
};
const instruction_t invalid_instruction = { .opcode = 0xFF, .name = "unknown", .mode = {END}, .size = 1 };
const instruction_t invalid_instruction = { .opcode = 0xFF, .name = "unknown", .mode = {END}};