.SYSID <	.TITLE VPA. >,< 113>
/
/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 #011	FEB. 27, 73
/     #012	21-JUN-74 BY ED GARDNER.  MINOR FIXES TO HANDLEING OF
/		ALTMODES IN LINES LONGER THAN 72 CHAR.'S AND TO FORM FEEDS.
/     #013	11-JUL-74 BY ED GARDNER  REMOVE CODE TO ENABLE AND DISABLE
/		INTERRUPTS, AS CODE HAS BEEN ADDED TO RESMON TO HANDLE
/		SPURIOUS INTERRUPTS
/ 113	14-JUN-75 (RCHM)	MAKE XVM CHANGES.
/COPYRIGHT 1969, 71,72, 73 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
/ROLF HUBERT
/BY DEFINING VPA.S A VERSION OF VPA IS PRODUCED WHICH OUTPUTS PAGE BY
/PAGE IF BIT 0 OF AC SWITCHES IS 1.  THIS IS USEFUL WITH MACRO LISTINGS.
/
	.GLOBL	VPA.
CXB=700522	/CLEAR X-COORDINATE BUFFER
CYB=700622	/CLEAR Y-COORDINATE BUFFER
LXB=700524	/LOAD X-COORDINATE BUFFER FROM AC 8-17
LYB=700624	/LOAD Y-COORDINATE BUFFER FROM AC 8-17
EST=700726	/ERASE THE STORAGE TUBE AND CLEAR FLAG
SDDF=700521	/SKIP IF DISPLAY DONE FLAG IS SET
CDDF=700722	/CLEAR DISPLAY DONE FLAG
LXBD=700564	/LOAD X-COORDINATE BUFFER AND DISPLAY THE POINT SPECIFIED
		/BY XB AND YB (STORED)
LYBD=700664	/LOAD Y-COORDINATE BUFFER AND DISPLAY THE POINT
		/SPECIFIED BY XB AND YB (STORED)
LXDNS=700544	/LOAD X-COORDINATE BUFFER AND DISPLAY THE POINT
		/SPECIFIED BY XB AND YB (NON-STORED)
LYDNS=700644	/LOAD Y-COORDINATE BUFFER AND DISPLAY THE POINT
		/SPECIFIED BY XB AND YB (N0N-STORED)
.MED=3		/ERROR MESSAGES
VPA.	DAC	VPCALP		/ADDRESS OF CAL INSTRUCTION
	DAC	VPARGP		/ARGUMENT POINTER CAL
	ISZ	VPARGP		/GET FUNTION CODE
	LAC*	VPARGP		/LOC+1		
	AND (177
	ISZ	VPARGP		/POINT TO NEXT ARGUMENT-LOC+2
	TAD	(JMP VPDSPT	/SET UP FUNTION DISPATBH
	DAC	VPDSPT
VPDSPT	XX			/FUNTION DISPATCH
	JMP	VPINIT		/1=.INIT
	JMP	VPFST		/2=.FSTAT
	JMP	VPILLG		/3=.SEEK (ILLEGAL)
	JMP	VPIGNR		/4=.ENTER (IGNORED)
	JMP	VPRET		/5=.CLEAR (IGNORED)
	JMP	VPCLOS		/6=.CLOSE
	JMP	VPRET		/7=.MTAPE (IGNORED)
	JMP	VPILLG		/10=.READ (ILLEGAL)
	JMP	VPWRIT		/11=.WRITE
	JMP	VPWAIT		/12=.WAIT-.WAITR
	ISZ	VPARGP		/13=.TRAN (IGNORED)
	ISZ	VPARGP
	JMP	VPIGNR
	.EJECT
VPINIT	LAC*	VPCALP		/GET CONTENTS OF CAL INSTRUCTION
	AND	(3000		/BIT 7-8 MUST CONTAIN 1
	SZA			/SKIP IF AC   EQUAL TO 0
	JMP	VPCAL
VPILLG	LAW	6		/ERROR CODE 6
	JMP*	(.MED+1		/JUMP TO ERROR ROUTINE
VPCAL	CAL	+54		/.SETUP FOR PIC AND API CHANNEL 54
VPXCRD	16
VPYCRD	SDDF			/SKIP ON DISPLAY DONE FLAG
VPIOBY	VPINT			/INTERRUPT HANDLER ADDRESS
VPSCL	LAC	(JMP VPXX	/JUMP AROUND CAL AFTER FIRST PASS
VPTAB	DAC	VPCAL
VPXX	LAC	(40		/MAXIMUM BUFFER SIZE
	ISZ	VPARGP
	DAC*	VPARGP		/DEPOSIT IN LOC+3
	LAC	VPIN20		/SET UP CORRECT RETURN FOR
	DAC	VPIN10		/INTERRUPT HANDLER
	EST			/ERASE SCREEN, AND...
	DAC VPIOBY		/SET I/O UNDERWAY BEFORE WE CAN GET INTERRUPTED
	LAC	(2000		/SET UP Y-COORDINATE, Y=1025
	DAC	VPYPOS
	DZM	VPXPOS		/CLEAR X POSITION
	ISZ	VPARGP		/BUMP TO EXIT ADDRESS FROM .INIT MACRO
	DZM	VPINTF		/MAKE SURE INTERRUPT FLAG OFF
	LAW -10	/INITIALISE TAB COUNT
	DAC VPTAB
	LAC (14
	DAC LSTFRM	/PRETEND FF WAS LAST CHAR
	DBR			/SCREEN ON AN .INIT
	XCT	VPRET1		/EXIT FROM .INIT CAL
VPIGNR	ISZ	VPARGP		/BUMP TO RETURN LOCATION
VPRET	DBR
VPRET1	XCT	(JMP* VPARGP	/RETURN TO USER
VPBSY	DBR
	XCT	(JMP* VPCALP	/I/O IS BUSY
	.TITLE TEST FOR MEMORY BOUNDS ERROR
 
MEMORY	XX			/(RCHM-113) SUBROUTINE ENTRY POINT
	AND (700000)		/(RCHM-113) EXTRACT EXTENDED MEMORY BITS.
	SNA			/(RCHM-113) ARE ANY OF THEM ON?
	JMP* MEMORY		/(RCHM-113) NO, EXIT TO CALLER.
	LAW 67			/(RCHM-113) PICK UP ERROR NUMBER.
	JMP* (.MED+1)		/(RCHM-113) PRINT ERROR
	.TITLE .WRITE PROCESSOR.
/.WRITE
VPWRIT	LAC	VPIOBY		/CHECK IF I/O UNDERWAY
	SZA
	JMP	VPBSY		/YES
	LAC	VPARGP		/GET CORRECT RETURN
	TAD	(2
	DAC	VPARGQ		/SET UP CORRECT RETURN TO USER
	DZM	VPINTF		/MAKE SURE INTERRUPT FLAG IS OFF
	LAC	(LYBD		/LOAD IOT IN VPIOT
	DAC	VPMODE
	DAC	VPIOBY		/SET I/O UNDERWAY
	LAC*	VPCALP		/GET CONTENTS OF CAL INSTRUCTION
	AND	(17000
	SAD	(2000		/IOPS ASCII-SCALE 2
	JMP	VPASC2
	SAD	(12000		/IOPS ASCII-SCALE 4
	JMP	VPASC4
	SAD	(3000		/IMAGE ASCII
	JMP	VPIMAG
	SAD	(4000		/DUMP - STORE MODE
	JMP	VPDMSM
	SAD	(14000		/DUMP - NON-STORE MODE
	JMP	VPDMNS
	LAW	7		/ERROR CODE 7, ILLEGAL DATA MODE
	JMP*	(.MED+1		/ERROR ROUTINE
VPASC2	LAC	(20000		/IOPS ASCII-SCALE2
	JMP	.+2
VPASC4	LAC	(40000		/IOPS ASCII-SCALE 4
	JMS	VPSCAL
	LAC	VPIN30		/SET UP CORRECT BRANCH IN
	DAC	VPIN10		/INTERRUPT HANDLER
	LAC	VPNT20		/SET UP CORRECT BRANCH TO
	DAC	VPNMPT		/GET ANOTHER CHARACTER
	LAC*	VPARGP
	JMS MEMORY		/(RCHM-113) CHECK BUFFER ADDRESS.
	LAC* VPARGP		/(RCHM-113) FETCH BUFFER ADDRESS.
	TAD	(2		/SKIP OVER HEADER PAIR
	DAC	VPNEWP		/POINTING AT FIRST WORD OF IOPS ASCII
	ISZ VPARGP		/BUMP TO WORD COUNT
	LAC* VPARGP
	DAC VPWCNT		/SAVE IT
	LAC* VPNEWP		/CHECK FOR LF (FORTRAN)
	SWHA
	RTR			/RIGHT JUSTIFY
	AND (177		/CLEAR JUNK
	SAD (12			/LF?
	JMP VPGETP		/YES. FORGET Y INCREMENT
	LAC	VPLF		/LOAD LINE FEED
	TAD	VPYPOS		/Y=Y-LF
	SMA			/ARE WE AT THE BOTTOM OF THE TUBE
	JMP	VPWR10
	LAW	-1		/INDICATES NO MORE CHARS IN WORD PAIR.
	DAC	VPTEMP
	JMP	VPFORM		/YES- RESET TO TOP OF SCREEN
VPWR10	DAC	VPYPOS		/SET Y POSITION
	TAD	VPDEL
	DAC	VPYCRD		/NO
VPGETP	LAC*	VPNEWP		/FIRST WORD OF PAIR
	DAC	VPWRD2
	ISZ VPWCNT		//WC OVFLO?
	SKP			/NO.
	JMP VPEOL		/YES. EXIT TO USER
	ISZ	VPNEWP
	LAC*	VPNEWP		/SECOND WORD OF PAIR
	DAC	VPWRD3
	ISZ	VPNEWP		/POINT TO NEXT PAIR
	LAW	-5
	DAC	VPTEMP		/FIVE CHARACTER COUNTER
VPGET	JMS	VPUNPK		/UNPACK CHARACTER
	JMP	VPDISP		/DISPLAY CHARACTER
				/END OF LINE, CR OR ALTMODE.
VPHERE	ISZ VPTEMP
	JMP	VPGET		/NO - GET ANOTHER CHARACTER
	JMP	VPGETP		/YES - GET ANOTHER WORD
	.EJECT
/IMAGE ASCII
VPIMAG	LAC*	VPARGP		/PTR TO BUFFER AREA
	DAC	VPNEWP
	JMS MEMORY		/(RCHM-113) CHECK BUFFER ADDRESS.
	LAC*	VPNEWP		/LOAD CONTENTS OF FIRST WORD
	AND	(377000		/TO GET WORD PAIR COUNT
	CLL; RTR; RTR; RTR; RTR		
	CMA			/COMPLEMENT TO SET UP
	TAD	(2		/COUNTER
	DAC	VPTEMP
	ISZ	VPNEWP		/MOVE PAST HEADER PAIR
	ISZ	VPNEWP
	LAC	VPIN30		/SET UP CORRECT BRANCH IN
	DAC	VPIN10		/INTERRUPT HANDLER
	LAC	VPNT30		/CORRECT BRANCH IN ORDER
	DAC	VPNMPT		/TO GET ANOTHER CHAR.
VPIM10	ISZ	VPTEMP		/WORD COUNTER
	SKP
	JMP	VPEOL		/CLEAR I/O BUSY, RESTORE AC
	LAC*	VPNEWP
	SMA			/IF OTHER THAN ZERO=NEW SCALE
	JMP	VPIM20
	JMS	VPSCAL		/JUMP TO SCALE ROUTINE
	LAC*	VPNEWP
VPIM20	DAC	VPWRD1
	ISZ	VPNEWP		/INCREMENT TO NEXT WORD
/TEST FOR SPECIAL CHARACTERS
	AND	(177		/GET JUST CHARACTER
	DAC	VPWRD1
	SAD (14
	JMS VPFRM
	DZM LSTFRM
	SAD	(15		/CR?
	JMP	VPIMCR		/YES
	SAD	(12		/LF?
	JMP	VPIMLF		/YES
	SAD	(175		/ALTMODE?
	JMP	VPNMPT		/YES
	SZA		/CHECK FOR NULL
	SAD	(177		/OR RUBOUT
	JMP	VPIM10		/GET NEXT CHAR IF SO
	SAD (20			/OVERPRINT?
	JMP VPNMPT		/YES. GET NEXT CHAR
	LAC	VPXPOS		/LOAD X POSITION
	DAC	VPXCRD		/X POS = X COORD
	TAD	VPSPAC		/ADD A SPACE TO X POS
	DAC	VPXPOS
	TAD	(-1777		/CHECK FOR END OF LINE
	SMA
	JMP	VPIM10		/END OF LINE REACHED
	LAC	VPYPOS
	TAD	VPDEL		/ADD A DELTA TO YPOS
	DAC	VPYCRD		/DEPOSIT IT IN YCRD
	LAC	VPWRD1		/LOAD LETTER IN AC
	JMP	VPOTHR
	.EJECT
VPDMNS	LAC	(LYDNS		/DUMP MODE-NON STORE
	DAC	VPMODE		/DEPOSIT NON-STORE IOT
VPDMSM	LAC*	VPARGP		/
	DAC	VPNEWP		/PTR TO BUFF AREA
	ISZ	VPARGP		/GET NEXT ARGUMENT
	LAC*	VPARGP
	DAC	VPTEMP
	CMA!IAC			/(RCHM-113) CONVERT WORD COUNT TO POSITIVE NUMBER.
	TAD VPNEWP		/(RCHM-113) ADD IN BUFFER ADDRESS.
	JMS MEMORY		/(RCHM-113) CHECK END OF BUFFER ADDRESS.
	LAC	VPIN40		/SET UP CORRECT BRANCH FOR
	DAC	VPIN10		/INTERRUPT HANDLER
VPMRPT	LAC*	VPNEWP		/SET UP FOR IOT
	RTR; RTR; RTR; RTR		/GET INTO AC 8-17
	AND	(1776
	DAC	VPXCRD		/GET JUST X CRD IN 9 RIGHT MOST BITS
	DAC	VPXPOS
	LAC*	VPNEWP
	RCL
	AND	(1776		/Y COORDINATE
	DAC	VPYCRD
	DAC	VPYPOS		/GET JUST Y CRD IN 9 RIGHT MOST BITS
	JMP	VPIOT
VPMPTS	ISZ	VPNEWP
	ISZ	VPTEMP		/WORD COUNTER
	JMP	VPMRPT		/GET ANOTHER CHAR
	JMP	VPEOL		/RETURN TO USER
	.EJECT
VPWAIT	LAC*	VPCALP		/GET CAL
	AND	(1000		/CHECK BIT 8
	SZA
	JMP	VPWATR		/WAITR
	LAC	VPIOBY		/GET BUSY SWITCH
	SZA
	JMP	VPBSY		/BUSY RETURN TO CAL
	JMP	VPRET		/NOT BUSY, RETURN PAST CAL
VPWATR	LAC	VPIOBY		/GET BUSY SWITCH
	SNA
	JMP	VPIGNR		/NOT BUSY, RETURN PAST CAL
	LAC	VPCALP		/BUSY, GET RESTORE BITS
	AND	(700000
	DAC	VPCALP		/SAVE THEM
	LAC*	VPARGP		/GET USER'S ADDRESS FROM LOC+2
	AND	(77777		/CLEAN OUT BITS 0-2
	XOR	VPCALP		/INSERT RESTORE BITS
	DAC	VPARGP		/SAVE IN RETURN POINTER
	JMP	VPRET		/AND GO THERE
	.EJECT
VPCLOS	LAC	VPIOBY		/CHECK IF I/O BUSY AND RETURN WHEN IT IS
	SZA		/OTHERWISE LOOP ON .CLOSE MACRO
	JMP	VPBSY		/I/O IS BUSY
	JMP	VPRET		/RETURN TO USER
VPFST	LAC*	VPCALP		/GET CAL
	AND	(3000		/CHECK BITS 7&8 TO SEE IF THIS
	SAD	(3000		/IS AN FSTAT
	JMP	VPFST1		/YES
	JMP	VPIGNR		/NO, RETURN TO USER
VPFST1	LAC* VPARGP			/PUT 0 IN BITS 0-2
	AND (77777
	DAC* VPARGP
	CLA
	JMP	VPIGNR		/RETURN TO USER
	.EJECT
/ROUTINE TO SET UP DISPLAY
VPDISP	LAC	VPWRD1		/LOAD CHARACTER
	AND	(177		/GET JUST THE CHARACTER
	SAD (12		/LF??
	JMP VPASLF		/YES.
ZZ	SAD (14	/FF?
	JMS VPFRM	/YES
	DZM LSTFRM
	SAD	(15		/CR?
	JMP	VPCR		/YES
	SAD	(175		/ALTMODE?
	JMP	VPALTM		/YES
	SZA		/CHECK FOR NULL CHARACTER
	SAD	(177		/OR RUBOUT
	JMP	VPHERE		/GET NEXT CHARACTER
	DAC	VPWRD1		/DEPOSIT CHARACTER
	.IFDEF	VPA.S
	LAC	(LAC	VPLF	/RESTORE INSTRUCTION CHANGED ON OCCURENCE
	DAC	VPASLF		/OF A FORM FEED ON OUTPUT.
	.ENDC
	LAC	VPXPOS
	DAC	VPXCRD
	TAD	VPSPAC
	DAC	VPXPOS		/IN X POSITION
	TAD	(-1777
	SMA
	JMP	VPHERE		/POSITIVE=WE AT THE END OF THE LINE
	LAC	VPWRD1
	SNA		/OTHER THAN ZERO
	JMP	VPNMPT		/GET ANOTHER CHARACTER IF ZERO
/CHECK FOR NON PRINTING CHARACTERS SUCH AS SPACE & TAB
VPOTHR	SAD	(40
	JMP	VPSCE		/SPACE
	SAD	(11
	JMP	VPTAB1		/TAB
/SET UP FOR DISPLAY
VPDC	AND	(77
	RCL			/CLL!RAL
	TAD	VPDCTB		/ADD BASE ADDRESS, DISPLAY TABLE
	DAC	VPCHAD		/FIRST WORD ADDRESS
	LAW	-2
	DAC	VPCNTW		/SECOND WORD ADDRESS
	LAW	-21
	DAC	VPCNTB		/17 BITS (1ST WORD) COUNTER
	LAC*	VPCHAD		/FIRST DISPLAY WORD
	RCL
	DAC	VPTEM		/SAVE REST OF 17 BITS
VPDCB	LAW	-7
	DAC	VPCNTD		/7 BIT LINE COUNTER
VPDCD	LAC	VPTEM		/FETCH DISPLAY WORD
VPDCF	RCL			/NEXT BIT IN LINK
	DAC	VPTEM		/SAVE THE REST
	LAC	VPYCRD
	TAD	VPDEL		/ADD DELTA (1 UNIT)
	DAC	VPYCRD		/TO COORDINATE
	SZL			/BIT SET?
	JMP	VPIOT		/ISSUE IOT
VPIT	ISZ	VPCNTB		/ANY MORE POINTS
VPSKP	SKP			/NO?
	JMP	VPDCC		/YES, CHECK WORD
	ISZ	VPCNTD		/LINE DONE?
	JMP	VPDCD		/NO, NEXT BIT
	LAC	VPYPOS
	TAD	VPDEL
	DAC	VPYCRD
	LAC	VPXCRD		/MOVE X COORDINATE
	TAD	VPDEL
	DAC	VPXCRD		/RESET FOR NEW LINE
	JMP	VPDCB
VPDCC	ISZ	VPCNTW		/SECOND WORD?
	JMP	VPDCE		/NO, SET IT UP
VPDF2	LAC	VPYPOS		/Y POSITION
	TAD	VPDEL		/ADD DELTA
	DAC	VPYCRD		/NEW Y COORD
VPSCE=.
	ISZ	VPTAB		/INCREMENT TAB COUNTER
	JMP	VPNMPT		/IF NOT 0 GET ANOTHER CHAR
VPTB1	LAW	-10		/OTHERWISE INITIALIZE TAB COUNT
	DAC	VPTAB
	JMP	VPNMPT		/THEN GET ANOTHER CHAR
VPDCE	ISZ	VPCNTD		/INCREMENT LINE COUNT
	LAW	-22
	DAC	VPCNTB		/18 BITS (2ND WORD)
	ISZ	VPCHAD		/MOVE POINTER TO SECOND WORD
	LAC*	VPCHAD		/FETCH IT
	JMP	VPDCF
VPDFF	LAC	(LYBD		/RESET PROPER IOT IN EXIT SEQUENCE.
	DAC	VPMODE
	LAC	(2000		/RESET Y TO TOP OF TUBE.
	TAD	VPLF
	DAC	VPYPOS
	DZM VPXPOS		/RESET X TO LEFT HAND MARGIN
	LAW -10			/AND RESET TAB COUNTER
	DAC VPTAB
	LAC	VPIN30
	DAC	VPIN10		/SET UP RETURN FOR ANOTHER CHAR
	LAW	-1
	TAD	VPTAB
	DAC	VPTAB		/SET PROPER TAB
	JMP	VPDF2		/GET NEXT CHAR
	.EJECT
VPIOT	LAC	VPXCRD		/SET UP X COORDINATE
	LXB
	ISZ	VPINTF		/SKIP IF EXIT FROM INTERRUPT
	JMP	VPCAL1		/EXIT FROM CAL
VPSW2	IOF			/MAKE SURE WE AREN'T INTERRUPTED
				/CHANGED TO NOP ON API INTERRUPTS
	LAC	VPYCRD		/SET UP Y COORDINATE AND DISPLAY
	XCT	VPMODE		/DISPLAY IOT
VPEOL1	LAC	VPAC		/RESTORE INTERRUPT AC
VPSW1	XX			/RESTORE PIC
	DBR
	XCT	.+1
	XCT	(JMP*	VPPC
VPCAL1	LAC	VPYCRD		/SET UP Y COORDINATE AND DISPLAY
VPMODE	XX			/SCOPE IOT
	LAC (2
	700721	/ENABLE INTERRUPT
VPCAL2	DBR
	XCT	.+1
	XCT	(JMP*	VPARGQ
VPNMPT	XX			/IS LOADED WITH VPNT20 OR VPNT30			
VPNT20	JMP	VPHERE		/GET ANOTHER IOPS ASCII CHAR
VPNT30	JMP	VPIM10		/GET ANOTHER IMAGE ASCII CHAR
	.EJECT
VPCR	DZM	VPXPOS		/X=2
	LAW -10
	DAC VPTAB
	JMP	VPEOL		/RETURN TO USER
VPASLF	LAC	VPLF		/LINE FEED(CHANGED TO JMP VPNMPT
				/IN VPA.S ON OCCURENCE OF FORM FEED)
	TAD	VPYPOS
	SPA			/ARE WE AT THE END OF THE TUBE
	.IFUND	VPA.S
	JMP	VPFORM
	.ENDC
	.IFDEF	VPA.S
	JMP	VPACS
	.ENDC
	DAC	VPYPOS		/NO - REPOSITION Y BEAM
	TAD	VPDEL		/ADD DELTA TO X COORD
	DAC	VPYCRD
	JMP	VPNMPT		/GET ANOTHER CHARACTER
	.IFDEF	VPA.S
VPACS	LAC	(JMP VPNMPT
	DAC	VPASLF
	JMP	VPFORM
	.ENDC
VPALTM	LAC	VPLF		/ADD TO Y-COORD
	CMA; TAD	(1
	TAD	VPYPOS
	DAC	VPYPOS
	JMP	VPEOL		/RETURN TO USER
VPFRM	XX		/THIS CHAR. IS FF
	SAD LSTFRM	/IGNORE IF LAST CHAR.
	SKP
	JMP VPFORM	/NO, LAST CHAR. WAS NOT A FF
	CLA		/YES, LAST CHAR. WAS A FF
	ISZ VPFRM	/PRETEND THIS CHAR. IS NULL
	JMP* VPFRM
VPFORM	LAC (14
	DAC LSTFRM
	LAC (700000
	DAC	VPIN10
	LAC	VPIN50
	ISZ	VPIN10
	JMP	.-2
	DAC	VPIN10
	.IFUND	VPA.S
VPEST	LAC	(EST
	.ENDC
	.IFDEF	VPA.S
VPEST	LAS
	SMA
	JMP	.+3
	LAC	(NOP
	SKP
	LAC	(EST
	.ENDC
	DAC	VPMODE
	JMP	VPIOT
VPTAB1	ISZ VPTAB	/TEST TAB
	SKP
	JMP VPTB1	/ALL DONE
	LAC VPXPOS
	TAD VPSPAC	/ADD A SPACE
	DAC VPXPOS
	JMP VPTAB1
VPEOL	DZM	VPIOBY		/CLEAR I/O BUSY
	ISZ	VPINTF		/RETURN FROM INTERRUPT
	JMP	VPCAL2		/NO; CAL INSTRUCTION
	JMP	VPEOL1		/RETURN FROM INTERRUPT
	.EJECT
/ROUTINE TO UNPACK IOPS ASCII TO IMAGE ASCII
VPUNPK	XX
	LAW	-7
	DAC	VP7BTS		/SET UP COUNTER FOR 7 BITS
VPALL7	LAC	VPWRD3		/LOAD FIRST WORD
	RAL
	DAC	VPWRD3
	LAC	VPWRD2		/LOAD RECORD WORD
	RAL
	DAC	VPWRD2
	LAC	VPWRD1
	RAL
	DAC	VPWRD1		/UNPACKED CHARACTER
	ISZ	VP7BTS		/CHECK IF SEVEN BITS ARE DONE
	JMP	VPALL7		/ROTATE AGAIN
	JMP*	VPUNPK		/CHARACTER IS UNPACKED - RETURN
	.EJECT
/SCALE ROUTINE TO SET UP LF,SPACE, AND DELTA
VPSCAL	XX
	AND	(370000		/PICK UP SCALE
	RCL; RTL; RTL; RTL		/GET SCALE IN BITS 13-17
	DAC	VPDEL		/DELTA
	CMA
	TAD	(1		/SET UP A COUNTER
	DAC	VPCNT
	DZM	VPLF
	DZM	VPSPAC
VPMORE	LAC	VPLF		/GET CORRECT LINE FEED ACCORDING
	TAD	(-11		/TO THE SCALE USED
	DAC	VPLF
	LAC	VPSPAC		/GET CORRECT SPACE ACCORDING
	TAD	(7		/TO THE SCALE USED
	DAC	VPSPAC
	ISZ	VPCNT		/TEST COUNTER
	JMP	VPMORE		/INCREMENT TO PROPER SCALE
	JMP*	VPSCAL		/0? RETURN
VPIMCR	DZM	VPXPOS		/X=0
	JMP	VPTB1		/GET ANOTHER CHARACTER
VPIMLF	LAC	VPLF		/YPOS=YPOS+LF
	TAD	VPYPOS
	SPA			/IF NEGATIVE OFF SCREEN
	JMP	VPFORM
	DAC	VPYPOS		/REPOSITON BEAM
	TAD	VPDEL		/ADD DELTA TO Y COORD
	DAC	VPYCRD		/
	JMP	VPNMPT		/GET ANOTHER CHARACTER
	.EJECT
VPIMSP	LAC	VPXPOS		/XPOS
	TAD	VPSPAC		/+SPACE
	DAC	VPXPOS
	JMP	VPNMPT		/GET ANOTHER CHARACTER
	.EJECT
VPINT	SKP			/PIC ENTRY
	JMP	VPAPI		/API ENTRY
	DAC	VPAC		/SAVE AC
	LAC	VPION		/ION INTO INTERRUPT RETURN SEQUENCE
	DAC	VPSW
	DAC	VPSW1
	LAC	(IOF
	DAC	VPSW2
	LAC*	(0		/PIC RETURN ADDR. IN LOC 0
	DAC	VPPC		/INTO RETURN PC
	JMP	VPSTOR
VPAPI	DAC	VPAC		/API ENTRY - SAVE AC
	LAC	VPINT		/GET RETURN ADDRESS
	DAC	VPPC		/SAVE IT
	LAC	(NOP		/DO NOT ALTER STATE OF PI
	DAC	VPSW		/ON AN API INTERRUPT AS WE CAN'T BE INTERRUPTED
	DAC	VPSW1
	DAC	VPSW2
	LAC	VPSKP		/RESTORE SKIP
	DAC	VPINT
VPSTOR	CLC			/SET INTERRUPT FLAG
	DAC	VPINTF
	CDDF			/CLEAR DISPLAY DONE FLAG
VPSW	ION			/THIS INSTRUCTION IS COMPUTED
	LAC	VPIOBY		/SEE IF HANDLER IS BUSY IN CASE
	SZA			/IGNORE INTERRUPT IF ERASE BUTTON PUSHED
VPIN10	XX
/VPIN10 GETS ONE OF THE FOLLOWING JUMPS DEPENDING ON EXPECTED ACTION
VPIN20	JMP	VPEOL		/CLEAR I/O BUSY
VPIN30	JMP	VPIT		/ANY MORE PTS
VPIN40	JMP	VPMPTS		/ANY MORE PTS FROM DUMP MODE
VPIN50	JMP VPDFF		/RETURN FROM FORM FEED.
	.EJECT
VPDCTB	.DSA	VPDCTB+1
	175115; 266336	/COMMERCIAL 'AT' (@)
	374110;	442376		/A
	377114;	462266		/B
	175014;	060242		/C
	377014;	060276		/D
	377114;	462301		/E
	376110;	442201		/F
	175015;	064262		/G
	376100;	402177		/H
	001017;	760200		/I
	141004;	020077		/J
	376101;	210501		/K
	377004;	020100		/L
	376020;	600577		/M
	376020;	202177		/N
	175014;	060276		/O
	376110;	442206		/P
	175015;	050336		/Q
	376111;	452306		/R
	115114;	462262		/S
	002017;	740201		/T
	177004;	020077		/U
	076404;	010037		/V
	376401;	410177		/W
	306240;	405143		/X
	006047;	401003		/Y
	303214;	461303		/Z
	001774;	060200		/[
	004040;	404040		/\
	001014;	077600		/]
	020067;	741410		/^
	020340;	402010		/BACK ARROW
	0;	0;		/SPACE
	000005;	740000		/!
	000070;	001600		/"
	121761;	217612		/#
	115117;	762262		/$
	106230;	431142		/%
	155115;	310120		/&
	0;	340000		/'
	000342;	120200		/(
	001012;	107000		/)
	050103;	702024		/*
	020103;	702010		/+
	660700;	0		/,
	020100;	402010		/-
	301400;	0		/.
	100200;	401002		//
	175014;	057400		/0
	001027;	760000		/1
	345114;	462306		/2
	103114;	662661		/3
	060241;	137620		/4
	137114;	462261		/5
	175114;	462262		/6
	202411;	042207		/7
	155114;	462266		/8
	115114;	462276		/9
	331540;	0		/:
	666730;	0		/;
	000101;	210400		/<
	120502;	412050		/=
	000421;	202000		/>
	004015;	441400		/?
	.EJECT
VPCALP	0			/CAL POINTER
VPARGP	0				/ARGUMENT POINTER
VPAC	0			/SAVE AC IN INTERRUPT HANDLER
VPPC	0			/PIC RETURN
VPWRD1	0				/CHAR TO BE DISPLAYED
VPWRD2	0			/IOPS ASCII UNPACK
VPWRD3	0			/IOPS ASCII UNPACK
VPTEMP	0			/CHAR COUNTER IN  IMAGE AND IOPS ASCII
VPCNT	0			/SET UP IN VPSCAL
VPSPAC	0			/SET UP IN VPSCAL
VPLF	0			/SET UP IN VPSCAL
VPNEWP	0
VPDEL	0			/DELTA FOR PROPER SPACING
VP7BTS	0			/SET UP IN VPUNPK
VPCHAD	0			/FIRST WORD ADDRESS OF CHAR ARRAY
VPCNTW	0			/SET UP IN VPDISP
VPCNTB	0			/SET UP VPDISP
VPTEM	0
VPCNTD	0
VPXPOS	0			/X POSITION
VPYPOS	0			/Y POSITON
VPPICS	0			/PIC STATUS
VPINTF	0			/-1 WHEN PROCESSING INTERRUPT
VPARGQ	0			/RETURN PC ON .WRITE OR .INIT CAL
VPION	ION			/TURN PIC ON CONSTANT
VPWCNT	0		/WORD COUNT FOR IOPS ASCII
LSTFRM	0	/14 IF LAST CHAR. WAS FF, ELSE 0
	.END	VPA.