Research V2 development
authorDennis Ritchie <dmr@research.uucp>
Thu, 29 Jun 1972 19:26:31 +0000 (14:26 -0500)
committerDennis Ritchie <dmr@research.uucp>
Thu, 29 Jun 1972 19:26:31 +0000 (14:26 -0500)
Work on file cmd/ld1.s
Work on file cmd/ld2.s
Work on file cmd/ldx.s

Synthesized-from: v2

cmd/ld1.s [new file with mode: 0644]
cmd/ld2.s [new file with mode: 0644]
cmd/ldx.s [new file with mode: 0644]

diff --git a/cmd/ld1.s b/cmd/ld1.s
new file mode 100644 (file)
index 0000000..bafdf3c
--- /dev/null
+++ b/cmd/ld1.s
@@ -0,0 +1,475 @@
+/ 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; 017
+       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
+       tst     sqflg
+       beq     1f
+       clr     symsiz
+1:
+       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
+       beq     3f
+       add     $14,r1
+       br      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
+       inc     ndef            / remember def occurred
+       cmp     symbol+10,$40
+       bgt     3f
+       dec     ndef            / forget def occurred
+       cmp     12(r0),symbol+12        / extend common region?
+       bge     1b
+       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     r5,-(sp)
+       mov     r4,r5
+       clr     r4
+       dvd     $14,r4
+       als     $4,r4
+       bis     r4,r0
+       mov     (sp)+,r5
+       br      relrel
+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
+
+dd     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     rel
\ No newline at end of file
diff --git a/cmd/ld2.s b/cmd/ld2.s
new file mode 100644 (file)
index 0000000..9b2768f
--- /dev/null
+++ b/cmd/ld2.s
@@ -0,0 +1,560 @@
+/ ld2 -- link editor
+
+attach:
+       mov     (r5)+,r1        / buffer
+       mov     (r5)+,r2        / file origin, size
+       mov     (r2),0f         / seek ptr
+       mov     fin,r0
+       sys     seek; 0:..; 0
+       mov     (r2),r0
+       bis     $777,r0
+       inc     r0              / start of next block
+       add     $10,r1
+       mov     r1,-(sp)
+       add     $1000,(sp)      / buf max
+       mov     r0,-(r1)        / next seek ptr
+       mov     (sp),-(r1)
+       sub     (r2)+,r0        /  left in buffer
+       sub     r0,(sp)         / next buffer word
+       mov     (sp),-(r1)
+       mov     (sp)+,0f        / buffer loc
+       cmp     (r2),r0
+       bge     1f
+       mov     (r2),r0
+1:
+       mov     r0,0f+2         / number to read
+       mov     (r2),-(r1)      / left in file
+       jsr     r5,rdchk; 0:..; ..
+       rts     r5
+
+rdchk:
+       mov     (r5)+,0f
+       mov     (r5)+,0f+2
+       mov     fin,r0
+       sys     read; 0:..; ..
+       bes     1f
+       cmp     r0,0b+2
+       bne     1f
+       rts     r5
+1:
+       jsr     r5,mesg; premeof
+       jmp     sintr
+
+getwrd:
+       mov     (r5)+,r1
+       sub     $2,(r1)+        / left in file
+       bge     1f
+       sev                     / end of file
+       rts     r5
+1:
+       mov     (r1)+,r2        / word ptr
+       cmp     r2,(r1)+        / eob ptr
+       bhis    1f              / end of buffer
+       mov     (r2)+,r0
+       mov     r2,-4(r1)
+       rts     r5
+1:
+       mov     (r1),0f
+       mov     fin,r0
+       sys     seek; 0:..; 0
+       add     $1000,(r1)+     / new seek ptr
+       mov     r1,0f
+       mov     -10(r1),r0      / left in file
+       add     $2,r0
+       cmp     r0,$1000
+       ble     1f
+       mov     $1000,r0        / read 1000 at most
+1:
+       mov     r0,0f+2
+       jsr     r5,rdchk; 0:..; ..
+       mov     (r1)+,r0
+       mov     r1,-10(r1)      / new next word
+       rts     r5
+
+oattach:
+       mov     (r5)+,r1
+       mov     (r5)+,r2
+       mov     oattpt,r0
+       add     (r2),r0
+       mov     r0,oattpt
+       mov     r0,r2
+       bic     $!777,r0
+       add     r1,r0
+       add     $6,r0
+       mov     r0,(r1)+        / next slot
+       mov     r1,r0
+       add     $1004,r0
+       mov     r0,(r1)+        / buf max
+       mov     r2,(r1)+        / seek addr
+       rts     r5
+
+putwrd:
+       mov     r1,-(sp)
+       mov     r2,-(sp)
+       mov     (r5)+,r2
+       mov     (r2)+,r1        / slot
+       cmp     r1,(r2)         / buf max
+       bhis    1f
+       mov     r0,(r1)+
+       mov     r1,-(r2)
+       br      2f
+1:
+       tst     (r2)+
+       mov     r0,-(sp)
+       jsr     r5,flush1
+       mov     (sp)+,*(r2)+
+       add     $2,-(r2)
+2:
+       mov     (sp)+,r2
+       mov     (sp)+,r1
+       rts     r5
+
+flush:
+       mov     (r5)+,r2
+       cmp     (r2)+,(r2)+
+flush1:
+       mov     (r2)+,r1
+       mov     r1,0f           / seek address
+       mov     fout,r0
+       sys     seek; 0:..; 0
+       bic     $!777,r1
+       add     r2,r1           / write address
+       mov     r1,0f
+       mov     r2,r0
+       bis     $777,-(r2)
+       inc     (r2)            / new seek addr
+       cmp     -(r2),-(r2)
+       sub     (r2),r1
+       neg     r1
+       mov     r1,0f+2         / count
+       mov     r0,(r2)         / new next slot
+       mov     fout,r0
+       sys     write; 0:..; ..
+       rts     r5
+
+lookup:
+       mov     $symbol,r1
+       mov     (r1)+,r0
+       add     (r1)+,r0
+       add     (r1)+,r0
+       add     (r1)+,r0
+       mov     r0,r1
+       clr     r0
+       dvd     $hshsiz,r0
+       mov     r1,r4
+       asl     r4
+       add     $hshtab,r4
+1:
+       mov     (r4)+,r0
+       beq     3f              / not found
+       mov     $symbol,r1
+       cmp     (r1)+,(r0)+
+       bne     2f
+       cmp     (r1)+,(r0)+
+       bne     2f
+       cmp     (r1)+,(r0)+
+       bne     2f
+       cmp     (r1)+,(r0)+
+       bne     2f
+3:
+       tst     -(r4)
+       rts     r5
+2:
+       cmp     r4,$2*hshsiz+hshtab
+       blo     1b
+       mov     $hshtab,r4
+       br      1b
+
+enter:
+       mov     esymp,r0
+       add     $14,r0
+       cmp     r0,0f
+       blo     1f
+       add     $500.,r0
+       mov     r0,0f
+       sys     break; 0:symtab
+1:
+       mov     esymp,r0
+       mov     r0,(r4)
+       mov     $symbol,r1
+       mov     $6,-(sp)
+1:
+       mov     (r1)+,(r0)+
+       dec     (sp)
+       bne     1b
+       mov     r0,esymp
+       tst     (sp)+
+       rts     r5
+
+smesg:
+       mov     r1,-(sp)
+       mov     r0,-(sp)
+       jsr     pc,1f
+       tst     filnam
+       beq     2f
+       mov     $1,r0
+       sys     write; qsemi; 1
+2:
+       mov     (sp)+,r1
+       mov     $8.,-(sp)
+3:
+       movb    (r1)+,ch
+       beq     4f
+       mov     $1,r0
+       sys     write; ch; 1
+4:
+       dec     (sp)
+       bne     3b
+       tst     (sp)+
+       mov     (sp)+,r1
+       br      2f
+
+mesg:
+       jsr     pc,1f
+       mov     $1,r0
+2:
+       sys     write; qnl; 1
+       rts     r5
+
+1:
+       mov     $17,outmod              / make a.out nonexecutable
+       mov     r1,-(sp)
+       mov     (r5)+,r1
+1:
+       movb    (r1)+,ch
+       beq     1f
+       mov     $1,r0
+       sys     write; ch; 1
+       br      1b
+1:
+       mov     filnam,r1
+       beq     9f
+1:
+       movb    (r1)+,ch
+       beq     1f
+       mov     $1,r0
+       sys     write; ch; 1
+       br      1b
+1:
+9:
+       mov     (sp)+,r1
+       rts     pc
+
+getsym:
+       mov     $6,-(sp)
+       mov     $symbol,r4
+1:
+       jsr     r5,getwrd; txtp
+       bvs     2f
+       mov     r0,(r4)+
+       dec     (sp)
+       bne     1b
+       tst     (sp)+
+       rts     r5
+2:
+       tst     (sp)+
+       sev
+       rts     r5
+
+nxtarg2:
+       mov     rlistp,r1
+       add     $4,rlistp
+       mov     (r1)+,r0
+       beq     1f              / end of args
+       cmp     r0,$177         / see if system library
+       bhi     2f
+       cmp     r0,$1           / see if archive
+       beq     3f
+       movb    r0,wlib
+       mov     $libfil,r0
+2:
+       jsr     r5,aopen
+               br nxtarg2
+3:
+       mov     (r1),libflg
+       beq     2f
+       sub     $20,(r1)
+       mov     (r1),0f
+       mov     fin,r0
+       sys     seek; 0:..; 0
+2:
+       mov     fin,r0
+       sys     read; arcmag; 40
+       bes     bform1
+       cmp     r0,$20
+       blt     bform1
+       mov     $arcmag,r4
+       tst     (r1)+
+       beq     filstrt
+       cmp     r0,$40
+       bne     bform1
+       br      libstrt
+1:
+       rts     r5
+
+bform1:
+       jmp     bform
+
+nxtarg:
+       add     libnxt,libflg   / see if library
+       beq     advarg          / no
+       mov     libflg,0f
+       mov     fin,r0
+       sys     seek; 0:..; 0
+       mov     fin,r0
+       sys     read; arcmag+2; 40      / get arc header, seg hdr
+       mov     $arcmag+2,r4
+       add     $20,libflg
+       cmp     r0,$40
+       beq     libstrt         / not end of libr
+advarg:
+       dec     argc
+       bge     1f
+       rts     r5
+1:
+       mov     argp,r1
+       tst     (r1)+
+       mov     r1,argp
+       cmpb    *(r1),$'-
+       bne     opnarg
+       jsr     r5,specarg
+               br advarg
+opnarg:
+       clr     libflg
+       clr     libnxt
+       mov     *argp,r0
+       clr     reopened
+       jsr     r5,aopen
+               br advarg
+       mov     fin,r0
+       sys     read; arcmag; 42 / read arc header if any, file hdr
+       bes     bform
+       mov     r0,r3
+       mov     $arcmag,r4
+       add     r4,r3
+       cmp     r3,$arcmag+20
+       blo     bform
+       cmp     (r4),arcmagic
+       bne     filstrt
+       cmp     r3,$arcmag+42
+       blo     bform
+       tst     (r4)+
+       mov     $22,libflg
+libstrt:
+       mov     16(r4),r0       / next library start
+       inc     r0
+       bic     $1,r0
+       mov     r0,libnxt
+       clr     14(r4)          / end of name
+       mov     r4,filnam       / archive entry name
+       add     $20,r4          / point to file start
+filstrt:
+       cmp     (r4)+,magic     / see if object file
+       bne     bform
+       mov     $ctxtorg,r1
+       mov     libflg,r2       / text origin in file
+       add     $20,r2          / skip header
+       mov     (r4)+,r0
+       mov     r2,(r1)+        / text origin
+       mov     r0,(r1)+        / text size
+       add     r0,r2
+       mov     (r4)+,r0
+       mov     r2,(r1)+        / data origin
+       mov     r0,(r1)+        / data size
+       add     r0,r2
+       mov     (r4)+,(r1)+     / bss size
+       mov     r2,(r1)+        / text reloc origin
+       mov     ctxtsiz,(r1)    / text reloc size
+       add     (r1)+,r2
+       mov     r2,(r1)+        / data reloc origin
+       mov     cdatsiz,(r1)    / data size
+       add     (r1)+,r2
+       mov     (r4)+,r0
+       mov     r2,(r1)+        / symbol table origin
+       mov     r0,(r1)+        / symbol table size
+       mov     (r4)+,r0        / stack size
+       cmp     r0,stksiz
+       blo     1f
+       mov     r0,stksiz
+1:
+       mov     (r4)+,entry     / entry
+       tst     (r4)+           / relocation suppressed?
+       beq     1f
+       jsr     r5,mesg; norel
+       rts     r5
+1:
+       tst     (r5)+
+       rts     r5
+
+bform:
+       jsr     r5,mesg; format
+       jmp     sintr
+
+specarg:
+       mov     (r1),r0
+       movb    1(r0),r0
+       cmpb    r0,$'u
+       beq     use
+       cmpb    r0,$'l
+       beq     libarg
+       cmpb    r0,$'x
+       beq     xtsym
+       cmpb    r0,$'e
+       beq     entarg
+       cmpb    r0,$'r
+       beq     savrel
+       cmpb    r0,$'s
+       beq     squash
+       rts     r5
+
+squash:
+       inc     sqflg
+       inc     xtflg
+       rts     r5
+
+savrel:
+       clr     relflg
+       rts     r5
+
+xtsym:
+       inc     xtflg
+       rts     r5
+
+libarg:
+       movb    $'a,wlib
+       mov     (r1),r1
+       movb    2(r1),r0
+       beq     1f
+       movb    r0,wlib
+1:
+       mov     $libfil,*argp
+       tst     (r5)+
+       rts     r5
+
+entarg:
+       clr     r4
+       jsr     r5,use
+       mov     (r4),entptr
+       rts     r5
+
+use:
+       dec     argc
+       blt     2f
+       add     $2,argp
+       mov     *argp,r0
+       mov     $symbol,r1
+       mov     $8.,-(sp)
+1:
+       movb    (r0)+,(r1)+
+       beq     1f
+       dec     (sp)
+       bgt     1b
+1:
+       dec     (sp)
+       ble     1f
+       clrb    (r1)+
+       br      1b
+1:
+       tst     (sp)+
+       mov     $40,(r1)+
+       clr     (r1)+
+       jsr     r5,lookup
+       tst     (r4)
+       bne     2f
+       jsr     r5,enter
+2:
+       rts     r5
+
+relsym:
+       mov     symbol+10,r0
+       bic     $!37,r0
+       beq     1f
+       cmp     r0,$5
+       bhis    1f
+       asl     r0
+       add     *reltab-2(r0),symbol+12
+1:
+       rts     r5
+
+lookloc:
+       mov     $local,r4
+1:
+       cmp     r4,locp
+       bhis    1f
+       cmp     (r4)+,r2
+       beq     2f
+       tst     (r4)+
+       br      1b
+1:
+       jsr     r5,mesg; snotfound
+       jmp     sintr
+2:
+       mov     (r4),r4
+       rts     r5
+
+aopen:
+       clr     reopened
+       mov     r0,0f
+       mov     r0,filnam
+       mov     fin,r0
+       beq     1f
+       sys     close
+1:
+       sys     open; 0:..; 0
+       bec     1f
+       jsr     r5,mesg; fnotfound
+       rts     r5
+1:
+       mov     r0,fin
+       tst     (r5)+
+       rts     r5
+
+addin:
+       add     ctxtsiz,txtsiz
+       add     cdatsiz,datsiz
+       add     cbsssiz,bsssiz
+       rts     r5
+
+
+       mov     symbol+10,r0
+       bic     $!37,r0
+       beq     1f
+       cmp     r0,$5
+       bhis    1f
+       asl     r0
+       add     *reltab-2(r0),symbol+12
+1:
+       rts     r5
+
+lookloc:
+       mov     $local,r4
+1:
+       cmp     r4,locp
+       bhis    1f
+       cmp     (r4)+,r2
+       beq     2f
+       tst     (r4)+
+       br      1b
+1:
+       jsr     r5,mesg; snotfound
+       jmp     sintr
+2:
+       mov     (r4),r4
+       rts     r5
+
+aopen:
+       clr     reopened
+       mov     r0,0f
+       mov     r0,filnam
+       mov     fin,r0
+       beq     1f
+       sys     close
+1:
+       sys     open; 0:..; 0
+       bec     1f
+       jsr     r5,mesg; fnotfound
+       rts     r5
+1:
+       mov     r0,fin
+       tst     (r5)+
+       
\ No newline at end of file
diff --git a/cmd/ldx.s b/cmd/ldx.s
new file mode 100644 (file)
index 0000000..227d2b6
--- /dev/null
+++ b/cmd/ldx.s
@@ -0,0 +1,172 @@
+/ ldx -- link editor
+
+a.out:
+       <a.out\0>
+l.out:
+       <l.out\0>
+undmes:
+       <un: \0>
+movemes:
+       <Can't move output file\0>
+norel:
+       <No relocation bits: \0>
+toomany:
+       <Too many routines loaded at: \0>
+multi:
+       <Multiply defined: \0>
+locovflo:
+       <Too many symbols in: \0>
+relerr:
+       <Relocation error in: \0>
+premeof:
+       <Premature EOF on: \0>
+outfile:
+       <ld: can't create l.out\n\0>
+fnotfound:
+       <File not found: \0>
+format:
+       <Format error: \0>
+snotfound:
+       <Symbol not found: \0>
+mulent:
+       <Multiple entry point:\0>
+
+libfil:
+       </lib/lib>
+wlib:
+       <a>
+       <.a\0>
+qnl:
+       <\n>
+qsemi:
+       <;>
+
+       .even
+
+dotdot:        ..
+zero:  0
+rlistp:        rlist
+esymp: symtab
+
+reltab:
+       zero
+       txtorg
+       datorg
+       bssorg
+
+arcmagic:
+       -147.
+
+magic:
+       br      .+20
+txtsiz:        .=.+2
+datsiz:        .=.+2
+bsssiz:        .=.+2
+symsiz:        .=.+2
+stksiz:        .=.+2
+exorig:        .=.+2
+relflg:        1
+
+       .bss
+
+libflg:        .=.+2
+sqflg: .=.+2
+entptr:        .=.+2
+entry: .=.+2
+xtflg: .=.+2
+txtorg:        .=.+2
+datorg:        .=.+2
+bssorg:        .=.+2
+fdatorg: .=.+2
+fbssorg: .=.+2
+
+ctxtorg:.=.+2
+ctxtsiz:.=.+2
+cdatorg:.=.+2
+cdatsiz:.=.+2
+cbsssiz: .=.+2
+ctrelorg:.=.+2
+ctrelsiz:.=.+2
+cdrelorg:.=.+2
+cdrelsiz:.=.+2
+csymorg: .=.+2
+csymsiz: .=.+2
+
+arcmag:        .=.+42
+
+argc:  .=.+2
+argp:  .=.+2
+oattpt:        .=.+2
+locp:  .=.+2
+locsymsiz:.=.+2
+fout:  .=.+2
+fin:   .=.+2
+reopened:.=.+2
+ndef:  .=.+2
+ch:    .=.+2
+filnam:        .=.+2
+relbas:        .=.+2
+libnxt:        .=.+2
+symbol:        .=.+14
+
+txtp:  .=.+10+512.
+relp:  .=.+10+512.
+otxtp: .=.+6+512.
+odatp: .=.+6+512.
+osymp: .=.+6+512.
+otrelp:        .=.+6+512.
+odrelp:        .=.+6+512.
+
+rlist: .=.+512.
+rliste:
+
+local: .=.+1024.
+elocal:
+
+hshsiz = 1000.
+hshtab:        .=2*hshsiz+.
+
+symtab:
+esymtab = orig+16384.-300.
+
+relorg:.=.+2
+cdrelsiz:.=.+2
+csymorg: .=.+2
+csymsiz: .=.+2
+
+arcmag:        .=.+42
+
+argc:  .=.+2
+argp:  .=.+2
+oattpt:        .=.+2
+locp:  .=.+2
+locsymsiz:.=.+2
+fout:  .=.+2
+fin:   .=.+2
+reopened:.=.+2
+ndef:  .=.+2
+ch:    .=.+2
+filnam:        .=.+2
+relbas:        .=.+2
+libnxt:        .=.+2
+symbol:        .=.+14
+
+txtp:  .=.+10+512.
+relp:  .=.+10+512.
+otxtp: .=.+6+512.
+odatp: .=.+6+512.
+osymp: .=.+6+512.
+otrelp:        .=.+6+512.
+odrelp:        .=.+6+512.
+
+rlist: .=.+512.
+rliste:
+
+local: .=.+1024.
+elocal:
+
+hshsiz = 1000.
+hshtab:        .=2*hshsiz+.
+
+symtab:
+esymtab = orig+163
\ No newline at end of file