Skip to content

Instantly share code, notes, and snippets.

@shattered
Created June 28, 2016 19:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shattered/1563504827397b75802ab5d551416ba3 to your computer and use it in GitHub Desktop.
Save shattered/1563504827397b75802ab5d551416ba3 to your computer and use it in GitHub Desktop.
Тест процессора КР1801ВМ2 для УКНЦ, Версия 0.3a, (c) dr.Titus 2012
;===================================================================================
;
; Тест процессора КР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