mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
Done MemoryBlock API
This commit is contained in:
parent
b996a83fc3
commit
38c3f36972
1 changed files with 122 additions and 6 deletions
|
|
@ -4,17 +4,35 @@ using IL2CPU.API.Attribs;
|
||||||
|
|
||||||
namespace Cosmos.Core
|
namespace Cosmos.Core
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// MemoryBlock class. Used to read and write to memory blocks.
|
||||||
|
/// </summary>
|
||||||
public class MemoryBlock
|
public class MemoryBlock
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Memory block base address.
|
||||||
|
/// </summary>
|
||||||
public readonly uint Base;
|
public readonly uint Base;
|
||||||
|
/// <summary>
|
||||||
|
/// Memory block size.
|
||||||
|
/// </summary>
|
||||||
public readonly uint Size;
|
public readonly uint Size;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bytes memory block.
|
||||||
|
/// </summary>
|
||||||
public readonly MemoryBlock08 Bytes;
|
public readonly MemoryBlock08 Bytes;
|
||||||
|
/// <summary>
|
||||||
|
/// Words memory block.
|
||||||
|
/// </summary>
|
||||||
public readonly MemoryBlock16 Words;
|
public readonly MemoryBlock16 Words;
|
||||||
|
/// <summary>
|
||||||
|
/// DWords memory block.
|
||||||
|
/// </summary>
|
||||||
public readonly MemoryBlock32 DWords;
|
public readonly MemoryBlock32 DWords;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create new inctanse of the <see cref="MemoryBlock"/> class.
|
/// Create new instance of the <see cref="MemoryBlock"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="aBase">A base.</param>
|
/// <param name="aBase">A base.</param>
|
||||||
/// <param name="aSize">A size.</param>
|
/// <param name="aSize">A size.</param>
|
||||||
|
|
@ -141,12 +159,24 @@ namespace Cosmos.Core
|
||||||
MemoryOperations.Fill(xDest, aData, (int)aCount);
|
MemoryOperations.Fill(xDest, aData, (int)aCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy data from the buffer to the start of the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aData">A data buffer array.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aData length in greater then Int32.MaxValue.</exception>
|
||||||
[DebugStub(Off = true)]
|
[DebugStub(Off = true)]
|
||||||
public unsafe void Copy(uint[] aData)
|
public unsafe void Copy(uint[] aData)
|
||||||
{
|
{
|
||||||
Copy(0, aData, 0, aData.Length);
|
Copy(0, aData, 0, aData.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy data from the buffer array to the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aStart">A data starting position inside the memory block.</param>
|
||||||
|
/// <param name="aData">A data buffer array.</param>
|
||||||
|
/// <param name="aIndex">A staring index in the source data buffer array.</param>
|
||||||
|
/// <param name="aCount">Number of bytes to copy.</param>
|
||||||
unsafe public void Copy(uint aStart, uint[] aData, int aIndex, int aCount)
|
unsafe public void Copy(uint aStart, uint[] aData, int aIndex, int aCount)
|
||||||
{
|
{
|
||||||
// TODO thow exception if aStart and aCount are not in bound. I've tried to do this but Bochs dies :-(
|
// TODO thow exception if aStart and aCount are not in bound. I've tried to do this but Bochs dies :-(
|
||||||
|
|
@ -158,11 +188,23 @@ namespace Cosmos.Core
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy data from the buffer to the start of the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aData">A data buffer array.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aData length in greater then Int32.MaxValue.</exception>
|
||||||
public void Copy(byte[] aData)
|
public void Copy(byte[] aData)
|
||||||
{
|
{
|
||||||
Copy(0, aData, 0, aData.Length);
|
Copy(0, aData, 0, aData.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy data from the buffer array to the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aStart">A data starting position inside the memory block.</param>
|
||||||
|
/// <param name="aData">A data buffer array.</param>
|
||||||
|
/// <param name="aIndex">A staring index in the source data buffer array.</param>
|
||||||
|
/// <param name="aCount">Number of bytes to copy.</param>
|
||||||
public unsafe void Copy(int aStart, byte[] aData, int aIndex, int aCount)
|
public unsafe void Copy(int aStart, byte[] aData, int aIndex, int aCount)
|
||||||
{
|
{
|
||||||
// TODO thow exception if aStart and aCount are not in bound. I've tried to do this but Bochs dies :-(
|
// TODO thow exception if aStart and aCount are not in bound. I've tried to do this but Bochs dies :-(
|
||||||
|
|
@ -173,16 +215,35 @@ namespace Cosmos.Core
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy data from the buffer to the start of the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aData">A data buffer array.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aData length in greater then Int32.MaxValue.</exception>
|
||||||
public void Copy(int[] aData)
|
public void Copy(int[] aData)
|
||||||
{
|
{
|
||||||
Copy(0, aData, 0, aData.Length);
|
Copy(0, aData, 0, aData.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy data from the buffer array to the start of the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aData">A data buffer array.</param>
|
||||||
|
/// <param name="aIndex">A staring index in the source data buffer array.</param>
|
||||||
|
/// <param name="aCount">Number of bytes to copy.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aData length in greater then Int32.MaxValue.</exception>
|
||||||
public void Copy(int []aData, int aIndex, int aCount)
|
public void Copy(int []aData, int aIndex, int aCount)
|
||||||
{
|
{
|
||||||
Copy(0, aData, aIndex, aData.Length);
|
Copy(0, aData, aIndex, aData.Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy data from the buffer array to the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aStart">A data starting position inside the memory block.</param>
|
||||||
|
/// <param name="aData">A data buffer array.</param>
|
||||||
|
/// <param name="aIndex">A staring index in the source data buffer array.</param>
|
||||||
|
/// <param name="aCount">Number of bytes to copy.</param>
|
||||||
public unsafe void Copy(int aStart, int[] aData, int aIndex, int aCount)
|
public unsafe void Copy(int aStart, int[] aData, int aIndex, int aCount)
|
||||||
{
|
{
|
||||||
// TODO thow exception if aStart and aCount are not in bound. I've tried to do this but Bochs dies :-(
|
// TODO thow exception if aStart and aCount are not in bound. I've tried to do this but Bochs dies :-(
|
||||||
|
|
@ -219,12 +280,26 @@ namespace Cosmos.Core
|
||||||
MemoryOperations.Copy(xDest, xSrc, (int)aCount);
|
MemoryOperations.Copy(xDest, xSrc, (int)aCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Move data inside the block. Undone.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>Always throw. Yet to be done.</remarks>
|
||||||
|
/// <param name="aDest">A destination address.</param>
|
||||||
|
/// <param name="aSrc">A source address.</param>
|
||||||
|
/// <param name="aCount">Number of bytes to move.</param>
|
||||||
|
/// <exception cref="Exception">Thrown always.</exception>
|
||||||
public void MoveUp(uint aDest, uint aSrc, uint aCount)
|
public void MoveUp(uint aDest, uint aSrc, uint aCount)
|
||||||
{
|
{
|
||||||
throw new Exception("TODO");
|
throw new Exception("TODO");
|
||||||
}
|
}
|
||||||
|
|
||||||
#region ReadWrite
|
#region ReadWrite
|
||||||
|
/// <summary>
|
||||||
|
/// Read 8-bit from the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aBuffer">A buffer to write the data to.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aBuffer length in greater then Int32.MaxValue.</exception>
|
||||||
|
/// <exception cref="Exception">Thrown on memory access violation.</exception>
|
||||||
public unsafe void Read8(Byte[] aBuffer)
|
public unsafe void Read8(Byte[] aBuffer)
|
||||||
{
|
{
|
||||||
if(aBuffer.Length >= Size)
|
if(aBuffer.Length >= Size)
|
||||||
|
|
@ -235,6 +310,12 @@ namespace Cosmos.Core
|
||||||
aBuffer[i] = (*(Byte*)(Base + i));
|
aBuffer[i] = (*(Byte*)(Base + i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Write 8-bit to the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aBuffer">A buffer to be written to the memory block.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aBuffer length in greater then Int32.MaxValue.</exception>
|
||||||
|
/// <exception cref="Exception">Thrown on memory access violation.</exception>
|
||||||
public unsafe void Write8(Byte[] aBuffer)
|
public unsafe void Write8(Byte[] aBuffer)
|
||||||
{
|
{
|
||||||
if(aBuffer.Length >= Size)
|
if(aBuffer.Length >= Size)
|
||||||
|
|
@ -245,6 +326,12 @@ namespace Cosmos.Core
|
||||||
(*(Byte*)(Base + i)) = aBuffer[i];
|
(*(Byte*)(Base + i)) = aBuffer[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Read 16-bit from the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aBuffer">A buffer to write the data to.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aBuffer length in greater then Int32.MaxValue.</exception>
|
||||||
|
/// <exception cref="Exception">Thrown on memory access violation.</exception>
|
||||||
public unsafe void Read16(ushort[] aBuffer)
|
public unsafe void Read16(ushort[] aBuffer)
|
||||||
{
|
{
|
||||||
if(aBuffer.Length >= Size)
|
if(aBuffer.Length >= Size)
|
||||||
|
|
@ -257,6 +344,12 @@ namespace Cosmos.Core
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Write 16-bit to the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aBuffer">A buffer to be written to the memory block.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aBuffer length in greater then Int32.MaxValue.</exception>
|
||||||
|
/// <exception cref="Exception">Thrown on memory access violation.</exception>
|
||||||
public unsafe void Write16(ushort[] aBuffer)
|
public unsafe void Write16(ushort[] aBuffer)
|
||||||
{
|
{
|
||||||
if(aBuffer.Length >= Size)
|
if(aBuffer.Length >= Size)
|
||||||
|
|
@ -269,6 +362,12 @@ namespace Cosmos.Core
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Read 32-bit from the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aBuffer">A buffer to write the data to.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aBuffer length in greater then Int32.MaxValue.</exception>
|
||||||
|
/// <exception cref="Exception">Thrown on memory access violation.</exception>
|
||||||
public unsafe void Read32(uint[] aBuffer)
|
public unsafe void Read32(uint[] aBuffer)
|
||||||
{
|
{
|
||||||
if(aBuffer.Length >= Size)
|
if(aBuffer.Length >= Size)
|
||||||
|
|
@ -279,6 +378,12 @@ namespace Cosmos.Core
|
||||||
aBuffer[i] = (*(uint*)(Base + i));
|
aBuffer[i] = (*(uint*)(Base + i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Write 32-bit to the memory block.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aBuffer">A buffer to be written to the memory block.</param>
|
||||||
|
/// <exception cref="OverflowException">Thrown if aBuffer length in greater then Int32.MaxValue.</exception>
|
||||||
|
/// <exception cref="Exception">Thrown on memory access violation.</exception>
|
||||||
public unsafe void Write32(uint[] aBuffer)
|
public unsafe void Write32(uint[] aBuffer)
|
||||||
{
|
{
|
||||||
if(aBuffer.Length >= Size)
|
if(aBuffer.Length >= Size)
|
||||||
|
|
@ -289,7 +394,14 @@ namespace Cosmos.Core
|
||||||
(*(uint*)(Base + i)) = aBuffer[i];
|
(*(uint*)(Base + i)) = aBuffer[i];
|
||||||
}
|
}
|
||||||
#endregion ReadWrite
|
#endregion ReadWrite
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert part for the memory block to array.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aStart">A starting position of the data at the source memory block.</param>
|
||||||
|
/// <param name="aIndex">A index to be the staring index at the destination array.</param>
|
||||||
|
/// <param name="aCount">Number of bytes to get.</param>
|
||||||
|
/// <returns>uint array.</returns>
|
||||||
public unsafe uint[] ToArray(int aStart, int aIndex, int aCount)
|
public unsafe uint[] ToArray(int aStart, int aIndex, int aCount)
|
||||||
{
|
{
|
||||||
uint* xDest = (uint*)(Base + aStart);
|
uint* xDest = (uint*)(Base + aStart);
|
||||||
|
|
@ -301,6 +413,10 @@ namespace Cosmos.Core
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Convert the memory block to array.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>uint array.</returns>
|
||||||
public uint[] ToArray()
|
public uint[] ToArray()
|
||||||
{
|
{
|
||||||
return ToArray(0, 0, (int)Size);
|
return ToArray(0, 0, (int)Size);
|
||||||
|
|
@ -323,7 +439,7 @@ namespace Cosmos.Core
|
||||||
public readonly uint Size;
|
public readonly uint Size;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create new inctanse of the <see cref="MemoryBlock08"/> class.
|
/// Create new instance of the <see cref="MemoryBlock08"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="aBase">A base.</param>
|
/// <param name="aBase">A base.</param>
|
||||||
/// <param name="aSize">A size.</param>
|
/// <param name="aSize">A size.</param>
|
||||||
|
|
@ -376,7 +492,7 @@ namespace Cosmos.Core
|
||||||
public readonly uint Size;
|
public readonly uint Size;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create new inctanse of the <see cref="MemoryBlock16"/> class.
|
/// Create new instance of the <see cref="MemoryBlock16"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="aBase">A base.</param>
|
/// <param name="aBase">A base.</param>
|
||||||
/// <param name="aSize">A size.</param>
|
/// <param name="aSize">A size.</param>
|
||||||
|
|
@ -429,7 +545,7 @@ namespace Cosmos.Core
|
||||||
public readonly uint Size;
|
public readonly uint Size;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create new inctanse of the <see cref="MemoryBlock32"/> class.
|
/// Create new instance of the <see cref="MemoryBlock32"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="aBase">A base.</param>
|
/// <param name="aBase">A base.</param>
|
||||||
/// <param name="aSize">A size.</param>
|
/// <param name="aSize">A size.</param>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue