source: branches/templates/Cpu.pas

Last change on this file was 44, checked in by chronos, 8 months ago
  • Added: More devices.
File size: 4.5 KB
Line 
1unit Cpu;
2
3interface
4
5uses
6 Classes, SysUtils, AddrChannel;
7
8type
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
96implementation
97
98{ TCpu }
99
100procedure TCpu.SetWidth(AValue: TBitWidth);
101begin
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;
133end;
134
135procedure TCpu.Run;
136begin
137 case Width of
138 bw8: FCpu8.Run;
139 bw16: FCpu16.Run;
140 bw32: FCpu32.Run;
141 bw64: FCpu64.Run;
142 end;
143end;
144
145constructor TCpu.Create;
146begin
147 FCpu8 := TCpu8.Create;
148 Memory := TAddrChannel.Create(FCpu8.Memory);
149 IO := TAddrChannel.Create(FCpu8.IO);
150end;
151
152destructor TCpu.Destroy;
153begin
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;
163end;
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
193end.
194
Note: See TracBrowser for help on using the repository browser.