1

Le titre en dit long, mais je vais développer un peu:
J'ai fait, il y a un moment, des fonctions de scrolling horizontal en assembleur (ROXL/ROXR powa) et un prog en C pour les tester. Dans le programme en C, j'active les gris 4, je lis des touches, et je scrolle les deux plans en conséquence, mais à un moment aléatoire, j'ai une "Error: Memory" alors que je n'effectue aucune allocation de mem dans ma boucle principale du programme. confus.
De plus, quand survient l'erreur, la calculatrice reste en gris4 et la boite de dialogue s'affiche sur le plan foncé, et freeze (sans doute parce que les auto-ints 1 et 5 sont redirigées pour le gris4 et le _keytest).

Quelqu'un sait ce qui peut causer une error: memory à part une tentative foireuse d'allocation?
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

2

Tu as du tout simplement écrire en dehors de ton buffer de niveaux de gris donc dépasser l'écran.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

3

Mais ça devrait me le faire systématiquement dans ce cas-là! non? Là ça me le fait aléatoirement et il y a même des fois où ça ne le fait pas du tout...
C'est vrai que l'erreur ne se produit pas tant que je ne presse aucune touche, mais mes routines de scroll ne vont pas jusque en bas de l'écran, et j'en ai une qui tourne en permanence sur le haut de l'écran et qui ne pose aucun problème...

Y'a-t-il une chance que l'interruption des niveaux de gris survenant pendant la routine de scroll puisse causer ce genre de plantage?
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

4

En gros quand tu écrit en dehors de l'écran tu as aléatoirement des plantages, soit la calculatrice ne plante pas mais est instable...

Tu devrais poster ton code. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

5

2: Non

6

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...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

7

Pourquoi tu initialise de cette façon les niveaux de gris, pourquoi tu n'utilise pas GrayOn et GrayOff?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

8

Oups! j'ai oublié de préciser que je les ai initialisés hors de ma fonction boucle_principale(), et avec GrayOn. C'est juste que pour dessiner dedans je prends leurs plans ensuite
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

9

Vérifie dans ta fonction en asm que tu n'écrit pas en dehors du buffer car là je ne vois rien qui pourrait provoquer une erreur dans le code en C.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

10

Ça y est, ça marche!
C'était un bug dans ma routine perso de psrite8 et sprite16 qui empilait deux octets sur la pile sans les dépiler...

C'est quand même bizarre que le débordement de pile génère une "Error: Memory", moi je m'attendais plutot à obtenir une barre noire avec "stack overflow" marqué dessus...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

11

Ha non ! rien à voir wink
Un stack overflow, c'est quand la pile est pleine, quand elle contient 16 ko.
Des données non-dépilées donnent plutôt des memory violation, des line xxxx emulator, adress error, ... suivant l'humeur du jour.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

12

ben ma fonction, comme elle était appelée dans la boucle principale (la fonction img16Vor()) elle finissait par remplir les 16 ko de la pile, non? ou bien ça provoquait une erreur de dépilage...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

13

Il n'y avait aucune chance pour que la pile déborde puisque la fonction ne retournait jamais au bon endroit (ta boucle) wink
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

14

si, parce qu'elle déplaçait l'adresse de retour! je l'avais faite pour cela, mais j'ai oublié que le compilo ne pouvais pas savoir que j'empilais deux octets supplémentaires... Et ja fini par découvrir avec le débugguer de VTI qu'à chaque appel de ma fonction, le sp diminuait de 2...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

15

Link
: C'est quand même bizarre que le débordement de pile génère une "Error: Memory", moi je m'attendais plutot à obtenir une barre noire avec "stack overflow" marqué dessus...

L'erreur "stack overflow" n'existe pas. En cas de débordement de pile, tu as une erreur "Memory" si l'AI7 le reconnaît comme tel, et une erreur "Protected memory violation" sinon.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité