File: LINK.PA of Tape: OS8/OS8-V40/v40-9
(Source file text) 

/ASCII/IMAGE LINK HANDLER FOR BATCHL
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1980   BY DATAPLAN GMBH, LAUDA, BRD
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DATAPLAN GMBH.
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR ANY ERRORS THAT MAY APPEAR
/IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DATAPLAN'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DATAPLAN.
/
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DATAPLAN.
/
/
/
/
/
/
/
/
/
/
/
/WVDM, DP, ZURICH, 1-JAN-80
	*0

	-2
	DEVICE LINK;DEVICE LKA;600;LKA&177+4000;ZBLOCK 2
	DEVICE LINK;DEVICE LKI;600;LKIF&177+4000;ZBLOCK 2

	LKAVERSION="M&77
	LKIVERSION="M&77
	*200

LKA70,	70	/**KEEP HERE**
LKA,	LKAVERSION
	STL CLA RAR	/4000
	TAD I LKA	/RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK
	AND L3700	/EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER
	CMA		/GET COUNT+1
	DCA BUFSIZ	/STORE AWAY
	RDF		/FIND OUT THE USER'S DATA FIELD
	TAD CIFCDF	/FORM OUR EXIT CIF CDF
	DCA LKAXIT	/STORE AWAY FOR EXIT ROUTINE
	TAD  I	LKA	/GET FUNCTION WORD
LKA200,	AND	LKA70	/ISOLATE FIELD OF BUFFER
	TAD LKACDF	/FORM CDF TO FIELD OF BUFFER
	DCA TTCDBF	/STORE WHERE IT WILL BE USEFUL
	ISZ	LKAEOF	/AT SAME TIME, INITIALIZE LKAEOF
	ISZ LKA		/POINT TO BUFFER ADDRESS
	TAD I LKA	/AND GET IT
	DCA LKACA	/AND SAVE IT
	ISZ LKA		/POINT TO BLOCK #
	ISZ LKA		/POINT TO ERROR RETURN
	RAR
	DCA	LKAWC	/SAVE IN/OUT STATUS
CIFCDF,	CIF CDF
	TAD I	BATLOC	/CHECK IF UNDER BATCH
	RAL
	SMA CLA
	JMP	LKAERR	/NO; TOO BAD!
	TAD I	BATLOC	/YES
	AND	LKA70
	TAD	CIFCDF	/YES; GET BATCH FIELD
	DCA	BFLD
	STL RAR		/WRITE NOTHIHG FOR SETTING DF
	JMP	TELP
LKALP,	TAD	LKAWC	/WAS IT WR OR RD?
	RAL
	SNL CLA		/LINK=1 MEANS OUTPUT
	JMP LKAGET	/INPUT IS FROM LKA:
/LINK MUST BE SET FIRST TIME THROUGH HERE.
/IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER
ROTL,	RTL
	RTL
	SPA		/DO WE HAVE 8 BITS SHIFTED IN?
	JMP TELP
	DCA SHIFT	/SAVE SHIFT REGISTER
	TAD I LKACA
	SZA
	JMS HCORE	/PRINT A CHARACTER
	TAD I LKACA
	ISZ LKACA	/BUMP INPUT POINTER
TT7400,	7400		/PROTECT ISZ
	AND TT7400
	CLL RAL
	TAD SHIFT	/SHIFT HIGH ORDER 4 BITS INTO
	JMP ROTL	/SHIFT REGISTER
TELP,	JMS HCORE	/PRINT 3RD CHARACTER OF DOUBLE-WORD
LKAKLG,	ISZ BUFSIZ	/DONE?
	JMP LKALP	/NOT YET
LKAX,	TAD LKAEOF	/IF INPUT AND WE WERE PADDING WITH 0'S
LKARTN,	SZA SMA		/TAKE SOFT ERROR EXIT
	ISZ LKA		/POINT TO NORMAL RETURN
	AND	LN4000	/KEEP HARD ERROR ON INPUT OR OUTPUT
LKAXIT,	HLT		/RETURN TO USER'S FIELD
	JMP I LKA	/RETURN TO USER
LKAERR,	STL CLA RAR
	JMP	LKAXIT
LKAWC,	0
BUFSIZ,	0
LKACA,	0
SHIFT,			/OUTPUT SHIFT REGISTER
LKAEOF,	0		/0 IF SAW ^Z AND WISH TO PAD BUFFER WITH 0'S
HCORE,	0		/SUBROUTINE FOR HIGH CORE ACCESS
	SNA
	JMP	BFLD	/ITS INPUT
	AND	LKA177
	SNA
	JMP	TTCDBF	/DON'T PRINT NULLS
	TAD	LKAM32	/CHECK FOR EOF
	SNA
	TAD	LKA200	/CONVERT TO 8-BIT CONTROL
	TAD	LKA32
BFLD,	HLT		/SET BATCH FIELD - CIFCDF!
	DCA	LTEMP
	TAD I	VFYLKA	/CHECK IF HIGH-CORE STILL OK
	DCA	HLINK	/POINTER TO LINK CHECK
	TAD I	HLINK
	TAD	MWVDM
	SZA
	CIF CDF		/NO RESET TO F 0
	SZA CLA
	JMP	LKAERR
	ISZ	HLINK	/NEXT WORD IS ADRESS OF
	TAD I	HLINK	/THE I/O ROUTINE IN HIGH CORE
	DCA	HLINK
	TAD	LTEMP
	JMS I	HLINK	/CALL HIGH CORE
	JMP LKARTN	/GO AWAY, WE SAW A ^Z OR ERROR=4000
TTCDBF,	HLT		/CDF BUFFER FIELD
	JMP I HCORE	/RETURN

LTEMP,	0
HLINK,	0
LN4000,	4000
VFYLKA,	5601		/**VOLATILE** FOR BATCHL.PA V 1A
MWVDM,	-2715		/**-WM**
LKA177,	177
LKAM32,	-32
LKA32,	32
LKAGET,	TAD BUFSIZ
	CLL RAL		/CONVERT DOUBLE-WORDS TO WORDS
	DCA LKAWC	/SET SIZE OF BUFFER
TSTEND,	TAD LKAEOF
	SNA CLA
	JMP ZERO
	JMS	HCORE	/CALL HCORE TO GET A CHARACTER
	AND	LKA177
	TAD	LKAM32	/-^Z
	SNA		/EOF?
	DCA	LKAEOF	/YES, SET FLAG
	TAD	LKA32	/RESTORE
	TAD	LKA200	/ADD PARITY BIT FOR OS/8
ZERO,	DCA I LKACA	
	ISZ	LKACA	/NEXT LOC
L3700,	3700
	ISZ LKAWC	/IS BUFFER FULL?
	JMP	TSTEND	/NO - LOOP
	JMP LKAX	/YES, GET OUT

LKACDF,	CDF 0
BATLOC,	7777
	ZBLOCK 374-.
LKIF,	LKIVERSION	/FAKE ENTRYPOINT TO LKI
	CLA CLL		/JUST SO IT IS IN FIRST PAGE
	TAD	LKIF	/TRANSPORT CALL TO SECOND PAGE
	SKP

LKI,	LKIVERSION	/MUST BE ON PAGE BOUNDARY (LKIEND)
	DCA	LKI	/WE CAME IN WITH CALL IN AC!
	CLA STL RAL	/CLEAR AC FROM USER
	DCA	LKIEOF	/INIT TO NO EOF=1
	TAD I LKI	/RETRIEVE FUNCTION WORD
	AND L7700	/EXTRACT NUMBER OF WORDS TO TRANSFER
	CLL RAL		/AND PUT R/W BIT IN LINK
	SNA		/A TRANSFER OF 0 MEANS EOF V3 ETC.
	DCA	LKIEOF	/SET FLAG SO WE KNOW
	CMA		/GET COUNT+1
	DCA LKIWC	/STORE AWAY
	RDF		/FIND OUT THE USER'S DATA FIELD
	TAD CIFCD	/FORM OUR EXIT CIF CDF
	DCA LKIXIT	/STORE AWAY FOR EXIT ROUTINE
	TAD  I	LKI	/GET FUNCTION WORD
	AND	LKI70	/ISOLATE FIELD OF BUFFER
	TAD LKICDF	/FORM CDF TO FIELD OF BUFFER
	DCA HCCDBF	/STORE WHERE IT WILL BE USEFUL
	TAD	HCCDBF
	DCA	LKILP	/AND SOMEWHERE ELSE
	TAD	LKIRTN	/'SMA SZA'
	DCA	HCPAD	/RESET PAD ZEROES SWITCH
	ISZ LKI		/POINT TO BUFFER ADDRESS
	TAD I LKI	/AND GET IT
	DCA LKICA	/AND SAVE IT
	ISZ LKI		/POINT TO BLOCK #
	ISZ LKI		/POINT TO ERROR RETURN
	CML RAR		/MAKE 0 ON WRITE, 4000 ON READ
	DCA	LKIWR	/SAVE IN/OUT STATUS
LKICDF,	CDF 0
	TAD I	BATADD	/CHECK IF UNDER BATCH
	RAL
L7700,	SMA CLA
	JMP	LKIERR	/NO; TOO BAD!
	TAD I	BATADD	/YES
	AND	LKI70
	TAD	CIFCD	/YES; GET BATCH FIELD
	DCA	BFLD2
	JMP	LKIKLG	/JUMP INTO LOOP
LKILP,	CDF 0		/BUFFER DF IS STORED HERE
	TAD	LKIWR	/WAS IT WR OR RD?
	SPA CLA		/+ MEANS OUTPUT
	JMP LKIGET	/INPUT IS FROM LKI:
LKIPUT,	TAD I LKICA
	BSW		/LEFT HALF FIRST
	AND LKI77
	TAD	LK4000	/SO THAT NULLS CAN BE WRITTEN
	JMS HCORE2
	TAD I LKICA
	AND	LKI77	/RIGHT HALF SECOND
	TAD	LK4000
	JMS HCORE2
	JMP	LKIADV
LKIGET,	JMS	HCORE2
	BSW
	DCA I	LKICA
	JMS	HCORE2
	TAD I	LKICA
	DCA I	LKICA
LKIADV,	ISZ LKICA	/BUMP INPUT POINTER
LKI70,	70		/PROTECT ISZ
LKIKLG,	ISZ LKIWC	/DONE?
	JMP LKILP	/NOT YET
	TAD	LKIWR	/IF WRITE OPERATION
	TAD	LKIEOF	/AND EOF FLAG SET
	SZA CLA		/WE HAVE A REAL EOF?
	JMP	LKIX	/NO, GET NEXT BUFFER-FULL
	TAD	LK4232	/YES, WRITE CONTROL EOF
	JMS	HCORE2	/WILL RECEIVING PROG. DELETE IT?
/	-------------	/NO RETURN; GOES TO LKIRTN
LKIX,	TAD LKIEOF	/IF INPUT AND WE WERE PADDING WITH 0'S
LKIRTN,	SZA SMA		/TAKE SOFT ERROR EXIT
	ISZ LKI		/POINT TO NORMAL RETURN
	AND	LK4000	/KEEP HARD ERROR ON INPUT OR OUTPUT
LKIXIT,	HLT		/RETURN TO USER'S FIELD
	JMP I LKI	/RETURN TO USER
LKIERR,	STL CLA RAR
	JMP	LKIXIT
LKIWC,	0
LKICA,	0
LKIEOF,	1		/0 IF SAW ^Z AND/OR PADDING BUFFER WITH 0'S
LKIWR,	0
HCORE2,	0		/SUBROUTINE FOR HIGH CORE ACCESS
HCPAD,	SZA SMA		/IS PATCHED WITH 'CLA2' ON INPUT EOF
	JMP	HCCDBF	/SKIPS ALWAYS;INPUT 0, OUTPUT -
BFLD2,	HLT		/SET BATCH FIELD - CIFCD!
	DCA	LTEMP2
	TAD I	VFYLKI	/CHECK IF HIGH-CORE STILL OK
	DCA	HLINK2	/POINTER TO LINK CHECK
	TAD I	HLINK2
	TAD	MWVDM2
	SZA
CIFCD,	CIF CDF		/NO, RESET TO F 0
	SZA CLA
	JMP	LKIERR
	ISZ	HLINK2	/NEXT WORD IS ADRESS OF
	TAD I	HLINK2	/THE I/O ROUTINE IN HIGH CORE
	DCA	HLINK2
	TAD	LTEMP2
	JMS I	HLINK2	/CALL HIGH CORE
	JMP LKIRTN	/GO AWAY, WE SAW A ^Z ON OUTPUT
			/EOF=1 OR ERROR=4000
	TAD	LKM232	/DID WE GET EOF ON INPUT?
	SNA
	JMP	LKIPAD	/YES, WRITE BUFFER ^Z0000...
	TAD	LKI232	/NO, RESTORE VALUE
HCCDBF,	HLT		/CDF BUFFER FIELD
	JMP I HCORE2	/RETURN

LKIPAD,	TAD	LK7600	/SET HCORE2 TO READ 0'S
	DCA	HCPAD	/WILL BE RESET ON NEXT ENTRY
	DCA	LKIEOF	/SET FOR SOFT ERROR
	TAD	HCORE2
	AND	LK7600	/GET PAGE BOUNDARY
	TAD	LKIEND	/SET RETURN ADRESS OF HCORE2
	DCA	HCORE2	/IN ORDER TO SET DF
	JMP	HCCDBF-1/AND STORE ONE ^Z
LKIEND,	LKIADV-1-LKI	/IF LKI ON PAGE BOUNDARY

LTEMP2,	0
HLINK2,	0
LK4000,	4000
VFYLKI,	5601		/**VOLATILE** FOR BATCHL.PA V 1A
MWVDM2,	-2715		/**-WM**
LKM232,	-232
LKI232,	232
LK4232,	4232
LKI77,	77
LK7600,	7600
BATADD,	7777
	PAGE
	$$$