Google
 

Trailing-Edge - PDP-10 Archives - decus_20tap2_198111 - decus/20-0044/stream.mac
There are 2 other files named stream.mac in the archive. Click here to see a list.
	TITLE STREAM I/O FOR FORTRAN/MACRO.
	SUBTTL PROGRAM BY MARTY SCHULTZ; V02: 4-05-72
	;	FLOATING I/O ROUTINES BY STUART SKALKA.
	;SYOSSET HIGH SCHOOL, N.Y.
;[DECUS]CONVERTED TO CURRENT FORTRAN CALLING CONVENTION 9 AUG 1980
;[DECUS]BY PAUL T. ROBINSON, WESLEYAN UNIV, DECUS CONVERSION PROGRAMMER
	LOC 137
	EXP 02		;VERSION 2 OF STREAM I/O
	RELOC

Q=16	;REFERENCE TO FORTRAN ARGUMENTS.
P=17	;USED FOR PUSH-DOWN OPERATIONS.
ACA=10	;BLOCK FOR LOOKUPS/ENTERS/OPENS
ACB=11
ACC=12
ACD=13
AC1=1	;GNL ACC. USED TO HOLD LOCATIONS.
AC2=2	;GNL ACC. USED TO HOLD POINTERS.
AC3=3	;GNL ACC. 
AC4=4	;GNL ACC. COUNTERS FOR LOOPS.
OFF=5	;OFFSET WHEN ADDRESSING BLOCK AREA.
GNL=6	;USED IN FORMING COMMANDS.
CNT=7	;USED IN COUNT OF INPUT STREAM.

	DEFINE GETUNT,
	<MOVE OFF,@(Q)
	MOVE AC3,OFF
	IMULI OFF,4>

	DEFINE W(WORD),
	<EXP WORD>

	DEFINE GETNCR,
	<JSR GETCHR
	JUMPE AC1,.-1>

	DEFINE BOUND (A1,A2),
	<CAIG AC1,A1
	CAIGE AC1,A2>

	DEFINE GETNBL,
	<GETNCR
	CAIN AC1," "
	JRST .-3>

	SUBTTL OUTFIL ROUTINE.

;CALL IS (IN FORTRAN PROGRAM):
;::= CALL OUTFIL(<UNIT>,<ASCIZ-DEVICE>,<MODE>,<FILENAME.EXT>,
;		<ASSIGNED-GOTO VARIABLE EOF;ERROR>,<PROTECTION>)
	ENTRY OUTFIL

OUTFIL:	JSR SETOPN		;CREATE OPEN COMMAND.
	MOVSI ACC,BUFFR(OFF)	;LOCATION OF BUFFER HEAD.
	MOVEM GNL,.+1		;ENTER CMMD.
	OPEN 0,0		;AN <OPEN>
	JRST IOFERR		;NO DEVICE FOR OUTPUT.
	MOVE GNL,[ENTER 0,ACA]	;CREATE ENTER
	DPB AC3,POINT1		;UNIT #
	JSR FILDO		;PUTS FILE.EXT INTO (10,11)
	MOVE ACC,@5(Q)		;PROTECTION
	ROT ACC,-9		;ADJUST FOR CORRECT POSITION.
	GETPPN ACD,		;ASSUME YOU.
	JFCL
	MOVEM GNL,.+1
	ENTER 0,0		;DO AN <ENTER>
	JRST IOFERR		;NO ROOM ON OUTPUT DEVICE.
	MOVE AC1,4(Q)		;LOCATION OF VARIABLE TO SET.
	MOVEM AC1,BUFFR+3(OFF)	;STORE HERE.
	POPJ	P,


	SUBTTL INFIL ROUTINE
	ENTRY INFIL
;CALL IS:
;::= CALL INFIL(<UNIT>,<ASCIZ-DEVICE>,<MODE>,<ASCIZ-FILE>
;		,<ASSIGNED-GOTO VARIABLE EOF;ERROF>,<P>,<PN>)

INFIL:	JSR SETOPN		;MAKE AN OPEN COMMAND
	MOVEI ACC,BUFFR(OFF)	;LOC OF BUFFER HEADER
	MOVEM GNL,.+1
	OPEN 0,0		;OPEN FILE FOR INPUT.
	JRST IOFERR		;NO SUCH INPUT DEVICE.

	MOVE GNL,[LOOKUP 0,ACA]	;CREATE A LOOKUP
	DPB AC3,POINT1		;ENTER UNIT NUMBER
	JSR FILDO		;PUTS FILENAME INTO ACA,ACB
	SETZ ACC,		;NOTHING GOES HERE.
	MOVE AC1,@5(Q)		;GET P[PN]
	JUMPN AC1,ISTHR		;IS IT ASSUMED (=0)?
	GETPPN ACD,		;YES. USE THIS ONE.
	JFCL
	JRST LKP		;DO A LOOKUP.
ISTHR:	HRL ACD,AC1		;IT IS THERE. P[PN]
	HRR ACD,@6(Q)		;[P]PN
LKP:	MOVEM GNL,.+1		;DO IT.
	LOOKUP 0,0		;WHAT IT WOULD BE.
	JRST IOFERR		;NO SUCH FILE
	MOVE AC1,4(Q)		;LOCATION OF VARIABLE TO SET.
	MOVEM AC1,BUFFR+3(OFF)	;STORE THERE.
	POPJ	P,


;SET-OPEN ROUTINE.
;THIS ROUTINE WILL FORM THE OPEN COMMAND, AND SET UP THE BUFFER
;HEADER LOCATION. INFO GOES ACA->ACD.
SETOPN:	Z
	GETUNT
	MOVE GNL,[OPEN 0,ACA]	;OPEN.
	DPB AC3,POINT1		;ENTER UNIT.
	MOVE ACA,@2(Q)		;MODE
	JSR ASCSIX		;CONVERT TO SIXBIT.
	JRST @SETOPN

ASCSIX:	Z			;ROUTINE TO CONVERT 7BIT-6BIT
	SETZ ACD,
	MOVE ACC,1(Q)
	MOVEM AC3,T1		;SAVE AC3.
	MOVE AC1,POINT5		;POINTER TO DEPOSIT CHARS
	MOVE AC2,POINT4		;POINTER TO LOAD UP CHARS.
	ILDB AC4,AC2
	SUBI AC4,40
	JUMPLE AC4,.+3
	IDPB AC4,AC1
	JRST .-4
	MOVE AC3,T1		;GET OLD VALUE
	MOVE ACB,ACD		;RETURN ANSWER HERE.
	JRST @ASCSIX

T1:	Z
T2:	MOVEI AC2,1(Q)		;THIS IS A RESETING INSTRUCTION.



FILDO:	Z			;ROUTINE TO TAKE FILE-NAME, ADJUST.
	MOVE ACC,3(Q)
	MOVE AC1,POINT4		;POINTER TO ASCIZ-NAME
	SETZB AC4,ACD
FILD3:	MOVE AC2,POINT5		;POINTER TO SIXBIT RESULT
FILD2:	ILDB AC3,AC1
	SUBI AC3,40		;AFTER GETTING CHAR, TURN TO SIXBIT.
	CAIN AC3,'.'		;AN EXTENSION STARTING?
	JRST FILEX		;YES. JUMP.
	CAIG AC3,' '		;GREATER THAN A SPACE- STILL NAME.
	JRST FILND
	IDPB AC3,AC2		;ENTER THE SIXBIT VALUE.
	JRST FILD2
FILND:	JUMPN AC4,FILED		;WAS THERE AN EXTENSION?
	MOVE ACA,ACD		;NO. BLANK EXTENSION.
	SETZB ACB,ACD
	JRST @FILDO
FILEX:	MOVE ACA,ACD
	SETO AC4,
	SETZ ACD,
	JRST FILD3
FILED:	MOVE ACB,ACD		;THERE WAS AN EXTENSION. FIX IT.
	SETZB ACD,AC4
	JRST @FILDO

IOFERR:	MOVE AC1,@4(Q)		;BRANCH TO @(LOC) ON ERROR.
	JRST (AC1)		;THIS CAME FROM AN ASSIGN.
	SUBTTL GETBYT ROUTINE
;CALL IS
;::=	CALL GETBYT(<UNIT>,<VARIABLE>[,<VARIABLE>,...])
;[DECUS]TOTALLY REWRITTEN TO AGREE WITH CURRENT FORTRAN CONVENTION 9 AUG 1980
	ENTRY GETBYT
GETBYT:	GETUNT			;UNIT PREPARATION
	HLLZ	AC2,-1(Q)	;GET ARG COUNT,,ZERO
GBTLUP:	AOBJN	AC2,.+2		;SKIP IF STILL NEGATIVE
	 POPJ	P,		;OTHERWISE RETURN
	JSR	GETCHR		;PICK UP A CHAR
	HRRZ	AC3,AC2		;GET OFFSET INTO BLOCK
	ADD	AC3,Q		;GET ADR OF CURRENT ARG
	MOVEM	AC1,@AC3	;STORE CHAR
	JRST	GBTLUP		;AND TRY FOR ANOTHER

;WHEN ANY TYPE OF ERROR CONDITION OCCURS, BRANCH TO THE VARIABLE
;STATED IN THE INFIL/OUTFIL CALL.  SHOULD BE SET THROUGH ASSIGNED GOTO.

INRR1:	MOVE AC1,@BUFFR+3(OFF)		;CONTAINS ADDRESS TO BRANCH
	JRST (AC1)			;ADDRESS TO GOTO.

	SUBTTL PUTBYT ROUTINE
;	CALL IS
;::=	CALL PUTBYT(<UNIT>,<VARIABLE>[,<VARIABLE>,...])
	ENTRY PUTBYT
;[DECUS]TOTALLY REWRITTEN FOR REVISED CALLING CONVENTION 9 AUG 80
PUTBYT:	GETUNT			;UNIT PREPARED
	HLLZ	AC2,-1(Q)	;GET -ARG COUNT,,ZERO
PBTLUP:	AOBJN	AC2,.+2		;SKIP IF STILL NEGATIVE
	 POPJ	P,		;OTHERWISE RETURN
	HRRZ	AC3,AC2		;GET ARG BLOCK OFFSET
	ADD	AC3,Q		;GET ADR OF ARG
	MOVE	AC1,@AC3	;GET ARG
	JSR	PUTCHR		;OUTPUT IT
	JRST	PBTLUP		;AND GO FOR MORE

;	ERROR CONDITION; EOF OR ERROR ON OUTPUT. <GOTO> ASSIGNED.
OUTRR1:	JRST INRR1


	SUBTTL GETCHR
;THIS ROUTINE WILL INPUT ONE CHARACTER FROM DEVICE INTO AC1.
GETCHR:	Z
	SOSL BUFFR+2(OFF)	;BUFFER EMPTYY?
	JRST GTBYT
	MOVE GNL,[IN 0,0]	;YES. CREATE AN 'IN'
	DPB AC3,POINT1		;ENTER UNIT
	MOVEM GNL,.+1
	IN 0,0			;INPUT FROM DEVICE.
	JRST  GETCHR+1		;NO ERROR. TRY AGAIN.
	JRST INRR1
GTBYT:	ILDB AC1,BUFFR+1(OFF)	;GET ONE ITEM.
	JRST @GETCHR

	SUBTTL PUTCHR
;THIS ROUTINE WILL OUTPUT ONE CHARACTER TO DEVICE FROM AC1.
PUTCHR:	Z
	SOSLE BUFFR+2(OFF)	;BUFFER FILLED UP?
	JRST PTBYT
	MOVE GNL,[OUT 0,0]	;YES. CREATE <OUT>
	DPB AC3,POINT1		;UNIT NUMBER.
	MOVEM GNL,.+1
	OUT 0,0			;OUTPUT TO DEVICE.
	JRST PUTCHR+1		;NO ERROR. TRY AGAIN
	JRST OUTRR1
PTBYT:	IDPB AC1,BUFFR+1(OFF)	;ENTER DATUM
	JRST @PUTCHR


	SUBTTL BRKOUT
;CALL IS:
;::=	CALL BRKOUT(<UNIT>)
;	THIS ROUTINE WILL IMMEDIATLEY EMPTY THE BUFFER.
;	USED FOR TTY COMMMUNICATIONS.
	ENTRY BRKOUT
BRKOUT:	MOVE AC3,@(Q)		;GET THE UNIT NUMBER.
	MOVE GNL,[OUT 0,0]	;DO A FORCED OUTPUT.
	DPB  AC3,POINT1		;ENTER THE UNIT NUMBER.
	MOVEM GNL,.+1
	OUT 0,0			;TYPE OF COMMAND.
	 POPJ	P,		;RETURN IF NO ERR
	JRST OUTRR1		;ERROR ROUTINE

	SUBTTL PUT ROUTINES.
	ENTRY PUT
;THE PUT ROUTINES ALLOW USER TO OUTPUT NUMBERS, CHARACTER STRINGS,
;AND HOLERITH CHARACTERS.  DUE TO THE FORTRAN COMPILER,
;TO OUTPUT CHARACTER STRINGS, (IN VARIABLES), THE VARIABLES MUST
;BE DECLARED COMPLEX.  IT WILL OUTPUT THE CHARACTERS UNTIL A NULL
;CHARACTER IS HIT.
;[DECUS]THIS ROUTINE HAS ALSO BEEN LARGELY REWRITTEN, VIZ. GETBYT.
PUT:	GETUNT			;SET UP UNIT
	MOVE	AC2,-1(Q)	;GET ARG COUNT WORD
PUTLUP:	AOBJN	AC2,.+2		;SKIP IF MORE ARGS
	 POPJ	P,		;OTHERWISE RETURN
	LDB	AC1,POINT6	;PICK UP ARG TYPE
	HRRZ	ACA,AC2		;GET ARG BLOCK OFFSET
	ADD	ACA,Q		;GET ARG ADR
	MOVE	ACA,@ACA	;GET VALUE TO OUTPUT
	JSR	@BRTAB1(AC1)	;BRANCH TO CORRECT ROUTINE
	JRST	PUTLUP		;AND GO FOR MORE

PUTINT:	Z			;INTEGER OUTPUT ROUTINE.
	PUSHJ P,DECOUT		;OUTPUT INTEGER.
	MOVEI AC1," "		;PREPARE TO OUTPUT A SPACE.
	JSR PUTCHR		;OUTPUT IT.
	JRST @PUTINT		;RETURN

PUTLOG:	Z			;LOGICAL OUTPUT ROUTINE.
	MOVE AC2,POINT8		;POINTER TO OUTPUT T-F
	JUMPGE ACA,.+3		;WAS IT TRUE?
	HRRI AC2,TRUEV		;YES TAKE IT FROM TRUE.
	JRST .+2
	HRRI AC2,FALSV		;NO TAKE IT FROM FALSE.
	ILDB AC1,AC2		;GET CHARACTER.
	JSR PUTCHR		;OUTPUT IT.
	JUMPN AC1,.-2		;IF NOT END, OUTPUT MORE.
	JRST @PUTLOG

TRUEV:	ASCIZ/TRUE  /
FALSV:	ASCIZ/FALSE /

PUTHOL:	Z			;OUTPUTS HOLERITH CHARACTERS.
	MOVE AC4,(AC2)		;LOCATION OF ARG.
	MOVE ACA,POINT7		;POINTER FOR CHARS.
	ILDB AC1,ACA		;GET CHARACTER.
	JSR PUTCHR		;OUTPUT IT.
	JUMPN AC1,.-2		;KEEP GOING UNTILL END.
	MOVEI	AC1,033		;ENTER ALTMODE
	JSR PUTCHR
	JRST @PUTHOL		;RETURN.

PUTCOM:	Z			;HOLERITH OUTPUT ROUTINE:VARIABLES
	MOVE AC4,(AC2)		;LOCATION OF PARAMETERS.
	MOVE ACA,POINT7		;POINTER FOR CHARS.
	MOVEI ACB,^D10		;OUTPUT TEN CHARS MAX.
PUTCM1:	ILDB AC1,ACA		;GET A CHAR.
	JUMPE AC1,PUTCM2	;EXIT ROUTINE AFTER NULL.
	JSR PUTCHR		;OUTPUT CHAR.
	SOJG ACB,PUTCM1		;LOOP UNTIL ALL TEN CHARS.
PUTCM2:	MOVEI AC1,175		;INSERT A $ WHEN DONE.
	JSR PUTCHR
	JRST @PUTCOM		;RETURN TO MAIN PROGRAM.

PUTNON:	Z			;OUTPUT ILLEGAL TYPE.
	MOVE AC2,POINT8		;POINTER TO NON-OUT
	HRRI AC2,NONEV		;ADDRESS TO OUTPUT.
	ILDB AC1,AC2
	JSR PUTCHR
	JUMPN AC1,.-2		;END YET?
	JRST @PUTNON		;YES. RETURN.
NONEV:	ASCIZ/*** /

PUTFLT:	Z			;FLOATING POUTPUT ROUTINE.
	MOVE ACC,ACA		;ROUTINE BY STUART SKALKA.
	JUMPE ACA,PUTFZR	;IF ZERO, DONT CONVERT.
	SETZB ACA,ACB		;EXPONENT, FLAGS.
	JUMPGE ACC,PUTFCK	;JUMP IF NOT NEG.
	FMPR ACC,[-1.0]		;POSITIVIZE.
	TRO ACB,1		;SET NEG BIT.

PUTFCK:	CAML ACC,ONE		;IS NUM>=1 ?
	JRST PUTFDV
	CAMLE ACC,PTONE		;IS NUM<=.1
	JRST PUTFOT
	FMPR ACC,TEN		;YES. MULTIPLY.
	SOJA ACA,PUTFCK		;RETEST IT.
PUTFDV:	FDVR ACC,TEN		;DEVIDE FOR NEW VALUE
	AOJA ACA,PUTFCK		;CHECK AGAIN.
PUTFOT:	MOVE ACD,[377B8]	;BITS TO SAVE EXPONENT.
	AND ACD,ACC		;ACD HAS EXPONENT.
	SUB ACC,ACD		;KILL EXPONENT FROM NUMBER.
	ROT ACD,9		;BRING AROUND TO START.
	SUBI ACD,^D125		;SUB 128 FOR CONVERT TO 2S COMPLEMENT.
				;ADD 3 EXPONENT BETWEEN 0 -> -3
	LSH ACC,(ACD)		;SHIFT NUMBER BY EXPONENT.
	TRNN ACB,1		;WAS THE NEGATIVE BIT ON?
	JRST .+3		;NO. DONT PRINT.
	MOVEI AC1,"-"		;OUTPUT A MINUS SIGN.
	JSR PUTCHR
PUTFZZ:	MOVE ACB,NUMDIG		;CLEAR FLAG, INSERT AMOUNT OF DIGITS.
	MOVEI AC1,"."		;OUTPUT A DECIMAL POINT.
	JSR PUTCHR
	SETZ AC1,
PUTFLP:	IMULI ACC,^D10		;MULTIPLY NUMBER BY 10.
	IDIV ACC,THIRTY
	IMULI AC1,^D10		;INCREASE VALUE.
	ADD AC1,ACC
	MOVE ACC,ACD		;GET NEW NUMBER.
	SOJG ACB,PUTFLP		;LOOP UNTIL ALL PRECSION DONE.
	MOVE ACC,ACA
	MOVE ACA,AC1
	ADDI ACA,5
	PUSHJ P,DECOUT
	MOVE ACA,ACC
PUTFEX:	MOVEI AC1,"E"
	JSR PUTCHR		;PRINT 'E'
	MOVEI AC1,"+"		;ASSUME POSITIVE.
	SKIPGE ACA
	MOVEI AC1,"-"		;OUTPUT A MINUS SIGN.
	JSR PUTCHR
PUTFTX:	MOVMS ACA		;MAKE EXPONENT POSITIVE.
	PUSHJ P,DECOUT		;OUTPUT EXPONENT.
	MOVEI AC1," "		;PRINT A TRIALING SPACE.
	JSR PUTCHR
	JRST @PUTFLT		;RETURN.
PUTFZR:	SETZB ACA,ACC
	JRST PUTFZZ

THIRTY:	^D1073741824
ONE:	1.0
PTONE:	0.1
TEN:	10.0

	SUBTTL DIGITS ROUTINE.
	ENTRY DIGITS
;CALL IS:
;::= CALL DIGITS(<AMOUNT>)
;THIS ROUTINE ENABLES USER TO VARY HOW MUCH PRECISION ON OUTPUT
;SHOULD BE GIVEN.  STANDARD OUTPUT IS SEVEN DIGITS.
DIGITS:	MOVE AC1,@(Q)		;GET THE AMOUNT.
	ADDI AC1,1
	MOVEM AC1,NUMDIG	;TELL IT.
	POPJ	P,

DECOUT:	IDIVI ACA,^D10		;DIVIDE BY BASE.
	HRLM ACB,(P)		;STORE IT.
	SKIPE ACA		;END OF NUMBER?
	PUSHJ P,DECOUT		;NO, TRY AGAIN.
	HLRZ AC1,(P)		;GET TOP ELEMENT.
	ADDI AC1,60		;CONVERT TO ASCIZ.
	JSR PUTCHR		;OUTPUT IT.
	POPJ P,			;RETURN.



	SUBTTL GET ROUTINES.
	ENTRY GET
;THE GET ROUTINES ALLOW THE USER TO INPUT NUMBERS,CHARACTER STRINGS,
;AND LOGICAL VALUES.  DUE TO THE FORTRAN COMPILER, TO INPUT CHAR-
;ACTER STRINGS, THE VARIABLE IN THE GET CALL MUST BE COMPLEX.
;[DECUS]MODIFIED AGAIN AS PER GETBYT.
GET:	GETUNT			;PICK UP UNIT
	SETZ	CNT,		;CLEAR LIST COUNT
	HLLZ	AC2,-1(Q)	;GET -ARG COUNT,,ZERO
GETLUP:	AOBJN	AC2,.+2		;SKIP IF STILL MORE TO GO
	 POPJ	P,		;OTHERWISE RETURN
	AOS	CNT		;INCREMENT COUNTER
	SETZ	ACB,		;CLEAR ERROR FLAG
	LDB	AC1,POINT6	;PICK UP ARG TYPE
	JSR	@BRTAB2(AC1)	;GO TO IT
	JUMPL	ACB,GETER1	;TAKE CARE OF ERRORS
	JRST	GETLUP		;GO FOR ANOTHER ONE


GETER1:	OUTSTR [ASCIZ/
IE=/]				;SIGNIFY INPUT ERROR.
	MOVE ACA,@(Q)		;GET THE UNIT NUMBER.
	PUSHJ P,DECT		;OUTPUT UNIT #.
	OUTCHR [","]
	MOVE ACA,CNT		;OUTPUT DATA NUMBER IN LIST.
	PUSHJ P,DECT
	SOS CNT			;SUBTRACT ONE FROM LIST COUNT.
	SETZM BUFFR+2(OFF)	;CLEAR BUFFER.
	OUTSTR [ASCIZ/
/]
	JRST GETLUP		;TRY AGAIN.

GETINT:	Z			;INTEGER INPUT ROUTINE.
	SETZ ACA,		;RESET VALUE.
	GETNBL			;GET FIRST NON-BLANK CHAR.
	CAIA			;SKIP NEXT INSTR
GETI1:	GETNCR			;GET NON-ZERO CHARACTER.
	BOUND "9","0"		;LEGAL DECIMAL DIGIT?
	JRST GETI2		;NO CHECK.
	SUBI AC1,60		;CONVERT TO DECIMAL.
	IMULI ACA,^D10
	ADD ACA,AC1
	JRST GETI1

GETI2:	JSR TYPCHR		;FIND OUT WHAT TYPE IT IS.
	JUMPN AC1,.+3		;IS IT LEGAL?
	SETO ACB,		;NO. SIGNAL ERROR.
	JRST @GETINT
	HRRZ	AC1,AC2		;GET OFFSET INTO AGR BLOCK
	ADD	AC1,Q		;ADD ADR OF BLOCK FOR ARG LOC
	MOVEM	ACA,@AC1	;RETURN VALUE
	JRST @GETINT

GETLOG:	Z			;LOGICAL INPUT ROUTINE.
	GETNBL			;GET NON-BLANK CHARACTER.
	CAIE AC1,"T"		;IS IT TRUE?
	JRST .+3
	SETO ACA,		;YES NEGATIVE.
	JRST  GETL1		;SCRAP REST.
	CAIN AC1,"F"		;THEN IS IT FALSE?
	JRST GETL2		;YES. BRANCH.
	SETO ACB,		;NO. ERROR.
	JRST @GETLOG
GETL2:	SETZ ACA,		;FALSE=0
GETL1:	GETNCR			;GET NON-ZERO CHAR
	JSR TYPCHR		;WHAT TYPE?
	JUMPE AC1,GETL1		;IGNORE IF NOT BREAK.
	HRRZ	AC1,AC2		;GET OFFSET INTO ARG BLOCK
	ADD	AC1,Q		;ADD ARG BLOCK ADR
	MOVEM	ACA,@AC1	;RETURN VALUE
	JRST @GETLOG

GETHOL:	Z			;HOLERITH(COMPLEX) INPUT ROUTINE.
	MOVE AC4,(AC2)		;LOCATION OF ARG.
	MOVE ACA,POINT7		;POINTER FOR CHARS.
	MOVEI ACB,^D10		;LOOP FOR INPUT.
GETC2:	GETNCR			;GET NON-NULL IN AC1.
	CAIN AC1,175		;AN ALTMODE?
	JRST GETC1		;YES.
	IDPB AC1,ACA		;NO.DEPOSIT CHAR.
	SOJG ACB,GETC2		;LOOP FOR THE TEN CHARACTERS.
GETC3:	GETNCR			;GET GARBAGE.
	CAIE AC1,175		;END JUNK.
	JRST GETC3		;NO. KEEP GOING.
	SETZ ACB,		;CLEAR ERROR FLAG.
	JRST @GETHOL		;RETURN.
GETC1:	SETZ AC1,		;ENTER NULLS
	IDPB AC1,ACA		;DEPOSIT IT.
	SOJG ACB,.-1		;KEEP REPEATING UNTIL ALL IN.
	SETZ ACB,		;CLEAR ERROR FLAG.
	JRST @GETHOL


GETNON:	Z			;ROUTINE TO THROW OUT VALUE.
	HRRZ	AC1,AC2		;GET OFFSET INTO ARG BLOCK
	ADD	AC1,Q		;ADD ADR OF ARG BLOCK
	SETZM	@AC1		;SET ARG TO 0
GETNN1:	GETNCR			;GET NON-BLANK.
	JSR TYPCHR		;FIND OUT TYPE.
	JUMPE AC1,GETNN1	;IF NOT BREAK, GET AGAIN.
	JRST @GETNON


GETFLT:	Z			;ROUTINE GETFLT BY STUART SKALKA.
	PUSH P,AC2		;KEEP THE INDEX TO RETURN TO.
	MOVE ACD,GETFMS		;INPUTS A FLOATING POINT NUMBER.
	SUBI ACD,1		;ACD HAS BITS 9 TO 35 SET.
	SETZB AC2,ACC		;FRACTION, EXPONENT.
	SETZB AC4,ACB		;COUNT, FLAGS.
GETF1:	GETNCR			;GET A NON-BLANK CHARACETER.
	MOVEM AC1,T1		;SAVE THIS TYPECHAR.
	JSR TYPCHR		;FIND OUT CHAR TYPE IN AC1.
	JUMPN AC1,GETFDN+3	;BREAK CHAR.  GOTO GETFDN.
	MOVE AC1,T1		;NORMAL TYPE CHARACTER.
	CAIN AC1,"E"		;EXPONENT YET?
	JRST GETF2		;YES. GET IT.
	CAIE AC1,"."		;HIT DECIMAL POINT YET?
	JRST .+5		;NO.
	TRNE ACB,1B34		;POINT BIT SET?
	JRST GETFBD		;BAD DIGIT.
	TRO ACB,^B1001B34	;SET POINT AND DIGITS BIT.
	JRST GETF1		;GET NEXT CHAR
	TRNE ACB,1B31		;DIGITS YET?
	JRST GETCD		;YES PROCESS.
	CAIE AC1,"+"		;HIT A +?
	JRST .+3		;NOPE, SKIP IT.
	TRO ACB,1B31		;SET DIGITS BIT.
	JRST GETF1		;GET MORE.
	CAIE AC1,"-"		;MINUS?
	JRST GETCD		;NO CHECK DIGIT.
	TRO ACB,^B101B33	;SET - AND DIGITS BIT
	JRST GETF1
GETCD:	BOUND "9","0"
	JRST GETFBD		;NOT A DIGIT. ILLEGAL.
	TRNE ACB,1B34		;DECIMAL POINT DIGIT?
	SUBI AC4,1		;ANOTHER 10^-1 TO MULT BY.
	IMULI AC2,^D10		;MULTIPLY FRAC BY 10
	SUBI AC1,60		;MAKE INTO DECIMAL.
	ADD AC2,AC1		;ADD TO FRACTION
	CAMLE AC2,ACD		;TOO MANY DIGITS?
	JRST GETFBD		;YES. ERROR
	JRST GETF1
GETF2:	GETNCR			;GET NON-NULL CHAR.
	MOVEM AC1,T1		;SAVE CHARACTER.
	JSR TYPCHR		;IS IT A BREAKCHAR?
	JUMPN AC1,GETFDN
	MOVE AC1,T1		;NO IT WASN'T.
	TRNE ACB,1B30		;DIGITS YET?
	JRST GETFDG		;YES. GET THEM.
	CAIE AC1,"+"
	JRST .+3
	TRO ACB,1B30		;SET DIGITS.
	JRST GETF2		;RETURN.
	CAIE AC1,"-"
	JRST GETFDG		;NO. SEE IF DIGIT.
	TRO ACB,^B101B32	;SET - DIGIT FLAGS.
	JRST GETF2
GETFDG:	BOUND "9","0"
	JRST GETFBD		;NOT A DIGIT.
	SUBI AC1,60		;CONVERT TO DECIMAL.
	IMULI ACC,^D10
	ADD ACC,AC1
	TRO ACB,1B30		;SET DIGITS FLAG.
	JRST GETF2
GETFDN:	TRNE ACB,1B32		;NEGATIVE?
	MOVNS ACC		;NEGATE IT.
	ADD AC4,ACC		;POWER OF TEN.
	FSC AC2,233		;FLOAT FRACTION.
	JUMPE AC4,GETFIN-2	;IF EXPONENT=0, PRINT.
	MOVE ACD,[1.0]		;WILL HAVE FLOATED EXPONENT.
	SETZ ACC,
	JUMPL AC4,GETFDV	;IF EXP<0, THEN DIVIDE.
GETFML:	ADDI ACC,1		;INCREMENT COUNTER.
	FMPR ACD,[10.0]		;MULTIPLY.
	JFOV GETFVR
	CAME ACC,AC4		;ENOUGH?
	JRST GETFML		;NO.
	JRST GETFIN-4		;YES. MULTIPLY FRACTION BY EXPONENT.
GETFDV:	SUBI ACC,1		;DECREMENT COUNTER.
	FDVR ACD,[10.0]		;DIVIDE.
	JFOV GETFUN
	CAME ACC,AC4		;ENOUGH?
	JRST GETFDV		;NOPE.
	FMPR AC2,ACD		;MULTIPLY FRACTION BY EXPONENT.
	JFOV GETFWH
GETFFN:	TRNE ACB,1B33		;NEGATIVE NUMBER?
	FMPR AC2,[-1.0]		;NEGATE IT.
GETFIN:	MOVE AC1,AC2		;SWITCH VALUES.
	POP P,AC2		;GET THE OLD VALUE BACK.
	HRRZ	ACA,AC2		;GET OFFSET INTO ARG BLOCK
	ADD	ACA,Q		;ADD ADR OF ARG BLOCK
	MOVEM	AC1,@ACA	;RETURN VALUE
	JRST @GETFLT
GETFBD:	SETO ACB,		;AN ERROR
	POP P,AC2		;GET THE OLD VALUE AWAY.
	JRST @GETFLT

GETFMS:	1B8
GETFWH:	JUMPL AC4,GETFUN	;IF EXP<0,...
GETFVR:	SETO AC2,
	LSH AC2,-1		;MAXIMUN FLOATING NUMBER.
	JRST GETFFN		;NEGATE IF NEEDED.
GETFUN:	SETZ AC2,		;SMALLEST FLOATING NUMBER.
	JRST GETFIN


DECT:	IDIVI ACA,^D10		;ERROR DECIMAL PRINTOUT REOUTINE.
	HRLM ACB,(P)
	SKIPE ACA
	PUSHJ P,DECT
	HLRZ ACA,(P)
	ADDI ACA,60
	OUTCHR ACA
	POPJ P,

TYPCHR:	Z			;RETURNS TYPE OF CHARACTER.
	CAIE AC1,15		;IS IT A <CR>
	JRST .+6
	SETZ CNT,		;YES. RESET LIST COUNT.
	GETNCR			;SCRAP LINE-FEED.
	MOVEI AC1,1		;1=<CR>
	JRST @TYPCHR		;RETURN.
	CAIE AC1,33		;AN ALTMODE ($)
	JRST .+3
	MOVEI AC1,2		;2=<ALTMODE>
	JRST @TYPCHR		;RETURN.
	CAIE AC1," "		;A SPACE.
	JRST .+3
	MOVEI AC1,3		;3=<SPACE>
	JRST @TYPCHR
	CAIE AC1,","		;A COMMA?
	JRST .+3
	MOVEI AC1,4		;4=<COMMA>
	JRST @TYPCHR
	SETZ AC1,		;0=<ANY OTHER CHAR>
	JRST @TYPCHR

	SUBTTL CLSFIL ROUTINE
;ROUTINE TO CLOSE FILE, DISASSOCIATE CHANNEL NUMBER. CALL:
;::= CALL CLSFIL(<UNIT>)
	ENTRY CLSFIL
CLSFIL:	MOVE AC3,@(Q)		;THIS IS THE LOC IN CHAIN.
	MOVEI	Q,[EXP AC3]
	PUSHJ	P,BRKOUT	;DO A DEFAULT BRKOUT
	MOVE GNL,[CLOSE 0,0]	;CREATE THE CLOSE COMMAND.
	DPB AC3,POINT1		;ENTER UNIT
	MOVEM GNL,.+1
	CLOSE 0,0		;CLOSE THE FILE.
	MOVE GNL,[RELEAS 0,0]	;CREATE THE RELEASE COMMAND.
	DPB AC3,POINT1		;ENTER THE UNIT NUMBER.
	MOVEM GNL,.+1
	RELEAS 0,0		;RELEASE THE DEVICE.
	POPJ	P,		;RETURN

BUFFR:	BLOCK ^D4*^D16		;ALLOW FOR 16 DEVICES: 3 HEADER, 1 LOC

POINT1:	POINT 4,GNL,12
POINT2:	POINT 9,(AC2),8
POINT3:	POINT 7,@(Q)
POINT4:	POINT 7,(ACC)
POINT5:	POINT 6,ACD
POINT6:	POINT 3,(AC2),12
POINT7:	POINT 7,(AC4)
POINT8:	POINT 7,0

NUMDIG:	7

;[DECUS]THE TWO BRANCH TABLES WERE REWRITTEN TO ACCOMMODATE THE CHANGED 
;[DECUS]ARGUMENT TYPE CODES.
BRTAB1:	W PUTINT		;(0)INTEGER OUTPUT.
	W PUTLOG		;(1)LOGICAL
	W PUTINT		;(2)ALSO INTEGER
	W PUTNON		;(3)ILLEGAL
	W PUTFLT		;(4)FLOATING.
	W PUTNON		;(5)ILLEGAL
	W PUTNON		;(6)ILLEGAL.
	W PUTNON		;(7)ILLEGAL
	W PUTHOL		;(10)DOUBLE-PRECISION (HOLERITH)
	W PUTNON		;(11)ILLEGAL.
	W PUTNON		;(12)ILLEGAL
	W PUTNON		;(13)ILLEGAL
	W PUTHOL		;(14)COMPLEX(HOLLERITH)
	W PUTNON		;(15)ILLEGAL
	W PUTNON		;(16)ILLEGAL
	W PUTHOL		;(17)ASCIZ STRING (HOLLERITH)


BRTAB2:	W GETINT		;(0)INTEGER INPUT.
	W GETLOG		;(1)LOGICAL
	W GETINT		;(2)INTEGER
	W GETNON		;(3)ILLEGAL
	W GETFLT		;(4)FLOATING POINT
	W GETNON		;(5)ILLEGAL
	W GETNON		;(6)ILLEGAL
	W GETNON		;(7)ILLEGAL
	W GETHOL		;(10)DOUBLE-PRECISION (HOLLERITH)
	W GETNON		;(11)ILLEGAL
	W GETNON		;(12)ILLEGAL
	W GETNON		;(13)ILLEGAL
	W GETHOL		;(14)COMPLEX=HOLERITH
	W GETNON		;(15)ILLEGAL
	W GETNON		;(16)ILLEGAL
	W GETHOL		;(17)ASCIZ STRING (HOLLERITH)


	END