--- nono/vm/lance.h 2026/04/29 17:05:25 1.1.1.12 +++ nono/vm/lance.h 2026/04/29 17:05:38 1.1.1.15 @@ -14,14 +14,13 @@ #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; @@ -145,7 +144,7 @@ struct AM7990 bool IsBSWP() const { return (csr3 & CSR3_BSWP); } }; -class LanceDevice : public EthernetDevice +class LanceDevice : public EthernetDevice, public IHWAddrFilter { using inherited = EthernetDevice; @@ -173,12 +172,15 @@ class LanceDevice : public EthernetDevic 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; - busdata Read(uint32 offset); - busdata Write(uint32 offset, uint32 data); - busdata Peek(uint32 offset); + busdata ReadPort(uint32 offset); + busdata PeekPort(uint32 offset); private: DECLARE_MONITOR_CALLBACK(MonitorUpdate); @@ -188,9 +190,9 @@ class LanceDevice : public EthernetDevic 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(); @@ -233,14 +235,16 @@ class LanceDevice : public EthernetDevic // Initialization Block uint16 initblock[12] {}; - macaddr_t padr {}; + MacAddr padr {}; + uint64 ladrf {}; + bool promisc {}; uint32 rmd_base {}; // 受信ディスクリプタの(SubRAMでの)開始アドレス - int rmd_num {}; // 受信ディスクリプタ数 - int rmd_cur {}; // RMD 内の現在の注目インデックス + uint rmd_num {}; // 受信ディスクリプタ数 + uint rmd_cur {}; // RMD 内の現在の注目インデックス uint32 tmd_base {}; // 送信ディスクリプタの(SubRAMでの)開始アドレス - int tmd_num {}; // 送信ディスクリプタ数 - int tmd_cur {}; // TMD 内の現在の注目インデックス + uint tmd_num {}; // 送信ディスクリプタ数 + uint tmd_cur {}; // TMD 内の現在の注目インデックス uint16 rmd1 {}; // 現在の RMD1 uint32 rmd1_ahead {}; // 次の RMD1 先読み (負なら先読みしてない状態) @@ -264,7 +268,7 @@ class LanceDevice : public EthernetDevic Event rx_event { this }; Event tx_event { this }; - Monitor monitor { this }; + Monitor *monitor {}; }; static inline LanceDevice *GetLanceDevice() {