UFO.S 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. * 2035 030784
  2. *
  3. *
  4. ** UFO.S **
  5. ** ASTEROIDS FOR THE ATARI 3600 **
  6. ** THIS FILE CONTAINS THE UFO HANDLING ROUTINE **
  7. **
  8. ** TRASHES: X, Y, AC AND FIRST 7 BYTES OF TEMP.
  9. URTS:
  10. RTS
  11. UFO:
  12. LDA STATUS+25 ;CHECK STATUS OF UFO
  13. BMI TOOFAR
  14. JMP NOTNEW ;DON'T INITIALIZE IF ALREADY EXISTS
  15. TOOFAR:
  16. CMP #$FF ;IF HE'S BLOWING UP, DO NOTHING TILL
  17. BNE URTS ; HE'S DEAD.
  18. LDA DIFF ;IF NOVICE THEN NO UFO
  19. BEQ URTS
  20. LDA MODE ;CHECK STATUS OF SHIPS
  21. CMP #1
  22. BMI NOTTEAM
  23. LDA STATE
  24. AND STATE+1
  25. BNE URTS
  26. BEQ BRINGOUT ;BEQ = JMP
  27. NOTTEAM:
  28. LDX PLAYER
  29. LDA STATE,X
  30. BNE URTS
  31. BRINGOUT:
  32. LDA FRMCNT ;EVERY FORTH FRAME
  33. AND #2
  34. BNE URTS
  35. LDX PLAYER
  36. LDA ROCKTOT,X ;DON'T BRING OUT UFO IF NO ROCKS.
  37. BEQ URTS
  38. LDY RTIMER ;DEC RTIMER, BUT PEG AT ZERO
  39. BEQ Z2
  40. DEC RTIMER
  41. Z2:
  42. DEC EDELAY
  43. BNE URTS
  44. INC EDELAY ;HOLD AT ONE
  45. CPY #0 ;DON'T CARE NUM ROCKS IF RTIMER=0
  46. BEQ LOGG
  47. CMP STARTNUM,X ;OR OVER NUMBER TO START
  48. BCS URTS
  49. ;NEW UFO TIME!
  50. LOGG:
  51. LDA SDELAY ;EVERY TIME UFO GOES REDUCE SDELAY
  52. SEC
  53. SBC #6
  54. CMP #20
  55. BCC DIES
  56. STA SDELAY
  57. DIES:
  58. LDA SDELAY
  59. STA EDELAY
  60. LDA #$15 ;INITIALIZE SHOT REPEATER
  61. STA USHOTCNT
  62. JSR NEWRAND ;SET Y POSITION TO RANDOM #
  63. LSR ; BETWEEN $10 AND $10+$7F
  64. ADC #$10 ; (KEEP AWAY FROM TOP AND BOTTOM)
  65. STA YPOSH+25
  66. LDX PALTAB+25 ;LOADER MUST USE CORRECT PAL/WIDTH
  67. LDA MODE
  68. CMP #1
  69. BNE ONE
  70. LDY #8
  71. BPL TWO
  72. ONE:
  73. LDA PLAYER ; CHECK SCORE
  74. ASL
  75. ASL
  76. TAY
  77. TWO:
  78. LDA SCORE+1,Y
  79. CMP #2
  80. BCS MRBILL ; IF MORE THAN 30K THAN MR BILL
  81. LDA SDELAY ;IF SDELAY IS BIG THEN SLUGGO
  82. BMI SLUGGO
  83. JSR NEWRAND
  84. STA TEMP
  85. LDA SDELAY
  86. LSR
  87. CMP TEMP
  88. BCS SLUGGO
  89. MRBILL:
  90. INX ;ADD ONE FOR SMALLER WIDTH STAMP
  91. LDY #SMALLUFO
  92. BNE NEWUFO ;UNCONDITIONAL BRANCH
  93. SLUGGO:
  94. LDY #LARGEUFO
  95. NEWUFO:
  96. STY STATUS+25
  97. STX PALS+25
  98. JSR NEWRAND ;GOING RIGHT OR LEFT?
  99. LSR ; SHIFT A RANDOM BIT INTO CARRY
  100. BCC GORIGHT ; IF BIT 0, GO RIGHT TO LEFT
  101. LDA #XPOSMAX+4 ; ELSE LEFT TO RIGHT.
  102. STA XPOSH+25
  103. LDA #(-1)&255 ; XVEL -1 = LEFT TO RIGHT.
  104. BMI STORXVEL
  105. GORIGHT:
  106. LDA #(XPOSMIN-4)&255
  107. STA XPOSH+25
  108. LDA #1 ; XVEL 1 = RIGHT TO LEFT
  109. STORXVEL:
  110. STA XVELH+25
  111. LDA #0 ; LO BYTE OF XVEL SET TO ZERO
  112. STA XVELL+25
  113. BEQ ZYVEL ;INITIALLY UFO HAS ZERO Y VELOCITY
  114. NOTNEW:
  115. LDA FRMCNT
  116. CMP #$FE
  117. BCC NOCHNGY ;CHANGE Y VELOCITY ONLY PERIODICALLY
  118. LDA DIFF ;FOR INTER ALWAYS STRAIGHT ACROSS
  119. CMP #1
  120. BEQ ZYVEL
  121. JSR NEWRAND ;GET NEW RANDOM VALUE
  122. CMP #$AA
  123. BCS MOVEDN ;ONE THIRD OF THE TIME MOVE DOWN
  124. CMP #$55
  125. BCS MOVEUP ;ONE THIRD MOVE UP
  126. ;DON'T GO STRAIGHT IF TOO CLOSE TO TOP OR BOTTOM: AVOID CLIPPED UFO
  127. LDA YPOSH+25
  128. CMP #YPOSMAX-20
  129. BCS NOCHNGY
  130. CMP #YPOSMIN+10
  131. BCC NOCHNGY
  132. ZYVEL:
  133. LDA #0 ;ONE THIRD GO STRAIGHT ACROSS
  134. STA YVELH+25
  135. STA YVELL+25
  136. BEQ NOCHNGY
  137. MOVEDN:
  138. LDA #(-1)&255
  139. BMI STORYVEL ;BMI = JMP
  140. MOVEUP:
  141. LDA #1
  142. STORYVEL:
  143. STA YVELH+25 ;STORE Y VELOCITY
  144. LDA #0
  145. STA YVELL+25
  146. NOCHNGY:
  147. LDA XVELH+25 ;CHECK IF UFO GOES OFF THE SCREEN
  148. CLC
  149. ADC XPOSH+25
  150. CMP #XPOSMAX+4 ;UFO GOES PAST RIGHT?
  151. BCC UCHKSHOT ; NO. CHECK IF HE MAY SHOOT.
  152. CMP #(XPOSMIN-3)&255 ;UFO GOES PAST LEFT?
  153. BCS UCHKSHOT ; NO. CHECK IF HE MAY SHOOT.
  154. UFODONE:
  155. LDA #$FF ;UFO HAS GONE OFF SCREEN: NUKE HIM
  156. STA STATUS+25
  157. LDA #$08 ;KILL UFO TUNES
  158. JSR KILLTUNE
  159. LDA #$09
  160. JSR KILLTUNE
  161. RTS
  162. * CHECK TO SEE IF WE SHOULD FIRE NOW
  163. UCHKSHOT:
  164. LDX #1 ;HAVE 2 UFO SHOTS TO USE
  165. UFOSHOT:
  166. LDA STATUS+26,X ;TEST SHOT STATUS
  167. BMI ADDUSHOT ;SEE IF SHOT IS ALREADY ON SCREEN
  168. DEX ;YES, TRY OTHER SHOT
  169. BPL UFOSHOT
  170. BMI UANIMATE ;NO MORE SHOTS, JUMP TO VARY STAMPS
  171. ADDUSHOT:
  172. DEC USHOTCNT ;CHECK COUNTER FOR NEXT SHOT
  173. BNE UANIMATE ;NOT TIME YET, JUMP TO VARY STAMPS
  174. LDA #$20 ;RESET COUNTER
  175. STA USHOTCNT
  176. LDA #SHOT ;STORE STATUS AS SHOT
  177. STA STATUS+26,X
  178. LDA #$EC ;STORE COUNTER VALUE
  179. STA SHOTCNT,X
  180. LDA COLXPOSH+25 ;STORE SHOT POSITION AS CENTER OF UFO
  181. CMP #XPOSMAX
  182. BCC USTXPOS
  183. SBC #XPOSMAX
  184. USTXPOS:
  185. STA XPOSH+26,X
  186. LDA COLYPOSH+25
  187. CMP #YPOSMAX
  188. BCC USTYPOS
  189. SBC #YPOSMAX
  190. USTYPOS:
  191. STA YPOSH+26,X
  192. LDA #00
  193. STA XPOSL+26,X
  194. STA YPOSL+26,X
  195. LDA STATUS+25 ;DETERMINE HOW TO SHOOT
  196. CMP #SMALLUFO
  197. BEQ AIMSHOT ;MR. BILL AIMS HIS SHOTS
  198. JSR NEWRAND ;SLUGGO IS RANDOM
  199. USHOOT:
  200. AND #$1F
  201. TAY
  202. LDA HUSHVCTX,Y
  203. STA XVELH+26,X
  204. LDA USHVCTX,Y
  205. STA XVELL+26,X
  206. LDA HUSHVCTY,Y
  207. STA YVELH+26,X
  208. LDA USHVCTY,Y
  209. STA YVELL+26,X
  210. LDA #$0D ;PLAY UFO SHOT SOUND
  211. JSR DOTUNE
  212. UANIMATE:
  213. LDA FRMCNT ;VARY UFO STAMPS WITH TIME
  214. LSR
  215. LSR
  216. AND #$3 ;MASK ALL BUT 2 LSBITS
  217. LDY STATUS+25 ;WHICH TYPE?
  218. CPY #SMALLUFO
  219. BEQ UANIMSM
  220. ASL ;BIG UFO HAS 2 BYTES PER ANIMATION
  221. CLC
  222. ADC #UFOL1 & 255 ;ADD IN POINTER TO BASE OF LARGE UFO
  223. JMP USTACYC
  224. UANIMSM:
  225. CLC
  226. ADC #UFOS1 & 255
  227. USTACYC:
  228. STA ACYC+25 ;STORE ANIMATION FRAME POINTER
  229. RTS
  230. AIMSHOT:
  231. * INITIALIZE FLAGS FOR OCTANT SELECTION
  232. LDA #0
  233. STA TEMP+2 ;UDXNEG
  234. STA TEMP+3 ;UDYNEG
  235. STA TEMP+4 ;UDIAGNEG
  236. * DETERMINE WHICH SHIP TO SHOOT AT
  237. LDA MODE
  238. CMP #1
  239. BMI ZNOTTEAM ;ISSOLATE CASE OF TEAM PLAY
  240. ZTEAM:
  241. LDA STATE ;SEE IF BOTH ALIVE
  242. AND STATE+1
  243. BEQ PICKSRAN
  244. LDA STATE ;NO, SEE WHICH IS, KNOW AT LEAST 1 IS
  245. BNE AIMSHIP2
  246. AIMSHIP1:
  247. LDY #0 ;AIM AT SHIP 1
  248. BPL COMPVECT ;BPL = JMP
  249. PICKSRAN:
  250. JSR NEWRAND ;PICK A SHIP RANDOMLY
  251. ASL ;WE'RE SUCH ASL'S
  252. BCC AIMSHIP1
  253. AIMSHIP2:
  254. LDY #8 ;AIM AT SHIP 2
  255. BPL COMPVECT ;BPL = JMP HERE
  256. ZNOTTEAM:
  257. LDY OFFPLAY2
  258. * COMPUTE VECTORS
  259. COMPVECT:
  260. LDA COLXPOSH+24,Y
  261. SEC
  262. SBC COLXPOSH+25 ;SUBTRACT UFO'S POSITION TO GET 'DX'
  263. BCS UDXPOS
  264. INC TEMP+2
  265. EOR #$FF
  266. ; CLC ;CARRY IS CLEAR ALREADY
  267. ADC #1
  268. UDXPOS:
  269. STA TEMP ;SAVE DX
  270. LDA COLYPOSH+24,Y
  271. SEC
  272. SBC COLYPOSH+25 ;SUBTRACT UFO'S POSITION TO GET 'DY'
  273. BCS UDYPOS
  274. INC TEMP+3
  275. EOR #$FF
  276. ; CLC
  277. ADC #1
  278. UDYPOS:
  279. STA TEMP+1 ;SAVE DY
  280. * NORMALIZE VECTOR TO CORRECT FOR ASPECT RATIO. WE ALSO SCALE DOWN TO AVOID
  281. * OVERFLOW. ALSO, FLIP THE VECTOR TO THE FIRST OCTANT (ABOVE THE LINE Y = X).
  282. LSR ;5/8 = 1/2 + 1/8
  283. STA TEMP+5
  284. LSR
  285. LSR
  286. CLC
  287. ADC TEMP+5
  288. CMP TEMP
  289. BCS UDIAGOK ;ON CORRECT SIDE OF DIAGONAL Y = X.
  290. INC TEMP+4 ;NOT ON CORRECT SIDE:
  291. TAY ; SWAP DX AND DY
  292. LDA TEMP
  293. STY TEMP
  294. UDIAGOK:
  295. LSR ;SCALE DY <- DY / 4
  296. LSR
  297. STA TEMP+1
  298. * COMPUTE AND SAVE "3/8 DX", TO BE USED BELOW.
  299. LDA TEMP ;TEMP+6 <- DX/4 + DX/8
  300. LSR
  301. LSR
  302. STA TEMP+5
  303. LSR
  304. CLC
  305. ADC TEMP+5
  306. STA TEMP+6
  307. * COMPUTE CORRECT SECTOR (32TH OF CIRCLE) IN Y.
  308. * FIRST, FIGURE OUT WHICH 16TH OF THE CIRCLE.
  309. * WE USE THE 68.2 DEGREE LINE, 'CAUSE IT'S EASIER TO COMPUTE (ATAN(5/8 / 2/8)).
  310. LDA TEMP ;5/8 = 1/2 + 1/8
  311. LSR
  312. STA TEMP+5
  313. LSR
  314. LSR
  315. CLC
  316. ADC TEMP+5
  317. LDY #0
  318. CMP TEMP+1
  319. BCC SECTOR01
  320. LDY #2 ;SECTOR 2 OR 3
  321. LDA #0
  322. BEQ SECTOR23 ;UNCONDITIONAL BRANCH
  323. SECTOR01:
  324. LDA TEMP
  325. SECTOR23:
  326. CLC
  327. ADC TEMP+6 ;1 + 3/8 = 11/8
  328. CMP TEMP+1
  329. BCC SECTOR02
  330. SECTOR13:
  331. INY
  332. SECTOR02:
  333. STY TEMP
  334. * UNFOLD VECTOR INTO CORRECT OCTANT, QUADRANT AND HALF-SPACE
  335. LDY TEMP+4 ;CHECK UDIAGNEG
  336. BEQ NODIAGN
  337. LDA #7
  338. SEC
  339. SBC TEMP
  340. STA TEMP
  341. NODIAGN:
  342. LDY TEMP+3 ;CHECK UDYNEG
  343. BEQ NODYNEG
  344. LDA #15
  345. SEC
  346. SBC TEMP
  347. STA TEMP
  348. NODYNEG:
  349. LDY TEMP+2 ;CHECK UDXNEG
  350. BEQ NODXNEG
  351. LDA #31
  352. SEC
  353. SBC TEMP
  354. STA TEMP
  355. NODXNEG:
  356. ; PERTERB VECTOR BY RANDOM NUMBER OF INDEX NOTCHES.
  357. LDA UFOACC ;COMPUTE UFOACC / 2
  358. LSR
  359. STA TEMP+6
  360. UTOOPOOR:
  361. JSR NEWRAND
  362. LDY TEMP+6
  363. AND UFOPMASK-1,Y ;TABLE IS 1-ORIGIN (Y > 0)
  364. CMP UFOACC
  365. BCS UTOOPOOR ;TOO POOR A SHOT, TRY AGAIN
  366. ; CLC ;CARRY IS CLEAR
  367. ADC TEMP ;ADD TO PRECISE VECTOR
  368. SEC
  369. SBC TEMP+6 ;SUBTRACT UFOACC/2 (OFFSET)
  370. JMP USHOOT
  371. UFOPMASK:
  372. .DC.B $03,$07,$07,$0F ;RANGE MASKS FOR RANDOM #'S
  373. * UFO SHOT VECTORS.
  374. HUSHVCTX:
  375. .DC.B $00,$00,$01,$02,$03,$03,$04,$04
  376. .DC.B $04,$04,$04,$03,$03,$02,$01,$00
  377. .DC.B $00,$FF,$FE,$FD,$FC,$FC,$FB,$FB
  378. .DC.B $FB,$FB,$FB,$FC,$FC,$FD,$FE,$FF
  379. USHVCTX:
  380. .DC.B $00,$DB,$AD,$6E,$18,$A3,$0B,$4A
  381. .DC.B $60,$4A,$0B,$A3,$18,$6E,$AD,$DB
  382. .DC.B $00,$26,$54,$93,$E9,$5E,$F6,$B7
  383. .DC.B $A1,$B7,$F6,$5E,$E9,$93,$54,$26
  384. HUSHVCTY:
  385. .DC.B $07,$06,$06,$05,$04,$03,$02,$01
  386. .DC.B $00,$FE,$FD,$FC,$FB,$FA,$F9,$F9
  387. .DC.B $F9,$F9,$F9,$FA,$FB,$FC,$FD,$FE
  388. .DC.B $00,$01,$02,$03,$04,$05,$06,$06
  389. USHVCTY:
  390. .DC.B $00,$DE,$78,$D2,$F3,$E4,$AE,$5E
  391. .DC.B $00,$A3,$53,$1D,$0E,$2F,$89,$23
  392. .DC.B $01,$23,$89,$2F,$0E,$1D,$53,$A3
  393. .DC.B $00,$5E,$AE,$E4,$F3,$D2,$78,$DE
  394. .DC.B $01,$23,$89,$2F,$0E,$1D,$53,$A3
  395. .DC.B $00,$5E,$AE,$E4,$F3,$D2,$78,$DE