home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 6 / 06.iso / b / b077 / 1.img / SBGL.ZIP / PERT.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  33.3 KB  |  1,109 lines

  1. 1000  '**********************************************************************
  2. 1002  '*                  THENLOAD STEPEQV SPC(PRESET OPTIONRESUME STRING$<UNK! {00FA}> THEN<UNK! {00F8}> BSAVE= WRITESTRING$ TAB(<UNK! {00F6}> STEP<0xB5!> THENCALL                  *
  3. 1005  '*                         TAB(SOUNDLOAD<UNK! {FEC3}><UNK! {00FB}>CALLPSET: PERT.BAS                         *
  4. 1006  '*                         WHILE<0xE0!>CALLTOSCREEN<0xCB!>ERLWHILE: STRING$POINT  BLOAD<UNK! {00F7}>                           *
  5. 1007  '*                         WHILE<0xE0!>CALLTOSCREENERRPSETVARPTR: 1987.12                          *
  6. 1008  '*                   STRING$USR RANDOMIZE<UNK! {00FA}> KEY< WHILEOPTION RANDOMIZEPOINT CLS^ BEEP<0xE0!> FN<0xB5!> STRING$USR USRSOUND                    *
  7. 1010  '**********************************************************************
  8. 1015  '*              Graphic Aided Network Analysing System                *
  9. 1018  '*                        Filename: PERT.BAS                          *
  10. 1020  '*                 Programmed by Chou Ming, 1987.12.                  *
  11. 1022  '*      China Research and Education Center Of Plant Engineering      *
  12. 1025  '**********************************************************************
  13. 1030  KEY OFF : SCREEN 1,0 : COLOR 9,0
  14. 1032  OPTION BASE 1
  15. 1034  'GOSUB 1100     ' the head of the program
  16. 1035  CLS
  17. 1036  PRINT : PRINT "**********  THEN<UNK! {00F8}>  BSAVE=  RANDOMIZE>  CLOSEDEFSNG  ***********"
  18. 1037  PRINT "A. THEN<UNK! {00F8}>BSAVE=LOCATE<UNK! {FDBE}>OFF<0xB5!>SOUNDLOAD<UNK! {00FC}>BEEPTOLOCATE<0xE4!>SCREEN*   G. <0xB4!>IMPNOTELSERANDOMIZEINSTRLOAD<UNK! {00FC}>BSAVEWRITESAVE<0xB6!>"
  19. 1038  PRINT "B. THEN<UNK! {00F8}>BSAVE=LOCATE<UNK! {FDBE}>OFF<0xB5!>SOUNDTAB(SOUNDLOAD<UNK! {FECA}><0xE4!>SCREEN*   H. THEN<UNK! {00F8}>BSAVE=WRITESTRING$TAB(<UNK! {00F6}>"
  20. 1039  PRINT "C. THEN<UNK! {00F8}>BSAVE=LOCATE<UNK! {FDBE}>OFF<0xB5!>SOUNDUSRINKEY$OPTIONSOUND       I. CLOSE>STRING$PSETTHEN<UNK! {00F8}>BSAVE=THENLOAD"
  21. 1040  PRINT "D. <0xB4!>><0xB4!>TRONTHEN<UNK! {00F8}>BSAVE=LOCATE<UNK! {FDBE}>OFF         J. LOCATE<0xE4!>CALL<UNK! {00F6}>THEN<UNK! {00F8}>BSAVE=THENLOAD"
  22. 1041  PRINT "E. <0xB4!>IMPNOTELSECLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDMERGEVARPTR<0xB5!><0xE3!>WHILE<0xE0!>OPENBEEP   K. <0xB5!><UNK! {00F7}>NOTBLOADCLOSE>THENLOADCLOSE<UNK! {00FA}>"
  23. 1042  PRINT "F. <0xB4!>IMPNOTELSELOCATE<0xE4!>CALL<UNK! {00F6}>WHILERESUMEOPTION>         L. THEN<0xCB!>CALL<UNK! {00F6}>STEP<0xB5!>THENCALL"
  24. 1043  PRINT "***************************************"
  25. 1044  PRINT "PRESET*LOCATE<0xE4!>SCREEN*SOUND<UNK! {00FA}><0xCB!><UNK! {00F9}>FNELSENOTBLOADRANDOMIZEEDITSOUNDPOINT<0xB5!>SOUND<0xB4!><UNK! {00FA}>OPENBEEP: ";
  26. 1045  'DEF SEG=0 : POKE 1050,PEEK(1052)
  27. 1046  AN$=INKEY$
  28. 1047  IF AN$="" THEN GOTO 1046
  29. 1048  IF AN$<>CHR$(13) THEN PRINT AN$;
  30. 1049  IF AN$>="A" AND AN$<="L" OR AN$>="a" AND AN$<="l" THEN GOTO 1055
  31. 1050  BEEP : LOCATE 10,1,0
  32. 1051  PRINT "LOCATE<0xE4!>SCREEN*<0xB4!>^TAB(MOD. PRESET*STRING$INSTRUSRBSAVELOCATE<0xE4!>SCREEN*SOUND<UNK! {00FA}><0xCB!><UNK! {00F9}>FNELSENOTBLOAD<0xB5!>SOUNDRANDOMIZEEDITSOUNDPOINT:    "; : LOCATE 10,37,0
  33. 1052  GOTO 1045
  34. 1055  IF AN$>="a" THEN CODE=ASC(AN$)-96 ELSE CODE=ASC(AN$)-64
  35. 1056  IF CODE=12 THEN GOTO 1060
  36. 1057  ON CODE GOSUB 1200,1500,1600,1800,4200,4400,4500,4800,5800,7000,8000
  37. 1058  GOTO 1035
  38. 1060  CLS
  39. 1065  END
  40. 1068  '
  41. 1070  '
  42. 1100  '*********************************************************************
  43. 1105  '*   Function: This subroutine is to display some information        *
  44. 1110  '*             on the screen, and from that the user knows           *
  45. 1115  '*             that the program is being started now.                *
  46. 1120  '*********************************************************************
  47. 1140  CLS : LOCATE 4,4,0
  48. 1145  PRINT "THENLOAD STEPEQV SPC(PRESET OPTIONRESUME STRING$<UNK! {00FA}> THEN<UNK! {00F8}> BSAVE= WRITESTRING$ TAB(<UNK! {00F6}> STEP<0xB5!> THENCALL"
  49. 1150  LOCATE 5,14,0
  50. 1155  PRINT "Version  1.0"
  51. 1156  LOCATE 6,16,0
  52. 1158  PRINT "1987.12"
  53. 1160  LOCATE 9,10,0
  54. 1165  PRINT "STRING$USRRANDOMIZE<UNK! {00FA}>KEY<WHILEOPTIONRANDOMIZEPOINTCLS^BEEP<0xE0!>FN<0xB5!>STRING$USRUSRSOUND"
  55. 1166  LOCATE 25,1,0
  56. 1168  DEF SEG=0 : POKE 1050,PEEK(1052)
  57. 1170  AN$=INKEY$
  58. 1180  IF AN$="" THEN GOTO 1170
  59. 1190  RETURN
  60. 1195  '
  61. 1198  '
  62. 1200  '*********************************************************************
  63. 1205  '*   Function: This subroutine is to input source data of network    *
  64. 1210  '*             with keyboard,as resulting of this, codes of acti-    *
  65. 1215  '*             vities and events, and the adjacency matrix of this   *
  66. 1218  '*             network being obtained.                               *
  67. 1220  '*********************************************************************
  68. 1225  IF M<>0 THEN ERASE AC$,AN,D,EP,AD,AA,HM$,SM$
  69. 1226  IF DM<>0 THEN ERASE DU
  70. 1228  IF PN<>0 THEN ERASE PA$
  71. 1230  CLS : LOCATE 5,1,0
  72. 1235  INPUT "PRESET*LOCATE<0xE4!>SCREEN*STEPANDSOUNDCOLORBLOAD<UNK! {00FB}>CALLPSET: ",XM$ : PRINT
  73. 1240  INPUT "PRESET*LOCATE<0xE4!>SCREEN*CLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDUSINGPOINTLOCATE<UNK! {FDC4}>COLOR: ",M
  74. 1245  IF M=0 THEN BEEP : GOTO 1240
  75. 1255  DIM AC$(M),AN(M),D(M),HM$(M),SM$(M)
  76. 1256  OPEN "AC.PRE" FOR OUTPUT AS #1
  77. 1258  PN=0
  78. 1260  FOR I=1 TO M
  79. 1270    CLS : LOCATE 3,1,0
  80. 1272    PRINT "PRESET*LOCATE<0xE4!>SCREEN*<0xB5!>VARPTR";I;"OPTION<UNK! {00F6}>CLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDBLOAD<UNK! {00FB}>CALLPSET:";
  81. 1274    INPUT " ",HM$(I)
  82. 1275    INPUT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDLOCATEDELETERANDOMIZESWAP<0xB5!>ERASETAB(CLOSEBLOAD<UNK! {00FB}>CALLPSET:",SM$(I)
  83. 1280    PRINT : PRINT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUND<0xB4!><UNK! {00FA}>OPENBEEP:";
  84. 1290    INPUT " ",AC$(I)
  85. 1291    IF AC$(I)="" THEN BEEP : GOTO 1280
  86. 1292    PRINT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDMOTORCOLORSTRING$<0xB5!>:";
  87. 1294    INPUT " ",D(I)
  88. 1295    IF M=1 THEN GOTO 1380
  89. 1298    IF I=1 THEN AN(1)=0 : GOTO 1370
  90. 1300    PRINT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDMERGE\PRESETLINECLOSEAND<0xB6!>DEFDBLLOCATE<UNK! {FDC4}>COLOR:";
  91. 1310    INPUT " ",AN(I)
  92. 1315    PRINT
  93. 1320    FOR J=1 TO AN(I)
  94. 1330      PRINT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUND<0xB5!>VARPTR";J;"OPTION<UNK! {00F6}>MERGE\PRESETLINECLOSEAND<0xB6!>DEFDBL<0xB5!>SOUND<0xB4!><UNK! {00FA}>OPENBEEP:";
  95. 1340      INPUT " ",F$
  96. 1342      IF F$="" THEN BEEP : GOTO 1330
  97. 1345      WRITE #1,F$
  98. 1350      PN=PN+1
  99. 1360    NEXT J
  100. 1370  NEXT I
  101. 1372  CLOSE #1
  102. 1375  IF PN=0 THEN GOTO 1395
  103. 1380  DIM PA$(PN)
  104. 1382  OPEN "AC.PRE" FOR INPUT AS #1
  105. 1385  FOR I=1 TO PN
  106. 1386    INPUT #1,PA$(I)
  107. 1388  NEXT I
  108. 1390  CLOSE #1
  109. 1395  KILL "AC.PRE"
  110. 1396  '
  111. 1398  '
  112. 1400  CLS : LOCATE 1,7,0
  113. 1405  PRINT "***  LOCATE<0xE4!> SCREEN* LOCATE<UNK! {FD20}>SAVEOFF LOAD/ WEND+  ***"
  114. 1410  PRINT
  115. 1415  R=2 : N=1
  116. 1420  FOR I=1 TO M
  117. 1425    R=R+1
  118. 1430    IF R<=10 THEN GOTO 1445
  119. 1435    IF INKEY$=CHR$(13) THEN CLS : R=2 : GOTO 1445
  120. 1440    GOTO 1435
  121. 1445    LOCATE R,4,0
  122. 1450    PRINT "CLOSEAND<0xB6!>DEFDBL<0xB4!><UNK! {00FA}>OPENBEEP: "+AC$(I)+"   MERGE\PRESETLINECLOSEAND<0xB6!>DEFDBL: ";
  123. 1455    FOR J=N TO AN(I)+N-1
  124. 1460      IF J=N THEN PRINT PA$(J); ELSE PRINT ", "+PA$(J);
  125. 1465    NEXT J
  126. 1470    N=N+AN(I)
  127. 1475  NEXT I
  128. 1476  '
  129. 1478  '
  130. 1480  GOSUB 2500
  131. 1490  RETURN
  132. 1495  '
  133. 1496  '
  134. 1500  '*********************************************************************
  135. 1501  '*   Function: This subroutine is to input source data of network    *
  136. 1502  '*             with data file, as resulting of this, codes of acti-  *
  137. 1503  '*             vities and events, and the adjacency matrix of this   *
  138. 1504  '*             network being obtained.                               *
  139. 1505  '*********************************************************************
  140. 1506  IF M<>0 THEN ERASE AC$,AN,D,EP,AD,AA,HM$,SM$
  141. 1507  IF DM<>0 THEN ERASE DU
  142. 1508  IF PN<>0 THEN ERASE PA$
  143. 1510  CLS : LOCATE 6,1,0
  144. 1511  INPUT "PRESET*LOCATE<0xE4!>SCREEN*LOCATE<UNK! {FDBE}>OFFTAB(SOUNDLOAD<UNK! {FEC3}><UNK! {00FB}>CALLPSET: ",FF$
  145. 1512  IF FF$="" THEN BEEP : GOTO 1511
  146. 1515  FF$=FF$+".NET"
  147. 1516  OPEN FF$ FOR INPUT AS #1
  148. 1517  INPUT #1,XM$,M,PN
  149. 1518  DIM AC$(M),AN(M),D(M),HM$(M),SM$(M)
  150. 1519  IF PN<>0 THEN DIM PA$(PN)
  151. 1520  K=0
  152. 1521  FOR I=1 TO M
  153. 1522    INPUT #1,HM$(I),SM$(I)
  154. 1523    INPUT #1,AC$(I),D(I),AN(I)
  155. 1524    FOR J=1 TO AN(I)
  156. 1525      K=K+1 : INPUT #1,PA$(K)
  157. 1526    NEXT J
  158. 1527  NEXT I
  159. 1528  CLOSE #1
  160. 1530  GOSUB 2500
  161. 1535  RETURN
  162. 1536  '
  163. 1538  '
  164. 1600  '*********************************************************************
  165. 1602  '*     Function: This subroutine is to modify the network data.      *
  166. 1605  '*********************************************************************
  167. 1610  CLS : LOCATE 5,1,0
  168. 1615  INPUT "PRESET*LOCATE<0xE4!>SCREEN*USR<SPC(AUTOUSRINKEY$OPTIONSOUND<0xB5!>SOUNDCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUND<0xB4!><UNK! {00FA}>OPENBEEP: ",FF$
  169. 1618  IF FF$="" THEN BEEP : GOTO 1615
  170. 1620  FOR I=1 TO M
  171. 1622    IF AC$(I)=FF$ THEN K=I : GOTO 1625
  172. 1624  NEXT I
  173. 1625  PRINT
  174. 1628  PRINT "CLOSEAND<0xB6!>DEFDBL "+AC$(K)+" <0xB5!>SOUNDSAVEKEYMOTORCOLORSTRING$<0xB5!>TAB(AUTO:";D(K)
  175. 1629  PRINT "PRESET*LOCATE<0xE4!>SCREEN* "+AC$(K)+" <0xB5!>SOUNDUSRBSAVEMOTORCOLORSTRING$<0xB5!>:";
  176. 1630  INPUT " ",D(K)
  177. 1631  AA(EP(K,1),EP(K,2))=D(K)
  178. 1632  PRINT
  179. 1635  PRINT "CLOSERANDOMIZENOTUSRUSR<SPC(AUTOUSRINKEY$OPTIONSOUND<0xB5!>SOUNDCLOSEAND<0xB6!>DEFDBLBSAVEXOR ?(Y/N): ";
  180. 1638  DEF SEG=0 : POKE 1050,PEEK(1052)
  181. 1640  AN$=INPUT$(1)
  182. 1642  IF AN$="Y" OR AN$="y" THEN PRINT "Yes"; : GOTO 1610
  183. 1645  RETURN
  184. 1650  '
  185. 1660  '
  186. 1800  '*********************************************************************
  187. 1801  '*   Function: This subroutine is to store the network data so that  *
  188. 1802  '*             it can be called simply.                              *
  189. 1805  '*********************************************************************
  190. 1810  CLS : LOCATE 6,1,0
  191. 1815  INPUT "PRESET*LOCATE<0xE4!>SCREEN*LOCATE<UNK! {FDBE}>OFFTAB(SOUNDLOAD<UNK! {FEC3}><UNK! {00FB}>CALLPSET: ",FF$
  192. 1816  IF FF$="" THEN BEEP : GOTO 1815
  193. 1818  FF$=FF$+".NET"
  194. 1820  OPEN FF$ FOR OUTPUT AS #1
  195. 1828  PRINT #1,XM$+",";M;",";PN
  196. 1829  N=1
  197. 1830  FOR I=1 TO M
  198. 1832    PRINT #1,HM$(I)+","+SM$(I)
  199. 1835    PRINT #1,AC$(I)+",";D(I);",";AN(I);
  200. 1838    IF AN(I)=0 THEN PRINT #1,"" : GOTO 1850
  201. 1840    FOR J=N TO AN(I)+N-1
  202. 1842      IF J=AN(I)+N-1 THEN PRINT #1,","+PA$(J) ELSE PRINT #1,","+PA$(J);
  203. 1845    NEXT J
  204. 1848    N=N+AN(I)
  205. 1850  NEXT I
  206. 1852  CLOSE #1
  207. 1855  RETURN
  208. 1858  '
  209. 1860  '
  210. 2500  '*********************************************************************
  211. 2501  '*   Function: This subroutine is to transfer logical network data   *
  212. 2502  '*             into adjacency matrix.                                *
  213. 2505  '*********************************************************************
  214. 2510  DIM EP(M,2)
  215. 2515  ND=1     '  node=1
  216. 2520  N=1 : DM=0 : AL=0
  217. 2540  FOR I=1 TO M
  218. 2550    IF AN(I)<>0 THEN GOTO 2574
  219. 2560    ND=ND+1
  220. 2570    EP(I,1)=1 : EP(I,2)=ND     '  the starting point of network
  221. 2572    GOTO 2900
  222. 2574    DIM PP(AN(I)),DD(AN(I))
  223. 2575    IF DM=0 THEN GOTO 2580
  224. 2576    DIM DP(DM,2)
  225. 2577    FOR J=1 TO DM
  226. 2578      DP(J,1)=DU(J,1) : DP(J,2)=DU(J,2)
  227. 2579    NEXT J
  228. 2580    IF AN(I)<>1 THEN GOTO 2660
  229. 2585    FOR J=1 TO M
  230. 2588      IF AC$(J)=PA$(N) THEN PP(1)=J : GOTO 2600
  231. 2590    NEXT J
  232. 2600    GOSUB 3940
  233. 2630    EP(I,1)=EP(PP(1),2)
  234. 2635    ND=ND+1 : EP(I,2)=ND
  235. 2636    IF DM<>0 THEN ERASE DP
  236. 2638    ERASE PP,DD
  237. 2640    GOTO 2900
  238. 2660    FOR J=N TO AN(I)+N-1
  239. 2670      FOR K=1 TO M
  240. 2680        IF AC$(K)=PA$(J) THEN PP(J-N+1)=K : GOTO 2700
  241. 2690      NEXT K
  242. 2700    NEXT J
  243. 2701    GOSUB 3940
  244. 2702    PMAX=PP(AN(I)) : MAX=EP(PMAX,2)
  245. 2704    FOR J=AN(I)-1 TO 1 STEP -1
  246. 2706      IF EP(PP(J),2)>MAX THEN PMAX=PP(J) : MAX=EP(PMAX,2)
  247. 2708    NEXT J
  248. 2709    RD=0
  249. 2710    FOR J=1 TO AN(I)
  250. 2715      IF EP(PP(J),2)=EP(PMAX,2) THEN GOTO 2780
  251. 2718      FOR L=1 TO I-1
  252. 2720        IF EP(L,1)=EP(PP(J),2) THEN RD=RD+1 : DD(RD)=EP(PP(J),2) : GOTO 2780
  253. 2722      NEXT L
  254. 2724      FOR L=1 TO DM
  255. 2725        IF DP(L,1)=EP(PP(J),2) THEN RD=RD+1 : DD(RD)=EP(PP(J),2) : GOTO 2780
  256. 2726      NEXT L
  257. 2727      FOR K=1 TO J
  258. 2728        IF K=J AND EP(PP(K),1)<>EP(PMAX,1) THEN GOTO 2738
  259. 2730        IF EP(PP(J),1)<>EP(PP(K),1) THEN GOTO 2738
  260. 2734        RD=RD+1
  261. 2735        DD(RD)=EP(PP(J),2)
  262. 2736        GOTO 2780
  263. 2738      NEXT K
  264. 2740      ND=ND-1 : MAX=MAX-1
  265. 2741      PV=EP(PP(J),2)
  266. 2742      FOR K=1 TO I-1
  267. 2748        IF EP(K,1)>PV THEN EP(K,1)=EP(K,1)-1
  268. 2750        IF EP(K,2)>PV THEN EP(K,2)=EP(K,2)-1
  269. 2752      NEXT K
  270. 2754      FOR K=1 TO RD
  271. 2756        IF DD(K)>PV THEN DD(K)=DD(K)-1
  272. 2758      NEXT K
  273. 2760      FOR K=1 TO DM
  274. 2766        IF DP(K,1)>PV THEN DP(K,1)=DP(K,1)-1
  275. 2768        IF DP(K,2)>PV THEN DP(K,2)=DP(K,2)-1
  276. 2770      NEXT K
  277. 2775      EP(PP(J),2)=MAX
  278. 2780    NEXT J
  279. 2790    GOSUB 3900
  280. 2840    EP(I,1)=EP(PMAX,2)
  281. 2850    ND=ND+1 : EP(I,2)=ND
  282. 2860    ERASE PP,DD
  283. 2900    N=N+AN(I)
  284. 3000  NEXT I
  285. 3010  '
  286. 3020  '
  287. 3400  IF DM=0 THEN GOTO 3407
  288. 3402  DIM DP(DM,2)
  289. 3404  FOR I=1 TO DM
  290. 3405    DP(I,1)=DU(I,1) : DP(I,2)=DU(I,2)
  291. 3406  NEXT I
  292. 3407  OPEN "NODE.FIN" FOR OUTPUT AS #2
  293. 3408  RD=0 : K=0
  294. 3410  FOR I=1 TO ND
  295. 3420    FOR J=1 TO M
  296. 3430      IF EP(J,1)=I THEN GOTO 3450
  297. 3440    NEXT J
  298. 3442    FOR J=1 TO DM
  299. 3444      IF DP(J,1)=I THEN GOTO 3450
  300. 3445    NEXT J
  301. 3446    K=K+1
  302. 3448    WRITE #2,I
  303. 3450  NEXT I
  304. 3455  CLOSE #2
  305. 3458  IF K=1 THEN GOTO 3670
  306. 3465  DIM PP(K),FD(K),DD(K)
  307. 3470  OPEN "NODE.FIN" FOR INPUT AS #2
  308. 3480  FOR I=1 TO K
  309. 3490    INPUT #2,FD(I)
  310. 3500  NEXT I
  311. 3505  CLOSE #2
  312. 3520  FOR I=1 TO K
  313. 3530    FOR J=1 TO M
  314. 3540      IF EP(J,2)=FD(I) THEN PP(I)=J : GOTO 3550
  315. 3545    NEXT J
  316. 3550  NEXT I
  317. 3562  MAX=FD(K) : PMAX=K
  318. 3564  FOR I=K-1 TO 1 STEP -1
  319. 3566    IF FD(I)>MAX THEN MAX=FD(I) : PMAX=I
  320. 3568  NEXT I
  321. 3570  FOR I=1 TO K
  322. 3575    IF I=PMAX THEN GOTO 3650
  323. 3580    FOR J=1 TO I
  324. 3582      IF J=I AND EP(PP(J),1)<>EP(PP(PMAX),1) THEN  GOTO 3592
  325. 3584      IF EP(PP(I),1)<>EP(PP(J),1) THEN  GOTO 3592
  326. 3586      RD=RD+1
  327. 3588      DD(RD)=EP(PP(I),2)
  328. 3590      GOTO 3650
  329. 3592    NEXT J
  330. 3594    ND=ND-1 : MAX=MAX-1
  331. 3596    PV=EP(PP(I),2)
  332. 3598    FOR J=1 TO M
  333. 3600      IF EP(J,1)>PV THEN EP(J,1)=EP(J,1)-1
  334. 3604      IF EP(J,2)>PV THEN EP(J,2)=EP(J,2)-1
  335. 3606    NEXT J
  336. 3607    FOR J=1 TO DM
  337. 3608      IF DP(J,1)>PV THEN DP(J,1)=DP(J,1)-1
  338. 3609      IF DP(J,2)>PV THEN DP(J,2)=DP(J,2)-1
  339. 3610    NEXT J
  340. 3612    FOR J=1 TO RD
  341. 3614      IF DD(J)>PV THEN DD(J)=DD(J)-1
  342. 3616    NEXT J
  343. 3620    EP(PP(I),2)=MAX
  344. 3650  NEXT I
  345. 3660  ERASE PP,FD
  346. 3670  KILL "NODE.FIN"
  347. 3680  '
  348. 3690  '
  349. 3700  IF DM+RD=0 THEN GOTO 3800
  350. 3710  IF DM<>0 THEN ERASE DU
  351. 3720  DIM DU(DM+RD,2)
  352. 3730  FOR I=1 TO DM
  353. 3740    DU(I,1)=DP(I,1) : DU(I,2)=DP(I,2)
  354. 3750  NEXT I
  355. 3752  IF DM<>0 THEN ERASE DP
  356. 3754  FOR I=1 TO RD
  357. 3758    DU(DM+I,1)=DD(I) : DU(DM+I,2)=MAX
  358. 3760  NEXT I
  359. 3762  DM=DM+RD
  360. 3764  IF RD<>0 THEN ERASE DD
  361. 3765  '
  362. 3768  '
  363. 3800  DIM AD(ND,ND),AA(ND,ND)
  364. 3820  FOR I=1 TO M
  365. 3830    AD(EP(I,1),EP(I,2))=1 : AA(EP(I,1),EP(I,2))=D(I)
  366. 3840  NEXT I
  367. 3850  FOR I=1 TO DM
  368. 3860    AD(DU(I,1),DU(I,2))=-1
  369. 3870  NEXT I
  370. 3872  IF CC=1 THEN ERASE CP
  371. 3874  DIM CP(ND,ND) : CC=1
  372. 3890  RETURN
  373. 3895  '
  374. 3898  '
  375. 3900  IF DM+RD=0 THEN GOTO 3935
  376. 3905  IF DM<>0 THEN ERASE DU
  377. 3910  DIM DU(DM+RD,2)
  378. 3912  FOR J=1 TO DM
  379. 3914    DU(J,1)=DP(J,1) : DU(J,2)=DP(J,2)
  380. 3916  NEXT J
  381. 3918  IF DM<>0 THEN ERASE DP
  382. 3920  L=0
  383. 3922  FOR J=1 TO RD
  384. 3924    FOR K=1 TO DM
  385. 3925      IF DU(K,1)=DD(J) AND DU(K,2)=MAX THEN L=L+1 : GOTO 3930
  386. 3926    NEXT K
  387. 3928    DU(DM+J-L,1)=DD(J) : DU(DM+J-L,2)=MAX
  388. 3930  NEXT J
  389. 3932  DM=DM+RD-L
  390. 3935  RETURN
  391. 3936  '
  392. 3938  '
  393. 3940  FOR J=1 TO AN(I)
  394. 3941    FOR K=1 TO I-1
  395. 3942      IF EP(K,2)<>EP(PP(J),2) THEN GOTO 3948
  396. 3943      IF EP(K,1)=EP(PP(J),1)  THEN GOTO 3948
  397. 3944      FOR JJ=1 TO AN(I)
  398. 3945        IF EP(K,1)=EP(PP(JJ),1) AND EP(K,2)=EP(PP(JJ),2) THEN GOTO 3948
  399. 3946      NEXT JJ
  400. 3947      GOTO 3972
  401. 3948    NEXT K
  402. 3949    FOR K=1 TO DM
  403. 3950      IF DP(K,2)<>EP(PP(J),2) THEN GOTO 3960
  404. 3951      FOR JJ=1 TO I-1
  405. 3952        IF EP(JJ,2)<>DP(K,1) THEN GOTO 3958
  406. 3953        FOR KK=1 TO AN(I)
  407. 3954          IF EP(JJ,1)=EP(PP(KK),1) AND EP(JJ,2)=EP(PP(KK),2) THEN GOTO 3958
  408. 3956        NEXT KK
  409. 3957        GOTO 3972
  410. 3958      NEXT JJ
  411. 3960    NEXT K
  412. 3962    GOTO 4020
  413. 3972    RD=1 : DD(RD)=EP(PP(J),2) : MAX=EP(PP(J),2)+1
  414. 3974    PV=EP(PP(J),2)
  415. 3976    FOR K=1 TO I-1
  416. 3978      IF EP(K,1)>=PV THEN EP(K,1)=EP(K,1)+1
  417. 3980      IF EP(K,2)>=PV THEN EP(K,2)=EP(K,2)+1
  418. 3982    NEXT K
  419. 3984    FOR K=1 TO DM
  420. 3986      IF DP(K,1)>=PV THEN DP(K,1)=DP(K,1)+1
  421. 3988      IF DP(K,2)>=PV THEN DP(K,2)=DP(K,2)+1
  422. 3990    NEXT K
  423. 3992    FOR K=1 TO AN(I)
  424. 3994      IF EP(PP(K),2)=DD(RD)+1 THEN EP(PP(K),2)=DD(RD)
  425. 3996    NEXT K
  426. 3998    ND=ND+1
  427. 4000    GOSUB 3900
  428. 4001    IF DM=0 THEN GOTO 4020
  429. 4002    DIM DP(DM,2)
  430. 4004    FOR K=1 TO DM
  431. 4006      DP(K,1)=DU(K,1) : DP(K,2)=DU(K,2)
  432. 4008    NEXT K
  433. 4020  NEXT J
  434. 4025  RETURN
  435. 4028  '
  436. 4030  '
  437. 4200  '********************************************************************
  438. 4205  '*   Function: This subroutine is to print the codes of activities  *
  439. 4210  '*             corresponding with nodes, or, with events.           *
  440. 4220  '********************************************************************
  441. 4240  CLS : LOCATE 5,8,0
  442. 4245  PRINT "ERR<UNK! {FDD4}>VARPTR<0xB4!>IMPNOTELSE , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0
  443. 4270  LPRINT:LPRINT:LPRINT:LPRINT:LPRINT
  444. 4275  LPRINT TAB(20),"*** OPTION<UNK! {00F7}>CLOSEAND<0xB6!>DEFDBL<0xB6!>ERLNOTEDIT<0xB5!>SOUNDMERGEVARPTR<0xB5!><0xE3!>WHILE<0xE0!>OPENBEEP ***" : LPRINT : LPRINT
  445. 4280  FOR I=1 TO M STEP 2
  446. 4290    LPRINT TAB(10),AC$(I)+" -- ( ";EP(I,1);" , ";EP(I,2);" )";
  447. 4295    IF I<>M THEN LPRINT TAB(50),AC$(I+1)+" -- ( ";EP(I+1,1);" , ";EP(I+1,2);" ) "
  448. 4300  NEXT I
  449. 4315  LPRINT : LPRINT
  450. 4316  IF DM=0 THEN GOTO 4370
  451. 4320  LPRINT : LPRINT TAB(25),"*** USR+ CLOSEAND <0xB6!>DEFDBL ***"
  452. 4330  LPRINT : LPRINT
  453. 4340  FOR I=1 TO DM STEP 2
  454. 4350    LPRINT TAB(5),"( ";DU(I,1);" , ";DU(I,2);" )";
  455. 4360    IF I<>DM THEN LPRINT TAB(55),"( ";DU(I+1,1);" , ";DU(I+1,2);" ) "
  456. 4364  NEXT I
  457. 4365  LPRINT
  458. 4370  RETURN
  459. 4380  '
  460. 4390  '
  461. 4400  '*********************************************************************
  462. 4401  '*   Function: This subroutine is to print the output report.        *
  463. 4405  '*********************************************************************
  464. 4406  IF AL=0 THEN CLS:BEEP:LOCATE 5,12,0 : PRINT "TAB(<0xB4!>MERGE<UNK! {00F8}>USRUSRTHEN<UNK! {00F8}>BSAVE=WRITESTRING$TAB(<UNK! {00F6}>" : GOTO 4547
  465. 4408  WIDTH "LPT1:",250 : CLS : LOCATE 5,8,0
  466. 4410  PRINT "ERR<UNK! {FDD4}>VARPTR<0xB4!>IMPNOTELSE , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0
  467. 4412  LPRINT:LPRINT:LPRINT:LPRINT:LPRINT
  468. 4415  LPRINT CHR$(27)+"ID",TAB(33);"THEN<UNK! {00F8}>BSAVE=RANDOMIZE>CLOSEDEFDBLLOCATE<0xE4!>CALL<UNK! {00F6}>WHILERESUMEOPTION>"
  469. 4416  LPRINT TAB(30);"==================";CHR$(27)+"IA"
  470. 4418  LPRINT TAB(4);"STEPAND  SOUNDCOLOR  BLOAD<UNK! {00FB}> CALLPSET : ";XM$,
  471. 4420  LPRINT TAB(122);"USINGPOINT  USING<UNK! {00F7}>  SPC(<0xB5!>  STRING$POINT  PSETVARPTR : ";TE(ND)
  472. 4422  LPRINT "DELETELINEDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETEUSR";
  473. 4423  LPRINT "DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSR";
  474. 4424  LPRINT "DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xB4!>"
  475. 4425  LPRINT "DELETEEDIT USRIMP DELETEEDIT    CLOSEAND        <0xB6!>DEFDBL    DELETEEDITCLOSEAND<0xB6!>DEFDBLDELETEEDIT <0xB6!>ERLNOTEDITMERGE<0xE1!><0xB5!><0xE3!> DELETEEDITUSING<UNK! {00F7}>SPC(<0xB5!>MOTORCOLORDELETEEDIT";
  476. 4426  LPRINT "   LOCATEDELETE      RANDOMIZESWAP   DELETEEDIT MERGE\  PRESETLINE DELETEEDITUSINGANDERL=COLORKEYSOUNDPOINTDELETEEDITUSINGANDCALL'WHILEINSTRUSR*DELETEEDITUSINGANDERL=COLORKEYSOUNDPOINTDELETEEDIT";
  477. 4427  LPRINT "USINGANDCALL'WHILEINSTRUSR*DELETEEDITUSINGPOINTLOCATEWHILEWENDANDDELETEEDIT<0xB5!>ERASELOCATEWHILEWENDANDDELETEEDITRANDOMIZEINSTRLOAD<UNK! {00FC}>CLOSEAND<0xB6!>DEFDBLDELETEEDIT"
  478. 4428  LPRINT "DELETEEDIT OPENBEEP DELETEEDIT    BLOAD<UNK! {00FB}>        CALLPSET    DELETEEDIT<0xB4!><UNK! {00FA}>OPENBEEPDELETEEDIT WHILE<0xE0!>    OPENBEEP DELETEEDIT (  ) DELETEEDIT";
  479. 4429  LPRINT "   <0xB5!>ERASE      TAB(CLOSE   DELETEEDIT CLOSEAND  <0xB6!>DEFDBL DELETEEDITCOLORAUTORANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDITCOLORAUTORANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDITTHEN-RANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDIT";
  480. 4430  LPRINT "THEN-RANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDIT  TROFFSPC(  DELETEEDIT  TROFFIMP  DELETEEDITWHILE-LOADPRESET(ELSETO)DELETEEDIT"
  481. 4432  X$="DELETECLSDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETE<0xE0!>DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESCREEN"
  482. 4434  N=1
  483. 4435  FOR I=1 TO M
  484. 4436    LPRINT X$
  485. 4438    LPRINT "DELETEEDIT";I;TAB(7);"DELETEEDIT";HM$(I);TAB(29);"DELETEEDIT ";AC$(I);
  486. 4439    LPRINT TAB(35);"DELETEEDIT";EP(I,1);TAB(41);"ELSE<UNK! {00FA}>";EP(I,2);TAB(47);"DELETEEDIT ";D(I);
  487. 4440    LPRINT TAB(55);"DELETEEDIT";SM$(I);TAB(73);"DELETEEDIT";
  488. 4444    FOR J=N TO AN(I)+N-1
  489. 4446      IF J=N THEN LPRINT PA$(J); ELSE LPRINT ", "+PA$(J);
  490. 4448    NEXT J
  491. 4449    N=N+AN(I)
  492. 4450    LPRINT TAB(83);"DELETEEDIT  ";TE(EP(I,1));
  493. 4452    LPRINT TAB(93);"DELETEEDIT  ";TL(EP(I,2))-AA(EP(I,1),EP(I,2));
  494. 4454    LPRINT TAB(103);"DELETEEDIT  ";TE(EP(I,1))+AA(EP(I,1),EP(I,2));
  495. 4455    LPRINT TAB(113);"DELETEEDIT  ";TL(EP(I,2));
  496. 4456    LPRINT TAB(123);"DELETEEDIT ";R1(EP(I,1),EP(I,2));
  497. 4458    LPRINT TAB(131);"DELETEEDIT ";R2(EP(I,1),EP(I,2));TAB(139);
  498. 4460    IF CP(EP(I,1),EP(I,2))=1 THEN LPRINT "DELETEEDIT   ELSETO   DELETEEDIT" ELSE LPRINT "DELETEEDIT        DELETEEDIT"
  499. 4465  NEXT I
  500. 4490  LPRINT "DELETEOPTIONDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETELOAD"
  501. 4492  LPRINT
  502. 4494  RETURN
  503. 4496  '
  504. 4498  '
  505. 4500  '*********************************************************************
  506. 4502  '*     Function: This subroutine is to print the Critical Path.      *
  507. 4505  '*********************************************************************
  508. 4508  IF AL=0 THEN CLS:BEEP:LOCATE 5,12,0 : PRINT "TAB(<0xB4!>MERGE<UNK! {00F8}>USRUSRTHEN<UNK! {00F8}>BSAVE=WRITESTRING$TAB(<UNK! {00F6}>" : GOTO 4547
  509. 4510  CLS : LOCATE 5,8,0
  510. 4512  PRINT "ERR<UNK! {FDD4}>VARPTR<0xB4!>IMPNOTELSE , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0
  511. 4514  LPRINT:LPRINT:LPRINT:LPRINT:LPRINT
  512. 4515  LPRINT "WHILESAVETHEN<UNK! {00F8}>BSAVE=STRING$USRSPC(ERLSTEPBSAVECLOSEAND<0xB6!>DEFDBLTAB(AUTORANDOMIZEINSTRLOAD<UNK! {00FC}>BSAVEWRITESAVE<0xB6!>KEYSTEP<0xB5!>SOUNDCLOSEAND<0xB6!>DEFDBL :" : LPRINT
  513. 4520  R=1
  514. 4525  FOR I=1 TO M
  515. 4530    IF R1(EP(I,1),EP(I,2))<>0 OR R2(EP(I,1),EP(I,2))<>0 THEN GOTO 4545
  516. 4535    IF R=46 OR I=M THEN LPRINT TAB(R);AC$(I) : R=1 : GOTO 4545
  517. 4540    LPRINT TAB(R);AC$(I);","; : R=R+5
  518. 4545  NEXT I
  519. 4546  LPRINT : GOTO 4555
  520. 4547  LOCATE 25,1,0
  521. 4548  DEF SEG=0 : POKE 1050,PEEK(1052)
  522. 4550  AN$=INKEY$
  523. 4552  IF AN$="" THEN GOTO 4550
  524. 4555  RETURN
  525. 4558  '
  526. 4560  '
  527. 4800  '**********************************************************************
  528. 4801  '*   Function: This subroutine is the PERT/CPM sub-system. It's       *
  529. 4802  '*             resulting is finding out the Critical Path.            *
  530. 4805  '**********************************************************************
  531. 4808  IF AL=1 THEN ERASE TE,TL,TP,R1,R2
  532. 4810  DIM TE(ND),TL(ND),TP(ND),R1(ND,ND),R2(ND,ND)
  533. 4812  CLS : LOCATE 6,1,0
  534. 4815  PRINT "ERR<UNK! {FDD4}>VARPTRMERGE<UNK! {00F8}>USRUSRTHEN<UNK! {00F8}>BSAVE=WRITESTRING$TAB(<UNK! {00F6}> , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0
  535. 4818  AL=1
  536. 4820  FOR I=1 TO ND
  537. 4822    TE(I)=0 : TL(I)=10000
  538. 4825  NEXT I
  539. 4830  FOR J=2 TO ND
  540. 4835    R=0
  541. 4838    FOR I=1 TO ND
  542. 4840      IF AD(I,J)<>0 THEN R=R+1 : TP(R)=I
  543. 4845    NEXT I
  544. 4848    TE(J)=TE(TP(1))+AA(TP(1),J)
  545. 4850    FOR I=2 TO R
  546. 4855      IF TE(J)<TE(TP(I))+AA(TP(I),J) THEN TE(J)=TE(TP(I))+AA(TP(I),J)
  547. 4860    NEXT I
  548. 4866  NEXT J
  549. 4868  TL(ND)=TE(ND)
  550. 4870  FOR I=ND-1 TO 1 STEP -1
  551. 4875    R=0
  552. 4880    FOR J=1 TO ND
  553. 4884      IF AD(I,J)<>0 THEN R=R+1 : TP(R)=J
  554. 4885    NEXT J
  555. 4888    TL(I)=TL(TP(1))-AA(I,TP(1))
  556. 4890    FOR J=2 TO R
  557. 4895      IF TL(I)>TL(TP(J))-AA(I,TP(J)) THEN TL(I)=TL(TP(J))-AA(I,TP(J))
  558. 4900    NEXT J
  559. 4905  NEXT I
  560. 4910  FOR I=1 TO ND
  561. 4912    FOR J=1 TO ND
  562. 4915      CP(I,J)=0
  563. 4916      IF AD(I,J)<>1 THEN GOTO 4925
  564. 4918      R1(I,J)=TL(J)-TE(I)-AA(I,J)
  565. 4920      R2(I,J)=TE(J)-TE(I)-AA(I,J)
  566. 4922      IF R1(I,J)=0 AND R2(I,J)=0 THEN CP(I,J)=1
  567. 4925    NEXT J
  568. 4930  NEXT I
  569. 4940  RETURN
  570. 4945  '
  571. 4948  '
  572. 5800  '*********************************************************************
  573. 5805  '*         Function: This subroutine is to draw the network.         *
  574. 5810  '*********************************************************************
  575. 5820  CLS : LOCATE 6,1,0
  576. 5825  PRINT "ERR<UNK! {FDD4}>VARPTRMERGE<UNK! {00F8}>USRUSRCLOSE>THENLOADUSINGLOADWHILEOPTIONRANDOMIZESWAPUSING<UNK! {00F7}> , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0
  577. 5830  DIM DX(ND),DY(ND),X(ND),Y(ND),TM(ND)
  578. 5840  FOR I=1 TO ND
  579. 5850    DX(I)=0
  580. 5860  NEXT I
  581. 5870  FOR J=2 TO ND
  582. 5880    R=0
  583. 5890    FOR I=1 TO ND
  584. 5900      IF AD(I,J)<>0 THEN R=R+1 : TM(R)=I
  585. 5910    NEXT I
  586. 5920    DX(J)=DX(TM(1))+1
  587. 5930    FOR I=2 TO R
  588. 5940      IF DX(J)<DX(TM(I))+1 THEN DX(J)=DX(TM(I))+1
  589. 5950    NEXT I
  590. 5960  NEXT J
  591. 5970  SX=300/DX(ND)
  592. 5980  '
  593. 5990  '
  594. 6000  ERASE TM : DIM TM(DX(ND)),RMAX(DX(ND)),RMIN(DX(ND))
  595. 6002  FOR I=1 TO DX(ND)
  596. 6004    R=0
  597. 6010    FOR K=1 TO M
  598. 6011      IF DX(EP(K,1))<=I-1 AND DX(EP(K,2))>=I THEN R=R+1
  599. 6012    NEXT K
  600. 6013    FOR K=1 TO DM
  601. 6014      IF DX(DU(K,1))<=I-1 AND DX(DU(K,2))>=I THEN R=R+1
  602. 6015    NEXT K
  603. 6022    TM(I)=R
  604. 6025  NEXT I
  605. 6030  MAX=TM(1)
  606. 6032  FOR I=2 TO DX(ND)
  607. 6035    IF TM(I)>MAX THEN MAX=TM(I)
  608. 6036  NEXT I
  609. 6038  IF INT(MAX/2)*2=MAX THEN MAX=MAX+1
  610. 6040  FOR I=1 TO DX(ND)
  611. 6042    R=0
  612. 6045    FOR J=1 TO ND
  613. 6048      IF DX(J)=I THEN R=R+1
  614. 6050    NEXT J
  615. 6052    TM(I)=R
  616. 6055  NEXT I
  617. 6060  DY(1)=INT(MAX/2+0.51)
  618. 6062  FOR I=1 TO DX(ND)
  619. 6063    IF INT(TM(I)/2)*2=TM(I) THEN TAG=0 ELSE TAG=1
  620. 6064    R=INT((MAX-TM(I))/2)+1 : RMIN(I)=R
  621. 6065    FOR J=1 TO ND
  622. 6066      IF DX(J)<>I THEN GOTO 6070
  623. 6067      IF TAG=0 AND R=DY(1) THEN DY(J)=R+1 : R=R+2 : GOTO 6070
  624. 6068      DY(J)=R : R=R+1
  625. 6070    NEXT J
  626. 6072    RMAX(I)=R-1
  627. 6075  NEXT I
  628. 6078  SY=200/(MAX+1)
  629. 6080  CLS : LOCATE 25,1,0
  630. 6085  '
  631. 6090  '
  632. 6100  OPEN "NETWORK.DWG" FOR OUTPUT AS #1
  633. 6105  DIM Z(DX(ND),MAX)
  634. 6110  FOR I=1 TO ND
  635. 6120    X(I)=DX(I)*SX+10 : Y(I)=DY(I)*SY+5
  636. 6130    CIRCLE (X(I),Y(I)),2,,0,6.283
  637. 6140    WRITE #1,I
  638. 6150    WRITE #1,X(I),Y(I)
  639. 6160  NEXT I
  640. 6170  FOR I=2 TO ND : Z(DX(I),DY(I))=1 : NEXT I
  641. 6180  FOR I=1 TO M
  642. 6182    WRITE #1,AC$(I)
  643. 6185    X1=X(EP(I,1)) : Y1=Y(EP(I,1))
  644. 6190    X2=X(EP(I,2)) : Y2=Y(EP(I,2))
  645. 6195    IF DX(EP(I,2))-DX(EP(I,1))<>1 THEN GOTO 6300
  646. 6200    D=SQR((X2-X1)^2+(Y2-Y1)^2)
  647. 6205    X11=X1+2*(X2-X1)/D     : Y11=Y1+2*(Y2-Y1)/D
  648. 6210    X22=X1+(D-2)*(X2-X1)/D : Y22=Y1+(D-2)*(Y2-Y1)/D
  649. 6215    IF CP(EP(I,1),EP(I,2))<>1 THEN GOTO 6222
  650. 6216    Y11=Y11-1 : Y22=Y22-1 : R=4
  651. 6217    LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6860
  652. 6218    Y11=Y11+2 : Y22=Y22+2
  653. 6220    LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6870
  654. 6221    GOTO 6225
  655. 6222    LINE (X11,Y11)-(X22,Y22) : GOSUB 6860 : GOSUB 6870
  656. 6225    WRITE #1,X1,Y1,X2,Y2,1
  657. 6230    IF DY(EP(I,1))=DY(EP(I,2)) THEN Z(DX(EP(I,2)),DY(EP(I,2)))=1
  658. 6240    GOTO 6450
  659. 6300    IF DY(EP(I,1))>=DY(EP(I,2)) THEN GOTO 6315
  660. 6302    R=1
  661. 6304    FOR J=DX(EP(I,1))+1 TO DX(EP(I,2))
  662. 6306      IF R>MAX THEN R=MAX+0.5 : GOTO 6350
  663. 6308      IF Z(J,R)=1 THEN R=R+1 : GOTO 6304
  664. 6310    NEXT J
  665. 6312    GOTO 6350
  666. 6315    R=MAX
  667. 6320    FOR J=DX(EP(I,1))+1 TO DX(EP(I,2))
  668. 6325      IF R<1 THEN R=0.5 : GOTO 6350
  669. 6330        IF Z(J,R)=1 THEN R=R-1 : GOTO 6320
  670. 6340    NEXT J
  671. 6350    FOR J=DX(EP(I,1))+1 TO DX(EP(I,2))
  672. 6355      Z(J,R)=1
  673. 6358    NEXT J
  674. 6400    X22=X1+((DX(EP(I,1))+1)*SX+10-X1)/2 : Y22=R*SY+5
  675. 6408    D=SQR((X22-X1)^2+(Y22-Y1)^2)
  676. 6410    X11=X1+2*(X22-X1)/D : Y11=Y1+2*(Y22-Y1)/D
  677. 6415    IF CP(EP(I,1),EP(I,2))=1 THEN LINE(X11,Y11-1)-(X22,Y22-1),2 : LINE(X11,Y11+1)-(X22,Y22+1),2 : GOTO 6418
  678. 6416    LINE (X11,Y11)-(X22,Y22)
  679. 6418    WRITE #1,X1,Y1,X22,Y22,2
  680. 6420    X11=X22 : Y11=Y22
  681. 6425    X22=(DX(EP(I,2))-1)*SX+10+(X2-(DX(EP(I,2))-1)*SX-10)/2
  682. 6428    IF CP(EP(I,1),EP(I,2))=1 THEN LINE(X11,Y11-1)-(X22,Y22-1),2 : LINE(X11,Y11+1)-(X22,Y22+1),2 : GOTO 6430
  683. 6429    LINE (X11,Y11)-(X22,Y22)
  684. 6430    WRITE #1,X11,Y11,X22,Y22,3
  685. 6435    X11=X22
  686. 6438    D=SQR((X2-X11)^2+(Y2-Y11)^2)
  687. 6440    X22=X11+(D-2)*(X2-X11)/D : Y22=Y11+(D-2)*(Y2-Y11)/D
  688. 6441    IF CP(EP(I,1),EP(I,2))<>1 THEN GOTO 6448
  689. 6442    Y01=Y11 : Y11=Y11-1 : Y22=Y22-1 : R=4
  690. 6444    LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6860
  691. 6445    Y11=Y11+2 : Y22=Y22+2
  692. 6446    LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6870 : Y11=Y01
  693. 6447    GOTO 6449
  694. 6448    LINE (X11,Y11)-(X22,Y22) : GOSUB 6860 : GOSUB 6870
  695. 6449    WRITE #1,X11,Y11,X2,Y2,4
  696. 6450  NEXT I
  697. 6500  FOR I=1 TO DM
  698. 6505    X1=X(DU(I,1)) : Y1=Y(DU(I,1))
  699. 6508    X2=X(DU(I,2)) : Y2=Y(DU(I,2))
  700. 6510    IF DX(DU(I,2))-DX(DU(I,1))<>1 THEN GOTO 6530
  701. 6512    D=SQR((X2-X1)^2+(Y2-Y1)^2)
  702. 6515    X11=X1+2*(X2-X1)/D     : Y11=Y1+2*(Y2-Y1)/D
  703. 6518    X22=X1+(D-2)*(X2-X1)/D : Y22=Y1+(D-2)*(Y2-Y1)/D
  704. 6520    TAG=1 : T=1 : GOSUB 6800
  705. 6525    WRITE #1,X1,Y1,X2,Y2,1
  706. 6526    IF DY(DU(I,1))=DY(DU(I,2)) THEN Z(DX(DU(I,2)),DY(DU(I,2)))=1
  707. 6528    GOTO 6620
  708. 6530    IF DY(DU(I,1))>=DY(DU(I,2)) THEN GOTO 6540
  709. 6532    R=1
  710. 6533    FOR J=DX(DU(I,1))+1 TO DX(DU(I,2))
  711. 6534      IF R>MAX THEN R=MAX+0.5 : GOTO 6550
  712. 6535      IF Z(J,R)=1 THEN R=R+1 : GOTO 6533
  713. 6536    NEXT J
  714. 6538    GOTO 6550
  715. 6540    R=MAX
  716. 6542    FOR J=DX(DU(I,1))+1 TO DX(DU(I,2))
  717. 6543      IF R<1 THEN R=0.5 : GOTO 6550
  718. 6544      IF Z(J,R)=1 THEN R=R-1 : GOTO 6542
  719. 6545    NEXT J
  720. 6550    FOR J=DX(DU(I,1))+1 TO DX(DU(I,2))
  721. 6551      Z(J,R)=1
  722. 6552    NEXT J
  723. 6560    X22=X1+((DX(DU(I,1))+1)*SX+10-X1)/2 : Y22=R*SY+5
  724. 6561    D=SQR((X22-X1)^2+(Y22-Y1)^2)
  725. 6562    X11=X1+2*(X22-X1)/D : Y11=Y1+2*(Y22-Y1)/D
  726. 6563    TAG=0 : GOSUB 6800
  727. 6565    X11=X22 : Y11=Y22
  728. 6568    WRITE #1,X1,Y1,X22,Y22,2
  729. 6569    X11=X22 : Y11=Y22
  730. 6570    X22=(DX(DU(I,2))-1)*SX+10+(X2-(DX(DU(I,2))-1)*SX-10)/2
  731. 6572    D=X22-X11
  732. 6574    TAG=0 : GOSUB 6800
  733. 6575    WRITE #1,X11,Y11,X22,Y22,3
  734. 6580    X11=X22
  735. 6585    D=SQR((X2-X11)^2+(Y2-Y11)^2)
  736. 6590    X22=X11+(D-2)*(X2-X11)/D : Y22=Y11+(D-2)*(Y2-Y11)/D
  737. 6595    TAG=1 : T=1 : GOSUB 6800
  738. 6600    WRITE #1,X11,Y11,X2,Y2,4
  739. 6620  NEXT I
  740. 6630  CLOSE #1
  741. 6640  ERASE DX,DY,X,Y,TM,RMAX,RMIN,Z
  742. 6642  DEF SEG=0 : POKE 1050,PEEK(1052)
  743. 6645  AN$=INKEY$
  744. 6650  IF AN$="" THEN GOTO 6645
  745. 6655  SCREEN 0 : SCREEN 1,0 : COLOR 9,0
  746. 6660  RETURN
  747. 6665  '
  748. 6670  '
  749. 6800  IF TAG=0 THEN S=D ELSE IF TAG=1 THEN S=D-2 ELSE S=D-8
  750. 6802  FOR L=2 TO D+14 STEP 14
  751. 6804    IF L>=S THEN LINE -(X22,Y22),1 : GOTO 6830
  752. 6805    PSET (X11+(L-2)*(X22-X11)/D,Y11+(L-2)*(Y22-Y11)/D)
  753. 6808    IF L+7>=S THEN LINE -(X22,Y22),1 : GOTO 6830
  754. 6810    LINE -STEP(6*(X22-X11)/D,6*(Y22-Y11)/D),1
  755. 6820  NEXT L
  756. 6830  IF TAG=0 THEN GOTO 6850
  757. 6831  IF T=1 THEN R=4 ELSE IF T=2 THEN R=8 ELSE R=16
  758. 6832  X0=(X11-X22)*0.866-(Y11-Y22)*0.5+X22
  759. 6834  Y0=(X11-X22)*0.5+(Y11-Y22)*0.866+Y22
  760. 6836  LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R)),1
  761. 6838  LINE -(X22,Y22),1
  762. 6840  X0=(X11-X22)*0.866+(Y11-Y22)*0.5+X22
  763. 6842  Y0=-(X11-X22)*0.5+(Y11-Y22)*0.866+Y22
  764. 6846  LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R)),1
  765. 6850  RETURN
  766. 6855  '
  767. 6858  '
  768. 6860  X0=(X11-X22)*0.866-(Y11-Y22)*0.5+X22
  769. 6862  Y0=(X11-X22)*0.5+(Y11-Y22)*0.866+Y22
  770. 6864  LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R))
  771. 6865  LINE -(X22,Y22)
  772. 6866  RETURN
  773. 6868  '
  774. 6870  X0=(X11-X22)*0.866+(Y11-Y22)*0.5+X22
  775. 6872  Y0=-(X11-X22)*0.5+(Y11-Y22)*0.866+Y22
  776. 6874  LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R))
  777. 6875  RETURN
  778. 6878  '
  779. 6880  '
  780. 7000  '*********************************************************************
  781. 7005  '*     Function: This subroutine is to separate the network, so      *
  782. 7010  '*               that each small block of the network diagram can    *
  783. 7015  '*               be copied to the printer.                           *
  784. 7020  '*********************************************************************
  785. 7030  CLS : LOCATE 6,1,0
  786. 7035  INPUT "PRESET*LOCATE<0xE4!>SCREEN* X STEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NX
  787. 7040  IF NX=0 THEN BEEP : GOTO 7035
  788. 7042  PRINT
  789. 7045  INPUT "PRESET*LOCATE<0xE4!>SCREEN* Y STEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NY
  790. 7050  IF NY=0 THEN BEEP : GOTO 7045
  791. 7055  '
  792. 7060  '
  793. 7120  FOR I=1 TO NY
  794. 7130    YMIN=(I-1)*200 : YMAX=I*200
  795. 7140    FOR J=1 TO NX
  796. 7150      CLS
  797. 7152  LOCATE 25,1,0
  798. 7155      LINE (0,0)-(0,199) : LINE -(319,199)
  799. 7160      LINE -(319,0)      : LINE -(0,0)
  800. 7170      OPEN "NETWORK.DWG" FOR INPUT AS #1
  801. 7180      XMIN=(J-1)*320 : XMAX=J*320
  802. 7190      FOR K=1 TO ND
  803. 7200        INPUT #1,CN,X1,Y1
  804. 7210        X1=X1*NX
  805. 7220        Y1=Y1*NY
  806. 7230        IF X1<XMIN OR X1>XMAX THEN GOTO 7250
  807. 7240        IF Y1<YMIN OR Y1>YMAX THEN GOTO 7250
  808. 7245        CIRCLE (X1-XMIN,Y1-YMIN),8,,0,6.283
  809. 7248        GOSUB 7850
  810. 7250      NEXT K
  811. 7260      FOR K=1 TO M
  812. 7262        INPUT #1,AN$,X1,Y1,X2,Y2,N
  813. 7264        X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  814. 7265        IF N<>1 THEN GOTO 7280
  815. 7266        D=SQR((X2-X1)^2+(Y2-Y1)^2)
  816. 7268        X0=X1+8*(X2-X1)/D     : Y0=Y1+8*(Y2-Y1)/D
  817. 7270        X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D
  818. 7272        X1=X0                 : Y1=Y0
  819. 7273        GOSUB 7500
  820. 7274        IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN ELSE GOTO 7278
  821. 7275        IF CP(EP(K,1),EP(K,2))=1 THEN LINE (X11,Y11-1)-(X22,Y22-1),2 : R=16: GOSUB 6860:LINE(X11,Y11+2)-(X22,Y22+2),2 : GOSUB 6870 ELSE LINE (X11,Y11)-(X22,Y22):R=16:GOSUB 6860 :GOSUB 6870
  822. 7278        GOTO 7310
  823. 7280        D=SQR((X2-X1)^2+(Y2-Y1)^2)
  824. 7282        X1=X1+8*(X2-X1)/D : Y1=Y1+8*(Y2-Y1)/D
  825. 7284        GOSUB 7500
  826. 7285        IF EXIST=1 AND CP(EP(K,1),EP(K,2))=1 THEN LINE (X1-XMIN,Y1-YMIN-1)-(X2-XMIN,Y2-YMIN-1),2: LINE(X1-XMIN,Y1-YMIN+2)-(X2-XMIN,Y2-YMIN+2),2 ELSE IF EXIST=1 THEN LINE (X1-XMIN,Y1-YMIN)-(X2-XMIN,Y2-YMIN)
  827. 7290        INPUT #1,X1,Y1,X2,Y2,N
  828. 7291        X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  829. 7292        GOSUB 7500
  830. 7293        IF EXIST=1 AND CP(EP(K,1),EP(K,2))=1 THEN LINE (X1-XMIN,Y1-YMIN-1)-(X2-XMIN,Y2-YMIN-1),2: LINE(X1-XMIN,Y1-YMIN+2)-(X2-XMIN,Y2-YMIN+2),2 ELSE IF EXIST=1 THEN LINE (X1-XMIN,Y1-YMIN)-(X2-XMIN,Y2-YMIN)
  831. 7295        INPUT #1,X1,Y1,X2,Y2,N
  832. 7296        X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  833. 7297        D=SQR((X2-X1)^2+(Y2-Y1)^2)
  834. 7298        X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D
  835. 7299        GOSUB 7500
  836. 7300        IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN ELSE GOTO 7310
  837. 7305        IF CP(EP(K,1),EP(K,2))=1 THEN LINE (X11,Y11-1)-(X22,Y22-1),2 : R=8 : GOSUB 6860:LINE(X11,Y11+2)-(X22,Y22+2),2 : GOSUB 6870 ELSE LINE (X11,Y11)-(X22,Y22):R=8:GOSUB 6860 :GOSUB 6870
  838. 7310      NEXT K
  839. 7360      FOR K=1 TO DM
  840. 7362        INPUT #1,X1,Y1,X2,Y2,N
  841. 7364        X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  842. 7365        IF N<>1 THEN GOTO 7380
  843. 7366        D=SQR((X2-X1)^2+(Y2-Y1)^2)
  844. 7368        X0=X1+8*(X2-X1)/D     : Y0=Y1+8*(Y2-Y1)/D
  845. 7370        X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D
  846. 7372        X1=X0                 : Y1=Y0
  847. 7373        GOSUB 7500
  848. 7375        IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=1 : T=3 : GOSUB 6800
  849. 7378        GOTO 7400
  850. 7380        D=SQR((X2-X1)^2+(Y2-Y1)^2)
  851. 7382        X1=X1+8*(X2-X1)/D : Y1=Y1+8*(Y2-Y1)/D
  852. 7384        GOSUB 7500
  853. 7385        IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=0 : GOSUB 6800
  854. 7388        INPUT #1,X1,Y1,X2,Y2,N
  855. 7390        X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  856. 7391        D=SQR((X2-X1)^2+(Y2-Y1)^2)
  857. 7392        GOSUB 7500
  858. 7393        IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=0 : GOSUB 6800
  859. 7394        INPUT #1,X1,Y1,X2,Y2,N
  860. 7395        X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  861. 7396        D=SQR((X2-X1)^2+(Y2-Y1)^2)
  862. 7397        X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D
  863. 7398        GOSUB 7500
  864. 7399        IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=1 : T=2 : GOSUB 6800
  865. 7400      NEXT K
  866. 7410      CLOSE #1
  867. 7415      DEF SEG=0 : POKE 1050,PEEK(1052)
  868. 7420      AN$=INKEY$
  869. 7440      IF AN$="" THEN GOTO 7420
  870. 7445      SCREEN 0 : SCREEN 1,0 : COLOR 9,0
  871. 7450    NEXT J
  872. 7460  NEXT I
  873. 7480  RETURN
  874. 7485  '
  875. 7490  '
  876. 7500  '*******************************************
  877. 7505  '*      Function: Cohen-Sutherland Clipping Algorithm for line      *
  878. 7510  '*                from P1=(x1,y1) to P2=(x2,y2).                    *
  879. 7520  '********************************************************************
  880. 7525  C=0 : JX=0
  881. 7530  XX=X2 : YY=Y2
  882. 7540  GOSUB 7800
  883. 7550  C2=CODE
  884. 7555  IF C2<>0 THEN JX=1
  885. 7560  XX=X1 : YY=Y1
  886. 7570  GOSUB 7800
  887. 7580  C1=CODE
  888. 7600  IF  (C1 AND C2)<>0   THEN EXIST=0 : GOTO 7790
  889. 7610  IF (C1=0) AND (C2=0) THEN EXIST=1 : GOTO 7785
  890. 7620  IF C1=0 THEN SWAP X1,X2 : SWAP Y1,Y2 : SWAP C1,C2 : C=1
  891. 7630  IF (C1 AND 1)=0 THEN GOTO 7680
  892. 7640     Y1=Y1+(Y2-Y1)*(XMIN-X1)/(X2-X1)     '   left intersection point
  893. 7650     X1=XMIN
  894. 7660     GOTO 7560
  895. 7680  IF (C1 AND 2)=0 THEN GOTO 7720
  896. 7690     Y1=Y1+(Y2-Y1)*(XMAX-X1)/(X2-X1)     '   right intersection point
  897. 7700     X1=XMAX
  898. 7710     GOTO 7560
  899. 7720  IF (C1 AND 4)=0 THEN GOTO 7760
  900. 7730     X1=X1+(X2-X1)*(YMIN-Y1)/(Y2-Y1)
  901. 7740     Y1=YMIN                             '   down intersection point
  902. 7750     GOTO 7560
  903. 7760  X1=X1+(X2-X1)*(YMAX-Y1)/(Y2-Y1)
  904. 7770  Y1=YMAX                                '   up intersection point
  905. 7780  GOTO 7560
  906. 7785  IF C=1 THEN SWAP X1,X2 : SWAP Y1,Y2
  907. 7790  RETURN
  908. 7795  '
  909. 7798  '
  910. 7800  '********************************************************************
  911. 7805  '*   Function: This subroutine is to give the code of each point,   *
  912. 7810  '*             according to the method of Cohen & Sutherland.       *
  913. 7820  '********************************************************************
  914. 7822  CODE=0
  915. 7824  IF XX<XMIN THEN CODE=1 ELSE IF XX>XMAX THEN CODE=2
  916. 7826  IF YY<YMIN THEN CODE=CODE+4 ELSE IF YY>YMAX THEN CODE=CODE+8
  917. 7828  '   2 --- 10 ; 4 --- 100 ; 8 --- 1000
  918. 7830  RETURN
  919. 7835  '
  920. 7840  '
  921. 7850  '**********************************************************************
  922. 7851  '*    Function: This subroutine is to draw the numerical diagram.     *
  923. 7852  '**********************************************************************
  924. 7855  L=LEN(STR$(CN))-1
  925. 7858  FOR II=1 TO L
  926. 7860    X0=X1-XMIN+5*(II-L/2-1) : Y0=Y1-YMIN-3
  927. 7862    V=VAL(MID$(STR$(CN),II+1,1))
  928. 7864    IF V=0 THEN PSET(X0,Y0) : DRAW "R3 D6 L3 U6" : GOTO 7878
  929. 7865    ON V GOTO 7866,7867,7868,7869,7870,7871,7872,7873,7874
  930. 7866    PSET(X0+2,Y0) : DRAW "D6" : GOTO 7878
  931. 7867    PSET(X0,Y0) : DRAW "R3 D3 L3 D3 R3" : GOTO 7878
  932. 7868    PSET(X0,Y0) : DRAW "R3 D3 L3 R3 D3 L3" : GOTO 7878
  933. 7869    PSET(X0,Y0) : DRAW "D4 R3 L1 U4 D6" : GOTO 7878
  934. 7870    PSET(X0+3,Y0) : DRAW "L3 D3 R3 D3 L3" : GOTO 7878
  935. 7871    PSET(X0+3,Y0) : DRAW "L3 D6 R3 U3 L3" : GOTO 7878
  936. 7872    PSET(X0,Y0) : DRAW "R3 D6" : GOTO 7878
  937. 7873    PSET(X0,Y0+3) : DRAW "R3 U3 L3 D6 R3 U3" : GOTO 7878
  938. 7874    PSET(X0+3,Y0+3) : DRAW "L3 U3 R3 D6 L3"
  939. 7878  NEXT II
  940. 7880  RETURN
  941. 8000  '***************************************************
  942. 8002  '*                                                 *
  943. 8005  '*     Function: To Draw Network with Plotter.     *
  944. 8008  '*                                                 *
  945. 8010  '***************************************************
  946. 8015  CLS : LOCATE 4,1,0
  947. 8020  INPUT "PRESET*LOCATE<0xE4!>SCREEN*CLOSE>THENLOADWHILESCREENCLS<UNK! {FDB3}><0xDF!> : ",S
  948. 8025  IF S=0 THEN BEEP : GOTO 8020
  949. 8028  PRINT
  950. 8030  INPUT "PRESET*LOCATE<0xE4!>SCREEN*XSTEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NX
  951. 8035  IF NX=0 THEN BEEP : GOTO 8030
  952. 8040  PRINT
  953. 8045  INPUT "PRESET*LOCATE<0xE4!>SCREEN*YSTEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NY
  954. 8050  IF NY=0 THEN BEEP : GOTO 8045
  955. 8065  FOR I=1 TO NY
  956. 8070  YMIN=(I-1)*200 : YMAX=I*200
  957. 8075  FOR J=1 TO NX
  958. 8080  CLS : LOCATE 6,1,0
  959. 8085  INPUT "PRESET*LOCATE<0xE4!>SCREEN*<0xCB!><UNK! {00F9}>SPC(AUTOKEY<UNK! {00FA}>CALLKEY<0xB5!>SOUNDCLOSE>THENLOADLOCATE<UNK! {FDBE}>OFFTAB(SOUNDLOAD<UNK! {FEC3}><UNK! {00FB}>CALLPSET : ",P$
  960. 8090  IF P$="" THEN BEEP :GOTO 8085
  961. 8095  OPEN P$ FOR OUTPUT AS #2
  962. 8100  PRINT #2,":"
  963. 8102  CLS : LOCATE 25,1,0
  964. 8105  LINE (0,0)-(0,199) : LINE -(319,199)
  965. 8110  LINE -(319,0)      : LINE -(0,0)
  966. 8115  PRINT #2, "M 0,0 "
  967. 8120  X1=320*S  :  Y1=200*S
  968. 8125  PRINT #2,"D ";X1;",";0;",";X1;",";Y1;",";0;",";Y1;",";"0 , 0"
  969. 8130  OPEN "NETWORK.DWG" FOR INPUT AS #1
  970. 8135  XMIN=(J-1)*320 : XMAX=J*320
  971. 8140  FOR K=1 TO ND
  972. 8145  INPUT #1,CN,X1,Y1
  973. 8150  X1=X1*NX
  974. 8155  Y1=Y1*NY
  975. 8160  IF X1<XMIN OR X1>XMAX THEN GOTO 8180
  976. 8165  IF Y1<YMIN OR Y1>YMAX THEN GOTO 8180
  977. 8168  CIRCLE (X1-XMIN,Y1-YMIN),8,,0,6.283
  978. 8170  GOSUB 7850
  979. 8171  X1=(X1-XMIN)*S : Y1=(Y1-YMIN)*S
  980. 8172  PRINT #2,"W ";X1;",";Y1,", 50,50 ,0,3600"
  981. 8175  GOSUB 9400
  982. 8180  NEXT K
  983. 8185  FOR K=1 TO M
  984. 8190  INPUT #1,AN$,X1,Y1,X2,Y2,N
  985. 8195  X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  986. 8200  IF N<>1 THEN GOTO 8245
  987. 8205  D=SQR((X2-X1)^2+(Y2-Y1)^2)
  988. 8210  X0=X1+8*(X2-X1)/D : Y0=Y1+8*(Y2-Y1)/D
  989. 8215  X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D
  990. 8220  X1=X0 : Y1=Y0
  991. 8225  GOSUB 7500
  992. 8230  IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN: X22=X2-XMIN : Y22=Y2-YMIN ELSE       GOTO 8240
  993. 8235  R=0 : RP=100 : GOSUB 8600
  994. 8240  GOTO 8315
  995. 8245  D=SQR((X2-X1)^2+(Y2-Y1)^2)
  996. 8250  X1=X1+8*(X2-X1)/D : Y1=Y1+8*(Y2-Y1)/D
  997. 8255  GOSUB 7500
  998. 8260  GOSUB 8850
  999. 8265  INPUT #1,X1,Y1,X2,Y2,N
  1000. 8270  X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  1001. 8275  GOSUB 7500
  1002. 8280  GOSUB 8850
  1003. 8285  INPUT #1,X1,Y1,X2,Y2,N
  1004. 8290  X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  1005. 8295  D=SQR((X2-X1)^2+(Y2-Y1)^2)
  1006. 8300  X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D
  1007. 8305  GOSUB 7500
  1008. 8310  IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN ELSE GOTO 8315
  1009. 8312  R=0 : RP=50 : GOSUB 8600
  1010. 8315  NEXT K
  1011. 8320  FOR K=1 TO DM
  1012. 8325  INPUT #1,X1,Y1,X2,Y2,N
  1013. 8330  X1=X1*NX : Y1=Y1*NY : X2=*NX : Y2=Y2*NY
  1014. 8335  IF N<>1 THEN GOTO 8375
  1015. 8340  IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN :X22=X2-XMIN : Y22=Y2-YMIN : TAG=     0 : GOSUB 6800
  1016. 8345  X0=X1+8*(X2-X1)/D : Y0=Y1+8*(Y2-Y1)/D
  1017. 8350  INPUT #1,X1,Y1,X2,Y2,N
  1018. 8355  X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  1019. 8360  D=SQR((X2-X1)^2+(Y2-Y1)^2)
  1020. 8365  GOSUB 8460
  1021. 8370  IF EXIST=1 THEN X11=X1-XMIN : Y11=Y11-YMIN : X22=X22-XMIN : Y22=Y22-YMIN :
  1022. 8375  INPUT #1,X1,Y1,X2,Y2,N
  1023. 8380  X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY
  1024. 8385  D=SQR((X2-X1)^2+(Y2-Y1)^2)
  1025. 8390  X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D
  1026. 8395  GOSUB 8460
  1027. 8400  IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN :
  1028. 8405  NEXT K
  1029. 8410  CLOSE #1
  1030. 8411  PRINT #2,"J 0"
  1031. 8412  PRINT #2,"M 3850,2800"
  1032. 8414  CLOSE #2
  1033. 8415  DEF SEG=0 : POKE 1050,PEEK (1052)
  1034. 8420  AN$=INKEY$
  1035. 8425  IF AN$="" THEN GOTO 8420
  1036. 8430  SCREEN 0 : SCREEN 1,0 : COLOR 9,0
  1037. 8435  NEXT J
  1038. 8440  NEXT I
  1039. 8445  RETURN
  1040. 8600  D=SQR((X22-X11)^2+(Y22-Y11)^2)
  1041. 8605  IF N=1 THEN XS=(X11-8*(X22-X11)/D)*S : YS=(Y11-8*(Y22-Y11)/D)*S ELSE            XS=X11*S : YS=Y11*S
  1042. 8610  XE=(X22+8*(X22-X11)/D)*S
  1043. 8615  YE=(Y22+8*(Y22-Y11)/D)*S
  1044. 8620  DD=(D+16)*S
  1045. 8625  X0=XS+(DD-50)*(XE-XS)/DD : Y0=YS+(DD-50)*(YE-YS)/DD
  1046. 8630  IF N=1 THEN XS=XS+50*(XE-XS)/DD : YS=YS+50*(YE-YS)/DD
  1047. 8635  XE=X0 :YE=Y0
  1048. 8800  IF CP(EP(K,1),EP(K,2))<>1 THEN GOTO 8820
  1049. 8801  LINE (X11,Y11-1)-(X22,Y22-1),2
  1050. 8802  IF JX<>1 THEN GOSUB 6860
  1051. 8804  LINE (X11,Y11+2)-(X22,Y22+2),2
  1052. 8805  IF JX<>1 THEN GOSUB 6870
  1053. 8806  PRINT #2, "J 2"
  1054. 8808  PRINT #2,"M"; XS;",";YS-5
  1055. 8810  PRINT #2, "D";XE;",";YE-5
  1056. 8811  IF JX<>1 THEN GOSUB 9000
  1057. 8812  PRINT #2,"M"; XS;",";YS+5
  1058. 8814  PRINT #2,"D"; XE;",";YE+5
  1059. 8815  IF JX<>1 THEN GOSUB 9100
  1060. 8816  PRINT #2, "J 1"
  1061. 8818  GOTO 8830
  1062. 8820  LINE (X11,Y11)-(X22,Y22)
  1063. 8821  IF JX<>1 THEN GOSUB 6860 : GOSUB 6870
  1064. 8822  PRINT #2, "M ";XS;",";YS
  1065. 8824  PRINT #2, "D ";XE;",";YE
  1066. 8826  IF JX<>1 THEN GOSUB 9000 : GOSUB 9100
  1067. 8830  RETURN
  1068. 8850  IF EXIST=1 AND CP(EP(K,1),EP(K,2))=1 GOTO 8860
  1069. 8852  IF EXIST=1 THEN LINE (X1-XMIN,Y1-YMIN)-(X2-XMIN,Y2-YMIN)
  1070. 8854  PRINT #2,"M";(X1-XMIN)*S;",";(Y1-YMIN)*S
  1071. 8856  PRINT #2,"D";(X2-XMIN)*S;",";(Y2-YMIN)*S
  1072. 8858  GOTO 8880
  1073. 8860  LINE (X1-XMIN,Y1-YMIN-1)-(X2-XMIN,Y2-YMIN-1),2
  1074. 8862  LINE (X1-XMIN,Y1-YMIN+2)-(X2-XMIN,Y2-YMIN+2),2
  1075. 8864  PRINT #2,"J 2"
  1076. 8866  PRINT #2,"M";(X1-XMIN)*S;",";(Y1-YMIN-1)*S
  1077. 8870  PRINT #2,"D",(X2-XMIN)*S;",";(Y2-YMIN-1)*S
  1078. 8872  PRINT #2,"M";(X1-XMIN)*S;",";(Y1-YMIN+2)*S
  1079. 8874  PRINT #2,"D";(X2-XMIN)*S;",";(Y2-YMIN+2)*S
  1080. 8876  PRINT #2,"J 1"
  1081. 8880  RETURN
  1082. 9000  X0=(XS-XE)*0.866-(YS-YE)*0.5+XE
  1083. 9005  Y0=(XS-XE)*0.5+(YS-YE)*0.866+YE
  1084. 9010  PRINT #2,"M"; XE;",";YE
  1085. 9015  PRINT #2,"D";XE+20*(X0-XE)/(DD-RP);",";YE+20*(Y0-YE)/(DD-RP)
  1086. 9020  RETURN
  1087. 9100  X0=(XS-XE)*0.866+(YS-YE)*0.5+XE
  1088. 9105  Y0=-(XS-XE)*0.5+(YS-YE)*0.866+YE
  1089. 9110  PRINT #2,"M "; XE;",";YE
  1090. 9115  PRINT #2,"D "; XE+20*(X0-XE)/(DD-RP);",";YE+20*(Y0-YE)/(DD-RP)
  1091. 9120  RETURN
  1092. 9400  L=LEN(STR$(CN))-1
  1093. 9405  FOR II=1 TO L
  1094. 9410  X0=X1+20*(II-L/2-1) : Y0=Y1+15
  1095. 9415  V=VAL(MID$(STR$(CN),II+1,1))
  1096. 9420  IF V=0 THEN PRINT #2,"M";X0;",";Y0 : PRINT #2,"I 16,0,0,-30,-16,0,0,30 " :      GOTO 9480
  1097. 9425  ON V GOTO 9430,9435,9440,9445,9450,9455,9460,9465,9470
  1098. 9430  PRINT #2, "M "; X0+8;",";Y0 : PRINT #2,"I 0,-30 " : GOTO 9480
  1099. 9435  PRINT #2, "M "; X0;",";Y0 : PRINT #2, "I 16,0,0,-16,-16,0,0,-16,16,0 " :        GOTO 9480
  1100. 9440  PRINT #2, "M "; X0;",";Y0 : PRINT #2, "I 16,0,0,-30,-16,0,16,0,0,16,-16,0"      : GOTO 9480
  1101. 9445  PRINT #2, "M ";X0;",";Y0 : PRINT #2, "I 0,-20,20,0,-10,0,0,20,0,-30 " :        GOTO 9480
  1102. 9450  PRINT #2, "M "; X0+16;",";Y0 : PRINT #2, "I -16,0,0,-16,16,0,0,-16,-16,0 "      : GOTO 9480
  1103. 9455  PRINT #2, "M ";X0+16;",";Y0 : PRINT #2, "I -16,0,0,-30,16,0,0,16,-16,0" :       GOTO 9480
  1104. 9460  PRINT #2, "M ";X0;",";Y0 : PRINT #2, "I 16,0,0,-30 " : GOTO 9480
  1105. 9465  PRINT #2, "M ";X0;",";Y0 : PRINT #2, "I 16,0,0,-30,-16,0,0,30,0,-16,16,0 ":     GOTO 9480
  1106. 9470  PRINT #2, "M ";X0+16;",";Y0-16:PRINT #2, "I -16,0,0,16,16,0,0,-30,-16,0 "
  1107. 9480  NEXT II
  1108. 9490  RETURN
  1109.