home *** CD-ROM | disk | FTP | other *** search
Wrap
GW-BASIC | 1980-01-01 | 33.3 KB | 1,109 lines
1000 '********************************************************************** 1002 '* THENLOAD STEPEQV SPC(PRESET OPTIONRESUME STRING$<UNK! {00FA}> THEN<UNK! {00F8}> BSAVE= WRITESTRING$ TAB(<UNK! {00F6}> STEP<0xB5!> THENCALL * 1005 '* TAB(SOUNDLOAD<UNK! {FEC3}><UNK! {00FB}>CALLPSET: PERT.BAS * 1006 '* WHILE<0xE0!>CALLTOSCREEN<0xCB!>ERLWHILE: STRING$POINT BLOAD<UNK! {00F7}> * 1007 '* WHILE<0xE0!>CALLTOSCREENERRPSETVARPTR: 1987.12 * 1008 '* STRING$USR RANDOMIZE<UNK! {00FA}> KEY< WHILEOPTION RANDOMIZEPOINT CLS^ BEEP<0xE0!> FN<0xB5!> STRING$USR USRSOUND * 1010 '********************************************************************** 1015 '* Graphic Aided Network Analysing System * 1018 '* Filename: PERT.BAS * 1020 '* Programmed by Chou Ming, 1987.12. * 1022 '* China Research and Education Center Of Plant Engineering * 1025 '********************************************************************** 1030 KEY OFF : SCREEN 1,0 : COLOR 9,0 1032 OPTION BASE 1 1034 'GOSUB 1100 ' the head of the program 1035 CLS 1036 PRINT : PRINT "********** THEN<UNK! {00F8}> BSAVE= RANDOMIZE> CLOSEDEFSNG ***********" 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!>" 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}>" 1039 PRINT "C. THEN<UNK! {00F8}>BSAVE=LOCATE<UNK! {FDBE}>OFF<0xB5!>SOUNDUSRINKEY$OPTIONSOUND I. CLOSE>STRING$PSETTHEN<UNK! {00F8}>BSAVE=THENLOAD" 1040 PRINT "D. <0xB4!>><0xB4!>TRONTHEN<UNK! {00F8}>BSAVE=LOCATE<UNK! {FDBE}>OFF J. LOCATE<0xE4!>CALL<UNK! {00F6}>THEN<UNK! {00F8}>BSAVE=THENLOAD" 1041 PRINT "E. <0xB4!>IMPNOTELSECLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDMERGEVARPTR<0xB5!><0xE3!>WHILE<0xE0!>OPENBEEP K. <0xB5!><UNK! {00F7}>NOTBLOADCLOSE>THENLOADCLOSE<UNK! {00FA}>" 1042 PRINT "F. <0xB4!>IMPNOTELSELOCATE<0xE4!>CALL<UNK! {00F6}>WHILERESUMEOPTION> L. THEN<0xCB!>CALL<UNK! {00F6}>STEP<0xB5!>THENCALL" 1043 PRINT "***************************************" 1044 PRINT "PRESET*LOCATE<0xE4!>SCREEN*SOUND<UNK! {00FA}><0xCB!><UNK! {00F9}>FNELSENOTBLOADRANDOMIZEEDITSOUNDPOINT<0xB5!>SOUND<0xB4!><UNK! {00FA}>OPENBEEP: "; 1045 'DEF SEG=0 : POKE 1050,PEEK(1052) 1046 AN$=INKEY$ 1047 IF AN$="" THEN GOTO 1046 1048 IF AN$<>CHR$(13) THEN PRINT AN$; 1049 IF AN$>="A" AND AN$<="L" OR AN$>="a" AND AN$<="l" THEN GOTO 1055 1050 BEEP : LOCATE 10,1,0 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 1052 GOTO 1045 1055 IF AN$>="a" THEN CODE=ASC(AN$)-96 ELSE CODE=ASC(AN$)-64 1056 IF CODE=12 THEN GOTO 1060 1057 ON CODE GOSUB 1200,1500,1600,1800,4200,4400,4500,4800,5800,7000,8000 1058 GOTO 1035 1060 CLS 1065 END 1068 ' 1070 ' 1100 '********************************************************************* 1105 '* Function: This subroutine is to display some information * 1110 '* on the screen, and from that the user knows * 1115 '* that the program is being started now. * 1120 '********************************************************************* 1140 CLS : LOCATE 4,4,0 1145 PRINT "THENLOAD STEPEQV SPC(PRESET OPTIONRESUME STRING$<UNK! {00FA}> THEN<UNK! {00F8}> BSAVE= WRITESTRING$ TAB(<UNK! {00F6}> STEP<0xB5!> THENCALL" 1150 LOCATE 5,14,0 1155 PRINT "Version 1.0" 1156 LOCATE 6,16,0 1158 PRINT "1987.12" 1160 LOCATE 9,10,0 1165 PRINT "STRING$USRRANDOMIZE<UNK! {00FA}>KEY<WHILEOPTIONRANDOMIZEPOINTCLS^BEEP<0xE0!>FN<0xB5!>STRING$USRUSRSOUND" 1166 LOCATE 25,1,0 1168 DEF SEG=0 : POKE 1050,PEEK(1052) 1170 AN$=INKEY$ 1180 IF AN$="" THEN GOTO 1170 1190 RETURN 1195 ' 1198 ' 1200 '********************************************************************* 1205 '* Function: This subroutine is to input source data of network * 1210 '* with keyboard,as resulting of this, codes of acti- * 1215 '* vities and events, and the adjacency matrix of this * 1218 '* network being obtained. * 1220 '********************************************************************* 1225 IF M<>0 THEN ERASE AC$,AN,D,EP,AD,AA,HM$,SM$ 1226 IF DM<>0 THEN ERASE DU 1228 IF PN<>0 THEN ERASE PA$ 1230 CLS : LOCATE 5,1,0 1235 INPUT "PRESET*LOCATE<0xE4!>SCREEN*STEPANDSOUNDCOLORBLOAD<UNK! {00FB}>CALLPSET: ",XM$ : PRINT 1240 INPUT "PRESET*LOCATE<0xE4!>SCREEN*CLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDUSINGPOINTLOCATE<UNK! {FDC4}>COLOR: ",M 1245 IF M=0 THEN BEEP : GOTO 1240 1255 DIM AC$(M),AN(M),D(M),HM$(M),SM$(M) 1256 OPEN "AC.PRE" FOR OUTPUT AS #1 1258 PN=0 1260 FOR I=1 TO M 1270 CLS : LOCATE 3,1,0 1272 PRINT "PRESET*LOCATE<0xE4!>SCREEN*<0xB5!>VARPTR";I;"OPTION<UNK! {00F6}>CLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDBLOAD<UNK! {00FB}>CALLPSET:"; 1274 INPUT " ",HM$(I) 1275 INPUT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDLOCATEDELETERANDOMIZESWAP<0xB5!>ERASETAB(CLOSEBLOAD<UNK! {00FB}>CALLPSET:",SM$(I) 1280 PRINT : PRINT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUND<0xB4!><UNK! {00FA}>OPENBEEP:"; 1290 INPUT " ",AC$(I) 1291 IF AC$(I)="" THEN BEEP : GOTO 1280 1292 PRINT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDMOTORCOLORSTRING$<0xB5!>:"; 1294 INPUT " ",D(I) 1295 IF M=1 THEN GOTO 1380 1298 IF I=1 THEN AN(1)=0 : GOTO 1370 1300 PRINT "PRESET*LOCATE<0xE4!>SCREEN*OPTIONBLOADCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUNDMERGE\PRESETLINECLOSEAND<0xB6!>DEFDBLLOCATE<UNK! {FDC4}>COLOR:"; 1310 INPUT " ",AN(I) 1315 PRINT 1320 FOR J=1 TO AN(I) 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:"; 1340 INPUT " ",F$ 1342 IF F$="" THEN BEEP : GOTO 1330 1345 WRITE #1,F$ 1350 PN=PN+1 1360 NEXT J 1370 NEXT I 1372 CLOSE #1 1375 IF PN=0 THEN GOTO 1395 1380 DIM PA$(PN) 1382 OPEN "AC.PRE" FOR INPUT AS #1 1385 FOR I=1 TO PN 1386 INPUT #1,PA$(I) 1388 NEXT I 1390 CLOSE #1 1395 KILL "AC.PRE" 1396 ' 1398 ' 1400 CLS : LOCATE 1,7,0 1405 PRINT "*** LOCATE<0xE4!> SCREEN* LOCATE<UNK! {FD20}>SAVEOFF LOAD/ WEND+ ***" 1410 PRINT 1415 R=2 : N=1 1420 FOR I=1 TO M 1425 R=R+1 1430 IF R<=10 THEN GOTO 1445 1435 IF INKEY$=CHR$(13) THEN CLS : R=2 : GOTO 1445 1440 GOTO 1435 1445 LOCATE R,4,0 1450 PRINT "CLOSEAND<0xB6!>DEFDBL<0xB4!><UNK! {00FA}>OPENBEEP: "+AC$(I)+" MERGE\PRESETLINECLOSEAND<0xB6!>DEFDBL: "; 1455 FOR J=N TO AN(I)+N-1 1460 IF J=N THEN PRINT PA$(J); ELSE PRINT ", "+PA$(J); 1465 NEXT J 1470 N=N+AN(I) 1475 NEXT I 1476 ' 1478 ' 1480 GOSUB 2500 1490 RETURN 1495 ' 1496 ' 1500 '********************************************************************* 1501 '* Function: This subroutine is to input source data of network * 1502 '* with data file, as resulting of this, codes of acti- * 1503 '* vities and events, and the adjacency matrix of this * 1504 '* network being obtained. * 1505 '********************************************************************* 1506 IF M<>0 THEN ERASE AC$,AN,D,EP,AD,AA,HM$,SM$ 1507 IF DM<>0 THEN ERASE DU 1508 IF PN<>0 THEN ERASE PA$ 1510 CLS : LOCATE 6,1,0 1511 INPUT "PRESET*LOCATE<0xE4!>SCREEN*LOCATE<UNK! {FDBE}>OFFTAB(SOUNDLOAD<UNK! {FEC3}><UNK! {00FB}>CALLPSET: ",FF$ 1512 IF FF$="" THEN BEEP : GOTO 1511 1515 FF$=FF$+".NET" 1516 OPEN FF$ FOR INPUT AS #1 1517 INPUT #1,XM$,M,PN 1518 DIM AC$(M),AN(M),D(M),HM$(M),SM$(M) 1519 IF PN<>0 THEN DIM PA$(PN) 1520 K=0 1521 FOR I=1 TO M 1522 INPUT #1,HM$(I),SM$(I) 1523 INPUT #1,AC$(I),D(I),AN(I) 1524 FOR J=1 TO AN(I) 1525 K=K+1 : INPUT #1,PA$(K) 1526 NEXT J 1527 NEXT I 1528 CLOSE #1 1530 GOSUB 2500 1535 RETURN 1536 ' 1538 ' 1600 '********************************************************************* 1602 '* Function: This subroutine is to modify the network data. * 1605 '********************************************************************* 1610 CLS : LOCATE 5,1,0 1615 INPUT "PRESET*LOCATE<0xE4!>SCREEN*USR<SPC(AUTOUSRINKEY$OPTIONSOUND<0xB5!>SOUNDCLOSEAND<0xB6!>DEFDBL<0xB5!>SOUND<0xB4!><UNK! {00FA}>OPENBEEP: ",FF$ 1618 IF FF$="" THEN BEEP : GOTO 1615 1620 FOR I=1 TO M 1622 IF AC$(I)=FF$ THEN K=I : GOTO 1625 1624 NEXT I 1625 PRINT 1628 PRINT "CLOSEAND<0xB6!>DEFDBL "+AC$(K)+" <0xB5!>SOUNDSAVEKEYMOTORCOLORSTRING$<0xB5!>TAB(AUTO:";D(K) 1629 PRINT "PRESET*LOCATE<0xE4!>SCREEN* "+AC$(K)+" <0xB5!>SOUNDUSRBSAVEMOTORCOLORSTRING$<0xB5!>:"; 1630 INPUT " ",D(K) 1631 AA(EP(K,1),EP(K,2))=D(K) 1632 PRINT 1635 PRINT "CLOSERANDOMIZENOTUSRUSR<SPC(AUTOUSRINKEY$OPTIONSOUND<0xB5!>SOUNDCLOSEAND<0xB6!>DEFDBLBSAVEXOR ?(Y/N): "; 1638 DEF SEG=0 : POKE 1050,PEEK(1052) 1640 AN$=INPUT$(1) 1642 IF AN$="Y" OR AN$="y" THEN PRINT "Yes"; : GOTO 1610 1645 RETURN 1650 ' 1660 ' 1800 '********************************************************************* 1801 '* Function: This subroutine is to store the network data so that * 1802 '* it can be called simply. * 1805 '********************************************************************* 1810 CLS : LOCATE 6,1,0 1815 INPUT "PRESET*LOCATE<0xE4!>SCREEN*LOCATE<UNK! {FDBE}>OFFTAB(SOUNDLOAD<UNK! {FEC3}><UNK! {00FB}>CALLPSET: ",FF$ 1816 IF FF$="" THEN BEEP : GOTO 1815 1818 FF$=FF$+".NET" 1820 OPEN FF$ FOR OUTPUT AS #1 1828 PRINT #1,XM$+",";M;",";PN 1829 N=1 1830 FOR I=1 TO M 1832 PRINT #1,HM$(I)+","+SM$(I) 1835 PRINT #1,AC$(I)+",";D(I);",";AN(I); 1838 IF AN(I)=0 THEN PRINT #1,"" : GOTO 1850 1840 FOR J=N TO AN(I)+N-1 1842 IF J=AN(I)+N-1 THEN PRINT #1,","+PA$(J) ELSE PRINT #1,","+PA$(J); 1845 NEXT J 1848 N=N+AN(I) 1850 NEXT I 1852 CLOSE #1 1855 RETURN 1858 ' 1860 ' 2500 '********************************************************************* 2501 '* Function: This subroutine is to transfer logical network data * 2502 '* into adjacency matrix. * 2505 '********************************************************************* 2510 DIM EP(M,2) 2515 ND=1 ' node=1 2520 N=1 : DM=0 : AL=0 2540 FOR I=1 TO M 2550 IF AN(I)<>0 THEN GOTO 2574 2560 ND=ND+1 2570 EP(I,1)=1 : EP(I,2)=ND ' the starting point of network 2572 GOTO 2900 2574 DIM PP(AN(I)),DD(AN(I)) 2575 IF DM=0 THEN GOTO 2580 2576 DIM DP(DM,2) 2577 FOR J=1 TO DM 2578 DP(J,1)=DU(J,1) : DP(J,2)=DU(J,2) 2579 NEXT J 2580 IF AN(I)<>1 THEN GOTO 2660 2585 FOR J=1 TO M 2588 IF AC$(J)=PA$(N) THEN PP(1)=J : GOTO 2600 2590 NEXT J 2600 GOSUB 3940 2630 EP(I,1)=EP(PP(1),2) 2635 ND=ND+1 : EP(I,2)=ND 2636 IF DM<>0 THEN ERASE DP 2638 ERASE PP,DD 2640 GOTO 2900 2660 FOR J=N TO AN(I)+N-1 2670 FOR K=1 TO M 2680 IF AC$(K)=PA$(J) THEN PP(J-N+1)=K : GOTO 2700 2690 NEXT K 2700 NEXT J 2701 GOSUB 3940 2702 PMAX=PP(AN(I)) : MAX=EP(PMAX,2) 2704 FOR J=AN(I)-1 TO 1 STEP -1 2706 IF EP(PP(J),2)>MAX THEN PMAX=PP(J) : MAX=EP(PMAX,2) 2708 NEXT J 2709 RD=0 2710 FOR J=1 TO AN(I) 2715 IF EP(PP(J),2)=EP(PMAX,2) THEN GOTO 2780 2718 FOR L=1 TO I-1 2720 IF EP(L,1)=EP(PP(J),2) THEN RD=RD+1 : DD(RD)=EP(PP(J),2) : GOTO 2780 2722 NEXT L 2724 FOR L=1 TO DM 2725 IF DP(L,1)=EP(PP(J),2) THEN RD=RD+1 : DD(RD)=EP(PP(J),2) : GOTO 2780 2726 NEXT L 2727 FOR K=1 TO J 2728 IF K=J AND EP(PP(K),1)<>EP(PMAX,1) THEN GOTO 2738 2730 IF EP(PP(J),1)<>EP(PP(K),1) THEN GOTO 2738 2734 RD=RD+1 2735 DD(RD)=EP(PP(J),2) 2736 GOTO 2780 2738 NEXT K 2740 ND=ND-1 : MAX=MAX-1 2741 PV=EP(PP(J),2) 2742 FOR K=1 TO I-1 2748 IF EP(K,1)>PV THEN EP(K,1)=EP(K,1)-1 2750 IF EP(K,2)>PV THEN EP(K,2)=EP(K,2)-1 2752 NEXT K 2754 FOR K=1 TO RD 2756 IF DD(K)>PV THEN DD(K)=DD(K)-1 2758 NEXT K 2760 FOR K=1 TO DM 2766 IF DP(K,1)>PV THEN DP(K,1)=DP(K,1)-1 2768 IF DP(K,2)>PV THEN DP(K,2)=DP(K,2)-1 2770 NEXT K 2775 EP(PP(J),2)=MAX 2780 NEXT J 2790 GOSUB 3900 2840 EP(I,1)=EP(PMAX,2) 2850 ND=ND+1 : EP(I,2)=ND 2860 ERASE PP,DD 2900 N=N+AN(I) 3000 NEXT I 3010 ' 3020 ' 3400 IF DM=0 THEN GOTO 3407 3402 DIM DP(DM,2) 3404 FOR I=1 TO DM 3405 DP(I,1)=DU(I,1) : DP(I,2)=DU(I,2) 3406 NEXT I 3407 OPEN "NODE.FIN" FOR OUTPUT AS #2 3408 RD=0 : K=0 3410 FOR I=1 TO ND 3420 FOR J=1 TO M 3430 IF EP(J,1)=I THEN GOTO 3450 3440 NEXT J 3442 FOR J=1 TO DM 3444 IF DP(J,1)=I THEN GOTO 3450 3445 NEXT J 3446 K=K+1 3448 WRITE #2,I 3450 NEXT I 3455 CLOSE #2 3458 IF K=1 THEN GOTO 3670 3465 DIM PP(K),FD(K),DD(K) 3470 OPEN "NODE.FIN" FOR INPUT AS #2 3480 FOR I=1 TO K 3490 INPUT #2,FD(I) 3500 NEXT I 3505 CLOSE #2 3520 FOR I=1 TO K 3530 FOR J=1 TO M 3540 IF EP(J,2)=FD(I) THEN PP(I)=J : GOTO 3550 3545 NEXT J 3550 NEXT I 3562 MAX=FD(K) : PMAX=K 3564 FOR I=K-1 TO 1 STEP -1 3566 IF FD(I)>MAX THEN MAX=FD(I) : PMAX=I 3568 NEXT I 3570 FOR I=1 TO K 3575 IF I=PMAX THEN GOTO 3650 3580 FOR J=1 TO I 3582 IF J=I AND EP(PP(J),1)<>EP(PP(PMAX),1) THEN GOTO 3592 3584 IF EP(PP(I),1)<>EP(PP(J),1) THEN GOTO 3592 3586 RD=RD+1 3588 DD(RD)=EP(PP(I),2) 3590 GOTO 3650 3592 NEXT J 3594 ND=ND-1 : MAX=MAX-1 3596 PV=EP(PP(I),2) 3598 FOR J=1 TO M 3600 IF EP(J,1)>PV THEN EP(J,1)=EP(J,1)-1 3604 IF EP(J,2)>PV THEN EP(J,2)=EP(J,2)-1 3606 NEXT J 3607 FOR J=1 TO DM 3608 IF DP(J,1)>PV THEN DP(J,1)=DP(J,1)-1 3609 IF DP(J,2)>PV THEN DP(J,2)=DP(J,2)-1 3610 NEXT J 3612 FOR J=1 TO RD 3614 IF DD(J)>PV THEN DD(J)=DD(J)-1 3616 NEXT J 3620 EP(PP(I),2)=MAX 3650 NEXT I 3660 ERASE PP,FD 3670 KILL "NODE.FIN" 3680 ' 3690 ' 3700 IF DM+RD=0 THEN GOTO 3800 3710 IF DM<>0 THEN ERASE DU 3720 DIM DU(DM+RD,2) 3730 FOR I=1 TO DM 3740 DU(I,1)=DP(I,1) : DU(I,2)=DP(I,2) 3750 NEXT I 3752 IF DM<>0 THEN ERASE DP 3754 FOR I=1 TO RD 3758 DU(DM+I,1)=DD(I) : DU(DM+I,2)=MAX 3760 NEXT I 3762 DM=DM+RD 3764 IF RD<>0 THEN ERASE DD 3765 ' 3768 ' 3800 DIM AD(ND,ND),AA(ND,ND) 3820 FOR I=1 TO M 3830 AD(EP(I,1),EP(I,2))=1 : AA(EP(I,1),EP(I,2))=D(I) 3840 NEXT I 3850 FOR I=1 TO DM 3860 AD(DU(I,1),DU(I,2))=-1 3870 NEXT I 3872 IF CC=1 THEN ERASE CP 3874 DIM CP(ND,ND) : CC=1 3890 RETURN 3895 ' 3898 ' 3900 IF DM+RD=0 THEN GOTO 3935 3905 IF DM<>0 THEN ERASE DU 3910 DIM DU(DM+RD,2) 3912 FOR J=1 TO DM 3914 DU(J,1)=DP(J,1) : DU(J,2)=DP(J,2) 3916 NEXT J 3918 IF DM<>0 THEN ERASE DP 3920 L=0 3922 FOR J=1 TO RD 3924 FOR K=1 TO DM 3925 IF DU(K,1)=DD(J) AND DU(K,2)=MAX THEN L=L+1 : GOTO 3930 3926 NEXT K 3928 DU(DM+J-L,1)=DD(J) : DU(DM+J-L,2)=MAX 3930 NEXT J 3932 DM=DM+RD-L 3935 RETURN 3936 ' 3938 ' 3940 FOR J=1 TO AN(I) 3941 FOR K=1 TO I-1 3942 IF EP(K,2)<>EP(PP(J),2) THEN GOTO 3948 3943 IF EP(K,1)=EP(PP(J),1) THEN GOTO 3948 3944 FOR JJ=1 TO AN(I) 3945 IF EP(K,1)=EP(PP(JJ),1) AND EP(K,2)=EP(PP(JJ),2) THEN GOTO 3948 3946 NEXT JJ 3947 GOTO 3972 3948 NEXT K 3949 FOR K=1 TO DM 3950 IF DP(K,2)<>EP(PP(J),2) THEN GOTO 3960 3951 FOR JJ=1 TO I-1 3952 IF EP(JJ,2)<>DP(K,1) THEN GOTO 3958 3953 FOR KK=1 TO AN(I) 3954 IF EP(JJ,1)=EP(PP(KK),1) AND EP(JJ,2)=EP(PP(KK),2) THEN GOTO 3958 3956 NEXT KK 3957 GOTO 3972 3958 NEXT JJ 3960 NEXT K 3962 GOTO 4020 3972 RD=1 : DD(RD)=EP(PP(J),2) : MAX=EP(PP(J),2)+1 3974 PV=EP(PP(J),2) 3976 FOR K=1 TO I-1 3978 IF EP(K,1)>=PV THEN EP(K,1)=EP(K,1)+1 3980 IF EP(K,2)>=PV THEN EP(K,2)=EP(K,2)+1 3982 NEXT K 3984 FOR K=1 TO DM 3986 IF DP(K,1)>=PV THEN DP(K,1)=DP(K,1)+1 3988 IF DP(K,2)>=PV THEN DP(K,2)=DP(K,2)+1 3990 NEXT K 3992 FOR K=1 TO AN(I) 3994 IF EP(PP(K),2)=DD(RD)+1 THEN EP(PP(K),2)=DD(RD) 3996 NEXT K 3998 ND=ND+1 4000 GOSUB 3900 4001 IF DM=0 THEN GOTO 4020 4002 DIM DP(DM,2) 4004 FOR K=1 TO DM 4006 DP(K,1)=DU(K,1) : DP(K,2)=DU(K,2) 4008 NEXT K 4020 NEXT J 4025 RETURN 4028 ' 4030 ' 4200 '******************************************************************** 4205 '* Function: This subroutine is to print the codes of activities * 4210 '* corresponding with nodes, or, with events. * 4220 '******************************************************************** 4240 CLS : LOCATE 5,8,0 4245 PRINT "ERR<UNK! {FDD4}>VARPTR<0xB4!>IMPNOTELSE , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0 4270 LPRINT:LPRINT:LPRINT:LPRINT:LPRINT 4275 LPRINT TAB(20),"*** OPTION<UNK! {00F7}>CLOSEAND<0xB6!>DEFDBL<0xB6!>ERLNOTEDIT<0xB5!>SOUNDMERGEVARPTR<0xB5!><0xE3!>WHILE<0xE0!>OPENBEEP ***" : LPRINT : LPRINT 4280 FOR I=1 TO M STEP 2 4290 LPRINT TAB(10),AC$(I)+" -- ( ";EP(I,1);" , ";EP(I,2);" )"; 4295 IF I<>M THEN LPRINT TAB(50),AC$(I+1)+" -- ( ";EP(I+1,1);" , ";EP(I+1,2);" ) " 4300 NEXT I 4315 LPRINT : LPRINT 4316 IF DM=0 THEN GOTO 4370 4320 LPRINT : LPRINT TAB(25),"*** USR+ CLOSEAND <0xB6!>DEFDBL ***" 4330 LPRINT : LPRINT 4340 FOR I=1 TO DM STEP 2 4350 LPRINT TAB(5),"( ";DU(I,1);" , ";DU(I,2);" )"; 4360 IF I<>DM THEN LPRINT TAB(55),"( ";DU(I+1,1);" , ";DU(I+1,2);" ) " 4364 NEXT I 4365 LPRINT 4370 RETURN 4380 ' 4390 ' 4400 '********************************************************************* 4401 '* Function: This subroutine is to print the output report. * 4405 '********************************************************************* 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 4408 WIDTH "LPT1:",250 : CLS : LOCATE 5,8,0 4410 PRINT "ERR<UNK! {FDD4}>VARPTR<0xB4!>IMPNOTELSE , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0 4412 LPRINT:LPRINT:LPRINT:LPRINT:LPRINT 4415 LPRINT CHR$(27)+"ID",TAB(33);"THEN<UNK! {00F8}>BSAVE=RANDOMIZE>CLOSEDEFDBLLOCATE<0xE4!>CALL<UNK! {00F6}>WHILERESUMEOPTION>" 4416 LPRINT TAB(30);"==================";CHR$(27)+"IA" 4418 LPRINT TAB(4);"STEPAND SOUNDCOLOR BLOAD<UNK! {00FB}> CALLPSET : ";XM$, 4420 LPRINT TAB(122);"USINGPOINT USING<UNK! {00F7}> SPC(<0xB5!> STRING$POINT PSETVARPTR : ";TE(ND) 4422 LPRINT "DELETELINEDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETEUSR"; 4423 LPRINT "DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSR"; 4424 LPRINT "DELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETEUSRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETE<0xB4!>" 4425 LPRINT "DELETEEDIT USRIMP DELETEEDIT CLOSEAND <0xB6!>DEFDBL DELETEEDITCLOSEAND<0xB6!>DEFDBLDELETEEDIT <0xB6!>ERLNOTEDITMERGE<0xE1!><0xB5!><0xE3!> DELETEEDITUSING<UNK! {00F7}>SPC(<0xB5!>MOTORCOLORDELETEEDIT"; 4426 LPRINT " LOCATEDELETE RANDOMIZESWAP DELETEEDIT MERGE\ PRESETLINE DELETEEDITUSINGANDERL=COLORKEYSOUNDPOINTDELETEEDITUSINGANDCALL'WHILEINSTRUSR*DELETEEDITUSINGANDERL=COLORKEYSOUNDPOINTDELETEEDIT"; 4427 LPRINT "USINGANDCALL'WHILEINSTRUSR*DELETEEDITUSINGPOINTLOCATEWHILEWENDANDDELETEEDIT<0xB5!>ERASELOCATEWHILEWENDANDDELETEEDITRANDOMIZEINSTRLOAD<UNK! {00FC}>CLOSEAND<0xB6!>DEFDBLDELETEEDIT" 4428 LPRINT "DELETEEDIT OPENBEEP DELETEEDIT BLOAD<UNK! {00FB}> CALLPSET DELETEEDIT<0xB4!><UNK! {00FA}>OPENBEEPDELETEEDIT WHILE<0xE0!> OPENBEEP DELETEEDIT ( ) DELETEEDIT"; 4429 LPRINT " <0xB5!>ERASE TAB(CLOSE DELETEEDIT CLOSEAND <0xB6!>DEFDBL DELETEEDITCOLORAUTORANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDITCOLORAUTORANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDITTHEN-RANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDIT"; 4430 LPRINT "THEN-RANDOMIZESWAPLOCATEWHILELOAD<0xE4!>DELETEEDIT TROFFSPC( DELETEEDIT TROFFIMP DELETEEDITWHILE-LOADPRESET(ELSETO)DELETEEDIT" 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" 4434 N=1 4435 FOR I=1 TO M 4436 LPRINT X$ 4438 LPRINT "DELETEEDIT";I;TAB(7);"DELETEEDIT";HM$(I);TAB(29);"DELETEEDIT ";AC$(I); 4439 LPRINT TAB(35);"DELETEEDIT";EP(I,1);TAB(41);"ELSE<UNK! {00FA}>";EP(I,2);TAB(47);"DELETEEDIT ";D(I); 4440 LPRINT TAB(55);"DELETEEDIT";SM$(I);TAB(73);"DELETEEDIT"; 4444 FOR J=N TO AN(I)+N-1 4446 IF J=N THEN LPRINT PA$(J); ELSE LPRINT ", "+PA$(J); 4448 NEXT J 4449 N=N+AN(I) 4450 LPRINT TAB(83);"DELETEEDIT ";TE(EP(I,1)); 4452 LPRINT TAB(93);"DELETEEDIT ";TL(EP(I,2))-AA(EP(I,1),EP(I,2)); 4454 LPRINT TAB(103);"DELETEEDIT ";TE(EP(I,1))+AA(EP(I,1),EP(I,2)); 4455 LPRINT TAB(113);"DELETEEDIT ";TL(EP(I,2)); 4456 LPRINT TAB(123);"DELETEEDIT ";R1(EP(I,1),EP(I,2)); 4458 LPRINT TAB(131);"DELETEEDIT ";R2(EP(I,1),EP(I,2));TAB(139); 4460 IF CP(EP(I,1),EP(I,2))=1 THEN LPRINT "DELETEEDIT ELSETO DELETEEDIT" ELSE LPRINT "DELETEEDIT DELETEEDIT" 4465 NEXT I 4490 LPRINT "DELETEOPTIONDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETEINSTRDELETESWAPDELETESWAPDELETESWAPDELETESWAPDELETELOAD" 4492 LPRINT 4494 RETURN 4496 ' 4498 ' 4500 '********************************************************************* 4502 '* Function: This subroutine is to print the Critical Path. * 4505 '********************************************************************* 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 4510 CLS : LOCATE 5,8,0 4512 PRINT "ERR<UNK! {FDD4}>VARPTR<0xB4!>IMPNOTELSE , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0 4514 LPRINT:LPRINT:LPRINT:LPRINT:LPRINT 4515 LPRINT "WHILESAVETHEN<UNK! {00F8}>BSAVE=STRING$USRSPC(ERLSTEPBSAVECLOSEAND<0xB6!>DEFDBLTAB(AUTORANDOMIZEINSTRLOAD<UNK! {00FC}>BSAVEWRITESAVE<0xB6!>KEYSTEP<0xB5!>SOUNDCLOSEAND<0xB6!>DEFDBL :" : LPRINT 4520 R=1 4525 FOR I=1 TO M 4530 IF R1(EP(I,1),EP(I,2))<>0 OR R2(EP(I,1),EP(I,2))<>0 THEN GOTO 4545 4535 IF R=46 OR I=M THEN LPRINT TAB(R);AC$(I) : R=1 : GOTO 4545 4540 LPRINT TAB(R);AC$(I);","; : R=R+5 4545 NEXT I 4546 LPRINT : GOTO 4555 4547 LOCATE 25,1,0 4548 DEF SEG=0 : POKE 1050,PEEK(1052) 4550 AN$=INKEY$ 4552 IF AN$="" THEN GOTO 4550 4555 RETURN 4558 ' 4560 ' 4800 '********************************************************************** 4801 '* Function: This subroutine is the PERT/CPM sub-system. It's * 4802 '* resulting is finding out the Critical Path. * 4805 '********************************************************************** 4808 IF AL=1 THEN ERASE TE,TL,TP,R1,R2 4810 DIM TE(ND),TL(ND),TP(ND),R1(ND,ND),R2(ND,ND) 4812 CLS : LOCATE 6,1,0 4815 PRINT "ERR<UNK! {FDD4}>VARPTRMERGE<UNK! {00F8}>USRUSRTHEN<UNK! {00F8}>BSAVE=WRITESTRING$TAB(<UNK! {00F6}> , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0 4818 AL=1 4820 FOR I=1 TO ND 4822 TE(I)=0 : TL(I)=10000 4825 NEXT I 4830 FOR J=2 TO ND 4835 R=0 4838 FOR I=1 TO ND 4840 IF AD(I,J)<>0 THEN R=R+1 : TP(R)=I 4845 NEXT I 4848 TE(J)=TE(TP(1))+AA(TP(1),J) 4850 FOR I=2 TO R 4855 IF TE(J)<TE(TP(I))+AA(TP(I),J) THEN TE(J)=TE(TP(I))+AA(TP(I),J) 4860 NEXT I 4866 NEXT J 4868 TL(ND)=TE(ND) 4870 FOR I=ND-1 TO 1 STEP -1 4875 R=0 4880 FOR J=1 TO ND 4884 IF AD(I,J)<>0 THEN R=R+1 : TP(R)=J 4885 NEXT J 4888 TL(I)=TL(TP(1))-AA(I,TP(1)) 4890 FOR J=2 TO R 4895 IF TL(I)>TL(TP(J))-AA(I,TP(J)) THEN TL(I)=TL(TP(J))-AA(I,TP(J)) 4900 NEXT J 4905 NEXT I 4910 FOR I=1 TO ND 4912 FOR J=1 TO ND 4915 CP(I,J)=0 4916 IF AD(I,J)<>1 THEN GOTO 4925 4918 R1(I,J)=TL(J)-TE(I)-AA(I,J) 4920 R2(I,J)=TE(J)-TE(I)-AA(I,J) 4922 IF R1(I,J)=0 AND R2(I,J)=0 THEN CP(I,J)=1 4925 NEXT J 4930 NEXT I 4940 RETURN 4945 ' 4948 ' 5800 '********************************************************************* 5805 '* Function: This subroutine is to draw the network. * 5810 '********************************************************************* 5820 CLS : LOCATE 6,1,0 5825 PRINT "ERR<UNK! {FDD4}>VARPTRMERGE<UNK! {00F8}>USRUSRCLOSE>THENLOADUSINGLOADWHILEOPTIONRANDOMIZESWAPUSING<UNK! {00F7}> , PRESET*KEYERLOPENAND ..." : LOCATE 25,1,0 5830 DIM DX(ND),DY(ND),X(ND),Y(ND),TM(ND) 5840 FOR I=1 TO ND 5850 DX(I)=0 5860 NEXT I 5870 FOR J=2 TO ND 5880 R=0 5890 FOR I=1 TO ND 5900 IF AD(I,J)<>0 THEN R=R+1 : TM(R)=I 5910 NEXT I 5920 DX(J)=DX(TM(1))+1 5930 FOR I=2 TO R 5940 IF DX(J)<DX(TM(I))+1 THEN DX(J)=DX(TM(I))+1 5950 NEXT I 5960 NEXT J 5970 SX=300/DX(ND) 5980 ' 5990 ' 6000 ERASE TM : DIM TM(DX(ND)),RMAX(DX(ND)),RMIN(DX(ND)) 6002 FOR I=1 TO DX(ND) 6004 R=0 6010 FOR K=1 TO M 6011 IF DX(EP(K,1))<=I-1 AND DX(EP(K,2))>=I THEN R=R+1 6012 NEXT K 6013 FOR K=1 TO DM 6014 IF DX(DU(K,1))<=I-1 AND DX(DU(K,2))>=I THEN R=R+1 6015 NEXT K 6022 TM(I)=R 6025 NEXT I 6030 MAX=TM(1) 6032 FOR I=2 TO DX(ND) 6035 IF TM(I)>MAX THEN MAX=TM(I) 6036 NEXT I 6038 IF INT(MAX/2)*2=MAX THEN MAX=MAX+1 6040 FOR I=1 TO DX(ND) 6042 R=0 6045 FOR J=1 TO ND 6048 IF DX(J)=I THEN R=R+1 6050 NEXT J 6052 TM(I)=R 6055 NEXT I 6060 DY(1)=INT(MAX/2+0.51) 6062 FOR I=1 TO DX(ND) 6063 IF INT(TM(I)/2)*2=TM(I) THEN TAG=0 ELSE TAG=1 6064 R=INT((MAX-TM(I))/2)+1 : RMIN(I)=R 6065 FOR J=1 TO ND 6066 IF DX(J)<>I THEN GOTO 6070 6067 IF TAG=0 AND R=DY(1) THEN DY(J)=R+1 : R=R+2 : GOTO 6070 6068 DY(J)=R : R=R+1 6070 NEXT J 6072 RMAX(I)=R-1 6075 NEXT I 6078 SY=200/(MAX+1) 6080 CLS : LOCATE 25,1,0 6085 ' 6090 ' 6100 OPEN "NETWORK.DWG" FOR OUTPUT AS #1 6105 DIM Z(DX(ND),MAX) 6110 FOR I=1 TO ND 6120 X(I)=DX(I)*SX+10 : Y(I)=DY(I)*SY+5 6130 CIRCLE (X(I),Y(I)),2,,0,6.283 6140 WRITE #1,I 6150 WRITE #1,X(I),Y(I) 6160 NEXT I 6170 FOR I=2 TO ND : Z(DX(I),DY(I))=1 : NEXT I 6180 FOR I=1 TO M 6182 WRITE #1,AC$(I) 6185 X1=X(EP(I,1)) : Y1=Y(EP(I,1)) 6190 X2=X(EP(I,2)) : Y2=Y(EP(I,2)) 6195 IF DX(EP(I,2))-DX(EP(I,1))<>1 THEN GOTO 6300 6200 D=SQR((X2-X1)^2+(Y2-Y1)^2) 6205 X11=X1+2*(X2-X1)/D : Y11=Y1+2*(Y2-Y1)/D 6210 X22=X1+(D-2)*(X2-X1)/D : Y22=Y1+(D-2)*(Y2-Y1)/D 6215 IF CP(EP(I,1),EP(I,2))<>1 THEN GOTO 6222 6216 Y11=Y11-1 : Y22=Y22-1 : R=4 6217 LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6860 6218 Y11=Y11+2 : Y22=Y22+2 6220 LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6870 6221 GOTO 6225 6222 LINE (X11,Y11)-(X22,Y22) : GOSUB 6860 : GOSUB 6870 6225 WRITE #1,X1,Y1,X2,Y2,1 6230 IF DY(EP(I,1))=DY(EP(I,2)) THEN Z(DX(EP(I,2)),DY(EP(I,2)))=1 6240 GOTO 6450 6300 IF DY(EP(I,1))>=DY(EP(I,2)) THEN GOTO 6315 6302 R=1 6304 FOR J=DX(EP(I,1))+1 TO DX(EP(I,2)) 6306 IF R>MAX THEN R=MAX+0.5 : GOTO 6350 6308 IF Z(J,R)=1 THEN R=R+1 : GOTO 6304 6310 NEXT J 6312 GOTO 6350 6315 R=MAX 6320 FOR J=DX(EP(I,1))+1 TO DX(EP(I,2)) 6325 IF R<1 THEN R=0.5 : GOTO 6350 6330 IF Z(J,R)=1 THEN R=R-1 : GOTO 6320 6340 NEXT J 6350 FOR J=DX(EP(I,1))+1 TO DX(EP(I,2)) 6355 Z(J,R)=1 6358 NEXT J 6400 X22=X1+((DX(EP(I,1))+1)*SX+10-X1)/2 : Y22=R*SY+5 6408 D=SQR((X22-X1)^2+(Y22-Y1)^2) 6410 X11=X1+2*(X22-X1)/D : Y11=Y1+2*(Y22-Y1)/D 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 6416 LINE (X11,Y11)-(X22,Y22) 6418 WRITE #1,X1,Y1,X22,Y22,2 6420 X11=X22 : Y11=Y22 6425 X22=(DX(EP(I,2))-1)*SX+10+(X2-(DX(EP(I,2))-1)*SX-10)/2 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 6429 LINE (X11,Y11)-(X22,Y22) 6430 WRITE #1,X11,Y11,X22,Y22,3 6435 X11=X22 6438 D=SQR((X2-X11)^2+(Y2-Y11)^2) 6440 X22=X11+(D-2)*(X2-X11)/D : Y22=Y11+(D-2)*(Y2-Y11)/D 6441 IF CP(EP(I,1),EP(I,2))<>1 THEN GOTO 6448 6442 Y01=Y11 : Y11=Y11-1 : Y22=Y22-1 : R=4 6444 LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6860 6445 Y11=Y11+2 : Y22=Y22+2 6446 LINE (X11,Y11)-(X22,Y22),2 : GOSUB 6870 : Y11=Y01 6447 GOTO 6449 6448 LINE (X11,Y11)-(X22,Y22) : GOSUB 6860 : GOSUB 6870 6449 WRITE #1,X11,Y11,X2,Y2,4 6450 NEXT I 6500 FOR I=1 TO DM 6505 X1=X(DU(I,1)) : Y1=Y(DU(I,1)) 6508 X2=X(DU(I,2)) : Y2=Y(DU(I,2)) 6510 IF DX(DU(I,2))-DX(DU(I,1))<>1 THEN GOTO 6530 6512 D=SQR((X2-X1)^2+(Y2-Y1)^2) 6515 X11=X1+2*(X2-X1)/D : Y11=Y1+2*(Y2-Y1)/D 6518 X22=X1+(D-2)*(X2-X1)/D : Y22=Y1+(D-2)*(Y2-Y1)/D 6520 TAG=1 : T=1 : GOSUB 6800 6525 WRITE #1,X1,Y1,X2,Y2,1 6526 IF DY(DU(I,1))=DY(DU(I,2)) THEN Z(DX(DU(I,2)),DY(DU(I,2)))=1 6528 GOTO 6620 6530 IF DY(DU(I,1))>=DY(DU(I,2)) THEN GOTO 6540 6532 R=1 6533 FOR J=DX(DU(I,1))+1 TO DX(DU(I,2)) 6534 IF R>MAX THEN R=MAX+0.5 : GOTO 6550 6535 IF Z(J,R)=1 THEN R=R+1 : GOTO 6533 6536 NEXT J 6538 GOTO 6550 6540 R=MAX 6542 FOR J=DX(DU(I,1))+1 TO DX(DU(I,2)) 6543 IF R<1 THEN R=0.5 : GOTO 6550 6544 IF Z(J,R)=1 THEN R=R-1 : GOTO 6542 6545 NEXT J 6550 FOR J=DX(DU(I,1))+1 TO DX(DU(I,2)) 6551 Z(J,R)=1 6552 NEXT J 6560 X22=X1+((DX(DU(I,1))+1)*SX+10-X1)/2 : Y22=R*SY+5 6561 D=SQR((X22-X1)^2+(Y22-Y1)^2) 6562 X11=X1+2*(X22-X1)/D : Y11=Y1+2*(Y22-Y1)/D 6563 TAG=0 : GOSUB 6800 6565 X11=X22 : Y11=Y22 6568 WRITE #1,X1,Y1,X22,Y22,2 6569 X11=X22 : Y11=Y22 6570 X22=(DX(DU(I,2))-1)*SX+10+(X2-(DX(DU(I,2))-1)*SX-10)/2 6572 D=X22-X11 6574 TAG=0 : GOSUB 6800 6575 WRITE #1,X11,Y11,X22,Y22,3 6580 X11=X22 6585 D=SQR((X2-X11)^2+(Y2-Y11)^2) 6590 X22=X11+(D-2)*(X2-X11)/D : Y22=Y11+(D-2)*(Y2-Y11)/D 6595 TAG=1 : T=1 : GOSUB 6800 6600 WRITE #1,X11,Y11,X2,Y2,4 6620 NEXT I 6630 CLOSE #1 6640 ERASE DX,DY,X,Y,TM,RMAX,RMIN,Z 6642 DEF SEG=0 : POKE 1050,PEEK(1052) 6645 AN$=INKEY$ 6650 IF AN$="" THEN GOTO 6645 6655 SCREEN 0 : SCREEN 1,0 : COLOR 9,0 6660 RETURN 6665 ' 6670 ' 6800 IF TAG=0 THEN S=D ELSE IF TAG=1 THEN S=D-2 ELSE S=D-8 6802 FOR L=2 TO D+14 STEP 14 6804 IF L>=S THEN LINE -(X22,Y22),1 : GOTO 6830 6805 PSET (X11+(L-2)*(X22-X11)/D,Y11+(L-2)*(Y22-Y11)/D) 6808 IF L+7>=S THEN LINE -(X22,Y22),1 : GOTO 6830 6810 LINE -STEP(6*(X22-X11)/D,6*(Y22-Y11)/D),1 6820 NEXT L 6830 IF TAG=0 THEN GOTO 6850 6831 IF T=1 THEN R=4 ELSE IF T=2 THEN R=8 ELSE R=16 6832 X0=(X11-X22)*0.866-(Y11-Y22)*0.5+X22 6834 Y0=(X11-X22)*0.5+(Y11-Y22)*0.866+Y22 6836 LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R)),1 6838 LINE -(X22,Y22),1 6840 X0=(X11-X22)*0.866+(Y11-Y22)*0.5+X22 6842 Y0=-(X11-X22)*0.5+(Y11-Y22)*0.866+Y22 6846 LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R)),1 6850 RETURN 6855 ' 6858 ' 6860 X0=(X11-X22)*0.866-(Y11-Y22)*0.5+X22 6862 Y0=(X11-X22)*0.5+(Y11-Y22)*0.866+Y22 6864 LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R)) 6865 LINE -(X22,Y22) 6866 RETURN 6868 ' 6870 X0=(X11-X22)*0.866+(Y11-Y22)*0.5+X22 6872 Y0=-(X11-X22)*0.5+(Y11-Y22)*0.866+Y22 6874 LINE -(X22+5*(X0-X22)/(D-R),Y22+5*(Y0-Y22)/(D-R)) 6875 RETURN 6878 ' 6880 ' 7000 '********************************************************************* 7005 '* Function: This subroutine is to separate the network, so * 7010 '* that each small block of the network diagram can * 7015 '* be copied to the printer. * 7020 '********************************************************************* 7030 CLS : LOCATE 6,1,0 7035 INPUT "PRESET*LOCATE<0xE4!>SCREEN* X STEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NX 7040 IF NX=0 THEN BEEP : GOTO 7035 7042 PRINT 7045 INPUT "PRESET*LOCATE<0xE4!>SCREEN* Y STEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NY 7050 IF NY=0 THEN BEEP : GOTO 7045 7055 ' 7060 ' 7120 FOR I=1 TO NY 7130 YMIN=(I-1)*200 : YMAX=I*200 7140 FOR J=1 TO NX 7150 CLS 7152 LOCATE 25,1,0 7155 LINE (0,0)-(0,199) : LINE -(319,199) 7160 LINE -(319,0) : LINE -(0,0) 7170 OPEN "NETWORK.DWG" FOR INPUT AS #1 7180 XMIN=(J-1)*320 : XMAX=J*320 7190 FOR K=1 TO ND 7200 INPUT #1,CN,X1,Y1 7210 X1=X1*NX 7220 Y1=Y1*NY 7230 IF X1<XMIN OR X1>XMAX THEN GOTO 7250 7240 IF Y1<YMIN OR Y1>YMAX THEN GOTO 7250 7245 CIRCLE (X1-XMIN,Y1-YMIN),8,,0,6.283 7248 GOSUB 7850 7250 NEXT K 7260 FOR K=1 TO M 7262 INPUT #1,AN$,X1,Y1,X2,Y2,N 7264 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 7265 IF N<>1 THEN GOTO 7280 7266 D=SQR((X2-X1)^2+(Y2-Y1)^2) 7268 X0=X1+8*(X2-X1)/D : Y0=Y1+8*(Y2-Y1)/D 7270 X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D 7272 X1=X0 : Y1=Y0 7273 GOSUB 7500 7274 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN ELSE GOTO 7278 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 7278 GOTO 7310 7280 D=SQR((X2-X1)^2+(Y2-Y1)^2) 7282 X1=X1+8*(X2-X1)/D : Y1=Y1+8*(Y2-Y1)/D 7284 GOSUB 7500 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) 7290 INPUT #1,X1,Y1,X2,Y2,N 7291 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 7292 GOSUB 7500 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) 7295 INPUT #1,X1,Y1,X2,Y2,N 7296 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 7297 D=SQR((X2-X1)^2+(Y2-Y1)^2) 7298 X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D 7299 GOSUB 7500 7300 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN ELSE GOTO 7310 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 7310 NEXT K 7360 FOR K=1 TO DM 7362 INPUT #1,X1,Y1,X2,Y2,N 7364 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 7365 IF N<>1 THEN GOTO 7380 7366 D=SQR((X2-X1)^2+(Y2-Y1)^2) 7368 X0=X1+8*(X2-X1)/D : Y0=Y1+8*(Y2-Y1)/D 7370 X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D 7372 X1=X0 : Y1=Y0 7373 GOSUB 7500 7375 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=1 : T=3 : GOSUB 6800 7378 GOTO 7400 7380 D=SQR((X2-X1)^2+(Y2-Y1)^2) 7382 X1=X1+8*(X2-X1)/D : Y1=Y1+8*(Y2-Y1)/D 7384 GOSUB 7500 7385 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=0 : GOSUB 6800 7388 INPUT #1,X1,Y1,X2,Y2,N 7390 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 7391 D=SQR((X2-X1)^2+(Y2-Y1)^2) 7392 GOSUB 7500 7393 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=0 : GOSUB 6800 7394 INPUT #1,X1,Y1,X2,Y2,N 7395 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 7396 D=SQR((X2-X1)^2+(Y2-Y1)^2) 7397 X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D 7398 GOSUB 7500 7399 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : TAG=1 : T=2 : GOSUB 6800 7400 NEXT K 7410 CLOSE #1 7415 DEF SEG=0 : POKE 1050,PEEK(1052) 7420 AN$=INKEY$ 7440 IF AN$="" THEN GOTO 7420 7445 SCREEN 0 : SCREEN 1,0 : COLOR 9,0 7450 NEXT J 7460 NEXT I 7480 RETURN 7485 ' 7490 ' 7500 '******************************************* 7505 '* Function: Cohen-Sutherland Clipping Algorithm for line * 7510 '* from P1=(x1,y1) to P2=(x2,y2). * 7520 '******************************************************************** 7525 C=0 : JX=0 7530 XX=X2 : YY=Y2 7540 GOSUB 7800 7550 C2=CODE 7555 IF C2<>0 THEN JX=1 7560 XX=X1 : YY=Y1 7570 GOSUB 7800 7580 C1=CODE 7600 IF (C1 AND C2)<>0 THEN EXIST=0 : GOTO 7790 7610 IF (C1=0) AND (C2=0) THEN EXIST=1 : GOTO 7785 7620 IF C1=0 THEN SWAP X1,X2 : SWAP Y1,Y2 : SWAP C1,C2 : C=1 7630 IF (C1 AND 1)=0 THEN GOTO 7680 7640 Y1=Y1+(Y2-Y1)*(XMIN-X1)/(X2-X1) ' left intersection point 7650 X1=XMIN 7660 GOTO 7560 7680 IF (C1 AND 2)=0 THEN GOTO 7720 7690 Y1=Y1+(Y2-Y1)*(XMAX-X1)/(X2-X1) ' right intersection point 7700 X1=XMAX 7710 GOTO 7560 7720 IF (C1 AND 4)=0 THEN GOTO 7760 7730 X1=X1+(X2-X1)*(YMIN-Y1)/(Y2-Y1) 7740 Y1=YMIN ' down intersection point 7750 GOTO 7560 7760 X1=X1+(X2-X1)*(YMAX-Y1)/(Y2-Y1) 7770 Y1=YMAX ' up intersection point 7780 GOTO 7560 7785 IF C=1 THEN SWAP X1,X2 : SWAP Y1,Y2 7790 RETURN 7795 ' 7798 ' 7800 '******************************************************************** 7805 '* Function: This subroutine is to give the code of each point, * 7810 '* according to the method of Cohen & Sutherland. * 7820 '******************************************************************** 7822 CODE=0 7824 IF XX<XMIN THEN CODE=1 ELSE IF XX>XMAX THEN CODE=2 7826 IF YY<YMIN THEN CODE=CODE+4 ELSE IF YY>YMAX THEN CODE=CODE+8 7828 ' 2 --- 10 ; 4 --- 100 ; 8 --- 1000 7830 RETURN 7835 ' 7840 ' 7850 '********************************************************************** 7851 '* Function: This subroutine is to draw the numerical diagram. * 7852 '********************************************************************** 7855 L=LEN(STR$(CN))-1 7858 FOR II=1 TO L 7860 X0=X1-XMIN+5*(II-L/2-1) : Y0=Y1-YMIN-3 7862 V=VAL(MID$(STR$(CN),II+1,1)) 7864 IF V=0 THEN PSET(X0,Y0) : DRAW "R3 D6 L3 U6" : GOTO 7878 7865 ON V GOTO 7866,7867,7868,7869,7870,7871,7872,7873,7874 7866 PSET(X0+2,Y0) : DRAW "D6" : GOTO 7878 7867 PSET(X0,Y0) : DRAW "R3 D3 L3 D3 R3" : GOTO 7878 7868 PSET(X0,Y0) : DRAW "R3 D3 L3 R3 D3 L3" : GOTO 7878 7869 PSET(X0,Y0) : DRAW "D4 R3 L1 U4 D6" : GOTO 7878 7870 PSET(X0+3,Y0) : DRAW "L3 D3 R3 D3 L3" : GOTO 7878 7871 PSET(X0+3,Y0) : DRAW "L3 D6 R3 U3 L3" : GOTO 7878 7872 PSET(X0,Y0) : DRAW "R3 D6" : GOTO 7878 7873 PSET(X0,Y0+3) : DRAW "R3 U3 L3 D6 R3 U3" : GOTO 7878 7874 PSET(X0+3,Y0+3) : DRAW "L3 U3 R3 D6 L3" 7878 NEXT II 7880 RETURN 8000 '*************************************************** 8002 '* * 8005 '* Function: To Draw Network with Plotter. * 8008 '* * 8010 '*************************************************** 8015 CLS : LOCATE 4,1,0 8020 INPUT "PRESET*LOCATE<0xE4!>SCREEN*CLOSE>THENLOADWHILESCREENCLS<UNK! {FDB3}><0xDF!> : ",S 8025 IF S=0 THEN BEEP : GOTO 8020 8028 PRINT 8030 INPUT "PRESET*LOCATE<0xE4!>SCREEN*XSTEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NX 8035 IF NX=0 THEN BEEP : GOTO 8030 8040 PRINT 8045 INPUT "PRESET*LOCATE<0xE4!>SCREEN*YSTEPIMP<0xB5!>SOUNDWRITESTRING$PRESET<UNK! {00F8}>LOCATE<UNK! {FDC4}>COLOR : ",NY 8050 IF NY=0 THEN BEEP : GOTO 8045 8065 FOR I=1 TO NY 8070 YMIN=(I-1)*200 : YMAX=I*200 8075 FOR J=1 TO NX 8080 CLS : LOCATE 6,1,0 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$ 8090 IF P$="" THEN BEEP :GOTO 8085 8095 OPEN P$ FOR OUTPUT AS #2 8100 PRINT #2,":" 8102 CLS : LOCATE 25,1,0 8105 LINE (0,0)-(0,199) : LINE -(319,199) 8110 LINE -(319,0) : LINE -(0,0) 8115 PRINT #2, "M 0,0 " 8120 X1=320*S : Y1=200*S 8125 PRINT #2,"D ";X1;",";0;",";X1;",";Y1;",";0;",";Y1;",";"0 , 0" 8130 OPEN "NETWORK.DWG" FOR INPUT AS #1 8135 XMIN=(J-1)*320 : XMAX=J*320 8140 FOR K=1 TO ND 8145 INPUT #1,CN,X1,Y1 8150 X1=X1*NX 8155 Y1=Y1*NY 8160 IF X1<XMIN OR X1>XMAX THEN GOTO 8180 8165 IF Y1<YMIN OR Y1>YMAX THEN GOTO 8180 8168 CIRCLE (X1-XMIN,Y1-YMIN),8,,0,6.283 8170 GOSUB 7850 8171 X1=(X1-XMIN)*S : Y1=(Y1-YMIN)*S 8172 PRINT #2,"W ";X1;",";Y1,", 50,50 ,0,3600" 8175 GOSUB 9400 8180 NEXT K 8185 FOR K=1 TO M 8190 INPUT #1,AN$,X1,Y1,X2,Y2,N 8195 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 8200 IF N<>1 THEN GOTO 8245 8205 D=SQR((X2-X1)^2+(Y2-Y1)^2) 8210 X0=X1+8*(X2-X1)/D : Y0=Y1+8*(Y2-Y1)/D 8215 X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D 8220 X1=X0 : Y1=Y0 8225 GOSUB 7500 8230 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN: X22=X2-XMIN : Y22=Y2-YMIN ELSE GOTO 8240 8235 R=0 : RP=100 : GOSUB 8600 8240 GOTO 8315 8245 D=SQR((X2-X1)^2+(Y2-Y1)^2) 8250 X1=X1+8*(X2-X1)/D : Y1=Y1+8*(Y2-Y1)/D 8255 GOSUB 7500 8260 GOSUB 8850 8265 INPUT #1,X1,Y1,X2,Y2,N 8270 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 8275 GOSUB 7500 8280 GOSUB 8850 8285 INPUT #1,X1,Y1,X2,Y2,N 8290 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 8295 D=SQR((X2-X1)^2+(Y2-Y1)^2) 8300 X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D 8305 GOSUB 7500 8310 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN ELSE GOTO 8315 8312 R=0 : RP=50 : GOSUB 8600 8315 NEXT K 8320 FOR K=1 TO DM 8325 INPUT #1,X1,Y1,X2,Y2,N 8330 X1=X1*NX : Y1=Y1*NY : X2=*NX : Y2=Y2*NY 8335 IF N<>1 THEN GOTO 8375 8340 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN :X22=X2-XMIN : Y22=Y2-YMIN : TAG= 0 : GOSUB 6800 8345 X0=X1+8*(X2-X1)/D : Y0=Y1+8*(Y2-Y1)/D 8350 INPUT #1,X1,Y1,X2,Y2,N 8355 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 8360 D=SQR((X2-X1)^2+(Y2-Y1)^2) 8365 GOSUB 8460 8370 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y11-YMIN : X22=X22-XMIN : Y22=Y22-YMIN : 8375 INPUT #1,X1,Y1,X2,Y2,N 8380 X1=X1*NX : Y1=Y1*NY : X2=X2*NX : Y2=Y2*NY 8385 D=SQR((X2-X1)^2+(Y2-Y1)^2) 8390 X2=X1+(D-8)*(X2-X1)/D : Y2=Y1+(D-8)*(Y2-Y1)/D 8395 GOSUB 8460 8400 IF EXIST=1 THEN X11=X1-XMIN : Y11=Y1-YMIN : X22=X2-XMIN : Y22=Y2-YMIN : 8405 NEXT K 8410 CLOSE #1 8411 PRINT #2,"J 0" 8412 PRINT #2,"M 3850,2800" 8414 CLOSE #2 8415 DEF SEG=0 : POKE 1050,PEEK (1052) 8420 AN$=INKEY$ 8425 IF AN$="" THEN GOTO 8420 8430 SCREEN 0 : SCREEN 1,0 : COLOR 9,0 8435 NEXT J 8440 NEXT I 8445 RETURN 8600 D=SQR((X22-X11)^2+(Y22-Y11)^2) 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 8610 XE=(X22+8*(X22-X11)/D)*S 8615 YE=(Y22+8*(Y22-Y11)/D)*S 8620 DD=(D+16)*S 8625 X0=XS+(DD-50)*(XE-XS)/DD : Y0=YS+(DD-50)*(YE-YS)/DD 8630 IF N=1 THEN XS=XS+50*(XE-XS)/DD : YS=YS+50*(YE-YS)/DD 8635 XE=X0 :YE=Y0 8800 IF CP(EP(K,1),EP(K,2))<>1 THEN GOTO 8820 8801 LINE (X11,Y11-1)-(X22,Y22-1),2 8802 IF JX<>1 THEN GOSUB 6860 8804 LINE (X11,Y11+2)-(X22,Y22+2),2 8805 IF JX<>1 THEN GOSUB 6870 8806 PRINT #2, "J 2" 8808 PRINT #2,"M"; XS;",";YS-5 8810 PRINT #2, "D";XE;",";YE-5 8811 IF JX<>1 THEN GOSUB 9000 8812 PRINT #2,"M"; XS;",";YS+5 8814 PRINT #2,"D"; XE;",";YE+5 8815 IF JX<>1 THEN GOSUB 9100 8816 PRINT #2, "J 1" 8818 GOTO 8830 8820 LINE (X11,Y11)-(X22,Y22) 8821 IF JX<>1 THEN GOSUB 6860 : GOSUB 6870 8822 PRINT #2, "M ";XS;",";YS 8824 PRINT #2, "D ";XE;",";YE 8826 IF JX<>1 THEN GOSUB 9000 : GOSUB 9100 8830 RETURN 8850 IF EXIST=1 AND CP(EP(K,1),EP(K,2))=1 GOTO 8860 8852 IF EXIST=1 THEN LINE (X1-XMIN,Y1-YMIN)-(X2-XMIN,Y2-YMIN) 8854 PRINT #2,"M";(X1-XMIN)*S;",";(Y1-YMIN)*S 8856 PRINT #2,"D";(X2-XMIN)*S;",";(Y2-YMIN)*S 8858 GOTO 8880 8860 LINE (X1-XMIN,Y1-YMIN-1)-(X2-XMIN,Y2-YMIN-1),2 8862 LINE (X1-XMIN,Y1-YMIN+2)-(X2-XMIN,Y2-YMIN+2),2 8864 PRINT #2,"J 2" 8866 PRINT #2,"M";(X1-XMIN)*S;",";(Y1-YMIN-1)*S 8870 PRINT #2,"D",(X2-XMIN)*S;",";(Y2-YMIN-1)*S 8872 PRINT #2,"M";(X1-XMIN)*S;",";(Y1-YMIN+2)*S 8874 PRINT #2,"D";(X2-XMIN)*S;",";(Y2-YMIN+2)*S 8876 PRINT #2,"J 1" 8880 RETURN 9000 X0=(XS-XE)*0.866-(YS-YE)*0.5+XE 9005 Y0=(XS-XE)*0.5+(YS-YE)*0.866+YE 9010 PRINT #2,"M"; XE;",";YE 9015 PRINT #2,"D";XE+20*(X0-XE)/(DD-RP);",";YE+20*(Y0-YE)/(DD-RP) 9020 RETURN 9100 X0=(XS-XE)*0.866+(YS-YE)*0.5+XE 9105 Y0=-(XS-XE)*0.5+(YS-YE)*0.866+YE 9110 PRINT #2,"M "; XE;",";YE 9115 PRINT #2,"D "; XE+20*(X0-XE)/(DD-RP);",";YE+20*(Y0-YE)/(DD-RP) 9120 RETURN 9400 L=LEN(STR$(CN))-1 9405 FOR II=1 TO L 9410 X0=X1+20*(II-L/2-1) : Y0=Y1+15 9415 V=VAL(MID$(STR$(CN),II+1,1)) 9420 IF V=0 THEN PRINT #2,"M";X0;",";Y0 : PRINT #2,"I 16,0,0,-30,-16,0,0,30 " : GOTO 9480 9425 ON V GOTO 9430,9435,9440,9445,9450,9455,9460,9465,9470 9430 PRINT #2, "M "; X0+8;",";Y0 : PRINT #2,"I 0,-30 " : GOTO 9480 9435 PRINT #2, "M "; X0;",";Y0 : PRINT #2, "I 16,0,0,-16,-16,0,0,-16,16,0 " : GOTO 9480 9440 PRINT #2, "M "; X0;",";Y0 : PRINT #2, "I 16,0,0,-30,-16,0,16,0,0,16,-16,0" : GOTO 9480 9445 PRINT #2, "M ";X0;",";Y0 : PRINT #2, "I 0,-20,20,0,-10,0,0,20,0,-30 " : GOTO 9480 9450 PRINT #2, "M "; X0+16;",";Y0 : PRINT #2, "I -16,0,0,-16,16,0,0,-16,-16,0 " : GOTO 9480 9455 PRINT #2, "M ";X0+16;",";Y0 : PRINT #2, "I -16,0,0,-30,16,0,0,16,-16,0" : GOTO 9480 9460 PRINT #2, "M ";X0;",";Y0 : PRINT #2, "I 16,0,0,-30 " : GOTO 9480 9465 PRINT #2, "M ";X0;",";Y0 : PRINT #2, "I 16,0,0,-30,-16,0,0,30,0,-16,16,0 ": GOTO 9480 9470 PRINT #2, "M ";X0+16;",";Y0-16:PRINT #2, "I -16,0,0,16,16,0,0,-30,-16,0 " 9480 NEXT II 9490 RETURN