1

Yop smile

Rester à discuter... ça marche sur Handy/MacOSX, mais les tests sur la Lynx de Coopy en .O et .LNX flashé, ça freeze quand c'est trop sollicité.

Attention, les multiplications d'int 16bits peuvent se faire en signé ou non signé, avec accumulation ou non (le résultat de 32 bits est déposé et ajouté dans un registre, ce qui peut être pratique). Pour activer le mode signé + accumulation, avant vos opérations :
sprsys = _sprsys |= 0xc0;

Attention, les divisions sont toujours en mode non signé sad, il faut donc gérer soi-même les signes.

Astuce : si vous avez des décalages de 8 bits ou des mutliplications de 256 avant division, il est intéressant de positionner votre dépôt d'int un byte plus loin wink

int   matha     at 0xfc52,
      mathb     at 0xfc54,
      mathc     at 0xfc56,
      mathe     at 0xfc60,
      mathf     at 0xfc62,
      mathakku  at 0xfc6c;

int MUL(a, b) int a; int b; { // multiplication toute bête, le dépôt dans mathb active la multiplication
	matha = a; 
	mathb = b;
	while(PEEK(0xfc92) & 0x80) {} // on attend que Suzy a fini, me demande si WAITSUZY; est pas mieux
	return mathe; // normalement on a un long, mais on retourne un int, vu la déclaration de mathe
	}

uchar s;

int DIV(e, c) int e; int c; { // division toute simple
        s = 0;
	if (c & 0x8000) { mathc = -c; s++; } else { mathc = c; } // on n'insère que des positifs
	if (e & 0x8000) { mathe = -e; s++; } else { mathe = e; }
	mathe = e;
	mathf = 0x0000;
	while(PEEK(0xfc92) & 0x80) {}
	if (s & 1) { return -matha; } // on récupère un négatif si l'un OU l'autre est négatif
	return matha;
	}

void AKKU_Reset() { POKE(0xfc6c, 0); POKE(0xfc6e, 0); } // à appeler avant, pour nettoyer le registre
void AKKU_MUL(a, b) int a; int b; { // multiplication et accumulation, il faut que le bit 6 de sprsys soit aussi enclenché 
	matha = a;
	mathb = b;
	while(PEEK(0xfc92) & 0x80) {}
	}
int AKKU_Get() { return mathakku; } // on récupère la somme



Important : contrairement à mes habitudes de Atari ST, les poids forts et faibles des int et long sont organisés comme chez Mister Intel.
Il y a plus d'explications dans les docs-dev : lynx9.html et hardware.html.

Un grand merci à _Dbug_ de Next qui m'a ouvert les neunoeils concernant le mode division sans négatifs, et mon erreur poids faible/fort.

2

Merci beaucoup pour ce bout de code !
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3

un truc : mettre un test pour éviter une division par 0... La console aime pas trop et freeze wink

4

y'a pas un trap div0 ?
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

5

je sais pas. d'après la doc, Suzy renvoie une valeur 0xffffffff, et vu que j'utilise ça dans les calculs, ça doit faire un zoom de sprite ingérable wink