/// <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 });
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; } }