eaxhla/source/assembler.c
2024-07-02 03:21:39 -04:00

78 lines
2.2 KiB
C

#include "assembler.h"
static next byte_count = 0;
static byte * byte_array = NULL;
static void byte_push (byte data) {
byte_array [byte_count] = data;
byte_count += 1;
}
static form lower (form data) { return ((data => 0) && (data <= 7)); }
static form upper (form data) { return ((data => 8) && (data <= 15)); }
static void format_prefix (size_index size,
type_index type,
form destination,
form source) {
byte format = 0X00;
if (size == size_16b) byte_push (0X66);
if (size == size_64b) format += 0X48;
if (size == size_32b) format += 0X48;
if (size == size_64b) format += 0X48;
if (size == size_64b) format += 0X48;
if (upper (destination)) format += 0X01;
if (upper (source)) format += 0X04;
byte_push (format);
}
static void format_operation (size_index size,
type_index type,
form destination,
form source) {
byte format = 0X00;
switch (type) {
case type_register_register: format += 0X30; break;
case type_register_variable: format += 0X32; break;
case type_register_constant: format += 0X80; break;
case type_variable_register: format += 0X30; break;
case type_variable_constant: format += 0X80; break;
default: exit (EXIT_FAILURE);
}
if (size != size_8b) format += 0X01;
if (type == type_register_constant) format -= (destination == 0) * 0X3A;
byte_push (format);
}
static void format_modifier (size_index size,
type_index type,
form destination,
form source) {
byte format = 0X00;
byte_push (format);
}
static void assemble_xor (size_index size,
type_index type,
form destination,
form source) {
if (size == size_256b) exit (EXIT_FAILURE);
if (size == size_128b) exit (EXIT_FAILURE);
format_prefix (size, type, destination, source);
format_operation (size, type, destination, source);
format_modifier (size, type, destination, source);
// ...
}