решил "заморочится" на процедурах задержки.
Походу написал программу "ЧАСЫ".
Которую буду отрабатывать (на точность) и проверять процедуры задержек.
Для начала программа "ЧАСЫ" без каких либо задержек.
Code: Select all
program TimerT1; uses uMD01u in 'uMD01u.pas';
const PosX=11;PosY=10;
VAR H1, H2, M1, M2, S1, S2,
Loop1, L2, L3, L4, L5, L6, L7 :TLabelLV;
//F809 - Вывод символа на экран
procedure MACRO1; begin Ap(48);CrA;CALL($F809);end;
procedure MACRO2(var P:TLabelLV); begin Ar_(P);MACRO1; end;
{Вывод ":"}
procedure {":"}MACRO_TD; begin Ar(10);MACRO1; end;
{Присвоить ИДентификатору типа Byte число}
procedure IDr(var P:TLabelLV;B:Byte); begin Ar(B);_rA(P); end;
// вывод времени на экран
procedure MACRO_WriteTime;
begin
// BE3E - (00...1F) номер позиции в строке;
Ar(PosX);_rA($BE3E);
// 4.Прямая адресация курсора Точка входа F82D.
CALL($F82D);
MACRO2(H1); MACRO2(H2); {":"}MACRO_TD;
MACRO2(M1); MACRO2(M2); {":"}MACRO_TD;
MACRO2(S1); MACRO2(S2);
end;
BEGIN
INITCompiler;
SetFullNameLVTfile('TimerT1.LVT');
SetNameInternalKOI(#$20+#$20+#$20+#$20+#$20+#$20);
SetAddrRAM($0000);
REM('StartProgram;');
StartProgram;
// BE38 - 00 рамки нет
// 13.Очистка экрана Точка входа F836.
Ar(0);_rA($F838); CALL($F836);
// ДЛЯ 4.Прямая адресация курсора Точка входа F82D.
// BE3F - (00...17) номер строки;
Ar(PosY);_rA($BE3F); Ar($FF);_rA($BE3D);
// Обнулим все знаки часов
Ar($00);_rA(S1);_rA(S2);_rA(M1);_rA(M2);_rA(H1);_rA(H2);
// {ТЕСТ} Ar(1);_rA(H1);Ar(9);_rA(H2); Ar(5);_rA(M1);Ar(5);_rA(M2);
///++++++++++++++++++++++++++++++++++++++++++++++++++++
{Loop1 - ЦИКЛ ЧАСОВ}
LabelA(Loop1);
// вывод времени на экран
MACRO_WriteTime;
{ТУТ БУДЕТ ЗАДЕРЖКА}
{Обработка...}
{Секунды}
Ar_(S2);Ap1;Acmp(10);GotoUnp(L2);_rA(S2);GOTO_(Loop1);
LabelA(L2);IDr(S2,0);Ar_(S1);Ap1;Acmp(6);GotoUnp(L3);_rA(S1);GOTO_(Loop1);
{Минуты}
LabelA(L3); IDr(S1,0); Ar_(M2);Ap1;Acmp(10);GotoUnp(L4);_rA(M2);GOTO_(Loop1);
LabelA(L4); IDr(M2,0); Ar_(M1);Ap1;Acmp(6);GotoUnp(L5);_rA(M1);GOTO_(Loop1);
{ЧАСЫ}
LabelA(L5); IDr(M1,0); Ar_(H2);Ap1;Acmp(10);GotoUnp(L6);_rA(H2);GOTO_(L7);
LabelA(L6); IDr(H2,0); Ar_(H1);Ap1;_rA(H1);GOTO_(Loop1);
{Ограничение по часам 24, для этого теста 99}
LabelA(L7);
Ar_(H1);Acmp($09);GotoUnm(Loop1);
Ar_(H2);Acmp($09);GotoUnm(Loop1);
{Обнуление "часы"}
Ar($00);_rA(H1);_rA(H2);
GOTO_(Loop1); {Loop1 - ЦИКЛ ЧАСОВ}
///++++++++++++++++++++++++++++++++++++++++++++++++++++
{Резметка и обнуление}
LabelA(H1);DB($00);LabelA(H2);DB($00);
LabelA(M1);DB($00);LabelA(M2);DB($00);
LabelA(S1);DB($00);LabelA(S2);DB($00);
FINALCompiler;
END.Code: Select all
procedure MACRO_Delay;
//Задержка в 50 тактов по идее 2 5000 000 /50 = 50000 = 1 сек
begin
HLr(38425);// величина задержки
// спешат = 38425
//отстают = 38450
LabelA(DelayT);
Ar_(DelayT){13};Ar_(DelayT);{13}{для коректировки 50 тактов}
HLm1;{5} ArH{5}; AoL{4};
GotoUnNot0(DelayT){10};
end;
Code: Select all
{ТУТ БУДЕТ ЗАДЕРЖКА}
MACRO_Delay;
Users browsing this forum: No registered users and 1 guest