open Base let symbols = Map.of_alist_exn (module String) [ "R0", 0 ; "R1", 1 ; "R2", 2 ; "R3", 3 ; "R4", 4 ; "R5", 5 ; "R6", 6 ; "R7", 7 ; "R8", 8 ; "R9", 9 ; "R10", 10 ; "R11", 11 ; "R12", 12 ; "R13", 13 ; "R14", 14 ; "R15", 15 ; "SP", 0 ; "LCL", 1 ; "ARG", 2 ; "THIS", 3 ; "THAT", 4 ; "SCREEN", 16384 ; "KBD", 24576 ] ;; let comp c = match c with | "0" -> "0101010" | "1" -> "0111111" | "-1" -> "0111010" | "D" -> "0001100" | "A" -> "0110000" | "M" -> "1110000" | "!D" -> "0001101" | "!A" -> "0110001" | "!M" -> "1110001" | "-D" -> "0001111" | "-A" -> "0110011" | "-M" -> "1110011" | "D+1" -> "0011111" | "A+1" -> "0110111" | "M+1" -> "1110111" | "D-1" -> "0001110" | "A-1" -> "0110010" | "M-1" -> "1110010" | "D+A" -> "0000010" | "D+M" -> "1000010" | "D-A" -> "0010011" | "D-M" -> "1010011" | "A-D" -> "0000111" | "M-D" -> "1000111" | "D&A" -> "0000000" | "D&M" -> "1000000" | "D|A" -> "0010101" | "D|M" -> "1010101" | _ -> failwith "Unknown COMP Instruction" ;; let dest d = match d with | "" -> "000" | "M" -> "001" | "D" -> "010" | "MD" -> "011" | "A" -> "100" | "AM" -> "101" | "AD" -> "110" | "ADM" -> "111" | _ -> failwith "Unknown DEST Instruction" ;; let jump j = match j with | "" -> "000" | "JGT" -> "001" | "JEQ" -> "010" | "JGE" -> "011" | "JLT" -> "100" | "JNE" -> "101" | "JLE" -> "110" | "JMP" -> "111" | _ -> failwith "Unknown JUMP Instruction" ;;