Google
 

Trailing-Edge - PDP-10 Archives - tops10_704_monitoranf_bb-x140c-sb - 10,7/anf10/dndbg.p11
There are 3 other files named dndbg.p11 in the archive. Click here to see a list.
.SBTTL	DNDBG - DEBUGGING STORAGE BLOCKS  4 MAY 83

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
;  OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1976,1977,1978,1979,1980,1981,1984,1988.
;ALL RIGHTS RESERVED.

VRDBG=012			;FILE EDIT NUMBER

.REPT 0

REVISION HISTORY

0(6)	26-SEP-78	KR	ADD ECHO TASK
0(7)	29-SEP-78	KR	FIX DISCONNECT OF ECHO TASK
.ENDR;.REPT 0

	PROFILE	BLOCK	;RESERVE SOME STORAGE FOR PROFILER DATA
	MCPQUE		;RESERVE SOME STORAGE FOR POKE TRACE
	SINK	STORE	;DEFINE STORAGE FOR SINK FUNCTION
	HDRDMP	STORE	;DEFINE CIRCULAR BUFFER FOR HEADER DUMP
	DMPSLS	STORE	;DEFINE CIRCULAR BUFFERS FOR SYN LINE DEBUGGING

;******** here is a convenient place to insert the soumsg macro calls ******

	NCLLOG	100	;DEFINE CIRCULAR BUFFER FOR NCL TRACE
	NCLLOG		;DEFINE CODE FOR NCL TRACE
	
;	SET SOME PATCH SPACE ASIDE

.IIF	NDF	FT.PAT,FT.PAT=0
.IF	NE	FT.PAT
PATCH:
    .REPT FT.PAT
	.WORD 0			;FILL PATCH SPACE WITH ZEROS.
    .ENDR
.ENDC

.IIF NDF,FTETR,FTETR=0
.IIF NDF,ETRNUM,ETRNUM=1000.
.IF NE,FTETR
	ETRACE	ETRNUM
.ENDC;.IF NE,FTETR
.SBTTL	DNDBG - ECHO TASK ROUTINES	19 Sep 78

.IF NE,FTECHO

.IIF NDF,ECHON,ECHON=1
OBJECH=OBJTSK				;Echo device is a TSK
.MACRO X A				;macro to set symbol EnSTS to the
E'A'STS=E'A'DDB				; DDB address used by DDBGEN
.ENDM X

Z=0
.REPT ECHON				;generate a dummy hardware address
X	\Z				;for each echo device
Z=Z+1
.ENDR;.REPT ECHON

.MACRO DDXGEN A,B,C,D,E			;Generate the device specific part
.ENDM DDXGEN				; of the DDBs

;Now generate the DDB's

DRESET=0				;use new names
	DDBGEN	ECH,E,ECHON,2,<DS.OUT>	;The output bit is set

.SBTTL ECHO - The ECHO TSK device driver

.IIF NE,<.-<ECHSER-2>>,.ERROR .		;Address of task name must precede
	.WORD	ECHNAM			; the service routine name

;The service routine for the ECHO TSK

ECHSER:	JSR	PC,DVCCFM		;Handle connect confirm/etc.

;The main "ECHO" service routine

1$:	JSR	PC,TSKSER		;Call the common TSK code
10$:	  RTS	PC			;Return if nothing to do

;Here to check for data requests so we can send messages

16$:	TSTB	DB.IDR(J)		;Do we have any data requests?
	BLE	10$			;No, leave message in queue

;Here we turn the message around hence - ECHO

20$:	MOV	#002,R0			;NCL Data with EOM message type
	JSR	PC,DVDBSM		;Start a big NCL data [sub]message
	  BCS	10$			;Can't, try again later
	MOV	DB.OBF(J),R1		;Chunk with data from host
	MOV	CN.MLK(R1),DB.OBF(J)	;Delink from input stream
	MOV	CN.CNT(R1),R2		;Count of NCL submessage bytes
	ASSERT	NE			;Better be something there
	MOV	CN.ADR(R1),R3		;Address of NCL submessage bytes

;If this were a real device driver, this would be a dispatch based on
;the type. However, since this is a Kwick Krock . . .

	JSR	PC,GETEXN		;Get NCL submessage byte count
	ASSERT	R0 EQ R2		;Submessage should be rest of message
	CMPB	#002,(R3)+		;Looking at a Data (with EOM)?
	BEQ	23$			;Yes, happy
	TRAP				;No, unhappy
23$:	MOV	R3,R1			;Want data address in R1
	MOV	R0,R2			;And submessage count in R2
	DEC	R2			;One less byte of interest
	BEQ	26$			;If empty, then all done with copy
	ADD	R2,DB.ICN+4(J)		;Precount data bytes to be copied
	MOV	DB.IAD(J),R0		;NCL chunk address for echoed data
	JSR	PC,CNBLTB		;"BLT" the data bytes into echo msg
	MOV	R0,DB.IAD(J)		;Update NCL message pointer
26$:	MOV	R1,R0			;Trailing chunk address
	BIC	#CNKSIZ-1,R0		;Backup to start of chunk
	JSR	PC,FRECKS		;Pitch remainder of chunk(s)
	JSR	PC,DVDSBM		;Cap off NCL data message
30$:	JSR	PC,NCLIN1		;"Echo" the message back to the sender
	CLR	DB.IBF(J)		;We don't own that message anymore
	DECB	DB.IDR(J)		;Also used up one data request
	BR	1$			;Try for another
.SBTTL SNKSER - The SINK TSK device driver

.IIF NE,<.-<SNKSER-2>>,.ERROR .		;Address of task name must precede
	.WORD	SNKNAM			; the service routine name

SNKSER:	JSR	PC,DVCCFM		;Handle connect confirm/etc.

;The main "SINK" service routine

1$:	JSR	PC,TSKSER		;Common TSK service code
	  RTS	PC			;If nothing to do, return

;Here we drain the message into the bit bucket hence - SINK
	MOV	CN.MLK(R0),DB.OBF(J)	;De-link this message from queue
	JSR	PC,FRECKS		;Free the chunks
	BR	1$			;Try for another
SRCSER:	TRAP
MGRSER:	TRAP
.SBTTL TSKSER - common TSK device service code

TSKSER:	BIT	#DS.CON,@J		;Connected yet?
	BNE	20$			;Yes, continue
10$:	RTS	PC			;No, exit

;Here if we are currently running connected or are disconnecting

20$:	BIT	#DS.DSC,@J		;Disconnect occur?
	BNE	40$			;Yes, go handle it

;Here to see if we need to send some data requests

25$:	JSR	PC,DVXDRQ		;(DNDEV)ship some data requests
	MOV	DB.OBF(J),R0		;Get head of message queue
	BEQ	30$			;If there is one, process it
	ADD	#2,(SP)			;Do a success return
	RTS	PC			; and return

;Here when nothing to process to see if we are still connected

30$:	BIT	#DS.DIE!DS.DSC,@J	;Did -10 either go away or disconnect?
	BEQ	10$			;No, (ho hum) nothing else to do!

;Here to de-link messages if we got disconnected

40$:	MOV	DB.OBF(J),R0		;Any messages?
	BEQ	50$			;No, just terminate
	CLR	DB.OBF(J)		;Yes, well, there used to be
	JSR	PC,FRECNL		;Delete all messages

;Here to send the disconnect/disconnect confirm after queues cleaned up

50$:	JMP	DVCCFM			;(DNDEV)send disconnect if appropriate
.SBTTL ECHINI - TSK initilization and timeout routines

;Routine to compare incoming task name against legal values

SRCINI:	BIC	#DS.OUT,@J		;Clear the output bit
	BR	INICOM			;Join the common code
ECHINI:	BIS	#DS.OUT,@J		;Set the output bit
INICOM:	MOV	DB.RPC(J),DB.OPC(J)	;Set up the device service routine
	RTS	PC			;Return

;Here on a TSK timeout

ECHTIM:	TRAP				;Currently none, should never get here
.SBTTL ECHSEL - Routine to handle incoming connects

;Here on a connect for a TSK device

ECHSEL:	SAVE	<R5,R4>			;Save some registers
	SAVE	<R2,R3>
	MOV	#ECHTAB,R5		;Point R5 to the first connect block
10$:	MOV	@R5,R4			;Point R4 to the ASCIZ TSK name
	MOV	(SP),R3			;Restore the count and pointer to
	MOV	2(SP),R2		; the TSK name in the MSG
	JSR	PC,TSKCOM		;Compare it to the names we like
	  BR	70$			;Here if current name does not match

;Here when we have found a TSK name match and want to scan the TSK DDBs

20$:	CMP	(SP)+,(SP)+		;Get R3 and R2 off the stack
	MOV	R5,R4			;Copy pointer to current connect block
	MOV	#E0DDB,J		;Get the first TSK DDB
	MOV	#ECHON,R0		;Get the number of TSK DDBs we have

;Here to see if the DDB we are pointing at is free to use

30$:	TST	@J			;Is this DDB already connected?
	BMI	40$			;Yes, go to the next DDB and try again

;Here when we have a free DDB to initalize it

	MOV	2(R4),DB.RPC(J)		;Set up the device service routine
	JSR	PC,@4(R4)		;Call the initilization routine
	MOVB	DB.UNI(J),R0		;Move the Unit number into R0
	BR	60$			; and finally return

;Here we skip to the next DDB when the one we were looking at was connected

40$:	MOV	DB.LNK(J),J		;Skip to the next DDB
	SOB	R0,30$			; and try again

;Here to make a no such unit return

50$:	MOV	#ECHON+1,R0		;Lose, indicate with invalid unit #

;Here for common exit  restoring R4 and R5

60$:	RESTORE	<R4,R5>
	RTS	PC

;Here when the current name does not match the name in the connect message

70$:	ADD	#6,R5			;Skip to the next TSK connect block
	CMP	#ECHTBE,R5		;Was the current one the last one?
	BNE	10$			;No, Go ahead and try this one
	CMP	(SP)+,(SP)+		;Get stack back in phase
	BR	50$			;Select non-existant unit and return
.SBTTL TSKCOM - Subroutine to compare 2 ASCIZ strings for a match

TSKCOM:	JSR	PC,GETBYT		;Get character of the TSK name
	SAVE	R0			;Save it for later
	BIC	#177600,R0		;Clear all but the character
	CMPB	R0,(R4)+		;Compare against current name
	BNE	20$			;If not equal, declare non-match
	RESTORE	R0			;Restore the original character
	TSTB	@R4			;Check for the end of an ASCIZ string
	BEQ	50$			;Yes, we found a match
	TSTB	R0			;Is extensible bit on?
	BMI	TSKCOM			;Yes, try another character
10$:	RTS	PC			;No, String too short, non-match

;Here when the strings are different and we may have to eat the string

20$:	RESTORE	R0			;Here on non-compare
	TSTB	R0			;See if we are at end of string
	BPL	10$			;If we are, just return error


;Here to flush extra input from the message

30$:	JSR	PC,GETBYT		;(DNNCL)get next byte of string
40$:	TSTB	R0			;Is the extensible bit on?
	BMI	30$			;Yes, go back for another character
	RTS	PC			;No, return

;Here if compare successfully but may need to flush the rest of the string

50$:	ADD	#2,(SP)			;Set success return
	BR	40$			; and flush rest of string if needed

.SBTTL ECHTAB - Table of connect blocks for TSKs

ECHTAB:	.WORD	ECHNAM			;ECHO	pointer to name
	.WORD	ECHSER			;	service routine address
	.WORD	ECHINI			;	initialization routine address
	.WORD	SNKNAM			;SINK	pointer to name
	.WORD	SNKSER			;	service routine address
	.WORD	ECHINI			;	initialization routine address

;RDH	As these aren't implemented, and only TRAP if exercised . . .
;RDH
;RDH	.WORD	SRCNAM			;SOURCE	pointer to name
;RDH	.WORD	SRCSER			;	service routine address
;RDH	.WORD	SRCINI			;	initialization routine address
;RDH	.WORD	MGRNAM			;MANGR	pointer to name
;RDH	.WORD	MGRSER			;	service routine address
;RDH	.WORD	ECHINI			;	initialization routine address

ECHTBE=.				;End of the connect block table

;The ASCIZ TSK names we identify our TSKs with

ECHNAM:	.ASCIZ	/ECHO/
SNKNAM:	.ASCIZ	/SINK/
SRCNAM:	.ASCIZ	/SOURCE/
MGRNAM:	.ASCIZ	/MANGR/
	.EVEN

.ENDC;.IF NE,FTECHO