90 lines
1.5 KiB
OCaml
90 lines
1.5 KiB
OCaml
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"
|
|
;;
|