;; 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