IMD 1.18: 22/01/1996 7:20:42 micro cornucopia kaypro user group disk 24 mbasic games and keyboard translator     -24DISK DOCBACARRATBAS CASTLE BAS CASTLE BASM !"#$CASTLE DOCt%&'()*+,-./0123CRC COM456CRC DOC7CRCKLISTCRC 89DSPACE BAS::;<=>?@ADUCK BAS2BCDEFGHHURKLE BAS IJKSTR484GCOMKLMNKSTRO484COMOPQRKSTROK10COMSTUVKSTROKE2COMWXYZKSTROKESASM[\]^_`abcdefghijKaypro User Disk #24 Micro Cornucopia PO Box 223 Bend OR 97709 --------------------------------------------------------------------- KSTROKES.DOC KSTROKES.ASM KSTROKE2.COM KSTROKES is a keyboard translator similiar to Smartkey. Bill Forbes did an excellent job creating this program. You can create and save translation files on disk. The program even includes a table which generates WordStar commands from the Kaypro's keypad. You can define 8 keystrokes up to 63 characters each. PleasKSTROKESASM klmnKSTROKESDOCopqrstuvwxyz{|}~KSTROKESDOCMATHDICEBAS NIM BAS README TXTRUSROU BASSKUNK BAS:SLOTS BASSPACEWARBASMSWORDS BAS\UN2 COM(UN2 DOCUSOPEN BASjXREF&UN2DOCXREFPRN2COMe read Bill's DOC file for all the details. KSTROKE2.COM is to be used on an older Kaypro 2 or 4. KSTROK10.COM KSTROKES for the Kaypro 10. KSTRO484.COM KSTROKES for the new Kaypro 2 or 4 (The ones with half-wide drives and dark screens.) KSTR484G.COM KSTROKES for the new Kaypro 2 or 4 running CP/M 2.2G. Various MBASIC GAMES::::::::::::::::::::::::::::::::::::::::::::::::::::::: Place a disk with CP/M (a disk you can boot) and a copy of MBASIC.COM that comes with your Kaypro int  o drive A:. Place a copy of this disk in drive B:. Log on to drive B: by entering B: To play these games, run MBASIC by entering: A:MBASIC Then load the program by entering: LOAD "FILENAME" Filename is the name of the game that you want to play. (Don't enter .BAS) Then begin play by entering: RUN For example, to play NIM enter: A:MBASIC LOAD "NIM" RUN ich you select your attributes (strength, dexterity, and intelligence740 PRINT C$(4)TAB(20)C$(2) 750 IF T1<10 THEN 770 760 T1=T1-10 770 IF T2<10 THEN 790 780 T2=T2-10 790 IF W(T1+1)=0 THEN 860 800 PRINT"PLAYER MUST DRAW." 810 PRINT C$(5) 820 T1=T1+B(5) 830 IF T1<10 THEN 860 840 T1=T1-10 850 GOTO 880 860 PRINT"PLAYER CANNOT DRAW." 870 J=11 880 PRINT"PLAYERS TOTAL:"T1 890 PRINT 900 IF T2<3 THEN 960 910 IF T2>6 THEN 1020 920 IF J<>11 THEN 950 930 IF T2=6 THEN 1020 940 GOTO 960 950 IF Z(T2,B(5)+1)=0 THEN 1020 960 PRINT"BANKER MUST DRAW." 970 PRINT C$(6) 9eturn> All the games have instructions available when you begin the game. NIM.BAS RUSROU.BAS SLOTS.BAS SWORDS.BAS MATHDICE.BAS SKUNK.BAS HURKLE.BAS DSPACE.BAS BACARRAT.BAS SPACEWAR.BAS Also: USOPEN.BAS This game illustrates the fairway on the screen. It looks best on the new Kaypros with the graphic capabilities but the characters can be changed to make it look better on the older Kaypros. You select the club and direction for each stroke. After you reach the green, t$(S1):NEXT 300 FOR S1=1 TO 13:READ V(S1):NEXT 310 PRINT 320 INPUT "ENTER NUMBER FROM 1 TO 10000";X 330 RANDOMIZE X 340 PRINT 350 PRINT"HOW MANY PLAYERS"; 360 INPUT P1 370 FOR J=1 TO P1 380 PRINT"WHAT IS THE NAME OF PLAYER"J; 390 INPUT G$(J) 400 M(J)=10000 410 NEXT J 420 FOR S1=1 TO 4 430 FOR S2=1 TO 13 440 Q(S1,S2)=0 450 NEXT S2 460 NEXT S1 470 FOR J=1 TO 6 480 C=INT(1+RND(1)*4) 490 D=INT(1+RND(1)*13) 500 Q(C,D)=Q(C,D)+1 510 IF Q(C,D)>=32 THEN 480 520 B(J)=V(D)10 PRINT TAB(26);"BACCARAT" 20 PRINT 30 PRINT 40 PRINT "BACCARAT -- CHEMIN DE FER" 50 PRINT 60 PRINT "DO YOU NEED INSTRUCTIONS (Y/N)"; 70 INPUT Q$ 80 IF Q$<>"y" THEN IF Q$<>"Y" THEN 210 90 PRINT " BACCARAT IS A VERY POPULAR GAME IN LAS" 100 PRINT"VEGAS. THE PLAYER AND BANKER EACH RECEIVE" 110 PRINT"TWO CARDS FROM A 'SHOE' CONTAINING 8 DECKS" 120 PRINT"OF CARDS. ALL CARD COMBINATIONS TOTALING" 130 PRINT"TEN ARE NOT COUNTED. THE ONE THAT ENDS UP" 140 PRINT"CLOSER TO NINE WINS. THE STAKES ARE HI80 T2=T2+B(6) 990 IF T2<10 THEN 1010 1000 T2=T2-10 1010 GOTO 1030 1020 PRINT"BANKER CANNOT DRAW." 1030 PRINT"BANKERS TOTAL:"T2 1040 PRINT 1050 IF T2<>T1 THEN 1080 1060 PRINT"IT'S A TIE. THE HAND IS PLAYED OVER." 1070 GOTO 470 1080 IF T2M(J) THEN 580 610 IF F(J)<>INT(F(J)) THEN 580 620 IF F(J)<1 THEN 580 630 PRINT"(1) BANKER OR (2) PLAYER"; 640 INPUT F1(J) 650 IF F1(J)>=1000 THEN 580 660 IF (F1(J)-1)*(F1(J)-2)<>0 THEN 630 670 NEXT J 680 J=0 690 T1=B(1)+B(2) 700 T2=B(3)=B(4) 710 PRINT 720 PRINT"BANKER"TAB(20)"PLAYER" 730 PRINT C$(3)TAB(20)C$(1)   "M(J)"." 1190 GOTO 1220 1200 M(J)=M(J)+F(J) 1210 PRINT"WINS $"F(J)", FOR A TOTAL OF $"M(J)"." 1220 NEXT J 1230 FOR J=1 TO P1 1240 IF M(J)<>0 THEN 1280 1250 NEXT J 1260 PRINT"THANK YOU FOR YOUR MONEY, AND "; 1270 GOTO 1410 1280 PRINT 1290 PRINT"-------- NEW GAME --------" 1300 PRINT 1310 FOR X=1 TO 4 1320 FOR Y=1 TO 13 1330 IF Q(X,Y)<>8 THEN 470 1340 NEXT Y,X 1350 GOTO 420 1360 DATA 1,1,1,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,0,0 1370 DATA 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0 1380 DATREASURES, AND" 1230 PRINT "THE INCREDIBLE *ORB OF ZOT*. FROM THAT TIME HENCE, MANY" 1235 PRINT "A BOLD YOUTH HAS VENTURED INTO THE WIZARD'S CASTLE. AS" 1240 PRINT "OF NOW, *NONE* HAS EVER EMERGED VICTORIOUSLY! BEWARE!!" 1245 PRINT 1250 X=1 : Y=4 1255 L(FND(1))=2 1260 FOR Z=1 TO 7 1265 FOR Q1=1 TO 2 1270 Q=104 1275 GOSUB 5285 1280 L(FND(Z+1))=103 1285 NEXT Q1 1290 NEXT Z 1295 FOR Z=1 TO 8 1300 FOR Q=113 TO 124 1305 GOSUB 5285 1310 NEXT Q 1315 FOR Q1=1 TO 3 1320 FOR Q=105 TO 112 1325 GOSU1040 DEFINT A-Z 1045 DIM C$(34),I$(34),R$(4),W$(8),E$(8) 1050 DIM L(512),C(3,4),T(8),O(3),R(3) 1055 DEF FNA(Q)=1+INT(RND(1)*Q) 1060 DEF FNB(Q)=Q+8*((Q=9)-(Q=0)) 1065 DEF FNC(Q)=-Q*(Q<19)-18*(Q>18) 1070 DEF FND(Q)=64*(Q-1)+8*(X-1)+Y 1075 DEF FNE(Q)=Q+100*(Q>99) 1080 Y$="** PLEASE ANSWER YES OR NO" 1085 NG=0 1090 REM 1095 REM INITIALIZE ARRAYS 1100 REM 1105 NG=NG+1 1110 Q=RND(1) 1115 RESTORE 1120 FOR Q=1 TO 34 1125 READ C$(Q),I$(Q) 1130 NEXT Q 1135 FOR Q=1 TO 512 1140 L(Q)=101 1145 NEXT1580 GOTO 1535 1585 PRINT "WHICH SEX TO YOU PREFER"; 1590 GOSUB 5415 1595 IF O$="M" THEN SX=1 : GOTO 1615 1600 IF O$="F" GOTO 1615 1605 PRINT "** CUTE ";R$(RC);", REAL CUTE. TRY M OR F." 1610 GOTO 1585 1615 PRINT 1620 PRINT "OK, ";R$(RC);", YOU HAVE THE FOLLOWING ATTRIBUTES :" 1625 PRINT "STRENGTH =";ST;" INTELLIGENCE =";IQ;" DEXTERITY =";DX 1630 PRINT "AND";OT;"OTHER POINTS TO ALLOCATE AS YOU WISH." 1635 PRINT 1640 Z$="STRENGTH" 1645 GOSUB 5430 1650 ST=ST+Q 1655 IF OT=0 GOTO 1695 1660 Z$="ITA 1,1,1,1,1,1,0,0,0,0,SPADES,HEARTS,DIAMONDS 1390 DATA CLUBS,ACE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT 1400 DATA NINE,TEN,JACK,QUEEN,KING,1,2,3,4,5,6,7,8,9,0,0,0,0 1410 PRINT"THANK YOU FOR PLAYING." 1420 END E,SIX,SEVEN,EIGHT 1400 DATA NINE,TEN,JACK,B 5285 1330 NEXT Q 1335 Q=125 1340 GOSUB 5285 1345 NEXT Q1 1350 NEXT Z 1355 FOR Q=126 TO 133 1360 Z=FNA(8) 1365 GOSUB 5285 1370 NEXT Q 1375 Q=101 1380 FOR A=1 TO 3 1385 Z=FNA(8) 1390 GOSUB 5285 1395 C(A,1)=X 1400 C(A,2)=Y 1405 C(A,3)=Z 1410 C(A,4)=0 1415 NEXT A 1420 RC=0 1425 ST=2 1430 DX=14 1435 R$(3)="MAN" 1440 Q=112+FNA(12) 1445 Z=FNA(8) 1450 GOSUB 5285 1455 R(1)=X 1460 R(2)=Y 1465 R(3)=Z 1470 Q=109 1475 Z=FNA(8) 1480 GOSUB 5285 1485 O(1)=X 1490 O(2)=Y 1495 O(3)=Z 1500  Q 1150 FOR Q=1 TO 8 1155 READ W$(Q),E$(Q) 1160 NEXT Q 1165 FOR Q=1 TO 4 1170 READ R$(Q) 1175 NEXT Q 1180 IF NG > 1 GOTO 1250 1185 PRINT CHR$(27);"E" 1190 GOSUB 5375 1195 PRINT TAB(16);"* * * THE WIZARD'S CASTLE * * *" 1200 PRINT 1205 GOSUB 5375 1210 PRINT "MANY CYCLES AGO, IN THE KINGDOM OF N'DIC, THE GNOMIC" 1215 PRINT "WIZARD ZOT FORGED HIS GREAT *ORB OF POWER*. HE SOON" 1220 PRINT "VANISHED, LEAVING BEHIND HIS VAST SUBTERRANEAN CASTLE" 1225 PRINT "FILLED WITH ESURIENT MONSTERS, FABULOUS NTELLIGENCE" 1665 GOSUB 5430 1670 IQ=IQ+Q 1675 IF OT=0 GOTO 1695 1680 Z$="DEXTERITY" 1685 GOSUB 5430 1690 DX=DX+Q 1695 PRINT "OK, ";R$(RC);", YOU HAVE 60 GOLD PIECES (GP'S)." 1700 Z$="ARMOR" 1705 GOSUB 5555 1710 AV=0 : WV=0 : FL=0 : WC=0 1715 PRINT "PLATE<30> CHAINMAIL<20> LEATHER<10> NOTHING<0>" 1720 GOSUB 5405 1725 IF O$="N" GOTO 1755 1730 AV=-3*(O$="P")-2*(O$="C")-(O$="L") 1735 IF AV > 0 GOTO 1755 1740 PRINT 1745 PRINT "** ARE YOU A ";R$(RC);" OR ";C$(FNA(12)+12);"?" 1750 GOTO 1700 1751000 REM ***************************************************** 1005 REM * * 1010 REM * WIZARD'S CASTLE GAME FROM JULY/AUGUST 1980 * 1015 REM * ISSUE OF RECREATIONAL COMPUTING MAGAZINE * 1020 REM * WRITTEN FOR EXIDY SORCERER BY JOSEPH R. POWER * 1025 REM * MODIFIED FOR HEATH MICROSOFT BASIC BY J.F.STETSON * 1030 REM * * 1035 REM ***************************************************** BF=0 : OT=8 : AV=0 : HT=0 : T=1 : VF=0 : LF=0 1505 TC=0 : GP=60 : RF=0 : OF=0 : BL=0 : IQ=8 : SX=0 1510 FOR Q=1 TO 8 1515 T(Q)=0 1520 NEXT Q 1525 PRINT CHR$(7); 1530 PRINT "ALL RIGHT, BOLD ONE." 1535 PRINT "YOU MAY BE AN ELF, DWARF, MAN, OR HOBBIT." 1540 GOSUB 5405 1545 FOR Q=1 TO 4 1550 IF LEFT$(R$(Q),1)=O$ THEN RC=Q : ST=ST+2*Q : DX=DX-2*Q 1555 NEXT Q 1560 PRINT 1565 OT=OT+4*(RC=1) 1570 IF RC > 0 THEN R$(3)="HUMAN" : GOTO 1585 1575 PRINT "** THAT WAS INCORRECT. PLEASE TYPE E, D, M, OR H."   5 AH=AV*7 : GP=GP-AV*10 1760 PRINT 1765 PRINT "OK, BOLD ";R$(RC);", YOU HAVE";GP;"GP'S LEFT." 1770 Z$="WEAPONS" 1775 GOSUB 5555 1780 PRINT "SWORD<30> MACE<20> DAGGER<10> NOTHING<0>" 1785 GOSUB 5405 1790 IF O$="N" GOTO 1820 1795 WV=-3*(O$="S")-2*(O$="M")-(O$="D") 1800 IF WV > 0 GOTO 1820 1805 PRINT 1810 PRINT "** IS YOUR IQ REALLY";IQ;"?" 1815 GOTO 1770 1820 GP=GP-WV*10 1825 IF GP < 20 GOTO 1855 1830 PRINT 1835 PRINT "DO YOU WANT TO BUY A LAMP FOR 20 GP'S"; 1840 GOSUB 5415 1845 IF O$="Y" T)="DR" GOTO 2870 2220 O$=LEFT$(O$,1) 2225 IF O$="N" GOTO 2435 2230 IF (O$="S") OR (O$="W") OR (O$="E") GOTO 2440 2235 IF O$="U" GOTO 2465 2240 IF O$="D" GOTO 2480 2245 IF O$="M" GOTO 2505 2250 IF O$="F" THEN ON BL+1 GOTO 2620,2505 2255 IF O$="L" THEN ON BL+1 GOTO 2750,2505 2260 IF O$="O" GOTO 2965 2265 IF O$="G" THEN ON BL+1 GOTO 3185,2505 2270 IF O$="T" THEN PRINT : ON RF+1 GOTO 3315,3335 2275 IF O$="Q" GOTO 3390 2280 IF O$<>"H" GOTO 2420 2285 PRINT CHR$(27);"E" 2290 PRINT "*** WIZARD'S CAST Q=1 TO 3 2010 C(Q,4)=-(C(Q,1)=X)*(C(Q,2)=Y)*(C(Q,3)=Z) 2015 NEXT Q 2020 IF FNA(5) > 1 GOTO 2165 2025 PRINT 2030 PRINT "YOU "; 2035 Q=FNA(7)+BL 2040 IF Q > 7 THEN Q=4 2045 ON Q GOSUB 2125,2065,2115,2055,2135,2145,2155 2050 GOTO 2165 2055 PRINT "STEPPED ON A FROG!" 2060 RETURN 2065 PRINT "HEAR "; 2070 ON FNA(4) GOTO 2075,2085,2095,2105 2075 PRINT "A SCREAM!" 2080 RETURN 2085 PRINT "FOOTSTEPS!" 2090 RETURN 2095 PRINT "A WUMPUS!" 2100 RETURN 2105 PRINT "THUNDER!" 2110 RETURN 2115 PRINT "ST SILMARIL - NO BENEFIT" 2400 PRINT 2405 PRINT "PRESS RETURN WHEN READY TO RESUME, ";R$(RC);"."; 2410 LINE INPUT "";O$ 2415 GOTO 1950 2420 PRINT 2425 PRINT "** SILLY ";R$(RC);", THAT WASN'T A VALID COMMAND!" 2430 GOTO 1950 2435 IF L(FND(Z))=2 GOTO 4970 2440 X=X+(O$="N")-(O$="S") 2445 Y=Y+(O$="W")-(O$="E") 2450 X=FNB(X) 2455 Y=FNB(Y) 2460 GOTO 3450 2465 IF L(FND(Z))=3 THEN Z=Z-1 : GOTO 3450 2470 Z$="UP" 2475 GOTO 2490 2480 Z$="DOWN" 2485 IF L(FND(Z))=4 THEN Z=Z+1 : GOTO 3450 2490 PHEN LF=1 : GP=GP-20 : GOTO 1855 1850 IF O$ <> "N" THEN PRINT : PRINT Y$ : PRINT : GOTO 1835 1855 PRINT 1860 IF GP < 1 THEN Q=0 : GOTO 1915 1865 PRINT "OK, ";R$(RC);", YOU HAVE";GP;"GOLD PIECES LEFT." 1870 PRINT 1875 INPUT "FLARES COST 1 GP EACH. HOW MANY DO YOU WANT";O$ 1880 Q=VAL(O$) 1885 PRINT 1890 IF Q > 0 OR ASC(O$)=48 GOTO 1910 1895 PRINT "** IF YOU DON'T WANT ANY, JUST TYPE 0 (ZERO)." 1900 PRINT 1905 GOTO 1875 1910 IF Q > GP THEN PRINT "** YOU CAN ONLY AFFORD";GP;"." : PRINT : GOTO 1875 LE COMMAND AND INFORMATION SUMMARY ***" 2295 PRINT 2300 PRINT "THE FOLLOWING COMMANDS ARE AVAILABLE :" 2305 PRINT 2310 PRINT "H/ELP N/ORTH S/OUTH E/AST W/EST U/P" 2315 PRINT "D/OWN DR/INK M/AP F/LARE L/AMP O/PEN" 2320 PRINT "G/AZE T/ELEPORT Q/UIT" 2325 PRINT 2330 PRINT "THE CONTENTS OF ROOMS ARE AS FOLLOWS :" 2335 PRINT 2340 PRINT ". = EMPTY ROOM B = BOOK C = CHEST" 2345 PRINT "D = STAIRS DOWN E = ENTRANCE/EXIT F = FLARES" 2350 PRINNEEZED!" 2120 RETURN 2125 PRINT "SEE A BAT FLY BY!" 2130 RETURN 2135 PRINT "SMELL ";C$(12+FNA(13));" FRYING!" 2140 RETURN 2145 PRINT "FEEL LIKE YOU'RE BEING WATCHED!" 2150 RETURN 2155 PRINT "HEAR FAINT RUSTLING NOISES!" 2160 RETURN 2165 IF BL+T(4) <> 2 GOTO 2185 2170 PRINT 2175 PRINT C$(29);" CURES YOUR BLINDNESS!" 2180 BL=0 2185 IF BF+T(6) <> 2 GOTO 2205 2190 PRINT 2195 PRINT C$(31);" DISSOLVES THE BOOK!" 2200 BF=0 2205 PRINT 2210 LINE INPUT "ENTER YOUR COMMAND : ";O$ 2215 IF LEFT$(O$,2RINT 2495 PRINT "** THERE ARE NO STAIRS GOING ";Z$;" FROM HERE!" 2500 GOTO 1950 2505 IF BL <> 1 GOTO 2540 2510 PRINT 2515 PRINT "** YOU CAN'T SEE ANYTHING, YOU DUMB ";R$(RC);"!" 2520 GOTO 1950 2525 REM 2530 REM DISPLAY MAP OF CURRENT CASTLE LEVEL 2535 REM 2540 PRINT 2545 A=X : B=Y 2550 FOR X=1 TO 8 2555 FOR Y=1 TO 8 2560 Q=L(FND(Z)) 2565 IF Q > 99 THEN Q=Q-100:LET Q=34:REM TO HIDE ROOMS 2570 IF X=A AND Y=B THEN PRINT "<";I$(Q);"> "; : GOTO 2580 2575 PRINT " ";I$(Q);" "; 2580 NEXT Y 21915 FL=FL+Q : GP=GP-Q 1920 X=1 : Y=4 : Z=1 1925 PRINT "OK, ";R$(RC);", YOU ARE NOW ENTERING THE CASTLE!" 1930 GOTO 3450 1935 REM 1940 REM MAIN PROCESSING LOOP 1945 REM 1950 T=T+1 1955 IF RF+OF > 0 GOTO 2020 1960 IF C(1,4) > T(1) THEN T=T+1 1965 IF C(2,4) > T(3) THEN GP=GP-FNA(5) 1970 IF GP < 0 THEN GP=0 1975 IF C(3,4) <= T(5) GOTO 2020 1980 A=X : B=Y : C=Z 1985 X=FNA(8) : Y=FNA(8) : Z=FNA(8) 1990 L(FND(Z))=FNE(L(FND(Z)))+100 1995 X=A : Y=B : Z=C 2000 IF L(FND(Z)) <> 1 GOTO 2020 2005 FORT "G = GOLD PIECES M = MONSTER O = CRYSTAL ORB" 2355 PRINT "P = MAGIC POOL S = SINKHOLE T = TREASURE" 2360 PRINT "U = STAIRS UP V = VENDOR W = WARP/ORB" 2365 PRINT 2370 PRINT "THE BENEFITS OF HAVING TREASURES ARE :" 2375 PRINT 2380 PRINT "RUBY RED - AVOID LETHARGY PALE PEARL - AVOID LEECH" 2385 PRINT "GREEN GEM - AVOID FORGETTING OPAL EYE - CURES BLINDNESS" 2390 PRINT "BLUE FLAME - DISSOLVES BOOKS NORN STONE - NO BENEFIT" 2395 PRINT "PALANTIR - NO BENEFI  585 PRINT 2590 PRINT 2595 NEXT X 2600 X=A : Y=B 2605 GOTO 2725 2610 PRINT ") LEVEL";Z 2615 GOTO 1950 2620 IF FL <> 0 GOTO 2650 2625 PRINT "** HEY, BRIGHT ONE, YOU'RE OUT OF FLARES!" 2630 GOTO 1950 2635 REM 2640 REM DISPLAY ADJACENT ROOM CONTENTS WITH FLARE 2645 REM 2650 PRINT 2655 FL=FL-1 2660 A=X : B=Y 2665 FOR Q1=A-1 TO A+1 2670 X=FNB(Q1) 2675 FOR Q2=B-1 TO B+1 2680 Y=FNB(Q2) 2685 Q=FNE(L(FND(Z))) 2690 L(FND(Z))=Q 2695 PRINT " ";I$(Q);" "; 2700 NEXT Q2 2705 PRINT 2710 PRINT 20 PRINT "IT'S ANOTHER VOLUME OF ZOT'S POETRY! - YECH!!" 3045 GOTO 3105 3050 PRINT "IT'S AN OLD COPY OF PLAY";R$(FNA(4));"!" 3055 GOTO 3105 3060 PRINT "IT'S A MANUAL OF DEXTERITY!" 3065 DX=18 3070 GOTO 3105 3075 PRINT "IT'S A MANUAL OF STRENGTH!" 3080 ST=18 3085 GOTO 3105 3090 PRINT "THE BOOK STICKS TO YOUR HANDS -" 3095 PRINT "NOW YOU ARE UNABLE TO DRAW YOUR WEAPON!" 3100 BF=1 3105 L(FND(Z))=1 3110 GOTO 1950 3115 ON FNA(4) GOTO 3120,3140,3160,3140 3120 PRINT "KABOOM! IT EXPLODES!!" 3125 Q=F25,2930,2935,2940,2945,2955 2915 ST=FNC(ST+FNA(3)) : PRINT "STRONGER." : GOTO 1950 2920 ST=ST-FNA(3) : PRINT "WEAKER." : ON (1-(ST<1)) GOTO 1950,4910 2925 IQ=FNC(IQ+FNA(3)) : PRINT "SMARTER." : GOTO 1950 2930 IQ=IQ-FNA(3) : PRINT "DUMBER." : ON (1-(IQ<1)) GOTO 1950,4910 2935 DX=FNC(DX+FNA(3)) : PRINT "NIMBLER." : GOTO 1950 2940 DX=DX-FNA(3) : PRINT "CLUMSIER." : ON (1-(DX<1)) GOTO 1950,4910 2945 Q=FNA(4) : IF Q=RC GOTO 2945 2950 RC=Q : PRINT "BECOME A ";R$(RC);"." : GOTO 1950 2955 SX=1-SX : PRINT "AT (";A;",";B;") LEVEL";C;"!" 3300 GOTO 1950 3305 PRINT "A SOAP OPERA RERUN!" 3310 GOTO 1950 3315 IF RF <> 0 GOTO 3335 3320 PRINT 3325 PRINT "** YOU CAN'T TELEPORT WITHOUT THE RUNESTAFF!" 3330 GOTO 1950 3335 Z$="X-COORDINATE" 3340 GOSUB 5485 3345 X=Q 3350 Z$="Y-COORDINATE" 3355 GOSUB 5485 3360 Y=Q 3365 Z$="Z-COORDINATE" 3370 GOSUB 5485 3375 Z=Q 3380 O$="T" 3385 GOTO 3450 3390 PRINT 3395 PRINT "DO YOU REALLY WANT TO QUIT NOW"; 3400 GOSUB 5415 3405 PRINT 3410 IF O$="Y" GOTO 3425 3415 P715 NEXT Q1 2720 X=A : Y=B 2725 GOSUB 5570 2730 GOTO 1950 2735 REM 2740 REM DISPLAY CONTENTS OF ADJACENT ROOM WITH LAMP 2745 REM 2750 IF LF <> 0 GOTO 2770 2755 PRINT 2760 PRINT "** YOU DON'T HAVE A LAMP, ";R$(RC);"!" 2765 GOTO 1950 2770 PRINT 2775 PRINT "WHERE DO YOU WANT TO SHINE THE LAMP (N,S,E,W)"; 2780 GOSUB 5415 2785 A=X : B=Y 2790 X=FNB(X+(O$="N")-(O$="S")) 2795 Y=FNB(Y+(O$="W")-(O$="E")) 2800 IF A-X+B-Y <> 0 GOTO 2820 2805 PRINT 2810 PRINT "** THAT'S NOT A DIRECTION, ";R$(RC);"!"NA(6) 3130 GOSUB 4860 3135 ON (1-(ST<1)) GOTO 3105,4910 3140 Q=FNA(1000) 3145 PRINT "FIND";Q;"GOLD PIECES!" 3150 GP=GP+Q 3155 GOTO 3105 3160 PRINT "GAS!! YOU STAGGER FROM THE ROOM!" 3165 L(FND(Z))=1 3170 T=T+20 3175 O$=MID$("NSEW",FNA(4),1) 3180 GOTO 2440 3185 IF L(FND(Z))=11 GOTO 3205 3190 PRINT 3195 PRINT "** IT'S HARD TO GAZE WITHOUT AN ORB!" 3200 GOTO 1950 3205 PRINT 3210 PRINT "YOU SEE "; 3215 ON FNA(6) GOTO 3220,3230,3240,3250,3285,3305 3220 PRINT "YOURSELF IN A BLOODY HEAP!" 3225 TURN INTO A "; : IF SX=0 THEN PRINT "FE"; 2960 PRINT "MALE ";R$(RC);"!" : GOTO 1950 2965 IF L(FND(Z)) <> 6 GOTO 2985 2970 PRINT 2975 PRINT "YOU OPEN THE CHEST AND" 2980 GOTO 3115 2985 IF L(FND(Z)) <> 12 GOTO 3005 2990 PRINT 2995 PRINT "YOU OPEN THE BOOK AND" 3000 GOTO 3020 3005 PRINT 3010 PRINT "** THE ONLY THING OPENED WAS YOUR BIG MOUTH!" 3015 GOTO 1950 3020 ON FNA(6) GOTO 3025,3040,3050,3060,3075,3090 3025 PRINT "FLASH! OH NO! YOU ARE NOW A BLIND ";R$(RC);"!" 3030 BL=1 3035 GOTO 3105 304RINT "** THEN DON'T SAY THAT YOU DO!" 3420 GOTO 1950 3425 PRINT 3430 GOTO 5030 3435 REM 3440 REM DISPLAY STATUS INFORMATION 3445 REM 3450 PRINT 3455 IF BL=0 THEN GOSUB 5570 : PRINT 3460 PRINT "STRENGTH =";ST;" INTELLIGENCE =";IQ;" DEXTERITY =";DX 3465 PRINT "TREASURES =";TC;" FLARES =";FL;" GOLD PIECES =";GP 3470 PRINT "WEAPON = ";W$(WV+1);" ARMOR = ";W$(AV+5); 3475 IF LF=1 THEN PRINT " AND A LAMP"; 3480 PRINT 3485 WC=0 3490 Q=FNE(L(FND(Z))) 3495 L(FND(Z))=Q 3500 Z$="YOU NOW HAVE" 3505 2815 GOTO 1950 2820 PRINT 2825 PRINT "THE LAMP SHINES INTO (";X;",";Y;") LEVEL";Z;"." 2830 PRINT 2835 L(FND(Z))=FNE(L(FND(Z))) 2840 PRINT "THERE YOU WILL FIND ";C$(L(FND(Z)));"." 2845 X=A : Y=B 2850 GOTO 1950 2855 REM 2860 REM TAKE A DRINK FROM A POOL 2865 REM 2870 IF L(FND(Z))=5 GOTO 2890 2875 PRINT 2880 PRINT "** IF YOU WANT A DRINK, FIND A POOL!" 2885 GOTO 1950 2890 Q=FNA(8) 2895 PRINT 2900 PRINT "YOU TAKE A DRINK AND "; 2905 IF Q < 7 THEN PRINT "FEEL "; 2910 ON Q GOTO 2915,2920,29ST=ST-FNA(2) : ON (1-(ST<1)) GOTO 1950,4910 3230 PRINT "YOURSELF DRINKING FROM A POOL AND BECOMING ";C$(12+FNA(13));"!" 3235 GOTO 1950 3240 PRINT C$(12+FNA(13));" GAZING BACK AT YOU!" 3245 GOTO 1950 3250 A=X : B=Y : C=Z 3255 X=FNA(8) : Y=FNA(8) : Z=FNA(8) 3260 Q=FNE(L(FND(Z))) 3265 L(FND(Z))=Q 3270 PRINT C$(Q);" AT (";X;",";Y;") LEVEL";Z;"." 3275 X=A : Y=B : Z=C 3280 GOTO 1950 3285 A=FNA(8) : B=FNA(8) : C=FNA(8) 3290 IF FNA(8) < 4 THEN A=O(1) : B=O(2) : C=O(3) 3295 PRINT "***THE ORB OF ZOT***    PRINT 3510 PRINT "HERE YOU FIND ";C$(Q);"." 3515 IF (Q<7) OR (Q=11) OR (Q=12) GOTO 1950 3520 IF Q=7 THEN GP=GP+FNA(10) : PRINT Z$;GP;"." : GOTO 3105 3525 IF Q=8 THEN FL=FL+FNA(5) : PRINT Z$;FL;"." : GOTO 3105 3530 IF Q > 9 GOTO 3545 3535 IF (O(1)=X) AND (O(2)=Y) AND (O(3)=Z) THEN ON (1-(O$="T")) GOTO 2440,5175 3540 X=FNA(8) : Y=FNA(8) : Z=FNA(8) : GOTO 3450 3545 IF Q=10 THEN Z=FNB(Z+1) : GOTO 3450 3550 IF Q <= 25 OR Q >= 34 GOTO 3580 3555 PRINT 3560 PRINT "IT'S NOW YOURS!" 3565 T(Q-25)=1 3570  3920 IF O$ <> "M" OR GP >= 1500 GOTO 3935 3925 PRINT "** SORRY SIR, I'M AFRAID I DON'T GIVE CREDIT!" 3930 GOTO 3865 3935 IF O$="M" THEN GP=GP-1500 : WV=2 : GOTO 3975 3940 IF O$ <> "S" OR GP >= 2000 GOTO 3960 3945 PRINT "** YOUR DUNGEON EXPRESS CARD - "; 3950 PRINT "YOU LEFT HOME WITHOUT IT!" 3955 GOTO 3865 3960 IF O$="S" THEN GP=GP-2000 : WV=3 : GOTO 3975 3965 PRINT "** TRY CHOOSING A SELECTION!" 3970 GOTO 3895 3975 IF GP < 1000 GOTO 1950 3980 Z$="STRENGTH" 3985 GOSUB 5525 3990 IF O$ <> "Y" G THEN PRINT "CHAINMAIL<1500> "; 3765 IF GP > 1999 THEN PRINT "PLATE<2000>"; 3770 PRINT 3775 GOSUB 5405 3780 PRINT 3785 IF O$="N" GOTO 3850 3790 IF O$="L" THEN GP=GP-1250 : AV=1 : AH=7 : GOTO 3850 3795 IF O$ <> "C" OR GP >= 1500 GOTO 3810 3800 PRINT "** YOU HAVEN'T GOT THAT MUCH CASH ON HAND!" 3805 GOTO 3740 3810 IF O$="C" THEN GP=GP-1500 : AV=2 : AH=14 : GOTO 3850 3815 IF O$ <> "P" OR GP >= 2000 GOTO 3830 3820 PRINT "** YOU CAN'T AFFORD PLATE ARMOR!" 3825 GOTO 3740 3830 IF O$="P" THEN GP=GP-20200 PRINT "YOU'RE FACING ";C$(A+12);"!" 4205 PRINT 4210 PRINT "YOU MAY ATTACK OR RETREAT." 4215 IF Q3=1 THEN PRINT "YOU CAN ALSO ATTEMPT A BRIBE." 4220 IF IQ > 14 THEN PRINT "YOU CAN ALSO CAST A SPELL." 4225 PRINT 4230 PRINT "YOUR STRENGTH IS";ST;"AND YOUR DEXTERITY IS";DX;"." 4235 GOSUB 5405 4240 IF O$ <> "A" GOTO 4445 4245 IF WV <> 0 GOTO 4265 4250 PRINT 4255 PRINT "** POUNDING ON ";C$(A+12);" WON'T HURT IT!" 4260 GOTO 4700 4265 IF BF <> 1 GOTO 4285 4270 PRINT 4275 PRINT "** YOU CAN'T BEAT TC=TC+1 3575 GOTO 3105 3580 A=L(FND(Z))-12 3585 WC=0 3590 IF (A<13) OR (VF=1) GOTO 4185 3595 PRINT 3600 PRINT "YOU MAY TRADE WITH, ATTACK, OR IGNORE THE VENDOR." 3605 GOSUB 5405 3610 IF O$="I" GOTO 1950 3615 IF O$ <> "A" GOTO 3640 3620 VF=1 3625 PRINT 3630 PRINT "YOU'LL BE SORRY THAT YOU DID THAT!" 3635 GOTO 4185 3640 IF O$="T" GOTO 3660 3645 PRINT 3650 PRINT "** NICE SHOT, ";R$(RC);"!" 3655 GOTO 3595 3660 FOR Q=1 TO 8 3665 A=FNA(Q*1500) 3670 IF T(Q)=0 GOTO 3700 3675 PRINT 3680 PRINT "OTO 4020 3995 GP=GP-1000 4000 ST=FNC(ST+FNA(6)) 4005 Q=ST 4010 GOSUB 5540 4015 GOTO 3975 4020 IF O$ <> "N" THEN PRINT Y$ : GOTO 3980 4025 IF GP < 1000 GOTO 1950 4030 Z$="INTELLIGENCE" 4035 GOSUB 5525 4040 IF O$ <> "Y" GOTO 4070 4045 GP=GP-1000 4050 IQ=FNC(IQ+FNA(6)) 4055 Q=IQ 4060 GOSUB 5540 4065 GOTO 4025 4070 IF O$ <> "N" THEN PRINT Y$ : GOTO 4030 4075 IF GP < 1000 GOTO 1950 4080 Z$="DEXTERITY" 4085 GOSUB 5525 4090 IF O$ <> "Y" GOTO 4120 4095 GP=GP-1000 4100 DX=FNC(DX+FNA(6)) 4105 Q00 : AV=3 : AH=21 : GOTO 3850 3835 PRINT 3840 PRINT "** DON'T BE SILLY. CHOOSE A SELECTION." 3845 GOTO 3770 3850 IF GP < 1250 GOTO 3975 3855 PRINT 3860 PRINT "YOU HAVE";GP;"GP'S LEFT WITH ";W$(WV+1);" IN HAND." 3865 PRINT 3870 Z$="WEAPON" 3875 GOSUB 5555 3880 PRINT "NOTHING<0> DAGGER<1250> "; 3885 IF GP > 1499 THEN PRINT "MACE<1500> "; 3890 IF GP > 1999 THEN PRINT "SWORD<2000>"; 3895 PRINT 3900 GOSUB 5405 3905 PRINT 3910 IF O$="N" GOTO 3975 3915 IF O$="D" THEN GP=GP-1250 : WV=1 : GOTO 3975 IT TO DEATH WITH A BOOK!" 4280 GOTO 4700 4285 IF DX >= FNA(20)+(3*BL) GOTO 4305 4290 PRINT 4295 PRINT "YOU MISSED, TOO BAD!" 4300 GOTO 4700 4305 Z$=RIGHT$(C$(A+12),LEN(C$(A+12))-2) 4310 IF LEFT$(Z$,1)=" " THEN Z$=MID$(Z$,2) 4315 PRINT 4320 PRINT "YOU HIT THE EVIL ";Z$;"!" 4325 Q2=Q2-WV 4330 IF (A <> 9 AND A <> 12) GOTO 4355 4335 IF FNA(8) <> 1 GOTO 4355 4340 PRINT 4345 PRINT "OH NO! YOUR ";W$(WV+1);" BROKE!" 4350 WV=0 4355 IF Q2 > 0 GOTO 4700 4360 PRINT 4365 MC=MC-1 4370 PRINT C$(A+12);" DO YOU WANT TO SELL ";C$(Q+25);" FOR";A;"GP'S"; 3685 GOSUB 5415 3690 IF O$="Y" THEN TC=TC-1 : T(Q)=0 : GP=GP+A : GOTO 3700 3695 IF O$ <> "N" THEN PRINT Y$ : GOTO 3675 3700 NEXT Q 3705 IF GP >= 1000 GOTO 3725 3710 PRINT 3715 PRINT "YOU'RE TOO POOR TO TRADE, ";R$(RC);"." 3720 GOTO 1950 3725 IF GP < 1250 GOTO 3975 3730 PRINT 3735 PRINT "OK, ";R$(RC);", YOU HAVE";GP;"GP'S AND ";W$(AV+5);" ARMOR." 3740 PRINT 3745 Z$="ARMOR" 3750 GOSUB 5555 3755 PRINT "NOTHING<0> LEATHER<1250> "; 3760 IF GP > 1499=DX 4110 GOSUB 5540 4115 GOTO 4075 4120 IF O$ <> "N" THEN PRINT Y$ : GOTO 4080 4125 IF (GP<1000) OR (LF=1) GOTO 1950 4130 PRINT 4135 PRINT "DO YOU WANT TO BUY A LAMP FOR 1000 GP'S"; 4140 GOSUB 5415 4145 IF O$ <> "Y" GOTO 4175 4150 GP=GP-1000 4155 LF=1 4160 PRINT 4165 PRINT "IT'S GUARANTEED TO OUTLIVE YOU!" 4170 GOTO 1950 4175 IF O$ <> "N" THEN PRINT Y$ : GOTO 4130 4180 GOTO 1950 4185 Q1=1+INT(A/2) : Q2=A+2 : Q3=1 4190 IF (C(1,4)>T(1)) OR (BL=1) OR (DX T-60 GOTO 4395 4380 PRINT 4385 PRINT "YOU SPEND AN HOUR EATING ";C$(A+12);E$(FNA(8));"." 4390 H=T 4395 IF X <> R(1) OR Y <> R(2) OR Z <> R(3) THEN ON (1-(A=13)) GOTO 4420,5305 4400 PRINT 4405 PRINT "GREAT ZOT! YOU'VE FOUND THE RUNESTAFF!";CHR$(7) 4410 R(1)=0 4415 RF=1 4420 Q=FNA(1000) 4425 PRINT 4430 PRINT "YOU NOW GET HIS HOARD OF";Q;"GP'S!" 4435 GP=GP+Q 4440 GOTO 3105 4445 IF O$="R" GOTO 4700 4450 IF O$ <> "C" GOTO 4595 4455 IF IQ >= 15 OR Q3 <= 1 GOTO 4845 PRINT "** DON'T PRESS YOUR LUCK, ";R$(RC);"!" 4850 PRINT 4855 GOTO 4825 4860 IF AV=0 GOTO 4900 4865 Q=Q-AV 4870 AH=AH-AV 4875 IF Q < 0 THEN AH=AH-Q : Q=0 4880 IF AH >= 0 GOTO 4900 4885 AH=0 : AV=0 4890 PRINT 4895 PRINT "YOUR ARMOR HAS BEEN DESTROYED . . . GOOD LUCK!" 4900 ST=ST-Q 4905 RETURN 4910 PRINT CHR$(7) 4915 GOSUB 5375 4920 PRINT "A NOBLE EFFORT, OH FORMERLY LIVING ";R$(RC);"!" 4925 PRINT 4930 PRINT "YOU DIED DUE TO LACK OF "; 4935 IF ST < 1 THEN PRINT "STRENGTH." 4940 IF IQIT TO ME"; 4655 GOSUB 5415 4660 IF O$="N" GOTO 4700 4665 IF O$ <> "Y" THEN PRINT Y$ : GOTO 4645 4670 T(Q)=0 4675 TC=TC-1 4680 PRINT 4685 PRINT "OK, JUST DON'T TELL ANYONE ELSE." 4690 VF=VF+(L(FND(Z))=25) 4695 GOTO 1950 4700 Q3=2 4705 IF WC <= 0 GOTO 4720 4710 WC=WC-1 4715 IF WC=0 THEN PRINT : PRINT "THE WEB JUST BROKE!" 4720 Z$=RIGHT$(C$(A+12),LEN(C$(A+12))-2) 4725 IF LEFT$(Z$,1)=" " THEN Z$=MID$(Z$,2) 4730 IF WC <= 0 GOTO 4750 4735 PRINT 4740 PRINT "THE ";Z$;" IS STUCK AND CAN'T ATTACK NO 5115 GOSUB 5415 5120 PRINT 5125 IF O$ <> "Y" GOTO 5155 5130 PRINT "SOME ";R$(RC);"S NEVER LEARN!" 5135 PRINT 5140 PRINT "PLEASE BE PATIENT WHILE THE CASTLE IS RESTOCKED." 5145 PRINT 5150 GOTO 1105 5155 IF O$ <> "N" THEN PRINT Y$ : GOTO 5110 5160 PRINT "MAYBE DUMB ";R$(RC);" IS NOT SO DUMB AFTER ALL!" 5165 PRINT 5170 GOTO 5580 5175 PRINT 5180 PRINT "GREAT UNMITIGATED ZOT!" 5185 PRINT 5190 PRINT "YOU JUST FOUND ***THE ORB OF ZOT***!" 5195 PRINT 5200 PRINT "THE RUNESTAFF HAS DISAPPEARED!" 5 4475 4460 PRINT 4465 PRINT "** YOU CAN'T CAST A SPELL NOW!" 4470 GOTO 4195 4475 PRINT 4480 PRINT "WHICH SPELL (WEB, FIREBALL, DEATHSPELL)"; 4485 GOSUB 5415 4490 PRINT 4495 IF O$ <> "W" GOTO 4515 4500 ST=ST-1 4505 WC=FNA(8)+1 4510 ON (1-(ST<1)) GOTO 4700,4910 4515 IF O$ <> "F" GOTO 4560 4520 Q=FNA(7)+FNA(7) 4525 ST=ST-1 4530 IQ=IQ-1 4535 IF (IQ < 1) OR (ST < 1) GOTO 4910 4540 PRINT "IT DOES";Q;"POINTS WORTH OF DAMAGE." 4545 PRINT 4550 Q2=Q2-Q 4555 GOTO 4355 4560 IF O$="D" GOTO 4580 456 < 1 THEN PRINT "INTELLIGENCE." 4945 IF DX < 1 THEN PRINT "DEXTERITY." 4950 PRINT 4955 Q3=1 4960 PRINT "AT THE TIME YOU DIED, YOU HAD :" 4965 GOTO 5055 4970 Q3=0 4975 PRINT 4980 PRINT "YOU LEFT THE CASTLE WITH"; 4985 IF OF=0 THEN PRINT "OUT"; 4990 PRINT " THE ORB OF ZOT." 4995 PRINT 5000 IF OF=0 GOTO 5030 5005 PRINT 5010 PRINT "AN INCREDIBLY GLORIOUS VICTORY!!" 5015 PRINT 5020 PRINT "IN ADDITION, YOU GOT OUT WITH THE FOLLOWING :" 5025 GOTO 5050 5030 PRINT 5035 PRINT "A LESS THAN AWE-INSPIW!" 4745 GOTO 4805 4750 PRINT 4755 PRINT "THE ";Z$;" ATTACKS!" 4760 IF DX < FNA(7)+FNA(7)+FNA(7)+3*BL GOTO 4780 4765 PRINT 4770 PRINT "WHAT LUCK, HE MISSED YOU!" 4775 GOTO 4805 4780 PRINT 4785 PRINT "OUCH! HE HIT YOU!" 4790 Q=Q1 4795 GOSUB 4860 4800 IF ST < 1 GOTO 4910 4805 IF O$ <> "R" GOTO 4195 4810 PRINT 4815 PRINT "YOU HAVE ESCAPED!" 4820 PRINT 4825 PRINT "DO YOU WANT TO GO NORTH, SOUTH, EAST, OR WEST"; 4830 GOSUB 5415 4835 IF O$="N" OR O$="S" OR O$="E" OR O$="W" GOTO 2440 4840 PRINT205 RF=0 5210 OF=1 5215 O(1)=0 5220 GOTO 3105 5225 DATA AN EMPTY ROOM,.,THE ENTRANCE,E,STAIRS GOING UP,U 5230 DATA STAIRS GOING DOWN,D,A POOL,P,A CHEST,C,GOLD PIECES,G 5235 DATA FLARES,F,A WARP,W,A SINKHOLE,S,A CRYSTAL ORB,O 5240 DATA A BOOK,B,A KOBOLD,M,AN ORC,M,A WOLF,M,A GOBLIN,M,AN OGRE,M 5245 DATA A TROLL,M,A BEAR,M,A MINOTAUR,M,A GARGOYLE,M,A CHIMERA,M 5250 DATA A BALROG,M,A DRAGON,M,A VENDOR,V,THE RUBY RED,T 5255 DATA THE NORN STONE,T,THE PALE PEARL,T,THE OPAL EYE,T 5260 DATA THE GREEN GEM5 PRINT 4570 PRINT "** TRY ONE OF THE OPTIONS GIVEN." 4575 GOTO 4195 4580 PRINT "DEATH . . . "; 4585 IF IQ < FNA(4)+15 THEN PRINT "YOURS!" : IQ=0 : GOTO 4910 4590 PRINT "HIS!" : Q2=0 : GOTO 4360 4595 IF O$="B" AND Q3 <= 1 GOTO 4615 4600 PRINT 4605 PRINT "** CHOOSE ONE OF THE OPTIONS LISTED." 4610 GOTO 4195 4615 IF TC <> 0 GOTO 4635 4620 PRINT 4625 PRINT "ALL I WANT IS YOUR LIFE!" 4630 GOTO 4700 4635 Q=FNA(8) 4640 IF T(Q)=0 GOTO 4635 4645 PRINT 4650 PRINT "I WANT ";C$(Q+25);". WILL YOU GIVE RING DEFEAT." 5040 PRINT 5045 PRINT "WHEN YOU LEFT THE CASTLE, YOU HAD :" 5050 IF Q3=0 THEN PRINT "YOUR MISERABLE LIFE!" 5055 FOR Q=1 TO 8 5060 IF T(Q)=1 THEN PRINT C$(Q+25) 5065 NEXT Q 5070 PRINT W$(WV+1);" AND ";W$(AV+5); 5075 IF LF=1 THEN PRINT " AND A LAMP"; 5080 PRINT 5085 PRINT "YOU ALSO HAD";FL;"FLARES AND";GP;"GOLD PIECES" 5090 IF RF=1 THEN PRINT "AND THE RUNESTAFF" 5095 PRINT 5100 PRINT "AND IT TOOK YOU";T;"TURNS!" 5105 PRINT 5110 PRINT "ARE YOU FOOLISH ENOUGH TO WANT TO PLAY AGAIN";  ,T,THE BLUE FLAME,T,THE PALANTIR,T,THE SILMARIL,T 5265 DATA X,"?",NO WEAPON," SANDWICH" 5270 DATA DAGGER," STEW",MACE," SOUP",SWORD," BURGER",NO ARMOR," ROAST" 5275 DATA LEATHER," FILET",CHAINMAIL," TACO",PLATE," PIE" 5280 DATA HOBBIT,ELF,MAN,DWARF 5285 X=FNA(8) : Y=FNA(8) 5290 IF L(FND(Z)) <> 101 GOTO 5285 5295 L(FND(Z))=Q 5300 RETURN 5305 PRINT 5310 PRINT "YOU GET ALL HIS WARES :" 5315 PRINT "PLATE ARMOR" 5320 AV=3 : AH=21 5325 PRINT "A SWORD" 5330 WV=3 5335 PRINT "A STRENGTH POTION" 5340 T WINNING ONE DOES NOT DETRACT FROM PLAYING FUTURE GAMES. AT PRESENT, THERE ARE VERISONS OF WIZARD'S CASTLE FOR THE EXIDY SORCERER, TRS-80, HP-2000 AND HEATH H-8/H-89 COMPUTERS. * * BACKGROUND HISTORY * MANY CYCLES AGO, IN THE KINGDOM OF N'DIC, THE GNOMIC WIZARD ZOT FORGED HIS GREAT *ORB OF POWER*. SOON AFTER DOING THIS, HE VANISHED, LEAVING BEHIND HIS VAST SUBTERRANEAN CASTLE FILLED WITH ESURIENT MONSTERS, FABULOUS TREASURES, AND THE INCREDIBLE *ORB OF ZOT*. FROM THAT TIME HENCE, MANY A BOLDTYPES OF ";Z$;" YOU CAN BUY :" 5565 RETURN 5570 PRINT "YOU ARE AT (";X;",";Y;") LEVEL";Z;"." 5575 RETURN 5580 END ARE THE  DISTRIBUTED DIFFERENTLY FOR EACH RACE. * SEX YOU MAY BE MALE OR FEMALE. BOTH ARE EQUAL IN ABILITY AND IN THE NUMBER OF POINTS. BE CREATIVE WITH YOUR RESPONSE. * POINTS EACH CHARACTER STARTS WITH A NUMBER OF POINTS FOR THE ATTRIBUTES OF STRENGTH (ST), INTELLIGENCE (IQ), AND DEXTERITY (DX). IN ADDITION, THERE ARE SOME OTHER POINTS WHICH YOU MAY DISTRIBUTE BETWEEN THESE THREE ATTRIBUTES AS YOU WISH. * YOUR ST, IQ, AND DX MAY BE ANY NUMBER FROM 1 TST=FNC(ST+FNA(6)) 5345 PRINT "AN INTELLIGENCE POTION" 5350 IQ=FNC(IQ+FNA(6)) 5355 PRINT "A DEXTERITY POTION" 5360 DX=FNC(DX+FNA(6)) 5365 IF LF=0 THEN PRINT "A LAMP" : LF=1 5370 GOTO 4420 5375 FOR Q=1 TO 64 5380 PRINT "*"; 5385 NEXT Q 5390 PRINT 5395 PRINT 5400 RETURN 5405 PRINT 5410 PRINT "YOUR CHOICE"; 5415 INPUT O$ 5420 O$=LEFT$(O$,1) 5425 RETURN 5430 PRINT "HOW MANY POINTS DO YOU WISH TO ADD TO YOUR ";Z$; 5435 INPUT O$ 5440 PRINT 5445 Q=VAL(O$) 5450 IF Q=0 AND ASC(O$) <> 48 THEN Q=- YOUTH HAS VENTURED INTO THE WIZARD'S CASTLE. AS YET, *NONE* HAS EVER EMERGED VICTORIOUS. * * INTRODUCTION * WIZARD'S CASTLE IS A COMPUTERIZED SIMULATION OF ONE OF THE MOST COMMON AND POPULAR FANTASY MOTIFS - THE LONE ADVENTURER'S QUEST WITHIN AN IMMENSE UNDER- GROUND LABYRINTH. EACH GAME IS SEPARATE FROM ALL OTHERS, SO THE GAME IS A CHALLENGE EVEN AFTER YOU HAVE WON SEVERAL TIMES. EACH GAME WILL RESULT IN A WIN OR A LOSS, DEPENDING ON A PLAYER'S SKILL AND LUCK. THE INSTRUCTIONS WHICH FOLLOW* * WIZARD'S CASTLE GAME FROM JULY/AUGUST 1980 * ISSUE OF RECREATIONAL COMPUTING MAGAZINE * * ORIGINAL EXIDY SORCERER VERSION BY JOSEPH R. POWER * MODIFIED HEATH MICROSOFT BASIC VERSION BY J.F.STETSON * WIZARD'S CASTLE IS A FANTASY GAME ABOUT EQUAL IN COMPLEXITY TO THE SEVERAL VERSIONS OF "ADVENTURE" WHICH ARE NOW AVAILABLE FOR MICROCOMPUTERS AND IS A VERY LARGE "BASIC" PROGRAM IN ITS OWN RIGHT. UNLIKE ADVENTURE, THE CASTLE IS RANDOMLY STOCKED FOR EACH GAME, WHICH MEANS THAO 18. IF ANY OF THE THREE DROPS BELOW 1, YOU HAVE DIED. FOR ALL THREE ATTRIBUTES, THE LARGER THE NUMERICAL VALUE, THE BETTER. EACH CHARACTER ALSO STARTS THE GAME WITH 60 GOLD PIECES (GP'S) WITH WHICH TO PURCHASE SOME, NONE, OR ALL OF THE FOLLOWING ITEMS : * ARMOR YOU MAY BUY PLATE ARMOR FOR 30 GP'S, CHAINMAIL FOR 20 GP'S, OR LEATHER FOR 10 GP'S. YOU CAN WEAR ONLY ONE SUIT OF ARMOR AT A TIME. THE MORE EXPENSIVE THE ARMOR, THE MORE DAMAGE IT WILL ABSOR1 5455 IF Q<0 OR Q>OT OR Q<>INT(Q) THEN PRINT "** "; : GOTO 5430 5460 OT=OT-Q 5465 RETURN 5470 INPUT O$ 5475 Q=INT(VAL(O$)) 5480 RETURN 5485 PRINT 5490 PRINT Z$; 5495 INPUT O$ 5500 Q=INT(VAL(O$)) 5505 IF Q > 0 AND Q < 9 THEN RETURN 5510 PRINT 5515 PRINT "** TRY A NUMBER FROM 1 TO 8." 5520 GOTO 5485 5525 PRINT 5530 PRINT "DO YOU WANT TO BUY A POTION OF ";Z$;" FOR 1000 GP'S"; 5535 GOTO 5415 5540 PRINT 5545 PRINT "YOUR ";Z$;" IS NOW";Q;"." 5550 RETURN 5555 PRINT 5560 PRINT "THESE ARE THE  EXPLAIN THE RULES AND OPTIONS OF THE GAME. IF AT ANY TIME, HOWEVER, YOU ARE NOT SURE OF WHAT TO DO - EXPERIMENT. THE PROGRAM IS DESIGNED TO PREVENT INVALID INPUTS. * * CHARACTER CREATION * AT THE START OF EACH GAME, YOU WILL BE ASKED A NUMBER OF QUESTIONS ABOUT WHAT TYPE OF CHARACTER YOU WILL HAVE. YOU MUST MAKE CHOICES ABOUT THE FOLLOWING : * RACE YOU MAY BE AN ELF, DWARF, MAN, OR HOBBIT. EACH RACE STARTS WITH A TOTAL OF 32 POINTS (EXCEPT HOBBITS, WHO ONLY GET 28), BUT THEY ARE   B. * WEAPON YOU MAY BUY A SWORD FOR 30 GP'S, A MACE FOR 20 GP'S, OR A DAGGER FOR 10 GP'S. YOU CAN ONLY CARRY A SINGLE WEAPON AT A TIME. THE MORE EXPENSIVE THE WEAPON, THE MORE DAMAGE IT DOES TO THE VARIOUS MONSTERS. * LAMP IF, AFTER SELECTING ARMOR AND A WEAPON, YOU HAVE 20 GP'S OR MORE LEFT, YOU MAY BUY A LAMP FOR 20 GP'S. HAVING THE LAMP WILL ALLOW YOU TO LOOK INTO AN ADJACENT ROOM WITHOUT HAVING TO ENTER IT. * FLARES IF, AFTER ALL OTHER PURCHASES, YOU HAVE AUST DECIDE WHAT ACTION YOU WISH TO PERFORM. IF YOUR CHOICE IS NOT VALID IN YOUR CURRENT SITUATION, THE PROGRAM WILL INFORM YOU AND ALLOW YOU TO TRY AGAIN. THE FOLLOWING IS A LIST OF THE COMMANDS WHICH THE PROGRAM UNDERSTANDS, WITH A DESCRIPTION OF THEIR EFFECTS AND RESTRICTIONS : * NORTH MOVES YOU TO THE ROOM NORTH OF YOUR PRESENT POSITION. WHEN YOU GO NORTH FROM THE ENTRANCE / EXIT ROOM, THE GAME TERMINATES. IN ALL OTHER CASES, THE NORTH EDGE WRAPS AROUND TO THE SOUTH. * SOUTH ILL HAVE AS CONTENTS ONE OF THE FOLLOWING : * E THE ENTRANCE / EXIT ROOM . AN EMPTY ROOM CONTAINING NOTHING U STAIRS GOING UP TO THE LEVEL ABOVE D STAIRS GOING DOWN TO THE LEVEL BELOW P A MAGIC POOL FROM WHICH YOU MAY DRINK C A CHEST WHICH YOU MAY OPEN B A BOOK WHICH YOU MAY OPEN G FROM 1 TO 10 GOLD PIECES F FROM 1 TO 3 FLARES W A WARP TO ANOTHER RANDOM LOCATION M A MONSTER (ONE OF 12 DIFFERENT TYPES) V A VENDOR WHICH YOU MMAP AT ANY TIME UNLESS YOU ARE EITHER BLIND OR ARE RETREATING FROM A MONSTER. * FLARE CAUSES ONE OF YOUR FLARES TO BE LIT, REVEALING THE CONTENTS OF ALL ROOMS SURROUNDING YOUR CURRENT POSITION. BECAUSE EACH EDGE IS JOINED TO THE OPPOSITE EDGE, YOU WILL ALWAYS SEE NINE ROOMS WITH YOUR LOCATION IN THE CENTER. EACH FLARE BURNS AWAY TO NOTHING. YOU MAY LIGHT FLARES AS LONG AS YOU HAVE SOME AND YOU ARE NOT BLIND OR RETREATING FROM A MONSTER. FOR THOSE WHONY MONEY LEFT, YOU MAY BUY FLARES FOR 1 GP EACH. LIGHTING A FLARE REVEALS THE CONTENTS OF ALL THE ROOMS SURROUNDING YOUR CURRENT LOCATION. * ONCE YOU HAVE CREATED AND EQUIPPED A CHARACTER, YOU ARE READY TO ENTER THE CASTLE AND BEGIN YOUR ADVENTURES. * * THE CASTLE * THE CASTLE IS ARRANGED AS AN 8 X 8 X 8 THREE DIMENSIONAL MATRIX. THIS MEANS THAT THERE ARE 8 LEVELS WITH 64 ROOMS ON EACH LEVEL. THE CASTLE LEVELS ARE NUMBERED FROM 1 (THE TOP LEVEL) TO 8 (THE BOT MOVES YOU TO THE ROOM SOUTH OF YOUR PRESENT POSITION. IN ALL CASES, THE SOUTH EDGE WRAPS AROUND TO THE NORTH EDGE. * EAST MOVES YOU TO THE ROOM EAST OF YOUR PRESENT POSITION. IN ALL CASES, THE EAST EDGE WRAPS AROUND TO THE WEST EDGE. * WEST MOVES YOU TO THE ROOM WEST OF YOUR PRESENT POSITION. IN ALL CASES, THE WEST EDGE WRAPS AROUND TO THE EAST EDGE. * UP CAUSES YOU TO ASCEND STAIRS GOING UP. YOU MUST BE IN A ROOM CONTAINING STAIRS GOING UP. * DOWN AY ATTACK, IGNORE OR TRADE WITH O A CRYSTAL ORB (THIS IS NOT THE *ORB OF ZOT*) S A SINKHOLE (A ROOM WITH NO FLOOR) T A TREASURE (ONE OF THE 8 IN THE CASTLE) * THE SINGLE LETTERS ARE THE ABBREVIATIONS FOR THE ROOM CONTENTS WHICH ARE DISPLAYED WHENEVER YOU LOOK AT YOUR MAP OR LIGHT A FLARE. WHEN YOU LOOK AT YOUR MAP, THE ROOM YOU ARE CURRENTLY LOCATED IN IS BRACKETED BY < >. * * PLAYER COMMANDS * WHENEVER THE PROGRAM ASKS FOR A COMMAND, YOU M ARE FAMILIAR WITH ANY OF THE COMMON "STAR TREK" GAMES, A FLARE WORKS MUCH LIKE A LONG RANGE SENSOR SCAN WITH THE ADDITION OF WRAPAROUND. * LAMP ALLOWS YOU TO SHINE YOUR LAMP INTO ANY ONE OF THE ROOMS NORTH, SOUTH, EAST, OR WEST OF YOUR CURRENT POSITION, REVEALING THE ROOM'S CONTENTS. UNLIKE FLARES, THE LAMP MAY BE USED REPEATEDLY. YOU MAY USE YOUR LAMP AT ANY TIME UNLESS YOU DON'T HAVE A LAMP, ARE BLIND, OR ARE RETREATING FROM A MONSTER. * OPEN TOM LEVEL). EACH CASTLE LEVEL IS CONSTRUCTED LIKE A DOUGHNUT IN THAT THE NORTH EDGE IS CONNECTED TO THE SOUTH EDGE AND THE EAST EDGE IS CONNECTED TO THE WEST EDGE. IN A SIMILAR FASHION, THE SINKHOLES (EXPLAINED LATER) ON LEVEL 8 WILL "DROP" YOU DOWN TO LEVEL 1. THE ONLY ROOM WHICH DOES NOT FUNCTION LIKE THIS IS THE ENTRANCE / EXIT ROOM OF THE CASTLE WHICH IS ALWAYS LOCATED AT LOCATION (1,4) LEVEL 1. GOING NORTH FROM THIS ROOM TAKES YOU OUT OF THE CASTLE AND ENDS THE GAME. * EACH ROOM OF THE CASTLE WCAUSES YOU TO DESCEND STAIRS GOING DOWN. YOU MUST BE IN A ROOM CONTAINING STAIRS GOING DOWN. * DRINK CAUSES YOU TO TAKE A DRINK FROM A MAGIC POOL. YOU MAY REPEAT THIS COMMAND AS OFTEN AS YOU WISH, BUT YOU MUST BE IN A ROOM CONTAINING A MAGIC POOL. * MAP CAUSES A MAP OF THE LEVEL YOU ARE CURRENTLY ON TO BE PRINTED. ALL UNEXPLORED ROOMS ARE DISPLAYED AS "?". ALL OTHER ROOMS ARE DISPLAYED AS THEIR ONE CHARACTER ABBREVIATIONS. YOU MAY LOOK AT YOUR    CAUSES YOU TO OPEN A BOOK OR A CHEST WHICH IS IN THE ROOM WITH YOU. * GAZE CAUSES YOU TO GAZE INTO A CRYSTAL ORB. WHEN YOU SEE YOURSELF IN A BLOODY HEAP, YOU LOSE 1 OR 2 POINTS OF STRENGTH. WHEN YOU SEE THE LOCATION OF THE *ORB OF ZOT*, THERE IS ONLY A 50% CHANCE THAT IT IS CORRECT. YOU CANNOT GAZE WHEN YOU ARE BLIND OR WHEN YOU ARE NOT IN A ROOM CONTAINING A CRYSTAL ORB. * TELE- ALLOWS YOU TO TELEPORT DIRECTLY INTO A SPECIFIC ROOM ANYWHERE IN PORT THE CASTHANDS. * THE NORN STONE - HAS NO SPECIAL POWER. THE PALANTIR - HAS NO SPECIAL POWER. THE SILMARIL - HAS NO SPECIAL POWER. * THERE ARE THREE CURSES : * LETHARGY - THIS GIVES THE MONSTERS THE FIRST ATTACK WHICH PREVENTS YOU FROM BRIBING THEM OR CASTING SPELLS ON THEM. * LEECH - THIS TAKES FROM 1 TO 5 GP'S FROM YOU EACH TURN UNTIL YOU HAVE NO GOLD PIECES LEFT. * FORGETFULLNESS - THIS CAUSES YOU TO FORGET WHAT YOU KNOW ABOUT THE CASTLE. YOUR MAP WILL SLOWLY RETURN TO ALL QFECTS ARE AS FOLLOWS : * WEB TRAPS THE MONSTER IN A STICKY WEB SO THAT IT CAN'T FIGHT BACK AS YOU ATTACK IT. THIS SPELL LASTS FROM 2 TO 9 TURNS AND COSTS YOU ONE STRENGTH (ST) POINT. * FIRE- HITS THE MONSTER WITH A BALL OF FLAME THAT CAUSES BETWEEN 2 AND 14 BALL POINTS WORTH OF DAMAGE INSTANTLY. IT COSTS ONE STRENGTH POINT AND ONE INTELLIGENCE POINT. * DEATH- IS A CONTEST OF WILLS BETWEEN THE MONSTER AND YOURSELF. WHOEVER SPELL HAS THE LOWER INTELLIGENCE DIES AOF THESE ATTRIBUTES YOU CAN HAVE IS 18), AND A LAMP, IF YOU DON'T ALREADY HAVE ONE. IF YOU CHOOSE TO ATTACK A VENDOR, YOU WILL THEN ANTAGONIZE EVERY VENDOR IN THE CASTLE, AND THEY WILL ALL REACT LIKE MONSTERS. YOU WILL ALSO LOSE THE ABILITY TO TRADE WITH THEM. KILLING A VENDOR, HOWEVER, WILL GIVE YOU NEW PLATE ARMOR, A SWORD, ONE OF EACH KIND OF POTION, AND A LAMP (IF YOU DON'T HAVE ONE), IN ADDITION TO HIS HOARD OF BETWEEN 1 AND 1000 GOLD PIECES. TO END HOSTILITIES AND REESTABLISH TRADING PRIVILEGES,LE. THIS IS THE ONLY WAY TO ENTER THE ROOM CONTAINING THE *ORB OF ZOT*. YOU MUST HAVE THE RUNESTAFF IN ORDER TO TELEPORT. * QUIT ALLOWS YOU TO END THE GAME WHILE YOU ARE STILL IN THE CASTLE. YOU WILL BE ASKED IF YOU REALLY WANT TO QUIT, IN CASE YOU MADE A MISTAKE OR WANT TO CHANGE YOUR MIND. IF YOU QUIT, YOU WILL LOSE THE GAME. * HELP CAUSES A SUMMARY OF THE AVAILABLE COMMANDS, ABBREVIATIONS USED IN DESCRIBING THE CONTENTS OF ROOMS, AND THE BENEFITS OF POSSESSINUESTION MARKS. HOWEVER, THE CONTENTS OF THE ROOMS IN THE CASTLE ARE THE SAME. * IN ADDITION TO NULLIFYING THE EFFECTS OF THE CURSES, THE TREASURES ALSO PROVIDE PROTECTION FROM TWO UNDESIRABLE THINGS WHICH CAN HAPPEN WHEN YOU OPEN A BOOK. THESE ARE GOING BLIND, WHICH PREVENTS YOU FROM SEEING YOUR MAPS, LIGHTING FLARES, USING YOUR LAMP, GAZING INTO ORBS, AND BEING INFORMED OF YOUR PRESENT LOCATION, AND SECONDLY, HAVING THE BOOK STICK TO YOUR HANDS, WHICH PREVENTS YOU FROM USING YOUR WEAPON TO T ONCE. IT COSTS NOTHING TO USE, BUT IT IS VERY RISKY. EVEN WITH AN IQ OF 18 (THE HIGHEST POSSIBLE), YOU STILL HAVE A 25% CHANCE OF BEING KILLED. * * TREASURES, CURSES, BLINDNESS, AND SUCH * IN THE CASTLE ARE EIGHT RANDOMLY PLACED TREASURES : * THE RUBY RED - WARDS OFF THE CURSE OF LETHARGY. THE PALE PEARL - WARDS OFF THE CURSE OF THE LEECH. THE OPAL EYE - CURES BLINDNESS. THE GREEN GEM - WARDS OFF THE CURSE OF FORGETFULLNESS. THE BLUE FLAME - DISSOLVES BOOKS STUCK TO YOUR  YOU MUST BRIBE ANY VENDOR IN THE CASTLE WITH THE TREASURE OF HIS CHOICE. * * MONSTERS AND THE RUNESTAFF * THERE ARE 12 TYPES OF MONSTERS IN THE CASTLE : * KOBOLD, ORC, WOLF, GOBLIN, OGRE, TROLL BEAR, MINOTAUR, GARGOYLE, CHIMERA, BALROG, DRAGON * PLEASE NOTE THAT EACH TIME YOU STRIKE A GARGOYLE OR A DRAGON, THERE IS A POSSIBILITY THAT YOUR WEAPON WILL BE SHATTERED. * EACH MONSTER POSSESSES A HOARD OF FROM 1 TO 1000 GP'S WHICH YOU OBTAIN WHEN YOU KILL THE MONSTER. IN ADDITION, ONE OF THE G EACH OF THE TREASURES TO BE DISPLAYED AT ANY TIME DURING THE GAME. * ALL OF THE COMMANDS, EXCEPT DRINK, CAN BE ABBREVIATED TO THEIR FIRST LETTER (M FOR MAP, Q FOR QUIT, ETC.). THE ABBREVIATION FOR DRINK IS "DR" (TO DISTINGUISH IT FROM "D" FOR THE DOWN COMMAND). * * MAGIC SPELLS * WHENEVER YOUR INTELLIGENCE (IQ) BECOMES 15 OR HIGHER, YOU GAIN THE OPTION TO CAST A MAGIC SPELL ON A MONSTER IF YOU HAVE THE VERY FIRST COMBAT OPTION. THE THREE SPELLS AND THEIR EFFIGHT MONSTERS (YOU CAN STILL CAST SPELLS AT THEM IF YOU ARE SMART ENOUGH, HOWEVER). * * VENDORS * ON EVERY LEVEL IN THE CASTLE, THERE ARE VENDORS WHO ARE MORE THAN WILLING TO SELL YOU VARIOUS ITEMS AT GROSSLY INFLATED PRICES. NORMALLY, THE VENDORS WILL MAKE YOU AN OFFER FOR EVERY TREASURE YOU HAVE, AND THEN, DEPENDING ON THE AMOUNT OF GOLD YOU HAVE, WILL SELL YOU NEW ARMOR, A NEW WEAPON, POTIONS OF STRENGTH, INTELLIGENCE AND DEXTERITY (NO MATTER HOW MANY POTIONS YOU BUY, THE MAXIMUM AMOUNT   MONSTERS IS CARRYING THE RUNESTAFF (YOU WON'T KNOW WHICH ONE UNTIL YOU KILL IT). YOU MUST HAVE THE RUNESTAFF TO TELEPORT, AND WHEN YOU TELEPORT INTO THE CASTLE ROOM WHICH CONTAINS THE *ORB OF ZOT*, THE RUNESTAFF DISAPPEARS (YOU MUST FIND YOUR WAY TO THE CASTLE EXIT WITHOUT IT). * * WARPS AND THE *ORB OF ZOT* * ALL BUT ONE OF THE ROOMS DENOTED AS "W" REALLY ARE WARPS, AND WALKING, FALLING, OR TELEPORTING INTO THEM WILL CAUSE YOU TO MOVE TO ANY ROOM IN THE CASTLE AT RANDOM. THE ONE EXCEPTION Ith file - ! ~T #M M 2 2 2 2 ! >2 3o: : @ ***No CRC Files found***$> ʉ ʉw#: <2 P6: .6@ Can not parse string ! ~ʽT #ñM ! > 6 #6^#6! ~T #! 4M #x] #e w~ T #>2 @ - s M@ File not found ! 4 >2 o: G: „: G: „@ *Match* 2 ! 4@ <-- is, was --> : ) > T : ) M 2 ! 4<2 ~# @ Not a space between CRC values<2 G-CATALOG???RROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2|: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2h2|2   ~$#~# x  : F} *}= ">͇1 ].”#””͡”››tK››͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›, › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~#CRC.COM 5.0 6/18/82CRCKFILE???!9" 1 M @ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :] O@ ++Searching for CRCKLIST file++@ Now searching for "CRCKFILE" file++ !  1 .) F!  ͡]͸! ͔0CRCKLIST???CRCKFILE???!9" M à*,*.}|ډ!".*,{z{** u*.".G*.",!".***,}>*.#".ɯ22)! ",". <  NO FILECRC FILE$!   >. @ Checking wi match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ * d͔  ͔ 0T  Җ Wyʩ 0T 0ztiilRTING WITH "**", IT MEANS THAT THE LAST THING YOU TYPED WAS UNACCEPTABLE TO THE PROGRAM AT THAT TIME. FOR INSTANCE, IF YOU GET THE MESSAGE "** IT'S HARD TO GAZE WITHOUT AN ORB.", THIS MEANS THAT YOU TRIED TO GAZE FROM A ROOM WHICH DID NOT CONTAIN A CRYSTAL ORB. YOU ARE ALWAYS REQUIRED TO REDO YOUR LAST RESPONSE WHEN YOU RECEIVE AN "**" TYPE MESSAGE. * * GOOD LUCK, AND BEWARE! * EOF *#"ɯ2i2}! "!"]]2 s : ~# ++FILE NOT FOUND++$: F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  w# !]͐ DONE$!e S!]Q !eZ @ --> FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ E   Using CRC Type CRC to verify all the files on this disk. Type CRC *.* F to generate CRC's for an entire disk and create a CRC file (CRCKLIST.CRC) for checking the CRC's of a copy of the disk etc. Omitting the F will suppress creation of a CRCKLIST.CRC file. *.* can be replaced with an unambiguous file name for checking just one file. E .BAS CRC = 9F 0E --> FILE: SLOTS .BAS CRC = 10 70 --> FILE: KSTROKES.DOC CRC = 85 81 --> FILE: CRC .DOC CRC = E5 81 --> FILE: KSTROK10.COM CRC = 53 A0 --> FILE: KSTROKES.ASM CRC = 6E 24 --> FILE: XREFPRN2.COM CRC = 90 00 --> FILE: XREF&UN2.DOC CRC = B4 7E --> FILE: -24DISK .DOC CRC = D1 53 --> FILE: UN2 .COM CRC = 2A 5A --> FILE: KSTRO484.COM CRC = F2 AC --> FILE: SPACEWAR.BAS CRC = 0F B0 --> FILE: UN2 .DOC CRC = 13 05 --> FILE: BACARRAT.BAS CRC = F4 ER SHIPS." 320 PRINT "CARGO SPACE IS IN UNITS OF SPACE ABOARD SHIP WHICH CAN BE" 330 PRINT "FILLED WITH WEAPONS." 340 PRINT "PROTECTION IS THE RELATIVE STRENGTH OF THE SHIP'S ARMOR" 350 PRINT "AND FORCE FIELDS." 360 GOSUB 10000 370 PRINT:PRINT "ONCE A SHIP HAS BEEN SELECTED, YOU WILL BE INSTRUCTED TO ARM" 380 PRINT "IT WITH WEAPONRY FROM THE FOLLOWING LIST:" 390 PRINT 400 PRINT " TYPE CARGO SPACE REL. STRENGTH" 405 PRINT " ------ ----------- ------100 PRINT CHR$(26);TAB(24);"DEEPSPACE" 110 PRINT TAB(20);"CREATIVE COMPUTING" 120 PRINT TAB(18);"MORRISTOWN, NEW JERSEY" 130 PRINT:PRINT 150 PRINT "THIS IS DEEPSPACE, A TACTICAL SIMULATION OF SHIP TO SHIP" 160 PRINT "COMBAT IN DEEP SPACE." 165 PRINT 170 PRINT "DO YOU WISH INSTRUCTIONS";:INPUT I$ 180 IF LEFT$(I$,1)="N" THEN 610 190 PRINT CHR$(26) 200 PRINT "YOU ARE ONE OF A GROUP OF CAPTAINS ASSIGNED TO PATROL A" 210 PRINT "SECTION OF YOUR STAR EMPIRE'S BORDER AGAINST HOSTILE" 220 PRINT "ALIENS. 49-------" 410 PRINT "1- PHASER BANKS 12 4" 420 PRINT "2- ANTI-MATTER MISSILE 4 20" 430 PRINT "3- HYPERSPACE LANCE 4 16" 440 PRINT "4- PHOTON TORPEDO 2 10" 450 PRINT "5- HYPERON NEUTRALIZATION FIELD 20 6" 470 PRINT:PRINT "WEAPONS #1 & #5 CAN BE FIRED 100 TIMES EACH; ALL OTHERS CAN" 480 PRINT "BE FIRED ONCE FOR EACH ON BOARD." 485 PRINT 490 PRINT "A TYPICAL LOAD FOR A --> FILE: DUCK .BAS CRC = F3 FC --> FILE: USOPEN .BAS CRC = E3 A7 --> FILE: CRC .COM CRC = B2 07 --> FILE: KSTR484G.COM CRC = 05 8D --> FILE: CASTLE .BAS CRC = 85 A3 --> FILE: CASTLE .DOC CRC = 65 EA --> FILE: NIM .BAS CRC = 0E CC --> FILE: SWORDS .BAS CRC = A8 B5 --> FILE: KSTROKE2.COM CRC = C9 98 --> FILE: DSPACE .BAS CRC = 8E 11 --> FILE: SKUNK .BAS CRC = AB 1F --> FILE: RUSROU .BAS CRC = A5 4C --> FILE: MATHDICE.BAS CRC = 08 AB --> FILE: HURKLALL YOUR ENCOUNTERS HERE WILL BE AGAINST HOSTILE" 230 PRINT "VESSELS. YOU WILL FIRST BE REQUIRED TO SELECT A VESSEL" 240 PRINT "FROM ONE OF THREE TYPES, EACH WITH ITS OWN CHARACTERISTICS:" 260 PRINT:PRINT " TYPE","SPEED","CARGO SPACE","PROTECTION" 265 PRINT " ------","-----","-----------","----------" 270 PRINT "1- SCOUT"," 10X"," 16"," 1" 280 PRINT "2- CRUISER"," 4X"," 24"," 2" 290 PRINT "3- BATTLESHIP"," 2X"," 30"," 5" 310 PRINT:PRINT "SPEED IS GIVEN RELATIVE TO THE OTH   CRUISER MIGHT CONSIST OF:" 500 PRINT " 1-#1 PHASER BANK = 12" 510 PRINT " 2-#3 HYPERSPACE LANCES = 8" 520 PRINT " 2-#4 PHOTON TORPEDOES = 4" 530 PRINT " ---------" 540 PRINT " 24 UNITS OF CARGO" 545 GOSUB 10000 550 PRINT " A WORD OF CAUTION: FIRING HIGH YIELD WEAPONS AT CLOSE (<100)" 560 PRINT "RANGE CAN BE DANGEROUS TO YOUR SHIP AND MINIMAL DAMAGE CAN" 570 PRINT "OCCUR AS FAR OUT AS 200 IN S520 K=E1+E2*RND(0) 1530 REM 1540 E=E3+E4*RND(0)+5/P0*RND(0) 1550 REM 1560 F3=E*(K/R)^1.85 1570 D2=(3*F3+3*F3*RND(0))/5.5 1580 D1=D1+D2 1590 IF (Z*D0)/(R*500)>2.2 THEN 1620 1600 D3=D0*2/(R^2*P0) 1610 D1=D1+D3 1620 PRINT "DAMAGE CONTROL REPORTS YOUR VESSEL DAMAGE AT:";D1 1630 IF D1>99 THEN 2740 1640 IF D>99 THEN 2760 1650 GOTO 1300 1660 PRINT "SELF DESTRUCT FAILSAFE ACTIVATED!!" 1670 PRINT "INPUT 1 TO RELEASE FAILSAFE";:INPUT U 1680 IF U=1 THEN 1700 1690 GOTO 1290 1700 PRINT "SELF DESTRU70 C=C0 980 PRINT "YOU HAVE";C;"UNITS OF CARGO SPACE TO FILL WITH WEAPONRY." 990 PRINT "CHOOSE A WEAPON AND THE AMOUNT YOU WISH";:INPUT W,N 1000 ON W GOTO 1910,2010,2100,2190,2280 1050 GOTO 980 1060 IF N*C1>C THEN 2530 1070 C=C-N*C1 1080 ON W GOTO 1990,2080,2170,2260 1120 GOTO 2360 1130 IF C>1 THEN 980 1140 REM 1150 S1=S0*RND(0) 1160 R=(3*RND(0)+5)*100 1180 PRINT:PRINT "RANGE TO TARGET:";R 1190 PRINT "RELATIVE VELOCITY:";S1 1200 PRINT "ACTION";:INPUT M 1210 ON M GOTO 1940,2030,2120,2210,2310430 2360 N5=N5+N 2370 GOTO 1130 2380 E1=150 2390 E2=500 2400 E3=3 2410 E4=4 2420 GOTO 850 2430 E1=200 2440 E2=350 2450 E3=4 2460 E4=3 2470 GOTO 850 2480 E1=150 2490 E2=400 2500 E3=5 2510 E4=2 2520 GOTO 850 2530 PRINT "NOT ENOUGH SPACE. RESELECT." 2540 GOTO 980 2550 PRINT "CHANGE BEYOND MAXIMUM POSSIBLE." 2560 PRINT "INCREASING TO MAXIMUM." 2570 S1=S0 2580 GOTO 1300 2590 PRINT "OUT OF SENSOR RANGE. AUTOMATIC DISENGAGE." 2600 GOTO 2760 2610 PRINT "PHASER BANKS DRAINED." 2620 PRINT "OME CIRCUMSTANCES." 590 PRINT:PRINT "RANGE IS GIVEN IN THOUSANDS OF KILOMETERS." 600 GOTO 640 610 PRINT "DO YOU WISH A MANEUVER CHART";:INPUT M$ 620 IF LEFT$(M$,1)="N" THEN 770 640 PRINT 650 PRINT " MANEUVER CHART":PRINT " --------------" 670 PRINT " 1 FIRE PHASERS" 680 PRINT " 2 FIRE ANTI-MATTER MISSILE" 690 PRINT " 3 FIRE HYPERSPACE LANCE" 700 PRINT " 4 FIRE PHOTON TORPEDO" 710 PRINT " 5 ACTIVE HYPERON NEUTRALIZATION FIELD" 720 PRINT " 6 SELF-DESTRUCT" 73CT ACCOMPLISHED." 1710 IF R>60 THEN 1740 1720 PRINT "ENEMY VESSEL ALSO DESTROYED." 1730 GOTO 2760 1740 D4=3200/R 1750 D=D+D4 1760 IF D>99 THEN 1720 1770 PRINT "ENEMY VESSEL SURVIVES WITH";D;"DAMAGE." 1780 GOTO 2760 1790 S0=10 1800 C0=16 1810 P0=1 1820 GOTO 970 1830 S0=4 1840 C0=24 1850 P0=2 1860 GOTO 970 1870 S0=2 1880 C0=30 1890 P0=5 1900 GOTO 970 1910 C1=12 1930 GOTO 1060 1940 P1=4 1950 IF N1=0 THEN 2160 1960 N1=N1-1 1970 Z=200 1980 GOTO 1430 1990 N1=N1+N 2000 GOTO 1130 2010 ,1660,1390,2760 1290 IF R<500 THEN 1500 1300 IF S1>0 THEN 1330 1310 R=R+(S1*8.3)^1.25 1320 GOTO 1340 1330 R=R-(S1*8.3)^1.25 1340 IF R>1500 THEN 2590 1350 IF R>0 THEN 1370 1360 R=-R 1370 PRINT 1380 GOTO 1180 1390 PRINT "CHANGE TO BE EFFECTED";:INPUT S2 1400 IF (S1+S2)>S0 THEN 2550 1410 S1=S1+S2 1420 GOTO 1180 1430 F0=P1*(Z/R)^1.5 1440 REM 1450 D0=(2*F0+3*F0*RND(0))/5 1460 D=D+D0 1470 PRINT "SCANNERS REPORT ENEMY DAMAGE NOW:";D 1480 IF D>99 THEN 2720 1490 GOTO 1510 1500 D0=0 1510 REM 1SELECT ANOTHER COURSE OF ACTION." 2630 GOTO 1200 2640 PRINT " ALL ANTI-MATTER MISSLES EXPENDED." 2650 GOTO 2620 2660 PRINT "ALL HYPERSPACE LANCES EXPENDED." 2670 GOTO 2620 2680 PRINT "ALL PHOTON TORPEDO TUBES EMPTY." 2690 GOTO 2620 2700 PRINT "HYPERON NEUTRALIZATION FIELD DRAINED." 2710 GOTO 2620 2720 PRINT "ENEMY VESSEL DESTROYED!" 2730 GOTO 1510 2740 PRINT "YOUR VESSEL HAS BEEN DESTROYED!" 2760 PRINT "ANOTHER BATTLE";:INPUT R$ 2770 IF LEFT$(R$,1)="Y" THEN 810 2780 PRINT:PRINT "TRY AGAIN LAT0 PRINT " 7 CHANGE VELOCITY" 740 PRINT " 8 DISENGAGE" 750 PRINT " 9 PROCEED" 770 PRINT:PRINT "YOU HAVE A CHOICE OF THREE SYSTEMS TO PATROL." 780 PRINT "1 - ORION" 790 PRINT "2 - DENEB" 800 PRINT "3 - ARCTURUS" 810 PRINT "SELECT A SYSTEM (1-3)";:INPUT S9 820 IF S9=1 THEN 2380 830 IF S9=2 THEN 2430 840 GOTO 2480 850 D0=0 860 D1=0 870 N1=0 880 N2=0 890 N3=0 900 N4=0 910 D=0 920 PRINT "WHICH SPACECRAFT WOULD YOU LIKE (1-3)";:INPUT S 930 ON S GOTO 1790,1830,1870 960 GOTO 920 9C1=4 2020 GOTO 1060 2030 P1=20 2040 IF N2=0 THEN 2640 2050 N2=N2-1 2060 Z=500 2070 GOTO 1430 2080 N2=N2+N 2090 GOTO 1130 2100 C1=4 2110 GOTO 1060 2120 P1=16 2130 IF N3=0 THEN 2660 2140 N3=N3-1 2150 Z=550 2160 GOTO 1430 2170 N3=N3+N 2180 GOTO 1130 2190 C1=2 2200 GOTO 1060 2210 P1=10 2220 IF N4=O THEN 2680 2230 N4=N4-1 2240 Z=400 2250 GOTO 1430 2260 N4=N4+N 2270 GOTO 1130 2280 C1=.2 2290 N=100 2300 GOTO 1060 2310 P1=6 2320 IF N5=0 THEN 2700 2330 N5=N5-1 2340 Z=250 2350 GOTO 1  ER!":PRINT 2790 GOTO 65000 10000 PRINT:LINE INPUT "ENTER 'RETURN' TO CONTINUE. ";XX$ 10010 PRINT CHR$(26) 10020 RETURN 65000 END NT 2790 GOTO 65000 10000 PRINT:LINE INPUT "ENTER 'RETURN' TO CONTINUE. ";XX$ 10010 PRINT CHR$(26) 10020 RETURN 650000 PRINT CHR$(27)+")";CHR$(141);CHR$(32); 410 NEXT 420 PRINT " "; 430 FOR I=1 TO 25 440 PRINT CHR$(139);CHR$(32); 450 NEXT 460 PRINT 470 FOR J=1 TO 2 480 FOR I=1 TO 50 490 PRINT CHR$(150); 500 NEXT 510 PRINT 520 NEXT 530 PRINT CHR$(27)+"("; 540 PRINT CHR$(27)+"=";(CHR$(52))(CHR$(54));CHR$(32);CHR$(150);CHR$(15);CHR$(150);CHR$(150); 550 PRINT CHR$(27)+"=";(CHR$(51))(CHR$(54));CHR$(32);CHR$(128);CHR$(128);CHR$(128);CHR$(128); 560 PRINT DC$;(CHR$(50))(CHR$(55));CHR$(138);CHR$(136);CHR$(138);CHof the shot; only four (4) consecutive shots " 200 PRINT "at the same angle are allowed. If you miss, the duck may" 210 PRINT "bomb you or your protective trees. If more than five (5)" 220 PRINT "trees are lost from one side of your blind, you are " 230 PRINT "liable to be dive-bombed from that side; you can survive" 240 PRINT "provided your ammunition is not hit. The duck can also " 250 PRINT "hit your ammunition directly with an overhead bomb." 255 PRINT 260 PRINT "POINTS: Shot ducks score from 10(32);CHR$(32) 870 IF X<18 THEN 900 880 IF X=18 AND Y=23 THEN X=0:Y=0:GOTO 590 890 IF X=19 AND Y=23 THEN 1390 900 LET A$=INKEY$:IF VAL(A$)=0 THEN 1080 910 IF VAL(A$)=H THEN C2=C2+1 920 IF VAL(A$)<>H AND VAL(A$)>0 THEN C2=0 930 IF C2>3 THEN 1080 940 H=VAL(A$) 950 V=V+1 960 PRINT DC$;(CHR$(32))(CHR$(32));100-V;"Bullets remaining" 970 A=6*VAL(A$)-30 980 S=X:T=Y 990 FOR X=0 TO -16 STEP -1 1000 PRINT DC$;(CHR$(49+X))(CHR$(57+INT(A*ABS(X)/10)));"*" 1010 PRINT DC$;(CHR$(49+X))(CHR$(57+INT(A*ABS(X)/10R$(136); 570 X=0 580 PRINT DC$;(CHR$(32))(CHR$(33));"FIRE AT ANGLE 1 TO 9" 590 FOR Y=0 TO 52 STEP 1 600 PRINT DC$;(CHR$(33+X))(CHR$(32+Y));CHR$(32);CHR$(32);CHR$(152);CHR$(136) 610 IF X<18 GOTO 640 620 IF X=18 AND Y=23 THEN X=0:Y=0:GOTO 590 630 IF X=19 AND Y=23 THEN 1390 640 LET A$=INKEY$:IF VAL(A$)=0 THEN 820 650 IF VAL(A$)=H THEN C2=C2+1 660 IF VAL(A$)<>H AND VAL(A$)>0 THEN C2=0 670 IF C2>3 THEN 820 680 H=VAL(A$) 690 V=V+1 700 PRINT DC$;(CHR$(32))(CHR$(32));100-V;"Bullets remaining" 710 A=6 to 50 points." 270 PRINT " Five bonus points for each tree as long as one" 280 PRINT " duck was hit. Twenty points for each tree that" 290 PRINT " survives the game; with 0 points if no ducks hit." 295 PRINT :PRINT " ****** GOOD LUCK ****** ":FOR I=1 TO 1000:NEXT 300 RANDOMIZE 310 DIM L(22) 320 FOR Y=1 TO 22 330 READ L(Y) 340 NEXT Y 350 PRINT CHR$(26):V=0 360 M=0:N=0:Q=11:Z=11 370 D=INT(RND(1)*4) 380 PRINT CHR$(27)+"=";(CHR$(55));(CHR$(32)); 390 FOR I=1 TO 25 4)));" " 1020 IF S<>X+16 THEN 1050 1030 IF T=INT(25+A*ABS(X)/10) OR T=INT(24+A*ABS(X)/10) THEN 1120 1040 IF V=100 THEN 1400 1050 NEXT X 1060 GOSUB 1210 1070 X=S:Y=T 1080 NEXT Y 1090 PRINT DC$;(CHR$(X+33))(CHR$(32));CHR$(32);CHR$(32) 1100 X=INT(RND(1)*(15+C)) 1110 GOTO 590 1120 PRINT CHR$(7) 1130 P=P+ABS(VAL(A$)-5)*10+10 1140 PRINT DC$;(CHR$(32))(CHR$(69));P;"Points" 1150 IF V=100 THEN 1400 1160 FOR G=0 TO 3 1170 PRINT DC$;(CHR$(S+33))(CHR$(32+13*G));" "; 1180 NEXT G 1190 X=0:Y=0 1200 1 DC$=CHR$(27)+"=":CL$=CHR$(26) 100 PRINT CHR$(26) 110 PRINT:PRINT:PRINT TAB(10);"DUCK!! By Peter H. Kelly M.D." 120 PRINT:PRINT:PRINT TAB(15);"Sept. 16, 1982" 130 PRINT:PRINT:PRINT:PRINT:INPUT "DO YOU WANT INSTRUCTIONS (Y/N)";I$ 140 IF I$="N" OR I$="n" THEN 300 150 PRINT CL$ 160 PRINT " The object of the game is to make the most points" 170 PRINT "shooting down the ducks without getting dive-bombed or" 180 PRINT "blown up. Points are awarded according to the difficulty" 190 PRINT "and angle *VAL(A$)-30 720 S=X:T=Y 730 FOR X=0 TO -16 STEP -1 740 PRINT DC$;(CHR$(49+X))(CHR$(57+INT(A*ABS(X)/10)));"*" 750 PRINT DC$;(CHR$(49+X))(CHR$(57+INT(A*ABS(X)/10)));" " 760 IF S<>X+16 THEN 790 770 IF T=INT(22+A*ABS(X)/10) OR T=INT(23+A*ABS(X)/10) THEN 1120 780 IF V=100 THEN 1400 790 NEXT X 800 GOSUB 1210 810 X=S:Y=T 820 NEXT Y 830 PRINT DC$;(CHR$(33+X))(CHR$(86));CHR$(32);CHR$(32); 840 X=INT(RND(1)*(15+N)) 850 FOR Y=52 TO 0 STEP -1 860 PRINT DC$;(CHR$(33+X))(CHR$(32+Y));CHR$(138);CHR$(152);CHR$  GOTO 590 1210 W=INT(RND(1)*3) 1220 IF W=>1 THEN RETURN 1230 FOR M=0 TO 19-S STEP 1 1240 FOR E=1 TO 20 1250 NEXT E 1260 PRINT DC$;(CHR$(34+M+S))(CHR$(34+T));CHR$(141) 1270 PRINT DC$;(CHR$(34+M+S))(CHR$(34+T));" " 1280 IF T=D+21 AND M=19-S THEN GOSUB 1390 1290 NEXT 1300 FOR B=1 TO 22 1310 IF L(B)=T+2 THEN L(B)=-1:GOTO 1340 1320 NEXT B 1330 GOTO 1380 1340 IF T+2<21 THEN Q=Q-1 1350 IF T+2>27 THEN Z=Z-1 1360 IF Q<7 THEN C=5:PRINT DC$;(CHR$(32))(CHR$(59))"DUCK !" 1370 IF Z<7 THEN N=5:PRINT DC$;(CHR$(52-G))(CHR$(56+G));CHR$(32);CHR$(32) 1620 PRINT DC$;(CHR$(51-G))(CHR$(57+G));CHR$(128);CHR$(128) 1630 PRINT DC$;(CHR$(53-G))(CHR$(56+G/2));CHR$(32);CHR$(32) 1640 PRINT DC$;(CHR$(52-G))(CHR$(57+G/2));CHR$(150) 1650 PRINT DC$;(CHR$(51))(CHR$(58-G));CHR$(32) 1660 PRINT DC$;(CHR$(52))(CHR$(55-G));CHR$(150);CHR$(32) 1670 PRINT DC$;(CHR$(51))(CHR$(51+G));CHR$(32) 1680 PRINT DC$;(CHR$(52))(CHR$(57+G));CHR$(32);CHR$(159) 1690 NEXT G 1700 RETURN 1710 PRINT :PRINT:PRINT:RESTORE 1720 INPUT "Would you li40 PRINT "SOUTH"; 650 GOTO 670 660 PRINT "NORTH"; 670 IF X=A THEN 720 680 IF X90 THEN A$=CHR$(ASC(A$)-32) 1750 IF A$<>"Y" AND A$<>"N" THEN 1720 1760 IF A$="Y" THEN 320 1765 IF A$="Y" THEN PRINT CL$ 1770 END  A$=CHR$(ASC(A$)-32) 1750 IF A$<>"Y" AND A$<>"N" THEN 1720 134,36,38,40,42,44,46,48 1510 FOR I=1 TO 3000:NEXT: GOTO 1710 1520 FOR G=0 TO 21 1530 PRINT DC$;(CHR$(53))(CHR$(54+G));" " 1540 PRINT DC$;(CHR$(53))(CHR$(58-G));" " 1550 PRINT DC$;(CHR$(54))(CHR$(54+G/2));" " 1560 PRINT DC$;(CHR$(54))(CHR$(58-G/2));" " 1570 PRINT DC$;(CHR$(51-G))(CHR$(55));CHR$(32);CHR$(32);CHR$(32) 1580 PRINT DC$;(CHR$(50-G))(CHR$(55));CHR$(138);CHR$(136);CHR$(138) 1590 PRINT DC$;(CHR$(52-G))(CHR$(56-G));CHR$(32) 1600 PRINT DC$;(CHR$(51-G))(CHR$(55-G));CHR$(128) 1610 PRINT DC$;(CINT 285 A=INT(G*RND(1)) 286 B=INT(G*RND(1)) 310 FOR K=1 TO N 320 PRINT "GUESS #";K; 330 INPUT X,Y 340 IF ABS(X-A)+ABS(Y-B)=0 THEN 500 350 REM PRINT INFO 360 GOSUB 610 370 PRINT 380 NEXT K 410 PRINT 420 PRINT "SORRY, THAT'S";N;"GUESSES." 430 PRINT "THE HURKLE IS AT ";A;",";B 440 PRINT 450 PRINT "LET'S PLAY AGAIN. HURKLE IS HIDING." 460 PRINT 470 GOTO 285 500 REM 510 PRINT 520 PRINT "YOU FOUND HIM IN";K;"GUESSES!" 540 GOTO 440 610 PRINT "GO "; 620 IF Y=B THEN 670 630 IF Y!ywÞʓ!y4*#~w" “_ ͐Ów{͐!"͖͐!"z!yw6͐!5! ! y@͐ ͐ ͐~w# ͐ 0 ͐_1!Q w@s͐1xx  h1O y ͐!yw*#!y4"~ _ ͐*å" xGy ͐ ͐~#where is a number (1 - 9). Immediately after installation, use "SAVE 16 .COM" to save the current definitions, if desired. After RESET, use " " to install the current definitions, OR "" to update definitions from menu, OR "KSTROKES" to start from scratch. $ Installing +++KSTROKES+++ version 2.1 $ CANNOT LOAD KSTROKES - RESET SYSTEM AND TRY AGAIN $ $   nything>" to install!"!~! _$ DEXmRS 1Bith "~" (To leave unchanged, enter ONLY "~") >$"~" leaves remaining New values unchanged, returns to main menu. Key Old value (currently in force) | | New value (installed on exit to CP/M) | | | change New values at cursor with single keystrokes UP ----- DOWN --- LEFT --- RIGHT -- 0 ------ 1 ------ 2 ------ 3 ------ 4 ------ 5 ------ 6 ------ 7 ------ 8 ------ 9 ------ - ------ , ------ . ------ $ *|!9"1] †_̓!y~AC͐_91[O! +"͖͐͐z-z~>!ywÞʓ!y4*#~w" “_ ͐Óow{͐!"͖͐!"z!yw6͐!5! ! y@͐ ͐ ͐~w# ͐ 0 ͐_1!Q w@s͐1xx  h1O y ͐!yw*#!y4"~ _ ͐*å" xGy ͐ ͐~#͐ <_w E NW^@_w`͐wf͐wl͐wq͐w$$$$"}*W ͐9 ͐*"i * " !" !"5 ʵê !w# x¾*b ͐ ͐ ͐~#6KSTROKES +++ Version 2.1 Semi-intelligent keys for KAYPRO II and 4 Options: 1 - Define Special Function(s) 2 - Set initial Macro definition 3 - Define keypad 4 - Set speed 5 - Exit to CPM Enter your selection: $-N:Enter special function9>~!;"6!Q" ~d*6w#"66!" !;"6!y" *6~G#~ʤ"6!"+>wx!~ʡ=w>>x!"!" ʿ *8+"8|!:w"6s!"8!.~0)))_|+"8m1O!: "6s.1!w ڷ. This is special function number 1. It is 63 characters long.This is special function number 2. It is 63 characters long.This is special function number 3. It is 63 characters long.This is special function number 4. It is 63 characters long.This $ $ < $ $ Hit any key to return to main menu.$ To execute a Special Function use "~", where is a number (1 - 8). To define the MACRO function use "~D~". To execute the MACRO function use "~X". To repeat the MACRO function use "~R~", where is a 1 - 5 digit number less than 65536 OR use "~R~" to repeat 65535 times. During MACRO repetition, hit any key to stop early. To change the speed at which characters are read out use "~S", ͐ <_w E NW^@_w`͐wf͐wl͐wq͐w$$$$"}*W ͐9 ͐*"i * " !" !"5 ʵê !w# x¾*b ͐ ͐ ͐~#6KSTROKES +++ Version 2.1 Semi-intelligent keys for KAYPRO II and 4 Options: 1 - Define Special Function(s) 2 - Set initial Macro definition 3 - Define keypad 4 - Set speed 5 - Exit to CPM Enter your selection: $-N:Enter special function number (1-8) or 9 to stop: $: Enter a number between 1 (fastest) and 9 (slowest) to set the speed at which Special Function and MACRO characters are passed to the foreground program. > $ WARNING! You have exceeded 63 keystrokes, corrupting one or more of the succeeding Special Functions. Re-define or forgo the use of the corrupted Special Function(s). $MACRO initialization$ Present contents of buffer are as follows: $ Enter up to 63$ Enter up to 190 keystrokes. Terminate w is special function number 5. It is 63 characters long.This is special function number 6. It is 63 characters long.This is special function number 7. It is 63 characters long.This is special function number 8. It is 63 characters long.TThis is the MACRO. It can be up to 190 characters long.    number (1-8) or 9 to stop: $: Enter a number between 1 (fastest) and 9 (slowest) to set the speed at which Special Function and MACRO characters are passed to the foreground program. > $ WARNING! You have exceeded 63 keystrokes, corrupting one or more of the succeeding Special Functions. Re-define or forgo the use of the corrupted Special Function(s). $MACRO initialization$ Present contents of buffer are as follows: $ Enter up to 63$ Enter up to 190 keystrokes. Terminate w is special function number 5. It is 63 characters long.This is special function number 6. It is 63 characters long.This is special function number 7. It is 63 characters long.This is special function number 8. It is 63 characters long.TThis is the MACRO. It can be up to 190 characters long. where is a number (1 - 9). Immediately after installation, use "SAVE 16 .COM" to save the current definitions, if desired. After RESET, use " " to install the current definitions, OR "" to update definitions from menu, OR "KSTROKES" to start from scratch. $ Installing +++KSTROKES+++ version 2.1 $ CANNOT LOAD KSTROKES - RESET SYSTEM AND TRY AGAIN $ $   nything>" to install!"!~! _$ DEXmRS 1B number (1-8) or 9 to stop: $: Enter a number between 1 (fastest) and 9 (slowest) to set the speed at which Special Function and MACRO characters are passed to the foreground program. > $ WARNING! You have exceeded 63 keystrokes, corrupting one or more of the succeeding Special Functions. Re-define or forgo the use of the corrupted Special Function(s). $MACRO initialization$ Present contents of buffer are as follows: $ Enter up to 63$ Enter up to 190 keystrokes. Terminate with "~" (To leave unchanged, enter ONLY "~") >$"~" leaves remaining New values unchanged, returns to main menu. Key Old value (currently in force) | | New value (installed on exit to CP/M) | | | change New values at cursor with single keystrokes UP ----- DOWN --- LEFT --- RIGHT -- 0 ------ 1 ------ 2 ------ 3 ------ 4 ------ 5 ------ 6 ------ 7 ------ 8 ------ 9 ------ - ------ , ------ . ------ $ *|ܸ!9"1] †_̓!y~AC͐_91[O! +"͖͐͐z-z~>!ywÞʓ!y4*#~w" “_ ͐Ów{͐!"͖͐!"z!yw6͐!5! ! y@͐ ͐ ͐~w# ͐ 0 ͐_1!Q w@s͐1xx  h1O y ͐!yw*#!y4"~ _ ͐*å" xGy ͐ ͐~#9>~!;"6!Q" ~d*6w#"66!" !;"6!y" *6~G#~ʤ"6!"+>wx!~ʡ=w>>x!"!" ʿ *8+"8|!:w"6s!"8!.~0)))_|+"8m1O!: "6s.1!w ܷ. This is special function number 1. It is 63 characters long.This is special function number 2. It is 63 characters long.This is special function number 3. It is 63 characters long.This is special function number 4. It is 63 characters long.Thisith "~" (To leave unchanged, enter ONLY "~") >$"~" leaves remaining New values unchanged, returns to main menu. Key Old value (currently in force) | | New value (installed on exit to CP/M) | | | change New values at cursor with single keystrokes UP ----- DOWN --- LEFT --- RIGHT -- 0 ------ 1 ------ 2 ------ 3 ------ 4 ------ 5 ------ 6 ------ 7 ------ 8 ------ 9 ------ - ------ , ------ . ------ $  $ $ < $ $ Hit any key to return to main menu.$ To execute a Special Function use "~", where is a number (1 - 8). To define the MACRO function use "~D~". To execute the MACRO function use "~X". To repeat the MACRO function use "~R~", where is a 1 - 5 digit number less than 65536 OR use "~R~" to repeat 65535 times. During MACRO repetition, hit any key to stop early. To change the speed at which characters are read out use "~S", ͐ <_w E NW^@_w`͐wf͐wl͐wq͐w$$$$"}*W ͐9 ͐*"i * " !" !"5 ʵê !w# x¾*b ͐ ͐ ͐~#6KSTROKES +++ Version 2.1 Semi-intelligent keys for KAYPRO II and 4 Options: 1 - Define Special Function(s) 2 - Set initial Macro definition 3 - Define keypad 4 - Set speed 5 - Exit to CPM Enter your selection: $-N:Enter special function   $ $ < $ $ Hit any key to return to main menu.$ To execute a Special Function use "~", where is a number (1 - 8). To define the MACRO function use "~D~". To execute the MACRO function use "~X". To repeat the MACRO function use "~R~", where is a 1 - 5 digit number less than 65536 OR use "~R~" to repeat 65535 times. During MACRO repetition, hit any key to stop early. To change the speed at which characters are read out use "~S", ͐ <_w E NW^@_w`͐wf͐wl͐wq͐w$$$$"}*W ͐9 ͐*"i * " !" !"5 ʵê !w# x¾*b ͐ ͐ ͐~#6KSTROKES +++ Version 2.1 Semi-intelligent keys for KAYPRO II and 4 Options: 1 - Define Special Function(s) 2 - Set initial Macro definition 3 - Define keypad 4 - Set speed 5 - Exit to CPM Enter your selection: $-N:Enter special function is special function number 5. It is 63 characters long.This is special function number 6. It is 63 characters long.This is special function number 7. It is 63 characters long.This is special function number 8. It is 63 characters long.TThis is the MACRO. It can be up to 190 characters long.  $ $ < $ $ Hit any key to return to main menu.$ To execute a Special Function use "~", where is a number (1 - 8). To define the MACRO function use "~D~". To execute the MACRO function use "~X". To repeat the MACRO function use "~R~", where is a 1 - 5 digit number less than 65536 OR use "~R~" to repeat 65535 times. During MACRO repetition, hit any key to stop early. To change the speed at which characters are read out use "~S", where is a number (1 - 9). Immediately after installation, use "SAVE 16 .COM" to save the current definitions, if desired. After RESET, use " " to install the current definitions, OR "" to update definitions from menu, OR "KSTROKES" to start from scratch. $ Installing +++KSTROKES+++ version 2.1 $ CANNOT LOAD KSTROKES - RESET SYSTEM AND TRY AGAIN $ $   nything>" to install!"!~! _$ DEXmRS 1B number (1-8) or 9 to stop: $: Enter a number between 1 (fastest) and 9 (slowest) to set the speed at which Special Function and MACRO characters are passed to the foreground program. > $ WARNING! You have exceeded 63 keystrokes, corrupting one or more of the succeeding Special Functions. Re-define or forgo the use of the corrupted Special Function(s). $MACRO initialization$ Present contents of buffer are as follows: $ Enter up to 63$ Enter up to 190 keystrokes. Terminate w*|!9"1] †_̓!y~AC͐_91[O! +"͖͐͐z-z~>!ywÞʓ!y4*#~w" “_ ͐Ów{͐!"͖͐!"z!yw6͐!5! ! y@͐ ͐ ͐~w# ͐ 0 ͐_1!Q w@s͐1xx  h1O y ͐!yw*#!y4"~ _ ͐*å" xGy ͐ ͐~#where is a number (1 - 9). Immediately after installation, use "SAVE 16 .COM" to save the current definitions, if desired. After RESET, use " " to install the current definitions, OR "" to update definitions from menu, OR "KSTROKES" to start from scratch. $ Installing +++KSTROKES+++ version 2.1 $ CANNOT LOAD KSTROKES - RESET SYSTEM AND TRY AGAIN $ $   nything>" to install!"!~! _$ DEXmRS 1B9>~!;"6!Q" ~d*6w#"66!" !;"6!y" *6~G#~ʤ"6!"+>wx!~ʡ=w>>x!"!" ʿ *8+"8|!:w"6s!"8!.~0)))_|+"8m1O!: "6s.1!w з. This is special function number 1. It is 63 characters long.This is special function number 2. It is 63 characters long.This is special function number 3. It is 63 characters long.This is special function number 4. It is 63 characters long.Thisith "~" (To leave unchanged, enter ONLY "~") >$"~" leaves remaining New values unchanged, returns to main menu. Key Old value (currently in force) | | New value (installed on exit to CP/M) | | | change New values at cursor with single keystrokes UP ----- DOWN --- LEFT --- RIGHT -- 0 ------ 1 ------ 2 ------ 3 ------ 4 ------ 5 ------ 6 ------ 7 ------ 8 ------ 9 ------ - ------ , ------ . ------ $   9>~!;"6!Q" ~d*6w#"66!" !;"6!y" *6~G#~ʤ"6!"+>wx!~ʡ=w>>x!"!" ʿ *8+"8|!:w"6s!"8!.~0)))_|+"8m1O!: "6s.1!w . This is special function number 1. It is 63 characters long.This is special function number 2. It is 63 characters long.This is special function number 3. It is 63 characters long.This is special function number 4. It is 63 characters long.Thislter default patterns ; MENU1: LXI D,MENU1T ;put menu addr in DE CALL DOMENU ;display menu and get response LXI D,MENU1J ;put jmp table addr in DE CALL DOOPT JMP MENU1 ; ;Code to define special function strings ; DEFSPF: MVI E,CLRSCR ;clear screen MVI C,2 CALL FUNCT LXI H,NCHAR ;check # of chars in previous SPFN MOV A,M CPI 65 ;terminating null byte is counted, too JM NCHOK LXI D,MSG1A ;print warning CALL PRINT NCHOK: LXI D,MENU2T ;put menu addr in DE CALL DOMENU CPI '484G FBASE EQU 0E606H ;ORIGINAL FBASE FOR NEW 2,4 USING CP/M 2.2G ENDIF IF KAYTEN FBASE EQU 0DC06H ;ORIGINAL FBASE FOR TEN ENDIF DESTIN EQU FBASE-0C06H ;PROGRAM DESTINATION BIOS EQU FBASE+0DFAH ;BOTTOM OF BIOS CONST EQU BIOS+07H ;BIOS JMP TABLE ENTRY FOR CONSOLE STATUS CONIN EQU BIOS+0AH ;BIOS JMP TABLE ENTRY FOR CONSOLE IN KEYDEF EQU BIOS+35H ;KEYPAD DEFINITIONS ; ;Define several constants ; CLRSCR EQU 01AH ;clear KAYPRO screen CR EQU 00DH FUNCT EQU 5 ;BDOS entry address BS EQU 00OOP: MVI C,6 ;get a character MVI E,0FFH CALL FUNCT ORA A ;if no character ready, try again JZ FLOOP NXTCH: LXI H,NCHAR ;increment NCHAR INR M LHLD FILPTR ;get pointer to last character INX H ;increment it CPI '~' ;is this the end? JZ FILEND MOV M,A ;no, put character into string SHLD FILPTR ;update pointer CALL DISPLA ;display character CPI CR ;if it was a , JNZ FLOOP LXI D,CRLF ;send a CALL PRINT JMP FLOOP ;and get another character FILPTR: DS  is special function number 5. It is 63 characters long.This is special function number 6. It is 63 characters long.This is special function number 7. It is 63 characters long.This is special function number 8. It is 63 characters long.TThis is the MACRO. It can be up to 190 characters long. 9' ;finished defining? RZ ; yes, return to main menu LXI B,00H ;BC will contain pattern buffer offset SUI 031H ;make function a binary number, ; subtracting 1 in the process RAL!RAL!RAL!RAL!RAL!RAL ;multiply by 64 JNC NCARY2 ;if there was a carry, INR B ; put it in B NCARY2: MOV C,A ;put low-order part of offset in C LXI H,SPFNS-OFFSET ;put pattern buffer address in HL DAD B ;add in offset, DCX H ; decrement it, SHLD FILPTR ; and store it CALL SHOW LXI D,MSG3A 8H ;cursor right LF EQU 00AH ;linefeed UP EQU 00BH ;cursor left CL EQU 00CH ;cursor up PBUF EQU 009H ;BDOS print function SIZE EQU 0400H ;size of the resident code, etc. ; ; ORG 100H ; ; START: LHLD 6 ;check FBASE MOV A,H LXI B,FBASE CMP B JNZ NOLOAD ;if it's nonstandard, quit ; ;Relocate stack ; LXI H,0 DAD SP SHLD OLDSP LXI SP,NEWSTK ; ;Check argument, if any ; LXI B,5DH LDAX B CPI 020H ;if it's not blank, JNZ NSTALL ; go directly to NSTALL ; ;Routines to a2 FILEND: XRA A ;null out A MOV M,A ;put null at end of string RET ;and return ; ;Code to set initial macro definition ; SIMDEF: LXI D,MSG1B ;print instructions CALL PRINT LXI H,MACKRO-OFFSET-1 ;put addr of macro string in FILPTR SHLD FILPTR CALL SHOW LXI D,MSG3B ;print instructions CALL PRINT LXI H,MACKRO-OFFSET-1 ;put addr of macro string in FILPTR SHLD FILPTR CALL FILBUF ;call routine to fill string buffer LXI H,NCHAR ;zero NCHAR XRA A MOV M,A JMP MENU1 ; ;Cod; ;TITLE ++ KSTROKES Version 2.1 for KAYPRO CP/M version 2.2 ; FALSE EQU 0 TRUE EQU NOT FALSE ; KAYPRO2 EQU FALSE ; TRUE, IF YOU HAVE AN OLD 2 OR 4 KAY484 EQU FALSE ; TRUE, IF YOU HAVE A NEW 2 OR 4 KAY484G EQU TRUE ; TRUE, IF YOU HAVE A NEW 2 OR 4 WITH ; CP/M 2.2G KAYTEN EQU FALSE ; TRUE, IF YOU HAVE A 10 ; ;Define several addresses ; IF KAYPRO2 FBASE EQU 0EC06H ;ORIGINAL FBASE FOR OLD 2 OR 4 ENDIF IF KAY484 FBASE EQU 0E806H ;ORIGINAL FBASE FOR NEW 2 OR 4 ENDIF IF KAY;print 2nd part of menu CALL PRINT LXI D,MSG3C CALL PRINT CALL FILBUF JMP DEFSPF ; ;Code to fill a buffer the beginning of which is pointed to by FILPTR ; NCHAR: DB 0 FILBUF: MVI C,6 ;get a character MVI E,0FFH CALL FUNCT ORA A ;if no character ready, try again JZ FILBUF CPI '~' ;if 1st character is '~` RZ ; leave contents unchanged PUSH A ;save character MVI A,0 ;set NCHAR to zero LXI H,NCHAR MOV M,A POP A ;restore 1st character JMP NXTCH ;and continue FL  e for defining keypad ; DEFKEY: LXI D,MSG4 ;print instructions CALL PRINT LXI H,KEYDEF CALL SHOKEY LXI H,NUKEYS CALL SHOKEY LXI H,NUKEYS ;put pointer in H MVI C,18 ;put counter in C DKLOOP: MOV A,C ;are we done? ORA A JZ DKDONE ;yes, end PUSH B ;save registers PUSH H LXI D,MSG4B ;position cursor CALL PRINT LXI D,MSG4C CALL PRINT LXI D,MSG4D CALL PRINT DKL2: MVI C,6 ;get a character MVI E,0FFH CALL FUNCT ORA A ;if no character ready, try again JZ DKL2 C DISPLA ;use display routine to print character CPI CR ;if it was a JNZ NOCR LXI D,CRLF ;send a CALL PRINT NOCR: LHLD FILPTR ;get pointer JMP SHLOOP ;do next character SHEND: POP H ;restore pointer SHLD FILPTR RET ; ;Routine to show key definitions after option 3 ; SHOKEY: LXI B,NUKEYS ;get high order part of address MOV A,B XRA H ;are we displaying current or new settings? MOV B,A ;zero = NUKEYS MVI C,18 ;use C for character counter SKLOOP: MOV A,C ;dons it < "1"? JM BADRES ; yes, it's meaningless MAXRES EQU $+1 CPI 00H ;is it > MAX from jump table? JP BADRES ; yes, it's meaningless RET BADRES: MVI C,09H ;erase bad response LXI D,ERASE CALL FUNCT JMP GETRES ;and try again DOOPT: SUI 031H!RAL ;make the response into a table offset LXI B,00H ;use BC for 16-bit value MOV C,A XCHG ;get addr of table addr from DE DAD B ;add it to table base in HL CALL MEMHL ;get addr of routine PCHL ;and go to it ; ;Print routine ;FUNCT POP PSW ;output character ADI 040H ;make it printable MOV E,A MVI C,2 CALL FUNCT JMP DIDONE DELET: LXI D,DELSTR CALL PRINT JMP DIDONE PCR: LXI D,CRSTR CALL PRINT JMP DIDONE PLF: LXI D,LFSTR CALL PRINT JMP DIDONE PESC: LXI D,ESCSTR CALL PRINT JMP DIDONE DELSTR: DB '$' CRSTR: DB '$' LFSTR: DB '$' ESCSTR: DB '$' DIDONE: POP PSW ;restore character RET ;and return ; ;Routine to load HL with (M) ; MEMHL: SHLD LARG LARG EQU $+1 LHLD 0000H PI '~' ;was it an enya? JZ MENU1 ; yes, return to main menu POP H ;otherwise, store it MOV M,A INX H ;update pointer PUSH H ;save pointer PUSH PSW ;save character LXI D,MSG4D2 ;erase old new character CALL PRINT POP PSW ;restore character CALL DISPLA ;display new character POP H ;restore registers POP B DCR C ;decrement key counter JMP DKLOOP ;loop back for next key DKDONE: LXI D,MSG4E ;print message CALL PRINT MVI C,01H ;wait for response CALL FUNCT JMP MEe? ORA A JZ SKDONE ;yes, end DCR C ;decrement character counter PUSH H ;save registers PUSH B LXI D,MSG4B ;skip to right screen loc CALL PRINT POP B ;if displaying new settings, skip more ORA A ORA B JNZ CURSET PUSH B LXI D,MSG4C CALL PRINT POP B CURSET: POP H MOV A,M ;get a character INX H ;increment pointer PUSH H PUSH B CALL DISPLA POP B POP H JMP SKLOOP SKDONE: LXI D,MSG4A ;restore cursor to top CALL PRINT RET ; ;Routine to display characters PRINT: MVI C,PBUF CALL FUNCT RET ; ;Routine to show contents of buffer ; SHOW: LXI D,MSG2 CALL PRINT LXI H,NCHAR ;zero character counter XRA A MOV M,A LHLD FILPTR ;get pointer to first character-1 PUSH H ;save it on stack SHLOOP: INX H ;update pointer PUSH H ;save pointer LXI H,NCHAR ;count characters in string INR M POP H ;reclaim pointer SHLD FILPTR ;save updated pointer MOV A,M ;put next character in A ORA A ;is it a null? JZ SHEND ; yes, end show CALL RET ; ;Print messages after menu ; SAVMSG: LXI D,MSG5 ;print SAVE instructions CALL PRINT ; ;Set up intercept of BIOS CONIN and CONST functions ; NSTALL: LXI D,MSG6 ;print notice, version CALL PRINT LHLD CONST ;get original CONST destination SHLD OSTDST ; store it in dummy LXI argument LHLD CONIN ;get original CONIN destination SHLD OCIDST+1-OFFSET ; store it in dummy JMP argument LXI H,NDST1 ;set up level 1 call intercept SHLD CONIN ; by altering BIOS jump table LXINU1 ;return to main menu ; ;Routine to set speed ; PAUSE: LXI D,MENU4T ;display "menu", get response CALL DOMENU SUI 031H ;make it a number-1 RAL!RAL ;multiply it by 4 LXI H,SETPAU-OFFSET ;store answer MOV M,A JMP DKDONE ;show them what they did ; ;Routine to process a menu ; DOMENU: LDAX D ;get MAX from top of table LXI B,MAXRES ;put MAX in argument of CPI STAX B INX D ;skip over MAX CALL PRINT ;display menu GETRES: MVI C,01H ;get a response CALL FUNCT CPI 031H ;i being entered into buffer ; DISPLA: PUSH PSW ;save character CPI 020H ;is it printable? JM CONCHR ; no, it's a control character CPI 07FH ;is it a 'del'? JZ DELET ; yes, go print it MOV E,A ;just print it MVI C,2 CALL FUNCT JMP DIDONE CONCHR: CPI CR ;is it a ? JZ PCR ; yes, print CPI LF ;is it a ? JZ PLF ; yes, print CPI 01BH ;is it an escape? JZ PESC ; yes, print PUSH PSW ;save character MVI E,'^' ;output carat MVI C,2 CALL    H,DESTIN ;"enlarge" FDOS and alter BDOS addr SHLD 06H ; by altering CALL 0005 destination ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; >>>>> NO MORE CALLS TO BDOS AFTER THIS POINT <<<<< ;; ;; >>>>> UNTIL INSTALLATION IS COMPLETED <<<<< ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;Redo keypad definitions ; SETKEY: LXI B,KEYDEF LXI D,NUKEYS LOOP01: LDAX D ORA A JZ MOVEIT STAX B INX B INX D JMP LOOP01 ; ;Routining New values unchanged, ' DB 'returns to main menu.',CR,LF,LF DB 'Key Old value (currently in force)',CR,LF DB '| | New value ' DB '(installed on exit to CP/M)',CR,LF DB '| | | change New values at cursor ' DB 'with single keystrokes',CR,LF DB 'UP ----- ',CR,LF DB 'DOWN --- ',CR,LF DB 'LEFT --- ',CR,LF DB 'RIGHT -- ',CR,LF DB '0 ------ ',CR,LF DB '1 ------ ',CR,LF DB '2 ------ ',CR,LF DB '3 ------ ',CR,LF DB '4 ------ ',CR,LF DB '5 ------ $' MENU1J: DW DEFSPF DW SIMDEF DW DEFKEY DW PAUSE DW SAVMSG MENU2T: DB 9+31H DB 'Enter special function number (1-8) or 9 to stop: $' MENU4T: DB 9+31H DB CLRSCR,LF,LF,'Enter a number between 1 (fastest) and 9 ' DB '(slowest) to set the speed at which',CR,LF DB ' Special Function and MACRO characters are passed to the ' DB 'foreground program.',CR,LF,LF,'> $' MSG1A: DB CR,LF,LF DB 'WARNING! You have exceeded 63 keystrokes, corrupting ' DB 'one or more of ',CR,LF,' the succracters ' DB 'are read out use "~S",' DB CR,LF,' where is a number (1 - 9).',CR,LF,LF DB 'Immediately after installation, use "SAVE 16 .COM"' DB CR,LF,' to save the current definitions' DB ', if desired.',CR,LF DB 'After RESET, use " " to install the' DB ' current definitions,',CR,LF DB ' OR "" to update definitions from menu,' DB CR,LF DB ' OR "KSTROKES" to start from scratch.' DB CR,LF,LF,'$' MSG6: DB LF,'Installing +++KSTROKES+++ verne to move business end of prog to high memory ; (see "Soul of CPM", pp. 259-261) ; MOVEIT: LXI B,ENDP-BEGINP+1 ;# of bytes to move LXI D,BEGINP ;where they come from LXI H,DESTIN ;where they're going MOVEM: LDAX D ;get byte INX D ;increment pointer MOV M,A ;store byte INX H ;increment pointer DCX B ;decrement count MOV A,B ;both B and C must be 0 ORA C ; so OR them to see JNZ MOVEM ;otherwise do another byte JMP CPM ; ;Return to CCP ; CPM: LHLD OLDSP SPHL  ',CR,LF DB '6 ------ ',CR,LF DB '7 ------ ',CR,LF DB '8 ------ ',CR,LF DB '9 ------ ',CR,LF DB '- ------ ',CR,LF DB ', ------ ',CR,LF DB ' ',CR,LF DB '. ------ ' MSG4A: DB CR,UP,UP,UP,UP,UP,UP,UP,UP,UP,UP DB UP,UP,UP,UP,UP,UP,UP,UP,'$' MSG4B: DB CR,LF,CL,CL,CL,CL,CL,CL,CL,CL,CL,'$' MSG4C: DB CL,CL,CL,CL,CL,CL,CL,'$' MSG4D: DB CL,CL,CL,CL,CL,CL,'< $' MSG4D2: DB BS,BS,BS,BS,BS,BS,BS,' ',BS,BS,BS,BS,BS,BS,BS,'$' MSG4E: DB CR,LF,LF,'Hit any key to return to main menu.$' MSeeding Special ' DB 'Functions.',CR,LF DB 'Re-define or forgo the use of the corrupted Special' DB ' Function(s).' DB CR,LF,LF,'$' MSG1B: DB CLRSCR,'MACRO initialization$' MSG2: DB CR,LF,LF DB 'Present contents of buffer are as follows:',CR,LF,LF,'$' MSG3A: DB CR,LF,LF,LF DB 'Enter up to 63$' MSG3B: DB CR,LF,LF,LF DB 'Enter up to 190' MSG3C: DB ' keystrokes. Terminate with "~"' DB CR,LF,' (To leave unchanged, enter ONLY "~")' DB CR,LF,LF,'>$' MSG4: DB CLRSCR DB '"~" leaves remaision 2.1' CRLF: DB CR,LF,'$' MSG7: DB LF,'CANNOT LOAD KSTROKES - RESET SYSTEM AND TRY AGAIN' DB CR,LF,'$' ERASE: DB 08H, 20H, 08H, 24H NUKEYS: DB 00BH, 00AH, 008H, 00CH DB 01AH, 018H, 006H, 004H, 005H, 001H, 013H DB 011H, 00FH, 00BH, 019H, 014H, 007H, 017H NKEYS: DB 00H DS 14H ; ;Code to be relocated to high memory ; BEGINP EQU $ OFFSET EQU DESTIN-BEGINP ; ;First, transfer calls to BDOS ; JMP FBASE ; ;Code to be executed on intercept of CONIN call ; NDST1 EQU $+OFFSET LXI H,DEST RET ; ;Can't load - print message and quit ; NOLOAD: LXI D,MSG7 CALL PRINT RET ; ;spaces for things ; OLDSP: DS 2 DS 30 NEWSTK: MENU1T: DB 5+31H DB CLRSCR,'KSTROKES +++ Version 2.1',CR,LF,LF DB 'Semi-intelligent keys for KAYPRO II and 4',CR,LF,LF,LF DB 'Options:',CR,LF,LF DB ' 1 - Define Special Function(s)',CR,LF DB ' 2 - Set initial Macro definition',CR,LF DB ' 3 - Define keypad',CR,LF DB ' 4 - Set speed',CR,LF DB ' 5 - Exit to CPM',CR,LF,LF,LF DB 'Enter your selection:G5: DB CR,LF,LF DB 'To execute a Special Function use "~", where ' DB ' is a number (1 - 8).',CR,LF DB 'To define the MACRO function use "~D~".',CR,LF DB 'To execute the MACRO function use "~X".',CR,LF DB 'To repeat the MACRO function use "~R~",',CR,LF DB ' where is a ' DB '1 - 5 digit number less than 65536',CR,LF DB ' OR use "~R~" to repeat 65535 times.',CR,LF DB ' During MACRO repetition, hit any key to stop early.' DB CR,LF DB 'To change the speed at which cha  IN ;"enlarge" FDOS and alter BDOS addr SHLD 06H ; by altering CALL 0005 destination LXI H,NRET1 ;push new return addr onto stack PUSH H ; to intercept return from CONIN OCIDST EQU $+OFFSET JMP 0000H ;complete original call to BIOS routine ; (0000 is a dummy argument) ; ;Code to recognize shift character (~) ; NRET1 EQU $+OFFSET CPI '~' ;is it an "~"? JZ ENYA ; if so, do function RET ;otherwise, just return ; ;Code to interpret shift functions ; ENYA EQU $+OFFSET LXICNT EQU $+OFFSET DB 1 NDST3S EQU $+OFFSET LXI H,PAUCNT ;how many times have we said no MOV A,M ORA A ;is it zero? JZ SAYYES ;yes, done waiting DCR A ;update pause count MOV M,A MVI A,0 ;indicate no character ready RET SAYYES EQU $+OFFSET MVI A,0FFH ;indicate character ready RET FINMAC EQU $+OFFSET MOV A,B ;reclaim character PUSH PSW ; and save it on stack OSTDST EQU $+1 ;"Old STatus DeSTination" LXI H,00 ;restore original CONST destination SHLD CONST LXI H,NDST1INX H ;increment length SHLD MACPTR ; and save it MVI M,00H ;terminate? macro RET ;and return character to prog ; ;macro definition end routine ; ENDMAC EQU $+OFFSET LXI H,NDST1 ;restore level 1 call intercept SHLD CONIN JMP NDST1 ;and go there, discarding terminal character ; ;macro execution routine ; EXMAC EQU $+OFFSET LXI H,MACKRO ;get macro pointer, SHLD MACPTR ; and put it in volitile storage SEND EQU $+OFFSET LXI H,NDST3I ;set up level 3 call intercept of CONIN  new digit JMP NEWDIG RMLOOP EQU $+OFFSET MOV A,H ;test for zero count ADD L JNZ NZCNT DCX H ;if it was zero, make it FFFF NZCNT EQU $+OFFSET SHLD RPTCNT ;store count JMP EXMAC ;start doing macros ; ;Code for executing special functions ; EXSPFN EQU $+OFFSET LXI B,00H ;BC will contain pattern buffer offset SUI 031H ;make function a binary number, ; subtracting 1 in the process RAL!RAL!RAL!RAL!RAL!RAL ;multiply by 64 JNC NOCARY ;if there was a carry, INR B ; put i H,NRET2 ;set up 2nd level return intercept PUSH H JMP OCIDST ;and call BIOS again NRET2 EQU $+OFFSET CPI 05FH ;is it l.c.? JM CAP ; no, jump SUI 020H ; yes, capitalize CAP EQU $+OFFSET CPI 'D' ;is it a "D"? JZ DEFMAC ; yes, define macro CPI 'X' ;is it an "X"? JZ EXMAC ; yes, execute macro CPI 'R' ;is it an 'R'? JZ RPTMAC ; yes, repeat macro CPI 'S' ;is it an "S"? JZ SETSPD ; yes, set speed CPI '1' ;is it < "1"? JM OTHVAL ; yes, it's meaningless CPI '9 ;restore level 1 call intercept SHLD CONIN CALL CONST-1 ;check console status ORA A ;if key was struck, stop JZ NOSTOP CALL OCIDST ;clear stop character JMP RPTEND ;and end repititions NOSTOP EQU $+OFFSET LHLD RPTCNT ;otherwise, update count DCX H SHLD RPTCNT MOV A,H ;test for zero count ADD L JZ RPTEND POP PSW ;get last character LXI H,LSTCHR ;put it at top of macro buffer MOV M,A SHLD MACPTR ;put pointer in volitile storage JMP SEND ;and do macro again RPTENDSHLD CONIN NDST3I EQU $+OFFSET LHLD MACPTR ;get pointer to next character MOV A,M ;get next macro character MOV B,A ;save it for now INX H ;increment pointer MOV A,M ;is next character a null? ORA A JZ FINMAC ; yes, finish up SHLD MACPTR ;store updated pointer LXI H,NDST3S ;set up level 3 call intercept of CONST SHLD CONST DCX H ;point HL at pause counter SETPAU EQU $+OFFSET+1 MVI A,1 ;say no this many times MOV M,A MOV A,B ;reclaim character RET ;and return PAUt in B NOCARY EQU $+OFFSET MOV C,A ;put low-order part of offset in C LXI H,SPFNS ;put pattern buffer address in HL DAD B ;add in offset, SHLD MACPTR ; and store it JMP SEND ;complete function with same code as EXMAC ; ;Routine to set speed ; SETSPD EQU $+OFFSET CALL GETCH ;get 1 character SUI 031H ;make it a number-1 RAL!RAL ;multiply it by 4 LXI H,SETPAU ;store answer MOV M,A JMP NDST1 ;go back to intercept ; ;Little routine to get a character ; GETCH EQU $+OFFSET' ;is it => "9"? JM EXSPFN ; no, execute special function OTHVAL EQU $+OFFSET MVI A,07EH ;any other value, return "~" RET ; ;macro definition routine ; DEFMAC EQU $+OFFSET LXI H,MACKRO ;initilize macro pointer SHLD MACPTR LXI H,NDST3M ;set up 3rd level call intercept SHLD CONIN ; by altering bios jump table NDST3M EQU $+OFFSET CALL OCIDST CPI 07EH ;is it an enya? JZ ENDMAC ; yes, we're done defining LHLD MACPTR ;M = macro pointer MOV M,A ;store character in buffer  EQU $+OFFSET LXI H,1 ;put a 1 in repeat count SHLD RPTCNT POP PSW ;reclaim last character RET ;and return to foreground ; ;code for repeating macro ; RPTMAC EQU $+OFFSET LXI H,0 ;zero counter NEWDIG EQU $+OFFSET PUSH H ;save counter on stack CALL GETCH ;get a character POP H CPI '~' ;stop if enya JZ RMLOOP SUI 030H ;make it a number PUSH H ;multiply counter by 10 POP D DAD H DAD H DAD D DAD H MVI D,0 ;zero in D MOV E,A ;new digit in E DAD D ;add in   CALL OCIDST ;get next digit ORA A JZ GETCH RET ; ; MACPTR EQU $+OFFSET DS 2 RPTCNT EQU $+OFFSET DW 1 SPFNS EQU $+OFFSET DB 'This is special function number ' DB '1. It is 63 characters long.',0H DB 'This is special function number ' DB '2. It is 63 characters long.',0H DB 'This is special function number ' DB '3. It is 63 characters long.',0H DB 'This is special function number ' DB '4. It is 63 characters long.',0H DB 'This is special function number ' DB ============================================== THE MENU DEFINING THE SPECIAL FUNCTIONS -- Choosing the first option on the menu allows you to set up definitions of the SPFNs. After selecting the function number you wish to define, you are shown the current definition of that function. You may then enter up to 63 keystrokes to re-define that SPFN. These may be letters, numbers, control characters, tabs, carriage returns, line feeds, 'escape's, 'delete's, me and executed either singularly or repeatedly. You can also specify single keystrokes for the cursor and keypad keys. Finally, you can specify the speed at which SPFN and MACRO keystrokes are output so as not to cause your computer to choke. The speed setting can be changed at any time, as the situation demands. All its functions can be saved for subsequent installation as defaults or to be updated from the menu. Version 2.1 will only run on a KAYPRO II or 4 under CP/M 2.2. RUNNING T does not return to the beginning of the line.) The program doesn't check to see whether you are running over your allotted 63 keystrokes when you define an SPFN. This feature has both yin and yang. On the one hand, you can garbage up the SPFNs by not counting. On the other hand, since the SPFN strings are contiguous in memory and terminated by a null byte, typing more than 63 characters merely runs you over into the next SPFN. Thus, you can define SPFNs longer than 63 keystrokes, but you '5. It is 63 characters long.',0H DB 'This is special function number ' DB '6. It is 63 characters long.',0H DB 'This is special function number ' DB '7. It is 63 characters long.',0H DB 'This is special function number ' DB '8. It is 63 characters long.',0H LSTCHR EQU $+OFFSET DS 1 MACKRO EQU $+OFFSET DB 'This is the MACRO. It can be up to 190 characters long.' DB CR,0H DS 190-57 ; ;End of code to be relocated ; ENDP2 EQU $+OFFSET ENDP EQU $ END 100H umber ' DB back spaces, or keypad strokes. After the last keystroke, indicate that you are finished by typing a tilde (~). If you don't wish to change the definition of the SPFN, type only the tilde. Thus, you can easily review an SPFN by selecting it for re-definition and then entering only the tilde. (NOTE that since the keypad definitions are not actually changed until you select option 5 and return to CP/M, any keypad strokes used in defining an SPFN will be interpretted according to the definitiHE PROGRAM -- Typing "KSTROKES" in response to the system prompt gives you a menu which will allow you to define the SPFNs, set up an initial MACRO string, set the transmission speed, and/or define the keypad. If you don't want to change any of the SPFNs, etc., type a space plus any extra character (except a space) after the program name to inhibit the menu. EXAMPLES: A>KSTROKES <<< gives you the menu A>KSTROKES S <<< installs the defaults =======================lose the succeeding SPFN(s). For example, if you define SPFN 5 as having 80 keystrokes, you will get all 80 when you invoke SPFN 5 later on. You will also get the last 26 strokes of SPFN 5 when you invoke SPFN 6. Indeed, SPFN 9 is contiguous with the MACRO (!?!). Thus, if you wanted, you could have only one SPFN of 702 keystrokes but no other SPFNs and no (initial) MACRO. Or, you could make SPFN 1 up to 127 keystrokes and simply forgo the use of SPFN 2. SPFNs 3 - 8 would work just fine. Just  KSTROKES +++ Version 2.1 (for KAYPRO II or 4 with CP/M 2.2) April, 1984 William B. Forbes 45 Dellwood Road Worcester, MA 01545 This program is a somewhat restricted version of the various key definition programs reviewed by Susan Hyman in the March/April, '84 issue of PROFILES magazine. It lets you define 8 "Special Functions" (SPFNs) of up to 63 keystrokes each. It also lets you define up to 190 strokes as a "MACRO" function. The MACRO function can be defined at any tions in force when you entered the program. When you invoke the SPFN later on, you will get those characters even if you have subsequently changed the keypad definitions. Also, NOTE that most application programs add the line feed after a carriage return. When you type a carriage return, it shows up as and the cursor goes to the beginning of the next line on the screen. Likewise, back space = , line feed = and escape = . In the case of these last three, however, the cursor   be careful to review each SPFN while in the menu, though, to be sure you know what you're doing. Anyway, you shouldn't have any difficulty as long as you stick to 63 strokes for each SPFN. SETTING THE INITIAL MACRO DEFINITION -- By selecting the second option from the menu, you can provide a default definition of the MACRO function. This works the same as defining the SPFNs, but you can have up to 190 strokes. Also, remember that the MACRO can be defined at any time as long as there hasR AND KEYPAD DEFINITIONS -- Selecting option 3 from the main menu lets you define new values to the cursor and keypad keys. The screen gives you three pieces of information on each key: 1) the name of the key; 2) the Current definition (that is, what would be sent to the computer if a given key were struck at any time before returning to CP/M); and 3) the New definition (that is, the definition as it will be after KSTROKES installs itself). The New keypad definitions that come with the prograan SPFN or MACRO function is like typing lickity-split or maybe even faster than that. As long as you are sending fewer keystrokes than the program's stack can hold or if you are using a program which doesn't have such a type-ahead feature, it doesn't matter how fast characters are sent. But if you invoke several long SPFNs or repeat even a fairly short MACRO too many times, you can outrun the Foreground program's capacity to process the "keystrokes". From the menu (option 4), you can set th ^Z | 17 ^W : 07 ^G : |...............|.......:.......: The screen shows you a cursor pointed the line of information for one key. The keystroke you give will replace the New value in that column and the cursor will advance to the next line. You can insert the Current value by just hitting the key of that name. The Current values reflect whatever has been set by CONFIG or some similar program. If you don't want to fool around with the keypad, I suggest you usn't been a cold start. The capability of setting it up in advance is provided because of the fact that when you define the MACRO in a program or in CP/M, the strokes are passed on to whatever program is running at the time (the Foreground program). When you initialize the MACRO from the menu, you remain in a state of grace. Furthermore, if you have a particularly large, complex function you wish to perform using the MACRO, you won't have to type it in every time; you can save it as a default im are ones which I use for WORDSTAR as follows: : erase : \/ ................................. | 1 | 2 | 3 : - : | ^Q | ^O | ^K : line : | 11 | 0F | 0B : 19 ^Y : |.......|.......|.......:.......: | 4 | 5 | 6 : , : backward -> e speed of transmission in a range of 1 (fastest) to 9 (slowest). The actual speeds which correspond to these numbers will vary according to the procedures that a particular Foreground program uses to get characters from the keyboard. The value you enter from the menu will be in force immediately after KSTROKES installs itself and it can be saved as a default along with the other functions. You can change the speed at any time with a "resident" command (see below). INITIALIZING THE CURSOe CONFIG and change all the New values to correspond to what you have set or to their "natural" values. INSTALLING THE DEFINITIONS -- Selecting option 5 installs the program and returns you to CP/M. The SPFNs and the MACRO function will be in force until the next cold start. The keypad definitions also remain in force until the next cold start. Before exiting, the program throws up a little command summary. You can save the definitions you have created by using the SAVE 16 command f you enter it from the menu (see below). SETTING THE SPEED OF TRANSMISSION -- Some programs such as WORDSTAR keep checking to see if you have typed another character before doing their own housekeeping. If you have, they put the character on a stack to be processed later, when you pause (to think?). If you type too fast, you can overrun the internal stack before WORDSTAR has a chance to do its thing. It then has no place to put the incoming characters and you're in trouble. Executing | line | word | char : word : | 05 ^E | 01 ^A | 13 ^S : 14 ^T : |.......|.......|.......:.......: | 1 | 2 | 3 : E : forward -> | line | word | char : : | 18 ^X | 06 ^F | 04 ^D : : |.......|.......|.......: char : | 0 | . : : scroll -> | down | up : : | 1A   IMMEDIATELY after leaving KSTROKES and returning to CP/M. Use a different file name with a .COM extension for each set of definitions you make up. For example, if you made up a keypad and SPFNs for Perfect Writer, you might want to type: "SAVE 16 KSPW.COM" in response to the system prompt immediately after installation. Thereafter, you could install those definitions by using the system command "KSPW W" in response to a system prompt. By typing an extra character after the filename (it doesn'te Foreground program. Any output from the Foreground program is not incorporated into the MACRO. The "~D", "~X", "~R20" and terminating tildes are not passed on to the Foreground program, nor do they appear on the screen.) SETTING THE SPEED OF TRANSMISSION -- You can change the transmission speed, as described above, at any time with the resident command "~S", where is a number in the range 1 - 9. This is handy if you are making use of some short SPFNs and a long (or oft repeate -- The MACRO is invoked by typing "~X" or "~x" (for eXecute). It may be defined at any time, even in the middle of running another program, by typing "~D" or "~d" (for Define) followed by the desired sequence of keystrokes. After the last stroke another tilde must be typed to terminate the definition. For example: typing "~D^CDIRR B:~", defines the MACRO; subsequently, typing "~X" produces "^CDIRR B:", and will continue to do so until you redefine the MACRO even define a MACRO function that includes ^Cs or other warm boots. When you do this, you may have to include one or more filler characters at appropriate spots since a character or two can be lost on warm boot. Also, some programs, when they are loaded, seem to clear away any characters waiting to be input. If this happens, you may need to put some extra characters in your SPFNs to accomodate such a feature. For example, I have found that when WORDSTAR is called up, the first character after  matter which character or characters you use) you can inhibit the menu. If you want to update your Perfect Writer definitions, use "KSPW" with no extra characters. ====================================================================== THE RESIDENT COMMANDS USING SPECIAL FUNCTIONS -- Once KSTROKES is installed, you invoke an SPFN by typing a tilde as a shift character, followed by the SPFN number. For example: if SPFN 3 were defined as "brown fox" d) MACRO. Set the speed at 1 or 2 most of the time and at 9 just before you execute the long MACRO. You will have to learn the quirks and speed requirements of your particular application program by trial and error. In the preceeding example for the repeat command, if you were in WORDSTAR at the time, you should actually have typed: "~S9~R20~" and then "~S1" after the MACRO stopped repeating to get the desired result. (NOTE that KSTROKES is lazy; it doesn't check whethe using "~D" or "~d", or there's a cold start. (see the application notes, below, for an explanation of the s in this example) Furthermore, you can automatically repeat a MACRO by typing "~R~", where is a decimal number in the range 1 - 65535. For example: typing "~D_________~", defines the MACRO; subsequently, typing "~R20~" will give you 20 lines of underlines. (NOTE that all of the characters you type while defining the MACRO are passed on to th"WS" dissapears. The following SPFN works: "WSLB:D" If you leave out the , the LB: gets lost, but the D does not. If s are not appropriate, sometimes backspaces or "cursor left"s work for this purpose. 2) The resident portion of KSTROKES loads itself into high core, just below the CCP and alters the BDOS call in location 05H, thus appearing to enlarge FDOS. The enlarged "FDOS" includes the CCP as well as the resident portion of then typing: "The quick ~3 jumped over the lazy dog" would produce: "The quick brown fox jumped over the lazy dog" If you want to type a tilde and KSTROKES is installed, type it twice and you'll get a single tilde. For that matter, any keystroke which follows a tilde and which doesn't have a specific meaning will return a single tilde. So, for instance, if you forget to lift your finger from the shift key and type "~@", you'll only get a tilde instead of SPFN 2. USING THE MACROr you actually enter a number in the range 1 - 9. If you are familiar with ASCII codes, you can set the speed slower than "9" by giving "~S:", "~S;", "~S<", "~S=", etc. The program takes the hex equivalent of the character you type, subtracts 031H, multiplies by 4, and uses that byte as a counter.) ===================================================================== GENERAL APPLICATION NOTES 1) Not only will the resident code survive a warm boot, but you can    KSTROKES. This means you lose 3K of core when KSTROKES is installed, even though the resident code, including buffers, is only 1K large. 3) When the resident portion of KSTROKES is installed, you should be able to run most application programs, even those that make use of high core, such as DDT and DESPOOL. System utilities such as STAT, SAVE, BAUD, and various MODEM programs should also run. However, you can't install the resident code if some version of it is already in place or if dard text into a file, then call up that text and insert it into a document with an SPFN such as "^KRBOILER1.TXT" or the equivalent for any particular word processor. Also, you could define successive SPFNs which would perform the parts of a task between "pauses" for entry of custom material. Best of luck with this program. I hope it works well for you. Any problems or suggestions, drop me a line. o the CCP with a RET instruction and you have garbaged it by overrunning the MACRO buffer, you're in trouble. Anyway, who would ever want a MACRO of 190+ keystrokes, right? 5) The numbers 1 - 8 were chosen to designate the SFPNs partly because there is a nice blank space above the top line of keys which was obviously intended to accomodate a template describing each function. With a little Southern ingenuity you could even rig some kind of gadget to hold a different template for each set 100 500 T=D+A 510 PRINT " ="; 520 INPUT T1 530 IF T1=T THEN 590 540 PRINT "NO, COUNT THE SPOTS AND GIVE ANOTHER ANSWER." 541 PRINT " ="; 550 INPUT T2 560 IF T2=T THEN 590 570 PRINT "NO, THE ANSWER IS";T 580 GOTO 600 590 PRINT "RIGHT!" 600 PRINT 601 PRINT "THE DICE ROLL AGAIN..." 610 PRINT 615 N=0 620 GOTO 100 999 END 580 GOTO 600 590 PRINT "RIGHT!something else like DESPOOL is loaded in the background; you have to do a cold start to unload the offending code. Version 2.1 of KSTROKES gives you an error message and returns to CP/M if you try to run it while Background code is loaded. 4) In the interest of brevity (of the resident code and .COM file, that is), I didn't build in a lot of safeguards against wrong keystrokes. For example, the resident code doesn't check whether you have overrun 190 characters in the "~D~" comma10 PRINT TAB(31);"MATH DICE" 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 30 PRINT:PRINT:PRINT 40 PRINT "THIS PROGRAM GENERATES SUCCESIVE PICTURES OF TWO DICE." 50 PRINT "WHEN TWO DICE AND AN EQUAL SIGN FOLLOWED BY A QUESTION" 60 PRINT "MARK HAVE BEEN PRINTED, TYPE YOUR ANSWER AND THE RETURN KEY." 70 PRINT "TO CONCLUDE THE LESSON, TYPE CONTROL-C AS YOUR ANSWER." 80 PRINT 90 PRINT 100 N=N+1 110 D=INT(6*RND(1)+1) 120 PRINT" ----- " 130 IF D=1 THEN 200 140 IF D=2 THEN 180 150 IF  of SPFNs you use. 6) I wrote this program largely because I was disturbed by the lack of a macro capability in a certain nameless word processing program which otherwise has a very powerful and complete command repertoire. KSTROKES is intended to provide a few basic services which are easy to learn and use while keeping overhead to a minimum. You can do some fairly "big" things with it, though, if you have a few tricks up your sleeve. For example, you could put a "boilerplate" of stannd. For that matter, neither does the menu (option 2). In the latter case, overrunning 190 keystrokes only wastes your time. When the resident portion of the code is installed, only the 1st 190 characters go with it. If you overrun with the resident command, you write into the CCP. That wouldn't be so bad if you were in an application program at the time, since when you do a warm boot on leaving the foreground program a new copy of the CCP is read from the disk. But if your program returns tD=3 THEN 180 160 PRINT "I * * I" 170 GOTO 210 180 PRINT "I * I" 190 GOTO 210 200 PRINT "I I" 210 IF D=2 THEN 260 220 IF D=4 THEN 260 230 IF D=6 THEN 270 240 PRINT "I * I" 250 GOTO 280 260 PRINT "I I" 265 GOTO 280 270 PRINT "I * * I" 280 IF D=1 THEN 350 290 IF D=2 THEN 330 300 IF D=3 THEN 330 310 PRINT "I * * I" 320 GOTO 360 330 PRINT "I * I" 340 GOTO 360 350 PRINT "I I" 360 PRINT " ----- " 370 PRINT 375 IF N=2 THEN 500 380 PRINT " +" 381 PRINT 400 A=D 410 GOTO  100 PRINT TAB(33);"NIM" 110 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 120 PRINT:PRINT:PRINT 210 DIM A(100),B(100,10),D(2) 220 PRINT "THIS IS THE GAME OF NIM." 230 PRINT "DO YOU WANT INSTRUCTIONS"; 240 INPUT Z$ 250 IF Z$="NO" THEN 440 260 IF Z$="no" GOTO 440 270 IF Z$="YES" THEN 310 280 IF Z$="yes" GOTO 310 290 PRINT "PLEASE. YES OR NO"; 300 GOTO 240 310 PRINT "THE GAME IS PLAYED WITH A NUMBER OF PILES OF OBJECTS." 320 PRINT "ANY NUMBER OF OBJECTS ARE REMOVED FROM ONE PILE BY 10 1070 LET C=C+1 1080 IF A(I)<=H THEN 1110 1090 LET H=A(I) 1100 LET G=I 1110 NEXT I 1120 IF C/2<>INT(C/2) THEN 1190 1130 NEXT J 1140 LET E=INT(N*RND(1)+1) 1150 IF A(E)=0 THEN 1140 1160 LET F=INT(A(E)*RND(1)+1) 1170 LET A(E)=A(E)-F 1180 GOTO 1380 1190 LET A(G)=0 1200 FOR J=0 TO 10 1210 LET B(G,J)=0 1220 LET C=0 1230 FOR I=1 TO N 1240 IF B(I,J)=0 THEN 1260 1250 LET C=C+1 1260 NEXT I 1270 LET A(G)=A(G)+2*(C/2-INT(C/2))*2^J 1280 NEXT J 1290 IF W=1 THEN 1380 1300 LET C=0 1310 FOR I=1 TO) 580 IF A(I)>2000 THEN 560 590 IF A(I)<1 THEN 560 600 IF A(I)<>INT(A(I)) THEN 560 610 NEXT I 620 PRINT "DO YOU WANT TO MOVE FIRST"; 630 INPUT Q9$ 640 IF Q9$="YES" GOTO 1450 650 IF Q9$="yes" GOTO 1450 660 IF Q9$="NO" GOTO 700 670 IF Q9$="no" GOTO 700 680 PRINT "PLEASE. YES OR NO"; 690 GOTO 630 700 IF W=1 THEN 940 710 LET C=0 720 FOR I=1 TO N 730 IF A(I)=0 THEN 770 740 LET C=C+1 750 IF C=3 THEN 840 760 LET D(C)=I 770 NEXT I 780 IF C=2 THEN 920 790 IF A(D(1))>1 THEN 820 800 PRINT "MACHIThe files named .CPM are actually .COM files for CP/M. If you copy the files to a CP/M system without using 22DISK, just rename all *.CPM to .COM YOU AND" 330 PRINT "THE MACHINE ALTERNATELY. ON YOUR TURN, YOU MAY TAKE" 340 PRINT "ALL THE OBJECTS THAT REMAIN IN ANY PILE BUT YOU MUST" 350 PRINT "TAKE AT LEAST ONE OBJECT, AND YOU MAY TAKE OBJECTS FROM" 360 PRINT "ONLY ONE PILE ON A SINGLE TURN. YOU MUST SPECIFY WHETHER" 370 PRINT "WINNING IS DEFINED AS TAKING OR NOT TAKING THE LAST OBJECT," 380 PRINT "THE NUMBER OF PILES IN THE GAME, AND HOW MANY OBJECTS ARE" 390 PRINT "ORIGINALLY IN EACH PILE. EACH PILE MAY CONTAIN A" 400 PRINT "DIFFERENT NU N 1320 IF A(I)>1 THEN 1380 1330 IF A(I)=0 THEN 1350 1340 LET C=C+1 1350 NEXT I 1360 IF C/2<>INT(C/2) THEN 1380 1370 LET A(G)=1-A(G) 1380 PRINT "PILE SIZE" 1390 FOR I=1 TO N 1400 PRINT I;A(I) 1410 NEXT I 1420 IF W=2 THEN 1450 1430 GOSUB 1570 1440 IF Z=1 THEN 820 1450 PRINT "YOUR MOVE - PILE,NUMBER TO BE REMOVED"; 1460 INPUT X,Y 1470 IF X>N THEN 1450 1480 IF X<1 THEN 1450 1490 IF X<>INT(X) THEN 1450 1500 IF Y>A(X) THEN 1450 1510 IF Y<1 THEN 1450 1520 IF Y<>INT(Y) THEN 1450 1530 LET A(XNE LOSES" 810 GOTO 1640 820 PRINT "MACHINE WINS" 830 GOTO 1640 840 LET C=0 850 FOR I=1 TO N 860 IF A(I)>1 THEN 940 870 IF A(I)=0 THEN 890 880 LET C=C+1 890 NEXT I 900 IF C/2<>INT(C/2) THEN 800 910 GOTO 940 920 IF A(D(1))=1 THEN 820 930 IF A(D(2))=1 THEN 820 940 FOR I=1 TO N 950 LET E=A(I) 960 FOR J=0 TO 10 970 LET F=E/2 980 LET B(I,J)=2*(F-INT(F)) 990 LET E=INT(F) 1000 NEXT J 1010 NEXT I 1020 FOR J=10 TO 0 STEP -1 1030 LET C=0 1040 LET H=0 1050 FOR I=1 TO N 1060 IF B(I,J)=0 THEN 11MBER OF OBJECTS." 410 PRINT "THE MACHINE WILL SHOW ITS MOVE BY LISTING EACH PILE AND THE" 420 PRINT "NUMBER OF OBJECTS REMAINING IN THE PILES AFTER EACH OF ITS" 430 PRINT "MOVES." 440 PRINT 450 PRINT "ENTER WIN OPTION - 1 TO TAKE LAST, 2 TO AVOID LAST"; 460 INPUT W 470 IF W=1 THEN 490 480 IF W<>2 THEN 450 490 PRINT "ENTER NUMBER OF PILES"; 500 INPUT N 510 IF N>100 THEN 490 520 IF N<1 THEN 490 530 IF N<>INT(N) THEN 490 540 PRINT "ENTER PILE SIZES" 550 FOR I=1 TO N 560 PRINT I; 570 INPUT A(I)=A(X)-Y 1540 GOSUB 1570 1550 IF Z=1 THEN 800 1560 GOTO 700 1570 LET Z=0 1580 FOR I=1 TO N 1590 IF A(I)=0 THEN 1610 1600 RETURN 1610 NEXT I 1620 LET Z=1 1630 RETURN 1640 PRINT "Do you want to play another game"; 1650 INPUT Q9$ 1660 IF Q9$="YES" GOTO 1720 1670 IF Q9$="yes" GOTO 1720 1680 IF Q9$="NO" GOTO 1730 1690 IF Q9$="no" GOTO 1730 1700 PRINT "Please. YES or NO"; 1710 GOTO 1650 1720 GOTO 440 1730 END  IF Q9$="NO" GOTO 1730 1690 IF Q9$="no" GOTO 1730 1700 PRINT "Please. YES or NO"  1 PRINT TAB(28);"RUSSIAN ROULETTE" 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 PRINT:PRINT:PRINT 5 PRINT "THIS IS A GAME OF >>>>>>>>>>RUSSIAN ROULETTE." 10 PRINT:PRINT "HERE IS A REVOLVER." 20 PRINT "TYPE '1' TO SPIN CHAMBER AND PULL TRIGGER." 22 PRINT "TYPE '2' TO GIVE UP." 23 PRINT "GO"; 25 N=0 30 INPUT I 31 IF I<>2 THEN 35 32 PRINT " CHICKEN!!!!!" 33 GOTO 72 35 N=N+1 40 IF RND(1)>.833333 THEN 70 45 IF N>10 THEN 80 50 PRINT "- CLICK -" 60 PRINT: GOTO 30 70 PRINT " R$(32+1)+CHR$(32) 1800 PRINT "ROLLS=";ROL;" DOUBLES=";DOU 1820 PRINT "SKUNKS=";X1SKU;" DOUBLE SKUNKS=";X2SKU 1840 PRINT "TOT A=";DIA;" AVERAGE A="; 1860 PRINT USING "##.###";ADIA 1880 PRINT "TOT B=";DIB;" AVERAGE B="; 1900 PRINT USING "##.###";BDIA 1920 FOR WERT = 1 TO 300 1940 NEXT WERT 1960 GOTO 1480 1980 REM ===== HOW MANY PLAYERS ETC. ===== 2000 PRINT CHR$(26) 2020 PRINT : PRINT : INPUT "HOW MANY PLAYERS ";NPLAY 2040 FOR JPLAY = 1 TO NPLAY 2060 PRINT "PLAYER ";JPLAY;"'S NAME "; 2080 INPUT INSTRUCTIONS ===== 1220 PRINT CHR$(26) 'CLEAR SCREEN 1240 PRINT "Welcom to skunk - The object of the game is to amass 100 points" 1260 PRINT "first. You may roll the dice as many times as you wish each turn" 1280 PRINT "untill a skunk or double skunk is rolled. A single skunk wipes" 1300 PRINT "points acquired for that turn. A double skunk wipes out points" 1320 PRINT "for that turn and all other points." 1340 PRINT : PRINT : PRINT "Any key to continue" 1360 SS=INKEY$ 1380 X=RND ' RESEED BASED OM ================ 2680 REM ===== SUBROUTINE - PLAY AN INDIVIDULE TURN 2700 SCUR=CHR$(27)+"="+CHR$(32+14)+CHR$(32+42) 2720 PRINT SCUR+"YOUR TURN "+SPLAY(JPLAY)+SPACE$(10)+CHR$(7); 2740 ITOT=0 2760 REM ----- JUST IN CASE, REMOVE LAST PLAYERS JUNK FROM ZILOG SIO 2780 FOR II = 1 TO 4 2800 SS=INKEY$ 2820 NEXT II 2840 GOTO 2902 2860 REM ----- THE DISPLAY AND TURN LOOP 2880 SCUR=CHR$(27)+"="+CHR$(32+14)+CHR$(32+42) 2900 PRINT SCUR+SPLAY(JPLAY)+SPACE$(10); 2902 IF SPLAY(JPLAY) = "COMPUTER" GOTO 2932  BANG!!!!! YOU'RE DEAD!" 71 PRINT "CONDOLENCES WILL BE SENT TO YOUR RELATIVES." 72 PRINT:PRINT:PRINT 75 PRINT "...NEXT VICTIM...":GOTO 20 80 PRINT "YOU WIN!!!!!" 85 PRINT "LET SOMEONE ELSE BLOW HIS BRAINS OUT." 90 GOTO 10 99 END NT "...NEXT V SPLAY(JPLAY) 2100 NEXT JPLAY 2102 IF NPLAY > 1 GOTO 2140 2104 REM ----- ONLY ONE PLAYER, OTHER WILL BE COMPUTER 2106 NPLAY=NPLAY+1 2108 SPLAY(NPLAY)="COMPUTER" 2120 REM ===== INITIALIZE SCREEN ===== 2140 GOSUB 3600 2160 PRINT CHR$(27)+"="+CHR$(32+1)+CHR$(32);"SCORE PLAYER" 2180 GOSUB 3420 'SCORES & NAMES 2200 PRINT CHR$(27)+"="+CHR$(32+22)+CHR$(32+42); 2220 PRINT "ANY KEY=ROLL'EM CR=QUIT"; 2240 REM ===== PLAY THE GAME ===== 2260 JPLAY=0 2280 JPLAY=JPLAY+1 2300 GOSUB 2700 'PLAY 2320 PSCON HUMANS DELAY 1400 IF LEN(SS) = 0 GOTO 1360 1420 IF SS <> "T" GOTO 2020 1440 REM ===== DICE TEST ROUTINE ===== 1460 GOSUB 3600 'BOARD SETUP 1480 NUM=FNIVAL 1500 DIA=DIA+NUM 1520 NDIA=NUM 1540 GOSUB 4020 1560 NUM=FNIVAL 1580 DIB=DIB+NUM 1600 NDIB=NUM 1620 GOSUB 4060 1640 IF NDIA+NDIB = 2 THEN X2SKU=X2SKU+1 1660 IF NDIA = NDIB THEN DOU=DOU+1 1680 IF NDIA = 1 THEN X1SKU=X1SKU+1 1700 IF NDIB = 1 THEN X1SKU=X1SKU+1 1720 ROL=ROL+1 1740 ADIA=DIA/ROL 1760 BDIA=DIB/ROL 1780 PRINT CHR$(27)+"="+CH2905 REM ----- HUMAN INPUT 2920 SEL=INPUT$(1) 2921 IF SEL = CHR$(13) GOTO 3220 2925 GOTO 2960 2930 REM ----- COMPUTER INPUT 2932 IF ITOT < 5 GOTO 2960 'GO ON AT ANY COST 2934 IF ITOT > 20 GOTO 3220 'QUIT 2936 IF NOSKU > 4 GOTO 3220 'QUIT 2959 REM ----- ROLL TALLY & CHECK 2960 GOSUB 4020 'ROLLEM 2980 ITOT=ITOT+JTOT 3000 IF NUM = 1 GOTO 3120 3020 IF NUMA = 1 GOTO 3120 3040 SCUR=CHR$(27)+"="+CHR$(32+17)+CHR$(32+42) 3060 PRINT SCUR+"TOTAL SO FAR ";ITOT 3080 GOTO 2880 'END TURN LOOP 3100 REM ----1000 REM ************************************************************ 1020 REM * SKUNK IS A DICE GAME WHERE THE DICE ARE ROLLED AND THE * 1040 REM * TOTAL ADDED TO THE PLAYERS SCORE UNLESS A SKUNK APPEARS * 1060 REM * WHICH BLOWS THAT TURN OR A DOUBLE SKUNK WHICH BLOWS THE * 1080 REM * CUMLITIVE SCORE. 8/19/83 * 1100 REM ************************************************************ 1120 DEFSTR S 1140 DEFINT I-N 1160 DIM SPLAY(4), PSCORE(4) 1180 DEF FNIVAL=INT(6*RND(1))+1 1200 REM =====RE(JPLAY)=PSCORE(JPLAY)+ITOT 2340 GOSUB 3420 'UPDATE SCORES 2360 IF PSCORE(JPLAY) > 99 GOTO 2480 2380 FOR DELAY = 1 TO 200 2400 NEXT DELAY 2420 IF JPLAY = NPLAY GOTO 2260 2440 GOTO 2280 2460 REM ===== WINNER - PLAY AGAIN ? ===== 2480 FOR I = 1 TO 4 2500 PSCORE(I)=0 2520 NEXT I 2540 PRINT CHR$(27)+"="+CHR$(32+22)+CHR$(32) 2560 INPUT " CR=AGAIN SAME PLAYERS, 1CR=AGAIN NEW PLAYERS, 2CR=CP/M ";KK 2580 IF KK = 0 GOTO 2140 2600 IF KK = 1 GOTO 2000 2620 SYSTEM 2640 GOTO 5020 'END AND BASIC 2660 RE  - A SKUNK 3120 ITOT=0 3125 NOSKU=0 3140 IF NUMA = NUM THEN PSCORE(JPLAY)=0 3160 FOR X = 1 TO 200 'DELAY PLAYER SEE SKUNK-SCORES 3180 NEXT X 3200 REM ----- END OF TURN, CLEAR BOARD 3220 FOR II = 14 TO 17 STEP 3 3240 PRINT CHR$(27)+"="+CHR$(32+II)+CHR$(32+42); 3260 PRINT SPACE$(20); 3280 NEXT II 3300 NUM=7 3320 GOSUB 4240 'CLEAR UPPER DI 3340 GOSUB 4260 'CLEAR LOWER DI 3360 RETURN 3380 REM ================ 3400 REM ===== SUBROUTINE - UPDATE SCORES 3420 FOR I = 1 TO NPLAY 3440 IROW=(I*2)+2  DATA " "," **"," " 4720 REM ----- 3 4740 DATA " ","** "," "," *** " 4760 DATA " "," **"," " 4780 REM ----- 4 4800 DATA " ","** **"," "," " 4820 DATA " ","** **"," " 4840 REM ----- 5 4860 DATA " ","** **"," "," *** " 4880 DATA " ","** **"," " 4900 REM ----- 6 4920 DATA " ","** B 4120 4060 NUM=FNIVAL : JTOT=JTOT+NUM : GOSUB 4260 4080 GOTO 4120 'USE ITS RETURN 4100 REM ----- FURTHER RANDOMISE 4120 FOR I = 1 TO 4 4140 X=RND 4160 NEXT I 4180 RETURN 4200 REM ================ 4220 REM ===== SUBROUTINE - DICE VALUE UPPER RIGHT LOWER LEFT 4240 IROW=4 : ICOL=45 : GOTO 4280 4260 IROW=13 : ICOL=25 4280 IF NUM = 1 THEN RESTORE 4620 4300 IF NUM = 2 THEN RESTORE 4680 4320 IF NUM = 3 THEN RESTORE 4740 4340 IF NUM = 4 THEN RESTORE 4800 4360 IF NUM = 5 THEN RESTORE 4860 4380 10 PRINT TAB(30);"SLOTS" 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 30 PRINT:PRINT:PRINT 100 REM 110 REM THIS PROGRAM SIMULATES A SLOT MACHINE 120 PRINT "YOU ARE IN THE H&M CASINO, IN FRONT OF ONE OF OUR" 130 PRINT "ONE-ARMED BANDITS. BET FROM 1$ TO $100." 140 PRINT "TO PULL THE ARM, PUNCH THE RETURN KEY AFTER MAKING YOUR BET." 150 LET P=0 160 PRINT:PRINT "YOUR BET"; 170 INPUT M 180 IF M>100 THEN 860 190 IF M<1 THEN 880 200 M=INT(M) 210 GOSUB 1270 220 PRINT 230 LET X=INT(3460 PRINT CHR$(27)+"="+CHR$(32+IROW)+CHR$(32); 3480 PRINT USING "#####";PSCORE(I); 3500 PRINT SPACE$(3);SPLAY(I) 3520 NEXT I 3540 RETURN 3560 REM ================ 3580 REM ===== SUBROUTINE - SET UP THE BOARD 3600 PRINT CHR$(26) 'CLEAR SCREEN 3620 RESTORE 3920 3640 FOR I = 3 TO 11 3660 READ SLIN 3680 SCUR=CHR$(27)+"="+CHR$(32+I)+CHR$(32+41) 3700 PRINT SCUR+SLIN; 3720 NEXT I 3730 PRINT 'A CR FOR MBASIC 3740 RESTORE 3920 3760 FOR I = 12 TO 20 3780 READ SLIN 3800 SCUR=CHR$(27)+"="+CHR$(32+I **"," ","** **" 4940 DATA " ","** **"," " 4960 REM ----- 7 BLANK 4980 DATA " "," "," "," " 5000 DATA " "," "," " 5020 END 0 DATA " IF NUM = 6 THEN RESTORE 4920 4400 IF NUM = 7 THEN RESTORE 4980 4420 REM ----- PRINT THE VALUE 4440 FOR ILIN = 1 TO 7 4460 READ SLIN 4480 SDIE=CHR$(27)+"="+CHR$(32+IROW)+CHR$(32+ICOL) 4500 PRINT SDIE+SLIN; 4520 IROW=IROW+1 4540 NEXT ILIN 4560 PRINT 4580 RETURN 4600 REM ----- DICE VALUE DATA 4620 DATA " /---\ "," | @ @ | "," \ ~ / ","#===***===#" 4640 DATA " / *** \ "," / *** \ "," \==---==/ " 4660 REM ----- 2 4680 DATA " ","** "," "," " 47006*RND(1)+1) 240 LET Y=INT(6*RND(1)+1) 250 LET Z=INT(6*RND(1)+1) 260 PRINT 270 ON X GOTO 910,930,950,970,990,1010 330 ON Y GOTO 1030,1050,1070,1090,1110,1130 390 ON Z GOTO 1150,1170,1190,1210,1230,1250 450 IF X=Y THEN 600 460 IF X=Z THEN 630 470 IF Y=Z THEN 650 480 PRINT:PRINT"YOU LOST." 500 LET P=P-M 510 PRINT "YOUR STANDINGS ARE $"P 520 PRINT "AGAIN"; 530 INPUT A$ 540 IF LEFT$(A$,1)="Y" THEN 160 550 PRINT 560 IF P<0 THEN 670 570 IF P=0 THEN 690 580 IF P>0 THEN 710 590 GOTO 1350 600 IF )+CHR$(32+21) 3820 PRINT SCUR+SLIN; 3840 NEXT I 3845 PRINT 'A CR FOR MBASIC 3860 NUM=1 3880 RETURN 3900 REM ----- DICE OUTLINE DATA 3920 DATA "+-----------------+","| |","| |" 3940 DATA "| |","| |","| |" 3960 DATA "| |","| |","+-----------------+" 3980 REM ================ 4000 REM ===== SUBROUTINE - ROLL'EM 4020 NOSKU=NOSKU+1 : NUM=FNIVAL : JTOT=NUM : NUMA=NUM : GOSUB 4240 4040 GOSU  Y=Z THEN 730 610 IF Y=1 THEN 820 620 GOTO 1341 630 IF Z=1 THEN 820 640 GOTO 470 650 IF Z=1 THEN 820 660 GOTO 1341 670 PRINT "PAY UP! PLEASE LEAVE YOUR MONEY ON THE TERMINAL." 680 GOTO 1350 690 PRINT "HEY, YOU BROKE EVEN." 700 GOTO 1350 710 PRINT "COLLECT YOUR WINNINGS FROM THE H&M CASHIER." 720 GOTO 1350 730 IF Z=1 THEN 780 740 PRINT:PRINT "**TOP DOLLAR**" 750 PRINT "YOU WON!" 760 P=(((10*M)+M)+P) 770 GOTO 510 780 PRINT:PRINT "***JACKPOT***" 790 PRINT "YOU WON!" 800 P=(((100*M)+M)+P) 8)) 100 'It appears that the Kaypro II looks very much like an ADM-3A Terminal !!! 110 ' 120 PRINT CLS$ 130 PRINT" The Wizard of OsZ - 'SPACEWAR'" 140 PRINT 150 PRINT:PRINT "Do you require instructions (Y or N) ?"; 160 A$=INKEY$:IF LEN(A$)=0 THEN GOTO 160 ' get keyboard input 170 IF A$="N" OR A$="n" THEN PRINT CLS$:GOTO 480 180 PRINT CLS$ ' clear screen 190 PRINT "You are about to go on a mission to destroy five" 200 PRINT "alien space craft that threaten the galaxy...In" 210290 NEXT Q4 1300 RETURN 1310 FOR T8=1 TO 5 1320 PRINT CHR$(7); 1330 NEXT T8 1340 RETURN 1341 PRINT:PRINT "DOUBLE!!" 1342 PRINT "YOU WON!" 1343 P=(((2*M)+M)+P) 1344 GOTO 510 1350 REM 9999 END  T8 1340 RETURN 1341 PRINT:PRINT "DOUBLE!!" 1342 rget" 410 PRINT "aiming ability, so don't delay! Your performance is" 420 PRINT "based on the number of alien space craft destroyed" 430 PRINT "to the number of misses...";"Enter '0' at any time to" 440 PRINT "quit";". Please enter you current rating now as" 450 PRINT "follows:" 460 PRINT DN$ 470 FOR N=1 TO 2000:NEXT N 480 FOR I=1 TO 10:PRINT DC$+CHR$(53)+CHR$(32);EP$ 490 FOR N=1 TO 10:NEXT N ' ring bell and flash message on screen 500 PRINT CHR$(7);DC$+CHR$(53)+CHR$(35); "N10 GOTO 510 820 PRINT:PRINT "*DOUBLE BAR*" 830 PRINT "YOU WON!" 840 P=(((5*M)+M)+P) 850 GOTO 510 860 PRINT "HOUSE LIMITS ARE $100" 870 GOTO 160 880 PRINT "MINIMUM BET IS $1" 890 GOTO 160 900 GOTO 220 910 PRINT "BAR";:GOSUB 1310 920 GOTO 330 930 PRINT "BELL";:GOSUB 1310 940 GOTO 330 950 PRINT "ORANGE";:GOSUB 1310 960 GOTO 330 970 PRINT "LEMON";:GOSUB 1310 980 GOTO 330 990 PRINT "PLUM";:GOSUB 1310 1000 GOTO 330 1010 PRINT "CHERRY";:GOSUB 1310 1020 GOTO 330 1030 PRINT " BAR";:GOSUB 1310  PRINT "order to destroy an alien space craft, you must" 220 PRINT "position it such that it appears in the exact center" 230 PRINT "of your target sight. To do that, use the numeric" 240 PRINT "keypad to position the alien craft in the following" 250 PRINT "four directions:" 260 PRINT 270 FOR I=1 TO 10:PRINT DC$+CHR$(41)+CHR$(32);EP$ 280 FOR N=1 TO 10:NEXT N ' ring bell and flash message on screen 290 PRINT CHR$(7);DC$+CHR$(41)+CHR$(32); " 8 - Up, 2 - Down, 4 - Left, 6 - Ri10 ' SPACEWAR - Complements of the Wizard of OsZ, and Kelly Smith CP/M-Net 20 ' ------------------ Kaypro II Terminal Commands ---------------------- 30 ' 40 E$=CHR$(27):' Escape Character 50 CLS$=CHR$(26):' Clear Screen 60 DC$=E$+"=":' Direct Cursor Addressing 70 EP$=CHR$(24):' Erase to End of Line 80 'NOTE: The Kaypro II uses the following scheme for direct cursor addressing: 90 ' Location= (CHR$(Line number+32));(CHR$(Column number+32 - Novice, H - Hotshot, E - Expert, A - Ace ?"; 510 FOR N=1 TO 10:NEXT N 520 NEXT I 530 V$=INKEY$:IF LEN(V$)=0 THEN GOTO 530 ' get keyboard input and create rating value 540 IF V$="N" OR V$="n" THEN V=100 ' novice rating 550 IF V$="H" OR V$="h" THEN V=50 ' hotshot rating 560 IF V$="E" OR V$="e" THEN V=10 ' expert rating 570 IF V$="A" OR V$="a" THEN V=5 ' ace, and you better be fast on this one! 580 PRINT CLS$ ' clear screen 590 FOR I=1 TO 10:PRINT DC$+CHR$(44)+CHR$(32);EP$ 600 FOR N=1 TO 30:NEXT N1040 GOTO 390 1050 PRINT " BELL";:GOSUB 1310 1060 GOTO 390 1070 PRINT " ORANGE";:GOSUB 1310 1080 GOTO 390 1090 PRINT " LEMON";:GOSUB 1310 1100 GOTO 390 1110 PRINT " PLUM";:GOSUB 1310 1120 GOTO 390 1130 PRINT " CHERRY";:GOSUB 1310 1140 GOTO 390 1150 PRINT " BAR" 1160 GOTO 450 1170 PRINT " BELL" 1180 GOTO 450 1190 PRINT " ORANGE" 1200 GOTO 450 1210 PRINT " LEMON" 1220 GOTO 450 1230 PRINT " PLUM" 1240 GOTO 450 1250 PRINT " CHERRY" 1260 GOTO 450 1270 FOR Q4=1 TO 10 1280 PRINT CHR$(7); 1ght"; 300 FOR N=1 TO 10:NEXT N 310 NEXT I 320 FOR N=1 TO 2000:NEXT N:PRINT:PRINT 330 FOR I=1 TO 10:PRINT DC$+CHR$(43)+CHR$(32);EP$ 340 FOR N=1 TO 10:NEXT N ' ring bell and flash message on screen 350 PRINT CHR$(7);DC$+CHR$(43)+CHR$(32); "Then to fire on the alien space craft, enter '5'."; 360 FOR N=1 TO 10:NEXT N 370 NEXT I 380 FOR N=1 TO 2000:NEXT N:PRINT:PRINT 390 PRINT DY$"Also, time is an important factor on your" 400 PRINT "mission...Alien return fire degrades your ta   ' ring bell and flash message on screen 610 PRINT CHR$(7);DC$+CHR$(44)+CHR$(43);"Good luck on your mission !!!"; 620 FOR N=1 TO 30:NEXT N 630 NEXT I 640 D=1:D1=1:PRINT CLS$ ' clear screen 650 GOSUB 1770 ' display initial pilot rating 660 Y=6:X=0:GOSUB 1100:GOSUB 930 ' display cross-hairs 670 Y=2:X=14:GOSUB 1100:PRINT "Target Position: " 680 Y=INT(10*RND(1)+7) ' set y axis random bounds 690 X=INT(20*RND(1)+21) ' set x axis random bounds 700 GOSUB 1100 ' position to xy coordinate 710 GOSUB 1070 ' T " -----------------------" 1060 RETURN 1070 PRINT"<-*->": ' target display 1080 P=Y:Q=X ' save xy position 1090 RETURN 1100 PRINT DC$+CHR$(32+Y)+CHR$(32+X); ' position to xy coordinate 1110 RETURN 1120 IF Y=12 THEN GOTO 1140 ' proper line for hit on target? 1130 GOSUB 1430:GOTO 700 ' no, show total number missed 1140 IF X=25 THEN GOTO 1160 ' proper column for hit on target? 1150 GOSUB 1430:GOTO 700 ' no, show total number missed 1160 Y=12:X=26:GOSUB 1100:PRINT "*";"+";"*" ' explo$="3" OR A$="7" OR A$="9" THEN GOSUB 1840 ' re-display '+' 880 IF A$="." THEN GOSUB 1860 ' momentarily display total score if '.' pressed 890 GOSUB 1630 ' erase target position 900 GOSUB 1100 ' position to xy coordinate 910 GOSUB 1070 ' display target 920 GOTO 720 ' repeat erase/move/position/display sequence 930 PRINT " -----------------------" ' cross-hairs 940 PRINT " |" 950 PRINT " |" 960 PRINT " |" total score, and display total score 1390 Y=20:X=17:GOSUB 1100 ' position cursor for next message 1400 PRINT "Aliens Destroyed =";D1 ' add 1 to alien craft hit 1410 D1=D1+1:IF D1=6 THEN 1480 ' close up shop if all 5 destroyed 1420 GOTO 680 ' continue with next target 1430 S=S-10:GOSUB 1860 ' subtract 10 from total score, and display total score 1440 P=Y:Q=X:Y=21:X=17:GOSUB 1100 ' position cursor for next message 1450 PRINT "Aliens Missed =";D:D=D+1 ' add 1 to alien craft missed 1460 Y=P:X=Q:GOSUB 11display target 720 GOSUB 1660 ' advance alien target position 730 P=Y:Q=X:Y=2:X=31:GOSUB 1100 ' save xy position, position next message 740 PRINT "X =";Q-25;"Y =";P-12 ' display alien target coordinates 750 Y=3:X=13:GOSUB 1100:PRINT "Time =";R;:R=R+1 ' display relative run time 760 D2=SQR(((P-12)^2)+((Q-25)^2)) ' compute distance to target 770 Y=3:X=25:GOSUB 1100:PRINT "Distance =";D2;EP$ ' display distance to target 780 Y=P:X=Q ' restore original xy coordinate values 790 A$=INKEY$:IF LEN(A$)=0 THENsion 1170 Y=11:X=27:GOSUB 1100:PRINT "*" 1180 Y=13:X=27:GOSUB 1100:PRINT "*" ' a quick puff of smoke... 1190 Y=12:X=25:GOSUB 1100:PRINT "+ + +" 1200 Y=11:X=26:GOSUB 1100:PRINT "+ +" 1210 Y=13:X=26:GOSUB 1100:PRINT "+ +" 1220 Y=10:X=27:GOSUB 1100:PRINT "+" 1230 Y=14:X=27:GOSUB 1100:PRINT "+" ' alien craft coming unglued... 1240 Y=12:X=25:GOSUB 1100:PRINT " " 1250 Y=11:X=28:GOSUB 1100:PRINT " " 1260 Y=10:X=27:GOSUB 1100:PRINT " " 1270 Y=13:X=26:GOSUB 1100:PRINT " " 1280 Y=12:X=29:GOSUB 1100:PRINT  970 PRINT " | |" 980 PRINT " | | | |" 990 PRINT " |----------------| + |----------------|" 1000 PRINT " | | | |" 1010 PRINT " | |" 1020 PRINT " | | |" 1030 PRINT " |" 1040 PRINT " |" 1050 PRIN00 ' position to xy coordinate 1470 RETURN 1480 Y=20:X=0:GOSUB 1100 ' position to xy coordinate 1490 D=D-1 ' subtract -1 to number missed 1500 PRINT " Congratulations, You have saved the galaxy !!!" 1510 PRINT " Your mission record:";INT(5/(5+D)*100);"% performance" 1520 IF 5/(5+D)*100>75 THEN V=V-50 1530 IF 5/(5+D)*100<51 THEN V=V+50 1540 Y=21:X=7:GOSUB 1100 1550 PRINT DC$+CHR$(54)+CHR$(32);EP$ 1560 FOR N=1 TO 100:NEXT N ' ring bell and flash message on screen 1570 PRINT CLS$;DC$+CHR$( GOTO 720 ' check for keyboard input 800 GOSUB 1100 ' position to xy coordinate 810 IF A$="6" OR A$=CHR$(12) THEN X=X+1 ' 6 or RIGHT arrow = move right 820 IF A$="4" OR A$=CHR$(8) THEN X=X-1 ' 4 or LEFT arrow = move left 830 IF A$="2" OR A$=CHR$(10) THEN Y=Y+1 ' 2 or DOWN arrow = move down 840 IF A$="8" OR A$=CHR$(11) THEN Y=Y-1 ' 8 or UP arrow = move up 850 IF A$="5" OR A$="*" THEN GOTO 1120 ' 5 or RETURN = fire on target 860 IF A$="0" THEN PRINT CLS$:GOTO 1540 ' 0 = quit (maybe) 870 IF A$="1" OR A" " 1290 Y=13:X=28:GOSUB 1100:PRINT " " 1300 Y=14:X=27:GOSUB 1100:PRINT " " 1310 Y=12:X=27:GOSUB 1100:PRINT " " 1320 Y=11:X=26:GOSUB 1100:PRINT " " ' alien craft destroyed (totally!) 1330 FOR I=1 TO 10:PRINT DC$+CHR$(54)+CHR$(32);EP$ 1340 FOR N=1 TO 50:NEXT N ' ring bell and flash message on screen 1350 PRINT CHR$(7);DC$+CHR$(54)+CHR$(37); "M A Y T H E F O R C E B E W I T H Y O U"; 1360 FOR N=1 TO 50:NEXT N 1370 NEXT I:PRINT DC$+CHR$(54)+CHR$(32);EP$ 1380 S=S+10:GOSUB 1860 ' add 10 to   54)+CHR$(40);"Do you want another mission (Y or N) ?" 1580 FOR N=1 TO 100:NEXT N 1590 A$=INKEY$:IF LEN(A$)=0 THEN GOTO 1550 1600 PRINT DC$+CHR$(54)+CHR$(32);EP$ 1610 IF LEFT$(A$,1)="Y" OR LEFT$(A$,1)="y" THEN PRINT CLS$:GOTO 480 1620 PRINT CLS$:SYSTEM 1630 PRINT DC$+CHR$(32+P)+CHR$(32+Q); ' position cursor to target location 1640 PRINT " " ' erase target location 1650 RETURN 1660 T=T+1.5 ' overall skill level set here (3 is super skill level!) 1670 IF T>V THEN 1690 1680 RETURN 1690 IF X>36 along the way to pay your creditors." 120 PRINT 130 PRINT "GOOD LUCK, You'll need it!" 140 GOSUB 2680 150 GOSUB 1610 160 IF RND(I3)>.7 THEN 240 170 INPUT "A DRYAD WISHES TO GUIDE YOU. WILL YOU LET HER";A$ 180 IF LEFT$(A$,1)="Y" THEN 230 190 F1=0 200 IF RND(1)<.2 THEN 240 210 GOSUB 1550 220 GOTO 240 230 F1=1 240 W1=F1 250 PRINT "There are three paths into the Forest." 260 PRINT "ONE IS CORRECT." 270 C1=INT(3*RND(1)+1) 280 Y1=INT(3*RND(1)+1) 290 IF RND(1)<.4 THEN 310 300 GOSUB 1100 ' delay while score is displayed 1880 PRINT " + ":Y=P:X=Q:RETURN ' erase score display and return W1-F1 690 S1=8-Z1-G1/(1+Z1) 700 IF S1>4 THEN 720 710 S1=4 720 IF 3.5*RND(1).5+C2/50 THEN 820 800 PRINT "She says";C1 810 GOTO 910 820 PRINT "She doesn't know." 830 INPUT "Will you cast lots to decide";A$ 840 IF LEFT$(A$,1)="N" THEN 910 850 PRINT "The lot says"; 860 IF RND(1)>.5+C2/10 THEN 890 870 XTHEN GOTO 1730 1700 IF Y<12 THEN GOTO 1730 1710 X=X+1:Y=Y-1:GOSUB 1630:GOSUB 1100:GOSUB 1070:GOTO 1740 1720 GOTO 1740 1730 X=X+1:Y=Y-1:GOSUB 1630:GOSUB 1100:GOSUB 1070:GOTO 1740 1740 IF X>45 OR X<1 THEN Y=12:X=19:V=V+10:GOSUB 1100: PRINT CHR$(7);"You're shot down!":GOSUB 1830:GOTO 1540 1750 IF Y<7 OR Y>18 THEN Y=12:X=19:V=V+10:GOSUB 1100: PRINT CHR$(7);"You're destroyed!":GOSUB 1830:GOTO 1540 1760 T=0:RETURN 1770 IF V<=5 THEN Q$="Rating = Ace Pilot":GOTO 1810 ' determine pilot rating 17 Y1=C1 310 INPUT "DO YOU WISH TO CONSULT AN ORACLE";A$ 320 IF LEFT$(A$,1)="N" THEN 460 330 INPUT "HOW MANY MAIDENS SHOULD BE SACRIFICED";V1 340 V1=INT(V1) 350 IF V1>2*RND(1) THEN 380 360 PRINT "THE ORACLE IS OFFENDED" 370 C2=C2-1 380 IF V1*F1<10*RND(1) THEN 400 390 GOSUB 1550 400 IF C2<0 THEN 450 410 IF RND(1)<.4-(V1/10) THEN 450 420 PRINT "THE ORACLE SAYS PATH";Y1 430 P1=1 440 GOTO 460 450 PRINT "THE SIGNS ARE UNCLEAR." 460 INPUT "CHOOSE PATH 1,2 OR 3";X1 470 X1=INT(X1) 410 INPUT "ENTER A NUMBER";I3 20 PRINT "SWORDS AND SORCERY" 30 REM FROM AUG 1978 KILOBAUD MAGAZINE 40 PRINT 50 PRINT "You are a gallant but broke hero attempting to " 60 PRINT "rescue an elfin princess from the Necromancer's" 70 PRINT "dungeon located within a dark forest. In order to" 80 PRINT "accomplish the rescue you must pass safely thru" 90 PRINT "the forest to the dungeon, release the princess" 100 PRINT "and escort her to safety. You must also pick up" 110 PRINT "enough gold 1=C1 880 GOTO 900 890 X1=3-C1 900 PRINT X1 910 INPUT "DO YOU CHOOSE 1 OR 2";X1 920 X1=INT(X1+1E-04) 930 IF X1>2 OR X1<1 THEN PRINT "1 OR 2, PLEASE":GOTO 910 940 D0=0 950 IF X1<>C1 THEN 990 960 C2=C2+RND(1)*SGN(.5-RND(1)) 970 C3=0 980 GOTO 1010 990 C2=C2-.2 1000 C3=-1 1010 IF T1=0 THEN 1020 1020 L2=L2-S1 1030 S2=S2+S1 1040 I2=I2+1 1050 IF E1<>0 THEN 1100 1060 IF RND(1)>.15+.2*F1 THEN 1100 1070 PRINT "You find an enchanted sword." 1080 C2=C2+.2 1090 E1=1 1100 IF R80 IF V<=10 THEN Q$="Rating = Expert Pilot":GOTO 1810 1790 IF V<=49 THEN Q$="Rating = Hotshot Pilot":GOTO 1810 1800 Q$="Rating = Novice Pilot" 1810 Y=0:X=17:GOSUB 1100 ' set cursor position for pilot rating 1820 PRINT Q$:RETURN ' print rating 1830 FOR N=1 TO 300:NEXT N:RETURN ' general purpose delay 1840 P=Y:Q=X:Y=12:X=27:GOSUB 1100:PRINT "+" ' print '+' for digits 1,3,7,9 1850 Y=P:X=Q:RETURN 1860 P=Y:Q=X:Y=12:X=19:GOSUB 1100:PRINT "Total Score =";S ' display total score 1870 GOSUB 1830:GOSUB 1830:80 IF X1>3 THEN 460 490 IF X1<1 THEN 460 500 L1=100*(RND(1)+1) 510 IF X1=C1 THEN 540 520 C2=C2-2 530 L1=L1+50 540 C2=C2+1 550 T1=0 560 C2=C2+.5*RND(1)+F1+P1+.2*V1*SGN(5.1-V1) 570 IF C2>1 THEN 610 580 IF C2>-1 THEN 620 590 PRINT "A Black Cat has crossed your path." 600 GOTO 620 610 PRINT "You have chosen well, but" 620 PRINT "Beware.... Many dangers lie ahead." 630 PRINT 640 R1=0 650 C3=0 660 PRINT "You have come to a fork in the path." 670 C1=INT(2*RND(1)+1) 680 Z1=!  ND(1)-.5*(F1+C3)<.95 THEN 1130 1110 PRINT "SNAKE!!!" 1120 GOSUB 1650 1130 T1=T1+1 1140 IF RND(1)<.8+(C2+C3/30) THEN 1170 1150 GOSUB 2380 1160 PRINT "You travel on .... " 1170 IF RND(1)<.95 THEN 1190 1180 GOSUB 3450 1190 IF RND(1)>.03 THEN 1210 1200 GOSUB 2990 1210 P3=0 1220 IF RND(1)<.99+(C2-I2/10)/100 THEN 1240 1230 GOSUB 3290 1240 IF W1=0 THEN 1270 1250 IF RND(1)<.95+(C2+C3)/50 THEN 1270 1260 GOSUB 2710 1270 IF RND(1)<.95 THEN 1310 1280 INPUT "GOLD." 2030 G1=G1-D9 2040 RETURN 2050 IF W1>0 THEN 2080 2060 PRINT "YOU ARE ENSLAVED." 2070 GOTO 1510 2080 PRINT "YOU ARE SOLD TO THE SATYRS." 2090 GOSUB 2760 2100 GOTO 1960 2110 IF R1=0 THEN 2130 2120 GOTO 2190 2130 PRINT "You are at the entrance to the Dungeon. There is a guard." 2140 GOSUB 3480 2150 R1=1 2160 W1=W1+1 2170 PRINT "You have released the Princess!" 2180 GOSUB 1660 2190 IF L1>0 THEN 2290 2200 IF R1=1 THEN 2240 2210 IF R1=-2 THEN 2330 2220 PRINT "You have Fst." 1670 IF P3=1 THEN 1690 1680 PRINT "You have gone";S2;"km." 1690 T1=0 1700 GOSUB 2680 1710 D3=D3+1+W1-F1 1720 IF D3<4-W1+F1 THEN 1820 1730 IF D4<>0 THEN 1780 1740 PRINT "You are out of food." 1750 D4=1 1760 C2=C2-RND(1) 1770 GOTO 1820 1780 F5=F5+1 1790 IF F5<2 THEN 1810 1800 PRINT "You have gone";F5;"days without food." 1810 C2=C2-RND(1)+.2*F1 1820 IF RND(1)>1-(I2+F8)/100 THEN 1880 1830 IF F5>7 THEN 1860 1840 PRINT "Time to move on." 1850 RETURN 1860 PRINT "YOU S4*S1*(RND(1)-.7) 2590 T1=T1+1 2600 IF RND(1)>.7 THEN 2990 2610 PRINT "You got away that time." 2620 IF G1<2 THEN 2670 2630 IF RND(1)>.3-C2/10 THEN 2670 2640 PRINT "But you dropped a sack of gold." 2650 PRINT 2660 G1=G1-1 2670 RETURN 2680 PRINT " " 2690 X1=RND(1) 2700 RETURN 2710 PRINT "OH NO! SATYRS." 2720 IF E1<>1 THEN 2760 2730 IF RND(1)<.5 THEN 2760 2740 PRINT "They run from your sword." 2750 RETURN 2760 PRINT "They wi! How many sacks will you take";X1 1290 IF X1>20 THEN PRINT "Oh, come now!";X1;"sacks??":GOTO 1280 1300 G1=G1+INT(X1) 1310 IF T1<10-2*F1 THEN 1330 1320 GOSUB 1660 1330 IF RND(1)>.05 THEN 1370 1340 PRINT "You meet an escaped slave girl." 1350 W1=W1+1 1360 GOTO 1160 1370 IF L2>0 THEN 1010 1380 L1=L1-L0*.85 1390 IF L1>20 THEN 1410 1400 GOSUB 2110 1410 IF C3<>-1 THEN 660 1420 IF RND(1)<.9 THEN 660 1430 IF RND(1)<.5 THEN 1450 1440 GOSUB 2990 1450 PRINT "DEAD END" 1460 L2=L2+L0 AILED" 2230 GOTO 2310 2240 PRINT "You made it!!" 2250 PRINT "You are a Hero!" 2260 IF G1<2 THEN 2300 2270 PRINT "You marry the princess." 2280 GOTO 1510 2290 RETURN 2300 PRINT "Too bad, you are too poor to marry the princess." 2310 PRINT "You live the rest of your life in quiet poverty." 2320 GOTO 1510 2330 PRINT "You are out of the Forest." 2340 PRINT 2350 PRINT "You let the Princess be taken alive by SATYRS." 2360 PRINT "You are justifiably tortured to death." 2370 GOTO 151TARVE TO DEATH." 1870 GOTO 1510 1880 IF P3=1 THEN 1850 1890 PRINT "YOU ARE CAPTURED BY GOBLINS." 1900 IF E1 <> 1 THEN 1990 1910 PRINT "THEY WANT YOUR SWORD." 1920 INPUT "Will you trade it for freedom";A$ 1930 IF LEFT$(A$,1)="N" THEN 1990 1940 PRINT "AGREED..." 1950 E1=-.8 1960 IF P3<>1 THEN 1830 1970 PRINT " THEY THROW YOU BACK IN THE PIT." 1980 GOTO 1830 1990 D9=INT(3*RND(1)+1) 2000 IF G11 THEN 2870 2860 R1=-2 2870 INPUT "Will you allow this";A$ 2880 IF LEFT$(A$,1)="Y" THEN 2910 2890 PRINT "They kill you and take the women." 2900 GOTO 1510 2910 PRINT "The women are taken." 2920 IF RND(1)<.05 THEN 2950 2930 PRINT "They curse you 1470 L1=L1+L0 1480 C3=0 1490 PRINT "You must retrace your path." 1500 GOTO 1010 1510 PRINT 1520 INPUT "Try again";A$ 1530 IF LEFT$(A$,1)="Y" THEN 120 1540 GOTO 4210 1550 PRINT "THE NYMPH IS VERY OFFENDED." 1560 PRINT "SHE CURSES YOU AND GOES." 1570 F1=0 1580 W1=0 1590 C2=C2-1 1600 RETURN 1610 READ D1,S2,D2,D3,X1,V1,F1,C1,C2,D4,F5,E1,F8,G1,I2,P1,P3 1620 RESTORE 1630 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1640 RETURN 1650 PRINT "YOU ARE HURT." 1660 PRINT "You must re0 2380 PRINT "TROLL!" 2390 INPUT "Will you Fight";A$ 2400 IF LEFT$(A$,1)="Y" THEN 2430 2410 GOSUB 2570 2420 RETURN 2430 IF E1=0 THEN 2470 2440 IF RND(1)>.2 THEN 2470 2450 PRINT "The Troll runs." 2460 RETURN 2470 IF RND(1)+.3*E1>.5 THEN 2530 2480 IF RND(1)>.3 THEN 2510 2490 GOSUB 1650 2500 RETURN 2510 PRINT "YOU ARE KILLED." 2520 GOTO 1510 2530 PRINT "THE TROLL IS DEAD." 2540 IF RND(1)+.05*E1>.4 THEN 2560 2550 GOSUB 1650 2560 RETURN 2570 PRINT "RUN!!" 2580 L1=L1+"  ." 2940 C2=-5 2950 IF RND(1)<.3 THEN 2970 2960 RETURN 2970 PRINT "The Satyrs kill you anyway." 2980 GOTO 1510 2990 PRINT "YOU HAVE FALLEN INTO A PIT!" 3000 P3=1 3010 IF RND(1)>.5 THEN 1650 3020 PRINT "You must escape. Will you try to climb out (1) or" 3030 INPUT "yell for help (2) ";X1 3040 P7=0 3050 IF X1=2 THEN 3170 3060 IF RND(1)<.5-P7/10 THEN 3150 3070 PRINT "You fall while trying to climb." 3080 PRINT 3090 IF RND(1)>.2 THEN 3110 3100 GOSUB 1650 3110 P7=P7+1 3120 OTO 3980 3840 X1=1+INT(2.999*RND(1)) 3850 IF X1=2 THEN 3910 3860 IF X1=3 THEN 3950 3870 PRINT "You got his leg." 3880 W2=W2-H2/5 3890 W3=W3-H2/5 3900 GOTO 3980 3910 PRINT "You've slashed his arm." 3920 W3=W3-H2/5 3930 W2=W2-H2/3 3940 GOTO 3980 3950 PRINT "You score to his body." 3960 W2=W2-.1 3970 W3=W3-.25 3980 NEXT I1 3990 IF W2>.1 THEN 4010 4000 W2=.1 4010 IF W3>.05 THEN 3550 4020 PRINT "He's down!!" 4030 PRINT "You've finished him off." 4040 PRINT 4050 RETURN 2570 3470 RETURN 3480 W3=2 3490 H1=1 3500 H2=1 3510 W2=1+.3*RND(1) 3520 H3=2+SGN(E1) 3530 PRINT "It's a large troll!" 3540 PRINT "THE BATTLE BEGINS." 3550 PRINT "You circle for position." 3560 PRINT " " 3570 W3=W3-.05 3580 H1=H1-.05 3590 H2=H2-.05 3600 PRINT "He Attacks!" 3610 X1=1+INT(2.9999*RND(1)) 3620 IF X1=2 THEN 3660 3630 IF X1=3 THEN 3680 3640 PRINT "He takes a wild cut." 3650 GOTO 3690 3660 PRINT "He thrusts at your$JRS ***** Hi there! ***** The purpose of this program is to enable the UN-protecting of Microsoft Basic programs. It is hoped that the users of this program bear in mind that the authors' intent in the distri- bution of UN.COM is that it be used for the recovery of their own progams. Certain unscrupulous souls will undoubtedly try to 'rip off' commercial software if they can reasonably do so, and programs such as this can certainly be used for such ends. In spite oIF P7<5 THEN 3060 3130 PRINT "It's too deep. Yell for help." 3140 GOTO 3170 3150 PRINT "You're out!" 3160 RETURN 3170 FOR I=1 TO 5 3180 PRINT "HELP! " 3190 NEXT I 3200 IF RND(1)<.3 THEN 3170 3210 PRINT "A rope has been lowered." 3220 P3=0 3230 Y1=INT(3*RND(1)+.9999) 3240 IF Y1=1 THEN 2380 3250 IF Y1=2 THEN 1880 3260 PRINT "You are rescued by a woman." 3270 W1=W1+1 3280 RETURN 3290 PRINT "It's the NECROMANCER....." 3300 IF RND(1)>.6 T 4060 PRINT "You're hit!" 4070 H1=H1-.2 4080 H2=H2-.2 4090 IF H1<.05 THEN 4120 4100 PRINT "You stagger away." 4110 GOTO 3550 4120 PRINT "You're down." 4130 PRINT "He closes for the kill." 4140 IF RND(1)>.1+E1/10 THEN 4190 4150 PRINT "You make a lucky thrust!!" 4160 PRINT "He's dead!!!!" 4170 PRINT 4180 RETURN 4190 PRINT "You are killed." 4200 GOTO 1510 4210 RUN "DIR" 4220 END  PRINT "He's dead!!!!" 4170 PRINT 4180 RETURN 4190 PRINT "You are killed." 4200 GOTO 1 body." 3670 GOTO 3690 3680 PRINT "He tries a head cut." 3690 IF RND(1)>.5+.3*H2/W2 THEN 4060 3700 X1=1+INT(2.5*RND(1)) 3710 IF X1=2 THEN 3750 3720 IF X1=3 THEN 3770 3730 PRINT "You stop his blow on your s7ord`and back away." 3740 GOTO 3550 3750 PRINT "You duck under his sword to attack." 3760 GOTO 3780 3770 PRINT "You parry, then attack." 3780 FOR I1=1 TO H3 3790 IF I1=1 THEN 3810 3800 PRINT "You try again..." 3810 IF RND(1)>.3 THEN 3840 3820 PRINT "You missed him!" 3830 Gf the such possible abuses, UN is being released, for the following reasons: 1 - Programs such as this have been on the market for almost one year (as of 06/81) from several sources. Presumably, you honest folk are the last to hear about or obtain such things. Outlaw powerful programs and only the Outlaws... (Ugh, I didn't really say that, did I? Oh well...) 2 - The release of Bascom, version 5.3, appears to signal the end of the nefarious royalty requiremenHEN 2570 3310 IF F1<>1 THEN 3350 3320 PRINT "The Nymph goes mad." 3330 F1=0 3340 W1=W1-1 3350 IF E1=1 THEN 3410 3360 IF W1=0 THEN 3380 3370 PRINT "The women are sent to his undead as playthings." 3380 PRINT "You are transformed into a gelded water buffalo" 3390 PRINT "and driven into a pit. Boy, did you lose!" 3400 GOTO 1510 3410 PRINT "He takes your sword." 3420 E1=-1.5 3430 PRINT "You are cast into a pit." 3440 GOTO 3020 3450 PRINT "UGH! RATS, MILLIONS OF THEM." 3460 GOSUB#  t, as the run time package is now being sold seperately, and doesn't have to be linked with the compiled (read 'protected') programs. ( And for the lowest possible end user cost, don't forget about the reliable and speedy Fortran and BDS C compilers) 3 - It's nice to demonstrate that low cost doesn't imply lower performance. UN.COM has several advantages over the higher priced spreads. A - It works with all versions of MBASIC 5.x tested to date. B - >w> #y-c |f02Es1#{åXr2F NiIu5Њvj$s=k얖xh4XB<QU5OoiBpLHfO5珥~2䆤œPr4ZKA 1Is Br hoO! iQ^~>APp0ӽ=SDzF_)1aH~*B:Tz? r螄 'IVX >AUᵧV,ض>E9JP }qgGtKSUk >,t6gU7j6˱ }__>027:]?‰!!This UN.COM given to CPM/UG July 16, 1981 - b.n. - $!2 *^#V" > !  (w#!+)UN DO' To deactivate UN.COM, type 'UN NO' To UN-protect a program, first get it into memory with the 'LOAD' command, and then type ^U (control-U). The program is now unprotected and may be listed or saved. UN.COM now performs more extensive error checking and works under both CP/M and CDOS. $UN2 JRS 5/1/84  The documentation for UN2.COM can be read by entering TYPE UN2.COM on your system. A very niffty program by Bill Norris for UNprotecting Microsoft Basic programs. It is hoped that users of UN2 will only use it to UNprotect or recover their own programs and not 'rip off' commerical software. UN2 is patched for use with MBASIC 5.21 64K CP/M VERSION (as is currently being distributed with KAYPRO computers) at the expense of some flexibility. May 1, 1984 James R. Shiflett P.O. Box 1236 SOnce invoked, it remains permanently active, until the user deactivates UN, or until the next cold boot. (You don't have to load MBASIC 20 times in order to examine 20 protected programs.) C - Large programs which barely fit in memory can be debugged without the awkwardness of saving the program, and then having to reload both the interpreter and the program. This is possible because UN modifies only the system, and occupies no TPA space. "##" *( *( ~d#{u D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"#:^O?  ! ! ! >#+ww#|4 :]D9*l : l ! &~l !*+%%0j!>3 &>w#" ##" "3 gl"3 3Hs:]Ws*_>Us>Os:71 =27  !  >127x $ $  E± :]Hs*_>Ps>LLs  :]Ns*2T=2: t==j|(*h>2sÇ! &~: !§:!§:(!§::sʸ!!!! p#>!!9.%%%%+ * * s#r!tafford, Texas 77477(Type 'PRINT FRE(I)' to see if several thousand bytes of program space have been lost.) D - The licensing terms are modest. The end user agrees that HE/SHE will make no more than 600 copies for their own personal use, and that no limit is placed on the number of copies distributed elsewhere. E - If because of your systems' peculiarities UN.COM doesn't work, you haven't lost much... And now for the rules of the game... To invoke UN.COM, type '*k*m ! ;+;  ;4D#^#V"m"k~/o>g++!.@l^#V={^'Ÿ  'š 'S_Á#0 )DM)) O ä^*^#V#^))))o" s#r#!^4- /+* T+,T -Ty_xW!M6WT6!^6# ʖ,o>2^r ʖ ʖ ^!XN!~ͤ ʿ÷!_^!^#Vxʹ>-~~>=!~$  20 REM *** DAVID BOHLKE COGGIN, IA 16 JULY 79 *** 30 REM *** PRO TOUR '80 *** 40 DEFINT A-Y:CL$=CHR$(26):DIM GR(80),FA(23,79):D$=CHR$(10)+CHR$(8) 50 POKE &HFFAE,32:PRINT CHR$(27)+"1";CHR$(27)+"5" 'GRAPHICS ON,CURSOR BLANK 55 RANDOMIZE (INP(26)*100+INP(27)):OUT 28,72 60 DEF FNC$(X)=CHR$(27)+CHR$(61)+CHR$(32+INT(X/64))+CHR$(32+X-64*INT(X/64)) 65 DEF FNC1$(Y,X)=CHR$(27)+CHR$(61)+CHR$(32+Y)+CHR$(32+X) 66 DEF FNC2$(X)=CHR$(27)+CHR$(61)+CHR$(32+INT(X/80))+CHR$(32+X-80*INT(X/80)) 70 GOSUB 100 80  445 REM 450 X=0:FOR I=1 TO Z:PRINT FNC$(I*5+264);TP(I):X=X+TP(I) 460 PRINT FNC$(314);X:NEXT 465 REM 470 REM *** PRINT PLAYERS' SCORES ON SCORECARD *** 475 REM 480 FOR I=1 TO PL 490 FOR J=1 TO Z 500 TT(I)=TT(I)+P(I,J):PRINT FNC$(J*5+I*128+264);P(I,J) 510 PRINT FNC$(I*128+314);TT(I) 520 NEXT J 530 NEXT I 540 PRINT FNC$(960);" TO CONTINUE...":LINE INPUT A$:RETURN 545 REM 550 REM *** 550-772 MAIN GAME LOOP *** 555 REM 560 PRINT CL$:GOSUB 790:PRINT CL$:GOSUB 2680 565 REM 570 REM *** LD SUBTRACT A LITTLE WHEN GOING" 240 PRINT "DOWNHILL. TO CONTINUE..."; 250 INPUT A$:RETURN 255 REM 260 REM *** 310-540 DISPLAYS SCORECARD *** 270 REM *** P$(I) CONTAINS THE NAMES OF THE PLAYERS *** 280 REM *** TT(I) TOTAL SCORE FOR EACH PLAYER (ACCUMULATED) *** 290 REM *** Z IS THE NUMBER OF HOLES PLAYED *** 300 REM *** PRINTS SCORECARD LINES, HOLE #, ETC. *** 305 REM 310 PRINT CL$:PRINT "O P E N G O L F" 320 FOR I=1 TO 9:PRINT FNC$(I*5+136);I:NEXT 330 PRINT FNC$(2600 INPUT "HOW MANY PLAYERS (1-4) ";PL:PRINT 810 IF PL<1 OR PL>4 THEN 790 820 FOR I=1 TO PL:PRINT "NAME OF PLAYER #";I;:INPUT P$(I) 830 P$(I)=LEFT$(P$(I),11):NEXT:PRINT 840 RETURN 845 REM 850 REM *** 870-1490 PUTTING SEQUENCE *** 860 REM**** DIRECTION AND DISTANCE ON FAIRWAY SHOTS *** 865 REM 870 PRINT CL$ 875 REM 880 REM *** SETS CONTOUR GREEN *** 885 REM 890 UD=INT(RND*3-1):IF UD=0 THEN 890 900 YS=38:HL=INT(RND*6+7):HT=0 910 FOR X=0 TO 78:YS1=YS-INT(YS/3)*3:IF YS1=0 THEN GR$=CHR$(191)+D$+CHRGOTO 560 85 REM 90 REM *** DIRECTIONS *** 95 REM 100 PRINT CL$:PRINT TAB(19) "P R O T O U R '8 0":PRINT 110 PRINT " THIS IS A SIMULATED GOLF GAME FOR 1-4 PLAYERS, USING A" 120 PRINT "RANDOMLY GENERATED 9 HOLE COURSE. EACH HOLE HAS TWO INPUT" 130 PRINT "CYCLES. EACH PLAYER IN TURN WILL HIT THE BALL FROM THE TEE" 140 PRINT "TO THE GREEN. AFTER ALL PLAYERS HAVE REACHED THE GREEN, EACH" 150 PRINT "GOLFER WILL AGAIN IN TURN PUTT OUT. WHEN EACH HOLE IS COMPLETED," 160 PRINT "A CURRENT SCORECOOP FOR NINE HOLES. TP(Z) IS PAR FOR EACH OF 9 HOLES * 575 REM 580 FOR Z=1 TO 9 590 GOSUB 2210:TP(Z)=P 595 REM 600 REM *** LOOP FOR TEE-TO-GREEN FOR EACH PLAYER *** 610 REM *** M,N IS LOCATION OF BALL *** 620 REM *** PL IS THE NUMBER OF PLAYERS *** 630 REM *** IF B=1 THEN TEE IS AT THE TOP OF THE SCREEN *** 635 REM 640 FOR ZZ=1 TO PL 650 M=1:IF B=1 THEN N=INT(RND*6+6)/2 ELSE N=INT(RND*6+36)/2 655 REM 660 REM *** P(ZZ) RECORDS EACH PLAYER'S SCORE FOR EACH HOLE *** 665 REM 670 S=0:GOSUB 1540 0);"P A R":PRINT FNC$(133);"HOLE #" 340 PRINT FNC$(186);"TOTAL" 350 FOR I=1 TO PL:PRINT FNC$(I*128+256);P$(I):TT(I)=0:NEXT 360 FOR I=1 TO 9:FOR J=1 TO 2*PL+3 STEP 2 370 PRINT FNC$(I*5+J*64+71);CHR$(149):NEXT J,I 380 FOR J=1 TO 2*PL+3 STEP 2 390 PRINT FNC$(J*64+121);CHR$(191):NEXT 400 FOR I=1 TO PL+2:PRINT FNC$(I*128+64);STRING$(63,140) 410 IF I=1 THEN PRINT FNC$(I*128+64);STRING$(63,188) 420 IF I=2 THEN PRINT FNC$(I*128+64);STRING$(63,143) 430 NEXT 435 REM 440 REM *** PRINT PAR FOR EACH HOLE ***$(191) ELSE IF YS1=1 THEN GR$=CHR$(188)+D$+CHR$(191)+D$+CHR$(131) ELSE GR$=CHR$(176)+D$+CHR$(191)+D$+CHR$(143) 920 PRINT FNC1$(INT(YS/3),X);GR$:GR(X)=YS 930 IF X>47 AND X<63 THEN 970 940 IF HT=0 AND X>13 AND X<44 AND INT(RND*12)=1 THEN UD=-UD:HT=1 950 IF INT(RND*HL+1)=HL THEN YS=YS+UD 955 REM 960 REM *** COMPUTES LOCATION OF CUP (FX AND FY) *** 965 REM 970 NEXT:FX=INT(RND*8+53) 980 FY=INT(GR(FX)/3) 995 REM 1000 REM *** SETS FLAG AND POLE *** 1005 REM 1010 FOR J=0 TO FY-1:PRINT FNC1$(J,FX);CARD WILL BE DISPLAYED." 170 PRINT " THE BETTER PLAYERS SHOULD ENTER THEIR NAMES FIRST, SINCE" 180 PRINT "THEY WILL ALWAYS BE SHOOTING FIRST. THIS WILL ENABLE THE" 190 PRINT "OTHER PLAYERS TO GET A BETTER IDEA OF DIRECTION AND DISTANCE." 200 PRINT "IF YOUR FAIRWAY SHOT MISSES THE FAIRWAY OR LANDS IN THE SANDTRAP," 210 PRINT "THERE IS A POSSIBILITY OF AN ERRATIC SECOND SHOT. ALSO," 220 PRINT "WHEN PUTTING ON THE CONTOUR GREENS; BE SURE TO ADD A LITTLE" 230 PRINT "TO DISTANCE WHEN GOING UPHILL, AN680 P(ZZ,Z)=P(ZZ,Z)+S 690 NEXT 695 REM 700 REM *** LOOP FOR EACH PLAYER TO PUTT OUT ON GREEN *** 705 REM 710 FOR ZZ=1 TO PL:S=0:DC=B(ZZ):GOSUB 870 720 P(ZZ,Z)=P(ZZ,Z)+S 730 NEXT 740 GOSUB 300 750 NEXT Z 760 PRINT FNC$(960);"CARE FOR ANOTHER GAME? (Y/N)"; 770 LINE INPUT A$:IF A$="Y" THEN RUN 772 PRINT CHR$(26):POKE &HFFAE,2:PRINT CHR$(27)+"0";CHR$(27)+"4":END 775 REM 780 REM *** INITIALIZATION - INPUTS THE NUMBER OF PLAYERS, NAMES *** 785 REM 790 PRINT CL$:PRINT:PRINT "G O L F":PRINT:PRINT 8%  HR$(191):NEXT 1020 FOR J=1 TO 9:PRINT FNC1$(1,FX+J);CHR$(191):PRINT FNC1$(3,FX+J);CHR$(191): NEXT 1030 PRINT FNC1$(2,FX+8);STRING$(2,191) 1040 PRINT FNC1$(2,FX+2);Z 1045 REM 1050 REM *** CUP LOCATION *** 1055 REM 1060 FY=GR(FX):YS1=FY-INT(FY/3)*3:IF YS1=0 THEN GR$=CHR$(149)+" "+CHR$(170) ELSE IF YS1=1 THEN GR$=CHR$(148)+" "+CHR$(168)+D$+STRING$(2,8)+CHR$(189)+ CHR$(188)+CHR$(190) ELSE GR$=CHR$(144)+" "+CHR$(160)+D$+STRING$(2,8)+CHR$(181) +CHR$(176)+CHR$(186) 1061 PRINT FNC1$(INT(FY/3),FX-1); PRINT FNC1$(INT(GR(B)/3)-1,B);B1$:GOTO 1085 1490 RETURN 1495 REM 1500 REM *** 1540-1880 MOVE SHOTS FROM TEE TO GREEN *** 1510 REM *** M,N IS THE LOCATION OF THE BALL *** 1520 REM *** S IS THE NUMBER OF STROKES *** 1530 REM *** MOVE BALL DOWN FAIRWAY *** 1535 REM 1540 GOSUB 1930 1550 X=0:M1=M:N1=N:S=S+1 1560 ST=0:IF FA(N-1,M)=0 OR FA(N+1,M)=0 THEN ST=INT(RND*4+1) 1580 GOSUB 2730 1585 REM 1590 REM *** LOOP TO MOVE BALL *** 1595 REM 1600 IF R=0 OR C=0 THEN MM=R:NN=C:GOTO 1630 1610 IF INT(RND*R255 REM 1260 IF C=0 THEN B1$=" " ELSE IF C=1 THEN B1$=" "+D$+CHR$(188) ELSE B1$=CHR$(10)+CHR$(176) 1261 PRINT FNC1$(INT(GR(B)/3)-1,B);B1$ 1280 IF B>50 AND B<69 THEN 1390 1290 IF MM=-1 THEN 1350 1300 IF GR(B+1)GR(B) THEN PP=PP+INT(RND*3+1) 1340 GOTO 1390 1350 IF GR(B-1)GR(B) THEN PP=PP+INT(RND*3+1) 1390 B=B+MM:IF B>78 THEN B=78 ELSE IF B<2 THEN B=2 1400 PM=PM+1:C=GR(B)-INT(GR(B)/3)*3:IF C=0 THM 1890 REM *** INPUTS PLAYER'S CLUB CHOICE *** 1900 REM *** D IS THE DISTANCE THE BALL WILL TRAVEL *** 1910 REM *** DR IS THE DIRECTION OF THE HIT *** 1920 REM *** GET FAIRWAY SHOT *** 1925 REM 1930 GOSUB 2160:PRINT FNC1$(PA,0);P$(ZZ);" ENTER CLUB CHOICE:":C=0 1940 PRINT FNC1$(PA+1,0);"WOOD (W) OR IRON (I) OR SAND WEDGE (S)" 1950 PRINT FNC1$(N,M-1);" ";CHR$(188);" ":PRINT FNC1$(PA,51);""; 2010 INPUT C$:IF C$="S" THEN D=40+INT(RND*30+1):GOTO 2100 2020 IF C$<>"I" AND C$<>"W" THEN 1930 ELSE GOSUB 216GR$ 1065 REM 1070 REM *** NO PUTT NECESSARY (DC IS DISTANCE TO CUP) *** 1075 REM 1080 IF DC>5 THEN 1110 1085 PRINT FNC1$(21,0);"IT'S IN THE CUP !! ??" 1090 IF YS1=0 THEN GR$=CHR$(188) ELSE IF YS1=1 THEN GR$=CHR$(176)+D$+CHR$(191) ELSE GR$=CHR$(10)+CHR$(191) 1091 PRINT FNC1$(INT(FY/3),FX);GR$:FOR I=1 TO 2000:NEXT:RETURN 1095 REM 1100 REM *** SETS BALL (VARIABLES B,C) *** 1105 REM 1110 B=FX-DC:IF B<1 THEN B=INT(RND*4+1) 1111 C=GR(B)-INT(GR(B)/3)*3:IF C=0 THEN BL$=CHR$(188) ELSE IF C=1 THEN BL+1)=R THEN MM=1 ELSE MM=0 1620 IF INT(RND*C+1)=C THEN NN=1 ELSE NN=0 1630 IF DR>30 THEN MM=-MM 1640 IF DR>20 AND DR<40 THEN NN=-NN 1650 PRINT FNC1$(N,M);" " 1670 PRINT FNC2$(G);G$:PRINT FNC2$(PS);S$ 1680 M=M+MM:N=N-NN 1690 IF MM=0 THEN D=D-14-ST:GOTO 1720 1700 IF NN=0 THEN D=D-8-ST:GOTO 1720 1710 D=D-16-ST 1720 IF M<2 OR M>78 OR N<1 OR N>22 THEN 1840 1730 PRINT FNC1$(N,M);CHR$(188) 1750 IF D>0 THEN 1600 1755 REM 1760 REM *** CHECK IF ON GREEN *** 1765 REM 1770 MG=(G-INT(G/80)*80):NG=INT(G/80EN BL$=CHR$(188) ELSE IF C=1 THEN BL$=CHR$(176)+D$+CHR$(191) ELSE BL$=CHR$(10)+CHR$(191) 1410 PRINT FNC1$(INT(GR(B)/3)-1,B);BL$ 1420 IF MM=-1 AND B<3 THEN 1165 1430 IF MM=1 AND B>75 THEN 1165 1440 IF PM<>PP THEN 1260 1445 REM 1450 REM *** GET ANOTHER PUTT IF NECESSARY, *** 1460 REM *** ELSE RETURN WITH THEN NUMBER OF STROKES (S) *** 1465 REM 1470 IF B=FX OR B=FX-1 OR B=FX+1 THEN 1480 ELSE GOTO 1180 1480 IF C=0 THEN B1$=" " ELSE IF C=1 THEN B1$=" "+D$+CHR$(188) ELSE B1$=CHR$(10)+CHR$(176) 14850 2030 IF C$="I" THEN PRINT FNC1$(PA,0);"WHICH IRON (1-9) ";:INPUT C:GOTO 2050 2040 PRINT FNC1$(PA,0);"WHICH WOOD (1-4) ";:INPUT C 2050 C=INT(C):IF C<1 THEN 1930 2060 IF C$="I" AND C>9 THEN 1930 2070 IF C$="W" AND C>4 THEN 1930 2080 IF C$="I" THEN D=(10-C)*13+80+INT(RND*20+1):GOTO 2100 2090 D=200+(4-C)*10+INT(RND*20+1) 2100 GOSUB 2160 2110 PRINT FNC1$(PA,0);" 10":PRINT FNC1$(PA+1,0);"40 20" 2120 PRINT FNC1$(PA+2,0);" 30" 2130 PRINT FNC1$(PA+1,9);"DIRECTION":PRINT FNC1$(PA,12);" ENTER ";$=CHR$(176)+D$+CHR$(191) ELSE BL$=CHR$(10)+CHR$(191) 1120 PRINT FNC1$(INT(GR(B)/3)-1,B);BL$ 1165 REM 1170 REM *** PUTTING ROUTINE - INPUT LENGTH OF PUTT *** 1175 REM 1180 REM 1190 PRINT FNC1$(21,0);"ENTER LENGTH OF PUTT (GREEN IS 80 FEET WIDE)" 1200 PRINT FNC1$(20,0);P$(ZZ);"'S PUTT . . .";:INPUT PP 1210 IF PP<1 OR PP>70 THEN 1180 1215 REM 1220 REM *** MOVE BALL LEFT OR RIGHT *** 1225 REM 1230 IF B9 OR N-NG>3 THEN 1540 1785 REM 1790 REM *** B(ZZ) IS EACH PLAYER'S DISTANCE TO CUP *** 1795 REM 1800 DC=ABS(M-MG-5)*10+ABS(N-NG-1)*24+INT(RND*2+1):B(ZZ)=DC 1810 FOR IJ=1 TO 3:PRINT FNC1$(PA,0);STRING$(60,32):FOR II=1 TO 300:NEXT 1820 PRINT FNC1$(PA,0);P$(ZZ);" IS ON THE GREEN":FOR II=1 TO 500:NEXT:NEXT 1830 RETURN 1840 PRINT FNC1$(PA,0);"OUT OF BOUNDS - PENALTY STROKE" 1850 PRINT FNC1$(N,M);" " 1870 M=M1:N=N1:FOR II=1 TO 2000:NEXT 1880 S=S+1:GOTO 1540 1885 RE&   2140 INPUT DR:DR=INT(DR):IF DR<10 OR DR>49 THEN 2100 2150 GOSUB 2160:RETURN 2160 FOR I=PA TO PA+2:PRINT FNC1$(I,0);STRING$(63," "):NEXT:RETURN 2165 REM 2170 REM *** SETS FAIRWAY AND GREEN *** 2180 REM *** Y IS THE YARDS TO CUP *** 2190 REM *** P IS THE PAR *** 2200 REM *** CONSTRUCT FAIRWAY *** 2205 REM 2210 Y=260+INT(RND*200+1):P=4 2211 ERASE FA:DIM FA(23,79) 2215 REM 2220 REM *** WHITE SCREEN *** 2225 REM 2230 PRINT CL$;:FOR I=0 TO 22:PRINT STRING$(79,191):NEXT 2255 REM 2260 REM *** PA I** DIRECTION INDICATORS (R AND C) FOR ADJUSTING THE *** 2710 REM *** MOVEMENT OF THE BALL IN THE TEE-TO-GREEN SEQUENCE *** 2715 REM 2720 IF ST>0 THEN DR=DR+INT(RND*5-2):IF DR<0 THEN DR=49 ELSE IF DR>49 THEN DR=1 2730 IF DR=10 OR DR=30 THEN R=0:C=1:RETURN 2740 IF DR=20 OR DR=40 THEN R=1:C=0:RETURN 2750 IF DR<20 THEN DZ=DR-10:GOTO 2790 2760 IF DR<30 THEN DZ=30-DR:GOTO 2790 2770 IF DR<40 THEN DZ=DR-30:GOTO 2790 2780 DZ=50-DR 2790 ON DZ GOTO 2800,2810,2820,2830,2840,2850,2860,2870,2880 2800 R=3:C=1:R0 IF P=3 AND R>25 THEN 2530 ELSE IF P=4 AND R>41 THEN 2530 2490 GOTO 2340 2495 REM 2500 REM *** PICKS LOCATION OF GREEN AND SANDTRAP *** 2510 REM *** G IS THE GREEN PRINT@; G$ IS PRINT STRING$ *** 2520 REM *** PS IS SANDTRAP PRINT@; S$ IS THE PRINT STRING$ *** 2525 REM 2530 G=INT(Y/8)-6:X=R-3 2540 IF G>66 THEN G=G-1:GOTO 2540 2550 FOR J=4 TO 20:IF FA(J,X)=0 THEN 2580 2570 YY=J 2580 NEXT 2590 GG=YY*80+INT(RND*3-1)*80-240:IF GG<80 OR GG>1600 THEN 2590 2595 G=G+GG 2610 IF B=1 THEN PS=G-INT(RND*8+DERIVED FROM: May 1, 1984 CP/M Users Group 1651 Third Avenue New York, N.Y. 10028 MODIFIED BY:James Russell Shiflett P.O. Box 1236 Stafford, Texas 77477 ====> XREFPRN2.COM Version of CP/M U.G. 8.27, modified to produce a cross reference from the output of ASM. Like its predecessor, it goes directly to the CP/M LIST device, with numbered lines, then produces a cross-reference by line number (not address). This does not appear to be based upon CPMUG 36.36, which was another deriviS THE PRINT@ LOCATIONS FOR INPUTS *** 2265 REM 2270 B=INT(RND*2):IF B=1 THEN PA=17 ELSE PA=0 2280 X=INT(RND*6+1):IF X=1 THEN P=3:Y=150+INT(RND*90+1) 2290 IF X=6 THEN P=5:Y=490+INT(RND*100+1) 2300 T=INT(RND*4+4):D=12:R=1:IF B=1 THEN C=2 ELSE C=21 2305 IF B=1 THEN PA2=13 ELSE PA2=7 2310 PRINT FNC1$(PA2,0);"HOLE #";Z:PRINT FNC1$(PA2+1,0);"YARDS";Y:PRINT FNC1$(PA2+2,0);"PAR";P 2320 E=3*P+INT(RND*5+1):F=INT(RND*3+3) 2325 REM 2330 REM *** BLACKS OUT FAIRWAY *** 2335 REM 2340 IF B=0 THEN 2380 2350 FETURN 2810 R=2:C=1:RETURN 2820 R=1:C=1:RETURN 2830 R=1:C=2:RETURN 2840 R=1:C=3:RETURN 2850 R=1:C=4:RETURN 2860 R=1:C=7:RETURN 2870 R=1:C=10:RETURN 2880 R=1:C=15:RETURN 830 R=1:C=2:RETURN 2840 R=1:C=3:RETURN 2850 R=1:C=4:RETURN 2860 R=1:C=7:RET1)+INT(RND*3-1)*80-1 2620 IF B=0 THEN PS=G-INT(RND*8+1)+INT(RND*2+1)*80-1 2630 PRINT FNC2$(G);G$:PRINT FNC2$(PS);S$ 2640 IF B=1 THEN PRINT FNC1$(1,0);"TEE" ELSE PRINT FNC1$(21,0);"TEE" 2650 RETURN 2655 REM 2660 REM *** COMMON ROUTINES *** 2670 REM *** PRINTING STRINGS *** 2675 REM 2680 G$=" G G "+CHR$(10)+STRING$(11,8)+" G + G "+CHR$(10)+ STRING$(11,8)+" G G " 2690 S$=CHR$(184)+CHR$(191)+CHR$(180)+CHR$(10)+STRING$(3,8)+CHR$(139)+ CHR$(191)+CHR$(135):RETURN 2695 REM 2700 REM *tive of 8.27. It will now work with files created for LASM (the Linking version of ASM , well recommended). MODIFICATION NOTE:This program was written using the bad habit of calling directly into the BIOS. In trying to use this on my Kaypro with my EPSON I received a unreadable printout. This has been changed to use standard BDOS calls to allow proper printer operation. Tested on Kaypro 4 with Epson MX-80. ====> UN2.COM Bill Norris' program to unprotect MBASIC version 5.x programs. ThisOR I=C TO C+D/2:FOR II=R TO R+2:PRINT FNC1$(I,II);" ":FA(I,II)=1 2370 NEXT II,I:R=R+3:GOTO 2410 2380 FOR I=C TO C-D/2 STEP -1:FOR II=R TO R+2:PRINT FNC1$(I,II);" ":FA(I,II)=1 2400 NEXT II,I:R=R+3 2410 IF INT(RND*8+1)=1 THEN C=C+INT(RND*3-1):IF C<1 THEN C=1 ELSE IF C>22 THEN C=22 2420 IF INT(RND*4+1)=4 THEN D=D+1 ELSE IF R>63 THEN 2530 2430 IF R18 THEN D=18 2460 IF B=1 AND C>13 THEN C=13 2470 IF B=0 AND C<11 THEN C=11 248'   single .COM file contains its own documen- tation. A bit is available via typing "UN HELP", and even more by doing "TYPE UN.COM". Yes, that's ".COM". He did some clever things. This program looks "very nice" in that you pre-load it into your system, and it "goes somewhere where it doesn't take TPA room". Then, you load MBASIC. Load your BASIC program, and if you type ^U it becomes unprotected. Voila! The author suggests that people use it "...for the recovery of their OWN programs." MODIFIC   x !\ ! " !" !" " " *+" " " !R"H *H A y#jË*H "H ~b7ɷ* " * A ¨#›*  * \ " Ó7* " r  * ^#V!\ '^#V+!\ " ## ^#V+!\ ##<* ##* s#r* " <* ##* }o|g"H * \ *H * s#r*H " >w#l*H " * * \ ʶ * \ * "  }o|g" * " * A >w#w*  " * DM* * \ w# ' : J ! > 2J " \? * :J = " D >2 !K 7 Y|}CROSS REFERENCE:SYMBOL TABLE ERROR $NO SUCH FILE $ STA KKATION NOTE: MicroSoft recompiles their MBASIC when they perform updates. This causes the flag of interest to move around slightly between each mod. UN2 is patched for use with MBASIC 5.21 64K CP/M VERSION. In the not too distant future I will be releasing a version of UN that can automatically find the correct memory location inside MBASIC and unprotect it. Programmers note: for a real exercise in breaking code and learning a unique way to prevent your ASM programs from being DISASSEMBLED, usd 60{_zW#4{_zW#$A[?0:?G~NP@7#^#V2 * w#" * ! ^{ y#k: ! >2 ^{  ʽ ³ ! 4~ ý: <2 #Î! " G:> <2> *? p#"? KV  V 2  V  V L Q Q : <2 <  Q'; Q Q$Q(Q)Q+Q-Q*Q/Q,Q:QmA ACI ADC ADD ADI ANA AND ANI B C CALL CC CM CMA CMC CMP CNC CNZ CP CPE CPI CPO CZ D DAA DAD DB DCR DCX +  Cross-Reference Generator V2.2 $ 1*>2' A ATV5ҥ+L!<Q: ʅG x 2> *H ^#V!\ H! 6 ^# *H ##"H :> =2> * ^#V!\ H"   <!A > w# S!A "? >2> : V5ҝ+ҝ\ڈ: W͍ڔÂyÂ$jV5ҥ+ҥWV'ºV'ʺWV Wb* #" QVme DDT or SID and trace UN.COM or UN2.COM while it is running. It will test your ability, UN can detect the presence of DDT or SID and will try to defeat it. My praises to Bill Norris for this one, it took me three weekends to break into it. JRS steDI DS DW E EI END ENDIF ENDM EQU H HLT IF IN INR INX JC JM JMP JNC JNZ JP JPE JPO JZ L LDA LDAX LHLD LXI M MACRO MOD MOV MVI NOP NOT OR ORA ORG ORI OUT PCHL POP PSW PUSH RAL RAR RC RET RLC RM RNC RNZ RP RPE RPO RRC RST RZ SBB SBI SET SHL SHLD SHR SP SPHL STA STAX STC SUB SUI TITLE XCHG XOR XRA XRI XTHL 7* * \  ~a{_#"