Debido a que el "go to" puede crear problemas al saltar a otra linea de codigo
Tengo entendido que es mejor ensambler porque no solo realiza el salto reorganiza la pila como es debido
20 - CALL etiqueta1 (pila-stak guarda siguiente linea=21 automaticamente yo no hacia nada)
21 -
40 - etiqueta1 (aqui podia aber cualquier cosa ejemplo MOV)
.......
.......
45-CALL etiqueta2(ahora el stak tiene al principio linea 46(la primera) y 21(la segunda))
.......
RET (vuelve a linea 21)
100- CALL etiqueta2 ......
.......
.......
RET (vuelve a linea 46)
Una pregunta : ¿entonces incluso las void tienen un 2ºreturn-interno para volver a la posicion adecuada??
El salto no es para entrar en una funcion Lo contrario es para abandonarla El INT_EXT modifico valores con prioridad. No debe volver a la funcion porque esta remodifica los valores de forma perjudicial ya no validos. Preguntarle internamente a la funcion si INT_EXT modifico valores mediante int1 tambien lo es, puede segir cambiando algunos asta llegar a if(operoInterrupcion){ return 0 }, preguntarselo mas a menudo tampoco va a mejorar la cosa.
void see(unsigned int8 AX){//Se interrumpio sensor-RW para leer impazto en XX
res[AX]--;
if(res[AX]<1){
output_high(PIN_A2); //SENSOR ocupado no puedra atender INT EXT tiketa = "Sokp"
elimina(AX); output_low(PIN_A2); }//redundancia 2
else { dis[AX]+=retro; if(lesi){ if(vel[AX]>1){ vel[AX]=(vel[AX]*9)/10; } } }//lesi=herir x cada impacto recivido se le quita un 10% d velozcidad...
sx=0;//se atendio a interrupcion INT EXT
di++;
}
void elimina(int8 ali){
if(psz[0]==ali || psz[1]==ali){//se trata del objetivos principales
printf(lcd_putc1,"\fDESTROY<%u> ",ali);//destroy_psz[0]
if(nu>1){ if(psz[0]==ali){ pasa(1); } else { pasa(2); } } else { nu=0; }//RW2(); }//posicion-distancia[1]...[0] [2]...[1] [3]...[2] asta que lu diga nu
lxl=14; //delay_ms(250);
} else {//lo + raro no era el objetivo-prioritarios
printf(lcd_putc1,"\fSECUNDARIO<%u>FUERA ",ali);//destroy_psz[1]a[nu]
for(c4=2;nu>c4;c4++){
if(psz[c4]==ali){ pasa(c4+1); break; } }
lxl=22;//lx+=20;
}
//lcd_putc1("pas1 ");
//LO PRIMERO enviarles la posicion eliminada sea cual sea lo antes posible para que la reseten HAY DATOS K NO SE COMUNICAN como numero de impactos total V1+V2
if(dos){
output_low(PIN_A0); delay_us(50); re1(); delay_us(50); output_high(PIN_A0); delay_us(50); re2(); delay_us(50);//con esto refrescan el array donde el eliminado ya no existe
output_low(PIN_A0); delay_us(50); resRW(ali);//V1 resetea impactos=0 posicion[alien] y prepara A0=1 para RW V2
output_high(PIN_A0); delay_us(50); resRW(ali); RX=0;//V2 resetea impactos=0 posicion[alien] y prepara el prosimo refresco para que actue en RW V1
}//primordial pasar informe a los 2 lo antes posible independiente del valor int1 vez
else { if(V1){ re1(); delay_us(50); resRW(ali); } else { re2(); delay_us(50); resRW(ali); } }//primordial pasar informe
output_low(PIN_A2); //SENSOR desocupado puede atender INT EXT
hz=1;//No debe aplicarse de new RW2 ya se realizo tanto re1(); como re2();
//lcd_putc1("paso 2 "); lcd_gotoxy(20,4);
//printf(lcd_putc2," F%u R1.%u R2.%u [%u-%u] ",Fallo[0],Fallo[1],Fallo[2],Fallo[3],Fallo[4]); //Solo el numero de fallos RS");
lcd_putc2("\f");
ms=7;
de++;//otro objetivo derribado
}
///(3 23[200] (4 55[666] ----> 3 55[
void pasa(int8 d){
int8 ii,aa;//=0;
for(ii=d;nu>ii;ii++){///posicion-distancia[1]->[0]....[2]->[1]....[3]->[2]....sucesivo asta total de nu
aa=ii-1;
v8=psz[ii];
//if(v8>205){ break; }
v16=dis[v8];
psz[aa]=v8;//p[0]=p[1]
dis[v8]=v16;
}
nu--;
}
void resRW(int8 al){
output_high(PIN_A3); //RW TRUE debe estar ya selecionado V I o V II A0=0 o A0=1
spi_write(21); PM(); spi_write(al); PM();//nu=21 esto resetea a 0 el numero de inpactos en la posicion[ali]
output_low(PIN_A3); //RW FALSE
delay_us(50);
}