--- np2/i386c/ia32/ia32.mcr 2003/12/08 00:55:31 1.1 +++ np2/i386c/ia32/ia32.mcr 2004/01/27 15:52:53 1.6 @@ -1,4 +1,4 @@ -/* $Id: ia32.mcr,v 1.1 2003/12/08 00:55:31 yui Exp $ */ +/* $Id: ia32.mcr,v 1.6 2004/01/27 15:52:53 monaka Exp $ */ /* * Copyright (c) 2002-2003 NONAKA Kimihiro @@ -117,10 +117,11 @@ do { \ #define SET_EIP(v) \ do { \ DWORD __new_ip = (v); \ - if (!CPU_INST_OP32) { \ + if (!CPU_STATSAVE.cpu_inst_default.op_32) {\ __new_ip &= 0x0000ffff; \ } \ if (__new_ip > CPU_STAT_CS_LIMIT) { \ + VERBOSE(("SET_EIP: new_ip = %08x, limit = %08x", __new_ip, CPU_STAT_CS_LIMIT)); \ EXCEPTION(GP_EXCEPTION, 0); \ } \ CPU_EIP = __new_ip; \ @@ -129,12 +130,9 @@ do { \ #define ADD_EIP(v) \ do { \ DWORD __tmp_ip = CPU_EIP + (v); \ - if (!CPU_INST_OP32) { \ + if (!CPU_STATSAVE.cpu_inst_default.op_32) {\ __tmp_ip &= 0x0000ffff; \ } \ - if (__tmp_ip > CPU_STAT_CS_LIMIT) { \ - EXCEPTION(GP_EXCEPTION, 0); \ - } \ CPU_EIP = __tmp_ip; \ } while (/*CONSTCOND*/ 0) @@ -392,10 +390,11 @@ do { \ #define _ADCDWORD(r, d, s) \ do { \ - (r) = (CPU_FLAGL & C_FLAG) + (s) + (d); \ + DWORD __c = (CPU_FLAGL & C_FLAG); \ + (r) = (s) + (d) + __c; \ CPU_OV = ((r) ^ (s)) & ((r) ^ (d)) & 0x80000000; \ CPU_FLAGL = (BYTE)(((r) ^ (d) ^ (s)) & A_FLAG); \ - if ((r) < (s)) { \ + if ((!__c && (r) < (s)) || (__c && (r) <= (s))) { \ CPU_FLAGL |= C_FLAG; \ } \ if ((r) == 0) { \ @@ -430,10 +429,11 @@ do { \ #define _DWORD_SBB(r, d, s) \ do { \ - (r) = (d) - (s) - (CPU_FLAGL & C_FLAG); \ + DWORD __c = (CPU_FLAGL & C_FLAG); \ + (r) = (d) - (s) - __c; \ CPU_OV = ((d) ^ (r)) & ((d) ^ (s)) & 0x80000000; \ CPU_FLAGL = (BYTE)(((r) ^ (d) ^ (s)) & A_FLAG); \ - if ((d) < (s)) { \ + if ((!__c && (d) < (s)) || (__c && (d) <= (s))) { \ CPU_FLAGL |= C_FLAG; \ } \ if ((r) == 0) { \ @@ -816,10 +816,10 @@ do { \ #define PUSH0_32(reg) \ do { \ - if (!CPU_STAT_SS32) { \ - REGPUSH0_32_16(reg); \ - } else { \ + if (CPU_STAT_SS32) { \ REGPUSH0_32(reg); \ + } else { \ + REGPUSH0_32_16(reg); \ } \ } while (/*CONSTCOND*/ 0) @@ -847,12 +847,12 @@ do { \ #define SP_PUSH0_32(reg) \ do { \ DWORD esp = CPU_ESP; \ - if (!CPU_STAT_SS32) { \ - CPU_SP -= 4; \ - cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_SP, esp); \ - } else { \ + if (CPU_STAT_SS32) { \ CPU_ESP -= 4; \ cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_ESP, esp); \ + } else { \ + CPU_SP -= 4; \ + cpu_vmemorywrite_d(CPU_SS_INDEX, CPU_SP, esp); \ } \ } while (/*CONSTCOND*/ 0) @@ -905,10 +905,10 @@ do { \ #define POP0_32(reg) \ do { \ - if (!CPU_STAT_SS32) { \ - REGPOP0_32_16(reg); \ - } else { \ + if (CPU_STAT_SS32) { \ REGPOP0_32(reg); \ + } else { \ + REGPOP0_32_16(reg); \ } \ } while (/*CONSTCOND*/ 0) @@ -923,10 +923,10 @@ do { \ #define ESP_POP0_32(reg) \ do { \ - if (!CPU_STAT_SS32) { \ - (reg) = cpu_vmemoryread_d(CPU_SS_INDEX, CPU_SP); \ - } else { \ + if (CPU_STAT_SS32) { \ (reg) = cpu_vmemoryread_d(CPU_SS_INDEX, CPU_ESP); \ + } else { \ + (reg) = cpu_vmemoryread_d(CPU_SS_INDEX, CPU_SP); \ } \ } while (/*CONSTCOND*/ 0) @@ -944,7 +944,7 @@ do { \ #define JMPNEAR(clock) \ do { \ - WORD __ip; \ + DWORD __ip; \ CPU_WORKCLOCK(clock); \ __ip = __CWDE(cpu_codefetch_w(CPU_EIP)); \ __ip += 2; \