125 lines
1.9 KiB
ArmAsm
125 lines
1.9 KiB
ArmAsm
.global _start
|
|
_start:
|
|
/* part1 */
|
|
mova _part_fuel,r0
|
|
mov r0,r12
|
|
mova _accumulate,r0
|
|
jsr @r0
|
|
nop
|
|
mov r10,r11 /* r11: part1 answer */
|
|
|
|
/* part2 */
|
|
mova _part2_fuel,r0
|
|
mov r0,r12
|
|
mova _accumulate,r0
|
|
jsr @r0
|
|
nop /* r10: part2 answer */
|
|
|
|
forever:
|
|
bra forever
|
|
nop
|
|
|
|
/* r12: fuel function */
|
|
.align 4
|
|
_accumulate:
|
|
mov.l start,r8
|
|
mov.l end,r9
|
|
mov #0,r10 /* r10: sum */
|
|
sts pr,r15 /* save PR */
|
|
accumulator_loop:
|
|
cmp/hs r9,r8 /* Rn ≥ Rm (unsigned) */
|
|
bt accumulator_rts
|
|
mova _parse_int,r0
|
|
jsr @r0
|
|
nop
|
|
|
|
jsr @r12
|
|
nop
|
|
bra accumulator_loop
|
|
add r1,r10
|
|
|
|
accumulator_rts:
|
|
lds r15,pr /* restore PR */
|
|
rts
|
|
nop
|
|
|
|
.align 4
|
|
start: .long _binary_2019_day1_input_txt_start
|
|
end: .long _binary_2019_day1_input_txt_end
|
|
|
|
.global _parse_int
|
|
.align 4
|
|
_parse_int:
|
|
/* r8 = pointer to text ; r1 = number */
|
|
mov #0,r1 /* r1: accumulated number */
|
|
parse_int_loop:
|
|
mov.b @r8+,r2
|
|
add #-48,r2 /* ascii '0' */
|
|
cmp/pz r2 /* Rn >= 0 (signed) (r2 >= 0 ) */
|
|
bf/s parse_int_rts
|
|
mov #9,r4 /* const 9 */
|
|
cmp/ge r2,r4 /* Rn >= Rm (signed) ( 9 >= r2) */
|
|
bf/s parse_int_rts
|
|
mov #10,r4 /* const 10 */
|
|
mulu.w r1,r4
|
|
sts macl,r1
|
|
bra parse_int_loop
|
|
add r2,r1
|
|
parse_int_rts:
|
|
rts
|
|
nop
|
|
|
|
.global _part2_fuel
|
|
.align 4
|
|
_part2_fuel:
|
|
/* r1 = mass */
|
|
sts pr,r13 /* save PR */
|
|
mov #0,r5 /* r5: fuel sum */
|
|
|
|
part2_fuel_for_fuel:
|
|
mova _part_fuel,r0
|
|
jsr @r0
|
|
nop
|
|
|
|
cmp/pl r1 /* signed Rn > 0 */
|
|
bf part2_rts
|
|
bra part2_fuel_for_fuel
|
|
add r1,r5
|
|
|
|
part2_rts:
|
|
lds r13,pr /* restore PR */
|
|
rts
|
|
mov r5,r1
|
|
|
|
.global _part_fuel
|
|
.align 4
|
|
_part_fuel:
|
|
/* r1 = mass */
|
|
sts pr,r14 /* save PR */
|
|
mova _div32_16,r0
|
|
jsr @r0
|
|
mov #3,r0
|
|
lds r14,pr /* restore PR */
|
|
rts
|
|
add #-2,r1
|
|
|
|
|
|
.global _div32_16
|
|
.align 4
|
|
_div32_16:
|
|
/* r1 (32 bits) ÷ r0 (16 bits) */
|
|
shll16 r0
|
|
cmp/hs r0,r1
|
|
bt over_div
|
|
div0u
|
|
.rept 16
|
|
div1 r0,r1
|
|
.endr
|
|
rotcl r1
|
|
rts
|
|
extu.w r1,r1
|
|
over_div:
|
|
bra over_div
|
|
nop
|
|
/* r1 = quotient */
|