le prog de la boucle principale:
/* Fonction de boucle principale
----------------------------- */
void boucle_principale(const short **mypicLink)
{
INT_HANDLER oldAI1,oldAI5;
BOOL fin=FALSE,affiche=TRUE;
unsigned short x=0,numimg=0;
const int y=LCD_HEIGHT-16;
char *ecranD=(char *)GrayGetPlane(DARK_PLANE),*ecranL=(char *)GrayGetPlane(LIGHT_PLANE);
oldAI1=GrayGetInt1Handler();
oldAI5=GetIntVec(AUTO_INT_5);
GraySetInt1Handler(DUMMY_HANDLER);
ST_busy(ST_IDLE);
while(!fin)
{
//haut
RotateGauche((short *)ecranD,15,2);
RotateGauche((short *)ecranL,15,2);
if(affiche)
{
//decor
switch(numimg)
{
case 0:
RotateGauche((short *)(ecranD+30*2),15,y-2);
RotateGauche((short *)(ecranL+30*2),15,y-2);
break;
case 1:
RotateDroite((short *)(ecranD+30*2),15,y-2);
RotateDroite((short *)(ecranL+30*2),15,y-2);
break;
}
//efface toute la partie du bas en gris clair
memset((char *)ecranD+30*y,0,30*16);
memset((char *)ecranL+30*y,255,30*16);
img16Vor(x,y,16,mypicLink[numimg],ecranL);
img16Vor(x,y,16,mypicLink[numimg],ecranD);
}
affiche=FALSE;
SetIntVec(AUTO_INT_5,DUMMY_HANDLER);
BEGIN_KEYTEST
if(_keytest_optimized(RR_LEFT))
{
if(x)
x--;
numimg=1;
affiche=TRUE;
}
if(_keytest_optimized(RR_RIGHT))
{
if(x<LCD_WIDTH-16)
x++;
numimg=0;
affiche=TRUE;
}
if(_keytest_optimized(RR_ESC))
fin=TRUE;
END_KEYTEST
SetIntVec(AUTO_INT_5,oldAI5);
//attend un 18e de seconde (enfin j'espère)
//attente_timer(1);
}
GraySetInt1Handler(oldAI1);
}
Pour les fonctions de scrolling ensuite:
;void RotateGauche(short *mem,unsigned short dimXwords,unsigned short dimY)
;params
pRGmem EQU 8 ;Adresse de début de la mem à scroller
pRGdimX EQU 12 ;largeur des lignes en words (15 pour LCD_MEM)
pRGdimY EQU 14 ;hauteur: nombre de lignes
;variables
;rAddr EQUR A0 ;mot en cours (déja défini)
rAddrDeb EQUR A1 ;début de ligne
;rNimporte EQUR D0 ;(déja défini)
;rx EQUR D0 ;Coordonnée X (déja défini)
;ry EQUR D1 ;Coordonnée Y (déja défini)
RotateGauche LINK A6,#0 ;Lie A6 aux paramètres
MOVE.l pRGmem(A6),rNimporte ;prend l'adresse
BCLR #0,rNimporte ;s'assure que l'adresse sera paire
MOVE.l rNimporte,rAddr ;Passe au registre d'adresses
MOVE.w pRGdimY(A6),ry ;prend la dimensiony
MOVE.w ry,rNimporte ;copie dans registre polyvalent
MULU pRGdimX(A6),rNimporte ;multiplie par dimX
ADD.w rNimporte,rNimporte ;double le résultat
ADDA.w rNimporte,rAddr ;registre d'adresse à la fin
SUBQ.w #1,ry ;retire 1 à dimY pour DBRA
SUBQ.w #1,pRGdimX(A6) ;retire 1 à dimX pour DBRA
;une boucle pour toutes les lignes
RGlp001:
MOVE.w pRGdimX(A6),rx ;prend dimX
MOVE #0,CCR ;X à 0
MOVE.l rAddr,rAddrDeb ;adresse du premier mot (droite) de la ligne+2
;une boucle pour chaque mot de la ligne
RGlp002:
ROXL -(rAddr) ;rotation du mot
DBRA rx,RGlp002 ;reboucle
;recopie: si retenue, on met le bit 0 du dernier octet à 1
BCC RGfs001 ;SI(1) bit C à 1 ALORS(1)
BSET #0,-1(rAddrDeb) ;met le bit à 1 FINSI(1)
RGfs001: DBRA ry,RGlp001 ;reboucle
UNLK A6 ;Libère A6
RTS ;Retour
;void RotateDroite(short *mem,unsigned short dimXwords,unsigned short dimY)
;params
pRDmem EQU 8 ;Adresse de début de la mem à scroller
pRDdimX EQU 12 ;largeur des lignes en words (15 pour LCD_MEM)
pRDdimY EQU 14 ;hauteur: nombre de lignes
;vars
;rAddr EQUR A0 ;Adresse du mot en cours (déja défini)
;rAddrDeb EQUR A1 ;début de ligne (déja défini)
;rNimporte EQUR D0 ;(déja défini)
;rx EQUR D0 ;coordonnée X (déja défini)
;ry EQUR D1 ;coordonnée Y (déja défini)
RotateDroite LINK A6,#0 ;Lie A6 aux paramètres
MOVE.l pRDmem(A6),rNimporte ;prend l'adresse
BCLR #0,rNimporte ;s'assure que l'adresse sera paire
MOVE.l rNimporte,rAddr ;Passe au registre d'adresses
MOVE.w pRDdimY(A6),ry ;prend la dimensiony
SUBQ.w #1,ry ;retire 1 pour DBRA
SUBQ.w #1,pRDdimX(A6) ;retire 1 à dimX pour DBRA
;une boucle pour toutes les lignes
RDlp001:
MOVE.w pRDdimX(A6),rx ;prend dimX
MOVE #0,CCR ;X à 0
MOVE.l rAddr,rAddrDeb ;adresse du premier mot(gauche) de la ligne
;une boucle pour chaque mot de la ligne
RDlp002:
ROXR (rAddr)+ ;rotation du mot
DBRA rx,RDlp002 ;reboucle
;recopie: si retenue, on met le bit 7 du premier octet à 1
BCC RDfs001 ;SI(1) bit C à 1 ALORS(1)
BSET #7,(rAddrDeb) ;met le bit à 1 FINSI(1)
RDfs001: DBRA ry,RDlp001 ;reboucle
UNLK A6 ;Libère A6
RTS ;Retour
(tous les equ commençant par R veulent dire "registre")
Ca doit surement être illisible... Je vais les uploader et poster l'url...