private void XSG(ushort operand)
{
if (!PS_S) {
Interrupt_UnPrivFault(operand);
return;
}
bool push = (operand & 0x0100) != 0;
int register = (operand & 0x0E00) >> 9;
bool user = (operand & 0x8000) != 0;
Segment segment;
switch ((SegmentIndex)register) {
case SegmentIndex.CS:
segment = user ? m_CSU : m_CSS;
break;
case SegmentIndex.DS:
segment = user ? m_DSU : m_DSS;
break;
case SegmentIndex.ES:
segment = user ? m_ESU : m_ESS;
break;
case SegmentIndex.SS:
segment = user ? m_SSU : m_SSS;
break;
case SegmentIndex.IS:
if (user) {
Interrupt_UndefFault(operand);
return;
}
segment = m_IS;
break;
default:
// operand does not include a valid segment index.
Interrupt_UndefFault(operand);
return;
}
if (push) {
ushort register_lo = (ushort)segment.Register;
ushort register_hi = (ushort)(segment.Register >> 16);
StackPush(operand, register_hi);
StackPush(operand, register_lo);
}
else {
ushort register_lo = StackPop(operand);
ushort register_hi = StackPop(operand);
segment.Register = (uint)(register_hi << 16) | register_lo;
}
}