diff --git a/source/assembler.c b/source/assembler.c index db8200e..ea46731 100644 --- a/source/assembler.c +++ b/source/assembler.c @@ -10,7 +10,7 @@ #define SPECIAL_1_BEGIN (NOP) #define SPECIAL_1_END (PUSHF) #define SPECIAL_2_BEGIN (SYSENTER) -#define SPECIAL_2_END (CPUID) +#define SPECIAL_2_END (EMMS) #define JUMP_IF_BEGIN (JO) #define JUMP_IF_END (JG) #define MOVE_IF_BEGIN (CMOVO) @@ -144,7 +144,7 @@ static void build_regular (operation_index operation, next destination, type_index from, next source) { - // 00-3F : add, or, adc, sbb, and, sub, xor, cmp + // 00-3F : add, or, adc, sbb, and, sub, xor, cmp; build_short_prefix (size == D16); build_long_prefix (size == D64, @@ -194,7 +194,7 @@ static void build_irregular (operation_index operation, size_index size, type_index to, next destination) { - // F0-FF : inc, dec, not, neg, mul, imul, div, idiv + // F0-FF : inc, dec, not, neg, mul, imul, div, idiv; build_short_prefix (size == D16); build_long_prefix (size == D64, @@ -219,7 +219,7 @@ static void build_irregular (operation_index operation, } static void build_special_1 (operation_index operation) { - // nop, retn, retf, leave, lock, hlt, popf, pushf + // XX : nop, retn, retf, leave, lock, hlt, popf, pushf; const byte data [1 * SPECIAL_1_COUNT] = { 0x90, 0xc3, 0xcb, 0xc9, 0xf0, 0xf4, 0x9d, 0x9c }; @@ -228,10 +228,10 @@ static void build_special_1 (operation_index operation) { } static void build_special_2 (operation_index operation) { - // sysenter, sysleave, syscall, sysret, pause, cpuid + // XX XX : sysenter, sysleave, syscall, sysret, pause, cpuid, emms; const byte data [2 * SPECIAL_2_COUNT] = { - 0x0f, 0x0f, 0x0f, 0x0f, 0xf3, 0x0f, - 0x34, 0x35, 0x05, 0x07, 0x90, 0xa2 + 0x0f, 0x0f, 0x0f, 0x0f, 0xf3, 0x0f, 0x0f, + 0x34, 0x35, 0x05, 0x07, 0x90, 0xa2, 0x77 }; input (1, data [operation - SPECIAL_2_BEGIN]); @@ -337,20 +337,32 @@ static void build_call (type_index from, input (from == REG, (byte) (0xd0 + 0x01 * (source & 0x07))); } -/* -static void build_enter (type_index from, - next source) { + +static void build_enter (next dynamic_storage, + next nesting_level) { // enter - input ((from == REG) && (upper ((form) source)), (byte) 0x41); + input (1, (byte) 0xc8); - input (from == REL, (byte) 0xe8); - input (from == REG, (byte) 0xff); - - input_at (from == REL, D32, source, (next) -(text_sector_size + 4)); - - input (from == REG, (byte) (0xd0 + 0x01 * (source & 0x07))); + input_by (1, D16, dynamic_storage); + input_by (1, D8, nesting_level & (next) 0x1f); } -*/ + +static void build_in_out (form move, + size_index size, + type_index type, + next port) { + // E4-EF : in, out; + build_short_prefix (size == D16); + + input (1, + (byte) 0xe4 + + 0x01 * (size != D8) + + 0x02 * (move != OUT) + + 0x08 * (type == REG)); + + input_by (type == IMM, D8, port); +} + static void build_pop (size_index size, type_index to, next destination) { @@ -479,6 +491,13 @@ void assemble (next count, } else if (array [index] == CALL) { build_call (array [index + 1], array [index + 2]); index += 2; + } else if (array [index] == ENTER) { + build_enter (array [index + 1], array [index + 2]); + index += 2; + } else if ((array [index] == IN) || (array [index] == OUT)) { + build_in_out (array [index + 0], array [index + 1], + array [index + 2], array [index + 3]); + index += 3; } else if (array [index] == POP) { build_pop (array [index + 1], array [index + 2], array [index + 3]); diff --git a/source/assembler.h b/source/assembler.h index 53a4d1e..2dedafa 100644 --- a/source/assembler.h +++ b/source/assembler.h @@ -4,7 +4,6 @@ typedef signed int form; typedef unsigned int next; typedef unsigned char byte; -// XXX: we could be using binary literals IF SOMEONE WERE WILLING TO UPGRADE HIS GRANNY SYSTEM typedef enum { D8 = 0, D16 = 1, @@ -17,37 +16,37 @@ typedef enum { } type_index; typedef enum { - ASMDIRMEM, // Assembler directive: >LABEL '"goto" clabel;' - ASMDIRREL, // Assembler directive: LABEL: 'clabel:' - ASMDIRIMM, // Assembler directive: D8-D64 {REDO} {DATA} - ASMDIRREP, // Assembler directive: ... - /* HIGHLY EXPERIMENTAL CODE ABOVE... */ + ASMDIRMEM, // Assembler directive: Insert label location. + ASMDIRREL, // Assembler directive: Insert relative location. + ASMDIRIMM, // Assembler directive: Append immediate. + ASMDIRREP, // Assembler directive: -- + // ADD, OR, ADC, SBB, AND, SUB, XOR, CMP, - /* */ + // INC, DEC, NOT, NEG, MUL, IMUL, DIV, IDIV, - /* */ + // NOP, RETN, RETF, LEAVE, LOCK, HLT, POPF, PUSHF, - /* */ + // SYSENTER, SYSEXIT, SYSCALL, SYSRET, - PAUSE, CPUID, - /* */ + PAUSE, CPUID, EMMS, + // ENTER, CALL, IN, OUT, - /* */ + // JMP, JO, JNO, JB, JAE, JE, JNE, JBE, JA, JS, JNS, JPE, JPO, JL, JGE, JLE, JG, - /* */ + // MOV, CMOVO, CMOVNO, CMOVB, CMOVAE, CMOVE, CMOVNE, CMOVBE, CMOVA, CMOVS, CMOVNS, CMOVPE, CMOVPO, CMOVL, CMOVGE, CMOVLE, CMOVG, - /* */ + // PUSH, POP, BSWAP, TEST, RCL, RCR, ROL, ROR, SHL, SHR, SAL, SAR,