#ML }  X c0C)HCCH Mhhݩh `eCDiCD`  RyHP   * 1H0芢@) Y0.Ș`i`#(PMR\ \b Pgi 0  % @ / ՠ`d   0DDԝL \+,DATHEXLINDATLIDDBYTPASCHKSUTOTA@} *** MUSIC SYNTHESIZER *** 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-%!A %6-&A-  ""@%2 A< F:A,@Ad }J( WRITING FILE 6-@,6-A 6#A@ @`J @%n(BAD DATA: LINE ddD820E22020A32120A326 }4C3C25A230A97F9D4403A9289D450320B2263028A9079D4203A9009D4403A92B9D4503,888ddA9009D4803A92A9D49032056E4C088D008A90C9D42034 }C56E484D4208C26A2BAA027209624A230203E2068684C,359ccC521A90085A0A02B84A1A8B1A0C9AAD035C8D002E6A1B1A0300AAA9480A5A195814C8D }20A90385A0B1A00A0A0A,11cc85C1A90085A0C8D002E6A1B1A0C9FFF008C8D0F2E6A14C8D20C8D002E6A1B1A0C9FFD0BAA206BDDA2085A6A92A,36}dd85A7A9FFA00191A688B59485A0B59585A1F00EB1A091A6C8B1A091A6C8C9FFD0F2CACA10D460002A402A802AC0,708dd2AA21BA9009580CA10FB60}A203A90685A8B5B9F031C902D0034C3123202F21C907B01FA8B9152185A6B91C2185,432$ddA7202F216CA600F245549D8EF29720212121212021A9009}5B9CA8A0A85A810C460FE1C06BD412185A0A92A85A1,136.ddBC1C06B1A060004080C038E9010ADE2006F0A49D1C064CF220A8B934069D0806B93E069D}0C06B948069D1006B9,3178dd52069D1406B95C069D1806980AA8A90195B99D2C06B9800095B0B9810095B4F002F6B94CF2200A09A09D28064C,861B}ddF2209D20064CF2209D24064CF220A9FD8D3002A9268D3102A9628DC8026020492520E22020D325200D20205C20,892Lbb4C242220C6264820482468}C94CF016C952F0DEC94EF031C950F06BC954F049208C264CC521A59505970599059B,4VddD0034C5324A265A02720712620CD2420EC2020B1242038254}C0A25A28FA0272071262066251006209D264C0A22,348`ddD006AAF0F5CA86B82048244CC521A5C1209024A212A027202B231006209D264C2A22D0E4AA}F0F585C14C2422A2,368jdd1FA027202B23D0D3C90A9006209D264C4822AAF0F785A80AA8B98100D0034C5324204824A6A8BD3406209024A2,848tdd}2CA027202B231006208C264C6A22D008AAF0F5A6A89D3406204824A6A8BD3E06209024A23AA027202B23100620,595~dd8C264C8E22D008AAF0F5A6A8}9D3E06204824A6A8A9AE38FD48064A209024A280A027202B233006D017C9089006,188dd208C264CB2220A85AFA9AE38E5AFA6A89D4806204824A6A8B}D5206209024A247A027202B231006208C264CE322,450ddD005A6A89D5206204824A6A8BD5C06209024A256A027202B231006208C264C0423D008AAF0}F5A6A89D5C064C24,691dd222071264C6625A4A8BD2C06D012DE3006F0034C2721B59CD0069900D29901D2F6B0D002F6B4B59CD011A90195,804dd}C6BD08069D0006A9A29901D295A9A900A885AE95BD9D2C06BD18069D0406B5B085A0B5B485A1B1A0C955D00B98,255dd95C6A4A89901D24C1A24C956}D005A9244C0F24C97FD009F6B0D0ABF6B44C4A23C9FFD010A90095C6A4A89901D2,117ddA90195B94CF2204A26AE4A26AEA000C9079006E907C84CC02}348B9012485AD68A8B9082465ADA4AE79052485AD,985ddBD2406C981B00B65ADC9259024E9244CE723297F85AFA5ADE5AFC925901369234CF823000C}182400FF01000204,488dd0507090BA8B9D82695C2A4A89900D2F6B0D002F6B4B5B085A0B5B485A1A000949CB1A00A369C4AA8B93B249D30,276dd}064C27210406080C10182030406080C0A227A9009D5728CA10FA60204824A278A0272071264CC521A203A006DE,941dd0406D021B5BDF00AB5C29900}D2D6BD4C8424B5C2F00F38FD14069900D2F6BDBD18069D04068888CA10D56085D4,490ddA2ABA02720682685D520AAD920E6D8D8A0FFC8B1F3291F996 }628B1F310F460A5C185AFA90485A6A03088D0FD20,808dd1826C6A6D0F4206024C6AFD0E9602029258D08D22065E4A203A006A900959C95B095B495C6!}9D24069D20069D1C,975dd06A9019D2C0695B9A9AA9D2806A9A095A9B99500D00295B9CA888810D160A5B905BA05BB05BCD012A5B8F005C6,498 dd"}B84CE7212048242029254CC5214CFE21A206A9009D01D29D00D2CACA10F660A511D029C61120292585B8204824,988dd4CC521A209A9409D3E069D5C#}06A9019D3406A9009D5206A9A29D4806CA10E660A90085AFCE7A2820C626C99BF0,796dd39C97ED013A5AFF0F1C6AFA6AFA9FF9D7A28FE7B284C6D25A$}6AFE003F0DCC93090D8C93AB0D4A6AF9D6606E91F,478(dd9D7A28A9FF9D7B28E6AF4C6D25A6AFD003E6AF60A96685F3A90685F4A9009D660685F22000%}D820D2D9D8A5D4A6,6952ddD5F002A28060A29EA02720682685AFCE6B2820C626A6AFC97ED0108AF0F4C6AFA9FF9D6A28FE6B284CDF259D7F,793<dd&}28C99BF01538E9209D6B28A9FF9D6C28E6AFE8E011D0CE4CE825FE6B2860A203A006B5C6F042DE0006D03DC901,653FddF007C902F0204C6226F6A9B5'}A99901D2DD2806F006BD08064C4726F6C6BD0C069D00064C6226B5A9DD1006F00C,488Pdd900AD6A9B5A99901D24C4426F6C68888CA10B560A95785A4A(}9284C7726A96B85A4A92885A586A284A3A000B1A2,297ZddF01938E92091A4C84C7F26A020A27F8E1FD08E0AD4CA10F78810F260208C264C4824A22020)}3E20A9C49D4403A9,290ddd269D4503A9039D4203A9049D4A03A9009D4B034C56E44B9BA220A9009D48039D4903A9079D42034C56E4F3E6D9,696ndd*}CCC1B6ADA29990888079726C66605B55514C4844403C3935322F2D2A282523211F1D70707047CA270770700707,701xdd0707077070070741FD265445+}4D504F20312D3235353A005048524153452023312D393A0041545441434B20312D,338dd3235353A00444543415920312D3235353A00562E52414E474,}520302D3235353A00562E535045454420312D3235,816dd353A005055534820425245414B20544F2053544F50004E4F204441544100564F4C2E204452-}4F5020302D373A00,526dd5245504541545320312D3235353A00444556494345204E414D453F0043555252454E542056414C55453A00492F,352dd.}4F204552524F5220434F44453A0000006D757369630073796E74686573697A657200000000627900006B656E00,536dd636F6C6C6965720000000000/}2C697374656E000000000000000000000000000032657472696576650000000000,679dd000000000000002E756D626572000000000000000000000000}00000306872617365006368616E67650000000000,457dd000034656D706F0000000000000000000000000000000000000000000000000000000000001}0000000000000000,942D2:SYNMAIN.BAS57dd000034656D706F000000000000000000000000000000000000000000000000000000000000+2 REM *** CASSETTE VERSION ***65 IF PASS=2 THEN FOR X=1 TO 109:PUT #1,0:NEXT X:CLOSE #1:END 70 ? "READY CASSETTE AND PRESS 3}RETURN";:OPEN #1,8,128,"C:":RESTORE 200:FOR X=1 TO 35:READ N:PUT #1,N:NEXT X200 DATA 0,18,221,31,255,31,169,60,141,2,211,1694},0,141,231,2,133,14,169,56,141,232,2210 DATA 133,15,169,0,133,10,169,32,133,11,24,960,18,221,31,255,31,169,60,141,2,211,169V2 REM *** DISK VERSION ***65 IF PASS=2 THEN PUT #1,224:PUT #1,2:PUT #1,225:PUT #1,2:PUT #1,0:PUT #1,32:CLOSE #1:END 70 ? "I6}NSERT DISK WITH DOS, PRESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:SYN.OBJ"90 PUT #1,255:PUT #1,255:PUT #1,0:PUT #1,32:7}PUT #1,111:PUT #1,40PRESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:SYN.OBJ"90 PUT #1,255:PUT #1,255:PUT #1,0:PUT #1,32:+, DATHEXLINDATLIDDBYTPASCHKSUTOTA@ 9} *** ROUNDUP *** 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 ee488A489848AE9E24BDA124BCAA248D0AD48D04D48C16D0AD07D0F007A90 ?}19D5D20D01CBD5428C939F015AD04D0,5284ee0D06D0F00DBDBC24F008A9009DBC24FE53208D1ED0E8E009D002A2008E9E2468A868AA6840030000000 @}0000000,9613ff000000000000000000000000A200BD00E09D0008BD00E19DFF08BD00E29DFF09BD00E39DFF0AE8D0E5A9088DF4,14092ff02A20 A}0BDE9239D0808E8E010D0F5A200BDF9239D1808E8E010D0F5A200BD29249D2808E8E010D0F5A2008A9D00,19575ff039D00049D00059D00069D00079D B}00369D00379D00389D0039E8D0E2A9038D1A368D1D368D20368D1D378D2037,23041ff8D2038A9048D1B368D1E368D21368D1E378D21378D2138A9058 C}D1A39A9068D1B3920D925A9008D0002A9208D01,26542$ff02A9C08D0ED4A93F8D2F02A9038D1DD0A90A8D3002A9228D3102A9118D6F02A9C68DC802A9 D}D08DC1028DC202A9,31378.ff0A8DC0028DC3028DC702A9A88DC402A9E48DC502A9168DC602A9008D08D0A9018D09D08D0AD0A9018D0BD0A9FF,36715 E}8ff8D09D28D0CD0A9308D02D3A9F08D00D3A9348D02D3A9008D07D4A93C8D00D0A9308D01D0A9408D02D0A9448D07,41986BffD0A94C8D06D0A9548D F}05D0A95C8D04D0A9648D03D0A9648D7F24A9008D08D2A9038D0FD2A9648D00D2A91E8D02,47237LffD2A9C88D06D220C12220312920A625A9008D7726A G}D0BD4C919D0F9A9CF8D2202A9248D2302A9018DA225ADA225,52153VffD0FBAD7726F0034C3E29AD2F28D003208F2220762720C1224CE7217070806057 H}5D248050570036805057003680,56322`ff505700368050570036805057003680505700368050575D248050463924410A22A200BD4124DD8122F004901 I}4B0,59914jff05E8E006D0EFA200BD41249D8122E8E006D0F5A200BD41249D7922E8E006D0F5A9748D3722A9228D3822600000,65239tff00000010 J}101010101000001010101010100000000000000000AD00D3C90FF01CA900854DAD00D3C90EF012C90D,67749~ffD00DAD7F24C998F006EE7F24EE7F246 K}0AD7F24C932F0F8CE7F24CE7F2460CEE82330034CF622A9048DE823AEDB,73566ff23BDDC238D1123E8BDDC238D1223E8BDDC238D1723E8BDDC238D18 L}23E8E00CD002A2008EDB23AC7F24A200BD23,78816ff23990004C8E8E023D0F4AD7F24186911A8A200BDFFFF990005BDFFFF990006C8E8E01AD0EE600 M}000263632327A,84216ff323222267C78707070707070707070383E1F030303060C0402000000000000000F1F3F5F5F5F5F5F1F10303030,86597f N}f50A020400000000000081C1CFEFEF6F2F0E0E0E0E030380C040408080000000000000000000F1F3F5F5F5F9F9F,89981ff1F1818182828284850500 O}0000000081C1CFEFEF6F2F2E0E0E0E0202020205050505040000000000000000F1F3F,93255ff5F5F5F5F5F1F18080808080805050400000000081C1C P}FEFEF6F2F0E0E0E0E0606060A0A0A02040000000004523,97003gg5E2377239023A923C2230000FF0306FF18306000FF0000FF00000000000F1F2FCC0 Q}A0A0004FEF0F03048080080,100406gg4F3F1F1C6406000CFEF0F030282800000F7F8F0C1414000CFEF0F018141020701F1F0F0B08080000E0F0E8A82 R}0,103874gg20000033232F32250010101010101000232F373300130000000000000000000000000000000102010201020102,104441gg01020102 S}0102010201020102010201020102010201020102010200AE9B24E030D002A200A000BDF923991808E8,106539ggC8C010D0F48E9B2460000000000000 T}00000000000000000000000000000000000C000602040401020000000101,107861gg00010001000100000000000000000000A9008DA225EE9825EE99 U}25EEA325AD7726F0034C5FE4ADA425F006CEA4,111628gg254CF924208024ADA5258DA425A9008DA225A200E000F073BDBD24F031100620DD284C6025 V}BD9A25F006DE9A25,116455 gg4C6025BDA124E90130069DA1244C5A25A9079DA124FEC724BDB3249D9A254C6025AD98252901F01FBDA1246901,12104 W}2ggC908F00890069DA1244C6025A9009DA124DEC724BDB3249D9A25E8E007D09F20332820EE2520BE2520F8282079,125936gg294C5FE4BDA124E X}902300F9DA1249DA824BDB3249D9A254C6025A90F9DA1249DA1244C60250000000000000000,129837(gg000000000006A200A9D89DAA249DB124A90A9 Y}DB224E8208628E006D0F860A900AAA8BDC724990F22BD55289910,1345092gg22C8C8C8C8C8E8E008D0EA60A900AAA8B90F229DC724C8C8C8C8C8E8E00 Z}8D0F060A201207826BDC724300AC924,140758<ggF013E8E007D0EF60A9019DBD24A9009DC7244CFC25A91E8DFD29A9A88D07D2BD5528C938F00FC937F [}019C936F0,146672Fgg2BC939F0034CFC25CE4D24CE5220F0382086284CFC25CE5220CE4D24CE4D24CE52203024F0222086284CFC25CE,151500Pgg \}5220CE4D24CE4D24CE4D24CE5220CE5220F00830062086284CFC25A9018D77264CFC2500BDBD24F00160BD5420,155973ZggDDC724D005A9019DBD2460 ]}00008000000000000000000000000000000000000000000000000000804040000000,157674dgg00000000000000000000000000000000000000008040 ^}4020200000000000000000000000000000000000000000,157994ngg008040402020101000000000000000000000000000000000000000804040202010 _}100808000000000000000000,158714xgg0000000000000000804040202010100808040400000000000000000000000000000080404020201010080804 `}04,159466gg020200000000000000000000000000804040202010100808040402020101000000000000000000000000000000,159852gg0000000 a}0000000001C2222C181414141413C0000A9012C2F28305A7077D010AD8402F00160A9018D2F28A2008E,162830gg3028AD98252901F0EEA91A8D3128A b}C7F24AE3028BD8C26990003E8C8CE3128D0F338E0CEB0048E302860A91AAC,167882gg7F24A200BD5C27990007C8E8E01AD0F4A9F58D9925A9808D2F2 c}860AD9925F00160A9408D2F28AC7F24A21BA900,173041gg990007C8CAD0F9A9018D302860AD98252901F00160AE3028A9FF0ACAD0FC8D3228AC7F24A d}21BB900032D322899,177885gg0003C8CAD0F3AD30286901C90AF0048D302860A9008D2F2860000000FFA201BD5E20D006E8E008D0F660A9009D,1826 e}68gg5E202066286002050A640AD87600020304002436363636363624000000000000000000A9008D9925BD5D286D65,184962gg288D6528FE5528 f}BD5528C939F008C93AF0049D552860BDE828A8B94D289DAA24B949289D5D28B951289DB324C0,190116gg03F024A9369D5528A9009DC724A9019DBD24 g}A9009D5420FEE828BDE828C904D005A9009DE82860A9399D5528A9,195231gg009DC724A9FF9DBD24AD0AD28DDC284CAF2800CEDC28D005A9019DBD24 h}60000101000200010000010100020001,198851gg00AD6528D00160AD98252903F00160CE6528A005B94124C919F006690199412460A9109941248810 i}EB60A9008D,203171gg6528A005A91099412488D0F860A9088D1FD0AD1FD0C906D0F960203C22203129A9008D2F288D30288D31282021,207502gg j}29A9398D3722A9248D3822A9038D5220A9138D4D24A200BDF0289DE828E8E008D0F56868684C6620AD7726F00F,212388ggA9008D01D28D03D28D05D k}28D07D260ADFB29F012AD6528F01EA9008DFB29A9A88D01D24CB529AD98252902D00A,217592ggA9008D01D2A9018DFB29EEFC29ADFC29C915D005A90 l}08DFC29C900F017C903F01BC90AF00FC90CF013C90FF007,223087ggC911F00B4CEC29A9848D03D24CEC29A9008D03D2ADFD29F006CEFD294CFA298D0 m}7D26001000000000000000000,227475D2:ROUNMAIN.BASggC911F00B4CEC29A9848D03D24CEC29A9008D03D2ADFD29F006CEFD294CFA298D0 82 REM *** CASSETTE VERSION ***65 IF PASS=2 THEN CLOSE #1:END 70 ? "READY CASSETTE AND PRESS RETURN";:OPEN #1,8,128,"C:":RESo}TORE 200:FOR X=1 TO 35:READ N:PUT #1,N:NEXT X200 DATA 0,21,221,31,255,31,169,60,141,2,211,169,0,141,231,2,133,14,169,56,141,p}232,2,133,15,169,102210 DATA 133,10,169,32,133,11,24,961570 DATA 0000000000000000000000000000000000000000000000000000000000q}00000000000000000000000000000000,2274751580 DATA 000000000000000000000000000000000000000000000000000000000000000000000000000r}000000000000000,227475000000000,2274751580 DATA 0000000000000000000000000000000000000000000000000000000000000000000000000002 REM *** DISK VERSION ***65 IF PASS=2 THEN PUT #1,224:PUT #1,2:PUT #1,225:PUT #1,2:PUT #1,102:PUT #1,32:CLOSE #1:END 70 ? t}"INSERT DISK WITH DOS, PRESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:AUTORUN.SYS"90 PUT #1,255:PUT #1,255:PUT #1,0:PUT u}#1,32:PUT #1,4:PUT #1,42ESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:AUTORUN.SYS"90 PUT #1,255:PUT #1,255:PUT #1,0:PUT +,(DATHEXLINDATLIDDBYTPASCHKSUTOTA@w} $$*** BRICKLAYER'S NIGHTMARE *** 990,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15rx};@,9@",/-@"3"<68,-@ L6-A V#A` @`r( CHECKING DATA86-%@y}(LINE:!"8B:,@AF%6-F:A,%F:A,$AV+C(LINE  MISSING!Fq-@z}@@56-@:7<,,&@H[6-@:7%@<%@,,&@Hq6-8,$@%8,#."@*@{} $". @%(% 6-%!A %6-&A-  ""@%2 A< F:A,@A|}dJ( WRITING FILE 6-@,6-A 6#A@ @`J @%n(BAD DATA: LINE dd3F3F3F3F3F3F3F3}}F3F3F3F3F3F3F3F3F3F3F3F3F7070707047802C44002A040404040404040404040404040404,121dd47802C46473341942CA9008D1DD0A9228D2F02A9~}208D3002A9BC8D3102A9E08DF40220C12D20422D20A0322008,169dd32208B2E20422D20F03120B731D03520BB2EADE933D0034CD52CCEFE33D01AADF}C338DFE33AD8402D006ADFD33,356dd8DFE33204D30205C30206B3020AA31ADEA33D0C94CE42C206132CEEB3310B8A200BD3D33C9FFF00909C09D4A33},306ddE84C282DAD8402D0FB854D4CCF2CA9008580A9238581A9008584A9058585A200206931A204A9009D07D0CAD0FA,487ddA9868DC002A9488}DC1028DC2028DC302A9508DF4338D00D0A9788DF6338D01D0A98C8DF7338D02D0A9A08DF833,356$dd8D03D0A9AF8DF5338DF9338DFA338DFB33A9018D}F33320F22FA208BDC4339DAE259DAE269DAE27CAD0F1A9208D,447.dd07D48D1ED060A9008582ADF4028583A9008580A9288581A9008584A9028585205}731A218BD64339DE729CAD0F7,8088ddA9288DF40220752EA9948D3002A92C8D3102A9008DC802A9288DC402A90A8DC502A9D88DC602A9388DC702A93E},615Bdd8D2F02A9038D1DD0A214A9009D4633CAD0FAAD5B33A2069D5333CAD0FAAD5B3309408D4833A9038DEB33A93F8D,702LddEE338D002AA210A}9008580A92A8581A92720622ECAF008A90120622E4C512E601865808580A58169008581ADEE,320Vdd33A000918060A9008580A92A8581A9808584A902}8585A20020693160AD4833290FAAA900CAF0061869044C932E,787`ddAABDCD338DFC33BDCE338DFD33BDCF338DEC33BDD0338DED33A9FA8DE93360AD7}802C90BD03120D32ECEF333D0,190jdd05A9058DF33320F22F60CEF433A933CDF433F012ACF433AEF53320D92FD007ADF4338D00D060EEF43360C907F0},138tdd0BC90EF034C90DF0664C842F200B2F20C1324CC52EEEF433A9C6CDF433F016AEF533ADF433186907A820D92FD0,559~dd07ADF4338D00D06}0CEF43360CEF533A938CDF533F00BACF433AEF53320B12FF003EEF533EEF333A90ACDF333D0,943dd05A9068DF333AEF533A9009D08249DFF2320F22F}60EEF533A9B0CDF533F00FACF433ADF533186907AA20B12FF0,635ddC9CEF5334C472FC90AF00DC906F010C909F013C905F0166020D32E202F2F60200}B2F202F2F6020D32E20652F60,880dd200B2F20652F608CEE338EEF33201230D01CAEEF33ADEE33186904A8201230D00DAEEF33ADEE33186906A82012},266dd30608CEE338EEF33201230D00DACEE33ADEF33186907AA20123060AEF333A9F8186908CAD0FAA8A9088584AEF5,725dd33B97D339D0024E}8C8C684D0F4608A38E9384A4A4AAA9838E9304A4AA8A9008580A92A8581CA301018A5806928,951dd8580A581690085814C2930981865808580A90065}818581A000B18060A9008DFF33201231F0016020773060A901,443dd8DFF33207730F0016020123160A9028DFF3320123120773060A9008580A925858}1ACFF33F006E681884C8230AE,178ddFF33BDF933CDF533D00160B041A58048A58148BDF633A8BDF933186908AA20B12FF0056868A90060AEFF336885},892dd81688580BCF9339180FEF933C8A200A9088584BDC5339180E8C8C684D0F5A90160AEFF33A58048A58148BDF633,393ccA8BDF933AACA20B}12FF0056868A90060AEFF33688581688580DEF933BDF93348186908A8A900918068A84CC530,30ddAEFF33BDF633CDF433D00160B017BDF633186908A}8204731F00160FEF633BDF6339D01D060BCF63388204731F0,792dd0160DEF6334C30318CF033BDF933AA20D92F08AEFF332860A000B1829180207731}208531209331D0F1608AA000,816dd9180208531209331D0F36018A58269018582A583690085836018A58069018580A581690085816038A584E90185,}688 dd84D005A585D00360A585E9008585A90160AEEC33ACED3388D0FDCAD0FA60AD0CD0290E60AD55338DEE33A205FE,679dd5433BD5433C91AD0}08A9109D5433CA10EE88D0E9ADEE33CD5533F00DADEB33C904F006EEEB3320F03160A004A9,331dd00994F3388D0FAACEB33F008A9BD994F3388D0FA6}0AD4833290FC907F003EE4833ADC50248A9058DEE33A90C8D,779(ddC502A9808D00D2A9A68D01D2A000A200205832A9368DC502A9C08D00D2A9A68D01}D2A000A200205832CEEE33D0,9622ddCF688DC502A9008D01D2608AAACAD0FD88D0F960A9098DEE338D00D2A9A08DF2338D01D2A90548A2FFA0FF8EC0,}376<dd0288D0FDADF23338E9038DF2338D01D2CAD0E9EEEE33ADEE338D00D26838E901D0D78D01D26020752E203F2EA9,272Fdd3E8DEE338D5B2AA2}09A95B8580A92A8581A92820622ECAD0F860A9008DEA33AD8402D047A900854DADF4332903,414PddD03CADF43338E908A88DF133AEF533201230C93EF}011ADF533186908AAACF133201230C93ED017A000A9009180,570ZddA93EA0019180A02D20BD31CEE93320133360A9708DF233A9088D00D2ADF2338D01}D2A005A240CAD0FD88D0F8CE,311dccF233ADF233C958D0E6A9018DEA336027212D25002F362532FF0000000000000000000000000000000000000000,}86ndd101112131415161718198090783C1A384848AA8282AAAA8282AAFF999999999999FF1010387CBA488482101038,417xdd3878AC48441010383}8382828101010387CBA381028101038387C3848488090783C1A3848480010FC3A18242400,279bb0010FC3A1824240002123C78B038242266951C2236}3E143608080C0003030C8003020B0002020B0002010B5002,7dd010B8002010A000000000000000000000000000000000000000000000000000000000}000000000000000000000,160D2:BRICMAIN.BAS7dd010B8002010A00000000000000000000000000000000000000000000000000000000012 REM *** CASSETTE VERSION ***65 IF PASS=2 THEN FOR X=1 TO 73:PUT #1,0:NEXT X:CLOSE #1:END 70 ? "READY CASSETTE AND PRESS R}ETURN";:OPEN #1,8,128,"C:":RESTORE 200:FOR X=1 TO 40:READ N:PUT #1,N:NEXT X200 DATA 0,16,88,44,127,44,169,0,141,47,2,169,60,}141,2,211,169,0,141,231,2,133,14,169,56,141,232,2210 DATA 133,15,169,207,133,10,169,44,133,11,24,964,169,0,141,47,2,169,60,e2 REM *** DISK VERSION ***65 IF PASS=2 THEN PUT #1,224:PUT #1,2:PUT #1,225:PUT #1,2:PUT #1,207:PUT #1,44:CLOSE #1:END 70 ? }"INSERT DISK WITH DOS, PRESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:AUTORUN.SYS"90 PUT #1,255:PUT #1,255:PUT #1,128:PU }T #1,44:PUT #1,14:PUT #1,52 RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:AUTORUN.SYS"90 PUT #1,255:PUT #1,255:PUT #1,128:PU  -pppppppppF pppp @A !.!,/'#/-054).'3@planetary@@defense@@koala@pad@$}M@select@/202%3342)''%2ppFE.M0$}A ةԢ滩 )ҩč P#ԩ2ԍ/ЍҢ  e$}0 1#v \<|M} )) 00 1ԩ>$}/ԩЩo7_"L"0 L" UH_")hƆ襇8(ƃi(L"TT$}PP@TP@P@`}#@P}"@8P"`#L4% $} 666666665554443322110//.-,,+*)('&&%$#!  HH檥)n# ԍ$}hh@ئ,ԭ! I Lb䥻 i JJҩ(ƸL3$9x$}JJJJ0а  {+,ʎХƮƌƍƎLb䥥:扤$}i/iйJ*i$揥))$%ƈ參0- ߰,-欥J),,, ҽu-ƺ$} ҽ-ƹ -$淦 0ҽ-Lb    - -E.$} 4 H+T77 ^+!-ƽ--ǽ9-E- )]-Q-i- iإ$}ML)7) 7)ƅ )L! C'ř  e( ( ) ) v& ) #(Љ0- - -$} -L%L%@潤---`0-%0.8%%0%------ƽLz&--y,ɠ$}-y,` & ,Lz&,1L& &&&&eŅeąe0e)JJe拠``$}-`-Ʃ.!.0SO ŭH ), (i#-, (i7-,8哅,L( 0 )g$},- -L' )g,- --- *ʝ-.˝9.ȝ-ɝ .` )d`  -ʽ-`0P-8,$}-ɠ-%J-_٩ L(-` --808 J *ȝ.ɝ .ʝ1.˝=.-`Dž-$}R * * * *-i '-., ߰i,Ƈ-` -X-½-Æ &=, *-$}"½-` &,1…Å ^&-Lz),=,О``0 S.Ɯ ƅ ) ^&P$})` )-|-}L!ҍҍ`0M-'FӰB-;7)c)&0" $}LJ* 6+--.-8,-8(J *0 * ^&`.}-.*̽!.} .!.*ͽ-.-eL$}*-8̝-9. -8L*-e͝-`Ш `ʥŔL+ʥ8咅ȩ˥ŕL+˥8哅ȥ0 0L&+$}`uة f+`P )F.JJJJE.`͕εҕ)pRqI΅$} +~>vv/*@@@@4~~I$(($}0 ?lvl $}  2Z2P(2T2 ]* _- *- -L- (} eiڅ:ii^;i` |$ * w*f: ]*"/ |* %+D C 8. *L$ B.L7$ I.BJK V0ڢD:EHH(}I B V0 8.L L#: #`LW. -L. -L. 8 ]*L.*':" - A: ]*L.(} - : ]*L. -Lr.: _- -L- -L.: -L{.:: y%㤤:^;:9 ]** _- -(}L.:&:;l^; y%^;עm^;0q``LW. *Li.L$L% - -L. &:L. -L{.7 ](}*: _-L. Dڭ: -۠8 ]*L.K: ::::Ӡ8 ]* w* Dڥ -נ8 ]* w* Dڥ -Q &(}:L. -L{.7 ]*!: _-L.: Ƞ8 ]*8 ]* &輟& ]*L.7?97777?9787777777777[8877(}}8}878777}8}87777777877t8 'LW.L%$ -L. -L. *::; _-L._;L.(}:$ !::8 ]* :9 ]*L. :i:L& :8:L&;::3::+:& * w(}*U: ]*"/L'L.LW. -L.": _- *-L- ?9 ]*1 ɠ7 ]*$ Ǡ6 ]*" #%' S9 ]*L.LW(}. -L. - -L.: Ƞ8 ]*L.U8 ]*:9 ]*#;; _- *-L. -L. 9 ]*L.Li.(}:'; _- *-L- -L.L.L$LW. -%; - Ġ9 ]*L.L.&Li.: :(}:L-L.! -L. -L. ۠9 ]*L.LW.(;:L( -L.LW. -/: *  w*9 ]*L.);(};;L(L. -L.LW.:A8 ]* -*;; _- -L. -L. -L. -L. LW.L$HHH(}O*V* ԍЌ hhh@p`p`p`DE BHILV UT`dҩҩʎ`++`@(}ԅj B VKBD4E J Vԍ/ ЍЍЍТtRp`5 ]*`5 ]*`(}) *L%+ q++ ɛ ~a8 Тƃ`,'<67 "&lj;k+*opui-=vcbxz436521, .nm/reytwq(}907~8<>fhdgsa @`uu=e-U}<<<<<======>>>>>>>?آ  u*膄 %+ ~ɛ *L+ , V %+ɛ2~(}0 , V䥄 , V愥 * %+ɛ~ , V->>****)>)+->`)إU i0Э+ [*<(}ƂI[*L_䩰:ԭ: ؠȱ ʈ! w* ]*` BHI`E6 ]*` * * Lu* *(}` *0 Y-<  u* 9 ]*`.3%75$ *  u*0 榪44 ]*祦%7 ]*` - u*(}:0 榪44 ]*楦%7 ]*` -6 ]*L.:``ՙ`` ؠȱ)ȩL]*  w*(}*9 ]* w*`9 ]*L BLV4LM.4DE`k6 ]*jǠ6 ]*a7 ]*X٠6 ]*U6 ]*L6 ]*C6 ]*:7 ]*(}1k7 ]*"x7 ]*7 ]*8 ]*8 ]* |*LG! *L:"NSEWUDQXATAKGETPULDROREMLOOEXASEAREAPUSPREOPECLOUSEKILSHOFIRBRESMAIN(}SUNSHOLUNLCUTPOULUBGREWEAGO $$.%%%%%&'''.i..E(E(..(())E)))**#*HATDOOLOCSCAGRATRAAIRSWICABSIGCAPGREREDGO(}LSILWHIGAUPERSCODISDUCSLOBOLUNIPISSCRNOTID CUTCARWREMASGASKNISHAMANSUIKEYBREBUTINV:^;:::(}: ::%H0;'n00:00^;`  !      (}    $%&'-2689;?GIJQVZ[\]^cfnrtuv{~      *+016<=BCDHNTUZ`flrstx~Sonar sphereEsc(}ape tubeAccess tunnelCaptain's quartersForward passageRadio roomLong corridorSonar stationBallast controlCommand stat(}ionNavigation centerUpper missile bayTorpedo roomWeapons lockerShower stallsCrew's quartersGalleyVentilation ductFan(} roomMissile controlEquipment bayLower missile bay %8HSao,0111111111111111112222Closed hatchLocked doorBl(}ank scannerClosed grateTraitor with pistolClosed airlockLocked arming switchPower cableSignDead captainGreen buttonR(}ed buttonGold buttonSilver buttonWhite buttonDepth gaugePeriscopeDigital displayDuct down to fan roomSlot in airlock(}Bolted-down sonar unitPistolTiny screwdriverSuicide noteSecurity IDCable cuttersCardWrenchGas maskDull knifeShampoo(}Tactics manualRadiation suitKeyOpen hatchOpen doorActive scannerOpen grateDead traitorOpen airlockActivated switch(}Severed cableRadioactive sonar unitjw &3?IYo *4CN[hy2222222222233333333333333333333344444444444E:(}C:D1:GAME.DATBrian Moriarty'sCRASH DIVE(C)1984 ANALOG ComputingPress Ԡ to play new gamePress Π to restore(} old gameRestore from isk or assette?ȠšͩԠΠ ӠŠ Ӡ(}ԠӠ Ҡ Šՠ Š ǠSyntax:Bad commandBad verbBad nounTh(}at's impossibleCan't go that wayType Y to quit game:OkayAlready holding itIsn't hereCan't do that yetYour arms are ful(}l!Not enough room hereBe more specificYou don't have itNothingType N S E W U or DRefer to it by colorType I for invent(}oryDoesn't helpWhy bother?Seems ordinaryYou found something!It's airtightEnemy approaching!Screwed in placeLooks dang(}erousNeeds key to activateBolts are tight & rustyDANGER: Radiation zone!Brains blown outShampoo all used upBANG!Accept(}s security ID cardIt glowsSee photo in ANALOG #18Ace of Spades!Easier said than doneOnly 1 bulletNo bulletsX =Y =FAT(}HOMSNothing happensSub levels offSub divesNoneA cloud of poisonous gaskills you instantly!Lock is very secureAlready (}openyou are DEADEnemy captures the sub andIt falls down the pipeLock destroyed!Try examining thingsScrewdriver's too ti(}nyKey won't fitA jolt of high voltageTraitor shoots you andSub hits bottom!A blast of radioactivityBolts won't let you(}Congratulations!Save game to isk or assette?Connected to cableon't let you(pB.SYNMAIN BASB2SYNCASS LSTB5SYNDISK LSTB68ROUNMAINBASBnROUNCASSLSTBsROUNDISKLSTB*vBRICMAINBASBBRICCASSLSTBBRICDISKLSTBDEFENCE EXEB8CRASH EXELX;M+X; BLOAD -- load a binary file to memoryNX;O BLOAD P PHR Q CLOSE ROPEN === S QQLOADT P.}LR UA. CONTROL macrosAX;0X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X;&X; The control macros of KER.}NEL.M65X;0X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X;X;0X; GOSUB -- same as JSR except saves X&Y regsX;.} GOSUB  PUSHX  PUSHY   PULLY  PULLX X;X; IFEQ, IFNE, IFGT, IFLT --/X; compare two int.}eger values and branchX; if condition is metX; IFEQ DEQCMP =  H@THEN!  @THEN IFNE .}DEQCMP =  F@THEN!  @THEN IFLT DCMP =  I@THEN!  @THEN IFGT DCMP.} =  I@THEN!  @THENX;7X; DOI, LOOPI -- loop control using the 'I' variableX; DOI DPOKE Q.}QLOOP= DPOKE QQLOOP= Q>4?K PQQLOOP Q>5?K PQQLOOP ?K LOOPI DINC QQL.}OOP!IFGT QQLOOP=QQLOOP=@LIQQQLOOP 5QQQLOOP 5:@LIX;7X; DOJ, LOOPJ -- loop control .}using the 'J' variableX; DOJ DPOKE QQLOOP= DPOKE QQLOOP= Q>4?K PQQLOOPQ>5?K.} PQQLOOP?K LOOPJ DINC QQLOOP$IFGT QQLOOP=QQLOOP=@LJQQQLOOP5QQQLOOP.}5:@LJX;7X; DOK, LOOPK -- loop control using the 'K' variableX; DOK DPOKE QQLOOP= D.}POKE QQLOOP = Q>4?K PQQLOOPQ>5?K PQQLOOP?K LOOPK DINC QQLOOP$IFGT.} QQLOOP=QQLOOP =@LKQQQLOOP5QQQLOOP5:@LK TRAP VPOKE QQTRAP= p#A. .} MISCellaneous macrosAqX;r0X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sX;t*X; Miscellaneous macros from KERNEL.M65u.}X;v0X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wX;x(X; DINC -- increment a word (2 bytes)yX;z DINC {# |H?.}K} # ~?KX;2X; VPOKE -- poke an immediate value into a wordX; VPOKE  Q>4 P  Q>5  P .}X;+X; DPOKE -- could be better called DMOVEX; DPOKE    Q P  Q  P Q.}> P Q> P X; X; POKE -- a single byte pokeX; POKE  PLDA P X;.X; WA.}IT -- wait a certain number of jiffiesX; WAIT POKE  = ?KQ H?KX;(X; STOP -- stop until S.}TART is pushedX; STOP  QQSTOPX;&X; SOUND -- just like BASIC's soundX; SOUND POKE =Q>.}PҶP2   $>   PLDA T?> 2 Q>   PLDA  T16 .}P PLDA M>LP9 PLDA P9X;%X; BMOVE -- move a block of memoryX; BMOV.}E VPOKE QQPASS= VPOKE = VPOKE =  QQBMOVX;9X; PGMOVE -- special move of a single pag.}e (256 bytes)X; PGMOVE POKE =  PLDA  QQPGMVX;3X; BCLR -- clear (set to zero) a block of m.}emoryX; BCLR VPOKE = VPOKE QQPASS=  QQBCLRX;-X; PGCLR -- fast clear of a page of memo.}ryX;X; PGCLR  PUSHY POKE = POKE =??L1P@73H?L1 PULLY a page of memo,o QQVBVR bQQHTM QQHTP  QQVM  QQHP  QQVP QQOVP QQPBAS  QQMBAS 2}QQPFLG  QQMFLG QQSHAP QQPSAV  QQHT QQMASK = =0= QQSMSZ 9QQMSM ===2}========@== =0=QQMBIT === PLDX   $> $  PMGR  PH2}R  PLDA  QQPMGR PLR  SETVEC VPOKE QQVBVR=    SHAPE  PUSHX  PLDA  T?> Q2}>5 PQQSHAP9 Q>4  PQQSHAP9 PULLX  PMCOLR  PUSHX  PLDX  PLDA  T16  PQQCMP2} PLDA , OQQCMPP9 PULLX ! PMOVE " PUSHX # PLDX $ PLDA % PQQHP9& PLDA ' P2}QQVP9(Q>) PQQPFLG9* PULLX +, MMOVE - PUSHX . PLDX / PLDA 0P91 PLDA 2 PQQVM93Q>2}4 PQQMFLG5 PULLX 67 PSIZE 8 PUSHX 9 PLDX :0;A< PLDX =P9> PLDA ? PQQHTP9@ PULLX 2}AB MSIZE C PUSHX D PLDX E0FAGT?HT?I PQQCMPJ PLDA K,L OQQCMPM>N QQQMSM9O LQQSMSZP P2}QQSMSZQP R PLDX S PLDA T PQQHTM9U PULLX VW MPLC X&Y PLDX Z QQQMBIT9[ PLDX \M2}9]5^$_7`a MPFC b&c PLDX d QQQMBIT9e PLDX fM9g5h$i7jk PPLC l&m PLDX2} n QQQMBIT9o PLDX pM 9q5r$s7tu PPFC v&w PLDX x QQQMBIT9y PLDX zM9{5|$2}}7~)X;************************************X; PMGR RUNTIME CODE)X;************************************2} QQPMGRPԅ,O>> PQQMBAS2 &QQPBAS2&QQPBAS2&QQPBAS2&QQPBASQ>P2}ГQ>>P/Q> %>4QQAPMM $>5QQAPMM \: QQAPMM%>?AL1Q8 PQQPSAV83)> H?AL12}$>?AL2 QQQHP9P9 QQQOVP9 RQQVP9 FQQNPX QQQPFLG9 FQQNPX QQQPBAS9Pέ QQQOVP9Pͯ QQ2}QHTP9 PQQHT%>C?AL3P@73 )QQHT H?AL3AT?? QQQSHAP8P˽QQQSHAP8P̿ QQQVP92}P PQQOVP9%>?AL4Q@7P@73 )QQHT H?AL4 QQNPX2(> H?AL2 QQQMFLG FQQRET Q2}QQMBASPQ>P??AL8P@73 H?AL8$>?AL5 QQQHTM9 PQQHT QQQVM9P%>?AL62}Q@7 LQQMASK9P@73 )QQHT H?AL62(> H?AL5 QQRET$>?AL7 QQQPSAV9P9Q> PQ3}QMFLG PQQPFLG92(> H?AL7 !@QQVBVR:2(> H?AL5 QQRET$>?AL7 QQQPSAV9P9Q> PQ02X;/X; The fine scroll macro library and support5X; subroutines. They are heavily interdependent,X; so must 7}always be .INCLUDEd togetherX; XDIM  YDIM  SCRBAS  CSRBAS  SDSPL  SHSROL  SVSROL  HS7}PEED  VSPEED  X0LIM  Y0LIM  LINES  JMPBYT  RVBIV  XLOC  YLOC  CWIDE  CHIGH 7} MLINES  SRBYTW  DIR  HCOUNT  VCOUNT  SCROLL  MODE 0OLDVBV ;; Will hold previous vb7}lank vector'VVBLKD$;; Deferred vblank vector0SETVBV\;; OS routine to set vblank vector X;  SCRDIM  PLDA 7}  > L>p PJMPBYT00 &MODEPOKE XDIM= POKE YDIM= VPOKE SCRBAS= VPOKE SDSPL= 7} QQDSRL SETXY POKE XLOC= POKE YLOC=  QQSXYSTOPSCROLL $OLDVBV %OLDVBV Q>!7} SETVBV"#QQCWID =====$QQCHIG = ====%QQMLIN === == & QQDSRL'DPOKE CSRBA7 }S=SCRBAS( $MODE) QQQCWID9* PCWIDE+ QQQCHIG9, PCHIGH- QQQMLIN9. PMLINES/Q>0 PXLOC1 PYLOC2 PVSPEED3 P7 }HSPEED4Q>5 PSCROLL6Q>7 PSHSROL8 PSVSROL9 QCWIDE:>;Q><(>= HQQSL2>V?? QQSL2@V?AV?B PSRBY7 }TWC QXDIMD;E SSRBYTWF PX0LIMG "X0LIMH QYDIMI;J SMLINESK PY0LIML "Y0LIMM QMLINESNT?O,P OMLINESQ P7 }LINESR #LINESS #LINEST #LINESU$X; WRITE BEGINING & END OF D LISTVDPOKE =SDSPLWQ>pX%>YP@7Z3[P@7 }7\3]P@7^ %LINES_3`3a3bQ>BcP@7d3eQfP@7g3hQiP@7jQ>k3lP@7m3nP@7o3p7}P@7qQ>Ar3sP@7t QSDSPLu3vP@7w QSDSPLx3yP@7zDPOKE RVBIV=${3DPOKE OLDVBV=VVBLKD;; Sav7}e old vblank vector| %>4QQAUTS} $>5QQAUTS~Q> SETVBV;; SETVBVQ>P QQSL3Q HQQSL3DPOKE 07}=SDSPLQ>P: QQAUTSX; SAVE 212 & 204 ON STACK-Qԍ5 Q5Q̑5 Q5DPOKE7} =CSRBASDPOKE =SDSPL%> QQTL1 QJMPBYTP@73QԜP@73 QP@7X; ADD XDIM TO 217}2,Qԣ OXDIMPԥ QO> P3 )LINES HQQTL1X; WRITE LAST MODE LINE QJMPBYTM>WP@7}73QԱP@73 QP@7X; WRITE SHADOWS QSHSROLP;; HSCROL QSVSROLPԺ7 P77}P̾7 P7P QSCROLLPDIRVDIREQQTNU;; NO UPWARD SCROL #VCOUNT QVSPEED RVCOUNT EQQTNU7}Q> PVCOUNT "SVSROL IQQTNU QYLOC HQQTASNQ> PSVSROL FQQTNU QQTASN QCHIGH PSVSROL "YLO7}C; QCSRBAS SXDIM PCSRBAS EQQTNU"CSRBAS QQTNU X; DOWN ?VDIR EQQTNV #VCOUNT QVSPEED R7}VCOUNT EQQTNVQ> PVCOUNT #SVSROL QCHIGH RSVSROL EQQTNVX; CHECK LIMIT QYLOC RY0LIM HQQTASN27} QCHIGH PSVSROL HQQTNV QQTASN2Q> PSVSROL #YLOC, QCSRBAS OXDIM PCSRBAS DQQTNV#CSRBAS7} QQTNV X; LEFT?VDIR EQQTNL #HCOUNT QHSPEED RHCOUNT EQQTNLQ> PHCOUNT #SHSROL QCWIDE7} RSHSROL  EQQTNL X; CHECK LIMIT  QXLOC  HQQTASN3  QCWIDE PSHSROL HQQTNL QQTASN3Q> PSHSROL "XLO7}C "CSRBASQ> RCSRBAS HQQTNL"CSRBAS QQTNL X; RIGHT ?VDIR EQQTNR #HCOUNT QHSPEED RHCOU7}NT  EQQTNR!Q>" PHCOUNT# "SHSROL$ IQQTNR%X; CHECK LIMIT& QXLOC' RX0LIM( HQQTASN4)Q>* PSHSROL+ FQQT7}NR, QQTASN4- QCWIDE. PSHSROL/ #XLOC0 #CSRBAS1 DQQTNR2#CSRBAS3 QQTNR4 !@RVBIV:5 QQSXY6 QX0LIM7 RXL7}OC8BGT QQSX19 PXLOC: QQSX1; QY0LIM< RYLOC=BGT QQSX2> PYLOC? QQSX2@DPOKE CSRBAS=SCRBASA %YLOCB 7}FQQSXL6C QQSXL4D,E QCSRBASF OXDIMG PCSRBASH DQQSXL5I#CSRBASJ QQSXL5K1L HQQSXL4M QQSXL6NX; ADD IN7 } XLOCO,P QCSRBASQ OXLOCR PCSRBASS DQQSXL7T#CSRBASU QQSXL7VX; CLEAR SHADOWSWQ>X PSHSROLY PSVSROLZ7!}7!@OLDVBV:;; Exit through old vertical blank vector.#CSRBASU QQSXL7VX; CLEAR SHADOWSWQ>X PSHSROLY PSVSROLZ4510 .OPT NOLIST0980 .OPT NOEJECT0990 .TITLE "A sample device driver for Atari's OS"1000 .PAGE "--- general remarks -;#}--"1010 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1020 ;1030 ; The "M:" driver --1040 ; Using memory as a device1050 ;1060 ; In;$}cludes installation program1070 ;1080 ; Written by Bill Wilkinson1090 ; for January, 1982, COMPUTE!1100 ;1110 ;;;;;;;;;%};;;;;;;;;;;;;;;;;;;;;;;1120 ;1130 ; EQUATES INTO ATARI'S OS, ETC.1140 ;1150 ICAUX1 = $34A ; The AUX1 byte of IOCB1160 ;;&}1170 OPOUT = 8 ; Mode 8 is OPEN for OUTPUT1180 ;1190 MEMLO = $2E7 ; pointer to bottom of free RAM1200 MEMTOP = $2E5 ; poin;'}ter to top of free RAM1210 ;1220 FR1 = $E0 ; Fltg Pt Register 1, scratch1230 ;1240 STATUSOK = 1 ; I/O was good1250 STATU;(}SEOF = $88 ; reached an end-of-file1260 ;1270 HATABS = $31A1280 ;1290 HIGH = $100 ; divisor for high byte1300 LOW = $FF ;)}; mask for low byte1310 ;1320 .PAGE "The installation routine"1330 ;====== CHANGE NEXT LINE TO SUIT YOUR MEMORY ======13;*}40 *= $30001350 ; This first routine is simply1360 ; used to connect the driver1370 ; to Atari's handler address1380 ; ;+}table.1390 ;1400 LOADANDGO1410 LDX #0 ; We begin at start of table1420 SEARCHING1430 LDA HATABS,X ; Check device name;,}1440 BEQ EMPTYFOUND ; Found last one1450 CMP #'M' ; Already have M: ?1460 BEQ MINSTALLED ; Yes, don't reinstall1470 IN;-}X1480 INX1490 INX ; Point to next entry1500 BNE SEARCHING ; and keep looking1510 RTS ; Huh? Impossible!!!1520 ;1530;.} ; We found the current end of the1540 ; table...so extend it.1550 ;1560 EMPTYFOUND1570 LDA #'M' ; Our device name, "M:";/}1580 STA HATABS,X ; is first byte of entry1590 LDA #MDRIVER&LOW1600 STA HATABS+1,X ; LSB of driver addr1610 LDA #MDRI;0}VER/HIGH1620 STA HATABS+2,X ; and MSB of addr1630 LDA #01640 STA HATABS+3,X ; A new end for the table1650 ;1660 ; now;1} change LOMEM so BASIC won't1670 ; overwrite us.1680 ;1690 MINSTALLED1700 LDA #DRIVERTOP&LOW1710 STA MEMLO ; LSB of to;2}p addr1720 LDA #DRIVERTOP/HIGH1730 STA MEMLO+1 ; and MSB therof1740 ;1750 ; and that's all we have to do!1760 ;1770 ;3}RTS1780 ;1790 ;1800 ;;;;;;;;;;;;;;;;;;;;;;;;;;;1810 ;1820 ; This entry point is provided1830 ; so that BASIC can reconn;4}ect1840 ; the driver via a USR(RECONNECT)1850 ;1860 RECONNECT1870 PLA1880 BEQ LOADANDGO ; No parameters, I hope1890 ;5}TAY1900 PULLTHEM1910 PLA1920 PLA ; get rid of a parameter1930 DEY1940 BNE PULLTHEM ; and pull another1950 BEQ LOAD;6}ANDGO ; go reconnect1960 ;1970 .PAGE "The driver itself"1980 ;1990 ; Recall that all drivers must2000 ; be connected to;7} OS through2010 ; a driver routines address table.2020 ;2030 MDRIVER2040 .WORD MOPEN-1 ; The addresses must2050 .WORD ;8}MCLOSE-1 ; ...be given in this2060 .WORD MGETB-1 ; ...order and must2070 .WORD MPUTB-1 ; ...be one (1) less2080 .WORD M;9}STATUS-1 ; ...than the actual2090 .WORD MXIO-1 ; ...address2100 JMP MINIT ; This is for safety only2110 ;2120 ; For man;:}y drivers, some of these2130 ; routines are not needed, and2140 ; can effectively be null routines2150 ;2160 ; A null rou;;}tine should return2170 ; a one (1) in the Y-register2180 ; to indicate success.2190 ;2200 MXIO2210 MINIT2220 LDY #1 ; ;<}success2230 RTS2240 ;2250 ; If a routine is omitted because2260 ; it is illegal (reading from a2270 ; printer, etc.), s;=}imply pointing2280 ; to an RTS is adequate, since2290 ; Atari OS preloads Y with a2300 ; 'Function Not Implemented' error;>}2310 ; return code.2320 ;2330 .PAGE "The driver function routines"2340 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2350 ;2360 ; Now;?} we begin the code for the2370 ; routines that do the actual2380 ; work2390 ;2400 MOPEN2410 LDA ICAUX1,X ; Check type o;@}f open2420 AND #OPOUT ; Open for output?2430 BEQ OPENFORREAD ; No...assume for input2440 LDA MEMTOP2450 STA MSTART ; ;A}We start storing2460 LDY MEMTOP+1 ; ...the bytes2470 DEY ; ...one page below2480 STY MSTART+1 ; the supposed top of mem;B}2490 ;2500 ; now we join up with mode 4 open2510 ;2520 OPENFORREAD2530 LDA MSTART ; simply move the2540 STA MCURRENT ;C}; ...start pointer2550 LDA MSTART+1 ; ...to the current2560 STA MCURRENT+1 ; ...pointer, both bytes2570 ;2580 LDY #STA;D}TUSOK2590 RTS ; we don't acknowledge failure2600 ;2610 ;2620 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2630 ;2640 ; the routine ;E}for CLOSE of M:2650 ;2660 MCLOSE2670 LDA ICAUX1,X ; check mode of open2680 AND #OPOUT ; was for output?2690 BEQ MCLRE;F}AD ; no...close input 'file'2700 ;2710 LDA MCURRENT ; we establish our2720 STA MSTOP ; ...limit so that2730 LDA MCURRE;G}NT+1 ; ...next use can't2740 STA MSTOP+1 ; ...go too far2750 ;2760 MCLREAD2770 LDY #STATUSOK2780 RTS ; and guaranteed;H} to be ok2790 ;2800 ;2810 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2820 ;2830 ; This routine puts one byte2840 ; to the memory for;I} later2850 ; retrieval.2860 ;2870 MPUTB2880 PHA ; save the byte to be PUT2890 JSR MOVECURRENT ; get ptr to zero page2;J}900 PLA ; the byte again2910 LDY #02920 STA (FR1),Y ; put the byte, indirectly2930 JSR DECCURRENT ; point to nxt byte;K}2940 RTS ; that's all2950 ;2960 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2970 ;2980 ; routine to get a byte put2990 ; in memory bef;L}ore.3000 ;3010 MGETB3020 JSR MSTATUS ; any more bytes?3030 BCS MGETRTS ; no...error3040 LDY #03050 LDA (FR1),Y ; ye;M}s...get a byte3060 JSR DECCURRENT ; and point to next byte3070 MGETRTS3080 RTS3090 ;3100 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;N};;3110 ;3120 ; check the status of the driver3130 ;3140 ; this routine is only valid3150 ; when READing the 'file'...31;O}60 ; "M:" never gets errors when3170 ; writing.3180 ;3190 MSTATUS3200 JSR MOVECURRENT ; current ptr to zero page3210 C;P}MP MSTOP ; any more bytes to get?3220 BNE MSTOK ; yes3230 CPY MSTOP+1 ; double chk3240 BNE MSTOK ; yes, again3250 LDY;Q} #STATUSEOF ; oops...3260 SEC ; no more bytes3270 RTS3280 ;3290 MSTOK3300 LDY #STATUSOK ; all is okay3310 CLC ; fla;R}g for MGETB3320 RTS3330 .PAGE "Miscellaneous subroutines"3340 ;3350 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3360 ;3370 ; final;S}ly, we have a couple of3380 ; short and simple routines to3390 ; manipulate MCURRENT, the ptr3400 ; to the currently acces;T}sed byte3410 ;3420 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3430 ;3440 ; MOVECURRENT simply moves3450 ; MCURRENT to the floating;U}3460 ; point register, FR1, in3470 ; zero page. FR1 is always3480 ; safe to use except in the3490 ; middle of an expr;V}ession.3500 ;3510 MOVECURRENT3520 LDA MCURRENT3530 STA FR1 ; notice that we use3540 LDY MCURRENT+1 ; both the A and3;W}550 STY FR1+1 ; Y registers...this3560 RTS ; is for MSTATUS use3570 ;3580 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3590 ;3600 ;;X} DECCURRENT simply does a two3610 ; byte decrement of the MCURRENT3620 ; pointer and returns with the3630 ; Y register ;Y}indicating OK status.3640 ; NOTE that the A register is3650 ; left undisturbed.3660 ;3670 DECCURRENT3680 LDY MCURRENT ;Z}; check LSB's value3690 BNE DECLOW ; if non-zero, MSB is ok3700 DEC MCURRENT+1 ; if zero, need to bump MSB3710 DECLOW37;[}20 DEC MCURRENT ; now bump the LSB3730 LDY #STATUSOK ; as promised3740 RTS3750 .PAGE "RAM usage and clean up"3760 ;3;\}770 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3780 ;3790 ; END OF CODE3800 ;3810 ;3820 ; Now we define our storage3830 ; locations.;]}3840 ;3850 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3860 ;3870 ;3880 ; MCURRENT holds the pointer to3890 ; the next byte to be PUT;^} or GET3900 MCURRENT .WORD 03910 ;3920 ; MSTOP is set by CLOSE to point3930 ; to the last byte PUT, so GET3940 ; won't t;_}ry to go past the end3950 ; of data.3960 MSTOP .WORD 03970 ;3980 ; MSTART is derived from MEMTOP3990 ; and points to the;`} first byte4000 ; stored. The bytes are stored4010 ; in descending addresses until4020 ; MSTOP is set by CLOSE.4030 MSTA;a}RT .WORD 04040 ;4050 ; DRIVERTOP becomes the new4060 ; contents of MEMLO4070 DRIVERTOP = *+$FF&$FF004080 ; (sets to next;b} page boundary)4090 ;4100 ;4110 ; The following is how you make4120 ; a LOAD-AND-GO file under4130 ; Atari's DOS 24140 ;c};4150 *= $2E04160 .WORD LOADANDGO4170 ;4180 ;4190 .END4120 ; a LOAD-AND-GO file under4130 ; Atari's DOS 24140 8B)AIOMAC.LIB -- OSS system I/O macrosAA Support MacrosA 10IOCB2 AYou must include SYSEQU.M65 ahead of th?e}is!!AX;$6X; These macros are called by the actual I/O macros.9X; to perform the rudimentary register load functions.?f}8X;BX;LX; MACRO: @CHVX;`6X; Loads IOCB number (parameter 1) into X register.jX;t 7 then a memory location1X; is assumed to?h} contain the channel number.X; @CH   Q T?T?T?T?>  $> (X;2X;<X; MAC?i}RO: @CVFX;P:X; Loads Constant or Value into accumultor (A-register)ZX;d+X; If value of parameter 1 is 0-255, @CVn+X; ?j}assumes it's an (immediate) constant.xX;'X; Otherwise the value is assumed to+X; be a memory location (non-zero page).?k}X;X;X; @CV   Q> Q X;X;X;X;"X; MACRO: @FL,X;65X; @FL is used to e?l}stablish a filespec (file name)@X;J-X; If a literal string is passed, @FL willT'X; generate the string in line, jump^&X;?m} around it, and place its addressh/X; in the IOCB pointed to by the X-register.rX;|(X; If a non-zero page label is passed?n}*X; the MACRO assumes it to be the label.X; of a valid filespec and uses it instead.X;X;X; @FL   ?o} !   @F = Q>4@F PICBADR9 Q>5@FPICBADR9 Q>4  PICBADR9& Q>5 0PICBADR9:D?p}NA XIO macroAXX;bX; MACRO: XIOlX;v/X; FORM: XIO cmd,ch[,aux1,aux2][,filespec]X;%X; ch is given as in the?q} @CH macro3X; cmd, aux1, aux2 are given as in the @CV macro+X; filespec is given as in the @FL macroX;5X; performs f?r}amiliar XIO operations with/for OS/A+X;/X; If aux1 is given, aux2 must also be given8X; If aux1 and aux2 are omitted, ?s}they are set to zero1X; If the filespec is omitted, "S:" is assumedX; XIO  3 % AXIO: wrong number o?t}f argumentsA  @CH   @CV *PICCOM9;; COMMAND4  > @CV H PICAUX19R @CV \ PICAUX29fp?u}Q>z PICAUX19 PICAUX29 3 @FL AS:A @@IO @FL @@@IO: CIOA ?v} OPEN macroAX; X; MACRO: OPEN X; (X; FORM: OPEN ch,aux1,aux2,filespec$ X;. %X; ch is given as in the @CH macro8 1?w}X; aux1 and aux2 are given as in the @CV macroB +X; filespec is given as in the @FL macroL X;V 1X; will attempt to open the ?x}given file name on` /X; the given channel, using the open "modes"j X; specified by aux1 and aux2t X;~ OPEN   &?y} AOPEN: wrong number of argumentsA    XIO COPN= = = =   XIO COPN= = = =    ?z} A BGET and BPUT macrosA X; X; MACROS: BGET and BPUT X; X; FORM: BGET ch,buf,len X; BPUT ch,buf,le?{}n( X;2 %X; ch is given as in the @CH macro< .X; len is ALWAYS assumed to be an immediateF 1X; and actual value...never a m?|}emory addressP /X; buf must be the address of an appropriateZ X; buffer in memoryd X;n +X; puts or gets length bytes to/f?}}rom thex 0X; specified buffer, uses binary read/write X; X; X; first: a common macro X; @GP @CH  Q> ?~} PICCOM9 Q>4  PICBADR9 Q>5  PICBADR9 Q>4  PICBLEN9 Q>5  PICBLEN9"  CIO, 6 X;@ B?}GET J  T ' ABGET: wrong number of parametersA^ h @GP = = =CGBINRr |  X; BPUT   ' AB?}PUT: wrong number of parametersA  @GP = = =CPBINR   X; A PRINT macroA X; X; MACRO: PRINT ?}X; (X; FORM: PRINT ch[,buffer[,length]] X; !X; ch is as given in @CH macro& (X; if no buffer, prints just a RETURN0 %X;?} if no length given, 255 assumed: X;D 8X; used to print text. To print text without RETURN,N -X; length must be given. See?} OS/A+ manualX X;b 2X; EXCEPTION: second parameter may be a literall .X; string (e.g., PRINT 0,"test"), in whichv -X; case?} the length (if given) is ignored. X; PRINT  3  ( APRINT: wrong number of parametersA    ?}  !   @IO = @GP =@IO= =CPTXTR    @GP = ==CPTXTR  @GP = ?}= =CPTXTR  * 4 ! > @IO H @GP =@IO==CPTXTRR \ f p X;z A INPUT macroA X; X; MACRO:?} INPUT X; X; FORM: INPUT ch,buf,len X; %X; ch is given as in the @CH macro )X; buf MUST be a proper buffer address?} 6X; len may be omitted, in which case 255 is assumed X; ,X; gets a line of text input to the given 'X; buffer, maximu?}m of length bytes X; INPUT  3 ( AINPUT: wrong number of parametersA$  .@GP = ==?}CGTXTR8B@GP = = =CGTXTRLV`jA CLOSE macroAtX;~X; MACRO: CLOSEX;X; FORM: CLOSE ch?}X;%X; ch is given as in the @CH macroX;X; closes channel chX; CLOSE   ( ACLOSE: wrong number of par?}ametersA @CH  Q>CCLOSE  PICCOM9 CIO(2X;<-X;;;;;;;;;;; END OF IOMAC.LIB ;;;;;;;;;;;;FX; of par<vs