Скачиваний:
43
Добавлен:
02.05.2014
Размер:
67.18 Кб
Скачать
{$A+,B-,C+,D+,E-,F-,G+,H-,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
unit MainUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, shellApi;

type
THex2=string[2];{Тип Hexlude 1-байтовый}
THex4=string[4];{Тип Hexlude 2-байтовый}
TBin=array[0..7] of char; {Тип бинарный для представления регистра флагов нумерация прямая}
TMode=(MemMode,AddrMode,RegMode,Reg2Mode,NoneMode,RunMode);
TMem=array[0..65535]of byte;
TComand=record
code:THex2;
mnem:string[9];
end;
TMyThread = class(TThread)
protected
procedure Execute; override;
end;

TForm1 = class(TForm)
BtnReg: TButton;
BtnMem: TButton;
BtnBRK: TButton;
BtnClr: TButton;
BtnRst: TButton;
BtnC: TButton;
BtnD: TButton;
BtnE: TButton;
BtnF: TButton;
BtnStep: TButton;
Btn8: TButton;
Btn9: TButton;
BtnA: TButton;
BtnB: TButton;
BtnRun: TButton;
BTn4: TButton;
Btn5: TButton;
Btn6: TButton;
Btn7: TButton;
BtnADDR: TButton;
Btn1: TButton;
Btn2: TButton;
Btn3: TButton;
BTN0: TButton;
BtnNext: TButton;
EditAdr: TEdit;
Label1: TLabel;
EditReg: TEdit;
EditData: TEdit;
Label2: TLabel;
Label3: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
BtnTrass: TButton;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
SaveBtn: TButton;
LoadBtn: TButton;
RadioGroup1: TRadioGroup;
BtnStop: TButton;
GroupBox1: TGroupBox;
EditCode: TEdit;
EditMnem: TEdit;
Label9: TLabel;
Label10: TLabel;
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure BtnRegClick(Sender: TObject);
procedure BtnRstClick(Sender: TObject);
procedure BtnADDRClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BTN0Click(Sender: TObject);
procedure Btn1Click(Sender: TObject);
procedure Btn2Click(Sender: TObject);
procedure Btn3Click(Sender: TObject);
procedure BTn4Click(Sender: TObject);
procedure Btn5Click(Sender: TObject);
procedure Btn6Click(Sender: TObject);
procedure Btn7Click(Sender: TObject);
procedure Btn8Click(Sender: TObject);
procedure Btn9Click(Sender: TObject);
procedure BtnAClick(Sender: TObject);
procedure BtnBClick(Sender: TObject);
procedure BtnCClick(Sender: TObject);
procedure BtnDClick(Sender: TObject);
procedure BtnEClick(Sender: TObject);
procedure BtnFClick(Sender: TObject);
procedure BtnMemClick(Sender: TObject);
procedure BtnNextClick(Sender: TObject);
procedure BtnClrClick(Sender: TObject);
procedure BtnBRKClick(Sender: TObject);
procedure BtnStepClick(Sender: TObject);
procedure BtnRunClick(Sender: TObject);
procedure BtnTrassClick(Sender: TObject);
procedure SaveBtnClick(Sender: TObject);
procedure LoadBtnClick(Sender: TObject);
procedure BtnStopClick(Sender: TObject);
procedure EditCodeEnter(Sender: TObject);
procedure EditMnemEnter(Sender: TObject);
procedure EditCodeChange(Sender: TObject);
procedure EditMnemChange(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public

{ Public declarations }
end;


var
Form1: TForm1;
regF,{Регистр флагов}
regA,{аккумулятор}
regRK,{регистр комманд предназначенный для приема 1-го байта комманды}
regW,regZ,{регистры временного хранения информации}
regB,regC,regD,regE,regH,regL{Регисты общего назначения}
:byte;
WForD:char;//Временная переменная для обработкивывода на индикатор регистровых пар
WForClr:byte;//Временная переменная для функции CLR
regSP,{Указатель стека}
regPC,{Счетчик комманд}
regPA, {регистр адреса}
regSG {регистр вершины стека}
:word;
Mem:TMem; {массив памяти}
Mode:TMode;{Текущий режим}
Brk:word;
Codes:array[0..255] of TComand;
flag:boolean;
BackUp:record
regF,regA,regRK,regW,regZ,regB,regC,regD,regE,regH,regL:byte;
regSP,regPC,regPA,regSG:word;
Mem:TMem;
Mode:TMode;
EditAdrT:THex4;
EditRegT,EditDataT:THex2;
l1,l2,l3:char;
end;
MyTread:TMyThread;

implementation

uses Unit2, Unit3;
{$R *.dfm}
Function NoSp(st:string):string;
Begin
while st[length(st)]=' ' do SetLength(st,length(st)-1);
NoSp:=st;
End;

Function BinToNum(input:TBin):byte;
var
vr,vr2:byte;
i:integer;
Begin
vr:=0;
vr2:=128;
i:=0;
while i<=7 do begin
vr:=vr+(byte(input[i])-48)*vr2;
vr2:=vr2 div 2;
inc(i);
end;
BinToNum:=vr;
End;

Function NumToBin(input:byte):TBin;
var
vr:TBin;
i:byte;
Begin
for i:=0 to 7 do begin
vr[7-i]:=char((input mod 2)+48);
input:=input div 2;
end;
NumToBin:=vr;
End;

{Функция преобразует строковый тип Hexlude в тип Word}
function HexToNum(Input:string):Word;
var
e,vr,i:word;
Begin
e:=0;
for i:=1 to length(Input) do begin
e:=e*16;
vr:=word(input[i])-48;
if vr>10 then vr:=vr-7;
e:=e+vr;
end;
HexToNum:=e;
end;

{Функция преобразует тип Byte в строковый тип Hexlude}
function NumToHex(Input:byte):THex2; overload;
var
vr:byte;
h:string;
Begin
vr:=input div 16;
if vr>9 then h:=char(vr+55)
else h:=char(vr+48);
vr:=input mod 16;
if vr>9 then h:=h+char(vr+55)
else h:=h+char(vr+48);
NumToHex:=h;
End;

function NumToHex(Input:word):THex4; overload;
var
vr,i:byte;
h:string;
Begin
h:='';
for i:=1 to 4 do begin
vr:=input mod 16;
if vr>9 then h:=char(vr+55)+h
else h:=char(vr+48)+h;
input:=input div 16;
end;
NumToHex:=h;
End;

Procedure MovAndHaltProc; {Обработка mov Ri,Rj; mov M,Rj; mov Ri,M; Halt }
Begin
case regRk of
64:regB:=regB; {40h}
65:regB:=regC; {41h}
66:regB:=regD; {42h}
67:regB:=regE; {43h}
68:regB:=regH; {44h}
69:regB:=regL; {45h}
70:regB:=mem[regH*256+regL];{46h}
71:regB:=regA; {47h}
72:regC:=regB; {48h}
73:regC:=regC; {49h}
74:regC:=regD; {4Ah}
75:regC:=regE; {4Bh}
76:regC:=regH; {4Ch}
77:regC:=regL; {4Dh}
78:regC:=mem[regH*256+regL];{4Eh}
79:regC:=regA; {4Fh}
80:regD:=regB; {50h}
81:regD:=regC; {51h}
82:regD:=regD; {52h}
83:regD:=regE; {53h}
84:regD:=regH; {54h}
85:regD:=regL; {55h}
86:regD:=mem[regH*256+regL];{56h}
87:regD:=regA; {57h}
88:regE:=regB; {58h}
89:regE:=regC; {59h}
90:regE:=regD; {5Ah}
91:regE:=regE; {5Bh}
92:regE:=regH; {5Ch}
93:regE:=regL; {5Dh}
94:regE:=mem[regH*256+regL];{5Eh}
95:regE:=regA; {5Fh}
96:regH:=regB; {60h}
97:regH:=regC; {61h}
98:regH:=regD; {62h}
99:regH:=regE; {63h}
100:regH:=regH; {64h}
101:regH:=regL; {65h}
102:regH:=mem[regH*256+regL];{66h}
103:regH:=regA; {67h}
104:regL:=regB; {68h}
105:regL:=regC; {69h}
106:regL:=regD; {6Ah}
107:regL:=regE; {6Bh}
108:regL:=regH; {6Ch}
109:regL:=regL; {6Dh}
110:regL:=mem[regH*256+regL];{6Eh}
111:regL:=regA; {6Fh}
112:mem[regH*256+regL]:=regB;{70h}
113:mem[regH*256+regL]:=regC;{71h}
114:mem[regH*256+regL]:=regD;{72h}
115:mem[regH*256+regL]:=regE;{73h}
116:mem[regH*256+regL]:=regH;{74h}
117:mem[regH*256+regL]:=regL;{75h}
118:Mode:=NoneMode; {76h}
119:mem[regH*256+regL]:=regA;{77h}
120:regA:=regB; {78h}
121:regA:=regC; {79h}
122:regA:=regD; {7Ah}
123:regA:=regE; {7Bh}
124:regA:=regH; {7Ch}
125:regA:=regL; {7Dh}
126:regA:=mem[regH*256+regL];{7Eh}
127:regA:=regA; {7Fh}
end;
End;

Procedure MviProc;
Begin
case regRK of
6: regB:=mem[regPC]; {06h}
14: regC:=mem[regPC]; {0Eh}
22: regD:=mem[regPC]; {16h}
30: regE:=mem[regPC]; {1Eh}
38: regH:=mem[regPC]; {26h}
46: regL:=mem[regPC]; {2Eh}
54: mem[regH*256+regL]:=mem[regPC];{36h}
62: regA:=mem[regPC]; {3Eh}
end;
inc(regPC);
End;

Procedure CallProc;
var
f:boolean;
Begin
f:=false;
case regRK of
205:f:=true; {CDh CALL}
196:if NumToBin(regF)[1]='0' then f:=true;{C4h CHZ}
204:if NumToBin(regF)[1]='1' then f:=true;{CCh CZ}
212:if NumToBin(regF)[7]='0' then f:=true;{D4h CHC}
220:if NumToBin(regF)[7]='1' then f:=true;{DCh CC}
228:if NumToBin(regF)[5]='0' then f:=true;{E4h CPO}
236:if NumToBin(regF)[5]='1' then f:=true;{ECh CPE}
244:if NumToBin(regF)[0]='0' then f:=true;{F4h CP}
252:if NumToBin(regF)[0]='1' then f:=true;{FCh CM}
end;
if f then begin
regPC:=RegPC+2;
mem[regSP-1]:=regPC div 256;
mem[regSP-2]:=regPC mod 256;
regSP:=regSP-2;
regPC:=mem[regPC-1]*256+mem[regPC-2]
end;
End;
Procedure RetProc;
var
f:boolean;
Begin
f:=false;
case regRK of
201:f:=true; {C9h CALL}
192:if NumToBin(regF)[1]='0' then f:=true;{C0h CHZ}
200:if NumToBin(regF)[1]='1' then f:=true;{C8h CZ}
208:if NumToBin(regF)[7]='0' then f:=true;{D0h CHC}
216:if NumToBin(regF)[7]='1' then f:=true;{D8h CC}
224:if NumToBin(regF)[5]='0' then f:=true;{E0h CPO}
232:if NumToBin(regF)[5]='1' then f:=true;{E8h CPE}
240:if NumToBin(regF)[0]='0' then f:=true;{F0h CP}
248:if NumToBin(regF)[0]='1' then f:=true;{F8h CM}
end;
if f then begin
regPC:=mem[regSP+1]*256+mem[regSP];
regSP:=regSP+2;
end;
End;

Procedure LxiProc;
Begin
case regRK of
1: regB:=mem[regPC]; {01h}
17: regD:=mem[regPC]; {11h}
33: regH:=mem[regPC]; {21h}
49: regSP:=mem[regPC]; {31h}
end;
inc(regPC);
case regRK of
1: regC:=mem[regPC]; {01h}
17: regE:=mem[regPC]; {11h}
33: regL:=mem[regPC]; {21h}
49: regSP:=regSP+mem[regPC]*256; {31h}
end;
inc(regPC);
End;


Procedure AddProc;
var
add,vr:shortint;
i,sum:byte;
s,z,ac,p,su:char;
BinVr:TBin;
Begin
case regRK of
128,136:Add:=regB; {80h 88h}
129,137:Add:=regC; {81h 89h}
130,138:Add:=regD; {82h 8Ah}
131,139:Add:=regE; {83h 8Bh}
132,140:Add:=regH; {84h 8Ch}
133,141:Add:=regL; {85h 8Dh}
134,142:Add:=mem[regH*256+regL]; {86h 8Eh}
135,143:Add:=regA; {87h 8Fh}
198,206:begin add:=mem[regPC]; inc(regPC); end; {C6h Обработка ADI CEh ACI}
end;
vr:=regA;
if regRK in [128..135,198] then regA:=regA+add
else regA:=regA+add+StrToInt(NumToBin(regF)[7]);

s:=NumToBin(regA)[0];
if shortint(regA)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(regA)[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';
if regRK in [128..135,198] then begin
if (add mod 16)+(vr mod 16)>15 then AC:='1' else AC:='0';
end
else begin
if (add mod 16)+(vr mod 16)+StrToInt(NumToBin(regF)[7])>15 then AC:='1' else AC:='0';
end;
if regRK in [128..135,198] then begin
if integer(vr+add)<>shortint(regA) then su:='1' else su:='0';
end
else begin
if integer(vr+add+StrToInt(NumToBin(regF)[7]))<>shortint(regA) then su:='1' else su:='0';
end;
BinVr[0]:=s;
BinVr[1]:=z;
BinVr[2]:='0';
BinVr[3]:=ac;
BinVr[4]:='0';
BinVr[5]:=p;
BinVr[6]:='1';
BinVr[7]:=su;
regF:=BinToNum(BinVr);
End;

Procedure DadProc; {09h,19h,29h,39h Обработка DAD}
var
add,vr:integer;
sum:longint;
SU:char;
vrem:TBin;
Begin
case regRK of
09:add:=regB*256+regC; {09h}
25:add:=regD*256+regE; {19h}
41:add:=regH*256+regL; {29h}
57:add:=regSP; {39h}
end;
vr:=regH*256+regL;
sum:=vr+add;
regH:=word(sum) div 256;
regL:=word(sum) mod 256;
if longword(vr+add)<>integer(regH*256+regL) then SU:='1'
else SU:='0';
vrem:=NumToBin(regF);
vrem[7]:=SU;
regF:=BinToNum(vrem);

End;


Procedure SubProc;
var
add,vr:shortint;
i,sum:byte;
s,z,ac,p,su:char;
BinVr:TBin;
Begin
case regRK of
144,152,184:Add:=regB; {90h 98h B8h}
145,153,185:Add:=regC; {91h 99h B9h}
146,154,186:Add:=regD; {92h 9Ah BAh}
147,155,187:Add:=regE; {93h 9Bh BBh}
148,156,188:Add:=regH; {94h 9Ch BCh}
149,157,189:Add:=regL; {95h 9Dh BDh}
150,158,190:Add:=mem[regH*256+regL]; {96h 9Eh BEh}
151,159,191:Add:=regA; {97h 9Fh BFh}
214,222,254:begin add:=mem[regPC]; inc(regPC); end; {D6h DEh FEh Обработка SUI SBI}
end;
vr:=regA;
if regRK in [152..159,222] then regA:=regA-add-StrToInt(NumToBin(regF)[7])
else regA:=regA-add;
s:=NumToBin(regA)[0];
if shortint(regA)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(regA)[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';
if regRK in [152..159,222] then begin
if ((add mod 16)+StrToInt(NumToBin(regF)[7]))>(vr mod 16) then AC:='1' else AC:='0';
end
else begin
if (add mod 16)>(vr mod 16) then AC:='1' else AC:='0';
end;
if regRK in [152..159,222] then begin
if integer(vr-add-StrToInt(NumToBin(regF)[7]))<>byte(regA) then su:='1' else su:='0';
end
else begin
if integer(vr-add)<>byte(regA) then su:='1' else su:='0';
end;
if regRK in [184..191,254] then regA:=vr;
BinVr[0]:=s;
BinVr[1]:=z;
BinVr[2]:='0';
BinVr[3]:=ac;
BinVr[4]:='0';
BinVr[5]:=p;
BinVr[6]:='1';
BinVr[7]:=su;
regF:=BinToNum(BinVr);
End;

Procedure InrProc;
var
vr,sum,i:byte;
s,z,p,AC:char;
vrem:TBin;
Begin
case regRK of
4:begin vr:=regB;inc(regB);end; {04h}
12:begin vr:=regC;inc(regC);end; {0Ch}
20:begin vr:=regD;inc(regD);end; {14h}
28:begin vr:=regE;inc(regE);end; {1Ch}
36:begin vr:=regH;inc(regH);end; {24h}
44:begin vr:=regL;inc(regL);end; {2Ch}
52:begin vr:=mem[regH*256+regL];inc(mem[regH*256+regL]);end; {34h}
60:begin vr:=regA;inc(regA);end; {3Ch}
end;
s:=NumToBin(byte(vr+1))[0];

if shortint(vr+1)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(byte(vr+1))[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';
if (vr mod 16)>14 then AC:='1' else AC:='0';
vrem:=NumToBin(regF);
vrem[0]:=s;
vrem[1]:=z;
vrem[3]:=ac;
vrem[5]:=p;
regF:=BinToNum(vrem);
End;

Procedure InxProc;
var
vr:word;
Begin
case regRk of
3:begin vr:=regB*256+regC; inc(vr); regB:=vr div 256;regC:=vr mod 256; end;{03h}
19:begin vr:=regD*256+regE; inc(vr); regD:=vr div 256;regE:=vr mod 256; end;{13h}
35:begin vr:=regB*256+regH; inc(vr); regB:=vr div 256;regL:=vr mod 256; end;{23h}
51:begin inc(regSP); end; {33h}
end;
End;

Procedure DcrProc;
var
vr,sum,i:byte;
s,z,p,AC:char;
vrem:TBin;
Begin
case regRK of
5:begin vr:=regB;dec(regB);end; {05h}
13:begin vr:=regC;dec(regC);end; {0Dh}
21:begin vr:=regD;dec(regD);end; {15h}
29:begin vr:=regE;dec(regE);end; {1Dh}
37:begin vr:=regH;dec(regH);end; {25h}
45:begin vr:=regL;dec(regL);end; {2Dh}
53:begin vr:=mem[regH*256+regL];dec(mem[regH*256+regL]);end; {35h}
61:begin vr:=regA;dec(regA);end; {3Dh}
end;
s:=NumToBin(byte(vr-1))[0];
if shortint(vr-1)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(byte(vr-1))[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';
if (vr mod 16)=0 then AC:='1' else AC:='0';
vrem:=NumToBin(regF);
vrem[0]:=s;
vrem[1]:=z;
vrem[3]:=ac;
vrem[5]:=p;
regF:=BinToNum(vrem);
End;

Procedure DcxProc;
var
vr:word;
Begin
case regRk of
3:begin vr:=regB*256+regC; dec(vr); regB:=vr div 256;regC:=vr mod 256; end;{03h}
19:begin vr:=regD*256+regE; dec(vr); regD:=vr div 256;regE:=vr mod 256; end;{13h}
35:begin vr:=regB*256+regH; dec(vr); regB:=vr div 256;regL:=vr mod 256; end;{23h}
51:begin dec(regSP); end; {33h}
end;
End;

Procedure DdaProc; {27h}
var
vr1,vr,sum,i:byte;
s,z,p,su,ac:char;
BinVr:TBin;
Begin
vr1:=0;
if ((regA mod 16)>9) {or (NumToBin(regF)[3]='1')} then vr1:=6;
if ((regA div 16)>9) {or (NumToBin(regF)[7]='1')} then vr1:=vr1+6*16;
vr:=regA;
regA:=regA+vr1;
s:=NumToBin(regA)[0];
if shortint(regA)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(regA)[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';

if (vr1 mod 16)+(vr mod 16)>15 then AC:='1' else AC:='0';
if integer(vr+vr1)<>shortint(regA) then su:='1' else su:='0';
BinVr[0]:=s;
BinVr[1]:=z;
BinVr[2]:='0';
BinVr[3]:=ac;
BinVr[4]:='0';
BinVr[5]:=p;
BinVr[6]:='1';
BinVr[7]:=su;
regF:=BinToNum(BinVr);
End;

Procedure AndProc;
var
vr,A,vrem:TBin;
i,sum:byte;
s,z,p:char;
Begin
case regRK of
160: vr:=NumToBin(regB); {A0h}
161: vr:=NumToBin(regC); {A1h}
162: vr:=NumToBin(regD); {A2h}
163: vr:=NumToBin(regE); {A3h}
164: vr:=NumToBin(regH); {A4h}
165: vr:=NumToBin(regL); {A5h}
166: vr:=NumToBin(mem[regH*256+regL]); {A6h}
167: vr:=NumToBin(regA); {A7h}
230: begin vr:=NumToBin(mem[regPC]);inc(regPC);end; {E6h}
end;
a:=numToBin(regA);
for i:=0 to 7 do
if boolean(StrToInt(vr[i])) and boolean(StrToInt(a[i])) then a[i]:='1'
else a[i]:='0';
regA:=BinToNum(a);

vrem:=NumToBin(regF);
s:=NumToBin(regA)[0];
if shortint(regA)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(regA)[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';
vrem[0]:=s;
vrem[1]:=z;
vrem[5]:=p;
regF:=BinToNum(vrem);
End;

Procedure XorProc;
var
vr,A,vrem:TBin;
i,sum:byte;
s,z,p:char;
Begin
case regRK of
168: vr:=NumToBin(regB); {A8h}
169: vr:=NumToBin(regC); {A9h}
170: vr:=NumToBin(regD); {AAh}
171: vr:=NumToBin(regE); {ABh}
172: vr:=NumToBin(regH); {ACh}
173: vr:=NumToBin(regL); {ADh}
174: vr:=NumToBin(mem[regH*256+regL]); {AEh}
175: vr:=NumToBin(regA); {AFh}
238: begin vr:=NumToBin(mem[regPC]);inc(regPC);end; {EEh}
end;
a:=numToBin(regA);
for i:=0 to 7 do
if boolean(StrToInt(vr[i])) xor boolean(StrToInt(a[i])) then a[i]:='1'
else a[i]:='0';
regA:=BinToNum(a);
vrem:=NumToBin(regF);
s:=NumToBin(regA)[0];
if shortint(regA)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(regA)[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';
vrem[0]:=s;
vrem[1]:=z;
vrem[5]:=p;
regF:=BinToNum(vrem);
End;

Procedure OrProc;
var
vr,A,vrem:TBin;
i,sum:byte;
s,z,p:char;
Begin
case regRK of
176: vr:=NumToBin(regB); {B0h}
177: vr:=NumToBin(regC); {B1h}
178: vr:=NumToBin(regD); {B2h}
179: vr:=NumToBin(regE); {B3h}
180: vr:=NumToBin(regH); {B4h}
181: vr:=NumToBin(regL); {B5h}
182: vr:=NumToBin(mem[regH*256+regL]); {B6h}
183: vr:=NumToBin(regA); {B7h}
246: begin vr:=NumToBin(mem[regPC]);inc(regPC);end; {F6h}
end;
a:=numToBin(regA);
for i:=0 to 7 do
if boolean(StrToInt(vr[i])) or boolean(StrToInt(a[i])) then a[i]:='1'
else a[i]:='0';
regA:=BinToNum(a);
vrem:=NumToBin(regF);
s:=NumToBin(regA)[0];
if shortint(regA)=0 then z:='1' else z:='0';
sum:=0;
for i:=0 to 7 do
if numTobin(regA)[i]='1' then inc(sum);
if (sum mod 2)=0 then p:='1' else p:='0';
vrem[0]:=s;
vrem[1]:=z;
vrem[5]:=p;
regF:=BinToNum(vrem);
End;

Procedure RlcProc;
var
BinVr:TBin;
i:byte;
ch:char;
Begin
BinVr:=NumToBin(regA);
ch:=BinVr[0];
for i:=0 to 6 do
BinVr[i]:=BinVr[i+1];
BinVr[7]:=ch;
regA:=BinToNum(BinVr);
ch:=BinVr[0];
BinVr:=NumToBin(regF);
BinVr[7]:=ch;
regF:=BinToNum(binVr)
End;

Procedure RalProc; {17h}
var
BinA,BinF:TBin;
i:byte;
ch:char;
Begin
BinF:=NumToBin(regF);
ch:=BinF[7];
BinA:=NumToBin(regA);
BinF[7]:=BinA[0];
for i:=0 to 6 do
BinA[i]:=BinA[i+1];
BinA[7]:=ch;
regA:=BinToNum(BinA);
regF:=BinToNum(BinF);
End;

Procedure RarProc; {1Fh}
var
BinA,BinF:TBin;
i:byte;
ch:char;
Begin
BinF:=NumToBin(regF);
ch:=BinF[7];
BinA:=NumToBin(regA);
BinF[7]:=BinA[7];
for i:=6 downto 0 do
BinA[i+1]:=BinA[i];
BinA[0]:=ch;
regA:=BinToNum(BinA);
regF:=BinToNum(BinF);
End;

Procedure RrcProc; {0Fh}
var
BinVr:TBin;
i:byte;
ch:char;
Begin
BinVr:=NumToBin(regA);
ch:=BinVr[7];
for i:=6 downto 0 do
BinVr[i+1]:=BinVr[i];
BinVr[0]:=ch;
regA:=BinToNum(BinVr);
ch:=BinVr[0];
BinVr:=NumToBin(regF);
BinVr[7]:=ch;
regF:=BinToNum(binVr)
End;

Procedure PushProc; {C5h,D5h,E5h,F5h Обработка PUSH}
var
v1,v2:byte;
Begin
case regRK of
197: begin v1:=regB; v2:=regC end;
213: begin v1:=regD; v2:=regE end;
229: begin v1:=regH; v2:=regL end;
245: begin v1:=regA; v2:=regF end;
end;
mem[regSP-1]:=v1;
mem[regSP-2]:=v2;
regSP:=regSP-2;

End;

Procedure PopProc; {C1h,D1h,E1h,F1h Обработка POP}
var
v1,v2:byte;
Begin
v1:=mem[regSP-1];
v2:=mem[regSP-2];
regSP:=regSP+2;
case regRK of
193: begin regB:=v1; regC:=v2 end;
209: begin regD:=v1; regE:=v2 end;
225: begin regH:=v1; regL:=v2 end;
241: begin regA:=v1; regF:=v2 end;
end;
End;

Procedure XthlProc; {E3h Обработка XTHL}
var
v:byte;
Begin
v:=regL;
regL:=mem[regSP];
mem[regSP]:=v;
v:=regH;
regH:=mem[regSP+1];
mem[regSP+1]:=v;
End;

Procedure SpHlProc; {F9h Обработка SPHL}
Begin
regSP:=regH*256+regL;
End;


Procedure RstProc; {C7h,CFh,D7h,DFh,E7h,EFh,F7h,FFh Обработка Rst}
var
v:byte;
Begin
regSP:=regSP+2;
case regRK of
199:v:=0;
207:v:=8;
215:v:=16;
223:v:=24;
231:v:=32;
239:v:=40;
247:v:=48;
255:v:=54;
end;
mem[regSP-1]:=regPC div 256;
mem[regSP-2]:=regPC mod 256;
regSP:=regSP-2;
regPC:=v;

End;



Procedure OneStep; {Обработка одного шага программы}
var
vr:byte;
Begin
if (regPC=Brk) then mode:=NoneMode;
regPA:=regPC;
inc(regPC);
regRK:=mem[regPA];
case regRK of
00:;
{Комманды передачи данных и комманд Halt}
64..127: MovAndHaltProc; {40h..7Fh Обработка MOV ; Halt}
6,14,22,30,38,46,54,62: MviProc; {06h,0Eh,16h,1Eh,26h,2Eh,36h,3EH Обработка MVI}
1,17,33,49: LxiProc; {01h,11h,21h,31h Обработка LXI}
58:begin regA:=mem[mem[regPC]+mem[regPC+1]*256]; regPc:=regPC+2;end;{3Ah Обработка LDA}
50:begin mem[mem[regPC]+mem[regPC+1]*256]:=regA; regPc:=regPC+2;end;{32h Обработка STA}
42:begin regL:=mem[mem[regPC]+mem[regPC+1]*256];
regH:=mem[mem[regPC]+mem[regPC+1]*256+1];regPc:=regPC+2;end;{2Ah Обработка LHLD}
34:begin mem[mem[regPC]+mem[regPC+1]*256]:=regL;
mem[mem[regPC]+mem[regPC+1]*256+1]:=regH;regPc:=regPC+2;end;{22h Обработка SHLD}
10:regA:=mem[regC+regB*256]; {0Ah Обработка LDAX B}
26:regA:=mem[regE+regD*256]; {1Ah Обработка LDAX D}
02:mem[regC+regB*256]:=regA; {02h Обработка STAX B}
18:mem[regE+regD*256]:=regA; {12h Обработка STAX D}
235:begin vr:=regH;regH:=regD;regD:=vr;vr:=regL;regL:=regE;regE:=vr;end;{EBh Обработка XCHG}

{Арифметические комманды}
128..135,198,206:AddProc; {80h..87h,C6h,CEh обработка ADD ADI ADC ADI}
09,25,41,57:DadProc; {09h,19h,29h,39h Обработка DAD}
144..159,214,222:SubProc; {90h..9Fh,D6h,DEh Обработка SUB SUI SBB SBI}
4,12,20,28,36,44,52,60:InrProc; {04h,0Ch,14h,1Ch,24h,2Ch,34h,3Ch Обработка INR}
3,19,35,51:InxProc; {03h,13h,23h,33h Обработка INX}
5,13,21,29,37,45,53,61:DcrProc; {05h,0Dh,15h,1Dh,25h,2Dh,35h,3Dh Обраотка DCR}
11,27,43,59:DcxProc; {0Bh,1Bh,2Bh,3Bh Обрабтка DCX}
39:DdaProc; {27h Обработка DDA}
{Логические команды}
160..167,230:AndProc; {A0h..A7h E6h Обработка ANA ANI}
168..175,238:XorProc; {A8h..AFh EEh Обработка XRA XRI}
176..183,246:OrProc; {B0h..B7h F6h Обработка ORA ORI}
184..191,254:SubProc; {B8h..BFh FEh Обработка CMP CPI}
07: RlcProc; {07h Обработка RLC}
23: RalProc; {17h Обработка RAL}
31: RarProc; {1Fh Обработка RAR}
15: RrcProc; {0Fh Обработка RRC}
55: regF:=(regF div 2)*2+1; {37h Обработка STC}
63: if (regF mod 2)=1 then dec(regF) else inc(regF);{3Fh Обработка CMC}
47: RegA:=(not (RegA)); {2Fh Обработка CMA}
{Команды передачи управления}
195:regPC:=mem[regPC]+mem[regPC+1]*256; {C3h обработка JMP}
194:if NumToBin(regF)[1]='0' then regPC:=mem[regPC]+mem[regPC+1]*256 {C2h обработка JNZ}
else regPC:=regPC+2;
202:if NumToBin(regF)[1]='1' then regPC:=mem[regPC]+mem[regPC+1]*256 {CAh обработка JZ}
else regPC:=regPC+2;
210:if NumToBin(regF)[7]='0' then regPC:=mem[regPC]+mem[regPC+1]*256 {D2h обработка JNC}
else regPC:=regPC+2;
218:if NumToBin(regF)[7]='1' then regPC:=mem[regPC]+mem[regPC+1]*256 {DAh обработка JC}
else regPC:=regPC+2;
226:if NumToBin(regF)[5]='0' then regPC:=mem[regPC]+mem[regPC+1]*256 {E2h обработка JPO}
else regPC:=regPC+2;
234:if NumToBin(regF)[5]='1' then regPC:=mem[regPC]+mem[regPC+1]*256 {EAh обработка JPE}
else regPC:=regPC+2;
242:if NumToBin(regF)[0]='0' then regPC:=mem[regPC]+mem[regPC+1]*256 {F2h обработка JP}
else regPC:=regPC+2;
250:if NumToBin(regF)[0]='1' then regPC:=mem[regPC]+mem[regPC+1]*256 {FAh обработка JM}
else regPC:=regPC+2;
233:regPC:=regH*256+regL; {E9h Обработка PCHL}
205,196,204,212,220,228,236,244,252:CallProc;{CDh,C4h,CCh,D4h,DCh,E4h,ECh,F4h,FCh Обработка CALL}
201,192,200,208,216,224,232,240,248:RetProc; {C9h,C0h,C8h,D0h,D8h,E0h,E8h,F0h,F8h Обработка RET}
199,207,215,223,231,239,247,255:RstProc;
{Команды ввода и вывода, обращения к стэку и управления}
219:begin regA:=mem[mem[regPC]+HexToNum('FF00')];inc(regPC) end;{DBh Обработка IN}
211:begin mem[mem[regPC+HexToNum('FF00')]]:=regA;inc(regPC) end;{D3h Обработка OUT}
197,213,229,245:PushProc; {C5h,D5h,E5h,F5h Обработка PUSH}
193,209,225,241:PopProc; {C1h,D1h,E1h,F1h Обработка POP}
227:XthlProc; {E3h Обработка XTHL}
249:SphlProc; {F9h Обработка SPHL}

end;
Form1.EditAdr.Text:=NumToHex(regPC);
Form1.EditData.Text:=NumToHex(mem[regPC]);
if Form2.RichEdit1.Lines.Count>500 then Form2.RichEdit1.Lines.Delete(1);
Form2.RichEdit1.Lines.Add(NumToHex(regPC)+' '+NumToHex(regRK)+' '
+codes[regRK].mnem+' '+NumToHex(regA)+' '
+NumToHex(regB)+' '+NumToHex(regC)+' '+NumToHex(regD)+' '+NumToHex(regE)+' '
+NumToHex(regH)+' '+NumToHex(regL)+' '+NumToHex(regSP)+' '
+NumToBin(regF));


End;

procedure TMyThread.Execute;
Begin
if Form1.RadioGroup1.ItemIndex=0 then repeat OneStep
until (mode<>RunMode) or terminated;
End;


Procedure BackUp1; {Процедура делает резервнцю копию системы}
Begin
BackUp.regA:=RegA;
BackUp.regB:=RegB;
BackUp.regC:=RegC;
BackUp.regD:=RegD;
BackUp.regE:=RegE;
BackUp.regF:=RegF;
BackUp.regRK:=RegRK;
BackUp.regW:=RegW;
BackUp.regZ:=RegZ;
BackUp.regH:=RegH;
BackUp.regL:=RegL;
BackUp.regSP:=RegSP;
BackUp.regPC:=RegPC;
BackUp.regPA:=RegPA;
BackUp.regSG:=RegSG;
BackUp.Mem:=Mem;
BackUp.Mode:=Mode;
BackUp.EditAdrT:=Form1.EditAdr.Text;
BackUp.EditRegT:=Form1.EditReg.Text;
BackUp.EditDataT:=Form1.EditData.Text;
BackUp.l1:=Form1.label6.caption[1];
BackUp.l2:=Form1.label7.caption[1];
BackUp.l3:=Form1.label8.caption[1];
End;
Procedure BackUp2;{Процедура восстанавливает систему из резервной копии}
Begin
RegA:=BackUp.regA;
RegB:=BackUp.regB;
RegC:=BackUp.regC;
RegD:=BackUp.regD;
RegE:=BackUp.regE;
RegF:=BackUp.regF;
RegRK:=BackUp.regRK;
RegW:=BackUp.regW;
RegZ:=BackUp.regZ;
RegH:=BackUp.regH;
RegL:=BackUp.regL;
RegSP:=BackUp.regSP;
RegPC:=BackUp.regPC;
RegPA:=BackUp.regPA;
RegSG:=BackUp.regSG;
Mem:=BackUp.Mem;
Mode:=BackUp.Mode;
Form1.EditAdr.Text:=BackUp.EditAdrT;
Form1.EditReg.Text:=BackUp.EditRegT;
Form1.EditData.Text:=BackUp.EditDataT;
Form1.label6.caption:=BackUp.l1;
Form1.label7.caption:=BackUp.l2;
Form1.label8.caption:=BackUp.l3;
End;



procedure TForm1.BtnRegClick(Sender: TObject);
begin
BtnStopClick(self);
Mode:=RegMode;
Label6.Caption:=' ';
Label7.Caption:=',';
Label8.Caption:=' ';
EditReg.Text:=' ';
BackUp1;
end;

procedure Reset;
var
i:integer;
Begin
form1.Label6.Caption:=' ';
form1.Label7.Caption:=' ';
form1.Label8.Caption:=' ';
Brk:=65535;
flag:=false;
Mode:=NoneMode;
regPC:=HexToNum('8200');
regSP:=HexToNum('83E0');
form1.EditReg.Text:='00';
form1.EditData.Text:='00';
form1.EditAdr.Text:='8200';
for i:=1 to 65535 do mem[i]:=0;
WForD:='0';
regF:=BinToNum('00000010');
BackUp1;
regSG:=HexToNum('FFFF');
mem[0]:=HexToNum('31');
mem[1]:=HexToNum('D8');
mem[2]:=HexToNum('83');
mem[3]:=HexToNum('21');
mem[4]:=HexToNum('4B');
mem[5]:=HexToNum('00');
mem[6]:=HexToNum('E9');
mem[7]:=HexToNum('00');

mem[8]:=HexToNum('E5');
mem[9]:=HexToNum('2A');
mem[10]:=HexToNum('F4');
mem[11]:=HexToNum('83');
mem[12]:=HexToNum('E3');
mem[13]:=HexToNum('C9');
mem[14]:=HexToNum('00');
mem[15]:=HexToNum('00');

mem[16]:=HexToNum('E5');
mem[17]:=HexToNum('2A');
mem[18]:=HexToNum('F2');
mem[19]:=HexToNum('83');
mem[20]:=HexToNum('E3');
mem[21]:=HexToNum('C9');
mem[22]:=HexToNum('00');
mem[23]:=HexToNum('00');

mem[24]:=HexToNum('E5');
mem[25]:=HexToNum('2A');
mem[26]:=HexToNum('F0');
mem[27]:=HexToNum('83');
mem[28]:=HexToNum('E3');
mem[29]:=HexToNum('C9');
mem[30]:=HexToNum('00');
mem[31]:=HexToNum('00');


mem[32]:=HexToNum('E3');
mem[33]:=HexToNum('E5');
mem[34]:=HexToNum('2A');
mem[35]:=HexToNum('EE');
mem[36]:=HexToNum('83');
mem[37]:=HexToNum('E3');
mem[38]:=HexToNum('C9');
mem[39]:=HexToNum('00');

mem[40]:=HexToNum('E5');
mem[41]:=HexToNum('2A');
mem[42]:=HexToNum('EC');
mem[43]:=HexToNum('83');
mem[44]:=HexToNum('E3');
mem[45]:=HexToNum('C9');
mem[46]:=HexToNum('00');
mem[47]:=HexToNum('00');

mem[48]:=HexToNum('E5');
mem[49]:=HexToNum('2A');
mem[50]:=HexToNum('EA');
mem[51]:=HexToNum('83');
mem[52]:=HexToNum('E3');
mem[53]:=HexToNum('C9');
mem[54]:=HexToNum('00');
mem[55]:=HexToNum('00');

mem[56]:=HexToNum('E5');
mem[57]:=HexToNum('2A');
mem[58]:=HexToNum('E8');
mem[59]:=HexToNum('83');
mem[60]:=HexToNum('E3');
mem[61]:=HexToNum('C9');
mem[62]:=HexToNum('E2');
mem[63]:=HexToNum('E2');
Form2.RichEdit1.Text:=' PC RK Мнемоника A B C D E H L SP F';

End;

procedure TForm1.BtnRstClick(Sender: TObject);
var
vr:integer;
begin
BtnStopClick(self);
vr:=MessageDlg('Сейчас будет произведено обнуление памяти и регистров. Сохранить текущую программу? '+#10+#13+'(если нажмете Canel обнуления не произойдет.)',mtConfirmation,[mbYes,mbNo,mbCancel],0);
if vr=6 then SaveBtnClick(self);
if vr<>2 then reset;
end;

procedure TForm1.BtnADDRClick(Sender: TObject);
begin
BtnStopClick(self);
Label6.Caption:=',';
Label7.Caption:=' ';
Label8.Caption:=' ';
Mode:=AddrMode;
EditAdr.Text:='0000';
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
WForD:='Z';
BackUp1;
end;

procedure TForm1.FormShow(Sender: TObject);
var
i:byte;
begin
reset;
Form3.Show;
Form2.show;
for i:=0 to 255 do Codes[i].code:=NumToHex(i);
codes[HexToNum('00')].mnem:='NOP ';
codes[HexToNum('01')].mnem:='LXI B,VV ';
codes[HexToNum('02')].mnem:='STAX B ';
codes[HexToNum('03')].mnem:='INX B ';
codes[HexToNum('04')].mnem:='INR B ';
codes[HexToNum('05')].mnem:='DCR B ';
codes[HexToNum('06')].mnem:='MVI B,V ';
codes[HexToNum('07')].mnem:='RLC ';
codes[HexToNum('08')].mnem:='NOP ';
codes[HexToNum('09')].mnem:='DAD B ';
codes[HexToNum('0A')].mnem:='LDAX B ';
codes[HexToNum('0B')].mnem:='DCX B ';
codes[HexToNum('0C')].mnem:='INR C ';
codes[HexToNum('0D')].mnem:='DCR C ';
codes[HexToNum('0E')].mnem:='MVI C,V ';
codes[HexToNum('0F')].mnem:='RRC ';

codes[HexToNum('10')].mnem:='NOP ';
codes[HexToNum('11')].mnem:='LXI B,VV ';
codes[HexToNum('12')].mnem:='STAX D ';
codes[HexToNum('13')].mnem:='INX D ';
codes[HexToNum('14')].mnem:='INR B ';
codes[HexToNum('15')].mnem:='DCR D ';
codes[HexToNum('16')].mnem:='MVI D,V ';
codes[HexToNum('17')].mnem:='RAL ';
codes[HexToNum('18')].mnem:='NOP ';
codes[HexToNum('19')].mnem:='DAD D ';
codes[HexToNum('1A')].mnem:='LDAX D ';
codes[HexToNum('1B')].mnem:='DCX D ';
codes[HexToNum('1C')].mnem:='INR E ';
codes[HexToNum('1D')].mnem:='DCR E ';
codes[HexToNum('1E')].mnem:='MVI E,V ';
codes[HexToNum('1F')].mnem:='RAR ';

codes[HexToNum('20')].mnem:='NOP ';
codes[HexToNum('21')].mnem:='LXI H,VV ';
codes[HexToNum('22')].mnem:='SHLD aa ';
codes[HexToNum('23')].mnem:='INX H ';
codes[HexToNum('24')].mnem:='INR H ';
codes[HexToNum('25')].mnem:='DCR H ';
codes[HexToNum('26')].mnem:='MVI H,V ';
codes[HexToNum('27')].mnem:='DAA ';
codes[HexToNum('28')].mnem:='NOP ';
codes[HexToNum('29')].mnem:='DAD H ';
codes[HexToNum('2A')].mnem:='LHLD aa ';
codes[HexToNum('2B')].mnem:='DCX H ';
codes[HexToNum('2C')].mnem:='INR L ';
codes[HexToNum('2D')].mnem:='DCR L ';
codes[HexToNum('2E')].mnem:='MVI L,V ';
codes[HexToNum('2F')].mnem:='CMA ';

codes[HexToNum('30')].mnem:='NOP ';
codes[HexToNum('31')].mnem:='LXI SP,VV';
codes[HexToNum('32')].mnem:='STA aa ';
codes[HexToNum('33')].mnem:='INX SP ';
codes[HexToNum('34')].mnem:='INR M ';
codes[HexToNum('35')].mnem:='DCR M ';
codes[HexToNum('36')].mnem:='MVI M,V ';
codes[HexToNum('37')].mnem:='STC ';
codes[HexToNum('38')].mnem:='NOP ';
codes[HexToNum('39')].mnem:='DAD SP ';
codes[HexToNum('3A')].mnem:='LDA aa ';
codes[HexToNum('3B')].mnem:='DCX SP ';
codes[HexToNum('3C')].mnem:='INR A ';
codes[HexToNum('3D')].mnem:='DCR A ';
codes[HexToNum('3E')].mnem:='MVI A,V ';
codes[HexToNum('3F')].mnem:='CMC ';

codes[HexToNum('40')].mnem:='MOV B,B ';
codes[HexToNum('41')].mnem:='MOV B,C ';
codes[HexToNum('42')].mnem:='MOV B,D ';
codes[HexToNum('43')].mnem:='MOV B,E ';
codes[HexToNum('44')].mnem:='MOV B,H ';
codes[HexToNum('45')].mnem:='MOV B,L ';
codes[HexToNum('46')].mnem:='MOV B,M ';
codes[HexToNum('47')].mnem:='MOV B,A ';
codes[HexToNum('48')].mnem:='MOV C,B ';
codes[HexToNum('49')].mnem:='MOV C,C ';
codes[HexToNum('4A')].mnem:='MOV C,D ';
codes[HexToNum('4B')].mnem:='MOV C,E ';
codes[HexToNum('4C')].mnem:='MOV C,H ';
codes[HexToNum('4D')].mnem:='MOV C,L ';
codes[HexToNum('4E')].mnem:='MOV C,M ';
codes[HexToNum('4F')].mnem:='MOV C,A ';

codes[HexToNum('50')].mnem:='MOV D,B ';
codes[HexToNum('51')].mnem:='MOV D,C ';
codes[HexToNum('52')].mnem:='MOV D,D ';
codes[HexToNum('53')].mnem:='MOV D,E ';
codes[HexToNum('54')].mnem:='MOV D,H ';
codes[HexToNum('55')].mnem:='MOV D,L ';
codes[HexToNum('56')].mnem:='MOV D,M ';
codes[HexToNum('57')].mnem:='MOV D,A ';
codes[HexToNum('58')].mnem:='MOV E,B ';
codes[HexToNum('59')].mnem:='MOV E,C ';
codes[HexToNum('5A')].mnem:='MOV E,D ';
codes[HexToNum('5B')].mnem:='MOV E,E ';
codes[HexToNum('5C')].mnem:='MOV E,H ';
codes[HexToNum('5D')].mnem:='MOV E,L ';
codes[HexToNum('5E')].mnem:='MOV E,M ';
codes[HexToNum('5F')].mnem:='MOV E,A ';

codes[HexToNum('60')].mnem:='MOV H,B ';
codes[HexToNum('61')].mnem:='MOV H,C ';
codes[HexToNum('62')].mnem:='MOV H,D ';
codes[HexToNum('63')].mnem:='MOV H,E ';
codes[HexToNum('64')].mnem:='MOV H,H ';
codes[HexToNum('65')].mnem:='MOV H,L ';
codes[HexToNum('66')].mnem:='MOV H,M ';
codes[HexToNum('67')].mnem:='MOV H,A ';
codes[HexToNum('68')].mnem:='MOV L,B ';
codes[HexToNum('69')].mnem:='MOV L,C ';
codes[HexToNum('6A')].mnem:='MOV L,D ';
codes[HexToNum('6B')].mnem:='MOV L,E ';
codes[HexToNum('6C')].mnem:='MOV L,H ';
codes[HexToNum('6D')].mnem:='MOV L,L ';
codes[HexToNum('6E')].mnem:='MOV L,M ';
codes[HexToNum('6F')].mnem:='MOV L,A ';

codes[HexToNum('70')].mnem:='MOV M,B ';
codes[HexToNum('71')].mnem:='MOV M,C ';
codes[HexToNum('72')].mnem:='MOV M,D ';
codes[HexToNum('73')].mnem:='MOV M,E ';
codes[HexToNum('74')].mnem:='MOV M,H ';
codes[HexToNum('75')].mnem:='MOV M,L ';
codes[HexToNum('76')].mnem:='HLT ';
codes[HexToNum('77')].mnem:='MOV M,A ';
codes[HexToNum('78')].mnem:='MOV A,B ';
codes[HexToNum('79')].mnem:='MOV A,C ';
codes[HexToNum('7A')].mnem:='MOV A,D ';
codes[HexToNum('7B')].mnem:='MOV A,E ';
codes[HexToNum('7C')].mnem:='MOV A,H ';
codes[HexToNum('7D')].mnem:='MOV A,L ';
codes[HexToNum('7E')].mnem:='MOV A,M ';
codes[HexToNum('7F')].mnem:='MOV A,A ';

codes[HexToNum('80')].mnem:='ADD B ';
codes[HexToNum('81')].mnem:='ADD C ';
codes[HexToNum('82')].mnem:='ADD D ';
codes[HexToNum('83')].mnem:='ADD E ';
codes[HexToNum('84')].mnem:='ADD H ';
codes[HexToNum('85')].mnem:='ADD L ';
codes[HexToNum('86')].mnem:='ADD M ';
codes[HexToNum('87')].mnem:='ADD A ';
codes[HexToNum('88')].mnem:='ADC B ';
codes[HexToNum('89')].mnem:='ADC C ';
codes[HexToNum('8A')].mnem:='ADC D ';
codes[HexToNum('8B')].mnem:='ADC E ';
codes[HexToNum('8C')].mnem:='ADC H ';
codes[HexToNum('8D')].mnem:='ADC L ';
codes[HexToNum('8E')].mnem:='ADC M ';
codes[HexToNum('8F')].mnem:='ADC A ';

codes[HexToNum('90')].mnem:='SUB B ';
codes[HexToNum('91')].mnem:='SUB C ';
codes[HexToNum('92')].mnem:='SUB D ';
codes[HexToNum('93')].mnem:='SUB E ';
codes[HexToNum('94')].mnem:='SUB H ';
codes[HexToNum('95')].mnem:='SUB L ';
codes[HexToNum('96')].mnem:='SUB M ';
codes[HexToNum('97')].mnem:='SUB A ';
codes[HexToNum('98')].mnem:='SBB B ';
codes[HexToNum('99')].mnem:='SBB C ';
codes[HexToNum('9A')].mnem:='SBB D ';
codes[HexToNum('9B')].mnem:='SBB E ';
codes[HexToNum('9C')].mnem:='SBB H ';
codes[HexToNum('9D')].mnem:='SBB L ';
codes[HexToNum('9E')].mnem:='SBB M ';
codes[HexToNum('9F')].mnem:='SBB A ';

codes[HexToNum('A0')].mnem:='ANA B ';
codes[HexToNum('A1')].mnem:='ANA C ';
codes[HexToNum('A2')].mnem:='ANA D ';
codes[HexToNum('A3')].mnem:='ANA E ';
codes[HexToNum('A4')].mnem:='ANA H ';
codes[HexToNum('A5')].mnem:='ANA L ';
codes[HexToNum('A6')].mnem:='ANA M ';
codes[HexToNum('A7')].mnem:='ANA A ';
codes[HexToNum('A8')].mnem:='XRA B ';
codes[HexToNum('A9')].mnem:='XRA C ';
codes[HexToNum('AA')].mnem:='XRA D ';
codes[HexToNum('AB')].mnem:='XRA E ';
codes[HexToNum('AC')].mnem:='XRA H ';
codes[HexToNum('AD')].mnem:='XRA L ';
codes[HexToNum('AE')].mnem:='XRA M ';
codes[HexToNum('AF')].mnem:='XRA A ';

codes[HexToNum('B0')].mnem:='ORA B ';
codes[HexToNum('B1')].mnem:='ORA C ';
codes[HexToNum('B2')].mnem:='ORA D ';
codes[HexToNum('B3')].mnem:='ORA E ';
codes[HexToNum('B4')].mnem:='ORA H ';
codes[HexToNum('B5')].mnem:='ORA L ';
codes[HexToNum('B6')].mnem:='ORA M ';
codes[HexToNum('B7')].mnem:='ORA A ';
codes[HexToNum('B8')].mnem:='CMP B ';
codes[HexToNum('B9')].mnem:='CMP C ';
codes[HexToNum('BA')].mnem:='CMP D ';
codes[HexToNum('BB')].mnem:='CMP E ';
codes[HexToNum('BC')].mnem:='CMP H ';
codes[HexToNum('BD')].mnem:='CMP L ';
codes[HexToNum('BE')].mnem:='CMP M ';
codes[HexToNum('BF')].mnem:='CMP A ';

codes[HexToNum('C0')].mnem:='RNZ ';
codes[HexToNum('C1')].mnem:='POP B ';
codes[HexToNum('C2')].mnem:='JNZ aa ';
codes[HexToNum('C3')].mnem:='JMP aa ';
codes[HexToNum('C4')].mnem:='CNZ aa ';
codes[HexToNum('C5')].mnem:='PUSH B ';
codes[HexToNum('C6')].mnem:='ADI V ';
codes[HexToNum('C7')].mnem:='RST 0 ';
codes[HexToNum('C8')].mnem:='RZ ';
codes[HexToNum('C9')].mnem:='RET ';
codes[HexToNum('CA')].mnem:='JZ aa ';
codes[HexToNum('CB')].mnem:='NOP ';
codes[HexToNum('CC')].mnem:='CZ aa ';
codes[HexToNum('CD')].mnem:='CALL aa ';
codes[HexToNum('CE')].mnem:='ACI V ';
codes[HexToNum('CF')].mnem:='RST 1 ';

codes[HexToNum('D0')].mnem:='RNC ';
codes[HexToNum('D1')].mnem:='POP D ';
codes[HexToNum('D2')].mnem:='JNC aa ';
codes[HexToNum('D3')].mnem:='OUT ap ';
codes[HexToNum('D4')].mnem:='CNC aa ';
codes[HexToNum('D5')].mnem:='PUSH D ';
codes[HexToNum('D6')].mnem:='SUI V ';
codes[HexToNum('D7')].mnem:='RST 2 ';
codes[HexToNum('D8')].mnem:='RC ';
codes[HexToNum('D9')].mnem:='NOP ';
codes[HexToNum('DA')].mnem:='JC aa ';
codes[HexToNum('DB')].mnem:='IN ap ';
codes[HexToNum('DC')].mnem:='CC aa ';
codes[HexToNum('DD')].mnem:='NOP ';
codes[HexToNum('DE')].mnem:='SBI V ';
codes[HexToNum('DF')].mnem:='RST 3 ';

codes[HexToNum('E0')].mnem:='RPO ';
codes[HexToNum('E1')].mnem:='POP H ';
codes[HexToNum('E2')].mnem:='JPO aa ';
codes[HexToNum('E3')].mnem:='XTHL ';
codes[HexToNum('E4')].mnem:='CPO aa ';
codes[HexToNum('E5')].mnem:='PUSH H ';
codes[HexToNum('E6')].mnem:='ANI V ';
codes[HexToNum('E7')].mnem:='RST 4 ';
codes[HexToNum('E8')].mnem:='RPE ';
codes[HexToNum('E9')].mnem:='PCHL ';
codes[HexToNum('EA')].mnem:='JPE aa ';
codes[HexToNum('EB')].mnem:='XCHG ';
codes[HexToNum('EC')].mnem:='CPE aa ';
codes[HexToNum('ED')].mnem:='NOP ';
codes[HexToNum('EE')].mnem:='XRI V ';
codes[HexToNum('EF')].mnem:='RST 5 ';

codes[HexToNum('F0')].mnem:='RP ';
codes[HexToNum('F1')].mnem:='POP PSW ';
codes[HexToNum('F2')].mnem:='JP aa ';
codes[HexToNum('F3')].mnem:='DI ';
codes[HexToNum('F4')].mnem:='CP aa ';
codes[HexToNum('F5')].mnem:='PUSH PSW ';
codes[HexToNum('F6')].mnem:='ORI V ';
codes[HexToNum('F7')].mnem:='RST 6 ';
codes[HexToNum('F8')].mnem:='RM ';
codes[HexToNum('F9')].mnem:='SPHL ';
codes[HexToNum('FA')].mnem:='JM aa ';
codes[HexToNum('FB')].mnem:='EI ';
codes[HexToNum('FC')].mnem:='CM aa ';
codes[HexToNum('FD')].mnem:='NOP ';
codes[HexToNum('FE')].mnem:='CPI V ';
codes[HexToNum('FF')].mnem:='RST 7 ';


end;

procedure EditAdrCharAdd(input:char);
var
st:string[4];
Begin
st:=Form1.EditAdr.Text;
Form1.EditAdr.Text:=st[2]+st[3]+st[4]+input;
End;

procedure EditDataCharAdd(input:char);
var
st:string[2];
Begin
st:=Form1.EditData.Text;
Form1.EditData.Text:=st[2]+input;
End;

procedure TForm1.BTN0Click(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('0');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('0');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('0');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;

end;

end;

procedure TForm1.Btn1Click(Sender: TObject);
begin
BtnStopClick(self);
case mode of
AddrMode: begin
EditAdrCharAdd('1');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
if WForD='Z' then WForD:='1'
else WForD:='0';
end;
MemMode: begin
EditDataCharAdd('1');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('1');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.Btn2Click(Sender: TObject);
begin
BtnStopClick(self);
case mode of
AddrMode: begin
EditAdrCharAdd('2');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
if WForD='Z' then WForD:='2'
else WForD:='0';
end;
MemMode: begin
EditDataCharAdd('2');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('2');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.Btn3Click(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('3');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('3');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('3');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BTn4Click(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('4');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('4');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('4');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.Btn5Click(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('5');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('5');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('5');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.Btn6Click(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('6');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('6');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('6');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;
end;

procedure TForm1.Btn7Click(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('7');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('7');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
Reg2Mode: begin
EditDataCharAdd('7');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.Btn8Click(Sender: TObject);
begin

BtnStopClick(self);
case mode of
AddrMode: begin
EditAdrCharAdd('8');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
if WForD='Z' then WForD:='8'
else WForD:='0';
end;
MemMode: begin
EditDataCharAdd('8');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='H';
EditData.Text:=NumToHex(regH);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('8');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.Btn9Click(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('9');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('9');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='L';
EditData.Text:=NumToHex(regL);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('9');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BtnAClick(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('A');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('A');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='A';
EditData.Text:=NumToHex(regA);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('A');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BtnBClick(Sender: TObject);
begin
BtnStopClick(self);
case mode of
AddrMode: begin
EditAdrCharAdd('B');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
if WForD='Z' then WForD:='B'
else WForD:='0';
end;
MemMode: begin
EditDataCharAdd('B');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='B';
EditData.Text:=NumToHex(regB);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('B');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BtnCClick(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('C');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('C');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='C';
EditData.Text:=NumToHex(regC);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('C');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BtnDClick(Sender: TObject);
begin
BtnStopClick(self);
case mode of
AddrMode: begin
EditAdrCharAdd('D');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
if WForD='Z' then WForD:='D'
else WForD:='0';
end;
MemMode: begin
EditDataCharAdd('D');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='D';
EditData.Text:=NumToHex(regD);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('D');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BtnEClick(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('E');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('E');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='E';
EditData.Text:=NumToHex(regE);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('E');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BtnFClick(Sender: TObject);
begin
BtnStopClick(self);
WForD:='0';
case mode of
AddrMode: begin
EditAdrCharAdd('F');
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
MemMode: begin
EditDataCharAdd('F');
mem[HexToNum(EditAdr.Text)]:=HexToNum(EditData.Text);
end;
RegMode: begin
EditReg.Text:='F';
EditData.Text:=NumToHex(regF);
Mode:=Reg2Mode;
end;
Reg2Mode: begin
EditDataCharAdd('F');
case EditReg.Text[1] of
'A': regA:=HexToNum(EditData.Text);
'B': regB:=HexToNum(EditData.Text);
'C': regC:=HexToNum(EditData.Text);
'D': regD:=HexToNum(EditData.Text);
'E': regE:=HexToNum(EditData.Text);
'F': regF:=HexToNum(EditData.Text);
'H': regH:=HexToNum(EditData.Text);
'L': regL:=HexToNum(EditData.Text);
end;
end;
end;

end;

procedure TForm1.BtnMemClick(Sender: TObject);
begin
BtnStopClick(self);
Label6.Caption:=' ';
Label7.Caption:=' ';
Label8.Caption:=',';
if Mode=MemMode then begin
if HexToNum(EditAdr.Text)>0 then
EditAdr.Text:=NumToHex(word(HexToNum(EditAdr.Text)-1));
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
Mode:=MemMode;
case WForD of
'1':begin EditReg.Text:='SP'; EditAdr.Text:=NumToHex(regSP);end;
'8':begin EditReg.Text:='HL'; EditAdr.Text:=NumToHex(regH)+NumToHex(regL);end;
'B':begin EditReg.Text:='BC'; EditAdr.Text:=NumToHex(regB)+NumToHex(regC);end;
'D':begin EditReg.Text:='DE'; EditAdr.Text:=NumToHex(regD)+NumToHex(regE);end;
'2':begin EditReg.Text:='SG'; EditAdr.Text:=NumToHex(regSG);end;
end;

BackUp1;
end;

procedure TForm1.BtnNextClick(Sender: TObject);
begin
BtnStopClick(self);
case mode of
Reg2Mode,RegMode: begin
case EditReg.Text[1] of
'A': begin EditReg.Text:='B';EditData.Text:=NumToHex(regB) end;
'B': begin EditReg.Text:='C';EditData.Text:=NumToHex(regC) end;
'C': begin EditReg.Text:='D';EditData.Text:=NumToHex(regD) end;
'D': begin EditReg.Text:='E';EditData.Text:=NumToHex(regE) end;
'E': begin EditReg.Text:='F';EditData.Text:=NumToHex(regF) end;
'F': begin EditReg.Text:='H';EditData.Text:=NumToHex(regH) end;
'H': begin EditReg.Text:='L';EditData.Text:=NumToHex(regL) end;
'L': begin EditReg.Text:='A';EditData.Text:=NumToHex(regA) end;
end
end
else begin
if HexToNum(EditAdr.Text)<65535 then begin
EditAdr.Text:=NumToHex(word(HexToNum(EditAdr.Text)+1));
end;
EditData.Text:=NumToHex(mem[HexToNum(EditAdr.Text)]);
end;
end;
BackUp1;
end;

procedure TForm1.BtnClrClick(Sender: TObject);
begin
BtnStopClick(self);
BackUp2;
end;

procedure TForm1.BtnBRKClick(Sender: TObject);
begin
BtnStopClick(self);
Brk:=HexToNum(EditAdr.Text);
end;

procedure TForm1.BtnStepClick(Sender: TObject);
begin
BtnStopClick(self);
Mode:=NoneMode;
BackUp1;
regPC:=HexToNum(EditAdr.Text);
if RadioGroup1.ItemIndex=1 then OneStep;
end;

procedure TForm1.BtnRunClick(Sender: TObject);
begin

if mode<>RunMode then begin
BackUp1;
Mode:=RunMode;
MyTread:=TMyThread.Create(false);
end;
end;

procedure TForm1.BtnTrassClick(Sender: TObject);
begin
BtnStopClick(self);
Form2.Show;
end;

procedure TForm1.SaveBtnClick(Sender: TObject);
var
FSt:TFileStream;
i:word;
h,h2:THex4;
begin
BtnStopClick(self);
if SaveDialog1.Execute then begin
try
FSt:=TFileStream.Create(SaveDialog1.FileName,fmOpenWrite or fmCreate);
h:=EditAdr.text;
FSt.Write(h,sizeof(THex4));
h2:=EditReg.text;
FSt.Write(h2,sizeof(THex2));
h2:=EditData.text;
FSt.Write(h2,sizeof(THex2));
FSt.Write(regA,sizeof(byte));
FSt.Write(regB,sizeof(byte));
FSt.Write(regC,sizeof(byte));
FSt.Write(regD,sizeof(byte));
FSt.Write(regE,sizeof(byte));
FSt.Write(regF,sizeof(byte));
FSt.Write(regH,sizeof(byte));
FSt.Write(regL,sizeof(byte));
FSt.Write(regRK,sizeof(byte));
FSt.Write(regPC,sizeof(word));
FSt.Write(regSP,sizeof(word));
FSt.Write(regSG,sizeof(word));
FSt.Write(regPA,sizeof(word));

FSt.Write(brk,sizeof(word));
FSt.Write(mode,sizeof(TMode));
FSt.Write(form1.RadioGroup1.Itemindex,sizeof(byte));


for i:=0 to 65535 do FSt.Write(mem[i],sizeof(byte));
except
ShowMessage('Ошибка сохранения.');
end;
FSt.Free;
end;

end;

procedure TForm1.LoadBtnClick(Sender: TObject);
var
FSt:TFileStream;
i:word;
vr:byte;
st1:THex4;
st2,st3:THex2;
begin
BtnStopClick(self);
if OpenDialog1.Execute then begin
try
FSt:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
FSt.Read(st1,sizeof(THex4));
EditAdr.text:=st1;
FSt.Read(st2,sizeof(THex2));
FSt.Read(st3,sizeof(THex2));
EditReg.text:=st2;
EditData.text:=st3;
FSt.Read(regA,sizeof(byte));
FSt.Read(regB,sizeof(byte));
FSt.Read(regC,sizeof(byte));
FSt.Read(regD,sizeof(byte));
FSt.Read(regE,sizeof(byte));
FSt.Read(regF,sizeof(byte));
FSt.Read(regH,sizeof(byte));
FSt.Read(regL,sizeof(byte));
FSt.Read(regRK,sizeof(byte));
FSt.Read(regPC,sizeof(word));
FSt.Read(regSP,sizeof(word));
FSt.Read(regSG,sizeof(word));
FSt.Read(regPA,sizeof(word));

FSt.Read(brk,sizeof(word));
FSt.Read(mode,sizeof(TMode));
FSt.Read(vr,sizeof(byte));
form1.RadioGroup1.Itemindex:=vr;
for i:=0 to 65535 do FSt.Read(mem[i],sizeof(byte));
except
ShowMessage('Ошибка загрузки.');
BtnRst.Click;
end;
FSt.Free;
end;

end;


procedure TForm1.BtnStopClick(Sender: TObject);
begin
if mode=runmode then
MyTread.Terminate;
end;

procedure TForm1.EditCodeEnter(Sender: TObject);
begin
EditCode.Text:='';
end;

procedure TForm1.EditMnemEnter(Sender: TObject);
begin
EditMnem.Text:='';
end;

procedure TForm1.EditCodeChange(Sender: TObject);
var
h:THex2;
begin
BtnStopClick(self);
if not flag then begin
flag:=true;
h:=EditCode.Text;
if (length(EditCode.Text)=2) and (h[1] in['0'..'9','A'..'H'])
and (h[2] in['0'..'9','A'..'H']) then
EditMnem.Text:=codes[HexToNum(EditCode.Text)].mnem
else
EditMnem.Text:='';
flag:=false;
end

end;

procedure TForm1.EditMnemChange(Sender: TObject);
var
i:word;
begin
BtnStopClick(self);
if not flag then
for i:=0 to 255 do
if NoSP(codes[i].mnem)=EditMnem.Text then begin
flag:=true;
EditCode.Text:=NumToHex(byte(i));
flag:=false;
break;
end;
end;
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case key of
'g','п':BtnRegClick(self);
'm','ь':BtnMemClick(self);
'k','л':BtnBRKClick(self);
'l','д':BtnClrClick(self);
'ы','s':BtnRstClick(self);

'с','c':BtnCClick(self);
'd','в':BtnDClick(self);
'e','у':BtnEClick(self);
'f','а':BtnfClick(self);
'p','з':BtnStepClick(self);

'8':Btn8Click(self);
'9':Btn9Click(self);
'a','ф':BtnAClick(self);
'b','и':BtnBClick(self);
'u','г':BtnRunClick(self);

'4':Btn4Click(self);
'5':Btn5Click(self);
'6':Btn6Click(self);
'7':Btn7Click(self);
'r','к':BtnADDRClick(self);

'0':Btn0Click(self);
'1':Btn1Click(self);
'2':Btn2Click(self);
'3':Btn3Click(self);
'n','т':BtnNextClick(self);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j:longint;
st,vr:string;
begin
BtnStopClick(self);
Form3.show;
Form3.RichEdit1.Clear;
for i:=0 to HexToNum('FFF') do begin
vr:=NumToHex(word(i));
st:=vr[2]+vr[3]+vr[4]+'_';
for j:=0 to 15 do st:=st+' '+NumToHex(mem[i*16+j]);
Form3.RichEdit1.Lines.Add(st);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
try
shellexecute(Handle,'open','mc.hlp',nil,nil,SW_Restore);
except
showmessage('Ошибка открытия mc.hlp. Возможно, файл поврежден или не существует.')
end;
end;

end.
Соседние файлы в папке MCarc580
  • #
    02.05.201496.96 Кб42MainUnit.dcu
  • #
    02.05.201451 б42MainUnit.ddp
  • #
    02.05.201491.33 Кб42MainUnit.dfm
  • #
    02.05.201467.18 Кб43MainUnit.pas
  • #
    02.05.2014386 б42MC.cfg
  • #
    02.05.20142.31 Кб42MC.dof
  • #
    02.05.2014369 б42MC.dpr
  • #
    02.05.2014139.09 Кб42MC.HLP
  • #
    02.05.20141.22 Кб42MC.res