Compare commits

...

1 Commits

Author SHA1 Message Date
421c5deaf8 2020: part1 and part2 2024-04-07 21:14:06 +08:00
8 changed files with 1178 additions and 2 deletions

View File

@ -50,7 +50,7 @@ end: .long _binary_2019_day1_input_txt_end
.global _parse_int
.align 4
_parse_int:
/* r0 = pointer to text ; r1 = number */
/* r8 = pointer to text ; r1 = number */
mov #0,r1 /* r1: accumulated number */
parse_int_loop:
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)

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:

11
2020/deps.mk Normal file
View File

@ -0,0 +1,11 @@
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/solution.elf: $(2020_DAY2_OBJ)
$(DEFAULT_LINK)
ALL_ELF += 2020/day2/solution.elf

View File

@ -28,6 +28,9 @@ CFLAGS += -ffreestanding -nostdlib
DEPFLAGS = -MMD -MP
LDFLAGS += --no-warn-execstack
ALL_ELF =
all:
%.o: %.c
$(CC) $(CARCH) $(CC_ENDIAN) $(CFLAGS) $(OPT) $(DEBUG) $(DEPFLAGS) -MF ${<}.d -c $< -o $@
@ -75,3 +78,6 @@ clean:
MAKEFLAGS += --no-builtin-rules
include 2019/deps.mk
include 2020/deps.mk
all: $(subst .elf,.bin,$(ALL_ELF))

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