A.N.A.L.O.G. ISSUE 35 / OCTOBER 1985 / PAGE 67

Bonk

16K Cassette or 24K Disk

by James Hague

This month’s assembly language game is Bonk, a fast-moving arcade game for one player. You control a small, green creature with joystick 1. Your object is to collect all of the flashing diamonds scattered around the board before time runs out. When you hit a diamond, a “ding” will be heard.

You’re probably thinking, “What a stupid game! It sounds easy.” Well, of course your green creature is not free to roam wherever it pleases. You’re being chased by three electric whirlers that kill on contact. They don’t sound friendly…and they aren’t.

They will chase you wherever they can, trying to send you to that big arcade in the sky. But, luckily, they aren’t extremely intelligent (in other words, their IQ is the same as their shoe size). When you’re being chased, just put a wall between yourself and your relentless pursuers, and Bonk! — they’ll slam into the wall and be thrown backwards.

After a while, they’ll regain their senses, and you’ll be in trouble again. If you plan your strategy correctly, you can get the whirlers trapped in corners. Bonking around. Just don’t trap them near a jewel that you still need. Later in the game, the whirlers will recover from a Bonk sooner, and you’ll have to use your other defenses. More on that in a minute.

Typing it in.

Before typing anything, look at the listings accompanying this article.

Listing 1 is the BASIC data and data checking routine. This listing is used to create both cassette and disk versions of Bonk. The data statements are listed in hexadecimal (base 16], so the program will fit in 16K cassette systems.

Listing 2 is the assembly language source code for the game of Bonk, created with the OSS MAC/65 assembler. You don’t have to type this listing to play the game! It is included for those readers interested in assembly language.

Follow the instructions below to make either a cassette or disk version of Bonk.

Cassette instructions.

  1. Type Listing 1 into your computer using the BASIC cartridge and verify your typing with Unicheck (see page 00).
  2. Type RUN and press RETURN. The program will begin and ask:
    MAKE CASSETTE (0) OR DISK (1)? Type 0 and press RETURN. The program will begin checking the DATA statements, printing the line number of each as it goes. It will alert you if it finds any problems. Fix any incorrect lines and re-RUN the program, if necessaiy. until all errors are eliminated.
  3. When all of your DATA lines are correct, the computer will beep twice and prompt you to READY CASSETTE AND PRESS RETURN. Now, insert a blank cassette in your recorder, press the RECORD and PLAY buttons simultaneously and hit RETURN. The message WRITING FILE will appear, and the program will create a machine language boot tape version of Bonk, printing DATA line numbers as it goes. When the READY prompt appears, the game is recorded and ready to play. CSAVE the BASIC program onto a separate tape before continuing.
  4. To play, rewind the tape created by the BASIC program to the beginning. Turn your computer OFF and remove all cartridges. Press the PLAY button on your recorder and turn ON your computer while holding down the START key. If you have a 600 or 800XL computer, you must hold the START and OPTION keys when you turn on the power. The computer will “beep” once. Hit the RETURN key, and Bonk will load and run automatically.

Disk instructions.

  1. Type Listing 1 into your computer, using the BASIC cartridge and verify your typing with Unicheck (see page 00).
  2. Type RUN and press RETURN. The program will ask:
    MAKE CASSETTE (0) OR DISK (1)? Type 1 and press RETURN. The program will begin checking the DATA lines, printing the line number of each statement as it goes. It will alert you if it finds any problems. Fix incorrect lines and re-RUN the program, if necessary, until all errors are eliminated.
  3. When all the DATA lines are correct, you will be prompted to INSERT DISK WITH DOS, PRESS RETURN. Put a disk containing DOS 2.0S into drive #1 and press RETURN. The message WRITING FILE will appear, and the program will create an AUTORUN.SYS file on the disk, displaying each DATA line number as it goes. When the READY prompt appears, the game is ready to play. Be sure the BASIC program is SAVEd before continuing.
  4. To play the game, insert the disk containing the AUTORUN.SYS file into drive #1. Turn your computer OFF, remove all cartridges and turn the computer back ON. Bonk will load and run automatically.

Bonking.

In order to play, you must have a joystick plugged into port 1. If, after you’ve loaded Bonk, the title screen does not appear try to locate your error. To start on a level other than 1, press the SELECT key. To begin play, press START (of course).

First of all, you’ll probably notice that the walls are two different colors. If you cruise into a blue one. bzzzzt — you’re fried. But, if you hit a green one, it will disappear. This opens up all sorts of strategic possibilities. Use them wisely.

Also, there are small boxes lying around, marked with an F. If you hit one of these, the whirlers will be frozen for a couple of seconds (by now, you’ve figured out that the F is for “freeze”). There are very few of these boxes, so don’t waste them. They can come in handy when you’re surrounded.

The scoring In Bonk is relatively simple. Bagging a jewel is worth 70 points. Flitting a freeze box is worth 100, plus the handy freeze effect. Wiping out the green walls doesn’t give you any points, but it’s a good way to sneak by the whirlers.

When you finish a board, 10 points will be added to your score for each second left on the timer Then it’s on to the next board — there are three. After you complete the third board, you gain an extra life.

Good luck and happy Bonking!


James Hague is a junior at Berknar High School in Richardson. Texas. After graduation, he plans to major in computer science.


Listing 1.
BASIC listing.

10 REM *** BONK ***
20 TRAP 20:? "MAKE CASSETTE (0), OR DISK (1)";:INPUT DSK:IF DSK>1 THEN 20
30 TRAP 40000:DATA 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15
40 DIM DAT$(91),HEX(22):FOR X=0 TO 22:READ N:HEX(X)=N:NEXT X:LINE=990:RESTORE 1000:TRAP 120:? "CHECKING DATA"
50 LINE=LINE+10:? "LINE:";LINE:READ DAT$:IF LEN(DAT$)<>90 THEN 220
60 DATLIN=PEEK(183)+PEEK(184)*256:IF DATLIN<>LINE THEN ? "LINE ";LINE;" MISSING!":END 
70 FOR X=1 TO 89 STEP 2:D1=ASC(DAT$(X))-48:D2=ASC(DAT$(X+1))-48:BYTE=HEX(D1)*16+HEX(D2)
80 IF PASS=2 THEN PUT #1,BYTE:NEXT X:READ CHKSUM:GOTO 50
90 TOTAL=TOTAL+BYTE:IF TOTAL>999 THEN TOTAL=TOTAL-1000
100 NEXT X:READ CHKSUM:IF TOTAL=CHKSUM THEN 50
110 GOTO 220
120 IF PEEK(195)<>6 THEN 220
130 IF PASS=0 THEN 170
140 IF  NOT DSK THEN 160
150 PUT #1,224:PUT #1,2:PUT #1,225:PUT #1,2:PUT #1,0:PUT #1,40:CLOSE #1:END 
160 FOR X=1 TO 34:PUT #1,0:NEXT X:CLOSE #1:END 
170 IF  NOT DSK THEN 200
180 ? "INSERT DISK WITH DOS, PRESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:AUTORUN.SYS"
190 PUT #1,255:PUT #1,255:PUT #1,0:PUT #1,40:PUT #1,181:PUT #1,53:GOTO 210
200 ? "READY CASSETTE AND PRESS RETURN";:OPEN #1,8,128,"C:":RESTORE 230:FOR X=1 TO 40:READ N:PUT #1,N:NEXT X
210 ? :? "WRITING FILE":PASS=2:LINE=990:RESTORE 1000:TRAP 120:GOTO 50
220 ? "BAD DATA: LINE ";LINE:END 
230 DATA 0,28,216,39,255,39,169,0,234,234,234,169,60,141,2,211,169,0,141,231,2,133,14,169,56,141,232,2
240 DATA 133,15,169,0,133,10,169,40,133,11,24,96
1000 DATA 2065E4A95085C1A91D85C2A202A5C29D3222A5C19D002218691485C19002E6C2E8E018D0E8A9008584AABD00E0,756
1010 DATA 9D0020BDFFE09DFF20E8D0F1A9208DF402A277BDF42D9D0820CA10F7A207BD6C2E9DD820CA10F7A900858D2072,718
1020 DATA 2A20852AA9038D3002A92F8D3102A9C88DC402A9788DC502A9468DC602AD1FD06A90206AB0F7E684A584C909D0,955
1030 DATA 04A900858418690109108D642FAD1FD0C905F0F9D0DAAD1FD06A90FAA9008580858185828586A9038587A58485,373
1040 DATA 838585A900858DA583F8186901D88583A685E00FF002E685A686E003F004E686D00CA2018686A587C909F002E6,278
1050 DATA 87A685BD732E85A3A90585A5BD822E859CBD912E85A2A686BDA02E85AAA9B98D3002A92E8D310220852AA90085,618
1060 DATA 8D858A85AB85A98D1ED08594859585A485A68589859D859E859FA685BDA32E8588A0CBA22AA907205CE4A5860A,687
1070 DATA AABDB12E85C1BDB22E85C2A000B1C199501DC8C0F0D0F618A5C169F085C19002E6C2A000B1C199401EC8C0F0D0,453
1080 DATA F6A9688DC402A9C88DC502A9008DC602A9868DC702A227BDDB2E9D001DA9009D281DCA10F220802C20692C208E,430
1090 DATA 2CA583A04A206D2CA5860A0AAABD8F2F858CBD9B2F858BE8A002BD8F2F998E00BD9B2F999100A9009999009996,528
1100 DATA 00E88810E820722AA9208D07D4A9028D1DD0A93E8D2F02A9018D6F02A9DA8DC002A91A8DC1028DC2028DC302A5,380
1110 DATA 8C8D00D0A48BA200BDAB2F95B9990024C8E8E008D0F2A209BDEB2F95AFCA10F8209F2AA9AA8D01D2A205BD1D30,167
1120 DATA 8D00D2A905204B2DCA10F220852AA928204B2DA9FF858D20192B20802C20692CAD1FD06A902DADFC02C921D00E,645
1130 DATA A9FF8DFC02458D858DD003208F2AA58DF0E1A58AD00DA588F009A5ABC5AAD0CA4CBB2D4C612D4C5428A900AA9D,556
1140 DATA 00249D00259D00269D0027E8D0F160A90085AC85AD85A085AE8D01D28D03D28D05D28D07D28D08D260A90085C5,708
1150 DATA A92585C6A90085A7A6A7E003F0D3B58E9D01D0B491A200B5AF91C5C8E8E00AD0F6E6A7E6C64CAB2AD8A58DF00F,610
1160 DATA 20EB2B20D62C20122D20E52A20942C8D1ED04C62E4A207A48BA900854D990024C8CA10F9AE780286A9A58C187D,373
1170 DATA 1E30858C8D00D0A58B187D2930858BA207A8B5B9990024C8CA10F760A5A0D011A5A4F003C6A460A5A385A4A5A6,76
1180 DATA F003C6A660A5A585A6A200209C2BB596F005D6964C812BB58EC58C900AD004A900F006A9FFD002A9018594B591,841
1190 DATA C58B900AD004A900F006A9FFD002A9018595A008A594D93930D00CA595D94230D00598959910038810EAB599A8,286
1200 DATA B58E18793930958EB591187942309591E8E003D09C4C9F2AB599A8B58E38F94B304A4A4A8594B59138F954304A,722
1210 DATA 4A4AA8B9002285C1B9322285C2A494B1C1293FF069C91BF065C90FF061A59C9596A9108D00D2A9068D01D285AC,420
1220 DATA AD0AD22903A8B95D30959910B1A58B38E91C4A4A4AA8B9002285C3B9322285C4A58C38E92C4A4A4AA8B1C3293F,506
1230 DATA F022C90FF032C91BF01BB1C329C0C940D012A90385AEA9F08D06D2A9C88D07D2A90091C360A97020552CA91085,214
1240 DATA ADA9828D02D2E6AB4C2B2C202B2CA5A285A0A90585A1A9A68D05D2A950F81865808580A90065818581A9006582,573
1250 DATA 8582D860A588A03648386A4A4A4A99001DC868290F091099001D60A202A02AB580206D2CC8CA10F760A587A040,109
1260 DATA D0D9A4ACF0068884AC8C01D2A4ADF0098884AD9809A08D03D2A5A0F019A4A1B961308D04D2C6A1D00DA90585A1,257
1270 DATA C6A0D005A9008D05D2A5AEF009C6AED005A9008D07D260E69FA59FC914D010A900859FA968CDC402D002A90A8D,974
1280 DATA C402E689A589C93CD00DA9008589A588F838E901D88588AD0CD0858AAD04D02908F002858A60A59D18690AC932,505
1290 DATA D002A900859DA8A209B9EB2F95AFC8CA10F7A5A9C90FF009A59E186908C940D002A900859EA8A207B9AB2F95B9,237
1300 DATA C8CA10F76085A7A9008514A514C5A7F0BAAD1FD0C907F0F34C5428A900858D20852AC687208E2CA9CC8D01D2A2,986
1310 DATA 28E68CA58C8D00D0AD0AD28D00D2A901204B2DC68CA58C8D00D0AD0AD28D00D2A901204B2DCA10D920852AA587,116
1320 DATA F0034C0829A209BD67309D311ECA10F720722AA9FF204B2D4C5428A900858D20852AA588F838E9018588D82069,771
1330 DATA 2CA91020552C20802CA9328D00D2A0A48C01D2A901204B2D88C0A0D0F3A588D0D420852A4CB7280000FFFFFFFF,118
1340 DATA 00003C3C3C3C3C3C3C3C0000F8FCFCFC3C3C00001F3F3F3F3C3C3C3CFCFCFCF800003C3C3F3F3F1F00003C7CFC,962
1350 DATA FCFCFC7C3C3C3E3F3F3F3F3E3C0000FFFFFFFF7E3C3C7EFFFFFFFF000000183C3C3C3C3C3C3C3C3C3C3C3C1800,578
1360 DATA 0000FCFEFEFC000000003F7F7F3F0000FF81BDA1B9A181FF007EFF7E3C1800002825231F1D1918171615141312,369
1370 DATA 1110322D281E1919191919191919191919191817161514131211100F0E0D0C0B100E1A60605555505045454040,956
1380 DATA 404040404071302932E13370707042001D0246501D06060606060606060606060606060606060606060641B92E,838
1390 DATA 000033232F32251A00000000222F2E35331A000000002C293625331A000000002C2536252C1A00007070707070,396
1400 DATA 70707070471B2F70067007700670060641032F0000000000000000226F2E6B000000000080808080A3AFB0B9B2,270
1410 DATA A9A7A8B4809199989480A2B99A80800000002A212D253300002821273525000000000000000000006C6576656C,511
1420 DATA 1A00110080808080808080B3A5ACA5A3B480A6AFB280ACA5B6A5AC8080808080B3B4A1B2B480B4AF80A2A5A7A9,897
1430 DATA AE808080487E7EB880609880505092B87848C078486060D0D2A86880FED6FE107C6C6CEEFED6FE107C6CEC0EFE,333
1440 DATA D6FE107CEC0C0EFED6FE107C6CEC0EFED6FE107C6C6CEEFED6FE107C6C6EE0FED6FE107C6E60E0FED6FE107C6C,305
1450 DATA 6EE00020203F3C3CFC0404000010103C3FFC3C0808000008083CFC3F3C101000000404FC3C3C3F202000008142,814
1460 DATA 3C3C3C3C428100A000A0828C9601010100FFFFFF0000000001FF000001FF000001FF00000001010100FFFFFF00,293
1470 DATA FFFF0001010100FF2C2C2A2A2A2C2E2E2E1C1E1E1C1A1A1A1C1E0204060800C8DCD2E69627212D2500002F3625,31
1480 DATA 32C4C1C1C1C1C9C1C1C1C1C1C1C1C1C9C1C1C1C1C3C2C01B40404240404040404040404240401BC0C2C2C0C01B,293
1490 DATA 4042404040404040404042401BC0C0C2C2C0C0C01B424040404040404040421BC0C0C0C2C84141414145404040,629
1500 DATA 40404040404641414141C7C2C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C2C2C0C0C0C0C0C0C0C0C0C0C0C0C0,12
1510 DATA C0C0C0C0C0C2C2C0C0C0C0C0C0C4C1C1C1C1C3C0C0C0C0C0C0C2C2C0C0C0C0C4C1CAC1C9C9C1CAC1C3C0C0C0C0,720
1520 DATA C2C8C3C0404042401BC0C2C2C0C01B42404040C4C7C2C24040404240404FC2C2C04F4042404040C2C2C8C5C0C0,433
1530 DATA 4042401BC0C2C2C0C01B42404040C6C7C2C0C0C0C0C6C1C9C1CACAC1C9C1C5C0C0C0C0C2C2C0C0C0C0C0C0C6C1,934
1540 DATA C1C1C1C5C0C0C0C0C0C0C2C2C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C2C2C0C0C0C0C0C0C0C0C0C0C0C0C0,590
1550 DATA C0C0C0C0C0C2C2C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C2C8414141414340404040404040404441414141,955
1560 DATA C7C2C0C0C01B424040404040404040421BC0C0C0C2C2C0C01B4042404040404040404042401BC0C0C2C2C01B40,851
1570 DATA 404240404040404040404240401BC0C2C6C1C1C1C1CAC1C1C1C1C1C1C1C1CAC1C1C1C1C5C4C1C1C1C1C1C1C1C1,727
1580 DATA C1C1C1C1C1C1C1C1C1C1C3C2C01BC0C0C0C0C0C0C0C0C0C0C0C0C0C01BC0C2C2C0C0C0C0C0C0C0C0C0C0C0C0C0,56
1590 DATA C0C0C0C0C0C2C2C0C0C4C1C1C1C3C0C0C0C0C4C1C1C3C0C0C0C2C2C0C0C2C01B404C404040404C1BC0C2C0C0C0,525
1600 DATA C2C2C0C0C2C0C0C0C0C0C0C0C0C0C0C0C2C0C0C0C2C2C0C0CCC0C0C0C0CBC0C0CBC0C0C0CCC0C0C0C2C2C0C0C0,227
1610 DATA C0C0C0C0C2C01BC8C1CDC0C0C0C0C0C2C2C0C0C0C0C0CEC1C7C0C042C0C0C0C0C0C0C0C2C2C0C0C0C0C01B4048,217
1620 DATA 414147401BC0C0C0C0C0C2C2C0C0C0C0C0C0C0424040C8C1CDC0C0C0C0C0C2C2C0C0C0C0C0CEC1C71BC0C2C0C0,696
1630 DATA C0C0C0C0C0C2C2C0C0C0C0C0C0C0CCC0C0CCC0C0C0C0C0C0C0C2C2C0C0C01BC0C0C0C0C0C0C0C0C01BC0C0C0C0,38
1640 DATA C2C2C0C0C0C0C0C04B404040404B404040404040C2C2C0C0C0C0C0C0C2C0C0C0C0C2C0C0C0C0C0C0C2C2C0C0C0,180
1650 DATA C0C01BC2C0C0C0C0C21BC0C0C0C0C0C2C2C0C0C0C0CEC1C5C0C0C0C0C6C1CDC0C0C0C0C2C2C0C0C0C0C0C0C0C0,542
1660 DATA C0C0C0C0C0C0C0C0C0C0C2C84143404040404040404F4040404040404441C7C21B424040404040404040404040,222
1670 DATA 404040421BC2C6C1CAC1C1C1C1C1C1C1C1C1C1C1C1C1C1CAC1C5C4C1C1C1C1C1C9C1C1C1C1C1C1C9C1C1C1C1C1,274
1680 DATA C3C21B001B001B42404040404040C2C0252E24C0C2C2C01B001B404240401BC0C0C0C8C1C1C1C1C1C7C21B001B,998
1690 DATA 001B424040C4C3C0C0C2C01B001BC0C2C84141414141C7C0C0C2424040C2C0C01BC0C0C2C2C0C0C0C0C0C2C0C0,231
1700 DATA 42C2C0C0C2C01B001BC0C2C2C0C01BC0C0C2C0C0C6C5C0C0C2C0C01BC0C0C2C2C0C0C0C0C0C2C0C0C0C0404042,540
1710 DATA 4040404040C2C2C0C0CBC0C0C2C0C0C0C04F40424040404040C2C2C0C0C2C01BC2C0C0C0C0C0C0424040404040,627
1720 DATA C2C2C0C0C2C0C0C2C0C0C4C3C0C0C2C0C0C0C0C0C2C2C0C0C2C0C0C2404042C2C0C0C21B00001BA0C2C21BC0C2,9
1730 DATA C0C0C2C0C0C242401BC84D4040404EC7C2C0C0CCC0C0C2C0C0C6C5C0C0C2C0C0C0C0C0C2C2C0C0C0C0C0C2C0C0,671
1740 DATA C0C0C0C0C2C0C0C0C0C0C2C2C0C0C0C0C0C2C0C0C0C0C0C0C2C0C0C0C0C0C2C2C0C0C0C0C0C8C1C1C1434040C8,963
1750 DATA 4141414141C7C84141414141C7C01B40424040424040404040C2C2C0C04F404042401B404240404C4040404040,864
1760 DATA C2C2C0C0C0C0C042401B404240404040401BC0C0C2C2C0C0C0C0C042401B40424040404040404040C2C6C1C1C1,348
1770 DATA C1C1CAC1C1C1CAC1C1C1C1C1C1C1C1C50000000000000000000000000000000000000000000000000000000000,458

Listing 2.
Assembly listing.

;*****************************
;*            BONK           *
;*      Copyright  1984      *
;* Programmed by James Hague *
;*  Using MAC/65 by OSS Inc. *
;*****************************
;
;HARDWARE REGISTERS
;
RANDOM	=	$D20A	;Random #s
GRACTL	=	$D01D	;Graphic ctrl
AUDC1	=	$D201	;Audio controls
AUDC2	=	$D203
AUDC3	=	$D205
AUDC4	=	$D207
AUDF1	=	$D200	;Audio frequency
AUDF2	=	$D202
AUDF3	=	$D204
AUDF4	=	$D206
AUDCTL	=	$D208
HPOSP0	=	$D000	;Pl. 0 horiz.
HPOSP1	=	$D001	;Pl. 1 horiz.
P0PF	=	$D004	;P0 to PF coll.
P0PL	=	$D00C	;P0 to PL coll.
HITCLR	=	$D01E	;Collision clear
CONSOL	=	$D01F	;Console buttons
PMBASE	=	$D407
SETVBV	=	$E45C	;VBLANK vectors
XITVBV	=	$E462	;VBLANK exit
SIOINV	=	$E465	;Initialize SIO
;
;SHADOW REGISTERS
;
CLOCK	=	$14	;Real time clock
ATTRACT	=	$4D
DMACTL	=	$022F	;DMA control
SDLSTL	=	$0230	;Dlist pointer
GPRIOR	=	$026F
STICK	=	$0278	;Joystick 0
COL0	=	$02C4	;Color regs.
COL1	=	$02C5
COL2	=	$02C6
COL3	=	$02C7
PCOL0	=	$02C0	;Player colors
PCOL1	=	$02C1
CHBAS	=	$02F4	;Character base
CH	=	$02FC	;Keyboard buffer
;
	*=	$80
;
;GAME VARIABLES
;
SCORE	.DS	3	;Player's score
LEVEL	.DS	1	;Current level
SLEVEL	.DS	1	;Starting level
BLEVEL	.DS	1	;Binary level
BOARD	.DS	1	;Current board
LIVES	.DS	1	;Remaining lives
TIME	.DS	2	;Bonus timer
DIE	.DS	1	;Death flag
P0Y	.DS	1	;Pl0 y position
P0X	.DS	1	;Pl0 x position
GAMCTL	.DS	1	;Game control
ENXPOS	.DS	3	;Enemy X pos.
ENYPOS	.DS	3	;Enemy Y pos.
ENXADD	.DS	1	;Enemy X add
ENYADD	.DS	1	;Enemy Y add
ENBOUN	.DS	3	;En bounce flags
ENDIR	.DS	3	;Enemy direction
BDIST	.DS	1	;Bounce distance
ENAN	.DS	1	;Enemy pointer
PLAN	.DS	1	;Play. pointer
FLASH	.DS	1	;Treas. flasher
FREEZE	.DS	2	;Freeze timers
FTIME	.DS	1	;Freeze time
WAIT	.DS	4	;Time delay
TEMP	.DS	2	;Temp storage
DIR	.DS	1	;Jstick direct.
TOTAL	.DS	1	;Jewels/board
COUNT	.DS	1	;Jewels/taken
BONK	.DS	1	;Bounce sound
DING	.DS	1	;Bell sound
WSND	.DS	1	;Eat wall sound
ENEMY	.DS	10	;Enemy image
PLAYER	.DS	8	;Player image
LO	.DS	2	;General pointer
VLO	.DS	2	;Ditto
POINT	.DS	2	;Play. pointer
;
;RESERVED MEMORY
;
	*=	$2000
;
PM	.DS	$0400	;Pmbase
PL0	.DS	$0100
PL1	.DS	$0100
PL2	.DS	$0100
PL3	.DS	$0100
;
DISP	=	$1D00	;Display area
CHSET	=	$2000	;New char set
LOTBL	=	$2200	;Plotter table
HITBL	=	LOTBL+50
;
	*=	$2800	;Program start
;
;SET-UP PLOTTER
;
GAME	JSR	SIOINV	;Init sounds
	LDA	# <DISP+80
	STA	LO
	LDA	# >DISP+80
	STA	LO+1
	LDX	#2
SEPL	LDA	LO+1
	STA	HITBL,X
	LDA	LO
	STA	LOTBL,X
	CLC
	ADC	#20
	STA	LO
	BCC	SEP2
	INC	LO+1
SEP2	INX
	CPX	#24
	BNE	SEPL
	LDA	#0
	STA	SLEVEL
;
;REDEFINE CHARSET
;
	TAX		;Move set
MSET	LDA	$E000,X
	STA	CHSET,X
	LDA	$E0FF,X
	STA	CHSET+$FF,X
	INX
	BNE	MSET
	LDA	# >CHSET	;Install it
	STA	CHBAS
	LDX	#119	;Redefine set
RDEF	LDA	CDAT,X
	STA	CHSET+8,X
	DEX
	BPL	RDEF
	LDX	#7
RDEF2	LDA	CDAT2,X
	STA	CHSET+216,X
	DEX
	BPL	RDEF2
;
GO	LDA	#0	;Turn off VBI
	STA	GAMCTL
	JSR	PMCLR	;No players
	JSR	QUIET	;No sound
;
;TITLE SCREEN
;
	LDA	# <TDL	;Point to title
	STA	SDLSTL	;screen display
	LDA	# >TDL	;list.
	STA	SDLSTL+1
	LDA	#200	;Set up title
	STA	COL0	;colors.
	LDA	#120
	STA	COL1
	LDA	#70
	STA	COL2
;
START	LDA	CONSOL	;Start key
	ROR	A	;pressed?
	BCC	ST1	;Yes!
;
;LEVEL SELECTION
;
	ROR	A	;Select pressed?
	BCS	START	;No, skip this.
	INC	SLEVEL	;Yes, start at
	LDA	SLEVEL	;next level.
	CMP	#9	;Highest level?
	BNE	Z1	;No, continue.
	LDA	#0	;Yes, reset and
	STA	SLEVEL	;store it.
Z1	CLC		;Add 1 to start-
	ADC	#1	;ing level #
	ORA	#16	;Add color
	STA	TITLE+73	;and show it
Z2	LDA	CONSOL	;Get keys again
	CMP	#5	;Key released?
	BEQ	Z2	;No, wait for it
	BNE	START	;Branch always!
;
ST1	LDA	CONSOL
	ROR	A
	BCC	ST1
	LDA	#0	;Set variables
	STA	SCORE	;that are set
	STA	SCORE+1	;once per game.
	STA	SCORE+2
	STA	BOARD
	LDA	#3	;3 lives
	STA	LIVES
	LDA	SLEVEL	;Set level
	STA	LEVEL
	STA	BLEVEL
;
NEWLEV	LDA	#0	;Turn off VBI
	STA	GAMCTL
	LDA	LEVEL	;Get BCD level
	SED
	CLC
	ADC	#1	;And raise it
	CLD
	STA	LEVEL	;Then store.
	LDX	BLEVEL	;Get bin. level
	CPX	#15	;Highest level?
	BEQ	SAMEL	;Yes, keep it.
	INC	BLEVEL	;No, raise it.
SAMEL	LDX	BOARD	;Get board #
	CPX	#3	;Highest board?
	BEQ	BRD1	;Yes, reset
	INC	BOARD	;and store
	BNE	SETLEV	;Branch always!
;
BRD1	LDX	#1	;Reset board #
	STX	BOARD
	LDA	LIVES	;And give extra
	CMP	#9	;life
	BEQ	SETLEV
	INC	LIVES
SETLEV	LDX	BLEVEL	;Binary level
	LDA	DEL1-1,X	;Set up delay
	STA	WAIT
	LDA	#5
	STA	WAIT+2
	LDA	BOUN-1,X	;Get bounces
	STA	BDIST
	LDA	FTM-1,X	;Get freeze time
	STA	FTIME
	LDX	BOARD	;Board #
	LDA	TOT-1,X	;Get jewels
	STA	TOTAL
	LDA	# <DL	;Install DL
	STA	SDLSTL
	LDA	# >DL
	STA	SDLSTL+1
;
NEWLIFE	JSR	QUIET	;No sound.
	LDA	#0	;Zero items
	STA	GAMCTL	;that must be
	STA	DIE	;zeroed for each
	STA	COUNT	;new life
	STA	DIR
	STA	HITCLR
	STA	ENXADD
	STA	ENYADD
	STA	WAIT+1
	STA	WAIT+3
	STA	TIME+1
	STA	ENAN	;Reset pointers
	STA	PLAN
	STA	FLASH
	LDX	BLEVEL	;Set timer
	LDA	TIM-1,X
	STA	TIME
	LDY	# <VBI	;Deferred VBI
	LDX	# >VBI
	LDA	#7
	JSR	SETVBV
;
;DRAW SCREEN
;
	LDA	BOARD	;Get board #
	ASL	A	;Times 2
	TAX		;use as index
	LDA	BDTBL-2,X	;Board lo byte
	STA	LO
	LDA	BDTBL-1,X	;Hi byte of it
	STA	LO+1
	LDY	#0	;Draw 1st part
DR1	LDA	(LO),Y	;Get screen byte
	STA	DISP+80,Y	;and show it
	INY
	CPY	#240
	BNE	DR1
	CLC
	LDA	LO	;point to part 2
	ADC	#240
	STA	LO
	BCC	DR2
	INC	LO+1
DR2	LDY	#0
DR3	LDA	(LO),Y	;Get byte
	STA	DISP+320,Y
	INY
	CPY	#240
	BNE	DR3
;
;INITIALIZE
;
	LDA	#104	;Color 0 is
	STA	COL0	;purple
	LDA	#200	;Color 1 is
	STA	COL1	;green
	LDA	#0	;Color 2 is
	STA	COL2	;black
	LDA	#134	;Color 3 is
	STA	COL3	;blue
	LDX	#39	;Print score
PS	LDA	SCL,X	;line
	STA	DISP,X
	LDA	#0
	STA	DISP+40,X
	DEX
	BPL	PS
	JSR	SHOSC	;Show score
	JSR	SHOBO	;Show bonus
	JSR	SHOLI	;Show lives
	LDA	LEVEL	;Show level
	LDY	#74
	JSR	BCD
	LDA	BOARD	;Set initial
	ASL	A	;player
	ASL	A	;positions.
	TAX
	LDA	IX-4,X	;Set player X
	STA	P0X
	LDA	IY-4,X	;and Y
	STA	P0Y
	INX
	LDY	#2	;Set all enemy
SET	LDA	IX-4,X	;X
	STA	ENXPOS,Y
	LDA	IY-4,X	;Y
	STA	ENYPOS,Y
	LDA	#0
	STA	ENDIR,Y	;Zero enemy
	STA	ENBOUN,Y	;status
	INX
	DEY
	BPL	SET	;Finish up
;
;P/M SET UP
;
	JSR	PMCLR	;Clear players
	LDA	# >PM	;Point to PM
	STA	PMBASE	;area
	LDA	#2	;Set gractl
	STA	GRACTL
	LDA	#62	;Set dmactl
	STA	DMACTL
	LDA	#1	;Set priority
	STA	GPRIOR
	LDA	#218	;Set pl0 color
	STA	PCOL0
	LDA	#26	;Set enemy color
	STA	PCOL1
	STA	PCOL1+1
	STA	PCOL1+2
	LDA	P0X	;Draw player
	STA	HPOSP0	;Set x pos.
	LDY	P0Y	;Get y
	LDX	#0
PD	LDA	PDAT,X	;Get player byte
	STA	PLAYER,X
	STA	PL0,Y	;And show it
	INY
	INX
	CPX	#8
	BNE	PD
	LDX	#9	;Copy enemy data
CD	LDA	EDAT,X	;from memory to
	STA	ENEMY,X	;animation table
	DEX
	BPL	CD
	JSR	DRAWEN	;Draw enemy
	LDA	#170	;Introduction
	STA	AUDC1
	LDX	#5
IN	LDA	MUSIC,X
	STA	AUDF1
	LDA	#5
	JSR	DELAY
	DEX
	BPL	IN
	JSR	QUIET
	LDA	#40
	JSR	DELAY
	LDA	#$FF	;Turn on the
	STA	GAMCTL	;VBI
;
;MAIN LOOP
;
MAIN	JSR	ENMOVE	;Move enemy
	JSR	SHOSC	;Show score
	JSR	SHOBO	;Show bonus
M1	LDA	CONSOL	;Start pressed?
	ROR	A
	BCC	M4	;Yes.
	LDA	CH
	CMP	#$21	;Space bar?
	BNE	M2	;No.
	LDA	#$FF
	STA	CH	;Reset keycode
	EOR	GAMCTL	;Flip pause
	STA	GAMCTL
	BNE	M2
	JSR	HUSH	;Peace and...
M2	LDA	GAMCTL
	BEQ	M1
	LDA	DIE	;Player dead?
	BNE	M3	;Yes.
	LDA	TIME	;Time up?
	BEQ	M3
	LDA	COUNT	;Level done?
	CMP	TOTAL
	BNE	MAIN
	JMP	LDONE
M3	JMP	KILL	;Auuughh!
M4	JMP	GO
;
;CLEAR PM
;
PMCLR	LDA	#0
	TAX
PC	STA	PL0,X
	STA	PL1,X
	STA	PL2,X
	STA	PL3,X
	INX
	BNE	PC
DE3	RTS
;
;SOUND OFF
;
QUIET	LDA	#0	;Turn off sound
	STA	BONK
	STA	DING
	STA	FREEZE
	STA	WSND
HUSH	STA	AUDC1
	STA	AUDC2
	STA	AUDC3
	STA	AUDC4
	STA	AUDCTL
	RTS
;
;DRAW ENEMY
;
DRAWEN	LDA	# <PL1	;Draw all 3
	STA	POINT	;enemy
	LDA	# >PL1
	STA	POINT+1
	LDA	#0
	STA	TEMP
DE1	LDX	TEMP
	CPX	#3
	BEQ	DE3
	LDA	ENXPOS,X	;Set x position
	STA	HPOSP1,X
	LDY	ENYPOS,X
	LDX	#0
DE2	LDA	ENEMY,X
	STA	(POINT),Y
	INY
	INX
	CPX	#10
	BNE	DE2
	INC	TEMP
	INC	POINT+1
	JMP	DE1
;
;VBI
;
VBI	CLD		;Kill decimal!
	LDA	GAMCTL	;Do this VBI?
	BEQ	EXIT	;No! Get out!
	JSR	PCHK	;Check player
	JSR	STUFF	;Do work
	JSR	ANIM	;Animate
	JSR	PLMOVE	;Move player
	JSR	SOUND	;Make noise
EXIT	STA	HITCLR	;Clear all hits
	JMP	XITVBV	;Go home!
;
;MOVE PLAYER
;
PLMOVE	LDX	#7	;1st- erase
	LDY	P0Y	;player
	LDA	#0
	STA	ATTRACT	;Kill attract
ERPL	STA	PL0,Y
	INY
	DEX
	BPL	ERPL
	LDX	STICK	;2nd- get new
	STX	DIR	;player position
	LDA	P0X	;Get x position
	CLC		;then add offset
	ADC	XOFF-5,X	;to old coord
	STA	P0X	;Save new pos.
	STA	HPOSP0	;and show it
	LDA	P0Y	;Now repeat for
	CLC		;y position.
	ADC	YOFF-5,X
	STA	P0Y
	LDX	#7	;3rd- redraw
	TAY
DRPL	LDA	PLAYER,X
	STA	PL0,Y
	INY
	DEX
	BPL	DRPL
	RTS
;
;ENEMY HANDLER
;
ENMOVE	LDA	FREEZE	;Frozen?
	BNE	TWX	;Yup, ice cold.
	LDA	WAIT+1	;Get 1st timer
	BEQ	TWO	;If 0, do next.
	DEC	WAIT+1	;Decrement 1st
	RTS		;And leave.
;
TWO	LDA	WAIT	;Reset 1st timer
	STA	WAIT+1
	LDA	WAIT+3	;Get 2nd timer
	BEQ	MOVE	;If 0, move 'em
	DEC	WAIT+3	;Decrement 2nd
TWX	RTS
;
MOVE	LDA	WAIT+2	;Reset 2nd
	STA	WAIT+3
	LDX	#0	;Main counter
DOMOR	JSR	CHECK	;Check enemy
	LDA	ENBOUN,X	;Bouncing?
	BEQ	NOB	;No, continue.
	DEC	ENBOUN,X	;Yes,
	JMP	OUT	;Do next enemy.
;
NOB	LDA	ENXPOS,X	;Get x pos
	CMP	P0X	;Comp with play
	BCC	XLES	;Less than?
	BNE	XMOR	;More than?
	LDA	#0	;Equal to, stop
	BEQ	DOY	;movement.
XMOR	LDA	#$FF	;More than, move
	BNE	DOY	;left.
XLES	LDA	#1	;Less than, move
DOY	STA	ENXADD	;right.
	LDA	ENYPOS,X	;Get y pos
	CMP	P0Y	;Comp eith play
	BCC	YLES	;Less than?
	BNE	YMOR	;More than?
	LDA	#0	;Equal to, stop
	BEQ	FINI	;movement.
YMOR	LDA	#$FF	;More than, move
	BNE	FINI	;left.
YLES	LDA	#1	;Less than, move
FINI	STA	ENYADD	;right.
	LDY	#8	;Convert to dir
CDIR	LDA	ENXADD	;Is x direction
	CMP	ENX,Y	;correct?
	BNE	AGA	;No, check more.
	LDA	ENYADD	;Is y direction
	CMP	ENY,Y	;correct?
	BNE	AGA	;Nope.
	TYA
	STA	ENDIR,X	;It's correct!
	BPL	OUT	;Branch always!
;
AGA	DEY		;Continue
	BPL	CDIR	;searching
OUT	LDA	ENDIR,X	;Get direction
	TAY
	LDA	ENXPOS,X	;Update x pos
	CLC
	ADC	ENX,Y
	STA	ENXPOS,X
	LDA	ENYPOS,X	;Update y
	CLC
	ADC	ENY,Y
	STA	ENYPOS,X
	INX
	CPX	#3
	BNE	DOMOR
	JMP	DRAWEN	;Draw enemy
;
CHECK	LDA	ENDIR,X	;Check if the
	TAY		;enemy hit
	LDA	ENXPOS,X	;anything
	SEC		;1st, scan on
	SBC	SCX,Y	;x axis
	LSR	A
	LSR	A
	LSR	A
	STA	ENXADD
	LDA	ENYPOS,X	;2nd, scan on
	SEC		;y axis
	SBC	SCY,Y
	LSR	A
	LSR	A
	LSR	A
	TAY		;Now, get point
	LDA	LOTBL,Y
	STA	LO
	LDA	HITBL,Y
	STA	LO+1
	LDY	ENXADD
	LDA	(LO),Y
	AND	#$3F	;Mask off color
	BEQ	L0	;Hit anything?
	CMP	#27	;Hit diamond?
	BEQ	L0	;Yup, forget it
	CMP	#$0F	;Hit freezer?
	BEQ	L0	;Yup, who cares
	LDA	BDIST	;A hit! Make the
	STA	ENBOUN,X	;enemy bounce!
	LDA	#16	;Set sound
	STA	AUDF1
	LDA	#6
	STA	AUDC1
	STA	BONK
	LDA	RANDOM	;Get new direct.
	AND	#3
	TAY
	LDA	BDIR,Y
	STA	ENDIR,X
	BPL	CHECK	;Check it out!
;
;CHECK PLAYER
;
PCHK	LDA	P0Y	;Get y pos
	SEC		;And convert to
	SBC	#28	;screen position
	LSR	A
	LSR	A
	LSR	A
	TAY		;Get address
	LDA	LOTBL,Y
	STA	VLO
	LDA	HITBL,Y
	STA	VLO+1
	LDA	P0X	;Now convert x
	SEC
	SBC	#44
	LSR	A
	LSR	A
	LSR	A
	TAY
	LDA	(VLO),Y	;Get point
	AND	#$3F	;Mask out color
	BEQ	L0	;Nothing there
	CMP	#$0F	;Hit freezer?
	BEQ	HITFR	;Yup, handle it
	CMP	#$1B	;Hit diamond?
	BEQ	HITDI	;Yup, fix it
	LDA	(VLO),Y	;Get point
	AND	#192	;Get color used
	CMP	#64	;Hit weak wall?
	BNE	L0	;No, leave.
;
;Hit weak wall
;
	LDA	#3	;Set sound
	STA	WSND
	LDA	#240
	STA	AUDF4
	LDA	#200
	STA	AUDC4
HITX	LDA	#0	;Erase wall
	STA	(VLO),Y
L0	RTS
;
;Hit diamond
;
HITDI	LDA	#$70	;Give points
	JSR	ADD
	LDA	#16	;Set sound
	STA	DING
	LDA	#130
	STA	AUDF2
	INC	COUNT	;Count it
	JMP	HITX
;
;Hit freezer
;
HITFR	JSR	HITX	;Erase freezer
	LDA	FTIME	;Set freeze time
	STA	FREEZE
	LDA	#5
	STA	FREEZE+1
	LDA	#166	;Set sound
	STA	AUDC3
	LDA	#$50	;Give points
;
;SCORE ROUTINES
;
ADD	SED		;Add points to
	CLC		;score
	ADC	SCORE
	STA	SCORE
	LDA	#0
	ADC	SCORE+1
	STA	SCORE+1
	LDA	#0
	ADC	SCORE+2
	STA	SCORE+2
	CLD
	RTS
;
SHOBO	LDA	TIME	;Show bonus
	LDY	#54
;
BCD	PHA		;Show 1 bcd
	SEC
	ROR	A
	LSR	A
	LSR	A
	LSR	A
	STA	DISP,Y
	INY
	PLA
	AND	#$0F
	ORA	#$10
	STA	DISP,Y
	RTS
;
SHOSC	LDX	#2	;Show score
	LDY	#42
SS	LDA	SCORE,X
	JSR	BCD
	INY
	DEX
	BPL	SS
	RTS
;
SHOLI	LDA	LIVES	;Show lives
	LDY	#64
	BNE	BCD
;
;SOUND ROUTINES
;
SOUND	LDY	BONK	;Bounce sound?
	BEQ	T1	;No
	DEY
	STY	BONK
	STY	AUDC1
T1	LDY	DING	;Bell sound?
	BEQ	T2	;No
	DEY
	STY	DING
	TYA
	ORA	#$A0
	STA	AUDC2
T2	LDA	FREEZE	;Freezer sound?
	BEQ	T3	;No
	LDY	FREEZE+1
	LDA	FSND,Y
	STA	AUDF3
	DEC	FREEZE+1
	BNE	T3
	LDA	#5
	STA	FREEZE+1
	DEC	FREEZE
	BNE	T3
	LDA	#0
	STA	AUDC3
T3	LDA	WSND	;Wall sound?
	BEQ	T4	;No
	DEC	WSND
	BNE	T4
	LDA	#0
	STA	AUDC4
T4	RTS
;
;FLASH JEWELS
;
STUFF	INC	FLASH	;Handle flash
	LDA	FLASH	;timers.
	CMP	#20
	BNE	S1
	LDA	#0
	STA	FLASH
	LDA	#104
	CMP	COL0
	BNE	S2
	LDA	#10
S2	STA	COL0
;
;HANDLE TIME
;
S1	INC	TIME+1	;Count down
	LDA	TIME+1
	CMP	#60	;We interrupt
	BNE	S3	;this program
	LDA	#0	;for an import-
	STA	TIME+1	;ant news
	LDA	TIME	;bulletin:
	SED		;  HI MOM!
	SEC
	SBC	#1
	CLD
	STA	TIME
S3	LDA	P0PL	;Check player
	STA	DIE	;collisions
	LDA	P0PF
	AND	#8
	BEQ	S4
	STA	DIE
S4	RTS
;
;ANIMATE
;
ANIM	LDA	ENAN	;Animate enemy.
	CLC		;Hey guys, look!
	ADC	#10	;Your names are
	CMP	#50	;in print :
	BNE	A1	; David Hague
	LDA	#0	; Robbie Hague
A1	STA	ENAN	; Martin Beck
	TAY		; Nathan Zink
	LDX	#9	;and everyone's
A2	LDA	EDAT,Y	;favorite:
	STA	ENEMY,X	; A. ZLOTNICK!
	INY		;Tron to you!
	DEX		;(No you don't
	BPL	A2	;get paid)
	LDA	DIR	;Animate player
	CMP	#15	;by storing a
	BEQ	A3	;different image
	LDA	PLAN	;in the player
	CLC		;animation table
	ADC	#8
	CMP	#64
	BNE	A4	;Is this game
A3	LDA	#0	;better than
A4	STA	PLAN	;The Electroids?
	TAY
	LDX	#7
A5	LDA	PDAT,Y
	STA	PLAYER,X
	INY
	DEX
	BPL	A5
	RTS
;
;TIME DELAY
;
DELAY	STA	TEMP	;Enter with
	LDA	#0	;length of pause
	STA	CLOCK	;(in jiffies) in
D0	LDA	CLOCK	;the accumulator
	CMP	TEMP
	BEQ	S4
	LDA	CONSOL
	CMP	#7
	BEQ	D0
	JMP	GO
;
;DIE
;
KILL	LDA	#0	;Stop movement
	STA	GAMCTL
	JSR	QUIET	;No sound
	DEC	LIVES	;Take a life
	JSR	SHOLI	;And show them.
	LDA	#204
	STA	AUDC1
	LDX	#40	;Kill player
K1	INC	P0X	;1st shift
	LDA	P0X
	STA	HPOSP0
	LDA	RANDOM
	STA	AUDF1
	LDA	#1
	JSR	DELAY
	DEC	P0X	;2nd shift
	LDA	P0X
	STA	HPOSP0
	LDA	RANDOM
	STA	AUDF1
	LDA	#1
	JSR	DELAY
	DEX
	BPL	K1	;Repeat again.
	JSR	QUIET
	LDA	LIVES	;Any lives?
	BEQ	OVR
	JMP	NEWLIFE
;
;GAME OVER
;
OVR	LDX	#9	;Show GAME OVER
O1	LDA	GOVR,X
	STA	DISP+305,X
	DEX
	BPL	O1
	JSR	PMCLR
	LDA	#255
	JSR	DELAY
	JMP	GO
;
;LEVEL DONE
;
LDONE	LDA	#0	;Stop movement
	STA	GAMCTL
	JSR	QUIET	;No sound
C1	LDA	TIME	;Give 10 points
	SED		;for each second
	SEC		;left on the
	SBC	#1	;timer.
	STA	TIME
	CLD
	JSR	SHOBO	;Add points for
	LDA	#$10	;time remaining
	JSR	ADD	;and make bell
	JSR	SHOSC	;tones by vary-
	LDA	#50	;ing the volume
	STA	AUDF1	;of voice 1.
	LDY	#164
C2	STY	AUDC1
	LDA	#1
	JSR	DELAY
	DEY
	CPY	#160
	BNE	C2
	LDA	TIME
	BNE	C1
	JSR	QUIET	;Kill noise
	JMP	NEWLEV	;Start new level
;
;CHARACTER DATA
;
CDAT	.BYTE	0,0,255,255,255,255,0
	.BYTE	0,60,60,60,60,60,60
	.BYTE	60,60,0,0,248,252,252
	.BYTE	252,60,60,0,0,31,63,63
	.BYTE	63,60,60,60,60,252,252
	.BYTE	252,248,0,0,60,60,63
	.BYTE	63,63,31,0,0,60,124
	.BYTE	252,252,252,252,124,60
	.BYTE	60,62,63,63,63,63,62
	.BYTE	60,0,0,255,255,255,255
	.BYTE	126,60,60,126,255,255
	.BYTE	255,255,0,0,0,24,60,60
	.BYTE	60,60,60,60,60,60,60
	.BYTE	60,60,60,24,0,0,0,252
	.BYTE	254,254,252,0,0,0,0,63
	.BYTE	127,127,63,0,0,255,129
	.BYTE	189,161,185,161,129
	.BYTE	255
CDAT2	.BYTE	0,126,255,126,60,24,0
	.BYTE	0
;
;LEVEL DATA
;
DEL1	.BYTE	40,37,35,31,29,25
	.BYTE	24,23,22,21,20,19,18
	.BYTE	17,16
BOUN	.BYTE	50,45,40,30,25,25
	.BYTE	25,25,25,25,25,25,25
	.BYTE	25,25
FTM	.BYTE	25,24,23,22,21,20
	.BYTE	19,18,17,16,15,14,13
	.BYTE	12,11
TOT	.BYTE	16,14,26
TIM	.BYTE	$60,$60,$55,$55,$50
	.BYTE	$50,$45,$45,$40,$40
	.BYTE	$40,$40,$40,$40,$40
BDTBL	.WORD	BD1,BD2,BD3
;
;INSTALL DISPLAY LIST
;
DL	.BYTE	$70,$70,$70,$42
	.WORD	DISP
	.BYTE	2,$46
	.WORD	DISP+80
	.BYTE	6,6,6,6,6,6,6,6,6,6,6
	.BYTE	6,6,6,6,6,6,6,6,6,6
	.BYTE	$41
	.WORD	DL
;
SCL	.SBYTE	"  SCORE:    BONUS: "
	.SBYTE	"   LIVES:    LEVEL:"
	.SBYTE	"  "
;
TDL	.BYTE	$70,$70,$70,$70,$70
	.BYTE	$70,$70,$70,$70,$47
	.WORD	TITLE
	.BYTE	$70,6,$70,7,$70,6
	.BYTE	$70,6,6,$41
	.WORD	TDL
;
TITLE	.SBYTE	"        BoNk     "
	.SBYTE	+$80,"    COPYRIGH"
	.SBYTE	+$80,"T 1984 BY:  "
	.SBYTE	"   JAMES  HAGUE  "
	.SBYTE	"        level: 1 "
	.SBYTE	+$80,"       SELEC"
	.SBYTE	+$80,"T FOR LEVEL "
	.SBYTE	+$80,"    START TO"
	.SBYTE	+$80," BEGIN   "
;
IX	.BYTE	72,126,126,184
	.BYTE	128,96,152,128
	.BYTE	80,80,146,184
IY	.BYTE	120,72,192,120
	.BYTE	72,96,96,208
	.BYTE	210,168,104,128
;
; PLAYER, ENEMY, MUSIC DATA
;
PDAT	.BYTE	254,214,254,16,124,108
	.BYTE	108,238,254,214,254
	.BYTE	16,124,108,236,14,254
	.BYTE	214,254,16,124,236,12
	.BYTE	14,254,214,254,16,124
	.BYTE	108,236,14,254,214,254
	.BYTE	16,124,108,108,238,254
	.BYTE	214,254,16,124,108,110
	.BYTE	224,254,214,254,16,124
	.BYTE	110,96,224,254,214,254
	.BYTE	16,124,108,110,224
EDAT	.BYTE	0,32,32,63,60,60,252
	.BYTE	4,4,0,0,16,16,60,63
	.BYTE	252,60,8,8,0,0,8,8,60
	.BYTE	252,63,60,16,16,0,0,4
	.BYTE	4,252,60,60,63,32,32,0
	.BYTE	0,129,66,60,60,60,60
	.BYTE	66,129,0
MUSIC	.BYTE	160,0,160,130,140,150
;
;X,Y OFFSETS + MISC.
;
XOFF	.BYTE	1,1,1,0,$FF
	.BYTE	$FF,$FF,0,0,0,0
YOFF	.BYTE	1,$FF,0,0
	.BYTE	1,$FF,0,0,1,$FF,0
ENX	.BYTE	0,0,1,1,1,0,$FF,$FF
	.BYTE	$FF
ENY	.BYTE	0,$FF,$FF,0,1,1,1,0
	.BYTE	$FF
SCX	.BYTE	44,44,42,42,42,44,46
	.BYTE	46,46
SCY	.BYTE	28,30,30,28,26,26,26
	.BYTE	28,30
BDIR	.BYTE	2,4,6,8
FSND	.BYTE	0,200,220,210,230,150
GOVR	.SBYTE	"GAME  OVER"
;
;BOARD DATA
;
BD1	.SBYTE	+$A0,"DAAAAIAAAAAAAA"
	.SBYTE	+$A0,"IAAAACB@"
	.SBYTE	";"
	.SBYTE	+$20,"@@B@@@@@@@@B@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@BB@@"
	.SBYTE	";"
	.SBYTE	+$20,"@B@@@@@@@@B@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@BB@@@"
	.SBYTE	";"
	.SBYTE	+$20,"B@@@@@@@@B"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@BH"
	.SBYTE	+$20,"AAAAE@@@@@@@@F"
	.SBYTE	+$20,"AAAA"
	.SBYTE	+$A0,"GB@@@@@@@@@@@@"
	.SBYTE	+$A0,"@@@@@@BB@@@@@@"
	.SBYTE	+$A0,"@@@@@@@@@@@@BB"
	.SBYTE	+$A0,"@@@@@@DAAAAC@@"
	.SBYTE	+$A0,"@@@@BB@@@@DAJA"
	.SBYTE	+$A0,"IIAJAC@@@@BHC@"
	.SBYTE	+$20,"@@B@"
	.SBYTE	";"
	.SBYTE	+$A0,"@BB@@"
	.SBYTE	";"
	.SBYTE	+$20,"B@@@"
	.SBYTE	+$A0,"DGBB"
	.SBYTE	+$20,"@@@B@@O"
	.SBYTE	+$A0,"BB@"
	.SBYTE	+$20,"O@B@@@"
	.SBYTE	+$A0,"BBHE@@"
	.SBYTE	+$20,"@B@"
	.SBYTE	";"
	.SBYTE	+$A0,"@BB@@"
	.SBYTE	";"
	.SBYTE	+$20,"B@@@"
	.SBYTE	+$A0,"FGB@@"
	.SBYTE	+$A0,"@@FAIAJJAIAE@@"
	.SBYTE	+$A0,"@@BB@@@@@@FAAA"
	.SBYTE	+$A0,"AE@@@@@@BB@@@@"
	.SBYTE	+$A0,"@@@@@@@@@@@@@@"
	.SBYTE	+$A0,"BB@@@@@@@@@@@@"
	.SBYTE	+$A0,"@@@@@@BB@@@@@@"
	.SBYTE	+$A0,"@@@@@@@@@@@@BH"
	.SBYTE	+$20,"AAAAC@@@@@@@@D"
	.SBYTE	+$20,"AAAA"
	.SBYTE	+$A0,"GB@@@"
	.SBYTE	";"
	.SBYTE	+$20,"B@@@@@@@@B"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@BB@@"
	.SBYTE	";"
	.SBYTE	+$20,"@B@@@@@@@@B@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@BB@"
	.SBYTE	";"
	.SBYTE	+$20,"@@B@@@@@@@@B@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@BFAAAAJAAAAAA"
	.SBYTE	+$A0,"AAJAAAAE"
;
BD2	.SBYTE	+$A0,"DAAAAAAAAAAAA"
	.SBYTE	+$A0,"AAAAAACB@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@@@@@@@@@@@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@BB@@@@@@@@@@@"
	.SBYTE	+$A0,"@@@@@@@"
	.SBYTE	+$A0,"BB@@DAAAC@@@@"
	.SBYTE	+$A0,"DAAC@@@BB@@B@"
	.SBYTE	";"
	.SBYTE	+$20,"@L@@@@L"
	.SBYTE	";"
	.SBYTE	+$A0,"@B@@@BB@@B@@@@"
	.SBYTE	+$A0,"@@@@@@@B@@@BB"
	.SBYTE	+$A0,"@@L@@@@K@@K@@"
	.SBYTE	+$A0,"@L@@@BB@@@@@@"
	.SBYTE	+$A0,"@B@"
	.SBYTE	";"
	.SBYTE	+$A0,"HAM@@@@@BB@@@"
	.SBYTE	+$A0,"@@NAG@@"
	.SBYTE	+$20,"B"
	.SBYTE	+$A0,"@@@@@@@BB@@@@@"
	.SBYTE	";"
	.SBYTE	+$20,"@HAAG@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@@@BB@@@@@@@"
	.SBYTE	+$20,"B@@"
	.SBYTE	+$A0,"HAM@@@@@BB@@@"
	.SBYTE	+$A0,"@@NAG"
	.SBYTE	";"
	.SBYTE	+$A0,"@B@@@@@@@BB@@@"
	.SBYTE	+$A0,"@@@@L@@L@@@@@"
	.SBYTE	+$A0,"@@BB@@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@@@@@@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@@BB@@@@@@"
	.SBYTE	+$20,"K@@@@K@@@@@@"
	.SBYTE	+$A0,"BB@@@@@@B@@@@"
	.SBYTE	+$A0,"B@@@@@@BB@@@@@"
	.SBYTE	";"
	.SBYTE	+$A0,"B@@@@B"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@@@BB@@@@NAE"
	.SBYTE	+$A0,"@@@@FAM@@@@BB@"
	.SBYTE	+$A0,"@@@@@@@@@@@@@@"
	.SBYTE	+$A0,"@@@BH"
	.SBYTE	+$20,"AC@@@@@@@O@@@"
	.SBYTE	+$20,"@@@DA"
	.SBYTE	+$A0,"GB"
	.SBYTE	";"
	.SBYTE	+$20,"B@@@@@@@@@@@@"
	.SBYTE	+$20,"@@B"
	.SBYTE	";"
	.SBYTE	+$A0,"BFAJAAAAAAAAA"
	.SBYTE	+$A0,"AAAAAJAE"
;
BD3	.SBYTE	+$A0,"DAAAAAIAAAAAAI"
	.SBYTE	+$A0,"AAAAACB"
	.SBYTE	"; ; ;"
	.SBYTE	+$20,"B@@@@@@"
	.SBYTE	+$A0,"B@"
	.SBYTE	"END"
	.SBYTE	+$A0,"@BB@"
	.SBYTE	"; ;"
	.SBYTE	+$20,"@B@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@@HAAAAAGB"
	.SBYTE	"; ; ;"
	.SBYTE	+$20,"B@@"
	.SBYTE	+$A0,"DC@@B@"
	.SBYTE	"; ;"
	.SBYTE	+$A0,"@BH"
	.SBYTE	+$20,"AAAAA"
	.SBYTE	+$A0,"G@@B"
	.SBYTE	+$20,"B@@"
	.SBYTE	+$A0,"B@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@BB@@@@@B@@"
	.SBYTE	+$20,"B"
	.SBYTE	+$A0,"B@@B@"
	.SBYTE	"; ;"
	.SBYTE	+$A0,"@BB@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@B@@FE@@B@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@BB@@@@@B@@@@"
	.SBYTE	+$20,"@@B@@@@@"
	.SBYTE	+$A0,"BB@@K@@B@@@@"
	.SBYTE	+$20,"O@B@@@@@"
	.SBYTE	+$A0,"BB@@B@"
	.SBYTE	";"
	.SBYTE	+$A0,"B@@@@@@"
	.SBYTE	+$20,"B@@@@@"
	.SBYTE	+$A0,"BB@@B@@B@@DC@@"
	.SBYTE	+$A0,"B@@@@@BB@@B@@B"
	.SBYTE	+$20,"@@B"
	.SBYTE	+$A0,"B@@B"
	.SBYTE	";  ;"
	.SBYTE	+$A0," BB"
	.SBYTE	";"
	.SBYTE	+$A0,"@B@@B@@B"
	.SBYTE	+$20,"B@"
	.SBYTE	";"
	.SBYTE	+$A0,"H"
	.SBYTE	+$20,"M@@@N"
	.SBYTE	+$A0,"GB@@L@@B@@FE@"
	.SBYTE	+$A0,"@B@@@@@BB@@@@"
	.SBYTE	+$A0,"@B@@@@@@B@@@@"
	.SBYTE	+$A0,"@BB@@@@@B@@@@"
	.SBYTE	+$A0,"@@B@@@@@BB@@@"
	.SBYTE	+$A0,"@@HAAA"
	.SBYTE	+$20,"C@@"
	.SBYTE	+$A0,"H"
	.SBYTE	+$20,"AAAAA"
	.SBYTE	+$A0,"GH"
	.SBYTE	+$20,"AAAAA"
	.SBYTE	+$A0,"G@"
	.SBYTE	";"
	.SBYTE	+$20,"@B@@B@@@@@"
	.SBYTE	+$A0,"BB@@"
	.SBYTE	+$20,"O@@B@"
	.SBYTE	";"
	.SBYTE	+$20,"@B@@L@@@@@"
	.SBYTE	+$A0,"BB@@@@@"
	.SBYTE	+$20,"B@"
	.SBYTE	";"
	.SBYTE	+$20,"@B@@@@@"
	.SBYTE	";"
	.SBYTE	+$A0,"@@BB@@@@@"
	.SBYTE	+$20,"B@"
	.SBYTE	";"
	.SBYTE	+$20,"@B@@@@@@@@"
	.SBYTE	+$A0,"BFAAAAAJAAA"
	.SBYTE	+$A0,"JAAAAAAAAE"
;
	*=	$02E0
	.WORD	GAME
	.END