Por curiosidad, ¿Cómo lo has hecho al final?
Tu funcion:
[code]void mueveSprite(int x, int y,int numSprite)
{
int potencia=1, i=0, vc=4096*13, xm;
//bucle para hallar la potencia (Sprite)
for (i=1; i<=numSprite; i++)
{
potencia *= 2;
}
if(numSprite==0)
potencia=1;
//Usamos el registro para la x mayor de 255
if (x>=256)
{
//x=x-256;
POKE(vc+16,PEEK(vc+16)|potencia);
}
if (x<256)
{
//POKE(vc+16,PEEK(vc+16));
xm=255-potencia;
POKE(vc+16,PEEK(vc+16)&xm);
}
POKE(vc+2*numSprite,x);
POKE(vc+2*numSprite+1,y);
}
[/quote]
Y la misma optimizada:
[code]void MoveSprAbs(unsigned char sprite, int x, int y)
{
unsigned short int offset, tmp;
unsigned char bit9 = 0x1;
// Desplazar hasta el sprite a modificar
bit9 = bit9 << sprite;
tmp = PEEK(0xD010);
if (x>256)
{
tmp = tmp | bit9;
}
else
{
bit9 = ~ bit9;
tmp = tmp & bit9;
}
POKE(0xD010, tmp);
offset = sprite * 2; // FIXME eliminar esta multiplicacion
POKE(0xD000 + offset, x);
POKE(0xD000 + offset + 1, y);
}
[/quote]
La unica que me queda por optimizar es la multiplicacion del final, creo supongo con una tablita de datos se puede arreglar.
Los desplazamientos <<, OR y AND no tardan nada, en cambio las multiplicaciones tengo entendido que son "carisimas" para el 6502, que no tiene instrucciones para hacerlas.