/ ld1 -- link editor orig: sys intr; sintr mov (sp)+,r0 dec r0 bgt 1f sys exit 1: mov r0,argc mov sp,argp 1: jsr r5,nxtarg br pass2 jsr r5,load1 br 1b pass2: sys creat; l.out; 0 bec 1f clr filnam jsr r5,mesg; outfile sys exit 1: mov r0,fout mov txtsiz,r1 mov datsiz,r2 mov r1,r3 add r2,r3 / bss origin clr r4 mov $symtab,r5 1: cmp r5,esymp bhis 1f cmp 10(r5),$40 / undefined bne 2f mov 12(r5),r0 / common? beq 2f / no mov r4,12(r5) / common origin add r3,12(r5) inc r0 bic $1,r0 / even add r0,r4 / new common origin mov $47,10(r5) / temp. common type 2: add $14,r5 br 1b 1: add r4,bsssiz mov $symtab,r5 1: cmp r5,esymp bhis 1f cmp 10(r5),$43 blt 2f / undef, abs or text beq 3f cmp 10(r5),$47 / common bne 4f mov $44,10(r5) / set bss br 2f 4: add r2,12(r5) / bss add r4,12(r5) / common total 3: add r1,12(r5) / data 2: add $14,r5 br 1b 1: mov r1,fdatorg mov r3,fbssorg add r4,fbssorg mov symsiz,locsymsiz add esymp,symsiz sub $symtab,symsiz tst sqflg beq 1f clr symsiz 1: jsr r5,oattach; otxtp; zero add $20,oattpt jsr r5,oattach; odatp; txtsiz tst relflg / suppress relocation? bne 1f jsr r5,oattach; otrelp; datsiz jsr r5,oattach; odrelp; txtsiz 1: jsr r5,oattach; osymp; datsiz tst entptr beq 1f tst exorig beq 2f jsr r5,mesg; mulent / too many entry points 2: mov entptr,r0 mov 12(r0),exorig inc exorig / 0 entry means none 1: mov $7,-(sp) mov $magic,r1 / write magic at start mov (r1)+,r0 jsr r5,putwrd; otxtp 1: mov (r1)+,r0 jsr r5,putwrd; otxtp dec (sp) bne 1b tst (sp)+ clr txtsiz clr datsiz clr bsssiz clr *rlistp mov $rlist,rlistp 1: jsr r5,nxtarg2 br 1f jsr r5,load2 br 1b 1: jsr r5,flush; otxtp jsr r5,flush; odatp tst relflg bne 1f jsr r5,flush; otrelp jsr r5,flush; odrelp 1: mov $symtab,r1 1: cmp r1,esymp bhis 1f cmp 10(r1),$40 bne 2f mov r1,r0 clr filnam jsr r5,smesg; undmes 2: tst sqflg bne 1b 3: mov $6,r2 2: mov (r1)+,r0 jsr r5,putwrd; osymp dec r2 bne 2b br 1b 1: jsr r5,flush; osymp done: sys unlink; a.out sys link; l.out; a.out bec 1f clr filnam jsr r5,mesg; movemes sys exit 1: sys unlink; l.out sys chmod; a.out; outmod: 37 sys exit sintr: sys unlink; l.out sys exit load1: mov txtsiz,txtorg mov datsiz,datorg sub ctxtsiz,datorg mov bsssiz,bssorg sub ctxtsiz,bssorg sub cdatsiz,bssorg mov $14,locsymsiz clr ndef mov r5,-(sp) mov esymp,-(sp) mov $local,r5 jsr r5,attach; txtp; csymorg 1: jsr r5,getsym bvs 1f cmp symbol+10,$40 bge 2f / external tst xtflg bne 1b add $14,locsymsiz / count locals br 1b 2: jsr r5,lookup mov (r4),r0 beq 2f / not yet in table cmp 10(r0),$40 bgt 1b / multiply defined cmp symbol+10,$40 ble 3f inc ndef / remember def occurred br 3f 2: mov r4,(r5)+ jsr r5,enter cmp symbol+10,$40 ble 1b / undefined symbol 3: jsr r5,relsym mov (r4),r0 mov symbol+10,10(r0) mov symbol+12,12(r0) br 1b 1: tst libflg / load anyway if not library beq 1f tst ndef / load library if any definitions bne 1f mov (sp)+,esymp / rip out symbols 2: cmp r5,$local / see if end of entered symbols blos 2f clr *-(r5) / rip out hash entry br 2b 1: tst (sp)+ tst entry beq 1f add txtorg,entry tst exorig beq 5f jsr r5,mesg; mulent 5: mov entry,exorig 1: add locsymsiz,symsiz / total of local symbs mov rlistp,r0 cmp r0,$rliste blo 1f jsr r5,mesg; toomany jmp done 1: mov reopened,r1 bne 1f mov *argp,r1 cmp r1,$libfil bne 1f movb wlib,r1 / library, just remember letter name 1: mov r1,(r0)+ mov libflg,(r0)+ / remember start of routine beq 3f / not library bis $1,reopened 3: mov r0,rlistp jsr r5,addin 2: mov (sp)+,r5 rts r5 load2: mov txtsiz,txtorg mov fdatorg,r0 add datsiz,r0 sub ctxtsiz,r0 mov r0,datorg mov fbssorg,r0 add bsssiz,r0 sub ctxtsiz,r0 sub cdatsiz,r0 mov r0,bssorg mov r5,-(sp) jsr r5,attach; txtp; csymorg mov $local,r5 mov $-1,-(sp) / local symbol index mov filnam,r1 2: tstb (r1)+ bne 2b 2: cmp r1,filnam blos 2f cmpb -(r1),$'/ bne 2b tstb (r1)+ 2: mov $symbol,r0 2: movb (r1)+,(r0)+ bne 3f tstb -(r1) 3: cmp r0,$symbol+8. blo 2b mov $37,symbol+10 mov txtorg,symbol+12 tst sqflg bne 1f jsr r5,wrlocsym 1: jsr r5,getsym bvs 1f jsr r5,relsym inc (sp) cmp symbol+10,$40 blo 5f jsr r5,lookup tst (r4) bne 6f jsr r5,mesg; snotfound br 1b 6: cmp symbol+10,$40 bgt 2f beq 4f 5: tst xtflg bne 1b / skip locals jsr r5,wrlocsym / write local symbol br 1b 2: mov (r4),r0 cmp 10(r0),symbol+10 bne 2f cmp 12(r0),symbol+12 beq 4f 2: jsr r5,smesg; multi 4: cmp r5,$elocal blo 3f jsr r5,mesg; locovflo jmp done 3: mov (sp),(r5)+ / save local index mov (r4),(r5)+ / save symbol location br 1b 1: mov r5,locp tst (sp)+ jsr r5,attach; txtp; ctxtorg jsr r5,attach; relp; ctrelorg mov txtsiz,relbas 1: jsr r5,txtlod br 1f tst relflg bne 2f jsr r5,putwrd; otrelp 2: mov r3,r0 jsr r5,putwrd; otxtp br 1b 1: jsr r5,attach; txtp; cdatorg jsr r5,attach; relp; cdrelorg mov datorg,r0 mov r0,relbas mov r5,locp mov (sp)+,r5 1: jsr r5,txtlod br 1f tst relflg bne 2f jsr r5,putwrd; odrelp 2: mov r3,r0 jsr r5,putwrd; odatp br 1b 1: jsr r5,addin rts r5 txtlod: jsr r5,getwrd; txtp bvs 1f tst (r5)+ mov r0,r3 jsr r5,getwrd; relp bvc 2f jsr r5,mesg; relerr sys exit 2: mov r0,r2 bic $1,r2 bic $!17,r0 cmp r0,$7 blos 3f / external symbol reference clc ror r2 asr r2 asr r2 asr r2 / get symbol number jsr r5,lookloc / get symbol cmp 10(r4),$40 bgt 2f / still undefined sub $symtab,r4 add locsymsiz,r4 mov r4,mq mov $14,div mov $4,lsh bis mq,r0 rts r5 2: / symbol now defined add 12(r4),r3 / symbol value mov 10(r4),r2 sub $41,r2 bic $!1,r0 bne 4f tst r2 beq 5f / not relative & relocatable add dotdot,r3 br 5f 4: tst r2 bne 5f / relative & absolute sub dotdot,r3 5: asl r2 bis r2,r0 br relrel / absolute, text, data, or bss symbol 3: add *reltab(r2),r3 relrel: bit $1,r0 beq 1f sub relbas,r3 / relative relocation 1: rts r5 wrlocsym: mov $symbol,r1 mov $6,-(sp) 3: mov (r1)+,r0 jsr r5,putwrd; osymp / write out local symbol dec (sp) bne 3b tst (sp)+ rts r5