*SPACE WAR GAME - BY JEFFREY STANTON ORG $4000 *ZERO PAGE EQUATES SHPL EQU $F0 SHPH EQU $F1 SHPML EQU $F2 SHPMH EQU $F3 SHPMOL EQU $F4 SHPMOH EQU $F5 SL EQU $F6 SH EQU $F7 *PLAYER MISSILE EQUATES PMBASE EQU $D407 PDATA EQU $8800 GRACTL EQU $D01D DMACTL EQU $22F SIZEP0 EQU $D008 SIZEP1 EQU $D009 COLPM0 EQU $2C0 COLPM1 EQU $2C1 HPOSP0 EQU $D000 HPOSP1 EQU $D001 HPOSM0 EQU $D004 HPOSM1 EQU $D005 PMADR EQU $C0 HITCLR EQU $D01E *COLLISIONS M0PL EQU $D008 M1PL EQU $D009 P0PL EQU $D00C *MISC EQUATES NDLIST EQU $9400 ; ADR OF NEW DISPLAY LIST SCREEN EQU $9000 COLOR0 EQU $2C4 COLOR2 EQU $2C6 COLOR4 EQU $2C8 SETVBK EQU $E45C XITVBK EQU $E462 STRIG0 EQU $284 STICK EQU $278 RANDOM EQU $D20A AUDF1 EQU $D200 AUDC1 EQU $D201 AUDF2 EQU $D202 AUDC2 EQU $D203 *DATA SHAPEO HEX 0808081C1C1C3E3E22220000 HEX 0000010E1E2E040408000000 HEX 000000703C3F3C7000000000 HEX 00000804042E1E0E01000000 HEX 0022223E3E1C1C1C08080800 HEX 00000810103A3C3840000000 HEX 000000071E7E1E0700000000 HEX 000040383C3A101008000000 SHPLO HEX 000C1824303C4854 MSHAPE HEX 0202010203000201 HEX 0202010203000201 HEX 080804080C000804 HEX 080804080C000804 MISLO HEX 686A6C6E70727476 MISLO1 HEX 787A7C7E80828486 SKFLAG HEX 0102030405050504030201 DLIST HEX 7070704700900202 HEX 0202020202020202 HEX 0202020202020202 HEX 0202020202410094 VTX HEX 0001010100FFFFFF ; THRUST VECTORS VTY HEX FFFF0001010100FF SCLINE HEX 33282930031100101000 ; SCORE LINE DATA HEX 00332829300312001010 DERES HEX DDDD6B6BAAAAE6E6 HEX 5555AAAA4A4A3535 HEX 4A4A646492922525 HEX 11114848 *VARIABLES VX DB 0 ; SHIP VELOCITY-HORIZ. VX1 DB 0 VY DB 0 ; SHIP VELOCITY-VERT. VY1 DB 0 VXP DB 0 ; SHIP VELOCITY-ALTERNATIVE VXP1 DB 0 VYP DB 0 VYP1 DB 0 XPM0 DS 1 ; CURRENT X POS SHIP XPM1 DS 1 YOLDPM0 DB 10 ; OLD Y POS SHIP YOLDPM1 DB 10 YMISOLD0 DS 1 ; OLD MISSILE Y POS YMISOLD1 DS 1 YPM0 DS 1 ; CURRENT Y POS SHIP YPM1 DS 1 DIR DB 0 ; SHIP DIRECTION DIR1 DB 0 DIRM0 DS 1 ; MISSILE TRAVEL DIRECTION DIRM1 DS 1 COUNT DB 0 ; COUNTER FOR JOYSTICK SCRCNTX DB 0 ; SCREEN X COUNTERS SCRCNTX1 DB 1 SCRCNTY DB 0 ; SCREEN Y COUNTERS SCRCNTY1 DB 1 FLAG DS 1 ; STICK BACK FLAG SKIPX DS 1 ; CONTROLS RATE OF SHIP UPDATE - HORIZ. SKIPX1 DS 1 SKIPY DS 1 ; CONTROLS RATE OF SHIP UPDATE - VERT. SKIPY1 DS 1 MASK DS 1 MASK0 DB $FC ; MISSILE MASKS MASK1 DB $F3 XMIS0 DS 1 ; HORIZ MISSILE POSITIONS XMIS1 DS 1 YMIS0 DS 1 ; VERTICAL MISSILE POSITIONS YMIS1 DS 1 TMIS0 DS 1 ; MISSILE TIMERS TMIS1 DS 1 SCORE0D DS 1 ; DIGITS SCORE0T DS 1 ; TENS SCORE1D DS 1 SCORE1T DS 1 EXCOUNT DS 1 KILL0 DS 1 ; KILL FLAG KILL1 DS 1 MBANG DS 2 ; SOUND COUNTERS-MISSILES SBANG DS 1 ; SOUND COUNTER DEREZ DS 12 ; TEMP STORAGE DURING DEREZ ROUTINE START *SETUP DLIST LDA #$00 ; NORMAL WIDTH STA SIZEP1 LDX #$00 DLOOP LDA DLIST,X STA NDLIST,X INX CPX #$20 ; 32 ELEMENTS BNE DLOOP LDA #>NDLIST STA 560 LDA #SCREEN ; SETUP POINTERS TO CLEAR SCREEN STA SL LDA #FRAME ; LO BYTE JSR SETVBK LDA #$00 *READ STICK FOREVER JMP FOREVER FRAME NOP *READ STICK EVERY 6 TIMES CHKSTK INC COUNT LDA COUNT CMP #05 ; READ STICK ONLY EVERY 6TH TIME BEQ AA4 JMP P1 *SETUP CALL TO JOYSTICK-PLAYER 0 AA4 LDX #$00 ; PLAYER 0 LDA VXP,X ; SET PLAYER'S NEW VELOCITY TO OLD VELOCITY STA VX LDA VYP,X STA VY JSR JOYSTK *UPDATE X & Y POSITIONS PLAYER #0 P1 LDX #$00 JSR UPDAT *.5 JSR PLSET0 ; PLOT PLAYER 0 JSR PLOT LDA SHPMOL ; STORE AS OLD Y POS FOR NEXT CYCLE STA YOLDPM0 CKSTK1 LDA COUNT CMP #$06 ; READ STICK ONLY EVERY 6TH TIME BEQ AB4 JMP P2 *SETUP CALL TO JOYSTICK-PLAYER 1 AB4 LDX #$01 ; PLAYER 1 LDA VXP,X STA VX LDA VYP,X STA VY JSR JOYSTK LDA #$00 ; RESET 4 CYCLE COUNTER STA COUNT *UPDATE X & Y POSITIONS PLAYER #1 P2 LDX #$01 JSR UPDAT *.5 JSR PLSET1 ; PLOT PLAYER 1 JSR PLOT LDA SHPMOL ; STORE AS OLD Y POS FOR NEXT CYCLE STA YOLDPM1 *FIRE MISSILE LDX #$00 JSR MISSILE LDX #$01 JSR MISSILE *CHECK COLLISION *CHECK FOR OLD COLLISION FIRST LDA KILL0 ; FIRST TEST FOR 2 PLAYER COLLISION CMP #$00 BEQ AB10 ; CAN'T BE 2 PLAYER COLLISION LDA KILL1 CMP #$00 BNE REMOVE AB10 LDA KILL1 ; TEST FOR DERES PLAYER#I CMP #$00 BNE REMOV1 LDA KILL0 ; TEST FOR DERES PLAYER#O CMP #$00 BNE REMOV0 *CHECK FOR NEW COLLISION LDA P0PL ; TEST P#O AGAINST P#1 BNE REMOVE LDA M0PL ; TEST M#O AGAINST P#1 CMP #$02 BEQ REMOV1 LDA M1PL ; TEST M#1 AGAINST P#O CMP #$01 BEQ REMOV0 JMP TESTE REMOVE LDA #01 STA KILL0 STA KILL1 JSR EXPLO0 JSR EXPLO1 INC EXCOUNT ; NEXT EXPLOSION FRAME JMP TESTE ; TEST IF EXPLOSION FINISHED REMOV1 LDA #$01 STA KILL1 LDA #$F0 ; PUT MISSILE OFF SCREEN STA HPOSM1 JSR EXPLO1 INC EXCOUNT JMP TESTE REMOV0 LDA #$01 STA KILL0 LDA #$F0 ; PUT MISSILE OFF SCREEN STA HPOSM0 JSR EXPLO0 INC EXCOUNT TESTE LDA EXCOUNT ; TEST IF DONE WITH DERES CYCLE CMP #$30 BNE ENDCYCLE LDA #$00 ; SHUT OFF EXPLOSION SOUND STA AUDC1 STA AUDC2 STA SBANG JSR SCORE ; UPDATE SCORE LDA #$00 ; RESET STA EXCOUNT STA KILL0 STA KILL1 *REPOSITION SHIP AFTER KILL LDA #$50 ; SHIP 0 STA XPM0 STA HPOSP0 LDA #$65 STA YPM0 LDA #$A0 ; SHIP 1 STA XPM1 STA HPOSP1 LDA #$85 STA YPM1 LDA #$00 STA VXP STA VXP1 STA VYP STA VYP1 ENDCYCLE STA HITCLR ; WRITING ANYTHING CLEARS COLLISION REGISIP JSR DOSOUND JMP XITVBK * *SUBROUTINE READ JOYSTICK *INPUT X REG- # OF PLAYER *VX,VY CURRENT PLAYER VELOCITY *OUTPUT VXP,VYP PLAYER VELOCITY JOYSTK LDA STICK,X AND #$02 ; DOWN BIT? BNE CHKLF LDA #01 STA FLAG ; YES STICK BACK CHKLF LDA STICK,X AND #$04 ; LEFT BIT? BNE CHKRT DEC DIR,X LDA DIR,X CMP #$FF BNE AC1 LDA #$07 ; SET DIR TO 7 STA DIR,X AC1 JMP CHKFD CHKRT LDA STICK,X AND #$08 ; RIGHT BIT? BNE CHKFD INC DIR,X LDA DIR,X CMP #08 BNE AC2 LDA #$00 ; SET DIR TO 0 STA DIR,X AC2 NOP CHKFD LDA STICK,X AND #$01 ; UP BIT? BNE AC9 *SET TO FREE FLOAT LDA DIR,X TAY CLC LDA VTX,Y ; GET X(DIR)THRUST VECTOR ADC VX CMP #$FA BNE AC5 LDA #$FB ; CLIP TO -5 AC5 CMP #$06 BNE AC6 LDA #$05 ; CLIP TO 5 AC6 STA VX ; STORE OLD OR CLIPPED VALUE STA VXP,X CLC LDA VTY,Y ; GET Y(DIR) THRUST VECTOR ADC VY CMP #$FA BNE AC7 LDA #$FB ; CLIP TO -5 AC7 CMP #$06 BNE AC8 LDA #$05 ; CLIP TO 5 AC8 STA VY ; STORE OLD OR CLIPPED VALUE STA VYP,X AC9 RTS *SUBROUTINE TO UPDATE X & Y POSITIONS UPDAT NOP *UPDATE Y POS, VARIABLE # TIMES *TEST WHEN TO UPDATE UPDATY CLC LDA VYP,X ADC #$05 ; SO NEGATIVE #'S IN TABLE TOO TAY LDA SKFLAG,Y ; #TIMES TO SKIP IS RECIPRICAL OF SPEED STA SKIPY,X INC SCRCNTY,X ; INCREMENT Y COUNTER LDA SCRCNTY,X CMP SKIPY,X ; IF MATCH UPDATE Y POS BGE AD1 JMP UPDATX *UPDATE Y PLAYER POSITION AD1 LDA #$00 ; PERFORM Y UPDATE STA SCRCNTY,X LDA VYP,X CMP #$00 ; IF HASN'T MOVED DON'T UPDATE BEQ UPDATX BMI AD2 INC YPM0,X LDA YPM0,X CMP #$E0 ; HIT BOTTOM? BL AD3 LDA #$18 ; WRAP TO TOP STA YPM0,X AD3 JMP UPDATX AD2 DEC YPM0,X LDA YPM0,X CMP #$18 ; HIT TOP? BGE UPDATX LDA #$E0 ; WRAP TO BOTTOM STA YPM0,X *UPDATE X POS VARIABLE # TIMES UPDATX CLC LDA VXP,X ADC #05 ; SO NEG #'S IN TABLE TOO TAY LDA SKFLAG,Y STA SKIPX,X INC SCRCNTX,X LDA SCRCNTX,X CMP SKIPX,X ; UPDATESCREEN POSITION EVERY SKIP TIME BGE AE1 JMP EE *UPDATE X PLAYER POSITION AE1 LDA #$00 STA SCRCNTX,X LDA VXP,X CMP #$00 BEQ AE3 BMI AE2 INC XPM0,X LDA XPM0,X CMP #$D8 ; HIT RT SIDE? BL AE4 LDA #$28 ; WRAP TO LEFT STA XPM0,X AE4 JMP AE3 AE2 DEC XPM0,X LDA XPM0,X CMP #$28 ; HIT LEFT? BGE AE3 LDA #$D8 ; WRAP TO RIGHT STA XPM0,X AE3 LDA XPM0,X ; NEW VALUE STA HPOSP0,X ; UPDATE ANTIC PLAYER HORIZ EE RTS *PLOT PLAYER0 SETUP PLSET0 LDA YPM0 ; CORRECTED YPOS STA SHPML LDA #9 CMP #$0A BNE AM1 INC SCORE0T ; INC TENS #0 LDA #$00 STA SCORE0D ; ZERO DIGITS #0 AM1 LDA KILL1 BEQ AM2 INC SCORE1D ; INC DIGITS #1 LDA SCORE1D CMP #$0A BNE AM2 INC SCORE1T LDA #$00 STA SCORE1D AM2 LDA SCORE0T CLC ADC #$10 STA SCREEN+7 ; PLACE IN SCREEN MEMORY LDA SCORE0D CLC ADC #$10 STA SCREEN+8 LDA SCORE1T CLC ADC #$10 STA SCREEN+18 LDA SCORE1D CLC ADC #$10 STA SCREEN+19 RTS DOSOUND LDA EXCOUNT ; SHIP EXPLODING? BEQ MSOUND ; NO? THEN GO CHECK FOR SHOT SOUNDS CMP #$01 ; IS IT 1ST TIME BNE AN1 LDA #$40 ; THIS WILL BE DIVIDED BY 4 SO STA SBANG ; VOLUME GOES FROM $10 TO 0 IN STEPS OF EVERY 4 VBLANKS AN1 DEC SBANG LDA SBANG LSR LSR ORA #$E0 ; LOWER IT STA AUDF1 ; AUDF1 STA AUDF2 ; AUDF2 AND #$0F ; KEEP VOLUME STA AUDC1 ; DISTORTION 0 ORA #$80 ; DISTORTION 8 STA AUDC2 RTS MSOUND LDX #01 LDY #02 ; AUDC1 & AUDC2 ARE 2 BYTES APART AP1 LDA MBANG,X BEQ AP2 ; IF 0 THEN NO SOUND DEC MBANG,X ; LET IT COUNTDOWN TO 0 EVERY CYCLE LDA MBANG,X STA AUDC1,Y ; AUDC LDA #$00 STA AUDF1,Y AP2 DEY DEY DEX BPL AP1 RTS