From ea17cffaef52cfc4e79ba8abf802faa779682259 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 1 Jun 2023 16:49:13 +0900 Subject: [PATCH] Rework instructions size handling --- src/dasm.c | 154 +++++++++------ src/dasm.h | 1 - src/instructions.c | 474 ++++++++++++++++++++++----------------------- 3 files changed, 333 insertions(+), 296 deletions(-) diff --git a/src/dasm.c b/src/dasm.c index 0c728e1..2d7c831 100644 --- a/src/dasm.c +++ b/src/dasm.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -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; } diff --git a/src/dasm.h b/src/dasm.h index cc81bc0..d1ea507 100644 --- a/src/dasm.h +++ b/src/dasm.h @@ -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; diff --git a/src/instructions.c b/src/instructions.c index 89b2e76..bfc39df 100644 --- a/src/instructions.c +++ b/src/instructions.c @@ -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}};