--- nono/vm/lance.h 2026/04/29 17:05:10 1.1.1.9 +++ nono/vm/lance.h 2026/04/29 17:06:01 1.1.1.17 @@ -11,14 +11,15 @@ #pragma once #include "ethernet.h" -#include "event.h" #include "hostnet.h" #include "message.h" -#include "monitor.h" + +class InterruptDevice; +class SubRAMDevice; struct AM7990 { - int rap; // レジスタアドレス (0..3) + uint rap; // レジスタアドレス (0..3) // CSR0 static const uint16 CSR0_ERR = 0x8000; @@ -142,7 +143,7 @@ struct AM7990 bool IsBSWP() const { return (csr3 & CSR3_BSWP); } }; -class LanceDevice : public EthernetDevice +class LanceDevice : public EthernetDevice, public IHWAddrFilter { using inherited = EthernetDevice; @@ -165,29 +166,32 @@ class LanceDevice : public EthernetDevic public: LanceDevice(); - virtual ~LanceDevice() override; + ~LanceDevice() override; bool Init() override; void ResetHard(bool poweron) override; - protected: + int HWAddrFilter(const MacAddr& dstaddr) const override; + // BusIO インタフェース + // (内蔵 ROM からのアクセス用に特別に public にしてある) + busdata WritePort(uint32 offset, uint32 data); + protected: static const uint32 NPORT = 2; - uint64 Read(uint32 offset); - uint64 Write(uint32 offset, uint32 data); - uint64 Peek(uint32 offset); + busdata ReadPort(uint32 offset); + busdata PeekPort(uint32 offset); private: - DECLARE_MONITOR_CALLBACK(MonitorUpdate); + DECLARE_MONITOR_SCREEN(MonitorScreen); void MonitorReg(TextScreen&, int x, int y, uint32 data, const char * const * names); uint32 ReadData(); void WriteData(uint32 data); // メモリアクセス - uint64 ReadMem(uint32 paddr); - uint64 WriteMem(uint32 paddr, uint32 data); - uint64 PeekMem(uint32 paddr); + uint32 ReadMem(uint32 paddr); + void WriteMem(uint32 paddr, uint32 data); + uint32 PeekMem(uint32 paddr) const; void ChipInit(); void ChipStart(); @@ -198,22 +202,22 @@ class LanceDevice : public EthernetDevic // 割り込み信号線の状態を変える void ChangeInterrupt(); - void TXIdle(Event&); + void TXIdle(Event *); void TXCopy(); - void TXSend(Event&); - void TXNext(Event&); + void TXSend(Event *); + void TXNext(Event *); - void RXIdle(Event&); + void RXIdle(Event *); void RXCopy(); - void RXNext(Event&); + void RXNext(Event *); void RXMiss(); // フェーズ遷移 void ChangePhase(TXPhase new_phase, uint64 time = 100_nsec); void ChangePhase(RXPhase new_phase, uint64 time = 100_nsec); - // パケット受信通知 (HostNet から) - void HostRxCallback(MessageID, uint32); + // パケット受信通知 (HostNet から EthernetDevice 経由で呼ばれる) + void RxMessage(MessageID, uint32); const std::string BitToString(const char * const name[], uint16 bits); const std::string CSR0ToString(uint16 bits); @@ -230,14 +234,16 @@ class LanceDevice : public EthernetDevic // Initialization Block uint16 initblock[12] {}; - macaddr_t padr {}; - - uint32 rmd_base {}; // 受信ディスクリプタの(ZRAM での)開始アドレス - int rmd_num {}; // 受信ディスクリプタ数 - int rmd_cur {}; // RMD 内の現在の注目インデックス - uint32 tmd_base {}; // 送信ディスクリプタの(ZRAM での)開始アドレス - int tmd_num {}; // 送信ディスクリプタ数 - int tmd_cur {}; // TMD 内の現在の注目インデックス + MacAddr padr {}; + uint64 ladrf {}; + bool promisc {}; + + uint32 rmd_base {}; // 受信ディスクリプタの(SubRAMでの)開始アドレス + uint rmd_num {}; // 受信ディスクリプタ数 + uint rmd_cur {}; // RMD 内の現在の注目インデックス + uint32 tmd_base {}; // 送信ディスクリプタの(SubRAMでの)開始アドレス + uint tmd_num {}; // 送信ディスクリプタ数 + uint tmd_cur {}; // TMD 内の現在の注目インデックス uint16 rmd1 {}; // 現在の RMD1 uint32 rmd1_ahead {}; // 次の RMD1 先読み (負なら先読みしてない状態) @@ -251,12 +257,19 @@ class LanceDevice : public EthernetDevic RXPhase rx_phase {}; // 受信フェーズ TXPhase tx_phase {}; // 送信フェーズ - // 待ち時間用イベント - Event rx_event { this }; - Event tx_event { this }; - - Monitor monitor { this }; - // 前回の TMD 状態文字列 (デバッグ表示用) std::string last_tmdstr {}; + + InterruptDevice *interrupt {}; + SubRAMDevice *subram {}; + + // 待ち時間用イベント + Event *rx_event {}; + Event *tx_event {}; + + Monitor *monitor {}; }; + +inline LanceDevice *GetLanceDevice() { + return Object::GetObject(OBJ_ETHERNET(0)); +}