|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2023 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // Nereid Ethernet/メモリ/USB 複合ボード (のうち Ethernet/バンクメモリ) ! 9: // ! 10: ! 11: #pragma once ! 12: ! 13: #include "device.h" ! 14: #include "monitor.h" ! 15: #include <array> ! 16: ! 17: class BankRAMDevice; ! 18: class NereidBoardDevice; ! 19: class RTL8019ASDevice; ! 20: ! 21: // Nereid 空間担当 ! 22: class NereidDevice : public IODevice ! 23: { ! 24: using inherited = IODevice; ! 25: ! 26: public: ! 27: NereidDevice(); ! 28: ~NereidDevice() override; ! 29: ! 30: bool Create() override; ! 31: ! 32: uint64 Read8(uint32 addr) override; ! 33: uint64 Read16(uint32 addr) override; ! 34: uint64 Write8(uint32 addr, uint32 data) override; ! 35: uint64 Write16(uint32 addr, uint32 data) override; ! 36: uint64 Peek8(uint32 addr) override; ! 37: ! 38: // Nereid が1枚でもささっていれば true。 ! 39: bool IsInstalled() const; ! 40: ! 41: private: ! 42: inline uint32 Decoder(uint32 addr) const; ! 43: DECLARE_MONITOR_CALLBACK(MonitorUpdate); ! 44: ! 45: // ボードの有無と配置場所 (有りなら $3 か $b、無しなら -1) ! 46: std::array<int, 2> loc {}; ! 47: ! 48: std::array<std::unique_ptr<NereidBoardDevice>, 2> boards {}; ! 49: ! 50: Monitor monitor { this }; ! 51: }; ! 52: ! 53: // Nereid ボード1枚分 ! 54: class NereidBoardDevice : public IODevice ! 55: { ! 56: using inherited = IODevice; ! 57: ! 58: public: ! 59: NereidBoardDevice(int n_); ! 60: ~NereidBoardDevice() override; ! 61: ! 62: bool Create() override; ! 63: ! 64: uint64 Read8(uint32 addr) override; ! 65: uint64 Read16(uint32 addr) override; ! 66: uint64 Write8(uint32 addr, uint32 data) override; ! 67: uint64 Write16(uint32 addr, uint32 data) override; ! 68: uint64 Peek8(uint32 addr) override; ! 69: ! 70: // ネットワークが有効なら true を返す ! 71: bool IsNetEnable() const { return (bool)net; } ! 72: // バンクメモリの容量 [MB] を返す (負数の場合もあり) ! 73: int GetBankRAMSize() const { return ramsize_MB; } ! 74: ! 75: uint32 GetPage() const; ! 76: ! 77: private: ! 78: inline uint32 Decoder(uint32 addr) const; ! 79: ! 80: void SetPage(uint32 data); ! 81: ! 82: uint32 GetCtrl() const; ! 83: void SetCtrl(uint32 data); ! 84: ! 85: // 1枚目 or 2枚目 ! 86: uint id {}; ! 87: ! 88: // バンクメモリ容量 (負数あり) ! 89: int ramsize_MB {}; ! 90: ! 91: // デバイス ! 92: std::unique_ptr<BankRAMDevice> bank /*{}*/; ! 93: std::unique_ptr<RTL8019ASDevice> net /*{}*/; ! 94: }; ! 95: ! 96: static inline NereidDevice *GetNereidDevice() { ! 97: return Object::GetObject<NereidDevice>(OBJ_NEREID); ! 98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.