advent-of-sh/2019/day1/part1_part2.s

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 */