Ref: www.jamesmolloy.co.uk https://wiki.osdev.org/8259_PIC / http://www.brokenthorn.com/Resources/OSDevPic.html

The IBM PC 8259 PIC Architecture
In the beginning (IBM PC and XT), only a single 8259 PIC chip was used, which provided 8 IRQs to the system. These were traditionally mapped by the BIOS to interrupts 8 to 15 (0x08 to 0x0F). It is unlikely that any of these single-PIC machines will be encountered these days.
The IBM PC/AT 8259 PIC Architecture
The IBM PC/AT extended the PC architecture by adding a second 8259 PIC chip. This was possible due to the 8259A’s ability to cascade interrupts, that is, have them flow through one chip and into another. This gives a total of 15 interrupts. Why 15 and not 16? That’s because when you cascade chips, the PIC needs to use one of the interrupt lines to signal the other chip.
The low-level concepts behind external interrupts are not very complex. All devices that are interrupt-capable have a line connecting them to the PIC (programmable interrupt controller). The PIC is the only device that is directly connected to the CPU’s interrupt pin. It is used as a multiplexer, and has the ability to prioritize between interrupting devices. It is, essentially, a glorified 8-1 multiplexer. At some point, someone somewhere realized that 8 IRQ lines just wasn’t enough, and they daisy-chained another 8-1 PIC beside the original. So in all modern PCs, you have 2 PICs, the master and the slave, serving a total of 15 interruptable devices (one line is used to signal the slave PIC).
Only hardware interrupts are handled through the Programmable Interrupt Controller. The special, CPU-dedicated interrupts are shown below.
0 – Division by zero exception
1 – Debug exception
2 – Non maskable interrupt
3 – Break-point exception
4 – ‘Into detected overflow’
5 – Out of bounds exception
6 – Invalid opcode exception
7 – No co-processor exception
8 – Double fault (pushes an error code)
9 – Co-processor segment overrun
10 – Bad TSS (pushes an error code)
11 – Segment not present (pushes an error code)
12 – Stack fault (pushes an error code)
13 – General protection fault (pushes an error code)
14 – Page fault (pushes an error code)
15 – Unknown interrupt exception
16 – Co-processor fault
17 – Alignment check exception
18 – Machine check exception
19-31 – Reserved
See: Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide – 6.3.1 External Interrupts
WR Pin: This pin connects to a write strobe signal (One of 8 on a Pentium)
RD Pin: This connects to the IOCR (Input Output Control Routine) signal.
INT Pin: Connects to the INTR pin on the microprocessor.
INTA Pin: Connects to the INTA pin on the microprocessor.
A0 Pin: Selects different Command WORDS
CS Pin: Enables the chip for programming and control.
SP/EN Pin: Slave program (SP) / Enable Buffer (EN).
Slave Program (1=Master, 0=Slave)
Enable Buffer (Controls data bus transievers when in buffered mode)
CAS0, CAS1, CAS2 Pins: Used to output from master to slave PIC controllers in cascaded systems.
D0 – D7 Pins: 8 bit Data connector pins.
x86 Hardware Interrupts | ||
---|---|---|
8259A Input pin | Interrupt Number | Description |
IRQ0 | 0x08 | Timer |
IRQ1 | 0x09 | Keyboard |
IRQ2 | 0x0A | Cascade for 8259A Slave controller |
IRQ3 | 0x0B | Serial port 2 |
IRQ4 | 0x0C | Serial port 1 |
IRQ5 | 0x0D | AT systems: Parallel Port 2. PS/2 systems: reserved |
IRQ6 | 0x0E | Diskette drive |
IRQ7 | 0x0F | Parallel Port 1 |
IRQ8/IRQ0 | 0x70 | CMOS Real time clock |
IRQ9/IRQ1 | 0x71 | CGA vertical retrace |
IRQ10/IRQ2 | 0x72 | Reserved |
IRQ11/IRQ3 | 0x73 | Reserved |
IRQ12/IRQ4 | 0x74 | AT systems: reserved. PS/2: auxiliary device |
IRQ13/IRQ5 | 0x75 | FPU |
IRQ14/IRQ6 | 0x76 | Hard disk controller |
IRQ15/IRQ7 | 0x77 | Reserved |
8259A Registers
- Command Register – This is a write only register that is used to send commands to the microcontroller.
- Status register – This is a read only register that can be accessed to determin the status of the PIC.
- Interrupt Request Register (IRR) – This register specifies which interrupts are pending acknowledgment. Note: This register is internal, and cannot be accessed directly.
- In-Sevice Register (ISR) – This register specifies which interrupts have already been acknowledged, but are awaiting for the End of Interrupt (EOI) signal.
- Interrupt Mask Register (IMR) – This specifies what interrupts are to be ignored, and not acknowledged.
Programming with the 8259 PIC
When the computer boots, the default interrupt mappings are:
IRQ 0..7 – INT 0x8..0xF
IRQ 8..15 – INT 0x70..0x77
Each chip (master and slave) has a command port and a data port (given in the table below). When no command is issued, the data port allows us to access the interrupt mask of the 8259 PIC.
Chip – Purpose | I/O port |
Master PIC -Command | 0x0020 |
Master PIC – Data | 0x0021 |
Slave PIC -Command | 0x00A0 |
Slave PIC – Data | 0x00A1 |