source: trunk/Instructions.pas

Last change on this file was 2, checked in by chronos, 14 months ago
  • Added: Initial development version.
File size: 4.4 KB
Line 
1unit Instructions;
2
3interface
4
5uses
6 Classes, SysUtils, Generics.Collections, CpuZ80;
7
8type
9 TParamType = (ptNone, ptNumberByte, ptNumberByteIndir,
10 ptNumberWord, ptNumberWordIndir, ptRegA,
11 ptRegB, ptRegC, ptRegD, ptRegE, ptRegH, ptRegL, ptRegBC, ptRegDE, ptRegHL,
12 ptRegSP, ptRegIX, ptRegIY, ptRegBCIndir, ptRegDEIndir, ptRegHLIndir,
13 ptFlagZ, ptFlagNZ, ptFlagC, ptFlagNC, pt00, pt08, pt10, pt18, pt20, pt28,
14 pt30, pt38, pt0, pt1, pt2);
15
16 TParamTypes = array of TParamType;
17
18 TInstructionInfo = class
19 Instruction: TInstruction;
20 Name: string;
21 Params: TParamTypes;
22 Description: string;
23 end;
24
25 { TInstructionSet }
26
27 TInstructionSet = class
28 Items: TObjectList<TInstructionInfo>;
29 function SearchName(Name: string): TInstructionInfo;
30 function SearchInstruction(Instruction: TInstruction): TInstructionInfo;
31 function AddNew(Instruction: TInstruction; Name: string;
32 Params: TParamTypes; Description: string = ''): TInstructionInfo;
33 constructor Create;
34 destructor Destroy; override;
35 end;
36
37const
38 ParamTypeText: array[TParamType] of string = ('', 'n', '(n)', 'nn', '(nn)', 'A', 'B',
39 'C', 'D', 'E', 'H', 'L', 'BC', 'DE', 'HL', 'SP', 'IX', 'IY', '(BC)',
40 '(DE)', '(HL)', 'Z', 'NZ', 'C', 'NC', '00', '08', '10', '18', '20', '28',
41 '30', '38', '0', '1', '2');
42
43
44implementation
45
46{ TInstructionSet }
47
48function TInstructionSet.SearchName(Name: string): TInstructionInfo;
49var
50 I: Integer;
51begin
52 I := 0;
53 while (I < Items.Count) and (Items[I].Name <> Name) do Inc(I);
54 if I < Items.Count then Result := Items[I]
55 else Result := nil;
56end;
57
58function TInstructionSet.SearchInstruction(Instruction: TInstruction
59 ): TInstructionInfo;
60var
61 I: Integer;
62begin
63 I := 0;
64 while (I < Items.Count) and (Items[I].Instruction <> Instruction) do Inc(I);
65 if I < Items.Count then Result := Items[I]
66 else Result := nil;
67end;
68
69function TInstructionSet.AddNew(Instruction: TInstruction; Name: string;
70 Params: TParamTypes; Description: string = ''): TInstructionInfo;
71begin
72 Result := TInstructionInfo.Create;
73 Result.Instruction := Instruction;
74 Result.Name := Name;
75 Result.Params := Params;
76 Result.Description := Description;
77 Items.Add(Result);
78end;
79
80constructor TInstructionSet.Create;
81begin
82 Items := TObjectList<TInstructionInfo>.Create;
83 AddNew(inNop, 'NOP', []);
84 AddNew(inHalt, 'HALT', []);
85 AddNew(inLdAN, 'LD', [ptRegA, ptNumberByte]);
86 AddNew(inLdBN, 'LD', [ptRegB, ptNumberByte]);
87 AddNew(inLdSpNn, 'LD', [ptRegSP, ptNumberWord]);
88 AddNew(inLdAC, 'LD', [ptRegA, ptRegC]);
89 AddNew(inLdHlNn, 'LD', [ptRegHL, ptNumberWord]);
90 AddNew(inLdBcNn, 'LD', [ptRegBC, ptNumberWord]);
91 AddNew(inLdDeNn, 'LD', [ptRegDE, ptNumberWord]);
92 AddNew(inLdHlIndirectN, 'LD', [ptRegHLIndir, ptNumberByte]);
93 AddNew(inLdNnIndirectA, 'LD', [ptNumberWordIndir, ptRegA]);
94 AddNew(inLdCHlIndirect, 'LD', [ptRegC, ptRegHLIndir]);
95 AddNew(inLdBcIndirectA, 'LD', [ptRegBCIndir, ptRegA]);
96 AddNew(inLdHlIndirectNn, 'LD', [ptRegHLIndir, ptNumberWord]);
97 AddNew(inJpNn, 'JP', [ptNumberWord]);
98 AddNew(inJpZNn, 'JP', [ptFlagZ, ptNumberWord]);
99 AddNew(inCpN, 'CP', [ptNumberByte]);
100 AddNew(inCpD, 'CP', [ptRegD]);
101 AddNew(inCpE, 'CP', [ptRegE]);
102 AddNew(inCallNn, 'CALL', [ptNumberWord]);
103 AddNew(inRet, 'RET', []);
104 AddNew(inRst00, 'RST', [pt00]);
105 AddNew(inRst08, 'RST', [pt08]);
106 AddNew(inRst10, 'RST', [pt10]);
107 AddNew(inRst18, 'RST', [pt18]);
108 AddNew(inRst20, 'RST', [pt20]);
109 AddNew(inRst28, 'RST', [pt28]);
110 AddNew(inRst30, 'RST', [pt30]);
111 AddNew(inRst38, 'RST', [pt38]);
112 AddNew(inDi, 'DI', []);
113 AddNew(inEi, 'EI', []);
114 AddNew(inIm1, 'IM', [pt1]);
115 AddNew(inXorA, 'XOR', [ptRegA]);
116 AddNew(inPushBC, 'PUSH', [ptRegBC]);
117 AddNew(inPushDE, 'PUSH', [ptRegDE]);
118 AddNew(inPushHL, 'PUSH', [ptRegHL]);
119 AddNew(inSbcHlDe, 'SBC', [ptRegHL, ptRegDE]);
120 AddNew(inExDeHl, 'EX', [ptRegDE, ptRegHL]);
121 AddNew(inDecHl, 'DEC', [ptRegHL]);
122 AddNew(inDecB, 'INC', [ptRegB]);
123 AddNew(inIncHl, 'INC', [ptRegHL]);
124 AddNew(inIncBc, 'INC', [ptRegBC]);
125 AddNew(inIncB, 'INC', [ptRegB]);
126 AddNew(inLdHlIndirectE, 'LD', [ptRegHLIndir, ptRegE]);
127 AddNew(inLdHlIndirectD, 'LD', [ptRegHLIndir, ptRegD]);
128 AddNew(inLdAHlIndirect, 'LD', [ptRegA, ptRegHLIndir]);
129 AddNew(inJrNzD, 'JR', [ptFlagNZ, ptNumberByte]);
130 AddNew(inJrNcD, 'JR', [ptFlagNC, ptNumberByte]);
131 AddNew(inOutNA, 'OUT', [ptNumberByteIndir, ptRegA]);
132end;
133
134destructor TInstructionSet.Destroy;
135begin
136 FreeAndNil(Items);
137 inherited;
138end;
139
140end.
141
Note: See TracBrowser for help on using the repository browser.