29Fermer31
FarewellLe 22/10/2015 à 19:00
Bon, je suis en train de patcher le patcher, mais j'ai une question : à quoi sert ce code, qui s'occupe des romcalls ? // handle F-LINE ROM_CALLs if (fline_ROM_CALLs && !strncmp(buffer,"\tjsr _ROM_CALL_",15) && strlen(buffer)<=18) { memmove(buffer+3,buffer+1,strlen(buffer)); // replace "jsr _ROM_CALL_" strncpy(buffer+1,".word _F_LINE+0x",16); // with ".word _F_LINE+0x" } else { // add :l to ROM_CALLs char *p4=strstr(buffer,"_ROM_CALL_"); while (p4) { char *p5=p4; p4+=10; while (isalnum(*p4)||*p4=='_'||*p4=='+'||*p4=='-'||*p4=='*'||*p4=='/') p4++; while (*p4==':'||isalpha(*p4)) memmove(p4,p4+1,strlen(p4)); // zap :w if it's there if (strlen(buffer)>32769) break; // avoid buffer overflow memmove(p4+2,p4,strlen(p4)+1); *(p4++)=':'; // add ":l" *(p4++)='l'; if (!strncmp(p4,"(%pc)",5)||!strncmp(p4,"(%Pc)",5)||!strncmp(p4,"(%pC)",5)||!strncmp(p4,"(%PC)",5)) { memmove(p4,p4+5,strlen(p4+5)+1); } else if ((!strncmp(p4,",%pc)",5)||!strncmp(p4,",%Pc)",5)||!strncmp(p4,",%pC)",5) ||!strncmp(p4,",%PC)",5)) &&(p5>buffer)&&(p5[-1]=='(')) { memmove(p4,p4+5,strlen(p4+5)+1); memmove(p5-1,p5,strlen(p5)+1); } p4=strstr(p4,"_ROM_CALL_"); } p4=strstr(buffer,"__ld_calc_const_"); while (p4) { char *p5=p4; p4+=16; while ((*p4>='0'&&*p4<='9')||(*p4>='a'&&*p4<='z')||(*p4>='A'&&*p4<='Z')||(*p4=='_')||(*p4==':')) p4++; if (!strncmp(p4,"(%pc)",5)||!strncmp(p4,"(%Pc)",5)||!strncmp(p4,"(%pC)",5)||!strncmp(p4,"(%PC)",5)) { memmove(p4,p4+5,strlen(p4+5)+1); } else if ((!strncmp(p4,",%pc)",5)||!strncmp(p4,",%Pc)",5)||!strncmp(p4,",%pC)",5) ||!strncmp(p4,",%PC)",5)) &&(p5>buffer)&&(p5[-1]=='(')) { memmove(p4,p4+5,strlen(p4+5)+1); memmove(p5-1,p5,strlen(p5)+1); } p4=strstr(p4,"__ld_calc_const_"); } }Le if, ok, c'est le remplacement du relogement par un appel F-line.
Juste une incompréhension : pourquoi strlen(buffer)<=18 ?

Par contre, le else...

A quoi sert cette ligne ? while (isalnum(*p4)||*p4=='_'||*p4=='+'||*p4=='-'||*p4=='*'||*p4=='/') p4++;
Ou plutôt, dans quel cas on peut tomber sur un tel code ? isalnum() ok, mais les signes ??

while (*p4==':'||isalpha(*p4)) memmove(p4,p4+1,strlen(p4)); // zap :w if it's there
Là, il vaut mieux ne pas avoir trifouillé dans le .s à la main, parce que question algo c'est pas clean cheeky

Ensuite, par quel miracle pourrait-on avoir un romcall pc-relatif, avec offset ou non d'ailleurs ?

Enfin, que vient faire __ld_calc_const ?

Merci bien. smile

ps -> question d'ordre général : pourquoi des strncmp/strncpy plutôt que leur version sans 'n' ?