blob: 9739e059ef9831635ac9762b04c504a88119af4d (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#ifndef PIC_H
#define PIC_H
#include "../idt/Idt.h"
#include "../port/Operations"
#include "IPic.h"
#include <ISingleton.h>
class ICW1 : public ICW
{
private:
uint8 word;
public:
// Const part of ICW1 is high byte
const static uint8 byteHigh = 0x10;
// Inittialize bit and ICW4 recieve bit
const static uint8 wordDefault = byteHigh | 0x01;
ICW1();
ICW1(const uint8 icw);
bool isExpectIcw4();
virtual const uint8 toByteMasterPic() const override final;
virtual const uint8 toByteSlavePic() const override final;
virtual const uint8 getNumber() const override final;
};
class ICW2 : public ICW
{
private:
uint8 lvtAddr;
public:
ICW2();
ICW2(const uint8 icw);
virtual const uint8 toByteMasterPic() const override final;
virtual const uint8 toByteSlavePic() const override final;
virtual const uint8 getNumber() const override final;
};
class ICW3 : public ICW
{
private:
const static uint8 irqTwoLine = 0x4;
const static uint8 irqTwoLineBinary = 0x2;
uint8 irqConnPrimaryPic;
uint8 irqConnSecondaryPic;
public:
ICW3();
ICW3(const uint8 icwMaster);
virtual const uint8 toByteMasterPic() const override final;
virtual const uint8 toByteSlavePic() const override final;
virtual const uint8 getNumber() const override final;
};
class ICW4 : public ICW
{
private:
static const uint8 defaultWord = 0x01;
uint8 word;
public:
ICW4();
ICW4(const uint8 icw);
virtual const uint8 toByteMasterPic() const override final;
virtual const uint8 toByteSlavePic() const override final;
virtual const uint8 getNumber() const override final;
};
class Pic
{
protected:
static const uint8 numberWords = 4;
static const uint8 readIrr = 0xa;
static const uint8 readIsr = 0xb;
static const uint8 eoiCommand = 0x20;
private:
ICW1 icw1;
ICW2 icw2;
ICW3 icw3;
ICW4 icw4;
bool isIcwsCorrect(const ICW *icws[numberWords]);
protected:
Pic();
Pic(const ICW *icws[numberWords]);
Pic(const Pic &) = default;
public:
static const uint8 numberIrq = 16;
// Valid equals from 0 to 7 and from 8 to 15
// Return true if ISR not set, false is success
bool enableIrq(uint8 irqNumber);
void disableIrq(uint8 irqNumber);
static uint8 getIsrMaster();
static uint8 getIsrSlave();
static uint8 getIrrMaster();
static void sendEoi();
// Set IMR to -xff
static void disable();
};
// Be more careful with instance of Pic.
// When SingletonPic instance been deleted, Pic instance not be more exist
class SingletonPic : public Pic, public ISingleton<Pic>
{
private:
static bool isEntityAfter;
bool isEntityFirst;
public:
SingletonPic();
SingletonPic(const ICW *icws[numberWords]);
virtual Pic *getInstance() override final;
};
#endif
|