From 8fbaa207c5e85e81042ce3403fa1e453bef7ca43 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 8 Apr 2024 18:40:38 +0800 Subject: [PATCH] 2020/day3: part1 and part2 --- .gitignore | 1 + 2020/day3/input.txt | 323 +++++++++++++++++++++++++++++++++++++++++++ 2020/day3/sample.txt | 11 ++ 2020/day3/solution.s | 161 +++++++++++++++++++++ 2020/deps.mk | 14 +- Makefile | 2 +- common/div32_16.s | 18 +++ 7 files changed, 527 insertions(+), 3 deletions(-) create mode 100644 2020/day3/input.txt create mode 100644 2020/day3/sample.txt create mode 100644 2020/day3/solution.s create mode 100644 common/div32_16.s diff --git a/.gitignore b/.gitignore index 23c882e..e1938bb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.o *.bin *.d +*.map diff --git a/2020/day3/input.txt b/2020/day3/input.txt new file mode 100644 index 0000000..2d49b8b --- /dev/null +++ b/2020/day3/input.txt @@ -0,0 +1,323 @@ +.#....#..##.#..####....#....... +......#..#....#....###......#.# +#..#.....#..............##.#.#. +#.#...#....#...#......##..#..#. +...#..#.##..#..#........###.#.# +...#.#..........#.........##... +...#.#....#.#....#..#......#... +..##.#.....#.......#.###..#..## +..#.......#.......#....##...... +....##........##.##...#.###.##. +#.......#.......##..#......#... +..##.............##.#......#... +...#.####....#.....#...##...... +.............##.#......#....... +..#...#....#......#....#....... +..#....#..#............#....... +##...#..#........##..#......#.. +##........##........#.#.......# +#.......#........#.#..#....###. +.....#..#.#..........##...#.... +..##...#......#.#...#..#...#... +##.##...#......#....#....#...#. +#.......#..#.#..#....#..###.#.# +#.............#.#....#..#.#.... +...#.......###.#.##.##.#...#..# +.##.......##..##...#..###...... +.......#.#.#.#..####..#..#..#.. +...##......#.#.##.###....#.###. +###......###......#.#####..#... +..#........##..#..##.##..#...#. +.....##..#...#..#.##.....#.#... +#......#.##....#..##.#....#.#.. +##.#.##..#................#.... +......#.#....#......##.....#... +..#...##..#..#...#..#.#..#..... +........#.#.#.##...#.#.....#.#. +#.#......#.....##..#...#....... +..#.#......#...........###..... +......##....#....##..#..#.#.#.# +##....#.###...#......#..#...#.. +#.#.##....###...####.......#..# +##...........#.....#........#.# +.##.#..#.....#......#.......#.. +##..##..###....#.........##.... +..#..#..#.##...#.#...#........# +#.##.###...#.......#........... +.........#.................#... +#.##...#.....#..##........#.... +....#.#...##...#...........#... +.#.....#.#..#...##..##.....#... +.#.....####....#..##..#........ +...#..#......##.#..##.#.#.#..#. +.##.#.....#.....#...#.......##. +......#..#..#......#...####.... +.......#......##..#..##.....#.. +......#.#..#...#..#.#.......... +....##.........#............... +.#....#..##.....#....##.##..... +#.#.....#...#....####....#.#... +#.....#....#.#...#............. +...#..#.....#....##..#..#...... +...#.#............#...........# +###.#..#.#......#.....##.....#. +####....#....###.....#..#.##### +.###..#...#.#..#......##.#.#.#. +.....#.##.#....#..##....#..#..# +...#....#...##.....#......#.#.. +....#...#....#...#....#.....#.# +.#.....#.....#.#..#......#..#.. +..#..##....##.##....#.....##... +#..##...#.##...#..#.#.#.....#.. +...#..##.#..#....#.#....######. +..........#..#.....#....#...##. +#.#####.#.###..#.....#......... +#....#......#..#.#.##.##..###.. +..#...###.#.#....##.##...##.... +.......#....#..#...##......#... +...#.#...#..#.....#..##.#...... +###..##...........#............ +..#....#.##....#.#..##...#..... +##....#...#....#.....#.#..##... +..............#.##.#..#..##.### +......#..#..#..#.#....###...##. +.#...#..#.#.#....#..........#.. +..#.#.....#..#...........#.##.. +...#.#......#......#..#..#.#... +...#....#.#.#.....#...#.##..#.. +.#.#..#...#........##.......#.. +##..........#..#...#....###.#.. +#.....###......#..#.#.#....#.#. +..###.......#.#...............# +#....#.....#.#......#..##.##... +#.##.#.#....#..#.#...#.#...#..# +#....#..#...........#.......#.. +...#.####.....#.........###.##. +......#..#.....#..........#..#. +#...#.#..####...#...#.#.##...## +.##.........#......#.#.#....... +.......##...##.##....###...##.. +...#..#....#..#.#.#.....#.#.... +#....#.#.#.......##..###..##... +......#............#.#...#..#.. +#.#.....#......#...#.......###. +...#.#................#...#.... +.....#......#.#..#...##.#.#...# +#....#.#..#..#..##..#.##..#.... +#.................#..#....#.... +..#....#.......####....###..... +.#..#.#.#...###..#...#..###.... +..#..#.#......#.###..........#. +.....#......#.......##....##.#. +.#....#........#.#.##.#........ +#.#..##..#..#.#...####....##... +...#....#.#..#...#..........#.. +.#.....#.##....#...##.......... +....##....#.....#.....#...#.### +.#...##.#.#..##..#...#.#..#..#. +..#.......#.##.....#.#........# +...#...#.....##..#.#.#....#.... +...#.....#.......##.........#.# +.##.....#..#.#...#.#...#.#...#. +...........#...#.###..#...#..#. +#.##........#..###.##...####... +.#.....#.#...##...#..#..#...##. +..#....#..#...#.....#.....##... +..###..#.#.....##........#.##.. +.#.#..##........#.##....#..#.## +.####.#..##..#.#..#....##....#. +.##....##...#.#........#....... +....#..#..#...#..#..#..#.#..... +...#......................#.... +#.....#.#....#..#..#.#..#....#. +##.....#.....##..........###... +.#..#..............#...##.#.#.# +...#...#.#.............#.#..#.# +..#.....#.......#......#.#..... +.###.#..#..#..#.#..#.....#..... +.....##..##...##.......#....### +.#........###...##..#....##.... +#....#.#......##..#....#.##..#. +#....#.#...#........##...###... +.#.....#...#.###....#.##.#.#### +###......#....#...#....##..#..# +##....#..###......#...#.#.#.... +..........#......##.#..#....... +.#..#......###.........##...#.. +....#......#....#.........#.#.# +##.#.#...#.#...#...#..#......#. +....#.##.........#..#.....##.#. +........#...#..#.#.#.#.....##.. +..#......#.#.#..#.....##....... +..............#....#....##.#..# +....#.#.....#....#.#.###.#....# +..#..........#..#......#.##..#. +...#...#.#.............#..#.... +#.......#..#..##.........##..#. +..##..#............#.....#..... +....#.#..##...#.#..#.........#. +........#.......#.##....#....#. +...#.....#.#.....#.#....#...... +..#......##.#.............#.#.# +#.#.............#.#.....#...... +.##....##.#.....#....#...##.... +.#.#....##....#.....##......... +...#.....#.....#.....#..#.###.. +.......#....#...##.#...#...#..# +..#.#.......#...###.#...#....#. +.....###..##....###.#.##....... +....#..................##.#.##. +.#.......###.##...#.#.....#.... +....#....##...##.....#.#...#..# +#..#.....#......##...#....#.... +#..##.........#.....#...#...... +...#..##.......##......#..##### +.#..###.###.#.##........#...... +.#...#....#....#.#....#...##... +##........#....#.........##..#. +.#.....##............#.#....... +....#....#...........###.....## +.#......#.#.#..#....#.#.....##. +......#.##.#..##....#.#.#..#... +#....#......#...#..####........ +......#..#..##..#.......#.#..#. +##....##.###.#...#.##.#..#.###. +.#.........#...##...#.#......#. +..#.#...........####.#....##.## +.....#.#..##.#...###...#..#.#.. +...#..#..##.#...#.....#.##...## +..##......##..........#..###... +.#......##.....#.##....#.#.##.# +...#.......##..##.....#....#... +.##...#...#....#..#............ +#..#....#...........#.......... +......#...#.#.......#...#.##..# +..#.###..#.....#.....#..#.....# +....#....#..........##....#..#. +.......##.#.#.#......#....#...# +####..#.###........#..#......#. +#........##.#.#.#.............# +.#......#......#..#.##.....#... +.....##.##......##.#.....#.#.#. +.......##.#.....##.......#.#.#. +.#.#..#.#..#.##...#.#....#.#..# +.#..##....#..#...##.......#..#. +.#.#..#.......#................ +#........#.#.#......#.#.#.#.... +##......#...#..##.#...##.##.... +##.#..#...........##...#..###.. +......#.####...#........#.#.#.. +...#........##..###.#.#...#...# +.#.....##..#......##......###.. +..#.#...#......#..#..##.#.....# +#....#..#.#..........#...#..... +.#......#.##..###..#.#....#..## +.......#.......#..#..#......#.. +..##.....##.#..#..#.....##..... +........#.##...#.#.#..#..#..#.. +...#.######.........#.....#..## +.#.#............#....#......... +#...#....###.#......#.#........ +#.........#....#...##.......... +....#...........#.###.#...###.. +.........#........#.#.#..#...#. +.#.......#.#.....#.#.....#.##.. +.....#.......#.....#.#.#....... +#.##..#..##.......#...#......#. +.###.....##...##.#...##.##.#.#. +...#......##..##............#.# +...#......................#..## +#..#..#................#...#... +#..#....#.#.#...##.......#..#.. +....#.#..###.##...#..#.###..#.. +..#...#....####.#............#. +......#....#.#...#.#.#......... +#...#........#.....##..###.#..# +#....#...#...##...#..#....##... +#..#...#..#.......#.#..##.#..#. +#.#..........#...........##.... +.#...###...#......#.......#.#.# +.........#.........#...#...##.. +##.#..###......##..#.....#..#.. +....##...............#.....#... +.....#.....###.#.....#.#....... +....#..#......###..#..##..#.... +......................#.....#.. +..#..#...##....##....#........# +..#....#...#...#.......#.....#. +...##.#.#.##......#.#.#.#.####. +.###...#..#......#.#..#........ +#..#...##.#..#..##..##....#...# +...#...#..#..#..#........#..##. +.##....#.##.#....#...#.#.#....# +#..#....#..#....#.......##..#.# +...#.#....####...........#...#. +#...#####...#.#..#......#...#.# +.##....#.#.#..#......#..##..... +..........#..#.#.#.....##...... +.....#....#..................#. +.........#...#...#....#..###... +.#.#.#....#.................... +......##............##.###..#.. +#.#...#........####.##..#.#.##. +#........#.#.#.#..#.##.....#... +......####..#.##.......#....#.. +.........#...#...#.....#....... +..##.....#...#...#.....##.....# +....#...##....#.....#..#..##.## +..#.........##...##..###..#.... +#....#.#.........##.###.#...##. +.##...#....#..#..#.#....##..... +##..#..#..#...........#.##....# +....#..........#...#..#.....#.. +........###..#..#.#.#.....##... +#...#...#..###............###.. +..#.....#.#.#..#..#.#..#......# +..#...##..#....#...#......#.... +#....#........##.....#..##....# +#.....#.#.#..#.......##.#.#.##. +..##...#...#.....#..........#.. +##.....#....#......#..........# +......#..#..........#.#..####.. +......#...#............##...##. +..#.......##.......#...###.###. +.#..#.#.#...#..##.#......#.#... +.##.....##.#.#...#.##.........# +#.#.######...........#.#####.#. +........#.##...##....##.#.##.#. +....#......#.....#.....###...## +#..............#.#....#.#....#. +....#..###.#.........##.#.#.... +..#.#.#..##....####..........#. +...#..#.......#................ +...#....#..............#....#.. +.....#...#...#....#.#.#..#...#. +......##.............###.##..## +.#...#.#..#......#..#.##....... +##.....#.....#.##...#....#..... +..#..#.#.#.#.#..........#..###. +##..........#........#....#.#.. +.....#...#........#.#..###....# +.###.#........#.##......#.#...# +#...##....#....#....##.#.#..... +.....#.#............#.......... +..#.##....................#.... +.....#..#..#.#..#.##.......#... +.....###......#......##......## +#.....#.#.......##.......#...#. +.#.#...#......#..###...#.....#. +#.#..#...#..##.....#...#.#..#.. +.....#.#..........#..#......... +.###..##..##.....#...#...#..##. +#...#.#....#.......##..#....... +###...#.#.#..#.......#......#.. +....##........#..........##.... +............#....#...........#. +#..#.#....##..#.#..#......##... +.###....##...#....##..........# +.###........#........###.....#. +...#...#.#......#...#....#..... +.###.......#.........#......... +....##.#......#...###......##.# +.###...#..##.....##.......#.... +.#.#...#..#.##....#........#... diff --git a/2020/day3/sample.txt b/2020/day3/sample.txt new file mode 100644 index 0000000..7e88cdc --- /dev/null +++ b/2020/day3/sample.txt @@ -0,0 +1,11 @@ +..##....... +#...#...#.. +.#....#..#. +..#.#...#.# +.#...##..#. +..#.##..... +.#.#.#....# +.#........# +#.##...#... +#...##....# +.#..#...#.# diff --git a/2020/day3/solution.s b/2020/day3/solution.s new file mode 100644 index 0000000..84e9073 --- /dev/null +++ b/2020/day3/solution.s @@ -0,0 +1,161 @@ + .global _start +_start: + mova stack_top,r0 + mov r0,r15 + +_input: + mov.l start,r8 + mov.l size,r9 + + /* returns stride in r1 */ + mova _calculate_stride,r0 + jsr @r0 + mov r8,r1 + + mov r1,r10 /* r10: stride */ + + /* part 1 */ + mov #3,r13 /* right 3 */ + mov #1,r14 /* down 1 */ + + mova _solve,r0 + jsr @r0 + nop + + ldc r7,gbr /* part1 answer */ + + /* part 2 */ + mova part2_data,r0 + mov r0,r4 /* r4: part2 data start */ + mov #10,r3 + add r4,r3 /* r3: part2 data end */ + + mov #1,r6 /* r6: tree multiplier */ + +part2_loop: + mov.b @r4+,r13 /* right */ + mov.b @r4+,r14 /* down */ + + mova _solve,r0 + jsr @r0 + nop + + dmulu.l r7,r6 + cmp/eq r4,r3 + bf/s part2_loop + sts macl,r6 + + /* part2 answer : mach,macl */ + + trapa #0 + + /* right, down */ + .balign 4 +part2_data: + .byte 1, 1 + .byte 3, 1 + .byte 5, 1 + .byte 7, 1 + .byte 1, 2 + + /* r7: number of trees (in/out) */ + .balign 4 +_solve: + /* initial state */ + mov #0,r7 /* number of trees encountered */ + mov #0,r11 /* position X */ + mov #0,r12 /* position Y */ +solve_loop: + /* return value in r1 */ + sts.l pr,@-r15 + mova _slope_step,r0 + jsr @r0 + nop + lds.l @r15+,pr + + cmp/pz r1 /* r1 ≥ 0 */ + bf solve_end /* this is the end */ + bra solve_loop + add r1,r7 /* increment tree count */ + +solve_end: + rts + nop + + .balign 4 +_slope_step: + /* r11: position X */ + /* r12: position Y */ + /* r13: right N */ + /* r14: down N */ + /* r8 : start */ + /* r9 : size */ + /* r10: stride */ + /* return r1 : tree encountered (-1,0,1) */ + + add r13,r11 /* r11 + r13 → r11 (X) */ + add r14,r12 /* r12 + r14 → r12 (Y) */ + + /* Y-coordinate × stride → r5 */ + mulu.w r10,r12 /* offset */ + sts macl,r5 + + sts.l pr,@-r15 + + /* X-axis wrap-around */ + mov r11,r1 + mov r10,r0 + add #-1,r0 /* subtract 1 to remove newline */ + mov.l div32_16_ptr,r2 + jsr @r2 /* r1 ÷ r0 → r1 ; (clobbers r0,r1) */ + mov r0,r2 /* save width in r2 (not clobbered) */ + + lds.l @r15+,pr + + /* recover the modulus with a multiplication + subtraction */ + mulu.w r2,r1 + sts macl,r1 + mov r11,r0 + sub r1,r0 /* r0 - r1 → r0 + + /* calculate offset (y_off + x_off → off) */ + add r5,r0 + /* compare r0 offset with r9 size */ + cmp/hs r9,r0 /* r0 ≥ r9 → T */ + bt end_of_slope + + /* get tree */ + mov.b @(r0,r8),r0 + cmp/eq #0x23,r0 /* 0x23 ascii `#` */ + rts + movt r1 +end_of_slope: + rts + mov #-1,r1 /* -1: end of slope */ + + .balign 4 +div32_16_ptr: .long _div32_16 + + .balign 4 +_calculate_stride: + /* r8: const input start */ + /* r1: input start (initialized by caller) */ + /* return r1 : stride */ +loop: + mov.b @r1+,r0 + cmp/eq #0xa,r0 /* ascii space */ + bf loop + sub r8,r1 /* r1 - r8 → r1 */ + rts + nop + + .balign 4 +start: .long _binary_2020_day3_input_txt_start +size: .long _binary_2020_day3_input_txt_size + + .balign 4 +stack_bot: + .rept 16 + .long 0 + .endr +stack_top: diff --git a/2020/deps.mk b/2020/deps.mk index c21c53f..f79ab0d 100644 --- a/2020/deps.mk +++ b/2020/deps.mk @@ -4,8 +4,18 @@ 2020/day2/input.txt.o \ common/parse_base10.o -2020/day2/solution.elf: 2020/day2/solution.elf: $(2020_DAY2_OBJ) $(DEFAULT_LINK) -ALL_ELF += 2020/day2/solution.elf +2020_DAY3_OBJ = \ + 2020/day3/solution.o \ + 2020/day3/sample.txt.o \ + 2020/day3/input.txt.o \ + common/div32_16.o + +2020/day3/solution.elf: $(2020_DAY3_OBJ) + $(DEFAULT_LINK) + +ALL_ELF += \ + 2020/day2/solution.elf \ + 2020/day3/solution.elf diff --git a/Makefile b/Makefile index 21fddf4..f8560ef 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ endef clean: find -P \ -regextype posix-egrep \ - -regex '.*\.(o|bin|elf|d)$$' \ + -regex '.*\.(o|bin|elf|d|map)$$' \ -exec rm {} \; .SUFFIXES: diff --git a/common/div32_16.s b/common/div32_16.s new file mode 100644 index 0000000..728a00b --- /dev/null +++ b/common/div32_16.s @@ -0,0 +1,18 @@ + .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 */