--- nono/vm/mpscc.cpp 2026/04/29 17:05:21 1.1.1.4 +++ nono/vm/mpscc.cpp 2026/04/29 17:05:25 1.1.1.5 @@ -123,7 +123,7 @@ MPSCCDevice::Init() interrupt = GetInterruptDevice(); scheduler->ConnectMessage(MessageID::HOSTCOM_RX, this, - ToMessageCallback(&MPSCCDevice::RxMessageCallback)); + ToMessageCallback(&MPSCCDevice::RxMessage)); return true; } @@ -653,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]; // 接続デバイスの呼び出し @@ -718,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]; @@ -939,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 ビットなので名称もビット位置も誤り。 @@ -956,6 +961,8 @@ MPSCCDevice::SetTxPeriod(MPSCCChan& chan // // 注2: uPD7201 のみ。Z8530 ではこの選択肢はないので常に true のはず。 // +// 注3: Z8530 のみ。uPD7201 ではこの選択肢はないので常に true にしてある。 +// void MPSCCDevice::ChangeInterrupt() { @@ -1011,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); }