C***   SPEAK
C  I/O ROUTINES
C  (SPEAK, PSPEAK, RSPEAK, GETIN, YES, A5TOA1, GETLIN, A1TOA5, CONFUZ, CLRLIN, N

       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
      INTEGER*4 RTEXT,PTEXT,MTEXT,N,K,I,L
C     INTEGER*4 LINES,OLINE,MESSGS
      CHARACTER*4 LINES, OLINE
      INTEGER*4 MESSGS
      
C THIS IS BECOUSE OF SOME FUNDAMENTAL CHANGE I MADE TO THE LINES STUFF M.V.:
      INTEGER*4 INDEX
      COMMON /COMTXT/ INDEX(25000)

       COMMON /TXTCOM/ LINES(25000),RTEXT(400),PTEXT(150),MTEXT(45)
       COMMON /BLKCOM/ BLKLIN
C       DIMENSION OLINE(36),ILINE(70)
       DIMENSION OLINE(25000),ILINE(70)
      LOGICAL ACTIVE
      COMMON/LNKCOM/ACTIVE(32),USER(15,32),MESSGS(32),MONITO(32),
     1  TEXT(70,32)
      COMMON/WRUCOM/ME

      M=0
      IF(MONITO(ME).LE.0)GOTO 100
C      CALL SEM$WT(MONITO(ME),CODE)
C NO IDEA WHAT ABOVE LINE DOES, REMOVED IN HOPE IT DOESN'T COUSE
C VOLCANIC ERUPTION.  M.V.
      MESSGS(ME)=N
100    IF(N.EQ.0)GOTO 4
C      IF(LINES(N+1).EQ.XOR('>$< ','CLYD'))GOTO 4
       IF(LINES(N+1).EQ.'>$< ') GOTO 4 !WARNING I'M NOT SURE THIS IS CORRECT
       IF(BLKLIN)PRINT 3
       K=N
C next line gutted as i can't imagine what it means. dt.
C1     IF(M.GT.22)CALL DUPLX$(:30000)
C so add a new label 1
1      CONTINUE
      IF(M.GT.22)M=0
C        L=IABS(LINES(K))-K-1
      L=IABS(INDEX(K))-K-1! I THINK THIS IS RIGHT, NOW (M.V.)
       DO 2 I=1,L
C2     OLINE(I)=XOR(LINES(K+I),'CLYD')
 2        OLINE(I)=LINES(K+I)
       PRINT 3,(OLINE(I),I=1,L)
3       FORMAT(' ',19A4)
      M=M+1
       K=K+L+1
C       IF(LINES(K).GE.CHAR(0))GOTO 1
       IF(INDEX(K).GE.0)GOTO 1!THERE WAS A PROBLEM HERE. M.V.
4     IF(MONITO(ME).GE.0)RETURN
      DO 10 I=1,70
10    ILINE(I)=TEXT(I,IABS(MONITO(ME)))
      MONITO(ME)=0
      WRITE(1,101)ILINE
101   FORMAT(70A1)
      RETURN
       END