MAIN.S 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. * MAIN.S
  2. * THIS FILE IS FILLED WITH CRITICAL USEFUL ROUTINES.
  3. ; "STARTUP"-- COMES HERE ON POWERUP
  4. ; "POWERUP"-- HANDLES ALL ONE-TIME MEMORY INITIALIZATION
  5. ; "NEWGAME"-- CALLED TO INITIATE A NEWGAME FROM ANOTHER MODE
  6. ; "NEWRACK"-- CALLED WHEN A GAME RACK HAS JUST ENDED
  7. ; "GAME"-- CALLED FROM "GOD" WHEN MODE==MGAME
  8. ; "REPLAY"-- USED TO READ CONTROLLER VALUES FROM REPLAY TABLES
  9. ; "GAMEINIT"-- CALLED FROM "NEWGAME" TO DO ONE-TIME GAME STUFF
  10. ; "COLRINIT"-- SETS ALL PALETTES TO NORMAL GAME PALETTES
  11. ; ALL DLI HANDLERS FOR GAMEPLAY DISPLAY LISTS
  12. ;
  13. GLBL NUMCHHIT,LASTPILE
  14. GLBL MKPROMPT
  15. GLBL GOD
  16. GLBL STATDISP
  17. GLBL GODPTR
  18. GLBL SETMAPS
  19. GLBL AWOLDRAW
  20. GLBL CHUCK
  21. GLBL CHEFMOVE
  22. GLBL FOODMOVE
  23. GLBL ICEMELT
  24. GLBL FOODHIT
  25. GLBL PILEHIT
  26. GLBL HOLEHIT
  27. GLBL CONEHIT
  28. GLBL CHEFHIT
  29. GLBL SCRAPALL,TUNIN
  30. GLBL WAIT ; IN "FOODMOVE"
  31. GLBL COLRINIT,NEWGAME
  32. GLBL CLEARALL ; IN "LOGO.S"
  33. GLBL GAME
  34. GLBL PAUSE
  35. GLBL DLLCOPY
  36. GLBL DPPINIT,DPPSTORE
  37. GLBL NMIRTN ; FROM "HISCORE.S"
  38. GLBL GLCONT21
  39. GLBL MPAUSE
  40. GLBL REPLAY,DOGAME,NEWRACK
  41. GLBL GAMEINIT
  42. GLBL MKHISCOR
  43. GLBL PREFRESH
  44. GLBL RANDSEED,RANDK,RANDJ
  45. GLBL HIGHSCOR,M160X2,MKLOGO
  46. GLBL M320X1
  47. GLBL TRUE,LOGO,FALSE
  48. GLBL CHARINIT,RACKINIT,STATWON
  49. GLBL STATDIE,STATBON,STATDIEH,STATINIT,STATWAIT,DEAD,WON
  50. GLBL STATEND
  51. GLBL STATENDR
  52. GLBL PL0RACK,PL1RACK,PL0LIVES,PL1LIVES,PL0SCORE,PL1SCORE
  53. GLBL PL0FIRST,PL1FIRST
  54. GLBL PL0IRTIM,PL1IRTIM
  55. GLBL PL0BONUS,PL1BONUS
  56. GLBL PL0BCD,PL1BCD
  57. GLBL PL0CARRY,PL1CARRY,CMAP1
  58. GLBL CMAPHIGH,CMAP2,CLOWMAP1,CLOWMAP2,NULL2,NULLCHAR
  59. GLBL PUTSCORE,BACKCOLR,STATLOGO
  60. GLBL DLIST0,DLIST1,DLIST2,DLIST3,DLIST4,DLIST5,DLIST6
  61. GLBL DLIST7,DLIST8,DLIST9,DLIST10
  62. GLBL DLISTA,DLISTB
  63. GLBL STATLIST,SCORELST
  64. GLBL FINFO,POLE,TUNER,MLOADER
  65. GLBL DLLRAM
  66. GLBL MLOGO,MGAME,MATTRACT,MBLANK
  67. GLBL MTEXT,MSELECT
  68. GLBL CDIR
  69. GLBL IRDIRA,IRDIRB,IRTHROW
  70. GLBL IRDIRC,IRDIRD
  71. GLBL AIRDIRA,AIRDIRB,AIRDIRC,AIRDIRD,AIRTHROW
  72. GLBL ASET
  73. GLBL IRTNDONE
  74. GLBL DRIPTIME
  75. GLBL DLI1,DLI4
  76. GLBL COLORROM,COLORS,LISTTABL,LISTTABH,TOPZONE,DLLROM
  77. GLBL SWLIST,NULLLIST,JOYTABLE,TRUEBUT
  78. GLBL DIRTABL,DIRTABH,ADIRTABL,ADIRTABH,RACKWORD
  79. GLBL FOODSTUF,FOODWORD
  80. RAMDEF ; ZERO PAGE
  81. ORG $FFF8
  82. DB $FF,$E7 ; ADDRESSES START AT $A000
  83. DB L(NMIVEC),H(NMIVEC) ; GO HERE FOR DLI
  84. DB L(STRTHERE),H(STRTHERE) ; GO HERE ON RESET
  85. DB L(NOTNMI),H(NOTNMI) ; SO THAT I CAN INITIATE A DLI
  86. ; FROM SOFTWARE
  87. ORG $EFFA
  88. STRTHERE JMP STARTUP
  89. NOTNMI RTI
  90. RSEG CODE1 ; WILL BE SET TO B000
  91. ; THE FOLLOWING BODY OF CODE IS THE POWER UP INITIALIZATION:
  92. STARTUP SEI ; PERMANENT
  93. MOVE #7,$01 ; LOCKS THE BASE UNIT INTO 3600 MODE
  94. MOVE #$7F,CTRL color is on
  95. CLD ; ALWAYS CLEARED
  96. LDA #0 ; MAKE SURE BUTTONS WILL WORK
  97. STA CTLSWA
  98. STA CTLSWB
  99. STA OFFSET ; OLD LOCATION OF "OFFSET"
  100. ; CAN'T USE "JSR" SINCE THIS ROUTINE ZEROS THE STACK
  101. LDX #$FF ; STACK IN TOP OF ZERO PAGE
  102. TXS ;SET STACK POINTER
  103. JMP ZERORAM
  104. ZRAMRTN
  105. JSR SCRAPALL ; INITIALIZE SOUND
  106. JSR COLRINIT ; INITIALIZE COLORS BEFORE LOGO
  107. JSR POWERUP ; SETS DLL AND CTRL (STARTS DMA)
  108. JMP MKLOGO ; THIS RETURNS TO "GOD"
  109. ********************************************************************************
  110. ; JMP HERE ANYTIME WE'RE ABOUT TO START A GAME.
  111. ; RESET THE STACK POINTER.
  112. ; FIRST OF ALL, MAKE SURE THAT THE FIRST DLIST DOESN'T SET THE WRITE MODE,
  113. ; SINCE THIS WILL HAPPEN ONCE IN THE VERY FIRST DLI1 AFTER POWERUP.
  114. NEWGAME INC GAMECNT
  115. LDX #$FF
  116. TXS
  117. MOVE #MGAME,MODE
  118. NEWSTATE GAME
  119. MOVE #FALSE,RUNLOAD
  120. JSR CLEARALL ; IN LOGO.S
  121. JSR SCRAPALL ; NO TUNES, PLEASE !
  122. ; ZERO OUT PLAYER SCORES BEFORE A NEW GAME--
  123. LDA #0
  124. LDX #3
  125. ZGILP01 STA PL0SCORE,X
  126. STA PL1SCORE,X
  127. DEX
  128. BPL ZGILP01
  129. JSR GAMEINIT ; SETS APPROPRIATE VARIABLES
  130. ; JSR AWOLDRAW ; CALLED WHEN "SELECT" EXITS
  131. JSR COLRINIT ; NECESSARY SINCE LOGO AND HISCORE
  132. ; CHANGE THE PALETTES
  133. JSR CHARINIT ; SET UP THE RACK, FIRST TIME !
  134. ; THIS MEANS THERE'S NO NEED
  135. ; TO TEST FOR END OF GAME, WHICH
  136. ; "RACKINIT" DOES.
  137. ; JSR DPPINIT DMA turned on in HERODRAW
  138. MOVE #TRUE,RUNLOAD
  139. ENDCYCLE
  140. ; JSR HERE FOR A NEW RACK
  141. NEWRACK
  142. MOVE #FALSE,RUNLOAD ;Must be off after hero displays
  143. ;while fixed stuff initializes
  144. JSR RACKINIT ; INITIALIZE EVERYTHING
  145. ; DMA is turned on there
  146. MOVE #TRUE,RUNLOAD
  147. RTS ; LET GOD PROCESS "GAME"
  148. ; THIS ROUTINE IS CALLED FROM GAME IF PERCHANCE CHARLIE CHUCK WERE TO DIE
  149. ; ON AN INSTANT REPLAY. BUT, AS WE ALL KNOW THIS IS IMPOSSIBLE (?).
  150. IRDEATH MOVE #FALSE,DOITOVER
  151. JSR SCRAPALL
  152. LDA #27 ; PLAY FREE MAN TUNE.
  153. JSR TUNIN
  154. LDX CURRENT
  155. INC PL0LIVES,X
  156. INC PLLIVES
  157. JSR STATDISP ; GIVE EXTRA C.C. & DISPLAY
  158. LDA #4
  159. JSR MKPROMPT
  160. MOVE #WON,CSTATE
  161. MOVE #TRUE,DOITOVER
  162. JMP SKIPSKIP
  163. ; THIS ROUTINE IS CALLED FROM "GOD" IF WE'RE IN GAMEPLAY MODE.
  164. ; FIRST TEST TO SEE IF THIS IS THE WAIT AT THE END OF THE RACK-
  165. GAME LDA STATUS
  166. CMP #STATENDR
  167. BNE GAME99 ; NOT A REPLAY
  168. LDA CSTATE
  169. CMP #DEAD ; DID CHUCK DIE IN IR ???
  170. BEQ IRDEATH
  171. LDA IRTNDONE ; IF FALSE, KEEP WAITING
  172. BEQ GAME98
  173. LDA DOITOVER
  174. BPL SKIPTAG ; NOT AN IR TUNE
  175. JSR SCRAPALL ; GET RID OF IR TUNE
  176. MOVE #FALSE,DOITOVER ; SO THAT "TUNIN" FUNCTIONS
  177. LDA #31 ; TAG AT END OF IR TUNE
  178. JSR TUNIN
  179. LDA #32
  180. JSR TUNIN
  181. MOVE #TRUE,DOITOVER
  182. BNE SKIPSKIP a jump
  183. SKIPTAG JSR SCRAPALL
  184. SKIPSKIP MOVE #STATEND,STATUS ; SO THAT THIS CODE WILL WAIT
  185. ; FOR "WAITCNT" CYCLES
  186. BPL GAME98 a jump
  187. GAME99 CMP #STATEND ; END OF RACK BUT EITHER NOT REPLAY,
  188. BNE GAME90 ; OR AFTER END OF REPLAY TUNE
  189. DEC WAITCNT
  190. BEQ GAME91
  191. GAME98 JSR CHEFMOVE ; KEEP THEM REJOICING
  192. ENDCYCLE
  193. GAME91 JMP GLCONT21 ; END OF GAME ROUTINE TESTS
  194. ; TEST TO SEE IF I SHOULD GO INTO "PAUSE" MODE.
  195. GAME90 LDA FPPAUSE ; TEST FOR PAUSE FIRST THING !
  196. BEQ GAMEON1
  197. GAME00 LDA PSREADY
  198. BEQ GAMEON1 ; IF NOT READY, THEN GO AHEAD
  199. ; IF I REACH HERE, IT'S TIME TO GO INTO PAUSE MODE:
  200. LDA #0
  201. STA AUDV0
  202. STA AUDV1
  203. STA SYSCOUNT 18 minute timer
  204. STA SYSCOUNT+1
  205. STA PSREADY "FALSE" = 0
  206. MOVE #MPAUSE,MODE
  207. NEWSTATE PAUSE
  208. ENDCYCLE
  209. ; Poll the select and reset buttons. Don't do this if the GAME OVER message
  210. ; is displayed.
  211. ; LDA MODE
  212. ; CMP #MTEXT
  213. ; BNE GAMEON1 not a message
  214. ; LDA TEMP4
  215. ; BNE GAMEON non-zero means GAME OVER message
  216. GAMEON1 LDA FPSELECT
  217. BEQ GAMEON2 ; BUTTON NOT PUSHED
  218. LDA SELREADY ; IGNORE BUTTON UNLESS IT'S READY
  219. BEQ GAMEON2
  220. JMP MKLOGO
  221. ; TEST THE RESET BUTTON TO SEE IF I SHOULD START A NEW GAME--
  222. GAMEON2 LDA FPRESET
  223. BEQ GAMEON
  224. LDA RESREADY
  225. BEQ GAMEON
  226. MOVE #FALSE,RESREADY
  227. JMP NEWGAME
  228. ; SET THE "SOFT" CONTROLLER VALUES. THESE WILL
  229. ; BE COPIED FROM (1) THE "HARD" VALUES IF NOT INSTANT REPLAY;
  230. ; (2) THE INSTANT REPLAY TABLES IF THIS IS AN INSTANT REPLAY.
  231. ; ONLY DO THIS ON EVEN NUMBERED CYCLES, SO THAT I CUT THE RAM NEEDED
  232. ; FOR INSTANT REPLAY IN HALF.
  233. ; Change: only do this on every 4th cycle, to aid the diagonal problem
  234. ; and to cut IR RAM even more.
  235. ; IN EACH 60TH OF A SECOND, "NUMCYCLE = 1" ONLY ONCE.
  236. GAMEON LDA NUMCYCLE ; MAKE SURE THAT TIMERS ARE STILL
  237. CMP #1 ; BASED ON REAL (INTERRUPT) TIME
  238. BNE SKIPINC
  239. INC CYCLECNT ; MAKE SURE THIS IS ONLY ONCE
  240. ; PER FRAME
  241. DEC DRIPTIME ; ICE CREAM CONE TIMER FOR ANIMATION
  242. DEC SYSCOUNT ; GENERAL PURPOSE SYSTEM COUNTER
  243. LDA CYCLECNT every even frame, update timer
  244. LSR A
  245. BCC NOFINFO
  246. DEC FINFO cone timer
  247. SKIPINC JMP DOGAME
  248. NOFINFO LSR A every fourth frame, update direction
  249. BCS SKIPINC and button values
  250. ; ONCE WE REACH HERE, EVERYTHING THAT FOLLOWS IS BEING EXECUTED ONCE
  251. ; EVERY FOUR FRAMES, REGARDLESS OF "MAXCYCLE"
  252. GLCONT10 LDA DOITOVER
  253. BNE DOREPLAY
  254. MOVE HJOYDIR,JOYDIR
  255. MOVE HTHROW,THROWBUT
  256. ; NOW SAVE AWAY VALUES IN THE INSTANT REPLAY TABLES :
  257. ; NOTE: DIRTAB CONTAINS POINTERS TO THE FOUR DIRECTION TABLES.
  258. ; EACH ONE OF THESE HAS 128 LOCATIONS, ACCOUNTING FOR 256
  259. ; VALUES OF CYCLEIDX; THIS REPRESENTS 8 SECONDS OF GAMEPLAY.
  260. ; CHANGED: each one now has 64 locations, accounting for 128 values
  261. ; of CYCLEIDX; this still represents 8 seconds of gameplay.
  262. ; 128 values of CYCLEIDX represents 128 x 4 cycles, or 512.
  263. LDX CYCLEIDX+1
  264. LDA DIRTABL,X
  265. STA TEMP0
  266. LDA DIRTABH,X
  267. STA TEMP1
  268. LDA CYCLEIDX
  269. LSR A ; GET INDEX AS WELL AS NIBBLE
  270. TAY
  271. BCC ZUPNIB01 ; EVEN FRAME == UPPER NIBBLE
  272. LDA (TEMP0),Y
  273. ORA JOYDIR ; UPPER NIBBLE ALREADY IN A
  274. STA (TEMP0),Y
  275. JMP ZINSKIP1
  276. ZUPNIB01 LDA JOYDIR
  277. ASL A ; THIS ALSO ZEROS OUT THE VALUE
  278. ASL A ; FROM THE LAST IR
  279. ASL A
  280. ASL A ; PUT INTO UPPER NIBBLE
  281. STA (TEMP0),Y
  282. ; JOYSTICK STORAGE IS FINISHED-- DO THE BUTTON STORAGE
  283. ZINSKIP1 LDA THROWBUT ; IF THE BUTTON IS UP, LEAVE A
  284. BEQ POLLOVER ; ZERO IN THE BIT FOR THIS CYCLE
  285. LDA CYCLEIDX
  286. AND #$7 ; TELLS WHICH BIT OF IRTHROW
  287. TAY
  288. LDX THROWIDX ; INC'ED EVERY EIGHTH CYCLE
  289. LDA TRUEBUT,Y ; SETS PROPER BIT
  290. ORA IRTHROW,X ; ADDS IN THIS NEXT BIT
  291. STA IRTHROW,X
  292. JMP POLLOVER
  293. DOREPLAY JSR REPLAY
  294. ; ONLY INCREMENT "CYCLEIDX" AND "THROWIDX" FOR CYCLES WHERE THE IR TABLES
  295. ; ARE WRITTEN TO.
  296. POLLOVER INC CYCLEIDX each table holds $40 bytes, or
  297. BPL ZDOGAME0 $80 values of CYCLEIDX
  298. INC CYCLEIDX+1 ; GO TO NEXT BLOCK OF STORAGE
  299. LDA #0
  300. STA CYCLEIDX
  301. ZDOGAME0 LDA CYCLEIDX
  302. AND #$07
  303. BNE DOGAME
  304. INC THROWIDX ; INCREMENT EVERY 8 TIMES
  305. ; NOW WE'RE FINALLY DOING REAL GAMEPLAY !
  306. ; NOTE: FOR FINAL VERSION, FOR SPEED, TAKE OUT THESE "STATUS" TESTS
  307. ; AND CHANGE THE "RTS" IN THE ROUTINES WHICH SET STATUS TO
  308. ; POP THE STACK AND JMP TO A LOCATION HERE (GLCONT00, FOR EXAMPLE)
  309. DOGAME
  310. JSR CHUCK ; ALWAYS DO THESE
  311. JSR CHEFMOVE
  312. JSR FOODMOVE
  313. LDA STATUS
  314. CMP #STATWON ; NO INTERSECTS OR FOOD IF HE'S EATING
  315. BEQ GLCONT00
  316. JSR ICEMELT call this unless he's won. I can't
  317. ; place this call below because
  318. ; ICEMELT must be called even if the
  319. ; STATUS is STATDIEC
  320. LDA STATUS
  321. CMP #STATBON ; IF FOOD IS FLYING TO SCORE
  322. BEQ GLCONT00
  323. JSR FOODHIT ; IF FOOD IS FLYING AT SCORE
  324. LDA STATUS
  325. CMP #STATDIEH
  326. BPL GLCONT00 ; ALL DEATH STATES ARE >= STATDIEH
  327. CMP #STATINIT
  328. BEQ GLCONT00
  329. CMP #STATWAIT ; DON'T DO INTERSECTS IF CHEFS ARE
  330. BEQ GLCONT00 ; RISING
  331. JSR PILEHIT
  332. JSR HOLEHIT
  333. JSR CHEFHIT
  334. JSR CONEHIT
  335. ; DON'T DO THE FOLLOWING TESTS IF WE'RE SUPPOSED TO BE WAITING BEFORE A RAKC
  336. ; END:
  337. GLCONT00 LDA STATUS
  338. CMP #STATEND
  339. BNE GLCONT21
  340. ENDCYCLE
  341. ; HERE I'LL NEED TO INSERT TESTS TO SEE IF THE RACK HAS ENDED:
  342. ; 1) TEST TO SEE IF CONE HAS MELTED;
  343. ; 2) TEST TO SEE IF HERO HAS REACHED THE CONE;
  344. ; 3) TEST TO SEE IF HERO HAS DIED.
  345. ; IF THE RACK HASN'T ENDED, CONTINUE THE MAIN GAME LOOP.
  346. ; NOTE: THIS MIGHT BE AN ATTRACT MODE. IF THE GAME ENDS, AND
  347. ; THIS IS AN ATTRACT MODE, THEN GO STRAIGHT TO THE HISCORE
  348. ; MODE BY CALLING "MKHISCOR" IN THE FILE "HISCORE.S"
  349. GLCONT21 LDA CSTATE ; HERO'S STATE
  350. CMP #DEAD
  351. BNE GLCONT01
  352. LDA MODE
  353. CMP #MATTRACT
  354. BEQ GLCONT20
  355. GLCONT02 JSR NEWRACK
  356. GLCONT03 ENDCYCLE
  357. GLCONT20 JMP MKLOGO
  358. GLCONT01 CMP #WON
  359. BNE GLCONT03
  360. ; If we get here, we know the rack has ended, through either death or
  361. ; munching. If it's auto play, just go to the logo; else,
  362. ; do a new rack.
  363. LDA MODE
  364. CMP #MATTRACT
  365. BEQ GLCONT20
  366. BNE GLCONT02 a jump
  367. ; THIS ROUTINE IS CALLED FROM "NEWGAME" TO ZERO ALL OF RAM
  368. ZERORAM
  369. LDA #0
  370. LDX #$00
  371. ZM000 STA $00,X ; ZEROS OUT THE ZERO PAGE
  372. DEX
  373. CPX #$40 ; STOPS AT MARIA REGISTERS
  374. BCS ZM000
  375. ; ZERO OUT THE FIRST PAGE
  376. ; Removed-- First Page only used for STACK
  377. AZMFP LDA #H(LASTPILE) ; ZERO OUT MEMORY THAT WAS IN FIRST
  378. STA $FF ; PAGE BEFORE IT WAS MOVED TO $2660-92
  379. LDY #L(LASTPILE)
  380. LDA #$00
  381. ; STA $FE ; THIS WAS ZEROED OUT ABOVE
  382. ZMFP STA ($FE),Y
  383. DEY
  384. CPY #L(NUMCHHIT)
  385. BCS ZMFP
  386. ; NOW ZERO OUT THE REST OF RAM, USING COUNTERS IN THE ZERO PAGE.
  387. ; ZERO OUT 1800-2000
  388. ; STA $FE ; USE THIS LOCATION BECAUSE
  389. LDA #$18 ; IT'S NOT SHADOWED HIGHER UP
  390. LDX #$08 ; 8 PAGES FROM 1800-2000
  391. JSR ZMSUB
  392. ; NOW ZERO OUT 2200-2800 (6 PAGES)
  393. ; STA $FE ; USE THIS LOCATION BECAUSE
  394. LDA #$22 ; IT'S NOT SHADOWED HIGHER UP
  395. LDX #$06 ; 6 PAGES FROM 2200-2800
  396. JSR ZMSUB
  397. JMP ZRAMRTN
  398. ZMSUB STA $FF
  399. LDA #0
  400. TAY
  401. ZM999 STA ($FE),Y
  402. DEY
  403. BNE ZM999
  404. INC $FF
  405. DEX
  406. BNE ZM999
  407. RTS
  408. DLLCOPY LDX #56 ; COPIES 57 BYTES-- 19 ENTRIES
  409. ZPUPLOOP MOVE DLLROM,X,DLLRAM,X
  410. DEX
  411. BPL ZPUPLOOP
  412. RTS
  413. POWERUP
  414. MOVEPTR DLI1,DLIADR ; SETUP FOR FIRST NMI INTERRUPT
  415. JSR DLLCOPY ; GET DLLRAM CORRECT
  416. LDX #0
  417. STX PLAYNUM ; ONE PLAYER
  418. STX ASET no instant replay tables yet
  419. STX FOODSTUF
  420. INX
  421. STX HOWHARD ; MEDIUM DIFFICULTY
  422. LDA #15 highest level allowed
  423. STA HIGHEST is level 16
  424. STA HIGHEST+1
  425. LDX #6 make sure hero starts facing left
  426. STX HJOYDIR
  427. STX JOYDIR center the joystick for first game
  428. ; This loop starts with X = 6
  429. ZPUPLP2 MOVE SWLIST,X,DLISTA,X ; COPY SWLIST AND NULLLIST
  430. DEX
  431. BPL ZPUPLP2
  432. LDA #TRUE
  433. STA PSREADY
  434. STA RESREADY
  435. STA SELREADY
  436. ; JMP DPPINIT same as JSR followed by RTS
  437. ; TURN DMA BACK ON AFTER SETTING DPPH
  438. DPPINIT BIT MSTAT ; FIRST WAIT FOR ON-SCREEN
  439. BMI DPPINIT
  440. DPPINIT0 BIT MSTAT ; NOW WAIT FOR VBLANK
  441. BPL DPPINIT0
  442. DPPSTORE LDA #L(DLLRAM)
  443. STA DPPL
  444. LDA #H(DLLRAM)
  445. STA DPPH
  446. MOVE #M160X2,CTRL ; TURN DMA BACK ON, CORRECT VALU
  447. RTS
  448. GAMEINIT
  449. LDX #0
  450. STX PL0RACK
  451. STX PL1RACK
  452. STX PL0BONUS
  453. STX PL0BONUS+3
  454. STX PL1BONUS
  455. STX PL1BONUS+3
  456. STX PL0CARRY
  457. STX PL1CARRY
  458. STX PL0BCD
  459. STX PL1BCD
  460. STX PL0IRTIM
  461. STX PL1IRTIM
  462. STX CURRENT
  463. DEX TRUE is $FF
  464. STX PL0FIRST
  465. STX PL1FIRST
  466. INX level 1 is first
  467. INX
  468. STX PL0BCD+1
  469. STX PL1BCD+1
  470. INX bonus at 25000
  471. STX PL0BONUS+1
  472. STX PL1BONUS+1
  473. INX three lives
  474. STX PL0LIVES
  475. STX PL1LIVES
  476. LDA #$50 ; BCD FOR 50
  477. STA PL0BONUS+2
  478. STA PL1BONUS+2
  479. LDX #0
  480. LDA PLAYNUM
  481. BEQ GI0010
  482. INX
  483. GI0010 STX OTHER
  484. LDX #FALSE
  485. STX DOITOVER ; FIRST RACK ISN'T INSTANT REPLAY
  486. ; PICK SOME RANDOM SEEDS:
  487. LDA FRAMECNT ; WAS LDA #$33
  488. STA RANDOM0
  489. LDA CYCLECNT ; WAS LDA #$44
  490. STA RANDOM1
  491. ADC #55 ; WAS LDA #$55
  492. STA RANDOM2
  493. MOVE #$E8,CHARBASE ; SAME FOR NUMBERS AND HEADS
  494. GIBYE RTS
  495. ; ALSO CALLED FROM "INIT.S" BEFORE THE FIRST LEVEL
  496. SETMAPS MOVE #L(CMAP1),SCORELST ; PLAYER 1 SCORE
  497. MOVE #$60,SCORELST+1
  498. MOVE #H(CMAP1),SCORELST+2
  499. MOVE #$B8,SCORELST+3 ; PALETTE 5, WIDTH 8
  500. MOVE #08,SCORELST+4 ; HPOS
  501. MOVE #L(CMAP2),SCORELST+5 ; PLAYER 2 SCORE
  502. LDX #0
  503. LDA PLAYNUM ; IF TRUE, THEN TWO PLAYER
  504. BEQ ZGI022 ; IF FALSE
  505. LDX #$60
  506. ZGI022 STX SCORELST+6
  507. MOVE #H(CMAP2),SCORELST+7
  508. MOVE #$B8,SCORELST+8 ; PALETTE 5, WIDTH OF 8
  509. MOVE #96,SCORELST+9 ; PLAYER 2 SCORE
  510. LDY #00 keep 0 in Y for awhile
  511. STY SCORELST+11 ; END OF LIST FLAG
  512. LDX #$60 keep 60 in X
  513. ; SET UP CHARACTER MAPS FOR THE BOTTOM HALF ZONE (EXTRA LIVES HEADS):
  514. MOVE #L(CLOWMAP1),STATLIST
  515. STX STATLIST+1
  516. MOVE #H(CLOWMAP1),STATLIST+2
  517. MOVE #$0F,STATLIST+3 ; HERO PALETTE, WIDTH 17
  518. MOVE #$5C,STATLIST+4 ; FLUSH WITH RIGHT BORDER
  519. MOVE #L(CLOWMAP2),STATLIST+5
  520. STX STATLIST+6
  521. MOVE #H(CLOWMAP2),STATLIST+7
  522. MOVE #$8E,STATLIST+8 ; PALETTE 4 (TOMATO), WIDTH 18
  523. STY STATLIST+9 ; Y still has 0
  524. STY STATLIST+11 ; END OF LIST
  525. LDY #59
  526. LDA #NULL2
  527. ZCMINIT STA CMAP1,Y ; ALL NULL CHARACTERS
  528. DEY
  529. BPL ZCMINIT
  530. ; COPY THE INFORMATION FOR THE WORD "LEVEL" INTO "CLOWMAP2"
  531. MOVEPTR RACKWORD,TEMP0
  532. LDA FOODSTUF
  533. BEQ NOFOODW
  534. MOVEPTR FOODWORD,TEMP0
  535. NOFOODW LDY #9
  536. ZCMINIT0 LDA (TEMP0),Y
  537. STA CLOWMAP2,Y
  538. DEY
  539. BPL ZCMINIT0
  540. LDA CURRENT
  541. ASL A
  542. ASL A
  543. TAY
  544. JSR PUTSCORE ; DISPLAY SCORE FOR CURRENT PLAYER
  545. LDA PLAYNUM
  546. BEQ SMBYE
  547. LDA OTHER
  548. ASL A
  549. ASL A
  550. TAY
  551. JSR PUTSCORE ; DISPLAY SCORE FOR OTHER PLAYER
  552. SMBYE RTS
  553. ; Copies the table COLORROM into COLORS
  554. COLRINIT
  555. LDX #31
  556. ZCLRLOOP LDA COLORROM,X
  557. STA COLORS,X
  558. DEX
  559. BPL ZCLRLOOP
  560. RTS
  561. ; refreshes the palettes every frame
  562. PREFRESH
  563. LDX #0
  564. STX BACKGRND
  565. ZCLR01 LDY #2
  566. ZPRLOOP LDA COLORS,X
  567. STA P0C1,X
  568. INX
  569. DEY
  570. BPL ZPRLOOP
  571. INX
  572. CPX #31
  573. BMI ZCLR01
  574. RTS
  575. NMIVEC PHA
  576. TYA
  577. PHA
  578. TXA
  579. PHA
  580. CLD just in case decimal is set
  581. JMP (DLIADR)
  582. NMIRTN PLA
  583. TAX
  584. PLA
  585. TAY
  586. PLA
  587. IRQVEC RTI
  588. ; ALL OF THE NMI HANDLERS FOLLOW.
  589. DLI1 MOVEPTR DLI2,DLIADR ; SETUP FOR SCORE DLIST
  590. MOVE #$E8,CHARBASE
  591. MOVE #$50,CTRL ; 160X2, 2 BYTE CHARACTERS
  592. ; Setup palette 5 for the score:
  593. MOVE #$19,P5C1 ; COLORS FOR TEXT (YELLOW)
  594. MOVE #$15,P5C2
  595. MOVE #$1F,P5C3
  596. JMP NMIRTN
  597. DLI2 STA WSYNC wait for end of scan line before
  598. ;changing color of score palette
  599. MOVEPTR DLI3,DLIADR ; AFTER SCORE, BEFORE PLAYFIELD
  600. STA WSYNC
  601. ; If the rack is in progress, use the banana colors here UNLESS the food
  602. ; is hitting the score with the bonus points displayed.
  603. ; Else, text is displayed; if TEMP4 is $80 it's an Instant Replay message
  604. ; and should cycle through all colors.
  605. ; If it's any other message, keep the palette as it was for score display.
  606. LDA MODE
  607. CMP #MGAME
  608. BEQ BARF1
  609. CMP #MATTRACT
  610. BEQ BARF1
  611. LDA TEMP4
  612. CMP #$80
  613. BNE NOFLASH
  614. LDA TEMP5
  615. STA P5C1
  616. STA P5C2
  617. STA P5C3
  618. JMP NMIRTN
  619. BARF1 MOVE #$13,P5C1 ; restore banana colors
  620. MOVE #$18,P5C2
  621. NOFLASH JMP NMIRTN if not IR, same colors as score text
  622. DLI3 MOVE #M160X2,CTRL ; 1-BYTE CHARACTERS
  623. MOVEPTR DLI4,DLIADR ; OCCURS RIGHT AFTER PLAYFIELD
  624. ; SO THAT LOADER CAN START DURING
  625. ; STATUS ZONE DISPLAY
  626. ; just moved all this from DLI4 to give the loader the extra 8+24 scan lines
  627. ; of off-screen time
  628. INC FRAMECNT
  629. LDA FRAMECNT
  630. LSR A
  631. BCC DONTLOAD
  632. BIT RUNLOAD
  633. BPL DONTLOAD ; IF SET TO "FALSE"
  634. JSR MLOADER
  635. DONTLOAD
  636. JSR TUNER ; SOUND DRIVER
  637. JMP NMIRTN
  638. DLI4 STA WSYNC
  639. LDA SWCHB ;;; TEMP FOR BREAKPOINT DETECTION
  640. STA WSYNC
  641. STA WSYNC ; NOW SHOULD BE IN VBLANK
  642. JSR PREFRESH refresh the palettes and background
  643. ; IF MSTAT IS NEGATIVE, WE'RE IN VBLANK
  644. DLI4TEST BIT MSTAT ; RETURN HERE UNTIL I GET TWO
  645. BMI DLI4TST1 ; IDENTICAL VALUES
  646. BIT MSTAT ; IF WE'RE NOT IN VBLANK, DON'T
  647. BPL DLI4BYE ; CHANGE THE NMI VECTOR
  648. JMP DLI4TEST ; IF WE DON'T GET THE SAME TWICE
  649. DLI4TST1 BIT MSTAT ; IF WE DON'T GET THE SAME TWICE
  650. BPL DLI4TEST
  651. ; ELSE, WE'RE IN VBLANK-- ALL IS WELL. RESET "DLIADR"
  652. MOVEPTR DLI1,DLIADR
  653. DLI4BYE JMP NMIRTN
  654. ; CALL THIS ROUTINE FROM BOTH "GAME" AND "ATTRACT"
  655. ; This routine will use a different set of tables
  656. ; if ASET is non-zero and the mode is ATTRACT. These tables
  657. ; should represent the last instant replay.
  658. ;
  659. ; ASET==0 : no tables; just go left
  660. ; ASET!=0 : use AIR tables
  661. ; this routine should not be called from ATTRACT unless ASET is not
  662. ; zero
  663. REPLAY LDX CYCLEIDX+1
  664. LDA MODE if not attract, use last IR
  665. CMP #MATTRACT
  666. BNE RGAME00
  667. LDA ASET if ASET is 0, then just go
  668. BNE DOAIR left
  669. JMP RPBYE
  670. DOAIR LDA ADIRTABL,X last completed instant replay
  671. STA TEMP0
  672. LDA ADIRTABH,X
  673. STA TEMP1
  674. JMP RGAME01
  675. RGAME00 LDA DIRTABL,X this is an instant replay, or the
  676. STA TEMP0 last death
  677. LDA DIRTABH,X
  678. STA TEMP1
  679. RGAME01 LDA CYCLEIDX
  680. LSR A
  681. TAY
  682. BCC ZUPNIB02
  683. LDA (TEMP0),Y ; LOWER NIBBLE
  684. AND #$0F
  685. JMP ZSETD02
  686. ZUPNIB02 LDA (TEMP0),Y
  687. LSR A
  688. LSR A
  689. LSR A
  690. LSR A
  691. ZSETD02 STA JOYDIR
  692. LDA CYCLEIDX
  693. AND #7
  694. TAY
  695. LDA TRUEBUT,Y
  696. LDX THROWIDX
  697. LDY ASET Use the A tables if ASET and in
  698. BEQ ZSETD001 attract mode
  699. LDY MODE
  700. CPY #MATTRACT
  701. BNE ZSETD001
  702. AND AIRTHROW,X
  703. JMP ZSETD003
  704. ZSETD001 AND IRTHROW,X
  705. ZSETD003 BEQ ZNOTHROW ; IF 0, BUTTON IS UP
  706. LDA #TRUE
  707. JMP ZRPSETB
  708. ZNOTHROW LDA #FALSE
  709. ZRPSETB STA THROWBUT
  710. RPBYE RTS
  711. END