Maze drawing in FORTRAN-80

I was looking through some of my old CP/M files (running on a virtual ALTAIR Z80 using simh) when I can across this old FORTRAN IV program.

Unfortunately I have no idea where it came from or what algorithm it uses but it seems to work quite nicely. It will also compile using the VAX FORTRAN compiler running on VMS (which I also have running on a virtual MicroVAX using simh) with a few minor modifications, mostly to do with the file numbers used in the WRITE statements.

Actually I can’t remember which version is the original, but this one is straight off my CP/M machine and you should be able compile it without any errors using Microsoft FORTRAN-80 (3.44).

Enjoy!!

      PROGRAM MAZE
 
C     This program will display a random maze on the display.
 
      INTEGER W(25,53),V(25,53),H,B,S,R,X,Z,Q,H1,C
      REAL LINE(26)
      DATA EDD, EBB, BBI, BBB /'|--''|  ''  |''   ' /
 
      WRITE(1,98)
 98   FORMAT ('1','Maze Generator')
      WRITE (1,97)
 97   FORMAT('0','Enter a random seed ? ')
      READ (1,101) IX
      WRITE(1,99)
 99   FORMAT(' ','Enter number of rows ? ')
 120  READ(1,101) B
      IF ((B .GE. 5).AND.(B .LT. 54)) GOTO 95
      WRITE (1,102)
      GOTO 120
 95   WRITE(1,100)
 100  FORMAT(' ','Enter number of columns ? ')
 94   READ(1,101) H
 101  FORMAT(I5)
      IF ((H .GE. 5).AND.(H .LT. 26)) GOTO 150
      WRITE(1,102)
 102  FORMAT(' ','Out of range - try again  ? ')
      GOTO 94
 150  WRITE(1,103)
 103  FORMAT(' ')
      DO 10 I=1, 25
         DO 10 J=1, 53
            W(I,J)=0
            V(I,J)=0
 10   CONTINUE
      Q = 0
      Z = 0
      H1 = H + 1
      X = IFIX (RND(IX) * H + 1)
      DO 180 I=1, H
         IF (I .EQ. X) GOTO 173
         LINE(I) = EDD
         GOTO 180
 173     LINE(I) = EBB
 180  CONTINUE
      LINE(H1) = EBB
      WRITE (1,104) (LINE(I), I = 1, H1)
 104  FORMAT('1',2X,26A3)
      C = 1
      W(X, 1) = C
      C = C + 1
      R = X
      S = 1
      GOTO 260
 210  IF (R .NE. H) GOTO 240
      IF (S .NE. B) GOTO  230
      R=1
      S=1
      GOTO 250
 230  R=1
      S=S+1
      GOTO 250
 240  R=R+1
 250  IF (W(R,S) .EQ. 0 ) GOTO 210
 260  IF (R-1 .EQ. 0 ) GOTO  530
      IF (W(R-1,S) .NE. 0GOTO 530
      IF (S-1 .EQ. 0GOTO 390
      IF (W(R,S-1) .NE. 0GOTO 390
      IF (R .EQ. H) GOTO 330
      IF (W(R+1,S) .NE. 0GOTO 330
      X=IFIX(RND(IX)*3+1)
      GOTO (790820860), X
 330  IF (S .NE. B) GOTO 340
      IF (Z .EQ. 1GOTO 370
      Q=1
      GOTO 350
 340  IF (W(R,S+1) .NE. 0GOTO 370
 350  X=IFIX(RND(IX)*3+1)
      IF (X .EQ. 1GOTO 790
      IF (X .EQ. 2GOTO 820
      IF (X .EQ. 3GOTO 910
 370  X=IFIX(RND(IX)*2+1)
      IF (X .EQ. 1GOTO 790
      IF (X .EQ. 2GOTO 820
 390  IF (R .EQ. H) GOTO 470
      IF (W(R+1,S) .NE. 0GOTO 470
      IF (S .NE. B) GOTO 420
      IF (Z .EQ. 1GOTO 450
      Q = 1
      GOTO 430
 420  IF (W(R,S+1) .NE. 0GOTO 450
 430  X = IFIX(RND(IX)*3+1)
      IF (X .EQ. 1GOTO 790
      IF (X .EQ. 2GOTO 860
      IF (X .EQ. 3GOTO 910
 450  X=IFIX(RND(IX)*2+1)
      IF (X .EQ. 1GOTO 790
      IF (X .EQ. 2GOTO 860
 470  IF (S .NE. B) GOTO 490
      IF (Z .EQ. 1GOTO 520
      Q = 1
      GOTO 500
 490  IF (W(R,S+1) .NE. 0GOTO 520
 500  X=IFIX(RND(IX)*2+1)
      IF (X .EQ. 1GOTO 790
      IF (X .EQ. 2GOTO 910
 520  GOTO 790
 530  IF (S-1 .EQ. 0GOTO 670
      IF (W(R,S-1) .NE. 0GOTO 670
      IF (R .EQ. H) GOTO 610
      IF (W(R+1,S) .NE. 0GOTO 610
      IF (S .NE. B) GOTO 560
      IF (Z .EQ. 1GOTO 590
      Q=1
      GOTO 570
 560  IF (W(R,S+1) .NE. 0GOTO 590
 570  X=IFIX(RND(IX)*3+1)
      IF (X .EQ. 1GOTO 820
      IF (X .EQ. 2GOTO 860
      IF (X .EQ. 3GOTO 910
 590  X=IFIX(RND(IX)*2+1)
      IF (X .EQ. 1GOTO 820
      IF (X .EQ. 2GOTO 860
 610  IF (S .NE. B) GOTO 630
      IF (Z .EQ. 1GOTO 660
      Q=1
      GOTO 640
 630  IF (W(R,S+1) .NE. 0GOTO 660
 640  X=IFIX(RND(IX)*2+1)
      IF (X .EQ. 1GOTO 820
      IF (X .EQ. 2GOTO 910
 660  GOTO 820
 670  IF (R .EQ. H) GOTO 740
      IF (W(R+1,S) .NE. 0GOTO 740
      IF (S .NE. B) GOTO 700
      IF (Z .EQ. 1GOTO 730
      Q=1
      GOTO 830
 700  IF (W(R,S+1) .NE. 0GOTO 730
      X=IFIX(RND(IX)*2+1)
      IF (X .EQ. 1GOTO 860
      IF (X .EQ. 2GOTO 910
 730  GOTO 860
 740  IF (S .NE. B) GOTO 760
      IF (Z .EQ. 1GOTO 780
      Q=1
      GOTO 770
 760  IF (W(R,S+1) .NE. 0GOTO 780
 770  GOTO 910
 780  GOTO 1000
 790  W(R-1,S)=C
      C=C+1
      V(R-1,S)=2
      R=R-1
      IF (C .EQ. H*B+1) GOTO 1010
      Q=0
      GOTO 260
 820  W(R,S-1)=C
 830  C=C+1
      V(R,S-1)=1
      S=S-1
      IF (C .EQ. H*B+1) GOTO 1010
      Q=0
      GOTO 260
 860  W(R+1,S)=C
      C=C+1
      IF (V(R,S) .EQ. 0GOTO 880
      V(R,S)=3
      GOTO 890
 880  V(R,S)=2
 890  R=R+1
      IF (C .EQ. H*B+1) GOTO 1010
      GOTO 530
 910  IF (Q .EQ. 1GOTO 960
      W(R,S+1)=C
      C=C+1
      IF (V(R,S) .EQ. 0GOTO 940
      V(R,S)=3
      GOTO 950
 940  V(R,S)=1
 950  S=S+1
      IF (C .EQ. H*B+1) GOTO 1010
      GOTO 260
 960  Z=1
      IF (V(R,S) .EQ. 0GOTO 980
      V(R,S)=3
      Q=0
      GOTO 1000
 980  V(R,S)=1
      Q=0
      R=1
      S=1
      GOTO 250
 1000 GOTO 210
 1010 DO 1073 J=1, B
         LINE(1) = BBI
         DO 1040 I=1, H
            IF (V(I,J) .LT. 2GOTO 1030
            LINE(I+1) = BBB
            GOTO 1040
 1030       LINE(I+1) = BBI
 1040    CONTINUE
         WRITE(1106) (LINE(I), I=1, H1)
 106     FORMAT (1X,26A3)
         DO 1070 I=1, H
            IF (V(I,J) .EQ. 0GOTO 1060
            IF (V(I,J) .EQ. 2GOTO 1060
            LINE(I) = EBB
            GOTO 1070
 1060       LINE(I) = EDD
 1070       CONTINUE
         LINE(H1) = EBB
         WRITE (1,107) (LINE(I), I = 1, H1)
 107     FORMAT (3X, 26A3)
 1073 CONTINUE
 
      END
 
      FUNCTION RND(IY)
 
C     This function returns a psudo random real number between 0 and 1.
 
      IY = IY*899
      IF (IY .LT. 0) IY = IY + 32767 + 1
      RND=FLOAT(IY)/32767.
      RETURN
 
      END

This entry was posted in CP/M, Programming and tagged , , . Bookmark the permalink.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.