JOY.S 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. * 2040 180684
  2. *
  3. ** JOY.S **
  4. ** ASTEROIDS FOR THE ATARI 3600 **
  5. ** THIS FILE CONTAINS THE JOYSTICK HANDLING ROUTINE. **
  6. JOY:
  7. LDX PLAYER
  8. LDA STATE,X ;CHECK IF SHIP IS OK
  9. BEQ EXECJOY ;ONLY CHECK JOYSTICK IF OK
  10. RTS
  11. EXECJOY:
  12. LDX OFFPLAY2 ;POWER STEERING BABY!
  13. LDA XVELH+24,X ;CALCULATE RATE OF TURN
  14. BPL ZSTTEMP ;A VELOCITY DEPENDENT VALUE
  15. EOR #$FF
  16. CLC
  17. ADC #1
  18. ZSTTEMP:
  19. STA TEMP
  20. LDA YVELH+24,X
  21. BPL ZADDTEMP
  22. EOR #$FF
  23. CLC
  24. ADC #1
  25. ZADDTEMP:
  26. CLC
  27. ADC TEMP
  28. STA TEMP
  29. LDA #9
  30. SBC TEMP
  31. STA TEMP
  32. LDX PLAYER ;CHECK HYPERSPACE
  33. LDA HYPBUT1,X
  34. BMI LDSWCH
  35. JSR HYPERSPC
  36. LDSWCH:
  37. LDA SWCHAVAL ;GET JOYSTICK INPUT
  38. LDX PLAYER
  39. BEQ JOYONE
  40. ASL ;IF PLAYER2 THEN SHIFT 4 MORE
  41. ASL
  42. ASL
  43. ASL
  44. JOYONE:
  45. CKWEST:
  46. ASL ;SHIFT MSB INTO CARRY
  47. PHA ;SAVE ACC
  48. BCS CKEAST ;IF SET THEN NEXT, ACTIVE LOW
  49. JSR ROTLEFT ;CLEAR, ROTATE LEFT
  50. CKEAST:
  51. PLA ;RESTORE ACC
  52. ASL ;CHECK WEST BIT
  53. PHA ;SAVE ACC
  54. BCS CKSOUTH ;IF SET THEN NEXT
  55. JSR ROTRIGHT ;CLEAR, ROTATE RIGHT
  56. CKSOUTH:
  57. PLA
  58. ASL
  59. PHA
  60. BCS CKNORTH
  61. JSR DAMPX
  62. JSR DAMPY
  63. CKNORTH:
  64. PLA ;RESTORE ACC
  65. ASL ;CHECK NORTH BIT
  66. BCS DAMPTHR ;IF SET THEN DAMP
  67. BCC ADDTHRST ;IF CLEAR THEN THRUST
  68. * ROTATE SHIP ROUTINES
  69. ROTRIGHT:
  70. LDA SHIPDIR,X
  71. SEC
  72. SBC TEMP
  73. JMP SETSDIR
  74. ROTLEFT:
  75. LDA SHIPDIR,X
  76. CLC
  77. ADC TEMP
  78. SETSDIR:
  79. STA SHIPDIR,X
  80. LDY OFFPLAY2
  81. LSR
  82. LSR
  83. LSR
  84. AND #$FE
  85. CLC
  86. ADC #SHIP1&255
  87. STA ACYC+24,Y
  88. RTS
  89. * DAMPEN THRUST ROUTINE
  90. DAMPTHR:
  91. LDA MODE ;IN ONE-AT-A-TIME PLAY,
  92. CMP #01 ; (I.E., MODES $FF AND $00),
  93. BMI DAMPTN ; DON'T WORRY ABOUT OTHER PLAYER
  94. LDA STATE ;ELSE MAKE SURE BOTH PLAYERS ARE OK.
  95. ORA STATE+1 ; IF EITHER IS NOT, IT MUST BE THE
  96. BNE DAMPTN ; OTHER ONE! GO ON AS IF ONLY 1 IS OK.
  97. LDA SWCHAVAL ;ELSE MAKE SURE ONLY ONE THRUST TUNE IS
  98. AND THRBITS,X ; EVER PLAYING AT A TIME;
  99. BEQ NODAMPTN ; (IF = 0, THEN *HE* IS THRUSTING)
  100. DAMPTN:
  101. LDA #$11 ;DAMP THRUST TUNE
  102. JSR KILLTUNE ; (GET RID OF THE TUNE)
  103. NODAMPTN:
  104. LDA PLAYER
  105. ASL
  106. ASL
  107. TAY
  108. LDA #$00
  109. STA SOFTCOLR+1,Y
  110. JSR DAMPX
  111. JSR DAMPY
  112. * CHECK THE FIRE BUTTON
  113. CHKFIRE:
  114. LDX PLAYER
  115. LDA FIREBUT1,X
  116. BMI FRESET
  117. LDA FIRESTAT,X
  118. BNE JOYBYE
  119. JMP DNSHOT
  120. FRESET:
  121. LDA #0
  122. STA FIRESTAT,X
  123. JOYBYE:
  124. RTS
  125. * ADD THRUST ROUTINE
  126. ADDTHRST:
  127. LDA #$11 ;ADD THRUST SOUND
  128. JSR DOTUNE2 ;ONLY IF NOT ALREADY PLAYING
  129. LDA PLAYER ;CHANGE COLOR OF THRUST FLAME
  130. ASL
  131. ASL
  132. TAY
  133. LDA #$4F
  134. STA SOFTCOLR+1,Y
  135. LDX PLAYER
  136. LDA SHIPDIR,X
  137. LSR
  138. LSR
  139. LSR
  140. LSR
  141. TAY
  142. LDX OFFPLAY2
  143. LDA XVELL+24,X
  144. STA TEMP+1
  145. LDA XVELH+24,X
  146. LSR
  147. ROR TEMP+1
  148. LSR
  149. ROR TEMP+1
  150. LSR
  151. ROR TEMP+1
  152. LSR
  153. ROR TEMP+1
  154. LDA YVELL+24,X
  155. STA TEMP+2
  156. LDA YVELH+24,X
  157. LSR
  158. ROR TEMP+2
  159. LSR
  160. ROR TEMP+2
  161. LSR
  162. ROR TEMP+2
  163. LSR
  164. ROR TEMP+2
  165. XTHRUST:
  166. LDA MAXVECT,Y
  167. BPL POSOXVEL
  168. NEGOXVEL:
  169. LDX TEMP+1
  170. BPL ADDXVEL
  171. CMP TEMP+1
  172. BCC ADDXVEL
  173. BCS DODAMPX
  174. POSOXVEL:
  175. LDX TEMP+1
  176. BMI ADDXVEL
  177. CMP TEMP+1
  178. BCS ADDXVEL
  179. DODAMPX:
  180. JSR DAMPX
  181. JMP YTHRUST
  182. ADDXVEL:
  183. LDA UNITVECT,Y
  184. ASL
  185. ASL
  186. ASL
  187. LDX OFFPLAY2
  188. CLC
  189. ADC XVELL+24,X
  190. STA XVELL+24,X
  191. LDA XVELH+24,X
  192. ADC HUNTVECT,Y
  193. STA XVELH+24,X
  194. YTHRUST:
  195. TYA
  196. CLC
  197. ADC #$10
  198. TAY
  199. LDA MAXVECT,Y
  200. BPL POSOYVEL
  201. NEGOYVEL:
  202. LDX TEMP+2
  203. BPL ADDYVEL
  204. CMP TEMP+2
  205. BCC ADDYVEL
  206. BCS DODAMPY
  207. POSOYVEL:
  208. LDX TEMP+2
  209. BMI ADDYVEL
  210. CMP TEMP+2
  211. BCS ADDYVEL
  212. DODAMPY:
  213. JSR DAMPY
  214. JMP CHKFIRE
  215. ADDYVEL:
  216. LDA UNITVECT,Y
  217. ASL
  218. ASL
  219. ASL
  220. LDX OFFPLAY2
  221. CLC
  222. ADC YVELL+24,X
  223. STA YVELL+24,X
  224. LDA YVELH+24,X
  225. ADC HUNTVECT,Y
  226. STA YVELH+24,X
  227. JMP CHKFIRE
  228. DNSHOT:
  229. LDA MODE
  230. CMP #1 ;MODE - 1
  231. BPL TDNSHOT ;MODES 1 AND 2 USE TDNSHOT
  232. LDX #3
  233. NEXTSHOT:
  234. LDA STATUS+28,X
  235. BMI THISSHOT
  236. DEX
  237. BPL NEXTSHOT
  238. RTS
  239. TDNSHOT:
  240. LDX PLAYER ;ALLOW 2 SHOTS PER
  241. BEQ TPLAY1 ;PLAYER1 GETS 0 & 1
  242. LDX #2 ;PLAYER2 GETS 2 & 3
  243. TPLAY1:
  244. LDA STATUS+28,X
  245. BMI THISSHOT
  246. INX
  247. LDA STATUS+28,X
  248. BMI THISSHOT
  249. RTS
  250. THISSHOT:
  251. LDY PLAYER
  252. LDA SHIPDIR,Y
  253. LSR
  254. LSR
  255. LSR
  256. LSR
  257. TAY
  258. LDA #SHOT
  259. STA STATUS+28,X
  260. LDA #$EC
  261. STA SHOTCNT+2,X
  262. STX TEMP ;SAVE X
  263. LDX OFFPLAY2
  264. LDA XPOSH+24,X
  265. LDX TEMP ;RESTORE
  266. CLC
  267. ADC SHNOSEX,Y
  268. CMP #XPOSMAX
  269. BCC SHXOK
  270. SBC #XPOSMAX
  271. SHXOK:
  272. STA XPOSH+28,X
  273. LDX OFFPLAY2
  274. LDA YPOSH+24,X
  275. LDX TEMP ;RESTORE
  276. CLC
  277. ADC SHNOSEY,Y
  278. CMP #YPOSMAX
  279. BCC SHYOK
  280. SBC #YPOSMAX
  281. SHYOK:
  282. STA YPOSH+28,X
  283. LDX OFFPLAY2
  284. LDA XPOSL+24,X
  285. LDX TEMP
  286. STA XPOSL+28,X
  287. LDX OFFPLAY2
  288. LDA YPOSL+24,X
  289. LDX TEMP
  290. STA YPOSL+28,X
  291. LDA UNITVCTX,Y
  292. LDX OFFPLAY2
  293. CLC
  294. ADC XVELH+24,X
  295. LDX TEMP
  296. STA XVELH+28,X
  297. LDX OFFPLAY2
  298. LDA XVELL+24,X
  299. LDX TEMP
  300. STA XVELL+28,X
  301. LDA UNITVCTY,Y
  302. LDX OFFPLAY2
  303. CLC
  304. ADC YVELH+24,X
  305. LDX TEMP
  306. STA YVELH+28,X
  307. LDX OFFPLAY2
  308. LDA YVELL+24,X
  309. LDX TEMP
  310. STA YVELL+28,X
  311. LDA #$0E ;LOAD SOUND FOR HERO SHOTS
  312. JSR DOTUNE1
  313. LDX PLAYER
  314. LDA #1
  315. STA FIRESTAT,X
  316. RTS
  317. HYPERSPC:
  318. LDX PLAYER ;WHICH PLAYER
  319. LDA STATE,X ;STATE OF PLAYER
  320. BNE NOHYPER ;IF OK THEN CONTINUE
  321. LDA #2 ;STATE FOR HYPERSPACE
  322. STA STATE,X
  323. LDA #$2C ;$29+3
  324. STA TIMER,X
  325. NOHYPER:
  326. RTS
  327. DAMPX:
  328. LDX OFFPLAY2
  329. LDA XVELL+24,X ;IS VELOCITY ALREADY ZERO?
  330. ORA XVELH+24,X ; (LOW *OR* HIGH IS CHEAP MAGNITUDE)
  331. BEQ DAMPXRTS ;YES: NO DAMPING NEEDED
  332. ;COMPUTE XVEL * 3/256
  333. LDA XVELL+24,X ;FIRST COMPUTE XVEL/128
  334. ASL
  335. STA TEMP+1
  336. LDA XVELH+24,X
  337. ROL ;ROL IN THE CARRY BIT
  338. STA TEMP
  339. LDA XVELL+24,X ;THEN ADD IN XVEL / 256
  340. CLC
  341. ADC TEMP+1
  342. STA TEMP+1
  343. LDA XVELH+24,X
  344. BPL XHPOS
  345. INC XVELH+24,X ;BORROW TO CORRECT SBC #0 BELOW
  346. XHPOS:
  347. ADC TEMP
  348. STA TEMP
  349. LDX PLAYER
  350. LDA XVELLL,X ;ADJUST THE "NOISE" BYTE
  351. SEC
  352. SBC TEMP+1
  353. STA XVELLL,X
  354. LDX OFFPLAY2
  355. LDA XVELL+24,X
  356. SBC TEMP
  357. STA XVELL+24,X
  358. LDA XVELH+24,X
  359. SBC #0
  360. STA XVELH+24,X
  361. LDA #0
  362. STA CLAMP
  363. LDA XVELH+24,X ;CLAMP OFF TO STOP DRIFT
  364. BEQ ZCKPOSX
  365. CLC
  366. ADC #1
  367. BNE DAMPXRTS
  368. LDA XVELL+24,X ;ZCKMINX
  369. CMP #(0-$20) & 255
  370. BCC DAMPXRTS
  371. BCS ZSETX0
  372. ZCKPOSX:
  373. LDA XVELL+24,X
  374. CMP #$20
  375. BCS DAMPXRTS
  376. ZSETX0:
  377. LDA #1
  378. STA CLAMP
  379. DAMPXRTS:
  380. RTS
  381. DAMPY:
  382. LDX OFFPLAY2
  383. LDA YVELL+24,X ;IS VELOCITY ALREADY ZERO?
  384. ORA YVELH+24,X ; (LOW *OR* HIGH IS CHEAP MAGNITUDE)
  385. BEQ DAMPYRTS ;YES: NO DAMPING NEEDED
  386. ;COMPUTE YVEL * 3/256
  387. LDA YVELL+24,X ;FIRST COMPUTE YVEL/128
  388. ASL
  389. STA TEMP+1
  390. LDA YVELH+24,X
  391. ROL ;ROL IN THE CARRY BIT
  392. STA TEMP
  393. LDA YVELL+24,X ;THEN ADD IN YVEL / 256
  394. CLC
  395. ADC TEMP+1
  396. STA TEMP+1
  397. LDA YVELH+24,X
  398. BPL YHPOS
  399. INC YVELH+24,X ;BORROW TO CORRECT SBC #0 BELOW
  400. YHPOS:
  401. ADC TEMP
  402. STA TEMP
  403. LDX PLAYER
  404. LDA YVELLL,X ;ADJUST THE "NOISE" BYTE
  405. SEC
  406. SBC TEMP+1
  407. STA YVELLL,X
  408. LDX OFFPLAY2
  409. LDA YVELL+24,X
  410. SBC TEMP
  411. STA YVELL+24,X
  412. LDA YVELH+24,X
  413. SBC #0
  414. STA YVELH+24,X
  415. LDA YVELH+24,X ;CLAMP OFF TO STOP DRIFT
  416. BEQ ZCKPOSY
  417. CLC
  418. ADC #1
  419. BNE DAMPYRTS
  420. LDA YVELL+24,X ;ZCKMINX
  421. CMP #(0-$20) & 255
  422. BCC DAMPYRTS
  423. BCS ZSETY0
  424. ZCKPOSY:
  425. LDA YVELL+24,X
  426. CMP #$20
  427. BCS DAMPYRTS
  428. ZSETY0:
  429. LDA CLAMP
  430. BEQ DAMPYRTS
  431. LDA #0
  432. STA XVELL+24,X
  433. STA XVELH+24,X
  434. STA YVELL+24,X
  435. STA YVELH+24,X
  436. DAMPYRTS:
  437. RTS
  438. ** ROUTINE TO CHECK THE JOYSTICK AND UPDATE SOFTWARE REGISTERS. **
  439. CKJOY:
  440. LDA SWCHA ;GET VALUES FROM TIA
  441. STA SWCHAVAL ;STORE IN SOFT REGISTERS
  442. LDX #1 ;DO PLAYERS 1 AND 0
  443. ZNXTRJ:
  444. JSR READJOY ;READ HIS JOYSTICK
  445. DEX
  446. BPL ZNXTRJ
  447. LDA FIREBUT1 ;PLAYER 0 FIRE BUTTON IS STARTBUT
  448. STA STARTBUT
  449. LDA GAMSTATE ;CHECK IF IN AUTO PLAY STATE
  450. CMP #AUTOST
  451. BNE CKJOYRTS ;NO. DON'T DO RANDOM VIOLENCE
  452. PICKJOY:
  453. LDA #$FF ;CLEAR ALL BUTTONS
  454. STA FIREBUT1
  455. STA FIREBUT2
  456. STA HYPBUT1
  457. STA HYPBUT2
  458. LDA FRMCNT ;DON'T ALWAYS DO
  459. AND #$0C
  460. BNE CKJOYRTS
  461. LDA FRMCNT ;ALTERNATE FIRING
  462. LSR
  463. AND #1
  464. TAX
  465. LDA #$7F
  466. STA FIREBUT1,X
  467. JSR NEWRAND ;RANDOM SHIP MOVEMENT
  468. AND #$07
  469. TAX
  470. LDA JOYVALS,X
  471. STA SWCHAVAL
  472. CKJOYRTS:
  473. RTS
  474. * READJOY: READ JOYSTICK/BUTTONS. ON ENTRY X = PLAYER. Y IS TRASHED
  475. READJOY:
  476. LDY INPT4,X
  477. BPL GOTONE ;IF BIT 7 IS LO, OLD-STYLE BUTTON HIT
  478. LDA ONEBUT ;ARE WE ALREADY IN OLD-STYLE MODE?
  479. AND RJBITS,X
  480. BNE GOTONE2 ;YES. GO RIGHT TO ONE-BUTTON HANDLER.
  481. TXA ;OTHERWISE, COMPUTE INDEX INTO
  482. ASL ; PADDLE PORTS, FOR PLAYER X,
  483. TAY ; IN Y (X * 2)
  484. LDA INPT4A,Y ;READ LEFT BUTTON
  485. EOR #$FF ;INVERT THE SENSE!
  486. STA FIREBUT1,X
  487. LDA INPT4B,Y ; RIGHT BUTTON
  488. EOR #$FF
  489. RJSTOREH:
  490. STA HYPBUT1,X
  491. RJRTS:
  492. RTS
  493. ;HERE ON OLD-STYLE SINGLE BUTTON JOYSTICK PRESS.
  494. GOTONE:
  495. LDA ONEBUT ;TURN OFF TWO-PLAYER BIT IMMEDIATELY
  496. ORA RJBITS,X ; TO AVOID BURNING OUT HARDWARE
  497. STA SWCHB
  498. STA ONEBUT ;SAVE THE NEW VALUE
  499. GOTONE2:
  500. STY FIREBUT1,X ;Y CONTAINS CONTENTS OF INPT4 NOW
  501. LDA #$FF
  502. STA HYPBUT1,X ;CLEAR HYPERSPACE BUTTON
  503. LDA SWCHAVAL ;CHECK JOYSTICK REGISTER
  504. AND JOYTBL,X ; FOR THIS PLAYER'S
  505. CMP RJSBITS,X ; HYPERSPACE BIT
  506. BNE RJRTS ;IF BIT NOT LO, THEN NO HYPERSPACE
  507. LDA #$7F ;OTHERWISE, SET THE BIT LO
  508. BNE RJSTOREH ;BNE = JMP
  509. RJBITS:
  510. .DC.B $04,$10 ;TWO-PLAYER MODE BITS PER PLAYER
  511. RJSBITS:
  512. .DC.B $D0,$0D ;SOUTH JOYSTICK BITS PER PLAYER
  513. THRBITS:
  514. .DC.B $01,$10 ;NORTH BITS PER *OTHER* PLAYER
  515. JOYVALS:
  516. .DC.B $7F,$BF,$EF,$F7,$FB,$FE,$FF,$EE ;AUTOPLAY JOYSTICK VALUES