je suis entraîne de déchiffré le code division suivant donné par l'ami claudiuss01 que je le remercier
mais malheureusement jusque maintenant je n'arrive pas comprendre quelque ligne
par exemple
1)
Code : Tout sélectionner
M_STOR_STATUS macro WHERE
movf STATUS,w
movwf WHERE
endm pour quoi le registre WHERE n'est pas déclaré dans la zone des variable ?
est ce que ce code est normale?
2)
Code : Tout sélectionner
btfss REG_T2,C
est ce que REG_T2 est un registre spéciale avec un bit C ?
Code : Tout sélectionner
#include <p16F688.inc> ; remove this if not necessary
#define PRECISION 20 ; byte size for registers
[color=red]
M_STOR_STATUS macro WHERE
movf STATUS,w
movwf WHERE
endm
[/color]
M_RETR_STATUS macro WHERE
movf WHERE,w
movwf STATUS
endm
cblock 0x20
REG_X:PRECISION
REG_Y:PRECISION
REG_Z:PRECISION
REG_COUNTER
REG_STATUS
REG_T1
REG_T2
REG_ROT_COUNTER
endc
M_CLR ; clear a register
movwf FSR
movlw PRECISION
movwf REG_COUNTER
M_CLR_loop
clrf INDF
incf FSR,f
decf REG_COUNTER,f
btfss STATUS,Z
goto M_CLR_loop
return
M_ROL ; rotate a register to the left
movwf FSR
M_STOR_STATUS REG_STATUS
clrf REG_COUNTER
M_ROL_loop
M_RETR_STATUS REG_STATUS
rlf INDF,f
M_STOR_STATUS REG_STATUS
incf FSR,f
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_ROL_loop
return
M_ROR ; rotates a register to the right
movwf FSR
movlw PRECISION-1
addwf FSR,f
M_STOR_STATUS REG_STATUS
clrf REG_COUNTER
M_ROR_loop
M_RETR_STATUS REG_STATUS
rrf INDF,f
M_STOR_STATUS REG_STATUS
decf FSR,f
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_ROR_loop
return
M_CMP ; Z <=> X -> STATUS(C,Z)
; STATUS,C set if Z => X;
; STATUS,Z set if Z == X
clrf REG_COUNTER
M_CMP_loop
movf REG_COUNTER,w
sublw REG_Z+PRECISION-1
movwf FSR
movf INDF,w
movwf REG_T1
movf REG_COUNTER,w
sublw REG_X+PRECISION-1
movwf FSR
movf INDF,w
subwf REG_T1,f
btfss STATUS,Z
return
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_CMP_loop
return
M_SUB ; Z - X -> Z
clrf REG_COUNTER
bsf REG_STATUS,C
M_SUB_loop
bsf REG_T2,C
movlw REG_Z
addwf REG_COUNTER,w
movwf FSR
movf INDF,w
movwf REG_T1
movlw REG_X
addwf REG_COUNTER,w
movwf FSR
movf INDF,w
subwf REG_T1,f
btfss STATUS,C
[color=red] bcf REG_T2,C[/color]
btfsc REG_STATUS,C
goto M_SUB_no_carry
movlw 0x01
subwf REG_T1,f
btfss STATUS,C
bcf REG_T2,C
M_SUB_no_carry
movlw REG_Z
addwf REG_COUNTER,w
movwf FSR
movf REG_T1,w
movwf INDF
bsf REG_STATUS,C
btfss REG_T2,C
bcf REG_STATUS,C
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_SUB_loop
btfss REG_STATUS,C
bcf STATUS,C
return
M_DIV ; Z / X -> Y; remainder -> Z
movlw REG_Y
call M_CLR
movlw PRECISION*8
movwf REG_ROT_COUNTER
M_DIV_rot_loop
btfsc REG_X+PRECISION-1,7
goto M_DIV_loop
movlw REG_X
bcf STATUS,C
call M_ROL
decf REG_ROT_COUNTER,f
btfss STATUS,Z
goto M_DIV_rot_loop
bsf STATUS,Z
return
M_DIV_loop
call M_CMP
M_STOR_STATUS REG_T2
movlw REG_Y
call M_ROL
[color=red] M_RETR_STATUS REG_T2[/color]
btfsc STATUS,C
call M_SUB
bcf STATUS,Z
bcf STATUS,C
movlw REG_X
call M_ROR
incf REG_ROT_COUNTER,f
movlw PRECISION*8+1
subwf REG_ROT_COUNTER,w
btfss STATUS,Z
goto M_DIV_loop
return
END
j'ajoute que ce code vien de ce site
http://avtanski.net/projects/math/
merci

