; CC7A Ver 1.0D, Copyright (c) B Knudsen Data ; C compiler for the PIC18 microcontrollers ; ************ 24. Feb 2011 12:28 ************* processor 17C766 radix DEC PRODL EQU 0x18 PRODH EQU 0x19 WREG EQU 0x0A Carry EQU 0 arg1_2 EQU 0x20 arg2_2 EQU 0x23 rval_2 EQU 0x26 arg1_6 EQU 0x20 arg2_6 EQU 0x23 rm_4 EQU 0x25 counter_4 EQU 0x27 a8 EQU 0x120 b8 EQU 0x121 a16 EQU 0x122 b16 EQU 0x124 i24 EQU 0x126 a24 EQU 0x129 b24 EQU 0x12C 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_ML; ; do { ; if (Carry) ; rvalH += W; ; rvalH = rr( rvalH); ; ENTRY_ML: ; 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 MOVFP arg1_2,WREG MULWF arg2_2 ; rval.low8 = loRES; MOVPF PRODL,rval_2 ; rval.mid8 = hiRES; MOVPF PRODH,rval_2+1 ; ; hw_mult8x8( arg1.mid8, arg2.mid8); // p3 MOVFP arg1_2+1,WREG MULWF arg2_2+1 ; rval.high8 = loRES; MOVPF PRODL,rval_2+2 ; ; hw_mult8x8( arg1.mid8, arg2.low8); // p2 MULWF arg2_2 ; rval.mid8 += loRES; MOVFP PRODL,WREG ADDWF rval_2+1,1 ; genAdd( rval.high8, hiRES); MOVFP PRODH,WREG ADDWFC rval_2+2,1 ; ; hw_mult8x8( arg1.low8, arg2.mid8); // p2 MOVFP arg1_2,WREG MULWF arg2_2+1 ; rval.mid8 += loRES; MOVFP PRODL,WREG ADDWF rval_2+1,1 ; genAdd( rval.high8, hiRES); MOVFP PRODH,WREG ADDWFC rval_2+2,1 ; ; hw_mult8x8( arg1.high8, arg2.low8); // p3 MOVFP arg1_2+2,WREG MULWF arg2_2 ; rval.high8 += loRES; MOVFP PRODL,WREG ADDWF rval_2+2,1 ; ; hw_mult8x8( arg1.low8, arg2.high8); // p3 MOVFP arg1_2,WREG MULWF arg2_2+2 ; rval.high8 += loRES; MOVFP PRODL,WREG ADDWF rval_2+2,1 ; ; #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; MOVFP rval_2,WREG RETURN ;} ; ; ; ;uns16 operator/ _divU16_8( uns16 arg1, uns8 arg2) ;{ _divU16_8 ; uns8 rm = 0; ; char counter = sizeof(arg1)*8+1; ; goto ENTRY_ML; ; do { ; rm = rl( rm); ; uns8 tmp = rl( tmp); ; W = rm - arg2; ; if (tmp&1) ; Carry = 1; ; if (Carry) ; rm = W; ; ENTRY_ML: ; 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_ML; ; do { ; rm = rl( rm); ; uns8 tmp = rl( tmp); ; W = rm - arg2; ; if (tmp&1) ; Carry = 1; ; if (Carry) ; rm = W; ; ENTRY_ML: ; 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_ML; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY_ML; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; Carry = 1; ; ENTRY_ML: ; 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,1 CLRF rm_4+1,1 ; char counter = sizeof(arg1)*8+1; MOVLW 25 MOVWF counter_4 ; goto ENTRY_ML; GOTO m003 ; do { ; rm = rl( rm); m001 RLCF rm_4,1 RLCF rm_4+1,1 ; if (Carry) BTFSC 0x04,Carry ; goto SUBTRACT; GOTO m002 ; W = rm.low8 - arg2.low8; MOVFP arg2_6,WREG SUBWF rm_4,W ; genSubW( rm.high8, arg2.high8); MOVFP arg2_6+1,WREG SUBWFB rm_4+1,W ; if (!Carry) BTFSS 0x04,Carry ; goto ENTRY_ML; GOTO m003 ; SUBTRACT: ; rm.low8 -= arg2.low8; m002 MOVFP arg2_6,WREG SUBWF rm_4,1 ; genSub( rm.high8, arg2.high8); MOVFP arg2_6+1,WREG SUBWFB rm_4+1,1 ; Carry = 1; BSF 0x04,Carry ; ENTRY_ML: ; arg1 = rl( arg1); m003 RLCF arg1_6,1 RLCF arg1_6+1,1 RLCF arg1_6+2,1 ; counter = decsz(counter); DECFSZ counter_4,1 ; } while (1); GOTO m001 ; return arg1; MOVFP arg1_6,WREG RETURN ;} ; ; ;uns24 operator/ _divU24_24( uns24 arg1, uns24 arg2) ;{ _divU24_24 ; uns24 rm = 0; ; char counter = sizeof(arg1)*8+1; ; goto ENTRY_ML; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.mid8, arg2.mid8); ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY_ML; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; genSub( rm.mid8, arg2.mid8); ; Carry = 1; ; ENTRY_ML: ; 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_ML: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY_ML; ; do { ; rm = rl( rm); ; W = rm - arg2; ; if (Carry) ; rm = W; ; ENTRY_ML: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT_ML; ; 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_ML: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY_ML; ; do { ; rm = rl( rm); ; W = rm - arg2; ; if (Carry) ; rm = W; ; ENTRY_ML: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT_ML; ; 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_ML: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY_ML; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY_ML; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; Carry = 1; ; ENTRY_ML: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT_ML; ; 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_ML: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY_ML; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY_ML; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; Carry = 1; ; ENTRY_ML: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT_ML; ; 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_ML: ; arg1 = -arg1; ; if (!counter) ; return arg1; ; } ; if (arg2 < 0) ; arg2 = -arg2; ; goto ENTRY_ML; ; do { ; rm = rl( rm); ; W = rm.low8 - arg2.low8; ; genSubW( rm.mid8, arg2.mid8); ; genSubW( rm.high8, arg2.high8); ; if (!Carry) ; goto ENTRY_ML; ; rm.high8 = W; ; rm.low8 -= arg2.low8; ; genSub( rm.mid8, arg2.mid8); ; Carry = 1; ; ENTRY_ML: ; arg1 = rl( arg1); ; counter = decsz(counter); ; } while (1); ; if (sign & 0x80) ; goto INVERT_ML; ; 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 17\demo-mat.c ;// INTEGER MATH ; ;#pragma chip PIC17C766 // select device ; ;// FIRST ADD THE INTERRUPT ROUTINE (if any) ;// #include "app-int.c" ; ;// Then include math libraries: ;#pragma rambank 0 ;#include "math24.h" // 8 - 24 bit math ; ; ;void xmain( void) ;{ xmain ; bank1 char a8, b8; // 8 bit unsigned ; bank1 uns16 a16; // 16 bit unsigned ; bank1 uns16 b16 = a16; // 16 bit assignment MOVFP a16,WREG MOVWF b16 MOVFP a16+1,WREG MOVWF b16+1 ; bank1 int24 i24; // 24 bit signed ; bank1 uns24 a24, b24; // 24 bit unsigned ; ; a24 += b24; // 24 bits addition MOVFP b24,WREG ADDWF a24,1 MOVFP b24+1,WREG ADDWFC a24+1,1 MOVFP b24+2,WREG ADDWFC a24+2,1 ; ; a24 ++; // increment any integer INCF a24,1 MOVLW 0 ADDWFC a24+1,1 ADDWFC a24+2,1 ; i24 -= 1; // decrement DECF i24,1 SUBWFB i24+1,1 SUBWFB i24+2,1 ; ; a24 = b24 * 201100; // 24 bit multiplication MOVFP b24,WREG MOVLR 0 MOVWF arg1_2 MOVLR 1 MOVFP b24+1,WREG MOVLR 0 MOVWF arg1_2+1 MOVLR 1 MOVFP b24+2,WREG MOVLR 0 MOVWF arg1_2+2 MOVLW 140 MOVWF arg2_2 MOVLW 17 MOVWF arg2_2+1 MOVLW 3 MOVWF arg2_2+2 CALL _mult24x24 MOVLR 1 MOVWF a24 MOVLR 0 MOVFP rval_2+1,WREG MOVLR 1 MOVWF a24+1 MOVLR 0 MOVFP rval_2+2,WREG MOVLR 1 MOVWF a24+2 ; ; a24 /= 10345; // division MOVFP a24,WREG MOVLR 0 MOVWF arg1_6 MOVLR 1 MOVFP a24+1,WREG MOVLR 0 MOVWF arg1_6+1 MOVLR 1 MOVFP a24+2,WREG MOVLR 0 MOVWF arg1_6+2 MOVLW 105 MOVWF arg2_6 MOVLW 40 MOVWF arg2_6+1 CALL _divU24_16 MOVLR 1 MOVWF a24 MOVLR 0 MOVFP arg1_6+1,WREG MOVLR 1 MOVWF a24+1 MOVLR 0 MOVFP arg1_6+2,WREG MOVLR 1 MOVWF a24+2 ; ; i24 -= b16; // mix variable sizes MOVFP b16,WREG SUBWF i24,1 MOVFP b16+1,WREG SUBWFB i24+1,1 MOVLW 0 SUBWFB i24+2,1 ; ; a8 = a8 * b8; // no warning: storing 8 bit only MOVFP b8,WREG MULWF a8 MOVPF PRODL,a8 ; a16 = a8 * b8; // warning: result is truncated to 8 bit CLRF a16+1,1 MULWF a8 MOVPF PRODL,a16 ; a16 = (uns16)a8 * b8; // type cast to get 16 bit result MULWF a8 MOVPF PRODL,a16 MOVPF PRODH,a16+1 ; ; a16 = ++a8; // increment before assignment INCF a8,1 MOVFP a8,WREG MOVWF a16 CLRF a16+1,1 ; a16 = a8 & 0xF; CLRF a16+1,1 MOVLW 15 ANDWF a8,W MOVWF a16 ;} RETURN ; ; ;void main(void) ;{ main ; xmain(); MOVLR 1 CALL xmain ;} SLEEP GOTO main END ; *** KEY INFO *** ; 0x0001 P0 28 word(s) 0 % : _mult24x24 ; 0x001D P0 27 word(s) 0 % : _divU24_16 ; 0x0038 P0 95 word(s) 1 % : xmain ; 0x0097 P0 4 word(s) 0 % : main ; RAM usage: 24 bytes (24 local), 878 bytes free ; Maximum call level: 2 ; Codepage 0 has 155 word(s) : 1 % ; Codepage 1 has 0 word(s) : 0 % ; Total of 155 code words (0 %)