65 lines
1.1 KiB
ArmAsm
65 lines
1.1 KiB
ArmAsm
#include "drivers/pic/pic.h"
|
|
|
|
.code32
|
|
.extern io_wait
|
|
|
|
.global init_pic
|
|
init_pic:
|
|
# init command
|
|
mov $0x11, %al
|
|
outb %al, $PIC1_COMMAND
|
|
outb %al, $PIC2_COMMAND
|
|
|
|
# vector offsets
|
|
mov $0x20, %al
|
|
outb %al, $PIC1_DATA
|
|
mov $0x28, %al
|
|
outb %al, $PIC2_DATA
|
|
|
|
# cascade
|
|
mov $0x04, %al
|
|
outb %al, $PIC1_DATA
|
|
mov $0x02, %al
|
|
outb %al, $PIC2_DATA
|
|
|
|
# env
|
|
mov $0x01, %al
|
|
outb %al, $PIC1_DATA
|
|
outb %al, $PIC2_DATA
|
|
|
|
# mask
|
|
mov $0xF8, %al
|
|
outb %al, $PIC1_DATA
|
|
mov $0x3F, %al
|
|
outb %al, $PIC2_DATA
|
|
|
|
ret
|
|
|
|
.global send_eoi_master
|
|
send_eoi_master:
|
|
mov $0x20, %al
|
|
outb %al, $PIC1_COMMAND
|
|
ret
|
|
|
|
.global send_eoi_slave
|
|
send_eoi_slave:
|
|
mov $0x20, %al
|
|
outb %al, $PIC2_COMMAND
|
|
call send_eoi_master
|
|
ret
|
|
|
|
.global read_isr_master
|
|
read_isr_master:
|
|
xorl %eax, %eax
|
|
mov $0x0B, %al
|
|
outb %al, $PIC1_COMMAND
|
|
in $PIC1_COMMAND, %al
|
|
ret
|
|
|
|
.global read_isr_slave
|
|
read_isr_slave:
|
|
xorl %eax, %eax
|
|
mov $0x0B, %al
|
|
outb %al, $PIC2_COMMAND
|
|
in $PIC2_COMMAND, %al
|
|
ret |