[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Torpedo Fire by SSI
winston19842005 wrote:
On 8/3/08 4:58 AM, in article s9WdnUJp1vKG7gjVnZ2dnUVZ_h3inZ2d@comcast.com,
"Michael J. Mahon" <mjmahon@aol.com> wrote:
Fair enough--a ShrinkIt archive of the Applesoft program in memory--
apparently called P2--is in your mailbox. ;-)
Would you mind sharing that listing? Just curiosity at present...
No problem--in fact, here's the text file:
1 REM PROG = P2
4 I = FRE (0):BL$ = " "
5 IF F0 = 1 THEN POKE - 16301,0:F0 = 0: GOTO 10000
6 IF QP% < > 0 THEN 30
10 DIM
CODE%(15),X%(15),Y%(15),SCALE%(15),XROT%(15),YROT%(15),ZROT%(15),SX%(15),SY%(15)
20 RESET% = 7932:CLR% = 7951:HIRES% = 7983:CRNCH% = 7737
30 & RECALL "MODULE.TWO.D"
50 CALL RESET%
69 PI = 3.14159
70 GOTO 92
71 UU = NE% - 1: REM RESET FSG FLAG **
72 FOR U = 0 TO UU
74 U$(U) = LEFT$ (U$(U),SJ - 1) + "N" + RIGHT$ (U$(U),S9 - SJ)
76 NEXT
78 RETURN
92 BL$ = " "
100 IF QP% < > 0 THEN TEXT : GOTO 9000
680 TEXT : HOME : PRINT "READING DATA"
700 A$ = "INTRO-GAME"
710 & READ A$
730 INPUT SA: INPUT SB: INPUT SC: INPUT SD: INPUT SE: INPUT SF: INPUT SG
740 INPUT SH: INPUT SI: INPUT SJ: INPUT SK: INPUT SL: INPUT SM: INPUT
SN: INPUT SO
750 INPUT SP: INPUT SQ: INPUT SR: INPUT SS: INPUT ST: INPUT SU: INPUT
SV: INPUT SW
760 INPUT SX: INPUT SY: INPUT SZ: INPUT SA%: INPUT SB%: INPUT SC%:
INPUT SD%: INPUT SE%: INPUT SF%: INPUT S9
770 INPUT UT: INPUT NE%: INPUT NT%: INPUT NF%: INPUT NS%
780 FOR I = 0 TO UT: INPUT U$(I): NEXT
790 FOR I = 0 TO UT: INPUT UX(I): NEXT
800 FOR I = 0 TO UT: INPUT UY(I): NEXT
810 INPUT B$
890 & END
900 UE% = 0:UT% = 2:UF% = 3:US% = 5:CO% = NE% + NS%
910 FOR I = 0 TO UT
920 U$ = U$(I):U$ = LEFT$ (U$,SQ - 1) + "D" + RIGHT$ (U$,S9 -
SQ):U$(I) = U$
922 A = LEN (U$): IF A < > S9 THEN STOP
930 NEXT
940 U$(5) = LEFT$ (U$(5),SQ - 1) + "S" + RIGHT$ (U$(5),S9 - SQ)
960 GOSUB 71
999 GOTO 9000
1000 TEXT : HOME : PRINT "X = ";: INPUT A$: IF A$ = "" THEN 1050: REM
MAP **
1002 IF A$ = "Q" THEN RETURN
1010 AX = VAL (A$): PRINT "Y = ";: INPUT A$:AY = VAL (A$): IF A$ =
"Q" THEN 1000
1020 IF AX < - 20000 OR AX > 20000 OR AY < - 20000 OR AY > 20000
THEN 1040
1030 GOTO 1050
1040 PRINT "X & Y MUST BE FROM -20000 TO 20000": GOSUB 52000: GOTO 1000
1050 PRINT "SCALE = ";: INPUT A$: IF A$ = "Q" THEN 1000
1060 IF A$ = "A" THEN AS = 100:AC = 0: GOTO 1110
1070 IF A$ = "B" THEN AS = 50:AC = 2: GOTO 1110
1080 IF A$ = "C" THEN AS = 25:AC = 2: GOTO 1110
1090 IF A$ = "D" THEN AS = 10:AC = 2: GOTO 1110
1092 IF A$ = "E" THEN AS = 5:AC = 3: GOTO 1110
1094 IF A$ = "F" THEN AS = 10:AC = 6: GOTO 1110
1100 PRINT "SCALES ARE 'A B C D E F'": GOSUB 52000: GOTO 1050
1110 CX = AX / AS:CY = AY / AS
1112 PRINT "(O)RIGINAL OR (N)EW POSITIONS";: INPUT B$: IF B$ = "Q"
THEN 1000
1114 IF B$ = "O" OR B$ = "N" THEN 1120
1116 PRINT "ONLY 'O N' ALLOWED": GOSUB 52000: GOTO 1112
1120 FM% = 1: CALL CLR%: HGR : HCOLOR= 2: HPLOT 0,0 TO 0,0: CALL
62454: HCOLOR= 3: HPLOT 10,11 TO 261,11 TO 261,159 TO 11,159 TO 11,11
1126 HCOLOR= 0: FOR I = 10 TO 170 STEP 20: HPLOT 12,I TO 260,I: NEXT
1128 FOR I = 16 TO 260 STEP 20: HPLOT I,10 TO I,170: NEXT
1130 HPLOT 131,85 TO 141,95: HPLOT 141,85 TO 131,95
1140 FOR I = 160 TO 191: HPLOT 0,I TO 279,I: NEXT
1142 POKE 512,216: POKE 513,160: POKE 514,0: POKE 515,76: POKE
516,44: POKE 517,254: POKE 60,0: POKE 61,32: POKE 62,255: POKE 63,63:
POKE 66,0: POKE 67,64: CALL 512
1144 POKE - 16302,0
1150 CALL CRNCH%: CALL CRNCH%
1152 GOSUB 2000
1160 FOR U = 0 TO UT
1170 X0 = UX(U):Y0 = UY(U):Z = VAL ( MID$ (U$(U),SN,3)): IF B$ = "O"
THEN 1180
1174 X0 = XN(U):Y0 = YN(U):Z = VAL ( MID$ (UN$(U),4,3))
1180 GOSUB 8000
1190 NEXT
1192 IF LEFT$ (FU$,1) = "S" THEN X0 = FX%:Y0 = FY%:Z = FZ%:S = 3:
GOSUB 8010
1200 POKE - 16301,0: RETURN
1252 VTAB 24: PRINT : PRINT "ENTER 'V' FOR VICTORY POINTS ";: INPUT
A$: IF A$ < > "V" THEN RETURN
2000 AB = TI% - 1: IF TI% = 0 THEN RETURN : REM DISPLAY TORPS
2010 FOR I = 0 TO AB
2020 X = TX(I) / AS:X = X + 136 - CX: IF X < 10 OR X > 245 THEN 2050
2030 Y = TY(I) / AS:Y = 90 - Y + CY: IF Y < 11 OR Y > 170 THEN 2050
2040 HCOLOR= 5: HPLOT X + 3,Y TO X - 3,Y: HPLOT X,Y TO X,Y + 5
2042 HPLOT X + 3,Y + 1 TO X - 3,Y + 1: HPLOT X + 1,Y TO X + 1,Y + 5
2050 NEXT
2060 RETURN
8000 S = VAL ( LEFT$ (U$(U),1)): IF MID$ (U$(U),SQ,1) = "X" AND U >
= US% THEN RETURN
8010 X = X0 / AS:X = X + 136 - CX: IF X < 10 OR X > 245 THEN 8080
8030 Y = Y0 / AS:Y = 90 - Y + CY: IF Y < 11 OR Y > 170 THEN 8080
8050 X%(S) = X:Y%(S) = Y:CODE%(S) = 1:SCALE%(S) = AC:ZROT%(S) = ABS
((Z / 13.3333) - 28): POKE - 16302,0: CALL CRNCH%: CALL CRNCH%
8080 X%(S) = 0:Y%(S) = 0:CODE%(S) = 0:SCALE%(S) = 0:ZROT%(S) = 0
8090 POKE - 16301,0: RETURN
9000 FOR U = 0 TO UT: REM INIT UN$ **
9010 U$ = U$(U):UN$(U) = LEFT$ (U$,1) + MID$ (U$,SI,2) + MID$ (U$,SN,3)
9011 IF U < US% THEN 9020
9012 IF MID$ (U$,SM,3) < > "000" THEN UN$(U) = LEFT$ (U$,1) +
MID$ (U$,SK,2) + MID$ (U$,SN,3)
9020 XN(U) = UX(U):YN(U) = UY(U)
9030 NEXT
9040 GOSUB 53000
9050 FOR I = 0 TO 9:SX(I) = 0:SY(I) = 0: NEXT :UU = US%
9052 FOR U = UU TO UT
9054 L0 = 200 * ( RND (1) + .5): IF RND (1) > .5 THEN L0 = - L0
9056 J = U - US%:SX(J) = INT ((UX(U) + L0) / 100) * 100:SY(J) = INT
((UY(U) + L0) / 100) * 100
9058 NEXT
9060 J = NE% - 1
9070 FOR I = 0 TO J:U$(I) = LEFT$ (U$(I),SJ - 1) + "N" + RIGHT$
(U$(I),S9 - SJ): NEXT
10000 HOME : VTAB 24:I = FRE (0)
10110 PRINT "(M)AP (S)TATUS (O)RDERS (GA)ME OVER": PRINT "(E)ND THIS
TURN ";: INPUT A$
10150 IF A$ = "S" THEN FM% = 0: GOSUB 12000: GOSUB 12510: VTAB 22:
GOTO 10110
10200 IF A$ = "M" THEN GOSUB 1000: GOTO 10000
10300 IF A$ = "O" THEN GOSUB 20000: GOTO 10000
10400 IF A$ = "E" THEN FM% = 0: GOTO 19000
10410 IF A$ = "GA" THEN 19500
10500 PRINT : PRINT "ONLY 'M S O GA' ARE ALLOWED": GOSUB 52000: GOTO
10000
12000 VTAB 24: PRINT "ENTER SHIP ID FOR STATUS ";: INPUT A$:U = 0: IF
A$ = "Q" THEN RETURN
12130 IF MID$ (U$(U),SB,2) = A$ AND UX(U) < > 69000 THEN 12190
12140 U = U + 1: IF U < US% THEN 12130
12150 PRINT : PRINT "NO SUCH SHIP": GOSUB 52000: GOTO 12000
12190 U$ = U$(U): TEXT
12200 HOME : HTAB 15: INVERSE : PRINT " STATUS REPORT ": NORMAL
12210 VTAB 3: HTAB 1: PRINT "SHIP MAP-POSITION DAMAGE PTS"
12220 VTAB 4: HTAB 2: PRINT "ID";: HTAB 6: PRINT "X";:: HTAB 13:
PRINT "Y";: HTAB 19: PRINT "KN DIR START NOW TURN"
12230 VTAB 5: PRINT " "; MID$ (U$,SB,2);: HTAB 6: PRINT INT
(UX(U));: HTAB 13: PRINT INT (UY(U));: HTAB 19: PRINT MID$ (U$,SI,2);:
HTAB 22: PRINT MID$ (U$,SN,3);
12232 HTAB 29: PRINT MID$ (U$,SU,2);: HTAB 33: PRINT MID$
(U$,SV,2);: HTAB 38: PRINT QP%
12240 PRINT : PRINT "SHIP MAX"
12242 PRINT "CLASS KN"
12244 HTAB 2: PRINT MID$ (U$,SE,2);" "; MID$ (U$,SH,2)
12300 VTAB 10: HTAB 10: INVERSE : PRINT " SUB(S) SPOTTED ": NORMAL
12310 PRINT "X Y DEPTH BY"
12320 UU = US%:J = 0
12330 FOR I = UU TO UT
12332 IF UX(I) = 69000 THEN 12410
12340 IF MID$ (U$(I),SQ,1) = "X" THEN 12410
12342 X = SX(I - US%):Y = SY(I - US%)
12350 PRINT X;: HTAB 10: PRINT Y;
12360 HTAB 20:P = VAL ( MID$ (U$(I),SM,3)): IF P = 0 THEN PRINT
"SURFACE";:J = 1: GOTO 12390
12370 IF P > 30 THEN PRINT "U/W";:J = 1: GOTO 12390
12372 IF MID$ (U$(I),SQ,1) = "S" THEN PRINT "U/W";:J = 1: GOTO 12390
12380 PRINT "PERISCOPE";:J = 1
12390 HTAB 30:C$ = MID$ (U$(I),SQ,1): IF C$ = "D" OR C$ = "N" THEN
PRINT "VISUAL": GOTO 12410
12392 IF C$ = "R" THEN PRINT "RADAR": GOTO 12410
12394 IF C$ = "S" THEN PRINT "SONAR"
12399 IF C$ < > "S" THEN STOP
12410 NEXT
12420 IF LEFT$ (FU$,1) < > "S" THEN 12490
12430 PRINT FX%;: HTAB 10: PRINT FY%;:J = 1
12440 HTAB 20: IF FU$ = "SR" THEN PRINT "SURFACE";: HTAB 30: PRINT
"RADAR"
12450 IF FU$ = "SS" THEN PRINT "U/W";: HTAB 30: PRINT "SONAR"
12490 IF J = 0 THEN PRINT "NO SUBS SPOTTED"
12500 PRINT :: PRINT : IF U < NE% THEN GOSUB 23120: GOTO 12504
12502 AB = U:U = CO%: GOSUB 23120:U = AB
12504 RETURN
12510 IF QS% < > 69 THEN RETURN
12520 PRINT : PRINT "ENTER 'V' FOR VICTORY POINTS ";: INPUT A$: IF A$
< > "V" THEN RETURN
12530 PRINT "SURFACE = ";VS%;" SUB = ";VU%
12540 PRINT : PRINT "HIT 'RETURN' TO CONTINUE ";: INPUT A$: RETURN
12900 FOR I = 20 TO 24: VTAB I: HTAB 1: PRINT BL$;: NEXT
12910 VTAB 21: HTAB 1: RETURN
19000 REM CHAIN **
19010 TEXT : HOME :I = FRE (0)
19100 VTAB 12: HTAB 4: INVERSE : PRINT " LOADING COMPUTER ACTIVITY
PHASE ": NORMAL
19200 & GOTO "P4"
19500 TEXT : HOME
19510 VTAB 12: HTAB 10: INVERSE : PRINT " LOADING FINAL PHASE ": NORMAL
19520 & GOTO "PGA"
20000 HOME : VTAB 24: PRINT "ENTER ID OF SHIP TO BE GIVEN ORDERS ":
PRINT "('Q' = QUIT) ";: INPUT A$: IF A$ = "Q" THEN RETURN
20020 IF A$ = "C" THEN GOTO 20100
20030 U = 0
20040 IF MID$ (U$(U),SB,2) = A$ AND UX(U) < > 69000 THEN U$ =
U$(U): GOTO 21000
20050 U = U + 1: IF U < UT% THEN 20040
20060 PRINT : PRINT "YOU CAN'T GIVE ORDERS TO THAT SHIP!": GOSUB
52000: GOTO 20000
20100 IF QP% < CT% THEN PRINT "NO CONVOY ORDER UNTILL TURN ";CT%:
GOSUB 52000: GOTO 20000
20110 PRINT : PRINT : PRINT : PRINT "MOVE ORDERS =";MO$(CO%): PRINT
"ENTER MOVEMENT ORDER (SEC. 4.1) ";: INPUT A$: IF A$ = "Q" THEN 20000
20122 A = LEN (A$):B$ = LEFT$ (A$,3): IF A < > 5 THEN PRINT :
PRINT "BAD FORMAT": GOSUB 52000: GOTO 20100
20124 MO$(CO%) = ""
20130 IF B$ = "MDP" OR B$ = "MDS" THEN 20400
20140 IF B$ = "MDC" THEN MO$(CO%) = "MDC60": GOTO 20500
20150 IF LEFT$ (A$,2) = "MC" THEN 20300
20160 A$ = A$ + A$: GOTO 20122
20300 C$ = A$:M$ = A$:B$ = "":D$ = "":U$ = U$(UT%):UN$ = LEFT$
(UN$(UT%),3) + MID$ (U$(UT%),SN,3): GOSUB 28000
20310 MO$(CO%) = LEFT$ (M$,5):A = LEN (M$): IF A = 5 THEN 20500
20320 IF MID$ (M$,6,2) = "MX" THEN MO$(CO%) = LEFT$ (M$,10)
20330 GOTO 20500
20400 GOSUB 29000
20410 I = INT (I / 10):B$ = "00" + STR$ (I):MO$(CO%) = LEFT$ (A$,3)
+ RIGHT$ (B$,2)
20500 PRINT : PRINT : PRINT : PRINT "TO (E)XECUTE CONVOY ORDER ENTER
'E' ";: INPUT A$: IF A$ < > "E" THEN 20000
20540 IF MO$(CO%) = "" THEN MO$(CO%) = "MDC60"
20542 IF MID$ (MO$(CO%),3,1) = "C" THEN NO$ = "MDC10": GOTO 20560
20550 NO$ = LEFT$ (MO$(CO%),3) + "01"
20560 UU = US% - 1:CU = UT%
20562 FOR U = CU TO UU:XN(U) = UX(U):YN(U) = UY(U): NEXT
20570 FOR U = CU TO UU
20580 TL = 60:UN$ = LEFT$ (UN$(U),3) + MID$ (U$(U),SN,3):UN$(U) = UN$
20590 IF MID$ (UN$(U),2,2) < > "00" THEN GOSUB 40000
20600 TL = TL - I: IF TL > 0 THEN 20590
20610 NEXT
20620 GOTO 20000
21000 GOSUB 23000: PRINT "DO YOU WISH TO ENTER A (M)OVE OR (F)IRE
ORDER, (E)XECUTE THESE ORDERS OR (Q)UIT": INPUT A$: IF A$ = "Q" THEN 20000
21030 IF A$ = "M" THEN 21100
21040 IF A$ = "F" THEN 22000
21050 IF A$ = "E" THEN 30000
21070 PRINT "ONLY 'M F E Q' ALLOWED": GOSUB 52000: GOTO 21000
21100 GOSUB 23100: PRINT "(N)EW, (A)DD OR (Q)UIT ";: INPUT A$: IF A$
= "Q" THEN 21000
21140 IF A$ = "N" THEN MO$(U) = "": GOTO 21200
21150 IF A$ = "A" THEN 21200
21160 PRINT "ONLY 'N A Q' ALLOWED": GOSUB 52000: GOTO 21100
21200 GOSUB 23100: PRINT "ENTER MOVEMENT ORDER (SEC. 4.1)";: INPUT
A$: IF A$ = "Q" THEN 21000
21222 I = LEN (A$): IF I < > 5 THEN 21250
21230 IF LEFT$ (A$,3) = "MSS" THEN 21260
21240 IF LEFT$ (A$,2) = "MD" THEN 21400
21242 IF LEFT$ (A$,2) = "MC" THEN 21500
21250 PRINT "BAD FORMAT": GOSUB 52000: GOTO 21200
21260 I = VAL ( RIGHT$ (A$,2)): IF I < 0 THEN PRINT "CAN'T GO
BACKWARDS": GOSUB 52000: GOTO 21200
21270 J = VAL ( MID$ (U$,SH,2)):K = J / 3: IF I < = J THEN 21280
21274 PRINT : PRINT "CAN'T EXCEED MAX SPEED": GOSUB 52000: GOTO 21200
21280 A = LEN (MO$(U)):B = 1:X = 0
21282 IF MID$ (MO$(U),B,3) = "MSS" THEN X = 1
21284 B = B + 5: IF B < = (A) THEN 21282
21286 IF X < > 0 THEN PRINT "ONLY 1 SPEED CHANGE PER TURN": GOSUB
52000: GOTO 21200
21300 J = VAL ( MID$ (U$,SI,2)): IF ABS (J - I) < = K THEN 21320
21310 PRINT "CAN'T CHANGE SPEED THAT MUCH": GOSUB 52000: GOTO 21200
21320 MO$(U) = MO$(U) + A$: GOTO 21100
21400 IF MID$ (A$,3,1) = "C" THEN 21430
21410 IF MID$ (A$,3,1) = "P" OR MID$ (A$,3,1) = "S" THEN 21450
21420 GOTO 21250
21430 I = VAL ( MID$ (A$,4,2)): IF I > 9 AND I < 61 THEN 21320
21440 PRINT "YOU MUST ENTER 10-60 TIME POINTS": GOSUB 52000: GOTO 21200
21450 I = VAL ( MID$ (A$,4,2)): IF I > 0 AND I < 19 THEN 21320
21460 PRINT "RANGE SHOULD BE 01-18": GOSUB 52000: GOTO 21200
21500 A = VAL ( RIGHT$ (A$,3)): IF A > = 0 AND A < 360 THEN 21320
21530 PRINT "COURSE MUST BE 000 TO 359": GOSUB 52000: GOTO 21200
22000 GOSUB 23100: PRINT "(N)EW, (A)DD OR (Q)UIT ";: INPUT A$: IF A$
= "Q" THEN 21000
22030 IF A$ = "N" THEN FO$(U) = "":FS$(U) = "": GOTO 22100
22040 IF A$ = "A" THEN 22100
22050 PRINT "ONLY 'N A Q' ALLOWED": GOSUB 52000: GOTO 22000
22100 GOSUB 23100: PRINT "ENTER FIRE ORDER (SEC. 4.2) ";: INPUT A$:
IF A$ = "Q" THEN 21000
22110 B$ = LEFT$ (A$,3): IF B$ = "FSG" OR B$ = "FSS" THEN 22600
22130 A = LEN (A$): IF A < > 7 THEN 22190
22140 I = VAL ( MID$ (A$,4,1)): IF I < 7 THEN 22160
22150 PRINT "TIME MUST BE 0-6": GOSUB 52000: GOTO 22100
22160 IF B$ = "FDC" THEN 22200
22170 IF B$ = "FKG" THEN 22300
22180 IF B$ = "FAT" THEN 22400
22190 PRINT "BAD FORMAT": GOSUB 52000: GOTO 22100
22200 I = VAL ( RIGHT$ (A$,3)): IF I > 25 THEN 22220
22210 PRINT "ILLEGAL DEPTH SETTING": GOSUB 52000: GOTO 22100
22220 GOTO 22800
22300 I = VAL ( RIGHT$ (A$,3)): IF I > 25 THEN 22800
22310 PRINT "ILLEGAL DEPTH SETTING": GOSUB 52000: GOTO 22100
22400 I = VAL ( RIGHT$ (A$,3)): IF I > 99 AND I < 201 THEN 22800
22410 PRINT "ILLEGAL DISTANCE": GOSUB 52000: GOTO 22100
22600 A = LEN (A$): IF A < > 10 THEN 22190
22610 I = VAL ( MID$ (A$,4,3)): IF I > = 0 AND I < 360 THEN 22630
22620 PRINT "COURSE MUST BE 000 TO 359": GOSUB 52000: GOTO 22100
22630 J = VAL ( RIGHT$ (A$,4)): IF J > 0 THEN 22650
22640 PRINT "DISTANCE MUST BE POSITIVE": GOSUB 52000: GOTO 22100
22650 X = 0:Y = 0:K = NE% + NS%:A = 1:B$ = FS$(U):B = LEN (B$)
22660 IF MID$ (U$,SJ,1) = "Y" THEN X = X + 1
22670 IF MID$ (B$,A,3) = "FSS" THEN Y = Y + 1
22680 A = A + 10: IF A < B THEN 22660
22690 IF LEFT$ (A$,3) = "FSG" AND X > 0 THEN PRINT "ONLY 1 'FSG'
ALLOWED (SEE ERRATA)": GOSUB 52000: GOTO 22100
22700 IF LEFT$ (A$,3) = "FSS" AND Y > 1 THEN PRINT "ONLY 2 'FSS'S
ALLOWED": GOSUB 52000: GOTO 22100
22710 I = VAL ( MID$ (U$,SW,2)): IF I < 1 THEN PRINT "SHIP DOESN'T
HAVE GUNS": GOSUB 52000: GOTO 22100
22712 IF LEFT$ (A$,3) = "FSG" THEN U$ = LEFT$ (U$,SJ - 1) + "Y" +
RIGHT$ (U$,S9 - SJ):U$(U) = U$
22720 FS$(U) = FS$(U) + A$: GOTO 22000
22800 X = 0:Y = 0:Z = 0:F$ = FO$(U) + A$:A = LEN (F$):B = 1: REM
CHECKDC'S VS FDC'S,ETC **
22810 IF MID$ (F$,B,3) = "FDC" THEN X = X + 1
22820 IF MID$ (F$,B,3) = "FKG" THEN Y = Y + 1
22830 IF MID$ (F$,B,3) = "FAT" THEN Z = Z + 1
22840 B = B + 7: IF B < = (A) THEN 22810
22850 I = VAL ( MID$ (U$,SZ,1)): IF X > I THEN 22900
22860 I = VAL ( MID$ (U$,SY,1)): IF Y > I THEN 22900
22870 I = VAL ( MID$ (U$,SA%,1)): IF Z > I THEN 22900
22880 FO$(U) = F$: GOTO 22000
22900 PRINT LEFT$ (A$,3);" LIMIT = ";I: GOSUB 52000: GOTO 22100
23000 GOSUB 12200: GOSUB 12900: REM DATA LINE **
23010 PRINT MID$ (U$,SB,2);" X="; INT (XN(U));" Y="; INT (YN(U));"
KN="; MID$ (UN$(U),2,2);" DIR="; MID$ (UN$(U),4,3)
23020 RETURN
23100 GOSUB 12900: IF U > NE% - 1 THEN RETURN
23110 PRINT MID$ (U$,SB,2);" X="; INT (XN(U));" Y="; INT (YN(U));"
KN="; MID$ (UN$(U),2,2);" DIR="; MID$ (UN$(U),4,3)
23120 PRINT "MOVE ORDERS = ";MO$(U): PRINT "FIRE ORDERS = ";FO$(U):
IF FS$(U) < > "" THEN PRINT " AND = ";FS$(U)
23130 RETURN
28000 IF LEFT$ (M$,2) < > "MC" THEN RETURN : REM MCNNN **
28012 A = LEN (M$): IF A = 5 THEN M$ = "": GOTO 28020
28014 M$ = RIGHT$ (M$,A - 5)
28020 D0 = VAL ( RIGHT$ (UN$,3)):D = VAL ( MID$ (C$,3,3))
28022 GOTO 28500
28030 GOSUB 29000
28090 K = 0:D$ = ""
28100 K = K + 10: IF K > = I THEN 28130
28110 IF K > = J THEN 28200
28120 GOTO 28100
28130 A = INT (K / 10):B$ = "00" + STR$ (A)
28140 D$ = D$ + "MD" + A$ + RIGHT$ (B$,2):K = 0:J = J - I: IF J = 0
THEN 28252
28142 IF J < 10 THEN A = ABS (J): GOTO 28230
28150 GOTO 28100
28200 A = INT (K / 10):B$ = "00" + STR$ (A)
28210 D$ = D$ + "MD" + A$ + RIGHT$ (B$,2)
28220 A = ABS (K - J): IF A = 0 THEN 28252
28230 B$ = "0" + STR$ (A)
28240 A$ = MID$ (D$,3,1)
28250 D$ = D$ + "MXX" + A$ + RIGHT$ (B$,1)
28252 A = LEN (C$): IF A = 5 THEN C$ = "": GOTO 28260
28254 C$ = RIGHT$ (C$,A - 5)
28260 M$ = D$ + M$: RETURN
28500 IF D0 > D THEN A$ = "P"
28510 IF D0 < D THEN A$ = "S"
28520 J = ABS (D0 - D): IF J < 180 THEN 28030
28530 J = D0 + 360 - D: IF J < = 180 THEN A$ = "P": GOTO 28030
28540 J = D + 360 - D0: IF J < 180 THEN A$ = "S": GOTO 28030
28550 STOP
29000 A = VAL ( MID$ (U$,SG,1)): IF A < 1 OR A > 9 THEN STOP
29010 ON A GOTO 29011,29012,29013,29014,29015,29016,29017,29018,29019
29011 I = 6: GOTO 29020
29012 I = 18: GOTO 29020
29013 I = 30: GOTO 29020
29014 I = 60: GOTO 29020
29015 I = 90: GOTO 29020
29016 I = 120: GOTO 29020
29017 I = 180: GOTO 29020
29018 I = 360: GOTO 29020
29019 I = 720
29020 RETURN
30000 IF FM% = 1 THEN 30020
30010 UU = U: GOSUB 1000:U = UU: GOTO 30000
30020 I = FRE (0): VTAB 24: & GOTO "P2E"
34000 D0 = VAL ( RIGHT$ (UN$,3)):D = VAL ( MID$ (M$,5,1)): REM MXXJN **
34012 IF MID$ (M$,4,1) = "P" THEN 34020
34014 D0 = D0 - D:A$ = "000" + STR$ (D0): GOTO 34030
34020 D0 = D0 + D:A$ = "000" + STR$ (D0)
34030 UN$ = LEFT$ (UN$,3) + RIGHT$ (A$,3)
34040 A = LEN (M$):M$ = RIGHT$ (M$,A - 5)
34050 UN$(U) = UN$: RETURN
40000 UN$ = UN$(U):U$ = U$(U): REM EXECUTE MDXTT **
40010 Z = VAL ( MID$ (UN$,4,3)):K0 = VAL ( MID$ (UN$,2,2))
40020 IF MID$ (NO$,3,1) < > "C" THEN 40100
40030 I = VAL ( MID$ (NO$,4,2)): IF I > 10 THEN STOP
40040 GOTO 40200
40100 IF MID$ (NO$,3,1) < > "P" AND MID$ (NO$,3,1) < > "S" THEN
STOP
40110 GOSUB 29000:A = I
40120 J = A / 60:I = 10 / J
40130 Z = Z + 10: IF MID$ (NO$,3,1) = "P" THEN Z = Z - 20
40140 IF Z > 360 THEN Z = Z - 360
40150 IF Z < 0 THEN Z = Z + 360
40200 L0 = K0 * .5555 * I:Z2 = 450 - Z: IF Z2 > = 360 THEN Z2 = Z2 - 360
40210 X0 = XN(U) + L0 * COS (Z2 * PI / 180)
40220 Y0 = YN(U) + L0 * SIN (Z2 * PI / 180)
40230 GOSUB 8000
40300 XN(U) = X0:YN(U) = Y0
40310 A$ = "000" + STR$ (Z)
40330 UN$ = LEFT$ (UN$,3) + RIGHT$ (A$,3)
40340 UN$(U) = UN$: RETURN
52000 INVERSE : FLASH : PRINT : PRINT "ILLEGAL ENTRY"
52010 FOR I = 1 TO 1500: NEXT
52020 NORMAL : RETURN
53000 CALL CLR%: HGR : HCOLOR= 2: HPLOT 0,0 TO 0,0: CALL 62454
53010 FOR I = 0 TO 3:CODE%(I) = 1: NEXT
53012 FOR I = 0 TO 3:SCALE%(I) = 8: NEXT
53020 X%(0) = 90:Y%(0) = 40
53030 X%(1) = 180:Y%(1) = 40
53040 X%(2) = 90:Y%(2) = 110
53050 X%(3) = 180:Y%(3) = 110
53058 J = 7: IF RND (1) > .5 THEN J = 21
53060 FOR I = 0 TO 3:ZROT%(I) = J: NEXT
53100 CALL CRNCH%: CALL CRNCH%
53102 FOR I = 0 TO 3:X%(I) = X%(I) + 1: NEXT : CALL CRNCH%: CALL CRNCH%
53110 POKE - 16301,0
53112 FOR I = 0 TO 3:CODE%(I) = 0: NEXT
53114 IF QS% = 69 THEN RETURN
53120 VTAB 23: HTAB 1: PRINT "ENTER PASSWORD ";: INPUT A$
53130 IF A$ = PS$ THEN RETURN
53140 GOSUB 52000: PRINT : PRINT : PRINT : GOTO 53000
62000 REM
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
62001 REM
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
62002 REM
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
62003 REM
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
...a little lengthy, but smaller than even a small photo. ;-)
(I just hope that auto line-wraps don't make too much of a mess
of it.)
BTW, the "auto-RUN flag" ($D6) was set to $80, which prevents
direct commands from working. I entered the debugger in
AppleWin and set $D6 to zero, then switched to text mode
and found the file LISTable.
I then examined $67.68 to find the starting address of the
Applesoft program ($6001) and $AF.B0 to find the end
address ($904E).
Since this range is comfortably out of the range trampled
by a DOS 3.3 boot, I switched the S6,D1 image to the
DOS Master disk and did a PR#6 to boot it. This loads
a standard, usable DOS in place of SSI's non-standard one.
I then did CALL-151 to enter the monitor and set $67.68
and $AF.B0 to the correct values (above), and SAVEd
the program to a blank disk image in S6,D2.
Show off! ;-D
I was hoping that others might be inspired to play, too. ;-)
Getting past copy protection schemes is not so much black art as
just thinking differently about how to get things done...
-michael
AppleCrate: An Apple II "blade server"!
Home page: http://members.aol.com/MJMahon/
"The wastebasket is our most important design
tool--and it's seriously underused."