La Place des Développeurs Random en assembleur ?
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 ... (Enfin je crois )
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 ... (Enfin je crois )
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
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
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.
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.
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.
aoineko
Membre non connecté
Conseiller Municipal
Voici un bout de code trouvé sur le net :
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
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.
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.
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
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 !
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 ...
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 ...
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)
Metalion :
Ce sont les étiquettes du programme en assembleur un peu plus haut ...
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 ...)
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.
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 !
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie