; Ультразвуковой дальномер ; Для хранения трех последних отсчетов скользящего окна ; используем регистры B-C-H ; Сумму трех последних отсчетов храним в рег. паре DE ; RANGER: in 2 ; ввод младшего байта таймера sta TIME ; запись мл. байта по адресу TIME in 3 ; ввод старшего байта таймера sta TIME+1 ; запись ст. байта по адресу TIME+1 lxi d,0 ; обнуление регистров суммы mov b,d ; обнуление регистров окна mov c,d mov h,d mvi a,h'FF ; запись в порт 1 out 1 ; условной бесконечности CYCLE: mov a,e ; начало цикла накопления отсчетов sub h ; вычитание из суммы отсчета, покидающего окно mov e,a mov a,d sbi 0 mov d,a mov h,c ; перемещение предпоследнего отсчета в рег.H mov c,b ; перемещение последнего отсчета в рег.С in 0 ; ввод нового отсчета mov b,a ; сохранение нового отсчета в рег.В add e ; добавление нового отсчета к сумме в паре DE mov e,a mov a,d aci 0 mov d,a mov a,e sui 150 ; сравнение суммы с порогом 150 mov a,d sbi 0 jm CYCLE ; возврат в начало цикла, если сумма не превышена lxi h,TIME ; загрузка в пару HL адреса мл.байта начала отсчета in 2 ; загрузка в рег.А мл.байта текущего времени sub m ; определение временной задержки jp DELAY adi 128 ; коррекция отрицательной задержки adi 128 DELAY: out 1 ; вывод задержки на порт 1 ret ; возврат в вызывающую программу TIME: .dw 0 ; память для хранения времени начала отсчета .end RANGER