BUSMASTER--attachingIBM-PCorMultibusperipheralstoan1108withExtendedProcessorOption(CPE)Initiallyreleased:25Sept1984MichaelHerringEdited:22Oct1984IBMPC-orMultibus-compatibleperipheraldevices(notbothatonce!)canbeattachedtoan1108whichhastheExtendedProcessorOption(CPE),usingXerox'sBusMasterinterfaceoption.ThisdocumentdescribesthefunctionalityoftheBusMasterhardware,andtheBUSMASTERsoftwarepackageforcontrollingit.Itisdividedintosections:thisintroductorysectionsingle-bytetransfers-theBUSfunctionsmicrocodedblocktransfers-theBUSBLTfunctionsdma-overviewofdirectmemoryaccessdma-detaileddiscussionofthedmaprocessdma-registermodeloftheBusMasterdmacontrollerdma-theBUSDMAfunctionsdma-summaryofsimpleusedma-technicalnotes(ThisdocumentandtheaccompanyingBUSMASTERsoftwarepackagearesomewhatpreliminary:WhiletheyhavebeenusedwithIBMPC-compatibleperipherals,theMultibusalternativehasnotbeenfullyintegratedatthiswriting.ThussomechangescanbeexpectedbeforetheBusMasterinterfaceoptionisreleased.Inparticular,moreobscuredetailsmaychange,themoretechnicaldocumentationmaybecomemoreexact,thedocumentationwillbecomelessPCoriented,and(perhapsmostimportantly)well-packageddiagnosticsoftwarewillbeincluded.Alsohopefullyglobalinitializationwillbebetterunderstoodandbetterpackaged,andtheproblemofaccessingnonexistentmemoryontheexternalbuswillbeproperlyaddressed.NoteinparticularthatmuchofthisdocumentationiswrittenasthoughonlyIBMPCperipheralsweresupported,whichisfalse.IBMPC,IPBPC-XT,Intel8237-5A,andDataTranslationDT2801areproprietarynames.)AdditionalhardwareisrequiredbetweentheBusMasterandtheperipheraldevices:anIBMPCorPC-XTexpansionchassistomounttheperipherals'controllercardsin,andinsomecasesaPCmemorycard,mountedintheexpansionchassis.TheBusMasterconnectsthePCexpansionchassis(the"externalbus")totheBusExtenderhigh-speedparallelportofthe1108.TheBUSMASTERlibrarypackagemakesuseoftheBUSEXTENDERlibrarypackage.Intermsofthehardwareenvironment,PCperipheralsfitintothisaugmented1108systeminjustthesamewaytheywouldintoanIBMPC.MostprogrammingoftheperipheralsisdoneinjustthesamewayitwouldbedoneinBASIConanIBMPC:"peeksandpokes"--thatis,explicitlyprogrammedtransfersofindividualbytesfromandtoindividuali/oandmemoryaddresses.Therearetworestrictionsaffectingmoreadvancedi/oprogrammingtechniques:1)Interrupts:Interruptsarenotasyetsupported.Moreprecisely,whilethehardwaredoessupportinterrupts,exactlyasonanIBMPC,the1108microcodedoesnotasyetsupportinterrupts.2)Directmemoryaccess:PCperipheralscannotperformdirectmemoryaccess(dma)totheinternalmemoryofthe1108.However,theperipheralcanperformdmato/fromPCmemorymountedinthePCexpansionchassis,andthe1108cansimultaneouslyaccessthatmemory,eitherwithpeeks&pokesorwithmicrocodedhigh-speedblocktransferinstructions.Ourexperienceisthatexamplei/oprogramsinBASIC,notinvolvinginterruptsordma,canbetranslatedimmediatelytoInterlisp-Dwithoutsubtlety.Wehavealsoimplementedseveralapplicationsthatusedmatechniques,withtwodifferentperipheraldevices,theDataTranslationDT2801Analog&DigitalI/OSystemandaTecmar-like640x400x4-bitcolorboard.Oneofourapplicationshasthedataacquisitionboardsamplingacousticdataat q?` p  q?` g_p agqagrag'.1: FIMIMag"_>%+w0T:DD_>"]@)/L]@s7]@/R]@ [ [ Zt Z1Xu5z:j;>AX1W59W1V-5z69;V-tV-;V- T TSBY # ).1U4a59<2=C>DFIIS Q IA-"'*}/L5;]?QP ')N+28L:=FFP N<M\  7!u&8(-NMMKR "KJ  "& +J H  $ $',2\HG<"x'+AGE "${&)-EDK S!$*- 3QDB~ j%B~@j#)%@?x1 N?x==A)CoFII: 9l 9F$'Q).24;AE(FfFf9l 7ga  $"&+-1]6 @ BGG7 6f X ; j#&1(W-0t59 @ II6f 4 7"(, 4n68A GG1 0Z  0Z.$'7*e 1m68 ?D6.-T-T+ f"'@)q024 ;-@>@BYEpGI,I,+ *N (7 .B1367:>0?-ASFII*N (E+!,'-2/c17<>DHII( 'H %  "U#&).'H%#(*K+. 9=PBf%$B$B"( %( .03G5<?CE}GJ J " !< Cs6M !"${ ,.e0 78<=?B#ErHIDID!<  w"T&)3-.13 8 @F!GG 6 Ag !4#X%+ 1X157:% @F`II6  Z !)0vk 0t0\ "#% ,;,0# 59};ADIaIa0  eR*!$+E.F02 4(9 ? vk^SRt &+0+39<@BUDIjIj 1\ %N',/46<1ACQEGG 8d  v 't'+.f37:>H?CmEGG h 4  f 'hb F#!k#)q*/27 >?BE?GGb   0 $) \G_ #z *-y/2 9<?DD \ YIz !&+b,1+38W:; CHCH V M"! (i*,/ 6r:9?DGI)I) V  q?`210KHz,whilethe1108processesthedata(includingFFTs)andgraphstheresults,continuouslyinrealtime.Thisapplicationusesquitesophisticateddmatechniques:thedataacquisitionboarddmascontinuouslyintoacircularbufferinmemoryintheexpansionchassis,whiletheprograminthe1108continuouslyreads&processesdatafromthecircularbuffer.Thisispossiblebecause(1)thePC'sdmacontroller(whichisfunctionallyduplicatedintheBusMaster)canbeprogrammedtowrapdmaaroundacircularbuffercontinuouslywithoutsoftwareintervention,(2)thedmapointerscanbereadbythesoftwareprogram,and(3)datatransferfromthePCmemorytothe1108doesnotinterferewithdmafromtheperipheraldevice.Thisdmatechniquetookonlyacoupleofdaystodesign&implementusingtheBUSMASTERsoftware.OurinterfacefunctionsfortheDataTranslationboardareavailableastheLISPLibraryPackagePCDAC;itisoneexampleofhowtousetheBUSMASTERpackage.Single-bytetransfersto/fromtheexternalbus--theBUSfunctionsNotethatwheneveryoupower-uporBUS.RESET,youthenhavetocallBUSDMA.INITatleastonce,toinitializethememoryrefreshapparatus,beforethememoryontheexternalbuscanbeexpectedtoholddata.(BUS.RESET)--actslikeapower-up:resetstheBusMasterandassertstheResetsignalontheexternalbus,therebycausingeverydevicetheretoresetitselfasatpower-up.BUSDMA.INITwillthenhavetobecalledagainifthedmacontrollerormemoryrefreshapparatusisneeded.(BUS.INPUTi/oaddress)=>8bitvalue--inputabytefromanexternal-busi/oaddress,returningitasasmallnonnegativeinteger.(BUS.OUTPUTi/oaddress8bitvalue)--outputabyte(theleastsignificant8bitsoftheintegerargument)toanexternal-busi/oaddress(BUS.READmemoryaddress)=>8bitvalue--readabytefromexternal-busmemory,returningitasasmallnonnegativeinteger.(BUS.READHLmemaddrhimemaddrlo)=>8bitvalue--readabytefromexternal-busmemory,returningitasasmallnonnegativeinteger.memaddrloisthelesssignificant16bitsofthememoryaddress;memaddrhiisthemoresignificantbitsoftheaddress.(BUS.WRITEmemoryaddress8bitvalue)--writeabyte(theleastsignificant8bitsoftheintegerargument)toexternal-busmemory(BUS.WRITEHLmemaddrhimemaddrlo8bitvalue)--writeabyte(theleastsignificant8bitsoftheintegerargument)toexternal-busmemory.memaddrloisthelesssignificant16bitsofthememoryaddress;memaddrhiisthemoresignificantbitsoftheaddress.Microcodedblocktranfersto/fromtheexternalbus--theBUSBLTfunctionsThesefunctionstransferdatabetweenanarrayinInterlisp-Dvirtualmemoryandaconsecutiveregioninthememoryontheexternalbus.NotethatBUSDMA.INIThastobecalledatleastonce,toinitializethememoryrefreshapparatus,beforethememoryontheexternalbuscanbeexpectedtoholddata.(BUSBLT.BYTESarraystartingindexbusaddressnelementstoexternalmemory?)--transfereverybyteofnelementselementsofthearrayinInterlisp-Dmemory,startingwiththestartingindex'thelement,toorfromconsecutivebyteaddressesontheexternalbus,startingatbusaddress.arraymustbeanarrayofeitherBYTEs,WORDs(=SMALLPOSPs),orFIXPs.IfthearrayisofWORDsorFIXPsthenthemoresignificantbyteofeachInterlisp-Dwordistransferredtotheloweraddressontheexternalbus.I) V ft hs7 h bt_t"{ (,/d35:M B1CF9IIIb `~  !$ +,3.d1: 7;?, GIJJ`~ ^6s$#h( +-3469 AE;FF^ ]x!$%@*O/@1:3k6m9Y ?dCDD]x [ T Z "$& .033w6c:;@DD[ Zr  #%'*02b4%78;@XFHJJZr X 4q""%:(;*/258; AEFGI1I1X Wl "$ (?)0[36?DkWlU!$K +S/1@68I:z=BGGU Tf 5s8 "_$-2TfRR Qs7 Q Pw >!^'*R+.c2A8PNs7NLt1\#_$ -F/257]9 CE&HHL Kz c <m  &~*,2 36;%=?AG8HHKz I IHtHt F mFxFFtFj="1"&%(V.1|57;i?$@C-H>H>FE p )#'+,/24b5<'< FHHE Co2 $r%'* 02c7< BCZGC B B @X m@Xx@X@Xt@X@@@Xv@X 8@Xt@X qq@Xv@X"@Xt@X"$F'(+.0 83:W?iE@FhGHH@X>N #B> =? =? ;}x d;}t;};}v;}  ;}t;}d;}v;}!;}t;}"$ (J)G,(.1 8,94;=1?bCJ@J@;}9`#  %I9 8d 8d 6x-6t66v6 6t66v6%6t6%t&)*-0 8Z=CDFoGlGl65 N #B5 3 3 1x 1t1KK1v1q#1t1$''1v1,G1t1,-0147 ?EE101`] (N--i-i01v01301t014+5i7: @eBDFHKHK01.PP.v.$.t.%&\(+ 2U46R8=B. - - +Cx +Ct+CK+Cv+C &#Y+Ct+C$*%t(),/J2@ 89<=?DFJJ+C)` !) (* (* &hx a&ht&h&hv&h7$%Q*&ht&h+U,/036u9k ?@CIDGG&h$L > '-l--$v$4.$t$457:\ @BxDFuHH$#<PP#? FF  "|1 !"$](#),/1s 68>:B II DY!#`%#*,./.2  N mNxN NtN/NvND #2# **`0l0;NtN<=BFGI(JJNvtv!#2#2v&?t&( .49C<.>_>_v EtGG">T &)/p1H3y8;J@AnAn"v" G"t"HCHH"vtE~A!^"&+137 =L>CXCEG6JJ !$&*^ 035.80 ?BgC JoJo  s`+!#(+l s a q?`3(BUSBLT.RIGHTBYTESarraystartingindexbusaddressnelementstoexternalmemory?)--transferthelesssignificantbyteofeachwordofnelementselementsofthearrayinInterlisp-Dmemory,startingwiththestartingindex'thelement,toorfromconsecutivebyteaddressesontheexternalbus,startingatbusaddress.arraymustbeanarrayofeitherWORDs(=SMALLPOSPs)orFIXPs.(NotethatarraycannotbeofBYTEs.)OntransferstoInterlisp-Dvirtualmemory,themoresignificantbyteofeachwordiszeroed.(BUSBLT.NYBBLESarraystartingindexbusaddressnelements)--transferevery4-bitnybbleofnelementselementsofthearrayinInterlisp-Dmemory,startingwiththestartingindex'thelement,toconsecutivebyteaddressesontheexternalbus,startingatbusaddress.Each4-bitnybbleofInterlisp-Dvirtualmemorycorrespondstoabyteintheexternalbusmemory:theInterlisp-Dnybbleisright-alignedintheexternal-busbyte,withtheleft4bitsoftheexternal-busbyteunspecified.ThebyteresultingfromthemoresignificantnybbleofeachInterlisp-Dwordistransferredtothelowerbyteaddressontheexternalbus.arraymustbeanarrayofeitherBYTEs,WORDs(=SMALLPOSPs)orFIXPs.NOTEthatonlythetransferfromInterlisp-Dmemorytoexternal-busmemoryisimplementedatthiswriting.AreadformofBUSBLT.NYBBLESisexpectedtobeaddedlater.AlsoBUSBLT.SWAPBYTES,whichwilldifferfromBUSBLT.BYTESonlyinthatthemoresignificantbyteofthe1108wordwillcorrespondtothehigheraddressontheexternalbus.Dma--overviewofdirectmemoryaccessontheexternalbusTheBusMasterincludes,inadditiontopeekandpokeapparatus,a3-channelDMAcontrollerandmemoryrefreshcircuitry.MemoryrefreshcircuitryisnecessaryfordynamicRAM(suchasthatusedinthePC)tokeepitsdata.AsintheIBMPC,theBusMaster'smemoryrefreshcircuitryisintegratedwithitsdmacontrollerandtimer,andusesthefourthdmachannel#0.Memoryrefreshisinitiatedduringtheglobalinitializationofthedmacontroller.TheseoperationswouldbedoneautomaticallyonanIBMPC.Directmemoryaccess(dma)referstoaprocesswherebyani/odevicecantransferdatatoorfrommainmemorywithoutdirectinterventionbythecentralprocessor.Thatis,althoughthecentralprocessormusthelpinsettingupthedmaoperationandintidyingupafterit,manybytesofdatacanbetransferredinasingledmaoperationwithoutthecentralprocessorhavingtobeinvolvedaseachbyteistransferred.Thisinvolveshavingdedicatedhardware(inthiscasetheBusMaster'sdmacontroller)withmemory-addressandtransfer-countregistersandcontrolcircuitry.Typicallyasingledmaoperationtransfersapredeterminednumberofbytesofdatafromthei/odevicetosequentialaddressesinmainmemory,orsimilarlywiththedatagoingfrommemorytothei/odevice.Thedmacircuitryhastoallowfortheoperationtoterminateprematurely;theBusMasterallowstheoperationtobeterminatedprematurelyeitherbytheprogramorbythei/odevice(thoughnotalli/odevicesaresmartenough).TheBusMasterwillalsoallowdmatotakeplacetoorfroma"circularbuffer"inmemory.Thisisreferredtointhisdocumentbythenot-obviously-appropriatename"AutoinitializationMode".Thenamecomesfromthefactthat,inAutoinitializationMode,thedmacontrollerdoesnotterminatethedmaoperationwhenthetransfercountrunsout,butratherre-initializestheaddressandcounterregisterstotheirinitialvalues,thus"wrappingaround"the"circularbuffer".InthiscasetheBusMasterwillletthedmagoonforever:thei/odeviceortheprogramhastoterminateit.Thedirectmemoryaccessdiscussedheretakesplaceentirelyontheexternalbus.Thereisnodirectmemoryaccesspossiblebetweeni/odevicesontheexternalbusandthe1108'smemory.Asimilareffectcanbegotbyusingdmabetweenthei/odeviceandthememoryontheexternalbus,togetherwithblocktransfersbetweentheexternalbusmemoryandthe1108'smemory(discussedintheirownsectionabove).AsontheIBMPC,thedmacontrolleranditssupporthardwareareactuallycontrolledviapeeksandpokes.However,theBUSMASTERpackageincludesasetofBUSDMAfunctionsthatimplementa+l s ftIhs7Jjh bt b `? m`?x`?`?t`?55`?v`? ()8 /066rAy`?t`?BJCHoJJ`?^G !$'r((^v^.^t^/ 468O8O^v^;\^t^;=4 DII^]]v] %K]t]'/,. /2 9<BDFF][} j!![}v[} '[}t[}())[}v[},[}t[},g/1c3&68 ;A;ClCl[}Y 3#$'*`*`YvY-mYtY-235^:;=KBD*D*YXQ $|&* 0u3V47;<_>_SvvSv ESvtSvGGSvQ> !$*,z.36|;5<(?0AC-E^E^NMD z[ %&(+14T69 @MDF9I;I;MDK U &')-j0K569>@A6A6KvKDCKtKDGIIKJ+D#1(* 46)::?OADG G J+H "() 1(6e7 ?A+CH#H G% G%EI5m $%+s,.256O9NHNHNE D L !$&3(+.g 4797;h>ADTDTD B ]g?!p&(BAA?? >w 5q!&(+14#>A>BEGJKK6$ 4  WN $(q-. 5089< BEGII4 3 }Hyn^  u%*K+047*; BDOFIlIl3 1 V  # ,9./25100.0#%&*0138 :j?EBCE1HiHi. - BX "$Y&* 11p46;=B-HH- + -"%M&+C-'0415P8:@=?sA6 HIJ}J}+ *  j!',-/`46H9J<+=i DDGG* (dg?!8#&j( 03 9GCD3GH[H[ qx.d1=CBBtEHHq  *[P$)+I.5 4@7A9?ADJJ k z, # +e-2P49>@ZCqG*G*k J  $))+.029<=@ BDFF e+Oc* "$O*G+te_D_$6'"*p-24z6;>{>BCEIlIl_ 1\$%(!-2/2#4T8H=>4?CGII Y  /Y#&K(|-/169>AE>JJY 2ct "&, 2T369>+B{ S S k %().4z6; ACGJJ M^b$)*,.d5:=jDEE M- q?`4higher-levelviewofthedmacontroller.ThisviewofthedmacontrollerisbasicallyasimplifiedversionofthatinthespecificationsfortheIntel8237-5A,onwhichthesystemisbased.Dma--detaileddiscussionofthedmaprocessTypicaldmaoperationsusingtheBusMasterarequiteeasytoprogram--youareonlydealingwithonei/odeviceandinonlyoneway.Evenplanningtheuseofoneparticulari/odeviceisnottoobadifyou'renotgoingtobeexotic.Unfortunately,i/odevicesdifferinmajor&minorways,theBusMasterisdesignedtofitwellwithmostofthem,andthisdiscussionhastoenableyoutoplantheuseof(almost)anyi/odevicein(almost)anywayreasonable.Sopleasebetolerant.MyhopeisthatafteryoureadthroughtotheSummarysectionbelow,youshouldhaveatmostafewquestions,whichcanlikelybeansweredbyskimmingaround.(Ifyouareplanningexoticthings,youmayneedtoreadthespecificationsforthetheIntel8237-5Admacontrollerchip,onwhichtheBusmasterisbased,andtheTechnicalNotessectionbelow.)ThedmacontrollerandmemoryrefreshcircuitryhavetobeinitializedbeforeanydmacantakeplaceandbeforethememoryinthePCexpansionchassiscanholddatareliably.ThisisdonewiththeBUSDMA.INITfunction(thoughundersomecircumstancesyoumayalsoneedtheBUS.RESETfunctiondiscussedabove).BUSDMA.INITcanbecalledagainatanytime,withthesideeffectofdisabling(masking)allthreedmachannels.Thedmacontrollerhasthreeseparatedmachannels,numbered1to3.(Thereisactuallyalsoafourthchannel,numbered0,dedicatedtothememoryrefreshapparatus.)Eachi/odevicethatdoesdmahastoknoworbetolditsdmachannelnumber,asdoesthesoftwarecontrollingthedevice.Usuallyadevice'sinterfacecardhasswitchesorjumperswhichdeterminewhichdmachannelitwilluse.Onlyonedevicecanbeusinganyonedmachannelatatime.Thustherecanbeatmostthreei/odevicesdoingdmaatanytime.Thethreedmachannelsarecontrolledseparately.Wethinkintermsofdma"operations".A"singledmaoperation"is:theprogramgetsthei/odeviceanditschannelsetupfortheoperation;manybytesaretransferredoneatatimeattheinstigationofthei/odevicebutunderthecontrolofthechannel;thetransferisterminatedsomehowbyeitherthechannel,thei/odevice,and/ortheprogram;finallytheprogramtidiesupthei/odevice&thechannel.Also,duringthetimewhenindividualbytesarebeingtransferredbythei/odeviceandthechannel,theprogrammightintervenetotemporarily"suspend"andthen"resume"thedmaoperation.Itisimportanttonoticethatthedmacontrolleritselfdoesnotactuallydistinguishbetween"suspended"and"terminated":iftheprogramresumestheoperationthenitwas"suspended";ifitsetsupanewoperationthentheoldonewas"terminated"!Thesetupofthei/odevicedependsonthedevice.Settingupthedmachannelbasicallyinvolvessettingupaddress,transfer-count,andmoderegisters.Itwouldbeprematuretodiscussthesetupfurtherhere,aswehavenotyetmotivatedtheissues.Ratherwewilldiscusseverythingelse,includingthefunctionofthechannel'sregisters,thendiscusssetupagainintheSummarysection.Duringtheextended"dmaoperation",individualbytetransfersarerequestedbythei/odeviceinvolved.Ifmorethanonedevicerequestsdmaatthesametime,thedmacontrollerservicesthelower-numberedchannelfirst.Thedirectionofthetransfer(toorfrommemory)hastohavebeensetupthesameinboththei/odeviceandthedmachannel.Thememoryaddressto/fromwhichthetransferwilltakeplaceisdeterminedentirelybythedmachannel.Normallyitusessuccessivelyincreasingbyteaddressesinmemory,butitispossibletousesuccessivelydecreasingaddresses,andin"AutoinitializationMode",thechannelwillwraptheaddressesaroundacircularbuffer(wrappingineitherdirection).Forexactlyhowaddressesaregenerated,seethediscussionofthepage,current-address,andbase-addressregistersbelowintheRegisterModelsection.Dmaonaparticularchannelcanbesuspendedandresumedby"masking"and"unmasking"thechannel.Amaskedchannelrefusestohonoranydmatransferrequests.Ifthereisadmatransferrequeststillpendingwhenthechannelbecomesunmasked,thechannelwillservicetherequestthen.Obviously,datacanbelostbykeepingthedmachannelmaskedtoolongwhileitsi/odeviceisrequestingtransfers.Itremainstodiscusshowadmaoperationisterminated.Thisispotentiallyrathercomplicated.E M ft hs7 h bt JV !`$J'V(+- 4 5G:; AFnGJJb `~ t -"$(*.0=3`~^^]x]x [w 5 {!$t)[ZBtZBX  ")O+u.13$89zAdFHHX W< q2r"(T*,.W0 68=>L@BEUFJJW< U :T? "'b*,}0C159;KAC&HJ0J0U T6 S>k1 $'8(,/u0368X9? A|CGI4I4T6 R7 *Z!M#(K(+.C/2 5-7:?A'CXIgIgR Q0_e}!"$ *.046H< =DHILILQ0 O Jp  #h&(+-3 5d7s9;>D4G G O N* 7!"&)_+15g9>~>?.?4N*LLK$ "P&+/02T 8s<?ADNGJ|J|K$ I } $%(p*-0568:<=@jBBI H >9" %p -0y3O59;KCDHHH Fm !%"&*(+.1T4?6p9<>@CJJF E tEC  +%S(?. 4r5z68Y8<>:CEFJJC B< %*a 1@146;=@CEGfGfB @ 0 "`#&).[ 57F;< @AFF@ ? hIX t$Q*.~1j6Z79<v@EH JDJD7} 5`!"&)+.024F57=(=@EGHJ>J>5 4w z ,R #%')-0w27:!?CFIJJ4w 2 )/&#%P(< ..0+1i79<?ADD2 1q +,rV $)P 183 @BFF%Y # _7K#s&_')-J025 ;@BB# "S ^$&%(V-1/*039;=u@CEGII"S  C$8!& M $w&+-04,5j <ANCEMH9H9M ; ')/1T69;:c;@B0DwDw G @   " -Y234d9T;?ADG'G'G ~A@ # *:*-1z4O:2aC<GJPJP 5+%(,/z36:=>K DGJ.J.5  #%(,i.094M5 < AA//4/!') 0"0z3d4 ;<? FF5 q?`5Dmatransferswillceaseundereitherofthreeconditions:thei/odeviceceasestorequestdmatransfers;thedmachannelmasksitselfbecauseitstransfercounterrunsout;orthedmachannelismaskedbytheprogram.Ineithercase,thedmachannelitselfdoesnotdistinguishbetween"suspended"and"terminated".Iwilltrytosaywhatitdoesdo:Atanygivenpoint,admachannelisaskingitself"AmImasked?".Ifso,that'sall.Butifitisnotmasked,itthenasks"AmIreceivingarequestforadmatransfer?".Ifnot,that'sall.Butifitisreceivingarequestforadmatransfer,thenitgetsthetransferdone,andthenincrementsordecrementsitscurrent-addressregister,anddecrementsitscurrent-transfer-countregister.Ifitscurrent-transfer-countregisterdoesnotgotozero,thenthat'sall.Butifitscurrent-transfer-countregisterdoesgotozero,thenthechannelassertstheexternal-bussignalnamedTC,andalsosetsits"TCbit"inthedmacontroller'sstatusregister.(TheTCsignalisalsoreferredtoasEOP,andisavailableforthei/odevicetosenseifitwants.)Thechannelthenasksitself"AmIinAutoinitializationMode?".IfitisnotinAutoinitializationmode,thenitmasksitself;ifitisinAutoinitializationmode,thenitreinitializesitscurrent-addressandcurrent-transfer-countregistersfromthecorrespondingbaseregisters,butdoesnotmaskitself.Inanycase,thedmachanneldoesnot"terminatethedmaoperation"really:itmaymaskitself,anditmayemittheTCsignalandsetitsTCbit,andtheprogramorthei/odevicemayactonthesethings.Butallthechannelcaresaboutthis,untilitisactedonbytheprogram,isthatifitmaskeditself,thenitstaysmaskeduntiltheprogramunmasksit(possiblyafterchangingitsotherregisters!).Thei/odevicemightceasetorequestdmatransfersforanyofseveralreasons,including:ithasitsowntransfercountregister,whichhasrunout;ithasdetectedanerrorconditionandchosentostoptransfer;ithasdetectedtheTCsignalfromitsdmachannelontheexternalbus;ithasdetectedsomeotherterminationcondition;orithasbeendisabledbytheprogram.Anyparticulari/odevicemaywellnotsupportallthesechoices.Thedmachannelcannottelldirectlythatthedevicehasceasedrequestingdmatransfers;itsimplyrespondstothemif&astheyarise.Typicallytheprogramdeterminesthatthei/odeviceconsidersthedmaoperationdone.Theprogrammightmaskthechanneltemporarily,forsomekindofhousekeepingreason,oritmaydosoaspartofterminatingthedmaoperation.Itcanhaveanysortofreasonfordoingthis.Thedmachanneldoesnotcare:iftheprogramchoosestoresetsomeofthechannel'sparameterswhileitismasked,that'sfine;otherwisewhenthechannelbecomesunmasked,itwillkeeponfromwhereitwas.Changingadmachannel'sparameterswhileitisunmaskedisriskyandtobeavoided.Directmemoryaccess--registermodeloftheBusMasterdmacontrollerInourmodelofthedmacontroller,therearenoglobalregisters,andeachchannelhasasetofsevenregisters:Pageregister--Suppliesthemoresignificantbitsoftheexternal-busmemoryaddressesgeneratedbythechannel.Thecontentsofthisregisteraresimplyconcatenatedontotheleftofthecontentsofthecurrent-addressregisterwhenanaddressisgenerated.Unfortunately,incrementingordecrementingachannel'scurrent-addressregisterdoesnotaffectitspageregisters.(Thisimpliesthatanydmaoperationmusttakeplaceentirelywithinone(64KB-aligned)64KBpage,sincethecurrent-addressregistersare16bitswide.Further,admabufferthatseemstooverlapa64KB-pageboundarywillreallywraparoundwithinthe64KB-pageitstartsin.Thepageregistersaresetupbytheprogram,butcannotbereadbyit.Current-addressregister--Holdsthelesssignificantbitsoftheexternal-busmemoryaddressesgeneratedbythechannel,thatis,the16-bitaddress-within-page.Thechannelgeneratesaddressesbyconcatenatingitspageregisterontotheleftofitscurrent-addressregister.F ftIhs7Jjhbt.m!@$&) 01 3Q5u9=r>CFFb `~  %',e144 68u:=BCHJ]J]`~ ^ %^]x]x[H`}!m$') 05 =@K HIII[ Zr oiHpqpZrX*ur^#N$(+//6C679=Y?XWl\;b #@&x'T,-2458 ??_@CRFHWlU\ @"O#L&8+k.b/2)4Z95<?YBP IJJU Tf  !&# *,g9>? @uB!B!Tf RP!E#$'*.%/RQ`\;!&E)F+,/249=@ GGQ` O "2 #g$'* 049<>BCFFO NZ G #%3)G*.7/j055l8=?BEIIINZ L ty&N!#R-146 9==?%@MAC C L KT #%a.1^>CG$IUIUKT I  +} ~"&())IHNH4 $#%%k ,.D10 7;=?CKFIXJJHN F ,p_  F"%'F,.:0k269y;~=V@DEGGIzIzF EH %Y  P#%'f)/M03*4]5:T=@AEIIEH C ; 5 #)+,. 55CBBBB@ w%(-f/u13s7< C3CDFHH@ ?< JP- t"%&) .S03Y9C;@-ADwII?< =  c "')k+0346CEVHH<6 ::  9$')-0'4R := CDHH: 90 cb$',u 3I58:=>QDFMI9I990 7276*6*4 M%= ,.2=5=6 ?1CEIFqIGIG4 3$  b# Nk %&'Z),/B13U79=>@@_CEE3$ 1+d  ~%W&)-S.16 =A4B\CHH1 0 o}4!$&-@.h0459<>&@ASGaH^H^0 .  -k%'*0,.9/4.--++ *w4!S%'*a25 <*(_t(_&{ #'U){+S/D 47W:Y?IABD|FII& %Y M%Y## "fv , e"f tGx @"$=&n .3E9(?BACAHHH M e (+.#0i14%9b:=FFM ( G  ! * + 0:I>AD>GIIG  P"(,.2A7;"= GG A !d %;'a)+//\458<? BDsI+J(J(A h F$(+2 3568;!#)+0(1467; Hv Ht_  5!# +06<>@F HJAJA / %jk$[*301 :Y<?CFHH/  : q q?`6Aftereachbytetransfer,thechannelincrementsordecrementsthecurrent-addressregisterbyone.Thedirectiondependsonabitinthechannel'smoderegister.Unfortunately,thisincrementordecrementdoesnotaffectthepageregister(asdiscussedabove).Thecurrent-addressregisterissetupbytheprogram,incrementedordecrementedbythechannel,and,in"AutoinitializationMode",reloadedbythechannelfromitsbase-addressregisterwhenitscurrent-transfer-countregisterrunsdown.Thecurrent-addressregistercanbereadbytheprogram,sothattheprogramcankeepitsaccesstotheexternal-busmemorysynchronizeedwithdmaontheexternalbus.Base-addressregister--InAutoinitializationMode,holdsthestartingaddressofthecircularbuffer.Thatis,inAutoinitializationMode,whenachannel'scurrent-transfer-countregisterrunsdown,thechannelreinitializesitscurrent-addressregisterfromitsbase-addressregister.Thebase-addressregisterisloadedautomaticallywhenevertheprogramsetsupthecurrent-addressregister.ThereisnoBUSDMAfunctionforreadingthebase-addressregister.Current-transfer-countregister--Controlsthelengthofthedmaoperation(or,inAutoinitializationMode,thelengthofthecircularbuffer).Thatis,aftereachdatatransfer,thechanneldecrementsitscurrent-transfer-countregister,andifitgoestozero,thenaTCsignalisassertedtotheexternalbusandthechannelismasked(ifnotAutoinitializationMode)orthecurrentaddress&transfer-countregistersarereinitializedfromthebaseones(ifAutoinitializationMode).Notethatthecurrent-transfer-countregistercontainsthenumberofbytetransfersremainingtobedone,asanunsigned16-bitnumber.Notealsothatwhileacurrent-transfer-countregistervalueofzero,viewedasafteradmatransfer,means"done",thesamezerovalueviewedasbeforeadmatransfer,means64K.Thusthemaximumtransfer(orcircularbuffersize)is64Kbytes.(Youmayalsoneedtoknowthatthehardwareregisterkeepsitsvaluesonelessthatwhatwe'vedescribedhere,modulo64K.TheBUSDMAfunctionsmaintainthetranslation.)Thecurrent-transfer-countregisterissetupbytheprogram,decrementedbythechannel,and,inAutoinitializationMode,reloadedbythechannelfromitsbase-transfer-countregisterwhenitrunsdown.Thecurrent-transfer-countregistercanbereadbytheprogram,sothattheprogramcansynchronizeitsexternal-busmemoryaccesseswiththeexternal-busdma.Base-transfer-countregister--InAutoinitializationMode,holdstheinitialvalueofthecurrent-transfer-countregister.Thatis,inAutoinitializationMode,whenachannel'scurrent-transfer-countregisterrunsdown,thechannelreinitializesitfromitsbase-transfer-countregister.Thebase-transfer-countregisterisloadedautomaticallywhenevertheprogramsetsupthecurrent-transfer-countregister.ThereisnoBUSDMAfunctionforreadingthebase-transfer-countregister.Moderegister--Containssomecontrolbits.Themoderegisterissetupbytheprogram,butcannotbereadbyit.writememory?--determineswhetherdmatransfersarefromthei/odevicetomemory,orviceversa.autoinit?--governsAutoinitializationMode.Iffalse,thecurrent-transfer-countregistershouldbesetupwiththelengthofthetransfer,andwhenitrunsdownthechannelmasksitself.Iftrue,thecurrent-transfer-countregistershouldbesetupwiththelengthofthecircularbufferinexternal-busmemory,and,whenitrunsdown,thechannelreloadsthecurrent-addressandcurrent-transfer-countregistersfromthebase-addressandbase-transfer-countregisters,thuswrappingaroundthecircularbuffer.decaddr?--determineswhetherthecurrent-addressregisteristobeincrementedordecrementedaftereachbytetransferred.Maskbit--Whileachannel'smaskbitisset(thechannelissaidtobe"masked"),dmaonthechannelissuspendedinthatthechannelwillignorerequestsfordmatransfersfromthei/odevice.Notethatifani/odevicerequestsadmatransferwhileitschannelismasked,andisstillassertingthatrequestwhenthechannelbecomesunmasked,thechannelwillservicetherequestatthattime.Thusdatacanbelostwhileachannelismaskedonlyifthechanneliskeptmaskedforasignificanttimerelativetothespeedofthei/odevice. ft hs7 hbtY[<o$ +Y, 36,?DNFHIHIHb `~ 0nFC1%)T.Y. 7:2@wB HH`~ ^ ; $(^]x "$&(.{ 6+7 ?ACHH]x [ U}#%',01 9>8ACjCj[ ZrP"#4%/Q36\8; <? DFVHHZr X %  = '- 58;=?DG3XWlWl Uv  UTft*T"% ).|0286;Q>h?A~A~Tf RB?# 0g58;>%C JJR Q`  &m+ Q`O ZF# +149_;=?I[I[O NZQ#a9"$+(+ 27NZLL Kgvj KgItQG!3'))+59< @ACHHI HN2!$) 0 1?DFLHNvHNFGtHNtHNGHHHN F _FvFFtFfcY!#%O*`,,FvF.FtF/>1o6_7@^@^F E"s!=%'a 0557[ >AD FIIE" C >CB1$]) .<0m5i69?4EGHHB @ ~E#7%(s+,:P>BxDG/G/@ ?k?v??t?  %'L*-o05`66?v?:g?t?:;>CGG? = " zI$ 3$(+-(/3i=;Bc"$*/H248;=|@CIFF; :z0AB$*022c 9q:z8#$&(*|,2c :V<$>UCF~GG8 7t/".'*V,7<_?A CGHCHC7t 5 !"%')/h035;,= DFF5 4n  (+y4n22 1{v 1{/t*T"% (,<-/=TBYEpGHH/ .bB?# 0g58;>%C JJ.b , T b,+\B!#.'x /57=G?ACC+\ )PU !#*1/x16K8|D+H)(V(V &v &%Pt~b+",%*+-/1_39F;?ADF`G%P#v \#t#B `$}'i,.2&4W6{:<AC:EIB#"7vf"7t"7L{%)B)*.H0y=BFHJJ"7   u#%#(+-26:6:;>A!A! P H" #%(*/027;= DJ0J0  [ob$&@/2=?DHJ4J4  D %}(S.5249=vbtH f!#-(1346W >? GJJ   ||  v  vt *"$)*-/0 7:<>CEEv |7"J'r),m15759Y=rp1#&$#'+/n16 7H@6BHJJp O?%[',|.3M5~:";>,AyAEGJRJR j  !#(*-134 ;A>7BDdFJGJGj     q?`7Allchannels'maskbitsaresetwhenthedmacontrolleris(re)initialized,includingatpower-up.Theycanbesetorclearedbytheprogram.Achannelsetsitsmaskbitwhenthecurrent-transfer-counterrunsdown,exceptinAutoinitializationMode.Theprogramcannotreadthemaskbits.TCbit--Whetherthechannel'scurrent-transfer-countregisterhasrundownsincethelasttimeeitherthedmacontrollerwas(re)initialized,includingatpower-uporBUSDMA.READTCBITwasexplicitlyusedtoresetthisbit.Directmemoryaccess--theBUSDMAfunctionsSeetheRegisterModelsectionaboveforexplanationsoftheargumentsofthesefunctionsandoftheregistersreferredtobythem.Thesefunctionsdonotchecktheirargumentsexceptasspecificallynoted.(BUSDMA.INIT)--(re)initializethedmacontrollerandmemoryrefreshcircuitry.Maskschannels1,2and3,andclearstheirTCbits.(BUSDMA.SETMODEchannelwritememory?autoinit?decaddr?)--setthemoderegisterforthechannel.(BUSDMA.SETPAGEchannelhighbitsofaddress)--writetothepageregisterforthechannel.Checksthatchannelisintherange1-3.(BUSDMA.SETADDRESSchannellow16bitsofaddress)--writetoboththebase¤taddressregistersforthechannel.Thechannelmustbemaskedwhenthisfunctioniscalled--thisisthecaller'sresponsibility.(BUSDMA.READADDRESSchannel)=>low16bitsofaddress--readthecurrentaddressregisterforthechannel.Thechannelmustbemaskedwhenthisfunctioniscalled--thisisthecaller'sresponsibility.(BUSDMA.SETCOUNTERchannelnbytes)--writetoboththebase¤ttransfer-countregistersforthechannel.Checksthatnbytesisintherange1-65536.Thechannelmustbemaskedwhenthisfunctioniscalled--thisisthecaller'sresponsibility.(BUSDMA.READCOUNTERchannel)=>nbytes--readthecurrenttransfer-countregisterforthechannel.Notethatthevalue65536isreturnedas(thefunctionallyindistinguishablevalue)zero.Thechannelmustbemaskedwhenthisfunctioniscalled--thisisthecaller'sresponsibility.(BUSDMA.MASKchannel)--setthemaskbitforthechannel,disablingdmaonthechannel.(BUSDMA.UNMASKchannel)--clearthemaskbitforthechannel,enablingdmaonthechannel.(BUSDMA.READTCBITchannelclearthebit?)=>thechannel'sTCbit,asTorNIL.Alsoclearsthebitifrequested.Directmemoryaccess--summaryofsimpleuseGenerallyeachchannelcanbedealtwithseparately.Planning-- ftIhs7Jjhbt = $J&{)g /r09B?"@FG?JJb `~ Q&% 2!&(*./3x5D.GG`~ ^ %"N"%O*.147y9^]x]x \v /\Zrtjg).q03 69AvAvZrvZrDZrtZrEGDJ0J0Zr X } "Z(](]XvX)XtX)9"; ASD`EHHX WF fYWFUUT@T@ Rw4%,GRQ tQ OR!T%&'5 .0y29':> CF`GJJO N&8NL_ V#m). / 6\:LJJ I< mICJHH:9!R""%*-/4U7:M?@DEHTII97q"7 6 6 4> m4>x4>4>t4>  4>v4>$4>t4>%l'3T479>TCGII4>2XY#I&(E-03 8S9=W>ABQDHH21% 1% / / - m-x-qq-t--v-##'-t-(h)-.1368< ENJJ-,J g"%N%N,Jv,J(,Jt,J)F*,.5177q:? BCDHH,J*f ]$#%m')+N/7* )1 )1 'o m'ox'o'ot'o . 'ov'o%'ot'o%(=(='ov'o+'ot'o,5-0k275 ?DFHH'o%'e!%(*/13 ; EaITIT%$V c "5#(,M,/4^59b:=>\@DD$V" " !P !P  mx ytv)tx "&F(4*C,t17e:Q<)>ZCO   6 m6x6 ,6t66v6Z6t6 +!u$&*,,.)0Z5; =?AF6    mxOtv!"- (=t),.546<8:;A<@@jCiGI@I@H H  BB w4!#(* t  g!*$b'M - v 0 ; q?`8Determinewhatchannelthedevicewilluse.Determinewhatconditionswillterminatethedmaoperations,andhowthedevice,theprogram,andthedmacontrollerwillfindoutaboutthem.Determinewherethebuffer(s)willbe,totheextentthattheyarenotdynamicallyallocated.Ifyouareusingcircularbuffering,orotherexoticstuff,you'llknowitbythispoint.Globalinitialization--CallBUS.RESETwheneveryouwanttosimulateapower-down,power-upcyclefortheBusMaster,theexpansionchassis,andthedevicesontheexpansionchassisbus.CallBUSDMA.INIT.Thishastobedoneatleastoncebeforedoingdmaontheexternalbusorexpectingthememoryontheexternalbustokeepdata.Itcanbecalledredundantly,buthasthesideeffectofmaskingchannels1-3.Sincethereisnowaytoreadthemaskbits,ifyouhavemultiple,logicallyindependenti/odevicesusingdmaonthesystem,youwillhavetocoordinateBUSDMAinitializationinyourownsoftware.Thismaybefixedlater.Admaoperation--Ifthechannelisnotmasked(whichitisafterBUSDMA.INIT),callBUSDMA.MASK.ThencallBUSDMA.SETMODE,BUSDMA.SETPAGE,BUSDMA.SETADDRESS,andBUSDMA.SETCOUNTERinanyorder.(Ifyourmodesettingsorpagenumberforthechannelareconstant,youdon'thavetosetthemeachtime,thoughit'scheap.)Whilethechannelismaskedisasafetimetosetupthei/odevice.NowcallBUSDMA.UNMASK,then,whenready,startthei/odevice.(Itcouldbestartedwhilethechannelismaskedifdatawouldn'tbelost,butthiswayalwaysworks.)Thedmaoperationisnowhopefully"inprogress".Youwillneedtotestthingsduringthistime,especiallysincewedon'thaveinterrupts.IfyouaregoingtouseBUSDMA.READADDRESSorBUSDMA.READCOUNTER,orotherwiseneedtosuspenddmaonthechanneltemporarilyforsomereason,callBUSDMA.MASKtosuspend,thencallBUSDMA.UNMASKtoresume.TostopthedmachannelcallBUSDMA.MASK.Directmemoryaccess--technicalnotes(1)Thecurrent-andbase-transfer-countregistersarekeptinthehardwareasthenumberoftransfersremaininglessone,andthechannelchecksaftereachbytetransferforthecurrent-transfer-counthavingbeendecrementedfromzeroto-1.BUSDMA.SETCOUNTERandBUSDMA.READCOUNTERperformthetranslationtothemodeldescribedabove.(2)Thei/oaddressesofthedevicesdescribedhereinarethesameasontheIBMPC.TheycanbediscoveredbyinspectingtheInterlisp-DsourcecodeinthisBUSMASTERlibrarypackage.(3)ThemainpointofthissectionistotelltechnicallyadvancedreadershowtheBUSDMAmodelofthedmaprocessrelatestotheTruthabouttheBusMasterandtheIntel8237-5Admacontrollerchip.ThisforthosewhohavereadthespecificationsfortheIntel8237-5AdmacontrollerchiporlookedattheBusMasterorIBMPCschematics.Asidebenefit,perhaps,istogivehintsforthosewhoarethinkingaboutusinganexoticdevicethroughtheBusMaster.Thissectionisnotintendedtobeintelligibletoacasualreader.BusMasterfunctionalitythatishiddenbytheBUSDMAfunctions--theInterruptandInterruptMaskbits,ParityError,andingeneralalltheBusMasterstatusandcontrolregisterbits(exceptResetviaBUS.RESET).Notethatinterruptsfromtheexternal-busi/odevicestothe1108aresupportedbyBusMaster,butthe1108microcodewillatpresentblowupifpresentedwithsuchaninterrupt.SeealsoTechnicalNote(1)above.Intel8237-5AfunctionalitythatdoesnotapplyinthehardwarecontextoftheBusMaster--Channel0isdedicatedtomemoryrefresh.Andthereforeblockmemory-to-memorytransferandblockmemoryinitializationareimpossible.I/odevicescannotasserttheTCsignaltothedmacontroller.Commandregister:thetimingvariationsmayormaynotbephysicallypossible,Idon'tknow;DREQ&DACKsenseareofcoursefixed.Moderegister:"cascade"modeisofcoursenotpossible.Notethatthepageregistersarenotonthe8237-5A.0 g v hs7 hbt#&p))f03< 9<%BDNG:G:b `~ O$U$'1)b,N 2Y479=A;AH;H;`~ ^ !$]'>)d+ 3! 8^]x?g* #Y$(^,//3-679<$?]x[[ ZveZXt"-%[&,"- 51;4>w@B IIX Wl %i  ^"6$g*.1cWlU ZD!# $()|,r/37X:D<>MC^EG\G\U TfZ2c t"$\'~*+,M.0m43 <>a@BEIJJTf R0, c!y$#%(*.$02!47=_B JSJSR Q` *"K$')^ /6 >3?BEEQ` OnONZNZ Lv I {LKTt?p`$ %1&o)| 4P6 B6BEHXHXKT I<&69#III HN t T $(+ ->2.4T9GB`FEHv "B%)- /24A89:>a@$DpGJ%J%EH C"$ F#%V'*r.2CBBu$~& ,-J0)257R9=ADIGGBB @ 82 ""v"$#&(,k-02ACC@ ?<u $'0(-0249 @BFZFZ?< =v "%(L 57@;=<6  +M<6::9090 7w4!%75t54w( '/,a.1r25#:<|>CE4JJ4w 2CC2v22t2W#6&C)E,&135ABFJJ2 1^ 1^v1^1^t1^J"z,".@EH,H,1^ / 5=5" /.E.E,P#)-02K578;$>;@ADiFHH, +? ^  !%(*r,5:;?Q+?))(9IF"#%o' .D4'8;=DbHjII(9 & %S@"%"+.H0y38; AEE^HHJWJW& %3 c8P<m "$'-=0) 649:>@hBI6I6%3 #  r &>'|(+.14q7F9l>BcEGG# "-  "- ?}M " )(*+/3 '' U!2%'w)0D 77Y9?AAGG ! N  "i$+7.1g5:=AE<GKGK!  k1 ! R '*.0(2Y5q7=? FHH  %=2A!x#\$*-02N 7RB<#I !$&*,.I4!8:O< DDgIJJ  25%)=5y:T<@kEE    R!&5),.=13x58 >?OEE Lu W"% & ,2`3<6:?@E!HJJ  Cm"&_')(-G/4  1K!q#%'-   q?`9Intel8237-5AfunctionalitythatishiddenbecauseitiseitherimpossibleintheBusMasterhardwarecontextoronlyusefulwithveryexotichardware(Idon'tknowwhich)--Moderegister:"block"mode,"demand"mode.Commandregister:rotatingpriority.Intel8237-5AfunctionalitythatishiddeninBUSDMAbecauseitwasjudgednotusefulincontext--Read&writetherequestbits,readtemporaryregister,clearmaskregister,readbase-addressregister,readbase-transfer-countregister.Commandregisterbits:disablecontroller.Moderegisterbits:the"verify"transfertype.Intel8237-5AfunctionalitythatispartiallyhiddeninBUSDMA--MasterclearisimbeddedinBUSDMA.INIT.Read&clearstatusregisterTCbitsispresented,somewhatmodified,inBUSDMA.READTCBIT.ClearbyteselectflipflopishiddeninthefourfunctionsBUSDMA.READ/SETADDRESS/COUNTER.- ftIhs7Jjhbtb`~I !"'k,\-.2~ 9:<CfI>I>`~ ^- &t'+-.44\8.=UBCFAFA^ ]xqnX %n*5]x[[ZrI !"'k(/4x58<>BD-IJJZr X dM%*-@058 @]EcHOHOX Wl!&@)+- 44[8-<?AGGWl UUTfTfRI !"($,.56:n=>EFFR Q` N I$'2)* 1I7=??Q` Oa B#().=/14:AI.I.O NZNZLL q?`w TIMESROMAN  TIMESROMAN  TIMESROMAN  HELVETICA TIMESROMAN ~GACHA  HELVETICA HELVETICA~GACHA pH)9JGV V`nqoj/t r){ERIS}LIBRARY>BUSMASTER.TEDIT;2JELLINEK 1-Dec-84 16:00:54