Bochs/bochs/cpu/lazy_flags.cc

1039 lines
32 KiB
C++
Raw Normal View History

/////////////////////////////////////////////////////////////////////////
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
// $Id: lazy_flags.cc,v 1.12 2002-10-25 11:44:35 bdenney Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
//
// MandrakeSoft S.A.
// 43, rue d'Aboukir
// 75002 Paris - France
// http://www.linux-mandrake.com/
// http://www.mandrakesoft.com/
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#define NEED_CPU_REG_SHORTCUTS 1
#include "bochs.h"
#define LOG_THIS BX_CPU_THIS_PTR
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
bx_bool
BX_CPU_C::get_CFLazy(void)
{
unsigned cf;
switch ( BX_CPU_THIS_PTR lf_flags_status & 0x00000f ) {
case BX_LF_INDEX_OSZAPC:
switch (BX_CPU_THIS_PTR oszapc.instr) {
case BX_INSTR_ADD8:
case BX_INSTR_XADD8:
cf = (BX_CPU_THIS_PTR oszapc.result_8 <
BX_CPU_THIS_PTR oszapc.op1_8);
break;
case BX_INSTR_ADD16:
case BX_INSTR_XADD16:
cf = (BX_CPU_THIS_PTR oszapc.result_16 <
BX_CPU_THIS_PTR oszapc.op1_16);
break;
case BX_INSTR_ADD32:
case BX_INSTR_XADD32:
cf = (BX_CPU_THIS_PTR oszapc.result_32 <
BX_CPU_THIS_PTR oszapc.op1_32);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_ADD64:
case BX_INSTR_XADD64:
cf = (BX_CPU_THIS_PTR oszapc.result_64 <
BX_CPU_THIS_PTR oszapc.op1_64);
break;
#endif
case BX_INSTR_ADC8:
cf =
(BX_CPU_THIS_PTR oszapc.result_8 <
BX_CPU_THIS_PTR oszapc.op1_8) ||
(BX_CPU_THIS_PTR oszapc.prev_CF &&
BX_CPU_THIS_PTR oszapc.result_8 ==
BX_CPU_THIS_PTR oszapc.op1_8);
break;
case BX_INSTR_ADC16:
cf =
(BX_CPU_THIS_PTR oszapc.result_16 <
BX_CPU_THIS_PTR oszapc.op1_16) ||
(BX_CPU_THIS_PTR oszapc.prev_CF &&
BX_CPU_THIS_PTR oszapc.result_16 ==
BX_CPU_THIS_PTR oszapc.op1_16);
break;
case BX_INSTR_ADC32:
cf =
(BX_CPU_THIS_PTR oszapc.result_32 <
BX_CPU_THIS_PTR oszapc.op1_32) ||
(BX_CPU_THIS_PTR oszapc.prev_CF &&
BX_CPU_THIS_PTR oszapc.result_32 ==
BX_CPU_THIS_PTR oszapc.op1_32);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_ADC64:
cf =
(BX_CPU_THIS_PTR oszapc.result_64 <
BX_CPU_THIS_PTR oszapc.op1_64) ||
(BX_CPU_THIS_PTR oszapc.prev_CF &&
BX_CPU_THIS_PTR oszapc.result_64 ==
BX_CPU_THIS_PTR oszapc.op1_64);
break;
#endif
case BX_INSTR_SUB8:
case BX_INSTR_CMP8:
case BX_INSTR_CMPS8:
case BX_INSTR_SCAS8:
cf = (BX_CPU_THIS_PTR oszapc.op1_8 <
BX_CPU_THIS_PTR oszapc.op2_8);
break;
case BX_INSTR_SUB16:
case BX_INSTR_CMP16:
case BX_INSTR_CMPS16:
case BX_INSTR_SCAS16:
cf = (BX_CPU_THIS_PTR oszapc.op1_16 <
BX_CPU_THIS_PTR oszapc.op2_16);
break;
case BX_INSTR_SUB32:
case BX_INSTR_CMP32:
case BX_INSTR_CMPS32:
case BX_INSTR_SCAS32:
cf = (BX_CPU_THIS_PTR oszapc.op1_32 <
BX_CPU_THIS_PTR oszapc.op2_32);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_SUB64:
case BX_INSTR_CMP64:
case BX_INSTR_CMPS64:
case BX_INSTR_SCAS64:
cf = (BX_CPU_THIS_PTR oszapc.op1_64 <
BX_CPU_THIS_PTR oszapc.op2_64);
break;
#endif
case BX_INSTR_SBB8:
cf =
(BX_CPU_THIS_PTR oszapc.op1_8 <
BX_CPU_THIS_PTR oszapc.result_8) ||
((BX_CPU_THIS_PTR oszapc.op2_8==0xff) &&
BX_CPU_THIS_PTR oszapc.prev_CF);
break;
case BX_INSTR_SBB16:
2002-09-15 04:18:41 +04:00
cf =
(BX_CPU_THIS_PTR oszapc.op1_16 <
BX_CPU_THIS_PTR oszapc.result_16) ||
((BX_CPU_THIS_PTR oszapc.op2_16==0xffff) &&
BX_CPU_THIS_PTR oszapc.prev_CF);
break;
case BX_INSTR_SBB32:
2002-09-15 04:18:41 +04:00
cf =
(BX_CPU_THIS_PTR oszapc.op1_32 <
BX_CPU_THIS_PTR oszapc.result_32) ||
((BX_CPU_THIS_PTR oszapc.op2_32==0xffffffff) &&
BX_CPU_THIS_PTR oszapc.prev_CF);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_SBB64:
cf =
(BX_CPU_THIS_PTR oszapc.op1_64 <
BX_CPU_THIS_PTR oszapc.result_64) ||
((BX_CPU_THIS_PTR oszapc.op2_64==BX_CONST64(0xffffffffffffffff)) &&
BX_CPU_THIS_PTR oszapc.prev_CF);
break;
#endif
case BX_INSTR_NEG8:
2002-09-15 04:18:41 +04:00
cf = BX_CPU_THIS_PTR oszapc.op1_8 != 0;
break;
case BX_INSTR_NEG16:
2002-09-15 04:18:41 +04:00
cf = BX_CPU_THIS_PTR oszapc.op1_16 != 0;
break;
case BX_INSTR_NEG32:
2002-09-15 04:18:41 +04:00
cf = BX_CPU_THIS_PTR oszapc.op1_32 != 0;
break;
#if BX_SUPPORT_X86_64
case BX_INSTR_NEG64:
cf = BX_CPU_THIS_PTR oszapc.op1_64 != 0;
break;
2002-09-15 04:18:41 +04:00
#endif
case BX_INSTR_OR8:
case BX_INSTR_OR16:
case BX_INSTR_OR32:
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_OR64:
case BX_INSTR_AND64:
case BX_INSTR_TEST64:
case BX_INSTR_XOR64:
#endif
case BX_INSTR_AND8:
case BX_INSTR_AND16:
case BX_INSTR_AND32:
case BX_INSTR_TEST8:
case BX_INSTR_TEST16:
case BX_INSTR_TEST32:
case BX_INSTR_XOR8:
case BX_INSTR_XOR16:
case BX_INSTR_XOR32:
cf = 0;
break;
case BX_INSTR_SHR8:
cf =
(BX_CPU_THIS_PTR oszapc.op1_8 >>
(BX_CPU_THIS_PTR oszapc.op2_8 - 1)) & 0x01;
break;
case BX_INSTR_SHR16:
cf =
(BX_CPU_THIS_PTR oszapc.op1_16 >>
(BX_CPU_THIS_PTR oszapc.op2_16 - 1)) & 0x01;
break;
case BX_INSTR_SHR32:
cf =
(BX_CPU_THIS_PTR oszapc.op1_32 >>
(BX_CPU_THIS_PTR oszapc.op2_32 - 1)) & 0x01;
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_SHR64:
cf =
(BX_CPU_THIS_PTR oszapc.op1_64 >>
(BX_CPU_THIS_PTR oszapc.op2_64 - 1)) & 0x01;
break;
#endif
case BX_INSTR_SHL8:
if (BX_CPU_THIS_PTR oszapc.op2_8 <= 8) {
cf =
(BX_CPU_THIS_PTR oszapc.op1_8 >>
(8 - BX_CPU_THIS_PTR oszapc.op2_8)) & 0x01;
}
else {
cf = 0;
}
break;
case BX_INSTR_SHL16:
if (BX_CPU_THIS_PTR oszapc.op2_16 <= 16) {
cf =
(BX_CPU_THIS_PTR oszapc.op1_16 >>
(16 - BX_CPU_THIS_PTR oszapc.op2_16)) & 0x01;
}
else {
cf = 0;
}
break;
case BX_INSTR_SHL32:
cf =
(BX_CPU_THIS_PTR oszapc.op1_32 >>
(32 - BX_CPU_THIS_PTR oszapc.op2_32)) & 0x01;
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_SHL64:
cf =
(BX_CPU_THIS_PTR oszapc.op1_64 >>
(32 - BX_CPU_THIS_PTR oszapc.op2_64)) & 0x01;
break;
#endif
default:
cf = 0; // Keep compiler quiet.
BX_PANIC(("get_CF: OSZAPC: unknown instr %u",
(unsigned) BX_CPU_THIS_PTR oszapc.instr));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xfffff0;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<0);
BX_CPU_THIS_PTR eflags.val32 |= (!!cf)<<0;
return(cf);
default:
BX_PANIC(("get_CF: unknown case"));
return(0);
}
}
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
bx_bool
BX_CPU_C::get_AFLazy(void)
{
unsigned af;
switch ( (BX_CPU_THIS_PTR lf_flags_status>>8) & 0x00000f ) {
case BX_LF_INDEX_OSZAPC:
switch (BX_CPU_THIS_PTR oszapc.instr) {
case BX_INSTR_ADD8:
case BX_INSTR_ADC8:
case BX_INSTR_SUB8:
case BX_INSTR_SBB8:
case BX_INSTR_CMP8:
case BX_INSTR_XADD8:
case BX_INSTR_CMPS8:
case BX_INSTR_SCAS8:
af =
((BX_CPU_THIS_PTR oszapc.op1_8 ^
BX_CPU_THIS_PTR oszapc.op2_8) ^
BX_CPU_THIS_PTR oszapc.result_8) & 0x10;
break;
case BX_INSTR_ADD16:
case BX_INSTR_ADC16:
case BX_INSTR_SUB16:
case BX_INSTR_SBB16:
case BX_INSTR_CMP16:
case BX_INSTR_XADD16:
case BX_INSTR_CMPS16:
case BX_INSTR_SCAS16:
af =
((BX_CPU_THIS_PTR oszapc.op1_16 ^
BX_CPU_THIS_PTR oszapc.op2_16) ^
BX_CPU_THIS_PTR oszapc.result_16) & 0x10;
break;
case BX_INSTR_ADD32:
case BX_INSTR_ADC32:
case BX_INSTR_SUB32:
case BX_INSTR_SBB32:
case BX_INSTR_CMP32:
case BX_INSTR_XADD32:
case BX_INSTR_CMPS32:
case BX_INSTR_SCAS32:
af =
((BX_CPU_THIS_PTR oszapc.op1_32 ^
BX_CPU_THIS_PTR oszapc.op2_32) ^
BX_CPU_THIS_PTR oszapc.result_32) & 0x10;
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_ADD64:
case BX_INSTR_ADC64:
case BX_INSTR_SUB64:
case BX_INSTR_SBB64:
case BX_INSTR_CMP64:
case BX_INSTR_XADD64:
case BX_INSTR_CMPS64:
case BX_INSTR_SCAS64:
af =
2002-09-15 04:18:41 +04:00
((BX_CPU_THIS_PTR oszapc.op1_64 ^
BX_CPU_THIS_PTR oszapc.op2_64) ^
BX_CPU_THIS_PTR oszapc.result_64) & 0x10;
break;
#endif
case BX_INSTR_NEG8:
af = (BX_CPU_THIS_PTR oszapc.op1_8 & 0x0f) > 0;
break;
case BX_INSTR_NEG16:
2002-09-15 04:18:41 +04:00
af = (BX_CPU_THIS_PTR oszapc.op1_16 & 0x0f) > 0;
break;
case BX_INSTR_NEG32:
2002-09-15 04:18:41 +04:00
af = (BX_CPU_THIS_PTR oszapc.op1_32 & 0x0f) > 0;
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_NEG64:
af = (BX_CPU_THIS_PTR oszapc.op1_64 & 0x0f) > 0;
break;
#endif
case BX_INSTR_OR8:
case BX_INSTR_OR16:
case BX_INSTR_OR32:
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_OR64:
case BX_INSTR_AND64:
case BX_INSTR_TEST64:
case BX_INSTR_XOR64:
case BX_INSTR_SHR64:
case BX_INSTR_SHL64:
#endif
case BX_INSTR_AND8:
case BX_INSTR_AND16:
case BX_INSTR_AND32:
case BX_INSTR_TEST8:
case BX_INSTR_TEST16:
case BX_INSTR_TEST32:
case BX_INSTR_XOR8:
case BX_INSTR_XOR16:
case BX_INSTR_XOR32:
case BX_INSTR_SHR8:
case BX_INSTR_SHR16:
case BX_INSTR_SHR32:
case BX_INSTR_SHL8:
case BX_INSTR_SHL16:
case BX_INSTR_SHL32:
af = 0;
/* undefined */
break;
default:
af = 0; // Keep compiler quiet.
BX_PANIC(("get_AF: OSZAPC: unknown instr %u",
(unsigned) BX_CPU_THIS_PTR oszapc.instr));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xfff0ff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<4);
BX_CPU_THIS_PTR eflags.val32 |= (!!af)<<4;
return(af);
case BX_LF_INDEX_OSZAP:
switch (BX_CPU_THIS_PTR oszap.instr) {
case BX_INSTR_INC8:
2002-09-15 04:18:41 +04:00
af = (BX_CPU_THIS_PTR oszap.result_8 & 0x0f) == 0;
break;
case BX_INSTR_INC16:
2002-09-15 04:18:41 +04:00
af = (BX_CPU_THIS_PTR oszap.result_16 & 0x0f) == 0;
break;
case BX_INSTR_INC32:
af = (BX_CPU_THIS_PTR oszap.result_32 & 0x0f) == 0;
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_INC64:
af = (BX_CPU_THIS_PTR oszap.result_64 & 0x0f) == 0;
2002-09-15 04:18:41 +04:00
break;
#endif
case BX_INSTR_DEC8:
af = (BX_CPU_THIS_PTR oszap.result_8 & 0x0f) == 0x0f;
break;
case BX_INSTR_DEC16:
af = (BX_CPU_THIS_PTR oszap.result_16 & 0x0f) == 0x0f;
break;
case BX_INSTR_DEC32:
af = (BX_CPU_THIS_PTR oszap.result_32 & 0x0f) == 0x0f;
2002-09-15 04:18:41 +04:00
break;
#if BX_SUPPORT_X86_64
case BX_INSTR_DEC64:
af = (BX_CPU_THIS_PTR oszap.result_64 & 0x0f) == 0x0f;
break;
2002-09-15 04:18:41 +04:00
#endif
default:
af = 0; // Keep compiler quiet.
BX_PANIC(("get_AF: OSZAP: unknown instr %u",
(unsigned) BX_CPU_THIS_PTR oszap.instr));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xfff0ff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<4);
BX_CPU_THIS_PTR eflags.val32 |= (!!af)<<4;
return(af);
default:
BX_PANIC(("get_AF: unknown case"));
return(0);
}
}
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
bx_bool
BX_CPU_C::get_ZFLazy(void)
{
unsigned zf;
switch ( (BX_CPU_THIS_PTR lf_flags_status>>12) & 0x00000f ) {
case BX_LF_INDEX_OSZAPC:
switch (BX_CPU_THIS_PTR oszapc.instr) {
case BX_INSTR_ADD8:
case BX_INSTR_ADC8:
case BX_INSTR_SUB8:
case BX_INSTR_SBB8:
case BX_INSTR_CMP8:
case BX_INSTR_NEG8:
case BX_INSTR_XADD8:
case BX_INSTR_OR8:
case BX_INSTR_AND8:
case BX_INSTR_TEST8:
case BX_INSTR_XOR8:
case BX_INSTR_CMPS8:
case BX_INSTR_SCAS8:
case BX_INSTR_SHR8:
case BX_INSTR_SHL8:
zf = (BX_CPU_THIS_PTR oszapc.result_8 == 0);
break;
case BX_INSTR_ADD16:
case BX_INSTR_ADC16:
case BX_INSTR_SUB16:
case BX_INSTR_SBB16:
case BX_INSTR_CMP16:
case BX_INSTR_NEG16:
case BX_INSTR_XADD16:
case BX_INSTR_OR16:
case BX_INSTR_AND16:
case BX_INSTR_TEST16:
case BX_INSTR_XOR16:
case BX_INSTR_CMPS16:
case BX_INSTR_SCAS16:
case BX_INSTR_SHR16:
case BX_INSTR_SHL16:
zf = (BX_CPU_THIS_PTR oszapc.result_16 == 0);
break;
case BX_INSTR_ADD32:
case BX_INSTR_ADC32:
case BX_INSTR_SUB32:
case BX_INSTR_SBB32:
case BX_INSTR_CMP32:
case BX_INSTR_NEG32:
case BX_INSTR_XADD32:
case BX_INSTR_OR32:
case BX_INSTR_AND32:
case BX_INSTR_TEST32:
case BX_INSTR_XOR32:
case BX_INSTR_CMPS32:
case BX_INSTR_SCAS32:
case BX_INSTR_SHR32:
case BX_INSTR_SHL32:
zf = (BX_CPU_THIS_PTR oszapc.result_32 == 0);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_ADD64:
case BX_INSTR_ADC64:
case BX_INSTR_SUB64:
case BX_INSTR_SBB64:
case BX_INSTR_CMP64:
case BX_INSTR_NEG64:
case BX_INSTR_XADD64:
case BX_INSTR_OR64:
case BX_INSTR_AND64:
case BX_INSTR_TEST64:
case BX_INSTR_XOR64:
case BX_INSTR_CMPS64:
case BX_INSTR_SCAS64:
case BX_INSTR_SHR64:
case BX_INSTR_SHL64:
zf = (BX_CPU_THIS_PTR oszapc.result_64 == 0);
break;
#endif
default:
zf = 0;
BX_PANIC(("get_ZF: OSZAPC: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xff0fff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<6);
BX_CPU_THIS_PTR eflags.val32 |= zf<<6; // zf always exactly 0 or 1.
return(zf);
case BX_LF_INDEX_OSZAP:
switch (BX_CPU_THIS_PTR oszap.instr) {
case BX_INSTR_INC8:
case BX_INSTR_DEC8:
zf = (BX_CPU_THIS_PTR oszap.result_8 == 0);
break;
case BX_INSTR_INC16:
case BX_INSTR_DEC16:
zf = (BX_CPU_THIS_PTR oszap.result_16 == 0);
break;
case BX_INSTR_INC32:
case BX_INSTR_DEC32:
zf = (BX_CPU_THIS_PTR oszap.result_32 == 0);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_INC64:
case BX_INSTR_DEC64:
zf = (BX_CPU_THIS_PTR oszap.result_64 == 0);
break;
#endif
default:
zf = 0;
BX_PANIC(("get_ZF: OSZAP: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xff0fff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<6);
BX_CPU_THIS_PTR eflags.val32 |= zf<<6; // zf always exactly 0 or 1.
return(zf);
default:
BX_PANIC(("get_ZF: unknown case"));
return(0);
}
}
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
bx_bool
BX_CPU_C::get_SFLazy(void)
{
unsigned sf;
switch ( (BX_CPU_THIS_PTR lf_flags_status>>16) & 0x00000f ) {
case BX_LF_INDEX_OSZAPC:
switch (BX_CPU_THIS_PTR oszapc.instr) {
case BX_INSTR_ADD8:
case BX_INSTR_ADC8:
case BX_INSTR_SUB8:
case BX_INSTR_SBB8:
case BX_INSTR_CMP8:
case BX_INSTR_NEG8:
case BX_INSTR_XADD8:
case BX_INSTR_OR8:
case BX_INSTR_AND8:
case BX_INSTR_TEST8:
case BX_INSTR_XOR8:
case BX_INSTR_CMPS8:
case BX_INSTR_SCAS8:
case BX_INSTR_SHR8:
case BX_INSTR_SHL8:
2002-09-15 04:18:41 +04:00
sf = (BX_CPU_THIS_PTR oszapc.result_8 >= 0x80);
break;
case BX_INSTR_ADD16:
case BX_INSTR_ADC16:
case BX_INSTR_SUB16:
case BX_INSTR_SBB16:
case BX_INSTR_CMP16:
case BX_INSTR_NEG16:
case BX_INSTR_XADD16:
case BX_INSTR_OR16:
case BX_INSTR_AND16:
case BX_INSTR_TEST16:
case BX_INSTR_XOR16:
case BX_INSTR_CMPS16:
case BX_INSTR_SCAS16:
case BX_INSTR_SHR16:
case BX_INSTR_SHL16:
2002-09-15 04:18:41 +04:00
sf = (BX_CPU_THIS_PTR oszapc.result_16 >= 0x8000);
break;
case BX_INSTR_ADD32:
case BX_INSTR_ADC32:
case BX_INSTR_SUB32:
case BX_INSTR_SBB32:
case BX_INSTR_CMP32:
case BX_INSTR_NEG32:
case BX_INSTR_XADD32:
case BX_INSTR_OR32:
case BX_INSTR_AND32:
case BX_INSTR_TEST32:
case BX_INSTR_XOR32:
case BX_INSTR_CMPS32:
case BX_INSTR_SCAS32:
case BX_INSTR_SHR32:
case BX_INSTR_SHL32:
2002-09-15 04:18:41 +04:00
sf = (BX_CPU_THIS_PTR oszapc.result_32 >= 0x80000000);
break;
#if BX_SUPPORT_X86_64
case BX_INSTR_ADD64:
case BX_INSTR_ADC64:
case BX_INSTR_SUB64:
case BX_INSTR_SBB64:
case BX_INSTR_CMP64:
case BX_INSTR_NEG64:
case BX_INSTR_XADD64:
case BX_INSTR_OR64:
case BX_INSTR_AND64:
case BX_INSTR_TEST64:
case BX_INSTR_XOR64:
case BX_INSTR_CMPS64:
case BX_INSTR_SCAS64:
case BX_INSTR_SHR64:
case BX_INSTR_SHL64:
sf = (BX_CPU_THIS_PTR oszapc.result_64 >= BX_CONST64(0x8000000000000000));
break;
#endif
default:
sf = 0; // Keep compiler quiet.
BX_PANIC(("get_SF: OSZAPC: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xf0ffff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<7);
BX_CPU_THIS_PTR eflags.val32 |= (!!sf)<<7;
return(sf);
case BX_LF_INDEX_OSZAP:
switch (BX_CPU_THIS_PTR oszap.instr) {
case BX_INSTR_INC8:
case BX_INSTR_DEC8:
sf = (BX_CPU_THIS_PTR oszap.result_8 >= 0x80);
break;
case BX_INSTR_INC16:
case BX_INSTR_DEC16:
sf = (BX_CPU_THIS_PTR oszap.result_16 >= 0x8000);
break;
case BX_INSTR_INC32:
case BX_INSTR_DEC32:
sf = (BX_CPU_THIS_PTR oszap.result_32 >= 0x80000000);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_INC64:
case BX_INSTR_DEC64:
sf = (BX_CPU_THIS_PTR oszap.result_64 >= BX_CONST64(0x8000000000000000));
2002-09-15 04:18:41 +04:00
break;
#endif
default:
sf = 0; // Keep compiler quiet.
BX_PANIC(("get_SF: OSZAP: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xf0ffff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<7);
BX_CPU_THIS_PTR eflags.val32 |= (!!sf)<<7;
return(sf);
default:
BX_PANIC(("get_SF: unknown case"));
return(0);
}
}
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
bx_bool
BX_CPU_C::get_OFLazy(void)
{
Bit8u op1_b7, op2_b7, result_b7;
Bit16u op1_b15, op2_b15, result_b15;
Bit32u op1_b31, op2_b31, result_b31;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
Bit64u op1_b63, op2_b63, result_b63;
#endif
unsigned of;
switch ( (BX_CPU_THIS_PTR lf_flags_status>>20) & 0x00000f ) {
case BX_LF_INDEX_OSZAPC:
switch (BX_CPU_THIS_PTR oszapc.instr) {
case BX_INSTR_ADD8:
case BX_INSTR_ADC8:
case BX_INSTR_XADD8:
op1_b7 = BX_CPU_THIS_PTR oszapc.op1_8 & 0x80;
op2_b7 = BX_CPU_THIS_PTR oszapc.op2_8 & 0x80;
result_b7 = BX_CPU_THIS_PTR oszapc.result_8 & 0x80;
of = (op1_b7 == op2_b7) && (result_b7 ^ op2_b7);
break;
case BX_INSTR_ADD16:
case BX_INSTR_ADC16:
case BX_INSTR_XADD16:
op1_b15 = BX_CPU_THIS_PTR oszapc.op1_16 & 0x8000;
op2_b15 = BX_CPU_THIS_PTR oszapc.op2_16 & 0x8000;
result_b15 = BX_CPU_THIS_PTR oszapc.result_16 & 0x8000;
of = (op1_b15 == op2_b15) && (result_b15 ^ op2_b15);
break;
case BX_INSTR_ADD32:
case BX_INSTR_ADC32:
case BX_INSTR_XADD32:
op1_b31 = BX_CPU_THIS_PTR oszapc.op1_32 & 0x80000000;
op2_b31 = BX_CPU_THIS_PTR oszapc.op2_32 & 0x80000000;
result_b31 = BX_CPU_THIS_PTR oszapc.result_32 & 0x80000000;
of = (op1_b31 == op2_b31) && (result_b31 ^ op2_b31);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_ADD64:
case BX_INSTR_ADC64:
case BX_INSTR_XADD64:
op1_b63 = BX_CPU_THIS_PTR oszapc.op1_64 & BX_CONST64(0x8000000000000000);
op2_b63 = BX_CPU_THIS_PTR oszapc.op2_64 & BX_CONST64(0x8000000000000000);
result_b63 = BX_CPU_THIS_PTR oszapc.result_64 & BX_CONST64(0x8000000000000000);
of = (op1_b63 == op2_b63) && (result_b63 ^ op2_b63);
break;
#endif
case BX_INSTR_SUB8:
case BX_INSTR_SBB8:
case BX_INSTR_CMP8:
case BX_INSTR_CMPS8:
case BX_INSTR_SCAS8:
op1_b7 = BX_CPU_THIS_PTR oszapc.op1_8 & 0x80;
op2_b7 = BX_CPU_THIS_PTR oszapc.op2_8 & 0x80;
result_b7 = BX_CPU_THIS_PTR oszapc.result_8 & 0x80;
of = (op1_b7 ^ op2_b7) && (op1_b7 ^ result_b7);
break;
case BX_INSTR_SUB16:
case BX_INSTR_SBB16:
case BX_INSTR_CMP16:
case BX_INSTR_CMPS16:
case BX_INSTR_SCAS16:
op1_b15 = BX_CPU_THIS_PTR oszapc.op1_16 & 0x8000;
op2_b15 = BX_CPU_THIS_PTR oszapc.op2_16 & 0x8000;
result_b15 = BX_CPU_THIS_PTR oszapc.result_16 & 0x8000;
of = (op1_b15 ^ op2_b15) && (op1_b15 ^ result_b15);
break;
case BX_INSTR_SUB32:
case BX_INSTR_SBB32:
case BX_INSTR_CMP32:
case BX_INSTR_CMPS32:
case BX_INSTR_SCAS32:
op1_b31 = BX_CPU_THIS_PTR oszapc.op1_32 & 0x80000000;
op2_b31 = BX_CPU_THIS_PTR oszapc.op2_32 & 0x80000000;
result_b31 = BX_CPU_THIS_PTR oszapc.result_32 & 0x80000000;
of = (op1_b31 ^ op2_b31) && (op1_b31 ^ result_b31);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_SUB64:
case BX_INSTR_SBB64:
case BX_INSTR_CMP64:
case BX_INSTR_CMPS64:
case BX_INSTR_SCAS64:
op1_b63 = BX_CPU_THIS_PTR oszapc.op1_64 & BX_CONST64(0x8000000000000000);
op2_b63 = BX_CPU_THIS_PTR oszapc.op2_64 & BX_CONST64(0x8000000000000000);
result_b63 = BX_CPU_THIS_PTR oszapc.result_64 & BX_CONST64(0x8000000000000000);
of = (op1_b63 ^ op2_b63) && (op1_b63 ^ result_b63);
break;
#endif
case BX_INSTR_NEG8:
of = (BX_CPU_THIS_PTR oszapc.op1_8 == 0x80);
break;
case BX_INSTR_NEG16:
of = (BX_CPU_THIS_PTR oszapc.op1_16 == 0x8000);
break;
case BX_INSTR_NEG32:
of = (BX_CPU_THIS_PTR oszapc.op1_32 == 0x80000000);
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_NEG64:
of = (BX_CPU_THIS_PTR oszapc.op1_64 == BX_CONST64(0x8000000000000000));
break;
#endif
case BX_INSTR_OR8:
case BX_INSTR_OR16:
case BX_INSTR_OR32:
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_OR64:
case BX_INSTR_AND64:
case BX_INSTR_TEST64:
case BX_INSTR_XOR64:
#endif
case BX_INSTR_AND8:
case BX_INSTR_AND16:
case BX_INSTR_AND32:
case BX_INSTR_TEST8:
case BX_INSTR_TEST16:
case BX_INSTR_TEST32:
case BX_INSTR_XOR8:
case BX_INSTR_XOR16:
case BX_INSTR_XOR32:
of = 0;
break;
case BX_INSTR_SHR8:
if (BX_CPU_THIS_PTR oszapc.op2_8 == 1)
of = (BX_CPU_THIS_PTR oszapc.op1_8 >= 0x80);
else
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
case BX_INSTR_SHR16:
if (BX_CPU_THIS_PTR oszapc.op2_16 == 1)
of = (BX_CPU_THIS_PTR oszapc.op1_16 >= 0x8000);
else
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
case BX_INSTR_SHR32:
if (BX_CPU_THIS_PTR oszapc.op2_32 == 1)
of = (BX_CPU_THIS_PTR oszapc.op1_32 >= 0x80000000);
else
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_SHR64:
if (BX_CPU_THIS_PTR oszapc.op2_64 == 1)
of = (BX_CPU_THIS_PTR oszapc.op1_64 >= BX_CONST64(0x8000000000000000));
else
2002-09-15 04:18:41 +04:00
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
#endif
case BX_INSTR_SHL8:
if (BX_CPU_THIS_PTR oszapc.op2_8 == 1)
of = ((BX_CPU_THIS_PTR oszapc.op1_8 ^
BX_CPU_THIS_PTR oszapc.result_8) & 0x80) > 0;
else
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
case BX_INSTR_SHL16:
if (BX_CPU_THIS_PTR oszapc.op2_16 == 1)
of = ((BX_CPU_THIS_PTR oszapc.op1_16 ^
BX_CPU_THIS_PTR oszapc.result_16) & 0x8000) > 0;
else
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
case BX_INSTR_SHL32:
if (BX_CPU_THIS_PTR oszapc.op2_32 == 1)
of = ((BX_CPU_THIS_PTR oszapc.op1_32 ^
BX_CPU_THIS_PTR oszapc.result_32) & 0x80000000) > 0;
else
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_SHL64:
if (BX_CPU_THIS_PTR oszapc.op2_64 == 1)
of = ((BX_CPU_THIS_PTR oszapc.op1_64 ^
BX_CPU_THIS_PTR oszapc.result_64) & BX_CONST64(0x8000000000000000)) > 0;
else
2002-09-15 04:18:41 +04:00
of = (BX_CPU_THIS_PTR eflags.val32 >> 11) & 1; // Old val
break;
#endif
default:
of = 0; // Keep compiler happy.
BX_PANIC(("get_OF: OSZAPC: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0x0fffff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<11);
BX_CPU_THIS_PTR eflags.val32 |= (!!of)<<11;
return(of);
case BX_LF_INDEX_OSZAP:
switch (BX_CPU_THIS_PTR oszap.instr) {
case BX_INSTR_INC8:
of = BX_CPU_THIS_PTR oszap.result_8 == 0x80;
break;
case BX_INSTR_INC16:
of = BX_CPU_THIS_PTR oszap.result_16 == 0x8000;
break;
case BX_INSTR_INC32:
of = BX_CPU_THIS_PTR oszap.result_32 == 0x80000000;
2002-09-15 04:18:41 +04:00
break;
#if BX_SUPPORT_X86_64
case BX_INSTR_INC64:
of = BX_CPU_THIS_PTR oszap.result_64 == BX_CONST64(0x8000000000000000);
break;
2002-09-15 04:18:41 +04:00
#endif
case BX_INSTR_DEC8:
of = BX_CPU_THIS_PTR oszap.result_8 == 0x7F;
break;
case BX_INSTR_DEC16:
of = BX_CPU_THIS_PTR oszap.result_16 == 0x7FFF;
break;
case BX_INSTR_DEC32:
of = BX_CPU_THIS_PTR oszap.result_32 == 0x7FFFFFFF;
2002-09-15 04:18:41 +04:00
break;
#if BX_SUPPORT_X86_64
case BX_INSTR_DEC64:
of = BX_CPU_THIS_PTR oszap.result_64 == BX_CONST64(0x7FFFFFFFFFFFFFFF);
break;
2002-09-15 04:18:41 +04:00
#endif
default:
of = 0; // Keep compiler happy.
BX_PANIC(("get_OF: OSZAP: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0x0fffff;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<11);
BX_CPU_THIS_PTR eflags.val32 |= (!!of)<<11;
return(of);
default:
BX_PANIC(("get_OF: unknown case"));
return(0);
}
}
- Apply patch.replace-Boolean rev 1.3. Every "Boolean" is now changed to a "bx_bool" which is always defined as Bit32u on all platforms. In Carbon specific code, Boolean is still used because the Carbon header files define it to unsigned char. - this fixes bug [ 623152 ] MacOSX: Triple Exception Booting win95. The bug was that some code in Bochs depends on Boolean to be a 32 bit value. (This should be fixed, but I don't know all the places where it needs to be fixed yet.) Because Carbon defined Boolean as an unsigned char, Bochs just followed along and used the unsigned char definition to avoid compile problems. This exposed the dependency on 32 bit Boolean on MacOS X only and led to major simulation problems, that could only be reproduced and debugged on that platform. - On the mailing list we debated whether to make all Booleans into "bool" or our own type. I chose bx_bool for several reasons. 1. Unlike C++'s bool, we can guarantee that bx_bool is the same size on all platforms, which makes it much less likely to have more platform-specific simulation differences in the future. (I spent hours on a borrowed MacOSX machine chasing bug 618388 before discovering that different sized Booleans were the problem, and I don't want to repeat that.) 2. We still have at least one dependency on 32 bit Booleans which must be fixed some time, but I don't want to risk introducing new bugs into the simulation just before the 2.0 release. Modified Files: bochs.h config.h.in gdbstub.cc logio.cc main.cc pc_system.cc pc_system.h plugin.cc plugin.h bios/rombios.c cpu/apic.cc cpu/arith16.cc cpu/arith32.cc cpu/arith64.cc cpu/arith8.cc cpu/cpu.cc cpu/cpu.h cpu/ctrl_xfer16.cc cpu/ctrl_xfer32.cc cpu/ctrl_xfer64.cc cpu/data_xfer16.cc cpu/data_xfer32.cc cpu/data_xfer64.cc cpu/debugstuff.cc cpu/exception.cc cpu/fetchdecode.cc cpu/flag_ctrl_pro.cc cpu/init.cc cpu/io_pro.cc cpu/lazy_flags.cc cpu/lazy_flags.h cpu/mult16.cc cpu/mult32.cc cpu/mult64.cc cpu/mult8.cc cpu/paging.cc cpu/proc_ctrl.cc cpu/segment_ctrl_pro.cc cpu/stack_pro.cc cpu/tasking.cc debug/dbg_main.cc debug/debug.h debug/sim2.cc disasm/dis_decode.cc disasm/disasm.h doc/docbook/Makefile docs-html/cosimulation.html fpu/wmFPUemu_glue.cc gui/amigaos.cc gui/beos.cc gui/carbon.cc gui/gui.cc gui/gui.h gui/keymap.cc gui/keymap.h gui/macintosh.cc gui/nogui.cc gui/rfb.cc gui/sdl.cc gui/siminterface.cc gui/siminterface.h gui/term.cc gui/win32.cc gui/wx.cc gui/wxmain.cc gui/wxmain.h gui/x.cc instrument/example0/instrument.cc instrument/example0/instrument.h instrument/example1/instrument.cc instrument/example1/instrument.h instrument/stubs/instrument.cc instrument/stubs/instrument.h iodev/cdrom.cc iodev/cdrom.h iodev/cdrom_osx.cc iodev/cmos.cc iodev/devices.cc iodev/dma.cc iodev/dma.h iodev/eth_arpback.cc iodev/eth_packetmaker.cc iodev/eth_packetmaker.h iodev/floppy.cc iodev/floppy.h iodev/guest2host.h iodev/harddrv.cc iodev/harddrv.h iodev/ioapic.cc iodev/ioapic.h iodev/iodebug.cc iodev/iodev.h iodev/keyboard.cc iodev/keyboard.h iodev/ne2k.h iodev/parallel.h iodev/pci.cc iodev/pci.h iodev/pic.h iodev/pit.cc iodev/pit.h iodev/pit_wrap.cc iodev/pit_wrap.h iodev/sb16.cc iodev/sb16.h iodev/serial.cc iodev/serial.h iodev/vga.cc iodev/vga.h memory/memory.h memory/misc_mem.cc
2002-10-25 15:44:41 +04:00
bx_bool
BX_CPU_C::get_PFLazy(void)
{
unsigned pf;
switch ( (BX_CPU_THIS_PTR lf_flags_status>>4) & 0x00000f ) {
case BX_LF_INDEX_OSZAPC:
switch (BX_CPU_THIS_PTR oszapc.instr) {
case BX_INSTR_ADD8:
case BX_INSTR_ADC8:
case BX_INSTR_SUB8:
case BX_INSTR_SBB8:
case BX_INSTR_CMP8:
case BX_INSTR_NEG8:
case BX_INSTR_XADD8:
case BX_INSTR_OR8:
case BX_INSTR_AND8:
case BX_INSTR_TEST8:
case BX_INSTR_XOR8:
case BX_INSTR_CMPS8:
case BX_INSTR_SCAS8:
case BX_INSTR_SHR8:
case BX_INSTR_SHL8:
pf = bx_parity_lookup[BX_CPU_THIS_PTR oszapc.result_8];
break;
case BX_INSTR_ADD16:
case BX_INSTR_ADC16:
case BX_INSTR_SUB16:
case BX_INSTR_SBB16:
case BX_INSTR_CMP16:
case BX_INSTR_NEG16:
case BX_INSTR_XADD16:
case BX_INSTR_OR16:
case BX_INSTR_AND16:
case BX_INSTR_TEST16:
case BX_INSTR_XOR16:
case BX_INSTR_CMPS16:
case BX_INSTR_SCAS16:
case BX_INSTR_SHR16:
case BX_INSTR_SHL16:
pf = bx_parity_lookup[(Bit8u) BX_CPU_THIS_PTR oszapc.result_16];
break;
case BX_INSTR_ADD32:
case BX_INSTR_ADC32:
case BX_INSTR_SUB32:
case BX_INSTR_SBB32:
case BX_INSTR_CMP32:
case BX_INSTR_NEG32:
case BX_INSTR_XADD32:
case BX_INSTR_OR32:
case BX_INSTR_AND32:
case BX_INSTR_TEST32:
case BX_INSTR_XOR32:
case BX_INSTR_CMPS32:
case BX_INSTR_SCAS32:
case BX_INSTR_SHR32:
case BX_INSTR_SHL32:
pf = bx_parity_lookup[(Bit8u) BX_CPU_THIS_PTR oszapc.result_32];
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_ADD64:
case BX_INSTR_ADC64:
case BX_INSTR_SUB64:
case BX_INSTR_SBB64:
case BX_INSTR_CMP64:
case BX_INSTR_NEG64:
case BX_INSTR_XADD64:
case BX_INSTR_OR64:
case BX_INSTR_AND64:
case BX_INSTR_TEST64:
case BX_INSTR_XOR64:
case BX_INSTR_CMPS64:
case BX_INSTR_SCAS64:
case BX_INSTR_SHR64:
case BX_INSTR_SHL64:
pf = bx_parity_lookup[(Bit8u) BX_CPU_THIS_PTR oszapc.result_64];
break;
#endif
default:
pf = 0; // Keep compiler quiet.
BX_PANIC(("get_PF: OSZAPC: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xffff0f;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<2);
BX_CPU_THIS_PTR eflags.val32 |= (!!pf)<<2;
return(pf);
case BX_LF_INDEX_OSZAP:
switch (BX_CPU_THIS_PTR oszap.instr) {
case BX_INSTR_INC8:
case BX_INSTR_DEC8:
pf = bx_parity_lookup[BX_CPU_THIS_PTR oszap.result_8];
break;
case BX_INSTR_INC16:
case BX_INSTR_DEC16:
pf = bx_parity_lookup[(Bit8u) BX_CPU_THIS_PTR oszap.result_16];
break;
case BX_INSTR_INC32:
case BX_INSTR_DEC32:
pf = bx_parity_lookup[(Bit8u) BX_CPU_THIS_PTR oszap.result_32];
break;
2002-09-15 04:18:41 +04:00
#if BX_SUPPORT_X86_64
case BX_INSTR_INC64:
case BX_INSTR_DEC64:
pf = bx_parity_lookup[(Bit8u) BX_CPU_THIS_PTR oszap.result_64];
break;
#endif
default:
pf = 0; // Keep compiler quiet.
BX_PANIC(("get_PF: OSZAP: unknown instr"));
}
BX_CPU_THIS_PTR lf_flags_status &= 0xffff0f;
BX_CPU_THIS_PTR eflags.val32 &= ~(1<<2);
BX_CPU_THIS_PTR eflags.val32 |= (!!pf)<<2;
return(pf);
default:
BX_PANIC(("get_PF: unknown case"));
return(0);
}
}