File: PL.TK of Disk: Disks/MyPDP/m8-blue-rka1-rkb1
(Source file text) 

/PL.TK 5-DEZ-79
/
/THIS TASK SERVES AS A PLOTTERDRIVER. IT WRITES
/THE DATA IN THE DISKFILE "SPOOL.PL" ON THE SYSTEM DISK.
/INTERNAL IN THE TASK IS A SECOND TASK THAT MOVES THE DATA
/FROM THE DISKFILE TO THE PLOTTER.

/	**** NOTE ****
/THIS TASK ASSUMES THAT ALL REQUESTS ARE FOR ONE BLOCK ONLY !

/CONFIGURATION PARAMETERS:

MASSDEV="S^100+"Y&3777	/NAME OF MASS STORAGE DEVICE
DECIMAL
WIDTH1=0		/HIGH ORDER WIDTH OF PLOTTER FOR XY8E
WIDTH2=3000		/LOW ORDER (MOD. 4096) WIDTH
OCTAL
UNIT=0			/UNIT NUMBER
	*200

PLTEMP,	"P^100+"L&3777
	1000		/A FOUR PAGE TASK
LENGTH,			/FILE LENGTH
XINIT,	INIT		/POINTER TO INITIALIZATION CODE
XMAXY,	MAXY
XIO,	IO
XPLEND,	PLEND
XEND,	END
XRTV,	RTV
XBUF,	BUFFER
XWTV,	WTV
XFIN,	FINISH
XPLOTR,	PLOTR
FIRST,	0

PL,	JMP I XINIT	//GO INITIALIZE THIS TASK. OVERLAYED WITH:
/	SNA		//CLOSE CALL ?
	 JMP I XPLEND	//MAKE END OF FILE
	JMS DEFER	/GET FUNCTION WORD
	AND C70		/GET FIELD OF BUFFER
	TAD (4200+UNIT	/ASSUME ONE BLOCK TRANSFER
	DCA RTV
	ISZ X
	TAD I X
	DCA RTV+1
	JMS MONITOR
	   RESERV RETURN CONTINUE
	DCA PLSLOT
/SEE IF THERE IS ENOUGH ROOM FOR THIS
TRY,	CLA CLL		//13BIT COMPARISON AHEAD
	TAD COUNT	//NUMBER OF BLOCKS OCCUPIED
	TAD MLNGTH	//COUNT-LENGTH+1
	SNL CLA		//OK ?
	 JMP GO		//YES, PROCEED
	JMS MONITOR	//WAIT A WHILE
	   STALL
	   DGNTICK	//1 SECOND
	JMP TRY		//TRY AGAIN
/TRANSFER THE DATA TO DISK NOW:
GO,	TAD FIRST
	TAD INBLK	//THE CURRENT INPUT BLOCK#
	DCA RTV+2
	TAD XRTV
	CDTOIF
	JMS MONITOR
	   CALL
	   MASSDEV
	 JMP .-3	/LOOP ON BUSY
	DCA EVNT
	JMS MONITOR
	   WAIT
EVNT,	   0
	CLA CLL		/NO ERRORS EXPECTED
	TAD INBLK
	TAD MLNGTH	//BLOCK-LENGTH+1
	SZA		//END OF FILE ?
	 TAD LENGTH	//BLOCK+1
	DCA INBLK
	ISZ COUNT	/UPDATE COUNTER
	JMS MONITOR	/START THE WRITER
	   RUN
TCBPW,	   0		/GET TCBP OF WRITER TASK
K170,	   170		/OK, HE'S RUNNING ALREADY
	JMS MONITOR
	   SIGNAL HALT
PLSLOT,	   0

INBLK,	0
COUNT,	0
RTV,	ZBLOCK 3
/THE OUTPUT WRITER. A SEPARATE TASK CREATED BY THE INITIALIZATION
WRITER,	CDTOIF
	TAD COUNT	/ANYTHING IN FILE
	SNA CLA
	 JMP I XEND	/NOTHING TO DO
	TAD FIRST
	TAD OUTBLK
	DCA WTV+2	/ACTUAL BLOKNUMBER
	TAD XBUF
	DCA PLCAO	/BUFFER POINTER
	TAD XWTV
	JMS I XIO
	TAD M400
	DCA PLWCO	/WORD COUNT OUTPUT
PL1,	TAD I PLCAO	/GET A WORD
	SNA		/END OF FILE ?
	 JMP NEXTB	/YES
	JMS I XMAXY	/TRACK MAXIMUM Y DIRECTION
IFDEF XY8E <
	AND C77		/GET DIRECTION BITS
	DCA PLX		/STORE
	TAD I PLCAO
	BSW		/
	AND C77		/GET COUNTER
	CMA		/
	DCA PLCOUNT	/-NUMBER OF STEPS
PL2,	TAD PLX		/OUTPUT A STEP
	JMS I XPLOTR
	ISZ PLCOUNT	/DONE ?
	 JMP PL2	/NO, CYCLE >
IFDEF KLPLOT <
	 JMP NEXT	/WAS CHARACTER MODE, DONE
	AND C7		/LINK HAS PEN BIT; GET DIRECTION
	SZL		/PEN DOWN ?
	 TAD C200	/YES, SET PEN BIT
	DCA PLX
	TAD I PLCAO
	AND (3770	/GET ALL COUNT BITS
	DCA PLCOUNT	/STORE IN COUNTER
PL2,	CLL
	TAD PLCOUNT
	SNA		/END OF LINE ?
	 JMP NEXT	/QUIT
	TAD KM170
	SMA		/CAN WE DO ANOTHER FULL COUNT ?
	 DCA PLCOUNT	/YES, UPDATE COUNTER
	AND (3770	/AVOID OVERFLOW NOW
	TAD K170	/
	TAD PLX		/GET DIRECTION AND PEN
	JMS I XPLOTR	/AND OUTPUT IT
	SZL		/DID THE COUNTER OVERFLOW ?
	 JMP PL2	/NO, GO ROUND AGAIN >
NEXT,	ISZ PLCAO
K36,	0036		/PROTECT ISZ
	ISZ PLWCO	/END OF BUFFER ?
	 JMP PL1
KM170,	SKP CLA
NEXTB,	 JMS I XFIN	/CLEANUP
	ACM1
	TAD COUNT
	DCA COUNT	/UPDATE THE COUNTER
	TAD OUTBLK
	TAD MLNGTH	/BLOCK-LENGTH+1
	SZA		/END OF FILE
	 TAD LENGTH	/BLOCK+1
	DCA OUTBLK
	JMP WRITER	/PROCEED WITH NEXT BLOCK
MLNGTH,	0	/-LENGTH+1
OUTBLK,	0	/OFFSET IN FILE
PLCOUNT,0	/NUMBER OF STEPS
PLWCO,	0	/WORDCOUNT
WTV,	0
PLCAO,	0
PLX,	0

PAGE
YTCBPW,	TCBPW
XCOUNT,	COUNT
OFFSET,	200
XOTV,	OTV
XOVLAY,	OVLAY
XMOVEUP,MOVEUP
	/0

IO,	0		/ROUTINE TO PERFORM DISK IO
	JMS MONITOR
	   CALL
DEV,	   MASSDEV
	 JMP .-3	/LOOP ON BUSY
	DCA EVNT1
	JMS MONITOR
	   WAIT
EVNT1,	   0
	CLA CLL		/NO ERRORS EXPECTED
	CDTOIF
	JMP I IO

PLEND,	CDTOIF
	TAD I XCOUNT	/
	SZA CLA		/FILE EMPTY ?
	 JMP NOEND	/NO
	JMS I XMOVEUP	/MOVE PAPER OUT
	TAD M4
	TAD I YTCBPW
	DCA ZTEM1
	CDF 0
	TAD I (FHEAD
	DCA I ZTEM1
	TAD ZTEM1
	DCA I (FHEAD
	ACM1		/GIVE NULL EVENT
	JMS MONITOR
	   EXIT SWPOUT
END,	JMS MONITOR
	   RUN
	   "P^100+"L&3777
K54,	 0054		/NOP
NOEND,	ACM1
	JMS MONITOR
	   EXIT

IFDEF XY8E <
MAXY,	0
	DCA ZTEM1	/CURRENT PLOTTER WORD
	TAD ZTEM1
	AND C4		/MINUS X ? (DRUM UP)
	SZA CLA
	 JMP UP		/GOING UP
	TAD ZTEM1
	AND (10		/PLUS X ? (DRUM DOWN)
	SNA CLA
	 JMP MAXEND	/NO X-MOVE
	TAD ZTEM1
	BSW
	AND C77
	STL CMA
	TAD XMAX2	/LOW ORDER
	DCA XMAX2
	SZL		/BORROW?
	 CMA		/YES
	TAD XMAX1
	DCA XMAX1
	SNL		/BORROW AGAIN?
	 JMP MAXEND	/NO
	DCA XMAX1	/TOO FAR, RESET COUNTER
	DCA XMAX2	/FOR TOTAL EXCURSION
	JMP MAXEND
UP,	TAD ZTEM1	/COUNT FARTHEST EXCURSION IN -X DIR
	BSW
	AND C77
	CLL IAC
	TAD XMAX2
	DCA XMAX2	/LOW ORDER
	RAL
	TAD XMAX1	/ADD TO HIGH ORDER IF CARRY
	DCA XMAX1
MAXEND,	TAD ZTEM1
	JMP I MAXY
XMAX1,	0
XMAX2,	0		/ >
IFDEF KLPLOT <
MAXY,	0
	DCA ZTEM1
	KLPLOT-10+6001	/ABORT FLAG UP ?
	SKP
	 JMP I MAXY	/YES, SKIP THIS PLOTWORD
	ACM2
	TAD ZTEM1
	SNA		/PLOT MODE SETTING ?
	 JMP PLOTM	/YES
	IAC
	SNA CLA		/ASCII MODE SETTING ?
	 JMP ASCIIM	/YES
	TAD MODE
	SZA CLA		/PLOT MODE ?
	 JMP PLTCHR	/NO, CHARACTER MODE
	AC0003
	AND ZTEM1
	SNA CLA		/PURE X ?
	 JMP MAXEND	/YES, DONE
	TAD ZTEM1
	AND (3774	/EXTRACT COUNTER AND Y-SIGN
	CLL RTR
	RAR		/NOW COUNTER IN 4-11, Y-SIGN IN LINK
	SZL		/GOING UP ?
	 JMP DWN	/NO
	TAD YMAX
	DCA YMAX
	JMP MAXEND	/ADDED STEP TO MAX Y POSITION
DWN,	STL CIA
	TAD YMAX
	SZL
	 CLA
	DCA YMAX
MAXEND,	AC4000		/MOVE PEN BIT TO LINK
	TAD ZTEM1	/
	ISZ MAXY	/SKIP RETURN
	JMP I MAXY	/RETURN
ASCIIM,	ACM1
PLOTM,	DCA MODE	/SET MODE FLAG
PLTCHR,	TAD ZTEM1
	TAD (-12
	AND C177
	SZA CLA		/LINEFEED ?
	 JMP PLTCH1	/NO
	TAD K54
	STL CIA
	TAD YMAX
	SZL
	 CLA
	DCA YMAX
PLTCH1,	TAD ZTEM1	/NOW PRINT THE CHARACTER
	JMS PLOTR	/OUTPUT THE CHARACTER
	JMP I MAXY	/AND TAKE NON-SKIP RETURN
YMAX,	0
MODE,	0		/ >

FINISH,	0		/MOVE PEN TO NEXT PICTURE
	CDTOIF		/READ OVERLAY IN THE BUFFER
	TAD ("S^100+"Y&3777
	DCA DEV		/READ OVERLAY FROM SYS !
	TAD XOTV	/
	JMS IO
	TAD (MASSDEV
	DCA DEV	/RESTORE DEVICE FOR SPOOL.PL
	TAD OFFSET	/
	JMS I XOVLAY	/
	JMP I FINISH	/DONE
PLOTR,	0		/OUPUT ROUTINE; MUST PRESERVE THE LINK !
	DCA EVNT1	/SAVE PLOTWORD
IFDEF KLPLOT <CLA IAC	/SET INTERRUPT ENABLE
	KLPLOT-10+6005	/KIE >
IFDEF XY8E <XY8E+6007	/SET INTERRUPT ENABLE >
	TAD M10		/TIMEOUT
	JMS MONITOR
	   WAIT
	   PLOT
	CLA
	TAD EVNT1	/GET PLOTWORD
IFDEF KLPLOT<KLPLOT+6006>
IFDEF XY8E <
	AND (3	/TEST FOR PENUPDOWN
	SZA
	JMP PENUD
	TAD EVNT1
	XY8E+6006 >
PENUEX,	CLA
	JMP I PLOTR
IFDEF XY8E <
PENUD,	RAR
	CLA
	RTL
	TAD (XY8E+6003
	DCA .+1
	HLT
	JMP PENUEX >

OTV,	ZBLOCK 3

PAGE
BUFFER,
ZPLOTR,	PLOTR
IFDEF KLPLOT <
ZYMAX,	YMAX
ZMODE,	MODE >
IFDEF XY8E <
ZXMAX1,	XMAX1
ZXMAX2,	XMAX2 >
	0

OVLAY,	.
	TAD M200	/CORRECTION
	DCA ZTEM1	/RELOCATION DISTANCE
OVL1,	TAD .&7600
	SNA		/END OF POINTERS ?
	 JMP OVL3
	TAD ZTEM1
OVL2,	DCA .&7600
	ISZ OVL1
	ISZ OVL2
	JMP OVL1
OVL3,
IFDEF XY8E <
	AC0002
	JMS I ZPLOTR	/ONE FINAL PENUP
	TAD (10		/SET TO DRUM DOWN (+X)
	DCA SLWCOM
	TAD I ZXMAX2
	CMA		/COMPLEMENT LOW ORDER
	DCA I ZXMAX2	/NUMBER OF STEPS TO GO IN X
	TAD I ZXMAX1
	CMA
	DCA I ZXMAX1	/HOW MANY TIMES AROUD?
	JMS SLEW	/GO SLEW TO NEXT PICTURE
	TAD (40		/SET NOW FOR PEN RIGHT (-Y)
	DCA SLWCOM
	TAD (-WIDTH2-1	/SET TO MAX WIDTH
	DCA I ZXMAX2
	TAD (-WIDTH1-1
	DCA I ZXMAX1
	JMS SLEW	/GO TO EDGE OF PLOTTER
	JMP I OVLAY

SLEW,	0
XLOP,	ISZ I ZXMAX2
	JMP LOWINC	/ONE STEP LOW ORDER
	ISZ I ZXMAX1	/LOW ORDER AGAIN?
	JMP XLOP	/YES
	JMP I SLEW
LOWINC,	TAD SLWCOM	/EITHER +X OR -Y
	JMS I ZPLOTR
	JMP XLOP
SLWCOM,	0		/ >
IFDEF KLPLOT <
	TAD I ZYMAX
	RAR
	RTR
	AND (777
	CMA
	DCA I ZYMAX
	AC0002
	JMS I ZPLOTR	/SET PLOT MODE
	TAD (106	/PEN UP, 10 STEPS -Y
	JMS I ZPLOTR
	ISZ I ZYMAX	/DONE ?
	 JMP .-3	/CYCLE
	TAD (TAD STRNG
	JMS STRING
	KLPLOT-10+6001	/ABORT FLAG UP ?
	 TAD (STRNG1-STRNG2
	TAD (TAD STRNG2
	JMS STRING
	ACM1
	DCA I ZMODE	/SET TO CHAR MODE
	KLPLOT-10+6002	/CLEAR ABORT FLAG
	JMP I OVLAY

MOVEUP,	0
	TAD (TAD STRNG3
	JMS STRING
	JMP I MOVEUP

STRING,	0
	DCA TADI
TADI,	TAD STRNG
	SNA
	 JMP I STRING
	JMS I ZPLOTR
	ISZ TADI
	JMP TADI
STRNG,	1;17;215;4;212;"[;0
STRNG1,	"E;"N;"D;" 
	"O;"F;" ;"P;"I;"C;"T;"U;"R;"E;"];215;212;0
STRNG2,	"P;"I;"C;"T;"U;"R;"E;" ;"A;"B;"O;"R;"T;"E;"D;"];215;212;0
STRNG3,	5;212;4;212;0	/ >

IFDEF XY8E <
MOVEUP,	0		/SUBROUTINE TO POSITION THE PAPER
	JMP I MOVEUP	/(TO BE SUPPLIED) >

PAGE
QPLOTR,	PLOTR
XFILE,	FILE
XTCBPW,	TCBPW		/ARGUMENT IN RUN-REQUEST
XWRITER,WRITER		/START ADDRESS OF WRITER TASK
XFIRST,	FIRST
XLENGTH,LENGTH
XMLNGTH,MLNGTH
XPL,	PL
YWTV,	WTV
YBUF,	BUFFER
YOTV,	OTV
YOTV1,	OTV+1
YOTV2,	OTV+2
	0

INIT,	SNA		//CLOSE ?
	 JMP CLOSE	//QUIT
	DCA INIT	//SAVE POINTER TO REQUEST
	TAD I ZMYCDF
	DCA PLCDF	//SAVE FIELD OF REQUEST
	CDTOIF
	TAD XFILE	/POINTER TO FILE LOOKUP REQUEST BLOCK
	JMS MONITOR
	   CALL
	   "D^100+"I&3777
	 JMP .-3
	SZA CLA
	 JMP ERROR	/*** SPOOL.PL NOT FOUND ***
	TAD FILE+2
	CIA
	DCA I XLENGTH	/LENGTH OF SPOOLFILE
	TAD FILE+2
	IAC
	DCA I XMLNGTH	/-LENGTH+1
	TAD FILE+4
	DCA I XFIRST	/STARTBLOCK OF SPOOLFILE
INIT1,	CDF 0
	TAD I (FHEAD
	SNA
	 JMP WAITS	/NO BLOCKLET AVAILABLE
	JMS DEFER
	DCA I (FHEAD
	ACM1
	TAD X
	DCA AUTO10
	DCA I AUTO10	/ZERO BACKLINK
	DCA I AUTO10	/ZERO THREAD
	TAD XWRITER
	DCA I AUTO10	/START ADDRESS
	DCA I AUTO10	/ZERO BLOCKNUMBER
	RIF
	DCA I AUTO10	/INSTRUCTION FIELD
	TAD AUTO10
	CDTOIF
	DCA I XTCBPW	/TCBP OF WRITER TASK
	TAD (200+UNIT
	RIF
	DCA I YWTV	/SETUP FUNCTION WORD
	TAD I YWTV
	DCA I YOTV
	TAD YBUF
	DCA I YOTV1
	CDF 0
	ACM1
	TAD I (CURTSK
	JMS DEFER
	CDTOIF
	IAC
	DCA I YOTV2	/BLOCK # OF OVERLAY
IFDEF XY8E <6503
	6507	/ >
IFDEF KLPLOT <
	KLPLOT-10+6002	/CLEAR ABORT FLAG
	AC0002		/PLOTMODE
	JMS I QPLOTR
	TAD (173	/MOVE BACK TO END OF PREVIOUS PICTURE
	JMS I QPLOTR
	ISZ (-20
	 JMP .-3
	AC0001		/SEND ASCII-MODE
	JMS I QPLOTR
	TAD (17		/SEND NORMAL (-NON-JAPANESE) MODE
	JMS I QPLOTR
	TAD C215
	JMS I QPLOTR
	CLA		/ >
	TAD (SNA
	DCA I XPL	/PATCH FIRST INSTRUCTION OF TASK
	TAD INIT
PLCDF,	HLT
	JMP I XPL	//START THE TASK

WAITS,	JMS MONITOR
	   STALL
	   DGNTICK
	CLA CLL
	JMP INIT1
ERROR,	TAD (-HRDERR-1
	JMS MONITOR
	   EXIT RELEASE	/A CLOSE WILL FOLLOW

CLOSE,	ACM1		/OK EVENT
	JMS MONITOR
	   EXIT SWPOUT

FILE,	MASSDEV		/NAME OF DEVICE HANDLER
	UNIT		/UNIT NUMBER
	FILENAME SPOOL.PL /FILENAME

$