Files
symphony_stdlib/console.asm
T
2026-09-01 10:51:31 +02:00

47 lines
1.5 KiB
NASM

; Reads a line from the keyboard and fills the specified buffer with it
; Does not support Shift or any other special keys
; Argument: r1 - pointer to the buffer
; Returns the pointer to the same buffer
; Clobbers r2, r3 and r4
pub read_line:
mov r4, 0 ; Storing the last key here, so we don't repeat the same key
mov r2, r1 ; Saving the buffer pointer for return
mov r3, r1 ; The pointer to after the last character
read_line_keyloop:
keyboard r1
cmp r1, r4
je read_line_keyloop ; If the current key is same as previous, we loop
mov r4, r1 ; Storing current key as previous
cmp r1, 0x100 ; Is the key down or up?
jbe read_line_keyloop ; If the key was up, we loop
xor r1, r1, 0x100 ; We remove the "down" bit
cmp r1, 10 ; Was the key Enter?
je read_line_finished ; If so, we're finished
cmp r1, 32 ; Was the key under Space? i.e. non-renderable
jb read_line_keyloop ; If so, we loop
cmp r1, 127 ; Was the key Backspace?
je read_line_backspace ; If yes we need to move one character back
read_line_store:
store_8 [r3], r1 ; Else, we store the key in the buffer
add r3, r3, 1 ; We advance forward
jmp read_line_keyloop
read_line_backspace:
cmp r3, r2
je read_line_keyloop ; If we are at the start, we loop
sub r3, r3, 1 ; We move back one character
jmp read_line_keyloop
read_line_finished:
store_8 [r3], zr ; We store null at the end so the string is finished
mov r1, r2 ; Recovering the buffer pointer
jmp r13