PC-01 Lviv

It is currently 19 Apr 2024, 08:16

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00




Post new topic  Reply to topic  [ 4 posts ] 
Author Message
PostPosted: 12 May 2021, 21:25 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Работая над МАДЛ02, viewtopic.php?f=20&t=394&p=5452#p5452
решил "заморочится" на процедурах задержки. :-)
Походу написал программу "ЧАСЫ".
Которую буду отрабатывать (на точность) и проверять процедуры задержек.

Для начала программа "ЧАСЫ" без каких либо задержек.


Top
   
PostPosted: 12 May 2021, 21:33 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Code:
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.


Top
   
PostPosted: 12 May 2021, 21:35 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Attachment:
TimerT1.7z [1.74 KiB]
Downloaded 890 times
Сделал замеры.
Сопоставил работу программы-"пустышки" с часами на компе
Пока не знаю зачем и как я и что собираюсь высчитывать и как применять это
но пока замеры такие
часы компа - 1:00:00 = 3600 сек
часы "пустышки = 55:46:13 = 151813 циклов

151813 / 3600 = 42,170277777777777777777777777778 циклов/сек
3600 / 151813 = 0,023713384229282077292458485109971 секунд/цикл



Top
   
PostPosted: 13 May 2021, 15:50 
Offline

Joined: 18 May 2016, 19:55
Posts: 426
Attachment:
TimerT2.7z [2.32 KiB]
Downloaded 881 times
Во втором таймере добавлен макрос
Code:
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:
{ТУТ БУДЕТ ЗАДЕРЖКА}
MACRO_Delay;
Результаты теста (есть в файле TimerT2.dpr)

САС-Емулятор 1.44 (по секундно)
38300 1-я проверка, на компе = 0:10:00 , программа = 00:10:02 - СПЕШАТ!
38350 1-я проверка, на компе = 0:10:00 , программа = 00:10:01 - СПЕШАТ!
38375 1-я проверка. на компе = 0:20:00 , программа = 00:20:01 - СПЕШАТ!
38390 1-я проверка. на компе = 1:20:00 , программа = 01:20:06 - СПЕШАТ!

38400 1-я проверка, на компе = 1:00:00 , программа = 00:59:56 - ОТСТАЮТ!
38400 2-я проверка, на компе = 0:20:00 , программа = 00:20:01 - СПЕШАТ ВСЕ ТАКИ!
38450 , 1-я, на компе = 1:20:00 , программа = 01:19:58 - ОТСТАЮТ!
38425 , 1-я, на компе = 1:25:00 , программа = 1:25:01 - СПЕШАТ!

Устанавливать величину задержки нужно где-то....
HLr(38425);// величина задержки
// спешат = 38425
//отстают = 38450

Во всяком случае так при проверке САС-Емулятором 1.44.
Неплохо бы было, если бы это кто-то проверил на реальном ПК-01 Львов!
В Архиве TimerT2.7z, есть компиляции с разным значением величины задержки
в соответствующих папках 38300, 38350, 38375, 38390, 38400, 38425, 38450

Может попытаюсь убрать из MACRO_Delay одну "Ar_(DelayT);{13}" и тогда длительность макроса снизится 50-13=37 тактов. Если убрать обе то тогда длительность тактов макроса будет 24 такта и величины 65535 не хватит для задержки до 1 секунды. При 24 тактовой задержке величина задержки должна быть около 104166, если я правильно подсчитал.
Поэтому убирать обе "Ar_(DelayT);{13}" из макроса MACRO_Delay в данном случае не резон.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 4 posts ] 

Forum Games WEB Tape Loader Twitter RSS

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
cron
Powered by phpBB® Forum Software © phpBB Limited