Uknc ROM disasm - 6

From Felixl.com
Revision as of 08:27, 18 March 2007 by Nzeemin (talk | contribs)
(diff) ←Older revision | view current revision (diff) | Newer revision→ (diff)
Jump to navigationJump to search
; *****************************************************************
; *                                                               *
; * ПРОГРАММА  НАЧАЛЬНОГО  ЗАПУСКА  СИСТЕМЫ,  ПУЛЬТОВЫЙ  МОНИТОР, *
; *   ЗАГРУЗЧИКИ, ТЕСТОВЫЕ ПОДПРОГРАММЫ, ОБРАБОТЧИКИ ПРЕРЫВАНИЙ   *
; *                                                               *
; *                     Адреса 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                *
; *****************************************************************

	.=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	4
	.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	160614$
; Точка входа обработчика прерывания 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,R1
	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	176766$(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$		; Нажат <Пробел>
161064$: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	161032$
; Обработка клавиш с префиксом 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$		; Вывод символа
	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$		; Вывод '=' и содержимого регистра
	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	160712$		; Точка останова не используется
	$MFPM$			; Чтение содерж. памяти по адресу останова
	MOV	R0,60(R1)	; Сохранение его в буфере
	CMP	16(R4),50(R1)	; Адрес останова равен адресу запуска ?
	BEQ	160712$		; Да
	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	160062$		; Нет
	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,162006$	; Вывод "* ЗАГРУЗКА ИЗ СЕТИ *"
	.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$		; Да
	MOV	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	176716$		; Нет
	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$		; Вывод символа на экран
	JSR	R4,163006$	; Вывод знака равенства
	.WORD	163526$
	CALL	163264$		; Получение в R5 адреса хранения знач. рег.
	MOV	@R5,R0		; R0 = содержимое регистра или точ. ост.
	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$:.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,164107$	; Сохранить номер устройства
	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,164556$	; Сохранение номера сетевой станции
	MOVB	164572$,R0	; R0 = 173(8)
	XOR	R5,R0		; R0 = 173(8) XOR номер_сетевой_станции
	MOVB	R0,164572$
	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,165427$
	MOV	#165420$-164600$+1000,R5 ; Адрес сообщения "СБОЙ #X"
	CALL	165402$		; Вывести сообщение на экран
	TSTB	@#176562	; Сбросить готовность приемника СА
	BR	165172$
; Подпрограмма обработки прерывания 4 (ошибка обращения к каналу)
165254$:MOV	#"04,165476$	; Номер прерывания в сообщение
	BR	165272$
; Подпрограмма обработки прерывания 10 (зарезервированная инструкция)
165264$:MOV	#"10,165476$	; Номер прерывания в сообщение
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
	RORB	R1
	BISB	R1,R0
	MOV	R0,R1
	BIC	#177770,R1
	BIS	#60,R1
	MOVB	R1,165454$
	MOV	R0,R1
	ROR	R1
	ROR	R1
	ROR	R1
	BIC	#177770,R1
	BIS	#60,R1
	MOVB	R1,165455$
	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	176502$,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	#-6,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	#376,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
	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	166600$		; Нет
	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	#-1,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	#-1,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(R1)		; Результат получился отрицательный
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		; Установить поле порядка
	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(R5)	; Прибавить 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	167724$		; Нет
	MOV	#14,R0		; R0 = смещение в буфере регистрации ошибок
	CMP	#-1,177700$(R0)	; Число ошибок достигло максимума ?
	BEQ	167704$		; Да
	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
	ROR	@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$		; Нет
	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	170766$		; 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	171664$		; Z=1
	JMP	172604$		; Ошибка
171664$: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
	ASHC	@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,500,472,504,0,100000,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 = адрес сообщения об ошибке
	RORB	R2
	BCS	173000$		; Есть ошибка
	BNE	173004$		; Еще есть ошибки
	MOV	#173046$	; Адрес массива адресов об ошибках ПЗУ
	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,@#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,173324$
	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	107744$		; Программная инициализация драйвера терминала
	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,@#177010 ; Адрес передачи ключа о присут. НГМД
	MOV	R0,@#177014	; Передать ключ
	MOV	R0,@#7044
	BIC	#1400,@#177054	; Включить сетевой таймер в ЦП и ПП
	BIS	#1,@#177066	; Разрешение прерывания канала 0 (приемник)
	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,@#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	@160000$