From 4959a34dcb6f4364fb4fa2e97f2b03f3cd3fd72c Mon Sep 17 00:00:00 2001 From: Sijmen Schoon Date: Wed, 9 Dec 2020 16:17:02 +0100 Subject: [PATCH] Add c64 day 1 part 2 --- c64/day01.asm | 123 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 22 deletions(-) diff --git a/c64/day01.asm b/c64/day01.asm index 7b01f33..284a63b 100644 --- a/c64/day01.asm +++ b/c64/day01.asm @@ -29,6 +29,9 @@ day01: move_16_imm(input_pointer, day01_input) ldy #0 + lda #0 + sta zp_temp + !line: // Create a temporary 16-bit integer to store the result in // in between digits. @@ -73,9 +76,9 @@ day01: lda (input_pointer), y bne !line- - move_16_imm($03, str_parse_done) - jsr write_string - + // + // Part 1 + // ldy #0 !loop: // Subtract the number from 2020 to find the needed value. @@ -102,9 +105,6 @@ day01: sec jsr multiply_16bit_unsigned - move_16_imm($03, str_calc_done) - jsr write_string - // Print the 32-bit result as decimal. lda $25 sta udivmod32_dividend + 3 @@ -116,27 +116,106 @@ day01: sta udivmod32_dividend + 0 jsr print_decimal_u32 - rts - -!error: - move_16_imm($03, str_no_result) + move_16_imm($03, str_part2) jsr write_string + +.const val_a = $26 +.const val_b = $fd +.const val_c = $44 +.const val_temp = $46 +.const outer_i = $1f + + // + // Part 2 + // + ldx #0 + !outer_loop: + ldy #0 + lda tree_values_lo, x + sta val_a + 0 + lda tree_values_hi, x + sta val_a + 1 + stx outer_i + + !inner_loop: + // Subtract the numbers from 2020 to find the needed value. + lda tree_values_lo, y + sta val_b + 0 + bne !not_zero+ + + lda tree_values_hi, y + bne !not_zero+ + ldx outer_i + inx + bne !outer_loop- + !not_zero: + + lda tree_values_hi, y + sta val_b + 1 + + lda val_a + 0 + clc + adc val_b + 0 + sta val_temp + 0 + + lda val_a + 1 + adc val_b + 1 + sta val_temp + 1 + + lda val_temp + 0 + eor #$ff + sec + adc #<2020 + sta $03 + sta val_c + 0 + + lda val_temp + 1 + eor #$ff + adc #>2020 + sta $04 + sta val_c + 1 + + iny + jsr tree_contains + bne !inner_loop- + + // Multiply the three numbers together + sec + jsr multiply_16bit_unsigned + + u16_u16_move($30, $22) + u16_u16_move($32, $24) + + u16_u16_move($34, val_c) + move_16_imm($36, 0) + + jsr multiply_32bit_unsigned + + // Print the 32-bit result as decimal. + u16_u16_move(udivmod32_dividend, $38) + u16_u16_move(udivmod32_dividend + 2, $3a) + u16_u16_move(udivmod32_dividend + 4, $3c) + u16_u16_move(udivmod32_dividend + 6, $3e) + jsr print_decimal_u32 + + move_16_imm($03, str_done) + jsr write_string + rts str_title: - .text "# Day 01, part 1:" - .byte '\n', 0 + .text "# Day 01" + .byte '\n', '\n' + .text "Part 1: " + .byte 0 -str_parse_done: - .text "* Finished parsing" - .byte '\n', 0 - -str_calc_done: - .text "* Finished calculating" - .byte '\n', 0 - -str_no_result: +str_part2: .byte '\n' - .text "! Could not find a result" + .text "Part 2: " + .byte 0 + +str_done: + .byte '\n', '\n' + .text "* Done" .byte '\n', 0