dd 0000ffffh
dd 00cf9200h
+ global idt
align 8
idt: times 104 db 0
; trap gate 13: general protection fault
; vi:filetype=nasm ts=8 sts=8 sw=8:
-;
-; list of functions
-; -----------------
-; init_gfx
-; initializes the video hardware and graphics routines
-; clear
-; clears the framebuffer (not vmem)
-; clobbers: eax, ecx, edi
-; swap_buffers
-; copies the framebuffer to video memory
-; clobbers: eax, ecx, edi, esi
-; wait_vsync
-; clobbers: al, dx
-; set_palette_entry(idx[al], r[ah], g[bl], b[bh])
-; colors are 0-255
bits 32
section .text
--- /dev/null
+; 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
--- /dev/null
+; vi:filetype=nasm ts=8 sts=8 sw=8:
+
+%define IRQ_OFFSET 32
+%define IRQ_TO_INTR(x) ((x) + IRQ_OFFSET)
+%define INTR_TO_IRQ(x) ((x) - IRQ_OFFSET)
+
+%macro set_irq_vector 2
+ push dword IRQ_TO_INTR(%1)
+ push dword %2
+ call set_intr
+%endmacro
+
+%macro mask_irq 1
+%if %1 < 8
+%assign port PIC1_DATA
+%assign mask (1 << %1)
+%else
+%assign port PIC2_DATA
+%assign mask (1 << (%1 - 8))
+%endif
+ in al, port
+ or al, mask
+ out port, al
+%endmacro
+
+%macro unmask_irq 1
+%if %1 < 8
+%assign port PIC1_DATA
+%assign mask ~(1 << %1)
+%else
+%assign port PIC2_DATA
+%assign mask ~(1 << (%1 - 8))
+%endif
+ in al, port
+ and al, mask
+ out port, al
+%endmacro
+
+%macro end_of_irq 1
+ mov al, OCW2_EOI
+%if %1 >= 8
+ out PIC2_CMD, al
+%endif
+ out PIC1_CMD, al
+%endmacro
--- /dev/null
+; vi:filetype=nasm ts=8 sts=8 sw=8:
+
+ global kb_init
+kb_init:
+