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