Ypsilon.Emulation.Processor.YCPU.XSG C# (CSharp) Method

XSG() private method

private XSG ( ushort operand ) : void
operand ushort
return void
        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;
            }
        }