This repo is my answers to the 2019 advent of code. Solutions will be published once the leader boards are full
I have created an intcode assembler. It uses a custom assembly language to provide a simpler method to writing intcode. Currently it supports the following operations:
Operation | Desc |
---|---|
add a b target |
Adds a to b, and stores the result in target |
mul a b target |
Multiplies a by b, and stores the result in target |
ipt target |
accepts input and stores it in target |
out a |
outputs a |
jnz a target |
Jumps to target if a is not zero (intcode jump if true) |
jez a target |
Jumps to target if a is zero (intcode jump if false) |
lt a b target |
If a is less than b, set target to 1, 0 otherwise |
eq a b target |
If a equals b, set target to 1, 0 otherwise |
halt |
stops the program |
The syntax for arguments is inspired by intel ASM.
Prefix | Description |
---|---|
None | The number as it is literally |
r |
A register |
$ |
A pointer / positional |
. |
The current IP (can be added or subtracted from using .1 and .-1 respectively |
! |
The current Instruction number excluding arguments (replaced with the correct IP for jumps etc). Can be added to or subtracted from using !10 and !-10 respectively |
Running the assembler as simple as go run intcodeasm.go
The following code sets position 0 to the number 1337 by multiplying 13 by 100 and then adding 37
% go run intcodeasm.go << EOF
heredoc> ipt rCount
heredoc> add -2 rCount rCount
heredoc> add 0 1 rHigh
heredoc> add 0 1 rLow
heredoc> # loop start
heredoc> add 0 rHigh rStore
heredoc> add rLow rHigh rHigh
heredoc> add 0 rStore rLow
heredoc> add -1 rCount rCount
heredoc> jnz rCount !-4
heredoc> out rHigh
heredoc> halt
heredoc> EOF
Intcode for ASM: 003,36,00101,-2,36,36,01101,0,1,37,01101,0,1,38,00101,0,37,39,00001,38,37,37,00101,0,39,38,00101,-1,36,36,1005,36,14,004,37,99,0,0,0,0