0110 ; 0120 ; Asteroid Field Initializer 0130 ; -------------------------- 0140 ; Initialize pointers 0150 ; ------------------- 0160 ; 0170 LDGRRT LDA # ASTR ;asteroid right 0210 STA GRPAGE+1 ;field addr hi 0220 LDA #PAGES ;# of 256 byte 0230 STA TEMP+2 ;blocks to move 0240 RTS ;return 0250 ; 0260 ; Generate Asteroid Field Bytes 0270 ; ----------------------------- 0280 ; 0290 RANWRD LDA #2 ;# 4-bit nibbles 0300 STA TEMP ;save counter 0310 RANW0 CPX RANDOM ;with density 0320 ROL TEMP+1 ;carry to bit 0 0330 ASL TEMP+1 ;to bit 1 0340 ASL TEMP+1 ;to bit 2 0350 ASL TEMP+1 ;to bit 3 0360 DEC TEMP ;nibble count 0370 BNE RANW0 ;byte done? No. 0380 LDA TEMP+1 ;move byte to 0390 STA (GRPAGE),Y ;graphic area 0400 RTS ;return 0410 ; 0420 ; Fill Workspace With Graphics 0430 ; ---------------------------- 0440 ; 0450 RANFIL JSR LDGRRT ;init pointers 0460 ASL TEMP+2 ;blocks times 2 0470 LDX DENS ;get density 0480 RANF0 JSR RANWRD ;make starfield 0490 INY ;inc block index 0500 BNE RANF0 ;block done? No. 0510 INC GRPAGE+1 ;inc page pntr 0520 DEC TEMP+2 ;dec block cntr 0530 BNE RANF0 ;done? No. 0540 ; 0550 ; Shift ASTR Space To Right 0560 ; ------------------------- 0570 ; 0580 DEC GRPAGE+1 ;dec page pntr 0590 LDA #PAGES ;get block count 0600 STA TEMP+2 ;store count 0610 RANF1 DEY ;dec index 0620 LDA (GRPAGE),Y ;asteroid byte 0630 LSR A ;force to odd 0640 STA (GRPAGE),Y ;replace byte 0650 TYA ;exam index 0660 BNE RANF1 ;index=0? No. 0670 DEC GRPAGE+1 ;back up pntr 0680 DEC TEMP+2 ;decrement count 0690 BNE RANF1 ;Done? No. 0700 RTS ;return 0710 ; 0720 ; Ship Scoring Routine 0730 ; -------------------- 0740 ; 0750 SCORE LDY #10 ;clr top 16 bytes 0760 SC0 STA PM0,Y ;of player 0 0770 STA PM1,Y ;and player 1 0780 DEY ;decrement index 0790 BPL SC0 ;done? No. 0800 LDA XSTRT,X ;start position 0810 STA XPLR,X ;to player pos 0820 STA HPOSP0,X ;set hardware 0830 SCOREM TXA ;save X to Acc 0840 PHA ;push Acc 0850 LDA SCPNT,X ;score Y pos 0860 TAX ;use as index 0870 INC TRAM,X ;increment score 0880 LDA TRAM,X ;get score byte 0890 CMP #N0C+10 ;value over 9? 0900 BCC SC1 ;No. skip 0910 LDA #N0C ;get zero char 0920 STA TRAM,X ;to 1's position 0930 INC TRAM-1,X ;inc 10's pos 0940 SC1 PLA ;pull Acc 0950 TAX ;get X indx back 0960 LDA SCNOTE,X ;score sound 0970 STA AUDF3 ;set frequency 0980 LDA #$AE ;loud sound 0990 STA AUDC3 ;set volume 1000 LDA #3 ;value for 1010 STA SCLOCK ;sound duration 1020 DEC SCORES,X ;dec max score 1030 BNE SC2 ;from 99 to zero 1040 LDA #0 ;99 points so 1050 STA ENDGAM ;end the game 1060 SC2 LDA #$FF ;value to return 1070 STA HITCLR ;clear collision 1080 RTS ;return 1090 ; 1100 ; Ship Graphics Rotation 1110 ; ---------------------- 1120 ; 1130 ROTOR TXA ;move X to Acc 1140 PHA ;save X 1150 LDA CLOCK ;get clock 1160 ROR A ;test bit 0 1170 BCS RT2 ;bit=1? Yes. 1180 DEC ROTATE ;rotation index 1190 BPL RT1 ;rotate<0? No. 1200 LDA #2 ;reset value for 1210 STA ROTATE ;rotation index 1220 RT1 LDX ROTATE ;get index 1230 LDA ROTMSK,X ;spinner graphic 1240 STA SHIPS+12 ;saucer section 1250 AND #$3C ;mask for rocket 1260 STA SHIPS+2 ;rocket upper 1270 LDA ROTMSK+1,X ;next seq 1280 AND #$3C ;mask for rocket 1290 STA SHIPS+3 ;rocket lower 1300 LDA CLOCK ;get clock again 1310 AND #$0E ;missile mask 1320 TAX ;use as index 1330 LDA MISIMA,X ;missile image 1340 STA MIMAGE+1 ;image buffer 1350 LDA MISIMA+1,X ;missile pic+1 1360 STA MIMAGE+2 ;image buffer+1 1370 RT2 PLA ;pull Acc 1380 TAX ;restore X 1390 RTS ;return 1400 ; 1410 ; Countdown Timer Handler 1420 ; ----------------------- 1430 ; 1440 TIMER DEC TRAM+24 ;1/10 sec timer 1450 BPL TMX ;time up? No. 1460 LDA #5 ;Yes. value to 1470 STA TRAM+24 ;reset timer 1480 LDA SCLOCK ;tic sound clock 1490 BEQ RT3 ;tic done? Yes. 1500 DEC SCLOCK ;dec tic clock 1510 JMP RT4 ;continue 1520 ; 1530 RT3 STA AUDC3 ;tic sound off 1540 RT4 DEC TRAM+12 ;1/10 sec displa 1550 DEC TRAM+23 ;1/10 sec cntr 1560 BPL TMX ;1 sec done? No. 1570 LDA #N7C+$C9 ;value to reset 1580 STA TRAM+12 ;1/10 sec displa 1590 LDA #9 ;value to reset 1600 STA TRAM+23 ;1/10 sec cntr 1610 LDA SCLOCK ;sound clock 1620 BNE RT5 ;in use? Yes. 1630 LDA #$A4 ;value for 1640 STA AUDC3 ;pure tone 1650 LDA #$40 ;value for 1660 STA AUDF3 ;medium freq 1670 RT5 DEC TRAM+10 ;one's display 1680 DEC TRAM+22 ;one's counter 1690 BPL TMX ;10 sec up? No. 1700 LDA #N7C+$C9 ;value to reset 1710 STA TRAM+10 ;one's display 1720 LDA #9 ;value to reset 1730 STA TRAM+22 ;one's counter 1740 DEC TRAM+9 ;ten's display 1750 DEC TRAM+21 ;ten's counter 1760 BPL TMX ;minute up? No. 1770 LDA #N7C+$C5 ;value to reset 1780 STA TRAM+9 ;ten's display 1790 LDA #5 ;value to reset 1800 STA TRAM+21 ;ten's counter 1810 DEC TRAM+7 ;minute display 1820 DEC TRAM+20 ;minute counter 1830 TMX PHP ;save flags 1840 LDA SCLOCK ;if score sound 1850 ORA COUNTR ;or missile 0/1 1860 ORA COUNTR+1 ;active? 1870 BNE TMXX ;Yes. skip next 1880 LDA DEAD ;either ship 0 1890 AND DEAD+1 ;or ship 1 1900 BEQ TMXX ;dead? Yes. 1910 LDA MISSLE ;OR flags for 1920 ORA MISSLE+1 ;projectiles 1930 BEQ TMXX ;any active? No. 1940 LDA #$28 ;projectile snd 1950 STA AUDC3 ;to hardware 1960 LDA CLOCK ;60 cycle clock 1970 LSR A ;make 30 cycles 1980 AND #$07 ;only 0..7 1990 ORA #8 ;8..15 2000 STA AUDF3 ;boomerang sound 2010 TMXX PLP ;restore flags 2020 RTS ;return 2030 ; 2040 ; Collision Handler 2050 ; ----------------- 2060 ; 2070 SMASH LDA M1PL ;missile 1 to 2080 AND #1 ;player 0 ship 2090 BNE HITP0 ;collision? Yes. 2100 LDA P0PF ;player 0 to 2110 AND #4 ;playfield 2 or 2120 ORA P0PL ;to any player 2130 BEQ PLR1 ;collision? No. 2140 LDA TRIGN ;trigger option 2150 CMP #1 ;shield in use? 2160 BEQ PLR1 ;Yes. ship safe 2170 HITP0 LDA #0 ;value for ship 2180 STA DEAD ;being shot down 2190 PLR1 LDA M0PL ;missile 0 to 2200 AND #2 ;player 1 ship 2210 BNE HITP1 ;collision? Yes. 2220 LDA P1PF ;player 1 to 2230 AND #4 ;playfield 2 or 2240 ORA P1PL ;to any player 2250 BEQ HITX ;collision? No. 2260 LDA TRIGN+1 ;trigger option 2270 CMP #1 ;shield in use 2280 BEQ HITX ;Yes. ship safe 2290 HITP1 LDA #0 ;value for ship 2300 STA DEAD+1 ;being shot down 2310 HITX RTS ;return 2320 ; 2330 ; Space Boomerang Handler 2340 ; ----------------------- 2350 ; 2360 MISFLY LDA MISSLE,X ;missile status 2370 BNE HITX ;active? Yes. 2380 LDA TRIGN,X ;trigger value 2390 CMP #2 ;shots enabled 2400 BEQ MISF ;Yes. continue 2410 STA TRIGS,X ;put shadow 2420 RTS ;return 2430 ; 2440 ; Set up Launch Coordinates 2450 ; ------------------------- 2460 ; 2470 MISF CMP TRIGS,X ;compare shadow 2480 BEQ HITX ;same? Yes. 2490 STA TRIGS,X ;put shadow 2500 STA MISSLE,X ;enable missile 2510 CLC ;clear carry 2520 LDA XPLR,X ;ship X coord 2530 ADC #2 ;get ship center 2540 STA OLDCOL ;X plot coord 2550 STA COLCRS,X ;shot current X 2560 LDA YPLR,X ;ship Y coord 2570 STA OLDROW ;Y plot coord 2580 INC OLDROW ;ship top 2590 STA ROWCRS,X ;shot current Y 2600 INC ROWCRS,X ;plot coord 2610 TXA ;player index 2620 BEQ MIS1 ;player 0? Yes. 2630 ; 2640 ; Player 0 is target 2650 ; ------------------ 2660 ; 2670 LDA XPLR ;enemy X coord 2680 ADC #2 ;ship center 2690 STA NEWCOL ;destination X 2700 LDA YPLR ;enemy Y coord 2710 JMP MIS2 ;skip next 2720 ; 2730 ; Player 1 is target 2740 ; ------------------ 2750 ; 2760 MIS1 LDA XPLR+1 ;enemy X coord 2770 ADC #2 ;ship center 2780 STA NEWCOL ;destination X 2790 LDA YPLR+1 ;enemy Y coord 2800 MIS2 STA NEWROW ;destination Y 2810 INC NEWROW ;ship top 2820 LDA #1 ;init value for 2830 STA ROWINC,X ;Y increment 2840 STA COLINC,X ;X increment 2850 SEC ;set carry 2860 LDA NEWROW ;Y to coord 2870 SBC OLDROW ;Y from coord 2880 STA DELTAR,X ;delta Y 2890 BCS MIS3 ;shot down? Yes. 2900 LDA #$FF ;value = -1 2910 STA ROWINC,X ;move up 2920 EOR DELTAR,X ;get absolute 2930 STA DELTAR,X ;value for 2940 INC DELTAR,X ;delta Y 2950 MIS3 SEC ;set carry 2960 LDA NEWCOL ;X to coord 2970 SBC OLDCOL ;X from coord 2980 STA DELTAC,X ;delta X 2990 BCS MIS4 ;to right? Yes. 3000 LDA #$FF ;value = -1 3010 STA COLINC,X ;move left 3020 EOR DELTAC,X ;get absolute 3030 STA DELTAC,X ;value for 3040 INC DELTAC,X ;delta X 3050 MIS4 LDA #0 ;init value for 3060 STA COLAC,X ;X accumulator 3070 STA ROWAC,X ;Y accumulator 3080 LDA DELTAC,X ;get delta X 3090 STA ENDPT,X ;line length 3100 LDA #$0F ;init value for 3110 STA COUNTR,X ;draw iteration 3120 LDA DELTAR,X ;get delta Y 3130 CMP ENDPT,X ;bigger than 3140 BCC MIS5 ;delta X? No. 3150 STA ENDPT,X ;store new value 3160 LSR A ;delta Y / 2 3170 STA COLAC,X ;X coord Acc 3180 RTS ;return 3190 ; 3200 MIS5 LDA ENDPT,X ;get delta X 3210 LSR A ;divide by 2 3220 STA ROWAC,X ;Y coord Acc 3230 RTS ;return