| 1 | unit UFormMain;
|
|---|
| 2 |
|
|---|
| 3 | {$mode delphi}{$H+}
|
|---|
| 4 |
|
|---|
| 5 | interface
|
|---|
| 6 |
|
|---|
| 7 | uses
|
|---|
| 8 | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
|---|
| 9 | ComCtrls, Menus, UMachine;
|
|---|
| 10 |
|
|---|
| 11 | type
|
|---|
| 12 |
|
|---|
| 13 | { TForm1 }
|
|---|
| 14 |
|
|---|
| 15 | TForm1 = class(TForm)
|
|---|
| 16 | ButtonRun: TButton;
|
|---|
| 17 | ListViewMemory: TListView;
|
|---|
| 18 | ListViewRegisters: TListView;
|
|---|
| 19 | procedure ButtonRunClick(Sender: TObject);
|
|---|
| 20 | procedure FormCreate(Sender: TObject);
|
|---|
| 21 | procedure FormDestroy(Sender: TObject);
|
|---|
| 22 | procedure FormShow(Sender: TObject);
|
|---|
| 23 | procedure ListViewMemoryData(Sender: TObject; Item: TListItem);
|
|---|
| 24 | procedure ListViewRegistersData(Sender: TObject; Item: TListItem);
|
|---|
| 25 | private
|
|---|
| 26 | procedure Example;
|
|---|
| 27 | procedure ShowMemory;
|
|---|
| 28 | procedure ShowRegisters;
|
|---|
| 29 | public
|
|---|
| 30 | Machine: TMachine;
|
|---|
| 31 | end;
|
|---|
| 32 |
|
|---|
| 33 | var
|
|---|
| 34 | Form1: TForm1;
|
|---|
| 35 |
|
|---|
| 36 | implementation
|
|---|
| 37 |
|
|---|
| 38 | {$R *.lfm}
|
|---|
| 39 |
|
|---|
| 40 | { TForm1 }
|
|---|
| 41 |
|
|---|
| 42 | procedure TForm1.FormCreate(Sender: TObject);
|
|---|
| 43 | begin
|
|---|
| 44 | Machine := TMachine.Create;
|
|---|
| 45 | end;
|
|---|
| 46 |
|
|---|
| 47 | procedure TForm1.ButtonRunClick(Sender: TObject);
|
|---|
| 48 | begin
|
|---|
| 49 | Machine.Run;
|
|---|
| 50 | ShowMemory;
|
|---|
| 51 | ShowRegisters;
|
|---|
| 52 | end;
|
|---|
| 53 |
|
|---|
| 54 | procedure TForm1.FormDestroy(Sender: TObject);
|
|---|
| 55 | begin
|
|---|
| 56 | Machine.Free;
|
|---|
| 57 | end;
|
|---|
| 58 |
|
|---|
| 59 | procedure TForm1.FormShow(Sender: TObject);
|
|---|
| 60 | begin
|
|---|
| 61 | SetLength(Machine.Memory, 1000);
|
|---|
| 62 |
|
|---|
| 63 | Example;
|
|---|
| 64 | ShowMemory;
|
|---|
| 65 | ShowRegisters;
|
|---|
| 66 | end;
|
|---|
| 67 |
|
|---|
| 68 | procedure TForm1.ListViewMemoryData(Sender: TObject; Item: TListItem);
|
|---|
| 69 | var
|
|---|
| 70 | Data: string;
|
|---|
| 71 | I: Integer;
|
|---|
| 72 | begin
|
|---|
| 73 | if (Item.Index >= 0) and (Item.Index < (Length(Machine.Memory) div 16)) then begin
|
|---|
| 74 | Item.Caption := IntToHex(Item.Index * 16, 8);
|
|---|
| 75 | Data := '';
|
|---|
| 76 | for I := 0 to 15 do
|
|---|
| 77 | Data := Data + ' ' + IntToHex(Machine.Memory[Item.Index * 16 + I], 2);
|
|---|
| 78 | Item.SubItems.Add(Data);
|
|---|
| 79 | end;
|
|---|
| 80 | end;
|
|---|
| 81 |
|
|---|
| 82 | procedure TForm1.ListViewRegistersData(Sender: TObject; Item: TListItem);
|
|---|
| 83 | begin
|
|---|
| 84 | if (Item.Index >= 0) and (Item.Index < Length(Machine.Registers)) then begin
|
|---|
| 85 | Item.Caption := IntToHex(Item.Index, 2);
|
|---|
| 86 | Item.SubItems.Add(IntToHex(Machine.Registers[Item.Index], 8));
|
|---|
| 87 | end;
|
|---|
| 88 | end;
|
|---|
| 89 |
|
|---|
| 90 | procedure TForm1.Example;
|
|---|
| 91 | const
|
|---|
| 92 | Acc = 0;
|
|---|
| 93 | Source = 1;
|
|---|
| 94 | Dest = 2;
|
|---|
| 95 | Counter = 3;
|
|---|
| 96 | Temp = 4;
|
|---|
| 97 | Jump = 5;
|
|---|
| 98 | var
|
|---|
| 99 | Writer: TInstructionWriter;
|
|---|
| 100 | LoopAddr: Integer;
|
|---|
| 101 | begin
|
|---|
| 102 | Writer := TInstructionWriter.Create;
|
|---|
| 103 | with Writer do begin
|
|---|
| 104 | Machine := Self.Machine;
|
|---|
| 105 | AddGetDataSize(Temp);
|
|---|
| 106 | AddCopyConst8(Temp, 1);
|
|---|
| 107 |
|
|---|
| 108 | AddCopyConst(Counter, 8);
|
|---|
| 109 | AddCopyConst(Source, $30);
|
|---|
| 110 | AddCopyConst(Dest, $60);
|
|---|
| 111 |
|
|---|
| 112 | LoopAddr := Addr;
|
|---|
| 113 | AddCopyFromMem(Acc, Source);
|
|---|
| 114 | AddCopyToMem(Acc, Dest);
|
|---|
| 115 | AddInc(Source);
|
|---|
| 116 | AddInc(Dest);
|
|---|
| 117 | AddDec(Counter);
|
|---|
| 118 | AddTestNotZero(Counter);
|
|---|
| 119 | AddCopyConst8(Jump, LoopAddr - (Addr + 3));
|
|---|
| 120 | AddJumpRelCond8(Jump);
|
|---|
| 121 | AddHalt;
|
|---|
| 122 | end;
|
|---|
| 123 | Writer.Free;
|
|---|
| 124 | end;
|
|---|
| 125 |
|
|---|
| 126 | procedure TForm1.ShowMemory;
|
|---|
| 127 | begin
|
|---|
| 128 | ListViewMemory.Items.Count := Length(Machine.Memory) div 16;
|
|---|
| 129 | ListViewMemory.Refresh;
|
|---|
| 130 | end;
|
|---|
| 131 |
|
|---|
| 132 | procedure TForm1.ShowRegisters;
|
|---|
| 133 | begin
|
|---|
| 134 | ListViewRegisters.Items.Count := Length(Machine.Registers);
|
|---|
| 135 | ListViewRegisters.Refresh;
|
|---|
| 136 | end;
|
|---|
| 137 |
|
|---|
| 138 |
|
|---|
| 139 | end.
|
|---|
| 140 |
|
|---|