.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: /* r0 = 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 */