--- nono/vm/mpscc.cpp 2026/04/29 17:05:17 1.1.1.3 +++ nono/vm/mpscc.cpp 2026/04/29 17:05:25 1.1.1.5 @@ -86,7 +86,7 @@ MPSCCDevice::MPSCCDevice() MPSCCDevice::~MPSCCDevice() { if ((bool)hostcom) { - hostcom->SetCallbackDevice(NULL); + hostcom->SetRxCallback(NULL); } } @@ -94,14 +94,11 @@ bool MPSCCDevice::Create() { // 対応するホストドライバを作成 - try { - hostcom.reset(new HostCOMDevice("HostCOM")); - } catch (...) { + hostcom.reset(new HostCOMDevice(this, "HostCOM")); + if ((bool)hostcom == false) { return false; } - hostcom->SetRxCallback(ToDeviceCallback(&MPSCCDevice::HostRxCallback)); - hostcom->SetCallbackDevice(this); return true; } @@ -126,7 +123,7 @@ MPSCCDevice::Init() interrupt = GetInterruptDevice(); scheduler->ConnectMessage(MessageID::HOSTCOM_RX, this, - ToMessageCallback(&MPSCCDevice::RxMessageCallback)); + ToMessageCallback(&MPSCCDevice::RxMessage)); return true; } @@ -656,9 +653,9 @@ MPSCCDevice::TrySend(MPSCCChan& chan) // 送信のイベントコールバック void -MPSCCDevice::TxCallback(Event& event) +MPSCCDevice::TxCallback(Event& ev) { - int ch = event.code; + int ch = ev.code; MPSCCChan& chan = mpscc.chan[ch]; // 接続デバイスの呼び出し @@ -721,7 +718,7 @@ MPSCCDevice::Rx(int ch, uint32 data) // ホストシリアルからの1バイト受信メッセージ void -MPSCCDevice::RxMessageCallback(MessageID msgid, uint32 arg) +MPSCCDevice::RxMessage(MessageID msgid, uint32 arg) { Event& ev = rxevent[COM_CH]; @@ -942,15 +939,20 @@ MPSCCDevice::SetTxPeriod(MPSCCChan& chan // All/First RxChar ----|& |OR |&--+ // |OR---------|& | // o Special Rx Condition -----|OR +---|OR -// |OR --- -// o External/Status ------------------------------|OR-->o-- INT // |OR -// o Tx Buffer Empty ----------|& +---|OR -// |&-----|& | -// Tx INT/DMA Enable --------|& |& | -// (CR1 b1) |&-------+ -// |& -// INT/DMA Mode (CR2A b1,0) --------|& (注2) +// o External/Status ------------------------------|OR----|& ___ +// |OR |&-->o-- INT +// o Tx Buffer Empty ----------|& +---|OR +-|& +// |&-----|& | | +// Tx INT/DMA Enable --------|& |& | | +// (CR1 b1) |&-------+ | +// |& | +// INT/DMA Mode (CR2A b1,0) --------|& (注2) | +// | +// Master Interrupt Enable ---------------------------+ (注3) +// (Z8530 Only, WR9) +// +// 左端の o 印は割り込み要因(チャンネルあたり4種類)。他は制御フラグ。 // // 注1: uPD7201/7201A Figure 3-2 では "Rx Disable (CR1:D1)" だがそこは // Tx INT/DMA Enable ビットなので名称もビット位置も誤り。 @@ -959,6 +961,8 @@ MPSCCDevice::SetTxPeriod(MPSCCChan& chan // // 注2: uPD7201 のみ。Z8530 ではこの選択肢はないので常に true のはず。 // +// 注3: Z8530 のみ。uPD7201 ではこの選択肢はないので常に true にしてある。 +// void MPSCCDevice::ChangeInterrupt() { @@ -1014,6 +1018,11 @@ MPSCCDevice::ChangeInterrupt() total_intpend |= chan.intpend; } + // Z8530 の MIE。uPD7201 では true 固定にしてある。 + if (mpscc.master_int_enable == false) { + total_intpend = 0; + } + // いずれかでもあれば割り込みをアサート interrupt->ChangeINT(this, total_intpend); }