MSX Village forum

La Place des Développeurs Random en assembleur ?

bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 31/10/2012 à 10h23
Bonjour,

j'aimerais utiliser une fonction du genre RND(n), mais en assembleur ... Je n'ai pas trouvé d'appel bios qui permet de faire ça ... Vous n'auriez pas une piste ? Même une fonction qui me ramène un nombre de 0 à 65000 et des bananes, j'arriverais à me débrouiller ensuite ... :top (Enfin je crois :) )
GDX Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 17/01/2011 à 08h52

Messages: 3004

Le 31/10/2012 à 11h05
Le registre R.
   
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 561

Le 31/10/2012 à 11h32
Code :
LD A,R


DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
   
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 561

Le 31/10/2012 à 11h37
Code :
        LD      A,R
        LD      L,A
        LD      A,R
        LD      H,A


DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
   
bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 31/10/2012 à 14h43
Sector28 :
Code :
        LD      A,R
        LD      L,A
        LD      A,R
        LD      H,A




Ha oui, dans le genre simple on fait pas mieux !! Merci !!!
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2924

Le 31/10/2012 à 14h48
Un registre random ? C'est quoi son fonctionnement ?

EDIT : Ok, j'ai trouvé. ^^
En fait, le R c'est pas pour 'random' mais pour 'refresh'. C'est un registre dont la valeur est incrémenté à chaque exécution d'une instruction assembleur. Du coup, c'est un « random » très basique. Edité par aoineko Le 31/10/2012 à 15h02


On est toujours ignorant avant de savoir.
Github    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10748

Le 31/10/2012 à 15h02
trouvé chez les crocos

Pour finir, le registre IR n'est pas utilisable sous sa forme 16 bits, mais sous forme de deux registres 8 bis : I et R.
Le registre I est utilisé pour les interruptions en mode 2, une chose que nous verrons sans doute plus tard...

Le registre R est utilisé comme registre de rafraichissement des mémoires RAM. En gros, il est incrémenté automatiquement par le processeur.
Il est souvent utilisé comme générateur de nombre aléatoires, sa valeur étant incrémenté très rapidement par le processeur.


:noel
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2924

Le 31/10/2012 à 15h20
Voici un bout de code trouvé sur le net :

8 bits


Code ASM :
 
 
;This is a very simple linear congruential generator. 
;The formula is x[i + 1] = (5 * x[i] + 1) mod 256. 
;Its only advantage is small size and simplicity. 
;Due to nature of such generators only a couple of higher bits should be considered random.
 
;Input: none
;Output: A = pseudo-random number, period 256
 
Rand8lda,Seed; Seed is usually 0
ldb,a
adda,a
adda,a
adda,b
inca; another possibility is ADD A,7
ld(Rand8+1),a
ret
 


16 bits


Code ASM :
 
 
;This generator is based on similar method but gives much better results. 
;It was taken from an old ZX Spectrum game and slightly optimised.
 
;Input: none
;Output: HL = pseudo-random number, period 65536
 
Rand16ldde,Seed; Seed is usually 0
lda,d
ldh,e
ldl,253
ora
sbchl,de
sbca,0
sbchl,de
ldd,0
sbca,d
lde,a
sbchl,de
jrnc,Rand
inchl
Randld(Rand16+1),hl
ret
 
 


En mettant en source (seed) le contenu du registre R, ça donnerait de bon résultat a mon avis. Edité par aoineko Le 31/10/2012 à 15h22


On est toujours ignorant avant de savoir.
Github    
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 31/10/2012 à 16h06
Jipe :
Le registre R est utilisé comme registre de rafraichissement des mémoires RAM. En gros, il est incrémenté automatiquement par le processeur.

Il est souvent utilisé comme générateur de nombre aléatoires, sa valeur étant incrémenté très rapidement par le processeur.


Effectivement, il n'est pas tout à fait aléatoire.



Si il est utilisé dans une boucle qui se répète à grande fréquence, il risque de donner toujours les mêmes valeurs à partir d'un certain cycle.

D'où l'intérêt de ces petites routines ci-dessus qui génèrent un suite arithmétique, toujours pas aléatoire, mais avec beaucoup moins de risque de se répéter.


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
Sector28 Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 12/05/2018 à 23h00

Messages: 561

Le 31/10/2012 à 16h14
il faut placer le contenu de R dans (Rand16+1) ou (Rand8+1)

Code :
        LD      A,R
        LD      L,A
        LD      A,R
        LD      H,A
        LD      (Rand16+1),HL
        LD      (Rand8+1),A



Code :
        CALL    Rand16      ;  Pour mettre dans HL un nombre aléatoire

Code :
        CALL    Rand8       ;  Pour mettre dans A un nombre aléatoire


DONALD TRUMP IS FAST APPROACHING
NEMESIS ! RETURN IMMEDIATELY !
   
bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 31/10/2012 à 21h14
La par contre, je ne comprends pas à quoi correspond les Rand8 et Rand16 ...

Désolé, je débute tout doucement en assembleur ... De plus ensuite il faudra que je réduise la chose dans un interval limité. (Entre 0 et 3 par exemple).

Voilà en fait pourquoi je vous embête.

http://youtu.be/vnLWIzGZDsw

Pour le moment mes nombres aléatoire sont basé sur la position x et y du joueur, qui est quelquepart obligé de bouger :).

J'utilise alors position_joueur%valeurMax, mais bizarrement SDCC, en C, me fait planter le programme si le modulo n'est pas une puissance de 2. (Normal puisqu'il remplace le modulo par un &1, &3, &7, etc ... etc...) en bonus ...
Visiteur

Vagabond

Rang

Avatar

Message : 0

Le 31/10/2012 à 21h58
début prometteur :top Edité par Visiteur Le 31/10/2012 à 22h08
   
Metalion Membre non connecté

Conseiller Municipal

Rang

Avatar

Inscrit le : 23/12/2009 à 15h32

Messages: 1503

Le 31/10/2012 à 21h58
bfg :
La par contre, je ne comprends pas à quoi correspond les Rand8 et Rand16 ...


Ce sont les étiquettes du programme en assembleur un peu plus haut ...


MSX1: Daewoo DPC-200 / Yamaha CX5M
MSX2: Sony HB-F9P
MSXVR
Vidéo: V9990 (GFX-9)
Audio: MSX-Music (FM-PAC) / MSX-Audio (Audiowave) / OPL4 (Monster Sound FM Blaster) / OPNB (Neotron)
   
bfg Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 05/08/2011 à 10h02

Messages: 58

Le 01/11/2012 à 07h16
Metalion :
bfg :
La par contre, je ne comprends pas à quoi correspond les Rand8 et Rand16 ...


Ce sont les étiquettes du programme en assembleur un peu plus haut ...




Donc je suis encore plus paumé :) :) :)





ld (Rand8+1),a



Si Rand8 est une étiquette, donc un adresse mémoire, pourquoi charge t'on ça dans l'accumulateur ???? (Ou alors je sais pas lire l'instruction ...)
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1512

Le 01/11/2012 à 08h53
Tu charges le contenu de l'adresse Rand8+1, pas l'adresse ! ;)

Quand il y a des parenthèses ou crochets, c'est le contenu de l'adresse, sans elles c'est la valeur proprement dite.


MSX un jour, MSX toujours ! :D
Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie