; Reads a line from the keyboard and fills the specified buffer with it ; Does not support Shift or any other special keys ; Arguments: ; r1 - pointer to the buffer ; Result: ; r1 - pointer to the same buffer ; 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 r3, r1 ; The pointer to after the last character 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 r5, 13 ; Was the key Backspace? je read_line_backspace ; If yes we need to move one character back cmp r5, 10 ; Was the key Enter? je read_line_finished ; If so, we're finished 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 r2, r2, flags ; If shift was down before, it still is. If it was pressed now, it is down now 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 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 read_line_backspace: 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: store_8 [r3], zr ; We store null at the end so the string is finished jmp r13