RASTLOAD.S 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. * 1900 200684
  2. *
  3. *
  4. ** RASTLOAD.S *
  5. ** ASTEROIDS FOR THE ATARI 3600. **
  6. ** THIS FILE CONTAINS THE LOADER ASSUMING 16 HIGH ZONES. *
  7. ** TRASHES ALL REGISTERS, TEMPI+0,+1,+2,+3,+4 **
  8. ** USES FREE THRU FREE+11 AS POINTERS TO NEXT FREE POSITION IN HEADER. **
  9. LOADER:
  10. LDA #4 ;SET POINTER PAST FIRST HEADER FOR
  11. LDX #11 ; EACH DISPLAY LIST
  12. ZAPFREE:
  13. STA FREE,X
  14. DEX
  15. BPL ZAPFREE
  16. LDX #35
  17. LOADLOOP:
  18. LDA STATUS,X ;CHECK STATUS OF EACH OBJECT
  19. BEQ NEXTLOAD ;CHECK IF ZERO.
  20. CMP #$FF ;FORGET IF NULL, FF.
  21. BEQ NEXTLOAD ;OTHERWISE, LOAD IT
  22. AND #$0F ;CHECK LOW NYBBLE
  23. CMP #6 ;IF = 6 THEN SHOT
  24. BNE LOADOBJ
  25. LOADSHOT:
  26. LDA YPOSH,X ;A <- Y POSITION OF OBJECT
  27. EOR #$FF ;NEGATE POSITION
  28. AND #$0F ;MOD 16 IS LINE IN ZONE
  29. STA TEMPI+4
  30. LDA YPOSH,X ;A <- Y POSITION OF OBJECT
  31. LSR ;DIV 16 IS WHICH ZONE
  32. LSR
  33. LSR
  34. LSR
  35. TAY ;Y <- WHICH ZONE
  36. LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE
  37. CLC
  38. ADC LOWZONE,Y
  39. STA TEMPI ;TEMPI = LO ADDR FOR FIRST FREE POS
  40. LDA HIGHZONE,Y
  41. STA TEMPI+1 ;TEMPI+1 = HI ADDRESS
  42. LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE
  43. ; CLC ;OPTIONAL
  44. ADC #4 ;INCREMENT FREE POINTER
  45. STA FREE,Y
  46. LDY #0
  47. LDA #SHOT1 & 255
  48. STA (TEMPI),Y ;STORE LOW ADDRESS IN HEADER - 1ST BYTE
  49. INY
  50. LDA #$7F ;PALETTE 4, WIDTH 1
  51. STA (TEMPI),Y ;STORE IN HEADER - 2ND BYTE
  52. INY
  53. LDA TEMPI+4 ;GET LINE IN ZONE
  54. ORA #GRAPHICS >> 8 ;ADD TO START OF GRAPHICS DATA
  55. STA (TEMPI),Y ;STORE HIGH ADDR IN HEADER - 3RD BYTE
  56. INY
  57. LDA XPOSH,X ;GET HORIZONTAL POSITION
  58. STA (TEMPI),Y ;STORE IN HEADER - 4TH BYTE
  59. NEXTLOAD:
  60. DEX ;DECREMENT INDEX
  61. BPL LOADLOOP ;CONTINUE IF NOT FINISHED
  62. JMP LOADSCOR ;LOAD SCORE AT END OF DL IF DONE
  63. * LOAD A STANDARD OBJECT INTO TWO ZONES
  64. LOADOBJ:
  65. LDA YPOSH,X ;A <- Y POSITION OF OBJECT
  66. EOR #$FF ;NEGATE POSITION
  67. AND #$F ;MOD 16 IS LINE IN ZONE
  68. STA TEMPI+4
  69. LDA YPOSH,X ;A <- Y POSITION OF OBJECT
  70. LSR ;DIV 16 IS WHICH ZONE
  71. LSR
  72. LSR
  73. LSR
  74. TAY ;Y <- WHICH ZONE
  75. LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE
  76. CLC
  77. ADC LOWZONE,Y
  78. STA TEMPI ;TEMPI = LO ADDR FOR FIRST FREE POS
  79. LDA HIGHZONE,Y
  80. STA TEMPI+1 ;TEMPI+1 = HI ADDRESS
  81. LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE
  82. ; CLC ;OPTIONAL
  83. ADC #4 ;INCREMENT FREE POINTER
  84. STA FREE,Y
  85. INY ;ALSO LOAD INTO HIGHER ZONE
  86. CPY #12
  87. BCC YOK ;NEW ZONE NUMBER OK?
  88. LDY #0 ;NO, RESET TO LOWEST ZONE
  89. CLC
  90. YOK:
  91. LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE
  92. ADC LOWZONE,Y
  93. STA TEMPI+2 ;TEMPI = LO ADDR FOR FIRST FREE POS
  94. LDA HIGHZONE,Y
  95. STA TEMPI+3 ;TEMPI+1 = HI ADDRESS
  96. LDA FREE,Y ;A <- FREE POINTER FOR THAT ZONE
  97. ; CLC ;OPTIONAL
  98. ADC #4 ;INCREMENT FREE POINTER
  99. STA FREE,Y
  100. LDY #0
  101. LDA ACYC,X
  102. STA (TEMPI),Y ;STORE LO ADDR IN HEADER - 1ST BYTE
  103. STA (TEMPI+2),Y
  104. INY
  105. LDA PALS,X
  106. STA (TEMPI),Y ;STORE PALETTE + WIDTH INFO - 2ND BYTE
  107. STA (TEMPI+2),Y
  108. INY
  109. LDA STATUS,X ;FOR STATUS = ICON USES CHARS AS BASE
  110. CMP #ICON
  111. CLC
  112. BNE ZHADSTMP ;OTHERWISE USE GRAPHICS AS BASE
  113. LDA TEMPI+4
  114. ADC #(CHARS-$0F00) >> 8
  115. BNE ZSTHADDR ;BNE = JMP HERE
  116. ZHADSTMP:
  117. LDA TEMPI+4
  118. ADC #(GRAPHICS-$0F00) >> 8
  119. ZSTHADDR:
  120. STA (TEMPI),Y ;STORE HI ADDR IN HEADER - 3RD BYTE
  121. ; CLC ;OPTIONAL
  122. ADC #$10
  123. STA (TEMPI+2),Y ;STORE HI ADDR IN HEADER - 3RD BYTE
  124. INY
  125. LDA XPOSH,X
  126. STA (TEMPI),Y ;STORE HOR POS IN HEADER - 4TH BYTE
  127. STA (TEMPI+2),Y
  128. * THIS CODE CHECKS FOR HORIZONTAL WRAP AROUND, AND LOADS THE OBJECT AGAIN
  129. * IF IT NEEDS TO, IN ORDER TO WRAP SMOOTHLY
  130. CMP #XPOSMAX-8 ;IS IT WITHIN A MARGIN OF THE EDGE?
  131. BCC NEXTLOAD ;NO. IT'S OK, GO ON TO NEXT OBJECT.
  132. CPX #25 ;UFO IS CURRENTLY THE ONLY EXCEPTION
  133. BEQ STEPNEXT ; TO X-WRAPPING.
  134. CMP #$F0 ;HAS IT BEEN WRAPPED ALREADY?
  135. BCS UNWRAP ;YES. UNWRAP IT
  136. SBC #XPOSMAX ;WRAP IT: SUBTRACT OFF A SCREEN OFFSET
  137. STA XPOSH,X ;WANTS. WRAP IT.
  138. JMP LOADOBJ ;LOAD IT AGAIN
  139. UNWRAP:
  140. ADC #XPOSMAX ;UNWRAP IT: ADD BACK THE OFFSET
  141. STA XPOSH,X
  142. STEPNEXT:
  143. JMP NEXTLOAD
  144. LOADSCOR:
  145. ** HIGH SCORE
  146. LDY #0
  147. LDA FREE+11 ;GET POINTER FOR TOP ZONE
  148. CLC
  149. ADC LOWZONE+11 ;GET LOW ADDR FOR DL
  150. STA TEMPI
  151. LDA HIGHZONE+11 ;GET HIGH ADDR FOR DL
  152. STA TEMPI+1
  153. LDA #SCORCMHS & 255 ;ADD TOP SCORE
  154. STA (TEMPI),Y ;LOW ADDR
  155. INY
  156. LDA #$60 ;WRITE MODE 0, INDIRECT
  157. STA (TEMPI),Y
  158. INY
  159. LDA #SCORCMHS >> 8
  160. STA (TEMPI),Y ;HIGH ADDR
  161. INY
  162. LDA #$78 ;PALETTE 4, WIDTH 8
  163. STA (TEMPI),Y
  164. INY
  165. LDA #$39
  166. STA (TEMPI),Y ;HOR POSITION 39 HEX
  167. ** COMBINED SCORE
  168. LDA MODE ;ONLY DO FOR MODE 1
  169. CMP #1
  170. BNE LOADP1S
  171. INY
  172. LDA #SCORECMC & 255
  173. STA (TEMPI),Y ;STORE LOW ADDRESS OF CHARS.
  174. INY
  175. LDA #$60 ;WRITE MODE 0, INDIRECT
  176. STA (TEMPI),Y
  177. INY
  178. LDA #SCORECMC >> 8
  179. STA (TEMPI),Y ;STORE HIGH ADDRESS OF CHARS.
  180. INY
  181. LDA #$90 ;PALETTE 4, WIDTH 16
  182. STA (TEMPI),Y
  183. INY
  184. LDA #$39 ;HOR POS 39 HEX
  185. STA (TEMPI),Y
  186. ** PLAYER 1 SCORE
  187. LOADP1S:
  188. LDY #0
  189. LDA FREE+10 ;GET POINTER FOR NEXT ZONE
  190. CLC
  191. ADC LOWZONE+10 ;GET LOW ADDR FOR DL
  192. STA TEMPI
  193. LDA HIGHZONE+10 ;GET HIGH ADDR FOR DL
  194. STA TEMPI+1
  195. LDA #SCORMAP1 & 255
  196. STA (TEMPI),Y ;STORE LOW ADDRESS OF CHARS.
  197. INY
  198. LDA #$60 ;WRITE MODE 0, INDIRECT
  199. STA (TEMPI),Y
  200. INY
  201. LDA #SCORMAP1 >> 8
  202. STA (TEMPI),Y ;STORE HIGH ADDRESS OF CHARS.
  203. INY
  204. LDA #$10 ;PALETTE 0, WIDTH 16
  205. STA (TEMPI),Y
  206. INY
  207. LDA #$7 ;HOR POS 7
  208. STA (TEMPI),Y
  209. ** PLAYER 2 SCORE
  210. INY
  211. LDA #SCORMAP2 & 255
  212. STA (TEMPI),Y ;STORE LOW ADDRESS OF CHARS.
  213. INY
  214. LDA #$60 ;WRITE MODE 0, INDIRECT
  215. STA (TEMPI),Y
  216. INY
  217. LDA #SCORMAP2 >> 8
  218. STA (TEMPI),Y ;STORE HIGH ADDRESS OF CHARS.
  219. INY
  220. LDA #$30 ;PALETTE 1, WIDTH 16
  221. STA (TEMPI),Y
  222. INY
  223. LDA #$65 ;HOR POS 65 HEX
  224. STA (TEMPI),Y
  225. LDA FREE+11 ;INCREMENT POINTERS
  226. CLC
  227. ADC #5
  228. STA FREE+11
  229. LDX MODE
  230. CPX #1
  231. BNE ZADDZ10
  232. CLC
  233. ADC #5
  234. STA FREE+11
  235. ZADDZ10:
  236. LDA FREE+10
  237. CLC
  238. ADC #10
  239. STA FREE+10
  240. LOADZERO:
  241. LDX #11 ;LOAD ZEROS AT END OF DISPLAY LIST, DL
  242. LDY #1
  243. LOADZLP:
  244. LDA FREE,X
  245. CLC
  246. ADC LOWZONE,X
  247. STA TEMPI
  248. LDA HIGHZONE,X
  249. STA TEMPI+1
  250. LDA #0
  251. STA (TEMPI),Y
  252. DEX
  253. BPL LOADZLP
  254. STA LOADFLAG ;CLEAR FLAG SINCE DONE.
  255. RTS
  256. LOADSTAR:
  257. LDX #11
  258. STARLOOP:
  259. LDA LOWZONE,X ;ESTABLISH LO ADDR
  260. STA TEMPI
  261. LDA HIGHZONE,X ;ESTABLISH HI ADDR
  262. STA TEMPI+1
  263. JSR NEWRAND ;PICK A RANDOM STAR (0 TO 3)
  264. AND #$03
  265. CLC
  266. ADC #STARS & 255 ;ADD IN BASE OF STARS
  267. LDY #0
  268. STA (TEMPI),Y ;STORE LO ADDR
  269. INY
  270. LDA STARPW,X
  271. STA (TEMPI),Y ;STORE PALETTE & WIDTH INFO
  272. INY
  273. LDA #CHARS >> 8
  274. STA (TEMPI),Y ;STORE HI ADDR
  275. JSR NEWRAND ;GET A RANDOM HORIZONTAL POSITION
  276. LSR ;BANG INTO RANGE
  277. ADC #$10
  278. LDY #3
  279. STA (TEMPI),Y ;STORE HOR POS
  280. DEX
  281. BPL STARLOOP
  282. RTS
  283. STARPW:
  284. .DC.B $7F,$9F,$7F,$7F,$BF,$7F,$DF,$7F,$7F,$FF,$9F,$DF