source: branches/simple/Machine.pas

Last change on this file was 42, checked in by chronos, 9 months ago
  • Modified: Improved simple virtual machine.
File size: 2.5 KB
Line 
1unit Machine;
2
3interface
4
5uses
6 Classes, SysUtils, Cpu, Memory, DeviceManager, Console, Screen;
7
8type
9
10 { TMachine }
11
12 TMachine = class
13 protected
14 FPoweredOn: Boolean;
15 procedure SetPoweredOn(AValue: Boolean); virtual;
16 published
17 property PoweredOn: Boolean read FPoweredOn write SetPoweredOn;
18 end;
19
20 { TMachine8 }
21
22 TMachine8 = class(TMachine)
23 private
24 FPoweredOn: Boolean;
25 procedure SetPoweredOn(AValue: Boolean); override;
26 public
27 DeviceManager: TDeviceManager8;
28 Memory: TMemory8;
29 Console: TConsole8;
30 Cpu: TCpu8;
31 Screen: TScreen8;
32 constructor Create;
33 destructor Destroy; override;
34 end;
35
36 { TMachine16 }
37
38 TMachine16 = class(TMachine)
39 private
40 FPoweredOn: Boolean;
41 procedure SetPoweredOn(AValue: Boolean); override;
42 public
43 DeviceManager: TDeviceManager16;
44 Memory: TMemory16;
45 Console: TConsole16;
46 Cpu: TCpu16;
47 Screen: TScreen16;
48 constructor Create;
49 destructor Destroy; override;
50 end;
51
52
53implementation
54
55{ TMachine }
56
57procedure TMachine.SetPoweredOn(AValue: Boolean);
58begin
59 if FPoweredOn=AValue then Exit;
60 FPoweredOn:=AValue;
61end;
62
63{ TMachine16 }
64
65procedure TMachine16.SetPoweredOn(AValue: Boolean);
66begin
67 if FPoweredOn = AValue then Exit;
68 FPoweredOn := AValue;
69 if FPoweredOn then Cpu.Run;
70end;
71
72constructor TMachine16.Create;
73begin
74 Cpu := TCpu16.Create;
75 Console := TConsole16.Create;
76 Screen := TScreen16.Create;
77 DeviceManager := TDeviceManager16.Create;
78 DeviceManager.RegisterDevice(Console);
79 DeviceManager.RegisterDevice(Screen);
80 DeviceManager.SetDataBus(Cpu.IO);
81 Memory := TMemory16.Create;
82 Memory.Size := 65535;
83 Memory.SetDataBus(Cpu.Memory);
84end;
85
86destructor TMachine16.Destroy;
87begin
88 FreeAndNil(Cpu);
89 FreeAndNil(DeviceManager);
90 FreeAndNil(Console);
91 FreeAndNil(Memory);
92 FreeAndNil(Screen);
93 inherited;
94end;
95
96{ TMachine8 }
97
98procedure TMachine8.SetPoweredOn(AValue: Boolean);
99begin
100 if FPoweredOn = AValue then Exit;
101 FPoweredOn := AValue;
102 if FPoweredOn then Cpu.Run;
103end;
104
105constructor TMachine8.Create;
106begin
107 Cpu := TCpu8.Create;
108 Console := TConsole8.Create;
109 Screen := TScreen8.Create;
110 DeviceManager := TDeviceManager8.Create;
111 DeviceManager.RegisterDevice(Console);
112 DeviceManager.RegisterDevice(Screen);
113 DeviceManager.SetDataBus(Cpu.IO);
114 Memory := TMemory8.Create;
115 Memory.Size := 255;
116 Memory.SetDataBus(Cpu.Memory);
117end;
118
119destructor TMachine8.Destroy;
120begin
121 FreeAndNil(Cpu);
122 FreeAndNil(DeviceManager);
123 FreeAndNil(Console);
124 FreeAndNil(Memory);
125 FreeAndNil(Screen);
126 inherited;
127end;
128
129end.
130
Note: See TracBrowser for help on using the repository browser.