0100 ; 0110 ; DLI Routine 0120 ; ----------- 0130 ; 0140 DLIVEC PHA ;save Acc 0150 INC CLOCK ;increment clock 0160 LDA RTCLOK ;system clock 0170 ASL A ;times 2 0180 AND #$CE ;mask color 0190 STA PCOLR2 ;saucer color 0200 PLA ;restore Acc 0210 RTI ;return 0220 ; 0230 ; Console Checker 0240 ; --------------- 0250 ; 0260 CONC LDA CONSOL ;get console 0270 TAY ;to Y register 0280 EOR CONSAV ;only different 0290 AND CONSAV ;pressed keys 0300 STY CONSAV ;save current 0310 CMP #4 ;OPTION test 0320 RTS ;return 0330 ; 0340 ; Beep Routine 0350 ; ------------ 0360 ; 0370 BUZZER STA AUDF2 ;buzzer freq 0380 LDA #$A4 ;pure tone 0390 STA AUDC2 ;in tone 2 0400 LDY #$C0 ;beep counter 0410 BZ DEX ;decrement X 0420 BNE BZ ;zero yet? No. 0430 STX ATRACT ;poke attract 0440 DEY ;decrement Y 0450 BNE BZ ;tone done? No. 0460 STY AUDC2 ;Yes. turn off 0470 RTS ;return 0480 ; 0490 ; Flying Saucer Routine 0500 ; --------------------- 0510 ; 0520 DELAY LDX #0 ;get zero 0530 LDA #$A4 ;pure tone 0540 STA AUDC1 ;enable tone 1 0550 STA AUDC2 ;enable tone 2 0560 DL1 LDA #$12 ;1/5 sec count 0570 DL2 CMP CLOCK ;compare clock 0580 BNE DL2 ;match? No. 0590 JSR CONC ;check console 0600 BNE DL3 ;OPTION key? No. 0610 PLA ;Yes. pull RTS 0620 PLA ;addr from stack 0630 JMP STOPTS ;options menu 0640 DL3 LDA #0 ;get zero 0650 STA CLOCK ;init clock 0660 INX ;inc saucer pos 0670 TXA ;move to Acc 0680 STA HPOSP3 ;move saucer 0690 AND #$FC ;window movement 0700 STA HPOSP2 ;do windows 0710 LSR A ;times 2 0720 LSR A ;times 4 0730 LSR A ;times 8 0740 TAY ;index to displa 0750 LDA PMSG,Y ;get text 0760 STA DRAM+313,Y ;on screen 0770 TXA ;saucer position 0780 ASL A ;times 2 0790 ASL A ;times 4 0800 ASL A ;times 8 0810 ASL A ;times 16 0820 ASL A ;times 32 whew! 0830 EOR #$F0 ;inverse hi bits 0840 STA AUDF1 ;saucer sound 0850 CLC ;clear carry 0860 ADC #2 ;weird sound 0870 STA AUDF2 ;with resonance 0880 TXA ;saucer position 0890 BNE DL1 ;off screen? No. 0900 STA AUDC2 ;sound 2 off 0910 STA VOLUME ;saucer volume 0920 RTS ;return 0930 ; 0940 ; Move All P/M Off Screen 0950 ; ----------------------- 0960 ; 0970 CLRPM LDX #7 ;8 objects 0-7 0980 LDA #0 ;zero position 0990 CPM STA HPOSP0,X ;move P/M 1000 DEX ;decrement count 1010 BPL CPM ;done? No. 1020 RTS ;return 1030 ; 1040 ; Turn Off All Sound 1050 ; ------------------ 1060 ; 1070 AUDOFF LDA #0 ;get zero 1080 STA AUDC1 ;sound 1 off 1090 STA AUDC2 ;sound 2 off 1100 STA AUDC3 ;sound 3 off 1110 STA AUDC4 ;sound 4 off 1120 RTS ;return 1130 ; 1140 ; Program Execution Starts Here 1150 ; ----------------------------- 1160 ; 1170 RIS LDA #$3C ;cassette off 1180 STA PACTL ;poke hardware 1190 LDA # DOT ;density hi 1220 STA SELPNT+1 ;select pnt hi 1230 LDA #0 ;init sound 1240 STA AUDCTL ;audio control 1250 LDX #YPLR+1-CONSAV 1260 I1 STA CONSAV,X ;zero flags 1270 DEX ;decrement index 1280 BPL I1 ;done? No. 1290 ; 1300 ; System Reset Returns Here 1310 ; ------------------------- 1320 ; 1330 INTRO LDA #$29 ;value to enable 1340 STA SDMCTL ;narrow playfld 1350 LDA #3 ;value to turn 1360 STA SKCTL ;off 2-tome mode 1370 LDA # >MRAM ;high byte of 1380 STA PMBASE ;P/M address 1390 LDA #2 ;value to 1400 STA GRACTL ;enable players 1410 LDA # DLIVEC ;DLI addr hi 1440 STA VDSLST+1 ;DLI vector hi 1450 LDA #$C0 ;value to 1460 STA NMIEN ;enable DLI's 1470 LDA # >CHARS ;addr of 1480 STA CHBAS ;character set 1490 LDA #$C6 ;value for 1500 STA COLOR1 ;medium green 1510 LDA #$94 ;value for 1520 STA COLOR2 ;dark blue 1530 LDA #$04 ;value for 1540 STA PCOLR3 ;dark grey 1550 LDA #1 ;value - player 1560 STA SIZEP2 ;double width 1570 STA SIZEP3 ;players set 1580 STA GPRIOR ;PL has priority 1590 JSR CLRPM ;remove PLayers 1600 STA REVF ;rev screen flag 1610 STA DIRSW ;sound direction 1620 JSR AUDOFF ;sound off 1630 TAX ;zero index 1640 I2 STA DRAM,X ;clear display 1650 STA DRAM+256,X ;page 2 1660 STA DRAM+512,X ;page 3 1670 STA MRAM+512,X ;player 2+3 1680 DEX ;decrement index 1690 BNE I2 ;done? No. 1700 LDX #7 ;move 8 bytes 1710 I3 LDA WINDOW,X ;saucer windows 1720 STA MRAM+$0228,X ;player 2 1730 LDA SAUCER,X ;saucer ship 1740 STA MRAM+$02A8,X ;player 3 1750 DEX ;decrement index 1760 BPL I3 ;saucer done? No. 1770 ; 1780 ; Print Text Onto Display 1790 ; ----------------------- 1800 ; 1810 PTITL INX ;increment index 1820 LDA TITLE,X ;get text 1830 BEQ STITL ;byte zero? Yes. 1840 TAY ;display index 1850 P2 INX ;inc text index 1860 LDA TITLE,X ;get text 1870 CMP #$FF ;EOL flag 1880 BEQ PTITL ;EOL? Yes. 1890 STA DRAM+256,Y ;on screen 1900 INY ;inc displa indx 1910 JMP P2 ;continue 1920 ; 1930 ; Scroll Text For Intro 1940 ; --------------------- 1950 ; 1960 STITL LDA # DISPI ;DL addr hi 1990 STA SDLSTL+1 ;DL pntr hi 2000 LDA # >DRAM ;screen top hi 2010 STA DADR+1 ;DL LMS hi 2020 LDA #0 ;get zero 2030 STA DADR ;DL LMS lo 2040 STA ATRACT ;poke attract 2050 STA VOLUME ;clear volume 2060 S1 LDA #$10 ;16/60 sec count 2070 S2 BIT CLOCK ;check clock 2080 BEQ S2 ;time up? No. 2090 JSR CONC ;console keys 2100 BNE S2A ;OPTION key? No. 2110 JMP STOPTS ;option menu 2120 S2A LDA #0 ;get zero 2130 STA CLOCK ;reset clock 2140 INC SLINE ;inc scroll cnt 2150 LDA SLINE ;scroll count 2160 CLC ;clear carry 2170 ADC DADR ;screen addr lo 2180 EOR DIRSW ;sound direction 2190 STA AUDF1 ;rocket sound 2200 LDA SLINE ;scroll count 2210 AND #7 ;use only 0..7 2220 ADC #SMK+$C0 ;smoke offset 2230 STA DRAM+518 ;put below both 2240 STA DRAM+521 ;rocket ships 2250 ADC #8 ;botm smk offset 2260 STA DRAM+534 ;put below top 2270 STA DRAM+537 ;smoke of ships 2280 LDA SLINE ;scroll count 2290 CMP #16 ;check overflow? 2300 BNE S3 ;No. continue 2310 LDA #0 ;get zero 2320 STA SLINE ;reset count 2330 STA VSCROL ;vertical scroll 2340 INC VOLUME ;raise volume 2350 LDA DIRSW ;sound direction 2360 EOR VOLUME ;EOR with volume 2370 ORA #$80 ;rough sounding 2380 STA AUDC1 ;rocket sound 2390 LDA DADR ;DL LMS lo 2400 CLC ;clear carry 2410 ADC #16 ;line width 2420 STA DADR ;new DL LMS lo 2430 BCC S3 ;overflow? No. 2440 INC DADR+1 ;inc LMS hi 2450 LDA #2+ >DRAM ;cmp scrn end 2460 CMP DADR+1 ;with LMS hi 2470 BNE S4 ;at end? No. 2480 JMP INTRO ;Yes. do intro 2490 S4 JSR DELAY ;flying saucer 2500 LDA #$20 ;value for 2510 STA AUDF1 ;reset frequency 2520 LDA #$8F ;full volume 2530 STA AUDC1 ;reset tone 2540 LDA #$0F ;reverse sound 2550 STA DIRSW ;sound direction 2560 S3 LDA SLINE ;scroll count 2570 STA VSCROL ;vertical scroll 2580 JMP S1 ;continue 2590 ; 2600 ; Game Option Menu Routine 2610 ; ------------------------ 2620 ; 2630 STOPTS LDA CLOCK ;allow one VBLANK 2640 STP CMP CLOCK ;period to go by 2650 BEQ STP ;before start 2660 LDA #$21 ;value for 2670 STA SDMCTL ;narrow playfld 2680 LDA # DISPO ;DL addr hi 2710 STA SDLSTL+1 ;displa list hi 2720 JSR SCRCLR ;clr inv Univ 2730 JSR CLRPM ;clear players 2740 STA ATRACT ;poke attract 2750 STA GRACTL ;no players 2760 JSR AUDOFF ;sound off 2770 STA FLASHF ;clr flash flag 2780 STA REVF ;clr inv flag 2790 LDA #$94 ;color value for 2800 STA COLOR2 ;medium blue 2810 LDA #4 ;five notes 0-4 2820 STA TEMP+3 ;same index 2830 STS LDX TEMP+3 ;get index 2840 LDA CE3K,X ;get color 2850 STA COLOR1 ;change color 2860 LDA CE3KN,X ;get note 2870 JSR BUZZER ;play note 2880 DEC TEMP+3 ;dec index 2890 BPL STS ;done? No. 2900 ST1 LDA CH ;check keyboard 2910 AND #$3F ;mask CTRL/SHIFT 2920 LDX #9 ;check for 0-9 2930 ST1A CMP NUMMSK-1,X ;cmp keycode 2940 BEQ ST1B ;numeric? Yes. 2950 DEX ;decrement index 2960 BNE ST1A ;done? No. 2970 BEQ ST1C ;Yes. continue 2980 ST1B TXA ;index is number 2990 STA TRAMN ;store time 3000 CLC ;clear carry 3010 ADC #N0C+$80 ;display offset 3020 STA TIMOPT ;show time opt 3030 TXA ;number again 3040 ADC #N7C+$C0 ;2nd char set 3050 STA TRAMC ;game score line 3060 LDA #$FF ;clear the 3070 STA CH ;keyboard buffer 3080 TXA ;number again 3090 ASL A ;times 2 3100 ASL A ;times 4 3110 EOR #$3F ;inverse here to 3120 JSR BUZZER ;number sound 3130 ST1C JSR CONC ;check console 3140 LSR A ;check START key 3150 BCC ST2 ;START key? No. 3160 JMP PLAYGM ;Yes. play game 3170 ; 3180 ; SELECT Key Handler 3190 ; ------------------ 3200 ; 3210 ST2 LSR A ;check SELECT 3220 BCC ST3 ;SELECT key? No. 3230 LDA #$30 ;Yes. do SELECT 3240 JSR BUZZER ;key noise 3250 LDX OPTION ;opt to change 3260 INC TRIG,X ;inc option byte 3270 LDA TRIG,X ;get option byte 3280 AND SELMSK,X ;mask overflow 3290 STA TRIG,X ;save opt byte 3300 ORA SOFSET ;SELECT offset 3310 ASL A ;times 2 3320 TAX ;use as X index 3330 LDY #0 ;zero Y index 3340 LDA MADR,X ;text addr lo 3350 STA (SELPNT),Y ;LMS byte lo 3360 INY ;inc Y index 3370 LDA MADR+1,X ;text addr hi 3380 STA (SELPNT),Y ;LMS byte hi 3390 JMP ST1 ;continue 3400 ; 3410 ; OPTION Key Handler 3420 ; ------------------ 3430 ; 3440 ST3 LSR A ;check OPTION 3450 BCC ST1 ;OPTION key? No. 3460 LDA #$10 ;Yes. do OPTION 3470 JSR BUZZER ;key sound 3480 LDX #1 ;reset text flag 3490 ST4 STX OPTSW ;option switch 3500 LDA OPTION ;option counter 3510 ASL A ;times 2 3520 ASL A ;times 4 3530 ASL A ;times 8 3540 ASL A ;times 16 3550 TAX ;use as index 3560 LDY #13 ;do 14 bytes 3570 ST4A LDA #$80 ;get sign bit 3580 EOR OL2+1,X ;flip sign 3590 STA OL2+1,X ;save byte 3600 INX ;increment index 3610 DEY ;decrement count 3620 BPL ST4A ;done? No. 3630 LDA OPTSW ;option switch 3640 BNE ST4B ;flipping done? 3650 JMP ST1 ;Yes. continue 3660 ST4B INC OPTION ;inc option cntr 3670 LDA OPTION ;option counter 3680 ASL A ;times 2 3690 TAX ;use as index 3700 LDA LADR-2,X ;DL LMS addr lo 3710 STA SELPNT ;select pntr lo 3720 LDA LADR-1,X ;DL LMS addr hi 3730 STA SELPNT+1 ;select pntr hi 3740 LDX OPTION ;option counter 3750 LDA SELMS2,X ;offset table 3760 ADC SOFSET ;present offset 3770 STA SOFSET ;new offset 3780 LDX #0 ;get zero 3790 LDA OPTION ;option counter 3800 CMP #5 ;range: 0..4 3810 BNE ST4 ;overflow? No. 3820 STX OPTION ;reset counter 3830 STX SOFSET ;reset offset 3840 JMP ST4 ;continue