From f9bb69f1f51e6eefd9276d512c1bdeb32bd18e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Isalski?= Date: Wed, 2 Sep 2026 02:03:00 +0200 Subject: [PATCH] Added storing shift status --- console.asm | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/console.asm b/console.asm index fc7bce1..4b87f04 100644 --- a/console.asm +++ b/console.asm @@ -4,9 +4,10 @@ ; r1 - pointer to the buffer ; Result: ; r1 - pointer to the same buffer -; Clobbers: r2, r3, r4 +; Clobbers: r2, r3, r4, r5 pub read_line: 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: @@ -16,23 +17,32 @@ pub read_line: je read_line_keyloop ; If the current key is same as previous, we loop mov r4, r2 ; Storing current key as previous - cmp r2, 0x100 ; Is the key down or up? - jbe read_line_keyloop ; If the key was up, we loop - 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, 0x120 ; Is the key renderable or special? + jb read_line_special ; If the key was special, we handle it separately - cmp r2, 32 ; Was the key under Space? i.e. non-renderable - jb read_line_keyloop ; If so, we loop + ; 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 - cmp r2, 127 ; Was the key Backspace? - je read_line_backspace ; If yes we need to move one character back + read_line_special: + cmp r2, 13 ; Was the key Backspace? + je read_line_backspace ; If yes we need to move one character back - read_line_store: - 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, 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 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: cmp r3, r1 ; Compare the current pointer to start of buffer