Timer interrupt seems to work
Default settings on PIT, but maybe will want to mess with them later
This commit is contained in:
@@ -24,6 +24,16 @@ pub extern fn rust_handle_keyboard() {
|
||||
checkerboard(vga_buffer::Color::Green);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn rust_handle_timer() {
|
||||
let color_code = vga_buffer::ColorCode::new(vga_buffer::Color::Black,
|
||||
vga_buffer::Color::White);
|
||||
|
||||
|
||||
vga_buffer::write_to_coord(40, 1, b'X', color_code);
|
||||
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern fn rust_main() {
|
||||
clear();
|
||||
|
||||
@@ -4,6 +4,7 @@ global get_rdtsc
|
||||
global call_interrupt
|
||||
extern rust_interrupt_handler
|
||||
extern rust_handle_keyboard
|
||||
extern rust_handle_timer
|
||||
|
||||
section .text
|
||||
bits 64
|
||||
@@ -12,6 +13,7 @@ long_mode_start:
|
||||
; print "OKAY"
|
||||
call setup_SSE
|
||||
call setup_IDT
|
||||
call setup_PIT
|
||||
call setup_PIC
|
||||
extern rust_main
|
||||
call rust_main
|
||||
@@ -113,9 +115,46 @@ handle_keyboard:
|
||||
|
||||
iretq
|
||||
|
||||
%define int_num 9
|
||||
handle_timer:
|
||||
push rax
|
||||
push rcx
|
||||
push rdx
|
||||
push r8
|
||||
push r9
|
||||
push r10
|
||||
push r11
|
||||
pushfq
|
||||
|
||||
call rust_handle_timer
|
||||
|
||||
mov al, END_OF_INTERRUPT
|
||||
out PIC1_COMMAND, al
|
||||
out PIC2_COMMAND, al
|
||||
|
||||
popfq
|
||||
pop r11
|
||||
pop r10
|
||||
pop r9
|
||||
pop r8
|
||||
pop rdx
|
||||
pop rcx
|
||||
pop rax
|
||||
iretq
|
||||
|
||||
setup_IDT:
|
||||
lidt [idt64.pointer]
|
||||
%define timer_int 8
|
||||
mov rax, handle_timer
|
||||
mov [idt64 + timer_int*16], ax
|
||||
mov word [idt64 + timer_int*16 + 2], cs
|
||||
mov word [idt64 + timer_int*16 + 4], 0x8e00
|
||||
shr rax, 16
|
||||
mov [idt64 + timer_int*16 + 6], ax
|
||||
shr rax, 16
|
||||
mov [idt64 + timer_int*16 + 8], eax
|
||||
|
||||
|
||||
%define int_num 9
|
||||
mov rax, handle_keyboard
|
||||
mov [idt64 + int_num*16], ax
|
||||
mov word [idt64 + int_num*16 +2], cs
|
||||
@@ -123,17 +162,21 @@ setup_IDT:
|
||||
shr rax, 16
|
||||
mov [idt64 + int_num*16 + 6], ax
|
||||
shr rax, 16
|
||||
mov [idt64 + int_num*16 + 8], ax
|
||||
mov [idt64 + int_num*16 + 8], eax
|
||||
|
||||
ret
|
||||
|
||||
setup_PIC:
|
||||
mov al, 0xfd
|
||||
mov al, 0xfc
|
||||
out byte 0x21, al
|
||||
mov al, 0xff
|
||||
out byte 0xa1, al
|
||||
sti
|
||||
ret
|
||||
|
||||
setup_PIT:
|
||||
ret
|
||||
|
||||
idt64:
|
||||
resb 50*16
|
||||
.pointer:
|
||||
|
||||
Reference in New Issue
Block a user