/* dynamic linker for psalgol */ #include #include #include #include "link.h" #define NOP 0x90 /* nop */ #define CALLFAR 0x9a extern int maxproc; #define LINK_VEC 0x18 /* first level linker to link to C procs */ extern struct identifier PROCNAME[]; extern int far *proctable[]; LINK(es,ds,pc,cs,psf)int es,ds,pc,cs,psf; { char far * origin ,*name; int len,i; name= (char *)MK_FP(cs,pc); len = strlen(name); origin= &(name[-2]); origin[0] = NOP; origin[1] = CALLFAR; if (replace(name)){ for(i=4;i<=(len);i++)name [i] = NOP; } else { printf("linker error can not find %s\n",name); saerror("called by linker"); } } extern int LINKER(); linkinstall() { /* install the linker using the linker interrupt */ int far (**iv)(); (int *)iv =(int *) MK_FP(0,LINK_VEC * 4); *iv = LINKER; } int freename; replace (n)char *n; { int i; int **p; (char *)p = &n[0]; for(i=0;i0x0ffffL)saerror("segment too big"); size = PSP + ls; base = heapalloc(size); lseek(f,0L,0); _read(f,&base[PSP],size -PSP); _close(f); return base; } static char *findseg(char *s) /* look for and load a segment */ { int i; for(i=0;i