[an error occurred while processing this directive]
|
С для 51
void Div8on4(ubyte data* num, ubyte data* div)
//Производит целочисленное деление 8 байт на 4 байта num = num/div
//num - MSB first, старший бит = 0; старший бит div = 0
//остаток - в div MSB first
{
ubyte idata res[8];
ubyte iii,kkk;for(iii=0;iii
kkk=31;
while(((*div)&0x40)==0){
roleft((ubyte idata*)div,4);
kkk--;
}
for(iii=0;iiiif(*(ulong data*)num>=*(ulong data*)div){//Если частный остаток больше - задвигаем 1
*(ulong data*)num -=*(ulong data*)div;
CY = 1;
}else CY = 0;
roleft(res,8);
CY = 0;
roleft((ubyte idata*)num,8);
};
//Помещаем остаток в div
for(iii=0;iiiCY=0;
roright((ubyte idata*)num,8);
}
*(ulong data*)div = *(ulong data*)(num+4);//помещаем в divfor(iii=0;iii
} void roleft(ubyte idata* arr, ubyte cnt)
//Сдвигает массив arr из cnt байт на 1 разряд влево. Задвигает С в младший разряд
//arr передается в R7, cnt - в R5
{
#pragma asm
mov A,R5
push ACC
push PSW
mov A,R7
add A,R5
pop PSW
xch A,R0
rol1: dec R0
mov A,@R0
rlc A
mov @R0,A
djnz R5,rol1
pop ACC
mov R5,A
#pragma endasm
}void roright(ubyte idata* arr, ubyte cnt)
//Сдвигает массив arr из cnt байт на 1 разряд вправо. Задвигает С в младший разряд
//arr передается в R7, cnt - в R5
{
#pragma asm
mov A,R5
push ACC
mov AR0,R7
ror1: mov A,@R0
rrc A
mov @R0,A
inc R0
djnz R5,ror1
pop ACC
mov R5,A
#pragma endasm
}
E-mail: info@telesys.ru