SOBJ.S 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. *******SOBJ.S LINKED LIST MANIPULATION SHIT
  2. ; OTEMP1 THRU OTEMP4 ARE FOR THESE ROUTINES ONLY RIGHT NOW
  3. ;DOES ANYONE USE OTEMP4????? YES, NOSTUB DOES TO SAVE Y
  4. ; OTEMP1 IS ALWAYS USED TO PRESERVE Y
  5. ; ALL OF THESE ROUTINES SHOULD BE INTERUPTABLE
  6. ; ZERODEF
  7. ; RSEG CODE9
  8. ;
  9. ; SUBROUTINE TO INSERT NEW OBJECT IN LIST
  10. ; INDEX IN X
  11. ; DC IN TEMP6, DF IN TEMP10
  12. ; TRASHES A, Y AND TEMP5
  13. ;
  14. OBJINS:
  15. STY OTEMP1
  16. ; JSR LISTEST ;FILL TESTLIST WITH ONE'S
  17. ; LDA TESTLIST,X ;LOOK FOR A ONE. IF SO, IT IS ALREADY
  18. ; BNE BNE ;IN
  19. LDA TEMP6
  20. STA DXTBL,X
  21. LDA TEMP10
  22. STA DFTBL,X
  23. LDY #ZREF3 ;FIND REFERENCE POINT TO INSERT AT
  24. ; LDA TEMP10 ; NEW DF
  25. ;TEMP10 IS ALREADY IN A
  26. FOLLLP: CMP DXTBL,Y ; DC OF REFERENCE POINT
  27. BCC FOLLOW
  28. DEY
  29. CPY #ZREF0
  30. BCS FOLLLP
  31. LDA LOWEST ;LOWEST IS USED AS DEFAULT
  32. OBJINSLP: TAY ;FIND FIRST OBJECT WITH HIGHER PRIORITY
  33. LDA DFTBL,Y ; OLD DF
  34. CMP TEMP6 ; NEW DC
  35. BCC OBJINSFN ; NEW DC > OLD DF - FOUND IT
  36. LDA TEMP10 ; NEW DF
  37. CMP DXTBL,Y ; OLD DC
  38. BCC FOLLOW ; NEW DF < OLD DC - TRY NEXT ONE
  39. LDA YTBL,Y ; OLD Y
  40. CMP YTBL,X ; NEW Y
  41. BCS OBJINSFN ; NEW Y <= OLD Y - FOUND IT
  42. FOLLOW: LDA RLTBL,Y ; OTHERWISE, TRY NEXT ONE
  43. BPL OBJINSLP ; NOT AT END OF LIST
  44. STA RLTBL,X ;PUT OBJECT AT END OF LIST
  45. STX HIGHEST
  46. TXA
  47. STA RLTBL,Y
  48. TYA
  49. STA LLTBL,X
  50. ; JSR LISTEST
  51. LDY OTEMP1
  52. RTS
  53. OBJINSFN: TYA ;OTHERWISE INSERT OBJECT
  54. STA RLTBL,X
  55. LDA LLTBL,Y
  56. STA LLTBL,X
  57. STA OTEMP3
  58. TXA
  59. STA LLTBL,Y
  60. LDY OTEMP3
  61. BMI OBJINSBG
  62. STA RLTBL,Y
  63. ; JSR LISTEST
  64. LDY OTEMP1
  65. RTS
  66. OBJINSBG: STX LOWEST ;CHANGE LOWEST IF IT NEEDS IT
  67. ; JSR LISTEST
  68. LDY OTEMP1
  69. RTS
  70. ; BNE BNE BNE
  71. ; BEQ BEQ BEQ
  72. ;
  73. ; SUBROUTINE TO DELETE OBJECT FROM LIST
  74. ; INDEX IN X
  75. ;
  76. OBJDEL:
  77. ; CPX #PYRSTART
  78. ; BCC NOSTUB
  79. ; CPX #PYRSTOP
  80. ; BCS NOSTUB
  81. ; LDA VPTBL,X ;THIS LOOKS FOR DELETING SCROLLING
  82. ; CMP #SCRENBOT+1 ;OBJECT WHICH IS NOT IN LIST
  83. ; BNE BNE
  84. NOSTUB:
  85. STX OTEMP2
  86. STY OTEMP4 ;ONLY NOSTUB STORES Y IN OTEMP4
  87. ; JSR LISTEST ;CHECKS TO SEE OF OBJECT IS NOT IN
  88. ; LDA TESTLIST,X ;LIST BEFORE DELETING
  89. ; BEQ BEQ
  90. LDY LLTBL,X ;THIS IS CALLED BY OTHER SCROLLING
  91. ;ROUTINES SO IT CAN'T USE OTEMP1
  92. ;FOR Y
  93. BMI OBJDELBG ; DELETING FIRST OBJECT IN LIST
  94. LDA RLTBL,X
  95. STA RLTBL,Y
  96. BMI OBJDELEN ; DELETING LAST OBJECT IN LIST
  97. TAX ;OTHERWISE, JUST DELETE
  98. TYA
  99. STA LLTBL,X
  100. LDX OTEMP2
  101. ; JSR LISTEST
  102. LDY OTEMP4
  103. RTS
  104. OBJDELBG: LDA RLTBL,X ;RIGHT LINK IS LOWEST NOW
  105. STA LOWEST
  106. TAY
  107. LDA #$FF ;IT'S LEFT LINK IS FF
  108. STA LLTBL,Y
  109. ; JSR LISTEST
  110. LDY OTEMP4
  111. RTS ;NOTHING LEFT TO DELETE END
  112. OBJDELEN: STY HIGHEST
  113. LDY OTEMP4
  114. RTS
  115. ;
  116. ; SUBROUTINE TO MOVE AN OBJECT ALREADY IN THE LIST
  117. ; INDEX IN X
  118. ; NEW DC IN TEMP6, DF IN TEMP10
  119. ; TRASHES Y, A AND TEMP5
  120. ;
  121. OBJMOV:
  122. STY OTEMP1
  123. LDA TEMP10
  124. STA DFTBL,X
  125. LDA TEMP6
  126. CMP DXTBL,X
  127. STA DXTBL,X
  128. BEQ CANTGO
  129. BCS LEFTY ;IF GOING TO THE RIGHT, THIS ISN'T BAD
  130. LDY RLTBL,X
  131. LDA DFTBL,Y
  132. CMP TEMP6
  133. BCC CANTGO ; PUNT IF NOT CROSSING NEXT OBJECT
  134. LDY LLTBL,X ; STARTING POINT TO RE-INSERT
  135. BPL RIGHTOK
  136. LDY RLTBL,X
  137. RIGHTOK: JSR NOSTUB ; DELETE OBJECT (PRESERVES Y)
  138. ;TRASHES OTEMP1 HOWEVER!!!!
  139. TYA ; GET STARTING POINT
  140. JMP OBJINSLP ; INSERT NEAR STARTING POINT
  141. ;OTHERWISE, CHECK TO THE LEFT
  142. LEFTY:
  143. ; THIS FOLLOWS LIST TO THE LEFT UNTIL
  144. ; EITHER THE BEGINNING OR AN OBJECT
  145. ; THAT DOESN'T OVERLAP AND HAS LOWER
  146. ; PRIORITY IS FOUND. THEN IT CALLS
  147. ; OBJINSLP.
  148. LDY LLTBL,X
  149. LDA TEMP10
  150. CMP DXTBL,Y
  151. BCC CANTGO
  152. MOVLLP: LDA LLTBL,Y
  153. BMI MOVLFN
  154. TAY ; THIS WAS ABOVE THE BMI
  155. LDA TEMP10
  156. CMP DXTBL,Y
  157. BCS MOVLLP ; MIGHT WANT TO USE Y TO RIGHT
  158. MOVLFN: JSR NOSTUB ;Y IS NOT PRESERVED WHEN WE CALL NOSTUB
  159. TYA ;SINCE WE STORED Y IN OTEMP1 WHEN WE
  160. JMP OBJINSLP ;ENTERED OBJMOV!!!!!!!!
  161. CANTGO:
  162. ; JSR LISTEST
  163. LDY OTEMP1
  164. RTS
  165. ;LIST TEST LOOKS FOR LOOPS IN LINKED LIST
  166. ; ROUTINE TO VERIFY LIST
  167. ; LISTEST STX OTEMP2 ; ROUTINE TO TEST FOR LOOPS IN LIST
  168. ;WE CAN TRASH Y HERE
  169. ; LDX #83
  170. ; LDA #0
  171. ; TESTZERO STA TESTLIST,X ;CLEAR OUT TEST LIST
  172. ; DEX
  173. ; BPL TESTZERO
  174. ; LDY #0
  175. ; LDA LOWEST
  176. ; BMI PASSED ;ITS OVER
  177. ; INCTEST TAX
  178. ; LDA TESTLIST,X
  179. ; BNE THEBNE
  180. ; INC TESTLIST,X ;MARK ENTRY AS USED
  181. ; TXA
  182. ; STA ORDTEST,Y
  183. ; INY
  184. ; LDA RLTBL,X
  185. ; BPL INCTEST
  186. ; STA ORDTEST,Y ;TO STORE FF AT END OF ORDTEST
  187. ; DEY ;TO LOOK AT LAST ORDTEST
  188. ; LDX HIGHEST
  189. ; BMI PASSED
  190. ; TXA
  191. ; ORDERING CMP ORDTEST,Y
  192. ; BNE LLFUCK
  193. ; DEY
  194. ; LDA LLTBL,X
  195. ; TAX
  196. ; BPL ORDERING
  197. ; PASSED
  198. ; LDX OTEMP2
  199. ; RTS
  200. ; THEBNE BNE THEBNE
  201. ; LLFUCK BNE LLFUCK
  202. ;
  203. ; SUBROUTINE TO UPDATE THE LIST WHEN AN OBJECT IS SCROLLED
  204. ; INDEX IN X
  205. ; TRASHES Y, A, TEMP5 AND TEMP6
  206. ;
  207. OBJSCR: ;DECREMENT DC AND DF AUTOMATICALLY
  208. ; LDA VPTBL,X ;THIS LOOKS FOR MOVING UNINSERTED OBJ
  209. ; CMP #SCRENBOT+1
  210. ; BEQ BEQ
  211. ; CMP #SCRENBOT+2
  212. ; BEQ BEQ
  213. LDY RLTBL,X ; STARTING POINT TO RE-INSERT
  214. BMI FUCKEDUP
  215. JSR NOSTUB ; DELETE OBJECT (PRESERVES Y)
  216. ;TRASHES OTEMP1
  217. LDA DXTBL,X
  218. STA TEMP6 ; NEW DC
  219. LDA DFTBL,X
  220. STA TEMP10 ; NEW DF
  221. TYA ; GET STARTING POINT
  222. ; BMI FUCKEDUP ; NEED TO INSERT AT END OF LIST
  223. JMP OBJINSLP ; INSERT NEAR STARTING POINT
  224. FUCKEDUP: RTS
  225. ; LDY HIGHEST
  226. ; LDA #$FF
  227. ; STA RLTBL,X
  228. ; TYA
  229. ; STA LLTBL,X
  230. ; TXA
  231. ; STA RLTBL,Y
  232. ; RTS
  233. VRTS0: LDA #0
  234. STA GSCRFLAG
  235. RTS
  236. *** SCROLLING PROCEDURE CALLED FROM SKERNEL, SINIT ***
  237. VSCRP:
  238. LDA #0
  239. STA GCOARSE
  240. LDA SCRATE
  241. LSR
  242. STA SCROLLS
  243. BCC VSKIP
  244. LDA MAINCNT
  245. LSR
  246. BCC VSKIP
  247. INC SCROLLS
  248. VSKIP:
  249. LDA SCROLLS
  250. BEQ VRTS0
  251. LDY #$80 ;THIS TELLS SCROLL ON NEXT FRAME TO
  252. STY GSCRFLAG ;THIS TELLS MAINLOOP TO SCROLL
  253. CLC
  254. ADC ZONEOFF
  255. SBC #14
  256. STA SCRDELTA
  257. BCC SCRSHIT
  258. STY GCOARSE
  259. SCRSHIT: LDX HIGHEST
  260. SCRLOOP:
  261. LDA LLTBL,X ; NEED TO GET LINK BEFORE SCROLLING
  262. STA TEMP9
  263. CPX #PYRSTART
  264. BCC SCRNEXT
  265. CPX #PYRSTOP+1
  266. BCS SCRNEXT
  267. LDA VPTBL,X
  268. CLC
  269. ADC SCROLLS
  270. STA VPTBL,X
  271. CMP #$E0
  272. BCS SCRNODEL
  273. CMP #SCRENBOT
  274. BCS SCRDEL
  275. SCRNODEL:
  276. LDA HPTBL,X
  277. SEC
  278. SBC SCROLLS
  279. STA HPTBL,X
  280. LDA ZTBL,X
  281. SEC
  282. SBC SCROLLS
  283. STA ZTBL,X
  284. LDA COLZ1,X
  285. SEC
  286. SBC SCROLLS
  287. STA COLZ1,X
  288. LDA COLZ2,X
  289. SEC
  290. SBC SCROLLS
  291. STA COLZ2,X
  292. LDA DXTBL,X
  293. CMP #$FD
  294. BCS SCRNEXT ; DON'T SCROLL DX OF HIERO'S
  295. SEC
  296. SBC SCROLLS
  297. BNE DCOKAY
  298. LDA #1
  299. DCOKAY: STA DXTBL,X
  300. LDA DFTBL,X
  301. SEC
  302. SBC SCROLLS
  303. BNE DFOKAY
  304. LDA #1
  305. DFOKAY: STA DFTBL,X
  306. LDA RLTBL,X
  307. CMP #PYRSTART
  308. BCC SCRNSCR
  309. CMP #PYRSTOP+1
  310. BCC SCRNEXT
  311. SCRNSCR: JSR OBJSCR
  312. SCRNEXT: LDX TEMP9
  313. BPL SCRLOOP
  314. RTS
  315. SCRDEL: LDA #0
  316. STA COLSTAT,X
  317. LDA #SCRENBOT+1
  318. STA VPTBL,X
  319. JSR OBJDEL ; ASSUME THIS PRESERVES X
  320. JSR RETASLOT
  321. JMP SCRNEXT
  322. ; GETASLOT - ALLOCATES LOADER TABLE SLOTS FOR ANYTHING THAT NEEDS ONE
  323. ; AND RETURNS IT IN X. AN FF MEANS NONE WERE AVAILABLE
  324. GETASLOT: LDX SLOTGPTR
  325. LDA SLOTQ,X
  326. INX
  327. CPX #PYRSTOP-PYRSTART+1
  328. BNE GOTASLOT
  329. LDX #0
  330. GOTASLOT: CPX SLOTRPTR
  331. BEQ NOTASLOT ; NO SLOTS ARE LEFT
  332. STX SLOTGPTR
  333. TAX
  334. RTS
  335. NOTASLOT: LDA #$FF
  336. TAX
  337. RTS
  338. RETASLOT: TXA
  339. LDX SLOTRPTR
  340. CPX #0
  341. BEQ SLOTPUNT
  342. CPX #1
  343. BEQ SLOTPNT1
  344. CPX #2
  345. BEQ SLOTPNT2
  346. CMP SLOTQ-3,X
  347. BEQ SLOTTRAP
  348. SLOTPNT2: CMP SLOTQ-2,X
  349. BEQ SLOTTRAP
  350. SLOTPNT1: CMP SLOTQ-1,X
  351. BEQ SLOTTRAP
  352. SLOTPUNT: STA SLOTQ,X
  353. INX
  354. CPX #PYRSTOP-PYRSTART+1
  355. BNE RTDASLOT
  356. LDX #0
  357. RTDASLOT: STX SLOTRPTR
  358. SLOTTRAP: RTS
  359. ;SLOTTRAP JMP SLOTTRAP
  360. ; END