/DYA	339 DISPLAY DEVICE HANDLER
	/	FOR BACKGROUND/FOREGROUND
	/	H.W.SPENCER, 8-12-69.
/COPYRIGHT 1968, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
	/DISPLAY IOT'S
RPDP=700501		/READ PUSH DOWN POINTER
RXP=700502		/READ X REGISTER 1-12
RYP=701602		/READ Y REGISTER 1-12
RDAC=700601		/READ DISPLAY ADDRESS COUNTER
RS1=700602		/READ STATUS 1 (P.29 "338" MANUAL)
RS2=701622		/READ STATUS 2 (P.30)
RPB=700621		/READ PUSH BUTTONS
RSG1=700622		/READ SLAVE GROUP 1
RSG2=701642		/READ SLAVE GROUP 2
RCG=701662		/READ CHARACTER GENERATOR (VC38)
SPDP=700645		/SET PUSH DOWN POINTER
SIC=700665		/SET INITIAL CONDITIONS
LBF=700705		/SET BREAK FIELD
SCG=700743		/SET CHARACTER GENERATOR
INIT=701605		/INITIALIZE THE DISPLAY
RES1=700724		/RESUME AFTER LTPEN, EDGE OR EXTERNAL STOP
RES2=701604		/RESUME AFTER STOP CODE
CFD=701601		/CLEAR DISPLAY FLAGS AND DAC
STPD=700704		/STOP DISPLAY (EXTERNAL)
SPLP=700642		/SKIP ON LIGHT PEN HIT FLAG
SPES=700701		/SKIP ON EXTERNAL STOP FLAG
SPEF=700702		/SKIP ON EDGE FLAG
SPSF=700721		/SKIP ON INTERNAL STOP FLAG
SPMI=700722		/SKIP ON MANUAL INTERRUPT
SPDI=700662		/SKIP ON DISPLAY INTERRUPT
RPL=705512		/READ PRIORITY LEVELS IN API
DYIC=003367		/INITIAL CONDITIONS 
DYPBI1=000200		/PUSH BUTTON INITIAL SETTING & ENABLE BIT
.SCOM=100			/MONITOR COMMUNICATIONS
.MED=3		/MONITOR ERROR DETECTION
	.GLOBL	DYA.
DYA.	JMS	SWAP
LPA.=DYA.
	0			/FOREGROUND BUSY
	0			/BACKGROUND BUSY
	0			/FOREGROUND .CLOSE
	0			/BACKGROUND .CLOSE
DYWD5	XX			/ION OR IOF
DYWD6	XX			/ION OR IOF OR DBR
DYWD7	XX			/RETURN POINTER
DYWD10	XX			/JUMP FUNCTION
LPWD10=DYWD10
DYWD11	XX			/USER ID (0=FG,1=BG)
DYWD12	XX			/.DAT SLOT NO.
DYWD13	XX			/UNIT NO.,CAL ADDRESS
DYWD14	XX			/FILE TYPE OR DATA MODE
DYWD15	XX			/RESTART OR BUFFER ADDRESS
DYWD16	XX			/BUFFER SIZE OR WORD COUNT
DYWD17	XX			/R/T ADDRESS AND PRIORITY(0-2)
LPWD17=DYWD17
/FUNCTION DISPATCH TABLE (WORDS 20-32)
	JMP	DYINIT		/1-.INIT
	JMP	DYIGNR		/2-.DLETE-.RENAM-.FSTAT (IGNORED)
	JMP	DYIGNR		/3-.SEEK (IGNORED)
	JMP	DYIGNR		/4-.ENTER (IGNORED)
	JMP	DYIGNR		/5-.CLEAR (IGNORED)
	JMP	DYCLOS		/6-.CLOSE
	JMP	DYIGNR		/7-.MTAPE (IGNORED)
DYRD	JMP	DYREAD		/10-.READ
	JMP	DYWRIT		/11-.WRITE
	XX			/12-.WAIT-.WAITR
	JMP	DYIGNR		/13-.TRAN (IGNORED)
SCOM35	XX			/.SCOM+35
	DYSTP			/FOREGROUND STOP I/O
	DYSTP			/BACKGROUND STOP I/O
	2			/THIS IS THE 339 HANDLER
	.EJECT
/DISPLAY INITIALIZATION SECTION
/
/CHECK IF MONITOR DISPLAY-IN-USE FLAG IS ON
DYINIT	LAC*	(.SCOM+12		/.SCOM+12 SHOULD BE NON-0
	SZA
DYIN05	JMP	DYIN40		/OK,FLAG IS ON (THIS GETS CHANGED TO
				/  JMP DYIN07 AFTER FIRST TIME THRU
	LAW	5024		/DISPLAY NOT IN
DYIN06	DAC	LPTMP1
	LAC	DYWD13
	DAC	LPTAUX
	LAC	DYWD11		/USER ID
	SZA
	LAC	(3000		/IF BACKGROUND
	XOR	LPTMP1
	JMS	LPTERR		/GO CAUSE PRINTING OF ERROR MESSAGE
	JMP	DYIGNR		/EXIT FROM CAL
/SET INITIALIZING PARAMETERS
/
DYIN07	LAC	DYWD14		/GET FILE TYPE
	SZA			/USE STANDARD INIT PARAMETERS (F=0)
	JMP	DYIN70		/GO GET SPECIAL INIT PARAMETERS
/CHECK TO SEE WHETHER THIS CALL IS TO CLEAR THE BUSY FLAG ONLY.
	LAC	DYWD15		/GET R
	SZA			/NON-0 MEANS YES
	JMP	DYIGNR		/GO CLEAR FLAG AND EXIT
/PROCEED WITH NORMAL .INIT
DYIN08	LAW	DYIC		/GET INITIAL CONDITIONS
	SIC			/SEND TO DISPLAY
	LAW	DYPBI1		/GET PB SETTING
	LBF			/SET 0-5
	XOR	(100		/ENABLE 6-11
	LBF			/SET 6-11
DYIN10	LAC	DYCHAR		/GET LOC OF CHARACTER TABLE
	SNA			/IF 0 THERE ISNT ONE
	JMP	DYIN20		/SO GO ON TO NEXT STEP
	.REPT	4
	RTR			/MOVE HI-ORDER 6 BITS INTO 11-17
	RAR
	AND	(77		/CLEAR EXTRANEOUS BITS
DYIN15	SCG			/SET CHAR GEN IOT
DYIN20	LAC	DYPDP		/GET LOC OF PUSH-DOWN LIST
	SPDP			/SEND TO 339
	DAC*	DYWD16		/SEND TO USER
DYIN30	LAC*	(.SCOM+55		/.SETUP FOR PIC AND API CHANNEL 54
DYAC	DAC	DYIN30
DYPC	JMS*	DYIN30
LPTMP1	SPDI			/SKIP ON DISPLAY INTERRUPT
DYPIC	DYINT			/INTERRUPT HANDLER ADDRESS
DYIN60	LAC	.+2		/CLOSE OFF .SETUP ENTRY
DYAC2=DYIN60
DYNSFL	DAC	DYIN30		/LEFT-ADJUSTED REGISTERS INDICATOR WORD 
DYCNT	JMP	DYIGNR		/GO TO RETURN
/ONE-TIME SECTION TO GET LOC OF PDP AND VC38 CHAR TABLE FROM MONITOR.
/  COMMENTS DESCRIBE LATER USE AS STORAGE LOCATIONS.
/  .SCOM+12 POINTS TO THE PDP LOCATION,WHICH IN TURN POINTS TO THE
/  LOCATION OF THE CHARACTER TABLE.
DYIN40	LAC*	(.SCOM+12
DYINTT=DYIN40		/TEMP STORE FOR INTERRUPT SERVICE
DYPDP	DAC	DYPDP		/LOCATION OF PUSH DOWN LIST
DYCHAR	LAC*	DYPDP		/LOCATION OF CHARACTER TABLE
DYCNT2	DAC	DYCHAR		/COUNTER REGISTER
/FIND THE LOCATION OF 339 SLOT IN LEVEL 4 Q
DYLVL4	LAC*	(.SCOM+53
LPTMP2	TAD	(2
	DAC	DYLVL4
DYL	LAC	.+2		/POINTER TO CURRENT DISPLAY FILE
DYTEMP	DAC	DYIN05		/TEMP STORE FOR HANDLER
DYNSTD	JMP	DYIN07		/CONTAINS CURRENT FLAGS/REGISTERS BITS
/
/SEQUENCE TO COLLECT USER'S SPECIAL INIT PARAMETERS
DYR=DYWD15			/POINTER TO USER INIT PARAMETERS
DYIN70	LAC	DYR		/GET POINTER
	AND*	(.SCOM		/CHECK FOR NEXM
	SAD	DYR
	JMP	DYIN72		/OK,PROCESS USERS INIT
	LAW	5036		/SET UP ERROR MESSAGE 36
	JMP	DYIN06
DYIN72	LAC*	DYR		/GET R(1),INITIAL CONDITIONS
	SIC			/SEND TO DISPLAY
	ISZ	DYR
	LAC*	DYR		/GET R(2). PB 0-5 WITH REQUIRED ENABLE BITS
	LBF			/SEND TO DISPLAY
	ISZ	DYR
	LAC*	DYR		/GET R(3), PB 6-11 WITH REQUIRED ENABLE BITS
	LBF			/SEND TO DISPLAY
	ISZ	DYR
	LAC*	DYR		/GET CHARACTER GENERATOR SETTINGS
	SZA
	JMP	DYIN15		/USE SETTINGS PROVIDED
	JMP	DYIN10		/NONE PROVIDED,USE MONITOR'S
	.EJECT
/CAL RETURN SEQUENCE
DYIGNR	JMS	CLFLAG		/CLEAR BUSY FLAGS
DYTIO	LAC	(400200		/RAISE TO PRIORITY LEVEL 0
	ISA
	IOF
LPFCLR	SKP			/NOP IF FLAG TO BE CLEARED
	DZM	DYA.+1		/FOREGROUND BUSY FLAG.
LPBCLR	SKP			/NOP IF FLAG TO BE CLEARED
	DZM	DYA.+2		/BACKGROUND BUSY FLAG.
	LAC	DYSKP		/RESET
	DAC	LPFCLR		/SWITCHES.
	DAC	LPBCLR
	DBK			/FROM LEVEL 0.
	XCT DYA.+5		/ION OR IOF
	XCT .+1
	XCT (JMP* DYA.+7		/RETURN POINTER.
	.EJECT
/339 .READ
DYREAD	LAC	DYWD15		/GET BUFFER ADDRESS
	DAC	DYLPTR		/SAVE IT
	LAC	DYWD16		/GET -W (INTERRUPT COUNT)
	DAC	DYINTP		/SAVE IN TEMPORARY
	LAC	DYWD14		/GET M
	SAD	(7		/IF M=7
	JMP	DYRD30		/GO GET USERS NSTD
	SZA			/IF M
	JMP	DYRD10		/NOT 0, GO PROCESS M=1-6
	LAC	DYSTD3		/=0, GET STANDARD N0-INTERRUPT WORD
	DAC	DYNSTD
	JMP	DYRD35		/GO READ REGISTERS
/SEQUENCE TO CONVERT M=1 THRU 6 TO A STANDARD FLAGS-REGISTERS WORD
DYRD10	TAD	(LAC DYSTD	/GET APPROP F-R WORD
	DAC	.+1
	XX
	AND	DYSTD		/AND OUT ALL BUT THE STANDARD REGISTERS
	DAC	DYNSTD		/AND THATS IT
/SEQUENCE TO SET UP DZM OR NOP IN THE INTERRUPT HANDLER TO SAVE 
				/OR IGNOR INTERRUPT FLAGS
DYRD21	LAW	-6		/SET UP COUNTER FOR 6 FLAGS
	DAC	DYCNT	
	LAC	DYNSTD		/GET NSTD
DYRD22	RCL			/SLIP A BIT INTO L
	DAC	DYAC2		/SAVE THE AC
	LAC	DYDZM		/ASSUME FLAG IS TO BE SAVED, GET DZM
	ISZ	DYDZM		/SET TO NEXT FLAG
	SNL			/SKIP IF FLAG IS TO BE SAVED
	LAC	DYNOP		/GET A NOP IF IT IS TO BE IGNORED
DYRD24	DAC*	DYNT1X		/DAC THRU DYNT1X POINTER TABLE
	ISZ	DYRD24		/NEXT ENTRY IN TABLE
	LAC	DYAC2		/RESTORE AC
	ISZ	DYCNT		/INCREMENT COUNTER AND CHECK IF DONE
	JMP	DYRD22		/REPEAT FOR NEXT BIT
	LAC	(DAC* DYNT1X	/RESTORE DAC TO POINTER TABLE
	DAC	DYRD24
	LAC	(DZM DYLP		/RESTORE DZM LIST
	DAC	DYDZM
	JMS	DYRD50		/SET UP READ-REGISTERS IOTS
/CLEAR SOFTWARE INTERRUPT FLAGS
	LAW	-1		/-1 = CLEAR
	DAC	DYLP		/LIGHT PEN
	DAC	DYMI		/MANUAL INTERRUPT
	DAC	DYPB		/PUSH BUTTONS
	DAC	DYEDG		/EDGE VIOLATION
	DAC	DYISTP		/INTERNAL STOP
	DAC	DYESTP		/EXTERNAL STOP
/TURN ON INTERNAL BUSY SWITCH
	LAC	DYINTP		/GET - W 
	DAC	DYIOW		/INTO I0 BUSY SWITCH
	JMP	DYTIO		/RETURN
/SEQUENCE TO PROCESS USERS NSTD
DYRD30	LAC*	(.MED		/POINTS TO LOC AFTER I/O MACRO
	DAC	DYTEMP
	TAD	(1		/INCERMENT RETURN POINTER
	DAC*	(.MED
	LAC*	DYTEMP		/GET USER'S NSTD WORD
	DAC	DYNSTD		/AND SAVE IT
	AND	DYNS		/MASK OFF BITS 0-5
	SZA
	JMP	DYRD33		/REGISTER BITS ON, USE THEM, GO CHECK FLAG BITS
	LAC	DYSTD2		/REGISTER BITS OFF, USE STANDARD DEFAULT  OPTION
	XOR	DYNSTD		/INSERT USERS FLAG BITS
	DAC	DYNSTD
	AND	DYNS		/MASK OFF 0-5
DYRD33	XOR	DYNSTD		/INVERT, NOW 6-17 ARE OFF, 0-5 = FLAG BITS
	SZA
	JMP	DYRD21		/GO SET UP INTERRUPT HANDLER, FLAG BITS ON IN AC
/NOT WAITING FOR ANY INTERRUPTS, GO SERVICE READ AND EXIT
DYRD35	LAC	DYNSTD		/GET USER REQUEST BIT MAP
	RTL			/MOVE REGISTER BITS TO LEFT EDGE
	RTL
	RTL
	DAC	DYAC2		/FOR IOT SETUP ROUTINE
	JMS	DYRD50		/SET UP READ-REGISTERS IOTS
	JMS	DYRR20		/READ THOSE REGISTERS
	JMS	DYNT60		/INSERT IN USER'S BUFFER
	LAC	DYWPTR		/RESET INTERNAL BUFFER POINTERS
	DAC	DYAPTR
	LAC	DYBPTR
	DAC	DYWPTR
	JMP	DYWRT		/RETURN TO USER
/SEQUENCE TO SET UP READ IOT OR SKP IN INTERRUPT HANDLER DEPENDING ON
/   REGISTERS REQUESTED BY USER
DYRD50	0			/ENTRY POINT
	LAW	-12		/10 POSSIBLE REGISTERS
	DAC	DYCNT		/INTO COUNTER
	DAC	DYNSFL		/TO BE USED AS COUNT OF IOTS ISSUED
	LAC	DYAC2		/GET REGISTER BITS
DYRD52	RCL			/PUT ONE IN THE LINK
	DAC	DYAC2		/SAVE REMAINDER
DYRD54	LAC	DYREG		/GET AN IOT
	ISZ	DYRD54		/POINT TO NEXT IOT
	SZL			/USE THE IOT IF L=1
	JMP	DYRD56
	ISZ	DYNSFL		/REDUCE COUNT OF IOTS BY ONE
	LAC	DYSKP		/USE SKIP IF L=0 (UNWANTED REGISTER)
DYRD56	DAC*	DYRR2X		/DAC THRU DYRR2X POINTER TABLE
	ISZ	DYRD56		/NEXT ENTRY IN POINTER TABLE
	LAC	DYAC2		/RESTORE BIT MAP TO AC
	ISZ	DYCNT		/BUMP COUNT AND CHECK IF FINISHED
	JMP	DYRD52		/BACK FOR NEXT ROUND
	LAC	(LAC DYREG	/ALL DONE, RESET POINTERS
	DAC	DYRD54
	LAC	(DAC* DYRR2X
	DAC	DYRD56
	JMP*	DYRD50		/LEAVE
 
	.EJECT
/339 .WRITE
DYWRIT	LAC	DYWD14		/GET M
	SNA
	JMP	DYWR10		/0 = RESUME DISPLAY AFTER EXT STOP
	SAD	(4
	JMP	DYWR20		/4 = START THE DISPLAY AT L
	SAD	(2
	STPD+10			/2 = STOP THIS DISPLAY (IGNORE ANYTHING ELSE)
	SAD	(1
	RES2+10			/1 = RESUME DISPLAY AFTER INTERNAL STOP
/I/O COMPLETED BY THIS CAL, RETURN
DYWRT	LAC	DYWD17		/SEE IF THIS WAS R-T REQUEST
	SZA
	JMS	LPNXTQ		/IT WAS, CALL REALTP
	JMP	DYIGNR		/RETURN, CLEAR BUSY FLAGS
DYWR10	LAC	DYL		/GET ADDRESS OF CURRENT DISPLAY FILE
	JMP	DYWR22		/GO RESTART THIS DISPLAY
/START DISPLAY AT L
DYWR20	CFD			/CLEAR DISPLAY AND SET TO CONTROL STATE
	LAC	DYWD15		/GET DISPLAY FILE POINTER
	DAC	DYL		/SAVE CURRENT DISPLAY FILE ADDRESS
DYWR22	AND	(70000		/GET HIGH ORDER 3 BITS OF ADDRESS
	CLL			/CLEAR LINK
	RTR			/MOVE TO BREAK FIELD POSITION IN AC
	RTR
	XOR	(4000		/SET ENABLE BREAK FIELD BIT
	LBF			/LOAD BREAK FIELD
	LAC	DYPDP		/GET PUSH-DOWN STACK LOCATION
	SPDP			/RESET PDP
	LAC	DYL		/GET DISPLAY FILE POINTER AGAIN
	INIT			/START DISPLAY
	JMP	DYWRT		/RETURN
	.EJECT
/ 339. CLOSE
DYCLOS	RS1			/READ STATUS 1 TO CLEAR PUSHBUTTON FLAG
	SPMI			/SKIP ON MANUAL INTERRUPT TO CLEAR ITS FLAG
DYNOP	NOP
	CFD			/CLEAR DISPLAY FLAGS (THE REST,THAT IS) & DAC
	JMP	DYIGNR		/RETURN
	.EJECT
/ INTERRUPT HANDLER
DYINT	SKP			/PIC ENTRY
	JMP	DYAPI		/API ENTRY (PRIORITY 2)
	DAC	DYAC		/SAVE AC
	LAC	DYION		/ION INTO INTERRUPT RETURN SEQUENCE
	DAC	DYSW
	LAC*	(0		/PIC RETURN ADDR. IN LOC 0
	DZM*	(0
	DAC	DYPC		/INTO RETURN PC
	JMP	DYNT10
DYAPI	DAC	DYAC		/API ENTRY-SAVE AC
	LAC	DYINT		/GET RETURN ADDRESS
	DAC	DYPC		/SAVE IT
	LAC	DYDBK		/DBK INTO INTERRUPT RETURN SEQUENCE
	DAC	DYSW
 
/SAVE AND CLEAR INTERRUPT FLAGS
DYNT10	LAC*	(.SCOM+35	/SAVE IN-PROCESS FLAG
	DAC	SCOM35
	LAW	-1		/SET FLAG TO SHOW THIS INTERRUPT
	DAC*	(.SCOM+35
	LAC	(10000		/BITS 6,10 OFF FOR SPES;5 ON=ESTOP
	SPES			/SKIP ON ESTOP,NO FLAG
	CLA			/NO ESTOP,CLEAR BIT 15
	RS1+10			/TO GET INTERRUPT FLAGS AND CLEAR PB FLAG
	AND	(7470		/KEEP INTERRUPT FLAGS ONLY
	SAD*	DYWPTR		/IF SAME AS INTERRUPT BEING PROCESSED
	JMP	DYNT11		/  GO CLEAR FLAGS AND EXIT
	DAC	DYINTT
	LAC	DYIOW
	SNA
	JMP	DYNT11
	LAC	DYINTT
	DAC*	DYBPTR
	JMS	DYRR20		/READ REQUESTED REGISTERS
DYNT11	SPMI			/SKIP ON MANUAL INTERRUPT-TO TURN FLAG OFF
	SKP!CLA
	JMP	DYNT20
	SPES			/SEE IF THIS WAS ESTOP
	JMP	DYNT20		/SKIP AROUND EXTERNAL STOP
	CFD			/CLEAR DISPLAY FLAGS TO ALLOW ION,ETC.
DYSKP	SKP!CLA			/SKIP OVER RES1 AFTER CLF
DYNT20	RES1			/ALL NEEDED FLAGS AND REGISTERS OBTAINED,
		/RESUME DISPLAY ON LP OR EDGE INTERRUPT. IF INTERRUPT WAS ISTP,RES1
		/CLEARS THE FLAG BUT DOESN'T RESUME THE DISPLAY.
/CHECK INTERRUPT BUSY STATUS
	SAD	DYIOW		/IF READ-BUSY FLAG IS OFF (=0
	JMP	DYIRTB		/  GO TO EXIT.
	SAD	DYBUSY		/IF INTERRUPT-BUSY FLAG IS ON (=0
	JMP	DYIRTB		/  GO TO EXIT.
	DZM	DYBUSY		/TURN ON INTERRUPT-BUSY FLAG
	LAC	DYSW		/GET ION OR NOP FROM INTERRUPT RETURN SEQUENCE
	DAC	DYPIC		/PIC-API INDICATOR (DBK=API)
/INTERRUPT HANDLER RETURN SEQUENCE (WITHOUT HAVING PROCESSED THE INTERRUPT)
DYIRTA	LAC	(DYINTP+400000	/GET INTERRUPT PROCESSOR ADDRESS
	DAC*	DYLVL4		/INTO LEVEL 4 Q
DYIRTB	LAC*	(.SCOM+54		/ADDRESS
	DAC	LPTMP1		/OF CALL4
	LAC	(400200		/RAISE TO LEVEL 0
DYISA	ISA
	JMS*	LPTMP1
	DYPC
	SCOM35
	LAC	SCOM35		/RESTORE IN-PROCESS FLAG
	DAC*	(.SCOM+35
	LAC	DYAC		/RESTORE INTERRUPT AC
DYSW	XX			/ION OR DBK IF ENTERED VIA PIC OR API
	DBR			/DEBREAK FROM LEVEL 2 (IF API)
	XCT	.+1
	XCT	(JMP* DYPC	/RETURN
 
/SEQUENCE TO READ AND SAVE HARDWARE REGISTERS REQUESTED BY USER
DYRR20	0			/ENTRY POINT
DYAUTO=11			/AUTO-INDEX REGISTER USED
	LAC*	(DYAUTO		/SAVE CONTENTS
	DAC	DYINTT
	LAC	DYBPTR		/LOAD WITH BUFFER POINTER
	DAC*	(DYAUTO
DYRR21	RPDP+10			/READ PUSH DOWN POINTER
	DAC*	DYAUTO
DYRR22	RXP+10		/X REGISTER
	DAC*	DYAUTO
DYRR23	RYP+10
	DAC*	DYAUTO
DYRR24	RDAC+10			/DISPLAY ADDRESS COUNTER
	DAC*	DYAUTO
DYRR25	RS1+10			/STATUS REGISTER 1
	DAC*	DYAUTO
DYRR26	RS2+10			/STATUS REGISTER 2
	DAC*	DYAUTO
DYRR27	RPB+10			/PUSH-BUTTON REGISTER
	DAC*	DYAUTO
DYRR30	RSG1+10			/SLAVE GROUP 1
	DAC*	DYAUTO
DYRR31	RSG2+10			/SLAVE GROUP 2
	DAC*	DYAUTO
DYRR32	RCG+10			/CHARACTER GENERATOR
	DAC*	DYAUTO
	LAC	DYINTT		/RESTORE AUTO-INDEX REGISTER
	DAC*	(DYAUTO
	LAC	DYAPTR		/RESET BUFFER POINTER FOR NEXT INTERRUPT
	DAC	DYBPTR
	JMP*	DYRR20
 
	.EJECT
/INTERRUPT PROCESSOR
/ENTERED AT LEVEL 4 OF API (IF API IS PRESENT) WITH PIC ON.
/ENTERED AT MAINSTREAM (IF NO API).
DYINTP	XX			/RETURN ADDRESS HERE
/SET UP PROTECTS AND UNPROTECTS TO FOLLOW DEPENDING ON PIC OR API, AND
				/PROTECT FLAG-CHECKING
DYNT40	LAC	DYPIC		/GET API-PIC INDICATOR
	SAD	DYION
	JMP	DYNT44		/GO SET UP FOR PIC
	LAC	DYDBK		/GET DBK
	DAC	DYNT48		/INTO RETURN FROM CHECKING INTERRUPT
	LAC	DYISA		/GET ISA(SETTING UP FOR API) INTO PROJECT FOR CHECKING INTERRUPT.
	JMP	DYNT30-1		/GO CHECK ON FLAGS
DYNT44	DAC	DYNT48		/ION INTO RETURN FROM INT CHECKING AND INTO EXIT TO OUTSIDE WORLD.
	LAC	(IOF		/GET IOF
	DAC	DYNT46		/INTO PROTECT FOR INT CHECKING
/SET UP REMAINING SOFTWARE INTERRUPT FLAGS NOT SET AT INTERRUPT TIME
DYNT30	LAC*	DYWPTR		/GET WORD CONTAINING FLAG BITS
	RTL			/LOSE HIGH-ORDER 6 BITS
	RTL
	RTL
	SZL			/CHECK HOME-MADE ESTOP BIT
DYNT17	DZM	DYESTP		/SET ESTP WORD
	SPA!RTL			/CHECK LP FLAG IN SIGN POSITION AND
			/MOVE V & H EDGE FLAGS INTO S & L
DYNT12	DZM	DYLP		/SET LIGHT PEN WORD
	SPA!SZL!RTL		/SKIP IF NEITHER EDGE FLAG WAS ON AND
			/MOVE ISTOP FLAG INTO L
DYNT13	DZM	DYEDG		/SET EDGE FLAG WORD
	SZL!RTL			/SKIP IF ISTOP FLAG OFF AND MOVE SECTOR
			/0 AND CONTROL STATE FLAGS OUT OF THE WAY
DYNT14	DZM	DYISTP		/SET ISTOP WORD
	SPA!RAL			/SKIP IF MI FLAG OFF AND MOVE
			/PB FLAG INTO S
DYNT16	DZM	DYMI		/MANUAL INTERRUPT WORD ON
	SPA			/SKIP IF PB FLAG OFF 
DYNT15	DZM	DYPB		/SET PUSH-BUTTON WORD
/CYCLE THRU SOFTWARE FLAGS TO SEE WHICH ARE ON
	LAW	-6		/SIX SOFTWARE FLAGS
	DAC	DYCNT		/INTO LOOP COUNTER
	LAC	(DYLP		/LP FLAG IS FIRST ONE
	DAC	DYFLGS		/INTO FLAGS POINTER
DYNT33	LAC*	DYFLGS		/GET A FLAG
	SZA			/IS IT ON (0=YES)
	JMP	DYNT37		/NO, LOOK AT NEXT
DYNT35	LAW	-1		/TURN OFF FLAG ABOUT TO BE SERVICED
	DAC*	DYFLGS
	JMS	DYNT60		/CALL READ-REGISTERS ROUTINE
	ISZ	DYIOW		/INCREMENT USERS INTERRUPT CPUNT
	JMP	DYNT37		/REPEAT IF NOT FINISHED
DYNT36	LAC	(400040		/SET AC TO RAISE TO API LEVEL 2
DYNT46	XX			/IOF IF PIC,ISA IF API
	DZM*	DYWPTR		/CLEAR WORD WITH FLAG BITS
	LAC	DYWPTR		/DONE WITH WORKING BUFFER,
	DAC	DYAPTR		/  MAKE IT THE AUXILLIARY BUFFER
	LAC	(DYBUF2		/RESET WORKING BUFFER POINTER
	SAD	DYWPTR
	LAC	(DYBUF1		/TO THE OTHER BUFFER
	DAC	DYWPTR
	LAC	DYIOW		/CHECK IF DONE
	SZA
	JMP	DYNT47		/NOT DONE,LOOK FOR MORE
	ION
	JMP	LPEMPT		/GO TO IO DONE SEQUENCE
DYNT47	LAC*	DYWPTR		/GET FLAG WORD FROM NEW WORKING BUFFER
	SNA			/IF 0, NO INTERRUPT TOOK PLACE
	JMP	DYNOR		/GO EXIT
	LAC	DYAPTR		/RESET BUFFER POINTERS
	DAC	DYBPTR
DYNT48	XX			/DBK IF API, ION IF PIC
	JMP	DYNT30+1		/GO PROCESS NEW INTERRUPT
DYNT37	ISZ	DYFLGS		/INCREMENT FLAG POINTER
	ISZ	DYCNT		/INCREMENT LOOP COUNTER
	JMP	DYNT33		/REPEAT IF NOT FINISHED
	JMP	DYNT36		/OTHERWISE GO CLOSE UP
/GET REGISTERS SPECIFIED BY .READ AND WRITE TO USERS BUFFER
DYNT60	0			/RETURN ADDRESS FROM THIS SUBROUTINE
	LAC	(DYNS		/POINTER TO END+1 OF FLAG INDICATOR LIST
	TAD	DYCNT		/SUBTRACT LOOP COUNTER TO POINT TO RIGHT INDICATOR
	DAC	DYTEMP
	LAC*	DYTEMP		/GET WORD SHOWING WHICH FLAG THIS IS
	AND	DYNSTD		/MASK OUT ALL OTHERS IN USER REQUEST
	DAC*	DYLPTR		/WRITE BUFFER HEADER WORD
	ISZ	DYLPTR		/INCREMENT BUFFER POINTER
	LAC	DYNSFL		/GET INTERRUPT BUFFER WORD COUNT
	SNA			/IF NO REGISTERS WERE READ
	JMP*	DYNT60		/  RETURN TO CALLER.
	DAC	DYCNT2		/INTO COUNTER
	LAC	DYWPTR		/GET BUFFER POINTER INTO
	DAC	DYTEMP		/  MOVABLE REGISTER
DYNT62	ISZ	DYTEMP		/NEXT WORD IN INTERRUPT BUFFER
	LAC*	DYTEMP		/GET THE WORD
	DAC*	DYLPTR		/GIVE IT TO USER'S BUFFER
	ISZ	DYLPTR		/NEXT WORD IN USER'S BUFFER
	ISZ	DYCNT2		/DECREMENT INT BUFFER WORD COUNT
	JMP	DYNT62		/GO GET NEXT WORD
	JMP*	DYNT60		/RETURN TO CALLER
DYNOR	LAC	(400200		/RAISE TO LEVEL 0
	ISA
	IOF
	XCT	LPFCLR		/SKP OR NOP
	DZM	DYA.+1		/CLEAR FG BUSY
	XCT	LPBCLR		/SKP OR NOP
	DZM	DYA.+2		/CLEAR BG BUSY
	LAC	DYSKP		/RESET TO SKP
	DAC	LPFCLR
	DAC	LPBCLR
	ISZ	DYBUSY		/CLEAR INT. PROCESSOR BUSY FLAG
DYNT73	ION
DYDBK	DBK			/TO LEVEL 2
	DBR			/DEBREAK TO ENTERING LEVEL & RESTORE
	XCT	.+1
	XCT	(JMP* DYINTP	/RETURN THRU ENTRY OF INT. PROCESSOR
LPNOR=DYNOR
	.EJECT
/STOP I/O SUBROUTINE
DYSTP	0
	LAC	(400200		/RAISE TO LEVEL 0
	ISA
	IOF
	DZM	DYIOW		/CLEAR INTERNAL BUSY FLAG
	RS1			/CLEAR PUSHBUTTON FLAG
	SPMI			/CLEAR MANUAL INTERRUPT FLAG
	NOP
	CFD			/CLEAR ALL OTHERS
	DZM	DYA.+1		/CLEAR BUSY AND CLOSE FLAGS
	DZM	DYA.+2
	DZM	DYA.+3
	DZM	DYA.+4
	DBK			/RELEASE INTERRUPT SYSTEM
	ION
	JMP*	DYSTP
/SET UP SWITCH IN EXIT ROUTINE TO
/CLEAR FOREGROUND OR BACKGROUND BUSY REGISTER AS
/A FUNCTION OF WORD11, AND PLACE IOF IN LPT
/IOT REGISTER SO THAT NO NEW I/O WILL BE STARTED.
LPEMPT	JMS	CLFLAG
/IS THIS DEVICE INVOLVED IN I/O BUSY SITUATION.
LPT31	LAC*	(.SCOM+52		/ADDRESS OF
	DAC	LPTMP1		/I/O BUSY
	LAC	(400200		/TESTER.
	ISA			/PROTECT.
	IOF
	LAC	(LPA.
	JMS*	LPTMP1
	DBK			/UNPROTECT.
	ION
	JMS	LPREAL		/CHECK FOR REAL TIME REQUEST.
	JMP	LPNOR		/NOT REAL TIME REQUEST.
	LAC	LPWD17
	JMS	LPNXTQ
	JMP	LPNOR
/SUBROUTINE TO PLACE CONTENTS OF
/AC IN REAL TIME QUEUEING SCHEME.
LPNXTQ	0
	DAC	LPTMP1
	LAC*	(.SCOM+51
	DAC	LPTMP2		/SAVE AC.
	LAC	(400200		/RAISE TO API
	ISA			/LEVEL 0
	IOF			/TURN OFF PIC
	LAC	LPTMP1		/RESTORE AC
	JMS*	LPTMP2		/ENTER REALTP SUBROUTINE
	DBK			/FROM LEVEL 0
DYION	ION			/TURN ON PIC.
	JMP*	LPNXTQ
/
/SUBROUTINE TO DETERMINE IF THIS I/O
/WAS A REAL TIME REQUEST OR NOT.
/CALLING SEQUENCE:	JMS	LPREAL
/		(NOT REAL)
/		(REAL)
LPREAL	0
	LAC	LPWD17		/NON 0 IF REAL TIME.
	SNA
	JMP*	LPREAL		/NOT .REALW
	LAC	(JMP DYRD
	SAD	LPWD10		/JMP FUNCTION
	ISZ	LPREAL		/.REALW
	JMP*	LPREAL
/SUBROUTINE TO SET UP CLEARING OF THE
/APPROPRIATE BUSY FLAG (AT PROTECTED EXIT TIME)
/AND NULL (IOF) LINE PRINTER IOT
/REGISTER.
CLFLAG	0
	DZM	DYIOW		/CLEAR INTERNAL BUSY FLAG
	LAC	LPA.+11		/WORD 11 OF LIVE REGS.
	SZA			/0=FGRD, 1=BGRD
	JMP	.+4
	LAC	(NOP		/FOREGROUND
	DAC	LPFCLR
	JMP*	CLFLAG
	LAC	(NOP		/BACKGROUND
	DAC	LPBCLR
	JMP*	CLFLAG
/
/THIS SUBROUTINE IS EXECUTED (XCT) BY THE
/CAL HANDLER VIA WORD 0 OF THIS I/O
/HANDLER JUST PRIOR TO GIVING CONTROL
/TO THE HANDLER AT THE APPROPRIATE
/ENTRY IN THE FUNCTION DISPATCH TABLE.
SWAP	0
/MULTI-UNIT DEVICES ONLY:
/	STOP ANY I/O
/	IN PROGRESS.
	XCT	LPA.+5		/ION OR IOF
	DBK			/FROM LEVEL 0
/MULTI-UNIT DEVICES ONLY:
/	SWAP BACKUP AND
/	LIVE DATA REGISTERS.
	JMP*	SWAP
/
/SUBROUTINE TO CAUSE OUTPUTTING OF ERROR MESSAGE.
LPTERR	0
	DAC	LPTLAW		/LAW CODE
	LAC*	(.SCOM+66
	DAC	LPTMP1
	LAC	(400200		/RAISE TO API LEVEL 0
	ISA
	IOF			/TURN OF PIC.
LPTLAW	XX			/LAW CODE
	JMS*	LPTMP1
LPTAUX	XX
	DBK
	ION
	JMP*	LPTERR
/
	.EJECT
/CONSTANTS AND STUFF LIKE THAT
DYBUSY	1		/INTERRUPT HANDLER BUSY FLAG
DYIOW	0		/READ HANDLER BUSY FLAG
DYFLGS	.DSA	DYLP		/FLAGS POINTER
DYLP	-1			/LIGHT PEN FLAG
DYMI	-1			/MANUAL INTERRUPT FLAG
DYPB	-1			/PUSHBUTTON FLAG
DYEDG	-1			/EDGE FLAG
DYISTP	-1			/INTERNAL STOP FLAG
DYESTP	-1			/EXTERNAL STOP FLAG
DYDZM	DZM	DYLP		/DZM TO BE INSERTED IN INTERRUPT HANDLER
DYSTD3	004340
DYSTD2	007440
DYSTD	777440			/STANDARD SET OF REGISTERS TO READ FROM 339
	407777			/BUFFER HEADER CONSTANTS-INDICATES LIGHT PEN
	207777			/INDICATES MANUAL INTERRUPT FLAG
	107777			/INDICATES PUSHBUTTON FLAG
	047777			/INDICATES EDGE FLAG
	027777			/INDICATES INTERNAL STOP FLAG
	017777			/INDICATES EXTERNAL STOP FLAG
DYNS	007777			/INDICATES NO INTERRUPT, JUST READ
DYLPTR=DYR			/POINTER TO USERS .WRITE BUFFER
DYREG	RPDP+10			/READ DISPLAY REGISTERS IOTS
	RXP+10
	RYP+10
	RDAC+10
	RS1+10
	RS2+10
	RPB+10
	RSG1+10
	RSG2+10
	RCG+10
DYNT1X	DYNT12			/LIST OF PLACES IN THE INTERRUPT
	DYNT16			/  HANDLER SET BY .READ TO EITHER
	DYNT15			/  DZM IF THIS IS A REQUESTED FLAG
	DYNT13			/  OR NOP IF THIS FLAG IS TO BE
	DYNT14			/  IGNORED.
	DYNT17
DYBUF1	.BLOCK	12		/INTERNAL BUFFERS TO SAVE 339 REGISTER
DYBUF2	.BLOCK	12
DYAPTR	DYBUF2			/AUXILLIARY BUFFER POINTER
DYBPTR	DYBUF1			/INTERRUPT READ BUFFER POINTER
DYWPTR	DYBUF1			/INTERRUPT PROC. WORKING BUFFER PTR
DYRR2X	DYRR21			/LIST OF PLACES
	DYRR22		/IN THE READ-REGISTERS
	DYRR23		/ROUTINE, SET BY .READ
	DYRR24		/TO EITHER THE APPROPRIATE
	DYRR25		/READ IOT OR A SKP
	DYRR26		/DEPENDING ON WHETHER
	DYRR27		/THE USER REQUESTED THIS
	DYRR30		/REGISTER OR NOT
	DYRR31
	DYRR32
	.END