source: branches/ByteArray/Devices/FrameBuffer.pas

Last change on this file was 11, checked in by chronos, 2 months ago
  • Modified: Updated Common package.
  • Fixed: Wrong return address from CALL instruction.
File size: 3.0 KB
Line 
1unit FrameBuffer;
2
3interface
4
5uses
6 Classes, SysUtils, Device, Channel, IntMemory, Int;
7
8type
9 TScreenMode = (smText, smGraphic);
10
11 { TFrameBuffer }
12
13 TFrameBuffer = class(TDevice)
14 private
15 FOnChange: TNotifyEvent;
16 procedure DoChange;
17 function ReadData(Size: TIntSize): TInt;
18 function ReadPosition(Size: TIntSize): TInt;
19 function ReadWidth(Size: TIntSize): TInt;
20 function ReadHeight(Size: TIntSize): TInt;
21 function ReadMode(Size: TIntSize): TInt;
22 procedure WriteData(Size: TIntSize; Value: TInt);
23 procedure WritePosition(Size: TIntSize; Value: TInt);
24 procedure WriteWidth(Size: TIntSize; Value: TInt);
25 procedure WriteHeight(Size: TIntSize; Value: TInt);
26 procedure WriteMode(Size: TIntSize; Value: TInt);
27 public
28 Memory: TMemory;
29 Position: Integer;
30 Width: Integer;
31 Height: Integer;
32 Mode: TScreenMode;
33 procedure UpdateMode;
34 function GetHandlers: THandlers; override;
35 constructor Create;
36 destructor Destroy; override;
37 property OnChange: TNotifyEvent read FOnChange write FOnChange;
38 end;
39
40
41implementation
42
43{ TFrameBuffer }
44
45procedure TFrameBuffer.DoChange;
46begin
47 if Assigned(FOnChange) then FOnChange(Self);
48end;
49
50function TFrameBuffer.ReadData(Size: TIntSize): TInt;
51begin
52 Result := Memory.Read(Position, Size);
53 Inc(Position, Size);
54end;
55
56function TFrameBuffer.ReadPosition(Size: TIntSize): TInt;
57begin
58 Result := Position;
59end;
60
61function TFrameBuffer.ReadWidth(Size: TIntSize): TInt;
62begin
63 Result := Width;
64end;
65
66function TFrameBuffer.ReadHeight(Size: TIntSize): TInt;
67begin
68 Result := Height;
69end;
70
71function TFrameBuffer.ReadMode(Size: TIntSize): TInt;
72begin
73 Result := Byte(Mode);
74end;
75
76procedure TFrameBuffer.WriteData(Size: TIntSize; Value: TInt);
77begin
78 Memory.Write(Position, Size, Value);
79 Inc(Position, Size);
80end;
81
82procedure TFrameBuffer.WritePosition(Size: TIntSize; Value: TInt);
83begin
84 Position := Value;
85end;
86
87procedure TFrameBuffer.WriteWidth(Size: TIntSize; Value: TInt);
88begin
89 Width := Value;
90 UpdateMode;
91end;
92
93procedure TFrameBuffer.WriteHeight(Size: TIntSize; Value: TInt);
94begin
95 Height := Value;
96 UpdateMode;
97end;
98
99procedure TFrameBuffer.WriteMode(Size: TIntSize; Value: TInt);
100begin
101 Mode := TScreenMode(Integer(Value));
102 UpdateMode;
103end;
104
105procedure TFrameBuffer.UpdateMode;
106begin
107 Memory.Size := Width * Height;
108 Memory.FillZero;
109end;
110
111function TFrameBuffer.GetHandlers: THandlers;
112begin
113 Result := THandlers.Create;
114 Result.ReadHandlers.Add(ReadData);
115 Result.ReadHandlers.Add(ReadPosition);
116 Result.ReadHandlers.Add(ReadWidth);
117 Result.ReadHandlers.Add(ReadHeight);
118 Result.ReadHandlers.Add(ReadMode);
119 Result.WriteHandlers.Add(WriteData);
120 Result.WriteHandlers.Add(WritePosition);
121 Result.WriteHandlers.Add(WriteWidth);
122 Result.WriteHandlers.Add(WriteHeight);
123 Result.WriteHandlers.Add(WriteMode);
124end;
125
126constructor TFrameBuffer.Create;
127begin
128 Memory := TMemory.Create;
129 Position := 0;
130 Width := 40;
131 Height := 25;
132 Mode := smText;
133 UpdateMode;
134end;
135
136destructor TFrameBuffer.Destroy;
137begin
138 FreeAndNil(Memory);
139 inherited;
140end;
141
142end.
143
Note: See TracBrowser for help on using the repository browser.