Added read_line console function
#10
+25
-15
@@ -4,9 +4,10 @@
|
|||||||
; r1 - pointer to the buffer
|
; r1 - pointer to the buffer
|
||||||
; Result:
|
; Result:
|
||||||
; r1 - pointer to the same buffer
|
; r1 - pointer to the same buffer
|
||||||
; Clobbers: r2, r3, r4
|
; Clobbers: r2, r3, r4, r5
|
||||||
pub read_line:
|
pub read_line:
|
||||||
mov r4, 0 ; Storing the last key here, so we don't repeat the same key
|
mov r4, 0 ; Storing the last key here, so we don't repeat the same key
|
||||||
|
mov r5, 0 ; Storing the shift status
|
||||||
mov r3, r1 ; The pointer to after the last character
|
mov r3, r1 ; The pointer to after the last character
|
||||||
|
|
||||||
read_line_keyloop:
|
read_line_keyloop:
|
||||||
@@ -16,23 +17,32 @@ pub read_line:
|
|||||||
je read_line_keyloop ; If the current key is same as previous, we loop
|
je read_line_keyloop ; If the current key is same as previous, we loop
|
||||||
mov r4, r2 ; Storing current key as previous
|
mov r4, r2 ; Storing current key as previous
|
||||||
|
|
||||||
cmp r2, 0x100 ; Is the key down or up?
|
cmp r2, 0x120 ; Is the key renderable or special?
|
||||||
jbe read_line_keyloop ; If the key was up, we loop
|
jb read_line_special ; If the key was special, we handle it separately
|
||||||
xor r2, r2, 0x100 ; We remove the "down" bit
|
|
||||||
|
|
||||||
cmp r2, 10 ; Was the key Enter?
|
|
||||||
je read_line_finished ; If so, we're finished
|
|
||||||
|
|
||||||
cmp r2, 32 ; Was the key under Space? i.e. non-renderable
|
; TODO: Converting based on shift value
|
||||||
jb read_line_keyloop ; If so, we loop
|
store_8 [r3], r2 ; Else, we store the key in the buffer
|
||||||
|
add r3, r3, 1 ; We advance forward
|
||||||
|
jmp read_line_keyloop
|
||||||
|
|
||||||
cmp r2, 127 ; Was the key Backspace?
|
read_line_special:
|
||||||
je read_line_backspace ; If yes we need to move one character back
|
cmp r2, 13 ; Was the key Backspace?
|
||||||
|
je read_line_backspace ; If yes we need to move one character back
|
||||||
|
|
||||||
read_line_store:
|
cmp r2, 10 ; Was the key Enter?
|
||||||
store_8 [r3], r2 ; Else, we store the key in the buffer
|
je read_line_finished ; If so, we're finished
|
||||||
add r3, r3, 1 ; We advance forward
|
|
||||||
jmp read_line_keyloop
|
and r2, r2, 0x1FB ; Mask out the left/right shift direction bit
|
||||||
|
cmp r2, 0x110 ; Was the key Shift Down?
|
||||||
|
and flags, flags, 0x1 ; We care only about equality bit
|
||||||
|
or r5, r5, flags ; If shift was down before, it still is. If it was pressed now, it is down now
|
||||||
|
|
||||||
|
cmp r2, 0x010 ; Was the key Shift Up?
|
||||||
|
and flags, flags, 0x1 ; We care only about equality bit
|
||||||
|
xor flags, flags, 0x1 ; We invert it, i.e. "if it's not up"
|
||||||
|
and r5, r5, flags ; The shift can be kept down if it's not currently up
|
||||||
|
|
||||||
|
jmp read_line_keyloop ; If no special handling, we loop back
|
||||||
|
|
||||||
read_line_backspace:
|
read_line_backspace:
|
||||||
cmp r3, r1 ; Compare the current pointer to start of buffer
|
cmp r3, r1 ; Compare the current pointer to start of buffer
|
||||||
|
|||||||
Reference in New Issue
Block a user