nand2tetris/projects/06/assembler/lib/Predef.ml

90 lines
1.5 KiB
OCaml
Raw Normal View History

2022-07-18 19:16:54 +00:00
open Base
2022-07-19 17:27:14 +00:00
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
]
;;
2022-07-18 19:16:54 +00:00
let comp c =
match c with
2022-07-19 17:27:14 +00:00
| "0" -> "0101010"
| "1" -> "0111111"
| "-1" -> "0111010"
| "D" -> "0001100"
| "A" -> "0110000"
| "M" -> "1110000"
| "!D" -> "0001101"
| "!A" -> "0110001"
| "!M" -> "1110001"
| "-D" -> "0001111"
| "-A" -> "0110011"
| "-M" -> "1110011"
2022-07-18 19:16:54 +00:00
| "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
2022-07-19 17:27:14 +00:00
| "" -> "000"
| "M" -> "001"
| "D" -> "010"
| "MD" -> "011"
| "A" -> "100"
| "AM" -> "101"
| "AD" -> "110"
2022-07-18 19:16:54 +00:00
| "ADM" -> "111"
| _ -> failwith "Unknown DEST Instruction"
;;
let jump j =
match j with
2022-07-19 17:27:14 +00:00
| "" -> "000"
2022-07-18 19:16:54 +00:00
| "JGT" -> "001"
| "JEQ" -> "010"
| "JGE" -> "011"
| "JLT" -> "100"
| "JNE" -> "101"
| "JLE" -> "110"
| "JMP" -> "111"
| _ -> failwith "Unknown JUMP Instruction"
;;