source: branches/simple/Memory.pas

Last change on this file was 42, checked in by chronos, 9 months ago
  • Modified: Improved simple virtual machine.
File size: 5.6 KB
Line 
1unit Memory;
2
3interface
4
5uses
6 Classes, SysUtils, Channel, Device;
7
8type
9
10 { TMemoryMulti }
11
12 TMemoryMulti = class
13 private
14 Memory: array of Byte;
15 procedure SetSize(Value: QWord);
16 function GetSize: QWord;
17 public
18 Position: QWord;
19 property Size: QWord read GetSize write SetSize;
20 end;
21
22 { TMemory8 }
23
24 TMemory8 = class(TDevice8)
25 private
26 Memory: array of Byte;
27 procedure SetSize(Value: Byte);
28 function GetSize: Byte;
29 public
30 Position: Integer;
31 procedure WritePos8(Data: Byte);
32 function ReadPos8: Byte;
33 procedure Write8(Address: Byte; Data: Byte);
34 function Read8(Address: Byte): Byte;
35 procedure SetDataBus(Channel: TAddressableChannel8); override;
36 property Size: Byte read GetSize write SetSize;
37 end;
38
39 { TMemory16 }
40
41 TMemory16 = class(TDevice16)
42 private
43 Memory: array of Byte;
44 procedure SetSize(Value: Word);
45 function GetSize: Word;
46 public
47 Position: Integer;
48 function ReadPos8: Byte;
49 function ReadPos16: Word;
50 procedure WritePos8(Data: Byte);
51 procedure WritePos16(Data: Word);
52 function Read8(Address: Word): Byte;
53 function Read16(Address: Word): Word;
54 procedure Write8(Address: Word; Data: Byte);
55 procedure Write16(Address: Word; Data: Word);
56 procedure SetDataBus(Channel: TAddressableChannel16); override;
57 property Size: Word read GetSize write SetSize;
58 end;
59
60 { TMemory64 }
61
62 TMemory64 = class(TDevice64)
63 private
64 Memory: array of Byte;
65 procedure SetSize(Value: QWord);
66 function GetSize: QWord;
67 public
68 Position: QWord;
69 function ReadPos8: Byte;
70 function ReadPos16: Word;
71 function ReadPos32: DWord;
72 function ReadPos64: QWord;
73 procedure WritePos8(Data: Byte);
74 procedure WritePos16(Data: Word);
75 procedure WritePos32(Data: Word);
76 procedure WritePos64(Data: Word);
77 function Read8(Address: QWord): Byte;
78 function Read16(Address: QWord): Word;
79 function Read32(Address: QWord): DWord;
80 function Read64(Address: QWord): QWord;
81 procedure Write8(Address: QWord; Data: Byte);
82 procedure Write16(Address: QWord; Data: Word);
83 procedure Write32(Address: QWord; Data: DWord);
84 procedure Write64(Address: QWord; Data: QWord);
85 procedure SetDataBus(Channel: TAddressableChannel64); override;
86 property Size: QWord read GetSize write SetSize;
87 end;
88
89 { TMemory }
90
91 TMemory = class(TDevice)
92 BitWidth: TBitWidth;
93 Memory8: TMemory8;
94 Memory16: TMemory16;
95 end;
96
97
98implementation
99
100{ TMemory64 }
101
102procedure TMemory64.SetSize(Value: QWord);
103begin
104
105end;
106
107function TMemory64.GetSize: QWord;
108begin
109
110end;
111
112function TMemory64.ReadPos8: Byte;
113begin
114
115end;
116
117function TMemory64.ReadPos16: Word;
118begin
119
120end;
121
122function TMemory64.ReadPos32: DWord;
123begin
124
125end;
126
127function TMemory64.ReadPos64: QWord;
128begin
129
130end;
131
132procedure TMemory64.WritePos8(Data: Byte);
133begin
134
135end;
136
137procedure TMemory64.WritePos16(Data: Word);
138begin
139
140end;
141
142procedure TMemory64.WritePos32(Data: Word);
143begin
144
145end;
146
147procedure TMemory64.WritePos64(Data: Word);
148begin
149
150end;
151
152function TMemory64.Read8(Address: QWord): Byte;
153begin
154
155end;
156
157function TMemory64.Read16(Address: QWord): Word;
158begin
159
160end;
161
162function TMemory64.Read32(Address: QWord): DWord;
163begin
164
165end;
166
167function TMemory64.Read64(Address: QWord): QWord;
168begin
169
170end;
171
172procedure TMemory64.Write8(Address: QWord; Data: Byte);
173begin
174
175end;
176
177procedure TMemory64.Write16(Address: QWord; Data: Word);
178begin
179
180end;
181
182procedure TMemory64.Write32(Address: QWord; Data: DWord);
183begin
184
185end;
186
187procedure TMemory64.Write64(Address: QWord; Data: QWord);
188begin
189
190end;
191
192procedure TMemory64.SetDataBus(Channel: TAddressableChannel64);
193begin
194 inherited SetDataBus(Channel);
195end;
196
197{ TMemoryMulti }
198
199procedure TMemoryMulti.SetSize(Value: QWord);
200begin
201 SetLength(Memory, Size);
202end;
203
204function TMemoryMulti.GetSize: QWord;
205begin
206 Result := Length(Memory);
207end;
208
209{ TMemory16 }
210
211procedure TMemory16.SetSize(Value: Word);
212begin
213 SetLength(Memory, Value);
214end;
215
216function TMemory16.GetSize: Word;
217begin
218 Result := Length(Memory);
219end;
220
221function TMemory16.ReadPos8: Byte;
222begin
223 Result := Read8(Position);
224 Inc(Position);
225end;
226
227function TMemory16.ReadPos16: Word;
228begin
229 Result := Read16(Position);
230 Inc(Position, 2);
231end;
232
233procedure TMemory16.WritePos8(Data: Byte);
234begin
235 Write8(Position, Data);
236 Inc(Position);
237end;
238
239procedure TMemory16.WritePos16(Data: Word);
240begin
241 Write8(Position, Data);
242 Inc(Position, 2);
243end;
244
245function TMemory16.Read8(Address: Word): Byte;
246begin
247 Result := Memory[Address];
248end;
249
250function TMemory16.Read16(Address: Word): Word;
251begin
252 Result := Memory[Address] or (Memory[Address + 1] shl 8);
253end;
254
255procedure TMemory16.Write8(Address: Word; Data: Byte);
256begin
257 Memory[Address] := Data;
258end;
259
260procedure TMemory16.Write16(Address: Word; Data: Word);
261begin
262 Memory[Address] := Data;
263 Memory[Address + 1] := Data shr 8;
264end;
265
266procedure TMemory16.SetDataBus(Channel: TAddressableChannel16);
267begin
268 Channel.Read8 := Read8;
269 Channel.Read16 := Read16;
270 Channel.Write8 := Write8;
271 Channel.Write16 := Write16;
272end;
273
274{ TMemory8 }
275
276procedure TMemory8.SetSize(Value: Byte);
277begin
278 SetLength(Memory, Value);
279end;
280
281function TMemory8.GetSize: Byte;
282begin
283 Result := Length(Memory);
284end;
285
286procedure TMemory8.WritePos8(Data: Byte);
287begin
288 Write8(Position, Data);
289 Inc(Position);
290end;
291
292function TMemory8.ReadPos8: Byte;
293begin
294 Result := Read8(Position);
295 Inc(Position);
296end;
297
298procedure TMemory8.Write8(Address: Byte; Data: Byte);
299begin
300 Memory[Address] := Data;
301end;
302
303function TMemory8.Read8(Address: Byte): Byte;
304begin
305 Result := Memory[Address];
306end;
307
308procedure TMemory8.SetDataBus(Channel: TAddressableChannel8);
309begin
310 Channel.Write8 := Write8;
311 Channel.Read8 := Read8;
312end;
313
314end.
315
Note: See TracBrowser for help on using the repository browser.