--- nono/vm/busio.h 2026/04/29 17:04:41 1.1.1.3 +++ nono/vm/busio.h 2026/04/29 17:05:17 1.1.1.7 @@ -15,9 +15,9 @@ // バイトデバイスをバイト、ワード、ロングワードポートにミラー配置する共通部 template -class BusIO_B_Base: public T +class BusIO_B_Base : public T { - private: + protected: inline uint32 Decoder(uint32 addr) { return (addr >> rshift) & (T::NPORT - 1); } @@ -34,23 +34,27 @@ 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); + } }; // バイトデバイスをバイトのまま配置する。 // NPORT によるミラーを行う以外はこれを使わないのと何も変わらない。 template -class BusIO_B: public BusIO_B_Base { }; +class BusIO_B : public BusIO_B_Base { }; // バイトデバイスをワードにミラー配置する。 template -class BusIO_BB: public BusIO_B_Base { }; +class BusIO_BB : public BusIO_B_Base { }; // バイトデバイスをロングワードにミラー配置する。 template -class BusIO_BBBB: public BusIO_B_Base { }; +class BusIO_BBBB : public BusIO_B_Base { }; // ワードデバイスをワードのまま配置する。 // NPORT によるミラーを行う以外はこれを使わないのと何も変わらない。 template -class BusIO_W: public T +class BusIO_W : public T { private: inline uint32 Decoder(uint32 addr) { @@ -93,12 +97,12 @@ class BusIO_W: public T }; /* XXX: stub -class BusIO_L: public T +class BusIO_L : public T */ // バイトデバイスを偶数アドレスに配置し、奇数アドレスはバスエラー。 template -class BusIO_BE: public T +class BusIO_BE : public T { private: inline uint32 Decoder(uint32 addr) { @@ -139,7 +143,7 @@ class BusIO_BE: public T // バイトデバイスを奇数アドレスに配置し、偶数アドレスはバスエラー。 template -class BusIO_EB: public T +class BusIO_EB : public T { private: inline uint32 Decoder(uint32 addr) { @@ -180,7 +184,7 @@ class BusIO_EB: public T // バイトデバイスを奇数アドレスに配置し、偶数アドレスは非接続。 template -class BusIO_FB: public T +class BusIO_FB : public T { private: inline uint32 Decoder(uint32 addr) { @@ -221,9 +225,9 @@ class BusIO_FB: public T // バイトデバイスをロングワードの先頭に配置し、他は非接続。 template -class BusIO_BFFF: public T +class BusIO_BFFF : public T { - private: + protected: inline uint32 Decoder(uint32 addr) { return (addr >> 2) & (T::NPORT - 1); } @@ -272,11 +276,20 @@ 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; + } + } }; // ワードデバイスをロングワードにミラー配置する。 template -class BusIO_WW: public T +class BusIO_WW : public T { private: inline uint32 Decoder(uint32 addr) { @@ -295,7 +308,7 @@ class BusIO_WW: public T } uint64 Write8(uint32 addr, uint32 data) override { - PANIC("not implemented\n"); + VMPANIC("(NOT IMPLEMENTED)"); return (int64)-1; // XXX 未確認 } uint64 Write16(uint32 addr, uint32 data) override { @@ -313,7 +326,7 @@ class BusIO_WW: public T // ワードデバイスをロングワード先頭に配置し、他は非接続。 template -class BusIO_WF: public T +class BusIO_WF : public T { private: inline uint32 Decoder(uint32 addr) { @@ -341,7 +354,7 @@ class BusIO_WF: public T } uint64 Write8(uint32 addr, uint32 data) override { - PANIC("not implemented\n"); + VMPANIC("(NOT IMPLEMENTED)"); return 0; // XXX 未確認 } uint64 Write16(uint32 addr, uint32 data) override {