Составитель: Евгений Степанищев (BOLK) 2004
Мой PDA Casio PV-S450 у меня уже довольно давно, но серьёзно программировать под него я так и не начал - руки не дошли. Лишь с благодарностью наблюдал за редкими персоналиями, которые старались и стараются писать хорошие программы для PV. Сегодня, 9-го мая, в выходной, когда у меня появилась свободная минутка, я решил оформить эту благодарность во что-нибудь более конкретное. Так и появился этот документ. Надеюсь он будет полезен тем, кто программирует на ассемблере. Этот документ описывает некоторые недокументированные команд процессоров серии NEC V20/V30 (тех, что используются в этой машинке и ей подобных), составлен на основе документа, выработанного хакерской группой "Потёмкин" версии 4.79 от 26 июня 2002 года. Я не стал переводить описание команды BOUND – она хорошо документирована в других руководствах, а так же команды эмуляции 8080 – не вижу смысла. Так же не переведена инструкция к команде FPO2 – кому она нужна, если всё равно не работает? Примечание: о BCD-строках можно почитать, например, вот тут: http://bsu.edu.ru:8801/resource/assembler/guide/Lesson/Lesson08/Les_08.htm

Оглавление

Операция AAD - ASCII коррекция AX после деления Операция AAM - ASCII коррекция AX после умножения Операция ADD4S - сложение упакованных в формате BCD строк Операция CMP4S - сравнение двух строк в формате BCD Операция SUB4S - вычитание строк в формате BCD Операция CLEAR1 - очистка выбранного бита Операция SET1 - установить выбранный бит Операция TEST1 - тестирование заданного бита (по аналогии с Операция NOT1 - инвертирование заданного бита Операция EXT - выделение битового поля Операция INS - вставка битового поля Операция REPC - повторять пока установлен флаг CF Операция REPNC - выполнять пока флаг CF не установлен Операция ROL4 - сдвинуть влево 4 бита Операция ROR4 - сдвинуть 4 бита вправо Приложение (описание формата Postbyte)
Мнемоника: AAD – ASCII коррекция AX после деления Процессор: NEC Инструкция: AAD basen Описание: AL <- (AH*basen) + AL AH <- 0 Затрагиваемые флаги: SF,ZF,PF (изменены) OF,AF,CF (неопределены) Примечание: AAD без операнда выполняется как AAD с операндом 0AH. Примечание: Процессоры NEC распознают эту команду только в форме AAD 0AH Физическая форма: ADD imm8 Байт код: D5H imm8
Мнемоника: AAM – ASCII коррекция AX после умножения Процессор: NEC Инструкция: AAM basen Описание: AH <- AL / basen AL <- AL MOD basen Затрагиваемые флаги: SF,ZF,PF (изменены) OF,AF,CF (неопределены) Примечание: AAM без операнда выполняется как AAM с операндом 0AH. Примечание: Процессоры NEC распознают эту команду только в форме AAM 0AH Физическая форма: AMM imm8 Байт код: D4H imm8
Мнемоника: ADD4S – Сложение упакованных в формате BCD строк Процессор: NEC, серия V Инструкция: ADD4S Описание: BCD СТРОКА (АДРЕС=ES:DI,ДЛИНА=CL) <- BCD СТРОКА (АДРЕС=DS:SI,ДЛИНА=CL) + BCD СТРОКА (АДРЕС=ES:DI,ДЛИНА=CL); Замечание: SI, DI и другие регистры остаются без изменений Затрагиваемые флаги: OF,CF,ZF ;; ZF установлен, если обе строки нулевые ;; CF,OF устанавливается как результат операции с наибольшим ;; по значению BCD Физическая форма: ADD4S Байт код: 0FH 20H Время выполнения: ADD4S NEC V20: ~19*(CL/2)+7
Мнемоника: CLEAR1 - очистка выбранного бита Процессор: NEC, серия V Инструкция: CLEAR1 dest, bitnumb Описание: БИТ bitnumb В dest <- 0 Затрагиваемые флаги: нет Физическая форма: CLEAR1 reg/mem8,CL Байт код: 0FH 12H Postbyte Физическая форма: CLEAR1 reg/mem8,imm8 Байт код: 0FH 1AH Postbyte imm8 Физическая форма: CLEAR1 reg/mem16,CL Байт код: 0FH 13H Postbyte Физическая форма: CLEAR1 reg/mem16,imm8 Байт код: 0FH 1BH Postbyte imm8 Время выполнения: r/m8,CL r/m8,i8 r/m16,CL r/m16,i8 NEC V20: 5/14 6/15 5/14 6/15
Мнемоника: CMP4S – сравнение двух строк в формате BCD Процессор: NEC, серия V Инструкция: CMP4S Описание: УстановкаФлагов ( BCD СТРОКА (АДРЕС=ES:DI,ДЛИНА=CL) - BCD СТРОКА (АДРЕС=DS:SI,ДЛИНА=CL) ); Замечание: SI, DI и другие регистры остаются без изменений Затрагиваемые флаги: OF,CF,ZF ;; ZF установлен, если результат вычитания - ноль ;; CF,OF устанавливается как результат операции с наибольшим ;; по значению BCD Физическая форма: CMP4S Байт код: 0FH 26H Время выполнения: NEC V20: ~7+19*CL
Мнемоника: EXT – выделение битового поля Процессор: NEC, серия V Инструкция: EXT start, len Описание: AX <- БитовоеПоле [ БАЗА = DS:SI НАЧАЛО БИТОВОГО СМЕЩЕНИЯ = start ДЛИНА = len ]; Примечание: SI и start автоматически изменяются Затрагиваемые флаги: нет Физическая форма: EXT reg8,reg8 Байт код: 0FH 33H Postbyte Время выполнения: NEC V20: 25-55
Мнемоника: INS – вставка битового поля Процессор: NEC, серия V Инструкция: INS start, len Описание: БитовоеПоле [ БАЗА = ES:DI НАЧАЛО БИТОВОГО СМЕШЕНИЯ = start ДЛИНА = len ] <- AX [ биты= (len-1)..0] Примечание: DI и start автоматически обновляются Примечание: альтернативное имя этой команды - NECINS Затрагиваемые флаги: нет Физическая форма: INS reg8,reg8 Байт код: 0FH 31H Postbyte Время выполнения: NEC V20: 31-117
Мнемоника: NOT1 – инвертирование заданного бита Процессор: NEC, серия V Инструкция: NOT1 dest, bitnumb Описание: Затрагиваемые флаги: (БИТ bitnumb В dest) <- операция NOT (БИТ bitnumb В dest); Физическая форма: NOT1 reg/mem8,CL Байт код: 0FH 16H Физическая форма: NOT1 reg/mem8,imm8 Байт код: 0FH 1EH Postbyte imm8 Физическая форма: NOT1 reg/mem16,CL Байт код: 0FH 17H Postbyte Физическая форма: NOT1 reg/mem16,imm8 Байт код: 0FH 1FH Postbyte imm8 Время выполнения: r/m8,CL r/m8,i8 r/m16,CL r/m16,i8 NEC V20: 4/18 5/19 4/18 5/19
Мнемоника: REPC – повторять пока установлен флаг CF Процессор: NEC, серия V Инструкция: REPC (префикс к команде) Описание: ВЫПОЛНЯТЬ CX=CX-1; ИНСТРУКЦИЯ; ДО ТЕХ ПОР ПОКА ((CX<>0) И (CF==1)); Затрагиваемые флаги: нет Физическая форма: REPC Байт код: 65H Время выполнения: NEC V20: 2 NEC V30: 2
Мнемоника: REPNC – выполнять пока флаг CF не установлен Процессор: NEC, серия V Инструкция: REPNC (префикс к команде) Описание: ВЫПОЛНЯТЬ CX=CX-1; ИНСТРУКЦИЯ; ДО ТЕХ ПОР ПОКА((CX<>0) И (CF<>1)); Затрагиваемые флаги: нет Физическая форма: REPNC Байт код: 64H Время выполнения: NEC V20: 2 NEC V30: 3
Мнемоника: ROL4 – сдвинуть влево 4 бита Процессор: NEC, серия V Инструкция: ROL4 dest Описание: AL dest биты 7 4 3 0 7 4 3 0 ------------- ------------- | | o <--------| <-|-o |<--\ ---------|---- ------------- | | | \---------------------------/ Примечание: эта инструкция сдвигает (4 бита) влево из dest через младшие 4 бита регистра AL. Затрагиваемые флаги: нет Физическая форма: ROL4 reg/mem8 Байт код: 0FH 28H Postbyte Время выполнения: NEC V20: 25/28
Мнемоника: ROR4 – сдвинуть 4 бита вправо Процессор: NEC, серия V Инструкция: ROR4 dest Описание: AL dest биты 7 4 3 0 7 4 3 0 ------------- ------------- | | o--|------>| o-|-> o-|--\ ---------^---- ------------- | | | \---------------------------/ Примечание: эта инструкция сдвигает (4 бита) вправо из dest через младшие 4 бита регистра AL. Затрагиваемые флаги: нет Физическая форма: ROR4 reg/mem8 Байт код: 0FH 2AH Postbyte Время выполнения: NEC V20: 29/33
Мнемоника: SET1 – установить выбранный бит Процессор: NEC, серия V Инструкция: SET1 dest, bitnumb Описание: БИТ bitnumb В dest <- 1; Затрагиваемые флаги: нет Физическая форма: SET1 reg/mem8,CL Байт код: 0FH 14H Postbyte Физическая форма: SET1 reg/mem8,imm8 Байт код: 0FH 1CH Postbyte imm8 Физическая форма: SET1 reg/mem16,CL Байт код: 0FH 15H Postbyte Физическая форма: SET1 reg/mem16,imm8 Байт код: 0FH 1DH Postbyte imm8 Время выполнения: r/m8,CL r/m8,i8 r/m16,CL r/m16,i8 NEC V20: 4/13 5/14 4/13 5/14
Мнемоника: SUB4S – вычитание строк в формате BCD Процессор: NEC Инструкция: SUB4S Описание: BCD СТРОКА (АДРЕС=ES:DI,ДЛИНА=CL) <- BCD СТРОКА (АДРЕС=DS:SI,ДЛИНА=CL) - BCD СТРОКА (АДРЕС=ES:DI,ДЛИНА=CL); Длина BCD строки в регистре CL; Примечание: значение регистров SI, DI, CL и любых других не изменяется Затрагиваемые флаги: OF, CD, ZF ;; ZF установлен, результат - ноль ;; CF,OF устанавливается как результат операции с наибольшим ;; по значению BCD Физическая форма: SUB4S Байт код: 0FH 22H Время выполнения: NEC V20: ~7+19*CL
Мнемоника: TEST1 – тестирование заданного бита (по аналогии с командой TEST) Процессор: NEC, серия V Инструкция: TEST1 dest,bitnumb Описание: ЕСЛИ РАЗМЕР dest == 8 БИТ ТО bitn <- bitnumb AND 7; ЕСЛИ РАЗМЕР dest == 16 БИТ ТО bitn <- bitnumb AND Fh; ЕСЛИ (БИТ bitn В dest НЕ УСТАНОВЛЕН) ТО { ZF <- 1; } ИНАЧЕ { ZF <- 0; } Затрагиваемые флаги: ZF Физическая форма: TEST1 reg/mem8,CL Байт код: 0FH 10H Postbyte Физическая форма: TEST1 reg/mem8,imm8 Байт код: 0FH 18H Postbyte imm8 Физическая форма: TEST1 reg/mem16,CL Байт код: 0FH 11H Postbyte Физическая форма: TEST1 reg/mem16,imm8 Байт код: 0FH 19H Postbyte imm8 Время выполнения: r/m8,CL r/m8,i8 r/m16,CL r/m16,i8 NEC V20: 3/12 4/13 3/12 4/13

Приложение

Формат Postbyte: MM RRR MMM MM - Режим адресации RRR - Какой регистр используется MMM – Адресация в памяти RRR Регистры Поле 8бит 16бит 000 AL AX 001 CL CX 010 DL DX 011 BL BX 100 AH SP 101 CH BP 110 DH SI 111 BH DI MMM Сегмент по MM Поле Поле умолч. 00 01 10 11=MMM - регистр 000 DS [BX+SI] [BX+SI+O8] [BX+SI+O16] 001 DS [BX+DI] [BX+DI+O8] [BX+SI+O16] 010 SS [BP+SI] [BP+SI+O8] [BP+SI+O16] 011 SS [BP+DI] [BP+DI+O8] [BP+DI+O16] 100 DS [SI] [SI+O8] [SI+O16] 101 DS [DI] [DI+O8] [DI+O16] 110 SS [O16] [BP+O8] [BP+O16] 111 DS [BX] [BX+O8] [BX+O16] Примечание: Для MMM=110,MM=00 сегмент по умолчанию DS! Обозначения: Mem8 – 8-битный операнд для адресации в памяти Reg8 – 8-битный регистр Reg - 16-битный регистр
С уважением,
Евгений Степанищев