MAIN.S 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. * 2100 030784
  2. *
  3. *
  4. ** MAIN.S **
  5. ** ASTEROIDS FOR THE ATARI 3600 *
  6. ** THIS FILE CONTAINS THE MAIN DRIVER. **
  7. .ORG $D000 ;MUST BE ON ODD (BLANK HOLY DMA) 4K PAG
  8. CODE:
  9. ASTEROID:
  10. SEI ;AND AWAY WE GO.....
  11. CLD
  12. LDA #$13 ;LOCK INTO MARIA MODE, base unit rom
  13. ; *AND* DISCHARGE PADDLE INPUT CAPS
  14. STA PTCTRL ;STORE TO INPTCTRL
  15. LDX #$FF ;SET UP THE STACK POINTER
  16. TXS
  17. LDX #$60
  18. STX CTRL ;OFF DMA
  19. LDA #$14 ;SET JOYSTICK DIRECTION REGISTER
  20. STA CTLSWB ;TO SELECT TWO BUTTON MODE
  21. LDA #0
  22. STA BACKGRND ;BLACK BACKGROUND
  23. STA OFFSET ;FOR FUTURE EXPANSION
  24. STA SWCHB ;SELECT TWO BUTTON MODE
  25. ;
  26. JSR ZERORAM ;ZERO OUT RAM
  27. LDA INTIM ;SEED RANDOM PTRS FROM TIMER
  28. AND #31 ; ROUGHLY RANGE IT (NOTE: PTR1 MAY GO
  29. STA RANDPTR0 ; OUT OF RANGE HERE, BUT IT'S OK AS
  30. CLC ; LONG AS PTR0 DOESN'T GO OUT OF RANGE)
  31. ADC #31 ;31 IS A GOOD NUMBER FOR THIS
  32. STA RANDPTR1
  33. LDX #54 ;DROP SOME CODE IN TO INIT RAND ARRAY
  34. DROPCODE:
  35. LDA CODE,X ;CODE IS PRETTY RANDOM.
  36. STA RAND,X ;AT LEAST OURS IS.
  37. DEX
  38. BPL DROPCODE
  39. LDA #1 ;SET UP MODE/DIFF
  40. STA DIFF
  41. STX MODE
  42. *
  43. JSR HSCSUCK ;SUCK IN HIGH SCORE, IF POSSIBLE
  44. JSR INITSCOR ;INITIALIZE SCORES
  45. JSR LOADSTAR
  46. LDA #$00 ;UNLOCK DISCHARGE TRANSISTOR FROM
  47. STA $0001 ; PADDLE INPUT CAPS.
  48. LDA #TITLEST ;INITIALIZE GAME STATE
  49. ;FALL THROUGH INTO....
  50. * PROGRAM DRIVER STATE CHANGER: JMP HERE WITH NEW GAME STATE IN AC.
  51. NEWDRVR:
  52. STA GAMSTATE
  53. LDX #$FF ;MASH OUT THE STACK POINTER
  54. TXS
  55. INX ;INITIALIZE DTIMER
  56. ;
  57. ; LDX #0
  58. ;
  59. STX DTIMER
  60. STX DTIMER+1
  61. JSR INITPALS ;PUT UP STANDARD COLORS
  62. JSR CLEARTUN ;CLEAR OUT ALL TUNES
  63. JSR NULLOBJS ;NULL OUT ALL OBJECTS.
  64. JSR WAITLOAD ;WAIT FOR LOADER TO UPDATE
  65. JSR INITDMA ;BUILD DLLS FOR MARIA2
  66. ; AND STARTS DMA DURING VBLANK
  67. ;FALL THROUGH INTO....
  68. * PROGRAM DRIVER: NEEDED TO HANDLE THE VARIOUS PROGRAM STATES.
  69. DRIVER:
  70. LDA FRMCNT ;INSURE THAT FRMCNT IS EVEN HERE
  71. AND #$FE
  72. STA FRMCNT
  73. LDA GAMSTATE ; FRAME COUNT AIN'T INC'ED DURING HSC
  74. CMP #HSCST
  75. BEQ PASTINCF
  76. FRAMSYNC:
  77. LDA FRMCNT ;MAKE SURE AT LEAST ONE FRAME HAS
  78. SEC ; GONE BY SINCE LAST FRAME SYNCH.
  79. SBC LASTFRMC
  80. CMP #2
  81. BCC FRAMSYNC
  82. LDA FRMCNT
  83. STA LASTFRMC ;UPDATE LAST FRAME COUNT
  84. PASTINCF:
  85. INC DTIMER+1 ;INCREMENT THE TWO BYTE TIMER
  86. BNE ZZNOINC9
  87. INC DTIMER
  88. ZZNOINC9:
  89. JSR CKJOY ;GET FRESH JOYSTICK INPUTS.
  90. JSR CKBUTS ;GET FRESH BUTTON INPUTS (DEBOUNCED).
  91. JSR TWINKLE ;TWINKLE STARS ETC.
  92. LDA GAMSTATE ;CHECK GAME STATE
  93. CMP #PLAYST ;GAMEPLAY STATE
  94. BEQ PLAYD
  95. CMP #AUTOST ;AUTO PLAY STATE
  96. BEQ AUTOD
  97. CMP #MENUST ;MENU STATE
  98. BEQ MENUD
  99. CMP #TITLEST ;TITLE STATE
  100. BEQ TITLED
  101. CMP #HSCST ;HIGH SCORE CART STATE
  102. BEQ HSCD
  103. BNE DRIVER ;SAFETY TO PREVENT GOING ASTRAY
  104. ;NOT NEEDED IF WORKS PROPERLY SINCE
  105. ;MUST BE IN ONE OF THE ABOVE STATES.
  106. ** DRIVER DISPACHER ROUTINES. **
  107. ** TITLE PAGE STATE DISPACHER - HANDLES TIMING DURING TITLE PAGE. **
  108. TITLED:
  109. LDA FIREBUT2
  110. BMI HESDEAD
  111. LDX #$FF
  112. STX TURKEY
  113. DEX
  114. STX CHICKEN
  115. HESDEAD:
  116. LDA SWCHBITS
  117. AND #$08
  118. BEQ JIM
  119. LDA SWCHA
  120. ORA CHICKEN
  121. AND TURKEY
  122. STA TURKEY
  123. SEC
  124. ROL CHICKEN
  125. CMP #$F0
  126. BNE JIM
  127. JMP GO4IT
  128. JIM:
  129. LDA DTIMER ;CHECK TIMER
  130. ;
  131. ; CMP #TITLEONT ;TIME TO TURN TITLE ON?
  132. ;
  133. BNE ZCKTOFF
  134. JSR ONTITLE ;YES
  135. JSR CLSCORE ;TAKE OFF THE SCORES
  136. ZSEEJOY:
  137. JSR SEEJOY
  138. BCC DRIVER ;BCC = JMP
  139. ZCKTOFF:
  140. CMP #TITLEOFT
  141. BNE ZSEEJOY
  142. JMP DOHSC ;FROM TITLE TO HSC
  143. ** AUTO STATE DISPACHER. **
  144. AUTOD:
  145. LDA DTIMER
  146. CMP #AUTOOFFT ;DONE WITH AUTO PLAY YET?
  147. BNE AUTOGO
  148. MENUTOUT:
  149. JMP DOTITLE ;COME HERE AFTER AUTO OR MENU TIME OUT
  150. AUTOGO:
  151. JSR GAMELOOP
  152. JSR SEEJOY
  153. JMP DRIVER
  154. ** HIGH SCORE CART DISPATCHER.
  155. HSCD:
  156. JSR HSCSHOW ;PUT UP ONE TABLE
  157. LDX TEMP ;ADVANCE TO NEXT ENTRY
  158. INX
  159. CPX #12 ;12 ENTRIES
  160. BCS OVERHSC
  161. STX TEMP
  162. TAX ;TEST AC BITS:
  163. BNE HSCD ; IF AC NON-ZERO, THEN TRY AGAIN
  164. JSR SEEJOY ;CHECK FOR USER ACTIONS.
  165. JMP DRIVER
  166. OVERHSC:
  167. JMP DOAUTO ;FROM HSC TO AUTOPLAY
  168. ** PLAY STATE DISPATCHER. **
  169. PLAYD:
  170. JSR GAMELOOP ;DO ONE TIME THRU GAME PLAY
  171. JSR SEEPAUZ ;CHANGE TO PAUSE IF PAUSE BUT. HIT
  172. JSR SEEBUTS
  173. JMP DRIVER
  174. ** MENU STATE DISPATCHER. **
  175. MENUD:
  176. LDA DTIMER
  177. CMP #MENUOFFT
  178. BEQ MENUTOUT ;MENU TIMED OUT
  179. JSR SELCHK ;READ SELECT INPUT, SET MODES
  180. JSR ONTITLE ;PUT UP THE LOGO
  181. ;PUT UP DIFFICULTY LEVEL ICON
  182. LDX #10
  183. TXA
  184. CLC
  185. ADC DIFF
  186. TAY
  187. JSR DOICON
  188. ;PUT UP MODE ICON
  189. LDX #11
  190. LDA #15
  191. CLC
  192. ADC MODE
  193. TAY
  194. JSR DOICON
  195. ;PUT UP SCORES
  196. JSR DOSCORE
  197. ;NULL OUT BOTH SHIP ICONS
  198. LDA #$FF
  199. STA STATUS+12
  200. STA STATUS+13
  201. ;PUT UP SHIP ICONS
  202. LDX #12
  203. LDY #22
  204. LDA MODE
  205. BMI MENU1PL ;ONE PLAYER
  206. INY
  207. LDA MODE
  208. BEQ MENU2PL ;TWO PLAYER INDIVIDUAL
  209. CMP #2
  210. BNE MENUTEAM
  211. MENUCOMP:
  212. INY ;TWO PLAYER COMPETITION
  213. INY
  214. MENUTEAM:
  215. INY ;TWO PLAYER TEAM PLAY
  216. INY
  217. MENU2PL:
  218. JSR DOICON
  219. INY
  220. INX
  221. MENU1PL:
  222. JSR DOICON
  223. ;CHECK FOR START GAME BUTTONS
  224. ;CAN'T USE SEEJOY HERE; DON'T WANT TO DO DOMENU, ETC.
  225. LDA INPT4
  226. BPL ZDOPLAYS ;JOYSTICK BUTTON HIT
  227. LDA INPT4A
  228. BMI ZDOPLAYS
  229. LDA SWCHBITS
  230. LSR
  231. BCS ZDOPLAYS ;RESET BUTTON HIT
  232. JMP DRIVER ;NOTHING HIT: CONTINUE
  233. ZDOPLAYS:
  234. JMP DOPLAY
  235. ***************************************
  236. ** ROUTINES USED BY THE DISPATCHERS. **
  237. ***************************************
  238. * ROUTINE TO PUT TITLE ON
  239. ONTITLE:
  240. LDX #9 ;PUT UP THE FIRST 10 ICONS
  241. LDY #9
  242. TITLELOP:
  243. JSR DOICON ;PUT UP ICON Y IN SLOT X
  244. DEY
  245. DEX
  246. BPL TITLELOP
  247. LDA #$0E ;CHANGE COLOR FOR NAME
  248. STA SOFTCOLR+9
  249. LDA #$07
  250. STA SOFTCOLR+11
  251. ; LDA #$75 ;BACKGROUND BARS WILL BE CYCLED
  252. ; STA SOFTCOLR+10
  253. RTS
  254. ** MENU SELECT ROUTINES **
  255. * CHECK THE PAUSE BUTTON: HANG OUT HERE IF PRESSED, AND PERFORM PAUSE STUFF
  256. SEEPAUZ:
  257. LDA SWCHBITS ;CHECK PAUSE BUTTON
  258. AND #$08
  259. BEQ PAUZRTS
  260. ;WE NOW PAUSE FOR STATION IDENTIFICATION...
  261. DOPAUZ:
  262. LDA #PAUZST ;SHUT OFF TUNER ETC.
  263. STA GAMSTATE
  264. LDA #0
  265. STA AUDV0
  266. STA AUDV1
  267. STA DTIMER ;RESET TIMER FOR VIDEO OUT
  268. STA DTIMER+1
  269. PAUZLOOP:
  270. BIT MSTAT ;SYNCH
  271. BMI PAUZLOOP ; WAIT 'TILL ON SCREEN
  272. ; BIT MSTAT ; PROTECT AGAINST FLAKEY MSTAT
  273. ; BMI PAUZLOOP
  274. ZPOSLOOP:
  275. BIT MSTAT
  276. BPL ZPOSLOOP ; WAIT 'TILL OFF SCREEN (IN VBLANK)
  277. ; BIT MSTAT
  278. ; BPL ZPOSLOOP
  279. INC DTIMER+1 ;BUMP TIMER
  280. BNE ZZNOINC7
  281. INC DTIMER
  282. BMI VIDOFF ;TURN VIDEO OFF WHEN CLOCK ROLLS AROUND
  283. ZZNOINC7:
  284. JSR CKBUTS ;CHECK PAUSE BUTTON
  285. AND #$08
  286. BEQ PAUZCKJY
  287. ;PAUSE MODE IS OVER
  288. LDA #PLAYST
  289. STA GAMSTATE ;RESTORE TUNER
  290. LDA #$40 ;TURN ON DMA
  291. STA CTRL
  292. PAUZRTS:
  293. RTS
  294. PAUZCKJY:
  295. LDA SWCHA
  296. EOR #$FF
  297. BNE VIDON ;TURN VIDEO ON WHEN JOYSTICK OR
  298. LDA INPT4 ; EITHER PLAYER'S BUTTONS ARE HIT.
  299. AND INPT5 ; (AND HI BITS, ACTIVE LO)
  300. BPL VIDON
  301. JSR SEEBUTS ;CHECK FOR SELECT & RESET
  302. BCC PAUZLOOP ;BCC = JMP
  303. VIDOFF:
  304. LDA #$60 ; 60 = STOP DMA
  305. BNE VIDSTOR ; BNE = JMP
  306. VIDON:
  307. LDA #$40 ; 40 = START DMA
  308. VIDSTOR:
  309. STA CTRL
  310. BNE DOPAUZ ; BNE = JMP
  311. * CHECK BUTTONS (PAUSE, RESET, SELECT) SAVING STATE FOR DEBOUNCING.
  312. * SETS ONES IN EACH BIT OF SWCHBITS ON POSITIVE TRANSITIONS.
  313. CKBUTS:
  314. LDX SWCHB
  315. TXA
  316. EOR SWCHBVAL ;GET ALL BITS WHICH HAVE CHANGED
  317. AND SWCHBVAL
  318. STA SWCHBITS ;SAVE OLD VALUES OF CHANGED BITS
  319. STX SWCHBVAL ;SAVE NEW VALUES OF ALL BITS
  320. RTS
  321. * CHECK JOYSTICK/BUTTONS ETC. FOR CHANGE OF STATE
  322. SEEJOY:
  323. LDA STARTBUT ;CHECK FIRE BUTTON, NOT SET IN AUTOST
  324. ;NEEDED TO PREVENT GOING FROM AUTOST
  325. BPL DOPLAY
  326. LDA SWCHA ;CHECK JOYSTICK MOTION
  327. AND #$F0
  328. EOR #$F0
  329. BNE DOMENU
  330. SEEBUTS:
  331. LDA SWCHBITS ;CHECK SELECT AND RESET BUTTONS
  332. LSR
  333. BCS DOPLAY
  334. LSR
  335. BCS DOMENU
  336. RTS
  337. ;ENTER HSC STATE
  338. DOHSC:
  339. LDA #0 ;LOWEST GAME OPTION FOR HSC
  340. STA TEMP
  341. LDA #HSCST
  342. JMP NEWDRVR
  343. ;ENTER MENU STATE
  344. DOMENU:
  345. LDA #SELDLY ;DEBOUNCE SELECTER
  346. STA SELCNT
  347. LDA #0 ;CLEAR MENLEFT
  348. STA MENLEFT
  349. STA MENLEFT2
  350. STA MENLEFTC
  351. LDA #MENUST ;JUMP INTO MENU STATE
  352. JMP NEWDRVR
  353. ;ENTER PLAY STATE
  354. DOPLAY:
  355. JSR INITSCOR
  356. JSR INITPLAY
  357. JSR DOSCORE
  358. LDA #PLAYST ;GOTO PLAY STATE NOW
  359. JMP NEWDRVR
  360. ;ENTER TITLE PAGE STATE
  361. DOTITLE:
  362. LDA #TITLEST
  363. JMP NEWDRVR
  364. ;ENTER AUTOPLAY STATE
  365. DOAUTO:
  366. LDA #0 ;CLEAR MENLEFT
  367. STA MENLEFT
  368. STA MENLEFT2
  369. STA MENLEFTC
  370. JSR DOSCORE
  371. JSR INITPLAY ;INITIALIZE FOR GAMEPLAY
  372. LDA #AUTOST ;BUT ITS AUTOPLAY
  373. JMP NEWDRVR
  374. SELCHK:
  375. LDA SWCHA ;P1 JSTICK
  376. AND #$F0
  377. EOR #$F0
  378. BNE SELJOY
  379. LDA SWCHB ;SELECT BUTTON
  380. AND #$02
  381. BEQ SELBUT
  382. LDA #0
  383. STA SELCNT
  384. RTS
  385. SELBUT:
  386. DEC SELCNT
  387. BPL SELRTS
  388. LDX #SELDLY
  389. STX SELCNT
  390. JSR INCDIFF
  391. BNE SELRTS ;INC WORKED OK
  392. LDA #MINDIFF ;INC HAD NO EFFECT, WRAP AROUND
  393. STA DIFF
  394. JSR INCMODE
  395. BNE SELRTS ;INC WORKED OK
  396. LDA #MINMODE
  397. STA MODE
  398. BNE SELCHNG ;MINMODE = $FF HERE, SO BNE = JMP
  399. SELJOY:
  400. DEC SELCNT
  401. BPL SELRTS
  402. LDX #SELDLY
  403. STX SELCNT
  404. ASL
  405. BCS INCDIFF
  406. ASL
  407. BCS DECDIFF
  408. ASL
  409. BCS DECMODE
  410. * FALL THROUGH TO...
  411. INCMODE:
  412. LDX MODE ;INCREMENT GAMEPLAY MODE
  413. CPX #1 ;HACK: WE STOP AT 1
  414. BEQ SELRTS
  415. INX ;BIGGER HACK: PUSH X INTO RANGE.
  416. LDA ZHACKMOD+2,X ;BIGGEST HACK: TABLE LOOKUP NEXT MODE.
  417. STA MODE
  418. BPL SELCHNG
  419. INCDIFF:
  420. LDA DIFF ;INCREMENT INITIAL GAME DIFFICULTY
  421. CMP #MAXDIFF
  422. BEQ SELRTS
  423. INC DIFF
  424. BPL SELCHNG
  425. DECDIFF:
  426. LDA DIFF ;DECREMENT DIFFICULTY
  427. CMP #MINDIFF
  428. BEQ SELRTS
  429. DEC DIFF
  430. BPL SELCHNG
  431. DECMODE:
  432. LDX MODE ;DECREMENT MODE
  433. CPX #MINMODE
  434. BEQ SELRTS
  435. LDA ZHACKMOD,X
  436. STA MODE
  437. SELCHNG:
  438. LDA #0 ;HOLD DRIVER CLOCK AT ZERO
  439. STA DTIMER
  440. STA DTIMER+1
  441. *
  442. JSR HSCSUCK ;SUCK IN A NEW HIGH SCORE FOR THIS LVL
  443. LDA #17 ;JUST TO KNOCK OFF THE 'EQ' BIT
  444. SELRTS:
  445. RTS
  446. ZHACKMOD:
  447. .DC.B $FF,2,0,2,17,1 ;TABLE OF "NEXT MODES" TO KLUDGE IN.
  448. GO4IT:
  449. LDX #8
  450. LDY #LARGE+$80
  451. ZSNARD:
  452. STY STATUS,X
  453. LDA PALTAB,X
  454. STA PALS,X
  455. LDA ELBOUND+2
  456. STA ACYC,X
  457. DEX
  458. BPL ZSNARD
  459. STAY4IT:
  460. LDA FRMCNT
  461. AND #$03 ;EVERY 4
  462. BNE ZEATME
  463. LDA FRMCNT
  464. PHA
  465. LSR
  466. STA FRMCNT
  467. JSR EXPLODE
  468. PLA
  469. STA FRMCNT
  470. ZEATME:
  471. JSR WAITLOAD
  472. LDA #114
  473. STA YPOSH+9
  474. LDA #BEAG&255
  475. STA ACYC+9
  476. LDA #$4A
  477. STA PALS+9
  478. JSR LOGOBARS
  479. JSR CKJOY
  480. JSR CKBUTS
  481. JSR SEEJOY
  482. BCC STAY4IT ;BCC = JMP
  483. * NMI HANDLER: HANDLES NMI'S GENERATED EACH FRAME BY MARIA AT END OF VISIBLE.
  484. NMI:
  485. PHA ;SAVE STATE
  486. TXA
  487. PHA
  488. TYA
  489. PHA
  490. CLD
  491. LDA NMICTRL ;SEE IF WE ARE DOING HISCORE CART LOGO
  492. BEQ NMIHNDL ; NO. DO NORMAL HANDLER
  493. bne NMIOVER ;br always 1-Sept-88 *** Dave ***
  494. * STA CTRL ; YES. SET READ MODE BITS OF CTRL
  495. EOR #$03 ; INVERT THE BITS
  496. STA NMICTRL
  497. AND #$03 ; IF <> 0 (ENTERING VBLANK)
  498. BNE NMIINCFR ; BUMP FRAME COUNT
  499. JSR HSCSETRS ;SET UP HSC REGISTERS (REFRESH COLORS)
  500. JMP NMIOVER
  501. NMIHNDL:
  502. LDA FRMCNT
  503. LSR
  504. BCC NOLOAD ;EVERY OTHER FRAME, DON'T CALL LOADER
  505. JSR LOADER
  506. NOLOAD:
  507. JSR TUNER ;DO TUNES
  508. NMIINCFR:
  509. INC FRMCNT ;BUMP FRAME COUNT
  510. JSR REFRESH ;REFRESH OUR COLORS
  511. NMIOVER:
  512. PLA ;RESTORE STATE
  513. TAY
  514. PLA
  515. TAX
  516. PLA
  517. IRQ:
  518. RTI ;VECTOR IRQ'S TO THIS LABEL