Page 1 sur 1

ASM

MessagePosté: Mar 5 Juin 2012 07:27
de rockyone
Avec un peut plus de doc, j’ai réussi la compression d’image dans un format MI 1que j’avait créer pour jeu, dans le but de gagner la place sur la disquette.
C’est deux fois plus rapide qu’en basic compilé, mais ce n’est pas encore le top et ça dépend des images.
Bien que ça produise dans certain cas des fichiers plus gros qu’en PI1, le temps de décompression, ne varie pas.
Ça me sert a rien, mais bon j’avance un peut en ASM.

Par contre, encore beaucoup d’incompréhension sur la gestion du PC, de l’USP…
Je cherche de la doc, des exemples simples ... Merci d’avance
Code: Tout sélectionner
;convertisseur écran en image.MI1
;
;A0  adresse écran
;A1  adresse destination
;    Condiendra :
;   +0   ffff = MI1   
;   +2   la palette
;   +34   les pointeurs de donnés a afficher
;   +4034   données( ce premier groupe de 4 bloc existant et conservé)
;   +33996   nombre de groupe sauvé

    movem.l d0-d5/a0-a2,-(a7)
   movem.l   40(sp),a0-a1
;   
;   move.w   #2,-(a7)      ;adresse écran pour Debug
;   trap   #14         ;
;   addq.l   #2,a7         ;
;   move.l    d0,a0         ;
;
   movem.l $ffff8240.w,d0-d7   ;sauvegade palette
   movem.l d0-d7,2(a1)
   move.w   #$ffff,(a1)      ;identité  MI1
   clr.l   d0
   clr.l   d1
   clr.l   d2
   clr.l   d4
   clr.l   d5

   add.w   #1999,d5   ;32000/16 fin ‚cran
   movea.l   a1,a2
;-------------------------------------------------------------------------
Lire_bloc:      
   moveq.l   #0,d3      ;pour les pointeur de groupe
;
   lea   4034(a2),a1     ;début des groupe sauvé
;
;-------------------------------------------------------------------------
BLoc_1:   
   move.l   (a0),d0      ;lecture 1ø bloc
   cmp.l   (a1),d0
   bne   suivant      ; 1ø bloc différant
      
         move.l   4(a0),d0
   cmp.l   4(a1),d0
   bne    suivant      ; 2ø bloc différant

   move.l   8(a0),d0
   cmp.l   8(a1),d0
   bne    suivant      ; 3ø bloc différant

   move.l   12(a0),d0
   cmp.l   12(a1),d0
   bne    suivant      ; 4ø bloc différant

   adda   #16,a0      ; pointe sur le prochain groupe de l'écran

   bra   save_adr   ; 4 blocs identiques
;            ; sauver uniquement l'adresse
;-------------------------------------------------------------------------
Suivant:
   adda   #16,a1      ; pointe sur le prochain groupe sauvegardé    
   
   addi   #16,d3      ; Conteur de boucle pour calculer
;            ; les pointeurs de groupe
   
   dbra   d2,bloc_1                   ; fin des groupe sauvé ?
;                                                               ; nouveau groupe a sauver
;-------------------------------------------------------------------------
Save_groupe:         
   move.l   (a0)+,(a1)+   
   move.l   (a0)+,(a1)+
   move.l   (a0)+,(a1)+
   move.l   (a0)+,(a1)+   ; pointe sur le prochain groupe suivant
   addi   #1,d1      ; Compteur de groupe sauvé
;-------------------------------------------------------------------------   
Save_adr:
   move.w   d1,d2      ;réinit le compteur
   move.w   d3,34(a2,d4.w)   ;save pointeur bloc
   addi   #2,d4      ;Nb pointeur sauvé
;
   dbra   d5,lire_bloc   ;fin écran ?
;            ;
;-------------------------------------------------------------------------
   move.l   #33996,d4                   ;pour calculer la taille du fichier   
   move.l   d1,0(a2,d4.l)   ;a sauvegarder (d1*16)+4034+16
;-------------------------------------------------------------------------
   movem.l   (a7)+,d0-d5/a0-a2
   rts
   end

Re: ASM

MessagePosté: Mar 5 Juin 2012 11:35
de tomchi
pour poser des questions uniquement sur l'asm et en français, je te conseille d'aller voir ce forum.

je pense pas trop m'avancer en te disant que dans le forum gfa, yaura peu ou prou de réponses et pour cause ;)

Re: ASM

MessagePosté: Mer 6 Juin 2012 21:12
de Daroou
Cours asm du Feroce Lapin:
http://atariste.free.fr/asm/assembleur.html


PC, permet un adressage relatif au PC pour adresser les variables par exemple

move.l d0, score(PC)

section Bss
.even
Score:
Ds.L 1

A vérifier, ça remonte à loin :roll:


USP = a7 , pointeur de Pile en mode utilisateur (sp)
SSP = a7', pointeur de pile en superviseur



Wiki 68000
http://fr.wikipedia.org/wiki/Motorola_68000



Concernant ta routine:

Tu peux optimiser un peu en remplaçant certaine addition, par AddQ
http://fr.wikipedia.org/wiki/Motorola_6 ... ion_rapide

addi.l #1,d1 16 cycles
addq.l #1,d1 8 cycles


Nombre de cycle des instructions 68000
http://oldwww.nvg.ntnu.no/amiga/MC680x0 ... iming.HTML

Sinon, quand tu lis le premier bloc, tu le compares aux bloc sauvergardé, sauf que c'est le premier et il y en a pas de sauvegardé.
Tu devrais enregistrer le premier groupe avant d'entrer dans la boucle.

Re: ASM

MessagePosté: Jeu 7 Juin 2012 21:25
de rockyone
Merci Daroou
Bien les cours de Féroce Lapin

daroou
Sinon, quand tu lis le premier bloc, tu le compares aux bloc sauvergardé, sauf que c'est le premier et il y en a pas de sauvegardé.
Tu devrais enregistrer le premier groupe avant d'entrer dans la boucle


Le premier bloc écran est comparé a celui ce trouvant dans le buffer +4034 qui contient l’image au format PI1, est celui, ci je le conserve.