for(j=0;j<n_rout->neue;j++) /* die neuen Routinen */
{ nr_nr=n_rout->neues[j];
pos=Sym[nr_nr].sy_atxt; /* Adresse relativ zu TEXT-Anfang */
ptr=&Sym[nr_nr].sy_aram[-pos]; /* Hilfspointer */
if((sym_e=Sym[nr_nr].sy_stab)==NULL)
{ sprintf(fehler,"[1][%s ist nicht global definiert][Abbruch]",Sym[nr_nr].sy_name);
form_alert( 1,fehler);
exit(0);
}
weiter=1;
for(i=0;weiter;i++) /* Die Symboltabelle durchgehen */
{ pos+=sym_e[i].Position;
switch((int)sym_e[i].Type)
{ case 2: /*Advance eigentl *256 aber 1* ist schon */
pos+=(int)sym_e[i].Position*255;
break;
case 4: /*Start new data segment: */
case 7: /*Define new global module: */
case 9: /*Define new local module: */
weiter=0; /*Neue Routine */
break;
case 11: /*Absolut long reference to: */
if(!Sym[sym_e[i].Wert].sy_atxt)
{ ziel_err=i;
weiter=0;
if(Sym[sym_e[i].Wert].sy_rel2!=-1)
err=3;
else
err=1;
}
else
{ *(long *)&ptr[pos]+=Sym[sym_e[i].Wert].sy_atxt;
n_rout->reloz[n_rout->anz_r++]=pos;
}
break;
case 14: /*PC-relative word reference to: */
if(Sym[sym_e[i].Wert].sy_atxt==0l)
{ ziel_err=i;
if(Sym[sym_e[i].Wert].sy_rel2!=-1)
err=3;
else
err=1;
weiter=0;
}
else
{ delta=(Sym[sym_e[i].Wert].sy_atxt-pos);
if(labs(delta)<0x7ffel)
*(int *)&ptr[pos]=(int)delta;
else
{ err=2;
ziel_err=i;
}
}
break;
case 1: /*End of object */
case 3: /*Start new text segment: */
case 5: /*Start new bss segment: */
case 6: /*Start new offset segment: */
sprintf(fehler,"[1][%s| hat einen unerwarteten|Eintrag in Symboltabelle|bzw an unerwarteter Stelle][Abbruch]",Sym[nr_nr].sy_name);
form_alert( 1,fehler);
exit(0);
break; /*hier ignorieren */
}
}
switch(err)
{ case 0: /* alles OK */
break;
case 2: /* relativer Sprung zu gro₧ */
sprintf(fehler,"[3][Der Verwei₧ von '%s'|nach '%s'|ist für einen relativen Sprung zu gro₧.][Abbruch]",Sym[nr_nr].sy_name,Sym[sym_e[ziel_err].Wert].sy_name);
form_alert( 1,fehler);
exit(0);
break;
case 1:
sprintf(fehler,"[3][Beim Einfügen von '%s'|ist die Adresse von '%s'|unbekannt ][Abbruch]",Sym[nr_nr].sy_name,Sym[sym_e[ziel_err].Wert].sy_name);
form_alert( 1,fehler);
exit(0);
break;
case 3:
sprintf(fehler,"[3][Beim Einfügen von '%s'|ist die Adresse von '%s'|nur relativ zu %s|bekannt.][Abbruch]",Sym[nr_nr].sy_name,Sym[sym_e[ziel_err].Wert].sy_name,Sym[Sym[sym_e[ziel_err].Wert].sy_rel2].sy_name);
form_alert( 1,fehler);
exit(0);
break;
}
fwrite(Sym[nr_nr].sy_aram,1,Sym[nr_nr].sy_len,F_out); /*die neuen Routinen */
{ form_alert(2,"[1][Dies ist eine mir fremde PD-Version! Falls| es sich nicht um einen Fehler handelt| Bitte PD_ADDR.DAT löschen und Programm neu starten][Bis dann]");