![IXYS zilog Z51F6412 Manual Download Page 146](http://html1.mh-extra.com/html/ixys/zilog-z51f6412/zilog-z51f6412_manual_2098946146.webp)
Z51F6412
Product Specification
PS030302-0212
P R E L I M I N A R Y
143
11.11.5 Calculator Library
11.11.5.1 Signed Multiplication
__sfr __at (0xF7) CAL_CNTR;
__sfr __at (0xEE) CAL_ADDR;
__sfr __at (0xEF) CAL_DATA;
#define CAL_DIV_START 0x01
#define CAL_DIV_DONE 0x02
#define CAL_DIV_BY_0 0x04
long L_mul( short a, short b ) {
long
mul_o;
mul_o = 0;
CAL_ADDR = 0;
// currently point to MA[15:8]
CAL_DATA = a >> 8;
// MA[15:08]<-a[15:08], ADDR<-ADDR+1
CAL_DATA = a;
// MA[07:00]<-a[07:00], ADDR<-ADDR+1
CAL_DATA = b >> 8;
// MB[15:08]<-b[15:08], ADDR<-ADDR+1
CAL_DATA = b;
// MB[07:00]<-b[07:00], ADDR<-ADDR+1
// now ADDR points to MO[31:24],
// so just read it
mul_o = (unsigned long)CAL_DATA<<24; // MO[31:24], ADDR<-ADDR+1
mul_o |= (unsigned long)CAL_DATA<<16; // MO[23:16], ADDR<-ADDR+1
mul_o |= (unsigned long)CAL_DATA<<8; // MO[15:08], ADDR<-ADDR+1
mul_o |= (unsigned long)CAL_DATA; // MO[07:00], ADDR<-ADDR+1
return
mul_o;
}
11.11.5.2 Signed Division
__sfr __at (0xF7) CAL_CNTR;
__sfr __at (0xEE) CAL_ADDR;
__sfr __at (0xEF) CAL_DATA;
#define CAL_DIV_START 0x01
#define CAL_DIV_DONE 0x02
#define CAL_DIV_BY_0 0x04