; CC5X Version 3.4, Copyright (c) B Knudsen Data ; C compiler for the PICmicro family ; ************ 24. Jun 2009 9:07 ************* processor 16C54 radix DEC Carry EQU 0 Zero_ EQU 2 arg1 EQU 0x08 arg2 EQU 0x0A res EQU 0x0B rm EQU 0x0C counter EQU 0x07 ; FILE test\div16_8.c ;/* ; DIVISION: 16 bit DIV 8 bit ; ========================== ; Requires only 97 Cycles (97 microsec. at 4 MHz) to divide a 16 bit ; number by a 8 bit number. Requires that the result is 8 bit. The ; division remainder is also available. ; Optimized for SPEED & SIZE. ;*/ ; ;uns16 arg1; // argument 1: 16 bit unsigned ;uns8 arg2; // argument 2: 8 bit unsigned ;uns8 res; // result : 8 bit unsigned ;uns8 rm; // remainder : 8 bit unsigned ; ; ;char uDiv16_8( void) ;// res,rm = arg1 / arg2 ;// CYCLES: 11*8 + 10 - 1 = 97 + CALL & RETURN ;// INSTRUCTIONS: 27 ;{ uDiv16_8 ; if ( arg1.high8 >= arg2) MOVF arg2,W SUBWF arg1+1,W BTFSC 0x03,Carry ; return 0; /* overflow or zero divide */ RETLW 0 ; char counter = 8; MOVLW 8 MOVWF counter ; rm = arg1.high8; MOVF arg1+1,W MOVWF rm ; res = rl( arg1.low8); RLF arg1,W MOVWF res ; do { ; LOOP: ; rm = rl( rm); m001 RLF rm,1 ; W = arg2; MOVF arg2,W ; if ( !Carry) { BTFSC 0x03,Carry GOTO m002 ; W = rm - W; SUBWF rm,W ; if (Carry) BTFSC 0x03,Carry ; rm = W; MOVWF rm ; res = rl( res); RLF res,1 ; if ( -- counter == 0) DECFSZ counter,1 GOTO m001 ; return 1; RETLW 1 ; goto LOOP; ; } ; rm -= W; m002 SUBWF rm,1 ; Carry = 1; BSF 0x03,Carry ; res = rl( res); RLF res,1 ; } while ( -- counter > 0); DECFSZ counter,1 GOTO m001 ; return 1; // OK RETLW 1 ;} ; ; ; ;void main (void) ;{ main ; arg1 = 2000; MOVLW 208 MOVWF arg1 MOVLW 7 MOVWF arg1+1 ; arg2 = 200; MOVLW 200 MOVWF arg2 ; ; while ( arg1 > arg2) { m003 MOVF arg1+1,W BTFSS 0x03,Zero_ GOTO m004 MOVF arg1,W SUBWF arg2,W BTFSC 0x03,Carry GOTO m005 ; if ( !uDiv16_8()) m004 CALL uDiv16_8 XORLW 0 BTFSC 0x03,Zero_ ; nop(); NOP ; arg1 -= 11; MOVLW 11 SUBWF arg1,1 BTFSS 0x03,Carry DECF arg1+1,1 ; } GOTO m003 ;} m005 SLEEP ORG 0x01FF GOTO main END ; *** KEY INFO *** ; 0x0000 27 word(s) 5 % : uDiv16_8 ; 0x001B 23 word(s) 4 % : main ; RAM usage: 6 bytes (1 local), 19 bytes free ; Maximum call level: 1 ; Total of 51 code words (9 %)