public Loader WriteWord(ushort address, ushort value, string label = null) { AddLabel(label, address); _addressMap.WriteWord(address, value); Cursor = (ushort)(address + 2); return(this); }
public void Setup() { _logger = (UnitTestLogger <CPU6502>)_serviceProvider.GetService <ILogger <CPU6502> >(); _logger.GetOutput(); // Clear any buffered output mem = _serviceProvider.GetService <IAddressMap>(); mem.Install(new Ram(0x0000, 0x10000)); _display = _serviceProvider.GetService <IMemoryMappedDisplay>(); _display.Locate(DISPLAY_BASE_ADDR, DISPLAY_SIZE); mem.Install(_display); AsyncUtil.RunSync(mem.Initialise); _display.Clear(); _cpu = (CPU6502)_serviceProvider.GetService <IDebuggableCpu>(); _cpu.LogLevel = LogLevel.Trace; mem.WriteWord(_cpu.RESET_VECTOR, PROG_START); mem.Labels.Clear(); mem.Labels.Add("DISPLAY_CONTROL_ADDR", MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR); mem.Labels.Add("DISPLAY_BASE_ADDR", DISPLAY_BASE_ADDR); mem.Labels.Add("DISPLAY_SIZE", DISPLAY_SIZE); mem.Labels.Add("RESET_VECTOR", _cpu.RESET_VECTOR); mem.Labels.Add("IRQ_VECTOR", _cpu.IRQ_VECTOR); mem.Labels.Add("NMI_VECTOR", _cpu.NMI_VECTOR); _cpuHoldEvent = _serviceProvider.GetService <ICpuHoldEvent>(); _cpuStepEvent = _serviceProvider.GetService <ICpuStepEvent>(); _cancellationTokenWrapper = _serviceProvider.GetService <CancellationTokenWrapper>(); _cancellationTokenWrapper.Reset(); }
public async Task Setup() { mem = _serviceProvider.GetService <IAddressMap>(); mem.Install(new Ram(0x0000, 0x10000)); _display = _serviceProvider.GetService <IMemoryMappedDisplay>(); _display.Locate(DISPLAY_BASE_ADDR, DISPLAY_SIZE); mem.Install(_display); await _display.Initialise(); _display.Clear(); _cpu = (CPU6502)_serviceProvider.GetService <IDebuggableCpu>(); _cpu.LogLevel = LogLevel.Trace; mem.WriteWord(_cpu.RESET_VECTOR, PROG_START); _persistence = new MemoryFilePersistence { WorkingDirectory = "~/6502Programs" }; mem.Labels.Add("DISPLAY_CONTROL_ADDR", MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR); mem.Labels.Add("DISPLAY_BASE_ADDR", DISPLAY_BASE_ADDR); mem.Labels.Add("DISPLAY_SIZE", DISPLAY_SIZE); mem.Labels.Add("RESET_VECTOR", _cpu.RESET_VECTOR); mem.Labels.Add("IRQ_VECTOR", _cpu.IRQ_VECTOR); mem.Labels.Add("NMI_VECTOR", _cpu.NMI_VECTOR); mem.Labels.Push(); }
public async Task Setup() { mem = _serviceProvider.GetService <IAddressMap>(); mem.Install(new Ram(0x0000, 0x10000)); _display = _serviceProvider.GetService <IMemoryMappedDisplay>(); _display.Locate(DISPLAY_BASE_ADDR, DISPLAY_SIZE); mem.Install(_display); _keyboard = _serviceProvider.GetService <IMemoryMappedKeyboard>(); _keyboard.StartAddress = KEYBOARD_BASE_ADDR; mem.Install((IAddressAssignment)_keyboard); await mem.Initialise(); _display.Clear(); _cpu = (CPU6502)_serviceProvider.GetService <IDebuggableCpu>(); _cpu.LogLevel = LogLevel.Trace; _keyboard.RequestInterrupt += async(s, e) => { await _cpu.Interrupt(s, e); }; mem.WriteWord(_cpu.RESET_VECTOR, PROG_START); mem.Labels.Add("DISPLAY_CONTROL_ADDR", MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR); mem.Labels.Add("DISPLAY_BASE_ADDR", DISPLAY_BASE_ADDR); mem.Labels.Add("DISPLAY_SIZE", DISPLAY_SIZE); mem.Labels.Add("KEYBOARD_STATUS_REGISTER", MemoryMappedKeyboard.STATUS_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("KEYBOARD_CONTROL_REGISTER", MemoryMappedKeyboard.CONTROL_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("KEYBOARD_DATA_REGISTER", MemoryMappedKeyboard.DATA_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("KEYBOARD_SCAN_CODE_REGISTER", MemoryMappedKeyboard.SCAN_CODE_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("RESET_VECTOR", _cpu.RESET_VECTOR); mem.Labels.Add("IRQ_VECTOR", _cpu.IRQ_VECTOR); mem.Labels.Add("NMI_VECTOR", _cpu.NMI_VECTOR); }
public void Start() { mem.Install(new Ram(0x0000, 0x10000)); _display.Locate(DISPLAY_BASE_ADDR, DISPLAY_SIZE); mem.Install(_display); // This is interactive, so we want the RemoteKeyboardConnection mem.Install((IAddressAssignment)_keyboard); AsyncUtil.RunSync(() => mem.Initialise()); _display.Clear(); _cpu.LogLevel = LogLevel.Trace; _keyboard.RequestInterrupt += async(s, e) => { await _cpu.Interrupt(); }; mem.WriteWord(_cpu.RESET_VECTOR, PROG_START); mem.Labels.Clear(); mem.Labels.Add("DISPLAY_CONTROL_ADDR", MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR); mem.Labels.Add("DISPLAY_CONTROL_REGISTER", MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR + DisplayControlBlock.CONTROL_ADDR); mem.Labels.Add("CURSOR_X_REGISTER", MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR + DisplayControlBlock.CURSOR_X_ADDR); mem.Labels.Add("CURSOR_Y_REGISTER", MemoryMappedDisplay.DISPLAY_CONTROL_BLOCK_ADDR + DisplayControlBlock.CURSOR_X_ADDR); mem.Labels.Add("DISPLAY_BASE_ADDR", DISPLAY_BASE_ADDR); mem.Labels.Add("DISPLAY_SIZE", DISPLAY_SIZE); mem.Labels.Add("KEYBOARD_STATUS_REGISTER", MemoryMappedKeyboard.STATUS_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("KEYBOARD_CONTROL_REGISTER", MemoryMappedKeyboard.CONTROL_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("KEYBOARD_DATA_REGISTER", MemoryMappedKeyboard.DATA_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("KEYBOARD_SCAN_CODE_REGISTER", MemoryMappedKeyboard.SCAN_CODE_REGISTER + KEYBOARD_BASE_ADDR); mem.Labels.Add("RESET_VECTOR", _cpu.RESET_VECTOR); mem.Labels.Add("IRQ_VECTOR", _cpu.IRQ_VECTOR); mem.Labels.Add("NMI_VECTOR", _cpu.NMI_VECTOR); Run(); }
public void CanReadBlock() { mem.WriteWord(0x0000, 0x1234); mem.WriteWord(0x0002, 0x2345); mem.WriteWord(0x0004, 0x3456); mem.WriteWord(0x0006, 0x4567); var result = mem.ReadBlock(0x0000, 0x0007); Assert.AreEqual(0x34, result[0]); Assert.AreEqual(0x12, result[1]); Assert.AreEqual(0x45, result[2]); Assert.AreEqual(0x23, result[3]); Assert.AreEqual(0x56, result[4]); Assert.AreEqual(0x34, result[5]); Assert.AreEqual(0x67, result[6]); Assert.AreEqual(0x45, result[7]); }
private bool AssignMemoryWord(string expression, ushort value) { ushort address; if (!expression.StartsWith("&")) { return(false); } expression = expression.After("&"); if (TryParseAddress(expression, out address)) { _addressMap.WriteWord(address, value); return(true); } return(false); }