+/ db1 -- debugger
+
+fpp = 1
+eae = 0
+ldfps = 170100^tst
+
+db:
+ mov sp,r5
+ mov (r5)+,r4
+ tst (r5)+
+ cmp r4,$2
+ blt 1f
+ mov (r5),dbfile
+ mov (r5),odbfil
+ mov (r5)+,namfil
+ cmp r4,$2
+ beq 1f
+ mov (r5)+,namfil
+1:
+ sys open; dbfile: core; 0
+ bec 9f
+ jmp fnfnd
+9:
+ mov r0,dbfin
+ clr dbfout
+ sys open; odbfil:core; 1
+ bes 1f
+ mov r0,dbfout
+1:
+ sys open; namfil: a.out; 0
+ bes 1f
+ mov r0,r1
+ mov r0,symfin
+ sys read; nambuf; 20
+ cmp nambuf,nobjmagic
+ beq 2f
+ cmp nambuf,objmagic
+ bne 1f
+2:
+ mov nambuf+2,r0 / text
+ add nambuf+4,r0 / data
+ cmp nambuf+16,$1 / relocation?
+ beq 6f
+ asl r0 / sym origin
+6:
+ add $20,r0
+ mov r0,0f
+ mov r1,r0
+ sys seek; 0:..; 0
+ mov nambuf+10,r0 / symbol size
+ cmp r0,$maxsym
+ blos 3f
+ mov $maxsym,r0
+3:
+ add r0,0f
+ sys break; 0: nambuf
+ mov r0,0f
+ mov r1,r0
+ sys read; nambuf; 0:..
+ add $nambuf,r0
+ mov r0,namsiz
+1:
+ jsr r5,get; zero / test new object
+ cmp r0,nobjmagic
+ beq 2f
+ cmp r0,objmagic
+ bne 1f
+2:
+ mov $20,getoff
+1:
+ mov sp,savsp
+ sys signal; 2; 1
+ ror r0
+ bcs 1f
+ sys signal; 2; errexit
+1:
+ cmp r4,$2 / arg count
+ beq 9f / not core image
+ cmp r4,$4 / no-core image flag
+ beq 9f
+ mov $1024.,getoff
+ mov dbfin,r0
+ sys seek; 0; 0
+ mov dbfin,r0
+ sys read; regbuf; 1024.
+ mov txtsiz,r0
+ ash $6,r0
+ mov r0,txtsiz
+ add $17777,r0
+ bic $17777,r0
+ mov r0,rtxtsiz
+ mov datsiz,r0
+ ash $6,r0
+ mov r0,datsiz
+ mov stksiz,r0
+ ash $6,r0
+ mov r0,stksiz
+ mov *locfpsr,r0
+ bic $!200,r0
+ mov r0,fpsr
+ br loop
+9:
+loop:
+ clr error
+ jsr pc,readlin
+ jsr pc,readexp
+ tst error
+ bne errexit
+ mov $1,count
+ cmpb r0,$',
+ bne 2f
+ movb (r4)+,r0
+ mov addres,-(sp)
+ mov adrflg,-(sp)
+ jsr pc,readexp
+ mov addres,count
+ mov (sp)+,adrflg
+ mov (sp)+,addres
+ tst error
+ bne errexit
+2:
+ movb (r4),r0
+ jsr pc,command
+ tst error
+ beq loop
+errexit:
+ sys signal; 2; errexit
+ mov savsp,sp
+ jsr r5,mesg; <?\n\0>; .even
+ br loop
+
+fnfnd:
+ jsr r5,mesg; <File not found.\n\0>; .even
+ex:
+ sys exit
+
+readlin:
+ mov $inbuf,r4
+1:
+ mov ttyfin,r0
+ sys read; ch; 1
+ tst r0
+ beq ex
+ cmpb ch,$'\n
+ beq 1f
+ movb ch,(r4)+
+ br 1b
+1:
+ clrb (r4)
+ mov $inbuf,r4
+ rts pc
+
+switch:
+ mov (r5)+,r1
+2:
+ cmp r0,(r1)+
+ bne 1f
+ tst (sp)+
+ jmp *(r1)
+1:
+ tst (r1)+
+ bne 2b
+ rts r5
+
+readexp:
+ mov $'+,lastop
+ clr addres
+ clr starmod
+ clr taddr
+ clr adrflg
+nextxp:
+ movb (r4)+,r0
+ cmp r0,$'0
+ blt 1f
+ cmp r0,$'9
+ ble numin
+ cmp r0,$'a
+ blt 1f
+ cmp r0,$'z
+ bgt 1f
+ jmp letin
+1:
+ cmp r0,$'a-40
+ blt 1f
+ cmp r0,$'z-40
+ ble letin
+1:
+ jsr r5,switch; expsw
+ tstb -(r4)
+ tst starmod
+ beq 1f
+ mov dot,taddr
+ br operand
+1:
+ rts pc
+
+expsw:
+ '+; opex
+ '-; opex
+ ' ; nextxp
+ '.; letin
+ '_; letin
+ '^; circumf
+ '*; star
+ -1; 0
+
+star:
+ mov pc,starmod
+ br nextxp
+
+operand:
+ inc adrflg
+ tst starmod
+ beq 1f
+ clr starmod
+ bis bytemod,error
+ jsr r5,get; taddr
+ tst error
+ bne 1f
+ mov r0,taddr
+1:
+ cmp lastop,$'+
+ beq 1f
+ sub taddr,addres
+ br 2f
+1:
+ add taddr,addres
+2:
+ mov $'+,lastop
+ br nextxp
+
+circumf:
+ mov dot,taddr
+ dec taddr
+ tst bytemod
+ bne operand
+ dec taddr
+ br operand
+
+numin:
+ clr r1
+ clr r3
+1:
+ sub $'0,r0
+ asl r1
+ asl r1
+ asl r1
+ mpy $10.,r3
+ bis r0,r1
+ add r0,r3
+ movb (r4)+,r0
+ cmp r0,$'0
+ blo 1f
+ cmp r0,$'9
+ blos 1b
+1:
+ cmp r0,$'.
+ bne 1f
+ mov r3,r1
+ inc r4
+1:
+ mov r1,taddr
+ dec r4
+ br operand
+
+letin:
+ dec r4
+ mov $nambuf,namstrt
+letin1:
+ mov $symbol,r1
+ clr (r1)+
+ clr (r1)+
+ clr (r1)+
+ clr (r1)
+ mov $symbol,r1
+ mov $8.,-(sp)
+ br 2f
+1:
+ tstb (r4)+
+ cmpb (r4),$'.
+ beq 2f
+ cmpb (r4),$'0
+ blo 3f
+ cmpb (r4),$'9
+ blos 2f
+ cmpb (r4),$'A
+ blo 3f
+ cmpb (r4),$'Z
+ blos 2f
+ cmpb (r4),$'_
+ beq 2f
+ cmpb (r4),$'a
+ blo 3f
+ cmpb (r4),$'z
+ bhi 3f
+2:
+ dec (sp)
+ blt 1b
+ movb (r4),(r1)+
+ br 1b
+3:
+ tst (sp)+
+ jsr pc,lookupn
+ tst error
+ bne 1f
+ cmpb (r4),$';
+ beq 2f
+1:
+ jmp operand
+2:
+ tstb (r4)+
+ mov r1,namstrt
+ br letin1
+
+opex:
+ mov r0,lastop
+ jmp nextxp
+
+
+command:
+ jsr r5,switch; comsw
+ inc error
+ rts pc
+
+comsw:
+ '/; slash
+ '\\; bslash
+ '?; quest
+ '\0; newln
+ '^; circumf
+ '=; equal
+ ':; colon
+ '!; excla
+ ''; squote
+ '"; dquote
+ '$; dolr
+ '&; amper
+ '%; ex
+ '`; grave
+ -1; 0
+
+dolr:
+ mov sigp,r1
+ bic $!17,r1
+ asl r1
+ mov traptab(r1),r1
+ jsr pc,string
+ jsr pc,pnl
+ mov $doltab,r5
+1:
+ mov (r5)+,r1
+ beq 1f
+ jsr pc,*(r5)+
+ br 1b
+ .if fpp
+1:
+ mov (r5)+,r1
+ beq 1f
+ ldfps fpsr
+ jsr pc,*(r5)+
+ br 1b
+1:
+ mov (r5)+,r1
+ jsr pc,*(r5)+
+ .endif
+1:
+ rts pc
+
+traptab:
+ 1f; .data; 1:<?0\0>; .text
+ 1f; .data; 1:<Hangup\0>; .text
+ 1f; .data; 1:<Interrupt\0>; .text
+ 1f; .data; 1:<Quit\0>; .text
+ 1f; .data; 1:<Illegal instruction\0>; .text
+ 1f; .data; 1:<Trace/BPT\0>; .text
+ 1f; .data; 1:<IOT\0>; .text
+ 1f; .data; 1:<EMT\0>; .text
+ 1f; .data; 1:<FP exception\0>; .text
+ 1f; .data; 1:<Killed\0>; .text
+ 1f; .data; 1:<Bus error\0>; .text
+ 1f; .data; 1:<Segmentation violation\0>; .text
+ 1f; .data; 1:<Bad system call\0>; .text
+ 1f; .data; 1:<?15\0>; .text
+ 1f; .data; 1:<?16\0>; .text
+ 1f; .data; 1:<?17\0>; .text
+
+locps: regbuf+1776
+locpc: regbuf+1774
+locr0: regbuf+1772
+locr1: regbuf+1766
+locr2: regbuf+1750
+locr3: regbuf+1752
+locr4: regbuf+1754
+locsp: regbuf+1764
+locr5: regbuf+1756
+locfpsr: regbuf+4
+locfr0: regbuf+6
+locfr4: regbuf+16
+locfr5: regbuf+26
+locfr1: regbuf+36
+locfr2: regbuf+46
+locfr3: regbuf+56
+
+doltab:
+ 1f; prgreg; locsp; .data; 1:<sp \0>; .text
+ 1f; proct; locps; .data; 1:<ps \0>; .text
+ 1f; prgreg; locpc; .data; 1:<pc \0>; .text
+ 1f; prgreg; locr0; .data; 1:<r0 \0>; .text
+ 1f; prgreg; locr1; .data; 1:<r1 \0>; .text
+ 1f; prgreg; locr2; .data; 1:<r2 \0>; .text
+ 1f; prgreg; locr3; .data; 1:<r3 \0>; .text
+ 1f; prgreg; locr4; .data; 1:<r4 \0>; .text
+ 1f; prgreg; locr5; .data; 1:<r5 \0>; .text
+ 0
+ .if fpp
+ 1f; prfreg; locfr0; .data; 1:<fr0 \0>; .text
+ 1f; prfreg; locfr1; .data; 1:<fr1 \0>; .text
+ 1f; prfreg; locfr2; .data; 1:<fr2 \0>; .text
+ 1f; prfreg; locfr3; .data; 1:<fr3 \0>; .text
+ 1f; prfreg; locfr4; .data; 1:<fr4 \0>; .text
+ 1f; prfreg; locfr5; .data; 1:<fr5 \0>; .text
+ 0
+ 1f; proct; locfpsr; .data; 1:<fpsr \0>; .text
+ .endif
+.data
+.even
+.text
+
+ .if fpp
+prfreg:
+ mov *(r5)+,r4
+ movf (r4),fr0
+ cfcc
+ beq 1f
+ jsr pc,string
+ jsr pc,printf
+ jsr pc,pnl
+1:
+ rts pc
+ .endif
+
+prgreg:
+ jsr pc,string
+ mov *(r5)+,r4
+ mov (r4),r0
+ jsr pc,printo
+ mov (r4),r0
+ jsr pc,lookupv
+ tst r2
+ beq 1f
+ jsr r5,mesg; < \0>; .even
+ mov (r4),r0
+ jsr pc,pname
+1:
+ jsr pc,pnl
+ rts pc
+
+proct:
+ jsr pc,string
+ mov *(r5)+,r4
+ mov (r4),r0
+ jsr pc,printo
+ jsr pc,pnl
+ rts pc
+
+string:
+ movb (r1)+,r0
+ beq 1f
+ jsr pc,putc
+ br string
+1:
+ rts pc
+
+putc:
+ mov r0,och
+ mov $1,r0
+ sys write; och; 1
+ rts pc
+
+equal:
+ jsr r5,coleq; printo
+ rts pc
+amper:
+ clr bytemod
+ mov $2,incdot
+ jsr r5,cycle; asymp
+ rts pc
+
+asymp:
+ jsr pc,pname
+ jsr pc,pnl
+ rts pc
+
+bslash:
+ inc bytemod
+ mov $1,incdot
+ br 1f
+
+slash:
+ clr bytemod
+ mov $2,incdot
+1:
+ jsr r5,cycle; octp
+ rts pc
+
+grave:
+ clr bytemod
+ mov $2,incdot
+ jsr r5,cycle; decp
+ rts pc
+
+quest:
+ clr bytemod
+ jsr r5,cycle; psym
+ rts pc
+
+decp:
+ jsr pc,printd
+ jsr r5,mesg; <.\n\0>; .even
+ rts pc
+
+octp:
+ jsr pc,printo
+ jsr pc,pnl
+ rts pc
+
+newln:
+ tst adrflg
+ bne 1f
+ add incdot,dot
+1:
+ mov nlcom,r0
+ jmp command
+
+excla:
+ tst adrflg
+ bne 1f
+2:
+ inc error
+ rts pc
+1:
+ bit $1,dot
+ beq 1f
+ tst bytemod
+ beq 2b
+1:
+ jsr r5,put; dot; addres
+ rts pc
+
+squote:
+ inc bytemod
+ mov $1,incdot
+ br 2f
+dquote:
+ clr bytemod
+ mov $2,incdot
+2:
+ jsr r5,cycle; ascp
+ rts pc
+
+ascp:
+ mov r0,-(sp)
+ jsr pc,ascp1
+ mov (sp)+,r0
+ tst bytemod
+ bne 1f
+ swab r0
+ jsr pc,ascp1
+1:
+ cmp count,$1
+ bgt 1f
+ jsr pc,pnl
+1:
+ rts pc
+
+ascp1:
+ bic $!377,r0
+ cmp r0,$'\n
+ beq 2f
+ cmp r0,$011
+ beq 2f
+ cmp r0,$40
+ blo 1f
+ cmp r0,$177
+ bhis 1f
+2:
+ jsr pc,putc
+ rts pc
+1:
+ mov r0,r1
+ jsr r5,mesg; <\\\0>
+ clr r0
+ alsc $10.,r0
+ add $'0,r0
+ jsr pc,putc
+ clr r0
+ alsc $3,r0
+ add $'0,r0
+ jsr pc,putc
+ clr r0
+ alsc $3,r0
+ add $'0,r0
+ jsr pc,putc
+ rts pc
+
+colon:
+ jsr r5,coleq; pname
+ rts pc
+
+coleq:
+ jsr pc,setadr
+ mov addres,r0
+ jsr pc,*(r5)+
+ jsr pc,pnl
+ rts r5
+
+cycle:
+ mov r0,nlcom
+ jsr pc,setadr
+ mov addres,dot
+ tst bytemod
+ bne 1f
+ bic $1,dot
+1:
+ jsr r5,get; dot
+ tst error
+ bne 1f
+ tst bytemod
+ beq 2f
+ bic $!377,r0
+2:
+ jsr pc,*(r5)
+ tst error
+ bne 1f
+ dec count
+ ble 1f
+ add incdot,dot
+ br 1b
+1:
+ tst (r5)+
+ rts r5
+
+setadr:
+ tst adrflg
+ bne 1f
+ mov dot,addres
+1:
+ rts pc
+
+ .if fpp
+printf:
+ ldfps $200 / round+double
+ mov r4,-(sp)
+ mov r3,-(sp)
+ movif $10.,r3
+ movif $1,r2
+ clr r4
+ tstf r0
+ cfcc
+ beq 2f
+ bge 1f
+ negf r0
+ mov $'-,r0
+ jsr pc,putc
+1:
+ cmpf r3,r0
+ cfcc
+ bgt 1f
+ inc r4
+ divf r3,r0
+ br 1b
+1:
+ cmpf r2,r0
+ cfcc
+ ble 2f
+ dec r4
+ mulf r3,r0
+ br 1b
+2:
+ modf r2,r0
+ movfi r1,r0
+ add $'0,r0
+ jsr pc,putc
+ mov $'.,r0
+ jsr pc,putc
+ mov $8.,r3
+1:
+ modf r3,r0
+ movfi r1,r0
+ add $'0,r0
+ jsr pc,putc
+ dec r3
+ bgt 1b
+ mov $'E,r0
+ jsr pc,putc
+ mov r4,r0
+ mov (sp)+,r3
+ mov (sp)+,r4
+ br printd
+ .endif
+
+printd:
+ mov r1,-(sp)
+ mov r0,r1
+ bpl 1f
+ neg r1
+ mov $'-,r0
+ jsr pc,putc
+1:
+ jsr pc,1f
+ mov (sp)+,r1
+ rts pc
+1:
+ clr r0
+ dvd $10.,r0
+ mov r1,-(sp)
+ mov r0,r1
+ beq 1f
+ jsr pc,1b
+1:
+ mov (sp)+,r0
+ add $'0,r0
+ jsr pc,putc
+ rts pc
+