[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."