Introduce the concept of assembler errors, and runtime errors. Preserve line and column number information, and come up with sensible error messages (there are actually some described in the original instructions.
Minor subtask: once we have errors, make sure to change reading from write-only registers into an error.