# HG changeset patch # User Pascal Bellard # Date 1521806909 -3600 # Node ID a7a9bd1b47f492e9bce127058bdf424501c8005c # Parent da6d56ae54a6173c93d996ce748af9d5c8bfc845 8086tiny: fix DAA/DAS/shift opcodes diff -r da6d56ae54a6 -r a7a9bd1b47f4 8086tiny/receipt --- a/8086tiny/receipt Mon Mar 19 23:12:07 2018 +0100 +++ b/8086tiny/receipt Fri Mar 23 13:08:29 2018 +0100 @@ -23,6 +23,7 @@ # Rules to configure and make the package. compile_rules() { + patch -p0 < $stuff/8086tiny.u case "$ARCH" in i?86) make CC=gcc no_graphics && diff -r da6d56ae54a6 -r a7a9bd1b47f4 8086tiny/stuff/8086tiny.u --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/8086tiny/stuff/8086tiny.u Fri Mar 23 13:08:29 2018 +0100 @@ -0,0 +1,40 @@ +--- 8086tiny.c ++++ 8086tiny.c +@@ -112,8 +112,9 @@ + regs16[REG_AX] = op_result, \ + set_OF(set_CF(op_result - (op_data_type)op_result))) + #define DIV_MACRO(out_data_type,in_data_type,out_regs) (scratch_int = CAST(out_data_type)mem[rm_addr]) && !(scratch2_uint = (in_data_type)(scratch_uint = (out_regs[i_w+1] << 16) + regs16[REG_AX]) / scratch_int, scratch2_uint - (out_data_type)scratch2_uint) ? out_regs[i_w+1] = scratch_uint - scratch_int * (*out_regs = scratch2_uint) : pc_interrupt(0) +-#define DAA_DAS(op1,op2,mask,min) set_AF((((scratch2_uint = regs8[REG_AL]) & 0x0F) > 9) || regs8[FLAG_AF]) && (op_result = regs8[REG_AL] op1 6, set_CF(regs8[FLAG_CF] || (regs8[REG_AL] op2 scratch2_uint))), \ +- set_CF((((mask & 1 ? scratch2_uint : regs8[REG_AL]) & mask) > min) || regs8[FLAG_CF]) && (op_result = regs8[REG_AL] op1 0x60) ++#define DAA_DAS(op1,op2) \ ++set_AF((((scratch_uchar = regs8[REG_AL]) & 0x0F) > 9) || regs8[FLAG_AF]) && (op_result = (regs8[REG_AL] op1 6), set_CF(regs8[FLAG_CF] || (regs8[REG_AL] op2 scratch_uchar))), \ ++set_CF((regs8[REG_AL] > 0x9f) || regs8[FLAG_CF]) && (op_result = (regs8[REG_AL] op1 0x60)) + #define ADC_SBB_MACRO(a) OP(a##= regs8[FLAG_CF] +), \ + set_CF(regs8[FLAG_CF] && (op_result == op_dest) || (a op_result < a(int)op_dest)), \ + set_AF_OF_arith() +@@ -451,7 +452,6 @@ + OPCODE 12: // ROL|ROR|RCL|RCR|SHL|SHR|???|SAR reg/mem, 1/CL/imm (80186) + scratch2_uint = SIGN_OF(mem[rm_addr]), + scratch_uint = extra ? // xxx reg/mem, imm +- ++reg_ip, + (char)i_data1 + : // xxx reg/mem, CL + i_d +@@ -468,7 +468,7 @@ + else // Rotate/shift left operations + R_M_OP(mem[rm_addr], <<=, scratch_uint); + if (i_reg > 3) // Shift operations +- set_opcode(0x10); // Decode like ADC ++ set_flags_type = FLAGS_UPDATE_SZP; // Shift instructions affect SZP + if (i_reg > 4) // SHR or SAR + set_CF(op_dest >> (scratch_uint - 1) & 1); + } +@@ -605,7 +605,7 @@ + rep_override_en && rep_override_en++ + OPCODE 28: // DAA/DAS + i_w = 0; +- extra ? DAA_DAS(-=, >=, 0xFF, 0x99) : DAA_DAS(+=, <, 0xF0, 0x90) // extra = 0 for DAA, 1 for DAS ++ if (extra) DAA_DAS(-=, >); else DAA_DAS(+=, <) + OPCODE 29: // AAA/AAS + op_result = AAA_AAS(extra - 1) + OPCODE 30: // CBW diff -r da6d56ae54a6 -r a7a9bd1b47f4 linux/stuff/linux-freeinitrd.u --- a/linux/stuff/linux-freeinitrd.u Mon Mar 19 23:12:07 2018 +0100 +++ b/linux/stuff/linux-freeinitrd.u Fri Mar 23 13:08:29 2018 +0100 @@ -10,7 +10,7 @@ + +static void free_rootfs_mem(unsigned long start, unsigned long end) +{ -+ free_init_pages("", start, end); ++ free_init_pages(NULL, start, end); +} + +static void _free_initrd(unsigned long initrd_start, unsigned long initrd_end,