A.N.A.L.O.G. ISSUE 21 / AUGUST 1984 / PAGE 35
This month, ANALOG continues its custom of printing assembly-language games with Avalanche, a public-domain game of skill for one player.
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 Avalanche. The data statements are listed in hexadecimal (base 16), so the program will fit in 16K cassette systems. This makes typing more difficult, but it’s a necessary evil.
Listing 2 is the assembly-language source code for Avalanche, created with the OSS MAC/65 assembler. You do not 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 Avalanche.
Plug a joystick in port 1 and press the fire button to start the game. Up at the top of the screen is a letter “N” which stands for normal play. Pressing the OPTION key will switch this to an “H,” which stands for hard play.
The object of Avalanche is to claim the whole side of the mountain as yours. You claim each square by moving Leroy onto a square and changing it to the object color. The object color is indicated by the flashing arrows in the upper left corner. On the first level, you just have to jump on a square once to change it to the object color. On level two, you must jump on it twice, and so on.
There are up to six different levels, each having four rounds. When you complete a round, you get a bonus of 1000 points. You’ll receive 25 points for changing the color of a square.
While you’re doing all this, you also have to avoid the falling rocks and Big George. Big George wears a baseball hat and will chase after you. The only way you can get rid of him is to make him follow you into the path of a rock. If a rock hits him, he is out of commission for now, but he’ll be back soon. There’s also a little green man called Henry. Henry won’t hurt you, but he will change the color of the squares back to their original. To stop him, all you have to do is touch him — and you’ll get 200 points.
You get an extra man at every 10,000 points. Leroy is moved via the joystick, in four diagonal directions. It may seem difficult to move at first, but you’ll get used to it after a while. Happy gaming!
10 REM *** AVALANCHE *** 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:RESTOR E 1000:TRAP 120:? "CHECKING DATA" 50 LINE=LINE+10:? "LINE:";LINE:READ DA T$:IF LEN(DAT$)<>90 THEN 220 60 DATLIN=PEEK(183)+PEEK(184)*256:IF D ATLIN<>LINE THEN ? "LINE ";LINE;" MISS ING!":END 70 FOR X=1 TO 89 STEP 2:D1=ASC(DAT$(X, X))-48:D2=ASC(DAT$(X+1,X+1))-48:BYTE=H EX(D1)*16+HEX(D2) 80 IF PASS=2 THEN PUT #1,BYTE:NEXT X:R EAD 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,32:CLOSE #1:END 160 FOR X=1 TO 116:PUT #1,0:NEXT X:CLO SE #1:END 170 IF NOT DSK THEN 200 180 ? "INSERT DISK WITH DOS, PRESS RET URN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0 ,"D:AUTORUN.SYS" 190 PUT #1,255:PUT #1,255:PUT #1,0:PUT #1,32:PUT #1,99:PUT #1,52: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=99 0:RESTORE 1000:TRAP 120:GOTO 50 220 ? "BAD DATA: LINE ";LINE:END 230 DATA 0,42,216,31,255,31,169,0,141, 47,2,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,32,13 3,11,24,96 1000 DATA 2065E4A9008D08D2A9018584A9AE 858520CF2C20DA21208C23200F2320FA2220AD 23205D23A20FBDA6339D3E36,360 1010 DATA BDB6339DBA37BDC6339DCE37CA10 EBAD8402D013208C23200F2320FA22205D23A9 00854D4C8120AD1FD0C903D0,228 1020 DATA 19A585C9AED008A9A88585A901D0 06A9AE8585A900858420AA24A5858D0936A914 20D3214C3C2020BD2120C821,64 1030 DATA AD120609108D1236AD130609108D 2636A207BD74339D4236CA10F7A97820D32120 BD21A9148D0306AE1306BDD6,982 1040 DATA 338DD822BDDB338DE022BDE0338D E522BDE5338DEA2220BC2320F124A9018D1406 20AD23AD2006C901F0034C7A,23 1050 DATA 21EE130620E323207924A900854D AD1306C905D013EE1206A9018D1306AD120685 83200F234C1421A9008D0206,400 1060 DATA 200F234C812020C821A204BD7C33 9DBF37CA10F7AD120609108DC537A20BA9968D 00D2A9A88D01D2A91C8DD822,117 1070 DATA A9888DE022A90620D321A9328D00 D2A9888DD822A91C8DE022A90620D321CA10D0 A9008D01D220C821AD1206C9,195 1080 DATA 07D004A9068583A9008D20068D02 064C8120C902F0034C9B21C689A20FA9788D00 D28A09108D01D2A90520D321,414 1090 DATA CA10ED4CA221C689A9018D6F0220 7924A589D00EA208BD81339D4236CA10F74C3C 2020FA224C8120A213A9009D,121 1100 DATA 3C36CA10FA60A227A9009DB837CA 10FA608582A582D0FC60A200BD00E09D0038BD 00E19D0039CAD0F1A22FBDEA,942 1110 DATA 339D1838CA10F7A9388DF402A93E 8D2F02A9338D3102A9548D3002A9038D1DD0A9 388D07D4A9268DC002A9348D,623 1120 DATA C1028DC2028DC302A97C8D00D0A9 748D01D08D02D08D03D0A9018D6F02A90F8DC4 02A9288DC502A9888DC602A9,784 1130 DATA D68DC702A9228D0102A97D8D0002 A222A074A907205CE4A900AA9D00369DF036E8 E0F0D0F5A9C08D0ED460A582,393 1140 DATA F002C6824C62E448A9448D0AD48D 16D0A9228D0102A9928D0002684048A9588D0A D48D17D0A9228D0102A9A78D,269 1150 DATA 0002684048A5CB8D0AD4C928D012 A90085CBA5CC1006A90085CCF004A98E85CCA5 CC8D16D0E6CBA9228D0102A9,692 1160 DATA D68D0002684048A90E8D0AD48D16 D0A9FC8D17D0A9928D18D0A9428D19D0A9228D 0102A97D8D00026840A9468D,628 1170 DATA 2836A95D8D2936A58938E9010910 8D2A3660A9368581A9A98580A9018586A486B9 1A3491808810F8A586186902,355 1180 DATA C90FF0128586A5801869278580A5 81690085814C1B2320AA24A9008D12368D2636 A205BD90339D0C36BD96339D,791 1190 DATA 2036CA10F160A205A9109D0036BD 8A339D5036CA10F2A9348D6636A92F8D6736A9 078D8D36A9438D8E36A9448D,619 1200 DATA 8F36A9088D903660A9018D120685 838D1306A9048589A9008D1406A9028D5A06A9 608587A910858860A9008D01,774 1210 DATA D28D03D28D05D28D07D260A583C9 01F004C904D007ADE0228D942260C902F004C9 05D007ADE5228D942260ADEA,290 1220 DATA 228D942260A214BD28348D00D2A9 AA8D01D2BD3D3420D32120E624CA10E9A23C8E 00D220E624A90220D321E8E8,358 1230 DATA E8E05190EE8E00D220E624A90220 D321CACACAE039D0EEA9008DC802A9608587A2 0A8A09A08D01D2A90420D321,32 1240 DATA CA10F2A9008D01D2A209BD9C339D BD37CA10F7AD1C06186901C91AD018AD1B0618 6901C91AD00EAD1B06186901,363 1250 DATA 8D1B068D0136A9108D1C068D0236 A9C820D32160AD0136C588F002B00160E688E6 8920FA22A202A9208D00D2A0,32 1260 DATA 0F9809A08D01D2A90320D3218810 F2CA10EDA9008D01D260A5848D1C258D3325AD 1206C903D011AD1306C901F0,632 1270 DATA 04C903D006A9008D332560AD1206 C907D006A9008D1C2560C908F0E9C90990EAA9 008D1C25F0DEA58718690285,309 1280 DATA 878DC8026020322C20E32CAD2006 C900F00160AD2A06C901D0062058254C1525AD 78028D3106205825200226AD,882 1290 DATA 5706C901D00BA9008D5706204D27 4C2F25A9018D5706AD5806C901D00BA9008D58 062080254C4625A9018D5806,388 1300 DATA 20CA28200C3220453120262C2060 314CF724AD2606C901D00160AD3106C909D003 4C0E2FC905D0034C282FC906,853 1310 DATA D0034C5C2FC90AD0034C422F60AD 2706C901D00160AD3206C950F004EE320660AD 3606C901D0034CF525AD3906,95 1320 DATA C901F00EAD0AD2300160A9018D39 0620BA2EAD4206C901D0034CDE2520F42F20F4 2F20F42F20F42FAD0B06C96D,512 1330 DATA B00160A9018D42068D2706A9AF8D 2E0660A9018D3606AD0AD23008A9008D3C064C F525A9018D3C06AD3C06C901,359 1340 DATA D0034CB82F4CCC2FAD2806C901D0 0160AD3306C928F004EE330660AD4606C901D0 034CC826AD3406C901D0034C,732 1350 DATA 5326AD1306C902D0034C3A26C904 F0034C5326AD4506C932F012AD4706C902900B AD0AD23006EE45064CC826AD,894 1360 DATA 3706C901D0034CBB26AD3A06C901 F014AD0AD2300160A9018D3A068D3406EE4706 20CC2EAD4306C901D0034CA4,976 1370 DATA 26204930204930204930204930AD 0C06C96DB00160A9018D43068D2806A9AF8D2F 0660A9018D3706AD0AD23008,426 1380 DATA A9008D3D064CBB26A9018D3D06AD 3D06C901D0034C0D304C2130A9018D4606A900 8D4706AD4C06C901D0034C40,11 1390 DATA 27AD4B06C901F008A9018D4B0620 502DAD4D06C901D0034C172720493020493020 4930204930AD0C06C968B001,395 1400 DATA 60A9018D4D068D2806A9AF8D2F06 60A9018D4C06EE4A06EE4A06AD0AD2300EA900 8D4806EE490620502D4C4027,231 1410 DATA A9018D4806CE490620682DAD4806 C901D0034C0D304C2130AD2906C901D00160AD 5006C901D0034CF727AD3506,37 1420 DATA C901D0034C8227AD1306C903B003 4C8227AD4E06C9029008AD0AD230034CF727AD 3806C901D0034CEA27AD3B06,174 1430 DATA C901F014AD0AD2300160A9018D3B 068D3506EE4E0620ED2EAD4406C901D0034CD3 2720DE3020DE3020DE3020DE,533 1440 DATA 30AD0D06C96DB00160A9018D4406 8D2906A9AF8D300660A9018D3806AD0AD23008 A9008D3E064CEA27A9018D3E,486 1450 DATA 06AD3E06C901D0034C64304C7830 A9018D5006AD5306C901D0034CAF28AD5106C9 01F008A9018D510620B12DAD,512 1460 DATA 5206C901D0034C412820DE3020DE 3020DE3020DE30AD0D06C962B00160A9018D52 068D2906A9AF8D300660A901,558 1470 DATA 8D5306AD0006CD0406B032AD0106 CD0506F016901420B12DCE0406EE0506EE0506 A9008D4F064CAF2820DE2DCE,389 1480 DATA 0406CE0506CE0506A9028D4F064C AF28AD0106CD0506F016901420C92DEE0406EE 0506EE0506A9018D4F064CAF,14 1490 DATA 2820F32DEE0406CE0506CE0506A9 038D4F06AD4F06C900D0034C6430C901D0034C 7830C902D0034C8C304CA030,967 1500 DATA AD2606C901F0034CF029AD2D068D 01D2CE2D06AD2D06C9A0F0034CF029A9008D01 D28D26068D2A06A9088D0E06,237 1510 DATA AD04D0C900D00420732E6020DD2B AD1206C901D0034C3C29C902D0034C4C29C903 D0034C7F29C904D0034C6629,308 1520 DATA C905D0034CA329C906D0034CC629 C907D0034C7F294CC629AD04D0C901D006EE02 06202A314CF029AD04D0C901,830 1530 DATA D006202A314CF029C902D006EE02 062033314CF029AD04D0C901D009EE0206202A 314CF029CE02062018314CF0,841 1540 DATA 29AD04D0C901D006202A314CF029 C902D0062033314CF029C904D056EE0206203C 314CF029AD04D0C901D00620,145 1550 DATA 2A314CF029C902D009EE02062033 314CF029CE0206202A314CF029AD04D0C901D0 06202A314CF029C902D00620,172 1560 DATA 33314CF029C904D009EE0206203C 314CF029CE0206203331A200A000207F2BAD24 06C901F0034C1A2AAC0B06A2,820 1570 DATA 008A99003DE8C8E00AD0F7A9008D 3206A20020B82BAD4606C901D0034CBE2AA201 A002207F2BAD2406C901F003,237 1580 DATA 4C512AAC0C06A2008A99003EE8C8 E00AD0F7A9008D33068D3406A20120B82BAD50 06C901F029A202A004207F2B,522 1590 DATA AD2406C901F00160AC0D06A2008A 99003FC8E8E00AD0F7A9008D3506A20220B82B 60AD2906C901F00160AD3006,978 1600 DATA 8D07D2CE3006AD3006C9A0F00160 AD07D0C900D00CA9058D2306206E3220DA3160 A9008D07D28D29068D5306A9,387 1610 DATA 088D110660AD2806C901F0034C51 2AAD2F068D05D2CE2F06AD2F06C9A0F0034C51 2AA9008D05D2AD06D0C900D0,709 1620 DATA 3220802DA9008D4B068D4D068D46 068D4C068D28068D3306A90A8D4A06A9088D49 068D1006A92D8D0C06A9748D,163 1630 DATA 02D08D090660A9008D28068D4C06 A9088D1006AD06D0C901D0016020492BA94C85 8AA933858BAD49068D5906AD,255 1640 DATA 4A068D5A0620282E60AD1206C901 F013C902F017C903F01BC904F007C905F00B4C 732BAD06D0C902F01160AD06,646 1650 DATA D0C904F00960AD06D0C908F00160 CE020660BD2706C901F00160BD2E069903D2DE 2E06BD2E06C9A0F00160A900,409 1660 DATA 9903D2BD05D0C900D006A9018D24 0660A9009D27069D3606A9089D0F0660A9009D 36069D27069D39069D42068D,258 1670 DATA 2406A9089D0F06A92D9D0B06BD54 069D01D09D080660AD3106C909F00DC905F013 C906F023C90AF01560CE0006,373 1680 DATA EE0106EE010660EE0006EE0106EE 010660CE0006CE0106CE010660EE0006CE0106 CE010660AD00068D5906AD01,878 1690 DATA 068D5A0660A2FFAC030688D0FDCA D0F760AD1406C900D011A9008D0206A910A200 9D1A06E8E006D0F8A900A200,893 1700 DATA 9D2006E8E064D0F8A9088D0E068D 0F068D10068D1106A9098D0006A9088D0106A9 0A8D04068D05068D4A06A908,457 1710 DATA 8D4906A97C8D06068D00D0A9558D 0706A9748D08068D09068D01D08D02D08D5406 8D5506A9848D0A068D56068D,472 1720 DATA 03D0A92D8D0B068D0C068D0D0618 A9AA8D00D2690A8D02D2690A8D04D2690A8D06 D2A9018D1ED0A900A2FF9D00,790 1730 DATA 3C9D003D9D003E9D003FCAD0F160 AD2506C909F011AC0706A200BDA43299003CC8 E8E010D0F460AD2506C905F0,782 1740 DATA 1420A02DAC0706A200BDB4329900 3CC8E8E010D0F460AD2506C90AF01420A02DAC 0706A200BDC43299003CC8E8,589 1750 DATA E00FD0F460AD2506C906F01420A0 2DAC0706A200BDD33299003CC8E8E00FD0F460 20802DAC0C06A200BDE23299,700 1760 DATA 003EE8C8E00DD0F420902D602080 2DAC0C06A200BDEE3299003EC8E8E00DD0F420 902D60AC0C06A2008A99003E,592 1770 DATA E8C8E00FD0F760A90D8D1506A90B 8D2106A9C68DC20260AC0706A200A90099003C C8E8E014D0F76020182EAC0D,567 1780 DATA 06A200BDFA3299003FC8E8E012D0 F420082E6020182EAC0D06A200BD0C3399003F C8E8E012D0F46020182EAC0D,180 1790 DATA 06A200BD1E3399003FC8E8E012D0 F46020182EAC0D06A200BD303399003FC8E8E0 12D0F460A9138D1606A9108D,920 1800 DATA 1706A9568DC30260AC0D06A2008A 99003FC8E8E014D0F760AD5A068580A9008581 06800680A580858C06800680,635 1810 DATA 2681A58018658C8580A581690085 81A580186D59068580A58169008581A5801869 008580A58169368581A001B1,461 1820 DATA 8A918088B18A918060A9048D6F02 A9028D0306204B31A9AA8D01D2AD07068D00D2 C9F0F009209F2F20262C4C85,75 1830 DATA 2EA96F8D01D218A9828D00D26901 20262CC9D2D0F4A9008D00D28D01D2A9038D20 0660AC0B06A200BD42339900,639 1840 DATA 3DC8E8E00AD0F460AC0C06A200BD 423399003EE8C8E00AD0F4A90A8D1506A9088D 2106A9348DC20260AC0D06A2,616 1850 DATA 00BD423399003FC8E8E00AD0F4A9 0A8D1606A9088D1706A9348DC3026020E32CA9 018D2A0620762F209F2F209F,894 1860 DATA 2FCE0E06D00320F9306020FC2CA9 018D2A0620802F209F2F209F2FCE0E06D00320 F9306020182DA9018D2A0620,527 1870 DATA 762F208A2F208A2FCE0E06D00320 F9306020342DA9018D2A0620802F208A2F208A 2FCE0E06D00320F93060CE06,191 1880 DATA 06AD06068D00D060EE0606AD0606 8D00D060AC0706A200B9003C99FF3BE8C8E011 D0F4CE070660A20018AD0706,578 1890 DATA 690EA8B9003C99013C88E8E011D0 F4EE07066020E02F20F42F20F42FCE0F06D005 A200200D316020EA2F20F42F,109 1900 DATA 20F42FCE0F06D005A200200D3160 CE0806AD08068D01D060EE0806AD08068D01D0 60A20018AD0B066908A8B900,804 1910 DATA 3D99013D88E8E00AD0F4EE0B0660 203530204930204930CE1006D005A201200D31 60203F30204930204930CE10,389 1920 DATA 06D005A201200D3160CE0906AD09 068D02D060EE0906AD09068D02D060A20018AD 0C066D2106A8B9003E99013E,861 1930 DATA 88E8EC1506D0F3EE0C066020B430 20DE3020DE30CE1106D005A202200D316020BE 3020DE3020DE30CE1106D005,271 1940 DATA A202200D316020B43020C83020C8 30CE1106D005A202200D316020BE3020C83020 C830CE1106D005A202200D31,771 1950 DATA 60CE0A06AD0A068D03D060EE0A06 AD0A068D03D060AC0D06A200B9003F99FF3EC8 E8EC1606D0F3CE0D0660A200,318 1960 DATA 18AD0D066D1706A8B9003F99013F 88E8EC1606D0F3EE0D0660A9018D26068D2A06 A9AF8D2D06AD31068D250660,329 1970 DATA A9019D2706A9AF9D2E0660A94C85 8AA933858B20193220192C20282E60A94E858A A9334C1E31A950858AA9334C,489 1980 DATA 1E31A952858AA9334C1E31A9018D 1ED060A9008D03D28D02D28D05D28D04D28D07 D28D06D260AD0CD0C9019038,303 1990 DATA C904D015AD4606C901D00E20E72A A9028D2306206E324C9F31AD0CD0C908D007AD 5006C901F011AD2C06C904F0,747 2000 DATA 04EE2C0660A9028D200660A9008D 2C06AD5006C901D060AD0FD0C901D011AD2B06 C904F004EE2B0660A9028D20,927 2010 DATA 0660A9008D2B06AD0FD0C902903C C904D007AD4606C901F03120182EA9008D5006 8D29068D52068D51068D4E06,719 2020 DATA 8D5306A90A8D04068D0506A9088D 1106A92D8D0D06A9848D0A068D03D060AD0206 C91CD005A9018D200660A005,285 2030 DATA 18B91A066905C91AD015A9109900 36991A0688B91A06186901991A064C4332A915 990036991A0688B91A061869,594 2040 DATA 02C91AF007990036991A0660A910 990036991A0688B91A06186901C91AF0ED9900 36991A0660A00318B91A066D,323 2050 DATA 2306C91A902238E91A8D220618A9 106D2206990036991A06A9008D22068818B91A 066901C91AF0E4990036991A,929 2060 DATA 06600C1E3F2B2B3F2B371E1E1212 1B366C483078FCD4D4FCD4EC78784848D86C36 120E1F37371F0F1F1F0E0A2E,397 2070 DATA 3E1B0D0470F8ECECF8F0F8F87050 747CD8B020A050283C7E6A7E763C3C2436050A 143C7E567E6E3C3C246C0C1E,50 2080 DATA 1EFF2B2BFFFF2D333F1E12121B36 6C00307878FFD4D4FFFFB4CCFC784848D86C36 000C1E1EFF2F2FFF7F2F1F3F,44 2090 DATA 1E12127E361B00307878FFF4F4FF FEF4F8FC7848487E6CD800183C7EFFFFFF7E3C 1800030443448384C3C47070,520 2100 DATA 7046003606068606868686060606 06060606060606060606060606415433B2A5A1 A4B98085852C6536652CA7A1,525 2110 DATA ADA580AFB6A5B22328212E2725EC E5F6E5EC9AF2EFF5EEE49AA2AFAEB5B3001110 1010000000002136212C212E,776 2120 DATA 232825000000223900342F2D2D39 0022252E2E253434A1AEA1ACAFA780A3AFADB0 B5B4A9AEA7000F5A049C0086,624 2130 DATA F60C92001AA4765400C442226603 0F3F7F3F0F0300C0F0FCFEFCF0C00000060C18 300060000C1E3F2B3F1E1236,228 2140 DATA 080C7E7F7E0C080010307EFE7E30 100003040304030403040304030403043C2F00 2F3C483C0048404840484000,84 2150 DATA 5148514851480B0E070B07070707 07070707070707070707070707000000000000 000000000000000000000000,705
***************************** * * * 'AVALANCHE' * * written by: TOMMY BENNETT * * * ***************************** ; ;OS SYMBOLS !!! ; COLPM0 = $02C0 ;P/M COLORS COLPM1 = $02C1 COLPM2 = $02C2 COLPM3 = $02C3 COLPF0 = $02C4 ;PLAYFIELD COLORS COLPF1 = $02C5 COLPF2 = $02C6 COLPF3 = $02C7 COLBK = $02C8 CHBASE = $02F4 ;CHAR. SET ADDRESS HPOSP0 = $D000 ;P/M HORIZONTAL HPOSP1 = $D001 ;REGISTERS HPOSP2 = $D002 HPOSP3 = $D003 P0PF = $D004 ;COLLISION P1PF = $D005 ;REGISTERS P2PF = $D006 P3PF = $D007 P0PL = $D00C P3PL = $D00F GRACTL = $D01D ;GRAPHICS CONTROL HITCLR = $D01E ;COLLISION CLEAR WSYNC = $D40A ;WAIT FOR SYNC NMIEN = $D40E ;INTERRUPT ENABLE PRIOR = $026F ;PRIORITY DMACTL = $022F ;DMA CONTROL AUDF1 = $D200 ;AUDIO AUDC1 = $D201 ;REGISTERS AUDF2 = $D202 AUDC2 = $D203 AUDF3 = $D204 AUDC3 = $D205 AUDF4 = $D206 AUDC4 = $D207 AUDCTL = $D208 SETVBV = $E45C ;VBLANK SET XITVBV = $E462 ;VBLANK EXIT SIOINV = $E465 ;SIO INIT CONSOL = $D01F ;CONSOLE KEYS PCOLR2 = $02C2 ;P/M COLOR PCOLR3 = $02C3 ; STICK0 = $0278 ;STICK STRIG = $0284 ;STICK TRIGGER RANDOM = $D20A ;RANDOM # ATRACT = $4D ;ATTRACT MODE FLAG PMBASE = $D407 ;P/M ADDRESS DLISTL = $0230 ;DISPLAY... DLISTH = $0231 ;LIST ADDR PMAREA = $3800 ;P/M MEMORY PLAY0 = PMAREA+$0400 PLAY1 = PMAREA+$0500 PLAY2 = PMAREA+$0600 PLAY3 = PMAREA+$0700 DISP = $3600 ;DISPLAY MEMORY DISP1 = DISP+20 DISP2 = DISP+40 DISP3 = DISP+60 DISP4 = DISP+80 DISP5 = DISP+100 DISP7 = DISP+140 DISP22 = DISP+440 CHSET = $3800 ;CHAR. SET ADDR ; ;PAGE 0 VARIABLES ; *= $80 LO *= *+1 ;2-BYTE... HI *= *+1 ;WORK ADDRESS TIMER *= *+1 ;EVENT TIMER LVL *= *+1 ;LEVEL # OPT *= *+1 ;OPTION KEY FLAG TOG *= *+1 ;EASY/HARD VALUE PADCT *= *+1 ;JUMPING PAD INDEX COLR *= *+1 ;COLOR WORK REG. PNT *= *+1 TOM *= *+1 ;LIVES FILE *= *+2 ;PAD COLOR POINTER TIMES4 *= *+1 ;PLOT WORK AREA ; ;USER SYMBOLS !!! ; *= $0600 PCOL *= *+1 ;PL COL # PROW *= *+1 ;PL ROW # NUMSQ *= *+1 ;# OF SQ'S TIME *= *+1 ;DELAY TIM SCOL *= *+1 ;SNK COL # SROW *= *+1 ;SNK ROW # PXPOS *= *+1 ;PL XPOS PYPOS *= *+1 ;PL YPOS XPOSP1 *= *+1 ;POSITIONS XPOSP2 *= *+1 ;OF XPOSP3 *= *+1 ;PLAYERS.. YPOSP1 *= *+1 ; YPOSP2 *= *+1 ; YPOSP3 *= *+1 ; COUNT1 *= *+1 ; COUNT2 *= *+1 ; COUNT3 *= *+1 ; COUNT4 *= *+1 ; LEVEL *= *+1 ; ROUND *= *+1 ; START *= *+1 ; LENGTH *= *+1 ; LENGTH3 *= *+1 ADDNUM3 *= *+1 PLAYER *= *+2 SCORE *= *+6 ;SCORE DIGITS BACK *= *+1 ;PLAY END REASON ADDNUM *= *+1 ADD *= *+1 SUM *= *+1 ;SCORE ADD VALUE FALOFF *= *+1 ;FALL FLAG DIRFLG *= *+1 ;DIRECTION FLAG SO1FLG *= *+1 ;SOUND FLAGS SO2FLG *= *+1 SO3FLG *= *+1 SO4FLG *= *+1 MOVFLG *= *+1 ;MOVE FLAG WARN *= *+1 WARN1 *= *+1 PITCH1 *= *+1 ;PITCH FLG PITCH2 *= *+1 ; PITCH3 *= *+1 ; PITCH4 *= *+1 ; DIRECT *= *+1 ;DIRECTION SAVE DRP1 *= *+1 ;DROP FLAGS DRP2 *= *+1 BAL1FLG *= *+1 ;ROCK FLAGS BAL2FLG *= *+1 B1MOV *= *+1 ;ROCK MOV B2MOV *= *+1 ;FLAG'S.. B3MOV *= *+1 B1DRP *= *+1 B2DRP *= *+1 B3DRP *= *+1 B1DIR *= *+1 B2DIR *= *+1 B3DIR *= *+1 B1DRW *= *+1 B2DRW *= *+1 B3DRW *= *+1 FNB1DRP *= *+1 FNB2DRP *= *+1 FNB3DRP *= *+1 MAN *= *+1 ;GREEN MAN GRNFLG *= *+1 ;GREEN MAN PRESENT OUTFLG2 *= *+1 GRNDIR *= *+1 ;GREEN DIRECTION GCOL *= *+1 ;GREEN MAN COLUMN GROW *= *+1 ;GREEN MAN ROW GRNDRP *= *+1 ;GREEN DROP FLAG GRNMOV *= *+1 ;GREEN MOVE FLAG GRNFNDRP *= *+1 ;GREEN DROP FINISH OUTFLG *= *+1 GRDIR *= *+1 ;GEORGE DIRECTION GRGFLG *= *+1 ;GEORGE PRESENT GRGDRP *= *+1 ;GEORGE DROP FNGRDRP *= *+1 ;GEORGE DROP FINISH GRGMOV *= *+1 ;GEORGE MOVE FLAG HPOS *= *+3 ;TMP LOC.. TEMP *= *+1 TEMP1 *= *+1 COL *= *+1 ;PLOT COLUMN ROW *= *+1 ;PLOT ROW ; ;AVALANCHE CONTROL CODE ; *= $2000 STRTIT JSR SIOINV ;INIT SOUNDS LDA #0 ;SET AUDIO CONTROL STA AUDCTL LDA #1 ;SET EASY MODE STA OPT LDA #174 STA TOG JSR PMCLR JSR SETCHR ;SET UP CHARSET JSR INILVL ;SET LEVEL INFO JSR SCREEN ;INIT SCREEN JSR SHOLIV ;SHOW LIVES JSR SNDOFF ;NO SOUNDS JSR ZEROSC ;ZERO SCORE LDX #15 ;DISPLAY... SETAUTH LDA TITLE,X ;TITLE, STA DISP3+2,X LDA AUTHOR,X ;AUTHOR, STA DISP22+2,X LDA MAGMSG,X ;MAGAZINE STA DISP22+22,X DEX BPL SETAUTH CKSTRG LDA STRIG ;TRIG PRESSED? BNE NOSTRG ;NO! JSR INILVL ;INIT LEVEL JSR SCREEN ;INIT SCREEN JSR SHOLIV ;SHOW LIVES JSR ZEROSC ;ZERO SCORE LDA #0 ;NO ATTRACT MODE STA ATRACT JMP READY ;GO TO IT! NOSTRG LDA CONSOL ;GET CONSOLE CMP #3 ;OPTION PRESSED? BNE SHODIF ;NO! LDA TOG ;GET DIFFICULTY CMP #174 ;NORMAL? BNE NORMAL ;NO, SET NORMAL LDA #168 ;SET HARD STA TOG LDA #1 BNE SETDIF NORMAL LDA #174 ;NORMAL DIFFICULTY STA TOG LDA #0 SETDIF STA OPT ;SAVE DIFF JSR STODIF ;AND INITIALIZE SHODIF LDA TOG ;GET DIFF CHAR STA DISP+9 ;SHOW ON SCREEN LDA #20 ;WAIT 20 JIFFIES JSR WAIT JMP CKSTRG ;LOOP BACK READY JSR CLINE3 ;CLEAR SCREEN LINE 3 JSR CLINE22 ;AND LINE 22 LDA LEVEL ;GET LEVEL ORA #$10 STA DISP+18 ;SHOW ON SCREEN LDA ROUND ;GET ROUND ORA #$10 STA DISP1+18 ;SHOW ON SCREEN LDX #7 ;SHOW READY! SHORDY LDA RDYMSG,X STA DISP3+6,X DEX BPL SHORDY LDA #120 ;WAIT 120 JIFFIES JSR WAIT JSR CLINE3 ;ERASE LINE 3 LDA #20 STA TIME LDX ROUND ;GET ROUND # LDA R1SET,X ;AND SET COLORS STA DLI4C1+1 LDA R2SET,X STA DLI4C2+1 LDA R3SET,X STA DLI4C3+1 LDA R4SET,X STA DLI4C4+1 JSR SETLD ;INIT DIFF FACTORS JSR GAME ;GO TO MAIN GAME LDA #1 ;RESET START FLAG STA START JSR SNDOFF ;TURN OFF SOUND LDA BACK ;GET PLAY END REASON CMP #1 ;SCREEN COMPLETED? BEQ LVLEND ;YES! JMP CKDED2 ;NO, CHECK DEATH LVLEND INC ROUND ;NEXT ROUND JSR BONUS ;DO BONUS JSR BONLIF ;CHECK BONUS LIFE LDA #0 ;NO ATTRACT MODE STA ATRACT LDA ROUND ;GET ROUND # CMP #5 ;ROUND 5? BNE NOTR5 ;NO! INC LEVEL ;NEXT LEVEL! LDA #1 ;RESET ROUND # STA ROUND LDA LEVEL ;SAVE LEVEL # STA LVL JSR SCREEN ;SET SCREEN JMP NEWLVL ;NEW LEVEL NOTR5 LDA #0 ;0 # OF SQUARES STA NUMSQ JSR SCREEN ;SET SCREEN JMP READY ;WE'RE READY! NEWLVL JSR CLINE22 ;CLEAR LINE 22 LDX #4 ;NEW LEVEL MESSAGE SHOLVL LDA LVMSG,X STA DISP22+7,X DEX BPL SHOLVL LDA LEVEL ;SHOW LEVEL # ORA #$10 STA DISP22+13 LDX #11 ;MAKE LEVEL SOUND NLSND LDA #150 ;SET SOUND, STA AUDF1 LDA #168 STA AUDC1 LDA #28 ;SET COLORS STA DLI4C1+1 LDA #136 STA DLI4C2+1 LDA #6 ;WAIT 6 JIFFIES JSR WAIT LDA #50 ;CHANGE SOUND STA AUDF1 LDA #136 ;AND COLORS STA DLI4C1+1 LDA #28 STA DLI4C2+1 LDA #6 ;WAIT AGAIN JSR WAIT DEX ;MORE SOUNDS? BPL NLSND ;YES! LDA #0 ;TURN OFF SOUND STA AUDC1 JSR CLINE22 ;ERASE LINE 22 LDA LEVEL ;GET LEVEL # CMP #7 ;LEVEL 7? BNE NOT7 ;NO! LDA #6 ;MAKE IT 6 AGAIN STA LVL NOT7 LDA #0 ;RESET PLAY FLAG STA BACK STA NUMSQ ;AND # SQUARES JMP READY ;GO PLAY! CKDED2 CMP #2 ;HIT BY ROCK? BEQ DEAD2 ;YES! JMP CKDED3 ;NO, WE FELL. DEAD2 DEC TOM ;1 LESS LIFE LDX #15 ;DO DEATH SOUND DEDSND LDA #120 ;SET SOUND STA AUDF1 TXA ORA #$10 STA AUDC1 LDA #5 ;WAIT 5 JIFFIES JSR WAIT DEX ;NEXT SOUND BPL DEDSND JMP CHKEND ;CHECK END OF GAME CKDED3 DEC TOM ;1 LESS LIFE LDA #1 ;RESET PRIORITY STA PRIOR CHKEND JSR BONLIF ;BONUS LIFE CHECK LDA TOM ;MORE LIVES? BNE NOTEND ;YES! LDX #8 ;NO, SHOW END MESSAGE SHOEND LDA ENDMSG,X STA DISP3+6,X DEX BPL SHOEND JMP CKSTRG ;GO CHECK RESTART NOTEND JSR SHOLIV ;SHOW LIVES LEFT JMP READY ;AND PLAY! CLINE3 LDX #19 ;ERASE 3RD SCREEN LINE LDA #0 CL3LP STA DISP3,X DEX BPL CL3LP RTS CLINE22 LDX #39 ;ERASE LAST 2... LDA #0 ;SCREEN LINES CL22LP STA DISP22,X DEX BPL CL22LP RTS WAIT STA TIMER ;SET TIMER WAITLP LDA TIMER ;GET TIMER BNE WAITLP ;NOT ZERO YET RTS ;TIME'S UP! SETCHR LDX #0 ;COPY CHAR SET MOVCHR LDA $E000,X STA CHSET,X LDA $E100,X STA CHSET+$0100,X DEX BNE MOVCHR LDX #47 ;AND CHANGE... CHGCHR LDA NEWCHR,X ;THE CHARACTERS... STA CHSET+24,X ;WE'RE USING! DEX BPL CHGCHR LDA # >CHSET ;TURN ON... STA CHBASE ;OUT CHAR SET LDA #62 ;TURN ON DMA STA DMACTL LDA # >DLIST ;POINT TO... STA DLISTH ;OUR... LDA # <DLIST ;DISPLAY... STA DLISTL ;LIST! LDA #3 ;TURN ON GRAPHICS STA GRACTL LDA # >PMAREA ;SET P/M AREA STA PMBASE LDA #38 ;SET COLORS STA COLPM0 LDA #52 STA COLPM1 STA COLPM2 STA COLPM3 LDA #124 ;SET P/M POSITIONS STA HPOSP0 LDA #116 STA HPOSP1 STA HPOSP2 STA HPOSP3 LDA #1 ;SET PRIORITY STA PRIOR LDA #15 ;SET MISC. COLORS STA COLPF0 LDA #40 STA COLPF1 LDA #136 STA COLPF2 LDA #214 STA COLPF3 LDA # >DLI1 ;POINT TO DLI STA $0201 LDA # <DLI1 STA $0200 LDX # >VBLANK ;SET VBLANK LDY # <VBLANK LDA #7 JSR SETVBV LDA #0 ;CLEAR SCREEN TAX CLSCRN STA DISP,X STA DISP+240,X INX CPX #240 BNE CLSCRN LDA #192 ;TURN ON DLI, STA NMIEN ;VBLANK! RTS VBLANK LDA TIMER ;GET TIMER BEQ NOTIM ;IT'S ZERO! DEC TIMER ;DECREMENT TIMER NOTIM JMP XITVBV ;ALL DONE! DLI1 PHA LDA #$44 ;SET COLPF0 STA WSYNC STA $D016 LDA # >DLI2 ;POINT TO DLI #2 STA $0201 LDA # <DLI2 STA $0200 PLA RTI DLI2 PHA DLI2C1 LDA #$58 ;SET COLPF1 STA WSYNC STA $D017 LDA # >DLI3 ;POINT TO DLI #3 STA $0201 LDA # <DLI3 STA $0200 PLA RTI DLI3 PHA LDA $CB ;TOGGLE... STA WSYNC ;FLASHING... CMP #$28 ;ARROW... BNE DLI3B ;COLORS LDA #0 STA $CB LDA $CC BPL DLI3A LDA #0 STA $CC BEQ DLI3B DLI3A LDA #$8E STA $CC DLI3B LDA $CC STA $D016 ;PF 0 INC $CB LDA # >DLI4 ;POINT TO DLI #4 STA $0201 LDA # <DLI4 STA $0200 PLA RTI DLI4 PHA DLI4C1 LDA #$0E ;SET COLPF0 STA WSYNC STA $D016 DLI4C2 LDA #$FC ;COLPF1 STA $D017 DLI4C3 LDA #$92 ;COLPF2 STA $D018 DLI4C4 LDA #$42 ;COLPF3 STA $D019 LDA # >DLI1 ;POINT TO DLI #1 STA $0201 LDA # <DLI1 STA $0200 PLA RTI SHOLIV LDA #70 ;MAN CHAR STA DISP2 LDA #93 ;EQUAL SIGN STA DISP2+1 LDA TOM ;GET # LIVES, SEC ;PUT ON SCREEN SBC #1 ORA #$10 STA DISP2+2 RTS SCREEN LDA # >[DISP+169] ;POINT TO... STA HI ;PAD AREA... LDA # <[DISP+169] ;ON SCREEN STA LO LDA #1 ;AND SET UP PADS! STA PADCT SETPAD LDY PADCT SPADLP LDA PADATA,Y STA (LO),Y DEY BPL SPADLP LDA PADCT CLC ADC #2 CMP #15 BEQ PADEND STA PADCT LDA LO CLC ADC #39 STA LO LDA HI ADC #0 STA HI JMP SETPAD PADEND JSR STODIF LDA #0 ;ERASE... STA DISP+18 ;LEVEL # STA DISP+38 ;ROUND # LDX #5 ;SHOW LVL/RND MESSAGES SETLR LDA LVLMSG,X STA DISP+12,X LDA RNDMSG,X STA DISP1+12,X DEX BPL SETLR RTS ZEROSC LDX #5 ;ZERO SCORE ZSCLP LDA #16 STA DISP,X LDA CHGMSG,X ;SET CHANGE TO MSG STA DISP4,X DEX BPL ZSCLP LDA #52 ;SET UP ARROWS... STA DISP5+2 ;AND COLOR INDICATOR LDA #47 STA DISP5+3 LDA #7 STA DISP7+1 LDA #67 STA DISP7+2 LDA #68 STA DISP7+3 LDA #8 STA DISP7+4 RTS INILVL LDA #1 ;START AT... STA LEVEL ;LEVEL 1, STA LVL STA ROUND ;ROUND 1 LDA #4 ;4 LIVES! STA TOM LDA #0 ;SET START FLAG STA START LDA #2 ;SET MISC VARIABLES STA ROW LDA #96 STA COLR LDA #16 STA PNT RTS SNDOFF LDA #0 ;TURN OFF... STA AUDC1 ;SOUND CHANNEL 1 STA AUDC2 ;SOUND CHANNEL 2 STA AUDC3 ;SOUND CHANNEL 3 STA AUDC4 ;SOUND CHANNEL 4 RTS SETLD LDA LVL ;GET LEVEL CMP #1 ;LEVEL 1? BEQ L14 ;YES! CMP #4 ;LEVEL 4? BNE CL25 ;NO! CHECK 2/5 L14 LDA DLI4C2+1 ;SET COLOR STA DLI2C1+1 RTS CL25 CMP #2 ;LEVEL 2? BEQ L25 ;YES! CMP #5 ;LEVEL 5? BNE L36 ;NO! L25 LDA DLI4C3+1 ;SET COLOR STA DLI2C1+1 RTS L36 LDA DLI4C4+1 ;SET COLOR STA DLI2C1+1 RTS BONUS LDX #20 ;PLAY MUSIC MUSLP LDA NOTE,X ;SET NOTE STA AUDF1 LDA #$AA STA AUDC1 LDA DUR,X ;SET DURATION JSR WAIT ;WAIT, JSR COLCYC ;CYCLE COLORS DEX ;MORE NOTES? BPL MUSLP ;YES! LDX #60 ;DO DOWN-SLUR MDOWN STX AUDF1 JSR COLCYC LDA #2 JSR WAIT INX INX INX CPX #81 BCC MDOWN MUP STX AUDF1 ;NOW UP-SLUR JSR COLCYC LDA #2 JSR WAIT DEX DEX DEX CPX #57 BNE MUP LDA #0 ;RESET BACKGND COLOR STA COLBK LDA #96 STA COLR LDX #10 ;AND FADE OUT... FADE TXA ;LAST NOTE ORA #$A0 STA AUDC1 LDA #4 JSR WAIT DEX BPL FADE LDA #0 ;SHUT OFF SOUND STA AUDC1 LDX #9 ;SHOW BONUS MESSAGE SHOBMS LDA BONMSG,X STA DISP22+5,X DEX BPL SHOBMS LDA SCORE+2 ;ADD 1000 POINTS CLC ;TO SCORE ADC #1 CMP #26 BNE SHOSP2 LDA SCORE+1 CLC ADC #1 CMP #26 BNE SHOSP2 LDA SCORE+1 CLC ADC #1 STA SCORE+1 STA DISP+1 LDA #16 SHOSP2 STA SCORE+2 STA DISP+2 LDA #200 ;WAIT 200 JIFFIES JSR WAIT RTS BONLIF LDA DISP+1 ;GET SCORE CMP PNT ;> BONUS AMT? BEQ BRRET ;NO! BCS BONUSL ;YES! BRRET RTS BONUSL INC PNT ;INC BONUS LEVEL INC TOM ;1 MORE LIFE JSR SHOLIV ;SHOW LIVES LDX #2 ;3 BONUS SOUNDS LDA #32 ;PITCH = 32 STA AUDF1 BLS1 LDY #15 ;VOLUME 15 BLS2 TYA ORA #$A0 STA AUDC1 LDA #3 ;LEAVE ON 3 JIFFIES JSR WAIT DEY ;NEXT VOLUME BPL BLS2 DEX ;NEXT SOUND BPL BLS1 LDA #0 ;TURN OFF SOUND STA AUDC1 RTS STODIF LDA OPT ;GET DIFF FLAG STA OPTN1+1 ;STORE IN... STA OPTN2+1 ;PROGRAM LDA LEVEL ;GET LEVEL CMP #3 ;LEVEL 3? BNE NOTL3 ;NO! LDA ROUND ;GET ROUND CMP #1 ;ROUND 1? BEQ SET1 ;YES! CMP #3 ;ROUND 3? BNE NOTL3 ;NO! SET1 LDA #0 ;SET DIFFICULTY STA OPTN2+1 DIFRTS RTS NOTL3 LDA LEVEL ;GET LEVEL # CMP #7 ;LEVEL 7? BNE NOTL7 ;NO! LDA #0 ;SET DIFF STA OPTN1+1 RTS NOTL7 CMP #8 ;LEVEL 8? BEQ SET1 ;YES! CMP #9 ;LEVEL 9? BCC DIFRTS ;NO! LDA #0 ;SET DIFF STA OPTN1+1 BEQ SET1 COLCYC LDA COLR ;GET COLOR FLAG CLC ;ADD 2 ADC #2 STA COLR ;SAVE IT STA COLBK ;AND SET BACKGND RTS ; ;---------------- ;START OF PROGRAM ;---------------- ; GAME JSR SETUP ;INIT..... JSR FIG1 ; ;--------- ;MAIN LOOP ;--------- ; MAIN LDA BACK ;BACK TO CMP #$00 BEQ CHKSTK ;CONTROLLER? RTS ;yes... CHKSTK LDA MOVFLG ;ALREADY CMP #1 ;MOVIN... BNE A1 ;NO! JSR MOVE.MAN ;YES, MOVE MAN JMP A2 A1 LDA STICK0 ;CHK STICK STA DIRECT ;SAVE STICK POS JSR MOVE.MAN ;MOVE MAN A2 JSR ROCK2 ;HANDLE ROCK 2 LDA TEMP ;GET ADVANCE FLAG OPTN1 CMP #1 ;0/1 SETS DIFFICULTY BNE A6 ;NO ADVANCE! LDA #0 ;RESET ADV FLAG STA TEMP JSR ROCK3 ;HANDLE ROCK 3 JMP A5 ;SKIP NEXT CODE A6 LDA #1 ;SET ADV FLAG STA TEMP A5 LDA TEMP1 ;GET ADV FLAG 2 OPTN2 CMP #1 ;0/1 SETS DIFFICULTY BNE A3 ;NO ADVANCE! LDA #0 ;RESET ADV FLAG 2 STA TEMP1 JSR ROCK1 ;HANDLE ROCK 1 JMP A4 A3 LDA #1 ;SET ADVANCE FLAG STA TEMP1 A4 JSR SOUND ;DO SOUNDS JSR CHECK ;CHECK SQUARES HIT JSR CLEAR ;RESET P/M COLLISION JSR DELAY ;DELAY... JSR PL.PL ;CHECK PLR-PLR COLL. JMP MAIN ;GO AGAIN ; ;------------------- ;MOVE MAN SUBROUTINE ;------------------- ; MOVE.MAN LDA SO1FLG ;CHK SOUND CMP #1 ;FLG BNE CHECKDIR RTS ; CHECKDIR LDA DIRECT ;GET STICK... CMP #9 ;DIRECTION BNE B1 JMP DNLEFT0 ;DOWN & LEFT B1 CMP #5 BNE B2 JMP DNRIGHT0 ;DOWN & RIGHT B2 CMP #6 BNE B3 JMP UPRIGHT0 ;UP & RIGHT B3 CMP #10 BNE B4 JMP UPLEFT0 ;UP & LEFT B4 RTS ; ;--------- ;ROCK1 SUB ;--------- ROCK1 LDA SO2FLG ;SOUND ON? CMP #1 BNE C1 ;NO! RTS C1 LDA DRP1 ;DROPPING? CMP #80 BEQ C11 ;NO! INC DRP1 ;NEXT DROP RTS C11 LDA B1MOV ;MOVING... CMP #1 BNE C2 JMP MOVE1 ;YES... C2 LDA B1DRP ;DROPED?? CMP #1 BEQ C3 ;YES... LDA RANDOM ;NOT YET.. BMI C4 RTS ;DONT DROP C4 LDA #1 ;SET DRP.. STA B1DRP JSR BAL1DRW ;DRAW ROCK C3 LDA FNB1DRP ;FINISHED.. CMP #1 BNE DROP1 ;NO... JMP GETDIR1 ; DROP1 JSR DOWN1 ;DROP... JSR DOWN1 JSR DOWN1 JSR DOWN1 LDA YPOSP1 ;FINISHED.. CMP #109 BCS D1 ;YES... RTS ;NO.... D1 LDA #1 STA FNB1DRP ;SET FLG.. STA SO2FLG ;SOUND FLG LDA #$AF STA PITCH2 ;PITCH... RTS ;RETURN... ; GETDIR1 LDA #1 ;GET DIRECT STA B1MOV LDA RANDOM BMI E1 LDA #0 ;0=DNRIGHT STA B1DIR JMP MOVE1 E1 LDA #1 ;1=DNLEFT STA B1DIR ; MOVE1 LDA B1DIR ;WHICH WAY? CMP #1 ;DNLEFT?? BNE F1 ;NO.... JMP DNLEFT1 ;YES... F1 JMP DNRIGHT1 ; ;---------- ;ROCK 2 SUB ;---------- ROCK2 LDA SO3FLG ;SOUND ON? CMP #1 BNE G1 ;NO! RTS ; G1 LDA DRP2 ;DROPPING? CMP #40 BEQ G11 ;NO! INC DRP2 ;INC DROP COUNT RTS G11 LDA GRNFLG ;GRN MAN CMP #1 ;OUT.... BNE G2 JMP GREEN ;YES... G2 LDA BAL1FLG ;ROCK OUT?? CMP #1 BNE G3 JMP MOVBAL2 ;YES... G3 LDA ROUND ;CAN GREEN CMP #2 ;COME OUT?? BNE G4 ;NO... JMP GRNCAN ;YES... G4 CMP #4 BEQ GRNCAN JMP MOVBAL2 ;NO.... ; GRNCAN LDA MAN CMP #50 BEQ MOVBAL2 LDA OUTFLG2 ;ROCK COME CMP #2 ;TWICE.... BCC MOVBAL2 LDA RANDOM ;GREEN OR BMI MOVBAL2 ;ROCK.... INC MAN ;IT'S GREEN MAN! JMP GREEN ; MOVBAL2 LDA B2MOV ;MOVING... CMP #1 BNE H2 ;NO... JMP MOVE2 ;YES... H2 LDA B2DRP ;DROPPED?? CMP #1 BEQ H3 ;YES... LDA RANDOM ;NOT YET... BMI H4 RTS H4 LDA #1 ;SET DRP.. STA B2DRP STA BAL1FLG INC OUTFLG2 JSR BAL2DRW ;DRAW ROCK H3 LDA FNB2DRP ;FINISHED.. CMP #1 BNE DROP2 ;NO... JMP GETDIR2 ; DROP2 JSR DOWN2 ;ADVANCE... JSR DOWN2 ;FOUR... JSR DOWN2 ;TIMES JSR DOWN2 LDA YPOSP2 ;DONE DROPPING? CMP #109 BCS I1 ;YES! RTS I1 LDA #1 ;FINISHED! STA FNB2DRP STA SO3FLG LDA #$AF ;SET SOUND 3 STA PITCH3 RTS ; GETDIR2 LDA #1 ;ROCK 2 MOVING STA B2MOV LDA RANDOM ;GET RANDOM DIR BMI J1 LDA #0 ;IT'S DOWN & RIGHT! STA B2DIR JMP MOVE2 ;GO MOVE IT! J1 LDA #1 ;IT'S DOWN & LEFT! STA B2DIR ; MOVE2 LDA B2DIR ;WHICH DIR CMP #1 ;DN & LEFT? BNE K1 ;NO! JMP DNLEFT2 K1 JMP DNRIGHT2 ; GREEN LDA #1 ;SET GRNFLG STA GRNFLG LDA #0 STA OUTFLG2 LDA GRNMOV ;MOVING? CMP #1 BNE L1 ;NO! JMP MOVEGRN ;YES, MOVE IT! L1 LDA GRNDRP ;DROP YET? CMP #1 BEQ L2 ;NO! LDA #1 ;SET FLG... STA GRNDRP ;FOR DROP JSR GRN0 ;DRAW L2 LDA GRNFNDRP ;DROP DONE? CMP #1 BNE DROPGRN ;NO! JMP GEDIRGRN ;YES, GET DIRECTION DROPGRN JSR DOWN2 ;MOVE... JSR DOWN2 ;DOWN... JSR DOWN2 ;FOUR... JSR DOWN2 ;TIMES! LDA YPOSP2 ;DROP DONE? CMP #104 BCS M1 ;YES! RTS M1 LDA #1 ;SET DROP DONE FLAG STA GRNFNDRP STA SO3FLG LDA #$AF ;AND SOUND! STA PITCH3 RTS ; GEDIRGRN LDA #1 ;SET GREEN MOVE FLAG STA GRNMOV INC GROW ;INC GREEN ROW INC GROW LDA RANDOM ;GET RANDOM COL MOVE BMI N1 LDA #0 ;DOWN & RIGHT STA GRNDIR INC GCOL ;INCREMENT COLUMN JSR GRN0 ;DRAW FACING RIGHT JMP MOVEGRN ;AND MOVE HIM! N1 LDA #1 ;DOWN & LEFT STA GRNDIR DEC GCOL ;DEC COLUMN JSR GRN1 ;DRAW FACING LEFT ; MOVEGRN LDA GRNDIR ;GET DIRECTION CMP #1 ;DOWN & LEFT? BNE O1 ;NO! JMP DNLEFT2 ;MOVE IT! O1 JMP DNRIGHT2 ;DITTO! ; ;---------- ;ROCK 3 SUB ;---------- ROCK3 LDA SO4FLG ;SOUND ON? CMP #1 BNE P1 ;NO! RTS P1 LDA GRGFLG ;GEORGE ON? CMP #1 BNE P2 ;NO! JMP GEORGE ;HANDLE GEORGE P2 LDA BAL2FLG ;ROCK 2 OUT? CMP #1 BNE P3 ;NO! JMP MOVBAL3 ;MOVE ROCK 3 P3 LDA ROUND ;GET ROUND CMP #3 ;ROUND 3/4? BCS GRGCAN ;YES, BRING OUT GEORGE! JMP MOVBAL3 ;MOVE ROCK 3! ; GRGCAN LDA OUTFLG ;CAN GEORGE... CMP #2 ;COME OUT? BCC MOVBAL3 ;NO, DO ROCK 3 LDA RANDOM ;GET RANDOM CHANCE... BMI MOVBAL3 ;NO, HE CAN'T JMP GEORGE ;COME ON, GEORGE! ; MOVBAL3 LDA B3MOV ;ROCK 3 MOVING? CMP #1 BNE Q2 ;NO! JMP MOVE3 ;MOVE IT! Q2 LDA B3DRP ;ROCK 3 DROPPING? CMP #1 BEQ Q3 ;YES! LDA RANDOM ;READY TO DROP? BMI Q4 ;YES! RTS Q4 LDA #1 ;SET DROP FLAG STA B3DRP STA BAL2FLG INC OUTFLG ;INC GEORGE CHANCE JSR BAL3DRW ;DRAW ROCK 3 Q3 LDA FNB3DRP ;IS ROCK 3... CMP #1 ;DROP COMPLETE? BNE DROP3 ;NO! JMP GETDIR3 ;YES, GET DIRECTION ; DROP3 JSR DOWN3 ;MOVE... JSR DOWN3 ;DOWN... JSR DOWN3 ;FOUR... JSR DOWN3 ;TIMES LDA YPOSP3 ;DROP DONE? CMP #109 BCS R1 ;YES! RTS R1 LDA #1 ;SET DROP... STA FNB3DRP ;FINISH FLAG STA SO4FLG LDA #$AF ;AND SOUND! STA PITCH4 RTS ; GETDIR3 LDA #1 ;SET ROCK 3 MOVE FLAG STA B3MOV LDA RANDOM ;GET RANDOM CHANCE BMI S1 LDA #0 ;DOWN & RIGHT! STA B3DIR JMP MOVE3 ;MOVE IT S1 LDA #1 ;DOWN & LEFT! STA B3DIR ; MOVE3 LDA B3DIR ;GET ROCK 3 DIRECTION CMP #1 ;DOWN & LEFT? BNE T1 ;NO! JMP DNLEFT3 ;MOVE IT! T1 JMP DNRIGHT3 ;DITTO! ; GEORGE LDA #1 ;SET... STA GRGFLG ;GEORGE FLAG LDA GRGMOV ;GEORGE MOVING? CMP #1 BNE U1 ;NO! JMP MOVGRG ;GO MOVE HIM! U1 LDA GRGDRP ;GEORGE DROPPING? CMP #1 BEQ U2 ;YES! LDA #1 ;OK, START... STA GRGDRP ;GEORGE DROP JSR GEORGE0 ;GEORGE FACING LEFT U2 LDA FNGRDRP ;GEORGE DROP DONE? CMP #1 BNE DROPGRG ;NO, DROP HIM! JMP GETDRGRG ;GET GEORGE DIRECTION ; DROPGRG JSR DOWN3 ;MOVE GEORGE... JSR DOWN3 ;DOWN... JSR DOWN3 ;FOUR... JSR DOWN3 ;TIMES! LDA YPOSP3 ;DROP DONE? CMP #98 BCS V1 ;YES! RTS V1 LDA #1 ;SET GEORGE'S DROP... STA FNGRDRP ;DONE FLAG STA SO4FLG LDA #$AF ;SET SOUND STA PITCH4 RTS ; GETDRGRG LDA #1 ;SET GEORGE... STA GRGMOV ;MOVING FLAG LDA PCOL ;GET DIRECTION... CMP SCOL ;BASED ON PLAYER POS. BCS RIGHT ;GO RIGHT! LDA PROW ;GET UP/DOWN CMP SROW BEQ W1 ;UP! BCC W1 ;UP! JSR GEORGE0 ;FACING LEFT & DOWN DEC SCOL ;MOVE LEFT INC SROW ;MOVE DOWN... INC SROW ;2 TIMES LDA #0 ;0 = DOWN & LEFT STA GRDIR JMP MOVGRG ;MOVE GEORGE! W1 JSR GEORGE2 ;FACING LEFT & UP DEC SCOL ;MOVE LEFT DEC SROW ;MOVE UP... DEC SROW ;2 TIMES LDA #2 ;2 = UP & LEFT STA GRDIR JMP MOVGRG ;MOVE GEORGE! RIGHT LDA PROW ;GET UP/DOWN CMP SROW BEQ X1 ;UP! BCC X1 ;UP! JSR GEORGE1 ;FACING RIGHT & DOWN INC SCOL ;MOVE RIGHT INC SROW ;MOVE DOWN... INC SROW ;2 TIMES LDA #1 ;1 = RIGHT & DOWN STA GRDIR JMP MOVGRG ;MOVE GEORGE! X1 JSR GEORGE3 ;FACING RIGHT & UP INC SCOL ;MOVE RIGHT DEC SROW ;MOVE UP... DEC SROW ;2 TIMES LDA #3 ;3 = RIGHT & UP STA GRDIR ; MOVGRG LDA GRDIR ;GET GEORGE DIRECTION CMP #0 ;DOWN & LEFT? BNE Y1 ;NO! JMP DNLEFT3 Y1 CMP #1 ;DOWN & RIGHT? BNE Y2 ;NO! JMP DNRIGHT3 Y2 CMP #2 ;UP & LEFT? BNE Y3 ;NO! JMP UPLEFT3 Y3 JMP UPRIGHT3 ; ;---------------- ;SOUND SUBROUTINE ;---------------- ; SOUND LDA SO1FLG ;SOUND 1 ON? CMP #1 BEQ Z1 ;YES! JMP SO2 ;NO, DO SOUND 2 Z1 LDA PITCH1 ;GET SOUND 1 PITCH STA AUDC1 DEC PITCH1 ;NEXT PITCH LDA PITCH1 ;GET PITCH CMP #$A0 ;ALL DONE? BEQ Z2 ;YES! JMP SO2 Z2 LDA #0 ;TURN OFF... STA AUDC1 ;SOUND 1, STA SO1FLG ;SOUND 1 FLAG, STA MOVFLG ;MOVEMENT FLAG LDA #8 STA COUNT1 LDA P0PF ;MAN ON SQUARE? CMP #0 BNE GETLEVEL ;YES! JSR FALL ;UH-OH, HE FELL! RTS ;HE'S OK ; GETLEVEL JSR UPDATMAN ;MOVE MAN LDA LEVEL ;GO TO... CMP #1 ;APPROPRIATE... BNE AA1 ;LEVEL HANDLER! JMP LEVEL1 AA1 CMP #2 BNE AA2 JMP LEVEL2 AA2 CMP #3 BNE AA4 JMP LEVEL3 AA4 CMP #4 BNE AA5 JMP LEVEL4 AA5 CMP #5 BNE AA6 JMP LEVEL5 AA6 CMP #6 BNE AA7 JMP LEVEL6 AA7 CMP #7 BNE AA8 JMP LEVEL3 AA8 JMP LEVEL6 ; LEVEL1 LDA P0PF ;HIT CMP #1 ;PLAYFIELD 0? BNE BB1 ;NO... INC NUMSQ ;YES-INCREMENT SQUARES JSR PLAYFLD1 ;CHANGE IT TO PF1 BB1 JMP SO2 ; LEVEL2 LDA P0PF ;HIT CMP #1 ;PLAYFIELD 0? BNE CC1 ;NO... JSR PLAYFLD1 ;CHANGE IT TO PF1 JMP SO2 ;AND PROCEED CC1 CMP #2 ;PLAYFIELD 1? BNE CC2 ;NO... INC NUMSQ ;1 MORE SQUARE JSR PLAYFLD2 ;CHANGE IT TO PF2! CC2 JMP SO2 ;AND PROCEED ; LEVEL4 LDA P0PF ;HIT PLAYFIELD 0? CMP #1 BNE DD1 ;NO... INC NUMSQ ;1 MORE SQUARE! JSR PLAYFLD1 ;CHANGE TO PF1 JMP SO2 ;PROCEED! DD1 DEC NUMSQ ;DEDUCT SQUARE! JSR PLAYFLD0 ;BACK TO PF0 JMP SO2 ;AND GO ON. ; LEVEL3 LDA P0PF ;HIT PLAYFIELD 0? CMP #1 BNE EE1 ;NO... JSR PLAYFLD1 ;CHANGE TO PF1 JMP SO2 ;AND PROCEED EE1 CMP #2 ;HIT PLAYFIELD 2? BNE EE2 ;NO... JSR PLAYFLD2 ;CHANGE TO PF2 JMP SO2 ;AND PROCEED EE2 CMP #4 ;HIT PLAYFIELD 2? BNE SO2 ;NO... INC NUMSQ ;1 MORE SQUARE JSR PLAYFLD3 ;CHANGE TO PF3 JMP SO2 ;AND PROCEED ; LEVEL5 LDA P0PF ;HIT PLAYFIELD 0? CMP #1 BNE FF1 ;NO... JSR PLAYFLD1 ;CHANGE TO PF1 JMP SO2 ;PROCEED FF1 CMP #2 ;HIT PLAYFIELD 1? BNE FF2 ;NO... INC NUMSQ ;1 MORE SQUARE JSR PLAYFLD2 ;CHANGE TO PF2 JMP SO2 ;PROCEED FF2 DEC NUMSQ ;1 LESS SQUARE JSR PLAYFLD1 ;CHANGE TO PF1 JMP SO2 ;PROCEED ; LEVEL6 LDA P0PF ;HIT PLAYFIELD 0? CMP #1 BNE GG1 ;NO... JSR PLAYFLD1 ;CHANGE TO PF1 JMP SO2 ;PROCEED GG1 CMP #2 ;HIT PLAYFIELD 1? BNE GG2 ;NO... JSR PLAYFLD2 ;CHANGE TO PF2 JMP SO2 ;PROCEED GG2 CMP #4 ;HIT PLAYFIELD 2? BNE GG3 ;NO... INC NUMSQ ;1 MORE SQUARE JSR PLAYFLD3 ;CHANGE TO PF3 JMP SO2 ;PROCEED GG3 DEC NUMSQ ;1 LESS SQUARE JSR PLAYFLD2 ;CHANGE TO PF2 ; SO2 LDX #0 ;ROCK 1 LDY #0 JSR BALCHK ;SEE IF IT FELL LDA FALOFF ;DID IT FALL? CMP #1 BEQ HH1 ;YES! JMP SO3 ;NO, PROCEED HH1 LDY YPOSP1 ;ERASE ROCK 1 LDX #0 TXA HH2 STA PLAY1,Y INX INY CPX #10 BNE HH2 LDA #0 ;RESET DROP FLAG STA DRP1 LDX #0 ;CLR OTHER FLAGS JSR CLRFLG ; SO3 LDA GRNFLG ;GREEN MAN ACTIVE? CMP #1 BNE II99 ;NO! JMP GRNCHK ;SEE IF HE FELL II99 LDX #1 ;ROCK 2 LDY #2 JSR BALCHK ;SEE IF IT FELL LDA FALOFF ;DID ROCK 2 FALL? CMP #1 BEQ II1 ;YES! JMP SO4 ;NO, PROCEED II1 LDY YPOSP2 ;ERASE ROCK 2 LDX #0 TXA II2 STA PLAY2,Y INX INY CPX #10 BNE II2 LDA #0 ;RESET DROP FLAG STA DRP2 STA BAL1FLG LDX #1 ;AND OTHER FLAGS JSR CLRFLG ; SO4 LDA GRGFLG ;GEORGE ACTIVE? CMP #1 BEQ GRGCHK ;YES! LDX #2 ;CHECK ROCK 3 LDY #4 JSR BALCHK ;SEE IF IT FELL LDA FALOFF ;DID IT FALL? CMP #1 BEQ JJ1 ;YES! RTS JJ1 LDY YPOSP3 ;ERASE ROCK 3 LDX #0 TXA JJ2 STA PLAY3,Y INY INX CPX #10 BNE JJ2 LDA #0 ;CLEAR ROCK 3 FLAG STA BAL2FLG LDX #2 ;AND OTHER FLAGS JSR CLRFLG RTS ; GRGCHK LDA SO4FLG ;SOUND ON? CMP #1 BEQ KK1 ;YES! RTS KK1 LDA PITCH4 ;SET VOLUME STA AUDC4 DEC PITCH4 ;NEXT VOLUME LDA PITCH4 ;SOUND DONE? CMP #$A0 BEQ KK2 ;YES! RTS KK2 LDA P3PF ;DID GEORGE... CMP #0 ;HIT PF? BNE KK3 ;YES! LDA #5 ;ADD 500 POINTS... STA SUM ;TO SCORE JSR ADD200 JSR RESET ;RESET GEORGE RTS KK3 LDA #0 ;ZERO... STA AUDC4 ;SOUND 4, STA SO4FLG ;SOUND 4 FLAG STA GRGMOV ;GEORGE MOVE FLAG LDA #8 STA COUNT4 RTS ; GRNCHK LDA SO3FLG ;SOUND 3 ON? CMP #1 BEQ LL1 ;YES! JMP SO4 ;NO, DO SOUND 4 LL1 LDA PITCH3 ;SET SOUND 3 VOLUME STA AUDC3 DEC PITCH3 ;NEXT VOLUME LDA PITCH3 ;SOUND 3 DONE? CMP #$A0 BEQ LL2 ;YES! JMP SO4 ;NO, DO SOUND 4 LL2 LDA #0 ;TURN OFF SOUND 3 STA AUDC3 LDA P2PF ;DID GREEN MAN... CMP #0 ;HIT PLAYFIELD? BNE GOBACK ;YES! HITGRN JSR ERASEGRN ;GREEN MAN GONE LDA #0 ;RESET GREEN MAN STA GRNDRP STA GRNFNDRP STA GRNFLG STA GRNMOV STA SO3FLG STA DRP2 LDA #10 ;RESET ROW STA GROW LDA #8 ;RESET COLUMN STA GCOL STA COUNT3 LDA #45 STA YPOSP2 LDA #116 STA HPOSP2 STA XPOSP2 RTS GOBACK LDA #0 ;RESET SOUND 3 STA SO3FLG STA GRNMOV LDA #8 STA COUNT3 LDA P2PF ;DID GREEN HIT PF0? CMP #1 BNE MM4 ;NO! RTS MM4 JSR DECNUM ;DEC # SQUARES LDA # <PF0 ;CHANGE TO PF0 STA FILE LDA # >PF0 STA FILE+1 LDA GCOL ;SET COLUMN STA COL LDA GROW ;AND ROW STA ROW JSR CHANGE ;CHANGE IT! RTS DECNUM LDA LEVEL ;GET LEVEL CMP #1 BEQ NN1 ;LEVEL 1 CMP #2 BEQ NN2 ;LEVEL 2 CMP #3 BEQ NN4 ;LEVEL 3 CMP #4 BEQ NN1 ;LEVEL 4 CMP #5 BEQ NN2 ;LEVEL 5 JMP NN4 ;LEVEL 6 ; NN1 LDA P2PF ;HIT PF1? CMP #2 BEQ DECR ;YES! RTS NN2 LDA P2PF ;HIT PF2? CMP #4 BEQ DECR ;YES! RTS NN4 LDA P2PF ;HIT PF3? CMP #8 BEQ DECR ;YES! RTS DECR DEC NUMSQ ;1 LESS SQUARE RTS BALCHK LDA SO2FLG,X ;SOUND 2 ON? CMP #1 BEQ OO1 ;YES! RTS OO1 LDA PITCH2,X ;SET VOLUME STA AUDC2,Y DEC PITCH2,X ;NEXT VOLUME LDA PITCH2,X ;ALL DONE? CMP #$A0 BEQ OO2 ;YES! RTS OO2 LDA #0 ;TURN OFF... STA AUDC2,Y ;SOUND 2 LDA P1PF,X ;DID ROCK... CMP #0 ;HIT PF? BNE OO3 ;YES! LDA #1 ;UH-OH! IT FELL! STA FALOFF ;SET FALL FLAG RTS OO3 LDA #0 ;RESET SOUND FLAG STA SO2FLG,X STA B1MOV,X LDA #8 STA COUNT2,X RTS ; CLRFLG LDA #$00 ;RESET MISC FLAGS STA B1MOV,X STA SO2FLG,X STA B1DRP,X STA FNB1DRP,X STA FALOFF LDA #8 STA COUNT2,X LDA #45 STA YPOSP1,X LDA HPOS,X STA HPOSP1,X STA XPOSP1,X RTS ; UPDATMAN LDA DIRECT ;GET DIR... CMP #9 BEQ PP1 ;DOWN & LEFT CMP #5 BEQ PP2 ;DOWN & RIGHT CMP #6 BEQ PP4 ;UP & RIGHT CMP #10 BEQ PP3 ;UP & LEFT RTS ; PP1 DEC PCOL ;MOVE LEFT INC PROW ;MOVE DOWN... INC PROW ;2 TIMES RTS PP2 INC PCOL ;MOVE RIGHT INC PROW ;MOVE DOWN... INC PROW ;2 TIMES RTS PP3 DEC PCOL ;MOVE LEFT DEC PROW ;MOVE UP... DEC PROW ;2 TIMES RTS PP4 INC PCOL ;MOVE RIGHT DEC PROW ;MOVE UP... DEC PROW ;2 TIMES RTS ; PCUBPOS LDA PCOL ;SAVE SQUARE POS. STA COL LDA PROW STA ROW RTS ; ;----- ;DELAY ;----- DELAY LDX #$FF ;TIME DELAY QQ1 LDY TIME QQ2 DEY BNE QQ2 DEX BNE QQ1 RTS ; ;------------- ;SETUP ROUTINE ;------------- ; SETUP LDA START ;INIT ALL? CMP #$00 BNE PART ;NO... LDA #$00 ;YES... STA NUMSQ LDA #$10 ;RESET LDX #0 ;SCORE... RESET1 STA SCORE,X INX CPX #$06 BNE RESET1 ; PART LDA #$00 ;SET FLG'S LDX #0 ;TO ZERO.. SETZERO STA BACK,X INX CPX #100 BNE SETZERO LDA #$08 ;SET COUNT STA COUNT1 STA COUNT2 STA COUNT3 STA COUNT4 ; LDA #9 ;SET PLAYER STA PCOL ;COLUMN & LDA #8 ;ROW... STA PROW ; LDA #10 ;SET GEORGE STA SCOL ;&GREEN STA SROW ;COLUMN... STA GROW LDA #8 STA GCOL ; LDA #124 ;PM DATA.. STA PXPOS STA HPOSP0 LDA #85 STA PYPOS LDA #116 STA XPOSP1 STA XPOSP2 STA HPOSP1 STA HPOSP2 STA HPOS STA HPOS+1 LDA #132 STA XPOSP3 STA HPOS+2 STA HPOSP3 LDA #45 STA YPOSP1 STA YPOSP2 STA YPOSP3 ; CLC ;SET UP... LDA #170 ;SOUND... STA AUDF1 ;FREQUENCIES ADC #10 STA AUDF2 ADC #10 STA AUDF3 ADC #10 STA AUDF4 ; LDA #$01 ;CLR COLLISIONS STA HITCLR ; PMCLR LDA #$00 ;ERASE P/M LDX #$FF ;MEMORY ERASEMEM STA PLAY0,X STA PLAY1,X STA PLAY2,X STA PLAY3,X DEX BNE ERASEMEM RTS ;RETURN... ; ;--------------- ;FIGURES FOR MAN ;--------------- ; FIG1 LDA DIRFLG ;GET MOVE DIRECTION CMP #9 ;DOWN & LEFT? BEQ RR2 ;YES! LDY PYPOS ;DRAW FIGURE 1 LDX #0 RR1 LDA FIG1DAT,X STA PLAY0,Y INY INX CPX #16 BNE RR1 RR2 RTS ; FIG2 LDA DIRFLG ;GET MOVE DIRECTION CMP #5 ;DOWN & RIGHT? BEQ SS2 ;YES! JSR ERASEMAN ;ERASE MAN LDY PYPOS ;DRAW FIGURE 2 LDX #0 SS1 LDA FIG2DAT,X STA PLAY0,Y INY INX CPX #16 BNE SS1 SS2 RTS ; FIG3 LDA DIRFLG ;GET DIRECTION CMP #10 ;UP & LEFT? BEQ TT2 ;YES! JSR ERASEMAN ;ERASE MAN LDY PYPOS ;DRAW FIGURE 3 LDX #0 TT1 LDA FIG3DAT,X STA PLAY0,Y INY INX CPX #15 BNE TT1 TT2 RTS ; FIG4 LDA DIRFLG ;GET DIRECTION CMP #6 ;UP & RIGHT? BEQ UU2 ;YES! JSR ERASEMAN ;ERASE MAN LDY PYPOS ;DRAW FIGURE 4 LDX #0 UU1 LDA FIG4DAT,X STA PLAY0,Y INY INX CPX #15 BNE UU1 UU2 RTS GRN0 JSR ERASEGRN ;ERASE GREEN MAN LDY YPOSP2 ;DRAW GREEN MAN... LDX #$00 ;FACING RIGHT VV1 LDA GRN1DAT,X STA PLAY2,Y INX INY CPX #13 BNE VV1 JSR SETGRN ;SET GREEN PARAMETERS RTS ; GRN1 JSR ERASEGRN ;ERASE GREEN MAN LDY YPOSP2 ;DRAW GREEN MAN... LDX #0 ;FACING LEFT WW1 LDA GRN2DAT,X STA PLAY2,Y INY INX CPX #13 BNE WW1 JSR SETGRN ;SET GREEN PARAMETERS RTS ; ERASEGRN LDY YPOSP2 ;ERASE GREEN MAN LDX #0 TXA XX1 STA PLAY2,Y INX INY CPX #15 BNE XX1 RTS ; SETGRN LDA #13 ;GREEN 13 LINES TALL STA LENGTH LDA #11 STA ADDNUM LDA #198 ;AND HE'S GREEN! STA PCOLR2 RTS ; ; ;ERASE MAN SUB ; ERASEMAN LDY PYPOS LDX #$00 LDA #$00 YY1 STA PLAY0,Y INY INX CPX #20 BNE YY1 RTS ; ;FIGURES FOR GEORGE !! ; GEORGE0 JSR ERASEGRG ;ERASE GEORGE LDY YPOSP3 ;DRAW GEORGE... LDX #0 ;IN POSISION 0 ZZ1 LDA GRG0DAT,X STA PLAY3,Y INY INX CPX #18 BNE ZZ1 JSR SETGRG ;SET GEORGE PARAMETERS RTS ; GEORGE1 JSR ERASEGRG ;ERASE GEORGE LDY YPOSP3 ;DRAW GEORGE... LDX #0 ;IN POSITION 1 AAA1 LDA GRG1DAT,X STA PLAY3,Y INY INX CPX #18 BNE AAA1 RTS ; GEORGE2 JSR ERASEGRG ;ERASE GEORGE LDY YPOSP3 ;DRAW GEORGE... LDX #0 ;IN POSITION 2 BBB1 LDA GRG2DAT,X STA PLAY3,Y INY INX CPX #18 BNE BBB1 RTS ; GEORGE3 JSR ERASEGRG ;ERASE GEORGE LDY YPOSP3 ;DRAW GEORGE... LDX #0 ;IN POSITION 3 CCC1 LDA GRG3DAT,X STA PLAY3,Y INY INX CPX #18 BNE CCC1 RTS ; SETGRG LDA #19 ;GEORGE 19 LINES TALL STA LENGTH3 LDA #16 STA ADDNUM3 LDA #86 ;GEORGE PURPLE! STA PCOLR3 RTS ; ERASEGRG LDY YPOSP3 ;ERASE GEORGE LDX #0 TXA DDD1 STA PLAY3,Y INY INX CPX #20 BNE DDD1 RTS ; ;----------------- ;CHANGE SQUARE SUB ;----------------- ; CHANGE LDA ROW ;GET ROW, STA LO ;SAVE IN... LDA #0 ;MULT AREA STA HI ASL LO ;*2 ASL LO ;*4 LDA LO ;SAVE *4 VALUE STA TIMES4 ASL LO ;*8 ASL LO ;*16 ROL HI LDA LO ;+*4 = *20 CLC ADC TIMES4 STA LO LDA HI ADC #0 STA HI LDA LO ;NOW ADD COLUMN CLC ADC COL STA LO LDA HI ADC #0 STA HI LDA LO ;NOW DISPLAY START CLC ADC # <DISP STA LO LDA HI ADC # >DISP STA HI LDY #1 LDA (FILE),Y ;GET RIGHT OF SQUARE STA (LO),Y ;PUT ON SCREEN DEY LDA (FILE),Y ;GET LEFT OF SQUARE STA (LO),Y ;PUT ON SCREEN RTS ;ALL DONE! ; ;------------- ;FALL OFF SUB ;------------- FALL LDA #$04 ;SET PRIOR STA PRIOR LDA #2 STA TIME JSR TURNOFF LDA #$AA STA AUDC1 EEE1 LDA PYPOS ;GET YPOS STA AUDF1 ;MAKE SO... CMP #240 ;OFF SCR... BEQ ENDLP ;YES... JSR DOWN0 ;NO... JSR DELAY ;DELAY... JMP EEE1 ;DO AGAIN ENDLP LDA #$6F STA AUDC1 CLC LDA #130 FFF1 STA AUDF1 ADC #1 JSR DELAY CMP #210 BNE FFF1 LDA #$00 STA AUDF1 STA AUDC1 LDA #3 ;3=FALL STA BACK RTS ;--------- ;DRAW ROCK ;--------- BAL1DRW LDY YPOSP1 ;DRAW ROCK 1 LDX #$00 GGG1 LDA BALDAT,X STA PLAY1,Y INY INX CPX #10 BNE GGG1 RTS ; BAL2DRW LDY YPOSP2 ;DRAW ROCK 2 LDX #0 HHH1 LDA BALDAT,X STA PLAY2,Y INX INY CPX #10 BNE HHH1 LDA #10 ;SET ROCK PARAMS STA LENGTH ;(INSTEAD OF... LDA #8 ;GREEN MAN) STA ADDNUM LDA #52 STA PCOLR2 RTS ; BAL3DRW LDY YPOSP3 ;DRAW ROCK 3 LDX #0 III1 LDA BALDAT,X STA PLAY3,Y INY INX CPX #10 BNE III1 LDA #10 ;SET ROCK PARAMS STA LENGTH3 ;(INSTEAD OF... LDA #8 ;GEORGE!) STA ADDNUM3 LDA #52 STA PCOLR3 RTS ; ;------------- ;MOVEMENT SUBS ;------------- ; DNLEFT0 JSR FIG1 ;SHAPE... LDA #1 STA MOVFLG JSR LEFT0 ;MOVE... JSR DOWN0 JSR DOWN0 DEC COUNT1 BNE JJJ1 JSR SETFLG0 ;RETURN JJJ1 RTS ; DNRIGHT0 JSR FIG2 ;SHAPE... LDA #1 STA MOVFLG JSR RIGHT0 ;MOVE... JSR DOWN0 JSR DOWN0 DEC COUNT1 ;DONE... BNE KKK1 JSR SETFLG0 ;RETURN KKK1 RTS ; UPLEFT0 JSR FIG3 ;SHAPE... LDA #1 STA MOVFLG JSR LEFT0 ;MOVE... JSR UP0 JSR UP0 DEC COUNT1 ;DONE??? BNE LLL1 JSR SETFLG0 ;SETFLG... LLL1 RTS ; UPRIGHT0 JSR FIG4 ;SHAPE... LDA #1 STA MOVFLG JSR RIGHT0 ;MOVE... JSR UP0 JSR UP0 DEC COUNT1 ;DONE??? BNE MMM1 JSR SETFLG0 MMM1 RTS ; LEFT0 DEC PXPOS ;MOVE MAN LEFT LDA PXPOS STA HPOSP0 RTS ; RIGHT0 INC PXPOS ;MOVE MAN RIGHT LDA PXPOS STA HPOSP0 RTS ; UP0 LDY PYPOS ;MOVE MAN UP LDX #$00 NNN1 LDA PLAY0,Y STA PLAY0-1,Y INX INY CPX #17 BNE NNN1 DEC PYPOS RTS ; DOWN0 LDX #0 ;MOVE MAN DOWN CLC LDA PYPOS ADC #14 TAY OOO1 LDA PLAY0,Y STA PLAY0+1,Y DEY INX CPX #17 BNE OOO1 INC PYPOS RTS ; ;ROCK 1 MOVEMENT ; DNLEFT1 JSR LEFT1 ;MOVE LEFT, JSR DOWN1 ;MOVE DOWN... JSR DOWN1 ;2 TIMES DEC COUNT2 BNE PPP1 LDX #0 JSR SETFLG ;SET UP SOUND PPP1 RTS ; DNRIGHT1 JSR RIGHT1 ;MOVE RIGHT, JSR DOWN1 ;MOVE DOWN... JSR DOWN1 ;2 TIMES DEC COUNT2 BNE QQQ1 LDX #0 JSR SETFLG ;SET UP SOUND QQQ1 RTS ; LEFT1 DEC XPOSP1 ;MOVE ROCK 1 LEFT LDA XPOSP1 STA HPOSP1 RTS ; RIGHT1 INC XPOSP1 ;MOVE ROCK 1 RIGHT LDA XPOSP1 STA HPOSP1 RTS ; ; DOWN1 LDX #0 ;MOVE PLAYER 1 DOWN CLC LDA YPOSP1 ADC #8 TAY RRR1 LDA PLAY1,Y STA PLAY1+1,Y DEY INX CPX #10 BNE RRR1 INC YPOSP1 RTS ; ; ;ROCK 2 MOVEMENT ; ;SAME AS ROCK 1, BUT FOR ROCK 2 ; DNLEFT2 JSR LEFT2 JSR DOWN2 JSR DOWN2 DEC COUNT3 BNE SSS1 LDX #1 JSR SETFLG SSS1 RTS ; DNRIGHT2 JSR RIGHT2 JSR DOWN2 JSR DOWN2 DEC COUNT3 BNE TTT1 LDX #1 JSR SETFLG TTT1 RTS ; LEFT2 DEC XPOSP2 LDA XPOSP2 STA HPOSP2 RTS ; RIGHT2 INC XPOSP2 LDA XPOSP2 STA HPOSP2 RTS ; DOWN2 LDX #0 CLC LDA YPOSP2 ADC ADDNUM TAY UUU1 LDA PLAY2,Y STA PLAY2+1,Y DEY INX CPX LENGTH BNE UUU1 INC YPOSP2 RTS ; ;ROCK 3 MOVEMENT ; ;SAME AS ROCK 1, BUT FOR ROCK 3 ; DNLEFT3 JSR LEFT3 JSR DOWN3 JSR DOWN3 DEC COUNT4 BNE VVV1 LDX #2 JSR SETFLG VVV1 RTS ; DNRIGHT3 JSR RIGHT3 JSR DOWN3 JSR DOWN3 DEC COUNT4 BNE WWW1 LDX #2 JSR SETFLG WWW1 RTS ; UPLEFT3 JSR LEFT3 JSR UP3 JSR UP3 DEC COUNT4 BNE XXX1 LDX #2 JSR SETFLG XXX1 RTS ; UPRIGHT3 JSR RIGHT3 JSR UP3 JSR UP3 DEC COUNT4 BNE YYY1 LDX #2 JSR SETFLG YYY1 RTS ; LEFT3 DEC XPOSP3 LDA XPOSP3 STA HPOSP3 RTS ; RIGHT3 INC XPOSP3 LDA XPOSP3 STA HPOSP3 RTS ; UP3 LDY YPOSP3 LDX #0 ZZZ1 LDA PLAY3,Y STA PLAY3-1,Y INY INX CPX LENGTH3 BNE ZZZ1 DEC YPOSP3 RTS ; DOWN3 LDX #0 CLC LDA YPOSP3 ADC ADDNUM3 TAY AAAA1 LDA PLAY3,Y STA PLAY3+1,Y DEY INX CPX LENGTH3 BNE AAAA1 INC YPOSP3 RTS ; SETFLG0 LDA #1 ;SET FLG STA SO1FLG STA MOVFLG LDA #$AF STA PITCH1 ;PITCH... LDA DIRECT STA DIRFLG RTS ; SETFLG LDA #1 STA SO2FLG,X LDA #$AF STA PITCH2,X ;PITCH... RTS ; PLAYFLD0 LDA # <PF0 ;POINT TO... STA FILE ;COLOR 0 SQUARE LDA # >PF0 DOSQUARE STA FILE+1 JSR ADD25 ;ADD 25 POINTS JSR PCUBPOS ;GET CUBE POS JSR CHANGE ;CHANGE COLOR RTS ; PLAYFLD1 LDA # <PF1 ;POINT TO... STA FILE ;COLOR 1 SQUARE LDA # >PF1 JMP DOSQUARE ;DO MISC STUFF ; PLAYFLD2 LDA # <PF2 ;POINT TO... STA FILE ;COLOR 2 SQUARE LDA # >PF2 JMP DOSQUARE ;DO MISC STUFF ; PLAYFLD3 LDA # <PF3 ;POINT TO... STA FILE ;COLOR 3 SQUARE LDA # >PF3 JMP DOSQUARE ;ETC. ; CLEAR LDA #$01 ;RESET COLLISIONS STA HITCLR RTS ; TURNOFF LDA #$00 ;NO AUDIO... STA AUDC2 ;ON CHANNELS... STA AUDF2 ;2, 3, 4! STA AUDC3 STA AUDF3 STA AUDC4 STA AUDF4 RTS ; PL.PL LDA P0PL ;DID MAN... CMP #1 ;HIT PLAYER 0? BCC BBBB1 ;NO! CMP #4 ;HIT PLAYER 2? BNE BBBB2 ;NO! LDA GRNFLG ;GREEN MAN ACTIVE? CMP #1 BNE BBBB2 ;NO! JSR HITGRN ;CLOBBER GREEN MAN! LDA #2 ;AWARD 200 POINTS! STA SUM JSR ADD200 JMP BBBB1 BBBB2 LDA P0PL ;DID MAN HIT... CMP #8 ;PLAYER 3? BNE BBBB8 ;NO! LDA GRGFLG ;GEORGE ACTIVE? CMP #1 BEQ BBBB1 ;YES! BBBB8 LDA WARN1 CMP #4 BEQ BBBB7 INC WARN1 RTS BBBB7 LDA #2 ;DEATH DUE TO... STA BACK ;GEORGE! RTS BBBB1 LDA #0 STA WARN1 LDA GRGFLG CMP #1 BNE RET LDA P3PL CMP #1 BNE BBBB5 LDA WARN CMP #4 BEQ BBBB6 INC WARN RTS BBBB6 LDA #2 STA BACK RTS BBBB5 LDA #0 STA WARN LDA P3PL CMP #2 BCC RET CMP #4 BNE RESET LDA GRNFLG CMP #1 BEQ RET RESET JSR ERASEGRG ;ERASE GEORGE LDA #0 ;CLEAR GEORGE... STA GRGFLG ;VARIABLES STA SO4FLG STA FNGRDRP STA GRGDRP STA OUTFLG STA GRGMOV LDA #10 STA SCOL STA SROW LDA #8 STA COUNT4 LDA #45 STA YPOSP3 LDA #132 STA XPOSP3 STA HPOSP3 RET RTS ; ; CHECK LDA NUMSQ ;GET SQUARES HIT CMP #28 ;ALL DONE? BNE CCCC1 ;NO! LDA #1 ;ROUND COMPLETED! STA BACK CCCC1 RTS ; ;--------------- ;SCORE ROUTINES ;--------------- ADD25 LDY #5 ;ADD 25 POINTS CLC ;TO SCORE LDA SCORE,Y ADC #5 CMP #$1A BNE DDDD1 LDA #$10 STA DISP,Y STA SCORE,Y DEY LDA SCORE,Y CLC ADC #1 STA SCORE,Y JMP DDDD2 DDDD1 LDA #$15 STA DISP,Y STA SCORE,Y DEY DDDD2 LDA SCORE,Y CLC ADC #2 CMP #$1A BEQ DDDD3 STA DISP,Y STA SCORE,Y RTS DDDD3 LDA #$10 STA DISP,Y STA SCORE,Y DEY LDA SCORE,Y CLC ADC #1 CMP #$1A BEQ DDDD3 STA DISP,Y STA SCORE,Y RTS ; ADD200 LDY #3 ;ADD SUM * 100... CLC ;TO SCORE LDA SCORE,Y ADC SUM CMP #$1A BCC EEEE1 EEEE2 SEC SBC #$1A STA ADD EEEE3 CLC LDA #$10 ADC ADD STA DISP,Y STA SCORE,Y LDA #0 STA ADD DEY CLC LDA SCORE,Y ADC #1 CMP #$1A BEQ EEEE3 EEEE1 STA DISP,Y STA SCORE,Y RTS ; ;CHARACTER IMAGES ;(MAN, GREEN MAN, GEORGE, ROCKS) ; FIG1DAT .BYTE 12,30,63,43,43,63 .BYTE 43,55,30,30,18,18,27 .BYTE 54,108,72 FIG2DAT .BYTE 48,120,252,212,212 .BYTE 252,212,236,120,120,72 .BYTE 72,216,108,54,18 FIG3DAT .BYTE 14,31,55,55,31,15 .BYTE 31,31,14,10,46,62,27 .BYTE 13,4 FIG4DAT .BYTE 112,248,236,236,248 .BYTE 240,248,248,112,80,116 .BYTE 124,216,176,32 GRN1DAT .BYTE 160,80,40,60,126,106 .BYTE 126,118,60,60,36,54 GRN2DAT .BYTE 5,10,20,60,126,86 .BYTE 126,110,60,60,36,108 GRG0DAT .BYTE 12,30,30,255,43 .BYTE 43,255,255,45,51,63 .BYTE 30,18,18,27,54,108,0 GRG1DAT .BYTE 48,120,120,255,212,212 .BYTE 255,255,180,204,252,120 .BYTE 72,72,216,108,54,0 GRG2DAT .BYTE 12,30,30,255,47 .BYTE 47,255,127,47,31,63 .BYTE 30,18,18,126,54,27,0 GRG3DAT .BYTE 48,120,120,255,244 .BYTE 244,255,254,244,248,252 .BYTE 120,72,72,126,108,216,0 BALDAT .BYTE 24,60,126,255,255 .BYTE 255,126,60,24,0 ; ;SQUARES !!! ; PF0 .BYTE $03,$04 PF1 .BYTE $43,$44 PF2 .BYTE $83,$84 PF3 .BYTE $C3,$C4 ; ;DISPLAY LIST ; DLIST .BYTE $70,$70,$70,$46 .WORD DISP .BYTE 6,6,$86,6,$86,$86,$86,6,6,6 .BYTE 6,6,6,6,6,6,6,6,6,6 .BYTE 6,6,6,$41 .WORD DLIST RDYMSG .SBYTE +$80,"READY %%" LVMSG .SBYTE "LeVeL" ENDMSG .SBYTE +$80,"GAME OVER" CHGMSG .SBYTE "CHANGE" LVLMSG .SBYTE +$80,"level:" RNDMSG .SBYTE +$80,"round:" BONMSG .SBYTE +$80,"BONUS" .SBYTE " 1000" TITLE .SBYTE " AVALANCHE " AUTHOR .SBYTE "BY TOMMY BENNETT" MAGMSG .SBYTE +$80,"ANALOG COMPUTING" ; ;MISC. DATA ; R1SET .BYTE 0,15,90,4,156 R2SET .BYTE 0,134,246,12,146 R3SET .BYTE 0,26,164,118,84 R4SET .BYTE 0,196,66,34,102 ; ;CHAR SET DATA ; NEWCHR .BYTE 3,15,63,127,63,15,3,0 .BYTE 192,240,252,254,252,240,192,0 .BYTE 0,6,12,24,48,0,96,0 .BYTE 12,30,63,43,63,30,18,54 .BYTE 8,12,126,127,126,12,8,0 .BYTE 16,48,126,254,126,48,16,0 ; ;JUMPING PADS ; PADATA .BYTE 3,4,3,4,3,4,3,4 .BYTE 3,4,3,4,3,4 ; ;MUSIC DATA ; NOTE .BYTE 60,47,0,47,60,72,60,0 .BYTE 72,64,72,64,72,64,0,81 .BYTE 72,81,72,81,72 DUR .BYTE 11,14,7,11,7,7,7,7 .BYTE 7,7,7,7,7,7,7,7 .BYTE 7,7,7,7,7