adventofcode2023/14/main.s
2023-12-14 14:30:56 -06:00

356 lines
5.8 KiB
ArmAsm

global _start
[bits 32]
[section .text]
;%define LINE_LEN 11
;%define LINE_CNT 10
%define LINE_LEN 101
%define LINE_CNT 100
%define CYCLE_CNT 1000000000
%include "utils.s"
_start:
push CYCLE_CNT
fucking:
mov eax, [esp]
and eax, 0xfffff
jnz north
mov eax, [esp]
call print_dec
call newline
; north cycle
north:
; init next spots
mov edi, next_spot
mov eax, file
.init_spots:
stosd
inc eax
cmp eax, file+LINE_LEN
jb .init_spots
mov esi, file
; for chars in line
.do_stuff:
xor ebx, ebx ; col num
jmp .loop
.cont:
inc ebx ; col num
.loop:
lodsb
cmp al, 10 ; \n
je .line_done
cmp al, '#'
je .cube_rock
cmp al, 'O'
je .round_rock
; else .
jmp .cont
.cube_rock:
; move next spot to next line
lea eax, [esi+LINE_LEN-1]
mov [next_spot+ebx*4], eax
jmp .cont
.round_rock:
; move rock
mov byte [esi-1], '.'
mov edi, [next_spot+ebx*4]
mov byte [edi], 'O'
; move next spot to next line
add dword [next_spot+ebx*4], LINE_LEN
jmp .cont
.line_done:
cmp esi, file.over
jb .do_stuff
;mov esi, file
;mov ecx, file.over - file
;call print_string
;call newline
; west cycle
west:
; init next spots
mov edi, next_spot
mov eax, file ; start of first line
.init_spots:
stosd
add eax, LINE_LEN ; start of next line
cmp eax, file+(LINE_LEN*LINE_CNT)
jb .init_spots
mov esi, file ; start of first col
mov edx, esi ; save this whatever
; for chars in col
.do_stuff:
xor ebx, ebx ; line num
jmp .loop
.cont:
inc ebx ; line num
cmp esi, file.over
jae .line_done
.loop:
mov al, [esi]
add esi, LINE_LEN ; next line
cmp al, '#'
je .cube_rock
cmp al, 'O'
je .round_rock
; else .
jmp .cont
.cube_rock:
; move next spot to next column
lea eax, [esi-LINE_LEN+1]
mov [next_spot+ebx*4], eax
jmp .cont
.round_rock:
; move rock
mov byte [esi-LINE_LEN], '.'
mov edi, [next_spot+ebx*4]
mov byte [edi], 'O'
; move next spot to next column
inc dword [next_spot+ebx*4]
jmp .cont
.line_done:
inc edx ; next col
mov esi, edx
cmp esi, file+LINE_LEN
jb .do_stuff
;mov esi, file
;mov ecx, file.over - file
;call print_string
;call newline
; south cycle
south:
; init next spots
mov edi, next_spot
mov eax, file+((LINE_CNT-1)*LINE_LEN) ; start of final line
.init_spots:
stosd
inc eax
cmp eax, file+(LINE_CNT*LINE_LEN)
jb .init_spots
mov esi, file+((LINE_CNT-1)*LINE_LEN) ; start of final line
; for chars in line
.do_stuff:
xor ebx, ebx ; col num
jmp .loop
.cont:
inc ebx ; col num
.loop:
lodsb
cmp al, 10 ; \n
je .line_done
cmp al, '#'
je .cube_rock
cmp al, 'O'
je .round_rock
; else .
jmp .cont
.cube_rock:
; move next spot to previous line
lea eax, [esi-LINE_LEN-1]
mov [next_spot+ebx*4], eax
jmp .cont
.round_rock:
; move rock
mov byte [esi-1], '.'
mov edi, [next_spot+ebx*4]
mov byte [edi], 'O'
; move next spot to previous line
sub dword [next_spot+ebx*4], LINE_LEN
jmp .cont
.line_done:
sub esi, LINE_LEN*2
cmp esi, file
jae .do_stuff
;mov esi, file
;mov ecx, file.over - file
;call print_string
;call newline
; east cycle
east:
; init next spots
mov edi, next_spot
mov eax, file+LINE_LEN-2 ; end of first line
.init_spots:
stosd
add eax, LINE_LEN ; end of next line
cmp eax, file.over
jb .init_spots
mov esi, file+LINE_LEN-2 ; end of first col
mov edx, esi ; save this whatever
; for chars in col
.do_stuff:
xor ebx, ebx ; line num
jmp .loop
.cont:
inc ebx ; line num
cmp esi, file.over
jae .line_done
.loop:
mov al, [esi]
add esi, LINE_LEN ; next line
cmp al, '#'
je .cube_rock
cmp al, 'O'
je .round_rock
; else .
jmp .cont
.cube_rock:
; move next spot to previous column
lea eax, [esi-LINE_LEN-1]
mov [next_spot+ebx*4], eax
jmp .cont
.round_rock:
; move rock
mov byte [esi-LINE_LEN], '.'
mov edi, [next_spot+ebx*4]
mov byte [edi], 'O'
; move next spot to previous column
dec dword [next_spot+ebx*4]
jmp .cont
.line_done:
dec edx ; previous col
mov esi, edx
cmp esi, file
jae .do_stuff
;mov esi, file
;mov ecx, file.over - file
;call print_string
;call newline
mov dword [final_value], 0
int_calc_load:
xor ebx, ebx ; line num
mov edi, file+((LINE_CNT-1)*LINE_LEN) ; start of final line
.proc_line:
inc ebx
mov esi, edi
mov ecx, LINE_CNT ; skip \n
xor edx, edx ; O cnt
.add_stuff:
lodsb
cmp al, 'O'
jne .cont
inc edx
.cont:
loop .add_stuff
mov eax, edx
mul ebx
add [final_value], eax
sub edi, LINE_LEN
cmp edi, file
jae .proc_line
mov eax, [final_value]
mov esi, answer_bs
check_answers:
cmp esi, answer_bs.end
jb .w
mov esi, error_str
mov ecx, error_str.end - error_str
call print_string
jmp exit
.w:
cmp dword [esi], 0
je .new
cmp [esi], eax
je .found
.cont:
add esi, 16
jmp check_answers
.new:
mov [esi], eax
mov ebx, CYCLE_CNT
sub ebx, [esp]
mov [esi+4], ebx
mov dword [esi+8], 0 ; cycle
mov dword [esi+12], 1 ; seen times
jmp .whatever
.found:
mov ebx, CYCLE_CNT
sub ebx, [esp] ; found num
mov edx, ebx
sub edx, [esi+4] ; last found num
cmp dword [esi+8], 1
jbe .first_seen
cmp edx, [esi+8] ; last cycle
jne .cont
mov [esi+4], ebx
inc dword [esi+12] ; seen times
cmp dword [esi+12], 5
jl .whatever
mov eax, CYCLE_CNT-1
sub eax, dword [esi+4]
xor edx, edx
div dword [esi+8]
test edx, edx
jnz .whatever
mov dword [esp], 1
jmp .whatever
.first_seen:
mov [esi+4], ebx
mov [esi+8], edx
inc dword [esi+12] ; seen times
.whatever:
dec dword [esp]
jnz fucking
print_answer_cycles:
mov esi, answer_bs
.loop:
cmp dword [esi], 0
je game_over
cmp dword [esi+12], 5
jl .cont
mov eax, dword [esi]
call print_dec
call space
mov eax, dword [esi+4]
call print_dec
call space
mov eax, dword [esi+8]
call print_dec
call space
mov eax, dword [esi+12]
call print_dec
call space
cmp dword [esi+8], 1
jbe .zeroorone
mov eax, CYCLE_CNT-1
sub eax, dword [esi+4]
xor edx, edx
div dword [esi+8]
mov eax, edx
call print_dec ; one of these that gets printed as 0 is answer
.zeroorone:
call newline
.cont:
add esi, 16
jmp .loop
game_over:
jmp exit
[section .data]
final_value: dd 0
file: incbin "input"
.over:
error_str: db ":c too much super num"
.end:
[section .bss]
next_spot: resd 128
answer_bs: resd 1024 ; increase if failing ig
.end: