diff --git a/code/duffle/math.h b/code/duffle/math.h index 4914623..119ef64 100644 --- a/code/duffle/math.h +++ b/code/duffle/math.h @@ -18,6 +18,7 @@ typedef Struct_(R1_U2){ U2 p0; U2 p1; }; typedef Struct_(R1_U4){ U4 p0; U2 p1; }; typedef Struct_(R1_U8){ U8 p0; U8 p1; }; +#define r1u4(p0,p1) (R1_U4){p0,p1} #define r1u8(p0,p1) (R1_U8){p0,p1} typedef Struct_(V2_U1){ U1 x; U1 y;}; diff --git a/code/duffle/memory.h b/code/duffle/memory.h index 8ec9196..3e8c33f 100644 --- a/code/duffle/memory.h +++ b/code/duffle/memory.h @@ -68,6 +68,7 @@ typedef Struct_(Str8) { UTF8* ptr; U8 len; }; typedef Str8 Slice_UTF8; typedef Struct_(Slice_Str8) { Str8* ptr; U8 len; }; #define slit8(string_literal) (Str8){ (UTF8*) string_literal, S_(string_literal) - 1 } +#define str8(p,l) (Str8){p,l} typedef Struct_(Slice) { U8 ptr; U8 len; }; // Untyped Slice FI_ Slice slice_ut_(U8 ptr, U8 len) { return (Slice){ptr, len}; } diff --git a/code/part_1/sim_8086.c b/code/part_1/sim_8086.c index c868c50..d292cc1 100644 --- a/code/part_1/sim_8086.c +++ b/code/part_1/sim_8086.c @@ -10,6 +10,55 @@ #include "duffle/win32.h" +typedef Struct_(U2_HL) { U1 Low; U1 High; }; + +#define bitmask_(pos) (1 << pos) +#define bit_isolate(bitfield, pos) (bitmask_(pos) & value) + +#define serialize_bit(bitfield, pos) (bit_isolate(bitfield, pos) == bitmask_(pos) ? '1' : '0') + +typedef Enum_(U4, Endieaness) { + Little, + Big, +}; + +FI_ void a8utf8_from_u1_le(UTF8 out[8], U1 value) { + out[0] = serialize_bit(value, 7); + out[1] = serialize_bit(value, 6); + out[2] = serialize_bit(value, 5); + out[3] = serialize_bit(value, 4); + out[4] = serialize_bit(value, 3); + out[5] = serialize_bit(value, 2); + out[6] = serialize_bit(value, 1); + out[7] = serialize_bit(value, 0); +} +FI_ void a8utf8_from_u1_be(UTF8 out[8], U1 value) { + out[0] = serialize_bit(value, 0); + out[1] = serialize_bit(value, 1); + out[2] = serialize_bit(value, 2); + out[3] = serialize_bit(value, 3); + out[4] = serialize_bit(value, 4); + out[5] = serialize_bit(value, 5); + out[6] = serialize_bit(value, 6); + out[7] = serialize_bit(value, 7); +} + +I_ U4 binary_as_str8_eval_len(Slice_U1 data) { return data.len * 8; } + +#define jump_lt(a,b,label) if (a < b) goto label + +I_ Str8 binary_as_str8(Slice_U1 data, FArena* str8_mem) { Str8 result = {0}; + U4 req_len = data.len * 8; jump_lt(str8_mem->capacity,req_len, jret); + result = farena_push_array(str8_mem, UTF8, req_len); + for index_iter(U4,cursor, 0,<,req_len) { a8utf8_from_u1_le(result.ptr + cursor, data.ptr[cursor]); } + jret: return result; +} + +typedef Enum_(U4, x86_Op) { + x86_mov +}; + + enum { Scratchpad_Len = kilo(1), FileRam_Len = kilo(16),