public void Address_FFFF_is_read_complemented_for_expanded_slots() { var contents = new Dictionary <SlotNumber, IMemory> { { new SlotNumber(1, 0), Ram() }, { new SlotNumber(1, 1), Ram() }, { new SlotNumber(1, 2), Ram() }, { new SlotNumber(1, 3), Ram() }, { new SlotNumber(2), Ram() } }; var sut = new SlotsSystem(contents); var value = Fixture.Create <byte>(); sut.WriteToSlotSelectionRegister(0x40); sut[0xFFFF] = value; byte expected = (byte)~value; byte actual = sut[0xFFFF]; Assert.AreEqual(expected, actual); sut.WriteToSlotSelectionRegister(0x80); sut[0xFFFF] = value; expected = (byte)value; actual = sut[0xFFFF]; Assert.AreEqual(expected, actual); }
public void Announces_proper_size() { var sut = new SlotsSystem(new Dictionary <SlotNumber, IMemory> { { NotExpandedSlot(), AnyMemory() } }); Assert.AreEqual(MemorySize, sut.Size); }
public void Can_create_instances() { var sut = new SlotsSystem(new Dictionary <SlotNumber, IMemory> { { NotExpandedSlot(), AnyMemory() } }); Assert.IsNotNull(sut); }
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)); }
private void CreateSlotsSystem() { foreach (var slotConfig in machineConfig["slots"] as IDictionary <string, object> ) { SlotNumber slotNumber; if (!SlotNumber.TryParse(slotConfig.Key, out slotNumber)) { continue; } var pluginConfig = (IDictionary <string, object>)slotConfig.Value; pluginConfig["NestorMSX.slotNumber"] = slotNumber.EncodedByte; var typeName = (string)pluginConfig["type"]; injectedConfig.MergeInto(pluginConfig); object pluginInstance; try { pluginInstance = PluginsLoader.GetPluginInstanceForSlot(typeName, pluginConfig, machineSharedPluginsConfig, globalSharedPluginsConfig, injectedConfig); RegisterPlugin(pluginInstance); } catch (Exception ex) { var message = ex.InnerException?.Message ?? ex.Message; tell($"Could not load plugin {typeName} in slot {slotConfig.Key}: {message}", new object[0]); continue; } var getMemoryMethod = pluginInstance.GetType().GetMethod("GetMemory"); IMemory memory; try { memory = (IMemory)getMemoryMethod.Invoke(pluginInstance, null); } catch (TargetInvocationException ex) { tell($"Error when invoking GetMemory for plugin {typeName} in slot {slotConfig.Key}: {ex.InnerException.Message}", new object[0]); continue; } try { SlotsSystem.SetSlotContents(slotNumber, memory); } catch (Exception ex) { tell($"Error when setting contents for slot {slotConfig.Key}: {ex.Message}", new object[0]); } } }
public void Slot_is_expanded_if_content_for_expanded_slot_is_passed_in_constructor() { var slotNumber = ExpandedSlot(); var contents = new Dictionary <SlotNumber, IMemory>() { { slotNumber, AnyMemory() } }; var sut = new SlotsSystem(contents); Assert.True(sut.IsExpanded(slotNumber.PrimarySlotNumber)); }
public void Writing_subslot_selection_register_does_not_fire_event_if_primary_slot() { var sut = new SlotsSystem(new TwinBit[] { 2 }); var subslotSelectorValue = Fixture.Create <byte>(); var eventFired = false; sut.SecondarySlotSelectionRegisterWritten += (sender, args) => { eventFired = true; }; sut.WriteToSlotSelectionRegister(0); sut[0xFFFF] = subslotSelectorValue; Assert.False(eventFired); }
public void Writing_to_subslot_selection_register_changes_visible_slot_in_connected_pages() { var sut = new SlotsSystem(new TwinBit[] { 2, 3 }); sut.WriteToSlotSelectionRegister(SlotSelectionRegisterValue(0, 2, 3, 2)); Assert.AreEqual(new SlotNumber(0), sut.GetCurrentSlot(0)); Assert.AreEqual(new SlotNumber(2, 0), sut.GetCurrentSlot(1)); Assert.AreEqual(new SlotNumber(3, 0), sut.GetCurrentSlot(2)); Assert.AreEqual(new SlotNumber(2, 0), sut.GetCurrentSlot(3)); sut[0xFFFF] = SlotSelectionRegisterValue(0, 1, 2, 3); Assert.AreEqual(new SlotNumber(0), sut.GetCurrentSlot(0)); Assert.AreEqual(new SlotNumber(2, 1), sut.GetCurrentSlot(1)); Assert.AreEqual(new SlotNumber(3, 0), sut.GetCurrentSlot(2)); Assert.AreEqual(new SlotNumber(2, 3), sut.GetCurrentSlot(3)); }
public void Writing_to_subslot_selection_register_takes_effect_when_pages_are_selected() { var sut = new SlotsSystem(new TwinBit[] { 2, 3 }); sut.WriteToSlotSelectionRegister(SlotSelectionRegisterValue(0, 1, 0, 2)); Assert.AreEqual(new SlotNumber(0), sut.GetCurrentSlot(0)); Assert.AreEqual(new SlotNumber(1), sut.GetCurrentSlot(1)); Assert.AreEqual(new SlotNumber(0), sut.GetCurrentSlot(2)); Assert.AreEqual(new SlotNumber(2, 0), sut.GetCurrentSlot(3)); sut[0xFFFF] = SlotSelectionRegisterValue(0, 1, 2, 3); sut.WriteToSlotSelectionRegister(SlotSelectionRegisterValue(2, 2, 2, 2)); Assert.AreEqual(new SlotNumber(2, 0), sut.GetCurrentSlot(0)); Assert.AreEqual(new SlotNumber(2, 1), sut.GetCurrentSlot(1)); Assert.AreEqual(new SlotNumber(2, 2), sut.GetCurrentSlot(2)); Assert.AreEqual(new SlotNumber(2, 3), sut.GetCurrentSlot(3)); }
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 Specified_slot_contain_its_contents_and_all_others_ends_up_containing_NotConnectedMemory() { var slot0contents = AnyMemory(); var slot10contents = AnyMemory(); var contents = new Dictionary <SlotNumber, IMemory> { { new SlotNumber(0), slot0contents }, { new SlotNumber(1, 0), slot10contents }, { new SlotNumber(1, 1), null }, }; var sut = new SlotsSystem(contents); Assert.AreEqual(slot0contents, sut.GetSlotContents(0)); Assert.AreEqual(slot10contents, sut.GetSlotContents(new SlotNumber(1, 0))); Assert.IsInstanceOf <NotConnectedMemory>(sut.GetSlotContents(new SlotNumber(1, 1))); Assert.IsInstanceOf <NotConnectedMemory>(sut.GetSlotContents(new SlotNumber(1, 2))); Assert.IsInstanceOf <NotConnectedMemory>(sut.GetSlotContents(new SlotNumber(1, 3))); Assert.IsInstanceOf <NotConnectedMemory>(sut.GetSlotContents(2)); Assert.IsInstanceOf <NotConnectedMemory>(sut.GetSlotContents(3)); }