Created
June 28, 2016 19:29
-
-
Save shattered/1563504827397b75802ab5d551416ba3 to your computer and use it in GitHub Desktop.
Тест процессора КР1801ВМ2 для УКНЦ, Версия 0.3a, (c) dr.Titus 2012
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;=================================================================================== | |
; | |
; Тест процессора КР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 | |
; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment