|
|
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.