RASTA.S 11 KB

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