; vi:filetype=nasm ts=8 sts=8 sw=8: section .text %include "intr.inc" global init_intr init_intr: call init_pic ret global set_intr set_intr: ret PIC1_CMD equ 20h PIC1_DATA equ 21h PIC2_CMD equ 0a0h PIC2_DATA equ 0a1h ; PIC initialization command word 1 bits ICW1_ICW4_NEEDED equ 01h ICW1_SINGLE equ 02h ICW1_INTERVAL4 equ 04h ICW1_LEVEL equ 08h ICW1_INIT equ 10h ; PIC initialization command word 4 bits ICW4_8086 equ 01h ICW4_AUTO_EOI equ 02h ICW4_BUF_SLAVE equ 08h ICW4_BUF_MASTER equ 0ch ICW4_SPECIAL equ 10h ; PIC operation command word 2 bits OCW2_EOI equ 20h init_pic: ; send ICW1 saying we'll follow with ICW4 later on mov al, ICW1_INIT | ICW1_ICW4_NEEDED out PIC1_CMD, al out PIC2_CMD, al ; send ICW2 with IRQ remapping mov al, IRQ_OFFSET out PIC1_DATA, al add al, 8 out PIC2_DATA, al ; send ICW3 to setup the master/slave relationship ; ... set bit3 = 3rd interrupt input has a slave mov al, 4 out PIC1_DATA, al ; ... set slave ID to 2 mov al, 2 out PIC2_DATA, al ; send ICW4 to set 8086 mode (no calls generated) mov al, ICW4_8086 out PIC1_DATA, al out PIC2_DATA, al ; done, reset the data port to 0 xor al, al out PIC1_DATA, al out PIC2_DATA, al ret