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); + +}