![IXYS zilog Z51F6412 Manual Download Page 147](http://html1.mh-extra.com/html/ixys/zilog-z51f6412/zilog-z51f6412_manual_2098946147.webp)
Z51F6412
Product Specification
PS030302-0212
P R E L I M I N A R Y
144
void L_div( long a, short b, long* q, short* r) {
long
div_q;
short
div_r;
div_q = 0;
div_r = 0;
CAL_ADDR = 8;
// currently point to DA[31:24]
CAL_DATA = a >> 24;
// DA[31:24]<-a[31:24], ADDR<-ADDR+1
CAL_DATA = a >> 16;
// DA[23:16]<-a[23:16], ADDR<-ADDR+1
CAL_DATA = a >> 8;
// DA[15:08]<-a[15:08], ADDR<-ADDR+1
CAL_DATA = a;
// DA[07:00]<-a[07:00], ADDR<-ADDR+1
CAL_DATA = b >> 8;
// DB[15:08]<-b[15:08], ADDR<-ADDR+1
CAL_DATA = b;
// DB[07:00]<-b[07:00], ADDR<-ADDR+1
while( (CAL_CNTR & CAL_DIV_DONE) == 0);
// wait until division is done (need 32clock cycles)
// now ADDR points to DQ[31:24],
// so just read it
div_q = (unsigned long)CAL_DATA<<24; // DQ[31:24], ADDR<-ADDR+1
div_q |= (unsigned long)CAL_DATA<<16; // DQ[23:16], ADDR<-ADDR+1
div_q |= (unsigned long)CAL_DATA<<8; // DQ[15:08], ADDR<-ADDR+1
div_q |= (unsigned long)CAL_DATA; // DQ[07:00], ADDR<-ADDR+1
div_r = (unsigned long)CAL_DATA<<8; // DR[15:08], ADDR<-ADDR+1
div_r |= (unsigned long)CAL_DATA; // DR[07:00], ADDR<-ADDR+1
*q = div_q;
*r = div_r;
}