10 rem Portability enhancement by David Meyer (2012/2/4)
  20 def FNA(P,Q)=-1*P*Q
  30 def FNO(P,Q)=SGN(P+Q)
  40 def FNN(P)=-1*P-1
  50 def FNI(P,A,B)=ABS(P)*A+ABS(FNN(P))*B
  60 def FNI$(P,A$,B$)=LEFT$(A$,ABS(P)*LEN(A$))+LEFT$(B$,ABS(FNN(P))*LEN(B$))
  70 def FNY(A$,Q)=FNI(LEN(A$)=0,Q,FNO(LEFT$(A$,1)="Y",LEFT$(A$,1)="y"))
  80 print tab(28);"AMAZING PROGRAM"
  90 print tab(15);"CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY"
 100 print
 110 print
 120 print
 130 print
 140 input "WHAT ARE YOUR WIDTH AND LENGTH";H,L
 150 if FNA(H<>1,L<>1) then goto 180
 160 print "MEANINGLESS DIMENSIONS.  TRY AGAIN."
 170 goto 140
 180 dim W(H,L),V(H,L)
 190 print
 200 print
 210 print
 220 print
 230 Q=0
 240 Z=0
 250 X=INT(RND*H+1)
 260 for I=1 to H
 270   if I=X then goto 300
 280   print ".--";
 290   goto 310
 300   print ".  ";
 310 next I
 320 print "."
 330 C=1
 340 W(X,1)=C
 350 C=C+1
 360 R=X : S=1
 370 goto 480
 380 if R<>H then goto 460
 390 if S<>L then goto 430
 400 R=1
 410 S=1
 420 goto 470
 430 R=1
 440 S=S+1
 450 goto 470
 460 R=R+1
 470 if W(R,S)=0 then goto 380
 480 if R-1=0 then goto 830
 490 if W(R-1,S)<>0 then goto 830
 500 if S-1=0 then goto 650
 510 if W(R,S-1)<>0 then goto 650
 520 if R=H then goto 560
 530 if W(R+1,S)<>0 then goto 560
 540 X=INT(RND(1)*3+1)
 550 on X goto 1210,1280,1350
 560 if S<>L then goto 600
 570 if Z=1 then goto 630
 580 Q=1
 590 goto 610
 600 if W(R,S+1)<>0 then goto 630
 610 X=INT(RND*3+1)
 620 on X goto 1210,1280,1440
 630 X=INT(RND*2+1)
 640 on X goto 1210,1280
 650 if R=H then goto 750
 660 if W(R+1,S)<>0 then goto 750
 670 if S<>L then goto 700
 680 if Z=1 then goto 730
 690 Q=1 : goto 710
 700 if W(R,S+1)<>0 then goto 730
 710 X=INT(RND*3+1)
 720 on X goto 1210,1350,1440
 730 X=INT(RND*2+1)
 740 on X goto 1210,1350
 750 if S<>L then goto 790
 760 if Z=1 then goto 820
 770 Q=1
 780 goto 800
 790 if W(R,S+1)<>0 then goto 820
 800 X=INT(RND*2+1)
 810 on X goto 1210,1440
 820 goto 1210
 830 if S-1=0 then goto 1040
 840 if W(R,S-1)<>0 then goto 1040
 850 if R=H then goto 960
 860 if W(R+1,S)<>0 then goto 960
 870 if S<>L then goto 910
 880 if Z=1 then goto 940
 890 Q=1
 900 goto 920
 910 if W(R,S+1)<>0 then goto 940
 920 X=INT(RND*3+1)
 930 on X goto 1280,1350,1440
 940 X=INT(RND*2+1)
 950 on X goto 1280,1350
 960 if S<>L then goto 1000
 970 if Z=1 then goto 1030
 980 Q=1
 990 goto 1010
1000 if W(R,S+1)<>0 then goto 1030
1010 X=INT(RND*2+1)
1020 on X goto 1280,1440
1030 goto 1280
1040 if R=H then goto 1140
1050 if W(R+1,S)<>0 then goto 1140
1060 if S<>L then goto 1100
1070 if Z=1 then goto 1130
1080 Q=1
1090 goto 1290
1100 if W(R,S+1)<>0 then goto 1130
1110 X=INT(RND*2+1)
1120 on X goto 1350,1440
1130 goto 1350
1140 if S<>L then goto 1180
1150 if Z=1 then goto 1200
1160 Q=1
1170 goto 1190
1180 if W(R,S+1)<>0 then goto 1200
1190 goto 1440
1200 goto 1610
1210 W(R-1,S)=C
1220 C=C+1
1230 V(R-1,S)=2
1240 R=R-1
1250 if C=H*L+1 then goto 1620
1260 Q=0
1270 goto 480
1280 W(R,S-1)=C
1290 C=C+1
1300 V(R,S-1)=1
1310 S=S-1
1320 if C=H*L+1 then goto 1620
1330 Q=0
1340 goto 480
1350 W(R+1,S)=C
1360 C=C+1
1370 if V(R,S)=0 then goto 1400
1380 V(R,S)=3
1390 goto 1410
1400 V(R,S)=2
1410 R=R+1
1420 if C=H*L+1 then goto 1620
1430 goto 830
1440 if Q=1 then goto 1510
1450 W(R,S+1)=C : C=C+1 : if V(R,S)=0 then goto 1480
1460 V(R,S)=3
1470 goto 1490
1480 V(R,S)=1
1490 S=S+1 : if C=H*L+1 then goto 1620
1500 goto 480
1510 Z=1
1520 if V(R,S)=0 then goto 1560
1530 V(R,S)=3
1540 Q=0
1550 goto 1610
1560 V(R,S)=1
1570 Q=0
1580 R=1
1590 S=1
1600 goto 470
1610 goto 380
1620 for J=1 to L
1630   print "I";
1640   for I=1 to H
1650     if V(I,J)<2 then goto 1680
1660     print "   ";
1670     goto 1690
1680     print "  I";
1690   next I
1700   print
1710   for I=1 to H
1720     if V(I,J)=0 then goto 1760
1730     if V(I,J)=2 then goto 1760
1740     print ":  ";
1750     goto 1770
1760     print ":--";
1770   next I
1780   print "."
1790 next J
1800 end