diff options
| author | Raymaekers Luca <luca@spacehb.net> | 2025-11-12 18:52:38 +0100 |
|---|---|---|
| committer | Raymaekers Luca <luca@spacehb.net> | 2025-11-12 18:52:38 +0100 |
| commit | d4f6774c172ac1e7c193fc4e89230c873d179c2b (patch) | |
| tree | 049b855ac7b68482dc9e1e35b339f5b4d18d675b /src/sim86/libs/reference_decoder/sim86_memory.cpp | |
| parent | e20d69ffb1f5676bb7960ac4d71c1013e4582149 (diff) | |
checkpoint
Diffstat (limited to 'src/sim86/libs/reference_decoder/sim86_memory.cpp')
| -rw-r--r-- | src/sim86/libs/reference_decoder/sim86_memory.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/sim86/libs/reference_decoder/sim86_memory.cpp b/src/sim86/libs/reference_decoder/sim86_memory.cpp new file mode 100644 index 0000000..1d58ede --- /dev/null +++ b/src/sim86/libs/reference_decoder/sim86_memory.cpp @@ -0,0 +1,66 @@ +/* ======================================================================== + + (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Please see https://computerenhance.com for more information + + ======================================================================== */ + +static u32 GetHighestAddress(segmented_access SegMem) +{ + u32 Result = SegMem.Mask; + return Result; +} + +static u32 GetAbsoluteAddressOf(u32 Mask, u16 SegmentBase, u16 SegmentOffset, u16 AdditionalOffset) +{ + u32 Result = (((u32)SegmentBase << 4) + (u32)(SegmentOffset + AdditionalOffset)) & Mask; + return Result; +} + +static u32 GetAbsoluteAddressOf(segmented_access SegMem, u16 Offset) +{ + u32 Result = GetAbsoluteAddressOf(SegMem.Mask, SegMem.SegmentBase, SegMem.SegmentOffset, Offset); + return Result; +} + +static segmented_access MoveBaseBy(segmented_access Access, s32 Offset) +{ + Access.SegmentOffset += Offset; + + segmented_access Result = Access; + + Result.SegmentBase += (Result.SegmentOffset >> 4); + Result.SegmentOffset &= 0xf; + + assert(GetAbsoluteAddressOf(Result, 0) == GetAbsoluteAddressOf(Access, 0)); + + return Result; +} + +static u8 *AccessMemory(segmented_access SegMem, u16 Offset) +{ + u32 AbsAddr = GetAbsoluteAddressOf(SegMem, Offset); + u8 *Result = SegMem.Memory + AbsAddr; + return Result; +} + +static b32 IsValid(segmented_access SegMem) +{ + b32 Result = (SegMem.Mask != 0); + return Result; +} + +static segmented_access FixedMemoryPow2(u32 SizePow2, u8 *Memory) +{ + segmented_access Result = {}; + + Result.Memory = Memory; + Result.Mask = (1 << SizePow2) - 1; + + return Result; +} |
