%DEFINE SC_READ 0 %DEFINE SC_WRITE 1 %DEFINE SC_IOCTL 16 %DEFINE SC_EXIT 60 %DEFINE STDIN 0 %DEFINE STDOUT 1 %DEFINE TCGETS 0x5401 %DEFINE TCSETS 0x5402 SECTION .data BUF TIMES 524288 DB 0 ; this should be enough ig CLEAR_SEQ DB 0X1B, "[2J", 0x1B, "[H", 0 POS DQ 0 CHAR DB 0 SECTION .bss TERMIOS_OLD RESB 60 TERMIOS_NEW RESB 60 SECTION .text GLOBAL _start _start: CALL TERM_SAVE CALL TERM_RAW JMP LOOP CLEAR_SCR: MOV RAX, SC_WRITE MOV RDI, STDOUT MOV RSI, CLEAR_SEQ MOV RDX, 7 SYSCALL RET READ_CHAR: MOV RAX, SC_READ MOV RDI, STDIN MOV RSI, CHAR MOV RDX, 1 SYSCALL RET LOOP: CALL READ_CHAR CMP [CHAR], 127 JE BACKSPACE ; future... ; CMP [CHAR], 27 ; JE ESCAPE MOV R14, [POS] MOV R15, [CHAR] MOV [BUF + R14], R15 INC R14 MOV [POS], R14 CALL CLEAR_SCR CALL PRINT_BUF JMP LOOP BACKSPACE: CMP QWORD [POS], 0 JE LOOP DEC QWORD [POS] MOV R14, [POS] MOV BYTE [BUF + R14], 0 CALL CLEAR_SCR CALL PRINT_BUF JMP LOOP ESCAPE: CALL READ_CHAR CMP [CHAR], 91 JE ESCAPE_SEQ JMP LOOP ESCAPE_SEQ: CALL READ_CHAR CMP [CHAR], 68 JE LEFT LEFT: ; here is the text of left thing PRINT_BUF: MOV RAX, SC_WRITE MOV RDI, STDOUT MOV RSI, BUF MOV RDX, [POS] SYSCALL RET TERM_SAVE: MOV RAX, SC_IOCTL MOV RDI, STDIN MOV RSI, TCGETS MOV RDX, TERMIOS_OLD SYSCALL RET TERM_RAW: MOV RSI, TERMIOS_OLD MOV RDI, TERMIOS_NEW MOV RCX, 48 REP MOVSB MOV RDI, TERMIOS_NEW AND DWORD [RDI + 12], ~(0x0002 | 0x0008) MOV RAX, SC_IOCTL MOV RDI, STDIN MOV RSI, TCSETS MOV RDX, TERMIOS_NEW SYSCALL RET TERM_REST: MOV RAX, SC_IOCTL MOV RDI, STDIN MOV RSI, TCSETS MOV RDX, TERMIOS_OLD SYSCALL RET