; CC1B Ver 0.5A beta, Copyright (c) B Knudsen Data ; C compiler for the Ubicom SX family ; ************ 24. Jun 2002 11:40 ************* device SX28 FSR_7 EQU 7 Carry EQU 0 Zero_ EQU 2 arg1 EQU $10 arg2 EQU $11 rval EQU $12 counter EQU $14 arg1_6 EQU $10 arg2_6 EQU $13 rval_5 EQU $16 counter_6 EQU $19 arg1_10 EQU $10 arg2_10 EQU $13 rm_4 EQU $15 counter_10 EQU $17 a8 EQU $30 b8 EQU $31 a16 EQU $32 b16 EQU $34 i24 EQU $36 a24 EQU $39 b24 EQU $3C ; FILE test\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); ;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); ;int16 operator% _remS16_16( int16 arg1, int16 arg2); ;int16 operator% _remS24_16( int24 arg1, int16 arg2); ;int24 operator% _remS24_24( int24 arg1, int24 arg2); ;*/ ; ;#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 ; ; ;int8 operator*( int8 arg1, int8 arg2) @ ; ;uns16 operator* _mult8x8( uns8 arg1, uns8 arg2) ;{ _mult8x8 BANK 0 MOV arg2,W ; uns16 rval; ; char counter = sizeof(arg2)*8; MOV W,#8 MOV counter,W ; rval.high8 = 0; CLR rval+1 ; W = arg1; MOV W,arg1 ; do { ; arg2 = rr( arg2); m001 RR arg2 ; if ( Carry) SNB 3.Carry ; rval.high8 += W; ADD rval+1,W ; rval = rr( rval); RR rval+1 RR rval ; } while ( --counter > 0); DECSZ counter JMP m001 ; return rval; MOV W,rval RET ;} ; ; ;int16 operator*( int16 arg1, int16 arg2) @ ; ;uns16 operator* _mult16x16( uns16 arg1, uns16 arg2) ;{ _mult16x16 ; uns16 rval; ; char counter = sizeof(arg1)*8; ; do { ; Carry = 0; ; rval = rl( rval); ; arg1 = rl( arg1); ; if ( Carry) ; rval += arg2; ; } while ( --counter > 0); ; return rval; ;} ; ; ; ;uns24 operator*( uns8 arg1, uns16 arg2) exchangeArgs @ ; ;uns24 operator* _multU16x8( uns16 arg1, uns8 arg2) ;{ _multU16x8 ; uns24 rval; ; rval.high8 = 0; ; char counter = sizeof(arg1)*8; ; W = arg2; ; do { ; arg1 = rr( arg1); ; if ( Carry) ; rval.high8 += W; ; rval = rr(rval); ; } while (--counter>0); ; return rval; ;} ; ; ;uns24 operator*( uns8 arg1, uns24 arg2) exchangeArgs @ ; ;uns24 operator* _multU24x8( uns24 arg1, uns8 arg2) ;{ _multU24x8 ; 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); ; } while ( --counter > 0); ; return arg1; ;} ; ; ; ; ;uns24 operator*( uns16 arg1, uns24 arg2) exchangeArgs @ ; ;uns24 operator* _multU24x16( uns24 arg1, uns16 arg2) ;{ _multU24x16 ; 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); ; } ; } while ( --counter > 0); ; return rval; ;} ; ; ; ; ;int24 operator*( int24 arg1, int24 arg2) @ ; ;uns24 operator* _mult24x24( uns24 arg1, uns24 arg2) ;{ _mult24x24 ; uns24 rval; ; char counter = sizeof(arg1)*8; MOV W,#24 MOV counter_6,W ; do { ; Carry = 0; m002 CLRB 3.Carry ; rval = rl( rval); RL rval_5 RL rval_5+1 RL rval_5+2 ; arg1 = rl( arg1); RL arg1_6 RL arg1_6+1 RL arg1_6+2 ; if ( Carry) { SB 3.Carry JMP m003 ; rval.low8 += arg2.low8; MOV W,arg2_6 ADD rval_5,W ; genAdd( rval.mid8, arg2.mid8); MOV W,arg2_6+1 SNB 3.Carry MOVSZ W,++arg2_6+1 ADD rval_5+1,W ; genAdd( rval.high8, arg2.high8); MOV W,arg2_6+2 SNB 3.Carry MOVSZ W,++arg2_6+2 ADD rval_5+2,W ; } ; } while ( --counter > 0); m003 DECSZ counter_6 JMP m002 ; return rval; MOV W,rval_5 RET ;} ; ; ; ; ; ;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); ; } while ( --counter > 0); ; 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); ; } while ( --counter > 0); ; 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); ; } while ( --counter > 0); ; return arg1; ;} ; ; ;uns24 operator/ _divU24_16( uns24 arg1, uns16 arg2) ;{ _divU24_16 ; uns16 rm = 0; CLR rm_4 CLR rm_4+1 ; char counter = sizeof(arg1)*8+1; MOV W,#25 MOV counter_10,W ; goto ENTRY; JMP m006 ; do { ; rm = rl( rm); m004 RL rm_4 RL rm_4+1 ; if ( Carry) SNB 3.Carry ; goto SUBTRACT; JMP m005 ; W = rm.low8 - arg2.low8; MOV W,arg2_10 MOV W,rm_4-W ; genSubW( rm.high8, arg2.high8); MOV W,arg2_10+1 SB 3.Carry MOVSZ W,++arg2_10+1 MOV W,rm_4+1-W ; if (!Carry) SB 3.Carry ; goto ENTRY; JMP m006 ; SUBTRACT: ; rm.low8 -= arg2.low8; m005 MOV W,arg2_10 SUB rm_4,W ; genSub( rm.high8, arg2.high8); MOV W,arg2_10+1 SB 3.Carry MOVSZ W,++arg2_10+1 SUB rm_4+1,W ; Carry = 1; SETB 3.Carry ; ENTRY: ; arg1 = rl( arg1); m006 RL arg1_10 RL arg1_10+1 RL arg1_10+2 ; } while ( --counter > 0); DECSZ counter_10 JMP m004 ; return arg1; MOV W,arg1_10 RET ;} ; ; ;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); ; } while ( --counter > 0); ; 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); ; } while ( --counter > 0); ; 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); ; } while ( --counter > 0); ; 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); ; } while ( --counter > 0); ; 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); ; } while ( --counter > 0); ; 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); ; } while ( --counter > 0); ; 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; ; } while ( --counter > 0); ; 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; ; } while ( --counter > 0); ; 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: ; } while ( --counter > 0); ; 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: ; } while ( --counter > 0); ; 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: ; } while ( --counter > 0); ; 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; ; } while ( --counter > 0); ; 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: ; } while ( --counter > 0); ; 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: ; } while ( --counter > 0); ; 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: ; } while ( --counter > 0); ; if ( sign & 0x80) ; rm = -rm; ; return rm; ; FILE sx\demo-mat.c ;// INTEGER MATH ; ;#pragma chip SX28 // 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 MOV W,a16 MOV b16,W MOV W,a16+1 MOV b16+1,W ; bank1 int24 i24; // 24 bit signed ; bank1 uns24 a24, b24; // 24 bit unsigned ; ; a24 += b24; // 24 bits addition MOV W,b24+2 ADD a24+2,W MOV W,b24+1 ADD a24+1,W SNB 3.Carry INC a24+2 MOV W,b24 ADD a24,W SB 3.Carry JMP m007 INC a24+1 SNB 3.Zero_ INC a24+2 ; ; a24 ++; // increment any integer m007 INCSZ a24 JMP m008 INC a24+1 SNB 3.Zero_ INC a24+2 ; i24 -= 1; // decrement m008 DEC i24 MOVSZ W,++i24 JMP m009 DEC i24+1 MOV W,++i24+1 SNB 3.Zero_ DEC i24+2 ; ; a24 = b24 * 201100; // 24 bit multiplication m009 MOV W,b24 BANK 0 MOV arg1_6,W BANK 32 MOV W,b24+1 BANK 0 MOV arg1_6+1,W BANK 32 MOV W,b24+2 BANK 0 MOV arg1_6+2,W MOV W,#140 MOV arg2_6,W MOV W,#17 MOV arg2_6+1,W MOV W,#3 MOV arg2_6+2,W CALL _mult24x24 BANK 32 MOV a24,W BANK 0 MOV W,rval_5+1 BANK 32 MOV a24+1,W BANK 0 MOV W,rval_5+2 BANK 32 MOV a24+2,W ; ; a24 /= 10345; // division MOV W,a24 BANK 0 MOV arg1_10,W BANK 32 MOV W,a24+1 BANK 0 MOV arg1_10+1,W BANK 32 MOV W,a24+2 BANK 0 MOV arg1_10+2,W MOV W,#105 MOV arg2_10,W MOV W,#40 MOV arg2_10+1,W CALL _divU24_16 BANK 32 MOV a24,W BANK 0 MOV W,arg1_10+1 BANK 32 MOV a24+1,W BANK 0 MOV W,arg1_10+2 BANK 32 MOV a24+2,W ; ; i24 -= b16; // mix variable sizes MOV W,b16+1 SUB i24+1,W SB 3.Carry DEC i24+2 MOV W,b16 SUB i24,W SNB 3.Carry JMP m010 DEC i24+1 MOV W,++i24+1 SNB 3.Zero_ DEC i24+2 ; ; a8 = a8 * b8; // no warning: storing 8 bit only m010 MOV W,a8 BANK 0 MOV arg1,W BANK 32 MOV W,b8 CALL _mult8x8 BANK 32 MOV a8,W ; a16 = a8 * b8; // warning: result is truncated to 8 bit BANK 0 MOV arg1,W BANK 32 MOV W,b8 CALL _mult8x8 BANK 32 MOV a16,W CLR a16+1 ; a16 = (uns16)a8 * b8; // type cast to get 16 bit result MOV W,a8 BANK 0 MOV arg1,W BANK 32 MOV W,b8 CALL _mult8x8 BANK 32 MOV a16,W BANK 0 MOV W,rval+1 BANK 32 MOV a16+1,W ; ; a16 = ++a8; // increment before assignment INC a8 MOV W,a8 MOV a16,W CLR a16+1 ; a16 = a8 & 0xF; CLR a16+1 MOV W,#15 AND W,a8 MOV a16,W ;} RET ; ; ;void main(void) ;{ main ; xmain(); BANK 32 CLRB 4.FSR_7 CALL xmain ;} SLEEP ORG $07FF GOTO main END