Дополнительные команды для XC16x и ST10F269


Условные обозначения

IDXiИндексные регистры косвенной адресации (IDX0 и IDX1)
QRjРегистры прибавляемого/вычитаемого значения для Rwn (QR0 и QR1)
QXjРегистры прибавляемого/вычитаемого значения для IDXi (QX0 и QX1)
IDXi*Модификация регистра IDXi после исполнения команды
Rwn*Модификация регистра Rwn после исполнения команды
ACCАккумулятор; 40-битовый регистр результата операций (состоит из 8-битового регистра MAE и двух 16-битовых регистров MAH и MAL: MAE||MAH||MAL)
CoRegРегистры сопроцессора (MSW, MAH, MAS, MAL, MCW или MRW)
[op1]Косвенная адресация (op1 является адресом используемого значения)
||Объединение двух (или более) регистров в один,например: (op2||op1) — op2 — старшее слово 32-разрядного числа, op1 — младшее слово
>>Сдвиг битов вправо (без сохранения знака)
<<Сдвиг битов влево (без сохранения знака)
>>>Арифметический сдвиг битов вправо (с сохранением знака)
<->Сравнение; осуществляется путем вычитания второго операнда из первого без сохранения результата (только обновление флагов арифметико-логического устройства)
<—Направление копирования значения
Например:
op1<—op2 Копировать значение op2 в op1
op1<—op1+op2 Сложить значения op1 и op2 и поместить результат в op1

В командах сопроцессора используется 5 модификаций регистра IDXj:

IDXiIDXi<—IDXi(без модификации)
IDXi+IDXi<—IDXi+2(i=0,1)
IDXi-IDXi<—IDXi-2(i=0,1)
IDXi+QXjIDXi<—IDXi+QXj(i,j=0,1)
IDXi-QXjIDXi<—IDXi-QXj(i,j=0,1)

В командах сопроцессора используется 5 модификаций регистра Rwn:

RwnRwn<—Rwn(без модификации)
Rwn+Rwn<—Rwn+2(n=0…15)
Rwn-Rwn<—Rwn-2(n=0…15)
Rwn+QRjRwn<—Rwn+QRj(n=0…15;j=0,1)
Rwn-QRjRwn<—Rwn-QRj(n=0…15;j=0,1)

Арифметические операции

Абсолютное значение

CoABS
ACC<—Abs(ACC)
CoABS

Абсолютное значение

CoABS op1,op2
ACC<—Abs(op2||op1)
CoABS Rwn,Rwm
CoABS Rwn,[Rwm*]
CoABS [IDXi*],[Rwm*]

Сложение

CoADD op1,op2
ACC<—ACC+(op2||op1)
CoADD Rwn,Rwm
CoADD Rwn,[Rwm*]
CoADD [IDXi*],[Rwm*]

Сложение

CoADD2 op1,op2
ACC<—ACC+2*(op2||op1)
CoADD2 Rwn,Rwm
CoADD2 Rwn,[Rwm*]
CoADD2 [IDXi*],[Rwm*]

Загрузка аккумулятора

CoLOAD op1,op2
ACC<—(op2||op1)
CoLOAD Rwn,Rwm
CoLOAD Rwn,[Rwm*]
CoLOAD [IDXi*],[Rwm*]

Загрузка аккумулятора

CoLOAD- op1,op2
ACC<—0-(op2||op1)
CoLOAD- Rwn,Rwm
CoLOAD- Rwn,[Rwm*]
CoLOAD- [IDXi*],[Rwm*]

Загрузка аккумулятора

CoLOAD2 op1,op2
ACC<—2*(op2||op1)
CoLOAD2 Rwn,Rwm
CoLOAD2 Rwn,[Rwm*]
CoLOAD2 [IDXi*],[Rwm*]

Загрузка аккумулятора

CoLOAD2- op1,op2
ACC<—0-2*(op2||op1)
CoLOAD2- Rwn,Rwm
CoLOAD2- Rwn,[Rwm*]
CoLOAD2- [IDXi*],[Rwm*]

Инверсия знака

CoNEG
ACC<—0-ACC
CoNEG

Инверсия знака с округлением

CoNEG rnd
ACC<—0-ACC+00008000h
CoNEG rnd

Округление аккумулятора

CoRND
ACC<—ACC+00008000h
CoRND



Вычитание

CoSUB op1,op2
ACC<—ACC-(op2||op1)
CoSUB Rwn,Rwm
CoSUB Rwn,[Rwm*]
CoSUB [IDXi*],[Rwm*]

Вычитание

CoSUB2 op1,op2
ACC<—ACC-2*(op2||op1)
CoSUB2 Rwn,Rwm
CoSUB2 Rwn,[Rwm*]
CoSUB2 [IDXi*],[Rwm*]

Вычитание

CoSUB2R op1,op2
ACC<—2*(op2||op1)-ACC
CoSUB2R Rwn,Rwm
CoSUB2R Rwn,[Rwm*]
CoSUB2R [IDXi*],[Rwm*]

Вычитание

CoSUBR op1,op2
ACC<—(op2||op1)-ACC
CoSUBR Rwn,Rwm
CoSUBR Rwn,[Rwm*]
CoSUBR [IDXi*],[Rwm*]

Операции умножения

Умножение с накоплением и округлением результата

CoMAC op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
CoMAC Rwn,Rwm,rnd
CoMAC Rwn,[Rwm*],rnd
CoMAC [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMAC op1,op2
ACC<—ACC+op1*op2
CoMAC Rwn,Rwm
CoMAC Rwn,[Rwm*]
CoMAC [IDXi*],[Rwm*]

Умножение с накоплением

CoMAC- op1,op2
ACC<—ACC-op1*op2
CoMAC- Rwn,Rwm
CoMAC- Rwn,[Rwm*]
CoMAC- [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACM op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
[IDXi*]<—[IDXi]
CoMACM [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACM op1,op2
ACC<—ACC+op1*op2
[IDXi*]<—[IDXi]
CoMACM [IDXi*],[Rwm*]

Умножение с накоплением, пересылка данных

CoMACM- op1,op2
ACC<—ACC-op1*op2
[IDXi*]<—[IDXi]
CoMACM- [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACMR op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
[IDXi*]<—[IDXi]
CoMACMR [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACMR op1,op2
ACC<—op1*op2-ACC
[IDXi*]<—[IDXi]
CoMACMR [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACMRsu op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
[IDXi*]<—[IDXi]
CoMACMRsu [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACMRsu op1,op2
ACC<—op1*op2-ACC
[IDXi*]<—[IDXi]
CoMACMRsu [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACMRu op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
[IDXi*]<—[IDXi]
CoMACMRu [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACMRu op1,op2
ACC<—op1*op2-ACC
[IDXi*]<—[IDXi]
CoMACMRu [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACMRus op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
[IDXi*]<—[IDXi]
CoMACMRus [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACMRus op1,op2
ACC<—op1*op2-ACC
[IDXi*]<—[IDXi]
CoMACMRus [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACMsu op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
[IDXi*]<—[IDXi]
CoMACMsu [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACMsu op1,op2
ACC<—ACC+op1*op2
[IDXi*]<—[IDXi]
CoMACMsu [IDXi*],[Rwm*]

Умножение с накоплением, пересылка данных

CoMACMsu- op1,op2
ACC<—ACC-op1*op2
[IDXi*]<—[IDXi]
CoMACMsu- [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACMu op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
[IDXi*]<—[IDXi]
CoMACMu [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACMu op1,op2
ACC<—ACC+op1*op2
[IDXi*]<—[IDXi]
CoMACMu [IDXi*],[Rwm*]

Умножение с накоплением, пересылка данных

CoMACMu- op1,op2
ACC<—ACC-op1*op2
[IDXi*]<—[IDXi]
CoMACMu- [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата, пересылка данных

CoMACMus op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
[IDXi*]<—[IDXi]
CoMACMus [IDXi*],[Rwm*],rnd

Умножение с накоплением, пересылка данных

CoMACMus op1,op2
ACC<—ACC+op1*op2
[IDXi*]<—[IDXi]
CoMACMus [IDXi*],[Rwm*]

Умножение с накоплением, пересылка данных

CoMACMus- op1,op2
ACC<—ACC-op1*op2
[IDXi*]<—[IDXi]
CoMACMus- [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата

CoMACR op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
CoMACR Rwn,Rwm,rnd
CoMACR Rwn,[Rwm*],rnd
CoMACR [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMACR op1,op2
ACC<—op1*op2-ACC
CoMACR Rwn,Rwm
CoMACR Rwn,[Rwm*]
CoMACR [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата

CoMACRsu op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
CoMACRsu Rwn,Rwm,rnd
CoMACRsu Rwn,[Rwm*],rnd
CoMACRsu [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMACRsu op1,op2
ACC<—op1*op2-ACC
CoMACRsu Rwn,Rwm
CoMACRsu Rwn,[Rwm*]
CoMACRsu [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата

CoMACRu op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
CoMACRu Rwn,Rwm,rnd
CoMACRu Rwn,[Rwm*],rnd
CoMACRu [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMACRu op1,op2
ACC<—op1*op2-ACC
CoMACRu Rwn,Rwm
CoMACRu Rwn,[Rwm*]
CoMACRu [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата

CoMACRus op1,op2,rnd
ACC<—op1*op2-ACC+00008000h
CoMACRus Rwn,Rwm,rnd
CoMACRus Rwn,[Rwm*],rnd
CoMACRus [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMACRus op1,op2
ACC<—op1*op2-ACC
CoMACRus Rwn,Rwm
CoMACRus Rwn,[Rwm*]
CoMACRus [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата

CoMACsu op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
CoMACsu Rwn,Rwm,rnd
CoMACsu Rwn,[Rwm*],rnd
CoMACsu [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMACsu op1,op2
ACC<—ACC+op1*op2
CoMACsu Rwn,Rwm
CoMACsu Rwn,[Rwm*]
CoMACsu [IDXi*],[Rwm*]

Умножение с накоплением

CoMACsu- op1,op2
ACC<—ACC-op1*op2
CoMACsu- Rwn,Rwm
CoMACsu- Rwn,[Rwm*]
CoMACsu- [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата

CoMACu op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
CoMACu Rwn,Rwm,rnd
CoMACu Rwn,[Rwm*],rnd
CoMACu [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMACu op1,op2
ACC<—ACC+op1*op2
CoMACu Rwn,Rwm
CoMACu Rwn,[Rwm*]
CoMACu [IDXi*],[Rwm*]

Умножение с накоплением

CoMACu- op1,op2
ACC<—ACC-op1*op2
CoMACu- Rwn,Rwm
CoMACu- Rwn,[Rwm*]
CoMACu- [IDXi*],[Rwm*]

Умножение с накоплением и округлением результата

CoMACus op1,op2,rnd
ACC<—ACC+op1*op2+00008000h
CoMACus Rwn,Rwm,rnd
CoMACus Rwn,[Rwm*],rnd
CoMACus [IDXi*],[Rwm*],rnd

Умножение с накоплением

CoMACus op1,op2
ACC<—ACC+op1*op2
CoMACus Rwn,Rwm
CoMACus Rwn,[Rwm*]
CoMACus [IDXi*],[Rwm*]

Умножение с накоплением

CoMACus- op1,op2
ACC<—ACC-op1*op2
CoMACus- Rwn,Rwm
CoMACus- Rwn,[Rwm*]
CoMACus- [IDXi*],[Rwm*]

Умножение с округлением результата

CoMUL op1,op2,rnd
ACC<—op1*op2+00008000h
CoMUL Rwn,Rwm,rnd
CoMUL Rwn,[Rwm*],rnd
CoMUL [IDXi*],[Rwm*],rnd

Умножение

CoMUL op1,op2
ACC<—op1*op2
CoMUL Rwn,Rwm
CoMUL Rwn,[Rwm*]
CoMUL [IDXi*],[Rwm*]

Умножение

CoMUL- op1,op2
ACC<—(-op1*op2)
CoMUL- Rwn,Rwm
CoMUL- Rwn,[Rwm*]
CoMUL- [IDXi*],[Rwm*]

Умножение с округлением результата

CoMULsu op1,op2,rnd
ACC<—op1*op2+00008000h
CoMULsu Rwn,Rwm,rnd
CoMULsu Rwn,[Rwm*],rnd
CoMULsu [IDXi*],[Rwm*],rnd

Умножение

CoMULsu op1,op2
ACC<—op1*op2
CoMULsu Rwn,Rwm
CoMULsu Rwn,[Rwm*]
CoMULsu [IDXi*],[Rwm*]

Умножение

CoMULsu- op1,op2
ACC<—(-op1*op2)
CoMULsu- Rwn,Rwm
CoMULsu- Rwn,[Rwm*]
CoMULsu- [IDXi*],[Rwm*]

Умножение с округлением результата

CoMULu op1,op2,rnd
ACC<—op1*op2+00008000h
CoMULu Rwn,Rwm,rnd
CoMULu Rwn,[Rwm*],rnd
CoMULu [IDXi*],[Rwm*],rnd

Умножение

CoMULu op1,op2
ACC<—op1*op2
CoMULu Rwn,Rwm
CoMULu Rwn,[Rwm*]
CoMULu [IDXi*],[Rwm*]

Умножение

CoMULu- op1,op2
ACC<—(-op1*op2)
CoMULu- Rwn,Rwm
CoMULu- Rwn,[Rwm*]
CoMULu- [IDXi*],[Rwm*]

Умножение с округлением результата

CoMULus op1,op2,rnd
ACC<—op1*op2+00008000h
CoMULus Rwn,Rwm,rnd
CoMULus Rwn,[Rwm*],rnd
CoMULus [IDXi*],[Rwm*],rnd

Умножение

CoMULus op1,op2
ACC<—op1*op2
CoMULus Rwn,Rwm
CoMULus Rwn,[Rwm*]
CoMULus [IDXi*],[Rwm*]

Умножение

CoMULus- op1,op2
ACC<—(-op1*op2)
CoMULus- Rwn,Rwm
CoMULus- Rwn,[Rwm*]
CoMULus- [IDXi*],[Rwm*]

Операции сравнения

Сравнение регистров

CoCMP op1,op2
ACC<->(op2||op1)
CoCMP Rwn,Rwm
CoCMP Rwn,[Rwm*]
CoCMP [IDXi*],[Rwm*]

Максимум

CoMAX op1,op2
ACC<—max(ACC, op2||op1)
CoMAX Rwn,Rwm
CoMAX Rwn,[Rwm*]
CoMAX [IDXi*],[Rwm*]

Минимум

CoMIN op1,op2
ACC<—min(ACC, op2||op1)
CoMIN Rwn,Rwm
CoMIN Rwn,[Rwm*]
CoMIN [IDXi*],[Rwm*]

Арифметический сдвиг вправо с округлением

CoASHR op1,rnd
ACC<—(ACC>>>op1)+00008000h
CoASHR #data5,rnd
CoASHR Rwn,rnd
CoASHR [Rwm*],rnd

Арифметический сдвиг вправо

CoASHR op1
ACC<—(ACC>>>op1)
CoASHR #data5
CoASHR Rwn
CoASHR [Rwm*]

Сдвиг влево

CoSHL op1
ACC<—(ACC<<op1)
CoSHL #data5
CoSHL Rwn
CoSHL [Rwm*]

Сдвиг вправо

CoSHR op1
ACC<—(ACC>>op1)
CoSHR #data5
CoSHR Rwn
CoSHR [Rwm*]

Пересылка данных

Пересылка данных

CoMOV op1,op2
op1<—op2
CoMOV [IDXi*],[Rwm*]

Сохранение регистров сопроцессора

CoSTORE op1,op2
op1<—op2
CoSTORE Rwn,CoReg
CoSTORE [Rwn*],CoReg

Вспомогательные операции

Пустая операция

CoNOP
Модификация указателей
CoNOP [IDXi*],[Rwm*]
CoNOP [IDXi*]
CoNOP [Rwm*]Добавить блок