136 lines
1.6 KiB
NASM
136 lines
1.6 KiB
NASM
%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 |