public override void* PspAddressToPointerUnsafe(uint _Address)
{
if (_Address == 0) return null;
//if (IsAddressValid(_Address))
{
// Ignore last 3 bits (cache / kernel)
uint Address = _Address & PspMemory.MemoryMask;
switch (Address >> 24)
{
/////// hp
case 0x00: //case 0b_00000:
{
if (Address < ScratchPadOffset)
{
break;
}
uint Offset = Address - ScratchPadOffset;
#if ADDITIONAL_CHECKS
if (Offset >= ScratchPadSize) throw (new Exception(String.Format("Outside! 0x{0:X}", Address)));
#endif
return &ScratchPadPtr[Address - ScratchPadOffset];
}
/////// hp
case 0x04: //case 0b_00100:
{
uint Offset = Address - FrameBufferOffset;
#if ADDITIONAL_CHECKS
if (Offset >= FrameBufferSize) throw (new Exception(String.Format("Outside! 0x{0:X}", Address)));
#endif
return &FrameBufferPtr[Offset];
}
/////// hp
case 0x08: //case 0b_01000:
case 0x09: //case 0b_01001:
case 0x0A: //case 0b_01010: // SLIM ONLY
case 0x0B: //case 0b_01011: // SLIM ONLY
{
uint Offset = Address - MainOffset;
#if ADDITIONAL_CHECKS
if (Offset >= MainSize) throw (new Exception(String.Format("Outside! 0x{0:X}", Address)));
#endif
return &MainPtr[Offset];
//return &Main[Offset];
}
/////// hp
case 0x1F: //case 0b_011111
case 0x37: //case 0b_111111: // HO IO2
{
//return &Vectors[Address - 0x1fc00000];
//return HardwareVectors
uint Offset = Address - VectorsOffset;
#if ADDITIONAL_CHECKS
if (Offset >= VectorsSize) throw (new Exception(String.Format("Outside! 0x{0:X}", Address)));
#endif
return &VectorsPtr[Offset];
}
case 0x1C: //case 0b_11100: // HW IO1
break;
default:
break;
}
Console.Error.WriteLine("0x{0:X2}", (Address >> 24));
}
throw (new InvalidAddressException(_Address));
}