asm-test/aoc/2020/day1/solution.asm
2022-04-05 14:07:50 -07:00

102 lines
3.4 KiB
NASM

;; uint16_t * input;
;; uint8_t * input_len = 0;
;; uint16_t * input_j = 2;
;; uint16_t * input_k = 4;
;; uint8_t * k_index = 1;
BRA r :reset ; RESB
NOP i ; IRQB
;; reset stack
reset: LDX # ff
TXS i
;; *input_k = input
LDA # :_bin_aoc/2020/day1/input_start_l
STA zp 4
LDA # :_bin_aoc/2020/day1/input_start_h
STA zp 5
;; *input_len = _bin_aoc/2020/day1/input_size / 2
LDA # :_bin_aoc/2020/day1/input_size_h
LSR A
LDA # :_bin_aoc/2020/day1/input_size_l
ROR A
STA zp 0
;; *k_index = *input_len
STA zp 1
_day1_loopx: LDA # :_bin_aoc/2020/day1/input_start_l ;;
STA zp 2 ;;
LDA # :_bin_aoc/2020/day1/input_start_h ;;
STA zp 3 ;; *input_j = input
LDA zp 0 ;; (input_size)
TAX i ;; X = *input_len
_day1_loop: CLC i ;; /* 16-bit addition+comparison (lower byte) */
LDY # 0 ;;
LDA (zp),y 2 ;;
ADC (zp),y 4 ;; A = ((uint8_t *)(*input_j))[0] + ((uint8_t *)(*input_k))[0]
PHP s ;;
CMP # e4 ;;
BNE r :_day1_next ;; if (A != 0xE4) goto _next
PLP s ;; /* 16-bit addition+comparison (upper byte) */
LDY # 1 ;;
LDA (zp),y 2 ;;
ADC (zp),y 4 ;; A = ((uint8_t *)(*input_j))[1] + ((uint8_t *)(*input_k))[1]
CMP # 07 ;;
BEQ r :_day1_found ;; if (A == 0x07) goto _found
_day1_next: CLC i ;;
LDA zp 2 ;;
ADC # 2 ;;
STA zp 2 ;;
LDA zp 3 ;;
ADC # 0 ;;
STA zp 3 ;; *input_j = *input_j + 2
DEX i ;;
BNE r :_day1_loop ;; if (--X != 0) goto _loop
CLC i ;;
LDA zp 4 ;;
ADC # 2 ;;
STA zp 4 ;;
LDA zp 5 ;;
ADC # 0 ;;
STA zp 5 ;; *input_k = *input_k + 2
LDY zp 1 ;;
DEY i ;;
STY zp 1 ;; *k_index = k_index - 1;
BNE r :_day1_loopx ;; if (*k_index != 0) goto _loopx
_day1_notfound: BRA r :_day1_notfound
_day1_found: LDX # 8
LDY # 0 ;; copy **input_j and **input_k to mul24 `a` and `b` arguments
LDA (zp),y 2 ;;
STA zp,x 0 ;;
LDA (zp),y 4 ;;
STA zp,x 3 ;;
;;
LDY # 1 ;;
LDA (zp),y 2 ;;
STA zp,x 1 ;;
LDA (zp),y 4 ;;
STA zp,x 4 ;;
;;
LDA # 0 ;;
STA zp,x 2 ;;
STA zp,x 5 ;;
JSR a :mul24
JSR a :lcd_reset
LDX # 10
LDY # 3
JSR a :lcd_hex
_day1_stop: BRA r :_day1_stop