Re: Torpedo Fire by SSI
- From: heuser.marcus@xxxxxxxxxx
- Date: Mon, 4 Aug 2008 12:55:50 -0700 (PDT)
On Aug 4, 3:41 am, "Michael J. Mahon" <mjma...@xxxxxxx> 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 *** 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
.
- Follow-Ups:
- Re: Torpedo Fire by SSI
- From: Michael J. Mahon
- Re: Torpedo Fire by SSI
- References:
- Torpedo Fire by SSI
- From: RetroC64
- Re: Torpedo Fire by SSI
- From: heuser . marcus
- Re: Torpedo Fire by SSI
- From: RetroC64
- Re: Torpedo Fire by SSI
- From: heuser . marcus
- Re: Torpedo Fire by SSI
- From: RetroC64
- Re: Torpedo Fire by SSI
- From: heuser . marcus
- Re: Torpedo Fire by SSI
- From: Michael J. Mahon
- Re: Torpedo Fire by SSI
- From: heuser . marcus
- Re: Torpedo Fire by SSI
- From: Michael J. Mahon
- Re: Torpedo Fire by SSI
- From: winston19842005
- Torpedo Fire by SSI
- Prev by Date: Re: Major reorganization at the Asimov site
- Next by Date: Re: KansasFest 2008 Report - Saturday
- Previous by thread: Re: Torpedo Fire by SSI
- Next by thread: Re: Torpedo Fire by SSI
- Index(es):