Vous êtes sur la page 1sur 39

*******************************************************************************

* SOURCE CODE and DOCUMENTATION COPYRIGHT (C) 1987 KEVIN G. RHOADS AND THE *
* HIGH VOLTAGE RESEARCH LAB., L.E.E.S, Massachusetts Institute of Technology *
*******************************************************************************
*******************************************************************************
*
*
* This file is part of the GRAPHICS.LIB library, the other library components *
* are in files: MULTI.FOR, PLOT.FOR, XGRAPH.FOR & MGRAPH.FOR. This library *
* uses routines from the UTILS.LIB and ASMUTILS.LIB libraries and should be *
* listed before them at link time. In particular, routines used from outside *
* this library are primarily concentrated in SUTIL.FOR.
*
*
*
* The screen I/O on the CS/9000 is arranged with multiple logical units built *
* in the operating system upon the graphics hardware. The logical units are: *
* #GR, #SCRN0, #SCRN1 and #CNSL0. This provides a great deal of flexibility, *
* but leads to a confusing situation. These logical units are normally bound *
* to a specific set of FORTRAN LUN's (Logical Unit Numbers) per:
*
* #CNSL0 = UNIT 11
"console" box display on page 0, alphabetic
*
* #SCRN0 = UNIT 12
alphabetic window on display page 0
*
* #SCRN1 = UNIT 13
alphabetic window on display page 1
*
* #GR
= UNIT 14
graphics display on either page, can be opened multiply*
*
*
* The commands for alphabetic windows are in Chapter 4 of the CSOS Operating *
* System Reference, Part 2; the commands for graphics windows are in Chapter 5*
* These two chapters have introductory sections which define terms, illustrate*
* use &c &c. READ THEM IF YOU NEED TO GET FANCY.
*
*
*
*-----------------------------------------------------------------------------*
$SEGMENT GRPRIM
*compiler is directed to place object code in segment GRPRIM
*
*-----------------------------------------------------------------------------*
$CHAREQU
*compiler is directed NOT to barf on CHARACTER and numeric data types mixed in*
*same COMMON BLOCK or EQUIVALENCE
*
*-----------------------------------------------------------------------------*
*
*
* LIST OF ENTRY POINTS
*
*
*
*SEGMENT GRPRIM
*
*
*
*INITGR is an early graphics mode initialization routine. For most uses INITGR
*is unnecessary, PLTINT and it's variants will be used instead.
*
*
SUBROUTINE INITGR same as GRINIT
*
*
ENTRY GRINIT same as INITGR
*
* These two entry points set a window as specified as well as initializing. *
*
ENTRY GRINIW(LL,BB,RR,TT) alias INIWGR
*
*
ENTRY INIWGR(LL,BB,RR,TT) alias GRINIW
*
*-----------------------------------------------------------------------------*
* These routines set the pixel writing mode, SET, RESET and XOR are the
*
* possibilities. See also fill word for pixel control.
*
*
SUBROUTINE SETMOD
*
*
ENTRY PXLSET
*
*
ENTRY RSTMOD alias PXLRST
*
*
ENTRY PXLRST alias RSTMOD
*
*
ENTRY XORMOD alias PXLXOR
*
*
ENTRY PXLXOR alias XORMOD
*
*
ENTRY PXLMOD(MODE)
*
*-----------------------------------------------------------------------------*
* This is very low level, the pixel at X, Y will be set(reset,xored).
*
*
SUBROUTINE DOPIXL(X,Y)
*

*-----------------------------------------------------------------------------*
* This SETs the Current Operating Point to X, Y.
*
*
SUBROUTINE SETCOP(X,Y)
*
*-----------------------------------------------------------------------------*
* Draw a line from X, Y to ENDX, ENDY using the preset fill word in the MODE *
* specified.
*
*
SUBROUTINE LINE(X,Y,ENDX,ENDY,MODE)
*
* As above with fill word specified also.
*
*
ENTRY FLLINE(X,Y,ENDX,ENDY,MODE,IFILL)
*
*-----------------------------------------------------------------------------*
* FILL a rectange with diagonal corners at X, Y and ENDX, ENDY in the MODE
*
* specified, using the default fill word.
*
*
SUBROUTINE FILL(X,Y,ENDX,ENDY,MODE)
*
* As above with fill word specified also.
*
*
ENTRY FFILL(X,Y,ENDX,ENDY,MODE,IFILL)
*
*-----------------------------------------------------------------------------*
* Draw a line from X, Y to ENDX, ENDY using the preset fill word and pixel mode
*
SUBROUTINE DOLINE(X,Y,ENDX,ENDY)
*
* As above with fill word specified.
*
*
ENTRY DFLINE(X,Y,ENDX,ENDY,IFILL)
*
*-----------------------------------------------------------------------------*
* Draw a line to X, Y from the current operating point (COP) using the default*
* fill word and pixel mode.
*
*
SUBROUTINE VECTOR(X,Y)
*
*-----------------------------------------------------------------------------*
* FILL a rectange with diagonal corners at X, Y and ENDX, ENDY in the default *
* MODE and using the default fill word.
*
*
SUBROUTINE DOFILL(X,Y,ENDX,ENDY)
*
* As above with fill word specified.
*
*
ENTRY DFFILL(X,Y,ENDX,ENDY,IFILL)
*
*-----------------------------------------------------------------------------*
* Draws an ellipse centered at X, Y with an X radius of A and a Y radius of B,*
* in the MODE specified using the default fill word.
*
*
SUBROUTINE ELIPSE(X,Y,A,B,MODE)
*
* As above with fill word specified also.
*
*
ENTRY ELLPSE(X,Y,A,B,MODE,IFILL)
*
*-----------------------------------------------------------------------------*
* Draws an ellipse centered at X, Y with an X radius of A and a Y radius of B,*
* using the default fill word and pixel mode.
*
*
SUBROUTINE DOELPS(X,Y,A,B)
*
* As above with fill word specified.
*
*
ENTRY DLELPS(X,Y,A,B,IFILL)
*
*-----------------------------------------------------------------------------*
* This "clears" the current graphics window by hitting all pixels with the
*
* of the current mode (ie. in SET mode pixels are RESET &c)
*
*
SUBROUTINE CLRWIN
*
*-----------------------------------------------------------------------------*
* This "clears" the specified graphics window by hitting all pixels with the *
* of the current mode (ie. in SET mode pixels are RESET &c). The current
*
* window setting is preserved and restored after clearing is done. Two corners
* are specified by XIN, YIN and XXIN, YYIN
*
*
SUBROUTINE CLEAR(XIN,YIN,XXIN,YYIN)
*
*-----------------------------------------------------------------------------*
* These two routines clear entire graphics pages at once, there are two pages *
* designated 0 and 1.
*
*
SUBROUTINE CLRPG0
*
*
ENTRY CLRPG1
*
*-----------------------------------------------------------------------------*
* These routines frame graphics windows. FRAME frames the current window; and *
* FRAMEW frames the window specified by two corners XIN, YIN and XXIN, YYIN, *

* and restores the current window when done.


*
*
SUBROUTINE FRAME
*
*
ENTRY FRAMEW(XIN,YIN,XXIN,YYIN)
*
*-----------------------------------------------------------------------------*
* These routines set the direction in which characters are drawn in graphics *
* windows.
*
*
SUBROUTINE TEXTDR(I)
*
*
ENTRY USUAL
*
*
ENTRY UPWARD
*
*
ENTRY BCKWRD
*
*
ENTRY DOWN
*
*-----------------------------------------------------------------------------*
* This routine sets the magnification for text drawn in graphics modes.
*
*
SUBROUTINE CHRMAG(X)
*
*-----------------------------------------------------------------------------*
* This routine will turn off the cursor in alpha window #SCRN0 on the first *
* display page. Too many things in FORTRAN runtime I/O system make assumptions
* about the status and treatment of the cursor for this to work very well most*
* times.
*
*
SUBROUTINE CRSROF
*
*-----------------------------------------------------------------------------*
* This routine will turn ON the cursor in alpha window #SCRN0 on the first *
* display page. Too many things in FORTRAN runtime I/O system make assumptions
* about the status and treatment of the cursor.
*
*
SUBROUTINE CRSRON
*
*-----------------------------------------------------------------------------*
* This routine is an extended version of FRAME, for the plotting routines. It*
* can draw emphasized borders and other little used variants.
*
*
SUBROUTINE BORDER
*
*
ENTRY EMBORD
*
*-----------------------------------------------------------------------------*
* This routine set parameters and is used internally by various of the plotting
* routines. Its primary purpose was to stub out the setting of certain constant
s
* to allow their treatment as variables in future code, if necessary. So far,*
* this has not proven necessary.
*
*
SUBROUTINE SETPRM
*
*-----------------------------------------------------------------------------*
* These routines allow for the drawing of "marks" on plot lines; marks can be *
* o's, x's or +'s in a variety of sizes, small medium and large. The position*
* of the mark is specified by I and J.
*
*
SUBROUTINE DOMARK(I,J,TYPE)
*
*
ENTRY SMALLX(I,J)
*
*
ENTRY LARGEX(I,J)
*
*
ENTRY MARKX(I,J)
*
*
ENTRY SMALL0(I,J) alias SMALLO
*
*
ENTRY SMALLO(I,J) alias SMALL0
*
*
ENTRY LARGE0(I,J) alias LARGEO
*
*
ENTRY LARGEO(I,J) alias LARGE0
*
*
ENTRY MARK0(I,J) alias MARKO
*
*
ENTRY MARKO(I,J) alias MARK0
*
*
ENTRY SMALLP(I,J)
*
*
ENTRY LARGEP(I,J)
*
*
ENTRY MARKP(I,J)
*
*
ENTRY SMALLM(I,J,TYPE)
*
*
ENTRY LARGEM(I,J,TYPE)
*
*-----------------------------------------------------------------------------*
* These routines force waiting after plotting to allow screen printing and/or *
* operator examination of the plot(s). The time-out period after which the *
* routine automatically returns has a default value of 150.0 seconds or it
*

* can be specified on entry. During waiting the keyboard is monitored, waiting


* is terminated upon operator signals if received.
*
* do a wait, time out = TIMOUT
*
*
SUBROUTINE WTSPTO(TIMOUT)
*
* do a wait, time out = DEFALT
*
*
ENTRY DOWAIT
*
* do a wait, DEFALT = TIMOUT, time out = DEFALT
*
*
ENTRY WTSDTO(TIMOUT)
*
* NO wait, JUST SET DEFALT = TIMOUT
*
*
ENTRY NWSDTO(TIMOUT)
*
* do a wait, time out = INFINITE (ie. no time out)
*
*
ENTRY WTNOTO
*
*-----------------------------------------------------------------------------*
* To draw a character string on a graphics window requires constructing
*
* a PASCAL style string and passing a pointer to it. This routine does all *
* that and hides the funny stuff. The string is drawn using the text direction
* and character magnification previously set, and it starts at the current
*
* operating point (COP). ACHAR is an INTEGER*1 array of length N. Use the
*
* compiler directive $CHAREQU and equivalence a character string with an array*
* of integer*1 to use this routine. (see also QDMCG and DRAW)
*
* LENGTH OF ACHAR SHOULD BE 256 OR LESS.
*
*
SUBROUTINE GRDRAW(ACHAR,N)
*
*-----------------------------------------------------------------------------*
* In order to draw characters on the graphics screen the system must be set up*
* with a font. There is a default, built-in, font (system font) which can be *
* selected using SYSCHR. For the purposes of reconstructing gray scale images*
* on screen a three pixel by three pixel block dither shading font was created*
* and is stored in the file BLK3X3.FNT. The entry BLK3X3 will search for that*
* file and load it, setting the default font to be it. REB3X3 will reset the *
* default font to the 3 by 3 block font if it has been changed. STFONT will *
* set default font as per its arguments.
*
* Data on the nature of the system font and on constructing fonts in general *
* can be found in chapter 5 of CSOS reference part 2.
*
*
SUBROUTINE BLK3X3
*
*
ENTRY REB3X3
*
*
ENTRY SYSCHR
*
*
ENTRY STFONT(IC,IR,IDC,IDR,IF)
*
*-----------------------------------------------------------------------------*
* This routine is archaic and has been superceded by the DOnXL routines below,*
* it has been kept "just in case". Once an image has been selected for display
* the minimum and maximum intensities are determined and a mapping from that *
* range onto the ten displayable screen intensities is set. There are usually*
* several possible 3x3 block characters which "dither" the same intensity value
* This routine will select one and return its font index. There are two means*
* of selecting among "equivalent" 3x3 characters: pseudo-random and by sub- *
* range within intensity range. The second is faster.
*
*
INTEGER*1 FUNCTION B3X3(IVALUE)
*
*-----------------------------------------------------------------------------*
* This does B3X3 for an array of intensity values, returning the results into *
* a string. DO1XL returns 1 character for each intensity; ie. horizontal
*
* magnification is unity.
*
*
SUBROUTINE DO1XL(ARRAY,STRING,LEN)
*
*-----------------------------------------------------------------------------*
* This does B3X3 for an array of intensity values, returning the results into *
* a string. DO2XL returns 2 characters for each intensity; ie. horizontal
*
* magnification is two.
*
*
SUBROUTINE DO2XL(ARRAY,STRING,LEN)
*
*-----------------------------------------------------------------------------*
* This does B3X3 for an array of intensity values, returning the results into *
* a string. DO3XL returns 3 characters for each intensity; ie. horizontal
*

* magnification is three.
*
*
SUBROUTINE DO3XL(ARRAY,STRING,LEN)
*
*-----------------------------------------------------------------------------*
* This does B3X3 for an array of intensity values, returning the results into *
* a string. DO4XL returns 4 characters for each intensity; ie. horizontal
*
* magnification is four.
*
*
SUBROUTINE DO4XL(ARRAY,STRING,LEN)
*
*-----------------------------------------------------------------------------*
* To draw a character string on a graphics window requires constructing
*
* a PASCAL style string and passing a pointer to it. This routine does all *
* that and hides the funny stuff. The string is drawn using the text direction
* and character magnification previously set, and it starts at the current
*
* operating point (COP). STRING is a character srting of up to 99 characters,*
* if string is longer than 99 chars only the first 99 will be displayed. This *
* routine uses QDMCG to do the funny stuff.
*
*
SUBROUTINE DRAW(STRING)
*
*-----------------------------------------------------------------------------*
* To draw a character string on a graphics window requires constructing
*
* a PASCAL style string and passing a pointer to it. This routine does all *
* that and hides the funny stuff. The string is drawn using the text direction
* and character magnification previously set, and it starts at the current
*
* operating point (COP). ACHAR is an INTEGER*1 array of length N+2. Use the *
* compiler directive $CHAREQU and equivalence a character string with an array*
* of integer*1 to use this routine. (see also GRDRAW and DRAW)
*
* LENGTH OF ACHAR CAN BE ANYTHING, AS THE RECONSTRUCTED PASCAL STYLE STRING IS*
* BUILT INTO IT. ACHAR SHOULD BE DIMENSIONED AS -1:N.
*
*
SUBROUTINE QDMCG(ACHAR,N)
*
*-----------------------------------------------------------------------------*
*
*
*
LOGICAL*4 FUNCTION ISPXL(X,Y)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE GETPXL(X,Y,ISIT)
*
*
ENTRY G2TPXL(IX,IY,ISIT)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE REVLNE(LINE)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE REVBLK(LINE,IBEG,IEND)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE DOBOX(LLX,LLY,URX,URY,IFILL,MODE)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE RVRLNE(LINE)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE RVRBLK(LINE,IBEG,IEND)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE DOABOX(LLX,LLY,URX,URY,IFILL,MODE)
*
*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE RSETGR
*
*=============================================================================*
*SEGMENT GRPRIM_
*
*
*
*
SUBROUTINE SETMAP(L,B,R,T)
*
*
ENTRY RSTMAP
*

*-----------------------------------------------------------------------------*
*
*
*
SUBROUTINE ISOMAP(LX,LY)
*
*
*
*-----------------------------------------------------------------------------*
*-----------------------------------------------------------------------------*
*SEGMENT %_LSUTIL
*
*-----------------------------------------------------------------------------*
*
SUBROUTINE SYSIOP
moved from SUTIL for reasons of linker limitations*
*-----------------------------------------------------------------------------*
*
SUBROUTINE OPESCR
moved from SUTIL for reasons of linker limitations*
*---------*
*
ENTRY TSTSCR
moved from SUTIL for reasons of linker limitations*
*-----------------------------------------------------------------------------*
*
SUBROUTINE CCNSL0
moved from SUTIL for reasons of linker limitations*
*-----------------------------------------------------------------------------*
*
SUBROUTINE CRCLS
moved from SUTIL for reasons of linker limitations*
*---------*
*
ENTRY GCRCLS
moved from SUTIL for reasons of linker limitations*
*-----------------------------------------------------------------------------*
*
SUBROUTINE XYGOTO(X,Y) moved from SUTIL for reasons of linker limitations*
********************************************************************************
*************
*
*
* THIS IS THE OLDER DOCUMENTATION FOR THE ROUTINES, WHICH HAVE SINCE BEEN SPLIT
BETWEEN THIS*
* FILE AND MGRAPH.FOR.
*
*
*
* FORTRAN routines for low level interface to the SCREEN Graphics driver
*
*
*
*
FILLWD is a system defined INTEGER*4 value which controls the nature of
the line
*
* drwn by line drawing primitives. A value of 0 would correspond to a blank lin
e, supplying*
* 0 will cause any of the routines here to use a default value. See system docum
entation for*
* detail information.
*
*
*
* INITGR [aka GRINIT] - makes sure graphics and alphanumeric screen windows are
properly
*
*
opened and sets default parameters for graphics driver
*
*
*
* PXLSET [aka SETMOD] - sets pixel mode to set (pixels are turned on)
*
* PXLRST [aka RSTMOD] - sets pixel mode to reset (pixels are turned off)
*
* PXLXOR [aka XORMOD] - sets pixel mode to xor (pixels that are off are put on &
vice versa)*
* PXLMOD(MODE) - sets pixel mode to MODE [INTEGER*4] (0=reset, 1=set, 2=xor)
*
*

*
* FILWRD(I) - sets the graphics FILLWD to be I (code in SUTIL)
*
*
*
* DOPIXL(X,Y) - does the mode operation (set/reset/xor) to the pixel @ X,Y [INTE
GER*4]
*
*
*
* SETCOP(X,Y) - sets the current operating point to X,Y [INTEGER*4]
*
*
*
* CHRMAG(X) - sets Character Magnification to X [INTEGER*4]
*
*
*
* TEXTDR(X) -sets text writing direction
*
* additional entry points are: USUAL, UPWARD, DOWN, BCKWRD
*
*
*
* GRCLS - Does CLear Screen for entire graphics SCREEN (code in SUTIL)
*
* GRCLSW - CLS for graphics window
*
*
* DOLINE(X,Y,ENDX,ENDY) - draws a line from X,Y to ENDX,ENDY in the current mode
/fillword *
*
DFLINE(X,Y,ENDX,ENDY,IFILL) - draws line using IFILL as fill word
*
*
*
* LINE(X,Y,ENDX,ENDY,MODE) - draws a line from X,Y to ENDX,ENDY in MODE mode w/c
urr. fillwd *
*
FLLINE(X,Y,ENDX,ENDY,MODE) - draws a line in MODE mode& IFILL/fillwd
*
*
*
* VECTOR(X,Y) - draws a vector from the current operating point to X,Y
*
*
*
* NB: all line drawing routines leave current operating point set at end of the
line
*
*
*
*
*
* DOFILL(X,Y,ENDX,ENDY) - fills a rectangle: corners X,Y; ENDX,ENDY w/current mo
de/fillword *
*
DFFILL(X,Y,ENDX,ENDY,IFILL) - fills rect. using IFILL as fill word
*
*
*
* FILL(X,Y,ENDX,ENDY,MODE) - fills a rect. w/corners X,Y; ENDX,ENDY w/MODE mode
&cur. fillwd*
*
FFILL(X,Y,ENDX,ENDY,MODE,IFILL) - fills a rect. in MODE mode& IFILL/fill
wd
*

*
*
*---------- INTERMEDIATE LEVEL ROUTINES -------------------------------------------------- *
*
*
* DOWAIT - no arguments. To allow for examination of the plot(s) or time for Pr
intScreen
*
*
this will WAIT for a Control C or until is times out. Default time out i
s 150 seconds*
* - WTNOTO - WAITS w/o any timing - will wait indefinately.
*
* - WTSPTO(TIMOUT) - [TIMOUT: REAL*4] - waits with a time out period specified
by TIMOUT
*
* - WTSDTO(TIMOUT) - [TIMOUT: REAL*4] - waits, sets default time out period to
TIMOUT
*
* - NWSDTO(TIMOUT) - [TIMOUT: REAL*4] - NO wait, sets default time out period t
o TIMOUT
*
*
*
* PLTINT [alternate name: PLINIT] - no arguments.
*
*
This initializes the screen for plotting, checks if printer has been ope
ned, and if *
*
so closes it, saving relevant parameters for use by PLTTRM when it re-op
ens printer. *
* PLTINW [aka PLINIW] - PLTINT for a window
*
* - PLINTS - tests for initialization performed already, if not initializes
*
* - PLINWS - PLINTS for windowing mode
*
* - TOPINT, MIDINT, BOTINT[BTMINT] - initialize for sections of multiscreen plo
t
*
* - TOPTST, MIDTST, BOTTST[BTMTST] - test/initialize for sections of multiscree
n plot
*
*
*
* PLTTRM [alternate name: PLTERM] - no arguments.
*
*
This cleans up afterward, (reconnects #PR if it had been open) & turns c
ursor back on*
*
*
* BORDER - no arguments, uses logical variables and integer variables passed thr
ough common *
*
draws border around plot region
*
*
*
* DOMARK(I,J,ITYPE) - makes a mark centered on I,J of type ITYPE (0->O, 1->X, el
se->+)
*
*
defaults to medium sized, SMALLM and LARGEM will do small and large marks
of the type *
* SMALLX, SMALL0 [SMALLO], SMALLP || LARGEX, LARGE0 [LARGEO], LARGEP || MARKX, M
ARK0, MARKP *
*
above are alternate entry points, type is inherent, take args (I,J)
*
*
*

* - SIGNIFICANT INTERNAL PARAMETERS ARE:


*
*
*
*
LOGICAL*2 TOP,BOTTOM,MID
in multiscreen plots - indicates what pa
rt
*
*
COMMON /MULTI/TOP,BOTTOM,MID
*
*
*
*
INTEGER*4 SLEFT,SRIGHT,STOP,SBOTM physical coordinates for screen edges; n
ormally
*
*
REAL*4 RLEFT,RRIGHT,RTOP,RBOTM
left,botm = 0, right = 767, top = 479; r
& s vars
*
*
COMMON /THEWIN/SLEFT,SRIGHT,STOP,SBOTM,RLEFT,RRIGHT,RTOP,RBOTM
have sa
me value
*
*
*
********************************************************************************
*************
SUBROUTINE INITGR
*---------ENTRY GRINIT
INTEGER*4 L,B,R,T,M,LL,BB,RR,TT
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,I
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
LOGICAL ISIT
I = 0
1 INQUIRE (FILE='#GR',OPENED=ISIT)
I = I + 1
IF (I.GT.3) GOTO 2
IF (.NOT.ISIT) OPEN (UNIT=14,FILE='#GR',ERR=1)
I = 4
2 INQUIRE (FILE='#SCRN0',OPENED=ISIT)
I = I + 1
IF (I.GT.6) GOTO 3
IF (.NOT.ISIT) OPEN (UNIT=12,FILE='#SCRN0',ERR=2)
I = 7
3 INQUIRE (FILE='#SCRN1',OPENED=ISIT)
I = I + 1
IF (I.GT.9) GOTO 4
IF (.NOT.ISIT) OPEN (UNIT=12,FILE='#SCRN1',ERR=3)
4 CONTINUE
L = 0
B = 0
R = 767
T = 479
M = 0
9999 CALL RSTMAP
P(0) = 3
P(1) = 0
P(2) = 1
P(3) = L
P(4) = B
P(5) = R
P(6) = T
P(7) = 7
P(8) = M
P(9) = 9

P(10) = 0
P(11) = 19
P(12) = $FFFF
P(13) = 0
P(14) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
*---------ENTRY GRINIW(LL,BB,RR,TT)
ENTRY INIWGR(LL,BB,RR,TT)
L = LL
B = BB
R = RR
T = TT
M = 2
GOTO 9999
END
*---------------------------------------------------------------------SUBROUTINE SETMOD
*---------ENTRY PXLSET
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,MODE*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
I = 1
1 CONTINUE
P(0) = 5
P(1) = I
P(2) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
*---------ENTRY RSTMOD
ENTRY PXLRST
I = 0
GOTO 1
*---------ENTRY XORMOD
ENTRY PXLXOR
I = 2
GOTO 1
*---------ENTRY PXLMOD(MODE)
I = MODE
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE DOPIXL(X,Y)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4,Y*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
P(0) = 25
P(1) = X
P(2) = Y
P(3) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE SETCOP(X,Y)

INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4,Y*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
P(0) = 23
P(1) = X
P(2) = Y
P(3) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE LINE(X,Y,ENDX,ENDY,MODE)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4,Y*4,ENDX*4,ENDY*4,MODE*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
1 CALL PXLMOD(MODE)
CALL DOLINE(X,Y,ENDX,ENDY)
RETURN
*---------ENTRY FLLINE(X,Y,ENDX,ENDY,MODE,IFILL)
CALL FILWRD(IFILL)
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE FILL(X,Y,ENDX,ENDY,MODE)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4,Y*4,ENDX*4,ENDY*4,MODE*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
1 CALL PXLMOD(MODE)
CALL DOFILL(X,Y,ENDX,ENDY)
RETURN
*---------ENTRY FFILL(X,Y,ENDX,ENDY,MODE,IFILL)
CALL FILWRD(IFILL)
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE DOLINE(X,Y,ENDX,ENDY)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4,Y*4,ENDX*4,ENDY*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
1 P(0) = 23
P(1) = X
P(2) = Y
P(3) = 27
P(4) = ENDX
P(5) = ENDY
P(6) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
*---------ENTRY DFLINE(X,Y,ENDX,ENDY,IFILL)
CALL FILWRD(IFILL)
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE VECTOR(X,Y)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4,Y*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P

P(0) = 27
P(1) = X
P(2) = Y
P(3) = 0
P(4) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE DOFILL(X,Y,ENDX,ENDY)
INTEGER*4 ERROR,X,Y,ENDX,ENDY,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100)
LOGICAL*2 USEWIN
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
SAVE /WIN/,/GRFPKT/
1 P(0) = 23
P(1) = X
P(2) = Y
P(3) = 28
P(4) = ENDX
P(5) = ENDY
P(6) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
*---------ENTRY DFFILL(X,Y,ENDX,ENDY,IFILL)
CALL FILWRD(IFILL)
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE ELIPSE(X,Y,A,B,MODE)
INTEGER*4 X,Y,A,B,MODE,IFILL
1 CALL PXLMOD(MODE)
CALL DOELPS(X,Y,A,B)
RETURN
*---------ENTRY ELLPSE(X,Y,A,B,MODE,IFILL)
CALL FILWRD(IFILL)
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE DOELPS(X,Y,A,B)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4,Y*4,A*4,B*4,MODE*4,IFILL*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
1 IF (A.GT.256) A = 256
I = X+A
IF (I.GT.767) I = IABS(X-A)
A = I
IF (B.GT.256) B = 256
I = Y+B
IF (I.GT.767) I = IABS(Y-B)
B = I
P(0) = 23
P(1) = X
P(2) = Y
P(3) = 32
P(4) = A
P(5) = B

P(6) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
*---------ENTRY DLELPS(X,Y,A,B,IFILL)
CALL FILWRD(IFILL)
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE CLRWIN
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
P(0) = 30
P(1) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE CLEAR(XIN,YIN,XXIN,YYIN)
INTEGER*2 FPKT(0:100),P(0:100)
INTEGER*4 XIN,YIN,XXIN,YYIN,X,XX,Y,YY,ERROR
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
CALL GETWIN(X,Y,XX,YY)
CALL SETWIN(XIN,YIN,XXIN,YYIN)
P(0) = 30
P(1) = 0
CALL SYSFUN(14,P(0),ERROR)
CALL SETWIN(X,Y,XX,YY)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE CLRPG0
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
P(1) = 0
1 P(0) = 6
P(2) = 0
CALL SYSFUN(12,P(0),ERROR)
RETURN
*---------ENTRY CLRPG1
P(1) = 1
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE FRAME
INTEGER*4 XIN,YIN,XXIN,YYIN,X,XX,Y,YY,ERROR
INTEGER*2 FPKT(0:100),P(0:100)
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
CALL GETWIN(X,Y,XX,YY)
1 P(0) = 31
P(1) = 0
CALL SYSFUN(14,P(0),ERROR)
CALL SETWIN(X,Y,XX,YY)
RETURN
*----------

ENTRY FRAMEW(XIN,YIN,XXIN,YYIN)
CALL GETWIN(X,Y,XX,YY)
CALL SETWIN(XIN,YIN,XXIN,YYIN)
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE TEXTDR(I)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,I*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
P(0) = 11
1 P(1) = I
P(2) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
*---------ENTRY USUAL
I = 0
GOTO 1
*---------ENTRY UPWARD
I = 1
GOTO 1
*---------ENTRY BCKWRD
I = 2
GOTO 1
*---------ENTRY DOWN
I = 3
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE CHRMAG(X)
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
IF (X.LE.0) X = 1
P(0) = 13
P(1) = X
P(2) = 0
CALL SYSFUN(14,P(0),ERROR)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE CRSROF
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
P(0) = 35
P(1) = 17
P(2) = 32
P(3) = 0
CALL SYSFUN(12,P(0),ERROR)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE CRSRON
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4,X*4
EQUIVALENCE (P(0),FPKT(0))

COMMON /GRFPKT/P
P(0) = 35
P(1) = 17
P(2) = ICHAR('_')
P(3) = 0
CALL SYSFUN(12,P(0),ERROR)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE BORDER
REAL*4 RLEFT,RRIGHT,RTOP,RBOTM
INTEGER*4 SLEFT,SRIGHT,STOP,SBOTM,UNITNO,L,B,R,T
LOGICAL*4 PRSTAT,ALREDY
LOGICAL*2 TOP,BOTTOM,MID,EMP,USEWIN
COMMON /STATUS/PRSTAT,UNITNO,ALREDY
COMMON /MULTI/TOP,BOTTOM,MID,/WIN/USEWIN,L,B,R,T
COMMON /THEWIN/SLEFT,SRIGHT,STOP,SBOTM,RLEFT,RRIGHT,RTOP,RBOTM
EMP = .FALSE.
9999 CONTINUE
CALL SETMOD
CALL FILWRD(-1)
IF (TOP) THEN
CALL DOLINE(SLEFT,SBOTM,SLEFT,STOP)
CALL DOLINE(SRIGHT,SBOTM,SRIGHT,STOP)
CALL DOLINE(SLEFT,STOP,SRIGHT,STOP)
IF (EMP) THEN
CALL DOLINE((SLEFT+1),SBOTM,(SLEFT+1),(STOP-1))
CALL DOLINE((SRIGHT-1),SBOTM,(SRIGHT-1),(STOP-1))
CALL DOLINE((SLEFT+1),(STOP-1),(SRIGHT-1),(STOP-1))
CALL WINDOW((SLEFT+2),SBOTM,(SRIGHT-2),(STOP-2))
ELSE
CALL WINDOW((SLEFT+1),SBOTM,(SRIGHT-1),(STOP-1))
ENDIF
ELSEIF (MID) THEN
CALL DOLINE(SLEFT,SBOTM,SLEFT,STOP)
CALL DOLINE(SRIGHT,SBOTM,SRIGHT,STOP)
IF (EMP) THEN
CALL DOLINE((SLEFT+1),SBOTM,(SLEFT+1),STOP)
CALL DOLINE((SRIGHT-1),SBOTM,(SRIGHT-1),STOP)
CALL WINDOW((SLEFT+2),SBOTM,(SRIGHT-2),STOP)
ELSE
CALL WINDOW((SLEFT+1),SBOTM,(SRIGHT-1),STOP)
ENDIF
ELSEIF (BOTTOM) THEN
CALL DOLINE(SLEFT,SBOTM,SLEFT,STOP)
CALL DOLINE(SRIGHT,SBOTM,SRIGHT,STOP)
CALL DOLINE(SLEFT,SBOTM,SRIGHT,SBOTM)
IF (EMP) THEN
CALL DOLINE((SLEFT+1),SBOTM,(SLEFT+1),STOP)
CALL DOLINE((SRIGHT-1),SBOTM,(SRIGHT-1),STOP)
CALL DOLINE(SLEFT,(SBOTM+1),SRIGHT,(SBOTM+1))
CALL WINDOW((SLEFT+2),(SBOTM+2),(SRIGHT-2),STOP)
ELSE
CALL WINDOW((SLEFT+1),(SBOTM+1),(SRIGHT-1),STOP)
ENDIF
ELSEIF (.NOT.USEWIN) THEN
CALL WINDOW((SLEFT+1),(SBOTM+1),(SRIGHT-1),(STOP-1))
CALL FRAME
IF (EMP) THEN
CALL WINDOW((SLEFT+2),(SBOTM+2),(SRIGHT-2),(STOP-2))

CALL FRAME
ENDIF
ELSE
CALL WINDOW((L+1),(B+1),(R-1),(T-1))
CALL FRAME
IF (EMP) THEN
CALL WINDOW((L+2),(B+2),(R-2),(T-2))
CALL FRAME
ENDIF
ENDIF
RETURN
*---------ENTRY EMBORD
EMP = .TRUE.
GOTO 9999
END
*---------------------------------------------------------------------SUBROUTINE SETPRM
INTEGER*4 SLEFT,SRIGHT,STOP,SBOTM
REAL*4 RLEFT,RRIGHT,RTOP,RBOTM
COMMON /THEWIN/SLEFT,SRIGHT,STOP,SBOTM,RLEFT,RRIGHT,RTOP,RBOTM
SLEFT = 0
SRIGHT = 767
STOP = 479
SBOTM = 0
RLEFT = SLEFT
RRIGHT = SRIGHT
RLEFT = SLEFT
RTOP = STOP
RETURN
END
*---------------------------------------------------------------------SUBROUTINE DOMARK(I,J,TYPE)
INTEGER*4 I,J,TYPE
LOGICAL*2 SMALL,LARGE
SMALL = .FALSE.
LARGE = .FALSE.
1 CONTINUE
IF (LARGE) THEN
LLX = 10
LLY = 9
ELSEIF (SMALL) THEN
LLX = 3
LLY = 3
ELSE
LLX = 6
LLY = 5
ENDIF
IF (TYPE.EQ.1) THEN
CALL DOLINE((I-LLX),(J-LLY),(I+LLX),(J+LLY))
CALL DOLINE((I+LLX),(J-LLY),(I-LLX),(J+LLY))
ELSEIF (TYPE.EQ.0) THEN
IF (SMALL) THEN
LLX = 2
LLY = 2
ENDIF
CALL DOELPS(I,J,LLX,LLY)
ELSE
CALL DOLINE(I,(J-LLY),I,(J+LLY))
CALL DOLINE((I-LLX),J,(I+LLX),J)

ENDIF
RETURN
*---------ENTRY SMALLX(I,J)
SMALL = .TRUE.
LARGE = .FALSE.
TYPE = 1
GOTO 1
*---------ENTRY LARGEX(I,J)
LARGE = .TRUE.
SMALL = .FALSE.
TYPE = 1
GOTO 1
*---------ENTRY MARKX(I,J)
SMALL = .FALSE.
LARGE = .FALSE.
TYPE = 1
GOTO 1
*---------ENTRY SMALL0(I,J)
ENTRY SMALLO(I,J)
SMALL = .TRUE.
LARGE = .FALSE.
TYPE = 0
GOTO 1
*---------ENTRY LARGE0(I,J)
ENTRY LARGEO(I,J)
LARGE = .TRUE.
SMALL = .FALSE.
TYPE = 0
GOTO 1
*---------ENTRY MARK0(I,J)
ENTRY MARKO(I,J)
SMALL = .FALSE.
LARGE = .FALSE.
TYPE = 0
GOTO 1
*---------ENTRY SMALLP(I,J)
SMALL = .TRUE.
LARGE = .FALSE.
TYPE = -1
GOTO 1
*---------ENTRY LARGEP(I,J)
LARGE = .TRUE.
SMALL = .FALSE.
TYPE = -1
GOTO 1
*---------ENTRY MARKP(I,J)
SMALL = .FALSE.
LARGE = .FALSE.
TYPE = -1
GOTO 1
*----------

ENTRY SMALLM(I,J,TYPE)
SMALL = .TRUE.
LARGE = .FALSE.
GOTO 1
*---------ENTRY LARGEM(I,J,TYPE)
LARGE = .TRUE.
SMALL = .FALSE.
GOTO 1
END
*---------------------------------------------------------------------SUBROUTINE WTSPTO(TIMOUT)
CHARACTER*1 TC,TCALGN(2)
REAL TIMOUT,RDTIME*8,THETIM,DEFALT,TMOUT2
INTEGER*4 STAOF
INTEGER*2 ASC,SCAN,KBF1,KBF2,ERR,IASC,ISCAN,IKBF1,IKBF2,IERR
LOGICAL*2 ABORT,ESCAPE,INTRPT,RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS,DPRTSC
EQUIVALENCE (ASC,IASC),(SCAN,ISCAN),(KBF1,IKBF1),(KBF2,IKBF2),(ERR,IERR)
EQUIVALENCE (TCALGN(1),IASC),(TCALGN(2),TC)
COMMON /KEYGET/IASC,ISCAN,IKBF1,IKBF2,IERR
COMMON /NTRVN/ ABORT,ESCAPE,INTRPT
COMMON /SHFSTA/RSH,LSH,CTRL,ALT,SCRL,NUML,CAPS,INS
SAVE /KEYGET/,/SHFSTA/,/NTRVN/
EXTERNAL RDTIME,STAOF
SAVE
DATA DEFALT/150.0/
TMOUT2 = TIMOUT
3 CONTINUE
*
I = STAOF('SCRNPRNT')
DPRTSC = .FALSE.
CALL SETTIM
2 CONTINUE
THETIM = SNGL(RDTIME())
CALL ISNTRP
IF (ABORT) STOP ' User ABORT detected in DOWAIT'
IF (ESCAPE) GOTO 9999
IF (DPRTSC.AND.(THETIM.LT.(TMOUT2*20.0))) GOTO 2
CALL LEDSON
IF (INTRPT) GOTO 9999
IF (THETIM.GT.TMOUT2) GOTO 9999
IF (ERR.NE.0) GOTO 2
IF (TC.EQ.'*'.AND.SCAN.EQ.55.AND.(.NOT.DPRTSC)) THEN
CALL SETTIM
DPRTSC = .TRUE.
CALL LED1OF
CALL LED3OF
CALL LED5OF
CALL LEDSXX
CALL PRTSC
CALL LEDREV
ELSEIF (TC.EQ.'+') THEN
CALL SETTIM
ENDIF
IF (ASC.EQ.0.AND.(SCAN.EQ.$2E.OR.SCAN.EQ.$31)) GOTO 9999
IF (ASC.EQ.27) GOTO 9999
IF (ASC.NE.14) GOTO 2
9999 CONTINUE
CALL FILWRD($FFFF)
CALL PXLSET
CALL LEDSOF

RETURN
*---------ENTRY DOWAIT
TMOUT2 = DEFALT
GOTO 3
*---------ENTRY WTSDTO(TIMOUT)
IF (TIMOUT.LT.0.0) TIMOUT = 150.0
DEFALT = TIMOUT
TMOUT2 = TIMOUT
GOTO 3
*---------ENTRY NWSDTO(TIMOUT)
IF (TIMOUT.LT.0.0) TIMOUT = 150.0
DEFALT = TIMOUT
RETURN
*---------ENTRY WTNOTO
1 CONTINUE
CALL GETKEY(ASC,SCAN,KBF1,KBF2,ERR)
IF (ERR.NE.0) GOTO 1
IF (ASC.NE.3.AND.SCAN.NE.1) GOTO 1
RETURN
END
*---------------------------------------------------------------------SUBROUTINE GRDRAW(ACHAR,N)
INTEGER*1 ACHAR(N),N*4
INTEGER CHRS(-1:256)*1,LENG*2
EQUIVALENCE (CHRS(-1),LENG)
INTEGER PKT(4)*2,POINT*4,KADDR*4
EQUIVALENCE (POINT,PKT(2))
2 LENG = N
IF (LENG.GT.256) THEN
LENG = 256
ENDIF
N = N - LENG
DO 1 I = 1,LENG
CHRS(I) = ACHAR(I)
1 CONTINUE
*
CALL DDCOPY(ACHAR(1),CHRS(1),LENG)
PKT(1) = 29
POINT = KADDR(LENG)
PKT(4) = 0
CALL SYSFUN(14,PKT(1),IERROR)
IF (IERROR.EQ.0.AND.N.NE.0) GOTO 2
N = IERROR
RETURN
END
*---------------------------------------------------------------------SUBROUTINE BLK3X3
CHARACTER*(18) FILENM
INTEGER*4 ERROR,KADDR,FRCFNT,POINTR
INTEGER*2 ZEN(20),ZNK(6:9),PWORD(2),STRLEN,COL,ROW,DCOL,DROW
INTEGER*1 FONT(3,0:256),ATEST(30),L1NOT,STRING(-1:80)
EQUIVALENCE (PWORD(1),POINTR),(STRLEN,STRING(-1))
SAVE FONT
CALL TSTSCR
CALL GOTOXY(0,0)
FILENM = 'BLK3X3.FNT'
1 CONTINUE

ILEN = 768
CALL RDARR1(FONT(1,0),ILEN,FILENM)
*---------ENTRY REB3X3
COL = 3
ROW = 3
DCOL = 3
DROW = 3
POINTR=KADDR(FONT(1,0))
9000 CONTINUE
ZEN(1)=17
ZEN(2)=DCOL
ZEN(3)=DROW
ZEN(4)=0
CALL SYSFUN(14,ZEN(1),ERROR)
* SET FONT PARAMETERS
ZNK(6)=COL
ZNK(7)=ROW
ZNK(8) = PWORD(1)
ZNK(9) = PWORD(2)
POINTR=KADDR(ZNK(6))
ZEN(5)=15
ZEN(6) = PWORD(1)
ZEN(7) = PWORD(2)
ZEN(8) = 0
ZEN(10)=0
CALL SYSFUN(14,ZEN(5),ERROR)
RETURN
*---------ENTRY SYSCHR
COL = 8
ROW = 14
DCOL = 9
DROW = 16
POINTR = $0F20030
GOTO 9000
*---------ENTRY STFONT(IC,IR,IDC,IDR,IF)
COL = IC
ROW = IR
DCOL = IDC
DROW = IDR
POINTR = KADDR(IF)
GOTO 9000
END
*------------------------------------------------------------------------* CHOOSE BLOCK CHARACTER
INTEGER*1 FUNCTION B3X3(IVALUE)
INTEGER*2 IVALUE,RETVAL
INTEGER*2 R(11),LIKE1,LIKE2,LIKE3,LIKE4,LIKE5,LIKE6,LIKE7,LIKE8
COMMON /CONVGR/ R
LOGICAL*1 FIRST
SAVE I,FIRST
SAVE
DATA I/209/,FIRST/.TRUE./
IF (FIRST) THEN
LIKE1 = 32
LIKE2 = 40
LIKE3 = 50
LIKE4 = 70

LIKE5 = 170
LIKE6 = 150
LIKE7 = 140
LIKE8 = 132
ENDIF
IF (IVALUE.LT.R(1)) THEN
RETVAL = 31
ELSEIF (IVALUE.LT.R(2)) THEN
J = MOD(I,259)
L = MOD(J,105)
K = 5
IF (L.LT.35) K = 7
IF (L.GT.53) J = 260 - J
RETVAL = LIKE1 + MOD(J,K)
ELSEIF (IVALUE.LT.R(3)) THEN
J = MOD(I,200)/5 - 20
K = IABS(J)
IF (K.GT.10) K = K + 5
RETVAL = LIKE2 + MOD(K,10)
ELSEIF (IVALUE.LT.R(4)) THEN
RETVAL = LIKE3 + MOD(I,19)
ELSEIF (IVALUE.LT.R(5)) THEN
RETVAL = LIKE4 + MOD(I,26)
ELSEIF (IVALUE.LT.R(6)) THEN
RETVAL = LIKE5 + MOD(I,26)
ELSEIF (IVALUE.LT.R(7)) THEN
RETVAL = LIKE6 + MOD(I,19)
ELSEIF (IVALUE.LT.R(8)) THEN
J = MOD(I,200)/5 - 20
K = IABS(J)
IF (K.GT.10) K = K + 5
RETVAL = LIKE7 + MOD(K,10)
ELSEIF (IVALUE.LT.R(9)) THEN
J = MOD(I,259)
L = MOD(J,105)
K = 5
IF (L.LT.35) K = 7
IF (L.GT.53) J = 260 - J
RETVAL = LIKE8 + MOD(J,K)
ENDIF
IF (IVALUE.GE.R(9)) RETVAL = 131
I = I + 1
IF (I.GT.311221) I = 0
B3X3 = RETVAL
RETURN
END
*---------------------------------------------------------------------SUBROUTINE DO1XL(ARRAY,STRING,LEN)
INTEGER*2 ARRAY(LEN),MASK,J,K,I2AND2,R(11)
INTEGER*1 STRING(500),B3X3,AB3X3,AB3X3N
LOGICAL NOT14,KILLIT,R11Z
COMMON /PARB14/NOT14,KILLIT,/CONVGR/R
SAVE /PARB14/,/CONVGR/
MASK = $3FFF
IF (R(11).NE.0.AND.R(11).NE.1) R(11) = 1
R11Z = R(11).EQ.0
IF (NOT14.AND.R11Z) THEN
DO 1 I = 1,LEN
J = ARRAY(I)
K = I2AND2(J,MASK)

STRING(I) = B3X3(K)
CONTINUE
ELSEIF (NOT14) THEN
ILEN = LEN
CALL NAB3X3(ARRAY(1),STRING(1),ILEN,R(1))
ELSEIF (R11Z) THEN
DO 21 I = 1,LEN
STRING(I) = B3X3(ARRAY(I))
21
CONTINUE
ELSE
ILEN = LEN
CALL MAB3X3(ARRAY(1),STRING(1),ILEN,R(1))
ENDIF
RETURN
END
*---------------------------------------------------------------------SUBROUTINE DO2XL(ARRAY,STRING,LEN)
INTEGER*2 ARRAY(LEN),JVAL,MASK,J,K,I2AND2,R(11)
INTEGER*1 STRING(500),B3X3,AB3X3,AB3X3N
LOGICAL NOT14,KILLIT,R11Z
COMMON /PARB14/NOT14,KILLIT,/CONVGR/R
SAVE /PARB14/,/CONVGR/
MASK = $3FFF
IF (R(11).NE.0.AND.R(11).NE.1) R(11) = 1
R11Z = R(11).EQ.0
DO 1 I = 1,LEN-1
II = I*2
J = ARRAY(I)
IF (NOT14.AND.R11Z) THEN
K = I2AND2(J,MASK)
STRING(II-1) = B3X3(K)
ELSEIF (R11Z) THEN
STRING(II-1) = B3X3(J)
ELSEIF (NOT14) THEN
STRING(II-1) = AB3X3N(J,R(1))
ELSE
STRING(II-1) = AB3X3(J,R(1))
ENDIF
IF (IABS(ARRAY(I)-ARRAY(I+1)).LT.R(10)) THEN
JVAL = (ARRAY(I)+ARRAY(I+1))/2
IF (NOT14) JVAL = I2AND2(JVAL,MASK)
IF (R11Z) THEN
STRING(II) = B3X3(JVAL)
ELSE
STRING(II) = AB3X3(JVAL,R(1))
ENDIF
ELSEIF (ARRAY(I).GT.ARRAY(I+1)) THEN
STRING(II) = 204
ELSE
STRING(II) = 206
ENDIF
1 CONTINUE
STRING(LEN*2) = B3X3(ARRAY(LEN))
RETURN
END
*---------------------------------------------------------------------SUBROUTINE DO3XL(ARRAY,STRING,LEN)
INTEGER*2 ARRAY(LEN),JVAL,MASK,J,K,I2AND2,R(11)
INTEGER*1 STRING(500),B3X3,AB3X3,AB3X3N
LOGICAL NOT14,KILLIT,R11Z
1

COMMON /PARB14/NOT14,KILLIT,/CONVGR/R
SAVE /PARB14/,/CONVGR/
MASK = $3FFF
IF (R(11).NE.0.AND.R(11).NE.1) R(11) = 1
R11Z = R(11).EQ.0
DO 1 I = 1,LEN-1
II = I*3
IF (NOT14) THEN
J = ARRAY(I)
K = I2AND2(J,MASK)
STRING(II-2) = B3X3(K)
ELSE
STRING(II-2) = B3X3(ARRAY(I))
ENDIF
IF (IABS(ARRAY(I)-ARRAY(I+1)).LT.R(10)) THEN
JVAL = ((2*ARRAY(I)+ARRAY(I+1))/3)
IF (NOT14) JVAL = I2AND2(JVAL,MASK)
STRING(II-1) = B3X3(JVAL)
JVAL = ((ARRAY(I)+2*ARRAY(I+1))/3)
IF (NOT14) JVAL = I2AND2(JVAL,MASK)
STRING(II) = B3X3(JVAL)
ELSEIF (ARRAY(I).GT.ARRAY(I+1)) THEN
STRING(II-1) = 131
STRING(II) = 31
ELSE
STRING(II-1) = 31
STRING(II) = 131
ENDIF
1 CONTINUE
STRING(LEN*3) = B3X3(ARRAY(LEN))
RETURN
END
*---------------------------------------------------------------------SUBROUTINE DO4XL(ARRAY,STRING,LEN)
INTEGER*2 ARRAY(LEN),JVAL,MASK,J,K,I2AND2,R(11)
INTEGER*1 STRING(500),B3X3,AB3X3,AB3X3N
LOGICAL NOT14,KILLIT,R11Z
COMMON /PARB14/NOT14,KILLIT,/CONVGR/R
SAVE /PARB14/,/CONVGR/
MASK = $3FFF
IF (R(11).NE.0.AND.R(11).NE.1) R(11) = 1
R11Z = R(11).EQ.0
DO 1 I = 1,LEN-1
II = I*4
IF (NOT14) THEN
J = ARRAY(I)
K = I2AND2(J,MASK)
STRING(II-3) = B3X3(K)
ELSE
STRING(II-3) = B3X3(ARRAY(I))
ENDIF
IF (IABS(ARRAY(I)-ARRAY(I+1)).LT.R(10)) THEN
JVAL = ((3*ARRAY(I)+ARRAY(I+1))/4)
IF (NOT14) JVAL = I2AND2(JVAL,MASK)
STRING(II-2) = B3X3(JVAL)
JVAL = (ARRAY(I)+ARRAY(I+1))/2
IF (NOT14) JVAL = I2AND2(JVAL,MASK)
STRING(II-1) = B3X3(JVAL)
JVAL = (ARRAY(I)+3*ARRAY(I+1))/4
IF (NOT14) JVAL = I2AND2(JVAL,MASK)

STRING(II) = B3X3(JVAL)
ELSEIF (ARRAY(I).GT.ARRAY(I+1)) THEN
STRING(II-2) = 131
STRING(II-1) = 204
STRING(II) = 31
ELSE
STRING(II-2) = 31
STRING(II-1) = 206
STRING(II) = 131
ENDIF
1 CONTINUE
STRING(LEN*4) = B3X3(ARRAY(LEN))
RETURN
END
*---------------------------------------------------------------------SUBROUTINE DRAW(STRING)
CHARACTER*(*) STRING
INTEGER*2 FPKT(0:100),P(0:100)
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
I = LEN(STRING)
I = MIN(I,99)
DO 1 J = 1,I
P(J+1) = ICHAR(STRING(J:J))
1 CONTINUE
CALL QDMCG(P(0),I)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE QDMCG(ACHAR,N)
INTEGER*1 ACHAR(-1:N),N*4
INTEGER LENG*2,L1(2)*1
EQUIVALENCE (L1(1),LENG)
INTEGER PKT(4)*2,POINT*4,KADDR*4
EQUIVALENCE (POINT,PKT(2))
LENG = N
ACHAR(-1) = L1(1)
ACHAR(0) = L1(2)
PKT(1) = 29
POINT = KADDR(ACHAR(-1))
PKT(4) = 0
CALL SYSFUN(14,PKT(1),IERROR)
RETURN
END
*-------------------------------------------------------------------------LOGICAL*4 FUNCTION ISPXL(X,Y)
INTEGER*4 X,Y,ERROR
INTEGER*2 IX,IY,P(5)
LOGICAL*2 ISIT,LP(5)
EQUIVALENCE (P(1),LP(1))
I = X
J = Y
9999 CONTINUE
P(1) = 26
P(2) = I
P(3) = J
P(5) = 0
CALL SYSFUN(14,P(1),ERROR)
ISPXL = LP(4)
RETURN

END
*-------------------------------------------------------------------------SUBROUTINE GETPXL(X,Y,ISIT)
INTEGER*4 X,Y
INTEGER*2 IX,IY
LOGICAL ISIT*2,ISPXL*4
I = X
J = Y
9999 CONTINUE
ISIT = ISPXL(I,J)
RETURN
*---------ENTRY G2TPXL(IX,IY,ISIT)
I = IX
J = IY
GOTO 9999
END
*-------------------------------------------------------------------------SUBROUTINE REVLNE(LINE)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1984
INTEGER*4 LINE,UNIT,ERROR,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),MODE,PKT(-1:25)
LOGICAL*2 USEWIN
EQUIVALENCE (P(0),FPKT(0),PKT(-1))
COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
SAVE /WIN/,/GRFPKT/
1 CONTINUE
IF (LINE.GT.28) LINE = MOD(LINE,28)
IF (LINE.LT.0) LINE = 28 - MOD(LINE,28)
PKT(-1) = 20
PKT(0) = 0
PKT(1) = 10
PKT(2) = 0
PKT(3) = 8
PKT(4) = 0
PKT(5) = 6
PKT(6) = 0
PKT(7) = 2
PKT(8) = 0
PKT(9) = 0
PKT(10) = 0
PKT(11) = 0
PKT(12) = 19
PKT(13) = $FFFF
PKT(14) = 9
PKT(15) = 0
PKT(16) = 7
PKT(18) = 5
PKT(19) = 2
PKT(20) = 1
IF (USEWIN) THEN
PKT(17) = 2
PKT(21) = L
PKT(22) = B
PKT(23) = R
PKT(24) = T
ELSE
PKT(17) = 0
PKT(21) = 0
PKT(22) = 0

PKT(23) = 767
PKT(24) = 479
ENDIF
PKT(25) = 0
ERROR = 0
CALL SYSFUN(14,PKT(-1),ERROR)
IF (ERROR.EQ.$8300) THEN
OPEN(UNIT=14,FILE='#GR')
GOTO 1
ENDIF
PKT(12) = 23
PKT(13) = 9
PKT(14) = 448 - 16*LINE
PKT(15) = 28
PKT(16) = 728
PKT(17) = PKT(14) + 15
PKT(18) = 0
CALL SYSFUN(14,PKT(12),ERROR)
PKT(-1) = 19
PKT(1) = 9
PKT(3) = 7
PKT(5) = 5
PKT(7) = 1
PKT(12) = 0
PKT(13) = 0
CALL SYSFUN(14,PKT(-1),ERROR)
IF (ERROR.NE.0) PRINT *,'REVLNE: (',UNIT,') ERROR = ',ERROR
RETURN
END
*-------------------------------------------------------------------------SUBROUTINE REVBLK(LINE,IBEG,IEND)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1984
INTEGER*4 LINE,UNIT,ERROR,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),MODE,PKT(-1:25)
LOGICAL*2 USEWIN
EQUIVALENCE (P(0),FPKT(0),PKT(-1))
COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
SAVE /WIN/,/GRFPKT/
1 CONTINUE
IF (LINE.GT.28) LINE = MOD(LINE,28)
IF (LINE.LT.0) LINE = 28 - MOD(LINE,28)
PKT(-1) = 20
PKT(0) = 0
PKT(1) = 10
PKT(2) = 0
PKT(3) = 8
PKT(4) = 0
PKT(5) = 6
PKT(6) = 0
PKT(7) = 2
PKT(8) = 0
PKT(9) = 0
PKT(10) = 0
PKT(11) = 0
PKT(12) = 19
PKT(13) = $FFFF
PKT(14) = 9
PKT(15) = 0
PKT(16) = 7
PKT(18) = 5

PKT(19) = 2
PKT(20) = 1
IF (USEWIN) THEN
PKT(17) = 2
PKT(21) = L
PKT(22) = B
PKT(23) = R
PKT(24) = T
ELSE
PKT(17) = 0
PKT(21) = 0
PKT(22) = 0
PKT(23) = 767
PKT(24) = 479
ENDIF
PKT(25) = 0
ERROR = 0
CALL SYSFUN(14,PKT(-1),ERROR)
IF (ERROR.EQ.$8300) THEN
OPEN(UNIT=14,FILE='#GR')
GOTO 1
ENDIF
PKT(12) = 23
PKT(13) = 9 + IBEG*9
PKT(14) = 448 - 16*LINE
PKT(15) = 28
PKT(16) = 17 + IEND*9
PKT(17) = PKT(14) + 15
PKT(18) = 0
CALL SYSFUN(14,PKT(12),ERROR)
PKT(-1) = 19
PKT(1) = 9
PKT(3) = 7
PKT(5) = 5
PKT(7) = 1
PKT(12) = 0
PKT(13) = 0
CALL SYSFUN(14,PKT(-1),ERROR)
IF (ERROR.NE.0) PRINT *,'REVBLK: (',UNIT,') ERROR = ',ERROR
RETURN
END
*-------------------------------------------------------------------------SUBROUTINE DOBOX(LLX,LLY,URX,URY,IFILL,MODE)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1984
INTEGER*4 LINE,UNIT,ERROR,URX,URY,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),PKT(-1:25),MODE
LOGICAL*2 USEWIN
EQUIVALENCE (P(0),FPKT(0),PKT(-1))
COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
SAVE /WIN/,/GRFPKT/
1 CONTINUE
IF (LINE.GT.28) LINE = MOD(LINE,28)
IF (LINE.LT.0) LINE = 28 - MOD(LINE,28)
PKT(-1) = 20
PKT(0) = 0
PKT(1) = 10
PKT(2) = 0
PKT(3) = 8
PKT(4) = 0
PKT(5) = 6

PKT(6) = 0
PKT(7) = 2
PKT(8) = 0
PKT(9) = 0
PKT(10) = 0
PKT(11) = 0
PKT(12) = 19
PKT(13) = IFILL
PKT(14) = 9
PKT(15) = 0
PKT(16) = 7
PKT(18) = 5
PKT(19) = MODE
PKT(20) = 1
IF (USEWIN) THEN
PKT(17) = 2
PKT(21) = L
PKT(22) = B
PKT(23) = R
PKT(24) = T
ELSE
PKT(17) = 0
PKT(21) = 0
PKT(22) = 0
PKT(23) = 767
PKT(24) = 479
ENDIF
PKT(25) = 0
ERROR = 0
CALL SYSFUN(14,PKT(-1),ERROR)
IF (ERROR.EQ.$8300) THEN
OPEN(UNIT=14,FILE='#GR')
GOTO 1
ENDIF
PKT(12) = 23
PKT(13) = LLX
PKT(14) = LLY
PKT(15) = URX
PKT(16) = URY
PKT(17) = PKT(14) + 15
PKT(18) = 0
CALL SYSFUN(14,PKT(12),ERROR)
PKT(-1) = 19
PKT(1) = 9
PKT(3) = 7
PKT(5) = 5
PKT(7) = 1
PKT(12) = 0
PKT(13) = 0
CALL SYSFUN(14,PKT(-1),ERROR)
IF (ERROR.NE.0) PRINT *,'DOBOX: (',UNIT,') ERROR = ',ERROR
RETURN
END
*-------------------------------------------------------------------------SUBROUTINE RVRLNE(LINE)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1984
INTEGER*4 LINE,UNIT,ERROR,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),MODE,PKT(-1:25)
LOGICAL*2 INITYT,USEWIN
EQUIVALENCE (P(0),FPKT(0),PKT(-1))

COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
SAVE /WIN/,/GRFPKT/
DATA INITYT/.FALSE./
1 CONTINUE
IF (LINE.GT.28) LINE = MOD(LINE,28)
IF (LINE.LT.0) LINE = 28 - MOD(LINE,28)
IF (.NOT.INITYT) THEN
CALL TSTSCR
PKT(12) = 19
PKT(13) = $FFFF
PKT(14) = 9
PKT(15) = 0
PKT(16) = 7
PKT(18) = 5
PKT(19) = 2
PKT(20) = 1
IF (USEWIN) THEN
PKT(17) = 2
PKT(21) = L
PKT(22) = B
PKT(23) = R
PKT(24) = T
ELSE
PKT(17) = 0
PKT(21) = 0
PKT(22) = 0
PKT(23) = 767
PKT(24) = 479
ENDIF
PKT(25) = 0
ERROR = 0
CALL SYSFUN(14,PKT(12),ERROR)
IF (ERROR.EQ.$8300) THEN
OPEN(UNIT=14,FILE='#GR')
GOTO 1
ENDIF
INITYT = .TRUE.
ELSE
PKT(12) = 5
PKT(13) = 2
PKT(14) = 0
CALL SYSFUN(14,PKT(12),ERROR)
ENDIF
PKT(12) = 23
PKT(13) = 9
PKT(14) = 448 - 16*LINE
PKT(15) = 28
PKT(16) = 728
PKT(17) = PKT(14) + 15
PKT(18) = 0
CALL SYSFUN(14,PKT(12),ERROR)
IF (ERROR.NE.0) PRINT *,'RVRLNE: (',UNIT,') ERROR = ',ERROR
RETURN
END
*-------------------------------------------------------------------------SUBROUTINE RVRBLK(LINE,IBEG,IEND)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1984
INTEGER*4 LINE,UNIT,ERROR,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),MODE,PKT(-1:25)
LOGICAL*2 INITYT,USEWIN

EQUIVALENCE (P(0),FPKT(0),PKT(-1))
COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
SAVE /WIN/,/GRFPKT/
DATA INITYT/.FALSE./
1 CONTINUE
IF (LINE.GT.28) LINE = MOD(LINE,28)
IF (LINE.LT.0) LINE = 28 - MOD(LINE,28)
IF (.NOT.INITYT) THEN
CALL TSTSCR
PKT(12) = 19
PKT(13) = $FFFF
PKT(14) = 9
PKT(15) = 0
PKT(16) = 7
PKT(18) = 5
PKT(19) = 2
PKT(20) = 1
IF (USEWIN) THEN
PKT(17) = 2
PKT(21) = L
PKT(22) = B
PKT(23) = R
PKT(24) = T
ELSE
PKT(17) = 0
PKT(21) = 0
PKT(22) = 0
PKT(23) = 767
PKT(24) = 479
ENDIF
PKT(25) = 0
ERROR = 0
CALL SYSFUN(14,PKT(12),ERROR)
IF (ERROR.EQ.$8300) THEN
OPEN(UNIT=14,FILE='#GR')
GOTO 1
ENDIF
INITYT = .TRUE.
ELSE
PKT(12) = 5
PKT(13) = 2
PKT(14) = 0
CALL SYSFUN(14,PKT(12),ERROR)
ENDIF
PKT(12) = 23
PKT(13) = 9 + IBEG*9
PKT(14) = 448 - 16*LINE
PKT(15) = 28
PKT(16) = 17 + IEND*9
PKT(17) = PKT(14) + 15
PKT(18) = 0
CALL SYSFUN(14,PKT(12),ERROR)
IF (ERROR.NE.0) PRINT *,'RVRBLK: (',UNIT,') ERROR = ',ERROR
RETURN
END
*-------------------------------------------------------------------------SUBROUTINE DOABOX(LLX,LLY,URX,URY,IFILL,MODE)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1984
INTEGER*4 LINE,UNIT,ERROR,URX,URY,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),MODE,PKT(-1:25)

LOGICAL*2 INITYT,USEWIN
EQUIVALENCE (P(0),FPKT(0),PKT(-1))
COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
DATA INITYT/.FALSE./
1 CONTINUE
IF (LINE.GT.28) LINE = MOD(LINE,28)
IF (LINE.LT.0) LINE = 28 - MOD(LINE,28)
IF (.NOT.INITYT) THEN
CALL TSTSCR
PKT(12) = 19
PKT(13) = IFILL
PKT(14) = 9
PKT(15) = 0
PKT(16) = 7
PKT(18) = 5
PKT(19) = MODE
PKT(20) = 1
IF (USEWIN) THEN
PKT(17) = 2
PKT(21) = L
PKT(22) = B
PKT(23) = R
PKT(24) = T
ELSE
PKT(17) = 0
PKT(21) = 0
PKT(22) = 0
PKT(23) = 767
PKT(24) = 479
ENDIF
PKT(25) = 0
ERROR = 0
CALL SYSFUN(14,PKT(12),ERROR)
IF (ERROR.EQ.$8300) THEN
OPEN(UNIT=14,FILE='#GR')
GOTO 1
ENDIF
INITYT = .TRUE.
ELSE
PKT(12) = 5
PKT(13) = MODE
PKT(14) = 0
CALL SYSFUN(14,PKT(12),ERROR)
ENDIF
PKT(12) = 23
PKT(13) = LLX
PKT(14) = LLY
PKT(15) = URX
PKT(16) = URY
PKT(17) = PKT(14) + 15
PKT(18) = 0
CALL SYSFUN(14,PKT(12),ERROR)
IF (ERROR.NE.0) PRINT *,'DOABOX: (',UNIT,') ERROR = ',ERROR
RETURN
END
*-------------------------------------------------------------------------SUBROUTINE RSETGR
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1984
INTEGER*4 ERROR,L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),PKT(-1:25)

LOGICAL*2 USEWIN
EQUIVALENCE (P(0),FPKT(0),PKT(-1))
COMMON /GRFPKT/P,/WIN/USEWIN,L,B,R,T
1 CONTINUE
IF (LINE.GT.28) LINE = MOD(LINE,28)
IF (LINE.LT.0) LINE = 28 - MOD(LINE,28)
CALL TSTSCR
PKT(12) = 19
PKT(13) = $FFFF
PKT(14) = 9
PKT(15) = 0
PKT(16) = 7
PKT(17) = 0
PKT(18) = 5
PKT(19) = 1
PKT(20) = 1
PKT(21) = 0
PKT(22) = 0
PKT(23) = 767
PKT(24) = 479
PKT(25) = 0
ERROR = 0
CALL SYSFUN(14,PKT(12),ERROR)
L = 0
B = 0
R = 767
T = 479
USEWIN = .FALSE.
IF (ERROR.EQ.$8300) THEN
OPEN(UNIT=14,FILE='#GR')
GOTO 1
ENDIF
IF (ERROR.NE.0) PRINT *,'RSETGR: (',UNIT,') ERROR = ',ERROR
RETURN
END
*-------------------------------------------------------------------------$SEGMENT GRPRIM_
*compiler is directed to place object code in segment GRPRIM_
*
SUBROUTINE SETMAP(L,B,R,T)
INTEGER*4 L,B,R,T
INTEGER*2 FPKT(0:100),P(0:100),ERROR*4
EQUIVALENCE (P(0),FPKT(0))
COMMON /GRFPKT/P
P(21) = L
P(22) = B
P(23) = R
P(24) = T
P(27) = 2
9999 CONTINUE
P(0) = 21
P(1) = P(21)
P(2) = P(22)
P(3) = P(23)
P(4) = P(24)
P(5) = 0
P(6) = 7
P(7) = P(27)
P(8) = 9
P(9) = 0

P(10) = 0
CALL SYSFUN(14,P(0),ERROR)
IF (ERROR.EQ.0) CALL SYSFUN(14,P(6),ERROR)
RETURN
*---------ENTRY RSTMAP
P(21) = 0
P(22) = 0
P(23) = 767
P(24) = 479
P(27) = 0
GOTO 9999
END
*--------------------------------------------------------------------------SUBROUTINE ISOMAP(LX,LY)
INTEGER*4 ERROR,LX,LY
INTEGER*2 PKT(0:100),FPKT(0:100),P(0:100)
EQUIVALENCE (P(0),FPKT(0),PKT(0))
COMMON /GRFPKT/P
CALL SETPG0
CALL GRCLS
CALL GOTOXY(0,0)
PKT(1) = 40
PKT(2) = 0
PKT(3) = 0
PKT(4) = 0
CALL SYSFUN(12,PKT(1),ERROR)
PKT(1) = 7
PKT(2) = 0
PKT(3) = 9
PKT(4) = 0
PKT(5) = 0
CALL SYSFUN(14,PKT(1),ERROR)
CALL GRCLS
PKT(1) = 1
PKT(2) = 2
PKT(3) = 2
PKT(4) = 765
PKT(5) = 477*(LY/170.0)
IF (PKT(5).LT.150) PKT(5) = PKT(5)*2
IF (PKT(5).LT.150) PKT(5) = PKT(5)*2
IF (PKT(5).GT.477.OR.PKT(5).LT.0) PKT(5) = 477
PKT(6) = 9
PKT(7) = 0
PKT(8) = 7
PKT(9) = 0
PKT(10) = 21
PKT(11) = 1
PKT(12) = 1
PKT(13) = LX
PKT(14) = LY
PKT(15) = 7
PKT(16) = 2
PKT(17) = 31
PKT(18) = 0
CALL SYSFUN(14,PKT(1),ERROR)
RETURN
END
*---------------------------------------------------------------------$SEGMENT %_LSUTIL

SUBROUTINE RESCRN
CHARACTER PROGNM*18,MAINLN*54,CRKEY*12,CRLINE*72
INTEGER*4 I,REBLKD
LOGICAL*4 DOCR,OPEN,ORDIN*1
COMMON /NAMEPR/PROGNM,MAINLN,/GNORF9/CRKEY,CRLINE,DOCR
SAVE /NAMEPR/,/GNORF9/
EXTERNAL OPESCR,BLK3X3,USEPG1,PLTTRM,GRINIT,USEPG0,REGEWT,REBLKD
EXTERNAL GCRCLS
*
ORDIN = .TRUE.
9000 CONTINUE
WRITE (*,*,ERR=1122) ' RE INITIALIZING SCREEN I/O SUBSYSTEM #1'
1122 CONTINUE
CALL OPECON
CLOSE (11,ERR=1123)
1123 CLOSE (12,ERR=1124)
1124 CLOSE (13,ERR=1125)
1125 CLOSE (14,ERR=1126)
1126 CALL OPESCR
WRITE (*,*,ERR=1127) ' Re Initializing Screen I/O Subsystem #2'
1127 CONTINUE
IF (ORDIN) CALL BLK3X3
CALL USEPG1
CALL PLTTRM
CALL GRINIT
CALL USEPG0
CALL PLTTRM
CALL GRINIT
DOCR = .TRUE.
CRKEY = 'cOPYrIGHT@@@'
IF (ORDIN) THEN
MAINLN = 'KIAS: Kerr Image Analysis System '
CRLINE = '1984-89 Kevin G. Rhoads & High Voltage Research Lab (LEES) @
MIT.'
I = REBLKD()
CALL REGEWT
CALL GCRCLS
INQUIRE (FILE='#PR',NUMBER=I,OPENED=OPEN)
IF (OPEN) CLOSE (UNIT=I,ERR=1128)
1128
CONTINUE
ELSE
MAINLN = ' '
CRLINE = '1983-1989 HVRL in LEES @ MIT, portions (c) 1984-89 Kevin G.
Rhoads.'
ENDIF
RETURN
*---------ENTRY R3SCRN
ORDIN = .FALSE.
GOTO 9000
END
*---------------------------------------------------------------------SUBROUTINE SYSIOP
CALL SYSOPE(246,'#CON ',1,0,1,0,IERROR)
CALL SYSOPE(249,'#SCRN0',0,0,1,0,IERROR)
CALL SYSOPE(250,'#CNSL0',0,0,1,0,IERROR)
CALL SYSOPE(251,'#SCRN1',0,0,1,0,IERROR)
RETURN
END
*----------------------------------------------------------------------

SUBROUTINE OPESCR
IMPLICIT CHARACTER*123 (A-Z)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1983.
CHARACTER PROGNM*18,MAINLN*54,SAVENM*18
REAL*4 CONTRS,BRIGHT,HILO
INTEGER*4 DIBOPT,DIBBIO(4),FIXVAR,ERROR,SCRN1,L,B,R,T,WDFILL(7)
INTEGER*4 SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,MAG
INTEGER*2 FPCKTA(100),FPKTA(100),PKT(100),P(100)
INTEGER*1 DTCB,DTCBA(50)
LOGICAL*4 ISOPEN,OPEN11,QWERTY,REPEAT
LOGICAL*2 ISTEST,DUMPIT,PAUSES,CONFRM,USEWIN
EQUIVALENCE (FPCKTA(1),FPKTA(1),PKT(1),P(1))
EQUIVALENCE (DTCB,DTCBA(1))
COMMON /FUNPKT/FPCKTA,/NAMEPR/PROGNM,MAINLN,/WIN/USEWIN,L,B,R,T
COMMON /UNITS/SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,SCRN1
COMMON /YUIOP/QWERTY,/TST/ISTEST,/DUMP/DUMPIT,/FILLS/WDFILL
COMMON /DTCBS/DTCBA,/PAWS/PAUSES,/CNFRM/CONFRM
COMMON /BLKCNV/MAG,HILO,CONTRS,BRIGHT,/GEWRTN/REPEAT,NMAG,CNTRS,BRGHT
SAVE /TST/,/DUMP/,/DTCBS/,/PAWS/,/CNFRM/,/GEWRTN/,/BLKCNV/,/FILLS/
SAVE /NAMEPR/,/UNITS/,/FUNPKT/,/YUIOP/
EXTERNAL CRCLS,PAUSE
SAVE
*
SAVENM = PROGNM
PROGNM = 'UTILITY: OPESCR'
QWERTY = .FALSE.
4 CONTINUE
CALL SYSIOP
CALL OPECON
SCRN0 = 12
SCRN1 = 13
CNSL0 = 11
GR = 14
ISOPEN = .FALSE.
INQUIRE (UNIT=12,OPENED=ISOPEN)
IF (ISOPEN) THEN
CLOSE (UNIT=12,ERR=11)
ELSE
MAINLN = ' '
PROGNM = ' '
ENDIF
*
INQUIRE (UNIT=0,OPENED=ISOPEN)
*
IF (.NOT.ISOPEN) THEN
*
OPEN (UNIT=0,FILE='#SCRN0',ERR=11)
*
ENDIF
11 OPEN (UNIT=SCRN0,FILE='#SCRN0',ERR=1)
1 ISOPEN = .FALSE.
INQUIRE (UNIT=11,OPENED=ISOPEN)
IF (ISOPEN) CLOSE (UNIT=11,ERR=1)
OPEN (UNIT=CNSL0,FILE='#CNSL0',ERR=12)
12 ISOPEN = .FALSE.
INQUIRE (UNIT=14,OPENED=ISOPEN)
IF (ISOPEN) CLOSE (UNIT=14,ERR=2)
2 OPEN (UNIT=GR,FILE='#GR',ERR=33)
33 OPEN (UNIT=SCRN1,FILE='#SCRN1',ERR=3)
3 CONTINUE
CALL DISPG0
CALL USEPG0
REPEAT = .FALSE.
MAG = 0

HILO = 1
CONTRS = 0.0
BRIGHT = 0.0
DUMPIT = .FALSE.
ISTEST = .FALSE.
PAUSES = .FALSE.
CONFRM = .TRUE.
P(0) = 30
P(1) = 0
P(2) = 5
P(3) = 1
P(4) = 19
P(5) = $FFFF
P(6) = 1
P(7) = 0
P(8) = 0
P(9) = 767
P(10) = 479
P(11) = 30
P(12) = 0
P(13) = 0
CALL SYSFUN(14,P(0),ERROR)
P(1) = 40
P(2) = 3
P(3) = 0
P(4) = 0
CALL SYSFUN(12,P(1),ERROR)
P(1) = 41
P(2) = 0
P(3) = 0
P(4) = 80
P(5) = 29
P(6) = 0
CALL SYSFUN(13,P(1),ERROR)
L = 0
B = 0
R = 767
T = 479
USEWIN = .FALSE.
WDFILL(1) = $FFFF
WDFILL(2) = $AAAA
WDFILL(3) = $CCCC
WDFILL(4) = $F0F0
WDFILL(5) = $FC3F
WDFILL(6) = $F99F
WDFILL(7) = $A9C5
CALL SETPG0
CALL FILWRD($0FFFF)
CALL GRCLS
PROGNM = SAVENM
CALL CONQON
CALL KPDQON
RETURN
*---------ENTRY TSTSCR
SAVENM = PROGNM
INQUIRE (FILE='#SCRN0',OPENED=ISOPEN)
INQUIRE (FILE='#CNSL0',OPENED=OPEN11)
ISOPEN = ISOPEN.AND.OPEN11
INQUIRE (FILE='#SCRN1',OPENED=OPEN11)

ISOPEN = ISOPEN.AND.OPEN11
INQUIRE (FILE='#GR ',OPENED=OPEN11)
ISOPEN = ISOPEN.AND.OPEN11
INQUIRE (UNIT=0,OPENED=OPEN11)
IF (ISOPEN.AND.OPEN11) THEN
CALL SYSIOP
CALL TSTCON
RETURN
ENDIF
QWERTY = .TRUE.
GOTO 4
END
*---------------------------------------------------------------------SUBROUTINE CCNSL0
IMPLICIT CHARACTER*123 (A-Z)
INTEGER*4 SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,ERROR,I,SCRN1
INTEGER*2 FPCKTA(100),FPKTA(100),PKT(100)
EQUIVALENCE (FPCKTA(1),FPKTA(1),PKT(1))
COMMON /UNITS/SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,SCRN1,/FUNPKT
/FPCKTA
SAVE /UNITS/,/FUNPKT/
* (c) COPYRIGHT: 1983,1984 Kevin G. Rhoads & High Voltage Research Lab (MIT)
*
CALL TSTSCR
CNSL0 = 11
PKT(1) = 36
PKT(2) = 0
PKT(3) = 0
CALL SYSFUN(11,PKT(1),ERROR)
DO 4 I = 0,2
CALL CLLINE(I,CNSL0)
4 CONTINUE
CALL CLLINE(0,CNSL0)
RETURN
END
*---------------------------------------------------------------------SUBROUTINE CRCLS
IMPLICIT CHARACTER*123 (A-Z)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1983-88.
CHARACTER PROGNM*18,MAINLN*54,DATTIM*32,CRKEY*12,CRLINE*72
INTEGER*4 SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,ERROR,UNIT,SCRN1
INTEGER*2 FPCKTA(100),FPKTA(100),PKT(100),P(100)
LOGICAL*4 ISOPEN,DOCR,ALTCR,PAUSES*2,OK
EQUIVALENCE (FPCKTA(1),FPKTA(1),PKT(1),P(1))
COMMON /NAMEPR/PROGNM,MAINLN,/TIMDAT/DATTIM,/PAWS/PAUSES
COMMON /UNITS/SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,SCRN1
COMMON /FUNPKT/FPCKTA,/GNORF9/CRKEY,CRLINE,DOCR
SAVE /NAMEPR/,/TIMDAT/,/PAWS/,/FUNPKT/,/UNITS/,/GNORF9/,ALTCR
EXTERNAL GETTIM,GOTOXY,CLS
SAVE
DATA ALTCR/.FALSE./
*
IF (.NOT.ALTCR) THEN
IF (DOCR) ALTCR = CRKEY .EQ. 'cOPYrIGHT@@@'
ENDIF
CALL GOTOXY(0,0)
WRITE (0,'(\A\)',ERR=9998) ' '
9998 CONTINUE
SCRN0 = 12
CALL TSTSCR

CALL CCNSL0
UNIT = 0
9999 CONTINUE
CALL DODATE
CALL GOTOXY(0,0)
CALL CLS
*
PRINT *,MAINLN,PROGNM
WRITE (UNIT,*,ERR=8012) MAINLN,PROGNM
CALL GOTOXY(0,1)
IF (ALTCR.AND.DOCR) THEN
WRITE (UNIT,*) '(c) ',CRLINE
ELSE
WRITE (UNIT,*) '(c) 1983-1988 HVRL in LEES @ MIT, portions (c) 1984-88
Kevin G. Rhoads.'
ENDIF
CALL GOTOXY(0,2)
WRITE (UNIT,*) DATTIM
CALL GOTOXY(0,3)
P(1) = 40
P(2) = 3
P(3) = 0
P(4) = 0
CALL SYSFUN(SCRN0,P(1),ERROR)
RETURN
*---------ENTRY GCRCLS
CALL SETPG0
CALL GOTOXY(0,0)
CALL FILWRD($0FFFF)
WRITE (0,'(\A\)',ERR=9997) ' '
9997 CONTINUE
CALL GRCLS
UNIT = 0
GOTO 9999
*
8012 CONTINUE
INQUIRE (UNIT=0,OPENED=ISOPEN)
OK = ISOPEN
INQUIRE (UNIT=12,OPENED=ISOPEN)
ISOPEN = ISOPEN.AND.OK
*
IF (.NOT.ISOPEN) UNIT = 12
*
IF (.NOT.ISOPEN) THEN
*
CALL R3SCRN
*
ENDIF
IF (OK) UNIT = 0
GOTO 9999
END
*---------------------------------------------------------------------SUBROUTINE XYGOTO(X,Y)
IMPLICIT CHARACTER*123 (A-Z)
* (c) COPYRIGHT: Kevin G. Rhoads & High Voltage Research Lab (MIT) - 1983.
CHARACTER PROGNM*18,MAINLN*54,DATTIM*32,CRKEY*12,CRLINE*72
INTEGER*4 SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,X,Y,SCRN1
INTEGER*4 I,ERROR
INTEGER*2 FPCKTA(100),FPKTA(100),PKT(100),P(100)
EQUIVALENCE (FPCKTA(1),FPKTA(1),PKT(1),P(1))
LOGICAL DOCR,ALTCR
COMMON /UNITS/SCRN0,CNSL0,KPD,PR,BUSA,BUSB,BUSC,BUSD,FILE,GR,SCRN1
COMMON /NAMEPR/PROGNM,MAINLN,/TIMDAT/DATTIM,/GNORF9/CRKEY,CRLINE,DOCR
SAVE /NAMEPR/,/TIMDAT/,/UNITS/,ALTCR

EXTERNAL GETTIM,GOTOXY
DATA ALTCR/.FALSE./
*

IF (.NOT.ALTCR) THEN
IF (DOCR) ALTCR = CRKEY .EQ. 'cOPYrIGHT@@@'
ENDIF
CALL DODATE
CALL GOTOXY(0,0)
WRITE (0,'(\A\)',ERR=9998) ' '
9998 CONTINUE
CALL GOTOXY(0,0)
CALL TSTSCR
PRINT *,MAINLN,PROGNM
CALL GOTOXY(0,1)
IF (ALTCR.AND.DOCR) THEN
PRINT *,'(c) ',CRLINE
ELSE
PRINT *,'(c) 1983-1988 HVRL in LEES @ MIT, portions (c) 1984-88 Kevin
G. Rhoads.'
ENDIF
CALL GOTOXY(0,2)
PRINT *,DATTIM
CALL CCNSL0
IF (Y.GT.3) THEN
DO 1 I = 24,Y,-1
CALL CLLINE(I,SCRN0)
1
CONTINUE
ENDIF
IF (Y.LT.3) Y = 3
CALL GOTOXY(X,Y)
P(1) = 40
P(2) = Y
P(3) = X
P(4) = 0
CALL SYSFUN(SCRN0,P(1),ERROR)
RETURN
END

Vous aimerez peut-être aussi