33 lines
1.0 KiB
NASM
33 lines
1.0 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
|
|
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
|
|
|
|
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_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
|