Timer interrupt seems to work

Default settings on PIT, but maybe will want to mess with them later
This commit is contained in:
greg
2015-11-15 14:41:49 -08:00
parent b5022ff286
commit 730c2c7d71
2 changed files with 56 additions and 3 deletions

View File

@@ -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();

View File

@@ -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: