From 6f25f63a18153bc2adc49c5f9a3862c2760716df Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Mon, 20 Aug 2012 10:25:27 -0500 Subject: [PATCH] Fixed IMASK access in DSP & GPU, more CPU browser refinements. --- src/dsp.cpp | 28 +++++++++++++++------------- src/gpu.cpp | 7 ++++++- src/gui/debug/cpubrowser.cpp | 13 ++++++++++++- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/dsp.cpp b/src/dsp.cpp index ee1cdb7..7a0553f 100644 --- a/src/dsp.cpp +++ b/src/dsp.cpp @@ -624,12 +624,9 @@ uint32 DSPReadLong(uint32 offset, uint32 who/*=UNKNOWN*/) offset &= 0x3F; switch (offset) { - case 0x00: /*dsp_flag_c?(dsp_flag_c=1):(dsp_flag_c=0); - dsp_flag_z?(dsp_flag_z=1):(dsp_flag_z=0); - dsp_flag_n?(dsp_flag_n=1):(dsp_flag_n=0);*/ - - dsp_flags = (dsp_flags & 0xFFFFFFF8) | (dsp_flag_n << 2) | (dsp_flag_c << 1) | dsp_flag_z; - return dsp_flags & 0xFFFFC1FF; + case 0x00: + dsp_flags = (dsp_flags & 0xFFFFFFF8) | (dsp_flag_n << 2) | (dsp_flag_c << 1) | dsp_flag_z; + return dsp_flags & 0xFFFFC1FF; case 0x04: return dsp_matrix_control; case 0x08: return dsp_pointer_to_matrix; case 0x0C: return dsp_data_organization; @@ -725,19 +722,22 @@ SET16(ram2, offset, data); if ((offset & 0x1C) == 0x1C) { if (offset & 0x03) - dsp_div_control = (dsp_div_control&0xffff0000)|(data&0xffff); + dsp_div_control = (dsp_div_control & 0xFFFF0000) | (data & 0xFFFF); else - dsp_div_control = (dsp_div_control&0xffff)|((data&0xffff)<<16); + dsp_div_control = (dsp_div_control & 0xFFFF) | ((data & 0xFFFF) << 16); } else { - uint32 old_data = DSPReadLong(offset & 0xffffffc, who); + uint32 old_data = DSPReadLong(offset & 0xFFFFFFC, who); + if (offset & 0x03) - old_data = (old_data&0xffff0000)|(data&0xffff); + old_data = (old_data & 0xFFFF0000) | (data & 0xFFFF); else - old_data = (old_data&0xffff)|((data&0xffff)<<16); - DSPWriteLong(offset & 0xffffffc, old_data, who); + old_data = (old_data & 0xFFFF) | ((data & 0xFFFF) << 16); + + DSPWriteLong(offset & 0xFFFFFFC, old_data, who); } + return; } @@ -784,7 +784,9 @@ SET32(ram2, offset, data); #endif // bool IMASKCleared = (dsp_flags & IMASK) && !(data & IMASK); IMASKCleared = (dsp_flags & IMASK) && !(data & IMASK); - dsp_flags = data; + // NOTE: According to the JTRM, writing a 1 to IMASK has no effect; only the + // IRQ logic can set it. So we mask it out here to prevent problems... + dsp_flags = data & (~IMASK); dsp_flag_z = dsp_flags & 0x01; dsp_flag_c = (dsp_flags >> 1) & 0x01; dsp_flag_n = (dsp_flags >> 2) & 0x01; diff --git a/src/gpu.cpp b/src/gpu.cpp index e1fdd41..c57b948 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -647,12 +647,15 @@ void GPUWriteWord(uint32 offset, uint16 data, uint32 who/*=UNKNOWN*/) { //WriteLog("[GPU W16:%08X,%04X]", offset, data); uint32 old_data = GPUReadLong(offset & 0xFFFFFFC, who); + if (offset & 0x02) old_data = (old_data & 0xFFFF0000) | (data & 0xFFFF); else old_data = (old_data & 0x0000FFFF) | ((data & 0xFFFF) << 16); + GPUWriteLong(offset & 0xFFFFFFC, old_data, who); } + return; } else if ((offset == GPU_WORK_RAM_BASE + 0x0FFF) || (GPU_CONTROL_RAM_BASE + 0x1F)) @@ -700,7 +703,9 @@ void GPUWriteLong(uint32 offset, uint32 data, uint32 who/*=UNKNOWN*/) case 0x00: { bool IMASKCleared = (gpu_flags & IMASK) && !(data & IMASK); - gpu_flags = data; + // NOTE: According to the JTRM, writing a 1 to IMASK has no effect; only the + // IRQ logic can set it. So we mask it out here to prevent problems... + gpu_flags = data & (~IMASK); gpu_flag_z = gpu_flags & ZERO_FLAG; gpu_flag_c = (gpu_flags & CARRY_FLAG) >> 1; gpu_flag_n = (gpu_flags & NEGA_FLAG) >> 2; diff --git a/src/gui/debug/cpubrowser.cpp b/src/gui/debug/cpubrowser.cpp index 067755e..8df1878 100644 --- a/src/gui/debug/cpubrowser.cpp +++ b/src/gui/debug/cpubrowser.cpp @@ -17,6 +17,8 @@ #include "cpubrowser.h" //#include "memory.h" #include "m68000/m68kinterface.h" +#include "dsp.h" +#include "gpu.h" CPUBrowserWindow::CPUBrowserWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog), @@ -47,6 +49,7 @@ void CPUBrowserWindow::RefreshContents(void) char string[1024], buf[64]; QString s; + // 68K uint32_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC); uint32_t m68kSR = m68k_get_reg(NULL, M68K_REG_SR); sprintf(string, "PC: %06X  SR: %04X

", m68kPC, m68kSR); @@ -77,7 +80,15 @@ void CPUBrowserWindow::RefreshContents(void) uint32_t m68kD5 = m68k_get_reg(NULL, M68K_REG_D5); uint32_t m68kD6 = m68k_get_reg(NULL, M68K_REG_D6); uint32_t m68kD7 = m68k_get_reg(NULL, M68K_REG_D7); - sprintf(string, "D4: %08X  D5: %08X  D6: %08X  D7: %08X", m68kD4, m68kD5, m68kD6, m68kD7); + sprintf(string, "D4: %08X  D5: %08X  D6: %08X  D7: %08X

", m68kD4, m68kD5, m68kD6, m68kD7); + s += QString(string); + + // GPU + sprintf(string, "GPU PC: %06X  FLAGS: %08X

", GPUReadLong(0xF02010), GPUReadLong(0xF02000)); + s += QString(string); + + // DSP + sprintf(string, "DSP PC: %06X  FLAGS: %08X

", DSPReadLong(0xF1A110), DSPReadLong(0xF1A100)); s += QString(string); text->clear(); -- 2.37.2