|
|
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:
1.1.1.2 ! root 32: busdata Read8(uint32 addr) override;
! 33: busdata Read16(uint32 addr) override;
! 34: busdata Write8(uint32 addr, uint32 data) override;
! 35: busdata Write16(uint32 addr, uint32 data) override;
! 36: busdata Peek8(uint32 addr) override;
1.1 root 37:
38: // Nereid が1枚でもささっていれば true。
39: bool IsInstalled() const;
40:
1.1.1.2 ! root 41: // Board デバイス取得。
! 42: NereidBoardDevice *GetBoard(int id) const { return boards[id].get(); }
! 43:
1.1 root 44: private:
45: inline uint32 Decoder(uint32 addr) const;
46: DECLARE_MONITOR_CALLBACK(MonitorUpdate);
47:
48: // ボードの有無と配置場所 (有りなら $3 か $b、無しなら -1)
49: std::array<int, 2> loc {};
50:
51: std::array<std::unique_ptr<NereidBoardDevice>, 2> boards {};
52:
53: Monitor monitor { this };
54: };
55:
56: // Nereid ボード1枚分
57: class NereidBoardDevice : public IODevice
58: {
59: using inherited = IODevice;
60:
61: public:
62: NereidBoardDevice(int n_);
63: ~NereidBoardDevice() override;
64:
65: bool Create() override;
66:
1.1.1.2 ! root 67: busdata Read8(uint32 addr) override;
! 68: busdata Read16(uint32 addr) override;
! 69: busdata Write8(uint32 addr, uint32 data) override;
! 70: busdata Write16(uint32 addr, uint32 data) override;
! 71: busdata Peek8(uint32 addr) override;
1.1 root 72:
73: // ネットワークが有効なら true を返す
74: bool IsNetEnable() const { return (bool)net; }
75: // バンクメモリの容量 [MB] を返す (負数の場合もあり)
76: int GetBankRAMSize() const { return ramsize_MB; }
77:
78: uint32 GetPage() const;
79:
80: private:
81: inline uint32 Decoder(uint32 addr) const;
82:
83: void SetPage(uint32 data);
84:
85: uint32 GetCtrl() const;
86: void SetCtrl(uint32 data);
87:
88: // 1枚目 or 2枚目
89: uint id {};
90:
91: // バンクメモリ容量 (負数あり)
92: int ramsize_MB {};
93:
94: // デバイス
95: std::unique_ptr<BankRAMDevice> bank /*{}*/;
96: std::unique_ptr<RTL8019ASDevice> net /*{}*/;
97: };
98:
99: static inline NereidDevice *GetNereidDevice() {
100: return Object::GetObject<NereidDevice>(OBJ_NEREID);
101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.