From ca927fd7ceeb0ac93ec09d8e6b3621d73d45af1d Mon Sep 17 00:00:00 2001 From: Vegard Matthey Date: Fri, 15 Aug 2025 15:31:09 +0200 Subject: [PATCH] initial --- .gitignore | 1 + main.asm | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++ run.sh | 2 + 3 files changed, 125 insertions(+) create mode 100644 .gitignore create mode 100644 main.asm create mode 100755 run.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba2906d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +main diff --git a/main.asm b/main.asm new file mode 100644 index 0000000..c5ae2c5 --- /dev/null +++ b/main.asm @@ -0,0 +1,122 @@ +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 diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..84a0b7a --- /dev/null +++ b/run.sh @@ -0,0 +1,2 @@ +#!/bin/sh +fasm main.asm && ./main