MiniUnix/usr/source/s1/db1.s
/ db1 -- debugger
fpp = 0
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