--- nono/vm/spc.cpp 2026/04/29 17:04:45 1.1.1.7 +++ nono/vm/spc.cpp 2026/04/29 17:04:53 1.1.1.9 @@ -9,7 +9,6 @@ #include "mainapp.h" #include "mpu680x0.h" #include "mpu88xx0.h" -#include "mystring.h" #include "pedec.h" #include "sram.h" #include "vm.h" @@ -117,30 +116,10 @@ SPCDevice::Init() return true; } - -// 本体リセットスイッチによるリセット +// デバイスリセット void SPCDevice::ResetHard() { - Reset(); -} - -// MPU の RESET 命令によるリセット -void -SPCDevice::ResetSoft() -{ - // X68030 は RESET 命令でもリセットがかかる。 - // LUNA は本体回路が分からないし PROM が何回も RESET 命令を発行するので、 - // とりあえず外しておく。 - if (vmtype != VMTYPE_X68030) { - Reset(); - } -} - -// SPC リセット -void -SPCDevice::Reset() -{ putlog(1, "リセット"); // 初期値 (p.61) @@ -166,13 +145,13 @@ SPCDevice::Reset() } uint64 -SPCDevice::Read(uint32 addr) +SPCDevice::Read(uint32 offset) { uint8 data; gMPU->AddCycle(read_wait); - switch (addr) { + switch (offset) { case SPC::BDID: data = 1 << myid; putlog(3, "BDID -> $%02x", data); @@ -199,11 +178,11 @@ SPCDevice::Read(uint32 addr) if (event_tc.active) { // イベント中は値が変わった時だけ表示 if (prev_ints != data) { - putlog("INTS -> $%02x", data); + putlogn("INTS -> $%02x", data); prev_ints = data; } } else { - putlog("INTS -> $%02x", data); + putlogn("INTS -> $%02x", data); prev_ints = -1U; } } @@ -220,11 +199,11 @@ SPCDevice::Read(uint32 addr) if (event_tc.active) { // イベント中は値が変わった時だけ表示 if (prev_ssts != data) { - putlog("SSTS -> $%02x", data); + putlogn("SSTS -> $%02x", data); prev_ssts = data; } } else { - putlog("SSTS -> $%02x", data); + putlogn("SSTS -> $%02x", data); prev_ssts = -1U; } } @@ -275,11 +254,11 @@ SPCDevice::Read(uint32 addr) } uint64 -SPCDevice::Write(uint32 addr, uint32 data) +SPCDevice::Write(uint32 offset, uint32 data) { gMPU->AddCycle(write_wait); - switch (addr) { + switch (offset) { case SPC::BDID: putlog(3, "BDID <- $%02x", data); if (myid == data) { @@ -383,9 +362,9 @@ SPCDevice::Write(uint32 addr, uint32 dat } uint64 -SPCDevice::Peek(uint32 addr) +SPCDevice::Peek(uint32 offset) { - switch (addr) { + switch (offset) { case SPC::BDID: return 1 << myid; @@ -740,7 +719,7 @@ SPCDevice::WriteSCTL(uint32 data) putlog(3, "SCTL <- $%02x", spc.sctl); if ((up & SPC::SCTL_RESET)) { // リセット - Reset(); + ResetHard(); } else { // 通常動作 } @@ -832,8 +811,13 @@ SPCDevice::WriteSCMD(uint32 data) // イニシエータなら ACK を、ターゲットなら REQ をセットする。 // ターゲットモードはサポートしないので、操作するのは ACK のみ。 if ((spc.scmd & SPC::SCMD_INTERCEPT)) { - // Intercept 動作は未実装 - putlog(0, "SCMD Intercept with SetACK not implemented"); + // Intercept なら DREG を維持したまま (たぶん TEMP で) バスを + // 直接アクセスするようだが、この DREG 維持あたりは未対応。 + // これが影響するのは DREG にデータが滞留してる時だけのはず + // なので、その時だけログを出す。(X68030 IPLROM、NetBSD/x68k) + if (spc.dreg.Length() != 0) { + putlog(0, "SCMD Intercept with SetACK not implemented"); + } } AssertACK(); break; @@ -965,10 +949,10 @@ SPCDevice::GetSSTS() const if (spc.tc == 0) { // TC がゼロか data |= SPC::SSTS_TC_ZERO; } - if (spc.dreg.Length() == 8) { + if (spc.dreg.IsFull()) { data |= SPC::SSTS_DREG_FULL; } - if (spc.dreg.Length() == 0) { + if (spc.dreg.Empty()) { data |= SPC::SSTS_DREG_EMPTY; } @@ -1027,7 +1011,7 @@ SPCDevice::ReadDREG() bool q_was_full = spc.dreg.IsFull(); data = spc.dreg.Dequeue(); if (loglevel >= 4) { - putlog("DREG -> $%02x (q=%d TC=0x%x)", + putlogn("DREG -> $%02x (q=%d TC=0x%x)", data, spc.dreg.Length(), spc.tc); } else { putlog(3, "DREG -> $%02x", data); @@ -1286,9 +1270,9 @@ SPCDevice::SelectionTimeout(Event& ev) data &= ~(1 << myid); tgtid = DecodeID(data); if (tgtid == -1) { - putlog("Selection timeout"); + putlogn("Selection timeout"); } else { - putlog("Selection timeout (#%d)", tgtid); + putlogn("Selection timeout (#%d)", tgtid); } }