IPB

Здравствуйте, гость ( Вход | Регистрация )

> ПЗУ УКНЦ, дизассемблирование от Alex_K (Alexey Kisly)
SuperMax
сообщение 29.1.2021, 1:17
Сообщение #1


Администратор
*****

Группа: Root Admin
Сообщений: 6 342
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Код

        .TITLE  ROM

        .ASECT

        .=100000               ; Начальный адрес ПЗУ

; ********************************************************************
; *                                                                  *
; *        ПОДПРОГРАММЫ ОБСЛУЖИВАНИЯ МЕНЮ УСТАНОВКА И ЗАГРУЗКА       *
; *                                                                  *
; *                    Адреса 100000 - 103553                        *
; *                                                                  *
; ********************************************************************

; П/п установки начальных значений в меню УСТАНОВКА и ЗАГРУЗКА
100000$:JSR     R5,110712$     ; П/п заносит данные из области
        .WORD   100012$,7152   ; по адресу 100012 в 7152
        RETURN
100012$:.WORD   10.            ; Количество слов
        .WORD   177701,0,0     ; Пункт УСТ не выбран, VT-52, 80x24
        .WORD   7,1,1,7        ; Цвета символа, знакоместа, экрана и курсора
        .WORD   0,0            ; Рулон плавный, таймер включен
        .WORD   177701         ; Пункт ЗАГРУЗКА не выбран

; П/п обслуживания главного меню УСТАНОВКА
100040$:TST     @#23170        ; Ожидание завершения скроллинга
        BNE     100040$
        MOV     @#2476,-(SP)   ; Сохранить адрес пользовательского экрана
        MOV     #4672,@#2476   ; Включить экран установки
        MOV     #22754,R5      ; Сделать текущей таблицу видеопараметров
        CALL    110210$        ;  экрана установки
        JSR     R5,105346$     ; Перевести клавиатуру в системный режим
        .WORD   107310$,11054  ; Данные для системного режима
        CALL    104054$        ; Очистить буфер клавиатуры
        CLR     @#7232         ; Разрешение алфавитно-цифровой клавиатуры
        MOV     SP,@#7142
        EMT     52             ; Вывод УСТ в верхней строке
        .WORD   107533$
100120$:EMT     44             ; Вывод заголовка
        .WORD   102133$
100124$:MOV     #4,R0
        JSR     R4,101202$     ; Вывод меню и запрос пункта
        .WORD   101644$        ; Адрес списка для меню УСТАНОВКА
        BMI     100172$        ; Нажата <Enter> или УПР-@ ?
        CALL    @100150$(R2)   ; Обслуживание выбранного пункта
        BMI     100172$        ; Нажата <Enter> или УПР-@ ?
        BR      100124$
; Адреса п/п обслуживания пунктов меню УСТАНОВКА
100150$:.WORD   100172$,100334$,100372$,100432$,100476$
        .WORD   100536$,100576$,100630$,100730$
; Если нажаты <Enter> или УПР-@
100172$:CMP     R0,#177772     ; Нажата УПР-@ (выход в монитор ПП) ?
        BEQ     100302$
        MOV     @#7142,SP
        EMT     52             ; Стирание в верхней строке надписи УСТ
        .WORD   107524$
        EMT     52
        .WORD   107542$
        TST     @#7146         ; Предыдущий режим клавиатуры был системным ?
        BNE     100232$        ; Да
        JSR     R5,105400$     ; Восстановить пользовательский режим
        .WORD   107310$,11054  ; Данные для пользовательского режима
100232$:CALL    110204$        ; Включение пользовательского экрана
        MOV     (SP)+,@#2476
        CLR     @#7070         ; Очистить признак вызова
        TST     @#7072         ; Вызов происходил из меню ЗАГРУЗКА ?
        BNE     100300$        ; Да
100254$:MOV     #2,@#7230      ; Установить признак выполнения TRAP 2
        MOV     #2,@#22546     ; Установить признак выполнения TRAP 4
        MOV     #2,@#7042      ; Адресовать ASCII-коды клавиатуры каналу 0
        TRAP    4              ; Прочесть символ с канала 0 (если есть)
100300$:RETURN
100302$:MOV     #14,R0         ; Очистить экран
        EMT     42
        MOV     #100120$,-(SP) ; Адрес возврата в меню УСТАНОВКА
        MOV     SP,@#7144
        JMP     @#160576       ; Переход к программе монитора ПП

; П/п обслуживания подменю СИСТЕМА КОМАНД
100324$:CALL    @100346(R2)    ; Вызов п/п по текущему пункту меню
        MOV     #4,R0
100334$:JSR     R4,101202$     ; Вывод подменю и запрос пункта
        .WORD   101672$        ; Адрес списка подменю СИСТЕМА КОМАНД
        BEQ     100324$
        RETURN
; Адреса п/п для обслуживания подменю СИСТЕМА КОМАНД
100346$:.WORD   162572$,113670$,113712$

; П/п обслуживания подменю ФОРМАТ ЭКРАНА
100354$:MOV     R2,R0          ; Получение номера формата
        ASR     R0             ; 0 - 80x24, 1 - 40x24, 2 - 20x24, 3 - 10x24
        DEC     R0
        CALL    116502$        ; Обращение к п/п установки формата экрана
        MOV     #2,R0
100372$:JSR     R4,101202$     ; Вывод меню и запрос пункта
        .WORD   101704$        ; Адрес списка подменю ФОРМАТ ЭКРАНА
        BEQ     100354$
        RETURN

; П/п для обслуживания подменю ЦВЕТ СИМВОЛА
100404$:MOV     R2,R0          ; Получение номера цвета
        ASR     R0
        DEC     R0
        MOV     R5,-(SP)       ; Сохранить адрес текущей таблицы видеопар.
        MOV     #22656,R5      ; Загрузить адрес таблицы экрана пользователя
        CALL    116052$        ; Обращение к п/п установки цвета символа
        MOV     (SP)+,R5
        MOV     #2,R0
100432$:JSR     R4,101202$     ; Вывод меню и запрос пункта
        .WORD   101722$        ; Адрес списка подменю ЦВЕТ СИМВОЛА
        BEQ     100404$
        RETURN

; П/п для обслуживания подменю ЦВЕТ ЗНАКОМЕСТА
100444$:MOV     R2,R0          ; Получение номера цвета
        SUB     #2,R0
        MOV     113512$(R0),R0
        MOV     R5,-(SP)
        MOV     #22656,R5
        CALL    116130$        ; Обращение к п/п установки цвета знакоместа
        MOV     (SP)+,R5
        MOV     #2,R0
100476$:JSR     R4,101202$
        .WORD   101750$        ; Адрес списка подменю ЦВЕТ ЗНАКОМЕСТА
        BEQ     100444$
        RETURN

; П/п для обслуживания подменю ЦВЕТ ЭКРАНА
100510$:MOV     R2,R0          ; Получение номера цвета
        ASR     R0
        DEC     R0
        MOV     R5,-(SP)
        MOV     #22656,R5
        CALL    116170$        ; Обращение к п/п установки цвета экрана
        MOV     (SP)+,R5
        MOV     #2,R0
100536$:JSR     R4,101202$
        .WORD   101776$        ; Адрес списка подменю ЦВЕТ ЭКРАНА
        BEQ     100510$
        RETURN

; П/п для обслуживания подменю ЦВЕТ КУРСОРА
100550$:MOV     R2,R0          ; Получение номера цвета
        ASR     R0
        DEC     R0
        MOV     R5,-(SP)
        MOV     #22656,R5
        CALL    116226$        ; Обращение к п/п установки цвета курсора
        MOV     (SP)+,R5
        MOV     #2,R0
100576$:JSR     R4,101202$
        .WORD   102024$        ; Адрес списка подменю ЦВЕТ КУРСОРА
        BEQ     100550$
        RETURN

; П/п для обслуживания подменю РУЛОН
100610$:MOV     R5,-(SP)
        MOV     #22656,R5
        CALL    @<100642$-2>(R2); Обращение к п/п-ам установки рулона
        MOV     (SP)+,R5
        MOV     #2,R0
100630$:JSR     R4,101202$
        .WORD   102052$        ; Адрес списка подменю РУЛОН
        BEQ     100610$
        RETURN
; Адреса п/п-ам для установки рулона
100642$:.WORD   100650$,100656$,100674$
100650$:CLR     @#7136         ; Установить плавный рулон
        BR      100664$
100656$:MOV     #2,@#7136      ; Установить дискретный рулон
100664$:MOV     #2,74(R5)      ; Установить присутствие рулона
        RETURN                 ; 74 - смещение в таблице видеопараметров
100674$:CLR     74(R5)         ; Установить отсутствие рулона
        RETURN

; П/п для обслуживания подменю ТАЙМЕР
100702$:BIS     #1000,@#177054 ; Выключить таймер в канале ЦП
        SUB     #2,R2          ; Текущий пункт - включен ?
        BNE     100724$        ; Нет
        BIC     #1000,@#177054 ; Включить таймер в канале ЦП
100724$:MOV     #2,R0
100730$:JSR     R4,101202$
        .WORD   102066$        ; Адреса списка подменю ТАЙМЕР
        BEQ     100702$
        RETURN

; П/п обслуживания главного меню ЗАГРУЗКА
100742$:CLR     @#7042         ; Направлять ASCII-коды запросам EMT 22
        CLR     -(SP)          ; Номер устройства = 0
100750$:MOV     #14,R0         ; Очистить экран
        EMT     42
100756$:CLR     @SP
        JSR     R4,101616$     ; Позиционирование курсора
        .BYTE   2,5            ; Y=2, X=5
        MOV     #-6,@#7150     ; Запрет вывода в верхнюю инф. строку
        CLR     @#23164        ; Разрешение использования курсора
        EMT     44             ; Вывод заголовка
        .WORD   103114$
101004$:MOV     #4,R0
        JSR     R4,101202$     ; Вывод меню и запрос пункта
        .WORD   102100$        ; Адрес списка меню ЗАГРУЗКА
        BEQ     100756$
        BMI     101146$        ; Нажаты <Enter>,<ИСП> или <0> ?
        ADD     R2,PC          ; Переход по номеру пункта (нажата вправо)
        BR      100756$
        BR      101044$        ; Диск
        BR      101102$        ; Кассета ПЗУ
        BR      101004$        ; Сеть
        BR      101004$        ; Стык С2
        BR      101004$        ; Магнитофон
        BR      101004$        ; Отладка
        BR      101004$        ; Тестирование
; Запрос номера диска
101044$:JSR     R4,101616$     ; Позиционирование курсора
        .BYTE   4,34
        EMT     22             ; Ввод символа с ожиданием
        CMP     R0,#33         ; Код Escape ?
        BEQ     101142$        ; Да
        EMT     42             ; Вывод символа
        SUB     #60,R0         ; Проверка нажатия <0> - <3>
        BMI     100756$
        CMP     R0,#3
        BHI     100756$
        BR      101136$
; Запрос номера кассеты ПЗУ
101102$:JSR     R4,101616$     ; Позиционирование курсора
        .BYTE   5,34
        EMT     22             ; Ввод символа с ожиданием
        CMP     R0,#33         ; Код Escape ?
        BEQ     101142$        ; Да
        EMT     42             ; Вывод символа
        SUB     #61,R0         ; Проверка нажатия <1>,<2>
        BMI     100756$
        CMP     R0,#1
        BHI     100756$
101136$:MOV     R0,@SP         ; Сохранение номера устройства
        BR      101004$
101142$:EMT     22
        BR      100750$
101146$:MOV     #14,R0         ; Очистка экрана
        EMT     42
        CALL    100254$        ; Восстановить пользовательский режим
        MOV     R2,R0          ; Занести номер пункта в буфер клавиатуры
        CALL    104160$
        MOVB    (SP)+,R0       ; Занести номер устройства в буфер клавиатуры
        CALL    104160$
        CLR     @#7072         ; Очистить признак вызова
        RETURN

; П/п вывода пунктов меню и запроса номера пункта
101202$:MOV     #-6,@#7150     ; Запрет вывода в верхнюю инф. строку
        MOV     R0,-(SP)
        CALL    101446$        ; Вывод пунктов меню
        ADD     (SP)+,PC
        BR      101432$
        BR      101224$
101224$:MOV     @R4,R0         ; Позиционирование курсора
        MOV     2(R0),R3       ; R3 = координаты
        DEC     R3
        CALL    101564$
        MOV     @R4,R3         ; R3 = адрес списка
101242$:EMT     22             ; Ввод символа с ожиданием
        TST     R0             ; Нажата УПР-@ ?
        BEQ     101436$
        CMP     R0,#33         ; Символ Escape ?
        BEQ     101306$
        SUB     #60,R0         ; Символы <0> - <9> ?
        BMI     101276$
        BEQ     101442$        ; Символ <0> ?
        CMP     R0,@R3         ; Не превышает номер последнего пункта ?
        BHI     101242$
        MOV     R0,R2          ; R2 = номер выбранного пункта
        BR      101404$
101276$:ADD     #43,R0         ; Нажата <Enter> (15(8)-60(8)+43(8)=0) ?
        BEQ     101442$
        BR      101404$
101306$:EMT     22
        SUB     #176,R0        ; Нажаты <ПОМ>,<ИСП> или стрелки
        BMI     101242$
        CMP     R0,#6
        BHIS    101242$
        ASL     R0
        ADD     R0,PC
        BR      101344$        ; <ПОМ>
        BR      101436$        ; <ИСП>
        BR      101362$        ; <Вверх>
        BR      101372$        ; <Вниз>
        BR      101436$        ; <Влево>
        BR      101436$        ; <Вправо>
101344$:MOV     #20,R3         ; Позиционирование курсора
        CALL    101564$
        EMT     44             ; Вывод краткого хелпинга
        .WORD   103406$        ; Адрес начала хелпинга
        BR      101224$
101362$:DEC     R2             ; Уменьшить номер пункта
        BGT     101404$
        MOV     @R3,R2         ; R2 = номер последнего пункта
        BR      101404$
101372$:INC     R2             ; Увеличить номер пункта
        CMP     R2,@R3         ; Превысил номер последнего пункта ?
        BLOS    101404$
        MOV     #1,R2
101404$:MOV     R2,@4(R3)      ; Запомнить номер текущего пункта
        DEC     @4(R3)
        CLR     R0
101416$:TST     (R4)+
        CLR     @#7150         ; Разрешение вывода в верхнюю инф. строку
        ASL     R2
        TST     R0
        RTS     R4
101432$:MOV     #10,R0
101436$:SUB     #5,R0
101442$:DEC     R0
        BR      101416$

; П/п вывода пунктов меню
101446$:CLR     @#23164        ; Запрет использования курсора
        MOV     @R4,R2
        MOV     (R2)+,-(SP)    ; Число пунктов меню
        MOV     (R2)+,R3       ; Координаты курсора
        ADD     R3,@SP
        MOV     @(R2)+,-(SP)   ; Номер текущего пункта меню
        ADD     R3,@SP
        TST     R0
        BNE     101502$
        CALL    101564$        ; Курсор в начало экрана
        EMT     44             ; Стирание правой части экрана
        .WORD   103364$
101502$:CALL    101564$
        CMP     R3,@SP         ; Номер выводимого пункта совпадает с текущим ?
        BNE     101516$
        EMT     44             ; Включить режим инверсии
        .WORD   102124$
101516$:MOV     (R2)+,R1       ; Вывод очередного пункта
        EMT     46
        CMP     R3,@SP         ; Номер выводимого пункта совпадает с текущим ?
        BNE     101532$
        EMT     44             ; Выключить режим инверсии
        .WORD   102127$
101532$:INC     R3             ; Переход к очередному пункту
        CMP     R3,2(SP)       ; Вывод завершен ?
        BLO     101502$        ; Нет
        CMP     (SP)+,(SP)+
        MOV     @R4,R0
        MOV     @4(R0),R2      ; R2 = номер текущего пункта
        INC     R2
        MOV     #2,@#23164     ; Разрешить использование курсора
        RETURN

; Следующие две п/п осуществляют позиционирование курсора
; В первой п/п координаты задаются в R3, во второй - в слове,
; которое следует за командой вызова п/п (JSR R4,101616$).
101564$:MOV     @#23150,R5     ; R5 = адрес таблицы видеопараметров
        MOVB    R3,R0          ; R0 = Y (строка)
        CALL    115720$        ; Позиционирование по строке
        SWAB    R3
        MOVB    R3,R0          ; R0 = X (столбец)
        CALL    115672$        ; Позиционирование по столбцу
        SWAB    R3
        INC     @#7066         ; Установить признак перемещения курсора
        RETURN
101616$:MOV     @#23150,R5     ; R5 = адрес таблицы видеопараметров
        MOVB    (R4)+,R0       ; R0 = Y (строка)
        CALL    115720$        ; Позиционирование по строке
        MOVB    (R4)+,R0       ; R0 = X (столбец)
        CALL    115672$        ; Позиционирование по столбцу
        INC     @#7066         ; Установить признак перемещения курсора
        RTS     R4

;       СПИСКИ  ПУНКТОВ  МЕНЮ
; Структура списка:
;    первое слово - число пунктов меню
;    второе слово - координаты курсора
;    третье слово - адрес ячейки, в которой сохраняется номер тек. пункта
;    далее        - адреса надписей пунктов меню

; Список главного меню УСТАНОВКА
101644$:.WORD   10
        .BYTE   4,0
        .WORD   7152,102165$,102211$,102235$,102261$
        .WORD   102305$,102331$,102355$,102401$

; Список меню СИСТЕМА КОМАНД
101672$:.WORD   2
        .BYTE   4,30
        .WORD   7154,102425$,102445$

; Список меню ФОРМАТ ЭКРАНА
101704$:.WORD   4
        .BYTE   4,30
        .WORD   7156,102465$,102477$,102511$,102523$

; Список меню ЦВЕТ СИМВОЛА
101722$:.WORD   10
        .BYTE   4,30
        .WORD   7160,102535$,102562$,102607$,102634$
        .WORD   102661$,102706$,102733$,102760$

; Список меню ЦВЕТ ЗНАКОМЕСТА
101750$:.WORD   10
        .BYTE   4,30
        .WORD   7162,102535$,102562$,102607$,102634$
        .WORD   102661$,102706$,102733$,102760$

; Список меню ЦВЕТ ЭКРАНА
101776$:.WORD   10
        .BYTE   4,30
        .WORD   7164,102535$,102562$,102607$,102634$
        .WORD   102661$,102706$,102733$,102760$

; Список меню ЦВЕТ КУРСОРА
102024$:.WORD   10
        .BYTE   4,30
        .WORD   7166,102535$,102562$,102607$,102634$
        .WORD   102661$,102706$,102733$,102760$

; Список меню РУЛОН
102052$:.WORD   3
        .BYTE   4,30
        .WORD   7170,103005$,103024$,103043$

; Список меню ТАЙМЕР
102066$:.WORD   2
        .BYTE   4,30
        .WORD   7172,103062$,103077$

; Список меню ЗАГРУЗКА
102100$:.WORD   7
        .BYTE   4,2
        .WORD   7174,103175$,103216$,103237$,103260$
        .WORD   103301$,103322$,103343$

; Esc-последовательность включения инверсии
102124$:.BYTE   33,243,0
; Esc-последовательность выключения инверсии
102127$:.BYTE   33,277,243,0
; Заголовок меню УСТАНОВКА
102133$:.BYTE   14,12,40,33,244
        .ASCII  /УСТАНОВКА РЕЖИМОВ/
        .BYTE   33,277,244,0

; Надписи меню УСТАНОВКА
102165$:.ASCIZ  /1 - система команд /
102211$:.ASCIZ  /2 - формат экрана  /
102235$:.ASCIZ  /3 - цвет символа   /
102261$:.ASCIZ  /4 - цвет знакоместа/
102305$:.ASCIZ  /5 - цвет экрана    /
102331$:.ASCIZ  /6 - цвет курсора   /
102355$:.ASCIZ  /7 - рулон          /
102401$:.ASCIZ  /8 - таймер         /

; Надписи меню СИСТЕМА КОМАНД
102425$:.ASCIZ  /1 - VT-52      /
102445$:.ASCIZ  /2 - 15ИЭ-00-013/

; Надписи меню ФОРМАТ ЭКРАНА
102465$:.ASCIZ  /1 - 80/<220>/24/
102477$:.ASCIZ  /2 - 40/<220>/24/
102511$:.ASCIZ  /3 - 20/<220>/24/
102523$:.ASCIZ  /4 - 10/<220>/24/

; Надписи меню ЦВЕТ СИМВОЛА, ЦВЕТ ЗНАКОМЕСТА, ЦВЕТ ЭКРАНА, ЦВЕТ КУРСОРА
102535$:.BYTE   '1,40,'-,40,33,240,'0,33,241,'0
        .BYTE   237,237,237,237,33,277,240,33,277,241,0
102562$:.BYTE   '2,40,'-,40,33,240,'1,33,241,'1
        .BYTE   237,237,237,237,33,277,240,33,277,241,0
102607$:.BYTE   '3,40,'-,40,33,240,'2,33,241,'2
        .BYTE   237,237,237,237,33,277,240,33,277,241,0
102634$:.BYTE   '4,40,'-,40,33,240,'3,33,241,'3
        .BYTE   237,237,237,237,33,277,240,33,277,241,0
102661$:.BYTE   '5,40,'-,40,33,240,'4,33,241,'4
        .BYTE   237,237,237,237,33,277,240,33,277,241,0
102706$:.BYTE   '6,40,'-,40,33,240,'5,33,241,'5
        .BYTE   237,237,237,237,33,277,240,33,277,241,0
102733$:.BYTE   '7,40,'-,40,33,240,'6,33,241,'6
        .BYTE   237,237,237,237,33,277,240,33,277,241,0
102760$:.BYTE   '8,40,'-,40,33,240,'7,33,241,'7
        .BYTE   237,237,237,237,33,277,240,33,277,241,0

; Надписи меню РУЛОН
103005$:.ASCIZ  /1 - плавный   /
103024$:.ASCIZ  /2 - дискретный/
103043$:.ASCIZ  /3 - выключен  /

; Надписи меню ТАЙМЕР
103062$:.ASCIZ  /1 - включен /
103077$:.ASCIZ  /2 - выключен/

; Заголовок меню ЗАГРУЗКА
103114$:.ASCII  <33><244>/ЗАГРУЗКА/<33><277><244>
        .BYTE   12,12
        .REPT   10
        .BYTE   31
        .ENDR
        .ASCII  /(0/<221>/3): 0/<12>
        .REPT   10
        .BYTE   32
        .ENDR
        .ASCIZ  /(1,2): 1/

; Надписи меню ЗАГРУЗКА
103175$:.ASCIZ  /1 - диск        /
103216$:.ASCIZ  /2 - кассета ПЗУ /
103237$:.ASCIZ  /3 - сеть        /
103260$:.ASCIZ  /4 - стык С2     /
103301$:.ASCIZ  /5 - магнитофон  /
103322$:.ASCIZ  /6 - отладка     /
103343$:.ASCIZ  /7 - тестирование/

; Стирание правой части экрана
103364$:.REPT   10
        .BYTE   37,35
        .ENDR
        .BYTE   37,0

; Краткий хелпинг
103406$:.BYTE   61,221,71,54,200,54,201
        .ASCII  / - выбор элемента/<15><12>
        .BYTE   40,40,203
        .ASCII  /     - следующий уровень/<15><12>
        .BYTE   40,40,202
        .ASCII  /     - предыдущий уровень/<15><12>
        .ASCIZ  /0,/<224>/,ИСП - выход/
        .EVEN





--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
SuperMax
сообщение 29.1.2021, 1:21
Сообщение #2


Администратор
*****

Группа: Root Admin
Сообщений: 6 342
Регистрация: 7.1.2006
Из: Красноярск
Пользователь №: 1



Код

; ******************************************************
; *                                                    *
; *                  ДРАЙВЕР КАНАЛА 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




--------------------
Живы будем - Не помрем !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 4.7.2025, 17:35