;
; Слой 2 - тесты процессора Т1 и Т2, загрузчик с перфоленты
;_______________________________________________________________________
;
		.ASECT
		.	= 173000
		.if	ne, 1
BGSL2:
		.	= BGSL2
;_______________________________________________________________________
;
; Переход на эмулятор пульта
;
		mov	#300, @#173024
;_______________________________________________________________________
;
; Знаком "*" отмечены проверяемые команды
; В случае обнаружения неисправности происходит останов по команде
; HALT или выполняется неверный переход на микропрограммном уровне,
; который может привести к непредсказуемым результатам (программное
; или микропрограммное зацикливание, останов вне тест и.т.д)
;
JT1:		mov	#0, R4			;
		mov	R0, R5			;
;_______________________________________________________________________
;
; T1 - тест двухадресных команд типа SR, RR
;
; Если тестом обнаружена неисправность, необходимо
;  - задать на регистре переключателей (РП) код 402
;  - включить клавишу "ОСТАНОВ АМК"
;  - перевести ключ замыкателя из положения "ВКЛ" в
;    положение "РАБ", должен произойти останов в 
;    команде по адресу 173020 во втором слое 
;  - сравнить с эталоном, приведенным в комментарии команды
;    адрес микрокоманды MCA[10/00] и адрес памяти RA0[15/00]
;  - нажимая на клавишу "ТАКТ", выполнить тест, задавая
;    на РП адрес микрокоманды останова (код приведен
;    в следующей строке комментария) и сравнивая
;    значения MCA, RA0 и DIR с эталоном
;
; При несравнении адресов возможна неисправность БЭ001 Р4.12 MPC[06/00]
; При несравнении DIR  возможна неисправность БЭ001 P4.11
;
T1:		mov	#134534, R0		;
                 				;    РП	  MCA   RA0     DIR
						;-------------------------
		bne	T11			; *  ---  162  173030    -
         	halt				;
		.word	173000			; переключатель слоев
		.word	342			; и перемычки адреса старта
						;
T11:		cmp	#134534, R0		; *  165  512  173032    -
						;    014  230     -    27712
		beq	2$			; *  165  402  173040    -
1$:		halt				;
2$:		cmp	#534, R0		; *  165  512  173042    -
		beq	1$			; *  165  401  173046    -
		bne	4$			; *  165  512  173052    -
3$:		halt				;
4$:		cmp	#134600, R0		; *  165  512  173054    -
		beq	3$			; *  165  401  173060    -
5$:		mov	#32532, R3		;    165  512  173062    -
		mov	@#5$+2, R0		; *  165  513  175066    -
		mov	#T1, R3 		;    165  512  173072    -
		mov	2(R3), R3		; *  165  516  173076    -
		add	R3, R0			; *  165  506  173102  37760
		cmp	#167266, R0		;    165  512  173104    -
		beq	6$			;    165  402  173112    -
		halt				;
6$:		bic	#156000, R0		; *  165  512  173114    -
						;    014  230     -    67765
		add	#020454, R0		; *  165  512  173120    -
		cmp	#041742, R0		;    165  512  173124    -
		beq	7$			;    165  402  173132    -
		halt				;
7$:		mov	#000134, R3		;    165  512  173134    -
		bic	R3, R0			; *  165  506  173140    -
		cmp	#041642, R0 		;    165  512  173142    -
		beq	T12			;
		halt				;
;_______________________________________________________________________
;
; Тест команд перехода
;
; В случае останова в R0 содержится увеличенный на четыре  адрес пары,
; используемых в последней проверке операндов. Для каждой пары операндов
; указан результат и формируемый ими код условия (КУ)
; сформированный код условия  можно увидеть в PSW[03/00]
; В случае неверного КУ возможна неисправность БЭ001 P4.12 МРС[01, 00]
; Для локализации неисправности рекомендуется занести в память с
; произвольного адреса тест, в котором повторяется ситуация,
; обнаружившая неисправность
;
; Например: 	выполняется неверно ветвление по команде bne
;		с кодом условия 0001 (операнды 140001,040000)
;		ситуация зацикливается, если использовать следующую
;		последовательность команд:
;		1000:	062727		; add #140001, #40000
;		1002:	140001		;
;		1004:	040000		; КУ=0001
;		1006:	001374		; bne 1000
;		1010:	000137		; JMP @#1000
;		1012:	001000
;
; В этой последовательности команд для синхронизации
; можно использовать микрокоманду 264
;
T12:		mov	#TBL, R0		; адрес таблицы операндов
1$:		mov	(R0)+, R2		; формирующих КУ
		mov	(R0)+, R3     		; R2, R3 - операнды
		add	R2, R3			; формирование КУ
		bne	1$			; *
		beq	2$			; *
		halt				;
2$:		mov	(R0)+, R2		;
		mov	(R0)+, R3		;
		add	R2, R3			;
		beq	2$			; *
		bne	3$			; *
		halt				;
3$:		mov	#TBL, R0		;
4$:		mov	(R0)+, R2		;
		mov	(R0)+, R3		;
		add	R2, R3			;
		beq	5$			; *
		bne	4$			; *
		halt				;
5$:		mov	(R0)+, R2		;
		mov	(R0)+, R3		;
		add	R2, R3			;
		bne	6$			; *
		beq	5$			; *
		halt				;
6$:		mov	R4, R4			;
		beq	BGSL2			;
		bic	R3, R3			;
		beq	T2			;
						; NZVC   R3
TBL:		.word	040000			; 0000 040000
		.word	0			;
						;
		.word	140001			; 0001 010001
		.word	040000			;
						;
		.word	140000			; 0011 040000
		.word	100000			;
						;
		.word	100000			; 1000 100000
		.word	0			;
						;
		.word	140000			; 1001 100000
		.word   140000			;
						;
		.word	040000			; 1010 100000
		.word	040000			;
						;
		.word	0			; 0100 000000
		.word	0			;
						;
		.word	040000 			; 0101 000000
		.word	140000			;
						;
		.word	100000			; 0111 000000
		.word	100000			;
;_______________________________________________________________________
;
; T2 - тест двухадресных команд типа RS, SS
;
; При поиске неисправности, обнаруженно йэтим тестом, рекомендуется
; использовать методику, описанную в тесте одноадресных команд
; Для входа в тест задать останов по адресу микрокоманды 222
;
; Примечание:	тест выполняется после ввода с терминала
;		команды вызова загрузчика
;
; Возможна неисправность БЭ001 P4.12 MPC[06/00], оборудования связи с памятью
;			
T2:		mov	#TADR, R0		;
		mov	#500, SP		; SP адрес ячейки памяти
T21:		mov	#122555, R5		;    РП	  MCA   RA0
						;-------------------
		mov	R5, (SP)+		; *  222  251   500
		mov	#ANRT2, PC		;
T22:		mov	#055222, R5		;
		mov	R5, (SP)		; *  221  251   500
		mov	#ANRT2, PC		;
T23:		mov	#122555, R5		;
		mov	-6(PC), 0(SP)		; *  226  111  173360
		mov	#ANRT2, PC		;
T24:		mov 	#055222, R5		;
		mov	#055222, 0(SP)		; *
		mov	#ANRT2, PC		;
T25:		mov	#122555, R5		;
		mov	R5, @#500		; *  223  120  173412
		mov	#ANRT2, PC		;
T26:		mov	#055222, R5		;
		mov	R5, 0(SP)		; *  220  401  173430
						;
ANRT2:		mov	#500, SP		;
		cmp	(SP)+, R5		; сравнение с эталоном
		bne	ERT2			; переход на останов при несовпадении
CONTST:		mov	#500, SP		; восстановление адреса памяти
		mov	(R0)+, PC		; переход на продолжение теста
						;
ERT2:		add	#-2, R0			; R0 адрес входа в выполнявшийся подтест
		halt				;
		bne	CONTST			;
						;
TADR:		.word	T22			;
		.word	T23			;
		.word	T24			;
		.word	T25			;
		.word	T26			;
		.word	T27			;
;_______________________________________________________________________
;
; Проверка записи в ячейку памяти кода "бегущая 1"
;
T27:		mov	#1, R0			; R0 информацмя для записи
T27.1:		mov 	#500, SP		; R6 адрес памяти для выполнения записи
		mov	R0, (SP)		; запись "бегущей 1" в ячейку
		cmp	(SP)+, R0		; сравнение исходной информации с ячейкой 500
		bne     ERRT27			;
		add	R0, R0			; сдвиг "бегущей 1" влево
		bne	T27.1			;
		beq	ENDT2			;
ERRT27:		halt				;
		bne	T27.1			;
						;
;_______________________________________________________________________
;
; Начало загрузчика с перфоленты
;
		.enabl	LSB			;
		.	= BGSL2+522		;
						;
LD2:		mov	R0, R5			; адрес загрузки - смещение, полученное от эмулятора
LD2.1:		bic	R1, R1			; очистка контрольной суммы
LD2.2:		mov	PC, SP			;
		bne	READ			; на п/п считывани яодного байта
		cmp	#1, R4			; начало блока?
		bne	LD2.2			; нет, ищем дальше
		mov	PC, SP			;
		bne	READ			; чтение одного байта (нуля)
		mov	PC, SP			;
		bne	GWRD			; на п/п формирования слова
		mov	R4, R2			; счетчик байтов
		add	#-4, R2			; уменьшаем счетчик на 4
		cmp	#2, R2			; последний блок?
		beq	jump			; на обработку конечного блока
		mov	PC, SP			;
		bne	GWRD			; чтение слова (адрес загрузки)
		add	R5, R4			; суммарный адрес загрузки
		mov	R4, R0			; адрес загрузки в R0
		br	LD3			;
		.word	-1			;
;_______________________________________________________________________
;
; переход на тест памяти TMEM
;
		.	= BGSL2 + 600		;
ENDT2:		mov	#300, @#173024		; переход на третий слой
;_______________________________________________________________________
;
; Продолжение загрузчика с перфоленты
; Подпрограмма ввода слова
;
GWRD:		mov	#1, @#177550		; запуск считывателя
LR1:		tstb	@#177550		; ожидание готовности
		bpl	LR1			;
		mov	@#177552, R3		; передача байта в R3
		add	R3, R1			; накопление контрольной суммы
		dec	R2			; уменьшение счетчика
		mov	#1, @#177550		; запуск считывателя
LR2:		tstb	@#177550		;
		bpl	LR2			;
		mov	@#177552, R4		;
		add	R4, R1			; накопление контрольной суммы
		swab	R4			; сдвиг полученного байта
		add	R3, R4			; получение слова
RET:		dec	R2			;
		add	#2, SP			;
		mov	SP, PC			;
;_______________________________________________________________________
;
; Подпрограмма ввода байта
;
READ:		mov	#1, @#177550		; запуск считывателя
LR3:		tstb	@#177550		; ожидание готовности
		bpl	LR3			;
		mov	@#177552, R4		; чтение байта
		add	R4, R1			;
		br	RET			;
;_______________________________________________________________________
;
 ER:		mov	#111111, R5		; засылка в R5 признака ошибки
		bne	EXIT			;
		.word	-1			;
;_______________________________________________________________________
;
; Переход на загрузчик с перфоленты из нулевого слоя
;
		.	= BGSL2+724		;
		br	LD2			;
;_______________________________________________________________________
;
LD4:		movb	R4, (R0)+		; передача байта по адресу
LD3:		mov	PC, SP			; чтение одного байта
		bne	READ			;
		tst	R2			; нулевой счетчик байт?
		bge	LD4			; нет, продолжаем
		br	ANAL			;
;_______________________________________________________________________
;
; Переход на начало T2 после поиска загрузчика
;
		.	= BGSL2+742		;
		mov	#T2, PC			;
;_______________________________________________________________________
;
; Продолжение загрузчика с перфоленты
;
ANAL:		tstb	R1			; контрольная сумма нулевая?
		beq	LD2.1			; да, чтение следующего блока
		bne	ER			; ошибка контрольной суммы
;_______________________________________________________________________
;
; Обработка последнего блока
;
JUMP:		mov	PC, SP			; чтение слова
		bne	GWRD			;
		add	R4, R5			; адрес запуска
		mov	PC, SP			; чтение байта
		bne	READ			;
		tstb	R1			; контрольная сумма нулевая?
		bne	ER			; нет, произошла ошибка
						; переход на эмулятор
EXIT:		mov	#173000, PC		; после окончания загрузки
		.word	-1			;
;_______________________________________________________________________
;
; Дамп, прочитанный из реальной машины, совпадает с результатом компиляции (кроме 173024)
;
	.iff
		.word	012737, 000300, 173024, 012704, 000000, 010005, 012700, 134534
		.word	001003, 000000, 173000, 000342, 022700, 134534, 001401, 000000
		.word	022700, 000534, 001774, 001001, 000000, 022700, 134600, 001774
		.word	012703, 032532, 013700, 173062, 012703, 173014, 016303, 000002
		.word	060300, 022700, 167266, 001401, 000000, 042700, 156000, 062700
		.word	020454, 022700, 041742, 001401, 000000, 012703, 000134, 040300
		.word	022700, 041642, 001401, 000000, 012700, 173250, 012002, 012003
		.word	060203, 001374, 001401, 000000, 012002, 012003, 060203, 001774
		.word	001001, 000000, 012700, 173250, 012002, 012003, 060203, 001402
		.word	001373, 000000, 012002, 012003, 060203, 001002, 001773, 000000
		.word	010404, 001656, 040303, 001422, 040000, 000000, 140001, 040000
		.word	140000, 100000, 100000, 000000, 140000, 140000, 040000, 040000
		.word	000000, 000000, 040000, 140000, 100000, 100000, 012700, 173456
		.word	012706, 000500, 012705, 122555, 010526, 012707, 173430, 012705
		.word	055222, 010516, 012707, 173430, 012705, 122555, 016766, 177772
		.word	000000, 012707, 173430, 012705, 055222, 012766, 055222, 000000
		.word	012707, 173430, 012705, 122555, 010537, 000500, 012707, 173430
		.word	012705, 055222, 010566, 000000, 012706, 000500, 022605, 001003
		.word	012706, 000500, 012007, 062700, 177776, 000000, 001371, 173336
		.word	173350, 173366, 173404, 173420, 173472, 012700, 000001, 012706
		.word	000500, 010016, 022600, 001003, 060000, 001371, 001431, 000000
		.word	001366, 010005, 040101, 010706, 001057, 022704, 000001, 001373
		.word	010706, 001052, 010706, 001017, 010402, 062702, 177774, 022702
		.word	000002, 001474, 010706, 001007, 060504, 010400, 000455, 177777
		.word	012737, 000300, 173024, 012737, 000001, 177550, 105737, 177550
		.word	100375, 013703, 177552, 060301, 005302, 012737, 000001, 177550
		.word	105737, 177550, 100375, 013704, 177552, 060401, 000304, 060304
		.word	005302, 062706, 000002, 010607, 012737, 000001, 177550, 105737
		.word	177550, 100375, 013704, 177552, 060401, 000762, 012705, 111111
		.word	001024, 177777, 000676, 110420, 010706, 001356, 005702, 002373
		.word	000402, 012707, 173314, 105701, 001665, 001360, 010706, 001313
		.word	060405, 010706, 001341, 105701, 001351, 012707, 173000, 177777
	.endc
;_______________________________________________________________________
;
		.end
