ZX81 > demande d aide pour programmation >

Tous les Sinclair. Du Mk14 au QL

Modérateur : Politburo

Répondre
DIDIER
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 99
Enregistré le : 05 janv. 2009 21:02
Localisation : BORDEAUX

ZX81 > demande d aide pour programmation >

Message par DIDIER »

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
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
Avatar du membre
Metalion
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 63
Enregistré le : 18 févr. 2008 13:46
Localisation : Belgique & Nord

Re: ZX81 > demande d aide pour programmation >

Message par Metalion »

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 ...

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+)
Avatar du membre
Demoniak
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 80
Enregistré le : 03 oct. 2004 15:47
Localisation : Dunkerque (59)
Contact :

Re: ZX81 > demande d aide pour programmation >

Message par Demoniak »

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 :

Code : Tout sélectionner

LD      A,R
AND     127     ; Masquer bit 7
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 :

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
On récupère dans A une valeur aléatoire entre 0 et 255.
Avatar du membre
Metalion
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 63
Enregistré le : 18 févr. 2008 13:46
Localisation : Belgique & Nord

Re: ZX81 > demande d aide pour programmation >

Message par Metalion »

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 :

Code : Tout sélectionner

LD      A,R
AND     127     ; Masquer bit 7
On récupère donc une valeur entre 0 et 127.
Tu as raison, j'avais oublié ce détail.
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
Demoniak a écrit :Sinon, un petit bout de code qui génère un nombre pseudo aléatoire
Très intéressant ...
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+)
Répondre

Retourner vers « Sinclair »