2020: part1 and part2
This commit is contained in:
parent
3a933db011
commit
421c5deaf8
@ -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
|
||||||
|
@ -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
1000
2020/day2/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
3
2020/day2/sample.txt
Normal file
3
2020/day2/sample.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
1-3 a: abcde
|
||||||
|
1-3 b: cdefg
|
||||||
|
2-9 c: ccccccccc
|
134
2020/day2/solution.s
Normal file
134
2020/day2/solution.s
Normal 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
11
2020/deps.mk
Normal 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
|
6
Makefile
6
Makefile
@ -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 $@
|
||||||
|
|
||||||
@ -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))
|
||||||
|
22
common/parse_base10.s
Normal file
22
common/parse_base10.s
Normal 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
|
Loading…
x
Reference in New Issue
Block a user