20 #define ICW1_ICW4 0x01
22 #define MODE_8086 0x01
24 static uint16_t readregister(uint8_t ocw3) {
27 return inport8(MCMD) | inport8(SCMD) << 8;
30 static uint16_t readirr() {
31 return readregister(IRR);
34 static uint16_t readisr() {
35 return readregister(ISR);
38 static void reprogram() {
39 outport8(MCMD, CMD_INIT | ICW1_ICW4);
40 outport8(SCMD, CMD_INIT | ICW1_ICW4);
41 outport8(MDATA, IRQ0);
42 outport8(SDATA, IRQ8);
43 outport8(MDATA, 0x04); /* Slave PIC at IRQ2 */
44 outport8(SDATA, 0x02); /* Cascade Identity */
45 outport8(MDATA, MODE_8086);
46 outport8(SDATA, MODE_8086);
52 static void deprogram() {
53 outport8(MCMD, CMD_INIT | ICW1_ICW4);
54 outport8(SCMD, CMD_INIT | ICW1_ICW4);
55 outport8(MDATA, 0x08);
56 outport8(SDATA, 0x70);
57 outport8(MDATA, 0x04); /* Slave PIC at IRQ2 */
58 outport8(SDATA, 0x02); /* Cascade Identity */
59 outport8(MDATA, MODE_8086);
60 outport8(SDATA, MODE_8086);
65 static void sendmastereoi() {
69 static void sendslaveeoi() {
73 static void sendeoi(unsigned int irq) {
84 pic.mastereoi = sendmastereoi;
85 pic.readirr = readirr;
86 pic.readisr = readisr;
87 pic.reprogram = reprogram;
88 pic.deprogram = deprogram;