staden-lg/src/staden/gip.f

673 lines
19 KiB
Fortran

C GIP
C SCREEN OF 24 LINES, 80 CHARACTERS ASSUMED
C
C
C 14 May 1991
C Modified to work on Sparcstations - connect digitiser to RS232-C port B
C 24 Sept 1992
C digitizer is now specified by environment variable DIGITIZER
C
SUBROUTINE FMAIN()
PARAMETER (IDMENU=30)
INTEGER XLANE(4),DY,DXMIN,XPEN,YPEN,YMEAN
INTEGER XLMENU(IDMENU),XRMENU(IDMENU)
INTEGER YBMENU(IDMENU),YTMENU(IDMENU)
CHARACTER CHARS(IDMENU),GEL(512),BASE(4),MENUE,GELNAM*40,ANS
INTEGER MENUP(IDMENU),SEQROW,SEQCOL,SEQLEN
INTEGER DEVNOS(6)
INTEGER ESC
CHARACTER*40 FILDIG,FILVT
CHARACTER SPACE,CESC,CBELL
C ALL SCREEN OUTPUT CONTROLLED USING CURSOR
C SCREEN SIZE MAXROW, MAXCOL
C DIRECTION FROM HERE IS INC (1 OR -1)
INTEGER TITLER,TITLEC,CURER,CUREC,CURFR,CURFC
COMMON /ESCCHR/ CESC
COMMON /BELCHR/ CBELL
PARAMETER (ESC=27,IBELL=7)
PARAMETER (INC=1,MAXR=24)
PARAMETER (TITLER=1,TITLEC=20,LORDR=3,LORDC=20,
+IERRR=MAXR,IERRC=10,
+INSTR1=MAXR-INC,INSTC1=10,INSTR2=MAXR-2*INC,INSTC2=10,
+CURER=MAXR-4*INC,CUREC=1,CURFR=2,CURFC=20)
PARAMETER (SEQROW=6,SEQCOL=10,SEQLEN=60)
C PARAMETER (FILDIG='/dev/ttyb')
PARAMETER (FILDIG='DIGITIZER')
DATA XLMENU/0,
+0,200,400,600,0,200,400,600,
+0,200,400,600,0,200,400,600,
+0,200,400,600,0,200,400,600,
+0,400,0,0,0/
DATA XRMENU/800,
+200,400,600,800,200,400,600,800,
+200,400,600,800,200,400,600,800,
+200,400,600,800,200,400,600,800,
+400,800,800,800,800/
DATA YBMENU/000,
+1800,1800,1800,1800,
+1600,1600,1600,1600,
+1400,1400,1400,1400,
+1200,1200,1200,1200,
+1000,1000,1000,1000,
+800,800,800,800,
+600,600,400,200,0/
DATA YTMENU/2000,2000,2000,2000,2000,
+1800,1800,1800,1800,
+1600,1600,1600,1600,
+1400,1400,1400,1400,
+1200,1200,1200,1200,
+1000,1000,1000,1000,
+800,800,600,400,200/
DATA CHARS/'W',
+'T','C','G','A',
+'2','1','4','3',
+'V','D','H','B',
+'L','K','N','M',
+'R','Y','X','-',
+'5','6','7','8',
+'D','R','S','S','C'/
DATA MENUP/0,1,2,3,4,5,6,7,8,9,10,
+ 11,12,13,14,15,16,17,18,19,20,
+ 21,22,23,24,50,51,53,52,56/
DATA SPACE/' '/
DATA BASE/'T','C','G','A'/
C PROBLEM WITH DEFINING ESCAPE AND BELL SO DO IT HERE AND PUT IT COMMON
C WRITE(CESC,2000)ESC
CESC=CHAR(ESC)
2000 FORMAT(A1)
CBELL=CHAR(IBELL)
CALL UNITNO(KBIN,KBOUT,DEVNOS,6)
C OPEN LOGICAL UNIT FOR SOME TERMINAL OUTPUT
CALL OPENT(DEVNOS(6),FILVT)
C CLEAR SCREEN
CALL CLEAR
C WRITE TITLE
CALL CURSOR(TITLER,TITLEC)
CALL WRITES('GIP v1.0 Author: Rodger Staden')
C define allowed Y distance from current pen position
DY=80
CALL OPENRS(DEVNOS(1),FILDIG,IOK,LRECL,8)
IF(IOK.NE.0)THEN
CALL CURSOR(IERRR,1)
CALL BLINE
CALL CURSOR(IERRR,IERRC)
CALL WRITES('******UNABLE TO OPEN DIGITIZER******')
STOP
END IF
C FLUSH DIGITIZER
C CALL FLUSH(DEVNOS(1))
CALL CURSOR(INSTR1,1)
CALL BLINE
CALL CURSOR(INSTR1,INSTC1)
CALL WRITES('The film must be firmly fixed to the light box')
5 CONTINUE
CALL CURSOR(CURFR,1)
CALL BLINE
CALL CURSOR(CURFR,CURFC)
CALL WRITES('? File of file names=')
READ(KBIN,1000,ERR=5)GELNAM
1000 FORMAT(A)
CALL OPENRS(DEVNOS(3),GELNAM,IOK,LRECL,1)
IF(IOK.NE.0)THEN
CALL CURSOR(IERRR,1)
CALL BLINE
CALL CURSOR(IERRR,IERRC)
CALL WRITES('******ERROR OPENING FILE******')
GO TO 5
END IF
C CLEAR ERROR LINE IN CASE ITS BEEN USED
CALL CURSOR(IERRR,1)
CALL BLINE
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES(
+'Hit device menu origin, program origin, then hit start')
90 CONTINUE
CALL READPN(XPEN,YPEN,1,DEVNOS(1),KBOUT)
C START?
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
IF(MENU.NE.52)GO TO 90
100 CONTINUE
C CLEAR ERROR LINE IN CASE ITS BEEN USED
CALL CURSOR(IERRR,1)
CALL BLINE
C GET LANE ORDER
120 CONTINUE
C GET LANE ORDER
CALL LORDER(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,
+CHARS,MENUE,IDMENU,BASE,DEVNOS(1),KBOUT,INSTR2,INSTC2,
+LORDR,LORDC)
C CLEAR ERROR LINE IN CASE ITS BEEN USED
CALL CURSOR(IERRR,1)
CALL BLINE
C GET LANE COORDS
CALL GETLAN(XLANE,YMEAN,DXMIN,
+XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,MENUE,IDMENU,
+DEVNOS(1),KBOUT,INSTR2,INSTC2)
C CLEAR ERROR LINE IN CASE ITS BEEN USED
CALL CURSOR(IERRR,1)
CALL BLINE
C POINT TO GEL
IPGEL=0
******************************************************
200 CONTINUE
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES('Hit start when ready to begin reading')
CALL READPN(XPEN,YPEN,1,DEVNOS(1),KBOUT)
C START?
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
IF(MENU.EQ.52)THEN
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES
+ ('Hit bands, uncertainty codes, DELETE, RESET or STOP')
CALL READG(
+ XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+ IDMENU,XLANE,YMEAN,DY,DXMIN,BASE,GEL,IPGEL,
+ SEQROW,SEQCOL,SEQLEN,DEVNOS(1),KBOUT,INSTR2,INSTC2)
CALL CURSOR(INSTR2,INSTC2)
IF(IPGEL.GT.0)THEN
50 CONTINUE
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES('File name for this gel reading=')
READ(KBIN,1000,ERR=50)GELNAM
CALL OPENRS(DEVNOS(5),GELNAM,IOK,LRECL,1)
IF(IOK.EQ.0)THEN
CALL FMTDK(DEVNOS(5),GEL,IPGEL)
CLOSE(UNIT=DEVNOS(5))
WRITE(DEVNOS(3),1008)GELNAM
1008 FORMAT(A)
CALL CURSOR(INSTR2,INSTC2)
ELSE
CALL CURSOR(IERRR,1)
CALL BLINE
CALL CURSOR(IERRR,IERRC)
CALL WRITES('******ERROR OPENING FILE******')
GO TO 50
END IF
C CLEAR GEL FROM SCREEN
DO 441 I=1,IPGEL
CALL WRITEG(' ',SEQCOL,SEQROW,SEQLEN,I)
441 CONTINUE
END IF
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES('? (y/n) (y) Read another sequence ')
READ(KBIN,1010)ANS
1010 FORMAT(A1)
IF((ANS.EQ.' ').OR.(ANS.EQ.'Y').OR.(ANS.EQ.'y'))GO TO 100
CALL CLEAR
STOP
END IF
GO TO 200
END
C DIGIT
C AUTHOR RODGER STADEN
C ROUTINES USED BY GELIN
C NONSTANDARD: CARRIAGE CONTROL $ USED BY ROUTINE BELL
C ROUTINES IN THIS LIB:
C READG
C INOUT
C LANE
C GETLAN
C GETMEN
C LORDER
C WRITEG
C INTERP
C READPN
SUBROUTINE READG(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+IDMENU,XLANE,YMEAN,DY,DXMIN,BASE,GEL,IPGEL,SEQROW,SEQCOL,
+SEQLEN,IDEVD,KBOUT,INSTR2,INSTC2)
C AUTHOR RODGER STADEN
C READS A SEQUENCE USING THE DIGITIZER UNTIL A STOP COMMAND IS GIVEN
C LANE COORDINATES CAN BE RESET.
INTEGER XLANE(4),DY,DXMIN,XPEN,YPEN,YMEAN
INTEGER XLMENU(IDMENU),XRMENU(IDMENU)
INTEGER YBMENU(IDMENU),YTMENU(IDMENU)
CHARACTER CHARS(IDMENU),GEL(512),BASE(4),MENUE,LASTCH
INTEGER MENUP(100),SEQCOL,SEQROW,SEQLEN,INSTR2,INSTC2
EXTERNAL LANE
LASTCH=' '
300 CONTINUE
CALL READPN(XPEN,YPEN,0,IDEVD,KBOUT)
C IN LANES?
C*****************************************************
L=LANE(XLANE,YMEAN,DY,DXMIN,XPEN,YPEN)
IF(L.NE.0)THEN
CALL GBELL(1,KBOUT)
C IN LANES
C EXPECTING A BAND SO DEAL WITH IT
C INCREMENT POINTER TO GEL CHARACTERS
IPGEL=IPGEL+1
GEL(IPGEL)=BASE(L)
C PUT ON SCREEN ETC
CALL WRITEG(GEL(IPGEL),SEQCOL,SEQROW,SEQLEN,IPGEL)
LASTCH='C'
ELSE
C IN MENU?
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+ IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
C UNCERTAINTY CODE?
IF((MENU.GT.0).AND.(MENU.LT.25))THEN
C UNCERTAINTY CODE
CALL GBELL(1,KBOUT)
IPGEL=IPGEL+1
GEL(IPGEL)=MENUE
LASTCH='C'
CALL WRITEG(GEL(IPGEL),SEQCOL,SEQROW,SEQLEN,IPGEL)
C DELETE?
ELSE IF(MENU.EQ.50)THEN
C DELETE
C IF LAST CHAR A BASE THEN NEED TO REMOVE IT FROM GEL
IF((LASTCH.EQ.'C').AND.(IPGEL.GT.0))THEN
CALL GBELL(1,KBOUT)
CALL WRITEG(' ',SEQCOL,SEQROW,SEQLEN,IPGEL)
IPGEL=IPGEL-1
END IF
C RESET LANE CENTRES?
ELSE IF(MENU.EQ.51)THEN
CALL GBELL(1,KBOUT)
CALL GETLAN(XLANE,YMEAN,DXMIN,
+ XLMENU,XRMENU,YBMENU,YTMENU,
+ MENUP,CHARS,MENUE,IDMENU,
+ IDEVD,KBOUT,INSTR2,INSTC2)
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES
+ ('Hit bands, uncertainty codes, DELETE, RESET or STOP')
C STOP?
ELSE IF(MENU.EQ.53)THEN
CALL GBELL(1,KBOUT)
RETURN
C FOR NOW NOT FOUND SO IGNORE
END IF
END IF
C NOT IN MENU
C NOT IN MENU OR LANES SO IGNORE
GO TO 300
END
C INOUT
C
C FUNCTION TO RETURN VALUE 1 IF XPEN,YPEN IN BOX, 0 ELSE
C AUTHOR RODGER STADEN
INTEGER FUNCTION INOUT(X1,X2,Y1,Y2,XPEN,YPEN)
IMPLICIT INTEGER (A-Z)
INOUT=0
IF((XPEN.LT.X1).OR.(XPEN.GT.X2))RETURN
IF((YPEN.LT.Y1).OR.(YPEN.GT.Y2))RETURN
INOUT=1
RETURN
END
C LANEORDER
C GETS LANE ORDER FROM TABLET
SUBROUTINE LORDER(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,
+CHARS,MENUE,IDMENU,BASE,IDEVD,KBOUT,INSTR2,INSTC2,
+LORDR,LORDC)
C AUTHOR RODGER STADEN
INTEGER XLMENU(IDMENU),XRMENU(IDMENU)
INTEGER YBMENU(IDMENU),YTMENU(IDMENU)
INTEGER MENUP(IDMENU),INSTR2,INSTC2
CHARACTER BASE(4),BASES(4),CHARS(IDMENU),MENUE,SPACE
CHARACTER BASET*4
PARAMETER (IERRR=24,IERRC=10)
SAVE BASES,SPACE
DATA SPACE/' '/
DATA BASES/'T','C','G','A'/
C
10 CONTINUE
DO 5 I=1,4
BASET(I:I)=BASE(I)
5 CONTINUE
C
CALL CURSOR(LORDR,1)
CALL BLINE
CALL CURSOR(LORDR,LORDC)
CALL WRITES('Lane order is ')
CALL WRITES(BASET)
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES('If lane order correct hit CONFIRM, else hit RESET')
CALL READPN(XPEN,YPEN,1,IDEVD,KBOUT)
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
IF(MENU.EQ.56)THEN
C CLEAR ERROR LINE IN CASE ITS BEEN USED
CALL CURSOR(IERRR,1)
CALL BLINE
RETURN
END IF
IF(MENU.EQ.51)THEN
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES('Define lane order, left to right, using menu')
C COUNT POINTS
IP=1
20 CONTINUE
IF(IP.LE.4)THEN
CALL READPN(XPEN,YPEN,1,IDEVD,KBOUT)
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,
+ CHARS,IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
DO 30 I=1,4
IF(MENUE.EQ.BASES(I))THEN
BASE(IP)=MENUE
GO TO 31
END IF
30 CONTINUE
31 CONTINUE
IP=IP+1
GO TO 20
END IF
C ALL DIFFERENT?
DO 40 I=1,4
DO 41 J=I+1,4
IF(BASE(I).EQ.BASE(J))THEN
C SAME!
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(IERRR,IERRC)
CALL WRITES('*****DUPLICATION IN LANE ORDER*****')
DO 35 K=1,4
BASE(K)=BASET(K:K)
35 CONTINUE
GO TO 10
END IF
41 CONTINUE
40 CONTINUE
END IF
GO TO 10
END
C INTERPXY
C
C INTERPRETS X,Y COORDS FROM DIGITIZER
SUBROUTINE INTERP(XL,XR,YB,YT,MENUP,CHARS,
+IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
C AUTHOR RODGER STADEN
INTEGER XL(IDMENU),XR(IDMENU),YB(IDMENU),YT(IDMENU)
INTEGER MENUP(IDMENU),XPEN,YPEN
CHARACTER CHARS(IDMENU),MENUE
EXTERNAL INOUT
PARAMETER (IERRR=24,IERRC=10)
MENU=0
MENUE=CHARS(1)
C IN MENU AT ALL?
IF(INOUT(XL(1),XR(1),YB(1),YT(1),XPEN,YPEN).EQ.0)RETURN
DO 100 I=2,IDMENU
IF(INOUT(XL(I),XR(I),YB(I),YT(I),XPEN,YPEN).NE.1)GO TO 100
C MATCH
MENU=MENUP(I)
MENUE=CHARS(I)
RETURN
100 CONTINUE
C ERROR IN MENU
MENU=0
MENUE=CHARS(1)
CALL CURSOR(IERRR,1)
CALL BLINE
CALL CURSOR(IERRR,IERRC)
CALL WRITES('******ERROR IN MENU******')
RETURN
END
C
C READPEN GETS COORDS FROM DIGITIZER
SUBROUTINE READPN(XPEN,YPEN,IBELL,IDEVD,KBOUT)
C AUTHOR RODGER STADEN
CHARACTER INPUT*11,INPUTX*5,INPUTY*5
INTEGER XPEN,YPEN
C EQUIVALENCE (INPUT(2:6),INPUTX),(INPUT(7:11),INPUTY)
C NOTE ON IBM NEXT LINE EQUIVALENCE USED
EQUIVALENCE (INPUT(1:5),INPUTX),(INPUT(6:10),INPUTY)
PARAMETER (IERRR=24,IERRC=10)
1000 FORMAT(A)
1 CONTINUE
READ(IDEVD,1000,ERR=1)INPUT
1002 FORMAT(I5)
READ(INPUTX,1002,ERR=100)XPEN
READ(INPUTY,1002,ERR=100)YPEN
IF(IBELL.EQ.1)CALL GBELL(1,KBOUT)
C READ 2nd NEWLINE ON SUN
READ(IDEVD,1000,ERR=1)INPUT
RETURN
100 CONTINUE
CALL CURSOR(IERRR,1)
CALL BLINE
CALL CURSOR(IERRR,IERRC)
CALL WRITES('*********ERROR READING PEN********')
RETURN
END
C WRITEGEL
SUBROUTINE WRITEG(CHAR,STARTX,STARTY,LENGTH,IPGEL)
C AUTHOR RODGER STADEN
C WRITE OUT A CHARACTER
CHARACTER CHAR
INTEGER STARTX,STARTY,ROW,COL
ROW=(IPGEL-1)/LENGTH
COL=MOD(IPGEL,LENGTH)
IF(COL.EQ.0)COL=LENGTH
ROW=STARTY+ROW
COL=STARTX+COL
CALL CURSOR(ROW,COL)
CALL WRITES(CHAR)
RETURN
END
C
C GETLANE
SUBROUTINE GETLAN(XLANE,YMEAN,DXMIN,
+XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,MENUE,IDMENU,
+IDEVD,KBOUT,INSTR2,INSTC2)
C AUTHOR RODGER STADEN
C GETS LANE ORDER
INTEGER XLANE(4)
INTEGER YTEMP(4)
INTEGER XLMENU(IDMENU),XRMENU(IDMENU)
INTEGER YBMENU(IDMENU),YTMENU(IDMENU)
INTEGER MENUP(IDMENU),INSTR2,INSTC2
INTEGER XPEN,YPEN,YMEAN,DXMIN
CHARACTER CHARS(IDMENU),MENUE,SEPAR*10
PARAMETER (IERRR=24,IERRC=10)
INSTR3=4
INSTC3=20
100 CONTINUE
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES
+('Hit START, then, left to right,')
CALL WRITES(' the start centres of this clones lanes')
CALL READPN(XPEN,YPEN,1,IDEVD,KBOUT)
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
C START?
IF(MENU.NE.52)GO TO 100
C GOT START, EXPECT LANES NOW
200 CONTINUE
DO 300 I=1,4
CALL READPN(XPEN,YPEN,1,IDEVD,KBOUT)
C IN MENU?
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
IF(MENU.NE.0)GO TO 100
C NOT IN MENU SO RECORD POSITION
XLANE(I)=XPEN
YTEMP(I)=YPEN
300 CONTINUE
YMEAN=(YTEMP(1)+YTEMP(2)+YTEMP(3)+YTEMP(4))/4
C FIND LANE SEPARATION
DXMIN=(XLANE(4)-XLANE(1))/3
WRITE(SEPAR,1011)DXMIN
CALL CURSOR(INSTR3,1)
CALL BLINE
CALL CURSOR(INSTR3,INSTC3)
CALL WRITES('Mean lane separation = ')
CALL WRITES(SEPAR)
CALL CURSOR(INSTR2,1)
CALL BLINE
CALL CURSOR(INSTR2,INSTC2)
CALL WRITES(
+'If separation ok hit CONFIRM, else hit RESET')
1011 FORMAT(I6)
CALL READPN(XPEN,YPEN,1,IDEVD,KBOUT)
C IN MENU?
CALL INTERP(XLMENU,XRMENU,YBMENU,YTMENU,MENUP,CHARS,
+IDMENU,XPEN,YPEN,MENU,MENUE,KBOUT)
C
IF(MENU.NE.56)GO TO 100
C SET MINIMUM LANE CENTRE CLOSENESS TO 50% OF SEPARATION
DXMIN=DXMIN/2
C CLEAR ERROR LINE IN CASE ITS BEEN USED
CALL CURSOR(IERRR,1)
CALL BLINE
RETURN
END
C LANE
C RETURNS THE LANE NUMBER FOR GELIN
INTEGER FUNCTION LANE(XLANE,YMEAN,DY,DXMIN,XPEN,YPEN)
C AUTHOR RODGER STADEN
INTEGER XLANE(4),YMEAN,D(4)
INTEGER XPEN,YPEN,DXMIN,DY,X1,X2,Y1,Y2,DMIN
EXTERNAL INOUT
LANE=0
C IS THE POINT IN THE LANES?
X1=XLANE(1)-DXMIN
X2=XLANE(4)+DXMIN
Y1=YMEAN-DY
Y2=YMEAN+DY
IF(INOUT(X1,X2,Y1,Y2,XPEN,YPEN).EQ.0)RETURN
C
C IN LANES
C WHICH IS NEAREST XLANE VALUE
DO 10 I=1,4
D(I)=ABS(XLANE(I)-XPEN)
10 CONTINUE
C WHICH IS LEAST?
DMIN=D(1)
ICLOSE=1
DO 20 I=2,4
IF(D(I).GT.DMIN)GO TO 20
C CLOSER
ICLOSE=I
DMIN=D(I)
20 CONTINUE
C CLOSEST TO ICLOSE SO SET THIS CHAR AND SHIFT THIS LANE CENTRE
XLANE(ICLOSE)=XPEN
YMEAN=YPEN
LANE=ICLOSE
C MAKE SURE LANES ARE NOT TOO CLOSE
DO 30 I=2,4
IF(ABS(XLANE(I-1)-XLANE(I)).LT.DXMIN)LANE=0
30 CONTINUE
C RESET LANE SEPARATION
DXMIN=(XLANE(4)-XLANE(1))/6
RETURN
END
C BELL
C SUBROUTINE TO RING BELL N TIMES
SUBROUTINE GBELL(N,KBOUT)
C AUTHOR RODGER STADEN
CHARACTER CBELL
COMMON /BELCHR/ CBELL
CALL WRITES(CBELL)
RETURN
END
SUBROUTINE OPENT(IDEV,FILNAM)
C AUTHOR: RODGER STADEN
CHARACTER FILNAM*(*)
COMMON /TERM/IDEVT
SAVE /TERM/
PARAMETER (IERRR=24,IERRC=10)
IDEVT=IDEV
CALL OPENRS(IDEV,FILNAM,IOK,LRECL,10)
IF(IOK.EQ.0)RETURN
CALL CURSOR(IERRR,1)
CALL BLINE
CALL CURSOR(IERRR,IERRC)
CALL WRITES('****ERROR OPENING SCREEN FOR OUTPUT****')
RETURN
END
SUBROUTINE CLEAR
C AUTHOR: RODGER STADEN
CHARACTER STRING*4,CESC
COMMON /ESCCHR/ CESC
DATA STRING(2:4)/'[2J'/
STRING(1:1)=CESC
C CLEAR SCREEN
CALL WRITES(STRING)
RETURN
END
SUBROUTINE WRITES(CHARS)
C AUTHOR: RODGER STADEN
CHARACTER CHARS*(*)
INTEGER NUL
COMMON /TERM/IDEVT
SAVE /TERM/
DATA NUL/0/
C WRITE(IDEVT,1000)NUL,CHARS
C1000 FORMAT(A1,A)
WRITE(IDEVT,1000)CHARS
1000 FORMAT(A,$)
CALL FLUSH(IDEVT)
RETURN
END
SUBROUTINE CURSOR(LINE,COLUMN)
C AUTHOR: RODGER STADEN
C SETS CURSOR TO LINE AND COLUMN
INTEGER COLUMN
CHARACTER BLIN*2,BCOL*2,SPACE,ZERO,STRING*8,CESC
COMMON /ESCCHR/ CESC
EQUIVALENCE (STRING(3:4),BLIN),(STRING(6:7),BCOL)
SAVE STRING,ZERO,SPACE
DATA STRING(2:2)/'['/,STRING(8:8)/'H'/
DATA STRING(5:5)/';'/
DATA SPACE/' '/,ZERO/'0'/
STRING(1:1)=CESC
WRITE(BCOL,1002,ERR=100)COLUMN
WRITE(BLIN,1002,ERR=100)LINE
1002 FORMAT(I2.2)
C NEED TO SET SPACES TO ZEROS
C IF(BCOL(1:1).EQ.SPACE)BCOL(1:1)=ZERO
C IF(BLIN(1:1).EQ.SPACE)BLIN(1:1)=ZERO
CALL WRITES(STRING)
RETURN
100 CONTINUE
WRITE(*,*)'ERROR IN CURSOR SUBROUTINE'
RETURN
END
SUBROUTINE BLINE
CHARACTER BLANK*79
SAVE BLANK
DATA BLANK/' '/
CALL WRITES(BLANK)
RETURN
END
SUBROUTINE FMTDK(IDEV,SEQNCE,IDIM)
C AUTHOR: RODGER STADEN
CHARACTER SEQNCE(IDIM)
C SET POINTERS TO FIRST AND LAST ELEMENTS ONE WRITE
JS=1
JE=60
10 CONTINUE
C SET JE TO LAST ELEMENT IF NECESSARY
IF(JE.GT.IDIM)JE=IDIM
WRITE(IDEV,1002)(SEQNCE(I),I=JS,JE)
1002 FORMAT(' ',60A1)
C TEST FOR END
IF(JE.EQ.IDIM)GO TO 20
C INCREMENT FIRST AND LAST POINTERS
JS=JE+1
JE=JE+60
GO TO 10
20 CONTINUE
RETURN
END