hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/aoc-2025/day12.asm
diff options
context:
space:
mode:
Diffstat (limited to 'aoc-2025/day12.asm')
-rw-r--r--aoc-2025/day12.asm120
1 files changed, 8 insertions, 112 deletions
diff --git a/aoc-2025/day12.asm b/aoc-2025/day12.asm
index 6eb64a9..8931a2b 100644
--- a/aoc-2025/day12.asm
+++ b/aoc-2025/day12.asm
@@ -5,14 +5,8 @@ default rel
global _start
-%define SYS_EXIT 60
-%define SYS_READ 0
-%define SYS_WRITE 1
-%define SYS_OPEN 2
-%define SYS_CLOSE 3
-
-%define O_RDONLY 0
-%define STDOUT 1
+%include "utils/io.asm"
+%include "utils/parse.asm"
%define RAW_SIZE 262144
%define GRID_SIZE 4096 ; regions are at most 50x50
@@ -20,8 +14,6 @@ global _start
section .data
input_path db "input/day12.txt", 0
- newline db 10
-
label1 db "Part 1: ", 0
section .bss
@@ -54,35 +46,14 @@ section .bss
left resq 1
count_feasible resq 1
- number_buffer resb 32
-
section .text
_start:
- mov rax, SYS_OPEN
mov rdi, input_path
- mov rsi, O_RDONLY
- xor rdx, rdx
- syscall
- mov r12, rax
-
- xor r13, r13
-read_loop:
- mov rax, SYS_READ
- mov rdi, r12
- lea rsi, [raw + r13]
+ lea rsi, [raw]
mov rdx, RAW_SIZE
- sub rdx, r13
- syscall
- cmp rax, 0
- jle read_done
- add r13, rax
- jmp read_loop
-read_done:
- mov [raw_len], r13
- mov rax, SYS_CLOSE
- mov rdi, r12
- syscall
+ call read_file
+ mov [raw_len], rax
; parse shapes and regions
lea rsi, [raw]
@@ -106,7 +77,7 @@ pline:
cmp al, '9'
jg maybe_grid
; a number begins the line
- call parse_num
+ call parse_u64
mov r10, rax
mov al, [rsi]
cmp al, 'x'
@@ -127,7 +98,7 @@ region_line:
mov qword [orients_done], 1
.have:
inc rsi ; skip 'x'
- call parse_num
+ call parse_u64
mov r11, rax ; L
.find_colon:
mov al, [rsi]
@@ -145,7 +116,7 @@ region_line:
inc rsi
jmp .rsp
.rsp_done:
- call parse_num
+ call parse_u64
mov [counts + rcx*8], rax
inc rcx
jmp .rcounts
@@ -215,24 +186,6 @@ pdone:
xor rdi, rdi
syscall
-; parse_num: read decimal at [RSI], advancing RSI. Clobbers RAX, RDX.
-parse_num:
- xor rax, rax
-.d:
- mov dl, [rsi]
- cmp dl, '0'
- jl .done
- cmp dl, '9'
- jg .done
- sub dl, '0'
- movzx rdx, dl
- imul rax, rax, 10
- add rax, rdx
- inc rsi
- jmp .d
-.done:
- ret
-
; gen_orients: build the 8 dihedral orientations of every shape as offset lists
; anchored at their row-major-first cell.
gen_orients:
@@ -531,60 +484,3 @@ rec:
pop rbp
pop rbx
ret
-
-print_newline:
- mov rax, SYS_WRITE
- mov rdi, STDOUT
- mov rsi, newline
- mov rdx, 1
- syscall
- ret
-
-print_int64:
- mov rdi, number_buffer+31
- mov byte [rdi], 0
- dec rdi
-
- cmp rax, 0
- jne .conv
-
- mov byte [rdi], '0'
- jmp .done
-.conv:
- mov rbx, 10
-.next:
- xor rdx, rdx
- div rbx
- add dl, '0'
- mov [rdi], dl
- dec rdi
- test rax, rax
- jnz .next
-
- inc rdi
-.done:
- mov rax, SYS_WRITE
- mov rsi, rdi
- mov rdi, STDOUT
- mov rdx, number_buffer+31
- sub rdx, rsi
- syscall
- ret
-
-print_string:
- push rcx
- push rdx
- mov rdx, 0
-.length:
- cmp byte [rcx+rdx], 0
- je .submit
- inc rdx
- jmp .length
-.submit:
- mov rax, SYS_WRITE
- mov rdi, STDOUT
- mov rsi, rcx
- syscall
- pop rdx
- pop rcx
- ret