Implemented more instructions...

This commit is contained in:
xolatile
2024-07-17 12:02:34 -04:00
parent 913c9b88a8
commit 0805c27e16
2 changed files with 50 additions and 32 deletions

View File

@ -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]);

View File

@ -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,