0100 ;***************************** 0105 ;* BONK * 0110 ;* Copyright 1984 * 0115 ;* Programmed by James Hague * 0120 ;* Using MAC/65 by OSS Inc. * 0125 ;***************************** 0130 ; 0135 ;HARDWARE REGISTERS 0140 ; 0145 RANDOM = $D20A ;Random #s 0150 GRACTL = $D01D ;Graphic ctrl 0155 AUDC1 = $D201 ;Audio controls 0160 AUDC2 = $D203 0165 AUDC3 = $D205 0170 AUDC4 = $D207 0175 AUDF1 = $D200 ;Audio frequency 0180 AUDF2 = $D202 0185 AUDF3 = $D204 0190 AUDF4 = $D206 0195 AUDCTL = $D208 0200 HPOSP0 = $D000 ;Pl. 0 horiz. 0205 HPOSP1 = $D001 ;Pl. 1 horiz. 0210 P0PF = $D004 ;P0 to PF coll. 0215 P0PL = $D00C ;P0 to PL coll. 0220 HITCLR = $D01E ;Collision clear 0225 CONSOL = $D01F ;Console buttons 0230 PMBASE = $D407 0235 SETVBV = $E45C ;VBLANK vectors 0240 XITVBV = $E462 ;VBLANK exit 0245 SIOINV = $E465 ;Initialize SIO 0250 ; 0255 ;SHADOW REGISTERS 0260 ; 0265 CLOCK = $14 ;Real time clock 0270 ATTRACT = $4D 0275 DMACTL = $022F ;DMA control 0280 SDLSTL = $0230 ;Dlist pointer 0285 GPRIOR = $026F 0290 STICK = $0278 ;Joystick 0 0295 COL0 = $02C4 ;Color regs. 0300 COL1 = $02C5 0305 COL2 = $02C6 0310 COL3 = $02C7 0315 PCOL0 = $02C0 ;Player colors 0320 PCOL1 = $02C1 0325 CHBAS = $02F4 ;Character base 0330 CH = $02FC ;Keyboard buffer 0335 ; 0340 *= $80 0345 ; 0350 ;GAME VARIABLES 0355 ; 0360 SCORE 3 ;Player's score 0365 LEVEL 1 ;Current level 0370 SLEVEL 1 ;Starting level 0375 BLEVEL 1 ;Binary level 0380 BOARD 1 ;Current board 0385 LIVES 1 ;Remaining lives 0390 TIME 2 ;Bonus timer 0395 DIE 1 ;Death flag 0400 P0Y 1 ;Pl0 y position 0405 P0X 1 ;Pl0 x position 0410 GAMCTL 1 ;Game control 0415 ENXPOS 3 ;Enemy X pos. 0420 ENYPOS 3 ;Enemy Y pos. 0425 ENXADD 1 ;Enemy X add 0430 ENYADD 1 ;Enemy Y add 0435 ENBOUN 3 ;En bounce flags 0440 ENDIR 3 ;Enemy direction 0445 BDIST 1 ;Bounce distance 0450 ENAN 1 ;Enemy pointer 0455 PLAN 1 ;Play. pointer 0460 FLASH 1 ;Treas. flasher 0465 FREEZE 2 ;Freeze timers 0470 FTIME 1 ;Freeze time 0475 WAIT 4 ;Time delay 0480 TEMP 2 ;Temp storage 0485 DIR 1 ;Jstick direct. 0490 TOTAL 1 ;Jewels/board 0495 COUNT 1 ;Jewels/taken 0500 BONK 1 ;Bounce sound 0505 DING 1 ;Bell sound 0510 WSND 1 ;Eat wall sound 0515 ENEMY 10 ;Enemy image 0520 PLAYER 8 ;Player image 0525 LO 2 ;General pointer 0530 VLO 2 ;Ditto 0535 POINT 2 ;Play. pointer 0540 ; 0545 ;RESERVED MEMORY 0550 ; 0555 *= $2000 0560 ; 0565 PM $0400 ;Pmbase 0570 PL0 $0100 0575 PL1 $0100 0580 PL2 $0100 0585 PL3 $0100 0590 ; 0595 DISP = $1D00 ;Display area 0600 CHSET = $2000 ;New char set 0605 LOTBL = $2200 ;Plotter table 0610 HITBL = LOTBL+50 0615 ; 0620 *= $2800 ;Program start 0625 ; 0630 ;SET-UP PLOTTER 0635 ; 0640 GAME JSR SIOINV ;Init sounds 0645 LDA # DISP+80 0660 STA LO+1 0665 LDX #2 0670 SEPL LDA LO+1 0675 STA HITBL,X 0680 LDA LO 0685 STA LOTBL,X 0690 CLC 0695 ADC #20 0700 STA LO 0705 BCC SEP2 0710 INC LO+1 0715 SEP2 INX 0720 CPX #24 0725 BNE SEPL 0730 LDA #0 0735 STA SLEVEL 0740 ; 0745 ;REDEFINE CHARSET 0750 ; 0755 TAX ;Move set 0760 MSET LDA $E000,X 0765 STA CHSET,X 0770 LDA $E0FF,X 0775 STA CHSET+$FF,X 0780 INX 0785 BNE MSET 0790 LDA # >CHSET ;Install it 0795 STA CHBAS 0800 LDX #119 ;Redefine set 0805 RDEF LDA CDAT,X 0810 STA CHSET+8,X 0815 DEX 0820 BPL RDEF 0825 LDX #7 0830 RDEF2 LDA CDAT2,X 0835 STA CHSET+216,X 0840 DEX 0845 BPL RDEF2 0850 ; 0855 GO LDA #0 ;Turn off VBI 0860 STA GAMCTL 0865 JSR PMCLR ;No players 0870 JSR QUIET ;No sound 0875 ; 0880 ;TITLE SCREEN 0885 ; 0890 LDA # TDL ;list. 0905 STA SDLSTL+1 0910 LDA #200 ;Set up title 0915 STA COL0 ;colors. 0920 LDA #120 0925 STA COL1 0930 LDA #70 0935 STA COL2 0940 ; 0945 START LDA CONSOL ;Start key 0950 ROR A ;pressed? 0955 BCC ST1 ;Yes! 0960 ; 0965 ;LEVEL SELECTION 0970 ; 0975 ROR A ;Select pressed? 0980 BCS START ;No, skip this. 0985 INC SLEVEL ;Yes, start at 0990 LDA SLEVEL ;next level. 0995 CMP #9 ;Highest level? 1000 BNE Z1 ;No, continue. 1005 LDA #0 ;Yes, reset and 1010 STA SLEVEL ;store it. 1015 Z1 CLC ;Add 1 to start- 1020 ADC #1 ;ing level # 1025 ORA #16 ;Add color 1030 STA TITLE+73 ;and show it 1035 Z2 LDA CONSOL ;Get keys again 1040 CMP #5 ;Key released? 1045 BEQ Z2 ;No, wait for it 1050 BNE START ;Branch always! 1055 ; 1060 ST1 LDA CONSOL 1065 ROR A 1070 BCC ST1 1075 LDA #0 ;Set variables 1080 STA SCORE ;that are set 1085 STA SCORE+1 ;once per game. 1090 STA SCORE+2 1095 STA BOARD 1100 LDA #3 ;3 lives 1105 STA LIVES 1110 LDA SLEVEL ;Set level 1115 STA LEVEL 1120 STA BLEVEL 1125 ; 1130 NEWLEV LDA #0 ;Turn off VBI 1135 STA GAMCTL 1140 LDA LEVEL ;Get BCD level 1145 SED 1150 CLC 1155 ADC #1 ;And raise it 1160 CLD 1165 STA LEVEL ;Then store. 1170 LDX BLEVEL ;Get bin. level 1175 CPX #15 ;Highest level? 1180 BEQ SAMEL ;Yes, keep it. 1185 INC BLEVEL ;No, raise it. 1190 SAMEL LDX BOARD ;Get board # 1195 CPX #3 ;Highest board? 1200 BEQ BRD1 ;Yes, reset 1205 INC BOARD ;and store 1210 BNE SETLEV ;Branch always! 1215 ; 1220 BRD1 LDX #1 ;Reset board # 1225 STX BOARD 1230 LDA LIVES ;And give extra 1235 CMP #9 ;life 1240 BEQ SETLEV 1245 INC LIVES 1250 SETLEV LDX BLEVEL ;Binary level 1255 LDA DEL1-1,X ;Set up delay 1260 STA WAIT 1265 LDA #5 1270 STA WAIT+2 1275 LDA BOUN-1,X ;Get bounces 1280 STA BDIST 1285 LDA FTM-1,X ;Get freeze time 1290 STA FTIME 1295 LDX BOARD ;Board # 1300 LDA TOT-1,X ;Get jewels 1305 STA TOTAL 1310 LDA #
DL 1325 STA SDLSTL+1 1330 ; 1335 NEWLIFE JSR QUIET ;No sound. 1340 LDA #0 ;Zero items 1345 STA GAMCTL ;that must be 1350 STA DIE ;zeroed for each 1355 STA COUNT ;new life 1360 STA DIR 1365 STA HITCLR 1370 STA ENXADD 1375 STA ENYADD 1380 STA WAIT+1 1385 STA WAIT+3 1390 STA TIME+1 1395 STA ENAN ;Reset pointers 1400 STA PLAN 1405 STA FLASH 1410 LDX BLEVEL ;Set timer 1415 LDA TIM-1,X 1420 STA TIME 1425 LDY # VBI 1435 LDA #7 1440 JSR SETVBV 1445 ; 1450 ;DRAW SCREEN 1455 ; 1460 LDA BOARD ;Get board # 1465 ASL A ;Times 2 1470 TAX ;use as index 1475 LDA BDTBL-2,X ;Board lo byte 1480 STA LO 1485 LDA BDTBL-1,X ;Hi byte of it 1490 STA LO+1 1495 LDY #0 ;Draw 1st part 1500 DR1 LDA (LO),Y ;Get screen byte 1505 STA DISP+80,Y ;and show it 1510 INY 1515 CPY #240 1520 BNE DR1 1525 CLC 1530 LDA LO ;point to part 2 1535 ADC #240 1540 STA LO 1545 BCC DR2 1550 INC LO+1 1555 DR2 LDY #0 1560 DR3 LDA (LO),Y ;Get byte 1565 STA DISP+320,Y 1570 INY 1575 CPY #240 1580 BNE DR3 1585 ; 1590 ;INITIALIZE 1595 ; 1600 LDA #104 ;Color 0 is 1605 STA COL0 ;purple 1610 LDA #200 ;Color 1 is 1615 STA COL1 ;green 1620 LDA #0 ;Color 2 is 1625 STA COL2 ;black 1630 LDA #134 ;Color 3 is 1635 STA COL3 ;blue 1640 LDX #39 ;Print score 1645 PS LDA SCL,X ;line 1650 STA DISP,X 1655 LDA #0 1660 STA DISP+40,X 1665 DEX 1670 BPL PS 1675 JSR SHOSC ;Show score 1680 JSR SHOBO ;Show bonus 1685 JSR SHOLI ;Show lives 1690 LDA LEVEL ;Show level 1695 LDY #74 1700 JSR BCD 1705 LDA BOARD ;Set initial 1710 ASL A ;player 1715 ASL A ;positions. 1720 TAX 1725 LDA IX-4,X ;Set player X 1730 STA P0X 1735 LDA IY-4,X ;and Y 1740 STA P0Y 1745 INX 1750 LDY #2 ;Set all enemy 1755 SET LDA IX-4,X ;X 1760 STA ENXPOS,Y 1765 LDA IY-4,X ;Y 1770 STA ENYPOS,Y 1775 LDA #0 1780 STA ENDIR,Y ;Zero enemy 1785 STA ENBOUN,Y ;status 1790 INX 1795 DEY 1800 BPL SET ;Finish up 1805 ; 1810 ;P/M SET UP 1815 ; 1820 JSR PMCLR ;Clear players 1825 LDA # >PM ;Point to PM 1830 STA PMBASE ;area 1835 LDA #2 ;Set gractl 1840 STA GRACTL 1845 LDA #62 ;Set dmactl 1850 STA DMACTL 1855 LDA #1 ;Set priority 1860 STA GPRIOR 1865 LDA #218 ;Set pl0 color 1870 STA PCOL0 1875 LDA #26 ;Set enemy color 1880 STA PCOL1 1885 STA PCOL1+1 1890 STA PCOL1+2 1895 LDA P0X ;Draw player 1900 STA HPOSP0 ;Set x pos. 1905 LDY P0Y ;Get y 1910 LDX #0 1915 PD LDA PDAT,X ;Get player byte 1920 STA PLAYER,X 1925 STA PL0,Y ;And show it 1930 INY 1935 INX 1940 CPX #8 1945 BNE PD 1950 LDX #9 ;Copy enemy data 1955 CD LDA EDAT,X ;from memory to 1960 STA ENEMY,X ;animation table 1965 DEX 1970 BPL CD 1975 JSR DRAWEN ;Draw enemy 1980 LDA #170 ;Introduction 1985 STA AUDC1 1990 LDX #5 1995 IN LDA MUSIC,X 2000 STA AUDF1 2005 LDA #5 2010 JSR DELAY 2015 DEX 2020 BPL IN 2025 JSR QUIET 2030 LDA #40 2035 JSR DELAY 2040 LDA #$FF ;Turn on the 2045 STA GAMCTL ;VBI 2050 ; 2055 ;MAIN LOOP 2060 ; 2065 MAIN JSR ENMOVE ;Move enemy 2070 JSR SHOSC ;Show score 2075 JSR SHOBO ;Show bonus 2080 M1 LDA CONSOL ;Start pressed? 2085 ROR A 2090 BCC M4 ;Yes. 2095 LDA CH 2100 CMP #$21 ;Space bar? 2105 BNE M2 ;No. 2110 LDA #$FF 2115 STA CH ;Reset keycode 2120 EOR GAMCTL ;Flip pause 2125 STA GAMCTL 2130 BNE M2 2135 JSR HUSH ;Peace and... 2140 M2 LDA GAMCTL 2145 BEQ M1 2150 LDA DIE ;Player dead? 2155 BNE M3 ;Yes. 2160 LDA TIME ;Time up? 2165 BEQ M3 2170 LDA COUNT ;Level done? 2175 CMP TOTAL 2180 BNE MAIN 2185 JMP LDONE 2190 M3 JMP KILL ;Auuughh! 2195 M4 JMP GO 2200 ; 2205 ;CLEAR PM 2210 ; 2215 PMCLR LDA #0 2220 TAX 2225 PC STA PL0,X 2230 STA PL1,X 2235 STA PL2,X 2240 STA PL3,X 2245 INX 2250 BNE PC 2255 DE3 RTS 2260 ; 2265 ;SOUND OFF 2270 ; 2275 QUIET LDA #0 ;Turn off sound 2280 STA BONK 2285 STA DING 2290 STA FREEZE 2295 STA WSND 2300 HUSH STA AUDC1 2305 STA AUDC2 2310 STA AUDC3 2315 STA AUDC4 2320 STA AUDCTL 2325 RTS 2330 ; 2335 ;DRAW ENEMY 2340 ; 2345 DRAWEN LDA # PL1 2360 STA POINT+1 2365 LDA #0 2370 STA TEMP 2375 DE1 LDX TEMP 2380 CPX #3 2385 BEQ DE3 2390 LDA ENXPOS,X ;Set x position 2395 STA HPOSP1,X 2400 LDY ENYPOS,X 2405 LDX #0 2410 DE2 LDA ENEMY,X 2415 STA (POINT),Y 2420 INY 2425 INX 2430 CPX #10 2435 BNE DE2 2440 INC TEMP 2445 INC POINT+1 2450 JMP DE1 2455 ; 2460 ;VBI 2465 ; 2470 VBI CLD ;Kill decimal! 2475 LDA GAMCTL ;Do this VBI? 2480 BEQ EXIT ;No! Get out! 2485 JSR PCHK ;Check player 2490 JSR STUFF ;Do work 2495 JSR ANIM ;Animate 2500 JSR PLMOVE ;Move player 2505 JSR SOUND ;Make noise 2510 EXIT STA HITCLR ;Clear all hits 2515 JMP XITVBV ;Go home! 2520 ; 2525 ;MOVE PLAYER 2530 ; 2535 PLMOVE LDX #7 ;1st- erase 2540 LDY P0Y ;player 2545 LDA #0 2550 STA ATTRACT ;Kill attract 2555 ERPL STA PL0,Y 2560 INY 2565 DEX 2570 BPL ERPL 2575 LDX STICK ;2nd- get new 2580 STX DIR ;player position 2585 LDA P0X ;Get x position 2590 CLC ;then add offset 2595 ADC XOFF-5,X ;to old coord 2600 STA P0X ;Save new pos. 2605 STA HPOSP0 ;and show it 2610 LDA P0Y ;Now repeat for 2615 CLC ;y position. 2620 ADC YOFF-5,X 2625 STA P0Y 2630 LDX #7 ;3rd- redraw 2635 TAY 2640 DRPL LDA PLAYER,X 2645 STA PL0,Y 2650 INY 2655 DEX 2660 BPL DRPL 2665 RTS 2670 ; 2675 ;ENEMY HANDLER 2680 ; 2685 ENMOVE LDA FREEZE ;Frozen? 2690 BNE TWX ;Yup, ice cold. 2695 LDA WAIT+1 ;Get 1st timer 2700 BEQ TWO ;If 0, do next. 2705 DEC WAIT+1 ;Decrement 1st 2710 RTS ;And leave. 2715 ; 2720 TWO LDA WAIT ;Reset 1st timer 2725 STA WAIT+1 2730 LDA WAIT+3 ;Get 2nd timer 2735 BEQ MOVE ;If 0, move 'em 2740 DEC WAIT+3 ;Decrement 2nd 2745 TWX RTS 2750 ; 2755 MOVE LDA WAIT+2 ;Reset 2nd 2760 STA WAIT+3 2765 LDX #0 ;Main counter 2770 DOMOR JSR CHECK ;Check enemy 2775 LDA ENBOUN,X ;Bouncing? 2780 BEQ NOB ;No, continue. 2785 DEC ENBOUN,X ;Yes, 2790 JMP OUT ;Do next enemy. 2795 ; 2800 NOB LDA ENXPOS,X ;Get x pos 2805 CMP P0X ;Comp with play 2810 BCC XLES ;Less than? 2815 BNE XMOR ;More than? 2820 LDA #0 ;Equal to, stop 2825 BEQ DOY ;movement. 2830 XMOR LDA #$FF ;More than, move 2835 BNE DOY ;left. 2840 XLES LDA #1 ;Less than, move 2845 DOY STA ENXADD ;right. 2850 LDA ENYPOS,X ;Get y pos 2855 CMP P0Y ;Comp eith play 2860 BCC YLES ;Less than? 2865 BNE YMOR ;More than? 2870 LDA #0 ;Equal to, stop 2875 BEQ FINI ;movement. 2880 YMOR LDA #$FF ;More than, move 2885 BNE FINI ;left. 2890 YLES LDA #1 ;Less than, move 2895 FINI STA ENYADD ;right. 2900 LDY #8 ;Convert to dir 2905 CDIR LDA ENXADD ;Is x direction 2910 CMP ENX,Y ;correct? 2915 BNE AGA ;No, check more. 2920 LDA ENYADD ;Is y direction 2925 CMP ENY,Y ;correct? 2930 BNE AGA ;Nope. 2935 TYA 2940 STA ENDIR,X ;It's correct! 2945 BPL OUT ;Branch always! 2950 ; 2955 AGA DEY ;Continue 2960 BPL CDIR ;searching 2965 OUT LDA ENDIR,X ;Get direction 2970 TAY 2975 LDA ENXPOS,X ;Update x pos 2980 CLC 2985 ADC ENX,Y 2990 STA ENXPOS,X 2995 LDA ENYPOS,X ;Update y 3000 CLC 3005 ADC ENY,Y 3010 STA ENYPOS,X 3015 INX 3020 CPX #3 3025 BNE DOMOR 3030 JMP DRAWEN ;Draw enemy 3035 ; 3040 CHECK LDA ENDIR,X ;Check if the 3045 TAY ;enemy hit 3050 LDA ENXPOS,X ;anything 3055 SEC ;1st, scan on 3060 SBC SCX,Y ;x axis 3065 LSR A 3070 LSR A 3075 LSR A 3080 STA ENXADD 3085 LDA ENYPOS,X ;2nd, scan on 3090 SEC ;y axis 3095 SBC SCY,Y 3100 LSR A 3105 LSR A 3110 LSR A 3115 TAY ;Now, get point 3120 LDA LOTBL,Y 3125 STA LO 3130 LDA HITBL,Y 3135 STA LO+1 3140 LDY ENXADD 3145 LDA (LO),Y 3150 AND #$3F ;Mask off color 3155 BEQ L0 ;Hit anything? 3160 CMP #27 ;Hit diamond? 3165 BEQ L0 ;Yup, forget it 3170 CMP #$0F ;Hit freezer? 3175 BEQ L0 ;Yup, who cares 3180 LDA BDIST ;A hit! Make the 3185 STA ENBOUN,X ;enemy bounce! 3190 LDA #16 ;Set sound 3195 STA AUDF1 3200 LDA #6 3205 STA AUDC1 3210 STA BONK 3215 LDA RANDOM ;Get new direct. 3220 AND #3 3225 TAY 3230 LDA BDIR,Y 3235 STA ENDIR,X 3240 BPL CHECK ;Check it out! 3245 ; 3250 ;CHECK PLAYER 3255 ; 3260 PCHK LDA P0Y ;Get y pos 3265 SEC ;And convert to 3270 SBC #28 ;screen position 3275 LSR A 3280 LSR A 3285 LSR A 3290 TAY ;Get address 3295 LDA LOTBL,Y 3300 STA VLO 3305 LDA HITBL,Y 3310 STA VLO+1 3315 LDA P0X ;Now convert x 3320 SEC 3325 SBC #44 3330 LSR A 3335 LSR A 3340 LSR A 3345 TAY 3350 LDA (VLO),Y ;Get point 3355 AND #$3F ;Mask out color 3360 BEQ L0 ;Nothing there 3365 CMP #$0F ;Hit freezer? 3370 BEQ HITFR ;Yup, handle it 3375 CMP #$1B ;Hit diamond? 3380 BEQ HITDI ;Yup, fix it 3385 LDA (VLO),Y ;Get point 3390 AND #192 ;Get color used 3395 CMP #64 ;Hit weak wall? 3400 BNE L0 ;No, leave. 3405 ; 3410 ;Hit weak wall 3415 ; 3420 LDA #3 ;Set sound 3425 STA WSND 3430 LDA #240 3435 STA AUDF4 3440 LDA #200 3445 STA AUDC4 3450 HITX LDA #0 ;Erase wall 3455 STA (VLO),Y 3460 L0 RTS 3465 ; 3470 ;Hit diamond 3475 ; 3480 HITDI LDA #$70 ;Give points 3485 JSR ADD 3490 LDA #16 ;Set sound 3495 STA DING 3500 LDA #130 3505 STA AUDF2 3510 INC COUNT ;Count it 3515 JMP HITX 3520 ; 3525 ;Hit freezer 3530 ; 3535 HITFR JSR HITX ;Erase freezer 3540 LDA FTIME ;Set freeze time 3545 STA FREEZE 3550 LDA #5 3555 STA FREEZE+1 3560 LDA #166 ;Set sound 3565 STA AUDC3 3570 LDA #$50 ;Give points 3575 ; 3580 ;SCORE ROUTINES 3585 ; 3590 ADD SED ;Add points to 3595 CLC ;score 3600 ADC SCORE 3605 STA SCORE 3610 LDA #0 3615 ADC SCORE+1 3620 STA SCORE+1 3625 LDA #0 3630 ADC SCORE+2 3635 STA SCORE+2 3640 CLD 3645 RTS 3650 ; 3655 SHOBO LDA TIME ;Show bonus 3660 LDY #54 3665 ; 3670 BCD PHA ;Show 1 bcd 3675 SEC 3680 ROR A 3685 LSR A 3690 LSR A 3695 LSR A 3700 STA DISP,Y 3705 INY 3710 PLA 3715 AND #$0F 3720 ORA #$10 3725 STA DISP,Y 3730 RTS 3735 ; 3740 SHOSC LDX #2 ;Show score 3745 LDY #42 3750 SS LDA SCORE,X 3755 JSR BCD 3760 INY 3765 DEX 3770 BPL SS 3775 RTS 3780 ; 3785 SHOLI LDA LIVES ;Show lives 3790 LDY #64 3795 BNE BCD 3800 ; 3805 ;SOUND ROUTINES 3810 ; 3815 SOUND LDY BONK ;Bounce sound? 3820 BEQ T1 ;No 3825 DEY 3830 STY BONK 3835 STY AUDC1 3840 T1 LDY DING ;Bell sound? 3845 BEQ T2 ;No 3850 DEY 3855 STY DING 3860 TYA 3865 ORA #$A0 3870 STA AUDC2 3875 T2 LDA FREEZE ;Freezer sound? 3880 BEQ T3 ;No 3885 LDY FREEZE+1 3890 LDA FSND,Y 3895 STA AUDF3 3900 DEC FREEZE+1 3905 BNE T3 3910 LDA #5 3915 STA FREEZE+1 3920 DEC FREEZE 3925 BNE T3 3930 LDA #0 3935 STA AUDC3 3940 T3 LDA WSND ;Wall sound? 3945 BEQ T4 ;No 3950 DEC WSND 3955 BNE T4 3960 LDA #0 3965 STA AUDC4 3970 T4 RTS 3975 ; 3980 ;FLASH JEWELS 3985 ; 3990 STUFF INC FLASH ;Handle flash 3995 LDA FLASH ;timers. 4000 CMP #20 4005 BNE S1 4010 LDA #0 4015 STA FLASH 4020 LDA #104 4025 CMP COL0 4030 BNE S2 4035 LDA #10 4040 S2 STA COL0 4045 ; 4050 ;HANDLE TIME 4055 ; 4060 S1 INC TIME+1 ;Count down 4065 LDA TIME+1 4070 CMP #60 ;We interrupt 4075 BNE S3 ;this program 4080 LDA #0 ;for an import- 4085 STA TIME+1 ;ant news 4090 LDA TIME ;bulletin: 4095 SED ; HI MOM! 4100 SEC 4105 SBC #1 4110 CLD 4115 STA TIME 4120 S3 LDA P0PL ;Check player 4125 STA DIE ;collisions 4130 LDA P0PF 4135 AND #8 4140 BEQ S4 4145 STA DIE 4150 S4 RTS 4155 ; 4160 ;ANIMATE 4165 ; 4170 ANIM LDA ENAN ;Animate enemy. 4175 CLC ;Hey guys, look! 4180 ADC #10 ;Your names are 4185 CMP #50 ;in print : 4190 BNE A1 ; David Hague 4195 LDA #0 ; Robbie Hague 4200 A1 STA ENAN ; Martin Beck 4205 TAY ; Nathan Zink 4210 LDX #9 ;and everyone's 4215 A2 LDA EDAT,Y ;favorite: 4220 STA ENEMY,X ; A. ZLOTNICK! 4225 INY ;Tron to you! 4230 DEX ;(No you don't 4235 BPL A2 ;get paid) 4240 LDA DIR ;Animate player 4245 CMP #15 ;by storing a 4250 BEQ A3 ;different image 4255 LDA PLAN ;in the player 4260 CLC ;animation table 4265 ADC #8 4270 CMP #64 4275 BNE A4 ;Is this game 4280 A3 LDA #0 ;better than 4285 A4 STA PLAN ;The Electroids? 4290 TAY 4295 LDX #7 4300 A5 LDA PDAT,Y 4305 STA PLAYER,X 4310 INY 4315 DEX 4320 BPL A5 4325 RTS 4330 ; 4335 ;TIME DELAY 4340 ; 4345 DELAY STA TEMP ;Enter with 4350 LDA #0 ;length of pause 4355 STA CLOCK ;(in jiffies) in 4360 D0 LDA CLOCK ;the accumulator 4365 CMP TEMP 4370 BEQ S4 4375 LDA CONSOL 4380 CMP #7 4385 BEQ D0 4390 JMP GO 4395 ; 4400 ;DIE 4405 ; 4410 KILL LDA #0 ;Stop movement 4415 STA GAMCTL 4420 JSR QUIET ;No sound 4425 DEC LIVES ;Take a life 4430 JSR SHOLI ;And show them. 4435 LDA #204 4440 STA AUDC1 4445 LDX #40 ;Kill player 4450 K1 INC P0X ;1st shift 4455 LDA P0X 4460 STA HPOSP0 4465 LDA RANDOM 4470 STA AUDF1 4475 LDA #1 4480 JSR DELAY 4485 DEC P0X ;2nd shift 4490 LDA P0X 4495 STA HPOSP0 4500 LDA RANDOM 4505 STA AUDF1 4510 LDA #1 4515 JSR DELAY 4520 DEX 4525 BPL K1 ;Repeat again. 4530 JSR QUIET 4535 LDA LIVES ;Any lives? 4540 BEQ OVR 4545 JMP NEWLIFE 4550 ; 4555 ;GAME OVER 4560 ; 4565 OVR LDX #9 ;Show GAME OVER 4570 O1 LDA GOVR,X 4575 STA DISP+305,X 4580 DEX 4585 BPL O1 4590 JSR PMCLR 4595 LDA #255 4600 JSR DELAY 4605 JMP GO 4610 ; 4615 ;LEVEL DONE 4620 ; 4625 LDONE LDA #0 ;Stop movement 4630 STA GAMCTL 4635 JSR QUIET ;No sound 4640 C1 LDA TIME ;Give 10 points 4645 SED ;for each second 4650 SEC ;left on the 4655 SBC #1 ;timer. 4660 STA TIME 4665 CLD 4670 JSR SHOBO ;Add points for 4675 LDA #$10 ;time remaining 4680 JSR ADD ;and make bell 4685 JSR SHOSC ;tones by vary- 4690 LDA #50 ;ing the volume 4695 STA AUDF1 ;of voice 1. 4700 LDY #164 4705 C2 STY AUDC1 4710 LDA #1 4715 JSR DELAY 4720 DEY 4725 CPY #160 4730 BNE C2 4735 LDA TIME 4740 BNE C1 4745 JSR QUIET ;Kill noise 4750 JMP NEWLEV ;Start new level 4755 ; 4760 ;CHARACTER DATA 4765 ; 4770 CDAT .BYTE 0,0,255,255,255,255,0 4775 .BYTE 0,60,60,60,60,60,60 4780 .BYTE 60,60,0,0,248,252,252 4785 .BYTE 252,60,60,0,0,31,63,63 4790 .BYTE 63,60,60,60,60,252,252 4795 .BYTE 252,248,0,0,60,60,63 4800 .BYTE 63,63,31,0,0,60,124 4805 .BYTE 252,252,252,252,124,60 4810 .BYTE 60,62,63,63,63,63,62 4815 .BYTE 60,0,0,255,255,255,255 4820 .BYTE 126,60,60,126,255,255 4825 .BYTE 255,255,0,0,0,24,60,60 4830 .BYTE 60,60,60,60,60,60,60 4835 .BYTE 60,60,60,24,0,0,0,252 4840 .BYTE 254,254,252,0,0,0,0,63 4845 .BYTE 127,127,63,0,0,255,129 4850 .BYTE 189,161,185,161,129 4855 .BYTE 255 4860 CDAT2 .BYTE 0,126,255,126,60,24,0 4865 .BYTE 0 4870 ; 4875 ;LEVEL DATA 4880 ; 4885 DEL1 .BYTE 40,37,35,31,29,25 4890 .BYTE 24,23,22,21,20,19,18 4895 .BYTE 17,16 4900 BOUN .BYTE 50,45,40,30,25,25 4905 .BYTE 25,25,25,25,25,25,25 4910 .BYTE 25,25 4915 FTM .BYTE 25,24,23,22,21,20 4920 .BYTE 19,18,17,16,15,14,13 4925 .BYTE 12,11 4930 TOT .BYTE 16,14,26 4935 TIM .BYTE $60,$60,$55,$55,$50 4940 .BYTE $50,$45,$45,$40,$40 4945 .BYTE $40,$40,$40,$40,$40 4950 BDTBL .WORD BD1,BD2,BD3 4955 ; 4960 ;INSTALL DISPLAY LIST 4965 ; 4970 DL .BYTE $70,$70,$70,$42 4975 .WORD DISP 4980 .BYTE 2,$46 4985 .WORD DISP+80 4990 .BYTE 6,6,6,6,6,6,6,6,6,6,6 4995 .BYTE 6,6,6,6,6,6,6,6,6,6 5000 .BYTE $41 5005 .WORD DL 5010 ; 5015 SCL .SBYTE " SCORE: BONUS: " 5020 .SBYTE " LIVES: LEVEL:" 5025 .SBYTE " " 5030 ; 5035 TDL .BYTE $70,$70,$70,$70,$70 5040 .BYTE $70,$70,$70,$70,$47 5045 .WORD TITLE 5050 .BYTE $70,6,$70,7,$70,6 5055 .BYTE $70,6,6,$41 5060 .WORD TDL 5065 ; 5070 TITLE .SBYTE " BoNk " 5075 .SBYTE +$80," COPYRIGH" 5080 .SBYTE +$80,"T 1984 BY: " 5085 .SBYTE " JAMES HAGUE " 5090 .SBYTE " level: 1 " 5095 .SBYTE +$80," SELEC" 5100 .SBYTE +$80,"T FOR LEVEL " 5105 .SBYTE +$80," START TO" 5110 .SBYTE +$80," BEGIN " 5115 ; 5120 IX .BYTE 72,126,126,184 5125 .BYTE 128,96,152,128 5130 .BYTE 80,80,146,184 5135 IY .BYTE 120,72,192,120 5140 .BYTE 72,96,96,208 5145 .BYTE 210,168,104,128 5150 ; 5155 ; PLAYER, ENEMY, MUSIC DATA 5160 ; 5165 PDAT .BYTE 254,214,254,16,124,108 5170 .BYTE 108,238,254,214,254 5175 .BYTE 16,124,108,236,14,254 5180 .BYTE 214,254,16,124,236,12 5185 .BYTE 14,254,214,254,16,124 5190 .BYTE 108,236,14,254,214,254 5195 .BYTE 16,124,108,108,238,254 5200 .BYTE 214,254,16,124,108,110 5205 .BYTE 224,254,214,254,16,124 5210 .BYTE 110,96,224,254,214,254 5215 .BYTE 16,124,108,110,224 5220 EDAT .BYTE 0,32,32,63,60,60,252 5225 .BYTE 4,4,0,0,16,16,60,63 5230 .BYTE 252,60,8,8,0,0,8,8,60 5235 .BYTE 252,63,60,16,16,0,0,4 5240 .BYTE 4,252,60,60,63,32,32,0 5245 .BYTE 0,129,66,60,60,60,60 5250 .BYTE 66,129,0 5255 MUSIC .BYTE 160,0,160,130,140,150 5260 ; 5265 ;X,Y OFFSETS + MISC. 5270 ; 5275 XOFF .BYTE 1,1,1,0,$FF 5280 .BYTE $FF,$FF,0,0,0,0 5285 YOFF .BYTE 1,$FF,0,0 5290 .BYTE 1,$FF,0,0,1,$FF,0 5300 ENX .BYTE 0,0,1,1,1,0,$FF,$FF 5305 .BYTE $FF 5310 ENY .BYTE 0,$FF,$FF,0,1,1,1,0 5315 .BYTE $FF 5320 SCX .BYTE 44,44,42,42,42,44,46 5325 .BYTE 46,46 5330 SCY .BYTE 28,30,30,28,26,26,26 5335 .BYTE 28,30 5340 BDIR .BYTE 2,4,6,8 5345 FSND .BYTE 0,200,220,210,230,150 5350 GOVR .SBYTE "GAME OVER" 5355 ; 5360 ;BOARD DATA 5365 ; 5370 BD1 .SBYTE +$A0,"DAAAAIAAAAAAAA" 5375 .SBYTE +$A0,"IAAAACB@" 5380 .SBYTE ";" 5385 .SBYTE +$20,"@@B@@@@@@@@B@@" 5390 .SBYTE ";" 5395 .SBYTE +$A0,"@BB@@" 5400 .SBYTE ";" 5405 .SBYTE +$20,"@B@@@@@@@@B@" 5410 .SBYTE ";" 5415 .SBYTE +$A0,"@@BB@@@" 5420 .SBYTE ";" 5425 .SBYTE +$20,"B@@@@@@@@B" 5430 .SBYTE ";" 5435 .SBYTE +$A0,"@@@BH" 5440 .SBYTE +$20,"AAAAE@@@@@@@@F" 5445 .SBYTE +$20,"AAAA" 5450 .SBYTE +$A0,"GB@@@@@@@@@@@@" 5455 .SBYTE +$A0,"@@@@@@BB@@@@@@" 5460 .SBYTE +$A0,"@@@@@@@@@@@@BB" 5465 .SBYTE +$A0,"@@@@@@DAAAAC@@" 5470 .SBYTE +$A0,"@@@@BB@@@@DAJA" 5475 .SBYTE +$A0,"IIAJAC@@@@BHC@" 5480 .SBYTE +$20,"@@B@" 5485 .SBYTE ";" 5490 .SBYTE +$A0,"@BB@@" 5495 .SBYTE ";" 5500 .SBYTE +$20,"B@@@" 5505 .SBYTE +$A0,"DGBB" 5510 .SBYTE +$20,"@@@B@@O" 5515 .SBYTE +$A0,"BB@" 5520 .SBYTE +$20,"O@B@@@" 5525 .SBYTE +$A0,"BBHE@@" 5530 .SBYTE +$20,"@B@" 5535 .SBYTE ";" 5540 .SBYTE +$A0,"@BB@@" 5545 .SBYTE ";" 5550 .SBYTE +$20,"B@@@" 5552 .SBYTE +$A0,"FGB@@" 5555 .SBYTE +$A0,"@@FAIAJJAIAE@@" 5560 .SBYTE +$A0,"@@BB@@@@@@FAAA" 5565 .SBYTE +$A0,"AE@@@@@@BB@@@@" 5570 .SBYTE +$A0,"@@@@@@@@@@@@@@" 5575 .SBYTE +$A0,"BB@@@@@@@@@@@@" 5580 .SBYTE +$A0,"@@@@@@BB@@@@@@" 5585 .SBYTE +$A0,"@@@@@@@@@@@@BH" 5590 .SBYTE +$20,"AAAAC@@@@@@@@D" 5595 .SBYTE +$20,"AAAA" 5600 .SBYTE +$A0,"GB@@@" 5605 .SBYTE ";" 5610 .SBYTE +$20,"B@@@@@@@@B" 5615 .SBYTE ";" 5620 .SBYTE +$A0,"@@@BB@@" 5625 .SBYTE ";" 5630 .SBYTE +$20,"@B@@@@@@@@B@" 5635 .SBYTE ";" 5640 .SBYTE +$A0,"@@BB@" 5645 .SBYTE ";" 5650 .SBYTE +$20,"@@B@@@@@@@@B@@" 5655 .SBYTE ";" 5660 .SBYTE +$A0,"@BFAAAAJAAAAAA" 5665 .SBYTE +$A0,"AAJAAAAE" 5670 ; 5675 BD2 .SBYTE +$A0,"DAAAAAAAAAAAA" 5680 .SBYTE +$A0,"AAAAAACB@" 5685 .SBYTE ";" 5690 .SBYTE +$A0,"@@@@@@@@@@@@@@" 5695 .SBYTE ";" 5700 .SBYTE +$A0,"@BB@@@@@@@@@@@" 5705 .SBYTE +$A0,"@@@@@@@" 5710 .SBYTE +$A0,"BB@@DAAAC@@@@" 5715 .SBYTE +$A0,"DAAC@@@BB@@B@" 5720 .SBYTE ";" 5725 .SBYTE +$20,"@L@@@@L" 5730 .SBYTE ";" 5735 .SBYTE +$A0,"@B@@@BB@@B@@@@" 5740 .SBYTE +$A0,"@@@@@@@B@@@BB" 5745 .SBYTE +$A0,"@@L@@@@K@@K@@" 5750 .SBYTE +$A0,"@L@@@BB@@@@@@" 5755 .SBYTE +$A0,"@B@" 5760 .SBYTE ";" 5765 .SBYTE +$A0,"HAM@@@@@BB@@@" 5770 .SBYTE +$A0,"@@NAG@@" 5775 .SBYTE +$20,"B" 5780 .SBYTE +$A0,"@@@@@@@BB@@@@@" 5785 .SBYTE ";" 5790 .SBYTE +$20,"@HAAG@" 5795 .SBYTE ";" 5800 .SBYTE +$A0,"@@@@@BB@@@@@@@" 5805 .SBYTE +$20,"B@@" 5810 .SBYTE +$A0,"HAM@@@@@BB@@@" 5815 .SBYTE +$A0,"@@NAG" 5820 .SBYTE ";" 5825 .SBYTE +$A0,"@B@@@@@@@BB@@@" 5830 .SBYTE +$A0,"@@@@L@@L@@@@@" 5835 .SBYTE +$A0,"@@BB@@@" 5840 .SBYTE ";" 5845 .SBYTE +$A0,"@@@@@@@@@" 5850 .SBYTE ";" 5855 .SBYTE +$A0,"@@@@BB@@@@@@" 5860 .SBYTE +$20,"K@@@@K@@@@@@" 5865 .SBYTE +$A0,"BB@@@@@@B@@@@" 5870 .SBYTE +$A0,"B@@@@@@BB@@@@@" 5875 .SBYTE ";" 5880 .SBYTE +$A0,"B@@@@B" 5885 .SBYTE ";" 5890 .SBYTE +$A0,"@@@@@BB@@@@NAE" 5895 .SBYTE +$A0,"@@@@FAM@@@@BB@" 5900 .SBYTE +$A0,"@@@@@@@@@@@@@@" 5905 .SBYTE +$A0,"@@@BH" 5910 .SBYTE +$20,"AC@@@@@@@O@@@" 5915 .SBYTE +$20,"@@@DA" 5920 .SBYTE +$A0,"GB" 5925 .SBYTE ";" 5930 .SBYTE +$20,"B@@@@@@@@@@@@" 5935 .SBYTE +$20,"@@B" 5940 .SBYTE ";" 5945 .SBYTE +$A0,"BFAJAAAAAAAAA" 5950 .SBYTE +$A0,"AAAAAJAE" 5955 ; 5960 BD3 .SBYTE +$A0,"DAAAAAIAAAAAAI" 5965 .SBYTE +$A0,"AAAAACB" 5970 .SBYTE "; ; ;" 5975 .SBYTE +$20,"B@@@@@@" 5980 .SBYTE +$A0,"B@" 5985 .SBYTE "END" 5990 .SBYTE +$A0,"@BB@" 5995 .SBYTE "; ;" 6000 .SBYTE +$20,"@B@@" 6005 .SBYTE ";" 6010 .SBYTE +$A0,"@@@HAAAAAGB" 6015 .SBYTE "; ; ;" 6020 .SBYTE +$20,"B@@" 6025 .SBYTE +$A0,"DC@@B@" 6030 .SBYTE "; ;" 6035 .SBYTE +$A0,"@BH" 6040 .SBYTE +$20,"AAAAA" 6045 .SBYTE +$A0,"G@@B" 6050 .SBYTE +$20,"B@@" 6055 .SBYTE +$A0,"B@@" 6060 .SBYTE ";" 6065 .SBYTE +$A0,"@@BB@@@@@B@@" 6066 .SBYTE +$20,"B" 6070 .SBYTE +$A0,"B@@B@" 6075 .SBYTE "; ;" 6080 .SBYTE +$A0,"@BB@@" 6085 .SBYTE ";" 6090 .SBYTE +$A0,"@@B@@FE@@B@@" 6095 .SBYTE ";" 6100 .SBYTE +$A0,"@@BB@@@@@B@@@@" 6105 .SBYTE +$20,"@@B@@@@@" 6110 .SBYTE +$A0,"BB@@K@@B@@@@" 6115 .SBYTE +$20,"O@B@@@@@" 6120 .SBYTE +$A0,"BB@@B@" 6125 .SBYTE ";" 6130 .SBYTE +$A0,"B@@@@@@" 6135 .SBYTE +$20,"B@@@@@" 6140 .SBYTE +$A0,"BB@@B@@B@@DC@@" 6145 .SBYTE +$A0,"B@@@@@BB@@B@@B" 6150 .SBYTE +$20,"@@B" 6155 .SBYTE +$A0,"B@@B" 6160 .SBYTE "; ;" 6165 .SBYTE +$A0," BB" 6170 .SBYTE ";" 6175 .SBYTE +$A0,"@B@@B@@B" 6180 .SBYTE +$20,"B@" 6185 .SBYTE ";" 6190 .SBYTE +$A0,"H" 6195 .SBYTE +$20,"M@@@N" 6200 .SBYTE +$A0,"GB@@L@@B@@FE@" 6205 .SBYTE +$A0,"@B@@@@@BB@@@@" 6210 .SBYTE +$A0,"@B@@@@@@B@@@@" 6215 .SBYTE +$A0,"@BB@@@@@B@@@@" 6220 .SBYTE +$A0,"@@B@@@@@BB@@@" 6225 .SBYTE +$A0,"@@HAAA" 6230 .SBYTE +$20,"C@@" 6235 .SBYTE +$A0,"H" 6240 .SBYTE +$20,"AAAAA" 6245 .SBYTE +$A0,"GH" 6250 .SBYTE +$20,"AAAAA" 6255 .SBYTE +$A0,"G@" 6260 .SBYTE ";" 6265 .SBYTE +$20,"@B@@B@@@@@" 6270 .SBYTE +$A0,"BB@@" 6275 .SBYTE +$20,"O@@B@" 6280 .SBYTE ";" 6285 .SBYTE +$20,"@B@@L@@@@@" 6290 .SBYTE +$A0,"BB@@@@@" 6295 .SBYTE +$20,"B@" 6300 .SBYTE ";" 6305 .SBYTE +$20,"@B@@@@@" 6310 .SBYTE ";" 6315 .SBYTE +$A0,"@@BB@@@@@" 6320 .SBYTE +$20,"B@" 6325 .SBYTE ";" 6330 .SBYTE +$20,"@B@@@@@@@@" 6335 .SBYTE +$A0,"BFAAAAAJAAA" 6340 .SBYTE +$A0,"JAAAAAAAAE" 6345 ; 6350 *= $02E0 6355 .WORD GAME 6360 .END