Пример #1
0
        /// <summary>
        /// Returns the current value of an attribute controller register.
        /// </summary>
        /// <param name="address">Address of register to read.</param>
        /// <returns>Current value of the register.</returns>
        public byte ReadRegister(AttributeControllerRegister address)
        {
            if (address >= AttributeControllerRegister.FirstPaletteEntry && address <= AttributeControllerRegister.LastPaletteEntry)
            {
                return(this.InternalPalette[(byte)address]);
            }

            return(address switch
            {
                AttributeControllerRegister.AttributeModeControl => this.AttributeModeControl,
                AttributeControllerRegister.OverscanColor => this.OverscanColor,
                AttributeControllerRegister.ColorPlaneEnable => this.ColorPlaneEnable,
                AttributeControllerRegister.HorizontalPixelPanning => this.HorizontalPixelPanning,
                AttributeControllerRegister.ColorSelect => this.ColorSelect,
                _ => 0
            });
Пример #2
0
        public void WriteByte(int port, byte value)
        {
            switch (port)
            {
            case Ports.DacAddressReadMode:
                Dac.ReadIndex = value;
                break;

            case Ports.DacAddressWriteMode:
                Dac.WriteIndex = value;
                break;

            case Ports.DacData:
                Dac.Write(value);
                break;

            case Ports.GraphicsControllerAddress:
                graphicsRegister = (GraphicsRegister)value;
                break;

            case Ports.GraphicsControllerData:
                Graphics.WriteRegister(graphicsRegister, value);
                break;

            case Ports.SequencerAddress:
                sequencerRegister = (SequencerRegister)value;
                break;

            case Ports.SequencerData:
                var previousMode = Sequencer.SequencerMemoryMode;
                Sequencer.WriteRegister(sequencerRegister, value);
                if ((previousMode & SequencerMemoryMode.Chain4) == SequencerMemoryMode.Chain4 && (Sequencer.SequencerMemoryMode & SequencerMemoryMode.Chain4) == 0)
                {
                    EnterModeX();
                }
                break;

            case Ports.AttributeAddress:
                if (!attributeDataMode)
                {
                    attributeRegister = (AttributeControllerRegister)(value & 0x1F);
                }
                else
                {
                    AttributeController.WriteRegister(attributeRegister, value);
                }
                attributeDataMode = !attributeDataMode;
                break;

            case Ports.AttributeData:
                AttributeController.WriteRegister(attributeRegister, value);
                break;

            case Ports.CrtControllerAddress:
            case Ports.CrtControllerAddressAlt:
                crtRegister = (CrtControllerRegister)value;
                break;

            case Ports.CrtControllerData:
            case Ports.CrtControllerDataAlt:
                int previousVerticalEnd = CrtController.VerticalDisplayEnd;
                CrtController.WriteRegister(crtRegister, value);
                if (previousVerticalEnd != CrtController.VerticalDisplayEnd)
                {
                    ChangeVerticalEnd();
                }
                break;
            }
        }