DDMOVE.S 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. ********************************************************************************
  2. *********** ***********
  3. *********** DDMOVE: CONTROLS ENTRY MODE IF DIGDUG IS ***********
  4. *********** JUST WALKING OUT ON SCREEN, AND ***********
  5. *********** HANDLES MOVING DIGDUG AND DIGGING ***********
  6. *********** TUNNELS OTHERWISE. ALSO CHECKS FOR ***********
  7. *********** EXISTENCE OF ROCKS SO DIGDUG WON'T ***********
  8. *********** RUN INTO THEM, AND SETS FALLING ROCK ***********
  9. *********** FLAG WHEN DIRT UNDER A ROCK GOES AWAY. ***********
  10. *********** ***********
  11. ********************************************************************************
  12. DHFASTL EQU $D5 ;DD HOR SPEED FAST LOW BYTE
  13. DHFASTH EQU $AA ;DD HOR SPEED FAST HIGH BYTE
  14. DHSLOWL EQU $52 ;DD HOR SPEED SLOW LOW BYTE
  15. DHSLOWH EQU $52 ;DD HOR SPEED SLOW HIGH BYTE
  16. DIGSLOW EQU $5B DIGDUG SLOW 5 BITS
  17. ; FOR 16 BIT VERSION DIGSLOW = $5B $5B 10 BITS
  18. DIGFAST EQU $F7 DUGDUG FAST 7 BITS
  19. ; FOR 16 BIT VERSION DIGFAST = $7F $7F 14 BITS
  20. DDMOVE
  21. LDA #H(SOUTH7) ;ASSUME ALL ARRAYS ON SAME PAGE.
  22. STA DRTPTR+1
  23. LDA DIGGING
  24. STA DIGTEMP
  25. LDA ATTRACT
  26. BEQ CHKENTR
  27. LDA SQUASH
  28. BNE NOGO
  29. LDX LASTMOVE
  30. LDA DIGREST ;DIGDUG MOVING?
  31. BNE ATNEWDIR
  32. LDA ASTAGE ;STILL WALKING IN SAME DIRECTION?
  33. BEQ ATNEWDIR
  34. DEC ASTAGE
  35. LDA JOYSWCH,X ; E,W,S,N - 7F,BF,DF,EF
  36. BNE GPREZJOY ; CONTINUE IN OLD DIR
  37. ATNEWDIR JSR RANDOM
  38. AND #$03
  39. ADC #$00
  40. STA ASTAGE ;NEW COUNTDOWN
  41. DOATDIR AND #$03
  42. TAY
  43. LDA JOYSWCH,Y
  44. CMP REVSWCH,X
  45. BNE GPREZJOY
  46. INY ;TRY NOT TO REVERSE
  47. TYA
  48. BPL DOATDIR
  49. * LDY ASTAGE ;WE'RE IN ATTRACT MODE: USE ATTRACT
  50. * LDA ATTDIREC,Y ; MODE TABLE MOVEMENTS INSTEAD OF
  51. * BPL AHORIZ ; READING JOYSTICK.
  52. * ASL A
  53. * BPL AHORIZ
  54. * LDA DDYPOS ;UP OR DOWN: CHECK Y POSITION.
  55. * BNE CHKBOUND
  56. *AHORIZ LDA DDXPOS ;LEFT OR RIGHT: CHECK X POSITION.
  57. *CHKBOUND CMP ATTBOUND,Y
  58. * BNE GOTDIREC
  59. ***B CPY #15 ;DIGDUG NOT DEAD YET: RECYCLE DIREC'S.
  60. ***B BCC NEWDIREC
  61. ***B LDY #3
  62. *NEWDIREC INY ;TURN TO NEW DIRECTION.
  63. * STY ASTAGE
  64. *GOTDIREC ;EVENTUALLY, PUMP CHECK WILL GO HERE.
  65. * LDA ATTDIREC,Y
  66. * BNE GPREZJOY
  67. CHKENTR LDA ENTRY ;ARE WE IN ENTRY MODE?
  68. BEQ JOYMOVE
  69. LDA DDXPOS
  70. CMP #DDSTRTX
  71. BNE NOENTRY
  72. LDY #0
  73. STY NONOISE
  74. LDY #SNG15
  75. JSR NOISE
  76. NOENTRY LDA DDYPOS ;HAS DIGDUG STARTED DOWN YET?
  77. CMP #DDSTRTY
  78. BNE DOWNDD
  79. LDA #$BF ;MOVE DIGDUG LEFT.
  80. LDX DDXPOS
  81. CPX #DDMIDLX ;ARE WE FAR ENOUGH LEFT YET?
  82. GPREZJOY BNE PREZJOY
  83. DOWNDD CMP #DDMIDLY ;ALL THE WAY DOWN?
  84. BNE WDOWN
  85. LDA #RDIGDUG2
  86. STA DDINDX
  87. LDA #40
  88. JSR GENFREEZ
  89. LDA #0
  90. STA ENTRY
  91. * STA LASTMOVE ;FAKE LAST DIRECTION
  92. * STA NOTGRID
  93. * LDA #$B5
  94. * STA PROPORT
  95. * JMP SETDFAST
  96. * RTS
  97. JMP DOSTART ;DOSTART IS A SUBR
  98. WDOWN LDA #$DF
  99. BNE PREZJOY
  100. ****MOVEDONE RTS
  101. *FOO DB $7F,$DF,$BF,$EF,$7F ; E,S,W,N,E (IN ARRAYS.S)
  102. *BAR DB $20,$40,$10,$90 ; S,W,N,NE
  103. NOGO LDA WALKING
  104. BEQ NOGO2
  105. DEC WALKING ;DIGDUG CAN'T OR WON'T MOVE
  106. NOGO2 RTS
  107. JOYMOVE
  108. * LDA WALKING
  109. * STA DTEMP1 ;SAVE FOR LATER...
  110. LDA SQUASH
  111. ORA FREEZE
  112. BNE NOGO
  113. LDA SWCHA ;READ JOYSTICK...
  114. LDX PLAYNUM
  115. BEQ JOYMOVE0
  116. * LDX ALIEN ;IF THERE IS ONLY ONE JOYSTICK,
  117. * BEQ JOYMOVE0 ; USE PLAYER 0 INPUT FOR PLAYER 1.
  118. ASL A ;FETCH SECOND USER'S INPUT
  119. ASL A
  120. ASL A
  121. ASL A
  122. JOYMOVE0 ORA #$0F
  123. CMP #$FF
  124. BEQ JOYMOVE1
  125. LDX #$0A ;TWEAKABLE; <8 STOPS DD SONG REVERSING
  126. STX WALKING
  127. LDX #6
  128. TAY
  129. FOOLOOP AND BAR-1,X
  130. BEQ FOODONE
  131. TYA
  132. DEX
  133. BNE FOOLOOP
  134. FOODONE LDA FOO,X
  135. ;* AND #$10 ; N?
  136. ;* BEQ FOODONE
  137. ;* DEX
  138. ;* TYA
  139. ;* AND #$40 ; W?
  140. ;* BEQ FOODONE
  141. ;* DEX
  142. ;* TYA
  143. ;* AND #$20 ; S?
  144. ;* BEQ FOODONE
  145. ;* DEX ; MUST BE EAST
  146. *FOODONE LDA FOO,X
  147. ;;; STA TEMP+10 ;JOYSTICK REQUEST
  148. ;;; LDX LASTMOVE
  149. ;;; LDA JOYSWCH,X
  150. ;;; EOR #$FF ;RESULT IS BIT SET WHERE DD LAST MOVED
  151. ;;; BIT TEMP+10
  152. ;;; BNE NEWDIR ;OLDDIR AMONG DIRS REQUESTED?
  153. ;;; ORA TEMP+10 ; !!!!! USE NEWDIR
  154. ;;; CMP #$FF ; !!!!! USE NEWDIR
  155. * LDA JOYSWCH,X ; !!!!! USE OLDDIR
  156. ;;; BNE JOYMOVE1
  157. ;;;NEWDIR LDY #3
  158. ;;;SWCHLOOP LDA TEMP+10 ;JOYSTICK REQUEST
  159. ;;; CMP JOYSWCH,Y
  160. ;;; BEQ JOYMOVE1 ;IF ONE BIT IS LOW, USE IT
  161. ;;; DEY
  162. ;;; BPL SWCHLOOP
  163. ;;; ORA AREVSWCH,X ;IF TWO BITS ARE LOW, MOVE 90 DEGREES
  164. * LDA REVSWCH,X ;IF TWO BITS ARE LOW, MOVE IN REVERSE
  165. JOYMOVE1
  166. PREZJOY INC DIGREST ;GETS CLEARED IF DD TRIES TO MOVE
  167. ZJOY LDX LASTMOVE
  168. LDY #0
  169. ASL A
  170. BCC GOMDDE
  171. ZJOY0 INY
  172. ASL A
  173. GOMDDE BCC MDDE
  174. ZJOY1 INY
  175. ASL A
  176. BCC MDDN
  177. INY
  178. ASL A
  179. BCS NOGO
  180. MDDN
  181. LDA DDXPOS ;COLUMN BORDER?
  182. AND #$07
  183. BEQ COLBORDN
  184. LDA JOYSWCH,X ;TRY PREVIOUS DIRECTION
  185. BNE ZJOY
  186. COLBORDN LDA JOYSWCH,X
  187. ASL DIGSPEED ;TIME TO MOVE?
  188. BCS NTIME
  189. CMP REVSWCH,Y ;ALWAYS MOVE IF REVERSING
  190. BNE NOTREST
  191. BEQ NREV
  192. * CMP JOYSWCH,Y ;ALWAYS MOVE IF DIFF DIRECTION
  193. * BEQ NOTREST
  194. NTIME INC DIGSPEED
  195. NREV STY LASTMOVE
  196. CMP JOYSWCH,Y ;TUNNEL SPEED AND NO HARPOON
  197. BEQ STILLN ; IF CHANGING DIRECTION
  198. LDA #0
  199. STA DIGTEMP
  200. BEQ DOANIMN
  201. STILLN ASL PROPORT3 ;TIME TO DO VERT ANIMATION?
  202. BCC RUBN
  203. INC PROPORT3
  204. DOANIMN JSR ANIM ;UPDATE STAMP INDEX
  205. RUBN JSR CHKROCK ;AGAINST ROCK?
  206. BMI RUBN3
  207. CPY #2 ;MOVING SOUTH?
  208. BNE RUBN2
  209. LDA TUMBLE,X
  210. CMP #7 ;DD CAN MOVE SOUTH THROUGH CRUMBLE
  211. BCS RUBN3
  212. RUBN2 LDA #0
  213. STA DIGTEMP
  214. JMP FINMOV1
  215. RUBN3 LDX DDYPOS
  216. TYA
  217. LSR A
  218. BCC DIGS ;DIG SOUTH
  219. INX
  220. CPX TOPZONE+15 ;AT UPPERMOST LIMIT?
  221. BCC NOTTOP
  222. LDA DANIMS+0 ;FACE RIGHT
  223. STA DDINDX
  224. LDA #191
  225. STA DDYPOS
  226. LDY #0 ;FAKE LAST DIRECTION
  227. STY LASTMOVE
  228. RTS
  229. DIGS CPX #23
  230. BEQ RUBN2
  231. DEX
  232. NOTTOP STX DDYPOS ;STORE NEW VERT VALUE
  233. TXA ;NEW VERT VALUE
  234. SEC
  235. GETNOFST SBC #12
  236. CMP #12
  237. BCS GETNOFST
  238. JMP FINVERT
  239. MDDE
  240. JSR ROWHERE ;ROW BORDER?
  241. BEQ ROWBORDE
  242. LDX LASTMOVE
  243. LDA JOYSWCH,X ;TRY PREVIOUS DIRECTION
  244. JMP ZJOY
  245. NOTREST LDA #0
  246. STA DIGREST
  247. GLVDIRTN RTS
  248. ROWBORDE LDX LASTMOVE
  249. LDA JOYSWCH,X
  250. ASL DHORSPDL ;ALRIGHT TO MOVE HORIZONTALLY?
  251. ROL DHORSPDH
  252. BCS ETIME
  253. CMP REVSWCH,Y ;ALWAYS MOVE IF REVERSING
  254. BNE NOTREST
  255. BEQ EREV
  256. * CMP JOYSWCH,Y ;ALWAYS MOVE IF DIFF DIRECTION
  257. * BEQ NOTREST
  258. ETIME INC DHORSPDL
  259. EREV STY LASTMOVE
  260. CMP JOYSWCH,Y ;TUNNEL SPEED AND NO HARPOON
  261. BEQ STILLE ; IF CHANGING DIRECTION
  262. LDA #0
  263. STA DIGTEMP
  264. STILLE JSR ANIM ;UPDATE STAMP INDEX
  265. JSR CHKROCK ;AGAINST ROCK?
  266. BPL RUBN2
  267. LDX DDXPOS
  268. TYA
  269. LSR A
  270. BCS DIGW ;DIG WEST
  271. CPX #112
  272. BEQ RUBN2
  273. INX
  274. BNE NOTSID
  275. DIGW CPX #8
  276. BEQ RUBN2
  277. DEX
  278. NOTSID STX DDXPOS ;STORE NEW HOR VALUE
  279. TXA
  280. AND #$F8
  281. STA TEMP
  282. LDA DDXPOS
  283. SEC
  284. SBC TEMP
  285. FINVERT LDX #1
  286. STX NOTGRID
  287. JSR DIGDISP
  288. JMP FINMOV
  289. DIGDISP CMP VPRE1,Y
  290. BEQ VANHARP
  291. CMP VPRE2,Y
  292. BEQ VANHARP
  293. CMP VPRE3,Y
  294. BNE DIGONE
  295. VANHARP LDA #12
  296. JMP CHKNXTD ;CHKNXTD IS A SUBR
  297. DIGONE CMP VONE,Y
  298. BNE GETN1 ; 1 IN
  299. LDA FROMXFM,Y
  300. STA DRTPTR
  301. LDA DDYPOS ;FROM
  302. CLC
  303. ADC YFROMPL,Y
  304. TAX
  305. LDA DDXPOS
  306. CLC
  307. ADC XFROMPL,Y
  308. JSR CALCINDX
  309. CMP #36
  310. BCS DIGONE2
  311. JSR BORE1 ;FOUND IN FALL FILE
  312. DIGONE2 ;TO
  313. LDA #0
  314. STA DIGTEMP
  315. LDY LASTMOVE
  316. LDA ENTRXFM,Y
  317. STA DRTPTR
  318. JSR ADJUSTTO
  319. JSR CALCINDX
  320. CMP #36
  321. BCS DIGONE3
  322. PHA
  323. LDA TOXFM,Y
  324. STA DRTPTR
  325. PLA
  326. JMP BORE1 ;FOUND IN FALL FILE (BORE1 IS A SUBR)
  327. DIGONE3
  328. JMP DIGGER ;DIGGER IS A SUBR
  329. GETN1 CMP VHALF,Y
  330. BNE GETN2 ; 1 PAST HALFWAY IN
  331. DIGHALF
  332. LDA #0
  333. STA DIGTEMP
  334. LDA HALFXFM,Y
  335. STA DRTPTR
  336. JSR ADJUSTTO ;TAKE LEADING EDGE
  337. JSR CALCINDX ;CALC DIRCHAR
  338. CMP #36
  339. BCC GETN3
  340. JMP DIGGER ;DIGGER IS A SUBR
  341. GETN2 CMP VBOUND,Y
  342. BNE GETN3
  343. DIGBOUND JSR ROWHERE
  344. BNE DIGBND2
  345. LDA DDXPOS
  346. AND #7
  347. BNE DIGBND2
  348. LDA #4
  349. JSR CHKNXTD
  350. BCS DIGBND2
  351. STA NOTGRID ;WHEN CARRY CLR, CHKNXTD SET A TO BE 0
  352. DIGBND2
  353. GETN3 RTS
  354. BETTY LDA LASTMOVE
  355. ORA #$0C
  356. TAY
  357. JSR CHKROCK ;DIGDUG ONE PIXEL INTO SQUARE
  358. BMI FINMOV1 ; UNDER ROCK?
  359. LDA TUMBLE,X ;ROCK NOT ALREADY FALLING?
  360. BNE FINMOV1
  361. STX TEMP+10 ;SAVE ROCK INDEX
  362. JSR ROCKPUSH ;SQUARE UNDER ROCK HAS HOLLOW CENTER?
  363. LDX TEMP+10 ;RESTORE ROCK INDEX
  364. CMP #36
  365. BCS FINMOV1
  366. BCC CHKFALL1 ;ROCK SHOULD FALL WHEN DD REVERSES
  367. FINMOV ;DO THIS STUFF ONLY IF DIGDUG MOVES
  368. LDA #0
  369. STA DIGREST
  370. LDY NEEDDIR ; DIGDUG HOLDING UP ROCK?
  371. BEQ CHKFALL
  372. BMI STRTFALL ; FF MEANS ANY MOVE WILL CAUSE FALL
  373. DEY ; TRUE DIRECTION NEEDED
  374. CPY LASTMOVE ; WILL CURRENT DIR CAUSE FALL?
  375. BNE CHKFALL
  376. STRTFALL LDX HITROCK
  377. LDA #ONEDGE
  378. STA TUMBLE,X
  379. LDA #0
  380. STA NEEDDIR
  381. CHKFALL LDA LASTMOVE
  382. ORA #$04
  383. TAY
  384. JSR CHKROCK
  385. BPL CHKFALL1
  386. LDY #3
  387. JSR CHKROCK ;UNDER ROCK?
  388. BMI BETTY
  389. LDA #$FF
  390. BMI CHKFALL2
  391. CHKFALL1 LDY LASTMOVE
  392. LDA CVTDIR,Y
  393. CHKFALL2 LDY TUMBLE,X ;IGNORE ROCK ALREADY FALLING
  394. BNE FINMOV1
  395. STA NEEDDIR
  396. STX HITROCK
  397. FINMOV1 LDY LASTMOVE ;DO THIS IF DIGTEMP CHANGED
  398. LDA DIGTEMP
  399. CMP DIGGING ;CHANGE IN SPEED REQUESTED?
  400. BEQ FINMOV4
  401. STA DIGGING
  402. TAX
  403. BEQ FINMOV2
  404. LDX #DHSLOWL
  405. STX DHORSPDL
  406. LDX #DHSLOWH
  407. STX DHORSPDH
  408. LDX #DIGSLOW
  409. STX DIGSPEED
  410. FINMOV4 TAX
  411. BEQ FINMOV3
  412. JMP HARP ;HARP IS A SUBR
  413. FINMOV2 JSR SETDFAST
  414. FINMOV3 JSR VANPUMP ;RETURNS 0 IN A
  415. FINMOV5 STA PUMPY
  416. LEAVDIRT RTS
  417. HARP LDY LASTMOVE
  418. LDA HARPSTMP,Y
  419. STA PUMPIX
  420. LDA DDXPOS
  421. CLC
  422. ADC HARPXPL,Y
  423. STA PUMPX
  424. LDA DDYPOS
  425. CLC
  426. ADC HARPYPL,Y
  427. CMP #MINDDY
  428. BCC FINMOV3
  429. BCS FINMOV5
  430. ; USES X AND A.
  431. ; IF WAY CLEAR, RETURNS MINUS.
  432. ; IF WAY BLOCKED, RETURNS PLUS AND ROCK INDEX IN X.
  433. CHKROCK LDA DDXPOS ;ADJUST FOR DIRECTION
  434. CLC
  435. ADC XTOPL+4,Y
  436. STA TEMP+7
  437. LDA DDYPOS
  438. CLC
  439. ADC YTOPL+4,Y
  440. STA TEMP+1
  441. LDX #4
  442. ROCKER LDA TEMP+7 ;HOR COORDINATES MATCH?
  443. CMP ROCKSX,X
  444. BNE NROCKY
  445. LDA ROCKSIX,X ;IGNORE ROCK AS SCORE
  446. CMP #LOWSCOR
  447. BCS NROCKY
  448. LDA TEMP+1 ;VERT COORDINATES MATCH?
  449. CMP ROCKSY,X
  450. BEQ BLOCKED
  451. ;
  452. ; LET'S RECONSIDER....
  453. ;
  454. LDA TUMBLE,X ;FALLING?
  455. BEQ NROCKY
  456. LDA LASTMOVE ;DIGDUG MOVING HORIZONTALLY?
  457. AND #$02
  458. BNE NROCKY
  459. LDA ROCKSY,X ;ROCK OVERLAPS DIGDUG VERTICALLY?
  460. CLC
  461. * ADC #6 ;TWEAK??
  462. ADC #7
  463. * SEC
  464. SBC TEMP+1
  465. BCC NROCKY
  466. CMP #17
  467. BCS NROCKY
  468. LDA DDYPOS
  469. CMP #23 ;DIGDUG ON BOTTOM ROW?
  470. BEQ BLOCKED
  471. STX TEMP+9 ;SAVE X
  472. LDA DDYPOS
  473. SEC
  474. SBC #12
  475. TAX ;WHAT KIND OF DIRT CHAR IS BELOW ROCK?
  476. LDA TEMP+7
  477. JSR CALCINDX
  478. LDX TEMP+9 ;RESTORE X
  479. CMP #36 ;SOLID
  480. BEQ BLOCKED
  481. CMP #44 ;CUP
  482. BNE NROCKY
  483. BLOCKED LDA #$00 ;ROCK FOUND
  484. RTS
  485. NROCKY DEX
  486. BPL ROCKER
  487. ENDEAT RTS
  488. EATVEG LDA FSCORE ;FRUIT SCORE PRESENT?
  489. BEQ EATVEG1
  490. DEC FSCORCTR
  491. BNE ENDEAT
  492. LDA #0
  493. STA FSCORE
  494. STA FRUITY ;STOP DISPLAYING SCORE
  495. EATVEG1 LDA FRUIT ;FRUIT PRESENT?
  496. CMP #$0F
  497. BCC ENDEAT
  498. LDA DDYPOS ;DIGDUG ON TOP OF FRUIT?
  499. CMP #$6B
  500. BNE ENDEAT
  501. LDA DDXPOS
  502. CMP #$38
  503. BNE ENDEAT
  504. LDX #$01 ;POINTS DISPLAYING FLAG
  505. STX FSCORE
  506. DEX
  507. STX FRUIT ;FRUIT DONE
  508. LDA #$30 ;SET SCORE DISPLAY TIMER
  509. STA FSCORCTR
  510. LDA BONZO ;BONZO?
  511. BNE EATVEG2 ;ASSUME X IS 0
  512. LDY PLAYNUM
  513. LDX RACKNUM,Y ;CALC CORRECT POINT VALUE
  514. CPX #19
  515. BCC EATVEG2
  516. LDX #18 ;RACKS ABOVE 18 ARE ALL PINEAPPLES
  517. EATVEG2 LDA FPOINTS,X ;DISPLAY POINTS
  518. STA FRUITIX
  519. LSR A
  520. TAY
  521. LDA STMPPALW,Y
  522. STA FRUITPAL
  523. LDY VEGPTS,X ;FETCH MID BYTE
  524. LDA #53
  525. STA FRUITX
  526. LDA #0 ;LOW BYTE ALWAYS 0
  527. JSR ADDSCORE
  528. LDA #CSET2
  529. STA FRUITCST
  530. LDY #SNG10 ;GOT FRUIT
  531. JMP NOISE ;NOISE IS A SUBR