Uknc ROM disasm - 4

From Felixl.com
Revision as of 08:25, 18 March 2007 by Nzeemin (talk | contribs)
(diff) ←Older revision | view current revision (diff) | Newer revision→ (diff)
Jump to navigationJump to search
; ******************************************************
; *                                                    *
; *                  ДРАЙВЕР КАНАЛА 2                  *
; *                                                    *
; *               Адреса 125030 - 135435               *
; *                                                    *
; ******************************************************

; ***  ОСНОВНАЯ ПОДПРОГРАММА ОБСЛУЖИВАНИЯ КАНАЛА 2  ***
125030$:MOV	@#23200,R0	; R0 = адрес массива параметров (МП) в ОЗУ ЦП
	CLC			; Преобр. для загрузки в рег. адреса планов
	ROR	R0
	MOV	R0,@#23200
	INC	R0		; R0 = адрес типа устройства
	MOV	R0,@#177010
	MOV	@#177014,R0	; R0 = тип устройства
	MOV	R0,R5
	ASH	#-3,R0
	CMP	R0,#3		; Тип устройства в пределах 0 - 37 ?
	BHI	125116$		; Нет
	ASL	R0
	BNE	125014$		; Обслуживается не дисковод
	TST	@#7044		; Разрешено обращение к дисководу ?
	BMI	125116$		; Нет
125104$:CALL	@125124$(R0)	; Вызов соответствующей п/п обслуживания уст-ва
125110$:DEC	@#7062		; Уменьшить значение флага вызова
	RETURN
125116$:CALL	125162$		; Вызов п/п обслуживания кассеты ПЗУ
	BR	125110$
; Адреса п/п обслуживания устройств (дисковод, магнитофон, кассета ПЗУ, ОЗУ ПП)
125124$:.WORD	131176$,126236$,125162$,125644$
; П/п окончания обслуживания устройства
125134$:CLRB	@#23334		; Сбросить код возврата (все нормально)
125140$:MOV	@#23200,@#177010
	MOV	@#23334,@#177014; Записать код возврата в ОЗУ ЦП
125154$:TST	@#177064	; Восст. готовность канала 2 со стороны ЦП
	RETURN
; П/п обслуживания кассеты ПЗУ
125162$:JSR	R5,125560$	; Чтение МП
	.WORD	5
	CMPB	#10,23335	; Код функции = 10 (чтение) ?
	BEQ	125210$
125200$:MOVB	#2,23334	; Код возврата = 2 (ошибочный МП)
	BR	125520$
125210$:MOV	23340,R1	; R1 = адрес кассеты ПЗУ
	CMP	#60000,R1	; Он превышает 60000 ?
	BLOS	125200$		; Да
	BIC	#1,R1
	MOV	23342,R2	; R2 = адрес буфера в ОЗУ ЦП
	CMP	#160000,R2	; Он превышает 160000 ?
	BLOS	125200$		; Да
	ASR	R2
	BIC	#100000,R2
	MOV	23344,R3	; R3 = число считываемых слов
	BEQ	125514$		; Оно равно нулю
	MOVB	23337,R0	; R0 = номер кассеты ПЗУ
	MTPS	#200		; Запретить прерывания
	MOV	@#4,R5		; Сохранить значение 4 вектора в R5
	MOV	#125544$,@#4	; Загрузить новое значение вектора
	BIC	#1,@#177054	; Откл. сист. ПЗУ в диапазоне 100000-117777
	ASR	R0		; Кассета N1 ?
	BCS	125320$		; Нет
	BIC	#10,@#177054	; Выбор кассеты N1
	BR	125326$
125320$:BIS	#10,@#177054	; Выбор кассеты N2
125326$:BIC	#6,@#177054	; Ни одного банка не выбрано
	CMP	R1,#17776	; Адрес кассеты меньше 20000 ?
	BHI	125354$		; Нет
	MOV	#2,R4
	BIS	R4,@#177054	; Выбор банка N1
	BR	125406$
125354$:CMP	R1,#37776	; Адрес кассеты меньше 40000 ?
	BHI	125376$		; Нет
	BIS	#4,@#177054	; Выбор банка N2
	MOV	#1,R4
	BR	125406$
125376$:BIS	#6,@#177054	; Выбор банка N3
	CLR	R4
125406$:BIC	#60000,R1
	BIS	#100000,R1
	MOV	#120000,R0
	SUB	R1,R0		; Вычисление граничных значений
	ASR	R0
125426$:CMP	R3,R0		; Область перекачки содержится в одном банке ?
	BHI	125440$		; Нет
	MOV	R3,R0
	CLR	R3
	BR	125442$
125440$:SUB	R0,R3		; Вычесть из числа запрошенных слов
125442$:MOV	R2,@#177010	; Цикл перекачки
	MOV	(R1)+,@#177014
	INC	R2
	CMP	#70000,R2	; Произошел выход за диапазон ОЗУ ЦП (160000) ?
	BLOS	125200$		; Да
	SOB	R0,125442$
	TST	R3		; Перекачка закончена ?
	BEQ	125514$		; Да
	DEC	R4		; Переход к следующему банку
	BMI	125200$		; Переход за границу кассеты ПЗУ
	ADD	#2,@#177054	; Установить следующий банк
	MOV	#100000,R1
	MOV	#10000,R0
	BR	125426$
125514$:CLRB	23334		; Очистить код возврата (все нормально)
125520$:BIS	#1,@#177054	; Подключить системное ПЗУ
	MOV	R5,@#4		; Восстановить 4 вектор
	MTPS	#0		; Разрешить прерывания
	CALL	125140$		; Завершить обслуживание
	RETURN
; П/п обработки прерывания 4 при чтении с кассеты ПЗУ
125544$:MOVB	#1,23334	; Код возврата = 1 (отсутствует банк ПЗУ)
	TST	(SP)+		; Вычеркнуть из стека значения PC и PS
	TST	(SP)+
	BR	125520$
; П/п чтения МП из ОЗУ ЦП
125560$:MOV	(R5)+,R0	; R0 = число слов для чтения
	MOV	#23334,R1	; R1 = адрес МП в ОЗУ ПП
	MOV	@#23200,@#177010
	BR	125602$
125576$:INC	@#177010	; Цикл чтения
125602$:MOV	@#177014,(R1)+
	SOB	R0,125576$
	RTS	R5
; П/п записи МП в ОЗУ ЦП
125612$:MOV	(R5)+,R0	; R0 = число слов для записи
	MOV	#23334,R1	; R1 = адрес МП в ОЗУ ПП
	MOV	@#23200,@#177010
	BR	125634$
125630$:INC	@#177010	; Цикл записи
125634$:MOV	(R1)+,@#177014
	SOB	R0,125630$
	RTS	R5
; П/п обслуживания функций работы с памятью ПП
125644$:JSR	R5,125560$	; Чтение МП
	.WORD	5
	CLRB	@#23334		; Код возврата = 0
	CMP	R5,#32		; Тип устройства = 32 ?
	BNE	125720$		; Нет
	MOVB	@#23335,R0	; R0 = код функции
	MOV	R0,R5
	ASH	#-3,R0
	CMP	R0,#3		; Код функции в пределах 0 - 37 ?
	BHI	125720$		; Нет
	ASL	R0
	ADD	R0,PC		; Переход по соответствующему адресу
	BR	125730$		; Запрос и освобождение блоков памяти
	BR	126024$		; Чтение памяти ПП
	BR	126050$		; Запись в память ПП
	BR	126074$		; Запуск п/п пользователя
125720$:JMP	125162$
125724$:JMP	125154$
; Запрос и освобождение блоков памяти
125730$:MOV	@#23340,R1	; R1 = начальный адрес в памяти ПП
	MOV	@#23342,R0	; R0 = размер блока в словах
	ASL	R0
	ASR	R5		; Функция запроса блока памяти ?
	BCC	126012$		; Нет
	CALL	176132$		; Запросить область памяти
	ASR	R0
	CMP	R0,@#23342	; Полученное значение >= запрошенного ?
	BHIS	125770$		; Да
	MOVB	#377,@#23334	; Код возврата = 377 (мало памяти)
125770$:MOV	R0,@#23342	; Возвратить объем полученной памяти
	MOV	R1,@#23340	; Возвратить адрес блока
	JSR	R5,125612$	; Записать МП в ОЗУ ЦП
	.WORD	4
	JMP	125154$
126012$:CALL	176300$		; Освободить блок памяти
	BMI	125720$
	JMP	125140$
; Чтение памяти ПП
126024$:CALL	126110$		; Получение адресов ЦП, ПП и числа слов
	BEQ	125720$		; Число слов равно нулю
	BR	126040$
126034$:INC	@#177010	; Цикл чтения
126040$:MOV	(R1)+,@#177014
	SOB	R0,126034$
	BR	125724$
; Запись в память ПП
126050$:CALL	126110$		; Получение адресов ЦП, ПП и числа слов
	BEQ	125720$		; Число слов равно нулю
	BR	126064$
126060$:INC	@#177010	; Цикл записи
126064$:MOV	@#177014$,(R1)+
	SOB	R0,126060$
	BR	125724$
; Запуск п/п пользователя
126074$:MOV	@#23340,@#7140	; Сохранение адреса запуска
	INC	@#7076		; Установить флаг запуска п/п пользователя
	BR	125724$
; П/п получения адресов блоков памяти ЦП, ПП и числа слов для обмена
126110$:MOV	@#23340,R1	; R1 = адрес памяти ПП
	MOV	@#23342,R0	; R0 = адрес памяти ЦП
	CLC
	ROR	R0
	MOV	R0,@#177010	; Загрузка адреса в регистр адреса планов
	MOV	@#23344,R0	; R0 = число слов для обмена
	RETURN
; *** МАГНИТОФОН ***
; П/п установки начальных значений
126136$:CLR	R0
	MOV	#23304,R1
	MOV	#14,R2
126150$:MOV	R0,(R1)+	; Очистка области ОЗУ п/п работы с магнитофоном
	SOB	R2,126150$
	MOV	#320,23304$	; Длина бита "1"
	MOV	#150,23306$	; Длина бита "0"
	MOV	#17500,23310$	; Число битов "1" при записи пилот-тона загол.
	MOV	#3720,23312$	; Число битов "1" при записи пилот-тона данных
	MOV	#17540,23314$	; Число битов "1" при чтении пилот-тона загол.
	MOV	#1750,23316$	; Число битов "1" при чтении пилот-тона данных
	MOV	#1750,23320$
	MOV	#64,23322$	; Разброс времени между перепадами лог. уровня
	RETURN
; Основная п/п обслуживания магнитофона
126236$:JSR	R5,125560$	; Чтение массива параметров
	.WORD	27
	CLR	R5
126246$:SOB	R5,126246$	; Задержка
	MTPS	#200		; Запретить прерывания
	CALL	176376$		; Останов программируемого таймера
	CALL	130672$		; Ожидание готовности программируемого таймера
	MOV	#127734$,@#304	; Настройка вектора прерывания прогр. таймера
	MOV	#200,@#306
	MOV	#130570$,@#310	; Настройка вектора прерывания по внеш. событию
	MOV	#200,@#312
	CLR	@#177700	; Запрет прерываний от клавиатуры
	BIS	#400,@#177054	; Запрет прерываний от сет. таймера в канале ПП
	BIC	#200,@#177716	; Выключить генератор звукового сигнала
	BIC	#107,@#177066	; Запретить прерывания от каналов связи с ЦП
	MOV	23335$,R0	; R0 = код функции
	BIC	#177600,R0
	ASL	R0
	CALL	@126502$(R0)	; Вызов соответствующей п/п
	MOVB	R0,23334$	; Код возврата
	BIC	#14,@#177716	; Запрет приема информации по линии вн. событие
	CALL	130672$
	MOV	23200$,R4	; R4 = адрес МП в ОЗУ ЦП
	ADD	#14,R4
	MOV	R4,@#177010
	MOV	#23364,R4	; R4 = адрес МП в ОЗУ ПП (имя прочит. файла)
	MOV	#13,R2
126422$:MOV	(R4)+,@#177014	; Пересылка
	INC	@#177010
	SOB	R2,126422$
	BIC	#400,@#177054	; Разрешить прерывания от таймера в канале ПП
	MOV	#100,@#177700	; Разрешить прерывания от клавиатуры
	BIS	#200,@#177716	; Включить генератор звукового сигнала
	BIS	#107,@#177066	; Разрешить прерывания от каналов связи с ЦП
	CALL	125140$		; Переслать код возврата в ОЗУ ЦП
	CALL	176422$		; Запрет прерываний от прогр. таймера
	MTPS	#0		; Разрешить прерывания
	RETURN
; Адреса п/п обслуживания работы с магнитофоном
126502$:.WORD	126546$,126554$,126632$,126546$
	.WORD	126546$,126546$,126546$,126546$
	.WORD	127102$,127110$,126546$,126546$
	.WORD	127116$,127132$,127044$,126546$
	.WORD	126714$,126662$
126546$:MOV	#10,R0		; R0 = код возврата (неверный код функции)
	RETURN
; П/п установки параметров одинарной плотности записи
126554$:MOV	#320,23304$	; Длина бита "1"
	MOV	#150,23306$	; Длина бита "0"
	MOV	#17500,23310$	; Число битов "1" перед заголовком
	MOV	#3720,23312$	; Число битов "1" перед зоной данных
	MOV	#17540,23314$	; Число перепадов уровня при чтении (загол.)
	MOV	#1750,23316$	; Число перепадов уровня при чтении (данные)
	MOV	#1750,23320$
	CLR	R0
	RETURN
; П/п установки параметров двойной плотности записи
126632$:MOV	#150,23304$	; Длина бита "1"
	MOV	#64,23306$	; Длина бита "0"
	NOP
	MOV	#3720,23320$
	CLR	R0
	RETURN
; П/п записи блока данных на магнитную ленту
126662$:MOV	SP,23332$	; Сохранить значение указателя стека
	MOV	23360$,R4	; R4 = адрес буфера в ОЗУ ЦП
	CLC
	ROR	R4
	MOV	R4,@#177010
	CALL	127476$		; Подготовка и пуск программируемого таймера
	MOV	#200,R2		; R2 = число записываемых слов
	BR	126776$
; П/п записи файла с заголовком
126714$:MOV	SP,23332$	; Сохранить значение указателя стека
	MOV	23360$,R4	; R4 = адрес буфера в ОЗУ ЦП
	CLC
	ROR	R4
	MOV	R4,@#177010
	CALL	127476$		; Подготовка и пуск программируемого таймера
	CALL	127536$		; Запись пилот-тона перед заголовком
	CALL	127560$		; Запись имени файла
	MOV	23362$,R0	; R0 = число записываемых слов
	MOV	R0,R2		; R2 = число записываемых слов
	TST	R2		; Оно равно нулю ?
	BEQ	127040$
	CALL	127602$		; Запись числа слов в файл
	MOV	23360$,R0	; R0 = адрес буфера в ОЗУ ЦП
	CALL	127602$		; Запись адреса буфера в файл
126776$:CALL	127544$		; Запись пилот-тона перед зоной данных
	CLR	R4		; Контрольная сумма = 0
127004$:MOV	@#177014,R0	; R0 = слово данных
	INC	@#177010	; Переход к следующему адресу
	ADD	R0,R4		; Подсчет контрольной суммы файла
	ADC	R4
	CALL	127602$		; Запись слова данных
	SOB	R2,127004$	; Цикл по R2 (число записываемых слов)
	MOV	R4,R0		; R0 = контрольная сумма
	CALL	127602$		; Запись контрольной суммы
	CALL	127664$		; Запись бита "1"
127040$:CLR	R0
	RETURN
; П/п чтения блока данных
127044$:MOV	SP,23332$	; Сохранить значение указателя стека
	MOV	#200,R2		; R2 = число считываемых слов
	MOV	23360$,R0	; R0 = адрес буфера в ОЗУ ЦП
	CLC
	ROR	R0
	MOV	R0,@#177010
	CALL	130020$		; Подготовка и пуск программируемого таймера
	CALL	130156$		; Поиск пилот-тона перед зоной данных
	BR	127372$
; Точка входа при чтении файла с заголовком
127102$:CLR	23330$		; Признак реального чтения файла
	BR	127124$
; Точка входа при чтении файла с пропуском заголовка
127110$:CLR	23330$		; Признак реального чтения файла
	BR	127140$
; Точка входа при фиктивном чтении файла с заголовком
127116$:MOV	#4,23330$	; Признак фиктивного чтения
127124$:CLR	23326$		; Признак проверки заголовка
	BR	127146$
; Точка входа при фиктивном чтении файла с пропуском заголовка
127132$:MOV	#4,23330$	; Признак фиктивного чтения
127140$:MOV	#22,23326$	; Признак пропуска заголовка
127146$:MOV	SP,23332$	; Сохранить значение указателя стека
	CALL	130020$		; Подготовка и пуск программируемого таймера
	CALL	130060$		; Поиск пилот-тона перед заголовком
	CALL	130254$		; Автоподстройка по пилот-тону
	CALL	130372$		; Чтение заголовка
	BIT	#1,R1		; Тип устройства ?
	BEQ	127220$		; MSX
	CALL	130436$		; Чтение длины файла в словах
	MOV	R0,23406$	; Сохранить ее в МП
	CALL	130436$		; Чтение адреса загрузки файла
	MOV	R0,23404$	; Сохранить его в МП
127220$:MOV	23320$,R3
	ADD	23326$,PC	; Пропустить проверку заголовка (на 127252$)?
	MOV	#10,R2		; R2 = длина заголовка в словах
	MOV	#23364,R4	; R4 = адрес прочитанного заголовка
	MOV	#23340,R0	; R0 = адрес заданного заголовка
127244$:CMP	(R0)+,(R4)+	; Цикл сравнения
	BNE	127462$		; Не равны
	SOB	R2,127244$
127252$:BIT	#1,R1		; Тип устройства ?
	BNE	127312		; УКНЦ
	MOV	#200,R2		; R2 = число записываемых слов
	MOV	23360$,R0	; R0 = адрес буфера в ОЗУ ЦП
	CLC
	ROR	R0
	MOV	R0,@#177010
	MOV	#10,R3
	CALL	130156$		; Поиск пилот-тона перед зоной данных
	BR	127372$
127312$:MOV	23362$,R0	; R0 = число считываемых слов
	TST	R0		; Оно превышает 32767 ?
	BMI	127330$		; Да
	CMP	23406$,R0	; Число запрошенных слов превышает длину файла?
	BHI	127334$		; Нет
127330$:MOV	23406$,R0	; Используем длину файла
127334$:MOV	R0,R2		; R2 = число считываемых слов
	MOV	23404$,23410$
	MOV	23360$,R0	; R0 = адрес буфера в ОЗУ ЦП
	CLC
	ROR	R0
	BCC	127366$		; Четный адрес
	MOV	23404$,R0	; Используется считанный адрес
	CLC
	ROR	R0
127366$:MOV	R0,@#177010
127372$:TST	R2		; Число считываемых слов равно нулю ?
	BEQ	127452$		; Да
	CLR	R4		; Контрольная сумма = 0
	CALL	130336$		; Поиск и чтение первого слова данных
	BR	127412$
127406$:CALL	130436$		; Чтение слова
127412$:ADD	23330$,PC	; Фиктивное чтение (на 127422$) ?
	MOV	R0,@#177014	; Пересылка в ОЗУ ЦП
127422$:INC	@#177010	; Переход к следующему адресу
	ADD	R0,R4		; Подсчет контрольной суммы
	ADC	R4
	SOB	R2,127406$
	BIT	#1,R1		; Тип устройства
	BEQ	127452$		; MSX
	CALL	130436$		; Чтение контрольной суммы
	CMP	R0,R4		; Считанная КС равна подсчитанной ?
	BNE	127470$
127452$:CLR	R0
127454$:MTPS	#200
	RETURN
127462$:MOV	#1,R0		; R0 = не совпадает заголовок
	BR	127454$
127470$:MOV	#12,R0		; R0 = не совпадает контрольная сумма
	BR	127454$
; П/п начальной подготовки перед записью
127476$:BIC	#14,@#177716	; Блокировка приема информации с МЛ
	CLR	@#177712	; Очистить счетчик прогр. таймера
127510$:TST	@#177714	; Счетчик очищен ?
	BNE	127510$		; Нет
	MOV	#101,@#177710	; Пуск таймера и разрешение прерываний
	MOV	#4,R3		; R3 = число записываемых импульсов
	MTPS	#0		; Разрешить прерывания
	RETURN
; Точка входа при записи пилот-тона перед заголовком
127536$:MOV	23310$,R4	; R4 = число битов "1" в пилот-тоне
	BR	127550$
127544$:MOV	23312$,R4	; R4 = число "1" в пилот-тоне перед данными
127550$:CALL	127664$		; Запись бита "1"
	SOB	R4,127550$	; Цикл по R4
	RETURN
; П/п записи имени файла
127560$:MOV	#10,R2		; R2 = размер имени файла в словах
	MOV	#23340,R4	; R4 = адрес начала имени файла
127570$:MOV	(R4)+,R0	; R0 = очередное слово из имени файла
	CALL	127602$		; Запись слова
	SOB	R2,127570$	; Цикл по R2
	RETURN
; П/п записи слова на МЛ
127602$:CALL	127616$		; Запись младшего байта
	SWAB	R0
	CALL	127616$		; Запись старшего байта
	RETURN
; П/п записи байта на МЛ
; /-----------------------------------------------------------------\
; !               СТРУКТУРА БАЙТА ПРИ ЗАПИСИ НА МЛ                  !
; !                                                                 !
; !    бит "0", информационные биты (0) -- (7), бит "1", бит "1"    !
; \-----------------------------------------------------------------/
127616$:CALL	127660$		; Запись бита "0"
	SEC			; Признак окончания байта
127624$:RORB	R0		; Выдвинуть очередной бит
	BEQ	127646$		; Байт окончился
	BCC	127640$		; Выдвинут бит "0"
	CALL	127664$		; Запись бита "1"
	BR	127624$
127640$:CALL	127660$		; Запись бита "0"
	BR	127624$
127646$:CALL	127664$		; Запись концевика (два бита "1")
	CALL	127664$
	RETURN
; Точка входа при записи бита "0"
127660$:CLR	R5		; Признак записи бита "0"
	BR	127670$
; Точка входа при записи бита "1"
127664$:MOV	#14,R5		; Признак записи бита "1"
127670$:CALL	130636$		; Проверка нажатия "СТОП"
	TST	R3		; Запись бита окончена ?
	BNE	127670$		; Нет
	ADD	R5,PC		; Если запись "1", на 127716$
	MOV	23304$,@#177712	; Занести длительность "0" в буфер таймера
	MOV	#2,R3		; R3 = число записываемых импульсов
	BR	127730$
127716$:MOV	23306$,@#177712	; Занести длительность "1" в буфер таймера
	MOV	#4,R3		; R3 = число записываемых импульсов
127730$:CLC
	RETURN
; П/п обработки прерывания от программируемого таймера
127734$:BIS	#2,@#177716	; Установить высокий уровень при записи на МЛ
	MOV	#127752$,@#304	; Новое значения вектора прерывания
	BR	127766$
127752$:BIC	#2,@#177716	; Установить низкий уровень при записи на МЛ
	MOV	#127734$,@#304	; Новое значение вектора прерывания
127766$:TST	@#177714	; Сбросить готовность таймера
	TSTB	@#177710	; Готовность сброшена ?
	BMI	127766$		; Нет
	DEC	R3		; Уменьшить счетчик записываемых импульсов
	BMI	130006$		; Он отрицательный
	RTI
130006$:MOV	#14,R0		; R0 = ошибка выдержки времени при записи
	MOV	23332$,SP
	RETURN
; П/п начальной подготовки перед чтением
130020$:CLR	@#177710	; Остановить программируемый таймер
	MOV	23336$,R1	; R1 = тип устройства (УКНЦ или MSX)
	CLR	@#177712	; Очистить буфер таймера
130034$:TST	@#177714	; Буфер очищен ?
	BNE	130034$		; Нет
	BIS	#14,@#177716	; Разрешить прием информации с МЛ
	MOV	#21,@#177710	; Пуск таймера и разрешение прерывания при
				; изменении информации на линии МЛ
	RETURN
; П/п поиска пилот-тона перед заголовком
130060$:MTPS	#200		; Запретить прерывания
130064$:MOV	23314$,R2	; R2 = число перепадов уровня при поиске загол.
130070$:MOV	R5,R4		; R4 = длина предыдущего интервала
130072$:CALL	130636$		; Проверка нажатия "СТОП"
	BIT	#40,@#177710	; Перепад произошел ?
	BEQ	130072$		; Нет
	MOV	@#177714,R5	; R5 = длина текущего интервала
130112$:TST	@#177714	; Сбросить готовность таймера
	BIT	#250,@#177710	; Готовность сброшена ?
	BNE	130112$		; Нет
	SUB	R5,R4		; Вычислить разность между длинами интервалов
	BPL	130134$
	NEG	R4
130134$:CMP	R4,23322$	; Разброс длин в норме ?
	BHI	130064$		; Нет
	SOB	R2,130070$	; Цикл по R2
	MOV	#10,R3
	MTPS	#0
	RETURN
; П/п поиска пилот-тона перед зоной данных
130156$:MTPS	#200		; Запретить прерывания
130162$:MOV	23316$,R0	; R0 = число перепадов уровня при поиске загол.
130166$:MOV	R5,R4		; R4 = длина предыдущего интервала
130170$:CALL	130636$		; Проверка нажатия "СТОП"
	BIT	#40,@#177710	; Перепад произошел ?
	BEQ	130170$		; Нет
	MOV	@#177714,R5	; R5 = длина текущего интервала
130210$:TST	@#177714	; Сбросить готовность таймера
	BIT	#250,@#177710	; Готовность сброшена ?
	BNE	130210$		; Нет
	SUB	R5,R4		; Вычислить разность между длинами интервалов
	BPL	130232$
	NEG	R4
130232$:CMP	R4,23322$	; Разброс длин в норме ?
	BHI	130162$		; Нет
	SOB	R0,130166$	; Цикл по R0
	MOV	#10,R3
	MTPS	#200
	RETURN
; П/п вычисления усредненного значения длины бита (между "0" и "1")
130254$:MOV	R1,R4		; Сохранить значение R1 в R4
	MOV	#10,R0		; R0 = число читаемых импульсов
	CLR	R1
	CLR	R3
130266$:CALL	130530$		; Чтение бита
	BIS	#170000,R5	; Преобразование в отрицательное число
	SUB	R5,R1		; Прибавить к общей длине
	SOB	R0,130266$	; Цикл по R0
	MOV	#10,R3
	DIV	#10,R0		; Вычисление среднего значения длины "1"
	MOV	R0,R1		; R1 = длина "1"
	ASR	R0		; R0 = длина "1" / 2
	ADD	R1,R0		; R0 = среднее между длиной "1" и "0"
	NEG	R0		; Преобразование в отрицательное число (12 бит)
	BIC	#170000,R0
	MOV	R0,23324$	; Сохранение его в памяти
	MOV	R4,R1		; Восстановление R1
	RETURN
; П/п поиска данных (определяются по биту "0")
130336$:CLR	R5		; Очередной бит не прочитан
130340$:CALL	130636$		; Проверка нажатия "СТОП"
	TST	R5		; Бит прочитан ?
	BEQ	130340$		; Нет
	INC	R3		; Увеличить счетчик импульсов
	CMP	R5,23324$	; Это бит "0" ?
	BHIS	130336$		; Нет
	INC	R3
	INC	R3
	CALL	130422$		; Дочитать слово
	RETURN
; П/п чтения имени файла
130372$:MOV	#10,R2		; R2 = длина имени файла в словах
	MOV	#23364$,R4	; R4 = адрес буфера
	CALL	130336$		; Поиск и чтение первого слова
	BR	130414$
130410$:CALL	130436$		; Чтение очередного слова
130414$:MOV	R0,(R4)+	; Поместить в буфер
	SOB	R2,130410$	; Цикл по R2
	RETURN
; П/п дочитывания слова
130422$:CLRB	R0
	BIS	#200,R0		; Признак окончания чтения байта
	CALL	130470$		; Дочитать байт
	BR	130442$
; П/п чтения слова
130436$:CALL	130454$		; Прочесть младший байт
130442$:SWAB	R0
	CALL	130454$		; Прочесть старший байт
	SWAB	R0
	RETURN
; П/п чтения байта
130454$:CLRB	R0
	BIS	#200,R0		; Установить признак окончания
	CALL	130530$		; Прочесть бит
	BCS	130516		; Это не "0" (ошибка)
130470$:CALL	130530$		; Прочесть бит
	RORB	R0		; "Задвинуть" бит
	BCC	130470$		; Пока не конец
	CALL	130530$		; Прочесть бит
	BCC	130516$		; Это не "1" (ошибка)
	CALL	130530$		; Прочесть бит
	BCC	130516$		; Это не "1" (ошибка)
	RETURN
130516$:MOV	#11,R0		; R0 = ошибка чтения
	MOV	23332$,SP
	RETURN
; П/п чтения бита
130530$:CLR	R5		; Бит еще не прочитан
130532$:CALL	130636$		; Проверка нажатия "СТОП"
	TST	R5		; Бит прочитан ?
	BEQ	130532$		; Нет
	CMP	R5,23324$	; Это "0" ?
	BLO	130560$		; Да
	MOV	#3,R3
	SEC			; Признак бита "1"
	BR	130566$
130560$:MOV	#1,R3
	CLC			; Признак бита "0"
130566$:RETURN
; П/п обработки прерывания по линии МЛ при изменении уровня сигнала
130570$:TST	R3		; Счетчик равен нулю ?
	BNE	130604$		; Нет
	TST	R5		; Обработка предыдущего бита окончена ?
	BNE	130624$		; Нет
	MOV	@#177714,R5	; R5 = длина импульса
130604$:TST	@#177714	; Сбросить готовность таймера
	BIT	#250,@#177710	; Готовность сброшена ?
	BNE	130604$		; Нет
	DEC	R3		; Уменьшить счетчик импульсов
	RTI
130624$:MOV	#13,R0		; R0 = ошибка выдержки времени при чтении
	MOV	23332$,SP
	RETURN
; П/п проверки нажатия клавиши "СТОП"
130636$:TSTB	@#177700	; Клавиша нажата ?
	BPL	130670$		; Нет
	CMP	#4,@#177702	; Это "СТОП" ?
	BNE	130670$		; Нет
	MOV	23332$,SP
	MOV	#377,R0		; R0 = нажата клавиша "СТОП"
	MTPS	#200		; Запретить прерывания
130670$:RETURN
; П/п выключения программируемого таймера
130672$:CLR	@#177710	; Выключить таймер (режим "ОСТАНОВ")
	TST	@#177714	; Сбросить готовность таймера
	TST	@#177710	; Готовность сброшена ?
	BNE	130672$		; Нет
	RETURN
; *** ДИСКОВОД ***
; П/п установки начальных значений
130712$:TST	@#177132	; Проверка присутствия контроллера дисковода
	CLR	23204$		; Очистить управляющее слово
	MOV	23204$,@#177130	; Инициализация контроллера
	CLRB	23334$
	CLR	23220$
	CLR	23222$
	BIT	#10000,@#177704	; Подключен 80-дорожечный дисковод ?
	BEQ	131030$		; Нет
; Параметры для 80-дорожечного дисковода
	MOV	#620,23216$	; Время разгона двигателя
	MOV	#23260,R1	; R1 = адрес буфера времен шага
	MOV	#3,R0		; R0 = время шага
	CALL	131164$		; Установить для всех четырех накопителей
	MOV	#23264,R1	; R1 = адрес буфера времен загрузки головки
	MOV	#44,R0		; R0 = время загрузки головки
	CALL	131164$		; Установить для всех четырех накопителей
	MOVB	#50,23226$	; Номер дорожки, где вкл. прекоррекция 250 нс
	MOVB	#120,23227$	; Номер дорожки, где вкл. прекоррекция 500 нс
	BR	131102$
; Параметры для 40-дорожечного дисковода
131030$:MOV	#1750,23216$	; Время разгона двигателя
	MOV	#23260,R1	; R1 = адрес буфера времен шага
	MOV	#24,R0		; R0 = время шага
	CALL	131164$		; Установить для всех четырех накопителей
	MOV	#23264,R1	; R1 = адрес буфера времен загрузки головки
	MOV	#50,R0		; R0 = время загрузки головки
	CALL	131164$		; Установить для всех четырех накопителей
	MOVB	#10,23226$	; Номер дорожки, где вкл. прекоррекция 250 нс
	MOVB	#36,23227$	; Номер дорожки, где вкл. прекоррекция 500 нс
131102$:MOV	#23270,R1	; R1 = адрес буфера числа секторов в дорожке
	MOV	#12,R0		; R0 = число секторов в дорожке
	CALL	131164$		; Установить для всех четырех накопителей
	MOV	#23274,R1	; R1 = адрес буфера параметров SKIP (REGIM)
	MOV	#1,R0		; R0 = параметр SKIP
	CALL	131164$		; Установить для всех четырех накопителей
	MOV	#2,23250$	; Текущий формат сектора - 512 байт
	MOV	#-1,23337$
	MOV	#-1,23254$	; Неопределенный номер текущих дорожек
	MOV	#-1,23256$
	RETURN
131164$:MOV	#4,R2		; R2 = максимальное число накопителей
131170$:MOVB	R0,(R1)+	; Установить параметр
	SOB	R2,131170$
	RETURN
; Основная п/п управления накопителем
131176$:JSR	R5,125560$	; Чтение МП
	.WORD	5
	CALL	176376$		; Останов программируемого таймера
	JSR	R5,134210$	; Запуск таймера с последующим вызовом п/п
	.WORD	10,131224$,107	; по адресу 131224$
	RETURN
131224$:CALL	134242$		; Сброс готовности программируемого таймера
	CLRB	@#177710	; Перевести таймер в режим "ОСТАНОВ"
	CALL	134316$		; Сохранить значения РОН
	BIC	#175754,23204$	; Сброс в УС прекоррекции,номера стороны ...
	BICB	#300,23335$	; Очистка старших битов кода функции
	BEQ	131516$		; Код функции = 0 (ошибка)
	CMPB	#10,23335$	; Код функции >= 10(8) ?
	BLOS	131272$		; Да
	JMP	135214		; Код функции в пределе 1 -- 7
131272$:TSTB	23337$		; Какая сторона запрошена ?
	BPL	131316$		; Низ
	BIS	#40,23204$	; Установить "ВЕРХ" в УС
	MOVB	#1,23212$	; Текущая сторона - верх
	BR	131330$
131316$:BIC	#40,23204$	; Установить "НИЗ" в УС
	CLRB	23212$		; Текущая сторона - низ
131330$:BICB	#374,23337$	; Оставить биты номера устройства
	MOVB	23340$,23213$	; Переслать номер запрашиваемой дорожки
	CLR	R1
	MOVB	23337$,R1	; R1 = номер устройства
	MOVB	23260(R1),23220$; Текущее время шага
	MOVB	23264(R1),23222$; Текущее время загрузки головки
	MOVB	23274(R1),23300$; Текущий параметр SKIP
	MOVB	23270(R1),23301$; Текущее число секторов в дорожке
	TSTB	23341$		; Номер запрашиваемого сектора отрицательный ?
	BMI	131516$		; Да
	CMPB	23341$,23301$	; Номер сектора превышает лимит ?
	BHI	131516$		; Да
	CMPB	#5,23301$	; В дорожке 5 секторов ?
	BEQ	131440$		; Да
	MOV	#2,23250$	; Текущий формат сектора - 512 байт
	BR	131446$
131440$:MOV	#3,23250$	; Текущий формат сектора - 1024 байт
131446$:MOV	23250$,R0	; R0 = текущий формат сектора
	MOVB	135426$(R0),23302$; (23302) = размер межсекторного промежутка
	ASL	R0
	MOV	135412$(R0),23252$; (23252) = число слов в секторе
	CMPB	#30,23335$	; Код функции < 30
	BHI	131502$		; Да
	BR	131542$
131502$:CLC			; Преобразование адреса для загрузки в 177010
	ROR	23342$
	MOV	23344$,R0	; R0 = число слов для чтения
	BPL	131530$		; Оно < 32768 (в норме)
131516$:MOVB	#11,23334$	; Ошибочный массив параметров
	JMP	134422$
131530$:ADD	23342$,R0	; R0 = число слов + начальный адрес
	CMP	#70000,R0	; Конец буфера выходит за границу 56 KB ?
	BLO	131516$		; Да
131542$:MOVB	23337$,R1	; R1 = номер устройства
	MOV	R1,23206$
	ADD	#23254,23206$	; (23206) = указатель на текущую дорожку
	JSR	R5,134210$	; Запуск таймера с последующим вызовом п/п
	.WORD	101,131710$,107	; по адресу 131710$
	BIT	#2000,23204$	; Двигатель накопителя еще работает ?
	BNE	131620$		; Да
	BIS	#20,23204$	; Установить бит запуска мотора в УС
	MOV	23216$,23224$	; (23224) = время разгона двигателя
	BR	131652$
131620$:MOVB	23204$,R0
	BICB	#374,R0		; R0 = номер выбранного устройства
	CMPB	135406$(R1),R0	; Номера выбранного и запрошенного уст-в равны?
	BNE	131644$		; Нет
	CALL	134356$		; Восстановить РОН
	BR	131726$
131644$:MOV	23222$,23224$	; (23224) = время загрузки головки
131652$:BIC	#3,23204$
	BISB	135406$(R1),23204$; Установить биты номера устройства в УС
	BIS	#2000,23204$	; Установить бит выбора накопителя
	MOV	23204$,@#177130	; Запуск мотора
	CALL	134356$		; Восстановить РОН
	RTI
131710$:CALL	134242$		; Сброс готовности программируемого таймера
	DEC	23224$		; Уменьшить значение счетчика (разгон мотора)
	BNE	131724$		; Он еще не равен нулю
	BR	131726$
131724$:RTI
131726$:JSR	R5,134210$	; Запуск таймера с последующим вызовом п/п
	.WORD	101,132074$,107	; по адресу 132074$
	TSTB	@23206$		; Текущий номер дорожки определенный ?
	BPL	132112$		; Да
	MOVB	#200,@23206$	; Примем в качестве номера дорожки - 128
	BIC	#100,23204$	; Установить в УС перемещение от центра
	MOV	23204$,@#177130	; Сообщить об этом контроллеру
	BIS	#200,23204$	; Установить в УС бит шага
131776$:BIT	#1,@#177130	; Головка находится на нулевой дорожке ?
	BEQ	132022$		; Нет
	BIC	#200,23204$	; Сбросить в УС бит шага
	CLRB	@23206$		; Текущая дорожка - нулевая
	BR	132112$
132022$:DECB	@23206$		; Уменьшить номер текущей дорожки
	BNE	132056$		; Пока не 0
	BIC	#200,23204$	; Сбросить в УС бит шага
	MOVB	#377,@23206$	; Номер дорожки - неопределенный
	MOVB	#7,23334$	; Ошибка - нулевая дорожка не обнаружена
	JMP	134422$
132056$:MOV	23204$,@#177130	; Сделать шаг назад
	MOV	23220$,23224$	; (23224) = время шага
	RTI
132074$:CALL	134242$		; Сбросить готовность программируемого таймера
	DEC	23224$		; Уменьшить значение счетчика (время шага)
	BNE	132110$		; Он не равен нулю
	BR	131776$
132110$:RTI
132112$:CMPB	@23206$,23340$	; Сравнить номера текущей и запрошенной дорожек
	BEQ	132346$		; Равны
	BHI	132164$		; Больше
	INCB	@23206		; Увеличить номер текущей дорожки
	BMI	132152$		; Он > 127 (ошибка)
	BIT	#100,23204$	; В УС установлен бит перемещения к центру
	BNE	132246$		; Да
	BIS	#100,23204$	; Установить в УС бит перемещения к центру
	BR	132224$
132152$:MOVB	#10,23334$	; Ошибка - дорожка не обнаружена
	JMP	134422$
132164$:DECB	@23206$		; Уменьшить номер текущей дорожки
	BIT	#1,@#177130	; Головка находится на нулевой дорожке ?
	BEQ	132206$		; Нет
	CLRB	@23206$		; Текущая дорожка - нулевая
	BR	132112$
132206$:BIT	#100,23204$	; В УС сброшен бит перемещения
	BEQ	132246$		; Да
	BIC	#100,23204$	; Сбросить в УС бит перемещения
132224$:MOV	23204$,@#177130	; Извещение контроллера о направлении перемещ.
	MOV	#132242$,@#304	; Адрес новой п/п обработки прерывания
	RTI
132242$:CALL	134242$		; Сбросить готовность программируемого таймера
132246$:MOVB	23300$,23246$	; (23246) = текущий параметр SKIP
132254$:MOV	23220$,23224$	; (23224) = время шага
	MOV	#132322$,@#304	; Адрес новой п/п обработки прерывания
	CALL	132276$		; Выполнить шаг в выбранном направлении
	RTI
132276$:BIS	#200,23204$	; Установить в УС бит шага
	MOV	23204$,@#177130$; Выполнить шаг
	BIC	#200,23204$	; Сбросить в УС бит шага
	RETURN
132322$:CALL	134242$		; Сбросить готовность программируемого таймера
	DEC	23224$		; Уменьшить значение счетчика (время шага)
	BNE	132344$		; Он не равен нулю
	DECB	23246$		; Уменьшить параметр пропуска дорожки
	BNE	132254$		; Не равен нулю
	BR	132112$
132344$:RTI
132346$:BIC	#14,23204$	; Очистить в УС биты прекоррекции
	MOV	23226$,23246$	; (23246) = номера дорожек, где вкл. прекорр.
	CMPB	#1,23300$	; Параметр SKIP равен 1 ?
	BEQ	132402$		; Да
	ASRB	23246$		; Уменьшить номера дорожек на 2
	ASRB	23247$
132402$:CMPB	23246$,@23206$	; Надо включать прекоррекцию ?
	BHI	132440$		; Нет
	CMPB	23247$,@23206$	; Включать прекоррекцию 500 нс ?
	BHI	132432		; Да
	BIS	#4,23204$	; Установить в УС бит вкл. прекоррекции 250 нс
	BR	132440$
132432$:BIS	#10,23204$	; Установить в УС бит вкл. прекоррекции 500 нс
132440$:MOV	23204$,@#177130	; Извещение контроллера о вкл. прекоррекции
	MOV	#132456$,@#304	; Адрес новой п/п обработки прерывания
	RTI
132456$:CALL	134242$		; Сбросить готовность программируемого таймера
	CLRB	@#177710	; Остановить таймер
	CALL	134316$		; Сохранить значения РОН
	MOV	#177130,R4	; R4 = адрес РСУ накопителя
	MOV	R4,R5
	TST	(R5)+		; R5 = адрес РД накопителя
	CMPB	#10,23335$	; Запрошено чтение ?
	BEQ	132570$		; Да
	BIT	#4,@R4		; Дискета защищена от записи ?
	BEQ	132532$		; Нет
	MOVB	#6,23334$	; Ошибка - защита от записи
	JMP	134422$
132532$:CMPB	#20,23335$	; Запрошена запись ?
	BEQ	132570$
	CMPB	#30,23335$	; Запрошено форматирование дорожки ?
	BNE	132556$		; Нет
	JMP	134474$
132556$:MOVB	#11,23334$	; Ошибка - неверный массив параметров
	JMP	134422$
132570$:MOV	#36,23224$
	MOV	23224$,R2
	MOV	23204$,R3	; R3 = УС
	MOV	#177130,R4	; R4 = адрес РСУ накопителя
	MOV	R4,R5
	TST	(R5)+		; R5 = адрес РД накопителя
	JSR	R5,134210$	; Запуск таймера
	.WORD	2465,132630$,7
132630$:MOV	@R5,R0		; Прочесть слово с дискеты
	BEQ	132640$		; Это нуль
	INC	R0
	BNE	132656$		; Это не минус один
132640$:TSTB	@#177710	; Таймер окончил счет ?
	BPL	132630$		; Нет
	CALL	134242$		; Сбросить готовность таймера
	SOB	R2,132630$
	BR	132772$		; Ошибка (не форматирована дискета или ее нет)
132656$:MOV	#4,R1
	CMPB	#5,23301$	; Формат 1024 байта в секторе ?
	BNE	132702$		; Нет
	TST	@R4		; Присутствует линия индекс ?
	BPL	132702$		; Нет
	MOV	#36,R1
132702$:MOV	@R5,R0		; Прочесть слово с дискеты
	BEQ	132730$		; Это нуль
	INC	R0
	BEQ	132730$		; Это минус один
	TSTB	@#177710	; Таймер окончил счет
	BPL	132656$		; Нет
	CALL	134242$		; Сбросить готовность таймера
	SOB	R2,132656$
	BR	133002$		; Ошибка (не найден межсекторный промежуток)
132730$:MOV	@R5,R0		; Прочесть слово с дискеты
	BEQ	132740$		; Это нуль
	INC	R0
	BNE	132640$		; Это не минус один
132740$:SOB	R1,132730$
	BIS	#400,R3		; Установить в УС бит поиска заголовка
	MOV	R3,@R4		; Начать поиск
	BIC	#400,R3		; Сбросить в УС бит поиска заголовка
	MOV	#226,R0		; Время ожидания поиска
	MOV	R3,@R4
132762$:TSTB	@R4		; Маркер заголовка обнаружен ?
	BMI	133034$		; Да
	SOB	R0,132762$
	BR	132630$		; Заголовок сектора необнаружен
132772$:MOVB	#100,23334$	; Ошибка - не форматирована дискета
	BR	133030$
133002$:MOVB	#101,23334$	; Ошибка - не обнаружен межсекторный промежуток
	BR	133030$
133012$:MOVB	#102,23334$	; Ошибка - не найден сектор с заданным номером
	BR	133030$
133022$:MOVB	#3,23334$
133030$:JMP	134422$
133034$:TST	@R5		; Сбросить готовность контроллера дисковода
133036$:TSTB	@R4		; Следующее слово прочитано ?
	BPL	133036$		; Нет
	CMP	#120776,@R5	; Это адресный маркер заголовка сектора?
	BEQ	133212$		; Да
	MOV	#14,R0
133054$:ADD	23252$,R0
	ASL	R0
	ASL	R0
133064$:CLRB	@#177710
	MOV	R0,@#177712	; Загрузить буфер таймера
	CMP	R0,@#177714	; Буфер загружен ?
	BNE	133064$		; Нет
	MOV	#133134$,@#304	; Адрес новой п/п обработки прерываний
	MOVB	#107,@#177710	; Запустить таймер
	MOV	R3,23204$
	MOV	R2,23224$
	CALL	134356$		; Восстановить РОН
	RTI
133134$:CALL	134242$		; Сбросить готовность таймера
	CALL	134316$		; Сохранить содержимое РОН
	DEC	23224$		; Уменьшить счетчик (число оборотов диска)
	BLE	133012$		; Он равен нулю (ошибка)
	MOV	#2465,@#177712	; Загрузить буфер таймера временем оборота
	MOV	#7,@#177710	; Перевести таймер в режим "ПУСК" (без прерыв.)
	MOV	23224$,R2	; R2 = значение счетчика
	MOV	23204$,R3	; R3 = УС
	MOV	#177130,R4	; R4 = адрес РСУ накопителя
	MOV	R4,R5
	TST	(R5)+		; R5 = адрес РД накопителя
	JMP	134100$		; На поиск заголовка сектора
133212$:TSTB	@R4		; Очередное слово сформировано ?
	BPL	133212$		; Нет
	MOV	@R5,23246$	; Прочесть его
	CMP	23212$,23246$	; Это идентификатор стороны и дорожки ?
	BEQ	133276$		; Да
133232$:TSTB	@R4		; Очередное слово сформировано ?
	BPL	133232$		; Нет
	TST	@R5		; Игнорировать прочитанное слово(номер сектора)
	CALL	134300$		; Контрольная сумма в порядке ?
	BEQ	133270$		; Нет
	MOV	R3,23204$	; Сохранить УС
	CALL	134356$		; Восстановить РОН
	MOVB	#377,@23206$	; Поставить номер неопределенной дорожки
	JMP	131726$
133270$:MOV	#40,R0
	BR	133054$
133276$:TSTB	@R4		; Очередное слово сформировано ?
	BPL	133276$		; Нет
	MOV	@R5,R0		; R0 = прочитанное слово
	SWAB	R0
	CMPB	23341$,R0	; Номер сектора совпадает ?
	BNE	133270$		; Нет
	MOV	23344$,R2	; R2 = число слов для обмена
	MOV	23342$,@#177010	; Адрес буфера ОЗУ ЦП
	CALL	134300$		; Контрольная сумма в порядке ?
	BNE	133344$		; Да
	MOVB	#2,23334$	; Ошибка в контрольной сумме заголовка
	BR	133030$
133344$:CMPB	#10,23335$	; Задана операция чтения ?
	BNE	133506$		; Нет
	TST	@R5		; Сбросить готовность контроллера
	MOV	#21,R1
	CALL	134132$		; Поиск пропуска синхроимпульсов
	BEQ	133476$		; Не найдено
133370$:TSTB	@R4		; Очередное слово сформировано ?
	BPL	133370$		; Нет
	CMP	#120773,@R5	; Это маркер данных ?
	BNE	133476$		; Нет
	MOV	23252$,R1	; R1 = число слов в секторе
	TST	R2		; Надо прочитать 0 слов ?
	BEQ	133442$		; Да (сделать проверку КС сектора)
133412$:TSTB	@R4		; Очередное слово сформировано ?
	BPL	133412$		; Нет
	MOV	@R5,R0		; Прочитать его
	SWAB	R0
	MOV	R0,@#177014	; Переслать в ОЗУ ЦП
	INC	@#177010	; Переход к следующему адресу
	DEC	R2		; Уменьшить счетчик считываемых слов
	BEQ	133450$		; Все прочитали
	SOB	R1,133412$	; Цикл по числу слов в секторе
	BR	133452$
133442$:TSTB	@R4		; Очередное слово сформировано ?
	BPL	133442$
	TST	@R5		; Пропуск конца сектора
133450$:SOB	R1,133442$	; Цикл по числу слов в секторе
133452$:MOV	R2,23344$	; Сохранить число оставшихся слов
	CALL	134300$		; Контрольная сумма в порядке ?
	BNE	133706$		; Да
	MOVB	#1,23334$	; Ошибка в контрольной сумме зоны данных
133472$:JMP	133030$
133476$:MOVB	#4,23334$	; Не найден маркер данных
	BR	133472$
133506$:TST	R2		; Счетчик записываемых слов равен нулю ?
	BNE	133516$		; Нет
	JMP	134416$		; Да
133516$:MOV	#47116,@R5	; Запись межсекторного промежутка
	MOV	#13,R0		; R0 = размер межсекторного пром. перед данными
133526$:TSTB	@R4		; Предыдущее слово записано ?
	BPL	133526$		; Нет
	MOV	#47116,@R5	; Запись межсекторного промежутка
	SOB	R0,133526$
	MOV	#6,R0		; R0 = размер нулевой зоны
133544$:TSTB	@R4		; Очередное слово записано ?
	BPL	133544$		; Нет
	MOV	#0,@R5		; Запись нулевой зоны
	SOB	R0,133544$
	BIS	#1000,R3	; Установить бит пропуска синхроимпульсов
133562$:TSTB	@R4		; Очередное слово записано ?
	BPL	133562$		; Нет
	MOV	#120641,@R5	; Запись первого слова маркера данных
	MOV	R3,@R4		; Установить пропуск синхроимпульсов
	BIC	#1000,R3	; Сбросить бит пропуска синхроимпульсов
133600$:TSTB	@R4		; Очередное слово записано ?
	BPL	133600$		; Нет
	MOV	#175641,@R5	; Запись второго слова маркера данных
	MOV	23252$,R1	; R1 = размер сектора в словах
	DEC	R1
133616$:TSTB	@R4		; Очередное слово записано ?
	BPL	133616$
	MOV	@#177014,@R5	; Запись первого слова данных
	MOV	R3,@R4		; Сброс пропуска синхроимпульсов
	INC	@#177010	; Переход к следующему адресу
	DEC	R2		; Уменьшить счетчик записываемых слов
	BEQ	133664$
133640$:TSTB	@R4		; Очередное слово записано ?
	BPL	133640$		; Нет
	MOV	@#177014,@R5	; Запись данных
	INC	@#177010	; Переход к следующему адресу
	DEC	R2		; Уменьшить счетчик записываемых слов
	BEQ	133674$
	SOB	R1,133640$
	BR	133676$
133664$:TSTB	@R4		; Очередное слово записано ?
	BPL	133664$		; Нет
	MOV	#0,@R5		; Запись нуля
133674$:SOB	R1,133664$
133676$:MOV	R2,23344$	; Сохранить счетчик записываемых слов
	CALL	134256$		; Запись контрольной суммы
133706$:TST	23344$		; Счетчик записываемых слов равен нулю
	BNE	133720$		; Нет
	JMP	134416$		; Да
133720$:MOV	@#177010,23342$	; Сохранение регистра адреса
	INCB	23341$		; Увеличить номер текущего сектора
	CMPB	23341$,23301$	; Он превышает номер последнего сектора ?
	BLOS	134064$		; Нет
	CMPB	#1,23336$	; Запрошена односторонняя операция ?
	BEQ	133766$		; Да
	BIT	#40,R3		; Текущая сторона - верх ?
	BNE	133766$		; Да
	INC	23212$		; Увеличить номер текущей стороны
	BR	134010$
133766$:INCB	23340$		; Увеличить номер запрашиваемой дорожки
	MOVB	23340$,23212$
	SWAB	23212$
	CLRB	23212$		; Текущая сторона - низ
134010$:CLRB	@#177710	; Остановить программируемый таймер
	TST	@#177714	; Сбросить его готовность
	TST	@#177714
	MOVB	#1,23341$	; Текущий номер сектора - 1
	CMPB	#1,23336$	; Запрошена односторонняя операция
	BEQ	134050$		; Да
	MOV	#40,R0
	XOR	R0,R3		; Переменить сторону
	MOV	R3,23204$
	CALL	134356$		; Восстановить РОН
	JMP	131726$
134064$:TST	@#177714	; Сбросить готовность программируемого таймера
	TST	@#177714
	MOV	#36,R2
134100$:TST	@R5		; Перевод контроллера в режим чтения
	CLR	R1
	MOVB	23302$,R1	; R1 = текущий размер межсекторного промежутка
	ADD	#6,R1
	CALL	134132$		; Поиск нулевой зоны  и начала след. сектора
	BEQ	134126$		; Она не найдена
	JMP	133036$
134126$:JMP	132630$
; П/п поиска нулевой зоны
134132$:TSTB	@R4		; Очередное слово считано ?
	BPL	134132$		; Нет
	MOV	@R5,R0
	BEQ	134152$		; Это нулевая зона
	INC	R0
	BEQ	134152$
	SOB	R1,134132$
	BR	134200$
134152$:BIS	#400,R3		; Уст. бит поиска пропуска синхроимпульсов
	MOV	R3,@R4		; Начать поиск
	BIC	#400,R3		; Сбросить бит поиска пропуска синхроимпульсов
	MOV	#226,R0
	MOV	R3,@R4
134172$:TSTB	@R4		; Поиск окончен
	BMI	134204$		; Да
	SOB	R0,134172$
134200$:SEZ			; Операция окончилась неуспешно
	RETURN
134204$:TST	@R5
	RETURN
; П/п запуска таймера с вызовом п/п по его прерыванию
134210$:CLRB	@#177710	; Остановить программируемый таймер
	MOV	@R5,@#177712	; Занести в буфер временную задержку
	CMP	@R5,@#177714
	BNE	134210$
	TST	(R5)+
	MOV	(R5)+,@#304	; Занести адрес п/п в вектор прерывания
	MOV	(R5)+,@#177710	; Запустить таймер
	RTS	R5
; П/п сброса готовности программируемого таймера
134242$:TST	@#177714	; Сбросить готовность таймера
	TSTB	@#177710	; Она сброшена ?
	BMI	134242$		; Нет
	RETURN
; П/п записи контрольной суммы
134256$:BIT	#40000,@R4	; Запись КС
	BEQ	134256$
	MOV	#47116,@R5
134270$:TSTB	@R4
	BPL	134270$
	TST	@R5
	RETURN
; П/п проверки контрольной суммы
134300$:MOV	#36,R0
134304$:BIT	#40000,@R4	; Проверка КС
	BNE	134314$
	SOB	R0,134304$
134314$:RETURN
; П/п сохранения РОН
134316$:MOV	R0,23232$
	MOV	R1,23234$
	MOV	R2,23236$
	MOV	R3,23240$
	MOV	R4,23242$
	MOV	R5,23244$
	MOV	@#177010,23230$
	RETURN
; П/п восстановления РОН
134356$:MOV	23232$,R0
	MOV	23234$,R1
	MOV	23236$,R2
	MOV	23240$,R3
	MOV	23242$,R4
	MOV	23244$,R5
	MOV	23230$,@#177010
	RETURN
; Завершающая процедура
134416$:CLRB	23334$		; Код ошибки = 0 (все нормально)
134422$:CALL	125140$		; Переслать код возврата в ЦП
	JSR	R5,175400$	; Установить адрес п/п выключения двигателя
	.WORD	372,134454$
	CALL	134356$		; Восстановить РОН
	CLR	@#177710	; Остановить таймер
	CALL	176422$
	RTI
; П/п останова двигателя
134454$:BIC	#2037,23204$	; Сбросить биты выбора устройства,вкл. мотора
	MOV	23204$,@#177130	; Выключить двигатель
	RETURN
134472$:BR	134416$
; Форматирование дорожки
134474$:MOV	23204$,R3	; R3 = УС накопителя
	MOV	#177130,R4	; R4 = адрес РУС накопителя
	MOV	R4,R5
	TST	(R5)+		; R5 = адрес РД накопителя
	SWAB	23212$
	MOV	23341$,R2	; R2 = формат сектора
	BIC	#177774,R2
	BNE	134540$
	MOV	#13,23334$	; Ошибка = неверный формат сектора
	JMP	134422$
134540$:MOVB	135422$(R2),23246$; (23246) = число секторов в дорожке
	MOVB	135426$(R2),23302$; (23302) = размер межсекторного промежутка
	MOV	R2,R1
	ASL	R1
	MOV	135412$(R1),R1	; R1 = число слов в секторе
	SWAB	R2
	INC	R2		; R2 = формат сектора : номер сектора
	MOV	#1750,R0
134574$:TST	@R4		; Присутствует линия ИНДЕКС ?
	BPL	134616$		; Нет
	SOB	R0,134574$
134602$:TST	@R5		; Установить режим готовности чтения
	MOVB	#14,23334$	; Ошибка = ошибка линии ИНДЕКС
	JMP	134422$
134616$:MOV	#6200,R0	; R0 = число слов в дорожке
	MOV	#47116,@R5	; Заполнение дорожки
134626$:TST	@R4		; Присутствует линия ИНДЕКС ?
	BMI	134646$
134632$:TSTB	@R4		; Предыдущее слово записано ?
	BPL	134632$		; Да
	MOV	#47116,@R5	; Заполнение дорожки
	SOB	R0,134626$
	BR	134602$
134646$:MOV	#20,R0		; R0 = размер межсект. пром. в начале дорожки
134652$:MOV	#47116,@R5	; Заполнение межсект. пром. перед заголовком
134656$:TSTB	@R4		; Очередное слово записано ?
	BPL	134656$		; Нет
	MOV	#47116,@R5	; Заполнение межсект. пром. перед заголовком
	SOB	R0,134656$
	MOV	#6,R0		; R0 = размер нулевой зоны	
134674$:TSTB	@R4		; Очередное слово записано ?
	BPL	134674$		; Нет
	MOV	#0,@R5		; Заполнение нулевой зоны
	SOB	R0,134674$
	BIS	#1000,R3	; Установить бит пропуска синхроимпульсов
134712$:TSTB	@R4
	BPL	134712$
	MOV	#120641,@R5	; Запись первого слова адресного маркера
	MOV	R3,@R4		; Установить режим пропуска синхроимпульсов
	BIC	#1000,R3	; Сбросить бит пропуска синхроимпульсов
134730$:TSTB	@R4
	BPL	134730$
	MOV	#177241,@R5	; Запись второго слова адресного маркера
134740$:TSTB	@R4
	BPL	134740$
	MOV	23212$,@R5	; Запись номера дорожки и стороны
	MOV	R3,@R4		; Сбросить режим пропуска синхроимпульсов
134752$:TSTB	@R4
	BPL	134752$
	MOV	R2,@R5		; Запись номера сектора и формата сектора
	MOV	#13,R0		; R0 = размер межсект. пром. перед данными
134764$:BIT	#40000,@R4	; Запись контрольной суммы
	BEQ	134764$
	MOV	#47116,@R5	; Заполнение межсект. пром. перед данными
134776$:TSTB	@R4
	BPL	134776$
	MOV	#47116,@R5	; Заполнение межсект. пром. перед данными
	SOB	R0,134776$
	MOV	#6,R0		; R0 = размер нулевой зоны
135014$:TSTB	@R4
	BPL	135014$
	MOV	#0,@R5		; Заполнение нулевой зоны
	SOB	R0,135014$
	BIS	#1000,R3	; Установить бит пропуска синхроимпульсов
135032$:TSTB	@R4
	BPL	135032$
	MOV	#120641,@R5	; Запись первого слова маркера данных
	MOV	R3,@R4		; Установить режим пропуска синхроимпульсов
	BIC	#1000,R3	; Сбросить бит пропуска синхроимпульсов
135050$:TSTB	@R4
	BPL	135050$
	MOV	#175641,@R5	; Запись второго слова маркера данных
	MOV	R1,R0		; R0 = размер сектора в словах
135062$:TSTB	@R4
	BPL	135062$
	MOV	23342$,@R5	; Запись первого слова зоны данных
	MOV	R3,@R4		; Сбросить режим пропуска синхроимпульсов
	DEC	R0
135076$:TSTB	@R4
	BPL	135076$
	MOV	23342$,@R5	; Заполнение зоны данных
	SOB	R0,135076$
	INC	R2		; Увеличить номер сектора
	MOVB	23302$,R0	; R0 = размер межсект. пром. перед заголовком
135116$:BIT	#40000,@R4	; Запись контрольной суммы
	BEQ	135116$
	DECB	23246$		; Уменьшить счетчик секторов
	BNE	134652$
	MOV	#1750,R0
135136$:TST	@R4		; Присутствует линия ИНДЕКС ?
	BMI	135170$		; Да
135142$:TSTB	@R4
	BPL	135142$
	MOV	#47116$,@R5	; Заполнение конца дорожки
	SOB	R0,135136$
	TST	@R5		; Установить режим готовности чтения
	MOVB	#14,23334$	; Ошибка - ошибка линии ИНДЕКС
	JMP	134422$
135170$:MOV	#5,R0
135174$:TSTB	@R4
	BPL	135174$
	MOV	#47116,@R5	; Заполнение в начале первых пяти слов
	SOB	R0,135174$
	TST	@R5		; Установить режим готовности чтения
	JMP	134416$
; П/п-мы установок параметров
135214$:CLR	R0
	MOVB	23335$,R0	; R0 = номер устанавливаемого параметра (1 - 4)
	CMP	#4,R0		; Он в диапазоне (1 - 4) ?
	BHIS	135242$		; Да
	MOVB	#11,23334$	; Ошибка - неверный массив параметров
	JMP	134422$
135242$:MOVB	23340$,23246$	; (23246) = значение устанавливаемого параметра
	DEC	R0
	MOV	#135272$,R1
	ADD	R0,R1
	ADD	R0,R1
	MOV	@R1,R1
	CALL	@R1		; Вызов соответствующей п/п
	JMP	134416$
; Адреса начала п/п установки значений параметров
135272$:.WORD	135350$,135356$,135364$,135372$
135302$:MOVB	23337$,R0	; R0 = номер накопителя
	CMPB	#377,R0		; Устанавливается для всех накопителей ?
	BEQ	135326$		; Да
	MOV	#1,R2		; R2 = число накопителей, для кот. уст. парам.
	BICB	#374,R0
	BR	135334$
135326$:CLR	R0
	MOV	#4,R2		; R2 = число накопителей, для кот. уст. парам.
135334$:ADD	R0,R1		; Корректировка под номер накопителя
135336$:MOVB	23246$,@R1	; Установка нового значения
	INC	R1
	SOB	R2,135336$
	RETURN
135350$:MOV	#23260,R1	; R1 = адрес буфера времен шага
	BR	135302$
135356$:MOV	#23264,R1	; R1 = адрес буфера времен загрузки головки
	BR	135302$
135364$:MOV	#23270,R1	; R1 = адрес буфера числа секторов в дорожке
	BR	135302$
135372$:MOV	#23274,R1	; R1 = адрес буфера параметра SKIP
	MOV	#2,23246$	; Принудительная установка пропуска дорожки
	BR	135302$
; Устанавливаемые биты в РУС накопителя при выборе соотв. устройства
135406$:BYTE	3,2,1,0
; Число слов в секторе (формат x,256,512,1024 байт)
135412$:.WORD	0,200,400,1000
; Число секторов в дорожке (формат x,256,512,1024 байт)
135422$:.BYTE	0,20,12,5
; Размер межсекторного промежутка перед заголовком (формат x,256,512,1024 байт)
135426$:.BYTE	0,33,22,72
135432$:.BYTE	0,240,124,242
	.ENDT