PATH.S 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. * PATH.S ROUTINES FOR PATH ANALYSIS IN MS PAC-MAN
  2. *
  3. * CHECKDIR - CHECK FOR DIRECTIONS FROM A LOCATION
  4. * IN: TEMP4 = ZONE, TEMP5 = COLUMN, TEMP6 = DIR
  5. * OUT: T12=RIGHT, T13=DOWN, T14=LEFT, T15=UP,(LEGIT=0,BACK=1,WALL=-1)
  6. * A=~INTERSECT
  7. * Y IS DISTORTED, X IS SAVED
  8. * TEMP0-3,10-11 ARE USED
  9. CHECKDIR STX TEMP11
  10. LDA #0
  11. STA TEMP12
  12. STA TEMP13
  13. STA TEMP14
  14. STA TEMP15
  15. TAX
  16. CHDLOOP LDA T4OFF,X ;GET ZONE AND COLUMN NEXT TO POS
  17. CLC
  18. ADC TEMP4
  19. STA TEMP0
  20. LDA T5OFF,X
  21. CLC
  22. ADC TEMP5
  23. STA TEMP1
  24. JSR GETCHAR ;FIND OUT WHAT IS THERE
  25. CMP #BLNKCHAR ;SEE IF VALID PLACE TO GO
  26. BPL CHDNEXT
  27. LDA #-1 ;NO GOOD
  28. STA TEMP12,X
  29. CHDNEXT INX
  30. CPX #$04
  31. BMI CHDLOOP
  32. LDA TEMP6 ;SET DIRECTION WE CAME FROM
  33. CLC
  34. ADC #2
  35. AND #3
  36. TAX
  37. LDA #1
  38. STA TEMP12,X
  39. LDA TEMP6 ;SEE IF IN INTERSECTION
  40. CLC
  41. ADC #1
  42. AND #3
  43. TAX
  44. CLC
  45. ADC #2
  46. AND #3
  47. TAY
  48. LDA #$FF
  49. AND TEMP12,X
  50. AND TEMP12,Y
  51. LDX TEMP11
  52. RTS
  53. * WHCHWAY - GIVEN A INTERSECTION AND A GOAL, FIGURE OUT BEST PATH
  54. * IN: TEMP4=CURRENT ZONE, TEMP5=CURRENT COL, TEMP6= CURRENT DIR
  55. * TEMP7=GOAL ZONE, TEMP8=GOAL COL, TEMP12-15 INTERSECTION STATE
  56. * OUT: A=GOAL DIR
  57. * USES: TEMP0-3,9-11
  58. * SAVES: X,Y
  59. WHCHWAY TXA ;STORE REGISTERS ON STACK
  60. PHA
  61. TYA
  62. PHA
  63. JSR NORMGOAL ;NORMALIZE GOAL
  64. JSR SETSQUAR
  65. LDA TEMP6
  66. STA TEMP2 ; CURRENT BEST DIRECTION
  67. LDA #$8F ; LARGE NEG NUMBER
  68. STA TEMP3 ; -(CURRENT DISTANCE IN BEST DIRECTION)
  69. LDX #0
  70. WWLOOP LDA T4OFF,X ;ADJUST ZONE AND COLUMN
  71. CLC
  72. ADC TEMP4
  73. STA TEMP9
  74. LDA T5OFF,X
  75. CLC
  76. ADC TEMP5
  77. STA TEMP10
  78. LDA TEMP12,X ;GET STATE THERE, SEE IF VALID
  79. BNE WWNEXT
  80. JSR CALCDIST ;FIND DISTANCE TO GOAL
  81. CMP TEMP3 ;SEE IF SHORTER
  82. BCC WWNEXT
  83. STA TEMP3 ;NEW CURRENT DISTANCE
  84. STX TEMP2 ;NEW DIRECTION
  85. WWNEXT INX
  86. CPX #$04
  87. BMI WWLOOP
  88. PLA ;RESTORE REGISTERS FROM STACK
  89. TAY
  90. PLA
  91. TAX
  92. LDA TEMP2
  93. RTS
  94. * NORMGOAL NORMALIZES THE GOAL ZONE AND COLUMN. MAKES SURE THEY ARE IN
  95. * THE RANGE 0..3F
  96. * IN: TEMP7=GOAL ZONE, TEMP8=GOAL COLUMN
  97. * OUT: TEMP7, TEMP8 NORMALIZED
  98. NORMGOAL LDA TEMP7 ;FIRST DO ZONE
  99. JSR NORMLIZE
  100. STA TEMP7
  101. LDA TEMP8 ;THEN COLUMN
  102. JSR NORMLIZE
  103. STA TEMP8
  104. RTS
  105. NORMLIZE BMI NMLFLOOR ;SEE IF TOO LOW
  106. CMP #$40
  107. BPL NMLTOP ;SEE IF TOO HI
  108. RTS
  109. NMLFLOOR LDA #$00 ;TOO LOW - USE 0
  110. RTS
  111. NMLTOP LDA #$3F ;TOO HI - USE 3F
  112. RTS
  113. * CALCDIST CALCULATES DISTANCE BETWEEN TWO POINTS
  114. * INT: (TEMP7,TEMP8) FIRST POINT (TEMP9, TEMP10) SECOND POINT
  115. * OUT: A= NEGOTIVE OF DISTANCE
  116. * USES: TEMP0,1
  117. CALCDIST
  118. LDA TEMP7
  119. SEC
  120. SBC TEMP9
  121. STA TEMP1
  122. BPL CALCDIS1
  123. LDA #0
  124. SEC
  125. SBC TEMP1
  126. STA TEMP1
  127. CALCDIS1
  128. LDA TEMP8
  129. SEC
  130. SBC TEMP10
  131. STA TEMP0
  132. BPL CALCDIS2
  133. LDA #0
  134. SEC
  135. SBC TEMP0
  136. STA TEMP0
  137. CALCDIS2 TXA ;GET TEMP11+X INTO Y
  138. CLC
  139. ADC TEMP11
  140. TAY
  141. LDA TEMP0 ;GET SUM OF DISTANCES
  142. CLC
  143. ADC TEMP1
  144. CLC
  145. ADC #2 ;GIVE SOME ROOM FOR SQUARE ADJUSTMENT
  146. CLC
  147. ADC SQUARTAB,Y
  148. STA TEMP1 ;AND NOW INVERT IT
  149. LDA #0
  150. SEC
  151. SBC TEMP1
  152. RTS
  153. * THIS ROUTINE FINDS OUT WHAT DIRECTION SHOULD BE FAVORED, AND WHAT SHOULD BE
  154. * SHUNNED. THIS SETS UP TEMP11, WHICH SHOULD BE USED WITH THE DIRECTION AS
  155. * AN OFFSET INTO SQUARTAB.
  156. * THIS SHOULD BE CALLED SOON ENOUGH THAT TEMP0-3 CAN BE USED
  157. SETSQUAR LDA #$00
  158. STA TEMP0 ;VERTICAL FLIP BIT
  159. STA TEMP1 ;HORIZONTAL FLIP BIT
  160. LDA TEMP7 ;GOAL FOR ZONE
  161. SEC
  162. SBC TEMP4 ;OUR ZONE
  163. STA TEMP2 ;VERTICAL DELTA
  164. BPL SSQHOR
  165. LDA #$08
  166. STA TEMP0 ;VERTICAL FLIP
  167. LDA #$00
  168. SEC
  169. SBC TEMP2
  170. STA TEMP2
  171. SSQHOR LDA TEMP8 ;GOAL FOR COLUMN
  172. SEC
  173. SBC TEMP5 ;OUR COLUMN
  174. STA TEMP3 ;HORIZONTAL DELTA
  175. BPL SSQCOMP
  176. LDA #$08
  177. STA TEMP1 ;HORIZONTAL FLIP
  178. LDA #$00
  179. SEC
  180. SBC TEMP3
  181. STA TEMP3
  182. SSQCOMP LDA TEMP2 ;VERTICAL DELTA
  183. SEC
  184. SBC TEMP3 ;HORIZONTAL DELTA
  185. BMI HORMORE
  186. LDA #$04 ;VERTICAL MORE
  187. CLC
  188. ADC TEMP0 ;8 MORE IF VERTICAL FLIPPED
  189. STA TEMP11
  190. RTS
  191. HORMORE LDA #$00 ;HORIZONTAL MORE
  192. CLC
  193. ADC TEMP1 ;8 MORE IF HORIZONTAL FLIPPED
  194. STA TEMP11
  195. RTS
  196. * THIS TABLE IS TO ADD A SLIGHT COMPENSATION TO MAKE IT LOOK MORE LIKE A SQUARE
  197. SQUARTAB DB -1,0,1,0,0,-1,0,1,1,0,-1,0,0,1,0,-1
  198. * THIS TABLE USED FOR OFFSETS FOR ZONES AROUND
  199. T4OFF DB 0,1,0,-1
  200. T5OFF DB 1,0,-1,0