Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation Assembleur 68K » Modification d'une fonction d'Extgraph (7 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Jfg Ecrit le: Mardi 15 février 2005 à 22:45 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


J'utilise la fonction d'extgraph GrayClipISprite16_MASK_R. J'ai souvent besoin d'afficher des sprites à l'envers, donc pour éviter de générer ces sprites, il faut que j'utilise une fonction qui les affichent renversés.

MAIS je ne trouve pas quoi changer dans le code pour arriver à mes fins :(


Voici le code de la fonction:

.text
.globl GrayClipISprite16_MASK_R
.even

GrayClipISprite16_MASK_R:
    move.l   %d3,-(%sp)
    move.l   %a2,-(%sp)

    move.l   4+8(%sp),%a2

    subq.w   #1,%d2    | %d2 = h - 1
    move.w   %d1,%d3    | %d3 = y
    bpl.s    9f  | h > 0 ?

    add.w    %d1,%d2    | %d2 = h + y
    bmi.s    0f    | y + h < 0 ?

    add.w    %d1,%d1
    move.w   %d1,%d3
    add.w    %d1,%d1
    add.w    %d3,%d1
    suba.w   %d1,%a2    | sprite -= 6y

    moveq.l  #0,%d1    | offsety = 0
    bra.s    10f

9:
    add.w    %d2,%d3    | %d3 = h + y
    subi.w   #127,%d3    | %d3 = h + y - 127
    ble.s    6f      | h + y - 127 <= 0 ?
    sub.w    %d3,%d2    | h -= h + y - 127 (h = 127-y)
    bmi.s    0f

6:
    move.w   %d1,%d3
    lsl.w    #4,%d1
    sub.w    %d3,%d1    | %d1 = y*15

10:
    move.w   %d0,%d3    | %d3 = x
    ble.s    8f  | x < 0 ?
    cmpi.w   #239-16,%d0
    bhi.w    7f  | x > 239-15

    lsr.w    #4,%d3    | %d3 = x/16
    add.w    %d3,%d1    | %d3 = x/16 + y*15
    add.w    %d1,%d1    | %d3 = x/8 + y*30
    adda.w   %d1,%a0    | dest += offset
    adda.w   %d1,%a1

    andi.w   #15,%d0
    cmpi.w   #8,%d0
    bge.s    3f

1:
    moveq.l  #-1,%d3
    move.w   (%a2)+,%d3
    swap.w   %d3
    ror.l    %d0,%d3

    moveq    #0,%d1
    move.w   (%a2)+,%d1
    swap.w   %d1
    lsr.l    %d0,%d1
    and.l    %d3,(%a0)
    or.l     %d1,(%a0)

    moveq    #0,%d1
    move.w   (%a2)+,%d1
    swap.w   %d1
    lsr.l    %d0,%d1
    and.l    %d3,(%a1)
    or.l     %d1,(%a1)

    lea      30(%a0),%a0
    lea      30(%a1),%a1

    dbf      %d2,1b
0:
    move.l   (%sp)+,%a2
    move.l   (%sp)+,%d3
    rts

3:
    moveq    #16,%d1
    sub.w    %d0,%d1

2:
    moveq.l  #-1,%d3
    move.w   (%a2)+,%d3
    rol.l    %d1,%d3

    moveq    #0,%d0
    move.w   (%a2)+,%d0
    lsl.l    %d1,%d0
    and.l    %d3,(%a0)
    or.l     %d0,(%a0)

    moveq    #0,%d0
    move.w   (%a2)+,%d0
    lsl.l    %d1,%d0
    and.l    %d3,(%a1)
    or.l     %d0,(%a1)

    lea.l    30(%a0),%a0
    lea.l    30(%a1),%a1

    dbf      %d2,2b
    move.l   (%sp)+,%a2
    move.l   (%sp)+,%d3
    rts

8:
    cmpi.w   #-16,%d0
    ble.s    0b    | x <= -16 ?

    neg.w    %d0    | shift = -x

    add.w    %d1,%d1    | %d1 = y*30
    adda.w   %d1,%a0    | dest += offset
    adda.w   %d1,%a1

4:
    moveq.l  #-1,%d3
    move.w   (%a2)+,%d3
    rol.l    %d0,%d3

    moveq    #0,%d1
    move.w   (%a2)+,%d1
    lsl.w    %d0,%d1
    and.w    %d3,(%a0)
    or.w     %d1,(%a0)

    moveq    #0,%d1
    move.w   (%a2)+,%d1
    lsl.w    %d0,%d1
    and.w    %d3,(%a1)
    or.w     %d1,(%a1)

    lea.l    30(%a0),%a0
    lea.l    30(%a1),%a1

    dbf      %d2,4b

    move.l   (%sp)+,%a2
    move.l   (%sp)+,%d3
    rts

7:
    cmpi.w   #239,%d0
    bhi.s    0b    | x > 239

    andi.w   #15,%d0    | shiftx = x & 15

    add.w    %d1,%d1    | %d1 = y*30
    addi.w   #28,%d1
    adda.w   %d1,%a0
    adda.w   %d1,%a1

5:
    moveq.l  #-1,%d3
    move.w   (%a2)+,%d3
    ror.l    %d0,%d3

    moveq    #0,%d1
    move.w   (%a2)+,%d1
    lsr.w    %d0,%d1
    and.w    %d3,(%a0)
    or.w     %d1,(%a0)

    moveq    #0,%d1
    move.w   (%a2)+,%d1
    lsr.w    %d0,%d1
    and.w    %d3,(%a1)
    or.w     %d1,(%a1)

    lea.l    30(%a0),%a0
    lea.l    30(%a1),%a1

    dbf      %d2,5b

    move.l   (%sp)+,%a2
    move.l   (%sp)+,%d3
    rts


Si vous pouviez m'indiquer quoi modifier ou me donner qlq indices, je serais très reconnaissant :)
Kill Mario
    
./Post n°1   Marquer comme non lu.
Sasume Ecrit le: Mardi 15 février 2005 à 23:26 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

C'est-à-dire à l'envers ? Tu veux faire du flipping ?
    
./Post n°2   Marquer comme non lu.
Jfg Ecrit le: Mardi 15 février 2005 à 23:34 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


Cád un sprite comme ça

10001100100
00001000010
00100101000

s'affiche comme ça: (à l'envers quoi :))

00100101000
00001000010
10001100100
Kill Mario
    
./Post n°3   Marquer comme non lu.
Sasume Ecrit le: Mercredi 16 février 2005 à 09:55 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

A l'envers aurait pu avoir plusieurs significations : là ton sprite subit une symétrie par rapport à l'axe horizontal avant d'être affiché, mais ça aurait pu être une symétrie par rapport à l'axe vertical...
En tout cas, tu as de la chance, la symétrie que tu souhaites réaliser est la moins coûteuse en temps (et taille) avec ce format de sprite :)

Il faut faire pas mal de changements, notemment au niveau de la gestion du clipping, mais avec des chiffres en guise de noms de labels, le code n'est plus très explicite :(
Représente toi les différents cas à gérer :
D'abord dans tous les cas, il faudra que tu commences à affiche ton sprite depuis la fin, donc tu dois déplacer le pointeur sur les données source (ici, a2) vers la fin du sprite, il faut donc que tu lui ajoutes la hauteur du sprite multipliée par 6 parce qu'une ligne de sprite prend 6 octets.

Ensuit, le clipping vertical :
Si y < 0 :
Diminuer le nombre de lignes à afficher (ici, d2) de -y unités : add.w %d1,%d2 (rien à modifier)
Faire pointer le pointeur source vers la bonne ligne à afficher, c'est-à-dire lui retrancher (-y)*6 : remplace le suba.w %d1,%a2 par un adda.w %d1,%a2.

Si y + h > 127 :
Diminuer le nombre de lignes à afficher, laisse ça tel quel.

Pour le clipping horizontal, à priori il ne devrait pas y avoir de changements dans le code de détection.
Par contre, dans les 3 boucles d'affichage, il faut changer certains détails :
Après avoir affiché une ligne de sprite (les deux plans et leur masque), il faut revenir en arrière de 2 lignes : lea.w -12(%a2),%a2

ça devrait être bon :)
    
./Post n°4   Marquer comme non lu.
Kevin Kofler Ecrit le: Mercredi 16 février 2005 à 11:23 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Sasume :
mais avec des chiffres en guise de noms de labels, le code n'est plus très explicite :(

Ce n'était pas la peine, les labels ne sont pas visibles en dehors du fichier .s s'ils ne sont pas en .xdef de toute façon.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°5   Marquer comme non lu.
geogeo Ecrit le: Mercredi 16 février 2005 à 11:51 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


J'ai une fonction pour afficher un sprite renversé sur un axe vertical donc ça ne va pas t'aider mais je te propose une chose que j'ai toujours fait sur Nebulus.

Tu créés une fonction qui recopie ton sprite à l'envers dans un buffer, c'est simple, tu définis un espace mémoire et tu parts de la fin de ton sprite et tu recopies de base en haut!

Ensuite tu définie une fonction avec flag qui t'indique si tu dois afficher un sprite renversé ou au contraire le sprite normal. Si tu dois afficher un sprite renversé tu vérifies au préalable si cela a été fait ou non (si ça a été déjà fait c'est inutile d'appliquer ta fonction de renversement). Et enfin tu jongles avec un pointeur qui pointe soit directement sur le sprite soit sur ton buffer contenant le sprite renversé, et ensuite tu affiches!

Nebulus utilise beaucoup d'astuces de ce genre, par exemple dans l'affichage de l'eau qui ondule et où on voit le reflet du niveau qui est renversé!
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°6   Marquer comme non lu.
Sasume Ecrit le: Mercredi 16 février 2005 à 13:48 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Oui, si tu ne veux pas trop t'embêter, tu peux faire cette méthode (c'est aussi la méthode de genlib qui au passage possède déjà les fonctions que tu recherches...).

Tu définis un espace tampon dans lequel tu flip ton sprite juste avant de l'afficher puis tu appelles la fonction d'affichage classique sur ce sprite temporaire. C'est très simple à écrire, et pas forcément tellement plus lent :)
    
./Post n°7   Marquer comme non lu.
Jfg Ecrit le: Mercredi 16 février 2005 à 18:48 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


"l'affichage de l'eau qui ondule et où on voit le reflet du niveau qui est renversé!"
J'adore cette effet #cool#.

"genlib qui au passage possède déjà les fonctions que tu recherches..."
Pas de chance, je préfère pas utiliser de dll :)

J'utiliserais donc la méthode où je génère les sprites fliper. Si j'ai vraiment besoin de vitesse je peux même générer tous les sprites en avance.

Merci quand même Sasume pour le ./3 ^^
Kill Mario
    
  :: Index » Forum Ti68K » Programmation Assembleur 68K » Modification d'une fonction d'Extgraph (7 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 37.72ms avec 18 requetes