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); } }
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); } } }
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); } } } }
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); } }
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); } }
/// <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); }
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); } }
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); } }