00010 *SPACE WAR GAME - BY JEFFREY STANTON 00020 ORG $4000 00030 *ZERO PAGE EQUATES 00F0: 00040 SHPL EQ $F0 00F1: 00050 SHPH EQ $F1 00F2: 00060 SHPML EQ $F2 00F3: 00070 SHPMH EQ $F3 00F4: 00080 SHPMOL EQ $F4 00F5: 00090 SHPMOH EQ $F5 00F6: 00100 SL EQ $F6 00F7: 00110 SH EQ $F7 00120 *PLAYER MISSILE EQUATES D407: 00130 PMBASE EQ $D407 8800: 00140 PDATA EQ $8800 D01D: 00150 GRACTL EQ $D01D 022F: 00160 DMACTL EQ $22F D008: 00170 SIZEPO EQ $D008 D009: 00180 SIZEPI EQ $D009 02C0: 00190 COLPMO EQ $2C0 02C1: 00200 COLPM1 EQ $2CI D000: 00210 HPOSPO EQ $D000 D001: 00226 HPOSP1 EQ $D001 D004: 00230 HPOSMO EQ $D004 D005: 00240 HPOSMI EQ $D005 00C0: 00250 PMADR EQ $C0 D01E: 00260 HITCLR EQ $D01E 00270 *COLLISIONS D008: 00280 M0PL EQ $D008 D009: 00290 MlPL EQ $D009 D00C: 00300 P0PL EQ $D00C 00310 *MISC EQUATES 9400: 00320 NDLIST EQ $9400 ;ADR OF NEW DISPLAY LIST 9000: 00330 SCREEN EQ $9000 02C4: 00340 COLOR0 EQ $2C4 02C6: 00350 COLOR2 EQ $2C6 02C8: 00360 COLOR4 EQ $2C8 E45C: 00370 SETVBK EQ $E45C E462: 00380 XITVBK EQ $E462 0284: 00390 STRIG0 EQ $284 0278: 00400 STICK EQ $278 D20A: 00410 RANDOM EQ $D20A D200: 00420 AUDFI EQ $D200 D201: 00430 AUDCI EQ $D201 D202: 00440 AUDF2 EQ $D202 D203: 00450 AUDC2 EQ $D203 00460 *DATA 4000: 08 08 08 4003: 1C 1C 1C 4006: 3E 3E 22 4009: 22 00 00 00470 SHAPEO HS 080808lClClC3E3E22220000 400C: 00 00 01 400F: 0E 1E 2E 4012: 04 04 08 4015: 00 00 00 00480 HS 0000010E1E2E040408000000 4018: 00 00 00 401B: 70 3C 3F 401E: 3C 70 00 4021: 00 00 00 00490 HS 000000703C3F3C7000000000 4024: 00 00 08 4027: 04 04 2E 402A: 1E 0E 01 402D: 00 00 00 00500 HS 00000804042E1E0E01000000 4030: 00 22 22 4033: 3E 3E 1C 4036: 1C 1C 08 4039: 08 08 00 00510 HS 0022223E3E1C1C1C08080800 403C: 00 00 08 403F: 10 10 3A 4042: 3C 38 40 4045: 00 00 00 00520 HS 00000810103A3C3840000000 4048: 00 00 00 404B: 07 1E 7E 404E: 1E 07 00 4051: 00 00 00 00530 HS 000000071E7E1E0700000000 4054: 00 00 40 4057: 38 3C 3A 405A: 10 10 08 405D: 00 00 00 00540 HS 000040383C3AI01008000000 4060: 00 0C 18 4063: 24 30 3C 4066: 48 54 00550 SHPLO HS 000C1824303C4854 4068: 02 02 01 406B: 02 03 00 406E: 02 01 00560 MSHAPE HS 0202010203000201 4070: 02 02 01 4073: 02 03 00 4076: 02 01 00570 HS 0202010203000201 4078: 08 08 04 407B: 08 0C 00 407E: 08 04 00580 HS 080804080C000804 4080: 08 08 04 4083: 08 0C 00 4086: 08 04 00590 HS 080804080C000804 4088: 68 6A 6C 408B: 6E 70 72 408E: 74 76 00600 MISLO HS, 686A6C6E70727476 4090: 78 7A 7C 4093: 7E 80 82 4096: 84 86 00610 MISL01 HS 787A7C7E80828486 4098: 01 02 03 409B: 04 05 05 409E: 05 04 03 40A1: 02 01 00620 SKFLAG HS 0102030405050504030201 40A3: 70 70 70 40A6: 47 00 90 40A9: 02 02 00630 MIST HS 7070704700900202 40AB: 02 02 02 40AE: 02 02 02 40B1: 02 02 00640 HS 0202020202020202 40B3: 02 02 02 40B6: 02 02 02 40B9: 02 02 00650 HS 0202020202020202 40BB: 02 02 02 40BE: 02 02 41 40C1: 00 94 00660 HS 0202020202410094 40C3: 00 01 01 40C6: 01 00 FF 40C9: FF FF 00670 VTX HS 0001010100FFFFFF ;THRUST VECTORS 40CB: FF FF 00 40CE: 01 01 01 40D1: 00 FF 00680 VTY HS FFFF0001010100FF 40D3: 33 28 29 40D6: 30 03 11 40D9: 00 10 10 40DC: 00 00690 SCLINE HS 33282930031100101000 ;SCORE LINE DATA 40DD: 00 33 28 40E0: 29 30 03 40E3: 12 00 10 40E6: 10 00700 HS 00332829300312001010 40E7: DD DD 6B 40EA: 6B AA AA 40ED: E6 E6 00710 DERES HS DDDD6B6BAAAAE6E6 40EF: 55 55 AA 40F2: AA 4A 4A 40F5: 35 35 00720 HS 5555AAAA4A4A3535 40F7: 4A 4A 64 40FA: 64 92 92 40FD: 25 25 00730 HS, 4A4A646492922525 40FF: 11 11 48 4102: 48 00740 HS, 11114848 00750 *VARIABLES 4103: 00 00760 VX DA #0 ;SHIP VELOCITY-HORIZ. 4104: 00 00770 VXI DA #0 4105: 00 00780 VY DA #0 ;SHIP VELOCITY-VERT. 4106: 00 00790 VYI DA #0 4107: 00 00800 VXP DA #0 ;SHIP VELOCITY-ALTERNATIVE 4108: 00 00810 VxPl DA #0 4109: 00 00820 VYP DA #0 410A: 00 00830 VYPI DA #0 410B: 00 00840 XPM0 .BS 1 ;CURRENT X POS SHIP 410C: 00 00850 XPM1 BS 1 410D: 0A 00860 YOLDPM0 DA #10 ;OLD Y POS SHIP 410E: 0A 00870 YOLDPM1 DA #10 410F: 00 00880 YMISOLD0 BS 1 ;OLD MISSILE Y POS 4110: 00 00890 YMISOLD1 BS 1 4111: 00 00900 YPM0 BS I ;CURRENT Y POS SHIP 4112: 00 00910 YPM1 BS 1 4113: 00 00920 DIR DA #0 ;SHIP DIRECTION 4114: 00 00930 DIR1 DA #0 4115: 00 00940 DIRM0 BS 1 ;MISSILE TRAVEL DIRECTION 4116: 00 00950 DIRM1 BS 1 4117: 00 00960 COUNT DA #0 ;COUNTER FOR JOYSTICK 4118: 00 00970 SCRCNTX DA #0 ;SCREEN X COUNTERS 4119: 01 00980 SCRCNTXI DA #1 411A: 00 00990 SCRCNTY DA #0 ;SCREEN Y COUNTERS 411B: 01 01000 SCRCNTY1 DA #1 411C: 00 01010 FLAG BS I ;STICK BACK FLAG 411D: 00 01020 SKIPX BS 1 ;CONTROLS RATE OF SHIP UPDATE - HORIZ. 411E: 00 01030 SKIPX1 BS 1 411F: 00 01040 SKIPY BS 1 ;CONTROLS RATE OF SHIP UPDATE - VERT. 4120: 00 01050 SKIPY1 BS 1 4121: 00 01060 MASK BS 1 4122: FC 01070 MASK0 DA #$FC ;MISSILE MASKS 4123: F3 01080 MASK1 DA #$F3 4124: 00 01090 XMIS0 BS 1 ;HORIZ MISSILE POSITIONS 4125: 00 01100 Xmisi BS 1 4126: 00 01110 YMIS0 BS 1 ;VERTICAL MISSILE POSITIONS 4127: 00 01120 YMIS1 BS 1 4128: 00 01130 TMIS0 BS 1 ;MISSILE TIMERS 4129: 00 01140 TMIS1 BS 1 412A: 00 01150 SCOREOD BS 1 ;DIGITS 412B: 00 01160 SCOREOT BS I ;TENS 412C: 00 01170 SCORE1D BS 1 412D: 00 01180 SCORE1T BS 1 412E: 00 01190 EXCOUNT BS I 412F: 00 01200 KILL0 BS 1 ;KILL FLAG 4130: 00 01210 KILL1 BS 1 4131: 00 00 01220 MBANG BS 2 ;SOUND COUNTERS-MISSILES 4133: 00 01230 SBANG BS 1 ;SOUND COUNTER 4134: 00 00 00 01240 DEREZ BS 12 ;TEMP STORAGE DURING DEREZ ROUTINE 4137: 00 00 00 413A: 00 00 00 413D: 00 00 00 01250 START 01260 *SETUP DLIST 4140: A9 00 01270 LDA #$00 ;NORMAL WIDTH 4142: 8D 09 D0 01280 STA SIZEP1 4145: A2 00 01290 LDX #$00 4147: BD A3 40 01300 DLOOP LDA DLIST,X 414A: 9D 00 94 01310 STA NDLIST,X 414D: E8 01320 INX 414E: E0 20 01330 CPX #$20 ;32 ELEMENTS 4150: D0 F5 01340 BNE DLOOP 4152: A9 00 01350 LDA #NDLIST 4154: 8D 30 02 01360 STA 560 4157: A9 94 01370 LDA /NDLIST 4159: 8D 31 02 01380 STA 561 01390 *CLEAR SCREEN - 1K 415C: A9 00 01400 CLRSCR LDA #SCREEN ;SETUP POINTERS TO CLEAR SCREEN 415E: 85 F6 01410 STA SL 4160: A9 90 01420 LDA /SCREEN 4162: 85 F7 01430 STA SH 4164: A0 00 01440 LDY #$00 4166: 98 01450 TYA 4167: A2 04 01460 LDX #$04 4169: 91 F6 01470 .2 STA (SL),Y 416B: C8 01480 INY 416C: D0 FB 01490 BNE .2 ;CONTINUE UNTIL DONE WITH 256 BYTES 416E: E6 F7 01500 INC SH ;DO NEXT PAGE 4170: CA 01510 DEX 4171: D0 F6 01520 BNE .2 01530 *INITILIZE SCORE LINE 4173: A2 00 01540 LDX #$00 4175: BD D3 40 01550 .1 LDA SCLINE,X 4178: 9D 00 90 01560 STA SCREEN,X 417B: E8 01570 INX 417C: E0 14 01580 CPX #$14 417E: D0 F5 01590 BNE .1 4180: A9 00 01600 LDA #$00 ;ZERO OUT SCORE 4182: 8D 2A 41 01610 STA SCORE0D 4185: 8D 2B 41 01620 STA SCORE0T 4188: 8D 2C 41 01630 STA SCORE1D 418B: 8D 2D 41 01640 STA SCORE1T 418E: A9 28 01650 LDA #$28 ;YELLOW LE = RS, 4190: 8D C4 02 01660 STA COLOR0 4193: A9 00 01670 LDA #$00 ;BLACK BACKGROUND & BORDER 4195: 8D C6 02 01680 STA COLOR2 4198: 8D C8 02 01690 STA COLOR4 419B: A9 00 01700 RESTART LDA #$00 419D: 8D 2E 41 01710 STA EXCOUNT 41A0: 8D 2F 41 01720 STA KILLO 41A3: 8D 30 41 01730 STA KILLI 01740 *INITILIZE P/M GRAPHICS 41A6: A9 88 01750 LDA #$88 41A8: 8D 07 D4 01760 STA PMBASE 41AB: A9 03 01770 LDA #$03 ;SET P/M GRAPHICS 41AD: 8D 1D D0 01780 STA GRACTL 41B0: A9 3E 01790 LDA WE ;ENABLE P/M DMA SINGLE LINE 41B2: 8D 2F 02 01800 STA DMACTL 01810 *INITILIZE SHIP 0 41B5: A9 00 01820 LDA #$00 ;NORMAL WIDTH 41B7: 8D 08 D0 01830 STA SIZEPO 41BA: A9 7A 01840 LDA #$7A ;PLAYER #0 122 BLUE-LUM 10 41BC: 8D C0 02 01850 STA COLPMO 41BF: A9 50 01860 LDA #$50 ;INITIAL POS SHIP X=72 41C1: 8D 0B 41 01870 STA XPMO 41C4: 8D 00 D0 01880 STA HPOSPO ; TELL ANTIC 41C7: A9 40 01890 LDA #$40 ;INITIAL POS SHIP Y=64 41C9: 18 01900 CLC 41CA: 69 25 01910 ADC #$25 ;32+CENTER PM SHAPE 5 BELOW TOP 41CC: 8D 11 41 01920 STA YPMO 01930 *INITILIZE SHIP 1 41CF: A9 38 01940 LDA #$38 ;PLAYER #1 58 RED-LUM 8 41D1: 8D C1 02 01950 STA COLPMI 41D4: A9 A0 01960 LDA #$A0 ;INITIAL POS SHIP X-144 41D6: 8D 0C 41 01970 STA XPM1 41D9: 8D 01 D0 01980 STA HPOSP1 41DC: A9 60 01990 LDA #$60 ;INITIAL POS SHIP Y=96 41DE: 18 02000 CLC 41DF: 69 25 02010 ADC #$25 41E1: 8D 12 41 02020 STA YPM1 02030 *CLEAR P/M AREA 41E4: A9 00 02040 LDA #$00 ;PDATAL 41E6: 85 C0 02050 STA PMADR 41E8: A9 88 02060 LDA /PDATA 41EA: 85 C1 02070 STA PMADR+1 41EC: A0 00 02080 LDY #$00 41EE: 98 02090 TYA 41EF: A2 08 02100 LDX #08 41F1: 91 C0 02110 .3 STA (PMADR),Y 41F3: C8 02120 INY 41F4: D0 FB 02130 BNE .3 41F6: E6 C1 02140 INC PMADR+1 ;NEXT 256 BYTES 41F8: CA 02150 DEX 41F9: D0 F6 02160 BNE .3 02170 *SET VBLANK 41FB: A9 07 02180 LDA #07 41FD: A2 42 02190 LDX /FRAME ;HI BYTE VBLANK ROUTINE 41FF: A0 09 02200 LDY #FRAME;LO BYTE 4201: 20 5C E4 02210 JSR SETVBK 4204: A9 00 02220 LDA #$00 02230 *READ STICK 4206: 4C 06 42 02240 FOREVER JMP FOREVER 4209: EA 02250 FRAME NOP 02260 *READ STICK EVERY 6 TIMES 420A: EE 17 41 02270 CHKSTK INC COUNT 420D: AD 17 41 02280 LDA COUNT 4210: C9 05 02290 CMP 005 ;READ STICK ONLY EVERY 6TH TIME 4212: F0 03 02300 BEQ .4 4214: 4C 28 42 02310 imp P1 02320 *SETUP CALL TO JOYSTICK-PLAYER 0 4217: A2 00 02330 .4 LDX #$00 ;PLAYER 0 4219: BD 07 41 02340 LDA VXP,X ;SET PLAYER'S NEW VELOCITY TO OLD VELOCITY 421C: 8D 03 41 02350 STA VX 421F: BD 09 41 02360 LDA VYP,X 4222: 8D 05 41 02370 STA VY 4225: 20 2C 43 02380 JSR JOYSTK 02390 *UPDATE X & Y POSITIONS PLAYER #0 4228: A2 00 02400 P1 LDX #$00 422A: 20 A6 43 02410 JSR UPDATE 422D: 20 42 44 02420 .5 JSR PLOTSETO ;PLOT PLAYER 0 4230: 20 82 44 02430 JSR PLOT 4233: A5 F4 02440 LDA SHPMOL ;STORE AS OLD Y POS FOR NEXT CYCLE 4235: 8D 0D 41 02450 STA YOLDPMO 4238: AD 17 41 02460 CHKSTKI LDA COUNT 423B: C9 06 02470 CMP #$06 READ STICK ONLY EVERY 6TH TIME 423D: F0 03 02480 BEQ .4 423F: 4C 58 42 02490 JMP P2 02500 *SETUP CALL TO JOYSTICK-PLAYER 1 4242: A2 01 02510 .4 LDX #$01 ;PLAYER 1 4244: BD 07 41 02520 LDA VXP,X 4247: 8D 03 41 02530 STA VX 424A: BD 09 41 02540 LDA VYP,X 424D: 8D 05 41 02550 STA VY 4250: 20 2C 43 02560 JSR JOYSTK 4253: A9 00 02570 LDA #$00 ;RESET 4 CYCLE COUNTER 4255: 8D 17 41 02580 STA COUNT 02590 *UPDATE X & Y POSITIONS PLAYER #1 4258: A2 01 02600 P2 LDX #$O1 425A: 20 A6 43 02610 JSR UPDATE 425D: 20 62 44 02620 .5 JSR PLOTSET1 ;PLOT PLAYER 1 4260: 20 82 44 02630 JSR PLOT 4263: A5 F4 02640 LDA SHPMOL ;STORE AS OLD Y POS FOR NEXT CYCLE 4265: 8D 0E 41 02650 STA YOLDPMI 02660 *FIRE MISSILE 4268: A2 00 02670 LDX #$00 426A: 20 0B 45 02680 JSR MISSILE 426D: A2 01 02690 LDX #$O1 426F: 20 0B 45 02700 JSR MISSILE 02710 *CHECK COLLISION 02720 *CHECK FOR OLD COLLISION FIRST 4272: AD 2F 41 02730 LDA KILLO ;FIRST TEST FOR 2 PLAYER COLLISION 4275: C9 00 02740 CMP #$00 4277: F0 07 02750 BEQ .10 ;CAN'T BE 2 PLAYER COLLISION 4279: AD 30 41 02760 LDA KILLI 427C: C9 00 02770 CMP #$00 427E: D0 24 02780 BNE REMOVE 4280: AD 30 41 02790 .10 LDA KILLI ;TEST FOR DERES PLAYER#I 4283: C9 00 02800 CMP #$00 4285: D0 31 02810 BNE REMOVEI 4287: AD 2F 41 02820 LDA KILLO ;TEST FOR DERES PLAYER#O 428A: C9 00 02830 CMP #$00 428C: D0 3D 02840 BNE REMOVEO 02850 *CHECK FOR NEW COLLISION 428E: AD 0C D0 02860 LDA POPL ;TEST P#O AGAINST P#1 4291: D0 11 02870 BNE REMOVE 4293: AD 08 D0 02880 LDA MOPL ;TEST M#O AGAINST P#1 4296: C9 02 02890 CMP #$02 4298: F0 1E 02900 BEQ REMOVE1 429A: AD 09 D0 02910 LDA MIPL ;TEST M#1 AGAINST P#O 429D: C9 01 02920 CMP #$01 429F: F0 2A 02930 BEQ REMOVE0 42A1: 4C DB 42 02940 JMP TESTE 42A4: A9 01 02950 REMOVE LDA #01 42A6: 8D 2F 41 02960 STA KILLO 42A9: 8D 30 41 02970 STA KILL1 42AC: 20 DB 45 02980 JSR EXPLODEO 42AF: 20 E7 45 02990 JSR EXPLODE1 42B2: EE 2E 41 03000 INC EXCOUNT ;NEXT EXPLOSION FRAME 42B5: 4C DB 42 03010 JMP TESTE ;TEST IF EXPLOSION FINISHED 42B8: A9 01 03020 REMOVE1 LDA #$01 42BA: 8D 30 41 03030 STA KILL1 42BD: A9 F0 03040 LDA #$FO ;PUT MISSILE OFF SCREEN 42BF: 8D 05 D0 03050 STA HPOSM1 42C2: 20 E7 45 03060 JSR EXPLODE1 42C5: EE 2E 41 03070 INC EXCOUNT 42C8: 4C DB 42 03080 JMP TESTE 42CB: A9 01 03090 REMOVEO LDA #$O1 42CD: 8D 2F 41 03100 STA KILLO 42D0: A9 F0 03110 LDA #$FO ;PUT MISSILE OFF SCREEN 42D2: 8D 04 D0 03120 STA HPOSMO 42D5: 20 DB 45 03130 JSR EXPLODEO 42D8: EE 2E 41 03140 INC EXCOUNT 42DB: AD 2E 41 03150 TESTE LDA EXCOUNT ;TEST IF DONE WITH DERES CYCLE 42DE: C9 30 03160 CMP #$30 42E0: D0 41 03170 BNE ENDCYCLE 42E2: A9 00 03180 LDA #$00 SHUT OFF EXPLOSION SOUND 42E4: 8D 01 D2 03190 STA AUDC1 42E7: 8D 03 D2 03200 STA AUDC2 42EA: 8D 33 41 03210 STA SBANG 42ED: 20 39 46 03220 JSR SCORE ;UPDATE SCORE 42F0: A9 00 03230 LDA #$00 ;RESET 42F2: 8D 2E 41 03240 STA EXCOUNT 42F5: 8D 2F 41 03250 STA KILLO 42F8: 8D 30 41 03260 STA KILL1 03270 *REPOSITION SHIP AFTER KILL 42FB: A9 50 03280 LDA #$50 ;SHIP 0 42FD: 8D 0B 41 03290 STA XPMO 4300: 8D 00 D0 03300 STA HPOSPO 4303: A9 65 03310 LDA #$65 4305: 8D 11 41 03320 STA YPM0 4308: A9 A0 03330 LDA #$A0 ;SHIP I 430A: 8D 0C 41 03340 STA XPM1 430D: 8D 01 D0 03350 STA HPOSPI 4310: A9 85 03360 LDA #$85 4312: 8D 12 41 03370 STA YPM1 4315: A9 00 03380 LDA #$00 4317: 8D 07 41 03390 STA VIP 431A: 8D 08 41 03400 STA VXP1 431D: 8D 09 41 03410 STA VYP 4320: 8D 0A 41 03420 STA VYP1 4323: 8D 1E D0 03430 ENDCYCLE STA HITCLR ;WRITING ANYTHING CLEARS COLLISION REGISIP 4326: 20 8C 46 03440 JSR DOSOUND 4329: 4C 62 E4 03450 JMP XITVBK 03460 * 03470 *SUBROUTINE READ JOYSTICK 03480 *INPUT X REG- # OF PLAYER 03490 *VX,VY CURRENT PLAYER VELOCITY 03500 *OUTPUT VXP,VYP PLAYER VELOCITY 432C: BD 78 02 03510 JOYSTK LDA STICK,X 432F: 29 02 03520 AND #$02 ;DOWN BIT? 4331: D0 05 03530 BNE CHKLF 4333: A9 01 03540 LDA #01 4335: 8D 1C 41 03550 STA FLAG ;YES STICK BACK 4338: BD 78 02 03560 CHKLF LDA STICK,X 433B: 29 04 03570 AND #$04 ;LEFT BIT? 433D: D0 12 03580 BNE CHKRT 433F: DE 13 41 03590 DEC DIR,X 4342: BD 13 41 03600 LDA DIR,X 4345: C9 FF 03610 CMP #$FF 4347: D0 05 03620 BNE .1 4349: A9 07 03630 LDA #$07 ;SET DIR TO 7 434B: 9D 13 41 03640 STA DIR,X 434E: 4C 68 43 03650 .1 JMP CHKFD 4351: BD 78 02 03660 CHKRT LDA STICKJ 4354: 29 08 03670 AND #$08 ;RIGHT BIT? 4356: D0 10 03680 BNE CHKFD 4358: FE 13 41 03690 INC DIR,X 435B: BD 13 41 03700 LDA DIR,X 435E: C9 08 03710 CMP 008 4360: D0 05 03720 BNE .2 4362: A9 00 03730 LDA #$00 ;SET DIR TO 0 4364: 9D 13 41 03740 STA DIR,X 4367: EA 03750 .2 NOP 4368: BD 78 02 03760 CHKFD LDA STICK,X 436B: 29 01 03770 AND #$O1 ;UP BIT? 436D: D0 36 03780 BNE .9 03790 *SET TO FREE FLOAT 436F: BD 13 41 03800 LDA DIR,X 4372: A8 03810 TAY 4373: 18 03820 CLC 4374: B9 C3 40 03830 LDA VTX,Y ;GET X(DIR)THRUST VECTOR 4377: 6D 03 41 03840 ADC VX 437A: C9 FA 03850 CMP #$FA 437C: D0 02 03860 BNE .5 437E: A9 FB 03870 LDA #$FB ;CLIP TO -5 4380: C9 06 03880 .5 CMP #$06 4382: D0 02 03890 BNE .6 4384: A9 05 03900 LDA #$05 ;CLIP TO 5 4386: 8D 03 41 03910 .6 STA VX ;STORE OLD OR CLIPPED VALUE 4389: 9D 07 41 03920 STA VXP,X 438C: 18 03930 CLC 438D: B9 CB 40 03940 LDA VTY,Y ;GET Y(DIR) THRUST VECTOR 4390: 6D 05 41 03950 ADC VY 4393: C9 FA 03960 CMP #$FA 4395: D0 02 03970 BNE .7 4397: A9 FB 03980 LDA #$FB ;CLIP TO -5 4399: C9 06 03990 .7 CMP #$06 439B: D0 02 04000 BNE .8 439D: A9 05 04010 LDA #$05 ;CLIP TO 5 439F: 8D 05 41 04020 .8 STA VY ;STORE OLD OR CLIPPED VALUE 43A2: 9D 09 41 04030 STA VYP,X 43A5: 60 04040 .9 RTS 04050 *SUBROUTINE TO UPDATE X & Y POSITIONS 43A6: EA 04060 UPDATE NOP 04070 *UPDATE Y POS, VARIABLE # TIMES 04080 *TEST WHEN TO UPDATE 43A7: 18 04090 UPDATEYCLC 43A8: BD 09 41 04100 LDA VYP,X 43AB: 69 05 04110 ADC #$05 ;SO NEGATIVE #'S IN TABLE TOO 43AD: A8 04120 TAY 43AE: B9 98 40 04130 LDA SKFLAG,Y ;#TIMES TO SKIP IS RECIPRICAL OF SPEED 43B1: 9D 1F 41 04140 STA SKIPY,X 43B4: FE 1A 41 04150 INC SCRCNTY,X ;INCREMENT Y COUNTER 43B7: BD 1A 41 04160 LDA SCRCNTY,X 43BA: DD 1F 41 04170 CMP SKIPYJ ;IF MATCH UPDATE Y POS 43BD: B0 03 04180 BGE .1 43BF: 4C F1 43 04190 JMP UPDATEX 04200 *UPDATE Y PLAYER POSITION 43C2: A9 00 04210 .1 LDA #$00 ;PERFORM Y UPDATE 43C4: 9D 1A 41 04220 STA SCRCNTY,X 43C7: BD 09 41 04230 LDA VYP,X 43CA: C9 00 04240 CMP #$00 ;IF HASN'T MOVED DON'T UPDATE 43CC: F0 23 04250 BEQ UPDATEX 43CE: 30 12 04260 BMI .2 43D0: FE 11 41 04270 INC YPMO,X 43D3: BD 11 41 04280 LDA YPMO,X 43D6: C9 E0 04290 CMP #$EO ;HIT BOTTOM? 43D8: 90 05 04300 BLT .3 43DA: A9 18 04310 LDA #$18 ;WRAP TO TOP 43DC: 9D 11 41 04320 STA YPMO,X 43DF: 4C F1 43 04330 .3 JMP UPDATEX 43E2: DE 11 41 04340 .2 DEC YPMO,X 43E5: BD 11 41 04350 LDA YPMO,X 43E8: C9 18 04360 CMP #$18 ;HIT TOP? 43EA: B0 05 04370 BGE UPDATEX 43EC: A9 E0 04380 LDA #$EO ;WRAP TO BOTTOM 43EE: 9D 11 41 04390 STA YPMO,X 04400 *UPDATE X POS VARIABLE # TIMES 43F1: 18 04410 UPDATEX CLC 43F2: BD 07 41 04420 LDA VXP,X 43F5: 69 05 04430 ADC 005 ;SO NEG #'S IN TABLE TOO 43F7: A8 04440 TAY 43F8: B9 98 40 04450 LDA SKFLAG,Y 43FB: 9D 1D 41 04460 STA SKIPX,X 43FE: FE 18 41 04470 INC SCRCNTX,X 4401: BD 18 41 04480 LDA SCRCNTX,X 4404: DD 1D 41 04490 CMP SKIPX,X ;UPDATESCREEN POSITION EVERY SKIP TIME 4407: B0 03 04500 BGE .1 4409: 4C 41 44 04510 JMP EE 04520 *UPDATE X PLAYER POSITION 440C: A9 00 04530 .1 LDA #$00 440E: 9D 18 41 04540 STA SCRCNTX,X 4411: BD 07 41 04550 LDA VXP,X 4414: C9 00 04560 CHP #$00 4416: F0 23 04570 BEQ .3 4418: 30 12 04580 BMI .2 441A: FE 0B 41 04590 INC XPMO,X 441D: BD 0B 41 04600 LDA XPMO,X 4420: C9 D8 04610 CMP #$D8 ;HIT RT SIDE? 4422: 90 05 04620 BIT .4 4424: A9 28 04630 LDA #$28 ;WRAP TO LEFT 4426: 9D 0B 41 04640 STA XPMO,X 4429: 4C 3B 44 04650 .4 JMP .3 442C: DE 0B 41 04660 .2 DEC XPMO,X 442F: BD 0B 41 04670 LDA XPMO,X 4432: C9 28 04680 CMP #$28 ;HIT LEFT? 4434: B0 05 04690 BGE .3 4436: A9 D8 04700 LDA #$D8 ;WRAP TO RIGHT 4438: 9D 0B 41 04710 STA XPMO,X 443B: BD 0B 41 04720 .3 LDA XPMO,X NEW VALUE 443E: 9D 00 D0 04730 STA HPOSPO,X UPDATE ANTIC PLAYER HORIZ 4441: 60 04740 EE RTS 04750 *PLOT PLAYERO SETUP 4442: AD 11 41 04760 PLOTSETO LDA YPMO ;CORRECTED YPOS 4445: 85 F2 04770 STA SHPML 4447: A9 88 04780 LDA /PDATA 4449: 18 04790 CLC 444A: 69 04 04800 ADC #$04 ;PLAYERO IS 1K BEYOND START 444C: 85 F3 04810 STA SHPMH 444E: 85 F5 04820 STA SHPMOH 4450: AC 13 41 04830 LDY DIR 4453: B9 60 40 04840 LDA SHPLO,Y ;POINTER TO CORRECT SHAPE 4456: 85 F0 04850 STA SHPL 4458: A9 40 04860 LDA /SHAPEO ;HI BYTE 445A: 85 F1 04870 STA SHPH 445C: AD 0D 41 04880 LDA YOLDPMO 445F: 85 F4 04890 STA SHPMOL 4461: 60 04900 RTS 04910 *PLOT PLAYERI SETUP 4462: AD 12 41 04920 PLOTSETI LDA YPM1 ;CORRECTED YPOS 4465: 85 F2 04930 STA SHPML 4467: A9 88 04940 LDA /PDATA 4469: 18 04950 CLC 446A: 69 05 04960 ADC #$05 ;PLAYER1 IS 1.25K BEYOND START 446C: 85 F3 04970 STA SHPMH 446E: 85 F5 04980 STA SHPMOff 4470: AC 14 41 04990 LDY DIR1 4473: B9 60 40 05000 LDA SHPLO,Y ;POINTER TO CORRECT SHAPE 4476: 85 F0 05010 STA SHPL 4478: A9 40 05020 LDA /SHAPEO ;HI BYTE ;BOTH PLAYER SHAPES SAME 447A: 85 F1 05030 STA SHPH 447C: AD 0E 41 05040 LDA YOLDPM1 447F: 85 F4 05050 STA SHPMOL 4481: 60 05060 RTS 05070 *PUT SHAPE IN P/M AREA 4482; A0 00 05080 PLOT LDY #$00 ;COUNTER 4484: A9 00 05090 LDA #$00 ;NEED 0 TO ERASE EACH TIME 4486: 91 F4 05100 .1 STA (SHPMOL),Y ;ERASE OLD SHAPE FIRST 4488: C8 05110 INY 4489: C0 0C 05120 CPY #$OC 448B: 90 F9 05130 BLT .1 448D: A0 00 05140 LDY #$00 448F: B1 F0 05150 .2 LDA (SHPL),Y;GET BYTE FROM PROPER SHAPE TABLE 4491: 91 F2 05160 STA (SHPML),Y ;PUT IN P/M AREA 4493: A5 F2 05170 LDA SHPML ;TRANSFER NEW P/M POS TO OLD POS 4495: C8 05180 INY 4496: C0 0C 05190 CPY #$OC 4498: 90 F5 05200 BLT .2 449A: A5 F2 05210 LDA SHPML ;TRANSFER NEW P/M POS TO OLD POS 449C: 85 F4 05220 STA SHPMOL 449E: A5 F3 05230 LDA SHPMH 44A0: 85 F5 05240 STA SHPMOH 44A2: 60 05250 RTS 05260 *SETUP TO PLOT MISSILE 0 44A3: AD 26 41 05270 MISSETO LDA YMISO ;MISSILE POSITION CORRECTED 44A6: 85 F2 05280 STA SHPML 44A8: A9 88 05290 LDA /PDATA 44AA: 18 05300 CLC 44AB: 69 03 05310 ADC #$03 ;MISSILES .75K BEYOND START 44AD: 85 F3 05320 STA SHPMH 44AF: 85 F5 05330 STA SHPMOH 44B1: AC 15 41 05340 LDY DIRMO 44B4: B9 88 40 05350 LDA MISLO,Y ;POINTER TO CORRECT MISSILE SHAPE 44B7: 85 F0 05360 STA SHPL 44B9: A9 40 05370 LDA /MSHAPE ;HI BYTE-BOTH P/M SHAPES SAME 44BB: 85 F1 05380 STA SHPH 44BD: AD 0F 41 05390 LDA YMISOLDO 44C0: 85 F4 05400 STA SHPMOL 44C2: AD 22 41 05410 LDA MASKO 44C5: 8D 21 41 05420 STA MASK 44C8: 20 B7 45 05430 JSR MPLOT 44CB: A5 F4 05440 LDA SHPMOL 44CD: 8D 0F 41 05450 STA YMISOLDO 44D0: AD 24 41 05460 LDA XMISO 44D3: 8D 04 D0 05470 STA HPOSMO ;MISSILE 0 HORIZ POS 44D6: 60 05480 RTS 05490 *SETUP TO PLOT MISSILE 1 44D7: AD 27 41 05500 MISSETI LDA YMIS1 ;MISSILE POSITION CORRECTED 44DA: 85 F2 05510 STA SHPML 44DC: A9 88 05520 LDA /PDATA 44DE: 18 05530 CLC 44DF: 69 03 05540 ADC #$03 ;MISSILES .75K BEYOND START 44E1: 85 F3 05550 STA SHPMH 44E3: 85 F5 05560 STA SHPMOH 44E5: AC 16 41 05570 LDY DIRM1 44E8: B9 90 40 05580 LDA MISLO1,Y ;POINTER TO CORRECT MISSILE SHAPE 44EB: 85 F0 05590 STA SHPL 44ED: A9 40 05600 LDA /MSHAPE ;HI BYTE-BOTH P/M SHAPES SAME 44EF: 85 F1 05610 STA SHPH 44F1: AD 10 41 05620 LDA YMISOLDI 44F4: 85 F4 05630 STA SHPMOL 44F6: AD 23 41 05640 LDA MASK1 44F9: 8D 21 41 05650 STA MASK 44FC: 20 B7 45 05660 JSR MPLOT 44FF: A5 F4 05670 LDA SHPMOL 4501: 8D 10 41 05680 STA YMISOLD1 4504: AD 25 41 05690 LDA XMISI 4507: 8D 05 D0 05700 STA HPOSM1 ;MISSILE 1 HORIZ POS 450A: 60 05710 RTS 05720 *MISSILE SUBROUTINE -MISSILE TRACK ENDS AT COLLSION OR SCREEN ED( 450B: BD 84 02 05730 MISSILE LDA STRIGO,X 450E: C9 00 05740 CMP #$00 4510: D0 37 05750 BNE .1 4512: BD 28 41 05760 LDA TMISOJ 4515: C9 00 05770 CMP #$00 4517: D0 3A 05780 BNE .2 4519: A9 10 05790 LDA #$10 FLAG & INITIAL VOLUME FOR SHOT SOUND 451B: 9D 31 41 05800 STA MBANG,X 451E: FE 28 41 05810 INC TMISO,X ;INCREMENT TIMER 05820 *ERASE OLD MISSILE & PUT AT SHIP 4521: BD 13 41 05830 LDA DIR,X 4524: 9D 15 41 05840 STA DIRMO,X ;DIR MISSILE TO MOVE THROUGHOUT TRAVEL 4527: BD 11 41 05850 LDA YPMO,X 452A: 18 05860 CLC 452B: 69 06 05870 ADC #06 ;CORRECT TO SHIP CENTER 452D: 9D 26 41 05880 STA YMISO,X 4530: BD 0B 41 05890 LDA XPMO,X 4533: 18 05900 CLC 4534: 69 04 05910 ADC #04 ;CORRECT TO SHIP CENTER 4536: 9D 24 41 05920 STA XMISOJ 4539: E0 00 05930 CPX #00 453B: D0 06 05940 BNE .10 453D: 20 A3 44 05950 JSR MISSETO ;TO MISSILE PLOT SETUP & PLOT 4540: 4C B6 45 05960 JMP EXIT 4543: 20 D7 44 05970 .10 JSR MISSET1 4546: 4C B6 45 05980 JMP EXIT 4549: BD 28 41 05990 .1 LDA TMISOJ 454C: C9 00 06000 CMP 000 454E: D0 03 06010 BNE .2 4550: 4C B6 45 06020 JMP EXIT 06030 *MOVE MISSILE IN PROPER DIRECTION 4553: BC 15 41 06040 .2 LDY DIRMOJ 4556: B9 C3 40 06050 LDA VTX,Y 4559: 0A 06060 ASL ;DOUBLE VELOCITY VECTOR 455A: 18 06070 CLC 455B: 7D 24 41 06080 ADC XMISOJ 455E: 9D 24 41 06090 STA XMISOJ 4561: B9 CB 40 06100 LDA VTY,Y 4564: 0A 06110 ASL ;DOUBLE VELOCITY VECTOR 4565: 18 06120 CLC 4566: 7D 26 41 06130 ADC YMISOJ 4569: 9D 26 41 06140 STA YMISO,X 06150 *HAS MISSILE HIT SCREEN EDGE 456C: C9 20 06160 CMP 020 456E: B0 03 06170 BGE .3 4570: 4C 9F 45 06180 JMP ERASEM ;EVA 4573: C9 D8 06190 .3 CMP #$D8 4575: 90 03 06200 BLT .4 4577: 4C 9F 45 06210 JMP ERASEM 457A: BD 24 41 06220 .4 LDA XMISOJ 457D: C9 30 06230 CMP WO 457F: B0 03 06240 BGE .5 4581: 4C 9F 45 06250 JMP ERASEM 4584: C9 D0 06260 .5 CMP #$DO 4586: 90 03 06270 BLT .6 4588: 4C 9F 45 06280 JMP ERASEM 458B: EA 06290 .6 NOP 458C: FE 28 41 06300 INC TMISO,X 06310 *ERASE & REPLOT MISSILE 458F: E0 00 06320 ERASE CPX #$00 4591: D0 06 06330 BNE .8 4593: 20 A3 44 06340 JSR MISSETO 4596: 4C B6 45 06350 JMP EXIT 4599: 20 D7 44 06360 .8 JSR MISSETI 459C: 4C B6 45 06370 JMP EXIT 06380 *ERASE MISSILE OFF SCREEN 459F: A9 E0 06390 ERASEM LDA #$EO 45A1: 9D 24 41 06400 STA XMISOJ ;PLOT OFF SCREEN 45A4: E0 00 06410 CPX #$00 45A6: D0 06 06420 BNE .71 45A8: 20 A3 44 06430 JSR MISSETO 45AB: 4C B1 45 06440 JMP .7 45AE: 20 D7 44 06450 .71 JSR MISSET1 45B1: A9 00 06460 .7 LDA #$00 45B3: 9D 28 41 06470 STA TMISO,X 45B6: 60 06480 EXIT RTS 06490 *PUT MISSILE SHAPE IN P/M AREA SUBROUTINE 45B7: A0 00 06500 MPLOT LDY #$00 45B9: B1 F4 06510 .1 LDA (SHPMOL),Y ;LOAD OLD SHAPE 45BB: 2D 21 41 06520 AND MASK ;MASK WITH PROPER MISSILE BEING MOVED 45BE: 91 F4 06530 STA (SHPMOL),Y ;STOREING IT DOESN'T ERASE OTHER MISSILES 45C0: C8 06540 INY 45C1: C0 02 06550 CPY #$02 45C3: 90 F4 06560 BLT .1 45C5: A0 00 06570 LDY #$00 45C7: B1 F0 06580 .2 LDA (SHPL),Y;GET BYTE FROM CORRECT MISSILE SHAPE TABLE 45C9: 11 F2 06590 ORA (SHPML),Y ;OR AGAINST CURRENT OTHER MISSILES 45CB: 91 F2 06600 STA (SHPML),Y ;PUT IN MISSILE AREA 45CD: C8 06610 INY 45CE: C0 02 06620 CPY #$02 45D0: 90 F5 06630 BLT .2 45D2: A5 F2 06640 LDA SHPML ;TRANSFER TO OLD POINTERS 45D4: 85 F4 06650 STA SHPMOL 45D6: A5 F3 06660 LDA SHPMH 45D8: 85 F5 06670 STA SHPMOH 45DA: 60 06680 RTS 06690 *SUBROUTINES TO EXPLODE SHIPS 45DB: 20 42 44 06700 EXPLODED JSR PLOTSETO 45DE: 20 F3 45 06710 JSR EXPLODE 45E1: A5 F4 06720 LDA SHPMOL 45E3: 8D 0D 41 06730 STA YOLDPMO 45E6: 60 06740 RTS 45E7: 20 62 44 06750 EXPLODEI JSR PLOTSET1 45EA: 20 F3 45 06760 JSR EXPLODE 45ED: A5 F4 06770 LDA SHPMOL 45EF: 8D 0E 41 06780 STA YOLDPM1 45F2: 60 06790 RTS 06800 *DE-RES SHAPE 45F3: A0 00 06810 EXPLODE LDY #$00 ;COUNTER 45F5: A9 00 06820 LDA #$00 ;NEED 0 TO ERASE EACH TIME 45F7: 91 F4 06830 .1 STA (SHPMOL),Y ;ERASE OLD SHAPE FIRST 45F9: C8 06840 INY 45FA: C0 0C 06850 CPY #$Oc 45FC: 90 F9 06860 BLT .1 45FE: AE 2E 41 06870 LDX EXCOUNT ;COUNTER 4601: A0 00 06880 LDY #$00 ;START WITH OTH BYTE IN SHAPE 4603: E0 00 06890 .2 CPX #$00 ;FIRST TIME? 4605: D0 05 06900 BNE .22 4607: B1 F0 06910 LDA (SHPL),Y;GET BYTE FROM PROPER SHAPE TABLE 4609: 99 34 41 06920 STA DEREZ,Y ;DO THIS ONLY FIRST TIME 460C: AD 0A D2 06930 .22 LDA RANDOM 460F: 0D 0A D2 06940 ORA RANDOM ;DEGRADE IMAGE RANDONILY 4612: 39 34 41 06950 AND DEREZ,Y 4615: 99 34 41 06960 STA DEREZ,Y ;TEMP STORE DEGRADED IMAGE 4618: B1 F0 06970 LDA (SHPL),Y 461A: 2D 0A D2 06980 AND RANDOM ;DEGRADE IMAGE RANDOMILY 461D: 2D 0A D2 06990 AND RANDOM 4620: 2D 0A D2 07000 AND RANDOM 4623: 2D 0A D2 07010 ANI 4626: 19 34 41 07020 ORA DEREZ,Y ;COMBINE 2 DEGRADED IMAGES SO LESS DEGRADED 4629: 91 F2 07030 STA (SHPML),Y ;PUT IN P/M AREA 462B: C8 07040 INY ;NEXT BYTE IN SHAPE 462C: C0 0C 07050 CPY #$OC ;DONE? 462E: 90 D3 07060 BLT .2 4630: A5 F2 07070 LDA SHPML ;TRANSFER NEW P/M POS TO OLD POS 4632: 85 F4 07080 STA SHPMOL 4634: A5 F3 07090 LDA SHPMH 4636: 85 F5 07100 STA SHPMOH 4638: 60 07110 RTS 07120 *SCORE SUBROUTINE 4639: AD 2F 41 07130 SCORE LDA KILLO 463C: F0 12 07140 BEQ .1 463E: EE 2A 41 07150 INC SCOREOD ;INC DIGITS #0 4641: AD 2A 41 07160 LDA SCOREOD ;TEST IF >9 4644: C9 0A 07170 CMP #$0A 4646: D0 08 07180 BNE .1 4648: EE 2B 41 07190 INC SCOREOT ;INC TENS #0 464B: A9 00 07200 LDA #$00 464D: 8D 2A 41 07210 STA SCOREOD ;ZERO DIGITS #0 4650: AD 30 41 07220 .1 LDA KILL1 4653: F0 12 07230 BEQ .2 4655: EE 2C 41 07240 INC SCORE1D ;INC DIGITS #1 4658: AD 2C 41 07250 LDA SCORE1D 465B: C9 0A 07260 CMP #$0A 465D: D0 08 07270 BNE .2 465F: EE 2D 41 07280 INC SCORE1T 4662: A9 00 07290 LDA #$00 4664: 8D 2C 41 07300 STA SCORE1D 4667: AD 2B 41 07310 .2 LDA SCOREOT 466A: 18 07320 CLC 466B: 69 10 07330 ADC #$10 466D: 8D 07 90 07340 STA SCREEN+7 ;PLACE IN SCREEN MEMORY 4670: AD 2A 41 07350 LDA SCOREOD 4673: 18 07360 CLC 4674: 69 10 07370 ADC #$10 4676: 8D 08 90 07380 STA SCREEN+8 4679: AD 2D 41 07390 LDA SCOREIT 467C: 18 07400 CLC 467D: 69 10 07410 ADC #$10 on 467F: 8D 12 90 07420 STA SCREEN+18 4682: AD 2C 41 07430 LDA SCORE1D oi 4685: 18 07440 CLC 4686: 69 10 07450 ADC #$10 4688: 8D 13 90 07460 STA SCREEN+19 468B: 60 07470 RTS 07480 DOSOUND 468C: AD 2E 41 07490 LDA EXCOUNT SHIP EXPLODING? 468F: F0 24 07500 BEQ MSOUND NO? THEN GO CHECK FOR SHOT SOUNDS 4691: C9 01 07510 CMP #$O1 IS IT 1ST TIME 4693: D0 05 07520 BNE .1 4695: A9 40 07530 LDA #$40 ;THIS WILL BE DIVIDED BY 4 SO 4697: 8D 33 41 07540 STA SBANG ;VOLUME GOES FROM $10 TO 0 IN STEPS OF EVERY 4 VBLANKS 469A: CE 33 41 07550 .1 DEC SBANG 469D: AD 33 41 07560 LDA SBANG 46A0: 4A 07570 LSR 46A1: 4A 07580 LSR 46A2: 09 E0 07590 ORA #$E0 LOWER IT 46A4: 8D 00 D2 07600 STA AUDF1 ;AUDF1 46A7: 8D 02 D2 07610 STA AUDF2 ;AUDF2 46AA: 29 0F 07620 AND #$0F ;KEEP VOLUME 46AC: 8D 01 D2 07630 STA AUDC1 ;DISTORTION 0 46AF: 09 80 07640 ORA 080 ;DISTORTION 8 46B1: 8D 03 D2 07650 STA AUDC2 46B4: 60 07660 RTS 07670 MSOUND 46B5: A2 01 07680 LDX 001 46B7: A0 02 07690 LDY 002 ;AUDC1 & AUDC2 ARE 2 BYTES APART 46B9: BD 31 41 07700 .1 LDA MBANG,X 46BC: F0 0E 07710 BEQ .2 ;IF 0 THEN NO SOUND 46BE: DE 31 41 07720 DEC MBANG,X LET IT COUNTDOWN TO 0 EVERY CYCLE 46C1: BD 31 41 07730 LDA MBANG,X 46C4: 99 01 D2 07740 STA AUDC1,Y AUDC 46C7: A9 00 07750 LDA #$00 46C9: 99 00 D2 07760 STA AUDF1,Y 46CC: 88 07770 .2 DEY 46CD: 88 07780 DEY 46CE: CA 07790 DEX 46CF: 10 E8 07800 BPL .1 46D1: 60 07810 RTS