mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-04-14 07:50:43 +00:00
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.
517 lines
6.6 KiB
ArmAsm
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
|