Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лабораторная работа № 1 - файл Копия Unit1.txt


Загрузка...
Лабораторная работа № 1
скачать (649 kb.)

Доступные файлы (20):

_1.txt499kb.02.04.2008 12:47скачать
1.txt497kb.26.03.2008 10:24скачать
ERROR.txt1kb.26.03.2008 09:16скачать
Prog11.txt1kb.30.03.2008 22:45скачать
Prog1.txt1kb.02.04.2008 12:54скачать
Project1.cfg
Project1.dof
Project1.dpr
Project1.~dpr
Project1.exe
Project1.res
Unit1.dcu
Unit1.ddp
Unit1.~ddp
Unit1.dfm
Unit1.~dfm
Unit1.pas
Unit1.~pas
Копия Unit15.txt6kb.26.03.2008 13:10скачать
Копия Unit1.txt32kb.30.03.2008 23:15скачать

Копия Unit1.txt


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ExtCtrls, Math;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    StringGrid1: TStringGrid;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    StaticText4: TStaticText;
    StaticText5: TStaticText;
    StaticText6: TStaticText;
    StaticText7: TStaticText;
    StringGrid3: TStringGrid;
    StringGrid4: TStringGrid;
    Memo1: TMemo;
    StringGrid5: TStringGrid;
    Memo2: TMemo;
    Memo3: TMemo;
    Button1: TButton;
    Button2: TButton;
    Label2: TLabel;
    ComboBox1: TComboBox;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

const n=30;
      l=4;
      r=16;
var
  Form1: TForm1;
  fi : TextFile;
  Filelenght:integer;
  metka:string;
  NumberOfNames,CA:integer;
  Chisla: array[1..19] of string = ('0','1','2','3','4','5','6','7','8','9','#','$','%','!','@','^','&','*','-');
  VidelPam:array [1..l] of string=('RESB','RESW','WORD','BYTE');
  Registr:array [1..r] of array [1..2] of string=(('R0','0'),('R1','1'),('R2','2'),('R3','3'),('R4','4'),('R5','5'),('R6','6'),('R7','7'),('R8','8'),('R9','9'),('R10','A'),('R11','B'),('R12','C'),('R13','D'),('R14','E'),('R15','F'));
  ZarezSlova:array [1..n] of string=('R0','R1','R2','R3','R4','R5','R6','R7','R8','R9','R10','R11','R12','R13','R14','R15','LOADR1','ADD','SAVER2','INC','ADDR3','JMP','SUB','CLEAN','RESB','RESW','WORD','BYTE','START','END');
implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Memo1.Clear;
  Form1.Memo2.Clear;
  Form1.Memo3.Clear;
  StringGrid2.Cells[0,0]:='JMP';
  StringGrid2.Cells[0,1]:='ADD';
  StringGrid2.Cells[0,2]:='LOADR1';
  StringGrid2.Cells[0,3]:='SUB';
  StringGrid2.Cells[0,4]:='SAVER2';
  StringGrid2.Cells[0,5]:='INC';
  StringGrid2.Cells[0,6]:='ADDR3';
  StringGrid2.Cells[0,7]:='CLEAN';


  StringGrid2.Cells[1,0]:='01';
  StringGrid2.Cells[1,1]:='02';
  StringGrid2.Cells[1,2]:='03';
  StringGrid2.Cells[1,3]:='04';
  StringGrid2.Cells[1,4]:='05';
  StringGrid2.Cells[1,5]:='06';
  StringGrid2.Cells[1,6]:='07';
  StringGrid2.Cells[1,7]:='08';


  StringGrid2.Cells[2,0]:='4';
  StringGrid2.Cells[2,1]:='2';
  StringGrid2.Cells[2,2]:='2';
  StringGrid2.Cells[2,3]:='2';
  StringGrid2.Cells[2,4]:='4';
  StringGrid2.Cells[2,5]:='2';
  StringGrid2.Cells[2,6]:='4';
  StringGrid2.Cells[2,7]:='4';

end;

//---------------------------------------------------------------------------------------------------------
procedure Clean;
var i,j:integer;
BEGIN
for i:=0 to 3 do
    for j:=0 to 10 do
      begin
       Form1.StringGrid1.Cells[i,j]:=''; //очистка исходных данных
       Form1.StringGrid3.Cells[i,j]:=''; //очистка вспомогательной таблицы
      end;
    for i:=0 to 1 do
      for j:=0 to 7 do
        form1.StringGrid4.Cells[i,j]:=''; //очистка ТСИ
    Form1.Memo2.Clear;//очистка окна "Двоичный код"
    Form1.Memo1.Clear;//очистка окна "Ошибки первого прохода"
    Form1.Memo3.Clear;//очистка окна "Ошибки второго прохода"
END;

//---------------------------------------------------------------------------------------------------------
//Проверка на повторение символических имен
function SearchSN(Name:string;NumberOfNames:integer):integer;
Var k:integer;

begin
if  NumberOfNames<0 then
  result:=100
else
begin
for k:=0 to NumberOfNames do
  begin
  if ((Name=Form1.StringGrid4.Cells[0,k])) then
    begin
    result:=k;
    exit;
    end
  else
    result:=100;
  end;
end;
end;

//---------------------------------------------------------------------------------------------------------
//Сравнение с зарезервированными словами
function SearchZarezNames(Name:string):boolean;
var k:integer;
begin
for k:=1 to n do
  if (Name=ZarezSlova[k]) then
    begin
    result:=true;
    exit;
    end
  else result:=false;
end;

//---------------------------------------------------------------------------------------------------------
//Поиск соотв-го МКОП. Если удачен, то возвращает его индекс. В прот случае возврат 100
function PoiskMCOP(MKOP:string):integer;
var k:integer;
begin
for k:=0 to 9 do
 if (MKOP=Form1.StringGrid2.Cells[0,k])then
    begin
    result:=k;
    exit;
    end
 else result:=100;
end;

//---------------------------------------------------------------------------------------------------------
//Проверка директив выделения памяти
function OpredVidelPam(Name:string):integer;
var k:integer;
BEGIN
for k:=1 to l do
  if (Name=VidelPam[k]) then
    begin
    result:=k;
    exit;
    end
  else result:=100;
END;
//---------------------------------------------------------------------------------------------------------
//Функция определения регистра
function PoiskReg(Name:string):integer;
Var k:integer;
BEGIN
for k:=1 to r do
  begin
  if (Name=Registr[k,1]) then
    begin
    result:=k;
    exit;
    end
  else result:=100;
  end;
END;
//---------------------------------------------------------------------------------------------------------
//Проверка правильности написания символических имен (чтобы с цифры не начиналось)
function ProverkaSN(Simbol:string):boolean;
VAr  i:integer;
BEGIN
for i:=1 to 10 do
  begin
  if (Simbol<>Chisla[i])then
    result:=false
  else
    begin
    result:=true;
    exit;
    end;
  end;
END;
//---------------------------------------------------------------------------------------------------------
function ProverkaOperandov(Name:string;j:integer):integer;
Var indexSN:integer;
BEGIN
result:=2;
if ((Name='JMP')or(Name='SAVER2')or(Name='ADDR3')or(Name='CLEAN'))then
    begin
    indexSN:=SearchSN(Form1.StringGrid1.Cells[2,j],NumberOfNames-1);
    if indexSN<>100 then
      if ((Form1.StringGrid1.Cells[2,j]=Form1.StringGrid4.Cells[0,indexSN])and(Form1.StringGrid1.Cells[3,j]=''))then
          begin
          if (Name<>'JMP')then
            begin
            if (Form1.StringGrid1.Cells[2,j]<>metka)then
                 result:=1
            else result:=0;
            end
          else result:=1;
          end
      else result:=0
    else result:=0;
    End;
if ((Name='ADD')or(Name='SUB'))then
    begin
    if ((PoiskReg(Form1.StringGrid1.Cells[2,j])<>100)and(PoiskReg(Form1.StringGrid1.Cells[3,j])<>100))then
      result:=1
    else result:=0;
    end;

if ((Name='LOADR1')or(Name='INC'))then
    begin
    if ((PoiskReg(Form1.StringGrid1.Cells[2,j])<>100)and(Form1.StringGrid1.Cells[3,j]=''))then
       result:=1
    else result:=0;
    end;
END;
//---------------------------------------------------------------------------------------------------------
//Первый проход
procedure TForm1.Button1Click(Sender: TObject);
Var
    i,j,indexj:integer;
    temp:integer;
    razm:integer;
    str:string;
    word1,word2,byte1:extended;
    ERRORS:boolean;
    MemorySize:extended;
Begin
ERRORS:=false;
Button2.Enabled:=False;
Form1.Memo1.Clear;
NumberOfNames:=0;
for i:=0 to 3 do
  for j:=0 to 10 do
    Form1.StringGrid3.Cells[i,j]:='';
for i:=0 to 1 do
  for j:=0 to 8 do
    Form1.StringGrid4.Cells[i,j]:='';
for i:=0 to 2 do StringGrid5.Cells[i,0]:='';
Memo2.Clear;
Memo3.Clear;

MemorySize:=16777216;
//проверка: есть ли начальные данные
if ((Form1.StringGrid1.Cells[0,0]='')and(Form1.StringGrid1.Cells[1,0]='')and(Form1.StringGrid1.Cells[2,0]='')) then
  begin
  Form1.Memo1.SelText:=#13#10+'ERROR!!! Нет начальных данных';
  ERRORS:=true;
  //exit;
  end
else
  if (Form1.StringGrid1.Cells[0,0]='') then
    begin
    Form1.Memo1.SelText:=#13#10+'ERROR!!! Нет названия программы';
    ERRORS:=true;
    //exit;
    end;

if (Length(Form1.StringGrid1.Cells[0,0])>6) then
    begin
    Form1.Memo1.SelText:=#13#10+'ERROR!!! Слишком длинное имя программы';
    ERRORS:=true;
    end;

//проверка заголовка
if (SearchZarezNames(Form1.StringGrid1.Cells[0,0])=true) then
              begin
              Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+IntToStr(1)+', Зарезервированное слово';
              ERRORS:=true;
              end
      else
        begin
        indexj:=SearchSN(Form1.StringGrid1.Cells[0,0],NumberOfNames-1);
        if (indexj<>100) then
          Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(1) +', Совпадение символических имен';
        if (Length(StringGrid1.Cells[0,0])>8)then
          begin
          Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(1) +', Длинное имя программы';
          ERRORS:=true;
          end;
        end;
if (Form1.StringGrid1.Cells[1,0]<>'START') then
          begin
          Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(1) +', Отсутсвует директива START, или введена не верно';
          ERRORS:=true;
          end;


//проверка правильности указания адреса загрузки
try
CA:=StrToInt(Form1.StringGrid1.Cells[2,0]);
If (CA<0) then
  begin
  Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(1) +', Не верно задан адрес загрузки';
  ERRORS:=true;
  //exit;
  end;
{word1:=IntPower(2,24)-1;
if (CA>word1) then
    begin
    Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(1) +', Переполнение';
    ERRORS:=true;
    //exit;
    end; }
except
on EConvertError do
  begin
  Form1.Memo1.SelText:=#13#10+'ERROR!!! Не верно задан адрес загрузки';
  exit;
  end;

end;


j:=1;
while ((Form1.StringGrid1.Cells[1,j]<>'')and(Form1.StringGrid1.Cells[1,j]<>'END')) do
  begin
    //Обработка поля метки
    i:=0;
    if (SearchZarezNames(Form1.StringGrid1.Cells[i,j])=false) then  //сравниваем с зарезервированными словами
      begin
      indexj:=SearchSN(Form1.StringGrid1.Cells[i,j],NumberOfNames-1);  //сравниваем с СИ в ТСИ
      if (indexj<>100) then
          begin
          Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Совпадение символических имен';
          ERRORS:=true;
          end
      else
          begin

            if (Length(Form1.StringGrid1.Cells[i,j])<=6)then
               begin
                  if (Form1.StringGrid1.Cells[i,j]<>'')then
                    begin
                    str:=Form1.StringGrid1.Cells[i,j];
                    If(ProverkaSN(str[1])=false) then
                      begin
                      if (NumberOfNames>StringGrid4.RowCount)then
                        StringGrid4.RowCount:=StringGrid4.RowCount+1;
                      Form1.StringGrid4.Cells[0,NumberOfNames]:=Form1.StringGrid1.Cells[i,j]; //записываем СИ в ТСИ
                      Form1.StringGrid4.Cells[1,NumberOfNames]:=IntToHex(CA,6);   //записываем СА в ТСИ
                      inc(NumberOfNames);                               //увеличиваем счетчик кол-ва СИ
                      Form1.StringGrid3.Cells[0,j]:=IntToHex(CA,6);     //записываем СА в промеж. табл.
                      Form1.StringGrid3.Cells[2,j]:=Form1.StringGrid1.Cells[2,j];  //переписываем оставшуюся часть
                      Form1.StringGrid3.Cells[3,j]:=Form1.StringGrid1.Cells[3,j];
                      end
                    else
                      begin
                      Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', СИ начинается с недопустимого символа';
                      ERRORS:=true;
                      end;
                    end;
               end
            else
             begin
             Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Слишком длинное имя';
             ERRORS:=true;
            end;
          end;
      end
    else
      begin
      Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+IntToStr(j+1)+', Зарезервированное слово. Выберете другое СИ';
      ERRORS:=true;
      end;

    //обработка поля МКОП
    i:=1;
    indexj:=PoiskMCOP(Form1.StringGrid1.Cells[i,j]);
    temp:=OpredVidelPam(Form1.StringGrid1.Cells[i,j]);
    if ((indexj=100) and (temp=100)) then
        begin
        Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Неизвестная команда';
        ERRORS:=true;
        end
    else
      begin
      if (indexj<>100) then
        begin
        try
        if (StringGrid1.Cells[1,j]='JMP')then
              metka:= StringGrid1.Cells[2,j];
        StrToInt(Form1.StringGrid2.Cells[1,indexj]);
        Form1.StringGrid3.Cells[1,j]:= Form1.StringGrid2.Cells[1,indexj];    //записываем код операции
        except
         on EConvertError do
              begin
              Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(indexj+1)+', в ТКО. Код операции должен быть целым числом';
             // ERRORS:=true;
              exit;
              end;
        end;
        Form1.StringGrid3.Cells[0,j]:=IntToHex(CA,6);                       //записываем значение СА
        Form1.StringGrid3.Cells[2,j]:=Form1.StringGrid1.Cells[2,j];  //переписываем оставшуюся часть
        Form1.StringGrid3.Cells[3,j]:=Form1.StringGrid1.Cells[3,j];
        try
         if (CA<=MemorySize)then
             CA:=CA+StrToInt(Form1.StringGrid2.Cells[2,indexj])                  //увеличиваем значение СА на длину команды
         else
            begin
            Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Не хватает памяти';
            exit;
            end;
        except
        on EConvertError do
              begin
              Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(indexj+1)+', в ТКО. Длина команды должна быть целым числом';
              //ERRORS:=true;
              exit;
              end;
        end;
        end;
      if (temp<>100) then
        begin
        Form1.StringGrid3.Cells[1,j]:=VidelPam[temp];
    try
        if (VidelPam[temp]='RESB' ) then
          begin
          razm:=StrToInt(Form1.StringGrid1.Cells[2,j]);
          if (razm<0)then
                begin
                Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Отрицательное число';
                ERRORS:=true;
                end;
          if (StringGrid1.Cells[0,j]='')then
                begin
                Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Перед директивой нет символического имени';
                ERRORS:=true;
                end;

            Form1.StringGrid3.Cells[0,j]:=IntToHex(CA,6);
            Form1.StringGrid3.Cells[2,j]:=IntToHex(StrToInt(Form1.StringGrid1.Cells[2,j]),6);  //переписываем оставшуюся часть
            if (CA<=MemorySize)then
              CA:=CA+razm
            else
              begin
              Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Не хватает памяти';
              exit;
              end;
          end
        else
          if (VidelPam[temp]= 'RESW') then
            begin
            razm:=StrToInt(Form1.StringGrid1.Cells[2,j]);
              if (razm<0)then
                begin
                Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Отрицательное число';
                ERRORS:=true;
                end;
              if (StringGrid1.Cells[0,j]='')then
                begin
                Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Перед директивой нет символического имени';
                ERRORS:=true;
                end;
            Form1.StringGrid3.Cells[0,j]:=IntToHex(CA,6);
            Form1.StringGrid3.Cells[2,j]:=IntToHex(StrToInt(Form1.StringGrid1.Cells[2,j]),6);  //переписываем оставшуюся часть
            if (CA<=MemorySize)then
              CA:=CA+2*razm
            else
              begin
              Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Не хватает памяти';
              exit;
              end;
            end
          else
            if (VidelPam[temp]='WORD' ) then
              begin
              if (StringGrid1.Cells[0,j]='')then  //проверка перед директивой наличия СИ
                begin
                Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Перед директивой нет символического имени';
                ERRORS:=true;
                end;
              temp:=StrToInt(Form1.StringGrid1.Cells[2,j]);
              word2:=-IntPower(2,23);
              word1:=IntPower(2,24)-1;
              if ((temp<0)and (temp0)and (temp>word1)) then
                begin
                Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Переполнение';
                ERRORS:=true;
                end;
                Form1.StringGrid3.Cells[0,j]:=IntToHex(CA,6);
                Form1.StringGrid3.Cells[2,j]:=IntToHex(StrToInt(Form1.StringGrid1.Cells[2,j]),6);  //переписываем оставшуюся часть
                if (CA<=MemorySize)then
                  CA:=CA+3
                else
                  begin
                  Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Не хватает памяти';
                  exit;
                  end;
              end
            else
              if (VidelPam[temp]='BYTE' ) then
                begin
                if (StringGrid1.Cells[0,j]='')then
                begin
                Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Перед директивой нет символического имени';
                ERRORS:=true;
                end;
                str:=StringGrid1.Cells[2,j];
                if (((str[1]='C')or(str[1]='X'))and(str[2]='"')and(str[Length(str)]='"')) then
                  begin
                  razm:=Length(Form1.StringGrid1.Cells[2,j]);
                  if (((razm-3) mod 2)=0) then
                    begin
                    Form1.StringGrid3.Cells[0,j]:=IntToHex(CA,6);
                    if (CA<=MemorySize)then
                        CA:=CA+((razm-3)div 2)
                    else
                        begin
                        Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Не хватает памяти';
                        ERRORS:=true;
                        end;
                    end
                  else
                    begin
                    Form1.StringGrid3.Cells[0,j]:=IntToHex(CA,6);
                    if (CA<=MemorySize)then
                        CA:=CA+((razm-3) div 2)+1
                    else
                        begin
                        Form1.Memo1.SelText:=#13#10+'ERROR!!! строка '+ IntToStr(j+1) +', Не хватает памяти';
                        exit;
                        end;
                    end;
                  end
                else
                  begin
                  if (StrToInt(Form1.StringGrid1.Cells[2,j])>255)then
                      begin
                      Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j+1)+', Переполнение';
                      ERRORS:=true;
                      end
                  else
                      begin
                      byte1:=-IntPower(2,7);
                      temp:=StrToInt(Form1.StringGrid1.Cells[2,j]);
                      if ((temp<0)and(temp'END')) then
    begin
    Form1.Memo1.SelText:=#13#10+'ERROR!!!'+'строка '+IntToStr(j)+', Нет директивы окончания программы END';
    ERRORS:=true;
    end;
  if (j>StringGrid3.RowCount) then
        StringGrid3.RowCount:= StringGrid3.RowCount+1;
  end;
if (ERRORS=false) then
      Button2.Enabled:=true;
END;

//---------------------------------------------------------------------------------------------------------
//Второй проход
procedure TForm1.Button2Click(Sender: TObject);
type
  Telo=record
    AZ:string;
    DlinaZapisi:string;
    KO:string;
    Konst:string
  end;

Var i,j,indexSN,indexReg,indexpam:integer;
    T:Telo;
    temp,temp2,k:integer;
    str,str2:string;

BEGIN
Form1.Memo3.Clear;
Form1.Memo2.Clear;
for i:=0 to 2 do StringGrid5.Cells[i,0]:='';
StringGrid5.Cells[0,0]:='H'+StringGrid1.Cells[0,0];
StringGrid5.Cells[1,0]:=IntToHex(StrToInt(StringGrid1.Cells[2,0]),6);
StringGrid5.Cells[2,0]:=IntToHex(CA-StrToInt(StringGrid1.Cells[2,0]),6);

j:=1;
while (Form1.StringGrid1.Cells[1,j]<>'') do
Begin
  for i:=2 to 3 do
  Begin
  str:=StringGrid3.Cells[i,j];
  indexSN:=SearchSN(str,NumberOfNames-1);
  if (indexSN=100) then
    Begin
    indexReg:=PoiskReg(str);
    if (indexReg=100)then
        Begin
        indexpam:=OpredVidelPam(StringGrid1.Cells[1,j]);
        if (indexpam=100)then
            begin
            if (str<>'')then
              Form1.Memo3.SelText:=#13#10+'ERROR!!! '+'строка '+IntToStr(j+1)+' Неизвестное символическое имя';
            end
        else
            begin
            if (((VidelPam[indexpam]='RESB')or (VidelPam[indexpam]='RESW'))and(str<>''))then
              begin
              T.AZ:=IntToHex(StrToInT('$'+StringGrid3.Cells[0,j]),6);
              T.DlinaZapisi:='00';
              Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi;
              end;
            if ((VidelPam[indexpam]='WORD') and(str<>''))then
              begin
              T.AZ:=IntToHex(StrToInT('$'+StringGrid3.Cells[0,j]),6);
              T.DlinaZapisi:=IntToHex(3*2,2);
              T.Konst:='';
              T.Konst:=Form1.StringGrid3.Cells[2,j];
              Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi+' '+T.Konst;
              end;
            if ((VidelPam[indexpam]='BYTE') and(str<>''))then
              begin
              str2:=Form1.StringGrid3.Cells[2,j];
              if (str2[1]='C') then
                begin
                T.AZ:=IntToHex(StrToInT('$'+StringGrid3.Cells[0,j]),6);
                temp2:=Length(str2)-3;
                T.DlinaZapisi:=IntToHex(temp2*2,2);
                T.Konst:='';
                for k:=3 to Length(str2)-1 do
                T.Konst:=T.Konst+' '+IntToStr(ord(str2[k]));
                Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi+' '+T.Konst;
                end
              else
                if (str2[1]='X') then
                  begin
                  T.AZ:=IntToHex(StrToInT('$'+StringGrid3.Cells[0,j]),6);
                  temp2:=Length(str2)-3+1;
                  T.DlinaZapisi:=IntToHex(temp2,2);
                  T.Konst:='';
                  for k:=3 to Length(str2)-1 do
                  T.Konst:=T.Konst+str2[k];
                  Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi+' '+T.Konst;
                  end
                else
                  begin
                  T.AZ:=IntToHex(StrToInT('$'+StringGrid3.Cells[0,j]),6);
                  T.DlinaZapisi:=IntToHex(2,2);
                  T.Konst:='';
                  T.Konst:=StringGrid3.Cells[2,j];
                  Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi+' '+T.Konst;
                  end;
              end;
            end;
        End
    else
        Begin    //регистры
        if (ProverkaOperandov(StringGrid1.Cells[1,j], j)=1)then
            begin
            T.AZ:=IntToHex(StrToInT('$'+StringGrid3.Cells[0,j]),6);
            temp2:=StrToInt(StringGrid2.Cells[2,PoiskMCOP(StringGrid1.Cells[1,j])])*2; //сохраняем длину операции*2
            T.DlinaZapisi:=IntToHex(temp2,2);
            temp2:=StrToInt(StringGrid2.Cells[1,PoiskMCOP(StringGrid1.Cells[1,j])])*StrToInt(StringGrid2.Cells[2,PoiskMCOP(StringGrid1.Cells[1,j])])+1;
            T.KO:=IntToHex(temp2,2);
            if ((StringGrid3.Cells[3,j]='') and (i=2))then
                  begin
                  T.Konst:='';
                  T.Konst:=Registr[indexReg,2];
                  Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi+' '+T.KO+' '+T.Konst;
                  end;
            if ((StringGrid3.Cells[3,j]<>'') and (i=2))then
                  begin
                  T.Konst:='';
                  T.Konst:=Registr[indexReg,2];
                  end;
            if ((StringGrid3.Cells[3,j]<>'') and (i=3))then
                  begin
                  T.Konst:=T.Konst+Registr[indexReg,2];
                  Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi+' '+T.KO+' '+T.Konst;
                  end;
            end
        else
              begin
              if(ProverkaOperandov(StringGrid1.Cells[1,j], j)=0)then begin
                  Form1.Memo3.SelText:=#13#10+'ERROR!!! '+'строка '+IntToStr(j+1)+', Использованы недопустимые операнды в операци';
                  exit; end;
              end;
        End;
    End
  else
    Begin //символическое имя
    if (ProverkaOperandov(StringGrid1.Cells[1,j], j)=1)then
          begin
          T.AZ:=IntToHex(StrToInT('$'+StringGrid3.Cells[0,j]),6);
          temp2:=StrToInt(StringGrid2.Cells[2,PoiskMCOP(StringGrid1.Cells[1,j])])*2; //сохраняем длину операции*2
          T.DlinaZapisi:=IntToHex(temp2,2);
          temp2:=StrToInt(StringGrid2.Cells[1,PoiskMCOP(StringGrid1.Cells[1,j])])*StrToInt(StringGrid2.Cells[2,PoiskMCOP(StringGrid1.Cells[1,j])])+1;
          T.KO:=IntToHex(temp2,2);
          T.Konst:=StringGrid4.Cells[1,indexSN];
          Form1.Memo2.SelText:=#13#10+'T'+T.AZ+' '+T.DlinaZapisi+' '+T.KO+' '+T.Konst;
          End
    else
          begin
           if(ProverkaOperandov(StringGrid1.Cells[1,j], j)=0)then
              begin
              Form1.Memo3.SelText:=#13#10+'ERROR!!! '+'строка '+IntToStr(j+1)+', Использованы недопустимые операнды в операци';
              exit;
              end;
          end;
    end;
  End;
inc(j);
T.Konst:='';
   if (StringGrid1.Cells[1,j]='END')then
    begin
    try
    temp:=StrToInt(StringGrid1.Cells[2,j]);
    If ((temp<0)or(temp>CA)or(temp'.txt') then
          Begin
          result:='';
          Clean;
          End
      else
        result:=NameFile;
      end
    else result:='*';
    end
  else
    begin
    result:='#';
    end;
  end;
END;
//---------------------------------------------------------------------------------------------------------
procedure TForm1.ComboBox1Change(Sender: TObject);
Var Line:string;
    i,j,k,m:integer;
    StrLength:integer;
    OutputStr:string;
    NameFile:string;

BEGIN
   NameFile:=GetFileName;
   Clean;
   Filelenght:=0;
   If ((NameFile<>'') and (NameFile<>'#')and(NameFile<>'*')) then
      begin
      AssignFile(fi,NameFile);
      reset(fi);
      k:=0;
      m:=0;
      while not EOF(fi) do  // пока не найден конец файла
        begin
        ReadLn(fi,Line);
        StrLength:=Length(Line);

        {inc(Filelenght);
        if (Filelenght>11) then
          begin
          Form1.Memo1.SelText:='ERROR!!! Файл большого размера.';
          for i:=0 to 3 do
            for j:=0 to 10 do
              Form1.StringGrid1.Cells[i,j]:='';
          CloseFile (fi);
          exit;
          end;}

        i:=1;
        while (i' ') then
            begin
              j:=1;
              while ((Line[i]<>' ') and (Line[i]<>',')and(i<=StrLength)) do
                begin
                if (Line[i]=':') then inc(i)
                else
                  begin
                  SetLength(OutputStr,j);
                  OutputStr[j]:=Line[i];
                  inc(j);
                  inc(i);
                  end;
                end;
              inc(i);
              if (m>StringGrid1.RowCount) then
                  StringGrid1.RowCount:= StringGrid1.RowCount+1;
              StringGrid1.Cells[k,m]:=OutputStr;
              inc(k);
              SetLength(OutputStr,1);
            end
          else
            begin
            j:=1;
            while ((Line[i]<>' ') and (Line[i]<>',')and(i<=StrLength)) do
              begin
              if (Line[i]=':') then inc(i)
              else
                begin
                SetLength(OutputStr,j);
                OutputStr[j]:=Line[i];
                inc(j);
                inc(i);
                end;
              end;
            inc(i);
            if (m>StringGrid1.RowCount) then
              StringGrid1.RowCount:= StringGrid1.RowCount+1;
            StringGrid1.Cells[k,m]:=OutputStr;
            inc(k);
            SetLength(OutputStr,1);
            end;
          end;
        k:=0;
        inc(m);
        OutputStr:='';
        end;
      CloseFile (fi);
    end
else
if (NameFile='*') then
  ShowMessage('Файл не найден');
if (NameFile='') then
  ShowMessage('Выбран файл '+NameFile+' с не допустимым расширением');
If (NameFile='#') then
  exit;
END;
//------------------------------------------------------------------------------------
procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
var i,j:integer;
begin
Form1.Memo1.Clear;
Button2.Enabled:=False;
for i:=0 to 2 do StringGrid5.Cells[i,0]:='';
for i:=0 to 3 do
  for j:=0 to 10 do
    Form1.StringGrid3.Cells[i,j]:='';
for i:=0 to 1 do
  for j:=0 to 8 do
    Form1.StringGrid4.Cells[i,j]:='';
Memo2.Clear;
Memo3.Clear;
end;



end.

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru