.SYSID <	.TITLE XYU >,< 036>

/

/COPYRIGHT (C) 1975

/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 #029 11/6/73 S. ROOT  MAKE BUFFER AND TCB IN DOS

/  EDIT #030 1/1/74 P. B. PALETHORPE CONDITIONALIZE CODE FOR XY11/XY311

/                                   PLOTTER INTERFACE

/  EDIT #031	2/23/74	SCR	FIX FOR XY311 CHARSETUP KILLING PEN SETTING

/ EDIT #032	6/13/74	SCR	1. DISABLE XTRA .INIT'S FROM FORTRAN

/				2 ALLOW ZERO LENGTH LINE FOR POINTS

/ EDIT #033	9/8/75	SCR	COPYRIGHT;2^14;MULTI-LINE;BUG;XVM

/ EDIT #034	9/9/75	SCR	EXPERIMENT WITH CHAR. SPACING

/ EDIT #035	9/10/75	SCR	REDO #33 ON LONG LINES
/ EDIT #036	9/29/75	SCR	IOPS12 IF UC15 GONE

/

APISLT=65		/API VECTOR

	.IFUND	APILVL	/(#33)GREATER FLXIBILITY

APILVL=3		/API LEVEL, AND DEFINE SKIP AND CLEAR

	.ENDC

XYSF=APILVL*20+706101	/SKIP ON INTERRUPT

SIOA=706001	/SKIP IF PDP-11 CAN TAKE A REQUEST

LIOR=706006	/SEND TCB ADDR IN AC TO PDP-11

CAPI=APILVL*20+706104	/CLEAR INTERRUPTING FLAG

/

/

/CONDITIONAL ASSEMBLY PARAMETERS

/

/THESE ARE USED TO GENERATE THE PEN SELECTION CODE FOR THE

/XY311 INTERFACE AND TO GENERATE THE DEFAULT CHARACTER SIZES

/SHOWN IN THE TABLE BELOW IN TENTHS OF AN INCH AOR IN MM.

/

/		XY11	XY311

/	1/10

/      INCHES	2	1.25

/

/	MM	5	3

/

/

/PL311 DEFINED GENERATES CODE FOR THE XY311 INTERFACE

/PL311 UNDEFINED GENERATES CODE FOR THE XY11 INTERFACE

/UNITS DEFINED GENERATES CODE BASED ON METRIC UNITS

/UNITS UNDEFINED GENERATES CODE BASED ON ENGLISH UNITS

/SPACE DEFINED (EXPERIMENTAL ONLY!!) INCREASES INTER-CHAR.

/	SPACING. (ALSO DEFINE $SPACE IN PIREX.)

/

/

/

/WE USE THESE PARAMETERS TO DETERMINE DEFAULT CHARACTER SIZE 

/

	.DEC

	.IFDEF	PL311

	.IFDEF	UNITS

DFLCHR=100/5*3		/3 MM. IN .05 MM. STEPS

	.ENDC

	.IFUND	UNITS
DFLCHR=1000/2*1/8	/0.125 INCHES IN .002 STEPS

	.ENDC

	.ENDC

	.IFUND	PL311

	.IFDEF	UNITS

DFLCHR=100/25*5		/5 MM. IN 0.25 MM. STEPS

	.ENDC

	.IFUND	UNITS

DFLCHR=1000/10*2/10	/0.2 INCHES IN 0.01 INCH STEPS

	.ENDC

	.ENDC

	.OCT

/

/

/

/

	.IFUND NOSPL

DEVCOD=6		/CODE FOR XY DRIVER IN PIREX

	.ENDC

	.IFDEF NOSPL

DEVCOD=206		/SAME DRIVER, BUT PREVENT SPOOLING

	.ENDC

/

.SCOM=100

EXERRS=.SCOM+37

XYPPB=12		/10 XY PAIRS PER BUFFER TO PDP11

/

	.DEC

REC10=104858		/2^20 DIVIDED BY 10 FOR UNIT GRID COMPUTATION

	.OCT

/

	.GLOBL	XYA.

/

/

	.EJECT

/

/

/

XYA.	DAC	CALP	/SAVE CAL ADDR

	IAC

	DAC	ARGP	/AND ARGUMENT POINTER

	LACQ		/DOS ASSUMPTION? CAN WE ZAP MQ AT CAL LEVEL??

	DAC	SAVMQ	/LET US ASSUME NOT!

NEW	JMP	INITIT	/INTIALIZE TCB AND BUFFER AND POINTERS

/			/THE VERY FIRST TIME THRU

	LAC*	ARGP	/SET UP DISPATCH TO REQUEST TYPE

	ISZ	ARGP	/MOVE POINTER TO PARAMETERS

	AND	(77

	TAD	(JMP TABL

	DAC	TABL

TABL	HLT		/PLACE DISPATCH HERE

	JMP	INIT	/1=INIT

	JMP	FSTAT	/2=FSTAT,RENAM, DLETE

	JMP	IOPS6	/3=SEEK, ILLEGAL

	JMP	ENTER	/4=ENTER

	JMP	CLEAR	/5=CLEAR

	JMP	CLOSE	/6=CLOSE

	JMP	IOPS6	/7=MTAPE ILLEGAL

	JMP	READ	/10=READ, OBTAINS STATUS INFO

	JMP	WRITE	/11=WRITE

	JMP	WAIT	/12=WAIT OR WAITR

IOPS6	LAW	6

IOPSER	DAC	ERRCOD

	LAC	ERRCOD

	JMS*	(EXERRS	/MONITOR ERROR ROUTINE

	JMP	.-2	/REDO

	LAW	-1

	.SIXBT	'XYA'

ERRCOD	-1

IOPS27	LAW	27

	JMP	IOPSER

IOPS25	LAW	25

	JMP	IOPSER

IOPS7	LAW	7

	JMP	IOPSER
IOPS12	LAW	12	/(SCR-36)UC15 GONE
	JMP	IOPSER	/(SCR-36)FATAL ERROR
IOPS55	LAW	55	/(SCR-36)NO TCB AREA
	JMP	IOPSER	/(SCR-36)
IOPS67	LAW	67	/(#33)>32K ERROR
	JMP	IOPSER	/(#33)

/

	.TITLE	.INIT

INIT	ISZ	ARGP	/MOVE TO BUFFER SIZE

	LAC	INITFX	/IGNORE THIS INIT?

	SZA

	JMP	EXITAP	/YUP

	LAC	(400	/(#33)LARGE IN CASE MULTI-LINE

	DAC	INITFL	/REMEMBER THAT  WE'RE AN INIT!

	DAC*	ARGP	/ONLY PROCESS 132 CHAR.'S

	JMS	XYIOCK	/WAIT IF PDP-11 XY IS BUSY

	DZM	UPDWN	/START PEN UP

	DZM	LASTX	/ZERO STORED X POSITION

	DZM	LASTY	/AND Y

	JMS	RESETL	/RESET LINE BUFFER COUNTER, POINTER

	LAC	(DFLCHR	/STANDARD CHARACTER SIZE

	DAC	XSZ	/SAVE AS DEFAULT

	DAC	YSZ

	DZM	SINX	/'INTEGER SINE FOR HORIZONTAL

	LAC	(200000	/ 200000*COS(0)

	DAC	COSX

	JMP	INNDCH	/FINISH UP IN COMMON WITH CHARST

/

	.TITLE	.WAIT OR .WAITR

/

WAIT	LAC*	CALP	/FIND OUT WHICH

	AND	(1000

	SZA		/SKIP ON REGULAR

	JMP	WAITR

	JMS	XYIOCK	/SIMPLY HANG TIL READY

	JMP	EXITAP+1

WAITR	LAC*	ARGP	/(#33) CHECK >32K

	AND	(700000	/(#33)

	SZA		/(#33) SKIP IF NOT

	JMP	IOPS67	/(#33) WAS, COMPLAIN

	LAC*	ARGP	/(#33) ADDR OF ARGP, BITS OF CALP!

	XOR	CALP	/(#33)

	AND	(700000	/(#33)SORRY ABOUT THIS; IT REALLY WORKS

	XOR*	ARGP	/(#33)

	DAC	CALP	/(#33) GO HERE ON BUSY!

	LAC	XYEV	/CHECK IF UNIT BUSY. CAN'T USE XYIOCK

/			/BECUASE WE NEVERWANT TO COME BACK HERE

	SNA!SPA		/>0 IS NOT BUSY. 0 IS BUSY. - IS ERROR

	JMP	EXITCP	/BUSY, EXIT THRU ADDR. STORED IN CALP

	JMP	EXITAP	/NOT BUSY , CONTINUE

/

	.TITLE	.WRITE

/

/  WARNING, ONLY 1 X-Y LINE PAIR AT A TIME CAN BE WRITTEN

/  IN THE BUFFER TO THE HANDLER!

/

/

WRITE	JMS	XYIOCK	/UNIT BUSY?

	LAC*	ARGP	/ADDR OF BUFFER

	DAC	INITFX	/FORBID ANY INIT'S!!!!!!!

	AAC	2	/ADDR OF DATA

	DAC	LBUF

	AND	(700000	/(#33) CHECK IF >32K

	SZA		/(#33) SKIP IF NOT

	JMP	IOPS67	/(#33) WAS, ERROR OUT

	LAC*	CALP	/MODE FROM LEFT HALF

	SWHA

	AND	(17	/BINARY OR ASCII. BINARY IS X-Y PAIR

/			/ASCI IS TEXT STRING

	SAD	(2	/IOPS ASCII

	JMP	CHARI	/YES, GO DO CHAR'S

	SZA		/SKIP IF IOPS BINARY

	JMP	IOPS7	/NEITHER, ILLEGAL MODE

	LAC*	LBUF	/FIRST WORD

	SAD	OTSJNK	/400000 IS OTS JUNK

	ISZ	LBUF	/MOVE POINTER TO REAL THING

	LAC*	LBUF	/NOW GET RIGHT THING IN AC

	DAC	CODE	/SAVE TYPE (0-12/13 OCTAL) OF WRITE

	ISZ	LBUF	/MOVE POINTER TO NEXT ITEM FOR ALL

	SPA		/CHECK TYPE LIMITS

	JMP	IOPS27	/ILLEGAL TYPE

	.IFUND	PL311

	AAC	-13

	.ENDC

	.IFDEF	PL311

	AAC	-14	/PEN SELECT CODE IS POSSIBLE

	.ENDC

	SMA

	JMP	IOPS27

	.IFUND	PL311

	AAC	5	/TYPES 0-5 SET THE PEN

	.ENDC

	.IFDEF	PL311

	AAC	6	/TYPES 0-5 SET THE PEN

	.ENDC

	SPA		/SKIP IF NOT

	JMS	SETPEN	/REMEMBER PEN SETTING

	LAW	-1	/SETPEN DESTROYS AC!!

	TAD	CODE	/CODE-1

	SNA!SPA!IAC	/NOW HAVE CODE, SKIP IF CODE!>1

	JMP	EXITAP-1	/TYPES 0,1 FINISHED

	SAD	(6	/CHARACTERS

	JMP	CHAR

	SAD	(7	/SET CO-ORDINATE REFERENCE COMMAND

	JMP	SET

	SAD	(12	/CHARACTER CHARACTERSITIC SETUP

	JMP	CHARST

	.IFDEF	PL311

	SAD	(13	/PEN SELECTION COMMAND

	JMP	PIKPEN

	.ENDC

/

/  NOW KNOWN TO BE A LINE (POSITION IS UNINTENSIFIED LINE)

/

/ SET UP TO DO LINE(S)

/

	LAW	17000	/(#33) GET WORD PAIR COUNT

	AND*	INITFX	/(#33) ADDR OF BUFFER HEADR

	SWHA		/(#33) RIGHT JUSTIFY COUNT

	CMA!IAC		/(#33) MAKE MINUS FOR ISZ

	AAC	2	/(#33) CORRECT FOR INFO BEFORE LINES

	DAC	COUNTC	/(#33) GRAB THIS LOC AS COUNTER

LINEL	LAC*	LBUF	/(#33) GRAB AN X

	DAC	IX

	ISZ	LBUF

	LAC*	LBUF

	DAC	IY

	ISZ	LBUF	/(#33) BUMP IN CASE MORE LINES

/NOW TYPES 2,3,10 ARE ABSOLUTE INPUT, 4,5,11 RELATIVE

/WE NEED TO CALCULATE DX TO SEND TP PDP-11, ABS TO SAVE POSITION HERE

/

	LAC	CODE	/GET BACK WHICH KIND

	RTR		/PUT TWO BIT IN LINK

	SZL!RTL		/REMAKE CODE, SKIP IF NOT 2 OR 3

	JMP	ABSOL	/2 OR 3, GO DO ABSOLUTE

	SAD	(10	/OR IS IT 10

	JMP	ABSOL	/ABSOLUTE THERE TOO

DELTA	LAC	IX	/GET INPUT X

	DAC	DX	/THAT IS DELTA X ALSO

	TAD	LASTX	/UPDATE 'PRESENT' POSITION

	DAC	LASTX

	LAC	IY	/SAME FOR Y

	DAC	DY

	TAD	LASTY

	DAC	LASTY

	JMP	LINCOM	/FINISH UP IN COMMON

ABSOL	LAC	LASTX	/DELTA IN THIS-LAST

	CMA!IAC

	TAD	IX

	DAC	DX

	LAC	IX	/ABS IS SIMPLY INPUT

	DAC	LASTX

	LAC	LASTY	/SAME FOR Y

	CMA!IAC

	TAD	IY

	DAC	DY

	LAC	IY

	DAC	LASTY

LINCOM	LAC	DY	/(#33) CHECK THAT THE Y INCREMENT

	JMS	VALID	/DOES NOT EXCEED 2^14-1 STEPS...

	.IFUND	PL311	/(#33) CHECK X ONLY IF NOT PL311

	LAC	DX	/AND X TOO...

	JMS	VALID	/

	.ENDC		/(#33)

	.IFDEF	PL311	/(#33) ALLOW LONG X'S

	LAC	DX	/(#33) IF <2^14, DO NOTHING

	SPA		/(#33)

	CMA!IAC		/(#33)

	AND	(740000	/(#33)

	SNA!CLA!CMA	/(#33) SKIP IF SOMETHING TO DO

	JMP	LINEP	/(#33) NO, GO PLACE LINE

	DAC	SIGN1	/(#35) INIT REMAINDER CALC

	LAC	DX	/(#35) SET UP TO SUBDIVIDE LINE

	DAC	XSH	/(#35)

	DZM	XSL	/(#35) INIT REMAINDER TO 0

	LAC	DY	/(#35) SAME FOR Y

	DAC	YSH	/(#35)

	DZM	YSL	/(#35)

/

E351	LAC	(XSH	/(#35) SET UP POINTER TO X,,Y

	DAC	POINT1	/(#35)

	JMS	DBY2	/(#35) DIVIDE DX BY TWO

	JMS	DBY2	/(#35) AND DY

	LAC	SIGN1	/(#35) UPDATE REMAINDER SIZE

	CLL!RAL		/(#35)

	DAC	SIGN1	/(#35) WHICH IS KEPT MINUS

	LAC	XSH	/(#35) SMALL ENUF YET?

	SPA		/(#35)

	CMA!IAC		/(#35)

	AND	(740000	/(#35)

	SZA		/(#35) SKIP IF DONE DIVIDING

	JMP	E351	/(#35) NOT YET

E352	LAC	XSL	/(#35) REMAINDER COUNT (-)

	IAC		/(#35) UPDATE COUNT

	DAC	XSL	/(#35) NEED IT LATER

	SMA!SZA!CLA!IAC	/(#35) MAKE AC=1 IF XSL MINUS

	CLA		/(#35) AND 0 IF CAME IN PLUS

	TAD	XSH	/(#35) DX

	DAC	DX	/(#35) FOR ADDLIN

	LAC	YSL	/(#35) SAME FOR Y

	IAC

	DAC	YSL

	SMA!SZA!CLA!IAC

	CLA

	TAD	YSH

	DAC	DY

	JMS	ADDLIN	/(#35)PLACE THE LINE

	ISZ	SIGN1	/(#35) LOOP CONTROL

	JMP	E352	/(#35)

	JMP	E353	/(#35) CHECK ANY MORE LINES IN BUFFER

	.ENDC		/(#35)

LINEP	JMS	ADDLIN	/GO PUT LINE INTO BUFFER, FORCE OUTPUT IF

/			/IF NECESSARY

E353	ISZ	COUNTC	/(#35) DONE WITH LINES

	JMP	LINEL	/(#33) NO

	JMP	EXITAP-1	/THAT'S ALL!!!

/

/

CHARST	LAC*	LBUF	/FIRST ONE

	DZM	INITFL	/SAY THAT WE'RE NOT AN INIT

	DAC	XSZ	/SAVE X SIZE OF CHAR BOX IN PEN STEPS

	ISZ	LBUF

	LAC*	LBUF	/GET Y SIZE

	DAC	YSZ

	ISZ	LBUF

	LAC*	LBUF	/SINX *200000 OF ANGLE

	DAC	SINX

	ISZ	LBUF

	LAC*	LBUF

	DAC	COSX	/SZME FOR COSINE

	ISZ	ARGP	/SO WE CAN FINISH IN COMMON WITH INIT!

	JMS	XYIOCK	/IS PLOTTER BUSY, WAIT HERE IF SO

	JMS	DOLINE	/FORCE OUT ANY LINES SITTING IN BUFFER

	JMS	XYIOCK	/AND WAIT FOR THAT IF NECESSARY

INNDCH	LAC	XSZ	/CHARST AND INIT, CALCULATE COUBLE PRECISION

	MUL		/SIZE OF SINGLE GRID STEP AT GIVEN OVERALL

/			/GRID SIZE AND ANGLE

	REC10		/THIS DIVIDES BY 10, MULT BY 4

	DAC	XSH	/SAVE IN TEMPORARY IN BUFFER

	LACQ		/GET LOW HALF

	DAC	XSL

	LAC	YSZ	/DIVIDE Y BY 10 (10UNITS GRID PER BOX)

	MUL

	REC10

	DAC	YSH

	LACQ

	DAC	YSL

/

/  NOW SET UP TO MULT DOUBLE NUMBER IN XSH-XSL AND YSHYSL PAIRS BY

/  SIN AND COS

/

	LAC	XYBUFD	/POINTER TO PLACE VECTORS FOR PDP-11

	DAC	POINTB

	LAC	(XSH	/MAKE POINTER TO DOUBLE NUMBER

	DAC	POINT2

	LAC	(COSX	/MAKE POINTER TO SINGLE NUMBER

	DAC	POINT1

	LAC	(XDXH	/MAKE POINTER TO OUR STORAGE

	DAC	POINTS

	JMS	MX1X2	/CALL ROUTINE, DOUBLE PRESISION MULTIPLY

/			/OF SINGLE NUMBER AT POINT1 TIME DOUBLE NUMBER

/			/AT POINT2. LEAVE DOUBLE ASNWER IN AC,MQ

	JMS	P11	/PLACE ANSWER IN BUFFER AND IN OUR STORAGE

/			/THIS GAVE XDXH AND XDXL

	ISZ	POINT2	/POINT2 TO YSH,YSL

	JMS	MX1X2

	JMS	P11	/NOW HAVE YDYH AND YDYL

	LAC	(SINX	/POINT SINGLE TO SIN

	DAC	POINT1

	LAC	(XSH	/POINT DOUBLE TO X PAIR

	DAC	POINT2

	JMS	MX1X2	/GET XDYH,XDYL

	JMS	P11

/

/  NOW A DIRTY, WE NEED -SIN FOR YDX

/

	LAC	SINX

	CMA!IAC

	DAC	SINX

	ISZ	POINT2	/MOVE POINTER TO Y PAIR

	JMS	MX1X2

	JMS	P11

	LAC	SINX	/RESTORE SIN

	CMA!IAC

	DAC	SINX

	LAC	(1422	/MODE 3, 22 BYTES

	DAC*	XYBUF	/AS BUFFER HEADER

	LAC	INITFL	/FLAG FOR REAL INIT

	DAC*	POINTB	/PUT ON END OF SEND TO PDP-11

	JMS	DOIO	/GO PLACE TO PDP-11

	JMP	EXITAP	/WHEW

/

/MX1X2 SUBROUTINE

/

/   CALL WITH POINTER TO SINGLE PRECISION NUMBER IN POINT1

/    CALL WITH POINTER TO DOUBLE PRECISION NUMBER IN POINT2

/  POINT2 IS INCREMENTED ONCE BY ROUTINE!!!!!!

/

/  RESULTING TRIPLE PRECISION NUMBER IS LEFT IN AC,MQ,T3

/

/  THE ROUTINE HANDLES SIGNS. IT IS ASSUMED THAT THE TOP

/  BIT OF ALL NUMBERS IS SIGN BIT, AND NUMBERS ARE IN TWO-COMPLEMENT FORM

/  NOTE, ONLY TOP BIT OF TOP WORD HAS SIGN, ALL REST DATA.

/

/ROUTINE USES TEMPORARIES T1,T2,T3,SIGN1,SIGN3

/

MX1X2	0

	LAC*	POINT1	/GET SINGLE PRECISION NUMBER

	DAC	SIGN1	/SAVE

	SPA!CLL		/MAKE ABSOLUTE FOR MUL

	CMA!IAC

	DAC	MZOT1	/PLACE IN CORE FOR MUL'S

	DAC	MZOT2

	LAC*	POINT2	/GET HIGH HALF OF DOUBLE NUMBER

	XOR	SIGN1	/FIND SIGN OF ANSWER

	SPA!CLA		/SET UP 0 IF +

	CMA		/STORE 0 OR -1

	DAC	SIGN1

	CMA!IAC

	DAC	SIGN3	/0 OR 1 TO ADD TO LOW ORDER WORD

	LAC*	POINT2	/NOW MAKE DOUBLE PLUS

	SPA!CLL!CML	/LINK ON IF NUMBER +

	CLL!CMA		/TOP HALF ONLY CMA, NO IAC!

	DAC	T1	/HOLD TOP HALF HERE

	ISZ	POINT2	/GET LOW HALF OF TOP

	LAC*	POINT2

	SNL!CLL		/SKIP IF NO NEED TO COMPLEMENT LOW HALF

	CMA!IAC		/LEAVES LINK ON IF CARRY TO UPPER HALF!

	SZL!CLL		/CHECK CARRY

	ISZ	T1	/WAS ONE

	NOP		/JUST IN CASE OF ISZ

	MUL		/MUL BY SINGLE PART

MZOT1	HLT

	DAC	T2	/SAVE PART OF LOW HALF OF ANSWER

	LACQ		/SAVE LOW PART OF LOW HALF

	DAC	T3

	LAC	T1	/NOW MULT HIGH HALF

	MUL

MZOT2	HLT

	DAC	T1	/SAVE HIGH HALF OF ANSWER

	LACQ		/PART OF LOW HALF

	CLL		/LINK ZERO TO CHECK CARRY OUT OF...

	TAD	T2	/ADD TOGHTHER OF LOW HALVES

	SZL!CLL		/NO SKIP IF CARRY

	ISZ	T1	/PICK UP CARRY

	NOP

	DAC	T2

/

/  NOW START COMPLEMENTING  THE THREE NUMBERS

/

	CLL

	LAC	T3

	XOR	SIGN1

	TAD	SIGN3

	DAC	T3

	LAC	T2

	XOR	SIGN1

	SZL!CLL

	IAC

	LMQ		/PUT LOW HALF BACK TO MQ

	LAC	T1	/GET HIGH HALF

	XOR	SIGN1	/COMPLEMENT IF NECESSARY

	SZL!CLL		/SKIP UNLESS NEED CARRY

	AAC	1	/AAC 1 NO CARRY TO LINK!!!

	JMP*	MX1X2	/THAT'S IT

/

/

/  P11DOES SCALING FOR PDP-11 16 BIT WORD, STORES ANSWER

/  IN LOCAL STORE THRU POINTER POINTS

/  AND IN BUFFER FOR PDP-11 THRU POINTER POINTB

/

/  ROUTINE MUST RECEIVE DOUBLE PRECISION NUMBER IN AC,MQ

/

P11	

	DAC*	POINTB	/SAVE TOP HALF

	DAC*	POINTS

	ISZ	POINTS

	ISZ	POINTB

	LACQ		/GET BOTTOM

	RAR		/TRUNCATE LAST TWO BITS

	CLL!RAR

	CLL

	DAC*	POINTB	/SINCE PDP-11 CAN'T SEE TOP TWO

	RTL		/MOVE UP FOR OUR USE

	DAC*	POINTS

	ISZ	POINTS

	ISZ	POINTB

	JMP*	P11

/

/

/  CHARACTER STRING PROCESSING FOR WRITE 2 AND WRITE 0 MODE 6

/

CHAR	LAC*	LBUF	/GET CHAR COUNT

	ISZ	LBUF	/MOVE TO DATA

	SNA!SPA!CMA!IAC	/MAKE - FOR ISZ. CHECK IF >1

	JMP	IOPS25	/CONTROL COUNT 0 OR -, QUIT

CHARI	DAC	COUNTX	/CONTROL COUNT FOR FORTRAN

/			/CHARI ENTERS WITH 2 IN AC!

	DZM	COUNTC	/ZERO COUNTR 

	JMS	XYIOCK	/CHECK FOR DEVICE BUSY

	JMS	DOLINE	/FORCE OUT ANY PENDING LINE OPERATIONS

	JMS	XYIOCK	/WAIT FOR THAT IF NECESSARY

	LAC	(UNPK1	/INIT UNPACKING ROUTINE

	DAC	UNPKX

	LAC	(PACK1	/INIT PACKING ROUTINE

	DAC	PKX

CHARL	JMS	UNPK	/GET A CHARACTER

	SAD	(15	/CR

	JMP	DN	/YES, QUIT

	SAD	(175	/ALT

	JMP	DN	/QUIT

	AAC	-40	/CHAR'S LESS THAT 40 IGNORED!

	SPA

	JMP	CHARC	/GO DO LOOP CONTROL

	AAC	-100	/CHAR'S 140 ARE GREATER ARE MAPPED BACK TO 100

	SMA

	AAC	-40	/MAP BACK, PRIMARILITY FOR LOWER CASE CHAR'S

	AAC	140	/RECREATE CHAR

	JMS	PACK	/GO PLACE IN OUR BUFFER AND COUNT IT

CHARC	ISZ	COUNTX	/FORTRAN, GOT THEM ALL

	JMP	CHARL	/LOOP

/

DN	LAC	COUNTC	/HOW MANY DID WE GET

	TAD	(1000	/FOR HEADER, MODE 2

	DAC*	XYBUF	/THRU OUR POINTER TO DOS BUFFER

	XOR	(1000	/RESTORE ORIG. COUNT

	MUL		/TIMES 10, WE NOW COMPUTE PEN CHANGE OF STRING

	.IFUND	SPACE	/(#34) SPCAING CHANGE ATTEMPT

	12

	.ENDC		/(#34)

	.IFDEF	SPACE	/(#34)

	14		/(#34)

	.ENDC		/(#34)

	LACQ

	DAC	COUNTC	/USE AS TEMP

	LAC	(COUNTC	/POINTER TO SINGE QUANTITY FOR MX1X2

	DAC	POINT1

	LAC	(XDXH	/POINTER TO DOUBLE

	DAC	POINT2

	JMS	MX1X2	/ANSWER IN AC,MQ

	JMS	CHP	/GET MIDDLE THIRD OF ANS, OROUNDED TO AC

	TAD	LASTX

	DAC	LASTX	/UPDATED X, NOW DO Y

	LAC	(XDYH

	DAC	POINT2

	JMS	MX1X2

	JMS	CHP

	TAD	LASTY

	DAC	LASTY

	JMS	DOIO	/PUT IT OUT

	JMS	RESETL	/RESET BUFP

	JMP	EXITAP-1

/

/

/  ROUTINE CHP GETS MIDDLE THIRD OF ANSWER FROM MX1X2

/  AND ROUNDS UP IF HIGH BIT OF LOW THIRD IS SET

/

CHP	0

	LAC	T3	/LOW THIRD OVER HIGH THIRD

	RAL		/SIGN BIT TO LINK

	LACQ		/MIDDLE THIRD

	SZL!CLL		/SKIP IF NO CORRECTION NEEDED

	AAC	1

	JMP*	CHP

/

/

/

/

/CHAR UNPACKER

/

/  CHARACTER UMPACKER GETS CHAR'S IN IOPS

/  ASCII FROM THE POINTER LBUF. EACH CHARACTER IS RETURNED

/  RIGHT JUSTIFIED IN THE AC, WITH HIGH BITS STRIPPED.

/

/  UNPX SERVES AS A POINTER TO THE CORRECT ACTION FOR THE

/  NEXT CHARACTER, THERE BEING DIFERENT ACTION FOR

/  1,2,3,4,5, THEN 6 IS SAME AS 1.

/

/  THE JMS'S IN THE CODE SET UP POINTER IN UNPX FOR THE NEXT

/  CHAR.  THE ROUTINE MUST BE INITED BEFORE FIRST CALL BY

/  PLACING THE ADDRESS UNPK1 INTO UNPX.

/

/

UNPK	0

	JMP*	.+1

UNPKX	HLT

	AND	(177

	JMP*	UNPK

UNPK1	LAC*	LBUF

	LRS	13

	JMS	UNPKX

	LAC*	LBUF

	LRS	4

	JMS	UNPKX

	LAC*	LBUF

	DAC	UNPKX

	ISZ	LBUF

	LAC*	LBUF

	LMQ

	LAC	UNPKX

	LLS	3

	JMS	UNPKX

	LAC*	LBUF

	LRS	10

	JMS	UNPKX

	LAC*	LBUF

	RAR

	JMS	UNPKX

	ISZ	LBUF

	JMP	UNPK1

/

/

/ CHAR PACKER

/

/  THE CHARACTR PACKER RECEIVES ASCII CHARACTERS RIGHT

/  JUSTIFIED IN THE AC. THE CHARACTERS ARE PLACED VIA

/  THE POINTER BUFP.  THE CHARACTERS ARE COUNTED

/  IN THE COUNTER 'COUNT'. THE PACKING FORMAT PER WORD

/  IS FIRST CHARACTER RIGHT JUSTIFIED, SECOND CHARACTER

/  IN BITS 2-9, TOP TWO BITS UNUSED. THE POINTER BUFP

/  IS USED TO CHECK ON THE TOTAL NUMBER OF CHARACTERS.

/  IN CASE OF TOO MANY (>132), THE REMAINING CHARACTERS

/  ARE THROWN AWAY, AND CONTROL GOES TO DN.

/

/  PKX IS POINTER TO NEXT ACTION, AS IN UNPK. PKX IS INITED

/ BEFORE FIRST CALL BY PLACING ADDRESS PACK1 IN TO IT.

/

/

PACK	0

	AND	(177	/STRIP (IM)POSSIBLE XTRA BITS

	ISZ	COUNTC	/COUNT PLACED CHARACTER

	JMP*	.+1

PKX	HLT

	JMP*	PACK

/

PACK1	DAC*	BUFP	/FIRST, JUST PLACE

	JMS	PKX

	CLL!SWHA

	RAR

	XOR*	BUFP	/SECOND IN BITS 2-9

	DAC*	BUFP

	ISZ	BUFP

	LAC	BUFP

	SAD	XYBUFE	/CHECK OVERFLOW WITH CLCULATED END

	JMP	DN

	JMS	PKX

	JMP	PACK1

/

/

	.TITLE	.FSTAT .ENTER .CLEAR

/

/  THIS SECTION TAKEN FROM BLACKETT'S HANDLER

/

/THIS CODE DEPENDS ON THE USER FOLLOWING THE CONVENTION OF ZEROING

/BITS 0-2 OF LOC+2 OF THE CAL SEQUENCE FOR A .FSTAT CAL AS PER 

/DIRECTIONS IN .FSTAT PARAGRAPH OF THE DOS USER MANUAL.

/

FSTAT	CLA

	JMP	EXITAP

ENTER	JMP	EXITAP

CLEAR	JMP	EXITAP+1

/

/

	.TITLE	.READ

/

/  THE READ FUNCTION IS USED TO OBTAIN PLOTTER STATUS

/

/  CAL WITH SEVEN (OR EIGHT FOR XY311) INTEGER ARGUMENTS  TO OBTAIN

/

/  LASTX		/PRESENT X POSITION IN INTEGER STEPS

/  LASTY		/PRESENT Y POSITION IN INTEGER STEPS

/  ISX		/X SIZE IN STEPS OF CHARACTER

/  ISY		/Y SIZE OF CHARACTER IN STEPS

/  ISIN		/INTEGER SIN (200000*SIN(X)) OF SLOPE OF CHARACTERS

/  ICOS		/INTEGER COS (200000*COS(X)) ON SLOPE OF CHARACTERS

/  IPEN		/0 IF PEN UP, 100000 IF DOWN

/  IPENUM	/# OF THE ACTIVE PEN IF XY311 INTERFACE IS INSTALLED

/

/  I.E.

/

/	READ (6) LASTX,LASTY,ISX,ISY,ISIN,ICOS,IPEN,IPENUM

/

READ	LAC*	ARGP	/BUFFER ADDR

	DAC	INITFX	/FORBID INIT'S

	AAC	2	/POINT TO REAL DATA

	DAC	LBUF

	LAC	(OTSJNK	/POINT TO 8 WORDS TO TRANSFER

	DAC	CALP	/GRAB CAL POINTER FOR TEMPORARY

	.IFUND	PL311

	LAW	-10	/LOOP CONTROL

	.ENDC

	.IFDEF	PL311

	LAW	-11	/LOOP CONTROL IF XY311 FUNCTIONSET AVAILABLE

	.ENDC

	DAC	COUNTC	/GRAB COUNTER FROM .WRITE

	LAC*	CALP	/GET WORD

	DAC*	LBUF	/PUT WORD

	ISZ	CALP	/MOVE POINTER

	ISZ	LBUF	/MOVE POINTER

	ISZ	COUNTC	/DONE YET

	JMP	.-5

	JMP	EXITAP-1 /EXIT THRU ARG. POINTER, WE'RE DONE

	.TITLE	.CLOSE

/

CLOSE	JMS	XYIOCK	/IS UNIT BUSY

	DZM	INITFX	/ALLOW INITS AGAIN

	JMS	DOLINE	/NO, FORCE OUT ??A QUESTION??

	JMS	XYIOCK	/MIGHT BE BUSY IF WE HAD TO FORCE SOME

/			/LINES OUT FROM BUFFER

	LAC	(177404	/EOF HEADER (4 BYTES FOR XY311)

	DAC*	XYBUF

	JMS	DOIO	/PUT OUT EOF, PRIMARILY FOR SPOOLER

	JMS	XYIOCK	/HAVE DEVICE IDLE WHEN EXIT

	JMP	EXITAP+1

/

/

	.TITLE	MISCELLANEOUS ROUTINES

/

/  ADDLIN SUBROUTINE PLACES THE DX, DY PAIR INTO THE OUTPUT

/  BUFFER 'BUFF'. THE TOP BIT(PDP-11!) OF DX IS COMPLEMENTED IF THE PEN

/  IS TO BE DOWN, LEFT ALONE FOR UP. THE BUFFER IS TRANSMITTED

/  TO THE PDP-11 WHEN FULL (10 XY PAIRS(DECIMAL)).

/

ADDLIN	0

	LAC	DX

	XOR	UPDWN	/STATE OF PEN

	DAC*	BUFP	/PLACE

	ISZ	BUFP

	LAC	DY

	DAC*	BUFP

	ISZ	BUFP

	ISZ	COUNT	/COUNT OF PAIRS!

	JMP*	ADDLIN	/NO NEED TO FORCE OUT

	JMS	DOLINE	/FORCE OUT, ALSO RESET POINTERS ETC.

	JMP*	ADDLIN

/

/  THE DOLINE ROUTINE OUTPUTS THE BUFFER OF XY PAIRS, AND THEN

/  CALLS RESETL TO SETUP COUNT AND POINTER FOR NEXT

/

DOLINE	0

	LAC	(XYPPB

	TAD	COUNT	/MAKE COUNT OF WORD PAIRS TO BE SENT

	SNA!SPA!CLL	/SKIP IF ANY

	JMP*	DOLINE	/NONE, DO NOTHING

	RTL		/*4 TO GIVE BYTE COUNT FOR SPOOLER

	TAD	(400	/CODE FOR LINE FOR DRIVER

	DAC*	XYBUF	/THAT'S THE HEADER

	JMS	DOIO	/GO DO IO

	JMS	RESETL	/RESET POINTER, COUNT

	JMP*	DOLINE

/

/  THE RESETL ROUTINE RESETS COUNT AND BUFP FOR THE NEXT BUFFER

/

RESETL	0

	LAW	-XYPPB	/10(10) PAIRS FOR NOW

/			/10 IS A GUESS OF WHAT SIZE WILL PACK WELL

/			/INTO SPOOLING BUFFERS, SINCE CHARACTER

/			/STRINGS WILL BE OF RANDOM SIZES

	DAC	COUNT

	LAC	XYBUFD	/POINT TO DATA PORTION OF BUFFER

	DAC	BUFP

	JMP*	RESETL

/

/  SUBROUTINE VALID VERIFIES THAT INPUT CO-ORDINATE VALUES ARE

/  LESS THAN 2^14 STEPS IN MAGNITUDE. CALL WITH VALUE IN AC

/  AC IS DESTROYED.

/

/

/

VALID	0

	SPA		/SKIP IF ALREADY +

	CMA!IAC		/MAKE + FOR TEST

	AND	(740000	/ANY TOP BITS ON

	SZA		/SKIP ON NO, WHICH IS CORRECT

	JMP	IOPS25	/ ** DATA VALUE >2**14-1

	JMP*	VALID

/

/  SUBROUTINE SETPEN TAKES LOW BIT OF AC (PEN UP-DOWN BIT) AND

/  PLACES IT IN THE 100000 BIT OF THE WORD UPDWN.

/  THIS ROUTINE DESTROYS THE AC!

/  CALL WITH THE CODE FOR THE WRITE IN THE AC

/

SETPEN	0

	RAR		/MAGIC BIT IN LINK

	CLA!RAR		/ZAP OTHER BITS, BIT IN 400000

	RTR		/BIT IN 100000

	DAC	UPDWN	/INTO DESTINATION

	JMP*	SETPEN

/

/

/

/  SET ESTABLISHES THE PROVIDED CO-ORDINATES AT THE PRESENT

/  PEN POSITION

/

SET	LAC*	LBUF

	DAC	LASTX

	ISZ	LBUF

	LAC*	LBUF

	DAC	LASTY	/AND LAST Y VALUE

	ISZ	ARGP	/KICK TO EXIT

EXITAP	ISZ	ARGP

	LAC	SAVMQ	/RESTORE MQ

	LMQ

	DBR

	JMP*	ARGP

/

/

/

	.IFDEF	PL311

/

/SUBROUTINE PIKPEN ASSEMBLES THE DATA REQUIRED FOR THE TCB

/TO SELECT AS THE ACTIVE PEN, PEN NO.1,2 OR 3

/CALLED WITH (LBUF) INDEXING DATA BUFFER OF FORTRAN CALL

/

PIKPEN	JMS	XYIOCK	/CHECK FOR DEVICE BUSY

	JMS	DOLINE	/FORCE OUT ANY PENDING LINE OPERATIONS

	JMS	XYIOCK	/WAIT IF WE HAVE TO

	LAC*	LBUF	/EXTRACT DATA

	DAC	NUMPEN	/UPDATE ACTIVE PEN NUMBER

	DAC*	XYBUFD	/DATA WORD FOR THIS TCB

	LAC	(2004	/THIS PUTS MODE=4 AND BYTE COUNT=4 

	DAC*	XYBUF	/INTO THE TCB HEADER

	JMS	DOIO	/SEND COMPLETED TCB TO THE PDP-11

	JMP	EXITAP-1	/RETURN TO CALLING PROGRAM

/

/  DBY2

/

/  ROUTINE DIVIDES QUANTITY POINTED AT BY POINT1

/  BY TWO, RETURNING QUANTIY. THE REMAINDER, IF

/  PRESENT, CAUSES CONTENTS OF SIGN1 TO BE ADDED

/  TO THE LOCATION FOLLOWING THE QUANTITY.

/

/  TYPICALLY, THE LOCATIONS XSH-YSL CONTAIN, AN X,

/  A REMAINDER X, A Y , AND A REMAINDER Y. POINT1

/  IS INCREMENTED TWICE BY  DBY2  SO IT CAN BE AGAIN CALLED

/  FOR Y

/

DBY2	0

	LAC*	POINT1	/FETCH QUANTITY TO BE DIVIDED
	660000		/SIGN TO LINK FROM AC0

	RAR		/AC SET, REMAIN IN LINK

	DAC*	POINT1	/RETURN QUANTITY OK

	ISZ	POINT1	/MOVETO FETCH REMAINDER

	LAC*	POINT1	/REMAIN (OVERALL) TO AC

	SZL		/SKIP IF NO IMMEDIATE REMAIN

	TAD	SIGN1	/KEEP BUILDING OVERALL REMAINDER

	DAC*	POINT1	/RETURN

	ISZ	POINT1	/MOVE ON TO NEXT PAIR

	JMP*	DBY2

/

	.ENDC

/

/

/

	.TITLE	I/O

/

/

/  

/

/  DOIO ROUTINE ISSUE REQEST TO SEND TCB TO PDP-11

/

DOIO	0

	DZM*	XYEV

	DZM	XYIOFL	/RESET XYIOCK'S MEMORY OF WHO'S WAITING!

	LAC	XYTCB	/TCB ADDR ALWAYS SAME

	SIOA		/SKIP IF PDP-11 CAN TAKE IT

	JMP	.-1	/TRY AGAIN TIL IT CAN

	LIOR		/SEND

	JMP*	DOIO

/

/

/  XYIOCK IS ROUTINE TO CHECK IF UNIT BUSY, CONTINUE IF NOT,

/  AND HANG ON CAL IF IT IS. THE TROUBLE IS THAT PEROPLE LIKE

/  .CLOSE, FOR INSTANCE MUST CALL US SEVERAL TIMES, AND THE

/  LOOP ON CAL RE-ENTERS AT THE BEGINNING OF THE CLOSE

/  PROCESSING. THUS WE MUST REMEMBER WHO WAS THE FIRST PERSON

/  TO CALL US AFTER I/O COMMENCED; HE WILL GET CONTROL WHEN

/  THE DEVICE FINALLY BECOMES NON-BUSY. THAT IS WHY .WAITR

/  CAN'T USE US, HE NEVER WAN'T TO HEAR FROM US AFTER HE

/  CHECKS FOR UNIT BUSY.

/

XYIOFL	-6		/ADDR TO RETURN TO, 0 SAYS USE XYIOCK

/			/XYIOFL IS CLEARED WHEN I/O STARTED, AND

/			/WHEN IT IS USED. IT IS SET WHEN 

/			/A CALL IS MADE TO XYIOCK, UNIT IS BUSY,

/			/AND XYIOFL IS FOUND TO BE ZERO.

/			/BY THE WAY, THE -6 IS USED BY INITIT AS

/			/A COUNT, AND IS LEFT AS ZERO FOR NORMAL

/			/USE.

/

XYIOCK	0

	LAC*	XYEV	/IS UNIT BUSY

	SNA!SPA!RTL	/SKIP IF NOT

	JMP	XYIOBS	/GO DO BUSY 

	SPA		/SKIP IF NOT ERROR (TESTING

/			/PDP-11 SIGN BIT!

	JMP	XYIOBS	/TREAT ERROR AS BUSY

	LAC	XYIOFL	/SHOULD WE RETURN THRU XYIOCK OR XYIOFL

	SZA		/0 SAYS XYIOCK

	DAC	XYIOCK	/BOTH CASES, ADDR IN XYIOCK FOR CONVENIENCE

	DZM	XYIOFL	/USED XYIOFL, CLEAR OUT

	JMP*	XYIOCK	/RESUME AT FIRST GUY TO WAIT

/

XYIOBS	LAC	XYIOFL	/BUSY, HAS SOMEONE ELSE ALREADY STORED ADDR.?

	SNA		/SKIP IF HE HAS

	LAC	XYIOCK	/NO, SO STORE OURS

	DAC	XYIOFL	/NOP IF PREVIOUSLY STORED

EXITCP	DBR		/EXIT THRU CAL POINTER (WAITR USES THIS

	JMP*	CALP	/BUT HE  SET UP CALP FOR HIMSELF

/

/

	.TITLE  INTERRUPT SERVICE

/

XYINT	JMP	XYPIC	/PIC ENTRY, GO SERVICE

	DAC	XYAC	/API ENTRY, SAVE AC

	LAC	XYINT	/GET INTERRUPTED PC

	DAC	XYOUT	/SAVE FOR COMMON EXIT

	LAC	(JMP XYPIC /RESTORE PIC ENTRY POINT

	DAC	XYINT

	LAC	(NOP	/WE DON'T NEED ION IN COMMON EXIT

	JMP	XYICM	/FINISH UP WITH PIC CODE

/

XYPIC	DAC	XYAC	/SAVE TH AC HERE TOO

	LAC*	(0	/GET INTERRRUUPTED PC

	DAC	XYOUT	/COMMON EXIT POINT

	LAC	(ION	/PIC NEEDS ION

/

XYICM	DAC	XYISW	/PLACE EITHER NOP OR ION

	CAPI		/CLEAR FLAG

	LAC*	XYEV	/IS PIREX HAPPY?

	RTL		/PDP-11 SIGN BIT TO OUR SIGN BIT

	SPA!RTR		/SKIP IF OK, RESTORE AC

	JMP	XYIERR	/NOT OK, GO CHECK IT OUT

XYIRT	LAC	XYAC	/BRING BACK INTERRUPTED AC

XYISW	HLT		/EITHER ION OR NOP

	DBR

	JMP*	XYOUT

/

/

XYIERR	AND	(177777	/KEEP ONLY PDP-11 BTS

	SAD	(177001	/IS IT OUT OF NODES ERROR

	JMP	RETRY	/YES, TRY AGAIN

	TAD	(600000	/NO, MAKE CODE INTO - NUMBER FOR

	JMP	IOPSER	/AN IOPS MESSAGE.

/			/THIS SHOULD NEVER REALLY HAPPEN.

/

RETRY	JMS	DOIO	/DOIO ENTERED CAL + INTERRUPT LEVEL

	JMP	XYIRT	/DON'T BELIEVE BOTH CAN HAPPEN AT ONCE.

/

/

/

	.TITLE  INITIALIZATION AND STORAGE

/

/  FIRST COME STORAGE LOCATIONS THAT CANNOT OVERLAP

/  INITIALIZATION CODE

/

ARGP	0		/POINTER TO ARGUMENTS IN CAL

CALP	0		/POINTER TO CAL ADDR

SAVMQ	0		/SAVE MQ THRU CAL LEVEL, NECESSARY?

INITFX	0		/ALLOW AN INIT IF THIS IS ZERO!!

/

/  8 WORDS DESCRIBING THE UNIT GRID ON REAL PLOTTER

/

XDXH	2		/HIGH HALF OF X STEPS PER GRID UNIT

XDXL	0		/LOW HALF.11*11 GRID UNITS MAKE CHARACTER 'BOX'

YDYH	2		/Y STEPS PER Y GRID UNIT, HIGH

YDYL	0		/Y STEP, LOW HALF. ORDER MUST MATCH IN PDP-11

XDYH	0		/Y STEPS PER X GRID UNIT, CA OCCUR WITH TIPPED

XDYL	0		/CHARACTERS

YDXH	0

YDXL	0

/

/

/  FOLLOWING 7 (8 FOR XY311) WORDS ARE TRANSFERED OUT ON A .READ. THEY MUST

/  REMAIN IN ORDER

/

OTSJNK	400000		/SOME SORT OF OTS WORD;ALSO USED AS LITERAL

LASTX	0		/PRESENT X CO-ORDINATE PEN POSITION

LASTY	0		/PRESENT Y CO-ORDINATE PEN POSITION

XSZ	DFLCHR		/X SIZE OF A CHARACTER, IN INTEGER STEPS

YSZ	DFLCHR		/Y SIZE OF A CHARACTER IN STEPS

SINX	0		/200000*SIN(X), WHERE X IS TILT OF CHAR.

COSX	200000		/200000*COS(X). STRING FROM HORIZONTAL

UPDWN	0		/PEN STATUS.0=UP.100000=DOWN

	.IFDEF	PL311

NUMPEN	0		/NUMBER OF THE PEN WHICH IS ACTIVE

			/(XY311 INTERFACE ONLY)

	.ENDC

/

/  INITIALIZATION CODE TO SET UP POINTERS TO MONITOR BUFFER

/  AND TCB, AND THEN DO SETUP CAL.

/

/  THIS CODE IS ALSO USED FOR STORAGE AND TEMPORARY LOCATIONS

/  DURING NORMAL PROCESSING

/

/  FIRST DEFINE THE TEMPORARY LLOC'S

/

XYAC			/SAVE AC AT INTERRUPT LEVEL

XYOUT			/SAVE PC AT INTERRUPT LEVEL

XYTCB			/TCB ADDRESS IN MONITOR COMMUNICATION AREA

XYEV			/EVENT VARIABLE FROM PIREX AT TCB+2

XYBUF			/DATA BUFFER HEADER IN COMMUNICATION AREA

XYBUFD			/XYBUF+2, START OF REAL DATA

XYBUFE			/XYBUFD+102 MAX OF 132 CHAR'S CHECK OVERFLOW

CODE			/TYPE OF .WRITE

INITFL	0		/FLAG FOR CHARSET. 0 IF NOT INIT. NON0 IF INIT

COUNT			/-COUNT OF X,Y PAIRS TO OUTPUT BUFFER

COUNTC			/COUNT OF INPUT WORD PAIRS

COUNTX			/CONTROL COUNT FORTRAN CHAR'S

LBUF			/POINTER TO INPUT BUFFER

POINT1			/POINT TO SINGLE WORD OPERAND  MX1X2

POINT2			/POINT TO DOUBLE WORD OPERAND  MX1X2

XSH			/KEEP THIS AND NEXT 3 IN ORDER!!!

XSL			/HIGH AND LOW X-DIR TERMPORARY GRID CALC.

YSH			/HIGH HALF OF Y DIRECTION FOR GRID

YSL			/LOW HALF OF Y

SIGN1			/MX1X2 STORE SIGN OF RESULT

SIGN3			/MX1X2 0 OR 1 TO ADD TO LOW WORD OF RESULT

T1			/3 TERMPORARIES FOR MX1X2

T2

T3

POINTS			/POINT TO 8 WORD BLOCK AT XDXH FOR PLACEMENT

POINTB			/POINT TO OUTPUT BUFFER FOR SAME THINGS

BUFP			/POINTER TO PLACE LINES IN OUTPUT BUFFER

DX			/DELTA X OF PRESENT MOVE FOR LINES TO PDP-11

DY			/DELTA Y, KEEP AS ADDRESS PAIR WITH DX!

IX			/X VALUE INPUT FROM THE USER FOR THIS .WRITE

IY			/AND THE Y VALUE

/

/   NOW THE CODE TO DO THE INITIALIZATION

/

	.LOC XYAC

/

/

INITIT	LAC	(NOP	/PREVENT RE-ENTRY

	DAC	NEW	/BY DESTROYING JUMP TO HERE

/

/  SET UP POINTERS TO MONITOR BUFFER AND TCB

/

	LAC*	(.SCOM+100 /TABLE OF POINTERS

	SNA!SPA		/(SCR-36)>0 IF UC15 STILL HERE
	JMP	IOPS12	/(SCR-36)UC15 GONE

	AAC	3	/OFFSET TO OBTAIN OURS

	DAC	XYAC	/USE AS TEMPORARY

	LAC*	XYAC	/ADDRESS OF OUR COMBINED AREA

	SNA!SPA		/(SCR-36)THIS, TOO, BETTER BE >0
	JMP	IOPS55	/(SCR-36)NO TCB AREA
	DAC	XYAC	/POINTER FOR TCB CONSTRUCTION

	DAC	XYTCB	/AND POINTER FOR OUR MEMORY

	AAC	2	/MAKE POINTER TO EVENT VARIABLE

	DAC	XYEV

	AAC	2	/POINT TO ADDR IN TCB POINTING TO BUFFER

	DAC	XYOUT	/SAVE FOR LATER FILL

	AAC	5	/POINTER TO FIRST DATA WORD IN BUFFER

	DAC	XYBUFD

	AAC	102	/END OF BUFFER +1 FOR OVERFLOW CHECK

	DAC	XYBUFE

/

/  CONSTRUCT TCB

/

	LAC	(APISLT*400+APILVL /FIRST TCB LOC. TELLS

	DAC*	XYAC	/PDP-11 HOW TO WAKE US UP

	ISZ	XYAC

	LAC	(DEVCOD	/DEVICE CODE FOR DRIVER WITHIN PIREX

	DAC*	XYAC	/AS SECOND TCB LOCATION

	ISZ	XYAC	/NOW A LOOP TO ZERO THRU FIRST BUFFER LOC

	DZM*	XYAC

	ISZ	XYIOFL	/NASTY, THIS ASSEMBLED AS LOOP CONTROL

/			/CONSTANT, IS LEFT AT CORRECT 0

	JMP	.-3	/NOT DOEN YET

	LAC	XYAC	/THIS ADDR NOW POINTS TO BUFFER

	DAC*	XYOUT	/SO PLACE IN TCB

	DAC	XYBUF	/AND FOR OUR MEMORY

	ISZ*	XYEV	/!MAKE EVENT VARIABLELOOK LIKE OK OPERATION

/			/FOR FIRST TIME IN!

	JMS	RESETL	/RESET BUFP, COUNT. WARNING! BUFP IS

/			/VERY CLOSE TO THE ADDRESS OCCUPIED

/			/HERE.

	CAL	APISLT	/SETUP CAL TO ATTACH INTERRUPTS

	16

	XYSF

	XYINT

	JMP	NEW	/RETURN TO CAL DECODING

/

	.END