*+ABDSRCCNRDSLSSRCTOMT2T3} Ag dd@2 UU**àҠҠȠĠ}ΠԠ򺱵**HH**Šà̠ӠýҨҨäԬҨҨӤ̬̩**GG**}ŠĠԠŠĠȠҤӠŠԠҮ**(2;Ap,6-@(6-2#@p2""6}@$<)67<,.>:,6-%@) @PFUU216,104,104,133,204,104,133,203,104,133,209,104,133,208,104,133,215,1 }04,133,214PMM104,104,133,205,104,104,133,206,169,0,133,212,169,0,133,213,162,0,160,0ZOO177,214,224,0,208,2,132,216,209, }208,208,66,232,228,206,240,22,200,196,205dPP240,73,72,152,72,138,168,177,214,133,207,104,168,104,165,207,24,144,225,72nQ }Q165,204,133,213,165,203,133,212,104,169,155,32,164,246,160,0,152,72,177,208xKK32,164,246,104,168,200,177,208,201,0,208,2 }40,162,0,224,0,240,17,224,0NN240,6,160,0,177,214,162,0,164,216,200,196,205,208,163,165,208,24,101,205NN133,208,144,2, }230,209,165,203,208,6,165,204,240,11,198,204,198,203,160,0177,214,24,144,168,96,-1 D:STRING4.NEW133,208,144,2,n+,=,T,DATHEXLINDATLIDDBYTPASCHKSUTOTA@} *** LIVEWIRE *** 990,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15r;@,}9@",/-@"3"<68,-@ L6-A V#A` @`r( CHECKING DATA86-%@(LINE:}!"8B:,@AF%6-F:A,%F:A,$AV+C(LINE  MISSING!Fq-@@@}56-@:7<,,&@H[6-@:7%@<%@,,&@Hq6-8,$@%8,#."@*@ $". }@%(! 6-% "!"@%2 A< F:A,@AdJ( WRITING FILE 6-@,6-A }6#A@ @`J @%n(BAD DATA: LINE ee70F0704E00080E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E}0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E,1096ee0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E4E00100E0E0E0E0E0E0E0E0E0E0E0E0E0E}0E0E0E0E,1778ee0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E,2408ee0E0E0}E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E80004703214100207070707070,3748ee70704763217070461321704723213}046332170703046432141AF2048A5C68D0AD48D1DD0A5C58D00D4A9E98D00,8122ff02A9208D0102684048A90A8D0AD48D16D0A9748D17D0A9288D18D}0A93D8D00D46840000000000000000000006C,11720$ff766C000000212E212C2F2700232F2D303534292E27000000006C697665776972650000000000}A2B90000B4AFAD,14340.ff00A8B5A4B3AFAE0000000000EAEFF9F3F4E9E3EB000000000000000000F0E1E4E4ECE500000000000000000000,186718}ff0000000000000000000000D82065E4A900A27F9580CA10FBA90185A585A4A9438DCA20A9218DCB20A9008D2F02,22765Bff8D0ED48D08D28D1ED08D}C802A2039D582ECA10FAA2059D682ECA10FAA20295D895DBCA10F9A2079D0C2ECA10FA,28295LffA205BD03219D6821CA10F7A91DA2059D862ECA10FA2}08D25208A26A90685BEA90285D085C8202C26A90585B8A9,33151Vff0A85B9A9AF8D3002A9208D3102A0EBA228A907205CE4A9008D07D4208B2CA9748D}C402A9C48DC502A90A8DC602,38125`ffA9348DC702A93D8D2F02A9038D1DD0A9C08D0ED4A9118D6F02A90F8DC1028DC2028DC302A9168DC002AD1FD02}9,43000jff01D00AAD1FD02901F0F94C7B22AD1FD02902D0E8A5CE186901290185CEAABD912F8DCA20BD932F8DCB20A91E20,48088tff83264C4522 }A9008D3002A9208D3102A90085A4A901858485B220A12CA5C72907AABDB42D85CC203826209B26A5,52487~ffB1D0FCA5BDF00320AF25854DA5B6D0038!}D01D0A5A9D075A5CD85A9A205BD682E9D6E2EA9009D682ECA10F2A5DE,58556ffF00985DC205A25A90085DEA205A90015E5CA10FBA20415DFCA10FBC9"}00F04DA205B5E5D031AD0AD22907C905B0,63950ffF7A8B9DF00F02238E90199DF00989D742EAD0AD2290FC90FF0F79D802EA91E9D862EA9019D7A2E9#}5E5CA10C820,69526ff5B23202C25AD1FD0C907F0034C73214CA222A5C7C93FF01618690185C72907D004E6E4E6E4F8A5A518690185A5,74658ff$}D84C8922A5AA186901C906D005A9FF85AA6085AAA6AAB5E5F0EABD862EC9029039AD0AD2290FD032AD0C2ED004,80275ffA000F007AD0D2ED024A001B%}D862E4A992C2EBD802E991C2E0A0A0A0A99242EA9FF99142EA91585D1A901990C2E,84426ffA9008584207924A6AABD6E2EF01A205526A6AABC742EB9&}4E2E85DCB9532E85DD205A25A6AA4C2724BD862E38FD,89491ff7A2E9D862E3042C91ED004E6E1D03AC90AD00CBD742EC903D005A9FF9D7A2EBD742EC'}902D014AD0AD22901A8BD,94796ff802E18792731C90FB0039D802EBD742EAABD8C2E85842079244C5B23A90095E5A91585D2BD862E1042BD802EC5,9(}9572gg95D006A90185BDD035BD742EC901D02EA003B9582EF0058810F83022BD802E0A0A0A0A186908995C2EA9019958,103946gg2EAD0AD22901)}99602EAD0AD2293F99642E4C5B23A6AABD802E0A0A0A0A85B0BD862E4AB0151865B0A8B9A03185,108404gg8285B3B9A032858385B44CBB241865B0A8*}B9A0311879A1316A858285B3B9A0321879A1326A858385B4A91E38FD,113958gg862E4A29FE0A0AA8A200B9012F9D912EC8E8E008D0F4A6AABD742E0A+}0A0A85ABA90885AFA6ABBDB12EA83040B9,119274gg992E85ADB9A12E85AEBDD92EA8B9912E85ACA5821865AD8582A5831865AE8583A5ABF00320BC2C,}A5831865AE85,125065 gg83A5ABF00320BC2CC6AC10D9E6ABC6AFD0B860A203BD582EF023BC602EBD5C2E18792531C9F0B0089D5C2EDE64,130797-}gg2E100DAD0AD2293F9D642E29019D602ECA10D560A000F8A5DA1865DD85DA84DDA5D965DC85D984DCA5D865DB85,136620ggD884DBD8208D25A5D8C.}5D0D00C20A325F8A5D0186902D885D060A91085A6A200A000B9D800204026E8E8C8C003,142456(ggD0F360A5C8C905F005E6C8202C2660208A26A207A/}9001D0C2ECAD0FAC900D0F2A2039D582ECA10FAA9008584A9,1479302gg0585AA207924A6AAA91E9D862EA9019D7A2EAD0AD2290FC90FF0F79D802EC6A0}A10E1A90F8DC0028D01D2AD0AD2,153150<gg291F8D00D2A906208326CEC002ADC0028D01D2D0E8A5C8F014C6C8202C26A93C208326A90085BDA9168DC1}00260,158188Fgg68684C7321A99085A6A5C8A20720402660A05084A6A5A5A20E85A7290F05A69D0421A5A74A4A4A4A05A69D0321,162753Pgg60A42}B5A900A20E990005C8CAD0F9A5B318693D8D01D0A5B418691AA884B5A20DBD402E990005C8CA10F6A90185,168020ZggB66085A3A5A3D0FC60A90085D13}85D285D3A2079D00D2CA10FA60A90185A4208A26A92085C5A90085C6A2039D58,173892dgg2ECA10FAA2079D0C2ECA10FA208B2C8593A90685BEA5C74A4}4A4AAABDBC2D8DC402BDC42D8DC502BDCC2D8DC602,179317nggBDA92E85CDA5C72907AABDD42D85DFBDDC2D85E0BDE42D85E1BDEC2D85E2BDF42D85E35}A204B5DF1865E495DFCA,186238xgg10F6A5CC0A0A0A0A85C985CAAAA91085CBBD952F8582BDF52F8583BD55308585BDB5308586ADC402F00620BC2C,16}91816gg201F2DC6CBF007E6CAA6CA4C1927A6C986CAA90F85CBBD952F8582BDF52F8583BD962F85851865826A8590BDF6,197853gg2F8586186587}36A8591A90F38E5CB859220BE28ADC402F00620BC2C201F2DC6CBF007E6CAA6CA4C4B27A6C986CA,203350ggA90F85CB8593BD55308582BDB5308583B8}D563085851865826A8590BDB63085861865836A8591A90F38E5CB8592,208921gg20BE28ADC402F00620BC2C201F2DC6CBF007E6CAA6CA4C9527A90089}597AABDA0318D8F31BDAF318D9F31207728,214191ggA697A000B98F319DA031E8C8C010D0F4A697BDA0328D8F31BDAF328D9F31207728A697A000B98:}F319DA032E8C8,220159ggC010D0F4A697BDA0338D8F31BDAF338D9F31207728A697A000B98F319DA033E8C8C010D0F4A697BDA0348D8F31,226189;}ggBDAF348D9F31207728A697A000B98F319DA034E8C8C010D0F4A5971869108597C9F0F0034CD927A93D85C5A903,231953gg85C6A90085A460A910<}859A85994A859BA9008598A698BD8F31A699187D8F316AA69B9D8F31A59818659A859865,237537gg9AC911B00C8599A59B18659A859B4C8428A59A4A=}859A85994AF005859B4C802860A5920A0A0A0A186593AAA590,242533gg9DA031A5919DA032A593D014A5829DA033A5839DA034A5859DAF33A5869DAF>}3460A9CF8D0002A9208D0102D8A5,248149ggA9F002C6A9A5A3F002C6A3A5B6F002C6B6A5BDF0034C002BA5A4F0034C62E4ADFC02C91CD009A5B149FF?}85B14C,254446gg5229C921D028A5B2F024C6B2A205A9019D682ECA10FAA203BD582EF00EA5DEF818690485DED8A9009D582ECA10,259917ggEAA@}9008DFC02A5B1F011A9008D01D28D03D28D05D28D07D24C62E4A5D1F010C6D1A6D1BD3E318D02D2BD29318D,265790gg03D2A5D2F010C6D2A6D2BD683A}18D04D2BD53318D05D2A5D3F010C6D3A6D3BD86318D06D2BD7D318D07D2ADC202,272029gg1869108DC2028DC30229FC8DC702C6BFD017AD902ED004AB}902D002A9008D902EAD0AD2091F293F85BFE6BCA5BC,277192ggC903D00AA90085BCE6B7E6B8E6B9A59DF005C69D4C312AA904859DA5CEF006AD7C024C}C002AAD8402D02FA5BEF0,283089"gg2BA207BD0C2EF003CAD0F8C6BEA9019D0C2EA91585D1A9009D2C2EA5959D1C2E0A0A0A0A9D242EA9019D142EA5,D}287552,ggCEF00FAD70024A4A4A4AC90F3022A90ED01EA594F005C6944C002BA9028594AE7802A595187DFC2D3004C90FD0,2923226gg02A595C595E}F006A20986D385950A0A0A0AAAAD0CD0290CF007A90185BD4C852CBDA03118693D8D00D0A496BDA0,297276@gg321869208596A900A20F99F803C8CA10F}F9A90F85BAA90085BBA5B7290FAAA5BADD712F900BDD812FB006AABD41,302643Jgg2F85BBA5B8290FAAA5BADD712F900DDD812FB008AABD512F05BB85G}BBA5B9290FAAA5BADD712F900DDD812FB008,308100TggAABD612F05BB85BBA5961865BA38E908A8A5BB990004C6BA10A1A5A2F005C6A24C0F2BE6A1A9H}0185A2E6A0A5A0,313913^gg2901A8B9362E859EBE342E869CA903859FBD0C2ED0034CE32BA69FB4D4B9FF023D3C2E99FF02B900033D3C2E99,318789I}hgg0003B901033D3C2E990103A69CA5A12901D00ABD2C2E187D142E9D2C2EBD142E3043A005B9682ED039B9E500F0,322743rgg34B9742EC904D005AJ}D902EF028B9802EDD1C2ED020B9862E4A38FD2C2EF004C9FE9012B9742EF008A90199682E,327864|gg4CF02BA9FF9D142E8810BFBD2C2EF046C910F04K}2187D242EAABDA031BCA032186940A69F9D04D098186920A894,333038ggD4B9FF021D382E99FF02B900031D382E990003B901031D382E990103C69FCL}69CA69CE49EF0264C242BA9009D0C,337375gg2EE0029002E6BEBD2C2ED010BD142E100BBD1C2EC595D004A90185BD4CE32BE6C2A5C24A2901A8B9233M}185C4A5,342487ggC22901A8A90785C1A90085C0A90185C3B91531859CA900A6C3BC1731A20991C0C8CA10FAA69CBD582EF02EBD5C,348107gg2EN}AABDA033BCA03418693EA6C39D02D09818691C9D1731A8A6C4A90485CFBD193191C0C891C0C8CAC6CF10F2C6,354023ggC33007C6C1E69C4C362C8D1EO}D04C62E4A900AA9D00039D00049D00059D00069D0007CAD0EE60A9088581A90085,358639gg80A214A00098918088D0FBCAD00160E6814CAB2CA5830AP}8580A9002A8581068026810680268106802681068026,363401gg81A9001865808580A90865818581A5822903AAA5824A4A85A8A8B1803D172DDD1B2DQ}F015A484BD172D390F2D85,368094gg8FBD132DA4A83180058F9180600055AAFF3FCFF3FCC0300C0340100401A586C583900B38E583858AA901858CD0R},373251gg0BA58338E586858AA9FF858CA585C582900B38E5828589A901858BD00BA58238E5858589A9FF858BA900858885,379321gg87A589C58S}A900A858D858E4A85884C762DA58A858D858E4A8587A58DF039A58818658A8588C58E900EA58838E5,385091gg8E8588A58318658C8583A5871865898T}587C58E900EA58738E58E8587A58218658B858220BC2CC68DD0C7600001,390578gg020304010503C43674F654060026860C365626C698189846A8368U}418C638000000000406080A0000000608090A,392949gg0B080A0C0E1012141606080A0B0C0E0F10000004080A0C0E10000000000001010100FFFFFF0V}000000000000000,394004gg0000000000000000000000000000000000000000000000000000000000000000000000000307FF03030C30C0FC,394779W}ggF3CF3F282828925428101028549228282802020001015000500050000000000000000000000000000000000000,396350gg0000000000000000X}00000000000000000000000000000000000000000000000000000203020302000000000000,396362&gg0000000001FF01FF01FFFF010000FF0101FF12Y}0F0E0C0B0A0907040301020005FF000405000600FF0000000506,3985450gg040701FF00060003010207FF0004060507050604FF030707070707000003Z}070707070000000303030303070000,399469:gg0203030303030000010101030101030000000000000101010000000101020202000001010102020200[}01010202,399523Dgg020203000101020202030301020202020203030102020203030304010202030303040410101010101010100808,399747Ngg0\}80808080808000000008040201008040201000000000000010102020408102040408080000000010203040506,400521Xgg07080706050403020111100]}F0E0D0C0B0A090A0B0C0D0E0F10435321210E0E0E0E0E0E0E0E1A2733404B586471,401656bgg0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E141A20262B3^}13B454E54595F656B71715840270E0E0E1B1B0E0E0E27,403378lgg4058710E0E0E0E0E1D2B3A4654627171717171716A64717164524130200E0E0E0E0_}E0E1222344658697B8D8D8D,406529vgg8D8D8D8D8D8D1219222A323A434B535B646C747D858D12273B5065798D8D8D8D7965503B27121212121212233`}5,410219gg47596A7C8D8D8D8D8D1231506F8D847B72727B848D6F5031128D6E503D261212121212122B445C758D37373737,414069gg37373737a}3A3C3E40424446493737373737373737373737373737373737393A3B3B3C3D3F414344454546474949,416787gg44403C37373739393737373C404449b}37373737373A3D3F414346494949494949484649494643403D3A37373737,419613gg373743474A4D5154575A5A5A5A5A5A5A5A5A3C3E414447494C4Ec}515356595C5E616343494D5054585A5A5A5A58,423265gg54504D49434343434343474A4D5053565A5A5A5A5A434A50565A5957565657595A56504A43d}5A55504B47434343,426822gg434343494E52565A0002000088502050882020F82020040902FE01FF00A1A1A2A2A3A3A4A4A5A5A6A6A7A7A8A8,43143e}1ggA9A9AAAA00C2A6B498A68A987C8A6E7C606E52604452364428004141424243434444454546464747484849494A,435765gg4A0050287850A07f}8C8A0F0C818F0401868409068CC9000A1A1A2A2A3A3A4A400141E141E141E141E0000000000,439855D2:LIVEWIRE.BASgg4A0050287850A07j0100 ; SNAIL 1.00110 ; ATARI DISK DRIVE TACHOMETER0120 ; (C)1983 ANALOG COMPUTING0130 ;0140 ; SYNTAX: X=USR(ML,B1,B2)015h}0 ; ML=addr of this routine0160 ; B1=addr of dummy disk buffer0170 ; B2=addr of 32-byte work buffer0180 ;0190 ; Program ei}quates0200 ;0210 BASIC = $D4 ; BASIC return addr0220 POINTER = $CB ; pointer to workbuffer0230 TEMP = $CD ; tej}mporary variable0240 SYSTIM = $14 ; system jiffy timer0250 CONSOLE = $D01F ; console key status0260 DISKIO = $E453 ; dk}isk handler entry0270 DBUF = $0304 ; disk buffer addr0280 ;0290 PLA ; # arguments0300 PLA ; msl}b of disk buffer addr0310 STA DBUF+10320 PLA ; lsb0330 STA DBUF0340 PLA ; msb of work bufm}fer addr0350 STA POINTER+10360 PLA ; lsb0370 STA POINTER0380 CLD ; clear decimal mode039n}0 LDA #$000400 STA BASIC0410 STA BASIC+1 ; clear BASIC return0420 JSR DISKIO ; bring drive up to speed!0o}430 ;0440 ; Read sector #1 32 times0450 ;0460 LDA #$1F0470 STA TEMP ; initialize index0480 AGAIN0490 LDAp} #$000500 STA SYSTIM ; reset timer0510 JSR DISKIO ; read sector0520 LDA SYSTIM ; obtain access time0530 q} LDY TEMP ; and index0540 STA (POINTER),Y ; save in buffer0550 DEY 0560 BMI SUM ; exit if buffer fullr}0570 STY TEMP ; otherwise update index0580 LDA CONSOLE0590 CMP #$06 ; START key pressed?0600 BNE AGAs}IN ; no; get another sector0610 RTS ; otherwise exit0620 ;0630 ; Add up the timer readings0640 ;0650 ; BASt}IC return addr serves double duty0660 ; as a temporary sum buffer0670 ;0680 SUM0690 LDY #$1F ; initialize index07u}00 NEXTADD0710 CLC 0720 LDA (POINTER),Y0730 ADC BASIC0740 STA BASIC0750 BCC OKAY0760 INC BASIC+v}10770 OKAY0780 DEY 0790 BPL NEXTADD ; keep adding0800 RTS ; give sum to BASICKAY0760 INC BASIC+f12 MLDUMMYWORKHNEHOLTESTPMPAGPMBASDRIV x} d,+"A @, AnV6-?:C:,&6-P:A6'+'@2,,&Aq2 @>6-@! z}@56-@586-@%6-$@%@R+ 86-6@=AA+ @)!@=A {}@pJ -B2H-B2I%@1 76-C-@J(w"-&@6@.- |}@<(>:@,@ ^-%@@5@j-@s( w  A* INITIALIZATIONi1;@r }},;@,;A(,;@2,]6-P:+F:AE,%@,'@,$@iBByoAY@F'B2w ~}@56-$AVI-@@rM"Y67,.>:,] oA;-%Ap%At"%) ; }B2H@$;-%A%A"%) ;B2I@2u-@@"'67,.>:,+ =AR }@O-@@u(!̠=-@@=(# };-@@;(!275 280 285 290 295 300 305s Ap-@@K:?-@@\ }(Which drive (1-4)? i)@s B:@6-&@H: @)!@Ap"uAi! }Ap@3ArEAsAUWAx@iAyu6-@$,W6-?:C:,,$F:Aq },@6-@@M(W Ap6i-@@-( Testing Drive # ?-@@ }_(Press START to change drivei A@* M/L ROUTINEJ]]104,104,141,5,3,104,141,4,3,104,133,204,104,133,203,216,16 }9,0,133,212,133,213,32,83,228T__169,31,133,205,169,0,133,20,32,83,228,165,20,164,205,145,203,136,48,10,132,205,173,31,208 }^TT201,6,208,231,96,160,31,24,177,203,101,212,133,212,144,2,230,213,136,16,242,96h * SHELLr12,30,63,127,255| * } HEAD160,64,64,64,192,192,192* TEST ROUTINE104,76,83,228 D2:SNAIL.BASLr12,30,63,127,255| * _-.uOUPIDIVOPLPLPLDLDLDLVLVLVLTIM} ?#@@K:5AR@? B} @ B M@(8}Do you want listings to the screen (1)or printer (2)?M)@A"@P/@}@P:AAR@A"@I/@@E:AAR@H( }What pit}ch/(What distortion3D( What volumeH2C"(}Do you want any loops?/)@C@AF?}(}Want a pitch loop?+)@?@A Z0( ( (Pitch loop - from$,(to0nS (step}" (F(!0 CANNOT BE USED AS A STEP VALUE!I(S AxD#(}Want a distortion loop?0)@D@}Ap5( (%(Distortion loop - from)1(to5S (step" (F(!0 CANNOT BE USED AS A STEP V}ALUE!I(S A`@(}Want a volume loop?,)@@@A01( (!(Volume loop - from%-(t}o1S (step" (F(!0 CANNOT BE USED AS A STEP VALUE!I(S A*(*(A0*(*(}A*(*(A0**(A**(A**(A " A0,a2'-}@A+ .(1(W(!This was for sound with no loops.a A1"@A6G@(:(#Do you }want to see the values used?G)@7@Ap8V(@$(@Pitch=?(@ Distortion=}V(@Volume=@ A ApJE (}-#2' 1 AE"@A0h A} Ap|E (}-#2' 1 AE"@A A ApE (}-}#2' 1 AE"@A0 Af%2@(}Want another sou}nd?M)@Y"@\f @ @,($}The pitch loop is the inner loop.6-@-92}  % A9"@A A&E1()}The distortion loop is the inner loop.;-E-}092  % A9"@A@N A Apb@,($}The pitch loop is the inner loop.}6-@-l92  % A9"@A AA-(%}The volume loop is the in}ner loop.7-A-92  % A9"@A` A ApE1()}The d}istortion loop is the inner loop.;-E-92  % A9"@A  A}A-(%}The volume loop is the inner loop.7-A- 92  % A9"@Ap* } A Ap>OO(G}The pitch loop is the innermost loop, the volume loop the outermost.H! --!-}R=2   ) A="@A0p AzTT(L}The volume loop is the innermost lo}op, the distortion loop the outermost.! --!-=2   ) A="@}A ATT(L}The distortion loop is the innermost loop, the pitch loop the outermost.! --}!-=2   ) A="@A P AUU(M}The distortion loop is the i}nnermost loop, the volume loop the outermost.! --!-=2   ) A="}@A$ A.NN(F}The volume loop is the innermost loop,the pitch loop the outermost.8! --}!-B=2   ) A="@Ap` AjSS(K}The pitch loop is the inne}rmost loop, the distortion loop the outermost.t! --!-~=2   ) A="}@A0 A Ap_%2((+(O(Do you want to hear that again?\)@}_$P(.(#Do you want to see the values used?;)@>(A(M@P$;1(@Pitch= to } step ; AP(@Pitch=@6(@ Distortion= to  step @ Ap(@} Distortion=<2(@Volume= to  step < A(@Volume= C-@@ 3}(Ӡ٠٠Ϡ@)@C$'. (}-@.(Ġ'nn(eThis program allows you t}o set up complicated sounds using loops in the pitch, distortion, 'gg(^and/or volume of a sound. Each loop will} be set up in every possible combination so that you'dd([ can pick the sound you like best for your application. After a}ll var- iations have been 'bb(Yplayed, you will be given a listing of how the sounds were achieved, to your printer }$'dd(\if you so specify. You can then use the sounds you have built in your own programs.)'D-@@"4(}Ӡ٠٠ϠA)@D$*Q:(ERROR #F:A,--PRESS ANY KEY TO TRY AGAING)@Q @ }D2:SOUNDEFF.BASA)@D$*Q:(ERROR #F:A,--PRESS ANY KEY TO TRY AGAING)@Q @ 0100 ; ***************************************0110 ; * STRING SEARCH ROUTINE *0120 ; * } *0130 ; * BASIC CALL C=USR(ADR(B$),CNT, *0140 ; * ADR(SS$),ADR(DT$),RL,DTL) *0150 ; * } CNT =NUMBER OF RECORDS *0160 ; * ADR(SS$) =SEARCH STRING ADDRESS *0170 ; * ADR(DT$) =DESIRED TERM ADDR}ESS *0180 ; * RL =RECORD LENGTH *0190 ; * DTL =DESIRED TERM LENGTH *0200 ; * } *0210 ; ***************************************0220 ;0230 *= $0650 ; REFERENCE ADDRESS. } THE PROGRAM0240 ; IS RELOCATABLE AND IS PLACED IN0250 ; A STRING (B$) IN THE DEMO.0260 CN}TLO = $CB ;0270 CNTHI = $CC ;0280 RLLO = $CD ;0290 DTLLO = $CE ; PAGE 0 LOCATIONS0300 TEMP = $CF ; }FOR ADDRESS STORAGE.0310 SSLO = $D0 ;0320 SSHI = $D1 ;0330 DTLO = $D6 ;0340 DTHI = $D7 ;0350 YSAVE =} $D8 ;0360 FNDLO = $D4 ; STORAGE ADDRESS FOR0370 FNDHI = $D5 ; LOCATED RECORD.0380 ;0390 CLD ; CL}EAR DECIMAL MODE0400 PLA ; NUMBER OF VARIABLES NOT USED.0410 PLA ;0420 STA CNTHI ;0430 }PLA ;0440 STA CNTLO ;0450 PLA ;0460 STA SSHI ;0470 PLA ;0480 STA SSLO } ; START PULLING VARIABLE ADDRESSES0490 PLA ; FROM THE STACK BY HI AND LO BYTE0500 STA DTHI ; AND SAVE }THEN IN PAGE 0 FOR LATER0510 PLA ; REFERENCE. NOTICE THAT THE0520 STA DTLO ; ADDRESSES ARE REMOVED IN TH}E ORDER0530 PLA ; THAT THEY ARE TYPED BUT IN THE0540 PLA ; ORDER HI BYTE THEN LO. UNUSED HI0550 } STA RLLO ; BYTES ARE REMOVED BUT NOT SAVED.0560 PLA ;0570 PLA ;0580 STA DTLLO ;0590 } LDA #0 ;0600 STA FNDLO ; CLEAR THE RETURN ADDRESS.0610 LDA #0 ;0620 STA FNDHI ;0630 ;0640 ; }START THE SEARCH0650 ;0660 LDX #0 ; GET THE REGISTERS READY.0670 BEGIN LDY #0 ;0680 LDA (DTLO),Y ; FIRST }BYTE OF THE DESIRED TERM.0690 SUBR1 CPX #0 ; 1ST CHAR OF DESIRED TERM?0700 BNE NOSAVE ; NO, CONTINUE COMPARISON071}0 STY YSAVE ; SAVE INDEX TO SEARCH STRING0720 NOSAVE CMP (SSLO),Y ; COMPARE IT TO THE SEARCH STRING.0730 BNE SUBR}2 ; <> SO INCREASE THE SEARCH STRING.0740 INX ; INCREMENT X, COMPARE IT WITH END0750 CPX DTLLO ; OF THE} DESIRED TERM.0760 BEQ FOUND ; YES, HAVE MATCH AND MUST SAVE IT.0770 INY ; A MATCH SO INCREMENT BOTH.078}0 CPY RLLO ; END OF RECORD HAS BEEN REACHED?0790 BEQ SUBR3 ; YES, THEN GO GET ANOTHER RECORD.0800 PHA } ; IF NOT, USE STACK TO SAVE DATA0810 TYA ; TO REUSE AFTER THESE GYRATIONS0820 PHA ; THAT INCREM}ENT THE DESIRED TERM0830 TXA ; FOR ANOTHER COMPARISON.0840 TAY ;0850 LDA (DTLO),Y ; FINALLY!0}860 STA TEMP ; SAVE THE NEW ADDRESS WHILE WE0870 PLA ; REESTABLISH THE VARIABLES.0880 TAY ;}0890 PLA ; DISCARD OLD VALUE, FREE UP STACK.0900 LDA TEMP ; SET UP FOR ANOTHER COMPARISON.0910 CLC } ; USE TRICK TO FORCE A BRANCH AND0920 BCC SUBR1 ; STILL KEEP PROGRAM RELOCATABLE.0930 ;0940 ; RECORD FOUND09}50 ;0960 FOUND PHA ; STORE THE ACCUMULATOR ON STACK.0970 LDA CNTHI ;0980 STA FNDHI ; LOAD THE FOUND RECO}RD ADDRESS.0990 LDA CNTLO ;1000 STA FNDLO ;1010 PLA ; CLEAN OFF THE STACK.1020 LDX #0 ; }SET UP X REGISTER FOR NEXT TIME.1030 CPX #0 ;1040 BEQ SUBR3 ; ONCE AGAIN WE FORCE A BRANCH.1050 ;1060 SUBR}2 CPX #0 ; SEE IF AT START OF DESIRED TERM.1070 BEQ AGAIN ;1080 LDY #0 ;1090 LDA (DTLO),Y ;1100 } LDX #0 ; RESET D.T. INDEX1110 AGAIN LDY YSAVE ; GET POINTER BACK,1120 INY ; INCREMENT THE Y REGISTER AND11}30 CPY RLLO ; LOOKS FOR THE END OF THE RECORD.1140 BNE SUBR1 ; WE'RE NOT AT THE END SO....1150 SUBR3 LDA SSLO } ; THIS SECTION GETS NEXT RECORD.1160 CLC ; WE DON'T WANT ANY EXTRA NUMBERS.1170 ADC RLLO ; ADD RECORD L}ENGTH1180 STA SSLO ; AND STORE IT FOR REFERENCE.1190 BCC SUBR4 ; CARRY CLEAR, SO DON'T INCREASE HI1200 IN}C SSHI ; IF WE'RE HERE WE INCREMENT SSHI.1210 ;1220 SUBR4 LDA CNTLO ; LET'S CHECK IF WE HAVE LOOKED1230 BNE SUBR5 } ; THROUGH ALL THE RECORDS (CNT=0).1240 LDA CNTHI ; CHECK THE HI BYTE TO BE SURE.1250 BEQ HOME ; IF IT'S 0 TOO} THEN WE'RE ALL DONE.1260 DEC CNTHI ; IF THERE ARE ANY LEFT THEN1270 ;1280 SUBR5 DEC CNTLO ; DECREASE THE COUNT LOCA}TIONS.1290 CLC ; ONCE AGAIN WE CAUSE A BRANCH AND1300 BCC BEGIN ; KEEP THE ROUTINE RELOCATABLE.1310 HOME} RTS ; IF WE'RE HERE, SEARCH COMPLETED.1320 .END ; THAT'S ALL FOLKSEEP THE ROUTINE RELOCATABLE.1310 HOMEW$% ABDSRCCNRDSLSSRCDELA } NN** ǠƠ̠ǠȢ򺱵}** T<;B,;A,;A,;@,;@P,H6-@T6-@PF +@-@@<(}@InItIaLiZiNg...F A`7 6.67B,.)67@,.76-P:B:,',(=*("}WHAT TERM WOULD YOU LIKE T}O ENTER.76-B:,=6.-< B:,!( TOO LONG!.-@A2 < @@2E6-P:H:,$,*6-P:$%@},:6-%&@E67<,.< APFv(}RECORD COUNT=(5(>:@4,>:@4,M(HAS BEEN ENTERED ASa(}A$(,)sAR@v(KB,(#IF YOU WOULD LIKE TO SEE A$ PRESS 080YB @PR(A$ WILL NOW BE }PRINTED2-@A6 :(N-@AR ZP!(}>:@4,>:@4,9(HAS BEEN ENTERED ASM(A$(},)P(dnC(;NOW ENTER ANY PART OF THE TERM AND THE SEARCH WILL BEGINUARYb6-B:,n6-}n6-?:C:,<:@}4,>:@4, LOCATED IN RECORD &=(-6-+&,$%@*(7<%&@,-(<'(HIT Π TO INSERT A}NOTHER+26.< @@4( }RECORD NOT FOUND( (* B4 A@6-@6-""6@}$= AH:,$AP=A H:,$AP)67<,.>:,6-%@) ApUU216,104,104,}133,204,104,133,203,104,133,209,104,133,208,104,133,215,104,133,214MM104,104,133,205,104,104,133,206,169,0,133,212,169,0,}133,213,162,0,160,0OO177,214,224,0,208,2,132,216,209,208,208,43,232,228,206,240,22,200,196,205PP240,50,72,152,72,138,}168,177,214,133,207,104,168,104,165,207,24,144,219,72LL165,204,133,213,165,203,133,212,104,162,0,224,0,240,17,224,0,240,6},160PP0,177,214,162,0,164,216,200,196,205,208,186,165,208,24,101,205,133,208,144$LL2,230,209,165,203,208,6,165,204,240},7,198,204,198,203,24,144,156,96,-1 D:STRING2.NEW,208,24,101,205,133,208,144$LL2,230,209,165,203,208,6,165,204,24090100 ;**************************************************0110 ;* *0120 ;* TH}IS IS A SCREEN PRINT ROUTINE THAT IS *0130 ;* TO BE INSERTED IN LISTING 1 BETWEEN LINE 1010 *0140 ;* AND LINE 1020}. *0150 ;* *0160 ;* YOU MUST ALSO ADD THE FO}LLOWING *0170 ;* LINES: *0180 ;* 375 PRINT=$F6A4 } *0190 ;* 1284 LDY #0 *0200 ;* 1286 LDA (DTLO),Y }*0210 ;* YOU WILL NEED TO CHANGE LINE *0220 ;* 920 AND 1300 TO READ : *0230 ;* } 920 SHORT BCC NOSAVE *0240 ;* 1300 BCC SHORT *0250 ;* } *0260 ;**************************************************0270 ;0280 ;0290 PRNT LDA #$9}B ; A CARRIAGE RETURN TO PUT A BLANK0300 JSR PRINT ; LINE BETWEEN RECORDS.0310 ;0320 LDY #$00 ; THIS IS REQ}UIRED TO KEEP THE0330 START TYA ; Y REGISTER INFO INTACT WHEN0340 PHA ; GOING TO PRINT BECAUSE0350 }LDA (SSLO),Y ; THE PRINT USES BOTH REGISTERS.0360 ;0370 JSR PRINT ; GO LET THE ATARI DO ITS THING!!!0380 ;0390 }PLA ; PUT THE Y REG INFO BACK IN USE0400 TAY ; AND GET ANOTHER LETTER TO PRINT.0410 INY ;0}420 LDA (SSLO),Y ;0430 CMP #$00 ; SEE IF IT IS A CHR$(0)0440 BNE START ; IF NOT GO PRINT ANOTHER CHARACTER}0450 ; OR IF IT IS A CHR$(0) WE GO ON0460 ; WITH THE MAIN PROGRAM. RINT ANOTHER CHARACTERg;===========================; LIVEWIRE;===========================;===========================; WRITTEN BY: }TOM HUDSON;A.N.A.L.O.G. COMPUTING #12;===========================;---------------;PAGE ZERO USAGE;--------------- }ORG$80LODS1HIDS1PLOTXDS1;PLOT X VALUEPLOTYDS1;PLOT Y VALUECOLORDS1;PLOT COLORDRAWXDS1;DRAWTO XDRAW!}YDS1;DRAWTO YACCXDS1;X ACCUM.ACCYDS1;Y ACCUM.DELTAXDS1;DRAW WORK AREADELTAYDS1;DRAW WORK AREAINCXDS1;D!}RAW X INCREMENTINCYDS1;DRAW Y INCREMENTCOUNTRDS1;DRAWTO COUNTERENDPTDS1;DRAW ENDPOINTHOLDDS1;WORK AREAXWORK!}DS1YWORKDS1GRIDDS1;GRID # WORKOFFSETDS1;GRID OFFSETPMTIMEDS1;PLAYER MOVE TIMERPLRGRDDS1;PLAYER GRID#PLRY!}DS1;PLAYER Y POS.GRIDNODS1;GRID #LASTDS1;GRID...NEXTDS1;DIVIDE...STEPDS1;WORK...DESTDS1;AREASVBXHLDD!}S1;X HOLDPFTIMEDS1;PLAYER FIRE TIMERENDVALDS1;WORK AREAMISNUMDS1;MISSILE #PRFLIPDS1;PROJ. FLIP FLAGPRADVT!}DS1;PROJ. MOVE TIMERPRADV1DS1;PROJ. TIMERTIMERDS1;GENERAL TIMERINTRFGDS1;INTRO FLAGBCDLVLDS1;LEVEL #SHCOLR!}DS1;CHAR. COLORSHOBYTDS1;CHAR. BYTE POS.YOFSETDS1;PLOT Y OFFSETOBTIM1DS1;OBJECT MOVE TIMEROBJNUMDS1;OBJECT!} #SHAPIXDS1;OBJ. SHAPE INDEXLENGTHDS1;OBJ. LENGTHXIDS1;OBJ. X INCREMENTYIDS1;OBJ. Y INCREMENTSHAPCTDS1;OB!}J. SHAPE CNT.HLDGRDDS1;OBJ. GRID WORKPAUFLGDS1;PAUSE FLAGZAPDS1;ZAP FLAGSAVEXDS1;WORK AREASAVEYDS1;WORK A! }REAFLASHYDS1;OBJ. FLASH POS.FLTIMEDS1;FLASH TIMESP1IXDS1;PLAYER...SP2IXDS1;SHAPE...SP3IXDS1;INDEX...SPIX! }DS1;AREASPLTBYTDS1;PLYR. IMAGE BYTEPSCNTDS1;PLYR. SHAPE COUNTKILPLRDS1;KILL PLYR FLAGPAVAILDS1;# PROJ. AVA! }ILABLETRANTMDS1;TRANSIENT TIMERDESTLODS1;DESTINATION...DESTHIDS1;ADDRESSSHFLIPDS1;SHORT FLIP FLAGDESTNMDS1! };SHORT PLYR #CPYSTDS1;SHORT IMAGE STARTDMAC1DS1;DMA CTRL WORKGRAC1DS1;GRAPHICS CTRL WK.GRIDIXDS1;GRID INDEX! }LIVESDS1;LIVES LEFTGRDADJDS1;GRID...GRDWKDS1;DRAW...GRDWK2DS1;WORK...GRDNUMDS1;AREASOBJSPDDS1;OBJ. SPE!}EDJOYPADDS1;STICK/PADDLECPYCNTDS1;SHORT COPY CNT.BONUSDS1;BONUS VALUEFIRSOUDS1;FIRE SOUND COUNTOBDSOUDS1;!}OBJ. DEATH SOUNDMOVSOUDS1;PLYR MOVE SOUNDPRYHLDDS4;PROJ. Y HOLDSSCOREDS3;SCORESCOADDDS3;SCORE ADD VALUEMISCA!}DDS1;MISC. SCORE ADDNUMOBJDS5;OBJECTS LEFTDIFFDS1;DIFFICULTY ADJUSTOBJPRSDS6;OBJ PRESENT FLAGS;------------!}--------;MISCELLANEOUS MEMORY;--------------------PMAREA=$0000;P/M AREAMISSLS=PMAREA+768PL0=PMAREA+1024PL1=!}PMAREA+1280PL2=PMAREA+1536PL3=PMAREA+1792DISP=$0800;DISPLAY;--------------;SYSTEM EQUATES;--------------VD!}SLST=$200;DLI VECTORWSYNC=$D40A;WAIT/SYNCPTRIG0=$27C;PADDLE TRIG.POT0=$270;PADDLE 0KEY=$2FC;KEYBOARDCONSO!}L=$D01F;CONSOLE BUTTONSPMBASE=$D407;P/M BASE ADDRRANDOM=$D20A;RANDOM #SETVBV=$E45C;VBLANK SETXITVBV=$E462;!}VBLANK EXITCOLBK=$2C8;COLORSCOLPF0=$2C4COLPF1=$2C5COLPF2=$2C6COLPF3=$2C7AUDC1=$D201;AUDIO CONTROLAUDC2=!}$D203AUDC3=$D205AUDC4=$D207AUDF1=$D200;AUDIO FREQUENCYAUDF2=$D202AUDF3=$D204AUDF4=$D206AUDCTL=$D208;M!}AIN AUDIO CTRL.PRIOR=$026F;PRIORITYATTRAC=$4D;ATTRACT MODEDMACTL=$22F;DMA CONTROLDLISTL=$230;DISP. LISTGRACT!}L=$D01D;GRAPHICS CTRL.NMIEN=$D40E;INTERRUPT ENABLECOLPM0=$2C0;PLAYER COLORSCOLPM1=$2C1COLPM2=$2C2COLPM3=$!}2C3HPOSP0=$D000;PLAYER POSITIONSHPOSP1=$D001HPOSP2=$D002HPOSP3=$D003HPOSM0=$D004;MISSILE POSITIONSHITCLR=!}$D01E;COLLISION CLEARP0PL=$D00C;PL0 TO PLAYER COLL.STICK=$278;JOYSTICKSTRIG=$284;STICK TRIGGERORG$2000;--!}--------------------;MAIN GAME DISPLAY LIST;----------------------DLISTDB$70,$F0,$70,$4EDWDISPDB$E,$E,$E,$E,$E,!}$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB!}$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$EDB$4EDWDISP+$800DB$E,$E,$E,$E,$E,$E,$E,$!}EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$!}E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$E! },$EDB$E,$E,$E,$E,$E,$E,$E,$EDB$E,$E,$E,$E,$E,$E,$EDB$80,$00DB$47DWINFOLNDB$41DWDLIST;----------------!!}---------;TITLE SCREEN DISPLAY LIST;-------------------------TITLDLDB$70,$70,$70,$70,$70,$70DB$70,$47DWLASTSC!"}DB$70,$70,$46DWMAGMSGDB$70,$47DWTITLEDB$30,$46DWAUTHORDB$70,$70,$30,$46CONTRLDWJOYMSGDB$41DWTITLD!#}L;-----------------------;DISPLAY LIST INTERRUPTS;-----------------------DLI1PHA;SAVE ACCUMLDAGRAC1;GET GR. C!$}TRLSTAWSYNC;WAIT FOR SYNCSTAGRACTL;STORE ITLDADMAC1;GET AND SAVESTA$D400;DMA CTRLLDA#DLI2&255;POINT...S!%}TAVDSLST;TO...LDA#DLI2/256;NEXT...STAVDSLST+1;DLI!PLA;GET ACCUMRTI;AND EXIT!DLI2PHA;SAVE ACCUMLDA#$!&}0A;GET WHITESTAWSYNC;WAIT FOR SYNCSTA$D016;PUT IN COLOR 0LDA#$74;PUT BLUE...STA$D017;IN COLOR 1LDA#$28;P!'}UT ORANGE...STA$D018;IN COLOR 2LDA#$3D;SET UP...STA$D400;DMA CTRLPLA;GET ACCUM.RTI;AND EXIT;----------!(}-----;SCREEN MESSAGES;---------------INFOLNDB0,0,0,0,0,0,0,0DB0,0,$6C,$76,$6C,0,0,0MAGMSGDB$21,$2E,$21,$2C,$2F,!)}$27DB0,$23,$2F,$2D,$30,$35DB$34,$29,$2E,$27TITLEDB0,0,0,0,$6C,$69,$76,$65DB$77,$69,$72,$65,0,0,0,0AUTHORDB0,$A!*}2,$B9,0,0,$B4,$AFDB$AD,0,$A8,$B5,$A4,$B3DB$AF,$AE,0JOYMSGDB0,0,0,0,$EA,$EF,$F9,$F3DB$F4,$E9,$E3,$EB,0,0,0,0PADMS!+}GDB0,0,0,0,0,$F0,$E1,$E4DB$E4,$EC,$E5,0,0,0,0,0LASTSCDB0,0,0,0,0,0,0,0DB0,0,0,0,0,0,0,0;----------;PROG START!,};----------LIVECLDJSR$E465;INIT SOUNDLDA#0;CLEAR PAGE 0LDX#127CPAGE0STA$80,XDEXBPLCPAGE0LDA#1;INI!-}T...STABCDLVL;LEVEL #STAINTRFG;SET INTRO FLAGLDA#JOYMSG&255;DEFAULT...STACONTRL;CONTROL...LDA#JOYMSG/256;!.}IS...STACONTRL+1;STICK!LDA#0;INIT...STADMACTL;DMASTANMIEN;INTERRUPTSSTAAUDCTL;AUDIOSTAHITCLR;COLLISIO!/}NSTACOLBK;BACKGND COLORLDX#3;CLEAR SHORTSCLRSHOSTASHORTF,XDEXBPLCLRSHOLDX#5;ZERO OBJECT...CLRDEDSTAOBD!0}EAD,X;CLR DEAD TABLEDEXBPLCLRDEDLDX#2;ZERO SCORECLRSCOSTASCORE,XSTASCOADD,XDEXBPLCLRSCOLDX#7CLRPRJS!1}TAPROJAC,X;CLEAR PROJ.DEXBPLCLRPRJLDX#5MOVSCOLDAINFOLN,X;COPY SCORE...STALASTSC+5,X;TO LAST...DEX;SCORE!2} LINEBPLMOVSCOLDA#29;SET ALL...LDX#5;OBJECTS TO...INIOBSSTAOBJSEG,X;SEGMENT # 29DEXBPLINIOBSJSRSHOSCO!3};SHOW SCOREJSRSNDOFF;NO SOUNDSLDA#6;6 PROJECTILESSTAPAVAIL;AVAILABLELDA#2;SET...STABONUS;BONUS=20000STA!4}LIVES;2 EXTRA LIVESJSRSHOLIV;SHOW LIVES LEFTLDA#5;SET UP...STASP2IX;PLAYER...LDA#10;SHAPE...STASP3IX;IN!5}DEXESLDA#TITLDL&255;POINT TO...STADLISTL;TITLE...LDA#TITLDL/256;DISPLAY...STADLISTL+1;LISTLDY#VBI&255;POI!6}NT TO...LDX#VBI/256;VERTICAL...LDA#7;BLANK...JSRSETVBV;INTERRUPTLDA#PMAREA/256;SET UP P/M...STAPMBASE;BAS!7}E ADDRESSJSRPMCLR;CLEAR P/MLDA#$74;PUT BLUE...STACOLPF0;IN COLOR 0LDA#$C4;PUT GREEN...STACOLPF1;IN COLOR !8}1LDA#$0A;PUT WHITE...STACOLPF2;IN COLOR 2LDA#$34;PUT RED...STACOLPF3;IN COLOR 3LDA#$3D;SET UP...STADMA!9}CTL;DMA,LDA#3;GRAPHICS,STAGRACTL;ANDLDA#$C0;INTERRUPT...STANMIEN;ENABLELDA#$11;SET P/M...STAPRIOR;PR!:}IORITYLDA#$0F;PUT WHITE...STACOLPM1;IN PLAYER 1,STACOLPM2;PLAYER 2STACOLPM3;AND 3LDA#$16;PUT YELLOW...S!;}TACOLPM0;IN PLAYER 0;------------;INTRO SCREEN;------------INTROLDACONSOL;START KEY...AND#1;PRESSED?BNEC!<}KSEL;NO!GOCHEKLDACONSOL;START KEY...AND#1;RELEASED?BEQGOCHEK;NO, WAIT.JMPDIGIN;GO DIG IN!!CKSELLDACONSOL!=};SELECT KEY...AND#2;PRESSED?BNEINTRO;NAW, LOOP BACK.LDAJOYPAD;TOGGLE...CLC;STICK/PADDLE...ADC#1;INDICATOR!>}...AND#1STAJOYPADTAXLDAJPLO,X;AND SHOW...STACONTRL;CONTROLLER...LDAJPHI,X;MESSAGE...STACONTRL+1;ON SC!?}REEN!LDA#30;30 JIFFY...JSRWAIT;WAIT!JMPINTRO;AND LOOP.;---------------------------;HERE'S WHERE PROGRAM STAR!@}TS;---------------------------DIGINLDA#DLIST&255;POINT TO...STADLISTL;GAME...LDA#DLIST/256;DISPLAY...STADLI!A}STL+1;LISTLDA#0;NO LONGER IN...STAINTRFG;INTROFOREVRLDA#1;WE WANT...STACOLOR;COLOR 1STAZAP;RESET ZAP.J!B}SRCLRSC;CLEAR SCREENLDAGRIDIX;GET GRID#AND#7;FIND WHICH...TAX;GRID SHAPE...LDAGRDTBL,X;TO DRAW...STAGRDN!C}UM;AND STOREJSRSHOLVL;SHOW LEVEL#JSRDRGRID;DRAW GRID!CONWTLDAPAUFLG;WE PAUSED?BNECONWT;YUP, LOOP.LDAKILPL!D}R;PLAYER DEAD?BEQPLIVE;NOPE!JSRDECLIV;ONE LESS LIFE!PLIVESTAATTRAC;CANCEL ATTRACT!LDAFLTIME;FLASH GOING?BN!E}ENOFEND;YES! STORE...STAHPOSP1;FLASH POSITION!NOFENDLDAOBTIM1;OBJECTS MOVING?BNENOOHAN;NOT YET!LDAOBJSPD;RE!F}SET MOVE...STAOBTIM1;TIMER;----------------------;COPY OBJECT KILL TABLE;----------------------LDX#5;THIS SEC!G}TIONCOPDEDLDAOBDEAD,X;COPIES THESTAOBDED2,X;OBJECT KILLLDA#0;TABLE WHICH ISSTAOBDEAD,X;SET UP BY THEDEX;P!H}ROJECTILEBPLCOPDED;HANDLERLDAMISCAD;MISC.SCORE?BEQNOMSCO;NO!STASCOADD+1;SET SCORE ADD...JSRADDSCO;AND AD!I}D IT!LDA#0;THEN RESET THESTAMISCAD;ADD VALUE.NOMSCOLDX#5;THIS SECTIONLDA#0;TALLIES ALLCKOBLVORAOBJPRS,X;O!J}BJECTS THATDEX;ARE ALIVEBPLCKOBLVLDX#4;NOW TALLYCKOBWTORANUMOBJ,X;ALL OBJECTSDEX;THAT ARE NOTBPLCKOBWT!K};ON GRID YETCMP#0;ANY OBJECTS?BEQLVLEND;NO, END OF LEVEL!LDX#5;IS OBJECTGENNOLLDAOBJPRS,X;PRESENT?BNENXTO!L}GN;YES, TRY NEXT.TRYTYPLDARANDOM;LET'S TRY TOAND#7;START UP ACMP#5;NEW OBJECTBCSTRYTYP;GET A TYPETAY;ANY!M} OF THATLDANUMOBJ,Y;TYPE WAITING?BEQNXTOGN;NO, TRY NEXTSEC;DECREMENT #SBC#1;OF OBJECTSSTANUMOBJ,Y;WAITING!N}.TYA;THEN SETSTAOBJTYP,X;OBJECT TYPE.NEWGRDLDARANDOM;GET A RANDOMAND#$0F;SUB-GRIDCMP#15;NUMBERBEQNEWGR!O}DSTAOBJGRD,X;AND SAVE ITLDA#30;PUT OBJECT ATSTAOBJSEG,X;FAR END OF GRIDLDA#1;SET UP...STAOBJINC,X;OBJ. IN!P}CREMENTSTAOBJPRS,X;OBJECT PRESENTNXTOGNDEX;LOOP BACK TO DOBPLGENNOL;NEXT OBJECTJSROBJHAN;HANDLE OBJECTSJSR!Q}SHOHAN;HANDLE SHORTSNOOHANLDACONSOL;ANY CONSOLECMP#7;KEYS PRESSED?BEQJCONWT;NOPE!JMPLIVE;YES, RESTART GAME!R}JCONWTJMPCONWT;INDIRECT JUMPLVLENDLDAGRIDIX;ARE WE ONCMP#63;GRID #63?BEQNOGRDI;YES, DON'T INC!CLC;INCREME!S}NTADC#1;GRID #STAGRIDIX;AND SAVE IT.AND#7;ADD 2 TOBNENODIFI;DIFFICULTY IFINCDIFF;ON A MULTIPLEINCDIFF!T};OF 8 GRIDS.NODIFISED;INCREMENTLDABCDLVL;BCD LEVEL #CLCADC#1STABCDLVLCLD;NOW GO TONOGRDIJMPFOREVR;DRA!U}W NEW GRID.;--------------;OBJECT HANDLER;--------------OBJHANLDAOBJNUM;INCREMENTCLC;OBJECT #ADC#1CMP#6!V};DONE?BNESTONUM;NO, CONTINUE.LDA#$FF;RESETSTAOBJNUM;OBJECT #RTS;AND EXIT.STONUMSTAOBJNUM;SAVE OBJ #OBHL!W}P1LDXOBJNUM;GET OBJ #LDAOBJPRS,X;OBJ PRESENT?BEQOBJHAN;NO!OBLIVELDAOBJSEG,X;WITHIN 2 UNITSCMP#2;OF RIM?B!X}CCNOOBFI;YES, DON'T FIRELDARANDOM;RANDOM CHANCEAND#$0F;OF SHOOTINGBNENOOBFI;DON'T SHOOTLDAPROJAC;PROJ. 0 AC!Y}TIVE?BNETRYPR1;YES, IGNORE!LDY#0;FORCE BRANCHBEQSTOBFI;TO STORE ITTRYPR1LDAPROJAC+1;PROJ. 1 ACTIVE?BNENOOB!Z}FI;YES, NO FIRELDY#1;SET INDEXSTOBFILDAOBJSEG,X;INITIALIZELSRA;PROJECTILESTAPROJSG,Y;SEGMENT #LDAOBJGRD,X![};ANDSTAPROGRD,Y;SUB-GRID #ASLA;MULTIPLYASLA;BYASLA;16ASLA;ANDSTAPROJGN,Y;SAVE INDEX!LDA#$FF;SET !\}INCREMENTSTAPROINC,Y;(TOWARD RIM)LDA#21;START THESTAFIRSOU;FIRE SOUNDLDA#1;ANDSTAPROJAC,Y;PROJECTILENOOB!]}FILDA#0;SET COLOR 0STACOLOR;TO ERASE OBJECTJSRDRWOBJ;AND ERASE ITLDXOBJNUMLDAOBDED2,X;OBJ DEAD?BEQNOOKIL!^};YES! STARTJSRFLASH;DEATH FLASHLDXOBJNUMLDYOBJTYP,X;GET OBJECT TYPELDAPOINT1,Y;GET POINTSSTASCOADD+1;AND !_}READYLDAPOINT2,Y;THE SCORESTASCOADD+2;ADD VALUEJSRADDSCO;ADD TO SCORE!LDXOBJNUMJMPKILOBJ;THEN KILL OBJ.NO!`}OKILLDAOBJSEG,X;INCREMENTSEC;OBJECT'SSBCOBJINC,X;SEGMENTSTAOBJSEG,X;POSITIONBMIKILOBJ;PAST RIM!CMP#30;!a}TYPE 3 PAST END?BNENOTOT3;NOPE!INCNUMOBJ+2;START TYPE 2BNEKILOBJ;FORCE BRANCHNOTOT3CMP#10;AT TYPE 3 TURN?BN!b}EOBHLP2;NO!LDAOBJTYP,X;IS ITCMP#3;TYPE 3?BNEOBHLP2;NO!LDA#$FF;REVERSE OBJECTSTAOBJINC,X;INCREMENTOBHLP!c}2LDAOBJTYP,X;IS OBJECTCMP#2;TYPE 2?BNESETHUE;NO, SET COLORLDARANDOM;GET RANDOMAND#1;DIRECTIONTAY;FOR T!d}YPE 2LDAOBJGRD,X;ANDCLC;ADD ORADCADDSB1,Y;SUBTRACT 1CMP#15;PAST LIMIT?BCSSETHUE;YES!STAOBJGRD,X;SAVE !e}NEW POS.SETHUELDAOBJTYP,X;GET OBJ. TYPETAX;AND GETLDAOBJHUE,X;COLOR #STACOLOR;SAVE ITJSRDRWOBJ;AND DRAW O!f}BJECT!JMPOBJHAN;DO NEXT ONEKILOBJLDA#0;OBJECT IS NOSTAOBJPRS,X;LONGER ALIVELDA#21;SET UPSTAOBDSOU;DEATH !g}SOUNDLDAOBJSEG,X;CHECKBPLJOBHAN;FOR ALDAOBJGRD,X;COLLISIONCMPPLRGRD;WITH PLAYERBNECKSHOR;NO HITLDA#1;!q}DB STRING4 BASBYLIVEWIREBASBgSNAIL ASMBwSNAIL BASB+SOUNDEFFBASB(STRING1 ASMBSTRING2 BASBSTRING3 ASMBbLIVEWIREASMB%hLIVEWIREEXEHIT,STAKILPLR;KILL PLAYER!BNEJOBHAN ;NEXT OBJECTCKSHORLDAOBJTYP,X;OBJECTCMP#1;TYPE 1?BNEJOBHAN;NOPE!!r}LDY#3;TRY SHORT:TRYSHOLDASHORTF,Y;SHORT AVAILABLE?BEQINISHO;YUP!DEY;KEEP...BPLTRYSHO;TRYING!BMIJOBHAN!s};NO SHORT AVAIL!INISHOLDAOBJGRD,X;MULTIPLY THEASLA;OBJECT'SASLA;SUB-GRID #ASLA;BY 16...ASLACLCADC#8;!t}AND ADD 8 FORSTASHORTX,Y;THE SHORT INDEXLDA#1;SHORT ISSTASHORTF,Y;ALIVE!LDARANDOM;RANDOMIZE...AND#1;SHORT!u}...STASHORTD,Y;DIRECTIONLDARANDOM;AND THAT...AND#$3F;DIRECTION'S...STASHORTT,Y;TIME!JOBHANJMPOBJHAN;NEXT !v}OBJECTDRWOBJLDXOBJNUM;GET OBJECT #LDAOBJGRD,X;GET SUB-GRID #ASLA;MULTIPLYASLA;BY 16...ASLAASLASTAHL!w}DGRD;AND SAVE.LDAOBJSEG,X;DIVIDELSRA;SEGMENT BY 2BCSODDSEG;PROCESS ODD #CLC;IT'S EVEN, ADDADCHLDGRD;GRID!x} INDEXTAY;PUT IN Y REG.LDASEGX,Y;GET OBJECT'SSTAPLOTX;X POSITIONSTASAVEX;AND SAVELDASEGY,Y;GET OBJECT'S!y}STAPLOTY;Y POSITIONSTASAVEY;AND SAVEJMPODDSKP;SKIP ODD ROUTINEODDSEGCLC;IT'S ODD, ADDADCHLDGRD;GRID INDEX!z}TAY;PUT IN Y REG.LDASEGX,Y;GET OBJECT'SCLC;X POS, ADDADCSEGX+1,Y;NEXT X POS.RORA;GET AVERAGESTAPLOTX;PU!{}T IN PLOT XSTASAVEX;AND SAVELDASEGY,Y;GET OBJECT'SCLC;Y POS, ADDADCSEGY+1,Y;NEXT Y POS.RORA;GET AVERAGE!|}STAPLOTY;PUT IN PLOT YSTASAVEY;AND SAVEODDSKPLDA#30;NOW CALCULATESEC;THE OBJECT'SSBCOBJSEG,X;SIZE BASED ON!}}LSRA;ITS POSITIONAND#$FE;ON THE GRIDASLAASLATAY;PUT INDEX IN YLDX#0;NOW COPY PARTCOPYSZLDASIZTBL,Y;O!~}F THE SIZESTASIZEWK,X;TABLE TO AINY;SIZE WORK AREAINX;THIS TABLE HOLDSCPX#8;8 SIZE VALUESBNECOPYSZ;BASED !}ON DIST.LDXOBJNUM;GET OBJECT #LDAOBJTYP,X;AND ITS TYPEASLA;AND MULTIPLYASLA;BY 8 FOR ANASLA;INDEX INTOS!}TASHAPIX;THE SHAPE TABLELDA#8;MAX 8 LINES INSTASHAPCT;EACH OBJECTDOBLPLDXSHAPIX;GET LINE#LDAOBJDIR,X;& ITS !}DIRECTIONTAY;A NEGATIVE #BMIENDOBJ;INDICATES ENDLDAPXINC,Y;GET X INCREMENTSTAXI;OF LINE,LDAPYINC,Y;Y INCR!}EMENTSTAYI;OF LINE,LDAOBJLEN,X;ABSOLUTE LENGTHTAY;OF LINE THENLDASIZEWK,Y;SCALED LENGTHSTALENGTH;AND STOR!}E!PLOTOBLDAPLOTX;THIS SECTIONCLC;ADJUSTS THEADCXI;X AND Y PLOTSTAPLOTX;VALUES...LDAPLOTYCLCADCYISTA!}PLOTYLDASHAPIX;DON'T PLOTBEQNOPLT1;FIRST LINE!JSRPLOTCL;PLOT POINTNOPLT1LDAPLOTY;INCREMENT YCLC;AGAIN TO!} ADJUSTADCYI;FOR GR. 7+STAPLOTY;ASPECT RATIOLDASHAPIX;DON'T PLOTBEQNOPLT2;FIRST LINEJSRPLOTCL;PLOT POINT!}NOPLT2DECLENGTH;END OF LINE?BPLPLOTOB;NOPE!INCSHAPIX;NEXT LINEDECSHAPCT;LAST LINE?BNEDOBLP;NOT YET!ENDOBJ!}RTS;ALL DONE!;-------------;SHORT HANDLER;-------------SHOHANLDX#3;MAX. 4 SHORTSSHHANLLDASHORTF,X;SHORT AL!}IVE?BEQHANNXS;NO, DO NEXTLDYSHORTD,X;GET SHORT DIR.LDASHORTX,X;GET X POS.CLC;AND ADJUSTADCADDSUB,Y;POSITI!}ONCMP#240;ON GRID?BCSRESSHD;NO! DON'T MOVESTASHORTX,X;OK, SAVE POS.DECSHORTT,X;DIRECTION CHANGE?BPLHANNXS!};NO!RESSHDLDARANDOM;GET A RANDOMAND#$3F;DIRECTION TIMESTASHORTT,X;0-63 & SAVEAND#1;RANDOM DIRECTIONSTASHOR!}TD,X;0-1 & SAVEHANNXSDEX;MORE SHORTS?BPLSHHANL;YUP!RTS;ALL DONE!;------------;ADD TO SCORE;------------!}ADDSCOLDY#0;GET ZEROSED;SET DECIMAL MODELDASCORE+2;THIS SECTIONCLC;INCREMENTSADCSCOADD+2;THE 3-DIGITSTA!}SCORE+2;SCORE USINGSTYSCOADD+2;THE 3-DIGITLDASCORE+1;SCORE ADDADCSCOADD+1;AREA, THENSTASCORE+1;ZEROS OUTST!}YSCOADD+1;THELDASCORE;SCORE ADDADCSCOADD;AREA USINGSTASCORE;THESTYSCOADD;Y REGISTER.CLD;CLR DECIMAL MOD!}EJSRSHOSCO;SHOW SCORELDASCORE;IS SCORE ATCMPBONUS;BONUS LEVEL?BNENOBONS;SORRY!JSRINCLIV;BONUS, ADD LIFE!!}SED;SET DECIMALLDABONUS;GET OLD BONUSCLC;ADD 20000ADC#2;TO ITCLD;CLR DECIMALSTABONUS;AND SAVE BONUSNO!}BONSRTS;FINIS!;----------;SHOW SCORE;----------SHOSCOLDA#$10;SET UP COLORSTASHCOLR;BYTE FOR SHOWLDX#0;!}ZERO XLDY#0;& Y REGSSSCOLPLDASCORE,Y;GET SCORE BYTEJSRSHOBCD;SHOW ITINX;INCREMENT SHOWINX;POS. BY 2INY!};NEXT SCORE BYTECPY#3;DONE?BNESSCOLP;NOT YET!RTS;ALL DONE!;---------------;INCREMENT LIVES;--------------!}-INCLIVLDALIVES;DO WE HAVECMP#5;5 LIVES NOW?BEQNOMOLV;YUP, NO INC!INCLIVES;ONE MORE LIFEJSRSHOLIV;SHOW I!}TNOMOLVRTS;AND EXIT!;---------------;DECREMENT LIVES;---------------DECLIVJSRSNDOFF;NO SOUND;-------------!}--------------;WAIT FOR PROJECTILES TO END;---------------------------WAITPDLDX#7;8 PROJECTILESLDA#0;ZERO TALLY!}CKPRLVORAPROJAC,X;CHECK ALLDEX;PROJECTILESBNECKPRLV;FOR ACTIVITYCMP#0;ANY ACTIVE?BNEWAITPD;YES! WAIT MORE!!};-----------;STOP SHORTS;-----------LDX#3;4 SHORTS (0-3)STPSHOSTASHORTF,X;TURN OFFDEX;ALL OF 'EMBPLSTP!}SHO;LOOP UNTIL DONE;--------------------------;PUT OBJECTS AT END OF GRID;--------------------------LDA#0;ERASE!}STACOLOR;COLORLDA#5;ERASE ALL 6STAOBJNUM;OBJECTSERSOBJJSRDRWOBJ;ERASE IT!LDXOBJNUM;GET OBJECT #LDA#30;!}PLACE ATSTAOBJSEG,X;SEG #30LDA#1;SET UP MOVESTAOBJINC,X;INCREMENTRNDOBGLDARANDOM;GET RANDOMAND#$0F;SUB-GR!}ID #CMP#$0F;0-14BEQRNDOBGSTAOBJGRD,XDECOBJNUM;MORE OBJECTS?BPLERSOBJ;YEAH, DO 'EMLDA#$0F;SHOW PLAYERS!}TACOLPM0;DEATH HERESTAAUDC1;START SOUNDMOREWTLDARANDOM;SET RANDOMAND#$1F;DEATH SOUNDSTAAUDF1;FREQUENCYLDA!}#6;WAIT 0.1 SECJSRWAITDECCOLPM0;DEC BRIGHTNESSLDACOLPM0;NOW SETSTAAUDC1;DEATH VOLUMEBNEMOREWT;MORE WAIT!}LDALIVES;MORE LIVES?BEQDEAD;NO MORE LIFE!DECLIVES;ONE LESS LIFEJSRSHOLIV;SHOW ITLDA#60;WAIT 1 SECJSRWAI!}TLDA#0;RESET PLAYERSTAKILPLR;KILL FLAGLDA#$16;ANDSTACOLPM0;PLAYER COLORRTS;AND EXIT!DEADPLA;ALL DEAD,!} PULLPLA;RETURN ADDR.JMPLIVE;AND RESTART GAME;----------;SHOW LIVES;----------SHOLIVLDA#$90;SELECT DISPLA!}YSTASHCOLR;COLORLDALIVES;GET LIVESLDX#7;7TH CHAR ON LINEJSRSHOBCD;SHOW IT!RTS;AND EXIT;----------;SH!}OW LEVEL;----------SHOLVLLDY#$50;SELECT DISPLAYSTYSHCOLR;COLORLDABCDLVL;GET LEVEL#LDX#14;14TH CHAR;----!}------------;BCD CHAR DISPLAY;----------------SHOBCDSTASHOBYT;SAVE CHARACTERAND#$0F;GET NUM 1ORASHCOLR;ADD C!}OLORSTAINFOLN+1,X;SHOW ITLDASHOBYT;GET CHAR.LSRA;SHIFT RIGHTLSRA;TO GETLSRA;NUM 2LSRAORASHCOLR;ADD!} COLORSTAINFOLN,X;SHOW ITRTS;AND EXIT!;----------------------;FLASH OBJECT WHEN DEAD;----------------------F!}LASHLDYFLASHY;GET Y POS.LDA#0;GET READY TOLDX#14;CLEAR OLD FLASHCLFLSHSTAPL1,Y;ZERO OUT EACHINY;BYTE OF FL!}ASHDEX;DONE YET?BNECLFLSH;NO, LOOP.LDASAVEX;GET OBJECT'SCLC;X POS. ANDADC#61;ADD 61 FORSTAHPOSP1;FLAS!}H HORIZ.LDASAVEY;GET Y POS ANDCLC;ADD 26 FORADC#26;FLASH VERT.TAY;POSITIONSTYFLASHY;AND SAVELDX#13;FL!}ASH = 14 BYTESSEFLSHLDAFLBYTE,X;GET IMAGESTAPL1,Y;PUT IN PLAYER 1INY;NEXT P/M BYTEDEX;NEXT IMAGE BYTEBPLSE!}FLSH;LOOP.LDA#1;SET FLASHSTAFLTIME;DURATIONRTS;ALL DONE!;----------;TIME DELAY;----------WAITSTATIMER!};SET TIMERWAITLPLDATIMER;TIMER = 0?BNEWAITLP;NOPE!RTS;TIMER FINISHED!;---------------;TURN SOUNDS OFF;---!}------------SNDOFFLDA#0;ZERO OUT:STAFIRSOU;FIRE SOUNDSTAOBDSOU;OBJ DEATH SOUNDSTAMOVSOU;PLYR MOVE SOUNDLDX!}#7;ZERO ALL:SNDOF2STAAUDF1,X;AUDIO REGISTERSDEXBPLSNDOF2RTS;AND EXIT;---------;DRAW GRID;---------DRG!}RIDLDA#1;TELL INTERRUPTSTAINTRFG;IT'S INTROJSRSNDOFF;TURN OFF SOUNDLDA#$20;TURN OFF TOPSTADMAC1;OF SCREEN !}BYLDA#0;SHUTTING OFFSTAGRAC1;DMA & GRAPHICSLDX#3;TURN OFF SHORTSCLSHRTSTASHORTF,XDEXBPLCLSHRTLDX#7;TU!}RN OFFCLPRJCSTAPROJAC,X;ALL PROJECTILESDEXBPLCLPRJCJSRPMCLR;CLEAR P/M AREASTAOFFSET;ZERO OFFSETLDA#6;SET!} 6 PROJECT.STAPAVAIL;AVAILABLELDAGRIDIX;GET GRID #LSRA;DIVIDELSRA;BYLSRA;8TAX;LOAD APPROPRIATELDAC!}0TBL,X;GRID COLORSTACOLPF0LDAC1TBL,X;OBJECT COLOR 1STACOLPF1LDAC2TBL,X;OBJECT COLOR 2STACOLPF2LDAOBSTBL,!}X;OBJECT SPEEDSTAOBJSPDLDAGRIDIX;GET GRIDAND#7;SHAPE INDEXTAX;LOAD:LDAOBCNT0,X;TYPE 0STANUMOBJ;OBJECT!} COUNTLDAOBCNT1,X;TYPE 1STANUMOBJ+1;OBJECT COUNTLDAOBCNT2,X;TYPE 2STANUMOBJ+2;OBJECT COUNTLDAOBCNT3,X;TYP!}E 3STANUMOBJ+3;OBJECT COUNTLDAOBCNT4,X;TYPE 4STANUMOBJ+4;OBJECT COUNTLDX#4;ADJUST ALLDIFFADLDANUMOBJ,X;OB!}JECT COUNTSCLC;BY ADDINGADCDIFF;DIFFICULTYSTANUMOBJ,X;AND SAVEDEXBPLDIFFADLDAGRDNUM;GET GRID #ASLA;M!}ULTIPLYASLA;BY 16ASLAASLASTAGRDADJ;SAVESTAGRDWK;SAVETAX;SET X INDEXLDA#16;LOAD 16 BYTESSTAGRDWK2!}GRDLINLDACX,X;GET CLOSE XSTAPLOTXLDACY,X;GET CLOSE YSTAPLOTYLDAFX,X;GET FAR XSTADRAWXLDAFY,X;GET FAR!} YSTADRAWYLDACOLPF0;INVISIBLE?BEQNOGRD1;YES, DON'T DRAWJSRPLOTCL;PLOT CLOSE POINTJSRDRAW;DRAW TO FARNOGRD!}1DECGRDWK2;CONTINUE DRAWINGBEQGRDBO1;UNTIL ALL 16INCGRDWK;LINES ARE DONELDXGRDWKJMPGRDLINGRDBO1LDXGRDADJ!};NOW DRAW 15STXGRDWK;CLOSE GRIDLDA#15;BORDER LINESSTAGRDWK2GRDBL1LDACX,X;GET CLOSE XSTAPLOTXLDACY,X;GET!} CLOSE YSTAPLOTYLDACX+1,X;NEXT CLOSE XSTADRAWXCLC;FIND POINTADCPLOTX;BETWEEN THEMRORASTAXWORK;AND SA!}VE IT!LDACY+1,X;NEXT CLOSE YSTADRAWYCLC;FIND POINTADCPLOTY;BETWEEN THEMRORASTAYWORK;AND SAVE IT!LDA#!}15;SET UP A WORKSEC;AREA TO HOLDSBCGRDWK2;THE POINTSSTAGRID;BETWEEN LINESJSRGRIDSV;AND SAVE THEMLDACOLPF0!};INVISIBLE GRID?BEQNOGRD2;YES, DON'T DRAWJSRPLOTCL;PLOT CLOSE POINT1JSRDRAW;DRAW TO POINT 2NOGRD2DECGRDWK2;M!}ORE LINES?BEQGRDBO2;NO!INCGRDWK;INCREMENT TOLDXGRDWK;NEXT LINEJMPGRDBL1;AND LOOPGRDBO2LDXGRDADJ;NOW DRAW !}15STXGRDWK;FAR GRIDLDA#15;BORDER LINESSTAGRDWK2STAOFFSET;AND SET OFFSETGRDBL2LDAFX,X;GET FAR XSTAPLOTX!}LDAFY,X;GET FAR YSTAPLOTYLDAFX+1,X;NEXT FAR XSTADRAWXCLC;AND FINDADCPLOTX;MIDPOINTRORA;BETWEEN THEM!}STAXWORK;AND SAVE IT!LDAFY+1,X;NEXT FAR YSTADRAWYCLC;AND FINDADCPLOTY;MIDPOINTRORA;BETWEEN THEMSTAYW!}ORK;AND SAVE IT!LDA#15;USE THE SAMESEC;WORK AREASBCGRDWK2;TO HOLD THESTAGRID;MIDPOINTSJSRGRIDSV;AND SAVE!} THEMLDACOLPF0;INVISIBLE GRID?BEQNOGRD3;YES, DON'T DRAWJSRPLOTCL;PLOT FAR POINT 1JSRDRAW;DRAW TO POINT 2NOGR!}D3DECGRDWK2;MORE LINES?BEQGENCOO;NO!INCGRDWK;INCREMENT TOLDXGRDWK;NEXT LINEJMPGRDBL2;AND LOOP;---------!}--------------------;NOW GENERATE COORDINATE TABLE;;THIS SECTION BUILDS THE SEGX,;SEGY, RIMX AND RIMY TABLES.;THE SE!}GX&Y TABLES ARE POINTS;UP AND DOWN THE GRID FOR PRO-;JECTILES AND OBJECTS. THE;RIMX&Y TABLES ARE FOR THE;POSITIONING!} OF SHORTS.;-----------------------------GENCOOLDA#0STAGRIDNODIVCTLTAXLDASEGX,X;SET UP SEGWKSTASEGWK;WITH !}ENDLDASEGX+15,X;COORDINATESSTASEGWK+16JSRDIVIDE;DIVIDE SEGWKLDXGRIDNOLDY#0COPY1LDASEGWK,Y;COPY SEGWKST!}ASEGX,X;TABLE TO SEGXINXINYCPY#16BNECOPY1;NOW THE Y COORDSLDXGRIDNOLDASEGY,X;SET UP SEGWKSTASEGWK;WIT!}H ENDLDASEGY+15,X;COORDINATESSTASEGWK+16JSRDIVIDE;DIVIDE SEGWKLDXGRIDNOLDY#0COPY2LDASEGWK,Y;COPY SEGWK!}STASEGY,X;TABLE TO SEGYINXINYCPY#16BNECOPY2;----------------------------;NOW GENERATE RIM COORDINATES;----!}------------------------LDXGRIDNOLDARIMX,X;SET UP SEGWKSTASEGWK;WITH ENDLDARIMX+15,X;COORDINATESSTASEGWK+1!}6JSRDIVIDE;DIVIDE SEGWKLDXGRIDNOLDY#0COPY3LDASEGWK,Y;COPY SEGWKSTARIMX,X;TABLE TO RIMXINXINYCPY#16!}BNECOPY3;NOW THE RIM Y COORDSLDXGRIDNOLDARIMY,X;SET UP SEGWKSTASEGWK;WITH ENDLDARIMY+15,X;COORDINATESSTAS!}EGWK+16JSRDIVIDE;DIVIDE SEGWKLDXGRIDNOLDY#0COPY4LDASEGWK,Y;COPY SEGWKSTARIMY,X;TABLE TO RIMYINXINYCPY!}#16BNECOPY4LDAGRIDNO;DO ALL 15CLC;GRID LINESADC#16STAGRIDNOCMP#240;ALL DONE?BEQENDDVC;YOU BET!JMP!}DIVCTL;LOOP BACK!ENDDVCLDA#$3D;RESTARTSTADMAC1;THE DISPLAYLDA#$03;AFTER GRIDSTAGRAC1;IS DRAWNLDA#0;NO M!}ORESTAINTRFG;INTRO STATUSRTS;FINIS!;-------------------------------;DIVIDE SEGWK TABLE;;THIS ROUTINE EXAMINES!} THE FIRST;AND LAST BYTES IN THE SEGWK;TABLE AND FILLS THE BYTES IN;BETWEEN WITH AN EVEN TRANSITION;FROM ONE ENDPOINT!} TO THE OTHER;-------------------------------DIVIDELDA#16STASTEPSTANEXTLSRASTADESTDIVLP2LDA#0STALAST!}DIVLP1LDXLASTLDASEGWK,XLDXNEXTCLCADCSEGWK,XRORALDXDESTSTASEGWK,XLDALASTCLCADCSTEPSTALASTAD!}CSTEPCMP#17BCSNOSTEPSTANEXTLDADESTCLCADCSTEPSTADESTJMPDIVLP1NOSTEPLDASTEPLSRASTASTEPSTANE!}XTLSRABEQENDDIVSTADESTJMPDIVLP2ENDDIVRTS;--------------------;GRID COORDINATE SAVE;--------------------!}GRIDSVLDAGRIDASLA;*2ASLA;*4ASLA;*8ASLA;*16CLC;ADD THEADCOFFSET;OFFSET VALUETAX;SAVE IN INDEX!}LDAXWORK;GET X WORKSTASEGX,X;AND SAVELDAYWORK;GET Y WORKSTASEGY,X;AND SAVELDAOFFSET;DON'T CONTINUEBNESAV!}END;IF OFFSET >0LDAPLOTX;GET PLOTXSTARIMX,X;AND SAVELDAPLOTY;GET PLOTYSTARIMY,X;AND SAVELDADRAWX;GET DRA!}WXSTARIMX+15,X;AND SAVELDADRAWY;GET DRAWYSTARIMY+15,X;AND SAVESAVENDRTS;ALL DONE!;----------------------;!}VERTICAL BLANK ROUTINE;----------------------VBILDA#DLI1&255;POINT TOSTAVDSLST;FIRSTLDA#DLI1/256;DISPLAY LIST!}STAVDSLST+1;INTERRUPTCLD;CLR DECIMAL MODELDAOBTIM1;THIS SECTIONBEQNOOBTD;PROCESSESDECOBTIM1;ALL TIMERSNO!}OBTDLDATIMERBEQNOTIMRDECTIMERNOTIMRLDAFLTIMEBEQNOFTIMDECFLTIMENOFTIMLDAKILPLR;PLAYER DEAD?BEQCHKINT;!}NO, CONTINUE!JMPVBCONT;SKIP PLAYER STUFFCHKINTLDAINTRFG;IN INTRO?BEQNOTINT;NO, CONTINUE!JMPXITVBV;EXIT IF INT!}RONOTINTLDAKEY;GET KEYBOARDCMP#$1C;PAUSE (ESC)?BNECKZAP;NO, CHECK ZAPLDAPAUFLG;GET PAUSE FLAGEOR#$FF;AND !}FLIPSTAPAUFLG;AND STOREJMPENDKEY;DONE W/KEYCKZAPCMP#$21;SPACE BAR?BNEENDKEY;NAW, DONE W/KEYLDAZAP;USED ZA!}P YET?BEQENDKEY;YES, NO ZAPDECZAP;ZAP NOW USEDLDX#5;TIME TO KILLLDA#1;ALL OBJECTSZAPOBJSTAOBDEAD,XDEXB!}PLZAPOBJLDX#3;AND KILLZAPSHOLDASHORTF,X;ALL SHORTSBEQNOSKILLDAMISCAD;ALSO SETSED;MISCELLANEOUSCLC;SCO!}RE ADDADC#4;FOR 400 POINTSSTAMISCAD;FOR EACH SHORTCLDLDA#0;KILLSTASHORTF,X;SHORTNOSKILDEXBPLZAPSHOEND!}KEYLDA#0;CLEARSTAKEY;KEYPRESS.LDAPAUFLG;PAUSED?BEQNOPAU;NO, CONTINUELDA#0;TURN OFFSTAAUDC1;ALL SOUNDS!}STAAUDC2;DURINGSTAAUDC3;THESTAAUDC4;PAUSEJMPXITVBV;THEN EXITNOPAULDAFIRSOU;FIRE SOUND ON?BEQNOFSND;NO!!}DECFIRSOU;DEC COUNTERLDXFIRSOU;PUT IN INDEXLDAFIRFRQ,X;GET FREQUENCYSTAAUDF2LDAFIRCTL,X;GET CONTROLSTAA!}UDC2NOFSNDLDAOBDSOU;OBJ DEATH SOUND?BEQNOOSND;NO!DECOBDSOU;DEC COUNTERLDXOBDSOU;PUT IN INDEXLDAOBDFRQ,X;G!}ET FREQUENCYSTAAUDF3LDAOBDCTL,X;GET CONTROLSTAAUDC3NOOSNDLDAMOVSOU;MOVE SOUND?BEQCYCCOL;NO!DECMOVSOU;DE!}C COUNTERLDXMOVSOU;PUT IN INDEXLDAMOVFRQ,X;GET FREQUENCYSTAAUDF4LDAMOVCTL,X;GET CONTROLSTAAUDC4CYCCOLLDA!}COLPM2;CYCLECLC;PLAYER 2ADC#16;COLORSTACOLPM2;SAVE IN P/M 2STACOLPM3;AND IN P/M 3AND#$FC;ALSO PUT INST!}ACOLPF3;PF3 FOR MISSILESDECTRANTM;TRANSIENT TIMEBNENOTRAN;NO CHANGELDAOBJHUE+4;FLIPBNETRAN1;TRANSIENTLDA!}#2;HUEBNESTOTRN;TO EITHERTRAN1LDA#0;0 OR 2STOTRNSTAOBJHUE+4LDARANDOMORA#$1F;RESETAND#$3F;THESTATRAN!}TM;TRANSIENT TIMENOTRANINCPSCNT;INC PLYR TIMERLDAPSCNT;READY TOCMP#3;CHANGE SHAPE?BNENOPSIN;NOT YET!LDA#0!};BETTER RESETSTAPSCNT;INDEXINCSP1IX;AND INCREMENTINCSP2IX;ALL SHAPEINCSP3IX;INDEXES!NOPSINLDAPFTIME;SEE !}IF WE'REBEQFIRE;READY TO CHECKDECPFTIME;IF PLAYER ISJMPCHKPMV;SHOOTINGFIRELDA#4;RESET FIRESTAPFTIME;TIMER!}LDAJOYPAD;USING STICK?BEQRDSTRG;YES!LDAPTRIG0;GET PADL TRIGGERJMPCMPTRG;CHECK ITRDSTRGLDASTRIG;GET STICK !}TRIGGERCMPTRGBNECHKPMV;NOT FIRING!LDAPAVAIL;ANY PROJ AVAIL?BEQCHKPMV;NO!LDX#7;FIND ANPRSCANLDAPROJAC,X;AV!}AILABLEBEQGOTPRN;PROJECTILEDEXBNEPRSCANGOTPRNDECPAVAIL;1 LESS AVAILABLELDA#1;IT'S NOWSTAPROJAC,X;ACTIVE!}LDA#21;START UPSTAFIRSOU;FIRE SOUNDLDA#0;INITIALIZESTAPROJSG,X;SEGMENT # TO 0LDAPLRGRD;SET UPSTAPROGRD,!}X;PROJ GRID#ASLA;ANDASLA;MULTIPLYASLA;BY 16ASLASTAPROJGN,X;FOR INDEXLDA#1;INITIALIZESTAPROINC,X;P!}ROJ INCREMENTCHKPMVLDAJOYPAD;USING STICK?BEQGOSTIK;YES!LDAPOT0;GET PADDLELSRA;DIVIDE BYLSRA;16 TO GETLS!}RA;USABLE VALUELSRACMP#15;> 14?BMISTOPOS;NO, GO STORELDA#14;MAX. IS 14BNESTOPOS;AND GO STOREGOSTIKLDA!}PMTIME;READY FOR STICK?BEQRDSTIK;YES!DECPMTIME;DEC TIMERJVBCJMPVBCONT;JMP TO CONTINUERDSTIKLDA#2;RESET STICK!} TIMERSTAPMTIME;TO 2 JIFFIESLDXSTICK;GET STICKLDAPLRGRD;GET PLYR GRID #CLC;ADD THEADCSTKADD,X;DIRECTION I!}NCBMISAMPOS;IF <0 REJECTCMP#15;IF <15...BNESTOPOS;USE IT!SAMPOSLDAPLRGRD;GET GRID#STOPOSCMPPLRGRD;SAME AS!} LAST?BEQNOPSTO;YES, DON'T STORELDX#9;START UPSTXMOVSOU;MOVE SOUNDSTAPLRGRD;SAVE GRID#NOPSTOASLA;MULTIPLY!}ASLA;BY 16 FORASLA;POSITIONASLA;INDEXTAXLDAP0PLAND#$0C;HIT P2/P3?BEQNOHSHO;NO!LDA#1;OOPS! HIT SH"}ORT!STAKILPLR;KILL PLAYERJMPVBEND;AND EXIT VBLANKNOHSHOLDASEGX,X;GET PLAYER'SCLC;X POSITION ANDADC#61;ADJ"}UST FOR P/MSTAHPOSP0;AND SAVELDYPLRY;HOLD OLD Y POSLDASEGY,X;GET NEW Y POSCLC;ADJUST FOR P/MADC#32;BY ADD"}ING 32STAPLRY;SET Y POSLDA#0;CLEAR OUTLDX#15;OLD PLAYERCLRPSSTAPL0-8,Y;IMAGEINYDEXBPLCLRPSLDA#15;N"}OW COPYSTASPIX;16-BYTESPLOOPLDA#0;PLAYER IMAGESTAPLTBYT;TO PLAYER 0LDASP1IXAND#15TAXLDASPIXCMPSPTBL"},XBCCNOSP1CMPEPTBL,XBCSNOSP1TAXLDAPN1,X;GET IMAGE 1STAPLTBYT;AND SAVENOSP1LDASP2IXAND#15TAXLDAS"}PIXCMPSPTBL,XBCCNOSP2CMPEPTBL,XBCSNOSP2TAXLDAPN2,XORAPLTBYT;ADD IMAGE 2STAPLTBYT;AND SAVENOSP2LDA"}SP3IXAND#15TAXLDASPIXCMPSPTBL,XBCCNOSP3CMPEPTBL,XBCSNOSP3TAXLDAPN3,XORAPLTBYT;ADD IMAGE 3STAP"}LTBYT;AND SAVENOSP3LDAPLRYCLCADCSPIXSECSBC#8TAYLDAPLTBYT;GET IMAGE BYTESTAPL0,Y;PUT IN P/M AREADEC"}SPIX;MORE IMAGE?BPLSPLOOP;YES!VBCONTLDAPRADV1;ADVANCE PROJ?BEQSETPRA;YES!DECPRADV1;NO, DEC TIMERJMPFLIPIT" };GO FLIP DISPLAYSETPRAINCPRADVTLDA#1;SET ADVANCESTAPRADV1;TIMER;------------------------------;THIS SECTION " }FLIP-FLOPS THE 4;MISSILES IN ORDER TO ALLOW THE;DISPLAY OF 8 PROJECTILES. AS;A RESULT, SOME FLICKER CAN BE;OBSERVED." };------------------------------FLIPITINCPRFLIP;INC FLIP INDEXLDAPRFLIP;GET INDEXAND#1;MAKE 0/1TAY;SAVE IN " }YLDAPREND,Y;GET # OF LASTSTAENDVAL;PROJECTILELDXPRSTRT,Y;GET # OF FIRSTSTXVBXHLD;PROJECTILELDA#3;START W/" }MISSILESTAMISNUM;NUMBER 3PROJLPLDAPROJAC,X;IS PROJ. ACTIVE?BNEGOTPRJ;YOU BET.JMPCKPEND;TRY ANOTHERGOTPRJLDX"}MISNUM;GET MISSILE #LDYPRYHLD,X;GET LAST POSITIONLDAMISSLS-1,Y;ERASE OLDANDMISLOF,X;PROJECTILESTAMISSLS-1,Y"};IMAGELDAMISSLS,YANDMISLOF,XSTAMISSLS,YLDAMISSLS+1,YANDMISLOF,XSTAMISSLS+1,YLDXVBXHLDLDAPRADVT;READY"} TOAND#1;ADVANCE PROJ?BNENOPADV;NOT YETLDAPROJSG,X;GET PROJ SEG#CLC;ANDADCPROINC,X;ADD INCREMENTSTAPRO"}JSG,X;THEN SAVENOPADVLDAPROINC,X;ENEMY SHOT?BMINOOHCK;NO OBJ HIT CHECKLDY#5OBKILPLDAOBDEAD,Y;ALREADY DEAD?B"}NENXTOCK;YES!LDAOBJPRS,Y;OBJECT THERE?BEQNXTOCK;NO!LDAOBJTYP,Y;TRANSIENT?CMP#4BNENOTRNC;NO!LDAOBJHUE+"}4;INVISIBLE?BEQNXTOCK;YES!NOTRNCLDAOBJGRD,Y;SAME GRID #CMPPROGRD,X;AS PROJ?BNENXTOCK;NO!LDAOBJSEG,Y;SAME"} SEG #LSRASECSBCPROJSG,X;AS PROJ?BEQHITOBJCMP#254BCCNXTOCK;NO!HITOBJLDAOBJTYP,Y;RESISTOR?BEQCGPRDR"};YES!LDA#1;KILL OBJECTSTAOBDEAD,YJMPKILLPR;AND PROJ.CGPRDRLDA#$FF;PROJ NOW HEADINGSTAPROINC,X;FOR PLAYER!"}NXTOCKDEY;NEXT OBJECTBPLOBKILP;MORE TO DO!NOOHCKLDAPROJSG,X;IS PROJ SEG# =0?BEQKILLPR;YES, KILL IT!CMP#16;"}=16?BEQKILLPR;YES, KILL IT!CLC;NOW ADD PROJADCPROJGN,X;GRID INDEXTAX;AND GETLDASEGX,X;X COORDLDYSEGY,X"};AND Y COORDCLC;ADD 64 TOADC#64;X COORD FORLDXMISNUM;P/M HORIZSTAHPOSM0,X;AND SAVETYA;GET YCLC;ADD 3"}2 TOADC#32;Y COORD FORTAY;P/M VERTSTYPRYHLD,X;AND SAVE.LDAMISSLS-1,Y;NOW DRAWORAMISLON,X;PROJECTILE INS"}TAMISSLS-1,Y;NEW POSITIONLDAMISSLS,YORAMISLON,XSTAMISSLS,YLDAMISSLS+1,YORAMISLON,XSTAMISSLS+1,YCKPENDDE"}CMISNUM;NEXT MISSILE #DECVBXHLD;NEXT PROJ.LDXVBXHLDCPXENDVAL;DONE?BEQSHORTS;YES!JMPPROJLP;DO NEXT PROJ."}KILLPRLDA#0;KILL PROJ.STAPROJAC,XCPX#2;ENEMY PROJ?BCCNOAVIN;YES DON'T INCINCPAVAIL;ANOTHER AVAILNOAVINLDA"}PROJSG,X ;SEGMENT 0?BNENOKILP;NO!LDAPROINC,X;TOWARD RIM?BPLNOKILP;NO!LDAPROGRD,X;SAME GRID...CMPPLRGRD;"}AS PLAYER?BNENOKILP;NO!LDA#1;THE PLAYERSTAKILPLR;IS DEAD!NOKILPJMPCKPEND;NEXT PROJ.;----------------------"}--------;THIS SECTION HANDLES SHORTS.;2 PLAYERS ARE USED TO SHOW A;MAXIMUM OF 4 SHORTS, SO SOME;FLICKER MAY BE OBSERV" }ED.;------------------------------SHORTSINCSHFLIP;TOGGLE FLIPLDASHFLIP;MASK FLIPLSRA;TO EITHERAND#1;0 OR 1"!}TAY;PUT IN YLDACPYSTN,Y;AND GET IMAGESTACPYST;TO USE (+/X)LDASHFLIP;GET FLIP,AND#1;MASK ANDTAY;PUT IN""} YLDA#PL3/256;PUT PLAYER 3STADESTHI;IN DESTINATIONLDA#PL3&255;ADDRESSSTADESTLO;HI & LOLDA#1;SET DEST #S"#}TADESTNMLDASHSTRT,Y;GET STARTSTAVBXHLD;SHORT #SHORLPLDA#0LDXDESTNMLDYSHYHLD,X;GET LAST INDEXLDX#9;NOW "$}ERASEERSSHOSTA(DESTLO),Y;PREVIOUSINY;SHORTDEXBPLERSSHOLDXVBXHLDLDASHORTF,X;SHORT ALIVE?BEQNXTSHO;NO!"%}LDASHORTX,X;GET INDEX OFTAX;SHORT'S POS.LDARIMX,X;GET X COORDLDYRIMY,X;AND Y COORDCLCADC#62;ADJUST XLD"&}XDESTNM;GET PLAYER#STAHPOSP2,X;AND STORETYACLCADC#28;ADJUST YSTASHYHLD,X;SAVE ITTAYLDXCPYSTLDA#4S"'}TACPYCNTSHOCOPLDASHOIMG,X;NOW COPYSTA(DESTLO),Y;SHORT IMAGEINY;TO P/MSTA(DESTLO),Y;AREAINYDEXDECCPYCN"(}TBPLSHOCOPNXTSHODECDESTNM;MORE?BMIVBEND;NO, EXIT!DECDESTHI;NEXT PLAYERINCVBXHLDJMPSHORLP;LOOP BACK.VBE")}NDSTAHITCLR;CLEAR COLLISIONJMPXITVBV;VBI DONE! (WHEW!);---------------------;CLEAR PLAYER-MISSILES;------------"*}---------PMCLRLDA#0;PUT 255TAX;ZEROS INPMCLPSTAMISSLS,X;EACH P/MSTAPL0,X;AREASTAPL1,XSTAPL2,XSTAPL3"+},XDEXBNEPMCLPRTS;FINIS!;------------;CLEAR SCREEN;------------CLRSCLDA#DISP/256;INITIALSTAHI;DISPLAY",}LDA#DISP&255;ADDRESSSTALO;WORK AREALDX#20;CLEAR 20 GROUPSCLRSC2LDY#0;OF 256 BYTESTYA;(5120 BYTES)CLRSC3S"-}TA(LO),YDEYBNECLRSC3DEXBNECLRSC4RTSCLRSC4INCHIJMPCLRSC2;----------------------;GR. 7+ PLOTTER ROUTINE".};(SEE A.N.A.L.O.G. #11);----------------------PLOTCLLDAPLOTY;MULT. Y BY 32:ASLASTALOLDA#0ROLASTAHI;*"/}2ASLLOROLHI;*4ASLLOROLHI;*8ASLLOROLHI;*16ASLLOROLHI;*32LDA#DISP&255 ;ADD THE DISPLAYCLC;AD"0}DRESS TO GETADCLO;THE ACTUALSTALO;ADDRESS OF THELDA#DISP/256 ;BYTE THAT WILLADCHI;BE ALTERED FORSTAHI;THE "1}PLOT.LDAPLOTX;MASK PLOTX FORAND#3;PLOT INDEX,TAX;PLACE IN X.LDAPLOTX;GET PLOTX ANDLSRA;DIVIDELSRA;BY "2}4,STAYOFSETTAYLDA(LO),YANDBMASK2,XCMPCOLOR1,XBEQPABORTLDYCOLOR;GET COLORLDABMASK2,X;AND MASK OFFAN"3}DCOLORS,Y;PIXEL POSITIONSTAHOLD;SAVE IT,LDABMASK1,X;MASK OFF PIXELLDYYOFSET;OF THE ADDRESSAND(LO),Y;TO BE A"4}LTEREDORAHOLD;SET THE PLOTSTA(LO),Y;BITS AND STORE!PABORTRTS;FINIS!;----------------;PLOT MASK TABLES;----"5}------------COLORSDB$00,$55,$AA,$FFBMASK1DB$3F,$CF,$F3,$FCBMASK2DB$C0,$30,$0C,$03COLOR1DB$40,$10,$04,$01;----"6}--------;DRAW HANDLER;------------DRAWLDADRAWYCMPPLOTY;IS DRAWY>PLOTY?BCCYMINUS;NO!SEC;SUBTRACTSBCPLOT"7}Y;PLOTY FROM DRAWYSTADELTAY;AND SAVE DIFFERENCE.LDA#1;Y INCREMENTSTAINCY;= 1 (DOWN)BNEXVEC;BRANCH!YMINUSLD"8}APLOTY;SUBTRACTSEC;DRAWYSBCDRAWY;FROM PLOTYSTADELTAY;AND SAVE DIFFERENCE.LDA#255;Y INCREMENTSTAINCY;= -"9}1 (UP)XVECLDADRAWX;IS DRAWXCMPPLOTX;> PLOTX?BCCXMINUS;NO!SEC;SUBTRACTSBCPLOTX;PLOTX FROM DRAWXSTADELTA":}X;AND SAVE DIFFERENCE.LDA#1;X INCREMENTSTAINCX;IS 1 (RIGHT)BNEVECSET;BRANCH!XMINUSLDAPLOTX;SUBTRACTSEC;D";}RAWX FROMSBCDRAWX;PLOTXSTADELTAX;AND SAVE DIFFERENCE.LDA#255;X INCREMENTSTAINCX;IS -1 (LEFT)VECSETLDA#0;Z"<}ERO OUT:STAACCY;Y ACCUMULATORSTAACCX;X ACCUMULATORLDADELTAX;IS DELTAX>CMPDELTAY;DELTAY?BCCYMAX;NO!STAC"=}OUNTR;SAVE DELTAXSTAENDPT;IN COUNTR, ENDPT.LSRA;DIVIDE BY 2 ANDSTAACCY;STORE IN Y ACCUM.JMPDRAWGO;START DRAW">}YMAXLDADELTAY;DELTAY LARGER,STACOUNTR;STORE IT INSTAENDPT;COUNTR, ENDPT.LSRA;DIVIDE BY 2 ANDSTAACCX;STORE"?} IN X ACCUM.;-----------------------;NOW WE START THE ACTUAL;DRAWTO FUNCTION!;-----------------------DRAWGOLDACO"@}UNTR;IF COUNTR=0...BEQDRWEND;NO DRAW!BEGINLDAACCY;ADD DELTAYCLC;TO Y ACCUMULATORADCDELTAYSTAACCYCMPENDP"A}T;AT ENDPOINT YET?BCCBEGIN2;NO, GO DO X.LDAACCY;SUBTRACT ENDPTSEC;FROM Y ACCUMULATORSBCENDPTSTAACCYLDAP"B}LOTY;AND INCREMENTCLC;THE Y POSITION!ADCINCYSTAPLOTYBEGIN2LDAACCX;ADD DELTAX TOCLC;X ACCUMULATORADCDELT"C}AXSTAACCXCMPENDPT;AT ENDPOINT YET?BCCPLOTIT;NO, GO PLOT.LDAACCX;SUBTRACT ENDPTSEC;FROM X ACCUMULATORSBC"D}ENDPTSTAACCXLDAPLOTX;AND INCREMENTCLC;PLOT XADCINCXSTAPLOTXPLOTITJSRPLOTCL;PLOT THE POINT! DECCOUNT"E}R;MORE TO DRAW?BNEBEGIN;YES!DRWENDRTS;NO, EXIT!;------------------;MISCELLANEOUS DATA;------------------GRD"F}TBLDB0,1,2,3,4,1,5,3;L,I,V,E,W,I,R,E;COLORS (0=GRID, 1=OBJ1 2=OBJ2)C0TBLDB$C4,$36,$74,$F6DB$54,$06,$00,$26C1T"G}BLDB$86,$0C,$36,$56DB$26,$C6,$98,$18C2TBLDB$98,$46,$A8,$36DB$84,$18,$C6,$38;OBJECT COUNT TABLES (DIFFICULTY)O"H}BCNT0DB0,0,0,0,4,6,8,10OBCNT1DB0,0,0,6,8,9,10,11OBCNT2DB8,10,12,14,16,18,20,22OBCNT3DB6,8,10,11,12,14,15,16OBCNT4"I}DB0,0,4,8,10,12,14,16;STICK ADD VALUESSTKADDDB0,0,0,0,0,1,1,1DB0,$FF,$FF,$FF,0,0,0,0;PROJECTILE DATAPROJACD"J}B0,0,0,0,0,0,0,0PROINCDS8PROGRDDS8PROJGNDS8PROJSGDS8PRSTRTDB3,7PRENDDB$FF,3MISLONDB$03,$0C,$30,$C0MISL"K}OFDB$FC,$F3,$CF,$3F;FLASH (OBJECT DEATH) DATAFLBYTEDB$28,$28,$28,$92,$54,$28,$10DB$10,$28,$54,$92,$28,$28,$28;O"L}BJECT POINTS (250,200,50,100,150)POINT1DB$02,$02,$00,$01,$01POINT2DB$50,$00,$50,$00,$50;SHORT DATASHORTFDS4SHO"M}RTXDS4SHORTDDS4SHORTTDS4;OBJECT DATAOBDEADDS6OBDED2DS6OBJTYPDS6OBJINCDS6OBJGRDDS6OBJSEGDS6OBJH"N}UEDB2,3,2,3,2SIZEWKDB0,0,0,0,0,0,0,0PXINCDB0,0,1,$FF,1,$FF,1,$FFPYINCDB$FF,1,0,0,$FF,1,1,$FFOBSTBLDB18,15,14,12"O}DB11,10,9,7OBJDIRDB4,3,1,2,0,5,$FF,0DB4,5,0,6,0,$FF,0,0DB0,5,6,4,7,1,$FF,0DB6,0,3,1,2,7,$FF,0DB4,6,5,7,5,6,"P}4,$FFOBJLENDB3,7,7,7,7,7,0,0DB3,7,7,7,7,0,0,0DB3,3,3,3,3,7,0,0DB2,3,3,3,3,3,0,0DB1,1,1,3,1,1,3,0SIZTBLDB0,0"Q},0,0,0,1,1,1DB0,0,0,1,1,2,2,2DB0,0,1,1,1,2,2,2DB0,1,1,2,2,2,2,3DB0,1,1,2,2,2,3,3DB1,2,2,2,2,2,3,3DB1,2,2,2,"R}3,3,3,4DB1,2,2,3,3,3,4,4;PLAYER SHAPESPN1DB$10,$10,$10,$10,$10,$10,$10,$10DB$08,$08,$08,$08,$08,$08,$08,$08PN2"S}DB$00,$00,$00,$00,$80,$40,$20,$10DB$08,$04,$02,$01,$00,$00,$00,$00PN3DB$00,$00,$01,$01,$02,$02,$04,$08DB$10,$20,$40"T},$40,$80,$80,$00,$00;SHAPE START/END POINTSSPTBLDB0,1,2,3,4,5,6,7DB8,7,6,5,4,3,2,1EPTBLDB17,16,15,14,13,12,11,10"U}DB9,10,11,12,13,14,15,16;JOYSTICK/PADDLE MESSAGE POINTERSJPLODBJOYMSG&255,PADMSG&255JPHIDBJOYMSG/256,PADMSG/256"V};GRID DATA TABLESCXDB14,14,14,14,14,14,14,14DB26,39,51,64,75,88,100,113DB14,14,14,14,14,14,14,14DB14,14,14,14,1"W}4,14,14,14DB14,20,26,32,38,43,49,59DB69,78,84,89,95,101,107,113DB113,88,64,39,14,14,14,27DB27,14,14,14,39,64,88,1"X}13DB14,14,14,14,14,29,43,58DB70,84,98,113,113,113,113,113DB113,106,100,113,113,100,82,65DB48,32,14,14,14,14,14,14"Y}CYDB18,34,52,70,88,105,123,141DB141,141,141,141,141,141,141,141DB18,25,34,42,50,58,67,75DB83,91,100,108,116,125"Z},133,141DB18,39,59,80,101,121,141,141DB141,141,121,101,80,59,39,18DB18,18,18,18,18,35,53,71DB89,106,124,141,141,1"[}41,141,141DB18,49,80,111,141,132,123,114DB114,123,132,141,111,80,49,18DB141,110,80,61,38,18,18,18DB18,18,18,43,68"\},92,117,141FXDB55,55,55,55,55,55,55,55DB58,60,62,64,66,68,70,73DB55,55,55,55,55,55,55,55DB55,55,55,55,55,55,55,5"]}5DB55,57,58,59,59,60,61,63DB65,67,68,69,69,70,71,73DB73,68,64,60,55,55,55,57DB57,55,55,55,60,64,68,73DB55,55,5"^}5,55,55,58,61,63DB65,67,70,73,73,73,73,73DB73,72,70,73,73,70,67,64DB61,58,55,55,55,55,55,55FYDB67,71,74,77,81,84"_},87,90DB90,90,90,90,90,90,90,90DB60,62,65,68,71,73,76,78DB81,83,86,89,92,94,97,99DB67,73,77,80,84,88,90,90DB90"`},90,88,84,80,77,73,67DB67,67,67,67,67,71,74,77DB80,83,86,90,90,90,90,90DB67,74,80,86,90,89,87,86DB86,87,89,90,86,"a}80,74,67DB90,85,80,75,71,67,67,67DB67,67,67,73,78,82,86,90SHSTRTDB0,2SHYHLDDS2SHOIMGDB$88,$50,$20,$50,$88DB"b}$20,$20,$F8,$20,$20CPYSTNDB4,9ADDSUBDB2,$FE;ADD/SUB. 2ADDSB1DB1,$FF;ADD/SUB. 1;SOUND DATAFIRCTLDB$00,$A1,"c}$A1,$A2,$A2,$A3DB$A3,$A4,$A4,$A5,$A5,$A6DB$A6,$A7,$A7,$A8,$A8,$A9DB$A9,$AA,$AAFIRFRQDB0,194,166,180,152,166DB1"d}38,152,124,138,110,124DB96,110,82,96,68,82DB54,68,40OBDCTLDB$00,$41,$41,$42,$42,$43DB$43,$44,$44,$45,$45,$46DB"e}$46,$47,$47,$48,$48,$49DB$49,$4A,$4AOBDFRQDB0,80,40,120,80,160DB120,200,160,240,200,24DB240,64,24,104,64,144DB"f}104,204,144MOVCTLDB$00,$A1,$A1,$A2,$A2,$A3DB$A3,$A4,$A4MOVFRQDB0,20,30,20,30,20,30,20,30;DATA TABLESSEGWKDS"g}17SEGXDS256SEGYDS256RIMXDS256RIMYDS256ENDLIVE4MOVFRQDB0,20,30,20,30,20,30,20,30;DATA TABLESSEGWKDS > 1ppNN&i}G!A pppppppGc!ppF!pG#!0F3!pp0FC!A Hƍ ԍХōԩ h@H ԍЩt&j}Щ(Щ=h@lvl!.!,/'#/-054).'livewire&k} eC ! /ԍҍЍX.h.ؕ .!h!. % &Ѕ ,&&l} 0 1( \ ,tč 4=/Щԩo) )L{")i)Ϊ/&m} /  &LE"0 1 ,)- 8& & %MХuͅh.n.h. Z%ޢ&n}M1 )"8t. )..z. [# ,%Ls!L"?i)iL"i&o}`꽆.9 )2 . .$.J,... $..ѩ . y$n. U&t.N.ܹS. Z%L'$.8z.&p}.0B: t.z.t. ).y'1.t.. y$L[#ҽ.B.ŕ5t..X.0". i&q}\.X. )`. )?d.L[#. .Je12L$e1y1j2y2j8.J) /.t. &r} .0@....ee ,e ,ƬƯи`X.#`.\.y%1\.d. )?d.)`.&s}`e݅ڄݥe܅لܥeۅ؄ % %i؅` @&` ,&` & .X. y$&t}.z. ).ƪҭ )ҩ & ,&< &`hhLs!Ȣ @&`P)!JJJJ&u}!`i=Хi @.``х҅Ӣ` & ũƢX. . ,JJJ-&v}--.ͥ)-߽----e Ʌʪ˽//U00 , -ʦL'Ɇʩ˽&w}///ej/ej8˅ ( , -ʦLK'Ɇʩ˅U00V0ej0ej8˅ ( , -&x}ʦL'1111 w(112121 w(123131 w(13414&y}1 w(14iL'=ũƩ`J1}1j1ee eL(JJL(` &z}e123434`ύ إƩƣƶL+Lb ILR)!($Ʋh.X.&{}iةX.ҍҍҍLbѦѽ>1ҽ)1ҥҦҽh1ҽS1ҥӦӽ1ҽ}1ҭi)ƿ&|}.. )?漥 湥ƝL1*|L*/+ .ƾ .ѩ,.. $..pJJJ&}}J0"ƔL+x}-0ŕ Ӆ ) L,1i=Ф2i )q/ ݁/&~}A/)q/ ݁/Q/)q/ ݁/a/e8ƺƢL+桩栥)6.4. .L+Թ=<&}.=<.=<.) ,.}.,..0Ch.94t..(.. .J8,.t.h.L+.,.FB}$.&}12i@Иi Թ8.8.8.ƟƜ&L$+ .澽,.. .ŕL+¥J)#1ĥ)&}ù1ü1 X..\.34i>ÝИi1ĩϽ1ȑ0L6,Lb`&}`L, *&&&&ee)JJ=---9--1`U?0 @Ń 8僅&} 8内ł 8傅 8充Ŋ JLv-J9eŎ8厅eeŎ8厅&}e ,ƍ`6tT& 6V&ƘF68     &} 0?(((T((T(((PPP&} &}@  @@ CS!!&}'3@KXdq &+1;ENTY_ekqqX@''@Xq+:FTbqqqqqqjdqqdRA0 "4FXi{"*2:CKS[dlt}'&};PeyyeP;'#5GYj|1Po{rr{oP1nP=&+D\u77777777:<>@BDFI777777777777777779:;;<=?ACDEEFGIID@<77799777<@D&}I77777:=?ACFIIIIIIHFIIFC@=:777777CGJMQTWZZZZZZZZZ<>ADGILNQSVY\^acCIMPTXZZZZXTPMICCCCCCGJMPSVZZZZZCJPVZYWVVWYZVPJCZUPKGCCCCCCI&}NRVZP P  ¦|n|`nR`DR6D(AABBCCDDEEFFGGHHIIJJP(xPxȠ@h@h̐&}s!  ¦|n|`nR`DR6D(AABBCCDDEEFFGGHHIIJJP(xPxȠ@h@h̐$