Compare commits

...

2 Commits

Author SHA1 Message Date
8fbaa207c5 2020/day3: part1 and part2 2024-04-08 18:41:32 +08:00
8868221a5b 2020/day2: part1 and part2 2024-04-08 18:41:26 +08:00
13 changed files with 1703 additions and 3 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
*.o *.o
*.bin *.bin
*.d *.d
*.map

View File

@ -50,7 +50,7 @@ end: .long _binary_2019_day1_input_txt_end
.global _parse_int .global _parse_int
.align 4 .align 4
_parse_int: _parse_int:
/* r0 = pointer to text ; r1 = number */ /* r8 = pointer to text ; r1 = number */
mov #0,r1 /* r1: accumulated number */ mov #0,r1 /* r1: accumulated number */
parse_int_loop: parse_int_loop:
mov.b @r8+,r2 mov.b @r8+,r2

View File

@ -1,2 +1,2 @@
2019/day1/part1.elf: 2019/day1/part1_part2.o 2019/day1/sample.txt.o 2019/day1/input.txt.o 2019/day1/part1_part2.elf: 2019/day1/part1_part2.o 2019/day1/sample.txt.o 2019/day1/input.txt.o
$(DEFAULT_LINK) $(DEFAULT_LINK)

1000
2020/day2/input.txt Normal file

File diff suppressed because it is too large Load Diff

3
2020/day2/sample.txt Normal file
View File

@ -0,0 +1,3 @@
1-3 a: abcde
1-3 b: cdefg
2-9 c: ccccccccc

134
2020/day2/solution.s Normal file
View File

@ -0,0 +1,134 @@
.global _start
_start:
mova stack_top,r0
mov r0,r15
/* part1 */
mova _part1,r0
mov r0,r14
mova solve,r0
jsr @r0
nop
/* move part1 answer to GBR */
ldc r13,gbr
/* part2 */
mova _part2,r0
mov r0,r14
mova solve,r0
jsr @r0
nop
/* move part2 answer to VBR */
ldc r13,vbr
trapa #0
/* return number of valid passwords in r13 */
.balign 4
solve:
sts.l pr,@-r15
mov.l start,r8
mov.l end,r9
/* password is from r1 to r8, excluding r8; next line is at r8 */
mov #0,r13
line_loop:
mova _parse_line,r0
jsr @r0
nop
jsr @r14
nop
cmp/eq r8,r9
bf/s line_loop
add r1,r13
lds.l @r15+,pr
rts
nop
/* return: valid as `1` in r1 */
/* r10: test position 1 */
/* r11: test position 2 */
/* r12: test character */
.balign 4
_part2:
add #-1,r1 /* offset for 1-based indexing */
mov r10,r0
mov.b @(r0,r1),r3 /* r3: character */
cmp/eq r3,r12
movt r2
mov r11,r0
mov.b @(r0,r1),r3 /* r3: character */
cmp/eq r3,r12
movt r1
rts
xor r2,r1
/* return: valid as `1` in r1 */
/* r10: count >= lower bound */
/* r11: count <= upper bound */
/* r12: test character */
.balign 4
_part1:
mov #0,r2 /* r2: count */
part1_loop:
cmp/eq r1,r8
bt part1_break
mov.b @r1+,r3 /* r3: character */
cmp/eq r3,r12
movt r0
bra part1_loop
add r0,r2
part1_break:
/* lower bound */
cmp/hs r10,r2 /* Rn Rm (unsigned) ; r2 >= r10 */
movt r0
cmp/hs r2,r11 /* Rn Rm (unsigned) ; r11 >= r2 */
movt r1
rts
and r0,r1
.balign 4
_parse_line:
/* save PR */
sts.l pr,@-r15
mov.l parse_base10_ptr,r0
jsr @r0
nop
mov r1,r10 /* r10: first number */
mov.l parse_base10_ptr,r0
jsr @r0
nop
mov r1,r11 /* r11: second number */
mov.b @r8+,r12 /* r12: character */
/* skip colon character ; skip space character */
add #2,r8
/* advance until newline */
mov r8,r1
newline_loop:
mov.b @r8+,r0
cmp/eq #0xa,r0
bf newline_loop
/* restore PR */
lds.l @r15+,pr
rts
nop
.balign 4
parse_base10_ptr: /* r8 = pointer to text ; r1 = returned number */
.long _parse_base10
.balign 4
start: .long _binary_2020_day2_input_txt_start
end: .long _binary_2020_day2_input_txt_end
.balign 4
stack_bot:
.rept 16
.long 0
.endr
stack_top:

323
2020/day3/input.txt Normal file
View File

@ -0,0 +1,323 @@
.#....#..##.#..####....#.......
......#..#....#....###......#.#
#..#.....#..............##.#.#.
#.#...#....#...#......##..#..#.
...#..#.##..#..#........###.#.#
...#.#..........#.........##...
...#.#....#.#....#..#......#...
..##.#.....#.......#.###..#..##
..#.......#.......#....##......
....##........##.##...#.###.##.
#.......#.......##..#......#...
..##.............##.#......#...
...#.####....#.....#...##......
.............##.#......#.......
..#...#....#......#....#.......
..#....#..#............#.......
##...#..#........##..#......#..
##........##........#.#.......#
#.......#........#.#..#....###.
.....#..#.#..........##...#....
..##...#......#.#...#..#...#...
##.##...#......#....#....#...#.
#.......#..#.#..#....#..###.#.#
#.............#.#....#..#.#....
...#.......###.#.##.##.#...#..#
.##.......##..##...#..###......
.......#.#.#.#..####..#..#..#..
...##......#.#.##.###....#.###.
###......###......#.#####..#...
..#........##..#..##.##..#...#.
.....##..#...#..#.##.....#.#...
#......#.##....#..##.#....#.#..
##.#.##..#................#....
......#.#....#......##.....#...
..#...##..#..#...#..#.#..#.....
........#.#.#.##...#.#.....#.#.
#.#......#.....##..#...#.......
..#.#......#...........###.....
......##....#....##..#..#.#.#.#
##....#.###...#......#..#...#..
#.#.##....###...####.......#..#
##...........#.....#........#.#
.##.#..#.....#......#.......#..
##..##..###....#.........##....
..#..#..#.##...#.#...#........#
#.##.###...#.......#...........
.........#.................#...
#.##...#.....#..##........#....
....#.#...##...#...........#...
.#.....#.#..#...##..##.....#...
.#.....####....#..##..#........
...#..#......##.#..##.#.#.#..#.
.##.#.....#.....#...#.......##.
......#..#..#......#...####....
.......#......##..#..##.....#..
......#.#..#...#..#.#..........
....##.........#...............
.#....#..##.....#....##.##.....
#.#.....#...#....####....#.#...
#.....#....#.#...#.............
...#..#.....#....##..#..#......
...#.#............#...........#
###.#..#.#......#.....##.....#.
####....#....###.....#..#.#####
.###..#...#.#..#......##.#.#.#.
.....#.##.#....#..##....#..#..#
...#....#...##.....#......#.#..
....#...#....#...#....#.....#.#
.#.....#.....#.#..#......#..#..
..#..##....##.##....#.....##...
#..##...#.##...#..#.#.#.....#..
...#..##.#..#....#.#....######.
..........#..#.....#....#...##.
#.#####.#.###..#.....#.........
#....#......#..#.#.##.##..###..
..#...###.#.#....##.##...##....
.......#....#..#...##......#...
...#.#...#..#.....#..##.#......
###..##...........#............
..#....#.##....#.#..##...#.....
##....#...#....#.....#.#..##...
..............#.##.#..#..##.###
......#..#..#..#.#....###...##.
.#...#..#.#.#....#..........#..
..#.#.....#..#...........#.##..
...#.#......#......#..#..#.#...
...#....#.#.#.....#...#.##..#..
.#.#..#...#........##.......#..
##..........#..#...#....###.#..
#.....###......#..#.#.#....#.#.
..###.......#.#...............#
#....#.....#.#......#..##.##...
#.##.#.#....#..#.#...#.#...#..#
#....#..#...........#.......#..
...#.####.....#.........###.##.
......#..#.....#..........#..#.
#...#.#..####...#...#.#.##...##
.##.........#......#.#.#.......
.......##...##.##....###...##..
...#..#....#..#.#.#.....#.#....
#....#.#.#.......##..###..##...
......#............#.#...#..#..
#.#.....#......#...#.......###.
...#.#................#...#....
.....#......#.#..#...##.#.#...#
#....#.#..#..#..##..#.##..#....
#.................#..#....#....
..#....#.......####....###.....
.#..#.#.#...###..#...#..###....
..#..#.#......#.###..........#.
.....#......#.......##....##.#.
.#....#........#.#.##.#........
#.#..##..#..#.#...####....##...
...#....#.#..#...#..........#..
.#.....#.##....#...##..........
....##....#.....#.....#...#.###
.#...##.#.#..##..#...#.#..#..#.
..#.......#.##.....#.#........#
...#...#.....##..#.#.#....#....
...#.....#.......##.........#.#
.##.....#..#.#...#.#...#.#...#.
...........#...#.###..#...#..#.
#.##........#..###.##...####...
.#.....#.#...##...#..#..#...##.
..#....#..#...#.....#.....##...
..###..#.#.....##........#.##..
.#.#..##........#.##....#..#.##
.####.#..##..#.#..#....##....#.
.##....##...#.#........#.......
....#..#..#...#..#..#..#.#.....
...#......................#....
#.....#.#....#..#..#.#..#....#.
##.....#.....##..........###...
.#..#..............#...##.#.#.#
...#...#.#.............#.#..#.#
..#.....#.......#......#.#.....
.###.#..#..#..#.#..#.....#.....
.....##..##...##.......#....###
.#........###...##..#....##....
#....#.#......##..#....#.##..#.
#....#.#...#........##...###...
.#.....#...#.###....#.##.#.####
###......#....#...#....##..#..#
##....#..###......#...#.#.#....
..........#......##.#..#.......
.#..#......###.........##...#..
....#......#....#.........#.#.#
##.#.#...#.#...#...#..#......#.
....#.##.........#..#.....##.#.
........#...#..#.#.#.#.....##..
..#......#.#.#..#.....##.......
..............#....#....##.#..#
....#.#.....#....#.#.###.#....#
..#..........#..#......#.##..#.
...#...#.#.............#..#....
#.......#..#..##.........##..#.
..##..#............#.....#.....
....#.#..##...#.#..#.........#.
........#.......#.##....#....#.
...#.....#.#.....#.#....#......
..#......##.#.............#.#.#
#.#.............#.#.....#......
.##....##.#.....#....#...##....
.#.#....##....#.....##.........
...#.....#.....#.....#..#.###..
.......#....#...##.#...#...#..#
..#.#.......#...###.#...#....#.
.....###..##....###.#.##.......
....#..................##.#.##.
.#.......###.##...#.#.....#....
....#....##...##.....#.#...#..#
#..#.....#......##...#....#....
#..##.........#.....#...#......
...#..##.......##......#..#####
.#..###.###.#.##........#......
.#...#....#....#.#....#...##...
##........#....#.........##..#.
.#.....##............#.#.......
....#....#...........###.....##
.#......#.#.#..#....#.#.....##.
......#.##.#..##....#.#.#..#...
#....#......#...#..####........
......#..#..##..#.......#.#..#.
##....##.###.#...#.##.#..#.###.
.#.........#...##...#.#......#.
..#.#...........####.#....##.##
.....#.#..##.#...###...#..#.#..
...#..#..##.#...#.....#.##...##
..##......##..........#..###...
.#......##.....#.##....#.#.##.#
...#.......##..##.....#....#...
.##...#...#....#..#............
#..#....#...........#..........
......#...#.#.......#...#.##..#
..#.###..#.....#.....#..#.....#
....#....#..........##....#..#.
.......##.#.#.#......#....#...#
####..#.###........#..#......#.
#........##.#.#.#.............#
.#......#......#..#.##.....#...
.....##.##......##.#.....#.#.#.
.......##.#.....##.......#.#.#.
.#.#..#.#..#.##...#.#....#.#..#
.#..##....#..#...##.......#..#.
.#.#..#.......#................
#........#.#.#......#.#.#.#....
##......#...#..##.#...##.##....
##.#..#...........##...#..###..
......#.####...#........#.#.#..
...#........##..###.#.#...#...#
.#.....##..#......##......###..
..#.#...#......#..#..##.#.....#
#....#..#.#..........#...#.....
.#......#.##..###..#.#....#..##
.......#.......#..#..#......#..
..##.....##.#..#..#.....##.....
........#.##...#.#.#..#..#..#..
...#.######.........#.....#..##
.#.#............#....#.........
#...#....###.#......#.#........
#.........#....#...##..........
....#...........#.###.#...###..
.........#........#.#.#..#...#.
.#.......#.#.....#.#.....#.##..
.....#.......#.....#.#.#.......
#.##..#..##.......#...#......#.
.###.....##...##.#...##.##.#.#.
...#......##..##............#.#
...#......................#..##
#..#..#................#...#...
#..#....#.#.#...##.......#..#..
....#.#..###.##...#..#.###..#..
..#...#....####.#............#.
......#....#.#...#.#.#.........
#...#........#.....##..###.#..#
#....#...#...##...#..#....##...
#..#...#..#.......#.#..##.#..#.
#.#..........#...........##....
.#...###...#......#.......#.#.#
.........#.........#...#...##..
##.#..###......##..#.....#..#..
....##...............#.....#...
.....#.....###.#.....#.#.......
....#..#......###..#..##..#....
......................#.....#..
..#..#...##....##....#........#
..#....#...#...#.......#.....#.
...##.#.#.##......#.#.#.#.####.
.###...#..#......#.#..#........
#..#...##.#..#..##..##....#...#
...#...#..#..#..#........#..##.
.##....#.##.#....#...#.#.#....#
#..#....#..#....#.......##..#.#
...#.#....####...........#...#.
#...#####...#.#..#......#...#.#
.##....#.#.#..#......#..##.....
..........#..#.#.#.....##......
.....#....#..................#.
.........#...#...#....#..###...
.#.#.#....#....................
......##............##.###..#..
#.#...#........####.##..#.#.##.
#........#.#.#.#..#.##.....#...
......####..#.##.......#....#..
.........#...#...#.....#.......
..##.....#...#...#.....##.....#
....#...##....#.....#..#..##.##
..#.........##...##..###..#....
#....#.#.........##.###.#...##.
.##...#....#..#..#.#....##.....
##..#..#..#...........#.##....#
....#..........#...#..#.....#..
........###..#..#.#.#.....##...
#...#...#..###............###..
..#.....#.#.#..#..#.#..#......#
..#...##..#....#...#......#....
#....#........##.....#..##....#
#.....#.#.#..#.......##.#.#.##.
..##...#...#.....#..........#..
##.....#....#......#..........#
......#..#..........#.#..####..
......#...#............##...##.
..#.......##.......#...###.###.
.#..#.#.#...#..##.#......#.#...
.##.....##.#.#...#.##.........#
#.#.######...........#.#####.#.
........#.##...##....##.#.##.#.
....#......#.....#.....###...##
#..............#.#....#.#....#.
....#..###.#.........##.#.#....
..#.#.#..##....####..........#.
...#..#.......#................
...#....#..............#....#..
.....#...#...#....#.#.#..#...#.
......##.............###.##..##
.#...#.#..#......#..#.##.......
##.....#.....#.##...#....#.....
..#..#.#.#.#.#..........#..###.
##..........#........#....#.#..
.....#...#........#.#..###....#
.###.#........#.##......#.#...#
#...##....#....#....##.#.#.....
.....#.#............#..........
..#.##....................#....
.....#..#..#.#..#.##.......#...
.....###......#......##......##
#.....#.#.......##.......#...#.
.#.#...#......#..###...#.....#.
#.#..#...#..##.....#...#.#..#..
.....#.#..........#..#.........
.###..##..##.....#...#...#..##.
#...#.#....#.......##..#.......
###...#.#.#..#.......#......#..
....##........#..........##....
............#....#...........#.
#..#.#....##..#.#..#......##...
.###....##...#....##..........#
.###........#........###.....#.
...#...#.#......#...#....#.....
.###.......#.........#.........
....##.#......#...###......##.#
.###...#..##.....##.......#....
.#.#...#..#.##....#........#...

11
2020/day3/sample.txt Normal file
View File

@ -0,0 +1,11 @@
..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#

161
2020/day3/solution.s Normal file
View File

@ -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:

21
2020/deps.mk Normal file
View File

@ -0,0 +1,21 @@
2020_DAY2_OBJ = \
2020/day2/solution.o \
2020/day2/sample.txt.o \
2020/day2/input.txt.o \
common/parse_base10.o
2020/day2/solution.elf: $(2020_DAY2_OBJ)
$(DEFAULT_LINK)
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

View File

@ -28,6 +28,9 @@ CFLAGS += -ffreestanding -nostdlib
DEPFLAGS = -MMD -MP DEPFLAGS = -MMD -MP
LDFLAGS += --no-warn-execstack LDFLAGS += --no-warn-execstack
ALL_ELF =
all:
%.o: %.c %.o: %.c
$(CC) $(CARCH) $(CC_ENDIAN) $(CFLAGS) $(OPT) $(DEBUG) $(DEPFLAGS) -MF ${<}.d -c $< -o $@ $(CC) $(CARCH) $(CC_ENDIAN) $(CFLAGS) $(OPT) $(DEBUG) $(DEPFLAGS) -MF ${<}.d -c $< -o $@
@ -58,7 +61,7 @@ endef
clean: clean:
find -P \ find -P \
-regextype posix-egrep \ -regextype posix-egrep \
-regex '.*\.(o|bin|elf|d)$$' \ -regex '.*\.(o|bin|elf|d|map)$$' \
-exec rm {} \; -exec rm {} \;
.SUFFIXES: .SUFFIXES:
@ -75,3 +78,6 @@ clean:
MAKEFLAGS += --no-builtin-rules MAKEFLAGS += --no-builtin-rules
include 2019/deps.mk include 2019/deps.mk
include 2020/deps.mk
all: $(subst .elf,.bin,$(ALL_ELF))

18
common/div32_16.s Normal file
View File

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

22
common/parse_base10.s Normal file
View File

@ -0,0 +1,22 @@
.section .text.parse_base10
.global _parse_base10
_parse_base10:
/* r8 = pointer to text ; r1 = number */
mov #0,r1 /* r1: accumulated number */
parse_base10_loop:
mov.b @r8+,r2
add #-48,r2 /* ascii '0' */
cmp/pz r2 /* Rn >= 0 (signed) (r2 >= 0 ) */
bf/s parse_base10_rts
mov #9,r4 /* const 9 */
cmp/ge r2,r4 /* Rn >= Rm (signed) ( 9 >= r2) */
bf/s parse_base10_rts
mov #10,r4 /* const 10 */
mulu.w r1,r4
sts macl,r1
bra parse_base10_loop
add r2,r1
parse_base10_rts:
rts
nop