public byte ReadFromPort(TwinBit portNumber) { valueWrittenToPort1 = null; if (portNumber == 0) { if (expansionVramSelected) { return(0xFF); } var value = readAheadBuffer; vramPointer = (vramPointer + 1) & vramAddressMask; readAheadBuffer = Vram[vramPointer]; return(value); } if (statusRegisterNumberToRead == 0) { var value = statusRegisterValue; statusRegisterValue &= 0x7F; IntLineIsActive = false; return(value); } else if (statusRegisterNumberToRead == 2) { var value = lastValueOfS2; lastValueOfS2 ^= 0xE0; return(value); } else { return(0); } }
private void WriteToSecondarySlotRegister(byte value) { var primarySlotNumber = visibleSlotNumbers[3].PrimarySlotNumber; secondarySlotSelectionRegisterForEachPrimarySlot[primarySlotNumber] = value; var tempValue = value; for (int p = 0; p < 4; p++) { TwinBit page = p; TwinBit subslotNumber = tempValue & 3; secondarySlotsSelectedForEachPrimarySlot[primarySlotNumber][page] = subslotNumber; if (visibleSlotNumbers[page].PrimarySlotNumber == primarySlotNumber) { var newSlotNumber = new SlotNumber(primarySlotNumber, subslotNumber); SetVisibleSlot((int)page, newSlotNumber); } tempValue >>= 2; } if (SecondarySlotSelectionRegisterWritten != null) { SecondarySlotSelectionRegisterWritten( this, new SecondarySlotSelectionRegisterWrittenEventArgs(value, primarySlotNumber)); } }
public void Slot_are_expanded_as_array_of_expanded_slot_numbers_passed() { var expandedSlots = new TwinBit[] { 1, 3 }; var sut = new SlotsSystem(expandedSlots); Assert.False(sut.IsExpanded(0)); Assert.True(sut.IsExpanded(1)); Assert.False(sut.IsExpanded(2)); Assert.True(sut.IsExpanded(3)); }
public void Exception_is_thrown_if_content_for_non_existing_expanded_slot_is_passed() { var expandedSlots = new TwinBit[] { 1, 3 }; var contents = new Dictionary <SlotNumber, IMemory> { { new SlotNumber(0, 1), AnyMemory() } }; Assert.Throws <ArgumentException>(() => new SlotsSystem(contents, expandedSlots)); }
private void FillSecondarySlotsSelectedForEachPrimarySlotTable() { secondarySlotsSelectedForEachPrimarySlot = new Dictionary <TwinBit, TwinBit[]>(); for (int primarySlot = 0; primarySlot < 4; primarySlot++) { if (!IsExpanded(primarySlot)) { continue; } secondarySlotsSelectedForEachPrimarySlot[primarySlot] = new TwinBit[] { 0, 0, 0, 0 }; } }
public void Writing_subslot_selection_register_fires_event_if_expanded_slot() { var sut = new SlotsSystem(new TwinBit[] { 2 }); var subslotSelectorValue = Fixture.Create <byte>(); byte subslotSelectorValueInEvent = 0; TwinBit primarySlotValueInEvent = 0; var eventFired = false; sut.SecondarySlotSelectionRegisterWritten += (sender, args) => { eventFired = true; subslotSelectorValueInEvent = args.Value; primarySlotValueInEvent = args.PrimarySlotNumber; }; sut.WriteToSlotSelectionRegister(SlotSelectionRegisterValue(0, 0, 0, 2)); sut[0xFFFF] = subslotSelectorValue; Assert.True(eventFired); Assert.AreEqual(subslotSelectorValue, subslotSelectorValueInEvent); Assert.AreEqual(2, primarySlotValueInEvent); }
public void WriteToPort(TwinBit portNumber, byte value) { var oldValueWrittenToPort1 = valueWrittenToPort1; valueWrittenToPort1 = null; if (portNumber == 0) { WriteVram(vramPointer, value); vramPointer = (vramPointer + 1) & vramAddressMask; readAheadBuffer = value; return; } if (portNumber == 3) { if (registerNumberForIndirectAccess != 17) { WriteControlRegister(value, registerNumberForIndirectAccess); } if (autoIncrementRegisterNumberForIndirectAccess) { registerNumberForIndirectAccess = (byte)((registerNumberForIndirectAccess + 1) & 0x3F); } return; } if (portNumber == 2) { if (valueWrittenToPort2 == null) { valueWrittenToPort2 = value; } else { var r = (valueWrittenToPort2.Value >> 4) & 7; var b = (valueWrittenToPort2.Value) & 7; var g = value & 7; var color = Color.FromArgb(r, g, b); displayRenderer.SetPalette(paletteRegisterValue, color); valueWrittenToPort2 = null; paletteRegisterValue = (byte)((paletteRegisterValue + 1) & 0x0F); } return; } if (oldValueWrittenToPort1 == null) { valueWrittenToPort1 = value; return; } if ((value & 0x80) == 0) { SetVramAccess(oldValueWrittenToPort1.Value, value, vramAddressThreeHighBits); } else { WriteControlRegister(oldValueWrittenToPort1.Value, value); } }
public bool IsExpanded(TwinBit primarySlotNumber) { return(isExpanded[primarySlotNumber]); }
public SecondarySlotSelectionRegisterWrittenEventArgs(byte value, TwinBit primarySlotNumber) { this.Value = value; this.PrimarySlotNumber = primarySlotNumber; }