--- nono/vm/busio.h 2026/04/29 17:04:35 1.1.1.2 +++ nono/vm/busio.h 2026/04/29 17:05:17 1.1.1.7 @@ -7,15 +7,17 @@ // バスとデバイスとのインタフェース。 // バスに対し、デバイスがどのように接続されているかを記述する。 +#pragma once + #if !defined(SELFTEST) #include "device.h" #endif // バイトデバイスをバイト、ワード、ロングワードポートにミラー配置する共通部 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); } @@ -32,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) { @@ -91,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) { @@ -137,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) { @@ -178,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) { @@ -219,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); } @@ -270,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) { @@ -293,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 { @@ -311,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) { @@ -339,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 {