;›; Shooting stars by Dennis Fox›;››; Page zero usage››PBASE = $CB ;POINTERS TO...›MBASE = $CD ;MISSILES,›BASE2 = $CF ;PLAYER1,›BASE3 = $D1 ;PLAYER2,›BASE4 = $D3 ;PLAYER3,›ADDR = $D5 ;2-BYTE POINTER››; Page 6 usage››X = $600›Y = $601›XM = $610›YM = $620›DM = $630›T1 = $640›T2 = $641›TI1 = $642›TI2 = $643›HIT = $645›LIFE = $650›TI3 = $660›TI4 = $6A0›ELF = $6A1›SF1 = $6A2›STIME = $6A3››; Operating system equates››ATTRAC = $4D ;ATTRACT MODE POINTER›PCOLR0 = $2C0 ;PLAYER COLORS›PCOLR1 = $2C1›PCOLR2 = $2C2›PCOLR3 = $2C3›COLOR0 = $2C4 ;PLAYFIELD COLORS›COLOR1 = $2C5›COLOR2 = $2C6›COLOR3 = $2C7›COLOR4 = $2C8›SDMCTL = $22F ;DMA CONTROL›SDLSTL = $230 ;DISP LIST POINTER›SDLSTH = $231›STICK0 = $278 ;JOYSTICK›STRIG0 = $284 ;STICK BUTTON›HITCLR = $D01E ;COLLISION CLEAR›HPOSP0 = $D000 ;P/M HOR. POSITIONS›HPOSP1 = $D001›HPOSP2 = $D002›HPOSP3 = $D003›HPOSM0 = $D004›HPOSM1 = $D005›HPOSM2 = $D006›HPOSM3 = $D007›M1PL = $D009 ;COLLISION REGISTERS›M2PL = $D00A›M3PL = $D00B›P1PL = $D00D›P2PL = $D00E›P3PL = $D00F›GRACTL = $D01D ;GRAPHIC CONTROL›CONSOL = $D01F ;CONSOLE BUTTONS›AUDF1 = $D200 ;AUDIO CONTROLS›AUDC1 = $D201›AUDF2 = $D202›AUDC2 = $D203›RANDOM = $D20A ;RANDOM #›PMBASE = $D407 ;P/M START ADDR›SETVBV = $E45C ;VERT BLANK SET VECTOR›XITVBV = $E462 ;VERT BLANK EXIT››; set up screen and display list›› ORG $2000››SSTAR LDX #9› LDA #$FF›SETTB STA SCRNA,X ;SET TOP...› STA SCRNC,X ;AND BOTTOM...› DEX ;OF SCREEN› BPL SETTB› LDX #41› LDA #SCRNB/256 ;POINT TO...› STA ADDR+1 ;MIDDLE OF SCREEN› LDA #SCRNB&255› STA ADDR›SETMID LDY #9›MIDLP LDA MIDBYT,Y ;COPY MIDDLE BYTES...› STA (ADDR),Y ;TO SCREEN RAM› DEY› BPL MIDLP› LDA ADDR ;NOW ADD 10 BYTES...› CLC ;TO POINT TO...› ADC #10 ;NEXT LINE› STA ADDR› LDA ADDR+1› ADC #0› STA ADDR+1› DEX ;ANOTHER LINE?› BPL SETMID ;YES!› LDA #DLIST&255 ;POINT TO› STA SDLSTL ;DISPLAY› LDA #DLIST/256 ;LIST› STA SDLSTH› LDA #$00 ;SET LOW BYTES...› STA MBASE ;OF P/M POINTERS› STA PBASE› STA BASE2› STA BASE3› STA BASE4› LDA #$33 ;NOW SET HI BYTES› STA MBASE+1 ;TO POINT TO› LDA #$34 ;VARIOUS P/M AREAS› STA PBASE+1› LDA #$35› STA BASE2+1› LDA #$36› STA BASE3+1› LDA #$37› STA BASE4+1››; Set players starting position››START2 LDA #16 ;INITIALIZE TIMERS› STA TI1› STA TI2› STA TI4› LDA #$00› STA ELF› STA SF1› STA STIME› STA TI3› LDA #5 ;START W/5 LIVES› STA LIFE›START LDA #180 ;SET UP...› STA X ;ASTRONAUT X› LDA RANDOM ;NOW GET...› LSR A ;RANDOM #› CLC ;AND SET UP› ADC #55 ;ASTRONAUT Y› STA Y››; Set missles horizontal position›› LDX #$00 ;GET RANDOM...›L1 LDA RANDOM ;HORIZONTAL› LSR A ;POSITION,› LSR A ;MAKE SURE IT'S› ADC #50 ;ON SCREEN,› STA XM,X ;STORE IT› INX ;NEXT MISSILE› CPX #6 ;ALL DONE?› BNE L1 ;NOT YET!››; Set missles vertical position›› LDX #$00 ;START W/MISSILE 0›L2 TXA ;GET MISSILE #› ASL A ;MULTIPLY...› ASL A ;MISSILE...› ASL A ;NUMBER...› ASL A ;BY 32,› ASL A ;MAKE SURE IT'S...› ADC #55 ;ON SCREEN,› STA YM,X ;AND STORE IT!› INX ;NEXT MISSILE› CPX #6 ;ALL DONE?› BNE L2 ;NOT YET!››; Set missiles' starting directions›› LDX #$00›L3 LDA RANDOM ;GET RANDOM...› AND #$03 ;DIRECTION› STA DM,X ;AND STORE› INX ;NEXT MISSILE› CPX #6 ;ALL DONE?› BNE L3 ;NOT YET!››; Set up player missile graphics›; Single line resolution›› LDA #$30 ;POINT TO P/M AREA› STA PMBASE› LDA #62 ;TURN ON SCREEN› STA SDMCTL› LDA #3 ;SET P/M GRAPHICS› STA GRACTL› LDA #$00 ;NOW CLEAR OUT...› TAY ;ALL MISSILES›A1 STA (PBASE),Y ;AND PLAYERS› STA (MBASE),Y› STA (BASE2),Y› STA (BASE3),Y› STA (BASE4),Y› INY› BNE A1› LDA #$00 ;NO COLLISION!› STA HIT› STA HITCLR› LDA #$46 ;SET UP COLORS› STA PCOLR0› LDA #15› STA PCOLR1› STA PCOLR2› STA PCOLR3› LDA #150› STA COLOR1› LDA #54› STA COLOR2› LDA #$F8› STA COLOR0› LDA #3› STA T2› LDA #$07 ;NOW START UP...› LDX #VBI/256 ;OUR VERTICAL BLANK...› LDY #VBI&255 ;INTERRUPT!› JSR SETVBV››; The game begins here››BACK LDA CONSOL ;CHECK CONSOLE KEYS› CMP #6 ;START PRESSED?› BNE JOY2 ;NOPE!› JMP DEATH ;GO TO RESTART!››; Read joystick››JOY2 LDA STICK0 ;GET ASTRONAUT...› AND #1 ;DIRECTION› BNE O1› DEC Y ;UP›O1 LDA STICK0› AND #$08› BNE O2› INC X ;RIGHT›O2 LDA STICK0› AND #$02› BNE O3› INC Y ;DOWN›O3 LDA STICK0› AND #$04› BNE O4› DEC X ;LEFT›O4 LDA X ;GET ASTRO. X› CMP #200 ;TOO FAR RIGHT?› BNE O5 ;IT'S OK› DEC X ;TOO FAR!›O5 LDA X› CMP #50 ;TOO FAR LEFT?› BNE O6 ;OK.› INC X ;TOO FAR!›O6 LDA Y ;GET ASTRO. Y› CMP #52 ;TOO FAR UP?› BNE O7 ;OK.› INC Y ;TOO FAR!›O7 LDA Y› CMP #200 ;TOO FAR DOWN?› BNE O8 ;OK.› DEC Y ;TOO FAR!››; Put astronaut on playfield››O8 LDA X ;GO AHEAD AND SET...› STA HPOSP0 ;HOR. POSITION› LDX #$00 ;NOW COPY THE...› LDY Y ;ASTRONAUT IMAGE...›B1 LDA ANAUT,X ;INTO PLAYER 1› STA (PBASE),Y› INX› INY› CPX #19› BNE B1››; Move missiles›› LDX #$00›D0 LDA DM,X ;GET MISSILE DIR.› BNE D1› INC XM,X ;RIGHT...› DEC YM,X ;AND UP›D1 LDA DM,X› CMP #1› BNE D2› INC XM,X ;RIGHT...› INC YM,X ;AND DOWN!›D2 LDA DM,X› CMP #2› BNE D3› DEC XM,X ;LEFT...› INC YM,X ;AND DOWN!›D3 LDA DM,X› CMP #3› BNE DO1› DEC XM,X ;LEFT...› DEC YM,X ;AND UP!›DO1 INX ;NEXT MISSILE› CPX #6 ;ALL DONE?› BNE D0 ;NO, DO OTHERS!››; Check if missile has hit wall›› LDX #$00›C0 LDA XM,X ;GET X POS.› CMP #202 ;TOO FAR RIGHT?› BNE C1 ;IT'S OK.› LDA DM,X ;IT'S TOO FAR,› BNE DI1 ;WE MUST REVERSE› LDA #3 ;THE DIRECTION!› STA DM,X› CLC› BCC C1›DI1 LDA #2› STA DM,X›C1 LDA XM,X ;GET X POS.› CMP #48 ;TOO FAR LEFT?› BNE C2 ;OK.› LDA DM,X ;REVERSE DIRECTION!› CMP #2› BEQ DI2› LDA #0› STA DM,X› CLC› BCC C2›DI2 LDA #1› STA DM,X›C2 LDA YM,X ;GET Y POS.› CMP #52 ;TOO FAR UP?› BNE C3 ;OK.› LDA DM,X ;REVERSE!› BNE DI3› LDA #1› STA DM,X› CLC› BCC C3›DI3 LDA #2› STA DM,X›C3 LDA YM,X ;GET Y POS.› CMP #213 ;TOO FAR DOWN?› BNE C4 ;OK.› LDA DM,X ;REVERSE!› CMP #1› BNE DY2› LDA #$00› STA DM,X› CLC› BCC C4›DY2 LDA #3› STA DM,X›C4 INX ;NEXT MISSILE› CPX #6 ;ALL DONE?› BNE C0 ;NO, DO OTHERS!››; Plot missiles on playfield›› LDA XM ;SET ALL MISSILES...› STA HPOSP1 ;HORIZONTAL...› LDA XM+1 ;POSITIONS!› STA HPOSP2› LDA XM+2› STA HPOSP3› LDA XM+3› STA HPOSM1› LDA XM+4› STA HPOSM2› LDA XM+5› STA HPOSM3› LDA #$00 ;PLOT 1ST MISSILE› LDY YM ;IN PLAYER 1› STA (BASE2),Y› LDA #$10› INY› STA (BASE2),Y› INY› STA (BASE2),Y› LDA #$00› INY› STA (BASE2),Y› LDA #$00 ;PLOT 2ND MISSILE› LDY YM+1 ;IN PLAYER 2› STA (BASE3),Y› LDA #$10› INY› STA (BASE3),Y› INY› STA (BASE3),Y› LDA #$00› INY› STA (BASE3),Y› LDA #$00 ;PLOT 3RD MISSILE› LDY YM+2 ;IN PLAYER 3› STA (BASE4),Y› LDA #$10› INY› STA (BASE4),Y› INY› STA (BASE4),Y› LDA #$00› INY› STA (BASE4),Y› LDA #$EF ;PLOT 4TH MISSILE› LDY YM+3 ;IN MISSILE 1› AND (MBASE),Y› STA (MBASE),Y› LDA #$10› INY› ORA (MBASE),Y› STA (MBASE),Y› LDA #$10› INY› ORA (MBASE),Y› STA (MBASE),Y› LDA #$EF ;PLOT 5TH MISSILE› INY ;IN MISSILE 2› AND (MBASE),Y› STA (MBASE),Y› LDA #$FB› LDY YM+4› AND (MBASE),Y› STA (MBASE),Y› LDA #$04› INY› ORA (MBASE),Y› STA (MBASE),Y› LDA #$04› INY› ORA (MBASE),Y› STA (MBASE),Y› LDA #$FB ;PLOT 6TH MISSILE› INY ;IN MISSILE 3› AND (MBASE),Y› STA (MBASE),Y› LDA #$BF› LDY YM+5› AND (MBASE),Y› STA (MBASE),Y› LDA #$40› INY› ORA (MBASE),Y› STA (MBASE),Y› LDA #$40› INY› ORA (MBASE),Y› STA (MBASE),Y› LDA #$BF› INY› AND (MBASE),Y› STA (MBASE),Y››; Create sound›› INC T1› LDA T1› CMP #$10› BNE SO1› LDA #$00› STA T1› DEC T2› LDA T2› BNE SO2› LDA #3› STA T2›SO2 LDA #$C8 ;SET SOUND CONTROL› STA AUDC2› LDA T2 ;GET SOUND NUMBER› CMP #3 ;SOUND 3?› BNE S2 ;NO!› LDA #120 ;SET 3RD...› STA AUDF2 ;SOUND FREQUENCY› CLC› BCC SO1 ;GO SHOW TIME›S2 LDA T2› CMP #2 ;SOUND 2?› BNE S3 ;NO!› LDA #100 ;SET 2ND...› STA AUDF2 ;SOUND FREQUENCY› CLC› BCC SO1 ;AND SHOW TIME›S3 LDA #85 ;SET 1ST› STA AUDF2 ;SOUNC FREQUENCY›SO1 LDA TI1 ;SHOW DIGIT 1...› STA SCREEN+9 ;OF SECONDS› LDA TI2 ;SHOW DIGIT 2...› STA SCREEN+10 ;OF SECONDS› LDA TI4 ;SHOW MINUTES!› STA SCREEN+7››; Check for extra life›› LDA TI4 ;GET MINUTES› CMP #19 ;3 MINUTES?› BNE OELC ;NO!› LDA ELF ;DONE EXTRA LIFE YET?› BNE OELC ;YES, NO MORE!› INC LIFE ;ANOTHER LIFE› INC ELF ;SET EXTRA LIFE FLAG› LDA #$A4 ;SET UP FOR...› STA AUDC1 ;EXTRA LIFE SOUND› LDA #$01› STA SF1›OELC LDA TI4 ;GET MINUTES› CMP #21 ;5 MINUTES?› BNE OEL ;NO!› LDA ELF ;GOT 2ND EXTRA?› CMP #1› BNE OEL ;NO MORE!› INC LIFE ;ANOTHER LIFE!› INC ELF ;INC EXTRA LIFE FLAG› LDA #$A4 ;SET UP FOR...› STA AUDC1 ;EXTRA LIFE SOUND› LDA #$01› STA SF1››; Check for ending sequence››OEL LDA HIT ;ASTRO HIT DEBRIS?› BEQ NEND ;NO, HE'S OK.› JMP END ;UH-OH!›NEND LDA #80 ;THIS SECTION› LSR TI1 ;CREATES A TIME› PHP ;DELAY USING› SEC ;THE TIME VARIABLES› SBC TI1 ;TI1 AND TI4› PLP› ROL TI1› LDX #$00›SMOR SBC TI4› INX› CPX #3› BNE SMOR› TAX›TD1 LDY #$00 ;THIS IS A›TD2 INY ;TIME DELAY› BNE TD2 ;ROUTINE!› DEX› BNE TD1››; Play extra life sound›› LDA SF1 ;GET BONUS SOUND FLAG› CMP #1 ;FIRST FREQ?› BNE SC2 ;NO!› LDA #50 ;SET 1ST BONUS FREQ.› STA AUDF1› INC STIME ;INC SOUND TIMER› LDA STIME› CMP #$25 ;END OF SOUND?› BNE SC2 ;NOT YET!› INC SF1 ;NEXT FREQ› LDA #$00 ;NO MORE SOUND!› STA STIME›SC2 LDA SF1 ;GET BONUS SOUND FLAG› CMP #2 ;SECOND FREQ?› BNE SC3 ;NO!› LDA #40 ;SET FREQ.› STA AUDF1› INC STIME ;INCREMENT TIMER› LDA STIME› CMP #$25 ;SOUND DONE?› BNE SC3 ;NO!› INC SF1 ;NEXT FREQ› LDA #$00 ;ALL DONE!› STA STIME›SC3 LDA SF1 ;GET BONUS SOUND FLAG› CMP #3 ;3RD FREQ?› BNE SC4 ;NO!› LDA #32 ;SET FREQ.› STA AUDF1› INC STIME ;INC SOUND TIMER› LDA STIME› CMP #$25 ;SOUND DONE?› BNE SC4 ;NO!› INC SF1 ;SET FOR END› LDA #$00 ;ALL DONE!› STA STIME›SC4 LDA SF1 ;GET BONUS SOUND FLAG› CMP #4 ;END OF SOUND?› BNE SC5 ;NO!› LDA #00 ;SHUT OFF SOUND!› STA AUDF1› STA AUDC1› LDA #$00 ;ALL DONE!› STA STIME›SC5 LDA #138 ;UPDATE LIVES...› LDX #$00 ;DISPLAY›DMORE STA SCREEN+13,X ;ALL LIVES› INX› CPX LIFE› BNE DMORE› JMP BACK›END DEC LIFE ;1 LESS LIFE› LDA #$A8 ;INIT DEATH SOUND› STA AUDC1› STA AUDC2› LDA #50 ;INIT FREQ.›SA STA AUDF1› PHA› CLC› ADC #100 ;INCREMENT SOUND› STA AUDF2› STA PCOLR0 ;FLASH ASTRONAUT› PLA› LDY #$00 ;TIME DELAY›DLY2 LDX #$00›DLY1 INX› BNE DLY1› INY› CPY #25› BNE DLY2› CLC› ADC #$01› CMP #100 ;END OF DEATH?› BNE SA ;NO, LOOP BACK› LDA #$00 ;SHUT OFF SOUND› STA AUDF1› STA AUDC1› STA AUDF2› STA AUDC2› LDA #$46 ;RESET...› STA PCOLR0 ;ASTRONAUT COLOR› LDA #$00 ;REMOVE...› LDY LIFE ;LIFE INDICATOR...› STA SCREEN+13,Y ;FROM SCREEN› LDA LIFE ;ANY MORE LIVES?› BEQ DEATH ;NO! END OF GAME!› JMP START ;ANOTHER LIFE.›DEATH LDA #00 ;ZERO LIVES› STA LIFE›AGAIN LDA STRIG0 ;STICK TRIGGER PRESSED?› BEQ RESTRT ;YES!› LDA CONSOL ;GET CONSOLE KEY› CMP #6 ;START PRESSED?› BNE AGAIN ;NO!›RESTRT LDA #$00 ;RESET...› STA ATTRAC ;ATTRACT MODE› JMP START2 ;RESTART GAME.››; Vertical blank interrupt››VBI LDA M1PL ;GET...› ORA M2PL ;ALL...› ORA M3PL ;COLLISION...› ORA P1PL ;REGISTERS...› ORA P2PL ;AND CHECK...› ORA P3PL ;FOR...› AND #1 ;ASTRONAUT...› STA HIT ;COLLISION!› INC TI3 ;INCREMENT 1/60 SEC.› LDA TI3 ;TIMER› CMP #60 ;ANOTHER SECOND?› BNE TOVR ;NO!› LDA #$00 ;RESET 60THS OF SEC› STA TI3› INC TI2 ;ANOTHER SEC› LDA TI2› CMP #26 ;10 SECS?› BNE TOVR ;NO!› LDA #16 ;RESET 2ND SECOND...› STA TI2 ;DIGIT TO 0› INC TI1 ;INCREMENT 1ST...› LDA TI1 ;SECOND DIGIT› CMP #22 ;GOT A MINUTE?› BNE TOVR ;NO!› INC TI4 ;INCREMENT MINUTES› LDA #16 ;RESET 1ST SECOND...› STA TI1 ;DIGIT TO 0›TOVR JMP XITVBV ;EXIT VERT BLANK!››; Set up display list››DLIST DB 112,112,112,71› DW SCREEN› DB 9,9,9,9,9,9,9,9,9,9› DB 9,9,9,9,9,9,9,9,9,9› DB 9,9,9,9,9,9,9,9,9,9› DB 9,9,9,9,9,9,9,9,9,9› DB 9,9,9,9› DB 65› DW DLIST››; Data for astronaut image››ANAUT DB $00,$7C,$54,$6C,$7C,$44,$7C,$10,$10,$FE,$BA,$BA› DB $BA,$38,$38,$28,$28,$EE,$00››; Set up screen memory››MIDBYT DB 128,0,0,0,0,0,0,0,0,1›SCREEN DB 0,0,116,105,109,101,0,0,26,0,0,0,0,0,0,0,0,0,0,0›SCRNA DS 10›SCRNB DS 420›SCRNC DS 10›› END SSTAR›