GBA.Unity/Assets/emulator/Cp15.cs
2024-08-16 14:51:15 +08:00

86 lines
2.3 KiB
C#

using System;
using static Util;
namespace OptimeGBA
{
public class Cp15
{
/*Nds Nds;
public Cp15(Nds nds)
{
Nds = nds;
}*/
public uint ControlRegister;
public uint DataTcmSettings;
public uint InstTcmSettings;
public void TransferTo(uint opcode1, uint rdVal, uint cRn, uint cRm, uint opcode2)
{
uint reg = ((cRn & 0xF) << 8) | ((cRm & 0xF) << 4) | (opcode2 & 0x7);
switch (reg)
{
case 0x100:
ControlRegister = rdVal;
ControlRegister |= 0b00000000000000000000000001111000;
ControlRegister &= 0b00000000000011111111000010000101;
//Nds.Mem9.UpdateTcmSettings();
break;
case 0x704:
case 0x782:
//Nds.Cpu9.Halted = true;
break;
case 0x910:
DataTcmSettings = rdVal;
//Nds.Mem9.UpdateTcmSettings();
break;
case 0x911:
InstTcmSettings = rdVal;
//Nds.Mem9.UpdateTcmSettings();
break;
default:
// Debug.Log($"UNIMPLEMENTED TO CP15 {opcode1},C{cRn},C{cRm},{opcode2}: {HexN(rdVal, 8)}");
break;
}
}
public uint TransferFrom(uint opcode1, uint cRn, uint cRm, uint opcode2)
{
uint val = 0;
uint reg = ((cRn & 0xF) << 8) | ((cRm & 0xF) << 4) | (opcode2 & 0x7);
switch (reg)
{
case 0x000: // ID register
val = 0x41059461;
break;
case 0x001:
val = 0x0F0D2112;
break;
case 0x100:
val = ControlRegister;
break;
case 0x910:
val = DataTcmSettings;
break;
case 0x911:
val = InstTcmSettings;
break;
default:
//Debug.Log($"UNIMPLEMENTED FROM CP15 {opcode1},C{cRn},C{cRm},{opcode2}");
break;
}
return val;
}
}
}