textfiles/computers/bradbery.asc

424 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

_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