Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/rts/ioed.mac
There are 2 other files named ioed.mac in the archive. Click here to see a list.
	SUBTTL	I/O editing routines

	SEARCH	SIMMAC,SIMMCR,SIMRPA
	SALL
	RTITLE	IOED
	MACINIT
	ERRMAC(IO)
	TWOSEG
	RELOC	400000

;AUTHOR:	Elisabeth Engstrom
;VERSION:	1
;PURPOSE:	Contains I/O editing routines:

intern	.IOIC	;Inchar
intern	.IOIF	;Infrac
intern	.IOII	;Inint
intern	.IOIR	;Inreal
intern	.IOIT	;Intext
intern	.IOOC	;Outchar
intern	.IOOF	;Outfrac
intern	.IOOI	;Outint
intern	.IOOR	;Outreal
intern	.IOOX	;Outfix
intern	.IOOT	;Outtext
intern	IOTXR	;[41] Return addr for calling TX GET routines
;


	EXTERN	.CSRA
	EXTERN	.CSSA.
	EXTERN	.IOFD
	EXTERN	.IOIG
	EXTERN	.IOLI
	EXTERN	.IOOG
	EXTERN	.SAAR
	EXTERN	.TXGC
	EXTERN	.TXGF
	EXTERN	.TXGI
	EXTERN	.TXGR
	EXTERN	.TXPF
	EXTERN	.TXPI
	EXTERN	.TXPR
	EXTERN	.TXPX
	EXTERN	.TXVA

QIOIMG==OFFSET(ZFIIMG)
QIOPOS==OFFSET(ZTVCP)+QIOIMG
	SUBTTL	IOIC


COMMENT;
PURPOSE:		IMPLEMENT INCHAR
ENTRY:			.IOIC
INPUT ARGUMENTS:	REG XTAC CONTAINING NUMBER OF XTOP
			REG XTOP CONTAINING REFERENCE TO FILE OBJECT
NORMAL EXIT:		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	REG XTOP CONTAINING CHARACTER
CALL FORMAT:		MOVEI	XTAC,XTOP
			EXEC	.IOIC
;

.IOIC:
	PROC
	;SAVE REGS
	EXCH	XWAC1,(XTAC)
	STACK	XTAC
	LF	XSAC,ZTVLNG(XWAC1,QIOIMG)
	LF	X0,ZTVCP(XWAC1,QIOIMG)
	IF	;NO MORE IN CURRENT IMAGE
		CAMGE	X0,XSAC
		GOTO	FALSE
	THEN
		;CODE DIFFERS FROM COMMON BASE TO MAKE IT
		;POSSIBLE TO READ /*
		IF
			;CHECK FOR END OF FILE
			IFOFF	ZIFEND(XWAC1)
			GOTO	FALSE
		THEN
			IOERR	20,INCHAR: end of file
			GOTO	IOIC1
		FI
		;GET ANOTHER IMAGE
		EXEC	.IOIG
		SETZ	X0,	;POS=1
	FI
	LF	XSAC,ZTVSP(XWAC1,QIOIMG)
	ADD	XSAC,X0
	IDIVI	XSAC,5
	LF	X0,ZTVZTE(XWAC1,QIOIMG)
	ADDI	X0,ZTE%S(XSAC)
	ADD	X0,IOBY(XTAC)
	AOS	QIOPOS(XWAC1)
	ILDB	XWAC1,X0
IOIC1:
	UNSTK	XTAC
	EXCH	XWAC1,(XTAC)
	RETURN
	EPROC
	SUBTTL	IOIF


COMMENT;
PURPOSE:		IMPLEMENT INFRAC
ENTRY:			.IOIF
INPUT ARGUMENTS:	REG XTAC CONTAINING NUMBER OF XTOP
			REG XTOP CONTAINING FILE REF
NORMAL EXIT:		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	FRACTION IN XTOP
CALL FORMAT:		MOVEI	XTAC,XTOP
			EXEC	.IOIF
;

.IOIF:	PROC
	EXCH	XWAC1,(XTAC)
	STACK	XWAC2
	;REG XTAC IS NOT DESTROYED IN IOTX
	LI	XSAC,.TXGF
	EXEC	IOTX
	UNSTK	XWAC2
	EXCH	XWAC1,(XTAC)
	RETURN
	EPROC
	SUBTTL	IOII


COMMENT;
PURPOSE:		IMPLEMENT ININT
ENTRY:			.IOII
INPUT ARGUMENTS:	REG XTAC CONTAINING NUMBER OF XTOP
			REG XTOP CONTAINING FILE REF
NORMAL EXIT:		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	REG XTOP CONTAINING INTEGER
CALL FORMAT:		MOVEI	XTAC,XTOP
			EXEC	.IOII
;


.IOII:	PROC
	EXCH	XWAC1,(XTAC)
	STACK	XWAC2
	;REG XTAC IS NOT DESTROYED IN IOTX
	LI	XSAC,.TXGI
	EXEC	IOTX
	UNSTK	XWAC2
	EXCH	XWAC1,(XTAC)
	RETURN
	EPROC
	SUBTTL	IOIR


COMMENT;
PURPOSE:		IMPLEMENT INREAL
ENTRY:			.IOIR
INPUT ARGUMENTS:	REG XTAC CONTAINING NUMBER OF XTOP
			REG XTOP CONTAINING FILE REFERENCE
NORMAL EXIT:		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	REGS XTOP, XTOP+1 CONTAINING LONG REAL ITEM
CALL FORMAT:		MOVEI	XTAC,XTOP
			EXEC	.IOIR
;


.IOIR:	PROC
	EXCH	XWAC1,(XTAC)
	EXCH	XWAC2,1(XTAC)
	;REG XTAC IS NOT DESTROYED IN IOTX
	LI	XSAC,.TXGR
	EXEC	IOTX
	EXCH	XWAC2,1(XTAC)
	EXCH	XWAC1,(XTAC)
	RETURN
	EPROC
	SUBTTL	IOTX

	;IOTX IS CALLED BY .IOIC,.IOIF AND .IOIR
	;FOR INPUT ARGUMENTS SEE CORRESPONDING ROUTINE
	;REG XWAC1 CONTAINS FILE REF, XSAC CONTAINS ADDRESS OF ROUTINE TO CALL

IOTX:	PROC
	LOWADR
	CDEFER
	;THIS CODE IS VALID ONLY IF ZTV = ZTVSP,,ZTVZTE
	;				  ZTVLNG,,ZTVCP
	STACK	XWAC3
	STACK	XTAC
	L	XWAC3,XSAC
	;CHECK IF LASTITEM
	STACK	XWAC1
	LI	XTAC,XWAC1
	EXEC	.IOLI
	IF
		JUMPE	XWAC1,FALSE
	THEN	;NO ITEM
		IOERR	21,ININT:INREAL:INFRAC: end of file
		UNSTK	XWAC1
		GOTO	IOTX1
	FI
	UNSTK	XWAC1

	;COMPUTE LENGTH OF SUBFIELD
	LF	X0,ZTVLNG(XWAC1,QIOIMG)
	LF	XSAC,ZTVCP(XWAC1,QIOIMG)
	SUBI	X0,(XSAC)
	;CHECK IF POS LENGTH
	IF
		JUMPGE	X0,FALSE
	THEN
		IOERR	22,ININT:INREAL:INFRAC: field length negative
	FI
	;CREATE TEXT VAR FOR SUBTEXT IMAGE(POS,LEN-POS+1)
	WLF	XTAC,ZFIIMG(XWAC1)
	HRLZ	XSAC,XSAC
	ADD	XTAC,XSAC
	ST	XTAC,YTXZTV(XLOW)
	HRLZM	X0,YTXZTV+1(XLOW)
	LI	XTAC,XWAC2
	LI	XWAC2,YTXZTV(XLOW)
	;GET CURRENT ITEM
	PUSHJ	XPDP,(XWAC3)
IOTXR:			;[41] Return addr from TX routines
	;ITEM IN XWAC2,XWAC3
	LF	X0,ZTVCP(XWAC1,QIOIMG)
	ADD	X0,YTXZTV+1(XLOW)
	SF	X0,ZTVCP(XWAC1,QIOIMG)
	LD	XWAC1,XWAC2
IOTX1:
	UNSTK	XTAC
	UNSTK	XWAC3
	CENABLE
	RETURN
	EPROC
	SUBTTL	IOIT


COMMENT ;
PURPOSE:		IMPLEMENT TEXT PROCEDURE INTEXT
ENTRY:			.IOIT
INPUT ARGUMENTS:	REG XTOP CONTAINING FILE REF
			REG XTOP+1 CONTAINING LENGTH OF TEXT TO BE COPIED
NORMAL EXIT:		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	REG XTOP,XTOP+1 CONTAINING TEXT REF TO NEW TEXT
CALL FORMAT:		EXEC	.IOIT
			XWD	N,ADMAP		WHERE XTOP=XWAC1+N
;


.IOIT:	PROC
	LOWADR
	CDEFER
	HLRZ	XTAC,@(XPDP)
	LD	X0,XWAC1(XTAC)
	IF	;length=0
		JUMPN	X1,FALSE
	THEN	;NOTEXT is the answer
		SETZM	XWAC1(XTAC)	;Note that XWAC2(XTAC) is already zero
		AOS	(XPDP)		;[1] MUST SKIP PARAMETER WORD
		GOTO	L9
	FI
	ST	X0,YOBJAD(XLOW)
	ST	X1,YIOSAV(XLOW)
	SKIPE	XSAC,@(XPDP)
	EXEC	.CSSA.
	;LOAD TO STANDARD REGISTERS
	L	XWAC1,YOBJAD(XLOW)
	L	XWAC2,YIOSAV(XLOW)
	AOS	(XPDP)
	SETOM	YSANIN(XLOW)
	LI	XSAC,5*ZTE%S+5-1
	ADD	XSAC,XWAC2
	IDIVI	XSAC,5
	L	XTAC,XSAC
	HRLI	XTAC,QZTE
	EXEC	.SAAR

IFN QSADEA,<	;UPDATE YSADEA IN DEALLOCATE VER.
	L	X0,YSATOP(XLOW)
	ST	X0,YSADEA(XLOW)
	>

	L	XWAC1,YOBJAD(XLOW)
	;NEW TEXT REF ADDRESS IN XTAC
	WHILE	;LENGTH NEGATIVE OR GT 2^18-1
		TLNN	XWAC2,-1
		GOTO	FALSE
	DO
		;[41]:
		IOERC	QDSNIN,24,INTEXT: length out of range
		NEWVALUE XWAC2		;[41]
	OD
	STACK	XWAC3
	SF	XWAC2,ZTECLN(XTAC)
	STACK	XTAC
	ADD	XTAC,[POINT 7,ZTE%S]
	;COMPUTE BYTE POINTER TO TEXT VARIABLE
	LOOP
		LF	XWAC3,ZTVZTE(XWAC1,QIOIMG)
		LF	XSAC,ZTVCP(XWAC1,QIOIMG)
		LF	X0,ZTVSP(XWAC1,QIOIMG)
		ADDI	X0,(XSAC)
		IDIVI	X0,5
		ADDI	XWAC3,ZTE%S
		ADD	XWAC3,X0
		ADD	XWAC3,IOBY(XSAC)
		LF	XSAC,ZTVLNG(XWAC1,QIOIMG)
		LF	X0,ZTVCP(XWAC1,QIOIMG)
		SUB	XSAC,X0
	AS
		CAMG	XWAC2,XSAC
		GOTO	FALSE
		;NOT ENOUGH CHARACTERS IN CURRENT IMAGE.
		;TAKE CARE OF REMAINING ONES
		SUB	XWAC2,XSAC
		WHILE
			SOJL	XSAC,FALSE
		DO
			ILDB	X0,XWAC3
			IDPB	X0,XTAC
		OD
		;END OF FILE CHECK BEFORE INIMAGE, DIFFERS FROM COMMON BASE
		;TO MAKE IT POSSIBLE TO READ /*
		IF
			IFOFF	ZIFEND(XWAC1)
			GOTO	FALSE
		THEN
			IOERR	23,INTEXT: end of file
			GOTO	IOIT2
		FI
		;GET ANOTHER IMAGE
		STACK	XTAC
		EXEC	.IOIG
		UNSTK	XTAC
		GOTO	TRUE
	SA
	ADD	X0,XWAC2
	SF	X0,ZTVCP(XWAC1,QIOIMG)
	WHILE
		SOJL	XWAC2,FALSE
	DO
		ILDB	X0,XWAC3
		IDPB	X0,XTAC
	OD
IOIT2:
	UNSTK	XTAC
	LF	X0,ZTECLN(XTAC)
	ZF	ZTVCP(,XWAC1)	;[113]
	SF	X0,ZTVLNG(,XWAC1)
	HRRZ	XWAC1,XTAC
	SETZM	YOBJAD(XLOW)
	UNSTK	XWAC3
IOIT1:
	SKIPE	XSAC,YCSZAC(XLOW)
	BRANCH	.CSRA
L9():!	CENABLE
	RETURN
	EPROC
	SUBTTL	IOOC


COMMENT ;
PURPOSE:		IMPLEMENT OUTCHAR
ENTRY:			.IOOC
INPUT ARGUMENTS:	REG XWAC1 CONTAINING FILE REF
			REG XWAC3 CONTAINING CHARACTER
NORMAL EXIT:		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	CHARACTER IN IMAGE
CALL FORMAT:		EXEC	.IOOC
;

.IOOC:
	PROC
	;CHECK IF ROOM IN IMAGE FOR CHARACTER
	LF	XSAC,ZTVCP(XWAC1,QIOIMG)
	LF	X0,ZTVLNG(XWAC1,QIOIMG)
	IF
		CAMGE	XSAC,X0
		GOTO	FALSE
	THEN
		;CALL OUTIMAGE
		EXEC	.IOOG
		SETZ	XSAC,	;POS=1
	FI
	;COMPUTE BYTE POINTER TO CURRENT POS
	;IN IMAGE
	LF	X0,ZTVZTE(XWAC1,QIOIMG)
	LF	XTAC,ZTVSP(XWAC1,QIOIMG)
	ADD	XSAC,XTAC
	IDIVI	XSAC,5
	ADDI	X0,ZTE%S(XSAC)
	ADD	X0,IOBY(XTAC)
	IDPB	XWAC3,X0
	AOS	QIOPOS(XWAC1)
	RETURN
	EPROC
	SUBTTL	IOOF


COMMENT ;
PURPOSE:		IMPLEMENT OUTFRAC
ENTRY:			.IOOF
INPUT ARGUMENTS:	REG XWAC1 CONTAINING FILE REF
			XWAC3 INTEGER VALUE
			XWAC4 NUMBER OF DIGITS IN FRACTION
			XWAC5 FIELD WIDTH
NORMAL EXIT:		RETURN FROM .TXPF
ERROR EXIT:		-
OUTPUT ARGUMENTS:
CALL FORMAT:		EXEC .IOOF
;

.IOOF:
	PROC
	STACK	XWAC2
	L	XWAC2,XWAC5
	EXEC	.IOFD
	UNSTK	XWAC2
	BRANCH	.TXPF
	EPROC
	SUBTTL	IOOI


COMMENT ;
PURPOSE:		IMPLEMENT OUTINT
ENTRY:			.IOOI
INPUT ARGUMENTS:	REG XWAC1 CONTAINING FILE REF
			XWAC3 INTEGER VALUE
			XWAC4 FIELD WIDTH
NORMAL EXIT:		RETURN FROM .TXPI
ERROR EXIT:		-
OUTPUT ARGUMENTS:	-
CALL FORMAT:		EXEC	.IOOI
;

.IOOI:
	PROC
	STACK	XWAC2
	;COMPUTE ADDR OF GLOBAL TEXT VARIABLE
	L	XWAC2,XWAC4
	EXEC	.IOFD
	UNSTK	XWAC2
	BRANCH	.TXPI
	EPROC
	SUBTTL	IOOR


COMMENT ;
PURPOSE:		IMPLEMENT OUTREAL
ENTRY:			.IOOR
INPUT ARGUMENTS:	REG XWAC1 CONTAINING FILE REF
			XWAC3-4 LONG REAL VALUE
			XWAC5 NUMBER OF SIGNIFICANT DIGITS
			XWAC6 FIELD WIDTH
NORMAL EXIT:		RETURN FROM .TXPR
ERROR EXIT:		-
OUTPUT ARGUMENTS:	-
CALL FORMAT:		EXEC	.IOOR
;

.IOOR:
	PROC
	STACK	XWAC2
	L	XWAC2,XWAC6
	EXEC	.IOFD
	UNSTK	XWAC2
	BRANCH	.TXPR
	EPROC
	SUBTTL	IOOX

COMMENT ;
PURPOSE:		IMPLEMENT OUTFIX
ENTRY:			.IOOX
INPUT ARGUMENTS:	REG XWAC1 CONTAINING FILE REF
			XWAC3-4 LONG REAL VALUE
			XWAC5 NUMBER OF DIGITS IN FRACTION
			XWAC6 FIELD WIDTH
NORMAL EXIT:		RETURN FROM .TXPX
ERROR EXIT:		-
OUTPUT ARGUMENTS:	-
CALL FORMAT:		EXEC	.IOOX
;

.IOOX:
	PROC
	STACK	XWAC2
	L	XWAC2,XWAC6
	EXEC	.IOFD
	UNSTK	XWAC2
	BRANCH	.TXPX
	EPROC
	SUBTTL	IOOT


COMMENT ;
PURPOSE:		IMPLEMENT OUTTEXT
ENTRY:			.
INPUT ARGUMENTS:	REG XWAC1 CONTAINING FILE REF
			XWAC3-4 TEXT REF
NORMAL EXIT:		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	-
CALL FORMAT:		EXEC	.IOOT
;

.IOOT:
	PROC
	SAVE	<XWAC1,XWAC2>
	;COMPUTE ADDRESS OF TEXT VARIABLE
	LF	XWAC2,ZTVLNG(,XWAC3)
	IF	;Not NOTEXT
		JUMPE	XWAC2,FALSE
	THEN
		EXEC	.IOFD
		LD	XWAC1,(XWAC1)
		LI	XTAC,XWAC1
		EXEC	.TXVA
	FI
	RETURN
	EPROC
IOBY:
	;LEFT HAND OF BYTE POINTER BYTE SIZE=7
	XWD	440700,0
	XWD	350700,0
	XWD	260700,0
	XWD	170700,0
	XWD	100700,0
	XWD	010700,0
	SUBTTL	END OF IOED MODULE

	LIT
	END