1 /**
2 Copyright: Copyright (c) 2014 Andrey Penechko.
3 License: a$(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 
7 module emulator.dcpu.constants;
8 
9 /// Table of literal values which may be stored in 'a' operand.
10 static ushort[32] literals =
11 	[0xFFFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
12 	 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
13 	 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
14 	 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E];
15 
16 /// Operands which will read nex word increasing pc register are '1', other are '0'.
17 static immutable ushort[64] nextWordOperands =
18 	[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
19 	 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1,
20 	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
21 	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
22 
23 /// Table of basic instructions cost.
24 static immutable ubyte[32] basicCycles =
25 	[10, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 
26 	 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 3, 3, 10, 10, 2, 2];
27 
28 /// Table of special instructions cost.
29 static immutable ubyte[32] specialCycles = 
30 	[10, 3, 10, 10, 10, 10, 10, 10, 4, 1, 1, 3, 2, 10, 10, 10,
31 	 2, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10];
32 
33 // Enums for opcodes. Just a bit of self documented code.
34 enum {SET = 0x01, ADD, SUB, MUL, MLI, DIV, DVI,
35 	  MOD, MDI, AND, BOR, XOR, SHR, ASR, SHL,
36 	  IFB, IFC, IFE, IFN, IFG, IFA, IFL, IFU,
37 	  ADX = 0x1A, SBX, STI = 0x1E, STD}
38 
39 enum {JSR = 0x01, INT = 0x08, IAG, IAS, RFI, IAQ, HWN = 0x10, HWQ, HWI}
40 
41 static string[] registerNames = ["A", "B", "C", "X", "Y", "Z", "I", "J"];
42 
43 static string[] basicOpcodeNames =
44 	["0x00", "SET", "ADD", "SUB", "MUL", "MLI", "DIV", "DVI",
45 	 "MOD", "MDI", "AND", "BOR", "XOR", "SHR", "ASR", "SHL",
46 	 "IFB", "IFC", "IFE", "IFN", "IFG", "IFA", "IFL", "IFU",
47 	 "0x18", "0x19", "ADX", "SBX", "0x1c", "0x1d", "STI", "STD"];
48 
49 static string[] specialOpcodeNames =
50 	["0x00", "JSR", "0x02", "0x03", "0x04", "0x05", "0x06", "0x07",
51 	 "INT", "IAG", "IAS", "RFI", "IAQ", "0x0d", "0x0e", "0x0f",
52 	 "HWN", "HWQ", "HWI", "0x0d", "0x13", "0x14", "0x15", "0x16",
53 	 "0x17", "0x18", "0x19", "0x1a", "0x1b", "0x1c", "0x1d", "0x1e", "0x1f"];
54 
55 static bool[32] isValidBasicOpcode =
56 	[0,1,1,1,1,1,1,1,
57 	 1,1,1,1,1,1,1,1,
58 	 1,1,1,1,1,1,1,1,
59 	 0,0,1,1,0,0,1,1];
60 
61 static bool[32] isValidSpecialOpcode =
62 	[0,1,0,0,0,0,0,0,
63 	 1,1,1,1,1,0,0,0,
64 	 1,1,1,0,0,0,0,0,
65 	 0,0,0,0,0,0,0,0];