diff --git a/BizHawk.Emulation.Cores/Computers/MSX/LibMSX.cs b/BizHawk.Emulation.Cores/Computers/MSX/LibMSX.cs
index 740186bf91..b11b63f292 100644
--- a/BizHawk.Emulation.Cores/Computers/MSX/LibMSX.cs
+++ b/BizHawk.Emulation.Cores/Computers/MSX/LibMSX.cs
@@ -10,6 +10,7 @@ namespace BizHawk.Emulation.Cores.Computers.MSX
///
public static class LibMSX
{
+ # region Core
/// opaque state pointer
[DllImport("MSXHAWK.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr MSX_create();
@@ -53,6 +54,29 @@ namespace BizHawk.Emulation.Cores.Computers.MSX
[DllImport("MSXHAWK.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void MSX_get_video(IntPtr core, int[] videobuf);
+ #endregion
+
+ #region Memory Domain Functions
+
+ ///
+ /// Read the system bus
+ ///
+ /// opaque state pointer
+ /// system bus address
+ [DllImport("MSXHAWK.dll", CallingConvention = CallingConvention.Cdecl)]
+ public static extern byte MSX_getsysbus(IntPtr core, int addr);
+
+ ///
+ /// Read the VRAM
+ ///
+ /// opaque state pointer
+ /// vram address
+ [DllImport("MSXHAWK.dll", CallingConvention = CallingConvention.Cdecl)]
+ public static extern byte MSX_getvram(IntPtr core, int addr);
+
+
+ #endregion
+
#region Tracer
///
/// type of the cpu trace callback
diff --git a/BizHawk.Emulation.Cores/Computers/MSX/MSX.IMemoryDomains.cs b/BizHawk.Emulation.Cores/Computers/MSX/MSX.IMemoryDomains.cs
index c1602e97cd..7866cf4203 100644
--- a/BizHawk.Emulation.Cores/Computers/MSX/MSX.IMemoryDomains.cs
+++ b/BizHawk.Emulation.Cores/Computers/MSX/MSX.IMemoryDomains.cs
@@ -16,25 +16,20 @@ namespace BizHawk.Emulation.Cores.Computers.MSX
{
var domains = new List
{
- new MemoryDomainDelegate("System Bus", 0x10000, MemoryDomain.Endian.Little,
- (addr) =>
- {
- if (addr < 0 || addr >= 65536)
- {
- throw new ArgumentOutOfRangeException();
- }
-
- return 0;
- },
- (addr, value) =>
- {
- if (addr < 0 || addr >= 65536)
- {
- throw new ArgumentOutOfRangeException();
- }
-
-
- }, 1)
+ new MemoryDomainDelegate(
+ "System Bus",
+ 0x10000,
+ MemoryDomain.Endian.Little,
+ (addr) => LibMSX.MSX_getsysbus(MSX_Pntr, (int)(addr & 0xFFFF)),
+ (addr, value) => { },
+ 1),
+ new MemoryDomainDelegate(
+ "VRAM",
+ 0x4000,
+ MemoryDomain.Endian.Little,
+ (addr) => LibMSX.MSX_getvram(MSX_Pntr, (int)(addr & 0x3FFF)),
+ (addr, value) => { },
+ 1),
};
if (SaveRAM != null)
diff --git a/libHawk/MSXHawk/MSXHawk/Core.h b/libHawk/MSXHawk/MSXHawk/Core.h
index 55bafd46ce..a541c00049 100644
--- a/libHawk/MSXHawk/MSXHawk/Core.h
+++ b/libHawk/MSXHawk/MSXHawk/Core.h
@@ -100,6 +100,24 @@ namespace MSXHawk
}
}
+ #pragma region Memory Domain Functions
+
+ uint8_t GetSysBus(uint32_t addr)
+ {
+ cpu.bank_num = cpu.bank_offset = addr & 0xFFFF;
+ cpu.bank_offset &= cpu.low_mask;
+ cpu.bank_num = (cpu.bank_num >> cpu.bank_shift)& cpu.high_mask;
+
+ return cpu.MemoryMap[cpu.bank_num][cpu.bank_offset];
+ }
+
+ uint8_t GetVRAM(uint32_t addr)
+ {
+ return vdp.VRAM[addr & 0x3FFF];
+ }
+
+ #pragma endregion
+
#pragma region Tracer
void SetTraceCallback(void (*callback)(int))
diff --git a/libHawk/MSXHawk/MSXHawk/MSXHawk.cpp b/libHawk/MSXHawk/MSXHawk/MSXHawk.cpp
index 542e92d521..6d9cb22c9e 100644
--- a/libHawk/MSXHawk/MSXHawk/MSXHawk.cpp
+++ b/libHawk/MSXHawk/MSXHawk/MSXHawk.cpp
@@ -11,6 +11,7 @@
using namespace MSXHawk;
+#pragma region Core
// Create pointer to a core instance
MSXHAWK_EXPORT MSXCore* MSX_create()
{
@@ -45,6 +46,19 @@ MSXHAWK_EXPORT void MSX_get_video(MSXCore* p, uint32_t* dest)
MSXHAWK_EXPORT void MSX_settracecallback(MSXCore* p, void (*callback)(int)) {
p->SetTraceCallback(callback);
}
+#pragma endregion
+
+#pragma region Memory Domain Functions
+
+MSXHAWK_EXPORT uint8_t MSX_getsysbus(MSXCore* p, uint32_t addr) {
+ return p->GetSysBus(addr);
+}
+
+MSXHAWK_EXPORT uint8_t MSX_getvram(MSXCore* p, uint32_t addr) {
+ return p->GetVRAM(addr);
+}
+#pragma endregion
+
#pragma region Tracer
diff --git a/libHawk/MSXHawk/MSXHawk/VDP.h b/libHawk/MSXHawk/MSXHawk/VDP.h
index f8189b900c..83268648cf 100644
--- a/libHawk/MSXHawk/MSXHawk/VDP.h
+++ b/libHawk/MSXHawk/MSXHawk/VDP.h
@@ -22,7 +22,7 @@ namespace MSXHawk
uint8_t VRAM[0x4000]; //16kb video RAM
uint8_t CRAM[64]; // SMS = 32 uint8_ts, GG = 64 uint8_ts CRAM
uint8_t Registers[16] = { 0x06, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xF0, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00 };
- uint8_t Statusuint8_t;
+ uint8_t StatusInt;
static void TO_REGS(uint8_t value)
{
@@ -118,8 +118,8 @@ namespace MSXHawk
uint8_t ReadVdpStatus()
{
VdpWaitingForLatchuint8_t = true;
- uint8_t returnValue = Statusuint8_t;
- Statusuint8_t &= 0x1F;
+ uint8_t returnValue = StatusInt;
+ StatusInt &= 0x1F;
HIntPending = false;
VIntPending = false;
INT_FLAG[0] = false;
@@ -350,7 +350,7 @@ namespace MSXHawk
{
if (ScanLine == FrameHeight + 1)
{
- Statusuint8_t |= 0x80;
+ StatusInt |= 0x80;
VIntPending = true;
}
@@ -410,7 +410,7 @@ namespace MSXHawk
void SyncState(Serializer ser)
{
ser.BeginSection(nameof(VDP));
- ser.Sync(nameof(Statusuint8_t), ref Statusuint8_t);
+ ser.Sync(nameof(StatusInt), ref StatusInt);
ser.Sync("WaitingForLatchuint8_t", ref VdpWaitingForLatchuint8_t);
ser.Sync("Latch", ref VdpLatch);
ser.Sync("ReadBuffer", ref VdpBuffer);
@@ -601,7 +601,7 @@ namespace MSXHawk
{
collisionHappens = false; // technically the VDP stops processing sprite past this so we would never set the collision bit for sprites past this
if (overflowHappens)
- Statusuint8_t |= 0x40; // Set Overflow bit
+ StatusInt |= 0x40; // Set Overflow bit
if (SpriteLimit)
renderHappens = false; // should be able to break/return, but to ensure this has no effect on sync we keep processing and disable rendering
}
@@ -621,7 +621,7 @@ namespace MSXHawk
if (SpriteCollisionBuffer[x + xs] != 0)
{
if (collisionHappens)
- Statusuint8_t |= 0x20; // Set Collision bit
+ StatusInt |= 0x20; // Set Collision bit
}
else if (renderHappens && ScanlinePriorityBuffer[x + xs] == 0)
{
@@ -681,7 +681,7 @@ namespace MSXHawk
{
collisionHappens = false; // technically the VDP stops processing sprite past this so we would never set the collision bit for sprites past this
if (overflowHappens)
- Statusuint8_t |= 0x40; // Set Overflow bit
+ StatusInt |= 0x40; // Set Overflow bit
if (SpriteLimit)
renderHappens = false; // should be able to break/return, but to ensure this has no effect on sync we keep processing and disable rendering
}
@@ -701,7 +701,7 @@ namespace MSXHawk
if (SpriteCollisionBuffer[x + xs] != 0)
{
if (collisionHappens)
- Statusuint8_t |= 0x20; // Set Collision bit
+ StatusInt |= 0x20; // Set Collision bit
}
else if (renderHappens && ScanlinePriorityBuffer[x + xs] == 0)
{
@@ -847,7 +847,7 @@ namespace MSXHawk
#pragma region ModeTMS
- uint32_t PaletteTMS9918[16]
+ uint32_t PaletteTMS9918[16] =
{
0xFF000000,
0xFF000000,
@@ -996,9 +996,9 @@ namespace MSXHawk
if (++NumSpritesOnScanline == 5)
{
- Statusuint8_t &= 0xE0; // Clear FS0-FS4 bits
- Statusuint8_t |= (int8_t)i; // set 5th sprite index
- Statusuint8_t |= 0x40; // set overflow bit
+ StatusInt &= 0xE0; // Clear FS0-FS4 bits
+ StatusInt |= (int8_t)i; // set 5th sprite index
+ StatusInt |= 0x40; // set overflow bit
break;
}
@@ -1020,7 +1020,7 @@ namespace MSXHawk
if (Color != 0 && (pv & (1 << (7 - (xp & 7)))) > 0)
{
if (SpriteCollisionBuffer[x + xp] != 0)
- Statusuint8_t |= 0x20; // Set sprite collision flag
+ StatusInt |= 0x20; // Set sprite collision flag
if (ScanlinePriorityBuffer[x + xp] == 0)
{
@@ -1069,9 +1069,9 @@ namespace MSXHawk
if (++NumSpritesOnScanline == 5)
{
- Statusuint8_t &= 0xE0; // Clear FS0-FS4 bits
- Statusuint8_t |= (uint8_t)i; // set 5th sprite index
- Statusuint8_t |= 0x40; // set overflow bit
+ StatusInt &= 0xE0; // Clear FS0-FS4 bits
+ StatusInt |= (uint8_t)i; // set 5th sprite index
+ StatusInt |= 0x40; // set overflow bit
break;
}
@@ -1090,7 +1090,7 @@ namespace MSXHawk
if (Color != 0 && (pv & (1 << (7 - ((xp / 2) & 7)))) > 0) // xp/2 is due to sprite magnification
{
if (SpriteCollisionBuffer[x + xp] != 0)
- Statusuint8_t |= 0x20; // Set sprite collision flag
+ StatusInt |= 0x20; // Set sprite collision flag
if (ScanlinePriorityBuffer[x + xp] == 0)
{
diff --git a/libHawk/MSXHawk/MSXHawk/Z80A.h b/libHawk/MSXHawk/MSXHawk/Z80A.h
index cc0864a063..ffb17e0fc1 100644
--- a/libHawk/MSXHawk/MSXHawk/Z80A.h
+++ b/libHawk/MSXHawk/MSXHawk/Z80A.h
@@ -4623,7 +4623,7 @@ namespace MSXHawk
return byte_code;
}
- string Result(string format, uint32_t addr)
+ string Result(string format, uint32_t* addr)
{
//d immediately succeeds the opcode
//n immediate succeeds the opcode and the displacement (if present)
@@ -4633,19 +4633,19 @@ namespace MSXHawk
{
size_t str_loc = format.find("nn");
- bank_num = bank_offset = addr & 0xFFFF;
+ bank_num = bank_offset = addr[0] & 0xFFFF;
bank_offset &= low_mask;
bank_num = (bank_num >> bank_shift) & high_mask;
- addr++;
+ addr[0]++;
val_char_1 = replacer;
sprintf_s(val_char_1, 5, "%02X", MemoryMap[bank_num][bank_offset]);
string val1(val_char_1, 2);
- bank_num = bank_offset = addr & 0xFFFF;
+ bank_num = bank_offset = addr[0] & 0xFFFF;
bank_offset &= low_mask;
bank_num = (bank_num >> bank_shift)& high_mask;
- addr++;
+ addr[0]++;
val_char_2 = replacer;
sprintf_s(val_char_2, 5, "%02X", MemoryMap[bank_num][bank_offset]);
@@ -4660,10 +4660,10 @@ namespace MSXHawk
{
size_t str_loc = format.find("n");
- bank_num = bank_offset = addr & 0xFFFF;
+ bank_num = bank_offset = addr[0] & 0xFFFF;
bank_offset &= low_mask;
bank_num = (bank_num >> bank_shift)& high_mask;
- addr++;
+ addr[0]++;
val_char_1 = replacer;
sprintf_s(val_char_1, 5, "%02X", MemoryMap[bank_num][bank_offset]);
@@ -4677,32 +4677,30 @@ namespace MSXHawk
{
size_t str_loc = format.find("+d");
- bank_num = bank_offset = addr & 0xFFFF;
+ bank_num = bank_offset = addr[0] & 0xFFFF;
bank_offset &= low_mask;
bank_num = (bank_num >> bank_shift)& high_mask;
- addr++;
+ addr[0]++;
val_char_1 = replacer;
- sprintf_s(val_char_1, 5, "%u", MemoryMap[bank_num][bank_offset]);
- string val1(val_char_1, 2);
+ sprintf_s(val_char_1, 5, "%+04d", (int8_t)MemoryMap[bank_num][bank_offset]);
+ string val1(val_char_1, 4);
- format.erase(str_loc + 1, 1);
- format.insert(str_loc + 1, val1);
+ format.erase(str_loc, 2);
+ format.insert(str_loc, val1);
}
if (format.find("d") != string::npos)
{
size_t str_loc = format.find("d");
- bank_num = bank_offset = addr & 0xFFFF;
+ bank_num = bank_offset = addr[0] & 0xFFFF;
bank_offset &= low_mask;
bank_num = (bank_num >> bank_shift)& high_mask;
- addr++;
-
- int8_t temp = (int8_t)MemoryMap[bank_num][bank_offset];
+ addr[0]++;
val_char_1 = replacer;
- sprintf_s(val_char_1, 5, "%d", temp);
- string val1(val_char_1, 3);
+ sprintf_s(val_char_1, 5, "%+04d", (int8_t)MemoryMap[bank_num][bank_offset]);
+ string val1(val_char_1, 4);
format.erase(str_loc, 1);
format.insert(str_loc, val1);
@@ -4796,7 +4794,8 @@ namespace MSXHawk
default: format = mnemonics[A]; break;
}
- string temp = Result(format, addr);
+ uint32_t* addr_ptr = &addr;
+ string temp = Result(format, addr_ptr);
addr += extra_inc;