159 lines
3.1 KiB
OCaml
159 lines
3.1 KiB
OCaml
(*opcode hash table, formati ukazov in mnemoniki*)
|
|
type mnemonic =
|
|
(* Format 1 *)
|
|
| FIX | FLOAT | HIO | NORM | SIO | TIO
|
|
|
|
(* Format 2 *)
|
|
| ADDR | CLEAR | COMPR | DIVR | MULR | RMO
|
|
| SHIFTL | SHIFTR | SUBR | SVC | TIXR
|
|
|
|
(* Format 3/4 *)
|
|
| ADD | ADDF | AND | COMP | COMPF | DIV
|
|
| J | JEQ | JGT | JLT | JSUB | LDA | LDB | LDCH | LDF
|
|
| LDL | LDS | LDT | LDX | LPS | MUL | OR | RD
|
|
| RSUB | STA | STB | STCH | STF | STL | STS | STSW
|
|
| STT | STX | SUB | SUBF | TD | TIX | WD
|
|
|
|
type format =
|
|
| F1
|
|
| F2
|
|
| F3_4
|
|
|
|
type info = {
|
|
mnemonic : mnemonic;
|
|
format : format;
|
|
}
|
|
|
|
(* Opcode table *)
|
|
|
|
let table : (int, info) Hashtbl.t = Hashtbl.create 128
|
|
|
|
let () =
|
|
let add op mnemonic format =
|
|
Hashtbl.add table op { mnemonic; format }
|
|
in
|
|
|
|
(*Format 1 Instructions*)
|
|
add 0xC4 FIX F1;
|
|
add 0xC0 FLOAT F1;
|
|
add 0xC8 HIO F1;
|
|
add 0xC1 NORM F1;
|
|
add 0xF0 SIO F1;
|
|
add 0xF8 TIO F1;
|
|
|
|
(*Format 2 Instructions*)
|
|
add 0x90 ADDR F2;
|
|
add 0xB4 CLEAR F2;
|
|
add 0xA0 COMPR F2;
|
|
add 0x9C DIVR F2;
|
|
add 0x98 MULR F2;
|
|
add 0xAC RMO F2;
|
|
add 0xA4 SHIFTL F2;
|
|
add 0xA8 SHIFTR F2;
|
|
add 0x94 SUBR F2;
|
|
add 0xB0 SVC F2;
|
|
add 0xB8 TIXR F2;
|
|
|
|
(*Format 3/4 Instructions*)
|
|
add 0x18 ADD F3_4;
|
|
add 0x58 ADDF F3_4;
|
|
add 0x40 AND F3_4;
|
|
add 0x28 COMP F3_4;
|
|
add 0x88 COMPF F3_4;
|
|
add 0x24 DIV F3_4;
|
|
add 0x3C J F3_4;
|
|
add 0x30 JEQ F3_4;
|
|
add 0x34 JGT F3_4;
|
|
add 0x38 JLT F3_4;
|
|
add 0x48 JSUB F3_4;
|
|
add 0x00 LDA F3_4;
|
|
add 0x68 LDB F3_4;
|
|
add 0x50 LDCH F3_4;
|
|
add 0x70 LDF F3_4;
|
|
add 0x08 LDL F3_4;
|
|
add 0x6C LDS F3_4;
|
|
add 0x74 LDT F3_4;
|
|
add 0x04 LDX F3_4;
|
|
add 0xD0 LPS F3_4;
|
|
add 0x20 MUL F3_4;
|
|
add 0x44 OR F3_4;
|
|
add 0xD8 RD F3_4;
|
|
add 0x4C RSUB F3_4;
|
|
add 0x0C STA F3_4;
|
|
add 0x78 STB F3_4;
|
|
add 0x54 STCH F3_4;
|
|
add 0x80 STF F3_4;
|
|
add 0x14 STL F3_4;
|
|
add 0x7C STS F3_4;
|
|
add 0xE8 STSW F3_4;
|
|
add 0x84 STT F3_4;
|
|
add 0x10 STX F3_4;
|
|
add 0x1C SUB F3_4;
|
|
add 0x5C SUBF F3_4;
|
|
add 0xE0 TD F3_4;
|
|
add 0x2C TIX F3_4;
|
|
add 0xDC WD F3_4;
|
|
()
|
|
|
|
(*mnemonic to string*)
|
|
let string_of_mnemonic = function
|
|
(* Format 1 *)
|
|
| FIX -> "FIX"
|
|
| FLOAT -> "FLOAT"
|
|
| HIO -> "HIO"
|
|
| NORM -> "NORM"
|
|
| SIO -> "SIO"
|
|
| TIO -> "TIO"
|
|
|
|
(* Format 2 *)
|
|
| ADDR -> "ADDR"
|
|
| CLEAR -> "CLEAR"
|
|
| COMPR -> "COMPR"
|
|
| DIVR -> "DIVR"
|
|
| MULR -> "MULR"
|
|
| RMO -> "RMO"
|
|
| SHIFTL -> "SHIFTL"
|
|
| SHIFTR -> "SHIFTR"
|
|
| SUBR -> "SUBR"
|
|
| SVC -> "SVC"
|
|
| TIXR -> "TIXR"
|
|
|
|
(* Format 3/4 *)
|
|
| ADD -> "ADD"
|
|
| ADDF -> "ADDF"
|
|
| AND -> "AND"
|
|
| COMP -> "COMP"
|
|
| COMPF -> "COMPF"
|
|
| DIV -> "DIV"
|
|
| J -> "J"
|
|
| JEQ -> "JEQ"
|
|
| JGT -> "JGT"
|
|
| JLT -> "JLT"
|
|
| JSUB -> "JSUB"
|
|
| LDA -> "LDA"
|
|
| LDB -> "LDB"
|
|
| LDCH -> "LDCH"
|
|
| LDF -> "LDF"
|
|
| LDL -> "LDL"
|
|
| LDS -> "LDS"
|
|
| LDT -> "LDT"
|
|
| LDX -> "LDX"
|
|
| LPS -> "LPS"
|
|
| MUL -> "MUL"
|
|
| OR -> "OR"
|
|
| RD -> "RD"
|
|
| RSUB -> "RSUB"
|
|
| STA -> "STA"
|
|
| STB -> "STB"
|
|
| STCH -> "STCH"
|
|
| STF -> "STF"
|
|
| STL -> "STL"
|
|
| STS -> "STS"
|
|
| STSW -> "STSW"
|
|
| STT -> "STT"
|
|
| STX -> "STX"
|
|
| SUB -> "SUB"
|
|
| SUBF -> "SUBF"
|
|
| TD -> "TD"
|
|
| TIX -> "TIX"
|
|
| WD -> "WD"
|