;===================================================================================
;
;		        Тест процессора КР1801ВМ2 для УКНЦ
;
;				  Версия 0.3a
;
;			      (c) dr.Titus 2012
;
;===================================================================================

		.MCall	.TTYIN, .TTYOUT, .Print, .Exit
	
		.RADIX	10
	
		.CSect

CSR2STATE	=	^O176674
CSR2DATA	=	^O176676

PPLADR		=	^O177010
PPL12DATA	=	^O177014

$JSW    	=       ^O44
TTSPC$  	=       ^O10000

TPLCPU		=	60			;Тактов на дополнительные команды в каждом цикле
TPSCPU		=	100			;Такты на вход и выход из цикла замера

TPLPPU		=	84			;Тактов на дополнительные команды в каждом цикле
TPSPPU		=	420			;Такты на вход и выход из цикла замера


;===============================================
Start:

		
;-----------------------------------------------
	
;		.Print	#KeyOFF			;Отключить клавиатуру

		MOV	#Text0,R1		;Информация о тесте
		CALL	PrnStr			;Печатать название теста

		CALL	SetVectors		;Установить наши вектора TRAP 4,10

;----------------------------------------------- Тестирование правильности команд CPU
CPUFuncTest:
		MOV	#Text2,R1		;
		CALL	PrnStr			;Печатать название теста

		MOV	#TRUETAB,R1		;R1 - Таблица для тестирования правильности команд CPU
;		MOV	#DIVT,R1		;R1 - Таблица для тестирования правильности команд CPU
1$:		
		CALL	ComTest			;Тестирование одной команды (группы команд) CPU
		
		TST	(R1)			;Если еще не конец таблицы,
		BNE	1$			;то цикл --> 1$
		
;-----------------------------------------------
ExitTest:
		CALL	RestVectors		;Восстановить системные вектора TRAP 4,10 

;		.Print	#KeyON			;Включить клавиатуру
	
		.Exit
				


;===================================================================================
;
;	Печать NULL-terminated строку с вопросом перехода на следующий экран
;
;	Входные данные:	R1 - указатель на строку
;
;===================================================================================
			
PrnStr:
		CMP	LineCtr,#23		;Если напечатали < 23 строки, то
		BCS	4$			;пропустить вопрос --> 4$
		
;----------------------------------------------- Next page?

		MOV	R1,-(SP)		;Сохранить на стеке R1
		
		CALL	RestVectors		;Восстановить системные вектора TRAP 4,10 

		.Print	#NextPage		;Печатаем сообщение "Next page?"

;		.Print	#KeyON			;Включить клавиатуру

  		 BIS     #TTSPC$,@#$JSW		;Запрет отображения символов на экране
  		 .TTYIN				;Ожидание нажатия клавиши
  		 CMPB	R0,#13			;Если код = 13 (Возврат каретки),
  		 BNE	3$			;то ожидаем еще один код = 10 (перевод строки)
  		 .TTYIN				;	 
3$:			 
;		.Print	#KeyOFF			;Отключить клавиатуру
		
		.Print	#NextLine		;Переходим на следующую строку
	
		CLR	LineCtr			;Сбросить счетчик строк

		CALL	SetVectors		;Установить наши вектора TRAP 4,10
		
		MOV	(SP)+,R1		;Восстановить R1
4$:
;----------------------------------------------- Печать символа

		MOVB	(R1)+,R0		;(R1)+ -> R0
		BEQ	1$			;Если равен 0, то выход --> 1$
		CMP	#10,R0			;Если равен 10, то 
 		BNE	2$			;		
		INC	LineCtr			;Прирастить счетчик строк
2$:		

		.TTYOUT				;Печать символа в R0
		
;		EMT	^O341			;Печать символа в R0
		
		BR	PrnStr			;Цикл		
1$:		

		RETURN				;Выход


;===================================================================================
;
;		Сохранить системные вектора TRAP 4,10
;
;===================================================================================
SetVectors:		
		MOV	@#^O004,CPC004		;Сохранить вектор текущего прерывания по ошибке шины
		MOV	@#^O006,CSW004		;в CPC004/CSW004

		MOV	@#^O010,CPC010		;Сохранить вектор текущего прерывания по резервному коду
		MOV	@#^O012,CSW010		;в CPC010/CSW010

		MOV	#InTR4,@#^O004		;InTR4 -> адрес вектора прерывания по ошибке шины
		MOV	#InTR10,@#^O010		;InTR10 -> адрес вектора прерывания по резервному коду

		RETURN				;Выход

;===================================================================================
;
;		Восстановить системные вектора TRAP 4,10
;
;===================================================================================
RestVectors:		
		MOV	CSW004,@#^O006		;Восстановить PSW вектора 004
		MOV	CPC004,@#^O004		;Восстановить адрес обработки прерывания

		MOV	CSW010,@#^O012		;Восстановить PSW вектора 010
		MOV	CPC010,@#^O010		;Восстановить адрес обработки прерывания

		RETURN				;Выход


;===================================================================================
;
;		Печать в буфер шестнадцатиричного числа
;
;	Входные данные:	R0 - указатель на буфер
;			R1 - число
;	Выходные данные: R0 - указатель на буфер после числа
;
;===================================================================================
PrBHex:		
		MOV	#4,R3			;Счетчик на 4 цифры
1$:		
		ADD	R1,R1			;Циклический сдвиг R1 влево
		ADC	R1			;на 4 бита
		ADD	R1,R1			;
		ADC	R1			;
		ADD	R1,R1			;
		ADC	R1			;
		ADD	R1,R1			;
		ADC	R1			;
	
		MOV	R1,R2			;Преобразовать младший ниббл R1 в шестнадцатиричную ASCII-цифру 
		BIC	#65520,R2		;AND $000F,R2
		CMP	R2,#10			;
		BCS	2$			;
		ADD	#7,R2			;		
2$:		ADD	#48,R2			;

		MOVB	R2,(R0)+		;Занести цифру в буфер
		
		SOB	R3,1$			;Цикл на 4 цифры
		
		RETURN				;Выход


;===================================================================================
;
;		Печать в буфер десятичного числа
;
;	Входные данные:	R0 - указатель на буфер
;			R1 - 0 - не печатать ведущие нули, <0 - печатать
;			R3 - число
;			R5 - вес старшего разряда
;	Выходные данные: R0 - указатель на буфер после числа
;	Портит регистры: R0..R5
;
;===================================================================================
PrBDec:
		CLR	R2			;R2.R3 - число		
		SUB	R4,R4			;R4.R5 - вес разряда
		DIV	R5,R2			;R2 = R2.R3/R5, R3 - остаток
		CMP	R2,R1			;Если R2 = R1, 
		BEQ	1$			;то пропускаем цифру --> 1$
		DEC	R1			;Снимаем флаг, запрещающий печатать нули
		ADD	#48,R2			;R2 - ASCII-цифра
		MOVB	R2,(R0)+		;R2 -> (R0)+ (заносим цифру в буфер)
1$:		DIV	#10,R4			;R4 = R4.R5 / 10 (перейти к следущему разряду)	
		MOV	R4,R5			;R5 = R4
		BNE	PrBDec			;Если вес разряда <> 0, то цикл --> PrBDec
		
		RETURN				;Выход

;===================================================================================
;
;		Печать на экран десятичного числа без ведущих нулей
;
;	Входные данные:	R3 - число 0..65535
;	Портит регистры: R0, R2..R5
;
;===================================================================================
PSBDec:
		MOV	R1,-(SP)		;Сохранить R1 на стеке
					
		MOV	#TextBuf,R0		;R0 - буфер для печати
		CLR	R1			;R1 = 0 (не печатать ведущие нули)
		MOV	#10000,R5		;Число до 5 знаков
		CALL	PrBDec			;Печатать в буфер R1
		CLRB	(R0)			;Закрыть стринг
		
		MOV	#TextBuf,R1		;
		CALL	PrnStr			;Печатать число из буфера на экране
	
		MOV	(SP)+,R1		;Восстановить R1
	
		RETURN				;Выход
		

;===================================================================================
;
;		Печать результата теста правильности команды CPU
;
;	Входные данные:	R0 - результат теста (0xA5A1, 0xA5A2 - TRAP 4 и TRAP 10)
;
;===================================================================================
PrTstRes:
		MOV	R1,-(SP)		;Сохранить R1 на стеке
					
		MOV	#TTrap4,R1		;Если R0 = 0xA5A1,
		CMP	#42401,R0		;то печатать "Trap 4"
		BEQ	1$			;--> PrnStr
		
		MOV	#TTrap10,R1		;Если R0 = 0xA5A2,
		CMP	#42402,R0		;то печатать "Trap 10"
		BEQ	1$			;--> PrnStr
	
		MOV	R0,R1			;R1 - число
		MOV	#TextBuf,R0		;R0 - буфер для печати
		MOVB	#48,(R0)+		;Занести в буфер "0x"
		MOVB	#120,(R0)+		;
		CALL	PrBHex			;Печатать в буфер R1
		CLRB	(R0)			;Закрыть стринг
		
		MOV	#TextBuf,R1		;
1$:		CALL	PrnStr			;Печатать число из буфера на экране
	
		MOV	(SP)+,R1		;Восстановить R1
	
		RETURN				;Выход


;===================================================================================
		
	





;===================================================================================
;
;		Тестирование правильности выполнение команд процессора
;
;===================================================================================
ComTest:
		MOV	R1,-(SP)		;
		MOV	#NextL0,R1		;Переход на следующую строчку
		CALL	PrnStr			;
		MOV	(SP)+,R1		;

		.TTYOUT #9			;Печать символа <9> (Табуляция)
		
		CALL	PrnStr			;Печать мнемоники по адресу R1

		.TTYOUT #9			;Печать символа <9> (Табуляция)
		.TTYOUT #45			;Печать символа "-"
		.TTYOUT #32			;Печать пробела

		INC	R1			;Even R1 (выравнивание на границу слова)
		BIC	#1,R1			;

;----------------------------------------------- 
		
		MOV	(R1)+,R0
		CALL	(R0)			;Вызов функции тестирования
		
						;R5 - посчитанная сумма
		MOV	(R1)+,R4		;R4 - правильная сумма
		
		CMP	R4,R5			;Если R4 = R5,
		BNE	1$			;то
		.Print	#TxtOK			;печать "ОК"
		
		RETURN				;Выход
	
;----------------------------------------------- R4 <> R5
1$:
		.Print	#TxtERROR		;Печать "ERROR "
		
		MOV	R4,R0			;R0 - число
		CALL	PrTstRes		;Печать 16-ричной суммы или "TRAP 4/10"
		
		.Print	#TxtSlash		;Печать " / "
		
		MOV	R5,R0			;R0 - число
		CALL	PrTstRes		;Печать 16-ричной суммы или "TRAP 4/10"


		RETURN				;Выход


;===================================================================================
;
;	Процедуры тестирования правильности выполнения команд процессора
;
;===================================================================================

;===================================================================================
;
;		Тестовая функция однооперандных байтовых команд
;
;===================================================================================
InB1Op:						
		MOV	#2$,R0			;Занести 1 слово команды
		MOV	(R1)+,(R0)		;из таблицы в код процедуры

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр
						;R1 - счетчик аргумента
						;R2 - результат
						;R3 - счетчик PSW
						;R4 - счетчик на 16 итераций
						;R5 - накопленная сумма
						
		CLR	R1			;R1 = 0 (инициализация аргумента)
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#16,R4			;R4 = 16 (счетчик на 16 итераций)				
1$:						
		MOVB	R1,R2			;R2 = R1 (аргумент 0..255 с расширением знака)
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		NOP				;Команда сигнатуры
		MFPS	R0			;R0 = PSW
		ADD	R0,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R2,R5			;R5 = R5 + R2
		INCB	R1			;R1 = R1 + 1
		BNE	1$			;Если не достигли 0, то цикл (256 итераций)
		INC	R3			;R3 = R3 + 1
		SOB	R4,1$			;Цикл на 16 итераций (4 бита флагов) 

;-----------------------------------------------
InTRExit:					;Выход в случае прерывания TRAP n
		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход


;===================================================================================
;
;		Тестовая функция однооперандных словных команд
;
;===================================================================================
InW1Op:

		MOV	#2$,R0			;Занести 1 слово команды
		MOV	(R1)+,(R0)		;из таблицы в код процедуры

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр
						;R1 - счетчик аргумента
						;R2 - результат
						;R3 - счетчик PSW
						;R4 - счетчик на 16 итераций
						;R5 - накопленная сумма
						
		CLR	R1			;R1 = 0 (инициализация аргумента)
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#16,R4			;R4 = 16 (счетчик на 16 итераций)				
1$:						
		MOV	R1,R2			;R2 = R1 (аргумент 0..65535)
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		NOP				;Команда сигнатуры
		MFPS	R0			;R0 = PSW
		ADD	R0,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R2,R5			;R5 = R5 + R2
		INC	R1			;R1 = R1 + 1
		BNE	1$			;Если не достигли 0, то цикл (65536 итераций)
		INC	R3			;R3 = R3 + 1
		SOB	R4,1$			;Цикл на 16 итераций (4 бита флагов) 

		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход

;===================================================================================
;
;		Тестовая функция двухоперандных байтовых команд
;
;===================================================================================
InB2Op:						

		MOV	#2$,R0			;Занести 1 слово команды
		MOV	(R1)+,(R0)		;из таблицы в код процедуры

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр
						;R1 - счетчик аргумента
						;R2 - результат
						;R3 - счетчик PSW
						;R4 - счетчик на 16 итераций
						;R5 - накопленная сумма
						
		CLR	R1			;R1 = 0 (инициализация аргумента)
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#16,R4			;R4 = 16 (счетчик на 16 итераций)				
1$:						
		MOV	R1,R2			;R2.b - операнд-1 0..255
		SWAB	R2			;R1.b - операнд-2 0..255
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		NOP				;Команда сигнатуры
		MFPS	R0			;R0 = PSW
		ADD	R0,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R2,R5			;R5 = R5 + R2
		INC	R1			;R1 = R1 + 1
		BNE	1$			;Если не достигли 0, то цикл (65536 итераций)
		INC	R3			;R3 = R3 + 1
		SOB	R4,1$			;Цикл на 16 итераций (4 бита флагов) 

		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход

;===================================================================================
;
;		Тестовая функция двухоперандных словных команд 
;			       (частичный перебор)
;
;===================================================================================
InW2Op:						

		MOV	#2$,R0			;Занести 1 слово команды
		MOV	(R1)+,(R0)		;из таблицы в код процедуры

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр, аргумент 1
						;R1 - глобальный счетчик аргумента
						;R2 - аргумент 2
						;R3 - счетчик PSW
						;R4 - счетчик на 16 итераций
						;R5 - накопленная сумма
						
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#16,R4			;R4 = 16 (счетчик на 16 итераций)				
1$:		MOV	#16383,R1		;R1 = 0x3FFF (инициализация аргумента)			
5$:
		MOV	R1,R0			;
		ADD	R0,R0			;R0 = R1 << 2
		ADD	R0,R0			;
		BIC	#8191,R0		;R0 = R0 and 0xE000
		BISB	R1,R0			;R0.b = R0.b and R1.b
		BIC	#8176,R0		;R0 = R0 and 0xE00F
		BIT	#8,R0			;Если R0[3] = 1,
		BEQ	3$			;то R0[12..4] = 1
		BIS	#8176,R0		;R0 - операнд-1 0..65535	
3$:
		MOV	R1,R2			;
		SWAB	R2			;
		BIC	#4088,R2		;R2 = R2 and 0xF007
		BIT	#4,R2			;Если R2[2] = 1,
		BEQ	4$			;то R2[11..3] = 1
		BIS	#4088,R2		;R2 - операнд-2 0..65535		
4$:
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		NOP				;Команда сигнатуры
		MFPS	R0			;R0 = PSW
		ADD	R1,R5			;R5 = R5 + R1
		ADD	R0,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R2,R5			;R5 = R5 + R2
		DEC	R1			;R1 = R1 - 1
		BPL	5$			;Если не достигли -1, то цикл (16384 итерации)
		INC	R3			;R3 = R3 + 1
		SOB	R4,1$			;Цикл на 16 итераций (4 бита флагов) 

		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход


;===================================================================================
;
;		  Тестовая функция команд работы с флагами
;
;===================================================================================
InFlags:					

						;Занести 1 слово команды
		MOV	(R1)+,R2		;из таблицы в регистр R2
		
		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр
						;R1 - счетчик аргумента
						;R2 - результат
						;R3 - счетчик PSW
						;R4 - счетчик на 16 итераций
						;R5 - накопленная сумма
						
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#16,R4			;R4 = 16 (счетчик на 16 итераций)				
1$:		MOV	#15,R1			;R1 = 0xF (инициализация аргумента)
		
3$:	
		BIC	#15,R2			;R2 = R2 and 0xFFF0
		BIS	R1,R2			;R2 = R2 or R1
		MOV	R2,2$			;R2 -> (2$)
	
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		NOP				;Команда сигнатуры
		MFPS	R0			;R0 = PSW
		ADD	R1,R5			;R5 = R5 + R1
		ADD	R0,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R1,R5			;R5 = R5 + R1
		ADD	R3,R5			;R5 = R5 + R3
		DEC	R1			;R1 = R1 - 1
		BPL	3$			;Если не достигли -1, то цикл (16 итераций)
		INC	R3			;R3 = R3 + 1
		SOB	R4,1$			;Цикл на 16 итераций (4 бита флагов) 

		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход


;===================================================================================
;
;			Тестовая функция условных переходов
;
;===================================================================================
InBcc:						
		
		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр
						;R1 - не используется
						;R2 - результат
						;R3 - счетчик PSW
						;R4 - счетчик на 16 итераций
						;R5 - накопленная сумма
						
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#16,R4			;R4 = 16 (счетчик на 16 итераций)				
1$:		MOV	#256+2,2$		;'BR +2' -> (2$) (инициализация сигнатуры команды)
3$:	
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		BR	4$			;Команда сигнатуры
		ADD	2$,R5			;R5 = R5 + (2$) (если перехода не было)	
4$:		
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	2$,R5			;R5 = R5 + (2$)
		ADD	R3,R5			;R5 = R5 + R3
		
		ADD	#256,2$			;(2$) = (2$) + 0x100 (к следующей команде перехода)
		BIT	#2048,2$		;Если (2$)[11] <> 1,
		BEQ	3$			;то цикл -> 3$
		MOV	#34816,R0		;(2$) = (2$) xor 0x8800 (ко второму набору)
		XOR	R0,2$			;
		BMI	3$			;Если не конец второго набора, то -> 3$
				
		INC	R3			;R3 = R3 + 1
		SOB	R4,1$			;Цикл на 16 итераций (4 бита флагов) 
6$:
		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход


;===================================================================================
;
;			Тестовая функция для команды умножения
;				  (частичный перебор)
;
;===================================================================================
InMUL:						

		MOV	#2$,R0			;Занести 1 слово команды
		MOV	(R1)+,(R0)		;из таблицы в код процедуры

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр, аргумент 1
						;R1 - аргумент 2
						;R2 - глобальный счетчик аргумента
						;R3 - счетчик PSW
						;R4 - временный регистр
						;R5 - накопленная сумма
						
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
1$:		MOV	#16383,R2		;R2 = 0x3FFF (инициализация аргумента)			
5$:
		MOV	R2,R0			;
		ADD	R0,R0			;R0 = R2 << 2
		ADD	R0,R0			;
		BIC	#8191,R0		;R0 = R0 and 0xE000
		BISB	R2,R0			;R0.b = R0.b and R2.b
		BIC	#8176,R0		;R0 = R0 and 0xE00F
		BIT	#8,R0			;Если R0[3] = 1,
		BEQ	3$			;то R0[12..4] = 1
		BIS	#8176,R0		;R0 - операнд-1 0..65535	
3$:
		MOV	R2,R1			;
		SWAB	R1			;
		BIC	#4088,R1		;R1 = R1 and 0xF007
		BIT	#4,R1			;Если R1[2] = 1,
		BEQ	4$			;то R1[11..3] = 1
		BIS	#4088,R1		;R1 - операнд-2 0..65535		
4$:
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		NOP				;Команда сигнатуры
		MFPS	R4			;R4 = PSW
		ADD	R2,R5			;R5 = R5 + R2
		ADD	R0,R5			;R5 = R5 + R0
		ADD	R4,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R1,R5			;R5 = R5 + R1
		DEC	R2			;R2 = R2 - 1
		BPL	5$			;Если не достигли -1, то цикл (16384 итерации)
		
		INC	R3			;R3 = R3 + 1
		BIT	#16,R3			;Если R3[4] <> 1, 
		BEQ	1$			;то цикл -> 1$ (цикл на 16 итераций, 4 бита флагов)

		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход

;===================================================================================
;
;			Тестовая функция для аргумента 16->32
;				  (табличный тест)
;
;===================================================================================
InT16:						

		MOV	#InT16Func,R0		;Занести 1 слово команды
		MOV	(R1)+,(R0)		;из таблицы в код процедуры

		MOV	R1,R2			;
						
						;R0 - аргумент 1
						;R1 - аргумент 2
						;R2 - указатель на таблицу аргументов
						;R3 - не используется
						;R4 - временный регистр
						;R5 - накопленная сумма
						
		CLR	R5			;R5 = 0 (инициализация суммы)
1$:
		MOV	(R2)+,R0		;R0 - аргумент-1
		MOV	(R2)+,R1		;R1 - аргумент-2
		CMP	#4660,R1		;Если R1 = 0x1234
		BEQ	3$			;то выход --> 

		CALL	InT16Sub		;Сама тестовая функция

		BR	1$			;цикл -> 1$	
3$:
		MOV	R2,R1			;Восстановить R1

		RETURN				;Выход

;===============================================
InT16Sub:
		MOV	R1,-(SP)		;Сохранить ненужный регистр R1 
						;(для совместимости с ловушкой по TRAP 4,10)	
		
		ADD	R0,R5			;R5 = R5 + R0
		ADD	R1,R5			;R5 = R5 + R1

		CLR	R4			;
		MTPS	R4			;PSW = R4 (флаги 0000)
InT16Func:	NOP				;Команда сигнатуры
		MFPS	R4			;R4 = PSW
		ADD	R0,R5			;R5 = R5 + R0
		ADD	R4,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R1,R5			;R5 = R5 + R1

		MOV	(SP)+,R1		;Восстановить ненужный регистр R1
						;(для совместимости с ловушкой по TRAP 4,10)
						
		RETURN				;Выход
		

;===================================================================================
;
;		Тестовая функция для команды 16-битного сдвига
;			     (частичный перебор)
;
;===================================================================================
InASH:						

		MOV	#2$,R0			;Занести 2 слова команды инициализации
		MOV	(R1)+,(R0)+		;из таблицы в код процедуры
		MOV	(R1)+,(R0)		;

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр, аргумент 1
						;R1 - аргумент 2, счетчик
						;R2 - не используется
						;R3 - счетчик PSW
						;R4 - временный регистр
						;R5 - накопленная сумма
						
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#-128,R1		;R1 = 0xFF80 (инициализация аргумента)			
5$:
2$:		MOV	#0000,R0		;Команда сигнатуры
		MTPS	R3			;PSW = R3 (флаги 0..15)
		ASH	R1,R0			;R0 = R0 ash R1
		MFPS	R4			;R4 = PSW
		ADD	R0,R5			;R5 = R5 + R0
		ADD	R4,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R1,R5			;R5 = R5 + R1
		INC	R1			;R2 = R2 - 1
		CMP	#128,R1
		BNE	5$			;Если не достигли 128, то цикл (256 итерации)
		
		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход

;===================================================================================
;
;		Тестовая функция для команды 3216-битного сдвига
;			     (частичный перебор)
;
;===================================================================================
InASHC:						

		MOV	#2$,R0			;Занести слова команды инициализации
		MOV	(R1)+,(R0)+		;из таблицы в код процедуры
		MOV	(R1)+,(R0)+		;
		MOV	(R1)+,(R0)+		;
		MOV	(R1)+,(R0)+		;
		MOV	#3$,R0			;
		MOV	(R1)+,(R0)		;

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр, аргумент 1
						;R1 - аргумент 2
						;R2 - счетчик сдвига
						;R3 - не используется
						;R4 - временный регистр
						;R5 - накопленная сумма
						
		CLR	R5			;R5 = 0 (инициализация суммы)
		MOV	#-128,R2		;R1 = 0xFF80 (инициализация аргумента)	
		
2$:		MOV	#0000,R0		;Команда сигнатуры
		MOV	#0000,R1		;
		CLR	R4			;R4 = 0 (инициализация PSW, прерывания разрешены) 	
		MTPS	R4			;PSW = R4 (флаги 0..15)
3$:		ASHC	R2,R0			;R0 = R0.R1 ashc R2
		MFPS	R4			;R4 = PSW
		ADD	R0,R5			;R5 = R5 + R0
		ADD	R2,R5			;R5 = R5 + R2
		ADD	R4,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R1,R5			;R5 = R5 + R1
		INC	R2			;R2 = R2 + 1
		CMP	#128,R2			;Если не достигли 128,
		BNE	2$			;то цикл (256 итерации)
		
		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход


;===================================================================================
;
;			Тестовая для команды деления
;			     (частичный перебор)
;
;===================================================================================
InDIV:						

		MOV	#2$,R0			;Занести 1 слово команды
		MOV	(R1)+,(R0)		;из таблицы в код процедуры

		MOV	R1,-(SP)		;Сохранить R1	
						
						;R0 - временный регистр, старшая часть аргумента 1
						;R1 - младшая часть аргумента 1
						;R2 - аргумент 2
						;R3 - счетчик PSW
						;R4 - глобальный счетчик аргумента
						;R5 - накопленная сумма
						
		CLR	R3			;R3 = 0 (инициализация PSW, прерывания разрешены) 	
		CLR	R5			;R5 = 0 (инициализация суммы)
1$:		MOV	#16383,R4		;R4 = 0x3FFF (инициализация аргумента)			
5$:
		MOV	R4,R0			;
		ADD	R0,R0			;R0 = R4 << 2
		ADD	R0,R0			;
		BIC	#8191,R0		;R0 = R0 and 0xE000
		MOV	R4,R1			;R1 = R4
		BIC	#65520,R1		;R1 = R1 and 0x000F
		BIT	#8,R1			;Если R1[3] = 1,
		BEQ	3$			;то R0[12..0] = 1
		BIS	#65520,R1		;R1[15..4] = 1
		BIS	#8191,R0		;R0.R1 - операнд-1 0..0xFFFFFFFF
3$:
		MOV	R4,R2			;
		SWAB	R2			;
		BIC	#4088,R2		;R2 = R2 and 0xF007
		BIT	#4,R2			;Если R2[2] = 1,
		BEQ	4$			;то R2[11..3] = 1
		BIS	#4088,R2		;R2 - операнд-2 0..65535		
4$:
		MTPS	R3			;PSW = R3 (флаги 0..15)
2$:		NOP				;Команда сигнатуры
		MFPS	R2			;R2 = PSW
		ADD	R4,R5			;R5 = R5 + R4
		ADD	R2,R5			;R5 = R5 + PSW
		ADD	R5,R5			;R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R1,R5			;R5 = R5 + R1
		ADD	R0,R5			;R5 = R5 + R0
		DEC	R4			;R4 = R4 - 1
		BPL	5$			;Если не достигли -1, то цикл (16384 итерации)
		
		INC	R3			;R3 = R3 + 1
		BIT	#16,R3			;Если R3[4] <> 1, 
		BEQ	1$			;то цикл -> 1$ (цикл на 16 итераций, 4 бита флагов)

		MOV	(SP)+,R1		;Восстановить R1

		RETURN				;Выход


;===================================================================================
;
;		Тестовая функция для команды MARK
;
;===================================================================================
InMark:						
		MOV	#Mark10,@#^O010		;Mark10 -> адрес вектора прерывания по резервному коду

		MOV	R1,-(SP)		; Сохранить R1	
						
						; R0 - временный регистр
						; R1 - счетчик аргумента
						; R3 - сохраненный указатель стека
						; R5 - накопленная сумма

		MOV	#25561,R5		; R5 = 25561 (инициализация суммы простым числом)
		MOV	SP,R3			; R3 = SP (сохранить стек)
		MOV	#63,R1			; R1 = 63 (счетчик на 64 итерации)				
1$:
		MOV	R3,SP			; SP = R3 (восстановить стек, если испорчен)
		
		MOV	R5,-(SP)		; Занести в стек R5
		SUB	R1,SP			; SP = SP - (R1 * 2)
		SUB	R1,SP			;
		MOV	#^O006400,R0		; R0 - код команды MARK N
		ADD	R1,R0			;
		MOV	R0,-(SP)		; Занести команду MARK в стек
		MOV	#3$,R5			; R5 = 3$
		BIC	#65520,R0		; R0 - набор флагов в младших 4 битах
		MTPS	R0			; PSW = R0 (флаги 0..15)
		JMP	(SP)			; Перейти на SP
3$:						
		MFPS	R0			; R0 = PSW
		ADD	R0,R5			; R5 = R5 + PSW
		MOV	R5,R0			; R0 = R5
		ADD	R5,R5			; R5 = R5 rol 1 (декoрреляция)
		ADC	R5			;
		ADD	R0,R5			; R5 = R5 + R0
		ADD	R1,R5			; R5 = R5 + R1
		ADD	R3,R5			; R5 = R5 + (R3 - SP)
		SUB	SP,R5			;

		DEC	R1			; R1 = R1 + 1
		BPL	1$			; Если >=0, то цикл (64 итерации)

MarkExit:
		MOV	SP,R3			; SP = R3 (восстановить стек, если был испорчен)		
		MOV	(SP)+,R1		; Восстановить R1

		MOV	#InTR10,@#^O010		; Восстановить стандартный адрес вектора прерывания по резервному коду

		RETURN				; Выход
		
;===================================================================================
;
;		  Обработчик TRAP 10 для тестирования команды MARK
;
;===================================================================================
Mark10:						

		MOV	#MarkExit,(SP)		;Поменять адрес выхода на MarkExit
		MOV	#42402,R5		;R5 = 0xA5A52
		RTI				;Выход из прерывания 

;-----------------------------------------------


;===================================================================================
;
;		  Обработчик TRAP 4 для тестирования команд CPU
;
;===================================================================================
InTR4:										
		MOV	#InTRExit,(SP)		;Поменять адрес выхода на InTRExit
		MOV	#42401,R5		;R5 = 0xA5A51
		RTI				;Выход из прерывания 

;===================================================================================
;
;		  Обработчик TRAP 10 для тестирования команд CPU
;
;===================================================================================
InTR10:						

		MOV	#InTRExit,(SP)		;Поменять адрес выхода на InTRExit
		MOV	#42402,R5		;R5 = 0xA5A52
		RTI				;Выход из прерывания 



;===================================================================================

Text0:		.ASCIZ	<14>"tEST PROCESSORA kr1801wm2"<15>" v0.3a (c) by dr.Titus"
Text2:		.ASCIZ	<13><10><13><10><14>"tESTIROWANIE PRAWILXNOSTI WYPOLNENIQ KOMAND PROCESSORA:"<15><13><10>

NextPage:	.ASCII	"Next page?"<128>

NextLine:	.ASCII	<13><10><128>

NextL0:		.ASCIZ	<13><10>

KeyOFF:		.ASCII	<27><91><50><104><128>
KeyON:		.ASCII	<27><91><50><108><128>

TTrap4:		.ASCIZ	"TRAP 4"
TTrap10:	.ASCIZ	"TRAP 10"

TxtOK:		.ASCII	"OK"<128>
TxtERROR:	.ASCII	"ERROR: "<128>
TxtSlash:	.ASCII	" / "<128>
TxtER2:		.ASCII	"Error, must be: "<128>


TextBuf:	.BLKB	64			;Текстовый буфер на 64 буквы

		.Even

;===============================================

CPC004:		.WORD	0			;Вектор 004
CSW004:		.WORD	0			;
CPC010:		.WORD	0			;Вектор 010
CSW010:		.WORD	0			;

LineCtr:	.WORD	0			;Счетчик строк

PNextEl:	.WORD	0			;Адрес следующего элемента в таблице
PComCtr:	.WORD	0			;Число выполненных команд за один кадр
PInteger:	.WORD	0			;Целая часть числа
PFraction:	.WORD	0			;Дробная часть числа




;===================================================================================
;	
;		Таблица шаблонов для проверки правильности выполнения команд
;
;===================================================================================
TRUETAB:
						;Однооперандный байтовый режим:
						; R1 - циклический счетчик 0..255
						; R2 - результат операции

		.ASCII	<14>"oDNOOPERANDNYE BAJTOWYE KOMANDY:"<15><13><10><9>

		.ASCIZ	"NOP"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		NOP				;Тестируемый фрагмент
		.WORD	47358			;Правильный результат теста
		
		.ASCIZ	"MOVB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		MOVB	R1,R2			;Тестируемый фрагмент
		.WORD	22591			;Правильный результат теста
		
		.ASCIZ	"CLRB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		CLRB	R2			;Тестируемый фрагмент
		.WORD	174			;Правильный результат теста
		
		.ASCIZ	"COMB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		COMB	R2			;Тестируемый фрагмент
		.WORD	19640			;Правильный результат теста

		.ASCIZ	"INCB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		INCB	R2			;Тестируемый фрагмент
		.WORD	45759			;Правильный результат теста

		.ASCIZ	"DECB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		DECB	R2			;Тестируемый фрагмент
		.WORD	16439			;Правильный результат теста

		.ASCIZ	"NEGB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		NEGB	R2			;Тестируемый фрагмент
		.WORD	34896			;Правильный результат теста

		.ASCIZ	"TSTB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		TSTB	R2			;Тестируемый фрагмент
		.WORD	22591			;Правильный результат теста

		.ASCIZ	"ROLB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		ROLB	R2			;Тестируемый фрагмент
		.WORD	59598			;Правильный результат теста

		.ASCIZ	"RORB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		RORB	R2			;Тестируемый фрагмент
		.WORD	14191			;Правильный результат теста

		.ASCIZ	"ASRB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		ASRB	R2			;Тестируемый фрагмент
		.WORD	39071			;Правильный результат теста

		.ASCIZ	"ASLB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		ASLB	R2			;Тестируемый фрагмент
		.WORD	34430			;Правильный результат теста

		.ASCIZ	"ADCB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		ADCB	R2			;Тестируемый фрагмент
		.WORD	20623			;Правильный результат теста

		.ASCIZ	"SBCB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		SBCB	R2			;Тестируемый фрагмент
		.WORD	23623			;Правильный результат теста

		.ASCIZ	"SXT"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB1Op			;Функция инициализации
		SXT	R2			;Тестируемый фрагмент
		.WORD	753			;Правильный результат теста

;-----------------------------------------------
TRUE16:
		.ASCII	<13><10><9><14>"oDNOOPERANDNYE SLOWNYE KOMANDY:"<15><13><10><9>
		
		.ASCIZ	"MOV"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		MOV	R2,R2			;Тестируемый фрагмент
		.WORD	21045			;Правильный результат теста
		
		.ASCIZ	"CLR"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		CLR	R2			;Тестируемый фрагмент
		.WORD	40952			;Правильный результат теста
		
		.ASCIZ	"COM"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		COM	R2			;Тестируемый фрагмент
		.WORD	40884			;Правильный результат теста

		.ASCIZ	"INC"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		INC	R2			;Тестируемый фрагмент
		.WORD	31498			;Правильный результат теста

		.ASCIZ	"DEC"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		DEC	R2			;Тестируемый фрагмент
		.WORD	21477			;Правильный результат теста

		.ASCIZ	"NEG"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		NEG	R2			;Тестируемый фрагмент
		.WORD	55940			;Правильный результат теста

		.ASCIZ	"TST"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		TST	R2			;Тестируемый фрагмент
		.WORD	42568			;Правильный результат теста

		.ASCIZ	"ROL"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		ROL	R2			;Тестируемый фрагмент
		.WORD	4314			;Правильный результат теста

		.ASCIZ	"ROR"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		ROR	R2			;Тестируемый фрагмент
		.WORD	16955			;Правильный результат теста

		.ASCIZ	"ASR"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		ASR	R2			;Тестируемый фрагмент
		.WORD	56713			;Правильный результат теста

		.ASCIZ	"ASL"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		ASL	R2			;Тестируемый фрагмент
		.WORD	53748			;Правильный результат теста

		.ASCIZ	"ADC"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		ADC	R2			;Тестируемый фрагмент
		.WORD	34714			;Правильный результат теста

		.ASCIZ	"SBC"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		SBC	R2			;Тестируемый фрагмент
		.WORD	37579			;Правильный результат теста

		.ASCIZ	"SWAB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW1Op			;Функция инициализации
		SWAB	R2			;Тестируемый фрагмент
		.WORD	28360			;Правильный результат теста

;-----------------------------------------------

		.ASCII	<13><10><9><14>"dWUHOPERANDNYE BAJTOWYE KOMANDY:"<15><13><10><9>
		
		.ASCIZ	"CMPB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB2Op			;Функция инициализации
		CMPB	R1,R2			;Тестируемый фрагмент
		.WORD	32299			;Правильный результат теста

		.ASCIZ	"BITB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB2Op			;Функция инициализации
		BITB	R1,R2			;Тестируемый фрагмент
		.WORD	20674			;Правильный результат теста

		.ASCIZ	"BICB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB2Op			;Функция инициализации
		BICB	R1,R2			;Тестируемый фрагмент
		.WORD	34044			;Правильный результат теста

		.ASCIZ	"BISB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InB2Op			;Функция инициализации
		BISB	R1,R2			;Тестируемый фрагмент
		.WORD	3366			;Правильный результат теста

;-----------------------------------------------

		.ASCII	<13><10><9><14>"dWUHOPERANDNYE SLOWNYE KOMANDY (^ASTI^NYJ TEST):"<15><13><10><9>
		
		.ASCIZ	"ADD"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW2Op			;Функция инициализации
		ADD	R0,R2			;Тестируемый фрагмент
		.WORD	19449			;Правильный результат теста

		.ASCIZ	"SUB"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW2Op			;Функция инициализации
		SUB	R0,R2			;Тестируемый фрагмент
		.WORD	53150			;Правильный результат теста

		.ASCIZ	"CMP"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW2Op			;Функция инициализации
		CMP	R0,R2			;Тестируемый фрагмент
		.WORD	20463			;Правильный результат теста

		.ASCIZ	"BIT"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW2Op			;Функция инициализации
		BIT	R0,R2			;Тестируемый фрагмент
		.WORD	24602			;Правильный результат теста

		.ASCIZ	"BIC"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW2Op			;Функция инициализации
		BIC	R0,R2			;Тестируемый фрагмент
		.WORD	20591			;Правильный результат теста

		.ASCIZ	"BIS"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW2Op			;Функция инициализации
		BIS	R0,R2			;Тестируемый фрагмент
		.WORD	29619			;Правильный результат теста

		.ASCIZ	"XOR"<9>		;Мнемоника команды
		.Even				;
		.WORD	InW2Op			;Функция инициализации
		XOR	R0,R2			;Тестируемый фрагмент
		.WORD	14773			;Правильный результат теста


;-----------------------------------------------
ALU16:
		.ASCII	<13><10><9><14>"kOMANDY RABOTY S FLAGAMI:"<15><13><10><9>
		
		.ASCIZ	"CLx"<9>		;Мнемоника команды
		.Even				;
		.WORD	InFlags			;Функция инициализации
		CCC				;Тестируемый фрагмент
		.WORD	512			;Правильный результат теста

		.ASCIZ	"SEx"<9>		;Мнемоника команды
		.Even				;
		.WORD	InFlags			;Функция инициализации
		SCC				;Тестируемый фрагмент
		.WORD	1008			;Правильный результат теста
		

;-----------------------------------------------
BCC16:
		.ASCII	<13><10><9><14>"kOMANDY USLOWNYH PEREHODOW:"<15><13><10><9>
		
		.ASCIZ	"Bcc"<9>		;Мнемоника команды
		.Even				;
		.WORD	InBcc			;Функция инициализации
		.WORD	59587			;Правильный результат теста

;-----------------------------------------------
MUL16:
		.ASCII	<13><10><9><14>"kOMANDA UMNOVENIQ (^ASTI^NYJ TEST):"<15><13><10><9>
		
		.ASCIZ	"MUL (even/even)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InMUL			;Функция инициализации
		MUL	R0,R0			;Тестируемый фрагмент
		.WORD	5300			;Правильный результат теста

		.ASCIZ	"MUL (even/odd)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InMUL			;Функция инициализации
		MUL	R0,R1			;Тестируемый фрагмент
		.WORD	53821			;Правильный результат теста
		
		.ASCIZ	"MUL (odd/odd)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InMUL			;Функция инициализации
		MUL	R1,R1			;Тестируемый фрагмент
		.WORD	64922			;Правильный результат теста

		.ASCIZ	"MUL (odd/even)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InMUL			;Функция инициализации
		MUL	R1,R0			;Тестируемый фрагмент
		.WORD	13754			;Правильный результат теста

		.ASCIZ	"MUL (table)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InT16			;Функция инициализации
		MUL	R1,R0			;Тестируемый фрагмент
		.WORD	0,0			;
		.WORD	32766,1			;
		.WORD	32767,1			;
		.WORD	32768,1			;
		.WORD	32769,1			;
		.WORD	16383,2			;
		.WORD	16384,2			;
		.WORD	16385,2			;
		.WORD	65535,1			;
		.WORD	32768,2			;
		.WORD	16384,4			;
		.WORD	32769,2			;
		.WORD	16385,4			;
		.WORD	0,4660			;	
		.WORD	7211			;Правильный результат теста

;-----------------------------------------------
ASH16:
		.ASCII	<13><10><9><14>"kOMANDY SDWIGA (^ASTI^NYJ TEST):"<15><13><10><9>
		
		.ASCIZ	"ASH (test 1)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InASH			;Функция инициализации
		MOV	#43981,R0		;Тестируемый фрагмент
		.WORD	18419			;Правильный результат теста

		.ASCIZ	"ASH (test 2)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InASH			;Функция инициализации
		MOV	#21554,R0		;Тестируемый фрагмент
		.WORD	47043			;Правильный результат теста


		.ASCIZ	"ASHC (even)"<9>	;Мнемоника команды
		.Even				;
		.WORD	InASHC			;Функция инициализации
		MOV	#43981,R0		;Тестируемый фрагмент
		MOV	#61253,R1		;
		ASHC	R2,R0			;
		.WORD	27115			;Правильный результат теста

		.ASCIZ	"ASHC (odd)"<9>		;Мнемоника команды
		.Even				;
		.WORD	InASHC			;Функция инициализации
		MOV	#43981,R0		;Тестируемый фрагмент
		MOV	#61253,R1		;
		ASHC	R2,R1			;
		.WORD	12963			;Правильный результат теста


;-----------------------------------------------
DIVT:
		.ASCII	<13><10><9><14>"kOMANDA DELENIQ (^ASTI^NYJ TEST):"<15><13><10><9>


		.ASCIZ	"DIV (even)"<9>		;Мнемоника команды
		.Even				;
		.WORD	InDIV			;Функция инициализации
		DIV	R2,R0			;Тестируемый фрагмент
		.WORD	40522			;Правильный результат теста

		.ASCIZ	"DIV (odd)"<9>		;Мнемоника команды
		.Even				;
		.WORD	InDIV			;Функция инициализации
		DIV	R2,R1			;Тестируемый фрагмент
		.WORD	17365			;Правильный результат теста

;-----------------------------------------------

		.ASCII	<13><10><9><14>"sPECIALXNYE KOMANDY:"<15><13><10><9>


		.ASCIZ	"MARK"<9>		;Мнемоника команды
		.Even				;
		.WORD	InMARK			;Функция инициализации
		.WORD	13763			;Правильный результат теста






		.WORD	0			;0 - конец таблицы























;===================================================================================

		.End	Start
;