*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 DB $08,$08,$08,$1C,$1C,$1C,$3E,$3E,$22,$22,$00,$00 DB $00,$00,$01,$0E,$1E,$2E,$04,$04,$08,$00,$00,$00 DB $00,$00,$00,$70,$3C,$3F,$3C,$70,$00,$00,$00,$00 DB $00,$00,$08,$04,$04,$2E,$1E,$0E,$01,$00,$00,$00 DB $00,$22,$22,$3E,$3E,$1C,$1C,$1C,$08,$08,$08,$00 DB $00,$00,$08,$10,$10,$3A,$3C,$38,$40,$00,$00,$00 DB $00,$00,$00,$07,$1E,$7E,$1E,$07,$00,$00,$00,$00 DB $00,$00,$40,$38,$3C,$3A,$10,$10,$08,$00,$00,$00 SHPLO DB $00,$0C,$18,$24,$30,$3C,$48,$54 MSHAPE DB $02,$02,$01,$02,$03,$00,$02,$01 DB $02,$02,$01,$02,$03,$00,$02,$01 DB $08,$08,$04,$08,$0C,$00,$08,$04 DB $08,$08,$04,$08,$0C,$00,$08,$04 MISLO DB $68,$6A,$6C,$6E,$70,$72,$74,$76 MISLO1 DB $78,$7A,$7C,$7E,$80,$82,$84,$86 SKFLAG DB $01,$02,$03,$04,$05,$05,$05,$04,$03,$02,$01 DLIST DB $70,$70,$70,$47,$00,$90,$02,$02 DB $02,$02,$02,$02,$02,$02,$02,$02 DB $02,$02,$02,$02,$02,$02,$02,$02 DB $02,$02,$02,$02,$02,$41,$00,$94 VTX DB $00,$01,$01,$01,$00,$FF,$FF,$FF ; THRUST VECTORS VTY DB $FF,$FF,$00,$01,$01,$01,$00,$FF SCLINE DB $33,$28,$29,$30,$03,$11,$00,$10,$10,$00 ; SCORE LINE DATA DB $00,$33,$28,$29,$30,$03,$12,$00,$10,$10 DERES DB $DD,$DD,$6B,$6B,$AA,$AA,$E6,$E6 DB $55,$55,$AA,$AA,$4A,$4A,$35,$35 DB $4A,$4A,$64,$64,$92,$92,$25,$25 DB $11,$11,$48,$48 *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 YOLPM0 DB 10 ; OLD Y POS SHIP YOLPM1 DB 10 YMSOL0 DS 1 ; OLD MISSILE Y POS YMSOL1 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 SCRCX DB 0 ; SCREEN X COUNTERS SCRCX1 DB 1 SCRCY DB 0 ; SCREEN Y COUNTERS SCRCY1 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 SCOR0D DS 1 ; DIGITS SCOR0T DS 1 ; TENS SCOR1D DS 1 SCOR1T 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 YOLPM0 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 YOLPM1 *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 SCRCY,X ; INCREMENT Y COUNTER LDA SCRCY,X CMP SKIPY,X ; IF MATCH UPDATE Y POS BGE AD1 JMP UPDATX *UPDATE Y PLAYER POSITION AD1 LDA #$00 ; PERFORM Y UPDATE STA SCRCY,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 SCRCX,X LDA SCRCX,X CMP SKIPX,X ; UPDATESCREEN POSITION EVERY SKIP TIME BGE AE1 JMP EE *UPDATE X PLAYER POSITION AE1 LDA #$00 STA SCRCX,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 SCOR0T ; INC TENS #0 LDA #$00 STA SCOR0D ; ZERO DIGITS #0 AM1 LDA KILL1 BEQ AM2 INC SCOR1D ; INC DIGITS #1 LDA SCOR1D CMP #$0A BNE AM2 INC SCOR1T LDA #$00 STA SCOR1D AM2 LDA SCOR0T CLC ADC #$10 STA SCREEN+7 ; PLACE IN SCREEN MEMORY LDA SCOR0D CLC ADC #$10 STA SCREEN+8 LDA SCOR1T CLC ADC #$10 STA SCREEN+18 LDA SCOR1D 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