{$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.
Соседние файлы в папке Исходники программы эмулятора Электроника 580
  • #
    02.05.201497 Кб54MainUnit.dcu
  • #
    02.05.201451 б54MainUnit.ddp
  • #
    02.05.201491 Кб55MainUnit.dfm
  • #
    02.05.201467 Кб54MainUnit.pas
  • #
    02.05.2014386 б53MC.cfg
  • #
    02.05.20142 Кб53MC.dof
  • #
    02.05.2014369 б53MC.dpr
  • #
    02.05.2014139 Кб53MC.HLP
  • #
    02.05.20141 Кб53MC.res