.PAGE 'OMEGA004' ;*--------------------------------------------------* ;* SHIP'S MISSLE, MOVE, CHECK LIMIT AND COLLISION * ;* COLLISION CHECK SHIP TO ENEMY * ;*--------------------------------------------------* MSLMOV LDX #04 STX SPRIDX MSL100 LDX SPRIDX LDA SPRITA,X ;SPRITE EXIST? BPL MSL110 ;YES MSL104 DEC SPRIDX BPL MSL100 JMP ENMMSL ;ENEMY'S MISSLE MODULE MSL110 CPX #00 ;SHIP CHECK? BEQ MSL130 ;YES JSR SPRMOV ;SPRITE MOVE LDA WK5 ;MISSLE ARIVE LIMIT? BMI MSL130 ;NO ; ;----- MISSLE ARIVE LIMIT MSL120 LDA #$FF STA SPRITA,X ;OFF MISSLE MODE EOR MASKS,X AND SPENA STA SPENA ;OFF SPRITE ENABLE BIT LDA MASKS,X ;OFF X POINT MSB EOR #$FF AND MSIGX STA MSIGX JMP MSL300 ; ;----- COLLISION CHECK SHIP-MISSLE TO ANOTHER MSL130 LDA SPRITA ;SHIP LIVE? BMI MSL104 ;NO, NOT COLLISION CHECK LDX SPRIDX TXA ASL A TAY ;Y=X*2 LDA #00 STA WK1 LDA MASKS,X AND MSIGX ;GET X MSB BEQ *+4 INC WK1 ;SAVE IT LDA SP0X,Y ;GET X POINT STA WK0 ;SAVE IT LDA SP0Y,Y ;GET Y POINT STA WK2 ;SAVE IT LDA COLLSS ;GET SPRITE TO SPRITE AND MASKS,X ;COLLISION? BNE MSL140 ;YES JMP MSL200 ;NO, GO TO SPRITE TO CHRACTER ; ;----- SPRITE TO SPRITE MSL140 LDX #$07 MSL150 LDA SPRITA,X ;SPRITE EXIST? BPL MSL170 ;YES MSL160 DEX CPX #$04 BNE MSL150 JMP MSL200 ;CHECK END SPRITE TO SPRITE MSL170 JSR SPRSTS ;CHECK COLLISION POINT LDA SPRITA,X BPL MSL160 BMI MSL104 ;JMP ;*--------------------------------------------------* ;* SPRITE TO SPRITE COLLISION POINT CHECK * ;*--------------------------------------------------* SPRSTS TXA PHA ;PUSH X LDA COLLSS AND MASKS,X ;SPRITE N COLLISION? BNE *+5 ;YES JMP STS090 ;NO LDA SPRITA,X ;SPRITE N LIVE? BMI STS090 ;NO TXA ASL A TAY LDA SP0Y,Y STA WK5 ;WK5=SPNY LDA SP0X,Y STA WK3 ;WK3=SPNX L LDA #00 STA WK4 ;WK4=SPNX H LDA MSIGX AND MASKS,X BEQ *+4 INC WK4 LDA SPRITA,X CMP #02 ;ENEMY0? BCC STS010 ;NO LDA #08 ;Y1+12 < Y2+4 TRUE NOT COLLISION STA WK6 LDA #04 ;Y1+8 > Y2+12 TRUE NOT COLLISION STA WK7 LDA #06 ;X1+10 < X2+4 TRUE NOT COLLISION STA WK8 LDA #06+06 ;X1+6 > X2+12 TRUE NOT COLLISION STA WK9 JSR CKCOLL ;CHECK 8X8 COLLISION BCC STS090 ;NO COLLISION LDA #$25 ;2500 POINT BNE STS020 ;JMP STS010 LDA #10 ;Y1+12 < Y2+2 TRUE NOT COLLISION STA WK6 ; ;X1+12 < X2+2 TRUE NOT COLLISION STA WK8 LDA #11 ;Y1+2 > Y2+13 TRUE NOT COLLISION STA WK7 LDA #11+10 ;X1+2 > X2+13 TRUE NOT COLLISION STA WK9 JSR CKCOLL ;CHECK 16X16 COLLISION BCC STS090 ;NO COLLISION LDA #$15 ;1500 POINT CPX #07 BEQ STS030 ;YES STS020 JSR SCORUP ;SCORING STS030 LDA #$FF STA SPRITA,X ;KILL SPRITE N EOR MASKS,X AND SPENA STA SPENA LDX SPRIDX LDA #$80 STA SPRITA,X ;BOMB START STS090 PLA ;PULL X TAX RTS ; ;----- SPRITE TO CHARACTER ENEMY2 MSL200 LDX SPRIDX LDA COLLSC ;GET SPRITE TO CHRACTER AND MASKS,X ;COLLISION? BNE MSL204 ;YES JMP MSL104 ;THIS MISSLE NO COLLISION MSL204 LDX #$0A MSL210 LDA ENMY2A,X CMP #$FF ;ENEMY2 LIVE? BNE MSL230 ;YES MSL220 DEX BPL MSL210 JMP MSL300 ;NOT COLLISION ENEMY2, GO TO ENEMY3 CHECK MSL230 LDA EN2XPL,X STA WK3 LDA EN2XPH,X STA WK4 LDA EN2YP,X STA WK5 LDA #08 ;Y1+12 < Y2+2+2 TRUE NOT COLLISION STA WK6 LDA #07 ;Y1+8 > Y2+13+2 TRUE NOT COLLISION STA WK7 LDA #09 ;X1+10 < X2+2-1 TRUE NOT COLLISION STA WK8 LDA #06+09 ;X1+6 > X2+13-1 TRUE NOT COLLISION STA WK9 JSR CKCOLL ;CHECK 16X16 COLLISION BCC MSL220 ;NO COLLISION ; ;----- COLLISION ENEMY2 LDA #$10 ;1000 POINT JSR SCORUP ;SCORE UP LDA #$FF STA ENMY2A,X ;KILL ENEMY2 LDA SPRIDX JSR BADSET ;BOMB ADDRESS SET ; ;----- ENEMY2 CLEAR ON SCREEN JSR BITCHR ;GET SCREEN ADDRESS (WK0,WK1) CLC LDA WK0 STA WORK+$00 ADC #40 STA WORK+$06 LDA WK1 STA WORK+$01 ADC #00 STA WORK+$07 CLC LDA WK0 ADC #80 STA WORK+$0C LDA WK1 ADC #00 STA WORK+$0D LDA #00 STA WORK+$02 STA WORK+$03 STA WORK+$04 STA WORK+$08 STA WORK+$09 STA WORK+$0A STA WORK+$0E STA WORK+$0F STA WORK+$10 LDY #$FE STY WORK+$05 STY WORK+$0B INY STY WORK+$11 LDX #WORK JSR CHROUT LDX #GMFRAM JSR CHROUT MSL290 LDX SPRIDX LDA #$80 STA SPRITA,X ;BOMB START SPRITE 0---4 JMP MSL104 ; ;----- SPRITE TO CHARACTER ENEMY3 MSL300 LDX SPRIDX LDA COLLSC ;GET SPRITE TO CHRACTER AND MASKS,X ;COLLISION? BNE MSL304 ;YES JMP MSL104 ;THIS MISSLE NO COLLISION MSL304 LDX #07 MSL310 LDA ENMY3A,X ;ENEMY3 LIVE? CMP #$FF BNE MSL330 ;YES MSL320 DEX BPL MSL310 JMP MSL104 MSL330 LDA EN3YP,X STA WK5 LDA EN3XPL,X STA WK3 LDA EN3XPH,X STA WK4 LDA #06 ;Y1+12 < Y2+4+2 TRUE NOT COLLISION STA WK6 LDA #12 ;Y1+2 > Y2+12+2 TRUE NOT COLLISION STA WK7 LDA #09 ;X1+12 < X2+4-1 TRUE NOT COLLISION STA WK8 LDA #09+09 ;X1+2 > X2+12-1 TRUE NOT COLLISION STA WK9 JSR CKCOLL ;CHECK 8X8 COLLISION BCC MSL320 ;NO COLLISION ; ;----- COLLISION ENEMY3 LDA #$02 STA WK0 ;200 POINT LDA ENMY3A,X BEQ *+4 ASL WK0 LDA WK0 ;400 POINT JSR SCORUP ;SCORE UP LDA #$FF STA ENMY3A,X ;KILL ENEMY3 TXA CLC ADC #11 TAX LDA SPRIDX JSR BADSET ;BOMB ADDRESS SET JSR BITCHR ;GET SCREEN ADDRESS (WK0.WK1) LDA WK0 STA WORK+$00 LDA WK1 STA WORK+$01 LDY #00 STY WORK+$02 DEY STY WORK+$03 LDX #WORK JSR CHROUT ;CLEAR ENEMY3 MSL390 LDX SPRIDX LDA #$80 STA SPRITA,X ;BOMB START SPRITE 0---4 JMP MSL104 ;*--------------------------------------------------* ;* COLLISION CHECK * ;* INPUT: WK0 SOURCE X POINT L (X1) * ;* WK1 X POINT H * ;* WK2 Y POINT (Y1) * ;* WK3 DESTINATION X POINT L (X2) * ;* WK4 X POINT H * ;* WK5 Y POINT (Y2) * ;* WK6=J, J=N-M, (Y1)+M < (Y2)+N ? ,N=(Y2)+P ? ,P>Q * ;* WK8=R, R=S-T, (X1)+T < (X2)+S ? ,T=(X2)+V ? ,V>W * ;* Z=R+U * ;*--------------------------------------------------* CKCOLL ; ;----- CHECK Y COLLISION SEC ;WK5-WK6 >= WK2? LDA WK5 SBC WK6 CMP WK2 BCS CKCL80 ;NONE COLLISION CLC ;WK5+WK7 < WK2? LDA WK5 ADC WK7 CMP WK2 BCC CKCL80 ;NONE COLLISION ; ;----- CHECK X COLLISION SEC ;(WK3,WK4)-WK8 >= (WK0,WK1)? LDA WK3 SBC WK8 STA WK3 LDA WK4 SBC #00 STA WK4 SEC LDA WK3 SBC WK0 LDA WK4 SBC WK1 BCS CKCL80 ;NONE COLLISION LDA WK3 ;(WK3,WK4)+WK9 < (WK0,WK1)? ADC WK9 STA WK3 LDA WK4 ADC #00 STA WK4 SEC LDA WK3 SBC WK0 LDA WK4 SBC WK1 BCC CKCL80 ;NONE COLLISION RTS ;COLLISION EXIT CKCL80 CLC RTS ;NONE COLLISION EXIT ;*--------------------------------------------------* ;* SCORE UPDATE * ;*--------------------------------------------------* SCORUP STX WORK ;SAVE X-REG CMP #$10 BCC SCR010 DEC NUMENM ;DEC. ENEMY NUMBER BPL SCR010 ;NOT AT ALL ENEMY DONE LDA #$40 STA TIMER2 LDA #$7F STA TIMER3 ;SET NEW ROUND BIGEN WAIT TIME LDA #$0F ;BACK MUSIC CHENG STA SNDDAT LDA #$06 ;ALL KILL SOUND ON JSR SOUND SCR010 CLC SED ADC SCORE+1 STA SCORE+1 LDA SCORE+2 ADC #$00 STA SCORE+2 CLD JSR DSPSCR ;SCORE DISPLAY LDA XTRA ;CHECK FOR EXTRA SHIP BNE SCR090 ;ALREADY LDA SCORE+2 CMP #$04 BCC SCR090 LDA #01 STA XTRA INC NUMSHP JSR DSPSHP LDA #$01 ;BOUNUS SOUND JSR SOUND SCR090 LDX WORK RTS ;*--------------------------------------------------* ;* BOMB ADDRESS RESET * ;*--------------------------------------------------* BADSET STA WK0 ;SAVE MISSLE SPRITE INDEX ASL A TAY LDA EN2YP,X STA SP0Y,Y ;SET BOMB Y POINT LDA EN2XPL,X STA SP0X,Y ;SET BOMB X POINT LDY WK0 LDA EN2XPH,X BEQ BAD010 LDA MASKS,Y ORA MSIGX BNE BAD020 BAD010 LDA MASKS,Y EOR #$FF AND MSIGX BAD020 STA MSIGX ;SET BOMB X POINT MSB RTS ;*--------------------------------------------------* ;* BOMB DISPLAY BY SPRITE * ;*--------------------------------------------------* BMBSPR LDX #07 BMB005 LDA SPRITA,X BMI BMB020 BMB010 DEX BPL BMB005 RTS BMB020 CMP #$FF ;NONE USED ? BEQ BMB010 ;YES INC SPRITA,X LDA SPRITA,X CMP #$82 BEQ BMB060 ;BOMB0 DSP. CMP #$90 BEQ BMB07A ;BOMB1 DSP. CMP #$A0 BEQ BMB08A ;BOBN0 DSP. CMP #$B0 BNE BMB030 CPX #00 BNE BMB040 BMB030 CMP #$C0 BEQ BMB07A ;BOMB1 DSP. CMP #$D0 BEQ BMB08A ;BOMB0 DSP. CMP #$F0 BNE BMB010 ; ;----- BOMB OFF BMB040 LDA #$FF STA SPRITA,X ;KILL MODE LDA MASKS,X EOR #$FF AND SPENA STA SPENA ;SPRITE DISABLE LDA STABLE,X STA SV07F8,X LDA MASKS,X EOR #$FF AND MSIGX STA MSIGX ;OFF X MSB CPX #00 BNE BMB050 DEC NUMSHP ;SHIP COUNT DOWN LDA #$40 STA TIMER2 ;SET NEW ROUND WAIT TIME LDA #$7F STA TIMER3 LDA #BLACK STA EXTCOL ;BORDER COLOR STA BGCOL0 ;BACKGROUND COLOR 0 LDA KOLOR STA SP0COL STA SP1COL STA SP2COL JSR SPRCLR LDA #$85 ;EXPLOD. SOUND OFF JSR SOUND ;OFF BMB050 JSR SPRCLR ;USED RAM AREA CLEAR JMP BMB010 BMB07A JMP BMB070 BMB08A JMP BMB080 ; ;----- BOMB0 DISPLAY BMB060 LDY #$F8 ;$FE00 CPX #00 BEQ *+5 JMP BMB068 LDA #03 STA SPRITA+1 STA SPRITA+2 STA SPRITC+1 STA SPRITC+2 LDA #$00 STA SPRITD+1 LDA #$06 STA SPRITD+2 LDY #02 LDX #01 JSR SETEN0 LDY #03 LDX #02 JSR SETEN0 LDY #04 LDX #03 JSR SETEN0 LDA #BLACK STA SP0COL STA SP1COL STA SP2COL LDA SP0X STA SP1X STA SP2X LDA MSIGX AND #$01 BEQ BMB064 LDA #$0E ORA MSIGX STA MSIGX BMB064 LDA SP0Y STA SP1Y STA SP2Y LDA SPENA ORA #$0E STA SPENA LDY #$FA LDA #$83 ;THRUST SOUND OFF JSR SOUND LDX #$02 JSR WAIT LDA #$05 ;EXPLOD. ON JSR SOUND BNE BMB069 BMB068 LDA #$04 ;ENEMY BOMB JSR SOUND BMB069 TYA STA SV07F8,X ;SET SPRITE MAP JMP BMB010 ; ;----- BOMB1 DISPLAY BMB070 LDY #$F9 ;$FE40 CPX #00 BNE BMB074 LDA #ORANGE STA EXTCOL ; STA BGCOL0 ; INY INY BMB074 TYA STA SV07F8,X JMP BMB010 BMB080 LDY #$F8 ;$FE00 CPX #00 BNE BMB084 LDA #RED STA EXTCOL ; STA BGCOL0 ; STA TIMER3 INY INY BMB084 TYA STA SV07F8,X ;SET SPRITE MAP JMP BMB010 .END