|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2022 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // XP プロセッサの物理バス
9: //
10:
11: #pragma once
12:
13: #include "device.h"
14: #include <array>
15:
16: class SubRAM2Device;
17: class XPRAMDevice;
18:
19: // XP 外部バス
20: class XPbusDevice : public IOContainerDevice
21: {
22: using inherited = IOContainerDevice;
23: public:
24: XPbusDevice();
25: ~XPbusDevice() override;
26:
27: bool Init() override;
28: void ResetHard(bool poweron) override;
29:
30: // addr はそれぞれアラインされていること。
31: uint64 Read8(uint32 addr) override;
32: uint64 Read16(uint32 addr) override;
33: uint64 Read32(uint32 addr) override;
34: uint64 Write8(uint32 addr, uint32 data) override;
35: uint64 Write16(uint32 addr, uint32 data) override;
36: uint64 Write32(uint32 addr, uint32 data) override;
37: uint64 Peek8(uint32 addr) override;
38:
39: // RAM Control Register (RMCR) を設定/取得
40: uint32 GetRMCR() const;
41: void SetRMCR(uint32);
42: // 内蔵 RAM の先頭番地を取得 (モニタ用)
43: uint32 GetXPRAMAddr() const { return ram_addr; }
44:
45: protected:
46: IODevice *GetDevice(uint32 addr) const override;
47:
48: private:
49: inline IODevice *SearchDevice(uint32 addr) const;
50:
51: // 3port RAM (非共有部)
52: std::unique_ptr<SubRAM2Device> pSubRAM2 /*{}*/;
53: // XP 内蔵 512 バイト RAM
54: std::unique_ptr<XPRAMDevice> pXPRAM /*{}*/;
55:
56: // XP 内蔵 512 バイト RAM の位置
57: uint32 ram_addr {};
58:
59: IODevice *subram {}; // 共有 SRAM
60: IODevice *nopio {};
61: };
62:
63: // XP 内蔵 RAM
64: class XPRAMDevice : public IODevice
65: {
66: using inherited = IODevice;
67: public:
68: XPRAMDevice();
69: ~XPRAMDevice() override;
70:
71: uint64 Read8(uint32 addr) override;
72: uint64 Read16(uint32 addr) override;
73: uint64 Read32(uint32 addr) override;
74: uint64 Write8(uint32 addr, uint32 data) override;
75: uint64 Write16(uint32 addr, uint32 data) override;
76: uint64 Write32(uint32 addr, uint32 data) override;
77: uint64 Peek8(uint32 addr) override;
78: uint64 Poke8(uint32 addr, uint32 data) override;
79:
80: private:
81: std::array<uint8, 512> ram {};
82: };
83:
84: static inline XPbusDevice *GetXPbusDevice() {
85: return Object::GetObject<XPbusDevice>(OBJ_XPBUS);
86: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.