コード例 #1
0
        public void ReadWorksAsExpected()
        {
            // --- Arrange
            var dev = new SpectrumP3MemoryDevice();

            dev.OnAttachedToVm(null);
            for (var i = 0; i < 0x4000; i++)
            {
                dev.CurrentRom[i] = 0xFF;
                for (var b = 0; b < 8; b++)
                {
                    dev.RamBanks[b][i] = (byte)b;
                }
            }

            // -- Act/Assert
            for (var i = 0; i <= 0x3FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0xFF);
            }
            for (var i = 0x4000; i <= 0x7FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x05);
            }
            for (var i = 0x8000; i <= 0xBFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x02);
            }
            for (var i = 0xC000; i <= 0xFFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x00);
            }
        }
コード例 #2
0
        public void ResetWorksAsExpected()
        {
            // --- Arrange
            var dev = new SpectrumP3MemoryDevice();

            dev.OnAttachedToVm(null);

            // --- Act
            dev.Reset();

            // -- Assert
            dev.IsInAllRamMode.ShouldBeFalse();
            dev.GetSelectedRomIndex().ShouldBe(0);
            dev.GetSelectedBankIndex(1).ShouldBe(5);
            dev.GetSelectedBankIndex(2).ShouldBe(2);
            dev.GetSelectedBankIndex(3).ShouldBe(0);

            for (var i = 0; i <= 0x3FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x00);
            }
            for (var i = 0x4000; i <= 0xFFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0xFF);
            }

            for (var b = 0; b < 8; b++)
            {
                dev.PageIn(3, b);
                for (var i = 0xC000; i <= 0xFFFF; i++)
                {
                    dev.Read((ushort)i).ShouldBe((byte)0xFF);
                }
            }
        }
コード例 #3
0
        public void WriteWorksAsExpected()
        {
            // --- Arrange
            var dev = new SpectrumP3MemoryDevice();

            dev.OnAttachedToVm(null);
            dev.Reset();

            for (var i = 0; i < 0x4000; i++)
            {
                dev.CurrentRom[i] = 0xFC;
            }

            for (var i = 0; i <= 0xFFFF; i++)
            {
                dev.Write((ushort)i, (byte)(i & 0xFF));
            }

            // -- Assert
            for (var i = 0; i <= 0x3FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0xFC);
            }
            for (var i = 0x4000; i <= 0x7FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)(i & 0xFF));
            }
            for (var i = 0x8000; i <= 0xBFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)(i & 0xFF));
            }
            for (var i = 0xC000; i <= 0xFFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)(i & 0xFF));
            }
            for (var b = 0; b < 8; b++)
            {
                for (var i = 0; i <= 0x3FFF; i++)
                {
                    if (b == 0 || b == 2 || b == 5)
                    {
                        dev.RamBanks[b][i].ShouldBe((byte)(i & 0xFF));
                    }
                    else
                    {
                        dev.RamBanks[b][i].ShouldBe((byte)0xFF);
                    }
                }
            }
        }
コード例 #4
0
        public void SelectRomWorksWithPage3()
        {
            // --- Arrange
            var dev = new SpectrumP3MemoryDevice();

            dev.OnAttachedToVm(null);
            dev.SelectRom(0);
            for (var i = 0; i < 0x4000; i++)
            {
                dev.CurrentRom[i] = 0xAA;
            }
            dev.SelectRom(3);
            for (var i = 0; i < 0x4000; i++)
            {
                dev.CurrentRom[i] = 0x55;
            }
            dev.SelectRom(0);

            // --- Act
            dev.SelectRom(3);

            // -- Assert
            dev.IsInAllRamMode.ShouldBeFalse();
            for (var i = 0; i <= 0x3FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x55);
            }
        }
コード例 #5
0
        public void CopyRomWorksWithPage3()
        {
            // --- Arrange
            var dev = new SpectrumP3MemoryDevice();

            dev.OnAttachedToVm(null);
            for (var i = 0; i < 0x4000; i++)
            {
                dev.CurrentRom[i] = 0xFF;
                for (var b = 0; b < 8; b++)
                {
                    dev.RamBanks[b][i] = (byte)b;
                }
            }
            dev.SelectRom(3);

            // --- Act
            var rom = new byte[0x4000];

            for (var i = 0; i <= 0x3FFF; i++)
            {
                rom[i] = (byte)(i - 3);
            }
            dev.CopyRom(rom);

            // -- Assert
            for (var i = 0; i <= 0x3FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)(i - 3));
            }
            for (var i = 0x4000; i <= 0x7FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x05);
            }
            for (var i = 0x8000; i <= 0xBFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x02);
            }
            for (var i = 0xC000; i <= 0xFFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x00);
            }
        }
コード例 #6
0
        /// <summary>
        /// Handles the read from the port
        /// </summary>
        /// <param name="addr">Full port address</param>
        /// <param name="readValue">The value read from the port</param>
        /// <returns>True, if read handled; otherwise, false</returns>
        public override bool HandleRead(ushort addr, out byte readValue)
        {
            if (ParentDevice is GenericPortDeviceBase portDev)
            {
                // --- Floating bus is available on when paging is enabled
                if (portDev.Handlers.FirstOrDefault(
                        ph => ph.GetType() == typeof(SpectrumP3MemoryPagePortHandler)) is
                    SpectrumP3MemoryPagePortHandler memPort &&
                    !memPort.PagingEnabled)
                {
                    readValue = 0xFF;
                    return(true);
                }
            }

            var tact = HostVm.CurrentFrameTact % _screenDevice.RenderingTactTable.Length;
            var rt   = _screenDevice.RenderingTactTable[tact];

            switch (rt.Phase)
            {
            case ScreenRenderingPhase.BorderFetchPixel:
            case ScreenRenderingPhase.DisplayB2FetchB1:
            case ScreenRenderingPhase.DisplayB1FetchB2:
                readValue = (byte)(_memoryDevice.Read(rt.PixelByteToFetchAddress, true) | 0x01);
                break;

            case ScreenRenderingPhase.BorderFetchPixelAttr:
            case ScreenRenderingPhase.DisplayB2FetchA1:
            case ScreenRenderingPhase.DisplayB1FetchA2:
                readValue = (byte)(_memoryDevice.Read(rt.AttributeToFetchAddress, true) | 0x01);
                break;

            default:
                readValue = _memoryDevice.LastContendedReadValue;
                break;
            }
            return(true);
        }
コード例 #7
0
        public void PageInWithSlot2GoesToSpecialMode(int bank)
        {
            // --- Arrange
            var dev = new SpectrumP3MemoryDevice();

            dev.OnAttachedToVm(null);
            for (var i = 0; i < 0x4000; i++)
            {
                dev.CurrentRom[i] = 0xFF;
                for (var b = 0; b < 8; b++)
                {
                    dev.RamBanks[b][i] = (byte)b;
                }
            }

            // --- Act
            dev.PageIn(2, bank);

            // --- Assert
            dev.IsInAllRamMode.ShouldBeTrue();
            for (var i = 0; i <= 0x3FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x00);
            }
            for (var i = 0x4000; i <= 0x7FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x05);
            }
            for (var i = 0x8000; i <= 0xBFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)bank);
            }
            for (var i = 0xC000; i <= 0xFFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x00);
            }
        }
コード例 #8
0
        public void PageInWithSlot3KeepsNormalMode()
        {
            // --- Arrange
            var dev = new SpectrumP3MemoryDevice();

            dev.OnAttachedToVm(null);
            for (var i = 0; i < 0x4000; i++)
            {
                dev.CurrentRom[i] = 0xFF;
                for (var b = 0; b < 8; b++)
                {
                    dev.RamBanks[b][i] = (byte)b;
                }
            }

            // --- Act
            dev.PageIn(3, 7);

            // --- Assert
            dev.SpecialMode.ShouldBeFalse();
            for (var i = 0; i <= 0x3FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0xFF);
            }
            for (var i = 0x4000; i <= 0x7FFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x05);
            }
            for (var i = 0x8000; i <= 0xBFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x02);
            }
            for (var i = 0xC000; i <= 0xFFFF; i++)
            {
                dev.Read((ushort)i).ShouldBe((byte)0x07);
            }
        }