LOADER.S 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. ; LOADER.S
  2. ; THIS FILE CONTAINS TWO ROUTINES: THE MOVING CHARACTER LOADER, "MLOADER",
  3. ; WHICH IS CALLED EVERY OTHER FRAME, AND THE FIXED CHARACTER
  4. ; LOADER, "FLOADER", WHICH IS CALLED ONCE AT THE BEGINNING OF EACH
  5. ; RACK.
  6. ;
  7. ; THIS LOADER ASSUMES 16-HIGH ZONES, NUMBERED WITH ZONE 0 AT THE BOTTOM OF
  8. ; THE SCREEN; WITH "OFFSET" DECREMENTING THROUGH EACH ZONE, SO THAT
  9. ; THE CHARACTER TABLES MUST BE STORED UPSIDE DOWN.
  10. ;
  11. ; BECAUSE OF THE IMMANENT MARIA II, I'VE CHANGED MY STAMP ORGANIZATION
  12. ; TO REFLECT THE ONCOMING "HOLY ROM". THUS, EVEN THE FIXED CHARACTERS
  13. ; HAVE ZERO PADDING FOR NOW, TO SIMULATE THE WAY THE HOLY ROM WILL
  14. ; ACTUALLY APPEAR. ALL CHARACTERS HAVE THEIR FIRST REAL INFO AT
  15. ; EITHER "BLOCK1" ($50) OR "BLOCK2" ($70)
  16. ; AND ALL CHARACTERS EXTEND THROUGH 16 PAGES OF
  17. ; ROM.
  18. ; SINCE "MLOADER" INCREMENTS INDICES, THE HERO HAS LOWEST PRIORITY, THE CHEFS
  19. ; NEXT LOWEST, AND THE MOVING FOODS HAVE HIGHEST. ALL MOVING CHARS.
  20. ; HAVE PRIORITY OVER FIXED CHARACTERS.
  21. GLBL MLOADER
  22. MLOADER
  23. LDX #NUMZONES-1 ; INDEX OF THE LAST ZONE
  24. ; INITIALIZE THE SIZE OF EACH LIST TO BE AFTER THE FIXED CHARACTERS ALREADY
  25. ; IN THE LISTS.
  26. ZLOAD00 LDA LISTSTRT,X
  27. STA LISTSIZE,X
  28. DEX
  29. BPL ZLOAD00
  30. ; THE LOADER ITSELF:
  31. LDY #0 ; REGISTER Y WILL CONTAIN THE CH INDEX
  32. GETSTAMP LDA CYPOS,Y
  33. STY LTEMPY ; STORES THE CHARACTER INDEX
  34. BEQ JMPNXTS ; IF Y = 0, STAMP IS INVISIBLE
  35. STA TEMPYPOS ; Y POSITION
  36. LSR A ; DIVIDE BY 16
  37. LSR A
  38. LSR A
  39. LSR A ; "A" NOW CONTAINS THE ZONE NUMBER
  40. CMP #11 ; IF GREATER THAN 10, WE FUCKED UP
  41. BPL JMPNXTS
  42. TAX ; REGISTER X IS THE ZONE INDEX
  43. MOVE CXPOS,Y,HEADER3 ; SETUP THE HEADER BYTES WHICH
  44. MOVE CSTAMP,Y,HEADER0 ; ARE CONSTANT ACROSS ZONES
  45. MOVE CHSTAMP,Y,HEADER2
  46. MOVE CPALW,Y,HEADER1
  47. MOVE CSECOND,Y,LSECOND ; FOR LATER OVERLAP TEST
  48. ; THE FOLLOWING LOOP, "OVERLAPS", GETS EXECUTED ONCE FOR EACH ZONE WHICH
  49. ; THE CHARACTER IS IN. THE ONLY THING WHICH CHANGES IS THE HIGH
  50. ; BYTE OF THE HEADER; THE VARIABLE "HIGHPOS" KEEPS TRACK OF THE
  51. ; CURRENT HIGH BYTE. THE CHARACTER INFO IS FINISHED WHEN THE
  52. ; VALUE AT (HIGHPOS+8,HEADER0) IS 0; WHEN THIS CONDITION IS
  53. ; SATISFIED, I KNOW THE LAST ZONE OF THIS CHARACTER HAS JUST
  54. ; BEEN LOADED, AND I CAN BRANCH TO "NXTSTAMP".
  55. OVERLAPS LDY LISTSIZE,X ; SEE IF DLIST IS ALREADY FULL
  56. CPY #LISTLENG
  57. BCC NUFFROOM
  58. ; If there's no room for this stamp, it'll be invisible anyway, so remove
  59. ; it from gameplay.
  60. ; Assume that this is a food; if a chef, it'll become immediately obvious
  61. AALOAD LDY LTEMPY character index
  62. LDA #0
  63. STA CYPOS,Y
  64. LDA STATUS if food is flying through air to hero,
  65. CMP #STATHIT make sure this gets decremented
  66. BNE NXTSTAMP
  67. LDA CSTATE,Y must be a food with state ANGLE
  68. CMP #ANGLE
  69. BNE NXTSTAMP
  70. LDA #6 make the splat sound
  71. JSR TUNIN
  72. DEC NUMINAIR
  73. JMPNXTS BPL NXTSTAMP a jump-- numinair is always positive
  74. ; REGISTER Y IS NOW AN INDEX TO THE NEXT FREE HEADER BYTE IN THE DLIST.
  75. NUFFROOM MOVE LISTTABL,X,LISTPTR ; ELSE SET UP THE LIST POINTER
  76. MOVE LISTTABH,X,LISTPTR+1
  77. LDA HEADER0
  78. STA (LISTPTR),Y ; FIRST BYTE OF HEADER
  79. INY
  80. LDA HEADER1 ; SECOND BYTE OF HEADER
  81. STA (LISTPTR),Y
  82. INY
  83. ; THE THIRD BYTE IS THE ONLY TRICKY ONE. IF THIS IS THE FIRST ZONE OF THE
  84. ; CHARACTER, "HIGHPOS" MUST BE INITIALIZED TO
  85. ; (LAST CHAR INFO) - (16 LINES) + (# ZEROS NEEDED).
  86. ; NOTE THAT (# ZEROS NEEDED) = (TOPZONE,X) - (TEMPYPOS).
  87. LDA TOPZONE,X ; CALCULATE NUMBER OF ZEROS
  88. SEC
  89. SBC TEMPYPOS
  90. BCC HIGHSET ; IF NEGATIVE, THIS ISN'T THE FIRST ZONE
  91. CLC ; ELSE WE NEED TO SET HIGHPOS
  92. ADC HEADER2 ; HIGH BYTE OF CHAR. TABLES
  93. STA HIGHPOS
  94. HIGHSET LDA HIGHPOS
  95. STA (LISTPTR),Y ; FINALLY, STORE THE THIRD HEADER BYTE
  96. INY
  97. LDA HEADER3 ; NOW THE LAST HEADER BYTE
  98. STA (LISTPTR),Y
  99. INY
  100. STY LISTSIZE,X ; READY FOR THE NEXT HEADER
  101. ; WE'RE FINISHED WITH THIS HEADER. CHECK TO SEE IF THIS CHARACTER IS
  102. ; FINISHED. THIS WILL BE TRUE IF "HIGHPOS" IS LESS THAN OR EQUAL TO
  103. ; THE HIGH BYTE OF THE FIRST PAGE OF REAL CHARACTER INFO (THE VALUE
  104. ; "STAMPHGH").
  105. ; NOTE: IF THE VALUE IN "CSECOND" IS NON-ZERO, DON'T DO THE SECOND
  106. ; HEADER OF THIS STAMP. (FOR FALLING AND GROWING FROM HOLES)
  107. LDA LSECOND ; VALUE FROM ABOVE
  108. BNE NXTSTAMP ; IF NON-ZERO, SKIP NEXT HALF
  109. LDA HIGHPOS
  110. SEC
  111. SBC #1 ; TO GET <= OPERATION
  112. CMP HEADER2
  113. BCC NXTSTAMP ; IF LAST REAL INFO HAS BEEN DISPLAYED
  114. LDA HIGHPOS
  115. SEC
  116. SBC #16 ; GET NEW "HIGHPOS" VALUE
  117. STA HIGHPOS
  118. DEX ; POINT TO NEXT LOWER ZONE
  119. BPL OVERLAPS ; IF IT'S ON THE SCREEN, DO IT
  120. NXTSTAMP LDY LTEMPY ; REMEMBER, THIS IS THE CHAR. INDEX !
  121. INY
  122. CPY #TOTALCH
  123. BPL ENDLOAD temporary for bug detection
  124. JMP GETSTAMP
  125. ; BMI GETSTAMP ; KEEP GOING UNTIL ALL ARE DONE
  126. ENDLOAD
  127. ; NOW, LOOP THROUGH ALL THE ZONES ONE MORE TIME, AND PLACE TERMINATING
  128. ; ZEROS IN THE SECOND BYTE OF THE FIRST FREE HEADER:
  129. LDX #NUMZONES-1
  130. ENDLIST LDY LISTSIZE,X
  131. INY
  132. MOVE LISTTABL,X,LISTPTR ; CALCULATE ZONE POINTER
  133. MOVE LISTTABH,X,LISTPTR+1
  134. LDA #0
  135. STA (LISTPTR),Y
  136. DEX
  137. BPL ENDLIST
  138. RTS
  139. ; FLOADER
  140. ; THIS ROUTINE IS ALMOST IDENTICAL TO "MLOADER". IT'S ISOMORPHIC, BUT
  141. ; WITH ALL MOVING CHAR REFERENCES REPLACED BY FIXED CHAR REFERENCES.
  142. ; NOTE: THE INDEX IN THE MAIN LOOP HERE INCREMENTS (UNLIKE "MLOADER"
  143. ; WHICH DECREMENTS). IT MUST DO THIS DUE TO THE WAY I'VE
  144. ; IMPLEMENTED FOOD PILES; I CREATE THEM WHILE INCREMENTING, THUS
  145. ; I HAVE TO BE ABLE TO KNOW THEIR DLIST POSITIONS AT CREATION TIME.
  146. ; THIS IS POSSIBLE ONLY IF I ALSO INCREMENT HERE.
  147. FLOADER
  148. LDX #NUMZONES-1 ; RESTORE LISTSIZE FROM LISTSTRT
  149. ZFLOAD00 LDA LISTSTRT,X
  150. STA LISTSIZE,X
  151. DEX
  152. BPL ZFLOAD00
  153. LDY #0 ; REGISTER Y WILL CONTAIN THE CH INDEX
  154. GETFIXED LDA FYPOS,Y
  155. STY LTEMPY ; STORES THE CHARACTER INDEX
  156. BEQ NXTFIXED ; IF Y = 0, STAMP IS INVISIBLE
  157. STA TEMPYPOS ; Y POSITION
  158. LSR A
  159. LSR A
  160. LSR A
  161. LSR A ; "A" NOW CONTAINS THE ZONE NUMBER
  162. TAX ; REGISTER X IS THE ZONE INDEX
  163. MOVE FXPOS,Y,HEADER3 ; SETUP THE HEADER BYTES WHICH
  164. MOVE FSTAMP,Y,HEADER0 ; ARE CONSTANT ACROSS ZONES
  165. MOVE FHSTAMP,Y,HEADER2
  166. MOVE FPALW,Y,HEADER1
  167. ; THE FOLLOWING LOOP, "FOVERLAP", GETS EXECUTED ONCE FOR EACH ZONE WHICH
  168. ; THE CHARACTER IS IN. THE ONLY THING WHICH CHANGES IS THE HIGH
  169. ; BYTE OF THE HEADER; THE VARIABLE "HIGHPOS" KEEPS TRACK OF THE
  170. ; CURRENT HIGH BYTE. THE CHARACTER INFO IS FINISHED WHEN THE
  171. ; HIGHPOS IS <= #FIXEDHGH; WHEN THIS CONDITION IS
  172. ; SATISFIED, I KNOW THE LAST ZONE OF THIS CHARACTER HAS JUST
  173. ; BEEN LOADED, AND I CAN BRANCH TO "NXTSTAMP".
  174. FOVERLAP LDY LISTSIZE,X ; SEE IF DLIST IS ALREADY FULL
  175. CPY #LISTLENG
  176. BCS NXTFIXED ; IF IT IS, GO ON TO THE NEXT STAMP
  177. ; REGISTER Y IS NOW AN INDEX TO THE NEXT FREE HEADER BYTE IN THE DLIST.
  178. MOVE LISTTABL,X,LISTPTR ; ELSE SET UP THE LIST POINTER
  179. MOVE LISTTABH,X,LISTPTR+1
  180. LDA HEADER0
  181. STA (LISTPTR),Y ; FIRST BYTE OF HEADER
  182. INY
  183. LDA HEADER1 ; SECOND BYTE OF HEADER
  184. STA (LISTPTR),Y
  185. INY
  186. ; THE THIRD BYTE IS THE ONLY TRICKY ONE. IF THIS IS THE FIRST ZONE OF THE
  187. ; CHARACTER, "HIGHPOS" MUST BE INITIALIZED TO
  188. ; (LAST CHAR INFO) - (16 LINES) + (# ZEROS NEEDED).
  189. ; NOTE THAT (# ZEROS NEEDED) = (TOPZONE,X) - (TEMPYPOS).
  190. LDA TOPZONE,X ; CALCULATE NUMBER OF ZEROS
  191. SEC
  192. SBC TEMPYPOS
  193. BCC FHIGHSET ; IF NEGATIVE, THIS ISN'T THE FIRST ZONE
  194. CLC ; ELSE WE NEED TO SET HIGHPOS
  195. ADC HEADER2
  196. STA HIGHPOS
  197. FHIGHSET LDA HIGHPOS
  198. STA (LISTPTR),Y ; FINALLY, STORE THE THIRD HEADER BYTE
  199. INY
  200. LDA HEADER3 ; NOW THE LAST HEADER BYTE
  201. STA (LISTPTR),Y
  202. INY
  203. STY LISTSIZE,X ; READY FOR THE NEXT HEADER
  204. ; WE'RE FINISHED WITH THIS HEADER. CHECK TO SEE IF THIS CHARACTER IS
  205. ; FINISHED. THIS WILL BE TRUE IF "HIGHPOS" IS LESS THAN OR EQUAL TO
  206. ; THE BEGINNING OF THE STAMP TABLE, "STAMPHGH" ($4F).
  207. LDA HIGHPOS
  208. SEC
  209. SBC #1 ; SUBTRACT 1 TO GET <= OPERATION
  210. CMP HEADER2
  211. BCC NXTFIXED
  212. LDA HIGHPOS
  213. SEC
  214. SBC #16 ; GET NEW "HIGHPOS" VALUE
  215. STA HIGHPOS
  216. DEX ; POINT TO NEXT LOWER ZONE
  217. JMP FOVERLAP ; ELSE, DO NEXT ZONE-- "HIGHPOS"
  218. ; IS ALREADY SET
  219. NXTFIXED LDY LTEMPY ; REMEMBER, THIS IS THE CHAR. INDEX !
  220. INY
  221. TYA
  222. CMP #TOTALFX
  223. BMI GETFIXED ; DO ALL UP TO, BUT NOT INCLUDING,
  224. ; #TOTALFX
  225. ; NOW THAT WE'RE FINISHED, SET THE TABLE "LISTSTRT" TO BE EQUAL TO THE VALUES
  226. ; WE JUST DERIVED FOR "LISTSIZE".
  227. LDX #NUMZONES-1
  228. ZLOAD08 LDA LISTSIZE,X
  229. STA LISTSTRT,X
  230. DEX
  231. BPL ZLOAD08
  232. ; LDX #NUMZONES-1 ; SETUP FOR "ENDLIST"
  233. JMP ENDLOAD