+; 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