Feat: Starting of ACTUALL keyboard inturruptions with PIC

This commit is contained in:
AfonsoCMSousa
2026-08-03 20:33:05 +01:00
parent 1dfe5d4fea
commit fb27ad1e0c
3 changed files with 254 additions and 123 deletions
+80 -2
View File
@@ -1,8 +1,6 @@
; File: elevator.asm
; Stage 2 Bootloader - No size limit!
; Job: Load kernel, set up GDT, switch to 64-bit mode, jump to kernel
[org 0x7e00]
[bits 16]
@@ -492,6 +490,7 @@ pm_msg: db '[PM32] Setting up Long Mode...', 0
; 64-BIT LONG MODE
; ============================================================
[bits 64]
[extern __keyboard_buffer_push] ; External function to push key into keyboard buffer
long_mode:
; Set up segments
mov ax, 0x20
@@ -506,6 +505,9 @@ long_mode:
; Point all interrupts to a dummy handler
call setup_idt
; Set up PIC to avoid spurious interrupts
call setup_pics
; Print message on line 3
mov rdi, 0xb8000 + (160 * 2)
mov rsi, lm_msg
@@ -516,6 +518,8 @@ long_mode:
mov rsi, before_kernel_msg
call print_64
sti ; Enable interrupts before jumping to kernel
; JUMP TO KERNEL!
call KERNEL_OFFSET
@@ -572,6 +576,80 @@ setup_idt:
lidt [idt_descriptor]
ret
setup_pics:
; Loads master values into rdi/rsi/rdx/rcx
mov rdi, 0x20 ; Master command port
mov rsi, 0x21 ; Master data port
mov rdx, 0x20 ; Master offset
mov rcx, 0x04 ; Master ICW3 value
call setup_pic
; Loads slave values into rdi/rsi/rdx/rcx
mov rdi, 0xA0 ; Slave command port
mov rsi, 0xA1 ; Slave data port
mov rdx, 0x28 ; Slave offset
mov rcx, 0x02 ; Slave ICW3 values
call setup_pic
ret
; Set up PIC
; input:
; rdi - command port
; rsi - data port
; rdx - offset
; rcx - ICW3 value
; Master: 0x11, 0x20, 0x04, 0x01
; Slave: 0x11, 0x28, 0x02, 0x01
setup_pic:
; Step 0: rescue the offset FIRST, before dx gets reused for ports
mov r8b, dl ; r8b now safely holds the offset byte, forever
; Step 1: ICW1 -> command port
mov dx, di
mov al, 0x11
out dx, al
; Step 2: ICW2 (offset) -> data port
mov dx, si
mov al, r8b
out dx, al
; Step 3: ICW3 -> data port (dx is UNCHANGED since step 2 — no reload needed)
mov al, cl
out dx, al
; Step 4: ICW4 -> data port (still no reload needed)
mov al, 0x01
out dx, al
ret
; keyboard handler - Catch PIC interrupt
keyboard_handler:
push rax
push rdx
push rdi
push r8
mov dx, 0x60
in al, dx
; convert ASCII
; assuming output on r8 (as an example)
; Acording to x86_64 SystemV
mov rdi, r8
call __keyboard_buffer_push
mov al, 0x20
out 0x20, al
pop r8
pop rdi
pop rdx
pop rax
iretq
; Exception handler - shows what went wrong
exception_handler:
; Save registers