MONSTER.S 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. *
  2. * MONSTER.S BASIC MONSTER CODE FOR MS PAC-MAN
  3. *
  4. * SETMON, SET THE NEXT INTERUPT
  5. SETMON
  6. LDA RTLOCAL+1
  7. CLC
  8. ADC #WAITMON
  9. STA MONWAIT
  10. RTS
  11. * MAIN LOOP FOR MONSTER ALGORITM, JUST CALL DOMONSTR WITH X=3->0
  12. MONSTER JSR MONTUNE
  13. JSR MONBEFOR
  14. CLC
  15. LDX #3
  16. MONSTRLP JSR MONLOOP ; TOP OF MONSTER LOOP
  17. DEX
  18. BPL MONSTRLP
  19. JMP MONAFTER
  20. * MAKE SURE THE MONSTER TUNE IS PLAYING
  21. MONTUNE LDA #$0A
  22. CMP TUNINDEX ;MAKE SURE IT ISN'T PLAYING
  23. BEQ MTOUT
  24. CMP TUNINDEX+1
  25. BEQ MTOUT
  26. JSR DOTUNE ;JUST TRY TO PUT IT OUT
  27. MTOUT RTS
  28. * MONBEFOR -STUFF AT TOP OF MONSTER LOOP
  29. *
  30. MONBEFOR JSR SETMON
  31. JSR INCMSPED
  32. LDA ISBLUE
  33. JSR CHKBLUE ;SEE IF TIME TO DO SOMETHING WITH BLUE
  34. LDA BLUWAIT ;DO NOT CHECK FOR REVERSAL IF BLUE
  35. BNE MOREMON
  36. NOTBLUE
  37. INC NORMTIME+1
  38. BNE CHKREV
  39. INC NORMTIME
  40. CHKREV
  41. LDA NORMTIME
  42. CMP REVWAIT
  43. BCC MOREMON
  44. LDA NORMTIME+1
  45. CMP REVWAIT+1
  46. BCC MOREMON
  47. LDA REVWAIT
  48. CMP #$FF
  49. BEQ MOREMON
  50. JMP MONFLIP
  51. MOREMON
  52. MONLPEND RTS
  53. * MONAFTER -STUFF AT BOTTOM OF MONSTER LOOP
  54. *
  55. MONAFTER
  56. JSR PMINTR
  57. JMP RELEASE
  58. * MONLOOP - MONSTER PROCESSING LOOP
  59. * IN: X IS THE MONSTER NUMBER
  60. * OUT:
  61. * USES: EVERYTHING EXCEPT X
  62. MONLOOP JSR CHKMON ; TOP OF MONSTER LOOP
  63. BEQ MONLPEND ;JUST AN RTS
  64. LDA M0STATE,X ; CHECK THE MONSTER STATE
  65. CMP #MSTLVPEN
  66. BMI MONSTR1
  67. JMP MMVPEN ; IT'S IN THE PEN, SO SPCL CASE IT
  68. MONSTR1
  69. LDA M0OFF,X ;MAKE SURE WE ARE AT THE CENTER
  70. CMP #3
  71. BNE MONSTRMV
  72. LDA M0HPOS,X
  73. AND #3
  74. CMP #1
  75. BNE MONSTRMV
  76. LDA M0FLIP,X ;SEE IF MONSTER IS TO BE FLIPPED
  77. BEQ MONSTRZZ
  78. LDA M0DIR,X
  79. EOR #$02
  80. STA M0DIR,X
  81. LDA #$00
  82. STA M0FLIP,X
  83. BEQ MONSTRMV ;DO NOT CHECK FOR TURN IF FLIPPED
  84. MONSTRZZ LDA M0TUNNEL,X ;SEE IF IN TUNNEL, IF SO JUST MOVE
  85. BNE MONSTRMV
  86. JSR MNCHKDIR ; FIND OUT IF WE ARE AT INTERSECT
  87. CMP #0
  88. BNE MONSTRMV ;IF WE ARE NOT, JUST MOVE
  89. JSR MONNEWDR ;GET NEW DIRECTION
  90. MONSTRMV JMP MOVEMON ; MOVE THE MONSTER
  91. * WE NEED A NEW DIRECTION FOR THIS MONSTER
  92. MONNEWDR LDA M0STATE,X ;LOOK AT THE STATE AGAIN
  93. CMP #MSTNORM
  94. BNE MONSTR2
  95. LDA M0BLUE,X ; SEE IF IS IS BLUE
  96. BEQ MONSTR3
  97. JMP MMVBLUE
  98. MONSTR3 LDA BORED ; SEE IF IT'S BORED
  99. BEQ MONSTR5
  100. JMP MMVBORED
  101. MONSTR5 JMP MMVINTER ; ELSE IT'S INTERESTED
  102. MONSTR2 JMP MMVEYES ; IT'S EYES
  103. * MMVBLUE - BLUE MONSTER MOVEMENT
  104. * IN: X IS MONSTER NUMBER, TEMP12-15 IS INTERSECTION STATE
  105. * OUT:
  106. * USE: EVERYTHING EXCEPT X
  107. MMVBLUE JSR RAND
  108. AND #3
  109. TAY
  110. LDA TEMP12,Y
  111. BNE MMVBLUE
  112. TYA
  113. STA M0DIR,X
  114. RTS
  115. * MMVEYES - EYES MONSTER MOVEMENT
  116. * IN: X IS MONSTER NUMBER, TEMP12-15 IS INTERSECTION STATE
  117. * OUT:
  118. * USE: EVERYTHING EXCEPT X
  119. MMVEYES LDA #$0A
  120. STA TEMP7
  121. LDA #$0F
  122. STA TEMP8
  123. JMP STWHCHWY
  124. * MMVBORED - BORED MONSTER MOVEMENT
  125. * IN: X CONTAINS MONSTER NUMBER, TEMP12-15 CONTAISN INTERSECT STATE
  126. * OUT: M0DIR,X IS SET TO NEW DIRECTION
  127. * USES: EVERYTHING EXCEPT X
  128. MMVBORED TXA
  129. CMP #02
  130. BEQ MMVBORD1
  131. BPL MMVBORD2
  132. MMVBORD3 JSR RAND ; RED AND PINK
  133. AND #3
  134. TAY
  135. LDA TEMP12,Y
  136. BNE MMVBORD3
  137. TYA
  138. STA M0DIR,X
  139. RTS
  140. MMVBORD1 LDA #$1C
  141. STA TEMP7
  142. LDA #$1A
  143. STA TEMP8
  144. JMP MMVBORD4
  145. MMVBORD2 ;GOLD
  146. LDA #$1C
  147. STA TEMP7
  148. LDA #$01
  149. STA TEMP8
  150. MMVBORD4 JMP STWHCHWY
  151. * MMVINTER - INTERESTED MONSTER MOVEMENT
  152. * IN: X HAS MONSTER NUMBER, TEMP12-15 HAS INTERSECTION STATE
  153. * OUT: M0DIR,X IS SET TO NEW DIRECTION
  154. * USED: EVERYTHING EXCEPT X
  155. MMVINTER TXA
  156. CMP #2
  157. BEQ MMVINTR1
  158. BPL MMVINTR3
  159. CMP #1
  160. BEQ MMVINTR2
  161. LDA M0STATE+3 ;SEE IF GOLD GUY IN NORMAL STATE
  162. CMP #MSTNORM ; IF NOT, RED GUY MOVES NORMAL
  163. BNE REDSPD2
  164. LDA #$F0
  165. SEC
  166. SBC DOTSEATN
  167. CMP REDTHRSH+1
  168. BCS REDSPD1
  169. LDA #SPDRED2
  170. STA M0SPEED ;RED GUY MOVING FASTEST
  171. JMP REDSPD3
  172. REDSPD1
  173. CMP REDTHRSH
  174. BCS REDSPD2
  175. LDA #SPDRED1 ;RED GUY MOVING FASTER
  176. STA M0SPEED
  177. JMP REDSPD3
  178. REDSPD2
  179. LDA #SPDNORM ;RED GUY MOVING NORMAL SPEED
  180. STA M0SPEED
  181. REDSPD3
  182. LDA PZONE ; RED
  183. STA TEMP7
  184. LDA PCOL
  185. STA TEMP8
  186. JMP MMVINTR4
  187. MMVINTR2
  188. LDY PDIR ; PINK
  189. LDA PZONE
  190. CLC
  191. ADC DIROFFZ4,Y
  192. STA TEMP7
  193. LDA PCOL
  194. CLC
  195. ADC DIROFFC4,Y
  196. STA TEMP8
  197. JMP MMVINTR4
  198. MMVINTR1 LDY PDIR ;BLUE - GOAL ON OTHER SIDE OF MS FROM R
  199. LDA DIROFFZ2,Y ;START WITH THE OFFSET TO LOOK AHEAD
  200. CLC
  201. ADC PZONE ;ADD TO MS PAC'S ZONE
  202. ASL A
  203. SEC
  204. SBC M0ZONE ;SUBTRACT RED MONSTER'S ZONE
  205. STA TEMP7 ;= ADJ MS - (DELTA BETWEEN MS AND RED)
  206. LDA DIROFFC2,Y ;START WITH THE OFFSET TO LOOK AHEAD
  207. CLC
  208. ADC PCOL ;ADD TO MS PAC'S COLUMN
  209. ASL A
  210. SEC
  211. SBC M0COL ;SUBTRACT RED MONSTER'S COLUMN
  212. STA TEMP8 ;= ADJ MS - (DELTA BETWEEN MS AND RED)
  213. JMP MMVINTR4
  214. MMVINTR3
  215. LDA PZONE ; GOLD
  216. STA TEMP7
  217. LDA PCOL
  218. STA TEMP8
  219. SEC
  220. SBC M0COL,X
  221. STA TEMP0
  222. BPL GOLD1
  223. LDA #0
  224. SEC
  225. SBC TEMP0
  226. GOLD1 STA TEMP1 ; TEMP1 = ABS(PCOL-MCOL)
  227. LDA PZONE
  228. SEC
  229. SBC M0ZONE,X
  230. STA TEMP0
  231. BPL GOLD2
  232. LDA #0
  233. SEC
  234. SBC TEMP0
  235. GOLD2 CLC ; A = ABS(PZONE-MZONE)
  236. ADC TEMP1
  237. CMP #8 ; IF ABS(PCOL-MCOL)+ABS(PZONE-MZONE)>8
  238. BPL MMVINTR4
  239. LDA #$15
  240. STA TEMP7
  241. LDA #$06
  242. STA TEMP8
  243. MMVINTR4 JMP STWHCHWY
  244. * STWHCHWY - SET UP FOR MONSTER'S WHCHWAY CALL
  245. * IN: MONSTER VALUE IN X, INTERSECTION STATE IN TEMP12-15
  246. * OUT: ALL PARAMETERS FOR WHCHWAY EXCEPT GOALZONE AND GOALCOL
  247. * USES: ALL EXCEPT X
  248. STWHCHWY LDA M0ZONE,X
  249. STA TEMP4
  250. LDA M0COL,X
  251. STA TEMP5
  252. LDA M0DIR,X
  253. STA TEMP6
  254. JSR WHCHWAY
  255. STA M0DIR,X
  256. RTS
  257. * MMVPEN - MONSTER PEN MOVEMENT STUFF
  258. * IN: X IS MONSTER NUMBER
  259. * USE:
  260. MMVPEN LDA M0SLOW,X ;SLOW THEM DOWN IN PEN
  261. EOR #$01
  262. STA M0SLOW,X
  263. BNE MMVPBODY
  264. RTS
  265. MMVPBODY LDA M0STATE,X
  266. CMP #MSTATPEN ; SEE IF HE'S JUST HANGING ARROUND
  267. BNE MMVPEN1
  268. LDA M0VPOS,X ; SEE WHERE IT IS
  269. CMP #$48 ; IF IT IS AT THE TOP
  270. BCS MMVPEN4
  271. LDA #DDOWN ; THEN MOVE IT DOWN
  272. STA M0DIR,X
  273. JMP MMVPEN3
  274. MMVPEN4 CMP #$4E ; IF ITS AT THE BOTTOM
  275. BCC MMVPEN5
  276. LDA #DUP ; THEM MOVE IT UP
  277. STA M0DIR,X
  278. MMVPEN5 JMP MMVPEN3 ; THEN GET OUT
  279. MMVPEN1 CMP #MSTINPEN ; SEE IF HE WANTS TO GET IN
  280. BNE MMVPEN2
  281. LDA M0VPOS,X ; SEE IF ITS IN YET
  282. CMP #$4E
  283. BCC MMVPEN6
  284. LDA HOMEDIR,X ; MOVE IT TOWATRDS IT'S HOME SLOT
  285. STA M0DIR,X
  286. LDA M0HPOS,X
  287. CMP IMHPOS,X
  288. BNE MMVPEN6
  289. LDA #MSTATPEN
  290. STA M0STATE,X
  291. LDA #DUP
  292. STA M0DIR,X
  293. JSR MONSTAMP ;MAKE IT LOOK NORMAL
  294. TXA
  295. BNE MMVPEN7
  296. JSR GETOUT
  297. MMVPEN7
  298. JMP MMVPEN3
  299. MMVPEN2 ; HE IS TRYING TO GET OUT
  300. LDA M0HPOS,X
  301. CMP #$37+LEFTSIDE
  302. BNE MMVPEN6
  303. LDA #DUP
  304. STA M0DIR,X
  305. LDA M0VPOS,X ; SEE OF HE'S OUT YET
  306. CMP #$3A ;SZY-4C????
  307. BCS MMVPEN3
  308. LDA #DLEFT ;SET IT'S DIRECTION
  309. LDY M0BLUE,X
  310. BEQ MMVPENDR
  311. LDA #DRIGHT
  312. MMVPENDR STA M0DIR,X
  313. LDA #MSTNORM
  314. STA M0STATE,X ; IF HE IS THEN ALL IS BACK TO NORMAL
  315. MMVPEN3
  316. MMVPEN6
  317. * MOVEMON - MONSTER MOVEMENT STUFF
  318. * IN: X IS MONSTER NUMBER
  319. * USE:
  320. MOVEMON JSR ADJSTMON ;FIRST, ADJUST THE POSITION
  321. LDA M0TUNNEL,X
  322. BNE MVTUNNEL ;DIFFERENT CODE FOR TUNNEL MOVEMENT
  323. LDA M0HPOS,X ;SEE IF MOVING INTO TUNNEL
  324. CMP #RGHTEDGE
  325. BCC MVZZJMP0
  326. STA M0TUNNEL,X
  327. MVZZJMP0 CMP #LEFTEDGE
  328. BCS MVZZJMP1
  329. STA M0TUNNEL,X
  330. MVZZJMP1 JSR DISPMON ;UPDATE THE MONSTER DISPLAY
  331. JMP CHKPEN
  332. MVTUNNEL LDA M0DIR,X ;MOVEMENT THROUGH TUNNEL
  333. BEQ MVTRIGHT
  334. LDA M0HPOS,X ;MOVING LEFT
  335. CMP #LEFTWRAP ;SEE IF WRAP TIME
  336. BCS MVTLJMP0
  337. CLC
  338. ADC #WRAPSIZE
  339. STA M0HPOS,X
  340. MVTLJMP0 CMP #RGHTEDGE
  341. BCS MVTLJMP1
  342. CMP #80
  343. BCC MVTLJMP1
  344. LDA #$00
  345. STA M0TUNNEL,X
  346. MVTLJMP1 JMP WRTMON ;WRITE IT AND LEAVE
  347. MVTRIGHT LDA M0HPOS,X ;MOVING RIGHT
  348. CMP #RGHTWRAP ;SEE IF WRAP TIME
  349. BCC MVTRJMP0
  350. SEC
  351. SBC #WRAPSIZE
  352. STA M0HPOS,X
  353. MVTRJMP0 CMP #LEFTEDGE
  354. BCC MVTRJMP1
  355. CMP #80
  356. BCS MVTRJMP1
  357. LDA #$00
  358. STA M0TUNNEL,X
  359. MVTRJMP1 JMP WRTMON ;WRITE IT, THEN WE'RE DONE
  360. * ADJUST THE POSITION OF THE MONSTER
  361. ADJSTMON LDA M0DISP,X ;FIRST, ANIMATE THE MONSTER
  362. EOR #$10
  363. STA M0DISP,X
  364. LDY M0DIR,X ;NOW, MOVE IT
  365. LDA M0HPOS,X
  366. JSR HPOSADJ ;ADJUST HORIZONTALLY
  367. STA M0HPOS,X
  368. STX TEMP0
  369. LDA M0OFF,X
  370. STA TEMP1
  371. LDA M0VPOS,X
  372. LDX TEMP1
  373. JSR VPOSADJ ;ADJUST VERTICALLY
  374. LDX TEMP0
  375. STA M0VPOS,X
  376. RTS
  377. * SPECIAL CODE FOR GETTING EYES INTO PEN
  378. CHKPEN
  379. LDA M0STATE,X
  380. CMP #MSTEYES
  381. BNE MMOVEND ; IF IT'S NOT EYES ITS NOT INTERESTED
  382. LDA #$13 ;SEE IF EYE TUNE PLAYING
  383. CMP TUNINDEX
  384. BEQ CPJMP0
  385. CMP TUNINDEX+1
  386. BEQ CPJMP0
  387. JSR DOTUNE ;MAKE IT PLAY
  388. CPJMP0 LDA #$39 ; NOW SEE IF ITS AT THE ENTRY POINT
  389. CMP M0VPOS,X
  390. BNE MMOVEND
  391. LDA #$37+LEFTSIDE
  392. CMP M0HPOS,X
  393. BNE MMOVEND
  394. LDA #MSTINPEN
  395. STA M0STATE,X ; IT IS NOW GOING INTO PEN
  396. LDA #DDOWN
  397. STA M0DIR,X
  398. LDA M0STATE+0
  399. CMP #MSTEYES
  400. BEQ MMOVEND
  401. LDA M0STATE+1
  402. CMP #MSTEYES
  403. BEQ MMOVEND
  404. LDA M0STATE+2
  405. CMP #MSTEYES
  406. BEQ MMOVEND
  407. LDA M0STATE+3
  408. CMP #MSTEYES
  409. BEQ MMOVEND
  410. LDA #$13
  411. JSR KILLTUNE
  412. MMOVEND RTS
  413. * THIS ROUTINE ADJUSTS THE CURRENT COLUMN, ZONE, AND OFFSET, THEN FALLS THROUGH
  414. * TO WRTMON
  415. DISPMON LDA M0HPOS,X ;ADJUST COLUMN
  416. JSR HTOC
  417. STA M0COL,X
  418. LDA M0VPOS,X ;ADJUST ZONE AND OFFSET
  419. JSR VTOZO
  420. STA M0OFF,X
  421. INY
  422. TYA
  423. STA M0ZONE,X
  424. ;NOW - FALL THROUGH TO WRTMON
  425. * WRTMON - WRITE THE MONSTER ON THE SCREEN
  426. * IN X IS MONSTER NUMBER
  427. * USES
  428. WRTMON LDA M0HPOS,X ;UPDATE HPOS
  429. SEC
  430. SBC #3
  431. STA HPLIST+2,X
  432. LDY M0ZONE,X ;UPDATE ZONE
  433. DEY
  434. TYA
  435. STA VZLIST+2,X
  436. LDA M0DISP,X ;FIND WHICH STAMP TO USE
  437. AND #$10 ;FIRST, SET A TO 4 OR 0 DEPENDING
  438. LSR A ; ON WHICH ANIMATION CURRENTLY IN
  439. LSR A
  440. ORA M0DIR,X ;SET BOTTOM BITS TO DIRECTION
  441. ORA M0BLUE,X ;NORMAL, BLUE, OR EYES
  442. TAY ;THIS IS OUR INDEX
  443. LDA MONSTMPH,Y ;SET THE STAMP
  444. STA SHLIST+2,X
  445. LDA MONSTMPL,Y
  446. STA SLLIST+2,X
  447. LDA #$01
  448. STA DOLIST+2,X ;TELL LOADER TO GET IT
  449. RTS
  450. * EYESTAMP - FILL IN STAMP FOR EYES
  451. * IN: X IS MONSTER NUMBER
  452. * OUT:
  453. * USE: TEMP0,Y
  454. EYESTAMP LDA #$10 ;SET 'M0BLUE' TO EYES
  455. STA M0BLUE,X
  456. TXA
  457. ASL A
  458. ASL A
  459. TAY
  460. LDA #WHITE ;ADJUST COLOR
  461. STA P3C2,Y
  462. RTS
  463. * BLUSTAMP - FILL IN STAMP FOR BLUR MONSTERS
  464. * IN: X IS MONSTER NUMBER
  465. * OUT:
  466. * USE: TEMP0,Y
  467. BLUSTAMP LDA #$08 ;SET 'M0BLUE' TO BLUE
  468. STA M0BLUE,X
  469. TXA
  470. ASL A
  471. ASL A
  472. TAY
  473. LDA #DKBLUE ;ADJUST COLOR
  474. STA P3C1,Y
  475. LDA #LTPINK
  476. STA P3C2,Y
  477. RTS
  478. * MONSTAMP - FILL IN STAMP FOR MONSTER
  479. * IN: X IS MONSTER NUMBER
  480. * OUT:
  481. * USE: TEMP0,Y
  482. MONSTAMP LDA #$00 ;SET 'M0BLUE' TO NORMAL MONSTER
  483. STA M0BLUE,X
  484. TXA
  485. ASL A
  486. ASL A
  487. TAY
  488. LDA IMCOLOR,X ;ADJUST COLOR
  489. STA P3C1,Y
  490. LDA #WHITE
  491. STA P3C2,Y
  492. LDA #BLUE
  493. STA P3C3,Y
  494. RTS
  495. * SCORSTMP - FILL IN SCORE FOR MONSTER
  496. * IN: X IS MONSTER NUMBER
  497. * OUT:
  498. * USE: TEMP0,Y
  499. SCORSTMP
  500. LDY GREEDCNT
  501. LDA MSCRTBLH,Y
  502. STA SHLIST+2,X
  503. LDA MSCRTBLL,Y
  504. STA SLLIST+2,X
  505. LDA #$01
  506. STA DOLIST+2,X
  507. TXA
  508. ASL A
  509. ASL A
  510. TAY
  511. LDA #LTGREEN ;ADJUST COLOR
  512. STA P3C2,Y
  513. RTS
  514. * INITMON - INITIALIZE MONSTER DATA
  515. * USES:
  516. *
  517. INITMON
  518. LDX #3
  519. INITMNLP
  520. LDA IMVPOS,X
  521. STA M0VPOS,X
  522. LDA IMHPOS,X
  523. STA M0HPOS,X
  524. LDA IMDIR,X
  525. STA M0DIR,X
  526. LDA #0
  527. STA M0DISP,X
  528. STA M0SPEED,X
  529. STA M0TUNNEL,X
  530. STA M0FLIP,X
  531. STA M0SLOW,X
  532. LDA IMSTATE,X
  533. STA M0STATE,X
  534. JSR MONSTAMP
  535. JSR DISPMON
  536. DEX
  537. BPL INITMNLP
  538. LDA #1
  539. STA BORED
  540. LDA #0
  541. STA ISBLUE
  542. STA NORMTIME
  543. STA NORMTIME+1
  544. STA EATNDOTS
  545. STA TRELEASE
  546. JSR SETMON
  547. LDA LEVEL
  548. CMP #2
  549. BPL INITREL1
  550. LDA #$00
  551. STA M1REL
  552. LDA #$1A
  553. STA M2REL
  554. LDA #$34
  555. STA M3REL
  556. JMP INITBLTM
  557. INITREL1
  558. CMP #3
  559. BPL INITREL2
  560. LDA #$00
  561. STA M1REL
  562. STA M2REL
  563. LDA #$20
  564. STA M3REL
  565. JMP INITBLTM
  566. INITREL2
  567. LDA #$00
  568. STA M1REL
  569. STA M2REL
  570. STA M3REL
  571. INITBLTM ;NOW SET UP BLUE TIME
  572. LDA LEVEL
  573. CMP #20
  574. BMI BLUTIM
  575. LDA #19
  576. BLUTIM TAX
  577. LDA BTIME,X
  578. STA BLUETIME
  579. RTS
  580. * STATE CHANGE ROUTINES *
  581. * GETOUT DOES THE STATE CHANGE TO GET OUT OF THE PEN)
  582. * IN: A IS MONSTER NUMBER
  583. * USES:
  584. GETOUT
  585. TAX
  586. LDA #MSTLVPEN
  587. STA M0STATE,X
  588. LDA OUTDIR,X
  589. STA M0DIR,X
  590. RTS
  591. * TURNBLUE TURNS A MONSTER BLUE
  592. * USES
  593. TURNBLUE
  594. LDX #3
  595. TRNBLULP
  596. LDA M0STATE,X
  597. CMP #MSTEYES
  598. BEQ TRNBLUND
  599. CMP #MSTINPEN
  600. BEQ TRNBLUND
  601. LDA #SPDBLUE
  602. STA M0SPEED,X
  603. JSR BLUSTAMP
  604. LDA M0STATE,X
  605. BNE TRNBLUND
  606. INC M0FLIP,X
  607. JSR WRTMON
  608. TRNBLUND DEX
  609. BPL TRNBLULP
  610. LDA #1
  611. STA ISBLUE
  612. LDA #0
  613. STA GREEDCNT
  614. LDA BLUETIME
  615. STA BLUWAIT
  616. LDA #$0D ;MAKE ENERGIZED SOUND
  617. JSR DOTUNE
  618. RTS
  619. * TURNNORM TURNS A MONSTER NORMAL
  620. * USES
  621. TURNNORM
  622. FOO LDX #3
  623. TRNNRMLP
  624. LDA M0STATE,X
  625. CMP #MSTEYES
  626. BEQ TRNNRMND
  627. LDA M0STATE,X
  628. CMP #MSTINPEN
  629. BEQ TRNNRMND
  630. LDA #SPDNORM
  631. STA M0SPEED,X
  632. JSR MONSTAMP
  633. JSR WRTMON
  634. TRNNRMND DEX
  635. BPL TRNNRMLP
  636. LDA #0
  637. STA ISBLUE
  638. STA BLUWAIT
  639. JSR KILLBSND
  640. RTS
  641. * TURNEYES TURNS A MONSTER INTO EYES
  642. * IN X IS A MONETR NUMBER
  643. * USES
  644. TURNEYES
  645. LDA #$00 ;TURN FLIP OFF, JUST IN CASE
  646. STA M0FLIP,X
  647. LDA #MSTEYES
  648. STA M0STATE,X
  649. LDA #SPDNORM
  650. STA M0SPEED,X
  651. JSR EYESTAMP
  652. JMP WRTMON
  653. * MONFLIP DOES THE MONSTER FLIP
  654. * USES
  655. MONFLIP LDX #3
  656. FLIPLOOP LDA M0STATE,X
  657. BNE FLIPEND
  658. INC M0FLIP,X
  659. FLIPEND DEX
  660. BPL FLIPLOOP
  661. LDA #0
  662. STA BORED
  663. LDA REVWAIT+2
  664. STA REVWAIT
  665. LDA REVWAIT+3
  666. STA REVWAIT+1
  667. LDA #$FF
  668. STA REVWAIT+2
  669. STA REVWAIT+3
  670. RTS
  671. *
  672. * RELEASE -CHECK FOR MONSTER RELEASES FORM PEN
  673. *
  674. RELEASE
  675. LDA LEVEL ; FIRST CHECK FOR TIMED RELEASE
  676. CMP #5
  677. BMI TIMEREL1
  678. LDA TRELEASE
  679. CMP #$B4
  680. BCC PINKREL
  681. JMP DOREL
  682. TIMEREL1
  683. LDA TRELEASE
  684. CMP #$F0
  685. BCC PINKREL
  686. DOREL ;TIME TO RELEASE SOMEONE
  687. LDA #0
  688. STA TRELEASE
  689. LDA M0STATE+1
  690. CMP #MSTATPEN
  691. BNE WHCHREL1
  692. LDA #1
  693. JSR GETOUT
  694. JMP PINKREL
  695. WHCHREL1
  696. LDA M0STATE+2
  697. CMP #MSTATPEN
  698. BNE WHCHREL2
  699. LDA #2
  700. JSR GETOUT
  701. JMP PINKREL
  702. WHCHREL2
  703. LDA M0STATE+3
  704. CMP #MSTATPEN
  705. BNE PINKREL
  706. LDA #3
  707. JSR GETOUT
  708. JMP PINKREL
  709. PINKREL
  710. LDA M0STATE+1
  711. CMP #MSTATPEN
  712. BNE BLUEREL
  713. LDA DEATHFLG
  714. BEQ PINKREL1
  715. LDA EATNDOTS
  716. CMP #6
  717. BNE BLUEREL
  718. LDA #1
  719. JSR GETOUT
  720. JMP BLUEREL
  721. PINKREL1 LDA PINKDOTS
  722. CMP M1REL
  723. BCC BLUEREL
  724. LDA #1
  725. JSR GETOUT
  726. BLUEREL
  727. LDA M0STATE+2
  728. CMP #MSTATPEN
  729. BNE GOLDREL
  730. LDA DEATHFLG
  731. BEQ BLUEREL1
  732. LDA EATNDOTS
  733. CMP #15
  734. BNE GOLDREL
  735. LDA #2
  736. JSR GETOUT
  737. JMP GOLDREL
  738. BLUEREL1 LDA BLUEDOTS
  739. CMP M2REL
  740. BCC GOLDREL
  741. LDA #2
  742. JSR GETOUT
  743. GOLDREL
  744. LDA M0STATE+3
  745. CMP #MSTATPEN
  746. BNE RELOUT
  747. LDA DEATHFLG
  748. BEQ GOLDREL1
  749. LDA EATNDOTS
  750. CMP #28
  751. BNE RELOUT
  752. LDA #0
  753. STA DEATHFLG
  754. STA EATNDOTS
  755. JMP RELOUT
  756. GOLDREL1
  757. LDA GOLDDOTS
  758. CMP M3REL
  759. BCC RELOUT
  760. LDA #3
  761. JSR GETOUT
  762. RELOUT
  763. RTS
  764. *
  765. * FLASHON
  766. FLASHON LDA #DKBLUE ;FLASH COLOR
  767. STA TEMP17
  768. LDA #LTPINK
  769. STA TEMP18
  770. JMP FLASHMON
  771. *
  772. * FLASHOFF
  773. FLASHOFF LDA #WHITE ;FLASH COLOR
  774. STA TEMP17
  775. LDA #PINK
  776. STA TEMP18
  777. * THIS ROUTINE FLASHES A MONSTER
  778. FLASHMON LDX #3 ;DO FOR EACH MONSTER
  779. FLSHLOOP LDA M0BLUE,X
  780. CMP #$08
  781. BNE FLASHEND
  782. LDA M0STATE,X
  783. CMP #MSTINPEN
  784. BEQ FLASHEND
  785. TXA
  786. ASL A
  787. ASL A
  788. TAY
  789. LDA TEMP17 ;BLUE MONSTER - FLASH COLOR
  790. STA P3C1,Y
  791. LDA TEMP18
  792. STA P3C2,Y
  793. FLASHEND DEX
  794. BPL FLSHLOOP
  795. RTS
  796. * CHKBLUE
  797. *
  798. CHKBLUE LDA RTLOCAL+1 ;ONLY EXECUTE EVERY OTHER TIME
  799. AND #$01
  800. BEQ CKBOUT
  801. LDA BLUWAIT ;IF BLUWAIT <> 0, WE ARE BLUE
  802. BEQ CKBOUT
  803. DEC BLUWAIT
  804. BEQ CKBNORM
  805. LDY #$04 ;SEE IF TIME TO FLASH
  806. CKBLOOP CMP ONFLASH,Y
  807. BEQ CKBONFL
  808. CMP OFFFLASH,Y
  809. BEQ CKBOFFFL
  810. DEY
  811. BPL CKBLOOP
  812. CKBOUT RTS
  813. CKBNORM JMP TURNNORM ;TURN MONSTER NORMAL
  814. CKBONFL JMP FLASHON ;FLASH MONSTER ON
  815. CKBOFFFL JMP FLASHOFF ;FLASH MONSTER OFF
  816. OFFFLASH DB $07,$13,$1F,$2B,$37 ;TIMES MONSTERS FLASH PINK
  817. ONFLASH DB $0D,$19,$25,$31,$3D ;TIMES MONSTERS FLASH BLUE
  818. * TIGHT LOOP FOR MOVING EYES DURRING SCORE DISPLAY
  819. TIGHT
  820. STX TEMP16
  821. LDX #3
  822. TIGHTLP ; TOP OF TIGHT LOOP
  823. LDA M0STATE,X
  824. CMP #MSTEYES
  825. BEQ DOTIGHT
  826. CMP #MSTINPEN
  827. BNE TIGHTEND
  828. JSR MMVPEN
  829. JMP TIGHTEND
  830. DOTIGHT
  831. JSR MNCHKDIR ; FIND OUT IF WE ARE AT INTERSECT
  832. CMP #0
  833. BNE TIGHTMV ; WE ARE NOT, SO JUST MOVE
  834. LDA M0OFF,X ; AND MAKE SURE WE ARE AT THE CENTER
  835. CMP #3
  836. BNE TIGHTMV
  837. LDA M0HPOS,X
  838. AND #3
  839. CMP #1
  840. BNE TIGHTMV
  841. JSR MMVEYES ; IT'S EYES
  842. TIGHTMV JSR MOVEMON ; MOVE THE MONSTER
  843. TIGHTEND
  844. DEX
  845. BPL TIGHTLP
  846. LDX TEMP16
  847. RTS
  848. * THIS ROUTINE IS SIMPLY ONE TO CHECK IF A MONSTER IS IN AN INTERSECTION
  849. MNCHKDIR LDA M0ZONE,X
  850. STA TEMP4
  851. LDA M0COL,X
  852. STA TEMP5
  853. LDA M0DIR,X
  854. STA TEMP6
  855. JMP CHECKDIR
  856. * THIS ROUTINE GETS RID OF THE ENERGIZED SOUND
  857. KILLBSND LDA #$0D ;3 TUNES - D, E, AND F - TO KILL
  858. JSR KILLTUNE
  859. LDA #$0E
  860. JSR KILLTUNE
  861. LDA #$0F
  862. JMP KILLTUNE
  863. IMVPOS DB $39,$4B,$4B,$4B
  864. IMHPOS DB $37+LEFTSIDE,$37+LEFTSIDE,$2F+LEFTSIDE,$3F+LEFTSIDE
  865. IMDIR DB DLEFT,DUP,DDOWN,DDOWN
  866. IMSTATE DB MSTNORM,MSTATPEN,MSTATPEN,MSTATPEN
  867. IMCOLOR DB PINK,LTPINK,LTBLUE,GOLD
  868. HOMEDIR DB DUP,DUP,DLEFT,DRIGHT
  869. OUTDIR DB DUP,DUP,DRIGHT,DLEFT
  870. DIROFFZ4 DB $00,$04,$00,$FC
  871. DIROFFC4 DB $04,$00,$FC,$00
  872. DIROFFZ2 DB $00,$02,$00,$FE
  873. DIROFFC2 DB $02,$00,$FE,$00
  874. BTIME DB $C0,$B4,$96,$78,$5A,$3C,$96,$3C,$3C,$1E
  875. DB $96,$3C,$1E,$1E,$5A,$1E,$1E,$01,$1E,$01
  876. * STAMPS FOR THE MONSTERS - INDEX: M0BLUE + M0DIR + (M0STATE ^ $10)/4
  877. MONSTMPH DB H(NRMMONST),H(NRMMONST+48),H(NRMMONST+96),H(NRMMONST+144)
  878. DB H(NRMMONST+24),H(NRMMONST+72),H(NRMMONST+120),H(NRMMONST+168)
  879. DB H(BLUMONST),H(BLUMONST),H(BLUMONST),H(BLUMONST)
  880. DB H(BLUMONST+24),H(BLUMONST+24),H(BLUMONST+24),H(BLUMONST+24)
  881. DB H(EYEMONST),H(EYEMONST+24),H(EYEMONST+48),H(EYEMONST+72)
  882. DB H(EYEMONST),H(EYEMONST+24),H(EYEMONST+48),H(EYEMONST+72)
  883. MONSTMPL DB L(NRMMONST),L(NRMMONST+48),L(NRMMONST+96),L(NRMMONST+144)
  884. DB L(NRMMONST+24),L(NRMMONST+72),L(NRMMONST+120),L(NRMMONST+168)
  885. DB L(BLUMONST),L(BLUMONST),L(BLUMONST),L(BLUMONST)
  886. DB L(BLUMONST+24),L(BLUMONST+24),L(BLUMONST+24),L(BLUMONST+24)
  887. DB L(EYEMONST),L(EYEMONST+24),L(EYEMONST+48),L(EYEMONST+72)
  888. DB L(EYEMONST),L(EYEMONST+24),L(EYEMONST+48),L(EYEMONST+72)
  889. * TABLES OF SCORE BITMAPS
  890. MSCRTBLH DB H(MONSTNUM),H(MONSTNUM+24),H(MONSTNUM+48),H(MONSTNUM+72)
  891. MSCRTBLL DB L(MONSTNUM),L(MONSTNUM+24),L(MONSTNUM+48),L(MONSTNUM+72)
  892. * HACK TABLE TO SLOW MONSTERS IN PEN
  893. HACKVPOS DB $00,$FF,$00,$01