From 6bbbb04131204b22367677209d7de8c3f906d0e2 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Mon, 7 Oct 2019 01:58:23 +0300 Subject: [PATCH] interrupts half-done --- src/boot/boot2.asm | 1 + src/gfx.asm | 15 ------------- src/intr.asm | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/intr.inc | 45 +++++++++++++++++++++++++++++++++++++++ src/keyb.asm | 5 +++++ 5 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 src/intr.asm create mode 100644 src/intr.inc create mode 100644 src/keyb.asm diff --git a/src/boot/boot2.asm b/src/boot/boot2.asm index 0fac8fe..40807ef 100644 --- a/src/boot/boot2.asm +++ b/src/boot/boot2.asm @@ -77,6 +77,7 @@ gdt: ; 0: null segment dd 0000ffffh dd 00cf9200h + global idt align 8 idt: times 104 db 0 ; trap gate 13: general protection fault diff --git a/src/gfx.asm b/src/gfx.asm index 06ff5e4..ced0863 100644 --- a/src/gfx.asm +++ b/src/gfx.asm @@ -1,19 +1,4 @@ ; 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 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 diff --git a/src/intr.inc b/src/intr.inc new file mode 100644 index 0000000..95b18d6 --- /dev/null +++ b/src/intr.inc @@ -0,0 +1,45 @@ +; 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 diff --git a/src/keyb.asm b/src/keyb.asm new file mode 100644 index 0000000..5200f2a --- /dev/null +++ b/src/keyb.asm @@ -0,0 +1,5 @@ +; vi:filetype=nasm ts=8 sts=8 sw=8: + + global kb_init +kb_init: + -- 1.7.10.4