INIT1.S 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. ; INIT1.S
  2. ; THIS FILE CONTAINS THE ROUTINES WHICH ARE CALLED AT THE BEGINNING
  3. ; OF EACH NEW RACK. THE SCREEN IS CLEARED, THEN ALL OBJECTS
  4. ; ARE REDRAWN-- CONE, HERO, PILES, HOLES, AND CHEFS (APPEARING
  5. ; FROM MANHOLES).
  6. ; THIS FIRST ROUTINE, "RACKINIT", IS CALLED FROM "MAIN.S" WHEN IT'S
  7. ; DISCOVERED THAT A NEW RACK IS HAPPENING.
  8. GLBL DIEWAIT
  9. GLBL CLRSCRN
  10. GLBL RISEPALW ; USED IN "HOLEHIT.A"
  11. GLBL RANDOM
  12. GLBL GOD
  13. GLBL MKENTER
  14. GLBL MKSELECT
  15. GLBL SETMAPS
  16. GLBL HSCRTN used also in LOGO.S
  17. RANDOMA EQU 45 ; 45 MOD 8 = 5; A>16
  18. RANDOMC EQU 51 ; C ODD, C/M= ABOUT .21
  19. CONERAND EQU 7
  20. DXHCLOSE EQU 18 just more than one pile across
  21. DYHCLOSE EQU 26 just more than 3 pile halves
  22. * BODIES OF THE DMAON AND DMAOFF MACROS
  23. XDMAOFF ONSCREEN
  24. OFFSCRN
  25. MOVE #CTRLOFF,CTRL defined in MACRODEF
  26. RTS
  27. XDMAON ONSCREEN
  28. OFFSCRN
  29. MOVE #L(DLLRAM),DPPL
  30. MOVE #H(DLLRAM),DPPH
  31. MOVE #M160X2,CTRL
  32. RTS
  33. RACKINIT
  34. JSR SCRAPALL ; MAKE SURE
  35. MOVE #0,ALLGONE ; 0 EQU FALSE
  36. ; USED BY ALL FOOD FLYING AT RACK END
  37. LDA CSTATE ; HERO'S STATE
  38. CMP #WON ; SEE IF HE JUST REACHED THE CONE
  39. BEQ RCONT00A
  40. JMP HERODIE ; IF NOT, HE MUST HAVE DIED
  41. RCONT00A
  42. LDX CURRENT do this once for winning, once for
  43. MOVE #FALSE,PL0FIRST,X death
  44. ; SEE IF THIS IS THE FIRST ATTRACT MODE RACK:
  45. ; IF IT IS, THEN ONLY DO IR IF THERE'S ALREADY BEEN A GAME PLAYED.
  46. ; ELSE, JUST INITIALIZE AS FOR A FIRST RACK, AND USE RANDOM MOVEMENTS.,
  47. LDA MODE
  48. CMP #MATTRACT
  49. BNE RICONT00
  50. LDA GAMECNT ; IF NON-ZERO, IT'S A REPLAY
  51. BEQ RICONT00
  52. LDA #TRUE
  53. JMP SETRPLY
  54. ; HERE I SHOULD TEST TO SEE IF IT'S WORTHY OF INSTANT REPLAY
  55. RICONT00
  56. LDA DOITOVER ; IF LAST WAS A REPLAY
  57. BNE NOREPLAY
  58. LDA FSTATE must be at least 12 seconds long
  59. CMP #5 (2 values of FSTATE)*(6 seconds)
  60. BPL NOREPLAY
  61. LDX CURRENT
  62. DEC PL0IRTIM,X ; ONE EVERY FIVE RACKS
  63. BPL NOREPLAY
  64. MOVE #$FF,PL0IRTIM,X ; DON'T LET IT GET TOO NEGATIVER
  65. LDA IRCHTIME if near chefs for this much time,
  66. CMP #DOIRLOW it's a replay
  67. BCC NOREPLAY if less, no replay
  68. RICONT01 LDA PLRACK ; MUST BE AT LEAST LEVEL 5
  69. CMP #4 ; 0,1,2,3 CAN'T HAVE REPLAY
  70. BMI NOREPLAY
  71. CMP #17
  72. BCC YESRPLY ; IF BELOW RACK 17 THEN OK
  73. LDA PLBCD+1
  74. AND #$05
  75. BEQ NOREPLAY ; IF RACK ENDS IN '0' THEN NOREPLAY
  76. CMP #$05
  77. BEQ NOREPLAY ; IF RACK ENDS IN '5' THEN NOREPLAY
  78. ; At this point, we know it's a replay ! Copy the relevant information
  79. ; into tables and values for the attract mode replay, and
  80. ; setup current gameplay seeds from the saved IR values.
  81. YESRPLY MOVE #4,PL0IRTIM,X ; DON'T GIVER ANOTHER FOR 5 RACKS
  82. MOVE #$FF,ASET ; USE THIS FOR LATER ATTRACT MODES
  83. JSR SAVEAIR
  84. LDA #TRUE ; THIS IS IT.
  85. JMP SETRPLY
  86. ; Go ahead and copy the tables for IR into AIR, and use this even though
  87. ; it's not an instant replay, until a real IR comes along.
  88. ; If ASET is negative, the AIR tables already contain an IR.
  89. ; Don't copy--
  90. NOREPLAY LDA MODE don't copy if this is already an
  91. CMP #MATTRACT attract mode
  92. BEQ SKIPCOPY
  93. LDA ASET
  94. BMI SKIPCOPY
  95. JSR SAVEAIR
  96. LDA #2
  97. STA ASET
  98. LDX CURRENT X is used by "SAVEAIR" routine
  99. SKIPCOPY LDA PLRACK
  100. CMP #124
  101. BCS NOINC if greater than 124, no increment
  102. INC PL0RACK,X ; PLAYER 0 OR 1
  103. NOINC
  104. ; ADD ONE TO THE BCD REPRESENTATION OF THE LEVEL:
  105. ; Increment PLBCD regardless, since all level display is based on
  106. ; the last digit of this:
  107. TXA
  108. ASL A ; 0 OR 2
  109. TAX
  110. INX ; LOW BYTE (LOW ORDER DIGITS)
  111. ; 1 OR 3
  112. SED
  113. LDA PL0BCD,X
  114. CLC
  115. ADC #1
  116. STA PL0BCD,X
  117. DEX ; HIGH ORDER DIGITS
  118. LDA PL0BCD,X
  119. ADC #0
  120. STA PL0BCD,X
  121. CLD
  122. LASTRACK LDA #FALSE
  123. SETRPLY STA DOITOVER
  124. JMP CHARINIT
  125. HERODIE MOVE #FALSE,DOITOVER ; NO IR THIS TIME !
  126. LDX CURRENT
  127. STA PL0FIRST,X
  128. LDA ASET If there's no winning rack in the AIR
  129. BNE SKIPIT tables, then store this one
  130. JSR SAVEAIR
  131. INC ASET set to 1
  132. SKIPIT
  133. MOVE #0,PL0CARRY,X ; GET RID OF ANY CARRIED FOOD
  134. MOVE #TRUE,PLMESS ; SET MESSAGE FOR NEXT PLAYER TO DISP.
  135. DEC PL0LIVES,X ; TAKE AWAY A LIFE
  136. BEQ HDIEOVER ; IF NO LIVES ARE LEFT
  137. LDX OTHER
  138. LDA PL0LIVES,X
  139. BEQ HERODIE0 ; OTHER PLAYER HAS NO LIVES- ; DON'T CHANGE "CURRENT"
  140. MOVE CURRENT,OTHER ; SWITCH PLAYERS-- OTHER IN X
  141. STX CURRENT
  142. HERODIE0 JMP CHARINIT
  143. ; This routine saves all relevant information for the attract mode IR.
  144. SAVEAIR COPY IRDIRA,AIRDIRA,$140 do all five tables in this loop
  145. MOVE IRCCNT,AIRCCNT cyclecnt
  146. MOVE IRAND0,AIRAND0 random0
  147. MOVE IRAND1,AIRAND1 random1
  148. MOVE IRCARRY,AIRCARRY information about carried food
  149. MOVE PLRACK,AIRLEVEL level the replay occurred on
  150. MOVE PLBCD+1,AIRBCD to get pile type correct
  151. RTS
  152. ; ALL THE LIVES FOR THIS PLAYER ARE GONE. CHECK THE OTHER PLAYER-; AFTER PLAYING THE "END OF GAME" TUNE
  153. HDIEOVER JSR SCRAPALL ; GET RID OF ANY SOUNDS
  154. LDA #12
  155. JSR TUNIN
  156. LDA #13
  157. JSR TUNIN
  158. ; CALL "MKPROMPT" WHICH WILL ACCOMPLISH THE WAIT WHILE DISPLAYING
  159. ; THE "GAME OVER" MESSAGE
  160. ; NOTE: FIRST OF ALL, GET RID OF ALL THE FOODS, SO THERE WILL BE ENOUGH
  161. ; DMA TIME FOR THE TEXT
  162. LDA #0
  163. LDY #FOODSTRT+NUMFOOD
  164. NUFFDMA STA CYPOS,Y
  165. DEY
  166. CPY #FOODSTRT
  167. BPL NUFFDMA
  168. JSR MLOADER ; CLEAN OUT THE DLISTS WITH THE FOODS
  169. LDA #1
  170. JSR MKPROMPT
  171. LDA PLAYNUM ; "TRUE" IF TWO PLAYER
  172. BEQ ZEND0 ; ELSE, GAME IS OVER
  173. LDX OTHER ; OTHER PLAYER
  174. LDA PL0LIVES,X
  175. BEQ ZEND0 ; NEITHER PLAYER HAS ANY LIVES
  176. MOVE OTHER,TEMP0 ; SWITCH PLAYERS
  177. MOVE CURRENT,OTHER ; IF ONLY ONE PLAYER, OTHER==CURRENT
  178. MOVE TEMP0,CURRENT
  179. MOVE #MGAME,MODE
  180. NEWSTATE GAME
  181. JMP CHARINIT
  182. ; BOTH PLAYERS ARE DEAD-- PASS CONTROL TO HISCORE ENTRY, THEN BACK TO LOGO
  183. ZEND0 JSR MKENTER ; WILL GET LAST PLAYER TO GO
  184. DMAOFF
  185. LDA PLAYNUM
  186. BEQ ZEND00 ; WAS ONE-PLAYER
  187. MOVE OTHER,CURRENT ; NOW THE OTHER PLAYER
  188. JSR MKENTER
  189. ZEND00 JSR HSCRTN clean-up after HSC is done
  190. MOVE #FALSE,RUNLOAD
  191. MOVE #0,CURRENT ; SO THAT JOYSTICK AND BUTTON ARE
  192. ; PLAYER 0
  193. JMP MKLOGO
  194. CHARINIT
  195. ; DMAOFF
  196. MOVE #STATINIT,STATUS
  197. MOVE #1,MAXCYCLE ; JUST FOR CHEFS RISING
  198. MOVE #0,NUMCYCLE
  199. JSR CLRSCRN
  200. ; WAIT TILL WE'RE ON SCREEN:
  201. RINITLP BIT MSTAT
  202. BPL RINITLP
  203. ; AT THIS POINT, WE'RE ON SCREEN; NOW WAIT FOR VBLANK TO BE REACHED AGAIN
  204. ; SO THAT SETTING OF SEEDS OCCURS BEFORE NEXT SCREEN
  205. RINITLP1 BIT MSTAT
  206. BMI RINITLP1
  207. ; VBLANK WAS JUST ENTERED; HANDLE SETTING OF "CYCLECNT", "RANDOM0", AND
  208. ; "RANDOM1" BEFORE THE NEXT DLI OCCURES
  209. ; "DOITOVER" WILL BE SET "TRUE" IF IT'S SUPPOSED TO BE A REPLAY
  210. LDA DOITOVER
  211. BEQ ZIR0003 ; NO IR
  212. LDA CSTATE
  213. CMP #WON ; IF HE JUST DIED, THEN NO IR
  214. BNE ZIR0003
  215. ; THIS IS AN INSTANT REPLAY !
  216. LDA ASET
  217. BEQ NORMAL
  218. LDA MODE
  219. CMP #MATTRACT
  220. BNE NORMAL
  221. MOVE AIRCCNT,CYCLECNT this is an attract replay-- use
  222. MOVE AIRAND0,RANDOM0 the attract IR values
  223. MOVE AIRAND1,RANDOM1
  224. LDX CURRENT
  225. MOVE AIRCARRY,PL0CARRY,X
  226. MOVE AIRLEVEL,PL0RACK,X ; SAME RACK AS REPLAY ORIGINALLY WAS
  227. TXA get 0 or 2 into X
  228. ASL A
  229. TAX
  230. MOVE AIRBCD,PL0BCD+1,X
  231. JMP ZIR0004 go ahead past stuff
  232. NORMAL MOVE IRCCNT,CYCLECNT ; RESTORE CORRECT RANDOM GENERATOR
  233. MOVE IRAND0,RANDOM0
  234. MOVE IRAND1,RANDOM1
  235. LDX CURRENT
  236. MOVE IRCARRY,PL0CARRY,X
  237. LDA MODE ; NO IR MESSAGE IF IT'S JUST AN
  238. CMP #MATTRACT ; INSTANT REPLAY--
  239. BEQ ZIR0004
  240. JSR COLRINIT ; WASTES TIME BUT SAVES ROM
  241. ; RESTORE 19,15,1F INTO P5
  242. LDA #2 ; IR MESSAGE
  243. JSR MKPROMPT ; WHILE PLAYFIELD IS BLANK
  244. JMP ZIR0004
  245. ; THIS RACK ISN'T AN INSTANT REPLAY-
  246. ZIR0003 MOVE CYCLECNT,IRCCNT
  247. MOVE RANDOM0,IRAND0
  248. MOVE RANDOM1,IRAND1
  249. LDX CURRENT
  250. MOVE PL0CARRY,X,IRCARRY
  251. ; ZERO OUT JUST THE THROW TABLE-- THE DIRECTION TABLE WILL BE WRITTEN
  252. ; OVER EACH TIME I STORE A HIGH NIBBLE, BUT THE THROW TABLE
  253. ; IS ALWAYS WRITTEN TO USING "ORA" STATEMENTS.
  254. LDY #$3F ; TABLE IS $40
  255. LDA #0
  256. ZIR0100 STA IRTHROW,Y
  257. DEY
  258. BPL ZIR0100
  259. ZIR0004 LDA #0
  260. STA CYCLEIDX
  261. STA CYCLEIDX+1
  262. STA THROWIDX
  263. ; FIND OUT WHICH PLAYER THIS IS IF TWO PLAYER-- SET PLRACK APPROPRIATELY
  264. APINOVER
  265. LDX CURRENT gets used at PINOVER
  266. BEQ P1INIT
  267. MOVE PL1RACK,PLRACK ; SECOND PLAYER
  268. MOVE PL1CARRY,PLCARRY
  269. MOVE PL1LIVES,PLLIVES
  270. MOVE PL1BCD,PLBCD
  271. MOVE PL1BCD+1,PLBCD+1
  272. MOVE PL1FIRST,PLFIRST
  273. JMP PINOVER
  274. P1INIT MOVE PL0RACK,PLRACK ; FIRST PLAYER
  275. MOVE PL0CARRY,PLCARRY
  276. MOVE PL0LIVES,PLLIVES
  277. MOVE PL0BCD,PLBCD
  278. MOVE PL0BCD+1,PLBCD+1
  279. MOVE PL0FIRST,PLFIRST
  280. PINOVER LDA PLRACK update highest selected level allowed
  281. CMP HIGHEST,X select up to last highest always
  282. BCC NONEWHI allowed
  283. CMP #125 also, don't let HIGHEST become
  284. BCS NONEWHI greater than 125
  285. STA HIGHEST,X
  286. LDA PLAYNUM if one player, copy into 2nd player
  287. BEQ COPYTWO
  288. LDA PL1FIRST If this is the first rack for
  289. BNE NONEWHI player 2, don't copy over
  290. ; Use the greatest HIGHEST value for both of the HIGHEST registers
  291. COPYTWO LDA HIGHEST
  292. CMP HIGHEST+1
  293. BCS USETHIS
  294. MOVE HIGHEST+1,HIGHEST
  295. BNE NONEWHI a jump
  296. USETHIS STA HIGHEST+1
  297. NONEWHI
  298. ; JUMP TO THE RACK SELECT MODE IF THIS IS THE FIRST RACK FOR THIS PLAYER:
  299. LDA PLFIRST
  300. BEQ RACKSTRT not the first rack
  301. LDA MODE ; NO SELECT IF ATTRACT MODE
  302. CMP #MATTRACT
  303. BEQ RACKSTRT
  304. JSR MKSELECT ; WON'T "RTS" UNTIL "THROW" IS PUSHED
  305. ; DMAOFF turn DMA off while characters init.
  306. JSR COLRINIT ; SINCE "SELECT" HAS A LOGO
  307. JSR SETMAPS ; IN "MAIN.S"-- SETS MAPS FOR GAMEPLAY
  308. ; INCLUDING SCORES AND HEADS ETC.
  309. RACKSTRT JSR CLRSTRCT ; CLEAR ALL THE STRUCTURE ARRAYS
  310. ; ALSO CLEARS "STATLIST"
  311. ; NOW SET UP THE STAT LIST FOR THIS PLAYER-- RACK NUMBER, AND LIVES LEFT
  312. JSR STATDISP
  313. ; NOW SETUP THE "LEVEL NNN" LIST ; UP TO THREE DIGITS
  314. LIFELP0 MOVE #FALSE,TEMP0 ; USE THIS TO TELL IF ZEROES ARE
  315. ; DISPLAYED
  316. LDA PLRACK if this is level 125 or up, display
  317. CMP #124 the number "125" despite value in
  318. BMI NOTLAST PLBCD
  319. MOVE #$D8,CLOWMAP2+12 "1"
  320. MOVE #$D9,CLOWMAP2+13
  321. MOVE #$DA,CLOWMAP2+14 "2"
  322. MOVE #$DB,CLOWMAP2+15
  323. MOVE #$E0,CLOWMAP2+16 "5"
  324. MOVE #$E1,CLOWMAP2+17
  325. BNE STATOVER a jump
  326. NOTLAST LDA PLBCD ; LIVES IN BCD
  327. BEQ LIFELP1 ; IF ZERO, NO DIGIT
  328. ASL A ; TIMES 2
  329. ADC #$D6 ; DIGIT "1" IS AT $D8
  330. STA CLOWMAP2+12
  331. ADC #1
  332. STA CLOWMAP2+13
  333. MOVE #TRUE,TEMP0
  334. LIFELP1 LDA PLBCD+1
  335. LSR A
  336. LSR A
  337. LSR A
  338. LSR A
  339. LDX TEMP0
  340. BNE LIFELP2 ; IF "TRUE", DISPLAY IT
  341. TAY ; TO RESET FLAGS TO "A"
  342. BEQ LIFELP3 ; IF ZERO, SKIP THIS ONE
  343. LIFELP2 ASL A ; TIMES 2
  344. ADC #$D6 ; THE "O" CHARACTER
  345. STA CLOWMAP2+14
  346. ADC #1
  347. STA CLOWMAP2+15
  348. LIFELP3 LDA PLBCD+1
  349. AND #$F
  350. ASL A ; TIMES 2
  351. ADC #$D6
  352. STA CLOWMAP2+16
  353. ADC #1
  354. STA CLOWMAP2+17
  355. STATOVER
  356. ; DMAOFF now done above at CHARINIT
  357. JSR CLRSCRN ; CLEAR DISPLAY LISTS
  358. JSR CONEDRAW
  359. JSR HERODRAW dma gets turned on in here
  360. AAASTOP
  361. JSR PILEDRAW
  362. JSR HOLEDRAW
  363. JSR CHEFINIT
  364. ; wait till offscreen, because the two of these together will take forever
  365. ONSCREEN
  366. INVBLANK
  367. ATIME1
  368. JSR FLOADER ; DISPLAY ALL THE FIXED CHARS; SET
  369. ATIME15 ; UP "LISTSTRT" TO REFLECT THEM
  370. JSR MLOADER ; DISPLAY ALL THE MOVING CHARACTERS
  371. ATIME2
  372. RTS
  373. ; CALLED ABOVE AND ALSO FROM "SCORE.S"
  374. STATDISP LDX PLLIVES
  375. LDY #$10 ; INDEX OF LAST MAP ENTRY
  376. LIFELOOP CPX #2
  377. BMI STATDBYE ; EXIT LOOP IF 1 OR 0
  378. MOVE #STHEADCH+1,CLOWMAP1,Y
  379. DEY
  380. MOVE #STHEADCH,CLOWMAP1,Y
  381. DEY
  382. BMI STATDBYE ; MAXIMUM DISPLAYED LIVES
  383. DEY ; INSERT A SPACE BETWEEN
  384. DEX
  385. JMP LIFELOOP
  386. STATDBYE RTS
  387. ; THIS ROUTINE CLEARS OUT THE CHARACTER INFORMATION ARRAYS BY
  388. ; SETTING THE Y COORDINATES OF EVERYTHING TO 0 (THIS SIGNIFIES
  389. ; THAT IT'S NOT ON THE SCREEN).
  390. ; ZERO OUT ALL OF THE CHARACTERS:
  391. CLRSTRCT MOVEPTR CPALW,TEMP0
  392. ; ZERO OUT ALL OF THE CHARACTER INFORMATION ARRAYS:
  393. ; THIS IS A TOTAL OF 977 BYTES, 3 PAGES + 209 BYTES.(1/3/84)
  394. LDX #2 ; DO THREE PAGES
  395. LDY #00
  396. LDA #0
  397. ZSLP01 STA (TEMP0),Y
  398. DEY
  399. BNE ZSLP01
  400. DEX
  401. BMI ZSLPEND1 ; THREE PAGES HAVE BEEN DONE
  402. INC TEMP1 ; ELSE GO TO NEXT PAGE
  403. JMP ZSLP01
  404. ZSLPEND1 LDY #208 ; DO 209 BYTES OF THE 4TH PAGE
  405. INC TEMP1
  406. ZSLP02 STA (TEMP0),Y
  407. DEY
  408. BNE ZSLP02
  409. MOVEPTR CSTATE+1,TEMP0 ; ZERO OUT ALL BUT CHUCK'S STATE
  410. LDA #0
  411. LDY #$5E ; 3 ARRAYS, $20 EACH
  412. ; MINUS 1 FOR CHUCK
  413. ZSLP03 STA (TEMP0),Y
  414. DEY
  415. BPL ZSLP03
  416. STA NUMINAIR ; NO CARRY OVER FROM LAST LEVEL
  417. STA NUMSTUCK ; ALSO NO CARRY FROM LAST LEVEL
  418. STA ALLGONE ; STORE "FALSE" HERE
  419. STA IRCHTIME ; RESET NEAR CHEF TIMER
  420. STA IRCHTIME+1
  421. LDX #TOTALCH-1
  422. ZSTRCT00 LDA #0
  423. STA CYPOS,X
  424. STA CXPOS,X
  425. STA CYPOSL,X
  426. STA CXPOSL,X
  427. STA CINFO,X ; FOR USAGE BY "PILEDRAW"
  428. STA CSECOND,X ; 0 MEANS DO SECOND ZONE
  429. MOVE #8,OLDDIR,X ; SO THAT "OLDDIR" WORKS
  430. MOVE #BLOCK1,CHSTAMP,X ; DEFAULT IS FIRST BLOCK
  431. DEX
  432. BPL ZSTRCT00
  433. LDX #TOTALFX-1
  434. ZSTRCT01 LDA #0
  435. STA FYPOS,X
  436. STA FINFO,X
  437. STA FDLPOS,X
  438. STA FSTATE,X
  439. MOVE #BLOCK1,FHSTAMP,X ; DEFAULT
  440. DEX
  441. BPL ZSTRCT01
  442. ; PUT ALL NULL CHARACTERS INTO THE LIVES LEFT MAP:
  443. LDX #16
  444. LDA #NULL2
  445. ZSTRCT02 STA CLOWMAP1,X
  446. DEX
  447. BPL ZSTRCT02
  448. ; FILL ONLY THE DIGITS WITH NULL: (LEVEL INFO)
  449. LDX #17
  450. ZSTRCT03 STA CLOWMAP2,X
  451. DEX
  452. CPX #12
  453. BPL ZSTRCT03
  454. RTS
  455. ; THIS ROUTINE FILLS THE DISPLAY LIST WITH ZEROS, LEAVING THE LEFT AND
  456. ; RIGHT SIDE WALLS INTACT (THEY'RE ALWAYS THE FIRST TWO ITEMS
  457. ; IN THE LIST).
  458. ; NOTE: MAKE SURE TO CHANGE THIS SO THAT IT ALSO LEAVES THE HEADERS
  459. ; FOR THE TOP AND BOTTOM WALLS !
  460. CLRSCRN ONSCREEN make sure it's done off-screen
  461. INVBLANK
  462. LDX #9 ; DLISTS 9 TO 1 HAVE LENGTH 8
  463. LDY #8
  464. CLR0011 STY LISTSTRT,X
  465. STY LISTSIZE,X
  466. DEX
  467. BPL CLR0011
  468. LDY #20
  469. STY LISTSTRT+10
  470. STY LISTSIZE+10
  471. STY LISTSTRT
  472. STY LISTSIZE
  473. LDX #10
  474. CLR0012 MOVE LISTTABL,X,LISTPTR
  475. MOVE LISTTABH,X,LISTPTR+1
  476. LDY LISTSIZE,X
  477. ZCLR01 LDA #0
  478. STA (LISTPTR),Y
  479. INY
  480. CPY #LISTLENG ; LENGTH OF A DLIST
  481. BMI ZCLR01
  482. DEX ; GO TO NEXT DLIST
  483. BPL CLR0012
  484. RTS
  485. ; THIS ROUTINE DRAWS THE CONE IN A RANDOMLY SELECTED DLIST.
  486. CONEDRAW
  487. LDA #CONEX ; X POSITION IS ALWAYS THE SAME
  488. STA FXPOS+CONESTRT
  489. ; Change the color of the cone to reflect the digit of this rack--
  490. ; 10 different possibilities.
  491. LDA PLBCD+1
  492. AND #$F
  493. TAX
  494. MOVE CONECOL1,X,COLORS+28
  495. MOVE CONECOL2,X,COLORS+29
  496. LDA PLRACK
  497. CMP #CONERAND ; ONLY RANDOM AFTER LEVEL L
  498. BPL CD0001
  499. LDA #$5F ; CENTER OF LEFT WALL
  500. INC CINFO+5 ; SO THAT PILES' "FDLPOS" IS CORRECT
  501. JMP CD0002
  502. CD0001 JSR RANDOMY ; PICK A RANDOM DLIST
  503. LSR A ; GET ZONE NUMBER FOR CINFO
  504. TAX ; INCREMENT "CINFO" SO PILES
  505. INC CINFO,X ; ARE CORRECT
  506. ASL A ; MULTIPLY BY 16 AND ADD 15 TO
  507. ASL A ; ADJUST CONE TO TOP OF ZONE
  508. ASL A
  509. ASL A
  510. CLC
  511. ADC #15
  512. CD0002 STA FYPOS+CONESTRT
  513. LDA #CONECHAR
  514. STA FSTAMP+CONESTRT
  515. LDA #BLOCK2
  516. STA FHSTAMP+CONESTRT
  517. LDA #CONEPALW
  518. STA FPALW+CONESTRT
  519. MOVE #6,FSTATE ; TELLS WHICH FRAME CONE IS ON
  520. MOVE #180,FINFO ; 6 SECONDS
  521. ; SET UP THE DRIPPING INFORMATION:
  522. MOVE #45,DRIPTIME
  523. MOVE #99,DRIPFRAM ; WAITING BEFORE FIRST DRIP
  524. LDA #0
  525. STA CYPOS+DRIPSTRT
  526. LDA DRIPCHAR+2
  527. STA CSTAMP+DRIPSTRT
  528. LDA #$FF ; PALETTE 7, WIDTH 1
  529. STA CPALW+DRIPSTRT
  530. LDA #BLOCK2
  531. STA CHSTAMP+DRIPSTRT
  532. LDA FYPOS
  533. LSR A
  534. LSR A
  535. LSR A
  536. LSR A ; GET ZONE INDEX BACK
  537. ORA #$20 ; WE KNOW IT'S THE 3RD ENTRY
  538. STA FDLPOS
  539. RTS
  540. ; DRAW THE HERO
  541. ; BASE HIS POSITION ON THE CONE'S--
  542. ; 5F - CONEY + 5F = HEROY
  543. HERODRAW
  544. MOVE #FALSE,THROWBUT ; MAKE SURE HE DOESN'T THROW RIGHT
  545. ; AWAY
  546. LDA DOITOVER
  547. BEQ ZHD020 ; NORMAL RACK
  548. LDA MODE ; THIS MIGHT BE ATTRACT MODE-- DON'T
  549. CMP #MATTRACT ; DO THIS TUNE !
  550. BEQ HDSKIP10
  551. MOVE #FALSE,DOITOVER ; SO THAT "TUNIN" WILL WORK
  552. JSR SCRAPALL ; PLAY THE TUNE
  553. LDA #21
  554. JSR TUNIN
  555. LDA #22
  556. JSR TUNIN
  557. HDSKIP10 MOVE #TRUE,DOITOVER
  558. ZHD020 LDA #HEROX
  559. STA CXPOS
  560. STA CXPOS+1 ; BOTTOM HALF
  561. STA FXPOS-1 ; FOR "SPACEM"
  562. LDA #$BE ; 5F - CONEY + 5F = BE - CONEY
  563. SEC
  564. SBC FYPOS+CONESTRT
  565. STA CYPOS
  566. STA FYPOS-1 ; FOR "SPACEM"
  567. SEC
  568. SBC #12 ; TOP HALF IS 16 HIGH
  569. STA CYPOS+1
  570. MOVE CCHEADS+6,CSTAMP ; FIRST FRAME OF LEFT MOVEMENT
  571. MOVE #HEROPALW,CPALW,CPALW+1
  572. MOVE #ARMPALW,CPALW+2
  573. MOVE #6,CDIR ; FACING LEFT TO START
  574. LDA PLRACK
  575. CMP #31
  576. BMI ZHD022 ; IF LESS THAN 48, USE TABLE
  577. LDX #15 ; MAXIMUM TABLE VALUE
  578. JMP ZHD023
  579. ZHD022 JSR MAXSET
  580. DEX get 0,1,2 for MAXCYCLE
  581. TXA
  582. ASL A
  583. ASL A
  584. ASL A times 8 for table lookup base
  585. STA TEMP0
  586. LDA PLRACK
  587. AND #$F ; 0 - 15 BATCHES
  588. LSR A ; 8 SPEEDS PER 16 RACKS
  589. ORA TEMP0 this is the same as adding temp0
  590. TAX ; BASED ON "MAXCYCLE" CHANGING
  591. ; EVERY 10 RACKS
  592. ZHD023 MOVE HSPEED,X,CSINDEX ; HERO SPEED
  593. TAX
  594. MOVE MTABSPD,X,CSPEED
  595. STA CFRAME ; MOVE COUNTER
  596. ASL A
  597. STA CFRAME+1 ; ANIMATE COUNTER
  598. MOVE #2,CACOUNT ; THREE HERO ANIMATIONS, FOR NOW
  599. ; If the hero is carrying, then set up his arms and display the food
  600. ; in his hand
  601. BIT PLCARRY
  602. BMI ZHDRAW00
  603. JMP ZHDRAW01
  604. ZHDRAW00 LDA PLCARRY
  605. AND #$7F
  606. STA CTYPE+FOODSTRT
  607. TAY
  608. LDA FLYCHAR,Y
  609. STA CSTAMP+FOODSTRT
  610. LDA FLYPALW,Y
  611. STA CPALW+FOODSTRT
  612. LDA #CARRIED
  613. STA CSTATE+FOODSTRT
  614. LDA #0
  615. STA CREATOR+FOODSTRT
  616. MOVE CCARMS+6,CSTAMP+2
  617. MOVE CCRUNLC,CSTAMP+1
  618. LDA CYPOS
  619. SEC
  620. SBC #4
  621. STA CYPOS+2
  622. LDA CXPOS
  623. SEC
  624. SBC #2
  625. STA CXPOS+2
  626. MOVE #FOODSTRT,HELDFOOD
  627. JSR CFOODADJ
  628. MOVE #CARRYING,CSTATE
  629. MOVE #0,PLCARRY
  630. JMP ZHDRAWA0 ; display cone and hero and
  631. ; turn on dma
  632. ZHDRAW01 MOVE #RUNNING,CSTATE
  633. MOVE CCRUNL,CSTAMP+1 ; FIRST FRAME-- FEET
  634. MOVE #0,CYPOS+2
  635. ; We reach here regardless of whether hero was carrying or not
  636. ZHDRAWA0 JSR FLOADER ; DISPLAY THE CONE
  637. JSR MLOADER ; DISPLAY THE HERO
  638. LDA FYPOS ; CALCULATE THE ZONE OF THE CONE
  639. LSR A
  640. LSR A
  641. LSR A
  642. LSR A
  643. TAY
  644. MOVE #8,LISTSTRT,Y ; RESTORE SO THAT I DON'T GET 2 CONES
  645. ; JSR DPPINIT ; TURN DMA ON, SO THAT WE CAN SEE THE
  646. ; THE MESSAGE AND REST OF RACK
  647. LDA DOITOVER ; NO MESSAGE HERE IF IR
  648. BNE ZHDRAW02
  649. LDA PLAYNUM
  650. BEQ ZHDRAW88 ; IF ONE PLAYER GAME
  651. LDA PLMESS ;
  652. BNE ZHDRAW20 ; IF PLMESS = TRUE THEN MESSAGE
  653. ; BEQ ZHD0221 ; ELSE DON'T DISPLAY
  654. ; IF A ONE-PLAYER GAME, MESSAGE DISPLAYS ONLY ON VERY FIRST RACK AND LIFE
  655. ZHDRAW88 LDA PLFIRST ; ONLY IF THE FIRST LIFE,FIRST RACK
  656. BEQ ZHD0211
  657. ZHDRAW20 MOVE #0,PLMESS ; NO MORE MESSAGE (UNTIL DEATH)
  658. JSR MKPROMPT ; NO "RTS" UNTIL WAIT IS DONE
  659. ; PLAY THE RACK START TUNE AFTER THE PROMPT GOES AWAY AND AS THE CHEFS
  660. ; START TO RISE:
  661. LDA PLFIRST ; IF THIS PLAYER'S FIRST RACK
  662. BEQ ZHD0211 ; LATER RACK-- SHORT TUNE
  663. LDA #00 ; IF FIRST RACK AND FIRST LIFE
  664. JMP ZHD0212
  665. ZHD0211 LDA #30 ; IF LATER LEVEL OR LIFE
  666. ZHD0212 JSR TUNIN
  667. ZHDRAW02 RTS