UTILS.S 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. * 1850 030784
  2. *
  3. ** UTILS.S *
  4. ** ASTEROIDS FOR THE ATARI 3600 **
  5. ** THIS FILE CONTAINS UTILITY PROGRAMS. **
  6. *
  7. ** PRESENTLY CONTAINS -
  8. *
  9. * GAME PLAY LOOP *
  10. * DIFFICULTY LEVEL INC ROUTINE *
  11. * RANDOM NUMBER ROUTINES *
  12. * SAFETY BOX CHECK ROUTINE *
  13. * FLIP PLAYER ROUTINE *
  14. * STAR TWINKLER *
  15. * ICON SETUP ROUTINE *
  16. * PAINT SHIP ROUTINE *
  17. * WAIT FOR LOADER ROUTINE *
  18. *
  19. ** BASIC GAME PLAY LOOP. **
  20. GAMELOOP:
  21. ;SET DIFFICULTY LEVELS
  22. LDX PLAYER
  23. LDA LEVEL,X
  24. STA MINYVEL ;SET MINYVEL AND MINXVEL
  25. LSR
  26. STA MINXVEL
  27. LDA ROCKTOT,X ;CONTINUE UNTIL ROCKTOT = 0
  28. BNE GAMEPLAY
  29. LDA STATUS+25 ;WAIT FOR UFO TO LEAVE BEFORE NEW RACK
  30. CMP #$FF ;FF = NON-EXISTANT
  31. BNE GAMEPLAY ;IF HE EXISTS, JUST WAIT IN GAMEPLAY
  32. LDA STATE ;IF EITHER PLAYER IS IN STATE 0 OR 1
  33. AND STATE+1 ; (THAT IS, OK OR BIRTH)
  34. CMP #2 ; THEN THIS 'AND' WILL BE LESS THAN 2
  35. BCS GAMEPLAY ; IF IT ISN'T, THEN WAIT IN GAMEPLAY
  36. LDA MODE
  37. BNE ZDECRDLY ;IN TWO PLAYER, DON'T CREATE ROCKS
  38. LDY OFFPLAY2 ; IF CURRENT PLAYER IS DEAD, SO AS
  39. LDA STATUS+24,Y ; NOT TO CREATE ROCKS AND IMMEDIATELY
  40. BMI GAMEPLAY ; SWITCH THEM OUT.
  41. ZDECRDLY:
  42. DEC RACKDLY ;DON'T DO NEW RACK 'TILL DLY OVER
  43. BPL GAMEPLAY ;LET THE SHOW GO ON !
  44. LDA #RACKDLYC ;PRIME TIMER FOR NEXT RACK
  45. STA RACKDLY
  46. INC RACKNUM,X ;WHEN =0 NEW RACK
  47. LDA RACKNUM,X ;SET NUM OF ROCKS TO BE RACKNUM
  48. CLC
  49. ADC #2 ; PLUS TW0
  50. ADC DIFF ; PLUS DIFF (NOVICE=0,EXPERT=3)
  51. STA ROCKTOT,X
  52. LDY DIFF ;DETERMINE MAX NUMBER OF ROCKS
  53. LDA MAXROCKS,Y
  54. CMP ROCKTOT,X ; UP TO A MAXIMUM
  55. BCS NEWRACK
  56. STA ROCKTOT,X
  57. NEWRACK:
  58. STA STARTNUM,X
  59. JSR LOADSTAR ;LOAD STARS INTO DISPLAY HEADERS.
  60. LDA #1 ;TYPE 1 INCREMENT FOR RACK
  61. JSR INCLVL
  62. LDA #$50 ;5.2 SEC COUNTER FOR UFO
  63. STA RTIMER
  64. LDX DIFF
  65. LDA UTIMES,X ;UFO
  66. LDX PLAYER
  67. SEC
  68. SBC RACKNUM,X
  69. SBC RACKNUM,X
  70. SBC RACKNUM,X
  71. STA SDELAY
  72. STA EDELAY
  73. LDA #9
  74. STA UFOACC ;SET ACCURACY DOWN TO MINIMUM
  75. LDA #$28 ;INITIALIZE UFO SHOT COUNTDOWN
  76. STA USHOTCNT
  77. JSR INITHUMP ;RESET THE HUMP RATE.
  78. JSR INITROCK ;INITIALIZE THE ROCKS
  79. GAMEPLAY:
  80. JSR FSM ;FINITE STATE MACHINE
  81. JSR JOY ;EXECUTE JOYSTICK INPUTS
  82. LDA MODE ;REPEAT FOR TEAM PLAY MODES
  83. CMP #1
  84. BMI NOTEAM
  85. JSR FLIPPLAY ;FLIP PLAYER
  86. JSR FSM ;REPEAT FOR OTHER PLAYER
  87. JSR JOY
  88. JSR FLIPPLAY
  89. NOTEAM:
  90. JSR ROCKMOVE ;UPDATE OBJECT MOVEMENT
  91. JSR SHOTMOVE ;UPDATE SHOT MOVEMENT
  92. JSR COLLIDE ;CHECK COLLISIONS
  93. JSR EXPLODE ;CHECK EXPLOSIONS
  94. JSR UFO ;UPDATE UFO
  95. JSR BACKSNDS ;ADD BACKGROUND SOUNDS
  96. RTS
  97. MAXROCKS:
  98. .DC.B 8,12,14,16 ;MAX NUM ROCKS FOR EACH DIFF
  99. UTIMES:
  100. .DC.B 0,$A7,$95,$8F
  101. ** DIFFICULTY LEVEL INCREMENT ROUTINE **
  102. ** CALLED WITH TYPE OF INCREMENT IN AC, TRASHES Y **
  103. ** TYPES: 0 = POINTS, 1 = RACKS, 2 = MR. BILL, 3 = SLUGGO **
  104. INCLVL:
  105. TAY
  106. LDA LVLINC,Y
  107. LDY PLAYER
  108. CLC
  109. ADC LEVEL,Y
  110. CMP MAXLVL ;THERE IS ONLY ONE MAX FOR BOTH PLAYERS
  111. BCC LVLOK
  112. LDA MAXLVL
  113. LVLOK:
  114. STA LEVEL,Y
  115. RTS
  116. ** RANDOM NUMBER ROUTINES, >NOT< PREVIOUSLY IN RANDOM.S **
  117. * NEWRAND: A WHOLESOME RANDOM NUMBER JENERATER FROM KNUTH (NOTABLE PEDIGREE)
  118. NEWRAND:
  119. LDY RANDPTR0 ;LOAD Y WITH CONTENTS OF RANDPTR0
  120. LDA RAND,Y ;LOAD AC WITH RAND INDEXED BY Y
  121. CLC ;CLEAR THE CARRY
  122. LDY RANDPTR1 ;LOAD Y WITH CONTENTS OF RANDPTR1
  123. ADC RAND,Y ;ADD RAND INDEXED BY Y TO AC
  124. LDY RANDPTR0 ;GET THE DRIFT?
  125. STA RAND,Y
  126. DEC RANDPTR0
  127. BPL ZR1
  128. LDY #54
  129. STY RANDPTR0
  130. ZR1:
  131. DEC RANDPTR1
  132. BPL ZR2
  133. LDY #54
  134. STY RANDPTR1
  135. ZR2:
  136. RTS
  137. RANDPOS:
  138. JSR NEWRAND
  139. LSR
  140. BCC HBORDER
  141. LDA #YPOSMAX
  142. STA YPOSH,X
  143. XRANDLOP:
  144. JSR NEWRAND
  145. CMP #XPOSMAX-6
  146. BCS XRANDLOP
  147. STA XPOSH,X
  148. RTS
  149. HBORDER:
  150. LDA #XPOSMAX
  151. STA XPOSH,X
  152. YRANDLOP:
  153. JSR NEWRAND
  154. CMP #YPOSMAX
  155. BCS YRANDLOP
  156. STA YPOSH,X
  157. RTS
  158. RANDVEL:
  159. JSR NEWRAND
  160. ROL ;USE SIGN BIT FOR DIRECTION (L OR R)
  161. BCC RNDVXPOS ;X VELOCITY IS POSITIVE
  162. SBC MINXVEL ;ADD IN MINIMUM VELOCITY
  163. STA XVELL,X
  164. LDA #$FF ;VELOCITY IS NEGATIVE
  165. SBC #0 ;TAKE AWAY THE BORROW, IF ANY
  166. STA XVELH,X
  167. BCS RANDVY ;UNCOND. BRANCH
  168. RNDVXPOS:
  169. ADC MINXVEL ;ADD IN MINIMUM VELOCITY
  170. STA XVELL,X
  171. LDA #0
  172. ROL ;ROL IN THE CARRY, IF ANY
  173. STA XVELH,X
  174. RANDVY:
  175. JSR NEWRAND
  176. ROL
  177. BCC RNDVYPOS
  178. SBC MINYVEL
  179. STA YVELL,X
  180. LDA #$FF
  181. SBC #0
  182. STA YVELH,X
  183. BCS RANDVRTS
  184. RNDVYPOS:
  185. ADC MINYVEL
  186. STA YVELL,X
  187. LDA #0
  188. ROL
  189. STA YVELH,X
  190. RANDVRTS:
  191. RTS
  192. * CHECK IF ANY OBJECT IS IN SAFETY BOX.
  193. * RETURNS WITH ZERO (Z) BIT SET IF ALL IS CLEAR.
  194. * WE DON'T WORRY ABOUT CARRIES (LOW PRECISION).
  195. * DESTROYS: X, Y, AND FIRST 7 BYTES OF TEMP
  196. * TEMP LAYOUT: TEMP X (OBJECT INDEX)
  197. * TEMP+1 BOXR (RIGHT HAND BOUNDARY)
  198. * TEMP+2 BOXL (LEFT HAND BOUNDARY)
  199. * TEMP+3 BOXTOP (TOP BOUNDARY)
  200. * TEMP+4 BOXBOT (BOTTOM BOUNDARY)
  201. * TEMP+5 X WRAP FLAG (1 = WRAP)
  202. * TEMP+6 Y WRAP FLAG (1 = WRAP)
  203. ISSAFE:
  204. STX TEMP ;SAVE X WHERE IT MAY BE COMPARED TO Y
  205. LDA #0 ;0 MEANS "NO WRAP OF BOX"
  206. STA TEMP+5
  207. STA TEMP+6
  208. LDA XPOSH,X ;CHECK RIGHT HAND SIDE OF BOX.
  209. ADC BOXWIDTH ; (SHOULD CLC HERE....)
  210. STA TEMP+1 ;BOXR
  211. SBC #XPOSMAX ;CHECK FOR WRAPAROUND.
  212. BCC BOXROK ; BOX'S RIGHT HAND SIDE: NO WRAP.
  213. INC TEMP+5 ; YES WRAP: SET FLAG
  214. STA TEMP+1
  215. BOXROK:
  216. LDA XPOSH,X ;CHECK LEFT HAND SIDE OF BOX.
  217. SBC BOXWIDTH
  218. BCS BOXLOK ;CHECK FOR WRAPAROUND.
  219. INC TEMP+5 ; YES WRAP: SET FLAG
  220. ADC #XPOSMAX ; MOD INTO RANGE
  221. BOXLOK:
  222. STA TEMP+2 ; AND SAVE IT (BOXL).
  223. LDA YPOSH,X ;CHECK TOP OF BOX.
  224. ADC BOXHIGHT
  225. STA TEMP+3
  226. SBC #YPOSMAX
  227. BCC BOXTOK
  228. INC TEMP+6
  229. STA TEMP+3
  230. BOXTOK:
  231. LDA YPOSH,X ;CHECK BOTTOM OF BOX.
  232. SBC BOXHIGHT
  233. BCS BOXBOK
  234. INC TEMP+6
  235. ADC #YPOSMAX
  236. BOXBOK:
  237. STA TEMP+4
  238. LDX #32 ;START WITH LAST OBJECT (#32)
  239. NEXTSAFE:
  240. LDA STATUS,X ;CHECK ITS STATUS:
  241. BMI SAFEOK ; IF OBJECT DOESN'T EXIST, IT IS SAFE.
  242. ;FIRST CHECK X COORDS
  243. LDA #0 ;CLEAR OUT COMPARISON REGISTER "A"
  244. LDY XPOSH,X ;GET OBJECT X'S HORIZ. POSITION
  245. CPY TEMP+1 ;COMPARE TO BOXR
  246. ROL ;ROL BIT INTO A
  247. CPY TEMP+2 ;COMPARE TO BOXL
  248. ADC #0 ;ADD BIT INTO A
  249. EOR TEMP+5 ;FLIP LOW BIT WITH X WRAP BIT
  250. ROR ;ROR BIT INTO CARRY
  251. BCC SAFEOK ;NO BIT MEANS SAFE (OUTSIDE OF BOX).
  252. ;THEN CHECK Y COORDS
  253. LDA #0
  254. LDY YPOSH,X
  255. CPY TEMP+3
  256. ROL
  257. CPY TEMP+4
  258. ADC #0
  259. EOR TEMP+6
  260. ROR
  261. BCC SAFEOK
  262. ;FINALLY, CHECK IF IT IS THE OBJECT SPECIFIED ITSELF.
  263. CPX TEMP
  264. BEQ SAFEOK
  265. ;OBJECT IN BOX! UNSAFE TO ENTER!
  266. ; LDY #1 ;CLEAR Z BIT TO SIGNIFY NOT CLEAR.
  267. ;NOT NEEDED (BEQ ABOVE)
  268. RTS
  269. SAFEOK:
  270. DEX ;GET NEXT OBJECT
  271. BPL NEXTSAFE ;AND CONTINUE CHECKING
  272. LDY #0 ;SET Z BIT TO SIGNIFY ALL CLEAR.
  273. RTS
  274. BOXWIDTH:
  275. .DC.B $10
  276. BOXHIGHT:
  277. .DC.B $1A
  278. * ROUTINE TO PUT UP SCORES. WHATEVER IS IN PLAYER OR HIGH SCORES GOES. *
  279. DOSCORE:
  280. JSR CLSCORE ;ERASE ALL SCORES FIRST
  281. JSR PUTHISCR ;HIGH SCORE UP
  282. LDA MODE
  283. CMP #1 ;COMBINED SCORE
  284. BNE ZPLRSCOR
  285. LDA #2
  286. STA SCORER
  287. JSR PUTSCORE
  288. JSR PUTMEN
  289. LDA #0
  290. STA SCORER
  291. JSR PUTSCORE
  292. LDA #1
  293. STA SCORER
  294. JSR PUTSCORE
  295. RTS
  296. ZPLRSCOR:
  297. LDA #0
  298. STA SCORER
  299. JSR PUTSCORE ;PLAYER 1 SCORE UP
  300. JSR PUTMEN
  301. LDA MODE
  302. BMI NOP2SCOR
  303. LDA #1
  304. STA SCORER
  305. JSR PUTSCORE ;PLAYER 2 SCORE UP
  306. JSR PUTMEN
  307. NOP2SCOR:
  308. RTS
  309. * ROUTINE TO ERASE SCORES. *
  310. CLSCORE:
  311. LDX #56 ;CLEAR MAPS
  312. LDA #0
  313. ZCLRLOOP:
  314. STA CHARMAPS,X
  315. DEX
  316. BPLOP:
  317. BPL ZCLRLOOP ;LABLED TO ACCESS BPL OPCODE ($10)
  318. RTS
  319. ** ROUTINE USED IN GAME LOOP TO TOGGLE PLAYER BACK AND FORTH. **
  320. FLIPPLAY:
  321. LDA PLAYER ;CHANGE PLAYER
  322. EOR #1
  323. STA PLAYER
  324. BEQ STOROFF ;ESTABLISH DATA OFFSET
  325. LDA #8 ;SECOND PLAYER POINTS TO END
  326. STOROFF:
  327. STA OFFPLAY2
  328. RTS
  329. * ROTATE THROUGH THE COLORS TO TWINKLE THE STARS.
  330. TWINKLE:
  331. JSR NEWRAND ;DECIDE WHICH STARS TO TW'INC'LE
  332. LSR
  333. BCC NOINC2
  334. LSR
  335. BCC NOINC2
  336. INC SOFTCOLR+14
  337. NOINC2:
  338. LSR
  339. BCC LOGODO
  340. LSR
  341. BCC LOGODO
  342. INC SOFTCOLR+15
  343. LOGODO:
  344. LDA GAMSTATE ;DON'T DO LOGOBARS WHILE PLAYING
  345. CMP #PLAYST
  346. BEQ LOGORTS
  347. CMP #AUTOST
  348. BEQ LOGORTS
  349. LOGOBARS:
  350. LDA FRMCNT ;DO IT ONLY ON EVEN FRAMES
  351. LSR
  352. BCS LOGORTS
  353. INC TEMP+11 ;MOVE THIS!!
  354. LDA TEMP+11
  355. BIT BPLOP ;(BPLOP: OPCODE $10 IS BPL)
  356. BNE LOGOGO
  357. EOR #$1F
  358. LOGOGO:
  359. STA SOFTCOLR+10 ;UPDATE HARDWARE REGISTER
  360. LOGORTS:
  361. RTS
  362. * SET UP AN ICON:
  363. * ON ENTRY: Y SHOULD CONTAIN ICON NUMBER
  364. * X SHOULD CONTAIN INDEX NUMBER OF NEW OBJECT
  365. DOICON:
  366. LDA ICONACYC,Y
  367. STA ACYC,X
  368. LDA ICONXPOS,Y
  369. STA XPOSH,X
  370. LDA ICONYPOS,Y
  371. STA YPOSH,X
  372. LDA ICONPALS,Y
  373. STA PALS,X
  374. LDA #ICON
  375. CPY #22 ;ICONS > 22 ARE SHIPS
  376. BCC ZISICON
  377. LDA #SHIP
  378. ZISICON:
  379. STA STATUS,X
  380. RTS
  381. * PAINTSHP -- PAINT THE SHIP, BODY AND DEJAG AND FLAME COLORS
  382. * ARGUMENTS: X CONTAINS THE PLAYER TO PAINT
  383. * A CONTAINS THE DESIRED LUME OF THE BODY
  384. PAINTSHP:
  385. AND #$0F ;KNOCK OFF EXTRANEOUS BITS
  386. ORA BODYHUES,X ;OR IN THE CORRECT BODY HUE
  387. PHA ;PUSH BODY COLOR
  388. LSR ;LOWER INTENSITY FOR DEJAG LUME
  389. AND #$07 ;KNOCK OFF EXTRANEOUS BITS
  390. ORA BODYHUES,X ;OR IN THE CORRECT BODY HUE
  391. CPX #0 ;WHICH PLAYER?
  392. BEQ ZPAINTGO ;FOR 1ST PLAYER, USE 1ST PALETTE
  393. LDX #4 ;FOR 2ND PLAYER, USE 2ND PALETTE
  394. ZPAINTGO:
  395. STA SOFTCOLR+3,X ;STORE DEJAG COLOR
  396. PLA ;PULL BODY COLOR
  397. STA SOFTCOLR+2,X ;STORE BODY COLOR
  398. LDA #0 ;TURN OFF SHIP'S THRUST FLAME
  399. STA SOFTCOLR+1,X
  400. RTS
  401. * REFRESH COLOR RAM, UPPER 4 PALETTES FROM ROM, LOWER 4 FROM RAM
  402. REFRESH:
  403. LDX #$1F
  404. ZEFRESH:
  405. LDA COLORS,X
  406. STA BACKGRND,X
  407. DEX
  408. LDA COLORS,X
  409. STA BACKGRND,X
  410. DEX
  411. LDA COLORS,X
  412. STA BACKGRND,X
  413. DEX
  414. DEX ;SKIP OVER OTHER HARDWARE REGISTERS
  415. CPX #$10 ;$10 - $1F FROM ROM (COLORS)
  416. BCS ZEFRESH
  417. * NOW DO RAM PART:
  418. Z2FRESH:
  419. LDA SOFTCOLR,X
  420. STA BACKGRND,X
  421. DEX
  422. LDA SOFTCOLR,X
  423. STA BACKGRND,X
  424. DEX
  425. LDA SOFTCOLR,X
  426. STA BACKGRND,X
  427. DEX
  428. DEX ;SKIP OVER OTHER HARDWARE REGISTERS
  429. BPL Z2FRESH
  430. INX ;$FF + 1 = $00
  431. STX BACKGRND ;FORCE BLACK BACKGROUND
  432. RTS
  433. WAITLOAD:
  434. LDA #1 ;SET LOAD FLAG
  435. STA LOADFLAG
  436. ZWAIT:
  437. LDA LOADFLAG ;WAIT FOR LOADER TO FINISH
  438. BEQ ZWRTS ;IF LOADER FINISHED THEN RTS
  439. BIT MSTAT ;IF OFF SCREEN FORCE LOAD
  440. BPL ZWAIT
  441. BIT MSTAT ;PROTECTION
  442. BPL ZWAIT
  443. JSR REFRESH ;MAKE SURE COLORS ARE RIGHT FIRST
  444. JSR LOADER
  445. ZWRTS:
  446. RTS