source: branches/ByteArray/Core.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: 7.6 KB
Line 
1unit Core;
2
3interface
4
5uses
6 Classes, SysUtils, Machine, ActnList, Forms, PersistentForm,
7 ApplicationInfo, RegistryEx, Translator, Theme,
8 FormConsole, FormScreen, FormSourceEditor, FormMemory, FormDisassembler,
9 FormStorage, FormDebugger;
10
11type
12
13 { TCore }
14
15 TCore = class(TDataModule)
16 AAbout: TAction;
17 AConsole: TAction;
18 ARestart: TAction;
19 APowerOff: TAction;
20 APowerOn: TAction;
21 ActionList1: TActionList;
22 ADebugger: TAction;
23 ADevices: TAction;
24 ADisassembler: TAction;
25 AExit: TAction;
26 AFullscreen: TAction;
27 AMemory: TAction;
28 ApplicationInfo1: TApplicationInfo;
29 AScreen: TAction;
30 ASettings: TAction;
31 ASourceEditor: TAction;
32 AStorage: TAction;
33 PersistentForm1: TPersistentForm;
34 ThemeManager1: TThemeManager;
35 Translator1: TTranslator;
36 procedure AAboutExecute(Sender: TObject);
37 procedure AConsoleExecute(Sender: TObject);
38 procedure ADebuggerExecute(Sender: TObject);
39 procedure ADisassemblerExecute(Sender: TObject);
40 procedure AExitExecute(Sender: TObject);
41 procedure AFullscreenExecute(Sender: TObject);
42 procedure AMemoryExecute(Sender: TObject);
43 procedure APowerOffExecute(Sender: TObject);
44 procedure APowerOnExecute(Sender: TObject);
45 procedure ARestartExecute(Sender: TObject);
46 procedure AScreenExecute(Sender: TObject);
47 procedure ASettingsExecute(Sender: TObject);
48 procedure ASourceEditorExecute(Sender: TObject);
49 procedure AStorageExecute(Sender: TObject);
50 procedure DataModuleCreate(Sender: TObject);
51 procedure DataModuleDestroy(Sender: TObject);
52 private
53 procedure LoadConfig;
54 procedure SaveConfig;
55 public
56 MainForm: TForm;
57 FormScreen: TFormScreen;
58 FormConsole: TFormConsole;
59 FormMemory: TFormMemory;
60 FormSourceEditor: TFormSourceEditor;
61 FormDisassembler: TFormDisassembler;
62 FormStorage: TFormStorage;
63 FormDebugger: TFormDebugger;
64 StartUpForm: string;
65 AutoStartMachine: Boolean;
66 ExecutableFileName: string;
67 Machine: TMachine;
68 end;
69
70var
71 Core: TCore;
72
73
74implementation
75
76{$R *.lfm}
77
78uses
79 BigInt, Cpu, FormEx, FormSettings, FormAbout;
80
81{ TCore }
82
83procedure TCore.DataModuleCreate(Sender: TObject);
84begin
85 Machine := TMachine.Create;
86 LoadConfig;
87
88 TFormEx.Translator := Translator1;
89 TFormEx.ThemeManager := ThemeManager1;
90 TFormEx.PersistentForm := PersistentForm1;
91
92 if StartUpForm = 'Screen' then begin
93 AScreen.Execute;
94 end;
95 if StartUpForm = 'Source editor' then begin
96 ASourceEditor.Execute;
97 end;
98 if StartUpForm = 'Debugger' then begin
99 ADebugger.Execute;
100 end;
101 if FileExists(ExecutableFileName) then
102 Machine.Memory.LoadFromFile(ExecutableFileName);
103 if AutoStartMachine then
104 Machine.PowerOn;
105end;
106
107procedure TCore.AExitExecute(Sender: TObject);
108begin
109 Application.Terminate;
110end;
111
112procedure TCore.ADebuggerExecute(Sender: TObject);
113begin
114 if not Assigned(FormDebugger) then begin
115 FormDebugger := TFormDebugger.Create(nil);
116 end;
117 FormDebugger.Show;
118end;
119
120procedure TCore.ADisassemblerExecute(Sender: TObject);
121begin
122 if not Assigned(FormDisassembler) then begin
123 FormDisassembler := TFormDisassembler.Create(nil);
124 if not Assigned(MainForm) then MainForm := FormDisassembler;
125 end;
126 FormDisassembler.Disassembler.Memory := Machine.Memory;
127 FormDisassembler.Disassembler.DataWidth := Machine.Cpu.DataWidth;
128 FormDisassembler.Disassembler.AddressWidth := Machine.Cpu.AddressWidth;
129 FormDisassembler.Show;
130end;
131
132procedure TCore.AConsoleExecute(Sender: TObject);
133begin
134 if not Assigned(FormConsole) then begin
135 FormConsole := TFormConsole.Create(nil);
136 FormConsole.Serial := Machine.Serial;
137 end;
138 FormConsole.Show;
139end;
140
141procedure TCore.AAboutExecute(Sender: TObject);
142var
143 FormAbout: TFormAbout;
144begin
145 FormAbout := TFormAbout.Create(nil);
146 try
147 FormAbout.ApplicationInfo := ApplicationInfo1;
148 FormAbout.ShowModal;
149 finally
150 FreeAndNil(FormAbout);
151 end;
152end;
153
154procedure TCore.AFullscreenExecute(Sender: TObject);
155begin
156 PersistentForm1.SetFullScreen(not PersistentForm1.FormFullScreen);
157end;
158
159procedure TCore.AMemoryExecute(Sender: TObject);
160begin
161 if not Assigned(FormMemory) then begin
162 FormMemory := TFormMemory.Create(nil);
163 FormMemory.Memory := Machine.Memory;
164 end;
165 FormMemory.Show;
166end;
167
168procedure TCore.APowerOffExecute(Sender: TObject);
169begin
170 Machine.PowerOff;
171end;
172
173procedure TCore.APowerOnExecute(Sender: TObject);
174begin
175 Machine.PowerOn;
176end;
177
178procedure TCore.ARestartExecute(Sender: TObject);
179begin
180 Machine.PowerOff;
181 Machine.PowerOn;
182end;
183
184procedure TCore.AScreenExecute(Sender: TObject);
185begin
186 if not Assigned(FormScreen) then begin
187 FormScreen := TFormScreen.Create(nil);
188 if not Assigned(MainForm) then MainForm := FormScreen;
189 FormScreen.FrameBuffer := Machine.FrameBuffer;
190 Machine.FrameBuffer.OnChange := FormScreen.ScreenChange;
191 end;
192 FormScreen.Show;
193end;
194
195procedure TCore.ASettingsExecute(Sender: TObject);
196var
197 FormSettings: TFormSettings;
198begin
199 FormSettings := TFormSettings.Create(nil);
200 try
201 FormSettings.ShowModal;
202 finally
203 FormSettings.Free;
204 end;
205end;
206
207procedure TCore.ASourceEditorExecute(Sender: TObject);
208begin
209 if not Assigned(FormSourceEditor) then begin
210 FormSourceEditor := TFormSourceEditor.Create(nil);
211 if not Assigned(MainForm) then MainForm := FormSourceEditor;
212 FormSourceEditor.Machine := Machine;
213 end;
214 FormSourceEditor.Show;
215end;
216
217procedure TCore.AStorageExecute(Sender: TObject);
218begin
219 if not Assigned(FormStorage) then begin
220 FormStorage := TFormStorage.Create(nil);
221 FormStorage.Storage := Machine.Storage;
222 end;
223 FormStorage.Show;
224end;
225
226procedure TCore.DataModuleDestroy(Sender: TObject);
227begin
228 SaveConfig;
229 if Assigned(FormSourceEditor) then FreeAndNil(FormSourceEditor);
230 if Assigned(FormScreen) then FreeAndNil(FormScreen);
231 if Assigned(FormConsole) then FreeAndNil(FormConsole);
232 if Assigned(FormMemory) then FreeAndNil(FormMemory);
233 if Assigned(FormDisassembler) then FreeAndNil(FormDisassembler);
234 if Assigned(FormStorage) then FreeAndNil(FormStorage);
235 if Assigned(FormDebugger) then FreeAndNil(FormDebugger);
236
237 FreeAndNil(Machine);
238end;
239
240procedure TCore.LoadConfig;
241begin
242 PersistentForm1.RegistryContext := ApplicationInfo1.GetRegistryContext;
243
244 with TRegistryEx.Create do
245 try
246 CurrentContext := ApplicationInfo1.GetRegistryContext;
247 if ValueExists('LanguageCode') then
248 Translator1.Language := Translator1.Languages.SearchByCode(ReadStringWithDefault('LanguageCode', ''))
249 else Translator1.Language := Translator1.Languages.SearchByCode('');
250 if ValueExists('Theme') then
251 ThemeManager1.Theme := ThemeManager1.Themes.FindByName(ReadStringWithDefault('Theme', 'System'))
252 else ThemeManager1.Theme := ThemeManager1.Themes.FindByName('System');
253 StartUpForm := ReadStringWithDefault('StartUpForm', 'Screen');
254 AutoStartMachine := ReadBoolWithDefault('AutoStartMachine', True);
255 ExecutableFileName := ReadStringWithDefault('ExecutableFileName', 'compiled.bin');
256 finally
257 Free;
258 end;
259end;
260
261procedure TCore.SaveConfig;
262begin
263 with TRegistryEx.Create do
264 try
265 CurrentContext := ApplicationInfo1.GetRegistryContext;
266 if Assigned(Translator1.Language) and (Translator1.Language.Code <> '') then
267 WriteString('LanguageCode', Translator1.Language.Code)
268 else DeleteValue('LanguageCode');
269 if Assigned(ThemeManager1.Theme) and (ThemeManager1.Theme.Name <> '') then
270 WriteString('Theme', ThemeManager1.Theme.Name)
271 else DeleteValue('Theme');
272 WriteString('StartUpForm', StartUpForm);
273 WriteBool('AutoStartMachine', AutoStartMachine);
274 WriteString('ExecutableFileName', ExecutableFileName);
275 finally
276 Free;
277 end;
278end;
279
280end.
281
Note: See TracBrowser for help on using the repository browser.