IPB

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

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


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

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


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

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