OOStuBS - Technische Informatik II (TI-II)  2.4
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 
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 }