; 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 pub read_line: 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 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, 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, 32 ; Was the key under Space? i.e. non-renderable jb read_line_keyloop ; If so, we loop cmp r2, 127 ; 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 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 jmp read_line_keyloop read_line_finished: store_8 [r3], zr ; We store null at the end so the string is finished jmp r13