--- nono/vm/lance.cpp 2026/04/29 17:05:46 1.1.1.19 +++ nono/vm/lance.cpp 2026/04/29 17:05:50 1.1.1.20 @@ -10,6 +10,7 @@ #include "lance.h" #include "bitops.h" +#include "event.h" #include "interrupt.h" #include "mainbus.h" #include "monitor.h" @@ -48,11 +49,9 @@ LanceDevice::Init() scheduler->ConnectMessage(MessageID::HOSTNET_RX(0), this, ToMessageCallback(&LanceDevice::RxMessage)); - // func, time は都度設定する - rx_event.SetName("Lance RX"); - tx_event.SetName("Lance TX"); - scheduler->RegistEvent(rx_event); - scheduler->RegistEvent(tx_event); + auto evman = GetEventManager(); + rx_event = evman->Regist(this, NULL, "Lance RX"); + tx_event = evman->Regist(this, NULL, "Lance TX"); return true; } @@ -368,7 +367,7 @@ LanceDevice::MonitorReg(TextScreen& scre int x, int y, uint32 data, const char * const *names) { for (int i = 0; i < 8; i++) { - bool b = data & (1 << (7 - i)); + bool b = data & (1U << (7 - i)); screen.Puts(x + i * 5, y, TA::OnOff(b), names[i]); } } @@ -602,12 +601,12 @@ LanceDevice::ChipInit() uint32 rdrp = initblock[8] | (initblock[9] << 16); rmd_base = rdrp & 0xfffffc; int rlen = rdrp >> 29; - rmd_num = (1 << rlen); + rmd_num = (1U << rlen); uint32 tdrp = initblock[10] | (initblock[11] << 16); tmd_base = tdrp & 0xfffffc; int tlen = tdrp >> 29; - tmd_num = (1 << tlen); + tmd_num = (1U << tlen); padr = MacAddr( initblock[1] & 0xff, @@ -723,7 +722,7 @@ LanceDevice::ChangeInterrupt() // - 所有できない場合、TDMD オンなら即、 // オフなら 1.6ms 待ってから再び TXIDLE へ。 void -LanceDevice::TXIdle(Event& ev) +LanceDevice::TXIdle(Event *ev) { tx_phase = TXPhase::IDLE; @@ -872,7 +871,7 @@ LanceDevice::TXCopy() // ただし ENP でなければアンダーフローによるパケット送信なのでフラグ処理。 // その後 TXNEXT フェーズへ。 void -LanceDevice::TXSend(Event& ev) +LanceDevice::TXSend(Event *ev) { tx_phase = TXPhase::SEND; @@ -909,7 +908,7 @@ LanceDevice::TXSend(Event& ev) // TXNEXT フェーズ。次のディスクリプタを指して TXIDLE へ。 void -LanceDevice::TXNext(Event& ev) +LanceDevice::TXNext(Event *ev) { tx_phase = TXPhase::NEXT; @@ -930,19 +929,19 @@ LanceDevice::TXNext(Event& ev) void LanceDevice::ChangePhase(TXPhase new_phase, uint64 time) { - tx_event.time = time; + tx_event->time = time; switch (new_phase) { case TXPhase::STOP: scheduler->StopEvent(tx_event); return; case TXPhase::IDLE: - tx_event.func = ToEventCallback(&LanceDevice::TXIdle); + tx_event->func = ToEventCallback(&LanceDevice::TXIdle); break; case TXPhase::SEND: - tx_event.func = ToEventCallback(&LanceDevice::TXSend); + tx_event->func = ToEventCallback(&LanceDevice::TXSend); break; case TXPhase::NEXT: - tx_event.func = ToEventCallback(&LanceDevice::TXNext); + tx_event->func = ToEventCallback(&LanceDevice::TXNext); break; default: assertmsg(false, "phase %u", (uint)new_phase); @@ -988,7 +987,7 @@ LanceDevice::RxMessage(MessageID msgid, // RXIDLE 受信アイドルフェーズ。 // (最初の)ディスクリプタを所有できるかポーリングする。 void -LanceDevice::RXIdle(Event& ev) +LanceDevice::RXIdle(Event *ev) { rx_phase = RXPhase::IDLE; @@ -1132,7 +1131,7 @@ LanceDevice::RXCopy() // - 次のディスクリプタが所有できれば引き続き書き出すため RXCOPY へ。 // - 次のディスクリプタが所有できなければエラーにして RXIDLE へ。 void -LanceDevice::RXNext(Event& ev) +LanceDevice::RXNext(Event *ev) { rx_phase = RXPhase::NEXT; @@ -1257,16 +1256,16 @@ LanceDevice::HWAddrFilter(const MacAddr& void LanceDevice::ChangePhase(RXPhase new_phase, uint64 time) { - rx_event.time = time; + rx_event->time = time; switch (new_phase) { case RXPhase::STOP: scheduler->StopEvent(rx_event); return; case RXPhase::IDLE: - rx_event.func = ToEventCallback(&LanceDevice::RXIdle); + rx_event->func = ToEventCallback(&LanceDevice::RXIdle); break; case RXPhase::NEXT: - rx_event.func = ToEventCallback(&LanceDevice::RXNext); + rx_event->func = ToEventCallback(&LanceDevice::RXNext); break; default: assertmsg(false, "phase %u", (uint)new_phase);