// 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

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.

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