1
0
mirror of https://github.com/DoctorWkt/unix-jun72.git synced 2026-04-14 07:50:43 +00:00
Files
DoctorWkt.unix-jun72/src/cmd/ld2.s
warren.toomey 547fef522b Doug Merritt has provided all of his reconstructed files, and Warren has
compared them to his set. Both sets had errors, and having the two was
immensely helpful. This commit checks in the new files and the ones from
Warren's set which needed to be modified to fix mistakes.
2008-05-15 01:41:16 +00:00

517 lines
6.6 KiB
ArmAsm

/ 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