#!/usr/bin/env python # coding: utf-8 # # Day 21 - More machine code analysis # # - [Day 21](https://adventofcode.com/2018/day/21) # # Continuing the theme from days [16](./Day%2016.ipynb) and [19](Day%2019.ipynb), we are explicitly asked to figure out how the new program works. # # Here's my take on the input I was given. The table is annotated with colours, If you are looking at this notebook on Github, you may want to [switch to the Jupyter notebook viewer](https://nbviewer.jupyter.org/github/mjpieters/adventofcode/blob/master/2018/Day%2021.ipynb) instead. # # My input marks register #1 as the IP: # #
label | #i | #opcode | #op1 | #op2 | #reg | #interpretation | #
---|---|---|---|---|---|---|
# | 0 | #seti | #123 | ## | 5 | #r5 = 123 |
#
ANDTEST | #1 | #bani | #5 | #456 | #5 | #r5 &= 456 |
#
# | 2 | #eqri | #5 | #72 | #5 | #
#
# |
#
# | 3 | #addr | #5 | #1 | #1 | #|
# | 4 | #seti | #0 | ## | 1 | #|
# | 5 | #seti | #0 | ## | 5 | #r5 = 0 |
#
OUTER | #6 | #bori | #5 | #65536 | #4 | #r4 = r5 | 65536 (sets bit 17, 0x10000 |
#
# | 7 | #seti | #13431073 | ## | 5 | #r5 = 13431073 (product of 2 primes) |
#
INNER | #8 | #bani | #4 | #255 | #3 | #r5 += r4 & 255 (bottom byte of r4 added to r5) |
#
# | 9 | #addr | #5 | #3 | #5 | #|
# | 10 | #bani | #5 | #16777215 | #5 | #r5 &= 16777215 (masking r5 to 24 bits, 0xFFFFFF ) |
#
# | 11 | #multi | #5 | #65899 | #5 | #r5 *= 65899 (another prime) |
#
# | 12 | #bani | #5 | #16777215 | #5 | #r5 &= 16777215 (masking r5 to 24 bits, 0xFFFFFF ) |
#
# | 13 | #gtir | #256 | #4 | #3 | #
#
|
#
# | 14 | #addr | #3 | #1 | #1 | #|
# | 15 | #addr | #1 | #1 | #1 | #|
# | 16 | #seti | #27 | ## | 1 | #|
# | 17 | #seti | #0 | ## | 3 | #r3 = 0 |
#
DIV256 | #18 | #addi | #3 | #1 | #2 | #r2 = r3 + 1 |
#
# | 19 | #muli | #2 | #256 | #2 | #r2 *= 256 |
#
# | 20 | #gtrr | #2 | #4 | #2 | #
#
|
#
# | 21 | #addr | #2 | #1 | #1 | #|
# | 22 | #addi | #1 | #1 | #1 | #|
# | 23 | #seti | #25 | ## | 1 | #|
# | 24 | #addi | #3 | #1 | #3 | #r3 += 1 |
#
# | 25 | #seti | #17 | ## | 1 | #jmp 18 (DIV256) |
#
DONEDIV | #26 | #setr | #3 | ## | 4 | #r4 = r3 |
#
# | 27 | #seti | #7 | ## | 1 | #jmp 8 (INNER) |
#
BREAK | #28 | #eqrr | #5 | #0 | #3 | #
#
|
#
# | 29 | #addr | #3 | #1 | #1 | #|
# | 30 | #seti | #5 | #0 | #1 | #