示例#1
0
        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);
            }
        }
示例#2
0
        public void LoaderNegativeOffsetStoresCorrectValue()
        {
            using (var _ = mem.Load(0x8000))
            {
                _
                .Label("Start")
                .RefByte("Start:LO", -2);
            };

            var value = mem.Read(0x8000);

            Assert.AreEqual(0xfe, value);
        }
示例#3
0
        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)));
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
 public void AddressMapReadUnmappedByteReturnsNull()
 {
     mem.Reset();
     Assert.AreEqual(0, mem.Read(0x01));
 }
示例#7
0
 public void CanAssignByte(string command, int address, byte expected)
 {
     _parser.Parse(command);
     Assert.AreEqual(expected, _addressMap.Read((ushort)address));
 }
示例#8
0
        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);
        }
示例#9
0
        private void LogByte(ushort address)
        {
            var value = _addressMap.Read(address);

            _formatter.LogByte(value);
        }