0100 ; 0110 ; File: PLANET1.M65 0120 ; 0130 .OPT NO LIST 0140 ; ------------------ 0150 ; ANALOG Computing's 0160 ; PLANETARY DEFENSE 0170 ; ------------------ 0180 ; 0190 ; by Charles Bachand 0200 ; and Tom Hudson 0210 ; 0220 ; Written with OSS MAC/65 0230 ; 0240 ; ------------------ 0250 ; Hardware Registers 0260 ; ------------------ 0270 ; 0280 HPOSP0 = $D000 ;P0 horizontal 0290 HPOSM0 = $D004 ;M0 horizontal 0300 P0PF = $D004 ;P0-PField coll. 0310 M0PL = $D008 ;M0-PLayer coll. 0320 GRAFP0 = $D00D ;PM graphics 0330 COLPF0 = $D016 ;PF color 0 0340 GRACTL = $D01D ;graphic control 0350 HITCLR = $D01E ;clear hit reg 0360 CONSOL = $D01F ;console buttons 0370 AUDF1 = $D200 ;frequency 1 0380 AUDC1 = $D201 ;volume 1 0390 AUDCTL = $D208 ;audio control 0400 RANDOM = $D20A ;random numbers 0410 DMACTL = $D400 ;DMA control 0420 PMBASE = $D407 ;PM base address 0430 WSYNC = $D40A ;wait hor. sync 0440 NMIEN = $D40E ;interrupt reg. 0450 ATRACT = $4D ;attract flag 0460 ; 0470 ; ------------------------ 0480 ; Operating System Vectors 0490 ; ------------------------ 0500 ; 0510 SETVBV = $E45C ;set v.blank 0520 XITVBV = $E462 ;exit v.blank 0530 SIOINV = $E465 ;serial I/O init 0540 ; 0550 ; ---------------- 0560 ; Shadow Registers 0570 ; ---------------- 0580 ; 0590 VDSLST = $0200 ;DLI vector 0600 SDMCTL = $022F ;DMA control 0610 SDLSTL = $0230 ;DList pointer 0620 GPRIOR = $026F ;gr. priority 0630 PADDL0 = $0270 ;paddle 0 0640 PADDL1 = $0271 ;paddle 1 0650 STICK0 = $0278 ;joystick 0 0660 PTRIG0 = $027C ;paddle trig 0 0670 PTRIG1 = $027D ;paddle trig 1 0680 STRIG0 = $0284 ;stick trig 0 0690 PCOLR0 = $02C0 ;player colors 0700 COLOR0 = $02C4 ;playfield " 0710 CH = $02FC ;keyboard char 0720 ; 0730 ; ------------------- 0740 ; Page Zero Registers 0750 ; ------------------- 0760 ; 0770 *= $80 ;top of page 0 0780 ; 0790 INDEX *= *+2 ;temp index 0800 INDX1 *= *+2 ;temp index 0810 INDX2 *= *+2 ;temp index 0820 COUNT *= *+1 ;temp register 0830 TEMP *= *+1 ;temp register 0840 SATEMP *= *+1 ;temp register 0850 SCNT *= *+1 ;orbit index 0860 LO *= *+1 ;plot low byte 0870 HI *= *+1 ;plot high byte 0880 DEADTM *= *+1 ;death timer 0890 EXPTIM *= *+1 ;explosion timer 0900 BOMTIM *= *+1 ;bomb timer 0910 SATPIX *= *+1 ;sat. pic cntr 0920 CURX *= *+1 ;cursor x 0930 CURY *= *+1 ;cursor y 0940 FROMX *= *+1 ;vector from X 0950 FROMY *= *+1 ;vector from Y 0960 TOX *= *+1 ;vector to X 0970 TOY *= *+1 ;vector to Y 0980 SATX *= *+1 ;satellite x 0990 SATY *= *+1 ;satellite y 1000 XHOLD *= *+1 ;x reg hold area 1010 LASTRG *= *+1 ;last trigger 1020 LEVEL *= *+1 ;level number 1030 BLEVEL *= *+1 ;binary level # 1040 LIVES *= *+1 ;lives left 1050 SCORE *= *+3 ;score digits 1060 SCOADD *= *+3 ;score inc. 1070 SHOBYT *= *+1 ;digit hold 1080 SHCOLR *= *+1 ;digit color 1090 SATLIV *= *+1 ;satellite flag 1100 BOMVL *= *+1 ;bomb value low 1110 BOMVH *= *+1 ;bomb value high 1120 SAUVAL *= *+1 ;saucer value 1130 GAMCTL *= *+1 ;game ctrl flag 1140 DLICNT *= *+1 ;DLI counter 1150 SAUCER *= *+1 ;saucer flag 1160 SAUTIM *= *+1 ;image timer 1170 SAUCHN *= *+1 ;saucer chance 1180 BOMBWT *= *+1 ;bomb wait time 1190 BOMCOL *= *+1 ;bomb collis flg 1200 DEVICE *= *+1 ;koala pad sw 1210 PLNCOL *= *+1 ;planet color 1220 PAUSED *= *+1 ;pause flag 1230 AVG *= *+2 ;average 1240 PTR *= *+2 ;queue pointer 1250 SSSCNT *= *+1 ;saucer snd cnt 1260 EXSCNT *= *+1 ;expl. snd count 1270 ESSCNT *= *+1 ;enemy shot snd 1280 PSSCNT *= *+1 ;player shot snd 1290 TITLE *= *+1 ;title scrn flag 1300 PENFLG *= *+1 ;pen up/dwn flg 1310 EXPCNT *= *+1 ;explosion counter 1320 NEWX *= *+1 ;explosion x 1330 NEWY *= *+1 ;explosion y 1340 PLOTCLR *= *+1 ;plot/erase flag 1350 COUNTR *= *+1 ;explosion index 1360 PLOTX *= *+1 ;plot x coord 1370 PLOTY *= *+1 ;plot y coord 1380 HIHLD *= *+1 ;plot work area 1390 LOHLD *= *+1 ;plot work area 1400 BOMBS *= *+1 ;bombs to come 1410 BOMTI *= *+1 ;bomb speeds 1420 VXINC *= *+1 ;vector x hold 1430 VYINC *= *+1 ;vector y hold 1440 LR *= *+1 ;vector left/right hold 1450 UD *= *+1 ;vector up/down hold 1460 DELTAX *= *+1 ;vector work area 1470 DELTAY *= *+1 ;vector work area 1480 XQ *= *+5 ;x queue 1490 YQ *= *+5 ;y queue 1500 SL *= *+5 ;samples lo 1510 SH *= *+5 ;samples hi 1520 ; 1530 ; ---------------------------- 1540 ; Screen + Player/Missile Area 1550 ; ---------------------------- 1560 ; 1570 SCRN = $3000 ;screen area 1580 PPOS = SCRN+1935 ;planet pos 1590 ; 1600 PM = $00 1610 MISL = PM+$0300 ;missiles 1620 PLR0 = MISL+$0100 ;player 0 1630 PLR1 = PLR0+$0100 ;player 1 1640 PLR2 = PLR1+$0100 ;player 2 1650 PLR3 = PLR2+$0100 ;player 3 1660 ; 1670 ORBX = $1E00 ;orbit X 1680 ORBY = $1F00 ;orbit Y 1690 ; 1700 ; ------------- 1710 ; Start of game 1720 ; ------------- 1730 ; 1740 *= $2000 1750 ; 1760 ; ------------------ 1770 ; Intro Display List 1780 ; ------------------ 1790 ; 1800 TLDL .BYTE $70,$70,$70,$70 1810 .BYTE $70,$70,$70,$70 1820 .BYTE $70,$46 1830 .WORD MAGMSG 1840 .BYTE $70,7,$70,6 1850 .BYTE $10,6,$70,$70 1860 .BYTE 6,$20,6,$40 1870 .BYTE 6,$41 1880 .WORD TLDL 1890 ; 1900 ; ------------------ 1910 ; Intro Message Text 1920 ; ------------------ 1930 ; 1940 MAGMSG .SBYTE " ANALOG CO" 1950 .SBYTE "MPUTING'S " 1960 .SBYTE +$40," PLANETARY" 1970 .SBYTE +$40," DEFENSE " 1980 .SBYTE +$80," BY CHARLE" 1990 .SBYTE +$80,"S BACHAND " 2000 .SBYTE +$C0," AND TOM" 2010 .SBYTE +$C0," HUDSON " 2020 .SBYTE +$40," KOALA PAD" 2030 .SBYTE +$40," - SELECT " 2040 .SBYTE +$C0," JOYSTICK " 2050 .SBYTE +$C0,"--- START " 2060 .SBYTE " OR PRESS" 2070 .SBYTE " TRIGGER " 2080 ; 2090 ; ----------------- 2100 ; Game Display List 2110 ; ----------------- 2120 ; 2130 GLIST .BYTE $70,$70,$46 2140 .WORD SCOLIN 2150 .BYTE $4D 2160 .WORD SCRN 2170 .BYTE $8D,$8D,$8D,$8D 2180 .BYTE $8D,$8D,$8D,$8D 2190 .BYTE $8D,$8D,$8D,$8D 2200 .BYTE $8D,$8D,$8D,$8D 2210 .BYTE $8D,$8D,$8D,$8D 2220 .BYTE $8D,$8D,$8D,$8D 2230 .BYTE $8D,$8D,$8D,$8D 2240 .BYTE $8D,$8D,$8D,$8D 2250 .BYTE $8D,$8D,$8D,$8D 2260 .BYTE $8D,$8D,$8D,$8D 2270 .BYTE $8D,$8D,$8D,$8D 2280 .BYTE $8D,$8D,$8D,$8D 2290 .BYTE $8D,$8D,$8D,$8D 2300 .BYTE $8D,$8D,$8D,$8D 2310 .BYTE $8D,$8D,$8D,$8D 2320 .BYTE $8D,$8D,$8D,$8D 2330 .BYTE $8D,$8D,$8D,$8D 2340 .BYTE $8D,$8D,$8D,$8D 2350 .BYTE $8D,$8D,$8D,$8D 2360 .BYTE $8D,$8D,$8D,$8D 2370 .BYTE $8D,$8D,$8D,$8D 2380 .BYTE $8D,$8D,$8D,$8D 2390 .BYTE $8D,$8D,$8D,$8D 2400 .BYTE $8D,$8D,$8D,$41 2410 .WORD GLIST 2420 ; 2430 ; ------------------------ 2440 ; Display the Intro Screen 2450 ; ------------------------ 2460 ; 2470 PLANET CLD ;clear decimal 2480 LDA #$00 ;get zero 2490 STA NMIEN ;display off 2500 LDX #$7F ;set index 2510 CLPG0 STA $80,X ;clr top page 0 2520 DEX ;dec pointer 2530 BNE CLPG0 ;done? No. 2540 INC TITLE ;title on flag 2550 LDA #$FF ;get $FF 2560 STA LIVES ;set dead 2570 STA GAMCTL ;game control 2580 STA ESSCNT ;no enemy shots 2590 STA PSSCNT ;no player shots 2600 JSR SNDOFF ;no sound on 123 2610 STA AUDC1+6 ;turn off snd 4 2620 LDA #$C4 ;medium green 2630 STA COLOR0 ;score color 2640 LDA #$84 ;medium blue 2650 STA COLOR0+1 ;text color 2660 LDA #$0A ;bright white 2670 STA COLOR0+2 ;shot color 2680 LDA #$98 ;light blue 2690 STA COLOR0+3 ;text color 2700 LDA # DLI ;set DLI vector 2730 STA VDSLST+1 ;high byte 2740 LDA #$C0 ;enable Display 2750 STA NMIEN ;List Interrupts 2760 LDA #$32 ;PM DMA off 2770 STA DMACTL ;DMA control 2780 STA SDMCTL ;and shadow reg 2790 LDA #0 ;get zero 2800 STA GRACTL ;graphics ctrl 2810 STA AUDCTL ;reset audio 2820 LDX #4 ;5 PM registers 2830 NOPM STA GRAFP0,X ;clr register 2840 DEX ;dec index 2850 BPL NOPM ;done? No. 2860 JSR SIOINV ;init sound 2870 LDA # TLDL ;DL addr high 2900 STA SDLSTL+1 ;DL pntr high 2910 LDX # >VBLANK ;vblank high 2920 LDY # SCRN ;scrn addr high 3280 STA INDEX+1 ;pointer high 3290 LDA #0 ;get zero 3300 STA INDEX ;pointer low 3310 LDX #15 ;16 pages 0..15 3320 TAY ;use as index 3330 CL0 STA (INDEX),Y ;clear ram 3340 INY ;next byte 3350 BNE CL0 ;page done? No. 3360 INC INDEX+1 ;next page 3370 DEX ;page counter 3380 BPL CL0 ;scrn done? No. 3390 LDX #0 ;now clear P/m 3400 CLPM STA MISL,X ;clear missiles 3410 STA PLR0,X ;clear plyr 0 3420 STA PLR1,X ;clear plyr 1 3430 STA PLR2,X ;clear plyr 2 3440 STA PLR3,X ;clear plyr 3 3450 DEX ;done 256 bytes? 3460 BNE CLPM ;no, loop back! 3470 LDA # GLIST ;list to show 3500 STA SDLSTL+1 ;the playfield. 3510 LDA # >PM ;PM address high 3520 STA PMBASE ;into hardware 3530 LDA #$3E ;enable single 3540 STA SDMCTL ;line resolution 3550 STA DMACTL ;DMA control 3560 LDA #3 ;enable player 3570 STA GRACTL ;and missile DMA 3580 LDA #$11 ;set up 3590 STA GPRIOR ;P/M priority 3600 LDA #0 ;get zero 3610 STA TITLE ;title off 3620 ; 3630 ; --------------- 3640 ; Draw The Planet 3650 ; --------------- 3660 ; 3670 LDA # PPOS ;planet pos high 3710 STA INDX1+1 ;pointer #1 high 3720 STA INDX2+1 ;pointer #2 high 3730 LDX #0 ;table pointer 3740 DP0 LDY #0 ;index pointer 3750 DP1 LDA DPTBL,X ;table value 3760 BNE DP2 ;done? No. 3770 JMP SETUP ;continue 3780 DP2 BMI DPRPT ;repeat? Yes. 3790 STA (INDX1),Y ;put values 3800 STA (INDX2),Y ;onto screen 3810 INY ;inc index pntr 3820 INX ;inc table pntr 3830 JMP DP1 ;continue 3840 ; 3850 ; ------------------- 3860 ; Repeat Byte Handler 3870 ; ------------------- 3880 ; 3890 DPRPT ASL A ;shift byte 3900 STA TEMP ;new line flag 3910 ASL A ;NL bit -> carry 3920 ASL A ;color -> carry 3930 LDA #$55 ;color 1 bits 3940 BCS FILL1 ;color 1? Yes. 3950 LDA #0 ;get background 3960 FILL1 PHA ;save color byte 3970 LDA DPTBL,X ;table value 3980 AND #$0F ;mask 4 bits 3990 STA COUNT ;save as count 4000 PLA ;restore color 4010 FILL2 STA (INDX1),Y ;put bytes 4020 STA (INDX2),Y ;onto screen 4030 INY ;inc index 4040 DEC COUNT ;dec byte count 4050 BNE FILL2 ;done? No. 4060 INX ;inc table index 4070 LDA TEMP ;get flag 4080 BPL DP1 ;new line? No. 4090 SEC ;set carry 4100 LDA INDX1 ;Yes. get low 4110 SBC #40 ;subtract 40 4120 STA INDX1 ;new low 4130 BCS DPN1 ;overflow? No. 4140 DEC INDX1+1 ;decrement high 4150 DPN1 CLC ;clear carry 4160 LDA INDX2 ;get low 4170 ADC #40 ;add 40 4180 STA INDX2 ;new low 4190 BCC DP0 ;overflow? No. 4200 INC INDX2+1 ;increment high 4210 JMP DP0 ;continue 4220 ; 4230 ; ---------------- 4240 ; Planet Draw Data 4250 ; ---------------- 4260 ; 4270 DPTBL .BYTE $EA,$EA,$EA,$EA 4280 .BYTE $EA,$15,$A8,$54 4290 .BYTE $C1,$15,$A8,$54 4300 .BYTE $C1,$05,$A8,$50 4310 .BYTE $C1,$05,$A8,$50 4320 .BYTE $C1,$01,$A8,$40 4330 .BYTE $C1,$81,$E8,$81 4340 .BYTE $15,$A6,$54,$C1 4350 .BYTE $81,$05,$A6,$50 4360 .BYTE $C1,$81,$01,$A6 4370 .BYTE $40,$C1,$82,$E6 4380 .BYTE $82,$05,$A4,$50 4390 .BYTE $C1,$83,$E4,$84 4400 .BYTE $E2,0 4410 ; 4420 ; ------------------------- 4430 ; Setup Orbiter Coordinates 4440 ; ------------------------- 4450 ; 4460 SETUP LDX #64 ;do 65 bytes 4470 LDY #0 ;quad 2/4 offset 4480 SU1 CLC ;clear carry 4490 LDA #96 ;center Y 4500 ADC OYTBL,X ;add offset Y 4510 STA ORBY+$40,Y ;quad-2 Y 4520 STA ORBY+$80,X ;quad-3 Y 4530 LDA #80 ;center X 4540 ADC OXTBL,X ;add offset X 4550 STA ORBX,X ;quad-1 X 4560 STA ORBX+$40,Y ;quad-2 X 4570 SEC ;set carry 4580 LDA #80 ;center X 4590 SBC OXTBL,X ;sub offset X 4600 STA ORBX+$80,X ;quad-3 X 4610 STA ORBX+$C0,Y ;quad-4 X 4620 LDA #96 ;center Y 4630 SBC OYTBL,X ;sub offset Y 4640 STA ORBY,X ;quad-1 Y 4650 STA ORBY+$C0,Y ;quad-4 Y 4660 INY ;quad 2/4 offset 4670 DEX ;quad 1/3 offset 4680 BPL SU1 ;done? No. 4690 JMP INIT ;continue 4700 ; 4710 ; --------------------------- 4720 ; Orbiter X,Y Coordinate Data 4730 ; --------------------------- 4740 ; 4750 OXTBL .BYTE 0,1,2,2,3 4760 .BYTE 4,5,5,6,7 4770 .BYTE 8,9,9,10,11 4780 .BYTE 12,12,13,14,14 4790 .BYTE 15,16,16,17,18 4800 .BYTE 18,19,20,20,21 4810 .BYTE 21,22,23,23,24 4820 .BYTE 24,25,25,26,26 4830 .BYTE 27,27,27,28,28 4840 .BYTE 29,29,29,30,30 4850 .BYTE 30,30,31,31,31 4860 .BYTE 31,31,32,32,32 4870 .BYTE 32,32,32,32,32 4880 ; 4890 OYTBL .BYTE 54,54,54,54,54 4900 .BYTE 54,54,54,53,53 4910 .BYTE 53,52,52,52,51 4920 .BYTE 51,50,50,49,49 4930 .BYTE 48,47,47,46,45 4940 .BYTE 44,44,43,42,41 4950 .BYTE 40,39,38,38,37 4960 .BYTE 36,35,33,32,31 4970 .BYTE 30,29,28,27,26 4980 .BYTE 24,23,22,21,20 4990 .BYTE 18,17,16,15,13 5000 .BYTE 12,11,9,8,7 5010 .BYTE 5,4,3,1,0 5020 ; 5030 ; ---------------------- 5040 ; Display list interrupt 5050 ; ---------------------- 5060 ; 5070 DLI PHA ;save Acc 5080 TXA ;X --> Acc 5090 PHA ;save X register 5100 INC DLICNT ;inc counter 5110 LDA DLICNT ;get counter 5120 AND #$07 ;only 3 bits 5130 TAX ;use as index 5140 LDA DLIBRT,X ;planet bright 5150 ORA PLNCOL ;planet color 5160 STA WSYNC ;start of scan 5170 STA COLPF0 ;color planet 5180 LDA #$8C ;bright blue 5190 STA COLPF0+1 ;shot color 5200 PLA ;restore X 5210 TAX ;Acc --> X 5220 PLA ;restore Acc 5230 RTI ;return 5240 ; 5250 DLIBRT .BYTE 0,2,4,6 ;planet 5260 .BYTE 8,6,4,2 ;brightness 5270 ; 5280 ; ---------------------- 5290 ; Vertical blank routine 5300 ; ---------------------- 5310 ; 5320 VBLANK CLD ;clear decimal 5330 LDX SAUCER ;saucer flag as 5340 LDA P3COLR,X ;index 0 or 1 5350 STA PCOLR0+3 ;saucer color 5360 LDA #5 ;get 5 5370 STA DLICNT ;reset DLI count 5380 LDA #$C0 ;enable 5390 STA NMIEN ;DLI's 5400 LDA CH ;keyboard char 5410 CMP #$21 ;space bar? 5420 BNE PCHK ;No. skip it 5430 LDA PAUSED ;pause flag 5440 EOR #$FF ;invert it 5450 STA PAUSED ;save pause flag 5460 LDA #$FF ;get $FF 5470 STA CH ;reset keyboard 5480 PCHK LDA PAUSED ;pause flag 5490 BEQ NOPAU ;paused? No. 5500 LDA #0 ;get zero 5510 LDX #7 ;do 8 bytes 5520 NOSND STA AUDF1,X zero sound 5530 DEX ;dec index 5540 BPL NOSND ;done? No. 5550 JMP XITVBV ;exit VBLANK 5560 NOPAU LDA TITLE ;title flag 5570 BNE NOCYC ;title? Yes. 5580 LDA COLOR0+2 No. get color 5590 CLC ;clear carry 5600 ADC #$10 ;next color 5610 STA COLOR0+2 ;explosion col. 5620 NOCYC LDA EXSCNT ;explosion cnt 5630 BEQ NOPAU2 ;any? No. 5640 LSR A ;count/2 5650 LSR A ;count/4 5660 STA AUDC1+6 ;explo volume 5670 LDA #40 ;explosion 5680 STA AUDF1+6 ;explo frequency 5690 DEC EXSCNT ;dec count 5700 NOPAU2 LDA GAMCTL ;game control 5710 BPL CURSOR ;cursor? Yes. 5720 JMP TIMERS ;No. skip 5730 ; 5740 ; -------------- 5750 ; Cursor handler 5760 ; -------------- 5770 ; 5780 CURSOR LDY CURY ;get y pos 5790 LDX #5 ;clear 6 bytes 5800 ERACUR LDA #$0F ;now clear out 5810 AND MISL-3,Y ;old cursor 5820 STA MISL-3,Y ;graphics, 5830 INY ;next Y position 5840 DEX ;dec count 5850 BPL ERACUR ;loop until done 5860 LDA STICK0 ;read joystick 5870 LDX CURX ;get X value 5880 LDY CURY ;get Y value 5890 LSR A ;shift right 5900 BCS NOTN ;North? No. 5910 DEY ;move cursor up 5920 DEY ;two scan lines 5930 NOTN LSR A ;shift right 5940 BCS NOTS ;South? No. 5950 INY ;cursor down 5960 INY ;two scan lines 5970 NOTS LSR A ;shift right 5980 BCS NOTW ;West? No. 5990 DEX ;cursor left 6000 NOTW LSR A ;shift right 6010 BCS NOTE ;East? No. 6020 INX ;cursor right 6030 NOTE CPX #48 ;too far left? 6040 BCC BADX ;Yes. skip next 6050 CPX #208 ;too far right? 6060 BCS BADX ;Yes. skip next 6070 STX CURX ;No. it's ok! 6080 BADX CPY #32 ;too far up? 6090 BCC BADY ;Yes. skip next 6100 CPY #224 ;too far down? 6110 BCS BADY ;Yes. skip next 6120 STY CURY ;No. it's ok! 6130 BADY LDA DEVICE ;KOALA switch 6140 BEQ NKOALA ;KOALA PAD? 6150 JSR KOALA ;Yes. do it 6160 NKOALA LDA PENFLG ;koala pen flg 6170 BNE TIMERS ;pen up? Yes. 6180 LDX #5 ;6 bytes... 6190 LDY CURY ;get cursor Y 6200 SHOCUR LDA CURPIC,X ;cursor pic 6210 ORA MISL-3,Y ;mask missiles 6220 STA MISL-3,Y ;store missiles 6230 INY ;next scan line 6240 DEX ;dec count 6250 BPL SHOCUR ;done? No. 6260 LDX CURX ;get x position, 6270 DEX ;1 less for... 6280 STX HPOSM0+3 ;missile 3 6290 INX ;2 more for... 6300 INX ;missile 2 6310 STX HPOSM0+2 ;save position 6320 ; 6330 ; ----------------------- 6340 ; Handle timers and orbit 6350 ; ----------------------- 6360 ; 6370 TIMERS LDA BOMBWT ;bomb wait cnt 6380 BEQ NOBWT ;wait over? Yes. 6390 DEC BOMBWT ;dec count 6400 NOBWT LDA DEADTM ;death timer 6410 BEQ NOTIM0 ;zero? yes. 6420 DEC DEADTM ;decrement it! 6430 NOTIM0 LDA EXPTIM ;exp timer 6440 BEQ NOTIM1 ;zero? Yes. 6450 DEC EXPTIM ;decrement it! 6460 NOTIM1 LDA BOMTIM ;get bomb time 6470 BEQ NOTIM2 ;zero? Yes. 6480 DEC BOMTIM ;dec bomb time 6490 NOTIM2 LDA GAMCTL ;game control 6500 BPL NOTOVR ;game over? No. 6510 JMP XITVBV ;exit VBLANK 6520 NOTOVR LDA SATLIV ;get satellite 6530 BEQ NOSAT ;alive? No. 6540 INC SCNT ;inc count 6550 LDY SCNT ;orbit index 6560 CLC ;clear carry 6570 LDA ORBX,Y ;get X coord 6580 STA SATX ;save Pfield x 6590 ADC #47 ;X offset 6600 STA HPOSM0+1 ;horizontal pos 6610 ADC #2 ;+2 offset for 6620 STA HPOSM0 ;right side 6630 LDA ORBY,Y ;get Y coord 6640 LSR A ;divide by 2 6650 STA SATY ;for playfield 6660 ROL A ;restore for PM 6670 ADC #36 ;screen offset 6680 TAX ;use as index 6690 INC SATPIX ;next sat. image 6700 LDA SATPIX ;get number 6710 AND #$08 ;use bit 3 6720 TAY ;use as index 6730 LDA #8 ;do 8 bytes 6740 STA SATEMP ;save count 6750 SSAT LDA MISL,X ;missile graphic 6760 AND #$F0 ;mask off 1,2 6770 ORA SATSH,Y ;add sat shape 6780 STA MISL,X ;put player #1 6790 DEX ;dec position 6800 INY ;dec index 6810 DEC SATEMP ;dec count 6820 BNE SSAT ;done? No. 6830 NOSAT LDA SAUCER ;saucer flag 6840 BEQ SOUNDS ;saucer? No. 6850 LDY BOMBY+3 ;saucer Y pos 6860 DEY ;-1 6870 DEY ;-2 6880 LDX #9 ;10 scan lines 6890 SSAULP CPY #32 ;above top? 6900 BCC NXTSP ;Yes. skip it 6910 CPY #223 ;below bottom? 6920 BCS NXTSP ;Yes. skip it 6930 LDA SAUPIC,X ;saucer image 6940 STA PLR3,Y ;store player 3 6950 NXTSP DEY ;next scan line 6960 DEX ;dec index 6970 BPL SSAULP ;done? No. 6980 LDA BOMBX+3 ;saucer X pos 6990 STA HPOSP0+3 ;move it 7000 INC SAUTIM ;saucer time 7010 LDA SAUTIM ;get counter 7020 LSR A ;/2 7030 AND #$03 ;use only 0..3 7040 TAX ;as X index 7050 LDA SAUMID,X ;saucer middle 7060 STA SAUPIC+4 ;put in 7070 STA SAUPIC+5 ;saucer image 7080 SOUNDS LDX PSSCNT ;shot sound 7090 BPL DOS1 ;shot? Yes. 7100 LDA #0 ;No. get zero 7110 STA AUDC1 ;volume for shot 7120 BEQ TRYS2 ;skip next 7130 DOS1 LDA #$A6 ;shot sound vol 7140 STA AUDC1 ;set hardware 7150 LDA PLSHOT,X ;shot sound 7160 STA AUDF1 ;frequency 7170 DEC PSSCNT ;dec shot snd 7180 TRYS2 LDX ESSCNT ;enemy shots 7190 BPL DOS2 ;shots? Yes. 7200 LDA #0 ;No. get zero 7210 STA AUDC1+2 ;into volume 7220 BEQ TRYS3 ;skip rest 7230 DOS2 LDA #$A6 ;shot sound vol 7240 STA AUDC1+2 ;set hardware 7250 LDA ENSHOT,X ;shot sound 7260 STA AUDF1+2 ;frequency 7270 DEC ESSCNT ;dec shot snd 7280 TRYS3 LDA SAUCER ;saucer flag 7290 BEQ NOS3 ;saucer? No. 7300 LDA BOMBY+3 ;saucer Y pos 7310 CMP #36 ;above top? 7320 BCC NOS3 ;Yes. skip 7330 CMP #231 ;below bottom? 7340 BCC DOS3 ;No. make sound 7350 NOS3 LDA #0 ;get zero 7360 STA AUDC1+4 ;no saucer snd 7370 BEQ VBDONE ;skip next 7380 DOS3 INC SSSCNT ;inc saucer cnt 7390 LDX SSSCNT ;saucer count 7400 CPX #12 ;at limit? 7410 BMI SETS3 ;No. skip next 7420 LDX #0 ;get zero 7430 STX SSSCNT ;zero saucer cnt 7440 SETS3 LDA #$A8 ;saucer volume 7450 STA AUDC1+4 ;set hardware 7460 LDA SAUSND,X ;saucer sound 7470 STA AUDF1+4 ;set hardware 7480 VBDONE JMP XITVBV ;continue 7490 ; 7500 ; --------------------- 7510 ; Satellite shape table 7520 ; --------------------- 7530 ; 7540 SATSH .BYTE 0,0,0,$0A 7550 .BYTE $04,$0A,0,0 7560 .BYTE 0,0,0,$04 7570 .BYTE $0A,$04,0,0 7580 ; 7590 .INCLUDE #D:PLANET2.M65 7600 .INCLUDE #D:PLANET3.M65 7610 .END