PUSH segment register fix to be like real CPU
This commit is contained in:
parent
1f0d4f9663
commit
48a461116f
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: stack32.cc,v 1.64 2009-12-04 16:53:12 sshwarts Exp $
|
// $Id: stack32.cc,v 1.65 2010-04-30 09:12:52 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001-2009 The Bochs Project
|
// Copyright (C) 2001-2009 The Bochs Project
|
||||||
@ -57,32 +57,92 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::POP_ERX(bxInstruction_c *i)
|
|||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_CS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_CS(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
push_32(BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value);
|
Bit16u val_16 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value;
|
||||||
|
|
||||||
|
if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b) {
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit32u) (ESP-4), val_16);
|
||||||
|
ESP -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit16u) (SP-4), val_16);
|
||||||
|
SP -= 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_DS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_DS(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
push_32(BX_CPU_THIS_PTR sregs[BX_SEG_REG_DS].selector.value);
|
Bit16u val_16 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_DS].selector.value;
|
||||||
|
|
||||||
|
if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b) {
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit32u) (ESP-4), val_16);
|
||||||
|
ESP -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit16u) (SP-4), val_16);
|
||||||
|
SP -= 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_ES(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_ES(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
push_32(BX_CPU_THIS_PTR sregs[BX_SEG_REG_ES].selector.value);
|
Bit16u val_16 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_ES].selector.value;
|
||||||
|
|
||||||
|
if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b) {
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit32u) (ESP-4), val_16);
|
||||||
|
ESP -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit16u) (SP-4), val_16);
|
||||||
|
SP -= 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_FS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_FS(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
push_32(BX_CPU_THIS_PTR sregs[BX_SEG_REG_FS].selector.value);
|
Bit16u val_16 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_FS].selector.value;
|
||||||
|
|
||||||
|
if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b) {
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit32u) (ESP-4), val_16);
|
||||||
|
ESP -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit16u) (SP-4), val_16);
|
||||||
|
SP -= 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_GS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_GS(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
push_32(BX_CPU_THIS_PTR sregs[BX_SEG_REG_GS].selector.value);
|
Bit16u val_16 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_GS].selector.value;
|
||||||
|
|
||||||
|
if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b) {
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit32u) (ESP-4), val_16);
|
||||||
|
ESP -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit16u) (SP-4), val_16);
|
||||||
|
SP -= 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_SS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH32_SS(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
push_32(BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].selector.value);
|
Bit16u val_16 = BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].selector.value;
|
||||||
|
|
||||||
|
if (BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.u.segment.d_b) {
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit32u) (ESP-4), val_16);
|
||||||
|
ESP -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
write_virtual_word_32(BX_SEG_REG_SS, (Bit16u) (SP-4), val_16);
|
||||||
|
SP -= 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::POP32_DS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::POP32_DS(bxInstruction_c *i)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
// $Id: stack64.cc,v 1.46 2010-03-12 20:59:05 sshwarts Exp $
|
// $Id: stack64.cc,v 1.47 2010-04-30 09:12:52 sshwarts Exp $
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001-2009 The Bochs Project
|
// Copyright (C) 2001-2009 The Bochs Project
|
||||||
@ -64,16 +64,14 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::PUSH64_GS(bxInstruction_c *i)
|
|||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::POP64_FS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::POP64_FS(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
// this way is faster and RSP safe
|
Bit64u fs = read_virtual_word_64(BX_SEG_REG_SS, RSP);
|
||||||
Bit64u fs = read_virtual_qword_64(BX_SEG_REG_SS, RSP);
|
|
||||||
load_seg_reg(&BX_CPU_THIS_PTR sregs[BX_SEG_REG_FS], (Bit16u) fs);
|
load_seg_reg(&BX_CPU_THIS_PTR sregs[BX_SEG_REG_FS], (Bit16u) fs);
|
||||||
RSP += 8;
|
RSP += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BX_CPP_AttrRegparmN(1) BX_CPU_C::POP64_GS(bxInstruction_c *i)
|
void BX_CPP_AttrRegparmN(1) BX_CPU_C::POP64_GS(bxInstruction_c *i)
|
||||||
{
|
{
|
||||||
// this way is faster and RSP safe
|
Bit64u gs = read_virtual_word_64(BX_SEG_REG_SS, RSP);
|
||||||
Bit64u gs = read_virtual_qword_64(BX_SEG_REG_SS, RSP);
|
|
||||||
load_seg_reg(&BX_CPU_THIS_PTR sregs[BX_SEG_REG_GS], (Bit16u) gs);
|
load_seg_reg(&BX_CPU_THIS_PTR sregs[BX_SEG_REG_GS], (Bit16u) gs);
|
||||||
RSP += 8;
|
RSP += 8;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user