;
; W register will be broken.
;
; Notes: Referred to AKIZUKI’s PIC sample software.
; This routine uses the same technic of manual-calculation.
;
; Example: 00010010 (12h)
; x00110100 (34h)
; ----------
; 00000000
; 00000000
; 00010010
; 00000000
; 00010010
; 00010010
; 00000000
; 00000000
; ------------------
; 0000001110101000 (03A8h)
;
; Allocations (MSB <-> LSB):
; EX[3] EX[2] EX[1] EX[0] X[3] X[2] X[1] X[0]
; EY[3] EY[2] EY[1] EY[0] Y[3] Y[2] Y[1] Y[0]
;-------------------------------------------------------------------------
mul_xy
; *** Initialize ***
MOV f X+0, w ; EY <- X.
MOV wf EY+0 ;
MOV f X+1, w ;
MOV wf EY+1 ;
MOV f X+2, w ;
MOV wf EY+2 ;
MOV f X+3, w ;
MOV wf EY+3 ;
MOV f Y+0, w ; X <- Y.
MOV wf X+0 ;
MOV f Y+1, w ;
MOV wf X+1 ;
MOV f Y+2, w ;
MOV wf X+2 ;
MOV f Y+3, w ;
MOV wf X+3 ;
clrf EX+0 ; Clear EX.
clrf EX+1 ;
clrf EX+2 ;
clrf EX+3 ;
MOV lw 32 ; Set data length.
MOV wf MDLOOPCT ;
; *** Multiply loop (32 times) ***
mul_loop
btfss X+0, 0 ; Skip below if LSB of XL = ’0’.
goto mul_next ; (EY * ’0’ = 0)
bcf X+0, 0 ; Clear always LSB of X.
MOV f EY+0, w ; EX <- EX + EY.
addwf EX+0, f ;
MOV lw 1 ; Set LSB of X to ’1’
btfsc status, c ; if overflow. (Set carry)
addwf EX+1, f ;
btfsc status, c ;
addwf EX+2, f ;
btfsc status, c ;
addwf EX+3, f ;
btfsc status, c ;
bsf X+0, 0 ;
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] 下一页
本文关键字:单片机 PIC单片机,单片机-工控设备 - PIC单片机