123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774 |
- ; INIT2.S
- ; THIS ROUTINE HAS TO PICK BOTH RANDOM X AND RANDOM Y (DLIST). IT WILL
- ; ONLY ALLOW TWO PILES PER DLIST, AND USES "CINFO" AS A COUNTER ARRAY.
- ; THIS ROUTINE STARTS INSERTING PILES AT "PILESTRT", AND CONTINUES
- ; UNTIL "NUMHOLES" (WHICH HAS BEEN SET TO "PILESTRT+NUMHOLES").
- ; IF A BANANA OR TOMATO PILE GREATER THAN 4 IS DISPLAYED,
- ; "NUMHOLES" WILL BE INCREMENTED.
- PILEDRAW
- MOVE #PILESTRT,NEXTPILE ; FOR USE AT END OF RACK
- LDX PLRACK
- CPX #5 ; RACKS ABOVE 5 HAVE 8 PILES
- BPL ZPP00 ; IF RACK IS HIGHER, USE MAX. NUMBER
- MOVE #4,TEMP3 else 4 piles per zone (RACKS 0-4)
- LDA NUMPTAB,X
- CLC
- ADC #PILESTRT ; INDEX FROM BEGINNING OF PILES
- STA INDEX ; ACTUAL NUMBER + #PILESTRT
- LDX #PILESTRT ; INDEX TO START WITH
- BPL ZPP01
- ZPP00 LDA #PILESTRT+NUMPILES
- STA INDEX
- MOVE #8,TEMP3 8 piles per zone
- LDX #PILESTRT ; INDEX TO START WITH
- ZPP01 JSR RANDOMX ; RESULT IN A
- STA FXPOS,X
- ; DON'T LET A GIVEN ZONE CONTAIN MORE PILE ENTRIES THAN 2. THE INFORMATION
- ; FOR THE NUMBER OF PILES SO FAR IS CONTAINED IN THE ARRAY "CINFO".
- ; UPDATE: HIGHER RACKS HAVE SO MANY PILES THAT EACH ZONE MUST BE
- ; ALLOWED TO CONTAIN MORE THAN 2 ENTRIES. MAKE IT 3 IF
- ; "NUMPILES" IS >= 9.
- ZPP02 JSR RANDOMY ; REGISTER A CONTAINS A ZONE NUMBER
- STA TEMP4 ; CONTAINS THE HALF-ZONE
- LSR A ; NOW A CONTAINS THE ACTUAL ZONE
- TAY ; INDEX INTO DLIST COUNTER (CINFO)
- LDA CINFO,Y
- CMP TEMP3 ; THE NUMBER OF PILES PER ZONE IS
- BPL ZPP02 ; DETERMINED FROM "NUMPTAB"
- ; NOW SET THE ACTUAL COORDINATE BY MULTIPLYING THE ZONE HALF BY 8 AND ADDING
- ; 7 TO GET THE TOP OF THE ZONE HALF.
- LDA TEMP4 ; ZONE HALF
- ASL A ; TIMES 8
- ASL A
- ASL A
- ORA #$07
- STA FYPOS,X
- ; NOW PICK A FOOD TYPE AND A NUMBER OF FOODS FOR THE PILE.
- ; move this here so that SPACEm can be called twice if necessary.
- LDA PLBCD if one of the top two digits is set,
- BNE NOTRAND then it's not the first 4 racks
- LDA PLBCD+1
- CMP #4
- BCC ZPPRAND ; IF THE FIRST 4 RACKS
- NOTRAND
- LDA PLBCD+1 we don't want PLBCD !
- AND #$F
- STX TEMP1 ; SAVE X FOR THIS TRICK
- TAX
- LDA RACKTYPE,X
- LDX TEMP1
- CMP #$80
- BEQ ZPPRAND ; TYPE $80 = RANDOM
- CMP #$FF
- BNE ZPP041 ; TYPE $FF = SOME WATERMELONS
- ; BEQ ZPPSOME
- ZPPSOME CPX #PILESTRT+2 ; FIRST TWO ARE WATERMELON
- BPL ZPPRAND
- LDA #WATTYPE
- BPL ZPP041 a jump
- ZPPRAND JSR RANDOM ; "RANDOMLC" DOESN'T WORK WELL HERE
- AND #03 ; MASK TO 0-3
- ZPP041 ORA FINFO,X ; IN CASE BIT 7 WAS SET LAST TIME
- STA FINFO,X ; CONTAINS TYPE OF FOOD
- ASL A
- ASL A
- ASL A ; MULTIPLY BY 8 FOR FOOD TABLE BASE
- STA TEMP1
- JSR RANDOMLC ; NOW GET A RANDOM NUMBER FOR THE PILE
- AND #07 ; MASK TO 0-7
- CMP #4 ; IF LESS THAN FOUR, ADD 4
- BCS ZPMAKE2 ; >=
- ZPADD4
- ADC #4
- ZPMAKE2 STA TEMP2 ; TOTAL NUMBER OF FOODS IN PILE
- ; Find out if this pile will be two piles. If so, call spacem for the top
- ; half first; if not, skip around the test for the top half.
- LDA FINFO,X
- AND #$F
- CMP #WATTYPE
- BEQ ONESTAMP
- CMP #PEATYPE
- BEQ ONESTAMP
- ; Reaching here means there are two stamps (pies, tomatoes, or bananas)
- LDA FYPOS,X
- CLC
- ADC #8
- STA FYPOS,X
- JSR SPACEM the top half test
- BNE PPSKIP
- PP01JMP JMP ZPP01 didn't pass: find a new location
- PPSKIP LDY TEMPY contains the zone index-- must be
- LDA FYPOS,X restored before next SPACEM call
- SEC
- SBC #8
- STA FYPOS,X
- ; NOW MAKE SURE THAT THIS PILE ISN'T TOO CLOSE TO ANY OTHER ALREADY
- ; INITIALIZED PILES, BY CALLING THE ROUTINE "SPACEM".
- ONESTAMP JSR SPACEM
- BEQ PP01JMP ; IF A==0, HE'S TOO CLOSE
- LDY TEMPY ; ELSE, HE'S OKAY-- CONTINUE
- ; WE NOW KNOW THAT IT'S OKAY TO PUT THIS PILE HERE.
- ; SET UP FDLPOS--
- JSR ZFDLPOS
- ; INCREMENT "CINFO" FOR THE NEXT PILE TO TRY THIS ZONE:
- JSR INCCINFO
- ; NOW CHECK TO SEE IF THIS PILE ENTRY IS IN TWO DLISTS. IF SO, CINFO
- ; MUST BE INCREMENTED FOR THE FOLLOWING ZONE ALSO. THIS WILL BE
- ; THE CASE IF THE ZONE HALF (IN TEMP1) IS EVEN.
- LDA TEMP4
- LSR A ; GET ODDNESS BIT INTO CARRY
- BCS ZPP04 ; AN ODD ZONE HALF-- FITS INTO ONE ZN.
- ZPP03 DEY ; INDEX FOR NEXT LOWER ZONE
- JSR INCCINFO
- INY ; BACK UP TO THE SAME ZONE
- ZPP04 LDA FINFO,X ; TYPE OF FOOD
- AND #$3F ; IGNORE TOP TWO BITS
- CMP #1 ; 1 MEANS PEAS-- ONLY ONE ZONE HIGH
- BEQ ZPSKIP00
- CMP #4 ; WATERMELON-- ONE STAMP
- BNE ZPMAKE3
- ; IF NOT PEAS OR WATERMELON, MAKE
- ; 2 STAMPS HIGH
- ZPSKIP00 LDA TEMP2 ; ELSE, RESTORE A WITH NUMBER OF FOODS
- JMP ZP000 ; AND SKIP THE "BOTTOM HALF" STUFF
- ; IF WE GET HERE, WE KNOW THAT IT'S A BANANA OR TOMATO OR PIE PILE BIGGER
- ; THAN 4 HIGH. CREATE THE BOTTOM STAMP OF 4, AND SETUP
- ; THE ARRAYS FOR THE UPPER STAMP, INCREMENT X, AND CONTINUE
- ; AS BEFORE.
- ; SET "FINFO" HIGH BITS AS WELL.
- ZPMAKE3 INC INDEX ; END TEST IS ONE GREATER NOW
- LDA FINFO,X ; FIRST, COPY FOOD TYPE INTO TOP
- INX ; HALF OF PILE
- STA FINFO,X
- DEX
- LDA #$40 ; BOTTOM HALF
- ORA FINFO,X
- STA FINFO,X
- INX ; NEXT ONE IS TOP HALF
- LDA #$80 ; TOP HALF FLAG
- ORA FINFO,X
- STA FINFO,X ; PUT IT THERE FOR NEXT LOOP
- DEX
- MOVE #3,FSTATE,X ; THIS PILE IS 4 HIGH
- INC FSTATE,X ; STATE CONTAINS PILE NUMBER
- CLC
- ADC TEMP1 ; BASE INDEX INTO TABLE
- TAY ; TABLE INDEX IS 4+ TEMP1
- MOVE PILECHAR,Y,FSTAMP,X
- MOVE PILEPALW,Y,FPALW,X
- JSR SETCTR
- LDA FXPOS,X
- INX
- STA FXPOS,X
- DEX
- LDA FYPOS,X ; ADD 8 FOR YPOS OF TOP HALF
- INX
- CLC
- ADC #8
- STA FYPOS,X ; THIS IS THE TOP HALF !
- ; SET UP "FLDPOS" FOR THIS TOP HALF. IT MUST BE DONE HERE RATHER THAN
- ; BELOW, BECAUSE THE BELOW CODE GETS EXECUTED FOR ONE- AND TWO-
- ; ENTRY PILES; AND FDLPOS FOR ONE-ENTRY PILES HAS ALREADY BEEN DONE
- ; ABOVE.
- INC TEMP4 ; TOP HALF IS NEXT ZONE HALF UP
- LDA TEMP4 ; GET IT INTO A SO I CAN SHIFT IT
- LSR A ; ACTUAL ZONE INDEX
- TAY
- JSR ZFDLPOS ; SET UP FDLPOS
- JSR INCCINFO ; INC FOR NEXT TIME
- ; NOW, AS WITH THE FIRST HALF, CHECK TO SEE IF THIS HALF HANGS OVER
- ; INTO THE NEXT LOWER ZONE. THIS WILL BE TRUE IF THE "HALF-ZONE"
- ; IS EVEN.
- LDA TEMP4 ; HALF ZONE
- LSR A ; GET "ODDNESS" BIT IN CARRY
- BCS ZPP06 ; CARRY CLEAR IF EVEN
- ZPP05
- DEY ; INDEX TO NEXT LOWER ZONE
- JSR INCCINFO
- INY ; RESET INDEX TO CURRENT ZONE
- ZPP06 ; COME HERE IF THERE'S NO OVERHANG
- LDA TEMP2 ; THE NUMBER IN THE WHOLE PILE
- SEC
- SBC #4 ; TAKE OFF FOUR
- ZP000
- STA FSTATE,X ; THE STATE IS THE NUMBER OF FOODS
- INC FSTATE,X ; SHOULD BE 1-8, NOT 0-7
- CLC
- ADC TEMP1 ; ADD TO FOOD TABLE BASE INDEX
- TAY
- MOVE PILECHAR,Y,FSTAMP,X ; INDEX INTO PILECHAR TABLE
- MOVE PILEPALW,Y,FPALW,X
- LDA FINFO,X if this is the top of a two-entry
- BPL DOCTR pile, the delta is the maximum
- TYA if bit7 is set, it's a top
- AND #$FC
- CLC
- ADC #3 3 + 8N, N=0,1,2,3
- TAY
- DOCTR JSR SETCTR
- INX ; GO TO NEXT FREE STRUCTURE
- TXA
- CMP INDEX
- BPL PILEDBYE ; IF EQUAL OR GREATER, WE'RE FINISHED
- JMP ZPP01
- PILEDBYE
- RTS
- RACKTYPE DB $FF,TOMTYPE,$80,PIETYPE,$80
- DB WATTYPE,BANTYPE,$80,PEATYPE,$80
- ; Used to set the table values of the new pile. Called twice here
- ; and also called from PILEHIT
- AASETCTR
- SETCTR
- LDA FINFO,X
- BPL THEBOT
- TYA if the top of a pile, add 4 to the
- CLC index
- ADC #4
- TAY
- THEBOT LDA PILECTRY,Y do the Y first, in case index needs
- CLC to be changed for the X
- ADC FYPOS,X
- STA FYCENTER,X
- LDA PILEDY,Y
- STA FDY,X
- LDA FINFO,X whats this ? if it's the top of a
- BPL NOCHANGE pile, get rid of top bit, take
- TYA the index mod 8, and add 3 to get
- AND #$FC the index for a pile of size 4
- CLC
- ADC #3
- TAY
- NOCHANGE LDA PILECTR,Y
- CLC
- ADC FXPOS,X
- STA FCENTER,X
- LDA PILEDX,Y
- STA FDX,X
- RTS
- INCCINFO LDA CINFO,Y
- CLC
- ADC #$01
- STA CINFO,Y
- RTS
- ZFDLPOS LDA #2 ; 2 WALL ENTRIES
- CLC
- ADC CINFO,Y ; NUMBER OF PILES + 2
- ASL A
- ASL A
- ASL A
- ASL A ; SHIFT LEFT 4 TIMES (UPPER FIELD)
- STA TEMP0 ; UPPER FIELD (TOP FOUR BITS)
- TYA ; ACTUAL ZONE NUMBER IS IN Y
- ORA TEMP0 ; MASK IN THE UPPER FIELD (3 BITS)
- STA FDLPOS,X
- RTS
- ; "HOLEDRAW" IS ISOMORPHIC TO "PILEDRAW". ALL HOLES START OUT CLOSED;
- ; "CHEFINIT" WILL CHANGE SOME HOLES TO OPEN.
- HOLEDRAW
- LDA TEMP3 each zone has 3 more spaces for
- CLC holes
- ADC #3
- STA TEMP3
- LDA PLRACK
- CMP #8 ; RACKS ABOVE 7 HAVE 10 HOLES
- BPL ZHH00
- TAX
- LDA NUMHTAB,X ; NUMBER OF HOLES FOR RACK
- JMP ZHH01
- ZHH00 LDA #NUMHOLES ; MAXIMUM NUMBER OF HOLES
- ZHH01 STA HOLENUM ; USED IN "CHEFMOVE" WHEN RISING
- CLC
- ADC #HOLESTRT
- STA INDEX ; USED FOR END OF ROUTINE TEST
- LDX #HOLESTRT ; START WITH FIRST PILE
- ZNEWHOLE JSR RANDOMX ; RESULT IN A
- CMP #120 ; DON'T LET HOLE GET TOO CLOSE TO HERO
- BCS ZHSUB40
- JMP ZHSUB00
- ZHSUB40 SEC
- SBC #40 ; SUBTRACT 40 FROM X COORDINATE
- ZHSUB00 STA FXPOS,X
- ZHH02 JSR RANDOMY ; RANDOM DLIST
- LSR A ; GET ACTUAL ZONE
- TAY ; INTO INDEX REGISTER Y
- LDA CINFO,Y ; CHECK COUNTER (FROM "PILEDRAW")
- CMP TEMP3 ; VARIES DEPENDING ON TOTAL PILES
- BPL ZHH02 ; IF TWO THINGS ARE THERE, TRY ANOTHER
- TYA ; BRING DLIST NUMBER BACK INTO A
- ASL A ; MULTIPLY BY 16 TO GET THE COORD.
- ASL A
- ASL A
- ASL A
- CLC
- ADC #15 ; ADJUST AT THE TOP OF THE DLIST
- STA FYPOS,X
- ; NOW MAKE SURE HE'S NOT TOO CLOSE TO ANY OTHER PILE OR HOLE.
- JSR SPACEM
- BEQ ZNEWHOLE ; IF A==0, HE'S TOO CLOSE
- ; IF WE GET HERE, THIS LOCATION IS OK-- SET "FDLPOS" AND INCREMENT "CINFO"
- LDY TEMPY ; SAVED IN "SPACEM"
- JSR ZFDLPOS
- ; INCREMENT "CINFO"
- JSR INCCINFO
- MOVE #SHUTCHAR,FSTAMP,X ; ALL SHUT FOR NOW
- MOVE #HOLEPALW,FPALW,X
- MOVE #CLOSED,FSTATE,X ; HOLE STATE
- INX
- CPX INDEX ; LAST CHEF TO BE INITIALIZED
- BMI ZNEWHOLE
- ; CLEAR OUT "CINFO" SO THAT IT'S ZEROED WHEN RACK STARTS
- LDX #TOTALCH-1
- LDA #0
- ZHH03 STA CINFO,X
- DEX
- BPL ZHH03
- RTS
- ; "CHEFINIT"
- ; THIS ROUTINE WILL CAUSE THE CHEFS TO RISE FROM MANHOLES AND APPEAR
- ; ON THE PLAYFIELD. FOR NOW, IT JUST POPS THEM UP RIGHT ON TOP
- ; OF THE HOLE.
- CHEFINIT
- LDX HOWHARD
- LDA PLRACK
- CMP ZRACK,X
- BPL ZEROTHRW zero throw time
- MOVE LOWTIME,X,TEMP0 otherwise, read throw time from table
- MOVE HITIME,X,TEMP1
- LDY PLRACK
- LDA (TEMP0),Y
- JMP SETTHTF
- ZEROTHRW LDA #10
- SETTHTF STA THRWTUFF
- LDA PLRACK
- CMP #23
- BPL MAXTUFF
- LSR A
- TAX
- LDA MTUFFTAB,X ; DIRECTION CHANGE TIMER
- JMP SETTUFF
- MAXTUFF LDA #3
- SETTUFF STA MOODTUFF
- TUFFOVER LDY #HOLESTRT ; MANHOLE INDEX
- MOVE #$1F,COLORS+6 ; CHANGE THE WHITE TO YELLOW
- MOVE #0,NUMCHHIT ; NO CHEFS HIT YET
- LDA PLRACK
- BEQ CHEF02 ; FIRST RACK HAS 2 CHEFS
- CMP #1
- BEQ CHEF03 ; SECOND HAS THREE
- LDA #3 ; ALL FOUR CHEFS
- BNE ZCHINIT0 ; A JUMP
- CHEF02 MOVE #NOTYET,CSTATE+9
- STA CSTATE+12
- LDA #1 ; 2 CHEFS
- BNE ZCHINIT0 ; A JUMP
- CHEF03 MOVE #NOTYET,CSTATE+12 ; LAST CHEF ISN'T PROCESSED
- LDA #2 ; 3 CHEFS
- ZCHINIT0 STA INDEX ; TELLS HOW MANY CHEFS THIS LEVEL
- ; UP TILL NOW, I'VE BEEN SETTING PARAMETERS WHICH APPLY TO ALL THE CHEFS.
- ; THE FOLLOWING LOOP SETS PARAMETERS FOR EACH INDIVIDUAL CHEF
- LDX #CHEFSTRT ; INITIALIZE FOR THE FOLLOWING LOOP
- ZCHINIT1 JSR CHEFDRAW ; INITIALIZE THE RISING SEQUENCE
- ; SET UP CHARACTER INFO:
- ; TEMPORARY-- REMOVE FOR FINAL VERSION ?
- MOVE #$10,CINFO,X
- MOVE CHEFPALW-3,X,CPALW,X
- MOVE CHEFCHAR-3,X,CSTAMP,X
- MOVE CHEFPALW-2,X,CPALW+1,X
- MOVE CHEFCHAR-2,X,CSTAMP+1,X
- MOVE CHEFPALW-1,X,CPALW+2,X
- MOVE CHEFCHAR-1,X,CSTAMP+2,X
- INX ; GO TO NEXT CHEF
- INX
- INX
- INY ; POINT TO NEXT HOLE
- DEC INDEX
- BPL ZCHINIT1 ; CONTINUE FOR THIS MANY CHEFS
- ; WHEN ALL CHEFS HAVE STARTED RISING, SET THE NUMBER OF "FALLEN" CHEFS
- ; TO ENSURE THAT THERE'S ALWAYS AT LEAST ONE ON THE SCREEN
- LDA PLRACK
- BEQ CHEF012
- CMP #1
- BEQ CHEF013
- LDA #0
- JMP CHINBYE
- CHEF012 LDA #2 ; PRETEND THAT TWO HAVE FALLEN
- JMP CHINBYE
- CHEF013 LDA #1 ; PRETEND; SO THAT AT LEAST ONE CHEF
- CHINBYE STA NUMFALL ; WILL STILL BE ON SCREEN
- RTS
- ; THIS ROUTINE DRAWS A SINGLE CHEF. IT IS ALSO CALLED FROM "CHEFMOVE"
- ; WHEN A DEAD CHEF SHOULD RE-GROW FROM A HOLE.
- CHEFDRAW LDA STATUS
- CMP #STATWON
- BNE CDRW00
- RTS ; JMP CDRWBYE
- ; DON'T LET THEM RISE IF RACK IS OVER
- CDRW00 LDA RISESND-3,X
- JSR TUNIN
- MOVE THRWTUFF,THRWTIME,X
- MOVE #HATRISE,CSTATE,X ; HAT RISES FIRST
- MOVE RISEPALW-3,X,CPALW,X
- MOVE RISEPALW-2,X,CPALW+1,X
- MOVE RISEPALW-1,X,CPALW+2,X
- DEC NUMFALL ; ONE LESS CHEF IS DEAD
- LDA FYPOS,Y ; HOLE Y
- SEC
- SBC #14 ; BOTTOM LINE OF ZONE
- STA CYPOS,X ; HAT Y
- LDA FXPOS,Y ; HOLE X
- CLC
- ADC #2
- STA CXPOS,X ; HAT X
- MOVE #0,CFRAME,X ; STOPS WHEN "HATHITE" IS REACHED
- MOVE #RZSPEED,CACOUNT,X
- MOVE #$FF,CSECOND,X ; BOTTOM HALF INVISO
- STY TEMPY
- LDA PLRACK
- CMP #31
- BMI CDRW011 ; USE TABLES
- LDY #15 the chspeed tables are 16 long- JMP CDRW012 8 for 1-16, and 8 for 9-32
- CDRW011 STX TEMPX
- JSR MAXSET use different tables for
- DEX each value of MAXSET
- TXA
- ASL A
- ASL A
- ASL A
- STA TEMP0
- LDA PLRACK
- AND #$F
- LSR A ; 0-7
- ORA TEMP0
- TAY
- LDX TEMPX
- CDRW012 LDA CHSPEED,Y ; USED THROUGHOUT THE RACK
- LDY HOWHARD
- CPY #2
- BMI CDRW013
- SEC make chefs faster on top two
- SBC #1 difficulty settings
- CDRW013 STA CSINDEX,X
- TAY
- MOVE MTABSPD,Y,CSPEED,X
- LDY TEMPY
- ; NOW, SAVE INFORMATION ABOUT THE HOLE HE'S GROWING FROM.
- ; THE "CREATOR" TIMER WON'T START DECREMENTING UNTIL THE RISE
- ; IS COMPLETED.
- MOVE #$20,CREATOR,X ; 3 SECOND TIMER
- ; DON'T LET HIM DIE FOR THIS TIME
- TYA ; SO HE'LL KNOW WHICH HOLE THIS IS
- STA HOLEUSED,X
- ; NOW CHANGE THE MANHOLE TO BE OPEN FOR THE RISING SEQUENCE:
- MOVE #OPENCHAR,FSTAMP,Y
- MOVE #OPEN,FSTATE,Y
- CDRWBYE RTS
- ; THE REMAINING ROUTINES ARE "RANDOM" ROUTINES WHICH RETURN A VALUE
- ; IN REGISTER A.
- ; THIS ROUTINE RETURNS A ZONE. TO GET A FIXED CHARACTER'S Y COORD. AT THE
- ; TOP OF THIS ZONE, MULTIPLY THE ZONE BY 8, THEN ADD #7; THE VALUE
- ; WILL BE EQUAL TO "TOPZONE,ZONE#"
- RANDOMY
- JSR RANDOMLC
- AND #1F ; BOTTOM FIVE BITS -- 31 OR LESS
- CMP #18 ; I NEED A NUMBER 2 - 18
- BPL ZRAND00 ; IF IT'S GREATER, SUBTRACT 13
- JMP ZRAND01
- ZRAND00 SEC
- SBC #13
- ZRAND01 CMP #2
- BPL ZRAND08 ; IF IT'S >= 2, IT'S OKAY
- LDA #2 ; IF IT'S LESS THAN 2, MAKE IT 2
- ZRAND08 ; AT THIS POINT, "A" CONTAINS 2-18
- RTS
- RANDOMX
- STX TEMPX ; SAVE REGISTER
- JSR RANDOMLC
- AND #$7F ; 0 - 128
- CLC
- ADC #$0A ; 10 - 138
- LDX TEMPX ; RESTORE REGISTER
- RTS
- ; THIS ROUTINE IS USED DURING INITIALIZATION TO RETURN "LINEAR CONGRUENTIAL"
- ; RANDOM NUMBERS. IT CONTAINS A MULTIPLY !
- ; THIS COMPUTES: RANDOM0 := (RANDOM0 * RANDOMA) + RANDOMC {MODULO 256}
- RANDOMLC LDA RANDOM0
- STA RTEMP0
- LDA #0
- STA RANDOM0 ; ALL FACTORS OF POWERS OF 2 WILL
- ; BE ADDED TO THIS
- LDA #RANDOMA
- RANDLOOP LSR A
- STA RTEMP1
- BCC RAND000 ; IF ZERO, JUST SKIP THIS BIT
- LDA RANDOM0
- CLC
- ADC RTEMP0 ; THIS IS THE PROPER MULTIPLE OF
- STA RANDOM0 ; "RANDOM0" FOR THIS BIT
- RAND000
- ASL RTEMP0
- LDA RTEMP1
- BNE RANDLOOP
- LDA RANDOM0 ; IF THE "MULTIPLIER"==0, EXIT
- CLC
- ADC #RANDOMC
- STA RANDOM0
- RTS
- ; THIS ROUTINE IS USED DURING GAMEPLAY. IT RETURNS
- ; A RANDOM NUMBER BETWEEN 0 AND 255 IN REGISTER A
- ARANDOM
- RANDOM STY RTEMPY ; SAVE Y VALUE
- RNDCONT LDA #$07
- CLC
- ADC RANDOM0
- ADC RANDOM1
- LDY RANDOM0
- STY RANDOM1
- STA RANDOM0
- LDY RTEMPY ; RESTORE REGISTER
- RTS
- ; THIS ROUTINE IS CALLED FROM "PILEDRAW" AND "HOLEDRAW" TO MAKE
- ; SURE THAT THE PILE OR HOLE IS NOT TOO CLOSE TO ANOTHER
- ; PILE OR HOLE.
- ; ADDED 11/15/83: THE BYTES AT FYPOS-1 AND FXPOS-1 ARE CHUCK'S LOCATION.
- ; THE LOOP IS CHANGED TO TEST CLOSENESS TO CHUCK AS WELL.
- ; NOTE THAT Y INDICES MUST BE TESTED UP TO X+1, SINCE Y STARTS
- ; ONE LOCATION LOWER IN THE POSITION TABLES.
- ASPACEM
- SPACEM STX TEMPX ; STOP AT CURRENT INDEX
- INC TEMPX ; TO REFLECT Y INDEXING ONE LESS
- STY TEMPY
- LDY #0 ; START WITH CHUCK'S COORDS.
- MOVE #DXHCLOSE,TEMP0 for piles vs. hero
- MOVE #DYHCLOSE,TEMP5
- SPEMLOOP CPY TEMPX ; TEST FIRST, IN CASE IT'S THE FIRST
- BMI ZSPCONT1 ; PILE INITIALIZED
- LDA #TRUE ; IF THIS IS THE LAST, RETURN TRUE
- RTS ; JMP SPACEBYE
- ZSPCONT1 LDA FYPOS-1,Y ; OBJECT TO TEST
- BEQ ZSPNEXT
- SEC
- SBC FYPOS,X ; CURRENT OBJECT
- BPL ZSP001
- EOR #$FF
- CLC
- ADC #1
- ZSP001 CMP TEMP5
- ; BCC ZSPXTST
- BCS ZSPNEXT
- ZSPXTST LDA FXPOS-1,Y ; OBJECT BEING TESTED
- SEC
- SBC FXPOS,X ; CURRENT OBJECT
- BPL ZSP003
- EOR #$FF
- CLC
- ADC #1
- ZSP003 CMP TEMP0
- BCC ZRTNF ; RETURN FALSE
- ZSPNEXT MOVE #DXCLOSE,TEMP0 for piles vs. piles
- MOVE #DYCLOSE,TEMP5
- INY ; NEXT OBJECT
- JMP SPEMLOOP ; CONTINUE UNTIL JUST BEFORE CURRENT
- ZRTNF LDA #FALSE ; RETURN FALSE-- MUST PICK NEW COORD.
- SPACEBYE RTS
- ; Copy from a block of memory to another
- ; This routine is called from the macro COPY
- ZZZZCOPY LDA (TEMP0),Y
- STA (TEMP2),Y
- DEY
- BNE ZZZZCOPY
- DEC TEMP1
- DEC TEMP3
- DEX
- BNE ZZZZCOPY
- RTS
|