Logicielsmoto.com

Nous sommes le 06 Juil 2022, 08:05

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 86 messages ]  Aller à la page 1, 2, 3, 4, 5, 6  Suivante
Auteur Message
MessagePosté: 13 Mai 2022, 12:40 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 309
Bonjour

Juste un jeu pour voir les possibilités en Basic (une version assembleur viendra) du jeu de démineur, avec 10 niveaux (de 10x10 10 bombes à 25x20 100 bombes, si vous y arrivez à celui là, vous êtes très fort!). La source BASIC en txt (à coipier dans l'émulateur) est en pièce jointe : fonctionne pour les TO8 et MO6. Pourrait fonctionner pour les MO5 et TO7 si ceux ci avaient une souris, mais ce n'est pas le cas.

2 parties intéressantes au niveau algorothmiques:
1/ La constitution de la grille
2/ la découverte de cases en cascade sur les cases "0" : demande d'adapter les fonctionx récursives d'autres langages évolués (dont le Pascal) en Basic à coups de piles.

phpBB [video]


La pièce jointe est la version quasi définitive en Basic, il reste quelques truc mineurs à ajouter (affichage du nombre de drapeau/bombes potentielles ?). Il y aura aussi à ajouter la demande de pseudo au départ du jeu pour sauvegarder les scores sur disquettes éventuellement. Et peut-être aussi un menu pour effacer un tableau des scores. Des bruitages aussi à ajouter ?

Quelques infos:
1/ Au menu de départ, tapez le chiffre pour choisir le niveau
2/ Clic gauche de souris pour découvrir une case, clic doite pour "marquer" ou "démarquer" une case grise comme bombe potentielle (n'influe pas sur le décompte des cases restantes)
3/ Le chrono ne fonctionne que pendant une partie. Il est arrêté à chaque fois que l'on doit écrire des caractères (pour éviter l'interférence des couleurs et localisation curseur avec l'interruption chono)
4/ En fin de partie, tapez "n" ou "N" pour une nouvelle partie, tout autre touche pour arrêter.

Tout avis ou idée pour le jeu est la bienvenue. La future version TO8 (assembleur pourrait se voir attribuer une musique de fond comme Samuel m'a appris à le faire. En option, il pourra aussi être ajouté la touche "Pause" pour mettre en pause (comme la version "Kmines" Linux).

Quelqu'un sur la vidéo youtube m'a demandé si ça fonctionnerait su MO5, ben malheureuement non, vu que c'est destiné à être joué avec la souris... Pour le reste ça fonctionnerait sinon.


Fichiers joints:
Commentaire: Source basic (128 512) pour le démineur
Demineur.zip [2.2 Kio]
Téléchargé 20 fois


Dernière édition par Neotenien le 14 Mai 2022, 20:00, édité 1 fois.
Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Mai 2022, 17:44 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 448
pour enlever le curseur fait un

LOCATE ,,0

je crois

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Mai 2022, 18:35 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 309
adnz a écrit:
pour enlever le curseur fait un

LOCATE ,,0

je crois


C'est exactement ça... J'avais cherché du côté de console mais yavé rien de probant

Ca manque un site internet sur les Thomson avec le basic complet et bien expliqué, bien agencé, et l'assembleur 6809 et 6309, le moniter, l'extramoniteur... Et parfois les bouquins sont incomplet.

Je suis en train de faire la version assembleur de la création de grille... et les manuels que j'ai sur Thomson ne sont pas toujours pédagogique à ce propos. Là par exemple, c'est pour tester l'extramniteur avec la fonction RND multiplié par un entier, passer les paramètres à cette fonction (RND) en BASIC n'est pas clairement expliqué... Apparemmentj en Basic 512, on peut initialiser le régistre X ou B en paramètre d'EXEC (appel d'une fonction d'extramoniteur), sinon je ne vois pas bien comment appeler une fonction extramoniteur en BASIC via EXEC (ou usr ?).

Comment passer des valeurs dans des régistre 6809 en Basic avant de faire appel à une fonction extramoniteur ?


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 14 Mai 2022, 17:47 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Dans mon souvenir c'est galère et lent.

Avec un seul argument ca passe encore, je crois que B et X donnent a peu près toutes les infos, mais avec plus d'un argument, il faut appeler des routines du basic pour connaitre les suivants, puis leur type, puis appeler les routines maths de l'extramon pour convertir en entier (d'où la lenteur car le basic travaille par défaut avec des flottants alors que dans 99% on veut de l'entier) ou générer une erreur si on récupère un truc pas prévu genre tableau ou string.

Avec DEFUSR c'est juste un peu plus simple, mais dans l'ensemble ca reste pénible à mon goût.

Pour ma part je préfère faire des poke pour et ainsi passer les paramètres à l'assembleur sachant qu'avec VARPTR(variable) on récupère facilement l'adresse d'une variable. On peut ainsi poker l'adresse de la variable aux endroits où le programme ASM en a besoin (truc pratique: passer un MKI$(entier16bits) en 2e argument de poke écrit 2 octets d'un coup) et par la suite le programme et le basic se partagent naturellement et sans surcoût la variable. Pour moi c'est le mieux.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 14 Mai 2022, 19:52 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 309
Samuel Devulder a écrit:
Dans mon souvenir c'est galère et lent.

Avec un seul argument ca passe encore, je crois que B et X donnent a peu près toutes les infos, mais avec plus d'un argument, il faut appeler des routines du basic pour connaitre les suivants, puis leur type, puis appeler les routines maths de l'extramon pour convertir en entier (d'où la lenteur car le basic travaille par défaut avec des flottants alors que dans 99% on veut de l'entier) ou générer une erreur si on récupère un truc pas prévu genre tableau ou string.

Avec DEFUSR c'est juste un peu plus simple, mais dans l'ensemble ca reste pénible à mon goût.

Pour ma part je préfère faire des poke pour et ainsi passer les paramètres à l'assembleur sachant qu'avec VARPTR(variable) on récupère facilement l'adresse d'une variable. On peut ainsi poker l'adresse de la variable aux endroits où le programme ASM en a besoin (truc pratique: passer un MKI$(entier16bits) en 2e argument de poke écrit 2 octets d'un coup) et par la suite le programme et le basic se partagent naturellement et sans surcoût la variable. Pour moi c'est le mieux.


Là c'est juste pour tester certaines fonctions de l'extramoniteur (notamment RND) avant de le porter en assembleur pour ces routines qui prennent énorméemnt de temps en Basic (La création de grille et les tests en cascade des grilles vides). Ce sont les 2 seules parties que je compte créer en assembleur

Il existe un Démineur, appelé "Bomb squad" sur TRS Coco 3 (2016) et comme c'est une machine à peu près,équivalente au TO8 (à part que la RAM vidéo est supérieure ainsi que la capacité en RAM), j'ai voulu en faire une version Thomson.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 14 Mai 2022, 23:33 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Le random de l'extramon est probablement le URAND de l'époque. Il est très mauvais statistiquement. Il y a sur le forum des routine ASM de génération de nombres aléatoires qui sont à la fois plus rapides et meilleures statistiquement.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 14 Mai 2022, 23:35 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Le random de l'extramon est probablement le RANDU de l'époque. Il est très mauvais statistiquement. Il y a sur les forums des routines ASM 6809 de génération de nombres aléatoires qui sont à la fois plus rapides et meilleures statistiquement (cf XorShift ou Multiply-with-carry).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 16 Mai 2022, 22:03 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 309
Samuel Devulder a écrit:
Le random de l'extramon est probablement le RANDU de l'époque. Il est très mauvais statistiquement. Il y a sur les forums des routines ASM 6809 de génération de nombres aléatoires qui sont à la fois plus rapides et meilleures statistiquement (cf XorShift ou Multiply-with-carry).


Ok Samuel, as tu essayé le démineur ? Est ce que ce "mauvais" RND se voit dans le jeu (Le niveau 10x10 avec 10 bombes) ? Tu me conseillerais plutôt cet algo alors ?

Mais est ce que le "RANDU que tu cites est le même suivant les différentes version de Thomson ? Vu que,le Basic 512 a déjà des algo amélioré (comme le dessin de cercle) comparé aux premiers Basic, il est possible que le random ait évolué ? C'est juste une question.


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

Inscription: 21 Fév 2020, 11:38
Messages: 309
Samuel Devulder a écrit:
Le random de l'extramon est probablement le RANDU de l'époque. Il est très mauvais statistiquement. Il y a sur les forums des routines ASM 6809 de génération de nombres aléatoires qui sont à la fois plus rapides et meilleures statistiquement (cf XorShift ou Multiply-with-carry).


Et en plus c'est un algo qui fonctionne sur des entiers et pas sur des réels!! Mais pour que la valeur max soit le nombre de case de la grille, disons 399, je suppose qu'en faisant un AND 512 et en enlevant 399 si ça dépasse, ça devrait le faire ?


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 16 Mai 2022, 22:41 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Tu peux faire un modulo 400, mais ca nécessite une division.

Sinon oui un truc genre:
Code:
repeat x = (random() bitand 511) until x<400
devrait le faire.

Combien de tours faut-il en moyenne avant de sortir ? Bah 400 fois sur 512 on fait 1 tour, et 112/512 on fait un tour en plus durant lequel 400 fois sur 512 on sortira au 2e coup et 112/512 on fera un 3e tour, etc.

Bref l'espérance du nombre de tour est est
Code:
(400/512)*1 + (400/512)*2*(112/512) + (400/512)*3*(112/512)^2 + (400/512)*4*(112/512)^3 + ...
= somme (400/512)*n*(112/512)^(n-1) pour n=1..infini
ce qui fait exactement 32/25=1.28 tours en moyenne avant de sortir. Bref, on ne restera pas longtemps coincé dans la boucle. Ca vaut carrément le coup.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2022, 12:38 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 309
Samuel Devulder a écrit:
Tu peux faire un modulo 400, mais ca nécessite une division.

Sinon oui un truc genre:
Code:
repeat x = (random() bitand 511) until x<400
devrait le faire.

Combien de tours faut-il en moyenne avant de sortir ? Bah 400 fois sur 512 on fait 1 tour, et 112/512 on fait un tour en plus durant lequel 400 fois sur 512 on sortira au 2e coup et 112/512 on fera un 3e tour, etc.

Bref l'espérance du nombre de tour est est
Code:
(400/512)*1 + (400/512)*2*(112/512) + (400/512)*3*(112/512)^2 + (400/512)*4*(112/512)^3 + ...
= somme (400/512)*n*(112/512)^(n-1) pour n=1..infini
ce qui fait exactement 32/25=1.28 tours en moyenne avant de sortir. Bref, on ne restera pas longtemps coincé dans la boucle. Ca vaut carrément le coup.


Oui mais ça dépend de la taille de la grille. Le minimum étant de 100

Après je me demande si l'algorithme de rdn que tu as porposé sera aussi bien réparti en terme d'aléatoirisation sur les 9 derniers bits sur les 16...

En tos ca au global, à vi de nez, je pense que même pour une grille de 25x20 avec 100 bombes, ça mettrait moins d'1" pour la calculer. Je suis en train de le faire et rien qu'initialiser la grille (mise à d48 pour les caractères et à statut 2) pour 500 cases, ça mettrait 6500 cycles (500x(6+4+3)) seulement (c'est la partie INITA0 du code ci dessous), soit moins d'1/100 s
Code:
    LDD GRSIZE 'TAILLE DE TABLEAU -1
    ASLB  'XCATION PAR 2...
    ROLA  '...DE D
    ADDD #$9000 'AJOUT D'ADR INIT DE GRILLE
    STD GRSIZ1
    LDX #$GRSIZ1 'Grille EN $9XXX DE WORD
    LDU #$3202 'A=d48 (car), B=2 (statut)
INITA0 STU ,X-- 'stock en X, X=X-2
    CMPX #$9000
    BHS INITA0 'BRANCHEMENT SI >=


Au fait merci de m'avoir corrigé! Oui c'est bien un AND 511 et pas 512.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2022, 12:44 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 309
Neotenien a écrit:
Samuel Devulder a écrit:
Tu peux faire un modulo 400, mais ca nécessite une division.

Sinon oui un truc genre:
Code:
repeat x = (random() bitand 511) until x<400
devrait le faire.



En fait, je comptais plutôt faire un AND 511 puis un asr (décalage à droite) du résultat jusqu'à ce que ce résultat soit <=399, 224, 99... En fait "taillegrille" donne l'indice maximal de la grille (taille-1)... Ce qui réduit encore le nombre de cycles, mais à supposer que statistiquement ça soit bien réparti par cette méthode.

Neotenien a écrit:
Samuel Devulder a écrit:
Combien de tours faut-il en moyenne avant de sortir ? Bah 400 fois sur 512 on fait 1 tour, et 112/512 on fait un tour en plus durant lequel 400 fois sur 512 on sortira au 2e coup et 112/512 on fera un 3e tour, etc.

Bref l'espérance du nombre de tour est est
Code:
(400/512)*1 + (400/512)*2*(112/512) + (400/512)*3*(112/512)^2 + (400/512)*4*(112/512)^3 + ...
= somme (400/512)*n*(112/512)^(n-1) pour n=1..infini
ce qui fait exactement 32/25=1.28 tours en moyenne avant de sortir. Bref, on ne restera pas longtemps coincé dans la boucle. Ca vaut carrément le coup.


Oui mais ça dépend de la taille de la grille. Le minimum étant de 100

Après je me demande si l'algorithme de rdn que tu as porposé sera aussi bien réparti en terme d'aléatoirisation sur les 9 derniers bits sur les 16...

En tos ca au global, à vi de nez, je pense que même pour une grille de 25x20 avec 100 bombes, ça mettrait moins d'1" pour la calculer. Je suis en train de le faire et rien qu'initialiser la grille (mise à d48 pour les caractères et à statut 2) pour 500 cases, ça mettrait 6500 cycles (500x(6+4+3)) seulement (c'est la partie INITA0 du code ci dessous), soit moins d'1/100 s
Code:
    LDD GRSIZE 'TAILLE DE TABLEAU -1
    ASLB  'XCATION PAR 2...
    ROLA  '...DE D
    ADDD #$9000 'AJOUT D'ADR INIT DE GRILLE
    STD GRSIZ1
    LDX #$GRSIZ1 'Grille EN $9XXX DE WORD
    LDU #$3202 'A=d48 (car), B=2 (statut)
INITA0 STU ,X-- 'stock en X, X=X-2
    CMPX #$9000
    BHS INITA0 'BRANCHEMENT SI >=


Au fait merci de m'avoir corrigé! Oui c'est bien un AND 511 et pas 512.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2022, 13:48 
Hors ligne

Inscription: 21 Fév 2020, 11:38
Messages: 309
Samuel j'ai regardé ton code de générateur pseido aléatoire en 6809...

Je reprend les points parce qu'il y a des choses que je ne comprend pas...
Code:
unsigned xorshift( )
{
    xs ^= xs << 7;
    xs ^= xs >> 9;
    xs ^= xs << 8;
    return xs;
}

Ca c'est le code source C et si je comprend bien,
Xs<-1 (au départ)
on décale Xs de 7 sur la gauche Xs1<-128
puis Xs<- Xs XOR 128, soit 1 XOR 128 = 129
On décale Xs de 9 à droite : 129 décalé de 9 = 0
On applique un XOR entre 129 et ce 0, soit 129
Puis on fait un décalage de 8, soit 256x129

Si on reprend ton code assembleur

Code:
SEED set  *+1
    ldd   #1          ; 3
*
* xs ^= xs << 7
*
    lsra              ; 2
    rorb              ; 2
    eorb  <SEED,pcr   ; 5
    stb   <TMP,pcr    ; 5


Je n'y comprend rien!!
1/ On est sensé faire du décalage à gauche et lsr+ror c'est du décalage à droite (???)
2/ Il me semble ici qu'il n'y a qu'un décalage seulement avant d'appliquer l'EOR ? C'est quoi PCR ? Où sont les 6 autres décalages avant d'appliquer l'EOR ? Est ce le <SEED,PCR qui repositionne au niveau du lsra ?

Ou alors peut être qu'un décalage de 7 à gauche et un Xor est l'équivalent de ce que tu as codé ?

Après, il est vrai que 7 = 8-1 et 9=8+1... Peut être que ça vient de là ?

Finalement j'ai compris le truc, le but est de transférer B vers A quand on fait un décalage de 7 b a gauche puis un décalage à droite et vice versa... Là ça va bien parce qu'il n'y a qu'un écart de 1 comparé à 8 bots, mais s'i y avait un écart de 3 ou 4 décalages, on serait obligé de tous les faire. Alors que le Z80 lui, permet de faire des décalage direct de 4 bits il me semble...


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 18 Mai 2022, 15:06 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1644
Localisation: Brest
Un décalage à droite sur A:B de 1 revient à faire un décalage de 7 à gauche sur la paire A:B en inversant les roles de A et B. Tu ne retrouves pas le compte des décalages car certains sont remplacés par l'échange logique des roles de A et B. C'est super efficace (et sioux) sur le 6809 où chaque décalage coûte.

Sinon PCR, c'est le registre PC en adressage relatif.

_________________
Good morning, that's a nice Tnetennba


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

Inscription: 21 Fév 2020, 11:38
Messages: 309
JE vais utiliser le randomizer de Samuel.

Sion j'ai réussi à caser l'ensemble de la procédure de création de grilles (qui a 3 étapes) en moins de 256 Octets en assembleur -(214 pour être exact).

Maintenant j'attend vos siggestion pour amélioration.

1/ Une statistique "bombes cochées" ça serait pas mal ?
2/ Des suggestions pour les bruitages diverses ? (quand on fait un lcis droit et quand une case se découvre, quand on clic sur une bombe

J'ai vu qu"en 2020-2021, il y a un démineur sorti sur Atari ST mais à un seul niveau. Par contre il est un pêu plus coloré que le mien.

Quelqu'un l'a essayé ? (le code BASIC) peut-être que je devrais mettre la dernière version du code Basic qui semble plus rapide pour l'initialisation de grille.. (28s au lieu de 31 pour la megagrille)


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

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 9 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