Compare commits
1 Commits
8fbaa207c5
...
421c5deaf8
Author | SHA1 | Date | |
---|---|---|---|
421c5deaf8 |
@ -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
|
||||
|
@ -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
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
|
||||
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
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