public void Save(string name, ushort startAddress, ushort length, IAddressMap mem) { var folder = CrossPlatformPathExtensions.ResolveCrossPlatformPart(WorkingDirectory); if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } var combined = CrossPlatformPathExtensions.Combine(WorkingDirectory, name); var filename = Path.GetFullPath(combined); var buffer = new byte[length + 4]; buffer[0] = (byte)(startAddress & 0xff); buffer[1] = (byte)(startAddress >> 8); buffer[2] = (byte)(length & 0xff); buffer[3] = (byte)(length >> 8); for (var ix = 0; ix < length; ix++) { buffer[ix + 4] = mem.Read((ushort)(ix + startAddress)); } using (var file = File.Create(filename)) { file.Write(buffer, 0, length + 4); } }
public void LoaderNegativeOffsetStoresCorrectValue() { using (var _ = mem.Load(0x8000)) { _ .Label("Start") .RefByte("Start:LO", -2); }; var value = mem.Read(0x8000); Assert.AreEqual(0xfe, value); }
public void CanLoadAndRunTestProgram(string workingDirectory, bool removeDirectory = false) { if (removeDirectory) { RemoveDirectory(workingDirectory); } ((MemoryFilePersistence)_persistence).WorkingDirectory = workingDirectory; Assert.IsTrue(_display.Mode.Type == DisplayMode.RenderType.Text); DoSave(); var w = _display.Mode.Width; var h = _display.Mode.Height; _persistence.Load("TestProgram.bin", mem); // Initialise Working Memory using (var loader = mem.Load()) { loader .Write(0x10, '0') .WriteWord(0x12, DISPLAY_BASE_ADDR); } _cpu.Reset(); if (removeDirectory) { RemoveDirectory(workingDirectory); } Assert.AreEqual('0', mem.Read(DISPLAY_BASE_ADDR)); var expected = (h + 9) % 10 + '0'; Assert.AreEqual(expected, mem.Read((ushort)(DISPLAY_BASE_ADDR + (h - 1) * w))); }
private bool IsMemoryFilledWith(IAddressMap mem, ushort start, ushort size, byte value) { var end = (ushort)(start + size - 1); for (var ix = start; ix <= end; ix++) { if (mem.Read(ix) != value) { return(false); } } return(true); }
public void CanClearScreenViaMemoryMappedDisplay() { var cleared = false; var connection = (MockRemoteDisplayConnection)_serviceProvider.GetService <IRemoteDisplayConnection>(); connection.OnClear += (s, e) => { cleared = true; }; var address = (ushort)(MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR + DisplayControlBlock.CONTROL_ADDR); var value = mem.Read(address); value |= DisplayControlBlock.ControlBits.CLEAR_SCREEN; mem.Write(address, value); Assert.IsTrue(cleared); }
public void AddressMapReadUnmappedByteReturnsNull() { mem.Reset(); Assert.AreEqual(0, mem.Read(0x01)); }
public void CanAssignByte(string command, int address, byte expected) { _parser.Parse(command); Assert.AreEqual(expected, _addressMap.Read((ushort)address)); }
public async Task CanGetKeyInInterruptServiceRoutine() { mem.Labels.Push(); _cpu.NopDelayMilliseconds = 100; using (var loader = mem.Load(0x8000)) { loader // Main program .LDA_ABSOLUTE("CharacterBuffer", "LoopStart") .BNE("GotCharacter") .NOP() .NOP() .NOP() .NOP() .JMP_ABSOLUTE("LoopStart") .BRK("GotCharacter") // ISR // Save the registers (P and SP are already saved) .Macro(SaveRegisters, "ISR") // Check for keyboard data .LDA_ZERO_PAGE("KEYBOARD_STATUS_REGISTER") .AND_IMMEDIATE((byte)MemoryMappedKeyboard.StatusBits.KeyUp) // Only interested in KeyUp events .BEQ("NoKeyboardCharacter") // Copy the new character into the buffer .LDA_ZERO_PAGE("KEYBOARD_DATA_REGISTER") .STA_ABSOLUTE("CharacterBuffer") // Clear the keyboard status bits .LDA_IMMEDIATE(0x00) .STA_ZERO_PAGE("KEYBOARD_STATUS_REGISTER") // Done .Macro(RestoreRegisters, "NoKeyboardCharacter") // Data .Write(0xE00, 0x00, "CharacterBuffer") // Wire up ISR .Ref(_cpu.IRQ_VECTOR, "ISR"); } // We use a timer to generate a KeyUp event, 3 seconds after the CPU // has started running the main code. var timer = new System.Timers.Timer(3000) // Wait 3 seconds, then trigger KeyUp { AutoReset = false }; timer.Elapsed += (s, e) => { _keyboard.GenerateKeyUp("a"); }; _cpu.OnStarted += (s, e) => { timer.Start(); }; _cpu.Reset(TimeSpan.FromMinutes(1)); // Run for a maximum of one minute var buf = mem.Labels.Resolve("CharacterBuffer"); Assert.AreEqual('a', mem.Read(buf)); mem.Labels.Pop(); await Task.Delay(0); }
private void LogByte(ushort address) { var value = _addressMap.Read(address); _formatter.LogByte(value); }