Мой 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-битный регистр
С уважением,
Евгений Степанищев