	.TITLE RSX LINE PRINTER HANDLER
/
/   7 SEP 77 (PDH) FOLD LOWER CASE INTO UPPER; DEFINE 'UC15'
/
UC15=0
/

/ COPYRIGHT (C) 1976

/ DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

/

/ THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY

/ ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH

/ THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS

/ SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-

/ VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON

/ EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO

/ THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE

/ SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.

/

/ THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE

/ WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-

/ MITMENT BY DIGITAL EQUIPMENT CORPORATION.

/

/ DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY

/ OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY

/ DEC.

/

	.EJECT

/

/	EDIT #20	8/29/73		S. ROOT

/	EDIT #21	11/25/73	G. COLE & S. ROOT

/	EDIT #22	11/26/73	S.ROOT FIX TOO SHORT LINE

/	EDIT #17	30 APR 72	H. KREJCI

/					C. PROTEAU

/					W. A. DESIMONE

/	EDIT #23	1/9/74		SCR CLEANUP

/	EDIT #24	1/17/74		SCR CLEANUP

/	EDIT #25	1/18/74		SCR CLEANUP

/	EDIT #26	2/2/74		API TRAP VECTOR NUMBER ERROR

/	EDIT #027	2/2/74		FIX NO OK EXIT PROBLEM

/	EDIT #028	2/2/74		FIX IMAG MODE COUNT

/	EDIT #029	2/28/74	SCR	PUT LINE FEED BACK FOR UC15 IMAGE MODE

/	EDIT #031	5/25/74	SCR	#030 HAD A RUN-DOWN PROBLEM, RETRENCH

/					TO 029 MOSTLY

/	EDIT #032	5/9/75 MJH	MISSING DISCLAIMER
/	EDIT #033	5/21/76 SCR	CLOSE FOR UC15 SPOOLER
/	EDIT #034	7/12/76	SCR	LP15 CLOSE=FF;PIREX INIT BUG
/	EDIT #035	8/5/76 (SCR)	CLOSE NO LONGER =FF
/	EDIT #036	8/19/76 (SCR)	FIX SPOOLER; NO DOUBLE CLOSE
/	EDIT #037	8/25/76 (SCR)	COMPRESS CODE TO <760 FOR UC15
/	EDIT #038	8/26/76 (SCR)	BUG IN CLOSE, LOST REQ. NODE
/

/

/

/	MODIFICATIONS FOR UC15 UNICHANNEL LINE PRINTERS

/

/  WHEN THE ASSEMBLY PARAMETER UC15=0 IS SUPPLIED, A VERSION

/  FOR THE UNICHANNEL PRINTERS IS CREATED.

/

/  IN THIS CASE THE INTERNAL BUFFER IS PACKED TWO CHAR'S PER

/  WORD, RIGHT JUSTIFIED, WITH THE TWO TOP BITS UNUSED.

/  THE FIRST CHARACTER GOES ON THE RIGHT!, THE SECOND ON THE LEFT!

/

/  ERROR CONDITIONS ARE ENTIRELY HANDLED ON THE PDP-11 SIDE. THE
/  PDP-15 SIDE HANDLER ASSUMES THAT THE DEVICE NEVER MAKES AN

/ ERROR; SOME OPERATIONS JUST TAKE A WHILE TO COMPLETE. ERROR

/  MESSAGES ARE PLACED IN A TABLE IN THE PIREX-11 EXEC. A

/  SEPARATE TASK PRINTS OUT ANY ERROR S THAT OCCUR. THE
/  PDP-11 HANDLES TIMEOUT UNTIL DEVICE READY.

/

/	W  A  R  N  I  N  G  !  !

/

/  IN ORDER FOR THE UC15 HANDLER TO FUNCTION PROPERLY, THE

/  PDP-11 MUST BE ABLE TO ACCESS OUR INTERNAL BUFFER

/  AND TCB'S. THIS MEANS THAT THEIR ADDRESS MUST BE LESS THAN

/  28K TO THE PDP-11. THUS, IF THE PDP-11 LOCAL MEMORY IS 8K,

/  THIS HANDLER MUST RESIDE BELOW 20K IN PDP-15 CORE! THIS IS

/  EQUIVALENT TO 50000 OCTAL. SIMILARLY, IF THE LOCAL 

/  PDP-11 MEMORY IS 12K, THE HANDLER MUST RESIDE BELOW

/  40000 OCTAL.

/

/   STANDARD SERIES PRINTERS

/

/

/ THIS HANDLER DRIVES THE LP15 PRINTER SERIES.  IT IS

/ COMPATIBLE WITH NORMAL OUTPUT FROM MACRO & FORTRAN WRITTEN

/ PROGRAMS.

/

/ TO SATISFY A PRINT REQUEST, THE LINE IS MOVED TO A BUFFER IN

/ THE HANDLER TASK BECAUSE IT MAY HAVE TO BE MODIFIED (IF NORMAL

/ FORTRAN OUTPUT), AND BECAUSE A NORMAL MODE REQUESTOR MUST

/ NOT BE ABLE TO MODIFY THE LINE AFTER THE HARDWARE HAS BEGUN

/ TO READ IT (THE LP15 CONTROLLER UNPACKS 5/7 ASCII CHARACTERS

/ UNTIL A VERTICAL CONTROL CHARACTER IS FOUND).

/

/ ALL IMAGE MODE OUTPUT AND ASCII OUTPUT NOT BEGINNING WITH

/ 12 (LINE FEED), 14 (FORM FEED), 21 (DOUBLE SPACE), OR 20

/ (OVER PRINT) IS PRECEDED BY A LINE FEED, AND PRINTED IN 

/ SINGLE LINE MODE.

/

/ FOR ASCII MODE OUTPUT BEGINNING WITH 12, 14, OR 21 (FORTRAN

/ OTS OUTPUT), THE HIGH ORDER HEADER HALFWORD IS SET TO TWO (TO

/ INDICATE TWO "LINES") AND THE LINE IS OUTPUT IN MULTIPLE-LINE
/ MODE.

/

/ FOR ASCII MODE OUTPUT BEGINNING WITH 20 (FORTRAN OTS OUTPUT TO

/ OVERPRINT THE PREVIOUS LINE), THE HIGH ORDER HEADER HALFWORD

/ IS SET TO TWO, THE 20 IS CHANGED TO A 15 (CARRIAGE RETURN, 

/ WHICH IS EFFECTIVELY A NOP), AND THE LINE IS PRINTED IN MULTIPLE

/ LINE MODE.

/

/ THERE ARE NO IMPOSED PAGE EJECTS AT PAGE BOTTOMS.

/

/ THE FOLLOWING CAL PARAMETER BLOCKS ARE USED TO QUEUE REQUESTS FOR

/ PRINTER SERVICE:

/
/	CPB	3600	HANDLER INFORMATION (HINF)

/		EV

/		LUN

/

/	CPB	2400	ATTACH PRINTER

/		EVA

/		LUN

/

/	CPB	2700	PRINT LINE

/		EVA

/		LUN

/		MODE

/		LINE

/

/	CPB	2500	DETACH PRINTER

/		EVA

/		LUN

/

/ THE REQUESTOR'S EVENT VARIABLE IS CLEARED (ZEROED) WHEN THE REQUEST

/ IS QUEUED BY THE "QUEUE I/O" DIRECTIVE.  IF THE REQUEST CAN BE 

/ PERFORMED, THE EVENT VARIABLE IS SET TO ONE (+1) UPON COMPLETION.

/ IF THE REQUEST CANNOT BE PERFORMED, THE EVENT VARIABLE IS SET TO ONE 

/ OF THE FOLLOWING NEGATIVE VALUES:

/

/	 -6 -- ILLEGAL REQUEST FUNCTION

/	 -7 -- ILLEGAL DATA MODE

/	-16 -- ILLEGAL OUTPUT HEADER WORD-PAIR-COUNT (<1)

/	-24 -- LUN HAS BEEN REASSIGNED WHILE REQUEST WAS IN QUEUE

/	-30 -- OUT-OF-PARTITION TRANSFER (NORMAL MODE)
/	-203 - ILLEGAL TO ATTACH OR DETACH FROM OTHER THAN TASK LEVEL

/

X12=12		/AUTO-INCREMENT REG 12

X13=13		/AUTO-INCREMENT REG 13
X17=17		/AUTO-INCREMENT REG 17 (USED TO SET REQUESTOR'S EV)
X10=10		/(037) FETCH STL NODE ADDR FOLLOWING DMTQ

R1=101		/RE-ENTRANT REGISTER ONE

R2=102		/RE-ENTRANT REGISTER TWO

R3=103		/RE-ENTRANT REGISTER THREE

R4=104		/RE-ENTRANT REGISTER FOUR

NADD=107	/NODE ADDITION ROUTINE ENTRY POINT

SNAM=123	/NAME SCAN ROUTINE ENTRY POINT

POOL=240	/LISTHEAD FOR POOL OF EMPTY NODES

PDVL=252	/LISTHEAD FOR PHYSICAL DEVICE LIST

ALAD=325	/ATTACH LUN & DEVICE ENTRY POINT

DLAD=332	/DETACH LUN & DEVICE ENTRY POINT
DQRQ=337	/DE-QUEUE REQUEST ENTRY POINT

VAJX=342	/VERIFY & ADJUST ENTRY POINT

IOCD=345	/DECLARE I/O REQUEST COMPLETE ENTRY POINT

DMTQ=361	/DETACH & EMPTY QUEUE ENTRY POINT

D.TG=10		/POSITION OF TRIGGER EVENT VARIABLE IN PDVL NODE

LUN=2		/LUN FOR NOT-READY MESSAGE.(LUN 3 NOT USED SINCE MCR OUTPUT

		/COULD BE CHANNELED THRO LUN 3)

WCA=34		/WORD COUNT ADDRESS (NOT USED BY LP CONTROLLER)

CAA=35		/CURRENT ADDRESS REGISTER ADDRESS

LPP1=706541	/PRINT ONE LINE

LPPM=706521	/PRINT MULTIPLE LINE

LPRS=706552	/READ LP STATUS

LPEI=706544	/ENABLE LP INTERRUPTS

LPDI=706561	/DISABLE LP INTERRUPTS

LPCD=706621	/CLEAR LP DONE FLAG

LPCS=706641	/CLEAR LP STATUS AND ERROR FLAGS

.INH=705522	/INHIBIT INTERRUPTS

.ENB=705521	/ENABLE INTERRUPTS

/

/

	.IFDEF	UC15

/

/  EQUATES FOR UNICHANNEL PRINTERS

/

APISLT=56

APILVL=2

LPSI=APILVL*20+706101

SIOA=706001

LIOR=706006

CAPI=APILVL*20+706104

/
	.IFUND	NOSPL

DEVCOD=4		/DEVICE CODE IN PIREX IF SPOOLING ALLOWED

	.ENDC

	.IFDEF	NOSPL

DEVCOD=204		/200 BIT FORBIDS SPOOLING

	.ENDC

	.ENDC

	.DEC
	.IFUND	LBZ	/LINE BUFFER SIZE MAY BE CHANGED VIA

/

/  PDP-15 LINE PRINTERS MAY HAVE MAX OF 132 CHAR'S IN IMAGE

/

LBZ=134			/CONDITIONAL ASSEMBLY, HOWEVER 'LBZ'

/

	.ENDC		/MUST BE EVEN (FOR "GUARD WORD" PROTECTION TO WORK).

	.OCT
	.IFUND	UC15
LBZX=LBZ/2*2-LBZ

	.IFNZR	LBZX

	.END -- LBZ MUST BE EVEN

	.ENDC

	.ENDC

/

LBF=.

/

/ HANDLER INITIALIZATION

/

START	LAC	LPDVL	/SCAN PHYSICAL DEVICE LIST FOR NODE

	DAC*	(R1)	/FOR THIS DEVICE.

	LAC	LHNAM

	DAC*	(R2)

	JMS*	LSNAM	/(R1, R2, R6, X17, XR, & AC ARE ALTERED)

			/NODE FOUND?

	CAL	(10)	/NO -- EXIT

	DAC	PDVNA	/SAVE PDVL NODE ADDRESS

	AAC	+D.TG	/AND

	DAC	PDVTA	/TRIGGER EVENT VARIABLE ADDRESS ADDRESS.
/
	.IFDEF	UC15
/
	JMS	CLEAR	/CLEAR OUT DEVICE, WAIT
	LAC	EV11K	/PIREX HAVE DRIVER FOR US?
	RTL		/PDP-11 SIGN BIT TO OURS
	SPA		/SKIP IF OK
	JMP	INTERR	/NO, MESSAGE AND LEAVE
/
	.ENDC
/
	CAL	CCPB	/CONNECT INTERRUPT LINE
	LAC	EV	/CONNECT OKAY?

	SPA

	CAL	(10)	/NO -- EXIT

	LAC	LTG	/YES -- SET TRIGGER EVENT VARIABLE ADDRESS

	DAC*	PDVTA	/IN PHYSICAL DEVICE NODE

	AND	L70000	/DETERMINE "XR-ADJ"

	TCA

	DAC	XADJ

/
	.IFUND	UC15
/
	LPCD		/CLEAR LP CONTROLLER
	LPCS
/
	.ENDC
/
	JMP	WFTGR	/EITHER CASE, GO WAIT FOR ACTION
/
/
	.IFDEF	UC15
/
INTERR	CAL	MSINIT	/PROBLEM, TYPE MESSAGE
	CAL	WFMS	/WAIT FOR MESSAGE COMPLETION
	CAL	(10	/TYPED, NOW EXIT
/
WFMS	20	/WAIT FOR ERROR MESSAGE
	EV
MSINIT	2700		/TYPE ERROR MESSAGE
	EV
	LUN
	2
	INITMS
INITMS 	004002; 000000; .ASCII "*** NO LP IN PIREX"<15>
/
	.ENDC
/
/

HNAM	.SIXBT "LP@@@@"	/DEVICE NAME (HANDLER TASK NAME IS "LP....")

/

/  INITIALIZATION LITERALS, TO SAVE SPACE

/

LPDVL	PDVL		/PHYSICAL DEVICE LIST HEADER ADDR.

LHNAM	HNAM		/POINT TO HANDLER NAME

LSNAM	SNAM		/SEARCH FOR NAME MATCH ROUTINE ADDR.

LTG	TG		/ADDR OF OUT TRIGGGER

L70000	70000		/LITERAL FOR XR ADJUSTMENT

/

/

			/END OF INITIALIZATION CODE

/

	.IFUND	UC15

/

	.BLOCK LBZ+LBF-.

/

/ ^^^^^^^^^^^^^^^^ THE ABOVE CODE IS OVER- ^^^^^^^^^^^^^^^^^^

/ ^^^^^^^^^^^^^^^^ LAYED BY OTS ASCII LINES ^^^^^^^^^^^^^^^^^

/

	064015	/GUARD WORD CONTAINS A CARRIAGE RETURN (15) LINE

		/TERMINATOR FOR BOTH ASCII & IMAGE MODE LINES.  ITS

		/PURPOSE IS TO STOP THE LP15 CONTROLLER IF A LINE

		/DOES NOT CONTAIN A VERTICAL CONTROL CHARACTER

		/REQUIRED TO STOP THE CONTROLLER FROM FETCHING

		/DATA FROM CORE.

	.ENDC

	.IFDEF UC15

/

	.BLOCK	LBZ/2+2+LBF-.

PUTP	0

	.ENDC

/

/

/ WAIT FOR TASK TO BE TRIGGERED BY 'QUEUE I/O' DIRECTIVE OR BY 'ABORT'

/ TO SIGNAL THAT A REQUEST HAS BEEN QUEUED.

/

WFTGR	CAL	WFTCPB	/WAIT FOR TRIGGER EVENT VARIABLE TO BE SET

/

	.IFUND	UC15

/

/ THE TASK HAS BEEN TRIGGERED -- PICK A REQUEST FROM QUEUE (IF ANY)

/

	DZM	TG	/CLEAR TRIGGER
PQ	LAC	PDVNA	/DEQUE A REQUEST

/

	.ENDC

/
	.IFDEF	UC15
/
PQ	LAC	TG	/FIND OUT WHO WOKE US UP

	DZM	TG	/CLEAR FOR NEXT TIME AROUND

	RTL		/ABORT BIT TO AC0

	SPA!CLA!IAC	/SKIP IF NOT, SET UP 1 FOR COMPARES

	JMP	PQ1	/PICK OFF ABORT IN NORMAL MANNER

/			/IRREGARDLESS IF WAITING FOR INTERRUPT

	SAD	LPDON	/HAS INTERRRUPT COME BACK

	JMP	OPDONE	/GO CHECK IT OUT

	SAD	POST	/ARE WE WAITING FOR ONE

	JMP	WFTGR	/YES, DO NOTHING NOW, INTERRUPT WILL WAKE

/			/US LATER;WE ALWAYS CHECK DEQUE BEFORE 

/			/RETUNING TO SLEEP AGAIN.

PQ1	LAC	PDVNA	/DEQUE A REQUEST

/

	.ENDC

/

	DAC*	(R1)
	JMS*	(DQRQ)	/(R1, R2, R4, R5, R6, XR, & AC ARE ALTERED)
/			/R1 NOW CONTAINS PDVL NODE ADDR
/			/R2 NOW CONTAINS I/O REQ NODE ADDR

			/WAS A REQUEST FOUND?

	JMP	WFTGR	/NO -- WAIT FOR TRIGGER

	DAC	RN	/YES -- SAVE ADDRESS OF REQUEST NODE

	TAD	XADJ	/SETUP XR TO ACCESS NODE

	PAX

/

	LAC	5,X	/FETCH CAL FUNCTION CODE

	AND	(777)

	SAD	(017)	/ABORT REQUEST?

	JMP	ABORT	/YES -- ABORT TASK I/O

	SAD	(777)	/NO -- EXIT (DEASSIGNED) REQUEST?

	JMP	DAEX	/YES -- DETACH & EXIT

	SAD	(27	/PRINT REQ?

	JMP	PRINT	/YUP
	SAD	(36	/HINF CODE REQ?
	JMP	HINF
	.IFDEF	UC15	/(035) PDP11 PRINTER ONLY; CLOSE TO SPOOLER
	SAD	(34	/(033) HONOR CLOSE
	JMP	CLOSE	/(033)
	.ENDC		/(035)
	CLL!RAR		/SEARCH ATTACH DETACH IN COMMON
	SAD	(12	/24/2 AND 25/2  ARE 12

	JMP	ATTACH	/GO DO EITHER

ILFUNC	LAW	-6	/NO -- UNIMPLEMENTED FUNCTION -- SET

	JMP	SEV	/EVENT VARIABLE TO -6

/

/ ABORT ALL I/O INITIATED BY THE INDICATED TASK.

/
ABORT	XOR	5,X	/ABORT IS AN ILLEGAL FUNCTION FOR ALL TASKS
	SZA		/(037) EXCEPT 'IORD' WHO SETS LUN=0
	JMP	ILFUNC
	JMS*	(DMTQ	/(037) R1 AND R2 SET UP FOR THIS CALL
/
	.IFDEF	UC15
/
	LAC*	(X10	/(037) DMTQ LEAVES STL NODE ADDR HERE
	SAD	STLA	/(037) SAME AS PRESENT REQ
	CLA!IAC		/(037) YES, SO ENABLE NEXT TEST
	SAD	POST	/(037) I/O IN PROGRESS
	JMS	CLEAR	/(037) YES, SO CLEAR OUT PDP-11
	.ENDC
/
	JMP	SP1	/DONE.
/
/
/  ATTACH TO  OR  DETACH FROM A TASK
/
ATTACH	SNL!CLA		/(037) SKIP IF DETACH
	AAC	ALAD-DLAD /(037) MAKE UP ADDR FOR ALAD OR DLAD
	AAC	DLAD	/(037) FOR JMS TO ACTION
	DAC	TEMP1	/(037) TEMPORARY FOR JMS*
	JMS*	TEMP1	/(037) CALL ATTACH OR DETACH
/			/(037) R1 AND R2 ALREADY SET UP
	JMP	SEV	/NO -- SET REQUESTOR'S EVENT VARIABLE TO -24 OR -203
SP1	CLA!IAC		/YES -- SET REQUESTOR'S EVENT VARIABLE TO +1
	JMP	SEV
/
/
/ RETURN HANDLER INFORMATION IN EVENT VARIABLE

/
HINF	LAC	(100011)

	JMP	SEV

/
/ PRINT LINE
/
	.IFUND	UC15
/
/
/
PRINT	LAC	7,X	/SAVE MODE INDICATOR

	DAC	MI

	AND	(777776)/IF DATA MODE IS OTHER THAN 2 (ASCII)

	SAD	(000002)/OR 3(IMAGE), SET REQUESTOR'S EVENT

	JMP	.+3	/VARIABLE TO -7

	LAW	-7

	JMP	SEV

/

	.ENDC

/

	.IFDEF	UC15

/
CLOSE	LAC	(6415	/(035) MUST PROVIDE DATA; OVERPRINT.
	DAC	LBF+2	/(033) INTO DATA
	LAC	(104001	/(033) 1 CHAR, EOF FOR SPOOLER
	SAD	LBF	/(036) CLOSE LAST THING SENT??
	JMP	SP1	/(038) COMPLETE REQUEST
	DAC	LBF	/(033)
	LAC	2,X	/(038) REMEMBER WHO ISSUED REQ.
	DAC	STLA	/(038)
	JMP	UCLP04	/(033) JOIN UP TO SEND LINE
/

PRINT	LAC	2,X

	DAC	STLA	/REMEMBER WHO ISSUED PRINT

/

/  SORRY ABOUT NEXT FEW; DATA MODE MUST BE 2 OR 3;

/  PUT IN MI A NOP FOR MODE 3 AND SKIP FOR MODE 2

/

	LAW	-2	/ADD IN MODE TO GIVE 0 OR 1

	TAD	7,X

	RAR!CLL		/0 IN AC IF ONLY IF LEGAL DATA MODE

	SNA!RAL		/SKIP ILLEGAL

	JMP	.+3	/NOW AC 0 FOR ASCII, 1 FOR IMAGE

	LAW	-7	/ERROR XIT

	JMP	SEV	/FOR ILLEGAL DATA MODE

	SWHA		/1000 FOR IMAGE MODE

	XOR	(SKP	/SKP OR NOP AS REQUESTED

	DAC	MI

/

	.ENDC
/			/(037) R2 ALREADY SET UP

	LAC	10,X

	DAC*	(R3)

	DAC	TEMP1	/(SAVE UN-ADJUSTED BASE FOR SECOND JMS)

	CLA!IAC

	DAC*	(R4)

	JMS*	(VAJX)	/(R3, R5, XR, & AC ARE ALTERED)

			/IS BEGINNING ADDRESS OKAY?

	JMP	ERR30	/NO -- SET REQUESTOR'S EVENT VARIABLE TO -30

	LAW	-1	/YES -- SETUP X12 AS SOURCE INDEX TO MOVE LINE

	TAD*	(R3)

	DAC*	(X12)

/

	LAC*	X12	/MOVE FIRST HEADER LINE AND ESTABLISH LINE

	DAC	LBF	/LENGTH IN WORDS.

	LRS	10

	AND	(776)

	DAC*	(R4)

/

	AAC	-2	/IF LESS THAN TWO WORDS, SET REQUESTOR'S

	SMA		/EVENT VARIABLE TO -16.

	JMP	.+3

	LAW	-16

	JMP	SEV

/

	LAC	TEMP1	/VERIFY LINE SIZE (NORMAL MODE).  R2 & R4 ARE

	DAC*	(R3)	/SETUP.

	JMS*	(VAJX)	/(R3, R5, XR, & AC ARE ALTERED)

			/IS LINE SIZE OKAY?

	JMP	ERR30	/NO -- SET REQUESTOR'S EVENT VARIABLE TO -30

/

/  FOLLOWING SECTION FOR PDP-15 PRINTERS

/

	.IFUND UC15

	LAC*	(R4)	/YES -- SETUP 'TEMP1' AS WORD COUNT FOR MOVE

	TCA

	DAC	TEMP1

	AAC	+LBZ

	SMA

	JMP	.+3

	LAW	-LBZ

	DAC	TEMP1

	LAC	(LBF)	/SETUP X13 AS DESTINATION INDEX FOR MOVE

	DAC*	(X13)

/

	LAC*	X12	/MOVE REMAINDER OF LINE TO INTERNAL BUFFER

	DAC*	X13

	ISZ	TEMP1

	JMP	.-3

/

	CLA!IAC		/LINE HAS BEEN MOVED AND IS READY TO BE 

	JMS	SEVRN	/PRINTED FROM INTERNAL BUFFER, INDICATE

			/TO THE REQUESTOR THAT THE LINE HAS BEEN 

			/PRINTED BY SETTING HIS EVENT VARIABLE TO

			/+1.

/

	LAC	MI

	SAD	(3

	JMP	LFPSL

	LAC	LBF+2

	AND	(774000

	SAD	(50000

	JMP	PTL	/YES -- PRINT TWO LINES

	SAD	(060000)/NO -- FORM FEED (14)?

	JMP	PTL	/YES -- PRINT TWO LINES

	SAD	(104000)/NO -- DOUBLE SPACE (21)?

	JMP	PTL	/YES -- PRINT TWO LINES

	SAD	(100000)/NO -- OVERPRINT (20)?

	SKP

	JMP	LFPSL	/NO -- LINE FEED & PRINT SINGLE LINE

	LAC	LBF+2	/YES -- CHANGE 20 TO 15 (NOP LINE) AND

	AND	(003777)/PRINT TWO LINES

	XOR	(064000)

	DAC	LBF+2

	JMP	PTL

	.ENDC

/

/  UC15 SECTION TO TRANSFER BUFFER

/

	.IFDEF	UC15

/

/  EQUATES

/

LINLEN=LBZ-2		/CHARACTEERS PER LINE

/

	LAC*	X12	/!!MOVE!! FROM HEADER TO POINT TO DATA

	LAC	(LBF+2	/PUTTER POINTER IN PUTP

	DAC	PUTP

	LAC*	(R4	/HERE IS WORD COUNT OF BUFFER

	XCT	MI	/SKIP ASCII

	SKP		/IMIAGE, SKIP TO SUBTRACT 1

	SKP!CLL!RAR	/ASCII, REDUCE TO PAIR COUNT, SKIP TO TCA

	AAC	-1	/IMAGE, CORRECT FOR TWO WORDS IN HEADER

	CMA!IAC		/NEGATE FOR ISZ LOOP CONTROL. ISZ FIRST

	DAC	TEMP1

	LAC	GETIN	/INIT. CHAR GETTER

	DAC	GETSW

	LAC	PUTIN	/INIT CHAR PUTTER

	DAC	PUTSW

	DZM	LBF	/CLEAR CHARACTER COUNT

	CLA!CMA		/SET UP FIRST SWITCH

	DAC	FIRST

	DZM	TCHAR	/SO IT ISN'T A CR IN CASE OF BLANK LINE!

	JMS	RESETL	/RESET LINE POINTERS

/

/  MAIN LOOP TO TRANSFER CHAR'S TO HANDLER BUFFER

/
MAIN	JMS	GETCH	/CHARACTER GETTER, LEAVES IT IN AC

	DAC	TCHAR	/SAVE IT

	SNA		/SKIP UNLESS NULL CHAR

	JMP	MAIN	/NULL, IGNORE

	AAC	-40	/SEPARATE 'TEXT' CHAR'S FROM CONTROL CHAR'S

	SNA!SPA		/SKIP ON REGULAR CHARS

	JMP	MSPEC	/GO DO SPECIALS

	SAD	(137	/RUB OUT?

	JMP	MAIN	/IGNORE

	SAD	(135	/ALT MODE

	JMP	UCLP04	/END OF LINE ON ALT MODE

	LAC	BLANKC	/DO WE HAVE PENDING BLANKS/TABS TO SEND

/

/  NOTE THAT BLANKC HAS MINUS THE COUNT OF CONSECUTIVE BLANKS

/  TO SEND. A TAB IS CHANGED TO CONSECUTIVE BLANKS SINCE THE

/  PDP-11 HARDWARE DOESN'T KNOW ABOUT TABS.

/

	SMA!CLL		/SKIP IF ANY AT ALL

	JMP	MAINC	/NOPE, GO DO REGULAR CHAR.

	TAD	(200	/CHECK IF MORE THAN 127

	SMA!CLA		/SKIP IF YES

	JMP	MAIND	/NOPE, PUT OUT ONE COUNT OF BLANKS

	TAD	(200	/FIRST OF TWO COUNTS, 128

	JMS	PUTCH

	LAC	(200	/SET UP BALANCE

MAIND	TAD	BLANKC	/BALANCE FOR TWO, ALL IF ONE ONLY CASE

	JMS	PUTCH
MAINC	DZM	BLANKC	/RESET COUNTER
	LAC	TCHAR	/ORIGINAL CHAR.
	AAC	-140		/ (PDH) CHECK FOR LOWER CASE
	SMA			/ (PDH)
	AAC	-40		/ (PDH) FOLD LOWER CASE TO UPPER
	AAC	140		/ (PDH) RESTORE CHARACTER
	JMS	PUTCH	/PLACED INTO BUFFER

MAINK	ISZ	TABC	/INCREMENT TAB COUNTER

	JMP	MAINE	/NOT OVERFLOW, GO CHECK LINE COUNTER

	LAW	-10	/RESET TAB COUNTER

	DAC	TABC

MAINE	ISZ	MAXC	/HAVE WE RUN OUT OF LINE

	JMP	MAIN	/NO

	JMP	UCLP04	/YES, GO FINISH UP, RESET LINE POINTERS
/

/  SPECIAL CHARACTERS

/

MSPEC	SZA!CLA!CMA	/SKIP IF IT IS A BLANK

	JMP	MSPEC2	/NOPE, CHECK FOR OTHER THINGS

	TAD	BLANKC	/ADD ONE TO BLANK COUNTER (IS MINUS COUNTER)

	DAC	BLANKC

	JMP	MAINK	/JOIN LINE AND TAB CONTROL SECTION

MSPEC2	LAC	TCHAR	/GET BACK ORIGINAL CHAR

	SAD	(11	/IS IT A TAB

	JMP	MTAB	/YUP, GO DO IT

	SAD	(15	/CARRIAGE RETURN

	JMP	UCLP04	/END OF LINE ON CARRIAGE RETURN

	SAD	(20	/FORTRAN OTS OVERPRINT, DO AS CR

	JMP	MCR

	SAD	(14	/FORM FEED

	JMP	MSPEC3	/JUST PUT IT OUT, FOR NOW

	SAD	(21	/FORTRAN DOUBLE SPACE
	JMP	MSPEC4	/DO AS TWO 12'S

MSPEC5	LAC	(12	/DEFAULT ON UNRECOGNIZED CONTROL CHAR. IS LINE FEED

MSPEC3	JMS	PUTCH	/PLACE IN BUFFER

	JMP	MAIN	/GO DO NEXT

MSPEC4	LAC	(12	/FIRST OF TWO 12'S FOR THE 21

	JMS	PUTCH

	JMP	MSPEC5	/GO DO THE SECOND 112

MCR	JMS	RESETL	/RESET LINE POINTERS

	LAC	(15	/CARRIAGE RETURN

	JMP	MSPEC3	/PUT CHAR AND LOOP

MTAB	LAC	TABC	/GET REMAINING COUNT FOR TAB

	TAD	BLANKC	/AND ADD TO CUMULATIVE BLANK COUNT

	DAC	BLANKC

	LAC	TABC	/AND TO LINE CHECKER

	CMA!IAC

	TAD	MAXC

	DAC	MAXC

	SMA		/SKIP IF SOME LINE LEFT

	JMP	UCLP04	/NONE LEFT, FINISH UP, RESET POINTERS

	LAW	-10

	DAC	TABC	/RESET TAB COUNTER

	JMP	MAIN	/NEXT CHAR

/

/

UCLP04	CLA!IAC		/FROM USER BUFFER, SET EV

	JMS	SEVRN	/THIS RETURNS NODE SETS EV ETC.

	LAC	LBF	/GET CHAR COUNT

	SZA!CLA!CMA	/SKIP ON ZERO COUNT, -1 IS A BLANK!

	JMP	RETRY	/GO DO REGULAR

	ISZ	LBF	/MAKE COUNT 1 FOR THE BLANK

	JMS	PUTCH	/PUTS A SINGLE BLANK OUT

/

RETRY	CLA!IAC		/SET POST, SAYS WE'RE WAITING

	DAC	POST	

	DZM	LPDON	/CLEAR INTERRUPT HAPPENED

	LAC	TCBP	/POINTER FOR PIREX COMMAND STRING

	JMS	LPIU	/SEND IT

	JMP	WFTGR	/WAIT FOR INTERRRUPT TO WAKE US UP

/

OPDONE	DZM	POST	/RETURNED FROM PDP-11

	DZM	LPDON	/CLEAR FLAGS

	LAC	EV11	/PDP-11 STATUS

	AND	(177777	/KEEP THE PDP-11 BITS

	SAD	(177001	/OUT OF POOL ERROR

	JMP	RETRY	/YES, GO TRY AGAIN

	RTL	/PDP-11 SIGN BIT TO OUR SIGN BIT

	SPA!RTR		/REMAKE ORIG. CODE, SKIP IF OK

	DAC	IMPERR	/STORE 'IMPOSSIBLE' ERROR AND CONTINUE?!?

	JMP	PQ	/GO LOOK FOR MORE WORK

/

IMPERR	0		/IMPOSSIBLE ERROR HOLDER

/

/	CHARACTER UNPACKING ROUTINE

/

/  THIS ROUTINE 'OWNS' THE MQ

/

/  

/  CHARACTERS ARE OBTAINED FROM X12 POINTER. EACH CHAR

/  IS RETURNED RIGHT JUSTIFIED IN THE AC

/  TEMP1 HAS A MINUS COUNT OF THE WORDS TO BE OBTAINED

/  FROM THE INPUT POINTER X12

/

GETCH	0

	XCT	MI	/SKIP IF IT IS ASCII

	SKP

	JMP*	GETSW	/GETSW IS POINTER TO CORRECT ACTION ON ONTHE

/			/CORRECT ONE OF THE FIVE POSSIBLE CHAR'S

/

/  NOW DO IMAGE MODE

/

	ISZ	TEMP1

	SKP		/SKP ON NOT THRU YET

	JMP	UCLP04	/DONE

	LAC*	X12

	JMP	GETCM	/FINISH UP IN COMMON

/

GETSW	0		/POINTER TO CORRECT ACTION. INIT'ED FROM GETIN

/			/FILLED BY JMS GETSW AFTER EACH CHAR

GETCM	AND	(177	/COMMON FINISH UP, STRIP XTRA BITS

	JMP*	GETCH	/OUT

/

GETIN	GET1		/INIT GETSW TO POINT TO FIRST CHAR ACTION

/

/  INDIVIDULA CHARACTER ACTION

/

GETQ	JMS	GETSW	/AFTER 5TH CHAR, POINT BACK TO FIRST

/

GET1	ISZ	TEMP1	/OUT OF PAIRS?

	SKP		/SKIP IF NOT

	JMP	UCLP04	/ASCII, RESET LINE POINTERS ON RUNOUT

	LAC*	X12	/FIRST WORD OF PAIR

	LMQ		/INTO MQ FOR SHIFTING

	LLS	7

	JMS	GETSW	/DONE, LEAVE POINTER FOR SECOND CHAR

GET2	LLS	7	/SECOND CHAR

	JMS	GETSW	/LEAVING POINTER FOR THIRD

GET3	LLS	4	/THE HALF-AND-HALF CHAR

	DAC	GETSW	/VERY TEMPORARY

	LAC*	X12	/CAN'T END IN MIDDLE OF PAIR

	LMQ		/SECOND WORD TO SHIFTER

	LAC	GETSW	/BRING BACK FIRST

	LLS	3	/COMPLETE CHAR

	JMS	GETSW	/LEAVING POINTER TO FOURTH ACTION

GET4	LLS	7

	JMS	GETSW	/LEAVING FOR 5

GET5	LLS	7

	JMP	GETQ	/BACK TO TOP FOR POINTER TO 1

/

/

/

/  CHARACTER PUTTER FOR PDP-11

/

/  TWO CHAR'S PER WORD FORMAT. FIRST CHAR IS RIGHT JUSTIFIED, SECOND

/  IS PLACED IMMEDIATELY ABOVE FIRST, LEAVING TOP TWO BITS OF WORD

/  UNUSED. CHAR IS DELEVERD TO US IN AC. INIT PUTSW BY DAC'ING CONTENTS

/  OF PUTIN INTO IT. ROUTINE COUNTS THE OUTPUT CHARS IN PUTCH

/

PUTCH	0

	AND	(377	/EIGHT BITS REMAIN

	ISZ	FIRST	/DON'T SEND A LEADING LF, PDP-11 PUTS ONE IN

	JMP	.+3	/NOT FIRST TIME, SKIP TEST

	SAD	(12	/IS IT A LINE FEED

	JMP*	PUTCH	/YUP, DO NOTHING

	ISZ	LBF	/COUNT AN OUTPUT CHAR

	JMP*	PUTSW	/GO DO FIRST OR SECOND CHAR

PUTSW	0		/INIT'ED AS PUT1. FILLED LATER BY JMS PUTSW

	JMP*	PUTCH	/DONE, RETURN

/

PUTIN	PUT1		/START AT FIRST CHAR

/

PUTQ	JMS	PUTSW	/LEAVE POINTER FOR FIRST AFTER SECOND

PUT1	DAC*	PUTP	/FIRST CHARACTER ACTION, PLACE RIGHT JUSTIFIED

	JMS	PUTSW	/LEAVING POINTER FOR SECOND

/

PUT2	CLL!SWHA	/PUT CHAR IN RIGHT PLACE

	RAR

	XOR*	PUTP	/PUT HALVES TOGETHER

	DAC*	PUTP	/BOTH IN BUFFER

	ISZ	PUTP	/MOVE POINTER

	LAC	PUTP	/OUT OF BUFFER CHECK IF POINTER POINTS TO SELF

	SAD	(PUTP

	JMP	UCLP04	/OUT OF SPACE!

	JMP	PUTQ	/GO TELL PUTSW  THAT PUT1 IS NEX5T

/

/  RESETL 

/

/    THIS ROUTINE RESETS THE POINTERS TO THE BEGINNING OF  A LINE

/

RESETL	0

	LAW	-10	/8 SPACES PER TAB

	DAC	TABC	/THE PDP-11 DOESN'T KNOW ABOUT TABS

	DZM	BLANKC	/ZERO COUNT OF CONSECUTIVE BLANKS

	LAC	LINLIM	/NUMBER OF CHARACTERS PER LINE

	DAC	MAXC

	JMP*	RESETL

/

/

FIRST	0		/INIT TO -1 TO SHOW FIRST CHAR.

LINLIM	-LINLEN		/COUNTER FOR MAX CHAR'S PER LINE

MAXC	0		/DO ISZ ON LINLIM COUNT HERE

TCHAR	0		/TEMPORARY FOR HOLDING CHAR

BLANKC	0		/COUNT OF CONSECUTIVE BLANKS

TABC	0		/MODULO 8 COUNT WHERE NEXT TAB GOES

STLA	0		/REMEMBER WHO IS DOING PRINT

/			/ASCII SKIPS, IMAGE DOESN'T

/

/

/  TCB FOR SENDING BUFFER TO PDP-11

/

TCB	APISLT*400+APILVL	/TELL PDP-11 WHERE TO SEND INTERRUPT

	DEVCOD			/PIREX DEVICE CODE

EV11	0			/EVENT VARAIBLE FROM PIREX

STADD	0

	LBF			/PERMANENT BUFFER ADDR

LPIOT	0			/NOT USED

STATUS	0			/NOT USED

/

/  TCB FOR STOP I/O TO LINE PRINTER DRIVER 

/

/

TCBK	0

	DEVCODE&177*400+200

EV11K	0

/

/  POINTERS TO TCB'S

/

TCBP	TCB

TCBKP	TCBK

/

/  LOCATIONS FOR UC15 VERSION

/

LPDON	0		/1 WHEN OPERATIONS FINISHED, OTHERWISE 0

POST	0		/1 WHEN WAITING FOR INTERRUPT, OTHERWISE 0

/

/

/

LPIU	0		/SUBROUTINE TO SEND TO PDP-11

	DZM	EV11	/CLEAR RETURN VARIABLE

	DZM	EV11K	/AND THE OTHER ONE, IN CASE IT USED

	SIOA		/SKIP IF PDP-11 CAN TAKE IT

	JMP	.-1	/NOPE

	LIOR		/AC POINTS TO INSTRUCTION LIST

	JMP*	LPIU	/THAT'S ALL

/

CLEAR	0		/CLEAR POST,LPDON,PIREX

	DZM	POST

	DZM	LPDON

	LAC	TCBKP	/TELL PIREX TO CLEAR

	JMS	LPIU	/PIREX REQ SENDER

	CAL	WFCLER	/WAIT FOR PIREX COMPLETION

	JMP*	CLEAR

/

/

WFCLER	20		/WAIT FOR PIREX TO SET EV FOR CLEAR DEVICE

	EV11K

/

/

	.ENDC

ERR30	LAW	-30

/

/  COMMON TERMINATION OF NON-PRINTING REQUESTS

/

SEV	JMS	SEVRN	/SET EVENT VARIABLE, DECALRE SIGNIFICANT

	JMP	PQ	/EVENT, RETURN NODE, PICK NEXT REQ.

/

/

/  SECTION FOR PDP-15 PRINTERS

/

	.IFUND	UC15

/

/

/ LINE FEED & PRINT SINGLE LINE

/
LFPSL	LAC	MI	/SET MODE INDICATOR IN HEADER (UNPACKING
	DAC	LBF+0	/HARDWARE IGNORES HIGH ORDER HEADER HALFWORD

			/WHEN PRINTING IN SINGLE LINE MODE).

/

	LAC	(LFL)	/PRINT LINEFEED LINE

	JMS	PRNT

	LPP1

/
LFJ	LAC	(LBF)	/(034)PRINT REQUESTED LINE

	JMS	PRNT

	LPP1

/

	JMP	PQ	/PICK NEXT REQUEST

/

LFL	002003	/LINEFEED LINE

	000000

	000012

/

/ PRINT TWO LINES

/

PTL	LAC	(002002)/ALTER HEADER TO INDICATE TWO 

	DAC	LBF+0	/ASCII "LINES".

/

	LAC	(LBF)	/PRINT BOTH "LINES"

	JMS	PRNT

	LPPM

/

	JMP	PQ	/PICK NEXT REQUEST

/

/

/

/ PRNT -- SUBROUTINE TO PRINT A LINE.  THE LINE BUFFER ADDRESS IS

/ IN AC, AND THE IOT TO PRINT IS IN THE LOCATION FOLLOWING THE JMS.

/

PRNT	0

	DZM	PRNTEF	/CLEAR ERROR FLAG

	AAC	-1	/DETERMINE & SAVE CURRENT ADDRESS

	DAC	CABF

PRNT1	DAC*	(CAA)	/SET CURRENT ADDRESS

	DZM*	(WCA)	/PREVENT WORD COUNT OVERFLOW

	XCT*	PRNT	/EXECUTE PRINT IOT, CLEAR EVENT VARIABLE,

	DZM	EV	/ENABLE LP INTERRUPT, AND WAIT FOR THE EVENT

	LPEI		/VARIABLE TO BE SET NON-ZERO BY THE INTERRUPT

	JMS	WFAB	/SERVICE ROUTINE.

/

	LAC	EV	/INTERRUPT HAS OCCURRED -- EXAMINE PRINTER STATUS.

	AND	(200000)	/ALARM ERR OR LP OFF LINE?

	SNA

	JMP	PRNTXT	/NO -- EXIT PRNT SUBROUTINE

	LAC	PRNTEF	/NEW ERROR?

	SZA

	JMP	PRNT2	/NO -- DELAY AND RETRY

	CAL	TEMCPB	/YES -- TYPE ERR MESSAGE

	JMS	WFAB

	CLA!IAC

	DAC	PRNTEF

/

PRNT2	CAL	MTCPB	/DELAY

	JMS	WFAB

	LAC	CABF	/RETRY

	JMP	PRNT1

/

PRNTXT	ISZ	PRNT	/EXIT PRNT SUBROUTINE

	JMP*	PRNT

/

PRNTEF	0

/

/

/ WFAB -- SUBROUTINE TO WAIT FOR EVENT VARIABLE TO BE SET AND THEN TO

/ CHECK THE TRIGGER EVENT VARIABLE TO SEE IF AN ABORT REQUEST SHOULD

/ BE PROCESSED.

/

WFAB	0

	CAL	WFECPB	/WAITFOR EV TO BE SET.

	LAC	TG	/IS BIT 2 OF THE TRIGGER SET?

	RTL

	SMA

	JMP*	WFAB	/NO -- RETURN

/

/ DE-QUEUE THE ABORT REQUEST.

/

	DZM	TG

	LAC	PDVNA	/PHYSICAL DEVICE NODE ADR

	DAC*	(R1)

	JMS*	(DQRQ)	/(R1, R2, R4, R5, XR & AC ARE ALTERED).

			/WAS A REQUEST FOUND?

	JMP*	WFAB	/NO -- SHOULD NEVER RETURN HERE.

	DAC	RN	/YES -- SAVE NODE ADR

	DAC*	(R2)

	LAC	PDVNA	/PHYSICAL DEVICE NODE ADR

	DAC*	(R1)

	JMS*	(DMTQ)	/DETACH LUN & DEVICE, IF NECESSARY, AND THEN

			/EMPTY THE REQUEST QUEUE OF ALL I/O REQUESTS

			/MADE BY THE TASK BEING ABORTED. (R1, R2, R3,

			/R5, R6, X10, X11, X12, XR & AC ARE ALTERED).

	JMS	SEVRN	/SET REQUESTER'S ('IORD'S') EV, DECRE-

			/MENT THE I/O PENDING COUNT, AND RETURN NODE TO POOL.

	JMP*	WFAB

/

	.ENDC

/

/ SEVRN -- SUBROUTINE TO SET THE REQUESTOR'S EVENT VARIABLE TO

/ THE QUANTITY IN AC, DECLARE A SIGNIFICANT EVENT, DECREMENT I/O

/ TRANSFERS PENDING COUNT (NORMAL MODE), AND RETURN REQUEST NODE

/ TO THE POOL.

/

SEVRN	0

	PAL		/SAVE EV VALUE

	LAC	RN	/REQUEST NODE ADR

	TAD	XADJ

	PAX

	LAC	6,X	/REQUESTER'S EV

	SNA

	JMP	NOSET	/NONE SPECIFIED

	TAD	XADJ

	PAX

	PLA

	DAC	0,X	/SET EV

/

NOSET	LAC	RN	/DECLARE I/O REQUEST COMPLETED (DECREMENT

	DAC*	(R2)	/TRANSFERS PENDING COUNT).

	JMS*	(IOCD)	/(R5, XR, & AC ARE ALTERED)

/

	LAC	(401000)/DECLARE A SIGNIFICANT EVENT

	ISA

/

	LAC	(POOL)	/RETURN REQUEST NODE TO POOL

	DAC*	(R1)

			/(R2 IS ALREADY SETUP)

	JMS*	(NADD)

/

	JMP*	SEVRN	/EXIT 'SEVRN' SUBROUTINE

/

/ EXIT REQUEST (FROM TASK "...REA")

/

DAEX	LAC	(POOL)	/RETURN REQUEST NODE TO POOL

	DAC*	(R1)

	LAC	RN

	DAC*	(R2)

	JMS*	(NADD)

/

/  PDP15 TURN OFF LINE PRINTER

/

	.IFUND UC15

	LPDI		/DISABLE LP INTERRUPTS

	CAL	DCPB	/DISSCCCONNECT

	.ENDC

/

/  PDP-11 TURN OFF LINE PRINTER

/

	.IFDEF UC15

/

	JMS	CLEAR	/CLEAR OUT DEVICE IN PIREX

	ISZ	CCPB	/MAKE CONNECT A DISCONNECT

	CAL	CCPB	/AND DISCONNECT

/

	.ENDC

/

/

	ISZ	PDVTA	/CLEAR ASSIGN INHIBIT FLAG IN PDVL NODE

	.INH

	DZM*	PDVTA

	.ENB

	CAL	(10)	/EXIT

/

/ INTERRUPT SERVICE ROUTINE

/
INT	0		/INTERRUPT ENTRY POINT

	DBA		/ENTER INDEX (PAGE) MODE

	DAC	ACBF	/SAVE AC

/

/  PDP-15 LINE PRINTER INTERRUPT SECTION

/

	.IFUND UC15

	LPRS		/READ STATUS AND SET IN EVENT VARIABLE

	DAC	EV

	LPCS		/CLEAR STATUS, ERR FLAG, & DONE FLAG

	LPCD

/

	.ENDC

/

/  PDP-11 LINE PRINTER INTERRUPT SECTION

/

	.IFDEF UC15

/

	CAPI		/CLEAR OUT FLAG SET BY PIREX

	LAC	POST	/WANTED OR NOT

	SNA		/SKIP IF YES

	JMP	INT11	/NOT WANTED, JUST GET OUT
	ISZ	TG	/(035) PREVENT LOSS OF ABORT !
	DAC	LPDON
/
	.ENDC

/

	LAC	(401000)/DECLARE A SIGNIFICANT EVENT

	ISA

INT11	LAC	ACBF	/RESTORE AC

	DBR		/RETURN TO INTERRUPTED PROGRAM

	JMP*	INT

/

XADJ	0	/XR ADJUST CONSTANT TO SUBTRACT PAGE BITS

ACBF	0	/AC BUFFER

CABF	0	/INITIAL CURRENT ADDRESS BUFFER

EV	0	/EVENT VARIABLE

MI	0	/MODE INDICATOR

RN	0	/ADDRESS OF REQUEST NODE PICKED FROM QUEUE

TG	0	/TRIGGER EVENT VARIABLE

/

PDVNA	0	/PHYSICAL DEVICE NODE ADDRESS

PDVTA	0	/ADDRESS OF ADR OF TRIGGER EV IN PHY DEV NODE

/

TEMP1	0

/

WFTCPB	20		/WAIT FOR TRIGGER

	TG

CCPB	11	/CONNECT CPB

	EV

	16

	INT

/

	.IFUND	UC15

/

/  LEAVE SOME OUT FOR UC15 TO SAVE SPACE

/

DCPB	12	/DISCONNECT CPB

	0

	16

	INT

/

MTCPB	13	/MARK TIME CPB

	EV

	12

	1

/

/

WFECPB	20	/WAIT FOR EVENT VARIABLE CPB

	EV

/

TEMCPB	2700	/TYPE ERR MESSAGE

	EV

	LUN

	2

	ERRMES

/

ERRMES	004002; 000000; .ASCII "*** LP NOT READY"<15>

/

	.ENDC

/

/

	.END	START
