Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
7006e8a4fe | |||
2df9271b40 | |||
681f0abc79 | |||
a48d4bbf9f | |||
b33192de27 | |||
c081838dd9 | |||
23e9001ea1 | |||
65d1d4aa52 | |||
82e55b3e1e | |||
6d3279f850 | |||
1820d4fdf8 | |||
81367baa99 | |||
33b6a82a42 | |||
755f9b9f06 | |||
c3563fcda1 |
26
README.md
26
README.md
@ -1,7 +1,9 @@
|
||||
<img src="https://git.pupes.org/repo-avatars/e4ede9d30f070c9e191eace5a88dcaa40434b9cadf60204122fab5a83aec9a9f" alt="logo of ParaDocs" width="196"></img>
|
||||
<img src="https://git.pupes.org/repo-avatars/e4ede9d30f070c9e191eace5a88dcaa40434b9cadf60204122fab5a83aec9a9f" alt="pulsar in asm game of life" width="196"></img>
|
||||
[](https://git.pupes.org/PoliEcho/asm-game-of-life/actions?workflow=build_test.yaml)
|
||||
# AMD64 Assembly Game of life
|
||||
|
||||
> [!WARNING]
|
||||
> this program will break if your terminal is too small
|
||||
|
||||
## Dependencies
|
||||
> AMD64 Linux Kernel
|
||||
@ -11,9 +13,27 @@
|
||||
> make
|
||||
|
||||
## Download
|
||||
#### TODO: add releases link
|
||||
[releases](https://git.pupes.org/PoliEcho/asm-game-of-life/releases)
|
||||
|
||||
## Build
|
||||
```shell
|
||||
make
|
||||
```
|
||||
```
|
||||
|
||||
## Controls
|
||||
| key | action |
|
||||
|--------|-------------------------|
|
||||
| arrows | move cursor |
|
||||
| ENTER | invert cell |
|
||||
| j/k | change simulation speed |
|
||||
| p | start/stop simulation |
|
||||
| q | quit |
|
||||
|
||||
|
||||
## Warning
|
||||
delays in TTY may be diferent depending on cpu clockspeed use j/k to adjust
|
||||
|
||||
## Notes
|
||||
if screen does not clear properly after loading just move the cursor around a bit
|
||||
looks best in TTY
|
||||
it sometimes SEGFAULTS in TTY on start but only on non debug builds and it is not consistent
|
@ -12,6 +12,8 @@ section .bss
|
||||
extern gameboard_ptr
|
||||
|
||||
extern simulation_running
|
||||
|
||||
extern running_in_tty
|
||||
section .data
|
||||
cursor_rows: dw 1
|
||||
cursor_cols: dw 1
|
||||
@ -49,6 +51,7 @@ global handle_user_input
|
||||
handle_user_input:; main loop of the program
|
||||
push r12
|
||||
push r13
|
||||
push r14
|
||||
|
||||
|
||||
lea r12, [multipurpuse_buf]
|
||||
@ -72,12 +75,26 @@ handle_user_input:; main loop of the program
|
||||
movss xmm0, [speed_multiplier]
|
||||
movss xmm1, [simulation_speed]
|
||||
mulss xmm0, xmm1; callculate sleep lenght
|
||||
cvttss2si rdx, xmm0; truncate and copy to rdx
|
||||
cvttss2si rdx, xmm0; truncate and copy to rdx
|
||||
mov r14, rdx
|
||||
syscall
|
||||
|
||||
mov sil, [running_in_tty]
|
||||
test sil, sil
|
||||
jz .skip_tty_mul
|
||||
push rax
|
||||
mov rax, 2500; magic number
|
||||
xor rdx,rdx
|
||||
mul r14
|
||||
mov r14, rax
|
||||
pop rax
|
||||
|
||||
.skip_tty_mul:
|
||||
test rax, rax; SYS_POLL returns 0 when no change happens within timeout
|
||||
jz .no_input
|
||||
|
||||
.repeat_read:
|
||||
|
||||
xor rax, rax
|
||||
mov qword [r12], rax; zeroout the buffer
|
||||
|
||||
@ -88,8 +105,18 @@ handle_user_input:; main loop of the program
|
||||
syscall; read user input
|
||||
|
||||
cmp rax, EAGAIN
|
||||
je .no_input
|
||||
jne .handle_input
|
||||
mov al, [running_in_tty]
|
||||
test al, al
|
||||
jz .no_input
|
||||
; this runs only if running in tty
|
||||
|
||||
test r14, r14
|
||||
jz .no_input; timeout
|
||||
dec r14
|
||||
jmp .repeat_read
|
||||
|
||||
.handle_input:
|
||||
mov rax, [r12]
|
||||
|
||||
cmp eax, 0x00415B1B; check if input is more than left arrow
|
||||
@ -237,6 +264,7 @@ handle_user_input:; main loop of the program
|
||||
jmp .main_loop
|
||||
|
||||
.function_exit:
|
||||
pop r14
|
||||
pop r13
|
||||
pop r12
|
||||
ret
|
||||
|
Loading…
x
Reference in New Issue
Block a user