Feat: Starting of ACTUALL keyboard inturruptions with PIC
This commit is contained in:
+80
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user