$CHIP=Z80 ; ********************************************************************** ; * * ; * ПРОГРАММА АОН "V1194" * ; * * ; ********************************************************************** ; DEFSEG segabs, ABSOLUTE SEG segabs ORG 0000H ; ; АДРЕСА СИСТЕМНЫХ УСТРОЙСТВ ; CW55 equ 0DBH ; слово управления порта ВВ55 CA55 equ 0C3H ; канал А порта ВВ55 CB55 equ 0CBH ; канал В порта ВВ55 CC55 equ 0D3H ; канал С порта ВВ55 CW53 equ 0BBH ; слово управления таймера ВИ53 C053 equ 0A3H ; счетчик 0 таймера ВИ53 C153 equ 0ABH ; счетчик 1 таймера ВИ53 C253 equ 0B3H ; счетчик 2 таймера ВИ53 IR22 equ 07BH ; регистр сегментов дисплея YB800 EQU 0B800H YB802 EQU 0B802H ; счетчик делителя на 4 YB803 EQU 0B803H ; флаги режимов ; 0 0 0 день недели,часы,минуты ; XXXXXXXX 0 0 1 часы,минуты,секунды ; ¦¦¦¦¦¦¦------ 0 1 0 число,месяц,год ; ¦¦¦¦¦¦L------ 0 1 1 состояние линии ; ¦¦¦¦¦L------- 1 0 0 номер телефона ; ¦¦¦¦фиксация вывода ; ¦¦¦режим телефона 00 - 'n' ; ¦¦режим телефона 01 - 'P' ; ¦режим охраны 10 - 'A' ; ночной телефон 11 - '-' ; ; ; YB804 EQU 0B804H ; минуты последнего звонка YB805 EQU 0B805H ; секунды последнего звонка YB806 EQU 0B806H ; 2-е ячейки сохранения стека YB809 EQU 0B809H ; смещение для списка звонков YB80A EQU 0B80AH ; смещение для входа в списки YB80B EQU 0B80BH ; маска для первой цифры номера YB80C EQU 0B80CH ; смещение для записной книжки YB80D EQU 0B80DH ; количество цифр записываемых в память YB80E EQU 0B80EH ; флаги состояния ; ; XXXXXXX ; ¦¦¦¦¦¦¦1-пауза при автодозвоне ; ¦¦¦¦¦¦1-флаг поступления звонка ; ¦¦¦¦¦1-делать первый запрос (1) ; ¦¦¦¦1-озвучивать каждый час ; ¦¦¦1-громкий набор ; ¦¦1-мелодичное звучание клавиш ; ¦1-флаг набора номера ; 1-флаг поднятой трубки YB810 EQU 0B810H ; состояние канала А YB811 EQU 0B811H ; счетчик звонков YB812 EQU 0B812H ; состояние канала С YB813 EQU 0B813H ; временное хранение скан-кода YB814 EQU 0B814H ; хранение константы задержки DELAY YB815 EQU 0B815H ; флаги дополнительных установок ; 7 6 5 4 3 2 1 0 ; x x x x x x x x ; ¦ ; L- флаг блокировки восьмерки ; ; ; ; YB816 EQU 0B816H YB817 EQU 0B817H YB818 EQU 0B818H YB819 EQU 0B819H ; счетчик знакомест YB81A EQU 0B81AH ; скан-код клавиши YB81B EQU 0B81BH YB81C EQU 0B81CH YB81D EQU 0B81DH YB81E EQU 0B81EH YB81F EQU 0B81FH YB820 EQU 0B820H ; сотые секунды YB821 EQU 0B821H ; секунды YB822 EQU 0B822H ; минуты YB823 EQU 0B823H ; часы YB824 EQU 0B824H ; дни недели YB825 EQU 0B825H ; дни месяца YB826 EQU 0B826H ; месяцы YB827 EQU 0B827H ; годы YB828 EQU 0B828H ; количество немаскируемых цифр YB829 EQU 0B829H ; счетчик 200 YB82B EQU 0B82BH ; таймер YB82C EQU 0B82CH YB830 EQU 0B830H ; начало видеобуфера YB838 EQU 0B838H ; конец видеобуфера YB839 EQU 0B839H ; начало области будильников YB83E EQU 0B83EH ; конец области будильников YB840 EQU 0B840H ; начало области видеоаттрибутов YB848 EQU 0B848H ; конец области видеоаттрибутов YB849 EQU 0B849H ; начало буфера текущего номера YB857 EQU 0B857H ; конец буфера номера (категория номера) YB858 EQU 0B858H ; день недели номера YB859 EQU 0B859H ; день месяца номера YB85A EQU 0B85AH ; год номера YB85B EQU 0B85BH ; часы номера YB85C EQU 0B85CH ; минуты номера YB85D EQU 0B85DH ; конец области дислоцирования номера YB860 EQU 0B860H ; начало буфера сохранения номера YB86F EQU 0B86FH ; конец буфера сохранения номера YB870 EQU 0B870H ; начало буфера номеров будильников YB87F EQU 0B87FH ; конец буфера номеров будильников YB8FF EQU 0B8FFH ; начало системного стека YB900 EQU 0B900H ; начало записной книжки номеров YBC1F EQU 0BC1FH ; конец записной книжки номеров YBC20 EQU 0BC20H ; начало записной книжки звонков YBF00 EQU 0BF00H ; YBF3F EQU 0BF3FH ; конец записной книжки звонков YBF40 EQU 0BF40H ; массив текущих разностей (12 ячеек) YBF50 EQU 0BF50H ; область записи первичного кода (80 ячеек) YBFA0 EQU 0BFA0H ; YBFB0 EQU 0BFB0H ; область первичных цифр (20 ячеек) YBFDO EQU 0BFD0H ; XF000 EQU 0F000H XF8FF EQU 0F8FFH YFA03 EQU 0FA03H XFE7F EQU 0FE7FH XFF00 EQU 0FF00H XFF3F EQU 0FF3FH YFF67 EQU 0FF67H A0000: DI LXI X,0B800H JMP A0063 ; MVI A,0C8H ; RST1 Задержка 0.2 сек JMP A065F ; ; RST 7 RST 7 RST 7 ; EXX ; RST2 Обнуление буфера LXI H,0B840H ; видеоаттрибутов B840h-B848h MVI B,009H JMPR A003F ; LDA YB81A ; RST3 Обработка скан-кода нажатой клавиши CPI 070H ; JMP A11B1 ; EXX ; RST4 Обнуление видеобуфера B830h-B838h LXI H,0B830H ; MVI B,009H JMPR A003F ; EXX ; RST5 Неполное обнуление видеобуфера LXI H,0B831H ; B831h-B838h MVI B,007H JMPR A003F ; A0030: EXX ; RST6 Трансляция буфера номера B850h-B858h LXI B,0B850H ; в видеобуфер JMP A05E8 ; RST 7 ; PUSH PSW ; RST7 Обслуживание прерываний по входу XRA A ; INT в режиме IM1 OUT IR22 JMP A0122 ; A003F: db 36H,00,2CH,10H,0FBH,0D9H,0C9H ; ; ЗАСТАВКА T0046: db 3FH ; 'O' db 76H ; 'H' db 40H ; '-' db 00H ; ' ' db 06H ; '1' db 6FH ; '9' db 6fH ; '9' db 6DH ; '5' db 77H ; 'A' T004F: db 3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH ; кодировочная таблица цифр L0059: db 08,00,0CH,08 ; ; НАЧАЛЬНАЯ ДАТА L005D: db 00 ; минуты db 12 ; часы db 03 ; день недели db 01 ; день месяца db 02 ; месяц года db 95 ; год ; ---------------------------------------------------------------------¬ ; ¦ MAIN BLOCK ¦ ; ¦ ¦ ; L--------------------------------------------------------------------- A0063: LXI SP,0B8FFH LXI H,T02CB ; PUSH H MVI A,082H ; Программирование КР580ВВ55 OUT CW55 MVI A,11000000B ; Разрешение счетчиков 1 и 2 OUT CA55 LXI H,0B800H ; Проверка маркеров целостности информации XRA A OUT IR22 MOV A,M CPI 0AAH JRZ A0081 INR L MOV A,M CPI 088H A0081: JZ A00D1 MVI L,000H MVI B,090H ;---------------------------- инициализация при потере информации A0088: MVI M,000H ; обнуление области YB800-YB88F INR L DJNZ A0088 MVI A,00001001B ; все ключи в пассивное состояние OUT CC55 STA YB812 MVI A,0C0H ; разрешить счетчики 1 и 2 STA YB810 LXI H,T0046 ; Вывод заставки на индикатор LXI D,0B830H LXI B,0009 LDIR MVI L,059H ; Загрузка будильников MVI E,039H MVI C,006H LDIR MVI L,05DH ; Загрузка начальной даты MVI E,022H MVI C,006H LDIR LXI H,0B809H MVI M,000H ; [YB809]=0 INR L MVI M,000H ; [YB80A]=0 INR L MVI M,002H ; [YB80B]=2 INR L MVI M,064H ; [YB80C]=100 INR L INR L MVI M,00100000B ; [YB80E] ; ||||||||-- 1 пауза при автодозвоне ; |||||||--- 1 флаг поступления звонка ; ||||||---- 1 делать запрос ; |||||----- 1 озвучивать каждый час ; ||||------ 1 громкий набор ; |||------- 1 мелодичное звучание клавиш ; ||-------- 1 флаг набор номера прошел ; |--------- 1 флаг поднятой трубки MVI A,006H ; количество немаскируемых цифр STA YB828 MVI LOW(YB814)(X),40 ; Загрузка параметра DELAY CALL A00D1 ; Программирование счетчиков JMP A197A ;---------------------------- ; Инициализатор счетчиков и прерываний ;---------------------------- A00D1: RST 2 ; Обнуление видеоаттрибутов MVI A,030H ; Скан-код = 30H STA YB81A LDA YB812 OUT CC55 MVI A,0C0H ; Разрешить счетчики 1 и 2 STA YB810 MVI A,036H ; Сч 0 - режим 3 OUT CW53 MVI A,074H ; Сч 1 - режим 2 OUT CW53 MVI A,0B0H ; Сч 2 - режим 0 OUT CW53 MVI A,0E4H ; Сч 0 = 22E4H (8932) OUT C053 MVI A,022H OUT C053 MVI A,0FFH ; Сч 1 = FFFFH (65535) OUT C153 OUT C153 LXI H,0B800H ; Установка маркеров сохранности информации MVI M,0AAH INR L MVI M,088H IN CB55 ; Привести ключи в соответствие с положением BIT 2,A ; трубки MVI A,001H JRZ A010D MVI A,009H A010D: OUT CC55 STA YB812 IM1 EI A0115: HLT LDA YB802 ; Корректировка часов ORA A JRNZ A0115 ADI 002H STA YB802 RET ;---------------------------- ;====================================================================== ; БЛОК ОБРАБОТКИ ПРЕРЫВАНИЙ ;====================================================================== ;---------------------------- A0122: DI PUSH H PUSH D PUSH B IN CB55 ; Переустановка сбросового таймера BIT 2,A ; если подняли трубку JRNZ A012F CALL A02BF A012F: LXI H,0B819H ; Адрес счетчика знакомест индикатора INR M MOV A,M CPI 009H ; Обнулить счетчик если пройдено последнее JRC A013A ; знакоместо на индикаторе XRA A MOV M,A A013A: MOV C,A ; [C] - счетчик линий опроса клавиатуры ADI 030H ; Формирование адреса символа в видеобуфере MOV L,A MOV B,M ; Регистр [B] - выводимый символ LXI D,0B810H ; Формирование байта вывода в порт [A] LDAX D ANI 0F0H ADD C STAX D OUT CA55 MVI A,010H ; Формирование адреса видеоаттрибута символа ADD L MOV L,A MOV A,M CPI 001H ; Игнорировать обработку видеоаттрибута если он JRNZ A015B ; не равен 01 LDA YB829 ; Если установлен видеоаттрибут ,то символ CPI 064H ; моргает с частотой 2 Гц JRC A015B MVI B,000H A015B: IN CB55 ; Ввести состояние клавиатуры ANI 0C0H ; Выделить необходимые биты RRC RRC ADD C MVI E,01AH MVI L,013H PUSH B MOV B,A CPI 030H JRNC A016F CALL A02BF ; Переустановить сбросовый счетчик если клавиша A016F: MOV A,C ; нажата CPI 003H JRNZ A017E MVI M,000H MOV A,B CPI 013H JRNZ A017E MOV M,A JMPR A0189 ; A017E: MOV A,M CPI 013H JRNZ A0189 LDAX D CPI 015H JZ 0000 ; Выход по комбинации клавиш "*" + "#" A0189: MVI L,02EH ; Отработка нажатия клавиши MOV A,M ORA A JRZ A01AD DCR M INR L MOV A,M CMP C JRNZ A01B6 DCR L MOV A,B CPI 030H JRC A019F MVI M,000H JMPR A01A7 ; A019F: MOV A,M ANI 0F0H JRNZ A01B6 MVI M,028H MOV A,B A01A7: STAX D CALL A028B ; Сброс генерации тона Сч 2 JMPR A01B6 ; A01AD: MOV A,B CPI 030H JRNC A01B6 STAX D DCR M INR L MOV M,C A01B6: POP B MOV A,B OUT IR22 ; Зажечь символ на индикаторе ; Ведение счетчиков времени MVI L,029H ; Ведение счетчика 200 INR M MOV A,M CPI 0C8H JRNZ A01C4 MVI M,000H A01C4: MVI L,002H ; Ведение делителя на 4 INR M MOV A,M CPI 004H JRNZ A01F9 MVI M,000H ; Ведение сотых долей секунды MVI L,020H INR M MOV A,M CPI 100 JRC A01F9 MVI M,000H ; Ведение таймера секунд LDA YB82B ORA A JRZ A01E2 DCR A STA YB82B A01E2: INR L ; Ведение секунд INR M MOV A,M CPI 60 JRC A01F9 MVI M,000H INR L ; Ведение минут INR M MOV A,M CPI 60 JRC A01F9 MVI M,000H INR L ; Ведение часов INR M MOV A,M CPI 24 A01F9: JC A0250 MVI M,000H INR L ; Ведение дней недели INR M MOV A,M CPI 8 JRC A0207 MVI M,001H A0207: INR L ; Ведение дней месяца INR M LDA YB826 CPI 002H JRNZ A0224 ; Корректировка числа дней в феврале если год LDA YB827 ; високосный ANI 003H MOV A,M JRZ A021E CPI 29 JRC A0250 JMPR A023C ; A021E: CPI 30 JRC A0250 JMPR A023C ; A0224: CPI 8 BIT 0,A JRNC A022E JRNZ A0237 JMPR A0230 ; A022E: JRZ A0237 A0230: MOV A,M CPI 31 JRC A0250 JMPR A023C ; A0237: MOV A,M CPI 32 JRC A0250 A023C: MVI M,001H INR L ; Ведение счетчика месяцев INR M MOV A,M CPI 13 JRC A0250 MVI M,001H INR L ; Ведение счетчика лет INR M MOV A,M CPI 100 JRC A0250 MVI M,000H A0250: POP B POP D POP H POP PSW EI RETI ; -----------------------------------------------------------------------¬ ; ¦ КОНЕЦ ПОДПРОГРАММЫ ОБРАБОТКИ ПРЕРЫВАНИЙ ¦ ; ¦ ¦ ; L----------------------------------------------------------------------- ; ;---------------------------- ; идентификация импульса звонка ; ; Выход : флаг С=0 - импульс идентифицирован ;---------------------------- A0257: PUSH B LXI B,3200H A025B: IN CB55 BIT 1,A JRZ A0262 INR C A0262: XRA A CALL A065F LDA YB81A CPI 030H JRC A0272 ; срочный выход если нажата клавиша DJNZ A025B MOV A,C CPI 005H ; импульс идентифицирован если ; зафиксировано не менее 5 HIGH-состояний ; за 50 1-милисекундных периодов A0272: POP B RET ;---------------------------- ; загрузка СЧ2 из регистра DE , сложить состояние канала А с регистром А ;---------------------------- A0274: EXAF MVI A,0B6H OUT CW53 MOV A,E OUT C253 MOV A,D OUT C253 EXAF MOV E,A LDA YB810 ORA E STA YB810 OUT CA55 RET ;---------------------------- ; блокировка УНЧ , OUT2 = 0 ;---------------------------- A028B: MVI A,10110000B ; СЧ2 в режим 0 , сигнал OUT2 = 0 OUT CW53 LDA YB810 ANI 01101111B ; блокировка УНЧ и СЧ2 STA YB810 OUT CA55 RET ;---------------------------- ; СЧ2 в режим 3 , включение прослушивания линии ;---------------------------- A029A: MVI A,10110110B ; СЧ2 в режим 3 OUT CW53 LDA YB812 SET 7,A ; включение прослушивания линии STA YB812 OUT CC55 LDA YB810 SET 4,A ; разблокировка УНЧ STA YB810 RET ;---------------------------- ; блокировка УНЧ , выкл СЧ2 , блокировка прослушивания линии ;---------------------------- A02B1: CALL A028B LDA YB812 RES 7,A ; блокировка прослушивания линии A02B9: STA YB812 OUT CC55 RET ;---------------------------- ; сброс СЧ1 , перезагрузка сбросового таймера ;---------------------------- A02BF: LDA YB810 RES 6,A OUT CA55 SET 6,A OUT CA55 RET ;---------------------------- ; Арбитр вывода на индикацию ;---------------------------- T02CB: LXI D,T02CB PUSH D LXI D,T03D5 PUSH D RST 2 MVI L,003H ; Если BIT3(YB803)=1 то не изменять содержимое BIT 3,M ; индикатора RNZ MOV A,M BIT 2,A JRNZ A0354 ANI 007H JRNZ A030F ; Вывод времени в формате <день недели , часы , минуты > A02E2: MVI L,030H MVI M,000H INR L LDA YB824 CALL A0527 MOV M,E INR L MVI M,000H INR L LDA YB823 CALL A0540 LDA YB820 CPI 032H JRC A0303 MVI A,040H JMPR A0304 ; A0303: XRA A A0304: MOV M,A LDA YB822 INR L CALL A0540 MVI M,000 RET ; Вывод в формате < часы , минуты , секунды > A030F: DCR A JRNZ A032F A0312: MVI L,030H LDA YB823 CALL A0540 MVI M,040H INR L LDA YB822 CALL A0540 MVI M,040H INR L LDA YB821 CALL A0540 MVI M,00 RET ; Вывод - < пустой индикатор > A032F: DCR A JRZ A0334 RST 4 RET ; Вывод в формате < число месяца , месяц , год > A0334: MVI L,030H LDA YB825 CALL A0540 MVI M,040H INR L LDA YB826 CALL A0540 MVI M,040H INR L LDA YB827 CALL A0540 MVI M,05EH RET ; Вывод в формате < литера режима , номер телефона > A0351: LDA YB803 A0354: MVI L,030H MVI M,000H BIT 7,A JRZ A035E MVI M,080H A035E: BIT 6,A MVI L,038H MVI M,000H JRZ A0368 MVI M,080H A0368: ANI 030H JRNZ A036E MVI A,054H ; 'n' A036E: CPI 010H JRNZ A0374 MVI A,073H ; 'P' A0374: CPI 020H JRNZ A037A MVI A,077H ; 'A' A037A: CPI 030H JRNZ A0380 MVI A,040H ; '-' A0380: ORA M MOV M,A RST 6 RET ;---------------------------- ; Установка режимов ;---------------------------- A0384: RST 2 CALL A0351 MVI 048H(X),001H MVI 040H(X),001H RST 1 CALL A0CFC RST 3 CPI 00BH RZ MVI L,003H DCR A JRNZ A03B0 MOV A,M ANI 030H CPI 030H MVI E,000H JRZ A03A9 ADI 010H MOV E,A A03A9: MOV A,M ANI 0CFH ORA E MOV M,A JMPR A0384 ; A03B0: DCR A JRNZ A03BD BIT 6,M RES 6,M JRNZ A0384 SET 6,M JMPR A0384 ; A03BD: DCR A JRNZ A0384 BIT 7,M RES 7,M JRNZ A0384 SET 7,M JMPR A0384 ;---------------------------- ; Установка заставки ;---------------------------- A03CA: MVI L,003H MOV A,M INR M BIT 2,A RZ ANI 0F8H MOV M,A RET ; ;---------------------------- ;********************************************************** ; Основной блок программы ;********************************************************** ;---------------------------- T03D5: CALL A0CFC ; Контроль звонка ,состояния линии , трубки ; и управление функциями телефона и АОН RST 3 ; Обработка ввода с клавиатуры ORA A JZ A1042 ; "0" Набор при положенной трубке DCR A JRZ A0384 ; "1" Вход в установку режимов DCR A JZ A057B ; "2" Прослушивание телефонной линии DCR A JZ A1248 ; "3" Вход в установку будильников DCR A JRZ A03CA ; "4" Установка заставки DCR A JZ A1012 ; "5" Набор номера ячейки записной книжки DCR A JZ A048E ; "6" Секундомер DCR A JZ A0761 ; "7" Вход в записную книжку DCR A JZ A075C ; "8" Вход в список звонивших DCR A JZ A1446 ; "9" Вход в режим установок DCR A JZ A0B75 ; "#" Автодозвон DCR A RZ LDA YB80E ; Миновать этот участок если идет разговор BIT 6,A ; после набора номера RNZ LDA YB803 ; Миновать проверку датчика если не установлен BIT 6,A ; режим охраны JRZ A0419 IN CB55 BIT 5,A JZ A0F40 ; Начать дозвон если сработал датчик A0419: IN CB55 BIT 3,A RNZ ; Выйти если линия не занята BIT 2,A RZ ; Выйти если поднята трубка ; Начало определения номера набираемого на параллельном телефоне MVI C,0FFH CALL A02BF SET 6,LOW(YB80E)(X) ; Установить бит набоРа номеРа A0423: LDA YB81A CPI 030H RC ; Выйти если нажата клавиша IN CB55 BIT 2,A RZ ; Выйти если поднята трубка BIT 3,A JRZ A0423 ; Переход если линия низкая CALL A0457 ; Определение набираемой цифры XRA A ORA D RZ ; Выход если набор цифры не состоялся MOV D,H INR C ; Зафиксировать набор первой цифры JRNZ A0442 MVI L,00DH MOV M,C ; Зафиксировать количество набранных цифр CALL A0881 A0442: MVI B,001H ; Преобразовать число 10 в цифру 0 CPI 00AH JRNZ A0449 XRA A A0449: CALL A064D ; Ввод цифры в буфер номера MVI L,030H MVI M,05CH ; Вывод знака 'o' во 2-й позиции дисплея RST 6 ; Вывод в видеобуфер EXX MVI M,05CH EXX JMPR A0423 ; Продолжать определение набираемого номера ;---------------------------- ; Определение цифры набираемой на параллельном аппарате в пульсе ;---------------------------- A0457: MVI D,000H A0459: MVI B,003H ; запас на дебезг MVI E,0C8H ; (FFH-[E])*2.5 A045D: INR E ; 137.5 ms RZ CALL A047A JRNZ A045D DJNZ A045D MVI A,(0C8H+8) ; 8*2.5 - минимальная длительность импульса 20 ms CMP E RNC INR D MVI B,003H MVI E,0C8H A046F: INR E RZ CALL A047A JRZ A046F DJNZ A046F JMPR A0459 ;---------------------------- ; Выход из вызывающей подпрограммы при нажатии клавиши или поднятии трубки ;---------------------------- A047A: HLT LDA YB81A CPI 030H JRC A048B IN CB55 BIT 2,A JRZ A048B BIT 3,A RET ; A048B: POP PSW POP PSW RET ;---------------------------- ; Секундомер ;---------------------------- A048E: RST 2 JMPR A04DD ; A0491: CALL A04E8 CALL A0CFC RST 3 ORA A JRNZ A04CF SET 7,004H(X) A049F: MVI L,030H XRA A MOV M,A INR L CALL A0540 XRA A MOV M,A INR L CALL A0540 DCR L MVI A,080H ORA M MOV M,A INR L XRA A CALL A0540 MVI M,039H RST 3 CPI 00BH RZ CPI 00AH JRNZ A049F LDA YB821 STA YB805 LDA YB822 STA YB804 JMPR A04DD ; A04CF: CPI 00AH JRNZ A04E3 BIT 7,004H(X) SET 7,004H(X) JRZ A0491 A04DD: RES 7,004H(X) JMPR A0491 ; A04E3: CPI 00BH RZ JMPR A0491 ; A04E8: BIT 7,004H(X) RNZ HLT MVI L,038H MVI M,039H DCR L DCR L LDA YB820 CALL A0540 MVI L,034H LDA YB821 MVI C,000H SUB 005H(X) JRNC A0509 ADI 03CH DCR C A0509: CALL A0540 DCR L MVI A,080H ORA M MOV M,A MVI L,030H MVI M,000H INR L LDA YB822 ADD C SUB 004H(X) JRNC A0521 ADI 03CH A0521: CALL A0540 MVI M,000H RET ;---------------------------- ; Преобразование байта из [A] в два байта кода семисегментного ; индикатора в [DE] ;---------------------------- A0527: PUSH H LXI H,T004F MVI D,000H A052D: CPI 00AH JRC A0536 INR D SUI 00AH JMPR A052D ; A0536: ADD L MOV L,A MOV E,M MOV A,D ADI 04FH MOV L,A MOV D,M POP H RET ;---------------------------- ; Запись семисегментного кода байта из [A] в буфер ; по адресу из [HL] ;---------------------------- A0540: CALL A0527 MOV M,D INR L MOV M,E INR L RET ;---------------------------- ; Вывод на индикатор количества звонков ;---------------------------- A0548: RST 2 MVI L,038H MVI M,06DH MVI L,030H MVI M,05CH INR L MVI M,01CH INR L MVI M,054H INR L MVI M,05EH INR L MVI M,040H INR L LDA YB811 CPI 064H JRNC A0569 MVI M,03FH JMPR A0577 ; A0569: CPI 0C8H JRC A0573 MVI M,05BH SUI 0C8H JMPR A0577 ; A0573: MVI M,006H SUI 064H A0577: INR L JMP A0540 ;---------------------------- ; Прослушивание телефонной линии и индикация числа звонков ;---------------------------- A057B: RST 1 RST 1 CALL A029A CALL A0548 A0583: CALL A0CFC RST 3 CPI 030H JRNC A0583 ORA A JRNZ A0591 STA YB811 A0591: CPI 00BH RZ JMPR A057B ;---------------------------- ; Проверка на присутствие сигнала звонка в линии ;---------------------------- A0596: RST 4 RST 2 MVI L,045H MVI M,001H MVI L,031H MVI M,03FH INR L MVI A,071H MOV M,A INR L MOV M,A INR L MVI M,040H INR L MVI M,038H MVI L,012H MOV A,M SET 3,A RES 1,A OUT CC55 MVI B,008H A05B7: RST 1 CALL A0257 JRC A05C3 CALL A0257 JRC A05C3 RST 0 A05C3: DJNZ A05B7 MOV A,B STA YB816 MOV A,M OUT CC55 RST 2 RET ;---------------------------- ; Вывод на индикатор 'Pn .......' ;---------------------------- A05CE: RST 2 MVI 038H(X),073H JMPR A05E2 ;---------------------------- ; Вывод на индикатор 'nn номер ' ;---------------------------- A05D5: RST 2 MVI 040H(X),001H MVI 048H(X),001H MVI 038H(X),054H A05E2: MVI 030H(X),054H RST 6 RET ; ;---------------------------- ; Трансляция буфера адрес начала которого в [BC] в видеобуфер ;---------------------------- A05E8: LXI H,0B831H A05EB: LDAX B CPI 00AH JRNZ A05F4 MVI E,040H ; байт 0AH --> '-' JMPR A060F ; A05F4: CPI 00BH JRNZ A05FC MVI E,000H ; байт 0BH --> ' ' JMPR A060F ; A05FC: CPI 00CH JRNZ A0604 MVI E,073H ; байт 0CH --> 'P' JMPR A060F ; A0604: CPI 00DH JRC A060C MVI E,008H ; байт 0DH --> '_' JMPR A060F ; A060C: CALL A0527 A060F: MOV M,E INR L INR C MOV A,L CPI 038H JRNZ A05EB EXX RET ; ;---------------------------- ; Ввод цифр с клавиатуры в буфер номера со сдвигом ; с предварительной заставкой в виде предыдущего номера ;---------------------------- A0619: MVI 040H(X),001H MVI 048H(X),001H RST 6 A0622: LDA YB81A ; контроль клавиатуры CPI 015H RZ ; выход по клавише '* ' CPI 013H JZ A0B75 ; переход к автодозвону по клавише '# ' CPI 030H JRNC A0622 MOV D,H CALL A0881 XRA A STA YB80D MVI B,00EH A063B: RST 6 A063C: CALL A0B33 ;---------------------------- ; Ввод цифр с клавиатуры в буфер номера со сдвигом ;---------------------------- A063F: RST 3 CPI 00AH JRNZ A0646 MVI A,00DH A0646: CPI 00BH RZ CPI 030H JRNC A063C A064D: MVI L,04AH MVI E,049H PUSH B LXI B,000DH LDIR POP B STAX D MVI L,00DH INR M DJNZ A063B RET ;---------------------------- ; Задержка (A+1)*3603+22 такта ;---------------------------- A065F: EXX MOV C,A A0661: CALL A175C DCR C MOV A,C CPI 0FFH JNZ A0661 EXX RET ;---------------------------- ; Набор цифры при автодозвоне ;---------------------------- A066D: PUSH H PUSH D PUSH B CPI 00DH JRNZ A069E IN CB55 BIT 2,A CNZ A029A MVI A,028H STA YB82B A0680: CALL A117E JRC A069A LDA YB82B ORA A JRZ A069A CALL A0AAB JRZ A0680 CALL A0AAB JRZ A0680 CALL A02B1 JMPR A06DD ; A069A: RST 2 ORA H JMPR A06DF ; A069E: CPI 00AH JRNC A06DD ORA A JRNZ A06A7 MVI A,00AH A06A7: MOV B,A LDA YB812 MOV C,A ANI 0F0H MOV D,A ORI 00EH OUT CC55 PUSH B MVI B,004H A06B6: RST 1 DJNZ A06B6 POP B A06BA: MOV A,D ORI 009H OUT CC55 MVI A,03CH CALL A065F IN CB55 BIT 3,A JZ A0000 MOV A,D ORI 00EH OUT CC55 MVI A,028H CALL A065F DJNZ A06BA MOV A,C STA YB812 OUT CC55 A06DD: RST 2 XRA A A06DF: POP B POP D POP H RET ;---------------------------- ; Установка видеоаттрибута для элемента в видеобуфере адрес которого в [HL] ;---------------------------- A06E3: PUSH H MOV A,L SUI 00FH MOV L,A MVI M,001H POP H RET ;---------------------------- ; Набор номера при автодозвоне ;---------------------------- A06EC: LDA YB812 MOV C,A SET 1,A STA YB812 OUT CC55 CALL A117E JRC A0750 LDA YB80D MOV B,A CPI 008H JRC A0712 MVI L,056H LXI D,0B85DH PUSH B LXI B,000EH LDDR POP B MVI B,00EH A0712: MVI L,050H A0714: CALL A06E3 CALL A117E JRC A0750 RST 6 LDA YB81A CPI 015H JRZ A0750 MOV A,M CALL A066D JRNZ A0750 XRA A ORA B JRZ A072F DCR B A072F: INR L RST 2 MOV A,L CPI 057H JRNZ A0714 XRA A ORA B JRZ A074A PUSH B MVI L,051H LXI D,0B850H LXI B,000DH LDIR MVI L,056H POP B JMPR A0714 ; A074A: CALL A090D XRA A JMPR A0754 ; A0750: CALL A090D STC A0754: MOV A,C STA YB812 OUT CC55 RST 2 RET ;---------------------------- ; Вход в список звонивших ;---------------------------- A075C: LDA YB80C JMPR A0764 ;---------------------------- ; Вход в записную книжку ;---------------------------- A0761: LDA YB809 A0764: STA YB80A CALL A0904 ; Сохранение видеобуфера T076A: CALL A096E ; Распаковка в буфер номера CALL A0A15 ; Вывод номера ячейки и номера RST 2 LXI B,T076A PUSH B CALL A0CFC RST 3 ORA A JRZ A07A9 ; "0" Очистка ячейки DCR A JZ A08A2 ; "1" Время,дата и скрытая часть номера DCR A JRZ A07C9 ; "2" Категория абонента, установка масок DCR A JZ A0849 ; "3" Уничтожение списка DCR A JZ A0894 ; "4" Запись в ячейку из индикатора DCR A JZ A0827 ; "5" Набор номера DCR A JZ A0904 ; "6" Перенос из ячейки в индикатор DCR A JZ A08E2 ; "7" Движение к началу списка DCR A JZ A08C2 ; "8" Прыжок в начало/конец списка DCR A JZ A08F6 ; "9" Движение к концу списка DCR A JZ A0B75 ; "#" Автодозвон DCR A RNZ POP B ; "*" Выход из списков JMP A090D ;---------------------------- ; Очистка ячейки ;---------------------------- A07A9: CALL A0D75 CALL A0B33 RST 3 ORA A JRNZ A07C4 CALL A091B XRA A STAX D INR E MVI B,007H MVI A,0BBH A07BD: STAX D INR E DJNZ A07BD JMP A0881 ; A07C4: CPI 00CH RC JMPR A07A9 ;---------------------------- ; Категория абонента , установка масок ;---------------------------- A07C9: RST 4 CALL A091B LDAX D RLC RNC RLC RNC A07D2: RST 2 CALL A113D MVI L,045H MVI M,001H A07DA: RST 3 CPI 00BH RZ JRNC A07DA CPI 00AH JRZ A07ED CPI 004H RNC MOV B,A LDAX D ANI 0FCH ORA B STAX D A07ED: RST 2 MVI L,046H MVI M,001H CALL A113D A07F5: RST 3 CPI 00BH RZ JRNC A07F5 CPI 00AH JRZ A080E MOV B,A LDAX D RES 4,A MOV C,A XRA A ORA B JRZ A080C SET 4,C DCR A RNZ A080C: MOV A,C STAX D A080E: RST 2 MVI L,047H MVI M,001H CALL A113D A0816: RST 3 CPI 00BH RZ JRNC A0816 CPI 00AH JRZ A07D2 DCR A RNZ LDAX D RES 6,A STAX D RET ;---------------------------- ; Набор номера в записную книжку ;---------------------------- A0827: CALL A05D5 A082A: LDA YB81A CPI 015H RZ CPI 030H JRNC A082A CALL A0619 CALL A091B LDA YB80D CPI 008H MVI A,0E0H JRNC A0845 MVI A,0C0H A0845: STAX D JMP A09C7 ;---------------------------- ; Уничтожение списка записной книжки ;---------------------------- A0849: CALL A0D75 MVI 040H(X),001H MVI 048H(X),001H CALL A0B33 RST 3 ORA A JRZ A0860 CPI 00CH JRNC A0849 RET ; A0860: LXI D,0BC20H LDA YB80A CPI 064H JRNC A088E LXI H,0B900H A086D: MVI M,000H INX H MVI B,007H A0872: MVI M,0BBH INX H DJNZ A0872 MOV A,H CMP D JRC A086D MOV A,L CMP E JRC A086D MVI H,0B8H ;---------------------------- ; Очистка буфера номера ;---------------------------- A0881: EXX LXI H,0B849H MVI B,00EH A0887: MVI M,00BH INR L DJNZ A0887 EXX RET ; A088E: XCHG LXI D,0BF40H JMPR A086D ;---------------------------- ; Запись в ячейку из индикатора ;---------------------------- A0894: RST 2 RST 5 CALL A090D CALL A091B MVI A,0C0H STAX D JMP A09C7 ;---------------------------- ; Время , дата для коротких номеров ;---------------------------- A08A2: CALL A091B LDAX D BIT 5,A JZ A092C MVI L,057H MOV D,H MVI E,05DH LXI B,000EH LDDR RST 6 LXI B,000EH XCHG LDIR A08BC: RST 3 CPI 00CH JRNC A08BC RET ;---------------------------- ; Прыжок в начало/конец списка ;---------------------------- A08C2: MVI L,00AH MOV A,M MVI C,064H ORA A JRNZ A08CE MVI A,063H JMPR A08ED ; A08CE: CMP C JRNZ A08D5 MVI A,0C7H JMPR A08F1 ; A08D5: CPI 0C7H JRNZ A08DC A08D9: MOV A,C JMPR A08F1 ; A08DC: CMP C JRNC A08D9 XRA A JMPR A08ED ;---------------------------- ; Движение к началу списка ;---------------------------- A08E2: MVI L,00AH MOV A,M ORA A RZ CPI 064H RZ DCR A JRNC A08F1 A08ED: MOV M,A DCR L MOV M,A RET ; A08F1: MOV M,A INR L INR L MOV M,A RET ;---------------------------- ; Движение к концу списка ;---------------------------- A08F6: MVI L,00AH MOV A,M INR A CPI 0C8H RZ CPI 064H RZ JRNC A08F1 JMPR A08ED ;---------------------------- ; Сохранение буфера номера ;---------------------------- A0904: EXX LXI H,0B849H LXI D,0B860H JMPR A0914 ;---------------------------- ; Востановление буфера номера ;---------------------------- A090D: EXX LXI H,0B860H LXI D,0B849H A0914: LXI B,000FH LDIR EXX RET ;---------------------------- ; Вычислитель абсолютного адреса ячейки хранения номера ;---------------------------- A091B: LDA YB80A RLC RLC RLC MOV D,A ANI 0F8H MOV E,A MVI A,007H ANA D ADI 0B9H MOV D,A RET ;---------------------------- ; Вывод времени и даты телефона из списка ;---------------------------- A092C: RST 5 MVI L,032H MVI M,076H INR L LDA YB85B CALL A0540 MVI M,040H INR L LDA YB85C CALL A0540 A0941: RST 3 DCR A JRZ A094A CPI 00CH RC JMPR A0941 ; A094A: RST 5 MVI L,031H LDA YB858 CALL A0527 MOV M,E INR L INR L LDA YB859 CALL A0540 MVI M,040H INR L LDA YB85A CALL A0540 A0965: RST 3 DCR A JRZ A092C CPI 00CH RC JMPR A0965 ;---------------------------- ; Распаковщик ;---------------------------- A096E: CALL A091B MVI A,007H STA YB80D LDAX D INR E MVI L,050H MVI B,004H BIT 5,A JRZ A0989 MVI L,049H MVI B,007H MVI A,00EH STA YB80D A0989: LDAX D ANI 0F0H RRC RRC RRC RRC MOV M,A INR L LDAX D ANI 00FH MOV M,A INR E INR L DJNZ A0989 MOV A,E ANI 007H RZ LDAX D ANI 0E0H RLC RLC RLC MOV M,A INR L LDAX D ANI 01FH MOV M,A INR E INR L LDAX D ANI 0F0H RRC RRC RRC RRC MOV M,A INR L LDAX D ANI 00FH MOV B,A INR E LDAX D ANI 040H RRC RRC ORA B MOV M,A INR L LDAX D ANI 03FH MOV M,A RET ;---------------------------- ; Упаковщик ;---------------------------- A09C7: CALL A091B LDAX D INR E BIT 5,A MVI L,050H MVI B,004H JRZ A09D8 MVI L,049H MVI B,007H A09D8: MOV A,M RLC RLC RLC RLC MOV C,A INR L MOV A,M ORA C STAX D INR L INR E DJNZ A09D8 MOV A,E ANI 007H RZ LDA YB824 RRC RRC RRC MOV C,A LDA YB825 ORA C STAX D INR E LDA YB826 RLC RLC RLC RLC MOV C,A LDA YB823 ANI 00FH ORA C STAX D LDA YB823 ANI 010H RLC RLC MOV C,A INR E LDA YB822 ORA C STAX D RET ;---------------------------- ; Вывод номера ячейки и номера телефона в списках ;---------------------------- A0A15: MVI E,064H LDA YB80A CMP E JRC A0A1E SUB E A0A1E: CALL A0527 MVI L,038H MOV M,D MVI A,080H ORA E MVI L,030H MOV M,A CALL A091B LDAX D RLC JRC A0A33 RST 5 RET ; A0A33: RLC JC A0030 MVI B,007H MVI L,031H A0A3B: MVI M,080H INR L DJNZ A0A3B RET ;---------------------------- ; Корректировка сотых долей секунды ;---------------------------- A0A41: PUSH B MOV B,A A0A43: LDA YB820 CPI 000H JRNZ A0A43 MOV A,B STA YB820 POP B RET ;---------------------------- ; Детектор периода частоты 425 Гц ; ; Выход: [A]=01 - частота обнаружена , [A]=00 - частота не обнаружена ;---------------------------- A0A50: EXX LXI D,A0000 HLT MVI B,01DH A0A57: IN CB55 RAR CC A0AA5 CNC A0AA2 DJNZ A0A57 MVI B,01DH A0A64: IN CB55 RAR CC A0AA8 CNC A0A9F DJNZ A0A64 MVI B,01DH A0A71: IN CB55 RAR CC A0AA2 CNC A0AA5 DJNZ A0A71 MVI B,01DH A0A7E: IN CB55 RAR CC A0A9F CNC A0AA8 DJNZ A0A7E MOV A,D SUI 03AH JRNC A0A8F CMA A0A8F: MOV D,A MOV A,E SUI 03AH JRNC A0A96 CMA A0A96: ADD D CPI 030H MVI A,001H EXX RNC XRA A RET ; A0A9F: NOP NOP RET ; A0AA2: NOP INR E RET ; A0AA5: NOP INR D RET ; A0AA8: INR E INR D RET ;---------------------------- ; Детектор тона 425 Гц на протяжениии 47 мс ; ; Выход: [A]=01 - частота обнаружена , [A]=00 - частота не обнаружена ;---------------------------- A0AAB: PUSH B MVI B,014H MVI C,000H A0AB0: CALL A0A50 ADD C MOV C,A DJNZ A0AB0 MOV A,C CPI 005H POP B MVI A,001H RNC XRA A RET ;---------------------------- ; Детектор тона 425 Гц на протяжении 0.75 с ;---------------------------- A0AC0: PUSH B MVI C,000H MVI B,014H A0AC5: CALL A0AAB ADD C MOV C,A DJNZ A0AC5 CPI 010H POP B RET ;---------------------------- ; Анализатор информационных сигналов линии ; Выход: [A]= 05 - поднята трубка ; 03 - ответ станции ; 01 - занято ; 00 - нет сигнала ;---------------------------- LINE_ANALIZER: PUSH D PUSH B MVI B,60 ; Время анализа не более 3-х секунд MVI C,0 ; Обнулить флаги ; Bit6[C] - флаг импульса ; Bit7[C] - флаг паузы LXI D,0 ; Обнулить длительности паузы [D] и импульса [E] L_A0: CALL A0AAB ; Детектор частоты 425 Гц ORA A JZ L_A9 ; Если не обнаружен тон , то обрабатывать паузу ; Обработка тонового импульса MOV A,E ; Если длина импульса = 0 , то выставить ORA E ; флаг импульса JNZ L_A1 SET 6,C L_A1: INR E ; Увеличить счетчик длины импульса BIT 7,C ; Обработать предыдущую паузу , если стоит JZ L_A2 ; её флаг MOV A,D ; Если пауза меньше 0,10 или больше 0.55 CPI 2 ; то сбросить счетчик идентификатора [C] JC L_A3 MVI A,11 CMP D JC L_A3 INR C ; Если пауза в заданных пределах , то увеличить JMP L_A4 ; счетчик идентификатора L_A3: MOV A,C ANI 11000000B MOV C,A L_A4: MVI D,0 ; Обработав предыдущую паузу сбросить её флаг RES 7,C L_A2: MVI A,22 ; Если импульс длинее 1.1 с то принять его за CMP E ; ответ станции JC L_A5 L_A6: MOV A,C ; Проверка счетчика идентификатора ANI 00111111B ; Считать что принят сигнал занято , если CPI 5 ; счетчик идентификатора больше 3 JNC L_A7 IN CB55 ; Проверка поднятия трубки BIT 2,A JZ L_A8 DJNZ L_A0 ; Если за время проверки не произошло досрочной XRA A ; идентификации , то считать что нет никакого L_A10: POP B ; сигнала POP D RET L_A8: MVI A,5 ; Установка выходных идентифицирующих кодов JMP L_A10 L_A5: MVI A,3 JMP L_A10 L_A7: MVI A,1 JMP L_A10 ; Обработка паузы L_A9: MOV A,D ORA D JNZ L_A11 SET 7,C L_A11 INR D BIT 6,C JZ L_A6 MOV A,E CPI 3 JC L_A12 MVI A,12 CMP E JC L_A12 INR C JMP L_A13 L_A12: MOV A,C ANI 11000000B MOV C,A L_A13: MVI E,0 RES 6,C JMP L_A6 ;---------------------------- ; Тест линии на незанятость параллельным аппаратом и работоспособность ; Длительность теста 1 мс ;---------------------------- A0B13: IN CB55 BIT 2,A JRZ A0B2E LDA YB812 ANI 0F8H INR A OUT CC55 XRA A CALL A065F IN CB55 BIT 3,A LDA YB812 OUT CC55 A0B2E: MVI A,001H RZ XRA A RET ;---------------------------- ; Анализатор состояния линии , фиксатор положения трубки ; переключатель разговорной части ;---------------------------- A0B33: PUSH H LXI H,0B80EH IN CB55 BIT 3,A JRZ A0B43 RES 3,003H(X) RES 6,M A0B43: BIT 2,A LDA YB812 RES 1,A RES 3,A SET 7,M JRZ A0B54 RES 7,M SET 3,A A0B54: STA YB812 OUT CC55 JRZ A0B65 RES 1,M CALL A0C38 ORA A JRZ A0B65 SET 1,M A0B65: POP H JMP A135D ; A0B69: LDA YB81A CPI 015H JRZ A0B72 JMPR A0B13 ; A0B72: MVI A,001H RET ;---------------------------- ; Автодозвон ;---------------------------- A0B75: RST 1 RST 3 CPI 00BH RZ CALL A0904 MVI C,032H A0B7F: CALL A0596 CALL A0904 CALL A02BF CALL A02B1 CALL A05CE CALL A117E RC LXI H,0B830H MVI M,05CH MVI B,008H A0B99: CALL A117E RC CALL A0AC0 JRNC A0BA6 DJNZ A0B99 JMPR A0BCD ; A0BA6: PUSH B CALL A06EC POP B JRC A0BCD MVI A,03CH STA YB82B A0BB2: CALL A117E RC IN CB55 BIT 2,A CNZ A029A CALL LINE_ANALIZER CPI 005H JRZ A0C11 DCR A JRZ A0BCD LDA YB82B ORA A JRNZ A0BB2 A0BCD: CALL A0B69 DCR A JRZ A0C11 DCR C JRZ A0C11 CALL A02B1 RES 1,A CALL A02B9 LDA YB80E BIT 0,A JRZ A0B7F MVI B,018H A0BE7: PUSH B RST 2 MVI B,009H MVI L,040H A0BED: INR M INR L PUSH B PUSH D PUSH H CALL A0CFC IN CB55 BIT 3,A JZ A0000 POP H POP D POP B DJNZ A0BED POP B RST 3 CPI 00AH JRZ A0C0E CPI 00CH JRNC A0C0C RST 0 A0C0C: DJNZ A0BE7 A0C0E: JMP A0B7F ; A0C11: CALL A02B1 RES 1,A CALL A02B9 CALL A05CE JMP A0B33 ;---------------------------- ; Идентификатор звонка (200 мс) ; ; Выход: [A]=01 - есть звонок , [A]=00 - нет звонка ;---------------------------- A0C1F: CALL A0257 JRC A0C36 CALL A02BF PUSH B MVI B,003H A0C2A: CALL A0257 JRC A0C35 DJNZ A0C2A POP B MVI A,001H RET ; A0C35: POP B A0C36: XRA A RET ;---------------------------- ; Определение ситуации в линии ;---------------------------- A0C38: LDA YB816 DCR A JRNZ A0C6B CALL A0C1F CPI 001H JRNZ A0C46 RET ; A0C46: IN CB55 BIT 2,A JRZ A0C5D BIT 3,A JRZ A0C52 XRA A RET ; A0C52: PUSH B MVI B,00AH A0C55: CALL A0257 JRNC A0C62 DJNZ A0C55 A0C5C: POP B A0C5D: XRA A STA YB816 RET ; A0C62: CALL A0C1F CPI 001H JRNZ A0C5C POP B RET ; A0C6B: IN CB55 BIT 3,A JRZ A0C8D MVI A,002H STA YB82B A0C76: IN CB55 BIT 3,A JRZ A0C8D LDA YB81A CPI 030H JRC A0C8D LDA YB82B ORA A JRNZ A0C76 INR A STA YB816 A0C8D: XRA A RET ;---------------------------- ; Функция АОН ;---------------------------- A0C8F: PUSH H LDA YB812 SET 1,A ; Имитация поднятия трубки STA YB812 OUT CC55 CALL A0881 ; Очистка буфера номера RST 5 ; Очистка видеобуфера CALL A16E7 ; Запрос и определение номера CALL A0CD8 ; Маскировка цифр RST 6 LDA YB857 ; Вывод в первую позицию индикатора категории CALL A0527 MOV 038H(X),E MVI 030H(X),040H CALL A0D58 ; Упаковка номера и времени в список поступивших MVI A,032H ; звонков CALL A0A41 ; Корректировка времени MVI A,030H CALL A0A41 INR 011H(X) ; Увеличить счетчик звонков SET 3,003H(X) SET 6,00EH(X) POP H LDA YB821 ; Сохранение минут и секунд времени поступления STA YB805 ; звонка LDA YB822 STA YB804 RET ;---------------------------- ; Маскировщик цифр ;---------------------------- A0CD8: LDA YB828 CPI 007H RZ LDA YB80B LXI H,0B850H CMP M RNZ MVI M,00BH LDA YB828 CPI 006H RZ INR L MVI M,00BH RET ;---------------------------- ; Ожидание конца звонка в течении 3-х секунд ;---------------------------- A0CF2: MVI B,00FH A0CF4: CALL A0C1F DCR A RNZ DJNZ A0CF4 RET ;---------------------------- ; Отработка режимов телефона ;---------------------------- A0CFC: CALL A0B33 LDA YB80E BIT 7,A JNZ A1042 BIT 1,A RZ LDA YB803 ANI 030H JRZ A0D41 CPI 030H JRZ A0D41 ; Отработка режимов 'P' , 'A' MVI B,004H A0D17: RST 1 DJNZ A0D17 A0D1A: XRA A STA YB816 CALL A0CF2 CALL A0C8F CALL A0EC5 MOV L,A LDA YB803 ANI 030H CPI 020H MOV A,L JZ A0E85 CALL A0D82 A0D36: LDA YB812 RES 1,A OUT CC55 STA YB812 RET ;---------------------------- ; Отработка режима '-' ;---------------------------- A0D41: CALL A0DEB RNZ LDA YB803 ANI 030H RNZ IN CB55 BIT 2,A JRZ A0D1A CALL A0257 JRNC A0D41 JMPR A0D1A ;---------------------------- ; Смещение записной книжки звонков вверх на одну запись ;---------------------------- A0D58: EXX LXI H,0BF37H LXI D,0BF3FH MVI A,007H STA YB80D MVI A,064H STA YB80A LXI B,0318H LDDR INX H MVI M,0C0H EXX JMP A09C7 ;---------------------------- ; Присвоение всем символам видеобуфера аттрибута моргания ;---------------------------- A0D75: EXX LXI H,0B841H MVI B,007H A0D7B: MVI M,001H INR L DJNZ A0D7B EXX RET ;---------------------------- ; Формирователь звонка и сигнала подделки ;---------------------------- A0D82: PUSH B MOV C,A CALL A0D75 MVI A,078H STA YB82B A0D8C: MOV A,C DCR A JRZ A0D97 MVI B,005H A0D92: RST 1 DJNZ A0D92 JMPR A0D9D ; A0D97: CALL A1942 DCR A JRZ A0DE3 A0D9D: CALL A0B69 DCR A JRZ A0DE3 LDA YB812 SET 6,A STA YB812 OUT CC55 LXI D,1072H CALL A0274 MVI A,0C0H OUT CA55 STA YB810 MVI B,005H A0DBC: RST 1 DJNZ A0DBC CALL A02B1 LDA YB812 RES 6,A STA YB812 OUT CC55 MVI A,060H STA YB810 CALL A0B69 DCR A JRZ A0DE3 CALL LINE_ANALIZER ORA A JRNZ A0DE3 LDA YB82B ORA A JRNZ A0D8C A0DE3: RST 2 CALL A02B1 POP B JMP A0B33 ;---------------------------- ; Работа телефона в режиме '-' ;---------------------------- A0DEB: LDA YB80E BIT 1,A JRZ A0E48 LDA YB814 ; Загрузка в таймер задержки поднятия STA YB82B ORA A JZ EXIT_0DEB A0DF7: MVI B,100 A0DF9: MVI A,10 CALL A065F IN CB55 BIT 2,A RZ BIT 3,A RZ DJNZ A0DF9 LDA YB803 BIT 7,A JRZ A0E1D CALL A0D75 XRA A JMPR A0E1F ; A0E1D: MVI A,001H A0E1F: CALL A0E4A DCR A RZ MVI C,000H A0E26: MVI B,004H A0E28: IN CB55 BIT 2,A RZ BIT 3,A RZ CALL A0257 JRC A0E41 DJNZ A0E28 LDA YB82B ORA A JRNZ A0DF7 EXIT_0DEB: POP PSW JMP A0D1A ; A0E41: INR C MOV A,C CPI 0C8H JRNZ A0E26 RST 2 A0E48: XRA A RET ;---------------------------- ; Формирователь мелодического звонка ;---------------------------- A0E4A: PUSH D PUSH B MOV C,A MVI B,016H LXI D,01F4H A0E52: PUSH B XRA A ADD C JRZ A0E5C MVI A,090H CALL A0274 A0E5C: MVI B,010H A0E5E: HLT IN CB55 BIT 2,A JRZ A0E7B BIT 3,A JRZ A0E7B DJNZ A0E5E MOV A,D CPI 005H MVI D,004H JRZ A0E74 MVI D,005H A0E74: POP B DJNZ A0E52 MVI C,000H JMPR A0E7E ; A0E7B: POP B MVI C,001H A0E7E: CALL A02B1 MOV A,C POP B POP D RET ;---------------------------- ; Режим 'A' , запись на магнитофон ;---------------------------- A0E85: LDA YB812 SET 5,A OUT CC55 STA YB812 PUSH B CALL A0D75 CALL A197A MVI A,0B4H STA YB82B A0E9B: MVI B,002H A0E9D: CALL LINE_ANALIZER CPI 005H JRZ A0EB8 ORA A JRZ A0EB2 CALL A0B13 CPI 001H JRZ A0EB8 DJNZ A0E9D JMPR A0EB8 ; A0EB2: LDA YB82B ORA A JRNZ A0E9B A0EB8: RST 2 POP B LDA YB812 ANI 0DDH STA YB812 OUT CC55 RET ;---------------------------- ; Диспетчер "Звонить/Не звонить" ;---------------------------- A0EC5: PUSH H LXI D,0BC20H LXI H,0B900H A0ECC: MOV A,M BIT 7,A JRZ A0F16 BIT 5,A JRNZ A0F16 ANI 007H JRZ A0F16 MVI B,003H A0EDB: INX H INR E LDAX D CMP M JRNZ A0F10 DJNZ A0EDB INR L INR E LDAX D ANI 0F0H MOV B,A MVI A,0F0H ANA M CMP B JRNZ A0F10 MOV A,L ANI 0F8H MOV L,A MOV A,M ANI 003H JRNZ A0F02 A0EF8: LDA YB803 RAL JRC A0F0D A0EFE: POP H MVI A,001H RET ; A0F02: DCR A JRZ A0EFE DCR A JRZ A0F0D POP H POP PSW JMP A0D36 ; A0F0D: POP H XRA A RET ; A0F10: MOV A,L ANI 0F8H MOV L,A MVI E,020H A0F16: LXI B,0008 DAD B MOV A,H CMP D JRNZ A0ECC MOV A,L CMP E JRNZ A0ECC JMPR A0EF8 ; ; >> NO EXECUTION PATH TO HERE << A0F24: EXX LXI H,0B860H LXI D,0B850H MVI B,007H A0F2D: LDAX D CPI 00DH JRZ A0F35 CMP M JRNZ A0F3D A0F35: INR L INR E DJNZ A0F2D EXX MVI A,001H RET ; A0F3D: EXX XRA A RET ;---------------------------- ; Обработчик срабатывания датчика охраны ;---------------------------- A0F40: MVI A,03CH STA YB82B A0F45: LDA YB82B ORA A JRNZ A0F45 A0F4B: STA YB80A CALL A091B LDAX D BIT 4,A CNZ A0F63 CALL A0FCB MVI L,00AH INR M MOV A,M INR L CMP M RZ JMPR A0F4B ;---------------------------- ; Автоматический набор номера ;---------------------------- A0F63: CALL A096E MVI A,01CH STA YB830 RST 6 A0F6C: CALL A02BF LDA YB812 SET 1,A OUT CC55 STA YB812 MVI B,008H A0F7B: CALL A0AC0 JRNC A0F84 DJNZ A0F7B JMPR A0FC8 ; A0F84: CALL A06EC MVI A,028H STA YB82B A0F8C: LDA YB82B ORA A RZ CALL A0FCB CALL LINE_ANALIZER CPI 005H RZ CPI 001H JRZ A0FC8 ORA A JRNZ A0F8C MVI B,006H A0FA3: CALL A0FCB CALL LINE_ANALIZER ORA A JRNZ A0F8C DJNZ A0FA3 MVI A,028H STA YB82B A0FB3: MVI A,080H CALL A197C CALL A0FCB CALL LINE_ANALIZER CPI 001H JRZ A0FC8 LDA YB82B ORA A JRNZ A0FB3 A0FC8: JMP A0596 ; A0FCB: IN CB55 BIT 2,A JRZ A0FD7 LDA YB81A CPI 030H RNC A0FD7: POP PSW RET ;---------------------------- ; Подпрограмма набора номера ячейки ;---------------------------- A0FD9: RST 4 RST 2 MVI L,048H MVI M,001H MVI L,040H MVI M,001H MVI L,030H MVI M,0A3H MVI L,038H MVI M,0A3H A0FEB: RST 3 CPI 00BH RZ CPI 00AH JRNC A0FEB MOV B,A XRA A CMP B JRZ A0FFC A0FF8: ADI 00AH DJNZ A0FF8 A0FFC: MOV C,A CALL A0527 MOV M,D MVI L,048H MVI M,000H A1005: RST 3 CPI 00BH RZ CPI 00AH JRNC A1005 ADD C MOV C,A XRA A INR A RET ;---------------------------- ; Подпрограмма автодозвона при наборе номера записной книжки ;---------------------------- A1012: CALL A0FD9 RZ MVI A,063H CMP C JRC A1012 MOV A,C STA YB80A A101F: RST 4 RST 2 CALL A096E CALL A0A15 CALL A0B33 IN CB55 BIT 2,A CNZ A029A IN CB55 BIT 3,A JRNZ A103F RST 3 CPI 00BH RZ CPI 00AH JRNZ A101F A103F: JMP A0B75 ;---------------------------- ; Обработка набора номера при поднятой трубке ;---------------------------- A1042: LDA YB80E BIT 6,A RNZ SET 6,A STA YB80E XRA A STA YB816 CALL A05D5 A1054: CALL A117E RC IN CB55 BIT 2,A CNZ A029A RST 3 MVI B,010H A1062: HLT DJNZ A1062 CPI 00BH JZ A112D CPI 00AH JZ A0B75 JRNC A1054 CALL A0881 RST 5 MVI L,056H MOV M,A MOV A,L STA YB82C RST 6 CALL A06E3 MVI A,001H STA YB80D CALL A10CB RC A1089: RST 6 CALL A117E RC MVI L,02CH MOV A,M CPI 057H JRNC A10B2 INR M MOV L,A CPI 050H JRC A109E CALL A06E3 A109E: MOV A,M ORA A JRNZ A10A4 MVI A,00AH A10A4: MOV B,A CPI 00DH JRNZ A10AF CALL A10CB RC JMPR A10B2 ; A10AF: CALL A10E2 A10B2: CALL A117E RC RST 2 MVI C,009H CALL A1106 LDA YB82B ORA A JRNZ A1089 IN CB55 BIT 2,A CNZ A029A JMPR A1089 ;---------------------------- ; Запись номера с клавиатуры ;---------------------------- A10CB: CALL A117E RC IN CB55 BIT 2,A CNZ A029A MVI C,009H CALL A1106 CALL A0AAB DCR A JRNZ A10CB RET ;---------------------------- ; Набор цифры в линию ;---------------------------- A10E2: MVI A,00EH OUT CC55 MVI C,000H CALL A1106 A10EB: MVI A,009H OUT CC55 MVI C,018H CALL A1106 IN CB55 BIT 3,A JRZ A112D MVI A,00EH OUT CC55 MVI C,010H CALL A1106 DJNZ A10EB RET ;---------------------------- ; Запись цифр номера с клавиатуры ;---------------------------- A1106: HLT DCR C RZ LDA YB81A CPI 015H JRZ A112D CPI 030H JRNC A1106 PUSH B MVI B,001H MOV D,H CALL A063F MVI L,02CH DCR M RST 2 RST 6 MOV A,M DCR L MVI M,005H MOV L,A CALL A06E3 POP B DCR C RZ JMPR A1106 ; A112D: RST 2 LDA YB812 RES 1,A STA YB812 OUT CC55 CALL A02B1 STC RET ;---------------------------- ; Вывод заставки категории и масок ;---------------------------- A113D: PUSH D CALL A0B33 POP D MVI L,030H MVI M,07CH INR L LDAX D PUSH D MOV C,A BIT 5,A JRNZ A1159 MVI M,040H INR L LDA YB857 CALL A0540 JMPR A1162 ; A1159: MVI M,000H INR L MVI M,000H INR L MVI M,000H INR L A1162: MVI M,040H INR L MOV A,C ANI 003H CALL A0527 MOV M,E INR L MVI A,03FH BIT 4,C JRZ A1175 MVI A,006H A1175: MOV M,A INR L POP D MVI M,03FH INR L MVI M,077H RET ;---------------------------- ; Отслеживание клавиши '*' и приведение ключей на линии в соответствии ; с положением трубки , обработка громкого набора ;---------------------------- A117E: LDA YB81A CPI 015H JRZ A112D IN CB55 BIT 2,A LDA YB812 JRNZ A119C SET 7,00EH(X) ANI 0F5H OUT CC55 STA YB812 JMP A02B1 ; A119C: ORI 00AH OUT CC55 STA YB812 BIT 7,00EH(X) JRNZ A112D BIT 4,00EH(X) RZ JMP A029A ;---------------------------- ; Обработка ввода с клавиатуры ;---------------------------- A11B1: RNC PUSH H PUSH D PUSH B RES 3,003H(X) LXI H,T11EE LXI B,000DH A11BF: CCI JPO A11CB JRZ A11CF INX H INX H INX H JMPR A11BF ; A11CB: SET 7,A JMPR A11EA ; A11CF: MOV A,M PUSH PSW LDA YB80E BIT 5,A JRZ A11E4 INX H MOV E,M INX H MOV D,M XCHG DAD H XCHG MVI A,090H CALL A0274 A11E4: MVI A,0FFH STA YB81A POP PSW A11EA: POP B POP D POP H RET ; ; ТАБЛИЦА КЛАВИШ АОН ; ; скан-код номер нота ; T11EE: DB 20H ; 3-я октава частота Гц T11EF: DB 01, 57H,03H ; 2093 До DB 21H, 02, 27H,03H ; 2217 DB 22H, 03, 0FAH,02H ; 2348 Ре DB 23H, 04, 0CFH,02H ; 2489 DB 24H, 05, 0A7H,02H ; 2635 Ми DB 25H, 06, 80H,02H ; 2796 Фа DB 10H, 07, 5DH,02H ; 2958 DB 11H, 08, 3BH,02H ; 3134 Соль DB 12H, 09, 19H,02H ; 3332 DB 13H, 0AH, 0C5H,01H ; 3950 Си DB 14H, 00, 0E0H,01H ; 3728 DB 15H, 0BH, 0FCH,01H ; 3520 Ля ;---------------------------- ; Вывод значений будильников ;---------------------------- A121E: PUSH B PUSH H RST 4 RST 2 MVI L,030H MVI M,038H INR L MOV A,C CPI 039H MVI A,006H JRZ A1230 MVI A,05BH A1230: MOV M,A INR L LDAX B MOV M,A INR L INR C INR C LDAX B CALL A0540 MVI M,040H INR L DCR C LDAX B CALL A0540 MVI M,077H POP H POP B RET ;---------------------------- ; Вход в установку будильников ;---------------------------- A1248: LXI B,0B839H A124B: CALL A121E MVI L,041H CALL A13FA JRZ A125D DCR A JRZ A125D DCR A JRNZ A124B MVI C,03CH A125D: PUSH B POP Y A1260: CALL A121E MVI L,042H CALL A13FA JRZ A1280 DCR A JRNZ A1272 MVI A,008H STAX B JMPR A1280 ; A1272: DCR A JRNZ A127A MVI A,05CH STAX B JMPR A1280 ; A127A: DCR A JRNZ A1260 MVI A,05DH STAX B A1280: CALL A121E MVI L,043H CALL A13FA JRZ A129B CPI 003H JRNC A1280 MOV E,A XRA A CMP E JRZ A1298 A1293: ADI 00AH DCR E JRNZ A1293 A1298: MOV 002H(Y),A A129B: CALL A121E MVI L,044H CALL A13FA JRZ A12B3 MOV E,A MOV A,002H(Y) CALL A1409 CPI 018H JRNC A1280 MOV 002H(Y),A A12B3: CALL A121E MVI L,046H CALL A13FA JRZ A12CE CPI 006H JRNC A12B3 MOV E,A XRA A CMP E JRZ A12CB A12C6: ADI 00AH DCR E JRNZ A12C6 A12CB: MOV 001H(Y),A A12CE: CALL A121E MVI L,047H CALL A13FA JRZ A12E2 MOV E,A MOV A,001H(Y) CALL A1409 MOV 001H(Y),A A12E2: CALL A121E RST 1 RST 5 CALL A0904 MVI L,070H MOV A,C CPI 03CH JRC A12F3 MVI L,078H A12F3: CALL A133B RST 1 RST 3 CPI 00BH JZ A090D CPI 004H JRNZ A1308 RST 5 CALL A1333 RST 1 JMPR A12F3 ; A1308: CPI 006H JRNZ A1313 CALL A0904 RST 5 RST 1 JMPR A12F3 ; A1313: CPI 005H JRNZ A12F3 RST 5 PUSH H PUSH D PUSH B LDA YB828 MOV B,A CALL A0619 POP B POP D POP H RST 2 CALL A132B JMPR A12F3 ; A132B: PUSH H EXX POP D LXI H,0B850H JMPR A1341 ; A1333: PUSH H EXX POP D LXI H,0B867H JMPR A1341 ;---------------------------- ; Загрузка буфера [HL] в буфер номера ;---------------------------- A133B: PUSH H EXX POP H LXI D,0B850H A1341: LXI B,0007H LDIR EXX RST 6 RST 2 RET ;---------------------------- ; Озвучивание наступления часа ;---------------------------- A134A: LDA YB821 DCR A RNZ LDA YB820 CPI 028H RNC LDA YB823 SRLR A JMP A1959 ;---------------------------- ; Диспетчер будильников ;---------------------------- A135D: LDA YB821 CPI 003H RNC PUSH H PUSH D PUSH B LDA YB80E BIT 3,A JRZ A1374 LDA YB822 ORA A CZ A134A A1374: LXI H,T13C4 PUSH H LXI H,0B822H LXI D,0B839H A137E: LDAX D INR E CPI 008H JRNZ A1387 INR E JMPR A13BD ; A1387: MOV B,M LDAX D INR L INR E CMP B JRNZ A13BC MOV B,M LDAX D CMP B JRNZ A13BC RST 4 CALL A02BF MVI 038H(X),077H MVI 030H(X),038H MVI L,070H DCR E DCR E MOV A,E CPI 03CH JRC A13AA MVI L,078H A13AA: CALL A133B LDAX D CPI 05DH JRZ A13C8 CALL A0D75 CALL A13DD RST 4 RST 2 RST 1 RET ; A13BC: DCR L A13BD: INR E MOV A,E CPI 03FH JRC A137E POP H T13C4: POP B POP D POP H RET ; A13C8: MVI A,008H STAX D CALL A197A CALL A0B33 RST 3 CPI 00BH RZ IN CB55 BIT 3,A RZ JMP A0F6C ; A13DD: MVI A,03CH STA YB82B A13E2: LXI D,0200H MVI A,090H CALL A0274 RST 1 CALL A028B RST 1 RST 3 CPI 00CH RC LDA YB82B ORA A JRNZ A13E2 RET ;---------------------------- ; Подрежим установок ;---------------------------- A13FA: RST 2 A13FB: MVI M,001H RST 3 CPI 00BH JRZ A1407 JRNC A13FB CPI 00AH RET ; A1407: POP PSW RET ; A1409: MOV D,A ORA A JRZ A1416 A140D: SUI 00AH JRZ A1416 JRNC A140D ADI 009H CMA A1416: ADD D ADD E RET ;---------------------------- ; Выбор режима установок ;---------------------------- A1419: DCR A JZ A15FD ; "1" установка битов DCR A JZ A157B ; "2" установка количества цифр в номере DCR A JZ A15AA ; "3" просмотр поступившего кода DCR A JZ RESET ; "4" инициализация DCR A JZ DELAY_SET ; "5" установка задержки DCR A JNZ A1446 ; "7,8,9" JMP BLOC8_SET ; "6" установка блокировки набора цифры 8 ;---------------------------- ; Отработка инициализации ;---------------------------- RESET: MVI B,009H MVI L,030H A142C: MVI M,0A3H INR L DJNZ A142C MVI L,040H MVI B,008H A1435: MVI M,001H INR L DJNZ A1435 CALL A13FB ORA A JRNZ A1446 MOV L,A MOV M,A INR L MOV M,A RST 1 RST 0 ;---------------------------- ; Вход в режим установок ;---------------------------- A1446: CALL A0312 RST 2 MVI L,046H MVI M,001H INR L CALL A13FB JRZ A146B ORA A JRNZ A1419 ; Обнуление сотых , ввод времени MVI L,020H MVI M,000H INR L MOV A,M MVI M,000H CPI 01FH JRC A1446 MVI M,03BH DCR L MVI M,063H HLT JMPR A1446 ;---------------------------- ; Процедура ввода времени ;---------------------------- A146B: CALL A16AC MVI L,041H CALL A13FA JRZ A147F ORA A JRZ A146B CPI 008H JRNC A146B MOV 024H(X),A A147F: CALL A16AC MVI L,043H CALL A13FA JRZ A1499 CPI 003H JRNC A147F MOV B,A XRA A CMP B JRZ A1496 A1492: ADI 00AH DJNZ A1492 A1496: MOV 023H(X),A A1499: CALL A16AC MVI L,044H CALL A13FA JRZ A14B1 MOV E,A MOV A,023H(X) CALL A1409 CPI 018H JRNC A147F MOV 023H(X),A A14B1: CALL A16AC MVI L,046H CALL A13FA JRZ A14CB CPI 006H JRNC A14B1 MOV B,A XRA A CMP B JRZ A14C8 A14C4: ADI 00AH DJNZ A14C4 A14C8: MOV 022H(X),A A14CB: CALL A16AC MVI L,047H CALL A13FA JRZ A14DF MOV E,A MOV A,022H(X) CALL A1409 MOV 022H(X),A A14DF: CALL A16AC RST 1 RST 1 RST 4 A14E5: CALL A0334 MVI L,040H CALL A13FA JRZ A14FF CPI 004H JRNC A14E5 MOV B,A XRA A CMP B JRZ A14FC A14F8: ADI 00AH DJNZ A14F8 A14FC: MOV 025H(X),A A14FF: RST 2 CALL A0334 MVI L,041H CALL A13FA JRZ A151A MOV E,A MOV A,025H(X) CALL A1409 JRZ A14E5 CPI 020H JRNC A14E5 MOV 025H(X),A A151A: CALL A0334 MVI L,043H CALL A13FA JRZ A1531 DCR A JRZ A152C INR A JRZ A152E JMPR A151A ; A152C: MVI A,00AH A152E: MOV 026H(X),A A1531: RST 2 CALL A0334 MVI L,044H CALL A13FA JRZ A154C MOV E,A MOV A,026H(X) CALL A1409 JRZ A151A CPI 00DH JRNC A151A MOV 026H(X),A A154C: CALL A0334 MVI L,046H CALL A13FA JRZ A1562 MOV B,A XRA A CMP B JRZ A155F A155B: ADI 00AH DJNZ A155B A155F: MOV 027H(X),A A1562: CALL A0334 MVI L,047H CALL A13FA JRZ A1576 MOV E,A MOV A,027H(X) CALL A1409 MOV 027H(X),A A1576: CALL A0334 RST 1 RST 1 ;---------------------------- ; Установка количества цифр в номере ;---------------------------- A157B: RST 4 CALL A1681 MVI L,046H CALL A13FA JZ A1446 CPI 003H JRZ A15AA CPI 005H JRC A157B CPI 008H JRNC A157B STA YB828 CPI 006H JRNZ A157B CALL A1681 MVI L,047H CALL A13FA JZ A1446 STA YB80B JMPR A157B ;---------------------------- ; Просмотр поступившего кода ;---------------------------- A15AA: PUSH H RST 2 RST 4 CALL A0904 LXI H,0BF50H RST 1 CALL A15EC A15B7: RST 3 CPI 00BH JRNZ A15C1 CALL A090D POP H RET ; A15C1: CPI 007H JRNZ A15D1 MOV A,L CPI 050H JRZ A15CB DCR L A15CB: CALL A15EC RST 1 JMPR A15B7 ; A15D1: CPI 009H JRNZ A15DD MOV A,L CPI 0D0H JRZ A15CB INR L JMPR A15CB ; A15DD: CPI 008H JRNZ A15E5 MVI L,050H JMPR A15CB ; A15E5: ORA A JRNZ A15B7 MVI L,0D0H JMPR A15CB ; A15EC: PUSH H LXI D,0B850H LXI B,0007H LDIR LXI H,0B850H MVI B,007H RST 6 POP H RET ;---------------------------- ; Установка битов ;---------------------------- A15FD: CALL A16B3 MVI L,041H CALL A13FA JRZ A1617 ORA A JRNZ A1610 RES 5,00EH(X) JMPR A1617 ; A1610: DCR A JRNZ A15FD SET 5,00EH(X) A1617: CALL A16B3 MVI L,042H CALL A13FA JRZ A1631 ORA A JRNZ A162A RES 4,00EH(X) JMPR A1631 ; A162A: DCR A JRNZ A1617 SET 4,00EH(X) A1631: CALL A16B3 MVI L,043H CALL A13FA JRZ A164B ORA A JRNZ A1644 RES 3,00EH(X) JMPR A164B ; A1644: DCR A JRNZ A1631 SET 3,00EH(X) A164B: CALL A16B3 MVI L,044H CALL A13FA JRZ A1665 ORA A JRNZ A165E RES 2,00EH(X) JMPR A1665 ; A165E: DCR A JRNZ A164B SET 2,00EH(X) A1665: CALL A16B3 MVI L,045H CALL A13FA JRZ A15FD ORA A JRNZ A1678 RES 0,00EH(X) A1676: JMPR A15FD ; A1678: DCR A JRNZ A1665 SET 0,00EH(X) JMPR A1676 ;---------------------------- ; Заставка SUP nn - ** ;---------------------------- A1681: MVI L,030H MVI M,03EH INR L MVI M,073H INR L INR L MVI M,054H INR L MVI M,054H INR L MVI M,040H INR L LDA YB828 PUSH PSW CALL A0527 MOV M,E INR L POP PSW CPI 006H JRNZ A16A8 LDA YB80B CALL A0527 MOV M,E A16A8: INR L MVI M,06DH RET ; A16AC: RST 2 RST 4 CALL A02E2 RST 1 RET ; A16B3: RST 2 MVI L,030H MVI M,040H INR L MOV E,00EH(X) BIT 5,E CALL A16DE BIT 4,E CALL A16DE BIT 3,E CALL A16DE BIT 2,E CALL A16DE BIT 0,E CALL A16DE MVI M,03FH INR L MVI M,03FH INR L MVI M,06EH RET ; A16DE: MVI A,03FH JRZ A16E4 MVI A,006H A16E4: MOV M,A INR L RET ;----------------------------- ; Подпрограмма определения номера звонящего абонента ; ;----------------------------- A16E7: PUSH H PUSH D PUSH B MVI A,00EH ; закорачивание линии на 80 мс OUT CC55 MVI B,020H A16F0: HLT DJNZ A16F0 LDA YB812 OUT CC55 DI LDA YB810 ; вывод на индикатор символа режима определения ANI 0F0H ; номера ORI 028H OUT CA55 MVI A,05CH OUT IR22 MVI C,004H ; загрузить счетчик запросов LDA YB80E ; проверить разрешены запросы (bit2[YB80E]=1) BIT 2,A ; или нет (bit2[YB80E]=0) JRZ A1726 A170F: MVI B,03AH ; загрузить счетчик периодов в сигнале запроса MVI A,005H ; формирование сигнала запроса частотой 500 Гц A1713: OUT CW55 EXX CALL A175C LDA A1713-1 DCR A OUT CW55 CALL A175C EXX INR A DJNZ A1713 A1726: MVI B,006H ; счетчик числа попыток принятия верного кода MVI H,0BFH ; загрузка адреса буфера первичного кода A172A: MVI L,050H A172C: PUSH B CALL A187F ; произвести выборку кода с линии MOV M,A MOV A,C CPI 015H POP B JRC A1744 ; считать код непринятым ,если низка уверенность ; его приема MVI A,00AH ; код также не принимается ,если он ; не идентифицирован CMP M JRZ A1744 INR L MVI A,053H CMP L JRZ A1749 ; попытка завершена , если принята четверка кодов JMPR A172C ; A1744: DJNZ A172A DCR C ; уменьшить счетчик попыток ,если предыдущая ; попытка была неудачной JRNZ A170F ; если число попыток исчерпано то принять первичный ; код без проверки на корректность ; прием массива первичного кода A1749: MVI B,050H ; количиство принимаемых кодов A174B: PUSH B CALL A187F ; прием кода POP B MOV M,A INR L DJNZ A174B ; принято ли необходимое количество ? EI CALL A1763 ; дешифрация принятого кода POP B POP D POP H RET ;----------------------------- ; Точная задержка на 1 мс ;----------------------------- A175C: MVI B,068H A175E: PUSH D POP D DJNZ A175E RET ;----------------------------- ; Забой неопределенностью ;----------------------------- A1763: CALL A17CE ; дешифрация первичного кода RNC ; выход , если номер определен успешно LXI H,0B850H ; иначе в буфер номера (B850H-B857H) MVI B,007H ; записать код неопределенности 0AH A176C: MVI M,00AH ; (индицируется в виде прочерка ) INR L DJNZ A176C MOV M,B RET ;----------------------------- ; Тетрадная идентификация цифры ; ; Цифра идентифицирована в тетраде , если обнаружена четверка или тройка ; одинаковых идентифицированных кодов или в начале тетрады присутствует ; двойка одинаковых идентифицированных кодов ;----------------------------- A1773: PUSH Y PUSH H EXX POP H LXI D,0A00H A177B: LXI B,0400H ; Проверка присутствия всех цифр 0..C исключая PUSH H ; код неопределенности A A177F: MOV A,M CMP E JRNZ A1784 INR C A1784: INR L DJNZ A177F POP H MOV A,C CPI 003H JRNC A17BD CPI 002H JRNZ A1797 MOV A,E CPI 00AH JRZ A1797 MOV D,E A1797: INR E MOV A,E CPI 00DH JRC A177B MOV A,D CPI 00AH ; D - не равен 0A если была зафиксирована JRZ A17BB ; двойка или тройка PUSH H POP Y MVI B,003H A17A7: MOV A,000H(Y) ; CPI 00AH JRZ A17B3 CMP 001H(Y) JRZ A17B8 A17B3: INX Y DJNZ A17A7 MOV A,D ; Взять цифру последней пары если нет соседей A17B8: ANA A ; Сброс флага C JMPR A17BE ; A17BB: STC MOV E,A A17BD: MOV A,E A17BE: EXX POP Y RET ;----------------------------- ; Перемещение указателя ячейки в буфере цифр на 4 вперед ;----------------------------- A17C2: INR A INR A RRC RRC ANI 03FH A17C8: INX Y DCR A JRNZ A17C8 RET ;---------------------------- ; тетрадная свертка первичного кода в массив первичных цифр ;---------------------------- ; A17CE: MVI L,0A0H ; загрузка области BFA0-BFFF кодом 0A A17D0: MVI M,00AH INR L JRNZ A17D0 LXI Y,0BFB0H ; адрес области загрузки первичных цифр LXI B,4FFEH ; [B]=4fh -[количество обрабатываемых кодов - 1] ; [C]=FEH -начальная константа сравнения MVI L,050H ; [HL] - адрес начала области первичного кода LXI D,0000 ; [D]=00 счетчик повторений неопределенности ; [E]=00 счетчик повторений текущей цифры A17E1: CALL A1773 ; распознование цифры в текущей тетраде кодов ; (тетрада начинается с адреса в [HL]) JRNC A17F0 INR D ; если цифра не определена то увеличить ; счетчик неопределенностей MOV A,D CPI 004H JRC A1808 ; если не определилось подряд 4-е цифры , MVI A,00AH ; то вместо первичной цифры записать код JMPR A17F5 ; неопределенности A17F0: MVI D,000H ; если цифра определилась CMP C JRZ A1807 ; и не равна предыдущей , то A17F5: PUSH PSW ; проверить количество предыдущих ее повторений MOV A,E ; и если оно больше 12 ,то интерпретировать ее как CPI 00DH ; 3 первичных цифры 2-я из которых не определена CNC A17C2 ; поскольку в посылке АОН не могут быть одинаковыми POP PSW ; соседние цифры MVI E,000H ; если же количество повторений не больше 12 , MOV 000H(Y),A ; то записать цифру в массив первичных цифр MOV C,A ; предыдущая цифра = текущая цифра INX Y ; передвинуть указатель на следующую ячейку JMPR A1808 ; массива первичных цифр ; A1807: INR E ; если цифра равна предыдущей , то увеличить ; счетчик повторений цифры A1808: INR L ; переместить указатель на следующую ячейку ; массива первичных кодов DJNZ A17E1 ; продолжать свертку пока не достигнут конец ; массива первичных кодов MVI B,020H ; поиск символов обозначения начала/конца посылки LXI D,0000 ; АОН в массиве первичных цифр LXI H,0BFB0H A1813: MVI A,00BH CMP M JRNZ A1821 SHLD YB806 MOV A,D ORA E JRNZ A182F PUSH H POP D A1821: INR L MVI A,0D0H CMP L JRC A1829 DJNZ A1813 A1829: MOV A,D ORA E JRNZ A1838 STC RET ; A182F: PUSH H DSBC D MOV A,L CPI 009H POP H JRZ A183A A1838: PUSH D ; идентификация начала и конца POP H ; кодовой посылки A183A: DCR E ; и запись кодовой посылки в буфер номера PUSH D DCR L LXI D,0B850H MVI B,008H A1842: MOV A,M DCR L XTHL CPI 00AH JRNZ A184A MOV A,M A184A: DCR L XTHL STAX D INR E DJNZ A1842 POP H MVI B,008H LDED YB806 LXI H,0B857H INR E A185B: LDAX D ; изменение следования цифр в кодовой посылке CMP M ; на обратный JRZ A186A CPI 00AH JRZ A186A MOV C,A MOV A,M CPI 00AH JRNZ A186A MOV M,C A186A: INR E DCR L DJNZ A185B INR L ; замена символа повтора на предыдущую цифру MVI B,008H MVI A,00CH A1873: CMP M JRNZ A187A DCR L MOV C,M INR L MOV M,C A187A: INR L DJNZ A1873 ANA A RET ;----------------------------- ; Дешифратор частотного пакета ;----------------------------- A187F: EXX MVI L,040H EXX MVI E,30 LXI B,0803H A1888: IN CB55 RAR RALR C MOV A,C STAI JRC A18A6 EXX SSPD YB806 MVI H,HIGH(YBF00) MVI B,HIGH(T1F00) A189B: MVI M,000H INX H RLCR M MVI M,000H INX H EXX DJNZ A1888 A18A6: MOV A,B DCR A EXX MVI L,040H JRNZ A189B EXX SSPD YB806 LXI SP,T1D8C LXI SP,T1D8C A18B8: LXI B,0803H A18BB: EXX MVI L,040H EXX NOP A18C0: IN CB55 RAR RALR C JRC A18DC EXX POP D LDAI XRA E MOV C,A LDAX B ADD M MOV M,A INR L LDAI XRA D MOV C,A LDAX B ADD M MOV M,A INR L EXX DJNZ A18C0 A18DC: RLCR M RRCR M MOV A,M MOV A,B DCR B JRNZ A1918 MOV A,C STAI DCR E JRNZ A18B8 EXX MVI L,040H MVI A,006H A18F0: EXAF POP D LDAI XRA E MOV C,A LDAX B ADD M INR L SUI 07CH JRNC A18FE CMA A18FE: MOV E,A LDAI XRA D MOV C,A LDAX B ADD M SUI 07CH JRNC A190A CMA A190A: ADD E EXX CMP B JRC A191E MOV C,B MOV B,A EXX MOV A,L EXX MOV E,D MOV D,A JMPR A1926 ; A1918: IN CB55 IN CB55 JMPR A18BB ; A191E: CMP C JRC A1926 MOV C,A EXX MOV A,L EXX MOV E,A A1926: EXX INR L EXAF DCR A JRNZ A18F0 LSPD YB806 EXX MVI A,00EH ANA E MOV E,A RLC ADD E MOV E,A MVI A,00EH ANA D RRC ADD E MVI D,HIGH(T1D00) MOV E,A LDAX D RET ;----------------------------- ; Озвучивание звонка ;----------------------------- A1942: PUSH B MVI L,050H A1945: MOV A,M CALL A1953 JRNZ A1951 INR L MVI A,058H CMP L JRNZ A1945 A1951: POP B RET ; A1953: CPI 00DH JRC A1959 MVI A,00AH A1959: CALL A19DF XCHG DAD H XCHG MVI A,090H CALL A0274 MVI B,032H A1966: HLT IN CB55 BIT 2,A JRNZ A1973 CALL A028B XRA A INR A RET ; A1973: DJNZ A1966 CALL A028B XRA A RET ; A197A: MVI A,090H A197C: PUSH H PUSH D PUSH B MOV C,A LXI H,T1D24 A1983: MOV A,M INR A JRZ A19DB DCR A MVI B,032H ANI 0C0H JRZ A1998 A198E: PUSH PSW MVI A,032H ADD B MOV B,A POP PSW SUI 040H JRNZ A198E A1998: MOV A,M ANI 00FH CALL A19DF JPO A19B8 MOV A,M ANI 030H JRZ A19AD XCHG A19A7: DAD H SUI 010H JRNZ A19A7 XCHG A19AD: LDA YB812 SET 6,A OUT CC55 MOV A,C CALL A0274 A19B8: HLT IN CB55 BIT 2,A JRZ A19D3 LDA YB81A CPI 030H JRC A19D3 DJNZ A19B8 LDA YB812 OUT CC55 CALL A028B INX H JMPR A1983 ; A19D3: LDA YB812 OUT CC55 CALL A028B A19DB: POP B POP D POP H RET ; A19DF: PUSH H PUSH B LXI H,T11EF LXI B,000DH A19E7: CCI JPO A19F6 JRZ A19F3 INX H INX H INX H JMPR A19E7 ; A19F3: MOV E,M INX H MOV D,M A19F6: POP B POP H RET ;---------------------------- ; Подпрограмма установки бита блокировки восьмерки ;---------------------------- BLOC8_SET: LXI H,W_BLOC8 LXI B,YB815 LXI D,A1446 PUSH D MVI E,00000001B CALL SET_BIT ; JMP BLOC8_SET ;---------------------------- ; установка DELAY ;---------------------------- DELAY_SET: LXI B,YB814 LXI H,W_DELAY LXI D,A1446 PUSH D CALL IN_CONST JMP DELAY_SET ;---------------------------- ; Подпрограмма ввода двухзначных цифр ; [BC] - адрес ячейки хранения ; [HL] - адрес заставки ; ([SP]-2) - адрес возврата ;---------------------------- IN_CONST: LXI D,0 CALL INDC_CONST RST 2 INC1: MVI A,01H STA YB840+6 RST 3 CPI 00BH JRZ EX_OUT CPI 00AH JRNC INC1 SLAR A ; умноженние А=А*10 MOV E,A SLAR A SLAR A ADD E MOV E,A ADD D STAX B CALL INDC_CONST RST 2 INC2: MVI A,01H STA YB840+7 RST 3 CPI 00BH JRZ EX_OUT CPI 00AH JRNC INC2 ADD E STAX B JMP IN_CONST ; EX_OUT: LXI H,YB830 POP PSW RET ;---------------------------- ; Ввывод заставки ; и значения константы ; [BC] - адрес ячейки хранения ; [HL] - адрес заставки ;---------------------------- INDC_CONST: PUSH D PUSH H PUSH B LXI D,YB830 LXI B,9 LDIR POP B LXI H,YB830+6 LDAX B CALL A0540 POP H POP D RET ;---------------------------- ; Подпрограмма установки бита ; Вход [HL] - адрес строки имени бита ; [BC] - адрес байта содержащего бит ; [E] - маска бита ; ([SP]-2) - адрес возврата ;---------------------------- SET_BIT: RST 2 SB1: LDAX B ANA E CALL INDC_BIT RST 3 CPI 00BH JRZ EXIT_SB CPI 00AH JRNC SB1 LDAX B XRA E STAX B JMP SB1 EXIT_SB: LXI H,YB800 POP PSW RET ;---------------------------- ; Подпрограмма индикации состояния бита ; Вход [HL] - адрес строки с именем бита ; флаг [Z] - состояние бита ;---------------------------- INDC_BIT: PUSH D PUSH H PUSH B LXI D,YB830 LXI B,5 LDIR INX H INX H INX H MOV A,M MOV LOW(YB830+8)(X),A LXI D,YB830+5 JZ BIT_OFF LXI H,W_ON LXI B,3 LDIR JMP EXIT_IB BIT_OFF: LXI H,W_OFF LXI B,3 LDIR EXIT_IB: POP B POP H POP D RET W_BLOC8: DB 18H,5CH,58H,7FH,00,00,00,00,7CH W_DELAY: DB 79H,38H,77H,6EH,40H,00,00,00,5EH W_ON: DB 00,3FH,54H W_OFF: DB 3FH,71H,71H ORG 1D00h ; ТАБЛИЦА ЦИФР СООТВЕТСТВУЮЩИХ ПАРАМ ЧАСТОТ ; T1D00: ; КОД ПАРА ЧАСТОТ db 0AH ; 0-0 КОДЫ 00H-09H - ЦИФРЫ db 01H ; 0-1 КОД 0AH - НЕОПРЕДЕЛЕННОСТЬ db 02H ; 0-2 КОД 0BH - НАЧАЛО/КОНЕЦ db 04H ; 0-3 КОД 0CH - ПОВТОР ЦИФРЫ db 07H ; 0-4 db 0AH ; 0-5 db 01H ; 1-0 db 0AH ; 1-1 db 03H ; 1-2 db 05H ; 1-3 db 08H ; 1-4 db 0AH ; 1-5 db 02H ; 2-0 db 03H ; 2-1 db 0AH ; 2-2 db 06H ; 2-3 db 09H ; 2-4 db 0BH ; 2-5 db 04H ; 3-0 db 05H ; 3-1 db 06H ; 3-2 db 0AH ; 3-3 db 00H ; 3-4 db 0CH ; 3-5 db 07H ; 4-0 db 08H ; 4-1 db 09H ; 4-2 db 00H ; 4-3 db 0AH ; 4-4 db 0AH ; 4-5 db 0AH ; 5-0 db 0AH ; 5-1 db 0BH ; 5-2 db 0CH ; 5-3 db 0AH ; 5-4 db 0AH ; 5-5 ; ; ТАБЛИЦА НОТ МУЗЫКАЛЬНОЙ ЗАСТАВКИ T1D24: db 08H db 8EH db 03H db 01H db 10H db 18H db 10H db 18H db 16H db 18H db 60H db 68H db 60H db 28H db 66H db 68H db 0EH db 28H db 8EH db 26H db 0EH db 28H db 0EH db 0E8H db 26H db 0EH db 68H db 0CFH db 0FFH ; ; ФИРМЕННАЯ ВСТАВКА T1D4D: db 'C' db 'R' db 'E' db 'A' db 'T' db 'E' db 'D' db ' ' db 'B' db 'Y' db ' ' db 'E' db 'L' db 'I' db 'S' db 'E' db 'E' db 'V' db ' ' db 'A' db '.' db 'S' db '.' db ' ' db 'L' db 'E' db 'N' db 'T' db 'V' db 'A' db 'R' db 'I' db 'S' db ',' db 'P' db 'H' db 'O' db 'N' db 'E' db ' ' db '(' db '8' db '-' db '2' db '3' db '8' db ')' db '5' db '8' db '-' db '5' db '6' db '5' db '.' db '1' db '-' db 'J' db 'A' db 'N' db '-' db ' ' db '1' db '9' db '9' db '5' db ' ' db ' ' db 'v' db 'e' db 'r' db ' ' db '0' db '0' db '3' db ' ' ; ; ТАБЛИЦА ЭПЮР ЭТАЛОННЫХ ЧАСТОТ T1D8C: db 0FFH,0FFH,0FCH,0FFH db 0F8H,0FFH,0F0H,0FFH,0E0H,0FEH,0E0H,0FCH db 00H,0FFH,00H,0F8H,00H,0C0H,07H,80H db 1FH,00H,3FH,03H,00H,80H,0FH,00H db 0FFH,03H,0FEH,3FH,0F0H,0FFH,80H,0F8H db 3FH,00H,0FFH,1FH,0E0H,0FFH,00H,0F0H db 0FH,00H,7FH,0FH,0FFH,3FH,80H,0FFH db 03H,80H,0FFH,07H,0F0H,0FFH,01H,0E0H db 0E0H,0FFH,01H,00H,0FFH,0FH,0C0H,0FEH db 0FH,00H,0FCH,1FH,00H,0F0H,0FFH,03H db 0C0H,0FEH,1FH,00H,0F8H,7FH,03H,0C0H db 07H,00H,0F8H,0FFH,07H,00H,0F8H,0FFH db 07H,80H,0F8H,7FH,0FFH,03H,00H,0F0H db 0FFH,1FH,01H,0C0H,0F8H,7FH,0FH,80H db 0FEH,0FFH,1FH,00H,00H,0FCH,0FFH,1FH T1E00: db 03H,80H,0F0H,0FEH,00H,0FFH,0FFH,3FH db 0FH,00H,00H,0F8H,0FCH,3FH,1FH,01H db 00H,00H,80H,0FEH,0FEH,7FH,3FH,03H db 03H,0C0H,0C0H,0FCH,0FFH,00H,03H,00H db 00H,0F0H,0E0H,0FFH,0FCH,3FH,7FH,07H db 0FFH,7FH,0FFH,07H,3FH,00H,07H,00H db 01H,0C0H,80H,0F0H,0C0H,0FFH,0F0H,0FFH db 0F8H,0FFH,0FCH,7FH,0FEH,1FH,0FEH,0FH db 00H,0E0H,00H,0E0H,00H,0E0H,00H,0E0H db 01H,0E0H,01H,0E0H,0FH,00H,3FH,00H db 7FH,03H,0FFH,07H,0FEH,1FH,0FCH,3FH db 0FFH,07H,0FFH,7FH,0F0H,0FFH,80H,0FCH db 00H,0F0H,07H,0C0H,0FCH,0FFH,00H,0FEH db 01H,0C0H,1FH,00H,0FFH,0FH,0F8H,7FH db 00H,0FCH,07H,00H,0FFH,07H,0F0H,0FFH db 00H,0F0H,0FH,01H,01H,00H,0FFH,0FH db 0C0H,0FFH,03H,80H,0FFH,0FH,0E0H,0FEH db 0FFH,00H,0E0H,0FFH,03H,00H,0FEH,1FH db 00H,0F8H,3FH,03H,0FFH,0FFH,00H,0C0H db 0FFH,1FH,00H,0F0H,7FH,07H,0C0H,0F8H db 80H,0FFH,7FH,00H,80H,0FEH,7FH,03H db 80H,0F8H,7FH,07H,00H,0C0H,0FEH,0FFH db 0FH,00H,0E0H,0FEH,7FH,07H,00H,0F0H db 1FH,00H,00H,0FCH,0FFH,3FH,0FH,00H db 0C0H,0FCH,0FEH,1FH,0FFH,0FH,07H,00H db 00H,0F8H,0FCH,7FH,3FH,03H,03H,0E0H db 0F0H,0FFH,0FFH,1FH,1FH,00H,01H,0C0H db 0C0H,0FCH,0F8H,3FH,00H,0F8H,0C0H,0FFH db 0FCH,0FFH,0FFH,0FH,3FH,03H,07H,80H db 03H,00H,00H,80H,00H,0F0H,80H,0F8H db 0E0H,0FEH,0F0H,0FFH,0FFH,01H,0FFH,01H db 7FH,01H,3FH,01H,1FH,01H,1FH,01H ; ; ТАБЛИЦА СООТВЕТСТВИЯ БАЙТА И КОЛИЧЕСТВА ; ЕДИНИЦ В НЕМ T1F00: db 00H,01H,01H,02H,01H,02H,02H,03H,01H,02H,02H,03H,02H,03H,03H,04H db 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H db 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H db 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H db 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H db 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H db 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H db 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H db 01H,02H,02H,03H,02H,03H,03H,04H,02H,03H,03H,04H,03H,04H,04H,05H db 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H db 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H db 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H db 02H,03H,03H,04H,03H,04H,04H,05H,03H,04H,04H,05H,04H,05H,05H,06H db 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H db 03H,04H,04H,05H,04H,05H,05H,06H,04H,05H,05H,06H,05H,06H,06H,07H db 04H,05H,05H,06H,05H,06H,06H,07H,05H,06H,06H,07H,06H,07H,07H,08H END