source: branches/ByteArray/Core.pas

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