/ 
/ 
/                   FIRST PRINTING, FEBRUARY 1974
/ 
/ THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO 
/ CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED
/ AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
/ DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPON-
/ SIBILITY FOR ANY ERRORS THAT MAY APPEAR IN THIS
/ DOCUMENT.
/ 
/ THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FUR-
/ NISHED TO THE PURCHASER UNDER A LICENSE FOR USE ON
/ A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH
/ INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR 
/ USE IN SUCH SYSTEM, EXCEPT AS MAY OTHERWISE BE PRO-
/ VIDED IN WRITING BY DIGITAL.
/ 
/ DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/ FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIP-
/ MENT THAT IS NOT SUPPLIED BY DIGITAL.
/ 
/ COPYRIGHT (C) 1974, 1975, BY DIGITAL EQUIPMENT CORPORATION
/ 
/ 
        .EJECT
/THIS IS THE DEVICE-HANDLER FOR THE VW01
/	SONIC DIGITIZER WRITING TABLET
/
/COPYRIGHT 1971,72 DIGITAL EQUIPMENT CORP. MAYNARD, MASS.
/EDIT # 003;	OCT. 9,72
/EDIT # 004	SCR	8/12/75	XVM MESSAGE;GENERAL FIX-UP
/EDIT # 005	SCR	8/13/75	DISABLE BIT PATTERN 142 TO 242
/
/
/LEGAL MACRO'S:
/	.INIT	PROVIDES FOR SOFTWARE INTERRUPT
/		VIA A.P.I. (ADDRESS 73)
/
/	.READ A,M,L,W
/		M (MODE)=0: SINGLE POINT.
/			1: SINGLE POINT MULTIPLEXED.
/			2: DATA INPUT (NOT SCAN!)
/			3: DATA INPUT MULTIPLEXED (SCAN!)
/		L (LINE BUFFER ADDRESS) 
/			POINTER TO 3-WORD BUFFER
/		W (NUMBER OF COORDINATE PAIRS)
/		  EACH COORDINATE PAIR IS REPRESENTED
/		  BY 3 WORDS - STATUS, X & Y.
/
/	.WAIT
/
/	.WAITR
/
/	.CLOSE
/
/	.FSTAT
/
/ALL OTHER MACRO'S WILL BE IGNORED BY THIS HANDLER
/
/
	.EJECT
/WRITING TABLET IOT'S
/
WTSC=703224	/SET WRITING TABLET CONTROL.
WTRX=703222	/READ X-COORDINATE.
WTRY=703242	/READ Y-COORDINATE.
WTRS=703262	/READ STATUS.
WTCD=703241	/CLEAR DATA READY FLAG.
WTCP=703221	/CLEAR PEN DATA FLAG.
WTSK=703261	/WRITING TABLET SKIP.
WTSE=703264	/SELECT TABLET.
/
EXERR=137	/EXPANDED-ERROR PROCESSOR
.MED=3		/REGULAR ERROR PROCESSOR
/
	.EJECT
	.GLOBL VWA.
VWA.	DAC	VWCALP	/SAVE CAL-POINTER.
	DAC	VWARGP	/SAVE ARGUMENT POINTER.
	ISZ	VWARGP	/SET PNTR TO FUNCTION-CODE.
	LAC*	VWARGP	/GET UNIT #.
	RTL
	RTL
	AND (3
	DAC UNIT#
	LAC* VWARGP	/GET FUNCTION CODE
	AND	(17	/SELECT FUNCTION-BITS.
	ISZ	VWARGP	/SET UP FOR LOC+2
	TAD	(JMP VWDISP	/SET UP DISPATCH.
	DAC	.+1
VWDISP	0		/FUNCTION-DISPATCH!
	JMP	VWINIT	/01=.INIT
	JMP	VWFST	/02=.FSTAT
	JMP	VWIGNR	/03=.SEEK    (IGNORED)
	JMP	VWIGNR	/04=.ENTER   (IGNORED)
	JMP	VWRET	/05=.CLEAR   (IGNORED)
	JMP	VWCLOS	/06=.CLOSE
	JMP	VWRET	/07=.MTAPE   (IGNORED)
	JMP	VWREAD	/10=.READ
	JMP	VWILLG	/11=.WRITE   )IGNORED)
	JMP	VWWAIT	/12=.WAIT,.WAITR
	ISZ	VWARGP	/13=.TRAN    (IGNORED)
VWILLG	ISZ	VWARGP
	JMP	VWIGNR
/
/
VWCALP	0		/CAL-POINTER
VWARGP	0		/ARGUMENT-POINTER
/
/
	.EJECT
/FOLLOWING THE SERVICE FOR THE MACRO .INIT AND .CLOSE
/
VWINIT	ISZ	VWARGP	/(004)MAKE VWARGP COMMON WITH CLOSE
	ISZ	VWARGP	/(004)
VWCLOS	DZM	VWIOB	/(004) TURN OFF ALL
	WTCD		/(004) CLEAR DATA READY FLAG
	WTCP		/(004) CLEAR PEN DATA FLAG
	LAC	(242	/(005) CDISABLE INTERRUPTS
	WTSC		/(004)
/
VWCAL	CAL+73		/.SETUP FOR PIC AND APICHANNEL 73
VWBUFF	16
	WTSK	/WRITING TABLET SKIP.
	VWINT		/ADDRESS OF INTERRUPT-HANDLER.
	LAC	(JMP VWRET	/SKIP .SETUP NEXT TIME.
	DAC	VWCAL
VWRET	DBR
	XCT	(JMP* VWARGP	/RETURN PAST CAL.
/
/
VWBUSY	DBR
	XCT	(JMP* VWCALP	/RETURN TO CAL.
/
/
/
	.EJECT
/FOLLOWING THE SERVICE FOR THE MACR0'S:
/	.FSTAT,.DLETE,.RENAM !
/.DLETE AND .RENAM WILL BE IGNORED!
/
/
/
VWFST	LAC*	VWCALP	/GET CAL.
	AND	(3000	/SELECT SUB-FUNCTION BITS.
	SAD	(3000	/TEST FOR .FSTAT!
	SKP		/.FSTAT!
	JMP	VWIGNR	/.DLETE OR .RENAM !
	LAC*	VWARGP	//CLEAR BITS 0-2 OF LOC+2
	AND	(77777	//INDICATING THAT IT IS A
	DAC*	VWARGP	//NON-FILE ORIENTED DEVICE.
	CLA		/AC=0: FILE NOT FOUND.
	JMP	VWIGNR
/
/
/
	.EJECT
/FOLLOWING THE SERVICE FOR THE MACRO .READ !
/
/
/
VWREAD	LAC	VWIOB	/GET BUSY FLAG.
	SZA		/BUSY?
	JMP	VWBUSY	/YES
	DZM	VWMXC	/RESET MULTIPLEX MODE FLAG.
	LAC*	VWARGP	/GET BUFFER-ADDRESS!
	DAC	VWIOB	/SET HANDLER BUSY FLAG!
	DAC	VWBUFF	/STORE BUFFER-ADDRESS.
	AND	(700000	/(004) CHECK LEGAL ADDR IN LOW CORE
	SZA		/(004) SKIP IF OK
	JMP	IOP67	/(004) NO, MESSAGE
	ISZ	VWARGP	/LOC+3
	LAC* VWARGP
	DAC WPCOUNT
	LAC*	VWCALP	/GET CAL FOR THE MODE!
	AND	(3000	/SELECT MODE BITS.
	SWHA		/PUT MODE BITS IN AC BITS 15-17
	TAD	(JMP VWMODE+1
	DAC	.+1	/DISPATCH FOR THE MODES.
VWMODE	0		/DISPATCH LOCATION FOR MODES.
	JMP	VWSP	/SINGLE POINT!
	JMP	VWSPMX	/SINGLE POINT MULTIPLEXED!
	JMP	VWNOS	/NOT SCAN!
	JMP	VWSCAN	/SCAN!
WPCOUNT	0
/
//
/
	.EJECT
/SERVICE FOR THE SINGLE POINT AND NOT SCAN MODE.
/
/
VWSP	JMS GUNIT
	LAC VWSPC
	WTSC
	JMP VWTST
VWNOS	JMS GUNIT
	LAC	VWNOSC	/CONTROL VALUE FOR NOT SCAN.
	WTSC		/SET CONTROL.
	JMP VWTST
GUNIT	0
	LAC UNIT
	TAD	(LAC VWUSC	/PREPARE DISPATCH FOR THE RIGHT CODE.
	DAC	.+1
	0
	WTSE		/SELECT THE REQUESTED WRITING TABLET.
	JMP* GUNIT
/
/
/
	.EJECT
/SERVICE FOR THE SINGLE POINT MULTIPLEXED MODE.
/
VWSPMX	CLA
	WTSE		/CLEAR ALL TABLETS
	LAC VWSPC
	DAC VWMXC
	WTSC		/SELECT WRITING TABLET
	JMP VWTST
/
/
/SERVICE FOR SCAN MODE.
/
VWSCAN	LAC	VWSCC	/GET CONTROL VALUE FOR SCAN.
	WTSC		/SET CONTROL
	JMP	VWTST
/
/
VWTST	WTRS+10
	AND (170000
	SZA
	JMP VWIGNR
VWRTY1	LAW 4
	JMS* (EXERR
	JMP VWRTY
	LAW -4
	.SIXBT	' VW NOT RDY'
VWRTY	WTRS+10
	AND (170000
	SNA
	JMP VWRTY1
	DAC VWIOB
VWIGNR	ISZ	VWARGP	/(004) FIX ARGP FOR EXIT
	JMP	VWRET	/(004) AND GO EXIT
/
/
/
/
VWSPC	421		/WRITING TABLET ENABLE
			/DATA READY INTERRUPT ENABLE
			/SINGLE POINT ENABLE
VWNOSC	1131		/WRITING TABLET ENABLE
			/SCAN DISABLE = NOT SCAN ENABLE
			/DATA READY INTERRUPT ENABL
			/PEN DATA INTERRUPT ENABLE
VWSCC	1125		/WRITING TABLET ENABLE
			/SCAN ENABLE
			/DATA READY INTERRUPT ENABLE
			/PEN DATA INTERRUPT ENABLE
VWUSC	10		/WRITING TABLET 1 SELECT CODE
	10
	4
	2
	1
/
IOP67	LAW	67	/(004)ILLEGAL CORE MESSAGE
	JMP*	(.MED+1	/(004) TO MONITOR ERROR
/
/
/
	.EJECT
/FOLLOWING THE SERVICE FOR THE MACRO .WAIT
/
VWWAIT	LAC*	VWCALP	/GET CAL FOR SUB-FUNCTION
	AND	(1000	/SELECT FUNCTION-CODE BIT
	SZA		/.WAIT?
	JMP	VWWT10	/NO, IT IS .WAITR1
	LAC	VWIOB	/GET INTERRUPT BUSY.
	SZA		/INTERRUPT SERVICE STILL BUSY?
	JMP	VWBUSY	/YES!
	JMP	VWRET
/
/
/
/
/FOLLOWING THE SERVICE FOT THE MACRO .WAITR
/
VWWT10	LAC	VWIOB	/GET INTERRUPT BUSY FLAG.
	SNA		/INTERRUPT STILL BUSY?
	JMP	VWIGNR	/NO.
	LAC	VWCALP	/GET CAL-ADDRESS.
	AND	(700000	/SELECT "DEBREAK" BITS
	DAC	VWCALP	/STORE TEMPORARILY.
	LAC*	VWARGP	/GET WAIT-RETURN ADDRESS.
	AND	(77777	/STRIP OFF THE "DEBREAK" BITS.
	XOR	VWCALP	/INSERT "DEBREAK" BITS FROM CAL!
	DAC	VWARGP
	JMP	VWRET
/
/
/
	.EJECT
/THIS IS THE INTERRUPT HANDLER FOR THE WRITING TABLET.
/
/
/ENTRY SECTION FOR PIC.
/
VWPIC	DAC	VWAC	/(004) DELETE DBA!SAVE AC.
	LAC*	(0	/GET THE ADDRESS WHERE INTERRUPTED.
	DAC	VWPC	/STORE FOR PROPER RETURN.
	LAC	(ION	/GET ION COMMAND.
	JMP	VWNT10	/SHARE REST OF CODING WITH API.
/
/
/
/ENTRY SECTION FOR API.
/ONLY THE FIRST WORD IS USED BY PIC TO TRANSFER 
/CONTROL TO THE PIC-ENTRY
/
/
VWINT	JMP	VWPIC	/THIS IS THE ENTRYFOR PIC.
	DAC	VWAC	/(004)DELETE DBA!THIS IS THE FIRST WORD FOR API.
	LAC	VWINT	/GET ADDRESS WHERE INTERRUPTED.
	DAC	VWPC	/STORE FOR PROPER RETURN.
	LAC	(JMP VWPIC	/GET JUMP TO PIC.
	DAC	VWINT	/RESTORE ENTRY FOR PIC.
	LAC	(700000	/(004) IOT NOP FOR EXIT FROM API
VWNT10	DAC	VWION	/STORE ION OR NOP FOR RETURN.
	WTRS+10		/READ WRITING TABLET STATUS
	DAC*	VWBUFF	/STORE STATUS IN USER-BUFFER.
	ISZ	VWBUFF	/PRESET FOR BUFFER+1.
	WTRX+10		/READ X-COORDINATES.
	DAC*	VWBUFF	/STORE X-COORDINATES.
	ISZ	VWBUFF	/PRESET FOR BUFFER+2
	WTRY+10		/READ Y-COORDINATES.
	DAC*	VWBUFF	/STORE Y-COORDINATES.
	ISZ VWBUFF
	CLA	
	SAD	VWMXC	/SINGLE POINT MULTIPLEXED??
	SKP		/NO.
	WTSE		/CLEAR ALL WRITING TABLETS.
	WTCD		/CLEAR DATA READY FLAG.
	WTCP		/CLEAR PEN DATA FLAG.
	ISZ WPCOUNT
	JMP VWIRT
	LAC	(242	/(005) CHANGE 142 TO 242
	WTSC
	DZM	VWIOB	/CLEAR INTERRUPT SERVICE BUSY.
VWIRT	LAC	VWAC	/RESTORE AC.
VWION	0		/ION OR NOP COMMAND.
	DBR
	JMP*	VWPC	/RETURN TO INTERRUPTED PROGRAM.
/
/
/
VWMXC	0		/MULTIPLEX MODE FLAG
VWIOB	0		/BUSY FLAG FOR THE HANDLER.
VWAC	0		/STORAGE FOR AC.
VWPC	0		/RETURN ADDRESS.
/
/
/
/
	.END