123 lines
1.5 KiB
NASM
123 lines
1.5 KiB
NASM
format ELF64 executable
|
|
|
|
segment readable executable
|
|
|
|
entry main
|
|
main:
|
|
call init_board
|
|
mov [turn], 0
|
|
.game_loop:
|
|
inc [turn]
|
|
call get_input
|
|
sub [input], '0'
|
|
|
|
test [turn], 1
|
|
mov r8b, '2' ; char
|
|
jz .some
|
|
mov r8b, '1' ; char
|
|
.some:
|
|
|
|
mov bl, [input]
|
|
call action
|
|
|
|
call print_board
|
|
call print_board_break
|
|
|
|
call win_condition
|
|
cmp rax, 0
|
|
jne .game_loop
|
|
|
|
mov rax, 60
|
|
mov rdi, 0
|
|
syscall
|
|
|
|
win_condition:
|
|
ret
|
|
|
|
get_input:
|
|
mov rax, 0
|
|
mov rdi, 0
|
|
mov rsi, input
|
|
mov rdx, 2
|
|
syscall
|
|
ret
|
|
|
|
init_board:
|
|
mov rax, board
|
|
mov r8, 6
|
|
|
|
.init_board_loop:
|
|
mov r10, 7
|
|
.init_board_loop_inner:
|
|
mov byte [rax], '0'
|
|
inc rax
|
|
|
|
dec r10
|
|
cmp r10, 0
|
|
jne .init_board_loop_inner
|
|
|
|
mov byte [rax], 10
|
|
inc rax
|
|
|
|
dec r8
|
|
cmp r8, 0
|
|
jne .init_board_loop
|
|
|
|
ret
|
|
print_board:
|
|
mov rax, 1
|
|
mov rdi, 1
|
|
mov rsi, board
|
|
mov rdx, 48
|
|
syscall
|
|
ret
|
|
|
|
print_board_break:
|
|
mov rax, 1
|
|
mov rdi, 1
|
|
mov rsi, line_break
|
|
mov rdx, break_len
|
|
syscall
|
|
ret
|
|
|
|
action:; rbx - x, r8b - char
|
|
mov r9, 6
|
|
.action_test_loop:
|
|
dec r9
|
|
mov rax, 8
|
|
mul r9
|
|
mov r10, board
|
|
add r10, rbx
|
|
add r10, rax
|
|
|
|
cmp r9, 0
|
|
je .continue_action
|
|
cmp byte [r10], '0'
|
|
jne .action_test_loop
|
|
.continue_action:
|
|
|
|
mov r13, 5
|
|
sub r13, r9
|
|
mov rcx, r13
|
|
call place
|
|
ret
|
|
|
|
place: ; rbx - x, rcx - y, r8b - char
|
|
mov rax, 5
|
|
sub rax, rcx
|
|
mov r9, 8
|
|
mul r9
|
|
mov r10, board
|
|
add r10, rax
|
|
add r10, rbx
|
|
mov byte [r10], r8b
|
|
ret
|
|
|
|
segment readable writable
|
|
board rb 48
|
|
table rb 154
|
|
turn rb 1
|
|
input rb 1
|
|
line_break db "-------", 10, 0
|
|
break_len = $-line_break
|