163 lines
2.9 KiB
NASM
Executable File
163 lines
2.9 KiB
NASM
Executable File
; ==================================================================
|
|
; MikeOS -- The Mike Operating System kernel
|
|
; Copyright (C) 2006 - 2021 MikeOS Developers -- see doc/LICENSE.TXT
|
|
;
|
|
; SCREEN HANDLING SYSTEM CALLS
|
|
; ==================================================================
|
|
|
|
; ------------------------------------------------------------------
|
|
; os_print_string -- Displays text
|
|
; IN: SI = message location (zero-terminated string)
|
|
; OUT: Nothing (registers preserved)
|
|
|
|
os_print_string:
|
|
pusha
|
|
|
|
mov ah, 0Eh ; int 10h teletype function, we're telling the BIOS we will print something
|
|
|
|
.repeat:
|
|
lodsb ; Get char from si into al
|
|
cmp al, 0 ; Compare al to 0
|
|
je .done ; If char is zero, end of string
|
|
|
|
int 10h ; Otherwise, print it
|
|
jmp .repeat ; And move on to next char
|
|
|
|
.done:
|
|
popa
|
|
ret
|
|
|
|
; Exact same as the above procedure, but this adds a newline
|
|
; after priting, similar to the difference between Rust's print! and println!
|
|
os_print_string_nl: pusha
|
|
|
|
mov ah, 0Eh ; int 10h teletype function, we're telling the BIOS we will print something
|
|
|
|
.repeat:
|
|
lodsb ; Get char from si into al
|
|
cmp al, 0 ; Compare al to 0
|
|
je .done ; If char is zero, end of string
|
|
|
|
int 10h ; Otherwise, print it
|
|
jmp .repeat ; And move on to next char
|
|
|
|
.done:
|
|
call os_print_newline
|
|
popa
|
|
ret
|
|
|
|
; --------------------------------------------
|
|
|
|
os_print_newline:
|
|
pusha
|
|
|
|
mov ah, 03h
|
|
int 10h
|
|
|
|
mov ah, 02h
|
|
add dh, 1
|
|
mov dl, 0
|
|
int 10h
|
|
|
|
popa
|
|
ret
|
|
|
|
|
|
; -------------------------------------------
|
|
|
|
os_clear_screen:
|
|
pusha
|
|
|
|
mov ah, 00h
|
|
mov al, 03h ; Set video mode to textmode (80x25). 16 colors, 8 pages
|
|
int 10h
|
|
|
|
mov ah, 02h
|
|
mov dh, 0
|
|
mov dl, 0
|
|
int 10h
|
|
|
|
popa
|
|
ret
|
|
|
|
; -------------------------------------------
|
|
|
|
; AX = key pressed
|
|
os_read_input:
|
|
mov ah, 11h ; BIOS call to check for key
|
|
int 16h ; Interrupt
|
|
jnz .key_pressed ; Jump if input isn't 0
|
|
|
|
hlt
|
|
jmp os_read_input
|
|
|
|
.key_pressed:
|
|
mov ah, 10h
|
|
int 16h
|
|
ret
|
|
|
|
; -------------------------------------------
|
|
|
|
os_display_input:
|
|
pusha
|
|
mov cx, prompt_length ; Characters remaining
|
|
|
|
.loop:
|
|
call .check_key_pressed
|
|
|
|
jmp .loop
|
|
|
|
.check_key_pressed:
|
|
call os_read_input
|
|
|
|
cmp al, 08h
|
|
je .backspace
|
|
|
|
cmp al, 0Dh
|
|
je .enter_key
|
|
|
|
cmp al, 1Bh
|
|
je .esc_key
|
|
|
|
dec cx
|
|
call .print_current_input
|
|
ret
|
|
|
|
.esc_key:
|
|
call os_reboot
|
|
|
|
.enter_key:
|
|
mov al, 0
|
|
stosb
|
|
mov di, user_input
|
|
popa
|
|
call os_read_cli
|
|
|
|
.backspace:
|
|
cmp cx, prompt_length ; If bx < 20
|
|
jl .move_cursor_back ; then .move_cursor_back
|
|
call .loop ; Else .loop
|
|
|
|
.move_cursor_back:
|
|
mov ah, 0Eh
|
|
|
|
mov al, 08h
|
|
int 10h
|
|
mov al, 20h
|
|
int 10h
|
|
mov al, 08h
|
|
int 10h
|
|
|
|
dec di
|
|
inc cx
|
|
jmp os_display_input
|
|
|
|
.print_current_input:
|
|
stosb
|
|
|
|
mov ah, 0Eh
|
|
int 10h
|
|
|
|
|
|
ret
|