コード例 #1
0
        public void AllocationAndFree()
        {
            var memoryCore = new RealModeMemoryCore(_logger);

            var ptr1 = memoryCore.Malloc(256);

            ptr1.Offset.Should().Be(0);

            var ptr2 = memoryCore.Malloc(512);

            ptr2.Offset.Should().Be(0);
            (ptr2.Segment - ptr1.Segment).Should().Be(256 / 16);

            var ptr3 = memoryCore.Malloc(512);

            ptr3.Offset.Should().Be(0);
            (ptr3.Segment - ptr2.Segment).Should().Be(512 / 16);

            memoryCore.Free(ptr2);
            memoryCore.Free(ptr1);
            memoryCore.Free(ptr3);

            var ptr = memoryCore.Malloc(0);

            ptr.Should().Be(ptr1);
        }
コード例 #2
0
        public void MemoryMap_DWord()
        {
            var memoryCore = new RealModeMemoryCore(_logger);
            // these two point to the same physical address
            var ptr1 = new FarPtr(0x6002, 0x12);
            var ptr2 = new FarPtr(0x6003, 2);

            (memoryCore as IMemoryCore).SetDWord(ptr1, 0x10203040);
            (memoryCore as IMemoryCore).GetDWord(ptr1).Should().Be(0x10203040);
            (memoryCore as IMemoryCore).GetDWord(ptr2).Should().Be(0x10203040);
        }
コード例 #3
0
        public void MemoryMap_StringStripNull()
        {
            var str        = "This is a test";
            var memoryCore = new RealModeMemoryCore(_logger);
            // these two point to the same physical address
            var ptr1 = new FarPtr(0x6002, 0x12);
            var ptr2 = new FarPtr(0x6003, 2);

            (memoryCore as IMemoryCore).SetArray(ptr1, Encoding.ASCII.GetBytes(str + "\0"));
            Encoding.ASCII.GetString((memoryCore as IMemoryCore).GetString(ptr1, stripNull: true)).Should().Be(str);
            Encoding.ASCII.GetString((memoryCore as IMemoryCore).GetString(ptr2, stripNull: true)).Should().Be(str);
        }
コード例 #4
0
        public void MemoryMap_Array()
        {
            var bytes      = new byte[] { 0x10, 0x20, 0x30, 0x40, 0x50, 0x60 };
            var memoryCore = new RealModeMemoryCore(_logger);
            // these two point to the same physical address
            var ptr1 = new FarPtr(0x6002, 0x12);
            var ptr2 = new FarPtr(0x6003, 2);

            (memoryCore as IMemoryCore).SetArray(ptr1, bytes);
            (memoryCore as IMemoryCore).GetArray(ptr1, (ushort)bytes.Length).ToArray().Should().BeEquivalentTo(bytes);
            (memoryCore as IMemoryCore).GetArray(ptr2, (ushort)bytes.Length).ToArray().Should().BeEquivalentTo(bytes);
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: tuday2/MBBSEmu
        private void Execute(string[] args)
        {
            var realMode = args.Length == 1 && (args[0].Equals("-realmode") || args[0].Equals("-real"));

            if (realMode)
            {
                memoryCore = realModeMemoryCore = new RealModeMemoryCore(logger: null);
            }
            else
            {
                memoryCore = protectedModeMemoryCore = new ProtectedModeMemoryCore(null);
            }

            mbbsEmuCpuCore      = new CpuCore(logger: null);
            mbbsEmuCpuRegisters = (ICpuRegisters)mbbsEmuCpuCore;
            mbbsEmuCpuCore.Reset(memoryCore, null, null, null);

            // Reset
            mbbsEmuCpuRegisters.Zero();
            mbbsEmuCpuCore.Reset();
            memoryCore.Clear();
            mbbsEmuCpuCore.Registers.CS = 0x1000;
            mbbsEmuCpuCore.Registers.DS = 2;
            mbbsEmuCpuCore.Registers.IP = 0;

            var instructions = new Assembler(16);
            var label_start  = instructions.CreateLabel();
            var label_loop   = instructions.CreateLabel();

            instructions.Label(ref label_start);
            instructions.mov(__word_ptr[0], 1);
            instructions.Label(ref label_loop);
            instructions.mov(ax, __word_ptr[0]);
            instructions.cmp(ax, 0x7FFF);
            instructions.je(label_start);
            instructions.inc(__word_ptr[0]);
            instructions.jmp(label_loop);

            CreateCodeSegment(instructions);
            CreateDataSegment(new ReadOnlySpan <byte>());

            _isRunning = true;
            new Thread(RunThread).Start();
            new Thread(MonitorThread).Start();

            Console.ReadKey();
            _isRunning = false;
        }
コード例 #6
0
        public void VariableAllocation()
        {
            var memoryCore = new RealModeMemoryCore(_logger);

            memoryCore.TryGetVariablePointer("TEST", out var ptr).Should().BeFalse();
            ptr = memoryCore.AllocateVariable("TEST", 16);
            ptr.IsNull().Should().BeFalse();
            ptr.Offset.Should().Be(0);

            memoryCore.TryGetVariablePointer("TEST", out var ptr2).Should().BeTrue();
            ptr2.Should().Be(ptr);

            var ptr3 = memoryCore.GetOrAllocateVariablePointer("TEST", 16);

            ptr3.Should().Be(ptr);

            var ptr4 = memoryCore.GetOrAllocateVariablePointer("ANOTHER", 16);

            ptr4.Should().NotBe(ptr);
            ptr4.Offset.Should().Be(0);
        }