Last active
August 29, 2015 14:22
-
-
Save MisterTimur/f83541d56594efc7eb3d to your computer and use it in GitHub Desktop.
Cross-platform compiler ATR
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
unit UCCATR; | |
{Абдулов Тимур Рифович 2015 | |
Кроссплатформенный компилятор широкого спектра применения | |
Abdulov Timur Rifovich 2015 | |
Cross-platform compiler wide range of applications | |
Emails | |
wsd2000@mail.ru | |
hostingurifa@gmail.com | |
Site https://sites.google.com/site/timpascallib/ccatr/source | |
} | |
{$mode objfpc}{$H+}{$asmmode INTEL}{$DEFINE Tim} | |
interface | |
uses Dialogs,Classes,SysUtils; | |
{ Описание констант используемых в программе } {$IFDEF Tim} | |
const | |
MaxSizeMem=65535;// Максимально допустимый размер памяти в котрой формируеться программа | |
Zerno=32; // Максимальный размер зерна,строки,элемента особый тип типа Variable | |
Toch=3; // ТОчность вычислений количество знаков после запятой должно зависить от размера зерна | |
MaxKolLab=5000; // Максимальное количество меток в программе использыеться в JMP метка CALL метка | |
MaxSizeStek=120; // Максимальная глубина стека в процессе исполнения программы | |
// Коды типов компилируемых элементов | |
Ti_Ope=10; // Оператор в идеале состояит из букв и цифер но начинаться может тока с Буквы а так же может содержать знак подчеркивания и точку | |
Ti_Cif=20; // Цифра сотстояит из знаков и 1 точки | |
Ti_Zna=30; // Знак ОДинарный двойной например = + - / , := << != | |
Ti_Kav=40; // В кавычках "" просто текст в кавычках сами кавычки не читаються | |
{$ENDIF} | |
{ Структуры используемые в программе } {$IFDEF Tim} | |
Type TLab =Class // Описание Метки | |
Nam:Ansistring;// Имя метки | |
cod:Ansistring;// Для какой команды нужен адрес | |
adr:Longword; // Адрес расположения (а если локальные переменные то смещение внутри стека) | |
end; | |
Type TLabs=Class // Хранилище Адресов локальных меток | |
Kol:LongWord; // Количество элментов в списке | |
Lab:array[1..maxKolLab] of TLab; // Масив с элементами | |
Function RA(s:String):LongWord; // Используеться для локальных переменнх адрес генерируеться пряма во время запроса вернее это даже не адрес а смещение относительно стека | |
Procedure Add(s,c:String;a:LongWord);// Добавляет в списко Имя метки S код для котрого предназначена метка С Например JMP или CALL и адрес A соотвественно | |
Procedure Del(f:Longword); // Удаляет из спика элемент номер F Lab[f] | |
Function Fin(s:String):TLab; // Ищит по имени | |
procedure Clear; // Очищает список | |
constructor Create; // Конструктор | |
end; | |
Type TEl =Class // Минимальный Структура исполнительного элемента для интепретатора | |
Tis:Byte; // Тип Текстового Элемента | |
Fun:Boolean; // Если это описание функции то есть содержит структуру описвающию функцию и параметры для её выполнения | |
Err:AnsiString;// Ошибка | |
Axt:AnsiString;// В верхнем регистре | |
Zna:AnsiString;// Значение | |
Tip:Ansistring;// Тип Переменной естествено если это переменная пока не используеться | |
COD:Ansistring;// Машинный код для исполнения комманды пока не используеться | |
Rod:Tel; // Родительский элемент | |
Pre:Tel; // Предыдущий эллемент | |
Nex:Tel; // Следующий элемент | |
Blo:Tel; // Первый вложеный елемент | |
Function Lst:TEl; // Возвращает Последний элемент в вложеном списке | |
Function Cop(iRod,iPre:Tel):Tel; // Создает копию элемента со всеми вложеными элментами | |
Function add(el:Tel):Tel; // Добавляет едемент в конец списка | |
Function addS(el:Tel):Tel; // добавляет еллемент в начало списка | |
Function add(s:AnsiString;t:Byte):Tel;// Добавляет едемент в конец списка | |
Procedure Cle; // Очищает эелемент | |
Procedure Del; // Удаляет эелемент вернее не удаляет а отсоеденяет от родителя и выдергивает окуратно из списка соотвествено соеденяя предыдущий элемент тс следующим | |
Constructor Create; // Конструктор элемента | |
end; | |
TYpe TProg=class // Обертка для интерпретации программы | |
CON:Ansistring; // Консоль исполнения | |
GEl:Tel; // Структура с программой созданая модулем UTEl | |
procedure TRRun(s:Ansistring);// Запуск текста программы на выполнение | |
procedure TRRun(el:Tel); // Запуск елемента на выполнение | |
procedure TRRunS(el:Tel); // Запуск структуры на выполнение | |
Procedure Clear; | |
Constructor Create; | |
procedure TRCON(iel:Tel);// ПРоцедура вывода в консоль | |
procedure TRSCO(iel:Tel);// ПРоцедура скобка | |
procedure TRWHI(iel:Tel);// Оператор White | |
procedure TRUSL(iel:Tel);// Оператор Условия | |
procedure TRUMN(iel:Tel);// Операция умножения | |
procedure TRDEL(iel:Tel);// Операция удаления | |
procedure TRPLU(iel:Tel);// Операция сложения | |
procedure TRMIN(iel:Tel);// Операция вычитания | |
procedure TRRAV(iel:Tel);// Операция Равно | |
procedure TRBOL(iel:Tel);// Операция Больше | |
procedure TRMEN(iel:Tel);// Операция Меньше | |
procedure TRNER(iel:Tel);// Операция НЕравно | |
procedure TRBRA(iel:Tel);// Операция Болдьше либо равно | |
procedure TRMRA(iel:Tel);// Операция Меньше либо равно | |
procedure TRIII(iel:Tel);// Операция И | |
procedure TRILI(iel:Tel);// Операция Или | |
procedure TRPRI(iel:Tel);// Операция присваивания | |
end; | |
{$ENDIF} | |
{ Описание переменных используемых в программе } {$IFDEF Tim} | |
Var | |
AddSp:Byte; // Шаг стека для 16 битных систем 2 соотвественно для 32 битных 4 | |
TrCo:Byte = 0;// Модель компиляции | |
MSta:LongWord;// Адрес расположения программы Виртуальный адрес начала программы не пустать с адресом в масиве MEMO адрес в масиве MEMO это MSta=Memo[0] первый адрес в виртальной модели памяти для компиляции | |
MEnd:LongWord;// Конец Расположения программы Виртуальный Адрес Конца программы аналогично MSta | |
MUka:Longword;// Используеться при компиляции программы указатель на последнию записаную комманду | |
TextListCommand:Ansistring;// Сюда складываютсья названия комманд из процедуры GetTextListCommand для составления отчета по машинным кодам исключительно декоративная функция | |
{Адреса API функций и внтреней архитектуры памяти}{$IFDEF Tim} | |
API__FILE,// Адрес программы внутри файла используеться при формировании исполнительного файла | |
API__PROG,// Адрес программы в процессе выполнения то есть значение счетчика комманд в процессоре | |
API__PRIN,// Адрес печати адрес процедуры для реализации комманды PRINT | |
API__PAUS,// Адрес паузы то биш адрес функции ожидания нажатия любой клвишы | |
API__STEK,// Адрес Стека ну тут думаю все понятно | |
API__EXIT:// Адрес Завершения программы процедура завершения программы | |
LongWord; | |
{$ENDIF} | |
Memo:Array[0..MaxSizeMem] of Byte;// Виртуальная модель памяти для компилируемой программы | |
PMemo:Pointer;// Указатель на ячейку памяти Memo[0] ну виртуальную модель памяти | |
AdrMas:LongWord absolute PMemo;// ОТсюда получаем адрес массива | |
MaxIdEl,Uk,Le:Longint;// Uk Используетсья в встроеном интепретаторе для чтения текста програмым указывает на поледнию прочитаню букву при парсинге текста программы | |
{Структра элемента в процессе компиляции программы} {$IFDEF Tim} | |
EL_RES,// резерв | |
EL_TIS,// тип текстового элемента | |
EL_FUN,// Если это функция | |
EL_ERR,// Код ошибки | |
EL_AXT,// Текст операнда в верхнем регистре | |
EL_ZNA,// значение операнда | |
EL_SAM,// Указатель на самого себя | |
EL_ROD,// Родительский элемент | |
EL_PRE,// Предыдущий эллемент если есть если нету NIL 0 | |
EL_NEX,// Следующий эллемент ксли нету NIL 0 | |
EL_BLO // Цепочка вложеных елементов если есть ссылка на первый элемент цепочки вложеных елементов если нету 0 NIL | |
:Byte; | |
{$ENDIF} | |
{Адреса меток и функций в процессе компиляции программы}{$IFDEF Tim} | |
SLabs:TLabs; | |
RLabs:TLabs; | |
SFuns:TLabs; | |
RFuns:TLabs; | |
GPers:TLabs; | |
LPers:TLabs; | |
{$ENDIF} | |
win:Array[0..MaxSizeMem] of Byte; // Модель для Windows | |
{ Конец блока описания переменных используемых в программе }{$ENDIF} | |
{ Список комманд на Ассемблере } {$IFDEF Tim} | |
Function Sum(a,b:AnsiString):AnsiString; | |
//-------------------------------------------------------- | |
procedure PUSH_EAX;procedure PUSH_ECX;procedure PUSH_EDX;procedure PUSH_ESI; | |
procedure POP__EAX;procedure POP__ECX;procedure POP__EDX;procedure POP__ESI; | |
//-------------------------------------------------------- | |
procedure INC__EAX;procedure INC__ECX;procedure INC__EDX;procedure INC__ESI; | |
procedure DEC__EAX;procedure DEC__ECX;procedure DEC__EDX;procedure DEC__ESI; | |
//-------------------------------------------------------- | |
procedure XOR__EAX;procedure XOR__ECX;procedure XOR__EDX;procedure XOR__ESI; | |
//-------------------------------------------------------- | |
Procedure MOV__EAX(a:LongWord);// Заполнение регистров | |
Procedure MOV__ECX(a:LongWord); | |
Procedure MOV__EDX(a:LongWord); | |
procedure MOV__ESI(a:LongWord); | |
//-------------------------------- | |
Procedure MOV__EAX_AW(a:LongWord);// Заполнение регистров из памяти | |
Procedure MOV__EAX_AB(a:LongWord); | |
Procedure MOV__ECX_AW(a:LongWord); | |
Procedure MOV__ECX_AB(a:LongWord); | |
Procedure MOV__EDX_AW(a:LongWord); | |
Procedure MOV__EDX_AB(a:LongWord); | |
//-------------------------------- | |
Procedure Mov_A_EAXW(a:Longword);// Сохранение регистров в память | |
Procedure Mov_A_EAXB(a:Longword); | |
Procedure MOV_A_ECXW(a:Longword); | |
Procedure MOV_A_ECXB(a:Longword); | |
Procedure Mov_A_EDXW(a:Longword); | |
Procedure Mov_A_EDXB(a:Longword); | |
//-------------------------------- | |
Procedure Mov_AEAX_W(a:Longword);// Запись в память по адресу в регистре | |
Procedure Mov_AEAX_B(a:Byte); | |
Procedure Mov_AECX_W(a:Longword); | |
Procedure Mov_AECX_B(a:Byte); | |
Procedure Mov_AEDX_W(a:Longword); | |
Procedure Mov_AEDX_B(a:Byte); | |
//-------------------------------------------------------- | |
procedure CMP__EAX_EDX; // Условые переходы подпрограммы | |
procedure JA___(a:String); | |
procedure JAE__(a:String); | |
procedure JE___(a:String); | |
procedure JNE__(a:String); | |
procedure JB___(a:String); | |
procedure JBE__(a:String); | |
Procedure JMP__(s:String); | |
Procedure RET__; | |
Procedure CAL__(s:String); | |
Procedure CAL__(s:LongWord); | |
//-------------------------------------------------------- | |
// Арифметика | |
Procedure SUB__ESP(a:LongWord);// Уменьшает стек | |
Procedure ADD__ESP(a:LongWord);// Увеличивает стек | |
procedure SUB__EAX_EDX; | |
procedure SUB__EAX_ECX; | |
procedure ADD__EAX_EDX; | |
procedure ADD__ESI(B:LongWord); | |
procedure ADD__EAX_ESP; | |
//-------------------------------------------------------- | |
procedure MOV__EAX_AESI; | |
procedure MOV__ECX_AESI; | |
procedure MOV__EDX_AESI; | |
//-------------------------------------------------------- | |
procedure MOV_AESI_EAX; | |
procedure MOV_AESI_ECX; | |
procedure MOV_AESI_EDX; | |
procedure MOV_AESI_AL; | |
procedure MOV_AESI_CL; | |
procedure MOV_AESI_DL; | |
procedure MOV_AESI_W(a:Longword); | |
procedure MOV_AESI_B(a:Byte); | |
//-------------------------------------------------------- | |
procedure MOV__ESP_EAX; | |
procedure MOV__ESI_ESP; | |
procedure MOV__ESI_EAX; | |
procedure MOV__ESI_EDX; | |
Procedure MOV__EDX_EAX; | |
procedure Mov__EAX_AEAX; | |
procedure Mov__EDX_AEDX; | |
procedure MOV_AEAX_EDX; | |
procedure MOV_AEAX_DL ; | |
procedure Mov__AL_DL; | |
procedure Mov__AL_Dh; | |
procedure Mov__AH(A:Byte); | |
procedure Mov__CH(A:Byte); | |
procedure Mov__DH(A:Byte); | |
procedure Mov__BL(A:Byte); | |
{$ENDIF} | |
Procedure Compiler(s,nf:Ansistring);// ПРоцедура компиляции программы | |
Function DelRAs(s:Ansistring):Ansistring; | |
implementation | |
{ Секция для работы с памятью } {$IFDEF Tim} | |
procedure InfoMes(s:Ansistring); | |
begin | |
ShowMessage(s); | |
end; | |
Function IntToHex32(i:LongWord) :String; // Преобразует число в шеснадцеричную последовательность раставляя шеснадцеричные пары в машинном порядке сперва младшии байты | |
var | |
s:String; | |
begin | |
s:=intToHex(i,8); | |
IntToHex32:=s[7]+s[8]+s[5]+s[6]+s[3]+s[4]+s[1]+s[2]; | |
end; | |
Function IntToHex16(i:LongWord) :String; // Преобразует число в шеснадцеричную последовательность раставляя шеснадцеричные пары в машинном порядке сперва младшии байты | |
var | |
s:String; | |
begin | |
If i>=65536 Then InfoMes('IntToHex16 Число не являеться 2 батовым '); | |
s:=intToHex(i,4); | |
IntToHex16:=s[3]+s[4]+s[1]+s[2]; | |
end; | |
Function IntToHex16L(i:LongWord):String; // Выделяет младший байт из 2 байтовой пары | |
var | |
s:String; | |
begin | |
If i>=65536 Then InfoMes('IntToHex16L Число не являеться 2 батовым '); | |
s:=intToHex(i,4); | |
IntToHex16L:=s[3]+s[4]; | |
end; | |
Function IntToHex16H(i:LongWord):String; // Выделяет сарший байт из 2 батовой пары | |
var | |
s:String; | |
begin | |
If i>=65536 Then InfoMes('IntToHex16H Число не являеться 2 батовым'); | |
s:=intToHex(i,4); | |
IntToHex16H:=s[1]+s[2]; | |
end; | |
Function IntToHex8 (i:LongWord):String; // Возвращает однобатовое значение в шеснадцеричной системе считсления | |
var | |
s:String; | |
begin | |
If i>=256 Then InfoMes('IntToHex8 Число не помещаеться в 1 байт '); | |
s:=intToHex(i,2); | |
IntToHex8:=s; | |
end; | |
Function HexToInt(Str : string):LongWord; // Переводит из 16 в десятичную систему | |
var i, r : integer; | |
begin | |
if Length(Str)>8 then InfoMes('HexToInt Число не являеться 32 битным '); | |
if Length(Str)=8 then InfoMes('HexToInt Число не являеться 32 битным пустая строка '); | |
val('$'+Trim(Str),r, i); | |
if i<>0 then InfoMes(('HexToInt Не верное число str')); | |
HexToInt := r; | |
end; | |
Procedure WrMwm(s:String); // ЗАписывает шеснадцетиричный набор в память | |
var | |
f:Longint; | |
begin | |
f:=1; | |
if (length(s)<=0) or (length(s)/2<>Trunc(length(s)/2)) then InfoMes(('WrMwm Не верное шеснадцеричное значение')); | |
While f<=length(s) do | |
begin | |
If Muka-MSta>MaxSizeMem Then InfoMes('WrMwm Память для записи програмым переполнена '); | |
memo[Muka-MSta]:=HexToInt(s[f]+s[f+1]); | |
Muka:=Muka+1; | |
f:=f+2; | |
end; | |
end; | |
Procedure WrMwc8(i:byte); // ЗАписывает Байт в память | |
begin | |
WrMwm(IntToHex8(i)); | |
end; | |
Procedure WrMw16(i:Word); // ЗАписывает Слово в память | |
begin | |
WrMwm(IntToHex16(i)); | |
end; | |
Procedure WrMw16L(i:Word); // ЗАписывает Слово в память | |
begin | |
WrMwm(IntToHex16l(i)); | |
end; | |
Procedure WrMw16H(i:Word); // ЗАписывает Слово в память | |
begin | |
WrMwm(IntToHex16h(i)); | |
end; | |
Procedure WrMw32(i:LongWord); // ЗАписывает Двойное слово в память | |
begin | |
WrMwm(IntToHex32(i)); | |
end; | |
Function TrRD(a:LongWord):LongWord; // Читает двойное слово из памяти | |
var | |
rez:LongWord; | |
begin | |
if (a-MSta>MaxSizemem) Then InfoMes(' TrRD Выход за пределы виртуальной памяти модели программы '); | |
a:=a-MSta+AdrMas; | |
asm | |
mov eax,a; | |
mov eax,[eax]; | |
mov rez,eax; | |
end; | |
TrRd:=rez; | |
end; | |
Function TrRW(a:LongWord):Word; // Читает слово из памяти | |
var | |
rez:word; | |
begin | |
if (a-MSta>MaxSizemem) Then InfoMes(' TrRW Выход за пределы виртуальной памяти модели программы '); | |
a:=a-MSta+AdrMas; | |
asm | |
mov eax,a; | |
mov ax,[eax]; | |
mov rez,ax; | |
end; | |
TrRw:=rez; | |
end; | |
Function TrRB(a:LongWord):Byte; // Читает байт из памяти | |
var | |
rez:byte; | |
begin | |
if (a-MSta>MaxSizemem) Then InfoMes(' TrRB Выход за пределы виртуальной памяти модели программы '); | |
a:=a-MSta+AdrMas; | |
asm | |
mov eax,a; | |
mov al,byte [eax]; | |
mov rez,al; | |
end; | |
TrRb:=rez; | |
end; | |
procedure TrW6(a,b:Int64);// Не доработано // Записывает двойное слово в память | |
begin | |
if (a-MSta>MaxSizemem) Then InfoMes(' TrW6 Выход за пределы виртуальной памяти модели программы '); | |
a:=a-MSta+AdrMas; | |
asm | |
mov eax,a; | |
mov edx,b; | |
mov [eax],edx; | |
end; | |
end; | |
procedure TrWD(a,b:LongWord); // Записывает двойное слово в память | |
begin | |
if (a-MSta>MaxSizemem) Then InfoMes(' TrWD Выход за пределы виртуальной памяти модели программы '); | |
a:=a-MSta+AdrMas; | |
asm | |
mov eax,a; | |
mov edx,b; | |
mov [eax],edx; | |
end; | |
end; | |
procedure TrWW(a:LongWord;b:word); // Записывает слово в память | |
begin | |
if (a-MSta>MaxSizemem) Then InfoMes(' TrWW Выход за пределы виртуальной памяти модели программы '); | |
a:=a-MSta+AdrMas; | |
asm | |
mov eax,a; | |
mov dx,b; | |
mov [eax],dx; | |
end; | |
end; | |
procedure TrWB(a:LongWord;b:byte); // Записывает байт в память | |
begin | |
if (a-MSta>MaxSizemem) Then InfoMes(' TrWB Выход за пределы виртуальной памяти модели программы '); | |
a:=a-MSta+AdrMas; | |
asm | |
mov eax,a; | |
mov dl,b; | |
mov [eax],dl; | |
end; | |
end; | |
function PointerToAdr(p:pointer):Longword;// Переводит указатель в адрес | |
var | |
a:LongWord absolute p; | |
begin | |
PointerToAdr:=a; | |
end; | |
Function ReCif(A:LongWord):LongWord; // Читает Цифру по адресу из памяти В установленом режиме | |
var | |
rez:LongWord; | |
begin | |
if TrCo=80 Then rez:=TrRW(a) else // Для Z80 Spectrum | |
if TrCo=16 Then rez:=TrRW(a) else // ДЛя DOS | |
if TrCo=17 Then rez:=TrRW(a) else // для ISO | |
if TrCo=32 Then rez:=TrRD(a) else // Для Windows | |
if TrCo=33 Then rez:=TrRD(a) else // Для Колибри | |
if TrCo=34 Then rez:=TrRD(a) else // Для Linux | |
InfoMes(('ReCif Разрядность не поддерживаетья')); | |
ReCif:=rez; | |
end; | |
Procedure WrCif(A,Z:LongWord); // Записывает Цифру по адресу в память В установленом режиме | |
begin | |
if TrCo=80 Then TrWW(a,z) else | |
if TrCo=16 Then TrWW(a,z) else | |
if TrCo=17 Then TrWW(a,z) else | |
if TrCo=32 Then TrWD(a,z) else | |
if TrCo=33 Then TrWD(a,z) else | |
if TrCo=34 Then TrWD(a,z) else | |
InfoMes(('WrCif Разрядность не поддерживаетья')); | |
end; | |
Function RZna(s:String):LongWord; // Читает Переменную по имени из памяти В Установленом режиме | |
var | |
p:TLab; | |
Rez:Longword; | |
begin | |
p:=GPers.Fin(s); | |
if p<>nil | |
then rez:=ReCif(p.adr) | |
else begin InfoMes(('Такой переменной ещё не создано '+S));halt;end; | |
RZna:=rez; | |
end; | |
Procedure WZna(s:String;z:LongWord); // Записывает Переменную по имени в память В Установленом режиме | |
var | |
p:TLab; | |
Rez:Longword; | |
begin | |
p:=GPers.Fin(s); | |
if p<>nil | |
then WrCif(p.adr,z) | |
else begin InfoMes(('Такой переменной ещё не создано '+S));halt;end; | |
end; | |
Procedure WrMwc(i:LongWord); // ЗАписывает число в память при компиляции согластно режиму | |
begin | |
if TrCo=80 Then WrMwm(IntToHex16(i)) else | |
if TrCo=16 Then WrMwm(IntToHex16(i)) else | |
if TrCo=17 Then WrMwm(IntToHex16(i)) else | |
if TrCo=32 Then WrMwm(IntToHex32(i)) else | |
if TrCo=33 Then WrMwm(IntToHex32(i)) else | |
if TrCo=34 Then WrMwm(IntToHex32(i)) else | |
InfoMes(('Разрядность не поддерживаетья')); | |
end; | |
Procedure WrMwS(i:String); // ЗАписывает Текстовые символы в память при компиляции согластно режиму | |
var | |
f:Longint; | |
begin | |
for f:=1 to length(i) do | |
WrMwm(IntToHex8(Ord(i[f]))); | |
WrMwc8(0); | |
end; | |
Procedure WrMwO(i:String); // ЗАписывает Текстовые символы в память при компиляции согластно режиму | |
var | |
f:Longint; | |
begin | |
for f:=1 to length(i) do | |
WrMwm(IntToHex8(Ord(i[f]))); | |
end; | |
function Tr_Ls(a:LongWord):byte; // Читает длину строки по заданому адресу | |
begin | |
Tr_ls:=TrRB(a); | |
end; | |
function Tr_Rs(a:LongWord):String; // Читает строку по заданому адресу | |
var | |
rez:AnsiString; | |
f:LongWord; | |
l:Longint; | |
begin | |
rez:=''; | |
if (a<MSta) or (a>MEnd) then rez:='NIL' else | |
begin | |
l:=Tr_Ls(a); | |
for f:=a+1 to a+l do | |
rez:=rez+Chr(TrRb(f)); | |
end; | |
Tr_Rs:=rez; | |
end; | |
procedure Tr_Ws(a:LongWord;S:Ansistring); // Записывает строку по определенному адресу | |
var | |
f:LongWord; | |
begin | |
TrWB(a-1,1); | |
TrWB(a,length(s)); | |
for f:=1 to Zerno do | |
TrWB(a+f,0); | |
for f:=1 to length(s) do | |
TrWB(a+f,Ord(s[f])); | |
end; | |
type TMODELFILE=array[0..MaxSizeMem] of Byte; | |
Function FindAdres(s:Ansistring;MF:TMODELFILE):LongWord; | |
var | |
f,f2,rez:LongWord; | |
begin | |
rez:=0;f2:=1; | |
for f:=0 to MaxSizeMem Do | |
begin | |
if mf[f]=ord(s[f2]) Then Inc(f2) else | |
begin | |
f2:=1; | |
if mf[f]=ord(s[f2]) Then Inc(f2) ; | |
end; | |
if f2>Length(s) Then | |
begin | |
REz:=f+1; | |
Break; | |
end; | |
end; | |
if REz=0 then InfoMes('UMEM FindAdres НЕ Найдена точка '+s); | |
FindAdres:=rez; | |
end; | |
Procedure ReadPeremensFromFile(s:Ansistring); | |
var | |
M:TMODELFILE; | |
MF:File Of TMODELFILE; | |
f:Longint; | |
begin | |
AssignFile(Mf,s); | |
reset(mf); | |
REad(Mf,M); | |
CloseFile(mf); | |
for f:=0 to MaxSizeMem do | |
win[f]:=m[f]; | |
API__FILE:=FindAdres('API__PROG',m);//552 | |
if Trco=32 Then | |
begin | |
API__STEK:=MSta+FindAdres('API__STEK',m)-API__FILE;//4262832 | |
API__PRIN:=MSta+FindAdres('API__PRIN',m)-API__FILE; | |
API__EXIT:=MSta+FindAdres('API__EXIT',m)-API__FILE; | |
API__PAUS:=MSta+FindAdres('API__PAUS',m)-API__FILE; | |
API__PROG:=MSta+FindAdres('API__PROG',m)-API__FILE;//4262832 | |
end else | |
if Trco=33 Then | |
begin | |
API__STEK:=MSta+FindAdres('API__STEK',m)-API__FILE;//4262832 | |
API__PRIN:=MSta+FindAdres('API__PRIN',m)-API__FILE; | |
API__EXIT:=MSta+FindAdres('API__EXIT',m)-API__FILE; | |
API__PAUS:=MSta+FindAdres('API__PAUS',m)-API__FILE; | |
API__PROG:=MSta+FindAdres('API__PROG',m)-API__FILE;//4262832 | |
end else | |
if Trco=34 Then | |
begin | |
API__STEK:=MSta+FindAdres('API__STEK',m)-API__FILE;//4262832 | |
API__PRIN:=MSta+FindAdres('API__PRIN',m)-API__FILE; | |
API__EXIT:=MSta+FindAdres('API__EXIT',m)-API__FILE; | |
API__PAUS:=MSta+FindAdres('API__PAUS',m)-API__FILE; | |
API__PROG:=MSta+FindAdres('API__PROG',m)-API__FILE;//4262832 | |
end else | |
InfoMes('UMEM ReadPeremensFromFile НЕ пропсиано как читать координаты '); | |
end; | |
{$ENDIF} | |
{ Процедуры для работы с метками } {$IFDEF Tim} | |
Procedure SetZnaPer(p:string;i:Longword); | |
var | |
Z:TLAb; | |
begin | |
Z:=GPers.Fin(p); // Если можно | |
if z<>nil then WrCif(Z.adr,i) else | |
InfoMes(('SetPer Переменная не найдена '+p)); | |
end; | |
Procedure SetLocalLabels; | |
var | |
f:Longint; | |
NF:TLab; | |
begin | |
f:=1; | |
While f<=RLabs.Kol do // Смотрим что можно заполнить | |
begin | |
nf:=SLabs.Fin(RLabs.lab[f].Nam); // Если можно | |
if nf<>Nil then | |
begin // заполняем | |
if (RLabs.lab[f].Cod='JMP__') or | |
(RLabs.lab[f].Cod='JE___') or | |
(RLabs.lab[f].Cod='JNE__') or | |
(RLabs.lab[f].Cod='JA___') or | |
(RLabs.lab[f].Cod='JAE__') or | |
(RLabs.lab[f].Cod='JB___') or | |
(RLabs.lab[f].Cod='JBE__') then | |
begin | |
If TrCo=80 then TrWW(RLabs.Lab[f].adr,nf.adr) else | |
If TrCo=16 then TrWW(RLabs.Lab[f].adr,nf.adr-RLabs.lab[f].adr-2) else | |
If TrCo=17 then TrWW(RLabs.Lab[f].adr,nf.adr-RLabs.lab[f].adr-2) else | |
If TrCo=32 then TrWD(RLabs.Lab[f].adr,nf.adr-RLabs.lab[f].adr-4) else | |
If TrCo=33 then TrWD(RLabs.Lab[f].adr,nf.adr-RLabs.lab[f].adr-4) else | |
If TrCo=34 then TrWD(RLabs.Lab[f].adr,nf.adr-RLabs.lab[f].adr-4) else | |
If TrCo=64 then TrW6(RLabs.Lab[f].adr,nf.adr-RLabs.lab[f].adr-8) else | |
InfoMes(('ULABS.Sets для данной платфорсы нет комманда перехода '+RLabs.lab[f].cod)); | |
end else | |
InfoMes(('ULABS.Sets Неизветная комманда перехода '+RLabs.lab[f].cod)); | |
RLabs.del(f) //Удаляем запись | |
end else f:=f+1; | |
end; | |
if Rlabs.Kol<>0 Then | |
begin | |
InfoMes(('Не все адрена переходов заполнены')); | |
for f:=1 to RLAbs.Kol Do | |
InfoMes(RLAbs.Lab[f].Nam); | |
end; | |
Slabs.Clear;// Очищаем локальные метки повторно | |
Rlabs.Clear;// Очищаем локальные метки повторно | |
end; | |
Procedure SetFunctions; | |
var | |
f:Longint; | |
NF:TLab; | |
begin | |
f:=1; | |
While f<=RFuns.Kol do // Смотрим что можно заполнить | |
begin | |
nf:=SFuns.Fin(RFuns.lab[f].Nam); // Если можно | |
if nf<>Nil then | |
begin // заполняем | |
if RFuns.lab[f].Cod='CAL__' then | |
If TrCo=80 then TrWW(RFuns.Lab[f].adr,nf.adr) else | |
If TrCo=16 then TrWW(RFuns.Lab[f].adr,nf.adr-RFuns.lab[f].adr-2) else | |
If TrCo=17 then TrWW(RFuns.Lab[f].adr,nf.adr-RFuns.lab[f].adr-2) else | |
If TrCo=32 then TrWD(RFuns.Lab[f].adr,nf.adr-RFuns.lab[f].adr-4) else | |
If TrCo=33 then TrWD(RFuns.Lab[f].adr,nf.adr-RFuns.lab[f].adr-4) else | |
If TrCo=34 then TrWD(RFuns.Lab[f].adr,nf.adr-RFuns.lab[f].adr-4) else | |
If TrCo=64 then TrW6(RFuns.Lab[f].adr,nf.adr-RFuns.lab[f].adr-8) else | |
InfoMes(('UFunS.Sets Неизветная комманда перехода '+RFuns.lab[f].cod)); | |
RFuns.del(f) //Удаляем запись | |
end else f:=f+1; | |
end; | |
if RFuns.Kol<>0 Then | |
begin | |
InfoMes(('Call Не все адрена переходов заполнены')); | |
for f:=1 to RFuns.Kol Do | |
InfoMes(RFuns.Lab[f].Nam); | |
end; | |
SFuns.Clear;// Очищаем локальные метки повторно | |
RFuns.Clear;// Очищаем локальные метки повторно | |
end; | |
//============================================== | |
Function TLabs.Fin(s:String):TLab; | |
var | |
f:LongWord; | |
rez:TLab; | |
begin | |
rez:=nil; | |
s:=AnsiUpperCase(s); | |
for f:=1 to Kol do | |
if s=Lab[f].nam Then rez:=Lab[f]; | |
Fin:=Rez; | |
end; | |
Procedure TLabs.Add(s,c:String;a:LongWord); | |
begin | |
KOl:=KOl+1; | |
if KOl>maxKolLab Then InfoMes(('ULABS TLabs.Add Превышено количество меток '+s)); | |
Lab[kol]:=TLab.Create; | |
Lab[kol].Nam:=AnsiUpperCase(s); | |
Lab[KOl].Adr:=a; | |
Lab[KOl].COD:=AnsiUpperCase(c); | |
end; | |
Procedure TLabs.Clear; | |
var | |
f:LongWord; | |
begin | |
for f:=1 to KOl do | |
LAb[f].Free; | |
kol:=0; | |
end; | |
Procedure TLabs.Del(f:Longword); | |
var | |
f2:LongWord; | |
begin | |
Lab[f].free; | |
for f2:=f to KOl-1 do | |
Lab[f2]:=Lab[f2+1]; | |
kol:=kol-1; | |
end; | |
Function TLabs.RA(s:String):LongWord; | |
var | |
Lper:TLAb; | |
rez:LongWord; | |
begin | |
LPer:=Fin(s); | |
if Lper=nil then | |
begin | |
if TrCo=80 then rez:=kol*2+2 else | |
if TrCo=16 then rez:=kol*2+2 else | |
if TrCo=17 then rez:=kol*2+2 else | |
if TrCo=32 then rez:=kol*4+4 else | |
if TrCo=33 then rez:=kol*4+4 else | |
if TrCo=34 then rez:=kol*4+4 else | |
if TrCo=64 then rez:=kol*8+8 else | |
InfoMes(('TLabs.RA Стек на данной платформе не прописан ')); | |
if REz>MaxSizeStek Then InfoMes(('Размер стека локальных переменных привышен ')); | |
add(s,'',rez); | |
end else rez:=Lper.adr; | |
RA:=REz; | |
end; | |
constructor TLabs.Create; | |
begin | |
kol:=0; | |
end; | |
//============================================== | |
Procedure SePe(s:String); | |
begin | |
if GPers.FIN(s)<>NIL Then InfoMes(('Дублируються Переменные '+s)); | |
GPers.add(s,'Peremens',Muka); | |
end; | |
Procedure ReFu(s,c:String); | |
begin | |
RFuns.add(s,c,Muka); | |
end; | |
Procedure SeFu(s:String); | |
begin | |
if SFuns.FIN(s)<>NIL Then InfoMes(('Дублируються Функции'+s)); | |
SFuns.add(s,'Function',Muka); | |
end; | |
Procedure ReLa(s,c:String);// Запоминаем место куда нада установить адрес | |
begin | |
RLAbs.add(s,c,Muka); | |
end; | |
Procedure SeLa(s:String); // Создаем локальную метку | |
begin | |
if SLAbs.FIN(s)<>NIL Then InfoMes(('Дублируються метки'+s)); | |
SLAbs.add(s,'LABEL',Muka); | |
end; | |
Function AdrFun(s:Ansistring):LongWord; | |
var | |
rez:TLab; | |
begin | |
s:=ansiUpperCase(s); | |
rez:=SFuns.Fin(s); | |
if Rez=Nil Then begin InfoMes(('ULABS.AdrFun Функция не обьявлена '+S));halt;end; | |
AdrFun:=Rez.adr; | |
end; | |
Function AdrPer(s:Ansistring):LongWord; | |
var | |
rez:TLab; | |
begin | |
s:=ansiUpperCase(s); | |
Rez:=GPers.Fin(s); | |
if Rez=Nil Then begin | |
InfoMes(('AdrPer Переменная не обьявлена '+S));halt;end; | |
AdrPer:=Rez.adr; | |
end; | |
Function AdrLab(s:Ansistring):LongWord; | |
var | |
rez:TLab; | |
begin | |
s:=ansiUpperCase(s); | |
Rez:=SLAbs.Fin(s); | |
if Rez=Nil Then begin InfoMes(('UASM.AdrLab Метка не обьявлена '+S));halt;end; | |
AdrLab:=Rez.adr; | |
end; | |
Procedure BeginProcedure(s:String); | |
begin | |
SFuns.add(s,'Procedure',Muka);// Записываем адрес процедуры | |
SUB__ESP(MaxSizeStek); // Выделяем место для локальных переменных | |
end; | |
Procedure EndProcedure; | |
begin | |
SetLocalLabels; // Растовляем переходы | |
LPers.clear; // Очищаем локальные переменные | |
ADD__ESP(MaxSizeStek); | |
RET__; | |
end; | |
{$ENDIF} | |
{ Секция описания комманд на ассемблере } {$IFDEF Tim} | |
Function PLATFORMA :Longint; // Платформа исполения | |
begin | |
PLATFORMA:=TrCo; | |
// Функция Возращающая номер платформы для котрой производиться компиляция; | |
end; | |
// Это использыеться для коментариев описания мнемоник и просто для понятности кода | |
Procedure WriteCros (s:AnsiString); // Записывает Название комманды | |
begin | |
// ПРоцедура описывающая мнемонику колмманды кросс ассемблера | |
TextListCommand:=TextListCommand+'<BR><TABLE BgColor="White"><tr><td><B>'+s+'</B></td>'; | |
end; | |
Procedure EndCros; | |
begin | |
// ПРоцедура в конце формирования комманды в машинных кодах | |
TextListCommand:=TextListCommand+'</tr></TABLE><br>'+Chr(13)+chr(10); | |
end; | |
Procedure WriteNAME (s:AnsiString); // Записывает Название комманды | |
begin | |
// ПРоцедура описывающая мнемонику на родном для платформы ассемблеере | |
TextListCommand:=TextListCommand+'<td BgColor="Linen">'+s+'</td>'; | |
end; | |
Procedure WriteREMM (s:AnsiString); // Записывает Коментарии | |
begin | |
// Различные комментарии | |
TextListCommand:=TextListCommand+'<BR>'+s+Chr(9); | |
end; | |
// ПРоцедуры для записи в масив виртуальной модели памяти программы | |
Procedure WriteHEXX (s:AnsiString); // Записывает последовательность байтов в HEX | |
begin | |
TextListCommand:=TextListCommand+'<td BgColor="NavajoWhite">'+s+'</td>'; | |
WrMwm(s); | |
end; | |
Procedure WriteByte (s:Byte); // Записывает Число Byte | |
begin | |
TextListCommand:=TextListCommand+'<td BgColor="Cornsilk"> Byte</td> '; | |
WrMwc8(s); | |
end; | |
Procedure WriteWord (s:Word); // Записывает Число WORD | |
begin | |
TextListCommand:=TextListCommand+'<td BgColor="Ivory"> WORD </td> '; | |
WrMw16(s); | |
end; | |
Procedure WriteLong (s:LongWord); // Записывает Число LongWord 32 Бита | |
begin | |
TextListCommand:=TextListCommand+'<td BgColor="LemonChiffon"> DWORD </td> '; | |
WrMw32(s); | |
end; | |
Function WriteWorL (a:LongWord):Byte; // Записывает младший разряд 2 батового числа | |
begin | |
TextListCommand:=TextListCommand+'<td BgColor="Seashell"> LByte </td> '; | |
WrMw16L(a); | |
end; | |
Function WriteWorH (a:LongWord):Byte; // Записывает Страший разряд 2 батового числа | |
begin | |
TextListCommand:=TextListCommand+'<td BgColor="Honeydew"> HByte </td> '; | |
WrMw16H(a); | |
end; | |
// Используеться для растановки меток и адресов переменных | |
Function AdrPereme (s:Ansistring):LongWord;// Возвращает адрес переменной | |
begin | |
AdrPereme:=AdrPer(s); | |
end; | |
Procedure ReadLabel (a,b:Ansistring); // Записывает адрес где нада прописать адрес метки | |
begin | |
ReLa(a,b); | |
end; | |
Procedure ReadFunct (a,b:Ansistring); // Записывает адрес где нада прописать адрес метки | |
begin | |
ReFu(a,b); | |
end; | |
//------------------------------------------------------------------------------ | |
procedure PUSH_EAX; | |
begin | |
WriteCros('PUSH_EAX'); | |
if PLATFORMA=80 then begin WriteNAME('PUSH HL') ;WriteHexx('E5') end else | |
if PLATFORMA=16 then begin WriteNAME('PUSH AX') ;WriteHexx('50') end else | |
if PLATFORMA=17 then begin WriteNAME('PUSH AX') ;WriteHexx('50') end else | |
if PLATFORMA=32 then begin WriteNAME('PUSH EAX');WriteHexx('50') end else | |
if PLATFORMA=33 then begin WriteNAME('PUSH EAX');WriteHexx('50') end else | |
if PLATFORMA=34 then begin WriteNAME('PUSH EAX');WriteHexx('50') end else | |
InfoMes( ('Комманда PUSH_EAX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure PUSH_ECX; | |
begin | |
WriteCros('PUSH_ECX'); | |
if PLATFORMA=80 then begin WriteNAME('PUSH BC');WriteHexx('C5') end else | |
if PLATFORMA=16 then Begin WriteNAME('PUSH CX');WriteHexx('51') end else | |
if PLATFORMA=17 then Begin WriteNAME('PUSH CX');WriteHexx('51') end else | |
if PLATFORMA=32 then Begin WriteNAME('PUSH ECX');WriteHexx('51') end else | |
if PLATFORMA=33 then Begin WriteNAME('PUSH ECX');WriteHexx('51') end else | |
if PLATFORMA=34 then Begin WriteNAME('PUSH ECX');WriteHexx('51') end else | |
InfoMes(('Комманда PUSH_ECX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure PUSH_EDX; | |
begin | |
WriteCros('PUSH_EDX'); | |
if PLATFORMA=80 then begin WriteNAME('PUSH DE');WriteHexx('D5') end else | |
if PLATFORMA=16 then begin WriteNAME('PUSH DX');WriteHexx('52') end else | |
if PLATFORMA=17 then begin WriteNAME('PUSH DX');WriteHexx('52') end else | |
if PLATFORMA=32 then begin WriteNAME('PUSH EDX');WriteHexx('52') end else | |
if PLATFORMA=33 then begin WriteNAME('PUSH EDX');WriteHexx('52') end else | |
if PLATFORMA=34 then begin WriteNAME('PUSH EDX');WriteHexx('52') end else | |
InfoMes(('Комманда PUSH_EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure PUSH_ESI; | |
begin | |
WriteCros('PUSH_ESI'); | |
if PLATFORMA=80 then begin WriteNAME('PUSH IY');WriteHexx('FDE5') end else | |
if PLATFORMA=16 then begin WriteNAME('PUSH SI');WriteHexx('56') end else | |
if PLATFORMA=17 then begin WriteNAME('PUSH SI');WriteHexx('56') end else | |
if PLATFORMA=32 then begin WriteNAME('PUSH ESI');WriteHexx('56') end else | |
if PLATFORMA=33 then begin WriteNAME('PUSH ESI');WriteHexx('56') end else | |
if PLATFORMA=34 then begin WriteNAME('PUSH ESI');WriteHexx('56') end else | |
InfoMes(('Комманда PUSH_EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure POP__EAX; | |
begin | |
WriteCros('POP__EAX'); | |
if PLATFORMA=80 then begin WriteNAME('POP HL');WriteHexx('E1') end else | |
if PLATFORMA=16 then begin WriteNAME('POP AX');WriteHexx('58') end else | |
if PLATFORMA=17 then begin WriteNAME('POP AX');WriteHexx('58') end else | |
if PLATFORMA=32 then begin WriteNAME('POP EAX');WriteHexx('58') end else | |
if PLATFORMA=33 then begin WriteNAME('POP EAX');WriteHexx('58') end else | |
if PLATFORMA=34 then begin WriteNAME('POP EAX');WriteHexx('58') end else | |
InfoMes(('Комманда POP_EAX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure POP__ECX; | |
begin | |
WriteCros('POP__ECX'); | |
if PLATFORMA=80 then begin WriteNAME('POP BC');WriteHexx('C1') end else | |
if PLATFORMA=16 then begin WriteNAME('POP CX');WriteHexx('59') end else | |
if PLATFORMA=17 then begin WriteNAME('POP CX');WriteHexx('59') end else | |
if PLATFORMA=32 then begin WriteNAME('POP ECX');WriteHexx('59') end else | |
if PLATFORMA=33 then begin WriteNAME('POP ECX');WriteHexx('59') end else | |
if PLATFORMA=34 then begin WriteNAME('POP ECX');WriteHexx('59') end else | |
InfoMes(('Комманда POP_ECX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure POP__EDX; | |
begin | |
WriteCros('POP__EDX'); | |
if PLATFORMA=80 then begin WriteNAME('POP DE');WriteHexx('D1') end else | |
if PLATFORMA=16 then begin WriteNAME('POP DX');WriteHexx('5A') end else | |
if PLATFORMA=17 then begin WriteNAME('POP DX');WriteHexx('5A') end else | |
if PLATFORMA=32 then begin WriteNAME('POP EDX');WriteHexx('5A') end else | |
if PLATFORMA=33 then begin WriteNAME('POP EDX');WriteHexx('5A') end else | |
if PLATFORMA=34 then begin WriteNAME('POP EDX');WriteHexx('5A') end else | |
InfoMes(('Комманда POP_EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure POP__ESI; | |
begin | |
WriteCros('POP__ESI'); | |
if PLATFORMA=80 then begin WriteNAME('POP IY');WriteHexx('FDE1') end else | |
if PLATFORMA=16 then begin WriteNAME('POP SI');WriteHexx('5E') end else | |
if PLATFORMA=17 then begin WriteNAME('POP SI');WriteHexx('5E') end else | |
if PLATFORMA=32 then begin WriteNAME('POP ESI');WriteHexx('5E') end else | |
if PLATFORMA=33 then begin WriteNAME('POP ESI');WriteHexx('5E') end else | |
if PLATFORMA=34 then begin WriteNAME('POP ESI');WriteHexx('5E') end else | |
InfoMes(('Комманда POP__ESI для платформы не описана ')); | |
EndCros; | |
end; | |
//----------------------- | |
procedure INC__EAX; | |
begin | |
WriteCros('INC__EAX'); | |
if PLATFORMA=80 then begin WriteNAME('INC HL');WriteHexx('23') End else // INC HL | |
if PLATFORMA=16 then begin WriteNAME('INC AX');WriteHexx('40') End else | |
if PLATFORMA=17 then begin WriteNAME('INC AX');WriteHexx('40') End else | |
if PLATFORMA=32 then begin WriteNAME('INC EAX');WriteHexx('40') End else | |
if PLATFORMA=33 then begin WriteNAME('INC EAX');WriteHexx('40') End else | |
if PLATFORMA=34 then begin WriteNAME('INC EAX');WriteHexx('40') End else | |
InfoMes(('Комманда INC__EAX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure INC__ECX; | |
begin | |
WriteCros('INC__ECX'); | |
if PLATFORMA=80 then begin WriteNAME('INC BC');WriteHexx('03') End else | |
if PLATFORMA=16 then begin WriteNAME('INC CX');WriteHexx('41') End else | |
if PLATFORMA=17 then begin WriteNAME('INC CX');WriteHexx('41') End else | |
if PLATFORMA=32 then begin WriteNAME('INC ECX');WriteHexx('41') End else | |
if PLATFORMA=33 then begin WriteNAME('INC ECX');WriteHexx('41') End else | |
if PLATFORMA=34 then begin WriteNAME('INC ECX');WriteHexx('41') End else | |
InfoMes(('Комманда INC__ECX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure INC__EDX; | |
begin | |
WriteCros('INC__EDX'); | |
if PLATFORMA=80 then begin WriteNAME('INC DE');WriteHexx('13') End else | |
if PLATFORMA=16 then begin WriteNAME('INC DX');WriteHexx('42') End else | |
if PLATFORMA=17 then begin WriteNAME('INC DX');WriteHexx('42') End else | |
if PLATFORMA=32 then begin WriteNAME('INC EDX');WriteHexx('42') End else | |
if PLATFORMA=33 then begin WriteNAME('INC EDX');WriteHexx('42') End else | |
if PLATFORMA=34 then begin WriteNAME('INC EDX');WriteHexx('42') End else | |
InfoMes(('Комманда INC__EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure INC__ESI; | |
begin | |
WriteCros('INC__ESI'); | |
if PLATFORMA=80 then begin WriteNAME('INC IY');WriteHexx('FD23') End else | |
if PLATFORMA=16 then begin WriteNAME('INC SI');WriteHexx('46') End else | |
if PLATFORMA=17 then begin WriteNAME('INC SI');WriteHexx('46') End else | |
if PLATFORMA=32 then begin WriteNAME('INC ESI');WriteHexx('46') End else | |
if PLATFORMA=33 then begin WriteNAME('INC ESI');WriteHexx('46') End else | |
if PLATFORMA=34 then begin WriteNAME('INC ESI');WriteHexx('46') End else | |
InfoMes(('Комманда INC__EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure DEC__EAX; | |
begin | |
WriteCros('DEC__EAX'); | |
if PLATFORMA=80 then Begin WriteNAME('DEC HL');WriteHexx('2B') end else // DEC HL | |
if PLATFORMA=16 then Begin WriteNAME('DEC AX');WriteHexx('48') end else | |
if PLATFORMA=17 then Begin WriteNAME('DEC AX');WriteHexx('48') end else | |
if PLATFORMA=32 then Begin WriteNAME('DEC EAX');WriteHexx('48') end else | |
if PLATFORMA=33 then Begin WriteNAME('DEC EAX');WriteHexx('48') end else | |
if PLATFORMA=34 then Begin WriteNAME('DEC EAX');WriteHexx('48') end else | |
InfoMes(('Комманда DEC__EAX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure DEC__ECX; | |
begin | |
WriteCros('DEC__ECX'); | |
if PLATFORMA=80 then Begin WriteNAME('DEC BC');WriteHexx('0B') end else | |
if PLATFORMA=16 then Begin WriteNAME('DEC CX');WriteHexx('49') end else | |
if PLATFORMA=17 then Begin WriteNAME('DEC CX');WriteHexx('49') end else | |
if PLATFORMA=32 then Begin WriteNAME('DEC ECX');WriteHexx('49') end else | |
if PLATFORMA=33 then Begin WriteNAME('DEC ECX');WriteHexx('49') end else | |
if PLATFORMA=34 then Begin WriteNAME('DEC ECX');WriteHexx('49') end else | |
InfoMes(('Комманда DEC__ECX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure DEC__EDX; | |
begin | |
WriteCros('DEC__EDX'); | |
if PLATFORMA=80 then Begin WriteNAME('DEC DE');WriteHexx('1B') end else | |
if PLATFORMA=16 then Begin WriteNAME('DEC DX');WriteHexx('4A') end else | |
if PLATFORMA=17 then Begin WriteNAME('DEC DX');WriteHexx('4A') end else | |
if PLATFORMA=32 then Begin WriteNAME('DEC EDX');WriteHexx('4A') end else | |
if PLATFORMA=33 then Begin WriteNAME('DEC EDX');WriteHexx('4A') end else | |
if PLATFORMA=34 then Begin WriteNAME('DEC EDX');WriteHexx('4A') end else | |
InfoMes(('Комманда DEC__EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure DEC__ESI; | |
begin | |
WriteCros('DEC__ESI'); | |
if PLATFORMA=80 then Begin WriteNAME('DEC IY');WriteHexx('FD2B') end else | |
if PLATFORMA=16 then Begin WriteNAME('DEC SI');WriteHexx('4E') end else | |
if PLATFORMA=17 then Begin WriteNAME('DEC SI');WriteHexx('4E') end else | |
if PLATFORMA=32 then Begin WriteNAME('DEC ESI');WriteHexx('4E') end else | |
if PLATFORMA=33 then Begin WriteNAME('DEC ESI');WriteHexx('4E') end else | |
if PLATFORMA=34 then Begin WriteNAME('DEC ESI');WriteHexx('4E') end else | |
InfoMes(('Комманда DEC__EDX для платформы не описана ')); | |
EndCros; | |
end; | |
//------------------------------------------------------------------------------ | |
// Сложения Вычитания | |
procedure SUB__EAX_EDX; | |
begin | |
WriteCros('SUB__EAX_EDX'); | |
if PLATFORMA=80 then begin WriteName('XOR A ; SBC HL,DE');WriteHexx('AFED52') end else | |
if PLATFORMA=16 then begin WriteName('SUB AX,DX');WriteHexx('29d0') end else | |
if PLATFORMA=17 then begin WriteName('SUB AX,DX');WriteHexx('29d0') end else | |
if PLATFORMA=32 then begin WriteName('SUB EAX,EDX');WriteHexx('29d0') end else | |
if PLATFORMA=33 then begin WriteName('SUB EAX,EDX');WriteHexx('29d0') end else | |
if PLATFORMA=34 then begin WriteName('SUB EAX,EDX');WriteHexx('29d0') end else | |
InfoMes(('Комманда SUB__EAX_EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure SUB__EAX_ECX; | |
begin | |
WriteCros('SUB__EAX_ECX'); | |
if PLATFORMA=80 Then begin WriteName('SUB HL,BC') ;WriteHexx('AFED42'); end else | |
if PLATFORMA=16 Then begin WriteName('SUB AX,CX') ;WriteHexx('29C8'); end else | |
if PLATFORMA=17 Then begin WriteName('SUB AX,CX') ;WriteHexx('29C8'); end else | |
if PLATFORMA=32 Then begin WriteName('SUB EAX,ECX');WriteHexx('29C8'); end else | |
if PLATFORMA=33 Then begin WriteName('SUB EAX,ECX');WriteHexx('29C8'); end else | |
if PLATFORMA=34 Then begin WriteName('SUB EAX,ECX');WriteHexx('29C8'); end else | |
InfoMes(('Нет описания комманды SUB__EAX_ECX для данной платформы ')); | |
EndCros; | |
end; | |
procedure ADD__EAX_EDX; | |
begin | |
WriteCros('ADD__EAX_EDX'); | |
if PLATFORMA=80 then begin WriteName('XOR A ; ADC HL,DE');WriteHexx('AFED5A') end else | |
if PLATFORMA=16 then begin WriteName('ADD AX,DX');WriteHexx('01d0') end else | |
if PLATFORMA=17 then begin WriteName('ADD AX,DX');WriteHexx('01d0') end else | |
if PLATFORMA=32 then begin WriteName('ADD EAX,EDX');WriteHexx('01d0') end else | |
if PLATFORMA=33 then begin WriteName('ADD EAX,EDX');WriteHexx('01d0') end else | |
if PLATFORMA=34 then begin WriteName('ADD EAX,EDX');WriteHexx('01d0') end else | |
InfoMes(('Комманда ADD__EAX_EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure ADD__EAX_ESP; | |
begin | |
WriteCros('ADD__EAX_ESP'); | |
if PLATFORMA=80 Then begin WriteName('ADD HL,SP') ;WriteHexx('AF39'); end else | |
if PLATFORMA=16 Then begin WriteName('ADD AX,SP') ;WriteHexx('01E0'); end else | |
if PLATFORMA=17 Then begin WriteName('ADD AX,SP') ;WriteHexx('01E0'); end else | |
if PLATFORMA=32 Then begin WriteName('ADD EAX,ESP');WriteHexx('01E0'); end else | |
if PLATFORMA=33 Then begin WriteName('ADD EAX,ESP');WriteHexx('01E0'); end else | |
if PLATFORMA=34 Then begin WriteName('ADD EAX,ESP');WriteHexx('01E0'); end else | |
InfoMes(('Нет описания комманды add__EAX_ESP для данной платформы ')); | |
EndCros; | |
end; | |
procedure ADD__ESI_ECX; | |
begin | |
WriteCros('ADD__ESI_ECX'); | |
if PLATFORMA=80 then begin WriteName('XOR A ; ADC IY,BC');WriteHexx('AFFD09') end else | |
if PLATFORMA=16 then begin WriteName('ADD SI,CX');WriteHexx('01CE') end else | |
if PLATFORMA=17 then begin WriteName('ADD SI,CX');WriteHexx('01CE') end else | |
if PLATFORMA=32 then begin WriteName('ADD ESI,ECX');WriteHexx('01CE') end else | |
if PLATFORMA=33 then begin WriteName('ADD ESI,ECX');WriteHexx('01CE') end else | |
if PLATFORMA=34 then begin WriteName('ADD ESI,ECX');WriteHexx('01CE') end else | |
InfoMes(('Комманда ADD__ESI_ECX для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure SUB__ESP(a:LongWord); | |
begin | |
WriteCros('SUB__ESP(CIF)'); | |
if PLATFORMA=80 then begin | |
MOV_A_EAXW(AdrPereme('EAX')); | |
MOV_A_ECXW(AdrPereme('ECX')); | |
MOV__EAX(0); | |
ADD__EAX_ESP; | |
MOV__ECX(a); | |
SUB__EAX_ECX; | |
MOV__ESP_EAX; | |
MOV__ECX_AW(AdrPereme('ECX')); | |
MOV__EAX_AW(AdrPereme('EAX')); | |
end else | |
if PLATFORMA=16 Then begin WriteName('SUB SP,NN') ;WriteHexx('81ec');WriteWord(a) end else | |
if PLATFORMA=17 Then begin WriteName('SUB SP,NN') ;WriteHexx('81ec');WriteWord(a) end else | |
if PLATFORMA=32 Then begin WriteName('SUB ESP,NNNN');WriteHexx('81ec');WriteLong(a) end else | |
if PLATFORMA=33 Then begin WriteName('SUB ESP,NNNN');WriteHexx('81ec');WriteLong(a) end else | |
if PLATFORMA=34 Then begin WriteName('SUB ESP,NNNN');WriteHexx('81ec');WriteLong(a) end else | |
InfoMes(('Комманда SUB__ESP_B для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure ADD__ESP(a:LongWord); | |
begin | |
WriteCros('ADD__ESP(CIF)'); | |
if PLATFORMA=80 then Begin | |
MOV_A_EAXW(AdrPereme('EAX')); | |
MOV__EAX(a); | |
ADD__EAX_ESP; | |
MOV__ESP_EAX; | |
MOV__EAX_AW(AdrPereme('EAX')); | |
end else | |
if PLATFORMA=16 Then begin WriteName('ADD SP,NN') ;WriteHexx('81C4');WriteWord(a) end else | |
if PLATFORMA=17 Then begin WriteName('ADD SP,NN') ;WriteHexx('81C4');WriteWord(a) end else | |
if PLATFORMA=32 Then begin WriteName('ADD SP,NNNN');WriteHexx('81C4');WriteLong(a) end else | |
if PLATFORMA=33 Then begin WriteName('ADD SP,NNNN');WriteHexx('81C4');WriteLong(a) end else | |
if PLATFORMA=34 Then begin WriteName('ADD SP,NNNN');WriteHexx('81C4');WriteLong(a) end else | |
InfoMes(('Комманда Add__ESP_B для платформы не описана ')); | |
EndCros; | |
end; | |
procedure ADD__ESI(B:LongWord); | |
begin | |
WriteCros('ADD__ESI(CIF)'); | |
if PLATFORMA=80 Then begin | |
MOV_A_ECXW(AdrPereme('ECX')); | |
MOV__ECX(b); | |
ADD__ESI_ECX; | |
MOV__ECX_AW(AdrPereme('ECX')); | |
end else | |
if PLATFORMA=16 Then begin WriteName('ADD SI,NN') ;WriteHexx('81C6');WriteWord(b) end else | |
if PLATFORMA=17 Then begin WriteName('ADD SI,NN') ;WriteHexx('81C6');WriteWord(b) end else | |
if PLATFORMA=32 Then begin WriteName('ADD ESI,NNNN');WriteHexx('81C6');WriteLong(b) end else | |
if PLATFORMA=33 Then begin WriteName('ADD ESI,NNNN');WriteHexx('81C6');WriteLong(b) end else | |
if PLATFORMA=34 Then begin WriteName('ADD ESI,NNNN');WriteHexx('81C6');WriteLong(b) end else | |
InfoMes(('Нет описания комманды ADD__ESI(cif) для данной платформы ')); | |
EndCros; | |
end; | |
// SISISISISISISISIIS ---------------------------------------------------------- | |
procedure MOV__ESP_EAX; | |
begin | |
WriteCros('MOV__ESP_EAX'); | |
if PLATFORMA=80 Then begin WriteName('LD SP,HL') ;WriteHexx('F9'); end else | |
if PLATFORMA=16 Then begin WriteName('MOV SP,AX') ;WriteHexx('89C4'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV SP,AX') ;WriteHexx('89C4'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV ESP,EAX');WriteHexx('89C4'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV ESP,EAX');WriteHexx('89C4'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV ESP,EAX');WriteHexx('89C4'); end else | |
InfoMes(('Нет описания комманды MOV__ESP_EAX для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV__ESI_ESP; | |
begin | |
WriteCros('MOV__ESI_ESP'); | |
if PLATFORMA=80 Then begin | |
MOV_A_EAXW(AdrPereme('EAX')); | |
MOV__EAX(0); | |
ADD__EAX_ESP; | |
PUSH_EAX; | |
POP__ESI; | |
MOV__EAX_AW(AdrPereme('EAX')); | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV SI,SP') ;WriteHexx('89E6'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV SI,SP') ;WriteHexx('89E6'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV ESI,ESP');WriteHexx('89E6'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV ESI,ESP');WriteHexx('89E6'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV ESI,ESP');WriteHexx('89E6'); end else | |
InfoMes(('Нет описания комманды MOV__ESI_ESP для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV__ESI_EAX; | |
begin | |
WriteCros('MOV__ESI_EAX'); | |
if PLATFORMA=80 Then begin | |
PUSH_EAX; | |
POP__ESI; | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV SI,AX') ;WriteHexx('89c6'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV SI,AX') ;WriteHexx('89c6'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV ESI,EAX');WriteHexx('89c6'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV ESI,EAX');WriteHexx('89c6'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV ESI,EAX');WriteHexx('89c6'); end else | |
InfoMes(('Нет описания комманды MOV__ESI_EAX для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV__ESI_ECX; | |
begin | |
WriteCros('MOV__ESI_ECX'); | |
if PLATFORMA=80 Then begin | |
PUSH_ECX; | |
POP__ESI; | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV SI,CX');WriteHexx('89ce'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV SI,CX');WriteHexx('89ce'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV ESI,ECX');WriteHexx('89ce'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV ESI,ECX');WriteHexx('89ce'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV ESI,ECX');WriteHexx('89ce'); end else | |
InfoMes(('Нет описания комманды MOV__ESI_ECX для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV__ESI_EDX; | |
begin | |
WriteCros('MOV__ESI_EDX'); | |
if PLATFORMA=80 Then begin | |
PUSH_EDX; | |
POP__ESI; | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV SI,DX');WriteHexx('89d6'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV SI,DX');WriteHexx('89d6'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV ESI,EDX');WriteHexx('89d6'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV ESI,EDX');WriteHexx('89d6'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV ESI,EDX');WriteHexx('89d6'); end else | |
InfoMes(('Нет описания комманды MOV__ESI_EDX для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_AL; | |
begin | |
WriteCros('MOV_AESI_AL'); | |
if PLATFORMA=80 Then begin WriteName('LD [IY],L') ;WriteHexx('FD7500'); end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],AL') ;WriteHexx('8804'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],AL') ;WriteHexx('8804'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],AL');WriteHexx('8806'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],AL');WriteHexx('8806'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],AL');WriteHexx('8806'); end else | |
InfoMes(('Нет описания комманды MOV_AESI_AL для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_CL; | |
begin | |
WriteCros('MOV_AESI_CL'); | |
if PLATFORMA=80 Then begin WriteName('LD [IY],C');WriteHexx('FD7100'); end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],CL');WriteHexx('880C'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],CL');WriteHexx('880C'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],CL');WriteHexx('880E'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],CL');WriteHexx('880E'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],CL');WriteHexx('880E'); end else | |
InfoMes(('Нет описания комманды MOV_AESI_CL для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_DL; | |
begin | |
WriteCros('MOV_AESI_DL'); | |
if PLATFORMA=80 Then begin WriteName('LD [IY],E');WriteHexx('FD7300'); end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],DL');WriteHexx('8814'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],DL');WriteHexx('8814'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],DL');WriteHexx('8816'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],DL');WriteHexx('8816'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],DL');WriteHexx('8816'); end else | |
InfoMes(('Нет описания комманды MOV_AESI_DL для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV__EAX_AESI; | |
begin | |
WriteCros('MOV__EAX_AESI'); | |
if PLATFORMA=80 Then begin | |
WriteName('LD L,[IY+0];INC IY;LD H,[IY+0];'); | |
WriteHexx('FD6E00'+//LD L,(IY+s); | |
'FD23'+//INC IY; | |
'FD6600');//LD h,(IY+s) | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV AX,[SI]') ; WriteHexx('8b04'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV AX,[SI]') ; WriteHexx('8b04'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV EAX,[ESI]'); WriteHexx('8b06'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV EAX,[ESI]'); WriteHexx('8b06'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV EAX,[ESI]'); WriteHexx('8b06'); end else | |
InfoMes(('Нет описания комманды MOV__EAX_AESI для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV__ECX_AESI; | |
begin | |
WriteCros('MOV__ECX_AESI'); | |
if PLATFORMA=80 Then begin | |
WriteName('LD C, [IY+0];INC IY;LD B,[IY+0]'); | |
WriteHexx('FD4E00'+// LD C, (IY+s) | |
'FD23'+ //INC IY | |
'FD4600');//LD B,(IY+s) | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV CX,[SI]') ;WriteHexx('8B0C'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV CX,[SI]') ;WriteHexx('8B0C'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV ECX,[ESI]');WriteHexx('8B0E'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV ECX,[ESI]');WriteHexx('8B0E'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV ECX,[ESI]');WriteHexx('8B0E'); end else | |
InfoMes(('Нет описания комманды MOV__ECX_AESI для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV__EDX_AESI; | |
begin | |
WriteCros('MOV__EDX_AESI'); | |
if PLATFORMA=80 Then begin | |
WriteName('LD E,[IY+0];INC IY;D,[IY+0];'); | |
WriteHexx('FD5E00'+// LD e,(IY+s) | |
'FD23'+// INC IY | |
'FD5600'); // LD D,(IY+s); | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV DX,[SI]'); WriteHexx('8b14'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV DX,[SI]'); WriteHexx('8b14'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV EDX,[ESI]'); WriteHexx('8b16'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV EDX,[ESI]'); WriteHexx('8b16'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV EDX,[ESI]'); WriteHexx('8b16'); end else | |
InfoMes(('Нет описания комманды MOV__EDX_AESI для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_EAX; | |
begin | |
WriteCros('MOV_AESI_EAX'); | |
if PLATFORMA=80 Then begin | |
WriteName('LD [IY+0],L;INC IY;LD [IY+0],H '); | |
WriteHexx('FD7500'+ //LD (IY+s),L | |
'FD23'+//INC IY | |
'FD7400') //LD (IY+s),h | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],AX') ;WriteHexx('8904'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],AX') ;WriteHexx('8904'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],EAX');WriteHexx('8906'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],EAX');WriteHexx('8906'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],EAX');WriteHexx('8906'); end else | |
InfoMes(('Нет описания комманды MOV_AESI_EAX для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_ECX; | |
begin | |
WriteCros('MOV_AESI_ECX'); | |
if PLATFORMA=80 Then begin | |
WriteName('LD [IY+0],C;INC IY;LD [IY+0],B'); | |
WriteHexx('FD7100'+ //LD (IY+s),C | |
'FD23'+ // INC IY | |
'FD7000'); //LD (IY+s),B | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],CX');WriteHexx('890C'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],CX');WriteHexx('890C'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],ECX');WriteHexx('890E'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],ECX');WriteHexx('890E'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],ECX');WriteHexx('890E'); end else | |
InfoMes(('Нет описания комманды MOV_AESI_ECX для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_EDX; | |
begin | |
WriteCros('MOV_AESI_EDX'); | |
if PLATFORMA=80 Then begin | |
WriteName('LD [IY+0],E;INC IY;LD [IY+0],D'); | |
WriteHexx('FD7300'+ //LD (IY+s),E | |
'FD23'+// INC IY | |
'FD7200')// LD (IY+s),D | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],DX') ;WriteHexx('8914'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],DX') ;WriteHexx('8914'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],EDX');WriteHexx('8916'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],EDX');WriteHexx('8916'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],EDX');WriteHexx('8916'); end else | |
InfoMes(('Нет описания комманды MOV_AESI_EDX для данной платформы ')); | |
EndCros; | |
end; | |
// условные безусловные переходы ----------------------------------------------- | |
procedure CMP__EAX_EDX; | |
begin | |
WriteCros('CMP__EAX_EDX'); | |
if PLATFORMA=80 then begin WriteName('XOR A;SBC HL,DE');WriteHexx('AFED52') end else | |
if PLATFORMA=16 then begin WriteName('CMP AX,DX') ;WriteHexx('39d0') end else | |
if PLATFORMA=17 then begin WriteName('CMP AX,DX') ;WriteHexx('39d0') end else | |
if PLATFORMA=32 then begin WriteName('CMP EAX,EDX') ;WriteHexx('39d0') end else | |
if PLATFORMA=33 then begin WriteName('CMP EAX,EDX') ;WriteHexx('39d0') end else | |
if PLATFORMA=34 then begin WriteName('CMP EAX,EDX') ;WriteHexx('39d0') end else | |
InfoMes(('Комманда CMP__EAX_EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure JA___(a:String); | |
begin // Если Больше | |
WriteCros('JA___(CIF)'); | |
if PLATFORMA=16 then begin WriteName('JA NN') ;WriteHexx('0F87');ReadLabel(a,'JA___');WriteWord(0);end else | |
if PLATFORMA=17 then begin WriteName('JA NN') ;WriteHexx('0F87');ReadLabel(a,'JA___');WriteWord(0);end else | |
if PLATFORMA=32 then begin WriteName('JA NNNN');WriteHexx('0F87');ReadLabel(a,'JA___');WriteLong(0);end else | |
if PLATFORMA=33 then begin WriteName('JA NNNN');WriteHexx('0F87');ReadLabel(a,'JA___');WriteLong(0);end else | |
if PLATFORMA=34 then begin WriteName('JA NNNN');WriteHexx('0F87');ReadLabel(a,'JA___');WriteLong(0);end else | |
InfoMes(('Комманда JA___(CIF) для платформы не описана ')); | |
EndCros; | |
end; | |
procedure JAE__(a:String); | |
begin // Если Больше либо равно | |
WriteCros('JAE__(CIF)'); | |
if PLATFORMA=80 then begin WriteName('JP NC,NN');WriteHexx('D2') ;ReadLabel(a,'JA___');WriteWord(0);end else | |
if PLATFORMA=16 then begin WriteName('JAE NN');WriteHexx('0F83') ;ReadLabel(a,'JAE__');WriteWord(0);end else | |
if PLATFORMA=17 then begin WriteName('JAE NN');WriteHexx('0F83') ;ReadLabel(a,'JAE__');WriteWord(0);end else | |
if PLATFORMA=32 then begin WriteName('JAE NNNN');WriteHexx('0F83');ReadLabel(a,'JAE__');WriteLong(0);end else | |
if PLATFORMA=33 then begin WriteName('JAE NNNN');WriteHexx('0F83');ReadLabel(a,'JAE__');WriteLong(0);end else | |
if PLATFORMA=34 then begin WriteName('JAE NNNN');WriteHexx('0F83');ReadLabel(a,'JAE__');WriteLong(0);end else | |
InfoMes(('Комманда JAE__ для платформы не описана ')); | |
EndCros; | |
end; | |
procedure JE___(a:String); | |
begin // Если равно | |
WriteCros('JE___(CIF)'); | |
if PLATFORMA=80 then begin WriteName('JP Z,NN');WriteHexx('CA') ;ReadLabel(a,'JE___');WriteWord(0);end else | |
if PLATFORMA=16 then begin WriteName('JE NN') ;WriteHexx('0F84');ReadLabel(a,'JE___');WriteWord(0);end else | |
if PLATFORMA=17 then begin WriteName('JE NN') ;WriteHexx('0F84');ReadLabel(a,'JE___');WriteWord(0);end else | |
if PLATFORMA=32 then begin WriteName('JE NNNN');WriteHexx('0F84');ReadLabel(a,'JE___');WriteLong(0);end else | |
if PLATFORMA=33 then begin WriteName('JE NNNN');WriteHexx('0F84');ReadLabel(a,'JE___');WriteLong(0);end else | |
if PLATFORMA=34 then begin WriteName('JE NNNN');WriteHexx('0F84');ReadLabel(a,'JE___');WriteLong(0);end else | |
InfoMes(('Комманда JE___ для платформы не описана ')); | |
EndCros; | |
end; | |
procedure JNE__(a:String); | |
begin // Если не равно | |
WriteCros('JNE__(CIF)'); | |
if PLATFORMA=80 then begin WriteName('JP NZ,NN');WriteHexx('C2') ;ReadLabel(a,'JNE__');WriteWord(0);end else | |
if PLATFORMA=16 then begin WriteName('JNE NN') ;WriteHexx('0F85');ReadLabel(a,'JNE__');WriteWord(0);end else | |
if PLATFORMA=17 then begin WriteName('JNE NN') ;WriteHexx('0F85');ReadLabel(a,'JNE__');WriteWord(0);end else | |
if PLATFORMA=32 then begin WriteName('JNE NNNN');WriteHexx('0F85');ReadLabel(a,'JNE__');WriteLong(0);end else | |
if PLATFORMA=33 then begin WriteName('JNE NNNN');WriteHexx('0F85');ReadLabel(a,'JNE__');WriteLong(0);end else | |
if PLATFORMA=34 then begin WriteName('JNE NNNN');WriteHexx('0F85');ReadLabel(a,'JNE__');WriteLong(0);end else | |
InfoMes(('Комманда JNE__ для платформы не описана ')); | |
EndCros; | |
end; | |
procedure JB___(a:String); | |
begin // Нсли Меньше D2 | |
WriteCros('JB___(CIF)'); | |
if PLATFORMA=80 then begin WriteName('JP C,NN');WriteHexx('DA') ; ReadLabel(a,'JB___');WriteWord(0);end else | |
if PLATFORMA=16 then begin WriteName('JB NN') ;WriteHexx('0F82'); ReadLabel(a,'JB___');WriteWord(0);end else | |
if PLATFORMA=17 then begin WriteName('JB NN') ;WriteHexx('0F82'); ReadLabel(a,'JB___');WriteWord(0);end else | |
if PLATFORMA=32 then begin WriteName('JB NNNN');WriteHexx('0F82'); ReadLabel(a,'JB___');WriteLong(0);end else | |
if PLATFORMA=33 then begin WriteName('JB NNNN');WriteHexx('0F82'); ReadLabel(a,'JB___');WriteLong(0);end else | |
if PLATFORMA=34 then begin WriteName('JB NNNN');WriteHexx('0F82'); ReadLabel(a,'JB___');WriteLong(0);end else | |
InfoMes(('Комманда JB___ для платформы не описана ')); | |
EndCros; | |
end; | |
procedure JBE__(a:String); | |
begin // Если Меньше либо равно | |
WriteCros('JBE__(CIF)'); | |
if PLATFORMA=80 then begin JB___(a);JE___(a); end else | |
if PLATFORMA=16 then begin WriteName('JBE NN') ;WriteHexx('0F86'); ReadLabel(a,'JBE__');WriteWord(0);end else | |
if PLATFORMA=17 then begin WriteName('JBE NN') ;WriteHexx('0F86'); ReadLabel(a,'JBE__');WriteWord(0);end else | |
if PLATFORMA=32 then begin WriteName('JBE NNNN');WriteHexx('0F86'); ReadLabel(a,'JBE__');WriteLong(0);end else | |
if PLATFORMA=33 then begin WriteName('JBE NNNN');WriteHexx('0F86'); ReadLabel(a,'JBE__');WriteLong(0);end else | |
if PLATFORMA=34 then begin WriteName('JBE NNNN');WriteHexx('0F86'); ReadLabel(a,'JBE__');WriteLong(0);end else | |
InfoMes(('Комманда JBE__ для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure JMP__(s:String); | |
begin | |
WriteCros('JMP__(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('JP NN') ;WriteHexx('C3');ReadLabel(s,'JMP__');WriteWord(0);end else | |
if PLATFORMA=16 Then begin WriteName('JMP NN') ;WriteHexx('E9');ReadLabel(s,'JMP__');WriteWord(0);end else | |
if PLATFORMA=17 Then begin WriteName('JMP NN') ;WriteHexx('E9');ReadLabel(s,'JMP__');WriteWord(0);end else | |
if PLATFORMA=32 Then begin WriteName('JMP NNNN');WriteHexx('E9');ReadLabel(s,'JMP__');WriteLong(0);end else | |
if PLATFORMA=33 Then begin WriteName('JMP NNNN');WriteHexx('E9');ReadLabel(s,'JMP__');WriteLong(0);end else | |
if PLATFORMA=34 Then begin WriteName('JMP NNNN');WriteHexx('E9');ReadLabel(s,'JMP__');WriteLong(0);end else | |
InfoMes(('Комманда JMP__ для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure RET__; | |
begin | |
WriteCros('RET__'); | |
if PLATFORMA=80 Then begin WriteName('RET');WriteHexx('C9'); end else | |
if PLATFORMA=16 Then begin WriteName('RET');WriteHexx('C3'); end else | |
if PLATFORMA=17 Then begin WriteName('RET');WriteHexx('C3'); end else | |
if PLATFORMA=32 Then begin WriteName('RET');WriteHexx('C3'); end else | |
if PLATFORMA=33 Then begin WriteName('RET');WriteHexx('C3'); end else | |
if PLATFORMA=34 Then begin WriteName('RET');WriteHexx('C3'); end else | |
InfoMes(('Комманда RET__ для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure CAL__(s:String); | |
begin | |
WriteCros('CAL__(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('CALL NN') ;WriteHexx('CD');ReadFunct(s,'Cal__');WriteWord(0); end else | |
if PLATFORMA=16 Then begin WriteName('CALL NN') ;WriteHexx('E8');ReadFunct(s,'Cal__');WriteWord(0); end else | |
if PLATFORMA=17 Then begin WriteName('CALL NN') ;WriteHexx('E8');ReadFunct(s,'Cal__');WriteWord(0); end else | |
if PLATFORMA=32 Then begin WriteName('CALL NNNN');WriteHexx('E8');ReadFunct(s,'Cal__');WriteLong(0); end else | |
if PLATFORMA=33 Then begin WriteName('CALL NNNN');WriteHexx('E8');ReadFunct(s,'Cal__');WriteLong(0); end else | |
if PLATFORMA=34 Then begin WriteName('CALL NNNN');WriteHexx('E8');ReadFunct(s,'Cal__');WriteLong(0); end else | |
InfoMes(('Комманда CAL__ для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure CAL__(s:LongWord); | |
begin | |
WriteCros('CAL__(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('CALL NN') ;WriteHexx('CD');WriteWord(s); end else | |
if PLATFORMA=16 Then begin WriteName('CALL NN') ;WriteHexx('E8');WriteWord(s); end else | |
if PLATFORMA=17 Then begin WriteName('CALL NN') ;WriteHexx('E8');WriteWord(s); end else | |
if PLATFORMA=32 Then begin WriteName('CALL NNNN');WriteHexx('E8');WriteLong(s); end else | |
if PLATFORMA=33 Then begin WriteName('CALL NNNN');WriteHexx('E8');WriteLong(s); end else | |
if PLATFORMA=34 Then begin WriteName('CALL NNNN');WriteHexx('E8');WriteLong(s); end else | |
InfoMes(('Комманда CAL__ для платформы не описана ')); | |
EndCros; | |
end; | |
// Арифметика ------------------------------------------------------------------ | |
procedure XOR__EAX; | |
begin | |
WriteCros('XOR__EAX'); | |
if PLATFORMA=80 then begin WriteName('LD HL,00') ;WriteHexx('210000') end else // LD HL,0 | |
if PLATFORMA=16 then begin WriteName('XOR AX,AX') ;WriteHexx('31c0') end else | |
if PLATFORMA=17 then begin WriteName('XOR AX,AX') ;WriteHexx('31c0') end else | |
if PLATFORMA=32 then begin WriteName('XOR EAX,EAX');WriteHexx('31c0') end else | |
if PLATFORMA=33 then begin WriteName('XOR EAX,EAX');WriteHexx('31c0') end else | |
if PLATFORMA=34 then begin WriteName('XOR EAX,EAX');WriteHexx('31c0') end else | |
InfoMes(('Комманда XOR__EAX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure XOR__ECX; | |
begin | |
WriteCros('XOR__ECX'); | |
if PLATFORMA=80 then begin WriteName('LD BC,00') ;WriteHexx('010000') end else | |
if PLATFORMA=16 then begin WriteName('XOR CX,CX') ;WriteHexx('31c9') end else | |
if PLATFORMA=17 then begin WriteName('XOR CX,CX') ;WriteHexx('31c9') end else | |
if PLATFORMA=32 then begin WriteName('XOR ECX,ECX');WriteHexx('31c9') end else | |
if PLATFORMA=33 then begin WriteName('XOR ECX,ECX');WriteHexx('31c9') end else | |
if PLATFORMA=34 then begin WriteName('XOR ECX,ECX');WriteHexx('31c9') end else | |
InfoMes(('Комманда XOR__ECX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure XOR__EDX; | |
begin | |
WriteCros('XOR__EDX'); | |
if PLATFORMA=80 then begin WriteName('LD DE,00') ;WriteHexx('110000') End else | |
if PLATFORMA=16 then begin WriteName('XOR DX') ;WriteHexx('31d2') End else | |
if PLATFORMA=17 then begin WriteName('XOR DX') ;WriteHexx('31d2') End else | |
if PLATFORMA=32 then begin WriteName('XOR EDX,EDX');WriteHexx('31d2') End else | |
if PLATFORMA=33 then begin WriteName('XOR EDX,EDX');WriteHexx('31d2') End else | |
if PLATFORMA=34 then begin WriteName('XOR EDX,EDX');WriteHexx('31d2') End else | |
InfoMes(('Комманда XOR__EDX для платформы не описана ')); | |
EndCros; | |
end; | |
procedure XOR__ESI; | |
begin | |
WriteCros('XOR__ESI'); | |
if PLATFORMA=80 then begin WriteName('LD IY,00') ;WriteHexx('FD110000') End else | |
if PLATFORMA=16 then begin WriteName('XOR SI,SI') ;WriteHexx('31F6') End else | |
if PLATFORMA=17 then begin WriteName('XOR SI,SI') ;WriteHexx('31F6') End else | |
if PLATFORMA=32 then begin WriteName('XOR ESI,ESI');WriteHexx('31F6') End else | |
if PLATFORMA=33 then begin WriteName('XOR ESI,ESI');WriteHexx('31F6') End else | |
if PLATFORMA=34 then begin WriteName('XOR ESI,ESI');WriteHexx('31F6') End else | |
InfoMes(('Комманда XOR__ESI для платформы не описана ')); | |
EndCros; | |
end; | |
// Загрузка значений ----------------------------------------------------------- | |
Procedure MOV__EAX(a:LongWord); | |
begin | |
WriteCros('MOV__EAX(CIF)'); | |
if PLATFORMA=80 then begin WriteName('LD HL,NN') ;WriteHexx('21');WriteWord(a);end else | |
if PLATFORMA=16 then begin WriteName('MOV AX,NN') ;WriteHexx('B8');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV AX,NN') ;WriteHexx('B8');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV EAX,NNNN');WriteHexx('B8');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV EAX,NNNN');WriteHexx('B8');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV EAX,NNNN');WriteHexx('B8');WriteLong(a);end else | |
InfoMes(('Комманда MOV__EAX для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure MOV__ECX(a:LongWord); | |
begin | |
WriteCros('MOV__ECX(CIF)'); | |
if PLATFORMA=80 then begin WriteName('LD BC,NN') ;WriteHexx('01');WriteWord(a);end else | |
if PLATFORMA=16 then begin WriteName('MOV CX,NN') ;WriteHexx('B9');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV CX,NN') ;WriteHexx('B9');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV ECX,NNNN');WriteHexx('B9');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV ECX,NNNN');WriteHexx('B9');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV ECX,NNNN');WriteHexx('B9');WriteLong(a);end else | |
InfoMes(('Комманда MOV__ECX для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure MOV__EDX(a:LongWord); | |
begin | |
WriteCros('MOV__EDX(CIF)'); | |
if PLATFORMA=80 then begin WriteName('LD DE,NN') ;WriteHexx('11');WriteWord(a);end else | |
if PLATFORMA=16 then begin WriteName('MOV DX,NN') ;WriteHexx('BA');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV DX,NN') ;WriteHexx('BA');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV EDX,NNNN');WriteHexx('BA');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV EDX,NNNN');WriteHexx('BA');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV EDX,NNNN');WriteHexx('BA');WriteLong(a);end else | |
InfoMes(('Комманда MOV__EDX(CIF) для платформы не описана ')); | |
EndCros; | |
end; | |
procedure MOV__ESI(a:LongWord); | |
begin | |
WriteCros('MOV__ESI(CIF)'); | |
if PLATFORMA=80 then begin WriteName('LD IY,NN') ;WriteHexx('FD21');WriteWord(a);end else | |
if PLATFORMA=16 then begin WriteName('MOV SI,NN') ;WriteHexx('BE') ;WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV SI,NN') ;WriteHexx('BE') ;WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV ESI,NNNN');WriteHexx('BE') ;WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV ESI,NNNN');WriteHexx('BE') ;WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV ESI,NNNN');WriteHexx('BE') ;WriteLong(a);end else | |
InfoMes(('Комманда MOV__ESI для платформы не описана ')); | |
EndCros; | |
end; | |
//-------------------------------- | |
Procedure MOV__EAX_AW(a:LongWord); | |
begin | |
WriteCros('MOV__EAX_AW(CIF)'); | |
if PLATFORMA=80 then begin WriteName('LD HL,[NN]') ;WriteHexx('2A');WriteWord(a);end else | |
if PLATFORMA=16 then begin WriteName('MOV AX,[NN]') ;WriteHexx('A1');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV AX,[NN]') ;WriteHexx('A1');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV EAX,[NNNN]');WriteHexx('A1');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV EAX,[NNNN]');WriteHexx('A1');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV EAX,[NNNN]');WriteHexx('A1');WriteLong(a);end else | |
InfoMes(('Комманда MOV__EAX_AW для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure MOV__EAX_AB(a:LongWord); | |
begin | |
WriteCros('MOV__EAX_AB(CIF)'); | |
if PLATFORMA=80 then begin MOV__EAX_AW(a);Mov__AH(0); end else | |
if PLATFORMA=16 then begin WriteName('MOV AL,[NN]') ;WriteHexx('A0');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV AL,[NN]') ;WriteHexx('A0');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV AL,[NNNN]');WriteHexx('A0');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV AL,[NNNN]');WriteHexx('A0');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV AL,[NNNN]');WriteHexx('A0');WriteLong(a);end else | |
InfoMes(('Комманда MOV__EAX_AB для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure MOV__ECX_AW(a:LongWord); | |
begin | |
WriteCros('MOV__ECX_AW(CIF)'); | |
if PLATFORMA=80 then begin WriteName('LD BC,[NN]') ;WriteHexx('ED4B');WriteWord(a);end else | |
if PLATFORMA=16 then begin WriteName('MOV CX,[NN]') ;WriteHexx('8b0E');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV CX,[NN]') ;WriteHexx('8b0E');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV ECX,[NNNN]');WriteHexx('8B0D');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV ECX,[NNNN]');WriteHexx('8B0D');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV ECX,[NNNN]');WriteHexx('8B0D');WriteLong(a);end else | |
InfoMes(('Комманда MOV__ECX_AW для платформы не описана ')); | |
EndCros; | |
end; | |
procedure MOV__ECX_AB(a:LongWord); | |
begin | |
WriteCros('MOV__ECX_AB(CIF)'); | |
if PLATFORMA=80 then begin MOV__ECX_AW(a);MOV__CH(0);end else | |
if PLATFORMA=16 then begin WriteName('MOV CL,[NN]') ;WriteHexx('8A0E');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV CL,[NN]') ;WriteHexx('8A0E');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV CL,[NNNN]');WriteHexx('8A0D');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV CL,[NNNN]');WriteHexx('8A0D');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV CL,[NNNN]');WriteHexx('8A0D');WriteLong(a);end else | |
InfoMes(('Комманда MOV__ECX_AB для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure MOV__EDX_AW(a:LongWord); | |
begin | |
WriteCros('MOV__EDX_AW(CIF)'); | |
if PLATFORMA=80 then begin WriteName('LD E,[NN]') ;WriteHexx('ED5B');WriteWord(a);end else | |
if PLATFORMA=16 then begin WriteName('MOV DX,[NN]') ;WriteHexx('8b16');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV DX,[NN]') ;WriteHexx('8b16');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV EDX,[NNNN]');WriteHexx('8b15');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV EDX,[NNNN]');WriteHexx('8b15');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV EDX,[NNNN]');WriteHexx('8b15');WriteLong(a);end else | |
InfoMes(('Комманда MOV__EDX_AW(CIF) для платформы не описана ')); | |
EndCros; | |
end; | |
Procedure MOV__EDX_AB(a:LongWord); | |
begin | |
WriteCros('MOV__EDX_AB(CIF)'); | |
if PLATFORMA=80 then begin MOV__EDX_AW(a);MOV__DH(0); end else | |
if PLATFORMA=16 then begin WriteName('MOV DL,[NN]') ;WriteHexx('8a16');WriteWord(a);end else | |
if PLATFORMA=17 then begin WriteName('MOV DL,[NN]') ;WriteHexx('8a16');WriteWord(a);end else | |
if PLATFORMA=32 then begin WriteName('MOV DL,[NNNN]');WriteHexx('8a15');WriteLong(a);end else | |
if PLATFORMA=33 then begin WriteName('MOV DL,[NNNN]');WriteHexx('8a15');WriteLong(a);end else | |
if PLATFORMA=34 then begin WriteName('MOV DL,[NNNN]');WriteHexx('8a15');WriteLong(a);end else | |
InfoMes(('Комманда MOV__EDX_AB для платформы не описана ')); | |
EndCros; | |
end; | |
//-------------------------------- | |
Procedure Mov_A_EAXW(a:Longword); | |
begin | |
WriteCros('Mov_A_EAXW(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD [NN],HL') ;WriteHexx('22');WriteWord(a) end else | |
if PLATFORMA=16 Then begin WriteName('MOV [NN],AX') ;WriteHexx('A3');WriteWord(a) end else | |
if PLATFORMA=17 Then begin WriteName('MOV [NN],AX') ;WriteHexx('A3');WriteWord(a) end else | |
if PLATFORMA=32 Then begin WriteName('MOV [NNNN],EAX');WriteHexx('A3');WriteLong(a) end else | |
if PLATFORMA=33 Then begin WriteName('MOV [NNNN],EAX');WriteHexx('A3');WriteLong(a) end else | |
if PLATFORMA=34 Then begin WriteName('MOV [NNNN],EAX');WriteHexx('A3');WriteLong(a) end else | |
InfoMes(('Нет описания комманды Mov_A_EAXW для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_A_EAXB(a:LongWord); | |
begin | |
WriteCros('Mov_A_EAXB(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD A,L;LD [NN],A');WriteHexx('7D32');WriteWord(a) end else | |
if PLATFORMA=16 Then begin WriteName('MOV [NN],AL') ;WriteHexx('A2') ;WriteWord(a) end else | |
if PLATFORMA=17 Then begin WriteName('MOV [NN],AL') ;WriteHexx('A2') ;WriteWord(a) end else | |
if PLATFORMA=32 Then begin WriteName('MOV [NNNN],AL') ;WriteHexx('A2') ;WriteLong(a) end else | |
if PLATFORMA=33 Then begin WriteName('MOV [NNNN],AL') ;WriteHexx('A2') ;WriteLong(a) end else | |
if PLATFORMA=34 Then begin WriteName('MOV [NNNN],AL') ;WriteHexx('A2') ;WriteLong(a) end else | |
InfoMes(('Нет описания комманды Mov_A_EAXB для данной платформы ')); | |
EndCros; | |
end; | |
Procedure MOV_A_ECXW(a:Longword); | |
begin | |
WriteCros('Mov_A_ECXW(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD [NN],BC') ;WriteHexx('ED43');WriteWord(a); end else | |
if PLATFORMA=16 Then begin WriteName('MOV [NN],CX') ;WriteHexx('890d');WriteWord(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [NN],CX') ;WriteHexx('890d');WriteWord(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [NNNN],ECX');WriteHexx('890d');WriteLong(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [NNNN],ECX');WriteHexx('890d');WriteLong(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [NNNN],ECX');WriteHexx('890d');WriteLong(a); end else | |
InfoMes(('Нет описания комманды MOV_A_ECXW для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_A_ECXB(a:LongWord); | |
begin | |
WriteCros('Mov_A_ECXB(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD A,C;LD [NN],A');WriteHexx('7932');WriteWord(a); end else | |
if PLATFORMA=16 Then begin WriteName('MOV [NN],CL') ;WriteHexx('880E');WriteWord(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [NN],CL') ;WriteHexx('880E');WriteWord(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [NNNN],CL') ;WriteHexx('880D');WriteLong(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [NNNN],CL') ;WriteHexx('880D');WriteLong(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [NNNN],CL') ;WriteHexx('880D');WriteLong(a); end else | |
InfoMes(('Нет описания комманды Mov_A_ECXB для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_A_EDXW(a:Longword); | |
begin | |
WriteCros('Mov_A_EDXW(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD [NN],DE') ;WriteHexx('ED53');WriteWord(a); end else | |
if PLATFORMA=16 Then begin WriteName('MOV [NN],DX') ;WriteHexx('8916');WriteWord(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [NN],DX') ;WriteHexx('8916');WriteWord(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [NNNN],EDX');WriteHexx('8915');WriteLong(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [NNNN],EDX');WriteHexx('8915');WriteLong(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [NNNN],EDX');WriteHexx('8915');WriteLong(a); end else | |
InfoMes(('Нет описания комманды Mov_A_EDXW для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_A_EDXB(a:Longword); | |
begin | |
WriteCros('Mov_A_EDXB(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD A,E;LD [NN],A');WriteHexx('7B32');WriteWord(a); end else | |
if PLATFORMA=16 Then begin WriteName('MOV [NN],DL') ;WriteHexx('8816');WriteWord(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV [NN],DL') ;WriteHexx('8816');WriteWord(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV [NNNN],DL') ;WriteHexx('8815');WriteLong(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV [NNNN],DL') ;WriteHexx('8815');WriteLong(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV [NNNN],DL') ;WriteHexx('8815');WriteLong(a); end else | |
InfoMes(('Нет описания комманды Mov_A_EDXB для данной платформы ')); | |
EndCros; | |
end; | |
//-------------------------------- | |
Procedure Mov_AEAX_W(a:Longword); | |
begin | |
WriteCros('Mov_AEAX_W(CIF)'); | |
if PLATFORMA=80 Then begin MOV__ESI_EAX;MOV_AESI_W(a); end else | |
if PLATFORMA=16 Then begin MOV__ESI_EAX;MOV_AESI_W(a); end else | |
if PLATFORMA=17 Then begin MOV__ESI_EAX;MOV_AESI_W(a); end else | |
if PLATFORMA=32 Then begin MOV__ESI_EAX;MOV_AESI_W(a); end else | |
if PLATFORMA=33 Then begin MOV__ESI_EAX;MOV_AESI_W(a); end else | |
if PLATFORMA=34 Then begin MOV__ESI_EAX;MOV_AESI_W(a); end else | |
InfoMes(('Нет описания комманды Mov_AEAX_W для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_AEAX_B(a:Byte); | |
begin | |
WriteCros('Mov_AEAX_B(CIF)'); | |
if PLATFORMA=80 Then begin MOV__ESI_EAX;MOV_AESI_B(a); end else | |
if PLATFORMA=16 Then begin MOV__ESI_EAX;MOV_AESI_B(a); end else | |
if PLATFORMA=17 Then begin MOV__ESI_EAX;MOV_AESI_B(a); end else | |
if PLATFORMA=32 Then begin MOV__ESI_EAX;MOV_AESI_B(a); end else | |
if PLATFORMA=33 Then begin MOV__ESI_EAX;MOV_AESI_B(a); end else | |
if PLATFORMA=34 Then begin MOV__ESI_EAX;MOV_AESI_B(a); end else | |
InfoMes(('Нет описания комманды Mov_AEAX_B для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_AECX_W(a:Longword); | |
begin | |
WriteCros('Mov_AECX_W(CIF)'); | |
if PLATFORMA=80 Then begin MOV__ESI_ECX;MOV_AESI_W(a); end else | |
if PLATFORMA=16 Then begin MOV__ESI_ECX;MOV_AESI_W(a); end else | |
if PLATFORMA=17 Then begin MOV__ESI_ECX;MOV_AESI_W(a); end else | |
if PLATFORMA=32 Then begin MOV__ESI_ECX;MOV_AESI_W(a); end else | |
if PLATFORMA=33 Then begin MOV__ESI_ECX;MOV_AESI_W(a); end else | |
if PLATFORMA=34 Then begin MOV__ESI_ECX;MOV_AESI_W(a); end else | |
InfoMes(('Нет описания комманды Mov_AECX_W для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_AECX_B(a:Byte); | |
begin | |
WriteCros('Mov_AECX_B(CIF)'); | |
if PLATFORMA=80 Then begin MOV__ESI_ECX;MOV_AESI_B(a); end else | |
if PLATFORMA=16 Then begin MOV__ESI_ECX;MOV_AESI_B(a); end else | |
if PLATFORMA=17 Then begin MOV__ESI_ECX;MOV_AESI_B(a); end else | |
if PLATFORMA=32 Then begin MOV__ESI_ECX;MOV_AESI_B(a); end else | |
if PLATFORMA=33 Then begin MOV__ESI_ECX;MOV_AESI_B(a); end else | |
if PLATFORMA=34 Then begin MOV__ESI_ECX;MOV_AESI_B(a); end else | |
InfoMes(('Нет описания комманды Mov_AECX_B для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_AEDX_W(a:LongWord); | |
begin | |
WriteCros('Mov_AEDX_W(CIF)'); | |
if PLATFORMA=80 Then begin MOV__ESI_EDX;MOV_AESI_W(a); end else | |
if PLATFORMA=16 Then begin MOV__ESI_EDX;MOV_AESI_W(a); end else | |
if PLATFORMA=17 Then begin MOV__ESI_EDX;MOV_AESI_W(a); end else | |
if PLATFORMA=32 Then begin MOV__ESI_EDX;MOV_AESI_W(a); end else | |
if PLATFORMA=33 Then begin MOV__ESI_EDX;MOV_AESI_W(a); end else | |
if PLATFORMA=34 Then begin MOV__ESI_EDX;MOV_AESI_W(a); end else | |
InfoMes(('Нет описания комманды Mov_AEDX_W для данной платформы ')); | |
EndCros; | |
end; | |
Procedure Mov_AEDX_B(a:Byte); | |
begin | |
WriteCros('Mov_AEDX_B(CIF)'); | |
if PLATFORMA=80 Then begin MOV__ESI_EDX;MOV_AESI_B(a); end else | |
if PLATFORMA=16 Then begin MOV__ESI_EDX;MOV_AESI_B(a); end else | |
if PLATFORMA=17 Then begin MOV__ESI_EDX;MOV_AESI_B(a); end else | |
if PLATFORMA=32 Then begin MOV__ESI_EDX;MOV_AESI_B(a); end else | |
if PLATFORMA=33 Then begin MOV__ESI_EDX;MOV_AESI_B(a); end else | |
if PLATFORMA=34 Then begin MOV__ESI_EDX;MOV_AESI_B(a); end else | |
InfoMes(('Нет описания комманды Mov_AEDX_B для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_W(a:LongWord); | |
begin | |
WriteCros('MOV_AESI_W(CIF)'); | |
if PLATFORMA=80 Then begin | |
WriteName('LD [IY+0],N;INC IY;LD [IY+0],N'); | |
WriteHexx('FD3600');WriteWorL(a);//LD (IY+s),n | |
WriteHexx('FD23'); // INC IY | |
WriteHexx('FD3600');WriteWorH(a);// //LD (IY+s),n | |
end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],NN') ;WriteHexx('c704');WriteWord(a);end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],NN') ;WriteHexx('c704');WriteWord(a);end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],NNNN');WriteHexx('c706');WriteLong(a);end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],NNNN');WriteHexx('c706');WriteLong(a);end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],NNNN');WriteHexx('c706');WriteLong(a);end else | |
InfoMes(('Нет описания комманды MOV_AESI_W для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AESI_B(a:Byte); | |
begin | |
WriteCros('MOV_AESI_B(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD [IY],N') ;WriteHexx('FD3600');WriteByte(a)end else | |
if PLATFORMA=16 Then begin WriteName('MOV [SI],N') ;WriteHexx('c604') ;WriteByte(a);end else | |
if PLATFORMA=17 Then begin WriteName('MOV [SI],N') ;WriteHexx('c604') ;WriteByte(a);end else | |
if PLATFORMA=32 Then begin WriteName('MOV [ESI],N');WriteHexx('c606') ;WriteByte(a);end else | |
if PLATFORMA=33 Then begin WriteName('MOV [ESI],N');WriteHexx('c606') ;WriteByte(a);end else | |
if PLATFORMA=34 Then begin WriteName('MOV [ESI],N');WriteHexx('c606') ;WriteByte(a);end else | |
InfoMes(('Нет описания комманды MOV_AESI_B для данной платформы ')); | |
EndCros; | |
end; | |
//------------------------------------------------------------------------------ | |
Procedure MOV__EDX_EAX; | |
begin | |
WriteCros('MOV__EDX_EAX'); | |
if PLATFORMA=80 Then begin WriteName('LD D,H;LD E,L');WriteHexx('545D'); end else | |
if PLATFORMA=16 Then begin WriteName('MOV DX,AX') ;WriteHexx('89c2'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV DX,AX') ;WriteHexx('89c2'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV EDX,EAX') ;WriteHexx('89c2'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV EDX,EAX') ;WriteHexx('89c2'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV EDX,EAX') ;WriteHexx('89c2'); end else | |
InfoMes(('Нет описания комманды MOV_EDX_EAX для данной платформы ')); | |
EndCros; | |
end; | |
//-------------------------------- | |
procedure Mov__EAX_AEAX; | |
begin | |
WriteCros('MOV__EAX_AEAX'); | |
if PLATFORMA=80 Then begin MOV__ESI_EAX;MOV__EAX_AESI; end else | |
if PLATFORMA=16 Then begin MOV__ESI_EAX;MOV__EAX_AESI; end else | |
if PLATFORMA=17 Then begin MOV__ESI_EAX;MOV__EAX_AESI; end else | |
if PLATFORMA=32 Then begin MOV__ESI_EAX;MOV__EAX_AESI; end else | |
if PLATFORMA=33 Then begin MOV__ESI_EAX;MOV__EAX_AESI; end else | |
if PLATFORMA=34 Then begin MOV__ESI_EAX;MOV__EAX_AESI; end else | |
InfoMes(('Нет описания комманды Mov__EAX_AEAX для данной платформы ')); | |
EndCros; | |
end; | |
procedure Mov__EDX_AEDX; | |
begin | |
WriteCros('MOV__EDX_AEDX'); | |
if PLATFORMA=80 Then begin MOV__ESI_EDX;MOV__EDX_AESI; end else | |
if PLATFORMA=16 Then begin MOV__ESI_EDX;MOV__EDX_AESI; end else | |
if PLATFORMA=17 Then begin MOV__ESI_EDX;MOV__EDX_AESI; end else | |
if PLATFORMA=32 Then begin MOV__ESI_EDX;MOV__EDX_AESI; end else | |
if PLATFORMA=33 Then begin MOV__ESI_EDX;MOV__EDX_AESI; end else | |
if PLATFORMA=34 Then begin MOV__ESI_EDX;MOV__EDX_AESI; end else | |
InfoMes(('Нет описания комманды Mov__EDX_AEDX для данной платформы ')); | |
EndCros; | |
end; | |
//-------------------------------- | |
procedure MOV_AEAX_EDX ; | |
begin | |
WriteCros('MOV_AEAX_EDX'); | |
if PLATFORMA=80 Then begin MOV__ESI_EAX;MOV_AESI_EDX; end else | |
if PLATFORMA=16 Then begin MOV__ESI_EAX;MOV_AESI_EDX; end else | |
if PLATFORMA=17 Then begin MOV__ESI_EAX;MOV_AESI_EDX; end else | |
if PLATFORMA=32 Then begin MOV__ESI_EAX;MOV_AESI_EDX; end else | |
if PLATFORMA=33 Then begin MOV__ESI_EAX;MOV_AESI_EDX; end else | |
if PLATFORMA=34 Then begin MOV__ESI_EAX;MOV_AESI_EDX; end else | |
InfoMes(('Нет описания комманды MOV_AEAX_EDX для данной платформы ')); | |
EndCros; | |
end; | |
procedure MOV_AEAX_DL ; | |
begin | |
WriteCros('MOV_AEAX_DL'); | |
if PLATFORMA=80 Then begin MOV__ESI_EAX;MOV_AESI_DL; end else | |
if PLATFORMA=16 Then begin MOV__ESI_EAX;MOV_AESI_DL; end else | |
if PLATFORMA=17 Then begin MOV__ESI_EAX;MOV_AESI_DL; end else | |
if PLATFORMA=32 Then begin MOV__ESI_EAX;MOV_AESI_DL; end else | |
if PLATFORMA=33 Then begin MOV__ESI_EAX;MOV_AESI_DL; end else | |
if PLATFORMA=34 Then begin MOV__ESI_EAX;MOV_AESI_DL; end else | |
InfoMes(('Нет описания комманды MOV_AEAX_DL для данной платформы ')); | |
EndCros; | |
end; | |
//-------------------------------- | |
procedure Mov__AH(A:Byte); | |
begin | |
WriteCros('Mov__AH(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD H,N') ;WriteHexx('26');WriteByte(a); end else | |
if PLATFORMA=16 Then begin WriteName('MOV AH,N');WriteHexx('B4');WriteByte(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV AH,N');WriteHexx('B4');WriteByte(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV AH,N');WriteHexx('B4');WriteByte(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV AH,N');WriteHexx('B4');WriteByte(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV AH,N');WriteHexx('B4');WriteByte(a); end else | |
InfoMes(('Нет описания комманды Mov_AH для данной платформы ')); | |
EndCros; | |
end; | |
procedure Mov__CH(A:Byte); | |
begin | |
WriteCros('Mov__CH(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD B,N') ;WriteHexx('06');WriteByte(a); end else | |
if PLATFORMA=16 Then begin WriteName('MOV CH,N');WriteHexx('B5');WriteByte(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV CH,N');WriteHexx('B5');WriteByte(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV CH,N');WriteHexx('B5');WriteByte(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV CH,N');WriteHexx('B5');WriteByte(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV CH,N');WriteHexx('B5');WriteByte(a); end else | |
InfoMes(('Нет описания комманды Mov_CH для данной платформы ')); | |
EndCros; | |
end; | |
procedure Mov__DH(A:Byte); | |
begin | |
WriteCros('Mov__DH(CIF)'); | |
if PLATFORMA=80 Then begin WriteName('LD D,N') ;WriteHexx('16');WriteByte(a); end else | |
if PLATFORMA=16 Then begin WriteName('MOV DH,N');WriteHexx('B6');WriteByte(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV DH,N');WriteHexx('B6');WriteByte(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV DH,N');WriteHexx('B6');WriteByte(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV DH,N');WriteHexx('B6');WriteByte(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV DH,N');WriteHexx('B6');WriteByte(a); end else | |
InfoMes(('Нет описания комманды Mov_DH для данной платформы ')); | |
EndCros; | |
end; | |
procedure Mov__BL(A:Byte); | |
begin | |
WriteCros('Mov__BL(CIF)'); | |
if PLATFORMA=16 Then begin WriteName('MOV BL,N');WriteHexx('B311');WriteByte(a); end else | |
if PLATFORMA=17 Then begin WriteName('MOV BL,N');WriteHexx('B311');WriteByte(a); end else | |
if PLATFORMA=32 Then begin WriteName('MOV BL,N');WriteHexx('B311');WriteByte(a); end else | |
if PLATFORMA=33 Then begin WriteName('MOV BL,N');WriteHexx('B311');WriteByte(a); end else | |
if PLATFORMA=34 Then begin WriteName('MOV BL,N');WriteHexx('B311');WriteByte(a); end else | |
InfoMes(('Нет описания комманды Mov_BL для данной платформы ')); | |
EndCros; | |
end; | |
procedure Mov__AL_DL; | |
begin | |
WriteCros('MOV__AL_DL'); | |
if PLATFORMA=80 Then begin WriteName('LD L,E') ;WriteHexx('6B'); end else | |
if PLATFORMA=16 Then begin WriteName('MOV AL,DL');WriteHexx('88d0'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV AL,DL');WriteHexx('88d0'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV AL,DL');WriteHexx('88d0'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV AL,DL');WriteHexx('88d0'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV AL,DL');WriteHexx('88d0'); end else | |
InfoMes(('Нет описания комманды Mov__AL_DL для данной платформы ')); | |
EndCros; | |
end; | |
procedure Mov__AL_DH; | |
begin | |
WriteCros('MOV__AL_DH'); | |
if PLATFORMA=80 Then begin WriteName('LD L,D') ;WriteHexx('6A'); end else | |
if PLATFORMA=16 Then begin WriteName('MOV AL,DH');WriteHexx('88f0'); end else | |
if PLATFORMA=17 Then begin WriteName('MOV AL,DH');WriteHexx('88f0'); end else | |
if PLATFORMA=32 Then begin WriteName('MOV AL,DH');WriteHexx('88f0'); end else | |
if PLATFORMA=33 Then begin WriteName('MOV AL,DH');WriteHexx('88f0'); end else | |
if PLATFORMA=34 Then begin WriteName('MOV AL,DH');WriteHexx('88f0'); end else | |
InfoMes(('Нет описания комманды Mov__AL_Dh для данной платформы ')); | |
EndCros; | |
end; | |
procedure INT__(i:LongWord); | |
begin | |
if TrCo=16 Then begin WrMwm('CD');WrMwc8(i); end else | |
if TrCo=17 Then begin WrMwm('CD');WrMwc8(i); end else | |
if TrCo=32 Then begin WrMwm('CD');WrMwc8(i); end else | |
InfoMes(('Комманда INT__ для платформы не описана ')); | |
end; | |
Procedure GetTextListCommand;// ПРосто выводит красивую табличку со всеми поддреживаемыми коммандами | |
var | |
MR:Array[1..3] of LongWord;// Список поддреживаемых режимов | |
f:Byte;// Эта переменная нужна для перебора списка платформ в цикле | |
begin | |
TextListCommand:=''; | |
MR[1]:=16;// INTEL 16 | |
MR[2]:=32;// INTEL 32 | |
MR[3]:=80;// ZILOG Z80A | |
for f:=1 to 3 do | |
begin | |
trCo:=mR[f]; | |
if f=1 then TextListCommand:=TextListCommand+'<HR> <center> 16 битный режим INTEL </center><br><br>'; | |
if f=2 then TextListCommand:=TextListCommand+'<HR> <center> 32 битный режим INTEL </center><br><br>'; | |
if f=3 then TextListCommand:=TextListCommand+'<HR> <center> ZILOG Z80A </center><br><br>'; | |
//-------------------------------------------------------- | |
TextListCommand:=TextListCommand+'<HR> <center>Процедуры для работы со стеком </center><br><br>'; | |
PUSH_EAX;PUSH_ECX;PUSH_EDX;PUSH_ESI; | |
POP__EAX;POP__ECX;POP__EDX;POP__ESI; | |
TextListCommand:=TextListCommand+'<HR> <center> Инскримент Дискримент </center><br><br>'; | |
INC__EAX;INC__ECX;INC__EDX;INC__ESI; | |
DEC__EAX;DEC__ECX;DEC__EDX;DEC__ESI; | |
TextListCommand:=TextListCommand+'<HR> <center> Обнуление регистров </center><br><br>'; | |
XOR__EAX;XOR__ECX;XOR__EDX;XOR__ESI; | |
TextListCommand:=TextListCommand+'<HR> <center> Заполнение регистров </center><br><br>'; | |
MOV__EAX(0);MOV__ECX(0);MOV__EDX(0);MOV__ESI(0); | |
TextListCommand:=TextListCommand+'<HR> <center> Заполнение регистров из памяти </center><br><br>'; | |
MOV__EAX_AW(0);MOV__EAX_AB(0); | |
MOV__ECX_AW(0);MOV__ECX_AB(0); | |
MOV__EDX_AW(0);MOV__EDX_AB(0); | |
TextListCommand:=TextListCommand+'<HR> <center> Сохранение знаяения регистров В память </center><br><br>'; | |
Mov_A_EAXW(0);Mov_A_EAXB(0); | |
MOV_A_ECXW(0);MOV_A_ECXB(0); | |
Mov_A_EDXW(0);Mov_A_EDXB(0); | |
TextListCommand:=TextListCommand+'<HR> <center> Запись в память по адресу в регистре </center><br><br>'; | |
Mov_AEAX_W(0);Mov_AEAX_B(0); | |
Mov_AECX_W(0);Mov_AECX_B(0); | |
Mov_AEDX_W(0);Mov_AEDX_B(0); | |
TextListCommand:=TextListCommand+'<HR> <center> Условые переходы подпрограммы </center><br><br>'; | |
CMP__EAX_EDX; | |
JA___('АДРЕС'); | |
JAE__('АДРЕС'); | |
JE___('АДРЕС'); | |
JNE__('АДРЕС'); | |
JB___('АДРЕС'); | |
JBE__('АДРЕС'); | |
JMP__('АДРЕС'); | |
RET__; | |
CAL__('АДРЕС'); | |
CAL__(0); | |
TextListCommand:=TextListCommand+'<HR> <center> Арифметика </center><br><br>'; | |
SUB__ESP(0);// Уменьшает стек | |
ADD__ESP(0);// Увеличивает стек | |
SUB__EAX_EDX; | |
SUB__EAX_ECX; | |
ADD__EAX_EDX; | |
ADD__ESI(0); | |
ADD__EAX_ESP; | |
TextListCommand:=TextListCommand+'<HR> <center> Различные перемещения между регистрами </center><br><br>'; | |
// Различные перемещения между регистрами | |
MOV__EAX_AESI; | |
MOV__ECX_AESI; | |
MOV__EDX_AESI; | |
//-------------------------------------------------------- | |
MOV_AESI_EAX; | |
MOV_AESI_ECX; | |
MOV_AESI_EDX; | |
MOV_AESI_AL; | |
MOV_AESI_CL; | |
MOV_AESI_DL; | |
MOV_AESI_W(0); | |
MOV_AESI_B(0); | |
//-------------------------------------------------------- | |
MOV__ESP_EAX; | |
MOV__ESI_ESP; | |
MOV__ESI_EAX; | |
MOV__ESI_EDX; | |
MOV__EDX_EAX; | |
Mov__EAX_AEAX; | |
Mov__EDX_AEDX; | |
MOV_AEAX_EDX; | |
MOV_AEAX_DL ; | |
Mov__AL_DL; | |
Mov__AL_Dh; | |
Mov__AH(0); | |
Mov__CH(0); | |
Mov__DH(0); | |
end; | |
end; | |
{$ENDIF} | |
{ Кроплатформенные комманды } {$IFDEF Tim} | |
function ATRA(a:String):String; | |
var | |
rez:String; | |
begin | |
if a[1]='@' | |
then rez:='@'+IntToStr(LPERS.RA(a)) | |
else Rez:=IntToStr(AdrPer(a)); | |
ATRA:=Rez; | |
end; | |
//------------------------------------------------------------------------------ | |
procedure O_LOA__EAX(a:string);// Оригинальная загрука регистра Original | |
begin | |
if a[1]='@' then | |
begin | |
MOV__ESI_ESP; | |
ADD__ESI(LPERS.RA(a)+ADDSP);//ADDSP:=2;ADDSP:=4; | |
MOV__EAX_AESI; | |
end else MOV__EAX_AW(AdrPer(a));// загружает адрес обычной переменной | |
end; | |
procedure O_LOA__EDX(a:string); | |
begin | |
if a[1]='@' then | |
begin | |
MOV__ESI_ESP; | |
ADD__ESI(LPERS.RA(a)+ADDSP); | |
MOV__EDX_AESI; | |
end else MOV__EDX_AW(AdrPer(a)); | |
end; | |
procedure O_LOA__ECX(a:string); | |
begin | |
if a[1]='@' then | |
begin | |
MOV__ESI_ESP; | |
ADD__ESI(LPERS.RA(a)+ADDSP); | |
MOV__ECX_AESI; | |
end else MOV__ECX_AW(AdrPer(a)); | |
end; | |
procedure O_SAV__EAX(a:string); | |
begin | |
if a[1]='@' then | |
begin | |
MOV__ESI_ESP; | |
ADD__ESI(LPERS.RA(a)+ADDSP); | |
MOV_AESI_EAX; | |
end else MOV_A_EAXW(AdrPer(a)); | |
end; | |
procedure O_SAV__EDX(a:string); | |
begin | |
if a[1]='@' then | |
begin | |
MOV__ESI_ESP; | |
ADD__ESI(LPERS.RA(a)+ADDSP); | |
MOV_AESI_EDX; | |
end else MOV_A_EDXW(AdrPer(a)); | |
end; | |
procedure O_SAV__ECX(a:string); | |
begin | |
if a[1]='@' then | |
begin | |
MOV__ESI_ESP; | |
ADD__ESI(LPERS.RA(a)+ADDSP); | |
MOV_AESI_ECX; | |
end else MOV_A_ECXW(AdrPer(a)); | |
end; | |
//------------------------------------------------------------------------------ | |
procedure LOA__EAX(a:string); | |
var | |
m:String; | |
begin | |
M:='PR'+IntToStr(MUka); | |
if SFuns.Fin('LOA__EAX'+ATRA(a))=nil then | |
begin JMP__(m);SeFu('LOA__EAX'+ATRA(a));O_LOA__EAX(a);Ret__;end; | |
SeLa(m);Cal__('LOA__EAX'+ATRA(a)); | |
end; | |
procedure LOA__EAX(a:LongWord);// загружает В ригистр EAX число | |
begin | |
MOV__EAX(a); | |
end; | |
procedure LOA__EDX(a:string); | |
var | |
m:String; | |
begin | |
M:='PR'+IntToStr(MUka); | |
if SFuns.Fin('LOA__EDX'+ATRA(a))=nil then | |
begin JMP__(m);SeFu('LOA__EDX'+ATRA(a));O_LOA__EDX(a);Ret__;end; | |
SeLa(m); Cal__('LOA__EDX'+ATRA(a)); | |
end; | |
procedure LOA__EDX(a:LongWord);// загружает в регистр EDX число | |
begin | |
MOV__EDX(a); | |
end; | |
procedure LOA__ECX(a:string); | |
var | |
m:String; | |
begin | |
M:='PR'+IntToStr(MUka); | |
if SFuns.Fin('LOA__ECX'+ATRA(a))=nil then | |
begin JMP__(m);SeFu('LOA__ECX'+ATRA(a));O_LOA__ECX(A);Ret__;end; | |
SeLa(m);Cal__('LOA__ECX'+ATRA(a)); | |
end; | |
procedure LOA__ECX(a:LongWord);// загружает в регистр ECX число | |
begin | |
MOV__ECX(a); | |
end; | |
procedure SAV__EAX(a:string); | |
var | |
m:String; | |
begin | |
M:='PR'+IntToStr(MUka); | |
if SFuns.Fin('SAV__EAX'+ATRA(a))=nil then | |
begin JMP__(m);SeFu('SAV__EAX'+ATRA(a));O_SAV__EAX(a);Ret__;end; | |
SeLa(m); Cal__('SAV__EAX'+ATRA(a)); | |
end; | |
procedure SAV__EDX(a:string); | |
var | |
m:String; | |
begin | |
M:='PR'+IntToStr(MUka); | |
if SFuns.Fin('SAV__EDX'+ATRA(a))=nil then | |
begin JMP__(m);SeFu('SAV__EDX'+ATRA(a));O_SAV__EDX(a);Ret__;end; | |
SeLa(m); Cal__('SAV__EDX'+ATRA(a)); | |
end; | |
procedure SAV__ECX(a:string); | |
var | |
m:String; | |
begin | |
M:='PR'+IntToStr(MUka); | |
if SFuns.Fin('SAV__ECX'+ATRA(a))=nil then | |
begin JMP__(m);SeFu('SAV__ECX'+ATRA(a));O_SAV__ECX(a);Ret__;end; | |
SeLa(m); Cal__('SAV__ECX'+ATRA(a)); | |
end; | |
//------------------------------------------------------------------------------ | |
Procedure REA_W(a,b:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('REA_W'+ATRA(a)+'_'+ATRA(b))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('REA_W'+ATRA(a)+'_'+ATRA(b)); | |
Pop__EDX; | |
//------------ | |
LOA__EAX(b); | |
MOV__EAX_AEAX; | |
SAV__EAX(A); | |
//------------ | |
Push_EDX; | |
Ret__; | |
SeLa(m); Cal__('REA_W'+ATRA(a)+'_'+ATRA(b)); | |
end else Cal__('REA_W'+ATRA(a)+'_'+ATRA(b)); | |
end; | |
Procedure REA_B(a,b:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('REA_B'+ATRA(a)+'_'+ATRA(b))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('REA_B'+ATRA(a)+'_'+ATRA(b)); | |
Pop__ECX; | |
//------------ | |
LOA__EDX(b); | |
MOV__EDX_AEDX; | |
XOR__EAX; | |
MOV__AL_DL; | |
SAV__EAX(A); | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('REA_B'+ATRA(a)+'_'+ATRA(b)); | |
end else Cal__('REA_B'+ATRA(a)+'_'+ATRA(b)); | |
end; | |
Procedure WRI_W(a,b:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('WRI_W'+ATRA(a)+'_'+ATRA(b))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('WRI_W'+ATRA(a)+'_'+ATRA(b)); | |
Pop__ECX; | |
//------------ | |
LOA__EAX(a); | |
LOA__EDX(b); | |
MOV_AEAX_EDX; | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('WRI_W'+ATRA(a)+'_'+ATRA(b)); | |
end else Cal__('WRI_W'+ATRA(a)+'_'+ATRA(b)); | |
end; | |
Procedure WRI_B(a,b:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('WRI_B'+ATRA(a)+'_'+ATRA(b))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('WRI_B'+ATRA(a)+'_'+ATRA(b)); | |
Pop__ECX; | |
//------------ | |
LOA__EAX(a); | |
LOA__EDX(b); | |
MOV_AEAX_DL; | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('WRI_B'+ATRA(a)+'_'+ATRA(b)); | |
end else Cal__('WRI_B'+ATRA(a)+'_'+ATRA(b)); | |
end; | |
Procedure WRI_W(a:String;b:LongWord); | |
begin | |
LOA__EAX(a); | |
MOV_AEAX_W(b); | |
end; | |
Procedure WRI_B(a:String;b:Byte); | |
begin | |
LOA__EAX(a); | |
MOV_AEAX_B(b); | |
end; | |
//------------------------------------------------------------------------------ | |
Procedure PRI__(a,b:String); | |
begin | |
LOA__EAX(B); | |
SAV__EAX(a); | |
end; | |
Procedure PRI__(a:String;B:Longword); | |
begin | |
MOV__EAX(b); | |
SAV__EAX(a); | |
end; | |
// Арифметика ------------------------------------------------------------------ | |
procedure INC__(a:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('INC__'+ATRA(a))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('INC__'+ATRA(a)); | |
Pop__ECX; | |
//------------ | |
LOA__EAX(a); | |
INC__EAX; | |
SAV__EAX(a); | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('INC__'+ATRA(a)); | |
end else Cal__('INC__'+ATRA(a)); | |
end; | |
procedure INC_W(a:String); | |
begin | |
LOA__EAX(a); | |
if TrCo=80 then begin MOV__EDX(2);ADD__EAX_EDX;end else | |
if TrCo=16 then begin MOV__EDX(2);ADD__EAX_EDX;end else | |
if TrCo=17 then begin MOV__EDX(2);ADD__EAX_EDX;end else | |
if TrCo=32 then begin MOV__EDX(4);ADD__EAX_EDX;end else | |
if TrCo=33 then begin MOV__EDX(4);ADD__EAX_EDX;end else | |
if TrCo=34 then begin MOV__EDX(4);ADD__EAX_EDX;end else | |
if TrCo=64 then begin MOV__EDX(8);ADD__EAX_EDX;end else | |
InfoMes(('Для данной платформы не описано INC_W')); | |
SAV__EAX(a); | |
end; | |
procedure DEC__(a:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('DEC__'+ATRA(a))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('DEC__'+ATRA(a)); | |
Pop__ECX; | |
//------------ | |
LOA__EAX(a); | |
DEC__EAX; | |
SAV__EAX(a); | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('DEC__'+ATRA(a)); | |
end else Cal__('DEC__'+ATRA(a)); | |
end; | |
procedure ADD__(a,b:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('ADD__'+ATRA(a)+'_'+ATRA(b))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('ADD__'+ATRA(a)+'_'+ATRA(b)); | |
Pop__ECX; | |
//------------ } | |
LOA__EAX(a); | |
LOA__EDX(b); | |
ADD__EAX_EDX; | |
SAV__EAX(a); | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('ADD__'+ATRA(a)+'_'+ATRA(b)); | |
end else Cal__('ADD__'+ATRA(a)+'_'+ATRA(b)); | |
end; | |
procedure ADD__(a:String;b:LongWord); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('ADD__'+ATRA(a)+'_L'+IntToStr(b))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('ADD__'+ATRA(a)+'_L'+IntToStr(b)); | |
Pop__ECX; | |
//------------ | |
LOA__EAX(a); | |
MOV__EDX(b); | |
ADD__EAX_EDX; | |
SAV__EAX(a); | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('ADD__'+ATRA(a)+'_L'+IntToStr(b)); | |
end else Cal__('ADD__'+ATRA(a)+'_L'+IntToStr(b)); | |
end; | |
procedure SUB__(a,b:String); | |
var | |
m:String; | |
begin | |
if SFuns.Fin('SUB__'+ATRA(a)+'_'+ATRA(b))=nil then | |
begin | |
M:='PR'+IntToStr(MUka); | |
JMP__(m); | |
SeFu('SUB__'+ATRA(a)+'_'+ATRA(b)); | |
Pop__ECX; | |
//------------ | |
LOA__EAX(a); | |
LOA__EDX(b); | |
SUB__EAX_EDX; | |
SAV__EAX(a); | |
//------------- | |
Push_ECX; | |
Ret__; | |
SeLa(m); Cal__('SUB__'+ATRA(a)+'_'+ATRA(b)); | |
end else Cal__('SUB__'+ATRA(a)+'_'+ATRA(b)); | |
end; | |
procedure SUB__(a:String;b:LongWord); | |
begin | |
LOA__EAX(a); | |
MOV__EDX(b); | |
SUB__EAX_EDX; | |
SAV__EAX(a); | |
end; | |
// Условные переходы вызов подпрограмм ----------------------------------------- | |
procedure BOL__(a,b,c:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
If TrCo=80 Then begin INC__EDX;CMP__EAX_EDX;JAE__(c);end else | |
If TrCo=16 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=17 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=32 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=33 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=34 Then begin CMP__EAX_EDX;JA___(c);end else | |
InfoMes(('Коммангда BOL__ ДЛя платформы не описана ')); | |
end; | |
procedure BOL__(a:String;b:LongWord;c:String); | |
begin | |
LOA__EAX(a); | |
MOV__EDX(b); | |
If TrCo=80 Then begin INC__EDX;CMP__EAX_EDX;JAE__(c);end else | |
If TrCo=16 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=17 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=32 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=33 Then begin CMP__EAX_EDX;JA___(c);end else | |
If TrCo=34 Then begin CMP__EAX_EDX;JA___(c);end else | |
InfoMes(('Коммангда BOL__ ДЛя платформы не описана ')); | |
end; | |
procedure BRA__(a,b,c:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
CMP__EAX_EDX; | |
JAE__(c); | |
end; | |
procedure BRA__(a:String;b:LongWord;c:String); | |
begin | |
LOA__EAX(a); | |
MOV__EDX(b); | |
CMP__EAX_EDX; | |
JAE__(c); | |
end; | |
procedure RAV__(a,b,c:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
CMP__EAX_EDX; | |
JE___(c); | |
end; | |
procedure RAV__(a:String;b:LongWord;c:String); | |
begin | |
LOA__EAX(a); | |
MOV__EDX(b); | |
CMP__EAX_EDX; | |
JE___(c); | |
end; | |
procedure NRA__(a,b,c:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
CMP__EAX_EDX; | |
JNE__(c); | |
end; | |
procedure NRA__(a:String;b:LongWord;c:String); | |
begin | |
LOA__EAX(a); | |
MOV__EDX(b); | |
CMP__EAX_EDX; | |
JNE__(c); | |
end; | |
procedure MEN__(a,b,c:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
If TrCo=80 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=16 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=17 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=32 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=33 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=34 then begin CMP__EAX_EDX;JB___(c);end else | |
InfoMes(('Коммангда MEN__ ДЛя платформы не описана ')); | |
end; | |
procedure MEN__(a:String;b:LongWord;c:String); | |
begin | |
LOA__EAX(a); | |
MOV__EDX(b); | |
If TrCo=80 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=16 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=17 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=32 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=33 then begin CMP__EAX_EDX;JB___(c);end else | |
If TrCo=34 then begin CMP__EAX_EDX;JB___(c);end else | |
InfoMes(('Коммангда MEN__ ДЛя платформы не описана ')); | |
end; | |
procedure MRA__(a,b,c:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
If TrCo=80 then begin CMP__EAX_EDX;JB___(c);JE___(c);end else | |
If TrCo=16 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=17 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=32 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=33 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=34 then begin CMP__EAX_EDX;JBE__(c);end else | |
InfoMes(('Коммангда MRA__ ДЛя платформы не описана ')); | |
end; | |
procedure MRA__(a:String;b:LongWord;c:String); | |
begin | |
LOA__EAX(a); | |
MOV__EDX(b); | |
If TrCo=80 then begin CMP__EAX_EDX;JB___(c);JE___(c);end else | |
If TrCo=16 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=17 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=32 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=33 then begin CMP__EAX_EDX;JBE__(c);end else | |
If TrCo=34 then begin CMP__EAX_EDX;JBE__(c);end else | |
InfoMes(('Коммангда MRA__ ДЛя платформы не описана ')); | |
end; | |
{$ENDIF} | |
{ Секция для работы с Строками } {$IFDEF Tim} | |
Function DelRAs(s:Ansistring):Ansistring; | |
var | |
f,f2:Longint; | |
rez:Ansistring; | |
begin | |
f:=Length(s); | |
if f=0 Then InfoMes('Имя файла указано не верно пустоая строка DelRA.UStr'); | |
While (s[f]<>'.') and (f>0) do dec(f); | |
Dec(f); | |
for f2:=1 to f do | |
REz:=rez+s[f2]; | |
DelRAs:=REz; | |
end; | |
Function TexToInt(s:String):Longword; | |
begin | |
TexToInt:=HexToInt(IntToHex8(Ord(s[1]))+IntToHex8(Ord(s[2]))); | |
end; | |
Function KolSlov(s:Ansistring;r:char):Longint; | |
var | |
f,rez:Longint; | |
begin | |
if length(s)=0 then rez:=0 else rez:=1; | |
for f:=1 to Length(s) do | |
if s[f]=r Then REz:=rez+1; | |
KolSlov:=rez; | |
end; | |
Function SlovoN(s:Ansistring;r:char;n:Longint):Ansistring; | |
var | |
f,ns,ls:Longint; | |
rez:Ansistring; | |
begin | |
ns:=1; | |
rez:=''; | |
ls:=length(s); | |
f:=1; | |
while (NS<=N)and(f<=ls) do | |
begin | |
if s[f]=r then ns:=ns+1 else | |
if ns=n then rez:=rez+s[f]; | |
f:=f+1; | |
end; | |
SlovoN:=rez; | |
end; | |
function est(s1,s2:ansistring):boolean; | |
var | |
rez:boolean; | |
f:longint; | |
begin | |
rez:=false; | |
for f:=1 to kolslov(s1,',') do | |
if slovoN(s1,',',f)=s2 then | |
begin | |
rez:=true; | |
break; | |
end; | |
est:=rez; | |
end; | |
Function Dopolnit(s:Ansistring;c:Char;k:byte):Ansistring; | |
var | |
f:Longint; | |
rez:Ansistring; | |
begin | |
rez:=s; | |
for f:=length(s) to k do | |
rez:=c+rez; | |
Dopolnit:=rez; | |
end; | |
Function StrToCifra(s:String):REal; | |
var | |
f:Longint; | |
begin | |
for f:=1 to length(s) do | |
if s[f]='.' Then s[f]:=','; | |
StrToCifra:=StrToFloat(s); | |
end; | |
function ReadCif(var UK,LE:Longint;S:Ansistring):Ansistring;// Читает цифру из строки если не удаеться возвращает пустую строку | |
var | |
rez:Ansistring; | |
kt:Byte; | |
begin | |
kt:=0; | |
rez:=''; | |
if (UK<=LE) and((s[UK]>='0') and (s[UK]<='9')) Then | |
while (UK<=LE) and (((s[UK]>='0') and (s[UK]<='9'))or(s[UK]='.'))and (kt<2) do | |
begin | |
if s[UK]='.' then kt:=kt+1; | |
if kt<=1 then | |
begin | |
rez:=rez+s[UK]; | |
UK:=UK+1; | |
end; | |
end; | |
ReadCif:=rez; | |
end; | |
Function EtoCif(uk,Le:Longint;s:Ansistring):Boolean;// Проверяет цифра ли это в строке | |
var | |
rez:Boolean; | |
begin | |
if ReadCif(uk,le,s)<>'' Then Rez:=true else rez:=false; | |
EtoCif:=rez; | |
end; | |
Function CifraFloat(s:Ansistring):Real;// Преобразует строку в цифру в случае если это цифра | |
var | |
uk,le:Longint; | |
REz:Real; | |
begin | |
rez:=0;uk:=1;le:=length(s); | |
If EtoCif(uk,le,s) then rez:=StrToCifra(REadCif(uk,le,s)); | |
CifraFloat:=rez; | |
end; | |
function ReadKav(var UK,LE:Longint;S:Ansistring):Ansistring;//Читает строку в кавычках ' из строки если не удаеться возвращает пустую строку | |
var | |
rez:Ansistring; | |
begin | |
rez:=''; | |
if (UK<=LE) and ((s[UK]=chr(39)) or (s[UK]='"')) Then | |
begin | |
UK:=UK+1; | |
while (UK<=LE)and (s[UK]<>chr(39)) and (s[UK]<>'"') do | |
begin | |
rez:=rez+s[UK]; | |
UK:=UK+1; | |
end; | |
UK:=UK+1; | |
end; | |
ReadKav:=rez; | |
end; | |
Function EtoKav(uk,Le:Longint;s:Ansistring):Boolean;// ПРоверяет идет ли следующим в строке строка в кавычках ' | |
var | |
rez:Boolean; | |
begin | |
if s[uk]=chr(39) Then Rez:=true else rez:=false; | |
EtoKav:=rez; | |
end; | |
function ReadRem(var UK,LE:Longint;S:Ansistring):Ansistring;// Читает коментарий мз строки в случае не удачи возвращает пустую строку | |
var | |
rez:Ansistring; | |
begin | |
rez:=''; | |
if (UK<LE) and (s[uk]+s[uk+1]='/*') then | |
begin | |
UK:=UK+2; | |
While (UK<LE) and (s[uk]+s[uk+1]<>'*/') do | |
begin | |
rez:=rez+s[uk]; | |
uk:=uk+1; | |
end; | |
uk:=uk+2; | |
end else | |
if (UK<LE) and (s[uk]+s[uk+1]='//') then | |
begin | |
UK:=UK+2; | |
While (UK<=LE) and (s[uk]<>Chr(13)) do | |
begin | |
rez:=rez+s[uk]; | |
uk:=uk+1; | |
end; | |
uk:=uk+1; | |
end; | |
ReadRem:=rez; | |
end; | |
Function EtoRem(uk,Le:Longint;s:Ansistring):Boolean;// проверяет идет ли далее в строке коментарий | |
var | |
rez:Boolean; | |
begin | |
rez:=false; | |
if (uk<le) then | |
if (s[uk]+s[uk+1]='/*') or (s[uk]+s[uk+1]='//') Then Rez:=true; | |
EtoRem:=rez; | |
end; | |
function ReadZn2(var UK,LE:Longint;S:Ansistring):Ansistring;// Читает Двойной знак из строки в случае неудачи возвращает пустую строку | |
var | |
rez,r:Ansistring; | |
NP:Longint; | |
begin | |
r:=':=<=>=<>!=>><<'; | |
rez:=''; | |
NP:=1; | |
If UK+1<=LE Then | |
While (rez='') and (Length(r)>=NP) do | |
if (s[UK]=r[np]) and (s[UK+1]=r[np+1]) then | |
begin | |
rez:=s[UK]+s[uk+1]; | |
UK:=UK+2; | |
end else Np:=Np+2; | |
ReadZn2:=rez; | |
end; | |
Function EtoZn2(uk,Le:Longint;s:Ansistring):Boolean;// Определяет идет ли далее Двойной знак | |
var | |
rez:Boolean; | |
begin | |
if ReadZn2(uk,le,s)<>'' Then Rez:=true else rez:=false; | |
EtoZn2:=rez; | |
end; | |
function ReadZn1(var UK,LE:Longint;S:Ansistring):Ansistring;// Читает одинарный знак из строки в случае неудачи возвращает пустую строку | |
var | |
rez,r:Ansistring; | |
NP:Longint; | |
begin | |
R:='+-/\*()[]><=:{}'; | |
rez:=''; | |
NP:=1; | |
If UK<=LE Then | |
While (rez='') and (Length(r)>=NP) do | |
if (s[UK]=r[np]) then | |
begin | |
rez:=s[UK]; | |
UK:=UK+1; | |
end else Np:=Np+1; | |
ReadZn1:=rez; | |
end; | |
Function EtoZn1(uk,Le:Longint;s:Ansistring):Boolean;// Определяет идет ли далее одинарный знак | |
var | |
rez:Boolean; | |
begin | |
if ReadZn1(uk,le,s)<>'' Then Rez:=true else rez:=false; | |
EtoZn1:=rez; | |
end; | |
Function Predel(C:Char;R:Ansistring):Boolean;// Проверки Вхождления Символа в определенные пределы | |
var | |
rez:Boolean; | |
Np:Longint; | |
begin | |
NP:=1;rez:=False; | |
While (NP<Length(R)) and (rez=False) do | |
if (C>=R[NP]) AnD (C<=R[NP+1]) | |
Then rez:=true | |
else NP:=NP+2; | |
Predel:=rez; | |
end; | |
function Readope(var UK,LE:Longint;S:Ansistring):Ansistring;// Читает оператор из строки | |
var | |
rez:Ansistring; | |
begin | |
rez:=''; | |
if (UK<LE) and (predel(s[UK],'аяАЯazAZёЁ')) Then | |
while (UK<LE) and (predel(s[uk],'аяАЯёёЁЁazAZ__09')) do | |
begin | |
rez:=rez+s[uk]; | |
Uk:=Uk+1; | |
end; | |
Readope:=rez; | |
end; | |
Function EtoOpe(uk,Le:Longint;s:Ansistring):Boolean;// ПРоверяет идет ли следующим в строке оператор в случае неудачи возвращает пустуюстроку | |
var | |
rez:Boolean; | |
begin | |
if Readope(uk,le,s)<>'' Then Rez:=true else rez:=false; | |
EtoOpe:=rez; | |
end; | |
//============================================================================== | |
//============================================================================== | |
//============================================================================== | |
procedure Del__Sim(s,c:String); // Удаляет в строке символ | |
begin | |
Loa__EAX(s); | |
Loa__EDX(c); | |
CAL__('DELSimvol'); | |
end; | |
Procedure Cre__Str(a:String); // Создает новую строку | |
begin | |
cal__('GetString'); | |
SAV__EAX(a); | |
end; | |
procedure Add__Sim(s,c:String); // ПРисоеденяет к строке символ | |
begin | |
LOA__EAX(s); | |
LOA__EDX(c); | |
CAL__('AsiString'); | |
end; | |
procedure Add__Sim(s:String;c:Byte); // ПРисоеденяет к строке символ | |
begin | |
LOA__EAX(s); | |
LOA__EDX(c); | |
CAL__('AsiString'); | |
end; | |
procedure Del__Sim(s:String;C:Byte); // Удаляет в строке символ | |
begin | |
Loa__EAX(s); | |
Loa__EDX(c); | |
CAL__('DELSimvol'); | |
end; | |
Procedure Cop__Str(a,b:String); // Копирует строку | |
begin | |
Loa__EAX(a); | |
Loa__EDX(b); | |
CAL__('CopString'); | |
end; | |
Procedure Fre__Str(a:String); // Освобождает строку | |
begin | |
Loa__EAX(a); | |
cal__('FreString'); | |
end; | |
Procedure DelSimvol;// EAX:Строка EDX Символ Возвращает новую обработаную строку Удаляет указаный символ из строки | |
begin | |
BeginProcedure('DelSimvol'); | |
Sav__EAX('@STR'); // Сторка из котрой удаляем символ | |
Sav__EDX('@DSI'); // Удаляемый сивол | |
Cre__Str('@REZ'); // Строка результат | |
REA_B('@LEN','@STR');// Читаем длинну строки | |
Pri__('@UKA','@STR');// Создаем указатель для считтывания строки | |
INC__('@UKA'); | |
SeLa('CIK'); RAV__('@LEN',0,'ECIK'); | |
REA_B('@SIM','@UKA'); | |
rav__('@SIM','@DSI','NEX'); | |
ADD__SIM('@REZ','@SIM'); | |
SeLa('NEX'); DEC__('@LEN');INC__('@UKA'); | |
JMP__('CIK'); | |
SeLa('ECIK'); | |
Cop__Str('@STR','@Rez'); | |
Fre__Str('@REz'); | |
EndProcedure; | |
end; | |
procedure Pos__Sim(r,s,c:String); // Ищит в строке символ и возвращает позицию если есть | |
begin | |
Loa__EAX(s); | |
Loa__EDX(c); | |
CAL__('PosSimvol'); | |
SAV__EAX(r); | |
end; | |
procedure POs__Sim(r,s:String;c:Byte); // Ищит в строке символ и возвращает позицию если есть | |
begin | |
Loa__EAX(s); | |
Loa__EDX(c); | |
CAL__('PosSimvol'); | |
SAV__EAX(r); | |
end; | |
Procedure PosSimvol;// EAX:Строка EDX Символ Возвращает новую обработаную строку Удаляет указаный символ из строки | |
begin | |
BeginProcedure('POSSimvol'); | |
Sav__EAX('@STR'); // Сторка В котрой ищим смвол | |
Sav__EDX('@DSI'); // Искомый символ | |
REA_B('@LEN','@STR');// Читаем длинну строки | |
Pri__('@UKA','@STR');// Создаем указатель для считтывания строки | |
Pri__('@END','@STR'); | |
ADD__('@END','@LEN'); | |
INC__('@UKA'); | |
RAV__('@LEN',0,'NET'); | |
SeLa('CIK'); BOL__('@UKA','@END','NET'); | |
REA_B('@SIM','@UKA'); | |
rav__('@SIM','@DSI','EST'); | |
INC__('@UKA'); | |
JMP__('CIK'); | |
SeLa('EST'); | |
PRI__('@REZ','@UKA'); | |
SUB__('@REZ','@STR'); | |
JMP__('VIHOD'); | |
SeLa('NET'); PRI__('@REZ',0); | |
SeLa('VIHOD'); LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
Procedure Sim__NOM(c,s,n:String); // Возвращает символ из строки | |
Begin | |
PRI__('@SIMNOMUK',S); | |
ADD__('@SIMNOMUK',N); | |
REA_B(C,'@SIMNOMUK'); | |
end; | |
Procedure Sim__SET(s,n,c:String); // Возвращает символ из строки | |
begin | |
PRI__('@SIMNOMUK',S); | |
ADD__('@SIMNOMUK',N); | |
Wri_B('@SIMNOMUK',C); | |
end; | |
Procedure Sim__SET(s,n:String;C:Byte); // Возвращает символ из строки | |
begin | |
PRI__('@SIMNOMUK',S); | |
ADD__('@SIMNOMUK',N); | |
Wri_B('@SIMNOMUK',C); | |
end; | |
Procedure Tip__Str(t,s:String); // Определяет тип строки если цифра то 1 | |
Begin | |
LOA__EAX(s); | |
cal__('TipString'); | |
SAV__EAX(t); | |
end; | |
Procedure LEn__Str(L,S:String); // Oпределяет Длину строки | |
Begin | |
REA_B(l,s); | |
end; | |
procedure Add__SSI(s,c:String); // Добавляет символ в начало строки | |
Begin | |
Loa__EAX(s); | |
Loa__EDX(C); | |
Cal__('ASSString'); | |
end; | |
procedure Add__SSI(s:String;C:byte); // Добавляет символ в начало строки | |
Begin | |
Loa__EAX(s); | |
Loa__EDX(C); | |
Cal__('ASSString'); | |
end; | |
Procedure Rav__Str(a,b,c:String); // eax: строка 1 edx:строка 2 возврвщает | |
begin | |
Loa__EAX(a); | |
Loa__EDX(b); | |
CAL__('RavString'); | |
SAV__EAX('@QWE_RAV'); | |
RAV__('@QWE_RAV',1,C); | |
end; | |
Procedure Bol__Str(a,b,c:String); // eax: строка 1 edx:строка 2 возврвщает | |
begin | |
Loa__EAX(a); | |
Loa__EDX(b); | |
CAL__('BolString'); | |
SAV__EAX('@QWE_BOL'); | |
RAV__('@QWE_BOL',1,C); | |
end; | |
Procedure Men__Str(a,b,c:String); // eax: строка 1 edx:строка 2 возврвщает | |
begin | |
Loa__EAX(a); | |
Loa__EDX(b); | |
CAL__('MenString'); | |
SAV__EAX('@QWE_Men'); | |
RAV__('@QWE_Men',1,C); | |
end; | |
Procedure NRa__Str(a,b,c:String); // eax: строка 1 edx:строка 2 возврвщает | |
begin | |
Loa__EAX(a); | |
Loa__EDX(b); | |
CAL__('RavString'); | |
SAV__EAX('@QWE_RAV'); | |
RAV__('@QWE_RAV',0,C); | |
end; | |
Procedure Kol__Str(s,r,k:String); // Определяет количество Слов в строке | |
begin | |
LOA__EAX(s); | |
LOA__EDX(r); | |
CAL__('KolString'); | |
SAV__EAX(k); | |
end; | |
Procedure Slo__Str(s,n,r,rez:String); // Выделяет слово номер N из строки s с разделителм R | |
begin | |
LOA__EAX(s); | |
LOA__EDX(n); | |
LOA__ECX(r); | |
CAL__('SloString'); | |
SAV__EAX(rez); | |
end; | |
Procedure Vho__Str(Slo,spi,r,c:String);// ПРоверяет вхождение слова | |
begin | |
LOA__EAX(SLO); | |
LOA__EDX(SPI); | |
LOA__ECX(R); | |
CAL__('VhoString'); | |
SAV__EAX('@QWE_NOM'); | |
NRA__('@QWE_NOM',0,c); | |
end; | |
Procedure NVh__Str(Slo,spi,r,c:String);// ПРоверяет вхождение слова если не входит переход | |
begin | |
LOA__EAX(SLO); | |
LOA__EDX(SPI); | |
LOA__ECX(R); | |
CAL__('VhoString'); | |
SAV__EAX('@QWE_NOM'); | |
Rav__('@QWE_NOM',0,c); | |
end; | |
Procedure Add__Str(a,b:String); // Сложение строк | |
begin | |
LOA__EAX(A); | |
LOA__EDX(B); | |
CAl__('SumString'); | |
end; | |
procedure TipString; // ПРоцедура Определяет тип строки если цифра то 1 | |
begin | |
BeginProcedure('TipString'); | |
SAV__EAX('@STR'); | |
Len__Str('@L','@STR'); | |
PRI__('@KTO',0); | |
PRI__('@F',1); | |
RAV__('@L',0,'STROKA'); | |
Sim__Nom('@SIM','@STR','@F'); | |
NRA__('@SIM',Ord('-'),'NEX'); | |
INC__('@F'); | |
SeLa('NEX'); | |
SeLa('CIK'); BOL__('@F','@L','CIFRA'); | |
Sim__Nom('@SIM','@STR','@F'); | |
NRA__('@SIM',Ord('.'),'CIF'); | |
INC__('@KTO');// увеличиваем количсетво точек | |
BOL__('@KTO',1,'STROKA'); | |
INC__('@F'); | |
JMP__('CIK'); | |
SeLa('CIF'); | |
BOL__('@SIM',Ord('9'),'STROKA'); | |
MEN__('@SIM',Ord('0'),'STROKA'); | |
INC__('@F'); | |
JMP__('CIK'); | |
SeLa('STROKA');Pri__('@REZ',0); | |
JMP__('VIHOD'); | |
SeLa('Cifra'); Pri__('@REZ',1); | |
SeLa('VIHOD'); Loa__EAX('@REZ'); | |
EndProcedure; | |
end; | |
procedure GetString; // ПРоцедура создает Новую строку в памяти | |
begin | |
BeginProcedure('GetString'); | |
// Ищим свободное зерно | |
Pri__('@Fin','TrMe'); | |
SeLa('Cikl'); REa_b('@Del','@Fin'); | |
RAV__('@Del',0,'Nex'); | |
Add__('@FIN',Zerno); | |
JMP__('CIKL'); | |
SeLa('NEX'); // Создаем строку | |
SeLa('CrSt'); Wri_B('@Fin',1);INC__('@Fin'); // записываем что этот участок памяти вделен под строку | |
PRI__('@REZ','@Fin'); // Записываем адрес строки | |
Wri_B('@Fin',0); // Обнуляем длину строки | |
SeLa('VIHOD');Loa__EAX('@REZ'); // возвращаем результат | |
EndProcedure; | |
end; | |
procedure CrSt(N,Z:String); | |
begin | |
if TrCo=80 Then | |
begin | |
SePe('S_'+n);WrMwc8(Length(z));WrMwS(z);WrMwc8(0); | |
SePe(n);WrMw16(adrPer('S_'+n)); | |
end else | |
if TrCo=16 Then | |
begin | |
SePe('S_'+n);WrMwc8(Length(z));WrMwS(z);WrMwc8(0); | |
SePe(n);WrMw16(adrPer('S_'+n)); | |
end else | |
if TrCo=32 Then | |
begin | |
SePe('S_'+n);WrMwc8(Length(z));WrMwS(z);WrMwc8(0); | |
SePe(n);WrMw32(adrPer('S_'+n)); | |
end else | |
if TrCo=33 Then | |
begin | |
SePe('S_'+n);WrMwc8(Length(z));WrMwS(z);WrMwc8(0); | |
SePe(n);WrMw32(adrPer('S_'+n)); | |
end else | |
if TrCo=34 Then | |
begin | |
SePe('S_'+n);WrMwc8(Length(z));WrMwS(z);WrMwc8(0); | |
SePe(n);WrMw32(adrPer('S_'+n)); | |
end else | |
if TrCo=17 Then | |
begin | |
SePe('S_'+n);WrMwc8(Length(z));WrMwS(z);WrMwc8(0); | |
SePe(n);WrMw16(adrPer('S_'+n)); | |
end else | |
InfoMes('CrSt Не прописано создание переменной строки для данной платформы '); | |
end; | |
procedure OtSt(Z:String); | |
var | |
m:Ansistring; | |
begin | |
m:='OTL__'+IntToStr(MuKa); | |
JMP__(m); | |
WrMwO(z+chr(144)+chr(144)+chr(144)+chr(144)+chr(144)+chr(144)+chr(144)+chr(144)); | |
SeLa(m) | |
end; | |
procedure CopString; // ПРоцедура Копирует строку EAX<<EDX | |
begin | |
BeginProcedure('CopString'); | |
SAV__EAX('@ST1'); | |
SAV__EDX('@ST2'); | |
REA_B('@LEN','@ST2'); | |
WRI_B('@ST1','@LEN'); | |
SeLa('Cikl'); MRA__('@LEN',0,'VIHOD'); | |
INC__('@ST2'); | |
INC__('@ST1'); | |
DEC__('@LEN'); | |
REA_B('@SIM','@ST2'); | |
WRI_B('@ST1','@SIM'); | |
JMP__('Cikl'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
Procedure SumString; // Сложеие строк | |
Begin | |
BeginProcedure('SumString'); | |
SAV__EAX('@ST1'); | |
SAV__EDX('@ST2'); | |
Pri__('@UK1','@ST1'); | |
Pri__('@UK2','@ST2'); | |
REA_B('@LEN1','@UK1'); | |
REA_B('@LEN2','@UK2'); | |
Pri__('@LEN3','@LEN1'); | |
ADD__('@LEN3','@LEN2'); | |
WRI_B('@UK1','@LEN3'); | |
ADD__('@UK1','@LEN1'); | |
INC__('@UK1'); | |
INC__('@UK2'); | |
SeLa('@Cikl'); rav__('@LEN2',0,'VIHOD'); | |
REA_B('@SIM','@UK2'); | |
WRI_B('@UK1','@SIM'); | |
inc__('@UK1'); | |
inc__('@UK2'); | |
Dec__('@LEN2'); | |
JMP__('@CIKL'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
Procedure RavString; // eax: строка 1 edx:строка 2 возврвщает | |
begin | |
BeginProcedure('RavString'); | |
SAV__EAX('@ST1'); | |
SAV__EDX('@ST2'); | |
REA_B('@LEN1','@ST1'); | |
REA_B('@LEN2','@ST2'); | |
NRA__('@LEN1','@LEN2','NERAV'); | |
SeLa('Cikl'); MRA__('@LEN1',0,'RAVNO'); | |
INC__('@ST1'); | |
INC__('@ST2'); | |
DEC__('@LEN1'); | |
REA_B('@SIM1','@ST1'); | |
REA_B('@SIM2','@St2'); | |
NRA__('@SIM1','@SIM2','NERAV'); | |
JMP__('Cikl'); | |
SeLa('RAVNO');LOA__EAX(1);JMP__('VIHOD'); | |
SeLa('NERAV');LOA__EAX(0); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
Procedure MenString; // eax: строка 1 edx:строка 2 возврвщает | |
begin | |
BeginProcedure('MenString'); | |
SAV__EAX('@ST1'); | |
SAV__EDX('@ST2'); | |
Len__STR('@LEN','@ST1'); | |
Pri__('@U1','@ST1');Inc__('@U1'); | |
Pri__('@U2','@ST2');Inc__('@U2'); | |
SeLa('Cik'); RAV__('@LEN',0,'RAVNO'); | |
Rea_B('@SIM1','@U1'); | |
Rea_B('@SIM2','@U2'); | |
BOL__('@SIM1','@SIM2','BOLHE'); | |
MEN__('@SIM1','@SIM2','MENHE'); | |
DEC__('@LEN'); | |
INC__('@u1'); | |
INC__('@u2'); | |
JMP__('Cik'); | |
SeLa('BOLHE'); | |
SeLa('RAVNO');PRI__('@REZ',0); | |
JMP__('VIHOD'); | |
SeLa('MENHE');PRI__('@REZ',1); | |
SeLa('VIHOD');LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
Procedure BolString; // eax: строка 1 edx:строка 2 возврвщает | |
begin | |
BeginProcedure('BolString'); | |
SAV__EAX('@ST1'); | |
SAV__EDX('@ST2'); | |
Len__STR('@LEN','@ST1'); | |
Pri__('@U1','@ST1');Inc__('@U1'); | |
Pri__('@U2','@ST2');Inc__('@U2'); | |
SeLa('Cik'); RAV__('@LEN',0,'RAVNO'); | |
Rea_B('@SIM1','@U1'); | |
Rea_B('@SIM2','@U2'); | |
BOL__('@SIM1','@SIM2','BOLHE'); | |
MEN__('@SIM1','@SIM2','MENHE'); | |
DEC__('@LEN'); | |
INC__('@u1'); | |
INC__('@u2'); | |
JMP__('Cik'); | |
SeLa('Menhe'); | |
SeLa('RAVNO');PRI__('@REZ',0); | |
JMP__('VIHOD'); | |
SeLa('Bolhe');PRI__('@REZ',1); | |
SeLa('VIHOD');LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
Procedure AsiString; // Присоеденяет к строке символ EDX | |
begin | |
BeginProcedure('AsiString'); | |
SAV__EAX('@STR'); | |
SAV__EDX('@SIM'); | |
Rea_B('@LEN','@STR');INC__('@LEN'); | |
Wri_B('@STR','@LEN'); | |
ADD__('@LEN','@STR'); | |
Wri_B('@LEN','@SIM'); | |
SeLa('VIHOD'); | |
endProcedure; | |
end; | |
procedure ASSString; // Добавление символа в начало строки | |
begin | |
BeginProcedure('ASSString'); | |
SAV__EAX('@STR'); | |
SAV__EDX('@Sim'); | |
Cre__Str('@Rez'); | |
REA_B('@LEN','@STR'); | |
PRI__('@UKA','@STR'); | |
INC__('@UKA'); | |
Add__SIM('@REz','@SIM'); | |
SeLa('Cikl'); MRA__('@LEN',0,'ecik1'); | |
REA_B('@SIM','@UKA'); | |
Add__Sim('@REZ','@SIM'); | |
DEC__('@LEN'); | |
INC__('@UKA'); | |
JMP__('Cikl'); | |
sElA('Ecik1'); | |
Cop__Str('@Str','@Rez'); | |
Fre__Str('@REz'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
Procedure KolString; // Определяет количество слов с разделителем EDX; | |
begin | |
BeginProcedure('KolString'); | |
SAV__EAX('@STR'); | |
SAV__EDX('@RAZ'); | |
Pri__('@REZ',0); | |
REa_B('@LEN','@STR'); | |
RAV__('@LEN',0,'VIHOD'); | |
ADD__('@LEN','@STR'); | |
Pri__('@REZ',1); | |
Pri__('@UK','@STR');Inc__('@UK'); | |
SeLa('CIKL'); BOL__('@UK','@LEN','VIHOD'); | |
REA_B('@SIM','@UK'); | |
NRA__('@SIM','@RAZ','NEX1'); | |
INC__('@REZ'); | |
SeLa('NEX1'); | |
INC__('@UK'); | |
JMP__('CIKL'); | |
SeLa('VIHOD');Loa__EAX('@REZ'); | |
EndProcedure; | |
end; | |
Procedure SloString; // Возвращет слово с заданым номер EDX и Разделителем ECX | |
begin | |
BeginProcedure('SloString'); | |
SAV__EAX('@SL'); | |
SAV__EDX('@NS'); | |
SAV__ECX('@RA'); | |
PRI__('@RS',1); // читаемое слово | |
PRI__('@UK','@SL'); // указатель на символ | |
REA_B('@LE','@SL'); // Длина строки | |
ADD__('@LE','@SL'); | |
INC__('@UK'); | |
Cre__Str('@RE'); // Результат | |
SeLa('CIKL'); BOL__('@UK','@LE','VIHOD'); | |
REA_B('@SIM','@UK'); | |
NRA__('@SIM','@RA','NEX1'); | |
INC__('@RS'); | |
jmp__('nex2'); | |
SeLa('NEX1'); NRA__('@RS','@NS','NEX2'); | |
ADD__SIM('@RE','@SIM'); | |
SeLa('NEX2'); Inc__('@UK'); | |
JMP__('CIKL'); | |
SeLa('VIHOD');LOA__EAX('@Re'); | |
EndProcedure; | |
end; | |
Procedure VhoString; // ПРоверяет Наличие строки EAX В строке EDX с разделителем ECX | |
begin | |
BeginProcedure('VhoString'); | |
SAV__EAX('@EAX'); | |
SAV__EDX('@EDX'); | |
SAV__ECX('@ECX'); | |
PRI__('@AXT','@EAX'); | |
Kol__Str('@EDX','@ECX','@KOL');// Определяем количество слов | |
PRI__('@NS',1); // Устанавливаем номер слова 1 | |
SeLa('CIKL'); BOL__('@NS','@KOL','NET'); | |
Slo__Str('@EDX','@NS','@ECX','@SLO'); // Выделяем слово | |
Rav__STR('@AXT','@SLO','EST'); // если есть такое слово выход | |
Fre__STR('@SLO'); | |
inc__('@NS'); | |
JMP__('CIKL'); | |
SeLa('EST'); Fre__STR('@SLO'); | |
LOA__EAX('@NS'); | |
JMP__('VIHOD'); | |
SeLa('NET'); LOA__EAX(0); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
procedure FreString; // Освободает строку | |
Begin | |
BeginProcedure('FreString'); | |
SAV__EAX('@ADR');// тип элемента | |
DEC__('@ADR'); | |
WRI_B('@ADR',0); | |
EndProcedure; | |
end; | |
Procedure ReadCif; // EAX=UK EDX=SL | |
Begin | |
BeginProcedure('ReadCif'); | |
SAV__EAX('@UK'); | |
SAV__EDX('@SL'); | |
PRI__('@KTO',0); // Количество точек равно 0 | |
WRI_B('@SL',0); // Обнуляем длину слова | |
SeLa('CIKL'); | |
Rea_B('@SIM','@UK'); // читаем символ | |
RAV__('@SIM',0,'VIHOD'); // если строка кончилася нулевой символ | |
RAV__('@SIM',Ord('.'),'ATOCH');// Если точка анализируем наличие точек | |
MEN__('@SIM',Ord('0'),'VIHOD');// если строка кончилася нулевой символ | |
BOL__('@SIM',ord('9'),'VIHOD');// если строка кончилася нулевой символ | |
//----------------------------- | |
JMP__('EATOCH'); | |
SeLa('ATOCH'); RAV__('@KTO',1,'VIHOD'); // Если точка уже есть то выход | |
INC__('@KTO'); // Если точки нету указываем что точку прочитали в этой цифре | |
SeLa('EATOCH'); //----------------------------- | |
REA_B('@LSL','@SL'); // читаем длину слова | |
INC__('@LSL'); // Увеличиваем длину слова | |
WRI_B('@SL','@LSL'); // Записываем длину слова | |
INC__('@UK'); // Увеличиваем указтель на символ в программе | |
PRI__('@USL','@SL'); | |
ADD__('@USL','@LSL'); | |
WRI_B('@USL','@SIM'); // Записываем символ | |
JMP__('CIKL'); | |
SeLa('VIHOD'); LOA__EAX('@UK'); | |
Endprocedure; | |
end; | |
Procedure ReadOpe; // EAX=UK EDX=SL | |
Begin | |
BeginProcedure('ReadOpe'); | |
SAV__EAX('@UK'); | |
SAV__EDX('@SL'); | |
WRI_B('@SL',0); // Обнуляем длину слова | |
SeLa('CIKL'); | |
Rea_B('@SIM','@UK'); // читаем символ | |
RAV__('@SIM',0,'VIHOD'); // если строка кончилася нулевой символ | |
MEN__('@SIM',Ord('A'),'VIHOD');// если строка кончилася нулевой символ | |
BOL__('@SIM',ord('Z'),'VIHOD');// если строка кончилася нулевой символ | |
REA_B('@LSL','@SL'); // читаем длину слова | |
INC__('@LSL'); // Увеличиваем длину слова | |
WRI_B('@SL','@LSL'); // Записываем длину слова | |
INC__('@UK'); // Увеличиваем указтель на символ в программе | |
PRI__('@USL','@SL'); | |
ADD__('@USL','@LSL'); | |
WRI_B('@USL','@SIM'); // Записываем символ | |
JMP__('CIKL'); | |
SeLa('VIHOD'); LOA__EAX('@UK'); | |
Endprocedure; | |
end; | |
Procedure ReadZn1; // EAX=UK EDX=SL | |
Begin | |
BeginProcedure('ReadZn1'); | |
SAV__EAX('@UK'); | |
SAV__EDX('@SL'); | |
WRI_B('@SL',0); // Обнуляем длину слова | |
SeLa('CIKL'); | |
Rea_B('@SIM','@UK'); // читаем символ | |
RAV__('@SIM',0,'VIHOD'); // если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('+'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('-'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('*'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('/'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('('),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord(')'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('{'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('}'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('<'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('>'),'ZNAK');// если строка кончилася нулевой символ | |
Rav__('@SIM',Ord('='),'ZNAK');// если строка кончилася нулевой символ | |
JMP__('VIHOD'); | |
SeLa('ZNAK'); WRI_B('@SL',1); // ставим длину слова 1 | |
INC__('@SL'); // Увеличиваем указатель в слове | |
WRI_B('@SL','@SIM'); // Записываем символ | |
INC__('@UK'); // Увеличиваем указатель | |
SeLa('VIHOD'); LOA__EAX('@UK'); | |
Endprocedure; | |
end; | |
Procedure ReadZn2; // EAX=UK EDX=SL | |
Begin | |
BeginProcedure('ReadZn2'); | |
SAV__EAX('@UK'); | |
SAV__EDX('@SL'); | |
WRI_B('@SL',0); // Обнуляем длину слова | |
Rea_W('@SIM1','@UK'); // читаем символ | |
Pri__('@VUK','@UK'); | |
Rea_B('@SIM1','@VUK'); // читаем символ | |
INC__('@VUK'); | |
Rea_B('@SIM2','@VUK'); // читаем символ | |
NRA__('@SIM1',ORD(':'),'NEX1'); | |
NRA__('@SIM2',ORD('='),'NEX1'); | |
JMP__('ZNAK'); | |
SeLa('NEX1'); | |
JMP__('VIHOD'); | |
SeLa('ZNAk'); ADD__SIM('@SL','@SIM1'); | |
ADD__SIM('@SL','@SIM2'); | |
inc__('@UK');inc__('@UK'); | |
SeLa('VIHOD'); | |
LOA__EAX('@UK'); | |
Endprocedure; | |
end; | |
Procedure ReadKav; // EAX=UK EDX=SL | |
Begin | |
BeginProcedure('ReadKav'); | |
SAV__EAX('@UK'); | |
SAV__EDX('@SL'); | |
WRI_B('@SL',0); // Обнуляем длину слова | |
Rea_B('@SIM','@UK'); // читаем символ | |
RAV__('@SIM',0,'VIHOD'); // если строка кончилася нулевой символ | |
NRA__('@SIM',Ord('"'),'VIHOD'); // если строка кончилася нулевой символ | |
REA_B('@LSL','@SL'); // читаем длину слова | |
INC__('@LSL'); // Увеличиваем длину слова | |
WRI_B('@SL','@LSL'); // Записываем длину слова | |
INC__('@UK'); // Увеличиваем указтель на символ в программе | |
SeLa('CIKL'); //---------------------------- | |
RAV__('@SIM',0,'VIHOD'); // если строка кончилася нулевой символ | |
NRA__('@SIM',Ord('"'),'VIHOD2');// если строка кончилася нулевой символ | |
REA_B('@LSL','@SL'); // читаем длину слова | |
INC__('@LSL'); // Увеличиваем длину слова | |
WRI_B('@SL','@LSL'); // Записываем длину слова | |
INC__('@UK'); // Увеличиваем указтель на символ в программе | |
PRI__('@USL','@SL'); | |
ADD__('@USL','@LSL'); | |
WRI_B('@USL','@SIM'); // Записываем символ | |
JMP__('CIKL'); | |
SeLa('VIHOD2'); INC__('@UK'); | |
SeLa('VIHOD'); LOA__EAX('@UK'); | |
Endprocedure; | |
end; | |
{$ENDIF} | |
{ Секция BIOS } {$IFDEF Tim} | |
Procedure ConstructorElement;// Конструктор структуры элемента | |
var | |
z:Byte; | |
begin | |
if TrCo=80 then begin z:=2;ADDSP:=2;end else | |
if TrCo=16 then begin z:=2;ADDSP:=2;end else | |
if TrCo=17 then begin z:=2;ADDSP:=2;end else | |
if TrCo=32 then begin z:=4;ADDSP:=4;end else | |
if TrCo=33 then begin z:=4;ADDSP:=4;end else | |
if TrCo=34 then begin z:=4;ADDSP:=4;end else | |
InfoMes('ConstructorElement Не описано создание елемента '); | |
EL_RES:=0;// резерв | |
EL_TIS:=1;// тип текстового элемента | |
EL_FUN:=2;// Если это функция | |
EL_ERR:=3;// Код ошибки | |
EL_AXT:=4;// Текст операнда в верхнем регистре | |
EL_ZNA:=4+(z*1);// значение операнда | |
EL_SAM:=4+(z*2);// Указатель на самого себя | |
EL_ROD:=4+(z*3);// Родительский элемент | |
EL_PRE:=4+(z*4);// Предыдущий эллемент если есть если нету NIL 0 | |
EL_NEX:=4+(z*5);// Следующий эллемент ксли нету NIL 0 | |
EL_BLO:=4+(z*6);// Цепочка вложеных елементов если есть ссылка на первый элемент цепочки вложеных елементов если нету 0 NIL | |
end; | |
procedure BIOS_Z80; | |
//----------------------------------------------------------- | |
procedure BIOS_PRINT_STR_EAX; // Подпрограммы выводв строки EAX адрес строки | |
begin | |
BeginProcedure('BIOS_PRINT_STR_EAX'); | |
SAV__EAX('@SLO' );//Запоминаем адрес слова | |
WrMwm('D9' );//EXX; | |
WrMwm('216227' );//LD HL,2762;// НЕобходимо для правельной работы БИОС ZX Spectrum | |
WrMwm('d9' );//EXX; | |
WrMwm('3E02' );//LD A,2; | |
MOV__ESI(HexToInt('5C3A'));//LD IY,5C3A | |
cal__(HexToInt('1601' ));//CALL $1601 Установка потока | |
Len__Str('@LEN','@SLO' ); | |
Loa__ECX('@LEN'); | |
Loa__EDX('@SLO'); | |
INC__EDX; | |
MOV__ESI(HexToInt('5C3A'));// ld IY,5C3A // НЕобходимо для правельного функционирования БИОСА | |
Cal__(HexToInt('203C')); // вывод строки в поток | |
EndProcedure; | |
end; | |
procedure BIOS_PRINT_CIF_EAX; // Подпрограммы выводв строки EAX адрес строки | |
begin | |
BeginProcedure('BIOS_PRINT_CIF_EAX'); | |
SAV__EAX('@CIF'); | |
LOA__ECX('@CIF'); | |
WrMwm('D9');//EXX; | |
WrMwm('216227');//LD HL,2762; | |
WrMwm('d9');//EXX; | |
WrMwm('3E02');//LD A,2; | |
MOV__ESI(HexToInt('5C3A')); // ld IY,5C3A | |
CAL__(HexToInt('2D2B')); | |
WrMwm('D9');//EXX; | |
WrMwm('216227');//LD HL,2762; | |
WrMwm('d9');//EXX; | |
WrMwm('3E02');//LD A,2; | |
MOV__ESI(HexToInt('5C3A')); // ld IY,5C3A | |
cal__(HexToInt('1601'));// Установка потока | |
CAL__(HexToInt('2DE3')); | |
EndProcedure; | |
end; | |
procedure BIOS_PAUSE; | |
var | |
m:Ansistring; | |
begin | |
BeginProcedure('BIOS_PAUSE'); | |
m:=IntToStr(Muka); | |
LOA__EAX(0); | |
MOV_A_EAXB(23560); | |
SeLa('PCIK'+m); MOV__EAX(0); | |
MOV__EAX_AB(23560); | |
SAV__EAX('@KEY'); | |
RAV__('@KEY',0,'PCIK'+m); | |
EndProcedure; | |
end; | |
procedure BIOS_EXIT ; | |
begin | |
BeginProcedure('BIOS_EXIT'); | |
ADD__ESP(MaxSizeStek); | |
WrMwm('D9');//EXX; | |
WrMwm('216227');//LD HL,2762; | |
WrMwm('d9');//EXX; | |
WrMwm('3E02');//LD A,2; | |
MOV__ESI(HexToInt('5C3A')); // ld IY,5C3A | |
Ret__; | |
EndProcedure; | |
end; | |
begin | |
ConstructorElement; | |
MSta:=HexToInt('6000');//Указываем стартовый адрес программы | |
Muka:=MSta ;// Перепроверить | |
MEnd:=MSta+MaxSizeMem ;// Максимально доступная точка памяти в программе | |
Cal__('MAIN'); | |
CAl__('BIOS_EXIT'); | |
// Различные данные для программы | |
SePe('TrMe');WrMwc(0);// Указатель на кучю | |
SePe('EAX') ;WrMwc(0);// место для временого хранения регистра | |
SePe('ECX') ;WrMwc(0);// место для временого хранения регистра | |
SePe('EDX') ;WrMwc(0);// место для временого хранения регистра | |
SePe('ESI') ;WrMwc(0);// место для временого хранения регистра | |
// Загрузка базовых процедур и функций | |
BIOS_PRINT_STR_EAX; | |
BIOS_PRINT_CIF_EAX; | |
BIOS_PAUSE; | |
BIOS_EXIT ; | |
end;//----------------------------------------------------------- | |
procedure BIOS_DOS; | |
//----------------------------------------------------------- | |
procedure BIOS_PRINT_STR_EAX; // Подпрограммы выводв строки EAX адрес строки | |
begin | |
BeginProcedure('BIOS_PRINT_STR_EAX'); | |
SAV__EAX('@SLO'); | |
REA_B('@LSL','@SLO');// Читаем длину слова | |
INC__('@SLO'); | |
PRI__('@ESL','@SLO'); | |
ADD__('@ESL','@LSL'); | |
WRI_B('@ESL',ord('$')); | |
MOV__AH(9); | |
LOA__EDX('@SLO'); | |
INT__(HexToInt('21')); | |
EndProcedure; | |
end; | |
procedure BIOS_PRINT_CIF_EAX; // Подпрограммы выводв строки EAX адрес строки | |
begin | |
BeginProcedure('BIOS_PRINT_CIF_EAX'); | |
EndProcedure; | |
end; | |
procedure BIOS_PAUSE; | |
begin | |
BeginProcedure('BIOS_PAUSE'); | |
PUSH_EAX; | |
MOV__AH(8); | |
INT__(HexToInt('21')); | |
POP__EAX; | |
EndProcedure; | |
end; | |
procedure BIOS_EXIT; | |
begin | |
BeginProcedure('BIOS_EXIT'); | |
PUSH_EAX; | |
MOV__AH(8); | |
INT__(HexToInt('21')); | |
POP__EAX; | |
EndProcedure; | |
end; | |
begin | |
ConstructorElement; | |
MSta:=HexToInt('0100');//Указываем стартовый адрес программы | |
Muka:=MSta ;// Перепроверить | |
MEnd:=MSta+MaxSizeMem ;// Максимально доступная точка памяти в программе | |
Cal__('MAIN'); | |
Cal__('BIOS_EXIT'); | |
// Различные данные для программы | |
SePe('TrMe');WrMwc(0);// Указатель на кучю | |
SePe('EAX') ;WrMwc(0);// место для временого хранения регистра | |
SePe('ECX') ;WrMwc(0);// место для временого хранения регистра | |
SePe('EDX') ;WrMwc(0);// место для временого хранения регистра | |
SePe('ESI') ;WrMwc(0);// место для временого хранения регистра | |
BIOS_PRINT_STR_EAX; | |
BIOS_PRINT_CIF_EAX; | |
BIOS_PAUSE; | |
BIOS_EXIT ; | |
end;//----------------------------------------------------------- | |
Procedure PRINT_STR(s:Ansistring); | |
begin | |
LOA__EAX(s); | |
CAL__('BIOS_PRINT_STR_EAX'); | |
end; | |
Procedure PRINT_CIF(s:Ansistring);// EAX Число которое нада преобразовать EDX адрес строки с результатом | |
begin | |
LOA__EAX(s); | |
CAL__('BIOS_PRINT_CIF_EAX'); | |
end; | |
Procedure Pau__; | |
begin | |
CAL__('BIOS_PAUSE'); | |
end; | |
procedure LOAD_BIOS; | |
begin | |
// Загрузка биос API системы | |
If TRCo=80 Then BIOS_Z80 else | |
If TRCo=16 Then BIOS_DOS else | |
InfoMes(('BIOS не прописан для платформы ')); | |
end; | |
{$ENDIF} | |
{ Секция для математических операций } {$IFDEF Tim} | |
function UmnEdi(a,b:LongWord):LongWord; | |
begin | |
UmnEdi:=(a*b)mod 10; | |
end; | |
function UmnDes(a,b:LongWord):LongWord; | |
begin | |
UmnDes:=(a*b)div 10; | |
end; | |
Function PosSim(s:String;c:Char):LongWord; | |
var | |
f:LongWord; | |
Rez:LongWord; | |
begin | |
Rez:=0; | |
f:=1; | |
while (f<=length(s)) do | |
begin | |
if s[f]=C then Rez:=f; | |
inc(f); | |
end; | |
PosSim:=rez; | |
end; | |
Function DelSim(s:AnsiString;C:Char):AnsiString; | |
var | |
f:LongWord; | |
rez:AnsiString; | |
begin | |
for f:=1 to length(s) do | |
if s[f]<>C then rez:=rez+s[f]; | |
DelSim:=rez; | |
end; | |
Function Add_Do(b:LongWord;s:AnsiString;c:Char):AnsiString; | |
var | |
f:Longint; | |
begin | |
for f:=1 to b do | |
s:=c+s; | |
add_Do:=s; | |
end; | |
Function add_Po(b:LongWord;s:AnsiString;c:Char):AnsiString; | |
var | |
f:Longint; | |
begin | |
for f:=1 to b do | |
s:=s+c; | |
add_Po:=s; | |
end; | |
Function Nor(a:AnsiString):AnsiString; | |
var | |
f,l,s,e:Longword; | |
Rez:AnsiString; | |
begin | |
rez:=''; | |
l:=length(a); | |
f:=1;while (f<=L) and (a[f]='0') do inc(f);s:=f; | |
f:=l;while (f>0) and (a[f]='0') do dec(f);e:=f; | |
if PosSim(a,'.')=0 then e:=L; | |
f:=s;while (f<=e) do begin rez:=rez+a[f];inc(f); end; | |
if rez='' then rez:='0'; | |
if rez[length(rez)]='.' then delete(rez,length(rez),1); | |
if rez='' then rez:='0'; | |
if rez[1]='.' then rez:='0'+rez; | |
nor:=rez; | |
end; | |
Function Zna(a,b:Ansistring):byte; | |
var | |
z1,z2:byte; | |
begin | |
z1:=0; | |
z2:=0; | |
if (length(a)>0) and (a[1]='-') Then z1:=1; | |
if (length(b)>0) and (b[1]='-') Then z2:=2; | |
Zna:=z1+z2; | |
end; | |
Function Cor(var a,b:AnsiString):LongWord; | |
var | |
f:LongWord; | |
l1,l2,m,t1,t2,p:LongWord; | |
begin | |
a:=DelSim(a,'-'); | |
b:=DelSim(b,'-'); | |
l1:=length(a); | |
l2:=length(b); | |
t1:=PosSim(a,'.'); | |
t2:=PosSim(b,'.'); | |
//-------------------------------------------------------------- | |
if t1=0 then t1:=l1+1; | |
if t2=0 then t2:=l2+1; | |
//-------------------------------------------------------------- | |
if t1<>t2 then | |
if t1>t2 | |
Then b:=Add_Do(t1-t2,b,'0') | |
else a:=Add_Do(t2-t1,a,'0'); | |
//-------------------------------------------------------------- | |
if l1<t1 then a:=a+'.'; | |
if l2<t2 then b:=b+'.'; | |
l1:=length(a); | |
l2:=length(b); | |
if l1<>l2 then | |
if l1>l2 | |
Then b:=Add_Po(l1-l2,b,'0') | |
else a:=Add_Po(l2-l1,a,'0'); | |
f:=PosSim(a,'.'); | |
cor:=length(a)-f; | |
end; | |
Function Rav1(a,b:AnsiString):Boolean; | |
var | |
f:LongWord; | |
rez:Boolean; | |
begin | |
cor(a,b); | |
f:=1; | |
rez:=true; | |
while f<=length(a) do | |
if a[f]<>b[f] then begin rez:=false;break;end else inc(f); | |
rav1:=rez; | |
end; | |
Function Bol1(a,b:AnsiString):Boolean; | |
var | |
f:LongWord; | |
rez:Boolean; | |
begin | |
cor(a,b); | |
f:=1; | |
rez:=false; | |
while f<=length(a) do | |
if a[f]=b[f] then inc(f) else | |
if a[f]>b[f] | |
then begin rez:=true;break;end | |
else begin rez:=false;break;end; | |
Bol1:=rez; | |
end; | |
Function Men1(a,b:AnsiString):Boolean; | |
var | |
f:LongWord; | |
rez:Boolean; | |
begin | |
cor(a,b); | |
f:=1; | |
rez:=false; | |
while f<=length(a) do | |
if a[f]=b[f] then inc(f) else | |
if a[f]<b[f] | |
then begin rez:=true;break;end | |
else begin rez:=false;break;end; | |
men1:=rez; | |
end; | |
Function Sum1(a,b:AnsiString):AnsiString; | |
var | |
f,l,p1,a1,b1,c1,t:LongWord; | |
rez,rez2:AnsiString; | |
begin | |
t:=cor(a,b); | |
a:=delSim(a,'.'); | |
b:=delSim(b,'.'); | |
l:=Length(a); | |
f:=l; | |
p1:=0; | |
While f>0 do | |
begin | |
a1:=ord(a[f])-ord('0'); | |
b1:=ord(b[f])-ord('0'); | |
c1:=a1+b1+p1; | |
p1:=0; | |
While c1>9 do | |
begin | |
c1:=c1-10; | |
P1:=p1+1; | |
end; | |
rez:=chr(c1+ord('0'))+rez; | |
dec(f); | |
end; | |
if p1<>0 then | |
rez:=chr(p1+ord('0'))+rez; | |
for f:=1 to length(rez) do | |
if f=length(rez)-t then rez2:=rez2+rez[f]+'.' else rez2:=rez2+rez[f]; | |
Sum1:=Nor(rez2); | |
end; | |
Function Min1(a,b:AnsiString):AnsiString; | |
var | |
f,a1,b1,r,z1,z2,t:LongWord; | |
rez,rez2,ob:AnsiString; | |
begin | |
t:=cor(a,b); | |
a:=delSim(a,'.'); | |
b:=delSim(b,'.'); | |
if Men1(a,b) then begin ob:=a;a:=b;b:=ob;end; | |
f:=Length(a); | |
while f>0 do | |
begin | |
a1:=ord(a[f])-ord('0'); | |
b1:=ord(b[f])-ord('0'); | |
if a1<b1 then | |
begin | |
r:=f-1; | |
while a[r]='0' do r:=r-1; | |
a[r]:=Chr(ord(a[r])-1); | |
r:=r+1; | |
while r<f do begin a[r]:='9';inc(r);end; | |
a1:=a1+10; | |
end; | |
if a1>b1 then | |
begin | |
rez:=chr((a1-b1)+ord('0'))+rez; | |
end else | |
if a1=b1 then | |
begin | |
rez:='0'+rez; | |
end; | |
f:=f-1; | |
end; | |
for f:=1 to length(rez) do | |
if f=length(rez)-t then rez2:=rez2+rez[f]+'.' else rez2:=rez2+rez[f]; | |
min1:=nor(rez2); | |
end; | |
Function Umn1(a,b:AnsiString):AnsiString; | |
var | |
f,f1,f2,a1,b1,o,r,t:LongWord; | |
rez,rez2,sss:AnsiString; | |
begin | |
t:=cor(a,b); | |
a:=delSim(a,'.'); | |
b:=delSim(b,'.'); | |
o:=0; | |
r:=0; | |
rez:='0'; | |
f1:=length(a); | |
while f1>0 do | |
begin | |
f2:=length(a); | |
sss:=''; | |
sss:=Add_Po(length(a)-f1,sss,'0'); | |
r:=0; | |
while f2>0 do | |
begin | |
a1:=ord(a[f2])-ord('0'); | |
b1:=ord(b[f1])-ord('0'); | |
o:=UmnEdi(a1,b1); | |
o:=o+r; | |
sss:=chr((o)+ord('0'))+sss; | |
r:=UmnDes(a1,b1); | |
f2:=f2-1; | |
end; | |
sss:=chr((r)+ord('0'))+sss; | |
rez:=sum1(sss,rez); | |
f1:=f1-1; | |
end; | |
if Length(rez)<t+t+1 then | |
rez:=Add_do(t+t+1,rez,'0'); | |
for f:=1 to length(rez) do | |
if f=length(rez)-(t+t) | |
then rez2:=rez2+rez[f]+'.' | |
else rez2:=rez2+rez[f]; | |
Umn1:=Nor(rez2); | |
end; | |
Function Del1(a,b:AnsiString;toch:LongWord):AnsiString; | |
var | |
f,t,u,c:LongWord; | |
r,pre,rez,rez2:AnsiString; | |
begin | |
t:=cor(a,b); | |
a:=delSim(a,'.'); | |
b:=delSim(b,'.'); | |
a:=nor(a);a:=add_Po(toch,a,'0'); | |
b:=nor(b); | |
r:=''; | |
u:=length(b); | |
for f:=1 to u do | |
r:=r+a[f]; | |
while u<=length(a) do | |
begin | |
if Bol1(r,b) or Rav1(r,b) then | |
begin | |
pre:='0'; | |
c:=0; | |
while men1(sum(pre,b),r) or rav1(sum(pre,b),r) do | |
begin | |
pre:=sum1(pre,b); | |
c:=c+1; | |
end; | |
r:=min1(r,pre); | |
rez:=rez+chr(c+ord('0')); | |
end else rez:=rez+'0'; | |
u:=u+1; if u<=length(a) then r:=r+a[u]; | |
end; | |
if Length(rez)<toch+1 then rez:=Add_do(toch+1,rez,'0'); | |
for f:=1 to length(rez) do | |
if f=length(rez)-(toch) then rez2:=rez2+rez[f]+'.' else rez2:=rez2+rez[f]; | |
del1:=nor(rez2); | |
end; | |
Function Rav(a,b:AnsiString):Boolean; | |
var | |
z:Byte; | |
begin | |
z:=Zna(a,b); | |
if z=1 then rav:=false else | |
if z=2 then rav:=false else rav:=rav1(a,b); | |
end; | |
Function Bol(a,b:AnsiString):Boolean; | |
var | |
z:Byte; | |
begin | |
z:=Zna(a,b); | |
if z=1 then Bol:=false else | |
if z=2 then Bol:=True else Bol:=Bol1(a,b); | |
end; | |
Function Men(a,b:AnsiString):Boolean; | |
var | |
z:Byte; | |
begin | |
z:=Zna(a,b); | |
if z=1 then Men:=true else | |
if z=2 then Men:=False else Men:=Men1(a,b); | |
end; | |
Function Sum(a,b:AnsiString):AnsiString; | |
var | |
z:Longword; | |
begin | |
z:=zna(a,b); | |
if rav1(a,b) then | |
begin | |
if z=3 then sum:='-'+sum1(a,b) else | |
if z=1 then sum:='0' else | |
if z=2 then sum:='0' else | |
if z=0 then sum:=sum1(a,b); | |
end else | |
if Bol1(a,b) then | |
begin | |
if z=3 then sum:='-'+Sum1(a,b) else | |
if z=1 then sum:='-'+Min1(a,b) else | |
if z=2 then sum:=min1(a,b) else | |
if z=0 then sum:=sum1(a,b); | |
end else | |
if Men1(a,b) then | |
begin | |
if z=3 then sum:='-'+sum1(a,b) else | |
if z=1 then sum:=min1(a,b) else | |
if z=2 then sum:='-'+min1(a,b) else | |
if z=0 then sum:=sum1(a,b); | |
end; | |
{ | |
(-5+(-5))=-10 | |
(-5+( 5))=0 | |
( 5+(-5))=0 | |
( 5+( 5))=10 | |
---------------- | |
(-10+(-5))=-15 | |
(-10+( 5))=-5 | |
( 10+(-5))=5 | |
( 10+( 5))=15 | |
---------------- | |
(-5+(-10))=-15 | |
(-5+( 10))=5 | |
( 5+(-10))=-5 | |
( 5+( 10))=15 | |
} | |
end; | |
Function Min(a,b:AnsiString):AnsiString; | |
var | |
z:Longword; | |
begin | |
z:=zna(a,b); | |
if rav1(a,b) then | |
begin | |
if z=3 then min:='0' else | |
if z=1 then min:='-'+sum1(a,b) else | |
if z=2 then min:=sum1(a,b) else | |
if z=0 then min:='0'; | |
end else | |
if Bol1(a,b) then | |
begin | |
if z=3 then min:='-'+min1(a,b) else | |
if z=1 then min:='-'+sum1(a,b) else | |
if z=2 then min:=sum1(a,b) else | |
if z=0 then min:=min1(a,b); | |
end else | |
if men1(a,b) then | |
begin | |
if z=3 then min:=min1(a,b) else | |
if z=1 then min:='-'+sum1(a,b) else | |
if z=2 then min:=sum1(a,b) else | |
if z=0 then min:='-'+min1(a,b); | |
end; | |
{ | |
(-5-(-5))=0 | |
(-5-( 5))=-10 | |
( 5-(-5))=10 | |
( 5-( 5))=0 | |
-------------------- | |
(-10-(-5))=-5 | |
(-10-( 5))=-15 | |
( 10-(-5))=15 | |
( 10-( 5))=5 | |
-------------------- | |
(-5-(-10))=5 | |
(-5-( 10))=-15 | |
( 5-(-10))=15 | |
( 5-( 10))=-5 | |
} | |
end; | |
Function Umn(a,b:AnsiString):AnsiString; | |
var | |
z:Longword; | |
begin | |
z:=zna(a,b); | |
if rav1('0',a) then umn:='0' else | |
if rav1('0',b) then umn:='0' else | |
if z=3 then Umn:=Umn1(a,b) else | |
if z=1 then Umn:='-'+Umn1(a,b) else | |
if z=2 then Umn:='-'+Umn1(a,b) else | |
if z=0 then Umn:=Umn1(a,b); | |
end; | |
Function del(a,b:AnsiString;toch:LongWord):AnsiString; | |
var | |
z:Longword; | |
begin | |
z:=zna(a,b); | |
if rav1('0',a) then Del:='Бесконечность' else | |
if rav1('0',b) then Del:='0' else | |
if z=3 then Del:=Del1(a,b,Toch) else | |
if z=1 then Del:='-'+Del1(a,b,Toch) else | |
if z=2 then Del:='-'+Del1(a,b,Toch) else | |
if z=0 then Del:=Del1(a,b,Toch); | |
end; | |
//============================================================================== | |
//============================================================================== | |
//============================================================================== | |
Procedure UMN__EDI(R,A,B:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('UmnDesEdi'); | |
SAV__EDX(r); | |
end; | |
Procedure UMN__DES(R,A,B:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('UmnDesEdi'); | |
SAV__EAX(r); | |
end; | |
Procedure Add__Poo(st:String;ch:LongWord;kol:String); | |
begin | |
Loa__EAX(st); | |
Loa__EDX(ch); | |
Loa__ECX(kol); | |
Cal__('addPosle'); | |
end; | |
procedure Add__Doo(st,ch:String;kol:LongWord); | |
begin | |
Loa__EAX(st); | |
Loa__EDX(ch); | |
Loa__ECX(kol); | |
Cal__('addDoooo'); | |
end; | |
procedure Add__Doo(st:String;ch:LongWord;kol:String); | |
begin | |
Loa__EAX(st); | |
Loa__EDX(ch); | |
Loa__ECX(kol); | |
Cal__('addDoooo'); | |
end; | |
procedure Add__Doo(st,ch,kol:String); | |
begin | |
Loa__EAX(st); | |
Loa__EDX(ch); | |
Loa__ECX(kol); | |
Cal__('addDoooo'); | |
end; | |
procedure Nor__CHI(a:string); | |
begin | |
LOA__EAX(a); | |
Cal__('NorChislo'); | |
end; | |
procedure Cor__CHI(t,a,b:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('CorChisel'); | |
SAv__EAX(t); | |
end; | |
procedure Zna__CHI(z,a,b:String); | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('ZnaChisel'); | |
SAV__EAX(z); | |
end; | |
Procedure RAV1_CHI(a,b,r:String); | |
begin | |
Cre__Str('@RAV1_CHI_A'); | |
Cre__Str('@RAV1_CHI_B'); | |
Cop__STR('@RAV1_CHI_A',A); | |
Cop__STR('@RAV1_CHI_B',B); | |
LOA__EAX('@RAV1_CHI_A'); | |
LOA__EDX('@RAV1_CHI_B'); | |
CAL__('RAV1Chisel'); | |
SAV__EAX('@RAV1_CHI_C'); | |
Fre__Str('@RAV1_CHI_A'); | |
Fre__Str('@RAV1_CHI_B'); | |
RAV__('@RAV1_CHI_C',1,R); | |
end; | |
Procedure BOL1_CHI(a,b,r:String); | |
begin | |
Cre__Str('@BOL1_CHI_A'); | |
Cre__Str('@BOL1_CHI_B'); | |
Cop__STR('@BOL1_CHI_A',A); | |
Cop__STR('@BOL1_CHI_B',B); | |
LOA__EAX('@BOL1_CHI_A'); | |
LOA__EDX('@BOL1_CHI_B'); | |
CAL__('Bol1Chisel'); | |
SAV__EAX('@BOL1_CHI_C'); | |
Fre__Str('@BOL1_CHI_A'); | |
Fre__Str('@BOL1_CHI_B'); | |
RAV__('@BOL1_CHI_C',1,R); | |
end; | |
Procedure MEN1_CHI(a,b,r:String); | |
begin | |
Cre__Str('@MEN1_CHI_A'); | |
Cre__Str('@MEN1_CHI_B'); | |
Cop__STR('@MEN1_CHI_A',A); | |
Cop__STR('@MEN1_CHI_B',B); | |
LOA__EAX('@MEN1_CHI_A'); | |
LOA__EDX('@MEN1_CHI_B'); | |
CAL__('MEN1Chisel'); | |
SAV__EAX('@MEN1_CHI_C'); | |
Fre__Str('@MEN1_CHI_A'); | |
Fre__Str('@MEN1_CHI_B'); | |
RAV__('@MEN1_CHI_C',1,R); | |
end; | |
Procedure Sum1_Chi(a,b:String); // Складывает строки с числа EAX:EDX без знака | |
begin | |
Cre__Str('@Sum1_Chi_B'); | |
Cop__Str('@Sum1_Chi_B',b); | |
LOA__EAX(a); | |
LOA__EDX('@Sum1_Chi_B'); | |
Cal__('Sum1Chisel'); | |
Fre__Str('@Sum1_Chi_B'); | |
end; | |
Procedure Min1_Chi(a,b:String); // Вычитает строки с числа EAX:EDX без знака | |
begin | |
Cre__Str('@Min1_Chi_B'); | |
Cop__Str('@Min1_Chi_B',b); | |
LOA__EAX(a); | |
LOA__EDX('@Min1_Chi_B'); | |
Cal__('Min1Chisel'); | |
Fre__Str('@Min1_Chi_B'); | |
end; | |
Procedure Umn1_Chi(a,b:String); // Умножает строки с числа EAX:EDX без знака | |
begin | |
Cre__Str('@Umn1_Chi_B'); | |
Cop__Str('@Umn1_Chi_B',b); | |
LOA__EAX(a); | |
LOA__EDX('@Umn1_Chi_B'); | |
Cal__('Umn1Chisel'); | |
Fre__Str('@UMN1_Chi_B'); | |
end; | |
Procedure Del1_Chi(a,b:String); // Делит строки с числа EAX:EDX без знака | |
begin | |
Cre__Str('@Del1_Chi_B'); | |
Cop__Str('@Del1_Chi_B',b); | |
LOA__EAX(a); | |
LOA__EDX('@Del1_Chi_B'); | |
LOA__ECX(Toch);// ТОчность результата; | |
Cal__('Del1Chisel'); | |
Fre__Str('@Del1_Chi_B'); | |
end; | |
Procedure RAV__CHI(a,b,r:String); // ПРоверяет на равенство строки числа полное | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
CAL__('RavChisel'); | |
SAV__EAX('@RAV__CHI'); | |
RAV__('@RAV__CHI',1,r); | |
end; | |
Procedure Bol__CHI(a,b,r:String); // ПРоверяет на Больше если первое Число больше строки числа полное | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
CAL__('BolChisel'); | |
SAV__EAX('@Bol__CHI'); | |
RAV__('@Bol__CHI',1,r); | |
end; | |
Procedure Men__CHI(a,b,r:String); // ПРоверяет на Больше если первое Число Меньше строки числа полное | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
CAL__('MenChisel'); | |
SAV__EAX('@Men__CHI_C'); | |
RAV__('@Men__CHI_C',1,r); | |
end; | |
Procedure Sum__Chi(a,b:String); // Складывает строки с числа EAX:EDX Полное | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('SumChisel'); | |
end; | |
Procedure Min__Chi(a,b:String); // Вычитает строки с числа EAX:EDX Полное | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('MinChisel'); | |
end; | |
Procedure Umn__Chi(a,b:String); // Умножение строки с числа EAX:EDX Полное | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('UmnChisel'); | |
end; | |
Procedure Del__Chi(a,b:String); // Деление строки с числа EAX:EDX Полное | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
Cal__('DelChisel'); | |
end; | |
Procedure UmnDesEdi; // Умножает и возвращает Возращает десятки EAX:и единицы EDX | |
begin | |
BeginProcedure('UmnDesEdi'); | |
SAV__EAX('@A'); | |
SAV__EDX('@B'); | |
Pri__('@F','@A'); | |
Pri__('@EDI',0); | |
Pri__('@DES',0); | |
Pri__('@SSS',0); | |
SeLa('Cik'); Rav__('@F',0,'Ecik'); | |
ADD__('@SSS','@B'); | |
MEN__('@SSS',10,'NEX'); | |
INC__('@DES'); | |
SUB__('@SSS',10); | |
SeLA('NEX'); PRI__('@EDI','@SSS'); | |
DEC__('@F'); | |
Jmp__('CIK'); | |
SeLa('Ecik'); | |
LOA__EAX('@DES'); | |
LOA__EDX('@EDI'); | |
EndProcedure; | |
end; | |
procedure addPosle; // Добавляет в коцес строки EAX символ EDX в Количсетве ECX символов | |
begin | |
BeginProcedure('addPosle'); | |
SAV__EAX('@STR'); | |
SAV__EDX('@SIM'); | |
SAV__ECX('@KOL'); | |
PRI__('@F',1); | |
SeLa('CIK'); BOL__('@F','@KOL','ECIK'); | |
Add__Sim('@STR','@SIM'); | |
INC__('@F'); | |
JMP__('CIK'); | |
SeLa('ECIK'); | |
EndProcedure; | |
{BeginProcedure('addPosle'); | |
SAV__EAX('@STR'); | |
SAV__EDX('@SIM'); | |
SAV__ECX('@KOL'); | |
SeLa('CIK'); RAV__('@KOL',0,'ECIK'); | |
ADD__Sim('@STR','@SIM'); | |
DEC__('@KOL'); | |
JMP__('CIK'); | |
SeLa('ECIK'); | |
EndProcedure; } | |
end; | |
procedure addDoooo; // Добавляет в Начало строки EAX символ EDX в количсетве символов ECX | |
begin | |
BeginProcedure('addDoooo'); | |
SAV__EAX('@STR'); | |
SAV__EDX('@SIM'); | |
SAV__ECX('@KOL'); | |
PRI__('@F',1); | |
SeLa('CIK'); Bol__('@F','@KOL','ECIK'); | |
ADD__SSI('@STR','@SIM'); | |
INC__('@F'); | |
JMP__('CIK'); | |
SeLa('ECIK'); | |
EndProcedure; | |
end; | |
procedure NorChislo; // Нормализация числа EAX возвращает нормализованое число | |
begin | |
BeginProcedure('NorChislo'); | |
SAv__EAX('@CHI'); | |
Cre__Str('@REZ'); // Создаем строку для записи результата | |
// Получаем адрес начальньного символа | |
//------------------------------------------------------------ | |
PRI__('@STA','@CHI');// получаем Указатель на строку с числом | |
PRI__('@END','@CHI');// получаем Указатель на строку с числом | |
Len__STR('@LEN','@CHI'); | |
ADD__('@END','@LEN');// Получаем конец строки 0 1 2 3 4 | |
INC__('@STA'); | |
SeLa('CIK1'); REA_B('@SIM','@STA'); | |
BOL__('@STA','@END','ECIK1');// Если указатель больше последнего символа выход | |
NRA__('@SIM',ord('0'),'ECIK1');// Если символ не нуль с него считать и выход | |
INC__('@STA'); | |
JMP__('CIK1'); | |
SeLa('ECIK1');// ПОлучаем адрес конечного символа цифры в строке | |
//------------------------------------------------------------ | |
SeLa('CIK2'); BOL__('@STA','@END','ECIK2');// Если конец строки оказался меньше начала строки выход | |
REA_B('@SIM','@END'); | |
NRA__('@SIM',ord('0'),'ECIK2'); | |
DEC__('@END'); | |
JMP__('CIK2'); | |
SeLa('ECIK2');//------------------------------------------------------------ | |
//if not Est_Sim(a,'.') then e:=L; | |
POs__SIM('@R','@CHI',Ord('.')); | |
NRA__('@R',0,'E'); | |
PRI__('@END','@CHI'); | |
ADD__('@END','@LEN'); | |
SeLa('E'); //------------------------------------------------------------ | |
//f:=s;while (f<=e) do begin rez:=rez+a[f];inc(f); end; | |
// Читаем число | |
PRI__('@F','@STA'); | |
SeLa('CIK3'); BOL__('@F','@END','ECIK3'); | |
Rea_B('@SIM','@F'); | |
Add__SIM('@REZ','@SIM'); | |
INC__('@F'); | |
JMP__('CIK3'); | |
SeLa('ECIK3');//------------------------------------------------------------ | |
//if rez[length(rez)]='.' then delete(rez,length(rez),1); | |
//Если последний знак точка удаляем | |
Len__Str('@LLL','@REZ'); | |
RAV__('@LLL',0,'NEX4'); | |
ADD__('@LLL','@REZ'); | |
REA_B('@SiM','@LLL'); | |
NRA__('@SIM',ord('.'),'NEX2'); | |
Len__Str('@LLL','@REZ'); | |
DEC__('@LLL'); | |
WRI_B('@REZ','@LLL'); | |
SeLA('NEX2'); //------------------------------------------------------------ | |
//if rez[1]='.' then rez:='0'+rez; | |
// Если первый знак точка добавляем нуль в начало | |
PRI__('@UKA','@REZ'); | |
INC__('@UKA'); | |
Rea_B('@SIM','@UKA'); | |
NRa__('@SIM',Ord('.'),'NEX4'); | |
Add__SSI('@REZ',Ord('0')); | |
SeLa('NEX4'); // Если длина строки нулевая ставим нуль | |
//------------------------------------------------------------ | |
//if rez='' then rez:='0'; | |
Len__str('@LEN','@REZ'); | |
Nra__('@LEN',0,'NEX1'); | |
add__Sim('@REz',Ord('0')); | |
SeLa('NEX1'); | |
Cop__Str('@CHI','@REZ'); | |
EndProcedure; Fre__Str('@REZ'); | |
end; | |
Procedure ZnaChisel; // EAX: число1 EDX: число2 Возвращает код комбинации знаков 0++ 1-+ 2+- 3-- | |
begin | |
BeginProcedure('ZnaChisel'); | |
SAv__Eax('@CHI1'); | |
SAv__Edx('@CHI2'); | |
REA_B('@LEN1','@CHI1'); | |
REA_B('@LEN2','@CHI2'); | |
Pri__('@REZ',0); | |
RAV__('@LEN1',0,'NEX1'); | |
REA_B('@SIM','@CHI1'); | |
NRA__('@SIM',ord('-'),'NEX1'); | |
ADD__('@REZ',1); | |
SeLA('NEX1'); | |
RAV__('@LEN2',0,'NEX2'); | |
REA_B('@SIM','@CHI2'); | |
NRA__('@SIM',ord('-'),'NEX2'); | |
ADD__('@REZ',2); | |
SeLA('NEX2'); | |
LOA__EAX('@REZ'); | |
endProcedure; | |
end; | |
Procedure CorChisel; // EAX: число1 EDX: число2 ПРоизводит корекцию чисел | |
begin | |
BeginProcedure('CorChisel'); | |
Sav__Eax('@CHI1'); | |
Sav__EDx('@CHI2'); | |
Del__Sim('@CHI1',Ord('-')); | |
Del__Sim('@CHI2',Ord('-')); | |
Len__Str('@L1','@CHI1'); | |
Len__Str('@L2','@CHI2'); | |
POS__Sim('@T1','@CHI1',Ord('.')); | |
POS__Sim('@T2','@CHI2',Ord('.')); | |
//-------------------------------------------------------------- | |
// Вычисляем кооординаты точек если их нету то координа длина строки плюс 1 | |
NRA__('@T1',0,'NEX1'); | |
Pri__('@T1','@L1'); | |
Inc__('@T1'); | |
SeLA('NEX1'); //--------------------- | |
NRA__('@T2',0,'NEX2'); | |
Pri__('@T2','@L2'); | |
Inc__('@T2'); | |
SeLA('NEX2'); | |
//-------------------------------------------------------------- | |
// Добавляем нули в начале строк // | |
RAV__('@T1','@T2','VAREN');// Если тока в числах в одной и тойже позиии пропускаем | |
BOL__('@T1','@T2','VARME');// Если в первом числе точка дальше | |
// Если точка во втором числе ближе чем в первом | |
PRI__('@TT2','@T2'); | |
SUB__('@TT2','@T1'); | |
Add__DOO('@CHI1',Ord('0'),'@TT2'); | |
JMP__('VAREN'); | |
SeLa('VARME');// Если точка во втором числе больше чем в первом | |
PRI__('@TT2','@T1'); | |
SUB__('@TT2','@T2'); | |
Add__DOO('@CHI2',Ord('0'),'@TT2'); | |
SeLa('VAREN'); | |
//-------------------------------------------------------------- | |
// Добавляем точку если её нету в числе перед выравниванием | |
MRA__('@t1','@l1','TO1'); | |
add__Sim('@Chi1',Ord('.')); | |
SeLa('TO1'); | |
MRA__('@t2','@l2','TO3'); | |
add__Sim('@Chi2',Ord('.')); | |
SeLa('TO3'); | |
//-------------------------------------------------------------- | |
Len__Str('@L1','@CHI1');// Определяем длины строк заного | |
Len__Str('@L2','@CHI2'); | |
//-------------------------------------------------------------- | |
RAV__('@L1','@L2','ARAV'); | |
BOL__('@L1','@L2','ABOL'); | |
Pri__('@LLL','@L2'); | |
SUB__('@LLL','@L1'); | |
Add__Poo('@CHI1',Ord('0'),'@LLL'); | |
JMP__('ARAV'); | |
SeLa('ABOL'); | |
Pri__('@LLL','@L1'); | |
SUB__('@LLL','@L2'); | |
Add__Poo('@CHI2',Ord('0'),'@LLL'); | |
SeLa('ARAV'); | |
// Определяем сколько знаков после запятой | |
POs__Sim('@F','@CHI1',ord('.')); | |
Len__Str('@LEN','@CHI1'); | |
SUB__('@LEN','@F'); | |
LOA__EAX('@LEN'); | |
endProcedure; | |
end; | |
procedure Rav1Chisel;// ПРоверяет равенство строк с числами EAX:EDX Возвращает EAX без знака | |
begin | |
BeginProcedure('Rav1Chisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Cor__Chi('@T','@CHI1','@CHI2'); | |
Len__STR('@LEN','@CHI1'); | |
Pri__('@U1','@CHI1');Inc__('@U1'); | |
Pri__('@U2','@CHI2');Inc__('@U2'); | |
SeLa('Cik'); RAV__('@LEN',0,'RAVNO'); | |
Rea_B('@SIM1','@U1'); | |
Rea_B('@SIM2','@U2'); | |
NRA__('@SIM1','@SIM2','NERAV'); | |
DEC__('@LEN'); | |
INC__('@u1'); | |
INC__('@u2'); | |
JMP__('Cik'); | |
SeLA('ECIK'); | |
SeLa('NERAV');PRI__('@REZ',0); | |
JMP__('VIHOD'); | |
SeLa('RAVNO');PRI__('@REZ',1); | |
SeLa('VIHOD');LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
procedure BOL1Chisel;// ПРоверяет Больше ли первая строка с числами EAX:EDX Возвращает EAX без знака | |
begin | |
BeginProcedure('Bol1Chisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Cor__Chi('@T','@CHI1','@CHI2'); | |
Len__STR('@LEN','@CHI1'); | |
Pri__('@U1','@CHI1');inc__('@U1'); | |
Pri__('@U2','@CHI2');inc__('@U2'); | |
SeLa('Cik'); RAV__('@LEN',0,'RAVNO'); | |
Rea_B('@SIM1','@U1'); | |
Rea_B('@SIM2','@U2'); | |
Men__('@SIM1','@SIM2','MENHE'); | |
Bol__('@SIM1','@SIM2','BOLHE'); | |
DEC__('@LEN'); | |
INC__('@u1'); | |
INC__('@u2'); | |
JMP__('Cik'); | |
SeLA('ECIK'); | |
SeLa('BOLHE');PRI__('@REZ',1); | |
JMP__('VIHOD'); | |
SeLa('RAVNO'); | |
SeLa('MENHE');PRI__('@REZ',0); | |
SeLA('VIHOD');LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
procedure MEN1Chisel;// ПРоверяет Меньше ли первая строка с числами EAX:EDX Возвращает EAX без знака | |
begin | |
BeginProcedure('Men1Chisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Cor__Chi('@T','@CHI1','@CHI2'); | |
Len__STR('@LEN','@CHI1'); | |
Pri__('@U1','@CHI1');INC__('@U1'); | |
Pri__('@U2','@CHI2');INC__('@U2'); | |
SeLa('Cik'); RAV__('@LEN',0,'RAVNO'); | |
Rea_B('@SIM1','@U1'); | |
Rea_B('@SIM2','@U2'); | |
Men__('@SIM1','@SIM2','MENHE'); | |
Bol__('@SIM1','@SIM2','BOLHE'); | |
DEC__('@LEN'); | |
INC__('@u1'); | |
INC__('@u2'); | |
JMP__('Cik'); | |
SeLA('ECIK'); | |
SeLa('MENHE');PRI__('@REZ',1); | |
JMP__('VIHOD'); | |
SeLa('RAVNO'); | |
SeLa('BOLHE');PRI__('@REZ',0); | |
SeLa('VIHOD');LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
Procedure Sum1Chisel;// Складывает строки с числа EAX:EDX без знака | |
begin | |
BeginProcedure('Sum1Chisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Cor__Chi('@T','@CHI1','@CHI2'); | |
Del__Sim('@CHI1',ord('.')); | |
Del__Sim('@CHI2',ord('.')); | |
Cre__Str('@REZ'); | |
Cre__Str('@REZ2'); | |
Len__Str('@L','@CHI1'); | |
Pri__('@U1','@CHI1');ADD__('@U1','@L'); | |
Pri__('@U2','@CHI2');ADD__('@U2','@L'); | |
Pri__('@F','@L'); | |
Pri__('@P1',0); | |
//------------------------------------------------------------------------------ | |
SeLa('Cik'); rav__('@F',0,'ECIK'); | |
// Переводим числа из текста в Цифры | |
REA_B('@A1','@U1'); | |
REA_B('@B1','@U2'); | |
SUB__('@A1',ord('0')); | |
SUB__('@B1',ord('0')); | |
// Складываем числа | |
Pri__('@C1','@P1'); | |
ADD__('@C1','@A1'); | |
ADD__('@C1','@B1'); | |
Pri__('@P1',0);// ОБнуляем остаток | |
// Считаем и вычитаем Десятки ----- | |
SeLa('Cik2'); MRA__('@C1',9,'ECIK2'); | |
SUB__('@C1',10); | |
INC__('@P1'); | |
Jmp__('Cik2'); | |
SeLa('ECik2'); | |
//---------------------------------- | |
// Записываем получившиеся число | |
Pri__('@RSIM','@c1'); | |
ADD__('@RSIM',ord('0')); | |
Add__SSI('@REZ','@RSIM'); | |
DEC__('@F'); | |
DEC__('@U1'); | |
DEC__('@U2'); | |
JMP__('CIK'); | |
SeLa('ECik'); //-------------------------------------- | |
// Записываем остаток от сложений | |
// if p1<>0 then rez:=chr(p1+ord('0'))+rez; | |
Cre__Str('@REZ2'); | |
RAV__('@P1',0,'@NEX1'); | |
Pri__('@RSIM','@P1'); | |
ADD__('@RSIM',ord('0')); | |
Add__SSI('@REZ','@RSIM'); | |
SeLa('@NEX1');//-------------------------------------- | |
// Расчитываем length(rez)-t | |
Len__Str('@LR','@REZ');// | |
Pri__('@LRT','@LR'); | |
SUB__('@LRT','@T'); | |
Pri__('@F',1); | |
//-------------------------------------- | |
// for f:=1 to length(rez) do | |
SeLa('CIK3'); BOL__('@F','@LR','ECIK3'); | |
SIM__NOM('@SIM','@REZ','@F'); | |
// if f=length(rez)-t then | |
NRA__('@LRT','@F','ELSE'); | |
Add__Sim('@REZ2','@SIM'); | |
Add__Sim('@REZ2',ord('.')); | |
JMP__('EIFF'); | |
SeLa('ELSE'); // ELSE | |
Add__Sim('@REZ2','@SIM'); | |
SeLa('EIFF'); | |
INC__('@F'); | |
JMP__('CIK3'); | |
SeLa('ECIK3');//-------------------------------------- | |
Nor__CHI('@REZ2'); | |
Cop__Str('@CHI1','@REZ2'); | |
Fre__Str('@REZ'); | |
Fre__Str('@REZ2'); | |
EndProcedure; | |
end; | |
Procedure Min1Chisel;// Вычитает строки с числа EAX:EDX без знака | |
begin | |
BeginProcedure('Min1Chisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Cre__Str('@REz'); | |
Cre__Str('@REz2'); | |
COR__CHI('@T','@CHI1','@CHI2'); | |
Del__Sim('@CHI1',Ord('.')); | |
Del__Sim('@CHI2',Ord('.')); | |
//if Men1(a,b) then begin ob:=a;a:=b;b:=ob;end; | |
BOL1_Chi('@CHI1','@CHI2','NEX0'); | |
RAV1_Chi('@CHI1','@CHI2','NEX0'); | |
Cre__Str('@OB');//-- | |
Cop__Str('@OB','@Chi1'); | |
Cop__Str('@CHI1','@CHI2'); | |
Cop__Str('@CHI2','@OB'); | |
Fre__Str('@OB');//-- | |
//------------------------------------ | |
SeLa('NEX0'); | |
Len__Str('@F','@CHI1'); | |
//while f>0 do | |
SeLa('Cik'); Rav__('@F',0,'ECIK'); | |
Sim__Nom('@A1','@CHI1','@F');SUB__('@A1',Ord('0')); | |
Sim__Nom('@B1','@CHI2','@F');SUB__('@B1',Ord('0')); | |
//if a1<b1 then --------------------- | |
BRA__('@A1','@B1','NEX1'); | |
//r:=f-1; | |
PRI__('@R','@F');Dec__('@R'); | |
//while a[r]='0' do r:=r-1; | |
Sim__Nom('@S','@CHI1','@R'); | |
SeLa('CIK2'); nra__('@s',ord('0'),'ECIK2'); | |
DEC__('@R'); | |
Sim__Nom('@S','@CHI1','@R'); | |
JMP__('CIK2'); | |
SeLa('ECIK2');//------------------------------------ | |
DEC__('@S');//Chr(ord(a[r])-1) | |
Sim__Set('@CHI1','@R','@S');//a[r]:= | |
Inc__('@R');//r:=r+1; | |
//------------------------------------ | |
// while r<f do begin a[r]:='9';inc(r);end; | |
SeLa('CIK3'); BRA__('@r','@f','ECIK3'); | |
Sim__Set('@CHI1','@r',Ord('9')); | |
Inc__('@r'); | |
Jmp__('CIK3'); | |
SeLa('ECIK3'); | |
ADD__('@A1',10); | |
//..................................... | |
SelA('NEX1'); //------------------ BIG IFFFF | |
// if a1>b1 THEN rez:=chr((a1-b1)+ord('0'))+rez; | |
RAV__('@A1','@B1','NEX2'); | |
PRI__('@SSS','@A1'); | |
SUB__('@SSS','@B1'); | |
ADD__('@SSS',Ord('0')); | |
Add__SSi('@rez','@SSS'); | |
Jmp__('NEX3'); | |
SeLa('NEX2'); NRA__('@A1','@B1','NEX3');// ELSE | |
Add__SSi('@rez',ord('0')); | |
SeLa('NEX3'); | |
DEC__('@F'); | |
JMP__('CIK'); | |
SeLa('ECIK');//========================================== | |
// Расчитываем length(rez)-t | |
Len__Str('@LR','@REZ');// | |
Pri__('@LRT','@LR'); | |
SUB__('@LRT','@T'); | |
Pri__('@F',1); | |
//-------------------------------------- | |
// for f:=1 to length(rez) do | |
SeLa('CIK4'); BOL__('@F','@LR','ECIK4'); | |
SIM__NOM('@SIM','@REZ','@F'); | |
// if f=length(rez)-t then | |
NRA__('@LRT','@F','ELSE'); | |
Add__Sim('@REZ2','@SIM'); | |
Add__Sim('@REZ2',ord('.')); | |
JMP__('EIFF'); | |
SeLa('ELSE'); // ELSE | |
Add__Sim('@REZ2','@SIM'); | |
SeLa('EIFF'); | |
INC__('@F'); | |
JMP__('CIK4'); | |
SeLa('ECIK4');//-------------------------------------- | |
NOR__Chi('@REZ2'); | |
Cop__Str('@CHI1','@REZ2'); | |
Fre__Str('@REZ'); | |
Fre__Str('@REZ2'); | |
EndProcedure; | |
end; | |
Procedure Umn1Chisel;// Умножает строки с числа EAX:EDX без знака | |
begin | |
BeginProcedure('Umn1Chisel'); | |
SAV__EAX('@A'); | |
SAV__EDX('@B'); | |
COR__CHI('@T','@A','@B'); | |
Del__Sim('@A',ord('.')); | |
Del__Sim('@B',ord('.')); | |
Cre__Str('@REz'); | |
Cre__Str('@REz2'); | |
Cre__Str('@SSS'); | |
Add__Sim('@REZ',ORD('0')); | |
Pri__('@O',0); | |
Pri__('@R',0); | |
Len__Str('@F1','@A'); | |
//===================================================== | |
// while f1>0 do | |
SeLa('CIK'); MRA__('@F1',0,'ECIK'); | |
Len__Str('@F2','@A'); | |
//sss:=Add_Po(length(a)-f1,sss,'0'); | |
WRI_B('@SSS',0); | |
Len__Str('@LA','@A'); | |
SUB__('@LA','@F1'); | |
ADD__POO('@SSS',Ord('0'),'@LA'); | |
PRI__('@R',0); | |
//.................... | |
SeLa('CIK2'); RAV__('@F2',0,'ECIK2');//while f2>0 do | |
Sim__NOM('@A1','@A','@F2');SUB__('@A1',Ord('0')); | |
Sim__NOM('@B1','@B','@F1');SUB__('@B1',Ord('0')); | |
UMN__EDI('@O','@A1','@B1'); | |
ADD__('@O','@R'); | |
PRI__('@O2','@O'); | |
ADD__('@O2',ord('0')); | |
Add__SSI('@SSS','@O2'); | |
UMN__DES('@R','@A1','@B1'); | |
DEC__('@F2'); | |
JMP__('CIK2'); | |
SeLa('ECIK2');//.................... | |
// sss:=chr((r)+ord('0'))+sss; | |
PRI__('@O2','@R'); | |
ADD__('@O2',ord('0')); | |
Add__SSI('@SSS','@O2'); | |
// rez:=sum1(sss,rez); | |
Sum1_CHI('@REZ','@SSS'); | |
// f1:=f1-1; | |
DEC__('@F1'); | |
JMP__('CIK'); | |
SeLa('ECIK'); //------------------------ | |
//===================================================== | |
Len__STR('@L','@REZ'); | |
// t+t+1 | |
Pri__('@T2','@T'); | |
ADD__('@T2','@T2'); | |
INC__('@T2'); | |
//if Length(rez)<t+t+1 then | |
BRa__('@L2','@T2','NEX1'); | |
Add__DOO('@REZ',Ord('0'),'@T2'); | |
SeLa('Nex1'); | |
Pri__('@F',1); | |
Len__Str('@L','@REZ'); | |
PRI__('@ZZZ','@L'); | |
SUB__('@ZZZ','@T'); | |
SUB__('@ZZZ','@T'); | |
SeLa('CIK3'); Bol__('@F','@L','ECIK3'); | |
NRA__('@F','@ZZZ','NEX2'); | |
Sim__Nom('@SIM','@REZ','@F'); | |
ADD__Sim('@REZ2','@SIM'); | |
ADD__Sim('@REZ2',Ord('.')); | |
JMP__('END2'); | |
SeLa('NEX2'); Sim__Nom('@SIM','@REZ','@F'); | |
ADD__Sim('@REZ2','@SIM'); | |
SeLa('END2'); INC__('@F'); | |
JMP__('CIK3'); | |
SeLa('ECIK3'); | |
Nor__Chi('@REZ2'); | |
Cop__Str('@A','@REZ2'); | |
Fre__Str('@SSS'); | |
Fre__Str('@REZ'); | |
Fre__Str('@REZ2'); | |
EndProcedure; | |
end; | |
Procedure Del1Chisel;// Делит строки с числа EAX:EDX без знака | |
begin | |
BeginProcedure('Del1Chisel'); | |
SAV__EAX('@A'); | |
SAV__EDX('@B'); | |
SAV__ECX('@TOCH'); | |
COR__CHI('@T','@A','@B'); | |
Del__Sim('@A',Ord('.')); | |
Del__Sim('@B',Ord('.')); | |
Nor__CHI('@A');ADD__Poo('@A',Ord('0'),'@TOCH'); | |
Nor__CHI('@B'); | |
//---------------------------- | |
Cre__Str('@R'); // Накаплеваемое значение СТРОКА | |
Cre__STr('@PPRE');// Предпологаемое значение СТРОКА | |
Cre__STr('@PRE'); // Предпологаемое значение СТРОКА | |
Cre__STr('@REZ'); // Результат СТРОКА | |
Cre__STr('@REZ2');// Результат СТРОКА | |
Len__Str('@U','@B'); | |
Pri__('@F',1); | |
//---------------------------- | |
SeLA('Cik'); BOL__('@F','@U','ECIK'); | |
Sim__Nom('@SIM','@A','@F'); | |
Add__Sim('@R','@SIM'); | |
INC__('@F'); | |
JMP__('CIK'); | |
SeLa('ECik'); //---------------------------- | |
//============================================================================== | |
//while u<=length(a) do | |
SeLA('Cik2'); Len__Str('@LENA','@A'); | |
BOL__('@U','@LENA','ECIK2'); | |
//if Bol1(r,b) or Rav1(r,b) then | |
MEN1_CHI('@R','@B','NEX1'); | |
//THEN ------------------------- | |
//pre:='0'; | |
Wri_B('@Pre',0);Add__Sim('@PRE',ord('0')); | |
Pri__('@C',0);// c:=0; | |
SeLa('CIK3'); // while men1(sum(pre,b),r) or rav1(sum(pre,b),r) do | |
// ppre:='0';ppre:=Sum('pre',b) | |
Wri_b('@Ppre',0);Add__Sim('@PPRE',Ord('0')); | |
sum1_Chi('@Ppre','@Pre'); | |
sum1_Chi('@Ppre','@B'); | |
BOL1_CHI('@PPRE','@R','ECIK3'); | |
Sum1_Chi('@PRE','@B'); | |
INC__('@C'); | |
JMP__('CIK3');//---------------- | |
SeLa('ECIK3'); | |
Min1_CHI('@R','@PRE');//r:=min1(r,pre); | |
Pri__('@C2',ord('0')); | |
ADD__('@C2','@C'); | |
Add__SIM('@REZ','@C2'); | |
JMP__('NEXE'); | |
SeLa('NEX1'); //ELSE ------------------------- | |
Add__Sim('@REZ',Ord('0')); | |
SeLa('NEXE'); //ENDIF ------------------------- | |
INC__('@U');//u:=u+1; | |
// if u<=length(a) then r:=r+a[u]; | |
Len__Str('@ZZZ','@a'); | |
BOL__('@U','@ZZZ','NNN'); | |
Sim__Nom('@Sim','@A','@u'); | |
Add__Sim('@R','@SIM'); | |
SeLa('NNN'); | |
JMP__('CIK2'); | |
SeLA('ECik2'); | |
//============================================================================== | |
Len__Str('@LEN','@REZ'); | |
Pri__('@TTT','@TOCH'); | |
INC__('@TTT'); | |
BRA__('@LEN','@TTT','NEX2'); | |
ADD__DOO('@REZ',Ord('0'),'@TTT'); | |
SeLa('NEX2'); | |
Len__Str('@LEN','@REZ'); | |
Pri__('@F',1); | |
Pri__('@RT','@LEN'); | |
SUB__('@RT','@TOCH'); | |
SeLa('CIK4'); BOL__('@F','@LEN','ECIK4'); | |
NRA__('@F','@RT','NEX4'); | |
Sim__Nom('@SIM','@REZ','@F'); | |
Add__Sim('@REZ2','@SIM'); | |
Add__Sim('@REZ2',Ord('.')); | |
JMP__('ENEX4'); | |
SeLa('NEX4'); Sim__Nom('@SIM','@REZ','@F'); | |
Add__Sim('@REZ2','@SIM'); | |
SeLa('ENEX4');INC__('@F'); | |
JMP__('CIK4'); | |
SeLa('ECIK4'); | |
Nor__Chi('@REZ2'); | |
Cop__Str('@A','@REZ2'); | |
Fre__Str('@R'); // Накаплеваемое значение СТРОКА | |
Fre__STr('@PPRE');// Предпологаемое значение СТРОКА | |
Fre__STr('@PRE'); // Предпологаемое значение СТРОКА | |
Fre__STr('@REZ'); // Результат СТРОКА | |
Fre__STr('@REZ2');// Результат СТРОКА | |
EndProcedure; | |
end; | |
procedure RavChisel; // ПРоверяет равенство строк с числами EAX:EDX Возвращает EAX | |
Begin | |
BeginProcedure('RavChisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Zna__Chi('@R','@CHI1','@CHI2'); | |
//------------------------------- | |
Nra__('@R',1,'NEX1'); | |
JMP__('NERAVNO'); | |
//------------------------------- | |
SeLa('NEX1'); Nra__('@R',2,'NEX2'); | |
JMP__('NERAVNO'); | |
//------------------------------- | |
SeLa('NEX2'); RAV1_CHI('@CHI1','@CHI2','RAVNO'); | |
SeLa('NERAVNO');PRI__('@REZ',0); | |
JMP__('VIHOD'); | |
SeLa('RAVNO'); PRI__('@REZ',1); | |
SeLa('VIHOD'); LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
procedure BolChisel; // ПРоверяет Больше ли строка с числами EAX:EDX Возвращает EAX | |
Begin | |
BeginProcedure('BolChisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Zna__Chi('@R','@CHI1','@CHI2'); | |
//------------------------------- | |
Nra__('@R',1,'NEX1'); | |
JMP__('MENHE'); | |
//------------------------------- | |
SeLa('NEX1'); Nra__('@R',2,'NEX2'); | |
JMP__('BOLHE'); | |
//------------------------------- | |
SeLa('NEX2'); Bol1_CHI('@CHI1','@CHI2','BOLHE'); | |
SeLa('MENHE');PRI__('@REZ',0); | |
JMP__('VIHOD'); | |
SeLa('BOLHE');PRI__('@REZ',1); | |
SeLa('VIHOD');LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
procedure MenChisel; // ПРоверяет Ментше ли строка с числами EAX:EDX Возвращает EAX | |
Begin | |
BeginProcedure('MenChisel'); | |
SAV__EAX('@CHI1'); | |
SAV__EDX('@CHI2'); | |
Zna__Chi('@R','@CHI1','@CHI2'); | |
//------------------------------- | |
Nra__('@R',1,'NEX1'); | |
JMP__('MENHE'); | |
//------------------------------- | |
SeLa('NEX1'); Nra__('@R',2,'NEX2'); | |
JMP__('BOLHE'); | |
//------------------------------- | |
SeLa('NEX2'); Men1_CHI('@CHI1','@CHI2','MENHE'); | |
SeLa('BOLHE');PRI__('@REZ',0); | |
JMP__('VIHOD'); | |
SeLa('MENHE');PRI__('@REZ',1); | |
SeLa('VIHOD');LOA__EAX('@REZ'); | |
EndProcedure; | |
end; | |
Procedure SumChisel; // Складывает строки с числа EAX:EDX Полное | |
begin | |
BeginProcedure('SumChisel'); | |
SAV__EAX('@A'); | |
SAV__EDX('@B'); | |
Zna__Chi('@Z','@A','@B'); | |
BOL1_CHI('@A','@B','BOL'); | |
MEN1_CHI('@A','@B','MEN'); | |
SeLa('RAV'); //------------------------ | |
RAV__('@Z',1,'RAV1'); | |
RAV__('@Z',2,'RAV2'); | |
RAV__('@Z',0,'RAV0'); | |
SeLa('RAV3'); | |
Sum1_CHI('@a','@b'); | |
ADD__SSI('@a',Ord('-')); | |
JMP__('VIH'); | |
SeLa('RAV1'); | |
Wri_b('@a',0); | |
ADD__Sim('@a',Ord('0')); | |
JMP__('VIH'); | |
SeLa('RAV2'); | |
Wri_b('@a',0); | |
ADD__Sim('@a',Ord('0')); | |
JMP__('VIH'); | |
SeLa('RAV0'); | |
Sum1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('BOL'); //------------------------ | |
RAV__('@Z',1,'BOL1'); | |
RAV__('@Z',2,'BOL2'); | |
RAV__('@Z',0,'BOL0'); | |
SeLa('BOL3'); | |
Sum1_CHI('@a','@b'); | |
ADD__SSI('@a',Ord('-')); | |
JMP__('VIH'); | |
SeLa('BOL1'); | |
Min1_CHI('@a','@b'); | |
ADD__SSI('@a',ord('-')); | |
JMP__('VIH'); | |
SeLa('BOL2'); | |
Min1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('BOL0'); | |
Sum1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('MEN'); //------------------------ | |
RAV__('@Z',1,'MEN1'); | |
RAV__('@Z',2,'MEN2'); | |
RAV__('@Z',0,'MEN0'); | |
SeLa('MEN3'); | |
Sum1_CHI('@a','@b'); | |
ADD__SSI('@a',Ord('-')); | |
JMP__('VIH'); | |
SeLa('MEN1'); | |
Min1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('MEN2'); | |
Min1_CHI('@a','@b'); | |
ADD__SSI('@a',Ord('-')); | |
JMP__('VIH'); | |
SeLa('MEN0'); | |
Sum1_CHI('@a','@b'); | |
SeLa('VIH'); | |
EndProcedure; | |
end; | |
Procedure MinChisel; // Вычитает строки с числа EAX:EDX Полное | |
begin | |
BeginProcedure('MinChisel'); | |
SAV__EAX('@A'); | |
SAV__EDX('@B'); | |
Zna__Chi('@Z','@A','@B'); | |
BOL1_CHI('@A','@B','BOL'); | |
MEN1_CHI('@A','@B','MEN'); | |
SeLa('RAV'); //------------------------ | |
RAV__('@Z',1,'RAV1'); | |
RAV__('@Z',2,'RAV2'); | |
RAV__('@Z',0,'RAV0'); | |
SeLa('RAV3'); | |
Wri_B('@A',0); | |
ADD__Sim('@a',Ord('0')); | |
JMP__('VIH'); | |
SeLa('RAV1'); | |
Sum1_CHI('@a','@b'); | |
ADD__SSI('@a',ord('-')); | |
JMP__('VIH'); | |
SeLa('RAV2'); | |
Sum1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('RAV0'); | |
Wri_B('@A',ord('0')); | |
ADD__Sim('@a',Ord('0')); | |
JMP__('VIH'); | |
SeLa('BOL'); //------------------------ | |
RAV__('@Z',1,'BOL1'); | |
RAV__('@Z',2,'BOL2'); | |
RAV__('@Z',0,'BOL0'); | |
SeLa('BOL3'); | |
Min1_CHI('@a','@b'); | |
ADD__SSi('@a',ord('-')); | |
JMP__('VIH'); | |
SeLa('BOL1'); | |
Sum1_CHI('@a','@b'); | |
ADD__SSI('@a',ord('-')); | |
JMP__('VIH'); | |
SeLa('BOL2'); | |
Sum1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('BOL0'); | |
Min1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('MEN'); //------------------------ | |
RAV__('@Z',1,'MEN1'); | |
RAV__('@Z',2,'MEN2'); | |
RAV__('@Z',0,'MEN0'); | |
SeLa('MEN3'); | |
Min1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('MEN1'); | |
Sum1_CHI('@a','@b'); | |
ADD__SSI('@a',ord('-')); | |
JMP__('VIH'); | |
SeLa('MEN2'); | |
Sum1_CHI('@a','@b'); | |
JMP__('VIH'); | |
SeLa('MEN0'); | |
Min1_CHI('@a','@b'); | |
ADD__SSI('@a',ord('-')); | |
SeLa('VIH'); | |
EndProcedure; | |
end; | |
Procedure UmnChisel; // Умножение строки с числа EAX:EDX Полное | |
begin | |
BeginProcedure('UmnChisel'); | |
SAV__EAX('@A'); | |
SAV__EDX('@B'); | |
Zna__Chi('@Z','@A','@B'); | |
NRA__('@Z',3,'NEX3'); | |
UMN1_CHI('@A','@B'); | |
JMP__('VIH'); | |
SeLa('NEX3'); | |
NRA__('@Z',1,'NEX4'); | |
UMN1_CHI('@A','@B'); | |
Add__SSI('@A',Ord('-')); | |
JMP__('VIH'); | |
SeLa('NEX4'); | |
NRA__('@Z',2,'NEX5'); | |
UMN1_CHI('@A','@B'); | |
Add__SSI('@A',ord('-')); | |
JMP__('VIH'); | |
SeLa('NEX5'); | |
UMN1_CHI('@A','@B'); | |
SeLa('VIH'); | |
EndProcedure; | |
end; | |
Procedure DelChisel; // Деление строки с числа EAX:EDX Полное | |
begin | |
BeginProcedure('DelChisel'); | |
SAV__EAX('@A'); | |
SAV__EDX('@B'); | |
Zna__Chi('@Z','@A','@B'); | |
NRA__('@Z',3,'NEX3'); | |
DEL1_CHI('@A','@B'); | |
JMP__('VIH'); | |
SeLa('NEX3'); | |
NRA__('@Z',1,'NEX4'); | |
DEL1_CHI('@A','@B'); | |
Add__SSI('@A',Ord('-')); | |
JMP__('VIH'); | |
SeLa('NEX4'); | |
NRA__('@Z',2,'NEX5'); | |
DEL1_CHI('@A','@B'); | |
Add__SIM('@A',Ord('-')); | |
JMP__('VIH'); | |
SeLa('NEX5'); | |
DEL1_CHI('@A','@B'); | |
SeLa('VIH'); | |
EndProcedure; | |
end; | |
{$ENDIF} | |
{ Секция Описания элементов програмым } {$IFDEF Tim} | |
Procedure InitMem; // Инициализация памяти | |
Begin | |
BeginProcedure('InitMem'); | |
Pri__('@f1','TrMe'); | |
Inc__('TrMe'); | |
Pri__('@f2',API__STEK-1000); | |
SeLa('Cikl'); RAV__('@f1','@f2','VIHOD'); | |
Wri_b('@f1',0); | |
inc__('@f1'); | |
Jmp__('Cikl'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
Procedure TEl.Del; | |
var | |
pr,ne:Tel; | |
begin | |
pr:=pre; | |
ne:=nex; | |
if pr<>nil then pr.nex:=ne; | |
if ne<>nil then ne.pre:=pr; | |
if rod.blo=self then rod.blo:=ne; | |
end; | |
function TEl.Lst:TEl; | |
var | |
rez:tel; | |
begin | |
rez:=nil; | |
if blo<>nil then | |
begin | |
rez:=blo; | |
while rez.nex<>nil do rez:=rez.nex; | |
end; | |
Lst:=rez; | |
end; | |
Constructor TEl.Create;// Создает элемент | |
begin | |
Rod:=nil; // Предок | |
Pre:=nil; // предыдущий эллемент | |
Nex:=nil; // Следующий элемент | |
blo:=nil; | |
MaxIdEl:=MaxIdEl+1; | |
end; | |
Function TEl.add(el:Tel):Tel;// Добавляет едемент в конец списка | |
var | |
pr,ne:Tel; | |
begin | |
pr:=el.Pre; | |
ne:=el.Nex; | |
if el.Pre<>nil then el.pre.nex:=ne; | |
if el.Nex<>nil then el.nex.pre:=pr; | |
If(el.Rod<>nil)and (el.rod.blo=el) then | |
if(el.nex<>nil) | |
then el.rod.blo:=el.nex | |
else el.rod.blo:=nil; | |
el.pre:=lst; | |
if lst<>nil then lst.nex:=el else blo:=el; | |
el.Rod:=Self; | |
el.nex:=nil; | |
end; | |
Function TEl.addS(el:Tel):Tel;// Добавляет едемент в Начало списка | |
var | |
pr,ne:Tel; | |
begin | |
pr:=el.Pre; | |
ne:=el.Nex; | |
if el.Pre<>nil then el.pre.nex:=ne; | |
if el.Nex<>nil then el.nex.pre:=pr; | |
If(el.Rod<>nil)and (el.rod.blo=el) then | |
if(el.nex<>nil) | |
then el.rod.blo:=el.nex | |
else el.rod.blo:=nil; | |
el.Rod:=Self; | |
el.pre:=nil; | |
el.nex:=lst; | |
if blo<>nil then | |
begin | |
el.blo.pre:=el; | |
el.nex:=blo; | |
end; | |
blo:=el; | |
end; | |
Function TEl.add(s:AnsiString;t:Byte):Tel;// Создает и Добавляет едемент в конец списка | |
var | |
rez:Tel; | |
begin | |
rez:=Tel.create; | |
rez.axt:=AnsiUpperCase(s); | |
rez.zna:=s; | |
rez.Tis:=t; | |
add(rez); | |
add:=rez; | |
end; | |
Function TEl.Cop(iRod,iPre:Tel):Tel;// Копирует элемент | |
var | |
rez:Tel; | |
f:Longint; | |
pr,ne:Tel; | |
begin | |
rez:=Tel.create; | |
rez.Axt:=Axt; | |
rez.Zna:=Zna; | |
rez.Tis:=Tis; | |
rez.Fun:=Fun; | |
rez.Rod:=iRod; | |
rez.Pre:=iPre; | |
rez.Nex:=Nil; | |
rez.Blo:=Nil; | |
//================================ | |
if blo<>nil then | |
begin | |
rez.blo:=blo.cop(rez,nil); | |
ne:=blo.nex;// следующий | |
pr:=rez.blo; | |
while ne<>nil do | |
begin | |
pr.nex:=ne.cop(rez,pr); | |
pr.Nex.Pre:=pr; | |
ne:=ne.nex; | |
pr:=pr.nex; | |
end; | |
end; | |
Cop:=Rez; | |
end; | |
Procedure Tel.Cle;// Очищает элемент | |
var | |
l,l2:Tel; | |
begin | |
l2:=blo; | |
while l2<>nil do | |
begin | |
l:=l2; | |
l.Cle; | |
l2:=l.nex; | |
l.free; | |
end; | |
end; | |
Procedure CompileSc(s1,s2:Ansistring;El:Tel);// Чтение скобок | |
var | |
f:Longint; | |
NK,PE,NE:Tel; | |
begin | |
f:=1; | |
NK:=El;// куда добавлять | |
PE:=El.Blo;// ПОслдений эллемент | |
While pe<>nil do | |
begin | |
ne:=pe.nex; | |
if el<>nk then | |
if pe.Axt<>s2 then NK.add(PE); | |
if PE.Axt=s1 then NK:=PE;// Куда добавлять | |
if PE.Axt=s2 then begin NK:=NK.Rod; | |
pe.del;end;// Вернуться на уровень вверх | |
pe:=ne; | |
end; | |
end; | |
Procedure Compileti(el:Tel);// Умножение деление | |
var | |
l:TEl; | |
begin | |
l:=el.blo; | |
while l<>nil do | |
begin | |
if l.blo<>nil then Compileti(l); | |
if l.Axt=':' then | |
begin | |
el.tip:=el.nex.axt; | |
l:=l.nex.nex; | |
el.del; | |
el.nex.del; | |
end else l:=l.nex; | |
end; | |
end; | |
Procedure CompileMa(s:ansistring;el:Tel);// Умножение деление | |
var | |
l:TEl; | |
begin | |
l:=el.blo; | |
while l<>nil do | |
begin | |
if l.blo<>nil then CompileMa(s,l); | |
if est(s,l.Axt) then | |
begin | |
if l.pre<>nil then CompileMa(s,l.pre); | |
if l.nex<>nil then CompileMa(s,l.nex); | |
l.add(l.pre); | |
l.add(l.nex); | |
end; | |
l:=l.nex; | |
end; | |
end; | |
Procedure Podgotovk(el:Tel);// Удаление ненужных символов замена begin end на {} | |
var | |
l:TEl; | |
begin | |
l:=el.blo; | |
while l<>nil do | |
begin | |
if l<>nil then Podgotovk(l); | |
if (l.axt ='BEGIN') then l.axt:='{'; | |
if (l.axt ='END') then l.axt:='}'; | |
l:=l.Nex; | |
end; | |
end; | |
Procedure CompilePa(el:Tel);// Вложение параметров функций | |
var | |
l:Tel; | |
begin | |
l:=el.blo; | |
while l<>nil do | |
begin | |
if (l.Tis=Ti_Ope) and (l.nex<>nil) then | |
if (l.nex.axt='(') then l.add(l.nex) else | |
if (l.blo=nil) then l.add('(',Ti_Zna); | |
if (l.blo<>nil) then CompilePa(l); | |
l:=l.nex; | |
end; | |
end; | |
Procedure CompileBL(el:Tel);// Вложение Блоков {} | |
var | |
l:tel; | |
begin | |
l:=el.blo; | |
while l<>nil do | |
begin | |
if(l.Tis=Ti_Ope)and (l.nex<>nil) then | |
if (l.nex.AXT='{') then | |
begin | |
l.fun:=true; | |
l.add(l.nex); | |
end else l.add('{',Ti_Zna); | |
if l.blo<>nil then CompileBL(l); | |
l:=l.nex; | |
end; | |
end; | |
Procedure ProgCompile(El:Tel);// ПРеоразует сроку в набор елементов | |
begin | |
Podgotovk(el); // преобразование begin end в { } | |
CompileSc('(',')',el); // Вложение Cкобок | |
CompileSc('{','}',el); // Вложение Блоков | |
CompilePa(el); // вложение параметров | |
CompileTi(el); // вложение Типов | |
CompileBL(el); // вложение Блоков в операторы | |
Compilema('*,/',el); // Умножение деление | |
Compilema('+,-',el); // Сложение вычитание | |
Compilema('>,<,=,>=,<=,!=',el); // Больше меньше | |
Compilema(':=',el); // ПРисваивание | |
end; | |
Function ProgRead(Var UK,LE:Longint;S:Ansistring):Tel;// Разбивает строку на токены | |
var | |
rez:Tel; | |
begin | |
Rez:=Tel.create; | |
while UK<=LE do | |
If EtoOpe(UK,LE,S) Then rez.add(ReadOpe(UK,LE,S),Ti_Ope) else | |
If EtoCif(UK,LE,S) Then rez.add(ReadCif(UK,LE,s),Ti_Cif) else | |
If EtoKav(UK,LE,S) Then rez.add(ReadKav(UK,LE,s),Ti_Kav) else | |
If EtoRem(UK,LE,S) Then ReadRem(UK,LE,s) else | |
If EtoZn2(UK,LE,S) Then rez.add(ReadZn2(UK,LE,s),Ti_Zna) else | |
If EtoZn1(UK,LE,S) Then rez.add(ReadZn1(UK,LE,s),Ti_Zna) else | |
Uk:=Uk+1; | |
ProgRead:=Rez; | |
end; | |
//============================================================================== | |
//============================================================================== | |
//============================================================================== | |
Procedure ELE__(a,b:String;c:Longword); | |
begin | |
PRI__('@QWE__ELE',c);//PE:=El.Blo; ПОслдений эллемент | |
ADD__('@QWE__ELE',b); | |
REA_W(a,'@QWE__ELE'); | |
end; | |
Procedure ELE_B(a,b:String;c:Longword); | |
begin | |
PRI__('@QWE__ELE',c);//PE:=El.Blo; ПОслдений эллемент | |
ADD__('@QWE__ELE',b); | |
REA_B(a,'@QWE__ELE'); | |
end; | |
Procedure Cre__Ele(a:String); // Создает Новый елемент | |
begin | |
cal__('GetElement'); | |
SAV__EAX(a); | |
end; | |
Procedure Fre__Ele(a:String); // Удаляет елемент и все вложеные элементы | |
begin | |
Loa__EAX(a); | |
cal__('FreElement'); | |
end; | |
Procedure Add__Ele(a,b:String); // Добавляет элемент в список | |
begin | |
LOA__EAX(a); | |
LOA__EDX(b); | |
CAL__('AddElement'); | |
end; | |
procedure Del__Ele(a:String); // Удаляет из списка отсоеденяет элемент | |
begin | |
LOA__EAX(a); | |
CAL__('DelElement'); //pe.del; | |
end; | |
Procedure Sad__Ele(a,b:String;c:Byte); // Создает и добюавлет элемент | |
begin | |
Loa__EAX(a); | |
Loa__EDX(b); | |
PRI__('@QWE_TIP',c); | |
LOA__ECX('@QWE_TIP'); | |
CAL__('SAdElement'); | |
end; | |
Procedure Lst__Ele(a,b:String); // Ищит послеждий элемент | |
begin | |
LOA__EAX(b); | |
CAL__('LstElement'); | |
SAV__EAX(a); | |
end; | |
Procedure Cop__ELE(iEl,iRod,iPre,rez:String);// создает копию элемента | |
begin | |
LOA__EAX(iEl); | |
LOA__EDX(iRod); | |
LOA__ECX(iPre); | |
CAL__('CopElement'); | |
SAV__EAX(rez); | |
end; | |
Procedure FreElement;// освоббождает элемент | |
begin | |
BeginProcedure('FreElement'); | |
SAV__EAX('@iEl');// тип элемента | |
ELE__('@AXT','@iEl',EL_AXT); | |
RAV__('@AXT',0,'Fre_Ele_NEX1'); | |
Fre__Str('@AXT'); | |
SeLa('Fre_Ele_NEX1'); | |
ELE__('@ZNA','@iEl',EL_ZNA); | |
RAV__('@ZNA',0,'Fre_Ele_NEX2'); | |
Fre__Str('@ZNA'); | |
SeLa('Fre_Ele_NEX2'); | |
ELE__('@BLO','@iEl',EL_BLO); | |
RAV__('@BLO',0,'Fre_Ele_NEX3'); | |
LOA__EAX('@BLO'); | |
CAL__('FreElement'); | |
SeLa('Fre_Ele_NEX3'); | |
ELE__('@NEX','@iEl',EL_NEX); | |
RAV__('@NEX',0,'Fre_Ele_NEX4'); | |
LOA__EAX('@NEX'); | |
CAL__('FreElement'); | |
SeLa('Fre_Ele_NEX4'); | |
DEC__('@iEl'); | |
WRI_B('@iEl',0); | |
EndProcedure; | |
end; | |
procedure GetElement;// ПРоцедура создает Новый элемент в памяти | |
begin | |
BeginProcedure('GetElement'); | |
// Ищим свободное зерно | |
Pri__('@Fin','TrMe'); | |
SeLa('Cikl'); REa_b('@Del','@Fin'); | |
RAV__('@Del',0,'Nex'); | |
Add__('@FIN',Zerno); | |
JMP__('CIKL'); | |
SeLa('NEX'); Wri_B('@Fin',2);INC__('@Fin'); // записываем что этот участок памяти вделен под Елемент | |
PRI__('@REZ','@Fin'); // Записываем адрес Елемента | |
Wri_B('@Fin',1);INC__('@Fin'); // Записываем RES; | |
Wri_B('@Fin',0);INC__('@Fin'); // Записываем TIS; | |
Wri_B('@Fin',0);INC__('@Fin'); // Записываем FUN; | |
Wri_B('@Fin',0);INC__('@Fin'); // Записываем ERR; | |
Cre__Str('@AXT');Wri_W('@Fin','@AXT');INC_W('@Fin');// Записываем AXT; | |
Cre__Str('@ZNA');Wri_W('@Fin','@ZNA');INC_W('@Fin');// Записываем ZNA; | |
Wri_W('@Fin','@REZ');INC_W('@Fin');// Записываем SAM; | |
Wri_W('@Fin',0);INC_W('@Fin'); // Записываем ROD; | |
Wri_W('@Fin',0);INC_W('@Fin'); // Записываем PRE; | |
Wri_W('@Fin',0);INC_W('@Fin'); // Записываем NEX; | |
Wri_W('@Fin',0);INC_W('@Fin'); // Записываем BLO; | |
SeLa('VIHOD');Loa__EAX('@REZ'); // возвращаем результат | |
EndProcedure; | |
end; | |
Procedure LstElement;// Eax Eax Последний элемент | |
begin | |
BeginProcedure('LstElement'); | |
SAV__EAX('@EL'); | |
PRI__('@EAX',0); | |
ADD__('@EL',EL_BLO); | |
REA_W('@BLO','@El'); | |
RAV__('@BLO',0,'VIHOD'); | |
PRI__('@EAX','@BLO'); | |
PRI__('@LLL','@BLO'); | |
SeLa('CIKL'); ADD__('@LLL',EL_NEX); | |
REA_W('@LLL','@LLL'); | |
RAV__('@LLL',0,'VIHOD'); | |
PRI__('@EAX','@LLL'); | |
JMP__('CIKL'); | |
SeLa('VIHOD'); LOA__EAX('@EAX'); | |
EndProcedure; | |
end; | |
Procedure AddElement;// EAX:Родитель EDX:Добавляемый элемент | |
begin | |
BeginProcedure('AddElement'); | |
SAV__EAX('@ROD'); | |
SAV__EDX('@EL'); | |
LOA__EAX('@EL'); | |
CAL__('DelElement'); | |
// Устанавливаем родителя | |
PRI__('@AROD',EL_ROD); | |
ADD__('@AROD','@EL'); | |
WRI_W('@AROD','@ROD'); | |
Lst__ELE('@LLL','@ROD'); | |
RAV__('@LLL',0,'BLO'); | |
// ПРисоеденяем к последнему элементу | |
PRI__('@APRE',EL_PRE); | |
ADD__('@APRE','@EL'); | |
WRI_W('@APRE','@LLL'); | |
PRI__('@ANEX',EL_NEX); | |
ADD__('@ANEX','@LLL'); | |
WRI_W('@ANEX','@El'); | |
JMP__('VIHOD'); | |
SeLa('BLO'); // Добавляем вложеный элемент | |
PRI__('@ABLO',EL_BLO); | |
ADD__('@ABLO','@ROD'); | |
WRI_W('@ABLO','@EL'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
Procedure SadElement;// EAX:Родитель EDX:SLOVO EСX: Тип Элемента | |
begin | |
BeginProcedure('SAdElement'); | |
SAV__EAX('@ROD'); | |
SAV__EDX('@SLO'); | |
SAV__ECX('@TIP'); | |
Cre__Ele('@EL'); | |
// Записываем тип элемента | |
PRI__('@ATIS',el_TIS); | |
ADD__('@ATIS','@EL'); | |
WRI_B('@ATIS','@TIP'); | |
// Записываем AXT элемента | |
ELE__('@AXT','@El',EL_AXT); | |
Cop__Str('@AXT','@SLO'); | |
// Записываем ZNA элемента | |
ELE__('@ZNA','@El',EL_ZNA); | |
Cop__Str('@ZNA','@SLO'); | |
LOA__EAX('@ROD'); | |
LOA__EDX('@EL'); | |
CAL__('AddElement'); | |
SeLa('VIHOD'); LOA__EAX('@EL'); | |
EndProcedure; | |
end; | |
procedure DelElement;// EAX удаляемый елемент | |
begin | |
BeginProcedure('DelElement'); | |
SAV__EAX('@EL'); | |
// Адрес Следующего элемента | |
PRI__('@ANEX',EL_NEX); | |
ADD__('@ANEX','@EL'); | |
REA_W('@NEX','@ANEX'); | |
WRI_W('@ANEX',0); | |
// Адрес Предыдущего элемента | |
PRI__('@APRE',EL_PRE); | |
ADD__('@APRE','@EL'); | |
REA_W('@PRE','@APRE'); | |
WRI_W('@APRE',0); | |
// Адрес родителя | |
PRI__('@AROD',EL_ROD); | |
ADD__('@AROD','@EL'); | |
REA_W('@ROD','@AROD'); | |
WRI_W('@AROD',0); | |
// Установка в предыдущем элементе следующего | |
RAV__('@PRE',0,'NEX1'); | |
PRI__('@ZPRE',EL_NEX); | |
ADD__('@ZPRE','@PRE'); | |
WRI_W('@ZPRE','@NEX'); | |
SeLa('NEX1'); // Установка в Следующем элементе предыдущего | |
RAV__('@NEX',0,'NEX2'); | |
PRI__('@ZNEX',EL_PRE); | |
ADD__('@ZNEX','@NEX'); | |
WRI_W('@ZNEX','@PRE'); | |
SeLa('NEX2'); // Сброс родителя | |
RAV__('@ROD',0,'VIHOD'); | |
PRI__('@ABLO',EL_BLO); | |
ADD__('@ABLO','@ROD'); | |
REA_W('@BLO','@ABLO'); | |
NRA__('@BLO','@EL','VIHOD'); | |
WRI_W('@ABLO','@NEX'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
procedure CopElement;// Создает копию элемента со всеми вложеными элементами их тоже копирует | |
begin | |
BeginProcedure('CopElement'); | |
SAV__EAX('@EL'); | |
SAV__EDX('@iRod'); | |
SAV__ECX('@iPre'); | |
Cre__ELE('@REZ'); | |
//=========================== | |
ELE__('@AXT1','@REZ',EL_AXT); | |
ELE__('@AXT2','@EL',EL_AXT); | |
Cop__Str('@AXT1','@AXT2'); | |
//=========================== | |
ELE__('@ZNA1','@REZ',EL_ZNA); | |
ELE__('@ZNA2','@EL',EL_ZNA); | |
Cop__Str('@ZNA1','@ZNA2'); | |
//=========================== | |
ELE_B('@TIS2','@el',EL_TIS); | |
PRI__('@ATIS','@rez'); | |
ADD__('@ATIS',EL_TIS); | |
WRI_B('@ATIS','@TIS2'); | |
//=========================== | |
ELE_B('@FUN2','@el',EL_FUN); | |
PRI__('@AFUN','@rez'); | |
ADD__('@AFUN',EL_FUN); | |
WRI_B('@AFUN','@FUN2'); | |
//=========================== | |
PRI__('@AROD','@rez'); | |
ADD__('@AROD',EL_ROD); | |
WRI_W('@AROD','@iROD'); | |
//=========================== | |
PRI__('@APRE','@rez'); | |
ADD__('@APRE',EL_PRE); | |
WRI_W('@APRE','@iPre'); | |
//=========================== | |
PRI__('@ANEX','@rez'); | |
ADD__('@ANEX',EL_Nex); | |
WRI_W('@ANEX',0); | |
//=========================== | |
PRI__('@ABLO','@rez'); | |
ADD__('@ABLO',EL_BLO); | |
WRI_W('@ABLO',0); | |
// if blo<>nil then begin ================================== | |
ELE__('@BLO','@el',EL_BLO); | |
RAV__('@BLO',0,'VIHOD'); | |
// rez.blo:=blo.cop(rez,nil); | |
LOA__EAX('@Blo'); | |
LOA__EDX('@REZ'); | |
LOA__ECX(0); | |
CAL__('CopElement'); | |
SAV__EAX('@Blo'); | |
PRI__('@ABLO',EL_BLO); | |
ADD__('@ABLO','@REZ'); | |
WRI_W('@ABLO','@Blo'); | |
PRI__('@PR','@Blo'); //pr:=rez.blo; | |
//-------------------------- | |
//ne:=blo.nex;// следующий | |
ELE__('@BLO','@el',EL_BLO); | |
ELE__('@NE','@BLO',EL_NEX); | |
//while ne<>nil do | |
SeLa('CIK1'); Rav__('@NE',0,'VIHOD'); | |
//pr.nex:=ne.cop(rez,pr); | |
LOA__EAX('@NE'); | |
LOA__EDX('@REZ'); | |
LOA__ECX('@PR'); | |
CAL__('CopElement'); | |
SAV__EAX('@NEX'); | |
PRI__('@ANEX','@PR'); | |
ADD__('@ANEX',El_NEX); | |
WRI_W('@ANEX','@NEX'); | |
// ......... | |
//pr.Nex.Pre:=pr; | |
PRI__('@APRE','@NEX'); | |
ADD__('@APRE',el_PRE); | |
WRi_W('@APRE','@PR'); | |
ELE__('@NE','@NE',EL_NEX); | |
ELE__('@PR','@PR',EL_NEX); | |
JMP__('CIK1'); | |
SeLa('ECIK1'); | |
// END Cop:=Rez;============================================= | |
SeLa('VIHOD'); LOA__EAX('@REZ'); | |
EndProcedure; | |
{ Function TEl.Cop(iRod,iPre:Tel):Tel; | |
var | |
rez:Tel; | |
f:Longint; | |
pr,ne:Tel; | |
begin | |
rez:=Tel.create; | |
rez.Axt:=Axt; | |
rez.Zna:=Zna; | |
rez.Tis:=Tis; | |
rez.Fun:=Fun; | |
rez.Rod:=iRod; | |
rez.Pre:=iPre; | |
rez.Nex:=Nil; | |
rez.Blo:=Nil; | |
//================================ | |
if blo<>nil then | |
begin | |
rez.blo:=blo.cop(rez,nil); | |
pr:=rez.blo; | |
ne:=blo.nex;// следующий | |
while ne<>nil do | |
begin | |
pr.nex:=ne.cop(rez,pr); | |
pr.Nex.Pre:=pr; | |
ne:=ne.nex; | |
pr:=pr.nex; | |
end; | |
end; | |
Cop:=Rez; | |
end; | |
} | |
end; | |
{$ENDIF} | |
{ Секция для Интерпретации програмым } {$IFDEF Tim} | |
Constructor TProg.Create; | |
begin | |
GEl:=Nil; | |
end; | |
Procedure TProg.Clear; | |
begin | |
if Gel<>Nil Then | |
begin | |
Gel.cle; | |
Gel.Free; | |
Gel:=Nil; | |
end; | |
end; | |
// Ищит функцию iNam:Ansistring; поиск наружу и в параметрах | |
function FindFuncN(iEl:TEl;n:ansistring):Tel; | |
var | |
l,REz:Tel; | |
begin | |
rez:=Nil; | |
if (iEl.fun)and (iEl.Axt=n) then rez:=iEl; | |
l:=iEl; | |
while (l<>nil) and (rez=nil) do | |
begin | |
if (l.Tis=Ti_Ope) and | |
(l.fun) and | |
(l.Axt=n) Then rez:=l; | |
l:=l.pre; | |
end; | |
if (rez=nil) and (iEl.rod<>nil) and (iEl.rod.fun) Then | |
begin | |
l:=iEl.rod.blo.blo; | |
while (REZ=NIL) AND (l<>nil) do | |
begin | |
if l.Axt=n then rez:=l; | |
l:=l.nex; | |
end; | |
end; | |
if (rez=nil) and (iEl.Rod<>Nil) Then rez:=FindFuncN(iEl.Rod,n); | |
FindFuncN:=rez; | |
end; | |
Procedure TProg.TRRunS(el:Tel);// исполняет структуру | |
var | |
l:TEl; | |
begin | |
l:=el.blo; | |
While l<>nil do | |
begin | |
if Not l.fun then TrRun(l); | |
l:=l.nex; | |
end; | |
end; | |
Procedure TProg.TRRun(el:Tel); // выполняет кон команду | |
var | |
l1,l2:TEl; | |
Fun,ru:Tel; | |
begin | |
if (el.Axt='PRINT') Then TRCON(el) else | |
if (el.Axt='WHILE') Then TRWHI(el) else | |
if (el.Axt='IF' ) Then TRUSL(el) else | |
if (el.Axt='||' ) Then TRILI(el) else | |
if (el.Axt='&&' ) Then TRIII(el) else | |
if (el.Axt='*' ) Then TRUMN(el) else | |
if (el.Axt='/' ) Then TRDEL(el) else | |
if (el.Axt='+' ) Then TRPLU(el) else | |
if (el.Axt='-' ) Then TRMIN(el) else | |
if (el.Axt='=' ) Then TRRAV(el) else | |
if (el.Axt='>' ) Then TRBOL(el) else | |
if (el.Axt='<' ) Then TRMEN(el) else | |
if (el.Axt='<>' ) Then TRNER(el) else | |
if (el.Axt='!=' ) Then TRNER(el) else | |
if (el.Axt='>=' ) Then TRBRA(el) else | |
if (el.Axt='<=' ) Then TRMRA(el) else | |
if (el.Axt=':=' ) Then TRPRI(el) else | |
if (el.Axt='(' ) Then TrSCO(el) else | |
if (el.Axt='{' ) Then TrRuns(el) else | |
if (el.Tis=Ti_Ope) Then | |
begin | |
fun:=FindFuncN(el,el.Axt); | |
if fun<>nil then | |
begin | |
ru:=fun.cop(el.Rod,El.Pre); | |
if el.blo<>nil then | |
TrRuns(El.blo);//Вычисляем параметры | |
if (ru.blo<>nil) and (ru.blo.blo<>nil) and | |
(el.blo<>nil) and (el.blo.blo<>nil) then | |
begin | |
l1:=ru.blo.blo; | |
l2:=el.blo.blo; | |
while (l1<>nil) and (l2<>nil) do | |
begin | |
l1.Zna:=l2.Zna; | |
l1:=l1.nex; | |
l2:=l2.nex; | |
end; | |
end; | |
// Если есть исполнительный блок | |
if (Ru.blo<>nil) and (Ru.blo.nex<>nil) then TrRuns(Ru.blo.nex); | |
el.Zna:=Ru.zna; | |
Ru.Cle; | |
ru.Free; | |
end else | |
el.Err:='Не обнаржена переменная'+el.Axt; | |
end | |
else | |
el.Err:='Неопределено'; | |
end; | |
Procedure TProg.TrRun(s:Ansistring); | |
var | |
el:Tel; | |
uk,le:Longint; | |
begin | |
Uk:=1;le:=Length(s); | |
el:=ProgRead(uk,le,s);// Разбивает скрипт на составные части | |
ProgCompile(el); // Формирует исполнительнгую структуру | |
TRRunS(el); // Выполнение скрипта | |
Gel:=el; | |
end; | |
Procedure TProg.TRSCO(iel:Tel); | |
var | |
l:TEl; | |
rez:Ansistring; | |
begin | |
rez:=''; | |
l:=Iel.Blo; | |
while l<>nil do | |
begin | |
trRun(l); | |
rez:=rez+l.zna; | |
l:=l.nex; | |
end; | |
iel.zna:=rez; | |
end; | |
Procedure TProg.TRCON(iel:Tel); | |
var | |
l:Tel; | |
begin | |
l:=iel.Blo; | |
while l<>nil do | |
begin | |
TrRun(l); | |
Con:=Con+l.zna; | |
L:=l.nex; | |
end; | |
Con:=Con+chr(13)+chr(10); | |
end; | |
Procedure TProg.TRWHI(iel:Tel); | |
begin | |
if iel.blo=nil | |
Then iel.Err:='(Не Верная конструкция ПОКА)' | |
else | |
begin | |
TrRun(iel.blo); | |
WHile iel.blo.zna='1' do | |
begin | |
if iel.blo.nex=nil | |
then iel.Err:='(Не Верная конструкция ПОКА)' | |
else TrRun(iel.blo.nex); | |
TrRun(iel.blo); | |
end; | |
end | |
end; | |
Procedure TProg.TRUSL(iel:Tel); | |
begin | |
TrRun(iel.Blo); | |
if iel.blo=nil then iel.err:='Не вероое условие' else | |
if iel.Blo.zna='1' then TrRun(iel.Blo.nex) else | |
if iel.nex.nex<>nil then TrRun(iel.Blo.nex.nex); | |
end; | |
Procedure TProg.TRUMN(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if Not EtoCif(1,length(iel.blo.zna),iel.blo.zna) | |
then iel.blo.Err:='(Не верное значение)' else | |
if Not EtoCif(1,length(iel.blo.nex.zna),iel.blo.nex.zna) | |
then iel.blo.nex.Err:='(Не верное значение)' else | |
iel.zna:=FloatToStr(StrToFloat(iel.blo.zna)*StrToFloat(iel.blo.nex.zna)) | |
end; | |
end; | |
Procedure TProg.TRDEL(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if Not EtoCif(1,length(iel.Blo.zna),iel.Blo.zna) then iel.Blo.Err:='(Не верное значение)' else | |
if Not EtoCif(1,length(iel.blo.nex.zna),iel.Blo.nex.zna)then iel.Blo.Nex.Err:='(Не верное значение)'else | |
if StrToFloat(iel.blo.nex.zna)=0 Then iel.blo.nex.Err:='(Деление на ноль)' else | |
iel.Zna:=FloatToStr(StrToCifra(iel.Blo.zna)/StrToCifra(iel.Blo.nex.zna)) | |
end; | |
end; | |
Procedure TProg.TRPLU(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if EtoCif(1,length(iel.Blo.zna),iel.Blo.zna) and EtoCif(1,length(iel.Blo.nex.zna),iel.Blo.nex.zna) | |
Then | |
Begin | |
iel.zna:=FloatToStr(StrToFloat(iel.Blo.zna)+StrToFloat(iel.Blo.nex.zna)) | |
end | |
Else | |
begin | |
iel.zna:=iel.Blo.zna+iel.Blo.nex.zna | |
end; | |
end; | |
end; | |
Procedure TProg.TRMIN(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if Not EtoCif(1,length(iel.blo.zna),iel.blo.zna) then iel.blo.Err:='(Не верное значение)' else | |
if Not EtoCif(1,length(iel.blo.nex.zna),iel.blo.nex.zna) then iel.blo.nex.Err:='(Не верное значение)' else | |
iel.zna:=FloatToStr(StrToFloat(iel.blo.zna)-StrToFloat(iel.blo.nex.zna)) | |
end; | |
end; | |
Procedure TProg.TRRAV(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if iel.Blo.zna=iel.Blo.nex.zna | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end; | |
end; | |
Procedure TProg.TRBOL(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if EtoCif(1,Length(iel.Blo.zna),iel.Blo.zna) and EtoCif(1,Length(iel.Blo.nex.zna),iel.Blo.nex.zna) then | |
begin | |
if CifraFloat(iel.Blo.zna)>CifraFloat(iel.Blo.nex.zna) | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end else | |
if iel.Blo.zna>iel.Blo.nex.zna | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end; | |
end; | |
Procedure TProg.TRMEN(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if EtoCif(1,Length(iel.blo.zna),iel.blo.zna) and | |
EtoCif(1,Length(iel.blo.nex.zna),iel.blo.nex.zna) then | |
begin | |
if CifraFloat(iel.blo.zna)<CifraFloat(iel.blo.nex.zna) | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end else | |
if iel.blo.zna<iel.blo.nex.zna | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end; | |
end; | |
Procedure TProg.TRNER(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if EtoCif(1,Length(iel.Blo.zna),iel.blo.zna) and | |
EtoCif(1,Length(iel.blo.nex.zna),iel.blo.nex.zna) then | |
begin | |
if CifraFloat(iel.blo.zna)<>CifraFloat(iel.blo.nex.zna) | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end else | |
if iel.Blo.zna<>iel.blo.nex.zna | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end; | |
end; | |
Procedure TProg.TRBRA(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.Blo); | |
TrRun(iel.Blo.nex); | |
if EtoCif(1,Length(iel.blo.zna),iel.blo.zna) and | |
EtoCif(1,Length(iel.Blo.nex.zna),iel.Blo.nex.zna) then | |
begin | |
if CifraFloat(iel.blo.zna)>=CifraFloat(iel.blo.nex.zna) | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end else | |
if iel.Blo.zna>=iel.Blo.nex.zna | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end; | |
end; | |
Procedure TProg.TRMRA(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.Blo); | |
TrRun(iel.Blo.nex); | |
if EtoCif(1,Length(iel.Blo.zna),iel.blo.zna) and | |
EtoCif(1,Length(iel.blo.nex.zna),iel.blo.nex.zna) then | |
begin | |
if CifraFloat(iel.Blo.zna)<=CifraFloat(iel.Blo.nex.zna) | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end else | |
if iel.Blo.zna<=iel.Blo.nex.zna | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end ; | |
end; | |
Procedure TProg.TRIII(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.Blo); | |
TrRun(iel.Blo.nex); | |
if (iel.Blo.zna='1') and (iel.Blo.nex.zna='1') | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end; | |
end; | |
Procedure TProg.TRILI(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.Blo); | |
TrRun(iel.Blo.nex); | |
if (iel.Blo.zna='1') or (iel.Blo.nex.zna='1') | |
Then iel.Zna:='1' | |
else iel.Zna:='0' | |
end; | |
end; | |
Procedure TProg.TRPRI(iel:Tel); | |
var | |
Fun:Tel; | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.Blo.nex); | |
Fun:=FindFuncN(iEl,iel.Blo.axt); | |
if Fun<>Nil Then Fun.Zna:=iel.Blo.nex.Zna; | |
end; | |
end; | |
procedure FindFuncN; // Ищит функцию или переменную | |
begin | |
BeginProcedure('FindFuncN'); | |
SAv__EAX('@iEL'); | |
SAv__EDX('@n'); | |
PRI__('@REZ',0); | |
//------------------------- Если нашли функцию | |
ELE_B('@FUN','@iEl',EL_FUN); | |
ELE__('@AXT','@iEl',EL_AXT); | |
NRA__('@FUN',1,'NEX1'); // if (iEl.fun) | |
NRA__STR('@AXT','@n','NEX1');// and (iEl.Axt=n) | |
Pri__('@REZ','@iEl'); // then rez:=iEl; ВЫХОД | |
JMP__('VIHOD'); // Выход Выход Выход Выход | |
//------------------------- | |
//------------------------- | |
//------------------------- | |
SeLa('NEX1'); PRI__('@l','@iEl'); // l:=iEl; | |
SeLa('CIK1'); RAV__('@L',0,'ECIK1'); // | |
NRA__('@REZ',0,'ECIK1'); // while (l<>nil) and (rez=nil) do | |
ELE_B('@TIS','@l',EL_TIS); // l.TIS | |
ELE_B('@FUN','@l',EL_FUN); // l.FUN | |
ELE__('@AXT','@l',EL_AXT); // l.AXT | |
Nra__('@TIS',TI_OPE,'Cik1Nex1'); // (l.Tis=Ti_TOpe) | |
Nra__('@FUN',1,'Cik1Nex1'); // (l.fun) | |
Nra__STR('@AXT','@N','Cik1Nex1'); // (l.Axt=n) | |
PRI__('@REZ','@l'); // rez:=l; | |
JMP__('VIHOD'); // ВЫХОД | |
SeLa('Cik1Nex1');ELE__('@L','@L',EL_PRE); // l:=l.pre; | |
JMP__('CIK1'); | |
SeLa('ECIK1'); | |
//------------------------- | |
//if (iEl.rod<>nil) and (iEl.rod.fun) Then | |
ELE__('@ROD','@iEl',EL_ROD); | |
RAV__('@ROD',0,'NEX2'); | |
ELE_B('@FUN','@ROD',El_FUN); | |
NRA__('@FUN',1,'NEX2'); | |
//-------------------------- l:=iEl.rod.blo.blo; | |
ELE__('@ROD','@iEl',EL_Rod); | |
ELE__('@BLO','@ROD',EL_BLO); | |
RAV__('@BLO',0,'NEX2'); | |
ELE__('@BLO','@BLO',EL_BLO); | |
RAV__('@BLO',0,'NEX2'); | |
PRI__('@L','@BLO'); // Блок с параметрами функции | |
//--------------------------- | |
//while (l<>nil) do | |
SeLa('CIK2'); RAV__('@l',0,'ECIK2'); | |
ELE__('@AXT','@L',EL_AXT); | |
NRa__STR('@AXT','@N','CIK2NEX1');// if l.Axt=n then | |
Pri__('@REz','@L'); // rez:=l; | |
JMP__('VIHOD'); // ВЫХОД | |
SeLa('Cik2Nex1');ELE__('@L','@L',EL_NEX); // l:=l.nex | |
JMP__('CIK2'); | |
SeLa('ECIK2'); | |
SeLa('NEX2'); //=========================== | |
// if (iEl.Rod<>Nil) Then rez:=FindFuncN(iEl.Rod,n); | |
ELE__('@ROD','@iEl',EL_ROD); | |
RAV__('@ROD',0,'VIHOD'); | |
Loa__EAX('@ROD'); | |
LOa__EDX('@n'); | |
Cal__('FindFuncN'); | |
SAV__EAX('@REZ'); | |
SeLa('VIHOD'); LOA__EAX('@REZ'); | |
EndProcedure; | |
{ function FindFuncN(iEl:TEl;n:ansistring):Tel; | |
var | |
l,REz:Tel; | |
begin | |
rez:=Nil; | |
if (iEl.fun)and (iEl.Axt=n) then rez:=iEl; | |
l:=iEl; | |
while (l<>nil) and (rez=nil) do | |
begin | |
if (l.Tis=Ti_TOpe) and | |
(l.fun) and | |
(l.Axt=n) Then rez:=l; | |
l:=l.pre; | |
end; | |
if (rez=nil) and (iEl.rod<>nil) and (iEl.rod.fun) Then | |
begin | |
l:=iEl.rod.blo.blo; | |
while (REZ=NIL) AND (l<>nil) do | |
begin | |
if l.Axt=n then rez:=l; | |
l:=l.nex; | |
end; | |
end; | |
if (rez=nil) and (iEl.Rod<>Nil) Then rez:=FindFuncN(iEl.Rod,n); | |
FindFuncN:=rez; | |
end; | |
} | |
end; | |
Procedure CopPAr; // Копирует параметры функции | |
begin | |
BeginProcedure('CopPar'); | |
SAv__Eax('@RU'); | |
SAv__EDx('@EL'); | |
//if (ru.blo<>nil) and (ru.blo.blo<>nil) | |
ELE__('@BLO','@RU',EL_BLO); | |
RAV__('@BLO',0,'VIHOD'); | |
ELE__('@BLO','@BLO',EL_BLO); | |
RAV__('@BLO',0,'VIHOD'); | |
Pri__('@l1','@BLO');//l1:=ru.blo.blo; | |
//if (el.blo<>nil) and (el.blo.blo<>nil) then | |
ELE__('@BLO','@EL',EL_BLO); | |
RAV__('@BLO',0,'VIHOD'); | |
ELE__('@BLO','@BLO',EL_BLO); | |
RAV__('@BLO',0,'VIHOD'); | |
Pri__('@l2','@BLO');//l2:=El.blo.blo; | |
//=========================================== | |
seLa('CIK1'); RAV__('@l1',0,'VIHOD'); | |
RAV__('@l2',0,'VIHOD'); | |
ELE__('@ZNA1','@l1',EL_ZNA); | |
ELE__('@ZNA2','@l2',EL_ZNA); | |
Cop__Str('@Zna1','@Zna2'); | |
ELE__('@l1','@l1',EL_NEX); | |
ELE__('@l2','@l2',EL_NEX); | |
JMP__('CIK1'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
{ | |
if (ru.blo<>nil) and (ru.blo.blo<>nil) and | |
(el.blo<>nil) and (el.blo.blo<>nil) then | |
begin | |
l1:=ru.blo.blo; | |
l2:=el.blo.blo; | |
while (l1<>nil) and (l2<>nil) do | |
begin | |
l1.Zna:=l2.Zna; | |
l1:=l1.nex; | |
l2:=l2.nex; | |
end; | |
end; | |
} | |
end; | |
procedure TrRun; // Запускает элемент на выполнение | |
begin | |
BeginProcedure('TrRun'); | |
SAv__EAX('@iEL'); | |
ELE__('@AXT','@iEL',EL_AXT); | |
ELE_B('@TIS','@iEL',EL_TIS); | |
Pri__('@ZAP',ord(',')); | |
NRA__Str('@AXT','COM_PRINT','NEX1');// Вывод в консоль | |
LOA__EAX('@iEL');CAL__('TrCoN');JMP__('VIHOD'); | |
SeLa('NEX1'); | |
NRA__Str('@AXT','COM_PRI','NEX2');// ПРисвоение | |
LOA__EAX('@iEL');CAL__('TrPri');JMP__('VIHOD'); | |
SeLa('NEX2'); | |
NRA__Str('@AXT','COM_Sco','NEX3');// Скобка | |
LOA__EAX('@iEL');CAL__('TrSco');JMP__('VIHOD'); | |
SeLa('NEX3'); | |
NRA__Str('@AXT','COM_Blo','NEX4');// Выполнение блока | |
LOA__EAX('@iEL');CAL__('TrRuns');JMP__('VIHOD'); | |
SeLa('NEX4'); | |
NVh__Str('@AXT','COM_ZNA','@ZAp','NEX5');// Мат операции | |
LOA__EAX('@iEL');CAL__('TrZna');JMP__('VIHOD'); | |
SeLa('NEX5'); NRA__('@TIS',Ti_Ope,'VIHOD'); | |
//----------------------------------------------- | |
// fun:=FindFuncN(el.Rod,el.Axt); | |
ELE__('@ROD','@iEL',EL_ROD); | |
ELE__('@AXT','@iEL',EL_AXT); | |
LOA__EAX('@iEl'); | |
LOA__EDX('@AXT'); | |
CAl__('FindFuncN');SAV__EAX('@FUN'); | |
RAV__('@FUN',0,'VIHOD'); | |
//---------------------------------------------- | |
//ru:=fun.cop(el.Rod,El.Pre); | |
ELE__('@PRE','@iEL',EL_PRE); | |
Cop__ELE('@FUN','@ROD','@PRE','@RU'); | |
//if el.blo<>nil then TrRuns(El.blo);//Вычисляем параметры | |
ELE__('@BLO','@iEL',EL_BLO); | |
RAV__('@BLO',0,'NNEX1'); | |
LOA__EAX('@BLO'); | |
CAL__('TrRuns'); | |
SeLa('NNEX1');//---------------------------------------------- | |
//CopPar(ru,iel) | |
LOA__EAX('@RU'); | |
LOA__EDX('@iEL'); | |
cal__('CopPar'); | |
//---------------------------------------------- | |
//if (Ru.blo<>nil) and (Ru.blo.nex<>nil) then TrRuns(Ru.blo.nex); | |
ELE__('@BLO','@RU',EL_BLO); | |
RAV__('@BLO',0,'NNEX2'); | |
ELE__('@NEX','@BLO',EL_NEX); | |
RAV__('@NEX',0,'NNEX2'); | |
LOA__EAX('@NEX'); | |
CAL__('TrRuns'); | |
SeLa('NNEX2');//============================================== | |
//el.Zna:=Ru.zna; | |
ELE__('@ZNA1','@iEL',EL_ZNA); | |
ELE__('@AXT1','@iEL',EL_AXT); | |
ELE__('@ZNA2','@RU',EL_ZNA); | |
Cop__Str('@ZNA1','@ZNA2'); | |
// Отсоеденяем | |
PRI__('@APRE',EL_PRE); | |
ADD__('@APRE','@RU'); | |
WRI_W('@APRE',0); | |
PRI__('@ANEX',EL_NEX); | |
ADD__('@ANEX','@RU'); | |
WRI_W('@ANEX',0); | |
Fre__Ele('@RU'); | |
JMP__('VIHOD'); | |
SeLa('PEREM'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
{ Procedure TProg.TRRun(el:Tel); // выполняет кон команду | |
var | |
l1,l2:TEl; | |
Fun,ru:Tel; | |
begin | |
if (el.Axt='PRINT') Then TRCON(el) else | |
if (el.Axt='WHILE') Then TRWHI(el) else | |
if (el.Axt='IF' ) Then TRUSL(el) else | |
if (el.Axt='||' ) Then TRILI(el) else | |
if (el.Axt='&&' ) Then TRIII(el) else | |
if (el.Axt='*' ) Then TRUMN(el) else | |
if (el.Axt='/' ) Then TRDEL(el) else | |
if (el.Axt='+' ) Then TRPLU(el) else | |
if (el.Axt='-' ) Then TRMIN(el) else | |
if (el.Axt='=' ) Then TRRAV(el) else | |
if (el.Axt='>' ) Then TRBOL(el) else | |
if (el.Axt='<' ) Then TRMEN(el) else | |
if (el.Axt='<>' ) Then TRNER(el) else | |
if (el.Axt='!=' ) Then TRNER(el) else | |
if (el.Axt='>=' ) Then TRBRA(el) else | |
if (el.Axt='<=' ) Then TRMRA(el) else | |
if (el.Axt=':=' ) Then TRPRI(el) else | |
if (el.Axt='(' ) Then TrSCO(el) else | |
if (el.Axt='{' ) Then TrRuns(el) else | |
if (el.Tis=Ti_TOpe) Then | |
begin | |
fun:=FindFuncN(el.Rod,el.Axt); | |
if fun<>nil then | |
begin | |
ru:=fun.cop(el.Rod,El.Pre); | |
if el.blo<>nil then TrRuns(El.blo);//Вычисляем параметры | |
CopPar(ru,el) | |
// Если есть исполнительный блок | |
if (Ru.blo<>nil) and (Ru.blo.nex<>nil) then TrRuns(Ru.blo.nex); | |
el.Zna:=Ru.zna; | |
Ru.Cle; | |
ru.Free; | |
end else | |
el.Err:='Не обнаржена переменная'+el.Axt; | |
end | |
else | |
el.Err:='Неопределено'; | |
end; | |
} | |
} | |
end; | |
procedure TrRunS; // Запускает На выполнение все элементы в блоке BLO | |
begin | |
BeginProcedure('TrRunS'); | |
SAv__EAX('@iEL'); | |
ELE__('@l','@iEl',EL_BLO); // l:=el.blo; | |
SeLa('Cikl'); RAV__('@L',0,'VIHOD'); // While l<>nil do | |
ELE__('@AXT','@L',EL_AXT); | |
ELE_B('@Fun','@L',El_FUN); // L.Fun | |
RAV__('@FUN',1,'CIK1NEX1');// if Not l.fun then | |
Loa__EAX('@L'); | |
Cal__('TrRun'); // TrRun(l); | |
SeLa('CIK1Nex1'); | |
ELE__('@L','@L',EL_NEX); // l:=l.nex; | |
JMP__('Cikl'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
{Procedure TProg.TRRunS(el:Tel);// исполняет структуру | |
var | |
l:TEl; | |
begin | |
l:=el.blo; | |
While l<>nil do | |
begin | |
if Not l.fun then TrRun(l); | |
l:=l.nex; | |
end; | |
end;} | |
end; | |
procedure TRCON; // ПРоцедура вывода в консоль | |
begin | |
BeginProcedure('TRCON'); | |
SAv__EAX('@iEL'); | |
ELE__('@BLO','@iEl',EL_BLO); | |
LOA__EAX('@BLO'); | |
CAL__('TrRun'); | |
ELE__('@ZNA','@BLO',EL_ZNA); | |
Print_Str('@ZNA'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
{ Procedure TProg.TRCON(iel:Tel); | |
var | |
l:Tel; | |
begin | |
l:=iel.Blo; | |
while l<>nil do | |
begin | |
TrRun(l); | |
Con:=Con+l.zna; | |
L:=l.nex; | |
end; | |
Con:=Con+chr(13)+chr(10); | |
end; | |
} | |
end; | |
procedure TRSCO; // ПРоцедура скобка | |
begin | |
BeginProcedure('TRSCO'); | |
SAv__EAX('@iEL'); | |
ELE__('@l','@iEl',El_Blo); | |
ELE__('@ZNA','@iEl',El_Zna); | |
Wri_B('@ZNA',0);// Обнуляем результат | |
SeLa('Cikl'); RAv__('@l',0,'VIHOD'); | |
LOA__EAX('@l'); | |
CAL__('TrRun'); | |
ELE__('@ZNA2','@L',EL_ZNA); | |
Add__STR('@ZNA','@ZNA2'); | |
ELE__('@L','@L',EL_NEX); | |
JMP__('CIKL'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
{ Procedure TProg.TRSCO(iel:Tel); | |
var | |
l:TEl; | |
rez:Ansistring; | |
begin | |
rez:=''; | |
l:=Iel.Blo; | |
while l<>nil do | |
begin | |
trRun(l); | |
rez:=rez+l.zna; | |
l:=l.nex; | |
end; | |
iel.zna:=rez; | |
end; | |
} | |
end; | |
procedure TRZNA; // Операция сложения | |
begin | |
BeginProcedure('TRZNA'); | |
SAv__EAX('@iEL'); | |
//-------------------------- | |
ELE__('@BLO','@iEl',EL_Blo); | |
RAV__('@BLO',0,'ERROR'); | |
ELE__('@NEX','@BLO',EL_NEX); | |
RAV__('@NEX',0,'ERROR'); | |
//-------------------------- | |
LOA__EAX('@BLO');Cal__('TrRun'); | |
LOA__EAX('@NEX');Cal__('TrRun'); | |
//-------------------------- | |
ELE__('@AXT','@iEl',El_AXT); | |
ELE__('@ZNA0','@iEl',El_ZNA); | |
ELE__('@ZNA1','@BLO',El_ZNA); | |
ELE__('@ZNA2','@NEX',El_ZNA); | |
Tip__Str('@TIP1','@ZNA1'); | |
Tip__Str('@TIP2','@ZNA2'); | |
Pri__('@TIP',0); | |
NRA__('@TIP1',1,'NEX'); | |
NRA__('@TIP2',1,'NEX'); | |
Pri__('@TIP',1); | |
SeLa('NEX'); | |
//============================================================================== | |
// СЛОЖЕНИЕ | |
SeLa('CIF0'); NRa__Str('@AXT','COM_SUM','CIF1'); | |
NRA__('@TIP',1,'STR0'); | |
Cop__Str('@ZNA0','@ZNA1'); | |
Sum__Chi('@ZNA0','@ZNA2'); | |
Jmp__('VIHOD'); | |
SeLa('STR0'); | |
ADD__STr('@ZNA0','@ZNA1'); | |
ADD__STr('@ZNA0','@ZNA2'); | |
Jmp__('VIHOD'); | |
// Вычитание | |
SeLa('CIF1'); NRa__Str('@AXT','COM_MIN','CIF2'); | |
NRA__('@TIP',1,'STR1'); | |
Cop__Str('@ZNA0','@ZNA1'); | |
Min__Chi('@ZNA0','@ZNA2'); | |
Jmp__('VIHOD'); | |
SeLa('STR1'); Jmp__('ERROR'); | |
// Умножение | |
SeLa('CIF2'); NRa__Str('@AXT','COM_UMN','CIF3'); | |
NRA__('@TIP',1,'STR2'); | |
Cop__Str('@ZNA0','@ZNA1'); | |
UMN__Chi('@ZNA0','@ZNA2'); | |
Jmp__('VIHOD'); | |
SeLa('STR2'); Jmp__('ERROR'); | |
// Деление | |
SeLa('CIF3'); NRa__Str('@AXT','COM_DEL','CIF4'); | |
NRA__('@TIP',1,'STR3'); | |
Cop__Str('@ZNA0','@ZNA1'); | |
DEL__Chi('@ZNA0','@ZNA2'); | |
Jmp__('VIHOD'); | |
SeLa('STR3'); Jmp__('ERROR'); | |
// Меньше | |
SeLa('CIF4'); NRa__Str('@AXT','COM_MEN','CIF5'); | |
NRA__('@TIP',1,'STR4'); | |
MEN__Chi('@ZNA1','@ZNA2','CMEN4'); | |
Wri_B('@ZNA0',0);ADD__SIM('@ZNA0',ord('1')); | |
Jmp__('VIHOD'); | |
SeLa('CMEN4'); Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('0')); | |
Jmp__('VIHOD'); | |
SeLa('STR4'); MEN__STR('@ZNA1','@ZNA2','SMEN4'); | |
Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('1')); | |
Jmp__('VIHOD'); | |
SeLa('SMEN4'); Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('0')); | |
Jmp__('VIHOD'); | |
// БОЛЬШЕ | |
SeLa('CIF5'); NRa__Str('@AXT','COM_BOL','CIF6'); | |
NRA__('@TIP',1,'STR5'); | |
Bol__Chi('@ZNA1','@ZNA2','CMEN5'); | |
Wri_B('@ZNA0',0);ADD__SIM('@ZNA0',ord('1')); | |
Jmp__('VIHOD'); | |
SeLa('CMEN5'); Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('0')); | |
Jmp__('VIHOD'); | |
SeLa('STR5'); Bol__STR('@ZNA1','@ZNA2','SMEN5'); | |
Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('1')); | |
Jmp__('VIHOD'); | |
SeLa('SMEN5'); Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('0')); | |
Jmp__('VIHOD'); | |
// Равно | |
SeLa('CIF6'); NRa__Str('@AXT','COM_RAV','CIF7'); | |
NRA__('@TIP',1,'STR5'); | |
RAV__Chi('@ZNA1','@ZNA2','CMEN6'); | |
Wri_B('@ZNA0',0);ADD__SIM('@ZNA0',ord('1')); | |
Jmp__('VIHOD'); | |
SeLa('CMEN6'); Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('0')); | |
Jmp__('VIHOD'); | |
SeLa('STR6'); RAV__STR('@ZNA1','@ZNA2','SMEN6'); | |
Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('1')); | |
Jmp__('VIHOD'); | |
SeLa('SMEN6'); Wri_B('@ZNA0',0); | |
ADD__SIM('@ZNA0',ord('0')); | |
Jmp__('VIHOD'); | |
SeLa('Cif7'); Jmp__('ERROR'); | |
//============================================================================== | |
Jmp__('VIHOD'); | |
SeLa('ERROR'); | |
PRI__('@AERR',EL_ERR); | |
ADD__('@AERR','@iEl'); | |
//Wri_B('@AERR',1);// Ошибка | |
SeLa('VIHOD'); | |
EndProcedure; | |
{ Procedure TProg.TRPLU(iel:Tel); | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.blo); | |
TrRun(iel.blo.nex); | |
if EtoCif(1,length(iel.Blo.zna),iel.Blo.zna) and EtoCif(1,length(iel.Blo.nex.zna),iel.Blo.nex.zna) | |
Then | |
Begin | |
iel.zna:=FloatToStr(StrToFloat(iel.Blo.zna)+StrToFloat(iel.Blo.nex.zna)) | |
end | |
Else | |
begin | |
iel.zna:=iel.Blo.zna+iel.Blo.nex.zna | |
end; | |
end; | |
end; | |
} | |
end; | |
procedure TRPRI; // Операция присваивания | |
begin | |
BeginProcedure('TRPRI'); | |
SAv__EAX('@iEL'); | |
//-------------------------- | |
ELE__('@BLO','@iEl',EL_Blo);//if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
RAV__('@BLO',0,'ERROR'); | |
ELE__('@NEX','@BLO',EL_NEX);//if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
RAV__('@NEX',0,'ERROR'); | |
//-------------------------- | |
LOA__EAX('@NEX'); | |
CAL__('TrRun'); | |
ELE__('@ROD','@iEl',El_ROD); | |
ELE__('@BLO','@iEl',El_BLO); | |
ELE__('@NEX','@BLO',El_NEX); | |
ELE__('@AXT','@BLO',El_AXT); | |
//LOA__EAX('@ROD'); | |
LOA__EAX('@iEl');//******************* | |
LOA__EDX('@AXT'); | |
CAL__('FindFuncN'); | |
SAV__EAX('@FUN'); | |
RAV__('@FUN',0,'VIHOD'); | |
ELE__('@ZNA1','@FUN',EL_ZNA); | |
ELE__('@ZNA2','@NEX',EL_ZNA); | |
COP__STR('@ZNA1','@ZNa2'); | |
Jmp__('VIHOD'); | |
SeLa('ERROR'); | |
PRI__('@AERR',EL_ERR); | |
ADD__('@AERR','@iEl'); | |
//Wri_B('@AERR',1);// Ошибка | |
SeLa('VIHOD'); | |
EndProcedure; | |
{ Procedure TProg.TRPRI(iel:Tel); | |
var | |
Fun:Tel; | |
begin | |
if iel.blo=nil Then iel.Err:='(Не хватает значений)' else | |
if iel.blo.nex=nil Then iel.Err:='(Не хватает значений)' else | |
begin | |
TrRun(iel.Blo.nex); | |
Fun:=FindFuncN(iEl.rod,iel.Blo.axt); | |
if Fun<>Nil Then Fun.Zna:=iel.Blo.nex.Zna; | |
end; | |
end; | |
} | |
end; | |
{$ENDIF} | |
{ Парсер } {$IFDEF Tim} | |
Procedure Compilema; // Вкладывает знаковые операции тпа A+B A:=B | |
begin | |
BeginProcedure('Compilema'); | |
SAv__EAX('@EL'); | |
SAv__EDX('@S'); | |
Pri__('@ZAP',ord(',')); | |
ELE__('@L','@EL',EL_BLO); // l:=el.blo; | |
SeLa('CIKL'); RAV__('@L',0,'VIHOD'); // while l<>nil do | |
ELE__('@BLO','@L',EL_BLO); // l.blo | |
RAV__('@BLO',0,'NEX1'); // if l.blo<>nil then | |
LOA__EAX('@l'); | |
LOA__EDX('@S'); | |
CAL__('Compilema'); | |
SeLa('NEX1'); ELE__('@AXT','@L',EL_AXT); // l.Axt | |
NVh__Str('@AXT','@S','@ZAP','NEX2');//if est(s,l.Axt) then | |
ELE__('@PRE','@L',EL_PRE); | |
ADD__ELE('@L','@PRE'); | |
ELE__('@NEX','@L',EL_NEX); | |
ADD__ELE('@L','@NEX'); | |
SeLa('NEX2'); ELE__('@NEX','@L',EL_NEX); | |
PRI__('@L','@NEX'); | |
JMP__('CIKL'); | |
SeLa('VIHOD'); LOA__EAX('@EL'); | |
EndProcedure; | |
{ Procedure CompileMa(s:ansistring;el:Tel);// Умножение деление | |
var | |
l:TEl; | |
begin | |
l:=el.blo; | |
while l<>nil do | |
begin | |
if l.blo<>nil then CompileMa(s,l); | |
if est(s,l.Axt) then | |
begin | |
if l.pre<>nil then CompileMa(s,l.pre); | |
if l.nex<>nil then CompileMa(s,l.nex); | |
l.add(l.pre); | |
l.add(l.nex); | |
end; | |
l:=l.nex; | |
end; | |
end; | |
} | |
end; | |
Procedure CompilePa; // Вкладываает параметры типа SUMMA (Параметры) | |
begin | |
BeginProcedure('CompilePa'); | |
SAv__EAX('@EL'); | |
SAv__EDX('@SC1'); | |
ELE__('@L','@EL',EL_BLO); //l:=el.blo; | |
SeLa('CIKL'); RAV__('@L',0,'VIHOD'); // while l<>nil do | |
ELE_B('@TIS','@L',EL_TIS); // L.TIS | |
ELE__('@NEX','@L',EL_NEX); // L.NEX | |
NRA__('@TIS',Ti_Ope,'NEX1'); // if (l.Tis=Ti_TOpe) 1 | |
RAV__('@NEX',0,'NEX1'); // and (l.nex<>nil) then 2 | |
ELE__('@NAX','@NEX',EL_AXT); // L.NEX.AXT | |
NRA__Str('@NAX','@SC1','NEX1'); // if (l.nex.axt='(') then 3 | |
//00000000000000000000000000000000 | |
NRA__('@sc1','SS_BL1','NNN'); // l.fun:=1; если вкладываем блоки | |
PRI__('@AFUN',El_FUN); // Указываем что это функция | |
ADD__('@AFUN','@L'); | |
WRI_B('@AFUN',1); // ПРоверяем наличие параметров если нету сперва их добавляем | |
//00000000000000000000000000000000 | |
SeLa('NNN'); Add__ELE('@L','@NEX'); // l.add(l.nex) | |
SeLa('NEX1'); ELE__('@BLO','@L',EL_BLO); //l.Blo | |
RAV__('@BLO',0,'NEX3'); //if (l.blo<>nil) then | |
LOA__EAX('@L'); //CompilePa(l); | |
LOA__EDX('@sc1'); | |
CAL__('CompilePa'); | |
SeLa('NEX3'); ELE__('@L','@L',EL_NEX); // L.NEX | |
JMP__('CIKL'); | |
SeLa('VIHOD'); LOA__EAX('@EL'); | |
EndProcedure; | |
{ | |
// Вложение параметров функций | |
Procedure CompilePa(el:Tel); | |
var | |
l:Tel; | |
begin | |
l:=el.blo; | |
while l<>nil do | |
begin | |
if (l.Tis=Ti_TOpe) and (l.nex<>nil) then | |
if (l.nex.axt='(') then l.add(l.nex) else | |
if (l.blo=nil) then l.add('(',Ti_TZna); | |
if (l.blo<>nil) then CompilePa(l); | |
l:=l.nex; | |
end; | |
end; | |
} | |
end; | |
Procedure CompileSc; // Вкладывает внутрб скобок слова | |
Begin | |
BeginProcedure('CompileSc'); | |
SAv__EAX('@EL'); | |
SAv__EDX('@sc1'); | |
SAv__ECX('@sc2'); | |
PRI__('@NK','@EL'); // NK:=El; Куда добавлять | |
ELE__('@PE','@EL',EL_BLO); // PE:=El.Blo; ПОслдений эллемент | |
SeLa('CIKL'); RAV__('@PE',0,'VIHOD'); | |
ELE__('@NE','@PE',EL_NEX); // ne:=pe.nex; | |
ELE__('@AXT','@PE',EL_AXT); // pe.Axt | |
//------------------------ | |
RAV__('@EL','@NK','NEX1'); // if el<>nk and pe.Axt<>s2 then | |
Rav__Str('@AXT','@SC2','NEX1'); // | |
Add__Ele('@NK','@PE'); // NK.add(PE); | |
SeLa('NEX1'); //------------------------ | |
Nra__Str('@AXT','@SC1','NEX2'); // if PE.Axt=s1 then | |
PRI__('@NK','@PE'); // NK:=PE; Куда добавлять | |
SeLa('NEX2'); //------------------------ | |
Nra__Str('@AXT','@SC2','NEX3'); // if PE.Axt=s2 then | |
ELE__('@ROD','@NK',EL_ROD); // NK.Rod; | |
PRI__('@NK','@ROD'); // NK:=NK.Rod; | |
Del__Ele('@PE'); // pe.del; | |
SeLa('NEX3'); //------------------------ | |
Pri__('@PE','@NE'); | |
JMP__('CIKL'); | |
SeLa('VIHOD'); Loa__EAX('@EL'); | |
EndProcedure; | |
{ // Чтение скобок | |
Procedure CompileSc(s1,s2:Ansistring;El:Tel); | |
var | |
f:Longint; | |
NK,PE,NE:Tel; | |
begin | |
f:=1; | |
NK:=El;// куда добавлять | |
PE:=El.Blo;// ПОслдений эллемент | |
While pe<>nil do | |
begin | |
ne:=pe.nex; | |
if el<>nk then if pe.Axt<>s2 then NK.add(PE); | |
if PE.Axt=s1 then NK:=PE;// Куда добавлять | |
if PE.Axt=s2 then begin NK:=NK.Rod;pe.del;end;// Вернуться на уровень вверх | |
pe:=ne; | |
end; | |
end; | |
} | |
end; | |
Procedure PArsing; // EAX:Указатель на тект программы EDX:Указатель на елеменнт | |
begin | |
BeginProcedure('PArsing'); | |
SAV__EAX('@UK'); | |
Cre__Str('@SL'); | |
Cre__Ele('@EL'); | |
SeLa('CIKL'); | |
REA_B('@SIM','@UK'); | |
RAV__('@SIM',0,'VIHOD'); | |
//----------------- | |
Loa__EAX('@UK');Loa__EDX('@SL');CAL__('ReadCif');SAV__EAX('@NUK');PRI__('@TIP',TI_Cif);NRA__('@NUK','@UK','NEX1'); | |
Loa__EAX('@UK');Loa__EDX('@SL');CAL__('ReadOpe');SAV__EAX('@NUK');PRI__('@TIP',TI_Ope);NRA__('@NUK','@UK','NEX1'); | |
Loa__EAX('@UK');Loa__EDX('@SL');CAL__('ReadZn1');SAV__EAX('@NUK');PRI__('@TIP',TI_Zna);NRA__('@NUK','@UK','NEX1'); | |
Loa__EAX('@UK');Loa__EDX('@SL');CAL__('ReadZn2');SAV__EAX('@NUK');PRI__('@TIP',TI_Zna);NRA__('@NUK','@UK','NEX1'); | |
Loa__EAX('@UK');Loa__EDX('@SL');CAL__('ReadKav');SAV__EAX('@NUK');PRI__('@TIP',TI_Kav);NRA__('@NUK','@UK','NEX1'); | |
INC__('@UK'); | |
JMP__('CIKL'); | |
SeLa('NEX1'); PRI__('@UK','@NUK'); | |
LOA__EAX('@EL'); | |
LOA__EDX('@SL'); | |
LOA__ECX('@TIP'); | |
Cal__('SADElement'); | |
JMP__('Cikl'); | |
SeLa('VIHOD'); Fre__Str('@SL'); | |
LOA__EAX('@EL'); | |
EndProcedure; | |
end; | |
{$ENDIF} | |
{ ОТладочная секция } {$IFDEF Tim} | |
procedure PrintElement(a:String); | |
begin | |
{ | |
PrintStr('ln'); | |
PrintStr('ln'); | |
PrintCif(a); | |
PrintStr('ln'); | |
Pri__('@OtEl',a);add__('@OtEl',El_Res);REA_B('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_Tis);REA_B('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_Fun);REA_B('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_Err);REA_B('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
PrintStr('ln'); | |
Pri__('@OtEl',a);add__('@OtEl',El_AXT);REA_W('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_ZNA);REA_W('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
PrintStr('ln'); | |
Pri__('@OtEl',a);add__('@OtEl',El_SAM);REA_W('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_ROD);REA_W('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_PRE);REA_W('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_NEX);REA_W('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
Pri__('@OtEl',a);add__('@OtEl',El_BLO);REA_W('@OtEl','@OtEl');PrintCif('@OtEl');PrintStr('Raz'); | |
PrintStr('ln');pau__; | |
} | |
end; | |
Procedure Ots__(s:String); | |
begin | |
Cre__Str('@BUF'); | |
Loa__EAX(s); | |
Loa__EDX('@BUF'); | |
Cal__('OtstUp'); | |
Print_Str('@BUF'); | |
Fre__Str('@BUF'); | |
end; | |
Procedure OtstUp; | |
begin | |
BeginProcedure('OtstUp'); | |
SAV__EAX('@b'); | |
SAV__EDX('@BUF'); | |
WRI_B('@BUF','@B'); | |
PRI__('@USL','@BUF'); | |
PRI__('@LEN',1);Inc__('@USL'); | |
SeLa('CIKL'); BOL__('@LEN','@b','VIHOD'); | |
WRI_B('@USL',ord('*')); | |
INC__('@USL'); | |
INC__('@LEN'); | |
JMP__('CIKL'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
Procedure PrintElements;// Печатает содержимое елемента EAX: с отступом EDX | |
Begin | |
BeginProcedure('PriElements'); | |
Sav__EAX('@EL'); | |
Sav__EDX('@OT'); | |
ELE__('@AXT','@EL',EL_AXT); | |
//PrintStr('@AXT');PrintStr('ln'); | |
ELE__('@LLL','@EL',EL_BLO); | |
SeLa('CIKL'); Rav__('@LLL',0,'VIHOD'); | |
ELE__('@AXT','@LLL',EL_AXT); | |
ELE__('@ZNA','@LLL',EL_ZNA); | |
ELE_B('@FFF','@LLL',EL_FUN); | |
ots__('@OT'); | |
PRINT_CIF('@FFF');Print_Str('raz');Print_Str('@AXT');Print_Str('raz');Print_Str('@ZNA');Print_Str('Ln'); | |
ELE__('@N','@LLL',EL_BLO); | |
RAV__('@N',0,'NEX1'); | |
PRI__('@OT2',1); | |
ADD__('@OT2','@OT'); | |
LOA__EAX('@LLL'); | |
LOA__EDX('@OT2'); | |
CAL__('PriElements'); | |
SeLa('NEX1'); | |
ELE__('@LLL','@LLL',EL_NEX); | |
JMP__('CIKL'); | |
SeLa('VIHOD'); | |
EndProcedure; | |
end; | |
{Для отладки | |
//---------------------------------- | |
ELE__('@AXT','@Ru',EL_AXT); | |
PrintStr('COP');PrintStr('@AXT');PrintStr('ln');pau__;//+++++== | |
LOA__EAX('@Ru'); | |
LOA__EDX(1);// ОТступ | |
Cal__('PriElements'); | |
//--------------------------------- | |
} | |
{$ENDIF} | |
{ Секция компиляции программы } {$IFDEF Tim} | |
procedure Vars(s:Ansistring); | |
begin | |
// Текст программы на исполнение | |
SePe('PROG');WrMwS(s); | |
SePe('C1') ;WrMwc(0);// указатель на кучю | |
SePe('C2') ;WrMwc(0);// указатель на кучю | |
CrSt('SS_SC1','('); | |
CrSt('SS_SC2',')'); | |
CrSt('SS_BL1','{'); | |
CrSt('SS_BL2','}'); | |
CrSt('SS_SUM','+,-'); | |
CrSt('SS_UMN','*,/'); | |
CrSt('SS_LOG','>,<,=,>=,<=,!='); | |
CrSt('SS_PRI',':='); | |
CrSt('COM_PRINT','PRINT'); | |
CrSt('COM_ZNA','+,-,*,/,>,<,=,>=,<=,!='); | |
CrSt('COM_PRI',':='); | |
CrSt('COM_SCO','('); | |
CrSt('COM_BLO','{'); | |
CrSt('COM_SUM','+'); | |
CrSt('COM_MIN','-'); | |
CrSt('COM_UMN','*'); | |
CrSt('COM_DEL','/'); | |
CrSt('COM_BOL','>'); | |
CrSt('COM_MEN','<'); | |
CrSt('COM_RAV','='); | |
CrSt('SS_EST','EST'); | |
CrSt('SS_NET','NET'); | |
CrSt('TR_CON','TR_CON '); | |
CrSt('TR_SCO','TR_SCO '); | |
CrSt('TR_PRI','TR_PRI '); | |
CrSt('TR_PLU','TR_PLU '); | |
CrSt('cop',' cop '); | |
CrSt('Start2','-Start Program Ok.-'); | |
CrSt('InitMem','-Init Mem Ok.-'); | |
CrSt('END','-END Program Ok.-'); | |
CrSt('RAZ','-'); | |
If TrCo=80 Then CrSt('LN',chr(13)) else | |
If TrCo=16 Then CrSt('LN',chr(13)+chr(10)) else | |
If TrCo=17 Then CrSt('LN',chr(13)+chr(10)) else | |
If TrCo=32 Then CrSt('LN',chr(13)+chr(10)) else | |
If TrCo=33 Then CrSt('LN',chr(13)) else | |
If TrCo=34 Then CrSt('LN',chr(13)+chr(10)) else | |
InfoMes(('LN Не прописан для платформы')); | |
CrSt('CHI1','1'); | |
CrSt('CHI2','2'); | |
CrSt('MENHE','MENHE'); | |
CrSt('RAVNO','RAVNO'); | |
CrSt('BOLHE','BOLHE'); | |
CrSt('PRIVET', | |
chr(HexToInt('16'))+ | |
chr(HexToInt('0B'))+ // Строка | |
chr(HexToInt('0A'))+ // Столбец | |
chr(HexToInt('11'))+ // | |
chr(HexToInt('01'))+ // Цвет фона | |
chr(HexToInt('10'))+ | |
chr(HexToInt('06'))+ // Цвет чернил | |
'ZX SPECTRUM'); | |
CrSt('NIL','-NIL-'); | |
CrSt('PUS','-PUS-'); | |
CrSt('Start','-Start Ok.-'); | |
end; | |
procedure Prog(S:Ansistring); | |
begin | |
BeginProcedure('Main'); | |
Jmp__('START'); | |
Vars(s); | |
SeLa('START'); | |
Print_Str('Start');print_Str('ln'); | |
//-------- ПАРСЕР ----------------------- | |
LOA__EAX(adrPer('PROG'));CAL__('Parsing'); | |
LOA__EDX('SS_SC1');LOA__ECX('SS_SC2');Cal__('CompileSc'); | |
LOA__EDX('SS_BL1');LOA__ECX('SS_BL2');Cal__('CompileSc'); | |
LOA__EDX('SS_SC1');Cal__('CompilePa'); | |
LOA__EDX('SS_BL1');Cal__('CompilePa'); | |
LOA__EDX('SS_UMN');Cal__('CompileMa'); | |
LOA__EDX('SS_SUM');Cal__('CompileMa'); | |
LOA__EDX('SS_LOG');Cal__('CompileMa'); | |
LOA__EDX('SS_PRI');Cal__('CompileMa'); | |
CAL__('TrRuns'); | |
Print_Str('ln'); | |
Print_Str('END'); | |
Pau__; | |
EndProcedure; | |
end; | |
procedure MemoSaveToFile(nf:Ansistring); | |
var | |
f:Longint; | |
Fb:File of Byte; | |
begin | |
assignfile(fb,nf); | |
rewrite(fb); | |
For f:= MSta To MUka-1 do | |
write(fb,TrRb(f)); | |
Closefile(fb); | |
end; | |
Procedure Compiler(s,nf:Ansistring); | |
begin | |
// Список локальных меток | |
SLabs.clear; | |
RLabs.clear; | |
// Список процедур и функций | |
SFuns.clear; | |
RFuns.clear; | |
// Список переменных | |
GPers.clear; | |
// Список ЛОкальных переменных | |
LPers.clear; | |
LOAD_BIOS;// Загрузка базовой системы ввода вывода формирование структуры элемента | |
PROG(s) ;// Формирование непосредственно програмы | |
InitMem ; | |
TipString; // ПРоцедура Определяет тип строки если цифра то 1 | |
RavString; | |
BolString; | |
MenString; | |
CopString; | |
VhoString; | |
AsiString; | |
KolString; | |
SloString; | |
SumString; | |
GetString; | |
FreString; // Освободает строку | |
ASSString; // Добавление символа в начало строки | |
DelSimvol; | |
POsSimvol;// EAX:Строка EDX Символ Возвращает новую обработаную строку Удаляет указаный символ из строки | |
ReadCif; | |
ReadOpe; | |
ReadZn1; | |
ReadZn2; | |
ReadKav; | |
GetElement; | |
FreElement; | |
LstElement; | |
AddElement; | |
SadElement; | |
DelElement; | |
CopElement; | |
PrintElements; | |
Parsing; | |
FindFuncN; | |
CopPAr; | |
TrRun; | |
TrRunS; | |
TRCON;// ПРоцедура вывода в консоль | |
TRSCO;// ПРоцедура скобка | |
TRZNA;// Операция сложения | |
TRPRI;// Операция присваивания | |
Compilema; | |
CompilePa; | |
CompileSc; | |
OtstUp; | |
UmnDesEdi; // Умножает и возвращает Возращает десятки EAX:и единицы EDX | |
ZnaChisel; // EAX: число1 EDX: число2 Возвращает код комбинации знаков 0++ 1-+ 2+- 3-- | |
addPosle; // Добавляет в коцес строки EAX EDX Количсетво символов ECX | |
addDoooo; // Добавляет в Начало строки EAX EDX Количсетво символов ECX | |
NorChislo; // Нормализация числа EAX возвращает нормализованое число | |
CorChisel; // EAX: число1 EDX: число2 ПРоизводит корекцию чисел | |
Rav1Chisel;// ПРоверяет равенство строк с числами без знака EAX:EDX Возвращает EAX без знака | |
BOL1Chisel;// ПРоверяет Больше ли первая строка с числами EAX:EDX Возвращает EAX без знака | |
MEN1Chisel;// ПРоверяет Меньше ли первая строка с числами EAX:EDX Возвращает EAX без знака | |
RavChisel; // ПРоверяет равенство строк с числами EAX:EDX Возвращает EAX | |
BolChisel; // ПРоверяет Больше ли строка с числами EAX:EDX Возвращает EAX | |
MenChisel; // ПРоверяет менше ли строка с числами EAX:EDX Возвращает EAX | |
Sum1Chisel;// Складывает строки с числа EAX:EDX без знака | |
Min1Chisel;// Вычитает строки с числа EAX:EDX без знака | |
Umn1Chisel;// Умножает строки с числа EAX:EDX без знака | |
Del1Chisel;// Делит строки с числа EAX:EDX без знака | |
SumChisel; // Складывает строки с числа EAX:EDX Полное | |
MinChisel; // Вычитает строки с числа EAX:EDX Полное | |
UmnChisel; // Умножение строки с числа EAX:EDX Полное | |
DelChisel; // Деление строки с числа EAX:EDX Полное | |
SetZnaPer('TrMe',MUka);// Количество используемой памяти | |
SetFunctions; | |
MemoSaveToFile(nf); | |
end; | |
{$ENDIF} | |
begin | |
{ Инициализация модуля } {$IFDEF Tim} | |
pmemo:=Addr(Memo); | |
// Список локальных меток | |
SLabs:=Tlabs.Create; | |
RLabs:=TLAbs.Create; | |
// Список процедур и функций | |
SFuns:=TLAbs.Create; | |
RFuns:=TLAbs.Create; | |
// Список переменных | |
GPers:=TLAbs.Create; | |
// Список ЛОкальных переменных | |
LPers:=TLAbs.Create; | |
{$ENDIF} | |
end. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment