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);
|
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]
|
#[no_mangle]
|
||||||
pub extern fn rust_main() {
|
pub extern fn rust_main() {
|
||||||
clear();
|
clear();
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ global get_rdtsc
|
|||||||
global call_interrupt
|
global call_interrupt
|
||||||
extern rust_interrupt_handler
|
extern rust_interrupt_handler
|
||||||
extern rust_handle_keyboard
|
extern rust_handle_keyboard
|
||||||
|
extern rust_handle_timer
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
bits 64
|
bits 64
|
||||||
@@ -12,6 +13,7 @@ long_mode_start:
|
|||||||
; print "OKAY"
|
; print "OKAY"
|
||||||
call setup_SSE
|
call setup_SSE
|
||||||
call setup_IDT
|
call setup_IDT
|
||||||
|
call setup_PIT
|
||||||
call setup_PIC
|
call setup_PIC
|
||||||
extern rust_main
|
extern rust_main
|
||||||
call rust_main
|
call rust_main
|
||||||
@@ -113,9 +115,46 @@ handle_keyboard:
|
|||||||
|
|
||||||
iretq
|
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:
|
setup_IDT:
|
||||||
lidt [idt64.pointer]
|
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 rax, handle_keyboard
|
||||||
mov [idt64 + int_num*16], ax
|
mov [idt64 + int_num*16], ax
|
||||||
mov word [idt64 + int_num*16 +2], cs
|
mov word [idt64 + int_num*16 +2], cs
|
||||||
@@ -123,17 +162,21 @@ setup_IDT:
|
|||||||
shr rax, 16
|
shr rax, 16
|
||||||
mov [idt64 + int_num*16 + 6], ax
|
mov [idt64 + int_num*16 + 6], ax
|
||||||
shr rax, 16
|
shr rax, 16
|
||||||
mov [idt64 + int_num*16 + 8], ax
|
mov [idt64 + int_num*16 + 8], eax
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
setup_PIC:
|
setup_PIC:
|
||||||
mov al, 0xfd
|
mov al, 0xfc
|
||||||
out byte 0x21, al
|
out byte 0x21, al
|
||||||
mov al, 0xff
|
mov al, 0xff
|
||||||
out byte 0xa1, al
|
out byte 0xa1, al
|
||||||
sti
|
sti
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
setup_PIT:
|
||||||
|
ret
|
||||||
|
|
||||||
idt64:
|
idt64:
|
||||||
resb 50*16
|
resb 50*16
|
||||||
.pointer:
|
.pointer:
|
||||||
|
|||||||
Reference in New Issue
Block a user