GMAIN.S 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073
  1. ;*******************************************************************************
  2. ;GMAIN.S
  3. ORG $8000
  4. BEGIN
  5. LDX #71 ;ZERO OUT ENMYLIST (TYPE)
  6. XZERO LDA #0
  7. STA TYPE,X
  8. LDA #1
  9. STA ANGLE,X
  10. DEX
  11. BPL XZERO
  12. LDX #40
  13. XAVIDSUX LDA #0
  14. STA NEWTYPE,X
  15. DEX
  16. BPL XAVIDSUX
  17. LDA RSTRTREG ;SEE IF A RESTART HAS OCCURED
  18. BEQ LOGO
  19. LDA #0
  20. STA RSTRTREG ;CLEAR FLAG
  21. JMP GOTORES
  22. LOGO JSR SETLOGO
  23. JSR SCRAPALL
  24. JMP TITLPPP
  25. SETLOGO LDA #1
  26. STA TEMP1
  27. LDA #$F0
  28. STA TEMP2
  29. LDX #18
  30. LDY #65 ;START WITH 2ND PAGE GRAPHICS
  31. LLOGO TXA
  32. STA TYPE,Y
  33. INX
  34. INY
  35. CPX #24
  36. BNE LLOGO
  37. LDA #30
  38. STA XCORD+65
  39. STA XCORD+66
  40. LDA #82
  41. STA XCORD+67
  42. STA XCORD+68
  43. LDA #70
  44. STA XCORD+69
  45. STA XCORD+70
  46. LDA #72
  47. STA YCORD+65
  48. STA YCORD+67
  49. LDA #84
  50. STA YCORD+66
  51. STA YCORD+68
  52. LDA #96
  53. STA YCORD+69
  54. LDA #108
  55. STA YCORD+70
  56. LDA #0
  57. STA ANGLE
  58. STA TEMP3 ;INITIALLY POSITIVE
  59. LDA #$48
  60. STA YCORD
  61. LDA #$50
  62. STA XCORD
  63. ;THIS SECTION SETS UP THE TWINKLE
  64. LDA #35
  65. STA TYPE
  66. LDA #7 ;USE Y AS A LOCATION VARIABLE
  67. STA BOZO0 ;THIS SAVES THE Y VALUE
  68. RTS ;END OF LOGO SETUP SUBROUTINE
  69. TITLPPP LDA #0
  70. STA FRAME ;SET UP FRAME
  71. TITLOOP DEC FRAME
  72. TITLP1 LDA FRAME
  73. BMI TITLP1
  74. JSR TWINKEL ;TWINKLE SUBROUTINE
  75. LDA SELECT ;SEE IF IN SELECT MODE
  76. BEQ NOTOSEL
  77. JMP GOTOSEL
  78. NOTOSEL LDA TEMP2
  79. BEQ DOHSC ;DO HSC AFTER TITLE PAGE
  80. ATIT LDA SWCHB ;GET LOCAL INPUTS
  81. LSR A
  82. BCS ATIT2
  83. JMP GOTORES
  84. ATIT2 LSR A
  85. BCS ATIT3
  86. JMP GOTOSEL
  87. ATIT3 LDA SWCHA ;LOOK AT JOYSTICK INPUT
  88. ORA #$0F ;BOOT PLAYER 2 INPUT
  89. CMP #$FF ;SEE IF ANY INPUT
  90. BEQ FUCKYOU
  91. JMP GOTOSEL ;GO TO SELECT MODE
  92. FUCKYOU BIT INPT4 ;LOOK AT FIRE BUTTON INPUT
  93. BMI ATIT4
  94. JMP GOTORES
  95. ATIT4 LDA #0
  96. STA FLAP ;PREVENT FLAPPING IN LOADER
  97. JMP TITLOOP
  98. DOHSC LDA #0
  99. STA DIFCULTY ;SET DIFFICULTY FOR NOVICE
  100. JSR SETLOGO ;SETS UP THE LOGO DISPLAY
  101. LDA #1
  102. STA INHSC ;INDICATE IN HSC MODE
  103. JSR HSCTEST SEE IF THERE IS A DISPLAY FOR THIS
  104. BMI NONOVICE
  105. LDA #1
  106. STA INHSC
  107. JSR HSCDSPLY ;DISPLAY HISCORECART
  108. JSR GAMEPOLL SEE IF ANY INPUT
  109. BCS NOEXPERT
  110. NONOVICE INC DIFCULTY
  111. JSR HSCTEST SEE IF ADVANCED TABLE
  112. BMI NOADVNCD
  113. LDA #1
  114. STA INHSC
  115. JSR HSCDSPLY
  116. JSR GAMEPOLL SEE IF ANY INPUT
  117. BCS NOEXPERT
  118. NOADVNCD INC DIFCULTY
  119. JSR HSCTEST SEE IF EXPERT TABLE
  120. BMI NOEXPERT
  121. LDA #1
  122. STA INHSC
  123. JSR HSCDSPLY
  124. NOEXPERT LDA #$40
  125. STA CTRLWT RESET THE CORRECT CONTROL WORD
  126. JSR CLEARDL1
  127. JMP ENDCLEAR
  128. CLEARDL1 ;THIS SUBROUTINE CLEARS THE FIRST DLIST
  129. LDA #$18
  130. STA TEMP1+1 TEMP1 NOW HAS THE ADDRESS 1801
  131. LDX #15 LOOP 16 TIMES
  132. LDA #0
  133. STA TEMP1
  134. DLST1CLR LDY #0
  135. TYA
  136. STA (TEMP1),Y
  137. INY
  138. STA (TEMP1),Y
  139. LDA TEMP1
  140. CLC
  141. ADC #82 INC TO NEXT DLST
  142. STA TEMP1
  143. LDA TEMP1+1
  144. ADC #0
  145. STA TEMP1+1
  146. DEX
  147. BPL DLST1CLR
  148. RTS
  149. ENDCLEAR LDA #L(DLSTLST1)
  150. STA DPPL
  151. LDA #H(DLSTLST1)
  152. STA DPPH
  153. LDA #0
  154. STA DLSPTR ;NEXT DLI WILL BUILD DISPLAY LIST 2
  155. ; STA TWOPLAYR ;SET TO ONE PLAYER MODE FOR AUTOPLAY
  156. STA INHSC
  157. STA AUTOPLAY ;THIS JUST SETS UP AUTOPLAY NOW
  158. LDA #9
  159. STA AUTOPLAZ ;ADDITIONAL COUNTER
  160. STA AUTOPLAY ;NEEDS A NON-ZERO VALUE
  161. JMP ATITOUT ;GO INTO GAME LOOP
  162. GOTOSEL
  163. LDA #$20
  164. STA MISTIMER ;DONT ALLOW SHOT TO BE FIRED
  165. STA TEMP2 ;KEEP STAR TWINKLING
  166. STA SELECT ;INDICATE IN SELECT MODE
  167. LDA #0
  168. STA AUTOPLAY ;CLEAR AUTOPLAY MODE
  169. STA AUTOPLAZ
  170. STA FLAP ;PREVENT FLAPPING IN LOADER
  171. BIT INPT4 ;SEE IF FIRE BUTTON HIT
  172. BMI CONTSEL ;IF HIT, START GAME
  173. SELRES JMP GOTORES
  174. CONTSEL LDA SWCHB
  175. LSR A
  176. BCC SELRES ;SEE IF RESET HIT DURING SELECT
  177. *THIS SECTION KEEPS UP THE SELECTION DISPLAY
  178. LDA #47 ;PLAYERS TYPE
  179. STA TYPE+71 ;STORE IN TYPE LIST
  180. LDA #40
  181. STA XCORD+71
  182. LDA #132
  183. STA YCORD+71
  184. STA YCORD+1
  185. LDA #1
  186. STA ANGLE+71
  187. STA ANGLE+1
  188. LDY #48
  189. LDA TWOPLAYR ;GET TWOPLAYER REGISTER
  190. BEQ SHOWONE
  191. INY
  192. SHOWONE ;'1' TYPE
  193. STY TYPE+1
  194. LDA #90
  195. STA XCORD+1
  196. ;THIS SECTION PUTS UP THE PLAY LEVEL
  197. LDA #46 ;'LEVEL' TYPE
  198. STA TYPE+2
  199. LDA #40
  200. STA XCORD+2
  201. LDA #144
  202. STA YCORD+2
  203. STA YCORD+3
  204. LDA #1
  205. STA ANGLE+2
  206. STA ANGLE+3
  207. LDY #44
  208. LDA LEVELSEL ;GET LEVEL SELECTION REGISTER
  209. BMI DONOVICE ;$FF IS NOVICE
  210. BNE FINLEVEL ;1 IS EXPERT, 0 IS ADVANCED
  211. DEY
  212. DEY ;43 IS ADVANCED
  213. DONOVICE INY ;45 IS NOVICE
  214. FINLEVEL STY TYPE+3 ;44 IS EXPERT
  215. LDA #80
  216. STA XCORD+3
  217. ;THIS SECTION DOES THE SELECTION ADVANCE
  218. DEC SELTIMER ;SEE IF TIME TO LOOK AT JOYSTICK
  219. BNE ENDSEL
  220. LDA #20
  221. STA SELTIMER ;RESET SELTIMER
  222. LDA SWCHA ;GET JOYSTICK INPUT
  223. ORA #$0F ;BOOT PLAYER 2 INPUT
  224. CMP #$FF
  225. BEQ CHKSWB ;LOOK AT LOCAL INPUT
  226. ASL A
  227. BCC INCDIFF ;INC DIFFICULTY
  228. ASL A
  229. BCC DECDIFF ;DEC DIFFICULTY
  230. ASL A
  231. BCS INCPLYR
  232. LDA #0
  233. STA TWOPLAYR ;SET PLAYERS TO 1
  234. BEQ ENDSEL
  235. INCPLYR LDA #1
  236. STA TWOPLAYR ;SET PLAYERS TO 2
  237. BNE ENDSEL
  238. INCDIFF LDA LEVELSEL ;GET LEVEL SELECTION REG
  239. CMP #1
  240. BEQ ENDSEL
  241. INC LEVELSEL
  242. JMP TITLOOP
  243. DECDIFF LDA LEVELSEL
  244. BMI ENDSEL
  245. DEC LEVELSEL
  246. ENDSEL
  247. DEC BOZO2
  248. BNE ENDSELL
  249. DEC BOZO3
  250. BNE ENDSELL
  251. LDA #0
  252. STA SELECT GO BACK TO GAME LOOP
  253. ENDSELL JMP TITLOOP
  254. CHKSWB LDA SWCHB
  255. LSR A
  256. LSR A ;LOOK AT SELECT INPUT
  257. BCS NOSEL
  258. ;SELECT ACTIVE, NEED TO SEE IF WAS ACTIVE BEFORE
  259. LDA SELTGL
  260. BNE CHKTIMER ;WAS ON, CHECK IF TIME TO INC OPTIONS
  261. INC SELTGL ;SET TOGGLE TO ON
  262. LDA #5
  263. STA SELDELAY ;INITIALIZE SELECT DELAY
  264. JMP INCOPTNS ;WASN'T ON, MUST INC OPTIONS
  265. NOSEL LDA #0
  266. STA SELTGL ;SET SELECT TOGGLE TO OFF
  267. BEQ ENDSEL
  268. CHKTIMER DEC SELDELAY
  269. BPL ENDSEL ;NOT LONG ENOUGH BETWEEN OPTION CHNG
  270. LDA #05
  271. STA SELDELAY
  272. INCOPTNS LDA LEVELSEL
  273. CMP #1 ;SEE IF HIGHEST LEVEL
  274. BEQ CHPLYER ;IF HIGHEST LEVEL, CHANGE PLAYER #
  275. INC LEVELSEL
  276. JMP ENDSEL
  277. CHPLYER LDA #$FF
  278. STA LEVELSEL ;RESET LEVEL TO LOWEST SETTING
  279. LDA TWOPLAYR
  280. BEQ CHPLYER1
  281. LDA #0
  282. STA TWOPLAYR ;SET TO ONE PLAYER
  283. BEQ ENDSEL
  284. CHPLYER1 INC TWOPLAYR ;SET TO TWO PLAYERS
  285. JMP ENDSEL
  286. GOTORES
  287. ;CALL GALAGA TUNE HERE
  288. JSR SCRAPALL
  289. LDA #0
  290. JSR TUNIN
  291. LDA #1
  292. JSR TUNIN
  293. LDA #$20 ;PREVENT SHOT FIRE
  294. STA MISTIMER
  295. LDA #0
  296. STA AUTOPLAY ;CLEAR AUTOPLAY MODE
  297. STA SELECT ;CLEAR SELECT MODE
  298. JSR CLRSCORE
  299. BMI ATITOUT ;CLRSCORE RETURNS MINUS
  300. CLRSCORE LDX #5
  301. ZZLOP STA P1SCORE,X ;ZERO OUT THE SCORES
  302. DEX
  303. BPL ZZLOP
  304. LDA #$A
  305. LDX #15
  306. ZZZLOP STA SCORE,X ;BLANK OUT THE SCORE DISPLAY
  307. DEX
  308. BPL ZZZLOP
  309. RTS
  310. ATITOUT LDA #4
  311. STA LIVES
  312. LDX TWOPLAYR
  313. BEQ ZILOUT
  314. STA LIVES+1
  315. ZILOUT LDA LEVELSEL
  316. BMI LOWRACK
  317. BEQ LOWRACK
  318. LDA #2
  319. STA CHALNUM ;START W/ CHAL STG NUMBER 3
  320. LDA #5
  321. STA WAVEREG ;INIT WAVEREG TO RACK 10
  322. LDA #$10
  323. STA GASTONHK ;STORE BCD RECORD OF RACK
  324. LDA #10
  325. STA CHALINDX ;INIT CHALINDX TO RACK 10
  326. BNE LOWRACK1
  327. LOWRACK LDA #1
  328. STA GASTONHK ;STORE BCD RECORD OF RACK
  329. LOWRACK1 STA RACK
  330. STA RLOGO
  331. LDA #0
  332. LDX #71
  333. XXERO STA TYPE,X
  334. STA ANGLE,X
  335. STA MODE,X ;ZERO OUT MODE AS WELL
  336. DEX
  337. BPL XXERO
  338. LDA #5
  339. STA TYPE+63
  340. LDA #$80
  341. STA RACKREG
  342. STA ANGLE+63
  343. STA ANGLE+62
  344. LDA #171
  345. STA YCORD+63
  346. LDA #0
  347. STA MODE+40
  348. STA TYPE+62
  349. STA MODE+63
  350. LDY #35
  351. ZCOPY ;SAVE ALL 2ND PLAYER VARIABLES
  352. LDA ARRIVED,Y
  353. STA SAVES,Y
  354. DEY
  355. BPL ZCOPY
  356. LDA #$4F
  357. STA RDYREG ;GIVE INITIAL DELAY TO GAME
  358. LDA #1
  359. STA ABORT ;GIVE GAME DELAY
  360. BLOOP
  361. LDA FRAME
  362. BMI BLOOP
  363. JSR UPENLIST
  364. JSR COLDET1
  365. JSR COLDET2
  366. JSR ATTACK
  367. JSR ADDSCORE
  368. JSR TOFIRE
  369. JSR HEROSPIN
  370. JSR CHBONUS
  371. JSR WORDS
  372. JMP BLOOP
  373. CHBONUS
  374. LDA SCRTIME ;SEE IF TIME FOR SCORE DISPLAY
  375. BNE CHBONUS1
  376. JMP ENDBONS2
  377. *WILL NOT LEAVE THIS LOOP UNTIL DONE WITH ALL DISPLAY
  378. CHBONUS1 LDA #1
  379. LDY #65
  380. CHBONUS2 STA ANGLE,Y ;SET ALL ANGLES TO 1
  381. INY
  382. CPY #72
  383. BNE CHBONUS2
  384. JSR CLREXPLO CLEAR ANY REMAINING EXPLOSIONS
  385. LDA CHALSCR ;GET SCORE FOR STAGE
  386. CMP #$40 ;SEE IF PERFECT SCORE
  387. BNE NOFANFR
  388. LDA #17
  389. JSR TUNIN
  390. LDA #18
  391. JSR TUNIN ;CALL PERFECT SCORE FANFARE
  392. JMP NOFAN2
  393. NOFANFR LDA #19
  394. JSR TUNIN
  395. LDA #20
  396. JSR TUNIN ;CALL REGULAR STATS MUSIC
  397. NOFAN2 LDA #0
  398. STA TYPE+56
  399. STA TYPE+57 ;CLEAR OUT HERO MISSILES
  400. LDA #36 ;'NUMBER OF HITS' TYPE
  401. STA TYPE+65
  402. LDA #72
  403. STA YCORD+65
  404. LDA #26
  405. STA XCORD+65
  406. LDA #90
  407. STA SCRTIME ;USE THIS AS A TEMP LOCATION
  408. JSR SCRDELAY ;WAIT 60 FRAMES
  409. LDA CHALSCR
  410. LSR A
  411. LSR A
  412. LSR A
  413. LSR A ;GET RID OF LOWER NIBBLE
  414. STA ANGLE+66
  415. STA ANGLE+69
  416. STA TEMP4 ;HIGH DIGIT OF SCORE
  417. BEQ NOZEROS ;DONT SHOW IF LEADING ZERO
  418. LDA #40 ;DIGIT TYPE
  419. STA TYPE+66
  420. NOZEROS LDA #40
  421. STA TYPE+67
  422. LDA #72
  423. STA YCORD+66
  424. STA YCORD+67
  425. LDA #113
  426. STA XCORD+66
  427. LDA #81
  428. STA XCORD+69
  429. LDA #119
  430. STA XCORD+67
  431. LDA #87
  432. STA XCORD+70
  433. LDA CHALSCR
  434. AND #$0F ;BOOT HIGH NIBBLE
  435. STA ANGLE+67
  436. STA ANGLE+70
  437. ASL A
  438. ASL A
  439. ASL A
  440. ASL A
  441. STA TEMP5 ;LOW BYTE OF SCORE
  442. LDA #90
  443. STA SCRTIME
  444. JSR SCRDELAY ;WAIT 60 FRAMES
  445. LDA CHALSCR
  446. CMP #$40 ;SEE IF PERFECT SCORE
  447. BEQ PRFCTSCR
  448. LDA #39
  449. STA TYPE+68 ;SET 'BONUS' TYPE
  450. LDA #96
  451. STA YCORD+68
  452. STA YCORD+69
  453. STA YCORD+70
  454. STA YCORD+71
  455. LDA #45
  456. STA XCORD+68
  457. LDA #90
  458. STA SCRTIME
  459. JSR SCRDELAY ;WAIT 60 FRAMES
  460. LDA #40 ;DIGIT TYPE
  461. STA TYPE+69
  462. STA TYPE+70
  463. LDA ANGLE+69 ;SEE IF IS ZERO
  464. BNE NOTXERO
  465. STA TYPE+69 ;DONT SHOW IT
  466. LDA ANGLE+70
  467. BNE NOTXERO
  468. STA TYPE+70 ;DONT SHOW IT
  469. NOTXERO JSR ADDSCORE
  470. LDA #42 ;DOUBLE ZERO TYPE
  471. STA TYPE+71
  472. LDA #93
  473. STA XCORD+71
  474. LDA #$B0
  475. STA SCRTIME
  476. JSR SCRDELAY
  477. JMP ENDBONUS
  478. PRFCTSCR LDA #37
  479. STA TYPE+71
  480. LDA #48
  481. STA YCORD+71
  482. LDA #60
  483. STA XCORD+71
  484. LDA #30
  485. STA SCRTIME
  486. JSR SCRDELAY ;PERFECT ON
  487. LDA #0
  488. STA TYPE+71
  489. LDA #30
  490. STA SCRTIME
  491. JSR SCRDELAY ;PERFECT OFF
  492. LDA #37
  493. STA TYPE+71
  494. LDA #38
  495. STA TYPE+68 ;'SPECIAL BONUS' TYPE
  496. LDA #20
  497. STA XCORD+68
  498. LDA #96
  499. STA YCORD+68
  500. LDA #30
  501. STA SCRTIME
  502. JSR SCRDELAY ;PERFECT ON
  503. LDA #0
  504. STA TYPE+71
  505. LDA #30
  506. STA SCRTIME
  507. JSR SCRDELAY ;PERFECT OFF
  508. LDA #37
  509. STA TYPE+71
  510. LDA #0
  511. STA TEMP5
  512. LDA #10
  513. STA TEMP4 ;GIVES SCORE OF 10,000 BONUS
  514. JSR ADDSCORE
  515. LDA #41
  516. STA TYPE+69 ;TEN THOUSAND TYPE
  517. LDA #1
  518. STA ANGLE+69 ;RESET THE ANGLE
  519. LDA #96
  520. STA YCORD+69
  521. LDA #107
  522. STA XCORD+69
  523. LDA #30
  524. STA SCRTIME
  525. JSR SCRDELAY ;PERFECT ON
  526. LDA #0
  527. STA TYPE+71
  528. LDA #30
  529. STA SCRTIME
  530. JSR SCRDELAY ;PERFECT OFF
  531. LDA #37
  532. STA TYPE+71
  533. ENDBONUS LDA #0
  534. LDY #65
  535. ENDBONS1 STA TYPE,Y
  536. INY
  537. CPY #72
  538. BMI ENDBONS1 ;CLEAR ALL TYPES
  539. STA CHALSCR ;RESET SCORE REGISTER
  540. ; LDA XCORD+63
  541. ; STA HEROX ;RESET HEROS POSITION
  542. ENDBONS2 RTS
  543. SCRDELAY DEC FRAME ;THIS SUBROUTINE CAUSES A DELAY
  544. SCRDLY1 LDA FRAME ;DELAY LENGTH IS STORED IN SCRTIME
  545. BMI SCRDLY1
  546. DEC SCRTIME
  547. BEQ SCRDLY2
  548. DEC FRAME
  549. JMP SCRDLY1
  550. SCRDLY2 RTS
  551. WORDS LDA RDYREG ;SEE IF READY SHOULD BE DISPLAYED
  552. BEQ WORDS0 ;GO TO NEXT WORD SECTION
  553. SEC
  554. SBC #1
  555. STA RDYREG
  556. BEQ WORDS1 ;RESET LOGO
  557. CMP #$4E ;SEE IF FIRST TIME THROUGH
  558. BNE WORDS0 ;GO TO NEXT WORD SECTION
  559. ;THIS SECTION DISPLAYS THE "READY" LOGO
  560. LDA #26 ;THIS IS READY TYPE
  561. STA TYPE+65
  562. LDA #96
  563. STA YCORD+65
  564. LDA #65
  565. STA XCORD+65
  566. LDA #1
  567. STA ANGLE+65
  568. JMP WORDS0
  569. WORDS1 LDA #0
  570. STA ABORT ;RESET ABORT REGISTER
  571. STA TYPE+65
  572. ;THIS SECTION DISPLAYS THE "PLAYER X" LOGO
  573. WORDS0 LDA PLAYRREG
  574. BEQ WORDS2 ;GO TO NEXT SECTION
  575. SEC
  576. SBC #1
  577. STA PLAYRREG
  578. BEQ WORDS3 ;RESET LOGO
  579. CMP #$4E
  580. BNE WORDS2 ;GO TO NEXT SECTION
  581. LDA #25
  582. STA TYPE+66
  583. LDA #84
  584. STA YCORD+66
  585. LDA #55
  586. STA XCORD+66
  587. LDA #1
  588. STA ANGLE+66
  589. ;DISPLAY "1" OR "2"
  590. LDA GMOVEREG
  591. BEQ WPLAYER0
  592. LDA PLAYER
  593. BNE WPLAYER1
  594. LDA #32
  595. JMP WPLAYER2
  596. WPLAYER0 LDA PLAYER
  597. BEQ WPLAYER1
  598. LDA #32
  599. JMP WPLAYER2 ;PLAYER 2 TYPE
  600. WPLAYER1 LDA #31 ;PLAYER 1 TYPE
  601. WPLAYER2 STA TYPE+67
  602. LDA #84
  603. STA YCORD+67
  604. LDA #95
  605. STA XCORD+67
  606. LDA #1
  607. STA ANGLE+67
  608. JMP WORDS2
  609. WORDS3 LDA #0
  610. STA TYPE+66 ;RESET LOGO
  611. STA TYPE+67
  612. ;THIS SECTION HANDLES A "CHALLENGING STAGE"
  613. WORDS2 LDA CHLNGREG
  614. BEQ WORDS4 ;GO TO NEXT SECTION
  615. SEC
  616. SBC #1
  617. STA CHLNGREG
  618. BEQ WORDS5 ;RESET LOGO
  619. CMP #$4E
  620. BNE WORDS4 ;GO TO NEXT SECTION
  621. JSR CLREXPLO
  622. LDY #29
  623. STY TYPE+65
  624. INY ;Y NOW HAS 30
  625. STY TYPE+66
  626. STY XCORD+65
  627. LDA #96
  628. STA YCORD+65
  629. STA YCORD+66
  630. LDA #100
  631. STA XCORD+66
  632. LDA #1
  633. STA ANGLE+65
  634. STA ANGLE+66
  635. JMP WORDS4
  636. WORDS5 LDA #0
  637. STA TYPE+65
  638. STA TYPE+66
  639. ;THIS SECTION HANDLES "GAME OVER"
  640. WORDS4 LDA GMOVEREG
  641. BNE NOWORDS6 ;GO TO NEXT SECTION
  642. GOWORDS6 JMP WORDS6
  643. NOWORDS6 SEC
  644. SBC #1
  645. STA GMOVEREG
  646. BNE PISMEOFF
  647. JMP WORDS7 ;RESET LOGO
  648. PISMEOFF CMP #$4E
  649. BNE GOWORDS6 ;GO TO NEXT SECTION
  650. JSR CLREXPLO
  651. LDA #28
  652. STA TYPE+68
  653. LDA #96
  654. STA YCORD+68
  655. LDA #55
  656. STA XCORD+68
  657. LDA #1
  658. STA ANGLE+68
  659. LDA GAMEOVER
  660. BEQ WORDS6 ;GAME NOT OVER, GO ON
  661. LDA #1
  662. STA LIVES ;KEEPS LOADER FROM BARFING
  663. STA LIVES+1
  664. WORDS8 ;NOT USED
  665. LDA #$FF
  666. STA SCRTIME ;USE SCRDELAY AS A WAIT LOOP
  667. JSR SCRDELAY
  668. JSR STATS ;SHOW THE GAME STATS
  669. LDA FARREN
  670. BMI HSCBAR
  671. LDA #1
  672. STA INHSC
  673. LDY #1
  674. LDX #71
  675. CLRTYPES LDA #0
  676. STA TYPE,X ;BOOT ALL EXTRAEOUS CHARACTERS
  677. TYA
  678. STA ANGLE,X
  679. DEX
  680. BPL CLRTYPES
  681. JSR SETLOGO ;SET UP THE LOGO DISPLAY
  682. LDA LEVELSEL
  683. CLC
  684. ADC #1 ;DIFCULTY MUST BE 0 OR GREATER
  685. STA DIFCULTY
  686. LDA #0
  687. STA PLAYER
  688. JSR HSCENTER
  689. LDA TWOPLAYR ;SEE IF TWO PEOPLE PLAYING
  690. BEQ ONLYONE
  691. LDA #1
  692. STA PLAYER
  693. JSR HSCENTER
  694. ONLYONE LDA #0
  695. STA INHSC
  696. LDA #$40
  697. STA CTRLWT ;RESTART THE DLI'S
  698. LDA #L(DLSTLST1)
  699. STA DPPL
  700. LDA #H(DLSTLST1)
  701. STA DPPH
  702. LDA #0
  703. STA DLSPTR
  704. HSCBAR LDX #$FF
  705. TXS
  706. JMP RESTART
  707. WORDS7 LDA #0
  708. STA TYPE+68 ;RESET "GAME OVER" LOGO
  709. STA GMOVEREG
  710. LDA #$4F
  711. STA RDYREG
  712. STA PLAYRREG
  713. ;THIS SECTION HANDLES "FIGHTER CAPTURED"
  714. WORDS6 LDA CAPTDREG
  715. BEQ WORDS10 ;GO TO NEXT SECTION
  716. SEC
  717. SBC #1
  718. STA CAPTDREG
  719. BEQ WORDS9
  720. CMP #$4E ;SEE IF FIRST TIME THROUGH
  721. BNE WORDS10 ;GO TO NEXT SECTION
  722. LDY #33 ;FIGHTER TYPE
  723. STY TYPE+65
  724. INY
  725. STY TYPE+66
  726. LDA #30
  727. STA XCORD+65
  728. LDA #80
  729. STA XCORD+66
  730. LDA #96
  731. STA YCORD+65
  732. STA YCORD+66
  733. LDA #1
  734. STA ANGLE+65
  735. STA ANGLE+66
  736. JMP WORDS10
  737. WORDS9 LDA #0
  738. STA TYPE+65
  739. STA TYPE+66
  740. *THIS SECTION HANDLES AUTOPLAY MODE
  741. WORDS10
  742. LDA AUTOPLAY ;SEE IF IN AUTOPLAY MODE
  743. BEQ WORDS11
  744. BIT INPT4 ;LOOK AT JOYSTICK FIRE BUTTON
  745. BMI WORDS12 ;NO INPUT, GO ON
  746. LDX #$FF
  747. TXS
  748. STX RSTRTREG ;INDICATE GAME RESTART
  749. JMP RESTART
  750. WORDS12
  751. LDA SWCHA ;CHECK JOYSTICK INPUT
  752. ORA #$0F ;BOOT PLAYER 2 INPUT
  753. CMP #$FF
  754. BEQ WORDS14
  755. LDX #$FF
  756. TXS
  757. TXA
  758. STA SELECT ;INDICATE SELECT MODE NOW
  759. JMP RESTART
  760. WORDS14 DEC AUTOPLAY
  761. BNE WORDS11
  762. DEC AUTOPLAZ
  763. BEQ WORDS15
  764. LDA #$FF
  765. STA AUTOPLAY
  766. BNE WORDS11
  767. WORDS15 LDX #$FF
  768. TXS
  769. JMP RESTART ;GO BACK TO TITLE PAGE DISPLAY
  770. *THIS SECTION HANDLES RESETS OR SELECTS WHICH OCCUR AT ANY TIME
  771. WORDS11 LDA SWCHB
  772. LSR A
  773. BCS WORDS16
  774. LDX #$FF
  775. TXS
  776. STX RSTRTREG ;INDICATE GAME RESTART
  777. JMP RESTART
  778. WORDS16 LSR A ;CHECK FOR SELECT SWITCH SET
  779. BCS WORDS17
  780. LDX #$FF
  781. TXS
  782. TXA
  783. STA SELECT
  784. JMP RESTART
  785. WORDS17 LDA PAUSTOG ;SEE IF PAUSE INPUT IS VALID
  786. ASL A ;SET CARRY BIT IF PAUSE INVALID
  787. BCC PSVALID
  788. INC PAUSTOG WILL EVENTUALLY INC TO ZERO
  789. BCS SKIPPAUS
  790. PSVALID LDA #$F0
  791. STA PAUSTOG
  792. LDA SWCHB
  793. LSR A
  794. LSR A
  795. LSR A
  796. LSR A
  797. ;NO CARRY INDICATES PAUSE IS BEING PUSHED
  798. SKIPPAUS BIT PAUSE
  799. BPL NOPAUSON ;PAUSE WASN'T ON ALREADY
  800. BCC PAUSOFF ;PAUSE WAS ON, NOW TAKE IT OFF
  801. ;INC ALL COUNTERS HERE
  802. PAUSCNT INC PAUSECT1
  803. BNE PAUSCNTL
  804. INC PAUSECT2
  805. BNE PAUSCNTL
  806. LDA #$FF
  807. STA CTRLWT ;BLANK OFF THE SCREEN DISPLAY
  808. LDA #$80
  809. STA PAUSE ;INDICATES THAT SCREEN IS OFF
  810. PAUSCNTL LDA SWCHA
  811. CMP #$FF ;SEE IF ANY INPUT AT ALL
  812. BEQ PAUSFIRE ;NO INPUT, CONTINUE TO SCAN
  813. PAUSFIR1 LDA #0
  814. STA PAUSECT1
  815. LDA #$D0
  816. STA PAUSECT2 ;RESET THESE COUNTERS
  817. LDA #$40
  818. STA CTRLWT ;RESET THE DISPLAY
  819. LDA #$FF
  820. STA PAUSE ;INDICATE SCREEN ON MODE AGAIN
  821. BNE PAUSWAIT
  822. PAUSFIRE BIT INPT4 ;SEE IF FIRE BUTTON HIT
  823. BPL PAUSFIR1
  824. PAUSWAIT DEC FRAME
  825. PAUSWT LDA PAUSE
  826. CMP #$80 ;NO DMA IN THIS MODE
  827. BEQ WORDS17
  828. LDA FRAME
  829. BMI PAUSWT
  830. BPL WORDS17
  831. NOPAUSON BCS WORDSEND ;PAUSE NOT ON, NO PAUSE INPUT GIVEN
  832. LDA #$FF
  833. STA PAUSE ;INDICATE PAUSE ON NOW
  834. LDA #0
  835. STA AUDV0
  836. STA AUDV1 ;SILENCE CURRENT SOUNDS
  837. BCC PAUSCNT ;GO TO PAUSE COUNTING ROUTINE
  838. PAUSOFF LDA #0
  839. STA PAUSE ;CLEAR PAUSE
  840. STA FRAME
  841. STA PAUSECT1
  842. LDA #$D0
  843. STA PAUSECT2 ;RESET COUNTERS
  844. LDA #$40
  845. STA CTRLWT ;RESET THE CONTROL WORD
  846. WORDSEND DEC FRAME ;END OF GAME LOOP
  847. RTS
  848. HSTAR DB 010,140,080,075,030,020,050,130 ;HORIZONTAL
  849. DB 100,090,130,080,070,020,030,130 ;POSITION
  850. DB 020,080,085,145,020,003,050,030 ;FOR
  851. DB 110,157,095,125,048,011,150,037 ;THE STARS
  852. DB 038,003,092,111,057,141,042,043
  853. DB 065,072,030,095,048,080,138,087
  854. DB 024,117,009,150,058,088,036,080
  855. DB 104,068,094,031,064,007,150,111
  856. DB 022,088,066,109,139,117,045,036
  857. DB 043,009,081,094,051,112,018,043
  858. DB 031,083,137,090,067,003,077,037
  859. DB 126,078,093,125,007,157,033,056
  860. DB 023,003,069,115,087,060,097,100
  861. DB 055,023,077,016,146,086,045,081
  862. DB 017,143,042,073,051,035,058,033
  863. DB 098,052,036,103,010,071,150,111
  864. ;TWINKY DB $43,$50,$41,$48,$52,$50,$5D,$49
  865. ;TWINKX DB $28,$3E,$47,$50,$30,$57,$5B,$72
  866. STATS
  867. LDY #70
  868. LDA #0
  869. STATS2 STA TYPE,Y ;ZERO OUT TYPE LIST
  870. DEY
  871. BPL STATS2
  872. STA PLAYER ;INIT TO PLAYER ONE
  873. ;ASSUME RATIO = 0 BEFORE STARTING
  874. ;THIS SECTION MULTIPLIES MISCNT21 BY 100
  875. STATS1 LDX #1 ;MULTIPLY BY 4 AND ADD
  876. JSR SHIFTMIS
  877. LDX #2 ;MULTIPLY BY 8 AND ADD
  878. JSR SHIFTMIS
  879. LDX #0 ;MULTIPLY BY 2 AND ADD
  880. JSR SHIFTMIS
  881. ;THIS SECTION DIVIDES MISCNT2 BY MISCNT1
  882. LDA MISCNT11
  883. BNE DIVMIS ;SEE IF THIS IS ZERO
  884. LDA MISCNT11+1
  885. BEQ SHORATIO ;DON'T DIVIDE BY ZERO
  886. DIVMIS SEC
  887. LDA RATIO
  888. SBC MISCNT11
  889. STA RATIO
  890. LDA RATIO+1
  891. SBC MISCNT11+1
  892. STA RATIO+1
  893. LDA RATIO+2
  894. SBC #0
  895. STA RATIO+2
  896. BMI SHORATIO ;SHOW RATIO WHEN THIS IS NEGATIVE
  897. SED
  898. CLC
  899. LDA PRCNTREG ;INCREMENT THE PERCENTAGE COUNTER
  900. ADC #1
  901. STA PRCNTREG
  902. CLD
  903. BCS NOMISSES ;SEE IF HIT 100%
  904. JMP DIVMIS
  905. NOMISSES LDY PLAYER ;GET CURRENT PLAYER DISPLAYED
  906. LDA #48 ;'1' TYPE, FIRST PAGE
  907. STA TYPE+4,Y
  908. SHORATIO LDY PLAYER ;USES TYPE SLOTS 65,66,67,68,69,70
  909. BNE SHORAT1 ;WILL HAVE ALREADY DONE THIS
  910. LDA #25 ;'PLAYER' TYPE
  911. STA TYPE+69
  912. LDA #20
  913. STA XCORD+69
  914. LDA #60
  915. STA YCORD+69
  916. STA YCORD+70
  917. LDA #1
  918. STA ANGLE+69 ;PLAYER
  919. STA ANGLE+70 ;NUMBER OF HITS
  920. STA ANGLE ;1
  921. STA ANGLE+1 ;2
  922. LDA #36
  923. STA TYPE+70 ;'NUMBER OF HITS' TYPE
  924. LDA #70
  925. STA XCORD+70
  926. LDA #48 ;'1' TYPE, FIRST PAGE GRAPHICS
  927. STA TYPE
  928. LDA #40
  929. STA XCORD
  930. STA XCORD+1
  931. LDA #84
  932. STA YCORD
  933. LDA #108
  934. STA YCORD+1
  935. LDA TWOPLAYR
  936. BEQ SHORAT1
  937. LDA #49 ;DON'T SHOW IF ONLY ONE PLAYER
  938. STA TYPE+1
  939. SHORAT1 LDA PRCNTREG ;GET THE PERCENT SCORE
  940. LSR A
  941. LSR A
  942. LSR A
  943. LSR A ;GET RID OF LOWER NIBBLE
  944. STA ANGLE+65,Y
  945. LDA #40 ;DIGIT TYPE
  946. STA TYPE+65,Y
  947. STA TYPE+67,Y
  948. TYA ;LOOK AT Y REG
  949. BEQ SHORAT2 ;SEE WHICH PLAYER
  950. LDA #108
  951. BNE SHORAT3
  952. SHORAT2 LDA #84
  953. SHORAT3 STA YCORD+65,Y
  954. STA YCORD+67,Y
  955. STA YCORD+2,Y ;PERCENT SIGN
  956. STA YCORD+4,Y ;100% SCORE
  957. LDA #101
  958. STA XCORD+4,Y
  959. LDA #107
  960. STA XCORD+65,Y
  961. LDA #113
  962. STA XCORD+67,Y
  963. LDA #119
  964. STA XCORD+2,Y
  965. LDA #1
  966. STA ANGLE+2,Y
  967. STA ANGLE+4,Y
  968. LDA #51
  969. STA TYPE+2,Y
  970. LDA PRCNTREG
  971. AND #$0F ;BOOT HIGH NIBBLE
  972. STA ANGLE+67,Y
  973. LDA TWOPLAYR ;SEE IF IN TWO PLAYER MODE
  974. BEQ ONESTATS
  975. LDA PLAYER
  976. BNE ONESTATS ;SEE IF ALREADY DID PLAYER 2
  977. LDA MISCNT22 ;TRANSFER PLAYER2 TO PLAYER1'S REGS
  978. STA MISCNT21
  979. LDA MISCNT22+1
  980. STA MISCNT21+1
  981. LDA MISCNT22+2
  982. STA MISCNT21+2
  983. LDA MISCNT12
  984. STA MISCNT11
  985. LDA MISCNT12+1
  986. STA MISCNT11+1
  987. LDA #0
  988. STA RATIO
  989. STA RATIO+1
  990. STA RATIO+2
  991. STA PRCNTREG
  992. INC PLAYER
  993. JMP STATS1
  994. ONESTATS LDA #$FF
  995. STA SCRTIME
  996. JSR SCRDELAY ;GIVE APPROPRIATE DELAY
  997. RTS
  998. SHIFTMIS CLC
  999. ASL MISCNT21+2
  1000. ASL MISCNT21+1
  1001. BCC SHIFTM1
  1002. INC MISCNT21+2
  1003. SHIFTM1 ASL MISCNT21
  1004. BCC SHIFTM2
  1005. INC MISCNT21+1
  1006. SHIFTM2 DEX
  1007. BPL SHIFTMIS
  1008. CLC
  1009. LDA RATIO
  1010. ADC MISCNT21
  1011. STA RATIO
  1012. LDA RATIO+1
  1013. ADC MISCNT21+1
  1014. STA RATIO+1
  1015. LDA RATIO+2
  1016. ADC MISCNT21+2
  1017. STA RATIO+2
  1018. RTS
  1019. CLREXPLO LDX #57
  1020. CLREXP INX
  1021. LDA TYPE,X
  1022. CMP #8 SEE IF SOME SORT OF EXPLOSION
  1023. BMI CLREXP1
  1024. LDA #0
  1025. STA TYPE,X
  1026. CLREXP1 CPX #61
  1027. BMI CLREXP
  1028. RTS
  1029. TWINKEL DEC TEMP1
  1030. BNE TWINKEND
  1031. LDA TEMP3 ;USED AS A TOGGLE SWITCH
  1032. BPL INCANGLE
  1033. DEC ANGLE
  1034. BMI RELOCATE ;MOVE STAR
  1035. BPL RESETEMP
  1036. INCANGLE INC ANGLE
  1037. LDA ANGLE
  1038. CMP #7 ;SEE IF DONE INCREMENTING
  1039. BMI RESETEMP ;NO, RESET TEMP VARIABLE
  1040. LDA #$FF
  1041. STA TEMP3
  1042. BNE RESETEMP ;NOW RESET TEMP
  1043. RELOCATE LDA #0
  1044. STA ANGLE
  1045. STA TEMP3 ;RESET TOGGLE VARIABLE
  1046. DEC BOZO0
  1047. BPL RELOC1
  1048. LDA #7
  1049. STA BOZO0
  1050. RELOC1 LDA BOZO0
  1051. TAY
  1052. LDA TWINKY,Y ;GET TWINKLE Y CORD
  1053. STA YCORD
  1054. LDA TWINKX,Y ;GET TWINKLE X CORD
  1055. STA XCORD
  1056. RESETEMP LDA #3
  1057. STA TEMP1
  1058. DEC TEMP2
  1059. TWINKEND RTS