# CSPT13 Computer Architecture I
```
import sys
# a machine that simply executes an instruction
# op-code - they represent the instruction that is supposed to be executed
PRINT_HI = 1
HALT = 2
PRINT_NUM = 3
SAVE = 4 # save a value in a given register
PRINT_REGISTER = 5 # print value stored in register
ADD = 6 # takes in two registers, A and B and adds both values contained in the registers and stores it in reg A
memory = [
PRINT_HI,
SAVE, # SAVE 65 2 means save the value 65 into reg 2
65,
2,
SAVE, # SAVE 20 3 means save the value 20 into reg 3
20,
3,
ADD, # ADD 2 3 means add the values stored in reg 2 and reg 3 and store the result in reg 2
2,
3,
PRINT_REGISTER, # PRINT_REGISTER 2 means print the value stored in register 2
2,
HALT,
]
program_counter = 0 # points to the current instruction we need to execute next
running = True
registers = [0] * 8
# keep looping while not halted
while running:
command_to_execute = memory[program_counter]
if command_to_execute == PRINT_HI:
print("hi")
program_counter += 1
elif command_to_execute == PRINT_NUM:
number_to_print = memory[program_counter + 1]
print(f"{number_to_print}")
program_counter += 2
elif command_to_execute == HALT:
running = False
program_counter += 1
elif command_to_execute == SAVE:
value_to_save = memory[program_counter + 1]
register_to_save_it_in = memory[program_counter + 2]
registers[register_to_save_it_in] = value_to_save
program_counter += 3
elif command_to_execute == PRINT_REGISTER:
register_to_print = memory[program_counter + 1]
print(f"{registers[register_to_print]}")
program_counter += 2
elif command_to_execute == ADD:
register_a = memory[program_counter + 1]
register_b = memory[program_counter + 2]
sum_of_registers = registers[register_a] + registers[register_b]
registers[register_a] = sum_of_registers
program_counter += 3
else:
print(f"Unknown instruction {command_to_execute}")
sys.exit(1)
```