УКНЦ ROM disasm 6

Материал из Emuverse
Перейти к: навигация, поиск
Red copyright.png Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.


; *****************************************************************
; *                                                               *
; * ПРОГРАММА  НАЧАЛЬНОГО  ЗАПУСКА  СИСТЕМЫ,  ПУЛЬТОВЫЙ  МОНИТОР, *
; *   ЗАГРУЗЧИКИ, ТЕСТОВЫЕ ПОДПРОГРАММЫ, ОБРАБОТЧИКИ ПРЕРЫВАНИЙ   *
; *                                                               *
; *                     Адреса 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