123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908 |
- ; INIT1.S
- ; THIS FILE CONTAINS THE ROUTINES WHICH ARE CALLED AT THE BEGINNING
- ; OF EACH NEW RACK. THE SCREEN IS CLEARED, THEN ALL OBJECTS
- ; ARE REDRAWN-- CONE, HERO, PILES, HOLES, AND CHEFS (APPEARING
- ; FROM MANHOLES).
- ; THIS FIRST ROUTINE, "RACKINIT", IS CALLED FROM "MAIN.S" WHEN IT'S
- ; DISCOVERED THAT A NEW RACK IS HAPPENING.
- GLBL DIEWAIT
- GLBL CLRSCRN
- GLBL RISEPALW ; USED IN "HOLEHIT.A"
- GLBL RANDOM
- GLBL GOD
- GLBL MKENTER
- GLBL MKSELECT
- GLBL SETMAPS
- GLBL HSCRTN used also in LOGO.S
- RANDOMA EQU 45 ; 45 MOD 8 = 5; A>16
- RANDOMC EQU 51 ; C ODD, C/M= ABOUT .21
- CONERAND EQU 7
- DXHCLOSE EQU 18 just more than one pile across
- DYHCLOSE EQU 26 just more than 3 pile halves
- * BODIES OF THE DMAON AND DMAOFF MACROS
- XDMAOFF ONSCREEN
- OFFSCRN
- MOVE #CTRLOFF,CTRL defined in MACRODEF
- RTS
- XDMAON ONSCREEN
- OFFSCRN
- MOVE #L(DLLRAM),DPPL
- MOVE #H(DLLRAM),DPPH
- MOVE #M160X2,CTRL
- RTS
- RACKINIT
- JSR SCRAPALL ; MAKE SURE
- MOVE #0,ALLGONE ; 0 EQU FALSE
- ; USED BY ALL FOOD FLYING AT RACK END
- LDA CSTATE ; HERO'S STATE
- CMP #WON ; SEE IF HE JUST REACHED THE CONE
- BEQ RCONT00A
- JMP HERODIE ; IF NOT, HE MUST HAVE DIED
- RCONT00A
- LDX CURRENT do this once for winning, once for
- MOVE #FALSE,PL0FIRST,X death
- ; SEE IF THIS IS THE FIRST ATTRACT MODE RACK:
- ; IF IT IS, THEN ONLY DO IR IF THERE'S ALREADY BEEN A GAME PLAYED.
- ; ELSE, JUST INITIALIZE AS FOR A FIRST RACK, AND USE RANDOM MOVEMENTS.,
- LDA MODE
- CMP #MATTRACT
- BNE RICONT00
- LDA GAMECNT ; IF NON-ZERO, IT'S A REPLAY
- BEQ RICONT00
- LDA #TRUE
- JMP SETRPLY
- ; HERE I SHOULD TEST TO SEE IF IT'S WORTHY OF INSTANT REPLAY
- RICONT00
- LDA DOITOVER ; IF LAST WAS A REPLAY
- BNE NOREPLAY
- LDA FSTATE must be at least 12 seconds long
- CMP #5 (2 values of FSTATE)*(6 seconds)
- BPL NOREPLAY
- LDX CURRENT
- DEC PL0IRTIM,X ; ONE EVERY FIVE RACKS
- BPL NOREPLAY
- MOVE #$FF,PL0IRTIM,X ; DON'T LET IT GET TOO NEGATIVER
- LDA IRCHTIME if near chefs for this much time,
- CMP #DOIRLOW it's a replay
- BCC NOREPLAY if less, no replay
- RICONT01 LDA PLRACK ; MUST BE AT LEAST LEVEL 5
- CMP #4 ; 0,1,2,3 CAN'T HAVE REPLAY
- BMI NOREPLAY
- CMP #17
- BCC YESRPLY ; IF BELOW RACK 17 THEN OK
- LDA PLBCD+1
- AND #$05
- BEQ NOREPLAY ; IF RACK ENDS IN '0' THEN NOREPLAY
- CMP #$05
- BEQ NOREPLAY ; IF RACK ENDS IN '5' THEN NOREPLAY
- ; At this point, we know it's a replay ! Copy the relevant information
- ; into tables and values for the attract mode replay, and
- ; setup current gameplay seeds from the saved IR values.
- YESRPLY MOVE #4,PL0IRTIM,X ; DON'T GIVER ANOTHER FOR 5 RACKS
- MOVE #$FF,ASET ; USE THIS FOR LATER ATTRACT MODES
- JSR SAVEAIR
- LDA #TRUE ; THIS IS IT.
- JMP SETRPLY
- ; Go ahead and copy the tables for IR into AIR, and use this even though
- ; it's not an instant replay, until a real IR comes along.
- ; If ASET is negative, the AIR tables already contain an IR.
- ; Don't copy--
- NOREPLAY LDA MODE don't copy if this is already an
- CMP #MATTRACT attract mode
- BEQ SKIPCOPY
- LDA ASET
- BMI SKIPCOPY
- JSR SAVEAIR
- LDA #2
- STA ASET
- LDX CURRENT X is used by "SAVEAIR" routine
- SKIPCOPY LDA PLRACK
- CMP #124
- BCS NOINC if greater than 124, no increment
- INC PL0RACK,X ; PLAYER 0 OR 1
- NOINC
- ; ADD ONE TO THE BCD REPRESENTATION OF THE LEVEL:
- ; Increment PLBCD regardless, since all level display is based on
- ; the last digit of this:
- TXA
- ASL A ; 0 OR 2
- TAX
- INX ; LOW BYTE (LOW ORDER DIGITS)
- ; 1 OR 3
- SED
- LDA PL0BCD,X
- CLC
- ADC #1
- STA PL0BCD,X
- DEX ; HIGH ORDER DIGITS
- LDA PL0BCD,X
- ADC #0
- STA PL0BCD,X
- CLD
- LASTRACK LDA #FALSE
- SETRPLY STA DOITOVER
- JMP CHARINIT
- HERODIE MOVE #FALSE,DOITOVER ; NO IR THIS TIME !
- LDX CURRENT
- STA PL0FIRST,X
- LDA ASET If there's no winning rack in the AIR
- BNE SKIPIT tables, then store this one
- JSR SAVEAIR
- INC ASET set to 1
- SKIPIT
- MOVE #0,PL0CARRY,X ; GET RID OF ANY CARRIED FOOD
- MOVE #TRUE,PLMESS ; SET MESSAGE FOR NEXT PLAYER TO DISP.
- DEC PL0LIVES,X ; TAKE AWAY A LIFE
- BEQ HDIEOVER ; IF NO LIVES ARE LEFT
- LDX OTHER
- LDA PL0LIVES,X
- BEQ HERODIE0 ; OTHER PLAYER HAS NO LIVES- ; DON'T CHANGE "CURRENT"
- MOVE CURRENT,OTHER ; SWITCH PLAYERS-- OTHER IN X
- STX CURRENT
- HERODIE0 JMP CHARINIT
- ; This routine saves all relevant information for the attract mode IR.
- SAVEAIR COPY IRDIRA,AIRDIRA,$140 do all five tables in this loop
- MOVE IRCCNT,AIRCCNT cyclecnt
- MOVE IRAND0,AIRAND0 random0
- MOVE IRAND1,AIRAND1 random1
- MOVE IRCARRY,AIRCARRY information about carried food
- MOVE PLRACK,AIRLEVEL level the replay occurred on
- MOVE PLBCD+1,AIRBCD to get pile type correct
- RTS
- ; ALL THE LIVES FOR THIS PLAYER ARE GONE. CHECK THE OTHER PLAYER-; AFTER PLAYING THE "END OF GAME" TUNE
- HDIEOVER JSR SCRAPALL ; GET RID OF ANY SOUNDS
- LDA #12
- JSR TUNIN
- LDA #13
- JSR TUNIN
- ; CALL "MKPROMPT" WHICH WILL ACCOMPLISH THE WAIT WHILE DISPLAYING
- ; THE "GAME OVER" MESSAGE
- ; NOTE: FIRST OF ALL, GET RID OF ALL THE FOODS, SO THERE WILL BE ENOUGH
- ; DMA TIME FOR THE TEXT
- LDA #0
- LDY #FOODSTRT+NUMFOOD
- NUFFDMA STA CYPOS,Y
- DEY
- CPY #FOODSTRT
- BPL NUFFDMA
- JSR MLOADER ; CLEAN OUT THE DLISTS WITH THE FOODS
- LDA #1
- JSR MKPROMPT
- LDA PLAYNUM ; "TRUE" IF TWO PLAYER
- BEQ ZEND0 ; ELSE, GAME IS OVER
- LDX OTHER ; OTHER PLAYER
- LDA PL0LIVES,X
- BEQ ZEND0 ; NEITHER PLAYER HAS ANY LIVES
- MOVE OTHER,TEMP0 ; SWITCH PLAYERS
- MOVE CURRENT,OTHER ; IF ONLY ONE PLAYER, OTHER==CURRENT
- MOVE TEMP0,CURRENT
- MOVE #MGAME,MODE
- NEWSTATE GAME
- JMP CHARINIT
- ; BOTH PLAYERS ARE DEAD-- PASS CONTROL TO HISCORE ENTRY, THEN BACK TO LOGO
- ZEND0 JSR MKENTER ; WILL GET LAST PLAYER TO GO
- DMAOFF
- LDA PLAYNUM
- BEQ ZEND00 ; WAS ONE-PLAYER
- MOVE OTHER,CURRENT ; NOW THE OTHER PLAYER
- JSR MKENTER
- ZEND00 JSR HSCRTN clean-up after HSC is done
- MOVE #FALSE,RUNLOAD
- MOVE #0,CURRENT ; SO THAT JOYSTICK AND BUTTON ARE
- ; PLAYER 0
- JMP MKLOGO
- CHARINIT
- ; DMAOFF
- MOVE #STATINIT,STATUS
- MOVE #1,MAXCYCLE ; JUST FOR CHEFS RISING
- MOVE #0,NUMCYCLE
- JSR CLRSCRN
- ; WAIT TILL WE'RE ON SCREEN:
- RINITLP BIT MSTAT
- BPL RINITLP
- ; AT THIS POINT, WE'RE ON SCREEN; NOW WAIT FOR VBLANK TO BE REACHED AGAIN
- ; SO THAT SETTING OF SEEDS OCCURS BEFORE NEXT SCREEN
- RINITLP1 BIT MSTAT
- BMI RINITLP1
- ; VBLANK WAS JUST ENTERED; HANDLE SETTING OF "CYCLECNT", "RANDOM0", AND
- ; "RANDOM1" BEFORE THE NEXT DLI OCCURES
- ; "DOITOVER" WILL BE SET "TRUE" IF IT'S SUPPOSED TO BE A REPLAY
- LDA DOITOVER
- BEQ ZIR0003 ; NO IR
- LDA CSTATE
- CMP #WON ; IF HE JUST DIED, THEN NO IR
- BNE ZIR0003
- ; THIS IS AN INSTANT REPLAY !
- LDA ASET
- BEQ NORMAL
- LDA MODE
- CMP #MATTRACT
- BNE NORMAL
- MOVE AIRCCNT,CYCLECNT this is an attract replay-- use
- MOVE AIRAND0,RANDOM0 the attract IR values
- MOVE AIRAND1,RANDOM1
- LDX CURRENT
- MOVE AIRCARRY,PL0CARRY,X
- MOVE AIRLEVEL,PL0RACK,X ; SAME RACK AS REPLAY ORIGINALLY WAS
- TXA get 0 or 2 into X
- ASL A
- TAX
- MOVE AIRBCD,PL0BCD+1,X
- JMP ZIR0004 go ahead past stuff
- NORMAL MOVE IRCCNT,CYCLECNT ; RESTORE CORRECT RANDOM GENERATOR
- MOVE IRAND0,RANDOM0
- MOVE IRAND1,RANDOM1
- LDX CURRENT
- MOVE IRCARRY,PL0CARRY,X
- LDA MODE ; NO IR MESSAGE IF IT'S JUST AN
- CMP #MATTRACT ; INSTANT REPLAY--
- BEQ ZIR0004
- JSR COLRINIT ; WASTES TIME BUT SAVES ROM
- ; RESTORE 19,15,1F INTO P5
- LDA #2 ; IR MESSAGE
- JSR MKPROMPT ; WHILE PLAYFIELD IS BLANK
- JMP ZIR0004
- ; THIS RACK ISN'T AN INSTANT REPLAY-
- ZIR0003 MOVE CYCLECNT,IRCCNT
- MOVE RANDOM0,IRAND0
- MOVE RANDOM1,IRAND1
- LDX CURRENT
- MOVE PL0CARRY,X,IRCARRY
- ; ZERO OUT JUST THE THROW TABLE-- THE DIRECTION TABLE WILL BE WRITTEN
- ; OVER EACH TIME I STORE A HIGH NIBBLE, BUT THE THROW TABLE
- ; IS ALWAYS WRITTEN TO USING "ORA" STATEMENTS.
- LDY #$3F ; TABLE IS $40
- LDA #0
- ZIR0100 STA IRTHROW,Y
- DEY
- BPL ZIR0100
- ZIR0004 LDA #0
- STA CYCLEIDX
- STA CYCLEIDX+1
- STA THROWIDX
- ; FIND OUT WHICH PLAYER THIS IS IF TWO PLAYER-- SET PLRACK APPROPRIATELY
- APINOVER
- LDX CURRENT gets used at PINOVER
- BEQ P1INIT
- MOVE PL1RACK,PLRACK ; SECOND PLAYER
- MOVE PL1CARRY,PLCARRY
- MOVE PL1LIVES,PLLIVES
- MOVE PL1BCD,PLBCD
- MOVE PL1BCD+1,PLBCD+1
- MOVE PL1FIRST,PLFIRST
- JMP PINOVER
- P1INIT MOVE PL0RACK,PLRACK ; FIRST PLAYER
- MOVE PL0CARRY,PLCARRY
- MOVE PL0LIVES,PLLIVES
- MOVE PL0BCD,PLBCD
- MOVE PL0BCD+1,PLBCD+1
- MOVE PL0FIRST,PLFIRST
- PINOVER LDA PLRACK update highest selected level allowed
- CMP HIGHEST,X select up to last highest always
- BCC NONEWHI allowed
- CMP #125 also, don't let HIGHEST become
- BCS NONEWHI greater than 125
- STA HIGHEST,X
- LDA PLAYNUM if one player, copy into 2nd player
- BEQ COPYTWO
- LDA PL1FIRST If this is the first rack for
- BNE NONEWHI player 2, don't copy over
- ; Use the greatest HIGHEST value for both of the HIGHEST registers
- COPYTWO LDA HIGHEST
- CMP HIGHEST+1
- BCS USETHIS
- MOVE HIGHEST+1,HIGHEST
- BNE NONEWHI a jump
- USETHIS STA HIGHEST+1
- NONEWHI
- ; JUMP TO THE RACK SELECT MODE IF THIS IS THE FIRST RACK FOR THIS PLAYER:
- LDA PLFIRST
- BEQ RACKSTRT not the first rack
- LDA MODE ; NO SELECT IF ATTRACT MODE
- CMP #MATTRACT
- BEQ RACKSTRT
- JSR MKSELECT ; WON'T "RTS" UNTIL "THROW" IS PUSHED
- ; DMAOFF turn DMA off while characters init.
- JSR COLRINIT ; SINCE "SELECT" HAS A LOGO
- JSR SETMAPS ; IN "MAIN.S"-- SETS MAPS FOR GAMEPLAY
- ; INCLUDING SCORES AND HEADS ETC.
- RACKSTRT JSR CLRSTRCT ; CLEAR ALL THE STRUCTURE ARRAYS
- ; ALSO CLEARS "STATLIST"
- ; NOW SET UP THE STAT LIST FOR THIS PLAYER-- RACK NUMBER, AND LIVES LEFT
- JSR STATDISP
- ; NOW SETUP THE "LEVEL NNN" LIST ; UP TO THREE DIGITS
- LIFELP0 MOVE #FALSE,TEMP0 ; USE THIS TO TELL IF ZEROES ARE
- ; DISPLAYED
- LDA PLRACK if this is level 125 or up, display
- CMP #124 the number "125" despite value in
- BMI NOTLAST PLBCD
- MOVE #$D8,CLOWMAP2+12 "1"
- MOVE #$D9,CLOWMAP2+13
- MOVE #$DA,CLOWMAP2+14 "2"
- MOVE #$DB,CLOWMAP2+15
- MOVE #$E0,CLOWMAP2+16 "5"
- MOVE #$E1,CLOWMAP2+17
- BNE STATOVER a jump
- NOTLAST LDA PLBCD ; LIVES IN BCD
- BEQ LIFELP1 ; IF ZERO, NO DIGIT
- ASL A ; TIMES 2
- ADC #$D6 ; DIGIT "1" IS AT $D8
- STA CLOWMAP2+12
- ADC #1
- STA CLOWMAP2+13
- MOVE #TRUE,TEMP0
- LIFELP1 LDA PLBCD+1
- LSR A
- LSR A
- LSR A
- LSR A
- LDX TEMP0
- BNE LIFELP2 ; IF "TRUE", DISPLAY IT
- TAY ; TO RESET FLAGS TO "A"
- BEQ LIFELP3 ; IF ZERO, SKIP THIS ONE
- LIFELP2 ASL A ; TIMES 2
- ADC #$D6 ; THE "O" CHARACTER
- STA CLOWMAP2+14
- ADC #1
- STA CLOWMAP2+15
- LIFELP3 LDA PLBCD+1
- AND #$F
- ASL A ; TIMES 2
- ADC #$D6
- STA CLOWMAP2+16
- ADC #1
- STA CLOWMAP2+17
- STATOVER
- ; DMAOFF now done above at CHARINIT
- JSR CLRSCRN ; CLEAR DISPLAY LISTS
- JSR CONEDRAW
- JSR HERODRAW dma gets turned on in here
- AAASTOP
- JSR PILEDRAW
- JSR HOLEDRAW
- JSR CHEFINIT
- ; wait till offscreen, because the two of these together will take forever
- ONSCREEN
- INVBLANK
- ATIME1
- JSR FLOADER ; DISPLAY ALL THE FIXED CHARS; SET
- ATIME15 ; UP "LISTSTRT" TO REFLECT THEM
- JSR MLOADER ; DISPLAY ALL THE MOVING CHARACTERS
- ATIME2
- RTS
- ; CALLED ABOVE AND ALSO FROM "SCORE.S"
- STATDISP LDX PLLIVES
- LDY #$10 ; INDEX OF LAST MAP ENTRY
- LIFELOOP CPX #2
- BMI STATDBYE ; EXIT LOOP IF 1 OR 0
- MOVE #STHEADCH+1,CLOWMAP1,Y
- DEY
- MOVE #STHEADCH,CLOWMAP1,Y
- DEY
- BMI STATDBYE ; MAXIMUM DISPLAYED LIVES
- DEY ; INSERT A SPACE BETWEEN
- DEX
- JMP LIFELOOP
- STATDBYE RTS
- ; THIS ROUTINE CLEARS OUT THE CHARACTER INFORMATION ARRAYS BY
- ; SETTING THE Y COORDINATES OF EVERYTHING TO 0 (THIS SIGNIFIES
- ; THAT IT'S NOT ON THE SCREEN).
- ; ZERO OUT ALL OF THE CHARACTERS:
- CLRSTRCT MOVEPTR CPALW,TEMP0
- ; ZERO OUT ALL OF THE CHARACTER INFORMATION ARRAYS:
- ; THIS IS A TOTAL OF 977 BYTES, 3 PAGES + 209 BYTES.(1/3/84)
- LDX #2 ; DO THREE PAGES
- LDY #00
- LDA #0
- ZSLP01 STA (TEMP0),Y
- DEY
- BNE ZSLP01
- DEX
- BMI ZSLPEND1 ; THREE PAGES HAVE BEEN DONE
- INC TEMP1 ; ELSE GO TO NEXT PAGE
- JMP ZSLP01
- ZSLPEND1 LDY #208 ; DO 209 BYTES OF THE 4TH PAGE
- INC TEMP1
- ZSLP02 STA (TEMP0),Y
- DEY
- BNE ZSLP02
- MOVEPTR CSTATE+1,TEMP0 ; ZERO OUT ALL BUT CHUCK'S STATE
- LDA #0
- LDY #$5E ; 3 ARRAYS, $20 EACH
- ; MINUS 1 FOR CHUCK
- ZSLP03 STA (TEMP0),Y
- DEY
- BPL ZSLP03
- STA NUMINAIR ; NO CARRY OVER FROM LAST LEVEL
- STA NUMSTUCK ; ALSO NO CARRY FROM LAST LEVEL
- STA ALLGONE ; STORE "FALSE" HERE
- STA IRCHTIME ; RESET NEAR CHEF TIMER
- STA IRCHTIME+1
- LDX #TOTALCH-1
- ZSTRCT00 LDA #0
- STA CYPOS,X
- STA CXPOS,X
- STA CYPOSL,X
- STA CXPOSL,X
- STA CINFO,X ; FOR USAGE BY "PILEDRAW"
- STA CSECOND,X ; 0 MEANS DO SECOND ZONE
- MOVE #8,OLDDIR,X ; SO THAT "OLDDIR" WORKS
- MOVE #BLOCK1,CHSTAMP,X ; DEFAULT IS FIRST BLOCK
- DEX
- BPL ZSTRCT00
- LDX #TOTALFX-1
- ZSTRCT01 LDA #0
- STA FYPOS,X
- STA FINFO,X
- STA FDLPOS,X
- STA FSTATE,X
- MOVE #BLOCK1,FHSTAMP,X ; DEFAULT
- DEX
- BPL ZSTRCT01
- ; PUT ALL NULL CHARACTERS INTO THE LIVES LEFT MAP:
- LDX #16
- LDA #NULL2
- ZSTRCT02 STA CLOWMAP1,X
- DEX
- BPL ZSTRCT02
- ; FILL ONLY THE DIGITS WITH NULL: (LEVEL INFO)
- LDX #17
- ZSTRCT03 STA CLOWMAP2,X
- DEX
- CPX #12
- BPL ZSTRCT03
- RTS
- ; THIS ROUTINE FILLS THE DISPLAY LIST WITH ZEROS, LEAVING THE LEFT AND
- ; RIGHT SIDE WALLS INTACT (THEY'RE ALWAYS THE FIRST TWO ITEMS
- ; IN THE LIST).
- ; NOTE: MAKE SURE TO CHANGE THIS SO THAT IT ALSO LEAVES THE HEADERS
- ; FOR THE TOP AND BOTTOM WALLS !
- CLRSCRN ONSCREEN make sure it's done off-screen
- INVBLANK
- LDX #9 ; DLISTS 9 TO 1 HAVE LENGTH 8
- LDY #8
- CLR0011 STY LISTSTRT,X
- STY LISTSIZE,X
- DEX
- BPL CLR0011
- LDY #20
- STY LISTSTRT+10
- STY LISTSIZE+10
- STY LISTSTRT
- STY LISTSIZE
- LDX #10
- CLR0012 MOVE LISTTABL,X,LISTPTR
- MOVE LISTTABH,X,LISTPTR+1
- LDY LISTSIZE,X
- ZCLR01 LDA #0
- STA (LISTPTR),Y
- INY
- CPY #LISTLENG ; LENGTH OF A DLIST
- BMI ZCLR01
- DEX ; GO TO NEXT DLIST
- BPL CLR0012
- RTS
- ; THIS ROUTINE DRAWS THE CONE IN A RANDOMLY SELECTED DLIST.
- CONEDRAW
- LDA #CONEX ; X POSITION IS ALWAYS THE SAME
- STA FXPOS+CONESTRT
- ; Change the color of the cone to reflect the digit of this rack--
- ; 10 different possibilities.
- LDA PLBCD+1
- AND #$F
- TAX
- MOVE CONECOL1,X,COLORS+28
- MOVE CONECOL2,X,COLORS+29
- LDA PLRACK
- CMP #CONERAND ; ONLY RANDOM AFTER LEVEL L
- BPL CD0001
- LDA #$5F ; CENTER OF LEFT WALL
- INC CINFO+5 ; SO THAT PILES' "FDLPOS" IS CORRECT
- JMP CD0002
- CD0001 JSR RANDOMY ; PICK A RANDOM DLIST
- LSR A ; GET ZONE NUMBER FOR CINFO
- TAX ; INCREMENT "CINFO" SO PILES
- INC CINFO,X ; ARE CORRECT
- ASL A ; MULTIPLY BY 16 AND ADD 15 TO
- ASL A ; ADJUST CONE TO TOP OF ZONE
- ASL A
- ASL A
- CLC
- ADC #15
- CD0002 STA FYPOS+CONESTRT
- LDA #CONECHAR
- STA FSTAMP+CONESTRT
- LDA #BLOCK2
- STA FHSTAMP+CONESTRT
- LDA #CONEPALW
- STA FPALW+CONESTRT
- MOVE #6,FSTATE ; TELLS WHICH FRAME CONE IS ON
- MOVE #180,FINFO ; 6 SECONDS
- ; SET UP THE DRIPPING INFORMATION:
- MOVE #45,DRIPTIME
- MOVE #99,DRIPFRAM ; WAITING BEFORE FIRST DRIP
- LDA #0
- STA CYPOS+DRIPSTRT
- LDA DRIPCHAR+2
- STA CSTAMP+DRIPSTRT
- LDA #$FF ; PALETTE 7, WIDTH 1
- STA CPALW+DRIPSTRT
- LDA #BLOCK2
- STA CHSTAMP+DRIPSTRT
- LDA FYPOS
- LSR A
- LSR A
- LSR A
- LSR A ; GET ZONE INDEX BACK
- ORA #$20 ; WE KNOW IT'S THE 3RD ENTRY
- STA FDLPOS
- RTS
- ; DRAW THE HERO
- ; BASE HIS POSITION ON THE CONE'S--
- ; 5F - CONEY + 5F = HEROY
- HERODRAW
- MOVE #FALSE,THROWBUT ; MAKE SURE HE DOESN'T THROW RIGHT
- ; AWAY
- LDA DOITOVER
- BEQ ZHD020 ; NORMAL RACK
- LDA MODE ; THIS MIGHT BE ATTRACT MODE-- DON'T
- CMP #MATTRACT ; DO THIS TUNE !
- BEQ HDSKIP10
- MOVE #FALSE,DOITOVER ; SO THAT "TUNIN" WILL WORK
- JSR SCRAPALL ; PLAY THE TUNE
- LDA #21
- JSR TUNIN
- LDA #22
- JSR TUNIN
- HDSKIP10 MOVE #TRUE,DOITOVER
- ZHD020 LDA #HEROX
- STA CXPOS
- STA CXPOS+1 ; BOTTOM HALF
- STA FXPOS-1 ; FOR "SPACEM"
- LDA #$BE ; 5F - CONEY + 5F = BE - CONEY
- SEC
- SBC FYPOS+CONESTRT
- STA CYPOS
- STA FYPOS-1 ; FOR "SPACEM"
- SEC
- SBC #12 ; TOP HALF IS 16 HIGH
- STA CYPOS+1
- MOVE CCHEADS+6,CSTAMP ; FIRST FRAME OF LEFT MOVEMENT
- MOVE #HEROPALW,CPALW,CPALW+1
- MOVE #ARMPALW,CPALW+2
- MOVE #6,CDIR ; FACING LEFT TO START
- LDA PLRACK
- CMP #31
- BMI ZHD022 ; IF LESS THAN 48, USE TABLE
- LDX #15 ; MAXIMUM TABLE VALUE
- JMP ZHD023
- ZHD022 JSR MAXSET
- DEX get 0,1,2 for MAXCYCLE
- TXA
- ASL A
- ASL A
- ASL A times 8 for table lookup base
- STA TEMP0
- LDA PLRACK
- AND #$F ; 0 - 15 BATCHES
- LSR A ; 8 SPEEDS PER 16 RACKS
- ORA TEMP0 this is the same as adding temp0
- TAX ; BASED ON "MAXCYCLE" CHANGING
- ; EVERY 10 RACKS
- ZHD023 MOVE HSPEED,X,CSINDEX ; HERO SPEED
- TAX
- MOVE MTABSPD,X,CSPEED
- STA CFRAME ; MOVE COUNTER
- ASL A
- STA CFRAME+1 ; ANIMATE COUNTER
- MOVE #2,CACOUNT ; THREE HERO ANIMATIONS, FOR NOW
- ; If the hero is carrying, then set up his arms and display the food
- ; in his hand
- BIT PLCARRY
- BMI ZHDRAW00
- JMP ZHDRAW01
- ZHDRAW00 LDA PLCARRY
- AND #$7F
- STA CTYPE+FOODSTRT
- TAY
- LDA FLYCHAR,Y
- STA CSTAMP+FOODSTRT
- LDA FLYPALW,Y
- STA CPALW+FOODSTRT
- LDA #CARRIED
- STA CSTATE+FOODSTRT
- LDA #0
- STA CREATOR+FOODSTRT
- MOVE CCARMS+6,CSTAMP+2
- MOVE CCRUNLC,CSTAMP+1
- LDA CYPOS
- SEC
- SBC #4
- STA CYPOS+2
- LDA CXPOS
- SEC
- SBC #2
- STA CXPOS+2
- MOVE #FOODSTRT,HELDFOOD
- JSR CFOODADJ
- MOVE #CARRYING,CSTATE
- MOVE #0,PLCARRY
- JMP ZHDRAWA0 ; display cone and hero and
- ; turn on dma
- ZHDRAW01 MOVE #RUNNING,CSTATE
- MOVE CCRUNL,CSTAMP+1 ; FIRST FRAME-- FEET
- MOVE #0,CYPOS+2
- ; We reach here regardless of whether hero was carrying or not
- ZHDRAWA0 JSR FLOADER ; DISPLAY THE CONE
- JSR MLOADER ; DISPLAY THE HERO
- LDA FYPOS ; CALCULATE THE ZONE OF THE CONE
- LSR A
- LSR A
- LSR A
- LSR A
- TAY
- MOVE #8,LISTSTRT,Y ; RESTORE SO THAT I DON'T GET 2 CONES
- ; JSR DPPINIT ; TURN DMA ON, SO THAT WE CAN SEE THE
- ; THE MESSAGE AND REST OF RACK
- LDA DOITOVER ; NO MESSAGE HERE IF IR
- BNE ZHDRAW02
- LDA PLAYNUM
- BEQ ZHDRAW88 ; IF ONE PLAYER GAME
- LDA PLMESS ;
- BNE ZHDRAW20 ; IF PLMESS = TRUE THEN MESSAGE
- ; BEQ ZHD0221 ; ELSE DON'T DISPLAY
- ; IF A ONE-PLAYER GAME, MESSAGE DISPLAYS ONLY ON VERY FIRST RACK AND LIFE
- ZHDRAW88 LDA PLFIRST ; ONLY IF THE FIRST LIFE,FIRST RACK
- BEQ ZHD0211
- ZHDRAW20 MOVE #0,PLMESS ; NO MORE MESSAGE (UNTIL DEATH)
- JSR MKPROMPT ; NO "RTS" UNTIL WAIT IS DONE
- ; PLAY THE RACK START TUNE AFTER THE PROMPT GOES AWAY AND AS THE CHEFS
- ; START TO RISE:
- LDA PLFIRST ; IF THIS PLAYER'S FIRST RACK
- BEQ ZHD0211 ; LATER RACK-- SHORT TUNE
- LDA #00 ; IF FIRST RACK AND FIRST LIFE
- JMP ZHD0212
- ZHD0211 LDA #30 ; IF LATER LEVEL OR LIFE
- ZHD0212 JSR TUNIN
- ZHDRAW02 RTS
|