source: branches/simple/Devices/Screen.pas

Last change on this file was 42, checked in by chronos, 10 months ago
  • Modified: Improved simple virtual machine.
File size: 5.6 KB
Line 
1unit Screen;
2
3interface
4
5uses
6 Classes, SysUtils, Device, DeviceManager, Memory, Channel;
7
8type
9 TScreenMode = (smText);
10
11 { TScreen8 }
12
13 TScreen8 = class(TDevice8)
14 private
15 FOnChange: TNotifyEvent;
16 function ReadData8: Byte;
17 function ReadAddr8: Byte;
18 function ReadWidth8: Byte;
19 function ReadHeight8: Byte;
20 procedure WriteData8(Data: Byte);
21 procedure WriteAddr8(Data: Byte);
22 procedure WriteWidth8(Data: Byte);
23 procedure WriteHeight8(Data: Byte);
24 procedure DoChange;
25 procedure UpdateMode;
26 public
27 Memory: TMemory8;
28 Width: Byte;
29 Height: Byte;
30 Mode: TScreenMode;
31 constructor Create;
32 destructor Destroy; override;
33 function GetHandlerCount: Integer; override;
34 function GetHandler(Address: Integer): TChannel8; override;
35 property OnChange: TNotifyEvent read FOnChange write FOnChange;
36 end;
37
38 { TScreen16 }
39
40 TScreen16 = class(TDevice16)
41 private
42 FOnChange: TNotifyEvent;
43 function ReadData8: Byte;
44 function ReadData16: Word;
45 function ReadAddr16: Word;
46 function ReadWidth16: Word;
47 function ReadHeight16: Word;
48 procedure WriteData8(Data: Byte);
49 procedure WriteData16(Data: Word);
50 procedure WriteAddr16(Data: Word);
51 procedure WriteWidth16(Data: Word);
52 procedure WriteHeight16(Data: Word);
53 procedure DoChange;
54 procedure UpdateMode;
55 public
56 Memory: TMemory16;
57 Width: Word;
58 Height: Word;
59 Mode: TScreenMode;
60 constructor Create;
61 destructor Destroy; override;
62 function GetHandlerCount: Integer; override;
63 function GetHandler(Address: Integer): TChannel16; override;
64 property OnChange: TNotifyEvent read FOnChange write FOnChange;
65 end;
66
67 TScreen = class(TDevice)
68 BitWidth: TBitWidth;
69 Screen8: TScreen8;
70 Screen16: TScreen16;
71 constructor Create(BitWidth: TBitWidth; Screen8: TScreen8; Screen16: TScreen16);
72 end;
73
74
75implementation
76
77{ TScreen }
78
79constructor TScreen.Create(BitWidth: TBitWidth; Screen8: TScreen8;
80 Screen16: TScreen16);
81begin
82 Self.BitWidth := BitWidth;
83 Self.Screen8 := Screen8;
84 Self.Screen16 := Screen16;
85end;
86
87{ TScreen16 }
88
89procedure TScreen16.WriteData8(Data: Byte);
90begin
91 Memory.WritePos8(Data);
92 DoChange;
93end;
94
95procedure TScreen16.WriteData16(Data: Word);
96begin
97 Memory.WritePos16(Data);
98 DoChange;
99end;
100
101function TScreen16.ReadData8: Byte;
102begin
103 Result := Memory.ReadPos8;
104end;
105
106function TScreen16.ReadData16: Word;
107begin
108 Result := Memory.ReadPos16;
109end;
110
111procedure TScreen16.WriteAddr16(Data: Word);
112begin
113 Memory.Position := Data;
114 DoChange;
115end;
116
117function TScreen16.ReadAddr16: Word;
118begin
119 Result := Memory.Position;
120end;
121
122procedure TScreen16.WriteWidth16(Data: Word);
123begin
124 Width := Data;
125 DoChange;
126end;
127
128function TScreen16.ReadWidth16: Word;
129begin
130 Result := Width;
131end;
132
133procedure TScreen16.WriteHeight16(Data: Word);
134begin
135 Height := Data;
136 DoChange;
137end;
138
139function TScreen16.ReadHeight16: Word;
140begin
141 Result := Height;
142end;
143
144procedure TScreen16.DoChange;
145begin
146 if Assigned(FOnChange) then FOnChange(Self);
147end;
148
149procedure TScreen16.UpdateMode;
150begin
151 Memory.Size := Width * Height;
152end;
153
154constructor TScreen16.Create;
155begin
156 Memory := TMemory16.Create;
157 Width := 80;
158 Height := 50;
159 Mode := smText;
160 UpdateMode;
161end;
162
163destructor TScreen16.Destroy;
164begin
165 FreeAndNil(Memory);
166 inherited;
167end;
168
169function TScreen16.GetHandlerCount: Integer;
170begin
171 Result := 4;
172end;
173
174function TScreen16.GetHandler(Address: Integer): TChannel16;
175begin
176 if Address = 0 then begin
177 Result := TChannel16.Create;
178 Result.Read16 := ReadData16;
179 Result.Write16 := WriteData16;
180 end else
181 if Address = 1 then begin
182 Result := TChannel16.Create;
183 Result.Read16 := ReadAddr16;
184 Result.Write16 := WriteAddr16;
185 end else
186 if Address = 2 then begin
187 Result := TChannel16.Create;
188 Result.Read16 := ReadWidth16;
189 Result.Write16 := WriteWidth16;
190 end else
191 if Address = 3 then begin
192 Result := TChannel16.Create;
193 Result.Read16 := ReadHeight16;
194 Result.Write16 := WriteHeight16;
195 end;
196end;
197
198{ TScreen8 }
199
200procedure TScreen8.WriteData8(Data: Byte);
201begin
202 Memory.WritePos8(Data);
203 DoChange;
204end;
205
206function TScreen8.ReadData8: Byte;
207begin
208 Result := Memory.ReadPos8;
209end;
210
211procedure TScreen8.WriteAddr8(Data: Byte);
212begin
213 Memory.Position := Data;
214 DoChange;
215end;
216
217function TScreen8.ReadAddr8: Byte;
218begin
219 Result := Memory.Position;
220end;
221
222procedure TScreen8.WriteWidth8(Data: Byte);
223begin
224 Width := Data;
225 DoChange;
226end;
227
228function TScreen8.ReadWidth8: Byte;
229begin
230 Result := Width;
231end;
232
233procedure TScreen8.WriteHeight8(Data: Byte);
234begin
235 Height := Data;
236 DoChange;
237end;
238
239function TScreen8.ReadHeight8: Byte;
240begin
241 Result := Height;
242end;
243
244procedure TScreen8.DoChange;
245begin
246 if Assigned(FOnChange) then FOnChange(Self);
247end;
248
249procedure TScreen8.UpdateMode;
250begin
251 Memory.Size := Width * Height;
252end;
253
254constructor TScreen8.Create;
255begin
256 Memory := TMemory8.Create;
257 Width := 20;
258 Height := 12;
259 Mode := smText;
260 UpdateMode;
261end;
262
263destructor TScreen8.Destroy;
264begin
265 FreeAndNil(Memory);
266 inherited;
267end;
268
269function TScreen8.GetHandlerCount: Integer;
270begin
271 Result := 4;
272end;
273
274function TScreen8.GetHandler(Address: Integer): TChannel8;
275begin
276 if Address = 0 then begin
277 Result := TChannel8.Create;
278 Result.Read8 := ReadData8;
279 Result.Write8 := WriteData8;
280 end else
281 if Address = 1 then begin
282 Result := TChannel8.Create;
283 Result.Read8 := ReadAddr8;
284 Result.Write8 := WriteAddr8;
285 end else
286 if Address = 2 then begin
287 Result := TChannel8.Create;
288 Result.Read8 := ReadWidth8;
289 Result.Write8 := WriteWidth8;
290 end else
291 if Address = 3 then begin
292 Result := TChannel8.Create;
293 Result.Read8 := ReadHeight8;
294 Result.Write8 := WriteHeight8;
295 end;
296end;
297
298end.
299
Note: See TracBrowser for help on using the repository browser.