; CC8E Version 1.3, Copyright (c) B Knudsen Data ; C compiler for the PIC18 microcontrollers ; ************ 24. Jun 2009 9:08 ************* processor PIC18C242 radix DEC PRODH EQU 0xFF4 PRODL EQU 0xFF3 Carry EQU 0 arg1_2 EQU 0x0F arg2_2 EQU 0x12 rval_2 EQU 0x15 arg1_6 EQU 0x0F arg2_6 EQU 0x12 rm_4 EQU 0x14 counter_4 EQU 0x16 a8 EQU 0x00 b8 EQU 0x01 a16 EQU 0x02 b16 EQU 0x04 i24 EQU 0x06 a24 EQU 0x09 b24 EQU 0x0C GOTO main ; FILE 18\math24.h ;// SIZE ; ;#pragma library 1 ;/* ;uns16 operator* _mult8x8( uns8 arg1, uns8 arg2); ;uns16 operator* _mult16x16( uns16 arg1, uns16 arg2); ;uns24 operator* _multU16x8( uns16 arg1, uns8 arg2); ;uns24 operator* _multU24x8( uns24 arg1, uns8 arg2); ;uns24 operator* _multU24x16( uns24 arg1, uns16 arg2); ;int24 operator* _multS16x16( int16 arg1, int16 arg2); ;uns24 operator* _mult24x24( uns24 arg1, uns24 arg2); ;uns16 operator/ _divU16_8( uns16 arg1, uns8 arg2); ;uns24 operator/ _divU24_8( uns24 arg1, uns8 arg2); ;uns16 operator/ _divU16_16( uns16 arg1, uns16 arg2); ;uns24 operator/ _divU24_16( uns24 arg1, uns16 arg2); ;uns24 operator/ _divU24_24( uns24 arg1, uns24 arg2); ;int16 operator/ _divS16_8( int16 arg1, int8 arg2); ;int24 operator/ _divS24_8( int24 arg1, int8 arg2); ;int16 operator/ _divS16_16( int16 arg1, int16 arg2); ;int24 operator/ _divS24_16( int24 arg1, int16 arg2); ;int24 operator/ _divS24_24( int24 arg1, int24 arg2); ;uns8 operator% _remU16_8( uns16 arg1, uns8 arg2); ;uns8 operator% _remU24_8( uns24 arg1, uns8 arg2); ;uns16 operator% _remU16_16( uns16 arg1, uns16 arg2); ;uns16 operator% _remU24_16( uns24 arg1, uns16 arg2); ;uns24 operator% _remU24_24( uns24 arg1, uns24 arg2); ;int8 operator% _remS16_8( int16 arg1, int8 arg2); ;int8 operator% _remS24_8( int24 arg1, int8 arg2); ;int16 operator% _remS16_16( int16 arg1, int16 arg2); ;int16 operator% _remS24_16( int24 arg1, int16 arg2); ;int24 operator% _remS24_24( int24 arg1, int24 arg2); ;*/ ; ;// DEFINABLE SYMBOLS (in the application code): ;//#define INT_OPTIM_SPEED // optimize for SPEED: default ;//#define INT_OPTIM_SIZE // optimize for SIZE ; ;#if __CoreSet__ < 1200 || __CoreSet__ >= 2100 ; #error math24.h does not support the selected device ;#endif ; ;#if __CoreSet__ < 1600 ; #define genAdd(r,a) W=a; btsc(Carry); W=incsz(a); r+=W ; #define genSub(r,a) W=a; btss(Carry); W=incsz(a); r-=W ; #define genAddW(r,a) W=a; btsc(Carry); W=incsz(a); W=r+W ; #define genSubW(r,a) W=a; btss(Carry); W=incsz(a); W=r-W ;#else ; #define genAdd(r,a) W=a; r=addWFC(r) ; #define genSub(r,a) W=a; r=subWFB(r) ; #define genAddW(r,a) W=a; W=addWFC(r) ; #define genSubW(r,a) W=a; W=subWFB(r) ;#endif ; ;#if __CoreSet__ == 1700 || __CoreSet__ == 1800 ; #define hw_mult8x8(a,b) W = a; multiply(b) ; #define loRES PRODL ; #define hiRES PRODH ;#endif ; ;#if __CoreSet__ == 2000 ; #define hw_mult8x8(a,b) W = a; multiply(b) ; #define loRES W ; #define hiRES MULH ;#endif ; ; ;#ifdef hw_mult8x8 ; ;inline int16 operator*( int8 arg1, int8 arg2); ;inline uns16 operator*( uns8 arg1, uns8 arg2); ; ;inline int16 operator*( int8 arg1, int16 arg2); ;inline uns16 operator*( uns8 arg1, uns16 arg2); ;inline int16 operator*( int16 arg1, int8 arg2); ;inline uns16 operator*( uns16 arg1, uns8 arg2); ; ;inline int16 operator*( int16 arg1, int16 arg2); ;inline uns24 operator*( uns16 arg1, uns16 arg2); ; ;inline int24 operator*( int8 arg1, int24 arg2); ;inline uns24 operator*( uns8 arg1, uns24 arg2); ; ;inline int24 operator*( int24 arg1, int8 arg2); ;inline uns24 operator*( uns24 arg1, uns8 arg2); ; ;inline uns24 operator*( uns16 arg1, uns24 arg2); ;inline uns24 operator*( uns24 arg1, uns16 arg2); ; ;#else ; ;int8 operator*( int8 arg1, int8 arg2) @ ; ;uns16 operator* _mult8x8( uns8 arg1, uns8 arg2) ;{ ; uns16 rval; ; char counter = sizeof(arg2)*8; ; rval.high8 = 0; ; W = arg1; ; do { ; arg2 = rr( arg2); ; if (Carry) ; rval.high8 += W; ; rval = rr( rval); ; counter = decsz(counter); ; } while (1); ; return rval; ;} ; ; ;int16 operator*( int16 arg1, int16 arg2) @ ; ;uns16 operator* _mult16x16( uns16 arg1, uns16 arg2) ;{ ; uns16 rval; ; char counter = sizeof(arg1)*8; ; do { ; Carry = 0; ; rval = rl( rval); ; arg1 = rl( arg1); ; if (Carry) ; rval += arg2; ; counter = decsz(counter); ; } while (1); ; return rval; ;} ; ; ; ;uns24 operator*( uns8 arg1, uns16 arg2) exchangeArgs @ ; ;uns24 operator* _multU16x8( uns16 arg1, uns8 arg2) ;{ ; uns24 rval; ; rval.high8 = 0; ; char counter = sizeof(arg1)*8; ; W = arg2; ; do { ; arg1 = rr( arg1); ; if (Carry) ; rval.high8 += W; ; rval = rr(rval); ; counter = decsz(counter); ; } while (1); ; return rval; ;} ; ; ;uns24 operator*( uns8 arg1, uns24 arg2) exchangeArgs @ ; ;uns24 operator* _multU24x8( uns24 arg1, uns8 arg2) ;{ ; uns8 rvalH = 0; ; char counter = 1+sizeof(arg1)*8; ; W = arg2; ; goto ENTRY; ; do { ; if (Carry) ; rvalH += W; ; rvalH = rr( rvalH); ; ENTRY: ; arg1 = rr( arg1); ; counter = decsz(counter); ; } while (1); ; return arg1; ;} ; ; ; ; ;uns24 operator*( uns16 arg1, uns24 arg2) exchangeArgs @ ; ;uns24 operator* _multU24x16( uns24 arg1, uns16 arg2) ;{ ; uns24 rval; ; rval.low16 = 0; ; char counter = sizeof(arg2)*8; ; do { ; Carry = 0; ; rval = rl( rval); ; arg2 = rl( arg2); ; if (Carry) { ; rval.low8 += arg1.low8; ; genAdd( rval.mid8, arg1.mid8); ; genAdd( rval.high8, arg1.high8); ; } ; counter = decsz(counter); ; } while (1); ; return rval; ;} ; ;#endif ; ; ; ;int24 operator* _multS16x16( int16 arg1, int16 arg2) ;{ _multS16x16 ; int24 rval; ; ; #if defined hw_mult8x8 ; ; hw_mult8x8( arg1.low8, arg2.low8); // p1 ; rval.low8 = loRES; ; rval.midL8 = hiRES; ; ; hw_mult8x8( arg1.high8, arg2.high8); // p3 ; rval.high8 = loRES; ; ; hw_mult8x8( arg1.high8, arg2.low8); // p2 ; rval.midL8 += loRES; ; genAdd( rval.high8, hiRES); ; ; hw_mult8x8( arg1.low8, arg2.high8); // p2 ; rval.midL8 += loRES; ; genAdd( rval.high8, hiRES); ; ; #else ; ; char counter = sizeof(arg1)*8; ; int16 tmpArg1 = arg1; ; rval.low8 = 0; ; do { ; Carry = 0; ; rval = rl( rval); ; tmpArg1 = rl( tmpArg1); ; if (Carry) { ; rval.low8 += arg2.low8; ; genAdd( rval.mid8, arg2.high8); ; genAdd( rval.high8, 0); ; } ; counter = decsz(counter); ; } while (1); ; ; #endif ; ; if (arg1 < 0) ; rval.high8 -= arg2.low8; ; ; if (arg2 < 0) ; rval.high8 -= arg1.low8; ; ; return rval; ;} ; ; ;int24 operator*( int24 arg1, int24 arg2) @ ; ;uns24 operator* _mult24x24( uns24 arg1, uns24 arg2) ;{ _mult24x24 ; uns24 rval; ; ; #if defined hw_mult8x8 && !defined INT_OPTIM_SIZE ; ; hw_mult8x8( arg1.low8, arg2.low8); // p1 MOVF arg1_2,W,0 MULWF arg2_2,0 ; rval.low8 = loRES; MOVFF PRODL,rval_2 ; rval.mid8 = hiRES; MOVFF PRODH,rval_2+1 ; ; hw_mult8x8( arg1.mid8, arg2.mid8); // p3 MOVF arg1_2+1,W,0 MULWF arg2_2+1,0 ; rval.high8 = loRES; MOVFF PRODL,rval_2+2 ; ; hw_mult8x8( arg1.mid8, arg2.low8); // p2 MULWF arg2_2,0 ; rval.mid8 += loRES; MOVF PRODL,W,0 ADDWF rval_2+1,1,0 ; genAdd( rval.high8, hiRES); MOVF PRODH,W,0 ADDWFC rval_2+2,1,0 ; ; hw_mult8x8( arg1.low8, arg2.mid8); // p2 MOVF arg1_2,W,0 MULWF arg2_2+1,0 ; rval.mid8 += loRES; MOVF PRODL,W,0 ADDWF rval_2+1,1,0 ; genAdd( rval.high8, hiRES); MOVF PRODH,W,0 ADDWFC rval_2+2,1,0 ; ; hw_mult8x8( arg1.high8, arg2.low8); // p3 MOVF arg1_2+2,W,0 MULWF arg2_2,0 ; rval.high8 += loRES; MOVF PRODL,W,0 ADDWF rval_2+2,1,0 ; ; hw_mult8x8( arg1.low8, arg2.high8); // p3 MOVF arg1_2,W,0 MULWF arg2_2+2,0 ; rval.high8 += loRES; MOVF PRODL,W,0 ADDWF rval_2+2,1,0 ; ; #else ; ; char counter = sizeof(arg1)*8; ; do { ; Carry = 0; ; rval = rl( rval); ; arg1 = rl( arg1); ; if (Carry) { ; rval.low8 += arg2.low8; ; genAdd( rval.mid8, arg2.mid8); ; genAdd( rval.high8, arg2.high8); ; } ; counter = decsz(counter); ; } while (1); ; ; #endif ; ; return rval; MOVF rval_2,W,0 RETURN ;} ; ; ; ;uns16 operator/ _divU16_8( uns16 arg1, uns8 arg2) ;{ _divU16_8 ; uns8 rm = 0; ; char counter = sizeof(arg1)*8+1; ; goto ENTRY; ; do { ; rm = rl( rm); ; uns8 tmp = rl( tmp); ; W = rm - arg2; ; if (tmp&1) ; Carry = 1; ; if (Carry) ; rm = W; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; return arg1; ;} ; ; ;uns24 operator/ _divU24_8( uns24 arg1, uns8 arg2) ;{ _divU24_8 ; uns8 rm = 0; ; char counter = sizeof(arg1)*8+1; ; goto ENTRY; ; do { ; rm = rl( rm); ; uns8 tmp = rl( tmp); ; W = rm - arg2; ; if (tmp&1) ; Carry = 1; ; if (Carry) ; rm = W; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; return arg1; ;} ; ; ;uns16 operator/ _divU16_16( uns16 arg1, uns16 arg2) ;{ _divU16_16 ; uns16 rm = 0; ; char counter = sizeof(arg1)*8+1; ; goto ENTRY; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; Carry = 1; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; return arg1; ;} ; ; ;uns24 operator/ _divU24_16( uns24 arg1, uns16 arg2) ;{ _divU24_16 ; uns16 rm = 0; CLRF rm_4,0 CLRF rm_4+1,0 ; char counter = sizeof(arg1)*8+1; MOVLW 25 MOVWF counter_4,0 ; goto ENTRY; BRA m003 ; do { ; rm = rl( rm); m001 RLCF rm_4,1,0 RLCF rm_4+1,1,0 ; if (Carry) ; goto SUBTRACT; BC m002 ; W = rm.low8 - arg2.low8; MOVF arg2_6,W,0 SUBWF rm_4,W,0 ; genSubW( rm.high8, arg2.high8); MOVF arg2_6+1,W,0 SUBWFB rm_4+1,W,0 ; if (!Carry) ; goto ENTRY; BNC m003 ; SUBTRACT: ; rm.low8 -= arg2.low8; m002 MOVF arg2_6,W,0 SUBWF rm_4,1,0 ; genSub( rm.high8, arg2.high8); MOVF arg2_6+1,W,0 SUBWFB rm_4+1,1,0 ; Carry = 1; BSF 0xFD8,Carry,0 ; ENTRY: ; arg1 = rl( arg1); m003 RLCF arg1_6,1,0 RLCF arg1_6+1,1,0 RLCF arg1_6+2,1,0 ; counter = decsz(counter); DECFSZ counter_4,1,0 ; } while (1); BRA m001 ; return arg1; MOVF arg1_6,W,0 RETURN ;} ; ; ;uns24 operator/ _divU24_24( uns24 arg1, uns24 arg2) ;{ _divU24_24 ; uns24 rm = 0; ; char counter = sizeof(arg1)*8+1; ; goto ENTRY; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.mid8, arg2.mid8); ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; genSub( rm.mid8, arg2.mid8); ; Carry = 1; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; return arg1; ;} ; ; ;int8 operator/ (int8 arg1, int8 arg2) @ ; ;int16 operator/ _divS16_8( int16 arg1, int8 arg2) ;{ _divS16_8 ; uns8 rm = 0; ; char counter = 16+1; ; char sign = arg1.high8 ^ arg2.high8; ; if (arg1 < 0) { ; INVERT: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY; ; do { ; rm = rl( rm); ; W = rm - arg2; ; if (Carry) ; rm = W; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT; ; return arg1; ;} ; ; ;int24 operator/ _divS24_8( int24 arg1, int8 arg2) ;{ _divS24_8 ; uns8 rm = 0; ; char counter = sizeof(arg1)*8+1; ; char sign = arg1.high8 ^ arg2.high8; ; if (arg1 < 0) { ; INVERT: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY; ; do { ; rm = rl( rm); ; W = rm - arg2; ; if (Carry) ; rm = W; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT; ; return arg1; ;} ; ; ;int16 operator/ _divS16_16( int16 arg1, int16 arg2) ;{ _divS16_16 ; uns16 rm = 0; ; char counter = sizeof(arg1)*8+1; ; char sign = arg1.high8 ^ arg2.high8; ; if (arg1 < 0) { ; INVERT: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; Carry = 1; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT; ; return arg1; ;} ; ; ;int24 operator/ _divS24_16( int24 arg1, int16 arg2) ;{ _divS24_16 ; uns16 rm = 0; ; char counter = sizeof(arg1)*8+1; ; char sign = arg1.high8 ^ arg2.high8; ; if (arg1 < 0) { ; INVERT: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; Carry = 1; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT; ; return arg1; ;} ; ; ;int24 operator/ _divS24_24( int24 arg1, int24 arg2) ;{ _divS24_24 ; uns24 rm = 0; ; char counter = sizeof(arg1)*8+1; ; char sign = arg1.high8 ^ arg2.high8; ; if (arg1 < 0) { ; INVERT: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.mid8, arg2.mid8); ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; genSub( rm.mid8, arg2.mid8); ; Carry = 1; ; ENTRY: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT; ; return arg1; ;} ; ; ; ;uns8 operator% _remU16_8( uns16 arg1, uns8 arg2) ;{ _remU16_8 ; uns8 rm = 0; ; char counter = sizeof(arg1)*8; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; uns8 tmp = rl( tmp); ; W = rm - arg2; ; if (tmp & 1) ; Carry = 1; ; if (Carry) ; rm = W; ; counter = decsz(counter); ; } while (1); ; return rm; ;} ; ; ;uns8 operator% _remU24_8( uns24 arg1, uns8 arg2) ;{ _remU24_8 ; uns8 rm = 0; ; char counter = sizeof(arg1)*8; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; uns8 tmp = rl( tmp); ; W = rm - arg2; ; if (tmp & 1) ; Carry = 1; ; if (Carry) ; rm = W; ; counter = decsz(counter); ; } while (1); ; return rm; ;} ; ; ;uns16 operator% _remU16_16( uns16 arg1, uns16 arg2) ;{ _remU16_16 ; uns16 rm = 0; ; char counter = sizeof(arg1)*8; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto NOSUB; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; NOSUB: ; counter = decsz(counter); ; } while (1); ; return rm; ;} ; ; ;uns16 operator% _remU24_16( uns24 arg1, uns16 arg2) ;{ _remU24_16 ; uns16 rm = 0; ; char counter = sizeof(arg1)*8; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; if (Carry) ; goto SUBTRACT; ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto NOSUB; ; SUBTRACT: ; rm.low8 -= arg2.low8; ; genSub( rm.high8, arg2.high8); ; NOSUB: ; counter = decsz(counter); ; } while (1); ; return rm; ;} ; ; ;uns24 operator% _remU24_24( uns24 arg1, uns24 arg2) ;{ _remU24_24 ; uns24 rm = 0; ; char counter = sizeof(arg1)*8; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.mid8, arg2.mid8); ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto NOSUB; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; genSub( rm.mid8, arg2.mid8); ; NOSUB: ; counter = decsz(counter); ; } while (1); ; return rm; ;} ; ; ;int8 operator% (int8 arg1, int8 arg2) @ ; ;int8 operator% _remS16_8( int16 arg1, int8 arg2) ;{ _remS16_8 ; int8 rm = 0; ; char counter = 16; ; char sign = arg1.high8; ; if (arg1 < 0) ; arg1 = -arg1; ; if (arg2 < 0) ; arg2 = -arg2; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; W = rm - arg2; ; if (Carry) ; rm = W; ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; rm = -rm; ; return rm; ;} ; ; ;int8 operator% _remS24_8( int24 arg1, int8 arg2) ;{ _remS24_8 ; int8 rm = 0; ; char counter = sizeof(arg1)*8; ; char sign = arg1.high8; ; if (arg1 < 0) ; arg1 = -arg1; ; if (arg2 < 0) ; arg2 = -arg2; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; W = rm - arg2; ; if (Carry) ; rm = W; ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; rm = -rm; ; return rm; ;} ; ; ;int16 operator% _remS16_16( int16 arg1, int16 arg2) ;{ _remS16_16 ; int16 rm = 0; ; char counter = sizeof(arg1)*8; ; char sign = arg1.high8; ; if (arg1 < 0) ; arg1 = -arg1; ; if (arg2 < 0) ; arg2 = -arg2; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto NOSUB; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; NOSUB: ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; rm = -rm; ; return rm; ;} ; ; ;int16 operator% _remS24_16( int24 arg1, int16 arg2) ;{ _remS24_16 ; int16 rm = 0; ; char counter = sizeof(arg1)*8; ; char sign = arg1.high8; ; if (arg1 < 0) ; arg1 = -arg1; ; if (arg2 < 0) ; arg2 = -arg2; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto NOSUB; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; NOSUB: ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; rm = -rm; ; return rm; ;} ; ; ;int24 operator% _remS24_24( int24 arg1, int24 arg2) ;{ _remS24_24 ; int24 rm = 0; ; char counter = sizeof(arg1)*8; ; char sign = arg1.high8; ; if (arg1 < 0) ; arg1 = -arg1; ; if (arg2 < 0) ; arg2 = -arg2; ; do { ; arg1 = rl( arg1); ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.mid8, arg2.mid8); ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto NOSUB; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; genSub( rm.mid8, arg2.mid8); ; NOSUB: ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; rm = -rm; ; return rm; ; FILE 18\demo-mat.c ;// INTEGER MATH ; ;#pragma chip PIC18C242 // select device ; ;// FIRST ADD THE APPLICATION INTERRUPT SUPPORT (if any) ;// #include "app-int.c" ; ;// Then include math libraries: ;#include "math24.h" // 8 - 24 bit math ; ; ;void xmain( void) ;{ xmain ; char a8, b8; // 8 bit unsigned ; uns16 a16; // 16 bit unsigned ; uns16 b16 = a16; // 16 bit assignment MOVFF a16,b16 MOVFF a16+1,b16+1 ; int24 i24; // 24 bit signed ; uns24 a24, b24; // 24 bit unsigned ; ; a24 += b24; // 24 bits addition MOVF b24,W,0 ADDWF a24,1,0 MOVF b24+1,W,0 ADDWFC a24+1,1,0 MOVF b24+2,W,0 ADDWFC a24+2,1,0 ; ; a24 ++; // increment any integer INCF a24,1,0 MOVLW 0 ADDWFC a24+1,1,0 ADDWFC a24+2,1,0 ; i24 -= 1; // decrement DECF i24,1,0 SUBWFB i24+1,1,0 SUBWFB i24+2,1,0 ; ; a24 = b24 * 201100; // 24 bit multiplication MOVFF b24,arg1_2 MOVFF b24+1,arg1_2+1 MOVFF b24+2,arg1_2+2 MOVLW 140 MOVWF arg2_2,0 MOVLW 17 MOVWF arg2_2+1,0 MOVLW 3 MOVWF arg2_2+2,0 RCALL _mult24x24 MOVFF rval_2,a24 MOVFF rval_2+1,a24+1 MOVFF rval_2+2,a24+2 ; ; a24 /= 10345; // division MOVFF a24,arg1_6 MOVFF a24+1,arg1_6+1 MOVFF a24+2,arg1_6+2 MOVLW 105 MOVWF arg2_6,0 MOVLW 40 MOVWF arg2_6+1,0 RCALL _divU24_16 MOVFF arg1_6,a24 MOVFF arg1_6+1,a24+1 MOVFF arg1_6+2,a24+2 ; ; i24 -= b16; // mix variable sizes MOVF b16,W,0 SUBWF i24,1,0 MOVF b16+1,W,0 SUBWFB i24+1,1,0 MOVLW 0 SUBWFB i24+2,1,0 ; ; a8 = a8 * b8; // no warning: storing 8 bit only MOVF b8,W,0 MULWF a8,0 MOVFF PRODL,a8 ; a16 = a8 * b8; // warning: result is truncated to 8 bit CLRF a16+1,0 MULWF a8,0 MOVFF PRODL,a16 ; a16 = (uns16)a8 * b8; // type cast to get 16 bit result MULWF a8,0 MOVFF PRODL,a16 MOVFF PRODH,a16+1 ; ; a16 = ++a8; // increment before assignment INCF a8,1,0 MOVFF a8,a16 CLRF a16+1,0 ; a16 = a8 & 0xF; CLRF a16+1,0 MOVLW 15 ANDWF a8,W,0 MOVWF a16,0 ;} RETURN ; ; ;void main(void) ;{ main ; xmain(); RCALL xmain ;} SLEEP RESET END ; *** KEY INFO *** ; 0x000004 31 word(s) 0 % : _mult24x24 ; 0x000042 25 word(s) 0 % : _divU24_16 ; 0x000074 81 word(s) 0 % : xmain ; 0x000116 3 word(s) 0 % : main ; RAM usage: 24 bytes (24 local), 488 bytes free ; Maximum call level: 2 ; Total of 142 code words (1 %)