Changeset 32 for branches/UltimatOS/UMachine.pas
- Timestamp:
- Jul 10, 2022, 12:37:58 AM (2 years ago)
- Location:
- branches/UltimatOS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UltimatOS
- Property svn:ignore
-
old new 2 2 UltimatOS.lps 3 3 UltimatOS.res 4 UltimatOS.dbg 4 5 lib
-
- Property svn:ignore
-
branches/UltimatOS/UMachine.pas
r31 r32 4 4 5 5 uses 6 Classes, SysUtils, UCpu, UMemory ;6 Classes, SysUtils, UCpu, UMemory, ExtCtrls; 7 7 8 8 type 9 TMachine = class; 9 10 10 11 { TDevice } 11 12 12 13 TDevice = class 14 Machine: TMachine; 13 15 procedure Reset; virtual; 14 16 end; 17 18 { TMouse } 15 19 16 20 TMouse = class(TDevice) 17 21 Position: TPoint; 22 InterruptVector: Integer; 23 procedure Move(X, Y: Integer); 18 24 end; 19 25 … … 54 60 TKeyboard = class(TDevice) 55 61 Buffer: TFifo; 62 InterruptVector: Integer; 56 63 function ReadKey: Integer; 57 64 function KeyReady: Integer; … … 59 66 destructor Destroy; override; 60 67 procedure Reset; override; 68 procedure Press(KeyCode: Integer); 69 end; 70 71 { TCounter } 72 73 TCounter = class(TDevice) 74 private 75 Timer: TTimer; 76 function GetEnabled: Boolean; 77 function GetInterval: Integer; 78 procedure SetEnabled(AValue: Boolean); 79 procedure SetInterval(AValue: Integer); 80 procedure DoTimer(Sender: TObject); 81 public 82 InterruptVector: Integer; 83 constructor Create; 84 destructor Destroy; override; 85 property Enabled: Boolean read GetEnabled write SetEnabled; 86 property Interval: Integer read GetInterval write SetInterval; 61 87 end; 62 88 … … 67 93 function CpuInput(Address: TAddress): TData; 68 94 procedure CpuOutput(Address: TAddress; Value: TData); 95 function GetRunning: Boolean; 96 procedure SetRunning(AValue: Boolean); 69 97 public 70 98 Cpu: TCpu; … … 73 101 Mouse: TMouse; 74 102 Screen: TScreen; 103 Counter: TCounter; 75 104 procedure Reset; 76 105 constructor Create; 77 106 destructor Destroy; override; 107 property Running: Boolean read GetRunning write SetRunning; 78 108 end; 79 109 80 110 81 111 implementation 112 113 { TMouse } 114 115 procedure TMouse.Move(X, Y: Integer); 116 begin 117 Position := Point(X, Y); 118 Machine.Cpu.Interrupt(InterruptVector); 119 end; 120 121 { TCounter } 122 123 function TCounter.GetEnabled: Boolean; 124 begin 125 Result := Timer.Enabled; 126 end; 127 128 function TCounter.GetInterval: Integer; 129 begin 130 Result := Timer.Interval; 131 end; 132 133 procedure TCounter.SetEnabled(AValue: Boolean); 134 begin 135 Timer.Enabled := AValue; 136 end; 137 138 procedure TCounter.SetInterval(AValue: Integer); 139 begin 140 Timer.Interval := AValue; 141 end; 142 143 procedure TCounter.DoTimer(Sender: TObject); 144 begin 145 Machine.Cpu.Interrupt(InterruptVector); 146 end; 147 148 constructor TCounter.Create; 149 begin 150 Timer := TTimer.Create(nil); 151 Timer.OnTimer := DoTimer; 152 Enabled := False; 153 end; 154 155 destructor TCounter.Destroy; 156 begin 157 FreeAndNil(Timer); 158 inherited; 159 end; 82 160 83 161 { TDevice } … … 183 261 begin 184 262 Buffer.Clear; 263 end; 264 265 procedure TKeyboard.Press(KeyCode: Integer); 266 begin 267 Buffer.Put(KeyCode); 268 Machine.Cpu.Interrupt(InterruptVector); 185 269 end; 186 270 … … 201 285 begin 202 286 if Address = 0 then Screen.SetPointer(Value) 203 else if Address = 1 then Screen.WriteData(Value); 287 else if Address = 1 then Screen.WriteData(Value) 288 else if Address = 2 then Counter.Interval := Value 289 else if Address = 3 then Counter.Enabled := Value = 1; 290 end; 291 292 function TMachine.GetRunning: Boolean; 293 begin 294 Result := Cpu.Running; 295 end; 296 297 procedure TMachine.SetRunning(AValue: Boolean); 298 begin 299 Cpu.Running := AValue; 204 300 end; 205 301 … … 213 309 constructor TMachine.Create; 214 310 begin 311 Counter := TCounter.Create; 312 Counter.Machine := Self; 313 Counter.InterruptVector := 2; 215 314 Memory := TMemory.Create; 216 315 Memory.Size := 200000; 217 316 Keyboard := TKeyboard.Create; 317 Keyboard.Machine := Self; 318 Keyboard.InterruptVector := 4; 218 319 Mouse := TMouse.Create; 320 Mouse.Machine := Self; 321 Mouse.InterruptVector := 3; 219 322 Screen := TScreen.Create; 220 323 Screen.Size := Point(640, 480); … … 232 335 FreeAndNil(Screen); 233 336 FreeAndNil(Memory); 337 FreeAndNil(Counter); 234 338 inherited; 235 339 end;
Note:
See TracChangeset
for help on using the changeset viewer.