|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: #pragma once
8:
9: #include "device.h"
10: #include "interrupt.h"
11:
12: class PEDECDevice
13: : public InterruptDevice
14: {
15: using inherited = InterruptDevice;
16: private:
17: static const int baseaddr = 0xe9c000;
18:
19: public:
20: PEDECDevice();
21: virtual ~PEDECDevice() override;
22:
23: void ResetHard() override;
24:
25: // InterruptDevice インタフェース
26: void AssertINT(Device *source) override;
27: void NegateINT(Device *source) override;
28: int InterruptAcknowledge(int lv) override;
29:
30: protected:
31: // BusIO インタフェース
32: static const uint32 NPORT = 8;
33: uint64 Read(uint32 addr);
34: uint64 Write(uint32 addr, uint32 data);
35: uint64 Peek(uint32 addr);
36:
37: private:
38: // 割り込みステータスレジスタの値を取得
39: uint32 GetStat() const;
40:
41: // 割り込み信号線の状態を変える
42: void ChangeInterrupt();
43:
44: // int_asserted が下位デバイスからの割り込み信号線 (%1 でアサート)。
45: // int_enabled がマスク (%1 なら割り込み許可)。
46: // よって二者を AND とれば上位に割り込みを上げるかどうかが求まる。
47: // SPC からの割り込みはここでマスク制御しないので int_enabled には
48: // IntmapSPC を常に立てておくこと。
49: // $e9c001 (割り込みステータスレジスタ) のビット順は
50: // これとは全然違うので注意のこと。
51: static const uint32 IntmapSPC = 0x10;
52: static const uint32 IntmapFDC = 0x08;
53: static const uint32 IntmapFDD = 0x04;
54: static const uint32 IntmapHDD = 0x02;
55: static const uint32 IntmapPRT = 0x01;
56:
57: uint32 int_asserted {};
58: uint32 int_enabled {};
59: uint8 vector {};
60: };
61:
62: extern std::unique_ptr<PEDECDevice> gPEDEC;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.