Logicielsmoto.com

Nous sommes le 28 Mar 2024, 11:17

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 108 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6 ... 8  Suivante
Auteur Message
MessagePosté: 02 Juin 2022, 12:54 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
Citation:
En basic quand tu fais un print (l'équivalent du PUTC), ça va automatiquement à la ligne non ?
Le PRINT basic n'est pas équivalent du PUTC. Le PRINT n'est pas atomique et est constitué de pleins de PUTC. En particulier le PRINT basic ajoute un PUTC(NEWLINE) (retour à la ligne) à la fin s'il ne se termine pas par le symbole ";"
Code:
PRINT "COU"; : REM PAS DE RETOUR A LA LIGNE
PRINT "COU" : REM RETOUR A LA LIGNE
Donc avec PUTC pas besoin de locate, le curseur passe juste à la colonne suivante automatiquement. Tu gagnera du temps si tu ne fais pas l'équivalent du LOCATE à chaque case.
Citation:
Ce que j'aimerais c'est un truc qui permette d'afficher tous les caractères d'une même ligne en même temps. C'est possible ça en assembleur Thomson ?
Qu'entends du "en même temps". On affiche un caractère à la fois, le "même temps" est relatif. Mais oui sans LOCATE inutiles l'affichage de la grille sera encore plus rapide.


Testé et approuvé!

Mine (jeu de mot involontaire) de rien on gagne un peu de temps, puisque pour l'affichage de la grille 25x20 on passe de 1"50-1"70 à 1"10-1"20! (soit de 25-30% quand même)... Je me demande si je mettais une routine testant le 6309 et passant alors en mode natif, ce que ça donnerait..

Adopté et approuvé.

Bon j'espère avoir fini la partie en cascade d'ici la fin de semaine (et donc que ça soit jouable.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 03 Juin 2022, 13:02 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Question à propos de l'assembleur v2.0 ou v3.0.

quand je fais ce code en mode indexé:

Code:
 clr 512,X

Avec X=$9000
Ca met bien à 0 l'octet se trouvant en adresse X+512, et X garde bien sa valeur initiale de $9000 ? C'est à dire que X ne prend pas la valeur $9200 ici ? ($200=512)

J'ai des problèmes avec mon algorithme sur l'affichage en cascade, ça fait des trucs vraiment bizarre! Autant pour l'affichage de grille otut est ok, autant là...

Voici le début du code pour la partie cascade
Code:
 ORG $8500
 SETDP $85
cascad *
 clr NBPILE ';6,2
 ldy XPOS 'Position X et Y; 6,3
 sty XTMP3 'Sauve X et Y;5,2
 ldd IDTAB 'Id tableau; 6,3
 ldx #GRILLC ';6,3
 leax D,X 'idtab dans RAM ';5,3
 stx IDADR3 ';5,2
 ldu #PILE 'pile fnt recursive; 6,3
fnt300 *
 lda 512,X 'a=idstatut;5,3
 lbeq finfn3 'statut=0 ?;3,2
* beq fnt301 'statut=0 ?;3,2
 clr 512,X '0=>statut;7,3
 lda ,X 'lit valeur tab(id);5,3
 jsr VUCASE 'affiche case;8,3
 jmp finfn3


D contient l'id du tableau de la grille, quo'n ajoute à X (par leax) afin que X pointe au bon élément de tableau (situé à X+D, X étant initialement = $9000). Le décalage de +512 est un autre tableau où se trouve les statuts des cased de la grille (statut = 0, 1 ou 2, 2 étant le statut "caché", 1 le statut "dcrapeau posé" et 0 "découvert")

VUCASE ne fait qu'afficher la case avec les mêmes sous programme que pour l'affichage de la grille complète. Mais c'est là que ça déconne. Je ne sais pas si, pour l'assembleur V2.0 ou v3.0, les scalaires sont prix en décuimal ou en hexa par défaut, j'ai l'impression que c'est de l'hexa... Ca semble foutre en l'air les variables située en $9500 (dont la variable NBRESTANT)


Dernière édition par Neotenien le 03 Juin 2022, 13:10, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 03 Juin 2022, 13:09 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Oui X n'est pas modifié car l'instruction est un CLR. Cela aurait été LEAX que oui X aurait pris la valeur de l'adresse calculée (Effective Address), soit X+512. Mais ICI c'est un CLR, donc l'adresse calculée (X+512) est jetée après l'opération.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 00:05 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Citation:
J'ai plusieurs questions parce que ça fait une semaine que je ne trouve pas d'où vient le problème avec mon algorithme assembleur pour l'affichage en cascade du jeu. L'affichage de la première case cliquée est ok mais c'est la suite qui déconne.

J'ai initialisé U a #$9900. Dans cette partie :
Code:
Code:
 cmpa #48 ';2,2
 bne fnt301 'case<>0 ?;3,2
 ldb #8 ';2,2
 pshu b,x,y 'stade, tab(i),X,Y;'10,7
fnt301 * 'ici on depile
 cmpu #PILE
 lbeq finfn3 'PILE = 0 ?;4,3
 cmpu #$9700
 lbls finfn3
 pulu b,x,y 'pile precedente;10,7
Dans cette partie là, lorsque je fais un pshs, peu importe l'ordre des paramètres de b, x, y l'assembleur les empile/dépile toujours dans le même ordre on est d'accord ? Et on est bien d'accord que quand on fait un pshs, ça met en ram les valeurs des registre et en diminuant la valeur de U ? Et que ça réaugmente U par la suite en dépilant (réattribuant les valeur de registre à partir de la RAM)
Pourquoi parles-tu de U ? :???:

PSHS/PULS, utilise la pile S, pas la pile U. Pour cette dernière c'est PSHU/PULU.

Tes bugs peuvent venir de cette confusion.

Plus généralement, à part de rares cas spéciaux (ce qui n'est pas le cas ici), tu n'a pas besoin d'une pile séparée U. Il te faut utiliser exclusivement la pile S pour sauver les valeurs dans la pile. Donne ton algo de découverte en cascade sous la forme d'un pseudo code (en pascal même si tu veux), et on essayera ensemble d'en faire une version ASM qui marche.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 12:56 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
Citation:
J'ai plusieurs questions parce que ça fait une semaine que je ne trouve pas d'où vient le problème avec mon algorithme assembleur pour l'affichage en cascade du jeu. L'affichage de la première case cliquée est ok mais c'est la suite qui déconne.

J'ai initialisé U a #$9900. Dans cette partie :
Code:
Code:
 cmpa #48 ';2,2
 bne fnt301 'case<>0 ?;3,2
 ldb #8 ';2,2
 pshu b,x,y 'stade, tab(i),X,Y;'10,7
fnt301 * 'ici on depile
 cmpu #PILE
 lbeq finfn3 'PILE = 0 ?;4,3
 cmpu #$9700
 lbls finfn3
 pulu b,x,y 'pile precedente;10,7
Dans cette partie là, lorsque je fais un pshs, peu importe l'ordre des paramètres de b, x, y l'assembleur les empile/dépile toujours dans le même ordre on est d'accord ? Et on est bien d'accord que quand on fait un pshs, ça met en ram les valeurs des registre et en diminuant la valeur de U ? Et que ça réaugmente U par la suite en dépilant (réattribuant les valeur de registre à partir de la RAM)
Pourquoi parles-tu de U ? :???:

PSHS/PULS, utilise la pile S, pas la pile U. Pour cette dernière c'est PSHU/PULU.

Tes bugs peuvent venir de cette confusion.

Plus généralement, à part de rares cas spéciaux (ce qui n'est pas le cas ici), tu n'a pas besoin d'une pile séparée U. Il te faut utiliser exclusivement la pile S pour sauver les valeurs dans la pile. Donne ton algo de découverte en cascade sous la forme d'un pseudo code (en pascal même si tu veux), et on essayera ensemble d'en faire une version ASM qui marche.



Si je parle de U parce que je l'utilise ici, c'est pourtant clairement dans le code.

Et SI c'est un cas spécifique puisque justement ça utilise les fonctions récursives.

U est pour pile utilisateur et s pour pile système, donc ici c'est nécessaire pour l'utiilsateur (fonction récursive avec une limite d'ua moins 200 éléments récursifs) donc SI on en a besoin c'est le coeur même de la fonction! Et c'est ce qui déconne apparemment. Parce que j'ai une erreur récurrente dans le résultat. La pile S sert, pour mopi, à sauver les valeurs des registre dans des fonctions.

Je cite le passage du livre "le microprocesseur 6809" de Claude Dardanne aux editions Eyrolles
"Le pointeur de pile U (utilisateur) est utilisé uniquement par le programmeur pour réaliser des passages d'argument de ou vers des sous-programme"

Il me semble que c'ets clair non ? Ici on a une fonction récursive et U sert exactement à cela.

Je vais me débrouiller, pas besoin de passer par le pascalm, mon algirithme est quasi terminé. Je me suis basé du basic pour le faire en me servant de la pile U.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 13:25 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Citation:
Si je parle de U parce que je l'utilise ici, c'est pourtant clairement dans le code.
C'est pas clair dans le code (désolé), et surtout dans le texte du parles de S à la place de U (regarde la partie soulignée).
Citation:
Et SI c'est un cas spécifique puisque justement ça utilise les fonctions récursives.
Ca n'est pas un cas spécifique. C'est juste l'usage général d'une pile (unique). Les doubles piles ce sont pour les langages comme le FORTH qui ont une pile pour les données et une pile pour le contrôle. Tu ne fais pas du Forth, tu n'as donc pas besoin d'avoir une double pile. Cela complexifie inutilement le code, et introduit des trucs subtiles si on a pas l'habitude.
Citation:
Je cite le passage du livre "le microprocesseur 6809" de Claude Dardanne aux editions Eyrolles
"Le pointeur de pile U (utilisateur) est utilisé uniquement par le programmeur pour réaliser des passages d'argument de ou vers des sous-programme"
Il me semble que c'ets clair non ?
Ce dont il parle c'est le concept de frame-pointeur (cf l'option de compilation -fomit-frame-pointer de gcc) et ca n'a rien à voir avec l'usage d'une double pile comme tu le fais.

En simplifiant c'est le fait que dans le prologue d'une fonction (le truc exécuté en entrant), on capture la valeur de S dans U, et on réserve quelques variables locales dans la pile
Code:
PSHS U,<REGS> ; on peut empiler les autres registres qu'on souhaite préserver.
LEAU ,S
LEAS -taille,U
Les paramètres et variables locales de la fonction sont accédées avec des offset par rapport à U, offset constant qui ne varie pas en fonction de S qui peu bouger pour sauvegarder temporairement des valeurs. Les paramètres de la fonction sont liées aux offsets>0, les variables locales aux offsets<0 (je simplifie volontairement).

En sortie (épilogue de la fonction) on restaure le pointeur de pile depuis le frame pointeurs avec un simple
Code:
LEAS ,U
PULS PC,U,<REGS>
depuis partout même si le pointeur de pile n'est pas a revenu à sa valeur d'entrée (à cause de l'empilement de valeurs intermédiaires).

On retrouve ce genre de prologue/épilogues en Pascal, C, Fortran, etc. C'est de cela dont il parle, et pas d'une double pile comme en Forth.

Tu ne voudrais pas écrire ton algo en pseudo-code (avec des fonctions qui ont des paramètres et variables locales hein, pas des bonnes grosses globales et pile gérée par un tableau comme en basic qui n'a pas le concept de variables locales) avant de l'écrire en ASM ? Je suis persuadé que tu n'as pas besoin d'une double pile. Ce sera manifeste à partir du pseudo-code.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 13:55 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
J'ai trouvé d'où venait l'erreur!!

Apparemment l'instruction "jmp" de l'assembleur ne fait pas ce que je pensais...

Code:
fnt340 * 'fin de ttmt if
 stx IDADRN ';5,2
 decb
 ldx IDADRC
 pshu b,x,y 'reste sur le meme id;10,7
 jmp fnt300 ';3,2 <------ je pensais que ça retournait à l'adresse d'étiquette fnt300
fnt341 *
 jmp fnt301 ';3,2 <------ je pensais que ça retournait à l'adresse d'étiquette  fnt301


Mais en vérité ça ne va pas à cesdites adresses sachant que ces adresses sont sitiée à plus de 128 octets.
J'ai remplacé par lbra et là ça fonctionne quasiment bien. Reste quelques petits détails à régler, mais la majoirité de la fonction en cascade fonctionne (affichage quasi instantané)

Je précise que j'ai utilisé SETDP en haut de la fonction...


Addentum : ca y est tout fonctionne à merveille!! La vitesse en cascade est affolante! Même avec la plus grosse grille (25x20 100 bombes) ça se fait instantanément! J'ai enconre quelques détails à voir pour la partie Basic, mais je vais mettre une version Beta "sans chrono" dans moins de 3 h.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 15:56 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
JMP va bien à l'étiquette. Il n'y a pas de notion de relatif içi. JMP est un adressage absolu.

Le fait que LBRA fonctionne me fait penser à un truc: Tu indiques que tu as fait SETDP, mais si tu n'as pas initialisé DP avec la bonne valeur dans le code (SETDP ne fait pas cela), le JMP va partir sur la page courante, très probablement une autre page que celle que tu souhaites. LBRA n'a pas de mode direct-page et donc tu n'observes pas le soucis avec lui, mais c'est un effet de bord inattendu. En vrai tu aimerais utiliser l'adressage direct-page avec les JMP je suppose (sinon pourquoi est-ce que tu t'embêterais avec SETDP).

Bref SETDP c'est bien, mais à condition de bien positionner DP programmatiquement aussi (ex LDA+TFR A,DP). SETDP n'est une directive d'assemblage, pas un code-opération CPU. Il faut les deux pour que ca marche.

Je suis content que ca va super vite. L'assembleur ca a du bien quand on veut être rapide.

Question: pourquoi est-ce que tu mets systématiquement un commentaire vide après les labels ? exemple
Code:
fnt341 *
(* = marqueur de commentaire dans l'assembleur thomson après un label) Tu ne voulais pas plutôt écrire
Code:
fnt341 SET *
ou
Code:
fnt341 EQU *
plutôt ?(ici * représente l'adresse courante quand il suit une directive qui attends une valeur)

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 16:43 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
En pj vous trouverez le zip d'une disquette TI8 pour jouer aux 16 niveuax de Demineur Xtreme en version assembleur.

Le jeu est jouable, mais je vous conseille de mettre DC Moto en plein écran pour les grandes grilles (plus facile à la souris).

Pour jouer:
1/ choisissez votre niveau de départ (0 à 9 ou a à f, insensible à la casse)
2/ clic gauche pour révéler les cases (avec enchainement en cascade si case=0), clic droit = appliquer un drapeau ou enlever le drapeau : ajoute ou enlève le nombre de bombes "découvert" en haut.
3/ Une fois qu'il reste 0 cases à découvrir OU si vous avez cliqué sur une bombe, le jeu se termine avec un message "gagné" ou "perdu" : pour rejouer appuyez sur n'importe quelle touche sauf "q" (minuscule ou majuscule) qui quitte le jeu.

Ce qu'il manque dans le jeu :
- chronomètre (à vroi pour la stratégie : est ce que je le désactive pendant toute la phase de découverte de case ?)
- bruitage (comme ceux présent dans la version basic mais en mieux)
- les options de jeu complète : mode "challenge", mode "aventure" (un mélange entre Mc Gyver, l'Ukraine et la protection de la biodiversité, mais je dois faire des conversions d'images pour cela grâce grâce aux modules de Samuel pour grafx... pas mal de choses à ahjouter de ce côté là...
- un bouton "Pause" qui metra la grille dans une image (avec les fonction Basic)
- une option "aide" grille initiale ?

Remarque:
- le jeu de niveau "Bombwatch" le même que celui de 'lAtari ST, donne une vitesse quasi identique à celle de l'Atari ST!! comme quoi le Thomson est loin d'être une limace!!
- j'ai l'impression que la fonction d'aléoitarisation de Samuel donne des bombes qui sont + sitiée vers le bas et la droite (est ce une impression ?) alors que le RND des Thomson ne me donnait pas cette impresison là... Ceoendant ça vient peut-être de la manière dont je l'ai utilisé...
- il y a peut-être de l'optimisation à faire (en terme de place) pour la fonction d'affichage en cascade assembleur...

Code:
*************************************
* Fnt Randomise 2. Applique une
* limite superieure (DIMXY)
* au RND.
*************************************
 ORG $8050
RND1 *
 JSR RND0 '
 LDD SEED '
 ANDA #31 '=11111 '
 ANDB #31 '=11111 '
RND10 *
 CMPB YMAX '
 BLS RND11 '
 LSRB '
 BRA RND10 '
RND11 *
 CMPA XMAX '
 BLS RND1A '
 LSRA '
 BRA RND11 '
RND1A RTS 'B = NB ALEATOIRE '


J'ai créé une autre alternative à ce code qui est

Code:
*************************************
* Fnt Randomise 2. Applique une
* limite superieure (DIMXY)
* au RND.
*************************************
 ORG $8050
RND1 *
 JSR RND0
 LDD #$3131
 STD FILT01
 LDD SEED
RND10 *
 ANDB FILT01+1
 CMPB YMAX
 BLS RND11
 LSR FILT01+1
 BRA RND10
RND11 *
 CMPA FILT01
 BLS RND1A
 LSR FILT01
 BRA RND11
RND1A RTS 'B = NB ALEATOIRE


...je ne sais pas laquelle est la meilleure pour la bonne randomisation

Enfin je termine par une vidéo en temps réelle du dernier test du jeu :
phpBB [video]


Attention : addentum du 07/06/2022 à 23:12 : j'ai modifié l'algorithme d'aléatoirisation qui est meilleur maintenant, un grand merci à Samuel de m'avoir aidé sur ce point


Fichiers joints:
MineSweeper_to8-FD_02.zip [5.05 Kio]
Téléchargé 117 fois


Dernière édition par Neotenien le 07 Juin 2022, 22:17, édité 2 fois.
Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 16:52 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
JMP va bien à l'étiquette. Il n'y a pas de notion de relatif içi. JMP est un adressage absolu.

Le fait que LBRA fonctionne me fait penser à un truc: Tu indiques que tu as fait SETDP, mais si tu n'as pas initialisé DP avec la bonne valeur dans le code (SETDP ne fait pas cela), le JMP va partir sur la page courante, très probablement une autre page que celle que tu souhaites. LBRA n'a pas de mode direct-page et donc tu n'observes pas le soucis avec lui, mais c'est un effet de bord inattendu. En vrai tu aimerais utiliser l'adressage direct-page avec les JMP je suppose (sinon pourquoi est-ce que tu t'embêterais avec SETDP).


Oui. j'aurais du mettre des "marqueurs" tel > et <.
Initialement j'ai cru que la fonction fiasais moins de 256 octet et j'ai compté là dessus... mais au final... Il faut que je la revoie et calcule la totaliyté poutr gagner encore en cycles d'horloges.

Samuel Devulder a écrit:
Bref SETDP c'est bien, mais à condition de bien positionner DP programmatiquement aussi (ex LDA+TFR A,DP). SETDP n'est une directive d'assemblage, pas un code-opération CPU. Il faut les deux pour que ca marche.


En fait j'hésite entre ça et utiliser les "<" et ">"... mais SETDP a l'avantage de concertir ce qui peut être mis en adresssage direct facilement LOL.

Samuel Devulder a écrit:
Je suis content que ca va super vite. L'assembleur ca a du bien quand on veut être rapide.

eh bien tu peux le tester (du moins les 16 niveau de jeu, le jeu complet aura plus d'options et un mode aventure) en regardant ce que j'ai posté

Samuel Devulder a écrit:
Question: pourquoi est-ce que tu mets systématiquement un commentaire vide après les labels ? exemple
Code:
fnt341 *
(* = marqueur de commentaire dans l'assembleur thomson après un label) Tu ne voulais pas plutôt écrire
Code:
fnt341 SET *
ou
Code:
fnt341 EQU *
plutôt ?(ici * représente l'adresse courante quand il suit une directive qui attends une valeur)


Aucune idée, je pensais que c'était comme ça qu'on faisait et qu'on est obligé de mettre un * si on veut passer à la ligne pour le code plus lisible ?


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 20:08 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Ca va vite, ca serait cool d'avoir un son quand on perds?

Je pense que tu as déjà songé à habiller un peu plus le jeu en mettant un fond d'écran aléatoire pour chaque grille ? (tu peux générer des fichiers MAP assez jolis avec les outils de conversion, les mettres sur la diskette et choisir en basic le fichier MAP à charger aléatoirement.)

Pour le random plusieurs remarques:
  • Il vaudrait mieux faire appel à deux RND0 pour récupérer deux nombres moins corrélés. Tiens au fait pourquoi utilises tu la SEED au lieu de la valeur retournée dans D ?
  • Je ne pige pas le coup de la division par 2 quand ca dépasse X/YMAX. Pour moi ca introduit un biais.

En effet si X/YMAX valait disons 15, au départ tu as un nombre entre 0 et 31. S'il est entre 16 et 31, ca dépasse X/YMAX et il sera divisé par 2. Le nombre sera alors entre 8 et 15. C'est plus petit que 15, donc ca sort ok. Mais il n'y a aucune chance dans ce cas là d'avoir un nombre entre 0 et 7. Donc les nombres entre 8 et 15 seront deux fois plus nombreux (ils peuvent apparaitre avant et après la division par deux) que ceux entre 0 et 7 (qui doivent apparaitre exclusivement avant). Tu vois le soucis ?

Ce qu'il faut faire c'est juste rejeter l'ensemble du tirage si ca dépasse X/YMAX sans chercher plus loin. Bref tu tires au pif les deux nombres jusqu'à ce que ca rentre dans les X/YMAX et il n'y aura plus de biais.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 20:58 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
Ca va vite, ca serait cool d'avoir un son quand on perds?

Je pense que tu as déjà songé à habiller un peu plus le jeu en mettant un fond d'écran aléatoire pour chaque grille ? (tu peux générer des fichiers MAP assez jolis avec les outils de conversion, les mettres sur la diskette et choisir en basic le fichier MAP à charger aléatoirement.)

Ca c'est une syper idée!! En fait c'était prévu pour la partie "aventure" avec des paysage de fond de chacune des villes Ukrainiennes du jeu (enfin ça dépendra de la qualité)... Ejn fait la partie aventure intégrera 2 choses qui me sont chère et une qui est d'actualité en ce moment (tu l'as deviné, l'Ukraine)

Pour le son, ça existe déjà pour la version Basic (très lente), où ya un son quand on gagne, un quand on perd, et du son pour la cascade. Ca va être du son genre comme pour "Bombwatch"... Mais ça va se faire par le CNA et ça prendra un peu de temps à se faire...

Par contre, le "3" jaune est assez illisible sur fon de sablequ'en penses-tu ? Peut-être que je devriat changer la palette du 3 jaune ?

Samuel Devulder a écrit:
Pour le random plusieurs remarques:
  • Il vaudrait mieux faire appel à deux RND0 pour récupérer deux nombres moins corrélés. Tiens au fait pourquoi utilises tu la SEED au lieu de la valeur retournée dans D ?
  • Je ne pige pas le coup de la division par 2 quand ca dépasse X/YMAX. Pour moi ca introduit un biais.

En effet si X/YMAX valait disons 15, au départ tu as un nombre entre 0 et 31. S'il est entre 16 et 31, ca dépasse X/YMAX et il sera divisé par 2. Le nombre sera alors entre 8 et 15. C'est plus petit que 15, donc ca sort ok. Mais il n'y a aucune chance dans ce cas là d'avoir un nombre entre 0 et 7. Donc les nombres entre 8 et 15 seront deux fois plus nombreux (ils peuvent apparaitre avant et après la division par deux) que ceux entre 0 et 7 (qui doivent apparaitre exclusivement avant). Tu vois le soucis ?

Ce qu'il faut faire c'est juste rejeter l'ensemble du tirage si ca dépasse X/YMAX sans chercher plus loin. Bref tu tires au pif les deux nombres jusqu'à ce que ca rentre dans les X/YMAX et il n'y aura plus de biais.


Ben j'ai voulu essayer de faire pareil qu'avec la méthode BASIC qui, il est vrai, utilise un flottant, c'est à dire que le BASIC multiplé par un entier (ici ça serait XMAX/YMAX) mais là ce sont des entiers et c'est vrai qu'à l'origne j'avais pesé à utilisé la routine de l'extramoniteur quand tu m'en as dissuadé...

D'autre part, je voulais que la routine soit la moins lente possible et donc faire appel à moins de fois possible au RND... Là c'est vrai que la grille se créer très rapidement (même avec 100 bombes) donc ça peut être un bon compromis. En fait j'ai lu dans la page wikipedia du déineur que l'aléatoirisation se fiasiat sur les coordonnées X et Y de la grille (alors qu'au départ, j'étais partie sur le tirage de l'ID dans le tableau, mais c'est plus compliqué par la suite pour en ressortir les coordonnées X et Y, ça demande des division entière et modulo)

Sinon pour ta répartition, tu as raison ma méthode favorise les fort tirages... ou alors en faisant un MUL de B avec XMAX ou YMAX et récupérant A ? Je vais essayer ça tiens... (pour X puis Y)


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 21:22 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
J'ai encore un prohblmème d'assembleur... et je ne sais pas d'où ça vient! Le code de randomize que j'vaias fait fonctionnait et j'ai voulu le changer en ça

Code:
************************
* Fonction Randomise
************************
 ORG $8000
RND0 *
SEED set *+1
 ldd #1 ; 3. VARRND En $8001
* xs ^= xs << 7
 lsra ; 2
 rorb ; 2
 eorb <SEED,pcr   ; 5
 stb <TMP,pcr    ; 5
* xs ^= xs >> 9
* tricky part: put carry back in hi(xs>>9) so that it is
* same as if it was introduced in lo(xs) above.
 rorb              ; 2
 eorb <SEED+1,pcr ; 5
* xs ^= xs << 8;
 tfr b,a         ; 6
TMP set   *+1
 eora #0          ; 2
 std <SEED,pcr   ; 6
 RTS ;1
*************************************
* Fnt Randomise 2. Applique une
* limite superieure (DIMXY)
* au RND.
*************************************
 ORG $8080
 SETDP $80
RND1 *
 JSR RND0
 LDD SEED
 LDA YMAX
 MUL
 STA RNDRES+1
 JSR RND0
 LDD SEED
 LDA XMAX
 MUL
 STA RNDRES
 LDD RNDRES
 RTS
RNDRES FDB 0


Et ça me retourne une "division par zéro" (rien d'autre n'a changé dans le code à part ce RND1)
Là j'utilise SEED en conservant B et en mettant XMAX ou YMAX en A pour faire un mul et je ne garde que A pour la coordonnée (ça revient au même que la multiplication en BASIC pour un RND flottant), je peux fauire ça puisque XMAX ou YMAX est toujours < 255. RNDRES retourne le résultat X dans l'octet fort et Y dans l'octet faible.

J'ai vraiment du mal avec l'assembleur vraiment! La moindre petite chose et ça ne fonctionne pas bien.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 21:59 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
C'est le basic qui te dis division par zero?

Tu dois probablement écrire dans une zone réservée du basic qui panique par la suite.

Tu remets bien DP à ca valeur d'entrée à la sortie des routines où tu l'a changé ? Le basic demande qu'on ne change pas son DP ni son SP au retour d'un appel en langage machine.

Sinon le coup de multiplier B par XMAX et diviser par 256 pour avoir un nombre entre 0 et XMAX-1 est une bonne idée. Par contre RND1 peut être optimisé: on a pas besoin de charger SEED car RND0 le retourne déjà. Que penses-tu de ceci?
Code:
 ORG $8080
RND1 *
 JSR RND0
 LDA YMAX
 MUL
 STB ,-S
 JSR RND0
 LDA XMAX
 MUL
 PULS B,PC
Je n'écris plus dans RANDRES car le résultat est déjà dans D à la sortie (on a qu'à faire STD RANDRES depuis l'appellant si on a besoin).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Juin 2022, 22:10 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 366
Samuel Devulder a écrit:
C'est le basic qui te dis division par zero?

Tu dois probablement écrire dans une zone réservée du basic qui panique par la suite.

Tu remets bien DP à ca valeur d'entrée à la sortie des routines où tu l'a changé ? Le basic demande qu'on ne change pas son DP ni son SP au retour d'un appel en langage machine.


Oui en effet ça semble venir de là!! Zut je croyais que il suffisait de mettre un SETDP au départ et que tout se réglait.

Bon ben merci bcp Samuel!

Je viens de tester avec cette nouvelle méthode d'aléatoirisation et ça a l'air de mieux fonctionner! Par conséquent je vais changer le fichier à télécharger dans le message précédent où on peut télécharger.

Je creois que le jeux est bien tel qu'il est là.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 108 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6 ... 8  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 25 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com