Added a shift conversion LUT and finished read_line (except Writeback)

This commit is contained in:
Michal Isalski
2026-09-03 20:38:29 +02:00
committed by ShatteredMINT
parent 3c9ac218b0
commit 001b957967
3 changed files with 140 additions and 23 deletions
+37 -23
View File
@@ -4,43 +4,56 @@
; r1 - pointer to the buffer
; Result:
; r1 - pointer to the same buffer
; Clobbers: r2, r3, r4, r5
; Clobbers: r2, r3, r4, r5, r6, r7
pub read_line:
mov r6, 1
lsl r6, r6, 16
sub r6, r6, 32 ; Calculating the address to the shift LUT
mov r2, 0 ; Storing the shift status here
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
read_line_keyloop:
keyboard r2
cmp r2, r4
je read_line_keyloop ; If the current key is same as previous, we loop
mov r4, r2 ; Storing current key as previous
cmp r2, 0x120 ; Is the key renderable or special?
jb read_line_special ; If the key was special, we handle it separately
; TODO: Converting based on shift value
store_8 [r3], r2 ; Else, we store the key in the buffer
add r3, r3, 1 ; We advance forward
jmp read_line_keyloop
read_line_keyloop:
keyboard r5
cmp r5, r4
je read_line_keyloop ; If the current key is same as previous, we loop
mov r4, r5 ; Storing current key as previous
cmp r5, 0x120 ; Is the key renderable or special?
jb read_line_special ; If the key was special, we handle it separately
xor r5, r5, 0x100 ; Clearing the "down" bit
cmp r2, zr ; Checking for shift status
je read_line_store ; If shift is up, we skip conversion
;;; converting from shift-down to shift-up keys
add r7, r6, r5 ; Calculating the index of the shift conversion
load_8 r5, [r7] ; Loading the shifted value
;;;
read_line_store:
store_8 [r3], r5 ; Else, we store the key in the buffer
add r3, r3, 1 ; We advance forward
; TODO: Writeback
jmp read_line_keyloop
read_line_special:
cmp r2, 13 ; Was the key Backspace?
cmp r5, 13 ; Was the key Backspace?
je read_line_backspace ; If yes we need to move one character back
cmp r2, 10 ; Was the key Enter?
cmp r5, 10 ; Was the key Enter?
je read_line_finished ; If so, we're finished
and r2, r2, 0x1FB ; Mask out the left/right shift direction bit
cmp r2, 0x110 ; Was the key Shift Down?
and r5, r5, 0x1FB ; Mask out the left/right shift direction bit
cmp r5, 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
or r2, r2, 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?
cmp r5, 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
and r2, r2, flags ; The shift can be kept down if it's not currently up
jmp read_line_keyloop ; If no special handling, we loop back
@@ -48,6 +61,7 @@ pub read_line:
cmp r3, r1 ; Compare the current pointer to start of buffer
je read_line_keyloop ; If we are at the start, we loop
sub r3, r3, 1 ; We move back one character
; TODO: Writeback
jmp read_line_keyloop
read_line_finished: