Je parlais du d0-a6 au lieu de d0-d7/a0-a6

; Assembly Source File
; Created 11/05/2002, 20:44:24
include "OS.h" ;fichier include pour les programmes en _nostub, contenant notamment les ROM_CALLs
xdef _nostub ;pas besoin de kernel
xdef _ti89 ;Ce programme tourne sur TI-89.
;********************************** MACROs *****************************************
ROM_C MACRO
move.l 1*4(a5),a0
jsr (a0)
ENDM
;****************************** DEBUT DU PROGRAMME *********************************
movem.l d3-d7/a2-a6,-(sp) ; un prog a le droit de modifier a0-a1/d0-d2
move.l $c8,a5 ;table des ROM_CALLs en a5 NE PLUS UTILISER A5 !!
bsr Screen_Save
ROM_C ScreenClear
lea sprite,a0
move.l #LCD_MEM,a1
move.w #5,d1 ; Décalage en X
move.w #1,d2 ; Décalage en Y
bsr put_sprite_8
ROM_C ngetchx
bsr Screen_Load
bra fin
nomem
addq.l #4,a7 ;nettoie la pile
fin
movem.l (sp)+,d3-d7/a2-a6
rts
;******************************** SOUS PROGRAMMES ***********************
put_sprite_8: ; a0 : sprite, a1 : ecran, d1 : X, d2 : Y
moveq #8-1,d7 ; on boucle 8 fois
tst.b d2
beq b_put_sprite_8 ; si Y=0 alors on ne décale pas en Y
subq #1,d2
decal_Y
add #30,a1
dbra d2,decal_Y ; on décale en Y
divu #8,d1 ; on divise X par 8
move.w d1,d2 ; on sauve le resultat dans d2
; add.w d1,a1 ; on positionne X en ajoutant le resultat
clr.w d1
swap d1 ; on recupère le reste dans d1
b_put_sprite_8
move.b (a0)+,d3 ; d3 contient la 1ere ligne
move.b d3,d4 ; d4 = d3
lsr.b d1,d3 ; on décale d3 de X vers la droite
move.w #8,d5
sub.w d1,d5 ; d5 = 8-X
lsl.b d5,d4 ; on décale d4 de 8-X vers la gauche
move.b d3,d5 ; on place d3 dans d5
lsl #8,d5 ; on décale d5 de 8 vers la gauche
move.b d4,d5 ; on place d4 dans d5
move.w d5,(a1) ; on ecrit d5 à l'écran
add #30,a1 ; on passe à la ligne
dbra d7,b_put_sprite_8
rts
Screen_Save:
pea.l 3840 ; (240 * 128)
ROM_C HeapAllocPtr ; alloue 3840 octets
move.l a0,d4 ;sauvegarde l'adresse du bloc alloué en d4
tst.l d4
beq nomem ;si le pointeur est nul, quitte le programme
move.l d4,ecran
pea.l 3840 ;taille à copier
pea.l $4c00 ;source: adresse de l'écran
move.l d4,-(a7) ;destination: adresse du bloc alloué
ROM_C memcpy
lea.l 16(a7),a7 ;nettoie la pile
rts
Screen_Load:
pea.l 3840 ;taille à copier
move.l ecran,d4
move.l d4,-(a7) ;source: adresse du bloc alloué
pea.l $4c00 ;destination: adresse de l'écran
ROM_C memcpy
move.l d4,-(a7)
ROM_C HeapFreePtr ;libère le bloc alloué
lea 16(a7),a7
rts
;***************************************** VARIABLES ************************
ecran: ds.l 1 ; adresse de l'écran à restaurer
sprite:
dc.b %11111111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11111111



; Assembly Source File
; Created 11/05/2002, 20:44:24
include "OS.h" ;fichier include pour les programmes en _nostub, contenant notamment les ROM_CALLs
xdef _nostub ;pas besoin de kernel
xdef _ti89 ;Ce programme tourne sur TI-89.
;********************************** MACROs *****************************************
ROM_C MACRO
move.l 1*4(a5),a0
jsr (a0)
ENDM
;****************************** DEBUT DU PROGRAMME *********************************
movem.l d3-d7/a2-a6,-(sp) ; un prog a le droit de modifier a0-a1/d0-d2
move.l $c8,a5 ;table des ROM_CALLs en a5 NE PLUS UTILISER A5 !!
bsr Screen_Save
ROM_C ScreenClear
lea sprite,a0
move.l #LCD_MEM,a1
move.l #5,d1 ; Décalage en X
move.l #1,d2 ; Décalage en Y
bsr put_sprite_8
ROM_C ngetchx
bsr Screen_Load
bra fin
nomem
addq.l #4,a7 ;nettoie la pile
fin
movem.l (sp)+,d3-d7/a2-a6
rts
;******************************** SOUS PROGRAMMES ***********************
PutSprite8 macro
moveq.l #0,d4
move.b (a0)+,d4 ;loade la ligne courante du sprite
lsl.w #8,d4 ;|
swap d4 ;|positionne le sprite au début du long
lsr.l d1,d4 ;décale de l'offset X (celui obtenu ac and.l #$f,d1)
or.l d4,1(a1) ;affiche la ligne courante du sprite
endm
put_sprite_8 ;main putsprite function
add.w d2,d2 ;|y*2
move.w d2,d4 ;|
lsl.w #4,d2 ;|y*32
sub.w d4,d2 ;|y*32 - y*2 = y*30
move.w d1,d4
and.l #$f,d1 ;garde l'offset du pixel dans le word le contenant à l'écran
lsr.l #3,d4 ;addr du byte ou se trouve le pixel (depuis le début de la ligne courante)
and.l #$fe,d4 ;addr paire pour pouvoir y mettre un word contenant une ligne entière du sprite: par ex: $00000111 11111000
add.l d2,d4 ;lcdmem+d4=addr du byte ou se trouve le pixel
adda.l d4,a1 ; "
PutSprite8 0 ;y
PutSprite8 30 ;y+1
PutSprite8 60 ;y+2
PutSprite8 90 ;y+3
PutSprite8 120 ;y+4
PutSprite8 150 ;y+5
PutSprite8 180 ;y+6
PutSprite8 210 ;y+7
rts
;*****************************************
Screen_Save:
pea.l 3840 ; (240 * 128)
ROM_C HeapAllocPtr ; alloue 3840 octets
move.l a0,d4 ;sauvegarde l'adresse du bloc alloué en d4
tst.l d4
beq nomem ;si le pointeur est nul, quitte le programme
move.l d4,ecran
pea.l 3840 ;taille à copier
pea.l $4c00 ;source: adresse de l'écran
move.l d4,-(a7) ;destination: adresse du bloc alloué
ROM_C memcpy
lea.l 16(a7),a7 ;nettoie la pile
rts
Screen_Load:
pea.l 3840 ;taille à copier
move.l ecran,d4
move.l d4,-(a7) ;source: adresse du bloc alloué
pea.l $4c00 ;destination: adresse de l'écran
ROM_C memcpy
move.l d4,-(a7)
ROM_C HeapFreePtr ;libère le bloc alloué
lea 16(a7),a7
rts
;***************************************** VARIABLES ************************
ecran: ds.l 1 ; adresse de l'écran à restaurer
sprite:
dc.b %11111111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11100111
dc.b %11111111
Pen^2
a écrit : erf et Zguide c quoi pitet ??
TechNIC a écrit :
Heuu Timad, j'aime bien ta technique mais je veux pas optimiser ma div par 8 étant donné que je dois récupérer le reste.
Je rappelle que qd tu divises par 8, le resultat est forcément pair ...
Sbibi : un add #1 suivi d'un and ... c peut etre ma soluce, explicite mieux stp.
Sinon, ma routine sert juste à afficher un sprite 8*8![]()
Je rappelle mon prob : lorsque j'ajoute le reste de la div par 8 à mon adresse d'écran, si le reste est impair, l'adresse de l'ecran est impaire d'où ADRESS ERROR

) n'ai réagit 
