--- nono/vm/mpscc.cpp 2026/04/29 17:05:46 1.1.1.10 +++ nono/vm/mpscc.cpp 2026/04/29 17:05:50 1.1.1.11 @@ -20,6 +20,7 @@ #define MPSCC_SIO_LOG_HACK #include "mpscc.h" #include "bitops.h" +#include "event.h" #include "hostcom.h" #include "interrupt.h" #include "monitor.h" @@ -115,18 +116,14 @@ MPSCCDevice::Init() scheduler->ConnectMessage(MessageID::HOSTCOM0_RX, this, ToMessageCallback(&MPSCCDevice::RxMessage)); + auto evman = GetEventManager(); for (int ch = 0; ch < mpscc.chan.size(); ch++) { - // time は SetTxPeriod() でセット。 // 名前は継承先でセットする。機種ごとに名前を使い分けているため。 - txevent[ch].dev = this; - txevent[ch].func = ToEventCallback(&MPSCCDevice::TxCallback); - txevent[ch].code = ch; - scheduler->RegistEvent(txevent[ch]); - - rxevent[ch].dev = this; - rxevent[ch].func = ToEventCallback(&MPSCCDevice::RxCallback); - rxevent[ch].code = ch; - scheduler->RegistEvent(rxevent[ch]); + txevent[ch] = evman->Regist(this, ch, + ToEventCallback(&MPSCCDevice::TxCallback)); + + rxevent[ch] = evman->Regist(this, ch, + ToEventCallback(&MPSCCDevice::RxCallback)); } return true; @@ -648,7 +645,7 @@ void MPSCCDevice::TrySend(MPSCCChan& chan) { // 送信可で送信バッファにデータがあって送信中でなければ - if (chan.tx_enable && chan.txlen && !txevent[chan.id].IsRunning()) { + if (chan.tx_enable && chan.txlen && !txevent[chan.id]->IsRunning()) { // 送信する chan.tx_shiftreg = chan.txbuf; chan.txlen = 0; @@ -664,9 +661,9 @@ MPSCCDevice::TrySend(MPSCCChan& chan) // 送信のイベントコールバック void -MPSCCDevice::TxCallback(Event& ev) +MPSCCDevice::TxCallback(Event *ev) { - int ch = ev.code; + int ch = ev->code; MPSCCChan& chan = mpscc.chan[ch]; // 接続デバイスの呼び出し @@ -689,14 +686,42 @@ MPSCCDevice::HostRxCallback(uint32 dummy // またはスケジューラにメッセージではないなにか別の方法で // 通知を出すようにする必要がある。 - Event& ev = rxevent[COM_CH]; + const Event *ev = rxevent[COM_CH]; - if (ev.IsRunning() == false) { + if (ev->IsRunning() == false) { // スレッドを超えるためにメッセージを投げる scheduler->SendMessage(MessageID::HOSTCOM0_RX); } } +// ホストシリアルからの1バイト受信メッセージ +void +MPSCCDevice::RxMessage(MessageID msgid, uint32 arg) +{ + Event *ev = rxevent[COM_CH]; + + // 受信ループが止まっていれば開始 + if (ev->IsRunning() == false) { + scheduler->StartEvent(ev); + } +} + +// 受信イベントコールバック +void +MPSCCDevice::RxCallback(Event *ev) +{ + int ch = ev->code; + int data; + + // ホストキューにあるだけ取り出す + data = hostcom->Rx(); + if (data >= 0) { + Rx(ch, data); + + scheduler->StartEvent(ev); + } +} + // 1バイト受信する。 // 受理されれば true を返す。 bool @@ -727,34 +752,6 @@ MPSCCDevice::Rx(int ch, uint32 data) return true; } -// ホストシリアルからの1バイト受信メッセージ -void -MPSCCDevice::RxMessage(MessageID msgid, uint32 arg) -{ - Event& ev = rxevent[COM_CH]; - - // 受信ループが止まっていれば開始 - if (ev.IsRunning() == false) { - scheduler->StartEvent(ev); - } -} - -// 受信イベントコールバック -void -MPSCCDevice::RxCallback(Event& ev) -{ - int ch = ev.code; - int data; - - // ホストキューにあるだけ取り出す - data = hostcom->Rx(); - if (data >= 0) { - Rx(ch, data); - - scheduler->StartEvent(ev); - } -} - static double to_freq(uint64 nsec) { @@ -841,7 +838,7 @@ MPSCCDevice::SetRxPeriod(MPSCCChan& chan bit += AdditionalBits(chan, chan.rx_enable); chan.rxframebits = bit; - rxevent[chan.id].time = bit * chan.bit12_ns / 12; + rxevent[chan.id]->time = bit * chan.bit12_ns / 12; if (loglevel >= 1) { bool old_enable = chan.old_cr3 & MPSCC::CR3_RX_EN; @@ -906,7 +903,7 @@ MPSCCDevice::SetTxPeriod(MPSCCChan& chan bit += AdditionalBits(chan, chan.tx_enable); chan.txframebits = bit; - txevent[chan.id].time = bit * chan.bit12_ns / 12; + txevent[chan.id]->time = bit * chan.bit12_ns / 12; if (loglevel >= 1) { bool old_enable = chan.old_cr5 & MPSCC::CR5_TX_EN; @@ -1087,7 +1084,7 @@ MPSCCDevice::GetParamStr(const MPSCCChan // 75 * 2 ^ (e-1) を求める double a = (chan.baudrate / 75) * 1.5; std::frexp(a, &e); - int b = 75 * (1 << (e - 1)); + int b = 75 * (1U << (e - 1)); if (b * 19 / 20 <= chan.baudrate && chan.baudrate <= b * 21 / 20) { baud = b; @@ -1179,7 +1176,7 @@ MPSCCDevice::MonitorReg(TextScreen& scre if (names[i][0] == '-') { screen.Puts(x + i * 5, y, TA::Disable, "----"); } else { - bool b = reg & (1 << (7 - i)); + bool b = reg & (1U << (7 - i)); screen.Puts(x + i * 5, y, TA::OnOff(b), names[i]); } }