File: TECOVI.MA of Tape: OS8/OS8-Latest/new-15
(Source file text) 

/3 I/O OVERLAY FOR TECO

/ 10-APR-79	TEST FOR : WASN'T RE-ENTRANT

	.EXTERNAL QOVRLC,EOVRLC,XOVRLC,FOVRLC
	.EXTERNAL QCHK,QUOTST,SORT,TSTSEP,ERR,UPPERC
	.ZTERNAL NAME,ZM10,Z6,SCHAR,Z77,Z200,NMT,NFLG
	.EXTERNAL GETUSR,PUSHJ,ECDISM
	.ZTERNAL ERROR,OUTR,R,EBFLG,OUTHND,ODEV
	.EXTERNAL OCNT,OMAXLN,OUNAM,DECPUT,OSETP,STECO1,STECO2,IBLK
	.ZTERNAL INHND,ICRCNT,REND,INRCNT,QPTR,ZIREST,CLNF
	.EXTERNAL POPJ,NNEW13

	.GLOBAL IOVRLY
	.GLOBAL CHR.EB,CHR.ER,CHR.EW
	.GLOBAL OUHNDL

	TWOO=CLA STL RTL
	MTWO=STA CLL RAL
	OSDCBT=7760		/OS/8 DEVICE CONTROL TABLE -  IN FIELD 1

	.ENABLE 7BIT

	.MACRO	.ERROR	ERNUM
	.GLOBAL ERR'ERNUM
ERR'ERNUM:	ERR
	.ENDM

	.MACRO	.SORT	ARG1,ARG2
	SORT;	ARG1;	ARG2-ARG1
	.ENDM
	.ASECT TECOVI

	*3200

IOVRLY,	0
	QOVRLC
	EOVRLC
	XOVRLC
	FOVRLC

	/SUBROUTINE TO DO LOOKUPS AND ENTERS (LINK CRITICAL ON ENTRY)

OPEN,	0		/CALLED WITH MONITOR CODE - 2 IN AC
	DCA	RSTSW	/ENTER OR LOOKUP
	SZL CLA		/IF THIS IS THE OUTPUT SIDE OF AN "EB" COMMAND,
	JMP	DEVLOD	/SKIP THE STATEMENT SCAN
	QCHK
	TAD	DSKNAM	/PACKED SIXBIT FOR 'DSK:'
	DCA	DEVC
	TAD	(":	/RESTORE :
NGOM1,	DCA	DEVCOL
	DCA	NAME	/CLEAR NAME
	DCA	NAME+1
	DCA	NAME+2
	MTWO
	DCA	PERDSW
NAMCM1,	DCA	NAMCNT
NAMEC,	QUOTST		/GET CHAR AND TEST FOR ALTM
	JMP	DEVQOT	/ALTM - END OF NAME
	.SORT	DEVLST,DEVTAB	/CHECK SPECIAL CHARS ([,:. AND SPACE
	TSTSEP		/NO, SEE IF ALPHANUMERIC
	.ERROR	08	/ILLEGAL CHAR
	TAD	NAMCNT
	TAD	ZM10
	SMA CLA		/MORE THAN 6 CHARS?
	JMP	NAMEC	/YES, IGNORE
	TAD	NAMCNT	/NO, PACK IT
	TAD	Z6	/*K* (ALSO *K*) NEW FOR SYMBIONT KLUDGE
	CLL RAR
	DCA	TEMP1	/*K* NOTE ASSUMPTION NAME STARTS AT LOC 3!
	TAD	SCHAR
	UPPERC		/** "UPPERC" ALWAYS COMPLEMENTS LINK
	AND	Z77
	SNL
	JMP	2$
	CLL RTL
	RTL
	RTL
2$:	TAD I	TEMP1
	DCA I	TEMP1
	ISZ	NAMCNT
	JMP	NAMEC

PERD,	ISZ	PERDSW	/FOUND A PERIOD
	TAD	NAME
	SNA CLA		/ERROR IF WE HAVE
	JMP	ERR08	/DOUBLE PERIODS OR NO FILE NAME
	DCA	DEVCOL	/DEVICE NO LONGER LEGAL
	DCA	NAME+3	/ZERO EXTENSION OUT
	TAD	Z6	/AND SET POINTER TO 6TH CHARACTER
	JMP	NAMCM1

COLON,	TAD	NAME+1
	SNA		/WE MUST PACK THE NAME INTO ONE WORD OURSELVES
	JMP	2$	/BECAUSE IF "OPEN" IS CALLED FROM THE OUTPUT
	TAD	NAME	/SIDE OF AN "EB" COMMAND, WE SKIP
	SMA CLA		/THE NAME COLLECTOR.(WITH GOOD REASON -
	CLL CML RAR	/THE USR OVERLAYS THE COMMAND LINE).
	TAD	NAME+1	/SINCE THE OS/8 "ASSIGN" CALL TO THE USR
2$:	TAD	NAME	/REPLACES THE 2ND NAME WORD WITH THE DEVICE
	DCA	DEVC	/NUMBER, ALL NAME INFO MUST BE HELD IN WORD 1.
	JMP	NGOM1	/DEVICE NAME STORED - RESET FOR FILE NAME

DEVLST,	".
DEVCOL,	":		/CHANGED TO 0 AFTER FIRST : FOUND
	"/
DSKNAM,	5723		/=0423+1300+4000 - SERVES AS LIST TERMINATOR
DEVQOT,	ISZ	PERDSW	/IF WE NEVER SAW A PERIOD,
	DCA	NAME+3	/WIPE OUT THE EXTENSION
	JMS I	(GETUSR	/BRING USR INTO CORE

DEVLOD,	TAD I	OPEN	/MOVE HANDLER ADDRESS
	DCA	DEVHND
	ISZ	OPEN	/AND BUMP POINTER
	TWOO
	TAD	RSTSW
	DCA	CODE	/ENTER OR LOOKUP
	CIF 10		/AND RESET TABLES
	JMS I	Z200
	13
RSTSW,	0		/DON'T ZAP OPEN FILES ON INPUT
			/0 IS LOOKUP, 2 IS ENTER
	DCA	DEVNO	/ZERO SECOND NAME WORD
	CIF 10
	JMS I	Z200
	1		/ASSIGN HANDLER
DEVC,	0
DEVNO,	0
DEVHND,	0
	JMP	OPNERR	/ERROR - KICK USR OUT FIRST
	TAD	(3	/*K* SAVED MANY LOCATIONS WHEN NAME HAD TO BE AT 0!
	DCA	STBLK
	TAD	RSTSW	/GET LOOKUP-ENTER SWITCH
	TAD	NAME	/IF NAME IS NULL AND THIS IS A LOOKUP,
	SNA CLA
	JMP	OPSUCC	/IT JUST SUCCEEDED
	TAD	DEVNO	/DEVICE #
	CIF 10
	JMS I	Z200
CODE,	0		/ENTER OR LOOKUP
STBLK,	0		/FILLED WITH STARTING BLOCK
TEMP1,
FLN,	0		/FILLED WITH -LENGTH
/**** CHECK IF AC MUST = 0
	JMP 	OPNERR	/ERROR
OPSUCC,	TAD	DEVHND	/HANDLER ADDRESS IN AC
	JMP I	OPEN
PERDSW,	7777		/FLIP FLOP FOR EXTENSION
NAMCNT,	0		/CHARACTER COUNT
OPNERR,	TAD	RSTSW	/WE SHOULD ONLY KILL THE OUTPUT FILE
	SNA CLA
	JMP	LUKERR	/IF THIS IS AN OUTPUT ERROR
EBERR,	TAD	ERROR
	DCA	OUTR
DISERR,	PUSHJ
PECDSM,	ECDISM		/DISMISS THE USR
	.ERROR	16

LUKERR,	DCA	NMT
	PUSHJ
		ERVAL
	TAD	NFLG	/SEE IF NUMBER WAS CREATED
	SMA CLA
	JMP	DISERR	/NO, GIVE ERROR MESSAGE
	JMP I	PECDSM	/YES, RETURN VALUE

DEVTAB,	PERD		/.
	COLON		/:
	SWITCH		//
	PAGE
	.SBTTL	Cmd EB

CHR.EB,	CLA CMA CLL	/"EDIT BACKUP" COMMAND WITH LINK CLEAR
	PUSHJ		/USE 'ROPEN' TO SET POINTERS
		CHR.ER	/WITHOUT KICKING OUT THE USR (AC=-1 ON ENTRY)
	TAD I	(DEVNO	/DEVICE #
	TAD	(OSDCBT-1
	DCA	R
	CDF 10
	TAD I	R	/GET DEVICE CODE FROM DCB TABLE
	CDF
	SMA CLA		/NEGATIVE IF FILE-STRUCTURED
	JMP I	(EBERR	/YOU CAN'T DO THAT!
	TAD	NAME+3	/EXTENSION
	TAD	(-'BK
KSNA,	SNA
	JMP I	(EBERR	/CAN'T EB A .BK FILE
	TAD	DOTBK	/RESTORE EXTENSION
	DCA	R	/SAVE IT
	TAD	DOTBK	/.BK EXTENSION
	DCA	NAME+3
	CIF 10
	TAD I	(DEVNO	/DEVICE #
	JMS I	Z200	/DELETE THE OLD BACKUP
	4
	NAME
	0
DOTBK,	'BK		/WHO CARES IF IT'S NOT THERE?
	TAD	R	/OLD EXTENSION
	DCA	NAME+3
	CLA STL IAC	/SET EDIT BACKUP FLAG AND DO AN "ENTER"
	SKP		/LINK MUST BE SET HERE FOR OPEN

	.SBTTL	Cmd EW

CHR.EW,	CLL
	DCA	EBFLG	/LINK NORMALLY 0 WHEN GOTTEN HERE
/	RAL
/	DCA T$
/	TAD	OUTR
/	CIA
/	TAD	ERROR
/	SZA CLA
/	.ERROR 38	/?OFO
/	TAD	T$
/	RAR
	CLA IAC		/OPEN OUTPUT FILE
	JMS I	(OPEN	/ENTER CODE IN AC
OUHNDL,		4001	/HANDLER ADDRESS
	DCA	OUTHND	/HANDLER ENTRY
	TAD I	(DEVNO
	DCA	ODEV	/SAVE DEV #
	DCA I	(OCNT	/CLEAR BLOCK COUNT
	TAD I	(FLN
	DCA I	(OMAXLN	/MAXIMUM FILE LENGTH
	TAD	NAME
	DCA I	(OUNAM
	TAD	NAME+1
	DCA I	(OUNAM+1
	TAD	NAME+2
	DCA I	(OUNAM+2
	TAD	NAME+3
	DCA I	(OUNAM+3
	TAD	(DECPUT
	DCA	OUTR	/ENABLE CHARACTER OUTPUT ROUTINE
	TAD	(ECDISM
	DCA I	(DECPUT	/FAKE RETURN FROM CHAR I/O ROUTINE
	TAD I	(STBLK
	JMP I	(OSETP
	.SBTTL	Cmd ER

CHR.ER,	DCA	QPTR	/ENTERED WITH AC=-1 IF MONITOR IS TO BE KEPT
	TAD	(SNL
	DCA I	(STECO1
	TAD	KSNA
	DCA I	(STECO2
	CLL STA
	DCA	NMT
	JMS I	(OPEN	/LOOKUP CODE IN AC
INHNDL,		7201	/HANDLER ADDRESS
	DCA	INHND	/SAVE HANDLER ENTRY
	STA
	DCA	ICRCNT	/POINTER
	STA
	DCA	REND	/CLEAR END-OF-FILE FLAG
	TAD I	(STBLK
	DCA I	(IBLK	/FIRST BLOCK
	TAD I	(FLN
	DCA	INRCNT	/SET UP INPUT FILE LENGTH
	PUSHJ
		ERVAL
	ISZ	QPTR	/SHOULD WE DISMISS THE MONITOR?
	JMP I	(ECDISM	/YES - KICK THE USR OUT AND POPJ
	JMP I	ZIREST	/EXIT
ERVAL,	ISZ	CLNF	/WAS THERE A : ON ER OR EB?
LSKIP,	SKP		/NO
	JMP	MAKNUM	/YES
	DCA	CLNF	/RESET COLON FLAG
	POPJ
MAKNUM,	TAD	NMT
	JMP I	(NNEW13
SWITCH,	QUOTST
SKPCLA,	SKP!CLA		/FILENAME ENDS WITH SLASH
	UPPERC
	TAD	(-"S
	SZA CLA
	.ERROR	28	/UNDEFINED I/O SWITCH
	TAD	SKPCLA
	DCA I	(STECO1
	TAD	LSKIP
	DCA I	(STECO2
	JMP I	(NAMEC
	PAGE