|
, pic乘除運算子程序
#define STATUS 3
#define skpb skpnc ;skip if borrowed #define skpnb skpc ;skip if no borrow
cblock 0x10 PROD:2 ;2 bytes for production QUOT:2 ;2 bytes for quotient PAVRA ;divider/multiplier PAVRB ;reminder / multiplier PAVRC ;additional byte space mcount ;loop counter endc
org 000h
;MOVlw 0x20; ;MOVwf PAVRA ;MOVlw 0x30 ;MOVwf PAVRB
call BBYTE_DIV
goto $-1
;==================================== ;PROD:2 = PAVRA * PAVRB ;==================================== BYTE_MUL clrf PROD clrf PROD+1 MOVlw .8 MOVwf mcount _mul1 rlf PROD,f ;left shift 16-bit with LSB=0 bcf PROD,0 rlf PROD+1,f rlf PAVRA,w ;make left-rotate shift rlf PAVRA,f ;and check MSB skpc ;skip if MSB=1 goto _mul2 ;MSB=0 ;do when MSB=1 MOVf PAVRB,w addwf PROD,f skpnc incf PROD+1,f _mul2 decfsz mcount,f goto _mul1 retlw 0
;==================================== ;WORD divided by BYTE = ;PROD:2 / PAVRA = ;QUOT:2 = Quotient = ;PAVRB = Reminder = ;==================================== WBYTE_DIV MOVf PAVRA,f skpnz retlw 1 ;return if divider=0 clrf PAVRB clrf PAVRC clrf QUOT clrf QUOT+1 MOVlw .16 MOVwf mcount _wdiv1 rlf QUOT,f ;adjust Quotient rlf QUOT+1,f bcf QUOT,0 ; rlf PROD+1,w rlf PROD,f rlf PROD+1,f ; rlf PAVRB,f rlf PAVRC,f ; MOVf PAVRA,w subwf PAVRB,f skpb ;skip if borrow goto _wdiv2 ;if borrow btfsc PAVRC,0 goto _wdiv2 addwf PAVRB,f bcf PAVRC,0 goto _wdiv3 _wdiv2 ;if no borrow bcf PAVRC,0 bsf QUOT,0 _wdiv3 decfsz mcount,f goto _wdiv1 retlw 0
;==================================== ;BYTE divided by BYTE = ;PROD[0] / PAVRA = ;QUOT[0] = Quotient = ;PAVRB = Reminder = ;==================================== BBYTE_DIV MOVf PAVRA,f skpnz retlw 1 ;return if divider=0 clrf PAVRB ;clear reminder clrf QUOT ;clear quotient MOVlw .8 MOVwf mcount ;for 8 times shift _bdiv1 rlf QUOT,f ;adjust Quotient bcf QUOT,0 ;left shift i bit ; rlf PROD,w ;get 1 bit, MSB first rlf PROD,f ;do rotate shift ; rlf PAVRB,f ;set to LSB of reminder ; MOVf PAVRA,w ;reminder - divider subwf PAVRB,f skpb ;skip if borrow goto _bdiv2 ;do if borrowed addwf PAVRB,f ;cancel subtraction goto _bdiv3 ;go for next _bdiv2 ;do if no borrow bsf QUOT,0 ;reminder > divider ;update quotient _bdiv3 decfsz mcount,f ;loop test goto _bdiv1 ;do 8 times retlw 0 ;completed
END |