10 REM *************************************************** 20 REM T H E M A G I C M A R Q U E E 30 REM BY GEORGE STEWARD 40 REM POPULAR COMPUTING NOV. 84, PROGRAM FACTORY 50 REM 60 REM EDITED BY M. SKAL, 9/27/84 70 REM **************************************************** 80 ' 90 S1$=" " 100 NU$="" 110 UD$="@": 'UNIFORM DENSITY FILL CHARACTER 120 READ NC 130 CL$=NU$ 140 LZ=12 : 'MAX. NO. OF LINES IN MESSAGE 150 DIM CH$(NC,7),M1(3),M2(5),EM$(LZ) 160 FOR J=1 TO 3 170 M1(J)=2^((J-1)*5) 180 NEXT J 190 FOR J=1 TO 5 200 M2(J)=2^(J-1) 210 NEXT J 220 PRINT CHR$(26) 230 PRINT"********************************************" 240 PRINT" T H E M A G I C M A R Q U E E 250 PRINT"********************************************" 260 PRINT 270 INPUT "HORIZONTAL FACTOR (1-10): ",HT 280 IF HT<1 OR HT>10 THEN 270 290 INPUT "VERTICAL FACTOR (1-10) : ",VT 300 IF VT<1 OR HT>10 THEN 290 310 PRINT 320 PRINT"SELECT CHARACTER DENSITY." 330 PRINT"UNIFORM=1 VARIABLE=2" 340 PRINT 350 INPUT "ENTER DENSITY CODE : ",UV 360 IF UV<>1 AND UV<>2 THEN 320 370 PRINT 380 PRINT"LOADING ";NC;" CHARACTER PATTERNS . . . " 390 FOR C=1 TO NC 400 READ C$ 410 PRINT C$; 420 CL$=CL$+C$ 430 IF UV=1 THEN FL$=UD$ 440 IF UV=2 THEN FL$=C$ 450 FOR S=1 TO 3 460 READ SV 470 FOR N=3 TO 1 STEP -1 480 NV=INT(SV/M1(N)) 490 SV=SV-NV*M1(N) 500 IX=(S-1)*3+N 510 IF IX>7 THEN 620 : 'SKIP 520 L$=NU$ 530 FOR P=5 TO 1 STEP -1 540 CV=INT(NV/M2(P)) 550 NV=NV-CV*M2(P) 560 FOR T=1 TO HT 570 IF CV=0 THEN L$=L$+S1$ 580 IF CV<>0 THEN L$=L$+FL$ 590 NEXT T 600 NEXT P 610 CH$(C,IX)=L$ 620 NEXT N 630 NEXT S 640 NEXT C 650 PRINT 660 CW=LEN(CH$(1,1)) 670 CS$=STRING$(CW,S1$) 680 LS=INT(CW/5) 690 LS$=STRING$(LS,S1$) 700 TW=CW+LS 710 PRINT 720 PRINT"MAXIMUM LINE WIDTH OF OUTPUT DEV. (";CW;" TO 132) :"; 730 INPUT LW 740 IF LW132 THEN 720 750 MC=INT(LW/TW) 760 MC=MC+INT((LW-MC*TW)/CW) 770 PRINT 780 PRINT"HOW MANY LINES ARE IN MESSAGE ? (1-";LZ;") : "; 790 INPUT LL 800 IF LL<1 OR LL>LZ THEN 780 810 FOR ML=1 TO LL 820 EM$(ML)=NU$ 830 PRINT 840 PRINT"ENTER LINE # ";ML 850 PRINT"(MAX LEN. = ";MC;") CHARACTERS." 860 M$="" 870 INPUT M$ 880 IF M$=NU$ THEN M$=S1$ : 'DON'T ALLOW NULLSTRING 890 IF LEN(M$)<=MC THEN 920 900 PRINT"LINE IS TOO LONG! PLEASE REENTER." 910 GOTO 830 920 PRINT"CREATING EXPANDED LINE IMAGE. PLEASE WAIT . . ." 930 FOR C=1 TO LEN(M$) 940 C$=MID$(M$,C,1) 950 P=INSTR(1,CL$,C$) 960 P$=RIGHT$(S1$+STR$(P),2) 970 EM$(ML)=EM$(ML)+P$ 980 NEXT C 990 PRINT 1000 NEXT ML 1010 PRINT : PRINT 1020 PRINT"1-PRINT ONE COPY" 1030 PRINT"2-PRINT CONTINOUSLY" 1040 PRINT"3-NEW MESSAGE" 1050 PRINT"4-NEW SIZE" 1060 PRINT"5-END" 1070 PRINT 1080 INPUT"SELECT 1-5 : ",A 1090 IF A<1 OR A>5 THEN 1010 1100 ON A GOTO 1130,1210,720,1110,1120 1110 RESTORE:READ NC: GOTO 160 1120 PRINT:PRINT"***** BYE ! *****" :PRINT :END 1130 PRINT 1140 INPUT"SELECT: 1-CRT, 2-PRINTER, 3-DISK : ",DV 1150 IF DV<1 AND DV>3 THEN 1130 1160 PRINT 1170 ON DV GOSUB 1240,2000,2900 1180 PRINT"PRESS ANY KEY TO CONTINUE !"; 1190 IF INKEY$=NU$ THEN 1190 1200 GOTO 1010 1210 GOSUB 1240 1220 IF INKEY$=NU$ THEN 1210 1230 GOTO 1010 1240 FOR ML=1 TO LL 'OUTPUT TO CRT ROUTINE 1250 FOR L=1 TO 7 1260 FOR T=1 TO VT 1270 FOR P=1 TO LEN(EM$(ML))/2 1280 PV=VAL(MID$(EM$(ML),(P*2)-1,2)) 1290 IF PV=0 THEN PRINT CS$; 1300 IF PV<>0 THEN PRINT CH$(PV,L); 1310 IF P0 THEN LPRINT CH$(PV,L); 2070 IF P0 THEN PRINT #1, CH$(PV,L); 3080 IF P