--- nono/vm/lance.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/lance.h 2026/04/29 17:04:35 1.1.1.3 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once @@ -137,7 +138,7 @@ struct AM7990 class LanceDevice : public EthernetDevice { - typedef EthernetDevice inherited; + using inherited = EthernetDevice; public: static const uint32 REQ_TXIDLE = 0x00000001; // ポーリングフェーズ static const uint32 REQ_TXCOPY = 0x00000002; // バッファ読込フェーズ @@ -152,28 +153,33 @@ class LanceDevice public: LanceDevice(); - virtual ~LanceDevice(); + ~LanceDevice() override; - virtual bool Init(); - virtual void ResetHard(); + bool Init() override; + void ResetHard() override; - virtual uint64 Read8(uint32 addr); - virtual uint64 Read16(uint32 addr); - virtual uint64 Read32(uint32 addr); - virtual uint64 Write8(uint32 addr, uint32 data); - virtual uint64 Write16(uint32 addr, uint32 data); - virtual uint64 Write32(uint32 addr, uint32 data); - virtual uint64 Peek8(uint32 addr); - - virtual bool MonitorUpdate(); + bool MonitorUpdate() override; // ワーカスレッド (エントリポイントから呼ばれる) void ThreadRun(); // パケットを受信した (ホストネットワークスレッドから呼ばれる) - virtual bool RecvPacket(qvector& buf); + bool RecvPacket(qvector& buf) override; + + protected: + // BusIO インタフェース + static const uint32 NPORT = 2; + uint64 Read(uint32 addr); + uint64 Write(uint32 addr, uint32 data); + uint64 Peek(uint32 addr); private: + pthread_t thread; + bool thread_created = false; // スレッドが作成されたら true + + // スレッドの終了を指示 + void Terminate(); + void MonitorReg(int x, int y, uint32 data, const char * const * names); uint32 ReadData(); void WriteData(uint32 data); @@ -240,5 +246,3 @@ class LanceDevice // 前回の TMD 状態文字列 (デバッグ表示用) std::string last_tmdstr {}; }; - -extern LanceDevice *gLance;