day 18 part 2
This commit is contained in:
parent
5db47a3fcc
commit
0785e7ccd0
@ -1,3 +1,6 @@
|
||||
all:
|
||||
nasm -g -felf32 main.s && ld -melf_i386 -g main.o
|
||||
nasm -g -felf64 main.s && ld -g main.o
|
||||
|
||||
part_1:
|
||||
nasm -g -felf32 main_part1.s && ld -melf_i386 -g main_part1.o
|
||||
|
||||
|
172
18/main.s
172
18/main.s
@ -1,149 +1,65 @@
|
||||
%include "utils.s"
|
||||
%include "utils64.s"
|
||||
|
||||
global _start
|
||||
[bits 32]
|
||||
[bits 64]
|
||||
[section .text]
|
||||
|
||||
%define FILENAME "input"
|
||||
;%define FILENAME "input_test"
|
||||
|
||||
;%define PRINT
|
||||
|
||||
_start:
|
||||
mov esi, file
|
||||
mov edi, array+1024*512+512 ; like, the middle idk
|
||||
mov byte [edi], 1 ; filled!
|
||||
|
||||
mov rsi, file
|
||||
mov rbp, 11_000_000_000 ; vert
|
||||
mov rdi, 1 ; area
|
||||
proc_line:
|
||||
cmp esi, file.over
|
||||
cmp rsi, file.over
|
||||
jae .done
|
||||
lodsb ; RDLU
|
||||
%ifdef PRINT
|
||||
call print_char
|
||||
call space
|
||||
%endif
|
||||
mov ebx, eax
|
||||
inc esi ; space
|
||||
call dec_parse ; count
|
||||
%ifdef PRINT
|
||||
call print_dec
|
||||
call newline
|
||||
%endif
|
||||
; skip to next line
|
||||
add esi, 10
|
||||
; put in array
|
||||
cmp bl, 'R'
|
||||
mov ecx, 1
|
||||
cmove edx, ecx
|
||||
cmp bl, 'L'
|
||||
mov ecx, -1
|
||||
cmove edx, ecx
|
||||
cmp bl, 'D'
|
||||
mov ecx, 1024
|
||||
cmove edx, ecx
|
||||
cmp bl, 'U'
|
||||
mov ecx, -1024
|
||||
cmove edx, ecx
|
||||
mov ecx, eax
|
||||
.draw:
|
||||
add edi, edx
|
||||
mov byte [edi], 1
|
||||
loop .draw
|
||||
mov al, '#'
|
||||
mov rcx, 32
|
||||
xchg rdi, rsi
|
||||
repne scasb
|
||||
xchg rdi, rsi
|
||||
call hex_parse
|
||||
mov rbx, rax
|
||||
and bl, 3
|
||||
shr rax, 4
|
||||
inc rsi ; \n
|
||||
; process shit
|
||||
cmp bl, 0
|
||||
je .r
|
||||
cmp bl, 1
|
||||
je .d
|
||||
cmp bl, 2
|
||||
je .l
|
||||
cmp bl, 3
|
||||
je .u
|
||||
.r:
|
||||
add rdi, rax
|
||||
mul rbp
|
||||
add rdi, rax
|
||||
jmp proc_line
|
||||
.l:
|
||||
mul rbp
|
||||
sub rdi, rax
|
||||
jmp proc_line
|
||||
.d:
|
||||
add rdi, rax
|
||||
sub rbp, rax
|
||||
jmp proc_line
|
||||
.u:
|
||||
add rbp, rax
|
||||
jmp proc_line
|
||||
.done:
|
||||
|
||||
%ifdef PRINT
|
||||
print_array:
|
||||
call newline
|
||||
mov esi, array
|
||||
xor ecx, ecx
|
||||
.inner:
|
||||
mov bl, '.'
|
||||
lodsb
|
||||
test al, al
|
||||
mov dl, '#'
|
||||
cmovnz bx, dx
|
||||
mov al, bl
|
||||
call print_char
|
||||
inc ecx
|
||||
cmp ecx, 1024*1024
|
||||
jae .done
|
||||
mov ebx, ecx
|
||||
and ebx, 1023
|
||||
jnz .inner
|
||||
call newline
|
||||
jmp .inner
|
||||
.done:
|
||||
call newline
|
||||
%endif
|
||||
|
||||
xor ecx, ecx ; x = 0
|
||||
xor ebx, ebx ; y = 0
|
||||
mov ebp, 1024*1024 ; count
|
||||
call flood_fill
|
||||
jmp flood_done
|
||||
|
||||
flood_fill:
|
||||
mov eax, ebx
|
||||
shl eax, 10
|
||||
cmp byte [array+eax+ecx], 0
|
||||
je .zero
|
||||
ret
|
||||
.zero:
|
||||
dec ebp
|
||||
mov byte [array+eax+ecx], 1
|
||||
sub esp, 8
|
||||
mov [esp+4], ecx
|
||||
mov [esp+0], ebx
|
||||
.t_right:
|
||||
cmp ecx, 1023
|
||||
je .t_left
|
||||
inc ecx
|
||||
call flood_fill
|
||||
mov ecx, [esp+4]
|
||||
.t_left:
|
||||
cmp ecx, 0
|
||||
je .t_down
|
||||
dec ecx
|
||||
call flood_fill
|
||||
mov ecx, [esp+4]
|
||||
.t_down:
|
||||
cmp ebx, 1023
|
||||
je .t_up
|
||||
inc ebx
|
||||
call flood_fill
|
||||
mov ebx, [esp+0]
|
||||
.t_up:
|
||||
cmp ebx, 0
|
||||
je .ret
|
||||
dec ebx
|
||||
call flood_fill
|
||||
mov ebx, [esp+0]
|
||||
.ret:
|
||||
add esp, 8
|
||||
ret
|
||||
|
||||
flood_done:
|
||||
mov [final_value], ebp
|
||||
|
||||
game_over:
|
||||
mov eax, [final_value]
|
||||
call print_dec
|
||||
call newline
|
||||
jmp exit
|
||||
|
||||
PANIC:
|
||||
p_string panic_str
|
||||
jmp exit
|
||||
hlt:
|
||||
hlt ; go get a debugger, answer in rdi
|
||||
jmp hlt
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
final_value: dq 0
|
||||
file: incbin FILENAME
|
||||
.over:
|
||||
|
||||
[section .bss]
|
||||
array: resb 1024*1024
|
||||
|
||||
[section .rodata]
|
||||
panic_str: db 10, "AAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!11111111", 10
|
||||
.over:
|
||||
|
149
18/main_part1.s
Normal file
149
18/main_part1.s
Normal file
@ -0,0 +1,149 @@
|
||||
%include "utils.s"
|
||||
|
||||
global _start
|
||||
[bits 32]
|
||||
[section .text]
|
||||
|
||||
%define FILENAME "input"
|
||||
;%define FILENAME "input_test"
|
||||
|
||||
;%define PRINT
|
||||
|
||||
_start:
|
||||
mov esi, file
|
||||
mov edi, array+1024*512+512 ; like, the middle idk
|
||||
mov byte [edi], 1 ; filled!
|
||||
|
||||
proc_line:
|
||||
cmp esi, file.over
|
||||
jae .done
|
||||
lodsb ; RDLU
|
||||
%ifdef PRINT
|
||||
call print_char
|
||||
call space
|
||||
%endif
|
||||
mov ebx, eax
|
||||
inc esi ; space
|
||||
call dec_parse ; count
|
||||
%ifdef PRINT
|
||||
call print_dec
|
||||
call newline
|
||||
%endif
|
||||
; skip to next line
|
||||
add esi, 10
|
||||
; put in array
|
||||
cmp bl, 'R'
|
||||
mov ecx, 1
|
||||
cmove edx, ecx
|
||||
cmp bl, 'L'
|
||||
mov ecx, -1
|
||||
cmove edx, ecx
|
||||
cmp bl, 'D'
|
||||
mov ecx, 1024
|
||||
cmove edx, ecx
|
||||
cmp bl, 'U'
|
||||
mov ecx, -1024
|
||||
cmove edx, ecx
|
||||
mov ecx, eax
|
||||
.draw:
|
||||
add edi, edx
|
||||
mov byte [edi], 1
|
||||
loop .draw
|
||||
jmp proc_line
|
||||
.done:
|
||||
|
||||
%ifdef PRINT
|
||||
print_array:
|
||||
call newline
|
||||
mov esi, array
|
||||
xor ecx, ecx
|
||||
.inner:
|
||||
mov bl, '.'
|
||||
lodsb
|
||||
test al, al
|
||||
mov dl, '#'
|
||||
cmovnz bx, dx
|
||||
mov al, bl
|
||||
call print_char
|
||||
inc ecx
|
||||
cmp ecx, 1024*1024
|
||||
jae .done
|
||||
mov ebx, ecx
|
||||
and ebx, 1023
|
||||
jnz .inner
|
||||
call newline
|
||||
jmp .inner
|
||||
.done:
|
||||
call newline
|
||||
%endif
|
||||
|
||||
xor ecx, ecx ; x = 0
|
||||
xor ebx, ebx ; y = 0
|
||||
mov ebp, 1024*1024 ; count
|
||||
call flood_fill
|
||||
jmp flood_done
|
||||
|
||||
flood_fill:
|
||||
mov eax, ebx
|
||||
shl eax, 10
|
||||
cmp byte [array+eax+ecx], 0
|
||||
je .zero
|
||||
ret
|
||||
.zero:
|
||||
dec ebp
|
||||
mov byte [array+eax+ecx], 1
|
||||
sub esp, 8
|
||||
mov [esp+4], ecx
|
||||
mov [esp+0], ebx
|
||||
.t_right:
|
||||
cmp ecx, 1023
|
||||
je .t_left
|
||||
inc ecx
|
||||
call flood_fill
|
||||
mov ecx, [esp+4]
|
||||
.t_left:
|
||||
cmp ecx, 0
|
||||
je .t_down
|
||||
dec ecx
|
||||
call flood_fill
|
||||
mov ecx, [esp+4]
|
||||
.t_down:
|
||||
cmp ebx, 1023
|
||||
je .t_up
|
||||
inc ebx
|
||||
call flood_fill
|
||||
mov ebx, [esp+0]
|
||||
.t_up:
|
||||
cmp ebx, 0
|
||||
je .ret
|
||||
dec ebx
|
||||
call flood_fill
|
||||
mov ebx, [esp+0]
|
||||
.ret:
|
||||
add esp, 8
|
||||
ret
|
||||
|
||||
flood_done:
|
||||
mov [final_value], ebp
|
||||
|
||||
game_over:
|
||||
mov eax, [final_value]
|
||||
call print_dec
|
||||
call newline
|
||||
jmp exit
|
||||
|
||||
PANIC:
|
||||
p_string panic_str
|
||||
jmp exit
|
||||
|
||||
[section .data]
|
||||
final_value: dd 0
|
||||
file: incbin FILENAME
|
||||
.over:
|
||||
|
||||
[section .bss]
|
||||
array: resb 1024*1024
|
||||
|
||||
[section .rodata]
|
||||
panic_str: db 10, "AAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!11111111", 10
|
||||
.over:
|
117
18/utils64.s
Normal file
117
18/utils64.s
Normal file
@ -0,0 +1,117 @@
|
||||
[bits 64]
|
||||
[section .text]
|
||||
; string input in RSI
|
||||
; value in RAX
|
||||
; CF set if none, clear if some
|
||||
; RSI set past checked area
|
||||
dec_parse:
|
||||
sub rsp, 24
|
||||
mov [rsp+16], rbx
|
||||
mov [rsp+8], rdx
|
||||
mov [rsp+0], rdi
|
||||
xor rax, rax
|
||||
xor rdi, rdi
|
||||
mov rbx, 10 ; base
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .no_input
|
||||
cmp al, 9
|
||||
jle .got_char
|
||||
.no_input:
|
||||
stc ; set CF
|
||||
jmp .done
|
||||
.loop:
|
||||
xor rax,rax
|
||||
lodsb
|
||||
sub al, '0'
|
||||
js .dec_done
|
||||
cmp al, 9
|
||||
jg .dec_done
|
||||
.got_char:
|
||||
xchg rdi,rax
|
||||
mul rbx
|
||||
add rdi,rax
|
||||
jmp .loop
|
||||
.dec_done:
|
||||
clc ; clear CF
|
||||
.done:
|
||||
mov rax, rdi
|
||||
mov rdi, [rsp+0]
|
||||
mov rdx, [rsp+8]
|
||||
mov rbx, [rsp+16]
|
||||
add rsp, 24
|
||||
ret
|
||||
|
||||
; string input in RSI
|
||||
; value in RAX
|
||||
; CF set if none, cear if some
|
||||
; RSI set past checked area
|
||||
hex_parse:
|
||||
sub rsp, 24
|
||||
mov [rsp+16], rbx
|
||||
mov [rsp+8], rdx
|
||||
mov [rsp+0], rdi
|
||||
xor rax, rax
|
||||
xor rdi, rdi
|
||||
lodsb
|
||||
cmp al, '0'
|
||||
jb .no_input
|
||||
cmp al, '9'
|
||||
jbe .got_dec_char
|
||||
cmp al, 'A'
|
||||
jb .no_input
|
||||
cmp al, 'F'
|
||||
jbe .got_ualpha_char
|
||||
cmp al, 'a'
|
||||
jb .no_input
|
||||
cmp al, 'f'
|
||||
jbe .got_ualpha_char
|
||||
.no_input:
|
||||
stc ; set CF
|
||||
jmp .done
|
||||
.loop:
|
||||
xor rax,rax
|
||||
lodsb
|
||||
cmp al, '0'
|
||||
jb .hex_done
|
||||
cmp al, '9'
|
||||
jbe .got_dec_char
|
||||
cmp al, 'A'
|
||||
jb .hex_done
|
||||
cmp al, 'F'
|
||||
jbe .got_ualpha_char
|
||||
cmp al, 'a'
|
||||
jb .hex_done
|
||||
cmp al, 'f'
|
||||
jbe .got_ualpha_char
|
||||
jmp .hex_done
|
||||
.got_dec_char:
|
||||
sub al, '0'
|
||||
xchg rdi,rax
|
||||
shl rax, 4
|
||||
add rdi,rax
|
||||
jmp .loop
|
||||
.got_alpha_char:
|
||||
sub al, 'A'-10
|
||||
xchg rdi,rax
|
||||
shl rax, 4
|
||||
add rdi,rax
|
||||
jmp .loop
|
||||
.got_ualpha_char:
|
||||
sub al, 'a'-10
|
||||
xchg rdi,rax
|
||||
shl rax, 4
|
||||
add rdi,rax
|
||||
jmp .loop
|
||||
.hex_done:
|
||||
clc ; clear CF
|
||||
.done:
|
||||
mov rax, rdi
|
||||
mov rdi, [rsp+0]
|
||||
mov rdx, [rsp+8]
|
||||
mov rbx, [rsp+16]
|
||||
add rsp, 24
|
||||
ret
|
||||
|
||||
; --- MACROS ---
|
||||
%define len(x) x %+ .over - x
|
Loading…
Reference in New Issue
Block a user