
PROGRAM MIRACLE_MESSAGE

**
	PROGRAM MIRACLE_MESSAGE     VAX-11 FORTRAN

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

	MIRACLE MESSAGE PRINTING PROGRAM

	PRODUCES HIGHLY-READABLE COMPUTER-OUTPUT MESSAGES
	SUITABLE FOR USE AS WALL-HUNG POSTERS OR SIGNS.
	THE MESSAGES ARE PRINTED IN ROMAN LETTERS, THE
	CAPITALS OF WHICH ARE 2.7 INCHES TALL. THE TEXT
	OF THE MESSAGE IS PRINTED 'DOWN' THE PAGE,
	WITH UP TO FOUR ROWS  OF TEXT PRINTED AT A TIME.
	FOR EXAMPLE, THE LOWER CASE LETTER 'E' WOULD BE

	     MMMMMMM	    SU1
	  MMMMMMMMMMMMM     SU2
	 MMMMMMMMMMMMMMM    SU3			    VERTICAL---->
	 MMMM    MM  MMMM   SU4
	MMMM     MM    MMM  SU5
	MMM	 MM    MMM  SU6    (SU=SCAN UNIT)    HORIZONTAL
	MMM	 MM    MMM  SU7				  I
	MMM	 MM    MMM  SU8				  I
	 MM	 MM   MMM   SU9				\ I /
	 MMM     MMMMMMMM   SU10			 \I/
	  MMM    MMMMMMM    SU11			  V
	   MM    MMMMM	    SU12

	UP TO 40 ROWS  OF TEXT CAN BE PRINTED, CONTAINING
	UP TO 1000 LETTERS TOTAL.

	THE PRINTED TEXT CAN CONTAIN ANY OF THE FOLLOWING
	CHARACTERS:

	    ALPHABETIC LETTERS, UPPER AND LOWER CASE.

	    NUMERALS

	    +  -  /  (  )  =  ,  .  !  ?  :  ;

	    LEFT AND RIGHT ' AND "  (` IS LEFT SINGLE QUOTE,
				    ~ IS LEFT DOUBLE QUOTE)

	THE FOLLOWING ARE USED AS ESCAPE CHARACTERS:

	    #  (NORMAL/OVERPRINT DARKNESS) (DEFAULT NORMAL)

	    $  (VERTICAL/ITALIC FONT)     (DEFAULT VERTICAL)

	(EACH IS RESET TO ITS DEFAULT AT THE START OF
	EVERY ROW OF TEXT)

	QUALIFIERS CAN BE USED TO SPECIFY OVERPRINTING
	(/DARKEN) OR CENTERING OF THE ROWS (/CENTER).

	DEFAULTS ARE NON-OVERPRINTED, LEFT-JUSTIFIED ROWS.

	EACH ROW OF TEXT IS SPECIFIED BY ONE INPUT RECORD.
	IF LESS THAN FOUR ROWS OF TEXT ARE REQUESTED, THE
	LINES ARE CENTERED VERTICALLY.

	SEE THE HELP FILE FOR MORE INFORMATION.


	A.L.ZIRKLE     DK-74    (EARLY 1970'S)     (ORIGINAL CDC VERSION)
	A.L.ZIRKLE     K105     MARCH 83	     (VAX VERSION)

IMPLICIT INTEGER (A-Z)

LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT
COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

*	PROCESS THE COMMAND LINE.

CALL VAX_COMMAND

*	READ THE INPUT RECORDS AND BUILD THE 'SPECS' DATA STRUCTURE.

CALL READ

*	IF 1-3 ROWS OF TEXT, CENTER THEM VERTICALLY ON PRINTED PAGE.

IF (ROWS.LT.GROWS) THEN

  DO I=1,ROWS

    POSITN(I) = POSITN(I)-(VSIZE-33*ROWS)/2

  ENDDO

ENDIF

*	HORIZONTALLY CENTER, IF DESIRED, AND PRINT THE ROWS OF TEXT.

IF (CENTER) CALL CENTER_ROWS

CALL PRINT_ROWS

END
SUBROUTINE VAX_COMMAND

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

IMPLICIT INTEGER (A-Z)

CHARACTER QUEUE*64,OUTFILE*128,COPIES*4,INFILE*80
LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120
COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT
COMMON /PRNT/ QUEUE,OUTFILE,COPIES
COMMON /WORK/ INFILE

DATA GROWS,HSIZE,COPIES / 4,88,'1' /

CALL CLI$GET_VALUE('P1',INFILE)
OPEN (5,FILE=INFILE,STATUS='OLD',READONLY,ERR=100)

CALL VAX_QUALIFIERS

IF (GROWS.LT.6) THEN
    DO I=1,GROWS
	POSITN(I)=POSITN(I+6-GROWS)
    ENDDO
ENDIF

IF (DARKEN) OPRINT=9999999

VSIZE = GROWS*33

RECL = VSIZE+1
IF (LXY) RECL = RECL+1

OPEN (99,FILE=OUTFILE,DEFAULTFILE='.LIS',STATUS='NEW',
1					RECL=RECL,ERR=110)

CALL VAX_INPUT_FILE

RETURN
00	CALL ERROR(1)
10	CALL ERROR(4)

END
SUBROUTINE VAX_QUALIFIERS

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

IMPLICIT INTEGER (A-Z)

PARAMETER ( CLI$_PRESENT = '3FD19'X )

CHARACTER QUEUE*64,OUTFILE*128,COPIES*4
CHARACTER CEQUAL*16,LAQUAL*16
LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120,OUTPUT,COPY
REAL*4 PAGE_SIZE

COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120
COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT
COMMON /PRNT/ QUEUE,OUTFILE,COPIES
COMMON /WORK/ CEQUAL,LAQUAL

*	REMEMBER TO CHANGE THE 'HELP' FILE IF YOU CHANGE ANY DEFAULTS!

PRINT  = CLI$PRESENT('PRINT')
OUTPUT = CLI$PRESENT('OUTPUT')
DARKEN = CLI$PRESENT('DARKEN')
CENTER = CLI$PRESENT('CENTER')
LXY    = CLI$PRESENT('LXY')
LA120  = CLI$PRESENT('LA120')
COPY   = CLI$PRESENT('COPIES')

IF (PRINT)  CALL CLI$GET_VALUE('PRINT' ,QUEUE)
IF (OUTPUT) CALL CLI$GET_VALUE('OUTPUT',OUTFILE)
IF (CENTER) CALL CLI$GET_VALUE('CENTER',CEQUAL)
IF (LA120)  CALL CLI$GET_VALUE('LA120' ,LAQUAL)
IF (COPY)   CALL CLI$GET_VALUE('COPIES',COPIES)

*	CHECK FOR INCOMPATIBILITIES AND INCONSISTENCIES.

IF (LXY.AND.LA120) THEN
    IF (LXY.EQ.LA120) GO TO 110
    LA120 = LA120 .EQ. CLI$_PRESENT
    LXY   = .NOT. LA120
ENDIF

IF (PRINT.AND.OUTPUT) THEN
    IF (PRINT.EQ.OUTPUT) GO TO 110
    OUTPUT = OUTPUT .EQ. CLI$_PRESENT
    PRINT  =.NOT. OUTPUT
ELSE
    IF (.NOT.(PRINT.OR.OUTPUT)) GO TO 110
ENDIF

IF (LXY .AND. DARKEN   ) GO TO 110
IF (COPY.AND..NOT.PRINT) GO TO 110

IF (LA120) THEN
    GROWS = ICHAR(LAQUAL(1:1))-ICHAR('0')
    IF (GROWS.LT.4.OR.GROWS.GT.6) GO TO 120
ENDIF

IF (COPY) THEN
    READ (COPIES,1000,ERR=120) COQUAL
    IF (COQUAL.LE.0) GO TO 120
ENDIF

IF (CENTER) THEN
    IF (INDEX(CEQUAL,'.').EQ.0) CEQUAL(INDEX(CEQUAL,' '):)='.'
    READ (CEQUAL,1001,ERR=120) PAGE_SIZE
    IF (PAGE_SIZE.LE.0.0) GO TO 120
    HSIZE = PAGE_SIZE*8.
    IF (GROWS.GT.4) HSIZE = PAGE_SIZE*12.    ! FOR LA120=5ROWS OR 6ROWS
ENDIF

RETURN
10	CALL ERROR(2)
20	CALL ERROR(3)
000	FORMAT (BN,I)001	FORMAT (BN,F)

END
SUBROUTINE VAX_INPUT_FILE

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

IMPLICIT INTEGER (A-Z)

PARAMETER ( DVI$_DEVCLASS = '4'X , DC$_TERM = '42'X )

CHARACTER INFILE*80
LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120
INTEGER*4 ITMLST(4) / 4*0 /
EXTERNAL ERROR

COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120
COMMON /WORK/ INFILE

INQUIRE (5,NAME=INFILE)

ITMLST(1) = IOR(ISHFT(4,16),DVI$_DEVCLASS)
ITMLST(2) = %LOC(CLASS)

COL = INDEX(INFILE,':')

STATUS = SYS$GETDVI(,,INFILE(1:COL-1),ITMLST,,,,)

IF (.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))

PROMPT = CLASS .EQ. DC$_TERM

IF (PROMPT) THEN

    OPEN (6,FILE=INFILE(1:COL),STATUS='NEW')
    WRITE (6,100)
    CLOSE (6)

    CALL VAX_CONTROL_C(INFILE(1:COL),ERROR,8)

ENDIF
00	FORMAT ('0Enter your message below.  ',
1	'Press CTRL/Z when complete, CTRL/C to quit:'/
2				'--------------------------')

END
SUBROUTINE VAX_CONTROL_C (TERMINAL , ROUTINE , PARAMETER )


	SUBROUTINE VAX_CONTROL_C (TERMINAL , ROUTINE , PARAMETER )

	Sets up linkage for subroutine ROUTINE to get control when a
	CTRL/C is entered on TERMINAL (where TERMINAL is a character
	string containing the physical device name of the terminal).

	Argument ROUTINE must be declared EXTERNAL in the calling
	program.  The value of PARAMETER is passed to ROUTINE.

	4 February 1983

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815	   DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*


IMPLICIT INTEGER (A-Z)

PARAMETER ( IO$_SETMODE = '23'X , IO$M_CTRLCAST = '100'X )

CHARACTER*(*) TERMINAL
EXTERNAL ROUTINE

INTEGER*2 CHAN,IOSB(4)

STATUS = SYS$ASSIGN(TERMINAL,CHAN,,)

IF (.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))

STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(IO$_SETMODE+IO$M_CTRLCAST),
1				   IOSB,,,ROUTINE,PARAMETER,,,,)

IF (.NOT.STATUS) CALL LIB$STOP(%VAL(STATUS))

IF (.NOT.IOSB(1)) CALL LIB$STOP(%VAL(IOSB(1)))

END
SUBROUTINE ERROR(ORDINAL)

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

IMPLICIT INTEGER (A-Z)

INTEGER*4 VECTOR(10) / 10*0 /

EXTERNAL MIRACLE_OPENIN  ,MIRACLE_INCOMPAT,MIRACLE_INVALID,
1        MIRACLE_OPENOUT ,MIRACLE_TOOMANY ,MIRACLE_NOTEXT ,
2	 MIRACLE_OVERFLOW,MIRACLE_ABORTED

LOGICAL OUTPUT_OPEN

IF (ORDINAL.EQ.1.OR.ORDINAL.EQ.4) CALL ERRSNS(,RMSSTS,RMSSTV)

INQUIRE (99,OPENED=OUTPUT_OPEN)

IF (OUTPUT_OPEN) CLOSE (99,STATUS='DELETE')

GO TO (1,2,3,4,5,6,7,8),ORDINAL
	CALL LIB$STOP(MIRACLE_OPENIN,%VAL(0),%VAL(RMSSTS),%VAL(0),
1						%VAL(RMSSTV))

	CALL LIB$STOP(MIRACLE_INCOMPAT)

	CALL LIB$STOP(MIRACLE_INVALID)

	CALL LIB$STOP(MIRACLE_OPENOUT,%VAL(0),%VAL(RMSSTS),%VAL(0),
1						%VAL(RMSSTV))

	CALL LIB$STOP(MIRACLE_TOOMANY)

	CALL LIB$STOP(MIRACLE_NOTEXT)

	CALL LIB$STOP(MIRACLE_OVERFLOW)

	CALL LIB$STOP(MIRACLE_ABORTED)

END
SUBROUTINE READ
*
	SUBROUTINE READ     VAX-11 FORTRAN     MIRACLE MESSAGE

	PROCESSES THE INPUT RECORDS, BUILDING THE ARRAYS 'SPECS',
	'POINTR', AND 'LENGTH', AND VARIABLES 'PAGES' AND 'ROWS'.


---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*


IMPLICIT INTEGER (A-Z)

CHARACTER*1 CHARS,ISYM,LSYM
CHARACTER*80 IN
LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT
COMMON /SPEC/ POINTR(40),LENGTH(40),SPECS(2,1000)
COMMON /CHAR/ CHARS(78),LINKS(78,2),DATA(1004)
COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120
COMMON /WORK/ IN

ROWS  = 0
ISPEC = 0

*	READ NEXT RECORD AND START ANOTHER ROW OF TEXT. INITIALIZE TO
	NO OVERPRINTING, NON-ITALIC. IGNORE TRAILING BLANKS ON INPUT
	RECORD.  CREATE A ONE-SU BLANK ENTRY AT START OF ROW FOR
	USE IN HORIZONTAL CENTERING, IF PERFORMED.
	READ (5,1000,END=10) IN

ISPEC = ISPEC+1
IF (ISPEC.GT.1000) GO TO 100

SPECS(1,ISPEC) = 0
SPECS(2,ISPEC) = 1

ROWS = ROWS+1
IF (ROWS.GT.40) CALL ERROR(5)

LENGTH(ROWS) = 0
POINTR(ROWS) = ISPEC

OPRNT  = 0
ITALIC = 0
LSYM   = ' '

ENDCOL = 1
DO ICOL=1,80
  IF (IN(ICOL:ICOL).NE.' ') ENDCOL = ICOL
ENDDO

DO 9 ICOL=1,ENDCOL

*	GET NEXT CHARACTER FROM RECORD.

ISYM = IN(ICOL:ICOL)

*	IF BLANK, CREATE AN ENTRY FOR A BLANK LETTER WHICH IS 8 SU'S
	LONG.

IF (ISYM.EQ.' ') THEN

  ISPEC = ISPEC+1
  IF (ISPEC.GT.1000) GO TO 100

  SPECS(1,ISPEC) = 0
  SPECS(2,ISPEC) = 8

  LENGTH(ROWS) = LENGTH(ROWS)+8
  LSYM = ' '

*	IF DOLLAR SIGN, SWITCH FONTS (ITALIC/VERTICAL). IF END OF
	ITALICS, PAD FINAL ITALIC LETTER WITH TRAILING BLANKS SO
	IT DOESN'T CRASH INTO TOP OF NEXT LETTER OR COME TOO CLOSE
	TO NEXT TEXT WORD, AND DISABLE OVERLAP PROCESSING.

ELSE IF (ISYM.EQ.'$') THEN

  ITALIC = 1-ITALIC

  IF (ITALIC.EQ.0) THEN
    SPECS(2,ISPEC) = SPECS(2,ISPEC)+5
    LENGTH(ROWS) = LENGTH(ROWS)+5
    LSYM = ' '
  ENDIF

*	IF POUND SIGN (#), SWITCH DARKNESS (OVERPRINT/NORMAL). HAS NO
	EFFECT IF '/DARK' COMMAND QUALIFIER IS IN EFFECT; IGNORED FOR LXY.

ELSE IF (ISYM.EQ.'#') THEN

  IF (.NOT.LXY) OPRNT = 1-OPRNT

*	SYMBOL IS NOT AN ESCAPE CHARACTER. IF IT IS NOT IMPLEMENTED,
	IGNORE IT; OTHERWISE, BUILD ITS ENTRY IN 'SPECS' ARRAY,
	INCLUDING A TRAILING TWO-SU INTER-LETTER GAP (WHICH MAY BE
	MODIFIED BY OVERLAP PROCESSING).  THEN, IF PREVIOUS INPUT
	SYMBOL (NOT INCLUDING ESCAPE CHARACTERS) WAS NON-BLANK, PERFORM
	OVERLAP PROCESSING.

ELSE

  DO NSYM=1,78

    IF (ISYM.EQ.CHARS(NSYM)) THEN

	LENSYM = LINKS(NSYM,2)

	NEND = LENSYM+2
	NGAP = LENSYM
	NOVL = NEND

	ISPEC = ISPEC+1
	IF (ISPEC.GT.1000) GO TO 100

	SPECS(1,ISPEC) = LINKS(NSYM,1)
	SPECS(2,ISPEC) = NEND+10000*NGAP+1000000*NOVL+
1				100000000*OPRNT+200000000*ITALIC

	LENGTH(ROWS) = LENGTH(ROWS)+NEND

	IF (LSYM.NE.' ') CALL OVRLAP(LSYM,ISYM,ISPEC)
	LSYM = ISYM
	GO TO 9

    ENDIF

  ENDDO

ENDIF

	CONTINUE

*	END OF AN INPUT RECORD REACHED; THUS, END OF A ROW OF TEXT. BUILD
	SPECIAL 'END-OF-ROW' ENTRY IN 'SPECS' ARRAY; THEN GET NEXT RECORD.

ISPEC = ISPEC+1
IF (ISPEC.GT.1000) GO TO 100

SPECS(1,ISPEC) = -10000
SPECS(2,ISPEC) = -10000

IF (ITALIC.GT.0) LENGTH(ROWS) = LENGTH(ROWS)+5
GO TO 1

*	LAST RECORD PROCESSED; HALT IF NO INPUT FOUND, ELSE RETURN.
0	IF (ROWS.LE.0) CALL ERROR(6)
RETURN
00	CALL ERROR(7)
000	FORMAT (A)

END
SUBROUTINE OVRLAP(LSYM,ISYM,ISPEC)
*
	SUBROUTINE OVRLAP     VAX-11 FORTRAN     MIRACLE MESSAGE

	CHECKS FOR POSSIBLE 'OVERLAPS', I.E. CONTIGUOUS TEXT
	LETTERS WHICH CAN BE 'SQUEEZED' TOGETHER TO ELIMINATE
	EXCESS SPACE WHICH GIVES AN UNAESTHETIC UNEVEN APPEARANCE.
	SUCH AN EXCESS SPACE OCCURS BETWEEN THE CAPITAL LETTERS
	'A' AND 'V', FOR INSTANCE.  DIFFERENT PAIRS OF LETTERS
	CAN BE OVERLAPPED BY DIFFERENT AMOUNTS; MOST PAIRS CANNOT
	BE OVERLAPPED AT ALL.  OTHER PAIRS OCCUR SO INFREQUENTLY
	THAT IT IS NOT WORTH CHECKING FOR THEM.  THE ARRAY 'PAIRS'
	CONTAIN THE KNOWN RELEVANT PAIRS WHICH CAN BE OVERLAPPED;
	IT MAY NOT BE COMPLETE.


---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*


IMPLICIT INTEGER (A-Z)

CHARACTER*1 LSYM,ISYM
CHARACTER*2 PAIRS,PAIR

COMMON /SPEC/ POINTR(40),LENGTH(40),SPECS(2,1000)
COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT
COMMON /PAIR/ PAIRS(490)

*	CONVERT INPUT (LSYM,ISYM) INTO 'PAIR' WHICH IS IN FORMAT OF
	'PAIRS' ARRAY.

PAIR = LSYM // ISYM

*	IF 'PAIR' IS NOT IN 'PAIRS' ARRAY THEN RETURN; NO OVERLAP
	IS POSSIBLE.

DO I=1,490
  IF (PAIR.EQ.PAIRS(I)) GO TO 2
ENDDO

RETURN

*	COMPUTE OVERLAP AMOUNT (1-5) FROM POSITION OF 'PAIR' IN
	'PAIRS' ARRAY.

	IF (I.LE.225) THEN
  OVLAP=1
ELSE IF (I.LE.358) THEN
  OVLAP=2
ELSE IF (I.LE.442) THEN
  OVLAP=3
ELSE IF (I.LE.478) THEN
  OVLAP=4
ELSE
  OVLAP=5
ENDIF

*	ENTER THE DATA NECESSARY TO PERFORM THE OVERLAP INTO THE
	'SPECS' ARRAY ENTRY OF THE FIRST LETTER OF THE PAIR (I.E. THE
	PREVIOUS INPUT SYMBOL).

IOVLAP=OVLAP*1000000+MIN0(OVLAP,2)
SPECS(2,ISPEC-1)=SPECS(2,ISPEC-1)-IOVLAP
LENGTH(ROWS)=LENGTH(ROWS)-OVLAP

END
SUBROUTINE CENTER_ROWS
*
	SUBROUTINE CENTER_ROWS     VAX-11 FORTRAN     MIRACLE MESSAGE

	HORIZONTALLY CENTERS THE ROWS OF TEXT WITH RESPECT TO EACH
	OTHER, BY EXPANDING THE ONE-SU BLANK ENTRY AT THE START OF
	EACH ROW TO THE AMOUNT NECESSARY TO CENTER THE ROW.

	FIRST, THE LONGEST ROW IS FOUND, AND IT IS CENTERED BETWEEN
	PAGE PERFORATIONS, ALLOWING AT LEAST A ONE INCH LEFT/RIGHT
	MARGIN BETWEEN PERFORATIONS AND TEXT.  THEN, ALL OTHER ROWS
	ARE CENTERED WITH RESPECT TO THIS ROW.


---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*


IMPLICIT INTEGER (A-Z)

COMMON /SPEC/ POINTR(40),LENGTH(40),SPECS(2,1000)
COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT

DATA LTOP / 6 /

MAXLEN = 0
DO I=1,ROWS
  MAXLEN = MAX(MAXLEN,LENGTH(I))
ENDDO

LRSPA = HSIZE-MOD(MAXLEN,HSIZE)
IF (LRSPA.LT.20) LRSPA = LRSPA+HSIZE
LRSPA = LRSPA/2-LTOP

DO I=1,ROWS
  IBIAS = (MAXLEN-LENGTH(I))/2
  ISPEC = POINTR(I)
  SPECS(2,ISPEC) = IBIAS+LRSPA
ENDDO

END
SUBROUTINE PRINT_ROWS
*
	SUBROUTINE PRINT_ROWS     VAX-11 FORTRAN     MIRACLE MESSAGE

	PRINTS THE TEXT USING THE DATA FROM THE ARRAYS 'SPECS',
	'POINTR', AND 'DATA' AND FROM VARIABLES 'PAGES', 'ROWS',
	AND 'OPRINT'.  THE PRINTER SHOULD BE SET TO PRINT AT
	EIGHT LINES PER INCH.


---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*


IMPLICIT INTEGER (A-Z)

PARAMETER ( line_size = 33*6 , buf_size = line_size*8 )

CHARACTER*1 CHARS
CHARACTER*(buf_size) OUT,PUT

COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT
COMMON /SPEC/ POINTR(40),LENGTH(40),SPECS(2,1000)
COMMON /CHAR/ CHARS(78),LINKS(78,2),DATA(1004)
COMMON OUT,PUT

CHARACTER*1 BLACK / 'M' /, BLAKK / 'W' /

*	PRINT GROUPS OF FOUR ROWS OF TEXT AT A TIME (EXCEPT FINAL
	GROUP, WHICH MAY HAVE 1-4 ROWS).  (FOR LA120, GROUPS MAY HAVE
	UP TO SIX ROWS.)

CALL PRINT_START

DO 80 GROUP=1,(ROWS+GROWS-1)/GROWS

*	AT START OF EACH GROUP, INITIALIZE THE OUTPUT ARRAYS TO BLANKS.
	COMPUTE THE ROW NUMBERS IN THIS GROUP.  SET ITALICS OFF; OVER-
	PRINTING IS SET IN MAIN PROGRAM.

OUT = ' '
PUT = ' '

JROW   = GROWS*(GROUP-1)+1
KROW   = MIN(JROW+GROWS-1,ROWS)
ISLANT = 0
DONE   = 0

*	PROCESS ONE SU (ONE PRINT LINE) OF ALL THE TEXT ROWS IN THIS
	THIS GROUP.
0	I = 1
DO 70 IROW=JROW,KROW

*	IF ROW WAS NOT ALREADY COMPLETED, GET DATA TO PROCESS NEXT
	SU OF ROW.

ISPEC = POINTR(IROW)
IF (ISPEC.LE.0) GO TO 70

N      = SPECS(1,ISPEC)/10000
LOCATN = MOD(SPECS(1,ISPEC),10000)
NEND   = MOD(SPECS(2,ISPEC),10000)
NGAP   = MOD(SPECS(2,ISPEC)/10000,100)
NOVL   = MOD(SPECS(2,ISPEC)/1000000,100)
OPRNT  = MAX(MOD(SPECS(2,ISPEC)/100000000,2),OPRINT)
ITALIC = MOD(SPECS(2,ISPEC)/200000000,2)

*	IF END-OF-ROW FOUND, SET COMPLETION INDICATORS. IF ALL ROWS
	IN GROUP ARE FINISHED, EXIT TO END-OF-GROUP CODING.

IF (N.LT.0) THEN

  DONE = DONE+1
  IF (DONE.GE.KROW-JROW+1) GO TO 75
  POINTR(IROW) = 0
  GO TO 70

ENDIF

*	PROCESS A SU OF A LETTER. BRANCH IF BLANK LETTER OR IF INTER-
	LETTER GAP REACHED; OTHERWISE GET BIT STRING TO PRINT THIS SU.

IF (N.GE.NGAP) GO TO 60
BITS = DATA(LOCATN)

*	BRANCH IF NOT IN OVERLAP SITUATION. OTHERWISE, GET BIT STRING
	FOR SU OF SECOND CHARACTER OF PAIR, AND COMBINE THE TWO. ALSO,
	INCREMENT SECOND CHARACTER'S VALUES OF 'N' AND 'LOCATN'.

IF (N.GE.NOVL) THEN
  LOCATN = MOD(SPECS(1,ISPEC+1),10000)
  BITS = BITS+DATA(LOCATN)
  SPECS(1,ISPEC+1) = SPECS(1,ISPEC+1)+10001
ENDIF

*	GET STARTING PRINT COLUMN FOR OUTPUT OF SU AND ENTER LOOP TO
	PROCESS EACH BIT IN THE BIT STRING. FOR BITS WHICH ARE OFF
	(ZERO), DON'T PRINT ANYTHING.

ICOL = POSITN(I)+32

DO J=1,32

    ICOL = ICOL-1

    IF (IAND(BITS,1).NE.0) THEN

*	FOR NON-ZERO BITS, IF NON-ITALIC THEN PUT A CHARACTER IN THIS
	PRINT LINE POSITION. IF OVERPRINTING, PUT CHARACTER IN THIS
	OVERPRINT LINE POSITION.

	IF (ITALIC.EQ.0) THEN
	    OUT(ICOL:ICOL) = BLACK
	    IF (OPRNT.GT.0) PUT(ICOL:ICOL) = BLAKK

*	FOR ITALIC LETTERS, COMPUTE POSITION FOR CHARACTER IN THE
	PRINT LINE BUFFER, BASED ON THE SLOPING FACTOR OF THE ITALIC
	FONT (4 TO 1). SET 'ISLANT' AND 'OPRINT' SO THAT BUFFER WILL
	BE EMPTIED IF ROW ENDS WITH AN ITALIC LETTER. IF OVERPRINTING,
	PUT CHARACTER IN PROPER OVERPRINT LINE BUFFER POSITION.

	ELSE
	    JCOL = ((32-J)/4)*VSIZE+ICOL
	    OUT(JCOL:JCOL) = BLACK
	    ISLANT = 8
	    IF (OPRNT.GT.0) PUT(JCOL:JCOL) = BLAKK
	ENDIF

*	PREPARE TO PROCESS NEXT BIT OF THIS SU OF LETTER.

    ENDIF

    BITS = BITS/2

ENDDO

*	THIS SU OF LETTER DONE; PREPARE DATA TO ACCESS NEXT SU OF
	LETTER. IF LETTER COMPLETE, GO TO NEXT LETTER. THEN DO REST
	OF ROWS IN GROUP.

0	SPECS(1,ISPEC) = SPECS(1,ISPEC)+10001
IF (N+1.GE.NEND) POINTR(IROW) = POINTR(IROW)+1

0	I = I+1

*	ONE PRINT LINE IS COMPLETE; PRINT IT, PRINT OVERPRINT LINE
	IF NECESSARY, DECREMENT FLAGS FOR NEXT PRINT LINE. SHIFT
	THE PRINT LINE BUFFERS FOR PROPER ITALIC PROCESSING, AND
	BLANK THE LAST LINE IN BUFFER. THEN GO PROCESS THE NEXT
	PRINT LINE.

CALL PRINT_LINE(OUT(1:VSIZE),PUT(1:VSIZE))
ISLANT = ISLANT-1

OUT = OUT(VSIZE+1:)
PUT = PUT(VSIZE+1:)

GO TO 10

*	END-OF-GROUP ENCOUNTERED. IF LONGEST ROW IN GROUP ENDED WITH
	AN ITALIC LETTER, THE PRINT LINE BUFFERS WILL CONTAIN DATA;
	PRINT IT. THEN DO REST OF GROUPS, THEN RETURN.

5	IF (ISLANT.LE.0) GO TO 80

DO I=1,ISLANT
    J = (I-1)*VSIZE
    CALL PRINT_LINE(OUT(J+1:J+VSIZE),PUT(J+1:J+VSIZE))
ENDDO

0	WRITE (99,1000)

CALL PRINT_FINISH
000	FORMAT ('1')

END
SUBROUTINE PRINT_LINE(STRING1,STRING2)

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

IMPLICIT INTEGER (A-Z)

CHARACTER*(*) STRING1,STRING2
CHARACTER*1 LXY_8LPI / 6 /

LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

L = LEN(STRING1)
0	IF (STRING1(L:L).NE.' ') GO TO 20
L = L-1
IF (L.GT.1) GO TO 10

0	IF (LXY) THEN

    WRITE (99,1000) LXY_8LPI // STRING1(1:L)

ELSE

    WRITE (99,1000) STRING1(1:L)

    IF (STRING2(1:L).NE.' ') WRITE (99,1001) STRING2(1:L)

ENDIF
000	FORMAT (1X,A)001	FORMAT ('+',A)

END
SUBROUTINE PRINT_START

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

IMPLICIT INTEGER (A-Z)

CHARACTER*1 ESC / 27 /
LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120
COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT

IF (LA120) THEN

    IF (GROWS.EQ.4) WRITE (99,1000) '1'//ESC//'[2z'//ESC//'[1w'
    IF (GROWS.EQ.5) WRITE (99,1000) '1'//ESC//'[3z'//ESC//'[3w'
    IF (GROWS.EQ.6) WRITE (99,1000) '1'//ESC//'[3z'//ESC//'[4w'

    WRITE (99,1000) ' '//ESC//'[1;66r'

ELSE

    WRITE (99,1000) '1'

ENDIF
000	FORMAT (A)

END
SUBROUTINE PRINT_FINISH

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

IMPLICIT INTEGER (A-Z)

CHARACTER QUEUE*64,OUTFILE*128,COPIES*4,COMMAND*80
CHARACTER*1 ESC / 27 /
LOGICAL*4 PRINT,DARKEN,CENTER,PROMPT,LXY,LA120

COMMON /QUAL/ PRINT,DARKEN,CENTER,PROMPT,LXY,LA120
COMMON /PRNT/ QUEUE,OUTFILE,COPIES
COMMON /WORK/ COMMAND

IF (LA120) WRITE (99,1000) '1'//ESC//'[1z'//ESC//'[1w'//
1						ESC//'[4;63r'

IF (.NOT.PRINT) RETURN

INQUIRE (99,NAME=OUTFILE)

CLOSE (99)

CALL STR$TRIM(OUTFILE,OUTFILE,FLEN)

COMMAND = 'PRIN/DEL/NOFEED '
CLEN = 16

IF (QUEUE.NE.'SYS$PRINT') THEN
    CALL STR$TRIM(QUEUE,QUEUE,QLEN)
    COMMAND(CLEN:) = '/QUE=' // QUEUE(1:QLEN) // ' '
    CLEN=CLEN+QLEN+5
ENDIF

IF (COPIES.NE.'1') THEN
    CALL STR$TRIM(COPIES,COPIES,QLEN)
    COMMAND(CLEN:) = '/COP=' // COPIES(1:QLEN) // ' '
    CLEN=CLEN+QLEN+5
ENDIF

CALL LIB$DO_COMMAND(COMMAND(1:CLEN)//OUTFILE(1:FLEN))
000	FORMAT (A)

END
BLOCK DATA

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*


	DESCRIPTION OF VARIABLE NAMES     MIRACLE MESSAGE

  CHARS(78)----LIST OF LETTERS WHICH CAN BE USED IN POSTERS.

  LINKS(78,2)--POINTERS TO DATA FOR PRINTING EACH AVAILABLE LETTER
		(SEE 'CHARS').  THE POINTERS, IN THE FIRST COLUMN, POINT
		TO ELEMENTS OF ARRAY 'DATA'.  THE SECOND COLUMN GIVES
		THE NUMBER OF SU'S IN THE CHARACTER.

  DATA(1004)---BIT STRINGS FOR PRODUCING EACH SU OF EACH LETTER.
		ACCESSED VIA POINTERS IN ARRAY 'LINKS'. RIGHTMOST BIT IS
		TOP OF LETTER.  31 BITS ARE USED (MAX CHAR HEIGHT 27 PLUS
		4 FOR DESCENDER AS IN LOWER CASE G,P,Q,Y, ETC.) TO SPEC-
		IFY THE CONTENTS OF EACH SCAN UNIT (SU). EACH WORD IN THE
		ARRAY SPECIFIES ONE SU OF ONE LETTER.

  LENGTH(40)---THE LENGTH OF EACH ROW OF TEXT, IN SCAN UNITS (SU'S).
		USED FOR HORIZONTAL CENTERING WHEN '/CENTER' IS USED.

  PAIRS(490)---LIST OF PAIRS OF CHARACTERS WHICH CAN BE 'OVERLAPPED'
		TOGETHER TO ELIMINATE UNESTHETICAL EXCESS WHITE SPACE.
		EACH ELEMENT SPECIFIES ONE PAIR, AS:
			BYTE 1 -- LEFT LETTER
			BYTE 2 -- RIGHT LETTER
		ARRAYS R0 AND R1 CONTAIN PAIRS WHICH CAN BE OVERLAPPED
		ONE UNIT; R2 THRU R5 FOR OVERLAPPING 2-5 UNITS.

  POSITN(6)----PRINTER COLUMN WHERE EACH ROW OF TEXT STARTS ON THE
		PRINTED PAGE.  ONLY 'GROWS' ELEMENTS ARE USED.

  POINTR(40)---POINTS TO CURRENT ELEMENT OF ARRAY 'SPECS' BEING
		PROCESSED (PRINTED) FOR EACH ROW OF TEXT.

 SPECS(2,1000)-CONTAINS DATA NEEDED TO PRINT ALL ROWS OF TEXT.
		ACCESSED VIA ARRAY 'POINTR'. CONTAINS ONE TWO-WORD
		ELEMENT FOR EACH LETTER IN THE TEXT, PLUS SPECIAL
		ENTRIES FOR BLANKS AND END-OF-ROW. CONTAINS THE
		FOLLOWING FIELDS:

	 N------CURRENT SU BEING PROCESSED FOR THIS LETTER (INIT 0).

	 LOCATN-POINTER TO BIT STRING IN ARRAY 'DATA' FOR CURRENT
		SU OF THIS LETTER.

	 NEND---NUMBER OF SU'S IN THIS LETTER (INCLUDING 2 BLANK SU'S
		AFTER LETTER IF NO OVERLAP).

	 NGAP---NUMBER OF SU'S IN THIS LETTER NOT INCLUDING TRAILING
		BLANKS FOR INTER-LETTER GAP.    (USUALLY NGAP=NEND-2)

	 NOVL---NUMBER OF SU'S IN THIS LETTER WHICH ARE NOT OVERLAPPED
		WITH THE FOLLOWING LETTER(NOVL=NEND UNLESS OVERLAP).

	 OPRNT--FLAG TO INDICATE OVERPRINTING OF THIS LETTER.

	 ITALIC-FLAG TO INDICATE ITALICIZING OF THIS LETTER.

		(FOR BLANK LETTER, NGAP=0 AND NEND=LENGTH OF SPACE)

		(FOR END-OF-ROW, N<0)

  OUT*1584-----OUT(1:132) ARE THE CHARACTERS IN THE CURRENT PRINT LINE
		BEING CREATED (GOES UP TO 198 FOR /LA120=6ROWS).  CHAR-
		ACTERS ARE EITHER BLANK OR TAKEN FROM VARIABLE 'BLACK'
		(CURRENTLY 'M').  THE REST OF 'OUT' IS USED ONLY WHEN
		ITALIC LETTERS ARE BEING CREATED, AND IT CONTAINS THE
		SEVEN SUCCEEDING PRINT LINES.

  PUT*1584-----SAME AS 'OUT' EXCEPT USED ONLY WHEN OVERPRINTING IS IN
		EFFECT.  CHARACTERS ARE BLANK WHEN NO OVERPRINTING IS
		TO BE DONE, OR ARE TAKEN FROM VARIABLE 'BLAKK' (CURR-
		RENTLY 'W').

  ROWS---------NUMBER OF ROWS OF TEXT TO BE CREATED.

  GROWS--------NUMBER OF ROWS OF TEXT IN A GROUP, I.E. NUMBER THAT CAN
		BE PRINTED AT A TIME.  THIS IS 4 UNLESS /LA120=5ROWS OR
		6ROWS IS SPECIFIED, IN WHICH CASE IT IS 5 OR 6.

  OPRINT-------OVERPRINT INDICATOR FOR THE ENTIRE JOB.  IF>0, OVERPRINT
		EVERYTHING.

  ISLANT-------ITALIC INDICATOR. IF>0 THEN ITALIC MODE (USE OF ARRAYS
		'OUTS' AND 'PUTS') IS IN EFFECT FOR THAT MANY PRINT
		LINES.

  LPI----------LINES PER INCH OF PRINTER (SHOULD BE 8).

  LTOP---------LINE ON PRINTED PAGE ON WHICH FORTRAN CARRIAGE CONTROL
		CHARACTER '1' POSITIONS (CURRENTLY LINE 6 OF PAGE).

  MAXLEN-------LENGTH OF LONGEST ROW OF TEXT, IN SU'S.

  LRSPA--------NUMBER OF BLANK PRINT LINES NECESSARY BEFORE
		BEGINNING OF TEXT IN ORDER TO HORIZONTALLY
		CENTER THE LONGEST ROW OF TEXT BETWEEN PAGE
		PERFORATIONS.

  IBIAS--------NUMBER OF BLANK SU'S NEEDED TO HORIZONTALLY
		CENTER A LINE OF TEXT WITH RESPECT TO LONGEST LINE.

  ENDCOL-------LAST NON-BLANK COLUMN ON AN INPUT RECORD. (TRAILING
		BLANKS ARE IGNORED; THEY MAY BE MADE SIGNIFICANT BY
		FOLLOWING THEM WITH AN ASTERISK.)

  ISYM---------CURRENT LETTER IN INPUT SPECIFICATIONS.

  LSYM---------PREVIOUS LETTER IN INPUT SPECIFICATIONS. INITIALLY
		BLANK.  SET TO BLANK WHEN CHANGE FROM ITALIC TO
		VERTICAL TAKES PLACE, TO PREVENT RUNNING TOGETHER
		OF TOPS OF TWO CHARACTERS.

  ISPEC--------CURRENT POSITION IN 'SPECS' ARRAY.

  LENSYM-------LENGTH OF CURRENT INPUT LETTER, IN SU'S.

  NSYM---------POSITION OF CURRENT INPUT LETTER IN 'CHARS' ARRAY.

  PAIR---------CURRENT/PREVIOUS INPUT LETTER PAIR, IN FORMAT OF
		'PAIRS' ARRAY ELEMENTS.

  OVLAP--------AMOUNT OF OVERLAP POSSIBLE (1-5 SU'S) BETWEEN
		ELEMENTS OF 'PAIR'.

  DONE---------NUMBER OF ROWS, IN CURRENT GROUP OF ROWS, WHICH
		HAVE BEEN COMPLETELY PRINTED.

  BITS---------BIT STRING FOR CURRENT SU OF CURRENT LETTER OF
		CURRENT LINE OF TEXT BEING PRINTED.

  JROW---------FIRST TEXT ROW IN CURRENT 'PAGE' BEING PRINTED

  KROW---------FINAL TEXT ROW IN CURRENT 'PAGE' BEING PRINTED

  IROW---------CURRENT TEXT ROW BEING PRINTED.

  HSIZE--------NUMBER OF PRINT LINES BETWEEN PERFORATIONS.  FOR
		11-INCH PAPER, THIS IS 88, EXCEPT FOR /LXY=5ROWS
		6ROWS, IN WHICH CASE IT IS 132.

  VSIZE--------NUMBER OF PRINT COLUMNS USED FOR ONE PRINT LINE
		IN STRINGS 'OUT' AND 'PUT'.  THIS IS 132 EXCEPT
		FOR /LXY=5ROWS (165) AND /LXY=6ROWS (198).

  PRINT--------TRUE IF /PRINT QUALIFIER IS IN EFFECT.

  DARKEN-------TRUE IF /DARKEN QUALIFIER IS IN EFFECT.

  CENTER-------TRUE IF /CENTER QUALIFIER IS IN EFFECT.

  PROMPT-------TRUE IF INPUT IS DIRECTLY FROM A TERMINAL KEYBOARD.

  LXY----------TRUE IF /LXY QUALIFIER IS IN EFFECT.

  LA120--------TRUE IF /LA120 QUALIFIER IS IN EFFECT.


---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*


IMPLICIT INTEGER (A-Z)

CHARACTER*1 CHARS,A(78)
CHARACTER*2 R0,R1,R2,R3,R4,R5

INTEGER B(78),C(78)
INTEGER AA(137),AB(149),AC(142),AD(150),AE(166),AF(154),AG(106)
INTEGER Z1(5,16),Z2(5,16),Z3(5,16),Z4(5,2)

COMMON /CHAR/ CHARS(78),LINKS(78,2),DATA(1004)
COMMON /PAGE/ ROWS,GROWS,POSITN(6),HSIZE,VSIZE,OPRINT
COMMON /PAIR/ R0(96),R1(129),R2(133),R3(84),R4(36),R5(12)

EQUIVALENCE (CHARS,A),(LINKS(1,1),B),(LINKS(1,2),C)

EQUIVALENCE (DATA,AA),(DATA(138),AB),(DATA(287),AC),
    1    (DATA(429),AD),(DATA(579),AE),(DATA(745),AF),(DATA(899),AG)

DATA POSITN / 166,133,100,67,34,1 /

DATA (A(I),B(I),C(I),I=1,16) /	'a' , 001 , 13 ,
1				'b' , 014 , 13 ,
2				'c' , 027 , 12 ,
3				'd' , 039 , 13 ,
4				'e' , 052 , 12 ,
5				'f' , 064 , 09 ,
6				'g' , 073 , 13 ,
7				'h' , 086 , 13 ,
8				'i' , 099 , 06 ,
9				'j' , 105 , 09 ,
1				'k' , 114 , 13 ,
2				'l' , 127 , 06 ,
3				'm' , 133 , 19 ,
4				'n' , 152 , 13 ,
5				'o' , 165 , 12 ,
6				'p' , 177 , 13 /
DATA (A(I),B(I),C(I),I=17,32) /	'q' , 190 , 13 ,
1				'r' , 203 , 11 ,
2				's' , 214 , 11 ,
3				't' , 225 , 09 ,
4				'u' , 234 , 13 ,
5				'v' , 247 , 13 ,
6				'w' , 260 , 17 ,
7				'x' , 277 , 13 ,
8				'y' , 290 , 12 ,
9				'z' , 302 , 11 ,
1				'A' , 313 , 17 ,
2				'B' , 330 , 16 ,
3				'C' , 346 , 15 ,
4				'D' , 361 , 17 ,
5				'E' , 378 , 15 ,
6				'F' , 393 , 14 /
DATA (A(I),B(I),C(I),I=33,48) /	'G' , 407 , 17 ,
1				'H' , 424 , 15 ,
2				'I' , 439 , 07 ,
3				'J' , 446 , 13 ,
4				'K' , 459 , 17 ,
5				'L' , 476 , 15 ,
6				'M' , 491 , 23 ,
7				'N' , 514 , 16 ,
8				'O' , 530 , 16 ,
9				'P' , 546 , 16 ,
1				'Q' , 562 , 16 ,
2				'R' , 578 , 19 ,
3				'S' , 597 , 13 ,
4				'T' , 610 , 14 ,
5				'U' , 624 , 17 ,
6				'V' , 641 , 15 /
DATA (A(I),B(I),C(I),I=49,64) /	'W' , 656 , 22 ,
1				'X' , 678 , 17 ,
2				'Y' , 695 , 17 ,
3				'Z' , 712 , 18 ,
4				'0' , 730 , 16 ,
5				'1' , 746 , 07 ,
6				'2' , 753 , 15 ,
7				'3' , 768 , 15 ,
8				'4' , 783 , 16 ,
9				'5' , 799 , 15 ,
1				'6' , 814 , 14 ,
2				'7' , 828 , 14 ,
3				'8' , 842 , 15 ,
4				'9' , 857 , 14 ,
5				'+' , 871 , 13 ,
6				'-' , 884 , 13 /
DATA (A(I),B(I),C(I),I=65,78) /	'/' , 897 , 15 ,
1				'(' , 912 , 08 ,
2				')' , 920 , 08 ,
3				'=' , 928 , 13 ,
4				',' , 941 , 04 ,
5				'.' , 945 , 04 ,
6				'''', 949 , 04 ,    ! SEE NOTE BELOW
7				'`' , 953 , 04 ,    ! SEE NOTE BELOW
8				'!' , 957 , 06 ,
9				':' , 963 , 04 ,
1				'"' , 967 , 10 ,    ! SEE NOTE BELOW
2				'~' , 977 , 10 ,    ! SEE NOTE BELOW
3				'?' , 987 , 14 ,
4				';' ,1001 , 04 /

	NOTE ON SINGLE QUOTES -- USE ` AT BEGINNING, ' AT END.
	NOTE ON DOUBLE QUOTES -- USE ~ AT BEGINNING, " AT END.

     DATA R0 / 'at' , 'au' , 'a''', 'a"' , 'b''', 'b"' , 'b?' , 'c)' ,
    1		'e)' , 'e''', 'e"' , 'fa' , 'fd' , 'fg' , 'fm' , 'fn' ,
    2		'fo' , 'fp' , 'fq' , 'fr' , 'fs' , 'fu' , 'fv' , 'fw' ,
    3		'fx' , 'fy' , 'fz' , 'ht' , 'hu' , 'hv' , 'hw' , 'h''',
    4		'h"' , 'k?' , 'mt' , 'mu' , 'mv' , 'mw' , 'm''', 'm"' ,
    5		'nt' , 'nu' , 'nv' , 'nw' , 'n''', 'n"' , 'ox' , 'o''',
    6		'o"' , 'pj' , 'p,' , 'p.' , 'p''', 'p"' , 'r?' , 's)' ,
    7		's''', 's"' , 's?' , 'tu' , 'tv' , 'tw' , 'ty' , 't''',
    8		't"' , 'va' , 'vc' , 've' , 'wa' , 'wc' , 'we' , 'wo' ,
    9		'w:' , 'w;' , 'xc' , 'xe' , 'xo' , 'ya' , 'yc' , 'ye' ,
    A		'0.' , '0,' , '24' , '47' , '49' , '4)' , '52' , '57' ,
    B		'59' , '5,' , '5.' , '62' , '69' , '6?' , '72' , '73' /
     DATA R1 / '78' , '79' , '8)' , '93' , '(a' , '(d' , '(s' , '(t' ,
    1		'(7' , '(9' , '(5' , '),' , ').' , '.0' , '.4' , '.7' ,
    2		'At' , 'Au' , 'AO' , 'AQ' , 'AU' , 'Bj' , 'B)' , 'BX' ,
    3		'BY' , 'Cj' , 'C)' , 'DA' , 'DV' , 'DW' , 'Ev' , 'Ew' ,
    4		'Ff' , 'FO' , 'FQ' , 'Gj' , 'J,' , 'J.' , 'JA' , 'Kt' ,
    5		'Ku' , 'K?' , 'KC' , 'KG' , 'O,' , 'O.' , 'OA' , 'OV' ,
    6		'OW' , 'Po' , 'P:' , 'P;' , 'Ra' , 'Rd' , 'Ro' , 'Rt' ,
    7		'Ru' , 'Rv' , 'Rw' , 'R''', 'R!' , 'R"' , 'R?' , 'RC' ,
    8		'RG' , 'RJ' , 'RO' , 'RQ' , 'RS' , 'RT' , 'Sw' , 'Sx' ,
    9		'S)' , 'SV' , 'SW' , 'SX' , 'SY' , 'U,' , 'U.' , 'Vt' ,
    A		'VC' , 'VG' , 'VO' , 'VQ' , 'VS' , 'Wt' , 'WC' , 'WG' ,
    B		'WO' , 'WQ' , 'WS' , 'Xc' , 'Xe' , 'Xo' , 'Xq' , 'Xt' ,
    C		'X?' , 'XJ' , 'Yi' , 'Y?' , 'Zv' , 'Zw' , 'Z?' , '`a' ,
    D		'`c' , '`d' , '`e' , '`g' , '`j' , '`o' , '`q' , '`s' ,
    E		'`4' , '`6' , '`A' , '`J' , '~a' , '~c' , '~d' , '~e' ,
    F		'~g' , '~j' , '~o' , '~q' , '~s' , '~4' , '~6' , '~A' ,
    G		'~J' /
     DATA R2 / 'av' , 'aw' , 'a?' , 'e?' , 'fc' , 'fe' , 'fj' , 'f)' ,
    1		'f:' , 'f;' , 'h?' , 'm?' , 'n?' , 'o)' , 'o?' , 'p)' ,
    2		'p?' , 't)' , 't?' , 'w)' , 'w,' , 'w.' , 'y)' , 'y,' ,
    3		'y.' , '0)' , '3)' , '67' , '70' , '7:' , '7;' , '9)' ,
    4		'--' , '(c' , '(e' , '(o' , '(q' , '(u' , '(v' , '(w' ,
    5		'(0' , '(3' , '(6' , '(8' , '(C' , '(G' , '(J' , 'Av' ,
    6		'Aw' , 'A''', 'A"' , 'Dj' , 'D)' , 'D.' , 'D,' , 'Dx' ,
    7		'Fd' , 'Fm' , 'Fn' , 'Fp' , 'Fr' , 'Jj' , 'KO' , 'KQ' ,
    8		'Lv' , 'Lw' , 'L''', 'L"' , 'Oj' , 'O)' , 'OX' , 'OY' ,
    9		'Pa' , 'Pc' , 'Pe' , 'P)' , 'PX' , 'PY' , 'QV' , 'QW' ,
    A		'QY' , 'Rc' , 'Re' , 'Rq' , 'RU' , 'RV' , 'RW' , 'Sv' ,
    B		'Sy' , 'T,' , 'T.' , 'T:' , 'T;' , 'Uj' , 'UA' , 'Vf' ,
    C		'Vg' , 'Vm' , 'Vn' , 'Vp' , 'Vr' , 'Vu' , 'Vv' , 'Vw' ,
    D		'Vx' , 'Vy' , 'Vz' , 'V:' , 'V;' , 'Wf' , 'Wg' , 'Wm' ,
    E		'Wn' , 'Wp' , 'Wr' , 'Wu' , 'Wv' , 'Wx' , 'Wy' , 'Wz' ,
    F		'W:' , 'W;' , 'Xu' , 'XC' , 'XG' , 'XO' , 'XQ' , 'Yt' ,
    G		'YC' , 'YG' , 'YO' , 'YQ' , 'YS' /
     DATA R3 / 'f,' , 'f.' , 'r)' , 'r,' , 'r.' , 'vj' , 'v)' , 'v,' ,
    1		'v.' , 'wj' , 'yj' , '7,' , '7.' , '9,' , '9.' , '(4' ,
    2		'(O' , '(Q' , 'A?' , 'AT' , 'Fa' , 'Fc' , 'Fe' , 'Fg' ,
    3		'Fj' , 'Fo' , 'Fq' , 'Fs' , 'Fu' , 'Fv' , 'Fw' , 'Fx' ,
    4		'Fy' , 'Fz' , 'F:' , 'F;' , 'FJ' , 'Kv' , 'Kw' , 'L?' ,
    5		'LT' , 'Pj' , 'P,' , 'P.' , 'PA' , 'RY' , 'Tg' , 'Tj' ,
    6		'Tm' , 'Tn' , 'Tr' , 'Ts' , 'Tx' , 'Ty' , 'Tz' , 'TA' ,
    7		'Va' , 'Vc' , 'Vd' , 'Ve' , 'Vo' , 'Vq' , 'Vs' , 'V,' ,
    8		'V.' , 'VJ' , 'Wa' , 'Wc' , 'Wd' , 'We' , 'Wo' , 'Wq' ,
    9		'Ws' , 'W,' , 'W.' , 'WJ' , 'Xv' , 'Xw' , 'Yf' , 'Y,' ,
    A		'Y.' , 'Y:' , 'Y;' , 'DY' /
     DATA R4 / '76' , 'AV' , 'AW' , 'AY' , 'F,' , 'F.' , 'FA' , 'LV' ,
    1		'LW' , 'LY' , 'PJ' , 'Ta' , 'Tc' , 'Td' , 'Te' , 'To' ,
    2		'Tp' , 'Tq' , 'Tu' , 'Tv' , 'Tw' , 'TJ' , 'Vj' , 'Wj' ,
    3		'WA' , 'Ym' , 'Yn' , 'Yp' , 'Yr' , 'Yu' , 'Yv' , 'Yw' ,
    4		'Yx' , 'Yy' , 'Yz' , 'VA' /
     DATA R5 / '74' , 'Ya' , 'Yc' , 'Yd' , 'Ye' , 'Yg' , 'Yj' , 'Yo' ,
    1	    	'Yq' , 'Ys' , 'YA' , 'YJ' /

	ALL USES OR ADAPTATIONS OF THE DATA BELOW MUST BE ACCOMPANIED BY
	THE NAME AND ADDRESS OF THE DATA'S CREATOR, WHICH IS:

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

     DATA AA / 32505856,66598912,133987328,119438336,118371840,11783526   001
    *4,50791936,59182592,25402880,134216704,134215680,134209536,1006632   002
    *96,100663320,134217720,134217720,134217720,12595200,25171968,58727   003
    *424,117444096,117444096,125836800,67107840,33552384,16773120,41615   004
    *36,33550336,67106816,62979072,125836800,117444096,117444096,117444   005
    *096,50359296,58784768,29423616,12611584,16773120,33552384,67107840   006
    *,125836800,117444096,117444096,58727424,25171968,12595224,13421772   007
    *0,134217720,134217720,100663296,4161536,33550336,67106816,63126528   008
    *,126029312,117640704,117640704,117640704,50535424,58981376,2962022   009
    *4,12836864,100687872,134217664,134217712,134217720,100687928,24600   010
    *,216,504,240,234942464,1058797568,1069546496,1946094592,1676545536   011
    *,1674446336,1674446336,1674446336,1737362944,2005339136,2131229696   012
    *,1040449280,201388800,100663320,134217720,134217720,134217720,1007   013
    *24736,15360,7680,7680,100679168,134217216,134216704,134213632,1006   014
    *63296,100664880,134217336,134217336,134217336,134217264,100663296,   015
    *251658240,1065353216,2004877312,1929379840,2013267504,2147483256,1   016
    *073741432,268435064,1584,100663320,134217720,134217720,134217720,1   017
    *04726528,983040,2080768,109043712,134019072,133200896,130031104,11   018
    *7456384,100678656,100663320,134217720,134217720,134217720,13421772   019
    *0,100663296,100664832,134217216,134217216,134217216,100724736/	   020
     DATA AB / 15360,7680,100679168,134217216,134216704,134215680,10072   021
    *7808,15872,7680,100679168,134217216,134216704,134213632,100663296,   022
    *100664832,134217216,134217216,134217216,100724736,15360,7680,7680,   023
    *100679168,134217216,134216704,134213632,100663296,8380416,33552384   024
    *,67107840,62929920,125832704,100664832,100664832,117444096,6292992   025
    *0,67107840,33552384,8380416,1610614272,2147483136,2147483136,21474   026
    *83136,6303744,12589056,29367296,25169408,25169408,29367808,1677619   027
    *2,8386560,4190208,4190208,8386560,16776192,32513536,31460864,31460   028
    *864,29367296,12589056,1616916480,2147483136,2147483136,2147483136,   029
    *1610614272,100664832,134217216,134217216,134217216,100724736,14336   030
    *,7168,15872,32256,31744,14336,65138688,63174656,126352384,11796428   031
    *8,101699072,102729216,121570816,134088192,66978816,33295360,162590   032
    *72,1536,16777200,67108848,134217712,125830656,117442048,117442048,   033
    *62914560,29360128,1536,4193792,16776704,67108352,132122112,1258291   034
    *20,125829120,62914560,15730176,134217216,134217216,134217216,10066   035
    *4832,1536,15872,130560,1041920,8323072,66584576,133693440,67043328   036
    *,8381952,1048064,130560,15872,1536,1536,32256,523776,8381952,13408   037
    *6656,134086656,33546240,4192256,522240,8380416,134086656,134086656   038
    *,33547776,2096640,130560,7680,1536,100664832,125836800,132152832,1   039
    *17046784,4193792,2090496,2064384,109019136,134201344,133821952/	   040
     DATA AC / 132152832,125836800,100664832,1006634496,2080390656,2013   041
    *396480,2081416704,1048510464,267911168,67043328,8381952,1048064,13   042
    *0560,15872,1536,117456384,130031104,133172736,133957120,108987904,   043
    *102745600,101187072,100793856,117472768,125836800,130024960,100663   044
    *296,133955584,134201344,102758400,1638144,1581024,1573880,1573118,   045
    *1573887,1581054,1638392,102760416,134217472,134215680,134201344,13   046
    *3955584,100663296,100663299,134217727,134217727,134217727,13421772   047
    *7,100691971,100691971,100691971,100691971,100691971,117504007,1259   048
    *59183,67100670,33546236,16748536,4064224,2097088,8388592,16777208,   049
    *33554428,66060414,62914590,125829135,117440519,117440519,117440519   050
    *,125829135,58720286,29360188,15728888,7341052,100663299,134217727,   051
    *134217727,134217727,134217727,100663299,100663299,100663299,117440   052
    *519,125829135,62914590,66060414,33424380,16777208,8388592,2097088,   053
    *261632,100663299,134217727,134217727,134217727,134217727,100675587   054
    *,100675587,100727811,100925187,100925187,100663299,117440515,12582   055
    *9127,132120591,133693503,100663299,134217727,134217727,134217727,1   056
    *34217727,100675587,12291,64515,261891,261891,3,7,15,63,2097088,838   057
    *8592,16777208,33554428,66846974,62914590,125829135,117440519,11744   058
    *0519,117440519,58720263,58728455,29384719,33546270,16769084,167692   059
    *76,8380926,100663299,134217727,134217727,134217727,134217727/	 ! 060
     DATA AD / 100675587,12288,12288,12288,100675587,134217727,13421772   061
    *7,134217727,134217727,100663299,100663299,134217727,134217727,1342   062
    *17727,134217727,134217727,100663299,8257536,33488896,67043328,1278   063
    *60736,118358016,117440512,117440512,130023427,67108863,33554431,16   064
    *777215,4194303,3,100663299,134217727,134217727,134217727,134217727   065
    *,101646339,491520,245760,122880,63488,523776,109051776,134211571,1   066
    *34185471,133955647,132120579,100663296,100663299,134217727,1342177   067
    *27,134217727,134217727,100663299,100663296,100663296,100663296,100   068
    *663296,100663296,117440512,125829120,132120576,133693440,100663299   069
    *,134217727,134217727,100663423,1023,8191,65528,524224,4193792,3355   070
    *0336,134184960,33423360,4177920,522240,65280,8160,1020,100663423,1   071
    *34217727,134217727,134217727,134217727,100663299,100663299,1342177   072
    *27,134217727,100663423,511,2047,8188,32752,131008,524032,2096128,8   073
    *384512,33538051,134217727,134217727,3,261632,2097088,16777208,3355   074
    *4428,66847230,130023455,117440519,100663299,100663299,117440519,13   075
    *0023455,66847230,33554428,16777208,2097088,261632,100663299,134217   076
    *727,134217727,134217727,134217727,100712451,49155,49155,57351,5735   077
    *1,61455,30750,32766,16380,8184,2016,261632,2097088,16777208,335544   078
    *28,66847230,130023455,117440519,101187587,102236163,125304839,1331   079
    *69183,66847230,134217724,125829112,102760384,67370496,100663299/     080
     DATA AE / 134217727,134217727,134217727,134217727,100712451,49155,   081
    *49155,49155,122887,253959,1044495,8386590,33521662,66994172,133701   082
    *624,130025440,100663296,67108864,33488896,33032176,65019900,629309   083
    *42,125861775,117505799,117570567,117700615,126873607,134209550,670   084
    *92542,33521916,8257536,127,31,7,3,100663299,134217727,134217727,13   085
    *4217727,134217727,100663299,3,7,31,127,3,2097151,16777215,33554431   086
    *,67108863,66060291,125829120,117440512,100663296,100663296,1174405   087
    *12,50331648,58720256,33030147,16777215,2097151,3,3,63,1023,16383,2   088
    *62143,4194275,67108352,134209536,67076096,4186112,261632,16355,102   089
    *3,63,3,3,63,1023,16383,262143,4194275,67108352,134209536,67076096,   090
    *4192256,262016,65528,2097144,67108736,134215680,67076096,4186112,2   091
    *61632,16355,1023,63,3,100663299,117440527,130023487,133169407,1087   092
    *90783,2035711,524275,131008,524032,2096128,109051648,134186944,134   093
    *087155,133693567,132120607,125829127,100663299,3,15,63,255,1023,10   094
    *0667391,134217715,134217664,134217472,134217472,100667328,1011,255   095
    *,127,63,15,3,67109119,117440575,130023439,133169159,133955587,1341   096
    *52195,134201347,104853507,101710851,100925187,100728771,100679667,   097
    *100667391,117441535,125829375,132120639,133693455,134152195,261632   098
    *,2097088,16777208,33554428,66847230,130023455,117440519,100663299,   099
    *100663299,117440519,130023455,66847230,33554428,16777208,2097088/    100
     DATA AF / 261632,100663344,134217720,134217724,134217726,134217727   101
    *,134217727,100663296,117441472,125831152,130025468,132121550,13316   102
    *9542,133693447,127795207,126812167,126074911,125956223,125894654,1   103
    *25861884,125837304,132122592,132120576,3670016,16515184,31326460,6   104
    *0686590,118227046,117446663,117446663,117455879,125861383,13015439   105
    *9,67108862,67104766,33540092,16744944,1966080,458752,507904,516096   106
    *,473088,465920,460544,459648,458976,458864,101122108,134217726,134   107
    *217727,134217727,134217727,101122048,458752,8126464,16678911,33439   108
    *743,60692511,51124255,100670495,100670495,100670495,117455903,1300   109
    *55199,67106847,33552415,16773151,4186143,491520,1032192,16776192,3   110
    *3554176,67108736,65077184,117455856,100669688,100670524,117455902,   111
    *132185102,67106823,33550339,16769027,2064384,96,124,117440543,1331   112
    *69183,134086687,134201375,134213663,1047583,65311,8095,991,127,31,   113
    *7,4063232,16744944,33540092,67104766,63045630,117472271,100669443,   114
    *100669443,100669443,117472271,63045630,67104766,33540092,16744944,   115
    *4063232,4032,100679672,100696060,117506046,58849343,63037447,31571   116
    *971,16302083,8314887,2095166,1048574,524284,131064,8064,245760,245   117
    *760,245760,245760,245760,33554304,33554304,33554304,245760,245760,   118
    *245760,245760,245760,245760,245760,245760,245760,245760,245760,245   119
    *760,245760,245760,245760,245760,245760,245760,100663296,125829120/   120
     DATA AG / 132120576,33030144,8257536,2064384,516096,129024,32256,8   121
    *064,2016,504,126,31,7,261120,2097024,8388576,33425400,65011836,587   122
    *20270,201326595,134217729,134217729,201326595,58720270,65011836,33   123
    *425400,8388576,2097024,261120,3947520,3947520,3947520,3947520,3947   124
    *520,3947520,3947520,3947520,3947520,3947520,3947520,3947520,394752   125
    *0,1736441856,1069547520,1069547520,260046848,58720256,130023424,13   126
    *0023424,58720256,828,510,510,124,496,1020,1020,486,8184,58982398,1   127
    *31071999,131071999,58982398,8184,58777600,130150400,130150400,5877   128
    *7600,828,510,510,124,0,0,828,510,510,124,496,1020,1020,486,0,0,496   129
    *,1020,1020,486,496,1020,1022,999,451,58720259,131006467,131055623,   130
    *58847239,64527,32766,16380,4088,992,1736499200,1069674496,10696744   131
    *96,260104192/							 ! 132

	ALL USES OR ADAPTATIONS OF THE DATA ABOVE MUST BE ACCOMPANIED BY
	THE NAME AND ADDRESS OF THE DATA'S CREATOR, WHICH IS:

---------------------------------------------------------*
							  *
	ALAN L. ZIRKLE     NAVAL SURFACE WEAPONS CENTER   *
			   CODE K105			  *
	(703) 663-7815     DAHLGREN, VIRGINIA  22448	  *
							  *
---------------------------------------------------------*

END