Exemple #1
0
        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);
        }
Exemple #2
0
        public void Announces_proper_size()
        {
            var sut = new SlotsSystem(new Dictionary <SlotNumber, IMemory> {
                { NotExpandedSlot(), AnyMemory() }
            });

            Assert.AreEqual(MemorySize, sut.Size);
        }
Exemple #3
0
        public void Can_create_instances()
        {
            var sut = new SlotsSystem(new Dictionary <SlotNumber, IMemory> {
                { NotExpandedSlot(), AnyMemory() }
            });

            Assert.IsNotNull(sut);
        }
Exemple #4
0
        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));
        }
Exemple #5
0
        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]);
                }
            }
        }
Exemple #6
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));
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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));
        }
Exemple #9
0
        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));
        }
Exemple #10
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);
        }
Exemple #11
0
        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));
        }