Uknc ROM disasm - 4

From Felixl.com

Jump to: navigation, search

; ******************************************************
; *                                                    *
; *                  ДРАЙВЕР КАНАЛА 2                  *
; *                                                    *
; *               Адреса 125030 - 135435               *
; *                                                    *
; ******************************************************

; ***  ОСНОВНАЯ ПОДПРОГРАММА ОБСЛУЖИВАНИЯ КАНАЛА 2  ***
125030$:MOV     @#23200,R0      ; R0 = адрес массива параметров (МП) в ОЗУ ЦП
        CLC                     ; Преобр. для загрузки в рег. адреса планов
        ROR     R0
        MOV     R0,@#23200
        INC     R0              ; R0 = адрес типа устройства
        MOV     R0,@#177010
        MOVB    @#177014,R0     ; R0 = тип устройства
        MOV     R0,R5
        ASH     #-3,R0
        CMP     R0,#3           ; Тип устройства в пределах 0 - 37 ?
        BHI     125116$         ; Нет
        ASL     R0
        BNE     125104$         ; Обслуживается не дисковод
        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      ; Длина бита "0"
        MOV     #150,23306      ; Длина бита "1"
        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   ; Запретить прерывания от каналов связи с ЦП
        MOVB    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      ; Длина бита "0"
        MOV     #150,23306      ; Длина бита "1"
        MOV     #17500,23310    ; Число битов "1" перед заголовком
        MOV     #3720,23312     ; Число битов "1" перед зоной данных
        MOV     #17540,23314    ; Число перепадов уровня при чтении (загол.)
        MOV     #1750,23316     ; Число перепадов уровня при чтении (данные)
        MOV     #1750,23320
        CLR     R0
        RETURN
; П/п установки параметров двойной плотности записи
126632$:MOV     #150,23304      ; Длина бита "0"
        MOV     #64,23306       ; Длина бита "1"
        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    #0
        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           ; Переменить сторону
134050$: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
        MOVB    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