--- nono/vm/busio.h 2026/04/29 17:05:10 1.1.1.5 +++ nono/vm/busio.h 2026/04/29 17:05:17 1.1.1.7 @@ -17,7 +17,7 @@ template class BusIO_B_Base : public T { - private: + protected: inline uint32 Decoder(uint32 addr) { return (addr >> rshift) & (T::NPORT - 1); } @@ -34,6 +34,10 @@ class BusIO_B_Base : public T uint64 Peek8(uint32 addr) override { return T::Peek(Decoder(addr)); } + + uint64 Poke8(uint32 addr, uint32 data) override { + return T::Poke(Decoder(addr), data); + } }; // バイトデバイスをバイトのまま配置する。 @@ -223,7 +227,7 @@ class BusIO_FB : public T template class BusIO_BFFF : public T { - private: + protected: inline uint32 Decoder(uint32 addr) { return (addr >> 2) & (T::NPORT - 1); } @@ -272,6 +276,15 @@ class BusIO_BFFF : public T return 0xff; } } + + uint64 Poke8(uint32 addr, uint32 data) override { + if ((addr & 3) == 0) { + return T::Poke(Decoder(addr), data); + } else { + // 非接続なので、書き換えようとしてもエラーも起きず何も起きない。 + return 0; + } + } }; // ワードデバイスをロングワードにミラー配置する。 @@ -295,7 +308,7 @@ class BusIO_WW : public T } uint64 Write8(uint32 addr, uint32 data) override { - VMPANIC("not implemented"); + VMPANIC("(NOT IMPLEMENTED)"); return (int64)-1; // XXX 未確認 } uint64 Write16(uint32 addr, uint32 data) override { @@ -341,7 +354,7 @@ class BusIO_WF : public T } uint64 Write8(uint32 addr, uint32 data) override { - VMPANIC("not implemented"); + VMPANIC("(NOT IMPLEMENTED)"); return 0; // XXX 未確認 } uint64 Write16(uint32 addr, uint32 data) override {