--- nono/vm/mpu680x0.cpp 2026/04/29 17:04:55 1.1.1.9 +++ nono/vm/mpu680x0.cpp 2026/04/29 17:05:03 1.1.1.11 @@ -8,8 +8,10 @@ #include "mpu680x0.h" #include "config.h" +#include "m68030bus.h" #include "m68030excep.h" #include "mainapp.h" +#include "uimessage.h" #include "vm.h" #include @@ -69,6 +71,9 @@ MPU680x0Device::Init() } } + cpu->halt_callback = &MPU680x0Device::HaltCallback; + cpu->halt_arg = NULL; + return true; } @@ -152,12 +157,75 @@ MPU680x0Device::SetFLineCallback(bool (* cpu->fline_arg = arg; } -// ダブルバスフォールトのコールバックを指定。 -void -MPU680x0Device::SetHaltCallback(void (*callback)(void *), void *arg) +// MPU ホールト時の MPU からのコールバック関数 +/*static*/ void +MPU680x0Device::HaltCallback(void *arg) +{ + UIMessage::Post(UIMessage::HALT); +} + +// MPU からのアクセスをエミュレート +uint64 +MPU680x0Device::Read8(uint32 addr) +{ + try { + return m68030_read_8(cpu, addr); + } catch (...) { + return (uint64)-1; + } +} + +uint64 +MPU680x0Device::Read16(uint32 addr) +{ + try { + return m68030_read_16(cpu, addr); + } catch (...) { + return (uint64)-1; + } +} + +uint64 +MPU680x0Device::Read32(uint32 addr) { - cpu->halt_callback = callback; - cpu->halt_arg = arg; + try { + return m68030_read_32(cpu, addr); + } catch (...) { + return (uint64)-1; + } +} + +uint64 +MPU680x0Device::Write8(uint32 addr, uint32 data) +{ + try { + m68030_write_8(cpu, addr, data); + return 0; + } catch (...) { + return (uint64)-1; + } +} + +uint64 +MPU680x0Device::Write16(uint32 addr, uint32 data) +{ + try { + m68030_write_16(cpu, addr, data); + return 0; + } catch (...) { + return (uint64)-1; + } +} + +uint64 +MPU680x0Device::Write32(uint32 addr, uint32 data) +{ + try { + m68030_write_32(cpu, addr, data); + return 0; + } catch (...) { + return (uint64)-1; + } } // モニター更新 (レジスタウィンドウ) @@ -297,15 +365,15 @@ MPU680x0Device::MonitorUpdateReg(Monitor }; uint32 fpcr = reg.fpframe.fpf_fpcr; screen.Print(x, y++, "FPCR:%04x", fpcr); - screen.Print(x + 2, y++, "%s %s %s %s %s %s %s %s", - (fpcr & 0x8000) ? "BS" : "--", - (fpcr & 0x4000) ? "SN" : "--", - (fpcr & 0x2000) ? "OP" : "--", - (fpcr & 0x1000) ? "OV" : "--", - (fpcr & 0x0800) ? "UF" : "--", - (fpcr & 0x0400) ? "DZ" : "--", - (fpcr & 0x0200) ? "I2" : "--", - (fpcr & 0x0100) ? "I1" : "--"); + screen.Puts(x + 2, y, TA::OnOff(fpcr & 0x8000), "BS"); + screen.Puts(x + 5, y, TA::OnOff(fpcr & 0x4000), "SN"); + screen.Puts(x + 8, y, TA::OnOff(fpcr & 0x2000), "OP"); + screen.Puts(x + 11, y, TA::OnOff(fpcr & 0x1000), "OV"); + screen.Puts(x + 14, y, TA::OnOff(fpcr & 0x0800), "UF"); + screen.Puts(x + 17, y, TA::OnOff(fpcr & 0x0400), "DZ"); + screen.Puts(x + 20, y, TA::OnOff(fpcr & 0x0200), "I2"); + screen.Puts(x + 23, y, TA::OnOff(fpcr & 0x0100), "I1"); + y++; screen.Print(x + 2, y++, "RP=%s RM=%s", rpstr[(fpcr >> 6) & 3], rmstr[(fpcr >> 4) & 3]); @@ -314,27 +382,27 @@ MPU680x0Device::MonitorUpdateReg(Monitor uint32 fpsr = reg.fpframe.fpf_fpsr; uint32 cc = fpsr >> 24; screen.Print(x, y++, "FPSR:%08x", fpsr); - screen.Print(x + 2, y++, "%c %c %s %s Q=$%02x", - (cc & 0x08) ? 'N' : '-', - (cc & 0x04) ? 'Z' : '-', - (cc & 0x02) ? "Inf" : "---", - (cc & 0x01) ? "NAN" : "---", - (fpsr >> 16) & 0xff); - screen.Print(x + 2, y++, "%s %s %s %s %s %s %s %s", - (fpsr & 0x8000) ? "BS" : "--", - (fpsr & 0x4000) ? "SN" : "--", - (fpsr & 0x2000) ? "OP" : "--", - (fpsr & 0x1000) ? "OV" : "--", - (fpsr & 0x0800) ? "UF" : "--", - (fpsr & 0x0400) ? "DZ" : "--", - (fpsr & 0x0200) ? "I2" : "--", - (fpsr & 0x0100) ? "I1" : "--"); - screen.Print(x + 2, y++, "%s %s %s %s %s", - (fpsr & 0x80) ? "IOP" : "---", - (fpsr & 0x40) ? "OVFL" : "----", - (fpsr & 0x20) ? "UNFL" : "----", - (fpsr & 0x10) ? "DZ" : "--", - (fpsr & 0x08) ? "INEX" : "----"); + screen.Puts(x + 2, y, TA::OnOff(cc & 0x08), "N"); + screen.Puts(x + 4, y, TA::OnOff(cc & 0x04), "Z"); + screen.Puts(x + 6, y, TA::OnOff(cc & 0x02), "Inf"); + screen.Puts(x + 10, y, TA::OnOff(cc & 0x01), "NAN"); + screen.Print(x + 14, y, "Q=$%02x", (fpsr >> 16) & 0xff); + y++; + screen.Puts(x + 2, y, TA::OnOff(fpsr & 0x8000), "BS"); + screen.Puts(x + 5, y, TA::OnOff(fpsr & 0x4000), "SN"); + screen.Puts(x + 8, y, TA::OnOff(fpsr & 0x2000), "OP"); + screen.Puts(x + 11, y, TA::OnOff(fpsr & 0x1000), "OV"); + screen.Puts(x + 14, y, TA::OnOff(fpsr & 0x0800), "UF"); + screen.Puts(x + 17, y, TA::OnOff(fpsr & 0x0400), "DZ"); + screen.Puts(x + 20, y, TA::OnOff(fpsr & 0x0200), "I2"); + screen.Puts(x + 23, y, TA::OnOff(fpsr & 0x0100), "I1"); + y++; + screen.Puts(x + 2, y, TA::OnOff(fpsr & 0x80), "IOP"); + screen.Puts(x + 6, y, TA::OnOff(fpsr & 0x80), "OVFL"); + screen.Puts(x + 11, y, TA::OnOff(fpsr & 0x80), "UNFL"); + screen.Puts(x + 16, y, TA::OnOff(fpsr & 0x80), "DZ"); + screen.Puts(x + 19, y, TA::OnOff(fpsr & 0x80), "INEX"); + y++; // FPIAR screen.Print(x, y++, "FPIAR:%08x", reg.fpframe.fpf_fpiar);