diff --git a/1-3/8086coded b/1-3/8086coded index 7bb3890..c6abd92 100755 Binary files a/1-3/8086coded and b/1-3/8086coded differ diff --git a/1-3/decoder.c b/1-3/decoder.c index ffcb8d8..ef27787 100644 --- a/1-3/decoder.c +++ b/1-3/decoder.c @@ -17,6 +17,48 @@ /* CMP = 0b111, */ /* } ARITHMETIC_OP; */ +typedef enum COND_JMP_OPC +{ + JX = 0b0111, + LOOPX = 0b1110'00, + +} JMP_OPC; + +typedef enum LOOPX_INST +{ + LOOP = 0b10, + LOOPZ = 0b01, + LOOPNZ = 0b00, + JCXZ = 0b11 +} LOOPX_INST; + +#define LOOPX_INST_TXT_LEN 7 +char LOOPX_INST_TXT[0b100][LOOPX_INST_TXT_LEN] = { "loopnz", "loopz", "loop", "jcxz" }; + +typedef enum JX_INST +{ + JZ = 0b0100, + JL = 0b1100, + JLE = 0b1110, + JB = 0b0010, + JBE = 0b0110, + JP = 0b1010, + JO = 0b0000, + JS = 0b1000, + JNE = 0b0101, + JNL = 0b1101, + JNLE = 0b1111, + JNB = 0b0011, + JNBE = 0b0111, + JNP = 0b1011, + JNO = 0b0001, + JNS = 0b1001, +} JX_INST; + +#define JX_INST_TXT_LEN 5 +char JX_INST_TXT[0b10000][JX_INST_TXT_LEN] = { "jo", "jno", "jb", "jnb", "jz", "jne", "jbe", "jnbe", + "js", "jns", "jp", "jnp", "jl", "jnl", "jle", "jnle" }; + typedef enum ARITHMETIC_OP { ADD = 0b000, @@ -351,7 +393,7 @@ int16_t calc_effective_disp(uint8_t high_order, uint8_t low_order, bool lo_only) const uint8_t low_order_neg_mask = 0b1000'0000; int16_t effective_disp = 0; - if (lo_only & ((low_order & low_order_neg_mask) >> 7)) + if (lo_only && ((low_order & low_order_neg_mask) >> 7)) high_order = high_order | 0b1111'1111; int8_t *effective_disp_high_order =(int8_t*) &(effective_disp) + 1; memcpy(&(effective_disp), &low_order, 1); @@ -682,14 +724,14 @@ int ASC_I_RM_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_ effective_disp = calc_effective_disp(high_disp, low_disp, false); low_data = payload[2]; - if (is_wide) + if (is_wide && !is_sign) { high_data = payload[3]; effective_data = calc_effective_disp(high_data, low_data, false); } else { - effective_data = calc_effective_disp(0, low_disp, true); + effective_data = calc_effective_disp(0, low_data, true); } fill_ea_string(&mem_data, EA_ENCODING_TXT[ea_table_value], effective_disp); @@ -828,6 +870,23 @@ int ASC_REGM_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int byte return extra_bytes_read; } +void JMP_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_read, JMP_OPC op) +{ + const uint8_t loopx_mask = 0b0000'0011; + const uint8_t jx_mask = 0b0000'1111; + int8_t disp = 0; + memcpy(&disp, &byte2, sizeof(uint8_t)); + uint8_t jump_op = (op == LOOPX) ? (byte1 & loopx_mask) : (byte1 & jx_mask); + + char nasm_offset[4] = { "\0" }; + if (!disp) strcpy(nasm_offset, "$+"); + else strcpy(nasm_offset, "$+2"); + + //We have to add +2 to displacement so that NASM can parse displacements correctly + printf("%s %s%+d \n", (op == LOOPX) ? LOOPX_INST_TXT[jump_op] : JX_INST_TXT[jump_op], nasm_offset, disp); + fprintf(output, "%s %s%+d \n", (op == LOOPX) ? LOOPX_INST_TXT[jump_op] : JX_INST_TXT[jump_op], nasm_offset, disp); +} + int main(int argc, char** argv) { if (argc != 2) return -1; @@ -848,8 +907,9 @@ int main(int argc, char** argv) fread(byte, sizeof(byte), 1, bin.binary); uint8_t manip_inst = (uint8_t)byte[0]; uint8_t inst = (uint8_t)byte[0]; - //First, we check for ASC. + //First, we check for ASC or JMPs. manip_inst = (manip_inst >> 1); + if ((manip_inst & ASC_I_A_M) == ASC_I_A) { if (bytes_read >= bin.size) break; @@ -860,6 +920,15 @@ int main(int argc, char** argv) continue; } manip_inst = (inst >> 2); + if (manip_inst == LOOPX) + { + if (bytes_read >= bin.size) break; + fread(byte, sizeof(byte), 1, bin.binary); + bytes_read++; + inst_byte2 = (uint8_t)byte[0]; + JMP_parse(inst, inst_byte2, 0, 0, LOOPX); + continue; + } if ((manip_inst & ASC_REGM_R_M) == ASC_REGM_R) { if (bytes_read >= bin.size) break; @@ -877,7 +946,17 @@ int main(int argc, char** argv) inst_byte2 = (uint8_t)byte[0]; bytes_read += ASC_I_RM_parse(inst, inst_byte2, 0, 0); continue; - } + } + manip_inst = (inst >> 4); + if (manip_inst == JX) + { + if (bytes_read >= bin.size) break; + fread(byte, sizeof(byte), 1, bin.binary); + bytes_read++; + inst_byte2 = (uint8_t)byte[0]; + JMP_parse(inst, inst_byte2, 0, 0, JX); + continue; + } //Then, we're checking for all MOV except segment registers manip_inst = (inst >> 1); switch (manip_inst) diff --git a/1-3/listing-41 b/1-3/listing-41 index b63415c..e4bbcb1 100644 Binary files a/1-3/listing-41 and b/1-3/listing-41 differ diff --git a/1-3/listing-41.asm b/1-3/listing-41.asm index ff97df4..0e64495 100644 --- a/1-3/listing-41.asm +++ b/1-3/listing-41.asm @@ -1,26 +1,10 @@ -; ======================================================================== +;bits 16 ; -; (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved. -; -; This software is provided 'as-is', without any express or implied -; warranty. In no event will the authors be held liable for any damages -; arising from the use of this software. -; -; Please see https://computerenhance.com for further information -; -; ======================================================================== - -; ======================================================================== -; LISTING 41 -; ======================================================================== - -bits 16 - ;add bx, [bx+si] ;add bx, [bp] -add si, 2 -add bp, 2 -add cx, 8 +;add si, 2 +;add bp, 2 +;add cx, 8 ;add bx, [bp + 0] ;add cx, [bx + 2] ;add bh, [bp + si + 4] @@ -31,21 +15,20 @@ add cx, 8 ;add [bx + 2], cx ;add [bp + si + 4], bh ;add [bp + di + 6], di -add byte [bx], 34 -add word [bp + si + 1000], 29 -; add ax, [bp] -; add al, [bx + si] -; add ax, bx -add al, ah -add ax, 1000 -add al, -30 -add al, 9 - +;add byte [bx], 34 +;add word [bp + si + 1000], 29 +;add ax, [bp] +;add al, [bx + si] +;add ax, bx +;add al, ah +;add ax, 1000 +;add al, -30 +;add al, 9 ;sub bx, [bx+si] ;sub bx, [bp] -sub si, 2 -sub bp, 2 -sub cx, 8 +;sub si, 2 +;sub bp, 2 +;sub cx, 8 ;sub bx, [bp + 0] ;sub cx, [bx + 2] ;sub bh, [bp + si + 4] @@ -56,21 +39,20 @@ sub cx, 8 ;sub [bx + 2], cx ;sub [bp + si + 4], bh ;sub [bp + di + 6], di -sub byte [bx], 34 -sub word [bx + di], 29 +;sub byte [bx], 34 +;sub word [bx + di], 29 ;sub ax, [bp] ;sub al, [bx + si] ;sub ax, bx ;sub al, ah -sub ax, 1000 -sub al, -30 -sub al, 9 - +;sub ax, 1000 +;sub al, -30 +;sub al, 9 ;cmp bx, [bx+si] ;cmp bx, [bp] -cmp si, 2 -cmp bp, 2 -cmp cx, 8 +;cmp si, 2 +;cmp bp, 2 +;cmp cx, 8 ;cmp bx, [bp + 0] ;cmp cx, [bx + 2] ;cmp bh, [bp + si + 4] @@ -81,41 +63,41 @@ cmp cx, 8 ;cmp [bx + 2], cx ;cmp [bp + si + 4], bh ;cmp [bp + di + 6], di -cmp byte [bx], 34 -cmp word [4834], 29 +;cmp byte [bx], 34 +;cmp word [4834], 29 ;cmp ax, [bp] ;cmp al, [bx + si] ;cmp ax, bx ;cmp al, ah -cmp ax, 1000 -cmp al, -30 -cmp al, 9 +;cmp ax, 1000 +;cmp al, -30 +;cmp al, 9 -; test_label0: -; jnz test_label1 -; jnz test_label0 -; test_label1: -; jnz test_label0 -; jnz test_label1 -; -; label: -; je label -; jl label -; jle label -; jb label -; jbe label -; jp label -; jo label -; js label -; jne label -; jnl label -; jg label -; jnb label -; ja label -; jnp label -; jno label -; jns label -; loop label -; loopz label -; loopnz label -; jcxz label +test_label0: +jnz test_label1 +jnz test_label0 +test_label1: +jnz test_label0 +jnz test_label1 + +label: +je label +jl label +jle label +jb label +jbe label +jp label +jo label +js label +jne label +jnl label +jg label +jnb label +ja label +jnp label +jno label +jns label +loop label +loopz label +loopnz label +jcxz label diff --git a/1-3/output.asm b/1-3/output.asm index e69de29..2410352 100644 --- a/1-3/output.asm +++ b/1-3/output.asm @@ -0,0 +1,26 @@ +bits 16 + +jne $+2+2 +jne $+2-4 +jne $+2-6 +jne $+2-4 +jz $+2-2 +jl $+2-4 +jle $+2-6 +jb $+2-8 +jbe $+2-10 +jp $+2-12 +jo $+2-14 +js $+2-16 +jne $+2-18 +jnl $+2-20 +jnle $+2-22 +jnb $+2-24 +jnbe $+2-26 +jnp $+2-28 +jno $+2-30 +jns $+2-32 +loop $+2-34 +loopz $+2-36 +loopnz $+2-38 +jcxz $+2-40