1 | unit Cpu;
|
---|
2 |
|
---|
3 | interface
|
---|
4 |
|
---|
5 | uses
|
---|
6 | Classes, SysUtils, AddrChannel;
|
---|
7 |
|
---|
8 | type
|
---|
9 | {$MACRO ON}
|
---|
10 |
|
---|
11 | TOpcode = (opNop, opHalt, opInt, opSetC, opResC,
|
---|
12 | opLoadImmediate, opLoadImmediate8, opLoadImmediate16, opLoadImmediate32, opLoadImmediate64,
|
---|
13 | opLoad, opLoad8, opLoad16, opLoad32, opLoad64,
|
---|
14 | opStore, opStore8, opStore16, opStore32, opStore64,
|
---|
15 | opLoadBase, opLoadBase8, opLoadBase16, opLoadBase32, opLoadBase64,
|
---|
16 | opStoreBase, opStoreBase8, opStoreBase16, opStoreBase32, opStoreBase64,
|
---|
17 | opInput, opInput8, opInput16, opInput32, opInput64,
|
---|
18 | opOutput, opOutput8, opOutput16, opOutput32, opOutput64,
|
---|
19 | opInc, opInc8, opInc16, opInc32, opInc64,
|
---|
20 | opDec, opDec8, opDec16, opDec32, opDec64,
|
---|
21 | opAdd, opAdd8, opAdd16, opAdd32, opAdd64,
|
---|
22 | opSub, opSub8, opSub16, opSub32, opSub64,
|
---|
23 | opMul, opMul8, opMul16, opMul32, opMul64,
|
---|
24 | opDiv, opDiv8, opDiv16, opDiv32, opDiv64,
|
---|
25 | opMod, opMod8, opMod16, opMod32, opMod64,
|
---|
26 | opShr, opShr8, opShr16, opShr32, opShr64,
|
---|
27 | opShl, opShl8, opShl16, opShl32, opShl64,
|
---|
28 | opRor,
|
---|
29 | opRol,
|
---|
30 | opJump,
|
---|
31 | opJumpRel,
|
---|
32 | opCall,
|
---|
33 | opRet,
|
---|
34 | opRetI,
|
---|
35 | opPush, opPush8, opPush16, opPush32, opPush64,
|
---|
36 | opPop, opPop8, opPop16, opPop32, opPop64,
|
---|
37 | opXor,
|
---|
38 | opOr,
|
---|
39 | opAnd,
|
---|
40 | opLoadSys,
|
---|
41 | opStoreSys
|
---|
42 | );
|
---|
43 |
|
---|
44 | {$DEFINE TGCpu := TCpu8}
|
---|
45 | {$DEFINE TGCpuData := Byte}
|
---|
46 | {$DEFINE TGCpuAddrChannel := TAddrChannel8}
|
---|
47 | {$DEFINE TGCpuWidth := 8}
|
---|
48 | {$DEFINE INTERFACE}
|
---|
49 | {$I 'Cpu.inc'}
|
---|
50 |
|
---|
51 | {$DEFINE TGCpu := TCpu16}
|
---|
52 | {$DEFINE TGCpuData := Word}
|
---|
53 | {$DEFINE TGCpuAddrChannel := TAddrChannel16}
|
---|
54 | {$DEFINE TGCpuWidth := 16}
|
---|
55 | {$DEFINE INTERFACE}
|
---|
56 | {$I 'Cpu.inc'}
|
---|
57 |
|
---|
58 | {$DEFINE TGCpu := TCpu32}
|
---|
59 | {$DEFINE TGCpuData := DWord}
|
---|
60 | {$DEFINE TGCpuAddrChannel := TAddrChannel32}
|
---|
61 | {$DEFINE TGCpuWidth := 32}
|
---|
62 | {$DEFINE INTERFACE}
|
---|
63 | {$I 'Cpu.inc'}
|
---|
64 |
|
---|
65 | {$DEFINE TGCpu := TCpu64}
|
---|
66 | {$DEFINE TGCpuData := QWord}
|
---|
67 | {$DEFINE TGCpuAddrChannel := TAddrChannel64}
|
---|
68 | {$DEFINE TGCpuWidth := 64}
|
---|
69 | {$DEFINE INTERFACE}
|
---|
70 | {$I 'Cpu.inc'}
|
---|
71 |
|
---|
72 | { TCpu }
|
---|
73 |
|
---|
74 | TCpu = class
|
---|
75 | private
|
---|
76 | FCpu16: TCpu16;
|
---|
77 | FCpu32: TCpu32;
|
---|
78 | FCpu64: TCpu64;
|
---|
79 | FCpu8: TCpu8;
|
---|
80 | FWidth: TBitWidth;
|
---|
81 | procedure SetWidth(AValue: TBitWidth);
|
---|
82 | public
|
---|
83 | Memory: TAddrChannel;
|
---|
84 | IO: TAddrChannel;
|
---|
85 | property Width: TBitWidth read FWidth write SetWidth;
|
---|
86 | property Cpu8: TCpu8 read FCpu8;
|
---|
87 | property Cpu16: TCpu16 read FCpu16;
|
---|
88 | property Cpu32: TCpu32 read FCpu32;
|
---|
89 | property Cpu64: TCpu64 read FCpu64;
|
---|
90 | procedure Run;
|
---|
91 | constructor Create;
|
---|
92 | destructor Destroy; override;
|
---|
93 | end;
|
---|
94 |
|
---|
95 |
|
---|
96 | implementation
|
---|
97 |
|
---|
98 | { TCpu }
|
---|
99 |
|
---|
100 | procedure TCpu.SetWidth(AValue: TBitWidth);
|
---|
101 | begin
|
---|
102 | if FWidth = AValue then Exit;
|
---|
103 | case FWidth of
|
---|
104 | bw8: FreeAndNil(FCpu8);
|
---|
105 | bw16: FreeAndNil(FCpu16);
|
---|
106 | bw32: FreeAndNil(FCpu32);
|
---|
107 | bw64: FreeAndNil(FCpu64);
|
---|
108 | end;
|
---|
109 | FWidth := AValue;
|
---|
110 | FreeAndNil(Memory);
|
---|
111 | case FWidth of
|
---|
112 | bw8: begin
|
---|
113 | FCpu8 := TCpu8.Create;
|
---|
114 | Memory := TAddrChannel.Create(FCpu8.Memory);
|
---|
115 | IO := TAddrChannel.Create(FCpu8.IO);
|
---|
116 | end;
|
---|
117 | bw16: begin
|
---|
118 | FCpu16 := TCpu16.Create;
|
---|
119 | Memory := TAddrChannel.Create(FCpu16.Memory);
|
---|
120 | IO := TAddrChannel.Create(FCpu16.IO);
|
---|
121 | end;
|
---|
122 | bw32: begin
|
---|
123 | FCpu32 := TCpu32.Create;
|
---|
124 | Memory := TAddrChannel.Create(FCpu32.Memory);
|
---|
125 | IO := TAddrChannel.Create(FCpu32.IO);
|
---|
126 | end;
|
---|
127 | bw64: begin
|
---|
128 | FCpu64 := TCpu64.Create;
|
---|
129 | Memory := TAddrChannel.Create(FCpu64.Memory);
|
---|
130 | IO := TAddrChannel.Create(FCpu64.IO);
|
---|
131 | end;
|
---|
132 | end;
|
---|
133 | end;
|
---|
134 |
|
---|
135 | procedure TCpu.Run;
|
---|
136 | begin
|
---|
137 | case Width of
|
---|
138 | bw8: FCpu8.Run;
|
---|
139 | bw16: FCpu16.Run;
|
---|
140 | bw32: FCpu32.Run;
|
---|
141 | bw64: FCpu64.Run;
|
---|
142 | end;
|
---|
143 | end;
|
---|
144 |
|
---|
145 | constructor TCpu.Create;
|
---|
146 | begin
|
---|
147 | FCpu8 := TCpu8.Create;
|
---|
148 | Memory := TAddrChannel.Create(FCpu8.Memory);
|
---|
149 | IO := TAddrChannel.Create(FCpu8.IO);
|
---|
150 | end;
|
---|
151 |
|
---|
152 | destructor TCpu.Destroy;
|
---|
153 | begin
|
---|
154 | FreeAndNil(IO);
|
---|
155 | FreeAndNil(Memory);
|
---|
156 | case Width of
|
---|
157 | bw8: FreeAndNil(FCpu8);
|
---|
158 | bw16: FreeAndNil(FCpu16);
|
---|
159 | bw32: FreeAndNil(FCpu32);
|
---|
160 | bw64: FreeAndNil(FCpu64);
|
---|
161 | end;
|
---|
162 | inherited;
|
---|
163 | end;
|
---|
164 |
|
---|
165 | {$DEFINE TGCpuData := Byte}
|
---|
166 | {$DEFINE TGCpu := TCpu8}
|
---|
167 | {$DEFINE TGCpuAddrChannel := TAddrChannel8}
|
---|
168 | {$DEFINE TGCpuWidth := 8}
|
---|
169 | {$DEFINE IMPLEMENTATION}
|
---|
170 | {$I 'Cpu.inc'}
|
---|
171 |
|
---|
172 | {$DEFINE TGCpu := TCpu16}
|
---|
173 | {$DEFINE TGCpuData := Word}
|
---|
174 | {$DEFINE TGCpuAddrChannel := TAddrChannel16}
|
---|
175 | {$DEFINE TGCpuWidth := 16}
|
---|
176 | {$DEFINE IMPLEMENTATION}
|
---|
177 | {$I 'Cpu.inc'}
|
---|
178 |
|
---|
179 | {$DEFINE TGCpu := TCpu32}
|
---|
180 | {$DEFINE TGCpuData := DWord}
|
---|
181 | {$DEFINE TGCpuAddrChannel := TAddrChannel32}
|
---|
182 | {$DEFINE TGCpuWidth := 32}
|
---|
183 | {$DEFINE IMPLEMENTATION}
|
---|
184 | {$I 'Cpu.inc'}
|
---|
185 |
|
---|
186 | {$DEFINE TGCpu := TCpu64}
|
---|
187 | {$DEFINE TGCpuData := QWord}
|
---|
188 | {$DEFINE TGCpuAddrChannel := TAddrChannel64}
|
---|
189 | {$DEFINE TGCpuWidth := 64}
|
---|
190 | {$DEFINE IMPLEMENTATION}
|
---|
191 | {$I 'Cpu.inc'}
|
---|
192 |
|
---|
193 | end.
|
---|
194 |
|
---|