summaryrefslogtreecommitdiff
path: root/asm/asm_pic.asm
diff options
context:
space:
mode:
Diffstat (limited to 'asm/asm_pic.asm')
-rw-r--r--asm/asm_pic.asm84
1 files changed, 84 insertions, 0 deletions
diff --git a/asm/asm_pic.asm b/asm/asm_pic.asm
new file mode 100644
index 0000000..901f854
--- /dev/null
+++ b/asm/asm_pic.asm
@@ -0,0 +1,84 @@
+;************************************************************************
+; Map the 8259A PIC to use interrupts 32-47 within our interrupt table
+;************************************************************************
+
+[bits 32]
+
+global asm_pic_setup
+
+%define ICW_1 0x11 ; 00010001 binary. Enables initialization mode and we are sending ICW 4
+
+%define PIC_1_CTRL 0x20 ; Primary PIC control register
+%define PIC_2_CTRL 0xA0 ; Secondary PIC control register
+
+%define PIC_1_DATA 0x21 ; Primary PIC data register
+%define PIC_2_DATA 0xA1 ; Secondary PIC data register
+
+%define IRQ_0 0x20 ; IRQs 0-7 mapped to use interrupts 0x20-0x27
+%define IRQ_8 0x28 ; IRQs 8-15 mapped to use interrupts 0x28-0x36
+
+asm_pic_setup:
+
+; Send ICW 1 - Begin initialization -------------------------
+
+ ; Setup to initialize the primary PIC. Send ICW 1
+
+ mov al, ICW_1
+ out PIC_1_CTRL, al
+
+; Send ICW 2 - Map IRQ base interrupt numbers ---------------
+
+ ; Remember that we have 2 PICs. Because we are cascading with this second PIC, send ICW 1 to second PIC command register
+
+ out PIC_2_CTRL, al
+
+ ; send ICW 2 to primary PIC
+
+ mov al, IRQ_0
+ out PIC_1_DATA, al
+
+ ; send ICW 2 to secondary controller
+
+ mov al, IRQ_8
+ out PIC_2_DATA, al
+
+; Send ICW 3 - Set the IR line to connect both PICs ---------
+
+ ; Send ICW 3 to primary PIC
+
+ mov al, 0x4 ; 0x04 => 0100, second bit (IR line 2)
+ out PIC_1_DATA, al ; write to data register of primary PIC
+
+ ; Send ICW 3 to secondary PIC
+
+ mov al, 0x2 ; 010=> IR line 2
+ out PIC_2_DATA, al ; write to data register of secondary PIC
+
+; Send ICW 4 - Set x86 mode --------------------------------
+
+ mov al, 1 ; bit 0 enables 80x86 mode
+
+ ; send ICW 4 to both primary and secondary PICs
+
+ out PIC_1_DATA, al
+ out PIC_2_DATA, al
+
+; All done. Null out the data registers
+
+ mov al, 0
+ out PIC_1_DATA, al
+ out PIC_2_DATA, al
+
+ ;mask
+in al, 0x21 ; read in the primary PIC Interrupt Mask Register (IMR)
+and al, 0x00 ; 0xEF => 11101111b. This sets the IRQ4 bit (Bit 5) in AL
+out 0x21, al ; write the value back into IMR
+
+
+in al, 0xA1 ; read in the primary PIC Interrupt Mask Register (IMR)
+and al, 0x00 ; 0xEF => 11101111b. This sets the IRQ4 bit (Bit 5) in AL
+out 0xA1, al ; write the value back into IMR
+
+ret
+
+;;;;;;;;;;;;;;;;;;;;