[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Torpedo Fire by SSI



On Aug 4, 3:41 am, "Michael J. Mahon" <mjma...@aol.com> wrote:
>
> 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...

I have no experience in cracking software as I never had to
crack my own programs so your descriptions came quite handy! ;-)

If one tries to load a scenario and confirm by pressing ENTER
the program lists all files on that disk. The game disk itself
contains 10 Applesoft programs on 325 sectors, 70 sectors in
what I think binary files for machine language subroutines for
graphics & ampersand extensions and finally several sectors
in data files.

So the P2 program is only a fraction of the whole affair
and not all Applesoft programs can be saved that easily as
they have the normal (?) starting addresses ($0801) when no
graphics mode is utilized (the Shipyard program P1A for example)
or they can't be broken into that easily.

Additionally the machine language extensions are nothing to
sneeze at - definitely more than a fun afternoon but if somebody
wants to enhance the program it could be a good start.

bye
Marcus

PS: Program P1 - the main menu selection and stuff:

 1  REM PROG = P1
 4  LOMEM: 38400
 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:TXTGEN% =
768
 50 I =  FRE (0)
 52 PI = 355 / 113
 60  &  RECALL "HT": CALL 3072
 150  FOR I = 16386 TO 16406
 152  READ J
 154  POKE I,J
 156  NEXT
 158  DATA 173,48,192,136,208,5
 160  DATA 206,1,64,240,9,202,208
 162  DATA 245,174,0,64,76,2,64,96
 163  DATA  210,50,210,50,190,50,170,50,210,50,170,50,190,50
 164  DATA  250,170,185,70,200,20,190,50,150,150,190,200
 165  DATA  210,50,190,50,170,50,150,20,190,50,150,100
 166  FOR X1 = 2450 TO 2487: READ X: POKE X1,X: NEXT
 170  GOTO 180
 175  POKE 16384,XA: POKE 16385,XB: CALL 16386: RETURN
 180  POKE 772,20: PRINT  CHR$ (5): PRINT  CHR$ (3);"9": PRINT  CHR$
(2);"0": PRINT  CHR$ (3);"3": PRINT  CHR$ (12): PRINT  CHR$ (16)
 185  PRINT "   !.#$%&'()*+,-"
 190  PRINT "  0123456789:;<="
 195  PRINT "  @ABCDEFGHIJKLM"
 200  PRINT "  PQRSTUVWXYZ"; CHR$ (91); CHR$ (92);"]"
 202  PRINT "  ";
 205  FOR LM = 96 TO 110
 207  PRINT  CHR$ (LM);
 208  NEXT
 209  PRINT "": PRINT "  ";
 210  FOR LM = 112 TO 126
 212  PRINT  CHR$ (LM);
 214  NEXT
 216  PRINT ""
 220  POKE 772,28: PRINT  CHR$ (18): PRINT  CHR$ (0)
 225  PRINT "   Strategic Simulations Incorporated"
 230  HTAB 17: PRINT "presents"
 232  HTAB 12: PRINT "a game designed by"
 236  HTAB 16: PRINT "John Lyon"
 245  GOSUB 20080
 250  GOSUB 41000
 270  VTAB 16: HTAB 1: PRINT
 272  PRINT " (C) 1981   Strategic Simulations Inc."
 300  PRINT : PRINT "You may:"
 304  PRINT " 1. Play the Introductory scenario ?"
 306  PRINT " 2. Re-start a game you've saved ?"
 308  PRINT " 3. Create a new scenario (Shipyard) ?"
 309  PRINT " 4. Play a scenario you've created ?"
 310  PRINT " 5. Read last minute ERRATA ?"
 312  PRINT "Which ?";: GOSUB 25000
 313  IF AA$ = "5" THEN  GOSUB 60000: GOTO 250
 314  IF AA$ = "1" THEN AA$ = "INTRO-GAME": GOTO 11100
 316  IF AA$ = "2" THEN 380
 318  IF AA$ = "3" THEN 330
 319  IF AA$ = "4" THEN 11000
 320  PRINT : PRINT : PRINT "Come on you TURKEY, enter a number from 1
to 5"
 322  GOSUB 20000
 324  GOTO 250
 330  PRINT : PR# 0: IN# 0: REM RUN SCENARIO MAKER
 332  TEXT : HOME :I =  FRE (0)
 334  HTAB 9: VTAB 12: INVERSE : PRINT " LOADING SCENARIO MAKER ":
NORMAL
 335  GOTO 12000
 336  STOP
 380  REM
 382  PRINT : PRINT : PRINT "Please remove the GAME disc and insert
the disc with the game SAVEd on it."
 390  PRINT : PRINT "Hit 'RETURN' when ready-";: GOSUB 25000
 392  PRINT : PRINT : & C AT
 400  PRINT : PRINT : PRINT "Enter NAME file saved under-": PRINT :
GOSUB 25000
 410 F0% = 1
 500  PRINT : &  READ AA$
 512  INPUT SA: INPUT SB: INPUT SC: INPUT SD: INPUT SE: INPUT SF:
INPUT SG
 514  INPUT SH: INPUT SI: INPUT SJ: INPUT SK: INPUT SL: INPUT SM:
INPUT SN: INPUT SO
 516  INPUT SP: INPUT SQ: INPUT SR: INPUT SS: INPUT ST: INPUT SU:
INPUT SV: INPUT SW
 518  INPUT SX: INPUT SY: INPUT SZ: INPUT SA%: INPUT SB%: INPUT SC%:
INPUT SD%: INPUT SE%: INPUT SF%: INPUT S9
 520  INPUT UT: INPUT QP%: INPUT VU%: INPUT VS%
 522  INPUT NE%: INPUT NT%: INPUT NF%: INPUT NS%
 524  GOSUB 30000: REM PARAMETERS
 530  FOR I = 0 TO UT: INPUT U$(I): NEXT
 532  FOR I = 0 TO UT: INPUT UX(I): NEXT
 534  FOR I = 0 TO UT: INPUT UY(I): NEXT
 540  FOR I = 0 TO 20: INPUT WX(I): NEXT
 542  FOR I = 0 TO 20: INPUT WY(I): NEXT
 544  FOR I = 0 TO 20: INPUT WZ(I): NEXT
 546  FOR I = 0 TO 20: INPUT WT%(I): NEXT
 550 J = CO%
 560  FOR I = 0 TO J: INPUT MO$(I): NEXT
 562  FOR I = 0 TO J: INPUT FO$(I): NEXT
 570  INPUT WI%: INPUT TI%
 580  FOR I = 0 TO 19: INPUT TX(I): NEXT
 582  FOR I = 0 TO 19: INPUT TY(I): NEXT
 584  FOR I = 0 TO 19: INPUT TZ%(I): NEXT
 588  INPUT TA$: INPUT QS%: INPUT TD$
 590 J = NS%: FOR I = 0 TO J: INPUT TB$(I): NEXT
 592  FOR I = 0 TO J: INPUT TS$(I): NEXT
 600  INPUT PS$: INPUT PU$: INPUT CT%: INPUT QB%
 700  &  END
 710  IF AA$ = "Game Data" THEN QP% = 0
 720  IF F0% = 0 THEN 1310
 722 F0% = 0
 730  PRINT : PRINT "Please insert the GAME disc"
 740  PRINT : PRINT "Hit RETURN when ready ";: GOSUB 25000
 750  FOR U = 0 TO UT
 760 XN(U) = UX(U):YN(U) = UY(U):U$ = U$(U)
 770 UN$ =  LEFT$ (U$,1) +  MID$ (U$,SI,2) +  MID$ (U$,SN,3)
 780  IF U < US% THEN 800
 790  IF  MID$ (U$,SM,3) <  > "000" THEN UN$ =  LEFT$ (U$,1) +  MID$ (U
$,SK,2) +  MID$ (U$,SN,3)
 800 UN$(U) = UN$
 810  NEXT
 820  PRINT : PR# 0: IN# 0
 830  TEXT : HOME :I =  FRE (0): IF QS% <  > 69 THEN 900
 840  VTAB 12: HTAB 12: INVERSE : PRINT " LOADING 'ACE' ": NORMAL
 850  &  GOTO "SOL"
 900  VTAB 12: HTAB 10: INVERSE : PRINT " LOADING ORDERS PHASE "
 910  HTAB 13: PRINT " SUBMARINE SIDE ": NORMAL
 920  &  GOTO "P3"
 1310  PRINT : PRINT : PRINT "Do you wish to play against a (H)uman or
against the (C)omputer  ": GOSUB 25000
 1312  GOSUB 31340
 1320  IF AA$ = "H" THEN 1350
 1330  IF AA$ = "C" THEN QS% = 69: GOSUB 40000: GOTO 1350
 1332  PRINT : PRINT "Please enter a 'C' or an 'H'": GOSUB 20180: GOTO
1310
 1350  PRINT : PRINT "Do you wish to play a (D)ay or a (N)ight
scenario ";: GOSUB 25000
 1360  IF AA$ = "D" OR AA$ = "N" THEN TD$ = AA$: GOTO 1372
 1370  PRINT : PRINT "Only 'D N' allowed": GOSUB 20180: GOTO 1350
 1372  PRINT : PRINT "Do you wish the 'BEGINNER'S OPTION' (See ERRATA)
": PRINT "Enter Y if Yes ";: GOSUB 25000: IF AA$ = "Y" THEN QB% = 69
 1380  IF QS% <  > 69 THEN  GOSUB 42000
 10200  PRINT : PR# 0: IN# 0
 10210  GOSUB 17000
 10500  TEXT : HOME :I =  FRE (0)
 10510  HTAB 5: VTAB 12: INVERSE : PRINT " LOADING INITIAL SEARCH
PHASE ": NORMAL
 10600  &  GOTO "P5"
 11000 : REM READ & SET-UP SCENARIO ***************
 11010  PRINT : PRINT "Please remove game disc and insert the   disc
with the new scenario."
 11020  PRINT : PRINT "Hit 'RETURN' when ready. ";: GOSUB 25000
 11022  PRINT : & C AT
 11030  PRINT : PRINT "Enter the NAME of this scenario. ": GOSUB 25000
 11100  PRINT : &  READ AA$
 11112  INPUT SA: INPUT SB: INPUT SC: INPUT SD: INPUT SE: INPUT SF:
INPUT SG
 11114  INPUT SH: INPUT SI: INPUT SJ: INPUT SK: INPUT SL: INPUT SM:
INPUT SN: INPUT SO
 11116  INPUT SP: INPUT SQ: INPUT SR: INPUT SS: INPUT ST: INPUT SU:
INPUT SV: INPUT SW
 11118  INPUT SX: INPUT SY: INPUT SZ: INPUT SA%: INPUT SB%: INPUT SC%:
INPUT SD%: INPUT SE%: INPUT SF%: INPUT S9
 11120  INPUT UT: INPUT NE%: INPUT NT%: INPUT NF%: INPUT NS%
 11130  GOSUB 30000: REM DIM'S & PARAMETERS
 11140  FOR I = 0 TO UT: INPUT U$(I): NEXT
 11150  FOR I = 0 TO UT: INPUT UX(I): NEXT
 11160  FOR I = 0 TO UT: INPUT UY(I): NEXT
 11170  INPUT TF$
 11200  &  END
 11202  IF AA$ = "INTRO-GAME" THEN 1310
 11210  PRINT : PRINT "Please insert the game disc."
 11220  PRINT : PRINT "Hit 'RETURN' when ready. ";: GOSUB 25000
 11300  GOTO 1310
 12000  REM POKE THE SHIT OUT OF THIS THING *************
 12050  POKE 2048,0: &  RUN "P1A",2049
 17000  REM  GARBAGE **
 17030  PRINT : PR# 0: IN# 0
 17040  TEXT : HOME
 17070  PRINT : &  RECALL "MODULE.TWO.D"
 17080  CALL RESET%: CALL CRNCH%: CALL CRNCH%
 17999  RETURN
 20000  IF Q9% <  > 0 THEN  RETURN
 20002  FOR LM = 1 TO 2: FOR X1 = 1 TO 50: NEXT
 20004  FOR X2 = 1 TO 6:XA =  PEEK ((X2 - 1) * 2 + 2114):XB =  PEEK
((X2 - 1) * 2 + 2115): GOSUB 175: NEXT
 20006  NEXT
 20010  RETURN
 20040  IF Q9% <  > 0 THEN  RETURN
 20042  FOR LM = 1 TO 2: FOR X1 = 1 TO 50: NEXT
 20044  FOR X2 = 1 TO 7:XA =  PEEK ((X2 - 1) * 2 + 2100):XB =  PEEK
((X2 - 1) * 2 + 2101): GOSUB 175: NEXT
 20046  NEXT
 20050  RETURN
 20080  IF Q9% <  > 0 THEN  RETURN
 20082  FOR LM = 1 TO 2: FOR X1 = 1 TO 50: NEXT
 20084  FOR X2 = 1 TO 6:XA =  PEEK ((X2 - 1) * 2 + 2476):XB =  PEEK
((X2 - 1) * 2 + 2477): GOSUB 175: NEXT
 20088  NEXT
 20090  RETURN
 20180  IF Q9% <  > 0 THEN 20195
 20181  FOR LM = 1 TO 25
 20182  POKE 16384,200: POKE 16385,6: CALL 16386
 20184  POKE 16384,175: POKE 16385,2: CALL 16386
 20186  NEXT LM
 20190  RETURN
 20195  FOR LM = 0 TO 1000: NEXT
 20197  RETURN
 25000 J = 1:AA$ = "": POKE 16384,27: POKE 16385,5: CALL 16386
 25005 K = 1
 25006 I =  PEEK ( - 16384): IF I > 127 THEN 25017
 25007  INVERSE : PRINT " "; CHR$ (8);: NORMAL
 25008 K = K + 1: IF K < 10 THEN 25006
 25010 K = 1
 25013 I =  PEEK ( - 16384): IF I > 127 THEN 25017
 25014  PRINT " "; CHR$ (8);
 25015 K = K + 1: IF K < 5 THEN 25013
 25016  GOTO 25005
 25017  POKE  - 16368,0:I = I - 128:C$ =  CHR$ (I)
 25018  IF C$ =  CHR$ (13) THEN 25035
 25019  PRINT C$;
 25020  IF C$ =  CHR$ (8) THEN 25040
 25025 AA$ = AA$ + C$: IF J > 20 THEN 25000
 25030 J = J + 1: GOTO 25005
 25035  PRINT " ";: RETURN
 25040 J = J - 1: IF J < 2 THEN 25000
 25045  NORMAL : PRINT "  "; CHR$ (8);:AA$ =  LEFT$ (AA$,J - 1): HTAB
( POS (0)): GOTO 25005
 30000  REM SHIP TABLES *****************
 30020  DIM U$(UT),UX(UT),UY(UT),XN(UT),YN(UT)
 30500  REM NE% = # OF ESCORTS
 30502 UE% = 0: REM U$ IDX TO 1ST ESCORT
 30510  REM NT% = # OF TANKERS
 30512 UT% = NE%: REM  U$ IDX TO 1ST TANKER
 30520  REM NF% = # OF FREIGHTERS
 30522 UF% = UT% + NT%
 30530  REM NS% = # OF SUBS
 30532 US% = UF% + NF%
 30600  DIM MO$(NE% + NS%),FO$(NE% + NS%),FS$(NE% + NS%): REM MOVE &
FIRE ORDERS
 30602  DIM TU%(NE% + NS%): REM TIME USED FOR EACH ORDER
 30610 CO% = NE% + NS%: REM IDX TO O$ FOR CONVOY
 31200  REM DEPTH CHARGE DATA
 31210  DIM WX(20),WY(20),WZ(20),WT%(20)
 31300  REM TORPEDO DATA ********************
 31310  DIM TX(20),TY(20),TZ%(20)
 31320 TA$ = "0000000000000000000000": REM  TIMES FOR 19 TORPEDOES
 31330  DIM TB$(NS%),TS$(NS%)
 31331  GOTO 32000
 31340 A = NS% - 1
 31350  FOR I = 0 TO A
 31360 J = I + US%:B =  VAL ( MID$ (U$(J),SD%,1)):S =  VAL ( MID$ (U$
(J),SE%,1))
 31370 A$ = "X         X":TB$(I) = A$:TS$(I) = A$
 31380 K = B: GOSUB 31800:TB$(I) = A$:K = S:A$ = TS$(I): GOSUB 31800:TS
$(I) = A$
 31390  NEXT
 31400  RETURN
 31800 J = 1: IF K = 0 THEN  RETURN : REM  K=# OF TUBES TO LOAD
 31810 A$ =  LEFT$ (A$,J) + "L" +  RIGHT$ (A$,10 - J)
 31820 J = J + 1: IF J <  = K THEN 31810
 31830  RETURN
 32000  REM UN$ STRING ************
 32010  REM 1=GRAPHICS ID
 32020  REM 2-3=CURRENT SPEED
 32030  REM 4-6=CURRENT DIRECTION
 32100  DIM UN$(UT)
 39999  RETURN
 40000 UU = US% - 1:X = 0:Y = 0:Y0 = 0: REM SOL SET-UP **
 40010  FOR U = 0 TO UU
 40012  IF UX(U) = 69000 THEN 40050
 40020  IF UX(U) > X THEN X = UX(U)
 40030  IF UY(U) > Y THEN Y = UY(U)
 40040  IF UY(U) < Y0 THEN Y0 = UY(U)
 40050  NEXT
 40100 UU = US%
 40110  FOR U = UU TO UT
 40112 U$(U) =  LEFT$ (U$(U),SN - 1) + "270" +  RIGHT$ (U$(U),S9 - SN
- 2)
 40120 D = 1000 *  RND (1):UX(U) = X + 2000 + D
 40130 Y1 = Y + 1000 + 500 *  RND (1): IF  RND (1) > .5 THEN Y1 = Y0 -
1000 - 500 *  RND (1)
 40140 UY(U) = Y1 *  RND (1)
 40150  NEXT
 40200  RETURN
 41000  FOR I = 0 TO 2000: NEXT : VTAB 10
 41010  PRINT  CHR$ (3);"0": PRINT  CHR$ (2);"0"
 41020  PRINT  CHR$ (12): VTAB 4
 41030  PRINT  CHR$ (5): PRINT  CHR$ (3);"2"
 41032  FOR I = 0 TO 3: PRINT  CHR$ (9);: NEXT
 41040  PRINT "TORPEDO FIRE"
 41090  PRINT  CHR$ (18): PRINT  CHR$ (3);"9"
 41100  RETURN
 42000  PRINT  CHR$ (12)
 42010  PRINT "Surface side turn away": PRINT
 42020  PRINT "Sub side enter 2 letter PASSWORD ";: GOSUB 25000:A =
LEN (AA$): IF A <  > 2 THEN 42000
 42030 PU$ = AA$: PRINT  CHR$ (12)
 42040  PRINT "Sub side turn away"
 42050  PRINT : PRINT "Surface side enter 2 letter PASSWORD ";: GOSUB
25000:A =  LEN (AA$): IF A <  > 2 THEN  PRINT  CHR$ (12): GOTO 42040
 42060 PS$ = AA$: RETURN
 60000  PRINT  CHR$ (12)
 60010  PRINT "* BEGINEER'S OPTION - If an underwater    weapon (DC,AT
or K-Gun) detonates       within 250 yards of a sub then:"
 60020  PRINT "  1. Damage is caused if the X,Y             distance
is less than 75 yards and      the depth differential is less than
75 feet."
 60030  PRINT "  2. The X,Y distance is displayed           during the
COMPUTER ACTIVITY PHASE."
 60040  PRINT "* 6.21 Ahead-Throw weapons sink at a      rate of 10
feet per second. If a sub's";
 60050  PRINT "  X,Y is within 50 yards and the depth   differential
is within 50 feet then the charge detonates. It will automatically
detonate when 1000 feet underwater."
 60090  VTAB 24: HTAB 1: PRINT "Hit RETURN to continue. ";: GOSUB
25000: RETURN