C  I/O ROUTINES (SPEAK, PSPEAK, RSPEAK, GETIN, YES, A5TOA1)


	SUBROUTINE SPEAK(N)

C  PRINT THE MESSAGE WHICH STARTS AT LINES(N).  PRECEDE IT WITH A BLANK LINE
C  UNLESS BLKLIN IS FALSE.

	IMPLICIT INTEGER(A-Z)
	LOGICAL BLKLIN
	COMMON /TXTCOM/ RTEXT,LINES
	COMMON /BLKCOM/ BLKLIN
	DIMENSION RTEXT(205),LINES(9650)

	IF(N.EQ.0)RETURN
	IF(LINES(N+1).EQ.3H>$<)RETURN
	IF(BLKLIN)TYPE 2
	K=N
1	L=IABS(LINES(K))-1
	K=K+1
	TYPE 2,(LINES(I),I=K,L)
2	FORMAT(' ',18A4)
	K=L+1
	IF(LINES(K).GE.0)GOTO 1
	RETURN
	END



	SUBROUTINE PSPEAK(MSG,SKIP)

C  FIND THE SKIP+1ST MESSAGE FROM MSG AND PRINT IT.  MSG SHOULD BE THE INDEX OF
C  THE INVENTORY MESSAGE FOR OBJECT.  (INVEN+N+1 MESSAGE IS PROP=N MESSAGE).

	IMPLICIT INTEGER(A-Z)
	COMMON /TXTCOM/ RTEXT,LINES
	COMMON /PTXCOM/ PTEXT
	DIMENSION RTEXT(205),LINES(9650),PTEXT(100)

	M=PTEXT(MSG)
	IF(SKIP.LT.0)GOTO 9
	DO 3 I=0,SKIP
1	M=IABS(LINES(M))
	IF(LINES(M).GE.0)GOTO 1
3	CONTINUE
9	CALL SPEAK(M)
	RETURN
	END



	SUBROUTINE RSPEAK(I)

C  PRINT THE I-TH "RANDOM" MESSAGE (SECTION 6 OF DATABASE).

	IMPLICIT INTEGER(A-Z)
	COMMON /TXTCOM/ RTEXT
	DIMENSION RTEXT(205)

	IF(I.NE.0)CALL SPEAK(RTEXT(I))
	RETURN
	END



	SUBROUTINE MSPEAK(I)

C  PRINT THE I-TH "MAGIC" MESSAGE (SECTION 12 OF DATABASE).

	IMPLICIT INTEGER(A-Z)
	COMMON /MTXCOM/ MTEXT
	DIMENSION MTEXT(35)

	IF(I.NE.0)CALL SPEAK(MTEXT(I))
	RETURN
	END



C	SUBROUTINE GETIN(WORD1,WORD1X,WORD2,WORD2X)

C  GET A COMMAND FROM THE ADVENTURER.  SNARF OUT THE FIRST WORD, PAD IT WITH
C  BLANKS, AND RETURN IT IN WORD1.  CHARS 6 THRU 10 ARE RETURNED IN WORD1X, IN
C  CASE WE NEED TO PRINT OUT THE WHOLE WORD IN AN ERROR MESSAGE.  ANY NUMBER OF
C  BLANKS MAY FOLLOW THE WORD.  IF A SECOND WORD APPEARS, IT IS RETURNED IN
C  WORD2 (CHARS 6 THRU 10 IN WORD2X), ELSE WORD2 IS SET TO ZERO.

C	IMPLICIT INTEGER(A-Z)
C	LOGICAL BLKLIN
C	COMMON /BLKCOM/ BLKLIN
C	DIMENSION A(5),MASKS(6)
C	DATA MASKS/"4000000000,"20000000,"100000,"400,"2,0/
C	1	,BLANKS/'     '/
C
C	IF(BLKLIN)TYPE 1
C1	FORMAT()
C2	ACCEPT 3,(A(I),I=1,4)
C3	FORMAT(4A5)
C	J=0
C	DO 9 I=1,4
C	IF(A(I).NE.BLANKS)J=1
C9	A(I)=A(I).AND.(SHIFT((A(I).AND.'@@@@@'),-1).XOR.-1)
C	IF(BLKLIN.AND.J.EQ.0)GOTO 2
C
C	SECOND=0
C	WORD1=A(1)
C	WORD1X=A(2)
C	WORD2=0
C
C	DO 10 J=1,4
C	DO 10 K=1,5
C	MSK="774000000000
C	IF(K.NE.1)MSK="177*MASKS(K)
C	IF(((A(J).XOR.BLANKS).AND.MSK).EQ.0)GOTO 15
C	IF(SECOND.EQ.0)GOTO 10
C	MSK=-MASKS(6-K)
C	WORD2=(SHIFT(A(J),7*(K-1)).AND.MSK)
C	1	+(SHIFT(A(J+1),7*(K-6)).AND.(-2-MSK))
C	WORD2X=(SHIFT(A(J+1),7*(K-1)).AND.MSK)
C	1	+(SHIFT(A(J+2),7*(K-6)).AND.(-2-MSK))
C	RETURN
C15	IF(SECOND.EQ.1)GOTO 10
C	SECOND=1
C	IF(J.EQ.1)WORD1=(WORD1.AND.-MASKS(K))
C	1	.OR.(BLANKS.AND.(-MASKS(K).XOR.-1))
C10	CONTINUE
C	RETURN
C	END
	SUBROUTINE GETIN(WRD1,WRD1X,WRD2,WRD2X)
	IMPLICIT INTEGER*4 (A-Z)
C  GET COMMAND
	LOGICAL BLKLIN,BLANK,PBLANK
	LOGICAL*1 QBLANK,LETTER(50)
	LOGICAL*1 QWORD1(4),QWORD1X(4),QWORD2(4),QWORD2X(4)
	COMMON /BLKCOM/ BLKLIN
	EQUIVALENCE (WORD1,QWORD1(1)), (WORD1X,QWORD1X(1))
	EQUIVALENCE (WORD2,QWORD2(1)), (WORD2X,QWORD2X(1))
	DATA BLANK/4H    /,QBLANK/1H /
	IF(BLKLIN) TYPE 1
1	FORMAT(1H )
2	DO 5 I=1,50
5	LETTER(I)=QBLANK
	ACCEPT 3,LETTER
3	FORMAT(50A1)
	WORD1=BLANK
	WORD1X=BLANK
	WORD2=BLANK
	WORD2X=BLANK
	PBLANK=.TRUE.
	IX=0
	IWORD=1
	DO 100 I=1,50
	IF(LETTER(I).EQ.QBLANK) GO TO 40
	PBLANK=.FALSE.
	IF(IWORD.NE.1) GO TO 30
	IX=IX+1
	IF(IX.GE.5) GO TO 20
	QWORD1(IX)=LETTER(I)
	GO TO 100
20	IF(IX.GE.9) GO TO 100
	QWORD1X(IX-4)=LETTER(I)
	GO TO 100
30	IX=IX+1
	IF(IX.GE.5) GO TO 35
	QWORD2(IX)=LETTER(I)
	GO TO 100
35	IF(IX.GE.9) GO TO 120
	QWORD2X(IX-4)=LETTER(I)
	GO TO 100
40	CONTINUE
	IF(PBLANK) GO TO 100
	IWORD=IWORD+1
	IF(IWORD.EQ.3) GO TO 120
	IX=0
	PBLANK=.TRUE.
100	CONTINUE
120	CONTINUE
	IF(WORD1.EQ.BLANK) GO TO 2
	WRD1=WORD1
	WRD1X=WORD1X
	WRD2=WORD2
	IF(WORD2.EQ.BLANK) WRD2=0
	WRD2X=WORD2X
	RETURN
	END



	LOGICAL FUNCTION YES(X,Y,Z)

C  CALL YESX (BELOW) WITH MESSAGES FROM SECTION 6.

	IMPLICIT INTEGER(A-Z)
	EXTERNAL RSPEAK
	LOGICAL YESX

	YES=YESX(X,Y,Z,RSPEAK)
	RETURN
	END



	LOGICAL FUNCTION YESM(X,Y,Z)

C  CALL YESX (BELOW) WITH MESSAGES FROM SECTION 12.

	IMPLICIT INTEGER(A-Z)
	EXTERNAL MSPEAK
	LOGICAL YESX

	YESM=YESX(X,Y,Z,MSPEAK)
	RETURN
	END



	LOGICAL FUNCTION YESX(X,Y,Z,SPK)

C  PRINT MESSAGE X, WAIT FOR YES/NO ANSWER.  IF YES, PRINT Y AND LEAVE YEA
C  TRUE; IF NO, PRINT Z AND LEAVE YEA FALSE.  SPK IS EITHER RSPEAK OR MSPEAK.

	IMPLICIT INTEGER(A-Z)

1	IF(X.NE.0)CALL SPK(X)
	CALL GETIN(REPLY,JUNK1,JUNK2,JUNK3)
	IF(REPLY.EQ.3HYES.OR.REPLY.EQ.1HY)GOTO 10
	IF(REPLY.EQ.2HNO.OR.REPLY.EQ.1HN)GOTO 20
	TYPE 9
9	FORMAT(/' PLEASE ANSWER THE QUESTION.')
	GOTO 1
10	YESX=.TRUE.
	IF(Y.NE.0)CALL SPK(Y)
	RETURN
20	YESX=.FALSE.
	IF(Z.NE.0)CALL SPK(Z)
	RETURN
	END
