From 45ebdd66d8a883ba23f1e78aa44afa2583537551 Mon Sep 17 00:00:00 2001 From: "warren.toomey" Date: Thu, 15 May 2008 00:59:49 +0000 Subject: [PATCH] Warren and Doug Merritt have worked on rebuilding the code fragments from the s1-bits tape. Doug has provided as11.s as12.s as13.s as14.s as15.s as16.s as17.s as18.s as19.s as21.s as22.s as23.s as24.s as25.s as26.s as27.s as28.s as29.s, and Warren has compared against his production, and against V5 (to determine the correct trailing blank line). These files can be considered authentic. The other file's are Warren's production only, so we need to compare against Doug's versions to ensure correctness. --- src/cmd/acct.s | 413 +++++++++++++++++++++++ src/cmd/ar.s | 539 ++++++++++++++++++++++++++++++ src/cmd/as11.s | 90 +++++ src/cmd/as12.s | 75 +++++ src/cmd/as13.s | 134 ++++++++ src/cmd/as14.s | 206 ++++++++++++ src/cmd/as15.s | 166 ++++++++++ src/cmd/as16.s | 264 +++++++++++++++ src/cmd/as17.s | 217 ++++++++++++ src/cmd/as18.s | 61 ++++ src/cmd/as19.s | 328 ++++++++++++++++++ src/cmd/as21.s | 194 +++++++++++ src/cmd/as22.s | 130 ++++++++ src/cmd/as23.s | 128 +++++++ src/cmd/as24.s | 126 +++++++ src/cmd/as25.s | 1 + src/cmd/as26.s | 450 +++++++++++++++++++++++++ src/cmd/as27.s | 260 +++++++++++++++ src/cmd/as28.s | 74 +++++ src/cmd/as29.s | 263 +++++++++++++++ src/cmd/bas0.s | 346 +++++++++++++++++++ src/cmd/bas1.s | 284 ++++++++++++++++ src/cmd/cat.s | 64 ++++ src/cmd/cc.c | 268 +++++++++++++++ src/cmd/chmod.s | 42 +++ src/cmd/chown.s | 101 ++++++ src/cmd/cmp.s | 122 +++++++ src/cmd/colon.s | 33 ++ src/cmd/cp.c | 4 +- src/cmd/date.s | 119 +++++++ src/cmd/db1.s | 721 ++++++++++++++++++++++++++++++++++++++++ src/cmd/db2.s | 367 +++++++++++++++++++++ src/cmd/db3.s | 330 ++++++++++++++++++ src/cmd/db4.s | 77 +++++ src/cmd/dc2.s | 329 ++++++++++++++++++ src/cmd/dc3.s | 451 +++++++++++++++++++++++++ src/cmd/dc4.s | 407 +++++++++++++++++++++++ src/cmd/dc5.s | 372 +++++++++++++++++++++ src/cmd/df.s | 76 +++++ src/cmd/dsw.s | 92 ++++++ src/cmd/dusg.s | 198 +++++++++++ src/cmd/fc.c | 127 +++++++ src/cmd/fed2.s | 533 ++++++++++++++++++++++++++++++ src/cmd/fed3.s | 358 ++++++++++++++++++++ src/cmd/form1.s | 165 +++++++++ src/cmd/form2.s | 92 ++++++ src/cmd/form3.s | 147 +++++++++ src/cmd/form4.s | 250 ++++++++++++++ src/cmd/form5.s | 789 ++++++++++++++++++++++++++++++++++++++++++++ src/cmd/form6.s | 456 +++++++++++++++++++++++++ src/cmd/fstrip.s | 200 +++++++++++ src/cmd/getty.s | 179 ++++++++++ src/cmd/glob.c | 193 +++++++++++ src/cmd/goto.c | 64 ++++ src/cmd/if.c | 99 ++++++ src/cmd/init.s | 208 ++++++++++++ src/cmd/ld1.s.part1 | 475 ++++++++++++++++++++++++++ src/cmd/ld2.s.part1 | 560 +++++++++++++++++++++++++++++++ src/cmd/ldx.s | 130 ++++++++ src/cmd/ln.s | 49 +++ src/cmd/login.s | 280 ++++++++++++++++ src/cmd/mak | 23 ++ src/cmd/unknown.c | 80 +++++ 63 files changed, 14377 insertions(+), 2 deletions(-) create mode 100644 src/cmd/acct.s create mode 100644 src/cmd/ar.s create mode 100644 src/cmd/as11.s create mode 100644 src/cmd/as12.s create mode 100644 src/cmd/as13.s create mode 100644 src/cmd/as14.s create mode 100644 src/cmd/as15.s create mode 100644 src/cmd/as16.s create mode 100644 src/cmd/as17.s create mode 100644 src/cmd/as18.s create mode 100644 src/cmd/as19.s create mode 100644 src/cmd/as21.s create mode 100644 src/cmd/as22.s create mode 100644 src/cmd/as23.s create mode 100644 src/cmd/as24.s create mode 100644 src/cmd/as25.s create mode 100644 src/cmd/as26.s create mode 100644 src/cmd/as27.s create mode 100644 src/cmd/as28.s create mode 100644 src/cmd/as29.s create mode 100644 src/cmd/bas0.s create mode 100644 src/cmd/bas1.s create mode 100644 src/cmd/cat.s create mode 100644 src/cmd/cc.c create mode 100644 src/cmd/chmod.s create mode 100644 src/cmd/chown.s create mode 100644 src/cmd/cmp.s create mode 100644 src/cmd/colon.s create mode 100644 src/cmd/date.s create mode 100644 src/cmd/db1.s create mode 100644 src/cmd/db2.s create mode 100644 src/cmd/db3.s create mode 100644 src/cmd/db4.s create mode 100644 src/cmd/dc2.s create mode 100644 src/cmd/dc3.s create mode 100644 src/cmd/dc4.s create mode 100644 src/cmd/dc5.s create mode 100644 src/cmd/df.s create mode 100644 src/cmd/dsw.s create mode 100644 src/cmd/dusg.s create mode 100644 src/cmd/fc.c create mode 100644 src/cmd/fed2.s create mode 100644 src/cmd/fed3.s create mode 100644 src/cmd/form1.s create mode 100644 src/cmd/form2.s create mode 100644 src/cmd/form3.s create mode 100644 src/cmd/form4.s create mode 100644 src/cmd/form5.s create mode 100644 src/cmd/form6.s create mode 100644 src/cmd/fstrip.s create mode 100644 src/cmd/getty.s create mode 100644 src/cmd/glob.c create mode 100644 src/cmd/goto.c create mode 100644 src/cmd/if.c create mode 100644 src/cmd/init.s create mode 100644 src/cmd/ld1.s.part1 create mode 100644 src/cmd/ld2.s.part1 create mode 100644 src/cmd/ldx.s create mode 100644 src/cmd/ln.s create mode 100644 src/cmd/login.s create mode 100755 src/cmd/mak create mode 100644 src/cmd/unknown.c diff --git a/src/cmd/acct.s b/src/cmd/acct.s new file mode 100644 index 0000000..bf9e3c1 --- /dev/null +++ b/src/cmd/acct.s @@ -0,0 +1,413 @@ +/ acct -- time accounting + +.globl mesg, qsort, fopen, getw + + mov (sp)+,r5 + tst (sp)+ + +1: + cmp r5,$2 + blt 1f + mov (sp),r0 + cmpb (r0),$'- + bne 1f + cmpb 1(r0),$'d + bne 2f + inc byday + dec r5 + tst (sp)+ + br 1b +2: + cmpb 1(r0),$'p + bne 2f + inc pflg + dec r5 + tst (sp)+ + br 1b +2: + cmpb 1(r0),$'w + bne 1f + dec r5 + tst (sp)+ + cmp r5,$2 + blt 1b + dec r5 + mov (sp)+,filnam + br 1b + +1: + dec r5 + mov r5,argc + mov sp,argp + mov filnam,r0 + jsr r5,fopen; fbuf + bec 1f + jsr r5,mesg + ; .even + sys exit + +1: + setd + +1: + mov $ibuf,r1 +2: + jsr r5,getw; fbuf + bes 1f + mov r0,(r1)+ + cmp r1,$ibuf+16. + blo 2b + jsr pc,loop + br 1b +1: + sys time + mov r0,i.time + mov r1,i.time+2 + clr ibuf + mov $'x,i.tty + jsr pc,loop + jsr pc,print + sys exit + +loop: + clc + ror i.time + ror i.time+2 + setl + movif i.time,fr0 + tst byday + beq 1f + cmpf midnight,fr0 + cfcc + bgt 1f + movf fr0,-(sp) + movf midnight,fr0 + jsr pc,upall + jsr pc,print + jsr pc,clru + movf (sp)+,fr0 + jsr pc,newday +1: + movb i.tty,r0 + mov $ttyf,r1 + cmp r0,$'x + bne 1f + jsr pc,upall + jsr pc,clrt + rts pc +1: + cmp r0,(r1) + beq 1f + add $18.,r1 + cmp r1,$et + blo 1b + br 2f +1: + jsr pc,update + clr (r1) +2: + cmp ibuf,$"\0\0 + bne 1f + rts pc +1: + mov $ttyf,r1 +1: + tst (r1) + beq 1f + add $18.,r1 + br 1b +1: + mov r0,(r1)+ + mov ibuf,(r1)+ + mov ibuf+2,(r1)+ + mov ibuf+4,(r1)+ + mov ibuf+6,(r1)+ + movf fr0,(r1)+ + rts pc + +clrt: + mov $ttyf,r1 +1: + clr (r1)+ + cmp r1,$et + blo 1b + rts pc + +clru: + mov $usrf,r1 +1: + clr (r1)+ + cmp r1,$eu + blo 1b + rts pc + +print: + jsr pc,upall + mov $usrf,r1 + mov r1,r2 + mov $16.,r3 +1: + tst (r2) + beq 1f + add r3,r2 + br 1b +1: + jsr pc,qsort + clrf fr0 + jsr r5,select; 1f + tstf fr0 + cfcc + beq 3f + jsr pc,pdate + mov $total,r2 + jsr pc,ptime + tst pflg + beq 3f + jsr r5,select; 2f +3: + rts pc + +1: + addf 8(r2),fr0 + rts pc + +2: + movf 8(r2),fr0 + jsr pc,pblank + jsr pc,ptime + rts pc + +pdate: + tst byday + bne 1f + rts pc +1: + mov r2,-(sp) + movf fr0,-(sp) + movf midnight,fr0 + divf day,fr0 + seti + movfi fr0,r0 + mov $montab,r1 +1: + sub (r1)+,r0 + bgt 1b + add -(r1),r0 + cmp r1,$montab+24. + blt 1f + sub $24.,r1 +1: + sub $montab,r1 + mov r1,-(sp) + asr r1 + add (sp)+,r1 + add $monasc,r1 + mov $obuf,r2 + movb (r1)+,(r2)+ + movb (r1)+,(r2)+ + movb (r1)+,(r2)+ + movb $' ,(r2)+ + mov r0,r1 + clr r0 + dvd $10.,r0 + tst r0 + beq 1f + add $'0,r0 + movb r0,(r2)+ +1: + add $'0,r1 + movb r1,(r2)+ + movb $'\t,(r2)+ + sub $obuf,r2 + mov r2,0f + mov $1,r0 + sys write; obuf; 0:.. + movf (sp)+,fr0 + mov (sp)+,r2 + rts pc + +pblank: + tst byday + beq 1f + mov $1,r0 + sys write; blank; 1 +1: + rts pc + +upall: + mov $ttyf,r1 +1: + mov (r1),r0 + beq 1f + jsr pc,update + add $18.,r1 + br 1b +1: + rts pc + +update: + mov r1,-(sp) + mov $usrf,r2 +1: + mov (sp),r1 + tst (r1)+ + tst (r2) + beq 1f + cmp (r1)+,(r2) + bne 2f + cmp (r1)+,2(r2) + bne 2f + cmp (r1)+,4(r2) + bne 2f + cmp (r1)+,6(r2) + beq 1f +2: + add $16.,r2 + br 1b +1: + mov (sp),r1 + tst (r1)+ + mov (r1)+,(r2)+ + mov (r1)+,(r2)+ + mov (r1)+,(r2)+ + mov (r1)+,(r2)+ + movf fr0,fr1 + subf (r1),fr1 + cfcc + blt 1f + cmpf maxpd,fr1 + cfcc + blt 1f + addf (r2),fr1 + movf fr1,(r2)+ +1: + movf fr0,(r1)+ + mov (sp)+,r1 + rts pc + +newday: + movf midnight,fr1 +1: + cmpf fr0,fr1 + cfcc + blt 1f + addf day,fr1 + br 1b +1: + movf fr1,midnight + rts pc + +select: + mov $usrf,r2 +1: + tst (r2) + beq 1f + mov argc,r1 + beq 2f + mov argp,r3 +3: + mov r2,r0 + mov (r3)+,r4 +4: + cmpb (r0)+,(r4)+ + beq 4b + tstb -(r4) + bne 4f + cmpb -(r0),$' / + beq 2f +4: + sob r1,3b + br 3f +2: + jsr pc,*(r5) +3: + add $16.,r2 + br 1b +1: + tst (r5)+ + rts r5 + +ptime: + mov $obuf,r1 + mov r2,r0 +1: + movb (r0)+,(r1) + cmpb (r1)+,$' / + bne 1b + movb $'\t,-1(r1) + mov r1,-(sp) + seti + divf thous,fr0 + jsr pc,digit + jsr pc,digit + jsr pc,digit + jsr pc,digit + movb $':,(r1)+ + mulf sixth,fr0 + jsr pc,digit + jsr pc,digit + movb $'\n,(r1)+ + sub $obuf,r1 + mov r1,0f + mov (sp)+,r1 +1: + cmpb (r1),$'0 + bne 1f + movb $' ,(r1)+ + br 1b +1: + cmpb (r1),$': + bne 1f + movb $'0,-(r1) +1: + mov $1,r0 + sys write; obuf; 0:.. + rts pc + +digit: + modf ten,fr0 + movfi fr1,r0 + add $'0,r0 + movb r0,(r1)+ + rts pc + +filnam: wtmp +montab: + 31.; 28.; 31.; 30.; 31.; 30.; 31.; 31.; 30.; 31.; 30.; 31. + 31.; 29.; 31.; 30.; 31.; 30.; 31.; 31.; 30.; 31.; 30.; 31. +monasc: + + + + + + + + + + + + +day: 45436;32000;0;0 +thous: 47600;137374;0;0 +maxpd: 45636;032001;0;0 +sixth: 40031;114631;114631;114631 +ten: 41040;0;0;0 +total: +blank: < > +wtmp: +.even +.bss +midnight:.=.+8. +byday: .=.+2 +argc: .=.+2 +argp: .=.+2 +ibuf: .=.+16. +fbuf: .=.+520. +i.tty = ibuf+8. +i.time = ibuf+10. +fi: .=.+2 +ttyf: .=.+[20.*18.]; et: +usrf: .=.+[200.*16.]; eu: +obuf: .=.+20. +pflg: .=.+2 diff --git a/src/cmd/ar.s b/src/cmd/ar.s new file mode 100644 index 0000000..530a1f6 --- /dev/null +++ b/src/cmd/ar.s @@ -0,0 +1,539 @@ +/ ar -- archive/library + + mov (sp)+,r0 + sub $2,r0 + ble userr + tst (sp)+ + mov (sp)+,r1 + clr r2 +1: + tstb (r1) + beq 1f + cmpb (r1),$'v + bne 2f + inc r1 + incb vflg + br 1b +2: + tst r2 + bne userr + movb (r1)+,r2 + br 1b +1: + tst r2 + beq userr + mov $arglst,r1 +1: + mov (sp)+,(r1)+ + dec r0 + bgt 1b + clr (r1)+ + mov $swlst,r1 +1: + cmp r2,(r1)+ + beq 1f + tst (r1)+ + bne 1b + br userr +1: + jmp *(r1) + +swlst: + 'r; comr + 'u; comu + 'd; comd + 'x; comx + 't; comt + 0; 0 + +userr: + jsr r5,diag + + .even + +putc: + movb r0,ch + mov $1,r0 + sys write; ch; 1 + rts r5 + +print: + movb (r1)+,r0 + beq 1f + jsr r5,putc + br print +1: + rts r5 + +diag: + mov r5,r1 + jsr r5,print + tst tfo + beq 1f + sys unlink; tfil +1: + sys exit + +getaf: + mov arglst,0f + sys open; 0:..; 0 + bes 1f + mov r0,afi + sys read; buf; 2 + cmp buf,magic + bne magerr + tst (r5)+ +1: + rts r5 + +magerr: + mov arglst,r1 + jsr r5,print + jsr r5,diag + < -- not in archive format\n\0> + .even + +mktmp: + sys stat; tfil; buf + bes 1f + incb tfil+8 + cmpb tfil+8,$'z + blo mktmp + br tferr +1: + sys intr; done + sys creat; tfil; 14 + bes tferr + mov r0,tfo + sys open; tfil; 0 + bes tferr + mov r0,tfi + rts r5 + +tferr: + jsr r5,diag + + .even + +getdir: + mov afi,r0 + sys read; dir; 16. + cmp r0,$16. + bne 1f + jsr r5,mvname + tst (r5)+ +1: + rts r5 + +mvname: + mov name,rname + mov name+2,rname+2 + mov name+4,rname+4 + mov name+6,rname+6 + rts r5 + +skip: + mov size,r0 + inc r0 + bic $1,r0 + mov r0,0f + mov afi,r0 + sys seek; 0:..; 1 + rts r5 + +trim: + mov r0,r2 +1: + tstb (r0) + beq 1f + cmpb (r0)+,$'/ + beq trim + br 1b +1: + rts r5 + +match: + mov $arglst+2,r1 +1: + mov (r1)+,r0 + beq 1f + blt 1b + jsr r5,trim + mov $name,r0 +2: + cmp r0,$name+8. + beq 2f + cmpb (r0),(r2)+ + bne 1b + tstb (r0)+ + bne 2b +2: + cmp (r5)+,-(r1) +1: + rts r5 + +mvfil: + mov (r1),9f + mov (r1),0f + sys stat; 0:..; buf + bes operr + sys open; 9:..; 0 + bes operr + mov r0,fio + mov (r1),r0 + mov $-1,(r1) + jsr r5,trim + mov $name,r0 +1: + cmp r0,$name+8. + beq 1f + movb (r2)+,(r0)+ + bne 1b +1: + mov buf+28.,mtim + mov buf+30.,mtim+2 + movb buf+5,ouid + movb buf+2,mode + mov buf+6,size + mov tfo,r0 + sys write; dir; 16. + mov size,r2 +1: + mov fio,r0 + sys read; buf; 512. + sub r0,r2 + mov r0,0f + beq 1f + mov tfo,r0 + sys write; buf; 0:.. + br 1b +1: + tst r2 + bne phserr + bit $1,size + beq 1f + mov tfo,r0 + sys seek; 1; 1 +1: + mov fio,r0 + sys close + jsr r5,mvname + rts r5 + +operr: + mov 9b,r1 + jsr r5,print + jsr r5,diag + < -- cannot open\n\0> + .even + +phserr: + mov 9b,r1 + jsr r5,print + jsr r5,diag + < -- phase error\n\0> + .even + +copyfl: + mov tfo,r0 + sys write; dir; 16. + mov size,r1 + mov $rname,9b +1: + mov r1,0f + beq 1f + cmp r1,$512. + blo 2f + mov $512.,0f +2: + mov afi,r0 + sys read; buf; 0:.. + sub r0,r1 + mov r0,0f + beq phserr + mov tfo,r0 + sys write; buf; 0:.. + br 1b +1: + bit $1,size + beq 1f + mov afi,r0 + sys seek; 1; 1 + mov tfo,r0 + sys seek; 1; 1 +1: + rts r5 + +xtract: + movb mode,0f + sys creat; rname; 0:.. + bes noxerr + mov r0,fio + mov size,r1 + mov $rname,9b +1: + mov r1,0f + beq 1f + cmp r1,$512. + blo 2f + mov $512.,0f +2: + mov afi,r0 + sys read; buf; 0:.. + sub r0,r1 + mov r0,0f + beq phserr + mov fio,r0 + sys write; buf; 0:.. + br 1b +1: + mov fio,r0 + sys close + bit $1,size + beq 1f + mov afi,r0 + sys seek; 1; 1 +1: + mov r0,-(sp) + mov r1,-(sp) + mov mtim+2,r1 + mov mtim,r0 + sys mdate + mov (sp)+,r1 + mov (sp)+,r1 + rts r5 + +noxerr: + mov $rname,r1 + jsr r5,print + jsr r5,diag + < -- cannot create\n\0> + .even + +table: + mov $rname,r1 + jsr r5,print + mov $'\n,r0 + jsr r5,putc + rts r5 + +mesg: + mov r1,-(sp) + mov (r5)+,r0 + tstb vflg + beq 1f + jsr r5,putc + mov $' ,r0 + jsr r5,putc + mov $rname,r1 + jsr r5,print + mov $'\n,r0 + jsr r5,putc +1: + mov (sp)+,r1 + rts r5 + +oldnew: + sys stat; rname; buf + bes 1f + cmp buf+28.,mtim + blo 1f + bhi 2f + cmp buf+30.,mtim+2 + blos 1f +2: + tst (r5)+ + mov $rname,tname + mov $tname,r1 +1: + rts r5 + +comr: + jsr r5,mktmp + jsr r5,getaf + br copfl +1: + jsr r5,getdir + br copfl + jsr r5,match + br 2f + jsr r5,mesg; 'r + jsr r5,skip + jsr r5,mvfil + br 1b +2: + jsr r5,copyfl + jsr r5,mesg; 'c + br 1b + +comu: + jsr r5,mktmp + jsr r5,getaf + br noaf +1: + jsr r5,getdir + br copfl + tst arglst+2 + beq 2f + jsr r5,match + br 3f + mov $-1,(r1) +2: + jsr r5,oldnew + br 3f + jsr r5,mesg; 'r + jsr r5,skip + jsr r5,mvfil + br 1b +3: + jsr r5,copyfl + jsr r5,mesg; 'c + br 1b + +comd: + jsr r5,mktmp + jsr r5,getaf + br noaf +1: + jsr r5,getdir + br 1f + jsr r5,match + br 2f + mov $-1,(r1) + jsr r5,skip + jsr r5,mesg; 'd + br 1b +2: + jsr r5,copyfl + jsr r5,mesg; 'c + br 1b +1: + jsr r5,nfound + br copfl + +noaf: + jsr r5,diag + + .even + +crterr: + jsr r5,diag + + .even + +copfl: + mov $arglst,r1 + mov (r1)+,0f +1: + tst (r1)+ + beq 1f + blt 1b + tst -(r1) + jsr r5,mvfil + jsr r5,mesg; 'a + br 1b +1: + sys intr; 0 / no interrups during copy back + sys creat; 0:..; 17 + bes crterr + mov r0,afo + sys write; magic; 2 +1: + mov tfi,r0 + sys read; buf; 512. + mov r0,0f + beq done + mov afo,r0 + sys write; buf; 0:.. + br 1b + +done: + jsr r5,diag + <\0> + .even + +comx: + jsr r5,getaf + br noaf +1: + jsr r5,getdir + br 1f + tst arglst+2 + beq 3f + jsr r5,match + br 2f +3: + mov $-1,(r1) + jsr r5,xtract + jsr r5,mesg; 'x + br 1b +2: + jsr r5,skip + br 1b +1: + jsr r5,nfound + br done + +comt: + jsr r5,getaf + br noaf +1: + jsr r5,getdir + br 1f + tst arglst+2 + beq 2f + jsr r5,match + br 3f + mov $-1,(r1) +2: + jsr r5,table +3: + jsr r5,skip + br 1b +1: + jsr r5,nfound + br done + +nfound: + mov $arglst+2,r2 +1: + mov (r2)+,r1 + beq 1f + blt 1b + mov $-1,-(r2) + jsr r5,print + mov $notfnd,r1 + jsr r5,print + br 1b +1: + rts r5 + +notfnd: + < -- not found\n\0> + .even + +tfil: + .even +magic: -147. + + .bss + +afi: .=.+2 +afo: .=.+2 +tfi: .=.+2 +tfo: .=.+2 +fio: .=.+2 +rname: .=.+9. +ch: .=.+1 +vflg: .=.+1 + .even +tname: .=.+2 +dir: + name: .=.+8. + mtim: .=.+4 + ouid: .=.+1 + mode: .=.+1 + size: .=.+2 +arglst: .=.+200. +buf: .=.+512. + diff --git a/src/cmd/as11.s b/src/cmd/as11.s new file mode 100644 index 0000000..623e0d6 --- /dev/null +++ b/src/cmd/as11.s @@ -0,0 +1,90 @@ +/ a1 -- pdp-11 assembler pass 1 + + +main: +ecore = main+8192. + jmp start +go: + jsr pc,assem + movb pof,r0 + sys write; outbuf; 512. + movb pof,r0 + sys close + movb fbfil,r0 + sys close + tstb errflg + bne aexit + jsr r5,fcreat; a.tmp3 + mov $txtsiz,r1 / even up + inc (r1) + bic $1,(r1)+ + inc (r1) + bic $1,(r1)+ + inc (r1) + bic $1,(r1)+ + mov r0,r1 + sys write; txtsiz; 6 + mov symend,0f + sub $usymtab,0f + mov r1,r0 + sys write; usymtab; 0:.. + mov r1,r0 + sys close + sys exec; 2f; 1f + +aexit: + sys unlink; a.tmp1 + sys unlink; a.tmp2 + sys unlink; a.tmp3 + sys exit +1: + 2f + a.tmp1 + a.tmp2 + a.tmp3 +unglob: + 3f + 0 +2: + +3: + <-g\0> + .even + +filerr: + mov r4,-(sp) + mov (r5)+,r4 + mov r4,0f + clr r0 +1: + tstb (r4)+ + beq 1f + inc r0 + br 1b +1: + mov r0,1f + mov $1,r0 + sys write; 0:0; 1:0 + mov r5,0f + mov $1,r0 + sys write; 0:0; 2 + tst (r5)+ + mov (sp)+,r4 + rts r5 + +fcreat: + mov r4,-(sp) + mov (r5)+,r4 + mov r4,0f +1: + sys creat; 0:..; 12 + bes 2f + mov (sp)+,r4 + rts r5 +2: + incb 9.(r4) + cmpb 9.(r4),$'z + blos 1b + mov 0b,0f + jsr r5,filerr; 0:..; "?\n + sys exit diff --git a/src/cmd/as12.s b/src/cmd/as12.s new file mode 100644 index 0000000..69464b3 --- /dev/null +++ b/src/cmd/as12.s @@ -0,0 +1,75 @@ +/ a2 -- pdp-11 assembler pass 1 + +error: + incb errflg + mov r0,-(sp) + mov r1,-(sp) + mov (r5)+,r0 + mov *curarg,0f + beq 1f + clr *curarg + mov r0,-(sp) + jsr r5,filerr; 0:0; '\n + mov (sp)+,r0 +1: + mov r2,-(sp) + mov r3,-(sp) + mov line,r3 + movb r0,1f + mov $1f+6,r0 + mov $4,r1 +2: + clr r2 + dvd $10.,r2 + add $'0,r3 + movb r3,-(r0) + mov r2,r3 + sob r1,2b + mov $1,r0 + sys write; 1f; 7 + mov (sp)+,r3 + mov (sp)+,r2 + mov (sp)+,r1 + mov (sp)+,r0 + rts r5 + +1: + .even + +betwen: + cmp r0,(r5)+ + blt 1f + cmp (r5)+,r0 + blt 2f +1: + tst (r5)+ +2: + rts r5 + +putw: + tst ifflg + beq 1f + cmp r4,$'\n + bne 2f +1: + jsr pc,putc1 + swab r4 + jsr pc,putc1 + swab r4 +2: + rts pc + +putc: + tst ifflg + bne 1f +putc1: + movb r4,*obufp + inc obufp + cmp obufp,$outbuf+512. + blo 1f + mov $outbuf,obufp + movb pof,r0 + sys write; outbuf; 512. +1: + rts pc + diff --git a/src/cmd/as13.s b/src/cmd/as13.s new file mode 100644 index 0000000..49672fe --- /dev/null +++ b/src/cmd/as13.s @@ -0,0 +1,134 @@ +/ a3 -- pdp-11 assembler pass 1 + +assem: + jsr pc,readop + jsr pc,checkeos + br ealoop + tst ifflg + beq 3f + cmp r4,$200 + blos assem + cmpb (r4),$21 /if + bne 2f + inc ifflg +2: + cmpb (r4),$22 /endif + bne assem + dec ifflg + br assem +3: + mov r4,-(sp) + jsr pc,readop + cmp r4,$'= + beq 4f + cmp r4,$': + beq 1f + mov r4,savop + mov (sp)+,r4 + jsr pc,opline +dotmax: + movb dotrel,r0 + asl r0 + cmp dot,txtsiz-4(r0) + blos ealoop + mov dot,txtsiz-4(r0) + br ealoop +1: + mov (sp)+,r4 + cmp r4,$200 + bhis 1f + cmp r4,$1 + beq 3f + jsr r5,error; 'x + br assem +1: + bitb $37,(r4) + beq 1f + jsr r5,error; 'm +1: + bisb dot-2,(r4) + mov dot,2(r4) + br assem +3: + mov numval,r0 + jsr pc,fbcheck + movb dotrel,curfbr(r0) + asl r0 + movb dotrel,nxtfb+1 + mov dot,nxtfb+2 + movb r0,nxtfb + mov dot,curfb(r0) + movb fbfil,r0 + sys write; nxtfb; 4 + br assem +4: + jsr pc,readop + jsr pc,expres + mov (sp)+,r1 + cmp r1,$200 + bhis 1f + jsr r5,error; 'x + br ealoop +1: + cmp r1,$dotrel + bne 2f + bic $40,r3 + cmp r3,dotrel + bne 1f +2: + bicb $37,(r1) + bic $!37,r3 + bne 2f + clr r2 +2: + bisb r3,(r1) + mov r2,2(r1) + br dotmax +1: + jsr r5,error; '. + movb $2,dotrel +ealoop: + cmp r4,$'; + beq assem1 + cmp r4,$'\n + bne 1f + inc line + br assem1 +1: + cmp r4,$'\e + bne 2f + tst ifflg + beq 1f + jsr r5,error; 'x +1: + rts pc +2: + jsr r5,error; 'x +2: + jsr pc,checkeos + br assem1 + jsr pc,readop + br 2b +assem1: + jmp assem + +fbcheck: + cmp r0,$9. + bhi 1f + rts pc +1: + jsr r5,error; 'f + clr r0 + rts pc + +checkeos: + cmp r4,$'\n + beq 1f + cmp r4,$'; + beq 1f + cmp r4,$'\e + beq 1f + add $2,(sp) +1: + rts pc + diff --git a/src/cmd/as14.s b/src/cmd/as14.s new file mode 100644 index 0000000..10bfa58 --- /dev/null +++ b/src/cmd/as14.s @@ -0,0 +1,206 @@ +/ a4 -- pdp-11 assembler pass1 + +rname: + mov r1,-(sp) + mov r2,-(sp) + mov r3,-(sp) + mov $2,r5 + mov $symbol,r2 + clr -(sp) +1: + jsr pc,rnch + mov r3,r1 + mpy $40.,r1 + jsr pc,rnch + add r3,r1 + mpy $40.,r1 + jsr pc,rnch + add r1,r3 + add r3,(sp) + mov r3,(r2)+ + sob r5,1b + jsr pc,rnch + mov r3,r1 + add r3,(sp) + als $10.,r1 + mov r1,(r2) +1: + jsr pc,rnch + tst r3 + bne 1b + mov (sp)+,r1 + clr r0 + dvd $hshsiz,r0 + mov r1,r0 + asl r0 + add $hshtab,r0 +1: + cmp r0,$hshtab + bhi 2f + mov $2*hshsiz+hshtab,r0 +2: + mov $symbol,r2 + mov -(r0),r4 + beq 3f + cmp (r2)+,(r4)+ + bne 1b + cmp (r2)+,(r4)+ + bne 1b + cmpb 1(r4),1(r2) + bne 1b + br 1f +3: + mov symend,r4 + mov r4,(r0) + mov r4,-(sp) + add $20,r4 + cmp r4,0f + blos 4f + add $512.,0f + sys break; 0:end +4: + mov (sp)+,r4 + mov (r2)+,(r4)+ + mov (r2)+,(r4)+ + mov (r2)+,(r4)+ + clr (r4)+ + mov r4,symend + sub $4,r4 +1: + mov r4,-(sp) + sub $symtab-374,r4 + asr r4 + jsr pc,putw + mov (sp)+,r4 + mov (sp)+,r3 + mov (sp)+,r2 + tst (sp)+ + mov (sp)+,r1 + rts pc + +rnch: + jsr pc,rch + movb chartab(r0),r3 + ble 1f + rts pc +1: + movb r0,ch + clr r3 + rts pc + +number: + mov r2,-(sp) + mov r3,-(sp) + mov r5,-(sp) + clr r1 + clr r5 +1: + jsr pc,rch + jsr r5,betwen; '0; '9 + br 1f + sub $'0,r0 + mpy $10.,r5 + add r0,r5 + als $3,r1 + add r0,r1 + br 1b +1: + cmp r0,$'b + beq 1f + cmp r0,$'f + beq 1f + cmp r0,$'. + bne 2f + mov r5,r1 + clr r0 +2: + movb r0,ch + mov r1,r0 + mov (sp)+,r5 + mov (sp)+,r3 + mov (sp)+,r2 + rts pc +1: + mov r0,r3 + mov r5,r0 + jsr pc,fbcheck + add $141,r0 + cmp r3,$'b + beq 1f + add $10.,r0 +1: + mov r0,r4 + mov (sp)+,r5 + mov (sp)+,r3 + mov (sp)+,r2 + add $2,(sp) + rts pc + +rch: + movb ch,r0 + beq 1f + clrb ch + rts pc +1: + dec inbfcnt + blt 2f + movb *inbfp,r0 + inc inbfp + bic $!177,r0 + beq 1b + rts pc +2: + movb fin,r0 + beq 3f + sys read; inbuf;512. + bcs 2f + tst r0 + beq 2f + mov r0,inbfcnt + mov $inbuf,inbfp + br 1b +2: + movb fin,r0 + clrb fin + sys close +3: + decb nargs + bgt 2f + mov $'\e,r0 + rts pc +2: + tst ifflg + beq 2f + jsr r5,error; 'i + jmp aexit +2: + mov curarg,r0 + tst (r0)+ + mov (r0),0f + mov r0,curarg + incb fileflg + sys open; 0:0; 0 + bec 2f + mov 0b,0f + jsr r5,filerr; 0:0; + jmp aexit +2: + movb r0,fin + mov $1,line + mov r4,-(sp) + mov r1,-(sp) + mov $5,r4 + jsr pc,putw + mov *curarg,r1 +2: + movb (r1)+,r4 + beq 2f + jsr pc,putw + br 2b +2: + mov $-1,r4 + jsr pc,putw + mov (sp)+,r1 + mov (sp)+,r4 + br 1b + diff --git a/src/cmd/as15.s b/src/cmd/as15.s new file mode 100644 index 0000000..db17d3b --- /dev/null +++ b/src/cmd/as15.s @@ -0,0 +1,166 @@ +/ a5 -- pdp-11 assembler pass 1 + +readop: + mov savop,r4 + beq 1f + clr savop + rts pc +1: + jsr pc,8f + jsr pc,putw + rts pc + +8: + jsr pc,rch + mov r0,r4 + movb chartab(r0),r1 + bgt rdname + jmp *1f-2(r1) + + fixor + escp + 8b + retread + dquote + garb + squote + rdname + skip + rdnum + retread + string +1: + +escp: + jsr pc,rch + mov $esctab,r1 +1: + cmpb r0,(r1)+ + beq 1f + tstb (r1)+ + bne 1b + rts pc +1: + movb (r1),r4 + rts pc + +esctab: + .byte '/, '/ + .byte '\<, 035 + .byte '>, 036 + .byte '%, 037 + .byte 0, 0 + +fixor: + mov $037,r4 +retread: + rts pc + +rdname: + movb r0,ch + cmp r1,$26. + ble 1f + cmp r1,$37. + blt rdnum +1: + jmp rname + +rdnum: + jsr pc,number + br 1f + rts pc + +squote: + jsr pc,rsch + br 1f +dquote: + jsr pc,rsch + mov r0,-(sp) + jsr pc,rsch + swab r0 + bis (sp)+,r0 +1: + mov r0,numval + mov $1,r4 + jsr pc,putw + mov numval,r4 + jsr pc,putw + mov $1,r4 + tst (sp)+ + rts pc + +skip: + jsr pc,rch + mov r0,r4 + cmp r0,$'\e + beq 1f + cmp r0,$'\n + bne skip +1: + rts pc + +garb: + jsr r5,error; 'g + br 8b + +string: + mov $'<,r4 + jsr pc,putw + clr numval +1: + jsr pc,rsch + tst r1 + bne 1f + mov r0,r4 + bis $400,r4 + jsr pc,putw + inc numval + br 1b +1: + mov $-1,r4 + jsr pc,putw + mov $'<,r4 + tst (sp)+ + rts pc + +rsch: + jsr pc,rch + cmp r0,$'\e + beq 4f + cmp r0,$'\n + beq 4f + clr r1 + cmp r0,$'\\ + bne 3f + jsr pc,rch + mov $schar,r2 +1: + cmpb (r2)+,r0 + beq 2f + tstb (r2)+ + bpl 1b + rts pc +2: + movb (r2)+,r0 + clr r1 + rts pc +3: + cmp r0,$'> + bne 1f + inc r1 +1: + rts pc +4: + jsr r5,error; '< + jmp aexit + +schar: + .byte 'n, 012 + .byte 't, 011 + .byte 'e, 004 + .byte '0, 000 + .byte 'r, 015 + .byte 'a, 006 + .byte 'p, 033 + .byte 0, -1 + diff --git a/src/cmd/as16.s b/src/cmd/as16.s new file mode 100644 index 0000000..85a5700 --- /dev/null +++ b/src/cmd/as16.s @@ -0,0 +1,264 @@ +/ a6 -- pdp-11 assembler pass 1 + +opline: + mov r4,r0 + jsr r5,betwen; 0; 200 + br 1f + cmp r0,$'< + bne xpr + jmp opl17 +xpr: + jsr pc,expres + add $2,dot + rts pc +1: + movb (r4),r0 + cmp r0,$24 + beq xpr + jsr r5,betwen; 5; 32 + br xpr + mov r0,-(sp) + jsr pc,readop + mov (sp)+,r0 + asl r0 + jmp *1f-12(r0) + +1: + opl13 / map fop freg,fdst to double + opl6 + opl7 + opl10 + opl11 + opl13 / map fld/fst to double + opl13 + opl13 / map fop fsrc,freg to double + opl15 + opl16 + opl17 + opl20 + opl21 + opl22 + opl23 + xpr + opl25 + opl26 + opl27 + opl13 / map mul s,r to double + opl31 + opl32 + +/double +opl13: +opl7: + jsr pc,addres +op2: + cmp r4,$', + beq 1f + jsr pc,errora + rts pc +1: + jsr pc,readop +opl15: / single operand + jsr pc,addres + add $2,dot + rts pc + +opl31: / sob + jsr pc,expres + cmp r4,$', + beq 1f + jsr pc,errora +1: + jsr pc,readop + +/branch +opl6: +opl10: +opl11: + jsr pc,expres + add $2,dot + rts pc + +/ .byte +opl16: + jsr pc,expres + inc dot + cmp r4,$', + bne 1f + jsr pc,readop + br opl16 +1: + rts pc + +/ < (.ascii) +opl17: + add numval,dot + jsr pc,readop + rts pc + +/.even +opl20: + inc dot + bic $1,dot + rts pc + +/.if +opl21: + jsr pc,expres + tst r3 + bne 1f + jsr r5,error; 'U +1: + tst r2 + bne opl22 + inc ifflg +opl22: /endif + rts pc + +/.globl +opl23: + cmp r4,$200 + blo 1f + bisb $40,(r4) + jsr pc,readop + cmp r4,$', + bne 1f + jsr pc,readop + br opl23 +1: + rts pc + +opl25: +opl26: +opl27: + mov dotrel,r1 + asl r1 + mov dot,savdot-4(r1) + mov savdot-52(r0),dot + asr r0 + sub $25-2,r0 + mov r0,dotrel + rts pc + +/ .common +opl32: + cmp r4,$200 + blo 1f + bis $40,(r4) + jsr pc,readop + cmp r4,$', + bne 1f + jsr pc,readop + jsr pc,expres + rts pc +1: + jsr r5,error; 'x + rts pc + +addres: + cmp r4,$'( + beq alp + cmp r4,$'- + beq amin + cmp r4,$'$ + beq adoll + cmp r4,$'* + beq astar +getx: + jsr pc,expres + cmp r4,$'( + bne 2f + jsr pc,readop + jsr pc,expres + jsr pc,checkreg + jsr pc,checkrp + add $2,dot + clr r0 + rts pc +2: + cmp r3,$24 / register type + bne 1f + jsr pc,checkreg + clr r0 + rts pc +1: + add $2,dot + clr r0 + rts pc + +alp: + jsr pc,readop + jsr pc,expres + jsr pc,checkrp + jsr pc,checkreg + cmp r4,$'+ + bne 1f + jsr pc,readop + clr r0 + rts pc +1: + mov $2,r0 + rts pc + +amin: + jsr pc,readop + cmp r4,$'( + beq 1f + mov r4,savop + mov $'-,r4 + br getx +1: + jsr pc,readop + jsr pc,expres + jsr pc,checkrp + jsr pc,checkreg + clr r0 + rts pc + +adoll: + jsr pc,readop + jsr pc,expres + add $2,dot + clr r0 + rts pc + +astar: + jsr pc,readop + cmp r0,$'* + beq 1f + jsr pc,addres + add r0,dot + rts pc +2: + jsr r5,error; '* + rts pc + +errora: + jsr r5,error; 'a + rts pc + +checkreg: + cmp r2,$7 + bhi 1f + cmp r3,$1 + beq 2f + cmp r3,$4 + bhi 2f +1: + jsr pc,errora +2: + rts pc + +errore: + jsr r5,error; 'e + rts pc + +checkrp: + cmp r4,$') + beq 1f + jsr r5,error; ') + rts pc +1: + jsr pc,readop + rts pc + diff --git a/src/cmd/as17.s b/src/cmd/as17.s new file mode 100644 index 0000000..45d1500 --- /dev/null +++ b/src/cmd/as17.s @@ -0,0 +1,217 @@ +/ a7 -- pdp-11 assembler pass 1 + +expres: + mov r5,-(sp) + mov $'+,-(sp) + clr opfound + clr r2 + mov $1,r3 + br 1f +advanc: + jsr pc,readop +1: + mov r4,r0 + jsr r5,betwen; 0; 177 + br .+4 + br 7f + movb (r4),r0 + mov 2(r4),r1 + br oprand +7: + cmp r4,$141 + blo 1f + cmp r4,$141+10. + bhis 2f + movb curfbr-141(r4),r0 + asl r4 + mov curfb-[2*141](r4),r2 + bpl oprand + jsr r5,error; 'f + br oprand +2: + clr r3 + clr r2 + br oprand +1: + mov $esw1,r1 +1: + cmp (r1)+,r4 + beq 1f + tst (r1)+ + bne 1b + tst opfound + bne 2f + jsr pc,errore +2: + tst (sp)+ + mov (sp)+,r5 + rts pc +1: + jmp *(r1) + +esw1: + '+; binop + '-; binop + '*; binop + '/; binop + '&; binop + 037; binop + 035; binop + 036; binop + '%; binop + '[; brack + '^; binop + 1; exnum + '!; binop + 0; 0 + +binop: + cmpb (sp),$'+ + beq 1f + jsr pc,errore +1: + movb r4,(sp) + br advanc + +exnum: + mov numval,r1 + mov $1,r0 + br oprand + +brack: + mov r2,-(sp) + mov r3,-(sp) + jsr pc,readop + jsr pc,expres + cmp r4,$'] + beq 1f + jsr r5,error; '] +1: + mov r3,r0 + mov r2,r1 + mov (sp)+,r3 + mov (sp)+,r2 + +oprand: + inc opfound + mov $exsw2,r5 +1: + cmp (sp),(r5)+ + beq 1f + tst (r5)+ + bne 1b + br eoprnd +1: + jmp *(r5) + +exsw2: + '+; exadd + '-; exsub + '*; exmul + '/; exdiv + 037; exor + '&; exand + 035;exlsh + 036;exrsh + '%; exmod + '!; exnot + '^; excmbin + 0; 0 + +excmbin: + mov r0,r3 / give left flag of right + br eoprnd + +exrsh: + neg r1 + beq exlsh + inc r1 + clc + ror r2 +exlsh: + jsr r5,combin; 0 + als r1,r2 + br eoprnd + +exmod: + jsr r5,combin; 0 + mov r1,-(sp) + mov r2,r1 + clr r0 + dvd (sp)+,r0 + mov r1,r2 + br eoprnd + +exadd: + jsr r5,combin; 0 + add r1,r2 + br eoprnd + +exsub: + jsr r5,combin; 1 + sub r1,r2 + br eoprnd + +exand: + jsr r5,combin; 0 + com r1 + bic r1,r2 + br eoprnd + +exor: + jsr r5,combin; 0 + bis r1,r2 + br eoprnd + +exmul: + jsr r5,combin; 0 + mpy r2,r1 + mov r1,r2 + br eoprnd + +exdiv: + jsr r5,combin; 0 + mov r1,-(sp) + mov r2,r1 + clr r0 + dvd (sp)+,r0 + mov r0,r2 + br eoprnd + +exnot: + jsr r5,combin; 0 + com r1 + add r1,r2 + br eoprnd + +eoprnd: + mov $'+,(sp) + jmp advanc + +combin: + mov r0,-(sp) + bis r3,(sp) + bic $!40,(sp) + bic $!37,r0 + bic $!37,r3 + cmp r0,r3 + ble 1f + mov r0,-(sp) + mov r3,r0 + mov (sp)+,r3 +1: + tst r0 + beq 1f + tst (r5)+ + beq 2f + cmp r0,r3 + bne 2f + mov $1,r3 + br 2f +1: + tst (r5)+ + clr r3 +2: + bis (sp)+,r3 + rts r5 + diff --git a/src/cmd/as18.s b/src/cmd/as18.s new file mode 100644 index 0000000..13ee878 --- /dev/null +++ b/src/cmd/as18.s @@ -0,0 +1,61 @@ +/ a8 -- pdp-11 assembler pass 1 + +chartab: + .byte -14,-14,-14,-14,-02,-14,-14,-14 + .byte -14,-22, -2,-14,-14,-22,-14,-14 + .byte -14,-14,-14,-14,-14,-14,-14,-14 + .byte -14,-14,-14,-14,-14,-14,-14,-14 + .byte -22,-20,-16,-14,-20,-20,-20,-12 + .byte -20,-20,-20,-20,-20,-20,38.,-06 + .byte 27.,28.,29.,30.,31.,32.,33.,34. + .byte 35.,36.,-20,-02,-00,-20,-14,-14 + .byte -14,01.,02.,03.,04.,05.,06.,07. + .byte 08.,09.,10.,11.,12.,13.,14.,15. + .byte 16.,17.,18.,19.,20.,21.,22.,23. + .byte 24.,25.,26.,-20,-24,-20,-20,37. + .byte -14,01.,02.,03.,04.,05.,06.,07. + .byte 08.,09.,10.,11.,12.,13.,14.,15. + .byte 16.,17.,18.,19.,20.,21.,22.,23. + .byte 24.,25.,26.,-14,-26,-14,-14,-14 + +errflg: .byte 0 +namedone: .byte 0 +ch: .byte 0 +a.tmp1: +a.tmp2: +a.tmp3: +qi: +.even + +curfb: + -1;-1;-1;-1;-1;-1;-1;-1;-1;-1 +obufp: outbuf +symend: usymtab +txtsiz: .=.+2 +datsiz: .=.+2 +bsssiz: .=.+2 +curfbr: .=.+10. +savdot: .=.+6 +bufcnt: .=.+2 +hshsiz = 1000. +hshtab: .=2*hshsiz+. +pof: .=.+1 +wordf: .=.+1 +fin: .=.+1 +fbfil: .=.+1 +fileflg: .=.+1 +.even +symbol: .=.+6 +inbuf: .=.+512. +obufc: .=.+2 +outbuf: .=.+512. +line: .=.+2 +inbfcnt: .=.+2 +ifflg: .=.+2 +inbfp: .=.+2 +nargs: .=.+2 +curarg: .=.+2 +opfound: .=.+2 +savop: .=.+2 +numval: .=.+2 +nxtfb: .=.+4 diff --git a/src/cmd/as19.s b/src/cmd/as19.s new file mode 100644 index 0000000..81e8225 --- /dev/null +++ b/src/cmd/as19.s @@ -0,0 +1,328 @@ +/ a9 -- pdp-11 assembler pass 1 + +eae = 0 + +/ key to types + +/ 0 undefined +/ 1 absolute +/ 2 text +/ 3 data +/ 4 bss +/ 5 flop freg,dst (movfo, = stcfd) +/ 6 branch +/ 7 jsr +/ 10 rts +/ 11 sys +/ 12 movf (=ldf,stf) +/ 13 double operand (mov) +/ 14 flop fsrc,freg (addf) +/ 15 single operand (clr) +/ 16 .byte +/ 17 string (.ascii, "<") +/ 20 .even +/ 21 .if +/ 22 .endif +/ 23 .globl +/ 24 register +/ 25 .text +/ 26 .data +/ 27 .bss +/ 30 mul,div, etc +/ 31 sob +/ 32 .comm + +symtab: + +/ special variables + +166600; 000000; dotrel: 02; dot:000000 /. +171560; 000000; 01; dotdot:000000 /.. + +/ register + +072270;000000;24;000000 /r0 +072340;000000;24;000001 /r1 +072410;000000;24;000002 /r2 +072460;000000;24;000003 /r3 +072530;000000;24;000004 /r4 +072600;000000;24;000005 /r5 +074500;000000;24;000006 /sp +062170;000000;24;000007 /pc + +.if eae + +/eae & switches + +012717;000000;01;177570 /csw +015176;000000;01;177300 /div +003270;000000;01;177302 /ac +051750;000000;01;177304 /mq +052224;000000;01;177306 /mul +073470;000000;01;177310 /sc +074620;000000;01;177311 /sr +054752;000000;01;177312 /nor +047000;000000;01;177314 /lsh +004500;000000;01;177316 /ash + +.endif + +/ system calls + +021411;076400;01;0000001 /exit +023752;042300;01;0000002 /fork +070511;014400;01;0000003 /read +111231;076710;01;0000004 /write +060105;053600;01;0000005 /open +012257;073610;01;0000006 /close +107761;076400;01;0000007 /wait +012625;004540;01;0000010 /creat +046166;042300;01;0000011 /link +102574;035173;01;0000012 /unlink +021405;011300;01;0000013 /exec +012004;035420;01;0000014 /chdir +077165;017500;01;0000015 /time +050563;015172;01;0000016 /makdir +012015;057140;01;0000017 /chmod +012017;110760;01;0000020 /chown +007525;003770;01;0000021 /break +074741;076400;01;0000022 /stat +073615;042300;01;0000023 /seek +076724;045400;01;0000024 /tell +051655;055240;01;0000025 /mount +102527;102604;01;0000026 /umount +073634;102254;01;0000027 /setuid +026234;102254;01;0000030 /getuid +074751;051010;01;0000031 /stime +066621;076400;01;0000032 /quit +035204;070200;01;0000033 /intr +024214;004540;01;0000034 /fstat +011625;076400;01;0000035 /cemt +050741;076710;01;0000036 /mdate +074764;116100;01;0000037 /stty +027364;116100;01;0000040 /gtty +035047;035203;01;0000041 /ilgins +054353;017500;01;0000042 /nice + +/ double operand + +051656;000000;13;0010000 /mov +051656;006200;13;0110000 /movb +012330;000000;13;0020000 /cmp +012330;006200;13;0120000 /cmpb +006774;000000;13;0030000 /bit +006774;006200;13;0130000 /bitb +006753;000000;13;0040000 /bic +006753;006200;13;0140000 /bicb +006773;000000;13;0050000 /bis +006773;006200;13;0150000 /bisb +003344;000000;13;0060000 /add +075012;000000;13;0160000 /sub + +/ branch + +007520;000000;06;0000400 /br +007265;000000;06;0001000 /bne +006531;000000;06;0001400 /beq +006635;000000;06;0002000 /bge +007164;000000;06;0002400 /blt +006654;000000;06;0003000 /bgt +007145;000000;06;0003400 /ble +007414;000000;06;0100000 /bpl +007221;000000;06;0100400 /bmi +006711;000000;06;0101000 /bhi +007157;073300;06;0101400 /blos +007763;000000;06;0102000 /bvc +010003;000000;06;0102400 /bvs +006711;073300;06;0103000 /bhis +006513;000000;06;0103000 /bec +006373;000000;06;0103000 /bcc +007157;000000;06;0103400 /blo +006413;000000;06;0103400 /bcs +006533;000000;06;0103400 /bes + +/ single operand + +012262;000000;15;0005000 /clr +012262;006200;15;0105000 /clrb +012445;000000;15;0005100 /com +012445;006200;15;0105100 /comb +035163;000000;15;0005200 /inc +035163;006200;15;0105200 /incb +014713;000000;15;0005300 /dec +014713;006200;15;0105300 /decb +054117;000000;15;0005400 /neg +054117;006200;15;0105400 /negb +003343;000000;15;0005500 /adc +003343;006200;15;0105500 /adcb +073423;000000;15;0005600 /sbc +073423;006200;15;0105600 /sbcb +100014;000000;15;0005700 /tst +100014;006200;15;0105700 /tstb +071352;000000;15;0006000 /ror +071352;006200;15;0106000 /rorb +071344;000000;15;0006100 /rol +071344;006200;15;0106100 /rolb +004512;000000;15;0006200 /asr +004512;006200;15;0106200 /asrb +004504;000000;15;0006300 /asl +004504;006200;15;0106300 /aslb +040230;000000;15;0000100 /jmp +075131;006200;15;0000300 /swab + +/ jsr + +040612;000000;07;0004000 /jsr + +/ rts + +071663;000000;010;000200 /rts + +/ simple operand + +075273;000000;011;104400 /sys + +/ flag-setting + +012243;000000;01;0000241 /clc +012266;000000;01;0000242 /clv +012272;000000;01;0000244 /clz +012256;000000;01;0000250 /cln +073613;000000;01;0000261 /sec +073636;000000;01;0000262 /sev +073642;000000;01;0000264 /sez +073626;000000;01;0000270 /sen + +/ floating point ops + +011663;011300;01;170000 / cfcc +073634;022600;01;170001 / setf +073634;014400;01;170011 / setd +073634;034100;01;170002 / seti +073634;045400;01;170012 / setl +012262;022600;15;170400 / clrf +054117;022600;15;170700 / negf +003243;022600;15;170600 / absf +100014;022600;15;170500 / tstf +051656;022600;12;172400 / movf +051656;034460;14;177000 / movif +051656;023350;05;175400 / movfi +051656;057260;14;177400 / movof +051656;023730;05;176000 / movfo +003344;022600;14;172000 / addf +075012;022600;14;173000 / subf +052224;022600;14;171000 / mulf +015176;022600;14;174400 / divf +012330;022600;14;173400 / cmpf +051634;022600;14;171400 / modf +024153;000000;24;000000 / fr0 +024154;000000;24;000001 / fr1 +024155;000000;24;000002 / fr2 +024156;000000;24;000003 / fr3 +024157;000000;24;000004 / fr4 +024160;000000;24;000005 / fr5 +/ 11/45 operations + +004063;000000;30;072000 /als (ash) +004063;011300;30;073000 /alsc (ashc) +051731;000000;30;070000 /mpy +.if eae-1 +052224;000000;30;070000 /mul (=mpy) +015176;000000;30;071000 / div (=dvd) +004500;000000;30;072000 / ash (=als) +004500;011300;30;073000 / ashc +.endif +016164;000000;30;071000 /dvd +114152;000000;07;074000 /xor +075224;000000;15;006700 /sxt +050572;042300;11;006400 /mark +074432;000000;31;077000 /sob + +/ specials + +166751;076710;16;000000 /.byte +167136;020560;20;000000 /.even +167356;000000;21;000000 /.if +167126;015156;22;000000 /.endif +167244;057034;23;000000 /.globl +170245;114440;25;000000 /.text +167041;076450;26;000000 /.data +166743;073300;27;000000 /.bss +167007;051510;32;000000 /.comm + +usymtab: +0;0;0;0 + +start: + sys intr; aexit + mov sp,r5 + mov (r5)+,r0 + cmpb *2(r5),$'- + bne 1f + tst (r5)+ + dec r0 + br 2f +1: + clr unglob +2: + movb r0,nargs + mov r5,curarg + jsr r5,fcreat; a.tmp1 + movb r0,pof + jsr r5,fcreat; a.tmp2 + movb r0,fbfil + jsr pc,setup + mov $1,r0 + sys write; qi; 2 + jmp go + +setup: + mov $symtab,r1 +1: + mov $symbol,r0 + mov (r1)+,(r0)+ + beq 3f + mov (r1)+,(r0)+ + mov (r1)+,r2 + bic $37,r2 + mov r2,(r0)+ + mov r1,-(sp) + jsr pc,slot + mov (sp)+,r1 + mov r1,(r0) + sub $6,(r0) + tst (r1)+ + br 1b +3: + rts pc + +slot: + mov symbol,r1 + add symbol+2,r1 + add symbol+4,r1 + clr r0 + dvd $hshsiz,r0 + asl r1 + add $hshtab,r1 +1: + cmp r1,$hshtab + bhi 2f + mov $2*hshsiz+hshtab,r1 +2: + mov -(r1),r2 + beq 3f + mov $symbol,r3 + cmp (r2)+,(r3)+ + bne 1b + cmp (r2)+,(r3)+ + bne 1b + mov (r2)+,r0 + bic $37,r0 + cmp r0,(r3)+ + bne 1b +3: + mov r1,r0 + rts pc + +end: + diff --git a/src/cmd/as21.s b/src/cmd/as21.s new file mode 100644 index 0000000..ea5b6c7 --- /dev/null +++ b/src/cmd/as21.s @@ -0,0 +1,194 @@ +/ a21 -- pdp-11 assembler pass 2 + +main: + sys intr; aexit + jmp start + +/ set up sizes and origins + +go: + jsr pc,getw + mov r4,txtsiz + mov r4,r1 + jsr pc,getw + mov r4,datsiz + mov r4,r2 + jsr pc,getw + mov r4,bsssiz + mov r1,r3 + mov r3,datbase / txtsiz + mov r3,savdot+2 + add r2,r3 + mov r3,bssbase / txtsiz+datsiz + mov r3,savdot+4 + asl r3 + add $20,r3 + mov r3,symseek / 2*txtsiz+2*datsiz+20 + sub r2,r3 + mov r3,drelseek / 2*txtsiz+datsiz + sub r1,r3 + mov r3,trelseek / txtsiz+datsiz+20 + sub r2,r3 + mov r3,datseek / txtsiz+20 + +/ read in symbol table itself + + mov $usymtab,r1 +1: + jsr pc,getw + bvs 1f + add $14,symsiz / count symbols + jsr pc,getw + jsr pc,getw + bic $!377,r4 + bne 2f + mov defund,r4 / (perhaps) globalize undef. +2: + mov r4,(r1)+ + jsr r5,doreloc + jsr pc,getw + add r3,r4 + mov r4,(r1)+ + jsr pc,setbrk + br 1b +1: + +/ read in f-b definitions + + mov r1,fbbufp + movb fbfil,fin + clr ibufc +1: + jsr pc,getw + bvs 1f + mov r4,(r1)+ + swab r4 + jsr r5,doreloc + jsr pc,getw + add r3,r4 + mov r4,(r1)+ + jsr pc,setbrk + br 1b +1: + mov $-1,(r1)+ + +/ set up input text file; initialize f-b table + + mov txtfil,fin + clr ibufc + clr r4 +1: + jsr pc,fbadv + tstb (r4)+ + cmp r4,$10. + blt 1b + +/ go + + clr r0 + jsr r5,oset; txtp + mov trelseek,r0 + jsr r5,oset; relp + mov $8.,r2 + mov $txtmagic,r1 +1: + mov (r1)+,r0 + jsr r5,putw; txtp + dec r2 + bne 1b + jsr pc,assem + +/polish off text and relocation + + jsr r5,flush; txtp + jsr r5,flush; relp + +/ append full symbol table + + mov symf,r0 + mov r0,fin + clr ibufc + sys seek; 6; 0 + mov symseek,r0 + jsr r5,oset; txtp + mov $usymtab,r1 +1: + jsr pc,getw + bvs 1f + jsr pc,convs + jsr pc,getw + jsr pc,convs + jsr pc,getw + mov r4,r0 + als $-10.,r0 + bic $!77,r0 + movb chartab(r0),r0 + jsr r5,putw; txtp + mov (r1)+,r0 + jsr r5,putw; txtp + jsr pc,getw + mov (r1)+,r0 + jsr r5,putw; txtp + br 1b +1: + jsr r5,flush; txtp + +aexit: + mov a.tmp1,0f + sys unlink; 0:.. + mov a.tmp2,0f + sys unlink; 0:.. + mov a.tmp3,0f + sys unlink; 0:.. + sys chmod; a.out; outmod: 37 + sys exit + +filerr: + mov *(r5),r5 +1: + movb (r5)+,ch + beq 1f + mov $1,r0 + sys write; ch; 1 + br 1b +1: + mov $1,r0 + sys write; qnl; 2 + br aexit + +doreloc: + clr r3 + bic $!37,r4 + cmp r4,$5 + bhis 1f + cmp r4,$3 + blo 1f + beq 2f + mov bssbase,r3 + br 1f +2: + mov datbase,r3 +1: + rts r5 + +setbrk: + mov r1,-(sp) + add $20,r1 + cmp r1,0f + blo 1f + add $512.,0f + sys break; 0: end +1: + mov (sp)+,r1 + rts pc + + + mov a.tmp1,0f + sys unlink; 0:.. + mov a.tmp2,0f + sys unlink; 0:.. + mov a.tmp3,0f + sys unlink; 0:.. + sys chmod; a.out; outmod: 37 + sys exit + diff --git a/src/cmd/as22.s b/src/cmd/as22.s new file mode 100644 index 0000000..d27817b --- /dev/null +++ b/src/cmd/as22.s @@ -0,0 +1,130 @@ +/ a2 -- pdp-11 assembler pass 2 + +outw: + cmp dot-2,$4 + beq 9f + bit $1,dot + bne 1f + add $2,dot + clr -(sp) + rol r3 + adc (sp) + asr r3 / get relative pc bit + cmp r3,$40 + bne 2f +/ external references + mov $17,outmod / make nonexecutable + mov xsymbol,r3 + sub $usymtab-symtab,r3 + asl r3 + bis $4,r3 / external relocation + br 3f +2: + bic $40,r3 / clear any ext bits + cmp r3,$5 + blo 4f + mov $1,r3 / make absolute +4: + cmp r3,$2 + blo 5f + cmp r3,$4 + bhi 5f + tst (sp) + bne 4f + add dotdot,r2 + br 4f +5: + tst (sp) + beq 4f + sub dotdot,r2 +4: + dec r3 + bpl 3f + clr r3 +3: + asl r3 + bis (sp)+,r3 + mov r2,r0 + jsr r5,putw; txtp + add $2,*tseekp + mov r3,r0 + jsr r5,putw; relp + add $2,*rseekp + rts pc +1: + jsr r5,error; 'o + clr r3 + jsr pc,outb + rts pc + +9: + jsr r5,error; 'x + rts pc + +outb: + cmp dot-2,$4 / test bss mode + beq 9b + cmp r3,$1 + blos 1f + jsr r5,error; 'r +1: + mov r2,r0 + jsr r5,putc; txtp + bit $1,dot + bne 1f + clr r0 + jsr r5,putw; relp + add $2,*rseekp +1: + inc dot + inc *tseekp + rts pc + +error: + mov $17,outmod / make nonexecutable + mov r3,-(sp) + mov r2,-(sp) + mov r1,-(sp) + mov r0,-(sp) + mov $argb,r1 +1: + movb (r1),ch + beq 1f + clrb (r1)+ + mov $1,r0 + sys write; ch; 1 + br 1b +1: + mov (r5)+,r0 + movb r0,0f + mov line,r3 + mov $0f+6,r0 + mov $4,r1 +2: + clr r2 + dvd $10.,r2 + add $'0,r3 + movb r3,-(r0) + mov r2,r3 + sob r1,2b + mov $1,r0 + sys write; 0f; 7 + mov (sp)+,r0 + mov (sp)+,r1 + mov (sp)+,r2 + mov (sp)+,r3 + rts r5 + +0: + .even + +betwen: + cmp r0,(r5)+ + blt 1f + cmp (r5)+,r0 + blt 2f +1: + tst (r5)+ +2: + rts r5 + diff --git a/src/cmd/as23.s b/src/cmd/as23.s new file mode 100644 index 0000000..e4ce180 --- /dev/null +++ b/src/cmd/as23.s @@ -0,0 +1,128 @@ +/ a3 -- pdp-11 assembler pass 2 + +assem: + jsr pc,readop + jsr pc,checkeos + br ealoop + mov r4,-(sp) + jsr pc,readop + cmp (sp),$1 + bne 1f + mov $2,(sp) + mov r4,numval + jsr pc,readop +1: + cmp r4,$'= + beq 4f + cmp r4,$': + beq 1f + mov r4,savop + mov (sp)+,r4 + jsr pc,opline + br ealoop +1: + mov (sp)+,r4 + cmp r4,$200 + bhis 1f + cmp r4,$2 + beq 3f + jsr r5,error; 'x + br assem +1: + cmp dot,symtab+2(r4) + beq assem + jsr r5,error; 'p + br assem +3: + mov numval,r4 + jsr pc,fbadv + br assem +4: + jsr pc,readop + jsr pc,expres + mov (sp)+,r1 + cmp r1,$200 /test for dot + bne 1f + bic $40,r3 + cmp r3,dot-2 / can't change relocation + bne 2f + cmp r3,$4 / bss + bne 3f + mov r2,dot + br ealoop +3: + sub dot,r2 + bmi 2f + mov r2,-(sp) +3: + dec (sp) + bmi 3f + clr r2 + mov $1,r3 + jsr pc,outb + br 3b +3: + tst (sp)+ + br ealoop +2: + jsr r5,error; '. + br ealoop +1: + cmp r3,$40 + bne 1f + jsr r5,error; 'r +1: + bic $37,symtab(r1) + bic $!37,r3 + bne 1f + clr r2 +1: + bisb r3,symtab(r1) + mov r2,symtab+2(r1) + +ealoop: + cmp r4,$'\n + beq 1f + cmp r4,$'\e + bne assem + rts pc +1: + inc line + br assem + +checkeos: + cmp r4,$'\n + beq 1f + cmp r4,$'; + beq 1f + cmp r4,$'\e + beq 1f + add $2,(sp) +1: + rts pc + +fbadv: + movb nxtfbr(r4),curfbr(r4) + asl r4 + mov nxtfb(r4),curfb(r4) + mov nxtfbp(r4),r1 + bne 1f + mov fbbufp,r1 +1: + cmpb r4,(r1)+ + beq 1f + tstb (r1)+ + bpl 2f + dec r1 + br 1f +2: + tst (r1)+ + br 1b +1: + movb (r1)+,r0 + mov (r1)+,nxtfb(r4) + mov r1,nxtfbp(r4) + asr r4 + movb r0,nxtfbr(r4) + rts pc + diff --git a/src/cmd/as24.s b/src/cmd/as24.s new file mode 100644 index 0000000..1c4ddb7 --- /dev/null +++ b/src/cmd/as24.s @@ -0,0 +1,126 @@ +/ a4 -- pdp-11 assembler pass 2 + +oset: + mov r2,-(sp) + mov (r5)+,r1 + 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 + mov (sp)+,r2 + rts r5 + +putw: + mov (r5),0f + jsr r5,putc; 0:.. + swab r0 + +putc: + mov r1,-(sp) + mov r2,-(sp) + mov (r5)+,r2 + mov (r2)+,r1 / slot + cmp r1,(r2) / buf max + bhis 1f + movb r0,(r1)+ + mov r1,-(r2) + br 2f +1: + tst (r2)+ + mov r0,-(sp) + jsr r5,flush1 + mov (sp)+,r0 + movb r0,*(r2)+ + inc -(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 + +getc: + dec ibufc + bgt 1f + movb fin,r0 + sys read; inbuf; 512. + mov r0,ibufc + bne 2f + sev + rts pc +2: + mov $inbuf,ibufp +1: + clr r4 + bisb *ibufp,r4 + inc ibufp + rts pc + +readop: + mov savop,r4 + beq getw + clr savop + rts pc + +getw: + jsr pc,getc + bvs 1f + mov r4,-(sp) + jsr pc,getc + bvs 2f + swab r4 + bis (sp)+,r4 + rts pc +2: + tst (sp)+ +1: + mov $4,r4 + sev + rts pc + +convs: + mov r5,-(sp) + mov r4,r5 + clr r4 + dvd $40.,r4 + mov r5,-(sp) + mov r4,r5 + clr r4 + dvd $40.,r4 + mov r5,-(sp) + movb chartab(r4),r0 + jsr r5,putc; txtp + mov (sp)+,r4 + movb chartab(r4),r0 + jsr r5,putc; txtp + mov (sp)+,r4 + movb chartab(r4),r0 + jsr r5,putc; txtp + mov (sp)+,r5 + rts pc diff --git a/src/cmd/as25.s b/src/cmd/as25.s new file mode 100644 index 0000000..99d1567 --- /dev/null +++ b/src/cmd/as25.s @@ -0,0 +1 @@ +/ as25 is empty diff --git a/src/cmd/as26.s b/src/cmd/as26.s new file mode 100644 index 0000000..d2a363e --- /dev/null +++ b/src/cmd/as26.s @@ -0,0 +1,450 @@ +/ a6 -- pdp-11 assembler pass 2 + +opline: + mov r4,r0 + jsr r5,betwen; 0; 177 + br 2f + cmp r4,$5 + beq opeof + cmp r4,$'< + bne xpr + jmp opl17 +xpr: + jsr pc,expres + jsr pc,outw + rts pc +2: + movb symtab(r4),r0 + cmp r0,$24 + beq xpr + jsr r5,betwen; 5; 32 + br xpr + mov symtab+2(r4),-(sp) + mov r0,-(sp) + jsr pc,readop + mov (sp)+,r0 + asl r0 + mov $adrbuf,r5 + clr swapf + mov $-1,rlimit + jmp *1f-10.(r0) + +1: + opl5 + opl6 + opl7 + opl10 + opl11 + opl12 + opl13 + opl14 + opl15 + opl16 + opl17 + opl20 + opl21 + opl22 + opl23 + xpr + opl25 + opl26 + opl27 + opl30 + opl31 + opl32 + +opeof: + mov $1,line + mov $20,-(sp) + mov $argb,r1 +1: + jsr pc,readop + tst r4 + bmi 1f + movb r4,(r1)+ + dec (sp) + bgt 1b + tstb -(r1) + br 1b +1: + movb $'\n,(r1)+ + clrb (r1)+ + tst (sp)+ + rts pc + +opl30: / mpy, dvd etc + inc swapf + mov $1000,rlimit + br opl13 + +opl14: / flop freg,fsrc + inc swapf + +opl5: / flop src,freg + mov $400,rlimit + +/double +opl13: + jsr pc,addres +op2a: + mov r2,-(sp) + jsr pc,readop +op2b: + jsr pc,addres + tst swapf + beq 1f + mov (sp),r0 + mov r2,(sp) + mov r0,r2 +1: + swab (sp) + asr (sp) + asr (sp) + cmp (sp),rlimit + blo 1f + jsr r5,error; 'x +1: + bis (sp)+,r2 + bis (sp)+,r2 + clr r3 + jsr pc,outw + mov $adrbuf,r1 +1: + cmp r1,r5 + bhis 1f + mov (r1)+,r2 + mov (r1)+,r3 + mov (r1)+,xsymbol + jsr pc,outw + br 1b +1: + rts pc + +opl15: / single operand + clr -(sp) + br op2b + +opl12: / movf + mov $400,rlimit + jsr pc,addres + cmp r2,$4 / see if source is fregister + blo 1f + inc swapf + br op2a +1: + mov $174000,(sp) + br op2a + +/sob +opl31: / sob + jsr pc,expres + jsr pc,checkreg + swab r2 + asr r2 + asr r2 + bis r2,(sp) + jsr pc,readop + jsr pc,expres + sub dot,r2 + neg r2 + mov r2,r0 + jsr r5,betwen; -2; 175 + br 2f + add $4,r2 + br 1f + +/branch +opl6: + jsr pc,expres + sub dot,r2 + mov r2,r0 + jsr r5,betwen; -254.; 256. + br 2f +1: + bit $1,r2 + bne 2f + cmp r3,dot-2 / same relocation as . + bne 2f + asr r2 + dec r2 + bic $177400,r2 +1: + bis (sp)+,r2 + clr r3 + jsr pc,outw + rts pc +2: + jsr r5,error; 'b + clr r2 + br 1b + +/jsr +opl7: + jsr pc,expres + jsr pc,checkreg + br op2a + +/ rts +opl10: + jsr pc,expres + jsr pc,checkreg + br 1f + +/ sys, emt etc +opl11: + jsr pc,expres + cmp r2,$64. + bhis 0f + cmp r3,$1 + ble 1f +0: + jsr pc,errora +1: + bis (sp)+,r2 + jsr pc,outw + rts pc + +/ .byte +opl16: + jsr pc,expres + jsr pc,outb + cmp r4,$', + bne 1f + jsr pc,readop + br opl16 +1: + tst (sp)+ + rts pc + +/ < (.ascii) +opl17: + jsr pc,readop + mov $1,r3 + mov r4,r2 + bmi 2f + bic $!377,r2 + jsr pc,outb + br opl17 +2: + jsr pc,readop + rts pc + +/.even +opl20: + bit $1,dot + beq 1f + cmp dot-2,$4 + beq 2f / bss mode + clr r2 + clr r3 + jsr pc,outb + br 1f +2: + inc dot +1: + tst (sp)+ + rts pc +opl21: /if + jsr pc,expres +opl22: +oplret: + tst (sp)+ + rts pc + + +/.globl +opl23: + cmp r4,$200 + blo 1f + bisb $40,symtab(r4) + jsr pc,readop + cmp r4,$', + bne 1f + jsr pc,readop + br opl23 +1: + tst (sp)+ + rts pc + +opl25: +opl26: +opl27: + mov r0,-(sp) + mov dot-2,r1 + asl r1 + mov dot,savdot-4(r1) + jsr r5,flush; txtp + jsr r5,flush; relp + mov (sp),r2 + add $txtseek-[2*25],r2 + mov r2,tseekp + mov (r2),r0 + jsr r5,oset; txtp + add $trelseek-txtseek,r2 + mov (r2),r0 + mov r2,rseekp + jsr r5,oset; relp + mov (sp)+,r0 + mov savdot-[2*25](r0),dot + asr r0 + sub $25-2,r0 + mov r0,dot-2 / new . relocation + tst (sp)+ + rts pc + +opl32: + cmp r4,$200 + blo 1f + mov r4,-(sp) + jsr pc,readop + jsr pc,readop + jsr pc,expres + mov (sp)+,r0 + bit $37,symtab(r0) + bne 1f + bis $40,symtab(r0) + mov r2,symtab+2(r0) +1: + tst (sp)+ + rts pc + +addres: + clr -(sp) +4: + cmp r4,$'( + beq alp + cmp r4,$'- + beq amin + cmp r4,$'$ + beq adoll + cmp r4,$'* + bne getx + jmp astar +getx: + jsr pc,expres + cmp r4,$'( + bne 2f + jsr pc,readop + mov r2,(r5)+ + mov r3,(r5)+ + mov xsymbol,(r5)+ + jsr pc,expres + jsr pc,checkreg + jsr pc,checkrp + bis $60,r2 + bis (sp)+,r2 + rts pc + +2: + cmp r3,$24 + bne 1f + jsr pc,checkreg + bis (sp)+,r2 + rts pc +1: + mov r3,-(sp) + bic $40,r3 + mov (sp)+,r3 + bis $100000,r3 + sub dot,r2 + sub $4,r2 + cmp r5,$adrbuf + beq 1f + sub $2,r2 +1: + mov r2,(r5)+ / index + mov r3,(r5)+ / index reloc. + mov xsymbol,(r5)+ / index global + mov $67,r2 / address mode + bis (sp)+,r2 + rts pc + +alp: + jsr pc,readop + jsr pc,expres + jsr pc,checkrp + jsr pc,checkreg + cmp r4,$'+ + beq 1f + tst (sp)+ + beq 2f + bis $70,r2 + clr (r5)+ + clr (r5)+ + mov xsymbol,(r5)+ + rts pc +2: + bis $10,r2 + rts pc +1: + jsr pc,readop + bis $20,r2 + bis (sp)+,r2 + rts pc + +amin: + jsr pc,readop + cmp r4,$'( + beq 1f + mov r4,savop + mov $'-,r4 + br getx +1: + jsr pc,readop + jsr pc,expres + jsr pc,checkrp + jsr pc,checkreg + bis (sp)+,r2 + bis $40,r2 + rts pc + +adoll: + jsr pc,readop + jsr pc,expres + mov r2,(r5)+ + mov r3,(r5)+ + mov xsymbol,(r5)+ + mov (sp)+,r2 + bis $27,r2 + rts pc + +astar: + tst (sp) + beq 1f + jsr r5,error; '* +1: + mov $10,(sp) + jsr pc,readop + jmp 4b + +errora: + jsr r5,error; 'a + rts pc + +checkreg: + cmp r2,$7 + bhi 1f + cmp r1,$1 + blos 2f + cmp r3,$5 + blo 1f +2: + rts pc +1: + jsr pc,errora + clr r2 + clr r3 + rts pc + +errore: + jsr r5,error; 'e + rts pc + +checkrp: + cmp r4,$') + beq 1f + jsr r5,error; ') + rts pc +1: + jsr pc,readop + rts pc diff --git a/src/cmd/as27.s b/src/cmd/as27.s new file mode 100644 index 0000000..f8f4b7e --- /dev/null +++ b/src/cmd/as27.s @@ -0,0 +1,260 @@ +/ a7 -- pdp-11 assembler + +expres: + clr xsymbol +expres1: + mov r5,-(sp) + mov $'+,-(sp) + clr r2 + mov $1,r3 + br 1f +advanc: + jsr pc,readop +1: + mov r4,r0 + jsr r5,betwen; 0; 177 + br .+4 + br 7f + movb symtab(r4),r0 + tst r0 + bne 1f + jsr r5,error; 'u +1: + cmp r0,$40 + bne 1f + mov r4,xsymbol + clr r1 + br oprand +1: + mov symtab+2(r4),r1 + br oprand +7: + cmp r4,$141 + blo 1f + movb curfbr-141(r4),r0 + asl r4 + mov curfb-[2*141](r4),r1 + br oprand +1: + mov $esw1,r1 +1: + cmp (r1)+,r4 + beq 1f + tst (r1)+ + bne 1b + tst (sp)+ + mov (sp)+,r5 + rts pc +1: + jmp *(r1) + +esw1: + '+; binop + '-; binop + '*; binop + '/; binop + '&; binop + 037; binop + 035; binop + 036; binop + '%; binop + '[; brack + '^; binop + 1; exnum + 2; exnum1 + '!; binop + 200; 0 + +binop: + cmpb (sp),$'+ + beq 1f + jsr pc,errore +1: + movb r4,(sp) + br advanc + +exnum1: + mov numval,r1 + br 1f + +exnum: + jsr pc,readop + mov r4,r1 +1: + mov $1,r0 + br oprand + +brack: + mov r2,-(sp) + mov r3,-(sp) + jsr pc,readop + jsr pc,expres1 + cmp r4,$'] + beq 1f + jsr r5,error; '] +1: + mov r3,r0 + mov r2,r1 + mov (sp)+,r3 + mov (sp)+,r2 + +oprand: + mov $exsw2,r5 +1: + cmp (sp),(r5)+ + beq 1f + tst (r5)+ + bne 1b + br eoprnd +1: + jmp *(r5) + +exsw2: + '+; exadd + '-; exsub + '*; exmul + '/; exdiv + 037; exor + '&; exand + 035;exlsh + 036;exrsh + '%; exmod + '^; excmbin + '!; exnot + 200; 0 + +excmbin: + mov r0,r3 + br eoprnd + +exrsh: + neg r1 + beq exlsh + inc r1 + clc + ror r2 +exlsh: + jsr r5,combin; relte2 + als r1,r2 + br eoprnd + +exmod: + jsr r5,combin; relte2 + mov r3,r0 + mov r2,r3 + clr r2 + dvd r1,r2 + mov r3,r2 + mov r0,r3 + br eoprnd + +exadd: + jsr r5,combin; reltp2 + add r1,r2 + br eoprnd + +exsub: + jsr r5,combin; reltm2 + sub r1,r2 + br eoprnd + +exand: + jsr r5,combin; relte2 + com r1 + bic r1,r2 + br eoprnd + +exor: + jsr r5,combin; relte2 + bis r1,r2 + br eoprnd + +exmul: + jsr r5,combin; relte2 + mpy r2,r1 + mov r1,r2 + br eoprnd + +exdiv: + jsr r5,combin; relte2 + mov r3,r0 + mov r2,r3 + clr r2 + dvd r1,r2 + mov r0,r3 + br eoprnd + +exnot: + jsr r5,combin; relte2 + com r1 + add r1,r2 + br eoprnd + +eoprnd: + mov $'+,(sp) + jmp advanc + +combin: + mov r1,-(sp) + clr maxtyp + jsr pc,maprel + mov r0,r1 + mpy $6,r1 + mov r3,r0 + jsr pc,maprel + add (r5)+,r0 + add r1,r0 + movb (r0),r3 + bpl 1f + cmp r3,$-1 + beq 2f + jsr r5,error; 'r +2: + mov maxtyp,r3 +1: + mov (sp)+,r1 + rts r5 + +maprel: + cmp r0,$40 + bne 1f + mov $5,r0 + rts pc +1: + bic $!37,r0 + cmp r0,maxtyp + blos 1f + mov r0,maxtyp +1: + cmp r0,$5 + blos 1f + mov $1,r0 +1: + rts pc + +X = -2 +M = -1 +reltp2: + .byte 0, 0, 0, 0, 0, 0 + .byte 0, M, 2, 3, 4,40 + .byte 0, 2, X, X, X, X + .byte 0, 3, X, X, X, X + .byte 0, 4, X, X, X, X + .byte 0,40, X, X, X, X + +reltm2: + .byte 0, 0, 0, 0, 0, 0 + .byte 0, M, 2, 3, 4,40 + .byte 0, X, 1, X, X, X + .byte 0, X, X, 1, X, X + .byte 0, X, X, X, 1, X + .byte 0, X, X, X, X, X + +relte2: + .byte 0, 0, 0, 0, 0, 0 + .byte 0, M, X, X, X, X + .byte 0, X, X, X, X, X + .byte 0, X, X, X, X, X + .byte 0, X, X, X, X, X + .byte 0, X, X, X, X, X + diff --git a/src/cmd/as28.s b/src/cmd/as28.s new file mode 100644 index 0000000..b1e8b53 --- /dev/null +++ b/src/cmd/as28.s @@ -0,0 +1,74 @@ +/ as8 -- PDP-11 assembler pass 2 + +chartab: + <\0abcdefg> + + + + <6789_.> + +qnl: +qii: + +a.out: +badfil: / a file which should never exist + +.even +a.outp: a.out +a.tmp1: badfil +a.tmp2: badfil +a.tmp3: badfil + +tseekp: txtseek +rseekp: trelseek + +txtmagic: + br .+20 +txtsiz: .=.+2 +datsiz: .=.+2 +bsssiz: .=.+2 +symsiz: .=.+2 +stksiz: .=.+2 +exorig: .=.+2 + .=.+2 + +txtseek: 20 +datseek: .=.+2 + .=.+2 +trelseek: .=.+2 +drelseek: .=.+2 + .=.+2 +symseek: .=.+2 + +fbbufp: .=.+2 +defund: .=.+2 +savdot: .=.+6 +datbase: .=.+2 +bssbase: .=.+2 +fbfil: .=.+2 +fin: .=.+2 +ibufc: .=.+2 +txtfil: .=.+2 +symf: .=.+2 +adrbuf: .=.+12. +xsymbol: .=.+2 +fout: .=.+2 +ch: .=.+2 +wordf: .=.+2 +argb: .=.+22. +line: .=.+2 +savop: .=.+2 +curfb: .=.+20. +nxtfb: .=.+20. +nxtfbp: .=.+20. +curfbr: .=.+10. +nxtfbr: .=.+10. +numval: .=.+2 +maxtyp: .=.+2 +relfil: .=.+2 +ibufp: .=.+2 +inbuf: .=.+512. +txtp: .=.+6+512. +relp: .=.+6+512. +swapf: .=.+2 +rlimit: .=.+2 diff --git a/src/cmd/as29.s b/src/cmd/as29.s new file mode 100644 index 0000000..124c50b --- /dev/null +++ b/src/cmd/as29.s @@ -0,0 +1,263 @@ +/ as9 -- PDP-11 assembler pass 2 + +eae = 0 + +symtab = .-200 + +/ special variables + + 02; dot:000000 /. + 01; dotdot:000000 /.. + +/ register + +24;000000 /r0 +24;000001 /r1 +24;000002 /r2 +24;000003 /r3 +24;000004 /r4 +24;000005 /r5 +24;000006 /sp +24;000007 /pc + + +.if eae +/eae & switches + +01;177570 /csw +01;177300 /div +01;177302 /ac +01;177304 /mq +01;177306 /mul +01;177310 /sc +01;177311 /sr +01;177312 /nor +01;177314 /lsh +01;177316 /ash + +.endif + +/ system calls + +01;0000001 /exit +01;0000002 /fork +01;0000003 /read +01;0000004 /write +01;0000005 /open +01;0000006 /close +01;0000007 /wait +01;0000010 /creat +01;0000011 /link +01;0000012 /unlink +01;0000013 /exec +01;0000014 /chdir +01;0000015 /time +01;0000016 /makdir +01;0000017 /chmod +01;0000020 /chown +01;0000021 /break +01;0000022 /stat +01;0000023 /seek +01;0000024 /tell +01;0000025 /mount +01;0000026 /umount +01;0000027 /setuid +01;0000030 /getuid +01;0000031 /stime +01;0000032 /quit +01;0000033 /intr +01;0000034 /fstat +01;0000035 /cemt +01;0000036 /mdate +01;0000037 /stty +01;0000040 /gtty +01;0000041 /ilgins +01;0000042 /nice + +/ double operand + +13;0010000 /mov +13;0110000 /movb +13;0020000 /cmp +13;0120000 /cmpb +13;0030000 /bit +13;0130000 /bitb +13;0040000 /bic +13;0140000 /bicb +13;0050000 /bis +13;0150000 /bisb +13;0060000 /add +13;0160000 /sub + +/ branch + +06;0000400 /br +06;0001000 /bne +06;0001400 /beq +06;0002000 /bge +06;0002400 /blt +06;0003000 /bgt +06;0003400 /ble +06;0100000 /bpl +06;0100400 /bmi +06;0101000 /bhi +06;0101400 /blos +06;0102000 /bvc +06;0102400 /bvs +06;0103000 /bhis +06;0103000 /bec +06;0103000 /bcc +06;0103400 /blo +06;0103400 /bcs +06;0103400 /bes + +/ single operand + +15;0005000 /clr +15;0105000 /clrb +15;0005100 /com +15;0105100 /comb +15;0005200 /inc +15;0105200 /incb +15;0005300 /dec +15;0105300 /decb +15;0005400 /neg +15;0105400 /negb +15;0005500 /adc +15;0105500 /adcb +15;0005600 /sbc +15;0105600 /sbcb +15;0005700 /tst +15;0105700 /tstb +15;0006000 /ror +15;0106000 /rorb +15;0006100 /rol +15;0106100 /rolb +15;0006200 /asr +15;0106200 /asrb +15;0006300 /asl +15;0106300 /aslb +15;0000100 /jmp +15;0000300 /swab + +/ jsr + +07;0004000 /jsr + +/ rts + +10;000200 /rts + +/ simple operand + +11;104400 /sys + +/ flag-setting + +01;0000241 /clc +01;0000242 /clv +01;0000244 /clz +01;0000250 /cln +01;0000261 /sec +01;0000262 /sev +01;0000264 /sez +01;0000270 /sen + +/ floating point ops + +01;170000 / cfcc +01;170001 / setf +01;170011 / setd +01;170002 / seti +01;170012 / setl +15;170400 / clrf +15;170700 / negf +15;170600 / absf +15;170500 / tstf +12;172400 / movf +14;177000 / movif +05;175400 / movfi +14;177400 / movof +05;176000 / movfo +14;172000 / addf +14;173000 / subf +14;171000 / mulf +14;174400 / divf +14;173400 / cmpf +14;171400 / modf +24;000000 / fr0 +24;000001 / fr1 +24;000002 / fr2 +24;000003 / fr3 +24;000004 / fr4 +24;000005 / fr5 + +/ 11/45 operations + +30;072000 /als (ash) +30;073000 /alsc (ashc) +30;070000 /mpy +.if eae-1 +30;070000/ mul +30;071000 / div +30;072000 / ash +30;073000 /ashc +.endif +30;071000 /dvd +07;074000 /xor +15;006700 /sxt +11;006400 /mark +31;077000 /sob + +/ specials + +16;000000 /.byte +20;000000 /.even +21;000000 /.if +22;000000 /.endif +23;000000 /.globl +25;000000 /.text +26;000000 /.data +27;000000 /.bss +32;000000 /.comm + +usymtab: +start: + mov $1,r0 + sys write; qii; 3 + cmp (sp),$4 + bge 1f + jmp aexit +1: + cmp (sp)+,$5 + blt 1f + mov $40,defund / globalize all undefineds +1: + tst (sp)+ + mov (sp)+,a.tmp1 + mov (sp)+,a.tmp2 + mov (sp)+,a.tmp3 + jsr r5,ofile; a.tmp1 + movb r0,txtfil + jsr r5,ofile; a.tmp2 + movb r0,fbfil + jsr r5,ofile; a.tmp3 + movb r0,symf + movb r0,fin + sys creat; a.out; 12 + bec 1f + jsr r5,filerr; a.outp +1: + movb r0,fout + jmp go + +ofile: + mov *(r5),0f + sys open; 0:..; 0 + bes 1f + tst (r5)+ + rts r5 +1: + jmp filerr + +end: diff --git a/src/cmd/bas0.s b/src/cmd/bas0.s new file mode 100644 index 0000000..e37c2f1 --- /dev/null +++ b/src/cmd/bas0.s @@ -0,0 +1,346 @@ +/ bas0 -- basic + +.globl main +.globl sin, cos, log, exp, atan, pow +.globl atoi, atof, ftoa, ftoo +.globl rand, srand + +one = 40200 + +main: + setd + sys time + mov r1,r0 + mov r0,randx + jsr pc,srand + sys intr; intrup + mov sp,gsp + clr seeka + mov $'a,r1 +1: + movb r1,tmpf+8 + sys stat; tmpf; line + bes 1f + inc r1 + cmp r1,$'z + blos 1b + br 2f +1: + sys creat; tmpf; 14 + bes 2f + mov r0,tfo + sys open; tmpf; 0 + bec 1f +2: + mov $3f,r0 + jsr pc,print + sys exit +3: + ; .even +1: + mov r0,tfi + jsr pc,isymtab + cmp (sp),$2 + blt loop + mov 4(sp),0f + sys open; 0:..; 0 + bes 1f + mov r0,fi + br loop +1: + mov $1f,r0 + jsr pc,print + br loop +1: + ; .even + +intrup: + mov $'\n,r0 + jsr r5,putc + jsr r5,error + ; .even + +loop: + mov gsp,sp + clr lineno + jsr pc,rdline + mov $line,r3 +1: + movb (r3),r0 + jsr pc,digit + br 1f + jsr r5,atoi; nextc + cmp r0,$' / + bne 1f + mov $lintab,r3 + mov r1,r0 + bgt 2f + jsr pc,serror +2: + cmp r0,(r3) + beq 2f + tst (r3) + beq 2f + add $6,r3 + br 2b +2: + cmp r3,$elintab-12. + blo 2f + jsr r5,error + ; .even +2: + mov r0,(r3)+ + mov seeka,(r3)+ + mov tfo,r0 + sys seek; seeka:..; 0 + mov $line,r0 + jsr pc,size + inc r0 + add r0,seeka + mov r0,0f + mov tfo,r0 + sys write; line; 0:.. + br loop +1: + mov $line,r3 + jsr pc,singstat + br loop + +nextc: + movb (r3)+,r0 + rts r5 + +size: + clr -(sp) +1: + inc (sp) + cmpb (r0)+,$'\n + bne 1b + mov (sp)+,r0 + rts pc + +rdline: + mov $line,0f +1: + mov fi,r0 + sys read; 0:..; 1 + bes 2f + tst r0 + beq 2f + cmp 0b,$line+99. + bhis 2f / bad check, but a check + movb *0b,r0 + inc 0b + cmp r0,$'\n + bne 1b + clrb *0b + rts pc +2: + mov fi,r0 + beq 1f + sys close + clr fi + br 1b +1: + jmp _done + +error: + tst fi + beq 1f + sys close + clr fi +1: + tst lineno + beq 1f + jsr pc,nextlin + br 1f + mov $line,r0 + jsr pc,print +1: + mov r5,r0 + jsr pc,print + jmp loop + +serror: + dec r3 + tst fi + beq 1f + sys close + clr fi +1: + mov $line,r1 +1: + cmp r1,r3 + bne 2f + mov $'_,r0 + jsr r5,putc + mov $10,r0 + jsr r5,putc +2: + movb (r1),r0 + jsr r5,putc + cmpb (r1)+,$'\n + bne 1b + jmp loop + +print: + mov r0,0f + jsr pc,size + mov r0,0f+2 + mov $1,r0 + sys write; 0:..; .. + rts pc + +digit: + cmp r0,$'0 + blo 1f + cmp r0,$'9 + bhi 1f + add $2,(sp) +1: + rts pc + +alpha: + cmp r0,$'a + blo 1f + cmp r0,$'z + bhi 1f + add $2,(sp) +1: + rts pc + +name: + mov $nameb,r1 + clr (r1) + clr 2(r1) +1: + cmp r1,$nameb+4 + bhis 2f + movb r0,(r1)+ +2: + movb (r3)+,r0 + jsr pc,alpha + br 2f + br 1b +2: + jsr pc,digit + br 2f + br 1b +2: + mov $resnam,r1 +1: + cmp nameb,(r1) + bne 2f + cmp nameb+2,2(r1) + bne 2f + sub $resnam,r1 + asr r1 + add $2,(sp) + rts pc +2: + add $4,r1 + cmp r1,$eresnam + blo 1b + mov $symtab,r1 +1: + tst (r1) + beq 1f + cmp nameb,(r1) + bne 2f + cmp nameb+2,2(r1) + bne 2f + rts pc +2: + add $14.,r1 + br 1b +1: + cmp r1,$esymtab-28. + blo 1f + jsr r5,error + ; .even +1: + mov nameb,(r1) + mov nameb+2,2(r1) + clr 4(r1) + clr 14.(r1) + rts pc + +skip: + cmp r0,$' / + bne 1f + movb (r3)+,r0 + br skip +1: + rts pc + +putc: + tstb drflg + beq 1f + jsr pc,drput + rts r5 +1: + mov r0,ch + mov $1,r0 + sys write; ch; 1 + rts r5 + +nextlin: + clr -(sp) + mov $lintab,r1 +1: + tst (r1) + beq 1f + cmp lineno,(r1) + bhi 2f + mov (sp),r0 + beq 3f + cmp (r0),(r1) + blos 2f +3: + mov r1,(sp) +2: + add $6,r1 + br 1b +1: + mov (sp)+,r1 + beq 1f + mov (r1)+,lineno + mov (r1)+,0f + mov tfi,r0 + sys seek; 0:..; 0 + mov tfi,r0 + sys read; line; 100. + add $2,(sp) +1: + rts pc + +getloc: + mov $lintab,r1 +1: + tst (r1) + beq 1f + cmp r0,(r1) + beq 2f + add $6,r1 + br 1b +1: + jsr r5,error + +erm: + .even +tmpw: .=.+2 +tmpr: .=.+2 +/ +/ remove a 'file' from memory +/ +remove: + mov (sp)+,r3 + bgt 5f + mov $1,vflag + mov asmem,r1 + jsr pc,rewind + mov r(r1),-(sp) +4: + tst iflag + beq 1f + jmp loop +1: + jsr pc,getword + bes 4f + mov r0,r2 + jsr pc,ask + bec 1f + mov r(r1),(sp) + br 4b +1: + jsr pc,getword + br 2f +5: + mov (sp),r0 + jsr pc,getspq + bec 2f + tst qflag + blt 6f + mov (sp),r1 + jsr pc,nothere + br 3f +2: + mov r0,r1 + jsr pc,release + mov r2,r1 + jsr pc,release + jsr pc,rm +3: + tst vflag + bne 3f + tst iflag + beq 1f + jmp loop +1: + tst qflag + bgt 5b +6: + tst (sp)+ + dec r3 + bgt 5b + jmp loop +3: + mov asmem,r1 + mov (sp),r(r1) + br 4b +4: + tst (sp)+ + jmp loop +/ +/ rename a 'file' +/ +rename: + mov (sp)+,r3 + bne 1f + jmp error +1: + sub $2,r3 + blt 1f +5: + mov (sp),r0 + jsr pc,getsp + bes 4f + tst (sp)+ + sub $4,r(r1) + mov (sp),r0 + mov r2,-(sp) + mov r(r1),-(sp) + jsr pc,getsp + bes 3f + mov r2,-(sp) + mov r0,r1 + jsr pc,release + jsr pc,rm + mov (sp)+,r0 + mov (sp)+,r(r1) + jsr pc,alterword + mov (sp)+,r1 + jsr pc,release + br 5f +3: + mov (sp)+,r(r1) + mov (sp)+,r1 + jsr pc,release + mov $2,r0 + jsr pc,allocate + mov (sp)+,r2 +2: + movb (r2)+,r0 + beq 2f + jsr pc,putchar + br 2b +2: + mov r1,r0 + mov asmem,r1 + jsr pc,alterword +5: + tst iflag + beq 2f + jmp loop +2: + tst r3 + beq 2f + sub $2,r3 + bge 5b +1: + tst (sp)+ + jmp error +2: + jmp loop +4: + mov (sp)+,r1 + jsr pc,nothere + tst (sp)+ + br 5b +/ +/ list contents of asmem +/ +list: + mov $buffer,r2 + movb $'\n,(r2)+ + jsr pc,output + mov (sp)+,r3 + beq 1f + mov $1,vflag +5: + tst iflag + beq 2f + jmp loop +2: + mov (sp),r0 + jsr pc,getspq + bes 4f + mov r2,r1 + br 3f +1: + mov asmem,r1 + jsr pc,fsfile + sub $2,r(r1) +2: + tst iflag + bne 2f + jsr pc,backword + bes 2f + mov r0,r1 +3: + jsr pc,getn + movb $'\n,(r2)+ + jsr pc,output + tst vflag + bne 1f + mov asmem,r1 + sub $2,r(r1) + br 2b +1: + tst qflag + bgt 5b +4: + tst (sp)+ + dec r3 + bgt 5b +2: + mov $buffer,r2 + movb $'\n,(r2)+ + jsr pc,output + jmp loop +/ +/ list a 'file +/ +listf: + mov (sp)+,r3 + bgt 4f + jmp error +4: + mov (sp),r0 + jsr pc,getspq + bes 3f + mov r0,r4 + mov r2,r1 + jsr pc,rewind + mov $buffer,r2 + movb $'\n,(r2)+ +1: + jsr pc,getchar + bes 1f + movb r0,(r2)+ + cmp r2,$bufend + blo 1b + jsr pc,output + br 1b +1: + mov r4,r1 + jsr pc,rewind + movb $':,(r2)+ + cmp r2,$bufend + blo 2f + jsr pc,output +2: + movb $'\n,(r2)+ +1: + tst iflag + beq 2f + jmp loop +2: + cmp r2,$bufend + blo 2f + jsr pc,output +2: + jsr pc,getchar + bes 1f + movb r0,(r2)+ + br 1b +1: + jsr pc,output +3: + tst qflag + bgt 4b + tst (sp)+ + dec r3 + bgt 4b + mov $buffer,r2 + movb $'\n,(r2)+ + jsr pc,output + jmp loop +/ +fin: + jsr pc,flush + jsr pc,whead + 4 +q: + jsr pc,flush + jsr pc,whead + sys exit +memck: mov (sp)+,r3 +2: + ble 2f + mov (sp)+,r1 + cmpb (r1),$'p + bne 1f + bis $1,vflag + br 3f +1: + cmpb (r1),$'f + bne 3f + bis $2,vflag +3: + dec r3 + br 2b +2: + clr freeh + mov $freeb,r2 +1: + clr (r2)+ + cmp r2,$freen + blo 1b + mov $headers,r2 +2: + cmp l(r2),$hsz + beq 6f + jsr pc,ck + bec 1f + cmp r2,asmem + beq 1f + mov asmem,r1 + jsr pc,rewind + clr r3 +4: + inc r3 + jsr pc,getword + bes 5f + cmp r0,r2 + bne 4b +6: + inc freeh +1: +cont: + add $8.,r2 + cmp r2,$headend-4 + blo 2b + mov asmem,r1 + jsr pc,rewind +4: + jsr pc,getword + bes 4f + tst r(r0) + beq 2f + mov r0,r2 + jsr pc,ck + bes 4b +2: + sub $hblk,r0 + jsr r5,oct + mov $1,r0 + sys write; re; 24. + cmp vflag,$1 + beq 4b + bit $1,r3 + beq 2f + jsr pc,getword + mov r0,r1 + jsr pc,release + br 3f +2: + jsr pc,backword + add $4,r(r1) + mov r0,r1 + jsr pc,release +3: + jsr pc,rm + clr r3 + br 4b +4: + mov freeh,r0 + jsr r5,decml + mov $1,r0 + sys write; frh; 14. + mov $freeb,r2 + mov $1,r3 +6: + cmp r2,$freen + bhis 6f + mov (r2)+,r0 + beq 3f + jsr r5,decml + mov $1,r0 + sys write; frb; 18. + mov r3,r0 + jsr r5,decml + mov $1,r0 + sys write; lf; 1. +3: + asl r3 + br 6b +6: + mov $1,r0 + sys write; lf; 1. + jmp loop +5: + mov r2,r0 + sub $hblk,r0 + jsr r5,oct + mov $1,r0 + sys write; un; 26. + tst vflag + beq 1b + mov r2,r1 + cmp vflag,$2 + beq 3f + jsr pc,rewind + mov $buffer,r2 +2: + jsr pc,getchar + bes 2f + movb r0,(r2)+ + cmp r2,$buffer+80. + blo 2b + jsr pc,output + br 2b +2: + movb $'\n,(r2)+ + jsr pc,output + mov r1,r2 + cmp vflag,$1 + bne 3f + jmp cont +3: + jsr pc,release + jmp cont +/ +interrupt: 4 +/ +un: < header not accounted for\n> +re: < part of asmem released\n> +lf: <\n> +frh: < free headers\n > +frb: < free blocks size > +endc: .even diff --git a/src/cmd/fed3.s b/src/cmd/fed3.s new file mode 100644 index 0000000..7d76a07 --- /dev/null +++ b/src/cmd/fed3.s @@ -0,0 +1,358 @@ +rti = 2 +.globl rm +.globl ck +.globl loop +.globl oct +.globl argc +.globl arg +.globl tfiget +.globl asmem +.globl qflag +.globl vflag +.globl getspq +.globl q +.globl ask +.globl getword +.globl r +.globl w +.globl output +.globl buffer +.globl bufend +.globl fv +.globl getsp +.globl release +.globl nothere +.globl getn +.globl getchar +.globl rewind +.globl iflag +.globl inter +/ output buffer +/ r2 = last char in buffer + 1 +/ r2 returned at beginning of buffer +/ +output: + sub $buffer,r2 + blos 1f + mov r2,0f + mov $1,r0 + sys write; buffer; 0:.. + mov $buffer,r2 +1: + rts pc +/ +/ +/ routine to find the string pointed to by r0 +/ in either memory or curly +/ r1 = where to look +/ +/ returns error set if string not there +/ returns r1 = header of string if there +getsp: + mov r0,-(sp) + mov asmem,r1 + jsr pc,rewind /memory +3: + jsr pc,getword + bes 1f + mov r0,r1 + jsr pc,rewind + mov (sp),r2 +2: + jsr pc,getchar + bes 2f + tstb (r2) + beq 4f + cmpb r0,(r2)+ + beq 2b +4: + mov asmem,r1 + add $2,r(r1) + br 3b +2: + tstb (r2) + bne 4b + mov r1,r2 + mov asmem,r1 + jsr pc,getword + tst (sp)+ + rts pc +1: + mov (sp)+,r0 + sec + rts pc +/ +/ finds header of string with name same as that pointed to by r0 +/ taking into account ? and * +getspq: + mov r0,-(sp) + mov asmem,r1 + tst qflag + bgt 1f + jsr pc,rewind +1: + jsr pc,getword + bes 1f + mov r0,r1 + jsr pc,rewind + mov (sp),r2 +2: + cmpb (r2),$'* + bne 3f + clr strflg + mov $2,qflag + inc r2 + tstb (r2) + beq 6f + mov r2,ch +3: + jsr pc,getchar + bes 2f + tstb (r2) + bne 3f + cmp $2,qflag + bne 4f + mov ch,r2 +3: + cmpb (r2),$'? + bne 3f + inc r2 + tst qflag + bne 2b + mov $1,qflag + br 2b +3: + cmpb r0,(r2)+ + bne 5f + inc strflg + br 2b +5: + cmp $2,qflag + bne 4f + tst strflg + bne 4f + dec r2 + br 2b +4: + mov asmem,r1 + add $2,r(r1) + br 1b +2: + tstb (r2) + bne 4b +6: + mov r1,r2 + mov asmem,r1 + jsr pc,getword + tst (sp)+ + rts pc +1: + mov $-1.,qflag + mov (sp)+,r0 + sec + rts pc +/ +/ tfiget +/ jsr r5,tfiget +/ +tfiget: + clr r0 + sys read; ch; 1 + bes 1f + tst iflag + beq 9f; jmp loop; 9: + tst r0 + beq 1f + movb ch,r0 + rts pc +1: jmp q +/ +/ routine to print file name and error message +/ r2 = next free byte in buffer +/ +nothere: + mov $buffer,r2 +1: + tstb (r1) + beq 1f + movb (r1)+,(r2)+ + br 1b +1: + sub $buffer,r2 + mov r2,0f + mov $1,r0 + sys write; buffer; 0:.. + mov $1,r0 + sys write; err4; 16. + rts pc +/ +/ +/ routine to put characters from string in buffer +/ r1 = header of string +/ on return r2 = next free byte in buffer +/ +getn: + mov $buffer,r2 + jsr pc,rewind +1: + jsr pc,getchar + bes 1f + movb r0,(r2)+ + cmp r2,$bufend + bhis 1f + br 1b +1: rts pc +/ +ask: + mov r2,-(sp) + mov r0,r1 + jsr pc,getn + movb $' ,(r2)+ + jsr pc,output + jsr pc,tfiget + cmpb $'\n,r0 + bne 1f +2: + mov asmem,r1 + add $2,r(r1) + mov (sp)+,r2 + sec + rts pc +1: + cmpb r0,$'y + beq 4f + cmpb r0,$'q + beq 3f +1: + tst iflag + bne 2b + jsr pc,tfiget + cmpb $'\n,r0 + bne 1b + br 2b +4: + tst iflag + bne 2b + jsr pc,tfiget + cmpb $'\n,r0 + bne 1b + mov asmem,r1 + mov (sp)+,r2 + clc + rts pc +3: + tst iflag + bne 2b + jsr pc,tfiget + cmpb $'\n,r0 + bne 1b + mov (sp)+,r2 + jmp loop +inter: + inc iflag + rti +/ to remove an entry from asmem - r points to name ptr +/ +rm: + mov r3,-(sp) + mov asmem,r1 + mov r(r1),r3 + sub $4,r(r1) + mov r(r1),r2 + mov r2,-(sp) +1: + mov r3,r(r1) + jsr pc,getword + bes 1f + mov r(r1),r3 + mov r2,r(r1) + jsr pc,alterword + mov r(r1),r2 + br 1b +1: + mov r2,w(r1) + mov (sp)+,r(r1) + mov (sp)+,r3 + rts pc +/ +/ check that header pointed to by r2 released +/ +ck: + mov r2,-(sp) + mov l(r2),r0 + sub a(r2),r0 + sub $hblk,r2 + jsr pc,log2 + asl r0 + mov r0,ch + mov frlist(r0),r0 +1: + beq 1f + cmp r2,r0 + beq 2f + add $hblk,r0 + mov (r0),r0 + br 1b +2: + mov ch,r0 + inc freeb(r0) + mov (sp)+,r2 + rts pc +1: + mov (sp)+,r2 + sec + rts pc +oct: + mov r1,-(sp) + mov r0,r1 + clr r0 + div $8.,r0 + mov r1,-(sp) + add $'0,(sp) + tst r0 + beq 1f + jsr r5,oct +1: + movb (sp)+,ch + mov $1,r0 + sys write; ch; 1 + mov (sp)+,r1 + rts r5 + +decml: + mov r1,-(sp) + mov r0,r1 + clr r0 + div $10.,r0 + mov r1,-(sp) + add $'0,(sp) + tst r0 + beq 1f + jsr r5,decml +1: + movb (sp)+,ch + mov $1,r0 + sys write; ch; 1 + mov (sp)+,r1 + rts r5 +/ +/ +iflag: 0 +qflag: 0 +vflag: 0 + .data +err4: < not in memory.\n> +err1: +end1: .even + .bss +freeh: .=.+2 +freeb: .=.+32. +freen: +ch: .=.+2 +strflg: .=.+2 +buffer: .=.+512. +bufend: .=.+2 +argc = buffer + 20. +arg = buffer + 256. +fv: .=.+2 + .text diff --git a/src/cmd/form1.s b/src/cmd/form1.s new file mode 100644 index 0000000..1696044 --- /dev/null +++ b/src/cmd/form1.s @@ -0,0 +1,165 @@ +testing = 0 +/ form letter generator +/ command sequence +/ form proto arg1 arg2... +/ where proto is letter +rfo: + sys intr; int + mov $-1,buf + mov (sp)+,r2 /arg count + tst (sp)+ /skip first arg + sub $2,r2 + bge 2f + mov $default,-(sp) +2: + mov (sp)+,letter + +1: sys stat; otfil; buf + bec 2f + sys creat; otfil; 17 + bec cont +2: cmpb $'z,otfil+4 + beq err3 + incb otfil+4 + br 1b + +err3: + mov $1,r0 + sys write; mes3; 24. + sys exit +mes3: +otfil: +default: + .even + +cont: mov r0,rfo + clr rfo+2 + jsr pc,initl + +/ set up argument list +/ + mov $arg,r3 + mov $10.,r0 + jsr pc,allocate + mov r1,(r3)+ +1: + dec r2 + blt 1f + mov $10.,r0 + jsr pc,allocate + mov r1,(r3)+ + mov (sp)+,r4 +2: + movb (r4)+,r0 + beq 1b + jsr pc,putchar + br 2b + +1: + sys time + ashc $-9.,r0 + bic $!177,r0 + div $10125.,r0 + mov $daytab,r2 + sub $365.,r0 + +1: sub (r2)+,r0 + bge 1b + add -(r2),r0 + mov r0,-(sp) + mov arg,r1 + mov montab-daytab(r2),r2 +1: + movb (r2)+,r0 + beq 1f + jsr pc,putchar + br 1b +1: + movb $' ,r0 + jsr pc,putchar + clr r0 + mov (sp),r1 + inc r1 + div $10.,r0 + mov r1,(sp) + mov arg,r1 + tst r0 + beq 1f + add $'0,r0 + jsr pc,putchar +1: + mov (sp)+,r0 + add $'0,r0 + jsr pc,putchar + jmp loop + +daytab: 31.; 29.; 31.; 30.; 31.; 30.; 31.; 31.; 30.; 31.; 30.; 999. + +montab: m1; m2; m3; m4; m5; m6; m7; m8; m9; m10; m11; m12 + +m1: +m2: +m3: +m4: +m5: +m6: +m7: +m8: +m9: +m10: +m11: +m12: + +buf: .=.+34. +.=rfo+516. + +loop: + mov $10.,r0 + jsr pc,allocate + mov r1,opointer + jsr pc,allocate + mov r1,ipointer + jsr pc,allocate + mov r1,curly + mov $10.,r0 + jsr pc,allocate + mov r1,scr + mov letter,r3 + movb $'\{,r0 + jsr pc,putchar +1: + movb (r3)+,r0 + beq 1f + jsr pc,putchar + br 1b +1: + movb $'\},r0 + jsr pc,putchar + + clr switch + + tst iflag + beq 1f + mov $1,tflag + jmp interrupt +1: + jsr pc,scan + + movb $'\n,r0 + jsr r5,putc + jsr r5,flushb + + mov scr,r1 + jsr pc,release + jsr pc,relarg + mov opointer,r1 + jsr pc,release + mov ipointer,r1 + jsr pc,release + jsr pc,relcurl + jsr pc,flush + jsr pc,whead + .if testing + 4 + .endif + sys exit diff --git a/src/cmd/form2.s b/src/cmd/form2.s new file mode 100644 index 0000000..d9c9674 --- /dev/null +++ b/src/cmd/form2.s @@ -0,0 +1,92 @@ +/ scan +/ r1 = pointer to input header +/ r0 = pointer to output header +/ switch = 0 real output +/ not 0 output to r0 +scan: + mov r0,-(sp) + mov r1,-(sp) + +1: + mov (sp),r1 + jsr pc,getchar + bes 5f + cmpb r0,$'\\ + beq 3f + cmpb r0,$'\[ + beq 4f + cmpb r0,$'\{ + beq 4f + cmpb r0,$'\] + beq 1f + cmpb r0,$'\} + beq 7f + cmpb r0,$'\n + bne 6f + jsr pc,lookchar + bes 5f + movb $'\n,r0 +6: + tst switch + beq 2f + mov 2(sp),r1 + jsr pc,putchar + br 1b +2: + jsr r5,putc + br 1b +3: + jsr pc,getchar + br 6b +/ have [ or { +4: + mov r(r1),-(sp) + jsr pc,getchar + bes 1f + cmpb r0,$'0 + blt 4f + cmpb r0,$'9 + bgt 4f + jsr pc,getchar + cmpb r0,$'\] + beq 3f + cmpb r0,$'\} + beq 3f + +4: + mov (sp)+,r(r1) + mov 2(sp),r0 + jsr pc,esub + mov r1,(sp) + mov r0,2(sp) + br 1b + +/ have arg +3: + tst switch + beq 2f + mov opointer,r1 + mov 4(sp),r0 + jsr pc,putword + mov 2(sp),r1 +2: + mov (sp)+,r(r1) + jsr pc,getchar + inc r(r1) /skip ] + jsr pc,earg + br 1b + +5: + tst argf + bne 1f + mov ipointer,r1 + jsr pc,pop + bes 1f + mov r0,(sp) + br 1b +7: + inc curlyf +1: + mov (sp)+,r1 + mov (sp)+,r0 + rts pc diff --git a/src/cmd/form3.s b/src/cmd/form3.s new file mode 100644 index 0000000..6c58111 --- /dev/null +++ b/src/cmd/form3.s @@ -0,0 +1,147 @@ +/ esub +/ r1 = pointer to input string +/ +esub: + mov r1,-(sp) + tst switch + beq 1f + mov opointer,r1 + jsr pc,putword +1: + tst iflag + beq 1f + mov $2,tflag + jmp interrupt +1: + inc switch + mov $10.,r0 + jsr pc,allocate + mov r1,r0 + mov opointer,r1 + jsr pc,putword + mov (sp)+,r1 + jsr pc,scan + + tst iflag + beq 1f + mov $3,tflag + jmp interrupt +1: + mov r2,-(sp) + mov r1,r0 + mov ipointer,r1 + jsr pc,putword + mov opointer,r1 + jsr pc,pop + bec 9f; 4; 9: + mov r0,-(sp) /last output + mov asmem,r1 + jsr pc,getsp + bes 2f +5: + clr curlyf + mov (sp),r1 + mov r0,r2 + jsr pc,release +6: + mov opointer,r1 + jsr pc,pop + bec 4f + clr switch +4: mov r2,r1 + jsr pc,rewind + tst (sp)+ + mov (sp)+,r2 + rts pc + + +/ not in memory +2: + mov curly,r1 + jsr pc,getsp + bes 2f + br 5b +2: + mov (sp),r1 + jsr pc,rewind + mov $'\[,r0 +1: + jsr r5,tfoput + jsr pc,getchar + bec 1b + mov $'\],r0 + jsr r5,tfoput + mov $10.,r0 + jsr pc,allocate + mov r1,r2 + mov (sp),r0 + tst curlyf + beq 1f + clr curlyf + mov curly,r1 + jsr pc,addentry + br 2f +1: + mov asmem,r1 + jsr pc,whead + jsr pc,addentry +2: + mov r2,r1 + jsr pc,accept + br 6b +/ +/ +/ earg +/ r0 = number in ascii +/ +earg: + tst iflag + beq 1f + mov $4,tflag + jmp interrupt +1: + mov r1,-(sp) + inc argf + sub $'0,r0 + asl r0 + mov arg(r0),r1 + beq 5f +4: + mov (sp),r0 + mov r1,(sp) + mov ipointer,r1 + jsr pc,putword + mov opointer,r1 + jsr pc,pop + bec 3f + clr switch +3: + mov (sp)+,r1 + jsr pc,rewind + jsr pc,scan + mov r0,-(sp) + mov ipointer,r1 + jsr pc,pop + bec 9f; 4; 9: + mov r0,r1 + clr argf + clr curlyf + mov (sp)+,r0 + rts pc +5: + mov r0,-(sp) + mov $'\[,r0 + jsr r5,tfoput + mov (sp),r0 + asr r0 + add $'0,r0 + jsr r5,tfoput + mov $'\],r0 + jsr r5,tfoput + mov $10.,r0 + jsr pc,allocate + mov (sp)+,r0 + mov r1,arg(r0) + jsr pc,accept + + br 4b diff --git a/src/cmd/form4.s b/src/cmd/form4.s new file mode 100644 index 0000000..6c7259b --- /dev/null +++ b/src/cmd/form4.s @@ -0,0 +1,250 @@ +rti = 2 +/ accept +/ r1 = header of where to put it +/ +accept: + mov r0,-(sp) + movb $':,r0 + jsr r5,tfoput + movb $' ,r0 + jsr r5,tfoput +2: + jsr r5,tfiget + cmpb r0,$'\n + beq 1f + jsr pc,putchar + br 2b +1: + jsr pc,putchar + jsr r5,tfiget + cmpb r0,$'\n + beq 1f + jsr pc,putchar + br 2b +1: + mov (sp)+,r0 + rts pc +/ +/ +/ routine to get the last word from the string +/ r1=header addr +/ +pop: + jsr pc,fsfile + jsr pc,backword + bes 1f + sub $2,w(r1) +1: + rts pc +/ +/ +/ routine to add an entry to assoc mem or curly +/ r1 = header +/ r0 = header of string name +/ r2 = header of string +/ +addentry: + jsr pc,putword + mov r2,r0 + jsr pc,putword + rts pc +/ +/ +/ routine to find the string pointed to by r0 +/ in either memory or curly +/ r1 = where to look +/ +/ returns error set if string not there +/ returns r1 = header of string if there +/ +getsp: + mov r0,-(sp) + mov r1,-(sp) + jsr pc,rewind /memory +3: + mov 2(sp),r1 + jsr pc,rewind /output + mov (sp),r1 + jsr pc,getword + bes 1f + mov r0,r1 + mov r0,-(sp) + jsr pc,rewind /string +2: + mov (sp),r1 + jsr pc,getchar + bes 2f + movb r0,r2 + mov 4(sp),r1 + jsr pc,getchar + bes 4f + cmpb r0,r2 + beq 2b +4: + tst (sp)+ +4: + mov (sp),r1 + add $2,r(r1) + br 3b +2: + tst (sp)+ + mov 2(sp),r1 + cmp r(r1),w(r1) + bne 4b + mov (sp)+,r1 + jsr pc,getword + tst (sp)+ + rts pc +1: + mov (sp)+,r1 + mov (sp)+,r0 + sec + rts pc +/ +/ +/ tfoput +/ +/ jsr r5,tfoput +/ +tfoput: + mov r0,ch + mov $1,r0 + sys write; ch; 1 + rts r5 +/ +/ +/ tfiget +/ +/ jsr r5,tfiget +/ +tfiget: + clr r0 + sys read; ch; 1 + bes 1f + tst r0 + beq 1f + movb ch,r0 + rts r5 +1: + jsr r5,flushb + tst argf + beq 1f + mov opointer,r1 + jsr pc,pop +1: + mov $5,tflag + jmp interrupt +/ +/ putc +/ jsr r5,putc +/ +putc: + mov r1,-(sp) + mov r2,-(sp) + mov $rfo+2,r1 + mov r1,r2 + add (r1),r2 + movb r0,2(r2) + inc (r1) + cmp (r1),$512. + bge 1f + mov (sp)+,r2 + mov (sp)+,r1 + rts r5 +1: + mov (sp)+,r2 + mov (sp)+,r1 +/ +/ +/ flush output buffer to output file. +/ +flushb: + mov r1,-(sp) + mov r0,-(sp) + mov $rfo,r1 + mov (r1)+,r0 + mov (r1),0f+2 + beq 1f + clr (r1)+ + mov r1,0f + sys write; 0:..;.. +1: + mov (sp)+,r0 + mov (sp)+,r1 + rts r5 +relarg: + mov $arg,r2 +1: + mov (r2)+,r1 + beq 2f + jsr pc,release + br 1b +2: + cmp r2,$arge + blt 1b + rts pc +/ +relcurl: + mov curly,r1 + jsr pc,rewind +1: + jsr pc,getword + bes 1f + mov r0,r1 + jsr pc,release + mov curly,r1 + br 1b +1: + jsr pc,release + rts pc +/ +int: + inc iflag + rti +/ +interrupt: + jsr pc,relarg + tst opointer + beq 2f +1: + mov opointer,r1 + jsr pc,rewind +1: + jsr pc,getword + bes 1f + mov r0,r1 + jsr pc,release + mov opointer,r1 + br 1b +1: + mov opointer,r1 + jsr pc,release + tst ipointer + beq 2f + mov ipointer,r1 + jsr pc,release + tst curly + beq 2f + jsr pc,relcurl + tst scr + beq 2f + mov scr,r1 + jsr pc,release +2: + jsr pc,flush + jsr pc,whead + sys exit +letter: .=.+2 +arg: .=.+20. +arge: 0 +argf: .=.+2 +switch: .=.+2 +curly: .=.+2 +curlyf: .=.+2 +ch: .=.+2 +opointer: .=.+2 +ipointer: .=.+2 +scr: .=.+2 +iflag: 0 +tflag: 0 +end: diff --git a/src/cmd/form5.s b/src/cmd/form5.s new file mode 100644 index 0000000..c8ff078 --- /dev/null +++ b/src/cmd/form5.s @@ -0,0 +1,789 @@ +.globl b1 +.globl hblk +.globl headers +.globl headsz +.globl strend +.globl initl +.globl asmem +.globl b1s +.globl b1e +.globl w1 +.globl stats +.globl lookchar +.globl flush +.globl fsfile +.globl seekchar +.globl backspace +.globl alterchar +.globl zero +.globl getchar +.globl putchar +.globl copy +.globl rewind +.globl create +.globl allocate +.globl release +.globl collect +.globl w,r,a,l +.globl getword +.globl putword +.globl backword +.globl alterword +/ +/ +/ routine to read next character from string +/ pointer to by r1; character returned in r0 +/ c-bit set if character not availiable (eof) +/ +/ mov ...,r1 +/ jsr pc,getchar +/ movb r0,... +/ +getchar: + jsr pc,lookchar + bes 1f + inc r(r1) + tst r0 /clears c-bit +1: rts pc +/ +/ +/ routine to read a string backwards +/ the read pointer is decremented before reading +/ +/ mov ...,r1 +/ jsr pc,backspace +/ mov r0,... +/ +backspace: + cmp a(r1),r(r1) + bhis nochc + dec r(r1) + jsr pc,lookchar + rts pc +nochc: clr r0 + sec + rts pc +/ +/ +/ routine to put a word onto the string +/ +/ mov ...,r1 +/ mov ...,r0 +/ jsr pc,putword +/ +putword: + mov r0,-(sp) + sub $hblk,r0 + jsr pc,putchar + swab r0 + jsr pc,putchar + mov (sp)+,r0 + rts pc +/ +/ +/ routine to get a word from the string +/ +/ mov ...,r1 +/ jsr pc,getword +/ mov r0,... +/ +getword: + jsr pc,lookchar + bes 1f + movb r0,nchar + inc r(r1) + jsr pc,lookchar + bes 1f + movb r0,nchar+1 + inc r(r1) + mov nchar,r0 + add $hblk,r0 +1: rts pc +/ +/ +/ routine to alter the word pointed to by r(r1) +/ by replacing the word there with r0 +/ +/ mov wd,r0 +/ mov ...,r1 +/ jsr pc,alterword +/ +alterword: + mov r0,-(sp) + sub $hblk,r0 + jsr pc,alterchar + swab r0 + jsr pc,alterchar + mov (sp)+,r0 + rts pc +/ +/ +/ routine to get words backwards from string +/ +/ mov ...,r1 +/ jsr pc,backword +/ mov r0,... +/ +backword: + cmp a(r1),r(r1) + bhis nochw + dec r(r1) + jsr pc,lookchar + movb r0,nchar+1 + cmp a(r1),r(r1) + bhis nochw + dec r(r1) + jsr pc,lookchar + movb r0,nchar + mov nchar,r0 + add $hblk,r0 + rts pc +/ +nochw: + clr r0 + sec + rts pc +/ +/ +/ routine to copy the contents of one string +/ to another. +/ +/ mov source,r0 +/ mov dest,r1 +/ jsr pc,copy +/ mov r1,... +/ +/ on return, r1 points to the new string and should +/ be saved. r0 is preserved. +/ +copy: + inc stats+12. + mov r0,-(sp) + mov r1,-(sp) + mov r2,-(sp) + mov r3,-(sp) + mov w(r0),r2 + sub a(r0),r2 /W-A (old) + mov l(r1),r3 + sub a(r1),r3 /L-A (new) + cmp r2,r3 + blos 1f + mov r2,r0 + jsr pc,allocate + mov 4(sp),r0 /new + jsr pc,swap + jsr pc,release + mov r0,r1 + mov 0(sp),r0 /old +1: + mov a(r1),w(r1) /rewind w pointer + cmp r2,$512. + blos copy1 /is a short string +/ + jsr pc,flush + jsr pc,reset +/ + mov a(r0),-(sp) +4: + mov (sp),0f + mov afi,r0 + sys seek;0:.. ;0 /set input pointer + cmp r2,$512. + blos 2f + mov $512.,r3 /# output this time + mov r3,0f + mov r3,3f + add r3,(sp) + sub r3,r2 /# left to output + br 1f +2: + mov r2,0f + mov r2,3f + mov r2,r3 + clr r2 +1: + mov afi,r0 + sys read;b1;0:.. + bes bad + cmp r0,r3 + bne bad + mov afout,r0 + mov (r1),0f + add r3,(r1) + sys seek;0:.. ;0 + sys write;b1;3:.. + bes bad + tst r2 + bgt 4b + tst (sp)+ +/ +/ fix up read ptr of new string +/ +copy2: + mov 6(sp),r0 /restore r0 + mov r(r0),r2 + sub a(r0),r2 + add a(r1),r2 + mov r2,r(r1) +/ +/ restore and return +/ + mov (sp)+,r3 + mov (sp)+,r2 + mov (sp)+,r1 + mov (sp)+,r0 + rts pc +/ +bad: mov $1,r0 + sys write;1f;2f-1f + 4 +1: +2: .even +/ +swap: + mov w(r1),-(sp) + mov w(r0),w(r1) + mov (sp),w(r0) + mov r(r1),(sp) + + mov r(r0),r(r1) + mov (sp),r(r0) + mov a(r1),(sp) + mov a(r0),a(r1) + mov (sp),a(r0) + mov l(r1),(sp) + mov l(r0),l(r1) + mov (sp)+,l(r0) + rts pc +/ +/ copy a short string +/ +copy1: + mov r(r0),-(sp) + mov a(r0),r(r0) + mov nchar,-(sp) + mov r0,r2 /old + mov r1,r3 /new +1: + mov r2,r1 + jsr pc,getchar + bes 1f + mov r3,r1 + jsr pc,putchar + br 1b +1: + mov r2,r0 + mov (sp)+,nchar + mov (sp)+,r(r0) + mov r3,r1 + br copy2 +/ +/ +/ +/ +/ +/ routine to rewind read pointer of string +/ pointed to by r1 +/ +/ mov ...,r1 +/ jsr pc,rewind +/ +rewind: + mov a(r1),r(r1) + rts pc +/ +/ +/ routine to rewind write pointer of string +/ pointed to by r1 +/ +/ mov ...,r1 +/ jsr pc,create +/ +create: + mov a(r1),w(r1) + mov a(r1),r(r1) + rts pc +/ +/ +/ routine to zero a string +/ +/ mov ...,r1 +/ jsr pc,zero +/ +zero: + mov r0,-(sp) + .if testing + jsr pc,preposterous + .endif + mov a(r1),w(r1) + clrb r0 +1: cmp w(r1),l(r1) + bhis 1f + jsr pc,putchar + br 1b +1: mov a(r1),w(r1) + mov (sp)+,r0 + rts pc +/ +/ +/ +/ routine to move the read pointer of a string to the +/ relative position indicated by r0. the string is +/ extended if necessary - there is no error return. +/ +/ mov position,r0 +/ mov ...,r1 +/ jsr pc,seekchar +/ +seekchar: + mov r1,-(sp) + mov r0,-(sp) + .if testing + jsr pc,preposterous + .endif + inc stats+10. +1: + mov (sp),r0 + add a(r1),r0 + cmp r0,l(r1) + bhi 3f + mov r0,r(r1) + cmp r0,w(r1) + blo 1f + mov r0,w(r1) + br 1f +3: + mov (sp),r0 + jsr pc,allocate + mov 2(sp),r0 + jsr pc,copy + jsr pc,swap + jsr pc,release + mov 2(sp),r1 + br 1b +1: + mov (sp)+,r0 + mov (sp)+,r1 + rts pc +/ +/ +/ routine to move read pointer of string to end of string +/ +/ mov ...,r1 +/ jsr pc,fsfile +/ +fsfile: + mov r0,-(sp) + .if testing + jsr pc,preposterous + .endif + inc stats+10. + mov w(r1),r(r1) + mov (sp)+,r0 + rts pc +/ +/ +/ routine to place the character in r0 at the current +/ position of the read pointer - the read pointer +/ is not moved. +/ +/ movb ch,r0 +/ mov ...,r1 +/ jsr pc,alterchar +/ mov r1,... +/ +alterchar: + mov r2,-(sp) + mov r1,-(sp) + mov r0,nchar + .if testing + jsr pc,preposterous + .endif + inc stats+8. +1: cmp r(r1),l(r1) /W,L + blo 3f + mov l(r1),r0 + inc r0 + sub a(r1),r0 /W-A+1 + jsr pc,allocate + mov (sp),r0 + jsr pc,copy + jsr pc,swap + jsr pc,release + mov (sp),r1 +3: + mov r(r1),r0 + jsr pc,bufchar + bec 2f + jsr pc,getbuf + +2: movb nchar,(r0) + mov $1,w1(r2) + mov nchar,r0 /to preserve r0 for user + inc r(r1) + cmp r(r1),w(r1) + blos 3f + mov r(r1),w(r1) +3: + mov (sp)+,r1 + mov (sp)+,r2 + rts pc +/ +/ +/ routine to look at next character from string +/ pointed to by r1; character returned in r0 +/ c-bit set if character not available (end of file) +/ r1 is preserved +/ +/ mov ...,r1 +/ jsr pc,lookchar +/ movb r0,... +/ +lookchar: + mov r2,-(sp) + inc stats+6. + .if testing + jsr pc,preposterous + .endif + cmp w(r1),r(r1) /W,R + blos noch + mov r(r1),r0 + jsr pc,bufchar + bec 2f + jsr pc,getbuf +/ +2: + inc flag + bne 2f + jsr pc,fixct + br 1f +2: + mov flag,u1(r2) +1: + mov (sp)+,r2 + movb (r0),r0 + tst r0 /clears c-bit + rts pc +/ +noch: + mov (sp)+,r2 + clr r0 + sec + rts pc +/ +/ +/ routine to put a character into the string +/ pointed to by r1; character in r0 +/ r0 is preserved; r1 points to the string +/ after return and must be saved. +/ +/ movb ch,r0 +/ mov ...,r1 +/ jsr pc,putchar +/ mov r1,... +/ +putchar: + mov r2,-(sp) + mov r1,-(sp) + mov r0,nchar + .if testing + jsr pc,preposterous + .endif + inc stats+8. +1: cmp w(r1),l(r1) /W,L + blo 3f + mov w(r1),r0 + inc r0 + sub a(r1),r0 /W-A+1 + jsr pc,allocate + mov (sp),r0 + jsr pc,copy + jsr pc,swap + jsr pc,release + mov (sp),r1 +3: + mov w(r1),r0 + jsr pc,bufchar + bec 2f + jsr pc,getbuf +2: movb nchar,(r0) + mov $1,w1(r2) + mov nchar,r0 /to preserve r0 for user + inc w(r1) + inc flag + bne 2f + jsr pc,fixct + br 1f +2: + mov flag,u1(r2) +1: + mov (sp)+,r1 + mov (sp)+,r2 + rts pc +/ +/ +/ routine to flush contents of all buffers. +/ +/ jsr pc,flush +/ +flush: + mov r1,-(sp) + mov r2,-(sp) + mov r3,-(sp) + clr r3 +1: + cmp r3,$numb + bhis 1f + mov r3,r2 + asl r2 + tst w1(r2) + ble 2f + mov r3,r1 + ashc $9.,r1 + bic $777,r1 + add $b1,r1 + jsr pc,clean +2: + inc r3 + br 1b +1: + mov (sp)+,r3 + mov (sp)+,r2 + mov (sp)+,r1 + rts pc +/ +/ +reset: + mov r3,-(sp) + mov r2,-(sp) + clr r3 +1: + cmp r3,$numb + bge 1f + mov r3,r2 + asl r2 + mov $-1.,w1(r2) + clr b1s(r2) + clr b1e(r2) + clr u1(r2) + inc r3 + br 1b +1: + clr flag + mov (sp)+,r2 + mov (sp)+,r3 + rts pc +/ +/ +/ routine to read from disc to a buffer +/ wcing the buffer if necessary +/ +/ mov disc addr,r0 +/ mov buffer addr,r2 +/ jsr pc,getb +/ +/ on return r0 = addr of byte in buffer +/ +getb: + mov r3,-(sp) + mov r1,-(sp) + mov r0,-(sp) + mov r2,r3 + asr r3 + mov r3,r1 + ashc $9.,r1 + bic $777,r1 + add $b1,r1 + tst w1(r2) / w + ble 1f + + jsr pc,clean + +1: mov (sp),r0 + bic $777,r0 /get lowest multiple of 512. + mov r0,0f + mov r0,b1s(r2) /set start + mov afi,r0 + sys seek;0:..;0 + mov r1,0f + sys read;0:..;512. + + mov b1s(r2),b1e(r2) + add $512.,b1e(r2) / set end + clr w1(r2) /clear w + mov (sp)+,r0 + sub b1s(r2),r0 + add r1,r0 / set r0=byte addr in buffer + mov (sp)+,r1 + mov (sp)+,r3 + rts pc +/ +/ +/ routine to wc a buffer +/ +/ mov buffer addr,r2 +/ mov buffer addr+6,r1 beginning of buffer +/ jsr pc,clean +/ +clean: + inc stats+24. + mov r0,-(sp) + mov b1s(r2),0f + mov afout,r0 + sys seek;0:..;0 + mov r1,0f + sys write;0:..;512. + + clr w1(r2) /clear w + mov (sp)+,r0 + rts pc +/ +/ +/ routine to get buffer addr of byte whose disc +/ addr is in r0 - also returns addr of write +/ flag for buffer in r2 +/ +/ mov disc addr,r0 +/ jsr pc,bufchar +/ mov (r0),r0 for read +/ inc (r2) for write must inc w +/ +/ c-bit set if char not in either buffer +/ +bufchar: + mov r1,-(sp) + mov r3,-(sp) + clr r3 +1: + mov r3,r2 + asl r2 + cmp r0,b1s(r2) + blo 2f + cmp r0,b1e(r2) + bhis 2f + sub b1s(r2),r0 + mov r3,r1 + ashc $9.,r1 + bic $777,r1 + add r1,r0 + add $b1,r0 + mov (sp)+,r3 + mov (sp)+,r1 + clc + rts pc +2: + inc r3 + cmp r3,$numb + blt 1b + mov (sp)+,r3 + mov (sp)+,r1 + sec + rts pc +/ +/ +/ routine to get a buffer +/ +/ mov disc addr,r0 +/ jsr pc,getbuf +/ mov (r0),r0 (for read) +/ inc (r2) must inc w for w +/ +getbuf: + mov r4,-(sp) + mov r3,-(sp) + mov $2,r3 + clr r2 + mov $1,r4 +1: + cmp r4,$numb + bge 1f + cmp u1(r3),u1(r2) + bhis 2f + mov r3,r2 +2: + inc r4 + add $2.,r3 + br 1b +1: + mov r2,r3 + jsr pc,getb + add $stats+14.,r3 + inc (r3) + mov (sp)+,r3 + mov (sp)+,r4 + rts pc +/ +/ +/ this routine renumbers the time used cell u1(r2) +/ of the buffers when the clock overflows +/ +fixct: + mov r1,-(sp) + mov r3,-(sp) + mov $numb,r1 + mov $numb,flag +2: + mov r1,u1(r2) + dec r1 + bge 1f + mov (sp)+,r3 + mov (sp)+,r1 + rts pc +1: + clr r2 + mov $2,r3 +1: + cmp r3,$numb2 + bge 2b + cmp u1(r3),u1(r2) + blo 2f + mov r3,r2 +2: + add $2,r3 + br 1b +b + bge 1f + cmp u1(r3),u1(r2) + bhis 2f + mov r3,r2 +2: + inc r4 + add $2.,r3 + br 1b +1: + mov r2,r3 + jsr pc,getb + add $stats+14.,r3 + inc (r3) + mov (sp)+,r3 + mov (sp)+,r4 + rts pc +/ +/ +/ this routine renumbers the time used cell u1(r2) +/ of the buffers when the clock overflows +/ +fixct: + mov r1,-(sp) + mov r3,-(sp) + mov $numb,r1 + mov $numb,flag +2: + mov r1,u1(r2) + dec r1 + bge 1f + mov (sp)+,r3 + mov (sp)+,r1 + rts pc +1: + clr r2 + mov $2,r3 +1: + cmp r3,$numb2 + bge 2b + cmp u1(r3),u1(r2) + blo 2f + mov r3,r2 +2: + add $2,r3 + br 1b diff --git a/src/cmd/form6.s b/src/cmd/form6.s new file mode 100644 index 0000000..934ee78 --- /dev/null +++ b/src/cmd/form6.s @@ -0,0 +1,456 @@ +.globl b1 +.globl log2 +.globl frlist +.globl stats +.globl b1s +.globl b1e +.globl w1 +/ here to allocate a new block +/ +/ +/ mov ...,r0 +/ jsr pc,allocate +/ mov r1,... +/ +/ requested size in bytes in r0 +/ pointer to header of allocated block returned in r1 +/ r0 is preserved +/ +/ convert to words, adjust for header, round up +/ to a power of two +/ +/ each block has a four-word header +/ W - write ptr (also used as link ptr in frlist) +/ R - read ptr +/ A - pointer to head of data +/ L - ptr to (end+1) of data +hsz=6144. +datasz = 32768. +numb=4. +numb2=2*numb +W=0 +R=2 +A=4 +L=6 +/ +allocate: + clr garbage + mov r0,-(sp) + mov r2,-(sp) + mov r3,-(sp) + inc stats + bne 9f; inc stats; 9: + cmp r0,$datasz + blo 9f; 4; 9: + dec r0 + bmi 1f + jsr pc,log2 + inc r0 +1: asl r0 + mov r0,-(sp) + add $2,r0 + cmp r0,$frend-frlist+2 + blo zzz + 4 +/ +/ look on free list for block of required size +/ +zzz: + mov (sp),r0 + tst frlist(r0) + beq xxx +/ +/ found it, allocate and return +/ + mov frlist(r0),r1 + add $hblk,r1 + mov (r1),frlist(r0) + mov a(r1),r0 + mov r0,w(r1) /W + mov r0,r(r1) /R + tst (sp)+ + mov (sp)+,r3 + mov (sp)+,r2 + mov (sp)+,r0 +/ jsr pc,whead + rts pc +/ +/ no block of required size +/ look for larger block +/ +xxx: + tst hblk + beq www + tst (r0)+ + cmp r0,$frend-frlist + bhis www + tst frlist(r0) + bne yyy + br xxx +/ +/ there are no larger blocks; must garbage collect +/ +www: jsr pc,collect + tst r0 + bne zzz +/ +/ out of space +/ + mov $1,r0 + sys write; 1f; 2f-1f + jmp interrupt +1: +2: .even +/ +/ split larger block into two smaller pieces and +/ link together as smaller blocks in the free list. +/ +yyy: + mov hblk,r3 /get free header block + beq www /should never get this + mov frlist(r0),r1 + add $hblk,r1 + mov w(r1),frlist(r0) + mov r3,w(r1) + add $hblk,r3 + mov exp2-2(r0),r2 + add a(r1),r2 + mov w(r3),hblk + mov l(r1),l(r3) + mov r2,l(r1) /L + mov r2,a(r3) + clr w(r3) /W' + mov r1,r2 + sub $hblk,r2 + mov r2,frlist-2(r0) + br zzz +/ +/ +/ here to release a block +/ +/ mov ...,r1 +/ jsr pc,release +/ +/ pointer to block in r1 +/ +release: +/ +/ discover that this is a plausible pointer +/ + mov r0,-(sp) + jsr pc,preposterous +/ +/ find free list index and link block to that entry +/ + inc stats+2 + mov frlist(r0),w(r1) + clr r(r1) + sub $hblk,r1 + mov r1,frlist(r0) + clr r1 /self-defense + mov (sp)+,r0 + rts pc +/ +/ +/ jsr pc,collect +/ +/ coalesce free storage by rejoining paired blocks +/ on the free list. +/ zero is returned in r0 if no paired blocks were found. +/ +collect: + mov r1,-(sp) + mov r2,-(sp) + mov r3,-(sp) + mov r4,-(sp) + clr useful + inc stats+4. + clr r0 /start with smallest blocks + /r0 contains frlist index +loop1: mov $frlist,r1 + add r0,r1 +/ +/ try next list member at this level +/ +loop2: mov (r1),r3 + beq advance /list is empty + add $hblk,r3 + tst (r3) /W + beq advance /only one list element +/ +/ calculate address of buddy +/ + mov a(r3),r4 + sub $hsz,r4 + mov exp2(r0),r2 + xor r2,r4 +1: add $hsz,r4 +/ +/ and search for him +/ +loop3: + cmp a(r3),r4 + beq coal + mov r3,r2 + mov w(r3),r3 + tst r3 + beq nocoal + add $hblk,r3 + br loop3 +/ +/ have found a pair; remove both blocks from list, +/ coalesce them, and put them on next higher list +/ +coal: mov $1,useful + mov w(r3),w(r2) /remove him from list + mov (r1),r2 + add $hblk,r2 + mov r3,r4 + mov w(r2),w(r1) /remove other one + cmp a(r2),a(r4) + bhi 1f + mov r2,-(sp) + mov r4,r2 + mov (sp)+,r4 +1: mov hblk,(r2) + clr r(r2) + mov $hsz,a(r2) + mov $hsz,l(r2) + sub $hblk,r2 + mov r2,hblk + add exp2(r0),l(r4) /L + clr r(r4) + mov frlist+2(r0),w(r4) + sub $hblk,r4 + mov r4,frlist+2(r0) + br loop2 +/ +/ no buddy found, try next block on this list +/ +nocoal: + mov (r1),r1 + add $hblk,r1 + br loop2 +/ +/ advance to next free list +/ +advance: + tst (r0)+ + cmp r0,$frend-frlist + blo loop1 + mov useful,r0 +/ +/ do we have enough headers to continue? +/ + tst garbage + beq 1f + mov $1,r0 + sys write; 4f; 5f-4f + 4 +/ +4: +5: .even +/ +/ +/ restore registers and return +/ +1: + inc garbage + mov (sp)+,r4 + mov (sp)+,r3 + mov (sp)+,r2 + mov (sp)+,r1 + rts pc +/ +garbage:.=.+2 +/ +/ routine to find integer part of log2(x) +/ +/ jsr pc,log2 +/ +/ r0 = log2(r0) +/ +log2: + mov $15.,-(sp) + tst r0 + bne 1f + clr (sp) + br 2f +1: asl r0 + bcs 2f + dec (sp) + br 1b +2: mov (sp)+,r0 + rts pc +/ + 0 +exp2: + 1;2;4;10;20;40;100;200;400;1000;2000;4000; + 10000;20000;40000;100000 +/ +/ routine to discover whether r1 points to +/ a plausible header - to avoid ruination. +/ +/ r1 is preserved and r0 gets a suitable index for frlist +/ +/ jsr pc,preposterous +/ +preposterous: + cmp r1,$headers + bhis 9f; 4; 9: + cmp r1,$headend + blo 9f; 4; 9: + cmp a(r1),$hsz /A + bhis 9f; 4; 9: + cmp l(r1),$hsz+datasz /L + blos 9f; 4; 9: + mov l(r1),r0 /L + sub a(r1),r0 /A + mov r0,-(sp) + jsr pc,log2 + asl r0 + cmp exp2(r0),(sp) + beq 9f; 4; 9: + add $2,r0 + cmp r0,$frend-frlist+2 + blo 9f; 4; 9: + sub $2,r0 + mov r0,(sp) + mov frlist(r0),r0 +1: beq 1f + add $hblk,r0 + cmp r0,r1 + bne 9f; 4; 9: + mov (r0),r0 + br 1b +1: mov (sp)+,r0 + rts pc +/ +/ +/ +whead: + inc stats+22. + mov r0,-(sp) + mov afout,r0 + sys seek; 0; 0 + sys write; hblk; hsz + mov (sp)+,r0 + rts pc +/ +/ +initl: + clr hblk + mov r0,-(sp) + mov r2,-(sp) + sys open;almem; 1 /open for write + bec 2f + sys creat;almem; 17 + bes err2 + inc hblk +2: + mov r0,afout + sys open; almem; 0 /open for read + bes err2 + mov r0,afi + br 1f +/ +err2: + mov $1,r0 + sys write; 4f; 5f-4f + 4 + .data +4: +5: +almem: + .even + .text +/ +1: + tst hblk + bgt 1f + sys read; hblk; hsz /r0 already afi + mov asmdisc,asmem + add $hblk,asmem + br 2f +1: + mov $headers,r2 + mov r2,r0 + sub $hblk,r0 + mov r0,hblk +1: + add $8,r0 + mov r0,(r2) + add $8,r2 + cmp r2,$headend-8. + blo 1b + clr -8(r2) + mov $frlist,r0 +1: + clr (r0)+ + cmp r0,$frend + blo 1b + + mov hblk,r2 + add $hblk,r2 + mov (r2),hblk + clr w(r2) + mov $hsz,a(r2) + mov $hsz+datasz,l(r2) + mov $datasz,r0 + jsr pc,log2 + asl r0 + cmp r0,$frend-frlist + blo 9f; 4; 9: + sub $hblk,r2 + mov r2,frlist(r0) +/ +/ install plausible pointers to make octal dumps look nice +/ + mov $hblk,r1 +1: + mov (r1),r1 + tst r1 + beq 1f + add $hblk,r1 + mov $hsz,a(r1) + mov $hsz,l(r1) + mov $hsz,r(r1) + br 1b +1: + mov afout,r0 + sys write;hblk;hsz + jsr pc,reset + mov $4,r0 + jsr pc,allocate + mov r1,asmem + mov r1,asmdisc + sub $hblk,asmdisc +2: + mov (sp)+,r2 + mov (sp)+,r0 + rts pc +/ +/ + .bss +/ +b1s: .=.+numb2 +b1e: .=.+numb2 +w1: .=.+numb2 +u1: .=.+numb2 +b1: .=. + [512.*numb] +flag: .=.+2 +stats: .=.+24. /alloc/release/collect/get/put/seek/copy +useful: .=.+2 +afi: .=.+2 +afout: .=.+2 +asmem: .=.+2 +nchar: .=.+2 +/ +/ +hblk: .=.+2 /must remain here - pointer to free header +frlist: .=hblk+34. +frend: +asmdisc:.=.+2 +headers: .=hblk+hsz +headend: + .text diff --git a/src/cmd/fstrip.s b/src/cmd/fstrip.s new file mode 100644 index 0000000..703bfbc --- /dev/null +++ b/src/cmd/fstrip.s @@ -0,0 +1,200 @@ +/ fstrip -- remove fortran internal symbols + +.globl fopen +.globl getw +.globl putw +.globl flush + + mov (sp)+,argc + tst (sp)+ + br loop +unloop: + sys unlink; s.tmp +loop: + dec argc + bgt 1f + sys exit +1: + mov (sp)+,r4 + mov r4,r0 + jsr r5,fopen; ibuf + bcc 1f + jsr r5,mesg; ; .even + br loop +1: + mov $'a,r1 +1: + movb r1,s.tmp+8 + sys stat; s.tmp; obuf + bec 2f + sys creat; s.tmp; 10 + bec 1f +2: + inc r1 + cmp r1,$'z + blos 1b + jsr r5,mesg; ; .even + sys exit +1: + mov r0,obuf + clr obuf+2 + clr obuf+4 + jsr r5,getw; ibuf + cmp r0,magic + beq 1f + jsr r5,mesg; ; .even + br unloop +1: + jsr r5,putw; obuf + jsr r5,getw; ibuf + mov r0,r2 + jsr r5,putw; obuf + jsr r5,getw; ibuf + add r0,r2 + jsr r5,putw; obuf + jsr r5,getw; ibuf + jsr r5,putw; obuf + jsr r5,getw; ibuf + jsr r5,putw; obuf + jsr r5,getw; ibuf + jsr r5,putw; obuf + jsr r5,getw; ibuf + jsr r5,putw; obuf + jsr r5,getw; ibuf + cmp r0,$1 + bne 9f + asr r2 / no relocation +9: + jsr r5,putw; obuf +1: + jsr r5,getw; ibuf + bcc 2f + jsr r5,mesg; ; .even + sys exit +2: + jsr r5,putw; obuf + dec r2 + bne 1b + clr r2 +1: + jsr r5,getsym + bcs 1f + cmpb symbol+1,$'0 + blo 3f / not digit + cmpb symbol+1,$'9 + bhi 3f + cmpb symbol,$'t + beq 1b + cmpb symbol,$'d + beq 1b + cmpb symbol,$'c + beq 1b +3: + jsr r5,putsym + add $14,r2 + br 1b +1: + jsr r5,flush; obuf + mov obuf,r0 + sys close + mov ibuf,r0 + sys close + mov r4,0f + sys creat; 0:..; 0 / same mode as before + bec 1f + jsr r5,mesg; ; .even + jmp unloop +1: + mov r0,ibuf + sys open; s.tmp; 0 + bec 1f + jsr r5,mesg; ; .even + sys exit +1: + mov r0,ibuf+2 + sys read; obuf; 512. + mov r2,obuf+10 / new data + br 2f +1: + mov ibuf+2,r0 + sys read; obuf; 512. +2: + mov r0,0f + beq 1f + mov ibuf,r0 + sys write; obuf; 0:.. + br 1b +1: + mov ibuf,r0 + sys close + mov ibuf+2,r0 + sys close + jmp unloop + +mesg: + movb (r5)+,ch + beq 1f + mov $1,r0 + sys write; ch; 1 + br mesg +1: + inc r5 + bic $1,r5 + mov r4,r1 +1: + movb (r1)+,ch + beq 1f + mov $1,r0 + sys write; ch; 1 + br 1b +1: + mov $1,r0 + sys write; qnl; 1 + rts r5 + +getsym: + mov r5,-(sp) + mov $symbol,r5 + mov $6,-(sp) +1: + jsr r5,getw; ibuf + bcs 2f + mov r0,(r5)+ + dec (sp) + bne 1b + tst (sp)+ + mov (sp)+,r5 + rts r5 +2: + tst (sp)+ + mov (sp)+,r5 + sec + rts r5 + +putsym: + mov r5,-(sp) + mov $symbol,r5 + mov $6,-(sp) +1: + mov (r5)+,r0 + jsr r5,putw; obuf + dec (sp) + bne 1b + tst (sp)+ + mov (sp)+,r5 + rts r5 + +s.tmp: + +qnl: + <\n> + .even +magic: + br .+20 + +.bss +argc: .=.+2 +symbol: .=.+14 +ibuf: .=.+518. +obuf: .=.+518. +ch: .=.+2 diff --git a/src/cmd/getty.s b/src/cmd/getty.s new file mode 100644 index 0000000..68920d9 --- /dev/null +++ b/src/cmd/getty.s @@ -0,0 +1,179 @@ +/ getty -- get name and tty mode +/ for initialization + +/ cycle through speeds and "login:" messages +/ summarized in itab + +stty = 31. + + sys quit; 0 + sys intr; 0 +0: + jsr r5,nextspeed +1: + mov $name,r5 +2: + jsr r5,getc + cmp r0,$174 + beq 5f + cmp r0,$176 + beq 5f + cmp r0,$'\n + beq 1f + cmp r0,$'\r + beq 4f + cmp r0,$'@ + beq 1b + cmp r0,$'# + bne 3f + cmp r5,$name + blos 2b + dec r5 + br 2b +3: + movb r0,(r5)+ + br 2b +4: + bis $20,flags /cr bit + mov $1,r0 + sys write; nl; 1 + br 2f +5: + mov $tab2741,itabp + inc nowr + br 0b +1: + mov $1,r0 + sys write; cr; 1 +2: + clrb (r5)+ + +/ determine whether terminal is upper-case only + + cmp r5,$name+1 + bhi 1f + bic $4,flags /no data-assume lc +1: + mov $name,r5 +1: + movb (r5)+,r0 + beq 1f + cmp r0,$'A + blo 2f + cmp r0,$'Z + bhi 2f + add $40,r0 / map to lc + movb r0,-1(r5) + br 1b +2: + cmp r0,$'a + blo 1b + cmp r0,$'z + bhi 1b + bic $4,flags + br 1b +1: + clr r0 + mov fstate,r4 + bis flags,4(r4) + sys stty; fstate: .. + +go: + sys exec; login; loginp + sys exit + +getc: + clr r0 + sys read; ch; 1 + tst r0 + beq done + mov ch,r2 + beq 1f +getc1: + cmp r2,$174 + bhis 3f + tst nowr + bne 3f + mov $1,r0 + sys write; ch; 1 +3: + mov r2,r0 + rts r5 +1: + dec $0 / wait a while + bne 1b + mov $name,(sp) + jsr r5,nextspeed +2: + clr r0 / flush nulls + sys read; ch; 1 + tst r0 + beq done + movb ch,r2 + beq 2b + br getc1 + +done: + sys exit + +nextspeed: + mov itabp,r1 + mov (r1)+,0f + bne 1f + mov $itab,itabp + br nextspeed +1: + clr r0 + sys stty; 0:.. + bes go + mov (r1)+,-(sp) + mov (r1)+,fstate + mov r1,itabp + mov (sp)+,r1 +1: + movb (r1)+,ch + beq 1f + mov $1,r0 + sys write; ch; 1 + br 1b +1: + rts r5 + +itabp: itab +loginp: login + name + 0 + +itab: + itty37; ttymes; tty37 + itn300; tnmes; tn300 +tab2741: i2741; m2741; f2741 + 0 + +itty37: 511; 511; 340 / any parity, raw, 150 baud +tty37: 511; 511; 210 / 37 parity, echo, 150 baud +itn300: 521; 521; 340 / any parity, raw, cr, 300 baud +tn300: 521; 521; 310 / any parity, echo, 300 baud +i2741: 1501; 501; 100540 /134 bits, 2741, raw, first time +f2741: 1501; 501; 500 /134 bps, 2741 + + 0 +m2741: <\nlogin: \0> + +ttymes: + <\n\r\p:\alogin: \0> +tnmes: + <\n\r\p;login: \0> + +login: + .even + +nl: <\n> +cr: <\r> + +flags: 004 / upper case map + + .bss +ch: .=.+2 +nowr: .=.+2 +name: .=.+32. diff --git a/src/cmd/glob.c b/src/cmd/glob.c new file mode 100644 index 0000000..e540890 --- /dev/null +++ b/src/cmd/glob.c @@ -0,0 +1,193 @@ +/* global command -- + + glob params + + "*" in params matches r.e ".*" + "?" in params matches r.e. "." + "[...]" in params matches character class + "[...a-z...]" in params matches a through z. + + perform command with argument list + constructed as follows: + if param does not contain "*", "[", or "?", use it as is + if it does, find all files in current directory + which match the param, sort them, and use them + + prepend the command name with "/bin" or "/usr/bin" + as required. +*/ + +char ab[2000]; /* generated characters */ +char *ava[200]; /* generated arguments */ +char **av ava; +char *string ab; + +main(argc, argv) +char *argv[]; +{ + int i, j, c; + int inode, dirf, ap; + int fb[5], sb[17]; + char *cp, *cpo; + + if (argc < 3) { + write(1, "Arg count\n", 10); + return; + } + ap = 0; + av++; + fb[4] = 0; +loop: + cpo = cp = *++argv; + while(c = *cp++) if (c=='*' | c=='?' | c=='[') goto compl; + av[ap++] = copy(cpo); + if (--argc>=2) goto loop; + goto donow; + +compl: + if(*--cp == '/') { + *cp = '\0'; + if((dirf=open(cp==cpo? "/" : cpo, 0))<0) + goto oper; + *cp++ = '/'; + goto compl1; + } + if(cp != cpo) goto compl; + if((dirf=open(".",0)) >= 0) goto compl1; +oper: + write(1, "No directory\n", 13); + return; +compl1: + j = ap; +l2: + while (read(dirf, &inode, 2)>0) { + read(dirf, fb, 8); + if (inode==0) goto l2; + if (match(fb, cp)) { + c = *cp; + *cp = '\0'; + av[ap++] = cat(cpo, fb); + *cp = c; + } + } + close(dirf); + i = j; + while(i=2) goto loop; +donow: + if (ap<=1) { + write(1, "No match\n", 9); + return; + } + av[ap] = 0; + execv(av[0], av); + i = cat("/bin/", av[0]); + execv(i, av); + i = cat("/usr", i); + execv(i, av); + if (stat(i, sb) == 0) { + *av = i; + *--av = "/bin/sh"; + execv(av[0], av); + } + write(1, "No command\n", 11); +} + +match(s, p) +char *s, *p; { + if (*s=='.' & *p!='.') return(0); + return(amatch(s, p)); +} + +amatch(s, p) +char *s, *p; +{ + int c, cc, ok, lc, scc; + + scc = *s; + lc = 077777; + switch (c = *p) { + + case '[': + ok = 0; + while (cc = *++p) { + switch (cc) { + + case ']': + if (ok) + return(amatch(++s, ++p)); + else + return(0); + + case '-': + ok =| lc <= scc & scc <= (cc=p[1]); + } + if (scc==(lc=cc)) ok++; + } + return(0); + + case '?': + caseq: + if(scc) return(amatch(++s, ++p)); + return(0); + case '*': + return(umatch(s, ++p)); + case 0: + return(!scc); + } + if (c==scc) goto caseq; + return(0); +} + +umatch(s, p) +char *s, *p; +{ + if(*p==0) return(1); + while(*s) + if (amatch(s++,p)) return(1); + return(0); +} + +compar(s1,s2) +char *s1, *s2; +{ + int c1,c2; + +loop: + if ((c1 = *s1++)==0) return(0); + if ((c2 = *s2++)==0) return(1); + if (c1==c2) goto loop; + return(c1>c2); +} + +copy(s1) +char *s1; +{ + char *ts; + + ts = string; + while(*string++ = *s1++); + return(ts); +} + +cat(s1, s2) +char *s1, *s2; +{ + char *ts; + + ts = string; + while(*string++ = *s1++); + string--; + while(*string++ = *s2++); + return(ts); +} diff --git a/src/cmd/goto.c b/src/cmd/goto.c new file mode 100644 index 0000000..9857424 --- /dev/null +++ b/src/cmd/goto.c @@ -0,0 +1,64 @@ +int offset 0; + +main(argc, argv) +char *argv[]; +{ + extern fin; + char line[64]; + + fin = dup(0); + if (!gtty(0, line) | argc<=1) { + write(1, "goto error\n", 11); + seek(0, 0, 2); + return; + } + seek(0, 0, 0); +loop: + if (getlin(line)) { + write(1, "label not found\n", 16); + return; + } + if (compar(line, argv[1])) goto loop; + seek(0, offset, 0); +} + +getlin(s) +char s[]; +{ + int ch, i; + + i = 0; +l: + if ((ch=getc())=='\0') return(1); + if (ch!=':') { + while(ch!='\n' & ch!='\0') + ch = getc(); + goto l; + } + while ((ch=getc())==' '); + while (ch!=' ' & ch!='\n' & ch!='\0') { + s[i++] = ch; + ch = getc(); + } + s[i] = '\0'; + return(0); +} + +compar(s1, s2) +char s1[], s2[]; +{ + int c, i; + + i = 0; +l: + if(s1[i] != s2[i]) return(1); + if (s1[i++] == '\0') return(0); + goto l; +} + +getc() +{ + + offset++; + return(getchar()); +} diff --git a/src/cmd/if.c b/src/cmd/if.c new file mode 100644 index 0000000..a62165a --- /dev/null +++ b/src/cmd/if.c @@ -0,0 +1,99 @@ +/* if command */ + +int ap; +int ac; +char **av; + +main(argc, argv) +char *argv[]; +{ + int np, i, c; + char *nargv[50], *ncom, *na, *nxtarg(); + + ac = argc; + av = argv; + if (ac<2) return; + ap = 1; + if (exp()) { + np = 0; + while (na=nxtarg()) + nargv[np++] = na; + nargv[np] = 0; + if (np==0) return; + execv(nargv[0], nargv, np); + i = 0; + ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + while(c=nargv[0][i]) { + ncom[9+i++] = c; + } + ncom[9+i] = '\0'; + execv(ncom+4, nargv, np); + execv(ncom, nargv, np); + write(1, "no command\n", 11); + seek(0, 0, 2); + } +} + +char *nxtarg() { + + if (ap>ac) return(0*ap++); + return(av[ap++]); +} + +exp(s) { + int p1; + + p1 = e1(); + if (eq(nxtarg(), "-o")) return(p1 | exp()); + ap--; + return(p1); +} + +e1() { + int p1; + + p1 = e2(); + if (eq(nxtarg(), "-a")) return (p1 & e1()); + ap--; + return(p1); +} + +e2() { + if (eq(nxtarg(), "!")) + return(!e3()); + ap--; + return(e3()); +} + +e3() { + int p1; + char *a; + + if ((a=nxtarg())==0) goto err; + if(eq(a, "(")) { + p1 = exp(); + if(!eq(nxtarg(), ")")) goto err; + return(p1); + } + + if(eq(a, "-r")) + return(tio(nxtarg(), 0)); + + if(eq(a, "-w")) + return(tio(nxtarg(), 1)); + + if(eq(a, "-c")) + return(tcreat(nxtarg())); + + p1 = nxtarg(); + if (p1==0) goto err; + if(eq(p1, "=")) + return(eq(a, nxtarg())); + + if(eq(p1, "!=")) + return(!eq(a, nxtarg())); +err: + write(1, "if error\n", 9); + exit(); +} + diff --git a/src/cmd/init.s b/src/cmd/init.s new file mode 100644 index 0000000..dc1cb4c --- /dev/null +++ b/src/cmd/init.s @@ -0,0 +1,208 @@ +/ init -- process control initialization + + + + sys intr; 0 + sys quit; 0 + sys 38. / get console switches + cmp r0,$173030 + bne 1f +help: + clr r0 + sys close + mov $1,r0 + sys close + sys open; ctty; 0 + sys open; ctty; 1 + sys exec; shell; shellp + br help +1: + sys mount; rk1; usr + sys mount; rk2; ssys + sys mount; rk3; crp + mov $'0,r1 +1: + movb r1,tapx+8 + sys chmod; tapx; 17 + inc r1 + cmp r1,$'8 + blo 1b + sys creat; utmp; 16 + sys close + sys unlink; dpdlock + sys fork + br daemon + sys fork + br dirass + sys fork + br dds + movb $'x,zero+8. + jsr pc,wtmprec + mov $itab,r1 + br 1f + +daemon: + sys exec; etcdpd; etcdpdp + sys exit + +dirass: + sys chdir; usrmel + sys exec; melda; meldap + sys exit + +dds: + sys exec; usrdd; usrddp + sys exit + +/ create shell processes + +1: + mov (r1)+,r0 + beq pwait + movb r0,ttyx+8 + jsr pc,dfork + mov r0,(r1)+ + br 1b + +/ wait for process to die + +pwait: + sys wait + mov $itab,r1 + +/ search for process id + +2: + tst (r1)+ + beq pwait + cmp r0,(r1)+ + bne 2b + +/ take name out of utmp + + sub $4,r1 + mov r1,-(sp) + mov (r1),r1 + sub $'0,r1 + cmp r1,$'a-'0 + blo 2f + sub $'a-'0-10.,r1 / map a-z into 10. on +2: + asl r1 + asl r1 + asl r1 + asl r1 + mov r1,0f + mov $zero,r1 +2: + clr (r1)+ + cmp r1,$zero+16. + blo 2b + sys open; utmp; 1 + bes 2f + mov r0,r1 + sys seek; 0:..; 0 + mov r1,r0 + sys write; zero; 16. + mov r1,r0 + sys close + +/ re-create user process + +2: + mov (sp)+,r1 + mov (r1)+,r0 + movb r0,ttyx+8 + movb r0,zero+8. + jsr pc,wtmprec + jsr pc,dfork + mov r0,(r1)+ + br pwait + +dfork: + sys fork + br 1f + bes dfork + rts pc +1: + sys quit; 0 + sys intr; 0 + sys chown; ttyx; 0 + sys chmod; ttyx; 15 + sys open; ttyx; 0 + bes help1 + sys open; ttyx; 1 + bes help1 + sys exec; getty; gettyp + sys exit / HELP! + +help1: + jmp help + +wtmprec: + mov r1,-(sp) + sys time + mov r0,zero+10. + mov r1,zero+12. + sys open; wtmp; 1 + bes 2f + mov r0,r2 + sys seek; 0; 2 + mov r2,r0 + sys write; zero; 16. + mov r2,r0 + sys close +2: + mov (sp)+,r1 + rts pc + +etcdpdp: + etcdpd; 0 +meldap: + melda; 0 +usrddp: + usrdd; 0 +usrdd: +melda: +usrmel: +rk1: +rk2: +rk3: +usr: +ssys: +crp: +ctty: +shell: +shellm: <-\0> +dpdlock: + +etcdpd: + +tapx: +utmp: +wtmp: +ttyx: +getty: + .even + +shellp: shellm + 0 +gettyp: getty + 0 +itab: + '0; .. + '1; .. + '2; .. + '3; .. + '4; .. + '5; .. + '6; .. + '7; .. + '8; .. + 'a; .. + 'b; .. + 0 + + .bss +offset: .=.+2 +zero: .=.+8.; .=.+6; .=.+2. diff --git a/src/cmd/ld1.s.part1 b/src/cmd/ld1.s.part1 new file mode 100644 index 0000000..02d6e96 --- /dev/null +++ b/src/cmd/ld1.s.part1 @@ -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 diff --git a/src/cmd/ld2.s.part1 b/src/cmd/ld2.s.part1 new file mode 100644 index 0000000..9b2768f --- /dev/null +++ b/src/cmd/ld2.s.part1 @@ -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/src/cmd/ldx.s b/src/cmd/ldx.s new file mode 100644 index 0000000..e16f270 --- /dev/null +++ b/src/cmd/ldx.s @@ -0,0 +1,130 @@ +/ ldx -- link editor + +a.out: + +l.out: + +undmes: + +movemes: + +norel: + +toomany: + +multi: + +locovflo: + +relerr: + +premeof: + +outfile: + +fnotfound: + +format: + +snotfound: + +mulent: + + +libfil: + +wlib: + + <.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. diff --git a/src/cmd/ln.s b/src/cmd/ln.s new file mode 100644 index 0000000..f505eb9 --- /dev/null +++ b/src/cmd/ln.s @@ -0,0 +1,49 @@ +/ link command + +ln: + mov sp,r5 + cmp (r5)+,$2 + bhis 1f + sys exit +1: + beq 1f + tst (r5)+ + mov (r5)+,0f + mov (r5),0f+2 + br 2f +1: + tst (r5)+ + mov (r5),0f + mov (r5),r4 +1: + tstb (r4)+ + bne 1b +1: + cmpb -(r4),$'/ + beq 1f + cmp (r5),r4 + bne 1b + br err +1: + inc r4 + mov r4,0f+2 +2: + mov 0f,2f + sys stat; 2:..; stbuf + bes err + bit $40000,stbuf+2 + bne err + sys link; 0:..; .. + bes err + sys exit + +err: + mov $1,r0 + sys write; quest; 2 + sys exit + +quest: + + +.bss +stbuf: .=.+40. diff --git a/src/cmd/login.s b/src/cmd/login.s new file mode 100644 index 0000000..829b10b --- /dev/null +++ b/src/cmd/login.s @@ -0,0 +1,280 @@ +/ login -- enter new user + +.globl ttyn +.globl crypt +.globl fopen +.globl getc +.globl mesg + + sys quit; 0 + sys intr; 0 + jsr pc,ttyn + movb r0,ttyx+8. + sub $'0,r0 + cmp r0,$'a-'0 + blo 1f + sub $'a-'0-10.,r0 / map a-z into 10. on +1: + asl r0 + asl r0 + asl r0 + asl r0 + mov r0,offset + mov (sp)+,r5 + tst (sp)+ + dec r5 + ble login + mov (sp)+,r4 + mov $uname,r1 +2: + movb (r4)+,(r1)+ + bne 2b + dec r5 + ble login + mov (sp)+,r4 + mov $passwd,r1 +2: + movb (r4)+,(r1)+ + bne 2b +login: + clrb uname+8. + mov $passwdf,r0 + jsr r5,fopen; pbuf + bec 1f + jsr r5,mesg; ; .even + sys exit +1: + jsr pc,guname +1: + jsr r5,compar; uname + br .+4 + br 2f +3: + jsr r5,getc; pbuf + bes sorry + cmp r0,$'\n + bne 3b + br 1b +sorry: + jsr r5,mesg; ; .even + mov pbuf,r0 + sys close + clr uname + clr passwd + br login +2: + jsr r5,getc; pbuf + cmp r0,$': + beq 2f + mov r0,-(sp) + jsr pc,gpasswd + cmpb (r0)+,(sp)+ + bne sorry + mov r0,0f + jsr r5,compar; 0:.. + br sorry +2: + clr r1 +2: + jsr r5,getc; pbuf + cmp r0,$': + beq 2f + mpy $10.,r1 + sub $'0,r0 + add r0,r1 + br 2b +2: + mov r1,0f + sys chown; ttyx; 0:.. + mov r1,uid +1: + jsr r5,getc; pbuf + cmp r0,$': + bne 1b / skip ident field + mov $dirbuf,r1 +1: + jsr r5,getc; pbuf + cmpb r0,$': + beq 1f + movb r0,(r1)+ + br 1b +1: + clrb (r1) + sys chdir; dirbuf + bec 1f + jsr r5,mesg; ; .even + br sorry +1: + mov $uname+8.,r1 +1: + tstb -(r1) + bne 1f + movb $' ,(r1) + br 1b +1: + cmpb ttyx+8.,$'x + beq 1f + sys open; utmp; 1 + bes 1f + mov r0,r2 + sys seek; offset:..; 0 + movb ttyx+8.,uname+8. + sys time + mov r0,uname+10. + mov r1,uname+12. + mov r2,r0 + sys write; uname; 16. + mov r2,r0 + sys close +1: + cmpb ttyx+8.,$'x + beq 1f + sys open; wtmp; 1 + bes 1f + mov r0,r1 + sys seek; 0; 2 + sys write; uname; 16. + mov r1,r0 + sys close +1: + jsr r5,getc; pbuf + cmp r0,$'\n + beq 1f + mov $shell,r1 +2: + movb r0,(r1)+ + jsr r5,getc; pbuf + cmp r0,$'\n + bne 2b + clrb (r1) +1: + mov pbuf,r0 + sys close + mov $motd,r0 + jsr r5,fopen; pbuf + bes 1f +2: + jsr r5,getc; pbuf + bes 1f + mov r0,uname + mov $1,r0 + sys write; uname; 1 + br 2b +1: + mov pbuf,r0 + sys close + sys stat; mailf; pbuf + bes 1f + tst pbuf+6 + beq 1f + jsr r5,mesg; ; .even +1: + mov uid,r0 + sys setuid + sys exec; shell; shellp + jsr r5,mesg; ; .even + sys exit + +gpasswd: + mov $passwd,r1 + tstb (r1) + bne 3f + clr r0 + sys gtty; ttyb + bic $10,ttyb+4 / turn off echo + clr r0 + sys stty; ttyb + jsr r5,mesg; ; .even +2: + jsr pc,tgetc + movb r0,(r1)+ + beq 1f + cmp r1,$passwd+9. + blo 2b + dec r1 + br 2b +1: + bis $10,ttyb+4 / turn on echo + clr r0 + sys stty; ttyb + jsr r5,mesg; <\n\0>; .even +3: + mov $passwd,r0 + jsr pc,crypt + clrb 8(r0) + rts pc + +guname: + mov $uname,r1 + tstb (r1) + bne 1f + clr (r1)+ + clr (r1)+ + clr (r1)+ + clr (r1)+ + mov $uname,r1 + jsr r5,mesg; ; .even +2: + jsr pc,tgetc + movb r0,(r1)+ + beq 1f + cmp r1,$uname+9. + blo 2b + dec r1 + br 2b +1: + rts pc + +compar: + mov (r5)+,r4 +1: + jsr r5,getc; pbuf + bes 2f + cmpb r0,(r4)+ + beq 1b + cmp r0,$': + bne 1f + tstb -(r4) + bne 1f + tst (r5)+ +1: + rts r5 +2: + tst (sp)+ + jmp sorry + +tgetc: + clr r0 + sys read; ch; 1 + tst r0 + bne 1f + sys exit +1: + mov ch,r0 + cmp r0,$'\n + bne 1f + clr r0 +1: + rts pc + +shellp: + mshell + 0 +utmp: +wtmp: +shell: ; .=shell+32. +mshell: <-\0> +motd: +mailf: +passwdf: +ttyx: +.even +.bss +uname: .=.+16. +passwd: .=.+8. +dirbuf: .=.+32. +shbuf: .=.+32. +ttyb: .=.+6 +uid: .=.+2 +ch: .=.+2 +pbuf: .=.+518. diff --git a/src/cmd/mak b/src/cmd/mak new file mode 100755 index 0000000..628a916 --- /dev/null +++ b/src/cmd/mak @@ -0,0 +1,23 @@ +echo acct.s; as acct.s; mv a.out acct +echo ar.s; as ar.s; mv a.out ar +echo cat.s; as cat.s; mv a.out cat +echo chmod.s; as chmod.s; mv a.out chmod +echo chown.s; as chown.s; mv a.out chown +echo cmp.s; as cmp.s; mv a.out cmp +echo colon.s; as colon.s; mv a.out : +echo date.s; as date.s; mv a.out date +echo df.s; as df.s; mv a.out df +echo dsw.s; as dsw.s; mv a.out dsw +echo dusg.s; as dusg.s; mv a.out dusg +echo fstrip.s; as fstrip.s; mv a.out fstrip +echo getty.s; as getty.s; mv a.out getty +echo init.s; as init.s; mv a.out init +echo ln.s; as ln.s; mv a.out ln +echo login.s; as login.s; mv a.out login +echo ls.s; as ls.s; mv a.out ls +echo as1: as as1?.s; mv a.out as1 +#echo as2: as as2?.s; mv a.out as2 +#echo bas; as bas?.s; mv a.out bas +echo db; as db?.s; mv a.out db +#echo dc; as dc?.s; mv a.out dc +#echo form; as form?.s; mv a.out form diff --git a/src/cmd/unknown.c b/src/cmd/unknown.c new file mode 100644 index 0000000..2a54d2c --- /dev/null +++ b/src/cmd/unknown.c @@ -0,0 +1,80 @@ +char b[242]; +char c[60]; +int nread 1; +char buf[512]; + +main(argc,argv) int argc; char *argv[]; { +int l,isw,k,ifile,i,j; + +if(--argc <= 0) + {ifile = 0; + argc = 0; + goto newl; + } + +l = 1; +while(argc--) + {printf("%s:\n \n",argv[l]); + ifile = open(argv[l++],0); + if(ifile < 0) + {printf("cannot open input file\n"); + exit(); + } + newl: + isw = j = 0; + i = -1; + cont: + while((b[++i] = get(ifile)) != 0) + {if((b[i] >= 'a' & b[i] <= 'z') | + (b[i] >= 'A' & b[i] <= 'Z')) + {c[j++] = b[i]; + goto cont; + } + if(b[i] == '-') + {c[j++] = b[i]; + if((b[++i] = get(ifile)) != '\n') + {c[j++] = b[i]; + goto cont; + } + if(j == 1)goto newl; + isw = 1; + i = -1; + while(((b[++i] = get(ifile)) == ' ') + | (b[i] == '\t') | (b[i] == '\n')); + c[j++] = b[i]; + goto cont; + } + if(b[i] == '\n'){if(isw != 1)goto newl; + i = -1; } + if(isw == 1) + {k = 0; + c[j++] = '\n'; + while(k < j)putchar(c[k++]); + } + isw = j = 0; + } + } +} +get(ifile) int ifile;{ + char *ibuf; + static ibuf; + + if(--nread){ + return(*ibuf++);} + + if(nread = read(ifile,buf,512)){ + if(nread < 0)goto err; + + ibuf = buf; + return(*ibuf++); + } + + nread = 1; + return(0); + +err: + nread = 1; + printf("read error\n"); + return(0); + +}