diff --git a/src/interrupts.asm b/src/interrupts.asm index e5638689..e127bac3 100644 --- a/src/interrupts.asm +++ b/src/interrupts.asm @@ -205,6 +205,13 @@ install_irqs: ret +; r8 = irq +; r9 = handler address +register_irq_handler: + mov [irq_handlers + r8 * 8], r9 + + ret + ; Data structures ; each idt entry is form like that: diff --git a/src/kernel.asm b/src/kernel.asm index 8c435882..87faff35 100644 --- a/src/kernel.asm +++ b/src/kernel.asm @@ -100,6 +100,8 @@ lm_start: ; Enter the shell call shell_start + jmp $ + ; Includes %include "src/utils/macros.asm" diff --git a/src/shell.asm b/src/shell.asm index a26bf597..6c2e0c21 100644 --- a/src/shell.asm +++ b/src/shell.asm @@ -15,32 +15,41 @@ shell_start: mov r9, command_line_length call print_normal - .start_waiting: - call key_wait + mov r8, 1 + mov r9, key_entered + call register_irq_handler - ; ENTER key - cmp al, 28 - je .new_command + ret - call key_to_ascii +key_entered: + in al, 0x60 + mov dl, al + and dl, 10000000b - ; Store the entered character - mov r8, [current_input_length] - mov byte [current_input_str + r8], al - inc r8 - mov [current_input_length], r8 + jnz .end_handler - ; Print back the entered char - call set_current_position - stosb + ; ENTER key + cmp al, 28 + je .new_command - ; Go to the next column - mov r13, [current_column] - inc r13 - mov [current_column], r13 + call key_to_ascii - ; Wait for the next key again - jmp .start_waiting + ; Store the entered character + mov r8, [current_input_length] + mov byte [current_input_str + r8], al + inc r8 + mov [current_input_length], r8 + + ; Print back the entered char + call set_current_position + stosb + + ; Go to the next column + mov r13, [current_column] + inc r13 + mov [current_column], r13 + + jmp .end_handler .new_command: call goto_next_line @@ -133,7 +142,9 @@ shell_start: mov r9, command_line_length call print_normal - jmp .start_waiting + .end_handler: + + ret ; Variables