X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=ld45_start_nothing;a=blobdiff_plain;f=src%2Fintr.asm;fp=src%2Fintr.asm;h=1bbf3197e6e470a5714485fa55c50665cc0d483c;hp=0000000000000000000000000000000000000000;hb=6bbbb04131204b22367677209d7de8c3f906d0e2;hpb=8a43487117b23806e478603f3c8ab72e37cd1882 diff --git a/src/intr.asm b/src/intr.asm new file mode 100644 index 0000000..1bbf319 --- /dev/null +++ b/src/intr.asm @@ -0,0 +1,60 @@ +; 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