IPB

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

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


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

Группа: Root Admin
Сообщений: 6 282
Регистрация: 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:18
Сообщение #2


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

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



Код

; *********************************************************
; *                                                       *
; *                  ДРАЙВЕР КЛАВИАТУРЫ                   *
; *                                                       *
; *                Адреса 103554 - 107743                 *
; *                                                       *
; *********************************************************

; П/п начальной инициализации
103554$:JSR     R5,173730$     ; Очистка ОЗУ
        .WORD   7176,1762      ; Начальный адрес - 7176, число слов - 1762
103564$:TST     @#177702       ; Сбросить готовность рег.сост. клавиатуры
        MOV     #175412$,@#300 ; Вектор прерываний от клавиатуры
        MOV     #200,@#302
        MOV     #100,@#177700  ; Разрешить прерывания от клавиатуры
        MOV     #175540$,@#324 ; Вектор прерываний от канала 0 (источник)
        MOV     #200,@#326
        BIS     #1,@#177076    ; Разрешить прерывания от канала 0 (источник)
        CALL    104064$        ; Настройка начальных адресов буферов
        MOV     #11140,@#13140 ; Нач. адрес буфера клавиш К1 - К25
        MOV     #7234,@#7214   ; Текущая таблица - табл. основного регистра
        MOV     #7234,@#7216
        MOVB    #40,@#7221     ; Заглавные буквы
        MOVB    #16,@#7222     ; Латинский регистр
        MOVB    #17,@#7223
; Заполнение таблиц раскладки клавиатуры
        MOV     #105520$,R1    ; R1 = нач. адрес данных для таблиц раскладки
        MOV     #7234,R0       ; R0 = нач. адрес таблиц раскладки
        MOV     #5,R4          ; R4 = число таблиц раскладки
103720$:MOV     #130,R2        ; R2 = число элементов таблицы
        MOV     R0,R3          ; R3 = адрес текущей заполняемой таблицы
103726$:MOVB    (R1)+,(R3)+    ; Пересылка
        CLRB    (R3)+
        SOB     R2,103726$
        MOV     #400,R2        ; R2 = номер первой регистровой клавиши
103740$:MOVB    (R1)+,R3
        BEQ     103762$        ; Это строка или конец данных для тек. табл.?
        BMI     103756$        ; Переход к следующей регистровой комбинации ?
        DEC     R3             ; Регистровая клавиша (в R3 - смещение)
        ASL     R3
        ADD     R0,R3
        MOV     R2,@R3
103756$:INC     R2
        BR      103740$
103762$:MOVB    (R1)+,R3
        BEQ     104004$        ; Это конец таблицы ?
        DEC     R3             ; Строка (адрес в R1,смещение в табл. в R3)
        ASL     R3
        ADD     R0,R3
        MOV     R1,@R3
103776$:TSTB    (R1)+          ; Прогон строки
        BNE     103776$
        BR      103762$
104004$:ADD     #260,R0        ; Переход к следующей таблице
        SOB     R4,103720$
        CALL    113670$        ; Установить систему команд VT-52
        MOVB    #2,@#7226      ; Интервал автоповтора
        RETURN
; П/п ПАУЗА (ожидание нажатия любой клавиши)
104026$:CLR     @#177700       ; Запретить прерывания от клавиатуры
104032$:TSTB    @#177700       ; Ожидание нажатия или отжатия клавиши
        BPL     104032$
        TSTB    @#177702       ; Клавиша отжата ?
        BMI     104032$        ; Да
        MOV     #100,@#177700  ; Разрешить прерывания от клавиатуры
104054$:JSR     R5,173730$     ; Очистка буферов клавиатуры
        .WORD   2240,14
; Установка указателей на начало буферов
104064$:MOV     #2260,@#7176
        MOV     #2260,@#7200
        MOV     #2240,@#7202
        MOV     #2240,@#7204
        MOV     #2200,@#7206
        MOV     #2200,@#7210
        RETURN
; П/п обслуживания запросов EMT 22 и EMT 24 (ввод символа с ожиданием)
104132$:TRAP    2              ; Считывание символа с буфера в регистр R0
        ADD     @#7230,PC      ; Символ есть в буфере ?
        BR      104152$        ; Да
        CLR     @#7230
        TRAP    0              ; Запуск диспетчера процессов
        BR      104132$
104152$:MOV     R0,2(SP)
        RETURN
; П/п заноса ASCII-символов и адресов строк в буфер
104160$:MOV     R0,@7210       ; Занести символ в буфер
        ADD     #2,@#7210      ; Продвинуть указатель
        BIC     #40,@#7210     ; Корректировка указателя (циклический буфер)
        ADD     @#7230,PC
        RETURN
104206$:TRAP    2
        RETURN

; *** ОСНОВНАЯ П/П ОБСЛУЖИВАНИЯ КЛАВИАТУРЫ ***

; Точка выхода из п/п обслуживания клавиатуры
104212$:CLR     @#7060         ; Очистить флаг вызова п/п
        CLRB    @#7227         ; Очистить ячейку значения автоповтора
104222$:ADD     @#7230,PC
        RETURN
104230$:TRAP    2
        RETURN
104234$:TSTB    @7202          ; Есть скэн-коды в буфере автоповтора ?
        BEQ     104212$        ; Нет
        TSTB    @#7227         ; Истекло время автоповтора ?
        BNE     104222$        ; Нет
        MOV     @#7202,R3      ; R3 = указатель на буфер автоповтора(чтение)
104254$:MOVB    (R3)+,R0       ; Прочесть очередной скэн-код
        BNE     104336$        ; Он существует
104260$:BIC     #20,R3         ; Подправить значение указателя
        CMP     R3,@#7204      ; Буфер просмотрен до конца ?
        BNE     104254$        ; Нет
        MOVB    @#7226,@#7227
        DEC     @#7060
        BR      104222$
; Точка входа в п/п обслуживания клавиатуры из диспетчера процессов
104306$:MOV     @#7176,R1      ; R1 = указатель на буфер скэн-кодов
        MOVB    @R1,R0         ; Прочесть скэн-код
        BEQ     104234$        ; Скэн-кода нет
        DEC     @#7060         ; Уменьшить счетчик (флаг вызова)
        CLRB    (R1)+          ; Вычеркнуть скэн-код из буфера
        BIC     #10,R1         ; Подправить значение указателя
        MOV     R1,@#7176
        CLR     R3             ; В данном случае R3 является индикатором
                               ; того, что скэн-код был прочитан из основ-
                               ; ного буфера (R3=0) или из буфера авто-
                               ; повтора (R3<>0).
104336$:MOV     R0,R2          ; R2 = скэн-код
        BMI     104516$        ; Это скэн-код отжатия
        ASHC    #74,R0         ; Извлечение ASCII-кода
        MOVB    105510$(R0),R1
        MOV     R2,R0
        SUB     R1,R0
        ASL     R0
        ADD     @#7214,R0
        MOV     @R0,R0
        MOV     R0,R1
        SWAB    R1
        BEQ     104410$        ; Это одиночный ASCII-код
        ASRB    R1
        BNE     104434$        ; Это адрес ASCIZ-строки
        MOVB    R0,R0          ; Переход на обслуживание регистровых клавиш
        ASL     R0
        JMP     @104714$(R0)
104410$:TST     @#7232         ; Разрешена передача одиночных символов ?
        BNE     104510$        ; Нет
        TSTB    R0             ; Символ в диапазоне 128-255 ?
        BMI     104434$        ; Да
        CMP     R0,#100        ; Это символы @,A-Z,[,\,],_ ?
        BLO     104434$        ; Нет
        BISB    @#7220,R0      ; Установка заглавные/строчные буквы
104434$:TST     R3             ; Это символ из буфера автоповтора ?
        BNE     104472$        ; Да
        TSTB    @7202          ; Буфер автоповтора пуст ?
        BNE     104454$        ; Нет
        MOVB    #31,@#7227     ; Задать время между нажатием и автоповтором
104454$:MOVB    R2,@7204       ; Положить скэн-код в буфер автоповтора
        INC     @#7204         ; Подправить значение указателя
        BIC     #20,@#7204
104472$:MOV     @#7210,R1      ; R1 = указатель на буфер ASCII-символов
        MOV     R0,(R1)+       ; Положить символ(адрес строки) в буфер
        BIC     #40,R1
        MOV     R1,@#7210
104510$:TST     R3             ; Это был символ из буфера автоповтора ?
        BNE     104260$        ; Да
104514$:BR      104306$
104516$:MOV     @#7212,R0      ; R0 = ожидаемый код отжатия рег. клавиши
        BEQ     104614$        ; Регистровая клавиша не была нажата
        CMPB    R2,R0          ; Коды отжатия совпадают ?
        BEQ     104540$        ; Да
104530$:SWAB    R0
        BEQ     104530$
        CMPB    R2,R0
        BNE     104614$
; Обработка кода отжатия регистровой клавиши
104540$:CLRB    R0             ; Очистить байт кода отжатия
        SWAB    R0
        MOV     R0,@#7212
        CLR     R0
        CMPB    R2,#205        ; Была отжата клавиша НР (Shift) ?
        BEQ     104574$        ; Да
        MOVB    @#7224,R0      ; R0 = ASCII-код, посылаемый при отжатии АЛФ
        BEQ     104600$        ; Его нет
        CLRB    @#7224
        BR      104600$
104574$:SWAB    @#7220         ; Переменить состояние заглавные/строчные
104600$:MOV     @#7216,@#7214  ; Восстановить пред. табл. раскл. клавиатуры
        TST     R0             ; Есть данные для передачи при отжатии АЛФ ?
        BNE     104472$        ; Да
        BR      104306$
; Обработка кода отжатия алфавитно-цифровой клавиши
104614$:BIC     #177760,R2     ; Оставить биты кода отжатия
        MOV     @#7202,R1      ; R1 = указатель на буфер автоповтора
104624$:MOVB    (R1)+,R0       ; Прочесть скэн-код из буфера автоповтора
        BEQ     104644$        ; Он отсутствует
        BIC     #177760,R0     ; Оставить биты кода отжатия
        CMP     R0,R2          ; Эти коды совпадают ?
        BEQ     104700$        ; Да
        MOV     R2,R3
        BEQ     104306$
104644$:BIC     #20,R1
        TST     R3
        BNE     104660$
        MOV     R1,@#7202
104660$:CMP     R1,@#7204      ; Буфер просмотрен до конца ?
        BNE     104624$        ; Нет
        MOVB    #2,@#7226      ; Установить нормальную скорость автоповтора
104674$:JMP     104306$
104700$:CLRB    -1(R1)         ; Выбросить скэн-код из буфера автоповтора
        CLR     R2             ; R2 = 0(признак того, что скэн-код обнаружен)
        TST     R3
        BNE     104674$
        BR      104644$
; Адреса п/п обслуживания регистровых комбинаций
104714$:.WORD   104766$        ; Нажатие НР (Shift)
        .WORD   105044$        ; Нажатие АЛФ
        .WORD   105116$        ; Нажатие ГРАФ (Graph)
        .WORD   105150$        ; Нажатие УПР (Ctrl)
        .WORD   105160$        ; Нажатие ФИКС (Lock)
        .WORD   104734$        ; Установка режимов (УСТ)
        .WORD   105234$        ; Режим ИСУ (УПР+ПОМ)
        .WORD   104746$        ; Печать экрана (УПР+ИСП)
; П/п обслуживания нажатия УСТ
104734$:CLR     @#7042         ; Адресовать ASCII-коды клавиатуры запросу EMT
        INC     @#7070         ; Установить флаг вызова меню УСТАНОВКА
        BR      104514$
; П/п обслуживания нажатия УПР+ИСП (печать экрана)
104746$:CALL    135704$        ; Печать экрана
        MOV     @#7216,@#7214
        CLR     @#7212
        BR      104514$
; П/п обслуживания нажатия НР
104766$:TSTB    @7202          ; Нажата какая-нибудь алф.-циф. клавиша ?
        BEQ     105004$        ; Нет
        MOV     #401,7226      ; Установить повышенную скорость автоповтора
        BR      104514$
105004$:MOV     #205,R1        ; R1 = код отжатия НР
        MOV     #7514,@#7214   ; Текущая табл.-таблица нижнего регистра
105016$:SWAB    @#7220         ; Переключить режим заглавные/строчные буквы
105022$:SWAB    @#7212
        MOVB    R1,@#7212
        CMPB    @#7213,#207    ; Была нажата клавиша ФИКС ?
        BEQ     105202$        ; Да
        BR      104514$
; П/п обслуживания нажатия АЛФ
105044$:MOVB    @#7222,R0      ; R0 = 16(8) или 17(8)
        MOVB    @#7223,@#7224
        SWAB    @#7212
        MOVB    #206,@#7212    ; Код отжатия клавиши АЛФ
        CMPB    @#7213,#207    ; Была нажата клавиша ФИКС ?
        BNE     105112$        ; Нет
        CLRB    @#7224         ; При отжатии АЛФ не передавать ASCII-кода
        MOV     @#7216,@#7214
105112$:JMP     104472$
; П/п обслуживания нажатия ГРАФ
105116$:MOV     #7774,@#7214   ; Текущая табл.-таблица ГРАФ-регистра
105124$:MOV     #206,R1        ; R1 = код отжатия ГРАФ и УПР
105130$:CMP     @#7214,@#7216  ; Адрес текущей табл. равен адресу предыдущей ?
        BNE     105022$        ; Нет
        MOV     #7234,@#7214   ; Текущая таблица-таблица основного регистра
        BR      105022$
; П/п обслуживания нажатия УПР
105150$:MOV     #10254,@#7214  ; Текущая таблица-таблица УПР-регистра
        BR      105124$
; П/п обслуживания нажатия ФИКС
105160$:MOV     #207,R1        ; R1 = код отжатия ФИКС
        TST     @#7212         ; Нажата регистровая клавиша ?
        BNE     105202$        ; Да
        MOV     #10534,@#7214  ; Текущая таблица-таблица ФИКС-регистра
        BR      105130$
105202$:CMP     @#7214,#7514   ; Нажата НР ?
        BEQ     105016$        ; Да
        TSTB    @#7224         ; Нажата АЛФ ?
        BEQ     105224$        ; Нет
        CLRB    @#7224         ; При отжатии АЛФ не передавать ASCII-кода
105224$:MOV     @#7214,@#7216
        BR      105022$
; П/п обслуживания нажатия УПР+ПОМ (ИСУ on/off)
105234$:COMB    @#22552        ; Изменить режим ИСУ/не ИСУ
        BEQ     105250$        ; Режим ИСУ выключен
        EMT     52             ; Высветить надпись "ИСУ"
        .WORD   107641$
        BR      105254$
105250$:EMT     52             ; Стереть надпись "ИСУ"
        .WORD   107632$
105254$:JMP     104306$
; П/п обработки управляющего символа Ctrl+N (переключение на русский алфавит)
105260$:MOV     @#22556,R0     ; R0 = текущее состояние алфавита
        MOV     #200,@#22556   ; Установить русский алфавит
        MOV     #16*400+17,@#7222;Последовательность посылки кодов
                               ; при нажатии и отжатии АЛФ
        EMT     52             ; Высветить надпись "РУС"
        .WORD   107731$
        BR      105330$
; П/п обработки управляющего символа Ctrl+O (переключение на латинский алфавит)
105306$:MOV     @#22556,R0
        CLR     @#22556        ; Установить латинский алфавит
        MOV     #17*400+16,@#7222
        EMT     52             ; Высветить надпись "ЛАТ"
        .WORD   107736$
105330$:CMP     R0,@#22556     ; Предыдущий и текущий режимы алфавита равны ?
        BEQ     105342$        ; Да
        SWAB    @#7220         ; Переменить верхний/нижний регистр
105342$:RETURN
105344$:RETURN
; П/п устанавливает специальные режимы клавиатуры (системный, ДКЛ)
105346$:MOV     (R5)+,R0       ; R0 = адрес новых кодов клавиатуры
        MOV     (R5)+,R1       ; R1 = адрес буфера сохранения
        TST     @R1            ; Режим уже был установлен ?
        BNE     105376$        ; Да
        INC     (R1)+          ; Установить флаг спецрежима
        BR      105372$
105362$:MOV     7232(R2),(R1)+ ; Сохранить значение клавиши
        MOV     (R0)+,7232(R2) ; Занести новое значение
105372$:MOV     (R0)+,R2       ; R2 = адрес клавиши
        BNE     105362$        ; Еще не конец таблицы
105376$:RTS     R5
; П/п восстанавливает предыдущий режим клавиатуры
105400$:MOV     (R5)+,R0       ; R0 = адрес новых кодов клавиатуры
        MOV     (R5)+,R1       ; R1 = адрес буфера сохранения
        TST     @R1            ; Спецрежим установлен ?
        BEQ     105426$        ; Нет
        CLR     (R1)+          ; Сбросить флаг спецрежима
        BR      105422$
105414$:MOV     (R1)+,7232(R2) ; Восстановить значение клавиши
        TST     (R0)+
105422$:MOV     (R0)+,R2       ; R2 = адрес клавиши
        BNE     105414$        ; Еще не конец таблицы
105426$:RTS     R5
; П/п переключения клавиатуры в новый режим. Если текущий режим является
; не системным, то переключение производится сразу, иначе (системный режим)
; производится проверка адресов клавиш и для клавиш, задействованных
; в системном режиме, информация сохраняется в буфере, откуда перекачивается
; в таблицу раскладки при выходе из системного режима.
105430$:MOV     (R5)+,R0       ; R0 = адрес новой таблицы
        BR      105502$
105434$:TST     @#11054        ; Установлен системный режим ?
        BEQ     105476$        ; Нет
        MOV     #107310$-4,R2  ; R2 = адрес списка системных клавиш
105446$:ADD     #4,R2          ; Перейти к следущему адресу
        MOV     @R2,R3         ; R3 = адрес клавиши
        BEQ     105476$        ; Конец списка системных клавиш
        CMP     R3,R1          ; Адреса совпадают ?
        BNE     105446$        ; Нет
        SUB     #107310$,R2    ; Получение адреса клавиши в буфере сохранения
        ASR     R2
        MOV     (R0)+,11056(R2); Занести код в буфер сохранения
        BR      105502$
105476$:MOV     (R0)+,7232(R1) ; Занести код в таблицу раскладки клавиатуры
105502$:MOV     (R0)+,R1       ; R1 = адрес клавиши
        BNE     105434$        ; Еще не конец таблицы
        RTS     R5
; Корректирующие коды, использующиеся при вычислении адреса в таблице раскладки
105510$:.BYTE   5,12,17,24,31,36,43,50

; НАЧАЛЬНЫЕ ДАННЫЕ ДЛЯ ТАБЛИЦ РАСКЛАДКИ КЛАВИАТУРЫ
; Структура :
; первые 88 байт - ASCII-коды для клавиш
; далее - смещения для регистровых клавиш (конец - байт 0)
; строки символов : - смещение в таблице (байт 0 - конец списка)
;                   - ASCIZ-строка
; байт 0 - конец описания раскладки

; Раскладка основного регистра
105520$:.BYTE   54,33,73,0,0,0,64,0,0,67,70,55,11,112,61,62,63,105,65,66
        .BYTE   133,135,0,0,106,103,125,113,120,116,107,114,104,0,0,121
        .BYTE   131,127,101,111,122,117,102,100,0,0,0,136,123,115,40,124
        .BYTE   130,0,54,67,60,61,64,53,177,0,0,56,134,126,70,56,62,65,0
        .BYTE   0,15,0,137,110,132,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
        .BYTE   55,56,43,30,57,110,0
; - строки символов
        .BYTE   107
        .ASCIZ  <33><177>
        .BYTE   123
        .ASCIZ  <33>/~/
        .BYTE   4,0,5,0,6,0,10,0,11,0,0

; Раскладка НР-регистра
105702$:.BYTE   54,33,53,0,0,0,44,0,0,47,50,57,11,112,41,42,43,105,45,46
        .BYTE   133,135,0,0,106,103,125,113,120,116,107,114,104,0,0,121
        .BYTE   131,127,101,111,122,117,102,100,0,0,0,136,123,115,40,124
        .BYTE   130,0,74,67,60,61,64,52,177,0,0,76,134,126,70,56,62,65,0
        .BYTE   0,12,0,137,110,132,71,15,63,66,14,12,77,52,75,60,51
; - список регистровых клавиш
        .BYTE   55,56,43,30,57,110,0
; - строки символов
        .BYTE   107
        .ASCIZ  <33><177>
        .BYTE   123
        .ASCIZ  <33>/~/
        .BYTE   4,0,5,0,6,0,10,0,11,0,0

; Раскладка ГРАФ-регистра
106064$:.BYTE   54,33,73,0,0,0,64,0,0,67,70,55,11,252,61,62,63,245,65,66
        .BYTE   273,275,0,0,246,243,265,253,260,256,247,254,244,0,0,261
        .BYTE   271,267,241,251,262,257,242,240,0,0,0,276,263,255,40,264
        .BYTE   270,0,54,67,60,61,64,53,177,0,0,56,274,266,70,56,62,65,0
        .BYTE   0,0,0,277,250,272,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
        .BYTE   55,56,43,30,57,110,0
; - строки символов
        .BYTE   66
        .ASCIZ  <33>/D/
        .BYTE   76
        .ASCIZ  <33>/C/
        .BYTE   112
        .ASCIZ  <33>/A/
        .BYTE   77
        .ASCIZ  <33>/B/
        .BYTE   111
        .ASCIZ  <15><12>
        .BYTE   4,0,5,0,6,0,10,0,11,0,0

; Раскладка УПР-регистра
106262$:.BYTE   0,33,73,0,0,0,64,0,0,67,70,0,11,12,61,62,63,5,65,66,33,35
        .BYTE   0,0,6,3,25,13,20,16,7,14,4,0,0,21,31,27,1,11,22,17,2,0,0,0,0
        .BYTE   36,23,15,40,24,30,0,54,67,60,61,64,0,177,0,0,56,34,26,70,56
        .BYTE   62,65,0,0,0,0,37,10,32,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
        .BYTE   55,56,43,30,57,110,123,107,0
; - строки символов
        .BYTE   74
        .ASCIZ  <33>/P/
        .BYTE   14
        .ASCIZ  <33>/Q/
        .BYTE   1
        .ASCIZ  <33>/R/
        .BYTE   4,0,5,0,6,0,10,0,11,0,0

; Раскладка ФИКС-регистра
106452$:.BYTE   54,33,73,0,0,0,64,0,0,67,70,55,11,112,61,62,63,105,65,66
        .BYTE   133,135,0,0,106,103,125,113,120,116,107,114,104,0,0,121
        .BYTE   131,127,101,111,122,117,102,100,0,0,0,136,123,115,40,124
        .BYTE   130,0,54,67,60,61,64,53,177,0,0,56,134,126,70,56,62,65,0
        .BYTE   0,0,0,137,110,132,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
        .BYTE   55,56,43,30,57,110,0
; - строки символов
        .BYTE   107
        .ASCIZ  <33><177>
        .BYTE   123
        .ASCIZ  <33>/~/
        .BYTE   4,0,5,0,6,0,10,0,11,0,0

; Данные для пользовательского режима (VT-52)
106634$:.WORD   224,106752$,176,106755$,154,106760$,174,106763$
        .WORD   504,106752$,456,106755$,434,106760$,454,106763$
        .WORD   1244,106752$,1216,106771$,1174,106760$,1214,106766$
        .WORD   1524,106752$,1476,106755$,1454,106760$,1474,106763$
        .WORD   244,106774$,524,106771$,1242,106777$,0
106752$:.ASCIZ  <33>/A/
106755$:.ASCIZ  <33>/B/
106760$:.ASCIZ  <33>/D/
106763$:.ASCIZ  <33>/C/
106766$:.ASCIZ  <33>/K/
106771$:.ASCIZ  <33>/J/
106774$:.ASCIZ  <33>/H/
106777$:.ASCIZ  <15><12>
; Данные для пользовательского режима (15ИЭ-00-013)
107002$:.WORD   224,34,176,35,154,32,174,31,504,22,456,26,434,24,454,23
        .WORD   1244,34,1216,37,1174,32,1214,13,1524,34,1476,35,1454,32,1474,31
        .WORD   244,10,524,14,1242,25,0
; Данные для ДКЛ-режима
107120$:.WORD   236,107216$,210,107222$,162,107226$,164,107232$
        .WORD   212,107236$,240,107242$,166,107246$,214,107252$
        .WORD   242,107256$,160,107262$,206,107266$,234,107272$
        .WORD   170,107276$,30,107301$,2,107304$,0
107216$:.ASCIZ  <33>/?M/
107222$:.ASCIZ  <33>/?n/
107226$:.ASCIZ  <33>/?p/
107232$:.ASCIZ  <33>/?q/
107236$:.ASCIZ  <33>/?r/
107242$:.ASCIZ  <33>/?s/
107246$:.ASCIZ  <33>/?t/
107252$:.ASCIZ  <33>/?u/
107256$:.ASCIZ  <33>/?v/
107262$:.ASCIZ  <33>/?w/
107266$:.ASCIZ  <33>/?x/
107272$:.ASCIZ  <33>/?y/
107276$:.ASCIZ  <33>/P/
107301$:.ASCIZ  <33>/Q/
107304$:.ASCIZ  <33>/R/
        .EVEN
; Данные для системного режима
107310$:.WORD   162,60,164,61,212,62,240,63,166,64
        .WORD   214,65,242,66,160,67,206,70,234,71
        .WORD   222,107462$,236,107464$,246,107466$,216,107471$
        .WORD   224,107474$,176,107477$,154,107502$,174,107505$
        .WORD   504,107510$,456,107513$,434,107516$,454,107521$
        .WORD   146,107460$,172,107456$,244,14,0
107456$:.BYTE   177,0
107460$:.BYTE   40,0
107462$:.BYTE   15,0
107464$:.BYTE   15,0
107466$:.ASCIZ  <33>/~/
107471$:.ASCIZ  <33><177>
107474$:.ASCIZ  <33><200>
107477$:.ASCIZ  <33><201>
107502$:.ASCIZ  <33><202>
107505$:.ASCIZ  <33><203>
107510$:.ASCIZ  <33><204>
107513$:.ASCIZ  <33><205>
107516$:.ASCIZ  <33><206>
107521$:.ASCIZ  <33><207>
; Надписи для верхней информационной строки
107524$:.ASCIZ  <0>/     /
107533$:.ASCIZ  <0>/  УСТ/
107542$:.ASCIZ  <5>/     /
107551$:.ASCIZ  <5>/ ПМ  /
107560$:.ASCIZ  <5>/ ЦМ  /
107567$:.ASCIZ  <12>/     /
107576$:.ASCIZ  <12>/ ДКЛ /
107605$:.ASCIZ  <17>/     /
107614$:.ASCIZ  <17>/ ИНВ /
107623$:.ASCIZ  <17>/ПОДЧ /
107632$:.ASCIZ  <24>/     /
107641$:.ASCIZ  <24>/ ИСУ /
107650$:.ASCIZ  <31>/     /
107657$:.ASCIZ  <31>/ НР  /
107666$:.ASCIZ  <31>/ СУ  /
107675$:.ASCIZ  <31>/ГРАФ /
107704$:.ASCIZ  <31>/ФИКС /
107713$:.ASCIZ  <36>/ЗАГЛ /
107722$:.ASCIZ  <36>/СТР  /
107731$:.ASCIZ  <43>/РУС/
107736$:.ASCIZ  <43>/ЛАТ/
        .EVEN



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


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

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



Код


; *****************************************************************
; *                                                               *
; *                  ДРАЙВЕР ТЕКСТОВОГО ТЕРМИНАЛА                 *
; *                                                               *
; *                     Адреса 107744 - 125027                    *
; *                                                               *
; *****************************************************************

; П/п начальной инициализации
107744$:JSR     R5,173730$     ; Очистка ОЗУ
        .WORD   13142,4017     ; Начальный адрес - 13142, число слов - 4017
107754$:MOV     #0,@#177026    ; Разрешить все планы видеопамяти
        CLR     @#177020       ; Очистка регистров цвета кода фона
        CLR     @#177022
        CLR     R0             ; Цикл очистки видеопамяти
        MOV     #177010,R1
        MOV     #100000,@R1
        MOV     #100000,R2
        MOV     #177024,R3
110014$:MOV     R0,@R3
        INC     @R1
        SOB     R2,110014$
        MOV     #175700$,@#320 ; Адрес п/п обработки прерывания канала 0,пр.
        MOV     #200,@#322
        BIS     #1,@#177066    ; Разрешить прерывания канала 0, приемник
        CALL    110266$        ; Запрограммировать таблицу видеострок
        MOV     #117430$-13,R0 ; Настройка таблицы адресов рисунков символов
        MOV     #14142,R1      ; на область ПЗУ (адреса 117430-125027)
        MOV     #400,R2
        MOV     #13,R3
110070$:ADD     R3,R0
        MOV     R0,(R1)+
        SOB     R2,110070$
        MOV     #112462$,R0    ; Настройка таблицы адресов п/п управляющих и
        BR      110110$        ; Esc-последовательностей
110104$:MOV     (R0)+,13142(R1)
110110$:MOV     (R0)+,R1
        BNE     110104$
        MOV     #2000,@#22542  ; Настройка указателей на буферы
        MOV     #2000,@#22544
        MOVB    #14,@#2000     ; Положить символ Ctrl+L в буфер (CLS)
        JSR     R5,110656$     ; Загрузка в ОЗУ ТВ для верхней строки
        .WORD   112040$,22560
        JSR     R5,110656$     ; Загрузка в ОЗУ ТВ для экрана пользователя
        .WORD   112142$,22656
        JSR     R5,110656$     ; Загрузка в ОЗУ ТВ для экрана установки
        .WORD   112252$,22754
        JSR     R5,110656$     ; Загрузка в ОЗУ ТВ для нижней строки
        .WORD   112360$,23052
        MOV     #2270,@#272    ; Настройка первой видеостроки
110204$:MOV     #22656,R5      ; R5 = адрес ТВ для экрана пользователя
110210$:MOV     62(R5),@#23160 ; Указатель на регистр управления отображением
                               ; экраном пользователя
        MOV     72(R5),@#23164 ; Режим использования курсора
        INC     @#7066         ; Увел. счетчик симв. в буфере (для вывода CLS)
110230$:MOV     R5,@#23150     ; Сделать текущей ТВ, адрес которой в R5
        MOV     34(R5),@#177016; Настройка регистра кода цвета точки
        MOV     40(R5),@#177020; Настройка регистра кода цвета фона
        MOV     40(R5),@#177022
        MOVB    70(R5),@64(R5) ; Установить цвет курсора
        RETURN
; П/п программирования таблицы видеострок
110266$:MOV     #1131,R2       ; Число программируемых видеострок (ВС)
        MOV     #7034,R1       ; Адрес конца
        MOV     R1,@#7036
110302$:MOV     R1,R0          ; Цикл начального заполнения таблицы
        MOV     R0,-(R1)
        TST     -(R1)
        SOB     R2,110302$
        JSR     R5,110550$     ; Заполнение зоны адресов для ВС вехней строки
        .WORD   175700,2410,12,50
        MOV     R0,@#2464
        MOV     #177460,@#2474
        JSR     R5,110550$     ; Заполнение зоны адресов для ВС польз. экрана
        .WORD   100000,2500,436,120
        MOV     #177460,@#4674
        JSR     R5,110550$     ; Заполнение зоны адресов для ВС УСТ экрана
        .WORD   177460,4704,25,0
        JSR     R5,110550$
        .WORD   154540,5030,334,50
        JSR     R5,110550$
        .WORD   177460,6610,26,0
        MOV     #177460,@#6744
        JSR     R5,110550$     ; Заполнение зоны адресов для ВС нижней строки
        .WORD   176570,6754,13,50
        JSR     R5,110550$
        .WORD   177460,7030,2,0
        MOV     #2,R0          ; Выделение регистров управления отображением,
        MOV     #6,R1          ; цветом и подправка структуры таблицы
        BIS     R0,@#2366
        BIS     R1,@#2376
        BIS     R0,@#2456
        BIS     R1,@#2466
        MOV     #2500,@#4666
        BIS     R1,@#4676
        MOV     #6742,@#4536
        MOV     #6742,@#6736
        BIS     R1,@#6746
        RETURN
; П/п заполнения зоны адресов для ВС
; 1 параметр - начальный видеоадрес
; 2 параметр - начальный адрес таблицы ВС
; 3 параметр - размер таблицы (число видеострок)
; 4 параметр - длина видеостроки
110550$:MOV     (R5)+,R0
        MOV     (R5)+,R1
        MOV     (R5)+,R2
        MOV     (R5)+,R3
110560$:MOV     R0,(R1)+
        ADD     R3,R0
        TST     (R1)+
        SOB     R2,110560$
        RTS     R5
; П/п установки таблицы ВС на начало видеопамяти
110572$:ADD     74(R5),PC      ; Рулон присутствует ?
        BR      110654$        ; Нет
        CLR     @#23170        ; Число строк для скроллинга = 0
        MOV     @#2476,R0      ; Корректировка таблицы
        ADD     #2040,R0
        CMP     R0,#4670
        BLOS    110626$
        SUB     #2170,R0
110626$:MOV     R0,-2(R0)
        MOV     #6742,@#4536   ; Установка начальных значений
        MOV     #2500,@#2476
        MOV     #2500,30(R5)
110654$:RETURN
; П/п формирования таблицы видеопараметров
110656$:MOV     (R5)+,R0       ; R0 = адрес таблицы в ПЗУ
        MOV     @R5,R1         ; R1 = адрес таблицы в ОЗУ
        JSR     R5,110716$     ; Перекачка таблицы в ОЗУ
        MOV     (R5)+,R1
        MOV     (R0)+,@64(R1)  ; Заполнение регистра управления отображением
        MOV     (R0)+,@54(R1)
        MOV     (R0)+,@50(R1)  ; Заполнение регистра управления цветом
        MOV     (R0)+,@52(R1)
        RTS     R5
; П/п перекачки
110712$:MOV     (R5)+,R0
        MOV     (R5)+,R1
110716$:MOV     (R0)+,R2       ; R2 = число слов
110720$:MOV     (R0)+,(R1)+
        SOB     R2,110720$
        RTS     R5
;  ***  ОСНОВНАЯ ПОДПРОГРАММА УПРАВЛЕНИЯ ТЕКСТОВЫМ ТЕРМИНАЛОМ  ***
110726$:MOV     #174164$,-(SP) ; Занести в стек адреса возвратов
        MOV     #111126$,-(SP)
        MOV     SP,@#23152
        MOV     @#23154,SP
        MOV     @#23150,R5     ; R5 = адрес текущей ТВ
        INC     @#7066         ; Установить флаг вызова п/п перекл. курсора
110756$:INC     @#7064
; П/п чтения очередного символа, посланного по каналу 0
110762$:DEC     @#7064         ; Уменьшить счетчик символов
        BEQ     111050$        ; Символов нет
        MOVB    @22542,R0      ; Прочесть символ
        INC     @#22542        ; Подкорректировать указатель
        BIC     #200,@#22542
        BIC     #177400,R0
        CMP     R0,#40         ; Это управляющие коды ?
        BHIS    111024$        ; Нет
        ADD     @#23174,PC     ; Разрешено чтение управляющих символов ?
111024$:RETURN                 ; Да
111026$:CMP     R0,#33         ; Это символ Esc ?
        BEQ     111044$        ; Да
        ASL     R0             ; Вызов п/п обработки управляющего символа
        CALL    @13142(R0)
        BR      110762$
111044$:JMP     113544$
111050$:ADD     @#22546,PC     ; Была попытка передачи символа ?
        BR      111062$        ; Нет
        TRAP    4
        BR      110756$
111062$:MOV     @#7056,R0      ; R0 = указатель текущей задачи
        MOV     #110726$,22(R0); Запомнить адрес возврата
        MOV     SP,@#23154
        MOV     @#23152,SP
        CMP     (SP)+,(SP)+
        JMP     174164$        ; Переход на цикл вызова подпрограмм
111112$:ADD     @#22546,PC     ; Была попытка передачи символа ?
        RETURN                 ; Нет
        TRAP    4
        INC     @#7064
111126$:DEC     @#7064         ; Уменьшить счетчик символов
        BEQ     111112$        ; Символов нет
        TST     @#7060         ; Были нажаты клавиши ?
        BEQ     111204$        ; Нет
        RETURN
; Точка входа в подпрограмму
111144$:INC     @#7066         ; Установить флаг вызова п/п перекл. курсора
        MOV     @#23150,R5     ; R5 = адрес текущей таблицы видеопараметров
        MOV     34(R5),@#177016; Загрузка регистров кода цвета и кода фона
        MOV     40(R5),@#177020
        MOV     40(R5),@#177022
        MOVB    70(R5),@64(R5) ; Установить цвет курсора
111204$:MOVB    @22542,R0      ; Прочесть символ
        INC     @#22542        ; Подкорректировать указатель
        BIC     #200,@#22542
        MOV     #111126$,-(SP) ; Положить в стек адрес возврата
        BIC     #177400,R0
        CMP     R0,#40         ; Это управляющие коды ?
        BHIS    111260$        ; Нет
        TSTB    @#22552        ; Установлен режим ИСУ ?
        BEQ     111252$        ; Нет
        JMP     111730$
111252$:ASL     R0             ; Вызов п/п обработки управляющего символа
        JMP     @13142(R0)
111260$:CMPB    R0,#77         ; Это символы "A-Z,[,\,],^,_,a-z,{,|,},~" ?
        BLOS    111272$        ; Нет
        BIS     @#22556,R0     ; Подстройка алфавита
111272$:ASL     R0
        MOV     14142(R0),R1   ; R1 = адрес рисунка символа
        MOV     10(R5),R0      ; R0 = длина видеостроки
        MOV     #177010,R2
        MOV     #177024,R3
        MOV     @R5,@R2        ; Уст. в регистре адреса планов нач. адрес
        ADD     56(R5),PC      ; Переход в зависимости от режима (инверсия...)
111322$:.REPT   12             ; Цикл рисования символа
        MOVB    (R1)+,R4
        MOV     R4,@R3
        ADD     R0,@R2
        .ENDR
        MOVB    (R1)+,R4
        MOV     R4,@R3
111422$:INC     @R5            ; Передвинуть указатель на следующий адрес
        DEC     16(R5)         ; Уменьшить счетчик оставшихся позиций
        BNE     111624$        ; Еще не конец строки
        MOV     22(R5),@R5     ; Формирование адреса начала следующей строки
        MOV     4(R5),16(R5)
111444$:ADD     #54,32(R5)
        CMP     32(R5),26(R5)
        BNE     111470$
        MOV     24(R5),32(R5)
111470$:ADD     @32(R5),@R5
        DEC     20(R5)         ; Уменьшить счетчик оставшихся строк
        BNE     111624$        ; Еще не конец экрана
        ADD     74(R5),PC      ; Рулон присутствует ?
        BR      111626$        ; Нет
        INC     20(R5)         ; Увеличить счетчик оставшихся строк
        MOV     #13,-(SP)
        ADD     #54,30(R5)     ; Увелич. адрес списка ВС верхней части экрана
        CMP     30(R5),#4670
        BNE     111544$
        MOV     #2500,30(R5)
111544$:MOV     @#23170,R0     ; R0 = кол-во оставшихся видеострок для скрол.
        BEQ     111574$        ; Их нет
        BPL     111556$
        NEG     R0
111556$:CMP     R0,#14         ; <= 12(10) ?
        BLOS    111614$        ; Да
        TRAP    0              ; Вызов цикла подпрограмм
        MOV     @#23150,R5     ; R5 = адрес текущей ТВ
        BR      111544$
111574$:CLR     @#23164        ; Запретить курсор
        MOV     #2,@#7134
        MOVB    #177,@23160    ; Убрать курсор с экрана
111614$:CALL    113344$        ; Очистить освободившуюся строку
        ADD     (SP)+,@#23170  ; Осуществить скроллинг
111624$:RETURN
111626$:JMP     114316$        ; Перекинуть курсор на верх экрана
; П/п выключения курсора
111632$:CLR     @#23164        ; Запретить использование курсора
        MOV     60(R5),R0      ; Выключение курсора
        BIC     #1,6(R0)
        BIC     #1,52(R0)
        RETURN
; Обработка режима ПОДЧЕРКИВАНИЕ
111660$:MOV     #12,R0         ; R0 = число байт для посылки в видео
111664$:MOVB    (R1)+,R4       ; Рисование символа
        MOV     R4,@R3
        ADD     10(R5),@R2
        SOB     R0,111664$
        MOV     #377,@R3       ; Подчеркнуть символ
        BR      111422$
; Обработка режима ИНВЕРСИЯ
111704$:MOV     #13,R0
        BR      111716$
111712$:ADD     10(R5),@R2
111716$:MOVB    (R1)+,R4
        COM     R4             ; Инвертировать байт
        MOV     R4,@R3
        SOB     R0,111712$
        BR      111422$
; Обработка режима ИСУ
111730$:MOV     #3,-(SP)       ; Формирование начальных значений
        MOV     R0,-(SP)
        MOV     R0,-(SP)
        MOV     #74,R0         ; Вывод "<"
        CALL    111272$
        CLR     R0             ; Цикл вывода трех цифр
        BR      111762$
111754$:CLR     R0
        ROLB    @SP
        ROLB    R0
111762$:ROLB    @SP
        ROLB    R0
        ROLB    @SP
        ROLB    R0
        ADD     #60,R0
        CALL    111272$
        DEC     4(SP)
        BNE     111754$
        MOV     #76,R0         ; Вывод ">"
        CALL    111272$
        TST     (SP)+
        CMP     #12,(SP)+      ; Это был символ LF ?
        BNE     112034$        ; Нет
        CALL    114310$        ; Вывод CRLF
112034$:TST     (SP)+
        RETURN

; ТАБЛИЦЫ ВИДЕОПАРАМЕТРОВ
; Структура таблицы:
;   - первое слово N - число элемнтов в таблице
;   - N слов - содержимое таблицы
;   - 4 слова - значения регистров управления отображением и цветом

; ТВ для верхней информационной строки
112040$:.WORD   34
        .WORD   175700,175700,50,13,50,1,13,50,1,0,2410,12114,2410,2410
        .WORD   6,6,0,0,0,0,2400,2402,2372,0,2410,2371,2370,2
        .WORD   0,27,21000,63104
; ТВ для пользовательского экрана
112142$:.WORD   37
        .WORD   100000,100000,120,410,120,30,436,120,30,0,2500,4670,2500,2500
        .WORD   7,7,10421,10421,10421,10421,2470,2472,2462,0,2500,2461,2460
        .WORD   1,7,2,2
        .WORD   7,7,135230,177334
; ТВ для экрана установки
112252$:.WORD   36
        .WORD   154540,154540,50,334,50,24,334,50,24,0,5030,6610,5030,5030
        .WORD   7,7,10421,10421,10421,10421,4700,4702,4672,0,5030,4671,4670
        .WORD   2,7,2
        .WORD   7,27,135230,177334
; ТВ для нижней информационной строки
112360$:.WORD   34
        .WORD   176570,176570,50,13,50,1,13,50,1,0,6754,7030,6754,6754
        .WORD   6,6,0,0,0,0,6750,6752,6742,0,6754,6741,6740,2
        .WORD   0,27,21000,63104

; Таблица описания адресов п/п исполнения управляющих и Esc-последовательностей
112462$:.WORD   16,113220$     ; Ctrl-G
        .WORD   20,114226$     ; Ctrl-H
        .WORD   24,114216$     ; Ctrl-J
        .WORD   26,114772$     ; Ctrl-K
        .WORD   30,113236$     ; Ctrl-L
        .WORD   32,114336$     ; Ctrl-M
        .WORD   34,105260$     ; Ctrl-N
        .WORD   36,105306$     ; Ctrl-O
        .WORD   44,114636$     ; Ctrl-R
        .WORD   46,114514$     ; Ctrl-S
        .WORD   50,114410$     ; Ctrl-T
        .WORD   52,114310$     ; Ctrl-U
        .WORD   54,114620$     ; Ctrl-V
        .WORD   56,113670$     ; Ctrl-W
        .WORD   62,114254$     ; Ctrl-Y
        .WORD   64,114226$     ; Ctrl-Z
        .WORD   66,113532$     ; Ctrl-[
        .WORD   70,114106$     ; Ctrl-\
        .WORD   72,114216$     ; Ctrl-]
        .WORD   76,114772$     ; Ctrl-_
        .WORD   112,113602$    ; Esc %
        .WORD   172,113750$    ; Esc =
        .WORD   174,113766$    ; Esc >
        .WORD   176,114004$    ; Esc ?
        .WORD   202,114106$    ; Esc A
        .WORD   204,114216$    ; Esc B
        .WORD   206,114254$    ; Esc C
        .WORD   210,114226$    ; Esc D
        .WORD   212,113712$    ; Esc E
        .WORD   220,114660$    ; Esc H
        .WORD   222,114106$    ; Esc I
        .WORD   224,114714$    ; Esc J
        .WORD   226,114772$    ; Esc K
        .WORD   240,115010$    ; Esc P
        .WORD   262,115626$    ; Esc Y
        .WORD   264,115776$    ; Esc Z
        .WORD   266,114006$    ; Esc [
        .WORD   400,114106$    ; Esc 200
        .WORD   402,114216$    ; Esc 201
        .WORD   404,114226$    ; Esc 202
        .WORD   406,114254$    ; Esc 203
        .WORD   410,114316$    ; Esc 204
        .WORD   412,114324$    ; Esc 205
        .WORD   414,114336$    ; Esc 206
        .WORD   416,114356$    ; Esc 207
        .WORD   420,114404$    ; Esc 210
        .WORD   422,114406$    ; Esc 211
        .WORD   424,114410$    ; Esc 212
        .WORD   426,114514$    ; Esc 213
        .WORD   430,114620$    ; Esc 214
        .WORD   432,114636$    ; Esc 215
        .WORD   434,114654$    ; Esc 216
        .WORD   436,114656$    ; Esc 217
        .WORD   440,114260$    ; Esc 220
        .WORD   442,114266$    ; Esc 221
        .WORD   444,114274$    ; Esc 222
        .WORD   446,114302$    ; Esc 223
        .WORD   450,114660$    ; Esc 224
        .WORD   452,113236$    ; Esc 225
        .WORD   454,114714$    ; Esc 226
        .WORD   456,114772$    ; Esc 227
        .WORD   460,114310$    ; Esc 230
        .WORD   462,115626$    ; Esc 231
        .WORD   464,116014$    ; Esc 232
        .WORD   466,116016$    ; Esc 233
        .WORD   470,116020$    ; Esc 234
        .WORD   472,0          ; Esc 235
        .WORD   474,0          ; Esc 236
        .WORD   476,0          ; Esc 237
        .WORD   500,116022$    ; Esc Граф-@
        .WORD   502,116066$    ; Esc Граф-A
        .WORD   504,116144$    ; Esc Граф-B
        .WORD   506,116234$    ; Esc Граф-C
        .WORD   510,116274$    ; Esc Граф-D
        .WORD   512,116374$    ; Esc Граф-E
        .WORD   514,116462$    ; Esc Граф-F
        .WORD   516,116212$    ; Esc Граф-G
        .WORD   520,116542$    ; Esc Граф-H
        .WORD   522,116544$    ; Esc Граф-I
        .WORD   524,116546$    ; Esc Граф-J
        .WORD   526,116550$    ; Esc Граф-K
        .WORD   556,116552$    ; Esc Граф-W
        .WORD   560,116600$    ; Esc Граф-X
        .WORD   570,116624$    ; Esc Граф-\
        .WORD   572,116632$    ; Esc Граф-]
        .WORD   574,116742$    ; Esc Граф-^
        .WORD   576,116750$    ; Esc Граф-_
        .WORD   0

; ПОДПРОГРАММЫ ОБРАБОТКИ УПРАВЛЯЮЩИХ И ESC-ПОСЛЕДОВАТЕЛЬНОСТЕЙ
; П/п обработки Ctrl-G
113220$:BIS     #600,@#177716  ; Включить звуковой сигнал (частота 500 Гц)
        MOV     #20,@#7046     ; Установить время (0.32 сек)
        RETURN
; П/п обработки Ctrl-L, Esc 225
113236$:MOV     @50(R5),-(SP)  ; Сохранение содержимого рег. управления цветом
        MOV     @52(R5),-(SP)
        MOV     44(R5),@50(R5) ; Засветка всего экрана цветом фона
        MOV     44(R5),@52(R5)
        CALL    113362$        ; Очистка экрана (заполнение цветом фона)
        CALL    110572$        ; Установка ТВ на начало видеопамяти
        MOV     30(R5),R4      ; Установка курсора в начало экрана
        MOV     R4,32(R5)
        MOV     @R4,@R5
        ADD     22(R5),@R5
        MOV     4(R5),16(R5)
        MOV     12(R5),20(R5)
        MOV     (SP)+,@52(R5)  ; Восстановление регистров управления цветом
        MOV     (SP)+,@50(R5)
        MOV     72(R5),@#23164
        RETURN
; П/п-мы очистки заданной области экрана (заполнение цветом фона)
; Параметры (для точки входа 113376$):
;  R1 - начальный адрес;
;  R2 - длина в байтах;
;  R3 - число видеострок;
113344$:MOV     @32(R5),R1
        ADD     22(R5),R1
113354$:MOV     #13,R3
        BR      113372$
113362$:MOV     2(R5),R1
        MOV     14(R5),R3
113372$:MOV     4(R5),R2
113376$:MOV     44(R5),@#177020; Загрузка в регистры кода фона цвета фона
        MOV     44(R5),@#177022
        MOV     #177010,R4
        MOV     R1,@R4         ; Загрузить в регистр адреса планов нач. адрес
        MOV     #177024,R1
        CLR     R0
        CMP     R2,10(R5)      ; Длина очищаемой строки равна истинной длине ?
        BEQ     113500$        ; Да
        MOV     R2,-(SP)       ; Сохранить длину строки
        BR      113450$
113440$:MOV     @SP,R2         ; R2 = длина очищаемой строки
        SUB     R2,@R4         ; Вычесть длину строки из адреса планов
        ADD     10(R5),@R4     ; Прибавить истинную длину
113450$:MOV     R0,@R1         ; Очистить байт строки
        INC     @R4            ; Переход к следующему адресу
        SOB     R2,113450$     ; Цикл по длине очищаемой части строки
        SOB     R3,113440$     ; Цикл по числу видеострок
        TST     (SP)+
113462$:MOV     40(R5),@#177020; Загр. в регистры кода фона цвета знакоместа
        MOV     40(R5),@#177022
        RETURN
113500$:MUL     R2,R3          ; R3 = длина строки * число видеострок
113502$:MOV     R0,@R1         ; Цикл очистки
        INC     @R4
        SOB     R3,113502$
        BR      113462$
; Значения для загрузки в регистры кода фона (177020 и 177022)
113512$:.WORD   0,10421,21042,31463,42104,52525,63146,73567
; П/п обработки Ctrl-[ (Esc)
113532$:MOV     SP,@#23152
        MOV     #2,@#23174     ; Активировать проверку на управляющие символы
113544$:MOV     #1000,SP
        CALL    110762$        ; Прочесть символ
        ASL     R0             ; Вызов п/п обработки Esc-последовательности
        CALL    @13142(R0)
        CLR     @#23174
        MOV     @#23152,SP
        RETURN
; Точка входа при исполнении Esc %!3 в графическом режиме
113574$:MOV     2(SP),R0
        BR      113620$
; П/п обработки Esc %
113602$:CALL    110762$        ; Прочесть символ
        CMPB    R0,#41         ; Это "!" ?
        BNE     113632$        ; Нет
        CALL    110762$
113620$:BIC     #177774,R0
        ASL     R0             ; Вызов соответствующей п/п
        CALL    @113634$(R0)
113632$:RETURN
; Адреса п/п, вызывающиеся при обработке Esc %!
113634$:.WORD   113644$,113670$,113670$,113670$
; П/п обработки Esc %!0 (переход в графический режим)
113644$:CALL    111632$        ; Выключение курсора
        CLR     @#23174        ; Аннулировать проверку на управляющие символы
        CALL    @#135436$      ; Вызов п/п управления графикой
        MOV     72(R5),@#23164
        RETURN
; П/п обработки Ctrl-W, Esc %! (1-3)
113670$:JSR     R5,105430$     ; Перекодировать клавиши под VT-52
        .WORD   106634$
        MOV     #114226$,@#13162; При Ctrl-H выполнять шаг назад
        CLR     @#7154         ; Установить пункт VT-52 в меню УСТ
        RETURN
; П/п обработки Esc E
113712$:JSR     R5,105430$     ; Перекодировать клавиши под 15ИЭ-00-013
        .WORD   107002$
        MOV     #114660$,@#13162; При Ctrl-H выполнять операцию Home
        MOV     #1,@#7154      ; Установить пункт 15ИЭ-00-013 в меню УСТ
        RETURN
; П/п загрузки регистров кода цвета и фона
113736$:MOV     R5,-(SP)       ; Сохранить адрес текущей ТВ
        CALL    110204$        ; Загрузить регистры
        MOV     (SP)+,R5       ; Восстановить адрес ТВ
        RETURN
; П/п обработки Esc =
113750$:JSR     R5,105346$     ; Установить режим ДКЛ
        .WORD   107120$,11014
        EMT     52             ; Вывести надпись "ДКЛ"
        .WORD   107576$
        RETURN
; П/п обработки Esc >
113766$:JSR     R5,105400$     ; Сбросить режим ДКЛ
        .WORD   107120$,11014
        EMT     52             ; Стереть надпись "ДКЛ"
        .WORD   107567$
        RETURN
114004$:RETURN
; П/п обработки Esc [
114006$:CALL    110762$        ; Чтение символа
        CMP     R0,#62         ; Это "2" ?
        BEQ     114050$        ; Да
        CMP     R0,#77         ; Это "?" ?
        BEQ     114046$        ; Да
        BR      114034$
114030$:CALL    110762$
114034$:CMPB    R0,#162        ; Это "r" ?
        BNE     114030$        ; Нет
        CALL    113236$        ; Очистка экрана
114046$:RETURN
114050$:CALL    110762$
        CMP     R0,#150        ; Это "h" ?
        BNE     114072$        ; Нет
        MOV     #2,@#7232      ; Запрет передачи одиночных ASCII-кодов клав.
        BR      114104$
114072$:CMP     R0,#154        ; Это "l" ?
        BNE     114104$        ; Нет
        CLR     @#7232         ; Разрешение передачи одиночных ASCII-кодов
114104$:RETURN
; П/п обработки Ctrl-\, Esc A, Esc I, Esc 200
114106$:SUB     @32(R5),@R5    ; Вычесть адрес начала видеостроки
        SUB     #54,32(R5)     ; Перейти к предыд. символьной строке
        CMP     32(R5),24(R5)  ; Был переход за верх экрана ?
        BHIS    114144$        ; Нет
        MOV     26(R5),32(R5)  ; Переход на низ экрана
        SUB     #54,32(R5)
114144$:ADD     @32(R5),@R5    ; Прибавить к положению курсора тек. строку
        CMP     20(R5),12(R5)  ; Это была верхняя строка
        BNE     114204$        ; Нет
        ADD     74(R5),PC      ; Рулон присутствует ?
        BR      114212$        ; Нет
        MOV     32(R5),30(R5)
        MOV     #-13,-(SP)     ; Скроллинг 11(10) видеострок вниз
        JMP     111544$
114204$:INC     20(R5)         ; Количество оставшихся строк ++
        RETURN
114212$:JMP     114324$        ; Позиционирование на низ текущей колонки
; П/п обработки Ctrl-J, Ctrl-], Esc B, Esc 201
114216$:SUB     @32(R5),@R5    ; Вычесть адрес начала видеостроки
        JMP     111444$        ; Перемещение вниз
; П/п обработки Ctrl-H (в системе команд VT-52), Ctrl-Z, Esc D, Esc 202
114226$:CMP     16(R5),4(R5)   ; Курсор в начале строки ?
        BEQ     114246$        ; Да
        DEC     @R5            ; Уменьшить позицию в строке
        INC     16(R5)         ; Увеличить количество оставшихся позиций
        RETURN
114246$:CALL    114356$        ; Позиционирование в конец строки
        BR      114106$        ; На одну строку вверх
; П/п обработки Ctrl-Y, Esc C, Esc 203
114254$:JMP     111422$        ; Перемещение курсора на одну позицию вправо
; П/п обработки Esc 220
114260$:CALL    114254$        ; Вправо
        BR      114106$        ; Вверх
; П/п обработки Esc 221
114266$:CALL    114226$        ; Влево
        BR      114216$        ; Вниз
; П/п обработки Esc 222
114274$:CALL    114106$        ; Вверх
        BR      114226$        ; Влево
; П/п обработки Esc 223
114302$:CALL    114216$        ; Вниз
        BR      114254$        ; Вправо
; П/п обработки Ctrl-U, Esc 230
114310$:CALL    114336$        ; В начало строки
        BR      114216$        ; Вниз
; П/п обработки Esc 204
114316$:CLR     R0             ; Номер начальной строки
        JMP     115720$        ; Позиционирование
; П/п обработки Esc 205
114324$:MOV     12(R5),R0      ; R0 = номер последней строки
        DEC     R0
        JMP     115720$        ; Позиционирование
; П/п обработки Ctrl-M, Esc 206
114336$:MOV     22(R5),@R5     ; Позиционирование в начало строки
        ADD     @32(R5),@R5
        MOV     4(R5),16(R5)   ; Количество оставшихся позиций = длина строки
        RETURN
; П/п обработки Esc 207
114356$:MOV     4(R5),@R5      ; Позиционирование в конец строки
        ADD     22(R5),@R5
        DEC     @R5
        ADD     @32(R5),@R5
        MOV     #1,16(R5)      ; Осталась одна позиция
        RETURN
114404$:RETURN
114406$:RETURN
; П/п обработки Ctrl-T, Esc 212
114410$:MOV     16(R5),R0      ; R0 = количество оставшихся позиций
        DEC     R0
        BEQ     114474$        ; Осталась одна позиция
        MOV     @R5,R1
        INC     R1             ; R1 = текущий видеоадрес + 1
        MOV     #13,-(SP)      ; Число видеострок
        MOV     #177010,R3
        MOV     #177024,R4
114440$:MOV     R0,R2          ; R2 = число перемещаемых символов
        MOV     R1,@R3
        BR      114452$
114446$:ADD     #2,@R3         ; Цикл перемещения символов
114452$:TST     @R4
        DEC     @R3
        CLR     @R4
        SOB     R2,114446$
        ADD     10(R5),R1      ; Переход к следующей видеостроке
        DEC     @SP
        BNE     114440$
        TST     (SP)+
114474$:MOV     @R5,R1
        ADD     R0,R1          ; R1 = адрес конечного символа
        MOV     #1,R2          ; R2 = 1 (длина очищаемой части строки)
        MOV     #13,R3         ; Число очищаемых видеострок
        JMP     113376$        ; Очистка
; П/п обработки Ctrl-S, Esc 213
114514$:MOV     16(R5),R0      ; R0 = количество оставшихся позиций
        DEC     R0
        BEQ     114602$        ; Осталась одна позиция
        MOV     @R5,R1
        ADD     R0,R1          ; R1 = адрес конца строки
        DEC     R1
        MOV     #13,-(SP)      ; Число видеострок
        MOV     #177010,R3
        MOV     #177024,R4
114546$:MOV     R0,R2          ; R2 = число перемещаемых символов
        MOV     R1,@R3
        BR      114560$
114554$:SUB     #2,@R3         ; Цикл перемещения символов
114560$:TST     @R4
        INC     @R3
        CLR     @R4
        SOB     R2,114554$
        ADD     10(R5),R1      ; Переход к следующей видеостроке
        DEC     @SP
        BNE     114546$
        TST     (SP)+
114602$:MOV     @R5,R1         ; R1 = текущий видеоадрес
        MOV     #1,R2          ; R2 = длина очищаемой части строки
        MOV     #13,R3         ; R3 = число видеострок
        JMP     113376$        ; Очистка
; П/п обработки Ctrl-V, Esc 214
114620$:DEC     20(R5)         ; Уменьшить количество оставшихся строк
        SUB     #13,@#23170    ; Скроллинг вниз
        JMP     114106$        ; Курсор вверх
; П/п обработки Ctrl-R, Esc 215
114636$:INC     20(R5)         ; Увеличить количество оставшихся строк
        ADD     #13,@#23170    ; Скроллинг вверх
        JMP     114216$        ; Курсор вниз
114654$:RETURN
114656$:RETURN
; П/п обработки Ctrl-H (в системе команд 15ИЭ-00-013), Esc H, Esc 224
114660$:MOV     30(R5),32(R5)  ; Текущий адрес списка ВС - верх экрана
        MOV     22(R5),@R5     ; Позиционирование курсора в верх. угол экрана
        ADD     @32(R5),@R5
        MOV     4(R5),16(R5)   ; Число ост. позиций = длина строки
        MOV     12(R5),20(R5)  ; Число ост. строк = число строк на экране
        RETURN
; П/п обработки Esc J, Esc 226
114714$:CALL    114772$        ; Очистка конца строки
        MOV     20(R5),-(SP)   ; Количество оставшихся строк
        MOV     32(R5),R1      ; R1 = текущий адрес списка ВС
        BR      114762$
114732$:ADD     #54,R1         ; Перейти к следующей строке
        CMP     R1,26(R5)      ; Дошли до конца экрана ?
        BNE     114750$        ; Нет
        MOV     24(R5),R1      ; R1 = начальный адрес списка ВС
114750$:MOV     R1,-(SP)
        MOV     @R1,R1
        CALL    113354$        ; Очистка
        MOV     (SP)+,R1
114762$:DEC     @SP
        BNE     114732$
        TST     (SP)+
        RETURN
; П/п обработки Ctrl-K, Esc K, Esc 227
114772$:MOV     @R5,R1         ; R1 = текущий видеоадрес
        MOV     16(R5),R2      ; R2 = количество оставшихся позиций в строке
        MOV     #13,R3         ; R3 = число видеострок
        JMP     113376$        ; Очистка
; П/п обработки Esc P
115010$:CLR     -(SP)
115012$:CALL    110762$        ; Чтение символа
        MOV     R0,-(SP)       ; Сохранение его в стеке
        CMPB    R0,#73         ; Это ";" ?
        BNE     115012$
115026$:CALL    110762$
        MOV     R0,-(SP)
        CMPB    R0,#73         ; Это ";" ?
        BEQ     115424$        ; Да
        CMPB    R0,#174        ; Это "|" ?
        BNE     115026$
115050$:TST     (SP)+          ; Восстановление стека
        BNE     115050$
        ASR     -4(SP)         ; Была набрана "1" ?
        BCS     115112$        ; Да
        MOV     #115342$,R1    ; R1 = список смещ. клавиш К1-К25 в табл. раск.
        MOV     #31,R2         ; R2 = 25(10) число программир. клавиш
115072$:MOV     (R1)+,R0       ; Цикл очистки назначений клавиш
        MOV     #11140,7232(R0)
        SOB     R2,115072$
        MOV     #11142,@#13140 ; Установка указателя на начало буфера
115112$:CLR     -(SP)
115114$:CALL    110762$
        CMPB    R0,#33         ; Это Escape ?
        BEQ     115302$        ; Да
        CMPB    R0,#57         ; Это "/" ?
        BEQ     115154$        ; Да
        MOV     @SP,R1         ; @SP = @SP * 10 + R0
        MUL     #10.,R1
        BIC     #177760,R0
        ADD     R0,R1
        MOV     R1,@SP
        BR      115114$
115154$:MOV     (SP)+,R0
        CMP     R0,#25.        ; Номер клавиши в диапазоне 1 -- 25 ?
        BHI     115112$        ; Нет
        DEC     R0
        ASL     R0
        MOV     115342$(R0),R0 ; R0 = смещение клавиши в таблице раскладки
        MOV     @#13140,7232(R0); Запомнить адрес строки
115202$:CALL    110762$
        CMPB    R0,#33         ; Это Escape ?
        BEQ     115304$
        CMPB    R0,#73         ; Это ";" ?
        BEQ     115270$
        CALL    115322$        ; Преобразование HEX-цифры в двоичный код
        ASH     #4,R0          ; R0 = R0 * 16
        MOV     R0,-(SP)
        CALL    110762$
        CALL    115322$
        BIS     (SP)+,R0
        MOVB    R0,@13140      ; Запомнить символ в строке
        CMP     @#13140,#13130 ; Достигнут конец буфера
        BHI     115202$        ; Да
        INC     @#13140        ; Продвинуть указатель на следующую позицию
        BR      115202$
115270$:CLRB    @13140         ; Пометить конец строки
        INC     @#13140
        BR      115112$
115302$:TST     (SP)+
115304$:CLRB    @13140
        INC     @#13140
        CALL    110762$
        RETURN
; П/п преобразования HEX-цифры в двоичное представление
115322$:CMP     R0,#101        ; Цифра в диапазоне "A-F" ?
        BLO     115334$        ; Нет
        ADD     #11,R0
115334$:BIC     #177760,R0
        RETURN
; Смещения для клавиш К1-К25 в таблице раскладки клавиатуры
115342$:.WORD   10,12,14,20,22,270,272,274,300,302,550,552,554,560,562
        .WORD   1030,1032,1034,1040,1042,1310,1312,1314,1320,1322
115424$:MOV     2(SP),R0       ; R0 = код симв., шрифт кот. перепрограммир.
115430$:TST     (SP)+          ; Восстановление стека
        BNE     115430$
        MOV     R0,R1
        ASL     R0
        ADD     #14142,R0      ; R0 = указатель на ячейку адреса рисунка симв.
        MOV     R0,-(SP)
        MUL     #11,R1         ; Вычисление местоположения рисунка символа
        ADD     #15142,R1      ; R1 = адрес местоположения рисунка символа
        MOV     R1,-(SP)
115460$:CALL    110762$        ; Чтение символа
        CMP     R0,#33         ; Это Escape ?
        BEQ     115550$        ; Да
        CMP     R0,#100        ; Это "@" ?
        BNE     115460$        ; Нет
115500$:MOV     @SP,@2(SP)     ; Сохранить адрес рисунка в таблице
        ADD     #2,2(SP)       ; Переход на следующую позицию в табл. адресов
        JSR     R5,115554$     ; Программирование первых пяти байт
        .WORD   5
        CALL    110762$
        JSR     R5,115554$     ; Программирование следующих шести байт
        .WORD   6
        CALL    110762$
        CMP     R0,#33         ; Это Escape
        BNE     115500$
        CALL    110762$
115550$:CMP     (SP)+,(SP)+
        RETURN
; П/п программирования заданного количества байт в рисунке символа
115554$:MOV     #10,-(SP)      ; Длина байта
115560$:MOV     R5,-(SP)
        CALL    110762$
        MOV     (SP)+,R5
        CMP     R0,#33         ; Это Escape ?
        BEQ     115616$        ; Да
        MOV     4(SP),R3       ; R3 = адрес рисунка
        MOV     @R5,R4         ; R4 = число программируемых байт
115604$:ASR     R0             ; Цикл программирования
        RORB    (R3)+
        SOB     R4,115604$
        DEC     @SP
        BNE     115560$
115616$:ADD     (R5)+,4(SP)    ; Перейти к следующей области рисунка
        TST     (SP)+
        RTS     R5
; П/п обработки Esc Y, Esc 231
115626$:CALL    110762$        ; Прочесть символ
        SUB     #40,R0
        BMI     115652$
        CMP     R0,12(R5)      ; Координата Y превышает диапазон ?
        BHIS    115652$        ; Да
        CALL    115720$        ; Позиционирование по координате Y
115652$:CALL    110762$
        SUB     #40,R0
        BMI     115716$
        CMP     R0,4(R5)       ; Координата X превышает диапазон ?
        BHIS    115716$        ; Да
115672$:MOV     4(R5),16(R5)   ; Позиционирование по координате X
        SUB     R0,16(R5)      ; (16)R5 - кол-во оставшихся позиций
        ADD     @32(R5),R0     ; R0 = адрес видеопамяти начала строки + X
        ADD     22(R5),R0      ; Плюс константа начального доступа
        MOV     R0,@R5         ; @R5 - адр.начала видеопамяти для выв. симв.
115716$:RETURN
; П/п позиционирования по координате Y
115720$:SUB     @32(R5),@R5    ; @R5 - оставить координату X
        MOV     12(R5),20(R5)
        SUB     R0,20(R5)      ; 20(R5) - кол-во ост. символьных строк
        MUL     #11.*4,R0
        ADD     30(R5),R1      ; R1 = адрес описания видеостроки
        ADD     74(R5),PC      ; Рулон присутствует ?
        BR      115766$        ; Нет
        CMP     R1,#4670       ; Переход за границу списка ?
        BLO     115766$        ; Нет
        SUB     #2170,R1       ; Подкорректировать значение
115766$:MOV     R1,32(R5)      ; 32(R5) - текущий адрес списка видеострок
        ADD     @R1,@R5        ; @R5 - адр.начала видеопамяти для выв.симв.
        RETURN
; П/п обработки Esc Z
115776$:MOV     #116010$,R0    ; R0 = адрес символьной строки
        CALL    104160$        ; Передача адреса строки п/п обсл. клавиатуры
        RETURN
116010$:.ASCIZ  <33>"/Z"       ; Терминал VT-100 в режиме VT-52
        .EVEN
116014$:RETURN
116016$:RETURN
116020$:RETURN
; П/п обработки Esc Граф-@
116022$:ADD     @#23176,PC     ; Установлен режим отмены ?
        BR      116036$        ; Нет
        MOV     36(R5),R0      ; R0 = предыдущий цвет символа
        BR      116046$
116036$:CALL    110762$        ; Прочесть символ
        BIC     #177770,R0
116046$:MOV     R0,@#177016    ; Положить номер цвета в регистр кода цвета
116052$:MOV     34(R5),36(R5)  ; Запомнить предыдущий цвет символа
        MOV     R0,34(R5)      ; Сохранить номер цвета в ТВ
        RETURN
; П/п обработки Esc Граф-A
116066$:ADD     @#23176,PC     ; Установлен режим отмены ?
        BR      116102$        ; Нет
        MOV     42(R5),R0      ; R0 = предыдущий цвет знакоместа
        BR      116120$
116102$:CALL    110762$        ; Прочесть символ
        BIC     #177770,R0
        ASL     R0
        MOV     113512$(R0),R0 ; R0 = код фонового цвета
116120$:MOV     R0,@#177020    ; Положить номер фон. цвета в рег. кода фона
        MOV     R0,@#177022
116130$:MOV     40(R5),42(R5)  ; Запомнить предыдущий цвет знакоместа
        MOV     R0,40(R5)      ; Сохранить номер цвета знакоместа в ТВ
        RETURN
; П/п обработки Esc Граф-B
116144$:ADD     @#23176,PC     ; Установлен режим отмены ?
        BR      116160$        ; Нет
        MOV     46(R5),R0      ; R0 = предыдущий цвет фона
        BR      116046$
116160$:CALL    110762$        ; Прочесть символ
        BIC     #177770,R0
116170$:ASL     R0
        MOV     113512$(R0),R0 ; R0 = код фонового цвета
        MOV     44(R5),46(R5)  ; Запомнить предыдущий цвет фона
        MOV     R0,44(R5)      ; Сохранить номер цвета фона в ТВ
        RETURN
; П/п обработки Esc Граф-G
116212$:CALL    110762$        ; Прочесть символ
        BIC     #177770,R0     ; R0 = номер цвета курсора
        MOVB    R0,@64(R5)     ; Изменить цвет курсора
116226$:MOV     R0,70(R5)      ; Сохранить цвет курсора в ТВ
        RETURN
; П/п обработки Esc Граф-C
116234$:ADD     @#23176,PC     ; Установлен режим отмены ?
        BR      116254$        ; Нет
        CLR     @#22554        ; Сбросить индикатор режима инверсии(подч.)
        EMT     52             ; Очистить надпись "ИНВ" ("ПОДЧ")
        .WORD   107605$
        BR      116334$
116254$:MOV     #<111704$-111322$>,56(R5); Установить режим инверсии (362)
        INCB    @#22554        ; Установить индикатор режима инверсии
        EMT     52             ; Высветить надпись "ИНВ"
        .WORD   107614$
        RETURN
; П/п обработки Esc Граф-D
116274$:ADD     @#23176,PC     ; Установлен режим отмены ?
        BR      116314$
        CLR     @#22554        ; Сбросить индикатор режима подчеркивания(инв.)
        EMT     52             ; Погасить надпись "ПОДЧ" ("ИНВ")
        .WORD   107605$
        BR      116334$
116314$:MOV     #<111660$-111322$>,56(R5); Установить режим подч. (336)
        INCB    @#22555        ; Установить индикатор режима подчеркивания
        EMT     52             ; Высветить надпись "ПОДЧ"
        .WORD   107623$
        RETURN
116334$:CLR     56(R5)         ; Установить нормальный режим
        TSTB    @#22554        ; Ранее был установлен режим инверсии ?
        BEQ     116356$        ; Нет
        MOV     #364,56(R5)    ; Установить режим инверсии
        BR      116372$
116356$:TSTB    @#22555        ; Ранее был установлен режим подчеркивания ?
        BEQ     116372$        ; Нет
        MOV     #340,56(R5)    ; Установить режим подчеркивания
116372$:RETURN
; П/п обработки Esc Граф-E
116374$:CALL    110762$        ; Прочесть символ
        SUB     #61,R0         ; Символ в диапазоне "1"-"4"
        BMI     116422$        ; Нет
        CMP     R0,#3
        BHI     116422$        ; Нет
        ASL     R0             ; Вызов соответствующей п/п
        CALL    @116424$(R0)
116422$:RETURN
; Адреса п/п для установки длины строки
116424$:.WORD   116434$,116450$,116460$,116460$
; П/п установки длины строки 80
116434$:MOV     #120,4(R5)     ; Установить длину строки 80
116442$:CLR     22(R5)         ; Константа начального отступа = 0
        RETURN
; П/п установки длины строки 40
116450$:MOV     #50,4(R5)      ; Установить длину строки 40
        BR      116442$
116460$:RETURN
; П/п обработки Esc Граф-F
116462$:CALL    110762$        ; Прочесть символ
        SUB     #61,R0         ; Символ в диапазоне "1"-"4"
        BMI     116524$        ; Нет
        CMP     R0,#4
        BHIS    116524$        ; Нет
116502$:MOVB    116526$(R0),@22732; Установить соответствующий формат экрана
        MOVB    116532$(R0),22744; Сохранить номер формата в ТВ
        MOVB    116536$(R0),22662; Занести новую длину строки в ТВ
116524$:RETURN
; Биты формата экрана для загрузки в регистр управления отображением
116526$:.BYTE   0,20,40,60
; Номера форматов для загрузки в ТВ
116532$:.BYTE   1,2,4,10
; Длины строк
116536$:.BYTE   120,50,24,12
116542$:RETURN
116544$:RETURN
116546$:RETURN
116550$:RETURN
; П/п обработки Esc Граф-W
116552$:ADD     @#23176,PC     ; Установлен режим отмены ?
        BR      116570$        ; Нет
        BIS     #1000,@#177054 ; Выключить сетевой таймер в канале ЦП
        RETURN
116570$:BIC     #1000,@#177054 ; Включить сетевой таймер в канале ЦП
        RETURN
; П/п обработки Esc Граф-X
116600$:MTPS    #200           ; Запретить прерывания
        MOVB    #177,@23160    ; Убрать курсор с экрана
        CALL    104026$        ; Вызов п/п ПАУЗА
        MTPS    #0             ; Разрешить прерывания
        RETURN
; П/п обработки Esc Граф-\
116624$:INC     @#7072         ; Установить индикатор вызова меню ЗАГРУЗКА
        RETURN
; П/п обработки Esc Граф-]
116632$:ADD     @#23176,PC     ; Установлен режим отмены ?
        BR      116706$        ; Нет
        JSR     R5,105400$     ; Установить пользовательский режим клавиатуры
        .WORD   107310$,11054
        CLR     @#7146         ; Сбросить индикатор системного режима
        ADD     @#22550,PC     ; Разрешена установка/снятие сигнала HALT ?
        BR      116664$        ; Да
        RETURN
116664$:BIC     #20,@#177716   ; Снять сигнал HALT в ЦП
        MOV     #70046,@#177010; Сброс ключа продолжения в области ОЗУ ЦП
        CLR     @#177014
        RETURN
116706$:JSR     R5,105346$     ; Установить системный режим клавиатуры
        .WORD   107310$,11054
        INC     @#7146         ; Установить индикатор системного режима
        ADD     @#22550,PC     ; Разрешена установка/снятие сигнала HALT ?
        BR      116732$        ; Да
        RETURN
116732$:BIS     #20,@#177716   ; Установить сигнал HALT в ЦП
        RETURN
; П/п обработки Esc Граф-^
116742$:INC     @#7100         ; Установить индикатор вызова тест-программы
        RETURN
; П/п обработки Esc Граф-_
116750$:MOV     #2,@#23176     ; Установить режим отмены
116756$:CALL    110762$        ; Прочесть символ
        CMP     R0,#33         ; Это Escape ?
        BEQ     116756$        ; Да
        ASL     R0             ; Вызов соответствующей п/п
        CALL    @13142(R0)
        CLR     @#23176        ; Сбросить режим отмены
        RETURN
; П/п установки цвета курсора, вызываемая при исп. послед. Esc TD (графика)
117004$:MOV     2(SP),R0
        BIC     #177760,R0     ; R0 = номер цвета курсора
        MOV     R0,@#7166      ; Сохр. ном. цвета кур. в пункте УСТ/цв. кур.
        MOVB    R0,@22742      ; Изменить цвет курсора
        RETURN
; П/п установки цветов символа, знакоместа и фона, вызываемая при исполнении
; последовательности Esc LI (графика)
117026$:MOV     R5,-(SP)       ; Сохранить R5
        MOV     @#23150,R5     ; R5 = адрес текущей ТВ
        MOV     4(SP),R0       ; R0 = номер цвета символа
        BMI     117052$        ; Если отрицательный - нет установки
        MOV     R0,34(R5)      ; Сохранить номер цвета в ТВ
        MOV     R0,@#7160      ; Сохр. ном. цвета симв. в пункте УСТ/цв. симв.
117052$:MOV     6(SP),R0       ; R0 = номер цвета знакоместа
        BMI     117074$        ; Если отрицательный - нет установки
        MOV     R0,@#7162      ; Сохр. ном. цвета зн. в пункте УСТ/цв. зн.
        ASL     R0
        MOV     113512$(R0),40(R5); Сохранить номер фонового цвета в ТВ
117074$:MOV     10(SP),R0      ; R0 = номер цвета фона
        BMI     117116$        ; Если отрицательный - нет установки
        MOV     R0,@#7164      ; Сохр. ном. цвета фона в пункте УСТ/цвет фона
        ASL     R0
        MOV     113512$(R0),44(R5); Сохранить номер фонового цвета в ТВ
117116$:CALL    110230$        ; Заполнить регистры кода цвета и фона
        MOV     (SP)+,R5       ; Восстановить R5
        RETURN
; П/п исполнения запроса EMT 42 (вывод символа)
117126$:CALL    117136$        ; Занести символ в буфер
        TRAP    0              ; Запуск цикла задач
        RETURN
; П/п заноса символа в буфер
117136$:MOVB    R0,@22544      ; Занести символ в буфер
        INC     @#22544        ; Корректировка указателя
        BIC     #200,@#22544
        INC     @#7064         ; Увеличить счетчик символов
        RETURN
; П/п исполнения запроса EMT 44 (вывод строки символов)
117162$:MOV     @16(SP),R1     ; R1 = адрес строки символов
        ADD     #2,16(SP)      ; Коррекция адреса возврата
; П/п исполнения запроса EMT 46 (вывод строки символов)
117174$:JSR     R5,117206$     ; Занести строку в буфер
        TRAP    0              ; Запуск цикла задач
        RETURN
; П/п заноса строки символов в буфер
117204$:MOV     (R5)+,R1       ; R1 = адрес строки символов
117206$:MOV     @#22544,R0     ; R0 = значение указателя для записи в буфер
        BR      117224$
117214$:BIC     #200,R0        ; Коррекция указателя
        INC     @#7064         ; Увеличить счетчик символов
117224$:MOVB    (R1)+,(R0)+    ; Занести очередной символ в буфер
        BNE     117214$        ; Еще не конец строки
        DEC     R0
        MOV     R0,@#22544
        RTS     R5
; П/п исполнения запроса EMT 56 (вывод в нижнюю инф. строку)
117240$:MOV     #23052,R5      ; R5 = адрес ТВ для нижней инф. строки
        BR      117260$
117246$:BR      117376$
; П/п исполнения запроса EMT 52 (вывод в верхнюю инф. строку)
117250$:ADD     @#7150,PC      ; Разрешение/запрет вывода в верхнюю строку
        MOV     #22560,R5      ; R5 = адрес ТВ для верхней инф. строки
117260$:MOV     34(R5),@#177016; Загрузка регистров кода цвета и фона
        MOV     40(R5),@#177020
        MOV     40(R5),@#177022
        MOV     @32(R5),@R5    ; Вычисление видеоадреса
        MOV     4(R5),16(R5)
        MOV     @16(SP),R1     ; R1 = адрес строки
        MOVB    (R1)+,R0       ; R0 = начальная позиция
        ADD     R0,@R5
        SUB     R0,16(R5)
        BR      117342$
117332$:MOV     R1,-(SP)
        CALL    111272$        ; Рисование символа
        MOV     (SP)+,R1
117342$:CLR     R0
        BISB    (R1)+,R0       ; R0 = очередной символ
        BNE     117332$        ; Еще не конец строки
        MOV     @#23150,R5     ; R5 = адрес текущей ТВ
        MOV     34(R5),@#177016; Восстановление регистров кода цвета и фона
        MOV     40(R5),@#177020
        MOV     40(R5),@#177022
117376$:ADD     #2,16(SP)      ; Коррекция адреса возврата
        RETURN
117406$:RETURN
117410$:RETURN
117412$:RETURN
117414$:RETURN
117416$:RETURN
117420$:RETURN
117422$:RETURN
117424$:RETURN
117426$:RETURN

; ***  ТАБЛИЦА РИСУНКОВ СИМВОЛОВ  ***

117430$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-@
117443$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-A
117456$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-B
117471$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-C
117504$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-D
117517$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-E
117532$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-F
117545$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-G
117560$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-H
117573$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-I
117606$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-J
117621$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-K
117634$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-L
117647$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-M
117662$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-N
117675$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-O
117710$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-P
117723$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-Q
117736$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-R
117751$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-S
117764$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-T
117777$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-U
120012$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-V
120025$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-W
120040$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-X
120053$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-Y
120066$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-Z
120101$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-[
120114$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-\
120127$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-]
120142$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-^
120155$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Ctrl-_
120170$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; Space
120203$:.BYTE   0,20,20,20,20,20,20,0,20,0,0                   ; !
120216$:.BYTE   0,44,44,22,0,0,0,0,0,0,0                       ; "
120231$:.BYTE   0,0,44,44,176,44,176,44,44,0,0                 ; #
120244$:.BYTE   0,0,102,74,102,102,102,74,102,0,0              ; $
120257$:.BYTE   0,0,206,106,40,20,10,304,302,0,0               ; %
120272$:.BYTE   0,30,44,44,30,24,242,102,274,0,0               ; &
120305$:.BYTE   0,60,20,10,0,0,0,0,0,0,0                       ; '
120320$:.BYTE   0,40,20,10,10,10,10,20,40,0,0                  ; (
120333$:.BYTE   0,10,20,40,40,40,40,20,10,0,0                  ; )
120346$:.BYTE   0,0,0,20,124,70,124,20,0,0,0                   ; *
120361$:.BYTE   0,0,20,20,20,376,20,20,20,0,0                  ; +
120374$:.BYTE   0,0,0,0,0,0,0,30,30,20,10                      ; ,
120407$:.BYTE   0,0,0,0,0,176,0,0,0,0,0                        ; -
120422$:.BYTE   0,0,0,0,0,0,0,30,30,0,0                        ; .
120435$:.BYTE   0,0,200,100,40,20,10,4,2,0,0                   ; /
120450$:.BYTE   0,74,102,142,122,112,106,102,74,0,0            ; 0
120463$:.BYTE   0,20,30,24,20,20,20,20,174,0,0                 ; 1
120476$:.BYTE   0,74,102,102,40,20,10,104,176,0,0              ; 2
120511$:.BYTE   0,176,40,20,70,100,100,102,74,0,0              ; 3
120524$:.BYTE   0,40,60,50,44,42,176,40,40,0,0                 ; 4
120537$:.BYTE   0,176,2,2,76,100,100,102,74,0,0                ; 5
120552$:.BYTE   0,74,102,2,76,102,102,102,74,0,0               ; 6
120565$:.BYTE   0,176,102,40,20,10,4,2,2,0,0                   ; 7
120600$:.BYTE   0,74,102,102,74,102,102,102,74,0,0             ; 8
120613$:.BYTE   0,74,102,102,102,174,100,102,74,0,0            ; 9
120626$:.BYTE   0,0,0,30,30,0,0,30,30,0,0                      ; :
120641$:.BYTE   0,0,0,30,30,0,0,30,30,20,10                    ;;
120654$:.BYTE   0,0,40,20,10,4,10,20,40,0,0                    ; <
120667$:.BYTE   0,0,0,0,176,0,176,0,0,0,0                      ; =
120702$:.BYTE   0,0,4,10,20,40,20,10,4,0,0                     ; >
120715$:.BYTE   0,70,104,100,40,20,20,0,20,0,0                 ; ?
120730$:.BYTE   0,0,74,102,200,234,222,222,154,0,0             ; @
120743$:.BYTE   0,30,44,102,102,176,102,102,102,0,0            ; A
120756$:.BYTE   0,76,102,102,76,102,102,102,76,0,0             ; B
120771$:.BYTE   0,74,102,2,2,2,2,102,74,0,0                    ; C
121004$:.BYTE   0,76,104,204,204,204,204,104,76,0,0            ; D
121017$:.BYTE   0,176,2,2,76,2,2,2,176,0,0                     ; E
121032$:.BYTE   0,176,2,2,76,2,2,2,2,0,0                       ; F
121045$:.BYTE   0,74,102,2,2,162,102,102,74,0,0                ; G
121060$:.BYTE   0,102,102,102,102,176,102,102,102,0,0          ; H
121073$:.BYTE   0,70,20,20,20,20,20,20,70,0,0                  ; I
121106$:.BYTE   0,70,20,20,20,20,20,22,14,0,0                  ; J
121121$:.BYTE   0,102,42,22,16,12,22,42,102,0,0                ; K
121134$:.BYTE   0,2,2,2,2,2,2,2,176,0,0                        ; L
121147$:.BYTE   0,202,306,252,222,202,202,202,202,0,0          ; M
121162$:.BYTE   0,102,102,106,112,122,142,102,102,0,0          ; N
121175$:.BYTE   0,74,102,102,102,102,102,102,74,0,0            ; O
121210$:.BYTE   0,76,102,102,102,76,2,2,2,0,0                  ; P
121223$:.BYTE   0,74,102,102,102,102,102,122,74,100,0          ; Q
121236$:.BYTE   0,76,102,102,102,76,22,42,102,0,0              ; R
121251$:.BYTE   0,74,102,2,74,100,100,102,74,0,0               ; S
121264$:.BYTE   0,376,20,20,20,20,20,20,20,0,0                 ; T
121277$:.BYTE   0,102,102,102,102,102,102,102,74,0,0           ; U
121312$:.BYTE   0,202,202,202,202,202,104,50,20,0,0            ; V
121325$:.BYTE   0,202,202,202,202,222,252,306,202,0,0          ; W
121340$:.BYTE   0,102,102,44,30,30,44,102,102,0,0              ; X
121353$:.BYTE   0,202,202,104,50,20,20,20,20,0,0               ; Y
121366$:.BYTE   0,176,100,40,20,10,4,2,176,0,0                 ; Z
121401$:.BYTE   0,70,10,10,10,10,10,10,70,0,0                  ; [
121414$:.BYTE   0,0,2,4,10,20,40,100,200,0,0                   ; \
121427$:.BYTE   0,70,40,40,40,40,40,40,70,0,0                  ; ]
121442$:.BYTE   0,0,0,0,176,100,100,0,0,0,0                    ; ^
121455$:.BYTE   0,0,0,0,0,0,0,0,176,0,0                        ; _
121470$:.BYTE   0,30,20,40,0,0,0,0,0,0,0                       ; `
121503$:.BYTE   0,0,0,74,100,174,102,102,274,0,0               ; a
121516$:.BYTE   0,2,2,72,106,102,102,106,72,0,0                ; b
121531$:.BYTE   0,0,0,74,102,2,2,102,74,0,0                    ; c
121544$:.BYTE   0,100,100,134,142,102,102,142,134,0,0          ; d
121557$:.BYTE   0,0,0,74,102,102,176,2,174,0,0                 ; e
121572$:.BYTE   0,60,110,10,34,10,10,10,10,0,0                 ; f
121605$:.BYTE   0,0,0,134,142,102,102,142,134,100,74           ; g
121620$:.BYTE   0,2,2,72,106,102,102,102,102,0,0               ; h
121633$:.BYTE   0,20,0,30,20,20,20,20,70,0,0                   ; i
121646$:.BYTE   0,20,0,20,20,20,20,20,20,22,14                 ; j
121661$:.BYTE   0,2,2,42,22,16,22,42,102,0,0                   ; k
121674$:.BYTE   0,30,20,20,20,20,20,20,70,0,0                  ; l
121707$:.BYTE   0,0,0,156,222,222,222,222,222,0,0              ; m
121722$:.BYTE   0,0,0,72,106,102,102,102,102,0,0               ; n
121735$:.BYTE   0,0,0,74,102,102,102,102,74,0,0                ; o
121750$:.BYTE   0,0,0,72,106,102,102,106,72,2,2                ; p
121763$:.BYTE   0,0,0,134,142,102,102,142,134,100,100          ; q
121776$:.BYTE   0,0,0,72,106,2,2,2,2,0,0                       ; r
122011$:.BYTE   0,0,0,74,2,74,100,102,74,0,0                   ; s
122024$:.BYTE   0,10,10,34,10,10,10,110,60,0,0                 ; t
122037$:.BYTE   0,0,0,102,102,102,102,142,134,0,0              ; u
122052$:.BYTE   0,0,0,202,202,202,104,50,20,0,0                ; v
122065$:.BYTE   0,0,0,202,202,202,222,222,154,0,0              ; w
122100$:.BYTE   0,0,0,102,44,30,30,44,102,0,0                  ; x
122113$:.BYTE   0,0,0,102,102,102,44,30,10,4,2                 ; y
122126$:.BYTE   0,0,0,176,40,20,10,4,176,0,0                   ; z
122141$:.BYTE   0,0,140,20,20,14,20,20,140,0,0                 ; {
122154$:.BYTE   0,0,20,20,20,20,20,20,20,0,0                   ; |
122167$:.BYTE   0,0,14,20,20,140,20,20,14,0,0                  ; }
122202$:.BYTE   0,176,0,0,0,0,0,0,0,0,0                        ; ~
122215$:.BYTE   0,176,176,176,176,176,176,176,176,0,0          ; Delete
122230$:.BYTE   0,10,34,52,10,10,10,10,10,0,0                  ; 200
122243$:.BYTE   0,10,10,10,10,10,52,34,10,0,0                  ; 201
122256$:.BYTE   0,0,0,4,2,377,2,4,0,0,0                        ; 202
122271$:.BYTE   0,0,0,40,100,377,100,40,0,0,0                  ; 203
122304$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 204
122317$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 205
122332$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 206
122345$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 207
122360$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 210
122373$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 211
122406$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 212
122421$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 213
122434$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 214
122447$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 215
122462$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 216
122475$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 217
122510$:.BYTE   0,0,0,104,50,20,50,104,0,0,0                   ; 220
122523$:.BYTE   0,0,0,20,0,174,0,20,0,0,0                      ; 221
122536$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 222
122551$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 223
122564$:.BYTE   0,100,100,100,110,104,176,4,10,0,0             ; 224
122577$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 225
122612$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 226
122625$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 227
122640$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 230
122653$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 231
122666$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 232
122701$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 233
122714$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 234
122727$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 235
122742$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 236
122755$:.BYTE   0,0,0,0,0,0,0,0,0,0,0                          ; 237
122770$:.BYTE   24,24,24,24,24,27,24,24,24,24,24               ; Граф-@
123003$:.BYTE   10,10,10,10,10,377,0,0,0,0,0                   ; Граф-A
123016$:.BYTE   24,24,24,24,24,364,24,24,24,24,24              ; Граф-B
123031$:.BYTE   0,0,0,0,0,17,10,10,10,10,10                    ; Граф-C
123044$:.BYTE   24,24,24,24,24,24,24,24,24,24,24               ; Граф-D
123057$:.BYTE   10,10,10,10,10,370,10,10,10,10,10              ; Граф-E
123072$:.BYTE   10,10,10,10,10,370,0,0,0,0,0                   ; Граф-F
123105$:.BYTE   24,24,24,24,364,4,364,24,24,24,24              ; Граф-G
123120$:.BYTE   0,0,0,0,374,4,364,24,24,24,24                  ; Граф-H
123133$:.BYTE   10,10,10,10,377,0,377,10,10,10,10              ; Граф-I
123146$:.BYTE   0,0,0,0,0,370,10,10,10,10,10                   ; Граф-J
123161$:.BYTE   0,0,0,0,0,377,10,10,10,10,10                   ; Граф-K
123174$:.BYTE   24,24,24,24,367,0,377,0,0,0,0                  ; Граф-L
123207$:.BYTE   24,24,24,24,24,377,0,0,0,0,0                   ; Граф-M
123222$:.BYTE   10,10,10,10,10,17,10,10,10,10,10               ; Граф-N
123235$:.BYTE   24,24,24,24,367,0,367,24,24,24,24              ; Граф-O
123250$:.BYTE   10,10,10,10,10,377,10,10,10,10,10              ; Граф-P
123263$:.BYTE   10,10,10,10,370,10,370,10,10,10,10             ; Граф-Q
123276$:.BYTE   24,24,24,24,24,367,24,24,24,24,24              ; Граф-R
123311$:.BYTE   0,0,0,0,0,377,24,24,24,24,24                   ; Граф-S
123324$:.BYTE   10,10,10,10,377,0,377,0,0,0,0                  ; Граф-T
123337$:.BYTE   0,0,0,0,0,377,0,0,0,0,0                        ; Граф-U
123352$:.BYTE   24,24,24,24,364,4,374,0,0,0,0                  ; Граф-V
123365$:.BYTE   10,10,10,10,10,10,10,10,10,10,10               ; Граф-W
123400$:.BYTE   0,0,0,0,377,0,377,10,10,10,10                  ; Граф-X
123413$:.BYTE   10,10,10,10,10,17,0,0,0,0,0                    ; Граф-Y
123426$:.BYTE   0,0,0,0,377,0,377,0,0,0,0                      ; Граф-Z
123441$:.BYTE   24,24,24,24,27,20,27,24,24,24,24               ; Граф-[
123454$:.BYTE   24,24,24,24,27,20,37,0,0,0,0                   ; Граф-\
123467$:.BYTE   0,0,0,0,377,0,367,24,24,24,24                  ; Граф-]
123502$:.BYTE   10,10,10,10,17,10,17,10,10,10,10               ; Граф-^
123515$:.BYTE   0,0,0,0,37,20,27,24,24,24,24                   ; Граф-_
123530$:.BYTE   0,0,0,142,222,222,236,222,142,0,0              ; ю
123543$:.BYTE   0,0,0,74,100,174,102,102,274,0,0               ; а
123556$:.BYTE   0,100,74,2,76,102,102,102,74,0,0               ; б
123571$:.BYTE   0,0,0,42,42,42,42,42,176,100,0                 ; ц
123604$:.BYTE   0,0,0,160,110,104,104,104,376,202,0            ; д
123617$:.BYTE   0,0,0,74,102,102,176,2,174,0,0                 ; е
123632$:.BYTE   0,0,0,20,174,222,222,222,174,20,20             ; ф
123645$:.BYTE   0,0,0,176,102,2,2,2,2,0,0                      ; г
123660$:.BYTE   0,0,0,102,44,30,30,44,102,0,0                  ; х
123673$:.BYTE   0,0,0,102,142,122,112,106,102,0,0              ; и
123706$:.BYTE   0,30,0,102,142,122,112,106,102,0,0             ; й
123721$:.BYTE   0,0,0,102,42,22,36,42,102,0,0                  ; к
123734$:.BYTE   0,0,0,160,110,104,104,104,102,0,0              ; л
123747$:.BYTE   0,0,0,202,306,252,222,202,202,0,0              ; м
123762$:.BYTE   0,0,0,102,102,102,176,102,102,0,0              ; н
123775$:.BYTE   0,0,0,74,102,102,102,102,74,0,0                ; о
124010$:.BYTE   0,0,0,176,102,102,102,102,102,0,0              ; п
124023$:.BYTE   0,0,0,174,102,102,174,104,102,0,0              ; я
124036$:.BYTE   0,0,0,72,106,102,102,106,72,2,2                ; р
124051$:.BYTE   0,0,0,74,102,2,2,102,74,0,0                    ; с
124064$:.BYTE   0,0,0,376,20,20,20,20,20,0,0                   ; т
124077$:.BYTE   0,0,0,102,102,102,44,30,10,4,2                 ; у
124112$:.BYTE   0,0,0,222,124,70,70,124,222,0,0                ; ж
124125$:.BYTE   0,0,0,76,102,76,102,102,76,0,0                 ; в
124140$:.BYTE   0,0,0,2,2,76,102,102,76,0,0                    ; ь
124153$:.BYTE   0,0,0,202,202,236,242,242,236,0,0              ; ы
124166$:.BYTE   0,0,0,74,100,70,100,100,74,0,0                 ; з
124201$:.BYTE   0,0,0,222,222,222,222,222,376,0,0              ; ш
124214$:.BYTE   0,0,0,76,100,100,174,100,76,0,0                ; э
124227$:.BYTE   0,0,0,222,222,222,222,222,376,200,200          ; щ
124242$:.BYTE   0,0,0,102,102,102,174,100,100,0,0              ; ч
124255$:.BYTE   0,0,0,7,5,174,204,204,174,0,0                  ; ъ
124270$:.BYTE   0,142,222,222,222,236,222,222,142,0,0          ; Ю
124303$:.BYTE   0,30,44,102,102,176,102,102,102,0,0            ; А
124316$:.BYTE   0,176,2,2,76,102,102,102,76,0,0                ; Б
124331$:.BYTE   0,102,102,102,102,102,102,102,376,200,0        ; Ц
124344$:.BYTE   0,160,110,104,104,104,104,104,376,202,0        ; Д
124357$:.BYTE   0,176,2,2,76,2,2,2,176,0,0                     ; Е
124372$:.BYTE   0,20,174,222,222,222,222,174,20,20,0           ; Ф
124405$:.BYTE   0,176,102,2,2,2,2,2,2,0,0                      ; Г
124420$:.BYTE   0,102,102,44,30,30,44,102,102,0,0              ; Х
124433$:.BYTE   0,102,102,142,122,112,106,102,102,0,0          ; И
124446$:.BYTE   30,102,102,142,122,112,106,102,102,0,0         ; Й
124461$:.BYTE   0,102,42,22,16,22,42,102,202,0,0               ; К
124474$:.BYTE   0,160,110,104,104,104,104,104,102,0,0          ; Л
124507$:.BYTE   0,202,306,252,222,202,202,202,202,0,0          ; М
124522$:.BYTE   0,102,102,102,176,102,102,102,102,0,0          ; Н
124535$:.BYTE   0,74,102,102,102,102,102,102,74,0,0            ; О
124550$:.BYTE   0,176,102,102,102,102,102,102,102,0,0          ; П
124563$:.BYTE   0,174,102,102,102,174,110,104,102,0,0          ; Я
124576$:.BYTE   0,76,102,102,102,76,2,2,2,0,0                  ; Р
124611$:.BYTE   0,74,102,2,2,2,2,102,74,0,0                    ; С
124624$:.BYTE   0,376,222,20,20,20,20,20,20,0,0                ; Т
124637$:.BYTE   0,102,102,102,102,174,100,102,74,0,0           ; У
124652$:.BYTE   0,222,222,124,70,124,222,222,222,0,0           ; Ж
124665$:.BYTE   0,76,102,102,76,102,102,102,76,0,0             ; В
124700$:.BYTE   0,2,2,2,76,102,102,102,76,0,0                  ; Ь
124713$:.BYTE   0,202,202,202,236,242,242,242,236,0,0          ; Ы
124726$:.BYTE   0,74,102,100,70,100,100,102,74,0,0             ; З
124741$:.BYTE   0,222,222,222,222,222,222,222,376,0,0          ; Ш
124754$:.BYTE   0,74,102,200,200,370,200,102,74,0,0            ; Э
124767$:.BYTE   0,222,222,222,222,222,222,222,376,200,200      ; Щ
125002$:.BYTE   0,102,102,102,102,174,100,100,100,0,0          ; Ч
125015$:.BYTE   0,7,5,4,174,204,204,204,174,0,0                ; Ъ
        .EVEN




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


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

Группа: Root Admin
Сообщений: 6 282
Регистрация: 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




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


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

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




Код

; ******************************************************
; *                                                    *
; *    ГРАФИКА ПОЛЬЗОВАТЕЛЯ, ПРИНТЕР, ПЕЧАТЬ ЭКРАНА    *
; *                                                    *
; *               Адреса 135436 - 157777               *
; *                                                    *
; ******************************************************

; ТОЧКА ВХОДА ПРИ ИСПОЛНЕНИИ ESC-ПОСЛЕДОВАТЕЛЬНОСТИ ESC %!0 (ВХОД В ГРАФИКУ)
135436$:MOV     R5,-(SP)
        MOV     SP,R5
135442$:CALL    136274$
        TST     R0
        BNE     135442$
        JMP     136056$
; П/п установки начальных значений для п/п графического режима
135456$:MOV     R5,-(SP)
        MOV     SP,R5
        MOV     22664,R0
        ASL     R0
        ASL     R0
        ADD     #2500,R0
        ADD     #-4,R0
        MOV     R0,23432
        MOV     23432,23434
        MOV     #1200,23412
        CLR     23420
        CLR     23422
        MOV     #1,R0
        MOV     23420,R1
        BIC     #177770,R1
        MOV     R1,23440
        ASH     23440,R0
        MOV     R0,23436
        MOV     23432,R0
        MOV     23422,R1
        ASL     R1
        ASL     R1
        SUB     R1,R0
        MOV     R0,23434
        MOV     @23434,R0
        MOV     23420,R1
        ASH     #-3,R1
        MOV     R1,23426
        ADD     23426,R0
        MOV     R0,23430
        CLR     23442
        CLR     23444
        CLR     23446
        CLR     23450
        CLR     23452
        CLR     23454
        CLR     23456
        CLR     23460
        CLR     23462
        JMP     136056$
; Точка входа при вызове п/п печати экрана
135704$:MOV     R0,-(SP)
        MOV     R1,-(SP)
        CALL    140326$
        MOV     (SP)+,R1
        MOV     (SP)+,R0
        RETURN
; П/п вывода символа на принтер
135722$:MOV     R5,-(SP)
        MOV     SP,R5
        BIT     #2,177101      ; Принтер в состоянии ON-LINE ?
        BEQ     136000$        ; Нет
135736$:BIT     #200,177101    ; Бит подтверждения сброшен ?
        BNE     135736$        ; Нет
        MOV     4(R5),177100   ; Послать код символа на линию данных
        BIC     #200,177102    ; Установить сигнал строба
135762$:BIT     #200,177101    ; Получен сигнал подтверждения ?
        BEQ     135762$        ; Нет
        MOV     #200,177102    ; Сбросить сигнал строба
136000$:JMP     136056$
; П/п инициализации параллельного порта
136004$:MOV     R5,-(SP)
        MOV     SP,R5
        MOV     #174,177103
        MOV     #200,177102
        JMP     136056$

136030$:MOV     R5,R0
        MOV     SP,R5
        MOV     R4,-(SP)
        MOV     R3,-(SP)
        MOV     R2,-(SP)
        CLR     -(SP)
        JMP     @R0
136046$:MOV     R5,R2
        MOV     -(R2),R4
        MOV     -(R2),R3
        MOV     -(R2),R2
136056$:MOV     R5,SP
        MOV     (SP)+,R5
        RETURN
; Блок описания Esc-последовательностей графического режима
136064$:.WORD   136414$,111,0,136502$  ; LI
136074$:.WORD   136622$,126,136602$,120; MV, MP
        .WORD   136562$,115,136542$,114; MM, ML
        .WORD   0,136642$
136120$:.WORD   137054$,125,136706$,122; RU,RR
        .WORD   136700$,104,0,137064$  ; RD
136140$:.WORD   137122$,104,0,137164$  ; TD
136150$:.WORD   140140$,111,137722$,110; UI, UH
        .WORD   137620$,107,137442$,106; UG, UF
        .WORD   137432$,105,137424$,104; UE, UD
        .WORD   137412$,103,137334$,102; UC, UB
        .WORD   137222$,101,0,140174$  ; UA
136220$:.WORD   140232$,41,0,140302$   ; %!
136230$:.WORD   140202$,45,137172$,125 ; %*, U*
        .WORD   137072$,124,136650$,122; T*, R*
        .WORD   136512$,115,136364$,114; M*, L*
        .WORD   0,140310$
136264$:.WORD   136334$,33,0,140316$   ; Esc

136274$:JSR     R5,136030$
        ADD     #-6,SP
        CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136264$,R1
        JMP     144650$
; П/п обработки символа Esc
136334$:CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136230$,R1
        JMP     144650$
; П/п обработки Esc L
136364$:CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136064$,R1
        JMP     144650$
; П/п обработки Esc LI
136414$:CALL    143756$
        MOV     23424,23456
        CALL    143756$
        MOV     23424,23460
        CALL    143756$
        MOV     23424,23462
        MOV     23462,@SP
        MOV     23460,-(SP)
        MOV     23456,-(SP)
        CALL    117026$
        CMP     (SP)+,(SP)+
        MOVB    #1,R0
        BR      136506$
136502$:MOVB    #1,R0
136506$:JMP     136046$
; П/п обработки Esc M
136512$:CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136074$,R1
        JMP     144650$
; П/п обработки Esc ML
136542$:CALL    143756$
        MOV     23424,23442
        MOVB    #1,R0
        BR      136506$
; П/п обработки Esc MM
136562$:CALL    143756$
        MOV     23424,23446
        MOVB    #1,R0
        BR      136506$
; П/п обработки Esc MP
136602$:CALL    143756$
        MOV     23424,23450
        MOVB    #1,R0
        BR      136506$
; П/п обработки Esc MV
136622$:CALL    143756$
        MOV     23424,23444
        MOVB    #1,R0
        BR      136506$
136642$:MOVB    #1,R0
        BR      136506$
; П/п обработки Esc R
136650$:CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136120$,R1
        JMP     144650$
; П/п обработки Esc RD
136700$:MOVB    #1,R0
        BR      136506$
; П/п обработки Esc RR
136706$:CALL    144104$
        CMP     23420,23412
        BGE     136732$
        CMP     23422,22664
        BLT     136740$
136732$:MOVB    #1,R0
        BR      136506$
136740$:MOV     23420,-12(R5)
        MOV     23422,-14(R5)
        CALL    144104$
        CMP     23420,23412
        BGE     137000$
        CMP     23422,22664
        BLT     137006$
137000$:MOVB    #1,R0
        BR      136506$
137006$:CALL    143756$
        MOV     23424,@SP
        MOV     23422,-(SP)
        MOV     23420,-(SP)
        MOV     -14(R5),-(SP)
        MOV     -12(R5),-(SP)
        CALL    144666$
        ADD     #10,SP
        MOVB    #1,R0
        BR      137060$
; П/п обработки Esc RU
137054$:MOVB    #1,R0
137060$:JMP     136046$
137064$:MOVB    #1,R0
        BR      137060$
; П/п обработки Esc T
137072$:CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136140$,R1
        JMP     144650$
; П/п обработки Esc TD
137122$:CALL    143756$
        MOV     23424,23452
        CALL    143756$
        MOV     23424,23454
        MOV     23452,@SP
        CALL    117004$
        MOVB    #1,R0
        BR      137060$
137164$:MOVB    #1,R0
        BR      137060$
; П/п обработки Esc U
137172$:CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136150$,R1
        JMP     144650$
; П/п обработки Esc UA
137222$:MOV     23430,177010
        TST     177024
        BNE     137236$
137236$:BIT     #4,23440
        BEQ     137254$
        MOV     177022,R0
        BR      137260$
137254$:MOV     177020,R0
137260$:MOV     R0,R1
        CLR     R0
        MOV     23440,R4
        BIC     #177774,R4
        ASL     R4
        ASL     R4
        NEG     R4
        ASHC    R4,R0
        MOV     R1,@SP
        BIC     #177760,@SP
        CALL    144304$
        MOV     #15,@SP
        CALL    145612$
        MOVB    #1,R0
        BR      137060$
; П/п обработки Esc UB
137334$:MOV     23414,23420
        MOV     23416,23422
        MOV     23422,23414
        MOV     23420,23416
        CALL    151714$
        MOV     23420,23414
        MOV     23422,23416
        MOVB    #1,R0
        BR      137060$
; П/п обработки Esc UC
137412$:CALL    151650$
        MOVB    #1,R0
        BR      137060$
; П/п обработки Esc UD
137424$:MOVB    #1,R0
        BR      137436$
; П/п обработки Esc UE
137432$:MOVB    #1,R0
137436$:JMP     136046$
; П/п обработки Esc UF
137442$:CALL    144104$
        CMP     23420,23412
        BGE     137466$
        CMP     23422,22664
        BLT     137474$
137466$:MOVB    #1,R0
        BR      137436$
137474$:MOV     #1,R0
        MOV     23420,R1
        BIC     #177770,R1
        MOV     R1,23440
        ASH     23440,R0
        MOV     R0,23436
        MOV     23432,R0
        MOV     23422,R1
        ASL     R1
        ASL     R1
        SUB     R1,R0
        MOV     R0,23434
        MOV     @23434,R0
        MOV     23420,R1
        ASH     #-3,R1
        MOV     R1,23426
        ADD     23426,R0
        MOV     R0,23430
        MOV     23420,23414
        MOV     23422,23416
        MOVB    #1,R0
        BR      137436$
; П/п обработки Esc UG
137620$:CALL    144104$
        CMP     23420,23412
        BGE     137644$
        CMP     23422,22664
        BLT     137652$
137644$:MOVB    #1,R0
        BR      137436$
137652$:MOV     23442,177016
        MOV     23430,177010
        TST     177024
        BNE     137674$
137674$:MOV     23430,177010
        MOV     23436,177024
        CALL    141330$
        MOVB    #1,R0
        BR      137436$
; П/п обработки Esc UH
137722$:CALL    144104$
        CMP     23420,23412
        BGE     137746$
        CMP     23422,22664
        BLT     137754$
137746$:MOVB    #1,R0
        BR      140134$
137754$:MOV     #1,R0
        MOV     23420,R1
        BIC     #177770,R1
        MOV     R1,23440
        ASH     23440,R0
        MOV     R0,23436
        MOV     23432,R0
        MOV     23422,R1
        ASL     R1
        ASL     R1
        SUB     R1,R0
        MOV     R0,23434
        MOV     @23434,R0
        MOV     23420,R1
        ASH     #-3,R1
        MOV     R1,23426
        ADD     23426,R0
        MOV     R0,23430
        MOV     23420,23414
        MOV     23422,23416
        MOV     23442,177016
        MOV     23430,177010
        TST     177024
        BNE     140114$
140114$:MOV     23430,177010
        MOV     23436,177024
        MOVB    #1,R0
140134$:JMP     136046$
; П/п обработки Esc UI
140140$:MOV     23416,@SP
        MOV     23414,-(SP)
        CALL    144454$
        TST     (SP)+
        MOV     #15,@SP
        CALL    145612$
        MOVB    #1,R0
        BR      140134$
140174$:MOVB    #1,R0
        BR      140134$
; П/п обработки Esc %
140202$:CALL    145564$
        MOVB    R0,-7(R5)
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     #136220$,R1
        JMP     144650$
; П/п обработки Esc %!
140232$:CALL    145564$
        MOVB    R0,-7(R5)
        CMPB    -7(R5),#'0
        BEQ     140274$
        MOVB    -7(R5),R0
        BIC     #177400,R0
        MOV     R0,@SP
        CALL    113574$
        CLR     R0
        BR      140134$
140274$:MOVB    #1,R0
        BR      140134$
140302$:MOVB    #1,R0
        BR      140134$
140310$:MOVB    #1,R0
        BR      140134$
140316$:MOVB    #1,R0
        BR      140134$
140324$:BR      140134$
; П/п печати экрана
140326$:JSR     R5,136030$
        ADD     #-22,SP
        BIT     #2,177101
        BEQ     140602$
        BIC     #100,177700
        MOV     #15,@SP
        CALL    135722$
        MOV     #12,@SP
        CALL    135722$
        CLR     -10(R5)
140400$:CMP     -10(R5),#79.
        BGT     140552$
        MOV     #1,-20(R5)
140416$:CMP     -20(R5),#2
        BGT     140606$
        MOV     #33,@SP
        CALL    135722$
        MOV     #52,@SP
        CALL    135722$
        MOV     #1,@SP
        CALL    135722$
        MOV     #30,@SP
        CALL    135722$
        MOV     #3,@SP
        CALL    135722$
        CLR     -12(R5)
140502$:CMP     -12(R5),#263.
        BGT     140622$
        MOV     23432,R0
        MOV     -12(R5),R1
        ASL     R1
        ASL     R1
        SUB     R1,R0
        MOV     @R0,R0
        ADD     -10(R5),R0
        MOV     R0,177010
        TST     177024
        BEQ     141004$
        BR      141004$
140552$:MOV     #33,@SP
        CALL    135722$
        MOV     #100,@SP
        CALL    135722$
        MOV     #14,@SP
        CALL    135722$
140602$:JMP     136046$
140606$:INC     -10(R5)
        BR      140400$
140614$:INC     -20(R5)
        BR      140416$
140622$:MOV     #33,@SP
        CALL    135722$
        MOV     #63,@SP
        CALL    135722$
        MOV     -20(R5),R1
        MUL     #22.,R1
        MOV     R1,@SP
        ADD     #-21.,@SP
        CALL    135722$
        MOV     #12,@SP
        CALL    135722$
        MOV     #15,@SP
        CALL    135722$
        BIT     #200,177700
        BEQ     140614$
        CMP     177702,#4
        BNE     140614$
        MOV     #33,@SP
        CALL    135722$
        MOV     #100,@SP
        CALL    135722$
        MOV     #15,@SP
        CALL    135722$
        MOV     #12,@SP
        CALL    135722$
        MTPS    #340
        BIS     #100,177700
        MTPS    #0
        BR      140602$
141004$:MOV     177020,-30(R5)
        MOV     #1,-14(R5)
141020$:CMP     -14(R5),#8.
        BGT     141246$
        MOV     -30(R5),R0
        BIC     #177760,R0
        MOV     R0,-16(R5)
        MOV     -22(R5),R0
        ASL     R0
        MOV     #153540,R1
        MOV     #1,R4
        MOV     -16(R5),R2
        ASL     R2
        SUB     R2,R4
        SUB     -20(R5),R4
        ASH     R4,R1
        BIC     #177776,R1
        BIS     R1,R0
        MOV     R0,-22(R5)
        MOV     -24(R5),R0
        ASL     R0
        MOV     #177624,R1
        MOV     #1,R4
        MOV     -16(R5),R2
        ASL     R2
        SUB     R2,R4
        SUB     -20(R5),R4
        ASH     R4,R1
        BIC     #177776,R1
        BIS     R1,R0
        MOV     R0,-24(R5)
        MOV     -26(R5),R0
        ASL     R0
        MOV     #172100,R1
        MOV     #1,R4
        MOV     -16(R5),R2
        ASL     R2
        SUB     R2,R4
        SUB     -20(R5),R4
        ASH     R4,R1
        BIC     #177776,R1
        BIS     R1,R0
        MOV     R0,-26(R5)
        CMP     -14(R5),#4
        BNE     141306$
        MOV     177022,-30(R5)
        BR      141322$
141246$:MOV     -22(R5),@SP
        CALL    135722$
        MOV     -24(R5),@SP
        CALL    135722$
        MOV     -26(R5),@SP
        CALL    135722$
        INC     -12(R5)
        JMP     140502$
141306$:MOV     -30(R5),R0
        ASH     #-4,R0
        MOV     R0,-30(R5)
141322$:INC     -14(R5)
        BR      141020$
; П/п рисования линии
141330$:MOV     R5,-(SP)
        MOV     SP,R5
        ADD     #-20,SP
        MOV     23420,R0
        SUB     23414,R0
        MOV     R0,-12(R5)
        MOV     23422,R0
        SUB     23416,R0
        MOV     R0,-14(R5)
        TST     -14(R5)
        BNE     141404$
        TST     -12(R5)
        BEQ     141560$
141404$:MOV     23420,23414
        MOV     23422,23416
        CLR     -16(R5)
        TST     -14(R5)
        BLT     141564$
        TST     -12(R5)
        BLT     141712$
        CMP     -12(R5),-14(R5)
        BGT     141454$
        JMP     142106$
141454$:MOV     -12(R5),-20(R5)
        MOV     -20(R5),-10(R5)
141470$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BEQ     141560$
        SUB     -14(R5),-16(R5)
        MOV     23436,R0
        ASL     R0
        BIC     #177400,R0
        MOV     R0,23436
        BEQ     141536$
        JMP     142260$
141536$:MOV     #1,23436
        INC     23430
        INC     23426
        JMP     142260$
141560$:JMP     136056$
141564$:TST     -12(R5)
        BLT     141576$
        JMP     142722$
141576$:CMP     -12(R5),-14(R5)
        BLT     141612$
        JMP     143136$
141612$:MOV     -12(R5),R0
        NEG     R0
        MOV     R0,-20(R5)
        MOV     -20(R5),-10(R5)
141632$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BEQ     141560$
        ADD     -14(R5),-16(R5)
        CLC
        ROR     23436
        BEQ     141670$
        JMP     143310$
141670$:MOV     #200,23436
        DEC     23430
        DEC     23426
        JMP     143310$
141712$:MOV     -12(R5),R0
        NEG     R0
        CMP     R0,-14(R5)
        BLT     141732$
141726$:JMP     142442$
141732$:MOV     -14(R5),-20(R5)
        MOV     -20(R5),-10(R5)
141746$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BEQ     141560$
        ADD     -12(R5),-16(R5)
        SUB     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        TST     -16(R5)
        BGE     142030$
        MOV     -16(R5),R0
        NEG     R0
        BR      142034$
142030$:MOV     -16(R5),R0
142034$:ASL     R0
        CMP     R0,-20(R5)
        BGE     142050$
        JMP     142540$
142050$:CLC
        ROR     23436
        BEQ     142064$
        JMP     142556$
142064$:MOV     #200,23436
        DEC     23430
        DEC     23426
        JMP     142556$
142106$:MOV     -14(R5),-20(R5)
        MOV     -20(R5),-10(R5)
142122$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BEQ     141560$
        ADD     -12(R5),-16(R5)
        SUB     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        TST     -16(R5)
        BGE     142204$
        MOV     -16(R5),R0
        NEG     R0
        BR      142210$
142204$:MOV     -16(R5),R0
142210$:ASL     R0
        CMP     R0,-20(R5)
        BLT     142376$
        MOV     23436,R0
        ASL     R0
        BIC     #177400,R0
        MOV     R0,23436
        BNE     142414$
        MOV     #1,23436
        INC     23430
        INC     23426
        BR      142414$
142260$:TST     -16(R5)
        BGE     142276$
        MOV     -16(R5),R0
        NEG     R0
        BR      142302$
142276$:MOV     -16(R5),R0
142302$:ASL     R0
        CMP     R0,-20(R5)
        BLT     142342$
        SUB     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        ADD     -12(R5),-16(R5)
142342$:MOV     23430,177010
        TST     177024
        BNE     142356$
142356$:MOV     23430,177010
        MOV     23436,177024
        JMP     141470$
142376$:MOV     23430,177010
        TST     177024
        BEQ     142424$
        BR      142424$
142414$:SUB     -14(R5),-16(R5)
        BR      142376$
142424$:MOV     23430,177010
        MOV     23436,177024
        BR      142122$
142442$:MOV     -12(R5),R0
        NEG     R0
        MOV     R0,-20(R5)
        MOV     -20(R5),-10(R5)
142462$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BNE     142502$
        JMP     141560$
142502$:ADD     -14(R5),-16(R5)
        CLC
        ROR     23436
        BNE     142606$
        MOV     #200,23436
        DEC     23430
        DEC     23426
        BR      142606$
142540$:MOV     23430,177010
        TST     177024
        BEQ     142566$
        BR      142566$
142556$:ADD     -14(R5),-16(R5)
        BR      142540$
142566$:MOV     23430,177010
        MOV     23436,177024
        JMP     141746$
142606$:TST     -16(R5)
        BGE     142624$
        MOV     -16(R5),R0
        NEG     R0
        BR      142630$
142624$:MOV     -16(R5),R0
142630$:ASL     R0
        CMP     R0,-20(R5)
        BLT     142670$
        SUB     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        ADD     -12(R5),-16(R5)
142670$:MOV     23430,177010
        TST     177024
        BNE     142704$
142704$:MOV     23430,177010
        MOV     23436,177024
        BR      142462$
142722$:MOV     -14(R5),R0
        NEG     R0
        CMP     -12(R5),R0
        BLE     142742$
        JMP     143472$
142742$:MOV     -14(R5),R0
        NEG     R0
        MOV     R0,-20(R5)
        MOV     -20(R5),-10(R5)
142762$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BNE     143002$
        JMP     141560$
143002$:SUB     -12(R5),-16(R5)
        ADD     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        TST     -16(R5)
        BGE     143050$
        MOV     -16(R5),R0
        NEG     R0
        BR      143054$
143050$:MOV     -16(R5),R0
143054$:ASL     R0
        CMP     R0,-20(R5)
        BGE     143070$
        JMP     143574$
143070$:MOV     23436,R0
        ASL     R0
        BIC     #177400,R0
        MOV     R0,23436
        BEQ     143114$
        JMP     143612$
143114$:MOV     #1,23436
        INC     23430
        INC     23426
        JMP     143612$
143136$:MOV     -14(R5),R0
        NEG     R0
        MOV     R0,-20(R5)
        MOV     -20(R5),-10(R5)
143156$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BNE     143176$
        JMP     141560$
143176$:SUB     -12(R5),-16(R5)
        ADD     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        TST     -16(R5)
        BGE     143244$
        MOV     -16(R5),R0
        NEG     R0
        BR      143250$
143244$:MOV     -16(R5),R0
143250$:ASL     R0
        CMP     R0,-20(R5)
        BLT     143426$
        CLC
        ROR     23436
        BNE     143444$
        MOV     #200,23436
        DEC     23430
        DEC     23426
        BR      143444$
143310$:TST     -16(R5)
        BGE     143326$
        MOV     -16(R5),R0
        NEG     R0
        BR      143332$
143326$:MOV     -16(R5),R0
143332$:ASL     R0
        CMP     R0,-20(R5)
        BLT     143372$
        ADD     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        SUB     -12(R5),-16(R5)
143372$:MOV     23430,177010
        TST     177024
        BNE     143406$
143406$:MOV     23430,177010
        MOV     23436,177024
        JMP     141632$
143426$:MOV     23430,177010
        TST     177024
        BEQ     143454$
        BR      143454$
143444$:ADD     -14(R5),-16(R5)
        BR      143426$
143454$:MOV     23430,177010
        MOV     23436,177024
        BR      143156$
143472$:MOV     -12(R5),-20(R5)
        MOV     -20(R5),-10(R5)
143506$:MOV     -10(R5),R0
        DEC     -10(R5)
        TST     R0
        BNE     143526$
        JMP     141560$
143526$:SUB     -14(R5),-16(R5)
        MOV     23436,R0
        ASL     R0
        BIC     #177400,R0
        MOV     R0,23436
        BNE     143642$
        MOV     #1,23436
        INC     23430
        INC     23426
        BR      143642$
143574$:MOV     23430,177010
        TST     177024
        BEQ     143622$
        BR      143622$
143612$:SUB     -14(R5),-16(R5)
        BR      143574$
143622$:MOV     23430,177010
        MOV     23436,177024
        JMP     142762$
143642$:TST     -16(R5)
        BGE     143660$
        MOV     -16(R5),R0
        NEG     R0
        BR      143664$
143660$:MOV     -16(R5),R0
143664$:ASL     R0
        CMP     R0,-20(R5)
        BLT     143724$
        ADD     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        SUB     -12(R5),-16(R5)
143724$:MOV     23430,177010
        TST     177024
        BNE     143740$
143740$:MOV     23430,177010
        MOV     23436,177024
        BR      143506$
; П/п приема трех символов и перевода их в целое число
143756$:MOV     R5,-(SP)
        MOV     SP,R5
        ADD     #-10,SP
        CALL    145564$
        ASH     #6,R0
        MOV     R0,23424
        CALL    145564$
        BIC     #177700,R0
        BIS     23424,R0
        ASH     #4,R0
        MOV     R0,23424
        CALL    145564$
        MOV     R0,-10(R5)
        MOV     -10(R5),R0
        BIC     #177760,R0
        BIS     23424,R0
        MOV     R0,23424
        BIT     #20,-10(R5)
        BNE     144100$
        MOV     23424,R0
        NEG     R0
        MOV     R0,23424
144100$:JMP     136056$
; П/п приема пяти символов и перевода их в два целых числа
144104$:MOV     R5,-(SP)
        MOV     SP,R5
        ADD     #-10,SP
        CALL    145564$
        BIC     #177740,R0
        ASH     #5,R0
        MOV     R0,23422
        CALL    145564$
        MOV     R0,-10(R5)
        CALL    145564$
        BIC     #177740,R0
        BIS     23422,R0
        ASL     R0
        ASL     R0
        MOV     R0,23422
        CALL    145564$
        BIC     #177740,R0
        ASH     #5,R0
        MOV     R0,23420
        CALL    145564$
        BIC     #177740,R0
        BIS     23420,R0
        ASL     R0
        ASL     R0
        MOV     R0,23420
        MOV     -10(R5),R0
        ASR     R0
        ASR     R0
        BIC     #177774,R0
        BIS     23422,R0
        MOV     R0,23422
        MOV     -10(R5),R0
        BIC     #177774,R0
        BIS     23420,R0
        MOV     R0,23420
        JMP     136056$
; П/п преобразования целого числа в три символа и их вывод
144304$:MOV     R5,-(SP)
        MOV     SP,R5
        ADD     #-12,SP
        TST     4(R5)
        BGE     144342$
        MOV     4(R5),R0
        NEG     R0
        MOV     R0,4(R5)
        CLR     -10(R5)
        BR      144350$
144342$:MOV     #20,-10(R5)
144350$:MOV     4(R5),R0
        ASH     #-12,R0
        MOV     R0,@SP
        BIC     #177700,@SP
        BIS     #100,@SP
        CALL    145612$
        MOV     4(R5),R0
        ASH     #-4,R0
        MOV     R0,@SP
        BIC     #177700,@SP
        BIS     #100,@SP
        CALL    145612$
        MOV     4(R5),@SP
        BIC     #177760,@SP
        BIS     -10(R5),@SP
        BIS     #40,@SP
        CALL    145612$
        JMP     136056$
; П/п преобразования двух целых чисел в пять символов и их вывод
144454$:MOV     R5,-(SP)
        MOV     SP,R5
        TST     -(SP)
        MOV     6(R5),R0
        ASH     #-7,R0
        MOV     R0,@SP
        BIC     #177740,@SP
        BIS     #40,@SP
        CALL    145612$
        MOV     4(R5),@SP
        BIC     #177774,@SP
        MOV     6(R5),R0
        BIC     #177774,R0
        ASL     R0
        ASL     R0
        BIS     R0,@SP
        BIS     #140,@SP
        CALL    145612$
        MOV     6(R5),@SP
        ASR     @SP
        ASR     @SP
        BIC     #177740,@SP
        BIS     #140,@SP
        CALL    145612$
        MOV     4(R5),R0
        ASH     #-7,R0
        MOV     R0,@SP
        BIC     #177740,@SP
        BIS     #40,@SP
        CALL    145612$
        MOV     4(R5),@SP
        ASR     @SP
        ASR     @SP
        BIC     #177740,@SP
        BIS     #100,@SP
        CALL    145612$
        JMP     136056$

144650$:TST     (R1)+
        BEQ     144664$
        CMP     R0,(R1)+
        BNE     144650$
        JMP     @-4(R1)
144664$:JMP     @(R1)+
; П/п закраски прямоугольной области
144666$:MOV     R5,-(SP)
        MOV     SP,R5
        ADD     #-22,SP
        MOV     #1,R0
        MOV     10(R5),R1
        BIC     #177770,R1
        MOV     R1,23440
        ASH     23440,R0
        MOV     R0,23436
        MOV     23432,R0
        MOV     12(R5),R1
        ASL     R1
        ASL     R1
        SUB     R1,R0
        MOV     R0,23434
        MOV     @23434,R0
        MOV     10(R5),R1
        ASH     #-3,R1
        MOV     R1,23426
        ADD     23426,R0
        MOV     R0,23430
        MOV     23426,-14(R5)
        MOV     23434,-22(R5)
        MOV     #100000,R0
        MOV     23440,R1
        ADD     #-16,R1
        ASH     R1,R0
        COM     R0
        MOV     R0,-12(R5)
        MOV     #1,R0
        MOV     4(R5),R1
        BIC     #177770,R1
        MOV     R1,23440
        ASH     23440,R0
        MOV     R0,23436
        MOV     23432,R0
        MOV     6(R5),R1
        ASL     R1
        ASL     R1
        SUB     R1,R0
        MOV     R0,23434
        MOV     @23434,R0
        MOV     4(R5),R1
        ASH     #-3,R1
        MOV     R1,23426
        ADD     23426,R0
        MOV     R0,23430
        MOV     #100000,R0
        MOV     23440,R1
        ADD     #-17,R1
        ASH     R1,R0
        MOV     R0,-10(R5)
        MOV     -14(R5),R0
        SUB     23426,R0
        MOV     R0,-20(R5)
        MOV     23430,R0
        ADD     -20(R5),R0
        MOV     R0,-16(R5)
        TST     -20(R5)
        BNE     145234$
        MOV     -12(R5),R0
        COM     R0
        BIC     R0,-10(R5)
145234$:MOV     14(R5),177016
145242$:CMP     23434,-22(R5)
        BLO     145270$
        MOV     23430,177010
        TST     177024
        BEQ     145376$
        BR      145376$
145270$:MOV     #1,R0
        MOV     23414,R1
        BIC     #177770,R1
        MOV     R1,23440
        ASH     23440,R0
        MOV     R0,23436
        MOV     23432,R0
        MOV     23416,R1
        ASL     R1
        ASL     R1
        SUB     R1,R0
        MOV     R0,23434
        MOV     @23434,R0
        MOV     23414,R1
        ASH     #-3,R1
        MOV     R1,23426
        ADD     23426,R0
        MOV     R0,23430
        JMP     136056$
145376$:MOV     23430,177010
        MOV     -10(R5),177024
        TST     -20(R5)
        BEQ     145452$
145420$:INC     23430
        CMP     23430,-16(R5)
        BHIS    145512$
        MOV     23430,177010
        TST     177024
        BEQ     145530$
        BR      145530$
145452$:SUB     #4,23434
        MOV     @23434,R0
        ADD     23426,R0
        MOV     R0,23430
        MOV     23430,R0
        ADD     -20(R5),R0
        MOV     R0,-16(R5)
        BR      145242$
145512$:MOV     23430,177010
        TST     177024
        BEQ     145546$
        BR      145546$
145530$:MOV     23430,177010
        MOV     #377,177024
        BR      145420$
145546$:MOV     23430,177010
        MOV     -12(R5),177024
        BR      145452$
; П/п приема символа
145564$:MOV     R5,-(SP)
        MOV     R4,-(SP)
        MOV     R3,-(SP)
        MOV     R2,-(SP)
        CALL    110762$
        MOV     (SP)+,R2
        MOV     (SP)+,R3
        MOV     (SP)+,R4
        MOV     (SP)+,R5
        RETURN
; П/п вывода символа
145612$:MOV     2(SP),R0
        CALL    104160$
        RETURN
; Все остальные п/п относятся к обработке последовательностей Esc UB и Esc UC
145624$:MOV     SP,23602
        CALL    152144$
        BHIS    145642$
        JMP     145716$
145642$:CALL    151000$
        BLO     145732$
145650$:MOV     #23540,R1
        CMP     2(R1),#23546
        BEQ     145732$
        CALL    145734$
        BLO     145676$
        CALL    146010$
145676$:MOV     #23546,R1
        CALL    145762$
        BLO     145650$
        CALL    146104$
        BR      145650$
145716$:MOV     23602,SP
        MOV     #1,R0
        BR      145732$
        CLR     R0
145732$:RETURN
145734$:MOV     2(R1),R1
        TST     @R1
        BEQ     145756$
        MOV     6(R1),23564
        BEQ     145734$
        BR      145760$
145756$:SEC
145760$:RETURN
145762$:MOV     4(R1),R1
        TST     @R1
        BEQ     146004$
        MOV     10(R1),23564
        BEQ     145762$
        BR      146006$
146004$:SEC
146006$:RETURN
146010$:MOV     0(R1),23560
        MOV     #1,23572
        MOV     23474,23574
        INC     23574
        MOV     #0,23576
        MOV     #2,23600
        MOV     #-2,23606
        MOV     #2,23610
        MOV     R1,23554
        ADD     #2,R1
        CALL    146200$
        RETURN
146104$:MOV     0(R1),23560
        MOV     #-1,23572
        MOV     #0,23574
        MOV     23474,23576
        INC     23576
        MOV     #-2,23600
        MOV     #-4,23606
        MOV     #4,23610
        MOV     R1,23554
        ADD     #4,R1
        CALL    146200$
        RETURN
146200$:MOV     23564,R2
        MOV     23566,R3
        MOV     23502,R5
146214$:MOV     (R2)+,(R3)+
        SOB     R5,146214$
        MOV     20(R1),23616
        MOV     10(R1),23620
        MOV     14(R1),23562
        MOV     23570,R0
        MOV     23502,R5
146252$:CLR     (R0)+
        SOB     R5,146252$
        MOV     10(R1),R5
        MOV     20(R1),R0
        SUB     R0,R5
        ASR     R5
        INC     R5
        MOV     23570,R2
        ADD     R0,R2
        ADD     23562,R0
        MOV     R2,-(SP)
        MOV     R0,-(SP)
146312$:CALL    147760$
        BIS     R4,(R2)+
        ADD     #2,R0
        SOB     R5,146312$
        MOV     10(R1),R5
        ADD     23564,R5
        MOV     @R5,R5
        CALL    150136$
        BIT     #100000,R5
        BEQ     146412$
        MOV     23476,R5
        SUB     10(R1),R5
        ASR     R5
        DEC     R5
        BEQ     146412$
146370$:CALL    147760$
        BIS     R4,(R2)+
        CMP     #-1,R4
        BNE     146412$
        ADD     #2,R0
        SOB     R5,146370$
146412$:MOV     (SP)+,R0
        MOV     (SP)+,R2
        MOV     @R2,R4
        MOV     20(R1),R5
        ADD     23564,R5
        MOV     @R5,R5
        CALL    150136$
        BIT     #1,R5
        BEQ     146476$
        MOV     20(R1),R5
        BEQ     146476$
        ASR     R5
146454$:SUB     #2,R0
        CALL    147760$
        BIS     R4,-(R2)
        CMP     #-1,R4
        BNE     146476$
        SOB     R5,146454$
146476$:MOV     #23604,R5
        CALL    150246$
        MOV     23604,R0
        MOV     23570,R3
        MOV     20(R1),R2
        ADD     R2,R0
        ADD     R2,R3
        ADD     23564,R2
        MOV     10(R1),R5
        SUB     20(R1),R5
        ASR     R5
        INC     R5
        MOV     R5,-(SP)
        BR      146556$
146552$:BIS     #1,@R2
146556$:MOV     R5,-(SP)
        MOV     (R2)+,R5
        MOV     (R3)+,R4
        CALL    150136$
        BIS     R5,(R0)+
        MOV     (SP)+,R5
        BIT     #100000,R4
        BNE     146606$
        SOB     R5,146556$
        BR      146674$
146606$:SOB     R5,146552$
        MOV     R0,-(SP)
        MOV     R2,-(SP)
        MOV     R3,-(SP)
        MOV     23476,R5
        SUB     10(R1),R5
        ASR     R5
        DEC     R5
        BEQ     146666$
146634$:MOV     R5,-(SP)
        BIS     #1,@R2
        MOV     (R2)+,R5
        MOV     (R3)+,R4
        CALL    150136$
        BIS     R5,(R0)+
        MOV     (SP)+,R5
        BIT     #100000,R4
        BEQ     146666$
        SOB     R5,146634$
146666$:MOV     (SP)+,R3
        MOV     (SP)+,R2
        MOV     (SP)+,R0
146674$:MOV     (SP)+,R5
        BR      146706$
146700$:BIS     #100000,-2(R2)
146706$:MOV     R5,-(SP)
        MOV     -(R2),R5
        MOV     -(R3),R4
        CALL    150136$
        BIS     R5,-(R0)
        MOV     (SP)+,R5
        BIT     #1,R4
        BNE     146736$
        SOB     R5,146706$
        BR      147002$
146736$:SOB     R5,146700$
        TST     20(R1)
        BEQ     147002$
        MOV     @R0,R4
146750$:BIT     #1,R4
        BEQ     147002$
        BIS     #100000,-(R2)
        MOV     @R2,R5
        MOV     -(R3),R4
        CALL    150136$
        BIS     R5,-(R0)
        CMP     R0,23604
        BHI     146750$
147002$:MOV     23604,R0
        MOV     23570,R3
        MOV     23502,R5
147016$:MOV     (R0)+,(R3)+
        SOB     R5,147016$
        MOV     23604,R5
        CALL    150470$
        BHIS    147050$
        MOV     23536,@R5
        MOV     R5,23536
        JMP     147644$
147050$:CALL    150716$
        MOV     23560,R3
        ADD     23572,R3
        CMP     R3,23574
        BEQ     147426$
        CALL    147732$
        CALL    150576$
        MOV     R4,23556
        ADD     23610,R4
        MOV     23636,14(R4)
        ADD     23630,14(R4)
        MOV     4(R4),R3
        BNE     147160$
        MOV     23604,4(R4)
        MOV     23612,20(R4)
        MOV     23614,10(R4)
        BR      147240$
147160$:MOV     23502,R5
        MOV     23604,R0
147170$:BIS     (R0)+,(R3)+
        SOB     R5,147170$
        CMP     23612,20(R4)
        BGE     147212$
        MOV     23612,20(R4)
147212$:CMP     23614,10(R4)
        BLE     147230$
        MOV     23614,10(R4)
147230$:MOV     23604,R5
        CALL    150300$
147240$:MOV     R4,-(SP)
        MOV     R1,-(SP)
        MOV     23612,-(SP)
        MOV     23614,-(SP)
        MOV     R4,R1
        ADD     23600,R1
        MOV     4(R1),R2
        BEQ     147412$
        MOV     4(R4),R3
        MOV     23502,R5
        MOV     R2,-(SP)
        MOV     R3,-(SP)
147304$:MOV     @R2,R0
        BIC     @R3,(R2)+
        BIC     R0,(R3)+
        SOB     R5,147304$
        MOV     (SP)+,R3
        MOV     (SP)+,R2
        MOV     23556,23640
        MOV     R2,R5
        CALL    150470$
        BCC     147344$
        CALL    150332$
        BR      147360$
147344$:MOV     23612,20(R1)
        MOV     23614,10(R1)
147360$:MOV     R3,R5
        CALL    150470$
        BCC     147376$
        CALL    150332$
        BR      147412$
147376$:MOV     23612,20(R4)
        MOV     23614,10(R4)
147412$:MOV     (SP)+,23614
        MOV     (SP)+,23612
        MOV     (SP)+,R1
        MOV     (SP)+,R4
147426$:SUB     23572,23560
        CMP     23560,23576
        BEQ     147644$
        MOV     23566,R0
        MOV     23570,R3
        MOV     23502,R5
147460$:BIC     (R0)+,(R3)+
        SOB     R5,147460$
        MOV     23570,R5
        CALL    150470$
        BCS     147644$
        MOV     23560,R3
        CALL    147732$
        CALL    150576$
        ADD     23610,R4
        ADD     23600,R4
        MOV     23636,14(R4)
        MOV     4(R4),R3
        BNE     147554$
        MOV     R4,R5
        ADD     #4,R5
        CALL    150246$
        MOV     4(R4),R3
147554$:MOV     23614,R5
        SUB     23612,R5
        ASR     R5
        INC     R5
        MOV     23570,R2
        ADD     23612,R2
        ADD     23612,R3
147604$:BIS     (R2)+,(R3)+
        SOB     R5,147604$
        CMP     23612,20(R4)
        BGE     147626$
        MOV     23612,20(R4)
147626$:CMP     23614,10(R4)
        BLE     147644$
        MOV     23614,10(R4)
147644$:MOV     R1,R5
        MOV     23554,23640
        CALL    150332$
        RETURN
147662$:MOV     (SP)+,23642
        MOV     R1,-(SP)
        MOV     R2,-(SP)
        MOV     R3,-(SP)
        MOV     R4,-(SP)
        MOV     R5,-(SP)
        MOV     23642,-(SP)
        RETURN
147706$:MOV     (SP)+,23642
        MOV     (SP)+,R5
        MOV     (SP)+,R4
        MOV     (SP)+,R3
        MOV     (SP)+,R2
        MOV     (SP)+,R1
        MOV     23642,-(SP)
        RETURN
147732$:MOV     R3,-(SP)
        DEC     R3
        NEG     R3
        ASL     R3
        ASL     R3
        ADD     23504,R3
        MOV     @R3,23636
        MOV     (SP)+,R3
        RETURN
147760$:MOV     R3,-(SP)
        MOV     R5,-(SP)
        CLR     R4
        DEC     R4
        MOV     R0,177010
        MOVB    177012,R5
        MOV     23464,R3
        XOR     R3,R5
        BICB    R5,R4
        MOVB    177014,R5
        MOV     23466,R3
        XOR     R3,R5
        BICB    R5,R4
        MOVB    177015,R5
        MOV     23470,R3
        XOR     R3,R5
        BICB    R5,R4
        INC     R0
        SWAB    R4
        MOV     R0,177010
        MOVB    177012,R5
        MOV     23464,R3
        XOR     R3,R5
        BICB    R5,R4
        MOVB    177014,R5
        MOV     23466,R3
        XOR     R3,R5
        BICB    R5,R4
        MOVB    177015,R5
        MOV     23470,R3
        XOR     R3,R5
        BICB    R5,R4
        SWAB    R4
        TST     23634
        BNE     150126$
        COM     R4
150126$:DEC     R0
        MOV     (SP)+,R5
        MOV     (SP)+,R3
        RETURN
150136$:TST     R5
        BEQ     150234$
        COM     R4
        BEQ     150240$
        BIC     R4,R5
        BEQ     150234$
        MOV     R0,-(SP)
        MOV     R1,-(SP)
        MOV     R4,-(SP)
        COM     R4
        CLR     R0
150164$:MOV     R4,R1
        DEC     R1
        XOR     R4,R1
        BIS     R1,R4
        MOV     R4,R1
        INC     R1
        XOR     R4,R1
        BLT     150210$
        CLC
        ROR     R1
150210$:BIC     R0,R1
        BIS     R1,R0
        BIT     R1,R5
        BEQ     150222$
        BIS     R1,R5
150222$:BIC     R0,R4
        BNE     150164$
        BIC     (SP)+,R5
        MOV     (SP)+,R1
        MOV     (SP)+,R0
150234$:MOV     R5,R4
        RETURN
150240$:COM     R4
        MOV     R4,R5
        RETURN
150246$:MOV     23536,@R5
        BNE     150260$
        JMP     145716$
150260$:MOV     @23536,23536
        MOV     R5,-(SP)
        MOV     @R5,R5
        CLR     @R5
        MOV     (SP)+,R5
        RETURN
150300$:MOV     R3,-(SP)
        MOV     23476,R3
        ADD     R3,R5
        ASR     R3
150312$:CLR     -(R5)
        SOB     R3,150312$
        MOV     23536,@R5
        MOV     R5,23536
        MOV     (SP)+,R3
        RETURN
150332$:MOV     R5,-(SP)
        MOV     4(R5),R4
        BEQ     150372$
        MOV     R5,-(SP)
        MOV     R4,R5
        CALL    150300$
        MOV     (SP)+,R5
        CLR     4(R5)
        MOV     #10000,20(R5)
        CLR     10(R5)
150372$:MOV     23640,R5
        TST     6(R5)
        BNE     150464$
        TST     10(R5)
        BNE     150464$
        MOV     R2,-(SP)
        MOV     R3,-(SP)
        MOV     2(R5),R2
        MOV     4(R5),R3
        MOV     R3,4(R2)
        MOV     R2,2(R3)
        CLR     2(R5)
        CLR     4(R5)
        MOV     (SP)+,R3
        MOV     (SP)+,R2
        MOV     23506,0(R5)
        MOV     R5,23506
150464$:MOV     (SP)+,R5
        RETURN
150470$:MOV     R5,-(SP)
        MOV     R2,-(SP)
        MOV     R3,-(SP)
        MOV     R5,R2
        MOV     23502,R3
150504$:TST     (R2)+
        BNE     150524$
        SOB     R3,150504$
        MOV     (SP)+,R3
        MOV     (SP)+,R2
        MOV     (SP)+,R5
        SEC
        RETURN
150524$:SUB     #2,R2
        MOV     R2,23612
        MOV     23476,R3
        ADD     R3,R5
        ASR     R3
150544$:TST     -(R5)
        BNE     150552$
        SOB     R3,150544$
150552$:MOV     R5,23614
        MOV     (SP)+,R3
        MOV     (SP)+,R2
        MOV     (SP)+,R5
        SUB     R5,23612
        SUB     R5,23614
        RETURN
150576$:MOV     R2,-(SP)
        MOV     R3,-(SP)
        MOV     R5,-(SP)
        MOV     #23540,R4
150610$:MOV     2(R4),R5
        TST     @R5
        BEQ     150634$
        CMP     0(R5),R3
        BGT     150634$
        BEQ     150704$
        MOV     R5,R4
        BR      150610$
150634$:MOV     23506,R2
        BNE     150646$
        JMP     145716$
150646$:MOV     @R2,23506
        MOV     R3,0(R2)
        MOV     2(R4),2(R2)
        MOV     R2,2(R4)
        MOV     4(R5),4(R2)
        MOV     R2,4(R5)
        MOV     R2,R5
150704$:MOV     R5,R4
        MOV     (SP)+,R5
        MOV     (SP)+,R3
        MOV     (SP)+,R2
        RETURN
150716$:MOV     R2,-(SP)
        MOV     R3,-(SP)
        MOV     R5,-(SP)
        MOV     23612,R2
        MOV     23614,R5
        SUB     R2,R5
        ADD     #2,R5
        MOV     R2,R3
        ADD     23604,R3
        ADD     14(R1),R2
150754$:MOV     R2,177010
        MOVB    (R3)+,177024
        INC     R2
        SOB     R5,150754$
        MOV     (SP)+,R5
        MOV     (SP)+,R3
        MOV     (SP)+,R2
        RETURN
151000$:MOV     23652,R3
        CALL    150576$
        MOV     R4,23624
        MOV     #23604,R5
        CALL    150246$
        MOV     23604,6(R4)
        MOV     R3,0(R4)
        MOV     R3,23626
        MOV     23654,R0
        DEC     R0
        MOV     R0,R1
        MOV     #3,R3
151056$:CLC
        ROR     R1
        SOB     R3,151056$
        BIC     #1,R1
        MOV     R1,22(R4)
        MOV     R1,12(R4)
        ADD     R1,23604
        MOV     0(R4),R3
        CALL    147732$
        MOV     23636,16(R4)
        MOV     23636,23562
        MOV     #1,R2
        BIC     #177760,R0
        BEQ     151150$
151142$:CLC
        ROL     R2
        SOB     R0,151142$
151150$:MOV     R2,@23604
        MOV     R2,23622
        CALL    151166$
        RETURN
151166$:MOV     SP,23656
        MOV     23624,R1
        MOV     22(R1),R0
        MOV     R0,23616
        MOV     R0,23620
        MOV     6(R1),R2
        ADD     R0,R2
        ADD     23562,R0
        MOV     R0,-(SP)
        MOV     R2,-(SP)
        MOV     R3,-(SP)
        CALL    147760$
        TST     R4
        BNE     151246$
        JMP     151640$
151246$:MOV     23622,R5
        CALL    150136$
        TST     R4
        BNE     151266$
        JMP     151640$
151266$:MOV     R4,(R2)+
        ADD     #2,R0
        BIT     #100000,R4
        BEQ     151374$
        MOV     23476,R5
        SUB     23616,R5
        ASR     R5
        DEC     R5
        BEQ     151374$
151320$:CALL    147760$
        CMP     R4,#-1
        BNE     151352$
        MOV     R4,(R2)+
        ADD     #2,R0
        ADD     #2,23620
        SOB     R5,151320$
        BR      151374$
151352$:MOV     #1,R5
        CALL    150136$
        MOV     R4,(R2)+
        BEQ     151374$
        ADD     #2,23620
151374$:MOV     (SP)+,R3
        MOV     (SP)+,R2
        MOV     (SP)+,R0
        BIT     #1,@R2
        BEQ     151474$
        MOV     23616,R5
        ASR     R5
        BEQ     151474$
151420$:SUB     #2,R0
        CALL    147760$
        CMP     R4,#-1
        BNE     151452$
        MOV     R4,-(R2)
151440$:SUB     #2,23616
        SOB     R5,151420$
        BR      151474$
151452$:MOV     #100000,R5
        CALL    150136$
        MOV     R4,-(R2)
        BEQ     151474$
        SUB     #2,23616
151474$:MOV     23616,22(R1)
        MOV     23620,12(R1)
        MOV     0(R1),R3
        DEC     R3
        BLE     151634$
        CALL    147732$
        CALL    150576$
        MOV     R3,0(R4)
        MOV     #23564,R5
        CALL    150246$
        MOV     12(R1),R5
        SUB     22(R1),R5
        ASR     R5
        INC     R5
        MOV     6(R1),R2
        MOV     23564,R3
        ADD     22(R1),R2
        ADD     22(R1),R3
151600$:MOV     (R2)+,(R3)+
        SOB     R5,151600$
        MOV     22(R1),24(R4)
        MOV     12(R1),14(R4)
        MOV     23564,10(R4)
        MOV     23636,20(R4)
151634$:CLC
        BR      151646$
151640$:MOV     23656,SP
        SEC
151646$:RETURN
151650$:CALL    147662$
        CALL    151756$
        MOV     #-1,23634
        CALL    145624$
        MOV     23646,R1
        MOV     23644,R0
        CALL    176300$
        CALL    147706$
        RETURN
151714$:CALL    147662$
        CALL    151756$
        CLR     23634
        CALL    145624$
        MOV     23646,R1
        MOV     23644,R0
        CALL    176300$
        CALL    147706$
        RETURN
151756$:MOV     23414,23652
        INC     23652
        MOV     23416,23654
        INC     23654
        MOV     23442,R1
        CLR     23464
        ROR     R1
        SBC     23464
        CLR     23466
        ROR     R1
        SBC     23466
        CLR     23470
        ROR     R1
        SBC     23470
        MOV     23450,R1
        NEG     R1
        MOVB    R1,177016
        MOV     23432,23504
        MOV     22664,23474
        MOV     23412,23500
        BIC     #17,23500
        MOV     23500,23476
        ASR     23476
        ASR     23476
        ASR     23476
        MOV     23476,23502
        ASR     23502
        RETURN
152144$:MOV     #5322,R0
        CALL    176132$
        MOV     R0,23644
        MOV     R1,23646
        MOV     23644,R1
        ASR     R1
        SUB     23476,R1
        BLE     152456$
        MOV     23502,R2
        ADD     #13,R2
        CLR     R3
        BR      152216$
152214$:INC     R3
152216$:SUB     R2,R1
        BGT     152214$
        TST     R3
        BEQ     152456$
        CMP     R3,#31
        BLE     152240$
        MOV     #27,R3
152240$:MOV     R3,23650
        MOV     23646,R1
        INC     R1
        BIC     #1,R1
        MOV     23502,R2
        MOV     R1,23566
152266$:CLR     (R1)+
        SOB     R2,152266$
        MOV     R1,23570
        MOV     23502,R2
152302$:CLR     (R1)+
        SOB     R2,152302$
        MOV     R1,-(SP)
        MOV     #23510,R2
        MOV     R2,R1
        MOV     R2,23506
        MOV     #11,R3
152326$:CLR     (R1)+
        SOB     R3,152326$
        MOV     #10000,(R1)+
        MOV     #10000,(R1)+
        MOV     (SP)+,R1
        MOV     23650,R5
        DEC     R5
        BEQ     152402$
152354$:MOV     R1,@R2
        MOV     R1,R2
        MOV     #11,R3
152364$:CLR     (R1)+
        SOB     R3,152364$
        MOV     #10000,(R1)+
        MOV     #10000,(R1)+
        SOB     R5,152354$
152402$:MOV     #23536,R2
        MOV     23650,R5
152412$:MOV     R1,@R2
        MOV     R1,R2
        MOV     23502,R3
152422$:CLR     (R1)+
        SOB     R3,152422$
        SOB     R5,152412$
        MOV     #23540,R1
        CLR     (R1)+
        MOV     #23546,(R1)+
        CLR     (R1)+
        CLR     (R1)+
        CLR     (R1)+
        MOV     #23540,@R1
        BR      152460$
152456$:SEC
152460$:RETURN




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


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

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



Код

; *****************************************************************
; *                                                               *
; * ПРОГРАММА  НАЧАЛЬНОГО  ЗАПУСКА  СИСТЕМЫ,  ПУЛЬТОВЫЙ  МОНИТОР, *
; *   ЗАГРУЗЧИКИ, ТЕСТОВЫЕ ПОДПРОГРАММЫ, ОБРАБОТЧИКИ ПРЕРЫВАНИЙ   *
; *                                                               *
; *                     Адреса 160000 - 176673                    *
; *                                                               *
; *****************************************************************

; *****************************************************************
; *                                                               *
; * Системные команды, выполняемые только в режиме HALT           *
; *                                                               *
; *   Мнемоника      Код     Выполняемое действие                 *
; *                                                               *
; *   $MFPC$          22     Копия счетчика команд --> R0         *
; *   $MFPS$          24     Копия слова состояния --> R0         *
; *   $MTPC$          32     R0 --> Копия счетчика команд         *
; *   $MTPS$          34     R0 --> Копия слова состояния         *
; *   $MFPM$          21     (R5)+ --> R0 (режим USER)            *
; *   $MTPM$          31     R0 --> -(R5) (режим USER)            *
; *   $STEP$          16     Копия счетчика команд --> PC         *
; *                          Копия слова состояния --> PS         *
; *                          Запуск по значению PC с маскировкой  *
; *                          всех прерываний на один шаг          *
; *   $RUN$           12     Копия счетчика команд --> PC         *
; *                          Копия слова состояния --> PS         *
; *                          Запуск по значению PC                *
; *****************************************************************

        $MFPC$  = 22
        $MFPS$  = 24
        $MTPC$  = 32
        $MTPS$  = 34
        $MFPM$  = 21
        $MTPM$  = 31
        $STEP$  = 16
        $RUN$   = 12

        .=160000

160000$:.WORD   160300$,200    ; Вектор прерывания по включению питания
160004$:.WORD   160230$,600    ; Вектор прерывания по зависанию (HALT)
160010$:.WORD   165612$,600    ; Вектор прерывания по инструкции FIS
; Адреса подпрограмм обработки прерываний EMT 14 - EMT 24
160014$:.WORD   173502$,160270$,103564$,104132$,104132$
; "Пустые" адреса
160026$:.REPT   5
        .WORD   160270$
        .ENDR
; Адреса подпрограмм обработки прерываний EMT 40 - EMT 76
160040$:.WORD   107754$,117126$,117162$,117174$
        .WORD   117406$,117250$,117410$,117240$
        .WORD   117412$,117414$,117416$,117420$
        .WORD   117422$,160270$,117424$,117426$
; "Пустые" адреса
160100$:.REPT   30
        .WORD   160270$
        .ENDR
; Адреса подпрограмм обработки прерываний TRAP 0 - TRAP 6
160160$:.WORD   174254$,175516$,175664$,160270$
160170$:.WORD   160240$,600    ; Вектор прерывания по команде HALT
160174$:.WORD   160250$,600    ; Вектор прерывания по двойному зависанию
; Точка входа обработчика прерывания 4
160200$:MOV     #163627$,@172662$
        BR      160266$
; Точка входа обработчика прерывания 10
160210$:MOV     #163641$,@172662$
        BR      160614$
; Точка входа обработчика прерывания 24
160220$:MOV     #163657$,@172662$
        BR      160614$
; Точка входа обработчика прерывания 160004
160230$:MOV     #163627$,@172662$
        BR      160574$
; Точка входа обработчика прерывания 160170
160240$:MOV     #163731$,@172662$
        BR      160614$
; Точка входа обработчика прерывания 160174
160250$:MOV     #163707$,@172662$
        BR      160614$
; Точка входа обработчика прерывания 160274
160260$:MOV     #163736$,@172662$
160266$:BR      160614$
160270$:RETURN
160272$:.WORD   161236$        ; Адрес п/п снятия режима HALT (для ЦП)
160274$:.WORD   160260$,600    ; Вектор прерывания по зависанию при приеме АВП
; Точка входа при включении питания (адрес начального пуска)
160300$:MOV     @#172660$,R4   ; R4 = адрес ОЗУ пультового отладчика
        CLR     R0             ; Признак ошибок = 0
        MOV     R4,SP
        BMI     160464$        ; Запуск в ЦП
        BIT     #20,@#177716   ; ЦП в режиме HALT ?
        BEQ     160332$        ; Нет
        MOV     @#0,R0
        BEQ     160332$
        JMP     @R0
160332$:MOV     #40,@#177716   ; Останов ЦП (установка DCLO и ACLO)
        CALL    173252$        ; Перекачка пультового монитора в сист. ОЗУ ЦП
        MOV     #70045,@#177010; Передача ключа теста памяти (делать или нет)
        MOV     42(R4),@#177014
        CLR     @#177716       ; Снятие DCLO
        MOV     #100,R0
160370$:SOB     R0,160370$     ; Задержка
        MOV     #100000,@#177716; Запуск ЦП (снятие ACLO)
        CALL    160410$        ; Тест ПЗУ ПП
        SWAB    R0
        BR      160474$        ; Переход на тест ОЗУ
; Подпрограмма теста ПЗУ ПП
160410$:MOV     #4,R5          ; R5 = число банков ПЗУ
        MOV     #176776,R1     ; R1 = конечный адрес ПЗУ
        MOV     #7377,R2       ; R2 = число слов последнего банка ПЗУ
        CLR     R0             ; Очистка признака ошибок
160426$:ASL     R0             ; Освободить правый бит
        CLR     R3
160432$:ADD     -(R1),R3       ; Вычисление контрольной суммы
        ADC     R3
        SOB     R2,160432$
        ASL     R5
        CMP     <176770$-2>(R5),R3     ; Сравнение с записанной в ПЗУ
        BEQ     160452$        ; Совпадает
        INC     R0             ; Установить правый бит
160452$:ASR     R5
        MOV     #10000,R2      ; R2 = число слов в 1,2 и 3 банках ПЗУ
        SOB     R5,160426$
        RETURN
160464$:CMP     42(R4),#125252 ; Производить тест ОЗУ
        BEQ     160534$        ; Нет
160474$:CLR     R1             ; R1 = начальный адрес
        MOV     @#172674$,R2   ; R2 = объем ОЗУ в словах
160502$:MOV     R1,@R1         ; Занести в ячейку ее адрес
        CMP     R1,@R1         ; Сравнить
        BNE     160530$        ; Ошибка
        COM     @R1            ; Инвертировать содержимое ячейки
        MOV     @R1,R3         ; R3 = содержимое ячейки
        COM     R3
        CMP     R1,R3          ; Содежимое R3 равно адресу
        BNE     160530$        ; Нет (ошибка)
        CLR     (R1)+          ; Очистить ячейку
        SOB     R2,160502$
        BR      160534$
160530$:BIS     #2,R0          ; Установить признак ошибки ОЗУ
160534$:MOV     R4,R1          ; R1 = адрес ОЗУ пультового отладчика
        MOV     #50,R2         ; R2 = объем ОЗУ пультового отладчика
160542$:CLR     (R1)+          ; Цикл очистки
        SOB     R2,160542$
        MOV     @#172672$,14(R4); Начальное значение указателя стека
        MOV     #200,20(R4)    ; Начальное значение слова состояния
        MOV     #125252,42(R4) ; Ключ пропуска теста ОЗУ
        JMP     172676$
160574$:BR      160744$
; Точка перехода из режима УСТАНОВКА при нажатии УПР-@ (пультовый монитор ПП)
160576$:MOV     #600,-(SP)     ; Записать в стек слово состояния
        MOV     #160744$,-(SP) ; Записать в стек адрес начала пульт. отл.
        CLR     @172662$       ; Адрес выводимой надписи = 0
        RTI                    ; Переход в пультовый отладчик
; Точка входа при обработке системных прерываний (адрес векторов 160***)
160614$:CLR     @172664$       ; Адрес открытой ячейки = 0
        MOV     R0,@172660$    ; Сохранить содержимое R0
        MOV     @#172660$,R0   ; R0 = адрес буфера сохранения
        TST     (R0)+
        MOV     R1,(R0)+       ; Сохранить содержимое других регистров
        MOV     R2,(R0)+
        MOV     R3,(R0)+
        MOV     R4,(R0)+
        MOV     R5,(R0)+
        MOV     SP,(R0)+
        MOV     R0,R1
        $MFPC$                 ; Прочесть КРСК
        MOV     R0,(R1)+       ; Сохранить содержимое PC
        MOV     R0,R3          ; R3 = PC
        $MFPS$                 ; Прочесть КРСП
        MOV     R0,(R1)+       ; Сохранить содержимое PS
        MOV     @#172660,R1
        MOV     R1,R4          ; R4 = начальный адрес ОЗУ пультового отладчика
        ADD     34(R4),PC      ; Режим STEP/RUN ?
        BR      160744$        ; STEP
160676$:MOV     #4,R2          ; R2 = число точек останова
        SUB     #2,R3          ; R3 = предполагаемый адрес останова
160706$:MOV     50(R1),R5      ; R5 = адрес точки останова
        BEQ     160736$        ; Отсутствует
        MOV     60(R1),R0      ; R0 = значение яч. памяти по адресу останова
        ADD     #2,R5
        $MTPM$                 ; Запись значения в ОЗУ
        CMP     R3,R5          ; Текущий адрес останова = точке останова ?
        BNE     160736$        ; Нет
        MOV     R3,16(R4)      ; PC = подкоррект. адрес останова
160736$:ADD     #2,R1          ; Переход к следующей точке останова
        SOB     R2,160706$
160744$:MOV     @#172660$,R4   ; R4 = начальный адрес ОЗУ пультового отладчика
        MOV     R4,SP
        BMI     160762$        ; Исполнение в ЦП
        MOV     #2,@#22550     ; Запрет перевода ЦП в режим HALT при Esc Гр-]
160762$:MOV     #70,26(R4)     ; Установка указателя на начало буфера
        ADD     R4,26(R4)
        MTPS    @#172670$      ; Установка ССП
        JSR     R4,163006$     ; Установка системного режима клавиатуры
        .WORD   163476$
        TST     R4             ; Программа исполняется под упр. ПП ?
        BPL     161030$        ; Да
        MOV     36(R4),R0      ; R0 = выход в меню загрузки/монитор
        MOV     #2,36(R4)      ; Установка выхода в монитор
        ADD     R0,PC
        BR      161160$        ; Переход на вывод меню загрузки
161030$:CALL    163316$        ; Вывод причины останова, адр. ячейки и ее сод.
161034$:MOV     R4,SP
        JSR     R4,163006$     ; Вывод промптера /@ /
        .WORD   163510$
161044$:CALL    162602$        ; Набор восьм. значения и запрос ком. клавиши
        BIC     #240,R0        ; Привести к верхнему регистру
        BNE     161062$        ; Нажат не <Пробел>
        JMP     161606$        ; Нажат <Пробел>
161062$:CMPB    R0,#3          ; Нажата комбинация УПР-C
        BEQ     161206$
        CMP     R0,#14         ; Нажат <СБРОС>
        BEQ     161300$
        CMP     R0,#15         ; Нажат <Enter>
        BEQ     161034$
        CMP     R0,#33         ; Код <Escape>
        BEQ     161306$
        CMP     R0,#'R         ; R (переключение на регистры)
        BEQ     161320$
        CMP     R0,#'A         ; A (переключение на точки останова)
        BEQ     161330$
        CMP     R0,#'M         ; M (выход в меню)
        BEQ     161160$
        CMP     R0,#'T         ; T (тест сетевого адаптера)
        BEQ     161154$
        CMP     R0,#'D         ; D (переход в автономный режим)
        BNE     161034$
161150$:JMP     161530$
161154$:JMP     162460$
; Обработка вызова меню загрузки (M)
161160$:JSR     R4,163006$     ; Вызов меню загрузки
        .WORD   163505$
        CALL    172614$        ; Прочесть данные из канала 0 (номер пункта)
        MOV     R0,R1          ; R1 = номер выбранного пункта * 2
        CALL    172614$        ; Прочесть данные из канала 0 (номер уст-ва)
        CALL    @162350$(R1)   ; Вызов соответствующей п/п
        BR      161160$
; Обработка выхода из пультового отладчика (УПР-C)
161206$:TST     R4             ; Пультовый монитор работает под упр. ПП ?
        BMI     161034$        ; Нет
        CLR     @#22550
        MTPS    #600
        MOV     @#7144,SP      ; Восстановить стек режима УСТАНОВКА
        CLR     R0
        $MTPS$                 ; PS = 0
        $MTPC$                 ; PC = 0
        $RUN$                  ; Запуск по адресу 0(там RETURN, возврат в УСТ)
; П/п снятия в ЦП сигнала HALT
161236$:MOV     R0,-(SP)
        MOV     R1,-(SP)
        MOV     R4,-(SP)
        MOV     @#172660$,R4   ; R4 = начальный адрес ОЗУ пультового отладчика
        INC     44(R4)         ; Установить ключ продолжения
        JSR     R4,163006$     ; Снять сигнал HALT в ЦП
        .WORD   163501$
161262$:TST     44(R4)         ; Ключ продолжения сброшен ?
        BNE     161262$        ; Нет
        MOV     (SP)+,R4
        MOV     (SP)+,R1
        MOV     (SP)+,R0
        RETURN
; Обработка команды очистки экрана (<СБРОС>) (R0 = 14)
161300$:CALL    172632$        ; Вывод символа УПР-L
        BR      161034$
; Обработка клавиш с префиксом Esc
161306$:CALL    162756$        ; Прочесть очер. код клавиши с его коррекцией
        CALL    @161556$(R0)   ; Вызвать соответствующую п/п
        BR      161044$
; Обработка команды переключения на регистры (R)
161320$:MOV     #10*400+'R,32(R4); Режим работы (10(8) регистров)
        BR      161336$
; Обработка команды переключения на точки останова (A)
161330$:MOV     #4*400+'A,32(R4); Режим работы (4 точки останова)
161336$:CALL    163370$        ; Перевод курсора на новую строку
        MOVB    32(R4),R0      ; R0 = 'A' или 'R'
        CALL    172632$        ; Вывод символа
161352$:CALL    172614$        ; Ввод символа с клавиатуры
        MOV     R0,R3
        SUB     #60,R3         ; R3 в диапазоне '0' -- '7'
        BMI     161402$        ; Нет
        CMPB    R3,#7
        BLOS    161410$        ; В диапазоне
        CMP     R0,#'S         ; Нажата 'S' ?
        BEQ     161470$        ; Да
161402$:CALL    163142$        ; Вывод всех регистров или точек останова
        BR      161034$
161410$:BICB    33(R4),R0
        CALL    172632$        ; Вывод номера регистра или точки останова
161420$:CALL    163234$        ; Вывод '=' и содержимого регистра
161424$:JSR     R4,163006$     ; Вывод двух пробелов
        .WORD   163560$
        CALL    162604$        ; Ввод восьм. числа и запрос ком. клавиши
        CMP     R0,#33         ; Ком. клавиша имеет префикс Esc ?
        BNE     161512$        ; Нет
        CALL    162756$        ; Прочесть постфикс ком. клавиши и подкорр. его
        SUB     #2,R0
        BMI     161524$        ; Нажата клавиша <ПОМ>
        CALL    163264$        ; Получение адреса буфера
        CALL    @162222$(R0)   ; Вызов соответствующей п/п
        BR      161424$
161470$:CMPB    32(R4),#'R     ; Работа производится с регистрами ?
        BNE     161352$        ; Нет
        CALL    172632$        ; Вывод символа 'S' (R0 = 'S')
        MOV     #10,R3         ; R3 = номер регистра (PS)
        BR      161420$
161512$:CMP     R0,#40         ; Нажат <Пробел> ?
        BNE     161524$        ; Нет
        JMP     161606$        ; Да
161524$:JMP     161062$
; Обработка команды перехода в автономный режим (D)
161530$:MOV     #14,R0         ; R0 = Ctrl+L (очистка экрана)
161534$:CALL    172632$        ; Вывести символ на экран
        CALL    172614$        ; Ввести символ с клавиатуры
        CMP     R0,#3          ; Нажата комбинация УПР+C ?
        BNE     161534$        ; Нет
        JMP     161034$        ; Переход в пультовый монитор
; Адреса п/п обработки клавиш с префиксом Esc (ПОМ,ИСП,Вверх,Вниз,Влево,
; Вправо,НР+Вверх,НР+Вниз,НР+Влево,НР+Вправо,?,?)
161556$:.WORD   162572$,161612$,161762$,161770$
        .WORD   161772$,162026$,162132$,162040$
        .WORD   162132$,162046$,162164$,162204$
; Обработка команды "шаг" (<Пробел>)
161606$:CLR     R3             ; R3 = режим STEP
        BR      161616$
; Обработка команды "пуск" (<ИСП>)
161612$:MOV     #2,R3          ; R3 = режим RUN
161616$:MTPS    #600
        MOV     20(R4),R0      ; R0 = PS
        $MTPS$                 ; Запись КРСП
        TST     R2             ; Было набрано значение ?
        BEQ     161640$        ; Нет
        MOV     R1,16(R4)      ; Сохранить набранное значение
161640$:MOV     16(R4),R0      ; R0 = PC
        $MTPC$                 ; Запись КРСК
        MOV     R3,34(R4)      ; Сохранение режима STEP/RUN
        BEQ     161724$        ; Режим STEP
        MOV     R4,R1          ; R1 = начальный адрес ОЗУ пультового отладчика
        MOV     #4,R2          ; R2 = число точек останова
161662$:MOV     50(R1),R5      ; R5 = адрес точки останова
        BEQ     161712$        ; Точка останова не используется
        $MFPM$                 ; Чтение содерж. памяти по адресу останова
        MOV     R0,60(R1)      ; Сохранение его в буфере
        CMP     16(R4),50(R1)  ; Адрес останова равен адресу запуска ?
        BEQ     161712$        ; Да
        CLR     R0             ; R0 = код команды HALT
        $MTPM$                 ; Запись его в память по адресу останова
161712$:ADD     #2,R1          ; Переход к следующей точке останова
        SOB     R2,161662$
        CALL    161236$        ; Снятие в ЦП сигнала HALT
161724$:MOV     R4,SP          ; SP = начальный адрес ОЗУ пультового отладчика
        BMI     161734$        ; Пультовый отладчик работает под управл. ЦП
        CLR     @#22550
161734$:MOV     (SP)+,R0       ; Восстановление регистров
        MOV     (SP)+,R1
        MOV     (SP)+,R2
        MOV     (SP)+,R3
        MOV     (SP)+,R4
        MOV     (SP)+,R5
        MOV     (SP)+,SP
        ADD     @172666$,PC    ; Режим STEP/RUN
        $STEP$
        $RUN$
; Обработка команды "открыть предыдущую ячейку" (Вверх)
161762$:MOV     #-2,R3
        BR      161772$
; Обработка команды "открыть следующую ячейку" (Вниз)
161770$:TST     (R3)+          ; R3 = 2
; Обработка команды "занести значение" (Влево)
161772$:TST     R2             ; Значение было введено ?
        BEQ     162014$        ; Нет
        MOV     R1,R0          ; R0 = введенное число
        MOV     22(R4),R5      ; R5 = адрес открытой ячейки
        ADD     #2,R5
        CALL    163444$        ; Занести значение в память
162014$:ADD     R3,22(R4)      ; Переход к другой ячейке
162020$:CALL    163024$        ; Прочитать ее содерж. и вывести на экран
        RETURN
; Обработка команды "открыть ячейку" (Вправо)
162026$:TST     R2             ; Значение было введено ?
        BEQ     162020$        ; Нет
        MOV     R1,22(R4)      ; Изменить адрес открытой ячейки
        BR      162020$
; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз)
162040$:MOV     #2,R3          ; R3 = признак относительного адреса
        BR      162050$
; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо)
162046$:CLR     R3             ; R3 = признак абсолютного адреса
162050$:TST     R2             ; Значение было введено ?
        BEQ     162062$        ; Нет
        MOV     R1,@26(R4)     ; Сохр. введ. знач. в качестве адреса возврата
        BR      162070$
162062$:MOV     22(R4),@26(R4) ; Сохр. в кач. адреса возв. адрес откр. ячейки
162070$:ADD     #2,26(R4)      ; Передвинуть указатель буфера сохранения
        BIC     #20,26(R4)
        MOV     24(R4),R0      ; R0 = содержимое открытой ячейки
        TST     R3             ; Режим относительного адреса ?
        BNE     162122$        ; Да
        MOV     R0,22(R4)      ; Адрес = содерж. открытой ячейки (абс. адр.)
        BR      162020$
162122$:ADD     R3,R0
        ADD     R0,22(R4)      ; Адрес += содерж. откр. яч + 2 (относ. адр.)
        BR      162020$
; Обработка команды "возврат на пред. уровень косв. адр." (НР+Вверх, НР+Влево)
162132$:SUB     #2,26(R4)      ; Передвинуть назад указатель буфера сохр.
        BIS     #100,26(R4)
        BIC     #20,26(R4)
        MOV     @26(R4),22(R4) ; Адрес = сохраненный адрес
        BR      162020$
; Подпрограмма переключения на просмотр памяти ЦП
162164$:TST     R4             ; Пульт. отладчик работает под упр. ЦП ?
        BMI     162202$        ; Да
        MOV     #4,40(R4)      ; Режим просмотра памяти ЦП
        EMT     52             ; Вывод строки "ЦМ"
        .WORD   107560$
162202$:RETURN
; Подпрограмма переключения на просмотр памяти ПП
162204$:TST     R4             ; Пульт. отладчик работает под упр. ЦП ?
        BMI     162220$        ; Да
        CLR     40(R4)         ; Режим просмотра памяти ПП
        EMT     52             ; Вывод строки "ПМ"
        .WORD   107551$
162220$:RETURN
; Адреса п/п обработки клавиш с префиксом Esc для режима рег./точек останова
; (ИСП, Вверх, Вниз, Влево, Вправо, НР+Вверх, НР+Вниз, НР+Влево, НР+Вправо,?,?)
162222$:.WORD   161612$,162250$,162262$,162304$,162320$
        .WORD   162342$,162334$,162342$,162326$,162164$,162204$
; Обработка команды "открыть предыдущий регистр/точку останова" (Вверх)
162250$:TST     R2             ; Значение было введено ?
        BEQ     162256$        ; Нет
        MOV     R1,@R5         ; Занести введенное значение в рег./точку ост.
162256$:DEC     R3             ; Перейти к предыдущему регистру/точке останова
        BR      162272$
; Обработка команды "открыть следующий регистр/точку останова" (Вниз)
162262$:TST     R2             ; Значение было введено ?
        BEQ     162270$        ; Нет
        MOV     R1,@R5         ; Занести введенное значение в рег./точку ост.
162270$:INC     R3             ; Перейти к следующему регистру/точке останова
162272$:BIC     #177770,R3     ; Подкорректировать номер рег./точки останова
        BICB    33(R4),R3
        BR      162312$
; Обработка команды "занести значение в регистр/точку останова" (Влево)
162304$:TST     R2             ; Значение было введено ?
        BEQ     162312$        ; Нет
        MOV     R1,@R5         ; Занести введенное значение в рег./точку ост.
162312$:CALL    163174$        ; Вывод содержимого другого рег./точки ост.
        RETURN
; Обработка команды "открыть ячейку" (Вправо)
162320$:MOV     #161044$,@SP   ; Коррекция адреса возврата
        BR      162026$        ; На исполнение команды
; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо)
162326$:MOV     #161044$,@SP   ; Коррекция адреса возврата
        BR      162046$        ; На исполнение команды
; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз)
162334$:MOV     #161044$,@SP   ; Коррекция адреса возврата
        BR      162040$        ; На исполнение команды
; Обработка команды "возврат на пред. ур. косв. адр." (НР+Вверх, НР+Влево)
162342$:MOV     #161044$,@SP   ; Коррекция адреса возврата
        BR      162132$        ; На исполнение команды
; Адреса подпрограмм исполнения пунктов меню ЗАГРУЗКА (не выбрано,
;  диск, кассета ПЗУ, сеть, стык С2, магнитофон, отладка, тестирование)
162350$:.WORD   162572$,162400$,162420$,162440$,162472$,162504$,161034$,162370$
; Обработка пункта меню ЗАГРУЗКА [тестирование]
162370$:CALL    161236$        ; Перевод ЦП в режим USER
        JMP     167540$        ; На исполнение тестов
; Обработка пункта меню ЗАГРУЗКА [диск]
162400$:MOV     R0,R3          ; R3 = номер диска (0 -- 3)
        JSR     R5,162522$     ; Перекачка загрузчика и его запуск
        .WORD   163774$,44,164104$,5,0
; Обработка пункта меню ЗАГРУЗКА [кассета ПЗУ]
162420$:MOV     R0,R3          ; R3 = номер кассеты ПЗУ (1 -- 2)
        JSR     R5,162522$     ; Перекачка загрузчика и его запуск
        .WORD   163774$,44,164116$,5,0
; Обработка пункта меню ЗАГРУЗКА [сеть]
162440$:JSR     R4,163006$     ; Вывод "* ЗАГРУЗКА ИЗ СЕТИ *"
        .WORD   163573$        ; Адрес надписи
        JSR     R5,162522$     ; Перекачка загрузчика и его запуск
        .WORD   164160$,210,0
; Обработка команды "Т" пультового монитора (тест локальной сети)
162460$:JSR     R5,162522$     ; Перекачка программы теста и ее запуск
        .WORD   164600$,360,0
; Обработка пункта меню ЗАГРУЗКА [стык С2]
162472$:JSR     R5,162522$     ; Перекачка загрузчика и его запуск
        .WORD   165540$,25,0
; Обработка пункта меню ЗАГРУЗКА [магнитофон]
162504$:JSR     R5,162522$     ; Перекачка загрузчика и его запуск
        .WORD   163774$,44,164130$,14,0
; Подпрограмма перекачки загрузчика из сист. ОЗУ и его запуск
162522$:MOV     #1000,R0       ; R0 = адрес, куда перекачивается загрузчик
162526$:MOV     (R5)+,R1       ; R1 = адрес загрузчика в сист. ОЗУ
        BEQ     162542$        ; Конец перекачки
        MOV     (R5)+,R2       ; R2 = размер загрузчика в словах
162534$:MOV     (R1)+,(R0)+    ; Цикл перекачки
        SOB     R2,162534$
        BR      162526$
162542$:CALL    161236$        ; Перевод ЦП в режим USER
        MOV     #200,R0        ; Копия ССП = 200 (прерывания запрещены)
        $MTPS$
        MOV     #1000,R0       ; Копия СК = 1000 (адрес загрузчика)
        $MTPC$
        MOV     #1000,SP
        MOV     R3,R0          ; R0 = номер устройства (диска или кассеты ПЗУ)
        $RUN$                  ; Запуск загрузчика
162572$:RETURN
; Подпрограмма ввода восьмеричного значения и запроса командной клавиши
162574$:MOV     @#172660,R4    ; R4 = начало ОЗУ пультового монитора
        BR      162604$
162602$:CLR     R3
162604$:MOV     R4,R1
        ADD     #110,R1        ; R1 = адрес буфера для ввода чисел
        CLR     R2             ; R2 = 0 (инициализация счетчика введ. цифр)
162614$:CALL    172614$        ; Запрос нажатой клавиши
        CMP     R0,#'0         ; Введенный символ в диапазоне '0'-'7' ?
        BLO     162706$        ; Нет
        CMP     R0,#'7
        BHI     162654$        ; Нет
        CMP     R2,#8.         ; Введено восемь цифр ?
        BEQ     162614$        ; Да
        MOVB    R0,(R1)+       ; Поместить символ в буфер
        INC     R2             ; Увеличить счетчик символов
        CALL    172632$        ; Вывести символ на экран
        BR      162614$
162654$:CMPB    R0,#177        ; Нажата клавиша <ЗАБОЙ> ?
        BNE     162706$        ; Нет
        TST     R2             ; Буфер пуст ?
        BEQ     162614$        ; Да
        CLRB    -(R1)          ; Удалить последний символ из буфера
        DEC     R2             ; Уменьшить счетчик введенных символов
        MOV     R1,-(SP)
        JSR     R4,163006$     ; Удалить последний символ с экрана
        .WORD   163551$
        MOV     (SP)+,R1
        BR      162614$
162706$:SUB     R2,R1          ; R1 = начало буфера ввода
        CLR     R2             ; R2 = 0 (счетчик обработанных символов)
        CLR     R5             ; R5 = 0 (введенное число (инициализация))
        MOV     R0,-(SP)       ; Сохранить в стеке код командной клавиши
162716$:MOVB    @R1,R0         ; R0 = очередная цифра из буфера
        CLRB    (R1)+
        SUB     #60,R0         ; Перевод из ASCII в BIN
        BMI     162750$        ; Достигнут конец буфера
        ASL     R5             ; R5 = R5 * 8 + R0
        ASL     R5
        ASL     R5
        ADD     R0,R5
        INC     R2             ; Увеличить счетчик обработанных символов
        CMP     R2,#8.         ; Обработано восемь символов ?
        BNE     162716$        ; Нет
162750$:MOV     (SP)+,R0       ; R0 = код командной клавиши
        MOV     R5,R1          ; R1 = введенное значение
        RETURN
; П/п ввода клавиши и корректировка ее кода (за символом ESC)
162756$:CALL    172614$        ; Запрос нажатой клавиши
        SUB     #176,R0        ; Ее код в диапазоне 176(8) -- 207(8) ?
        BMI     163002$        ; Нет
        CMP     R0,#11
        BHI     163002$        ; Нет
        ASL     R0             ; Увеличение скорректированного кода вдвое
        RETURN
163002$:CLR     R0             ; R0 = 0 ("плохой" код)
        RETURN
; Подпрограмма вывода строки на экран (адрес строки за командой JSR R4,...)
163006$:MOV     (R4)+,R1       ; R1 = адрес строки
        BR      163016$
163012$:CALL    172632$        ; Вывод символа на экран
; Подпрограмма вывода строки на экран (адрес строки в регистре R1)
163016$:MOVB    (R1)+,R0       ; R0 = очередной символ
        BNE     163012$        ; Еще не конец строки
        RTS     R4
; Подпрограмма вывода на экран адреса открытой ячейки памяти и ее содержимого
163024$:CALL    163370$        ; Перевод курсора в начало следующей строки
        MOV     22(R4),R1      ; R1 = адрес открытой ячейки
        CALL    163074$        ; Вывод на экран адреса открытой ячейки
        JSR     R4,163006$     ; Вывод разделительной дробной черты
        .WORD   163516$
        MOV     22(R4),R5      ; R5 = адрес открытой ячейки
        CALL    163412$        ; Запрос содержимого ячейки
        MOV     R0,R1          ; R1 = содержимое открытой ячейки
        CALL    163074$        ; Вывод на экран содержимого открытой ячейки
        JSR     R4,163006$     ; Вывод двух пробелов
        .WORD   163560$
        RETURN
; Подпрограмма вывода на экран числа в восьмеричной форме
163074$:MOV     R1,24(R4)      ; Сохранение значения в ОЗУ пульт. отладчика
        CLR     R0
        MOV     #6,R2          ; Число символов в ASCII-строке
        BR      163122$
163110$:CLR     R0             ; Цикл вытяжки трех старших разрядов R1 -> R0
        ROL     R1
        ROL     R0
        ROL     R1
        ROL     R0
163122$:ROL     R1
        ROL     R0
        ADD     #'0,R0         ; Преобразование из BIN в ASCII
        CALL    172632$        ; Вывод символа на экран
        SOB     R2,163110$
        RETURN
; Подпрограмма вывода на экран регистров или точек останова
163142$:CALL    163370$        ; Перевод курсора в начало следующей строки
        CLR     R3             ; R3 = 0 (начальный номер рег. или точ.ост.)
163150$:CALL    163200$        ; Вывод содержимого регистра или точ. ост.
        INC     R3             ; Перейти к след. регистру или точ. ост.
        CMPB    R3,33(R4)      ; Выведены все рег. или точ. ост.
        BLO     163150$        ; Нет
        CMP     R3,#10         ; Номер регистра равен 10 (рег. сост. проц.) ?
        BEQ     163150$        ; Да
        RETURN
; Подпрограмма вывода на экран содерж. одного регистра или точки останова
163174$:CALL    163370$        ; Перевод курсора в начало следующей строки
163200$:MOVB    32(R4),R0      ; R0 = 'R' или 'A' (регистры или точ. ост.)
        CALL    172632$        ; Вывод символа на экран
        MOV     R3,R0          ; R0 = номер регистра или точ. ост.
        ADD     #'0,R0         ; Перевод из BIN в ASCII
        CMP     R0,#'8         ; Это регистр состояния процессора
        BNE     163230$        ; Нет
        MOV     #'S,R0         ; Замена '8' на 'S'
163230$:CALL    172632$        ; Вывод символа на экран
163234$:JSR     R4,163006$     ; Вывод знака равенства
        .WORD   163526$
        CALL    163264$        ; Получение в R5 адреса хранения знач. рег.
        MOV     @R5,R1         ; R1 = содержимое регистра или точ. ост.
        CALL    163074$        ; Вывод содержимого на экран
        JSR     R4,163006$     ; Вывод разделительного пробела
        .WORD   163561$
        RETURN
; Подпрограмма получения в R5 адреса хранения содержимого рег. или точ. ост.
163264$:CLR     R5             ; R5 = 0 (инициализация)
        CMPB    33(R4),#4      ; Идет вывод точек останова ?
        BNE     163306$        ; Нет
        BICB    33(R4),R3
        MOV     #24,R5         ; R5 = смещение знач. точ. ост. в ОЗУ ПО / 2
163306$:ADD     R3,R5          ; Прибавить номер регистра или точки останова
        ASL     R5
        ADD     R4,R5          ; Прибавить адрес ОЗУ пультового отладчика
        RETURN
; Подпрограмма вывода на экран причины перехода процессора в режим HALT
163316$:MOV     @172662$,R2    ; R2 = адрес строки причины перехода
        BEQ     163366$
        JSR     R4,163006$     ; Вывод "*** "
        .WORD   163530$
        MOV     R2,R1          ; R1 = адрес строки причины перехода
        JSR     R4,163016$     ; Вывод причины перехода
        JSR     R4,163006$     ; Вывод " ***"
        .WORD   163540$
        TST     22(R4)         ; Вывод содержимое ячейки останова ?
        BNE     163366$        ; Нет
        MOV     16(R4),22(R4)  ; 22(R4) = адрес останова
        CALL    163024$        ; Вывод содержимого ячейки адреса останова
163366$:RETURN
; Подпрограмма перевода курсора в начало следующей строки
163370$:MOV     #15,R0         ; R0 = код возврата каретки
        CALL    172632$        ; Вывод на экран (курсор в начало тек. строки)
        MOV     #12,R0         ; R0 = код перевода строки
        CALL    172632$        ; Вывод на экран (курсор на след. строку)
        RETURN
; Подпрограмма чтения содержимого ячейки памяти
163412$:ADD     40(R4),PC      ; Режим ЦП(40(R4)=4)/ПП(40(R4)=0)(только в ПП)
        $MFPM$                 ; Чтение содержимого ячейки (R5)+ -> R0
        RETURN
163422$:CLC                    ; Коррекция R5 для помещ. его в рег. адреса
        ROR     R5
        MOV     R5,@#177010
        MOV     @#177014,R0    ; Чтение содержимого ячейки памяти ЦП
        INC     R5
        ASL     R5
        RETURN
; Подпрограмма записи значения в ячейку памяти
163444$:ADD     40(R4),PC      ; Режим ЦП(40(R4)=4)/ПП(40(R4)=0)(только в ПП)
        $MTPM$                 ; Запись значения в ячейку памяти R0 -> -(R5)
        RETURN
163454$:CLC                    ; Коррекция R5 для помещ. его в рег. адреса
        ROR     R5
        DEC     R5
        MOV     R5,@#177010
        MOV     R0,@#177014    ; Запись значения в ячейку памяти ЦП
        ASL     R5
        RETURN
; Esc-последовательности и надписи, употребляемые пультовым отладчиком
163476$:.BYTE   33,275,0       ; Системный режим клавиатуры
163501$:.BYTE   33,277,275,0   ; Пользовательский режим клавиатуры
163505$:.BYTE   33,274,0       ; Вызов меню ЗАГРУЗКА
163510$:.ASCIZ  <15><12><17>/@ /
163516$:.ASCIZ  "/ "
163521$:.ASCIZ  /R/
163523$:.ASCIZ  /RS/
163526$:.ASCIZ  /=/
163530$:.ASCIZ  <15><12><16>/*** /
163540$:.ASCIZ  / ***/<17>
163546$:.ASCIZ  <15><12>
163551$:.ASCIZ  <33>/D /<33>/D/
        .EVEN
163560$:.ASCII  / /
163561$:.ASCIZ  / /
163563$:.ASCIZ  <6>/ЦП/
163567$:.ASCIZ  <6>/ПП/
163573$:.ASCIZ  <15><12><12><16>/* zagruzka iz seti *  /<17>
163627$:.ASCIZ  /zawisanie/
163641$:.ASCIZ  /rezerwnyj kod/
163657$:.ASCIZ  /awariq setewogo pitaniq/
163707$:.ASCIZ  /dwojnoe zawisanie/
163731$:.ASCIZ  /stop/
163736$:.ASCIZ  /zawisanie pri prieme a.w.p./
        .EVEN
163772$:.WORD   0
; Загрузчик с диска, кассеты ПЗУ, магнитофона
163774$:MOV     #176674,R1     ; R1 = адрес регистра сост. перед. канала 2
        MOVB    R0,164104$+3   ; Сохранить номер устройства
        CLRB    @R1            ; Запретить прерывания от канала 2
        MOV     #164104$-163774$+1000,R2; R2 = адрес блока параметров
164012$:MOV     #2,R3
164016$:TSTB    @R1            ; Ожидание готовности канала 2
        BPL     164016$        ; Не готов
        MOVB    R2,2(R1)       ; Передача адреса БП в канал 2
        SWAB    R2
        SOB     R3,164016$
        MOV     #2,R3
164036$:TSTB    @R1            ; Ожидание готовности канала 2
        BPL     164036$        ; Не готов
        MOVB    #377,2(R1)     ; Передача байтов завершения в канал 2
        SOB     R3,164036$
164052$:TSTB    @R1            ; Ожидание завершения операции
        BPL     164052$        ; Операция не завершена
        TSTB    164104$        ; Есть ошибки ?
        BEQ     164072$        ; Нет
        CLRB    164104$        ; Очистить байт ошибок
        BR      164012$        ; Попробовать заново
164072$:CMP     #240,@#0       ; Первая команда BOOT-сектора NOP ?
        BNE     164012$        ; Нет
        CLR     PC             ; Запуск BOOT
; Блок параметров для диска
164104$:.BYTE   0,10,2,0,0,1
        .WORD   0,400
; Блок параметров для кассеты ПЗУ
164116$:.BYTE   0,10,21,0,0,0
        .WORD   0,400
; Блок параметров для магнитофона
164130$:.BYTE   0,11,11,0
        .WORD   0,0,0,0,0,0,0,0,0,400
; Загрузчик из сети
164160$:MTPS    #340           ; Запретить прерывания
        MOVB    @#176561,R5    ; Выделение в R5 номера сетевой станции
        MOV     R5,R0
        BIC     #177760,R5
        ASR     R0
        BIC     #177717,R0
        BIS     R0,R5
        MOVB    R5,164554$+2   ; Сохранение номера сетевой станции
        MOVB    164554$+16,R0  ; R0 = 173(8)
        XOR     R5,R0          ; R0 = 173(8) XOR номер_сетевой_станции
        MOVB    R0,164554$+16
        MOV     #30,R0         ; R0 = 30 (адрес вектора команды EMT)
        MOV     #164500$-164160$+1000,(R0)+; Установка вектора прерывания EMT
        CLR     (R0)+          ; Установка ССП при вызове EMT
        MOV     #164512$-164160$+1000,(R0)+; Установка вектора прерывания TRAP
        CLR     (R0)+          ; Установка ССП при вызове TRAP
164244$:MOV     #10000,SP      ; Установка указателя стека
        MOV     #164526$-164160$+1000,@#100; Устан. вект. прер. сет. таймера
        CLR     @#102
        MTPS    #0             ; Разрешить прерывания
        CLR     164534$        ; Очистка счетчика ожидания
164272$:TRAP    0              ; Чтение пришедшего байта
        CMP     164534$,#5     ; Счетчик ожидания больше пяти
        BLO     164272$        ; Нет
164304$:EMT     0              ; Посылка и чтение очередного байта
        CMPB    #376,R0        ; Пришедший байт равен 376(8)
        BNE     164304$        ; Нет
        MOV     #164554$-164160$+1000,R1; R1 = адрес блока передачи
164320$:MOVB    (R1)+,R0       ; R0 = очередной байт из блока передачи
        CMPB    #376,R0        ; Он равен 376(8) ?
        BEQ     164334$        ; Да
        EMT     0              ; Посылка и чтение очередного байта
        BR      164320$
164334$:EMT     0              ; Посылка и чтение очередного байта
        CMPB    #377,R0        ; Прочитанный байт равен 377(8) ?
        BNE     164334$        ; Нет
        EMT     0              ; Посылка и чтение очередного байта
        CMPB    R5,R0          ; Полученный байт равен номеру станции ?
        BNE     164334$        ; Нет
        MOV     #377,R4        ; R4 = 377(8) (контрольная сумма)
        XOR     R0,R4          ; R4 = 377(8) XOR номер_сетевой_станции
        MOV     #50000,R1      ; R1 = адрес расположения загрузчика
        EMT     0              ; Посылка и чтение очередного байта
        MOV     R0,R3          ; R3 = считанный байт
        XOR     R0,R4          ; Подсчет контрольной суммы
164372$:EMT     0              ; Посылка и чтение очередного байта
        CMPB    #373,R0        ; Считанный байт равен 373(8) ?
        BLOS    164410$        ; Выше или равен 373(8)
        XOR     R0,R4          ; Подсчет контрольной суммы
        MOVB    R0,(R1)+       ; Передача принятого байта в память
        BR      164372$
164410$:BNE     164426$        ; Принятый байт равен не равен 373(8)
        EMT     0              ; Посылка и чтение очередного байта
        COM     R0             ; Инверсия принятого байта
        XOR     R0,R4          ; Подсчет контрольной суммы
        MOVB    R0,(R1)+       ; Передача принятого байта в память
        COM     R0             ; Инверсия для передачи
        BR      164372$
164426$:CMPB    #374,R0        ; Принятый байт равен 374(8)
        BNE     164244$        ; Нет
        EMT     0              ; Посылка и передача байта
        CMPB    R0,R4          ; Он равен контрольной сумме ?
        BNE     164244$        ; Нет
        EMT     0              ; Посылка и передача байта
        BISB    #10,R0         ; R0 = R0 OR 10(8)
        EMT     0              ; Посылка и передача байта
        CMPB    #377,R0        ; Принятый байт равен 377(8)
        BNE     164244$        ; Нет
        EMT     0              ; Посылка и передача байта
        MOV     #4,@#176560    ; Включение кольцевой сети
        MTPS    #340           ; Запретить прерывания
        JMP     @#50000        ; Переход на исполнение загрузчика
; Подпрограмма передачи байта в локальную сеть (исполнение команды EMT)
164500$:TSTB    @#176564       ; Передатчик СА готов ?
        BPL     164500$        ; Нет
        MOVB    R0,@#176566    ; Передача байта в сеть
; Подпрограмма чтения байта, пришедшего по сети (исполнение команды TRAP)
164512$:TSTB    @#176560       ; Приемник СА готов ?
        BPL     164512$        ; Нет
        MOVB    @#176562,R0    ; Прием байта из сети
        RTI
; Подпрограмма исполнения прерываний таймера
164526$:CLR     @#176560       ; Включение режима загрузки
        INC     (PC)+          ; Инкремент счетчика ожидания
164534$:.WORD   0
        CMP     164534$,#1000  ; Счетчик ожидания превысил лимит времени ?
        BHI     164550$        ; Да
        RTI
164550$:JMP     164244$
; Блок передачи в сеть
164554$:.BYTE   377,0,0,204,0,0,0,0,0,0,0,0,0,374,173,60,377,376,0,0
; Программа теста локальной сети
164600$:MTPS    #340           ; Запретить прерывания
        MOV     #165130$-164600$+1000,@#360; Уст. вект. прер. приемника СА
        MOV     #165120$-164600$+1000,@#100; Уст. вект. прер. сет. таймера
        MOV     #165254$-164600$+1000,@#4; Уст. вект. прер. по ош. обр. к кан.
        MOV     #165264$-164600$+1000,@#10; Уст. вект. прер. по недейст. ком.
        MOV     #340,R0        ; Установить знач. ССП при вызове прер.
        MOV     R0,@#362
        MOV     R0,@#102
        MOV     R0,@#6
        MOV     R0,@#12
        CLR     (PC)+          ; Установить пассивный режим
164662$:.WORD   0
        CALL    165304$        ; Вывести номер сетевой станции
        MTPS    #0             ; Разрешить прерывания
164674$:TSTB    @#177560       ; Нажата клавиша ?
        BPL     164674$        ; Нет
        MOVB    @#177562,R0    ; R0 = код нажатой клавиши
        BIC     #177600,R0
        CMPB    #3,R0          ; Нажата комбинация <УПР+C>
        BNE     164726$        ; Нет
        CALL    164744$        ; Запрос команды и ее исполнение
        BR      164674$
164726$:TST     164662$        ; Режим активный или пассивный ?
        BEQ     164674$        ; Пассивный режим
        MOVB    R0,R1          ; R1 = код нажатой клавиши
        CALL    165104$        ; Посылка в сеть
        BR      164674$
; Подпрограмма запроса команды и ее исполнение
164744$:TSTB    @#177564       ; Готовность перед. канала 0 (терминал)
        BPL     164744$        ; Не готов
        MOVB    #'?,@#177566   ; Вывести промптер '?'
164760$:TSTB    @#177560       ; Нажата клавиша ?
        BPL     164760$
        MOVB    @#177562,R0    ; R0 = код нажатой клавиши
        BIC     #177640,R0
        CMPB    R0,#'A         ; Нажата 'A' (активный режим) ?
        BEQ     165046$        ; Да
        CMPB    R0,#'P         ; Нажата 'P' (пассивный режим) ?
        BEQ     165056$        ; Да
        CMPB    R0,#'N         ; Нажата 'N' (номер станции) ?
        BEQ     165076$        ; Да
        CMPB    R0,#'K         ; Нажата 'K' (конец теста) ?
        BEQ     165064$        ; Да
        TST     164662$        ; Активный/пассивный режим ?
        BEQ     165102$        ; Пассивный режим
        MOVB    #3,R1
        CALL    165104$        ; Посылка в сеть
        BR      165102$
; Активный режим
165046$:MOV     #1,164662$     ; Установить признак активного режима
        BR      165102$
; Пассивный режим
165056$:CLR     164662$        ; Установить признак пассивного режима
        BR      165102$
; Конец теста
165064$:MOV     #165504$-164600$+1000,R5; Адрес строки "КОНЕЦ ТЕСТА"
        CALL    165402$        ; Вывести на экран
        HALT                   ; Выход в пультовый отладчик
; Номер станции
165076$:CALL    165304$        ; Вывести номер станции на экран
165102$:RETURN
; Подпрограмма передачи данных в сеть
165104$:TSTB    @#176564       ; Передатчик готов ?
        BPL     165104$        ; Нет
        MOVB    R1,@#176566    ; Послать байт в сеть
        RETURN
; Подпрограмма обработки событий сетевого таймера
165120$:MOV     #100,@#176560  ; Установить режим прерываний СА
        RTI
; Подпрограмма обработки прерываний от СА
165130$:MOV     R1,-(SP)
        BIT     #110001,@#176560; Есть ошибки передачи ?
        BNE     165176$        ; Да
        MOVB    @#176562,R1    ; R1 = принятые данные
165146$:TSTB    @#177564       ; Готовность терминала
        BPL     165146$        ; Не готов
        MOVB    R1,@#177566    ; Вывести принятый символ на экран
        TST     164662$        ; Активный/пассивный режим
        BNE     165172$        ; Активный
        CALL    165104$        ; Послать данные в сеть
165172$:MOV     (SP)+,R1
        RTI
165176$:MOV     @#176560,R1    ; R1 = регистр состояния приемника СА
        BPL     165210$        ; Ошибка паритета отсутствует
        BIS     #4,R1          ; Установить признак ошибки паритета
165210$:BIT     #10000,R1      ; Есть ошибки переполнения ?
        BEQ     165222$        ; Нет
        BIS     #2,R1          ; Установить признак переполнения
165222$:BIC     #177770,R1     ; Выделить ошибку разрыва линии
        BIS     #60,R1         ; Перевод BIN -> ASCII
        MOVB    R1,165420$+7
        MOV     #165420$-164600$+1000,R5; Адрес сообщения "СБОЙ #X"
        CALL    165402$        ; Вывести сообщение на экран
        TSTB    @#176562       ; Сбросить готовность приемника СА
        BR      165172$
; Подпрограмма обработки прерывания 4 (ошибка обращения к каналу)
165254$:MOV     #"04,165461$+15; Номер прерывания в сообщение
        BR      165272$
; Подпрограмма обработки прерывания 10 (зарезервированная инструкция)
165264$:MOV     #"10,165461$+15; Номер прерывания в сообщение
165272$:MOV     #165461$-164600$+1000,R5; Адрес сообщения "ПРЕРЫВАНИЕ #XX"
        CALL    165402$        ; Вывести сообщение на экран
        HALT                   ; Переход в режим пультового отладчика
; Подпрограмма вывода на экран номера сетевой станции
165304$:MOVB    @#176561,R0    ; Выделение номера станции, перевод
        MOVB    R0,R1          ; из BIN в ASCII и запоминание в строке
        BICB    #360,R0        ; "ТЕСТ СТАНЦИИ #XX"
        BICB    #237,R1
        ASRB    R1
        BISB    R1,R0
        MOV     R0,R1
        BIC     #177770,R1
        BIS     #60,R1
        MOVB    R1,165434$+20
        MOV     R0,R1
        ASR     R1
        ASR     R1
        ASR     R1
        BIC     #177770,R1
        BIS     #60,R1
        MOVB    R1,165434$+17
        MOV     #165434$-164600$+1000,R5; Адрес строки "ТЕСТ СТАНЦИИ #XX"
        CALL    165402$        ; Вывести строку на экран
        RETURN
; Подпрограмма вывода строки на экран
165402$:TSTB    @#177564       ; Готовность к принятию символа
        BPL     165402$        ; Не готов
        MOVB    (R5)+,@#177566 ; Вывести очередной символ на экран
        BNE     165402$        ; Еще не конец строки
        RETURN
165420$:.ASCIZ  <16>/sboj #0/<17><15><12>
165434$:.ASCIZ  <16>/test stancii #00/<17><15><12>
165461$:.ASCIZ  <16>/prerywanie #00/<17><15><12>
165504$:.ASCIZ  <16>/konec testa/<17><15><12>
        .EVEN
165524$:.WORD   0,0,0,0,0,0
; Загрузчик из стыка С2
165540$:TSTB    @#176574       ; Проверка готовности передатчика
        BPL     165540$        ; Не готов
        MOV     #100,@#176576  ; Послать код 100(8) (готовность к обмену)
        CLR     R1             ; R1 = 0 (адрес считывания BOOT)
        MOV     #1000,R2       ; R2 = 1000 (размер BOOT)
165562$:TSTB    @#176570       ; Приемник готов ?
        BPL     165562$        ; Нет
        MOVB    @#176572,(R1)+ ; Переслать принятый байт в память
        SOB     R2,165562$
        CMP     @#0,#240       ; Первая команда BOOT равна NOP ?
        BEQ     165610$        ; Да
        HALT                   ; Переход в режим пультового отладчика
165610$:CLR     PC             ; Переход к исполнению BOOT
; Обработка команд FIS (FADD, FSUB, FMUL, FDIV)
165612$:MOV     R2,@167502$    ; Сохранить R2
        MOV     167502$,R2     ; R2 = адрес блока сохранения
        ADD     #2,R2
        MOV     R0,(R2)+       ; Сохранить регистры,СК и ССП
        $MFPC$
        MOV     R0,14(R2)
        $MFPS$
        MTPS    R0
        MOV     R0,16(R2)
        MOV     R1,(R2)+
        MOV     @167502$,(R2)+
        MOV     R3,(R2)+
        MOV     R4,(R2)+
        MOV     R5,(R2)+
        MOV     SP,(R2)+
        MOV     (R2)+,R5       ; R5 = Значение СК за командой FIS
        SUB     #2,R5          ; Получение адреса команды FIS
        ADD     #2,R2
        $MFPM$                 ; Прочесть код команды FIS
        MOV     R0,R1          ; R1 = код команды FIS
        BIC     #177770,R0     ; Выделение поля регистра
        ASL     R0             ; Доступ к сохр. значению регистра
        ADD     167502$,R0
        ADD     #2,R0
        MOV     R0,(R2)+
        MOV     @R0,R5         ; R5 = значение регистра (указ. на блок арг.)
        BIT     #1,R5          ; Адрес блока нечетный ?
        BNE     166002$        ; Да
        CLR     @167502$
        CLR     @R2
        $MFPM$                 ; Прочесть аргументы
        MOV     R0,R2          ; R2 = старшая часть аргумента B
        $MFPM$
        MOV     R0,R3          ; R3 = младшая часть аргумента B
        $MFPM$
        MOV     R0,R4          ; R4 = старшая часть аргумента A
        $MFPM$
        MOV     R0,R5          ; R5 = младшая часть аргумента A
        BIC     #177747,R1     ; Выделение поля кода операции
        ASR     R1             ; Переход на нужную п/п
        ASR     R1
        ADD     PC,R1
165772$:ADD     #166112$-165772$,R1
        ADD     @R1,R1
        JMP     @R1
166002$:MOV     #4,R5          ; R5 = адрес вектора по ош. обр. к каналу
166006$:$MFPM$                 ; Прочесть загр. значение СК
        MTPS    #200
        $MTPC$                 ; Установить значение РКСК
        $MFPM$                 ; Прочесть загр. знач. ССП
        $MTPS$                 ; Установить значение РКСП
        MOV     167502$,R0
        ADD     #4,R0
        MOV     (R0)+,R1       ; Восстановить регистры
        MOV     (R0)+,R2
        MOV     (R0)+,R3
        MOV     (R0)+,R4
        MOV     (R0)+,R5
        MOV     (R0)+,SP
        MOV     SP,R5          ; R5 = Указатель вершины стека
        MOV     2(R0),R0       ; R0 = сохраненное значение ССП
        $MTPM$                 ; Занести в стек
        MOV     167502$,R0
        MOV     20(R0),R0      ; R0 = сохраненное значение СК
        $MTPM$                 ; Занести в стек
        MOV     167502$,R0
        MOV     R5,SP          ; Подкорректировать указатель стека
        MOV     14(R0),R5      ; Восстановить R5
        MOV     2(R0),R0       ; Восстановить R0
        JMP     167500$
; Смещения подпрограмм исполнения действий с ПЗ (FADD, FSUB, FMUL, FDIV)
166112$:.WORD   166624$-166112$,166620$-166112$
        .WORD   166122$-166112$,166416$-166112$
; Подпрограмма эмуляции команды FMUL
166122$:BIT     #77600,R2      ; Порядок B = 0 ?
        BEQ     166406$        ; Да
        BIT     #77600,R4      ; Порядок A = 0 ?
        BEQ     166406$        ; Да
        MOV     167502$,R1     ; R1 = адрес буфера сохранения
        MOV     R2,R0          ; R0 = старшая часть аргумента B
        BPL     166152$        ; B >= 0
        INC     26(R1)         ; Аргумент B отрицательный
166152$:TST     R4
        BPL     166162$        ; A >= 0
        INC     26(R1)         ; Аргумент A отрицательный
166162$:MOV     R4,R1          ; R1 = старшая часть аргумента A
        BIC     #100177,R0     ; Выделение порядка B в R0
        BIC     #100177,R1     ; Выделение порядка A в R0
        BIC     #177600,R2     ; Выделение старшей части мантиссы B
        BIC     #177600,R4     ; Выделение старшей части мантиссы A
        BIS     #200,R2        ; Установка скрытого разряда мантиссы B
        BIS     #200,R4        ; Установка скрытого разряда мантиссы A
        ADD     R1,R0          ; R0(порядок B) = порядок_B + порядок_A
        SUB     #40200,R0      ; Вычитание 129
        MOV     167502$,R1     ; R1 = адрес блока сохранения
        MOV     R0,@R1         ; Сохранить сложенный порядок
        MOV     R2,30(R1)      ; Сохранить в буфере мантиссу B
        MOV     R3,32(R1)
; /-------------------------------------------------------------------------\
; !              ПРИНЦИП УМНОЖЕНИЯ ДВУХ 32-РАЗРЯДНЫХ ЧИСЕЛ                  !
; !                                                                         !
; !       Два 32-разрядных числа A и B можно представить как :              !
; !                                                                         !
; !     A = ab, где a - старшая его часть, а b - младшая                    !
; !     B = cd, где c - старшая его часть, а d - мдадшая                    !
; !                                                                         !
; !       Далее реализуется хорошо известный принцип столбика:              !
; !                                                                         !
; !              c   d                                                      !
; !              a   b                                                      !
; !             -------                                                     !
; !                bd                                                       !
; !               bc                                                        !
; !               ad                                                        !
; !              ac                                                         !
; \-------------------------------------------------------------------------/
        MOV     R2,R0          ; R0 = старшая часть мантиссы B(c)
        ASL     R2             ; Умножение ст.ч. B на 2 и дел. мл.ч. A на 2
        ROR     R5             ; для избавления от знакового разр. в A
        BCC     166260$        ; Отсутствует остаток от деления на 2
        MUL     R5,R2          ; (R2,R3) = bc
        ADD     R0,R3          ; Прибавление остатка
        ADC     R2
        BR      166262$
166260$:MUL     R5,R2          ; (R2,R3) = bc
166262$:MOV     167502$,R0     ; R0 = адрес буфера сохранения
        MOV     32(R0),R0      ; R0 = младшая часть мантиссы B(d)
        ASL     R4             ; Избавление от знаковых разрядов в d
        ROR     R0
        BCC     166312$        ; Отсутствует остаток от деления на 2
        MUL     R4,R0          ; (R0,R1) = ad
        ASR     R4             ; Приведение a к нормальному виду
        ADD     R4,R3          ; Прибавление остатка к bc
        ADC     R2
        BR      166316$
166312$:MUL     R4,R0          ; (R0,R1) = ad
        ASR     R4             ; Приведение a к нормальному виду
166316$:ADD     R1,R3          ; (R2,R3) = bc + ad
        ADC     R2
        ADD     R0,R2
        MOV     167502$,R0     ; R0 = адрес буфера сохранения
        MOV     30(R0),R0      ; R0 = старшая часть мантиссы B(c)
        MUL     R4,R0          ; (R1) = ac
        ADD     R1,R2          ; (R2,R3) = (bc + ad) + ac
        MOV     167502$,R0     ; R0 = адрес буфера сохранения
        MOV     32(R0),R0      ; R0 = младшая часть мантиссы B(d)
        CLC
        ROR     R0             ; d = d/2 (b уже поделено (R5))
        MUL     R5,R0          ; (R0,R1) = b/2 * d/2 = bd /4
        ASHC    #2,R0          ; (R0,R1) = bd/4 * 4 = bd
        ADD     R0,R3          ; (R2,R3) = ((bc + ad) + ac) + bd)
        ADC     R2
        CLR     R1             ; Суть этой команды состоит в сбросе бита C
        ROR     R2             ; Первый этап нормализации мантиссы
        ROR     R3             ; (избавление от знакового разряда)
        ASHC    #72,R2         ; Нормализация мантиссы
        ROR     R1             ; Сброс бита C
        JMP     167140$
; Получение нулевого результата
166406$:CLR     R2             ; (R2,R3) = 0.0
        CLR     R3
        JMP     167306$
; Подпрограмма эмуляции команды FDIV
166416$:BIT     #77600,R2      ; B = 0 (деление на нуль) ?
        BNE     166432$        ; Нет
        CLR     R5             ; Слово ошибок = 0
166426$:JMP     167330$        ; Деление на нуль
166432$:BIT     #77600,R4      ; A = 0 (нуль / ... = нуль) ?
        BEQ     166406$        ; Да
        MOV     167502$,R1     ; R1 = адрес блока сохранения
        MOV     R2,R0          ; R0 = старшая часть B
        BPL     166454$        ; B >= 0
        INC     26(R1)         ; Аргумент B отрицательный
166454$:TST     R4
        BPL     166464$        ; A >= 0
        INC     26(R1)         ; Аргумент A отрицательный
166464$:MOV     R4,R1          ; R1 = старшая часть A
        BIC     #100177,R0     ; Выделение порядка B в R0
        BIC     #100177,R1     ; Выделение порядка A в R0
        BIC     #177600,R2     ; Выделение старшей части мантиссы B
        BIC     #177600,R4     ; Выделение старшей части мантиссы A
        BIS     #200,R2        ; Установка скрытого разряда мантиссы B
        BIS     #200,R4        ; Установка скрытого разряда мантиссы A
        SUB     R0,R1          ; R1(порядок A) = порядок_A - порядок_B
        ADD     #37600,R1              ; Прибавить 127
        MOV     R1,@167502$    ; Сохранить порядок


Код

; /-------------------------------------------------------------------------\
; !                ПРИНЦИП ДЕЛЕНИЯ ДВУХ 32-РАЗРЯДНЫХ ЧИСЕЛ                  !
; !                                                                         !
; !       Деление осуществляется методом "угла" с порязрядным сдвигом       !
; !     влево аргумента A и результата. Алгоритм вычисления представлен     !
; !     ниже :                                                              !
; !     результат := 40                                                     !
; !     нц повторять                                                        !
; !     | если A < B                                                        !
; !     | | то                                                              !
; !     | | | результат := результат * 2                                    !
; !     | | | A := A * 2                                                    !
; !     | | иначе                                                           !
; !     | | | A := A - B                                                    !
; !     | | | результат := результат * 2 + 1                                !
; !     | | | A := A * 2                                                    !
; !     | все                                                               !
; !     кц пока результат[31] = 0                                           !
; !     результат[31] := 0                                                  !
; \-------------------------------------------------------------------------/
        MOV     #40,R1         ; Бит признака конца операции
        CLR     R0
166536$:CMP     R4,#200        ; Мантисса A < 0.5
        BLT     166566$        ; Да
        SUB     R3,R5          ; (R4,R5) = (R4,R5) - (R2,R3)
        SBC     R4
        SUB     R2,R4
        BMI     166560$        ; Мантисса A < B
        SEC                    ; Установить бит C (+ 1 для результата)
        BR      166570$
166560$:ADD     R3,R5          ; (R4,R5) = (R4,R5) + (R2,R3) (восстановление
        ADC     R4             ; мантиссы A)
        ADD     R2,R4
166566$:CLC                    ; Сбросить бит C (+ 0 для результата)
166570$:ROL     R1             ; Результат := результат * 2 + бит_C
        ROL     R0
        ASL     R5             ; A := A * 2
        ROL     R4
        TST     R0             ; Результат[31] = 0 ?
        BPL     166536$        ; Нет
        BIC     #100000,R0     ; Результат[31] := 0
        MOV     R0,R2          ; (R2,R3) = (R0,R1)
        MOV     R1,R3
        JMP     167140$
; Подпрограмма эмуляции команды FSUB
166620$:ADD     #100000,R2     ; B := (-B)
; Подпрограмма эмуляции команды FADD
166624$:BIT     #77600,R2      ; Аргумент B = 0 ?
        BNE     166660$        ; Нет
        BIT     #77600,R4      ; Аргумент A = 0 ?
        BNE     166650$
        CLR     R2             ; Результат := 0
        CLR     R3
        JMP     167306$
166650$:MOV     R4,R2          ; Результат := A (B = 0)
        MOV     R5,R3
166654$:JMP     167306$
166660$:BIT     #77600,R4      ; Аргумент A = 0 ?
        BEQ     166654$        ; Да (результат := B (A = 0))
        MOV     R2,R0          ; R0 = старшая часть аргумента B
        BIC     #177600,R2     ; Выделение старшей части мантиссы B
        BIS     #200,R2        ; Установка скрытого разряда
        TST     R0             ; Аргумент B < 0 ?
        BPL     166712$        ; Нет
        NEG     R3             ; Изменить знак мантиссы B
        ADC     R2
        NEG     R2
166712$:MOV     R4,R1          ; R1 = старшая часть аргумента A
        BIC     #177600,R4     ; Выделение старшей части мантиссы A
        BIS     #200,R4        ; Установка скрытого разряда
        TST     R1             ; Аргумент A < 0 ?
        BPL     166736$        ; Нет
        NEG     R5             ; Изменить знак мантиссы A
        ADC     R4
        NEG     R4
166736$:BIC     #100177,R0     ; Выделение порядка аргумента B
        BIC     #100177,R1     ; Выделение порядка аргумента A
        MOV     R1,@167502$    ; Запомнить порядок аргумента A
        SUB     R1,R0          ; R0 = порядок_B - порядок_A
        BNE     166762$        ; Порядки не равны
        CLR     R1             ; Последние разряды равны нулю
        BR      167074$
166762$:BMI     167034$        ; Порядок A > порядок B
        ADD     R0,@167502$    ; Сохранить порядок аргумента B (A+B-A=B)
        CLR     R1             ; Последние разряды равны нулю
        CMP     R0,#6000       ; Разность порядков больше 24
        BLE     167006$        ; Нет
        CLR     R4             ; Мантисса A равна нулю
        CLR     R5
        BR      167074$
167006$:ASL     R0             ; Перенос порядка в младшие разряды
        SWAB    R0
        NEG     R0             ; Изменение знака для осущ. сдвига вправо
        INCB    R0             ; +1 (далее для отлавл. двух выдвин. разр.)
        BEQ     167024$
        ASHC    R0,R4          ; Сдвинуть мантиссу A вправо
        ROR     R1             ; Запомнить последний разряд
167024$:ASHC    #77,R4         ; Сдвинуть мантиссу A на 1 разряд вправо
        ROR     R1             ; Запомнить предпоследний разряд
        BR      167074$
167034$:CLR     R1             ; Последние разряды равны нулю
        CMP     R0,#172000     ; Разность порядков больше -24
        BGE     167052$        ; Нет
        CLR     R2             ; Мантисса B равна нулю
        CLR     R3
        BR      167074$
167052$:ASL     R0             ; Перенос порядка в младшие разряды
        SWAB    R0
        INCB    R0             ; +1 (для отлавливания 2 выдвинутых разрядов)
        BEQ     167066$
        ASHC    R0,R2          ; Сдвинуть мантиссу B вправо
        ROR     R1             ; Запомнить последний разряд
167066$:ASHC    #77,R2         ; Сдвинуть мантиссу B на 1 разряд вправо
        ROR     R1             ; Запомнить предпоследний разряд
167074$:ADD     R5,R3          ; (R2,R3) = (R2,R3) + (R4,R5)
        ADC     R2
        ADD     R4,R2
        BPL     167130$        ; Результат > 0
        NEG     R1             ; Изменить знак мантиссы
        ADC     R3
        ADC     R2
        NEG     R3
        ADC     R2
        NEG     R2
        MOV     167502$,R0     ; R0 = адрес буфера сохранения
        INC     26(R0)         ; Результат получился отрицательный
167130$:MOV     R3,R4          ; Проверка на нул. мантиссу (отсюда рез. 0)
        BIS     R1,R4
        BIS     R2,R4
        BEQ     167306$        ; Мантисса нулевая
167140$:CMP     R2,#400        ; Мантисса >= 1.0 ?
        BLO     167164$        ; Нет
        ROR     R2             ; Сдвиг мантиссы вправо на 1 разряд
        ROR     R3
        ROR     R1
        ADD     #200,@167502$  ; Порядок := порядок + 1
        BR      167140$
167164$:CMP     R2,#200        ; Мантисса < 0.5 ?
        BHIS    167210$        ; Нет
        ASL     R1             ; Сдвиг мантиссы влево на 1 разряд
        ROL     R3
        ROL     R2
        SUB     #200,@167502$  ; Порядок := порядок - 1
        BR      167164$
167210$:ROL     R1             ; Бит C := предпоследний разряд
        ADC     R3             ; Прибавить предпоследний разряд (округление)
        ADC     R2
167216$:CMP     R2,#400        ; Мантисса >= 1.0
        BLO     167242$        ; Нет
        ROR     R2             ; Сдвиг мантиссы вправо на 1 разряд
        ROR     R3
        ROR     R1
        ADD     #200,@167502$  ; Порядок := порядок + 1
        BR      167216$
167242$:CLR     R5             ; Регистр признаков = 0
        MOV     @167502$,R4    ; R4 = порядок
        BEQ     167334$        ; Порядок равен нулю (исчезновение порядка)
        BPL     167262$        ; Положительный порядок
        ROL     R4
        BPL     167340$        ; Переполнение порядка
        BR      167334$        ; Исчезновение порядка
167262$:MOV     167502$,R0     ; R0 = адрес буфера сохранения
        ROR     26(R0)         ; Результат отрицательный ?
        BCC     167300$        ; Нет
        BIS     #100000,R2     ; Установка знакового разряда
167300$:BIC     #200,R2        ; Сброс скрытого бита
        BIS     R4,R2          ; Установить поле порядка
167306$:CLR     R5             ; Регистр признаков = 0
        TST     R2             ; Установить ССП
        BNE     167320$        ; Результат не равен нулю
        BIS     #4,R5          ; Установить бит Z
167320$:BPL     167350$        ; Результат больше нуля
        BIS     #10,R5         ; Установить бит N
        BR      167350$
167330$:BIS     #1,R5          ; R5 = 13 (деление на нуль)
167334$:BIS     #10,R5         ; R5 = 12 (исчезновение порядка)
167340$:BIS     #2,R5          ; R5 = 2 (переполнение порядка)
        BIS     #100000,R5     ; Признак регистра ошибок
167350$:MOV     167502$,R0     ; R0 = адрес буфера сохранения
        BIC     #157,22(R0)    ; Сброс битов N,Z,V,C в сохр. ССП
        BISB    R5,22(R0)      ; Установка битов признаков из R5
        TST     R5             ; Произошла ошибка ?
        BPL     167402$        ; Нет
        MOV     #244,R5        ; R5 = адрес вект. прер. при ош. с числами ПЗ
        JMP     166006$
167402$:ADD     #4,@24(R0)     ; Прибавить 4 к содерж. рег. из кода опер.
        MOV     @24(R0),R5     ; R5 = адрес памяти для записи результата
        ADD     #4,R5
        MOV     20(R0),R4      ; R4 = сохр. значение СК
        MOV     22(R0),R0      ; R0 = сохр. значение ССП
        MTPS    #200           ; Запретить прерывания
        $MTPS$                 ; Установить РКСП
        MOV     R4,R0
        $MTPC$                 ; Установить РКСК
        MOV     R3,R0
        $MTPM$                 ; Запись младшей части результата
        MOV     R2,R0
        $MTPM$                 ; Запись старшей части результата
        MOV     167502$,R0     ; R0 = адрес буфера сохранения
        CMP     (R0)+,(R0)+
        MOV     (R0)+,R1       ; Восстановить регистры
        MOV     (R0)+,R2
        MOV     (R0)+,R3
        MOV     (R0)+,R4
        MOV     (R0)+,R5
        MOV     @R0,SP
        MOV     -14(R0),R0
167500$:$RUN$                  ; Продолжить программу
167502$:.WORD   167504$        ; Адрес буфера сохранения
; Буфер сохранения (текущий порядок,R0,R1,R2,R3,R4,R5,SP,PC,PS,указатель на
;  поле регистра из инструкции FP,знак результата,2 слова для промежуточного
;  хранения мантиссы)
167504$:.BLKW   16
; Подпрограмма исполнения пункта меню ЗАГРУЗКА [тестирование]
167540$:CLR     @#177656       ; Номер прохода
        CLR     @#177654       ; Число ошибок
        MOV     #177700,R1     ; R1 = адрес буфера регистрации ошибок
        MOV     #10,R2         ; Размер буфера
167560$:CLR     (R1)+          ; Цикл очистки буфера
        SOB     R2,167560$
        JSR     R4,163006$     ; Вывод заголовка на экран
        .WORD   170116$
167572$:CLV
        INC     @#177656       ; Увеличить номер прохода
        BVC     167610$        ; Нет переполнения
        MOV     #-1,@#177656   ; Номер прохода равен 65535
167610$:JSR     R4,163006$     ; Вывод надписи "ПРОХОД:"
        .WORD   170165$
        MOV     @#177656,R3    ; R3 = номер прохода
        CALL    170032$        ; Перевод номера прохода в строку символов
        JSR     R4,163006$     ; Вывод номера прохода на экран
        .WORD   177660
        MOV     #33,R0         ; Посылка ESC <276> (тест в области ПП)
        CALL    172632$
        MOV     #276,R0
        CALL    172632$
        CALL    170632$        ; Тестирование процессора (ЦП)
        TST     R0             ; Есть ошибки ?
        BEQ     167704$        ; Нет
        MOV     #16,R0         ; R0 = смещение в буфере регистрации ошибок
        CMP     #-1,177700(R0) ; Число ошибок достигло максимума ?
        BEQ     167704$        ; Да
        INC     177700(R0)     ; Увеличить счетчик числа ошибок
167704$:CLR     R4             ; R4 = 0 (начальный адрес памяти ЦП)
        MOV     #160000,R5     ; R5 = размер ОЗУ ЦП
        CALL    170224$        ; Тестирование памяти
        TST     R0             ; Есть ошибки ?
        BEQ     167742$        ; Нет
        MOV     #14,R0         ; R0 = смещение в буфере регистрации ошибок
        CMP     #-1,177700(R0) ; Число ошибок достигло максимума ?
        BEQ     167742$        ; Да
        INC     177700(R0)     ; Увеличить счетчик числа ошибок
167742$:CALL    172614$        ; Ожид. симв. с кодом 177(8)(ПП кончил тест)
        CLR     @#177654       ; Общее число ошибок = 0
        MOV     #177700,R1     ; R1 = адрес буфера регистрации ошибок
        MOV     #10,R2         ; R2 = размер буфера
        CLV
167764$:ADD     (R1)+,@#177654 ; Цикл получения общей суммы
        BVC     170002$        ; Нет переполнения
        MOV     #-1,@#177654   ; Общее число ошибок = 65535
        BR      170004$
170002$:SOB     R2,167764$
170004$:JSR     R4,163006$     ; Вывод надписи "ОШИБОК:"
        .WORD   170204$
        MOV     @#177654,R3    ; R3 = число ошибок
        CALL    170032$        ; Перевод числа ошибок в строку символов
        JSR     R4,163006$     ; Вывод числа ошибок на экран
        .WORD   177660
        BR      167572$
; Подпрограмма перевода 16-разрядного числа в его ASCII-представление
170032$:MOV     #177660,R0     ; R0 = адрес буфера приема символов
        MOV     #6,R2          ; R2 = размер буфера
170042$:MOVB    #40,(R0)+      ; Инициализация буфера (заполнение пробелами)
        SOB     R2,170042$
        CLRB    @R0            ; Отметить конец буфера
170052$:CLR     -(SP)          ; Остаток от деления равен 0 (инициализация)
        MOV     #16.,R1        ; R1 = число разрядов
170060$:ASL     R3             ; Цикл дел. на 10, частное в R3, остаток в @SP
        ROL     @SP
        CMP     @SP,#10.
        BMI     170100$
        SUB     #10.,@SP
        INC     R3
170100$:SOB     R1,170060$
        ADD     #'0,@SP        ; Преобразование из BIN в ASCII
        MOVB    (SP)+,-(R0)    ; Занести символ в буфер
        TST     R3             ; Деление окончено ?
        BNE     170052$        ; Нет
        RETURN
170116$:.BYTE   33,'H,33,'J,33,'Y,'%,':,33,244
        .ASCII  <16>/t e s t i r o w a n i e/
        .BYTE   33,277,244,17,0
170165$:.ASCIZ  <33>/Y(5/<16>/prohod: /<17>
170204$:.ASCIZ  <16>/    o{ibok: /<17>
        .EVEN
; Подпрограмма тестирования оперативного запоминающего устройства
170224$:MOV     R4,R1          ; R1 = начальный адрес ОЗУ
        CLR     R3
170230$:MOV     R1,R0          ; R0 = текущий адрес
        TST     R3             ; Прямой адрес(0), инверсный адрес(<>0)
        BEQ     170240$
        COM     R0
170240$:MOV     R0,(R1)+       ; Записать в ячейку ее адрес(прям. или инв.)
        CMP     R1,R5          ; Достигли конца ?
        BLO     170230$        ; Нет
170246$:CMP     R0,-(R1)       ; Содержимое ячейки равно ее адресу
        BEQ     170260$        ; Да
        MOV     #1,R0          ; Ошибка
        RETURN
170260$:MOV     R1,R0          ; R0 = текущий адрес
        SUB     #2,R0          ; На одну ячейку назад
        TST     R3             ; Прямой или инверсный адрес ?
        BEQ     170274$        ; Прямой
        COM     R0
170274$:CMP     R1,R4          ; Достигли начала ?
        BHI     170246$        ; Нет
        COM     R3             ; Перейти на инверсный адрес
        BNE     170230$        ; Произвести тест с инверсным адресом
        MOV     #377,-12(SP)   ; Будет заполняться младший байт
        MOV     R4,R3          ; R3 = начальный адрес
170314$:CLR     -6(SP)
        MOV     R3,-10(SP)     ; Начальный адрес
        MOV     R3,R2
        BIS     #17776,R2
        TST     (R2)+          ; Плюс 8 КБайт
        CMP     R5,R2          ; Достигли конца ?
        BHIS    170342$        ; Нет
        MOV     R5,R2          ; R2 = конечный адрес
170342$:MOV     R3,-14(SP)     ; Текущий адрес
        MOV     -10(SP),R1     ; R1 = начальный адрес
170352$:MOV     -12(SP),R0     ; R0 = образец заполнения
        CMP     R1,R3
        BNE     170370$
        ADD     #200,R3        ; Плюс 128 байт (128 байт 1..10..0,0..01..1)
        SWAB    R0             ; Изменить байты образца
170370$:BITB    #1,-6(SP)      ; Делать запись
        BNE     170402$        ; Нет
        MOV     R0,@R1         ; Записать в ячейку
170402$:CMP     R0,@R1         ; Совпадает ?
        BEQ     170414$        ; Да
        MOV     #3,R0          ; Ошибка
        RETURN
170414$:ADD     #2,R1          ; Перейти к следующей ячейке
        CMP     R1,R2          ; Достигнут конец 8-КБайтной страницы ?
        BLO     170352$        ; Нет
        INCB    -6(SP)         ; Переключить режим записи/проверки
        MOV     -14(SP),R3     ; R3 = текущий адрес
        BITB    #1,-6(SP)      ; Какой режим ?
        BNE     170342$        ; Проверка
        TST     (R3)+          ; Текущий адрес + 2
        CMP     R3,R2          ; Конец страницы ?
        BHIS    170460$        ; Да
        TSTB    -6(SP)         ; Сделано 128 проходов ?
        BPL     170342$        ; Нет
170460$:MOV     -10(SP),R3     ; R3 = текущий адрес
        SWAB    -12(SP)        ; Обменять байты образца
        BEQ     170342$        ; Младший байт = 0 (для второго прохода)
        MOV     R2,R3          ; Текущий адрес = начало след. 8-КБайтной стр.
        CMP     R2,R5          ; Достигнут конец ?
        BLO     170314$        ; Нет
        MOV     #377,-12(SP)   ; Образец заполнения
170506$:MOV     R4,R1          ; R1 = начальный адрес
        MOV     -12(SP),R0     ; R0 = образец заполнения
170514$:MOV     R0,(R1)+       ; Записать в ячейку
        CMP     R1,R5          ; Достигнут конец ?
        BLO     170514$        ; Нет
        MOV     R4,R1          ; R1 = начальный адрес
170524$:CMP     R0,@R1         ; Сравнить содержимое ячейки с образцом
        BEQ     170536$        ; Равно
        MOV     #2,R0          ; Ошибка
        RETURN
170536$:ADD     #2,R1          ; Перейти к следующей ячейке
        CMP     R1,R5          ; Достигнут конец ?
        BLO     170524$        ; Нет
        CALL    170614$        ; Задержка
        MOV     -12(SP),R0     ; R0 = образец заполнения
        MOV     R4,R1          ; R1 = начальный адрес
170560$:CMP     R0,@R1         ; Сравнить содержимое ячейки с образцом
        BEQ     170572$        ; Равно
        MOV     #3,R0          ; Ошибка
        RETURN
170572$:ADD     #2,R1          ; Перейти к следующей ячейке
        CMP     R1,R5          ; Достигнут конец ?
        BLO     170560$        ; Нет
        SWAB    -12(SP)        ; Обменять байты образца
        BEQ     170506$        ; На второй проход
        CLR     R0             ; Нет ошибок
        RETURN
; Подпрограмма реализации задержки
170614$:MOV     #1000.,R2
170620$:MOV     #1000.,R3
170624$:SOB     R3,170624$
        SOB     R2,170620$
        RETURN
; Подпрограмма тестирования процессора
170632$:CCC                    ; Сбросить все биты признаков
        BCS     170654$        ; C=1
        BVS     170654$        ; V=1
        BEQ     170654$        ; Z=1
        BMI     170654$        ; N=1
        BLT     170654$        ; N<>V
        BLE     170654$        ; (N<>V) or Z=1
        BLOS    170654$        ; Z=1 or C=1
        BHI     170660$        ; Z=0 and C=0
170654$:JMP     172604$        ; Ошибка
170660$:SEV                    ; Установить V и N
        SEN
        BVC     170674$        ; V=0
        BLT     170674$        ; N<>V
        BLE     170674$        ; (N<>V) or Z=1
        BGE     170700$        ; N=V
170674$:JMP     172604$        ; Ошибка
170700$:SEZ                    ; Установить Z и C
        SEC
        BNE     170714$        ; Z=0
        BGT     170714$        ; Z=0 and (N=V)
        BHI     170714$        ; Z=0 and C=0
        BLE     170720$        ; (N<>V) or Z=1
170714$:JMP     172604$        ; Ошибка
170720$:MOV     SP,R3
        TST     -(R3)          ; R3 = R3 - 2
        CLR     @R3
        MOV     R3,R0
        TST     -(R3)          ; R3 = R3 - 2
        MOV     R0,@R3         ; (R3) = адрес ячейки с нулевым содерж.
        MOV     R3,R4
        CCC                    ; Очистить все биты признаков
        TST     @(R3)+         ; В ячейке нуль ?
        BEQ     170750$        ; Да
        JMP     172604$        ; Ошибка
170750$:SEC                    ; Установка бита C
        ROR     @-(R3)         ; Уст. ст. разр. в 1,выдв. млад. =0 (10...0))
        BCS     170762$        ; C=1
        BVC     170762$        ; V=0
        BMI     170766$        ; N=1
170762$:JMP     172604$        ; Ошибка
170766$:CCC                    ; Очистить все биты признаков
        ASR     @(R4)+         ; Оставить старший бит (110...0)
        BVC     170776$        ; V=0
        BMI     171002$        ; N=1
170776$:JMP     172604$        ; Ошибка
171002$:CLN                    ; Очистить бит N
        ASL     @(R3)+         ; Сдвиг влево (10...0)
        BCC     171014$        ; C=0
        BVS     171014$        ; V=1
        BMI     171020$        ; N=1
171014$:JMP     172604$        ; Ошибка
171020$:SCC                    ; Установить все биты признаков
        DEC     @-(R4)         ; Минус 1 (01...1)
        BHIS    171034$        ; C=0
        BVC     171034$        ; V=0
        BEQ     171034$        ; Z=1
        BPL     171040$        ; N=0
171034$:JMP     172604$        ; Ошибка
171040$:NEG     @-(R3)         ; Смена знака (10...01)
        BCC     171050$        ; C=0
        BVS     171050$        ; V=1
        BMI     171054$        ; N=1
171050$:JMP     172604$        ; Ошибка
171054$:SEV                    ; Установка бита V
        COM     @(R4)+         ; Инверсия (01...10)
        BCC     171064$        ; C=0
        BVC     171070$        ; V=0
171064$:JMP     172604$        ; Ошибка
171070$:INC     @(R3)+         ; Плюс 1 (01...1)
        BHIS    171076$        ; C=0
        BPL     171102$        ; N=0
171076$:JMP     172604$        ; Ошибка
171102$:ADC     @-(R4)         ; Прибавление переноса (10...0)
        BCS     171112$        ; C=1
        BVC     171112$        ; V=0
        BMI     171116$        ; N=1
171112$:JMP     172604$        ; Ошибка
171116$:CCC                    ; Очистить все биты признаков
        ROL     @(R4)+         ; Сдвиг влево (0...0)
        BCC     171130$        ; C=0
        BVC     171130$        ; V=0
        BEQ     171134$        ; Z=1
171130$:JMP     172604$        ; Ошибка
171134$:INC     @-(R3)         ; Плюс 1 (0...01)
        SBC     @-(R4)         ; Вычитание переноса (0...0)
        BCS     171144$        ; C=1
        BEQ     171150$        ; Z=1
171144$:JMP     172604$        ; Ошибка
171150$:MOV     SP,R2
        TST     -(R2)          ; R2 = R2 - 2
        MOV     R2,R0
        CLR     @R0            ; Очистка (0...0)
        TST     -(R2)          ; R2 = R2 - 4
        TST     -(R2)
        MOV     R0,(R2)+       ; SP-2
        INC     R0
        MOV     R0,(R2)+       ; SP-1
        MOV     R2,R0          ; SP-2
        MOV     R2,R1          ; SP-2
        COMB    @-(R2)         ; Инверсия (High 1...1)
        BCC     171204$        ; C=0
        BMI     171210$        ; N=1
171204$:JMP     172604$        ; Ошибка
171210$:TSTB    @-(R2)         ; Проверка (Low 0...0)
        BEQ     171220$        ; Z=1
        JMP     172604$        ; Ошибка
171220$:SEV                    ; Установка бита V
        ASRB    @-(R1)         ; Сдвиг вправо (High 1...1)
        BCC     171232$        ; C=0
        BVS     171232$        ; V=1
        BMI     171236$        ; N=1
171232$:JMP     172604$        ; Ошибка
171236$:INCB    @(R2)+         ; Плюс 1 (Low 0...01)
        BCC     171244$        ; C=0
        BPL     171250$        ; N=0
171244$:JMP     172604$        ; Ошибка
171250$:CLC                    ; Сбросить бит C
        RORB    @-(R1)         ; Сдвиг вправо (Low 0...0)
        BCC     171264$        ; C=0
        BVC     171264$        ; V=0
        BNE     171264$        ; Z=0
        BPL     171270$        ; N=0
171264$:JMP     172604$        ; Ошибка
171270$:ASLB    @(R2)+         ; Сдвиг влево (High 1...10)
        BCC     171300$        ; C=0
        BVS     171300$        ; V=1
        BMI     171304$        ; N=1
171300$:JMP     172604$        ; Ошибка
171304$:ADCB    @-(R2)         ; Прибавление переноса (High 1...1)
        BCS     171312$        ; C=1
        BMI     171316$        ; N=1
171312$:JMP     172604$        ; Ошибка
171316$:SCC                    ; Установка всех битов признаков
        ROLB    @(R1)+         ; Сдвиг влево (Low 0...01)
        BLOS    171330$        ; C=1 or Z=1
        BVS     171330$        ; V=1
        BPL     171334$        ; N=0
171330$:JMP     172604$        ; Ошибка
171334$:SWAB    @-(R2)         ; Обменять байты (High 0...01  Low 1...1)
        BMI     171344$        ; N=1
        JMP     172604$        ; Ошибка
171344$:SEC                    ; Установка бита C
        SBCB    @(R1)+         ; Вычитание переноса (High 0...0)
        BCS     171354$        ; C=1
        BEQ     171360$        ; Z=1
171354$:JMP     172604$        ; Ошибка
171360$:NEGB    @(R2)+         ; Смена знака (Low 0...01)
        DECB    @-(R2)         ; Минус 1 (Low 0...0)
        BCC     171370$        ; C=0
        BEQ     171374$        ; Z=1
171370$:JMP     172604$        ; Ошибка
171374$:MOV     SP,R0          ; R0 = SP
        TST     -(R0)          ; R0 = R0 - 2
        MOV     R0,R1          ; SP-2
        CMP     -(R1),-(R1)    ; SP-6
        MOV     R0,@R1         ; -6(SP) = ADDR(-2(SP))
        MOV     R1,R2          ; SP-6
        MOV     R0,R4          ; SP-2
        TST     -(R0)          ; SP-4
        MOV     R0,R3          ; SP-4
        MOV     R0,-(R2)       ; R2 = SP-8 -8(SP) = ADDR(-4(SP))
        CLR     @R3            ; -4(SP) = 0
        CLR     @R4            ; -2(SP) = 0
        SCC                    ; Установка битов N,V,C
        CLZ
        SUB     @(R2)+,@(R1)+  ; -2(SP)=-2(SP) - -4(SP)=0
        BLO     171440$        ; C=1
        BVS     171440$        ; V=1
        BEQ     171444$        ; Z=1
171440$:JMP     172604$        ; Ошибка
171444$:BIS     #100000,@-(R2) ; -4(SP) = 100000
        ADD     #1,@-(R1)      ; -2(SP) = 1
        SUB     @(R2)+,@(R1)+  ; -2(SP) = 1 - 100000 = 100001
        BHIS    171464$        ; C=0
        BVC     171464$        ; V=0
        BMI     171470$        ; N=1
171464$:JMP     172604$        ; Ошибка
171470$:NEG     @R4            ; -2(SP) = 077777
        BIT     @-(R2),@-(R1)  ; 100000 and 077777 = 0
        BEQ     171502$        ; Z=1
        JMP     172604$        ; Ошибка
171502$:CMP     @(R2)+,@(R1)+  ; 100000 - 077777 = 1 (C=1,V=1,N=0,Z=0)
        BVS     171512$        ; V=1
        JMP     172604$        ; Ошибка
171512$:COM     @-(R2)         ; Инверсия -4(SP) = 077777
        CCC                    ; Очистить все биты признаков
        ADD     @(R2)+,@-(R1)  ; -2(SP) = 077777 + 077777 = 177776
        BVC     171524$        ; C=0
        BMI     171530$        ; N=1
171524$:JMP     172604$        ; Ошибка
171530$:SEC                    ; Установка бита C
        BIC     @-(R2),@(R1)+  ; -2(SP) = 177776 and not 77777 = 100000
        BCC     171540$        ; C=0
        BMI     171544$        ; N=1
171540$:JMP     172604$        ; Ошибка
171544$:COM     @-(R1)         ; Инверсия -2(SP) = 77777
        CMP     @(R2)+,@(R1)+  ; 077777 - 077777 = 0 (C=0,V=0,N=0,Z=1)
        BEQ     171556$        ; Z=1
        JMP     172604$        ; Ошибка
171556$:MOV     SP,R0          ; R0 = SP
        TST     -(R0)          ; SP-2
        MOV     R0,R3          ; SP-2
        MOV     R3,R1          ; SP-2
        TST     -(R3)          ; SP-4
        MOV     R0,-(R3)       ; -6(SP) = ADDRB(-1(SP))
        INC     @R3
        MOV     R0,-(R3)       ; -8(SP) = ADDRB(-2(SP))
        MOV     R3,R4          ; SP-8
        TST     -(R0)          ; SP-4
        MOV     R0,-(R4)       ; -10(SP) = ADDRB(-3(SP))
        INC     @R4
        MOV     R0,-(R4)       ; -12(SP) = ADDRB(-4(SP))
        SEC                    ; Установить бит C
        MOV     #177001,@(R4)+ ; -4(SP) = 1     -3(SP) = 376
        MOVB    #200,@(R4)+    ; -3(SP) = 200
        MOVB    @-(R4),@(R3)+  ; -2(SP) = 200
        MOVB    @-(R4),@(R3)+  ; -1(SP) = 1
        BCS     171634$        ; C=1
        JMP     172604$        ; Ошибка
171634$:CMP     #600,@R1       ; 600 - 600 = 0 (C=0,V=0,N=0,Z=1)
        BEQ     171646$        ; Z=1
        JMP     172604$        ; Ошибка
171646$:CMP     -(R3),-(R3)    ; SP-8
        BISB    @(R4)+,@(R3)+  ; -2(SP) = 200 or 1 = 201
        BISB    @(R4)+,@(R3)+  ; -1(SP) = 1 or 200 = 201
        CMP     #100601,@R1    ; 100601 - 100601 = 0 (C=0,V=0,N=0,Z=1)
        BEQ     171666$        ; Z=1
        JMP     172604$        ; Ошибка
171666$:BICB    @-(R4),@-(R3)  ; -1(SP) = 201 and not 200 = 1
        BICB    @-(R4),@-(R3)  ; -2(SP) = 201 and not 1 = 200
        BITB    @(R4)+,@(R3)+  ; 1 and 200 = 0
        BNE     171702$        ; Z=0
        BITB    @-(R4),@(R3)+  ; 1 and 1 = 1
        BNE     171706$        ; Z=1
171702$:JMP     172604$        ; Ошибка
171706$:CMPB    @(R4)+,@-(R3)  ; 1 - 1 = 0 (C=0,V=0,N=0,Z=1)
        BNE     171716$        ; Z=0
        CMPB    @(R4)+,@-(R3)  ; 1 - 200 = 201 (C=1,V=1,N=1,Z=0)
        BEQ     171722$        ; Z=1
171716$:JMP     172604$        ; Ошибка
171722$:MOV     PC,R0          ; R0 = 171724
        ADD     #171736$-.,R0  ; R0 = 171736
        SCC                    ; Установить все биты признаков
        JMP     @R0            ; PC = 171736
171734$:BR      171742$
171736$:CLN                    ; Сбросить бит N
        BR      171734$
171742$:BCC     171752$        ; C=0
        BVC     171752$        ; V=0
        BNE     171752$        ; Z=0
        BPL     171756$        ; N=0
171752$:JMP     172604$        ; Ошибка
171756$:CLR     R2
        MOV     PC,R4          ; R4 = 171762
        MOV     R4,R0          ; R0 = 171762
        BR      171772$
171766$:COM     R2             ; R2 = 177777
        BR      172000$
171772$:CMP     (R4)+,(R4)+    ; R4 = 171766
        TST     (R4)+          ; R4 = 171770
        JMP     -(R4)          ; PC = 171766    R4 = 171766
172000$:INC     R2             ; R2 = 0
        BNE     172012$        ; Z=0
        CMP     (R0)+,(R0)+    ; R0 = 171766
        CMP     R0,R4          ; 171766 - 171766 = 0 (C=0,V=0,N=0,Z=1)
        BEQ     172016$        ; Z=1
172012$:JMP     172604$        ; Ошибка
172016$:MOV     PC,R2          ; R2 = 172020
        ADD     #172044$-.,R2  ; R2 = 172044
        SCC                    ; Установить биты N,C,Z
        CLV
        JSR     R1,@R2         ; PC = 172044
        TST     R2
        BEQ     172066$        ; Z=1
        JMP     172604$
172042$:RTS     R1
172044$:BCC     172060$        ; C=0
        BVS     172060$        ; V=1
        BNE     172060$        ; Z=0
        BPL     172060$        ; N=0
        CLR     R2
        BR      172042$
172060$:TST     (SP)+
        JMP     172604$        ; Ошибка
172066$:MOV     SP,R4
        TST     -(R4)          ; SP-2
        CLR     R3
        MOV     #5,R2
        MOV     #2,@R4
        SCC                    ; Установить все признаки
        MUL     @R4,R2         ; (R2,R3) = 5 * 2 = 12 (R2 = 0) (R3 = 12)
        BMI     172116$        ; N=1
        BLOS    172116$        ; Z=1 or C=1
        BVC     172122$        ; V=0
172116$:JMP     172604$        ; Ошибка
172122$:CMP     #12,R3         ; R3=12 ?
        BEQ     172134$        ; Да
        JMP     172604$        ; Ошибка
172134$:TST     R2             ; R2=0 ?
        BEQ     172144$
        JMP     172604$        ; Ошибка
172144$:CLR     R3
        MOV     #125252,R2
        MOV     #2,@R4
        MUL     @R4,R2         ; (R2,R3)=125252*2=37777652524(R2=-1)(R3=52524)
        BCC     172170$        ; C=0
        BPL     172170$        ; N=0
        BVS     172170$        ; V=1
        BNE     172174$        ; Z=0
172170$:JMP     172604$        ; Ошибка
172174$:CMP     #-1,R2         ; R2=-1 ?
        BEQ     172206$        ; Да
        JMP     172604$        ; Ошибка
172206$:CMP     #52524,R3      ; R3=52524      ?
        BEQ     172220$        ; Да
        JMP     172604$        ; Ошибка
172220$:MOV     #1,@R4
        MOV     #125252,R2
        CCC                    ; Установить биты Z,N
        SEZ
        SEN
        ASH     @R4,R2         ; R2 = 125252 << 1 = 52524
        BMI     172250$        ; N=1
        BEQ     172250$        ; Z=1
        BVC     172250$        ; V=0
        BCS     172254$        ; C=1
172250$:JMP     172604$        ; Ошибка
172254$:CMP     #52524,R2      ; R2 = 52524 ?
        BEQ     172266$        ; Да
        JMP     172604$        ; Ошибка
172266$:MOV     #-1,@R4
        MOV     #52525,R1
        ASH     @R4,R1         ; R1 = 52525 >> 1 = 25252
        CMP     R1,#25252      ; R1 = 25252 ?
        BEQ     172312$        ; Да
        JMP     172604$        ; Ошибка
172312$:CLR     R2
        MOV     #20,@R4
        MOV     #125252,R3
        CCC                    ; Установка битов Z,C
        SEZ
        SEC
        ASHC    @R4,R2         ; (R2,R3)=125252<<20=25252400000
        BPL     172344$        ; N=0
        BEQ     172344$        ; Z=1
        BVC     172344$        ; V=0
        BCC     172350$        ; C=0
172344$:JMP     172604$        ; Ошибка
172350$:CMP     #125252,R2     ; R2 = 125252 ?
        BEQ     172362$        ; Да
        JMP     172604$        ; Ошибка
172362$:TST     R3             ; R3 = 0 ?
        BEQ     172372$        ; Да
        JMP     172604$        ; Ошибка
172372$:CLR     R3
        MOV     #-20,@R4
        MOV     #125252,R2
        CLN                    ; Установка Z,V,C
        SEZ
        SEV
        SEC
        ASHC    @R4,R2         ; (R2,R3)=25252400000>>20=37777725252
        BPL     172424$        ; N=0
        BLOS    172424$        ; Z=1 or C=1
        BVC     172430$        ; C=0
172424$:JMP     172604$        ; Ошибка
172430$:CMP     #-1,R2         ; R2=-1 ?
        BEQ     172442$        ; Да
        JMP     172604$        ; Ошибка
172442$:CMP     #125252,R3     ; R3=125252 ?
        BEQ     172454$        ; Да
        JMP     172604$        ; Ошибка
172454$:MOV     #52525,@R4
        CLR     R2
        MOV     #52525,R3
        SCC                    ; Установить все биты признаков
        DIV     @R4,R2         ; (R2,R3) = 52525 / 52525 = (1,0)
        BMI     172500$        ; N=1
        BLOS    172500$        ; Z=1 or C=1
        BVC     172504$        ; V=0
172500$:JMP     172604$        ; Ошибка
172504$:CMP     R2,#1          ; R2 = 1 ?
        BEQ     172516$        ; Да
        JMP     172604$        ; Ошибка
172516$:TST     R3             ; R3 = 0 ?
        BEQ     172526$        ; Да
        JMP     172604$        ; Ошибка
172526$:MOV     #157777,R2
        MOV     #100001,R3
        MOV     #100000,@R4
        SCC                    ; Установить все биты признаков
        DIV     @R4,R2         ; (R2,R3)=33777700001/100000=(40000,100001)
        BMI     172554$        ; N=1
        BLOS    172554$        ; Z=1 or C=1
        BVC     172560$        ; V=0
172554$:JMP     172604$        ; Ошибка
172560$:CMP     R2,#40000      ; R2 = 40000 ?
        BEQ     172572$        ; Да
        JMP     172604$        ; Ошибка
172572$:CMP     R3,#100001     ; R3 = 100001 ?
        BNE     172604$        ; Z=0 (ошибка)
        CLR     R0             ; Ошибок нет
        RETURN
172604$:MOV     #1,R0          ; Есть ошибки
        RETURN
172612$:.WORD   414            ; Конец стека пультового отладчика
; Подпрограмма ввода символа с ожиданием (для ПП)
172614$:EMT     22             ; Ввод символа
        RETURN
        .WORD   0,0,0,0,0
; Подпрограмма вывода символа на экран (для ПП)
172632$:EMT     42             ; Вывод символа
        RETURN
        .WORD   0,0,0,0,0,0,0,0,0
; Указатели на ОЗУ пультового отладчика,адрес выводимой надписи,адрес открытой
; ячейки,разрешение/запрет вывода надписей. Начальное значение PS и SP.
; Объем ОЗУ в словах. Эти данные для ПП.
172660$:.WORD   450
172662$:.WORD   500
172664$:.WORD   472
172666$:.WORD   504
172670$:.WORD   0
172672$:.WORD   100000
172674$:.WORD   40000

; Начальная инициализация и вывод ошибок стартового теста
172676$:MOV     #2000,SP
        ASLB    R0
        ASLB    R0
        MOV     R0,-(SP)
        CALL    173502$        ; Полн. иниц. (уст.вект.прер. и иниц. устр.)
        MOV     (SP)+,R2       ; R2 = слово ошибок
        MOV     @#177060,R0    ; R0 = данные К0 (терминал)(слово ошибок ЦП)
        CMP     R0,#2
        BHI     172742$
        BIS     R0,R2          ; Объединить ошибки ПП и ЦП
        BEQ     172746$        ; Нет ошибок
        CALL    172764$        ; Вывод ошибок на экран
        BR      172746$
172742$:CALL    117136$        ; Поместить символ в буфер терминала
172746$:MOV     #2,@#7042      ; Передача кодов клавиатуры по каналу 0
        MTPS    #0             ; Разрешить прерывания
        JMP     174152$
; Подпрограмма вывода результатов стартового теста
172764$:JSR     R5,117204$     ; Вывод заголовка
        .WORD   173060$
        MOV     #173036$,R3    ; Адрес массива адресов надписей об ошибках
        BR      173004$
173000$:JSR     R5,117206$     ; Вывод сообщения об ошибке на экран
173004$:MOV     (R3)+,R1       ; R1 = адрес сообщения об ошибке
        ASRB    R2
        BCS     173000$        ; Есть ошибка
        BNE     173004$        ; Еще есть ошибки
        MOV     #173046$,R3    ; Адрес массива адресов об ошибках ПЗУ
        MOV     (R3)+,R1       ; R1 = адрес сообщения об ошибке
        SWAB    R2
        BNE     173000$        ; Ошибки есть
        JSR     R5,117204$     ; Вывод ESC <270> (пауза)
        .WORD   173246$
        RETURN
; Массив адресов сообщений об ошибках
173036$:.WORD   173113$,173131$,173153$,173171$
; Массив адресов сообщений об ошибках ПЗУ
173046$:.WORD   173213$,173232$,173235$,173240$,173243$
173060$:.BYTE   15,12,40,40,33,244
        .ASCII  /СТАРТОВЫЙ ТЕСТ/
        .BYTE   33,277,244,15,12,12,0
173113$:.ASCIZ  /- ошибка ЦП/<15><12>
173131$:.ASCIZ  /- ошибка ОЗУ ЦП/<15><12>
173153$:.ASCIZ  /- ошибка ПП/<15><12>
173171$:.ASCIZ  /- ошибка ОЗУ ПП/<15><12>
173213$:.ASCIZ  /- ошибка ПЗУ  /
173232$:.ASCIZ  /1 /
173235$:.ASCIZ  /2 /
173240$:.ASCIZ  /3 /
173243$:.ASCIZ  /4 /
173246$:.BYTE   33,270,0
        .EVEN
; Подпрограмма перекачки пультового отладчика в системное ОЗУ ЦП
173252$:MOV     #<160000/2>&77777,@#177010; Адрес начала системного ОЗУ ЦП
        MOV     #160000,R1     ; Адрес начала пультового отладчика
        MOV     #5305,R0       ; Размер перек. данных (160000 - 172611)
173270$:MOV     (R1)+,@#177014 ; Цикл перекачки
        INC     @#177010
        SOB     R0,173270$
        MOV     #173356$,R1    ; Адрес подпрограмм для ЦП
        MOV     #44,R0         ; Размер (173356 - 173465)
173312$:MOV     (R1)+,@#177014 ; Цикл перекачки в 172612 - 172721
        INC     @#177010
        SOB     R0,173312$
        MOV     @#177716,@#177014; (172722) = системный регистр управления
        MOV     #173466$,R1    ; Адр. мас. для уст. знач. ССП в вект.прер.
173336$:MOV     (R1)+,@#177010 ; Цикл установки
        MOV     #600,@#177014
        TST     @R1            ; Конец массива ?
        BNE     173336$        ; Нет
        RETURN
173356$:.WORD   160014$        ; Конец стека пультового отладчика (для ЦП)
                               ; Ее адрес в СОЗУ ЦП - 172612.
; Подпрограмма ввода символа с ожиданием (для ЦП). Адрес в СОЗУ ЦП - 172614.
173360$:MOV     #177560,R5     ; R5 = адрес регистра сост. К0 (клавиатура)
        $MFPM$                 ; Чтение регистра состояния
        TSTB    R0             ; Есть символ для чтения ?
        BPL     173360$        ; Нет
        $MFPM$                 ; Чтение символа
        RETURN
; Подпрограмма вывода символа на экран (для ЦП). Адрес в СОЗУ ЦП - 172632.
173376$:MOV     R0,-(SP)       ; Сохранить код символа в стеке
173400$:MOV     #177564,R5     ; R5 = адрес регистра сост. К0 (терминал)
        $MFPM$                 ; Чтение регистра состояния
        TSTB    R0             ; Можно посылать данные ?
        BPL     173400$        ; Нет
        MOV     (SP)+,R0       ; R0 = код символа
        MOV     #177566+2,R5   ; R5 = адрес рег. данных (терминал) + 2
        $MTPM$                 ; Посылка кода символа по К0
        RETURN
; Указатели на ОЗУ пультового отладчика,адрес выводимой надписи,адрес открытой
; ячейки,разрешение/запрет вывода надписей. Начальное значение PS и SP.
; Объем ОЗУ в словах. Эти данные для ЦП. Их адрес в СОЗУ ЦП - 172660.
173424$:.WORD   160050,160100,160072,160104,200,1000,70000
; Подпрограмма выбора режима работы (ЦП). Ее адрес в сист.ОЗУ ЦП - 172676.
173442$:CALL    173376$        ; Посылка по каналу 0 результатов теста
173446$:TST     @#163772       ; Ожидание ответа от ПП
        BEQ     173446$
        BPL     173462$        ; Обнаружен контроллер НГМД
        JMP     @#162440$      ; На загрузку из сети
173462$:JMP     @#160744       ; На вывод меню ЗАГРУЗКА
; Адреса знач. ССП в векторах прер. ЦП (в формате загрузки в рег.адреса)
173466$:.WORD   70001,70003,70075,70077,70137,0
; Подпрограмма проведения инициализации
173502$:CALL    107754$        ; Программная инициализация драйвера терминала
        MOV     #RETURN,@#0    ; Установка векторов внутренних прерываний
        MOV     #600,R0
        MOV     #160200$,@#4
        MOV     R0,@#6
        MOV     #160210$,@#10
        MOV     R0,@#12
        MOV     #160220$,@#24
        MOV     R0,@#26
        CALL    103564$        ; Программная инициализация драйв. клавиатуры
        CALL    126136$        ; Программная иниц. драйвера магнитофона
        CALL    135456$        ; Программная иниц. драйвера граф. дисплея
        CALL    136004$        ; Программная иниц. драйвера принтера
        CALL    100000$        ; Начальные данные для меню УСТАНОВКА
        CALL    173744$        ; Уст.вект.прер.периферийных устройств
        MOV     SP,@#7040      ; Сохранить SP
        MOV     #173632$,@#4   ; Уст.вект.ошибки обращ. к каналу
        CALL    130712$        ; Программная иниц. драйвера дисковода
        MOV     #1,R0          ; Обнаружен контроллер НГМД
        BR      173642$
173632$:MOV     @#7040,SP      ; Восстановить SP
        MOV     #-1,R0         ; Контроллер НГМД не обнаружен
173642$:MOV     #<163772$/2>&77777,@#177010; Адрес ключа о присут. НГМД
        MOV     R0,@#177014    ; Передать ключ
        MOV     R0,@#7044
        BIC     #1400,@#177054 ; Включить сетевой таймер в ЦП и ПП
        BIS     #100,@#177066  ; Разрешение прерывания по RESET ЦП
        CLR     @#177712       ; Очистить буферный регистр таймера
        MOV     #1,@#177710    ; Пуск программируемого таймера
173706$:MOV     #23660,R0      ; R0 = адрес начала ОЗУ ПП пользователя
        CLR     (R0)+          ; Блок свободен
        CLR     (R0)+          ; Ссылка на предыдущий блок
        MOV     #54104,@R0     ; Размер свободного блока
        ADD     (R0)+,R0       ; Переход к фиктивной области
        INC     @R0            ; Признак занятой области
        RETURN
; Подпрограмма очистки блока памяти
173730$:CLR     R0             ; Заполняемое значение (0)
        MOV     (R5)+,R1       ; Адрес начала
        MOV     (R5)+,R2       ; Размер в словах
173736$:MOV     R0,(R1)+       ; Цикл очистки
        SOB     R2,173736$
        RTS     R5
; Подпрограмма установки векторов прерываний периферийных устройств
173744$:MOV     #174270$,@#30  ; Вектор прерывания команды EMT
        CLR     @#32
        MOV     #174334$,@#34  ; Вектор прерывания команды TRAP
        MOV     #200,@#36
        MOV     #174612$,@#100 ; Вектор прерывания сетевого таймера
        MOV     #200,@#102
        MOV     #175754$,@#330 ; Вектор прерывания К1 (приемник)
        BIS     #2,@#177066    ; Разрешить прерывания по К1 (приемник)
        MOV     #175762$,@#340 ; Вектор прерывания К2 (приемник)
        MOV     #200,@#342
        BIS     #4,@#177066    ; Разрешить прерывания по К2 (приемник)
        CLR     @#23202        ; Счетчик принятых байтов по К2
        MOV     #100/2,@#177010; Установить вектор прерывания сетевого
        MOV     #104,@#177014  ; таймера канала ЦП
        INC     @#177010
        MOV     #200,@#177014
        INC     @#177010
        MOV     #RTI,@#177014
        MOV     #7777,@#7052
        CALL    176422$        ; Инициализация программируемого таймера
        MOV     #176130$,@#314 ; Вект. прер. по команде RESET в канале ЦП
        MOV     #200,@#316
        INC     @#7102         ; Индикатор вызова фиктивной подпрограммы
        MOV     #174222$,@#7126; Адрес фиктивной подпрограммы
        RETURN

;             ***  ОСНОВНОЙ   ЦИКЛ   ДИСПЕТЧЕРА   ПРОЦЕССОВ  ***

174152$:MOV     #2000,SP
        MOV     #2,@#7042      ; Передача кодов клавиатуры К0
174164$:MOV     #7060,R0       ; R0 = буфер флагов вызова
174170$:TST     (R0)+          ; Запрошен вызов
        BEQ     174170$        ; Нет
        MOV     R0,@#7056      ; Сохранить адрес флага вызова + 2
        MOV     22(R0),R1      ; R1 = адрес точки прерывания
        BNE     174214$        ; Было прерывание
        CALL    @<174232$-7062>(R0); Вызов по стандартному адресу
        BR      174164$        ; На начало цикла
174214$:CLR     22(R0)         ; Очистить адрес прерывания
        JMP     @R1            ; Переход по адресу прерывания
; Фиктивная подпрограмма
174222$:MOV     #174222$,@#7126; Установить точку прерывания фикт. п/п
        BR      174164$        ; На начало цикла
; Адреса стандартных подпрограмм обработки событий :
;  обработка скэн-кодов клавиатуры, обработка данных К2, вывод символов на
;  экран, переключение курсора, меню УСТАНОВКА, меню ЗАГРУЗКА, вывод на
;  принтер, запуск п/п пользователя, запуск теста
174232$:.WORD   104306$,125030$,111144$,176056$,100040$,100742$,176076$
        .WORD   176116$,176460$
; Подпрограмма обработки команды TRAP 0
174254$:MOV     @#7056,R0      ; R0 = адрес флага
        MOV     (SP)+,22(R0)   ; Сохранить СК
        MTPS    (SP)+          ; Установить ССП
        BR      174164$        ; На начало основного цикла
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО КОМАНДЕ EMT ***
174270$:MOV     R5,-(SP)       ; Сохранить регистры
        MOV     R4,-(SP)
        MOV     R3,-(SP)
        MOV     R2,-(SP)
        MOV     R1,-(SP)
        MOV     R0,-(SP)
        MOV     14(SP),R5
        MOV     -(R5),R5       ; R5 = код команды EMT
        CALL    @<160000$-EMT>(R5); Вызов соответствующей подпрограммы
        MOV     (SP)+,R0       ; Восстановить регистры
        MOV     (SP)+,R1
        MOV     (SP)+,R2
        MOV     (SP)+,R3
        MOV     (SP)+,R4
        MOV     (SP)+,R5
        RTI
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО КОМАНДЕ TRAP ***
174334$:MOV     @SP,R0
        MOV     -(R0),R0       ; R0 = код команды TRAP
        JMP     @<160160$-TRAP>(R0); Переход на соответствующую подпрограмму
; Обработка прерываний сетевого таймера (скроллинг назад)
174344$:MOV     R0,-(SP)       ; Сохранить R0
        ADD     @#7136,PC      ; Рулон плавный/дискретный ?
        BR      174476$        ; Рулон плавный
174354$:MOV     R1,-(SP)       ; Сохранить R1
        MOV     @#23170,R1     ; R1 = число видеострок для скроллинга
        NEG     R1             ; Перевод в положительное число
        ASL     R1             ; Умножение на 4
        ASL     R1
        MOV     @#2476,R0      ; R0 = адр.яч.информ. о перв. стр. экр.польз.
        ADD     #264.*4,R0     ; Плюс размер видимой части экрана
        CMP     R0,#4670       ; Достигли конца описания ?
        BLO     174424$        ; Нет
        BHI     174420$        ; Превысили
        MOV     #2500,@#4666   ; Посл. строка - первая в описании
        BR      174430$
174420$:SUB     #286.*4,R0     ; R0 = R0 - общ. число видеострок экр. польз.
174424$:MOV     R0,-2(R0)      ; Поместить в область описания
174430$:SUB     R1,R0          ; Вычесть число видеострок для скроллинга
        CMP     R0,#2500       ; Вышло за начало ?
        BHI     174444$        ; Нет
        ADD     #286.*4,R0     ; R0 = R0 + общ. число видеострок экр. польз.
174444$:MOV     #6742,-(R0)    ; Адрес описания нижней инф. строки
        MOV     @#2476,R0      ; R0 = адр.яч.информ. о перв. стр. экр.польз.
        SUB     R1,R0          ; Вычесть число видеострок для скроллинга
        CMP     R0,#2500       ; Вышли за начало ?
        BHIS    174470$        ; Нет
        ADD     #286.*4,R0     ; R0 = R0 + общ. число видеострок экр. польз.
174470$:MOV     R0,@#2476      ; Адрес описания начала экр. пользователя
        BR      174750$
174476$:MOV     @#2476,R0      ; R0 = адр.яч.информ. о перв. стр. экр.польз.
        SUB     #4,R0          ; R0 = R0 - 1 видеострока
        CMP     R0,#2500       ; Вышли за начало ?
        BHIS    174520$        ; Нет
        ADD     #286.*4,R0     ; R0 = R0 + общ. число видеострок экр. польз.
174520$:MOV     R0,@#2476      ; Адрес описания начала экр. пользователя
        ADD     #265.*4,R0     ; R0 = R0 + 265 строк
        CMP     R0,#4670       ; Вышли за конец
        BLO     174554$        ; Нет
        BNE     174550$        ; Да
        MOV     #2500,@#4666   ; Посл. строка - первая в описании
        BR      174560$
174550$:SUB     #286.*4,R0     ; R0 = R0 - общ. число видеострок экр. польз.
174554$:MOV     R0,-2(R0)      ; Поместить в область описания
174560$:SUB     #4,R0          ; R0 = R0 - 1 видеострока
        CMP     R0,#2500       ; На начале ?
        BNE     174576$
        ADD     #286.*4,R0     ; R0 = R0 + общ. число видеострок экр. польз.
174576$:MOV     #6742,-(R0)    ; Адрес описания нижней инф. строки
        MOV     (SP)+,R0       ; Восстановить R0
        INC     @#23170        ; Уменьшить число видеострок для скроллинга
        BR      175054$
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ СЕТЕВОГО ТАЙМЕРА ***
174612$:TST     @#23170        ; Количество видеострок для скроллинга
        BEQ     175072$        ; Нет
        BMI     174344$        ; Скроллинг назад
        MOV     R0,-(SP)       ; Сохранить R0
        ADD     @#7136,PC      ; Рулон плавный/дискретный ?
        BR      174762$        ; Рулон плавный
174632$:MOV     R1,-(SP)       ; Сохранить R1
        MOV     @#23170,R1     ; R1 = число видеострок для скроллинга
        ASL     R1             ; Умножение на 4
        ASL     R1
        MOV     @#2476,R0      ; R0 = адр.яч.информ. о перв. стр. экр.польз.
        ADD     #264.*4,R0     ; Плюс размер видимой части экрана
        CMP     R0,#4670       ; Достигли конца описания ?
        BLO     174700$        ; Нет
        BHI     174674$        ; Превысили
        MOV     #2500,@#4666   ; Посл. строка - первая в описании
        BR      174704$
174674$:SUB     #286.*4,R0     ; R0 = R0 - общ. число видеострок экр. польз.
174700$:MOV     R0,-2(R0)      ; Поместить в область описания
174704$:ADD     R1,R0          ; Прибавить число видеострок для скроллинга
        CMP     R0,#4670       ; Вышли за конец ?
        BLOS    174720$        ; Нет
        SUB     #286.*4,R0     ; R0 = R0 - общ. число видеострок экр. польз.
174720$:MOV     #6742,-(R0)    ; Адрес описания нижней инф. строки
        MOV     @#2476,R0      ; R0 = адр.яч.информ. о перв. стр. экр.польз.
        ADD     R1,R0          ; Прибавить число видеострок для скроллинга
        CMP     R0,#4670       ; Вышли за конец ?
        BLO     174744$        ; Нет
        SUB     #286.*4,R0     ; R0 = R0 - общ. число видеострок экр. польз.
174744$:MOV     R0,@#2476      ; Адрес описания начала экр. пользователя
174750$:MOV     (SP)+,R1       ; Восстановить регистры
        MOV     (SP)+,R0
        CLR     @#23170        ; Число строк для скроллинга = 0
        BR      175056$
174762$:MOV     @#2476,R0      ; R0 = адр.яч.информ. о перв. стр. экр.польз.
        BIC     #1,2(R0)       ; Сбросить бит переключения курсора
        MOV     2(R0),@#2476   ; Сдвиг на 1 строку вверх
        ADD     #264.*4,R0     ; R0 = R0 + 264 видеостроки
        CMP     R0,#4670       ; Вышли за конец ?
        BLO     175034$        ; Нет
        BNE     175030$        ; Да
        MOV     #2500,R0       ; R0 = первый элемент описания
        MOV     R0,@#4666      ; Посл. строка - первая в описании
        BR      175040$
175030$:SUB     #286.*4,R0     ; R0 = R0 - общ. число видеострок экр. польз.
175034$:MOV     R0,-2(R0)      ; Поместить в область описания
175040$:MOV     #6742,2(R0)    ; Адрес описания нижней инф. строки
        MOV     (SP)+,R0       ; Восстановить R0
        DEC     @#23170        ; Уменьшить число видеострок для скроллинга
175054$:BNE     175306$        ; Еще остались
175056$:MOV     @#22750,@#23164; Разрешение/запрет использования курсора
        INC     @#7066         ; Уст.флаг вызова п/п перекл. курсора
        BR      175306$
175072$:ADD     @#7134,PC      ; Перекл. курсор/не изм. курсор/выдержка вр.
        BR      175150$        ; Перекл. курсор, поменять его координаты
175102$:BR      175306$        ; Не изм. состояния курсора
175104$:DECB    @#23166        ; Уменьшить счетчик выдержки времени
        BGT     175306$        ; Время еще не окнчилось
        BEQ     175120$        ; Время закончилось
        MOV     #110060,@#23162; Загрузить временной интервал
175120$:MOV     @#23162,@#23166; Загрузить значение в счетчик
        SWAB    @#23162        ; Поменять параметры выдержки(горит/не горит)
        BMI     175300$        ; Включить курсор
        ASL     @#23166
175140$:MOVB    #177,@23160    ; Убрать курсор с экрана
        BR      175306$
175150$:MOV     R0,-(SP)       ; Сохранить регистры
        MOV     R1,-(SP)
        MOV     R5,-(SP)
        MOV     @#23150,R5     ; R5 = адрес текущей таблицы видеопараметров
        MOV     @R5,R0         ; R0 = текущий адрес видео
        SUB     @32(R5),R0     ; R0 = тек.адрес - адр.нач.строки = позиция X
        MOV     66(R5),R1      ; R1 = режим экрана (80/40/20/10)
        BR      175200$
175176$:ASL     R0             ; Приведение координат в соотв. с режимом
175200$:ROR     R1
        BCC     175176$
        MOV     R0,@#23156     ; Сохранить координату X
        MOV     60(R5),R1      ; R1 = адрес списка строк, где расп. курсор
        BIC     #1,6(R1)       ; Выключить курсор
        BIC     #1,52(R1)
        MOV     32(R5),60(R5)  ; Новые координаты курсора
        MOV     60(R5),R1
        BIS     #1,6(R1)       ; Включить курсор
        BIS     #1,52(R1)
        MOV     #4,@#7134      ; Режим мигания курсора
        MOV     (SP)+,R5       ; Восстановить регистры
        MOV     (SP)+,R1
        MOV     (SP)+,R0
        CLR     @#23166        ; Сброс временных параметров курсора
        BR      175140$
175300$:MOVB    @#23156,@23160 ; Поместить курсор в позицию X
175306$:TST     @#7130         ; Двигатель НГМД вращается ?
        BEQ     175326$        ; Нет
        DEC     @#7130         ; Уменьшить счетчик вращения двигателя
        BNE     175326$        ; Еще не конец
        CALL    @7132          ; Вызов п/п выключения двигателя НГМД
175326$:DEC     @#7046         ; Уменьшить сч. длительности звукового сигн.
        BNE     175342$        ; Еще не конец
        BIC     #17600,@#177716; Выключить звуковой сигнал
175342$:TSTB    @#7227         ; Есть данные для автоповтора клавиш
        BEQ     175376$        ; Да
        DECB    @#7227         ; Уменьшить сч. автоповтора
        BNE     175376$        ; Еще не конец
        INC     @#7060         ; Увеличить флаг вызова п/п обр. соб. клав.
        BIS     #200,@#177716  ; Подать полож.импульс на динамик (щелчок)
        MOV     #1,@#7046      ; Длительность импульса
175376$:RTI
; Подпрограмма заполнения ячеек информацией о длительности вращения
;  двигателя НГМД и адресе п/п выключения двигателя
175400$:MOV     (R5)+,@#7130   ; Длительность вращения двигатель НГМД
        MOV     (R5)+,@#7132   ; Адрес п/п выключения двигателя НГМД
        RTS     R5
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ КЛАВИАТУРЫ ***
175412$:MOVB    @#177702,@7200 ; Занести скэн-код клавиши в буфер
        BMI     175436$        ; Клавиша отжата
        BIS     #200,@#177716  ; Подать полож.импульс на динамик (щелчок)
        MOV     #2,@#7046      ; Длительность импульса
175436$:CMPB    @7200,#4       ; Нажата клавиша <СТОП> ?
        BEQ     175466$        ; Да
        INC     @#7200         ; Передвинуть указатель на след. позицию
        BIC     #10,@#7200
        INC     @#7060         ; Увеличить флаг вызова п/п обр. соб. клав.
        RTI
175466$:MOV     R0,-(SP)       ; Сохранить регистры
        MOV     R1,-(SP)
        MOV     R2,-(SP)
        CALL    104054$        ; Очистка буферов клавиатуры
        MOV     (SP)+,R2       ; Восстановить регистры
        MOV     (SP)+,R1
        MOV     (SP)+,R0
        BIS     #20,@#177716   ; Установить сигнал HALT в ЦП
        RTI
; Подпрограмма исполнения команды TRAP 2
175516$:CLR     @#7230         ; Запрет вызова TRAP 2 п/п обсл. клав.
        ADD     @#7042,PC      ; Передача данных по К0/в R0
        BR      175540$        ; Передача в R0
175530$:BIT     #10,@#177076   ; Готовность передатчика К0
        BEQ     175646$        ; Не готов
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПЕРЕДАТЧИКА КАНАЛА 0(КЛАВИАТУРА) ***
175540$:MOV     R5,-(SP)       ; Сохранить R5
        MOV     @#7206,R5      ; R5 = указатель для чтения с буфера ASCII
175546$:CMP     R5,@#7210      ; Буфер пуст ?
        BEQ     175650$        ; Да
        TSTB    1(R5)          ; Данное слово содержит одиночный код ?
        BEQ     175620$        ; Да
        CLR     -(SP)
        MOVB    @(R5),@SP      ; Поместить в стек очередной символ из строки
        BNE     175606$        ; Еще не конец строки символов
        CMP     (R5)+,(SP)+    ; Указатель на след. позицию
        BIC     #40,R5
        MOV     R5,@#7206
        BR      175546$
175606$:INC     @R5            ; К следующему символу в строке
        MOV     #177,R5
175614$:SOB     R5,175614$     ; Задержка
        BR      175632$
175620$:MOV     (R5)+,-(SP)    ; Поместить символ в стек
        BIC     #40,R5
        MOV     R5,@#7206
175632$:ADD     @#7042,PC      ; Передача данных по К0/в R0
        BR      175660$        ; Передача в R0
175640$:MOV     (SP)+,@#177070 ; Передача символа в К0
175644$:MOV     (SP)+,R5       ; Восстановить R5
175646$:RTI
175650$:MOV     #2,@#7230      ; Разрешение вызова TRAP 2 п/п обсл. клав.
        BR      175644$
175660$:MOV     (SP)+,R0       ; Передача символа в R0
        BR      175644$
; Подпрограмма исполнения команды TRAP 4
175664$:CLR     @#22546        ; Запрет вызова TRAP 4 п/п обсл. терминала
        BIT     #10,@#177066   ; Готовность приемника К0
        BEQ     175742$        ; Не готов
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 0(ТЕРМИНАЛ) ***
175700$:ADD     @#7042,PC      ; Передача данных по К0/в R0
        BR      175752$        ; Передача в R0
175706$:CMP     @#7064,#177    ; Буфер заполнен полностью ?
        BEQ     175744$        ; Да
        MOVB    @#177060,@22544; Занести символ в буфер
        INC     @#22544        ; Подкорректировать указатель буфера
        BIC     #200,@#22544
        INC     @#7064         ; Увеличить флаг вызова п/п обсл. терм.
175742$:RTI
175744$:MOV     #2,@#22546     ; Разрешение выз. TRAP 4 п/п обсл. терминала
175752$:RTI
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 1(ПРИНТЕР) ***
175754$:INC     @#7074         ; Уст. флаг вызова п/п обсл. принтера
        RTI
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 2 ***
175762$:MOV     R0,-(SP)       ; Сохранить R0
        MOV     @#23202,R0     ; R0 = счетчик принятых байтов
        BMI     176046$        ; В состоянии инициализации
        CMP     R0,#2          ; Адрес МП передан
        BHIS    176016$        ; Да
        MOVB    @#177064,23200(R0); Передача данных в буфер (адрес МП)
176006$:INC     @#23202        ; Увеличить счетчик принятых байтов
176012$:MOV     (SP)+,R0       ; Восстановить R0
        RTI
176016$:BNE     176034$        ; Принято 3 байта
        TSTB    @#177064       ; 3-й байт равен нулю ?
        BNE     176006$        ; Нет
        COM     @#23202        ; Инвертировать счетчик (инициализация канала)
        BR      176012$
176034$:INC     @#7062         ; Установить флаг вызова п/п обсл. К2
176040$:CLR     @#23202        ; Очистить счетчик
        BR      176012$
176046$:TSTB    @#177064       ; Принятый байт равен нулю ?
        BEQ     176012$        ; Да
        BR      176040$
; Подпрограмма переключения режима курсора
176056$:CLR     @#7066         ; Очистка флага вызова п/п
        ADD     @#23164,PC     ; Разрешение / запрет использования курсора
        RETURN                 ; Запрет использования курсора
176070$:CLR     @#7134         ; Поменять позицию курсора и включить его
        RETURN
; Подпрограмма печати символа на принтере, переданного по К1
176076$:CLR     @#7074         ; Очистить флаг вызова п/п
        MOV     @#177062,-(SP) ; Поместить символ в стек
        CALL    135722$        ; Печать символа на принтере
        TST     (SP)+
        RETURN
; Подпрограмма вызова процедуры пользователя
176116$:CALL    @7140          ; Вызов процедуры пользователя
        CLR     @#7076         ; Очистить флаг вызова п/п
        RETURN
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО ПОЯВ. НА КАНАЛЕ ЦП СИГНАЛА RESET ***
176130$:RTI
; Подпрограмма запроса блока памяти
176132$:MOV     R0,R1          ; R1 = размер запрашиваемого блока
        BMI     176142$        ; Найти максимальный блок
        ROR     R1             ; Приведение к четному адресу
        ADC     R0
176142$:MOV     R2,-(SP)       ; Сохранить R2
        CLR     R2             ; R2 = адрес найденного блока
        CLR     -(SP)          ; Размер найденного блока
176150$:MOV     #23660,R1      ; R1 = адрес начала ОЗУ пользователя
176154$:TST     (R1)+          ; Блок занят ?
        BEQ     176176$        ; Нет
        TST     (R1)+
176162$:ADD     (R1)+,R1       ; Переход к следующему блоку
        BPL     176154$        ; Еще не конец ОЗУ
        TST     R2             ; Найден свободный блок ?
        BNE     176150$        ; Да
        CLR     R0             ; Нет свободной памяти
        BR      176272$
176176$:TST     (R1)+
        CMP     R0,@R1         ; Размер блока равен или больше запраш. ?
        BLOS    176226$        ; Да
        CMP     R1,R2          ; Это найденный максимальный блок
        BEQ     176222$        ; Да
        CMP     @R1,@SP        ; Меньше запраш. размера ?
        BLOS    176162$        ; Да
        MOV     R1,R2          ; R2 = адрес найденного макс. блока
        MOV     @R1,@SP        ; Сохранить размер блока
        BR      176162$
176222$:MOV     @SP,R0         ; R0 = размер найденного макс. блока
        BR      176232$
176226$:INC     -4(R1)         ; Пометить блок, как занятый
176232$:MOV     (R1)+,R2       ; R2 = размер блока
        SUB     #6,R2          ; Отнять размер заголовка
        CMP     R0,R2          ; Запраш. размер больше реального ?
        BHIS    176272$        ; Да
        MOV     R1,R2
        ADD     R0,R2          ; R2 = адрес следующего блока
        CLR     (R2)+          ; Пометить блок, как свободный
        MOV     R1,@R2
        SUB     #6,(R2)+       ; Ссылка на предыдущий блок
        MOV     -(R1),@R2      ; Вычисление размера блока
        SUB     R0,@R2
        SUB     #6,@R2
        MOV     R0,(R1)+       ; Размер выделенного блока
176272$:TST     (SP)+
        MOV     (SP)+,R2       ; Восстановить R2
        RETURN
; Подпрограмма освобождения блока памяти
176300$:TST     R1             ; Освободить блок или всю память ?
        BPL     176310$        ; Освободить блок
        JMP     173706$        ; Освободить всю память
176310$:MOV     #23660,R0      ; R0 = адрес начала ОЗУ пользователя
176314$:ADD     #6,R0          ; Плюс размер заголовка
        BMI     176374$        ; Достигнут конец ОЗУ
        CMP     R0,R1          ; Адрес освоб. блока равен текущему
        BEQ     176342$        ; Да
        ADD     -2(R0),R0      ; Переход к следующему блоку
        BR      176314$
176334$:MOV     @R1,R1         ; R1 = адрес предыдущего блока
        ADD     #6,R1          ; Плюс размер заголовка
176342$:CLR     -6(R1)         ; Пометить блок, как свободный
        TST     -(R1)
        MOV     R1,R0          ; R0 = адрес блока (поле размера)
        ADD     (R0)+,R0       ; Переход к следующему блоку
        TST     @R0            ; Блок занят ?
        BNE     176370$        ; Да
        ADD     4(R0),@R1      ; Прибавить размер к предыд. (слияние)
        ADD     #6,@R1         ; Плюс размер заголовка
176370$:TST     @-(R1)         ; Блок выше свободный ?
        BEQ     176334$        ; Да
176374$:RETURN
; Подпрограмма резервирования программируемого таймера за процессом
176376$:TST     @#7050         ; Программируемый таймер занят ?
        BEQ     176416$        ; Да
        CLR     @#177710       ; Останов таймера
        CLR     @#7050         ; Таймер занят
        RETURN
176416$:SEC                    ; Признак занятости таймера
        RETURN
; Подпрограмма освобождения процессом программируемого таймера
176422$:MOV     #4,@#7050      ; Признак свободного таймера
        MOV     #174612$,@#304 ; Восстановить вектор прерывания
        MOV     #200,@#306
        CLR     @#177712       ; Очистить буферный регистр таймера
        MOV     #1,@#177710    ; Пуск таймера
        RETURN
; Подпрограмма запуска тестов в ПП
176460$:CALL    176472$        ; Запустить тесты
        CLR     @#7100         ; Очистить флаг вызова п/п
        RETURN
; Подпрограмма вызова тестов и передачи результатов в ОЗУ ЦП
176472$:MTPS    #200           ; Запретить прерывания
        MOV     #176656$,@#300 ; Переназначить вектор прерывания клавиатуры
        CALL    160410$        ; Тест ПЗУ
        CLR     R1             ; R1 = 0 (смещение в буфере ошибок)
176512$:ASR     R0
        BCS     176522$        ; Ошибка банка ПЗУ
        BNE     176526$        ; Еще есть ошибки
        BR      176532$
176522$:CALL    176626$        ; Установка счетчика ошибок в ОЗУ ЦП
176526$:INC     R1             ; Переход к след.ячейке в ОЗУ ЦП
        BR      176512$
176532$:CALL    170632$        ; Тест процессора
        MTPS    #0             ; Разрешить прерывания
        TST     R0             ; Есть ошибки ?
        BEQ     176556$        ; Нет
        MOV     #5,R1          ; R1 = 5 (смещение в буфере ошибок)
        CALL    176626$        ; Установка счетчика ошибок в ОЗУ ЦП
176556$:MOV     #-1,R0
        CALL    176132$        ; Получить адрес наиб. блока памяти
        MOV     R1,R4          ; R4 = начальный адрес
        MOV     R1,R5
        ADD     R0,R5          ; R5 = конечный адрес
        CALL    170224$        ; Тест оперативной памяти
        TST     R0             ; Есть ошибки
        BEQ     176614$        ; Нет
        MOV     #4,R1          ; R1 = 4 (смещение в буфере ошибок)
        CALL    176626$        ; Установка счетчика ошибок в ОЗУ ЦП
176614$:MOV     #177,R0
        CALL    104160$        ; Посл. ЦП по К0 символ с кодом 177(тест окон.)
        RETURN
; Подпрограмма установки счетчика ошибок в ОЗУ ЦП
176626$:MOV     #<177700/2>&77777,@#177010; Адрес буфера счетчиков ошибок
        ADD     R1,@#177010    ; Прибавить смещение
        CMP     #-1,@#177014   ; Значение счетчика достигло максимума
        BEQ     176654$        ; Да
        INC     @#177014       ; Увеличить значение счетчика ошибок
176654$:RETURN
; Подпрограмма обработки прерываний от клавиатуры во время тестирования
176656$:CMP     #4,@#177702    ; Нажата клавиша <СТОП> ?
        BNE     176672$        ; Нет
        JMP     @160000$       ; Перезапуск компьютера
176672$:RTI


; *****************************************************************
; *                                                               *
; *                  КОНТРОЛЬНЫЕ СУММЫ БЛОКОВ ПЗУ                 *
; *                                                               *
; *                                                               *
; *                     Адреса 176770 - 176777                    *
; *                                                               *
; *****************************************************************

        .=176770

176770$:.WORD   63160          ; Адреса 100000 - 117777
176772$:.WORD   133314         ; Адреса 120000 - 137777
176774$:.WORD   162125         ; Адреса 140000 - 157777
176776$:.WORD   103607         ; Адреса 160000 - 176775

; * * * * * * * * * * *  E n d   o f   R O M  * * * * * * * * * * *

        .END




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

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

 



Текстовая версия Сейчас: 28.3.2024, 18:55