NameDateSize

..Today51

ChangeLog-2021H A D12-Aug-20243.1 KiB

interp.cH A D12-Aug-20245 KiB

local.mkH A D12-Aug-2024897

Makefile.inH A D12-Aug-2024954

READMEH A D12-Aug-2024766

README.arch-specH A D12-Aug-20242.9 KiB

sim-main.cH A D12-Aug-202416.8 KiB

sim-main.hH A D12-Aug-20241.2 KiB

README

1= OVERVIEW =
2
3The Synacor Challenge is a fun programming exercise with a number of puzzles
4built into it.  You can find more details about it here:
5https://challenge.synacor.com/
6
7The first puzzle is writing an interpreter for their custom ISA.  This is a
8simulator for that custom CPU.  The CPU is quite basic: it's 16-bit with only
98 registers and a limited set of instructions.  This means the port will never
10grow new features.  See README.arch-spec for more details.
11
12Implementing it here ends up being quite useful: it acts as a simple constrained
13"real world" example for people who want to implement a new simulator for their
14own architecture.  We demonstrate all the basic fundamentals (registers, memory,
15branches, and tracing) that all ports should have.
16

README.arch-spec

1== architecture ==
2- three storage regions
3  - memory with 15-bit address space storing 16-bit values
4  - eight registers
5  - an unbounded stack which holds individual 16-bit values
6- all numbers are unsigned integers 0..32767 (15-bit)
7- all math is modulo 32768; 32758 + 15 => 5
8
9== binary format ==
10- each number is stored as a 16-bit little-endian pair (low byte, high byte)
11- numbers 0..32767 mean a literal value
12- numbers 32768..32775 instead mean registers 0..7
13- numbers 32776..65535 are invalid
14- programs are loaded into memory starting at address 0
15- address 0 is the first 16-bit value, address 1 is the second 16-bit value, etc
16
17== execution ==
18- After an operation is executed, the next instruction to read is immediately after the last argument of the current operation.
19  If a jump was performed, the next operation is instead the exact destination of the jump.
20- Encountering a register as an operation argument should be taken as reading from the register or setting into the register as appropriate.
21
22== hints ==
23- Start with operations 0, 19, and 21.
24- Here's a code for the challenge website: jTTockJlJiOC
25- The program "9,32768,32769,4,19,32768" occupies six memory addresses and should:
26  - Store into register 0 the sum of 4 and the value contained in register 1.
27  - Output to the terminal the character with the ascii code contained in register 0.
28
29== opcode listing ==
30halt: 0
31  stop execution and terminate the program
32set: 1 a b
33  set register <a> to the value of <b>
34push: 2 a
35  push <a> onto the stack
36pop: 3 a
37  remove the top element from the stack and write it into <a>; empty stack = error
38eq: 4 a b c
39  set <a> to 1 if <b> is equal to <c>; set it to 0 otherwise
40gt: 5 a b c
41  set <a> to 1 if <b> is greater than <c>; set it to 0 otherwise
42jmp: 6 a
43  jump to <a>
44jt: 7 a b
45  if <a> is nonzero, jump to <b>
46jf: 8 a b
47  if <a> is zero, jump to <b>
48add: 9 a b c
49  assign into <a> the sum of <b> and <c> (modulo 32768)
50mult: 10 a b c
51  store into <a> the product of <b> and <c> (modulo 32768)
52mod: 11 a b c
53  store into <a> the remainder of <b> divided by <c>
54and: 12 a b c
55  stores into <a> the bitwise and of <b> and <c>
56or: 13 a b c
57  stores into <a> the bitwise or of <b> and <c>
58not: 14 a b
59  stores 15-bit bitwise inverse of <b> in <a>
60rmem: 15 a b
61  read memory at address <b> and write it to <a>
62wmem: 16 a b
63  write the value from <b> into memory at address <a>
64call: 17 a
65  write the address of the next instruction to the stack and jump to <a>
66ret: 18
67  remove the top element from the stack and jump to it; empty stack = halt
68out: 19 a
69  write the character represented by ascii code <a> to the terminal
70in: 20 a
71  read a character from the terminal and write its ascii code to <a>; it can be assumed that once input starts, it will continue until a newline is encountered; this means that you can safely read whole lines from the keyboard and trust that they will be fully read
72noop: 21
73  no operation
74