Beaucoup de générateur pseudo aléatoire se basent sur une multiplication et un modulo du style en C:
rnd= ((seed + a) * b) % c;
seed= rnd;
seed est la graine en général on utilise un timer ou une horloge
a, b, c sont des paramètres qui vont déterminer la périodicité et la répartition statistique des nombres sur un echantillon, elle sont déterminer au pifomètre
il fo donc implémenter une multiplication nb_a * nb_b
le résultat est renvoyé dans res1 pour la partie haute (MSByte) et res0 pour la partie basse (LSByte)
muliplie
movlw 8
movwf counter
movf nb_a, W
movwf tmp0
clrf tmp1
clrf res0
clrf res1
boucle_mul
rrf nb_b, F
btfss STATUS, C
goto next_mul
movf tmp0, W
addwf res0, F
btfsc STATUS, C
incf res1, W
movf tmp1, W
addwf res1, F
next_mul
bcf STATUS, C
rlf tmp0, F
rlf tmp1, F
decfsz counter, F
goto boucle_mul
return
a l'initialisation du générateur pseudo-aléatoire
tu dois faire
movf TMR0, W
movwf seed
le paramètre C vaudra 256 ce qui équivaut à prendre l'octet de poids faible du résultat de la multiplication
pour le paramètre A il doit être un nombre premier
ensuite pour calculer le nombre suivant:
generate_rnd
movf param_b, W
movwf nb_b
movf seed, W
addwf param_a, W
movwf nb_a
call multiplie
; on fait ici le mdulo b, on ne prends donc que l'octet de poids
; faible du résultat de la multiplication
movf res0, W
movwf rnd_num
movwf seed
return
Le nombre aléatoire rendu est dans RND_NUM
Core Breaker 