jmp rep1 {13}
notShow:
mov cx,13 {было 14} {2}
rep1:
loop rep1 {16}
pop cx
inc cx
loop rep2
{сохранить счетчик каналов для вывода на экран}
and di,$07 {2}
mov ChnToShow,di {4}
end;
{конец чтения каналов}
if FirstTime then begin tms10:=0; FirstTime:=false; end
else tms10:=tms10+TimePeriod;
D.STime:=tms10;
XS^.Write(D,sz);
l:=(XS^.Position+DSize)>MaxMemSize;
{вывод времени}
asm
mov ax,SEG tms10
mov es,ax
mov bx,OFFSET tms10;
mov ax,es:[bx+2];
shr ax,2 {деление на 2^20 - определяет}
{максимальное время 1c - 1 звездочка}
{+умножение на 2}
cmp ax,12 {вышло ли время}
jg tmout
shl ax,1
mov bx,ax
mov ax,VideoSeg
mov es,ax
{Отображение времени}
mov al,'¦'
mov di,StartAddr
rep:
and bx,bx
jz contV
mov es:[di+bx],al
dec bx
dec bx
jmp rep
contV:
{Очистка места}
mov al,' ' {2}
mov di,ClrAddr {2}
mov bx,16 {2}
repC:
and bx,bx {2}
jz contC {3|13}
mov es:[di],al {9}
dec bx
dec di {2}
dec di {2}
jmp repC {13}
contC:
dec di {2}
dec di {2}
mov bx,16 {2}
repC1:
and bx,bx {2}
jz contC1 {3|13}
mov es:[di],al {9}
dec bx
dec di {2}
dec di {2}
jmp repC1 {13}
ContC1:
{Отображение значения}
mov al,'¦'
mov di,TmpAddr
mov bx,ValueToShow
shl bx,1
repV:
and bx,bx {2}
jz cont {3|13}
mov es:[di+bx],al {9}
dec bx {2}
dec bx {2}
jmp repV {13}
tmout:
xor ax,ax {если время вышло}
inc ax
mov timeout,al
skip:
cont:
inc cntr
end;
end;
aprev:=a;
end;
asm
in al,$60 {проверка на нажатие клавиши}
neg al
shr al,7
mov key,al
mov al,key {все проверки на выход из цикла}
or al,l
or al,key1
or al,timeout
mov key1,al
end;
until key1;
TimerReset;
{$R+$S+$Q+$I+}
gotoxy(Wbx+20,by+9); write(cntr:8);
gotoxy(Wbx+42,by+9); write(tms10/1193200:8:6,' ':8);
{ if key then repeat ReadKey until not keypressed;}
CardDone;
if l then SpStrob:=true else
SPStrob:=false;
end;
Приложение Б
Фрагмент программы ввода данных со стробированием от внутреннего таймера компьютера.
function TimeStrob:boolean;
const
Period=361; {=1193200/3300 - предел 187}
var
a:boolean;
label skip,tmout,cont, contV,rep,repV,rep1,rep2,notShow,
repC,repC1,contC,contC1;
begin
CardInit;
key1:=false; timeout:=false; key:=false;
FirstTime:=true;
{инициализация процессора клавиатуры}
while keypressed do readkey;
delay(100); {подождем пока отпустят клавишу}
asm
in al,$61
and al,$7f
out $61,al
end;
{инициализация вывода на экран}
{незабыть доделать чтобы стирать предыдущее значение}
xposChn:=Wbx+38;
yposChn:=BY+0;
StartAddrChn:=(yposChn*80+xposChn)*2;
xposChn:=Wbx+54;
StartAddrChnClr:=(yposChn*80+xposChn)*2;
xpos:=Wbx+40;
ypos:=BY+8;
StartAddr:=(ypos*80+xpos)*2;
Dseg:=seg(D.D[1]);
DOffs:=ofs(D.D[1]);
cntr:=0;
ChnToShow:=0;
{$R-$S-$Q-$I-}
{вводим данные:
прекращаем по нажатию клавиши,
по срабатыванию кнопки,
по переполнению памяти}
timerstartMode1(Period);
repeat
if TimeHighWord<>0 then break;
while TimeHighWord=0 do ;
timerstartMode1Again(Period);
asm
mov dx,$379
in al,dx
{как там датчик?}
mov ah,al
and al,$01 shl RevDetector
shr al,4
mov a,al
{как там кнопка?}
neg ah
and ah,$01 shl KeyForStop
shr ah,KeyForStop
{$ifdef DEBUGMODE}
xor ax,ax {заглушка по кнопке}
{$endif}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.