75 lines
1.1 KiB
ArmAsm
75 lines
1.1 KiB
ArmAsm
|
global _start
|
||
|
[bits 32]
|
||
|
[section .text]
|
||
|
|
||
|
%include "utils.s"
|
||
|
|
||
|
_start:
|
||
|
|
||
|
mov esi, file
|
||
|
xor ebp, ebp ; line num
|
||
|
; for chars in line
|
||
|
do_line:
|
||
|
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 the next spot to after this
|
||
|
lea eax, [ebp+1]
|
||
|
mov [col_next_spot+ebx], al
|
||
|
jmp .cont
|
||
|
.round_rock:
|
||
|
; add to next spot line load
|
||
|
movzx eax, byte [col_next_spot+ebx]
|
||
|
inc byte [line_load_cnt+eax]
|
||
|
; increment next spot
|
||
|
inc byte [col_next_spot+ebx]
|
||
|
jmp .cont
|
||
|
line_done:
|
||
|
inc ebp ; line num
|
||
|
cmp esi, file.over
|
||
|
jb do_line
|
||
|
|
||
|
lea ecx, [ebp-1]
|
||
|
output_loads:
|
||
|
mov ebx, ebp
|
||
|
sub ebx, ecx
|
||
|
mov eax, ebx
|
||
|
call print_dec
|
||
|
call space
|
||
|
movzx eax, byte [ecx+line_load_cnt-1]
|
||
|
call print_dec
|
||
|
call space
|
||
|
mul ebx
|
||
|
call print_dec
|
||
|
call newline
|
||
|
add [final_value], eax
|
||
|
loop output_loads
|
||
|
|
||
|
game_over:
|
||
|
mov eax, [final_value]
|
||
|
call print_dec
|
||
|
call newline
|
||
|
jmp exit
|
||
|
|
||
|
[section .data]
|
||
|
line_len: dd 0
|
||
|
final_value: dd 0
|
||
|
file: incbin "input"
|
||
|
.over:
|
||
|
|
||
|
[section .bss]
|
||
|
col_next_spot: resb 128
|
||
|
line_load_cnt: resb 128
|