hello a tous ....
je suis en train de continuer mon adaptation du jeu sorcery sur le ZX81 ...ceci en langage machine ... mais je bute sur une procedure:
je voudrais realiser le petit programme basic qui suit en LANGAGE MACHINE :
10 LET A=(INT(RND*4)+1)
20 IF A=1 THEN RAND USR 16695
30 IF A=2 THEN RAND USR 16787
40 IF A=3 then RAND USR 16874
50 IF A=4 THEN RAND USR 16973
60 GOTO 10
voila MERCI A CELUI QUI POURRA M AIDER a realiser cette petite routine en LANGAGE MACHINE ... je bute pour l instant
didier
ZX81 > demande d aide pour programmation >
Modérateur : Politburo
-
- Fonctionne à 300 bauds
- Messages : 99
- Enregistré le : 05 janv. 2009 21:02
- Localisation : BORDEAUX
ZX81 > demande d aide pour programmation >
UTILISATEUR du ZX81 depuis 1982 . j ai un lecteur de disquette mageco qui marche bien ... mon zx a ete modifie (prise joystick ... extension 16KO interne ...) ... j ai edite y a 5 an un journal appele micro sinclair ... le numero 6 est en cour
- Metalion
- Fonctionne à 75 bauds
- Messages : 63
- Enregistré le : 18 févr. 2008 13:46
- Localisation : Belgique & Nord
Re: ZX81 > demande d aide pour programmation >
Je ne connais pas le ZX81, mais je connais bien le Z80 ...
Je suppose que RND renvoie un nombre aléatoire entre 0 et 1 ?
Si c'est bien le cas, il suffit d'utiliser le registre R, qui est plus ou moins son équivalent en langage machine.
Je dis plus ou moins, car il n'est pas tout à fait aléatoire, mais c'est mieux que rien ...
Je suppose que RND renvoie un nombre aléatoire entre 0 et 1 ?
Si c'est bien le cas, il suffit d'utiliser le registre R, qui est plus ou moins son équivalent en langage machine.
Je dis plus ou moins, car il n'est pas tout à fait aléatoire, mais c'est mieux que rien ...
Code : Tout sélectionner
; nombre pseudo-aléatoire entre 0 et 255
start: ld a,r
; appel si nombre compris entre 0 et 63
cp 64
jr nc,next2
call routine1
jr start
; appel si nombre compris entre 64 et 127
next2: cp 128
jr nc,next3
call routine2
jr start
; appel si nombre compris entre 128 et 191
next3: cp 192
jr nc,next4
call routine3
jr start
; appel si nombre compris entre 192 et 255
next4: call routine4
jr start
Daewoo DPC-200 (MSX1)
Sony HB-F9P (MSX2)
Panasonic FS-A1WX (MSX2+)
Sony HB-F9P (MSX2)
Panasonic FS-A1WX (MSX2+)
- Demoniak
- Fonctionne à 300 bauds
- Messages : 80
- Enregistré le : 03 oct. 2004 15:47
- Localisation : Dunkerque (59)
- Contact :
Re: ZX81 > demande d aide pour programmation >
Attention, le registre R est incrémenté à chaque cycle sur 7 bits seulement, le 8ème bit (bit 7 si on numérote en partent de zéro) reste constant.
Pour faire un test d'une valeur aléatoire avec le registre R, il est donc préférable de faire un truc du style :On récupère donc une valeur entre 0 et 127.
Sinon, un petit bout de code qui génère un nombre pseudo aléatoire :On récupère dans A une valeur aléatoire entre 0 et 255.
Pour faire un test d'une valeur aléatoire avec le registre R, il est donc préférable de faire un truc du style :
Code : Tout sélectionner
LD A,R
AND 127 ; Masquer bit 7
Sinon, un petit bout de code qui génère un nombre pseudo aléatoire :
Code : Tout sélectionner
Rand16:
LD DE,56069
LD A,D
LD L,253
LD H,E
SBC HL,DE
SBC A,B
SBC HL,DE
LD D,B
SBC A,D
LD E,A
SBC HL,DE
JR NC,SetRand
INC HL
SetRand:
LD (Rand16+1),HL
- Metalion
- Fonctionne à 75 bauds
- Messages : 63
- Enregistré le : 18 févr. 2008 13:46
- Localisation : Belgique & Nord
Re: ZX81 > demande d aide pour programmation >
Tu as raison, j'avais oublié ce détail.Demoniak a écrit :Attention, le registre R est incrémenté à chaque cycle sur 7 bits seulement, le 8ème bit (bit 7 si on numérote en partent de zéro) reste constant.
Pour faire un test d'une valeur aléatoire avec le registre R, il est donc préférable de faire un truc du style :On récupère donc une valeur entre 0 et 127.Code : Tout sélectionner
LD A,R AND 127 ; Masquer bit 7
Le 8e bit de R garde en fait sa valeur à l'initialisation du registre.
Alternativement, on peut aussi initialiser R à zéro et ensuite utiliser directement la valeur de R entre 0 et 127 pour chaque test.
Il faut modifier mon code en conséquence :
Code : Tout sélectionner
; nombre pseudo-aléatoire entre 0 et 127
start: ld a,r
and 127
; appel si nombre compris entre 0 et 31
cp 32
jr nc,next2
call routine1
jr start
; appel si nombre compris entre 32 et 63
next2: cp 64
jr nc,next3
call routine2
jr start
; appel si nombre compris entre 64 et 95
next3: cp 96
jr nc,next4
call routine3
jr start
; appel si nombre compris entre 96 et 127
next4: call routine4
jr start
Très intéressant ...Demoniak a écrit :Sinon, un petit bout de code qui génère un nombre pseudo aléatoire
Le seul défaut pour moi, c'est que c'est un code dynamique.
Je développe presque toujours sur support ROM ou EPROM, donc inutilisable en l'état.
Par contre, tu as éveillé ma curiosité, je vais aller voir sur le net pour une autre routine en code statique.
Daewoo DPC-200 (MSX1)
Sony HB-F9P (MSX2)
Panasonic FS-A1WX (MSX2+)
Sony HB-F9P (MSX2)
Panasonic FS-A1WX (MSX2+)