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 » CopyScreen With Decalage A Pixel Pres Gray To ScreenBuffer (11 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Onur Ecrit le: Jeudi 26 août 2004 à 00:22 Déconnecté(e)    Voir le profil de Onur Envoyer un email à Onur Visiter le site WEB de Onur Envoyer un message privé à Onur  


en gros j'ai besoin de ca
http://www.etpstudio.com/temp/explication.JPG

avec X quelconque, cad a pixel pres, et la largeur de ce que jai mis a gauche peut varier mais connu a l'avance (pas besoin de le mettre dans une variable). cad qu'a chaque fois qu'on a copié une ligne, il faut faire un saut aussi grand que la largeur du gros truc.. enfin j'espere que je me fais comprendre.

J'ai trouvé plein de truc presque pareil mais j'arrive pas a l'adapter a ma situation. Alors des réponses concrete (avec du code si possible) seront le bienvenu. Tout ca en asm bien sur.

-Edité le Vendredi 19 novembre 2004 à 22:30 par geogeo-
-Edité le Mercredi 20 avril 2005 à 03:30 par Nounours-
Je ne veux pas faire quelque chose de bien, je cherche l'excellence:ETP Studio...


et autres projets à finir avant 2010
    
./Post n°1   Marquer comme non lu.
GoldenCrystal Ecrit le: Jeudi 26 août 2004 à 01:42 Déconnecté(e)    Voir le profil de GoldenCrystal Envoyer un email à GoldenCrystal Visiter le site WEB de GoldenCrystal Envoyer un message privé à GoldenCrystal  

Ben, faut que tu écrives la routine qui copie la partie désirée de ton buffer vers le buffer de grays.
Y'a rien du tout de compliqué là dedans, il suffit de calculer un décalage et de l'appliquer à chaque ligne. Si possible, aussi, un buffer multiple de 16 peut simplifier grandement la tâche (et surtout accélérer la routine).
Tu pourrais avoir un code qui ressemble à ça
.equ BUFFER_WORD_WIDTH 32 | Valeur modifiable
.equ BUFFER_HEIGHT 256 | Valeur modifiable (pas utile ici)

| void DrawBuffer(void *buffer asm("a0"), void *plane1 asm("a1"), void *plane2 asm("a2"), unsigned int offsetX asm("d0"), unsigned int offsetY asm("d1"));
DrawBuffer:
  movem.l %d3-%d4/%a2-%a3,-(%a7) | Sauvegarde les registres
  move.w %d0,%d2 | Sauve le X pour calculer l'offset plus tard
  lsr.w #3,%d0 | Je divise par 8
  andi.w #0xFFFC,%d0 | Masque pour obtenir l'addresse du premier word
  mulu.w #BUFFER_WORD_WIDTH*2,%d1 | Optimisable si la valeur est fixe 
  add.w %d0,%d1 | Ajoute les deux valeurs pour obtenir l'offset vers le premier long de la ligne
  neg.w %d2
  andi.w #0x1F,%d2 | Masque pour le décalage
  lea (%d1.w,%a0),%a0 | offset pour le buffer
  lea BUFFER_WORD_WIDTH*2*BUFFER_HEIGHT(%a0),%a3 | Là je suppose que les plans du buffer sont consécutifs pour calculer l'adresse du plan 2 du buffer
  moveq #127,%d0 | nb de lignes de l'écran - 1
vert_loop:
  move.w #14,%d1 | nb de words d'une ligne d'écran - 1
horz_loop:
  | Plan 1
  move.l (%a0),%d3 | Lit un long
  addq.w #2,%a0 | Ajoute 2 au pointeur du buffer
  lsl.l %d2,%d3 | Décale les données
  swap %d3 | Echange les words (le highword est celui qui nous intéresse)
  move.w %d3,(%a1)+ | Ecrit le word dans le plan 1 de l'écran
  | Plan 2 - idem qu'au dessus
  move.l (%a3),%d4
  addq.w #2,%a3
  lsl.l %d2,%d4
  swap %d4
  move.w %d4,(%a2)+
  dbf %d1,horz_loop | Word suivant
  lea BUFFER_WORD_WIDTH*2-30(%a0),%a0 | Incrémente les pointeurs du buffer (possibilité d'erreur)
  lea BUFFER_WORD_WIDTH*2-30(%a1),%a3
  dbf %d0,vert_loop | Ligne suivante
  movem.l (%a7)+,%d3-%d4/%a2-%a3 | Restaure les registres
  rts

(Je n'ai pas testé ce code, ce n'est pas garanti qu'il fonctionne correctement du premier coup)
PS: Ce code est optimisable, et améliorable (ne gère pas les limites)
PPS: Ce code est déstiné uniquement à rendre service à l'auteur de ce topic, je ne veux pas le voir ailleurs
[EDIT: corrigé un petit détail %)]
-Edité le Jeudi 26 août 2004 à 03:23 par GoldenCrystal-
-Edité le Jeudi 26 août 2004 à 19:31 par GoldenCrystal-
Kupo !
    
./Post n°2   Marquer comme non lu.
Jfg Ecrit le: Jeudi 26 août 2004 à 06:25 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


je ne veux pas le voir ailleurs

Pourquoi ça ? (sans indiscrétion).
Kill Mario
    
./Post n°3   Marquer comme non lu.
Lionel Debroux Ecrit le: Jeudi 26 août 2004 à 09:42 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

Ca correspond à la partie affichage sur l'écran réel d'un tilemap engine, sous une forme ou une autre. Arkanoid Revenge of DOH contient ce type de routines.
Lionel Debroux - membre de TICT.
    
./Post n°4   Marquer comme non lu.
Onur Ecrit le: Jeudi 26 août 2004 à 19:49 Déconnecté(e)    Voir le profil de Onur Envoyer un email à Onur Visiter le site WEB de Onur Envoyer un message privé à Onur  


j'y comprends rien aux decalages. #roll#

merci. je t'en dirai des nouvelles quand je l'aurai testé. #guitare#
Je ne veux pas faire quelque chose de bien, je cherche l'excellence:ETP Studio...


et autres projets à finir avant 2010
    
./Post n°5   Marquer comme non lu.
Onur Ecrit le: Vendredi 19 novembre 2004 à 20:29 Déconnecté(e)    Voir le profil de Onur Envoyer un email à Onur Visiter le site WEB de Onur Envoyer un message privé à Onur  


Ca marche pas #pleure#
Je ne veux pas faire quelque chose de bien, je cherche l'excellence:ETP Studio...


et autres projets à finir avant 2010
    
./Post n°6   Marquer comme non lu.
geogeo Ecrit le: Vendredi 19 novembre 2004 à 22:44 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Le problème avec ce que tu veux faire c'est que du dois coder des routines de sprites si ton buffer dépasse 240 pixels en largeur....
Source d'Arkanoid pour copier une zone de 160x100 d'un buffer de 240x200 pixels:

;C prototype: void CopyScreenBufferToScreen4 (short x, short y, void *src, void *dest1, void *dest2);
;
;void CopyScreenBufferToScreen4 (register short x asm("%d0"),
;          register short y asm("%d1"),
;          register void *src asm("%a0"),
;          register void *dest1 asm("%a2"),
;          register void *dest2 asm("%a3"));

  xdef CopyScreenBufferToScreen4

CopyScreenBufferToScreen4:
  movem.l  d3-d7,-(a7)
  move.w  d1,d2
  lsl.w  #5,d1
  sub.w  d2,d1
  sub.w  d2,d1
    
  moveq.l  #$0F,d3
  move.w  d0,d2
  and.w  d3,d0
  
  not.w  d3
  and.w  d3,d2  
  lsr.w  #3,d2
  add.w  d2,d1
  
  adda.w  d1,a0
  
  lea.l  (240/8)*200(a0),a1
  
  move.l  #100-1,d7
  
  moveq.l  #-1,d1
  lsl.w  d0,d1
  move.w  d1,d2
  not.w  d2
  
  ;d0=Bit à décaler
  ;d1=mask1
  ;d2=mask2
  ;d7=boucle
\LineStart:
  move.l  (a0)+,d3
  lsl.l  d0,d3

  move.l  (a0)+,d4
  rol.l  d0,d4
  move.w  d4,d5
  and.w  d2,d5
  or.w  d5,d3
  move.l  d3,(a2)+  ; 1

  move.l  (a1)+,d5
  lsl.l  d0,d5

  move.l  (a1)+,d6
  rol.l  d0,d6
  move.w  d6,d3
  and.w  d2,d3
  or.w  d3,d5
  move.l  d5,(a3)+

  and.w  d1,d4
  move.l  (a0)+,d3
  rol.l  d0,d3
  move.w  d3,d5
  and.w  d2,d5
  or.w  d5,d4
  move.l  d4,(a2)+  ; 2

  and.w  d1,d6
  move.l  (a1)+,d5
  rol.l  d0,d5
  move.w  d5,d4
  and.w  d2,d4
  or.w  d4,d6
  move.l  d6,(a3)+

  and.w  d1,d3
  move.l  (a0)+,d4
  rol.l  d0,d4
  move.w  d4,d6
  and.w  d2,d6
  or.w  d6,d3
  move.l  d3,(a2)+  ; 3

  and.w  d1,d5
  move.l  (a1)+,d6
  rol.l  d0,d6
  move.w  d6,d3
  and.w  d2,d3
  or.w  d3,d5
  move.l  d5,(a3)+

  and.w  d1,d4
  move.l  (a0)+,d3
  rol.l  d0,d3
  move.w  d3,d5
  and.w  d2,d5
  or.w  d5,d4
  move.l  d4,(a2)+  ; 4

  and.w  d1,d6
  move.l  (a1)+,d5
  rol.l  d0,d5
  move.w  d5,d4
  and.w  d2,d4
  or.w  d4,d6
  move.l  d6,(a3)+

  and.w  d1,d3
  move.l  (a0)+,d4
  rol.l  d0,d4
  move.w  d4,d6
  and.w  d2,d6
  or.w  d6,d3
  move.l  d3,(a2)+  ; 5

  and.w  d1,d5
  move.l  (a1)+,d6
  rol.l  d0,d6
  move.w  d6,d3
  and.w  d2,d3
  or.w  d3,d5
  move.l  d5,(a3)+

  ;and.w  d1,d4
  ;move.l  (a0)+,d3
  ;rol.l  d0,d3
  ;move.w  d3,d5
  ;and.w  d2,d5
  ;or.w  d5,d4
  ;move.l  d4,(a2)+  ; 6

  ;and.w  d1,d6
  ;move.l  (a1)+,d5
  ;rol.l  d0,d5
  ;move.w  d5,d4
  ;and.w  d2,d4
  ;or.w  d4,d6
  ;move.l  d6,(a3)+

  ;and.w  d1,d3
  ;move.l  (a0)+,d4
  ;rol.l  d0,d4
  ;and.w  d2,d4
  ;or.w  d4,d3
  ;move.l  d3,(a2)+  ; 7

  ;and.w  d1,d5
  ;move.l  (a1)+,d6
  ;rol.l  d0,d6
  ;and.w  d2,d6
  ;or.w  d6,d5
  ;move.l  d5,(a3)+
  
  ;swap.w  d4
  ;swap.w  d6

  ;move.w  d4,(a2)+
  ;move.w  d6,(a3)+

  lea.l  6(a0),a0
  lea.l  6(a1),a1
  
  lea.l  10(a2),a2
  lea.l  10(a3),a3
  
  ;add.l  #2,a0
  ;add.l  #2,a1

  dbf  d7,\LineStart
  
  movem.l  (a7)+,d3-d7
  rts


Ce code est très répétitif mais il faut juste comprend qu'il ne fait que décaler des blocs de 32 bits. Ainsi il faut 5 fois faire le décalage (160/8)/4 par ligne pour un écran de 160 pixels de largeur en distination soit l'écran de la TI89.

Je te conseil de prendre un papier et de voir ce que ça donne pour traiter une ligne entière de l'écran, tu comprendras facilement et tu pourras l'adapter à des buffers de tailles variables en largeur!

Sinon les arguments c'est assez simple.
x,y = Coordonnées où commence la zone du buffer à copier, bref correspondra aux coordonnées 0,0 sur l'écran (buffer de destination).
src = Ton buffer source, pour cette routine 240x200 pixels.
dest1 = Plan0 de l'écran soit GetPlane(0) en langage C.
dest2 = Plan1 GetPlane(1).
-Edité le Vendredi 19 novembre 2004 à 22:44 par geogeo-
-Edité le Vendredi 19 novembre 2004 à 22:46 par geogeo-
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°7   Marquer comme non lu.
Onur Ecrit le: Samedi 20 novembre 2004 à 02:12 Déconnecté(e)    Voir le profil de Onur Envoyer un email à Onur Visiter le site WEB de Onur Envoyer un message privé à Onur  


oui j'ai fait ca en fait, c'est bon.. tu me l'avais deja envoyé, et ca marche.. maintenant j'ai un autre souci :)
Je ne veux pas faire quelque chose de bien, je cherche l'excellence:ETP Studio...


et autres projets à finir avant 2010
    
./Post n°8   Marquer comme non lu.
geogeo Ecrit le: Samedi 20 novembre 2004 à 13:20 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Quel autre souci?
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°9   Marquer comme non lu.
Onur Ecrit le: Samedi 20 novembre 2004 à 13:52 Déconnecté(e)    Voir le profil de Onur Envoyer un email à Onur Visiter le site WEB de Onur Envoyer un message privé à Onur  


ben je l'ai posté ;) j'ai crée un autre topic merci.

voila ce que ca donne:

http://www.etpstudio.com/MAPRENDER0017.gif
Je ne veux pas faire quelque chose de bien, je cherche l'excellence:ETP Studio...


et autres projets à finir avant 2010
    
./Post n°10   Marquer comme non lu.
geogeo Ecrit le: Samedi 20 novembre 2004 à 14:24 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Ca rame? Tu sais que tu dois utiliser du double buffering pour améliorer l'affichage et que tu n'es pas obligé de scroller un écran pixel après pixel tu peux le faire tous les 2 pixels.
Mais je ne comprend pas quand même car avec Arkanoid le jeu tourne à 70 fps même avec le scrolling. ton codes ne dois pas être bien optimisé alors?
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°11   Marquer comme non lu.
Onur Ecrit le: Samedi 20 novembre 2004 à 14:38 Déconnecté(e)    Voir le profil de Onur Envoyer un email à Onur Visiter le site WEB de Onur Envoyer un message privé à Onur  


non ca rame pas..
il faut enlever le locate à la con par contre.
et il y a deja le double-buffering.
non, non ca marche tres bien t'inquiete. ;)
Je ne veux pas faire quelque chose de bien, je cherche l'excellence:ETP Studio...


et autres projets à finir avant 2010
    
  :: Index » Forum Ti68K » Programmation Assembleur 68K » CopyScreen With Decalage A Pixel Pres Gray To ScreenBuffer (11 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 41.4ms avec 18 requetes