Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-07 - 43,50433/pasddt.mac
There are 4 other files named pasddt.mac in the archive. Click here to see a list.
	TITLE	DEBSP	*** DEBUG-SUPPORT ***
	TWOSEG

;edit history - starts with edit 2

;2 - check mon.tp so we don't check for write-prot hiseg on tops-20

	;ENTRY POINTS

	ENTRY INDEB.
	ENTRY EXDEB.
	entry ddtdb.
	entry magic,isdisk,debnam

	;EXTERNAL REFERENCES
 
	EXTERN END,DEBUG,.JBFF,MON.TP,IN.DDT,parse,norcht
	search pasunv,uuosym

	;REGISTER DEFINITION

	AC0=0
	AC1=1
	REGIN=1		;INITILISATION OF REGISTERSTACK
	REG= REGIN+1
	REG1=REGIN+1+1
	REG2=REGIN+1+2
	REG3=REGIN+1+3
	REG4=REGIN+1+4
	REG5=REGIN+1+5
	REG6=REGIN+1+6
	JBFFLW=14
	NEWREG=15
	BUFFER=15
	BASIS=16
	TOPP=17

	;CONSTANTS

	MAXEOF=10
	DEBSIZE=1024	;1K


	;ADDRESSES:

	.JBREL= 44
	.JBDDT= 74
	.JBOPC=130
	.GTSGN=14

;START OF DEBUG-SUPPORT'S CODE
;*****************************

	LOC .JBDDT			;UPDATE .JBDDT
	XWD 0,DDTDB.

	RELOC 0		;This program had better be first!!!

;The following is ENTRY2 in DEBUG.  It used to be at 140 - 144.
rgstrs:	block 1
	pushj topp,exdeb.
link:	block 2
status:	block 3
orig16:	block 1
	pushj topp,chk16.

;The following will be STRING, STRINGTYPE and STRINGINDEX in
;DEBUG.  They used to be generated using a NEW.
str:	block 35	;"heap" storage for DEBUG
strptr:	block 4
stridx:	block 5

	RELOC 400000

	.lnkend 1,link
;*** INITDEBUG: TEST ON 'NONSHARABLE', CORE-EXPANSION, DEBUG***

indeb.:	hrrzm	basis	,rgstrs+3	;save bottom of stack
	PUSHJ	TOPP	,SHRCOD		;CALL SHARABLE"
	JUMPE	AC1	,.+3		;NOT SHR
	OUTSTR[ ASCIZ /$   PROGRAMS WITH DEBUGSWITCH ON ( D+ )	MUST NOT BE SHARABLE!
$   TRY AGAIN WITH "SAVE ..." INSTEAD OF "SSAVE ..."/ ]
	JRST	END
	HRRZ	AC1	,.JBFF 		;[1] GET HIGHEST LOC
	MOVEM	AC1	,RGSTRS		;OLD CORE-END BECOMES BEGIN OF DEBUG AREA
	ADDI	AC1	,DEBSIZE
	hrrm	ac1	,.jbff		;[1] new last location
	camg	ac1	,.jbrel		;only do CORE if not enough
	jrst		,indb1
	CORE	AC1	,		;GET CORE FOR DEBUGGING
	HALT				;ERROR RETURN
indb1:	aos		.jbff		;[1] .jbff is one beyond end
	PUSHJ	TOPP	,SAVERG		;SAVE REGISTERS
	move	1	,(topp)		;1 _ ret addr
	move	1	,(1)		;1 _ jrst start
	hrrzm	1	,STATUS		;LH='INIT', RH=PROG.BEGIN
	PUSHJ	TOPP	,DEBUG.
	POPJ	TOPP	,

EXDEB.: PUSHJ	TOPP	,SAVERG		;SAVE REGISTERS
	HRLI	AC1	,1		;STATUS='STOP'
	HRR	AC1	,0(TOPP)	;RH=RETURNADDR
	SUBI	AC1	,1		;RH=STOPADDR
	MOVEM	AC1	,STATUS
	PUSHJ	TOPP	,DEBUG.		;CALL DEBUG
	POPJ	TOPP	,

	jrst indeb.			;another magic entry point - must be ddtdb.-2
ERRDB.: JRST	0	,ERRDB1		;THIS ENTRY MUST BE BEFORE DDTDB.

DDTDB.: PUSHJ	TOPP	,SAVERG		;SAVE REGISTERS
	HRLI	AC1	,2		;STATUS='DDT'
	HRR	AC1	,.JBOPC		;RETURNADDR
	MOVEM	AC1	,STATUS
	PUSHJ	TOPP	,DEBUG.		;CALL DEBUG
	JRST	0	,@.JBOPC	;RETURN TO PROGRAM

ERRDB1:					;RETURNADDR IN AC0 EXPECTED
	HRLI	AC0	,3		;STATUS='RUNTIME ERROR'
	MOVEM	AC0	,STATUS
	PUSHJ	TOPP	,SAVERG		;SAVE REGISTERS
	PUSHJ	TOPP	,DEBUG.		;CALL DEBUG
	POPJ	TOPP	,0


SAVERG: MOVEM	AC0	,@RGSTRS	;SAVE USER-REGISTERS
	MOVE	AC0	,AC1
	HRRZ	AC1	,RGSTRS
	MOVEM	AC0	,1(AC1)
	HRRI	AC0	,2(AC1)
	HRLI	AC0	,2
	BLT	AC0	,17(AC1)
	POPJ	TOPP	,0

DEBUG.: MOVE	AC1	,RGSTRS		;GET DEBUG-REGISTERS
	MOVEI	NEWREG	,DEBSIZE(AC1)
	MOVEI	BASIS	,20(AC1)
	MOVEI	TOPP	,1(BASIS)
	movei reg,rgstrs
	movei reg1,str
	movei reg2,strptr
	movei reg3,stridx
	push p,filcht+tty##		;save old tty mode
	move ac0,[xwd ac1,norcht]	;and set so see eol
	movem ac0,filcht+tty##
	push p,(p)
	setom in.ddt
	PUSHJ	TOPP	,DEBUG		;DEBUG
	setzm in.ddt
	pop p,(p)
	pop p,filcht+tty##		;retore user's tty mode
	HRLZ	17	,RGSTRS		;RESTORE USER-REGISTERS
	BLT	17	,17
	POPJ	TOPP	,

;*** SHARABLE:	TRUE, IF HIGH-SEGMENT IS SHARABLE .
;    SEE DECSYSTEM10 ASSEMBLY LANG.-HANDBOOK: MONITOR CALLS 3.3.4

shrcod:	move ac1,mon.tp		;[2] if not tops-10, can always change
	cain ac1,1		;[2]
	jrst shr10		;[2] is tops-10, test with gettab
	setz ac1,		;[2] not tops-10, say not sharable
	popj topp,		;[2]
shr10:	HRROI	AC1	,.GTSGN		;SEE IF HGH SEGM. IS SH.
	GETTAB	AC1	,		; LOOK AT .GTSGN TABLE
	HALT				;ERROR RETURN
	LSH	AC1	,777736		;SHIFT BIT 1 TO RIGHTMOST PLACE
	ANDI	AC1	,1		;CLEAR THE OTHER BITS
	POPJ	TOPP	,

;The following routine is called by idtree when it finds a
;pushj p,0(1).  It restores the basis of the routine, backs
;up before the pushj, and simulates the code that set ac 1.
;This is the only way I can think of to get the address of
;the routine that was called.

magic:	move reg1,basis		;reg1 _ debugger basis
	hll basis,-1(reg)	;basis of caller
	hlr basis,basis		;in both halves
	move reg,(reg)		;address of pushj
	subi reg,2		;first candidate for start instr
	move reg2,reg		;save - also is last instr to xct
	ldb 1,[point 9,(reg),17]	;ac and index fields
	caie 1,56		;this is what we want as first inst
	soja reg,.-2
	xct (reg)		;found instruction
	addi reg,1		;next
	camg reg,reg2		;if not beyond last to do
	jrst .-3		;then do it.
	movem 1,1(topp)	;they got result in 1
	move basis,reg1		;restore debugger basis
	popj topp,

;isdisk - return true if disk or nul:
; reg - FCB
isdisk:	setzm 1(topp)		;assume the worst
	skipe fileof(reg)	;if open failed
	popj topp,		;forget it
	ldb 1,[point 4,filchn(reg),12] ;get chan no.
	devchr 1,
	tlne 1,(dv.dsk)
	aos 1(topp)		;code = 0; disk - return true
	popj topp,

;debname sets up the file name fields.  It can get its data from
;either of two sources:
;  a binary copy of the fields used by the original source file,
;	compiled into the .REL file
;  an ascii string given by the user in response to the error
;	handler.
;It distinguishes these cases by the fact that the data block starts
;with a zero word in the first case, but not the second.
;  b - fcb
;  c - address of data block
;  d - length of data block, when used as a character string
;Note that these arguments are the same as used by PARSE, the normal
;file-name parser used by PASIO, so we can just call it.
debnam:	move t,filtst(b)	;see if needs init
	caie t,314157
	pushj p,initb.##
	skipe (c)		;if first word is non-zero
	jrst parse		;parse it as string	
	add c,[xwd ^D10,^D10]	;else restore magic words
	pop c,filppn+5(b)
	pop c,filppn+4(b)
	pop c,filppn+3(b)
	pop c,filppn+2(b)
	pop c,filppn+1(b)
	pop c,filppn(b)
	pop c,filpro(b)
	pop c,filext(b)
	pop c,filnam(b)
	pop c,fildev(b)
	popj p,

;This is a routine used as an LUUO handler when we want to break
;after exiting the current procedure.  It uses 16(basis) as an
;indication of the procedure depth.
chk16.:	caml 16,orig16		;are we at same or higher level?
	popj topp,		;yes, nothing to do
	jrst exdeb.		;no - do a break

;***PLATZ FUER LITERALS ***
	LIT
	END