textfiles/computers/bradbery.asc

424 lines
13 KiB
Plaintext
Raw Permalink Normal View History

2021-04-15 11:31:59 -07:00
_PORTING FORTAN PROGRAMS FROM MINIS TO PCS_
by John L. Bradberry
[LISTING ONE]
C
C >**************************************************************
PROGRAM GLOBE
C **************************************************************
C PROGRAM TO DRAW A GLOBE AT A USER SPECIFIED ANGLE ON A GRAPHICS
C SURFACE. INPUTS ALSO INCLUDE LOCATION OF GRATING LOBES REFERENCED
C TO LONGITUDE AND LATITUDE.
AUTHOR: SCIENTIFIC CONCEPTS
C --------------------------------------------------------------
IMPLICIT NONE
C
C
INTEGER*2 I !LOOP COUNTER
INTEGER*2 J !LOOP COUNTER
INTEGER*2 PMOVE !PEN CONTROL MOVE COMMAND
INTEGER*2 PDRAW !PEN CONTROL DRAW COMMAND
INTEGER*2 PENC !PEN CONTROL: 2=DRAW,3=MOVE
INTEGER*2 TLU !TERMINAL LOGICAL UNIT NUMBER
INTEGER*2 ROW !TEXT ROW POSITION
INTEGER*2 COLUMN !TEXT COLUMN POSITION
INTEGER*2 NUMLOBES !NUMBER OF GRATING LOBES REQUESTED
C
REAL*8 GRLOBEX(10) !X LOCATION FOR GRATING LOBE
REAL*8 GRLOBEY(10) !Y LOCATION FOR GRATING LOBE
REAL*8 XPOS !HORIZONTAL PIXEL POSITION
REAL*8 YPOS !VERTICAL PIXEL POSITION
REAL*8 HORIZONTAL !CALCULATED HORIZONTAL PIXEL POSITION
REAL*8 VERTICAL !CALCULATED VERTICAL PIXEL POSITION
REAL*8 RADIUS !RADIUS OF GLOBE CIRCLE
REAL*8 TILT !TILT ANGLE FOR GLOBE
REAL*8 PI !PI CONSTANT
REAL*8 COSCONVER !COS CONVERSION OF TILT IN RADIANS
REAL*8 SINCONVER !SIN CONVERSION OF TILT IN RADIANS
REAL*8 ELEVATION !CALCULATED LONGITUDE POSITION
REAL*8 AZIMUTH !CALCULATED LATITUDE POSITION
REAL*8 GLOBEINC !GRATING LOBE INCREMENT (RADIANS)
C
CHARACTER STEMP*8 !TEMPORARY STRING
C
C
PARAMETER (PMOVE=3,PDRAW=2)
C
TLU=6
NUMLOBES=0
PI=3.14159265
C
C
C HORIZONTAL,VERTICAL ARE COORDINATES OF ORIGIN
C
WRITE(TLU,*)'ENTER ORIGIN COORDINATES (TRY 300,200 FOR EGA/VGA)'
READ(TLU,*)HORIZONTAL,VERTICAL
C
WRITE(TLU,*)'ENTER RADIUS OF CIRCLE (TRY 160 FOR EGA/VGA)'
READ(TLU,*)RADIUS
C
WRITE(TLU,*)'ENTER TILT ANGLE IN DEGREES (TRY 30)'
READ(TLU,*)TILT
C
WRITE(TLU,*)'HOW MANY GRATING LOBES (MAXIMUM=10) ? '
READ(TLU,*)NUMLOBES
C
IF (NUMLOBES.GT.10) THEN
WRITE(TLU,*)' ERROR: TOO MANY GRATING LOBES REQUESTED!'
STOP
ELSE IF (NUMLOBES.GT.0) THEN
DO I=1,NUMLOBES
WRITE(TLU,*)'ENTER (X,Y) COORDINATES FOR POINT ',I
READ(TLU,*)GRLOBEX(I),GRLOBEY(I)
END DO
ENDIF
C
C INITIALIZE IBM PC TO MAXIMUM RESOLUTION ...
C
CALL GINIT(TLU)
C
C DRAW '+' AT ORIGIN
C
XPOS=HORIZONTAL-4.5
CALL PLOT(XPOS,VERTICAL,PMOVE)
XPOS=HORIZONTAL+4.5
CALL PLOT(XPOS,VERTICAL,PDRAW)
YPOS=VERTICAL-3.6
CALL PLOT(HORIZONTAL,YPOS,PMOVE)
YPOS=VERTICAL+3.9
CALL PLOT(HORIZONTAL,YPOS,PDRAW)
C
C LABEL FIGURE WITH PARAMETERS
C
ROW=24
COLUMN=26
WRITE(STEMP,'(F6.2)')TILT
CALL TEXTLABEL(ROW,COLUMN,'TILT ANGLE (DEGREES)='//STEMP)
C
C DRAW OUTER CIRCLE
C
CALL PLOT(HORIZONTAL+RADIUS,VERTICAL,PMOVE)
DO I=1,100
XPOS=HORIZONTAL+RADIUS*COS(I*2*PI/100)
YPOS=VERTICAL+RADIUS*SIN(I*2*PI/100)
CALL PLOT(XPOS,YPOS,PDRAW)
END DO
C
C DRAW LATITUDES
C
TILT=TILT*PI/180.0
COSCONVER=COS(TILT)
SINCONVER=SIN(TILT)
C
DO I=1,12
ELEVATION=PI/2-PI/12*I
XPOS=HORIZONTAL
YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
+ -COS(ELEVATION)*SINCONVER)
CALL PLOT(XPOS,YPOS,PMOVE)
PENC=2
DO J=1,100
AZIMUTH=J*2*PI/100.0
IF (SIN(ELEVATION)*SINCONVER+COS(ELEVATION)*
+ COS(AZIMUTH)*COSCONVER.GE.0.) THEN
XPOS=HORIZONTAL+RADIUS*COS(ELEVATION)*SIN(AZIMUTH)
YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
+ -COS(ELEVATION)*COS(AZIMUTH)*SINCONVER)
CALL PLOT(XPOS,YPOS,PENC)
PENC=2
ELSE
PENC=3
END IF
END DO
END DO
C
C DRAW LONGITUDES
C
DO I=1,12
AZIMUTH=I*PI/12
YPOS=VERTICAL+RADIUS*COSCONVER
CALL PLOT(HORIZONTAL,YPOS,PMOVE)
PENC=2
DO J=1,100
ELEVATION=PI/2-J*2*PI/100
IF (SIN(ELEVATION)*SINCONVER+COS(ELEVATION)*
+ COS(AZIMUTH)*COSCONVER.GE.0.) THEN
XPOS=HORIZONTAL+RADIUS*COS(ELEVATION)*SIN(AZIMUTH)
YPOS=VERTICAL+RADIUS*(SIN(ELEVATION)*COSCONVER
+ -COS(ELEVATION)*COS(AZIMUTH)*SINCONVER)
CALL PLOT(XPOS,YPOS,PENC)
PENC=2
ELSE
PENC=3
END IF
END DO
END DO
C
C
C DRAW GRATING LOBES
C
IF (NUMLOBES.GT.0) THEN
DO I=1,NUMLOBES
XPOS=HORIZONTAL+GRLOBEX(I)+RADIUS
YPOS=VERTICAL+GRLOBEY(I)
CALL PLOT(XPOS,YPOS,PMOVE)
C
DO J=1,100
GLOBEINC=J*PI/50
XPOS=HORIZONTAL+GRLOBEX(I)+RADIUS*COS(GLOBEINC+.04)
YPOS=VERTICAL+GRLOBEY(I)+RADIUS*SIN(GLOBEINC+.04)
IF((GRLOBEX(I)+RADIUS*COS(GLOBEINC))**2+
+ (GRLOBEY(I)+RADIUS*SIN(GLOBEINC))**2.LT.RADIUS**2) THEN
CALL PLOT(XPOS,YPOS,PDRAW)
ELSE
CALL PLOT(XPOS,YPOS,PMOVE)
END IF
END DO
END DO
END IF
C
C
C PREPARE TO EXIT GRAPHICS AND RETURN TO NORMAL VIDEO ...
C
CALL EXITGRAPHICS(TLU)
C
END
C
C
INCLUDE 'FGRAPH.FI'
C
C
C >**************************************************************
SUBROUTINE TEXTLABEL(ROW,COLUMN,STRING)
C **************************************************************
C SUBROUTINE TO WAIT FOR USER SIGNAL AND EXIT GRAPHICS MODE. TERMINAL
C IS RESTORED TO PRE-VIDEO CONDITIONS...
C --------------------------------------------------------------
IMPLICIT NONE
C
INCLUDE 'FGRAPH.FD'
C
INTEGER*2 ROW !TEXT ROW POSITION
INTEGER*2 COLUMN !TEXT COLUMN POSITION
C
CHARACTER STRING*(*) !TEXT STRING FOR LABEL
C
RECORD /RCCOORD/ CURPOS
C
C
C OUTPUT USER SUPLIED STRING AT ROW,COLUMN ...
C
CALL SETTEXTPOSITION(ROW,COLUMN,CURPOS)
CALL OUTTEXT(STRING)
C
RETURN
END
C
C
C >**************************************************************
SUBROUTINE EXITGRAPHICS(TLU)
C **************************************************************
C SUBROUTINE TO WAIT FOR USER SIGNAL AND EXIT GRAPHICS MODE. TERMINAL
C IS RESTORED TO PRE-VIDEO CONDITIONS...
C --------------------------------------------------------------
IMPLICIT NONE
C
INCLUDE 'FGRAPH.FD'
C
INTEGER*2 TLU !TERMINAL LOGICAL UNIT NUMBER
INTEGER*2 DUMMY !DUMMY FUNCTION ARGUMENT
INTEGER*2 ROW !TEXT ROW POSITION
INTEGER*2 COLUMN !TEXT COLUMN POSITION
C
ROW=25
COLUMN=28
C
C
C OUTPUT PROMPT AND WAIT FOR ENTER KEY ...
C
CALL TEXTLABEL(ROW,COLUMN,'PRESS ENTER TO CONTINUE')
READ(TLU,*)
C
C RESET VIDEO MODE AND STOP
C
DUMMY=SETVIDEOMODE($DEFAULTMODE)
C
RETURN
END
C
C
C >**************************************************************
SUBROUTINE GINIT(TLU)
C **************************************************************
C SUBROUTINE TO INITIALIZE IBM PC GRAPHICS MODE TO MAXIMUM
C AVAILABLE RESOLUTION ...
C --------------------------------------------------------------
IMPLICIT NONE
C
INCLUDE 'FGRAPH.FD'
C
INTEGER*2 ERRC !ERROR CODE RETURNED
INTEGER*2 TLU !TERMINAL LOGICAL UNIT NUMBER
INTEGER*2 DUMMY !DUMMY FUNCTION ARGUMENT
C
LOGICAL*2 WINDINVERT !INVERT WINDOW COORDINATES IF TRUE
C
REAL*8 LOWERX !LOWER X AXIS CORNER OF WINDOW
REAL*8 LOWERY !LOWER Y AXIS CORNER OF WINDOW
REAL*8 UPPERX !UPPER X AXIS CORNER OF WINDOW
REAL*8 UPPERY !UPPER Y AXIS CORNER OF WINDOW
C
C
C
C INITIALIZE VIDEO MODE TO MAXIMUM RESOLUTION AVAILABLE
C
ERRC=SETVIDEOMODE($MAXRESMODE)
IF (ERRC.EQ.0) THEN
WRITE(TLU,*)' ERROR: CANNOT SET VIDEO MODE'
STOP
END IF
C
LOWERX=-3.0
LOWERY=3.0
UPPERX=-3.0
UPPERY=3.0
WINDINVERT=.TRUE.
DUMMY=SETWINDOW(WINDINVERT,LOWERX,LOWERY,UPPERX,UPPERY)
C
RETURN
END
C
C
C >**************************************************************
SUBROUTINE PLOT(XPOS,YPOS,PENC)
C **************************************************************
C SUBROUTINE TO DRAW OR MOVE TO THE USER SPECIFIED POSITION 'XPOS,
C YPOS' WITH PEN CONTROL AS DESIGNATED BY 'PENC'.
C --------------------------------------------------------------
IMPLICIT NONE
C
INCLUDE 'FGRAPH.FD'
C
INTEGER*2 DUMMY !DUMMY FUNCTION ARGUMENT
INTEGER*2 PENC !PEN CONTROL: 2=DRAW,3=MOVE
C
REAL*8 XPOS !HORIZONTAL PIXEL POSITION
REAL*8 YPOS !VERTICAL PIXEL POSITION
C
RECORD /WXYCOORD/ XY
C
IF (PENC.EQ.2) THEN
DUMMY=LINETO_W(XPOS,YPOS)
ELSE
CALL MOVETO_W(XPOS,YPOS,XY)
END IF
C
RETURN
END
[LISTING TWO]
Top Level Fragment
C >**********************************************************
PROGRAM GLOBE
C **********************************************************
C
C PROGRAM TO DRAW A GLOBE AT A USER SPECIFIED ANGLE ON A GRAPHICS
C SURFACE. INPUTS ALSO INCLUDE LOCATION OF GRATING LOBES REFERENCED
C TO LONGITUDE AND LATITUDE.
C AUTHOR: SCIENTIFIC CONCEPTS
C
--------------------------------------------------------------
.
.
.
CALL GINIT !INITIALIZE GRAPHICS DEVICE
.
.
.
END
Layer 3: Graphics Primitives
C*******************************************************C
SUBROUTINE GINIT
C*******************************************************C
C PURPOSE: INITIALIZE GRAPHICS DEVICE CURRENTLY
C SET BY GLOBAL VARIABLE 'DEVICETYPE' ...
.
.
.
IF (DEVICETYPE.EQ.HPGL) THEN !HP GRAPHICS DEVICE
CALL HPGLINIT
ELSE IF (DEVICETYPE.EQ.IBMPC) THEN !IBM MODES CGA-VGA
CALL IBMPCINIT
ELSE IF (DEVICETYPE.EQ.TEK) THEN !TEKTRONIX DEVICES
CALL TEKINIT
ELSE IF (DEVICETYPE.EQ.DECVT) THEN !DEC VT340
CALL DECVTINIT
ELSE IF (DEVICETYPE.EQ.VAXSTA) THEN !DEC VAXSTATION 2000
CALL VAXSTAINIT
.
.
. ELSE
CALL INITERROR
END IF
Layer 2: Graphics Device Drivers
C*******************************************************C
SUBROUTINE IBMPCINIT
C*******************************************************C
C PURPOSE: INITIALIZE CURRENT IBM PC GRAPHICS MODE
C COLORS, RESOLUTION ETC ...
.
.
.
C
IF (IBMMODE.EQ.EGACOLOR) THEN
DUMMY=SETVIDEOMODE($ERESCOLOR)
ELSE IF (IBMMODE.EQ.HERCULES) THEN
DUMMY=SETVIDEOMODE($HERCMONO)
.
.
.
END IF
C
RETURN
END
C
C*******************************************************C
SUBROUTINE VAXSTAINIT
C*******************************************************C
C PURPOSE: INITIALIZE VAXSTATION 200 GRAPHICS DEVICE
C MODE, VIEWPORT ...
.
.
.
C
LOWLX=1.0 !LOWER LEFT X COORDINATE
LOWLY=1.0 !LOWER LEFT Y COORDINATE
UPPRX=20.0 !UPPER RIGHT X COORDINATE
UPPRY=20.0 !UPPER RIGHT Y COORDINATE
DISPWIDTH=20.0
DISPHEIGHT=20.0
C
VD_ID=UIS$CREATE_DISPLAY(LOWLX,LOWLY,UPPRX,UPPRY,
+ DISPWIDTH,DISPHEIGHT)
WD_ID=UIS$CREATE_WINDOW(VD_ID,'SYS$WORKSTATION')
C
.
.
.
RETURN
END
C
C