OOStuBS - Technische Informatik II (TI-II)
2.4
Hauptseite
Zusätzliche Informationen
Klassen
Dateien
Auflistung der Dateien
Datei-Elemente
src
machine
pic.cc
gehe zur Dokumentation dieser Datei
1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
2
* Technische Informatik II *
3
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
4
* *
5
* P I C *
6
* *
7
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
8
9
/* * * * * * * * * * * * * * * * * * * * * * * * *\
10
# INCLUDES #
11
\* * * * * * * * * * * * * * * * * * * * * * * * */
12
#include "
machine/pic.h
"
13
#include "
machine/io_port.h
"
14
#include "
object/cpu.h
"
15
16
17
/* * * * * * * * * * * * * * * * * * * * * * * * *\
18
# METHODS #
19
\* * * * * * * * * * * * * * * * * * * * * * * * */
20
21
PIC::PIC
() : ctrl_1(0x20), ctrl_2(0xa0), mask_1(0x21), mask_2(0xa1){
22
23
ctrl_1
.
outb
(0x11);
//Initialisierung + ICW4 kommt
24
ctrl_2
.
outb
(0x11);
25
26
mask_1
.
outb
(32);
//Start Interrupt Nummer (IRC 0)
27
mask_2
.
outb
(40);
28
29
mask_1
.
outb
(4);
//IRQs, auf denen Slave gemappt sind; Bitmaske
30
mask_2
.
outb
(2);
//IRQ, an dem Slave an Master geht; Zahl
31
32
mask_1
.
outb
(3);
//0.Bit -> "für PC"; 1. Bit automatisches Ack
33
mask_2
.
outb
(3);
34
35
mask_1
.
outb
(0xFB);
// Bitmaske, alle aus, außer IRQ2 (Slave)
36
mask_2
.
outb
(0xFF);
37
38
}
39
40
PIC::~PIC
(){
41
mask_1
.
outb
(0xFF);
42
mask_2
.
outb
(0xFF);
43
}
44
45
void
PIC::allow
(
Interrupts
interrupt){
46
if
(interrupt>=
timer
&& interrupt<=
parallelport
&& interrupt!=
pic2
){
47
//von PIC1 Maske holen
48
unsigned
char
mask1 =
mask_1
.
inb
();
49
//Bit aendern
50
mask1 &= ~(1 << (interrupt-
timer
));
51
//zurückschreiben
52
mask_1
.
outb
(mask1);
53
}
54
55
if
(interrupt>=
rtc
&& interrupt<=
ata2
){
56
//von PIC2 Maske holen
57
unsigned
char
mask2 =
mask_2
.
inb
();
58
//Bit aendern
59
mask2 &= ~(1 << (interrupt-
rtc
));
60
//zurückschreiben
61
mask_2
.
outb
(mask2);
62
}
63
}
64
65
void
PIC::forbid
(
Interrupts
interrupt){
66
if
(interrupt>=
timer
&& interrupt<=
parallelport
&& interrupt!=
pic2
){
67
//von PIC1 Maske holen
68
unsigned
char
mask1 =
mask_1
.
inb
();
69
//Bit aendern
70
mask1 |= 1 << (interrupt-
timer
);
71
//zurückschreiben
72
mask_1
.
outb
(mask1);
73
}
74
75
if
(interrupt>=
rtc
&& interrupt<=
ata2
){
76
//von PIC2 Maske holen
77
unsigned
char
mask2 =
mask_2
.
inb
();
78
//Bit aendern
79
mask2 |= 1 << (interrupt-
rtc
);
80
//zurückschreiben
81
mask_2
.
outb
(mask2);
82
}
83
}
84
85
void
PIC::ack
(
Interrupts
interrupt){
86
//falls PIC2 dann beide
87
if
(interrupt>=
rtc
&& interrupt<=
ata2
){
88
ctrl_2
.
outb
(0x20);
89
ctrl_1
.
outb
(0x20);
90
}
91
if
(interrupt>=
timer
&& interrupt<=
parallelport
&& interrupt!=
pic2
)
92
ctrl_1
.
outb
(0x20);
93
}
Erzeugt am Mon Jun 30 2014 07:13:28 für OOStuBS - Technische Informatik II (TI-II) von
1.8.1.2