[ASM 68000] Cube 3D

Forum Amiga Coding [ASM 68000] Cube 3D

  • Ce sujet contient 40 réponses, 7 participants et a été mis à jour pour la dernière fois par Arnaud.68K, le il y a 4 années et 9 mois.
  • Créateur
    Sujet
  • #103947
    Arnaud.68K
      • Level 3
      • Messages : 69

      Bonjour,

      Pour ceux que ça tente, et si ça peut aider, je viens de faire un code ASM pour faire tourner un cube 3D.

      https://github.com/Amiga68000/Cube3D.Amiga.68000

      Le code a été fait sous ASMTwo.

      En mode débug, le code a besoin du fichier font8 de Yragael pour afficher le nombre de rasters utilisés, mais vous n’êtes pas obligés de le charger, supprimez la ligne include dans ce cas. Si vous l’utilisez pensez à bien spécifier le chemin d’accès.

      N’hésitez pas à me poser des questions et/ou me suggérer des optimisations.

      Je suis en train de réfléchir à animer un rubik’s cube, ce sera une autre paire de manches.

      A bientôt

      Arnaud

       

       

       

       

      A500 + 512k, adepte du SM attention avec un A devant !

    Affichage de 15 réponses de 16 à 30 (sur un total de 40)

    Partager sur vos réseaux sociaux préférés :
    Facebooktwitterredditpinterestlinkedintumblrmail

    • Auteur
      Réponses
    • #104495
      Arnaud.68K
        • Level 3
        • Messages : 69

        Cool, heureux pour cette nouvelle

        Tu as assemblé avec ASMOne finalement ? As-tu eu besoin d’adapter le code ?

        Pour aider sur la 3D, j’ai laissé les formules de rotation en commentaire dans le code.

        Le principe est de faire 3 rotations de plan successives selon les 3 axes de tes points (x0,y0,z0)

        (x1,y1)=rot(axeZ, x0,y0)

        (y2,z1)=rot(axeY,z0,x1)

        (z2,x2)=rot(axeX,z1,x1)

        les points (x2,y2,z2) sont alors les nouvelles coordonnées

        Restent plus qu’à afficher en 2D  selon un plan choisi (x2,z2) par exemple dans ce cas y2 étant la profondeur.

         

        Une particularité, les coordonnées des points sont en coordonnées cylindriques (rho, teta,h) afin de gagner 2 recherches de Cos et Sin pour la première rotation mais je vais modifier mon code pour partir de coordonnées cartésiennes (x,y,z)

         

        Pour la rotation plane regarde https://fr.wikipedia.org/wiki/Rotation_plane et les formules de trigo cos(a+b), sin(a+b)

         

        A500 + 512k, adepte du SM attention avec un A devant !



        #104509
        slack
          • Level 7
          • Messages : 465

          Pour éviter les complications, dans un premier temps, j’ai chargé ton code source et l’exécutable de AsmTwo sur un adf. Puis sur mon 1200, j’ai assemblé.

          Il m’a fallu faire une seule adaptation : l’assignation « sources: ».

          #104519
          Arnaud.68K
            • Level 3
            • Messages : 69

            2 versions de code

            https://github.com/Amiga68000/Cube3D.Amiga.68000/releases/tag/AA

            rth, pour coordonnées des points définis en (rho, teta,h)

            xyz pour coordonnées en (x, y, z), plus facile pour créer les points mais consomme un poil de CPU en plus (5% environ)

            A500 + 512k, adepte du SM attention avec un A devant !

            #104528
            Staff
            Zarnal
              • Level 22
              • Messages : 7972

              Pour éviter les complications, dans un premier temps, j’ai chargé ton code source et l’exécutable de AsmTwo sur un adf. Puis sur mon 1200, j’ai assemblé. Il m’a fallu faire une seule adaptation : l’assignation « sources: ».

              Tu as fait cela manuellement ? Parce que c’est réglable directement dans les préférences.

              A1200 Commodore mutant " FrankenAmiga" + 68040 + 8MO + SD 8go - A1200 ESCOM. HD 20MO. Mon meilleur et seul A500 : WinUae. CPC 6128-CPC 464.

              #104531
              slack
                • Level 7
                • Messages : 465

                Comme c’est la première fois que j’utilise AsmTwo et vu le peu de temps disponible, j’ai fait au plus simple : un assign manuel.

                J’ai commencé à lire le code. Quelqu’un peut-il éclaircir les 2 points suivants ?

                1. Est-ce que AsmTwo sauvegarde les registres cpu avant d’appeler le code assemblé lorsque l’on tape la commande j ? Dans l’affirmative, la sauvegarde des registres au début du code et leur restauration avant le rts final sont inutiles.

                2. Pourquoi utiliser

                movea.l 4,a6

                et non

                movea.l 4.w,a6
                ? Cela économiserait deux octets et 4 cycles d’horloge.

                #104558
                jean3.5
                  • Level 8
                  • Messages : 616

                  J’avais pris le temps de rajouter des tabulation a ton 1er code et malgré ça, ca ne marchait  pas.

                  J’ai  pas encore essayé  ta mise à  jour mais j’ai déjà  hâte  de voir ce que ça  donnera sur le A500 et le 1200 :good:

                  #104570
                  Arnaud.68K
                    • Level 3
                    • Messages : 69

                    @Slack,

                    1 – ASMTwo ne rajoute pas d’instructions à ton code et donc ne sauvegarde pas les registres. Il faut imaginer si tu en fais un exécutable il faut alors sauvegarder les registres.

                    deb:
                    rts
                    dc.w $F123

                    pour vérifier, assemble ce code et fais un dump ‘h.wdeb’, tu constates qu’il y a qu’une instruction $4E75 (rts) devant $F123

                    2 – bien vu, je croyais que par défaut ASMTwo mettait un .w quand c’était pas spécifié sur movea.l 4,a6. J’ai vérifié il met un .l (contrairement à EASy68k)

                    Moindre mal, c’est pas dans une boucle, mais ça veut dire que d’une manière générale, vaut mieux spécifier que de penser que l’assembleur le fait pour nous (dépend des assembleurs). Je corrige à l’occasion, merci à toi.

                    A500 + 512k, adepte du SM attention avec un A devant !

                    #104571
                    Arnaud.68K
                      • Level 3
                      • Messages : 69

                      /!\ modif Cub3Dxyz.s, ajout du calage sur l’angle aZ (a6)vers les lignes 380

                      Mis à jour dans le github

                      ;calage table en mots donc angle*2
                      add.w a5,a5
                      add.w a4,a4
                      add.w a6,a6

                       

                      A500 + 512k, adepte du SM attention avec un A devant !

                      #104573
                      Arnaud.68K
                        • Level 3
                        • Messages : 69

                        J’avais pris le temps de rajouter des tabulation a ton 1er code et malgré ça, ca ne marchait pas. J’ai pas encore essayé ta mise à jour mais j’ai déjà hâte de voir ce que ça donnera sur le A500 et le 1200 :good:

                        N’hésite pas Jean, à ta dispo

                        A500 + 512k, adepte du SM attention avec un A devant !

                        #104582
                        donamiga
                          • Level 5
                          • Messages : 249

                          Je suis en train de réfléchir à animer un rubik’s cube

                          je suis curieux de voir ça

                          y a pas beaucoup de demos Amiga 500 avec un rubik’s cube

                          Made In Croatia/Binary

                          It Will make you Mad/Intryx (12/1992)
                          routine apparue la premiere fois dans RAW 4 Headlines/PMC (10/1992) par le meme auteur

                          sur Aminet il y a le Rubik Cube Solver

                          et la magnifique demo Atari Falcon :  Joy/New Beat

                           



                          #104584
                          slack
                            • Level 7
                            • Messages : 465

                            @Arnaud.68000

                            1. Donc  les movem aux lignes 153 et 1027 sont inutiles. Avant d’executer la première instruction d’une tache qui est insérée dans le système, le noyau exec initialise à zéro les registres d0 à d7 et a0 à a6 du cpu. Je pense qu’asmtwo fait de même avant de lancer ton programme.

                            2. Merci.

                            J’ai 3 nouvelles questions :

                            a)  Je ne vois pas de test après les demandes d’allocation de chipram ? Est-ce volontaire ? Que se passe-t-il si exec ne peut pas de fournir de chipram  ?

                            b) Dans les 4 demandes de chipram, faut-il à chaque fois recharger dans  a6 l’adresse de l’exec.library ? Est-ce qu’une fois avant la première demande suffit ?

                            c) Pour rendre le code plus lisible, que pense-tu de remplacer les valeurs numeriques dans les appels de fonctions par des symboles ? Par exemple, remplacer  » jsr -132(a6) » par « jsr forbid(a6) » ?

                            Encore merci pour ton code qui est un espace de découverte.

                            #104615
                            donamiga
                              • Level 5
                              • Messages : 249

                              hmm… clr.l d0/d6 ?? c’est specifique asmtwo ? illegal operand

                               

                               

                              #104619
                              slack
                                • Level 7
                                • Messages : 465

                                L’instruction clr a pour format « clr.taille AE » où taille peut être b, w ou l et AE est une adresse effective. Donc « D0/D6 » n’est pas une adresse effective valide.

                                Erreur ? Faute de frappe ?

                                #104630
                                Arnaud.68K
                                  • Level 3
                                  • Messages : 69

                                  @Slack

                                  1 – oui certainement inutile si le système gère à l’exécution la sauvegarde des registres

                                   

                                  2.a -non pas de test, Yragael (le code est en partie issu de son sinscroll) n’en n’a pas mis, ce serait mieux de tester. En revanche je sais pas comment faire. C’est d0 qui renvoie un 0 si KO ?

                                  2.b – je sais pas sir l’appel à la libe change A6, à tester

                                   

                                  2.c – oui ce serait bien, j’ai ps pas le temps de (re)nommer explicitement

                                  Avec plaisir si c’est un espace de découverte ;-)

                                   

                                  A500 + 512k, adepte du SM attention avec un A devant !

                                  #104631
                                  Arnaud.68K
                                    • Level 3
                                    • Messages : 69

                                    @donamiga

                                    Merci pour ces liens.

                                    j’ai regardé Intryx

                                    A ton avis c’est du temps réel le rubiks ? Si c’est le cas sur A500 c ‘est bluffant.

                                    Pour ma part, je dessine un rubiks sur 1 bitplane, faces cachées sans rotation de courone, ça prend  1 VBL + 26 HBL, donc je suis à 25 images/sec.. mais mon code doit s’optimiser !!!

                                    Je vais ouvrir un poste RUBIKS pour le poster et avoir vos retours  ;-)

                                     

                                    A500 + 512k, adepte du SM attention avec un A devant !

                                  Partager sur vos réseaux sociaux préférés :
                                  Facebooktwitterredditpinterestlinkedintumblrmail
                                  Affichage de 15 réponses de 16 à 30 (sur un total de 40)
                                  • Vous devez être connecté pour répondre à ce sujet.