; ; variable right shift INCLUDE "p18f242.inc" ;unsigned char vlshift(v,amt) ;unsigned char v, amt; ;{ ; while (amt) { ; v = v << 1; ; amt--; ; } ; return(v); ;} ; Parameter space for main CBLOCK 0x020 i,j,k ENDC org 0 ;; initialize software stack ;; use FSR0 as software stack lfsr FSR0, 0x7f ; initialize main program variables movlw 0x24 movwf i ; i = 0x24 movlw 0x2 movwf j ; j = 2 ;; setup subroutine parms movf j,w movwf POSTDEC0 ; push amt value onto stack movf i,w movwf POSTDEC0 ;push v value onto stack call vshift movwf k ; k = vshift(v,amt); movf PREINC0,f ; pop amt off stack to clean up here goto here ;; subroutines ;; return value in w ;; 'amt' at INDF0+2 ;; 'v' at INDF0+1 vshift movlw 2 ;will use w to index to v movf PLUSW0,f ;test 'amt' vshift_loop btfsc STATUS,Z ; amt==0? goto vl_return bcf STATUS,C movlw 1 rlcf PLUSW0 ; v = v << 1 movlw 2 decf PLUSW0,f ; amt-- goto vshift_loop vl_return ;; 'v' has result, pop off into w reg ;; before return movf PREINC0,w ; w <- v return end