Google
 

Trailing-Edge - PDP-10 Archives - CFS_TSU04_19910205_1of1 - update/ihssrc/minint.p11
There are 8 other files named minint.p11 in the archive. Click here to see a list.
	.SBTTL	MININT - miscelaneous interrupts and strange functions

; this section contains the minor interrupts
;  (parity error, bus trap, illegal instruction, 
;  iot instruction, emt instruction, trace trap (bpt 
;  instruction and t-bit), clock, power fail and unknown).
;  this section also contains the code to record trace
;  information, which is driven by the trace interrupt
;  or by the trace macro.  the chunk ownership recording
;  subroutines and the kg11-a simulator have been
;  included here for lack of any
;  obviously better place to put them.

.REPT 0


                          COPYRIGHT (c) 1982,1981,1980, 1979
            DIGITAL EQUIPMENT CORPORATION, maynard, mass.

THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
TRANSFERRED.

THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
CORPORATION.

DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.

.ENDR
;	REVISION HISTORY

; 3(001) BS	MODIFIED TO SAVE REGISTERS ON STOPCODE WITH DEBUG OFF
;
; 3(002) 06-FEB-81 RLS	modified TRCSBR to allow block traces

; 3(003) 24-Feb-81 RLS	add call to TSKTIK in CLKINT - counts task timers where
;			they should be.
;			Also calls to once/tick routines DSPDQT,DSPDLT.

; 3(004) 10-MAR-81 RLS	Remove loop detector stopcd from CLKINT - who cares?

; 3(005) 05-oct-81 rls	Move call to DSPDLS from DSPIDL to CLKINT

VMINNT=005


VEDIT=VEDIT+VMINNT
; COME HERE FOR VARIOUS TRAPS.  BUS ERROR TRAP WITH THE DL10
;  DISABLED CAUSES A SPECIAL EXIT.  ALL OTHER TRAPS ARE
;  FATAL.

; HERE ON PARITY ERROR INTERRUPT.

MP.INT:	MOV	MP.REG,MEMERR	;SAVE FOR INTERESTED PARTIES
	STOPCD	MEM		;HALT.
PARSTP:	0			;provide mnemonic trap address

; HERE ON BUS TIMEOUT.

	.ENABL	LSB
NXMINT:	MOV	(SP)+,NXMPC	;RECORD PC OF BUS TRAP
	MOV	NXMGO,-(SP)	;REPLACE WITH SPECIFIED PC
	RTI			; GO THERE, RESTORING INTERRUPTS

; NORMALLY, BUS TRAPS COME HERE.

NXMNRM:	TST	DLGONE		;DO WE ALREADY KNOW THE DL10 IS GONE?
	BEQ	11$		;NO, SPECIAL EXIT.
	STOPCD	NXM		;YES, MUST BE FATAL ERROR.
NXMGON:	0			;provide mnemonic trap address

; HERE ON BUS ERROR TRAP AND THE DL10 IS DISABLED.  DO SPECIAL
; BRANCH IF REQUESTED.

11$:	TST	NXMSP		;ANY SPECIAL EXIT SPECIFIED?
	BEQ	12$		;NO.
	MOV	#-1,DLGONE	;YES, NOTE DL10 IS NOW GONE.
	CLR	DLGNTM		;WAIT A WHILE BEFORE TRYING TO RESTART IT
	MOV	NXMSP,SP	;LOAD STACK POINTER
	CLR	NXMSP		;ONLY DO THIS ONCE
	SEC			;SET "C" AS A FLAG
	RETURN

; HERE IF NO SPECIAL EXIT SPECIFIED

12$:	STOPCD	NXM		;HALT.
NXMSTP:	0			;provide mnemonic trap address
	.DSABL	LSB
; HERE ON ILLEGAL INSTRUCTION, IOT, EMT AND RANDOM
; INTERRUPT.

ILSINT:	MOV	#ILSINT,ILSTYP	;set trap type = illegal instruction
	BR	ERRINT		;go process the trap

IOTINT:	MOV	#IOTINT,ILSTYP	;set trap type = IOT
	BR	ERRINT		;go process the trap

EMTINT:	JMP	SKED		;scheduler call

ERRINT:	MOV	(SP)+,ILSERR	;SAVE TRAP INFO
	MOV	(SP)+,ILSERR+2	;IN CASE ANYBODY IS INTERESTED
	STOPCD	ILS		;HALT.
ERRSTP:				;provide a mnemonic for ddt

; HERE ON POWER FAIL.  NO ATTEMPT IS MADE TO RECOVER, SINCE
;  IT IS PRUDENT TO RUN CHK11 AFTER A POWER FAILURE.

PWFINT:
.IIF NDF,FT2020, HALT			;POWER FAILURE.
.IIF DF,FT2020, BR	.		;DON'T HALT FOR 2020s
	.BLKW	20.
TRPSTK:	.WORD	0		;SP AT TRAP TIME GOES HERE

TRPPS:	.WORD	0		;PS AT STOPCD

TRPTRP:	MOV	SP,#0		;trap within trap processing
	MOV	R0,#0
	MOV	R1,#0
	MOV	R2,#0
	MOV	R3,#0
	MOV	R4,#0
	MOV	R5,#0
	HALT

; HERE ON TRAP INSTRUCTION.  THIS IS USED ONLY BY THE STOPCD
; MACRO.

TRPINT:	TST	TRPERR		;check if already been here
	BNE	TRPTRP		;ugh!
	MOV	(SP)+,TRPERR	;SAVE TRAP INFO
	TST	(SP)+		;we already stored condition codes
	MOV	TRPPS,TRPERR+2

	MOV	R0,STOPR0	;SAVE THE ACS
	MOV	R1,STOPR1	;FOR DEBUGGING
	MOV	R2,STOPR2
	MOV	R3,STOPR3
	MOV	R4,STOPR4
	MOV	R5,STOPR5
	MOV	(SP)+,STOPSP	;SAVE STACK POINTER, TOO.

.IF EQ,FTKG11			;IF WE HAVE A KG11-A...
	MOV	@#KG.STS,STOPKG	;SAVE KG11-A REGISTERS
	MOV	@#KG.BCC,STOPKG+2
	MOV	@#KG.DTA,STOPKG+4
.ENDC ;.IF EQ,FTKG11
	CLR	R5		;LINE NUMBER*2
11$:	MOV	LINTBL(R5),R4	;GET LINE CONTROL BLOCK
	BEQ	12$		;NONE
	TST	LB.TRP(R4)	;be paranoid
	BEQ	12$
	CALL	@LB.TRP(R4)	;store the device registers in the lcb
12$:	ADD	#2,R5		;GO TO NEXT LINE
	CMP	#NLINES*2,R5	;DONE ENOUGH?
	BNE	11$		;NO, DO ANOTHER.
.IF NE,FT.KDP
	CALL	TRAPMD		;STOP THE KMC11S [1A(731)]
.ENDC ;.IF NE,FT.KDP
	MOV	TRPERR,R0	;GET OLD PC
	SUB	#2,R0		;POINT TO TRAP INSTR
	MOVB	(R0),TRPCOD	;GET TRAP CODE
	BNE	13$		;BRANCH IF VALID CODE
.IIF NDF,FT2020, HALT			;NOT--SOMETHING VERY WRONG!
.IIF DF,FT2020, BR	.	;DON'T HALT ON A 2020

13$:	MOV	TRPCOD,R1	;FETCH STOP CODE
	CALL	DLSTCS		;STORE STOP CODE SO PDP-10 CAN SEE IT.
14$:	MOV	TRPCOD,R0	;SHOW STOP CODE IN LIGHTS (11/40)
.IF NDF,FT2020 ;IF NOT ON A 2020
	HALT			;ALL DONE.
	BR	14$		;DON'T ALLOW "CONTINUE".
.ENDC ;END IF NDF,FT2020
.IIF DF,FT2020, BR	.	;DON'T HALT ON A 2020

;general debugging stopcode - "CALL" it
;	intended for patching in via DDT11.

BUGHLT:	STOPCD	BUG
BUGSTP:	BR	BUGHLT
	.SBTTL		CLOCK INTERRUPTS - ONCE A JIFFIE FROM THE KW11-L

CLKINT:	INTSKD	NOTRACE
	CLKOFF			;turn off clock so it can't reinterrupt if at low level
	MTPS	#PR.CLK*40	;set the clock service level

	SAVE	<R0,R1,R2,R3,R4,R5>
	INC	JIFCLK		;INCREMENT JIFFIE CLOCK
	BIT	#77,JIFCLK	;HAVE A MULT. OF 64 JIFFIES PAST?
	BNE	10$		;NO.
	CLR	BSYSEC		;yes - reset previous second counters
	CLR	IDLSEC
	BIT	#7777,JIFCLK	;check 4096 jiffies
	BNE	10$
	CLR	BSYMIN		;yes - reset 1 minute counters
	CLR	IDLMIN

10$:	TST	DSPTCB		;sample busy/idleness
	BNE	11$		;currently busy
	INC	IDLMIN		;currently idle
	INC	IDLSEC
	BR	12$

11$:	INC	BSYMIN
	INC	BSYSEC

12$:	CALL	DSPDQT		;DO ONCE-A-TICK DQ11(line driver) CODE
	CALL	DSPDLT		;DO ONCE-A-TICK DTE(10 interface device) CODE
	CALL	TSKTIK		;decrement all the task timers

	DEC	SECCLK		;count down  the second timer
	BGT	20$		;not yet
	MOV	#JIFSEC,SECCLK	;reset the timer
	CALL	DSPDLS		;do the once per second 10 interface function
20$:
	RESTOR	<R5,R4,R3,R2,R1,R0>
	CLKON			;turn the clock back on
	RTI			; AND EXIT THE INTERRUPT.

CLRALR:	SAVE	R4		;flush line alarm
	MOV	TCLCB(R5),R4	;get lcb
	CLR	LB.ALR(R4)	;clear timer - now no flags can be set
	BIC	#EBALR*400+EBALR,(R5);clear any flags that might have been set
	RESTOR	R4
	RETURN


DSPDQT:	MOV	#LINTBL,R2	;do once per tick code for all lines
	MOV	NSLINS,R1
10$:	MOV	(R2)+,R4	;get line block
	TST	LB.TIK(R4)	;be paranoid
	BEQ	20$
	SAVE	<R1,R2>
	CALL	@LB.TIK(R4)	;do it
	RESTOR	<R2,R1>
20$:	SOB	R1,10$
	RETURN
	.SBTTL		TRACE TRAP INTERRUPTS

; HERE ON TRACE INTERRUPTS, CAUSED BY BIT 4 IN THE PS.
;  RECORD THE CURRENT PC AND PS FOR DEBUGGING.

.IF NE,FTRACE
.IFT
BPTINT:	MOV	R0,-(SP)	;SAVE R0
	TST	TRCBTS		;ARE WE DOING EVENT TRACING?
	BNE	12$		;YES, DONT DO INSTRUCTION TRACING
	MOV	TRCPTR,R0	;NO, GET CURRENT POINTER
	CMP	#TRCTBE,R0	;REACHED END OF TABLE?
	BNE	11$		;NO.
	MOV	#TRCTBS,R0	;YES, SET TO BEGINNING
11$:	MOV	2(SP),(R0)+	;STORE PC IN TABLE
	MOV	4(SP),(R0)+	;STORE PS IN TABLE
	MOV	R0,TRCPTR	;STORE UPDATED POINTER

; THIS IS A GOOD PLACE TO PUT AD-HOCK DEBUGGING CODE, FOR EXAMPLE,
;  TO CHECK FOR A LOCATION BEING WIPED OUT.

12$:
.IF NE,DEBUG
	BR	14$		;NO SPECIAL CHECKS RIGHT NOW

; HERE ON FAILURE.

13$:	MOV	(SP)+,R0	;RESTORE R0
	STOPCD	DBG		;DEBUG STOP !!

; HERE ON NO FAILURE

14$:
.ENDC ;.IF NE,DEBUG
	MOV	(SP)+,R0	;RESTORE R0
	RTT			;DISMISS TRACE TRAP
.IFF
BPTINT:	STOPCD	ILS		;ILL INSTR IF NOT TRACING
.ENDC ;.IF NE,FTRACE
	.SBTTL		TRCSBR,TRCSBB - trace functions called by TRACE macro

; SUBROUTINE TO RECORD AN EVENT IN THE TRACE TABLE.  CALLED
;  BY THE "TRACE" MACRO.

.IF NE,FTRACE
	.ENABL	LSB
TRCSBR:				;entry for single variable trace
	MOV	(SP),-(SP)	;map into block form
	MOV	#1,2(SP)	;block of 1

TRCSBB:				;entry for stack block traces
				;SP/ret
				;SP+2/n = #variables to trace
				;SP+4/last arg
				;...
				;SP+4+2*n-2/1st arg
	MFPS	-(SP)		;save interrupt level
	MTPS	#BR7		;disable interrupts
	MOV	(SP)+,TRCSVP
	MOV	R0,TRCSV0	;save R0,R1
	MOV	R1,TRCSV1
	MOV	TRCPTR,R1	;get trace table pointer
	MOV	(SP),(R1)+	;trace caller
	CMP	#TRCTBE,R1	;check wrap
	BHI	4$
	MOV	#TRCTBS,R1
4$:	MOV	2(SP),R0	;calc ptr to 1st arg
	INC	R0
	INC	R0
	ASL	R0
	ADD	SP,R0		;R0 -> 1st arg + 2
	MOV	R0,TRCA1
	BR	6$
5$:	MOV	-(R0),(R1)+	;trace args
	CMP	#TRCTBE,R1	;check wrap
	BHI	6$
	MOV	#TRCTBS,R1
6$:	DEC	2(SP)		;count it
	BGE	5$
	MOV	R1,TRCPTR	;update trac ptr
	MOV	(SP)+,R0	;get ret loc
	MOV	TRCA1,SP	;flush all args from stack
	MOV	R0,-(SP)	;put ret on stack before turning on interrupts
	MOV	TRCSV0,R0	;restore registers
	MOV	TRCSV1,R1
	MTPS	TRCSVP		;allow the world to breathe again
	RETURN			;done

TRCBLK:				;entry to trace a memory block
				;SP/ret
				;ret/block adr
				;ret+2/block length
	MFPS	-(SP)		;save interrupt level
	MTPS	#BR7		;disable interrupts
	SAVE	<R0,R1,R2,R3>	;save the regs
	MOV	12(SP),R0	;get ret loc
	MOV	TRCPTR,R1	;get trace ptr
	MOV	R0,(R1)+	;trace caller
	CMP	#TRCTBE,R1	;check wrap
	BHI	15$
	MOV	#TRCTBS,R1
15$:	MOV	(R0)+,R2	;get trace block pointer
	MOV	(R0)+,R3	;get length
	MOV	R0,12(SP)	;update ret loc
20$:	MOV	(R2)+,(R1)+	;trace args
	CMP	#TRCTBE,R1	;check wrap
	BHI	25$
	MOV	#TRCTBS,R1
25$:	SOB	R3,20$
	MOV	R1,TRCPTR	;update trac ptr
	RESTOR	<R3,R2,R1,R0>	;restore the regs
	MTPS	(SP)+		;allow the world to breathe again
	RETURN			;done
	.DSABL	LSB

TRCSV0:	.WORD	0
TRCSV1:	.WORD	0
TRCA1:	.WORD	0
TRCSVP:	.WORD	0
.ENDC ;.IF NE,FTRACE
	.SBTTL		CHUNK OWNER RECORDING

.IF NE,CHOWNR

; SUBROUTINE TO RECORD THE OWNER OF A CHUNK FOR DEBUGGING
;  PURPOSES.
;
; R0 = CHUNK ADDRESS
; R1 = OWNER ID (BIT 0 = 0)

CHOWNG:	MOV	R0,-(SP)	;SAVE CHUNK ADDRESS
	CALL	CHOWNX		;COMPUTE INDEX INTO OWNER TABLE
	CMP	R0,#<CHOWNL*2>	;ROOM TO FIT IN TABLE?
	BHIS	11$		;NO, IGNORE IT.
	MOV	R1,CHOWNT(R0)	;YES, STORE IN TABLE
11$:	MOV	(SP)+,R0	;RESTORE CHUNK ADDRESS
	RETURN

; SUBROUTINE TO MARK A CHUNK FREE IN THE OWNER TABLE.
;  THE ID OF THE OWNER IS NOT OBLITERATED.
;
; R0 = CHUNK ADDRESS

CHOWNF:	MOV	R0,-(SP)	;SAVE CHUNK ADDRESS
	CALL	CHOWNX		;COMPUTE INDEX INTO CHUNK OWNER TABLE
	CMP	R0,#<CHOWNL*2>	;WILL THE TABLE HOLD THIS INDEX?
	BHIS	11$		;NO, IGNORE IT.
	BIT	#1,CHOWNT(R0)	;check if freeing a free chunk
	BEQ	10$		;ok
	STOPCD	BUG

10$:	BIS	#1,CHOWNT(R0)	;YES, FLAG CHUNK NOW FREE.
11$:	MOV	(SP)+,R0	;RESTORE CHUNK ADDRESS
	RETURN
; SUBROUTINE TO COMPUTE THE INDEX INTO THE OWNER TABLE.
;
; R0 = CHUNK ADDRESS
;
; ON RETURN: 
;
; R0 = INDEX INTO THE OWNER TABLE
;
; IF THE CHUNK ADDRESS IS INVALID, THIS SUBROUTINE NEVER RETURNS.

CHOWNX:	SAVE	<R1,R2>
	SUB	CHLOW,R0	;CONVERT CHUNK ADDRESS TO RELATIVE
	BLO	20$
	CLR	R1		;COMPARISON ADDRESS
	CLR	R2		;INDEX
11$:	CMP	R0,R1		;HAVE WE REACHED THE CHUNK?
	BLOS	12$		;YES, R2 HAS THE INDEX.
	ADD	#CHSIZE,R1	;NO, INCREASE COMPARISION ADDRESS
	ADD	#2,R2		; AND KEEP INDEX IN PARALLEL
	BR	11$		;SEE IF WE HAVE REACHED IT.

; HERE IF WE HAVE REACHED THE CHUNK ADDRESS

12$:	BLO	20$
	MOV	R2,R0		;PUT INDEX INTO R0
	RESTOR	<R2,R1>
	RETURN

20$:	STOPCD	BAF

.ENDC ;.IF NE,CHOWNR
	.SBTTL		KG11-A SIMULATION SUBROUTINE

; SUBROUTINE TO ACCUMULATE A CHARACTER INTO THE BCC.
;
; CALL:
;	MOV	ARG,-(SP)	;PUT ARG ON STACK
;	CALL	KGSIMA	;ACCUMULATE BCC
;
; ALL REGISTERS ARE PRESERVED.

.IF NE,FTKG11

KGSIMA:	MOV	R0,-(SP)	;SAVE R0
	MOV	4(SP),R0	;GET ARGUMENT CHARACTER
	MOV	R1,-(SP)	;SAVE R1
	MOV	R2,-(SP)	;SAVE R2
	MOV	KGSIMW,R1	;R1 = ACCUMULATED CRC
	XOR	R1,R0		;EXCLUSIVE OR BYTE WITH OLD CRC
	MOV	R0,R2		;SAVE A COPY OF RESULT
	BIC	#177760,R0	;EXTRACT LOW 4 BITS
	ASL	R0		;BYTE ADDRESS , WORD INDEX
	MOV	KGTBL(R0),R0	;GET FIRST MODIFIER WORD
	BIC	#177417,R2	;NOW EXTRACT HIGH FOUR BITS
	ASR	R2		;SET UP TO ENTER SECOND HALF
	ASR	R2		;AGAIN BYTE ADDRESS TO
	ASR	R2		;WORD INDEX
	MOV	KGTBL+32.(R2),R2 ;GET SECOND MODIFIER WORD
	XOR	R2,R0		;EXCLUSIVE OR MODIFIER VALUES
	CLRB	R1		;CLEAR LOW BYTE OF OLD CRC
	SWAB	R1		;NOW WORK ON UPPER BYTE
	XOR	R0,R1		;PRODUCE UPDATED CRC
	MOV	R1,KGSIMW	;SAVE NEW VALUE OF CRC REGISTER
	MOV	(SP)+,R2	;RESTORE R2
	MOV	(SP)+,R1	;RESTORE R1
	MOV	(SP)+,R0	;RESTORE R0
	MOV	(SP)+,(SP)	;REMOVE ARGUMENT FROM STACK
	RETURN
; THIS TABLE IS USED BY THE KG11-A SIMULATOR TO FORM
;  A BCC.  THE FIRST HALF OF THE TABLE IS INDEXED BY THE
;  LOW FOUR BITS, THE SECOND HALF BY THE HIGH FOUR BITS.

KGTBL:	.WORD	0		;FIRST HALF OF TABLE
	.WORD	140301
	.WORD	140601
	.WORD	500
	.WORD	141401
	.WORD	1700
	.WORD	1200
	.WORD	141101
	.WORD	143001
	.WORD	3300
	.WORD	3600
	.WORD	143501
	.WORD	2400
	.WORD	142701
	.WORD	142201
	.WORD	2100

	.WORD	0		;SECOND HALF OF TABLE
	.WORD	146001
	.WORD	154001
	.WORD	12000
	.WORD	170001
	.WORD	36000
	.WORD	24000
	.WORD	162001
	.WORD	120001
	.WORD	66000
	.WORD	74000
	.WORD	132001
	.WORD 	50000
	.WORD	116001
	.WORD	104001
	.WORD	42000

.ENDC ;.IF NE,FTKG11
; TTY ROUTINES FOR CHK11

	.CKTTS