|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #pragma once
7:
8: #include "device.h"
9: #include "scheduler.h"
10:
11: // Intel 82C55 の仕様書にはコントロールポートからの読み出しは明記してある。
12: // NEC uPD8255 の仕様書にはコントロールポートからの読み出しについての記載が
13: // ない (禁止とも書いてない)。
14: class i8255Device
15: : public IODevice
16: {
17: typedef IODevice inherited;
18:
19: public:
20: i8255Device();
21: virtual ~i8255Device();
22:
23: protected:
24: // コントロールポートの読み出し
25: uint32 ReadCtrl() const { return ctrl; }
26: // コントロールポートへの書き込み
27: void WriteCtrl(uint32);
28: // PortC への個別書き込み
29: virtual void SetPC(int, int);
30:
31: // 7 6 5 4 3 2 1 0
32: // 1 AM AM AD CHD BM BD CLD
33: // | | | | | | +--- ポートC下位グループの方向。入力なら1
34: // | | | | | +------ ポートB の方向。入力なら1
35: // | | | | +--------- ポートB のモード。
36: // | | | +------------- ポートC上位グループの方向。入力なら1
37: // | | +---------------- ポートA の方向。入力なら1
38: // +--+------------------- ポートA のモード。
39: uint8 ctrl = 0; // コントロールポートの値
40:
41: static const uint DIR_IN = 1;
42: static const uint DIR_OUT = 0;
43: // グループA/B (ポートA/B) のモード
44: uint GetGroupAMode() const { return (ctrl >> 5) & 3; }
45: uint GetGroupBMode() const { return (ctrl >> 2) & 1; }
46: // ポート A/B/C上位/C下位 の入出力方向
47: uint PortADir() const { return (ctrl & 0x10) ? DIR_IN : DIR_OUT; }
48: uint PortBDir() const { return (ctrl & 0x02) ? DIR_IN : DIR_OUT; }
49: uint PortCHDir() const { return (ctrl & 0x08) ? DIR_IN : DIR_OUT; }
50: uint PortCLDir() const { return (ctrl & 0x01) ? DIR_IN : DIR_OUT; }
51: };
52:
53:
54: class PPIDevice
55: : public i8255Device
56: {
57: typedef i8255Device inherited;
58: private:
59: static const int baseaddr = 0xe9a000;
60:
61: public:
62: PPIDevice();
63: virtual ~PPIDevice();
64:
65: protected:
66: // BusIO インタフェース
67: static const uint32 NPORT = 4;
68: uint64 Read(uint32 addr);
69: uint64 Write(uint32 addr, uint32 data);
70: uint64 Peek(uint32 addr);
71: };
72:
73: class PIO0Device
74: : public i8255Device
75: {
76: typedef i8255Device inherited;
77: public:
78: PIO0Device();
79: virtual ~PIO0Device();
80:
81: virtual bool Init();
82:
83: // DIP-SW1 の状態を取得 (ROM エミュレーション用)
84: //
85: // b7 b6 b5 b4 b3 b2 b1 b0
86: // +------+------+------+------+------+------+------+------+
87: // | #1-8 | #1-7 | #1-6 | #1-5 | #1-4 | #1-3 | #1-2 | #1-1 |
88: // +------+------+------+------+------+------+------+------+
89: // %1 が UP、%0 が DOWN
90: uint32 GetDIPSW1() const { return GetPA(); }
91:
92: protected:
93: // BusIO インタフェース
94: static const uint32 NPORT = 4;
95: uint64 Read(uint32 addr);
96: uint64 Write(uint32 addr, uint32 data);
97: uint64 Peek(uint32 addr);
98:
99: private:
100: uint32 GetPA() const;
101: uint32 GetPB() const;
102: uint32 GetPC() const;
103: virtual void SetPC(int, int);
104:
105: bool dipsw1[8] {};
106: bool dipsw2[8] {};
107: bool int1rq = false; // $01 INT1 割り込み要求
108: bool int1en = false; // $04 INT1 割り込み許可
109: bool int5rq = false; // $08 INT5 割り込み要求
110: bool int5en = false; // $10 INT5 割り込み許可
111: bool parity = false; // $40 パリティ有効/無効
112: bool xp_reset = false; // $80 XP リセット
113: };
114:
115: class PIO1Device
116: : public i8255Device
117: {
118: typedef i8255Device inherited;
119: public:
120: PIO1Device();
121: virtual ~PIO1Device();
122:
123: protected:
124: // BusIO インタフェース
125: static const uint32 NPORT = 4;
126: uint64 Read(uint32 addr);
127: uint64 Write(uint32 addr, uint32 data);
128: uint64 Peek(uint32 addr);
129:
130: private:
131: virtual void SetPC(int, int);
132: void PowerOffCallback(int);
133:
134: bool power = false; // パワーダウン (false で電源オフ指示)
135: bool xp_intreq = false; // XP 割り込み要求。あり(true)なら %0
136: Event poffevent {}; // 電源オフイベント
137: };
138:
139: extern std::unique_ptr<PIO0Device> gPIO0;
140: extern std::unique_ptr<PIO1Device> gPIO1;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.