StupidOS/kernel/pic.s

115 lines
1.7 KiB
ArmAsm
Raw Normal View History

2023-06-05 08:03:05 +00:00
; file: pic.s
2023-07-02 14:47:18 +00:00
; <Datasheet at https://pdos.csail.mit.edu/6.828/2005/readings/hardware/8259A.pdf>
2023-01-17 10:35:11 +00:00
[BITS 32]
2023-01-17 14:36:21 +00:00
2023-07-02 14:47:18 +00:00
PIC1_INT_START equ 0x20
PIC2_INT_START equ 0x28
PIC_INT_END equ PIC2_INT_START + 7
2023-01-17 14:36:21 +00:00
PIC1_CMD equ 0x20
PIC1_DATA equ 0x21
PIC2_CMD equ 0xA0
PIC2_DATA equ 0xA1
2023-07-02 14:47:18 +00:00
; Initialization Command Words (ICWs)
ICW1_INIT equ 1 << 4
ICW1_ICW4 equ 1 << 0
ICW1_SINGLE equ 1 << 1
ICW1_INTERVAL4 equ 1 << 2
ICW1_LVL_MODE equ 1 << 3
ICW4_8086_MODE equ 1 << 0
ICW4_AUTO_EOI equ 1 << 1
ICW4_BUF_SLAVE equ 1 << 3
ICW4_BUF_MASTER equ 1 << 3 | 1 << 2
ICW4_SFNM equ 1 << 4
; Operation Command Words (OWCs)
OCW2_EOI equ 1 << 5
2023-01-17 10:35:11 +00:00
section .text
2023-05-17 07:51:10 +00:00
; Function: setup_pic
;
; in:
; none
;
; out:
; none
;
2023-07-02 14:47:18 +00:00
global pic_setup
pic_setup:
push ebp
mov ebp, esp
sub esp, 2
in al, PIC1_DATA
mov [ebp - 2], al
in al, PIC2_DATA
mov [ebp - 1], al
mov al, ICW1_INIT | ICW1_ICW4
2023-01-17 14:36:21 +00:00
out PIC1_CMD, al
out PIC2_CMD, al
2023-01-17 10:35:11 +00:00
2023-07-02 14:47:18 +00:00
mov al, PIC1_INT_START
2023-01-17 14:36:21 +00:00
out PIC1_DATA, al
2023-07-02 14:47:18 +00:00
mov al, PIC2_INT_START
2023-01-17 14:36:21 +00:00
out PIC2_DATA, al
2023-01-17 10:35:11 +00:00
mov al, 4
2023-01-17 14:36:21 +00:00
out PIC1_DATA, al
2023-01-17 10:35:11 +00:00
mov al, 2
2023-01-17 14:36:21 +00:00
out PIC2_DATA, al
2023-01-17 10:35:11 +00:00
2023-07-02 14:47:18 +00:00
mov al, ICW4_8086_MODE
out PIC1_DATA, al
out PIC2_DATA, al
mov al, [ebp - 2]
2023-01-17 14:36:21 +00:00
out PIC1_DATA, al
2023-07-02 14:47:18 +00:00
mov al, [ebp - 1]
2023-01-17 14:36:21 +00:00
out PIC2_DATA, al
2023-07-02 14:47:18 +00:00
leave
2023-01-17 14:36:21 +00:00
ret
2023-05-17 07:51:10 +00:00
; Function: pic_eoi
;
; in:
; none
;
; out:
; none
;
2023-01-17 14:36:21 +00:00
global pic_eoi
pic_eoi:
2023-07-02 14:47:18 +00:00
push ebp
mov ebp, esp
mov al, OCW2_EOI
cmp byte [ebp + 8], PIC1_INT_START
jb .end
cmp byte [ebp + 8], PIC_INT_END
ja .end
cmp byte [ebp + 8], PIC2_INT_START
jb .pic1
2023-01-17 14:36:21 +00:00
out PIC2_CMD, al
2023-07-02 14:47:18 +00:00
jmp .end
.pic1:
2023-01-17 14:36:21 +00:00
out PIC1_CMD, al
2023-07-02 14:47:18 +00:00
.end:
leave
ret
; Function: pic_disable
global pic_disable
pic_disable:
mov al, 0xFF
out PIC1_DATA, al
out PIC2_DATA, al
2023-01-17 10:35:11 +00:00
ret