add user input handling
This commit is contained in:
parent
c5e404f1dd
commit
b94ebe30c8
@ -9,7 +9,8 @@ section .bss
|
||||
extern term_cols
|
||||
|
||||
extern gameboard_size
|
||||
|
||||
|
||||
global simulation_running
|
||||
simulation_running: RESB 1
|
||||
|
||||
section .rodata
|
||||
@ -20,8 +21,8 @@ section .rodata
|
||||
|
||||
home_cursor: db ESC_CHAR, "[H", 0
|
||||
|
||||
statusbar: db ESC_CHAR, "[30;100m", "Use arrow keys to move cursor, enter to invert cell h/j to change simulation speed, p to simulation", 0
|
||||
START_STOP_pos: equ $-statusbar-16
|
||||
statusbar: db ESC_CHAR, "[30;100m", "Use arrow keys to move cursor, enter to invert cell j/k to change simulation speed, p to simulation", 0
|
||||
START_STOP_pos: equ $-statusbar-17
|
||||
|
||||
|
||||
start_str: db "START", 0
|
||||
@ -68,8 +69,24 @@ global print_game_ui
|
||||
print_game_ui:
|
||||
lea rdi, [home_cursor]
|
||||
call print_str
|
||||
|
||||
|
||||
mov qword rdi, [gameboard_ptr]
|
||||
push rdi
|
||||
add rdi, [gameboard_size]
|
||||
sub di, [term_cols]
|
||||
add rdi, START_STOP_pos
|
||||
|
||||
mov cl, [simulation_running]
|
||||
test cl,cl; test if simulation is running
|
||||
jz .simulation_not_running
|
||||
lea rsi, [stop_str]
|
||||
jmp .end_simulation_running_check
|
||||
.simulation_not_running:
|
||||
lea rsi, [start_str]
|
||||
.end_simulation_running_check:
|
||||
call string_copy
|
||||
|
||||
pop rdi
|
||||
call print_str
|
||||
|
||||
|
||||
|
135
src/input.asm
135
src/input.asm
@ -1,12 +1,141 @@
|
||||
%include "symbols.asm"
|
||||
|
||||
section .bss
|
||||
cursor_rows: RESW 1
|
||||
cursor_rows: RESW 1; TODO DONT FORGET TO INICIALIZE
|
||||
cursor_cols: RESW 1
|
||||
|
||||
extern multipurpuse_buf
|
||||
|
||||
extern term_rows
|
||||
extern term_cols
|
||||
|
||||
extern gameboard_ptr
|
||||
|
||||
extern simulation_running
|
||||
|
||||
section .rodata
|
||||
|
||||
cursor_up: db ESC_CHAR, "[1A", 0
|
||||
cursor_down: db ESC_CHAR, "[1B", 0
|
||||
cursor_right: db ESC_CHAR, "[1C", 0
|
||||
cursor_left: db ESC_CHAR, "[1D", 0
|
||||
|
||||
|
||||
arrow_switch_statement:
|
||||
dq handle_user_input.arrow_up
|
||||
dq handle_user_input.arrow_down
|
||||
dq handle_user_input.arrow_right
|
||||
dq handle_user_input.arrow_left
|
||||
|
||||
section .text
|
||||
|
||||
global handle_user_input
|
||||
handle_user_input:
|
||||
extern print_str
|
||||
|
||||
global handle_user_input
|
||||
handle_user_input:; main loop of the program
|
||||
|
||||
.main_loop:
|
||||
|
||||
xor rax, rax
|
||||
mov qword [multipurpuse_buf], rax; zeroout the buffer
|
||||
|
||||
mov rax, SYS_POLL
|
||||
mov rdi, STDIN
|
||||
mov rsi, 1; only one file descriptor is provided
|
||||
mov rdx, 0; no timeout. maybe use this for final sleep but run if user inputs something TODO
|
||||
syscall
|
||||
|
||||
test rax, rax; SYS_POLL returns 0 when no change happens within timeout
|
||||
jz .no_input
|
||||
|
||||
mov rax, SYS_READ
|
||||
mov rdi, STDIN
|
||||
lea rsi, [multipurpuse_buf]
|
||||
mov rdx, 8; size of multipurpuse buffer
|
||||
syscall; read user input
|
||||
|
||||
mov rax, [multipurpuse_buf]
|
||||
shr rax, 5; we need only 3 bytes for this inpus sceame
|
||||
|
||||
cmp eax, 0x001B5B44; check if input is more than left arrow
|
||||
ja .handle_single_byte_chars
|
||||
|
||||
sub eax, 0x1B5B41
|
||||
jmp [arrow_switch_statement+(rax*8)]; lets hope this works
|
||||
|
||||
.arrow_up:
|
||||
dec word [cursor_rows]
|
||||
lea rdi, [cursor_up]
|
||||
call print_str
|
||||
jmp .no_input
|
||||
.arrow_down:
|
||||
inc word [cursor_rows]
|
||||
lea rdi, [cursor_down]
|
||||
call print_str
|
||||
jmp .no_input
|
||||
.arrow_right:
|
||||
inc word [cursor_cols]
|
||||
lea rdi, [cursor_right]
|
||||
call print_str
|
||||
jmp .no_input
|
||||
.arrow_left:
|
||||
dec word [cursor_cols]
|
||||
lea rdi, [cursor_left]
|
||||
call print_str
|
||||
jmp .no_input
|
||||
|
||||
.handle_single_byte_chars:
|
||||
|
||||
shr eax, 2; get the char to al
|
||||
|
||||
cmp al, 0xa; NEWLINE (enter key)
|
||||
jne .check_p
|
||||
|
||||
xor rax, rax; zeroout rax
|
||||
mov ax, [cursor_rows]
|
||||
mul dword [term_cols]
|
||||
add rax, [cursor_cols]
|
||||
|
||||
lea rdi, [gameboard_ptr+rax]
|
||||
mov cl, [rdi]
|
||||
cmp cl, '#'
|
||||
je .hashtag_present
|
||||
|
||||
mov byte [rdi], '#'
|
||||
jmp .no_input
|
||||
|
||||
.hashtag_present:
|
||||
|
||||
mov byte [rdi], ' '
|
||||
jmp .no_input
|
||||
|
||||
.check_p:
|
||||
cmp al, 'p'
|
||||
jne .check_j
|
||||
|
||||
xor byte [simulation_running], 0x01; switch simulation on or off
|
||||
|
||||
jmp .no_input
|
||||
|
||||
.check_j:
|
||||
cmp al, 'j'
|
||||
jne .check_k
|
||||
|
||||
; TODO implement simulation speed
|
||||
|
||||
jmp .no_input
|
||||
|
||||
.check_k:
|
||||
cmp al, 'k'
|
||||
jne .no_input
|
||||
|
||||
; TODO implement simulation speed
|
||||
|
||||
.no_input:
|
||||
|
||||
|
||||
jmp .main_loop
|
||||
|
||||
ret
|
||||
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
|
||||
section .bss
|
||||
global multipurpuse_buf
|
||||
multipurpuse_buf: RESB 8
|
||||
|
||||
global term_rows
|
||||
@ -72,6 +73,13 @@ _start:
|
||||
mov [gameboard_ptr], rax; stores pointer to gameboard array
|
||||
call init_gameboard
|
||||
|
||||
; make stdin non-blocking in case polling somehow fails, or am i stupid
|
||||
mov rax, SYS_FCNTL
|
||||
mov rdi, STDIN
|
||||
mov rsi, F_SETFL
|
||||
mov rdx, O_NONBLOCK
|
||||
syscall
|
||||
|
||||
call print_game_ui
|
||||
|
||||
|
||||
|
@ -1,10 +1,18 @@
|
||||
SYS_EXIT equ 60
|
||||
SYS_IOCTL equ 16
|
||||
SYS_READ equ 0
|
||||
SYS_WRITE equ 1
|
||||
SYS_BRK equ 12
|
||||
SYS_FCNTL equ 72
|
||||
SYS_POLL equ 7
|
||||
|
||||
STDIN equ 0
|
||||
STDOUT equ 1
|
||||
|
||||
TIOCGWINSZ equ 0x5413
|
||||
POLLIN equ 1
|
||||
F_SETFL equ 4
|
||||
O_NONBLOCK equ 2048
|
||||
|
||||
ASCII_ZERO equ 48
|
||||
ESC_CHAR equ 27
|
||||
|
Loading…
x
Reference in New Issue
Block a user