source: branches/multi-width/Memory.pas

Last change on this file was 54, checked in by chronos, 6 months ago
  • Added: Experimental multi-width CPU.
File size: 2.5 KB
Line 
1unit Memory;
2
3interface
4
5uses
6 Classes, SysUtils, Channel;
7
8type
9
10 { TMemory }
11
12 TMemory = class
13 private
14 FData: PByte;
15 function GetSize: QWord;
16 procedure SetSize(AValue: QWord);
17 public
18 function Read8(Address: QWord): Byte;
19 function Read16(Address: QWord): Word;
20 function Read24(Address: QWord): DWord;
21 function Read32(Address: QWord): DWord;
22 function Read64(Address: QWord): QWord;
23 procedure Write8(Address: QWord; Data: Byte);
24 procedure Write16(Address: QWord; Data: Word);
25 procedure Write24(Address: QWord; Data: DWord);
26 procedure Write32(Address: QWord; Data: DWord);
27 procedure Write64(Address: QWord; Data: QWord);
28 procedure SetChannel(Channel: TChannel);
29 constructor Create;
30 destructor Destroy; override;
31 property Size: QWord read GetSize write SetSize;
32 end;
33
34
35implementation
36
37{ TMemory }
38
39function TMemory.GetSize: QWord;
40begin
41 Result := MemSize(FData);
42end;
43
44procedure TMemory.SetSize(AValue: QWord);
45begin
46 FData := ReAllocMem(FData, AValue);
47end;
48
49function TMemory.Read8(Address: QWord): Byte;
50begin
51 Result := PByte(FData + Address)^;
52end;
53
54function TMemory.Read16(Address: QWord): Word;
55begin
56 Result := PWord(FData + Address)^;
57end;
58
59function TMemory.Read24(Address: QWord): DWord;
60begin
61 Result := PDWord(FData + Address)^ and $ffffff;
62end;
63
64function TMemory.Read32(Address: QWord): DWord;
65begin
66 Result := PDWord(FData + Address)^;
67end;
68
69function TMemory.Read64(Address: QWord): QWord;
70begin
71 Result := PQWord(FData + Address)^;
72end;
73
74procedure TMemory.Write8(Address: QWord; Data: Byte);
75begin
76 PByte(FData + Address)^ := Data;
77end;
78
79procedure TMemory.Write16(Address: QWord; Data: Word);
80begin
81 PWord(FData + Address)^ := Data;
82end;
83
84procedure TMemory.Write24(Address: QWord; Data: DWord);
85begin
86 PWord(FData + Address)^ := Data and $ffff;
87 PByte(FData + Address + SizeOf(Word))^ := Data shr 16;
88end;
89
90procedure TMemory.Write32(Address: QWord; Data: DWord);
91begin
92 PDWord(FData + Address)^ := Data;
93end;
94
95procedure TMemory.Write64(Address: QWord; Data: QWord);
96begin
97 PQWord(FData + Address)^ := Data;
98end;
99
100procedure TMemory.SetChannel(Channel: TChannel);
101begin
102 Channel.Read8 := Read8;
103 Channel.Read16 := Read16;
104 Channel.Read24 := Read24;
105 Channel.Read32 := Read32;
106 Channel.Read64 := Read64;
107 Channel.Write8 := Write8;
108 Channel.Write16 := Write16;
109 Channel.Write24 := Write24;
110 Channel.Write32 := Write32;
111 Channel.Write64 := Write64;
112end;
113
114constructor TMemory.Create;
115begin
116 Size := 0;
117end;
118
119destructor TMemory.Destroy;
120begin
121 Size := 0;
122 inherited;
123end;
124
125end.
126
Note: See TracBrowser for help on using the repository browser.