Пример #1
0
        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);
            }
        }
Пример #2
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));
            }
        }
Пример #3
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));
        }
Пример #4
0
        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));
        }
Пример #5
0
        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 };
            }
        }
Пример #6
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);
        }
Пример #7
0
        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);
            }
        }
Пример #8
0
 public bool IsExpanded(TwinBit primarySlotNumber)
 {
     return(isExpanded[primarySlotNumber]);
 }
Пример #9
0
 public SecondarySlotSelectionRegisterWrittenEventArgs(byte value, TwinBit primarySlotNumber)
 {
     this.Value             = value;
     this.PrimarySlotNumber = primarySlotNumber;
 }