 NicholeMattera
/
Synacor-Challenge
My solution to the Synacor Challenge. https://challenge.synacor.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

#### 79 lines 3.1 KiB Raw Permalink Blame History

 ```== Synacor Challenge == ``` ```In this challenge, your job is to use this architecture spec to create a ``` ```virtual machine capable of running the included binary. Along the way, ``` ```you will find codes; submit these to the challenge website to track ``` ```your progress. Good luck! ``` ``` ``` ``` ``` ```== architecture == ``` ```- three storage regions ``` ``` - memory with 15-bit address space storing 16-bit values ``` ``` - eight registers ``` ``` - an unbounded stack which holds individual 16-bit values ``` ```- all numbers are unsigned integers 0..32767 (15-bit) ``` ```- all math is modulo 32768; 32758 + 15 => 5 ``` ``` ``` ```== binary format == ``` ```- each number is stored as a 16-bit little-endian pair (low byte, high byte) ``` ```- numbers 0..32767 mean a literal value ``` ```- numbers 32768..32775 instead mean registers 0..7 ``` ```- numbers 32776..65535 are invalid ``` ```- programs are loaded into memory starting at address 0 ``` ```- address 0 is the first 16-bit value, address 1 is the second 16-bit value, etc ``` ``` ``` ```== execution == ``` ```- After an operation is executed, the next instruction to read is immediately after the last argument of the current operation. If a jump was performed, the next operation is instead the exact destination of the jump. ``` ```- Encountering a register as an operation argument should be taken as reading from the register or setting into the register as appropriate. ``` ``` ``` ```== hints == ``` ```- Start with operations 0, 19, and 21. ``` ```- Here's a code for the challenge website: nZEQuhtfeqcb ``` ```- The program "9,32768,32769,4,19,32768" occupies six memory addresses and should: ``` ``` - Store into register 0 the sum of 4 and the value contained in register 1. ``` ``` - Output to the terminal the character with the ascii code contained in register 0. ``` ``` ``` ```== opcode listing == ``` ```halt: 0 ``` ``` stop execution and terminate the program ``` ```set: 1 a b ``` ``` set register to the value of ``` ```push: 2 a ``` ``` push onto the stack ``` ```pop: 3 a ``` ``` remove the top element from the stack and write it into ; empty stack = error ``` ```eq: 4 a b c ``` ``` set to 1 if is equal to ; set it to 0 otherwise ``` ```gt: 5 a b c ``` ``` set to 1 if is greater than ; set it to 0 otherwise ``` ```jmp: 6 a ``` ``` jump to ``` ```jt: 7 a b ``` ``` if is nonzero, jump to ``` ```jf: 8 a b ``` ``` if is zero, jump to ``` ```add: 9 a b c ``` ``` assign into the sum of and (modulo 32768) ``` ```mult: 10 a b c ``` ``` store into the product of and (modulo 32768) ``` ```mod: 11 a b c ``` ``` store into the remainder of divided by ``` ```and: 12 a b c ``` ``` stores into the bitwise and of and ``` ```or: 13 a b c ``` ``` stores into the bitwise or of and ``` ```not: 14 a b ``` ``` stores 15-bit bitwise inverse of in ``` ```rmem: 15 a b ``` ``` read memory at address and write it to ``` ```wmem: 16 a b ``` ``` write the value from into memory at address ``` ```call: 17 a ``` ``` write the address of the next instruction to the stack and jump to ``` ```ret: 18 ``` ``` remove the top element from the stack and jump to it; empty stack = halt ``` ```out: 19 a ``` ``` write the character represented by ascii code to the terminal ``` ```in: 20 a ``` ``` read a character from the terminal and write its ascii code to ; 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 ``` ```noop: 21 ``` ``` no operation ``` ``` ```