home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64Arcade / CUA.SDA / CUA.ASM < prev    next >
Encoding:
Assembly Source File  |  2019-04-13  |  19.6 KB  |  1,032 lines

  1. ;================================
  2. ;COMMIE UFO ATTACK V1.0
  3. ;(C) 1986 STEVE GOLDSMITH
  4. ;ALL RIGHTS RESERVED
  5. ;
  6. ;USE COMMODORE'S MACRO ASSEMBLER
  7. ;ASSEMBLE
  8. ;================================
  9. ;
  10. *=$8000
  11. SETLFS = $FFBA ;SET LOGICAL FILE #, DEVICE, COMMAND
  12. SETNAM = $FFBD ;SET FILE NAME
  13. LOAD = $FFD5 ;LOAD RAM FROM DEVICE
  14. PRINT = $FFD2 ;KERNAL CHAR PRINT ROUTINE
  15. PLOT = $FFF0 ;SET CURSOR LOCATION
  16. GETIN = $FFE4 ;GET CHAR FROM KEYBOARD
  17. CCOLOR = $0286 ;CURSOR COLOR
  18. VICII = $D000 ;VIDEO CHIP
  19. CIA1 = $DC00 ;COMPLEX INTERFACE ADAPTER #1
  20. CIA2 = $DD00 ;COMPLEX INTERFACE ADAPTER #2
  21. KSCRN = $288 ;KERNAL START OF SCREEN
  22. IRQVEC = $0314 ;IRQ HARDWARE VECTOR
  23. NRMIRQ =$EA31 ;NORMAL IRQ VECTOR
  24. SCREEN = $C800 ;START OF SCREEN MEMORY
  25. COLMEM = $D800 ;CHARACTER COLOR MEM
  26. SPRPTR = SCREEN+$3F8 ;SPRITE POINTERS
  27. SID = $D400 ;START OF SOUND CHIP
  28. INDEX = $FB ;ZERO PAGE INDEXER
  29. ;
  30. ;INITILIZE PROGRAM
  31. ;
  32. JSR LOADCS ;LOAD CHARS AND SPRITES
  33. JSR SETBNK ;SET GRAPHICS BANK
  34. JSR TITLE ;DISPLAY TITLE SCREEN
  35. JSR SETIRQ ;CRANK UP NEW IRQ
  36. REPLAY JSR INITSP ;INIT PLAYFIELD
  37. ;
  38. ;MAIN LOOP
  39. ;
  40. MAIN DEC MLOOP ;MISSLE MOVES TWICE AS FAST
  41. BNE LOOP89
  42. LDA #$02
  43. STA MLOOP
  44. LDA VICII+$1E ;GET COLLISION REG
  45. STA COLREG ;SAVE COLLISION REG
  46. JSR TANK ;MOVE TANK AND FIRE MISSLE
  47. LDA NUMTNK ;GET NUMBER OF TANKS
  48. BNE LOOP78 ;ANY TANKS LEFT?
  49. JMP ENDGAM ;END GAME
  50. LOOP78 JSR UFO1 ;MOVE UFO1 AND DROP BOMBS
  51. JSR UFO2 ;MOVE UFO2 AND DROP BOMBS
  52. JSR SCROLL ;SCROLL BOTTOM LINE ON SCREEN
  53. LDA VICII+$1E ;GET COLLISION REG
  54. STA COLREG ;SAVE COLLISION REG
  55. LOOP89 JSR MISSLE ;MOVE MISSLE
  56. SEC ;TIME DELAY
  57. LDA #$0A
  58. SBC LEVEL ;HIGHER LEVEL = FASTER DELAY
  59. TAY
  60. LOOP79 LDX #$40 ;SECONDARY DELAY
  61. LOOP80 DEX
  62. BNE LOOP80
  63. DEY
  64. BNE LOOP79
  65. JMP MAIN
  66. ;
  67. ;LOAD CHARACTER AND SPRITE DATA
  68. ;
  69. LOADCS LDA #$01 ;FILE #
  70. LDX #$08 ;DEVICE #
  71. LDY #$01 ;COMMAND
  72. JSR SETLFS ;SET UP FILE
  73. LDA #$0A ;# OF CHARS IN NAME
  74. LDX #<NAME ;GET ADDR OF FILE NAME
  75. LDY #>NAME
  76. JSR SETNAM ;SET UP NAME
  77. LDA #$00 ;SET FOR LOAD
  78. JSR LOAD ;LOAD FILE
  79. RTS
  80. ;
  81. ;SET BANK + GRAPHICS MODE
  82. ;
  83. SETBNK LDA CIA2+2
  84. ORA #$03 ;SET BITS 0 & 1 TO OUTPUTS
  85. STA CIA2+2
  86. LDA CIA2
  87. AND #$FC ;SELECT BANK 3 FOR GRAPHICS
  88. STA CIA2
  89. LDA #$20
  90. STA VICII+$18 ;CHARACTERS @ $C000 AND SCREEN @ $C800
  91. LDA #$C8
  92. STA KSCRN ;TELL KERNAL WHERE SCREEN IS
  93. RTS
  94. ;
  95. ;SET IRQ TO NEW LOCATION
  96. ;
  97. SETIRQ SEI
  98. LDA #<NEWIRQ
  99. STA IRQVEC
  100. LDA #>NEWIRQ
  101. STA IRQVEC+1
  102. CLI
  103. RTS
  104. ;
  105. ;NEW IRQ ROUTINE
  106. ;
  107. NEWIRQ LDX RTSCN
  108. LDA RTNUM,X ;GET ROUTINE #
  109. BEQ LOOP4 ;SKIP TO NEXT READ POSITION
  110. CMP #$01
  111. BNE LOOP1
  112. JSR RT1
  113. JMP LOOP4
  114. LOOP1 CMP #$02
  115. BNE LOOP2
  116. JSR RT2
  117. JMP LOOP4
  118. LOOP2 CMP #$03
  119. BNE LOOP3
  120. JSR RT3
  121. JMP LOOP4
  122. LOOP3 JSR RT4
  123. LOOP4 LDX RTSCN
  124. INX
  125. CPX #$04 ;SCAN FOR 4 ROUTINES
  126. BNE LOOP5
  127. LDX #$00
  128. LOOP5 STX RTSCN
  129. JMP NRMIRQ
  130. RT4 RTS ;ROUTINE 4 NOT USED
  131. ;
  132. ;INITILIZE SPRITES, PLAY FIELD, SCORE, # OF TANKS, AND LEVEL
  133. ;
  134. INITSP LDX #$00 ;CLEAR SID CHIP
  135. TXA
  136. LOOP76 STA SID,X
  137. INX
  138. CPX #$18
  139. BNE LOOP76
  140. LDA #$00 ;ZERO SCORE
  141. STA SC
  142. STA SC+1
  143. STA SC+2
  144. LDA #$02
  145. STA MLOOP ;# OF TIMES MISSLE MOVES VS TANK AND UFOS
  146. LDA #$03
  147. STA NUMTNK ; # OF TANKS
  148. LDA #$01
  149. STA LEVEL ;SET LEVEL TO 1
  150. LDX #$00 ;SET SPRITE 0-6 POINTER AND COLOR
  151. LOOP8 LDA SPRTBL,X
  152. STA SPRPTR,X ;SET SPRITE POINTER
  153. LDA SPCOLR,X
  154. STA VICII+$27,X ;SET SPRITE COLOR
  155. INX
  156. CPX #$08
  157. BNE LOOP8
  158. LDX #$AB ;PUT TANK ON SCREEN
  159. LDY #$DD
  160. STX VICII ;SET X POS
  161. STY VICII+1 ;SET Y POS
  162. LDA #%00000001
  163. STA VICII+$15 ;TURN TANK ON
  164. LDX #$00
  165. LOOP6 LDA SDATA,X ;CLEAR SCREEN AND PRINT TOP LINE
  166. JSR PRINT ;PRINT CHARS
  167. INX
  168. CPX #$22
  169. BNE LOOP6
  170. LDX #$00 ;SET COLOR FOR BOTTOM LINE ON SCREEN
  171. LDA #$03 ;CYAN
  172. LOOP77 STA COLMEM+$03C0,X
  173. INX
  174. CPX #$28
  175. BNE LOOP77
  176. LDA #$47 ;SET UP BOTTOM LINE FOR SCROLL
  177. STA SCREEN+$03E7
  178. LDA VICII+$1E ;CLEAR COLLISION REG
  179. LDA #$0F
  180. STA SID+$18 ;TURN VOLUME ON
  181. RTS
  182. ;
  183. ;READ COLLISION REG, JOYSTICK, AND MOVE TANK OR FIRE MISSLE
  184. ;
  185. TANK LDA TNKEXP ;SEE IF TANK EXPLODING
  186. BEQ LOOP67
  187. RTS
  188. LOOP67 LDA COLREG ;SEE IF TANK HIT
  189. AND #%00000001 ;SEE IF TANK HIT
  190. BEQ LOOP66
  191. DEC NUMTNK ;DECREASE # OF TANKS
  192. LDA #$0F
  193. STA TIMER3 9/15 TH SECOND
  194. LDA #$09
  195. STA SID+$05 ;SET ATTACK/DECAY
  196. LDA #$70
  197. STA SID+$06 ;SET SUSTAIN/RELEASE
  198. LDA #$80
  199. STA SID ;LO FREQ
  200. LDA #$01
  201. STA SID+1 ;HI FREQ
  202. STA TNKSND
  203. LDA #%10000001
  204. STA SID+$04 ;SET RANDOM NOISE + GATE BIT
  205. LDA #$03
  206. STA TNKEXP ;SKIP JOYSTICK INPUT
  207. STA RTNUM+2 ;START IRQ PROCESSING
  208. LDA #$01
  209. STA VICII+$17 ;EXPAND Y
  210. LDA #$D5
  211. STA VICII+1 ;EXPLOSION Y
  212. RTS
  213. LOOP66 LDA CIA1
  214. AND #%00011111 ;GET DIRECTIONS
  215. CMP #%00001111 ;CHECK FOR FIRE
  216. BEQ FIRE ;FIRE MISSLE
  217. CMP #%00011011 ;CHECK FOR LEFT
  218. BEQ LEFT
  219. CMP #%00010111 ;CHECK FOR RIGHT
  220. BEQ RIGHT
  221. CMP #%00001011 ;CHECK FOR LEFT + FIRE
  222. BNE LOOP20
  223. JSR FIRE
  224. JMP LEFT
  225. LOOP20 CMP #%00000111 ;CHECK FOR RIGHT + FIRE
  226. BNE LOOP56
  227. JSR FIRE
  228. JMP RIGHT
  229. LOOP56 RTS
  230. LEFT LDA VICII+$10 ;MOVE TANK LEFT
  231. AND #%00000001 ;SEE IF MSB OF X IS SET
  232. BEQ LOOP9
  233. LDA VICII ;SEE IF TANK IS @ $100
  234. BNE LOOP11
  235. LDA VICII+$10
  236. AND #%11111110 ;TANK REACHED $FF
  237. STA VICII+$10
  238. LOOP9 LDA VICII
  239. CMP #$18 ;LEFT EDGE OF SCREEN
  240. BEQ LOOP10
  241. LOOP11 DEC VICII ;MOVE TANK 1 LEFT
  242. LOOP10 RTS
  243. RIGHT LDA VICII+$10 ;MOVE TANK RIGHT
  244. AND #%00000001 ;SEE IF MSB OF X IS SET
  245. BNE LOOP12
  246. LDA VICII ;SEE IF TANK IS @ $FF
  247. CMP #$FF
  248. BNE LOOP13
  249. LDA VICII+$10
  250. ORA #%00000001 ;TANK REACHED $100
  251. STA VICII+$10
  252. LOOP12 LDA VICII
  253. CMP #$40 ;RIGHT EDGE OF SCREEN
  254. BEQ LOOP14
  255. LOOP13 INC VICII ;MOVE TANK 1 RIGHT
  256. LOOP14 RTS
  257. FIRE LDA FIRTGL ;SEE IF MISSLE ALL READY SHOT
  258. BEQ LOOP15 ;SHOOT MISSLE
  259. RTS
  260. LOOP15 LDA #$01
  261. STA FIRTGL
  262. LDA VICII+$10
  263. AND #%00000001 ;SEE IF MSB OF TANK X POS SET
  264. BNE LOOP18 ;MSB OF TANK X SET
  265. LDA VICII+$10
  266. AND #%11111101 ;MSB OF TANK X NOT SET
  267. JMP LOOP19
  268. LOOP18 LDA VICII+$10
  269. ORA #%00000010
  270. LOOP19 STA VICII+$10
  271. LDA VICII ;GET TANKS X POS
  272. STA VICII+2 ;MISSLE X
  273. LDA #$D9
  274. STA VICII+3 ;MISSLE Y
  275. LDA VICII+$15
  276. ORA #%00000010 ;TURN MISSLE ON
  277. STA VICII+$15
  278. LDA #$11 ;SET ATTACK/DECAY V1
  279. STA SID+$05
  280. LDA #$F6 ;SET SUSTAIN/RELEASE V1
  281. STA SID+$06
  282. LDA #$80 ;STORE MISSLE FREQ.
  283. STA SID
  284. LDA #$03
  285. STA SID+1
  286. LDA #%10000001 ;SET RANDOM NOISE + GATE BIT
  287. STA SID+$04
  288. LDA #%10000000
  289. STA SID+$04 ;START RELEASE CYCLE
  290. RTS
  291. ;
  292. ;MISSLE MOVEMENT
  293. ;
  294. MISSLE LDA FIRTGL ;SEE IF MISSLE IS IN FLIGHT
  295. BNE LOOP16
  296. RTS
  297. LOOP16 LDA VICII+3 ;GET MISSLE Y POS
  298. CMP #$32 ;SEE IF @ TOP OF SCREEN
  299. BEQ LOOP17
  300. DEC VICII+3 ;MOVE MISSLE UP 1
  301. RTS
  302. LOOP17 LDA VICII+$15
  303. AND #%11111101 ;TURN MISSLE OFF
  304. STA VICII+$15
  305. LDA #$00 ;CAN NOW FIRE ANOTHER MISSLE
  306. STA FIRTGL
  307. STA COLREG ;CLEAR C-REG SAVE
  308. LDA VICII+$1E ;CLEAR SS C-REG
  309. RTS
  310. ;
  311. ;INIT UFOS
  312. ;
  313. INUFOS LDA VICII+$12
  314. AND #%01111111
  315. CLC
  316. ADC #$38
  317. STA YPOS ;SAVE Y POS
  318. LDA VICII+$12
  319. BMI LOOP21
  320. LDA #$01 ;RIGHT TO LEFT
  321. STA UFODIR
  322. LDA #$57
  323. STA XPOS
  324. RTS
  325. LOOP21 LDA #$00 ;LEFT TO RIGHT
  326. STA UFODIR
  327. LDA #$01
  328. STA XPOS
  329. RTS
  330. ;
  331. ;MOVE UFO 1
  332. ;
  333. UFO1 LDA INITU1 ;SEE IF INIT YET
  334. BNE LOOP22
  335. LDA #$01
  336. STA INITU1
  337. JSR INUFOS ;GET X,Y, AND DIRECTION
  338. LDA VICII+$10 ;GET MSB OF UFO
  339. LDX UFODIR
  340. STX U1DIR ;SAVE DIRECTION
  341. BNE LOOP23 ;SET MSB OF UFO
  342. AND #%11111011 ;LEFT TO RIGHT
  343. JMP LOOP24
  344. LOOP23 ORA #%00000100 ;RIGHT TO LEFT
  345. LOOP24 STA VICII+$10
  346. LDA XPOS ;SET X AND Y POS
  347. STA VICII+4
  348. LDA YPOS
  349. STA VICII+5
  350. LDA VICII+$15
  351. ORA #%00000100 ;TURN UFO ON
  352. STA VICII+$15
  353. LOOP22 LDA BD1 ;SEE IF BOMB HAS BEEN DROPED
  354. BNE LOOP45
  355. LDA VICII+$12 ;DROP BOMB?
  356. CMP #$01
  357. BNE LOOP46
  358. LDA #$01
  359. STA BD1
  360. LOOP45 JSR BOMB1
  361. LOOP46 LDA COLREG ;GET COLLISION REG
  362. AND #%00000110
  363. CMP #%00000110 ;SEE IF MISSLE HIT UFO
  364. BNE LOOP60 ;NO
  365. JSR LOOP17 ;KILL MISSLE
  366. JSR LOOP28 ;KILL UFO
  367. LDX #$00
  368. LDY LEVEL ;SCORE = LEVEL*100
  369. JSR SCORE ;SCORE POINTS
  370. LDX VICII+4 ;UFO X LSB
  371. LDY VICII+5 ;UFO Y
  372. LDA VICII+$10 ;UFO X MSB
  373. AND #%00000100
  374. CLC
  375. BEQ LOOP61
  376. SEC
  377. LOOP61 JMP EXP2 ;INIT EXPLOSION
  378. LOOP60 LDA U1DIR ;GET UFO DIRECTION
  379. BEQ LOOP25
  380. LDA VICII+$10 ;MOVE RIGHT TO LEFT
  381. AND #%00000100 ;SEE IF MSB OF X SET
  382. BEQ LOOP26
  383. LDA VICII+4 ;SEE IF UFO IS @ $100
  384. BNE LOOP27
  385. LDA VICII+$10
  386. AND #%11111011 ;UFO REACHED $FF
  387. STA VICII+$10
  388. LOOP26 LDA VICII+4
  389. CMP #$01 ;LEFT EDGE OF SCREEN
  390. BEQ LOOP28
  391. LOOP27 DEC VICII+4
  392. RTS
  393. LOOP25 LDA VICII+$10 ;MOVE LEFT TO RIGHT
  394. AND #%00000100 ;SEE IF MSB OF X IS SET
  395. BNE LOOP29
  396. LDA VICII+4 ;SEE IF UFO IS @ $FF
  397. CMP #$FF
  398. BNE LOOP30
  399. LDA VICII+$10
  400. ORA #%00000100 ;UFO REACHED $100
  401. STA VICII+$10
  402. LOOP29 LDA VICII+4
  403. CMP #$57 ;RIGHT EDGE OF SCREEN
  404. BEQ LOOP28
  405. LOOP30 INC VICII+4
  406. RTS
  407. LOOP28 LDA VICII+$15
  408. AND #%11111011 ;TURN UFO OFF
  409. STA VICII+$15
  410. LDA #$00
  411. STA INITU1
  412. RTS
  413. ;
  414. ;MOVE UFO 2
  415. ;
  416. UFO2 LDA INITU2 ;SEE IF INIT YET
  417. BNE LOOP31
  418. LDA #$01
  419. STA INITU2
  420. JSR INUFOS ;GET X,Y, AND DIRECTION
  421. LDA VICII+$10 ;GET MSB OF UFO
  422. LDX UFODIR
  423. STX U2DIR ;SAVE DIRECTION
  424. BNE LOOP32 ;SET MSB OF UFO
  425. AND #%11110111 ;LEFT TO RIGHT
  426. JMP LOOP33
  427. LOOP32 ORA #%00001000 ;RIGHT TO LEFT
  428. LOOP33 STA VICII+$10
  429. LDA XPOS ;SET X AND Y POS
  430. STA VICII+6
  431. LDA YPOS
  432. STA VICII+7
  433. LDA VICII+$15
  434. ORA #%00001000 ;TURN UFO ON
  435. STA VICII+$15
  436. LOOP31 LDA VICII+7
  437. CMP #$D0
  438. BEQ LOOP40
  439. LDA VICII+$12
  440. AND #$0F
  441. BNE LOOP40
  442. INC VICII+7
  443. LOOP40 LDA BD2 ;SEE IF BOMB HAS BEEN DROPED
  444. BNE LOOP47
  445. LDA VICII+$12 ;DROP BOMB?
  446. CMP #$01
  447. BNE LOOP48
  448. LDA #$01
  449. STA BD2
  450. LOOP47 JSR BOMB2
  451. LOOP48 LDA COLREG ;GET COLLISION REG
  452. AND #%00001010
  453. CMP #%00001010 ;SEE IF MISSLE HIT UFO
  454. BNE LOOP64 ;NO
  455. JSR LOOP17 ;KILL MISSLE
  456. JSR LOOP37 ;KILL UFO
  457. LDX #$00
  458. LDY LEVEL ;SCORE = LEVEL*100
  459. JSR SCORE ;SCORE POINTS
  460. LDX VICII+6 ;UFO X LSB
  461. LDY VICII+7 ;UFO Y
  462. LDA VICII+$10 ;UFO X MSB
  463. AND #%00001000
  464. CLC
  465. BEQ LOOP65
  466. SEC
  467. LOOP65 JMP EXP2 ;INIT EXPLOSION
  468. LOOP64 LDA U2DIR
  469. BEQ LOOP34
  470. LDA VICII+$10 ;MOVE RIGHT TO LEFT
  471. AND #%00001000 ;SEE IF MSB OF X SET
  472. BEQ LOOP35
  473. LDA VICII+6 ;SEE IF UFO IS @ $100
  474. BNE LOOP36
  475. LDA VICII+$10
  476. AND #%11110111 ;UFO REACHED $FF
  477. STA VICII+$10
  478. LOOP35 LDA VICII+6
  479. CMP #$01 ;LEFT EDGE OF SCREEN
  480. BEQ LOOP37
  481. LOOP36 DEC VICII+6
  482. RTS
  483. LOOP34 LDA VICII+$10 ;MOVE LEFT TO RIGHT
  484. AND #%00001000 ;SEE IF MSB OF X IS SET
  485. BNE LOOP38
  486. LDA VICII+6 ;SEE IF UFO IS @ $FF
  487. CMP #$FF
  488. BNE LOOP39
  489. LDA VICII+$10
  490. ORA #%00001000 ;UFO REACHED $100
  491. STA VICII+$10
  492. LOOP38 LDA VICII+6
  493. CMP #$57 ;RIGHT EDGE OF SCREEN
  494. BEQ LOOP37
  495. LOOP39 INC VICII+6
  496. RTS
  497. LOOP37 LDA VICII+$15
  498. AND #%11110111 ;TURN UFO OFF
  499. STA VICII+$15
  500. LDA #$00
  501. STA INITU2
  502. RTS
  503. ;
  504. ;BOMB 1 MOVEMENT
  505. ;
  506. BOMB1 LDA INITB1 ;SEE IF BOMB INIT YET
  507. BNE LOOP41
  508. LDA #$01
  509. STA INITB1
  510. LDA VICII+4 ;GET UFO 1 X POS
  511. STA VICII+8
  512. LDA VICII+$10
  513. AND #%00000100 ;SEE IF MSB OF UFO IS SET
  514. BNE LOOP42
  515. LDA VICII+$10
  516. AND #%11101111
  517. JMP LOOP43
  518. LOOP42 LDA VICII+$10
  519. ORA #%00010000
  520. LOOP43 STA VICII+$10
  521. LDA VICII+5 ;GET UFO 1 Y POS
  522. STA VICII+9
  523. LDA VICII+$15
  524. ORA #%00010000 ;TURN BOMB ON
  525. STA VICII+$15
  526. LDA #$D0
  527. STA SID+$0C ;SET ATTACK/DECAY V2
  528. LDA #$00
  529. STA SID+$0D ;SET SUSTAIN/RELEASE V2
  530. LDA #$00
  531. STA SID+$07 ;SET FREQ LO
  532. LDA #$E0
  533. STA SID+$08 ;SET FREQ HI
  534. STA B1FREQ ;SAVE HI FREQ
  535. LDA #%00100001 ;SELECT SAWTOOTH WAVEFORM AND GATE BIT
  536. STA SID+$0B
  537. LOOP41 LDA VICII+9
  538. CMP #$DD
  539. BNE LOOP74
  540. LDX #%00100000
  541. STX SID+$0B ;START RELEASE CYCLE
  542. LOOP74 CMP #$E5 ;SEE IF BOMB IS @ BOTTOM OF SCREEN
  543. BEQ LOOP44
  544. INC VICII+9 ;MOVE BOMB 1 DOWN
  545. LDA COLREG ;GET COLLISION REG
  546. AND #%00010010 ;SEE IF BOMB AND MISSLE HIT
  547. CMP #%00010010
  548. BNE LOOP58 ;NO
  549. LDA #%00100000
  550. STA SID+$0B ;START RELEASE CYCLE
  551. LDX #$00
  552. LDY #$01
  553. JSR SCORE ;ADD 100 TO SCORE
  554. JSR LOOP17 ;KILL MISSLE
  555. JMP LOOP44 ;KILL BOMB
  556. LOOP58 DEC B1FREQ
  557. LDA B1FREQ
  558. STA SID+$08 ;LOWER FREQ
  559. RTS
  560. LOOP44 LDA #$00
  561. STA INITB1
  562. STA BD1
  563. LDA VICII+$15
  564. AND #%11101111 ;TURN OFF
  565. STA VICII+$15
  566. LDX VICII+8 ;BOMB X LO
  567. LDY VICII+9 ;BOMB Y
  568. CLC
  569. LDA VICII+$10 ;GET X HI
  570. AND #%00010000
  571. BEQ LOOP53
  572. SEC
  573. LOOP53 JMP EXP1 ;INIT EXPLOSION
  574. ;
  575. ;BOMB 2 MOVEMENT
  576. ;
  577. BOMB2 LDA INITB2 ;SEE IF BOMB INIT YET
  578. BNE LOOP49
  579. LDA #$01
  580. STA INITB2
  581. LDA VICII+6 ;GET UFO 2 X POS
  582. STA VICII+10
  583. LDA VICII+$10
  584. AND #%00001000 ;SEE IF MSB OF UFO IS SET
  585. BNE LOOP50
  586. LDA VICII+$10
  587. AND #%11011111
  588. JMP LOOP51
  589. LOOP50 LDA VICII+$10
  590. ORA #%00100000
  591. LOOP51 STA VICII+$10
  592. LDA VICII+7 ;GET UFO 2 Y POS
  593. STA VICII+11
  594. LDA VICII+$15
  595. ORA #%00100000 ;TURN BOMB ON
  596. STA VICII+$15
  597. LDA #$D0
  598. STA SID+$13 ;SET ATTACK/DECAY V3
  599. LDA #$00
  600. STA SID+$14 ;SET SUSTAIN/RELEASE V3
  601. LDA #$00
  602. STA SID+$0E ;SET FREQ LO
  603. LDA #$E0
  604. STA SID+$0F ;SET FREQ HI
  605. STA B2FREQ ;SAVE HI FREQ
  606. LDA #%00100001 ;SELECT SAWTOOTH WAVEFORM AND GATE BIT
  607. STA SID+$12
  608. LOOP49 LDA VICII+11
  609. CMP #$DD
  610. BNE LOOP75
  611. LDX #%00100000 ;START RELEASE CYCLE
  612. STX SID+$12
  613. LOOP75 CMP #$E5 ;SEE IF BOMB IS @ BOTTOM OF SCREEN
  614. BEQ LOOP52
  615. INC VICII+11 ;MOVE BOMB 2 DOWN
  616. LDA COLREG ;GET COLLISION REG
  617. AND #%00100010 ;SEE IF BOMB AND MISSLE HIT
  618. CMP #%00100010
  619. BNE LOOP59 ;NO
  620. LDA #%00100000
  621. STA SID+$12 ;START RELEASE CYCLE
  622. LDX #$00
  623. LDY #$01
  624. JSR SCORE ;ADD 100 TO SCORE
  625. JSR LOOP17 ;KILL MISSLE
  626. JMP LOOP52 ;KILL BOMB
  627. LOOP59 DEC B2FREQ ;LOWER FREQ
  628. LDA B2FREQ
  629. STA SID+$0F
  630. RTS
  631. LOOP52 LDA #$00
  632. STA INITB2
  633. STA BD2
  634. LDA VICII+$15
  635. AND #%11011111
  636. STA VICII+$15
  637. LDX VICII+10 ;BOMB X LO
  638. LDY VICII+11 ;BOMB Y
  639. CLC
  640. LDA VICII+$10 ;GET X HI
  641. AND #%00100000
  642. BEQ LOOP57
  643. SEC
  644. LOOP57 JMP EXP1 ;INIT EXPLOSION
  645. ;
  646. ;BOMB EXPLOSION
  647. ;
  648. EXP1 STX VICII+12 ;EXP X LO
  649. STY VICII+13 ;EXP Y
  650. LDA VICII+$10 ;GET X HI
  651. AND #%10111111
  652. BCC LOOP54 ;X HI NOT SET
  653. ORA #%01000000
  654. LOOP54 STA VICII+$10
  655. LDA VICII+$15
  656. ORA #%01000000 ;TURN ON
  657. STA VICII+$15
  658. LDA #$08 ;8/15 TH OF A SEC
  659. STA TIMER1
  660. LDA #$01
  661. STA RTNUM+3 ;START IRQ PROCESSING
  662. RTS
  663. ;
  664. ;BOMB EXPLOSION IRQ PROCESSING
  665. ;
  666. RT1 LDX TIMER1
  667. LDA TIMER1,X
  668. STA VICII+$2D ;CHANGE COLOR
  669. DEC TIMER1
  670. BNE LOOP55
  671. LDA VICII+$15
  672. AND #%10111111 ;TURN OFF
  673. STA VICII+$15
  674. LDA #$00
  675. STA RTNUM+3 ;STOP IRQ PROCESSING
  676. LOOP55 RTS
  677. ;
  678. ;UFO EXPLOSION INITILIZE
  679. ;
  680. EXP2 STX VICII+14 ;EXP X LO
  681. STY VICII+15 ;EXP Y
  682. LDA VICII+$10 ;GET X HI
  683. AND #%01111111
  684. BCC LOOP62 ;X HI NOT SET
  685. ORA #%10000000
  686. LOOP62 STA VICII+$10
  687. LDA #$80 ;SET ATTACK/DECAY V1
  688. STA SID+$05
  689. LDA #$F8 ;SET SUSTAIN/RELEASE V1
  690. STA SID+$06
  691. LDA #$FF ;STORE MISSLE FREQ.
  692. STA SID ;LO FREQ
  693. LDA #$81
  694. STA SID+1 ;HI FREQ
  695. STA EXPFRQ
  696. LDA #%10000001 ;SET RANDOM NOISE + GATE BIT
  697. STA SID+$04
  698. LDA #%10000000
  699. STA SID+$04 ;START RELEASE CYCLE
  700. LDA #$06 ; 6/15 TH SECOND
  701. STA TIMER2
  702. LDA #$02
  703. STA RTNUM+1 ;START IRQ PROCESSING
  704. LDA VICII+$15
  705. ORA #%10000000 ;TURN ON
  706. STA VICII+$15
  707. RTS
  708. ;
  709. ;UFO EXPLOSION IRQ PROCESSING
  710. ;
  711. RT2 LDX TIMER2
  712. LDA TIMER2,X
  713. STA SPRPTR+7 ;CHANGE SPRITE POINTER
  714. ROL EXPFRQ
  715. LDA EXPFRQ
  716. STA SID+1 ;CHANGE SOUND
  717. DEC TIMER2
  718. BNE LOOP63
  719. LDA VICII+$15
  720. AND #%01111111 ;TURN OFF
  721. STA VICII+$15
  722. LDA #$00
  723. STA RTNUM+1 ;STOP IRQ PROCESSING
  724. LOOP63 RTS
  725. ;
  726. ;TANK EXPLOSION IRQ PROCESSING
  727. ;
  728. RT3 LDX TIMER3
  729. LDA EXPCLR,X
  730. STA VICII+$27 ;CHANGE COLOR
  731. LDA TIMER3,X
  732. STA SPRPTR ;CHANGE SPRITE POINTER
  733. ROR TNKSND
  734. LDA TNKSND
  735. STA SID+$01 ;CHANGE SOUND
  736. DEC TIMER3
  737. BNE LOOP68
  738. LDA #$00
  739. STA VICII+$17 ;UNEXPAND Y
  740. LDA #$05
  741. STA VICII+$27 ;RESTORE COLOR
  742. LDA #$AB
  743. STA VICII ;SET TANK X LO
  744. LDA #$DD
  745. STA VICII+1 ;TANK Y
  746. LDA VICII+$10
  747. AND #%11111110
  748. STA VICII+$10 ;SET MSB X
  749. LDA #$10
  750. STA SPRPTR ;RESTORE TANK
  751. LDA #$00
  752. STA SID+$04
  753. STA RTNUM+2 ;STOP IRQ PROCESSING
  754. STA TNKEXP ;RESTART JOYSTICK READ
  755. LDA VICII+$1E ;CLEAR COLLISION REG
  756. LDX NUMTNK ;GET # LEFT
  757. LDA #$20 ;SPACE
  758. STA SCREEN+$1B,X ;ERASE 1 TANK
  759. LOOP68 RTS
  760. ;
  761. ;SCROLL BOTTOM LINE OF SCREEN
  762. ;
  763. SCROLL LDA SCREEN+$03E7
  764. PHA ;SAVE RIGHT MOST CHAR
  765. LDX #$00
  766. LOOP69 LDA SCREEN+$3C1,X ;GET CHAR 1 SPACE TO THE RIGHT
  767. STA SCREEN+$03C0,X ;STORE 1 TO THE LEFT
  768. INX
  769. CPX #$27 ;MOVE 39 CHARS
  770. BNE LOOP69
  771. PLA ;GET MOST RIGHT CHAR
  772. LDX VICII+$12 ;GET RANDOM #
  773. BMI LOOP70
  774. CMP #$47 ;MAX LINE LEVEL
  775. BEQ LOOP71
  776. INC SCREEN+$03E7 ;LOWER LINE
  777. RTS
  778. LOOP70 CMP #$40 ;MIN LINE LEVEL
  779. BEQ LOOP71
  780. DEC SCREEN+$03E7 ;RAISE LINE
  781. RTS
  782. LOOP71 STA SCREEN+$03E7
  783. RTS
  784. ;
  785. ;UPDATE AND DISPLAY SCORE
  786. ;SET X FOR LOW 2 DIGITS AND Y FOR MIDDLE 2 DIGITS
  787. ;
  788. SCORE SED ;ADDITION IN DECIMAL
  789. CLC
  790. TXA
  791. ADC SC ;ADD DIGITS 0&1
  792. STA SC
  793. LDA #$00
  794. ADC SC+1 ;ADD CARRY
  795. STA SC+1
  796. TYA
  797. ADC SC+1 ;ADD DIGITS 2&3
  798. STA SC+1
  799. LDA #$00
  800. ADC SC+2 ;ADD CARRY
  801. STA SC+2
  802. CLD ;BACK TO BINARY
  803. LDX #$00
  804. LDY #$06
  805. LOOP72 LDA SC,X
  806. PHA ;SAVE DIGITS
  807. AND #$0F ;GET RIGHT DIGIT
  808. CLC
  809. ADC #$30 ;ADD SCREEN CODE FOR '0'
  810. STA SCREEN+$05,Y
  811. DEY
  812. PLA
  813. LSR A ;
  814. LSR A ; GET LEFT DIGIT
  815. LSR A ;
  816. LSR A ;
  817. CLC
  818. ADC #$30 ;ADD '0' SCREEN CODE
  819. STA SCREEN+$05,Y
  820. DEY
  821. INX
  822. CPX #$03 ;3 DIGIT PAIRS
  823. BNE LOOP72
  824. LDA SC+2
  825. CMP LEVEL
  826. BNE LOOP73
  827. INC LEVEL ;INCREASE LEVEL
  828. INC SCREEN+$13 ;DISPLAY NEW LEVEL
  829. INC NUMTNK ;BONUS TANK
  830. LDX NUMTNK
  831. LDA #$48 ;TANK CHAR
  832. STA SCREEN+$1A,X ;DISPLAY TANKS
  833. LDA #$05 ;GREEN
  834. STA COLMEM+$1A,X ;SET COLOR
  835. LOOP73 RTS
  836. ;
  837. ;END GAME
  838. ;
  839. ENDGAM LDA #%01000001
  840. STA VICII+$15 ;TURN ALL SPRITES OFF, BUT EXPLOSIONS
  841. JSR LOOP17 ;KILL MISSLE
  842. JSR LOOP28 ;KILL UFO1
  843. JSR LOOP37 ;KILL UFO2
  844. JSR LOOP44 ;KILL BOMB1
  845. JSR LOOP52 ;KILL BOMB2
  846. LDA #$17
  847. STA SPRPTR+1 ;SET SPRITE POINTER FOR GAME OVER SPRITE
  848. LDA VICII+$10 ;GET X MSB
  849. AND #%11111101 ;CLEAR
  850. STA VICII+$10
  851. LDA #$A1
  852. STA VICII+2 ;SET X
  853. LDA #$22
  854. STA VICII+3 ;SET Y
  855. LDA #%00000010
  856. STA VICII+$1D ;EXPAND X
  857. LDA #%00000010
  858. ORA VICII+$15
  859. STA VICII+$15 ;TURN ON SPRITE
  860. LDA #$00
  861. PHA ;SET UP COLOR READ
  862. LOOP86 LDX #$0B ;CURSOR Y POS
  863. LDY #$0C ;CURSOR X POS
  864. CLC ;SET FOR PLOT
  865. JSR PLOT ;PLOT CURSOR
  866. PLA
  867. TAX
  868. LDA EGCOLR,X
  869. STA CCOLOR ;SET CURSOR COLOR
  870. STA VICII+$28 ;SET SPRITE COLOR
  871. INX
  872. CPX #$10 ;16 COLORS
  873. BNE LOOP85
  874. LDX #$00
  875. LOOP85 TXA
  876. PHA ;SAVE COLOR READ POSITION
  877. LDX #$00
  878. LOOP81 LDA EGTEXT,X ;GET LETTER
  879. JSR PRINT ;DISPLAY
  880. INX
  881. CPX #$10
  882. BNE LOOP81
  883. LDA #$0C ;MASTER TIME DELAY
  884. LOOP87 PHA
  885. LDA #$00 ;SECONDARY TIME DELAY
  886. LOOP84 PHA
  887. JSR GETIN ;GET CHAR FROM KEYBOARD
  888. CMP #$85 ;F1 KEY
  889. BNE LOOP83
  890. PLA ;GET MASTER TIME DELAY
  891. PLA ;GET TIME DELAY
  892. PLA ;GET COLOR READ
  893. LDA #$00
  894. STA VICII+$1D
  895. JMP REPLAY ;RE-START GAME
  896. LOOP83 PLA ;GET TIME DELAY
  897. TAX
  898. DEX ;COUNT DOWN TO 0
  899. TXA
  900. BNE LOOP84
  901. INC VICII+3 ;MOVE DOWN SCREEN
  902. LDA VICII+3 ;GET G/O SPRITE Y POS
  903. CMP #$F5 ;BOTTOM OF SCREEN?
  904. BNE LOOP88
  905. LDA #$22 ;TOP OF SCREEN
  906. LOOP88 STA VICII+3
  907. PLA
  908. TAX
  909. DEX ;COUNT DOWN TO 0
  910. TXA
  911. BNE LOOP87
  912. JMP LOOP86
  913. ;
  914. ;TITLE SCREEN
  915. ;
  916. TITLE LDA #$00 ;BORDER COLOR
  917. STA VICII+$20
  918. STA VICII+$21
  919. LDA #$0E ;LT. BLUE
  920. STA CCOLOR ;SET CURSOR COLOR
  921. LDA #$93 ;CLEAR SCREEN
  922. JSR PRINT
  923. LDA #$57 ;TOP LEFT CORNER
  924. STA SCREEN
  925. LDA #$58 ;TOP RIGHT CORNER
  926. STA SCREEN+$27
  927. LDA #$59 ;BOTTOM LEFT CORNER
  928. STA SCREEN+$3C0
  929. LDA #$5A ;BOTTOM RIGHT CORNER
  930. STA SCREEN+$3E7
  931. LDX #$00 ;DRAW TOP AND BOTTOM LINES
  932. LOOP90 LDA #$5D ;TOP LINE
  933. STA SCREEN+$01,X
  934. LDA #$5E ;BOTTOM LINE
  935. STA SCREEN+$3C1,X
  936. INX
  937. CPX #$26 ;38 CHARS
  938. BNE LOOP90
  939. LDA #>SCREEN ;GET MSB OF SCREEN MEM
  940. STA INDEX+1
  941. LDA #$28
  942. STA INDEX ;SECOND LINE FROM TOP
  943. LDX #$17 ;24 LINES
  944. LOOP91 LDY #$00
  945. LDA #$5B ;LEFT LINE
  946. STA (INDEX),Y
  947. LDY #$27
  948. LDA #$5C ;RIGHT LINE
  949. STA (INDEX),Y
  950. CLC
  951. LDA INDEX
  952. ADC #$28
  953. STA INDEX
  954. LDA INDEX+1
  955. ADC #$00 ;ADD CARRY
  956. STA INDEX+1
  957. DEX
  958. BNE LOOP91
  959. LDX #$00 ;PRINT TITLE INFO
  960. LOOP93 LDA TTEXT,X
  961. BNE LOOP92 ;PRINT OR PLOT? 0=PLOT
  962. INX
  963. LDA TTEXT,X
  964. PHA
  965. INX
  966. LDA TTEXT,X
  967. STX INDEX
  968. TAY
  969. PLA
  970. TAX
  971. CLC
  972. JSR PLOT ;PLOT CURSOR
  973. LDX INDEX
  974. INX
  975. JMP LOOP93
  976. LOOP92 JSR PRINT
  977. INX
  978. CPX #$C9
  979. BNE LOOP93
  980. LOOP94 JSR GETIN ;CHECK FOR F1 KEY
  981. CMP #$85
  982. BNE LOOP94
  983. RTS
  984. ;
  985. ;VARIABLES AND DATA USED BY SUBROUTINES
  986. ;
  987. RTSCN .BYTE 0 ;IRQ ROUTINE SCANER
  988. RTNUM .BYTE 0,0,0,0 ;ZERO ALL 4 REGS
  989. COLREG .BYTE 0 ;STORAGE FOR SPRITE TO SPRITE COLLISION REG
  990. MLOOP .BYTE 0 ;MISSLE LOOP
  991. TNKEXP .BYTE 0 ;TANK EXPLODING?
  992. FIRTGL .BYTE 0 ;MISSLE FIERED? 0=NO 1=YES
  993. NUMTNK .BYTE 0 ;# OF TANKS LEFT
  994. LEVEL .BYTE 0
  995. UFODIR .BYTE 0 ;DIRECTION OF UFO USED IN INITILIZATION
  996. XPOS .BYTE 0 ;X POSITION OF UFO USED IN INITILIZATION
  997. YPOS .BYTE 0 ;Y POSITION OF UFO USED IN INITILIZATION
  998. INITU1 .BYTE 0 ;UFO1 INITILIZED? 0=NO 1=YES
  999. U1DIR .BYTE 0 ;DIRECTION OF UFO1
  1000. BD1 .BYTE 0 ;BOMB1 DROPED?
  1001. INITU2 .BYTE 0 ;UFO2 INITILIZED?
  1002. U2DIR .BYTE 0 ;UFO2 DIRECTION
  1003. BD2 .BYTE 0 ;BOMB2 DROPED?
  1004. INITB1 .BYTE 0 ;BOMB1 INITILIZED?
  1005. B1FREQ .BYTE 0 ;BOMB1 FREQ
  1006. INITB2 .BYTE 0 ;BOMB2 INITILIZED?
  1007. B2FREQ .BYTE 0 ;BOMB2 FREQ
  1008. EXPFRQ .BYTE 0 ;UFO EXPLOSION FREQ
  1009. TNKSND .BYTE 0 ;TANK EXPLOSION FREQ
  1010. SC .BYTE 0,0,0 ;6 DIGIT SCORE
  1011. TIMER1 .BYTE 0,11,12,11,12,15,12,15,1
  1012. TIMER2 .BYTE 0,$16,$16,$15,$15,$14,$14
  1013. TIMER3 .BYTE 0,$16,$16,$16,$16,$16,$15,$15,$15,$15,$15,$14,$14,$14,$14,$14
  1014. EXPCLR .BYTE 0,$11,$11,$12,$12,$15,$15,$01,$01,$0A,$0A,$02,$0A,$02,$0A,$02
  1015. NAME .BYTE 'CHRSPR.DAT'
  1016. SDATA .BYTE $93,$05,'SCORE:000000',$9F,' LEVEL:1',$1E,' TANKS:',$C8,$C8,$C8
  1017. SPRTBL .BYTE $10,$11,$12,$12,$13,$13,$14,$14
  1018. SPCOLR .BYTE $05,$01,$04,$0E,$01,$01,$01,$01
  1019. EGTEXT .BYTE 'PRESS F1 TO PLAY'
  1020. EGCOLR .BYTE $09,$02,$08,$0A,$01,$05,$0D,$01,$06,$0E,$03,$01,$0B,$0C,$0F
  1021. .BYTE $01
  1022. TTEXT .BYTE 0,3,12,96,97,98,99,100,101,102,103,103,103,102,101,100,99,98
  1023. .BYTE 97,96,0,4,12,105,106,107,107,117,109,32,110,109,106,32,106,108,108
  1024. .BYTE 106,105,111,0,5,12,112,113,110,110,117,114,32,113,115,113,32
  1025. .BYTE 116,117,117,116,112,118,0,6,12,103,102,101,100,99,98,97,96,96,96
  1026. .BYTE 97,98,99,100,101,102,103,0,9,15,150,'V1.0/100186'
  1027. .BYTE 0,12,11,5,172,' 1986 '
  1028. .BYTE 127,160,161,162,163,164,165,166,167,168,169,170,171
  1029. .BYTE 0,15,2,159,'YOU ARE BEING INVADED BY THE COMMIES'
  1030. .BYTE 0,18,11,'CAN YOU STOP THEM?',0,21,11,05,'PRESS F1 TO START'
  1031. .END
  1032.