12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124 |
- ** CMAIN.S **
- * CENTIPEDE MAIN LOOP
- * DVP 4/26/84 ALL PAUSE MODE CODE FROM GAMELOOP MOVED INTO CHKSTRT
- ORG $FF76
- DB 'GCC(C)1984'
- ORG $FFF8
- DB $FF,$C7
- DB L(BURP),H(BURP)
- DB L(RESET),H(RESET)
- DB L(RITS),H(RITS)
- ORG $D800
- BURP PHA ;THE RUDE ISR
- JMP (VECTORI)
- RESET
- SEI
- CLD
- * NOW ALIEN DOES THIS ALSO
- LDA #$17 ;ENCRYPTION CRAPOLA -- GO INTO MARIA
- STA $01 ; MODE.
- LDX #$7F
- STX CTRL
- LDX #$FF ;Initialize stack to be in PAGE ONE
- TXS
- INX
- TXA
- STA CTLSWA ;A=0 -- MAKE PORTS READ ONLY
- STA CTLSWB
- STA OFFSET $0038
- STA INTIM
- ZEROMEM STA $1E00,X KILL THAT LAST DL!!!!!
- STA $1F00,X
- STA $2000,X
- STA $2100,X
- STA $2700,X
- DEX
- BNE ZEROMEM
- JSR CLRTRACK
- JSR INITALL
- JSR ONSCREEN
- JSR OFFSCRN
- LDA #$43
- STA CTRL
- ******************************************
- * BEGIN MAIN LOOP OF GAME *
- ******************************************
- GAMELOOP
- JSR CHKSTRT ALL PAUSE MODE CODE NOW IN CHKSTRT
- JSR CHKEND
- JSR LOOSENDS
- JSR JOYSTICK
- JSR RESTOR
- JSR EXPLODE
- JSR FLEASCRP
- JSR MOVCENTI
- JSR NEWHD
- JSR MVSPIDER
- JSR SHOOT
- GAMEWAIT BIT OBJTBSEM ;WAIT UNTIL SEMAPHORE CLEARED BY LOADER
- BMI GAMEWAIT ; ENSURING THAT EVERY GAME PLAY GETS
- ; DISPLAYED AT LEAST ONCE
- LDA #$80 ;SET SEMAPHORE
- STA OBJTBSEM
- INC FRMCNT
- JMP GAMELOOP
- ******************************************
- * END MAIN LOOP OF GAME *
- ******************************************
- ;DEADEND JMP DEADEND ;NONMASKABLE INTERRUPT VECTOR
- ONSCREEN BIT MSTAT
- BMI ONSCREEN
- BIT MSTAT
- BMI ONSCREEN
- RTS
- OFFSCRN BIT MSTAT
- BPL OFFSCRN
- BIT MSTAT
- BPL OFFSCRN
- RTS
- ******************************************
- * Perform all initialization to get the system ready to do anything else -- sync
- * Maria with TV screen, etc.
- ******************************************
- INITALL
- LDA #L(MORPHO)
- STA VECTORI
- LDA #H(MORPHO)
- STA VECTORI+1
- LDA #H(STMPBASE)
- STA CHARBASE
- LDX #ENDLL-DLLTABLE ;LOAD DLL
- LODUPT LDA DLLTABLE,X
- STA DLL,X
- DEX
- BPL LODUPT
- LDA #L(DLL)
- STA DPL
- LDA #H(DLL)
- STA DPH
- LDA INPT4
- STA DEBOUNCE
- LDA #-12
- STA CLRINDEX
- LDX #$FF
- STX DEBOUNC1
- STX PANEL
- INX
- STX AUDV0
- STX AUDV1
- STX TPDL+1
- STX BACKGRND
- INX
- STX DIFLEVEL
- LDA #$80
- STA ATTRACT
- LDA #L(SHOT) ;INITIAL SHOT OFFSET
- STA SHOTOFST
- STA SHOTOFST+1
- LDA #60 ;ONE SECOND DELAYS
- STA OPTCNT2 ;NEXT OPTION
- STA SHOTTIMR ;GAME START
- *******************
- INITGAME LDA #0 ;GAME START INITIALIZATION, CLEAR
- LDX #2 ; SCORES
- CLRSCRLP STA SCORE0,X
- STA SCORE1,X
- STA SCORE2,X
- STA SCORE3,X
- DEX
- BPL CLRSCRLP
- JSR CLRTRACK
- LDX DIFLEVEL
- LDA DFNSEGS,X ;DFNSEGS DEFINED AT END OF INITALL
- STA MAXSGCNT
- STA CHAINSIZ
- STA CHAINSIZ+1
- *******************
- INITATGM LDA #0 ;ATTRACT MODE INITIALIZATION ENTRY PT.
- STA PAUSETMR
- STA FLAGS
- STA PLAYER
- STA NUMSEG
- STA FASTWAVE
- STA NEWHDFLG
- STA CLRINDEX+1
- STA HSCFLAG
- STA SHTRTIMR
- LDX #17 ;KILL ALL OBJECTS
- CLROBJLP STA OBJSTAT,X
- DEX
- BPL CLROBJLP
- STA MENLEFT ;CLEAR THE NUMBER OF MEN LEFT
- STA MENLEFT+1 ; VARIABLES AND DISPLAY
- STA P7C1 ;LOAD PALETTE 7 FOR BLANK
- LDA #$CA ;COLOR FOR HIGH SCORE
- STA P7C2
- LDA #$08
- STA P7C3 ;BORDER COLOR
- LDA #$10
- STA FASTWAVE+1
- LDX #0
- JSR CLRMAPZN
- LDA #$20 ;SET INITIAL BONUS VALUES
- STA BONUSL ; (CURRENTLY FIRST BONUS AT 12,000)
- STA BONUSL+1
- LDA #1
- STA BONUSM
- STA BONUSM+1
- LDA #$C0
- STA NHDCOUNT
- STA NHDCOUNT+1
- LDA #-12
- STA CLRINDEX
- LDA #CENTPCNT
- STA LETTRNUM
- JSR SHTRCLRS ;SUB. IN DEATH.S TO INIT. SHTR. COLORS
- * INITIAL SHOOTER, SHOT POSITION, STATUS, AND GRAPHICS
- BIT ATTRACT
- BMI NOPLRS
- JSR INITPLRS ;THIS SUBROUTINE IS IN DEATH
- NOPLRS JSR SCRAPALL
- * SET THE FIRST HEADER IN EACH DISPLAY LIST TO POINT TO THE CHARACTER MAP
- LOGOINIT ;LOGOINIT IS FOR HSC
- JSR SETATVAR
- JSR DLSTINIT ;SET FIRST HDR. IN EACH DL TO MAP
- JSR LOADPLWD
- JSR MAPINIT
- LDA ATTRACT
- BMI ENDINIT
- LDA GAMETYPE
- CMP #1
- BEQ MAP2INIT
- ENDINIT RTS
- DFNSEGS DB 10,10,11,12
- MAP2INIT LDA MUSHCNT
- STA MUSHCNT+1
- JSR SWAP
- ******************************************
- MAPINIT
- DSPLYOPT
- LDX #NZONES-2
- CLRMAPLP JSR CLRMAPZN
- DEX
- BNE CLRMAPLP
- LDA ATTRACT
- BPL LDSHROOM
- ************************************************************
- **** SUBROUTINE DSPLYOPT - - DISPLAY GAME OPTIONS IN MENU PAGE
- ************************************************************
- LDY DIFLEVEL ;DIFFICULTY LEVEL DISPLAY
- LDA DFLVLLOW,Y
- STA GTEMP1
- LDA DFLVLHGH,Y
- STA GTEMP2
- LDA DFPOS,Y
- TAX
- LDA DFLNGTH,Y
- TAY
- DFLVLLP LDA (GTEMP1),Y
- STA DFLVLDSP,X
- DEX
- DEY
- BPL DFLVLLP
- LDX GAMETYPE ;GAME OPTION DISPLAY
- LDA ALOW,X
- STA GTEMP1
- LDA AHIGH,X
- STA GTEMP2
- LDY #22
- AOPTLP LDA (GTEMP1),Y
- STA GMTYPDSP,Y
- DEY
- BPL AOPTLP
- ; CPX #1
- ; BNE ENDDSPOP
- ; LDA #L(TWOCTRLS)
- ; LDX #H(TWOCTRLS)
- ; LDY ALTCTRLS
- ; BEQ CTRLLN
- ; LDA #L(SHRTRCKB)
- ; LDX #H(SHRTRCKB)
- ;TRLLN STA GTEMP1
- ; STX GTEMP2
- ; LDY #14
- ;TRLLP LDA (GTEMP1),Y
- ; STA CTRLDSP+9,Y
- ; DEY
- ; BPL CTRLLP
- LDA ALTCTRLS
- BEQ ENDDSPOP
- LDY #14
- SHARELP LDA SHRTRCKB,Y
- STA CTRLDSP+9,Y
- DEY
- BPL SHARELP
- ENDDSPOP RTS
- ******************************************
- * Fill a mushroom map randomly.
- * The top 2 lines of PF don't get any mushrooms, next 14 get one or two per row,
- * next 6 get 1 per row, last row gets none.
- * Starting address of mushroom map, +3*ZONELEN, assumed to be in (GTEMP+1,GTEMP)
- * MUSHCNT for current player gets count of mushrooms in infield (bottom N rows)
- ******************************************
- LDSHROOM
- LDA #H(MUSHMAP+3*ZONELEN)
- STA GTEMP2
- LDA #L(MUSHMAP+3*ZONELEN)
- STA GTEMP1
- LDA #INFLDZN-4 ;First 9 lines, one or two mush. per
- STA NLOOPS ;line, no count
- RMLP1 LDX #2
- JSR RNDMUSH
- DEC NLOOPS
- BNE RMLP1
- LDA #0 ;PLAYER ALWAYS = 1 AT THIS POINT
- STA MUSHCNT ;GOING INTO INFIELD, CLEAR MUSHCNT
- LDA #NZONES-6-INFLDZN ;Next 5 lines, one or two per line but
- STA NLOOPS ;count
- RMLP2 LDX #2
- JSR RNDMUSH
- DEC NLOOPS
- BNE RMLP2
- LDA #6 ;Next 6 lines, one per row, count
- STA NLOOPS
- RMLP3 LDX #1
- JSR RNDMUSH
- DEC NLOOPS
- BNE RMLP3
- RTS
- ******************************************
- * Place a mushroom randomly in a row; return 0 if mushroom was already there,
- * 1 if new mushroom was placed
- * On entering, (GTEMP1+1,GTEMP1) should contain starting address of row
- ******************************************
- RNDMUSH JSR RANDOM ;Pick a random column between 1 and 32,
- AND #$1F
- BEQ ZNOMUSH
- TAY
- DEY ; then decrement onto line
- LDA (GTEMP1),Y ;What's already there?
- CMP #L(EMPTY)
- BNE ZNOMUSH
- LDA #L(LIVE) ;PUT IN MUSHROOM
- STA (GTEMP1),Y ;RETURN TRUE (Z=1) IF NEW MUSHROOM
- INC MUSHCNT
- ZNOMUSH DEX
- BNE RNDMUSH
- INCROW LDA GTEMP1
- CLC
- ADC #ZONELEN
- STA GTEMP1
- BCC ZNR001
- INC GTEMP2
- ZNR001 RTS
- CLRMAPZN LDA MMAPTBLL,X
- STA GTEMP1
- LDA MMAPTBLH,X
- STA GTEMP2
- LDY #ZONELEN-1
- LDA #L(EMPTY)
- ZCLRZNLP STA (GTEMP1),Y
- DEY
- BPL ZCLRZNLP
- RTS
- ***************************************************************************
- ******** SUBROUTINE LOOSENDS
- ******** HANDLE LOOSE ENDS (CHANGE WAVES AND PLAYERS, MAKE SHOOTERS AND
- ******** CENTIPEDES, ETC.
- ***************************************************************************
- LOOSENDS LDA SHTRTIMR
- BNE GOOP
- LDA DELAYSEG
- BNE SPDY
- LDA NUMSEG
- BEQ SPDY
- LDA #7
- CMP TUNNUM
- BEQ SPDY
- CMP TUNNUM1
- BEQ SPDY
- JSR TUNIN
- SPDY BIT SPDRSTAT
- BPL FLECK
- LDA SPDROFST
- CMP #L(POINT300)
- BCS FLECK
- LDA #1
- CMP TUNNUM
- BEQ FLECK
- CMP TUNNUM1
- BEQ FLECK
- JSR TUNIN
- FLECK LDA FLEAOFST
- CMP #L(EXPLOS)
- BCS GOOP
- LDA FLEASTAT
- AND #$C0
- CMP #$80
- BNE GOOP
- LDA #5
- CMP TUNNUM
- BEQ GOOP
- CMP TUNNUM1
- BEQ GOOP
- JSR TUNIN
- GOOP LDA NUMSEG
- BEQ SKPRTSS7
- ZSRTS1 RTS
- SKPRTSS7 BIT ATTRACT
- BPL NRMLMKCN
- LDA #12
- CLC
- ADC CLRINDEX
- CMP #TOPCOLOR
- BNE SKPRSTCL
- LDA #0
- SKPRSTCL STA CLRINDEX
- LDA #1
- STA COLORFLG
- DEC LETTRNUM
- BMI ATTROVER
- JMP NRML1234
- ATTROVER JSR HSATRACT
- BMI ZSRTS1 ;RETURN IF BUTTON PRESSED IN HSC
- LDA #$40
- STA ATTRACT ;CHANGE TO ATTRACT MODE GAME PLAY
- LDA #0
- STA ATGMTMR ;COUNT FOR ENDING ATTRACT MODE GAME
- ;BIT 7 OF ATGMTMR'S USED AS MOVEMENT
- ; FLAG IN JOYSTICK
- LDA #$80
- STA ATSITTMR ;COUNT FOR SHOOTER TO SIT/MOVE
- STA ATGMTMR+1
- LDA #$40
- STA ATSITTMR+1
- LDA #-1
- STA ATTSHTRY ;Y VECTOR FOR ATTRACT MODE SHOOTER
- STA ATTSHTRY+1
- JSR RANDOM
- AND #$01
- BNE SKPYDIR1
- LDA #-1
- SKPYDIR1 STA ATTSHTRX ;X VECTOR FOR ATTRACT MODE SHOOTER
- JSR RANDOM
- AND #$01
- BNE SKPYDIR2
- LDA #-1
- SKPYDIR2 STA ATTSHTRX+1 ;X VECTOR FOR ATTRACT MODE SHOOTER
- JMP INITATGM
- NRMLMKCN LDA #7 ;TURN OFF CENTIPEDE FEET SOUND
- JSR SCRAPONE
- LDX PLAYER ;ROTATE COLORS FOR NEXT CENTIEDE
- LDA GAMETYPE
- CMP #2
- BCC ZNRMLMK1
- LDX #0
- ZNRMLMK1 LDA CLRINDEX,X
- CLC
- ADC #12
- CMP #TOPCOLOR
- BNE SKPCLRST
- LDA #0
- SKPCLRST STA CLRINDEX,X
- LDA #1 ;SET FLAG TO CHANGE COLORS
- STA COLORFLG
- LDA FASTWAVE,X
- BEQ WVSPCHNG ;IF NOT A FAST SPEED WAVE
- DEC CHAINSIZ,X ;MAKE CENTIPEDE CHAIN ONE LINK SHORTER
- BNE SKPSGRST ;IF CHAIN SIZE IS NOT TOO SMALL
- LDA MAXSGCNT
- STA CHAINSIZ,X ;BACK TO FULL CENTIPEDE CHAIN
- SKPSGRST LDY PLAYER
- LDA GAMETYPE ;USE CORRECT SCORE FOR GAME TO
- CMP #2 ; DETERMINE WHETHER TO HAVE FAST/SLOW
- BCC FASTSLOW ; CENTIPEDES
- LDY #2
- CMP #2
- BNE FASTSLOW
- DEY
- LDA SCORE2+1
- CMP SCORE2
- BCS FASTSLOW
- DEY
- FASTSLOW LDA SCORE2,Y
- CMP #4
- LDA #$10
- BCS WAVEFAST ;IF SCORE IS >= 40,000
- WVSPCHNG LDA FASTWAVE,X
- EOR #$10
- WAVEFAST STA FASTWAVE,X ;CHANGE SPEED OF THE NEXT WAVE
- NRML1234 JMP MAKCENTI
- **************************************************************************
- ******** SUBROUTINE DLSTINIT
- ******** INITIALIZE DISPLAY LIST HEADERS TO POINT TO THE MUSHROOM MAP
- **************************************************************************
- DLSTINIT LDX #NZONES-2 ;MINUS 1 FOR INDEX, 1 FOR NO CHAR. MAP
- ; FOR LAST ROW
- NEXT LDA LDLTBL,X ;ADDRESS OF DL FOR ZONE X
- STA GTEMP1
- LDA HDLTBL,X
- STA GTEMP2
- LDY #0 ;WRITE HEADER
- LDA MMAPTBLL,X
- STA (GTEMP1),Y ;STORE LOW ADDRESS
- INY ;Y=1
- LDA #$60 ;INDIRECT, 160X2 WRITE MODE
- STA (GTEMP1),Y
- INY ;Y=2
- LDA MMAPTBLH,X
- STA (GTEMP1),Y ;STORE HIGH ADDRESS
- INY ;Y=3
- LDA #PALWIDTH
- STA (GTEMP1),Y ;STORE PALETTE AND WIDTH
- INY ;Y=4
- LDA #HORIZPOS
- STA (GTEMP1),Y ;STORE HORIZONTAL POSITION
- LDY #6
- LDA #0 ;END DL WITH 0 IN PALWIDTH
- STA (GTEMP1),Y
- DEX
- BNE NEXT ;DO ALL ZONES EXCEPT SCORE -- ZONE 1
- LDA ATTRACT
- BPL SCOREDL
- ******************************************
- * SET UP ATTRACT MODE DL'S
- ******************************************
- MKATTRDL
- LDX #4 ;BOTTOM HEADERS FOR LOGO DISPLAY LISTS
- NEXTATR LDA ATTRYBSE/8+LDLTBL,X
- STA GTEMP1
- LDA ATTRYBSE/8+HDLTBL,X
- STA GTEMP2
- LDY #0
- LDA LTITLGRP,X
- STA (GTEMP1),Y
- INY
- LDA PWATTBL,X
- STA (GTEMP1),Y
- INY
- LDA #H(TPG8LIN1)
- STA (GTEMP1),Y
- INY
- LDA XPOSOFFS,X
- CLC
- ADC #HORIZPOS
- STA (GTEMP1),Y
- LDY #5
- LDA #0
- STA (GTEMP1),Y
- SKPHDR2 DEX
- BPL NEXTATR
- ;;;;; LDA #0
- STA DL1+1
- LDA SCRTIMER ;IF NO PLAY FOR A WHILE, TURN SCORE OFF
- BMI NOSCRDL ;DURING TITLE PAGE
- ******************************************
- * SET UP SCORE ZONE DL'S
- ******************************************
- SCOREDL LDY #33 ;HIGH INDEX FOR GAME 3 SCORE DL
- LDA GAMETYPE
- CMP #3
- BEQ ZSCRDL
- LDY #16 ;HIGH INDEX FOR GAME 0, 1, 2 SCORE DL
- ZSCRDL LDX #16
- SCRDLLP LDA DLSCR012,Y
- STA DL1,X
- DEY
- DEX
- BPL SCRDLLP
- NOSCRDL RTS
- LTITLGRP DB L(TPG8LIN1),L(TPG8LIN2),L(TPG8LIN3),L(TPG8LIN4),L(TPG8LIN5)
- XPOSOFFS DB 16,16,0,0,40
- PWATTBL DB $C5,$C5,$C2,$C5,PWCOPYRT
- DLSCR012 DB L(MUSHMAP),$60,H(MUSHMAP),$14,HORIZPOS
- DB L(MUSHMAP+12),$60,H(MUSHMAP+12),$FA,12*4+HORIZPOS
- DB L(MUSHMAP+19),$60,H(MUSHMAP+19),$34,19*4+HORIZPOS,0,0
- DLSCR3 DB L(MUSHMAP),$60,H(MUSHMAP),$1A,HORIZPOS
- DB L(MUSHMAP+9),$60,H(MUSHMAP+9),$F2,9*4+HORIZPOS
- DB L(MUSHMAP+25),$60,H(MUSHMAP+25),$3A,25*4+HORIZPOS,0,0
- ***************************************************************************
- ********** SUBROUTINE LOADPLWD -- LOAD THE PALETTE/WIDTH TABLE
- ***************************************************************************
- LOADPLWD
- LDX MAXSGCNT
- DEX
- BMI ZNOCENTS ;IF MAXSGCNT WAS ZERO
- LDA #PWCENTI ;LOAD THE PAL/WD BYTES FOR CENTIPEDES
- ZLDPWCNT STA OBJPALWD,X
- DEX
- BPL ZLDPWCNT
- ZNOCENTS LDX MAXSGCNT
- LDA #PWSPIDER ;LOAD THE PAL/WD BYTE(S) FOR THE SPIDER
- ZLDPWSPI STA OBJPALWD,X
- INX
- CPX #13
- BNE ZLDPWSPI
- LDA #PWSCORP
- STA OBJPALWD+13
- LDA #PWSHOOTR ;LOAD THE PAL/WD BYTE FOR THE SHOOTER
- STA OBJPALWD+14
- ORA #$20
- STA OBJPALWD+15
- LDA #PWSHOT ;LOAD THE PAL/WD BYTE FOR THE SHOT
- STA OBJPALWD+16
- ORA #$20
- STA OBJPALWD+17
- RTS
- ****************************************************************
- * SET ATTRACT MODE DEPENDENT VARIABLES
- ****************************************************************
- SETATVAR LDA ATTRACT
- BMI ATTRVAR
- LDA #MAXX-5
- STA CENTRGHT
- LDA #MINX+2
- STA CENTLEFT
- LDA #0
- STA SCRLONZN
- STA TOPLINE
- LDA #8
- STA MINIMUMY
- RTS
- ATTRVAR LDA #MAXX-6
- STA CENTRGHT
- LDA #MINX+3
- STA CENTLEFT
- LDA #ATTRYBSE-8
- STA TOPLINE
- LDA #ATTRYBSE
- STA MINIMUMY
- LDA #ATTRYBSE/8-1
- STA SCRLONZN
- RTS
- RANDOM LDA FRMCNT
- RANDOM2 ADC RNDM
- ADC RNDM+1
- LDY RNDM
- STY RNDM+1
- STA RNDM
- RTS
- ******************************************
- * CHECK WHETHER WE'RE ABOUT TO MEET AN OBSTACLE (MUSHROOM)
- * ENTERED WITH ACC. = VERT. POS. OF MOVING OBJECT
- * GTEMP1 = HORIZ. POSITION
- * RETURNS WITH PLAYFIELD ADDRESS IN (GTEMP4,GTEMP3), CONTENTS OF ADDRESS IN ACC.
- ******************************************
- OBSTAC LSR A
- LSR A
- LSR A
- BPL OBBOTH ;ALWAYS
- COBSTAC LSR A
- LSR A
- LSR A
- ADC #0
- OBBOTH CMP #23
- BEQ OFFROWZZ
- TAY
- LDA GTEMP1 ; (X/4) - 4 , SAME AS (X-16)/4
- LSR A
- LSR A
- SEC
- SBC #MINX/4 ;SUBTRACTING 4, LEAVING CARRY SET
- BMI OFFROWZZ
- CMP #$1F
- BCC OBSTAC2
- OFFROWZZ LDA #0 ;SET Z FLAG
- RTS
- * ENTRY POINT FROM RESTORE ROUTINE, COLUMN IN ACC., ROW IN Y
- OBSTAC2 CLC
- ADC MMAPTBLL,Y
- STA GTEMP3
- LDA MMAPTBLH,Y ;INCREMENT HIGH BYTE IF NECESSARY
- ADC #0
- STA GTEMP4
- LDY #0
- LDA (GTEMP3),Y
- CMP #L(EMPTY)
- RTS
- ******************************************
- * ADD A MUSHROOM TO PLAYFIELD IF NOT ON LAST ROW
- * COUNT IF MUSHROOM ADDED TO INFIELD
- * ENTERED WITH ACC. = VERT. POS. OF OBJECT IN QUESTION
- * (GTEMP4,GTEMP3) POINTING TO PLAYFIELD ADDRESS IN QUESTION
- ******************************************
- MUSHER LSR A
- LSR A
- LSR A
- BPL MUBOTH ;ALWAYS
- CMUSHER LSR A
- LSR A
- LSR A
- ADC #0
- MUBOTH BEQ NOM001
- MUSHER1 CMP #23
- BEQ NOM001
- CMP #INFLDZN-1
- BCC NEWM001
- LDX PLAYER
- LDA GAMETYPE
- CMP #1
- BEQ INCMUSHC
- LDX #0 ;USE ONLY MUSHCNT, NOT MUSHCNT+1, IN
- ; DUAL PLAYER GAMES
- INCMUSHC INC MUSHCNT,X
- NEWM001 LDY #0
- LDA #L(LIVE)
- STA (GTEMP3),Y
- NOM001 RTS
- ******************************************
- * RESTORE MUSHROOMS AFTER PLAYER DIES *
- * FLAGS BIT 6 1=DO RESTORATION *
- * ROW COUNTER IN GTEMP5 *
- * COLUMN COUNTER IN GTEMP6 *
- ******************************************
- RESTOR BIT FLAGS
- BVC NOM001
- LDA FRMCNT
- AND #$07
- BNE NOM001
- LDX PLAYER
- LDA GAMETYPE
- CMP #2
- BCC RSTRNEXT ;NOT A DUAL PLAYER GAME
- LDX #1 ;ASSUME PLAYER 1 DIED
- LDA SHTRSTAT+1
- BNE RSTRNEXT ;YES -- PLAYER 2 DIDN'T DIE
- LDA SHTRSTAT ;PLAYER 2 DID DIE
- BNE DRSTR2 ; BUT PLAYER 1 DIDN'T
- LDA FRMCNT ;BOTH PLAYERS DIED -- TRADE OFF WHO
- AND #$08 ; GETS POINTS
- BEQ RSTRNEXT
- DRSTR2 DEX
- * START LOOP
- RSTRNEXT LDA GTEMP5 ;INCREMENT TO NEXT MUSHROOM
- CLC
- ADC #1
- CMP #NZONES-1
- BCC ROWRSTR
- INC GTEMP6
- LDA #1
- ROWRSTR STA GTEMP5
- TAY ;GET ROW
- LDA GTEMP6 ;COL IN A, ROW IN Y FOR OBSTAC2
- CMP #ZONELEN
- BCS DONERSTR
- JSR OBSTAC2 ;GET CONTENTS OF MUSHROOM SLOT
- CMP #L(EMPTY+1)
- BCC RSTRNEXT
- CMP #L(POISONED+1)
- BCS RSTRNEXT
- CMP #L(LIVE)
- BEQ RSTRNEXT
- LDA #L(LIVE)
- STA (GTEMP3),Y
- LDA #2
- JSR SCRAPONE
- LDA #2
- JSR TUNIN
- LDA #5
- ; LDY #0
- JSR ADDSCORE
- *PUT IN AN OBJECT EXPLOSION HERE
- LDX #14
- LDA SHTRSTAT
- BEQ USESHTR1
- INX
- USESHTR1 LDA #L(EXPLOS)
- STA OBJOFFST,X
- LDA GTEMP6
- ASL A
- ASL A
- ; CLC
- ADC #MINX
- STA OBJX,X
- LDA GTEMP5
- ASL A
- ASL A
- ASL A
- STA OBJY,X
- LDA #$80
- STA OBJSTAT,X
- RSTROK RTS
- DONERSTR LDA FLAGS ;CLEAR MUSHROOM RESTORATION FLAG,
- AND #$BF ; ALLOWING GAME TO CONTINUE
- STA FLAGS
- COMPOVER LDA GAMETYPE ;DUAL PLAYER COMPETITION GAME?
- CMP #2
- BNE RSTROK ;NO
- LDA FLAGS ;EITHER PLAYER DEAD?
- BPL RSTROK ;NO
- LDX #0 ;DEAD PLAYER'S SCORE >= LIVE PLAYER'S?
- BIT SHTRSTAT+1
- BVC HGHRYET
- INX
- HGHRYET JSR CMPSCORE
- BCS RSTROK ;YES
- LDA #0 ;NO, LIVE PLAYER AHEAD, AND WE HAVE A
- STA MENLEFT,Y ; DEFINITE WINNER
- LDA #15
- STA SHTRTIMR
- RTS
- * ADD TO SCORE
- * ENTERED WITH (A) = SCORE TO ADD TO TENS, ONES DIGITS
- * (Y) = SCORE TO ADD TO HUNDREDS, THOUSANDS
- * (X) = WHICH PLAYER GETS THE POINTS
- ADDSCORE BIT ATTRACT
- BVS RSTROK
- SED
- PHA
- LDA GAMETYPE
- CMP #3
- BNE ZADD1
- PLA ;IN TWO PLAYER TEAM PLAY MODE,
- PHA ; ADD TO INDIVIDUAL PLAYER'S SCORE
- CLC ; FIRST, THEN DOWN BELOW ADD TO TEAM
- ADC SCORE0,X ; SCORE
- STA SCORE0,X ;NO BONUSES OR ANYTHING ARE BASED ON
- TYA ; THE INDIVIDUAL SCORE
- ADC SCORE1,X
- STA SCORE1,X
- BCC TEAMADD
- LDA SCORE2,X
- ADC #0
- STA SCORE2,X
- TEAMADD LDX #2 ;TEAM SCORE INDEX
- ZADD1 PLA
- CLC
- ADC SCORE0,X
- STA SCORE0,X
- TYA
- ADC SCORE1,X
- STA SCORE1,X
- BCC BONUSCHK
- TXA
- TAY
- CPY #2
- BCC NHDPLYR
- LDY #0
- NHDPLYR LDA NHDCOUNT,Y ;CHANGE SPEED AT WHICH HEADS COME OUT
- SEC
- SBC #2 ; YES -- DECIMAL MODE
- CMP #4
- BCS SKPNHRST ;IF NEW HEAD TIMER IS ABOVE MINIMUM
- LDA #$C0
- SKPNHRST STA NHDCOUNT,Y ;BACK TO ITS SLOWEST RATE. WHEW!!
- LDA SCORE2,X ;NEED TO DO THIS DUE TO DECIMAL MODE
- CLC
- ADC #1
- STA SCORE2,X
- BCC BONUSCHK
- LDA SCORE3,X
- CLC
- ADC #1
- STA SCORE3,X
- BONUSCHK CLD ;CHECK FOR BONUS
- LDA GAMETYPE
- CMP #3
- BNE ZBONUSCH
- LDX #0
- LDA SCORE1+2
- CMP BONUSL
- LDA SCORE2+2
- JMP ZBONUSZ
- ZBONUSCH LDA SCORE1,X
- CMP BONUSL,X
- LDA SCORE2,X
- ZBONUSZ SBC BONUSM,X
- BCC NOBONUS
- CMP #$90
- BCS NOBONUS
- SED ;YES, GOT A BONUS--SET NEXT BONUS VALUE
- LDA #$20 ; (ONE EVERY 12,000 POINTS, NOW)
- ;;;; CLC
- ADC BONUSL,X
- STA BONUSL,X
- LDA #1
- ADC BONUSM,X
- STA BONUSM,X
- CLD
- LDA MENLEFT,X ;ADD A LIFE, IF POSSIBLE
- CMP #6
- BCS NOBONUS
- LDY GAMETYPE
- CPY #3
- BNE NORESMAN
- BIT FLAGS ;DURING MUSHROOM RESTORATION, JUST ADD
- BVS NORESMAN ; MAN TO TOTAL
- LDA SHTRSTAT ;IN TEAM PLAY, IF ONLY ONE PLAYER ALIVE
- AND SHTRSTAT+1 ; RES THE OTHER ONE IN
- BPL RESMAN
- NORESMAN LDA SHTRSTAT,X ;ONCE HE'S DEAD IN NON-TEAM PLAY, DON'T
- AND #$40 ; EVER BRING HIM BACK
- BNE NOBONUS
- LDA MENLEFT,X
- CLC
- ADC #1
- STA MENLEFT,X
- CPX #0
- BEQ ADDLIFE1
- ADDLIFE2 EOR #$FF
- CLC
- ADC #21
- ADDLIFE1 ;LDY GAMETYPE
- CPY #3
- BNE ADD1
- CLC
- ADC #TEAMMEN-6
- ADD1 TAY
- LDA #L(ELF320)
- STA MUSHMAP+6-1,Y
- MANSOUND LDA #6 ;TURN ON EXTRA MAN SOUND
- JSR TUNIN
- NOBONUS BIT FLAGS
- BVS ENDBONUS
- JMP COMPOVER
- ENDBONUS RTS
- RESMAN ;RES A MAN INTO PLAY, TEAM PLAY
- LDX #0
- LDA SHTRSTAT
- BPL RESBACK
- LDX #1
- RESBACK LDA FLAGS
- AND #$7F
- STA FLAGS
- LDA #CNTRCLMN
- STA SHOOTERX,X
- LDA #CNTRCLMN+2
- STA SHOTX,X
- LDY #184
- STY SHOOTERY,X
- DEY
- STY SHOTY,X
- LDA #L(ELF)
- CPX #0
- BEQ RESELF
- LDA #L(ELFB)
- RESELF STA SHTROFST,X
- LDA #$90 ;TURN HIM BACK ON, RES HIM IN
- RESFRONT STA SHTRSTAT,X
- JMP MANSOUND
- SCALE CLC
- BPL NOTNEG
- EOR #$FF
- ADC #2 ;TWOS COMP AND ADD 1
- LSR A ;DIVIDED BY 2
- CMP #$3
- BCC OKDOKEY
- LDA #$3
- OKDOKEY
- EOR #$FF ;RENEGE
- CLC
- ADC #1
- RTS ;SCALED VALUE IN ACC
- NOTNEG
- ADC #1
- LSR A
- CMP #$3
- BCC RETUX
- LDA #$3
- RETUX RTS
- CLRTRACK LDX #$06 ;CLEAR OUT ALL TBALL STUFF
- LDA #$00
- TLOOPY STA DELTAY,X
- DEX
- BPL TLOOPY
- STX BUTNIB
- STX BUTNIB+1
- STX SCHTICK
- LDA YCOUNT
- STA OLDY
- LDA YCOUNT1
- STA OLDY1
- LDA XCOUNT
- STA OLDX
- LDA XCOUNT1
- STA OLDX1
- RTS
|