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