--- nono/vm/rtl8019as.cpp 2026/04/29 17:05:46 1.1.1.6 +++ nono/vm/rtl8019as.cpp 2026/04/29 17:05:51 1.1.1.7 @@ -39,6 +39,7 @@ // Page3: E1 30 00 00 90 00 10 FF 00 FE FF FD FF FE FF FF #include "rtl8019as.h" +#include "event.h" #include "interrupt.h" #include "monitor.h" #include "scheduler.h" @@ -90,19 +91,20 @@ RTL8019ASDevice::Init() scheduler->ConnectMessage(MessageID::HOSTNET_RX(n), this, ToMessageCallback(&RTL8019ASDevice::RxMessage)); - tx_event.func = ToEventCallback(&RTL8019ASDevice::TXEvent); - tx_event.SetName(string_format("RTL8019AS%u TX", n)); - rx_event.func = ToEventCallback(&RTL8019ASDevice::RXEvent); - rx_event.SetName(string_format("RTL8019AS%u RX", n)); - scheduler->RegistEvent(tx_event); - scheduler->RegistEvent(rx_event); - - txled_event.func = ToEventCallback(&RTL8019ASDevice::TXLedEvent); - txled_event.SetName(string_format("RTL8019AS%u TX LED", n)); - rxled_event.func = ToEventCallback(&RTL8019ASDevice::RXLedEvent); - rxled_event.SetName(string_format("RTL8019AS%u RX LED", n)); - scheduler->RegistEvent(txled_event); - scheduler->RegistEvent(rxled_event); + auto evman = GetEventManager(); + tx_event = evman->Regist(this, + ToEventCallback(&RTL8019ASDevice::TXEvent), + string_format("RTL8019AS%u TX", n)); + rx_event = evman->Regist(this, + ToEventCallback(&RTL8019ASDevice::RXEvent), + string_format("RTL8019AS%u RX", n)); + + txled_event = evman->Regist(this, + ToEventCallback(&RTL8019ASDevice::TXLedEvent), + string_format("RTL8019AS%u TX LED", n)); + rxled_event = evman->Regist(this, + ToEventCallback(&RTL8019ASDevice::RXLedEvent), + string_format("RTL8019AS%u RX LED", n)); return true; } @@ -554,7 +556,7 @@ RTL8019ASDevice::MonitorReg(TextScreen& if (names[i][0] == '-') { screen.Puts(x + i * 6, y, TA::Disable, names[i] + 1); } else { - bool b = reg & (1 << (7 - i)); + bool b = reg & (1U << (7 - i)); screen.Puts(x + i * 6, y, TA::OnOff(b), names[i]); } } @@ -2065,12 +2067,12 @@ RTL8019ASDevice::Transmit() tsr = 0; // 転送イベントを起こすだけ。 - tx_event.time = 0; + tx_event->time = 0; scheduler->StartEvent(tx_event); // LED イベントは止まっていれば動かす。 - if (txled_event.IsRunning() == false) { - txled_event.time = 0; + if (txled_event->IsRunning() == false) { + txled_event->time = 0; scheduler->StartEvent(txled_event); } } @@ -2079,7 +2081,7 @@ RTL8019ASDevice::Transmit() // TXP=1 で呼ばれて、ページごとにパケットにコピーする。 // TBCR で指定された長さを全部コピーしたらホストに送信。 void -RTL8019ASDevice::TXEvent(Event& ev) +RTL8019ASDevice::TXEvent(Event *ev) { // 今回処理する分 uint count = std::min((uint)transmit_byte_count, 256u); @@ -2117,7 +2119,7 @@ RTL8019ASDevice::TXEvent(Event& ev) // 転送にかかった時間を模しておく。 // 時間は適当。10Mbps なので 1バイトあたり 1usec とする。 - tx_event.time = count * 1_usec; + tx_event->time = count * 1_usec; scheduler->StartEvent(tx_event); } @@ -2128,8 +2130,8 @@ RTL8019ASDevice::RxMessage(MessageID msg // 受信イベントが止まっていれば動かす。 // 受信イベントがすでに動いていれば、1パケット受信完了後に // ホストキューを確認するので、ここでは何もしなくてよい。 - if (rx_event.IsRunning() == false) { - rx_event.time = 0; + if (rx_event->IsRunning() == false) { + rx_event->time = 0; scheduler->StartEvent(rx_event); } } @@ -2143,7 +2145,7 @@ RTL8019ASDevice::RxMessage(MessageID msg // len != 0, remain < len : 受信パケットのコピー (2ページ目以降) // len != 0, remain == 0 : 受信パケットのコピー完了直後。 void -RTL8019ASDevice::RXEvent(Event& ev) +RTL8019ASDevice::RXEvent(Event *ev) { uint remain; @@ -2162,8 +2164,8 @@ RTL8019ASDevice::RXEvent(Event& ev) // 受信 LED イベントが止まっていれば動かす。 // 取り出して、破棄するかもしれないより前。 - if (rxled_event.IsRunning() == false) { - rxled_event.time = 0; + if (rxled_event->IsRunning() == false) { + rxled_event->time = 0; scheduler->StartEvent(rxled_event); } @@ -2216,7 +2218,7 @@ RTL8019ASDevice::RXEvent(Event& ev) // この場合も、ホストキューから次のパケットを引き取る作業は必要。 // XXX 間隔は適当 rx_packet.Clear(); - ev.time = 1_usec; + ev->time = 1_usec; scheduler->RestartEvent(ev); } @@ -2241,7 +2243,7 @@ RTL8019ASDevice::RXHead() // 1ページ埋めるかパケットをコピーし終えたら次へ。 // (初回もヘッダ書き込みに続いて呼ばれる) void -RTL8019ASDevice::RXCopy(Event& ev, uint remain) +RTL8019ASDevice::RXCopy(Event *ev, uint remain) { // パケットをこのページにコピー。 // 今回処理する分はパケットの残りとページの残りの小さいほう。 @@ -2265,7 +2267,7 @@ RTL8019ASDevice::RXCopy(Event& ev, uint // 転送にかかった時間を模しておく。 // 時間は適当。10Mbps なので 1バイトあたり 1usec とする。 - ev.time = count * 1_usec; + ev->time = count * 1_usec; scheduler->RestartEvent(ev); } @@ -2274,7 +2276,7 @@ RTL8019ASDevice::RXCopy(Event& ev, uint // ストップ待ちでなければ再び RXEvent() イベントを呼び、 // 次パケットの処理を継続する。 void -RTL8019ASDevice::RXDone(Event& ev) +RTL8019ASDevice::RXDone(Event *ev) { // 前回でコピーが完了していればここで通知。 putlog(3, "RXDone Received %u bytes", rx_packet.length); @@ -2329,7 +2331,7 @@ RTL8019ASDevice::RXDone(Event& ev) // (rx_packet.length == 0 で RXEvent() を呼ぶとパケット受信となる) // どのくらいか待つ? 値は適当 - ev.time = 100_usec; + ev->time = 100_usec; scheduler->RestartEvent(ev); } } @@ -2398,12 +2400,12 @@ RTL8019ASDevice::HWAddrFilter(const MacA // 送信 LED イベント void -RTL8019ASDevice::TXLedEvent(Event& ev) +RTL8019ASDevice::TXLedEvent(Event *ev) { if (tx_led == false) { // 消灯中だったら、次は 6msec 点灯 tx_led = true; - ev.time = 6_msec; + ev->time = 6_msec; scheduler->RestartEvent(ev); } else { // 点灯中だったら @@ -2411,7 +2413,7 @@ RTL8019ASDevice::TXLedEvent(Event& ev) // - 送信中でなければここで終わり if (tx_in_progress) { tx_led = false; - ev.time = 100_msec; + ev->time = 100_msec; scheduler->RestartEvent(ev); } } @@ -2419,12 +2421,12 @@ RTL8019ASDevice::TXLedEvent(Event& ev) // 受信 LED イベント void -RTL8019ASDevice::RXLedEvent(Event& ev) +RTL8019ASDevice::RXLedEvent(Event *ev) { if (rx_led == false) { // 消灯中だったら、次は 6msec 点灯 rx_led = true; - ev.time = 6_msec; + ev->time = 6_msec; scheduler->RestartEvent(ev); } else { // 点灯中だったら @@ -2432,7 +2434,7 @@ RTL8019ASDevice::RXLedEvent(Event& ev) // - 受信中でなければここで終わり if (rx_packet.length != 0) { rx_led = false; - ev.time = 100_msec; + ev->time = 100_msec; scheduler->RestartEvent(ev); } }