IMD 1.17: 11/11/2014 10:49:08 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 5 OF 30  SR05q82VKXSVRDOS 0420¥l-ŠTTL„DARTDRV:‚VERSADOSSCN2681TERMINALDRIVERWITHTYPE-AHEAD ŠLLENƒ120J**************************************************************************J**************************************************************************J**************************************************************************J***************************************************************************<*‰DARTDRV:‚VERSAdosSCN2681terminaldriverwithtype-ahead.*8*‰Purpose:‚VERSAdosdevicedrivertohandleasynchronous2*terminals(ofanytype)overtheSCN2681chipon*thefollowingboards:2*“MVME115„MVME115-A(Thisonenotimplementedyet)**‰Revisionhistory:1*‘10/23/84‚AllBSR'stoTERMLIBnowJSR'sincase.*›TERMLIBislocatedmorethan32Kbytesaway.**‘10/17/84‚InitialreleasebyJulieHoban.*J**************************************************************************J**************************************************************************J**************************************************************************J************************************************************************** **‚XREF'sfromTERMLIB* ‰XREF†LOG_ERR‰XREF†MARK_DOWN ‰XREF†RESET‰XREF†TERM_BREAK‰XREF†TERM_COMMAND‰XREF†TERM_GOT_CHAR‰XREF†TERM_INIT‰XREF†TERM_TBE‰XREF†TERM_UNRDY **‚Equatefilesincluded:* *‰STR.EQ*‰TCB.EQ*‰CCB.EQ*‰IOE.EQ*‰NIO.EQ*‰LV5.EQ0*‰BAB.EQBackgroundActivationBlockdescription:*‰TERMCCB.EQ‰OffsetsandequatesforCCBDDPforterminals.#*‰TERMINAL.EQˆEquatesforterminals*‰SCN2681.EQ‰Devicedescription*‰UTILITY.MC‰Macros*ŠNOLISTŠINCLUDE9995.&.STR.EQŠNOLISTŠINCLUDE9995.&.TCB.EQŠNOLISTŠINCLUDE9995.&.CCB.EQŠNOLISTŠINCLUDE9995.&.IOE.EQŠNOLISTŠINCLUDE9995.&.NIO.EQŠNOLISTŠINCLUDE9995.&.LV5.EQŠNOLISTŠINCLUDE9995.&.BAB.EQŠNOLISTŠINCLUDE9995.&.UTILITY.MCŠLISTŠINCLUDE9995.&.SCN2681.EQŠINCLUDE9995.&.TERMINAL.EQ I(A0B88@4H<P6X8`9h3p9x>€>ˆO?˜I >¨=°=¸>ÀAÈ& ŠINCLUDE9995.&.TERMCCB.EQŠLIST>ŠTTL„DARTDRV:‚VERSADOSSCN2681TERMINALDRIVERWITHTYPE-AHEADŠPAGEŠOFFSET„TERMDDP*>*‚Thedevice-dependentvariablesoftheCCBaredefinedbelow.* :RESERVE.4SAV_SPR’Addressofthesupervisor'sdriverCCB.%*§Wemustsavethisbecauseinterrupt&*§processingreturnstothesupervisor *§driver. ;RESERVE.4SAV_ISR’Imageof2681interruptstatusregister. *§Usedtokeeptrackofanybits#*§(interrupts)lefttoserviceupon%*§returntothesupervisor.Longword*§notrequired,butitmakesit *§simple. :RESERVE.1SAV_CREG‘Imageof2681commandregister,needed#*§tokeeptrackofthestateofthe%*§transmitterand‚receiver.‚Togivea$*§commandotherthanRX/TXOn/Offor$*§Reset,readthecurrentstatefrom#*§here,ORinthebitsforthemisc*§commands,thentellthechip. *ƒfortheDARTdriver.‚CMRautomaticallyallocatesonepageofA*ƒmemory($100bytes)fortheCCB,andourvariableEXTCCBSZwillB*ƒresideintheCMRparametertableatthebeginningofthedriver8*ƒtotellCMRhowmanyextrapagesofmemoryareneeded.**CCBSIZEBEQU‡*PAGESIZEEQU‡$100L1‡SET‡CCBSIZEB+PAGESIZE-1CCBSIZE‚EQU‡L1/PAGESIZEEXTCCBSZEQU‡CCBSIZE-1‰PAGEJ***************************************************************************+*‰SERVICEVECTORTABLE,REVISIONINFO,ETC.*@*‰ThistableisexaminedbyCMRwhenthechannelisallocatedtoC*‰determinewheretogoforinterrupts,commands,&initialization.<*‰Itmustalwaysbeattheverytopofthedrivercode.‚Also>*‰includedisaparametertellingthenumberofextrapagesof>*‰memorytoincludeintheCCB,andinformationdescribingthe*‰revisionofthedriver.*L**************************************************************************** ŠSECTION‚0ŠOPT„BRS DARTDRV: *D*‚Servicevectortable.‚NoticethatthesevaluesarerelativetotheC*‚beginningofthedriversothemechanismisposition-independent!*=ŠDC.LƒINTERRUPT-DARTDRV‚Addressofinterruptserviceroutine.9ŠDC.LƒCOMMAND-DARTDRV„Addressofcommandserviceroutine.5ŠDC.LƒINIT-DARTDRV‡Addressofinitializationroutine.ŠDC.Lƒ0’Reserved. **‚OtherCMRparameters.*7ŠDC.BƒEXTCCBSZ‹#ofextrapagesintheCCB.‚TheCCBmay)*§beanysizefrom1to256pages(apage'*§is256bytes):‚ifthisfieldis0,it*§willbe1page,etc.ŠDC.Bƒ0,0,0ŽReserved.ŠDC.Lƒ0,0,0ŽReserved. **‚Revisioninfo:*/ŠDC.Bƒ'110784'‹DateoflastassemblyasMMDDYY.1ŠDC.Bƒ''Spaceindicatesnopatchesto.LOfile.)ŠDC.Bƒ'4'MajorVERSAdosrevisionnumber.*‰PAGEO********************************************************************************+*ˆJumptableforusebythegenericTERMLIB*O******************************************************************************* ‰BRA.L…PUT_CHAR ‰BRA.L…CK_TBE‰BRA.L…DDP_RESET ‰BRA.L…SETUP‰BRA.L…CLOCK_RESET‰BRA.L…GET_STAT‰BRA.L…DDP_STOP‰BRA.L…DDP_UNSTOP‰BRA.L…DDP_BEG_BREAK‰BRA.L…DDP_END_BREAK‰PAGEJ**************************************************************************J**************************************************************************J*************************************************************************** *‰INITIALIZATIONROUTINE*>*‰ThisroutineiscalledbyCMRwhenthechannelisallocated.9*‰Itspurposeistosetupthingsforcommandserviceand7*‰interruptservice.‚Themajorfunctionsperformedare:*@*‹1.Device-IndependentinitializationinthecalltoTERM_INIT.3*‹2.Device-Dependentinitializationofthedevice.*@*‰WegotherethroughaJSRfromCMR,andwillexitwithanRTS.>*‰AllregistershavebeensavedbyCMRandmaybeusedfreely.?*‰Entryisatinterruptlevel0,andweareinsupervisormode.**‰Entry:…A5=addressofCCB.*6*‰Calls:…TERM_INITingenericterminaldriverTERMLIB.*'*‰Exitsto:‚CMR(viaRTS)ifallisOK.'*”KILLERifexecwon'tallocatememory,.*•orcan'tgetbackgroundroutineentrypoint.*J**************************************************************************J**************************************************************************J**************************************************************************ŠDS…0INIT:*>*‚Performthedevice-independentinitializationbycallingthe'*‚genericroutineTERM_INITinTERMLIB.*.‰JSR‡TERM_INIT‹Dothedevice-independentstuff2‰IFƒƒTHEN…SomethingwentwrongwithTERM_INIT.4‰IFƒƒTHEN„Theexeccallfailedandwecannotget!*œthescheduler'sentrypoint!!!ŽTR0$.KILLER‚,‰ELSERTSThechannelisdown!!‰ENDI‰ENDI*;*‚Performtheminimumdevice-dependentinitializationusing@*‚callguardedtotheEXECforaroutineresidentinbackground.*5‰LEA‡DO_INIT(PC),A0†Device-dependentroutineaddress.-‰MOVE.L„#T0GUARD,D0‰CallguardedtotheEXEC.‰TRAP†#0‰RTS‰PAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰COMMANDSERVICEROUTINE*>*‰Wegetenteredherewhentheattachedtask(IOS)invokesCMR?*‰viaaTRAP1withanINITIATEI/Oparameterblocktoprocess.>*‰CMRhasalreadycheckedtheCMRparameterblocktoensureit<*‰resideswithintheaddressspaceoftheattachedtask.‚IOSA*‰hasalreadyvalidatedtheIOCB,exceptforthebufferaddresses *‰therein.*@*‰WegotherethroughaJSRfromCMR,andwillexitwithanRTS.>*‰AllregistershavebeensavedbyCMRandmaybeusedfreely.?*‰Entryisatinterruptlevel0,andweareinsupervisormode.*5*‰Entry:A2=physicaladdressofCMRparameterblock*A5=physicaladdressofCCB*9*‰Calls:TERM_COMMANDingenericterminaldriverTERMLIB.*3*‰Exit:‚D0=resultsofparameterblockvalidation:3*•always0inourcase,indicatingitwasOK,since2*•IOSwillnotsendusanyrequestexceptHALTI/O/*•ifwearealreadybusy,andCMRmakesallthe*•otherchecks.**J**************************************************************************J**************************************************************************J************************************************************************** COMMAND: *,*‚Performanydevice-dependentstuffhere...*9‰ST.BƒTBE_FLAG(A5)‹Settheflagtoindicatebufferempty.*I*‚Performthedevice-independentcommandhandlerbycallingTERM_COMMAND.* %ŠJSR…TERM_COMMAND†PerformthecommandŠRTS—returntoCMR.ŠPAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰INTERRUPTHANDLINGROUTINE*<*‰ThisroutinecompletesI/Orequestsstartedbythecommand:*‰serviceroutine.‚Itisenteredattheinterruptpriority;*‰levelofinterruptsonthischannel,andisessentiallya9*‰subroutinetothefirstlevelinterrupthandlerinCMR.=*‰Remember,however,thatthisisasubordinatedriver--hence=*‰theinterruptwasfieldedfirstbythesupervisorusedwith(*‰whatevertypeofboardwe'rehandling.* 5*‰Entry:A0=addressofthesupervisordriver'sCCB.*A5=addressofourCCB.3*D1=CopyofInterruptStatusRegisterfrom2681.*"*D0,A0,A1havebeensavedbyCMR.-*D1‡hasbeensavedbythesupervisordriver.*D0,A1„areavailabletouse.8*A0‡mustbereturnedtothesupervisorwiththeaddress*šofthesupervisor'sCCB.4*D1‡mustbereturnedtothesupervisorwiththebit(*špatternofinterruptslefttoservice.*>*‰Exit:‚alwaysviaRTS,whichtakesusbacktothesupervisor.**‰Stack:*(A7)+8... *(A7)+4longwordreturnaddress6*(A7)ƒlongwordsavedcontentsofD1(mustberestored*—beforeexittoCMR)*J**************************************************************************J**************************************************************************J************************************************************************** INTERRUPT: *‚NOTE:*?*‚ThisdriverrequiresasupervisordriversinceithandlestheA*‚SCN2681.‚ThesupervisordriverwrittenforusewiththisoneisC*‚DARTSPR,whichbranchestotheappropriatelongwordinthistableC*‚dependingoninterrupttype.‚ThesupervisorwillnotpasscontrolA*‚tothisdriverunlessthereisinfactaninterruptonmyport.**‚ENTRYPOINTS:*%ŠBRA.S‚RCACharacterreceivedforme.ŠNOP'ŠBRA.S‚TBEMytransmitbufferisready.ŠNOP-ŠBRA.L‚BCIChangeinBREAKstatusonmyport.ŠNOP&ŠBRA.L‚IP2InputPort2Statuschange.ŠPAGEJ***************************************************************************)*‰TRANSMITBUFFEREMPTYINTERRUPTHANDLER*@*‰TheSCN2681'stransmitbufferjustbecameempty,soifwehave+*‰morecharacterstosendwecandoitnow.*5*‰Entry:A0=addressofthesupervisordriver'sCCB.*A5=addressofCCB7*D1=copyofInterruptStatusRegisterfromthe2681.*9*‰Calls:TERM_TBEinthegenericterminaldriverTERMLIB.*<*‰Sincethisisnotasubroutine,registersatexitarejust-*‰theentryrequirementsofthenextroutine.*O******************************************************************************* TBE:.ŠMOVE.LCCBCHB(A5),A1†A1<--addrofourport.<ŠMOVE.LA0,SAV_SPR(A5)…Saveaddressofthesupervisor'sCCB. 4ŠBCLRƒ#CLRTBE,D1‰ClearinterruptbitincopyofISR.*ŠMOVE.LD1,SAV_ISR(A5)…SaveitintheCCB. ?ŠTST.B‚BRK_FLAG(A5)‡IsthisTBEbecausewe'retransmittingbrk?+ŠIF…THENŠTheflagissetifyes,so...(‹MOVEQ‚#0,D0PutsomenullsintoD0,and:‹MOVE.BD0,DREG(A1)‡Outputacharactertoclearinterrupt.)‹BRA.L‚INT_EXITŠExitfromthisinterrupt.ŠENDI 3ŠPUT_BYTETXOFF,D0‰Setdisabletransmittercommand.5ŠMOVE.BD0,SAV_CREG(A5)„ReplacecurrentvalueinCCB.=ŠMOVE.BD0,CREG(A1)ˆClearinterruptbydisablingtransmitter.5ŠST.BƒTBE_FLAG(A5)‡Setflagtoindicatebufferempty.*D*‚Nowcallthedevice-independentroutinethattestsfortransparent/*‚modeandinvokestheXMITbackgroundroutine.*ŠJSR„TERM_TBE‹JSRintoTREMLIB.(ŠBRA.L‚INT_EXIT‹Exitfromtheinterrupt.ŠPAGEJ***************************************************************************(*‰RECEIVEDCHARACTERAVAILABLEINTERRUPT*@*‰TheSCN2681hasjustreceivedacharacter,anditisavailable=*‰forreading.‚Wewilldothatnow,andtheresultwillgoin$*‰thereceivequeueifthere'sroom.*5*‰Entry:A0=addressofthesupervisordriver'sCCB.*A5=addressofCCB7*D1=copyofInterruptStatusRegisterfromthe2681.*>*‰Calls:TERM_GOT_CHARinthegenericterminaldriverTERMLIB.*<*‰Sincethisisnotasubroutine,registersatexitarejust-*‰theentryrequirementsofthenextroutine.*J************************************************************************** RCA:.ŠMOVE.LCCBCHB(A5),A1†A1<--addrofourport.<ŠMOVE.LA0,SAV_SPR(A5)…Saveaddressofthesupervisor'sCCB.*7*‚Getthecharacterfromthe2681andcheckforerrors.*>ŠMOVE.BDREG(A1),D0ˆClearinterruptbygettingcharfrom2681.2ŠBCLRƒ#CLRRCA,D1‰ClearbitinworkingcopyofISR. *ŠMOVE.LD1,SAV_ISR(A5)…SaveitintheCCB. 3ŠMOVE.BSREG(A1),D1ˆGetthestatusfortheprocess./ŠAND.B‚#$70,D1ŒMaskoutallbuttheerrorbits.1ŠBNE.S‚INTERRBranchifanyerrorbitsturnedon.*D*‚Callthedeviceindependentroutinetocheckfortransparentmode,D*‚andanyspecialcharacterssuchasXON,XOFF,BREAKEQUIVALENT,or?*‚DISCARDOUTPUTandinvoketheappropriatebackgroundroutine.9*‚Otherwise,justputthecharacterinthereceivequeue.*"ŠJSRƒTERM_GOT_CHAR‡JSRtoTERMLIB.(ŠBRA.L…INT_EXITˆExitfromtheinterrupt.ŠPAGEJ***************************************************************************#*‰FOUNDERRORONRECEIVEDCHARACTER*=*‰TheSCN2681detectedanerrorintheprocessofreceivinga<*‰character.‚Weneedtorecordthisinformationsothatwhen<*‰thecorrespondingdataisrequestedfromthereceivequeue*‰wecanreportanerror.*0*‰Entry:D0.B=characterwhichgeneratederror.0*D1.B=statusregistervalue(errorbitsonly)*A1ƒ=addressofourport*A5ƒ=addressofCCB*8*‰Calls:LOG_ERRinthegenericterminaldriverTERMLIB.*<*‰Sincethisisnotasubroutine,registersatexitarejust-*‰theentryrequirementsofthenextroutine.*J************************************************************************** INTERR:ŠSWAPƒD0‘Makeroom.:ŠMOVE.BSAV_CREG(A5),D0„Currentvalueofcommandregister.0ŠOR.Bƒ#RSTEST,D0‰Setthereseterrorstatusbit.(ŠMOVE.BD0,CREG(A1)ˆTellittothechip.ŠSWAPƒD0‘Restorecharacter. )ŠBTSTƒ#SPARER,D1‰Wasthisaparityerror?-ŠIF…THENŠIftheparityerrorbitisset,8‹PUT_BYTEPAR_FRAM,D0…PuttheVERSAdoserrorcodeinD0,‹JSR„LOG_ERR‹Logtheerror.-‹BRA.L‚INT_EXITŠAndexitfromthisinterrupt.ŠENDI )ŠBTSTƒ#SDAOVR,D1‰Wasthisadataoverrun?3ŠIF…THENŠIfthedataoverrunerrorbitisset,7‹PUT_BYTEOVERRUN,D0†PuttheVERSAdoserrorcodeinD0,‹JSR„LOG_ERR‹Logtheerror.-‹BRA.L‚INT_EXITŠAndexitfromthisinterrupt.ŠENDI *ŠBTSTƒ#SFRMER,D1‰Wasthisaframingerror?.ŠIF…THENŠIftheframingerrorbitisoff,-‹BRA.L‚INT_EXITŠWeshouldn'tbeheresoexit."ŠELSE–Theframingerrorbitison,3‹TST.B‚D0Solet'sseeifitreallyisacharacter.9‹IF…THEN‰Characterisreal,andsoisframingerror.8ŒPUT_BYTEPAR_FRAM,D0„PuttheVERSAdoserrorcodeinD0,ŒJSR„LOG_ERRŠLogtheerror.-ŒBRA.L‚INT_EXIT‰Andexitfromthisinterrupt.‹ENDIŠENDI‰PAGE*$*‚Thismusthavereallybeenabreak*7ŠMOVE.BSAV_CREG(A5),D0„GetcurrentvaluefromtheCCB.0ŠOR.Bƒ#RSTBCI,D0‰Settheresetbreakstatusbit..ŠMOVE.BD0,CREG(A1)ˆThisclearstheinterrupt. *ŠMOVE.LSAV_ISR(A5),D1…GetvaluefromCCB.4ŠBCLRƒ#CLRBCI,D1‰ClearinterruptbitincopyofISR.*ŠMOVE.LD1,SAV_ISR(A5)…SaveitintheCCB. ŠBKGRNDBREAKŠBRA.L‚INT_EXITŠPAGEJ****************************************************************************‰BREAKCHANGEINTERRUPT*9*‰Thisinterruptfromthe2681iscausedwheneitherport6*‰hasdetectedthebeginningorendofabreaksignal.9*‰Theonlyconditionwecareaboutiswhenabreaksignal:*‰starts(detectedfromthestatusregisterforourport),:*‰inwhichcasewehavetogetanappropriateeventtothe9*‰attachedtask(IOS).Forbothinterrupts,wemustissue7*‰a'resetbreakchangeinterrupt'commandtoclearthe*‰interruptbitintheISR.*.*‰Entry:A0=addressofthesupervisor'sCCB.*A5=addressofCCB?*D1=workingcopyofInterruptStatusRegisterfromthe2681.*;*‰Calls:TERM_BREAKinthegenericterminaldriverTERMLIB.*<*‰Sincethisisnotasubroutine,registersatexitarejust-*‰theentryrequirementsofthenextroutine.*J************************************************************************** BCI:.ŠMOVE.LCCBCHB(A5),A1†A1<--addrofourport.<ŠMOVE.LA0,SAV_SPR(A5)…Saveaddressofthesupervisor'sCCB. DŠMOVE.BSREG(A1),SAV_SREG(A5)Savecurrentvalueofstatusregister. ,ŠMOVE.BSAV_CREG(A5),D0„Getcurrentcommand. 3ŠOR.Bƒ#RSTBCI,D0‰Settheresetbreakstatuschange.6ŠMOVE.BD0,CREG(A1)ˆThisclearstheBCIinterruptbit.2ŠBCLRƒ#CLRBCI,D1‰ClearbitinworkingcopyofISR.ŠMOVE.BD1,SAV_ISR(A5)…Saveit. **‚CleartheFIFO...*?CLRFIFOƒMOVE.B6(A1),D0‹ReadtheFIFO...upto3bytestoclear.ŠMOVE.B6(A1),D0‹*ŠMOVE.B6(A1),D0‹* 2ŠBCLRƒ#CLRRCA,D1‰ClearbitinworkingcopyofISR.*ŠMOVE.LD1,SAV_ISR(A5)…SaveitintheCCB. ;ŠMOVE.BSAV_SREG(A5),D0„Getsavedvalueofstatusregister.4ŠBTSTƒ#SRXBRK,D0‰Thisbitindicatesbegin/endbreak..ŠBEQ„INT_EXIT‹Ifitwastheend,soexit. 7ŠJSR„TERM_BREAK‰JSRtoTERMLIBtohandledev-indbreak.&ŠBRA„INT_EXIT‹Exitfromtheinterrupt.ŠPAGEO*********************************************************************************‰IP2INTERRUPT*<*‰TheInputPort2hasmadeatransition(active-to-inactive>*‰orinactive-to-active).TheInputPort2isjumperedtoPort>*‰Bandhard-wiredtoRS232line20.IP2ismonitoredfromthe;*‰InputPortChangeRegister(IPCR)oftheSCN2681.TheIP2<*‰interruptisenabledformodemoperationonly(theIOAMODM<*‰bitinIOSATWisset).‚Itislikelythattheuserwillfix;*‰theMVME115sothatpin8oftheRS232interfacecomesin *‰onIP2.*>*‰TheIPCRisread,anddependingonthecurrentstateofIP2,C*‰theappropriatebackgroundroutineisactivated(IP2activelow).*@*‰IfIP2wentinactive-to-active,thenamodemprobablyanswered@*‰thephoneandweactivateBREAKinthebackground.‚IfIP2wentA*‰active-to-inactive,thenthemodemhunguportheterminalwentA*‰unready,andwemayhavetoqueueaneventiftherewasI/O.We.*‰activateIPCinthebackgroundtohandleit.***‰Entry:A0=addressofsupervisor'sCCB.*A5=addressofCCB?*D1=workingcopyofInterruptStatusRegisterfromthe2681.*<*‰Sincethisisnotasubroutine,registersatexitarejust-*‰theentryrequirementsofthenextroutine.*O******************************************************************************* IP2:4ŠBCLRƒ#CLRIP2,D1‰ClearinterruptbitincopyofISR.*ŠMOVE.LD1,SAV_ISR(A5)…SaveitintheCCB.<ŠMOVE.LA0,SAV_SPR(A5)…Saveaddressofthesupervisor'sCCB. ŠMOVE.LADRSIDEA(A5),A0>ŠMOVE.BIPCR(A0),D0ˆD0<--currentinputportchangeregister.**£(readingthisregisterclearsinterrupt) 9ŠBTSTƒ#STAIP2,D0‰TestIP2toindicateactiveorinactive.)ŠBNE.S‚IPC20ŽIP2islow,deviceisready.8ŠBKGRNDBREAKŽHandledevicereadywithbackgroundBREAK.ŠBRA.S‚INT_EXIT 9IPC20…BKGRNDIPCHandledeviceunreadyinbackgroundIPC.8*‰BRA.L‚INT_EXIT‹Fallthroughtointerruptexitroutine.ŠPAGEO*********************************************************************************‰INTERRUPTEXITROUTINE*;*‰Allinterruptsreturntothesupervisorviathisroutine.6*‰HerewelookatourflagSAV_ISRintheCCB.‚SAV_ISR7*‰startedoutlookingexactlyliketheInterruptStatus;*‰Registerfromthe2681.‚AsweclearedinterruptbitsfromA*‰thevarioussourcesofinterrupts,weclearedbitsinourflag.A*‰Thefunctionofthisroutineistoletussetupforourreturn*‰tothesupervisor.*O******************************************************************************* INT_EXIT:;‰MOVE.LSAV_SPR(A5),A0‰Restoreaddressofsupervisor'sCCB.0‰MOVE.LSAV_ISR(A5),D1‰RestoreourflagintoD1.+‰RTS›Andwemustgobacktothesupervisor.  SPC 15O********************************************************************************"*ˆENDOFINTERRUPTSERVICEROUTINE*O*******************************************************************************ŠPAGEO*********************************************************************************!*ROUTINES„CALLED„BY**–TERMLIB**O*******************************************************************************‰PAGEL***************************************************************************** *ˆTRANSMITTHECHARACTER*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledA*ˆatthebeginningofthedriver.‚ThefunctionofthisroutineisC*ˆwritethecharactercontainedinD0tothetransmitdataregister*ˆofthedevice.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*-*ˆEntry:A1=addressofoursideofthechip*A5=addressofCCB*D0.B=charactertotransmit**Interruptlevelonentryis0**ˆExit:‚RTStocaller.*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*J************************************************************************** PUT_CHAR:ŠINHIBIT>ŠMOVE.B#TXON,SAV_CREG(A5)„SaveenabletransmittercmdinCCB.2ŠMOVE.BSAV_CREG(A5),CREG(A1)Tellittothechip.+ŠMOVE.BD0,DREG(A1)‹Transmitthecharacter.6ŠSF.BƒTBE_FLAG(A5)ŠClearflagtoindicatebufferfull.'ŠUNMASK—Mustexitatinterruptlevel0.ŠRTSŠPAGEM******************************************************************************$*ˆCHECKTHEDEVICE'STRANSMITBUFFER*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.ThefunctionofthisroutineistoF*ˆcheckthatthetransmitbufferisemptybeforeallowinganytransmit *ˆactivity.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*-*ˆEntry:A1=addressofoursideofthechip*A5=addressofCCB**Interruptlevelonentryis0*/*ˆExit:‚RTStocallerwithConditioncodesset:"*=transmitbuffernotempty*=transmitbufferempty*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*M***************************************************************************** CK_TBE:*E*‚Testtheflagtosimulatetransmitbufferemptystatus.‚TheflagisJ*‚setwhenacharacterisoutputandclearedwhenthetranmitbufferempty*‚interruptisreceived.*ŠTST.B‚TBE_FLAG(A5)ŠRTSŠPAGEH************************************************************************* *ˆDEVICEDEPENDENTRESETROUTINE*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.ThefunctionofthisroutineistoC*ˆperformaminimumresetofthedevice.FortheSCN2681thismeans6*ˆclearinganyerrorstatusandenablingthereceiver.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.**ˆEntry:A5=addressofCCB**Interruptlevelonentryis0**ˆExit:‚RTStocaller*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*E********************************************************************* DDP_RESET:6ŠMOVEM.LD0/A1,-(A7)‹Saveusedregistersonthestack.1ŠMOVE.LCCBCHB(A5),A1ŠA1<--addressofourport..ŠPUT_BYTERXON,D0ŽBesureweturnreceiveron.5ŠMOVE.BD0,SAV_CREG(A5)ˆSaveascurrentvalueinCCB.4ŠOR.Bƒ#RSTEST,D0Setreseterrorstatuscommandbit.(ŠMOVE.BD0,CREG(A1)ŒTellittothechip./ŠMOVEM.L(A7)+,D0/A1‹Restoreworkingregisters.ŠRTSŠPAGEJ***************************************************************************@*ˆSUBROUTINETOSETUPTHEDEVICEACCORDINGTOTHECONFIGURATION*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.ThefunctionofthisroutineistoE*ˆsetupthedeviceaccordingtotheworkingconfigurationintheCCB3*ˆandsomeconfiguration-relatedfieldsintheCCB.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.**ˆEntry:A5=addressofCCB**Interruptlevelonentryis0**ˆExit:‚RTStocaller*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*J************************************************************************** SETUP: 2ŠMOVEM.LD0-D2/A0-A2,-(A7)„Saveworkingregisters.ŠPUSHƒSR **‚Firstsetupaddresses.*4ŠLEA„CONFIG(A5),A0†A0<--addrofCCBconfiguration..ŠMOVE.LCCBCHB(A5),A1†A1<--addrofourport..ŠMOVE.LADRSIDEA(A5),A2„A2<--addrofportA. */*‚InsurethatRTSifoff(unready)forourport*3‹BTST.B#0,CCBTYPE(A5)‡Ifwe'rehandlingtheAport ‹IF…THENŒ(we'retheA-side)7ŒMOVE.B#RTSAOFF,OPRR(A2)ƒsettheRTSlineHIGHviaOP0‹ELSE˜(we'retheB-side)7ŒMOVE.B#RTSBOFF,OPRR(A2)ƒsettheRTSlineHIGHviaOP1‹ENDI˜* **‚Performsomeresets.*3ŠMOVE.BSAV_CREG(A5),D0‡GetcurrentvaluefromCCB.,ŠOR.Bƒ#RSTEST,D0ŒSetreseterrorstatusbit.(ŠMOVE.BD0,CREG(A1)‹Tellittothechip. PAGE**‚ProgramModeRegister1"*ˆstartwith:flowcontrolenabled*”interruptuponFIFOfull*”charactererrormode3*ˆdetermineotherfieldsfromcurrentconfiguration*ˆworkingregisterisD0 !‰PUT_BYTE‚RXIRDY+CRXRTS+EMCHAR,D0 * Parity Mode [4:3]>ŠBTSTW‚#IOAUSEP,IOSATW(A0)ƒIfwe'reusingparity,enableit... ŠIF…THEN)ŠOR.Bƒ#PAROFF,D0ŒMustsetnoparitybits.ŠELSE+ŠOR.Bƒ#PARENB,D0ŒOrsetenableparitybits.ŠENDI* Parity Type [2]:ŠBTSTW‚#IOAPRTY,IOSATW(A0)ƒAndifwe'reusingevenparity,ŠIF…THENsetitup.ŠOR.Bƒ#PAREVN,D0ŠENDI * Character Length [1:0]1ŠBTSTW‚#IOABITS,IOSATW(A0)ƒAddinbits/charinfo. ŠIF…THENŠOR.Bƒ#DTBPC7,D0Œ(7bits/char)ŠELSEŠOR.Bƒ#DTBPC8,D0Œ(8bits/char)ŠENDI *!*‚ProgramModeRegister2(MREG2)*ˆstartwith:‚normalmode*•NoTxRTScontrol*•NoTxCTScontrol(*ˆdeterminestopbitsfromconfiguration*ˆworkingregisterisD1 ‰PUT_BYTECMNORM,D1 * Stop Bit Length [3:0]:ŠBTSTW‚#IOASTPB,IOSATW(A0)ƒAddinthenumberofstopbits. ŠIF…THENŠOR.Bƒ#SB1,D1(1stopbit)ŠELSEŠOR.Bƒ#SB2,D1(2stopbits)ŠENDI PAGE$‰INHIBIT—Inhibitinterruptswhile...3‰MOVE.BSAV_CREG(A5),D2ˆGetcurrentvaluefromCCB.1‰OR.Bƒ#RSTMRP,D2Setresetmoderegisterpointer.(‰MOVE.BD2,CREG(A1)ŒTellittothechip./‰MOVE.B„D0,MREG1(A1)ˆProgrammoderegister1...)‰MOVE.B„D1,MREG2(A1)ˆandmoderegister2.‰ENABLE *C*‚ClockSelectRegister(CSEL)andAuxiliaryControlRegister(ACR)6*‡setsthebaudrateforthereceiverandtransmitter.*‡workingregisterD0andD1 *‰MOVEQ.L#0,D0‘Cleartheworkingregister.6‰MOVE.B‚IOSBRT(A0),D0‰GettheVERSAdosbaudrateCODE.,‰LSL.Lƒ#1,D0‘DoubleittouseinBAUD_TABLE.<‰MOVE.W‚BAUD_TABLE(PC,D0.W),D1GettheRx/Txbaudratecodes%*§andbaudratesetbitfromtheBaud(*§RateConversionTableforthisdevice. *3*‚NowwritetotheAuxiliaryControlRegister(ACR)(*‚(AccessedfromchannelAaddressonly)*?‰BTSTW‚#IOAMODM,IOSATW(A0)‚Ifthisisamodemwe'retalkingto,‰IF…THEN*7ŠOR.B„#INTIP2,D1‰AllowinterruptsthroughInputPort2.‰ENDI<‰MOVE.B‚D1,ACR(A2)ŠTellthechipwhichbaudratesettouse. <*‚NowwritetotheClockSelectRegisterforthebaudrates. .‰ROR.Wƒ#8,D1‘Putthebaudratecodesinto‚LSB.9‰MOVE.B‚D1,CSEL(A1)‹MoveLSB(baudratecodes)intoCSEL. *+*‚ProgramtheInterruptMaskRegister(IMR)=*ˆThedriverselectedwhichISRbitswillcauseaninterrupt.-*ˆTheseare:changeinbreak,channelAandB*“RxRDY,channelAandB*“TxRDY,channelAandB*“InputPortChangeonIP21*ˆThecounter/timerinterruptbitisturned'off' 3ŠBTST.B#0,CCBTYPE(A5)ˆIfwe'rehandlingtheAport ŠIF…THEN(we'retheA-side)0‹MOVE.B#$07,D0ŽallowinterruptsonA-sideonly.ŠELSE™(we'retheB-side)2‹MOVE.B#$F7,D0ŽallowinterruptsonAandBsides.ŠENDI™*'ŠMOVE.BD0,IMR(A2)ŒTellittothechip. ŠBRA.S‚SET10 PAGEO********************************************************************************"*‰TABLEFORTRANSLATINGBAUDRATES*O******************************************************************************* **-----------------DefinesSet1orSet2*|&*|---------------Baudratesetcode*||*VV BAUD_TABLEŠDC.Bƒ$00,0‡50 ŠDC.Bƒ$00,1‡75ŠDC.Bƒ$11,0†110ŠDC.Bƒ$22,0†134.5ŠDC.Bƒ$33,1†150ŠDC.Bƒ$44,0†300ŠDC.Bƒ$55,0†600ŠDC.Bƒ$66,0…1200ŠDC.Bƒ$AA,1…1800ŠDC.Bƒ$77,1…2000ŠDC.Bƒ$88,0…24000ŠDC.Bƒ$88,0…3600…Wedon'thaveitsoweuse2400ŠDC.Bƒ$99,0…4800ŠDC.Bƒ$AA,0…7200ŠDC.Bƒ$BB,0…9600ŠDC.Bƒ$CC,1„19200 SET10…DS.Wƒ0 PAGE*!*‚ProgramCommandRegister(CREG)+*ˆcurrentstateis:RTSlinehigh(unready)#*šreceiverandtransmitterdisabled5*ˆWemustmakeusreadyandenabletheReceiveronly.  "* Make us ready by setting RTS low 3ŠBTST.B#0,CCBTYPE(A5)‡Ifwe'rehandlingtheAport ŠIFTHEN(we'retheA-side)5‹MOVE.B#RTSAON,OPSR(A2)„settheRTSlineLOWviaOP0ŠELSE˜(we'retheB-side)5‹MOVE.B#RTSBON,OPSR(A2)„settheRTSlineLOWviaOP1ŠENDI˜* %* See if the user wants us offhook...7‰BTSTW‚#IOAOFFH,IOSATW(A0)ƒIftheguywantsitoffhook,&‰IF…THENMakeourport'unready'.3‰BTST.B#0,CCBTYPE(A5)ˆIfwe'rehandlingtheAport ‰IF…THEN(we'retheA-side)7ŠMOVE.B#RTSAOFF,OPRR(A2)„settheRTSlineHIGHviaOP0‰ELSE™(we'retheB-side)7ŠMOVE.B#RTSBOFF,OPRR(A2)„settheRTSlineHIGHviaOP1‰ENDI™*‰ENDI )* Now enable the receiver and we're done..ŠPUT_BYTERXON,D0ŠSetenablereceivercommand.5ŠMOVE.BD0,SAV_CREG(A5)„ReplacecurrentvalueinCCB.(ŠMOVE.BD0,CREG(A1)ˆTellittothechip. **‚Restoreregistersandreturn.*ŠPOP…SR8ŠMOVEM.L(A7)+,D0-D2/A0-A2Restoreregistersfromstack.ŠRTSŠPAGEO*********************************************************************************ˆRESETTHECLOCK*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.Thefunctionofthisroutineisto3*ˆchangetheclockspeedbacktoitsdefaultvalue.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*.*ˆEntry:A1=addressofoursideofthechip.*A5=addressofourCCB.**Interruptlevelonentryis0**ˆExit:‚RTStocaller*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*O******************************************************************************* CLOCK_RESET:*C*ƒThisfunctionalityisnotsupportedbytheSCN2681ontheVME115.*ŠRTSŠPAGEJ****************************************************************************ˆGETDEVICESTATUSBYTE*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.ThefunctionofthisroutineistoA*ˆpreparestheDEVICESTATUSbytewhichcontainstheconditionof6*ˆtheIP2line(whichindicatesdeviceready/unready).*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*8*ˆNote:‚Thisroutinedoesnotsetthebreakindicatorin*thedevicestatusbyte.**ˆEntry:A5=addressofCCB**Interruptlevelonentryis0*!*ˆExit:‚D0.B=DeviceStatusbyte*RTStocaller*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*J************************************************************************** GET_STAT: ,ŠCLR.B‚D0Devicestatusbytetobereturned.,ŠMOVEM.LD1/A0,-(A7)†Saveworkingregisters.*C*‚Onthe2681asimplementedontheMVME115,IP2cannotbedetectedC*‚onchannelA.‚IfwearechannelA,weassumewearealwaysready.B*‚IP2canbedetectedonchannelBviaInputPort2whichhasbeen*‚jumperedtotheRS232pin20.*6ŠMOVE.LADRSIDEA(A5),A0ƒA0<--addrofA-sideofchip.4ŠBTST.B#0,CCBTYPE(A5)„TestforAorBsideofchip.8‹IF…THENˆIfwe'retheB-sidethendeterminestatus.8ŒMOVE.BIPCR(A0),D1…Readtheinputportstatusregister.8ŒBTSTƒ#STAIP2,D1†Inputport2jumperedforRS232pin20.7IF…THEN†Signalactivelow;ifthenitshigh.:ŽBSETƒ#XDSNRB,D0„Settheunreadybitinthedevicestatus.ENDI‹ENDI /ŠMOVEM.L(A7)+,D1/A0†Restoreworkingregisters.ŠRTSŠPAGE M*******************************************************************************ˆSTOPTHETRANSMITTINGDEVICE*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.ThefunctionofthisroutineistoA*ˆchangeahardwareoutputlinetomakeourdevicelook'unready''*ˆsothetransmittingdevicewillstop.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*,*ˆEntry:A1=addressofoursideofdevice.*A5=addressofCCB*5*InterruptlevelonentryisINHIBITEDatourlevel.**ˆExit:‚RTStocaller*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*K*************************************************************************** DDP_STOP:ŠSAVEƒA0”Saveworkingregister.?ŠMOVE.LADRSIDEA(A5),A0‡Getthe2681'saddressoftheA-side...*ŠBTST.B#0,CCBTYPE(A5)ˆIfwe'retheA-side ‹IF…THENŒ(we'retheA-side):ŒMOVE.B#RTSAOFF,OPRR(A0)ƒsetRTSlineHIGHontheA-side.‹ELSE˜(we'retheB-side)>ŒMOVE.B#RTSBOFF,OPRR(A0)ƒsettheRTSlineHIGHontheB-side.‹ENDI%ŠRESTOREA0“Restoreworkingregister.ŠRTSŠPAGEK****************************************************************************$*ˆDEVICEDEPENDENTUNSTOPTHEDEVICE*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.ThefunctionofthisroutineistoC*ˆunstopthetransmittingdevicebychangingahardwareoutputline"*ˆtomakeourdevicelook'ready'.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*,*ˆEntry:A1=addressofoursideofdevice.*A5=addressoftheCCB*5*InterruptlevelonentryisINHIBITEDatourlevel.**ˆExit:‚RTStocaller.*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*J************************************************************************** DDP_UNSTOP:ŠSAVEƒA0”Saveworkingregister.?ŠMOVE.LADRSIDEA(A5),A0‡Getthe2681'saddressoftheA-side...3ŠBTST.B#0,CCBTYPE(A5)ˆIfwe'rehandlingtheAport ‹IF…THENŒ(we'retheA-side)5ŒMOVE.B#RTSAON,OPSR(A0)„settheRTSlineLOWviaOP0‹ELSE˜(we'retheB-side)5ŒMOVE.B#RTSBON,OPSR(A0)„settheRTSlineLOWviaOP1‹ENDI%ŠRESTOREA0“Restoreworkingregister.ŠRTSŠPAGEK****************************************************************************&*ˆDEVICEDEPENDENTBEGINBREAKROUTINE*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.Thefunctionofthisroutineisto@*ˆgiveacommandtostartsendingbreakconditiontoourdevice.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*,*ˆEntry:A1=addressofoursideofdevice.*A5=addressofCCB*5*InterruptlevelonentryisINHIBITEDatourlevel.**ˆExit:‚RTStocaller*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*E*********************************************************************  DDP_BEG_BREAK:ŠSAVEƒD01ŠPUT_BYTETXON,D0ŠSetenabletransmittercommand.+ŠMOVE.BD0,SAV_CREG(A5)„Savecurrentvalue.(ŠMOVE.BD0,CREG(A1)ˆTellittoourport.-ŠOR.Bƒ#BRKBEG,D0‰Setbeginbreakcommandbit.9ŠST…BRK_FLAG(A5)‡Setflagtoindicatetransmittingbreak.(ŠMOVE.BD0,CREG(A1)ˆTellittoourport. ŠRESTORED0ŠRTSŠPAGEK****************************************************************************$*ˆDEVICEDEPENDENTENDBREAKROUTINE*C*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledD*ˆatthebeginningofthedriver.Thefunctionofthisroutineisto?*ˆgiveacommandtostopsendingbreakconditiontoourdevice.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*,*ˆEntry:A1=addressofoursideofdevice.*A5=addressofCCB*5*InterruptlevelonentryisINHIBITEDatourlevel.* *ˆExit:‚RTStocaller*0*ˆThisroutinemustpreserveallregistersused.0*ˆTheinterruptleveluponexitmustbethesame*ˆasitwasuponentry.*L**************************************************************************** DDP_END_BREAK:ŠSAVEƒD03ŠPUT_BYTETXOFF,D0‰Setdisabletransmittercommand.+ŠMOVE.BD0,SAV_CREG(A5)„Savecurrentvalue.(ŠMOVE.BD0,CREG(A1)ˆTellittoourport.+ŠOR.Bƒ#BRKEND,D0‰Setendbreakcommandbit.5ŠSF…BRK_FLAG(A5)‡Clearflagtoindicateendofbreak.(ŠMOVE.BD0,CREG(A1)ˆTellittoourport. ŠRESTORED0ŠRTS SPC 15O******************************************************************************** *‰ENDROUTINESCALLEDBYTERMLIB*O*******************************************************************************ŠPAGEO*********************************************************************************“BACKGROUND**šAND**‘CALL__GUARDED**–ROUTINES**•(DEVICE-DEPENDENT)*O*******************************************************************************ŠPAGEO*********************************************************************************‰FINISHOFFTHEINITIALIZATION*A*‰TheinitializationroutinehasgonearoundresettingeverythingD*‰itcan,buttheroutinesRESETandDDP_RESETshouldonlybecalled>*‰fromwithinthebackground.‚Soheinvokedthisroutinetodo *‰itforhim.*?*‰Inaddition,theseotherdevice-dependentthingsMUSTbedone>*‰beforewecanhandlecommands.‚Theyprobablycouldhavebeen?*‰doneinINITatthestartofthedriverbutarehandledhere.*5*‰1.‚PutthestartaddressofthedriverintotheCCB*variableDRV_ADDR.>*‰2.‚Setupthedevice-dependentBABsusingthemacroSET_BAB.;*‰3.‚PuttheaddressoftheA-sideofadualchanneldevice6*intotheCCBvariableADRSIDEA.‚Ifnotdualchannel,**puttheaddressofPort1intoADRSIDEA.**‰Entry:A5=addressofCCB.*6*‰Calls:RESETinthegenericterminaldriverTERMLIB.*DDP_RESETinthisdriver.6*MARK_DOWNinthegenericterminaldriveriffailure.*O******************************************************************************* DO_INIT:**‚Inhibitinterrupts*‰PUSH†SR‰INHIBIT*)*‚GetaddressofstartofdriverintoCCB*ŠLEA‡DARTDRV(PC),A4ŠMOVE.L„A4,DRV_ADDR(A5)*"*‚SetupthedevicedependentBABs*ŠSET_BABƒIPC0,IPC*6*‚SetuptheaddressoftheAsideoftheSerialport.*@ŠMOVE.LCCBCHB(A5),ADRSIDEA(A5)‚MovedeviceaddressintoA-side.8ŠBTST.B#0,CCBTYPE(A5)‹Testthechanneltype-oddisB.)ŠIF…THENIfitsset,itstheB-side.9‹SUB.L#16,ADRSIDEA(A5)‰SubtracttheoffsettomakeitA.ŠENDI PAGE*3*‚Putthereceiverandtransmitterintoknownstate**ŠMOVE.LCCBCHB(A5),A1†Addressofourport..ŠMOVE.B#RSTTX,CREG(A1)„Resetthetransmitter.+ŠMOVE.B#RSTRX,CREG(A1)„Resetthereceiver.>ŠPUT_BYTETXRXOFF,D0‡Setdisabletransmitter/receivercommand.5ŠMOVE.BD0,SAV_CREG(A5)„CopyascurrentvaluetoCCB.(ŠMOVE.BD0,CREG(A1)ˆTellittothechip. ŠJSR„RESETŽReseteverything.ŠBSR.L‚DDP_RESETŠPOP‡SRŠRTS 7FAIL†JSR‡MARK_DOWN‡MarkthechanneldownusingTERMLIB.ŠPOP‡SRŠRTSŠPAGEO*********************************************************************************‰IPCTRANSITIONHANDLER*A*‰Thispartofthebackgroundrunswhenthechipsensesaactive-A*‰to-inactivechangeontheIP2line,whichiswiredtoRS232pin@*‰20ontheMVME115andjumperedforportB.‚Thismeansthatthe<*‰terminalormodemhasgoneunready.‚WecalltheTERM_UNRDYC*‰routineinTERMLIBtoqueueaneventforusifweweredoingI/O,B*‰otherwisewedonothing.‚Theonlyreasonthisbackgroundroutine=*‰existsisbecausewedonotwanttoqueueaneventwhileat*‰ourinterruptlevel.*B*‰ThisroutineiscalledusingBACKGROUNDsoweenteratinterrupt@*‰level0,andwemustexitatinterruptlevel0.‚Wearefreeto5*‰returnwhateverwelikeinallregistersexceptA7.* *‰IPC0Entry:(background)*A5=addressofCCB.* *‰IPC‚Entry:*A1=addressofourport.&*A4=addressofstartofourdriver.*A5=addressofourCCB.*;*‰Calls:TERM_UNRDYinthegenericterminaldriverTERMLIB.**‰Exit:‚A0=garbage*O******************************************************************************* IPC0:**‚SetupA5andA1;*‚Whentheexeccallsthisroutine,A1=addressoftheBAB*'ŠLEA„-IPC_BAB(A1),A5„A5<--CCBaddress0ŠMOVE.LCCBCHB(A5),A1†A1<--addressofourport4ŠMOVE.LDRV_ADDR(A5),A4„A4<--addressofourdriver IPC:*6*‚IP2isUNREADY.IfweweredoingI/O,sendanevent.*:ŠJSR„TERM_UNRDY‰TestforI/OandsendeventusingTERMLIB.3ŠIFTHENŽforgoodreturnfromsubroutine.ŽTR0$.KILLER‚,ŠENDIŠRTSŠPAGE************************„PATCHSPACE†************************ŠDS.Wƒ30ŠENDéééé=/*=/*†DARTSPR.AF=/*H=/* Chain file to assemble SCN2681 SUPERVISOR serial port driver for the$=/* local port on the MVME115 board.=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to DARTSPR.LS=/*=/IFC \1ƒ=ARGDARTSPR.LS=/ENDIF=/*$=ASM DARTSPR.SA,DARTSPR.RO,\1;RZ=100=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.CCB.EQ=/*ƒ9995.&.SCN2681.EQ=/*ƒ9999.M68230.M68230.EQ=/*}=/*=ENDéééééé Ð*‚TheCTMorCounter/TimerInterrupthasnotbeenimplemented.*C*‚ThevariableOFFSETistheoffsetintotheLONGWORDbranchtableJ*‚atthestartoftheinterruptserviceroutineinthesubordinatedriver.$*‚TheOFFSETsaresetupasfollows:**„-4=NOinterrupt**¨--‚Forthesefourinterrupts,<*…0=RCAA-side‡1=RCAB-side|‚itisimportantthatBit0?*…4=TBEA-side‡5=TBEB-side|‚issetsothatthesupervisorC*…8=BCIA-side‡9=BCIB-side|‚driverknowswhichchannel(side)**™13=IP2B-side|‚theinterruptisfrom.*¨--*4*„-4=CTM‚Thisinterruptsourceshouldneveroccur.8*ŽItismaskedinthesurbordinatedriverSETUProutine.* PAGE GENOFFSET MACROOFFSETSET-4Nointerrupts ! IFEQ (%10000000&VALUE)-%10000000OFFSETSET13IP2 ENDC ! IFEQ (%00010000&VALUE)-%00010000OFFSETSET5‘TBEonB-side ENDC ! IFEQ (%00000001&VALUE)-%00000001OFFSETSET4‘TBEonA-side ENDC ! IFEQ (%00100000&VALUE)-%00100000OFFSETSET1‘RCAonB-side ENDC ! IFEQ (%00000010&VALUE)-%00000010OFFSETSET0‘RCAonA-side ENDC ! IFEQ (%01000000&VALUE)-%01000000OFFSETSET9‘BCIonB-side ENDC ! IFEQ (%00000100&VALUE)-%00000100OFFSETSET8‘BCIonA-side ENDC  LIST VALUE SET VALUE Control register DC.B OFFSET ... and offset.VALUE SET VALUE+1 ENDM PAGEO*********************************************************************************ˆDEVICEDEPENDENTCCB*O******************************************************************************* ‰OFFSETCCBDDP0AB_FLAG‚DS.Wƒ1–Thisflagisusedtodetermineif *¦wejustservicedtheA-sideor!*¦B-sideuponourreturnfromthe *¦subordinateinterrupthandler. *******************‚MISCEQUATES‚******************* 3CLR_H3ƒEQU2™BitusedtoclearinterruptfromPI/T.2LVL_H3ƒEQU6™Bitdefininglevelofinterruptline.ŠPAGEJ***************************************************************************+*‰SERVICEVECTORTABLE,REVISIONINFO,ETC.*@*‰ThistableisexaminedbyCMRwhenthechannelisallocatedtoC*‰determinewheretogoforinterrupts,commands,&initialization.<*‰Itmustalwaysbeattheverytopofthedrivercode.‚Also>*‰includedisaparametertellingthenumberofextrapagesof>*‰memorytoincludeintheCCB,andinformationdescribingthe*‰revisionofthedriver.*L**************************************************************************** ŠSECTION‚0ŠOPT„BRS DARTSPR: *D*‚Servicevectortable.‚NoticethatthesevaluesarerelativetotheC*‚beginningofthedriversothemechanismisposition-independent!*=ŠDC.LƒINTERRUPT-DARTSPR‚Addressofinterruptserviceroutine.9ŠDC.LƒCOMMAND-DARTSPR„Addressofcommandserviceroutine.5ŠDC.LƒINIT-DARTSPR‡Addressofinitializationroutine.ŠDC.Lƒ0’Reserved. **‚OtherCMRparameters.*0ŠDC.Bƒ0’#ofextrapagesintheCCB.‚TheCCBmay)*§beanysizefrom1to256pages(apage'*§is256bytes):‚ifthisfieldis0,it*§willbe1page,etc.ŠDC.Bƒ0,0,0ŽReserved.ŠDC.Lƒ0,0,0ŽReserved. **‚Revisioninfo:*/ŠDC.Bƒ'110184'‹DateoflastassemblyasMMDDYY.1ŠDC.Bƒ''Spaceindicatesnopatchesto.LOfile.)ŠDC.Bƒ'4'MajorVERSAdosrevisionnumber.ŠPAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰INITIALIZATIONROUTINE*'*‰Entry:Allregistershavebeensaved.*A5=addressofCCB.**‰ExitstoCMR(viaRTS).*J**************************************************************************J**************************************************************************J********************** ****************************************************  INIT: *1*‚Wedon'thaveanythingtodoininitialization.*ŠRTSŠPAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰COMMANDSERVICEROUTINE*J**************************************************************************J**************************************************************************J************************************************************************** COMMAND: *D*‚Weshouldneverbecalledforcommandservice!‚Sincewehavebeen,*‚crashthesystem.* ŠTR0$.KILLERŠPAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰INTERRUPTHANDLINGROUTINE*;*‰Thisroutinegetscontrolwheneveraninterruptoccurson;*‰thisvector(unlessanotherhandler,earlieronthechain*‰forthisvector,claimedit).*+*‰Itisthetaskofthesupervisor(me)to:7*--determinewhethertheinterruptisfrommydevices*“(channelAorBofthe2681).2*--cleartheinterruptsourceatthePI/Tonthe5*”VME115(thePI/Tisresponsibleforthevectoring).7*--ifnotmine,returntoCMRwiththecarrybit0to**“indicatethattheinterruptwasn'tmine.9*--ifmine,setuptheenvironmentforandpasscontrol3*“totheappropriatesubordinatehandler,depending,*“uponthesourceandsideoftheinterrupt.*?*‰Thissupervisordriverisunliketheoneforthe7201inthat:*‰itisreturnedtofromthesubordinatedriverduetotheC*‰possibilityofhavingmulitplebitssetintheISRoftheSCN2681"*‰foroneinterruptfromthePI/T.*=*‰ExittoCMRiaalwaysviaRTS.‚Wesetthecarrybitinthis>*‰drivertotellCMRwhetherwehandledit.‚Weclearthecarry>*‰bittotellCMRwedidn'thandleit,andCMRshouldpassthe;*‰interruptontothenextguyinthechainonthatvector.*>*‰ThisdevicerunsontheMVME115whichdoesnotsupportSDLC.*J**************************************************************************J**************************************************************************J************************************************************************** INTERRUPT:ŠMOVEQ.L#0,D04ŠMOVE.LCCBCHB(A5),A0†A0<--addrofAsideof2681.)ŠMOVE.L#PIT_BASE,A1‡AddressofthePI/T.7ŠMOVE.B#1<wedon'thandleit.*A*‚SetupCCBaddressforourportandjumpcorrespondinghandler.*BINT_RTNƒMOVE.LCCBSUB(A0),A5†A5<--addrofCCBofA-sidehandler..ŠMOVE.W#0,AB_FLAG(A0)…CleartheAB-sideflag.2ŠBCLRƒ#0,D0ŽTest/cleartheA-side/B-sideflagbit.%ŠIF…THENŠIfitwasset(B-side),6ŠTST.L‚CCBSUB(A5)‰MakesurePortBhasbeenallocated.5ŠIF…THENŠThesubordinate'sCCBmustbenon-zero.;ŠMOVE.LCCBSUB(A5),A5†A5<--addrofCCBofB-sidehandler./ŠROR.B‚#4,D1ŽPutworkingISRintolowernibble..ŠMOVE.W#$FF,AB_FLAG(A0)ƒSettheAB-sideflag.+ŠELSE–PortBhasnotbeenallocated,so....,ŠBRA.S‚NO_SUPPORT‰Exit,nointerruptforus.ŠENDIŠENDI–* BŠMOVE.LCCBRTNI(A5),A1…A1<--entrypointforAorBsidehandler.6ŠJSR„(A1,D0.W)ŠJumptosubroutineinthebranchtable.*.*¡<---‚Whenwereturnhere,D1hasbee nsetup'*§withbitslefttoprocessintheISR,%*§andA0hasbeenmaintainedwiththe(*§addressoftheCCBforthesupervisor. PAGE*'*‚We'vereturnedfromthesubordinate..=*‚IfthereareanybitsstillsetinD1wemustprocessthem.*,ŠTST.L‚D1‘Isthereanyworklefttoprocess?9ŠBNE.S‚INT_TEST‹Branchifyestoprocessmoreinterrupts.*4*‚Itappearsthatallinterruptshavebeenserviced.?*‚However,thewayinwhichtheserialportinterruptlinesareH*‚inputtothePI/T,somemoreinterruptsmayhavecomeinwhilewewereG*‚servicingthosewhichweresetatthetimeweenteredthissupervisorI*‚driver.‚Justtobesure,wemustcheckthestatusoftheinterruptlineF*‚atthePI/T.‚Ifthelineislow(active)wemustreadonceagaintheC*‚interruptstatusregisteroftheSCN2681,andservicethosebits.F*‚Otherwise,we'llbeleftwithinterruptspendinganditspossibleto*‚hanguptheport.*)ŠMOVE.L#PIT_BASE,A1‡AddressofthePI/T.CŠBTST.B#LVL_H3,PSR(A1)„LVL_H3willbehighifnopendinginterrupt+ŠBNE.S‚INT_EXIT‹Exitsincenobitspending.*C*‚Ifwe'vereachedthispoint,therearenewinterruptstoservice.*$ŠMOVEQ‚#0,D1ŽA0<--addrofourCCB.4ŠMOVE.LCCBCHB(A0),A5†A5<--addrofAsideof2681.4ŠMOVE.BISR(A5),D1‰D1<--InterruptStatusRegister.ŠBRA.S‚INT_MORE*I*‚Ifwe'vereachedthispoint,thereareinterruptsleftovertoservice.*AINT_TEST‚TST.W‚AB_FLAG(A0)ˆYes,solet'sseeifweshouldrotate.#ŠBEQ„INT_MORE‹MoreworkforA-side.*ŠROL.B‚#4,D1ŽPositionISRbitsforB-side.INT_MORE‚MOVEQ.L#0,D0@ŠMOVE.BOFFSET_TABLE(PC,D1.W),D0‚D0<--offsetintointroutine.3ŠBPL„INT_RTNŒBranchtodeterminewhichsubordinate.*G*‚Ifwe'vereachedthispoint,therearenomoreinterruptstoservice.*INT_EXIT‚POP.L‚D1‘RestoreD1,7ŠMOVEQ‚#0,D0ŽsetcarrybittotellCMR'wehandledit'. ŠSUBQƒ#1,D0Ž*ŠRTS—andreturn.*1*‚Theinterruptwasnotforme,soreturntoCMR.*NO_SUPPORT POP.L D1>NOT_FOR_MEMOVEQ#0,D0ŽclearcarrybittotellCMR'notours'. ‹ADDQ‚#1,D0Ž*‹RTS–andreturn. PAGEO********************************************************************************5*ˆNOTESABOUTTHEINTERFACETOTHESUBORDINATEDRIVER*A*ˆThesubordinatechannel'sinterruptentrypointmustbeginwith*ˆcodelikethefollowing:* *ˆINTERRUPT:4*ˆ*‚Interruptsreceivedfromthe2681ontheMVME115 *’BRA.L‚RCA *’BRA.L‚TBE *’BRA.L‚BCI *’BRA.L‚IPC*9*ˆThesubordinatedrivermayusefreely(withoutPUSHing)0*ˆanyofthefollowingregisters:ƒD0,D1,A0,A1,A5*C*ˆUponleavingthissupervisordriverandenteringthesubordinate,#*ˆtheregistersaresetasfollows:)*ŒA0<--addressofthesupervisor'sCCB.@*ŒA1<--entrypointforsubordinatedriver'sinterruptroutine.**ŒA5<--addressofthesubordinate'sCCB.7*ŒD0<--offsettofirstsubordinateroutinetohandle.<*ŒD1<--currentInterruptStatusregistervaluetoworkon.*A*ˆD1mustbesetupwiththebitslefttoprocessintheISR,and@*ˆA0mustbesetupwiththesupervisor'sCCBaddressbeforethe=*ˆsubordinateexitsfromitsinterrupttourtoreturntothis*ˆsupervisordriver.*O*******************************************************************************ŠPAGEO*******************************************************************************O********************************************************************************2*‰OFFSETTABLEFORINTERUPTSTATUSREGISTERVALUES*>*‰Thefollowingstepsareusedtodeterminesourceandsideof*‰a2681interrupt:*=*‰1.The8-bitvalueoftheInterruptStatusRegisterisread"*ŒandeventuallygetsputintoD1.>*‰2.Thecorrespondingoffsetisreadfromthistableandgets<*ŒoutintoD0.Bit0oftheoffsetisusedasaflagforthe7*ŒsupervisordrivertoindicatechannelAorchannelB.1*ŒBit0=0meansA-side;‚Bit0=1meansB-side.?*‰3.Ifcorrespondingoffsetcomesoutnegative,(-4=$FC),then9*Œth  einterruptisnotforus.‚Otherwise,theoffsetsare *Œasfollows:*Ž0=RCAinterruptA-side*Ž1=RCAinterruptB-side*Ž4=TBEinterruptA-side*Ž5=TBEinterruptB-side*Ž8=BCIinterruptA-side*Ž9=BCIinterruptB-side*13=IP2interruptB-side**O*******************************************************************************O******************************************************************************* OFFSET_TABLE: ŠNOLIST VALUE…SET„0 ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLE ŠGENTABLEŠLIST ŠENDééééééé=/* =/*†DRVLIB.LF=/*'=/* Link chain file to create DRVLIB.RO.=/* Input modules should all be in SECTION 15.=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to DRVLIB.LL=/*=/IFC \1ƒ=ARGDRVLIB.LL=/ENDIF=/*=LINK„,DRVLIB.RO,\1;HMIXRINPUT DRVLIB.QEVENT.ROIN„DRVLIB.LOGPHY.ROINPUT DRVLIB.SETTIME.ROEND=/*=ENDéééé  éé"=/*=/*†EPCIDRV.AF=/**=/* Chain file to assemble SIG 2661 driver=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to EPCIDRV.LS=/*=/IFC \1ƒ=ARGEPCIDRV.LS=/ENDIF=/*$=ASM EPCIDRV.SA,EPCIDRV.RO,\1;RZ=150=/*{ Included files are:=/*ƒ9995.&.SIG2661.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.CCB.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.LV5.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.TERMINAL.EQ=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.TERMCCB.EQ=/*}=/*=ENDééééé+>EPCIDRVƒIDNTƒ4,1‡VERSADOS2661TERMINALDRIVERWITHTYPE-AHEAD;ŠTTL„EPCIDRV:‚VERSADOS2661TERMINALDRIVERWITHTYPE-AHEAD ŠLLENƒ120J**************************************************************************J**************************************************************************J**************************************************************************J***************************************************************************9*‰EPCIDRV:‚VERSAdos2661terminaldriverwithtype-ahead.*8*‰Purpose:‚VERSAdosdevicedrivertohandleasynchronous3*terminals(ofanytype)overtheSIG2661chipon*thefollowingboards:*’VM01ˆMVME101**‰Revisionhistory:*7*02/14/85‚ModifiedINITERRroutinetoclearthestatus5*šregisterflags;oldinstruciondidnotclearflags./*šModifiedPUT_CHARtodisableinterruptsuntil,*šcharacteristransmitted;oldinstructions *šallowedcharacterstobelost.  éééé 4=ETMFU:]4e<m6u}>…>•NL¥K­Nµ;1*10/23/84‚AllBSR'stoTERMLIBnowJSR'sincase.*šTERMLIBislocatedmorethan32Kbytesaway.:*10/01/84‚ChangedPASS19.MPSCDRV.SAtodrivetheSIG2661,+*šalsodeletedXREF'stoBREAKandGET_LEN.3*‘8/30/84‚FixedSPRconcerningSETUP.‚Commentedout(*šthecodethatteststhemodembit.‚Now**šiftheoffhookbitisset,theDTRline&*šissetlow,‚whetherornotthemodem *šbitisset.*6*‘10/3/83‚Changestoletinterruptsworkcorrectlyfor**š2661chip.AlsoallowesDATAI/Otowork0*šviaRTSline(notDTR).DTRisalwaysenabled.*š(2661chiponly).,*šChangedby:MarcoSchmidtMotorolaMunich.2*‘8/19/83‚Addedconditionalassemblystufftomake-*šthisdriverassembleforthe7201chip(the4*šoriginaldriver)andfortheSignetics2661(EPCI),*šchip.‚The2661isonboththeVM01andthe*šMVME101board.8*‘4/7/83‚ChangedUNSTOProutinetofixbugwhereachar(*šisdestroyedintheUSEXOFF/XONmode.*7*10/19/82‚Majorrepairssothatinterruptswillnotbe3*šdisabledsolongastoscrewupSDLC.‚Revision1.**‘9/16/82‚InitialreleasebySteveFranck.*J**************************************************************************J**************************************************************************J**************************************************************************ééJ**************************************************************************‰PAGE***‚XREF'sfromTERMLIB* ‰XREF†LOG_ERR ‰XREF†RESET‰XREF†TERM_INIT‰XREF†TERM_COMMAND‰XREF†TERM_TBE‰XREF†TERM_BREAK‰XREF†TERM_GOT_CHAR%***†XREF†TERM_UNRDYŠNotusedbyEPCI.$***†XREF†MARK_DOWN‹NotusedbyEPCI. *?*‚Masksdelineatingallrecognized(REC)andunrecognized(UNR)(*‚attributes(ATT)andparameters(PAR).*C*REC_ATTƒEQU„%1000111111111111‚1bitsrepresentdefinedattributes.D*UNR_ATTƒEQU„$FFFF-REC_ATT†The1'scomplementofthatareundefined. C*REC_PARƒEQU„%0111111111111111‚1bitsrepresentdefinedparameters.D*UNR_PARƒEQU„$FFFF-REC_PAR†The1'scomplementofthatareundefined.***‚Equatefilesincluded:**‰  9995..SIG2661.EQ*‰STR*‰TCB*‰CCB*‰9995..BAB.EQ*‰IOE*‰NIO*‰LV5#*‰TERMINAL.EQˆEquatesforterminals *‰UTILITY.MC:*‰TERMCCB.EQ‰OffsetsandequatesforCCBDDPforterminals.*ŠPAGEŠINCLUDE9995.&.SIG2661.EQŠNOLIST ŠTTL…STR.EQŠINCLUDE9995.&.STR.EQŠNOLISTŠINCLUDE9995.&.TCB.EQŠNOLISTŠINCLUDE9995.&.CCB.EQŠNOLISTŠINCLUDE9995.&.IOE.EQ‰NOLISTŠINCLUDE9995.&.NIO.EQŠNOLISTŠINCLUDE9995.&.LV5.EQ‰NOLIST‰INCLUDEƒ9995.&.BAB.EQŠLISTŠINCLUDE9995.&.TERMINAL.EQ‰PAGEŠINCLUDE9995.&.UTILITY.MCŠINCLUDE9995.&.TERMCCB.EQŠLIST‰OFFSET„TERMDDP*0*‚DevicedependentBackgroundactivationblocks:$*„NonerequiredfortheEPCIdriver.**@*ƒComputethenumberofpagesofmemorythatweneedforoneCCB>*ƒfortheMPSCdriver.‚CMRautomaticallyallocatesonepageofA*ƒmemory($100bytes)fortheCCB,andourvariableEXTCCBSZwillB*ƒresideintheCMRparametertableatthebeginningofthedriver8*ƒtotellCMRhowmanyextrapagesofmemoryareneeded.**CCBSIZEBEQU‡*PAGESIZEEQU‡$100L1‡SET‡CCBSIZEB+PAGESIZE-1CCBSIZE‚EQU‡L1/PAGESIZEEXTCCBSZEQU‡CCBSIZE-1;ŠTTL„EPCIDRV:‚VERSADOS2661TERMINALDRIVERWITHTYPE-AHEADŠPAGEJ***************************************************************************+*‰SERVICEVECTORTABLE,REVISIONINFO,ETC.*@*‰ThistableisexaminedbyCMRwhenthechannelisallocatedtoC*‰determinewheretogoforinterrupts,commands,&initialization.<*‰Itmustalwaysbeattheverytopofthedrivercode.‚Also>*‰includedisaparametertellingthenumberofextrapagesof>*‰memorytoincludeintheCCB,andinformationdescribingthe*‰revisionofthedriver.*L**************************************************************************** ŠSECTION‚0ŠOPT„BRS EPCIDRV: *D*‚Servicevectortable.‚NoticethatthesevaluesarerelativetotheC*‚beginningofthedriversothemechanismisposition-independent!*=ŠDC.LƒINTERRUPT-EPCIDRV‚Addressofinterruptserviceroutine.9ŠDC.LƒCOMMAND-EPCIDRV„Addressofcommandserviceroutine.5ŠDC.LƒINIT-EPCIDRV‡Addressofinitializationroutine.ŠDC.Lƒ0’Reserved. **‚OtherCMRparameters.*7ŠDC.BƒEXTCCBSZ‹#ofextrapagesintheCCB.‚TheCCBmay)*§beanysizefrom1to256pages(apage'*§is256bytes):‚ifthisfieldis0,it*§willbe1page,etc.ŠDC.Bƒ0,0,0ŽReserved.ŠDC.Lƒ0,0,0ŽReserved. **‚Revisioninfo:*/ŠDC.Bƒ'021485'‹DateoflastassemblyasMMDDYY.1ŠDC.Bƒ''Spaceindicatesnopatchesto.LOfile.)ŠDC.Bƒ'4'MajorVERSAdosrevisionnumber.*‰PAGE*+*‚JumptableforusebythegenericTERMLIB*‰BRA.L…PUT_CHAR ‰BRA.L…CK_TBE‰BRA.L…DDP_RESET ‰BRA.L…SETUP‰BRA.L…CLOCK_RESET‰BRA.L…GET_STAT‰BRA.L…DDP_STOP‰BRA.L…DDP_UNSTOP‰BRA.L…DDP_BEG_BREAK‰BRA.L…DDP_END_BREAK **‰PAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰INITIALIZATIONROUTINE*>*‰ThisroutineiscalledbyCMRwhenthechannelisallocated.9*‰Itspurposeistosetupthingsforcommandserviceand7*‰interruptservice.‚Themajorfunctionsperformedare:"*Validatethechanneltypefield.+*Getmemoryfortransmit&receivequeues..*Initializeflags,pointers,etc.intheCCB.*Initializethe2661.*@*‰WegotherethroughaJSRfromCMR,andwillexitwithanRTS.>*‰AllregistershavebeensavedbyCMRandmaybeusedfreely.?*‰Entryisatinterruptlevel0,andweareinsupervisormode.**‰Entry:A5=addressofCCB.*'*‰Exitsto:‚CMR(viaRTS)ifallisOK.'*”KILLERifexecwon'tallocatememory.*J**************************************************************************J**************************************************************************J**************************************************************************   ŠDS…0 INIT:.‰JSR‡TERM_INIT‹Dothedevice-independentstuff*%%%%%%%%%%%%%%ƒbwn‚8/13/842‰IFƒƒTHEN…SomethingwentwrongwithTERM_INIT.4‰IFƒƒTHEN„Theexeccallfailedandwecannotget!*œthescheduler'sentrypoint!!!ŽTR0$.KILLER‚,‰ELSERTSThechannelisdown!!‰ENDI‰ENDI*?*‚Callguardedforthedevicedependentinitializationroutine.**‰LEA‡DO_INIT(PC),A0‰MOVE.L„#T0GUARD,D0‰TRAP†#0‰RTSŠPAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰COMMANDSERVICEROUTINE*>*‰Wegetenteredherewhentheattachedtask(IOS)invokesCMR?*‰viaaTRAP1withanINITIATEI/Oparameterblocktoprocess.>*‰CMRhasalreadycheckedtheCMRparameterblocktoensureit<*‰resideswithintheaddressspaceoftheattachedtask.‚IOSA*‰hasalreadyvalidatedtheIOCB,exceptforthebufferaddresses *‰therein.*@*‰WegotherethroughaJSRfromCMR,andwillexitwithanRTS.>*‰AllregistershavebeensavedbyCMRandmaybeusedfreely.?*‰Entryisatinterruptlevel0,andweareinsupervisormode.*5*‰Entry:A2=physicaladdressofCMRparameterblock*A5=physicaladdressofCCB*3*‰Exit:‚D0=resultsofparameterblockvalidation:3*•always0inourcase,indicatingitwasOK,since2*•IOSwillnotsendusanyrequestexceptHALTI/O/*•ifwearealreadybusy,andCMRmakesallthe*•otherchecks.*A*‰Note:‚TERMLIBdoesnotrecognizeCMRcommandsforHALT&RESET.B*‰HALTcanstillbeaccomplishedthroughuseoftheHALTI/OIOCB.*J**************************************************************************J**************************************************************************J************************************************************************** COMMAND:‹JSR…TERM_COMMAND‹RTS—returntoCMR.‹PAGEJ**************************************************************************J**************************************************************************J****************************************************************************‰INTERRUPTHANDLINGROUTINE*<*‰ThisroutinecompletesI/Orequestsstartedbythecommand:*‰serviceroutine.‚Itisenteredattheinterruptpriority;*‰levelofinterruptsonthischannel,andisessentiallya9*‰subroutinetothefirstlevelinterrupthandlerinCMR.*:*‰Entry:D0,A0,A1havebeensavedbyCMRandareavailable*A5=addressofCCB*9*‰ExitisalwaysviaRTS,whichtakesusbacktoCMR.‚The3*carrybitisexaminedbyCMRtodeterminewhether7*thedriverhandledtheinterruptorwhetheritshould4*passtheinterruptontothenextguyinthechain*onthatvector:*='Ihandledit'**‰Stack:*(A7)+4...*(A7)ƒlongwordreturnaddress*J**************************************************************************J**************************************************************************J************************************************************************** INTERRUPT:ŠPUSH.LD1‘saveD1*ŠMOVE.LCCBCHB(A5),A1†getaddressof2661.8ŠMOVE.BCREG(A1),D1ˆgetcontentsofthecontrolregister7ŠMOVE.BSREG(A1),D0ˆgetcontentsofthestatusregister*-*‰dowehaveanythingenabledonthisdevice?**ŠBTSTƒ#TXEN,D1‹isthetransmitterenabled?3ŠBNE.S‚INT010branchifitis-we'egettingcloser'ŠBTSTƒ#RXEN,D1‹isthereceiverenabled?1ŠBNE.S‚INT010branchifitis-we'reevencloser*3*‰thisinterruptmustnotbeforus-returntoCMR*5INTNOP„POP.L‚D1‘restoreD1soCMRwillworkcorrectly$ŠAND.W‚#$FFFE,SRŠclearthecarrybitŠRTS—andgoaway*8*ˆisprobablysomeinterruptforus-findoutwhatkind*$INT010ƒPUSH.L„D2ˆnowweneedD2also6‰MOVE.B„D0,D2…needanothercopyofthestatusregister!‰AND.B…#$38,D2ƒgetanyerrorbits*‰BNE.S…SRC‡branchifanyerrorb  itsareon‰POP.L…D2ˆrestoreit.‰BTST†#RXRDY,D0isthereareceiverinterrupt?'‰BNE.S…RCA‡branchifyes-gohandleit1‰BTST†#TXRDY,D0isthereatransmitterinterrupt?'‰BNE.S…TBE‡branchifyes-gohandleit8‰BTST†#DNR,D0ƒisthereachangeintheDSRorDCDlines?‰BNE.S…DSRTN…branchifthereis,‰BTST†#FB,D1„areweintheforcebreakmode?+‰BNE.S…FBMODE„branchifforcingabreaknow*B*ˆifwegotheretherereallywasn'toninterruptforusafterall*‰BRA.S…INTNOP„andreturn‰PAGEJ***************************************************************************)*‰TRANSMITBUFFEREMPTYINTERRUPTHANDLER*=*‰The2661'stransmitbufferjustbecameempty,soifwehave+*‰morecharacterstosendwecandoitnow.**‰Entry:A0=NOTUSED*A1=addressof2661*A5=addressofCCB*<*‰Sincethisisnotasubroutine,registersatexitarejust-*‰theentryrequirementsofthenextroutine.*J************************************************************************** TBE:(ŠMOVE.B„CREG(A1),D1‰getcontrolregister%ŠBCLR†#TXEN,D1ŒswitchofftheXmitter!ŠMOVE.B„D1,CREG(A1)‰loadthechip *%%%%%%%%%%ƒBWN‚9/17/84*F*‚Callthedevice-independentroutinethatdealswithtransparentmode)*‚orinvokestheXMITbackgroundroutine.* ‰JSR‡TERM_TBE‰BRA.S…INT_EXIT‰PAGEJ***************************************************************************(*‰RECEIVEDCHARACTERAVAILABLEINTERRUPT*=*‰The2661hasjustreceivedacharacter,anditisavailable=*‰forreading.‚Wewilldothatnow,andtheresultwillgoin$*‰thereceivequeueifthere'sroom.**‰Entry:A0=NOTUSED*A1=addressof2661*A5=addressofCCB*<*‰Sincethisisnotasubroutine,registersatexitarejust-*‰theentryrequirementsofthenextroutine.*J************************************************************************** RCA:/‰MOVE.B„DREG(A1),D0‰Getthecharfromthechip.*C*‚CallthedeviceindependentroutinetocheckfortransparentmodeG*‚anddothestufffortransparentmodeorifnotintranparentmodetoG*‚checkforanyspecialcharacterssuchasXON,XOFF,BREAKEQUIVALENT,G*‚orDISCARDOUTPUT.Otherwise,putthecharacterinthereceivequeue.*‰JSR‡TERM_GOT_CHAR‰BRA.S…INT_EXIT‰PAGEN*******************************************************************************%*ˆSPECIALRECEIVECONDITIONINTERRUPT,*‘Anerrorbitisoninthestatusregister.*‘Determineactualcause.*‘bit3=parityerror*‘bit4=dadaoverrun8*‘bit5=framingerrororbreak(breakifdatareg=0)**ˆEntry:ƒA0=NOTUSED*‘A1=addressof2661*‘A5=CCBadddress*‘D0=statusregistervalue*‘D1=controlregistervalue$*‘D2=errorbitsofstatusregister)*–D2MUSTbepulledoffthestackinhere*O******************************************************************************* SRC:+‰POP.L„D2“restoreD2tomaketheresthappyé6‰BSET…#ERRSET,D1‹clearstatusregerrorflags„02/14/85%‰MOVE.BƒD1,CREG(A1)Šdoittothechip‰BTST…#PE,D0aparityerror?,‰BEQ.S„INTERR10branchifnotaparityerror;INTERR05PUT_BYTEPAR_FRAM,D0Šsetparity/framingerrorcode ‰JSR†LOG_ERRŽandgotellsomeone‰BRA.S„INT_EXIT$INTERR10BTST…#DOVR,D0dataoverrun?é  ééééé*‰BEQ.S„INTERR20branchifnotdataoverrun0‰PUT_BYTEOVERRUN,D0‹setdataoverrunerrorcode ‰JSR†LOG_ERRŽandgotellsomeone‰BRA.S„INT_EXIT%INTERR20BTST…#FE,D0aframingerror?3‰BEQ.S„INT_EXITbranchifno-weshouldn'tbehere;‰MOVE.BƒDREG(A1),D0Šseeifabreakinsteadofframingerror0‰BNE.S„INTERR05branchifreallyaframingerror**ˆabreakwasreceived*(‰MOVE.B„CREG(A1),D1‰getcontrolregister"‰BCLR†#RXEN,D1Œswitchoffreciever)‰MOVE.B„D1,CREG(A1)‰tellcontrolregister*3‰JSR†TERM_BREAK‹Callthedeviceindependentroutine*¦totakecareofabreak.‰BRA.S„INT_EXIT‰PAGEO*********************************************************************************ˆFBMODE„FORCEBREAKINTERRUPT/*‘Weareinaforcebreakmode.‚Wewanttostay3*‘inthismodeuntilthetimerwepreviouslyset-up *‘expires.**ˆEntry:‚A0=NOTUSED*A1=addressof2661*A5=CCBaddress*O******************************************************************************* FBMODE:+‰BRA.S„INT_EXITjustexitinterruptservice‰PAGEO******************************************************************************** *ˆDSRTN…DATASETREADYINTERRUPT4*’TherewasachangeintheDSRlineorthe‚DCDline3*’orthetransmitterwentempty.‚Weonlycareabout*’thetransmittergoingempty.**ˆEntry:‚A0=NOTUSED*A1=addressof2661*A5=CCBaddress*D0=statusregistervalue*D1=controlregistervalue*O******************************************************************************* DSRTN:/‰MOVE.BƒSREG(A1),D1Šre-readthestatusregister,‰BTST…#DNR,D1Žistheinterruptbitstillon?3‰BEQ.S„INT_EXITbranchifno,ignorethisinterrupt,‰CMP.B„D0,D1seeifDSRandDCDhavechanged/‰BNE†TBE’thisisreallyatransmitterinterrupt2‰BRA.S„INT_EXITwedon'tcareaboutthisinterrupt‰NOP‰PAGE*E*‚Nowexitasfromaninterrupt.‚WemayinfacthavebeencalledfromF*‚commandserviceorinitialization,buttheyhadtosetituptolook*‚likeaninterrupt,too.*INT_EXIT:POP.L‚D1‘RestoreD1,7ŠMOVEQ‚#1,D0ŽsetcarrybittotellCMR'wehandledit,' ŠSUBQƒ#2,D0Ž*ŠRTS—andreturn.ŠPAGEO********************************************************************************2*‰ROUTINESTOSETTHECLOCKDIVISORTOx16ANDx64*7*‰Noworkheresince2661cannotsettheclockdivisor.*=*‰WemusthaveaCLOCKRESETentrypointforTERMLIB,however.**‰Entry:*‹A5ƒ=addrofourCCB.**‰Exit:*O******************************************************************************* CLOCK_RESET:ŠRTSŠPAGEK*****************************************************************************!*ROUTINES„CALLED„BY**–TERMLIB**F**********  ************************************************************‰PAGEL******************************************************************************ˆTRANSMITTHECHARACTER*?*ˆThisisthedevicedependentroutinethatactuallywritesthe*ˆcharactertothedevice.*F*ˆTheoffsettothisroutinemustbeinstalledatthebeginningofthe *ˆdriver.**ˆEntry:„A1=addressof2661*’A5=addressofCCB*’D0.B=charactertotransmit*ˆInterruptlevelonentry:0*C*ˆExit:…Allregistersarepreserved,includingthestatusregister.<*’Itisimportanttokeeptheinterruptlevelthesameasit*’wasuponentry.*J************************************************************************** PUT_CHAR:ŠSAVE„D1ŠPUSH„SR D***Thefollowingcodewascommentedoutandre-arrangedtoŠ02/14/85#*** prevent the loss of characters:é)***‡MOVE.B‚D0,DREG(A1)ˆtransmitthechar.0***‡MOVE.B‚CREG(A1),D1ˆswitchonthetransmitter***‡BSET„#TXEN,D1‹setthebit$***‡MOVE.B‚D1,CREG(A1)ˆtellthechip ŠINHIBIT/ŠMOVE.B‚CREG(A1),D1ˆreadcurrentregistervalue-ŠBSET„#TXEN,D1‹setthetransmitterenablebit7ŠMOVE.B‚D1,CREG(A1)ˆtellthechiptoenabletransmitter*ŠMOVE.B‚D0,DREG(A1)ˆtransmitthecharacter ŠPOP…SR ŠRESTORED1ŠRTS‰PAGEM******************************************************************************$*ˆCHECKTHEDEVICE'STRANSMITBUFFER*F*ˆThisisadevicedependentroutinewhoseoffsetmustbeinstalledat*ˆthebeginningofthedriver.**ˆEntry:A1=addressof2661*A5=addressofCCB*ˆInterruptlevelonentry:0ééééé**ˆExit:‚Conditioncodes:"*=transmitbuffernotempty*=transmitbufferempty<*ˆItisimportanttokeeptheinterruptlevelthesameasit*ˆwasuponentry.*M*****************************************************************************CK_TBE:ŠMOVEM.LD0-D1,-(A7)ŠPUSHƒSRŠINHIBIT ŠMOVE.BCREG(A1),D1 ŠMOVE.BD1,D0ŠBSETƒ#TXEN,D1ŠMOVE.BD1,CREG(A1)5ŠBTST.B#0,SREG(A1)ˆTestiftransmitbufferisempty. ŠIFTHEN$ŒMOVE.BD0,CREG(A1)†BUFFERISEMPTY.ŒPOP„SR4ŒAND.W‚#$FFFB,SRˆsetconditioncodeforreturn.ŒMOVEM.L(A7)+,D0-D1ŒRTS ŠENDI **‚Transmitterisnotempty:*(ŠMOVE.BD0,CREG(A1)ˆBUFFERISNOTEMPTY.ŠPOP„SR3ŠOR.Wƒ#$0004,SRŠsetconditioncodeforreturn.ŠMOVEM.L  (A7)+,D0-D1ŠRTS‰PAGEH************************************************************************* *ˆDEVICEDEPENDENTRESETROUTINE*9*ˆThisisthedevice-dependentpartoftheresetroutine.*?*ˆTheoffsettothisroutinemustbeinstalledatthebeginning*ˆofthedriver.**ˆEntry:A5=addrofCCB*ˆInterruptlevelonentry:0*$*ˆExit:‚Allregistersarepreserved.<*ˆItisimportanttokeeptheinterruptlevelthesameasit*ˆwasuponentry.*E********************************************************************* DDP_RESET:6ŠMOVEM.L‚A1/D0,-(A7)†saveusedregistersonthestack.ŠPUSH…SRŠINHIBIT )ŠMOVE.LƒCCBCHB(A5),A1„getaddressof26615ŠMOVE.Bƒ#$37,CREG(A1)„turnthetranmitteron,rec.on'ŠMOVE.BƒDREG(A1),D0†clearanyinterrupt ŠPOP†SR0ŠMOVEM.L‚(A7)+,A1/D0†Restoresavedregistersand ŠRTS—exit.ŠPAGEJ***************************************************************************@*‰SUBROUTINETOSETUPTHEDEVICEACCORDINGTOTHECONFIGURATION*;*‰Usestheworkingconfiguration(intheCCB)tosetupthe;*‰device,andsomeconfiguration-relatedfieldsintheCCB.*?*‰Theoffsettothisroutinemustbeinstalledatthebeginning*‰ofthedriver.**‰Entry:A5=addressofCCB*‰Interruptlevelonentry:0*$*‰Exit:‚Allregistersarepreserved.<*‰Itisimportanttokeeptheinterruptlevelthesameasit*‰wasuponentry.*J************************************************************************** SETUP:<ŠMOVEM.LD0-D1/A0-A3,-(A7)Savesomeregistersonthestack.ŠPUSHƒSR**‚Firstsetupaddresses:4ŠLEA„CONFIG(A5),A0†A0<--addrofCCBconfiguration.3ŠMOVE.LCCBCHB(A5),A1†A1<--addrofour2661port. -ŠPUT_BYTE‚ASY16X,D0…Startwithx16clockrate:ŠBTSTW‚#IOASTPB,IOSATW(A0)Addinthenumberofstopbits. ŠIF…THENŠOR.B…#SB1,D01stopbitŠELSEŠOR.B…#SB2,D02stopbitsŠENDI >ŠBTSTW‚#IOAUSEP,IOSATW(A0)Ifwe'reusingparity,enableit... ŠIF…THENŠOR.B…#PENBL,D0:ŠBTSTW‚#IOAPRTY,IOSATW(A0)andifwe'reusingevenparity,ŠIF…THENŠsetitup.ŠOR.B…#PTYPE,D0ŠENDIŠENDI 1ŠBTSTW‚#IOABITS,IOSATW(A0)Addinbits/charinfo. ŠIF…THENŠOR.Bƒ#BIT7,D0ˆ(7bits/char)ŠELSEŠOR.Bƒ#BIT8,D0ˆ(8bits/char)ŠENDI ŠINHIBIT2ŠMOVE.BƒD0,MREG1(A1)…setmodereg1foraboveinfo2ŠMOVE.BƒIOSBRT(A0),D0„getuserspecifiedbaudrate#ŠOR.B…#ITCX16,D0‡set16xclockrate=ŠMOVE.BƒD0,MREG2(A1)…setmodereg2for16xclockrate&baud ŠMOVE…(A7),SRŠPAGE*/*‚[5]„RTS&DTRlineslow,transmitterenabled,*‰bits/charfromconfiguration.*2ŠMOVE.Bƒ#$37,D0Žsetfornorm,RTSlow,reseterror"*ªflags,nobreak,disabletransmit,*ªenablereceiver,DTRlow***5***‚Removethemodemtest,aspertheMPSCDRVdriver:***C****†BTSTW‚#IOAMODM,IOSATW(A0)„Ifthisisamodemwe'retalkingto,****†IF…THENŽ*8ŠBTSTW‚#IOAOFFH,IOSATW(A0)„andtheguywantsitoffhook,ŠIF…THENŽ*ŠAND.B‚#$FF-DTR,D0 ***‡ENDIš*ŠENDIš* ŠINHIBIT,ŠMOVE.B‚D0,CREG(A0)ˆsetthecontrolregister0ŠMOVE.B‚SREG(A0),D0ˆclearanypendinginterruptsŠPOP„SR **‚Restoreregistersandreturn.*8ŠMOVEM.L(A7)+,D0-D1/A0-A3Restoreregistersfromstack.ŠRTSŠPAGEJ****************************************************************************‰GETDEVICESTATUSBYTE*"*‰PreparestheDEVICESTATUSbyte.*8*‰Note:‚thisroutinedoesnotsetthebreakindicatorin*thedevicestatusbyte.*?*‰Theoffsettothisroutinemustbeinstalledatthebeginning*‰ofthedriver.**‰Entry:A5=addressofCCB*‰Interruptlevelonentry:0*&*‰Exit:‚D0.B=thedevicestatusbyte.<*‰Itisimportanttokeeptheinterruptlevelthesameasit*‰wasuponentry.*J************************************************************************** GET_STAT:*4* Let's see if the device status bit 'DSR' is ready.* ‰CLR.B…D0‰MOVEM.LƒD1/A0,-(A7) 2‰MOVE.L„CCBCHB(A5),A0‡gettheaddressofthe2661.5‰M  OVE.B„SREG(A0),D1‰gettheDSRbitofthestatusreg ‰TST.B…D1/‰IFˆTHEN‹bit7istheDSRbitin2661chip5‰BSET†#XDSNRB,D0Šsettheunreadybitinthedev.state‰ENDI ‰MOVEM.Lƒ(A7)+,D1/A0‰RTS‰PAGEM******************************************************************************5*ˆDEVICEDEPENDENTSTUFFFORLOWERINGAHARDWARELINE*ˆTOSTOPTHETRANSMITTER.*?*ˆTheoffsettothisroutinemustbeinstalledatthebeginning*ˆofthedriver.**ˆEntry:‚A1=addressof2661*A5=addressofCCB3*ˆInterruptlevelonentry:INHIBITEDatourlevel.*$*ˆExit:ƒAllregistersarepreserved.*K*************************************************************************** DDP_STOP:*0*ˆTheVME101boardneedsRTSforthehandshake!*ŠSAVE…D0 ,ŠMOVE.BƒCREG(A1),D0‰getthecontrolregister%ŠBCLR…#RTS,D0disablerequesttosend%ŠMOVE.BƒD0,CREG(A1)‰doittothechip ŠRESTORE‚D0ŠRTSŠPAGEK****************************************************************************$*ˆDEVICEDEPENDENTUNSTOPTHEDEVICE*=*ˆWhenwearenotusingXOFF/XON,weunstopthedeviceinour*ˆowndevicedependentway.*;*ˆWearerunninginbackgroundwhenthisroutineiscalled.*?*ˆTheoffsettothisroutinemustbeinstalledatthebeginning*ˆofthedriver.**ˆEntry:‚A1=addressof2661*A5=addressoftheCCB3*ˆInterruptlevelonentry:INHIBITEDatourlevel.*$*ˆExit:ƒAllregistersarepreserved.*J************************************************************************** DDP_UNSTOP:*2*‰fortheVME101weneedRTStodothehandshake.*ŠSAVE…D0 ,ŠMOVE.BƒCREG(A1),D0‰getthecontrolregister$ŠBSET…#RTS,D0enablerequesttosend)ŠMOVE.BƒD0,CREG(A1)‰anddoittothechip ŠRESTORE‚D0ŠRTSŠPAGEK****************************************************************************&*ˆDEVICEDEPENDENTBEGINBREAKROUTINE*?*ˆTheoffsettothisroutinemustbeinstalledatthebeginning*ˆofthedriver.**ˆEntry:‚A1=addrof2661*A5=addrofCCB3*ˆInterruptlevelonentry:INHIBITEDatourlevel.*$*ˆExit:ƒAllregistersarepreserved.*E********************************************************************* DDP_BEG_BREAK:*)*‚startthe2661sendingthebreaksignal*‰SAVE„D0 9‰MOVE.B‚CREG(A1),D0†getcurrentstateofcontrolregister)‰OR.B„#FB,D0‹turnontheforcebrackline+‰OR.B„#TXEN,D0‰turnonthetransmitteralso-‰MOVE.B‚D0,CREG(A1)†andwriteitallbackout ‰RESTORED0‰RTS‰PAGEK****************************************************************************$*ˆDEVICEDEPENDENTENDBREAKROUTINE*?*ˆTheoffsettothisroutinemustbeinstalledatthebeginning*ˆofthedriver.**ˆEntry:‚A1=addrof2661*A5=addrofCCB3*ˆInterruptlevelonentry:INHIBITEDatourlevel.*$*ˆExit:ƒAllregistersarepreserved.*L**************************************************************************** DDP_END_BREAK:ŠSAVE„D0 9ŠMOVE.B‚CREG(A1),D0ŠgetcurrentstateofcontrolregisterŠBCLR„#3,D0turnoffthebreak,ŠBCLR„#TXEN,D0turnoffthetransmitteralso)ŠMOVE.B‚D0,CREG(A1)Šandwriteitbackout0ŠMOVE.B‚SREG(A1),D0Šclearanypendinginterrupts ŠRESTORED0ŠRTSŠPAGEI***************************************************************************“BACKGROUND**šAND**‘CALL__GUARDED**–ROUTINES**•(DEVICE-DEPENDENT)*E*********************************************************************ŠPAGEO*********************************************************************************‰FINISHOFFTHEINITIALIZATION*A*‰Theinitializationroutinehasgonearoundresettingeverything@*‰itcan,buttheroutinesRESETandSETUPshouldonlybecalled>*‰fromwithinthebackground.‚Soheinvokedthisroutinetodo *‰itforhim.**‰Entry:*A1=addressof2661.*A5=addressofCCB.*O**************************************************************** *************** DO_INIT:**‚Inhibitinterrupts*‰PUSH†SR‰INHIBIT*)*‚GetaddressofstartofdriverintoCCB*‰LEA‡EPCIDRV(PC),A4‰MOVE.L„A4,DRV_ADDR(A5) ‰JSR„RESETŽReseteverything.‰BSR.L‚DDP_RESET5‰BSR.L‚SETUPŽSetupthe2661accordingtotheconfig.**‚Enableinterruptsnow.*‰POP‡SR‰RTS‰PAGE*********************** *‚PATCHSPACE***********************ŠDS.Wƒ30ŠEND  ééé=/* =/*†IPCDRV.AF=/*)=/* Chain file to assemble the IPC driver=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to IPCDRV.LS=/*=/IFC \1ƒ=ARGIPCDRV.LS=/ENDIF=/*#=ASM IPCDRV.SA,IPCDRV.RO,\1;MRZ=160=/*{ Included files are:=/*ƒ9995.&.TRACE.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.CCB.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.LV5.EQ=/*ƒ9995.&.DUALPORT.MC=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDéééééé½DIPCDRV„IDNTƒ4,4VERSAdosIPCI/OHandlerProcessVer.4.4-11/28/84AŠTTL„VERSADOSIPCCHANNELI/OHANDLERPROCESSVER.4.4-11/28/84 ŠNOFORMATŠPAGE ŠLLENƒ120J***************************************************************************,* IPC -- REV. 1.05 02JUN80 (TB59) STEVE BALL4*2.0002NOV81(TL09)JIMSMITH…-SPLITIPCFROMCMR.*2.0101FEB82(TL09)JIMSMITH…-VECTORCHAIN**2.0223FEB82(TL09)JIMSMITH…-IOCBUSE4*4.0001SEP82ˆMARCBRIEL„-CONFIGURECLASSREQUESTS4*4.3014SEP83 (TB59)STEVEBALL„-FIXHALTI/OBUGS6*4.xx23APR84ˆFREDMATHESON-UPDATEPERNEWFIRMWARE3*4.4028NOV84ˆPHILDUCLOSƒ-ADDCONFIGAREAINCCB:*4.4127DEC84ˆDICKVANDERLIN-BUGFIXFORDCTTABLESIZE0*4.4208JAN85ˆPHILDUCLOSƒ-EXPANDDCTTOLUMAXB*******************************************************************+*ChangestoIPCDRVforversion4.3ƒ8/28/84*?*‚1.TheIPCdriverhasbeenmodifiedtotakeadvantagesofthe;*…increasedfunctionalityprovidedbyrecentchangestothe*…MCCMfirmware.*+*ChangestoIPCDRVforversion4.3ƒ9/25/84*<*‚1.TheIPCdriverwasmodifiedtodeleterefenencestothe*…SecondayMapbit.*?*‚2.TheIPCdriverwasmodifiedtoincludechangesrequiredby*…4.4enhancements.* *ChangestoIPCDRVƒ11/26/84ƒPJD*G* 1. The device area was moved from an allocated segment to the CCB andF*„currentconfigurationinformationwasaddedtotheCCB.‚2additional@*„segmentsarenowrequiredfortheCCB.‚Thegetsegcallforthe*„deviceareawasdeleted.*C********************************************************************.* USER REQUEST SIDE FOR IPC COMMAND PROCESSING*9*ƒPURPOSE:‚VALIDATEANDPASSIPCCOMMANDINFORMATIONFROM#*USERTOIPC,68000SHAREDMEMORY.**ƒENTRY:‚JSRFROMCMRHANDLER*‹JSRFROMINTERRUPTHANDLER*5*ƒEXIT:‚RTS-PARAMETERBLOCKVALIDATIONSTATUSIND0***ƒSYSGENOPTIONS:DCBCONFIGUREPARAMETERS**ƒEXECROUTINESCALLED:‚QEVENTT**ƒCODEISRE-ENTRANT*¿Æ:ÏV×Iß;ç=ï=÷Eÿ9GHIH':/77K?XGLOJW;_6g<oAwE<‡9I—HŸ?§B¯AH*-----------------------------------------------------------------------**ŠPAGE **‚Includedequatefiles:*ˆ9995.&.TRACE.EQ*ˆ9995.&.STR.EQ*ˆ9995.&.TCB.EQ*ˆ9995.&.CCB.EQ*ˆ9995.&.IOE.EQ*ˆ9995.&.NIO.EQ*ˆ9995.&.LV5.EQ*ŠNOLISTŠINCLUDE9995.&.TRACE.EQŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TCB.EQŠINCLUDE9995.&.CCB.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.NIO.EQŠINCLUDE9995.&.LV5.EQN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<ŠINCLUDE9995.&.DUALPORT.MCŠINCLUDE9995.&.UTILITY.MCN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>ŠLISTŠPAGE* ŠSECTION0‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/83**ˆBITTESTMACRO* BTSTM„MACRO „IFGE†\1-16‰OPT‡MEX‰BTSTW…#\1-16,\2(\3) ‰OPT‡NOMEX„ENDC* „IFLT†\1-16‰OPT‡MEX‰BTSTW…#\1,\2+2(\3) ‰OPT‡NOMEX„ENDC‰ENDM *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰PAGE**$*…EQUATESFORTESTINGVECTORNUMBERS*#AVECTLOƒEQU„25‘LOWESTAUTOVECTOR#$AVECTHIƒEQU„31‘HIGHESTAUTOVECTOR##UVECTLOƒEQU„64‘LOWESTUSERVECTOR# IPCORG„EQU„*ŠPAGE*6* IPC COMMAND PACKET FORMAT (AS SEEN IN SHARED MEMORY)* ŠOFFSET0IPCSTX„DS.Bƒ1*2STARTOFTEXTIPCPID„DS.Bƒ1*2PACKETIDN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<*£$40=2ndConfigurePacket*£0ƒ=allothersN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>IPCPKSZƒDS.Bƒ1*2PACKETSIZE IPCPHDVƒDS.Bƒ1*2PHYSICALDEVICE%IPCCHCMƒDS.Bƒ1*2CHANNELCOMMANDTYPEIPCDVCMƒDS.Bƒ1*2DEVICECOMMAND$IPCNBKSƒDS.Bƒ2*2#BLOCKSTOTRANSFERIPCBKSZƒDS.Bƒ2*2BLOCKSIZE*IPCBUFAD‚DS.Bƒ4*268000ADDRESS(PHYSICAL)IPCCKSMƒDS.Bƒ2*2CHECKSUM$IPCCMPRM‚DS.Bƒ4*2COMMANDPARAMETERSIPCETX„DS.Bƒ1*2ETXLOCATION** OUTPUT WITH INPUT EXTENSIONŠOFFSETIPCCMPRM!IPCSWCFƒDS.Bƒ4*2SOFTWAREOPTIONS-IPCNBKS2‚DS.Bƒ2*2#BLOCKS(OUTPUTWITHINPUT)/IPCBKSZ2‚DS.Bƒ2*2BLOCKSIZE(OUTPUTWITHINPUT)3IPCBUFA2‚DS.Bƒ4*268000ADDRESS(OUTPUTWITHINPUT)IPCETX2ƒDS.Bƒ1*2ETXLOCATION** CONFIGURE PACKET (1st)*ŠOFFSETIPCNBKS)IPCHWC1ƒDS.Bƒ1*2H /WCONFIGURATIONBYTE1)IPCHWC2ƒDS.Bƒ1*2H/WCONFIGURATIONBYTE2)IPCHWC3ƒDS.Bƒ1*2H/WCONFIGURATIONBYTE3)IPCHWC4ƒDS.Bƒ1*2H/WCONFIGURATIONBYTE4)IPCSWC1ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE1)IPCSWC2ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE2)IPCSWC3ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE3)IPCSWC4ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE4IPCCETXƒDS.Bƒ1*2ETXLOCATIONN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<** CONFIGURE PACKET (2nd)*ŠOFFSETIPCNBKS$IPCPMSKƒDS.Bƒ2*2IOCBPARAMETERMASKIPCXOF„DS.Bƒ1*2XOFFCHARACTERIPCXON„DS.Bƒ1*2XONCHARACTER%IPCBRK„DS.Bƒ1*2BREAKEQUIVALENTCHARŠDS.Bƒ1*2UNUSED"IPCRPRTƒDS.Bƒ1*2REPRINTLINECHAR!IPCCNCLƒDS.Bƒ1*2CANCELLINECHAR,IPCRTRMƒDS.Bƒ4*2READTERMINATINGCHAR'S(4)&IPCEOL„DS.Bƒ2*2ENDOFLINESTRING(2)IPC2ETXƒDS.Bƒ1*2ETX*N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>** FORMAT TRACK PACKETŠOFFSETIPCBUFAD'IPCFPSNƒDS.Bƒ4*2PHYSICALSECTORNUMBERIPCFETXƒDS.Bƒ1*2ETXLOCATION** FORMAT DISK PACKETŠOFFSETIPCNBKSIPCDETXƒDS.Bƒ1*2ETXLOCATION** REQUEST STATUS PACKETŠOFFSETIPCNBKSIPCRETXƒDS.Bƒ1*2ETXLOCATION* * IPC RETURN (COMPLETION) PACKET* ŠOFFSET0RTNSTX„DS.Bƒ1*2STARTOFTEXTRTNPID„DS.Bƒ1*2PACKETI.D.RTNPKSZƒDS.Bƒ1*2PACKETSIZE RTNPHDVƒDS.Bƒ1*2PHYSICALDEVICE RTNCHCMƒDS.Bƒ1*2CHANNELCOMMANDRTNSTCMƒDS.Bƒ1*2STATUSCOMMANDRTNSTVLƒDS.Bƒ2*2STATUSVALUERTNSTPRƒEQU„*’STATUSPARAMETERS** IPC NORMAL COMPLETION EVENT*ŠOFFSETRTNSTPRRTNBLKSƒDS.Bƒ2*2NO.OFBLOCKSRTNBKSZƒDS.Bƒ2*2BLOCKSIZE#RTNDADRƒDS.Bƒ4*268KMEMORYADDRESS** DISK ERROR COMPLETION EVENT*ŠOFFSETRTNSTPR%RTNSECNƒDS.Bƒ4*2ENDINGSECTORNUMBER** DISK STATUS RETURN*ŠOFFSETRTNSTPRRTNDSTAƒDS.Bƒ2*2DEVICESTATUS RTNLSECƒDS.Bƒ4*2LOGICALSECTORS* * PRINTER/TERMINAL STATUS RETURN*ŠOFFSETRTNSTPRRTNSTADƒDS.Bƒ4*2DEVICESTATUS)RTNHWS1ƒDS.Bƒ1*2H/WCONFIGURATIONBYTE1)RTNHWS2ƒDS.Bƒ1*2H/WCONFIGURATIONBYTE2)RTNHWS3ƒDS.Bƒ1*2H/WCONFIGURATIONBYTE3)RTNHWS4ƒDS.Bƒ1*2H/WCONFIGURATIONBYTE4)RTNSWS1ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE1)RTNSWS2ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE2)RTNSWS3ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE3)RTNSWS4ƒDS.Bƒ1*2S/WCONFIGURATIONBYTE4** IPC MEM MAPPED EQUATES*,IPCINT„EQU„$0D68000TOIPCINTERRUPTOFFSET*IPCRESET‚EQU„$0F68000TOIPCRESETOFFSET'IPCIMB1ƒEQU„$10168000TOIPCWRITEBOX%IPCIAB1ƒEQU„$10368000TOIPCACKBOX#IPCIM1„EQU„$10568000COMMANDWRITE'IPCIMB2ƒEQU„$181IPCTO68000WRITEBOX%IPCIAB2ƒEQU„$183IPCTO68000ACKBOX!IPCIM2„EQU„$185IPCCOMMANDWRITE*IPCLST„EQU„$1FFLASTBYTEOFSHAREDMEMORY** MISCELLANEOUS EQUATES* STX‡EQU„$02 ETX‡EQU„$03 RSˆEQU„$1E ACK‡EQU„$06 NAK‡EQU„$151LUMAX…EQU„8’MAXIMUMDEVICENO.VALUEFORDISKIPC(*£MCCMMAXIS5BUTTHEIRISTABLESPACE*£ENOUGHFOR8.(IPCRDCDƒEQU„$10CHANNELCOMMANDFORREAD)IPCWRCDƒEQU„$20CHANNELCOMMANDFORWRITE(RTNGDC„EQU„$70NORMALSTATUSPACKETCODE,RTNHLT„EQU„$71HALT/ABORTSTATUSPACKETCODE+RTNSTA„EQU„$72SOLICITEDSTATUSPACKETCODE&RTNUNS„EQU„$80UNSOLICITEDPACKETCODE"RTNGDS„EQU„$0000ŽGOODSTATUSVALUE,SPKT†EQU„$0200ŽFIRST2BYTESOFEVERYPACKET+SECSIZƒEQU„$100“SYSTEMREQUIREDSECTORSIZE'IOPKSZ„EQU„21”READORWRITEPACKETSIZE,OWIPKSZƒEQU„29”OUTPUTWITHINPUTPACKETSIZE'STPKSZ„EQU„7•STATUSREQUESTPACKETSIZE#CNPKSZ„EQU„15”CONFIGUREPACKETSIZEN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<'C2PKSZ„EQU„21”CONFIGURE2ndPACKETSIZE(TBKPKSZƒEQU„7•TRANSMITBREAKPACKETSIZEN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>$FDPKSZ„EQU„7•FORMATDISKPACKETSIZE&FTPKSZ„EQU„15”FORMATTRACKPACKETSIZEHLTPKSZƒEQU„7•HALTPACKETSIZEIOEVCD„EQU„1•I/OEVENTCODE$SMMBIT„EQU„24”SECONDARYMEM.MAPBIT3PRTPRM„EQU„$0023‘PRINTERCONFIGPARAMETEREDITMASK4PRTATM„EQU„$0003‘PRINTERCONFIGATTRIBUTESEDITMASK4TERPRM„EQU„$5FB3‘TERMINALCONFIGPARAMETEREDI TMASK5TERATM„EQU„$06FE‘TERMINALCONFIGATTRIBUTESEDITMASK** OPTION EQUATES*$XPKCECH‚EQU„$C0000000ŽNOECHOOPTIONN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<-XPKCTAB‚EQU„$88000000ŽFLUSHTYPEAHEADBUFFERN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<+XSWFF„EQU„$82000000ŽTOPOFPAGE(FORMFEED)** CONFIGURATION EQUATES*XHWBITƒEQU„2–8BITPARITYXHWPRTY‚EQU„4–PARITYXHWEVNƒEQU„5–EVENPARITYXHWSTPƒEQU„6–2STOPBITSXHWMDMƒEQU„4–MODEM*N*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<XSWXONƒEQU„2–XON/XOFFORCTS)XSWFLSH‚EQU„3–FLUSHTHETYPEAHEADBUFFER'XSWTAHD‚EQU„4–ACCEPT/INHIBITTYPEAHEAD!XSWNULƒEQU„5–DISCARD/ACCEPTNULLSN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>XSWHDXƒEQU„6–HALFDUPLEXXSWALFƒEQU„0–AUTOLINEFEED%XSWTOFƒEQU„1–TOPOFFORMBEFOREPRINT‰PAGE*%*ˆEQUATESFORCHANNEL/DEVICECOMMANDS*XREAD„EQU…$1001READ!XWRITCƒEQU…$2001WRITEWITHCHECK$XWRITNƒEQU…$2002WRITEWITHOUTCHECKXRCRC„EQU…$3001READCRCXREADYƒEQU…$3002READY"XRDHP„EQU…$3003READHEADPOSITIONXFTRAKƒEQU…$4001FORMATTRACKXFDISKƒEQU…$4002FORMATDISK'XWDDM„EQU…$4003WRITEDELETEDDATAMARKXRESTOR‚EQU…$4004RESTOREXSEEK„EQU…$4005SEEKXHALT„EQU…$5001HALTXBOOT„EQU…$6000BOOTSTRAPLOAD*6*ˆADDITIONALEQUATESFORCOMM.CHANNEL/DEVICECOMMANDS*XINF…EQU…$1001READFORMATTEDXINI…EQU…$1002READIMAGE XOUTF„EQU…$2001OUTPUTFORMATTEDXOUTI„EQU…$2002OUTPUTIMAGE0XOFIF„EQU…$2801OUTPUTFORMATTEDINPUTFORMATTED,XOFIM„EQU…$2802OUTPUTFORMATTEDINPUTIMAGE(XOIIM„EQU…$2803OUTPUTIMAGEINPUTIMAGE,XOIIF„EQU…$2804OUTPUTIMAGEINPUTFORMATTED"XBCASTƒEQU…$2007BROADCASTMESSAGE XCONH„EQU…$4001CONFIGUREDEVICEN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<.XCON2PƒEQU…$4002CONFIGUREDEVICE(2NDPACKET)&XCNF2PK‚EQU…$40‘PACKETID(2NDPACKET)(XTRNSBK‚EQU…$4003TRANSMITBREAKREQUESTN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>**ˆSTATUSVALUE*XPSOK„EQU…0“SUCCESSFULXPSCRCƒEQU…1“DATACRCERROR!XPSDWPƒEQU…2“DISKWRITEPROTECTEDXPSDNRƒEQU…3“DISKNOTREADY#XPSRDMƒEQU…4“READDELETEDDATAMARK"XPSDEVƒEQU…5“INVALIDDEVICEADDRES!XPSIDAƒEQU…6“INVALIDDISKADDRESSXPSSEKƒEQU…7“RESTOREERRORXPSDMEƒEQU…8“RECORDNOTFOUND#XPSMRKƒEQU…9“ADDRESSMARKCRCERRORXPSCDMA‚EQU…$A’DMAERRORXPSCSMƒEQU…$B’CHECKSUMERRORXPSBSYƒEQU…$C’DEVICEBUSY(XPSCBSY‚EQU…$D’CHANNELBUSY(FORMATTING)XPSINDƒEQU…$E’INDETERMINATEXPSCNTL‚EQU…$F’CONTROLLERERRORXPSDVCƒEQU…$10‘DEVICEERRORXPSSEEK‚EQU…$11‘SEEKERROR#XPSNODR‚EQU…$12‘NODEVICECONNECTED&XPXCFGƒEQU…$13‘DEVICECONNECTCONFLICTXPSCMPƒEQU…$14‘COMPAREERROR%XPSSWPƒEQU…$15‘SECTORWRITEPROTECTEDXPSBADƒEQU…$16‘BADSECTORXPSTOTƒEQU…$17‘TIMEOUTXPSCMDƒEQU…$18‘INVALIDCOMMAND!XPSICMƒEQU…1“INVALIDHALTCOMMANDXPSDMAƒEQU…1“DMACHANNELERROR'XPSCSTA‚EQU…1“PERSONALITYSTATUSRETURNO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<<&*ˆIPCCompletionPacketFlagPositions*'PIDPKTF‚EQU…6“PACKETID2ndPACKETFLAGO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>>* *ˆADDITIONALCOMM.STATUSVALUES*XPSPARƒEQU…1“PARITYERRORXPSBRKƒEQU…2“BREAKCONDITIONXPSFRMƒEQU…4“FRAMMINGERRORXPSOVRƒEQU…6“DATAOVERUN!XPSOUTƒEQU…7“PRINTEROUTOFPAPER**ƒMiscellaneousequates*5CCBEXTRA‚EQU„2”Thisparameterspecifiesthenumberof+*£extrapagestobeallocatedbyCMRtothe**£CCBwhenthechannelisallocated.Upto"*£255extrapagesmaybespecifiedŠPAGE*** MACRO FOR PUTTING THE H/W PRIORITY LEVEL'* TO THE PRIORITY INDICATED BY THE CCB.* INHIB„MACRO,‰MOVE.W„CCBISR(A5),SR‡SETPROCESSORPRIORITY‰ENDM*+* MACRO FOR DROPPING THE H/W PRIORITY LEVEL* TO AN INTERRUPTABLE STATE.* ENABL„MACRO3‰MOVE.W„CCBSR(A5),SRˆDROPPROCESSORPRIORI TYBYONE‰ENDM‰PAGE* * STRUCTURE FOR DEVICE NO. TABLE* ‰OFFSET0LUFLG„DS.Bƒ2–ENTRYFLAGLUDCB„DS.Bƒ4–DCBADDRESSLUIOCBƒDS.Bƒ4–IOCBADDRESSLUTCB„DS.Bƒ4–TCBADDRESSLUBADRƒDS.Bƒ4–BUFFERADDRESS>CNFG…DS.BƒIOSDDC-IOSATWŠspacefordevice#independentportion*¦ofconfiguration.5LUENTRY‚EQU„*–lengthofcommonpartofdevice#entry**ˆAPPROXIMATELY225INSTRUCTIONSEXECUTEDTOGETTOTHISPOINT *ˆ(600us).*J***************************************************************************IOHUSER:** CHECK FOR RESET*ƒIFRESET,DOITANDGETOUT*)ŠCMP.B‚#XDREST,XIOSCD(A2)TESTRESETBYTE#ŠBNE.S‚IOH01000‹BRANCHIFNOTRESETŠBSR „CMRRESTŒCALLRESETROUTINEŠBRA„IPCUSRTN‹RETURN*$* RETURN IF CHANNEL IS IN ERROR MODE*!IOH01000‚BTSTW‚#CCBFGER,CCBFG(A5)2ŠBEQ.S‚IOH01010‹BRANCHIFNOTMARKEDINERRORMODE)ŠMOVE.B#ISTACDN,D1ˆSETUPIOSERRORCODE ŠBRA„ABORT*D* IF WE ARE WAITING FOR ACK/NAK THEN WE CANNOT HONOR THE REQUEST AND2*ƒMUSTSIGNALTHECALLERTHATTHECHANNELISBUSY.*IOH01010‚EQU„* ŠCLR.L‚D7'ŠBTSTW‚#CCBFGWAK,CCBFG(A5)WAITINGACK?)ŠBEQ.S‚IOH01020‹BRANCHIFNOTWAITINGACK*F* REQUEST CAME THRU WHILE WAITING FOR ACK - GIVE USER BACK BUSY STATUS*$ŠMOVE.B#XSTBSY,D0‡ERRORRETURNCODE ŠBRA„IPCUSRTN*(* CONVERT LOGICAL PB ADDRESS TO PHYSICAL*IOH01020‚CLR.L‚D5,ŠMOVE.LXIOCPK(A2),D6†ADDROFCOMMANDPACKET+ŠMOVE.WXIOPLN(A2),D5†LENGTHOFCOMMANDPKT"ŠMOVE.LCCBTASKA(A5),A1„SETUPTCB ŠBSR„IOHADRCKŠBRA.S‚IOH01060‹GOODRETURNŠNOP—BADLENGTHRETURN(ŠMOVE.B#ISTAIP,D1‰SETUPIOSERRORCODE ŠBRA„ABORT5IOH01060‚MOVE.LD6,A3ŽCOMMANDPACKETPHYSICALADDRESS*3* DETERMINE IF SHARED MEMORY IS FREE (IT SHOULD BE)*.ŠMOVE.LCCBCHB(A5),A4†MEMORYMAPPEDBASETOA4ŠMOVE.BIPCIMB1(A4),D00ŠBEQ.S‚IOH02060‹BRANCHIFNOERROR(MEMORYFREE)*:* SHARED MEMORY IS NOT FREE AND WE ARE NOT WAITING ON ACK.*ƒERRORCONDITION.*)ŠBSETW‚#CCBFGER,CCBFG(A5)MARKCCBASBAD)ŠMOVE.B#ISTACDN,D1ˆSETUPIOSERRORCODE ŠBRA„ABORT *K****************************************************************************(*‚FINDTHECOMMANDINTHECOMMANDTABLE.* IOH02060‚EQU„*)ŠMOVE.LXIOUID(A2),A4†PICKUPDCBPOINTER8ŠMOVE.LCCBTASKA(A5),CCBTASKB(A5)SETUPBUFFERTASKTCB-ŠMOVEQ‚#NUMCMDS-1,D0†Setuptheloopcounter./ŠLEA„CMDTBL,A0ŠA0<--addressofcommandtable./ŠMOVE.WIOSFCT(A3),D6†Setupusercommandcode. 8CMDSRCHƒCMP.W‚(A0)+,D6‹Searchthetableforthecommand.ŠDBEQƒD0,CMDSRCH‰* 3ŠBNE.S‚CMDERRIfwefoundthecommandinthetable,8ŠADD.L‚#JMPOFF-2,A0‡getthecorrespondingentryfromthe5ŠMOVE.W(A0),D0Œjumptableandjumptotheroutineto"ŠJMP„(A0,D0.W)Šhandlethecommand.ŠSPC„2>CMDERR„MOVE.B#ISTAIF,D1ŠThecommandwasn'tfoundinthetable2ŠBRA„ABORTŽsoexitwithaninvalidfunctionerror.ŠPAGEM*******************************************************************************‰REQUESTSTATUS*(*‰Entry:A2=addressofCMRparamblock*A3=addressofuser'sIOCB*A4=addressofDCB*A5=addressofmyCCB*A6=addressofuser'sTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory*M******************************************************************************REQSTAT:&ŠBSR†CNFGLENSETUPDATABUFFERLENGTH0ŠMOVE.LƒIOSDBP(A3),D6‡SETUPDATABUFFERADDRESS ŠBSR†BUFADDR*¦PhysicalAddrreturnedinD62ŠMOVE.LƒD6,CCBPTR(A5)‡SAVEBUFFERPHYSICALADDRESSŠSPC†2*?*‰Retrievethemasksofsupportedattributesandparametersfor@*‰therequesteddeviceandstorethemintheusersconfiguration*‰statusblock.* ŠMOVE.LD6,A0 ŠBSR„VALATPRM$ŠMOVE.WD0,IOSATM(A0)‰Attributemask$ŠMOVE.WD1,IOSPRM(A0)‰ParametermaskŠSPC„2 ŠCLR.L„D6-ŠBSET…#LUFACT,D6ŠSETACTIVEDEVICETABLEFLAG%ŠBSR†DEVTBLŽSETUPDEVICETABLEENTRY /ŠBSR†SETPKTŽSETUPPACKETHEADERINSHAREDMEM. ŠMOVE.Wƒ#XREADY,D16ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDS#ŠMOVE.Bƒ#ETX,IPCRETX(A1)„SETUPETX.ŠMOVE.Bƒ#STPKSZ,IPCPKSZ(A1)SETUPPACKETSIZE ŠBRA†NRMEXIT      ŠPAGEM****************************************************************************** *‰CONFIGURE*@*‰ThiscommandchangestheCCBconfiguration,theonefromwhich<*‰thedriversetsupthedeviceandunderwhichitperforms.*(*‰Entry:A2=addressofCMRparamblock*A3=addressofuser'sIOCB*A4=addressofDCB*A5=addressofmyCCB*A6=addressofuser'sTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory*M****************************************************************************** CONFIGUR:%ŠCMP.B„#XTDIPC,CCBTYPE(A5)DISKIPC‚?/ŠBEQ†REQSTATYES, MUSTLOOKLIKESTATUSREQUEST &ŠBSR†CNFGLENSETUPDATABUFFERLENGTH0ŠMOVE.LƒIOSDBP(A3),D6‡SETUPDATABUFFERADDRESS ŠBSR†BUFADDR2ŠMOVE.LƒD6,CCBPTR(A5)‡SAVEBUFFERPHYSICALADDRESS#ŠMOVE.LƒD6,A0SETUPBUFFERPOINTERŠSPC„2-ŠBSR†VALATPRMŒRetrievethemasksofsupported6ŠMOVEM.W‚D0-D1,-(A7)‰attributesandparametersforthe(*¦requesteddeviceandsavethemaskson *¦thestack.ŠSPC„29ŠMOVE.Bƒ#CECUAP,D2ŠIfunsupportedattributesorparameter2ŠNOT.W„D0’arespecifiedintheusersattributesor<ŠAND.W„IOSATM(A0),D0‡parametersmask,returnaconfiguration*ŠNOT.W„D1’error.Restorethestackedmasks1ŠAND.W„IOSPRM(A0),D1‡beforeprocessingtheerror. ŠOR.W…D0,D1ŠMOVEM.W‚(A7)+,D0-D1ŠBNE.S„IPCR220AŠSPC„26ŠMOVE.Bƒ#CECCDO,D2ŠIftheuseristryingtochangethe1ŠMOVE.Wƒ#%1100,D3‹readorwritetimeout,returna)ŠAND.W„IOSPRM(A0),D3‡configurationerror.ŠBNE.S„IPCR220AŠBRA.S„IPCR220BŠPAGEŠSPC†2BIPCR220A‚MOVE.BƒD2,IOSCEC(A0)‡Savetheconfigurationerrorcodein:ŠMOVE.Bƒ#ISTACNF,D1‰theusersconfigurationdatablockand/ŠBRA†ABORTreturnaconfigurationerrortoIOS.ŠSPC†2IPCR220B‚CLR.L„D6-ŠBSET…#LUFACT,D6ŠSETACTIVEDEVICETABLEFLAG%ŠBSR†DEVTBLŽSETUPDEVICETABLEENTRY*/ŠBSR†SETPKTŽSETUPPACKETHEADERINSHAREDMEM.ŠMOVE.Wƒ#XCONH,D16ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDSŠSPC†23ŠMOVE.LƒCCBPTR(A5),A0‡Loadtheaddressoftheusers*¦configureparameterblock.N*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PJD 11/26/843‰MOVEM.LƒA5,-(A7)ŒSavetheCCBaddressonthestack:‰MOVE.L„CCBDTBL(A5),A5†Getthestartaddressofthedevice*¦tables‰CLR.L…D0’Needthewholereg!4‰MOVE.B„DCBCDV(A4),D0‡GetthedevicenumberfromDCB6‰MULU†#LUDSZE,D0ŠMULsizeofanentrybydevicenumber&*¦togetdistancefromstartoftable./‰ADD.L…D0,A5Addtobasetogetstartofdevice*¦tableforthisdevice.4‰LEA‡CONFIG(A5),A5‡UseoffsetfrombaseofCONFIGso!*¦wecanusetheIOEequatesinto*¦theconfigurationdata.N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< PJD 11/26/84ŠSPC†2O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/83A*‰BTSTW‚#DATPRT,DCBATT(A4)ƒIftherequesteddeviceisaterminal,>ŠBTSTM‚DATPRT,DCBATT,A4…Iftherequesteddeviceisaterminal, *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:ŠBEQ.S‚IPCR222Œbranchtogenerateaterminalconfiguration *£packet.‰PAGE*)*ˆSetuptheprinterconfigurationpacket**'*ˆStartofHardwareConfogurationbytes0ŠMOVE.Lƒ#$80000000,D0‡SETUPH/WCONFIGUREBYTES*&*ˆCheckforlinelengthchangerequest*B‰BTSTW…#IOSRECB,IOSPRM(A0)Doeshewanttochangethelinelength?#‰BEQ.S…IPCR221AŒNo,usethecurrent=ŠMOVE.BƒIOSREC+1(A0),D0…Yes,pickupthelinelengthhewants‰BRA.S…IPCR221B**ˆUsethecurrentlinelength*;IPCR221AMOVE.B„IOSREC+1(A5),D0…UsethecurrentlinelengthCIPCR221B‚MOVEP.L‚D0,IPCHWC1(A1)†PUTH/WCONFIGURATIONINSHAREDMEM%*ˆEndofHardwareConfigurationbytes'*ˆStartofSoftwareConfigurationbytes‰MOVE.L„#$00000080,D0*+*ˆCheckforTopofFormbeforeprintoption*A‰BTSTW…#IOASNFF,IOSATM(A0)DoeshewanttochangetheTopofForm *¦option?#‰BEQ.S…IPCR221DŒNo,usethecurrent8‰BTSTW…#IOASNFF,IOSATW(A0)Yes,doeshewanttheoption? ‰BEQ.S…IPCR221EŒNo,don'tsetit-IPCR221CBSET†#XSWTOF,D0ŠYes,settheoption!‰BRA.S…IPCR221EDIPCR221DBTSTW…#IOASNFF,IOSATW(A5)Istheoptionsetinthecurrent? ‰BNE.S…IPCR221CŒYes,keepitset:IPCR221EROL.L…#8,D0Rotatethefirstbyteoutoftheway.*!*ˆCheckforAutoLinefeedoption*C‰BTSTW…#IOALNFD,IOSATM(A0)DoeshewanttochangetheAUTOLINEFEED *¦option?#‰BEQ.S…IPCR221GŒNo,usethecurrent<ŠBTSTW„#IOALNFD,IOSATW(A0)Yes,doeshewantAUTOLINEFEED?.ŠBEQ.S„IPCR221HŒNo,NOAUTOLINEFEEDdesired.;IPCR221F‚BSET…#XSWALF,D0 ŠYes,settheAUTOLINEFEEDoption‰BRA.S…IPCR221H6IPCR221GBTSTW…#IOALNFD,IOSATW(A5)UseAUTOLINEFEED?3‰BNE.S…IPCR221FŒYes,settheAUTOLINEFEEDoption.;IPCR221HROL.L…#8,D0Rotatethesecondbyteoutoftheway.*'*ˆChecktheendofline/printcharacter*C‰BTSTW…#IOSELCB,IOSPRM(A0)Doeshewanttochangetheend-printch?#‰BEQ.S…IPCR221IŒNo,usethecurrent7‰MOVE.B„IOSELC(A0),D0‡Yes,getthecharhewantstouse‰BRA.S…IPCR221J3IPCR221IMOVE.B„IOSELC(A5),D0‡Usethecurrentvalue6IPCR221JROL.L…#8,D0Movethe3rdbyteoutoftheway.*4*ˆAllchoicesmade,sendthelwordtothesharedram*?‰MOVEP.LƒD0,IPCSWC1(A1)†SendtheSoftwareConfigtosharedmem.*)*ˆEndoftheSoftwareConfigurationbytes"*ˆEndofthePrinterConfiguration* ŠBRA†IPCR249ŠPAGE*!*ˆStartofTerminalConfiguration* IPCR222ƒEQU†*ŠMOVE.Lƒ#$80,D0*"*‰CHECKATTRIBUTEMASK-STOPBITS*ŠBTSTW„#IOASTPB,IOSATM(A0)ŠBEQ.S„IPCR223ŽUSEDEFAULT*%*‰SETUPSTOPBITSFROMATTRIBUTEWORD*(ŠBTSTW„#IOASTPB,IOSATW(A0)‚2STOPBITS?ŠBEQ.S„IPCR225ŽBRANCHIFNO&ŠBRA.S„IPCR224ŽYES-GOSETOPTIONBIT*1*‰SETUPSTOPBITSFROMCURRENTCONFIGURATIONAREA* IPCR223ƒEQU†*(ŠBTSTW„#IOASTPB,IOSATW(A5)‚2STOPBITS?ŠBEQ.S„IPCR225ŽBRANCHIFNO**‰SETTHEOPTIONBIT* IPCR224ƒEQU†*ŠBSET…#XHWSTP,D0*%*‰CHECKATTRIBUTEMASK-7/8BITMASK* IPCR225ƒEQU†*ŠBTSTW„#IOABITS,IOSATM(A0)ŠBEQ.S„IPCR226USEDEFAULT***‰SETUPNUMBEROFBITSFROMATTRIBUTEWORD*"ŠBTSTW„#IOABITS,IOSATW(A0)‚8BIT?ŠBNE.S„IPCR228ŽBRANCHIFNOŠBRA.S„IPCR227ŽYES*6*‰SETUPNUMBEROFBITSFROMCURRENTCONFIGURATIONAREA* IPCR226ƒEQU†*"ŠBTSTW„#IOABITS,IOSATW(A5)‚8BIT?ŠBNE.S„IPCR228ŽBRANCHIFNO**‰SETTHE8BITOPTIONBIT* IPCR227ƒEQU†*$ŠBSET…#XHWBIT,D0‹YES,SETOPTIONBIT**‰CHECKATTRIBUTEMASK-PARITY* IPCR228ƒEQU†*ŠBTSTW„#IOAUSEP,IOSATM(A0)ŠBEQ.S„IPCR229USEDEFAULT*&*‰SETUPPARITYUSEFROMATTRIBUTEWORD*%ŠBTSTW„#IOAUSEP,IOSATW(A0)‚USEPARITYŠBEQ.S„IPCR231ŽBRANCHIFNOŠBRA.S„IPCR230ŽYES*2*‰SETUPPARITYUSEFROMCURRENTCONFIGURATIONAREA* IPCR229ƒEQU†*$ŠBTSTW„#IOAUSEP,IOSATW(A5)‚USEPARIYŠBEQ.S„IPCR231ŽBRANCHIFNO**‰SETTHEPARITYUSEOPTIONBIT* IPCR230ƒEQU†*%ŠBSET…#XHWPRTY,D0ŠYES,SETOPTIONBIT*(*‰CHECKATTRIBUTEMASK-ODD/EVENPARITY* IPCR231ƒEQU†*ŠBTSTW„#IOAPRTY,IOSATM(A0)ŠBEQ.S„IPCR232USEDEFAULT*+*‰SETUPEVEN/ODDPARITYFROMATTRIBUTEWORD*&ŠBTSTW„#IOAPRTY,IOSATW(A0)‚EVENPARITYŠBEQ.S„IPCR234ŽBRANCHIFNOŠBRA.S„IPCR233ŽYES*7*‰SETUPEVEN/ODDPARITYFROMCURRENTCONFIGURATIONAREA* IPCR232ƒEQU†*(ŠBTSTW„#IOAPRTY,IOSATW(A5)‚EVENPARITY?ŠBEQ.S„IPCR234ŽBRANCHIFNO* *‰SETTHEPARITYEVENOPTIONBIT* IPCR233ƒEQU†*$ŠBSET…#XHWEVN,D0‹YES,SETOPTIONBIT*%*‰PUTBYTE1H/WCONFIGINSHAREDMEM* IPCR234ƒEQU†*ŠMOVE.BƒD0,IPCHWC1(A1)*(*ˆChecktheparametersmaskforbaudrate*<‰BTSTW…#IOSBRTB,IOSPRM(A0)Shouldweconfigurethebaudrate?'‰BEQ.S…IPCR234AŒNo,usethecurrentone.ŠMOVE.BƒIOSBRT(A0),D0‡Yes,pickupthenewone‰BRA.S…IPCR234B*(*ˆUsethecurrentconfiguration‚baudrate*=IPCR234AMOVE.B„IOSBRT(A5),D0‡Usethecurrentconfigbaudrate>‰MOVE.B„D0,IOSBRT(A0)‡Updatetheuser'sIOCBtoshownewbdrte**‰CHECKATTRIBUTEMASK-MODEM*"IPCR234B‚BTSTW„#IOAMODM,IOSATM(A0)ŠBEQ.S„IPCR235USEDEFAULT*!*‰SETUPMODEMFROMATTRIBUTEWORD*!ŠBTSTW„#IOAMODM,IOSATW(A0)‚MODEM?ŠBEQ.S„IPCR237ŽBRANCHIFNOŠBRA.S„IPCR236ŽYES*-*‰SETUPMODEMFROMCURRENTCONFIGURATIONAREA* IPCR235ƒEQU†*"ŠBTSTW„#IOAMODM,IOSATW(A5)‚MODEM?ŠBEQ.S„IPCR237ŽBRANCHIFNO**‰SETTHEMODEMOPTIONBIT* IPCR236ƒEQU†**ŠBSET…#XHWMDM,D0‹YES,SETMODEMOPTIONBIT*(*‰PUTBYTE2H/WCONFIGINSHAREDMEMORY* IPCR237ƒEQU†*ŠMOVE.BƒD0,IPCHWC2(A1)*'*ˆChecktheparametersmask-NullPads*3‰BTSTW…#IOSNLSB,IOSPRM(A0)‹Configurethenullpads?*‰BEQ.S…IPCR237A– No,usethecurrentconfig:ŠMOVE.BƒIOSNLS(A0),IPCHWC3(A1)ˆYes,moveuser'svalueinto *°sharedram.‰BRA.S…IPCR237B*CIPCR237A‚MOVE.BƒIOSNLS(A5),IPCHWC3(A1)ˆUsethecurrentconfigvalue.ŠMOVE.BƒIOSNLS(A5),IOSNLS(A0)‰UpdateuserIOCB*#*ˆChecktherecordlengthparameter*?IPCR237BBTSTW…#IOSRECB,IOSPRM(A0)‹Configuretherecordlength?‰BEQ.S…IPCR237C>ŠMOVE.BƒIOSREC+1(A0),IPCHWC4(A1)‚PUTLINELENGTHINSHAREDMEM‰BRA.S…IPCR237D(IPCR237CMOVE.B„IOSREC+1(A5),IPCHWC4(A1)!‰MOVE.B„IOSREC+1(A5),IOSREC+1(A0)IPCR237D‚CLR.L„D02ŠMOVEP.L‚D0,IPCSWC1(A1)‡SETUPS/WCONFIGUREBYTES*ŠOR.B…#$80,D0ŽSETTHECONFIGUREOPTIONBIT*$*‰CHECKATTRIBUTEMASK-HALFDUPLEX*ŠBTSTW„#IOAECHO,IOSATM(A0)ŠBEQ.S„IPCR238USEDEFAULT*'*‰SETUPHALFDUPLEXFROMATTRIBUTEWORD*'ŠBTSTW„#IOAECHO,IOSATW(A0)‚HALFDUPLEX?ŠBEQ.S„IPCR240ŽBRANCHIFNOŠBRA.S„IPCR239ŽYES*3*‰SETUPHALFDUPLEXFROMCURRENTCONFIGURATIONAREA* IPCR238ƒEQU†*(ŠBTSTW„#IOAECHO,IOSATW(A5)‚HALFDUPLEX?ŠBEQ.S„IPCR240ŽBRANCHIFNO* *‰SETTHEHALFDUPLEXOPTIONBIT* IPCR239ƒEQU†*1ŠBSET…#XSWHDX,D0‹YES-SETHALFDUPLEXOPTIONBITN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<*%*‰CHECKATTRIBUTEMASK-ACCEPTNULLS* IPCR240ƒEQU†*ŠBTSTW„#IOAPNUL,IOSATM(A0)ŠBEQ.S„IPCR241USEDEFAULT*(*‰SETUPACCEPTNULLSFROMATTRIBUTEWORD*)ŠBTSTW„#IOAPNUL,IOSATW(A0)‚ACCEPTNULLS?ŠBEQ.S„IPCR243ŽBRANCHIFNOŠBRA.S„IPCR242ŽYES*4*‰SETUPACCEPTNULLSFROMCURRENTCONFIGURATIONAREA* IPCR241ƒEQU†*)ŠBTSTW„#IOAPNUL,IOSATW(A5)‚ACCEPTNULLS?ŠBEQ.S„IPCR243ŽBRANCHIFNO*!*‰SETTHEACCEPTNULLSOPTIONBIT* IPCR242ƒEQU†*%ŠBSET…#XSWNUL,D0ŠYES-SETOPTIONBIT***‰CHECKATTRIBUTEMASK-ACCEPTTYPEAHEAD* IPCR243ƒEQU†*ŠBTSTW„#IOATAHD,IOSATM(A0)ŠBEQ.S„IPCR244USEDEFAULT*-*‰SETUPACCEPTTYPEAHEADFROMATTRIBUTEWORD*,ŠBTSTW„#IOATAHD,IOSATW(A0)‚ACCEPTTYPEAHEAD+ŠBEQ.S„IPCR246ŽBRANCHIFTYPEAHEADALLOWED#ŠBRA.S„IPCR245ŽTYPEAHEADINHIBITED*9*‰SETUPACCEPTTYPEAHEADFROMCURRENTCONFIGURATIONAREA* IPCR244ƒEQU†*.ŠBTSTW„#IOATAHD,IOSATW(A5)‚ACCEPTTYPEAHEAD?+ŠBEQ.S„IPCR246ŽBRANCHIFTYPEAHEADALLOWED*0*‰SETTHEACCEPTTYPEAHEADINHIBITEDOPTIONBIT* IPCR245ƒEQU†*/ŠBSET…#XSWTAHD,D0‰NO-SETTYPEAHEADINHIBITED*(*‰CHECKATTRIBUTEMASK-XON/XOFFORCTS* IPCR246ƒEQU†*ŠBTSTW„#IOAXCTL,IOSATM(A0)ŠBEQ.S„IPCR247USEDEFAULT*+*‰SETUPXON/XOFFORCTSFROMATTRIBUTEWORD*'ŠBTSTW„#IOAXCTL,IOSATW(A0)USEXON/XOFFŠBEQ.S„IPCR249ŽNO-USECTSŠBRA.S„IPCR248ŽYES*7*‰SETUPXON/XOFFORCTSFROMCURRENTCONFIGURATIONAREA* IPCR247ƒEQU†*'ŠBTSTW„#IOAXCTL,IOSATW(A0)USEXON/XOFFŠBEQ.S„IPCR249NO-USECTS**‰SETTHEUSEXON/XOFFOPTION* IPCR248ƒEQU†*ŠBSET…#XSWXON,D0 IPCR249ƒEQU†*ŠMOVE.Lƒ(A7)+,A5ŒRESTOREA5 IPCR250ƒEQU†*2ŠMOVE.BƒD0,IPCSWC1(A1)†SETUPS/WCONFIGUREBYTE1N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>*#ŠMOVE.Bƒ#ETX,IPCCETX(A1)„SETUPETX.ŠMOVE.Bƒ#CNPKSZ,IPCPKSZ(A1)SETUPPACKETSIZE9ŠMOVE.Bƒ#1,DCBCCF(A4)‡SETCONFIGURATIONCOORDINATIONFLAG ŠBRA†NRMEXITŠPAGEM*******************************************************************************‰CHANGEDEFAULTCONFIGURATION*6*‰ThiscommandchangestheDCBconfiguration,towhich4*‰IOSwillrestoreus(viaaCONFIGUREcommand)when/*‰FHSclosesthelastallocationofthedevice.*(*‰Entry:A2=addressofCMRparamblock*A3=addressofuser'sIOCB*A4=addressofDCB*A5=addressofmyCCB*A6=addressofuser'sTCB*M******************************************************************************CHNGDEF:%ŠCMP.B‚#XTDIPC,CCBTYPE(A5)ƒDISKIPC‚?2ŠBEQ„REQSTATIfso,performaconfiguration/status *§request.&ŠBSR„CNFGLENSETUPDATABUFFERLENGTH0ŠMOVE.LƒIOSDBP(A3),D6‡SETUPDATABUFFERADDRESS ŠBSR†BUFADDR2ŠMOVE.LƒD6,CCBPTR(A5)‡SAVEBUFFERPHYSICALADDRESS 7ŠLEA†DCBDEV(A4),A0„A0<--addr essofDCBconfiguration. *G************************************************************************)* Printer/Terminal change default command** CCHGD020ƒMOVE.LCCBPTR(A5),A1†A1<--physicaladdressofdatablock.ŠSPC„23ŠMOVE.B#CECUAP,D2‹Ifanyunsupportedattributesor3ŠBSR„VALATPRM‹parametersarespecifiedintheusers1ŠNOT.W‚D0‘attributesorparametersmask,returna)ŠAND.W‚IOSATM(A1),D0†configurationerror. ŠNOT.W‚D1ŠAND.W‚IOSPRM(A1),D1 ŠOR.WƒD0,D1 ŠBNE„BADCNFGŠSPC„2*F*‚Firstweneedtoseewhathisproposedconfigurationwilllooklike.D*‚Plugintohisdatablockthecurrentvaluesforthoseattributes&?*‚parametershedoesn'twanttochange.‚Theappropriatecurrent(*‚configurationisatA0andhe'satA1.*4ŠMOVE.WIOSATM(A1),D0†Pickupusersattributesmask.;ŠAND.W‚D0,IOSATW(A1)†Zeroouttheattributesofhisthathe.ŠNOT.W‚D0‘doesn'twanttochange,zerooutthe<ŠAND.W‚IOSATW(A0),D0†attributesofminethathedoeswantto:ŠOR.WƒD0,IOSATW(A1)†change,andcombinetheminhisspace. @ŠMOVE.WIOSPRM(A1),D0†Getmaskofparametershewantstochange. 1ŠLSR.W‚#1,D0ŽIfhe'snotchangingtheLINEWIDTH,ŠBCS.S‚CHGD022Œgivehimours.ŠMOVE.WIOSREC(A0),IOSREC(A1) 8CHGD022ƒLSR.W‚#1,D0ŽIfhe'snotchangingtheLINES/PAGE,ŠBCS.S‚CHGD024Œgivehimours.ŠMOVE.LIOSRSZ(A0),IOSRSZ(A1) :CHGD024ƒLSR.W‚#1,D0ŽIfhe'snotchangingtheWRITETIMEOUT$ŠBCS.S‚CHGD026Œvalue,givehimours.ŠMOVE.LIOSWTO(A0),IOSWTO(A1) 9CHGD026ƒLSR.W‚#1,D0ŽIfhe'snotchangingtheREADTIMEOUT$ŠBCS.S‚CHGD028Œvalue,givehimours.ŠMOVE.LIOSRTO(A0),IOSRTO(A1) O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/83F*CHGD028ƒBTSTW‚#DATPRT,DCBATT(A4)ƒIfthedeviceisaterminal,processCCHGD028„BTSTM‚DATPRT,DCBATT,A4‚Ifthedeviceisaterminal,process *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2ŠBEQ.S‚CHGD031Œtheterminalspecificconfiguration *£parameters.ŠSPC„24ŠLSR.W‚#1,D0IftheuserisnotchangingtheLogical7ŠBCS.S‚CHGD029ŽRecordlength,copythecurrentdefault.ŠMOVE.WIOSLRL(A0),IOSLRL(A1) 7CHGD029ƒLSR.W‚#1,D0IftheuserisnotchangingtheEOL3ŠBCS.S‚CHGD030ŒCHARACTER,copythecurrentdefault.ŠMOVE.BIOSELC(A0),IOSELC(A1)CHGD030ƒBRA.S‚OKCNFGŠSPC„2I*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 11/07/846CHGD031ƒLSR.W‚#1,D0Žifhe'schangingtheXOFF/XONcharŠBCS.S‚CHGD031A‹givehimoursŠMOVE.BIOSXOF(A0),IOSXOF(A1)ŠMOVE.BIOSXON(A0),IOSXON(A1)?CHGD031A‚LSR.W‚#1,D0Žifhe'schangingtheBREAKEQUIVALENTcharŠBCS.S‚CHGD031B‹givehimoursŠMOVE.BIOSBRC(A0),IOSBRC(A1)=CHGD031B‚LSR.W‚#1,D0Žifhe'schangingtheDISCARDOUTPUTcharŠBCS.S‚CHGD031C‹givehimoursŠMOVE.BIOSDOP(A0),IOSDOP(A1)*;CHGD031C‚LSR.W‚#1,D0Žifhe'schangingtheREPRINTLINEcharŠBCS.S‚CHGD031D‹givehimoursŠMOVE.BIOSRLN(A0),IOSRLN(A1)*:CHGD031D‚LSR.W‚#1,D0Žifhe'schangingtheCANCELLINEcharŠBCS.S‚CHGD031E‹givehimoursŠMOVE.BIOSCLC(A0),IOSCLC(A1)*:CHGD031E‚LSR.W‚#1,D0Žifhe'schangingtheREADTERMINATORSŠBCS.S‚CHGD031F‹givehimoursŠMOVE.LIOSRTV(A0),IOSRTV(A1)*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 11/07/84*7CHGD032ƒLSR.W‚#1,D0ŽIfhe'snotchangingtheBAUDRATE,ŠBCS.S‚CHGD034Œgivehimours.ŠMOVE.BIOSBRT(A0),IOSBRT(A1) 9CHGD034ƒLSR.W‚#1,D0ŽIfhe'snotchangingtheNULPADDING,ŠBCS.S‚CHGD036Œgivehimours.ŠMOVE.BIOSNLS(A0),IOSNLS(A1) 7CHGD036ƒLSR.W‚#2,D0ŽtheTERMINATOR-CLASSdoesn'tapply.6ŠBCS.S‚OKCNFGIftheuserisnotchangingtheTERMINAL<ŠMOVE.BIOSTCD(A0),IOSTCD(A1)CODE,copythecurrentdefault )*£Currentlytherearenoerrorchecksfor)*§MCCMserialparallelports,sogoahead"*§withtheproposedconfiguration. * OKCNFG:*J*‚Itpassedallthetests,somoveittotherealthing(eithertheDCBorH*‚ortheCCB).‚Don'tmovethemasks,though;startwithATTRIBUTESWORD.*ŠSPC„2BŠMOVE.LIOSDST(A0),IOSDST(A1)‚Copythedevice,driver,andchannel3ŠCLR.B‚IOSDST(A1)‹codesfromtheDCBintotheusers'*¥configurationblock.Clearthestatus(*¥fieldforlackofcurrentinformation.ŠSPC„22ŠBSR.S‚CNFGLENLoadD5withthenumberofbytesto<ŠSUB.W‚#IOSATW+1,D5ˆtransfer-1andloadtheaddressesofthe8ŠADD.L‚#IOSATW,A0ŠATTRIBUTESWORDinA0fortheCCB/DCB,:ŠADD.L‚#IOSATW,A1ŠandinA1fortheusersconfigureblock.ŠSPC„2FCNFGLOOP‚MOVE.B(A1)+,(A0)+‰CopytheusersconigurationblockintotheŠDBRAƒD5,CNFGLOOPˆCCB/DCB. :ŠMOVE.B#1,DCBCCF(A4)†Setconfigurationcoordinationflag. ŠCLR.L‚D1‘*1ŠBRA„ABORTgoodstatusbutusetheABORTroutine. *0*‚Configurationerror!‚SetD1toindicateerror.*BADCNFG: :ŠMOVE.B‚#ISTACNF,D1‰Returntheconfigurationerrorcodein?ŠMOVE.BD2,IOSCEC(A1)†theusersconfiguredatablockandreturn(ŠBRA…ABORTŒaconfigurationerrortoIOS.ŠPAGEL*****************************************************************************%*‰GETCONFIGURATIONDATABLOCKLENGTH**‚Entry:A4=AddressofDCB*ŠA5=AddressofCCB*B*‚Exit:‚D5=Configurationdatablocklengthforrequesteddevice*L**************************************************************************** CNFGLEN:8ŠMOVE.L#IOSDLN,D5ŒLoadD5.LwiththeconfigurationdataAŠCMP.B‚#XTDIPC,CCBTYPE(A5)blocklengthforthedisk,printer,or2ŠBEQ.S‚CNFGLENRŒterminalbasedonthedevicetype.ŠSPC„2ŠMOVE.L#IOSPLN,D5O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/83*‰BTSTW‚#DATPRT,DCBATT(A4)ŠBTSTM‚DATPRT,DCBATT,A4 *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠBNE.S‚CNFGLENRŠSPC„2ŠMOVE.L#IOSTLN,D5ŠSPC„2 CNFGLENR‚RTSŠPAGEL*****************************************************************************2*‰GETMASKSOFSUPPORTEDATTRIBUTESANDPARAMETERS**†Entry:A4=AddressofDCB*ŽA5=AddressofCCB*>*†Exit‚:D0.W=Supportedattributesmaskforrequesteddevice7*ŽD1.W=Supportedparametersmaskforrequesteddevice*L**************************************************************************** VALATPRM:.ŠMOVE.W#0,D0‘IfthedeviceisadiskIPC,the7ŠMOVE.W#0,D1supportedattributesandparametersmasksAŠCMP.B‚#XTDIPC,CCBTYPE(A5)arebothzerobecauseconfigurationis,ŠBEQ.S‚VALATRTNŒnotsupportedonthedevice.ŠSPC„2<ŠMOVE.W#PRTATM,D0‹Ifthedeviceisaprinteroraterminal,<ŠMOVE.W#PRTPRM,D1‰loadtheappropriatesupportedattributesO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/83?*‰BTSTW‚#DATPRT,DCBATT(A4)andparametersmasksforthedevice.<ŠBTSTM‚DATPRT,DCBATT,A4andparametersmasksforthedevice. *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠBNE.S‚VALATRTNŠSPC„2ŠMOVE.W#TERATM,D0ŠMOVE.W#TERPRM,D1ŠSPC„2 VALATRTN‚RTSŠPAGEL******************************************************************************‰READCOMMAND*,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory*L*****************************************************************************READ:5ŠBSR„IOSCOMNŒDothestuffcommontoallI/Ocommands,7ŠMOVE.LD6,CCBPTR(A5)†savethebufferphysicaladdress. ŠCLR.L‚D6&ŠBSETƒ#LUFXFR,D6ŒSETDATATRANSFERBITŠBSETƒ#LUFACT,D6ŒSETACTIVEBIT%ŠCMP.B‚#XTDIPC,CCBTYPE(A5)ƒDISKIPC?ŠBNE.S‚READ10BRANCHIFNO$ŠBSR„DSKPRMYES,VALIDATEPARAMETERS+READ10„BSR„DEVTBLSETUPDEVICETABLEENTRY /ŠBSR„SETPKTSETUPPACKETHEADERINSHAREDMEM. %ŠCMP.B„#XTDIPC,CCBTYPE(A5)DISKIPC?ŠBNE.S„READ20ŽBRANCHIFNO ŠMOVE.Wƒ#XRE AD,D1&ŠBSR†DSKCMDŽYES,SETUPCOMMANDPACKETŠBRA†NRMEXITGOFINISHUP 1READ20„BTSTW„#IOPFORB,IOSOPT(A3)FORMATTEDMODE?ŠBNE.S„READ30ŽNO4ŠMOVE.Wƒ#XINF,D1ŒYES,SETUPREADFORMATTEDCOMMANDS ŠBRA.S„READ401READ30„MOVE.Wƒ#XINI,D1ŒSETUPREADIMAGECOMMANDSREAD40„CLR.L„D0+ŠBTSTW„#IOPECHB,IOSOPT(A3)ECHOSPECIFIED?ŠBEQ.S„READ50ŽYES+ŠOR.L…#XPKCECH,D0‰NO,SETUPNOECHOOPTIONN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<< READ50„EQU†*2ŠBTSTW„#IOPCTAB,IOSOPT(A3)FLUSHTYPEAHEADBUFFERŠBEQ.S„READ60ŽNO0ŠOR.L…#XPKCTAB,D0‰NO,SETUPFLUSHBUFFEROPTION READ60„EQU†* *ºFAM7/04/84N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>"ŠBSR†MCCMCMDSETUPCOMMANDPACKETŠBRA†NRMEXITGOFINISHUPŠPAGEL******************************************************************************‰WRITE**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory**L*****************************************************************************WRITE:5ŠBSR„IOSCOMNŒDothestuffcommontoallI/Ocommands,7ŠMOVE.LD6,CCBPTR(A5)†savethebufferphysicaladdress. ŠCLR.L‚D6&ŠBSETƒ#LUFXFR,D6ŒSETDATATRANSFERBITŠBSETƒ#LUFACT,D6ŒSETACTIVEBIT%ŠCMP.B‚#XTDIPC,CCBTYPE(A5)ƒDISKIPC?ŠBNE.S‚WRIT10BRANCHIFNO$ŠBSR„DSKPRMYES,VALIDATEPARAMETERS+WRIT10„BSR„DEVTBLSETUPDEVICETABLEENTRY /ŠBSR„SETPKTSETUPPACKETHEADERINSHAREDMEM. %ŠCMP.B„#XTDIPC,CCBTYPE(A5)DISKIPC?ŠBNE.S„WRIT50ŽBRANCHIFNO O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/83A*WRIT20„BTSTW„#DATWRC,DCBATT(A0)‚WRITEWITHVERIFYFORTHISDCB?>WRIT20…BTSTM„DATWRC,DCBATT,A0‚WRITEWITHVERIFYFORTHISDCB? *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠBEQ.S„WRIT30ŽNO4ŠMOVE.Wƒ#XWRITC,D1ŠYES,SETUPWRITE/VERIFYCOMMANDS ŠBRA.S„WRIT408WRIT30„MOVE.Wƒ#XWRITN,D1ŠSETUPWRITE/NOVERIFYCOMMANDS 'WRIT40„BSR†DSKCMDŽSETUPCOMMANDPACKETŠBRA†NRMEXITGOFINISHUP 1WRIT50„BTSTW„#IOPFORB,IOSOPT(A3)FORMATTEDMODE?ŠBNE.S„WRIT60ŽNO6ŠMOVE.Wƒ#XOUTF,D1‹YES,SETUPWRITEFORMATTEDCOMMANDS ŠBRA.S„WRIT703WRIT60„MOVE.Wƒ#XOUTI,D1‹SETUPWRITEIMAGECOMMANDSWRIT70„CLR.L„D0O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/832*‰BTSTW„#DATPRT,DCBATT(A0)‚THISAPRINTERDEVICE?/ŠBTSTM„DATPRT,DCBATT,A0‚THISAPRINTERDEVICE? *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠBEQ.S„WRIT80ŽNO3ŠTST.B„DCBBCT(A0)ŠFIRSTWRITEFORTHISASSIGNMENT?$ŠBNE.S„WRIT80ŽNO,NONEEDTODOAFF.ŠOR.L…#XSWFF,D0‹YES,SETUPTOPOFPAGEOPTION-ŠADD.B„#1,DCBBCT(A0)‡NOWSETTOPOFPAGEFLAG)WRIT80„BSR†MCCMCMDSETUPCOMMMANDPACKETŠBRA†NRMEXITGOFINISHUPŠPAGEL*****************************************************************************%*‰OUTPUTW/INPUT‚(MCCMCOMMANDONLY)**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory**L*****************************************************************************OUTWINP:*'*‚FirsttakecareoftheWRITEportion.*5ŠBSR„IOSCOMNŒDothestuffcommontoallI/Ocommands,8ŠMOVE.LD6,CCBPTR(A5)†storethebufferphysicaladdress.*$*‚NowtakecareoftheREADportion.*?ŠMOVE.LIOSRRN(A3),D6†D6<--logicalstartaddrofreadbuffer.<ŠMOVE.LIOSLEN(A3),D5†D5<--lengthofreadbufferinbytes./ŠMOVE.LD5,CCBLEN1(A5)…Savethebufferlength&&ŠBSR„BUFADDRŒgetthephysicaladdress,8ŠMOVE.LD6,CCBPTR1(A5)…savethebufferphysicaladdress. ŠCLR.L‚D6&ŠBSETƒ#LUFXFR,D6ŒSETDATATRANSFERBITŠBSETƒ#LUFACT,D6ŒSETACTIVEBIT%ŠBSR„DEVTBLSET UPDEVICETABLEENTRY /ŠBSR„SETPKTSETUPPACKETHEADERINSHAREDMEM. 3OUTW10„BTSTW„#IOPFORB,IOSOPT(A3)‚OUTPUTFORMATTED?ŠBNE.S„OUTW30ŽNO,ŠBTSTW„#IOPINFB,IOSOPT(A3)INPUTFORMATTED?ŠBNE.S„OUTW20ŽNO8ŠMOVE.Wƒ#XOFIF,D1‹SETUPOUTPUTFRMT/INPUTFRMTCOMMANDS ŠBRA.S„OUTW50?OUTW20„MOVE.Wƒ#XOFIM,D1‹SETUPOUTPUTFRMT/INPUTIMAGECOMMANDS ŠBRA.S„OUTW502OUTW30„BTSTW„#IOPINFB,IOSOPT(A3)‚INPUTFORMATTED?ŠBNE.S„OUTW40ŽNO5ŠMOVE.Wƒ#XOIIF,D1‹SETUPOUTPUTIMAGE/INPUTFRMTCMDS ŠBRA.S„OUTW50>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<< OUTW60„EQU†*4ŠBTSTW„#IOPCTAB,IOSOPT(A3)FLUSHTYPEAHEADBUFFER?ŠBEQ.S„OUTW70ŽNO,ŠOR.L…#XPKCTAB,D0‰SETUPFLUSHBUFFEROPTIONN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>> OUTW70„EQU†*-ŠMOVEP.L‚D0,IPCSWCF(A1)†SETUPPACKETOPTIONS ŠMOVE.Lƒ#1,D11ŠMOVEP.W‚D1,IPCNBKS(A1)†SETUPBLOCKSTOTRANSFERŠMOVE.LƒCCBLEN(A5),D1)ŠMOVEP.W‚D1,IPCBKSZ(A1)†SETUPBLOCKSIZEŠMOVE.LƒCCBPTR(A5),D1.ŠMOVEP.L‚D1,IPCBUFAD(A1)…SETUPBUFFERADDRESS ŠCLR.L„D1'ŠMOVEP.W‚D1,IPCCKSM(A1)†SETUPCHECKSUM ŠMOVE.Lƒ#1,D1,ŠMOVEP.W‚D1,IPCNBKS2(A1)…SETUPINPUTBLOCKSŠMOVE.LƒCCBLEN1(A5),D10ŠMOVEP.W‚D1,IPCBKSZ2(A1)…SETUPINPUTBLOCKSIZEŠMOVE.LƒCCBPTR1(A5),D14ŠMOVEP.L‚D1,IPCBUFA2(A1)…SETUPINPUTBUFFERADDRESS#ŠMOVE.Bƒ#ETX,IPCETX2(A1)„SETUPETX/ŠMOVE.Bƒ#OWIPKSZ,IPCPKSZ(A1)SETUPPACKETSIZE ŠBRA†NRMEXITŠPAGEH*************************************************************************)*ˆFORMATDISKCOMMAND‚(DISKCOMMANDONLY)*,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory**I**************************************************************************FORMAT: )‰BTSTWƒ#IOPFTRK,IOSOPT(A3)‚FORMATTRACK?‰BEQ.SƒFORMT20ŽBRANCHIFNO !‰MOVE.L‚IOSRRN(A3),D1‰PICKUPRRN$‰BMI.SƒFORMT10ERROR,NEGATIVEVALUE%‰CMP.LƒDCBSEC(A4),D1‰ISRRNTOOBIG?&‰BLT.SƒFORMT20NO,VALIDATIONCOMPLETE/FORMT10‚MOVE.B‚#ISTARR,D1ŒSETUPIOSERRORCODE ‰BRA…ABORT FORMT20‚CLR.LƒD6‰BSET„#LUFACT,D6ŒSETACTIVEBIT%‰BSR…DEVTBLSETUPDEVICETABLEENTRY /‰BSR…SETPKTSETUPPACKETHEADERINSHAREDMEM. 0FORMT30ƒBTSTW„#IOPFTRK,IOSOPT(A3)‚FORMATTRACK?ŠBNE.S„FORMT40YESŠMOVE.Wƒ#XFDISK,D16ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDS#ŠMOVE.Bƒ#ETX,IPCDETX(A1)„SETUPETX.ŠMOVE.Bƒ#FDPKSZ,IPCPKSZ(A1)SETUPPACKETSIZEŠBRA†NRMEXITGOFINISHUP FORMT40ƒMOVE.Wƒ#XFTRAK,D16ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDSŠMOVE.Wƒ#SECSIZ,D1)ŠMOVEP.W‚D1,IPCBKSZ(A1)†SETUPBLOCKSIZE ŠCLR.L„D1*ŠMOVEP.W‚D1,IPCNBKS(A1)†ZERONO.OFBLOCKSŠMOVE.LƒIOSRRN(A3),D1"ŠMOVEP.L‚D1,IPCFPSN(A1)†SETUPPSN#ŠMOVE.Bƒ#ETX,IPCFETX(A1)„SETUPETX.ŠMOVE.Bƒ#FTPKSZ,IPCPKSZ(A1)…SETUPPACKETSIZEŠBRA†NRMEXITGOFINISHUPŠPAGEH**************************************************************************‰HALTI/O‚(MCCMCOMMANDONLY)*3*‰ThiscommandstopstheI/Ocurrentlyinprogress.**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB**J***************************************************************************HALT: ŠCLR.L„D0+ŠMOVE.BƒDCBCDV(A4),D0‡PICKUPDEVICENUMBER&ŠCMP.B„#LUMAX,D0‹VALIDDEVICENUMBER?'ŠBSRGT„KILRNO,BRINGDOWNTHESYSTEM!,ŠMULU…#LUDSZE,D0ŠCALCULATEPOSITIONINTABLE2ŠMOVE.LƒCCBDTBL(A5),A1†SETUPDEVICETABLEPOINTERŠINHIBŠTST.W„LUFLG(A1,D0.L)ˆACTIVE?ŠBEQ†HALTERŽNO,ERROR3ŠBSETW„#LUFHLT,LUFLG(A1,D0.L)SETHALTPENDINGFLAGŠENABL /ŠBSR†SETPKTŽSETUPPACKET HEADERINSHAREDMEM. ŠMOVE.Wƒ#XHALT,D16ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDS#ŠMOVE.Bƒ#ETX,IPCRETX(A1)„SETUPETX/ŠMOVE.Bƒ#HLTPKSZ,IPCPKSZ(A1)†SETUPPACKETSIZE ŠBRA†NRMEXITŠPAGEH**************************************************************************‰TRANSMITBREAKREQUEST*<*‰ThiscommandsendsthebreakrequesttotheLUNspecified.**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB**J***************************************************************************TBREAK: ŠCLR.L„D6-ŠBSET…#LUFACT,D6ŒSETACTIVEDEVICETABLEFLAG%ŠBSR†DEVTBLSETUPDEVICETABLEENTRY*,ŠBSR†SETPKTSETUPPACKETHDRINSHAREDMEM.ŠMOVE.Wƒ#XTRNSBK,D16ŠMOVEP.W‚D1,IPCCHCM(A1)ˆSETUPCHANNEL/DEVICECOMMANDS#ŠMOVE.Bƒ#ETX,IPCRETX(A1)†SETUPETX/ŠMOVE.Bƒ#TBKPKSZ,IPCPKSZ(A1)‚SETUPPACKETSIZE ŠBRA†NRMEXITŠPAGEL*****************************************************************************C*‰ROUTINECOMMONTOALLI/OCOMMANDS(READ,WRITE,OUTPUTW/INPUT)**‚Entry:A3=addressofIOCB*‰A5=addressofCCB**‚Exit:‚(normal)*‰D6=physicaladdrofbuffer**‚Exit:‚(abort)*‰D1=errorstatus**L*****************************************************************************IOSCOMN:?ŠBTSTW‚#IOPTSKB,IOSOPT(A3)Ifthebuffersresideinadifferent"ŠBEQ.S‚IOSC005ŒtaskfromtheIOCB, 9ŠLEA„IOSTSK(A3),A0†Pointtothetaskname&sessionofthe7ŠTR0$.GETTCB‚,Œbufferowner&callexectogetaddress."ŠBRA.S‚OKTCBŽIfit'sgood,branch.ŠNOP—Ifit'sbad,7ŠMOVE.B#ISTAADD,D1ˆsetstatusinIOCBtoaddresserrorŠTST.L‚(A7)+ŽadjuststackŠBRA„ABORTandexittoCMR. :OKTCB…MOVE.LA0,CCBTASKB(A5)„SavephysicaladdressofTCB. *<*‚ValidatetheinfointheIOCBabouttheprimarybufferand *‚converttophysicaladdresses.*BIOSC005ƒMOVE.LIOSSAD(A3),D6†D6<--bufferphysicalstartaddress.+ŠMOVE.LIOSEAD(A3),D5†D5<--bufferlength.ŠSUB.L‚D6,D5Ž*ŠADDQ.L#1,D5Ž*)ŠMOVE.LD5,CCBLEN(A5)†SavelengthinCCB. >ŠMOVE.LCCBTASKB(A5),A1„A1<--addressofTCBofbufferowner. ŠBSR„IOHADRCK‹Checktheaddress.$ŠBRA.S‚IOSC010ŒIfit'sgood,branch.ŠNOP—Ifit'sabadbaseaddrŠTST.L‚(A7)+Žadjuststack4ŠMOVE.B#ISTAADD,D1ˆSetIOCBstatustoADDRESSERROR2ŠBRA„ABORTandexitwithappropriateerrorstatus. IOSC010ƒEQU„*N*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<< ŠGO_OFF_BDD6N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>ŠRTSŠPAGEK****************************************************************************/*‰VALIDATEBUFFERADDRESS&CONVERTTOPHYSICAL*$*‰Entry:D5=bufferlengthinbytes-*D6=bufferlogicalstartaddr(toconvert)*A3=addressofIOCB*A5=addressofCCB***‰Exit:‚D6ƒ=bufferphysicalstartaddress*D5ƒ=bufferlength*K****************************************************************************BUFADDR:>ŠMOVE.LCCBTASKB(A5),A1„A1<--addressofTCBofbufferowner. ŠBSR„IOHADRCK‹Checktheaddress.$ŠBRA.S‚OKADDR2ŒIfit'sgood,branch.ŠNOP—Ifit'sabadbaseaddrŠTST.L‚(A7)+Žadjuststack4ŠMOVE.B#ISTAADD,D1ˆSetIOCBstatustoADDRESSERROR2ŠBRA„ABORTandexitwithappropriateerrorstatus.OKADDR2ƒEQU„*’Return.*N*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<< ŠGO_OFF_BD‚D6N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>ŠRTSŠPAGEO*********************************************************************************ˆCHECKDISKPARAMETERS**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB**O********************************************************************************DSKPRM:%‰MOVE.W‚IOSOPT(A3),D1‰PICKUPOPTIONS+‰AND.Wƒ#IOPRAN,D1ŒRANDOMOPTIONSPECIFIED?‰BNE.SƒDSK PR10YES(‰MOVE.B‚#ISTATM,D1ŒSETUPIOSERRORCODE‰BRA.SƒDSKPR25ERROREXIT(DSKPR10‚MOVE.L‚IOSRRN(A3),D1‰PICKUPRRN‰BPL.SƒDSKPR30GOODRRN/DSKPR20‚MOVE.B‚#ISTARR,D1ŒSETUPIOSERRORCODE DSKPR25‚TST.Lƒ(A7)+‘ADJUSTSTACK‰BRA…ABORTERROREXITŠSPC„2ADSKPR30ƒCMP.LƒDCBSEC(A4),D1‡Iftherandomrecordnumberspecified7ŠBLT.SƒDSKPR35‹intheIOCBispasttheendofthedisk,1ŠMOVE.B#ISTARR,D1‰returnanend-of-volumeerror.ŠBRA.S‚DSKPR25ŠSPC„22DSKPR35‚MOVE.L‚CCBLEN(A5),D1‰PICKUPBUFFERLENGTH"‰DIVS„#256,D1CALC.NO.OFSECTORS ‰MOVE.L‚D1,D2*‰AND.Lƒ#$FFFF0000,D2‰MUSTBEWHOLESECTORS‰BEQ.SƒDSKPR40ITSOK5‰MOVE.B‚#ISTAADD,D1‹ERROR,PARTIALSECTORNOTALLOWED‰BRA…DSKPR25ERROREXIT1DSKPR40‚MOVE.W‚D1,CCBBLKS(A5)ˆSAVENO.OFSECTORS2‰ADD.LƒIOSRRN(A3),D1‰CALC.LASTSECTORTOTRANSFER‰CMP.LƒDCBSEC(A4),D1‰RANGEOK?‰BLE.SƒDSKPR50YES4‰MOVE.L‚DCBSEC(A4),D1‰NO,CALC.MAXSECTORSCANREAD‰SUB.LƒIOSRRN(A3),D1/‰MOVE.W‚D1,CCBBLKS(A5)ˆSAVESECTORSTOTRANSFER ‰BSET„#LUFEOF,D6ŒSETEOFPENDINGDSKPR50‚RTS›RETURN‰PAGEO********************************************************************************** SET UP DEVICE TABLE ENTRY**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB**‰D6=devicetableflag*N*******************************************************************************DEVTBL: ŠCLR.L‚D0(ŠMOVE.BDCBCDV(A4),D0‰PICKUPDEVICENO. ŠCMP.B‚#LUMAX,D0DEVICENO.OK?'ŠBSRGT‚KILR’NO,BRINGTHESYSTEMDOWN!ŠMULUƒ#LUDSZE,D0ŒCALC.POSITION3ŠMOVE.LCCBDTBL(A5),A0ˆPICKUPDEVICETABLEPOINTER(ŠTST.W‚LUFLG(A0,D0.L)ŠTHISDEVICEFREE?ŠBEQ.S‚DEVT010YESŠTST.L‚(A7)+‘ADJUSTSTACK+ŠMOVE.B#ISTADB,D1ŒRETURNDEVICEBUSYERRORŠBRA„ABORTERROREXIT2DEVT010ƒMOVE.WD6,LUFLG(A0,D0.L)‡UPDATETABLEFLAG,ŠMOVE.LA4,LUDCB(A0,D0.L)‡SETUPDCBADDRESS.ŠMOVE.LA3,LUIOCB(A0,D0.L)†SETUPIOCBADDRESS6ŠMOVE.LCCBTASKB(A5),LUTCB(A0,D0.L)SETUPTCBADDRESS8ŠMOVE.LCCBPTR(A5),LUBADR(A0,D0.L)SETUPBUFFERADDRESS ŠRTSšRETURNŠPAGEJ***************************************************************************%*ˆSETUPPACKETHEADERINSHAREDMEM.**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB*,*‰Return:A1=addressofIPCsharedmemory**I**************************************************************************SETPKT:%ŠMOVE.LƒCCBCHB(A5),A1‡MEMMAPPEDADDR)ŠLEA†IPCIM1(A1),A1‡SETUPMESSAGEADDRESSŠMOVE.Wƒ#SPKT,D1/ŠMOVEP.W‚D1,IPCSTX(A1)‡SETUPSTXANDPACKETID%ŠMOVE.LƒXIOUID(A2),A0‡GETDCBADDRESS0ŠMOVE.BƒDCBCDV(A0),IPCPHDV(A1)‚SETUPDEVICENO. ŠRTSšRETURNŠPAGEJ***************************************************************************)*‰SETUPDISKPARAMETERSINSHAREDMEMORY*&*‚Entry:A1=addressofSHAREDMEMORY%*‰A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB**‰D1=CHANNEL/DEVICEcommands*K****************************************************************************DSKCMD:6ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDSŠMOVE.WƒCCBBLKS(A5),D18ŠMOVEP.W‚D1,IPCNBKS(A1)†SETUPNO.OFBLOCKSTOTRANSFERŠMOVE.Wƒ#SECSIZ,D1)ŠMOVEP.W‚D1,IPCBKSZ(A1)†SETUPBLOCKSIZEŠMOVE.LƒCCBPTR(A5),D1.ŠMOVEP.L‚D1,IPCBUFAD(A1)…SETUPBUFFERADDRESS ŠCLR.L„D1'ŠMOVEP.W‚D1,IPCCKSM(A1)†SETUPCHECKSUMŠMOVE.LƒIOSRRN(A3),D1#ŠMOVEP.L‚D1,IPCCMPRM(A1)…SETUPPSN"ŠMOVE.Bƒ#ETX,IPCETX(A1)…SETUPETX.ŠMOVE.Bƒ#IOPKSZ,IPCPKSZ(A1)SETUPPACKETSIZE ŠRTSšRETURNŠPAGEJ***************************************************************************)*ˆSETUPMCCMPARAMETERSINSHAREDMEMORY**&*‚Entry:A1=addressofSHAREDMEMORY%*‰A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressof DCB*‰A5=addressofCCB*‰A6=addressofusersTCB**‰D0=options*‰D1=channel/devicecommands**L*****************************************************************************MCCMCMD:6ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDS&ŠMOVEP.L‚D0,IPCSWCF(A1)†SETUPOPTIONS ŠMOVE.Lƒ#1,D18ŠMOVEP.W‚D1,IPCNBKS(A1)†SETUPNO.OFBLOCKSTOTRANSFERŠMOVE.LƒCCBLEN(A5),D1)ŠMOVEP.W‚D1,IPCBKSZ(A1)†SETUPBLOCKSIZEŠMOVE.LƒCCBPTR(A5),D1.ŠMOVEP.L‚D1,IPCBUFAD(A1)…SETUPBUFFERADDRESS ŠCLR.L„D1'ŠMOVEP.W‚D1,IPCCKSM(A1)†SETUPCHECKSUM"ŠMOVE.Bƒ#ETX,IPCETX(A1)…SETUPETX.ŠMOVE.Bƒ#IOPKSZ,IPCPKSZ(A1)SETUPPACKETSIZE ŠRTSšRETURNŠPAGEO******************************************************************************** *ˆNORMALEXIT*,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB*I**************************************************************************NRMEXIT:*/* INDICATE AWAITING ACK, BUMP I/O PENDING COUNT*'ŠBSETW‚#CCBFGWAK,CCBFG(A5)ƒSETCCBFLAGŠMOVE.LCCBTASKB(A5),A0-ŠADD.B‚#1,TCBIOCNT(A0)„BUMPI/OPENDINGCOUNT** INTERRUPT THE IPC*0ŠMOVE.LCCBCHB(A5),A1†SETUPSHAREDMEM.POINTER(ŠMOVE.B#$80,IPCIMB1(A1)ƒMESSAGEWAITING0ŠADD.B‚#2,CCBICNT(A5)…BUMPOUTSTANDINGINTCOUNT%ŠMOVE.B#$80,IPCINT(A1)„INTERRUPTIPC#ŠCLR.L‚D0‘SETUPGOODRETURNTOCMR*7* USER REQUEST SIDE OF IPC ALWAYS EXITS FROM THIS POINT*IPCUSRTN‚EQU„*ŠRTS—RETURNTOMAINLINEŠPAGEJ****************************************************************************ˆKILR(KILLER)*3*“ROUTINECALLEDTOHANDLEUNRECOVERAVLECONDITIONS**Î ·IÀPÈJÐ5ØHàAè@ðJø:<;@8 :(N0H8@@CH;PBXH`'K****************************************************************************KILR: ‰TR0$.KILLER     J*****************************************************************************‚NOTHINGTOHALTERRORROUTINE*%*’ENTRY:A2=PARAMETERBLOCKADDRESS*™A3=IOCBPACKETADDRESS*™A4=ADDRESSOFDCB*™A5=ADDRESSOFCCB*™A6=ADDRESSOFCALLERSTCB*H************************************************************************* HALTER:‚ENABL)‰LEA‡CCBPKT(A5),A4‡SETUPQUEUEWORKAREA ‰MOVE.L„#6,D0SETUPPACKETSIZE$‰MOVE.B„#XPSHLT,D1ŠSETUPEVENTTYPE"‰MOVE.L„XIOUID(A2),D2‡SETUPPBID'‰MOVE.W„#XSTVABT,D3ŠSETUPSTATUSVALUE‰BSR‡QEVNTGOQUEUEEVENT ‰CLR.L…D0‰BRA‡IPCUSRTNŒRETURN‰PAGEJ*****************************************************************************ˆABORTCOMMANDROUTINE*%*’ENTRY:A2=PARAMETERBLOCKADDRESS*™A3=IOCBPACKETADDRESS*™A4=ADDRESSOFDCB*™A5=ADDRESSOFCCB*™A6=ADDRESSOFCALLERSTCB*™D1=IOSERRORCODE*H*************************************************************************ABORT:)‰LEA‡CCBPKT(A5),A4‡SETUPQUEUEWORKAREA ‰MOVE.L„#6,D0SETUPPACKETSIZE"‰MOVE.L„XIOUID(A2),D2‡SETUPPBID‰AND.W…#$FF,D1!‰MOVE.W„D1,D3SETUPSTATUSVALUE!‰MOVE.B„D1,IOSSTA(A3)‡UPDATEIOCB$‰MOVE.B„#XPSNRM,D1ŠSETUPEVENTTYPE‰BSR‡QEVNTGOQUEUEEVENT ‰CLR.L…D0‰BRA‡IPCUSRTNŒRETURNŠPAGEF***********************************************************************B* SUBROUTINE TO CHECK ADDRESS BOUNDARIES TO SEE IF ENTIRELY WITHIN*ƒCALLINGTASKSADDRESSSPACE.*#*ENTRY:ƒD5‚-NO.OFBYTESTOCHECK*ŠD6‚-68000ADDRESS(LOGICAL)*ŠA1‚-TCBADDRESS** EXEC ROUTINE#* REGISTERS USED: D0-D1,D3,D6/A0-A1**7*EXIT:„D6-PHYSICALADDRESSOFBUFFERBASE(IFLEGAL)*ŠRETURNTOPC„FORGOODADDRESS*”PC+2‚FORBADLENGTH*”PC+4‚FORBADADDRESS*F*********************************************************************** IOHADRCK:$ŠBTSTƒ#0,D6ŽMUSTBEONWORDBOUNDARY (ŠBNE.S‚IOHADR6ŒBRANCHIFBADBUFFERBASE ŠTST.L‚D5.ŠBEQ.S‚IOHADR8ŒDON'TGOTOLOGPHYWITH0COUNT IOHADR2ƒEQU„*/ŠMOVE.LTCBTST(A1),A0†ADDRESSOFTASKSEGTABLE ŠTR0$.LOGPHY&ŠBRA.S‚IOHADR8ŒBRANCHFORGOODADDRESSŠNOP—FORPARTIN/PARTOUTERROR-IOHADR6ƒADD.L‚#2,(A7)ŒADJUSTFORERRORRETURN IOHADR8ƒRTSŠPAGEI***************************************************************************ˆGETTCBROUTINE*)*’ENTRY:A0=POINTERTOTASKANDSESSION***’EXECROUTINE*’REGISTERSUSED:D0-D1/A0-A1***’EXIT:A0=TCBADRESS**˜RETURNTOPC„FORGOODTASKSPECIFICATION!*¢PC+2‚FORBADTASKSPECIFICATION**J***************************************************************************GETTCB: ŠTR0$.GETTCB%ŠBRA.S„GETT10ŽGOODTASKSPECIFICATION%ŠADD.L„#2,(A7)BADTASKSPECIFICATION GETT10„RTSŠPAGEJ**************************************************************************** * SUBROUTINE TO COMPUTE CHECKSUM*&*‡ENTRY:A1=PHYSADDROFBLOCKBEGIN,*ŽD5=ONERELATIVECOUNTOFNUMBEROFBYTES*C*‡EXIT:‚D1=CHECKSUM(SUMOFBYTESWITHWORD(16BIT)SIGNIFICANCE)** REGISTERS D0,D5 DESTROYED*M****************************************************************************** IPCCKSUM:!‰TR0$.KILLER‰GOCRASHTHESYSTEM?*‰CLR.LƒD1‹ACCUMULATOR)*‰MOVE.L‚A1,D0ˆADDRESSOFBLOCKBEGINNING'*‰BTSTW‚#24,D0ˆISITFOR2NDARYMEMORY?*‰BNE.SƒCKSUM2‡BRANCHIFYES+* CHECKSUM CALCULATION IF IN PRIMARY MEMORY*‰CLR.LƒD0‹BYTEHOLDER*IPCCK30ƒEQU…*'*‰SUB.Lƒ#1,D5ˆBEGINWITHZERORELINDEX*‰BLT.SƒIPCCK50†BRANCHIFDONE*‰MOVE.B‚0(A1,D5.L),D0 *‰NOT.BƒD0/*‰ADD.WƒD0,D1ˆCONTRIBUTETHISBYTETOCHECKSUUM*‰BRA…IPCCK30†GOFORANOTHER IPCCK50ƒEQU„**‰RTS…0ŒBACKTOMAINLINE** CHECKSUM CALCULATION IF IN 2NDARY MEMORY CKSUM2„EQU„*!*‰TR0$.KILLERˆGOCRASHTHESYSTEM"*‰AND.Lƒ#$00FFFFFF,D0‡CLEARBIT24*‰MOVE.L‚D0,A1ˆFORINDEXING*‰CLR.LƒD0‹BYTEHOLDER+*‰MOVE.W‚SR,-(A7)…SAVEFORINTERRUPTUNMASK*IPCCK80ƒEQU…*ŒLOOPTOP,*‰SUB.Lƒ#1,D5ˆBEGINWITHZERORELATIVEINDEX/*‰BLT.SƒIPCCK90†BRANCHIFDONEWITHCALCULATION"*‰MOVE.W‚#$2700,SR„MASKINTERRUPTS!*‰MOVE.W‚#0,$FE0006ƒTOGGLE2NDARY+*‰MOVE.B‚0(A1,D5.L),D0‡PICKUPNEXTFORSUM*‰MOVE.W‚(A7),SR†UNMASK *‰NOT.BƒD0.*‰ADD.WƒD0,D1ˆCONTRIBUTETHISBYTETOCHECKSUM *‰BRA…IPCCK80(*IPCCK90‚ADD.Lƒ#2,A7‰BYPASSSAVEDSTATUS*‰BRA.SƒIPCCK50‡BACKTOCALLERŠPAGEI****************************************************************************‚CMRRESETROUTINE*%*ˆENTRY:A2=PARAMETERBLOCKADDRESS*A3=PACKETADDRESS*A5=CCBADDRESS*A6=CALLERSTCBADDRESS*I**************************************************************************5* Just a note for future maintainers of this code ---*G*Thefollowingresetroutinehasneverbeeninvoked.‚InpracticethereH*ƒisnowayforustoreachthiscodeeventhoughBSRCMRRESTispresentF*ƒinthecode.‚Ifthiscodewereeverexecuted,themostlikelyresultC*ƒwouldbetolosetheIPCuntilareboottakesplace.‚WhenaresetH*ƒisissued,theIPCgoesintoaselftestmodeandthereisnogoodway@*ƒtotellwhenitisdone.‚TheamountoftimespentinselftestG*ƒmodemaybeconsiderable.‚TohandletheresetlogicinanintelligentD*ƒwaywouldinvolvesignificantchangestothedriverandtoIOS.‚As6*ƒof01/18/84,nosuchchangeshavebeencontemplated.*CMRREST:*/ŠMOVE.LCCBCHB(A5),A4†SETUPSHAREDMEMPOINTER*5*‰SETLASTBYTEOFSHAREDMEMORYASANINDICATORTHAT*‰RESETISNOTCOMPLETE*ŠMOVE.B#$FF,IPCLST(A4)=* CLEAR ERROR MODE,WAITING FOR ACK, DEALT WITH ACK, EXIT FLAG%ŠCLR.L‚CCBNAKAD(A5)‡CLEARNAKADDRESS'ŠCLR.L‚CCBERAD1(A5)‡CLEARERRORADDRESSŠINHIB•INHIBITINTERRUPTSEŠAND.W#-1-(1<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<*&*‰CheckforConfiguration(2ndPacket)*"ŠBTST.B#PIDPKTF,RTNPID+IPCIM2(A4)ŠBEQ.S‚PKTC010NO,IPCERRORŠBRA„INEXITYES2ndPacket*N*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<*.PKTC030ƒMOVE.L‚LUDCB(A2),A0‰SETUPDCBPOINTER ŠCLR.LƒD1%ŠCMP.Bƒ#XTDIPC,CCBTYPE(A5)‚DISKIPC? ŠBNE…MCCMPKTŽNO,MUSTBEANMCCM*‰BRA…DSKPKTYESŠPAGEL*****************************************************************************,* HANDLE DISK NORMAL COMPLETION PACKETS HERE*+*ˆENTRY:A2=addressofdevicetableentry*A3=addressofIOCB(*A4=addressofIPCsharedmemorybase*A5=addressofCCB*D0=packetstatusvalue*O********************************************************************************DSKPKT:/ŠLEA…DERXREF(PC),A1‡SETSTATUSCROSSREF.TABLE*ŠCMP.Wƒ#DERXL,D0ŒERRORCODEINTHETABLE?ŠBLE.SƒDSKPK10ŽBRANCHIFYES'ŠBSR…IPCUNSERNO,IPCERROR-RESETIPCŠBRA…IPCINRTNRETURN'DSKPK10ƒCMP.Wƒ#XPSCSM,D0‹CHECKSUMERRORŠBNE.SƒDSKPK20ŽBRANCHIFNOŠCLR.LƒD0“YES,IGNOREIT1DSKPK20ƒLSL.Wƒ#1,D0TIMES2FORPOSITIONINTABLE+ŠMOVE.B‚(A1,D0.W),D1‰PICKUPIOSERRORCODE!ŠBNE.SƒDSKPK30ŽBRANCHIFANERROR&ŠBTSTWƒ#LUFEOF,LUFLG(A2)„EOFPENDING?ŠBEQ.SƒDSKPK30ŽBRANCHIFNO)ŠMOVE.B‚#ISTAEOV,D1ŠSETUPIOSERRORCODEŠBRA.SƒDSKPK505DSKPK30ƒBTST„#1,1(A1,D0.W)ˆNEEDTOUPDATEPSNFIELD?ŠBEQ.SƒDSKPK40ŽBRANCHIFNO:ŠMOVEP.LRTNSTPR+IPCIM2(A4),D2‚PICKUPPSNFROMSHAREDMEM+ŠMOVE.L‚D2,IOSRRN(A3)ˆUPDATEIOCBRRNFIELDDSKPK40ƒCLR.LƒD41ŠBTST„#0,1(A1,D0.W)ˆNEEDTOUPDATELENGTHFIELD?ŠBEQ.SƒDSKPK60ŽBRANCHIFNODSKPK50ƒCLR.LƒD35ŠMOVEP.WRTNBLKS+IPCIM2(A4),D3‚PICKUPNO.OFSECTORS2ŠMOVEP.WRTNBKSZ+IPCIM2(A4),D4‚PICKUPSECTORSIZEŠMULU„D3,D4CALC.NO.OFBYTES5DSKPK60ƒMOVE.L‚D4,IOSLEN(A3)ˆUPDATEIOCBLENGTHFIELD.ŠMOVE.B‚D1,IOSSTA(A3)ˆUPDATEIOCBSTATUSFIELD ŠBRA…INEXITŠPAGEK****************************************************************************!* HANDLE UNSOLICITED PACKETS HERE*+*ˆENTRY:A2=addressofdevicetableentry*A3=addressofIOCB(*A4=addressofIPCsharedmemorybase*A5=addressofCCB*L*****************************************************************************UNSPKT:.ŠCMP.B‚#RTNUNS,RTNSTCM+IPCIM2(A4)RIGHTCODE?ŠBEQ.S‚UNSP010BRANCHIFYES 'ŠBSR„IPCUNSERŽNO,IPCERROR-RESETIPCŠBRA„IPCINRTNŽRETURN0UNSP010ƒMOVE.LLUDCB(A2),D2ŠPICKUPLASTCMDDCB$ŠBEQ.S‚UNSP030FIRSTONE,USECCBID ŠMOVE.LD2,A0‘SETUPDCBPOINTER'ŠMOVE.W#XSTVDST,D3‹SETUPSTATUSVALUE%ŠCMP.B‚#XTDIPC,CCBTYPE(A5)ƒDISKIPC?ŠBNE.S‚UNSP020NO;ŠMOVE.BRTNSTAD+IPCIM2(A4),D0‚GETSTATUSFROMSHAREDMEMORYŠMOVE.LD0,D4‘MAKEANOTHERCOPY"ŠAND.W‚#$0F,D4ISOLATEDEVICEBITS"ŠAND.W‚#$F0,D0ISOLATESTATUSBITS$ŠLSL.W‚#8,D0‘SETUPBYTE1OFSTATUSŠOR.WƒD0,D4‘MERGEBYTE1AND2:ŠMOVEP.LRTNLSEC+IPCIM2(A4),D0‚GETSECTORSFROMSHAREDMEM-ŠMOVE.LD0,DCBSEC(A0)‰UPDATEDCBWITHSECTORS&ŠMOVE.L#8,D0‘SETUPEVENTINFOLENGTHŠBRA.S‚UNSP040BUNSP020ƒMOVE.BRTNSTAD+IPCIM2(A4),D0‚GETSTATUSFROMSHAREDMEMORYŠMOVE.LD0,D4‘MAKEANOTHERCOPY"ŠAND.W‚#$0F,D4ISOLATEDEVICEBITS"ŠAND.W‚#$F0,D0ISOLATESTATUSBITSŠBSETƒ#XDSBRK,D0ŒSETBREAKBIT$ŠLSL.W‚#8,D0‘SETUPBYTE1OFSTATUSŠOR.WƒD0,D4‘MERGEBYTE1AND2&ŠMOVE.L#8,D0‘SETUPEVENTINFOLENGTHŠBRA.S‚UNSP040  5UNSP030ƒMOVE.LCCBMNEM(A5),D2ˆSETUPCHANNELMNEMONIC'ŠMOVE.W#XSTVNID,D3‹SETUPSTATUSVALUE0ŠMOVE.BRTNSTPR+IPCIM2(A4),D0‚PICKUPIPCSTATUSŠMOVE.LD0,D4‘MAKEANOTHERCOPY"ŠAND.W‚#$0F,D4ISOLATEDEVICEBITS"ŠAND.W‚#$F0,D0ISOLATESTATUSBITS$ŠLSL.W‚#8,D0‘SETUPBYTE1OFSTATUSŠOR.WƒD0,D4‘MERGEBYTE1AND2/ŠMOVE.BRTNPHDV+IPCIM2(A4),D5SETUPDEVICENO.'ŠMOVE.L#10,D0SETUPEVENTINFOLENGTH+UNSP040ƒMOVE.B#XPSUNS,D1ŒSETUPEVENTTYPE+ŠLEA„CCBCPKT(A5),A4ˆSETUPEVENTBUILDAREA#ŠBSR„QEVNT‘QUEUENOTIFICATIONEVENT ŠBRA„INEX010ŠPAGEJ*************************************************************************** * HANDLE HALT/ABORT PACKET ($71)*+*ˆENTRY:A2=addressofdevicetableentry*A3=addressofIOCB(*A4=addressofIPCsharedmemorybase*A5=addressofCCB*D0=packetstatusvalue*K****************************************************************************HLTPKT:#ŠCMP.W‚#XPSICM,D0ŒINVALIDCOMMAND?ŠBNE.S‚HLTP010BRANCHIFNON*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<*#*‰ConfigureCommand-secondpacket*"ŠBTST.B#PIDPKTF,RTNPID+IPCIM2(A4)ŠBNE.S‚HLTP030YES-2ndpacket*N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>0ŠBCLRW‚#LUFHLT,LUFLG(A2)…Clearhaltpendingflag&ŠBRA„INEX020Goacknowledgeandreturn:HLTP010ƒMOVE.B#ISTATO,IOSSTA(A3)„UPDATEIOCBSTATUSFIELD*ŠCLR.L‚IOSLEN(A3)ŒUPDATEIOCBLENGTHFIELD&ŠMOVE.W#ISTATO,D3ŒSETUPSTATUSVALUE$ŠMOVE.B#XPSHLT,D1ŒSETUPEVENTTYPE-HLTP020ƒMOVE.L#6,D0‘SETUPEVENTINFOLENGTH)ŠMOVE.LLUDCB(A2),D2ŠSETUPDCBFOREVENT+ŠLEA„CCBCPKT(A5),A4ˆSETUPEVENTBUILDAREAŠBSR„QEVNT‘QUEUEHALTEVENT)ŠCLR.W‚LUFLG(A2)CLEARDEVICETABLEENTRY ŠBRA„INEX010* *‰2ndPacket* HLTP030ƒEQU„*+ŠMOVE.LLUBADR(A2),A1‰SETUPBUFFERPOINTER=ŠAND.L‚#$F84F,IOSPRM(A1)…SETUNCONFIGURABLEBITS(2nd)PACKET ŠBRA„STAP030ŠPAGEL*****************************************************************************0* HANDLE SOLICITED DEVICE/CONFIGURE PACKET ($72)*+*ˆENTRY:A2=addressofdevicetableentry*A3=addressofIOCB(*A4=addressofIPCsharedmemorybase*A5=addressofCCB*D0=packetstatusvalue*L*****************************************************************************STAPKT:+ŠMOVE.LLUBADR(A2),A1‰SETUPBUFFERPOINTER(ŠMOVE.LLUDCB(A2),A0ŠPICKUPDCBADDRESS<ŠMOVE.BRTNDSTA+IPCIM2(A4),D1‚PICKUPSTATUSFROMSHAREDMEM ŠMOVE.LD1,D2"ŠAND.B‚#$0F,D2ISOLATEDEVICETYPE-ŠMOVE.BD2,IOSDTP(A1)‰UPDATECONFIGUREBUFFER"ŠAND.B‚#$F0,D1ISOLATESTATUSBITS-ŠMOVE.BD1,IOSDST(A1)‰UPDATEDEVSTATUSFIELD%ŠCMP.B‚#XTDIPC,CCBTYPE(A5)ƒDISKIPC?ŠBNE.S‚STAP020NO&ŠCMP.W‚#3,D0‘DEVICENOTREADYSTATUS?%ŠBEQ.S‚STAP010BRANCHIFYES,IT'SOKŠCMP.W‚#$05,D0ŠBEQ.S‚STAP010$*¦JMPIFINVALIDLOGICALUNITNUMBERŠCMP.W‚#$12,D0ŠBEQ.S‚STAP010*¦JMPIFDEVICENOTTHEREŠCMP.W‚#$10,D0ŠBEQ.S‚STAP010*¦JMPIFDEVICEERRORRETURNEDŠCMP.W‚#$13,D0ŠBEQ.S‚STAP010 *¦JMPIFDEVICECONFLICTERRORŠTST.W‚D0”RIGHTSTATUSVALUE?ŠBEQ.S‚STAP010BRANCHIFYES‰CMP.W…#$0E,D0‰BNE.S…STAP010!*¦JMPIFOTHERTHANINDETERMINATE*¦CHANNELERROR'ŠBSR†IPCUNSERŒNO,IPCERROR-RESETIPCŠBRA†IPCINRTNŒRETURN1STAP010ƒCLR.B„IOSSTA(A3)ŠUPDATEIOCBSTATUSFIELD>ŠMOVEP.L‚RTNLSEC+IPCIM2(A4),D1PICKUPSECTORSFROMSHAREDMEM*ŠMOVE.LƒD1,IOSRSZ(A1)‡UPDATESECTORSFIELD'ŠCLR.W„IOSATW(A1)ŠCLEARATTRIBUTESWORDŠBRA.S„STAP030* STAP020ƒEQU„*N*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 6/04/84 <<<<<<<ŠTST†D0’REQUESTSTATUSCOMMANDŠBEQ†STAP300YES*&*‰CheckforConfiguration(1stPacket)*"ŠBTST.B#PIDPKTF,RTNPID+IPCIM2(A4)ŠBNE.S‚STAP035Not1stPacketN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>*ŠCLR.B‚IOSSTA(A3)ŒUPDATEIOCBSTATUSFIELD*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *ºBKM7/14/83$*‰BTSTWƒ#DATPRT,DCBATT(A0)ƒPRINTER?!ŠBTSTMƒDATPRT,DCBATT,A0ƒPRINTER? *ºBKM7/14/83O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠBEQ…STAP040ŽBRANCHIFNO*>*ˆPrinterconfigurationcomplete.‚Updatecurrentconfiguration*ˆandreturntheresults.*&‰MOVEM.LƒA5,-(A7)ŒSavetheCCBaddress6‰LEA‡CONFIG(A2),A5‡UsetheCONFIGoffsetsowecanuse*¦theIOEequates.BŠMOVE.B‚RTNHWS4+IPCIM2(A4),IOSREC+1(A1)UPDATERECORDLENGTHFIELD?ŠMOVE.B‚RTNHWS4+IPCIM2(A4),IOSREC+1(A5)Updatethecurrentline*±lengthconfigvalue..:ŠMOVE.B‚RTNSWS2+IPCIM2(A4),D3‚PICKUPS/WCONFIGUREBYTE2-‰CLR.W…IOSATW(A5)ŠWipetheoldattributesout!ŠBTST„#XSWALF,D3‹AUTOLINEFEED?ŠBEQ.SƒSTAP025ŽBRANCHIFNOC‰BSETW…#IOALNFD,IOSATW(A5)Yes,settheattributeincurrentconfig0ŠBSETWƒ#IOALNFD,IOSATW(A1)‚YES,SETUPATTRIBUTE‰MOVE.B„RTNSWS3+IPCIM2(A4),IOSELC(A5)Setupend/printcharin*°currentconfigurationarea.*‰MOVEM.Lƒ(A7)+,A5ŒRestoretheCCBaddress.* STAP030ƒEQU…* ŠCLR.LƒD1FŠMOVE.BCCBTYPE(A5),IOSCTP(A1)Returnthechanneltypeanddrivercode<ŠMOVE.B#IODIPC,IOSDRC(A1)ƒintheusersconfigurationblock.ŠBRA…INEXITGOQUEUEEVENT*B*ˆEndofsecondpacketfromMCCM.‚Updatethecurrentconfigvalues* STAP035‚EQU‡*&‰MOVEM.LƒA5,-(A7)ŒSavetheCCBaddress:‰LEA‡CONFIG(A2),A5‡UsetheCONFIGoffsetsowecanusethe*¦IOEequates.‰MOVE.W„IOSREC(A1),IOSREC(A5)‰MOVE.L„IOSRSZ(A1),IOSRSZ(A5)<‰MOVE.B„IOSXOF(A1),IOSXOF(A5)Updatethecurrentconfigarea<‰MOVE.B„IOSXON(A1),IOSXON(A5)Updatethecurrentconfigarea<‰MOVE.B„IOSBRC(A1),IOSBRC(A5)Updatethecurrentconfigarea0‰CLR.B…IOSDOP(A5)ŒUpdatethecurrentconfigarea<‰MOVE.B„IOSRLN(A1),IOSRLN(A5)Updatethecurrentconfigarea<‰MOVE.B„IOSCLC(A1),IOSCLC(A5)Updatethecurrentconfigarea<‰MOVE.L„IOSRTV(A1),IOSRTV(A5)Updatethecurrentconfigarea<‰MOVE.L„IOSEOL(A1),IOSEOL(A5)Updatethecurrentconfigarea<‰MOVE.B„IOSBRT(A1),IOSBRT(A5)Updatethecurrentconfigarea<‰MOVE.B„IOSNLS(A1),IOSNLS(A5)Updatethecurrentconfigarea‰MOVEM.Lƒ(A7)+,A5‰BRA.S…STAP030ŠPAGE* STAP040ƒEQU…*0ŠBSR…BLDATRMŽCALLTHEBUILDATTRIBUTESUBROUTINE1ŠMOVE.W‚D1,IOSATW(A1)ˆUPDATEUSERATTRIBUTEFIELD* *‰CONFIGURECOMMAND(2ndPacket)* STAP150ƒEQU…***‰NOWLETSINTERRUPTIPCFOR*‰EVENTCOMPLETION.*1ŠMOVE.LƒCCBCHB(A5),A4‡SETUPSHAREDMEMORYPOINTER5ŠMOVE.Bƒ#ACK,IPCIAB1(A4)„PLACEACKINTOSHAREDMEMORY)ŠMOVE.Bƒ#$80,IPCINT(A4)…INTERRUPTTHEIPC.ŠCLR.W„CCBRCNT(A5)‰JUSTINCASEARESETWORKED**‰BUILDSECONDPACKET*(ŠLEA†IPCIM1(A4),A4‡SETUPMESSAGEADDRESSŠMOVE.Wƒ#SPKT,D1/ŠMOVEP.W‚D1,IPCSTX(A4)‡SETUPSTXANDPACKETID+ŠBSET…#PIDPKTF,IPCPID(A4)SET2ndPACKETID0ŠMOVE.BƒDCBCDV(A0),IPCPHDV(A4)‚SETUPDEVICENO.* *ˆSetuppointertodevicetable* ‰CLR.L…D1+‰MOVE.B„DCBCDV(A0),D1‡Getthedevicenumber)‰MULU†#LUDSZE,D1ŠMulbysizeofonetable2‰MOVE.L„CCBDTBL(A5),A0†Getstartaddressoftables4‰ADD.L…D1,A0Addtogetstartofthisdevice'stable :‰LEA‡CONFIG(A0),A0‡UsetheCONFIGoffsetsowecanuseIOE *¦equates.ŠMOVE.Wƒ#XCON2P,D16ŠMOVEP.W‚D1,IPCCHCM(A4)†SETUPCHANNEL/DEVICECOMMANDS*?*‰UsingtheParameterMaskdeterminewhichparameterscomefrom4*‰theParameterBlockandwhichonesusethedefault*,ŠMOVE.W‚IOSPRM(A1),D0ˆGETMASKOFPARAMETERSŠMOVE.W‚#$5FB3,D10ŠMOVEP.WD1,IPCPMSK(A4)‡PARAMETERMASKTOPACKETŠLSR.Wƒ#2,D0LINESPERPAGEŠBCS.SƒSTAP155YESŠMOVE.LƒIOSRSZ(A0),IOSRSZ(A1) STAP155ƒLSR.Wƒ#3,D0XON/XOFCharŠBCS.SƒSTAP170YES*2*‰MovecurrentconfigXON/XOFchar'sto2ndpacket*ŠMOVE.B‚IOSXOF(A0),IPCXOF(A4)3ŠMOVE.B‚IOSXOF(A0),IOSXOF(A1)ŠUpdatetheusersIOCBŠMOVE.B‚IOSXON(A0),IPCXON(A4)3ŠMOVE.B‚IOSXON(A0),IOSXON(A1)ŠUpdatetheusersIOCBŠBRA.SƒSTAP175*'*‰MovenewXON/XOFchar'sto2ndpacket* STAP170ƒEQU…*ŠMOVE.B‚IOSXOF(A1),IPCXOF(A4)ŠMOVE.B‚IOSXON(A1),IPCXON(A4) STAP175ƒEQU…*!ŠLSR.Wƒ#1,D0BRKequivalentchar.ŠBCS.SƒSTAP180YES*,*‰MovecurrentconfigBRKcharto2ndpacket*ŠMOVE.B‚IOSBRC(A0),IPCBRK(A4)3ŠMOVE.B‚IOSBRC(A0),IOSBRC(A1)ŠUpdatetheusersIOCBŠBRA.SƒSTAP185*!*‰MovenewBRKcharto2ndpacket* STAP180ƒEQU…*ŠMOVE.B‚IOSBRC(A1),IPCBRK(A4) STAP185ƒEQU…*ŠLSR.Wƒ#2,D0REPRINTLINEcharŠBCS.SƒSTAP190YES*5*‰MovecurrentconfigREPRINTLINEcharto2ndpacket*ŠMOVE.B‚IOSRLN(A0),IPCRPRT(A4)/ŠMOVE.B‚IOSRLN(A0),IOSRLN(A1)ŠUpdateusersIOCBŠBRA.SƒSTAP195***‰MovenewREPRINTLINEcharto2ndpacket* STAP190ƒEQU…*ŠMOVE.B‚IOSRLN(A1),IPCRPRT(A4) STAP195ƒEQU…*ŠLSR.Wƒ#1,D0CANCELLINEcharŠBCS.SƒSTAP200YES*4*‰MovecurrentconfigCANCELLINEcharto2ndpacket*ŠMOVE.B‚IOSCLC(A0),IPCCNCL(A4)/ŠMOVE.B‚IOSCLC(A0),IOSCLC(A1)‰UpdateusersIOCBŠBRA.SƒSTAP205*)*‰MovenewCANCELLINE‚charto2ndpacket* STAP200ƒEQU…*ŠMOVE.B‚IOSCLC(A1),IPCCNCL(A4) STAP205ƒEQU…*$ŠLSR.Wƒ#1,D0READTERMINATINGchar'sŠBCS.SƒSTAP210YES*;*‰MovecurrentconfigREADTERMINATINGchar'sto2ndpacket*ŠMOVE.L‚IOSRTV(A0),D1ŠMOVEP.LD1,IPCRTRM(A4)'‰MOVE.L„D1,IOSRTV(A1)‡UpdateusersIOCBŠBRA.SƒSTAP215*0*‰MovenewREADTERMINATINGchar'sto2ndpacket* STAP210ƒEQU…*ŠMOVE.L‚IOSRTV(A1),D1ŠMOVEP.LD1,IPCRTRM(A4) STAP215ƒEQU…*ŠLSR.Wƒ#1,D0EOD-OF-LINEstringŠBCS.SƒSTAP220YES*6*‰MovecurrentconfigEND-OF-LINEstringto2ndpacket*ŠMOVE.W‚IOSEOL(A0),D1ŠMOVEP.WD1,IPCEOL(A4)'‰MOVE.W„D1,IOSEOL(A1)‡UpdateusersIOCBŠBRA.SƒSTAP225*+*‰MovenewEND-OF-LINEstringto2ndpacket* STAP220ƒEQU…*ŠMOVE.W‚IOSEOL(A1),D1ŠMOVEP.WD1,IPCEOL(A4)*** STAP225ƒEQU…*#ŠMOVE.B‚#ETX,IPC2ETX(A4)†SETUPETX.ŠMOVE.B‚#C2PKSZ,IPCPKSZ(A4)ƒSETUPPACKETSIZE**‰INDICATEAWAITINGACK*'ŠBSETWƒ#CCBFGWAK,CCBFG(A5)ƒSETCCBFLAG**‰INTERRUPTTHEIPC* NRXINP„EQU„*0ŠMOVE.LCCBCHB(A5),A1†SETUPSHAREDMEM.POINTER(ŠMOVE.B#$80,IPCIMB1(A1)ƒMESSAGEWAITING0ŠADD.B‚#2,CCBICNT(A5)…BUMPOUTSTANDINGINTCOUNT%ŠMOVE.B#$80,IPCINT(A1)„INTERRUPTIPC#ŠCLR.L‚D0‘SETUPGOODRETURNTOCMR ŠBRA„IPCINRTNŠPAGEK*****************************************************************************†REQUESTSTATUSHANDLING**ˆENTRY:A0=addressofDCB!*A1=addressofuserdatablock$*A2=addressofdevicetableentry(*A4=addressofIPCsharedmemorybase*K*************************************************************************** STAP300ƒEQU…*,ŠLEA…DCBDEV(A0),A3ˆADDROFDCBCONFIGURATION0ŠBSR…BLDATRMŽcallthebuildattributesubroutine1ŠMOVE.W‚D1,IOSATW(A1)ˆupdateuserattributefield,‰MOVE.L„DCBATT(A0),D1‡GettheDCBattributes**@*‰MoveconfigurationinfofromCURRENTCONFIGtouserdatablock*8‰LEA‡CONFIG(A2),A3‡UsetheCONFIGoffsetintothedevice%*¦tablesoweanusetheIOEequates.;‰LEA‡DCBDEV(A0),A0‡GettheDCBdevicedependentareaoffset*>ŠMOVE.W‚IOSREC(A3),IOSREC(A1)MoveCurrentvaluestouserIOCB@ŠMOVE.L‚IOSRSZ(A3),IOSRSZ(A1)Exceptthatsomevalues(thosenot AŠMOVE.L‚IOSWTO(A0),IOSWTO(A1)configurableanyway)willcomefrom *§theDCB.4ŠBTST…#DATPRT,D1ŠChecktheDCBattributes-isthisa *¦printer?5ŠBNE.SƒSTAP330ŽYes,skiptheupdateofthetermstuff**ˆTerminalstatusrequest*ŠMOVE.L‚IOSRTO(A0),IOSRTO(A1)ŠMOVE.B‚IOSXOF(A3),IOSXOF(A1)ŠMOVE.B‚IOSXON(A3),IOSXON(A1)ŠMOVE.B‚IOSBRC(A3),IOSBRC(A1)ŠMOVE.B‚IOSDOP(A3),IOSDOP(A1)ŠMOVE.B‚IOSRLN(A3),IOSRLN(A1)ŠMOVE.B‚IOSCLC(A3),IOSCLC(A1)ŠMOVE.L‚IOSRTV(A3),IOSRTV(A1)ŠMOVE.L‚IOSEOL(A3),IOSEOL(A1)ŠMOVE.B‚IOSBRT(A3),IOSBRT(A1)ŠMOVE.B‚IOSNLS(A3),IOSNLS(A1)ŠMOVE.B‚IOSTCD(A0),IOSTCD(A1) STAP320ƒEQU…* ŠCLR.LƒD1 ŠBRA.SƒINEXITN*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAM 6/04/84 >>>>>>>*%*ˆRemainderofprinterstatusrequest*$STAP330‚MOVE.W„IOSREC(A0),IOSLRL(A1)‰MOVE.B„IOSELC(A0),IOSELC(A1)‰BRA.S…STAP320*ŠPAGEK****************************************************************************,*‰HANDLEMCCMNORMALCOMPLETIONPACKETSHERE*+*‹ENTRY:A2=addressofdevicetableentry*’A3=addressofIOCB(*’A4=addressofIPCsharedmemorybase*’A5=addressofCCB*’D0=packetstatusvalue*K****************************************************************************MCCMPKT:2ŠLEA…MERXREF(PC),A1‡SETUPSTATUSCROSSREF.TABLE*ŠCMP.Wƒ#MERXL,D0ŒERRORCODEINTHETABLE?ŠBLE.SƒMCCMP10ŽBRANCHIFYES)ŠBSR.SƒIPCUNSERNO,IPCERROR-RESETIPCŠBRA.SƒIPCINRTNRETURN)MCCMP10ƒCMP.Wƒ#XPSCSM,D0‹CHECKSUMERROR?ŠBNE.SƒMCCMP20ŽBRANCHIFNOŠCLR.LƒD0“YES,IGNOREERROR1MCCMP20ƒLSL.Wƒ#1,D0TIMES2FORPOSITIONINTABLE,ŠMOVE.B‚(A1,D0.W),D1‰PICKUPIOCBERRORCODE ŠCLR.L…D41ŠBTST„#0,1(A1,D0.W)ˆNEEDTOUPDATELENGTHFIELD?ŠBEQ.SƒMCCMP30ŽBRANCHIFNO5ŠMOVEP.WRTNBKSZ+IPCIM2(A4),D4‚PICKUPTRANSFERBYTES5MCCMP30ƒMOVE.L‚D4,IOSLEN(A3)ˆUPDATEIOCBLENGTHFIELD.ŠMOVE.B‚D1,IOSSTA(A3)ˆUPDATEIOCBSTATUSFIELD*¦FALLTHRUTO"INEXIT"ŠPAGEK****************************************************************************!*‚NORMALEXITFROMINTERRUPTTOUR*+*ˆENTRY:A2=addressofdevicetableentry*A3=addressofIOCB(*A4=addressofIPCsharedmemorybase*A5=addressofCCB*K****************************************************************************INEXIT:&ŠMOVE.L‚#6,D0SETUPEVENTINFOLENGTH)ŠMOVE.L‚LUDCB(A2),D2‰SETUPDCBFOREVENT+ŠMOVE.W‚D1,D3SETUPSTATUSVALUEFOREVENT$ŠMOVE.B‚#XPSNRM,D1‹SETUPEVENTTYPE+ŠLEA…CCBCPKT(A5),A4‡SETUPEVENTBUILDAREA!ŠBSR…QEVNTQUEUECOMPLETIONEVENT)ŠCLR.WƒLUFLG(A2)ŒCLEARDEVICETABLEENTRY*5* DECREMENT I/O PENDING COUNT IF SOLICITED TYPE EVENT*7INEX010ƒMOVE.LCCBCHB(A5),A4†RESTORESHAREDMEMPOINTER.ŠBTSTƒ#7,RTNSTCM+IPCIM2(A4)‚ISTHISSOLICITED?ŠBNE.S‚INEX020ŒBRANCHIFNO ŠMOVE.LLUTCB(A2),A0‡TCBADDRESS2ŠSUB.B‚#1,TCBIOCNT(A0)„DECREMENTI/OPENDINGCOUNT**‰NOWLETSINTERRUPTIPCFOR*‰EVENTCOMPLETION.*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 11/07/84 <<<<<<C*********************************************************************‰BUILDATTRIBUTESMASK*!*‹ENTRY:A1=userbufferpointer(*’A4=addressofIPCsharedmemorybase**‹EXIT:‚D1=attributemask*C******************************************************************* BLDATRMƒEQU…* ŠCLR.LƒD1:ŠMOVE.B‚RTNHWS1+IPCIM2(A4),D2PICKUPH/WCONFIGUREBYTE1ŠBTST„#XHWBIT,D2‹8BIT?ŠBNE.SƒBLDA010ŽBRANCHIFYES&ŠBSET„#IOABITS,D1ŠNO,SETUPATTRIBUTE%BLDA010ƒBTST„#XHWSTP,D2‹2STOPBITS?ŠBEQ.SƒBLDA020ŽBRANCHIFNO'ŠBSET„#IOASTPB,D1ŠYES,SETUPATTRIBUTE!BLDA020ƒBTST„#XHWPRTY,D2ŠPARITY?ŠBEQ.SƒBLDA030ŽBRANCHIFNO'ŠBSET„#IOAUSEP,D1ŠYES,SETUPATTRIBUTEŠBTST„#XHWEVN,D2‹EVENPARITY?ŠBEQ.SƒBLDA030ŽBRANCHIFNO'ŠBSET„#IOAPRTY,D1ŠYES,SETUPATTRIBUTEABLDA030ƒMOVE.B‚RTNHWS2+IPCIM2(A4),D2‚PICKUPH/WCONFIGUREBYTE2ŠBTST„#XHWMDM,D2‹MODEM?ŠBEQ.SƒBLDA040ŽBRANCHIFNO'ŠBSET„#IOAMODM,D1ŠYES,SETUPATTRIBUTE,BLDA040ƒAND.Bƒ#$0F,D2ŽISOLATEBAUDRATEBITS,ŠMOVE.B‚D2,IOSBRT(A1)ˆUPDATEBAUDRATEFIELD6ŠMOVE.B‚RTNHWS3+IPCIM2(A4),IOSNLS(A1)UPDATENULLPADS<ŠMOVE.B‚RTNHWS4+IPCIM2(A4),IOSREC+1(A1)UPDATERECORDLENGTHŠCLR.BƒIOSREC(A1):ŠMOVE.B‚RTNSWS1+IPCIM2(A4),D3‚PICKUPS/WCONFIGUREBYTE1ŠBTST„#XSWHDX,D3‹HALFDUPLEXŠBEQ.SƒBLDA050ŽBRANCHIFNO'ŠBSET„#IOAECHO,D1ŠYES,SETUPATTRIBUTE BLDA050ƒEQU…*ŠBTST„#XSWNUL,D3‹ACCEPTNULLSŠBEQ.SƒBLDA060ŽBRANCHIFNO'ŠBSET„#IOAPNUL,D1ŠYES,SETUPATTRIBUTE BLDA060ƒEQU…*#ŠBTST„#XSWTAHD,D3ŠACCEPTTYPEAHEADŠBEQ.SƒBLDA070ŽBRANCHIFNO'ŠBSET„#IOATAHD,D1ŠYES,SETUPATTRIBUTE BLDA070ƒEQU…* ŠBTST„#XSWXON,D3‹ACCEPTXON/XOFFŠBEQ.SƒBLDA080ŽBRANCHIFNO'ŠBSET„#IOAXCTL,D1ŠYES,SETUPATTRIBUTE BLDA080ƒEQU…*ŠRTSN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 11/07/84 <<<<<<ŠPAGEJ**************************************************************************** QEVNT**„PLACEMSGONUSER'SASQ* *ˆA4=COMPLETIONPACKETPOINTER*ˆA5=CCBADDRESS'*ˆD0=PACKETLENGTH(MINUSHEADERINFO)*ˆD1=EVENTTYPE*ˆD2=ID(4BYTES)*ˆD3=STATUSVALUE(2BYTES) *‡[D4=DEVICESTATUS(2BYTES)]*‡[D5=DEVICENUMBER(1BYTE)]*J***************************************************************************QEVNT:ŠMOVE.LD0,D6ŽSAVELENGTH-ŠMOVE.L#2,D7ŽOFFSETFORSTAGING(NOSVCVCT)'ŠMOVE.B#IOEVCD,1(A4)†CODE(NOSVCVCT)(ŠMOVE.LCCBSVVC(A5),2(A4)‚SERVICEVECTOR*ŠBEQ.S‚QEVNT10ŒBRANCHIFNOSERVICEVECTOR'ŠADD.L‚#4,D0ŽCORRECTLENGTHFORSVCVCT/ŠADD.L‚#4,D7ŽCORRECTOFFSETSTAGINGFORSVCVCT*ŠADD.L‚#$00800000,(A4)„CORRECTFORSVCVCT QEVNT10ƒEQU„*$ŠMOVE.BD1,0(A4,D7)ˆCMPL.EVENTTYPE)ŠMOVE.BCCBKEY(A5),1(A4,D7)USER'SIDKEY*ŠADD.L‚#4,D0ŽCOMPLETELENGTHOFRETURNMSG1ŠCMP.B‚CCBASQL(A5),D0…USER'SMAXASQENTRYLENGTH"ŠBLS.S‚QEVNT20ŒBRANCHIFLENGTHOK/ŠMOVE.BCCBASQL(A5),D0…USER'SLENGTHISSMALLER QEVNT20ƒEQU„*ŠMOVE.BD0,(A4)ŒCORRRECTLENGTH QEVNT40ƒEQU„*ŠMOVE.LD2,2(A4,D7)ˆSETUPID'ŠMOVE.WD3,6(A4,D7)ˆSETUPSTATUSVALUEŠCMP.B‚#6,D6Ž6BYTEINFO?ŠBEQ.S‚QEVNT50ŒBRANCHIFYES(ŠMOVE.WD4,8(A4,D7)ˆSETUPDEVICESTATUSŠCMP.B‚#8,D6Ž8BYTEINFO?ŠBEQ.S‚QEVNT50ŒBRANCHIFYES)ŠMOVE.BD5,10(A4,D7)‡SETUPDEVICENUMBER%ŠCLR.B‚11(A4,D7)ŠCLEARRESERVEDFIELD*@* NOW LET'S PUT THE COMPLETION INTO REGISTERS, INTERRUPT IOH FOR&*ƒEVENTCOMPLETION,SENDEVENTTOTASK** QEVNT50ƒEQU„*ŠMOVEM.L(A4),D2-D7 ŠBSR.S‚IPCQEVNTŠRTSŠPAGEK*****************************************************************************9* ROUTINE TO QUEUE EVENT (ALREADY STAGED IN REGISTERS) TO*ƒ-DRIVINGTASK. *ƒ-EVENTBEGINSINREGISTERD2.***ˆEXECROUTINE/*ˆREGISTERSUSED:D0-D1/A0,A3-A6‚WORKREGISTERS*˜D2-D7‹STAGINGREGISTERS**K**************************************************************************** IPCQEVNT:#ŠMOVEM.LA3-A5,-(A7)‡SAVEREGISTERS)ŠMOVE.LCCBRQSTA(A5),A0„CALLER'STCBADDRŠSPC„2<ŠMOVE.L#T0QEVNTI,D0‡WHENONEORMOREINTERRUPTSAREPENDING:ŠTST.B‚CCBINL(A5)‰USETHEQEVNTIENTRYPOINT.ELSEUSETHE ŠBNE.S‚IOHQ4ŽQUEVNTTENTRYPOINTŠMOVE.L#T0QEVNTT,D0 IOHQ4…TRAPƒ#0ŠSPC„2"ŠBRA.S‚IOHQ5ŽBRANCHIFQUEUEINGOK&ŠMOVEM.L(A7)+,A3-A5‡RESTOREREGISTERS7ŠMOVE.L(A7),CCBQVER1(A5)‚SAVECALLERSADDRESSFORDBUGŠBRA.S‚IOHQRTN IOHQ5…EQU„*&ŠMOVEM.L(A7)+,A3-A5‡RESTOREREGISTERS)ŠCLR.L‚CCBQVER1(A5)‡CLEARQERRORADDRESS IOHQRTNƒEQU„*ŠRTS‰PAGE***"* DISK ERROR CROSS-REFERENCE TABLE**ˆSTRUCTURE:-POSITION*“-IOCBERRORCODE*“-UPDATEFLAG*%*ˆUPDATEFLAG:‚BIT0-LENGTHOFXFER*–BIT1-PSNPROVIDED**DERXREF‚DC.B„0,1‘(0)NOERROR"‰DC.B„ISTACRC,2‹(1)DATACRCERROR)‰DC.B„ISTAWP,0Œ(2)DEVICEWRITEPROTECTED#‰DC.B„ISTANR,0Œ(3)DEVICENOTREADY*‰DC.B„ISTADDM,2‹(4)READDELETEDDATAMARK'‰DC.B„ISTAIE,0Œ(5)LOGICALUNTT#ERROR'‰DC.B„ISTAIE,0Œ(6)INVALIDDISKADDRESS!‰DC.B„ISTARES,0‹(7)RESTOREERROR$‰DC.B„ISTADME,2‹(8)RECORDNOTFOUND&‰DC.B„ISTAMRK,2‹(9)ADDRESSMARKERROR&‰DC.B„ISTADMA,0‹($A)DMACHANNELERROR#‰DC.B„ISTACSM,0‹($B)CHECKSUMERROR‰DC.B„ISTADB,0Œ($C)DEVICEBUSY!‰DC.B„ISTACHN,0‹($D)CHANNELBUSY!‰DC.B„ISTAIE,0Œ($E)INDETERMINATE%‰DC.B„ISTACNT,0‹($F)CONTROLLERERROR"‰DC.B„ISTAUNR,0‹($10)DEVICEERROR ‰DC.B„ISTASEK,0‹($11)SEEKERROR‰DC.B„ISTANR,0Œ($12)NODEVICE-‰DC.B„ISTACFG,0‹($13)DEVICECONNECTCONFLICT$‰DC.B„ISTACMP,2‹($14)DCOMPAREERROR,‰DC.B„ISTASPE,2‹($15)SECTORWRITEPROTECTED!‰DC.B„ISTABDS,2‹($16)BBADSECTOR‰DC.B„ISTATO,0Œ($17)TIMEOUT$‰DC.B„ISTAIE,0Œ($18)INVALIDCOMMAND#‰DC.B„ISTABUS,0‹($19)DMABUSERROR'‰DC.B„ISTAMAP,0‹($1A)DMAMAPPINGERROR*‰DC.B„ISTADMC,0‹($1B)DMACONTROLLERERROR)DERXL„EQU…(*-DERXREF)/2-1…MAXERRORVALUE‰PAGE***"* MCCM ERROR CROSS-REFERENCE TABLE**ˆSTRUCTURE:-POSITION*“-IOCBERRORCODE*“-UPDATEFLAG*%*ˆUPDATEFLAG:‚BIT0-LENGTHOFXFER**MERXREF‚DC.B„0,1‘(0)NOERROR ‰DC.B„ISTACSM,1‹(1)PARITYERROR‰DC.B„ISTABRK,1‹(2)BREAK#‰DC.B„ISTANR,0Œ(3)DEVICENOTREADY"‰DC.B„ISTACSM,1‹(4)FRAMMINGERROR'‰DC.B„ISTAIE,0Œ(5)LOGICALUNTT#ERROR"‰DC.B„ISTADO,1Œ(6)RECIEVEOVERRUN'‰DC.B„ISTANR,1Œ(7)PRINTEROUTOFPAPER‰DC.B„ISTAIE,0Œ(8)UNUSED‰DC.B„ISTAIE,0Œ(9)UNUSED&‰DC.B„ISTADMA,1‹($A)DMACHANNELERROR‰DC.B„ISTACSM,0‹($B)UNUSED‰DC.B„ISTAIE,0Œ($C)DEVICEBUSY‰DC.B„ISTAIE,0Œ($D)UNUSED!‰DC.B„ISTAIE,0Œ($E)INDETERMINATE)MERXL„EQU…(*-MERXREF)/2-1…MAXERRORVALUE ‰ENDééé 0 TTL GPIB DRIVER - COMMAND PROCESSING - MAINLINE PAGE;*************************************************************’GPIBCOMMANDPROCESSOR*8*ƒThefunctionofthecommandprocessoristocoordinate7*ƒandsetupallcommandsandactivityontheBUS.Upon9*ƒreceptionofacommand,theprocessorwillperformwhat8*ƒbasicvalidationsofparameterblocksandcommandtype7*ƒitcan.WithintheCCBforthischannelisacircular8*ƒqueueareawhichwillcontrolthedispatchofcommands7*ƒtotheBUS.Whenthecommandcanbeexecuted,further6*ƒcommandmodevalidationsaremadeatruntimeandif;*ƒsuccessful,controlwillbepassedtothemenuprocessor.*7*ƒEachcommandismadeupofagroupofsub-commandsor6*ƒmenuitemsandthesemenuitemswillbeexecutedone;*ƒatatimeuntilthecommandmenuiscompletelyprocessed.5*ƒAfterthefirstmenuitemisinitiated,therestof:*ƒthemenuflowwillbehandledbytheinterruptprocessor*ƒportionoftheGPIBdriver.**‰ENTRY:JSRFROMCMRHANDLER=*A2-PhsicalAddressofInitiateI/OParameterBlock(IIPB)9*A5-PhsicalAddressoftheCCBoftherequesteddevice1*A6-PhsicalAddressoftheattachedtask'sTCB*?*‰EXIT:RTS-CommandvalidationreturncodeinD0(always=0)*K****************************************************************************/*ƒPerformsomeofthebasicchecksoftheIOSPB* CMNDGPIB: MOVEQ #0,D5:MOVE.LXIOCPK(A2),D6‡setupaddrofcommandpacket(IOCB)5MOVE.WXIOPLN(A2),D5†setuplengthofcommandpacket3MOVE.LCCBTASKA(A5),A1„setupcaller'sTCBaddress3BSRIOADRCHKŽconvertlogicaltophysicaladdressesBEQ.SCMNDG010Œgoodreturn*5MOVEQ‚#ISTAIP,D1‰setinvalidparmblockerrortoIOSBRACMNDEX1exitprocessor*"CMNDG010MOVE.LD6,A3†A3<==IOSPB MOVE.LXIOUID(A2),A4†A4<==DCB3 BTSTW #GPIBDOWN,BUSACTIV(A5) is this channel down?BEQ.SCMNDG015Žbr=no=MOVEQ#ISTACDN,D1‹returnerror=unrecoverablechannelerror BRA CMNDEXIT*h4q:y<A‰;‘;>CMNDG015CMP.W#IOHALT,IOSFCT(A3)‚isthisanI/OHALTcommand?BEQHALTIObranchifyes**‚Golookup(validate)command*?BSRGETCMDPŽD2=RelativeindexofGPIBfunctionfromIOSCMDTB:BNE.SCMNDEXIT‹br=commandnotfound,returnerrorinD1*8*‚ValidateanybufferaddressesifthiscommandrequiresJ*‚databuffers(D6=Sec./Config.bufferaddr.or0,&D7=Primarybuffer*‚addressor0)*;BSRVALIDATEvalidateanybufferaddresses&commandinfo.@BNE.SCMNDEXIT‹br=errorduringvalidation,returnerrorinD1*A*‚Thecommandisvalidated,performfinalchecksandeitherqueue*ˆorexecutethecommand.* INHIB MOVEQ #0,D3'MOVE.BDCBCDV(A4),D3Œgetdevicenumber>MOVE.WDEVQBSY(A5),D0ŠD0<==currentbitmapofbusydev#'s.BTSTD3,D0”isdevicebusy?6BNE.SCMNDG120’branch=yes,returndevicebusyerror*9*‚ChecktoseeifthereisanyI/OinprogressontheBUS*'MOVE.LQHEAD(A5),D1Šisthequeuebusy? CMP.L QTAIL(A5),D1BEQ.SCMNDG100branchifno*=*‚TheGPIBisbusysoqueuethiscommandforfutureexecution*!BSRPSHGPIBQ‘pushentryonqueue>BEQ.SCMNDG120ERROR,queueisfull,returndevicebusyerror4MOVE.WDEVQBSY(A5),D0‡markthedeviceasbeingbusy BSET D3,D0.MOVE.WD0,DEVQBSY(A5)‡restorebusymaptoCCBBRA.SCMNDOK‘exit*A*‚SincethequeueisnotbusythecommandmaybeexecutedatthisG*‚timesovalidatethatthebusisinthepropermodeforthiscommand.*MCMNDG100MOVEM.LD3-D7,-(A7)ƒSaveprimaryandsecondarybufaddr'sandlength1BSRVALOPER‹checkmodeandoperationalabilities/MOVEM.L(A7)+,D3-D7‚restoreaddr'sandlengthsTST.BD1anyerrors?BNE.SCMNDEXIT†branchiferror*/BSRPSHGPIBQ’pushcurrentcommandonthequeue!BEQ.SCMNDG 120error,queuefull%BSRBUILDMENU‘buildmenuforcommandBEQ.SCMNDG110BR‚=continue*&BSRPOPGPIBQ“elseremovequeueentry,5MOVEQ#ISTADRVE,D1Œsetdriverrun-timeerrorstatus,#BRA.SCMNDEXITandexitwitherror*=CMNDG110MOVE.WDEVQBSY(A5),D0Šgetbusydevicenumberbitmap"BSETD3,D0”setdevicenumberbusy%MOVE.WD0,DEVQBSY(A5)‰updatebitmap*B*‚StartexecutionofthecurrentcommandsincetheBUSisnotbusy*9MOVE.LCCBCHB(A5),A1‰setbaseaddressofGPIBCregisters"BSRPROCMENU‘initiateI/OonmenuBRA.SCMNDOKjustexit*4CMNDG120MOVEQ#ISTADB,D1…setdevicebusyerrorcode*CCMNDEXIT MOVE.B D1,IOSSTA(A3) save error code in IOSPB status field2CMNDEX1‚MOVE.B#XPSNRM,D4„seteventtypetonormal"BSRQEVENT“queuetheeventtoIOS*=*‚Usethisentrypointwhennoeventistobesent.Theevent*‚willbesentatalatertime.*(CMNDOKUNMASK‚setinterruptmasktozeroMOVEQ#0,D0ƒsetreturnO.K. RTS  PAGE**’HALTI/OTOADEVICE*?*ˆTheHaltI/OprocessorwillhaltI/Otothespecifieddevice.&*ˆThereareseveralcasestoconsider:3*’1.AhaltdirectedtotheBUSwhileacontroller,8*’2.AhaltdirectedtotheBUSwhileaTalker/Listener,!*’3.Ahaltdirectedtoadevice.*?*ˆInthefirstcase,anyoperationinprogress,allqueuedI/O,5*ˆandanySRQpollinginprogresswillbeterminated!*;*ˆInthesecondcase,thehaltis(implied)directedtothe@*ˆcurrentI/Oinprogress.‚Thatoperationwillbeabortedimmed- *ˆiately.*<*ˆInthethirdcase,thequeueissearchedforthespecified;*ˆI/Ocommand.‚Iffound,thecommandismarked'halted'and:*ˆwillberemovedfromthequeuewhenitsturncomes,else#*ˆanerrorwillbereturnedtoIOS.**HALTIO:1INHIB—don'tallowthisprocesstobeinterrupted+MOVE.BDCBCDV(A4),D0ˆgetthedevicenumber)BNE.SHALT50br=haltabussabledevice*BEQ.SHALT50br=no,treathalttoBUSinT/Lmodeasdevice*:*ˆHaltcommandistotheBUSanditisinControllermode.9*ˆTerminateanySRQpolling,currentI/O,andqueuedI/O.* BSR HLTALL'BNE.SHALT40br=invalidhaltcommand*.HALT30MOVE.W#XSTVABT,D1„setO.K.haltstatus*&HALT35MOVEQ#XPSHLT,D4†seteventtype4BSRQEVENT’sendhaltcommandacknowledgementtoIOS BRA CMNDOK*7HALT40MOVE.W#$FFFF,D1†setinvalidhaltcommandstatus BRA.S HALT35*6*ˆHaltI/OtoaspecificdeviceortheBUSinT/Lmode*=HALT50BSRHLTCMDŒhaltcurrentcommandonqueue(ifpossible)BNE.SHALT40br=error BRA.S HALT30 2‰TTLGPIBDRIVER-COMMANDPROCESSING(VALIDATION)‰PAGEB********************************************************************–VALIDATEGPIBCOMMAND*<*ˆThissectionwillvalidatetherequiredbufferaddressand4*ˆcommandparameters.Iftheaddressesarevalidthe<*ˆlogicaladdresseswillbeconvertedtophysicaladdresses.*)*“ENTER:ƒD2.W-relativeindexofCommand*œA1-TCBaddress*œA2-IIPBpointer*œA3-IOSparamterblock*œA4-addressofDCB*œA6-addressofTCB**“EXIT:„IFƒD1=0ƒTHEN *¦Commandhasbeenvalidatedand*¡D4=primarybufferlength*¡D5=secondarybufferlength-*¡D6=physicalsecondary/config.bufferaddr&*¡D7=physicalprimarybufferaddress*¦or)*¡D4=primarybufferlengthnotrequired+*¡D5=secondarybufferlengthnotrequired,*¡D6=0ifsec./config.buffernotrequired'*¡D7=0ifprimarybuffernotrequired*œELSED1=errorcode*!*ŽRegisterUsage:„01234567*žD‚*RPƒRRRR *žA‚**ƒPPƒP*E********************************************************************** VALIDATE:BLEA.LVALPARTB(PC),A0ƒgetbaseaddrofvalidationparametertable@MOVE.W0(A0,D2.W),D0„getvalidationparametersforthiscommand MOVEQ #0,D63MOVE.LD6,D7Œclearbufferaddressreturnregisters)MOVE.LD6,D4‹clearbufferlengthprimary+MOVE.LD6,D5‹clearbufferlengthseco ndary4MOVEQ#ISTAADD,D1ˆpresetinvalidaddresserrorcode5BTST.L#BVALPBUF,D0…validateprimarybufferaddress?BEQ.SVALID010‰branchifno*#*ƒValidatePrimarybufferaddresses*.MOVE.LIOSSAD(A3),D6…getbufferstartaddress,MOVE.LIOSEAD(A3),D5„getbufferendaddress+SUB.LD6,D5isendaddressVALID020BTST#BVALCBUF,D0‚validateconfigurationbufferaddr?BEQ.SVALID030branchifno*'*‚Validateconfigurationbufferaddress*;MOVE.LIOSDBP(A3),D6ˆgetlogicalconfigurationbufferaddr MOVEQ #0,D5FMOVE.WIOSVARL+DCBDEV(A4),D5„includelengthofvariablearea(ifany)4ADD.L#IOSILN,D5Œaddinrestofconfigurationblock*3*‚Convertconfigurationlogicaladdresstophysical*9BSR.SIOADRCHKconvertaddr,D6=Config.bufferaddressBNE.SVALIDRTbranchiferror**ƒBuffervalidationcomplete**ˆValidateCommandRequirements* VALID030::BTST#BVALBDEV,D0commandvalidonlyforbussabledevice?,BEQ.SVALID125br=no,continuevalidation< CMP.B #XDSGDEV,IOSDTP+DCBDEV(A4) is this a bussable device?BEQ.SVALID125br=O.K.!?MOVEQ‚#ISTAIVCB,D1‹elsesetinvalidcommandforBUSerrorcode BRA.S VALIDRT*IVALID125BTST#BVALSCTL,D0‚doescommandrequiresystemcontrollercapab.?BEQ.SVALID130branchifno?MOVEQ‚#ISTAIVCB,D1ˆpre-loadinvalidcommandforBUSerrorcode9LEA.LCONFINFO(A5),A0†getpointertodeviceconfig.area7MOVE.LCNFIGPTR(A0),A0…getpointertoBUSconfig.areaJBTSTW#IOASCTC,IOSATW(A0)‚isBUSconfiguredforsystemcontrollercapab.?;BEQ.SVALIDRTŽbranch=no,error=invalidcommandforBUS*9VALID130BTST#BVALBUS,D0ƒcommandvalidonlyfortheBUS?BEQ.SVALID175branchifno@ CMP.B #XDSGBUS,IOSDTP+DCBDEV(A4) yes, check if this is the BUS!BEQ.SVALID175br=o.k MOVEQ #ISTAIVBD,D1?BRA.SVALIDRTŽelseexitforinvalidcommandtobussabledevice*0VALID175MOVEQ‚#ISTAOK,D1ƒsetreturncode=O.K.*'VALIDRTTST.BD1setreturnstatuscode RTS  PAGE* *ƒIOADRCHK*:*ˆThissubroutinewillchecktheaddressboundariestosee1*…ifentirelywithincallingtasksaddressspace.*&*ˆENTER:‚D5=numberofbytestocheck%*D6=68000bufferaddress(logical)*A1=TCBaddress*8*ˆEXIT:ƒD6=physicaladdressofbufferspace(iflegal)*D1=0ƒnoerror *•ElseƒError**ˆRMS68KROUTINES:TR0$.LOGPHY*!*‹RegisterUsage:ƒ01234567*›DPRPPPPRP*›APPPPPPPP* IOADRCHK:< MOVEM.L A0-A6/D0/D2-D5/D7,-(A7) save all regs for EXEC call'BTST#0,D6‘isbufferonwordboundary?#BNE.SIOHADR6Žbranchonno(error)TST.LD5“islengthzero?$BEQ.SIOHADR6Žbranchifyes(error)*:MOVE.LTCBTST(A1),A0‡A0<==addressoftasksegmenttable TR0$.LOGPHY,Žcallexec‚routine!BRA.SIOHADR8Žgoodbufferreturn7NOP˜blockpartiallyintaskspace(notvalidforGPIB)EIOHADR6MOVEQ‚#ISTAADD,D1‚blockisinMMIOspace(notvalidforGPIB) BRA.S IOHADR9*&IOHADR8MOVEQ#ISTAOK,D1…setreturnOK'IOHADR9 MOVEM.L (A7)+,A0-A6/D0/D2-D5/D7 RTS      é=/*=/*†M300DRV.AF=/*.=/* Chain file to assemble the IEEE-488 driver=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to M300DRV.LS=/*=/IFC \1ƒ=ARGM300DRV.LS=/ENDIF=/*&=ASM M300DRV.SA,M300DRV.RO,\1;-WRZ=160=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.CCB.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.DUALPORT.MC=/*ƒ9995.&.LV5.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.M300DRV.EQ=/*ƒM300TABL.AI=/*ƒM300INIT.AI=/*ƒM300INTR.AI=/*ƒM300CMND.AI=/*}=/*=ENDééééé™&M300DRIDNT4,1ŠMVME-300(GPIB)DRIVER TTL M300DRV (GPIB) DRIVERD*********************************************************************&*’GENERALPURPOSEINTERFACEBUSDRIVER*D********************************************************************'*…5/31/84†BWNŽFivebugsfoundandfixed(*£1)TypoerrorincodeatSP_TO.Caused'*¦systemtocrashwhileserialpolling.&*¦ChangeinstructionMOVEMA3-A3,-(A7)*¦toMOVEM.LA3-A5,-(A7).(*£2)IOSPBandDCBpointersnotsetupat *¦PROCM100afterSerialPolling.(*¦Movedinstructionscontainingpointers*¦uptwoinstructions.(*£3)ThefifthinstructionofHLTCMDwas'*¦changedtoreadLEA.LGPIBQEND(A5),A0(*£4)Problem:crashingGPIBdriverwhile!*¦waitingforaDMAreadtostart(*¦Diagnosis:AnSRQinterruptwasoccur-(*¦ingwhiletheMVME300wasinDMAmode.'*¦TheTMS9914Ainterruptregsweretri-&*¦statedatthispointandthuscannot *¦beread.'*¦Solution:TodisableTMS9914aintrpts%*¦priortoanyDMAandre-enablewhen%*¦DMAwascomplete.‚Alsotore-enable"*¦ifHaltIOorBusErroroccurred.*)*£5)FixedlengthbuffertransfersofDMA&*¦readwerenotbeingproperlysetup.&*¦TheIOSbufferlengthwasbeingused&*¦insteadofthesysgenedfixedbuffer!*¦length.Alabelandbranchwere*¦modifiedinREADDATA.*#*ˆ5/31/84ƒBWNŽVME/10problemfixed:'*¦ThedriverdidnotworkonthwVME/10&*¦becausetheoff-boardRAMisseenat"*¦differentaddressesbythe68010*¦andtheGPIBdevice.&*¦Twomacroswerecreatedtoc orrectly*¦translateaddresses.)*¦NearlabelINTR115plus7instructions:**¦MOVE.B‚MARLSB(A1),D0*¦MOVE.L‚MENUCPOS(A5),A0* *¦changedto:**¦MOVE.B‚MARLSB(A1),D0*¦GET_ON_BD‚D0*¦MOVE.L‚MENUCPOS(A5),A0*)*¦Nearlabel‚SETUPDMAplus5instructions**¦MOVE.L„A0,D0*¦MOVE.B„D0,MARLSB(A1)* *¦changedto:**¦MOVE.L„A0,D0*¦GO_OFF_BD‚D0*¦MOVE.B„D0,MARLSB(A1)*(*œTheGET_ON_BDandGO_OFF_BDƒmacrosare*œdefinedin9995..DUALPORT.MC.¢D«J³-*œThesemacrosrequiresubstitutionsbasedon*œthetargetsystem.2*œThisisdoneatSYSgentime,withequatesinthe**œSYSCMD.CDfileandDEFstatementsinthe*œM300DRV.LGfile.*9*ˆ10/16/84ŒSerialPollprocessingaltered.‚Duetodevices1*œthathavethecapabilitytotoggletheSRQline**œSRQ'swerebeingmissedifthefollowing1*œcircumstanceoccurred.AdevicetoggledtheSRQ/*œline,westartedtopoll,anotherdevice(one0*œalreadypolled)generatedTRUESRQ,wereached0*œendofSRQpollinglist(oncearoundtheBUS)..*œToremedythisproblem,codewasinsertedat/*œPROCMSRQto'loop'theBUStwicetocatchany *œTRUESRQ's.*8*ˆ10/16/84ŒRemovependingSRQ'satpower-on/bootuptime.* SECTION 0 OPT BRL M300DRV:>DC.LINTRGPIB-M300DRV‡selfrelativeinterruptserviceaddress*ƒwasreserved.Soonlytheupperbyteissignificant,andthe*ƒnextbytewillbe0.*5DC.B0,0…next14bytesreservedforlaterusebyCMR DC.L 0,0,0*5DC.B'102284'‚dateoflastassemblyinMMDDYYformat*DC.B''ƒreservedforpatches*4DC.B'4'‚minimummajorVERSAdosrevisionlevelthat*¦driveriscompatiblewith.**‚INCLUDEFILES(FORNOW)ARE:**ˆNOLIST*ˆ9995.&.STR.SA*ˆ9995.&.CCB.EQ*ˆ9995.&.TCB.EQ*ˆ9995.&.LV5.EQ*ˆ9995.&.IOE.EQ*ˆ9995.&.NIO.EQ*ˆ9995.&.DUALPORT.MC*ˆLIST*ˆ9995.&.M300DRV.EQ *ˆM300TABL.AI *ˆM300INIT.AI *ˆM300INTR.AI *ˆM300CMND.AI* NOLISTINCLUDEˆ9995.&.STR.EQINCLUDEˆ9995.&.CCB.EQINCLUDEˆ9995.&.TCB.EQINCLUDEˆ9995.&.DUALPORT.MC LIST TTL GPIB DRIVER - (LV5)INCLUDEˆ9995.&.LV5.EQ LIST TTL GPIB DRIVER - (IOE)INCLUDEˆ9995.&.IOE.EQ LIST TTL GPIB DRIVER - (NIO)INCLUDEˆ9995.&.NIO.EQ LISTINCLUDEˆ9995.&.M300DRV.EQINCLUDEˆM300TABL.AIINCLUDEˆM300INIT.AIINCLUDEˆM300INTR.AIINCLUDEˆM300CMND.AI**‚GPIBPATCHAREA* DS.B 256 END ééé ééé! TTL GPIB DRIVER - INITIALIZATION PAGE**„GPIBInitialization*7*ˆTheinitializationprocessorwillperformthreemajor7*ˆfunctions:(1)initializetheMVME300card,(2)reset9*ˆtheTMS9914Achipand(3)resetallsoftwareparameters5*ˆassociatedwiththischannel.Additionally,ashort=*ˆfunctionalitygo/nogotestwillbeperformedtodetermined%*ˆifthechannelisproperlyworking.*"*’ENTER:A5=CCBpointerforGPIB* INITGPIB:2INHIB‰setprocessorpriority(inhibitinterrupts)*CMP.B#XTGBUS,CCBTYPE(A5)ƒvalidGPIBCCB?BNE.SINITG010‚no* caused the interrupt. Also, the hardware configured priority(* level for each level will be the same.*3MOVE.BCCBVECT(A5),D1‡getconfiguredvectornumber.MOVE.BD1,VECTREG0(A1)†TMS9914Avectornumber2MOVE.BD1,VECTREG1(A1)†I/Ocompletevectornumber/MOVE.BD1,VECTREG2(A1)†Buserrorvectornumber MOVE.BD1,VECTREG3(A1)†Notused*?*‚Setuptheconfiguredhardwareprioritylevelandenablethem*>MOVE.BCCBPPRIO(A5),D1†getconfiguredhardwareprioritylevel AND.B#7,D1‘maskprioritylevelOR.B#$18,D1enableinterrupt/MOVE.BD1,CONTREG0(A1)†TMS9914Aprioritylevel3MOVE.BD1,CONTREG1(A1)†I/Ocompleteprioritylevel0MOVE.BD1,CONTREG2(A1)†Buserrorprioritylevel*)*ƒDisablevector3becauseitisnotused *AND.B#$0F,D1clearenablebit/MOVE.BD1,CONTREG3(A1)†disablenotusedvector**„intheGPIBCFIFO.Itismeanttobeusedatinitialization,9*„HALTI/Osequences,oranytimethereisundesireddata*„leftintheFIFO.*-*‡ENTER:A1=BASEADDRESSOFGPIBCREGISTERS*!*‡EXIT:ƒD1=0ƒTHENFIFOISEMPTY*‘ELSED1=ERRORCODE* *ˆRegisterUsage†01234567*™D‚*R*™A*MTFIFO:+MOVE.W#MAXFIFO+1,D1‚D1<==maxloopcount*6MTFIFO10 BTST.B #FIEMP,CNTRSTAT(A1) is the FIFO empty?"BNE.SMTFIFO20ƒyes,taskcomplete?MOVE.BFIFODAT(A1),D0‚readabytefromtheFIFOandthrowaway+DBRAD1,MTFIFO10‚continueuntilFIFOempty‚theboardisfunctional*œElseƒFIFObuffererror.**!*’RegisterUsage:…01234567*£D‚***£A*H************************************************************************ BDGONOGO:$MOVEQ#0,D0‘initializecounter/data*7BDG010 MOVE.B D0,FIFODAT(A1) store next pattern in FIFO$ADD.W‚#1,D0incrementpattern/count.CMP.W#MAXFIFO+1,D0‰Maxim umFIFOsizereached0BEQ.SBDRTN1Yes,FIFOisnotgoingfull,Error1BTST.B#FIFUL,CNTRSTAT(A1)‚istheFIFOfullyet?$BEQ.SBDG010no,continueuntilfull*;*‚Atthispoint,theFIFOisfullandthesizeiscontained8*‚inD0.W.‚EmptytheFIFOandcheckthecontentsagainst*‚thedatathatwasinput.*4MOVE.WD0,FIFOSIZ(A5)‡savetheFIFOsizeintheCCBMOVEQ#0,D0‘resetpatternreg*4BDG020‚MOVE.BFIFODAT(A1),D1ƒgetnextcharfromFIFOCMP.B‚D0,D1“sameasinputwas?BNE.SBDRTN1“branchiferrorADD.W#1,D0”incrementpattern.BTST.B#FIEMP,CNTRSTAT(A1)…istheFIFOempty?(BEQ.SBDG020“branchuntilFIFOisempty+MOVEQ#ISTAOK,D1indicateeverythingisOK RTS*$BDRTN1MOVEQ#ISTAHWMF,D1‡FIFOerror RTSœexit   é. TTL GPIB DRIVER - INTERRUPT PROCESSING (MAIN) PAGEG*************************************************************************ƒGPIBINTERRUPTPROCESSOR*<*†Thefollowinginterruptcodeisre-entrantandisdesigned<*†tohandleallinterruptsthatmayoccuronaGPIBchannel.*:*†TodetectallGPIBinterrupts,theMVME300cardusesthe;*†VERSAbusInterruptorModule(VBIM)chiplocatedonboard.B*†TheVBIMiscapableofhandlinguptofoursourcesofinterrupts.<*†Currentlyonlythreesourcesofinterruptsareenabledand;*†theyare:BusErrorInterrupt,I/OCompleteInterruptandB*†TMS9914AInterrupt.Sinceeachchannelcanonlyhaveonevector,;*†thesethreesourcesgeneratethesamevectoranditisup8*†totheinterruptprocessortodeterminethereasonfor*†interruptfromtheVBIM.*9*†NOTE:‚UponentryCMRhassavedregistersA0,A1,andD0.*$*ˆENTER:A5=addressofCCBpointer* INTRGPIB:+MOVE.LCCBCHB(A5),A1‚getptrtoGPIBCregs1MOVEP.LCONTREG0(A1),D0…readallvectorstatus's>AND.L#1<MOVE.LQTAIL(A5),A0„getcurrentqueuepointer(evenifempty)(CMPA.LQHEAD(A5),A0„isthequeueempty?BNE.S‚INTROK3‰br=no.LEA.L‚CONFINFO(A5),A4ƒyes,thequeueisempty,MOVE.LDVDCBPTR(A4),A4ƒsosetA4<=BUSDCB'SUB.L‚A3,A3setupdummyIOSPBaddress BRA.S INTROK4*4INTROK3MOVE.LDCBQOFST(A0),A4ƒA4<==addressofDCB7MOVE.LIPBQOFST(A0),A3ƒA3<==addressofcurrentIOSPB*.*ˆGiveDMAcompleteinterrupthighestpriority*DINTROK4BTST.L#IOCINT,D0‚didanI/O complete(DMA)interruptoccur?BEQ.SINTR100‚yes*, BTST #TMSINT,D0 was it a TMS9914 interrupt? BEQ INTR500 br = yes*'*ˆElseitmustbeaBUSERRORinterrupt*E********************************************************************** *ƒBUSERROR*:*ˆTheBuserrorinterruptisgeneratedbytheMVME300cardB*ˆwheneveraDMAbuserrorconditionoccursduringatransmission.8*ˆIftherewasnoI/Oinprogress,theinterruptwillbe>*ˆconsideredspuriousandwillgenerateanunsolicitedchannel?*ˆinterrupttoIOS.‚IfI/Owasinprogress,thecurrentcommand=*ˆwillbeabortedandahardwaremalfunctionerroreventsent *ˆtoIOS.*6BSET.B#VBIMENAB,CONTREG2(A1)‚enableBuserrorvector(MOVE.LQTAIL(A5),A0‚isI/Oinprogress? CMPA.L QHEAD(A5),A0BEQINTREXIT‰branchifno*@*ƒIfanSRQwasinprogress,abortallSRQprocessingandsenda$*ƒHardwareMalfunctionerrortoIOS.*B*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *ˆ4/24/84ƒbwn*9*ˆMustinhibitTMS9914A‚interrupts‚duringDMAoperations.*ˆMustre-enablehere.*4BSET.B#VBIMENAB,CONTREG0(A1)‚re-enable9914intrps*?*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>. MOVEQ #ISTABUS,D1 indicate hardware bus errorBSRPROCMERR‚processerrorBRAINTREXIT‚normalexit6 TTL GPIB DRIVER - INTERRUPT PROCESSING (DMA COMPLETE) PAGEG*************************************************************************ƒI/OCOMPLETE*:*ˆThisinterruptisgeneratedbytheMVME300cardwhenever>*ˆaDMAWRITEorDMAREADhascompleted.Threemajorfunctions<*ˆareaccomplishedinthissectionandtheyare:(1)I/Opost6*ˆformatting(ifspecified)afteraDMAWRITE/READhas;*ˆcompleted,(2)menuprocessingandinitiationand(3)SRQ *ˆprocessing.*8*ˆForpostI/Oformatting,theusermayspecifyaformatD*ˆroutinestobeexecuteduponcompletingthedesiredDMAoperation.<*ˆTheseroutinesmustbespecifiedatsysgentimeandshould*ˆreporterrors.*<*ˆThemenuprocessingsectionisdesignedtoeitherinitiate;*ˆthenextmenuitemor,ifatendofmenu,toqueueanI/O:*ˆcompletioneventbacktoIOSandinitiateannewmenuif7*ˆthereareotheroperationswaitingontheGPIBqueue.*;*ˆThelastmajorsectionoftheI/Ocompleteportionofthe8*ˆinterrupthandleristohandleprogramflowofservice;*ˆrequestfunctions(SRQ)whenreceivedincontrollermode.?*ˆTheprocessorwillrunstatusmenuestoeachdeviceconnected;*ˆtotheGPIBuntilthedevicerequestingserviceisfound.;*ˆOncefound,anSRQASQeventwillbesentbacktoIOSfor*ˆexamination.*INTR100:5 MOVE.B #1<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/MOVE.LQTAIL(A5),A0‚currentmenuqueuepointer)CMPA.LQHEAD(A5),A0‚isI/Oinprogress?BEQINTREXIT‰br=no*5BTSTW#CAC_S,BUSACTIV(A5)ƒareweincontrollermode?BEQ.SINTR115br=no*4BTST#LADS_B,ADDRSTAT(A1)ƒis9914inlistenermode?BEQ.SINTR110br=no7MOVE.B#TCS,AUXCMD(A1)†sotakecontrol(synchronously)2MOVE.BDATAIO(A1),D0ˆreadregtogetthingsgoing BRA.S INTR115**ƒAlldataDMAsequencesrequirethelengthofthetransfertoD*ƒbereportedbackintheIOSparameterblockoriginatingthiscall.**>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**<*‚ChecktoseeifthiswastheINorOUTprocessor.Ifitis8*‚calculatethelengthofthelasttransferbasedonthe=*‚contentsoftheGPIBCmemoryaddressregister(MAR)andtheC*‚typeofI/Ooperationperformed,elsenolengthcalcs.arereq'd.*?MOVE.LMENUCPOS(A5),A0‚getaddressofmenuitemjustcompleted1CMPI.B#OUT,(A0)„wastheOUTprocessorexecuted?BEQ.SINTR150…br=yes*/CMPI.B#IN,(A0)„wastheINprocessorexecuted?1BNE.SINTR200„br=TERMorSEOIprocessfinished*I* Check for the one command that uses the secondary buffer instead of the* primary buffer for data xfer.*GINTR130CMPI.W#IOOWIN,IOSFCT(A3)ƒisthisanoutoutwithinputcommand?BNE.SINTR150ƒbr=noGSUB.LD6,D0‚D0=currentM.A.R.minus(secondary)bufferstartaddress BRA.S INTR160*LINTR150 SUB.L D7,D0 D0 = current M.A.R. minus (primary) buffer start address*;INTR160 MOVE.L D0,IOSLEN(A3) store I/O xfer length in IOSPB*C*ƒChecktoseeifthereisaspecialpostformatterstobeexecuted*CMOVE.LIOSFMTA+DCBDEV(A4),D1‚getpointertouserdefinedformatter1 BEQ.S INTR200 br = no user defined I/O formatter*B*‚ChecktoseewhetherinputoroutputmenuprocessorwasexecutedA*‚andthenseeifthereisauserdefinedpostprocessorforthis *‚device.*@MOVE.W#PST_OFMT,D0ƒD0<==preloadpostoutputformatteroffset5CMPI.B#OUT,(A0)…arewedoing"OUT"menuprocessing?BEQ.SINTR180„branchifyes7MOVE.W#PST_IFMT,D0ƒD0<==postinputformatteroffset*:INTR180MOVE.LD1,A0†A0<==baseaddressofallformatters8TST.L0(A0,D0.W)ƒdiduserdefineapostdataformatter?BEQ.SINTR200ƒbranch=no*+MOVEM.LD1-D7/A0-A6,-(A7)‚saveenvironment.JSR0(A0,D0.W)‚executeuserdefinedformatter MOVEM.L (A7)+,D1-D7/A0-A6,TST.BD0ƒcheckerrorcodefromuserroutine!BEQ.SINTR200‚branchifnoerror*B*‚Anerrorhasbeendetectedintheuser'sinputformatterroutine*-MOVEQ‚#ISTAINFE,D1‚setinputformattererrorBSRPROCMERR‚processerror+ BRA.S INTR250 exit DMA interrupt processor*INTR200:'BSRPROCMENU„processnextmenuitem(s)*INTR250:6 MOVE.W (A7)+,D5 retrieve previous TMS9914 status regs(TST.WD5ˆwasthereapendinginterrupt? BEQ INTREXIT br = no BRA.SINTR510‚elsegohandleit  ; TTL GPIB DRIVER - INTERRUPT PROCESSING (TMS9914 INTERRUPT) PAGEE***********************************************************************ƒTMS9914AINTERRUPTSECTION*<*„Enteringthissectionoftheinterruptprocessorindicates8*„thatoneormoreinterruptconditionsenabledhasbeen;*„received.Readingtheinterruptmaskregsiters(INTR0and9*„INTR1)oftheTMS9914Awillindicatewhichcondition(s) *„occurred.*;*„TheGPIBcanbeinoneandonlyoneofthefourfollowing<*„states:(1)controllermode,(2)talkermode,(3)listener%*„mode,or(4)idlemode.‚Thesemodes@*„arestoredin'BUSACTIV'andmaychangedependingon  whattype=*„ofinterruptoccurred.‚Also,differentactionsmaybetaken?*„dependingonthecurrentstateoftheBUS.‚Allinterruptbits8*„willbecheckedeachtimeaTMS9914Ainterruptoccurs.* INTR500:5MOVEP.WINTR0(A1),D5ƒreadinterruptstatusregisters6AND.W‚TMSMASK(A5),D5ƒD5=validinterruptstatusbitsINTR510:B BSET.B #VBIMENAB,CONTREG0(A1) reset interrupt enable for TMS9914A***0***†MyAddressChange(MAC)checkandprocessing***$BTST#MACBIT,D5†istheMACbitset?BEQ.SINTR600ƒbr=no*I AND.W #$FFFF-(1< BTSTW #SRQPROG,BUSACTIV(A5) USER I/O or SRQ polling sequence?(BNE.SINTR605br=SRQpollingsequenceJ MOVE.B SRQBYTE(A5),IOSSAD-1(A3) else move serial poll byte to user's IOPB-INTR605BSRPROCMENU‰continueprocessingmenu BRA INTR700*+*ˆCheckifwehaveanyTaskI/Oreadytogo*8INTR610MOVE.L#READPEND,D3‚setupforI/Opendingcheck0BSRCHECKIOPgolookfortasklevelI/Opending***0***„ByteOut(BO)interruptcheckandprocessing***)INTR700BTST#BOBIT,D5„istheBObitset? BEQ.S INTR800*9BTSTW#CAC_S,BUSACTIV(A5)ƒistheBUSincontrollermode?BEQ.SINTR750br=no*5*‚Acommandstringmightbeinprogress.‚Sendoutthe"*‚nextcommandbytewithATNtrue.*/TST.LCMDCOUNT(A5)‰falseorlastBOinterrupt?(BEQ.SINTR800Žbranchifyes(ignoreit)*5SUB.L#1,CMDCOUNT(A5)†decrementcommandstringcount5BEQ.SINTR730Žbranchiffinishedwithcommandstring4MOVE.LCMDBFPTR(A5),A0…getptrtonextcommandbyte&MOVE.B(A0)+,D1Œgetnextcommandbyte5MOVE.LA0,CMDBFPTR(A5)…updatecommandbufferpointer%BSRCOMCMD‘outputcommandontheBUSBRA.SINTR800Žcontinue*@*ƒCommandprocessingiscompletefornow.Continuewiththenext=*ƒmenuitemafterthecommandoutmenuitemprocessorforthe*ƒcurrentcommand.*1INTR730BSRPROCMENUˆcontinuewithnextmenuitemBRA.SINTR800Žcontinue*!* We are not the active cntroller*8INTR750MOVE.L#WRITPEND,D3‚setupforpendingI/Ocheck.BSRCHECKIOPcheckforpendingtasklevelI/O***8***†ServiceRequest(SRQ)interruptcheckandprocessing***BINTR800BTST#SRQBIT,D5ƒisadeviceonourBUSrequestingservice?BEQ.SINTR900„br=no*: BSETW #SRQWAIT,BUSACTIV(A5) indicate SRQ intrp processing3MOVE.LQHEAD(A5),D1‡yes,getcurrentqueuepointer'CMP.LQTAIL(A5),D1ˆisthequeueempty?(BNE.SINTR900Žbranchifno,busisbusy*A*‚SincetheGPIBisidle,initiatetheservicerequestprocessing2*‚todeterminewhichdeviceisrequestingservice.*9*ˆFirstbuildadummyqueueentryforstandardprocessing** MOVEM.L A3-A4/D4-D7,-(A7) save intrp regs SUB.L A3,A3 dummy IOSPB address LEA.L CONFINFO(A5),A4L MOVE.L DVDCBPTR(A4),A4 A4 <= to BUS DCB (serial polling is a BUS operation)* LEA.L SRQBYTE(A5),A0 input buffer p! ointer,MOVEQ#1,D4‚Statusbyteresponselength=1/ MOVE.L A3,D5 dummy length for secondary buffer2 MOVE.L A0,D6 dummy primary buffer address pointer4 MOVE.L A3,D7 dummy secondary buffer address pointer' BSR PSHGPIBQ go put entry on the queue- MOVEM.L (A7)+,A3-A4/D4-D7 restore intrp regs1 BEQ.S INTR900 br = queue full, process SRQ later&BSRPROCMSRQ‚startuptheSRQprocess***<***ƒRemote/LocalChange(RLC)interruptcheckandprocessing***6INTR900BTST#RLCBIT,D5ƒremote/localchangeinterrupt?BEQ.SINTR1000ƒbranchifno*@MOVE.BADDRSTAT(A1),D1‡D1<==‚currentaddressstateofTMS9914A6AND.W#1<*‚bitmaskandchecktoseeifweevenneedtorespondtothis*‚secondaryaddress.*8LEA.LCONFINFO(A5),A0„A0<==ptrtoconfigurationareas?MOVE.LCNFIGPTR(A0),A0ƒA0<==ptrtoconfigurationareaofBUS*=*‚Readthecommandpassthruregistertoobtainthesecondary*‚addressthatisrequired.*DMOVE.BCMDPTHRU(A1),D2†D2=secondaryaddrcontrollerisrequesting$AND.L#SECMASK,D2‹maskaddressbitsAMOVE.LIOSSAMW(A0),D1‡D1<==maskofvalidsecondarywriteaddrsDBTST#TADS_B,ADDRSTAT(A1)ƒAreweinprimarytal! keraddressedstate?BEQ.SINTR1140ŽBranchifno*@MOVE.LIOSSAMR(A0),D1‡D1<==maskofvalidsecondaryreadaddrs*.INTR1140BTST.LD2,D1ˆvalidsecondaryaddress?BNE.SINTR1150branchifyes*(*‚Thisisnotavalidsecondaryaddress.*?MOVE.B#DACR0,AUXCMD(A1)‚releasehdshk&don'tenterLADS/TADSBRA.SINTR1200ƒcontinue*AINTR1150 MOVE.B #DACR1,AUXCMD(A1) release hdshk & enter TADS/LADS4OR.B#1<BRA.SCKIO040gosendeventtouserabouttypeofpendingI/O*&*ˆTaskI/Oispending,checkformatch.*’onoperationtype&secondaryaddr.ifreq'd*8CKIO010 BTST.B D3,IOPEND(A5) Is it a a matching request?.BEQ.SCKIO030Br=no,abortTaskI/Orequest*C BTST.B #SECONDAR,IOPEND(A5) Is there a secondary address involved?)BEQ.SCKIO050Br=no,gostartthemenu5MOVE.LQTAIL(A5),A0‰getpointertocurrentoperation2MOVE.LIPBQOFST(A0),A0†AO<==I/Oparameterblock9CMP.W#IORSEC,IOSFCT(A0)„Isitasecondaryreadcommand?BEQ.SCKIO015br=yes:CMP.W#IOWSEC,IOSFCT(A0)„Isitssecondarywritecommand?.BNE.SCKIO030br=no,abortpendingtaskI/O*CKIO015 MOVEQ #SECMASK,D1@AND.BIOPEND(A5),D1‰D1=activecontrollerrequestedsec.addr.HCMP.BIOSSAD-1(A0),D1‡isitthesameasrheTask'srequestedsecaddr.?'BEQ.SCKIO050br=yes,startthemenu*.CKIO030BSRHLTCMD‹killthetaskrequestedI/O CKIO050BSETW#BUSIOP,BUSACTIV(A5)ƒsetINTRPlevelI/Opending&BSRPROCMENU‘InitiateI/Oonthemenu* CKIO060 RTS PAGEH**************************************************************************—CANCELPENDINGI/O*;*ˆAneventhasoccurredontheBUSthatforcesustocancel9*ˆanypendingI/Oregardlessofsource.‚Thecauseofthis&*ˆeventwillalsobesenttotheuser.**/*ˆENTER:„A1<==‚baseaddressofGPIBCregisters*’A3<==‚addressofIOSPB*’A4<==‚addressofDCB*’A5<==‚addressofCCB*.*’D5.W<==current9914intrpreg(INTRLEVEL)**’D3.B<==I/Ooperationtype(READ/WRITE)* CANCLIOP:#BSRHLTALL’HaltallI/OontheBUS, MOVE.B #0,IOPEND(A5) cancel any pending I/OHAND.W‚#$FFFF-(1<PROCMENAMOVE.LQTAIL(A5),A6‰A6<==ptrtocurrentqueueentry1BTSTW#HALTED,CSTQOFST(A6)‚wasthismenuHalted?BNEPROCM020br=yesK MOVE.L MENUNPOS(A5),MENUCPOS(A5) update: next item is now the current item6MOVE.LMENUNPOS(A5),A0ƒgetnextmenupositionpointer#MOVE.B(A0)+,D0ƒgetnextmenuitem5MOVE.LA0,MENUNPOS(A5)ƒupdatenextmenuitempointer* *ƒchecktoseeifatendofmenu*CMP.B#END,D0Œendofmenu?BEQ.SPROCM020‹yes* * Initiate I/O on next menu item*;LEA.LMENUCTBL(PC),A0ƒA0<--menufunctioncodejumptable(CMP.B#" MENUCLEN,D0‚validfunctioncode?BGTPROCMERB‚branchifno*/AND.W#$FF,D0ƒmasktheoffsetofroutineindex"ASL.W#1,D0…maketablecompatibleAMOVE.W0(A0,D0.W),D0‚relativedistancebetweentableandroutineAMOVEM.LD0/D2-D7/A0-A6,-(A7)‚saveeverythingexceptD1forerror,MOVE.LCCBCHB(A5),A1‚getbaseaddrofGPIBC)JSR0(A0,D0.W)‚initiateI/Oonmenuitem3MOVEM.L(A7)+,D0/D2-D7/A0-A6‚restoreallregisters TST.BD1‚setconditionalreturn2BNE‚PROCMERA‚gotoprocessormenuerrorprocessor*C*…Thesepreviousmenuitemwassuccessfullyinitiated/completed.If;*…themenuitemwasaClassIIorClassIIItype(auxiliary5*…commandorspecialfunctiontype)nointerruptwill9*…begeneratedsocheckthatheretokeepthingsrolling.*5MOVE.LMENUCPOS(A5),A0ƒgetcurrentmenuitempointer/CMPI.B#AUXTYPE,(A0)‚wasitanauxiliarytype?,BGE.SPROCMENA‚yes,continuewithnextitem*:*‚Thefollowingisaspecialcasecheckforthemenuitems9*„DATAXFRTERM/SEOI.Ifeitherprocessorwasperformedin7*„theimagemodeorperformedinformattedmodewithno>*„EORcharactersenabled,thennointerruptwillbegenerated.*;BCLRW#TERMINT,CSTQOFST(A6)ˆareweexpectinganinterrupt?-BNE.SPROCMENA•br=no,gotonextmenuitem*6PROCMRTNMOVEM.L(A7)+,D2-D7/A1-A6‚restoreenvironment RTS  PAGE*>*‚IthasbeendeterminedthatweareattheendofthecurrentB*‚operationmenuitemtableorthisI/OoperationhasbeenHALTED.*8PROCM020BTSTW#SRQPROG,BUSACTIV(A5)‚isSRQinprogress?BNEPROCM200•yes7MOVEQ‚#ISTAOK,D1setoperationcompletionstatustook PROCM050 MOVEQ #0,D0+MOVE.BDCBCDV(A4),D0‚getthedevicenumber1MOVE.WD1,-(A7)ˆsaveoperationcompletionstatus9MOVE.WDEVQBSY(A5),D1‚D1<==currentdevicebusybitmap(BCLRD0,D1clearthatdevice'sbusybit%MOVE.WD1,DEVQBSY(A5)‚updatebitmapMOVE.W(A7)+,D1ˆrestorestatus: BTSTW #HALTED,CSTQOFST(A6) was this operation terminated?BNE.SPROCM055Žbr=yesH BTSTW #SRQFAIL,CSTQOFST(A6) if an SRQ poll, did the device not respond?BEQ.SPROCM060‰br=O.K.*5PROCM055MOVEQ#ISTATO,D1„elsesettimeouterrorcode*2PROCM060 MOVE.B D1,IOSSTA(A3) save status in IOSPB2MOVE.B#XPSNRM,D4ƒD4<==seteventtypetonormalBSRQEVENT‚sendeventtoIOS/BTSTW#SRQWAIT,BUSACTIV(A5)†isanSRQwaiting?BEQ.SPROCM100”no*7*‚Overlaythecurrentcompletedqueueentry(operation)1*‚withdummySRQprocessinginformationpointers.* LEA.L CONFINFO(A5),A1J MOVE.L DVDCBPTR(A1),DCBQOFST(A6) set to DCB of the BUS for SRQ processing'CLR.WCSTQOFST(A6)ŠInitcommandstatus-CLR.LIPBQOFST(A6)ŠcleardummyIOSPBpointer LEA.L SRQBYTE(A5),A16MOVE.LA1,PBPAOFST(A6)†setdummyinputbufferaddress5MOVE.B#1,PBLNOFST(A6)†setdummyinputbufferlength(CLR.LSBPAOFST(A6)Šnosecondarybuffer!'CLR.WSBLNOFST(A6)Šanditslengthis0 BRA.S PROCSRQA  PAGE*3*ˆENTRYPOINTFORSRQPROCESSINGATINTERRUPTLEVEL*?*‚ThereisanSRQrequestwaitingtobehandledsoinitiatethe@*‚statusmenuforthefirstdevicenumberconnectedtothisCCB.=*‚Also,sendanI/Ocompleteeventbackforpreviousfunction%*‚sincewegototherthingstodonow* PROCMSRQ:+MOVEM.LD2-D7/A1-A6,-(A7)…saveenvironment*>PROCSRQAMOVE.LQTAIL(A5),A6ŠA6<==ptrtocurrentqueueentry2BCLRW#SRQWAIT,BUSACTIV(A5)„takeoutofwaitmode8BSETW#SRQPROG,BUSACTIV(A5)„putinSRQinprogressmode3LEA.LCOND_SP(PC),A0‹A0<==serialpollmenutable+MOVE.LA0,MENU(A5)settopofmenupointer=MOVE.BCSPDEVNM(A5),D0‰getdevicenumberoflastserialpoll>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(BRA.SPROCM227‘initiateI/OonSRQmenu* PAGE$PROCM100BSRPOPGPIBQƒpopGPIBqueue;BEQPROCMRTN‚branchifqueueisempty# (nothingelsetodo)*:*‚Setupthenecessarypointersfromthequeueinformation-*‚andthenbuildthemenuforthenewcommand**MOVE.LQTAIL(A5),A6‚getnewqueuepointer3*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *ˆ4/24/84ƒbwn#*ˆSetupregistersbeforebranching?MOVE.LIPBQOFST(A6),A3‚A3<==addressofIOSPBfornewcommand=MOVE.LDCBQOFST(A6),A4‚A4<==addressofDCBfornewcommand*6*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>EBTSTW#HALTED,CSTQOFST(A6)‚wasthiscommandentrypreviouslyhalted?BNEPROCM020ƒbranchifyes2*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *ˆ4/24/84ƒbwn**ƒThesemovesdoneabovenow.*?*MOVE.LIPBQOFST(A6),A3‚A3<==addressofIOSPBfornewcommand=*MOVE.LDCBQOFST(A6),A4‚A4<==addressofDCBfornewcommand*8*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*(BSRGETCMDP…getpointertonextcommand+BNEPROCM020„BR=invalidcommand,discard4BSRVALOPER…validateoperationalmodeandabilities)BNEPROCM020„Error,invalidcmd,discard(BSRBUILDMEN„buildmenufornewcommandBNEPROCM020„Branchiferror&BRAPROCMENA„initiateI/Oonnewmenu**‚SRQProcessingandDetection*7PROCM200 BTSTW #HALTED,CSTQOFST(A6) SRQ polling halted?&BNE.SPROCM300„br=yes,termpolling+MOVE.BSRQBYTE(A5),D1ƒreadthestatusbyte*.BTST#6,D1ƒisthisdevicerequestingservice? BNE.S PROCM400 branch if yes*A*‚Getnextindexdevicenumberofthenextdevicetoserialpoll.?*‚Thetechniqueusedallowswraparoundsothatnodeviceonthe:*‚BUSwillhaveagreaterpriorityofbeingserialpolled.*1PROCM220MOVE.BCSPDEVNM(A5),D0‚getcurrentindex2ADD.B#1,D0ƒbumpbyonetogetnextdevicenumber+CMPI.B#MAXDEVNM+1,D0ƒendofdevicechain?BNE.SPROCM225‚notyet MOVEQ#1,D0‚resettodevice#1*I*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *‡10/9/84…SJF*A*‡Wewillinsertcodeinheretoimplementtheconceptoflooping?*‡twicethroughalldevicesonabustolocatethesourceofan=*‡SRQ.‚ThiswasnecessaryduetodevicespulsingtheSRQline1*‡andthenmissingtrueSRQ'sfromotherdevices.*J*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>EPROCM225MOVE.B‚FSPDEVNM(A5),D2…D2<--device#westartedSRQ'swith(AND.Bƒ#$0F,D2Maskouttheloopcounter5CMP.BƒD0,D2HavewereachedthestartingSRQdevice?BNE.SƒPROCM227ŒNotyet7BSET.B‚#7,FSPDEVNM(A5)…Setthepotemtiallapindicator.BNE.SƒPROCM300ŒBranchifwehavelappedtwice*?PROCM227MOVE.LCCBCHB(A5),A1‚A1<--baseGPIBaddressofboard.BTST.B‚#BUSSRQ,BUSSTAT(A1)ƒisSRQstilltrue?1BEQ.SƒPROCM300Žbranchifnot,exitSRQprocesses =*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *10/9/84…sjf*+*ˆThiscodewasreplacedbytheabovelogic*L*PROCM225CMP.BFSPDEVNM(A5),D0‚havewedoneacompleteturnaroundtheBUS?**BEQ.SPROCM300ƒyes,wemayhaveproblems*@*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *-*‚Checktoseeifthisdevicenumberisvalid**PROCM240ANDI.L#$FF,D0ƒgetridofgarbage4MOVE.BD0,CSPDEVNM(A5)ƒupdatecurrentdevicenumber/ASL.L#3,D0ƒcalcoffsetintoconfiginfotable5LEA.LCONFINFO(A5),A0ƒbaseaddrofconfiginfotable6MOVE.LDVDCBPTR(A0,D0.L),A4ƒgetpointertodeviceDCBJMOVE.LCNFIGPTR(A0,D0.L),A0ƒgetptrtocurrentdeviceconfigurationblock MOVE.L A0,D0 set cond codes:BEQ.SPROCM220ƒbranchifdevicenotpresentorconfiguredF MOVE.L A4,DCBQOFST(A6) save new DCB pointer at current queue locationCBTSTW#IOASPOC,IOSATW(A0)‚doesdevicehaveserialpollcapability?BEQ.SPROCM220ƒbranchifno*>MOVE.LMENU(A5),MENUNPOS(A5)‚resetstatusmenupointertotopBRAPROCMENAƒinitiateI/O*>PROCM300 BCLRW #SRQPROG,BUSACTIV(A5) clear SRQ in progress bit(BRAPROCM100„continuenormalprocessing*.*ƒFoundadeviceonthebusrequestingservice*5PROC# M400MOVEQ‚#SRQTYPE,D0‚seteventtypetoSRQtypeBSRSENDUEVS‚sendevent>*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* *’10/9/84„sjf*5*ˆThislogicisnowperformedaboveaftereachdevice *ˆisqueried.*-*MOVE.LCCBCHB(A5),A1‚getbaseaddrofGPIBC/*BTST.B#BUSSRQ,BUSSTAT(A1)ƒisSRQstillTRUE?7*BEQ.SPROCM300‚no,cleanupandcontinuenormaloper.*>*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *5*ˆResetthelapindicatorandthefirstdevicepolled5*ˆforthisnextSRQseries.EachtimeanSRQisfound4*ˆwemustlapatleasttwicetocatchdevicesmissed*ˆbytogglingSRQ's.*** MOVEQ #1,D0 set to first device index of configuration blocks*DPROCM520 MOVE.B D0,FSPDEVNM(A5) set start of serial poll index chainABRA.SPROCM227‚startoveragain…***10/9/84sjf‚WASPROCM240*****5*‚ProcessMenuentrypointwhenanerrorhasoccurred#*‚withthereasonfroerrorinD1.B* PROCMERR:+MOVEM.LD2-D7/A1-A6,-(A7)…saveenvironment*>PROCMERAMOVE.LQTAIL(A5),A6ƒA6<==ptrtocurrentqueueentry1 BCLRW #SRQPROG,BUSACTIV(A5) was SRQ in progress?4BEQPROCM050ƒbr=NO,terminateUSERI/Oprocessing-BRAPROCM100ƒelsepopSRQmenuandterminate*:PROCMERBMOVEQ#ISTADRVE,D1‚setdriverrun-timeerrorcode% BRA.S PROCMERA go to error processor 8 TTL GPIB DRIVER - INTERRUPT PROCESSOR (MENU PROCESSORS) PAGEE***********************************************************************’MENUITEMCOMMANDPROCESSES*>*ˆThefollowingroutinesaretheindividualmenuitemroutinesA*…thatwhencombinedmakeupamenuforeachGPIBfunction.TheseE*…menuitemsaredispatchedbythemenuprocessorateitherinterrupt;*…levelorcommandlevel.Allregistershavebeenpreserved?*…beforeenteringexceptforD0andA0whichmayalwaysbeused@*…asworkregisters.Thefollowingregisterdescriptionentryis$*…trueforallmenuitemprocessors:*-*’ENTER:‚A1=BaseAddressofGPIBCregisters%*šA3=AddressofIOSParameterBlock,*šA4=AddressofDeviceControlBlock(DCB)-*šA5=AddressofChannelControlBlock(CCB)1*šA6=AddressofUser'sTaskControlBlock(TCB)* *’EXIT:ƒIfD1=0…THENƒNoerrors*œELSED1=errorcode9*Note:TheINITIOprocessorhassavedallregistersupon)*”entrysoallregistersarefreetouse.*G*********************************************************************** ! TTL CLASS I MENU ITEM PROCESSORS PAGEF************************************************************************ˆCLASSIMENUITEMPROCESSORS*1*’Thisclassofmenuitemsinitiatevarioustypes>*ˆofI/OinbothDMAandnon-DMAmodes.AllclassImenuitems-*ˆwillgenerateaninterruptafterexecution.*F********************************************************************** **ˆPROCESSOR:WriteData*:*ˆPURPOSE:TosetupthewriterequestaccordingtotheIOS0*‘options,setuptheDMAregisters,andthento*‘initiatetheI/O.* WRITDATA:9 MOVEQ #1<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>& MOVE.B D2,UNICMD(A1) initiate the I/O*3WRITD025MOVEQ‚#ISTAOK,D1setreturnstatustoO.K.*WRITDRTNRTS…exitwritedata*<*ˆSpecialprocessingforDMAtransferofonly1byte(either&*ˆdataorterminationchar.sequence).*HWRITD030 BSETW #TERMINT,CSTQOFST(A6) let PROCMENU know no intrp expected‰BRA.SWRITD025Žtakegoodexit**‚WriteFormattedMode;*ˆSinceDMAwriterequestsaretransfereddirectlyfromthe;*ˆusersbuffer,andWriteFormattedEORcharacteristics(if8*ˆenabled)willbesentoutbytheterminationprocessor'*ˆuponcompletionofthisDMAtransfer.*>WRITDFMTMOVE.BWEORFMT(A2),D1‚getEORreqforWriteFormatted2BTST.L#FIXTERM,D1‚fixedlengthtransferenabled?BEQ.SWRITD060„branchifnoF MOVE.W IOSFBWF(A2),D0 yes change transfer length to fixed requirement*G*ƒIfanyoftheCR,LF,orEOScharactersareenabled,EOI(ifenabled);*ƒmustbeheldoffforthistransferandtransmittedbythe*ƒterminationprocessor.*WRITD060 MOVE.B D1,D37 AND.B #1<*„terminateonthehighestpriorityterminatorwithEOShaving:*„thehighestpriorityfollowedbyLFandCRrespectively.*0READ115MOVEQ#0,D2ŠclearDMAoperationregister#BTST.L#EOSTERM,D1ŠisEOSenabled?BEQ.SREADD060branchifno; MOVE.B IOSEOSR(A2),EOSCOMP(A1) yes, set EOS read character+BRA.SREADD080andbypassCR/LFEOSchecks)READD060BTST.L#LFTERM,D1‚isLFenabled?BEQ.SREADD070branchifno1MOVE.B#LF,EOSCOMP(A1)…yes,setLFasterminator'BRA.SREADD080andbypassCREOScheck)READD070BTST.L#CRTERM,D1ƒisCRenabled?6*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *ˆ4/24/84ƒbwn*=*ˆFixsothatreadwillterminateonfixedlengthdatainput. *ˆInsertedREADD090labelbelow.**BEQ.SREADD020branchifno BEQ.S READD090*?*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1MOVE.B#CR,EOSCOMP(A1)…yes,setCRasterminator@READD080BSET.L#EOSBIT,D2‚enableEOSdetectionforDMAtransfer2READD090BTST.L#FIXTERM,D1‰fixedlengthtransfer?BEQ.SREADD020branchifno1TST.WD3“diduserreallyspecifyafixedlength?3BEQ.SREADD020br=no,useIOSPBspecifiedlength;CMP.WD0,D3‘compareuser'srealbufferlengthtoDEVICE'S!8BGE.SREADD011Žbr=user'sbuffersize.GE.todevice's4MOVEQ‚#ISTAADD,D1Šbr=hisbufferisnotbigenoughBRA.SREADDRTNŽabort*BREADD011MOVE.WD3,D0ˆsetupDMAfordevice'sfixedlengthrecord!4READD020:BSRSETUPDMA†setupDMAbytecountandMAR+MOVE.B#LON1,AUXCMD(A1)…setupListenmode.BSET.L#DMAWRITE,D2ˆenableDMAwritecommmand6BCLRW#BIBIT,TMSMASK(A5)ƒdisableBIinterruptsonDMA7MOVE.WTMSMASK(A5),D1†resetinterruptmaskonTMS9914A MOVEP.W D1,INTR0(A1)*MOVE.B#GTS,AUXCMD(A1)…lowertheATNlineB*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *ˆ4/24/84ƒbwn*9*ˆMustinhibitTMS9914A‚interrupts‚duringDMAoperations.*2BCLR.B#VBIMENAB,CONTREG0(A1)‚disable9914intrps*?*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&MOVE.BD2,UNICMD(A1)‡initiatetheI/O+MOVEQ‚#ISTAOK,D1ŠsetreturnstatustoO.K.READDRTNRTSexitreaddata PAGE(*ˆPROCESSOR:SendTerminationCharacters*6*ˆPURPOSE:ThisprocessorwillsendtheEORcharacters,*‘inDMAmodetocompletethepr% eviouswrite*‘formattedtransfer.* SENDTERM:%MOVE.WIOSOPT(A3),D1‚getIOSoptions.AND.W#IOPIMG,D1‚datatransferinimagemode?>BNE.SSENDTRM9ƒbranchifyes(noEOScharactersinthismode)*3BSRGETCNFIGƒgetptrtocurrentconfigurationdataB MOVE.B WEORFMT(A0),D1 get EOR characteristics for Write Formatted$ MOVE.B IOSEOSW(A0),D2 get EOS char.7LEA.LTERMBUF(A5),A0‚A0<==terminationbufferpointer*?*ƒOnceagain,justasinthereadprocessor,theEORcharacters8*ƒmaybemultiplysetandaresoftwarepriorityencoded.>*ƒIfenabled,theCRcharacterwillbesentoutfirstfollowed1*ƒbytheLFcharacterandthentheEOScharacter.** MOVEQ #0,D0 reset EOS string byte counter+BTST.L#CRTERM,D1ƒisCRcharacterenabled?BEQ.SSENDTRM2„branchifno0MOVE.B#CR,(A0)+‚storeCRinterminationbufferADDQ.L#1,D0ˆbumpbytecount*3SENDTRM2BTST.L#LFTERM,D1ƒisLFcharacterenabled?BEQ.SSENDTRM4„branchifno?MOVE.B#LF,(A0)+‚yes,storeLFcharacterinterminationbufferADDQ.L#1,D0ˆbumpbytecount*;SENDTRM4BTST.L#EOSTERM,D1‚iswriteEOScharacterenabled?BEQ.SSENDTRM8„branchifno:MOVE.BD2,(A0)+ƒstoreEOScharacterinterminationbufferADDQ.L#1,D0ˆbumpcount*1SENDTRM5 MOVEQ #0,D2 initialize DMA transfer type SUB.LD0,A0‡setstartofbuffer*0*ˆSetupfordataxfer:‰A0<--terminatorstring*¦D0=ƒstringlength*¦D1=ƒEORoptions*¦D2=ƒDMAcommand*,BRAWRITD010†dotheterminatorstringwrite*(SENDTRM8TST.LD0‚anyEOSchar.tosend? BNE.S SENDTRM5*?SENDTRM9 BSETW #TERMINT,CSTQOFST(A6) set no interrupt expected!+MOVEQ‚#ISTAOK,D1setreturnstatustoO.K.)RTS„exitterminationcharacterprocessor  PAGE***ˆPROCESSOR:SendEOI*<*ˆPURPOSE:ƒSendsthelastcharacterofadata(OUT)transfer3*“withtheEOIlineTrue(usesTMS9914EOIcontrol)**SENDEOI:)BSRGETCNFIGgetpointertoconfig.data2MOVE.BWEORFMT(A0),D1‡getWriteFormattedoptions MOVE.W IOSOPT(A3),D0.AND.W#IOPIMG,D0ŒwasdataxferinImagemode?.BEQ.SSENDEOI2Žbr=NO,useFormattedoptions*.MOVE.BWEORIMG(A0),D1‡getWriteImageoptions*ASENDEOI2BTST#EOITERM,D1„doweneedtosendlastchar.withEOI?BEQ.SSENDEOI4Žbr=no,exit*-*ƒSendthelastdatabyteofthestring(DMA)*BMOVE.B#FEOI,AUXCMD(A1)…setTMS9914tosendEOIcoincidentw/data;MOVE.B#$FE,BCNTLSB(A1)…setupBCRto1'scompl.of1byteFMOVE.B#$FF,BCNTMSB(A1)…THEMARISSTILLSETFROMPREVIOUSXFER!!!!!!#MOVEQ#0,D2‘setupfordataoutput(BRAWRITD022godotheoutputoperation*LSENDEOI4 BSETW #TERMINT,CSTQOFST(A6) set no intrp expected flag for PROCMENU>BTSTW#CAC_S,BUSACTIV(A5)ƒNomoreoutputistotakeplace,so?BEQ.SSENDEOI5ŽifweareaController,takecontroloftheBUSHMOVE.B#TCA,AUXCMD(A1)†NOW!causeitwon'tbedoneatnormalintrptime*SENDEOI5 MOVEQ #ISTAOK,D1 RTS ‰PAGE*ˆPROCESSOR:Untalk‚(UNT)*:*ˆPURPOSE:TosendtheuniversalUNTALKcommandoutonthe*‘BUSwiththeATNlinetrue.*SENDUNT:&MOVE.B#UNT_CMD,D1‚setUntalkcommand!BRACOMOUT…sendoutcommandbyte **ˆPROCESSOR:Unlisten‚(UNL)*<*ˆPURPOSE:TosendtheuniversalUNLISTENcommandoutonthe*‘BUSwiththeATNlinetrue.*SENDUNL:(MOVE.B#UNL_CMD,D1‚setUnlistencommand!BRACOMOUT…sendoutcommandbyte *'*ˆPROCESSOR:ListenAddressGroup(LAG)*;*ˆPURPOSE:Tosendtheprimarylistenaddressofthedevice1*‘specifiedintheLUNparameteroftheIOSPBout#*‘ontheBUSwiththeATNlinetrue*SENDLAG:3BSRGETPADDR‚gettheprimaryaddressofthedevice/OR.B#$20,D1ˆconverttoprimarylistenaddress!BRACOMOUT…sendoutcommandbyte *%*ˆPROCESSOR:OtherTalkAddress(OTA)*9*ˆPURPOSE:Tosendtheprimarytalkaddressofthedevice1*‘specifiedintheLUNparameteroftheIOSPBout#*‘ontheBUSwiththeATNlinetrue*SENDOTA:K MOVE.B #TON0,AUXCMD(A1) UNTALK the GPIB, send aux command talk on% ly (cs=0)3BSRGETPADDR‚gettheprimaryaddressofthedevice-OR.B#$40,D1ƒconverttoprimarytalkaddress!BRACOMOUT…sendoutcommandbyte ***ˆPROCESSOR:OtherSecondaryAddress(OSA)*9*ˆPURPOSE:Tosendthesecondaryaddressspecifiedinthe.*‘secondaryaddressparameteroftheIOSPBout$*‘ontheBUSwiththeATNlinetrue.*SENDOSA:5MOVE.BIOSSAD-1(A3),D1‚getdesiredsecondaryaddress AND.B#$1F,D1ƒmaskaddressbits8 OR.B #PPE_CMD,D1 set into secondary address group range!BRACOMOUT…sendoutcommandbyte *,*ˆPROCESSOR:ParallelPollUnconfigure(PPU)*:*ˆPURPOSE:Tosendtheuniversalparallelpollunconfigure1*‘commandoutontheBUSwiththeATNlinetrue.t*SENDPPU:ILEA.LCONFINFO(A5),A0‚A0<==startofconfigurationareaforalldevices*;*‚ResetthecurrentparallelpollconfigurationoftheBUS.*0MOVE.LCNFIGPTR(A0),A2‚A2<==cnfigptrforBUS6BSET.B#PPIS,IOSPOLC(A2)‚setParallelPollIdleState> MOVE.B #0,PARLPOLL(A1) clear the GPIBC parallel poll register#MOVE.B#PPU_CMD,D1‚setPPUcommand+BRACOMOUTƒsendthecommandoutontheBUS *'*ˆPROCESSOR:ParallelPollEnable(PPE)*:*ˆPURPOSE:Tosendparallelpollconfigurationinformation3*‘(PPPandSbitssetupinPPEparameterofIOSPB)*‘outontheBUS.*SENDPPE:1MOVE.BIOSSAD-1(A3),D1‚getPPconfigurationinfo"AND.B#$0F,D1†maskPPPandSbits*8*‚Settheparallelpollconfigurationregistertoactive *ˆandsetthenewconfiguration.*9BSRGETCNFIGƒA0<==ptrtoconfigurationareafordevice8MOVE.BD1,IOSPOLC(A0)‚saveindeviceconfigurationarea*3OR.B#PPE_CMD,D1„encodebitstomakeaPPEcommand+BRACOMOUT…sendoutcommandbytetodevice ***ˆPROCESSOR:ParallelPollConfigure(PPC)*8*ˆPURPOSE:Tosendtheuniversalparallelpollconfigure0*‘commandoutontheBUSwiththeATNlinetrue.*SENDPPC:*MOVE.B#PPC_CMD,D1‚setupthePPCcommand!BRACOMOUT…sendoutcommandbyte *(*ˆPROCESSOR:ParallelPollDisable(PPD)*6*ˆPURPOSE:Tosendtheuniversalparallelpolldisable0*‘commandoutontheBUSwiththeATNlinetrue.*SENDPPD:*MOVE.B#PPD_CMD,D1‚setupthePPDcommand!BRACOMOUT…sendoutcommandbyte *%*ˆPROCESSOR:SerialPollEnable(SPE)*3*ˆPURPOSE:Tosendtheuniversalserialpollenable0*‘commandoutontheBUSwiththeATNlinetrue.*SENDSPE:*MOVE.B#SPE_CMD,D1‚setuptheSPEcommand!BRACOMOUT…sendoutcommandbyte *&*ˆPROCESSOR:SerialPollDisable(SPD)*4*ˆPURPOSE:Tosendtheuniversalserialpolldisable0*‘commandoutontheBUSwiththeATNlinetrue.*SENDSPD:*MOVE.B#SPD_CMD,D1‚setuptheSPDcommand!BRACOMOUT…sendoutcommandbyte *$*ˆPROCESSOR:ClearAllDevices(DCL)*5*ˆPURPOSE:Tosendtheuniversaldeviceclearcommand(*‘outontheBUSwiththeATNlinetrue.*SENDDCL:*MOVE.B#DCL_CMD,D1‚setuptheDCLcommand!BRACOMOUT…sendoutcommandbyte * *ˆPROCESSOR:LocalLockout(LLO)*6*ˆPURPOSE:Tosendtheuniversallocallockoutcommand(*‘outontheBUSwiththeATNlinetrue.*SENDLLO:*MOVE.B#LLO_CMD,D1‚setuptheLLOcommand!BRACOMOUT…sendoutcommandbyte **ˆPROCESSOR:TakeControl(TCT)*5*ˆPURPOSE:Tosendtheaddressedtakecontrolcommand(*‘outontheBUSwiththeATNlinetrue.*SENDTCT:*MOVE.B#TCT_CMD,D1‚setuptheTCTcommand!BRACOMOUT…sendoutcommandbyte *)*ˆPROCESSOR:SelectiveDeviceClear(SDC)*7*ˆPURPOSE:Tosendtheaddressedselectivedeviceclear/*‘commandoutontheBUSwiththeATNlinetrue*‘toallcurrentlisteners.*SENDSDC:*MOVE.B#SDC_CMD,D1‚setuptheSDCcommand!BRACOMOUT…sendoutcommandbyte **ˆPROCESSOR:GoToLocal(GTL)*4*ˆPURPOSE:Tosendtheuniversalgotolocalcommand(*‘outontheBUSwiththeATNlinetrue.*SENDGTL:*MOVE.B#GTL_CMD,D1‚setuptheGTLcommand!BRACOMOUT…sendoutcommandbyte *(*ˆPROCESSOR:GroupExecuteTrigger(GET)*& 6*ˆPURPOSE:Tosendtheuniversalgroupexecutetrigger0*‘commandoutontheBUSwiththeATNlinetrue.*SENDGET:*MOVE.B#GET_CMD,D1‚setuptheGETcommand!BRACOMOUT…sendoutcommandbyte *)*ˆPROCESSOR:ReadSerialPollstatusbyte*0*ˆPURPOSE:ThisprocessorispartoftheCOND_SP)*‘(ConductSerialPoll)menu.Itspurpose+*‘istosetupforByte-Ininterrupt‚toget!*‘thestatusbytedesireddevice.*READSP:)BSRMTFIFO’cleartheFIFO(VME-300bug!)3MOVEM.LD0-D7/A0-A6,-(A7)ƒsaveregsonTrap0call1LEASP_TO(PC),A0ŒsetPATforserialpolltimeout"MOVE.L#1000,A1waitfor1second MOVEQ #0,D1EMOVE.BCCBISR(A5),D1ˆgetintrplevelfromhighbyteofCCBS.R.wordAND.B#$0F,D1maskoffgarbage)MOVE.LA5,D2setCCBaddressasPATI.D.TR0$.RQPA,‘starttimerBRA.SREADSP1br=timergoing*#TR0$.KILLER,elsebombthesystem !READSP1 MOVEM.L (A7)+,D0-D7/A0-A6/ BSETW #SPTIMER,BUSACTIV(A5) mark timer running4MOVE.B#LON1,AUXCMD(A1)…setuptoreadSPdatabyte3MOVE.B#GTS,AUXCMD(A1)†DropATNtolethimsendit#MOVEQ#ISTAOK,D1Œsetreturnstatus RTS  PAGE .*ˆSerialPollReadStatusByteTimeoutRoutine*=*ˆIfauserhasrequestedtheserialpollfunction,atimeout=*ˆerrorstatuswillbereturned.‚Elseifthetimeoutoccurred;*ˆasaresultofthedriverpollingadeviceinresponseto<*ˆanSRQinterrupt,theSerialPollstatusbyte(intheCCB)<*ˆwillbesettozeroandthecurrentdevicewillbeskipped*ˆinthepollingsequence.*+SP_TO:ƒMOVEM.LA3-A5,-(A7)‹saveimmed.regs‰MOVE.LD1,A5’setCCBpointer‰MOVE.LQTAIL(A5),A07‰CMPA.LQHEAD(A5),A0‹isthereanoperationinprogress?/‰BEQ.SSP_TO2’br=no,musthavebeencancelled9‰BCLRW#SPTIMER,BUSACTIV(A5)ƒwastimeralreadycancelled?‰BEQ.SSP_TO2’br=yes,ignore*1*ˆSetupregisterstolooklikeVME-300interrupt*"‰MOVE.LDCBQOFST(A0),A4ˆA4<--DCB#‰MOVE.LIPBQOFST(A0),A3ˆA3<--IOPB+‰MOVE.LCCBCHB(A5),A1ŠA1=hardwareaddress<‰MOVE.B#TCS,AUXCMD(A1)ˆtakecontrolofBUSnow,sincethere)‰MOVE.BDATAIO(A1),D1Šisnointrpcoming!)‰BTSTW#SRQPROG,BUSACTIV(A5)ƒSRQpolling?‰BNE.SSP_TO1’br=no,userI/O;‰BSETW#SRQFAIL,CSTQOFST(A0)ƒmarkSRQpollresponsefailure*SP_TO1ƒCLR.BSRQBYTE(A5)resetstatusbyte3‰BSRPROCMENU’andprocessasnormalstatusresponse'SP_TO2ƒMOVEM.L(A7)+,A3-A5‹restoreregs‰RTE*?*ˆRoutinetocancel‚thecurrentlyrunningSerialPollI/Otimer* KILLSPTO:5‰BCLRW#SPTIMER,BUSACTIV(A5)ƒcleartimerrunningflag3‰MOVEM.LD0-D7/A0-A6,-(A7)…saveregsonTrap0call.‰LEASP_TO(PC),A0Žsetupparmstocanceltimer‰SUBA.LA1,A1’interval‰MOVE.LA5,D2’setCCBI.D.1‰MOVE.BCCBISR(A5),D1Šgetintrplevelforrequest#‰AND.L#$0F,D1‘clearexcessgarbage(‰OR.L#$8000,D1options=cancelrequest‰TR0$.RQPA,“gocancel$‰BRA.SKILLSP1‘br=requestaccepted$‰TR0$.KILLER,‘elsecrashthesystem*.KILLSP1‚MOVEM.L(A7)+,D0-D7/A0-A6…restoreregs‰RTS  PAGE*1*ˆPROCESSOR:SendAuxiliaryCommandBufferString*4*ˆPURPOSE:Thisgeneralprocessorwillsimplyoutput-*‘whateverisintheusersauxiliarycommand+*‘stringbufferoutontheBUSwiththeATN *‘linetrue.* SENDAUXS:8BSRGETXFRAD‹getphysicalI/Oaddressforthisfunction,MOVE.LD6,A0‹A0<==startingbufferaddress1 MOVE.L D5,CMDCOUNT(A5) set command string length+MOVE.B(A0)+,D1Špreloadfirstcommandbyte?MOVE.LA0,CMDBFPTR(A5)‚setcommandbufferpointertonextbyteBRACOMCMDsendcommand  " TTL CLASS I MENU ITEM SUBROUTINES PAGE**‚TLPROC*&*ˆTALKER/LISTENERWRITE/READPROCESSOR*6*ˆThepurposeofthisroutineistodetermineifitis9*ˆO.K.toinitiatethecurrentRead/Writecommandatthis1*ˆtime.‚Ifnot,thecurrentoperationwillsetup%*ˆaTasklevelI/Ooperationpending.*.*’ENTER:‚D0.B=‚typeofoperation-Read/Write#*šA1=baseaddrofGPIBCregisters'*šA3=addressofIOCBforthisrequest*šA5=addressofCCB*:*’EXIT:‚IFCCthenO.K.toinitiateI/O(D0.b=& don'care)*™ELSE(IFCSANDD1=0)2*œTHEN‚taskwaitingforcontrollertomakerequest$*™ELSE(IFCSANDD1.B=errorcode)*œTHENcommandisaborted* *’RegisterUsageƒ01234567 *¡D*R***¡A*TLPROC:5BTSTW#CAC_S,BUSACTIV(A5)„isBUSincontrollermode?+BNE.STLP20‘br=yes,O.K.toinitiateI/O*=BTSTW#BUSIOP,BUSACTIV(A5)ƒisthereINTRPlevelI/Opending?6BNE.STLP10‘br=yes,gocheckformatchingoperation*6MOVE.BD0,IOPEND(A5)ˆelsemarkTasklevelI/OpendingDMOVE.LMENUCPOS(A5),MENUNPOS(A5)‚backupmenupointertore-execute(MOVEQ#ISTAOK,D1Œsetreturncode=O.K. BRA.STLP40‘andexitwithC=1*>TLP10MOVE.BIOPEND(A5),D2ƒD2=INTRPlevelI/Opendingstatus MOVE.B D0,D11AND.BD2,D1‘D1=INTRP^TASKI/Opendingstatus1BEQ.STLP30‘br=operationtypemismatch-error*/BTST#SECONDAR,D2‹secondaryaddressoperation?*BEQ.STLP20‘br=no,O.K.toinitiateI/O* MOVEQ #SECMASK,D3 MOVE.B IOSSAD-1(A3),D1-AND.BD3,D1‘D1=taskrequestedsec.address0AND.BD2,D3‘D3=INTRPlevelpendingsec.addr.CMP.BD1,D3‘aretheythesame?4BNE.STLP30‘br=no,gokilltaskrequestedcommand*,TLP20BSRMTFIFOO.K.toinit.I/O!LET'SGO'BNE.STLP40‘oops,hardwaremalfunction*6CLR.BIOPEND(A5)ŒclearINTRPlevelI/Opendingstatus/BCLRW#BUSIOP,BUSACTIV(A5)ƒandassociatedflag&MOVEQ#ISTAOK,D1ŒsetreturncodeO.K.ANDI#$FE,CCRclearCarrybit RTS*'TLP30MOVEQ#ISTAIRPI,D1…seterrorcode* TLP40ORI#$01,CCR‹setCarrybit RTS  PAGE* *ƒSETUPDMA*>*‡ThisroutineisusedbytheREADDATA,WRITDATA,andSENDTERM<*„processorstosetupthememoryaddressregister(MAR)andA*„thebytecountregister(BCR)ontheMVME300card.Thesesimply8*„setuptheDMAtransferregistersbutinitiatenoI/O.*-*ˆENTER:‚A1=baseaddressofGPIBCregisters,*A0=bufferaddresstoread/writeto/from."*D0=numberofbytestotransfer*!*ˆRegisterUsage:†01234567*šD‚P*šA‚P* SETUPDMA: MOVE.L D0,-(A7).NOT.WD0…convertbytecountto1'scompliment-MOVE.BD0,BCNTLSB(A1)‚saveLSBofbytecount LSR.W#8,D0‡getnexteigthbits-MOVE.BD0,BCNTMSB(A1)‚saveMSBofbytecount*#MOVE.LA0,D0†D0<==bufferaddressB*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *ˆ4/24/84ƒbwn*8*ˆTheaddresswegetinD0istheaddressasseenbythe *ˆdriver.4*ˆIfweareusingdualportedram‚ontheVME/10,and5*ˆifthisaddressisinon-boardram,thenitmustbe;*ˆtranslatedtoanon-boardaddressastheMVME300seesit.1*ˆWedothisbyaddingtheRAM_SKEWoffsettothe%*ˆaddress,usingtheGO_OFF_BDmacro.* ‰GO_OFF_BDD0*>*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>%MOVE.BD0,MARLSB(A1)‚saveLSBofMAR LSR.L#8,D0„getnexteightbits%MOVE.BD0,MARISB(A1)‚saveISBofMAR LSR.L#8,D0„getnexteightbits%MOVE.BD0,MARMSB(A1)‚saveMSBofMAR MOVE.L (A7)+,D0 RTS…exit PAGE**‚COMOUT*7*ˆSincecommandsbytes(ATN=true)cannotbesentout=*„inDMAmode,thisprocessorwillsendoutabyteatatime.'*„ItassumesthattheATNlineistrue.*-*ˆENTER:„A1=baseaddressofGPIBCregisters*’A5=addressofCCB *’D1.B=commandbytetobesent*ä ÍEÖDÞ<æ:î8ö:þ-54.1&J.M6?>:F/N2V:^=f>n6vD~7† !*ˆRegisterUsage:„01234567*˜D„P‡P*˜A„P*COMOUT:FMOVE.L#1,CMDCOUNT(A5)ƒsetcommandcountto1forinterruptprocessor*C*‚EntryPointusedbytheCommandOut/DataOutandtheCommandOut/*‚DataInprocessors**ƒspaceintheCCBfornewblockandstoringnewconfiguration=*ƒinformation.‚Inactuality,thespaceforallconfigurations<*ƒattachedtothisCCBhavealreadybeenallocatedanditis+*ƒjustamatterofadjustingsomepointers.=*‡SinceIOIisinitiatingthiscall,A1looksliketheuser's?*ƒbufferbutisreallyapointertothedefaultconfigurationof *ƒtheDCB.;*‡TheBUSactivityflag(BUSACTV)issetupatthistimeto$*ƒindicateitsinitialstartupmode.*+MOVE.LA2,-(A7)‚saveaddressofGPIBCregs6LEA.LCONFINFO(A5),A2‚configuration/DCBpointertable MOVEQ #0,D0'MOVE.BDCBCDV(A4),D0‚getdevicenumber"ASL.L#3,D0‡calculatetableindex@MOVE.LNEXTCNFG(A5),A0‚A0<==nextavailableconfigurationarea=MOVE.LA0,CNFIGPTR(A2,D0.L)‚setconfigurationptrfordevice3MOVE.LA4,DVDCBPTR(A2,D0.L)„setDCBptrfordevice*I*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*8*ˆ10/16/84‚SETSERVICEREQUESTWAITINGFLAGTOCATCHANY2*’SRQ'SPENDINGONTHEBUSATTIMEOFBOOT/STARTUP6*’SINCETHATSRQINTERRUPTWILLBELOSTINTHETMS9914$*’ATTIMEOFCHANNELINITIALIZATION.*‰BSETW…#SRQWAIT,BUSACTIV(A5)*I*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>JMOVE.WIOSVARL+DCBDEV(A4),D0„D0<==lengthofvariableconfigurationarea BTST#0,D0…oddnumberofbytes?BEQ.SCDEVA„branchifnoBADDQ#1,D0…allocateinevenbyamountsforaddressingconsistency*KCDEVALEA.LIOSILN(A0,D0.W),A2‚calculatetotallengthofconfigurationareaDMOVE.LA2,NEXTCNFG(A5)ƒupdatenextavailableconfigurationareaptr.MOVE.L(A7)+,A2‚restoreaddressofGPIBCregs*?*ƒThenextcheckwilldetermineiftheGPIBisbeingconfigured4*ƒwithsystemcontrollercapabilities.‚Ifthisisso=*ƒthenthebusinterfacewilltakecontroloftheBUSatthis?*ƒpoint.‚OtherwiseitsmodewillbesetaccordingtothedeviceB*ƒattributesword(IOSATW)passedintheconfigurationdatablock.E*ƒIftheBUSisconfiguredforTalker/Listeneronly,NOOTHERDEVICESI*ƒWILLBEALLOWEDTOBECONFIGUREDATSYSTEMINTIALIZATIONTIME.‚Att( emptsG*ƒtoaccessthesedevicesatalatertimewillcauseaDEVICENOTREADY(*ƒerrorconditiontobereturnedbyIOS.*&TST.BDCBCDV(A4)”configuringtheBUS?BNE.SCOMNCNFG”branchifno MOVE.L A1,-(A7)9BSRRESETIO—correctforintrpstoanun-attachedchannel MOVE.L (A7)+,A1ABTSTW#IOASCTC,IOSATW(A1)‰isBUSbeingconfig.withS.C.capab?BEQ.SCOMNCNFG•branchifno*2*ˆElsetestinterfaceforcompatibleconfiguration*:*ˆNOTE!!!‚Thedevicewillbestrippedofsystemcontroller8*ˆcapabilitieswithoutnotifyingthecalleronthefirst9*ˆtimeconfigurationonly.Thisallowsasuccessfulfirst:*ˆtimeconfigurationandwillnotmarkthisdeviceOFFLINE*ˆuponreturn.*.TST.BADDRREG(A2)‘isMVME300cardinSCmode?BPL.SCDEVB—branchifyes9BCLRW#IOASCTC,IOSATW(A1)‰donotallowS.C.capabilities BRA.S COMNCNFG*>*ˆSoftware&hardwareS.C.configurationsagree,TAKECONTROL!*CDEVB MOVE.L A1,-(A7)#MOVE.LA2,A1•setupA1forSENDIFC&BSRSENDIFC–TakecontrolofBUS,NOW! MOVE.L (A7)+,A1*/*‚Continuewithnormalconfigurationprocessing*"*ˆCheckforunsupportedattributes*MCOMNCNFGMOVE.W#CECUAP,D2ƒpreloadunsupportedattribute/parametererrorcode*3MOVE.W#NVALBATM,D0ƒgetmaskofinvalidattributes8AND.WIOSATM(A1),D0ƒtryingtochangeinvalidattribute?"BNECNFGERR†branchifyes(error)*1MOVE.W#NVALBPRM,D0‚getmaskofvalidparameters8AND.WIOSPRM(A1),D0‚tryingtochangeinvalidparameter?"BNECNFGERR…branchifyes(error)*9*‚Settheattributesintotheuser'sconfigurationbuffer"*‚thathedoesnotwanttochange.*0MOVE.WIOSATM(A1),D0‚D0<==hisattributesmask;AND.WD0,IOSATW(A1)ƒZeroouttheattributesofhisthathe9NOT.WD0Ždoesn'twanttochange,zeroouttheattributes=AND.WIOSATW(A0),D0ƒofminethathedoeswanttochange,and.OR.WD0,IOSATW(A1)„combinetheminhisspace.* *‚Dothesamefortheparameters*3COMN010MOVEQ#0,D0ƒbesureupper16bitsareclearKMOVE.WIOSPRM(A1),D0‚D0<==maskofparametersthathedoeswanttochange7MOVEM.LA0-A2,-(A7)„saveconfigurationblockaddresses4LEA.LIOSREC(A0),A0„A0<==addrof1stparaminCCB@LEA.LIOSREC(A1),A1„A1<==addrof1stparaminuserdatablock2LEA.LPAR_SIZ,A2…A2<==addroftableparamsizes*NXTPARM MOVEQ #0,D11MOVE.B(A2)+,D1‚get#ofbytesinnextparameter%BEQ.SCHKPARM„branchifendoftable*+LSR.W#1,D0…wanttochangenextparameter?BCS.SINCPARMƒbranchifyesASUBQ#1,D1†doesnotwanttochangeitsomoveparameterfromCCB2*totheuser'sbuffersothathewillhaveacopy)MOVPARMMOVE.B(A0)+,(A1)+‚movenextbyte)DBRAD1,MOVPARMƒuntilbytecountexpires'BRA.SNXTPARMƒcheckthenextparameter*?INCPARMADD.LD1,A0‚hedoeswanttochangeitsoleavehiscopy4ADD.LD1,A1‰aloneandjustgotothenextparameter BRA NXTPARM*>*ƒChecktoseeifhe'sdoinganyconfigurationthatisillegal*:CHKPARMMOVEM.L(A7)+,A0-A2‚restoreconfigurationpointers=MOVE.W#CECIPA,D2‚preloadinvalidprimaryaddresserrorcode*2MOVE.BIOSPRMA(A1),D0‚getcurrentprimaryaddress0CMP.B#$1E,D0…valid?(MUSTBE0<=ADDR.<=$1E)BHICNFGERR…branch=‚error*"TST.BDCBCDV(A4)‚isthisthebus?BNE.SCHKPRM2…branchifno*=*‚Checktoseeiftheprimaryaddressconfiguredmatcheswhat-*‚issetontheswitchesoftheMVME300card.*CMOVE.BADDRREG(A2),D1ƒD1<==primaryaddrreadfromboardswitches+NOT.BD1‰usecomplementofswitchregister AND.B#$1F,D1„maskprimaryaddr?CMP.B#$1F,D1„isswitchregister=$1F(INVALIDGPIBADDRESS!)CBNE.SCHKPRM1„BR=no,usehardwareswitchregisterasBUSaddress)MOVE.BD0,D1…elseuseSYSGENBUSaddress*@CHKPRM1MOVE.BD1,ADDRREG(A2)‚setTMS9914Aprimaryaddrregister, MOVE.B D1,IOSPRMA(A1) update config. buffer9BTSTW#IOSPOLCB,IOSPRM(A1)‚localppconfiguringthebus?BEQ.SCHKPRM2ƒbranchifno*=MOVE.BIOSPOLC(A1),D0‚D0<==newparallelpollconfiguration/BMI.SCHKPRM2ƒbr=no) configurationsetforPP;AND.B#$1F,D0ƒmaskPPP,SandIbits,BUSisinPPSSstate+MOVE.BD0,IOSPOLC(A1)‚saveinusersbuffer+BSRSETPPREG‚setupparallelpollregister*JCHKPRM2ANDI.L#$7FFFFFFF,IOSSAMR(A1)ƒmaskoutbit31ofboththeReadand*‚Theonlythingthatremainsnowissec.addr.validationandD*‚toupdatetheTMS9914AinterruptmaskregistertoenablesecondaryI*‚addressingifvalidsecondaryaddresseswerenewlydefinedfortheBUS.*8OKCNFGTST.LIOSSAMR(A1)‚anysec.Readaddr'sspecified?SNED0“D0=Yes/No3TST.LIOSSAMW(A1)ˆanysec.Writeaddr'sspecified?SNED1“D1=Yes/No$MOVEQ#CECSADR,D2ˆpreseterrorcode$EOR.BD0,D1ŽBothmustbespecified! BNECNFGERRŽelseitisanerror*" TST.B DCBCDV(A4) is this the BUS? BNE.S OKCNFG3 br = noBMOVE.WTMSMASK(A5),D0‚setthecurrentstateofthe9914Amaskreg5 BSET #APTBIT,D0 set up to enable secondary adressing0 TST.L IOSSAMR(A1) any sec read addresses valid?BNE.SOKCNFG2ƒbranchifyes:BCLR#APTBIT,D0ƒelsedisablesecondaryaddressinterrupts5OKCNFG2MOVE.WD0,TMSMASK(A5)‚saveinmaskstatusreg8 MOVEP.W D0,INTR0(A2) update TMS9914A interrupt mask reg*OKCNFG3 MOVEQ #0,D0FMOVE.WIOSVARL+DCBDEV(A4),D0„D0<==lengthofvariableparameterarea@ADD.L#(IOSILN-IOSATW)/2-1,D0ƒaddinrestofconfigurationarea*MOVEM.LA0/A1,-(A7)ƒsavestartofbuffers5LEA.LIOSATW(A0),A0‚setpointerstostartofbuffers LEA.L IOSATW(A1),A1*?OKCNFG5MOVE.W(A1)+,(A0)+‚copyhisvalidatedbuffertotheCCB#DBRAD0,OKCNFG5„configurationarea*5MOVEM.L(A7)+,A0/A1ƒrestorestartofbufferpointers.EXGA0,A1‰setA0=hisbuffer,A1=CCBbuffer5BSR.SSTATYP1…setupstatusandconfigurationheaderFMOVE.B#1,DCBCCF(A4)ƒsetflagindicatingthataCONFIGUREoraCHANGE *®DEFAULTCONFIGURATIONwasdone*A*ˆThistestisperformedatthistimesoaninitialconfigurationC*ˆwilloccurevenifthereisaS.C.switch/sysgenincompatibility.*-TST.BDCBCDV(A4)‚areweconfiguringtheBUS?#BNE.SOKCNFG7‚branch=notthebus*2EXGA0,A1ƒsetA0=CCBbufferandA1=hisbuffer4MOVEQ‚#CECSCE,D2ƒpreloadinvalidS.C.configurationBBTSTW#IOASCTC,IOSATW(A0)‚areweconfiguringforS.C.capability?6 BEQ.S OKCNFG7 branch = no, else test hardware config.9 TST.B ADDRREG(A2) is the MVME300 card switch in SC mode?'BMI.SCNFGERR‚branch=no,gotoerror*0OKCNFG7MOVEQ‚#ISTAOK,D1‚setreturnstatustoOK RTSƒexit*CCNFGERR MOVE.B D2,IOSCEC(A1) save specific configuration error codeBMOVEQ‚#ISTACNF,D1‚setinvalidconfigurationfordeviceerrorcode(RTSƒexitcommonconfigurationprocessor  TTL COMMON SUBROUTINES PAGE**‚STATYP*A*ˆThisroutineisusedbyCONFIGURE,CHANGEDEFAULTCONFIGURATION;*…andREQUESTSTATUSprocessorstostorethecurrentstatus8*…informationinthestandardconfigurationareaheader.*,*ˆENTER:‚A2=baseaddressofGPIBregisters*A4=addressofDCB*A5=addressofCCB*5*ˆEXIT:ƒA0=addressofconfigurationareafordevice*!*‹RegisterUsage:ƒ01234567*›D* *›AR‡PP*ST) ATYP:0BSR.SGETCNFIGƒA0<==currentconfigurationptr*STATYP1: MOVEQ #0,D0"TST.BDCBCDV(A4)‰isthistheBUS?BNE.SSTATYP2Œbr=no'MOVE.BADDRSTAT(A2),D0ƒgetGPIBstatusAND.B#$FE,D0Œmaskoutgarbage*6STATYP2 MOVE.B D0,IOSDST(A0) put dev. status in buffer9 MOVE.B DCBDEV+IOSCTP(A4),IOSCTP(A0) set the channel type8 MOVE.B DCBDEV+IOSDTP(A4),IOSDTP(A0) set the device type/ MOVE.B #IODGPIB,IOSDRC(A0) set the driver code RTSƒexit  PAGE* *„SETPPREG*:*ˆThissubroutinewillsetorclearthedesiredbitofthe?*…parallelpollregisterforwhenaparallelpollisperformed.A*…IfboththeIndividualStatusbitandtheSensebitsareequal,>*…thebitspecifiedwillbesetintheparallelpollregister.8*…otherwisetheparallelpollregisterwouldbecleared.*;*ˆThePPregwillnotbesetifthesystemisinPPISstate.**,*ˆENTER:‚A0=pointertoconfigurationtable*A5=addressofCCB**ˆEXIT:ƒnoerrorsreturn*!*‹RegisterUsage:ƒ01234567*›D*ƒ**›AƒP* SETPPREG:!MOVE.LA1,-(A7)‚Saveenvironment MOVEQ #0,D23 MOVE.B IOSPOLC(A0),D0 get current PP configuration3BMI.SSETPR025ˆbr=InPPISstate,don'tsetPPreg'BTST#PPSENSE,D0‚isthesensebitset?BNE.SSETPR020‚branchifyes*:*‚Thesensebitisequaltozero,sotheindividualstatus8*‚mustalsobezerotosettheparallelpollstatusto1*2BTST#INDIVST,D0‚istheindividualstatusbitsetBNE.SSETPR015ƒno*$SETPR010AND.L#7,D0‚maskbitnumber'BSETD0,D2‚settoparallelpollstatus*6SETPR015MOVE.LCCBCHB(A5),A1‚A1<==ptrtoGPIBCregs:MOVE.BD2,PARLPOLL(A1)‚storeresultsinParallelpollreg$MOVE.L(A7)+,A1ƒrestoreenvironment SETPR025 RTS*:*‚Thesensebithasbeendeterminethatitisequaltoone*7SETPR020BTST#INDIVST,D0‚isindividualstatusbitset?BNE.SSETPR010„branchifyesBRA.SSETPR015„no,exit PAGE* *ƒGETCNFIG*5*ˆGetapointertothecurrentconfigurationareafor*…thedesireddevice.**ˆENTER:‚A4=addressofDCB*A5=addressofCCB*5*ˆEXIT:ƒA0=addressofconfigurationareafordevice*!*‹RegisterUsage:ƒ01234567*›D* *›AR‡PP* GETCNFIG: MOVEQ #0,D0IOCB*'*ˆONEXIT:‚D2.WISTABLEOFFSET(INDEX)+*’D1.B&=OPERATIONSTATUS(0=O.K)*8*‚FindthefunctioninthetableofvalidGPIBfunctions*GETCMDP:!ˆMOVEM.LA0/D0/D6,-(A7)saveregs5MOVE.W#NUMCMDS-1,D0ƒnumberofvalidGPIBcommands-14LEA.LIOSCMDTB(PC),A0ƒsetptrtoGPIBcommandtable1MOVE.WIOSFCT(A3),D6ƒpickupfunctionfromIOSPB8MOVEQ‚#ISTAIF,D1ƒsetinvalidcommanderrorjustincase*&GETCMD50CMP.W(A0)+,D6ƒfoundcommand?.DBEQD0,GETCMD50ƒbranchifno,looksomemore*,BNE.SGETCMDX„exitwitherror,endoftable4MOVE.W#NUMCMDS-1,D2ƒcalculaterelativetableindexSUB.WD0,D2‚D2<==tableindex"ASL.W#1,D2‚Calculatewordoffset*0MOVEQ‚#ISTAOK,D1se* tprocessO.K.returnstatus*GETCMDX TST.B D1 set return condition code$ MOVEM.L (A7)+,A0/D0/D6 restore regs RTS* 6 TTL GPIB DRIVER - COMMON SUBROUTINES (QUEUE HANDLING) PAGE**‚POPGPIBQUEUEENTRY*6*ˆIfI/Oisabortedoranoperationiscompleted,this9*…routinewillpopthatoperationfromtheGPIBqueueand9*…updatethenecessaryqueuepointers.Itisassumedthat:*…thecallerhaspreviouslyinhibitedallinterruptssince*…thisiscriticalprocessing.**’ENTER:ƒA5-addressofCCB*#*’EXIT:ƒIF„THEN‚queueisempty)*œELSE‚queuestillhasatleastoneentry*!*ŽRegisterUsage:ƒ01234567*žD *žA**‡P* POPGPIBQ:1LEA.LGPIBQEND(A5),A0‚A0<==ptrtoendofqueue.MOVE.LQTAIL(A5),A1„getcurrentqueuepointer2CMPA.LQHEAD(A5),A1„isthereanentrytoPOPoff?,BEQ.SPOPG15ŒBR=no,exitwithproper?ADDA.L#GPIBQLEN,A1„advancepointerbylengthofaqueueentryCMPA.LA0,A1…atendofqueue?BNE.SPOPG10ƒno*%* time to wrap around to top of queue*5LEA.LGPIBQ(A5),A1…setqueuepointertotopofqueue*APOPG10MOVE.LA1,QTAIL(A5)ƒupdatecurrentoperationqueuepointer„THENƒnoerrors*•ELSE„queueisfull*!*RegisterUsage:ƒ01234567 * D*‡PPPP* A*PƒPPPP* PSHGPIBQ:!MOVE.LA1,-(A7)ƒsaveenvironment4LEA.LGPIBQEND(A5),A1„A1<==endofGPIBqueuearea4MOVE.LQHEAD(A5),A0†A0<==nextavailablequeueptr*CLR.W‚CSTQOFST(A0)†setentrystatustoOK+MOVE.LA4,DCBQOFST(A0)ƒsaveaddressofDCB6MOVE.LA3,IPBQOFST(A0)ƒsavephysicaladdressofIOSPB?MOVE.LD7,PBPAOFST(A0)ƒsavephysicaladdressofprimarybufferIMOVE.LD6,SBPAOFST(A0)ƒsavephysicaladdressofsecondary/config.buffer2MOVE.WD4,PBLNOFST(A0)ƒsaveprimarybufferlength4MOVE.WD5,SBLNOFST(A0)ƒsavesecondarybufferlength;ADDA.L#GPIBQLEN,A0„incrementbylengthofonequeueentry"CMPA.LA1,A0…timetowraparound?BNE.SPSHQ010„branchifno*0LEA.LGPIBQ(A5),A0‚setptrtotopofqueuearea**PSHQ010CMPA.LQTAIL(A5),A0‚isqueuefull?5BEQ.SPSHQRTN‚yes,butthisshouldnothavehappened4 MOVE.L A0,QHEAD(A5) update next available queue ptr4MOVEQ#1,D0‚setconditioncodeforO.K.return*PSHQRTNMOVE.L(A7)+,A1ƒrestore RTSA TTL GPIB DRIVER - COMMON SUBROUTINES (VALIDATE OPERATIONAL MODE) PAGE**‚VALIDATEOPERATIONALMODE*9*ˆThisroutinewillbecalledatthepointwhenacommand:*ˆisabouttobescheduledforI/Oinitiation.Thepurpose;*ˆistodetermineiftheBUSisinthepropermodeforthis:*ˆcommandandtodetermineiftheBUSordevice(depending:*ˆonwhothiscommandisdirectedto)hasthecapabilities3*ˆ(ifanyarenecessary)toperformthisoperation.*3*’ENTER:‚A3=addressofIOSPBforcurrentfunction*šA4=addressoftheDCB*šA5=addressoftheCCB%*šD2.W=indexofcommandinVALPARTB*'*’EXIT„D1=errorcode(0ifnoerrors)* *RegisterUsage…01234567 *¡D*R****¡A**VALOPER:FLEA.LVALPARTB(PC),A0ƒA0<==baseaddressofcommandvalidationtableDMOVE.W0(A0,D2.W),D4‚D4<==bitmapofnecessarycommandparameters*?CMP.B#XDSGDEV,IOSDTP+DCBDEV(A4)‚isthiscommandforadevice?BNE.SVALOP050ƒbranchifno*@*‚SincethiscommandisdirectedtowardsadeviceandthevaluesB*‚inVALPARTBarerelativetotheBUS,theREAD/WRITEbitstakeonA*‚theopposi* temeaningthantheydidfortheBUS.‚Forexample,ifB*‚thereisawritecommandtoadevice,thevalueinVALPARTBwillB*‚indicatethatthetalkerability(VALTALK)willbenecessaryforA*‚thiscommand.‚However,thisbitwassetrelativetotheBUS.SoA*‚ifthewritecommandisdirectedtoadevice,thisrequirestheC*‚BUStobeinthetalkermodeandthedevicetobeinthelistenerB*‚mode.‚ItisforthesereasonsthattheTALKandLISTENabilitiesA*‚(VALTALKandVALLISTrespectively)areexclusiveor'dwith'11' *‚soastoinverttheirmeaning.*BMOVEQ#VALTALK+VALLIST,D0‚setupspecificcapabilitiestolookat MOVE.B D0,D39AND.BD4,D3D3=Talker/Listenercapabilityrequirements#BEQ.SVALOP050br=none,continueCMP.BD0,D3arebothrequired?-BEQ.SVALOP050br=yes,sononeedtoalter6EOR.WD0,D4else,changemeaningrelativetoadevice*C*ƒNowthatwehavethemeaningoftheabilitybitscorrectrelative;*ƒtothecommand,checkthecurrentattributeswordfortheB*ƒspecifieddevicetoseeifthedeviceorBUSiscapableofdoing*ƒthatcommand.*,VALOP050MOVE.WD4,D2‡D2<==WorkingbitmapHAND.W#VALTALK+VALLIST+VALCTL+VALSCTL+VALSRQ,D2‚anyabilitiesrequired?BEQ.SVALOP100branchifno8BSRGETCNFIGgetapointertouser'sconfigurationarea-MOVE.WD2,D3D3<==currentdeviceabilities5AND.WIOSATW(A0),D3ˆmaskabilitiesthatarerequired;CMP.BD2,D3doesthisdevice/BUShavetherightabilities.BNE.SVALOP250branchifno*C*‚Nowthattheabilityhasbeenverified,checktoseethattheBUS,*‚isinthenecessarymodeforthiscommand.**VALOP100MOVE.WD4,D2…savecurrentbitmap?AND.W#VALTMOD+VALLMOD+VALCMOD+VALBTLM,D2‚anymodesnecessary?BEQ.SVALOP500ƒbranchifno*3MOVE.WBUSACTIV(A5),D0‚D0<==currentbusactivity3CMP.B#XDSGDEV,IOSDTP+DCBDEV(A4)‚isthisadevice?BEQ.SVALOP200‚branchifyes8BTST#BVALBTLM,D4‚doweneedtobeinT/LmodeforBUS?BNE.SVALOP300‚branchifyes*5VALOP200BTST#CAC_S,D0ƒistheBUSincontrollermode/BNE.SVALOP500‚branchifyes,everythingisOK*"*‚ERROR:Amodeerrorhasoccurred*?VALOP250MOVEQ#ISTAIVCM,D1ƒsetinvalidcommandmodeerrorcodeBRA.SVALOPRTNƒexitwitherror*6VALOP300BTST#CAC_S,D0‚istheBUSincontrollermode?FBNE.SVALOP250‚branchifyes-error-can(tbeincontrollerforcmd*?*‚SincethiscommandisdirectedtotheBUS,itmayrequirethe>*‚BUStobeeitherinTalkerorListenermode.‚Checktoseeif>*‚thosemodesarerequiredforthiscommandandifsocheckto=*‚seethattheBUSisintheappropriatemode.‚TheproperT/L>*‚modecheckisskippediftheBUSisIDLE.‚Theoperationwill#*‚subsequentlybequeuedinTLPROC.*4 AND.W #1<*‚Thischeckwillseeifasecondaryaddressistobeverified<*‚forthiscommandandcheckagainstvaliddeviceaddresses.*?VALOP500BTST#BVALSADR,D4ƒcheckGPIBdevicesecondaryaddress?BEQ.SVALOP600ƒbranchifno*3 CMP.B #XDSGDEV,IOSDTP+DCBDEV(A4) Is this a device? BEQ.S VALOP520*?BTSTW#APTBIT,TMSMASK(A5)‚operatinginsecondaryaddressmode?$BEQ.SVALOP250‚branchifno(error)*5VALOP520BSRGETCNFIG‰getconfigurationptrofdeviceDMOVE.LIOSSAMR(A0),D2„D2<==bitmaskofconfiguredvalidreadS.A./BTST‚#BVALLIST,D4‚isthisasecreadfunction?BNE.SVALOP540‚branchifyesEMOVE.LIOSSAMW(A0),D2ƒD2<==bitmaskofconfiguredvalidwriteS.A.*DVALOP540‚MOVE.BIOSSAD-1(A3),D0‚getS.A.f+ romIOSPBforthisrequest@MOVEQ#ISTAIVSA,D1‚preloadinvalid/unconfiguredS.A.errorcode?BTST.LD0,D2„isthisaddrconfiguredtobevalidinthismode?'BEQ.SVALOPRTN‚exitwitherrorinD1.B*NVALOP600 BTST #BVALBCHG,D4 does commmand reequire user to be in charge of BUS?, BEQ.S VALOP700 br = no, all checks complete% MOVEQ #ISTAIVBD,D1 preset error code LEA.L CONFINFO(A5),A0*MOVE.LDVDCBPTR(A0),A0‚A0<---DCbofBUS" TST.L DCBWNT(A0) is the BUS open?/BEQ.SVALOPRTNƒbr=no,returnwitherrorcode*;*‚Themodeanddeviceisnowcapableofcompletingthetask*/VALOP700MOVEQ#ISTAOK,D1„setreturncodetoOKVALOPRTNRTS„exit @ TTL GPIB DRIVER - COMMON SUBROUTINES (HALT ALL I/O IN PROGRESS) PAGE*%*•HALTI/OTOBUSORSPECIFIEDDEVICE*>*ˆThisroutineisdesignedtohaltallI/Othatisinprogress?*ˆandanyI/OthatiswaitingtobeexecutedontheGPIBqueue.=*ˆThisroutinemaybeenvokedatinterruptorcommandlevels.>*ˆIfatcommandlevel,aHALTcommandwasreceiveddirectedto;*ˆtheBUS.Atinterruptlevel,aIFC,DCL,orTCTinterrupt<*ˆwasencountered.‚TheseinterruptscauseallpendingI/Oto *ˆbeaborted.*2*’ENTER:„A4=addressofDCBforcurrentoperation*œA5=addressofCCB*)*’EXIT:…IfD1.B=0ƒThenallentrieswere%*œmarked'Halted'andtheappropriate+*œeventsweresentforthewaitingcommands*œonthequeue.*˜ELSE*œtherewasnoI/Otohalt.*!*ŽRegisterUsage:†01234567*ŸDƒ*R*ŸA‹PP*HLTALL:+MOVEM.LD2-D7/A1-A6,-(A7)ƒsaveenvironment6MOVE.LQTAIL(A5),A6‰A6<==ptrtocurrentqueueentry(CMPA.LQHEAD(A5),A6‰isthequeueempty?+BEQHLTERR’branchifyes(nothingtohalt)*BSRRESETIO‘doasoftreset1BSRKILLSPTOcancelSerialPolltimerifrunning>LEA.LGPIBQEND(A5),A0‡A0<==addressofphysicalendofqueue*CHLTALL10BSETW#HALTED,CSTQOFST(A6)‚setthisentrystatustohalted5ADDA.L#GPIBQLEN,A6‰bumppointertonextqueueentry&CMPA.LA6,A0attheendofthequeue?BNE.SHLTALL20Žbr=no6LEA.LGPIBQ(A5),A6Šelsewraparoundtostartofqueue*>HLTALL20 CMPA.L QHEAD(A5),A6 at the end of all queued entries?'BNE.SHLTALL10Žbranchifno-continue*< BCLRW #SRQWAIT,BUSACTIV(A5) clear any potential SRQ waiting=BTSTW#BUSIOP,BUSACTIV(A5)‚isthependingI/Ointerruptset?BNE.SHLTALL30Žbranchifyes-CLR.BIOPEND(A5)ŒresetpendingtaskI/Oflag*>HLTALL30 MOVE.L QTAIL(A5),A6 A6 <== current operation on queueMOVE.LDCBQOFST(A6),A4†getDCB!MOVE.LIPBQOFST(A6),A3†getIOSPB8BSRPROCMENUcleanupandsendhaltstoqueuedcommands BRA.S HLTOK 4 TTL GPIB DRIVER - COMMON SUBROUTINES (HALT COMMAND) PAGE*6*ˆHaltI/OtoaspecificdeviceortheBUSinT/Lmode*HLTCMD:1MOVE.LQTAIL(A5),A6ƒgetpointertocurrententry(CMPA.LQHEAD(A5),A6‰isthequeueempty?(BEQ.SHLTXITbr=yes(nothingtohalt)*+MOVEM.LD2-D7/A1-A6,-(A7)ƒsaveenvironment9*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *ˆ4/24/84ƒbwn**ˆFixanOOPS!#*LEA.LGPIBQEND,A0‹setend-of-queue LEA.L GPIBQEND(A5),A0*>*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**ˆLocatethecommand*1HLTC60 CMPA.L DCBQOFST(A6),A4 is this the device?BEQ.SHLTC80br=yes*'ADDA.L#GPIBQLEN,A6‰bumptonextentryCMPA.LA6,A0endofqueue?BNE.SHLTC70br=no*0LEA.LGPIBQ(A5),A6Šelseresettostartofqueue*HLTC70CMPA.LQHEAD(A5),A6ƒendofentries?(BNE.SHLTC60br=no,continuechecking:BRA.SHLTERRentrynotfound,returnerrortoIOSrequest*5HLTC80 BSETW #HALTED,CSTQOFST(A6) mark command halted+CMPA.LQTAIL(A5),A6‰isitthecurrentI/O?BNE.SHLTOK‘br=no**BSRRESETIO‘terminateanyI/Oinprogress3MOVE.LIPBQOFST(A6),A3†setpointertouser'sIOSPBBSRPROCMENUcancelcommand0BTSTW#BUSIOP,BUSACTIV(A5)‚anyBUSI/Opending?BNE.SHLTOK‘br=yes8AND.B#$3F,IOPEND(A5)‡elseclearpendingtaskI/OFLAGS*3HLTOKMOVEM.L(A7)+,D2-D7/A1-A6ƒrestoreenvironment2+ HLTXITMOVEQ#ISTAOK,D1†setgooderrorreturncode RTS*+HLTERRMOVE.B#$FF,D1ˆseterrorreturncode.MOVEM.L(A7)+,D2-D7/A1-A6ƒrestoreenvironment RTS 7 TTL GPIB DRIVER - COMMON SUBROUTINES (BUILD NEXT MENU) PAGE**ƒBUILDNEWMENUITEM*:*ˆThisroutinewillsetupallthemenupointersnecessary<*ˆtoexecutethenextcommand.Sincethecommandhasalready9*ˆbeenvalidated,ifitisnotnowfoundintheIOSCMDTB,;*ˆthisroutinewillreturnaruntimeerrorcodetoIOSand*ˆthecommandwillbeaborted.*3*ENTER:‚A3=addressofIOSPBforcurrentfunction*—A5=addressofCCB*!*RegisterUsage:…01234567*žD‚** *žA‚*…PƒP* BUILDMEN:6MOVE.WIOSFCT(A3),D0ˆextractcurrentfunctioncommand4LEA.LIOSCMDTB(PC),A0‡tableofvalidGPIBfunctions;MOVE.L#NUMCMDS-1,D1ˆD1=numberofcommandsinGPIBtable*<*‚FindthefunctioninthetableofavailableGPIBfunctions*9BUILDM10CMP.W(A0)+,D0…comparetonextfunctionintableBEQ.SBUILDM20foundfunction?%DBRAD1,BUILDM10‹no,continuesearch*=*‚ERROR:Thisisanirrecoverableerrorbecausethisfunction9*‰wasvalidatedpreviouslyandnowamatchdidnotoccur.(*‰Somebodyoverrantheparameterbuffer.*:BUILDM15MOVEQ‚#ISTADRVE,D1‚setdriverruntimeerrorcodeRTSšexitwitherror*.*‚Matchhasbeenfoundsosetupmenupointers*JBUILDM20 MOVE.L #NUMCMDS-1,D0 subtract index from total number of commands SUB.L D1,D0ASL.L#1,D0getwordoffset9LEA.LCTLCFTBL(PC),A0…tableofcontrollermenufunctions3BTSTW#CAC_S,BUSACTIV(A5)‚GPIBincontrollermode?BNE.SBUILDM30ŒbranchifyesELEA.LTLCFTBL(PC),A0†no,settableoftalker/listenermenufunctions*;BUILDM30MOVE.W0(A0,D0.W),D1ƒgetrelativedistanceofmenu?BEQ.SBUILDM15ŠthisshouldneverhappenbutdothisifitdoesILEA.L0(A0,D1.W),A0…getabsolutepointertomenutableforthisfunction+MOVE.LA0,MENU(A5)†settopofmenupointer2MOVE.LA0,MENUNPOS(A5)‚setnextmenuitempointerMOVEQ‚#ISTAOK,D1‡goodreturn RTS•exit3 TTL GPIB DRIVER - COMMON SUBROUTINES (QUEUE EVENT) PAGED*********************************************************************5*‰QUEUEACOMPLETIONEVENTTOTHEATTACHEDTASK(IOS)*;*‰ThisroutinecallstheexectosendasmalleventtoIOS.9*‰UsesQEVNTIifwe'reprocessinganinterruptandQEVNTT*‰ifwe'renot.*8*‰NOTE:‚Thisroutineiscompletelyre-entrantandmaybe2*runatanytime.‚Allworkiscompletelyregister3*oriented.‚Allmessagesareassumedtobe10bytes*inlength!!!!!!**‰Entry:D1.W=eventstatus*D4.B=eventtype*A4=addressofDCB.*A5=addressofCCB.**‰Exit:‚D0=garbage.*D1=garbage.*;*‰Thestructureoftheeventyoumustsupplyisasfollows:*‹BYTES‚MEANING@*‰*ƒ1„eventlengthassumingnoserviceaddress(always10bytes)4*‰*ƒ1„eventcode(1ifnoserviceaddress,else$81)*1„eventtype*‰*ƒ1„channelkey<*‰*ƒ4„ID(DCBaddressforussincewe'reastandardchannel)*2„statusvalue*@*‰Fieldsmarkedby*areplacedintheeventbythisroutineand%*‰neednotbepreparedbythecaller.@*‰IfaserviceaddresswasspecifiedfortheI/O,itisinsertedD*‰beforetheeventtypefield,andeventlengthisupdateby4bytes>*‰andtheeventcodewillbemodifiedtoindicateacompletion:*‰serviceaddressispresent(MSBofeventcodeisa"1").*J************************************************************************** QEVENT:>ŠMOVEM.LD2-D7/A0-A6,-(A7)Savetheregisterswe'llblowaway.*0*‚Startsettingthosevalueswhichneverchange.*!ŠMOVE.WD1,D6’D6<==eventstatusBŠMOVE.W#(10*256)+IOEVCD,D2„D2<==prepareeventlength/eventcode#ŠMOVE.LA4,D5’D5<==addressofDCB3ŠASL.W#8,D4“shifteventtypetoupperbyteofword7ŠMOVE.BCCBKEY(A5),D4ŠSetthechannelkeyinlowerbyte0ŠAND.L#$FF,D6‘clearupperbytesofeventstatus*C*‚Iftherewasaserviceaddressspecified,gobackandfixthings.*AŠMOVE., LCCBSVVC(A5),D3…isacompletionserviceaddressspecified?ŠBEQ.SQEVT010branchifno*-ŠADDI.W#4*256,D2ŠadjusteventlengthforCSA7ŠMOVE.B#$80+IOEVCD,D2…adjusteventcodetosetCSAbit***ˆStageallregistersforeventprocessing*-QEVT010ƒSWAPD2“stageeventlength/eventcodeŠTST.LD3’anyCSAspecified?ŠBEQ.SQEVT020branchifno*,*ˆStageregistersforeventwithCSAaddress*ŠSWAPD3 ŠMOVE.WD3,D2 ŠMOVE.WD4,D3 ŠMOVE.LD5,D4 ŠMOVE.LD6,D5ŠSWAPD5ŠBRA.SQEVT030*3*ˆStageallregistersforeventwithnoCSAaddress*QEVT020ƒMOVE.WD4,D2 ŠMOVE.LD5,D3 ŠMOVE.LD6,D4ŠSWAPD4 ŠCLR.LD5*&*‚Dotheexeccalltoqueuetheevent.*FQEVT030ƒMOVE.LCCBRQSTA(A5),A0„A0<--addressofTCBofattachedtask.0ŠMOVEQ‚#T0QEVNTI,D0‡D0<--theQEVNTIdirective.7ŠTST.B‚BINTCNT(A5)ˆIfwe'renotqueueingtheeventfrom(ŠIF…THENŠwithintheinterrupttour,0ŠMOVEQ‚#T0QEVNTT,D0‡D0<--theQEVNTTdirective.ŠENDI–* *ŠTRAPƒ#0‘Calltheexectoqueuetheevent. ŠBRA„OKEVENTŒIfgood,goreturn.(ŠTR0$.KILLER,Ifbad,crashthesystem. COKEVENTƒMOVEM.L(A7)+,D2-D7/A0-A6Restoretheregistersandreturn.ŠRTS—* 4 TTL GPIB DRIVER - INTERRUPT PROCESSING (SEND EVENT) PAGEF*********************************************************************** *‚SENDUEVT*5*ˆThepurposeofthistask‚istosendaneventtothe9*„usertaskfromthedeviceI/Odriver.‚Thistaskmustbe7*„runatinterruptlevelorelsethesystemwillcrash.:*„Currentlythereare7reasonsforthiseventontheGPIB>*„andtheyare:SRQ,RLC,DCL,TCT,GET,IFC,andI/Opending.**ˆENTER:‚D0.B=eventtype*D1.B=eventstatus3*A4.L=addressofDCBofdeviceassoc.withevent*A5.L=addressofCCB*.*ˆEXIT:ƒeventwassentorelsesystemcrashed.* *’RegisterUsage‚01234567* D** * A*‡PP*9*ˆNOTE:ƒTheentrypointSENDUEVS:isusedwhenanon-zero6*eventstatus(passedinD1.B)willbesentinevent.%*OtherwiseuseSENDUEVTentrypoint.*6*ˆNOTE:‚Thisroutinewillchecktoseethatthedevice-*specifiedbytheDCBpointerisopenbefore0*tryingtosendtheevent.‚Ifthedeviceisnot1*open,anattemptwillbemadetosendtheevent.*totheBUS.‚IftheBUSisnotopentheevent*willbediscarded.*C******************************************************************* SENDUEVT:&MOVEQ#0,D1‰preloadzeroeventstatus*DSENDUEVS: MOVEM.L D2-D7/A0-A6,-(A7) save regs that may get destroyed6TST.B‚BINTCNT(A5)ƒmakesureweareatinterruptlevelBBEQ.S‚SENDUEOK†br=no,fatalerror!BUTDON'TCRASH,justignore; MOVE.L DCBAID(A4),A2 A2 = DCB I.D. of event causing device*9SENDUE05 TST.L DCBTSK(A4) is this device claiming Events?/BNE.SSENDUE07‹branch=yes,gosendtheevent1TST.BDCBCDV(A4)‰isthisdevicealreadytheBUS?3BEQ.SSENDUEOKbr=yes,thenthrowtheeventaway)MOVE.LDCBSUP(A4),A4‡elsegotrytheBUSBRA.SSENDUE05Žgotryagain!*7SENDUE07ASL.W#8,D0‡putAsynceventtypeinhighbyte,&MOVE.BD1,D0†addineventstatusbyteMOVE.WD0,-(A7)ƒsaveonstack/MOVE.LA2,-(A7)ƒsavedeviceI.D.dataonstackK MOVE.W #(AILNG*256)+AIEVCD,-(A7) PUSH event length + Async event type code*.MOVE.LDCBSES(A4),D1‚D1=tasksessionnumber$MOVE.LDCBTSK(A4),A0‚A0=taskname.MOVEQ#13,D0†Call'GTXTCB'fortherightinfo TRAP #0) BRA.S SENDUE10 good, A0 = address of TCB'MOVEM.L(A7)+,D2-D3‚Cleanupthestack( BRA.S SENDUEOK bad, go throw away event*BSENDUE10MOVEM.L(A7)+,D2-D3ƒstagetheregistersforRMS68KQEVENT.MOVEQ#T0QEVNTI,D0‚initiateQEVENTIdirective TRAP #0NOPŒgoodevent*5*ƒIfwereturnheredirectlytheeventwasn'tqueued!!*ˆIgnoretheerrorandkeepgoing*6SENDUEOK MOVEM.L (A7)+,D2-D7/A0-A6 restore environment RTS , éééééé' TTL GPIB MENU ITEM TABLE - GPIB TABLES PAGEE********************************************************************** *COMMANDI/OMENUDRIVERTABLES*E**********************************************************************=*…THEFOLLOWINGCOMMANDI/OMENUSAREUSEDTOCOORDINATEGPIB<*…TRANSMISSIONPROTOCOLONTHEBUS.MENUSAREGENERATEDEACH:*…TIMEAREQUESTFROMIOSISMADETOTHEDRIVER.EACHMENU=*…CONSISTSOFSEVERALMENUITEMSEACHOFWHICHHASASPECIFIC?*…TASKTOACCOMPLISHORINITIATE.ONLYONEMENUMAYBEEXECUTED?*…ATATIMEANDANYREQUESTSFORI/OTHATOCCURWHILEEXECUTINGA*…AMENUAREQUEUEDUPANDWILLBEPROCESSEDWHENITSTURNCOMES.9*…MENUITEMSCONSISTOFESSENTIALLYFOURDIFFERENTTYPES:**…1.COMMANDITEMS(BUSCMD)*?*ˆTHESEWILLSENDIEEE-488COMMANDSTOTHEGPIBCINTERFACEWITH@*ˆTHEATNLINETRUE.ALLTHESETYPESAREDESIGNATEDBYTHEMACRO*ˆBUSCMD.*&*…2.AUXILLIARYCOMMANDITEMS(AUXCMD)*5*ˆAUXILLIARYCOMMANDSAREMENUITEMSTHATAREWRITTEN<*ˆDIRECTLYTOTHEAUXILIARYCOMMANDREGISTEROFTHETMS9914A?*ˆREGARDLESSOFTHETHESTATEOFTHEATNLINEANDAREGENERATED*ˆBYAUXCMDMACROCALL.*,*…3.DATAINPUT/OUTPUTMENUITEMS(DATAXFER)*@*ˆTHESEINITIATETHEACTUALDATADMATRANSFER.THECOMPLETIONOF@*ˆTHESECOMMANDSISPROMPTEDBYANI/OCOMPLETEINTERRUPTBYTHE3*ˆGPIBC.THESETYPESARECALLEDWITHDATAXFR.*#*…4.FUNCTIONMENUITEMS(FUNCTION)*7*ˆTHESECAUSESOMESORTOFMENUFUNCTIONTOTAKEPLACE.>*ˆFOREXAMPLE,THEFUNCTIONMENUITEMSIGNIFIESTHETHIS>*ˆMENUPACKETISCOMPLETEANDTHATTHEMENUPROCESSORISREADY?*ˆFORANEWMENU.ALLTHESETYPESOFCOMMANDSAREPREFIXEDWITH *ˆTHEMACROCALLFUNCTION.*D******************************************************************** SECTION 0 DS 0*D**********************************************************************ˆFUNCTION:INPUTDATA*?*ˆFUNCTIONCODETOINITIATEMENU:IOREAD‚(CONTROLLERMODEONLY)* Ž6—BŸ?§A¯@·B¿@ÇDÏC×Fß?ç0ï+÷0ÿ<5(/<*ˆPURPOSE:TOINITIATEDMAWRITE(WRITEINTOMEMORY)OFDATA*C********************************************************************INP_DATABUSCMDUNT„UNTALKˆBUSCMDUNL„UNLISTEN%ˆBUSCMDOTA„SENDPRIMARYTALKADDRESSˆDATAXFRIN„DMAWRITE(I- NPUT)ˆBUSCMDUNT„UNTALKˆFUNCTIONEND„ENDOFMENUˆDS.W0ŠASSUREWORDALIGNMENT*C*********************************************************************ˆFUNCTION:OUTPUTDATA*?*ˆFUNCTIONCODETOINITIATEMENU:IOWRIT(CONTROLLERMODEONLY)*:*ˆPURPOSE:TOINITIATEDMAREAD(READFROMMEMORY)OFDATA*D*********************************************************************OUT_DATABUSCMDUNTˆUNTALK‰BUSCMDUNLˆUNLISTEN'‰BUSCMDLAGˆSENDPRIMARYLISTENADDRESS‰DATAXFROUT‡DMAREAD(OUTPUT)#‰DATAXFRTERM†SENDTERMINATINGCHAR'‰DATAXFRSEOI†SEND'EOI'WITHLASTBYTE‰BUSCMDUNLˆUNLISTEN‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT*D**********************************************************************ˆFUNCTION:OUTPUTWITHINPUT*?*ˆFUNCTIONCODETOINITIATEMENU:IOOWIN‚(CONTROLLERMODEONLY)*8*ˆPURPOSE:TOPERFORMANDOUTPUTFUNCTIONFOLLOWEDBYAN'*‘INPUTFUNCTIONWITHONEMENUREQUEST.*D*********************************************************************OWI_DATABUSCMDUNTˆUNTALK‰BUSCMDUNLˆUNLISTEN'‰BUSCMDLAGˆSENDPRIMARYLISTENADDRESS'‰DATAXFROUT‡INITIATEDMAREAD(OUTPUT)&‰DATAXFRTERM†SENDTERMINATINGCHAR(S)'‰DATAXFRSEOI†SEND'EOI'WITHLASTBYTE‰BUSCMDUNLˆUNLISTEN%‰BUSCMDOTAˆSENDPRIMARYTALKADDRESS&‰DATAXFRINˆINITIATEDMAWRITE(INPUT)‰BUSCMDUNTˆUNTALK‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E***********************************************************************ˆFUNCTION:REQUESTSTATUS*3*ˆFUNCTIONCODETOINITIATEMENU:IOSTATƒ(ANYMODE)*7*ˆPURPOSE:‚STANDARDIOSREQUESTSTATUSFUNCTIONCOMMAND*E**********************************************************************)REQ_STATFUNCTIONFREQSTATƒREQUESTSTATUS‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E********************************************************************** *ˆFUNCTION:CHANGECONFIGURATION*3*ˆFUNCTIONCODETOINITIATEMENU:IOCNFGƒ(ANYMODE)*=*ˆPURPOSE:‚STANDARDIOSCHANGECONFIGURATIONFUNCTIONCOMMAND*E**********************************************************************6CNFG_DEVFUNCTIONFCNFGDEVƒCHANGEDEVICECONFIGURATION‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E**********************************************************************(*ˆFUNCTION:CHANGEDEFAULTCONFIGURATION*3*ˆFUNCTIONCODETOINITIATEMENU:IOCHDC‚(ANYMODE)*7*ˆPURPOSE:‚STANDARDIOSCHANGEDEFAULTFUNCTIONCOMMAND*E**********************************************************************7CH_DEFLTFUNCTIONFCHDEFLTƒCHANGEDEFAULTCONFIGURATION‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*D*********************************************************************"*ˆFUNCTION:COMMANDOUT/DATAOUT*?*ˆFUNCTIONCODETOINITIATEMENU:IOCODO‚(CONTROLLERMODEONLY)*9*ˆPURPOSE:TOALLOWTHEUSERTOSENDNON-STANDARDCOMMAND1*‘SEQUENCES(ATNTRUE)FOLLOWEDBYADATASTRING.*D*********************************************************************7CDAT_OUTBUSCMDAUXˆSENDCOMMANDSTRINGFROMAUXBUFFER‰BUSCMDUNTˆUNTALK'‰DATAXFROUT‡INITIATEDMAREAD(OUTPUT)#‰DATAXFRTERM†SENDTERMINATINGCHAR'‰DATAXFRSEOI†SEND'EOI'WITHLASTBYTE‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E**********************************************************************!*ˆFUNCTION:COMMANDOUT/DATAIN*?*ˆFUNCTIONCODETOINITIATEMENU:IOCODI‚(CONTROLLERMODEONLY)*;*ˆPURPOSE:TOALLOWTHEUSERTOSENDANON-STANDARDCOMMAND-*‘SEQUENCE(ATNTRUE)FOLLOWEDBYANINPUTOF*‘DATACOMMAND.*E**********************************************************************6CDAT_IN‚BUSCMDAUXˆSENDCOMMANDSTRINGFROMAUXBUFFER%‰DATAXFRINˆINTIATEDMAWRITE(INPUT)‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E***********************************************************************ˆFUNCTION:COMMAN- DOUT*?*ˆFUNCTIONCODETOINITIATEMENU:IOCMDO‚(CONTROLLERMODEONLY)*;*ˆPURPOSE:TOALLOWTHEUSERTOSENDANON-STANDARDCOMMAND*‘SEQUENCE(ATNTRUE).*E**********************************************************************6CMD_OUT‚BUSCMDAUXˆSENDCOMMANDSTRINGFROMAUXBUFFER‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E**********************************************************************"*ˆFUNCTION:READSECONDARYADDRESS*?*ˆFUNCTIONCODETOINITIATEMENU:IORSEC‚(CONTROLLERMODEONLY)*8*ˆPURPOSE:SIMILARTOINPUTDATAEXCEPTTHATASECONDARY*‘ADDRESSMUSTBESPECIFIED.*E**********************************************************************READ_SECBUSCMDUNTˆUNTALK‰BUSCMDUNLˆUNLISTEN ‰BUSCMDOTAˆPRIMARYTALKADDRESS‰BUSCMDOSAˆSECONDARYADDRESS&‰DATAXFRINˆINITIATEDMAWRITE(INPUT)‰BUSCMDUNTˆUNTALK‰FUNCTIONEND…ENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENTE**********************************************************************#*ˆFUNCTION:WRITESECONDARYADDRESS*?*ˆFUNCTIONCODETOINITIATEMENU:IOWSEC‚(CONTROLLERMODEONLY)*9*ˆPURPOSE:SIMILARTOOUTPUTDATAEXCEPTTHATASECONDARY*‘ADDRESSMUSTBESPECIFIED*D*********************************************************************WRITE_SECBUSCMDUNT‡UNTALK‰BUSCMDUNLˆUNLISTEN"‰BUSCMDLAGˆPRIMARYLISTENADDRESS‰BUSCMDOSAˆSECONDARYADDRESS'‰DATAXFROUT‡INITIATEDMAREAD(OUTPUT)2‰DATAXFRTERM†SENDTERMINATIONCHAR(IFNECESSARY)'‰DATAXFRSEOI†SEND'EOI'WITHLASTBYTE‰BUSCMDUNLˆUNLISTEN‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT*C********************************************************************%*ˆFUNCTION:UNCONFIGUREPARALLELPOLL*>*ˆFUNCTIONCODETOINITIATEMENU:IOPPU‚(CONTROLLERMODEONLY)*1*ˆPURPOSE:TORESETALLDEVICESOFTHEIRPARALLEL*‘POLLCONFIGURATIONSTATE.*C********************************************************************5PP_UNCFGBUSCMDPPUˆPARALLELPOLLUNCONFIGURECOMMAND‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*B*******************************************************************#*ˆFUNCTION:CONFIGUREPARALLELPOLL*>*ˆFUNCTIONCODETOINITIATEMENU:IOPPC‚(CONTROLLERMODEONLY)*6*ˆPURPOSE:TOCONFIGUREWHICHOF8PARALLELPOLLLINES+*‘THESPECIFIEDDEVICEISTORESPONDONWHEN*‘PARALLELPOLLED.*A******************************************************************PP_CNFIGBUSCMDUNTˆUNTALK‰BUSCMDUNLˆUNLISTEN"‰BUSCMDLAGˆPRIMARYLISTENADDRESS+‰BUSCMDPPCˆPARALLELPOLLCONFIGURECOMMAND(‰BUSCMDPPEˆSENDPOLLANDSENSEBITINFO‰BUSCMDUNLˆUNLISTEN‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*@*****************************************************************!*ˆFUNCTION:CONDUCTPARALLELPOLL*?*ˆFUNCTIONCODETOINITIATEMENU:IOPPOL(CONTROLLERMODEONLY)*=*ˆPURPOSE:ALLOWACTIVECONTROLLERTOPARALLELALLCONFIGURED-*‘DEVICES(I.E.DEVICESWHOAREPARALLELPOLL'*‘CONFIGURED)ANDRECEIVETHEIRSTATUS.*B*******************************************************************-COND_PP‚AUXCMDTCSŠTAKECONTROLSYNCHRONOUSLY,‰FUNCTIONFRPP‡REQUESTPARALLELPOLLROUTINE‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E**********************************************************************$*ˆFUNCTION:SETPARALLELPOLLSTATUS*8*ˆFUNCTIONCODETOINITIATEMENU:IOSPPS‚(T/LMODEONLY)*:*ˆPURPOSE:‚SETUPTHEPARALLELPOLLRESPONSEBIT(PPR)AND*’THESENSEBIT(S).*E**********************************************************************/SET_PPƒFUNCTIONFSETPP…SETPARALLELPOLLSTATUS‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*E**********************************************************************"*ˆFUNCTION:SETSERIALPOLLSTATUS*8*ˆFUNCTIONCODETOINITIATEMENU:IOSSPS(T/LMODEONLY)*5*ˆPURPOSE:‚SETTHEVALUETOBERETURNEDTOTHEACTIVE'*’CONTROLLERWHENWE. ARESERIALPOLLED.*E**********************************************************************-SET_SPƒFUNCTIONFSETSP…SETSERIALPOLLSTATUS‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*C********************************************************************'*ˆFUNCTION:DEVICESTATUS(SERIALPOLL)*?*ˆFUNCTIONCODETOINITIATEMENU:IOSPOL(CONTROLLERMODEONLY)*2*ˆPURPOSE:CONDUCTSERIALPOLLOFSPECIFIEDDEVICE*B*******************************************************************COND_SP‚BUSCMDUNTˆUNTALK‰BUSCMDUNLˆUNLISTEN#‰BUSCMDSPEˆSENDSERIALPOLLENABLE%‰BUSCMDOTAˆSENDPRIMARYTALKADDRESS%‰DATAXFRSPB‡RECEIVESERIALPOLLBYTE"‰BUSCMDSPDˆLEAVESERIALPOLLMODE‰BUSCMDUNTˆUNTALK‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*C********************************************************************!*ˆFUNCTION:PARALLELPOLLDISABLE*>*ˆFUNCTIONCODETOINITIATEMENU:IOPPD‚(CONTROLLERMODEONLY)*@*ˆPURPOSE:TODISABLEADEVICEFROMSENDINGASTATUSBITMESSAGE!*‘INRESPONSETOAPARALLELPOLL.*C********************************************************************PP_DISABBUSCMDUNTˆUNTALK‰BUSCMDUNLˆUNLISTEN ‰BUSCMDLAGˆLISTENADDRESSGROUP#‰BUSCMDPPCˆPARALLELPOLLCONFIGURE)‰BUSCMDPPDˆPARALLELPOLLDISABLECOMMAND‰BUSCMDUNLˆUNLISTEN‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT*C*********************************************************************ˆFUNCTION:INTERFACECLEAR*C*ˆFUNCTIONCODETOINITIATEMENU:IOSIFC(SYSCONTROLLERMODEONLY)*1*ˆPURPOSE:TOALLOWTHESYSTEMCONTROLLERTOSEND**‘THEINTERFACECLEARCOMMANDTOTHEGPIBC*C********************************************************************'INTF_CLRFUNCTIONFSIC…SENDIFCCOMMAND‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT*C*********************************************************************ˆFUNCTION:REMOTEENABLE*C*ˆFUNCTIONCODETOINITIATEMENU:IOSREN(SYSCONTROLLERMODEONLY)*1*ˆPURPOSE:TOALLOWTHESYSTEMTOSENDTHEREMOTE*‘ENABLEMESSAGETOTHEGPIBC.*C********************************************************************.REM_ENABAUXCMDSRE1ˆSENDREMOTEENABLE(CS=1)‰FUNCTIONEND‰ENDOFMENU‰DS.W0ASSUREWORDALIGNMENT*C*********************************************************************ˆFUNCTION:REMOTEDISABLE*C*ˆFUNCTIONCODETOINITIATEMENU:IOCREN(SYSCONTROLLERMODEONLY)*1*ˆPURPOSE:TOALLOWTHESYSTEMTOSENDTHEREMOTE*‘DISABLEMESSAGETOTHEGPIBC.*C********************************************************************/REM_DNABAUXCMDSRE0ˆSENDREMOTEDISABLE(CS=0)‰FUNCTIONEND‰ENDOFMENU‰DS.W0ASSUREWORDALIGNMENT*C********************************************************************2*ˆFUNCTION:ENTRYI:ABORTBUSANDDEVICEMESSAGES*’ENTRYII:‚CLEARALLDEVICES*F*ˆFUNCTIONCODETOINITIATEMENU:I.IOABT1(SYSCONTROLLERMODEONLY)#*¨II.IOSDCL(CONTROLLERMODEONLY)*7*ˆPURPOSE:TOHALTALLACTIVITYONTHEGPIBCBYSENDING/*‘THEINTERFACECLEARANDDEVICECLEARMESSAGES*C********************************************************************2S_IFCDCLFUNCTIONFSIC‡SENDINTEFACECLEARCOMMAND*S_DCL„BUSCMDDCLŠSENDDEVICECLEARCOMMAND‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*C********************************************************************%*ˆFUNCTION:LOCALLOCKOUTALLDEVICES*?*ˆFUNCTIONCODETOINITIATEMENU:IOSLLO‚(CONTROLLERMODEONLY)*-*ˆPURPOSE:ALLOWUSERTOSENDOUTLLOCOMMAND*C********************************************************************$S_LOCLOKBUSCMDLLOŠSENDLLOCOMMAND‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*C********************************************************************!*ˆFUNCTION:ABORTDEVICEMESSAGES*?*ˆFUNCTIONCODETOINITIATEMENU:IOABT2(CONTROLLERMODEONLY)*0*ˆPURPOSE:TOHALTANYI/OTODEVI. CES‚BYSENDING"*‘THEUNTALKANDUNLISTENCOMMANDS*B*******************************************************************S_UNTUNLBUSCMDUNTŠSENDUNTALK‰BUSCMDUNLŠSENDUNLISTEN‰FUNCTIONENDŠENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*A*******************************************************************ˆFUNCTION:TAKECONTROL*?*ˆFUNCTIONCODETOINITIATEMENU:IOTCTL(CONTROLLERMODEONLY)*1*ˆPURPOSE:TOALLOWUSERTOREGAINCONTROLOFTHE)*‘BUSATANYTIMEPROVIDEDHEHASCONTROL-*‘OFTHEBUSANDHASCONTROLLERCAPABILITIES.*A******************************************************************/TAKE_CTLFUNCTIONFTAKCTL‚TAKECONTROLFUNCTION‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT*A*******************************************************************ˆFUNCTION:GOTOSTANDBY*>*ˆFUNCTIONCODETOINITIATEMENU:IOGTS(CONTROLLERMODEONLY)*2*ˆPURPOSE:TOALLOWUSERTORELEASECONTROLOFTHE)*‘BUSATANYTIMEPROVIDEDHEHASCONTROL-*‘OFTHEBUSANDHASCONTROLLERCAPABILITIES.*A******************************************************************,GO_STBY‚FUNCTIONFGTS…GOTOSTANDBYFUNCTION‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT    A*******************************************************************ˆFUNCTION:REQUESTCONTROL*(*ˆFUNCTIONCODETOINITIATEMENU:IORQCL*5*ˆPURPOSE:TOALLOWUSERTOINITIALLYTAKECONTROLOF-*‘THEBUSAFTERTHESYSTEMISINITIALIZEDAND'*‘THEMVME-300HASCOMEUPINT/LMODE./*‘THISCOMMANDWILLPUTTHETMS9914INTO'CACS'.*‘ANDALLOWNORMALCONTROLLERFUCTIONSWITHOUT!*‘HAVETOBEASYSTEMCONTROLLER.*A******************************************************************1REQ_CTL‚FUNCTIONFREQCTL‚REQUESTCONTROLFUNCTION‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT*A*******************************************************************ˆFUNCTION:RELEASECONTROL*(*ˆFUNCTIONCODETOINITIATEMENU:IORLCL*2*ˆPURPOSE:TOALLOWUSERTOGIVEUPCONTROLOFTHE)*‘BUSATANYTIMEPROVIDEDHEHASCONTROL+*‘OFTHEBUS.‚THISCOMMANDSIMPLYDROPSTHE+*‘ATNLINEONTHEBUSANDSWITCHESTHEGPIB%*‘DRIVERFROMCONTROLLERTOT/LMODE.#*‘(THE9914GOESINTO'CIDS'STATE)*A******************************************************************1REL_CTL‚FUNCTIONFRELCTL‚RELEASECONTROLFUNCTION‰FUNCTIONEND†ENDOFMENU‰DS.W0ŒASSUREWORDALIGNMENT*A*******************************************************************ˆFUNCTION:PASSCONTROL*?*ˆFUNCTIONCODETOINITIATEMENU:IOPCTL(CONTROLLERMODEONLY)*3*ˆPURPOSE:TOALLOWUSERTOPASSCONTROLTOANOTHER)*‘DEVICEONTHEBUSCAPABLEOFCONTROLLER*‘RESPONSIBILITIES.*B*******************************************************************PASS_CTLBUSCMDUNTŠSENDUNTALK‰BUSCMDUNLŠSENDUNLISTEN%‰BUSCMDOTAŠSENDPRIMARYTALKADDRESS‰BUSCMDTCTŠSENDTAKECONTROL/‰FUNCTIONFRELCTL„ISSUERELEASECONTROLCOMMAND‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*A******************************************************************"*ˆFUNCTION:CLEARSPECIFIEDDEVICE*?*ˆFUNCTIONCODETOINITIATEMENU:IOSSDC‚(CONTROLLERMODEONLY)*$*ˆPURPOSE:TOCLEARSPECIFIEDDEVICE*B*******************************************************************SPEC_CLRBUSCMDUNTŠUNTALK‰BUSCMDUNLŠUNLISTEN"‰BUSCMDLAGŠPRIMARYLISTENADDRESS"‰BUSCMDSDCŠSELECTIVEDEVICECLEAR‰BUSCMDUNLŠUNTALK‰FUNCTIONENDŠENDOFMENU‰DS.W0ŽASSUREWORDALIGNMNET*A******************************************************************%*ˆFUNCTION:CLEARADDRESSEDLISTENERS*?*ˆFUNCTIONCODETOINITIATEMENU:IODSDC‚(CONTROLLERMODEONLY)*!*ˆPURPOSE:TOCLEARALLLISTENERS*B********************************************************************ADDR_CLRBUSCMDSDCŠSELECTIVEDEVICECLEAR‰FUNCTIONENDŠENDOFMENU‰DS.W0ŽASSUREWORDALIGNMNET*A**********************************/ ********************************!*ˆFUNCTION:SPECIFIEDGOTOLOCAL*A*ˆFUNCTIONCODETOINITIATEMENU:IOSGTL‚(CONTROLLER&T/LMODES)*2*ˆPURPOSE:TOPUTSPECIFIEDLISTENERINLOCALMODE*B*******************************************************************SPEC_GTLBUSCMDUNTŠUNTALK‰BUSCMDUNLŠUNLISTEN"‰BUSCMDLAGŠPRIMARYLISTENADDRESS‰BUSCMDGTLŠGOTOLOCALCOMMAND‰BUSCMDUNLŠUNLISTEN‰FUNCTIONENDŠENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*A******************************************************************+*ˆFUNCTION:ADDRESSEDLISTENERSGOTOLOCAL*A*ˆFUNCTIONCODETOINITIATEMENU:IODGTL‚(CONTROLLER&T/LMODES)*3*ˆPURPOSE:TOPUTADDRESSEDLISTENERSINLOCALMODE*B*******************************************************************'ADDR_GTLBUSCMDGTLŠGOTOLOCALCOMMAND‰FUNCTIONENDŠENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*B*********************************************************************ˆFUNCTION:REMOTEENABLESPECIFIEDDEVICE*?*ˆFUNCTIONCODETOINITIATEMENU:IODREM‚(CONTROLLERMODEONLY)*5*ˆPURPOSE:TOPLACEASPECIFIEDDEVICEINREMOTEMODE*B*******************************************************************'SPEC_REMAUXCMDSRE1‰SENDREMOTEENABLE‰BUSCMDUNTŠUNTALK‰BUSCMDUNLŠUNLISTEN"‰BUSCMDLAGŠPRIMARYLISTENADDRESS‰BUSCMDUNLŠUNLISTEN‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*A******************************************************************$*ˆFUNCTION:TRIGGERSPECIFIEDDEVICE*?*ˆFUNCTIONCODETOINITIATEMENU:IOSGET‚(CONTROLLERMODEONLY)*(*ˆPURPOSE:TOTRIGGERASPECIFIEDDEVICE*>***************************************************************SPEC_GETBUSCMDUNTŠUNTALK‰BUSCMDUNLŠUNLISTEN"‰BUSCMDLAGŠPRIMARYLISTENADDRESS&‰BUSCMDGETŠSENDGROUPEXECUTETRIGGER‰BUSCMDUNLŠUNLISTEN‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*A******************************************************************'*ˆFUNCTION:TRIGGERADDRESSEDLISTENERS*?*ˆFUNCTIONCODETOINITIATEMENU:IODGET‚(CONTROLLERMODEONLY)*-*ˆPURPOSE:TOTRIGGERALLADDRESSEDLISTENERS*>***************************************************************.ADDR_GETBUSCMDGETŠSENDGROUPEXECUTETRIGGER‰FUNCTIONENDˆENDOFMENU‰DS.W0ŽASSUREWORDALIGNMENT*B*******************************************************************-*ˆFUNCTION:PRIMARYANDSECONDARYREADTOBUS*’ENTRYPOINTI:‚SECONDARYREAD*’ENTRYPOINTII:PRIMARYREAD*;*ˆFUNCTIONCODETOINITIATEMENU:I:IORSEC‚(T/LMODEONLY)*§II:IOREAD‚(T/LMODEONLY)*1*ˆPURPOSE:‚ALLOWOWNEROFBUSTOMAKEPRIMARYAND-*’SECONDARYREADREQUESTSFROMTHECONTROLLER *’INCHARGE.B*******************************************************************$RSEC_TLEQU*READSECONDARYADDRESS8INTL_DATDATAXFRINŠREADDATA‚(WHENCONTROLLERREQUESTS)FUNCTIONENDENDOFMENUDS.W0–ASSUREWORDALLIGNMENT*E**********************************************************************0*ˆFUNCTION:PRIMARYANDSECONDARYWRITEFROMBUS *’ENTRYPOINTI:‚SECONDARYWRITE*’ENTRYPOINTII:PRIMARYWRITE*;*ˆFUNCTIONCODETOINITIATEMENU:I:IOWSEC‚(T/LMODEONLY)*§II:IOWRIT‚(T/LMODEONLY)*1*ˆPURPOSE:‚ALLOWOWNEROFTHEBUSTOMAKEPRIMARY0*’ANDSECONDARYWRITEREQUESTSTOTHECONTROLLER *’INCHARGE.*D*********************************************************************%WSEC_TLEQU*WRITESECONDARYADDRESS:OUTL_DATDATAXFROUT‰WRITEDATA‚(WHENCONTROLLERREQUESTS)8DATAXFRTERMSENDTERMINATIONCHARACTERS(IFNECESSARY)'DATAXFRSEOISEND'EOI'WITHLASTBYTEFUNCTIONENDENDOFMENUDS.W0–ASSUREWORDALLIGNMENT*B*******************************************************************1*ˆFUNCTION:OUTPUTWITHINPUTCOMMANDINT/LMODE*8*ˆFUNCTIONCODETOINITIATEMENU:IOOWIN‚(T/LMODEONLY)*7*ˆPURPOSE:‚COMBINATIONOFTHEPRIMARYWRITEFOLLOWEDBY%*’PRIMARYREADOPERATIONINT/LMODE.*B**********************************/ *********************************:OITL_DATDATAXFROUTƒWRITEDATA(WHENCONTROLLERREQUESTS)&DATAXFRTERMŠSENDMESSAGETERMINATORS'DATAXFRSEOIŠSEND'EOI'WITHLASTBYTE0DATAXFRINŒREADDATA(WHENCONTROLLERREQUESTS)FUNCTIONENDŠENDOFMENUDS.W0ASSUREWORDALLIGNMENT TTL GPIB DRIVER - DRIVER TABLES PAGEB*************************************************************************´********’MENUITEMCODEJUMPTABLE•**À*/*†THISTABLEISINDEXEDBYTHEMENUELEMENTS.*7*†THEORDEROFTHISTABLEMUSTREMAINCONSISTENTWITH‡*%*†THEVALUESASSIGNEDTOEACHITEM.™********´*******B****************************************************************** MENUCTBL:DC.W0‘ENDOFMENUINDICATOR*DC.WSENDUNT-MENUCTBL‚UNTALKROUTINEADDR,DC.WSENDUNL-MENUCTBL‚UNLISTENROUTINEADDR:DC.WSENDLAG-MENUCTBL‚PRIMARYLISTENADDRROUTINEADDRESS8DC.WSENDOTA-MENUCTBL‚PRIMARYTALKADDRROUTINEADDRESS6DC.WSENDOSA-MENUCTBL‚SECONDARYR/WADDRROUTINEADDR=DC.WSENDPPU-MENUCTBL‚PARALLELPOLLUNCONFIGUREROUTINEADDR;DC.WSENDPPC-MENUCTBL‚PARALLELPOLLCONFIGUREROUTINEADDR8DC.WSENDPPE-MENUCTBL‚PARALLELPOLLENABLEROUTINEADDR9DC.WSENDPPD-MENUCTBL‚PARALLELPOLLDISABLEROUTINEADDR6DC.WSENDSPE-MENUCTBL‚SERIALPOLLENABLEROUTINEADDR7DC.WSENDSPD-MENUCTBL‚SERIALPOLLDISABLEROUTINEADDR0DC.WSENDDCL-MENUCTBL‚DEVICECLEARROUTINEADDR1DC.WSENDLLO-MENUCTBL‚LOCALLOCKOUTROUTINEADDR0DC.WSENDTCT-MENUCTBL‚PASSCONTROLROUTINEADDR:DC.WSENDSDC-MENUCTBL‚SELECTIVEDEVICECLEARROUTINEADDR/DC.WSENDGTL-MENUCTBL‚GOTOLOCALROUTINEADDR9DC.WSENDGET-MENUCTBL‚GROUPEXECUTETRIGGERROUTINEADDR5 DC.W SENDAUXS-MENUCTBL SEND AUXILIARY COMMAND STRINGC DC.W READDATA-MENUCTBL INITIATE DMA WRITE ROUTINE ADDR (READ DATA)C DC.W WRITDATA-MENUCTBL INITIATE DMA READ ROUTINE ADDR (WRITE DATA)B DC.W SENDTERM-MENUCTBL SEND TERMINATION CHARACTER(S) ROUTINE ADDR+DC.WREADSP-MENUCTBLƒREADSERIALPOLLBYTE5DC.WSENDEOI-MENUCTBL‚SEND'EOI'WITHLASTDATABYTE=DC.WAUXPROC-MENUCTBL‚GENERALAUXILIARYCOMMANDROUTINEADDR=DC.WSENDIFC-MENUCTBL‚SENDIFCCOMMANDROUTINEFUNCTIONADDRGDC.WSENDRPP-MENUCTBL‚SENDREQUESTPARALLELPOLLROUTINEFUNCTIONADDRDDC.WSENDRLC-MENUCTBLƒPERFORMRELEASECONTROLROUTINEFUNCTIONADDRADC.WSENDTCA-MENUCTBLƒPERFORMTAKECONTROLROUTINEFUNCTIONADDRDDC.WSENDRQC-MENUCTBLƒPERFORMREQUESTCONTROLROUTINEFUNCTIONADDR2DC.WREQSTAT-MENUCTBL‚REQUESTSTATUSROUTINEADDR4DC.WCNFGDEV-MENUCTBL‚CONFIGUREDEVICEROUTINEADDR@DC.WCHDEFLT-MENUCTBL‚CHANGEDEFAULTCONFIGURATIONROUTINEADDR:DC.WSETPP-MENUCTBL„SETPARALLELPOLLSTATUSROUTINEADDR8DC.WSETSP-MENUCTBL„SETSERIALPOLLSTATUSROUTINEADDR5DC.WSENDGTS-MENUCTBL‚GOTOSTANDBYFUNCTIONROUTINE*6MENUCLEN EQU (*-MENUCTBL)/2 NUMBER OF ENTRIES IN TABLE  PAGEC**************************************************************************µ********˜CONTROLLERŸ*'*ŒCODE/FUNCTIONMENUTABLEJUMPTABLE’**Á*1*†THISTABLECONTAINSTHEADDRESSESOFTHEMENUŽ*7*†TABLESFOREACHOFTHEGPIBCIOSFUNCTIONSTHATAREˆ*8*†VALIDINCONTROLLERONLYMODE.THISTABLEISINDEXED‡*8*†BYAMATCHIN'IOSCMDTB'.IFTHEENTRYISZERO,THIS‡*'*†MENUISINVALIDINCONTROLLERMODE.˜**Á********µ*******C*******************************************************************%CTLCFTBLDC.WINP_DATA-CTLCFTBL‚INPUTDC.WOUT_DATA-CTLCFTBLƒOUTPUT)DC.WOWI_DATA-CTLCFTBLƒOUTPUTWITHINPUT&DC.WREQ_STAT-CTLCFTBLƒREQUESTSTATUS,DC.WCNFG_DEV-CTLCFTBLƒCHANGECONFIGURATION4DC.WCH_DEFLT-CTLCFTBLƒCHANGEDEFAULTCONFIGURATION,DC.WCDAT_OUT-CTLCFTBLƒCOMMANDOUT/DATAOUT*DC.WCDAT_IN-CTLCFTBL„COMMANDOUT/DATAIN"DC.WCMD_OUT-CTLCFTBL„COMMANDOUT&DC.WREAD_SEC-CTLCFTBLƒREADSECONDARY(DC.WWRITE_SEC-CTLCFTBLƒWRITESECONDARY1DC.WPP_UNCFG-CTLCFTBLƒPARALLELPOLLUNCONFIGURE/DC.WPP_CNFIG-CTLCFTBLƒPARALLELPOLLCONFIGURE,DC.WCOND_PP-CTLCFTBL„CONDUCTPARALLELPOLL.DC.WSET_PP-CTLCFTBL…SE0 TPARALLELPOLLSTATUS,DC.WSET_SP-CTLCFTBL…SETSERIALPOLLSTATUS*DC.WCOND_SP-CTLCFTBL„CONDUCTSERIALPOLL-DC.WPP_DISAB-CTLCFTBLƒPARALLELPOLLDISABLE'DC.WINTF_CLR-CTLCFTBLƒINTERFACECLEAR%DC.WREM_ENAB-CTLCFTBLƒREMOTEENABLE&DC.WREM_DNAB-CTLCFTBLƒREMOTEDISABLE&DC.WS_DCL-CTLCFTBL†CLEARALLDEVICES3DC.WADDR_CLR-CTLCFTBLƒCLEARALLLISTENINGDEVICES%DC.WS_LOCLOK-CTLCFTBLƒLOCALLOCKOUT$DC.WPASS_CTL-CTLCFTBLƒPASSCONTROL-DC.WADDR_GTL-CTLCFTBLƒLISTENERSGOTOLOCAL)DC.WADDR_GET-CTLCFTBLƒLISTENERSTRIGGER2DC.WS_IFCDCL-CTLCFTBLƒINTERFACEANDDEVICECLEAR+DC.WS_UNTUNL-CTLCFTBLƒUNTALKANDUNLISTEN$DC.WTAKE_CTL-CTLCFTBLƒTAKECONTROLDC.W0“REQUESTCONTROL&DC.WREL_CTL-CTLCFTBL„RELEASECONTROL$DC.WGO_STBY-CTLCFTBL„GOTOSTANDBY.DC.WSPEC_CLR-CTLCFTBLƒSPECIFIEDCLEARDEVICE/DC.WSPEC_REM-CTLCFTBLƒSPECIFIEDREMOTEDEVICE0DC.WSPEC_GET-CTLCFTBLƒSPECIFIEDTRIGGERDEVICE-DC.WSPEC_GTL-CTLCFTBLƒSPECIFIEDGOTOLOCAL  PAGEC**************************************************************************TALKER/LISTENER–*******'*ŒCODE/FUNCTIONMENUTABLEJUMPTABLE’**Á*6*†THISTABLECONTAINSTHEADDRESSESOFTHEMENUITEM‰*6*†TABLEFOREACHOFTHEGPIBCIOSFUNCTIONSTHATARE‰*8*†VALIDINTALKER/LISTENERMODE.THISTABLEISINDEXED‡*7*†BYAMATCHIN'IOSCMDTB'.IFANENTRYISZERO,THENˆ*/*†THATMENUISINVALIDINTALK/LISTENERMODE.**Á********µ*******C*******************************************************************#TLCFTBLDC.WINTL_DAT-TLCFTBL‚INPUTDC.WOUTL_DAT-TLCFTBLƒOUTPUT(DC.WOITL_DAT-TLCFTBLƒOUTPUTWITHINPUT%DC.WREQ_STAT-TLCFTBLƒREQUESTSTATUS+DC.WCNFG_DEV-TLCFTBLƒCHANGECONFIGURATION3DC.WCH_DEFLT-TLCFTBLƒCHANGEDEFAULTCONFIGURATIONDC.W0’COMMANDOUT/DATAOUTDC.W0’COMMANDOUT/DATAINDC.W0’COMMANDOUT$DC.WRSEC_TL-TLCFTBL„READSECONDARY%DC.WWSEC_TL-TLCFTBL„WRITESECONDARY!DC.W0’PARALLELPOLLUNCONFIGUREDC.W0’PARALLELPOLLCONFIGUREDC.W0’CONDUCTPARALLELPOLL-DC.WSET_PP-TLCFTBL…SETPARALLELPOLLSTATUS+DC.WSET_SP-TLCFTBL…SETSERIALPOLLSTATUSDC.W0’CONDUCTSERIALPOLLDC.W0’PARALLELPOLLDISABLE&DC.WINTF_CLR-TLCFTBLƒINTERFACECLEARDC.W0’REMOTEENABLEDC.W0’REMOTEDISABLEDC.W0’CLEARALLDEVICES#DC.W0’CLEARALLLISTENINGDEVICESDC.W0’LOCALLOCKOUTDC.W0’PASSCONTROLDC.W0’LISTENERSGOTOLOCALDC.W0’LISTENERSTRIGGER"DC.W0’INTERFACEANDDEVICECLEARDC.W0’UNTALKANDUNLISTENDC.W0’TAKECONTROL%DC.WREQ_CTL-TLCFTBL„REQUESTCONTROLDC.W0’RELEASECONTROLDC.W0’GOTOSTANDBYDC.W0’SPECIFIEDCLEARDEVICEDC.W0’SPECIFIEDREMOTEDEVICE DC.W0’SPECIFIEDTRIGGERDEVICEDC.W0’SPECIFIEDGOTOLOCAL  PAGEC**************************************************************************µ*******!*’CODE/FUNCTIONIOSMATCHTABLE’**Á*6*†THISTABLECONTAINSTHECOMBINEDCODEANDFUNCTION‰*;*†FOREACHCOMMANDAVAILABLEINIOSTOABUSSABLEDEVICE.„*7*†WHENANIOSPARAMETERBLOCKISRECEIVED,THISTABLEˆ*8*†WILLBESCANNEDFORAMATCH.WHENFOUNDTHERELATIVE‡*5*†OFFSETINTHETABLEWILLINDEXINTO'CFMENUTB'TOŠ*:*†POINTTOTHEAPPRIORIATEMENUDRIVERFORTHATFUNCTION…*1*†THESECOMMANDSAREPASSEDINTHEIOSPBINTHEŽ**†PARAMETER'IOSFCT'.¨**Á********µ*******C*******************************************************************IOSCMDTBDC.WIOREAD„INPUTDC.WIOWRIT‡OUTPUTDC.WIOOWIN‡OUTPUTWITHINPUTDC.WIOSTAT‡REQUESTSTATUS!DC.WIOCNFG‡CHANGECONFIGURATION)DC.WIOCHDC‡CHANGEDEFAULTCONFIGURATION!DC.WIOCODO‡COMMANDOUT/DATAOUT DC.WIOCODI‡COMMANDOUT/DATAINDC.WIOCMDO‡COMMANDOUTDC.WIORSEC‡READSECONDARYDC.WIOWSEC‡WRITESECONDARY%DC.WIOPPUˆPARALLELPOLLUNCONFIGURE#DC.WIOPPCˆPARALLELPOLLCONFIGURE"DC.WIOPPOL‡CONDUCTPARALLELPOLL%DC.WIOSPPS‡SETPARALLELPOLLSTATUS#DC.WIOSSPS‡SETSERIALPOLLSTATUS DC.WIOSPOL‡CONDUCTSERIALPOLL!DC.WIOPPDˆPARALLELPOLLDISABLEDC.WIOSIFC‡INTERFACECLEARD0 C.WIOSREN‡REMOTEENABLEDC.WIOCREN‡REMOTEDISABLEDC.WIOSDCL‡CLEARALLDEVICES(DC.WIOSSDC‡CLEARALLLISTENINGDEVICESDC.WIOSLLO‡LOCALLOCKOUTDC.WIOPCTL‡PASSCONTROL"DC.WIOSGTL‡LISTENERSGOTOLOCALDC.WIOSGET‡LISTENERSTRIGGER'DC.WIOABT1‡INTERFACEANDDEVICECLEAR DC.WIOABT2‡UNTALKANDUNLISTENDC.WIOTCTL‡TAKECONTROLDC.WIORQCL‡REQUESTCONTROLDC.WIORLCL‡RELEASECONTROLDC.WIOGTSˆGOTOSTANDBY#DC.WIODSDC‡SPECIFIEDCLEARDEVICE$DC.WIODREM‡SPECIFIEDREMOTEDEVICE%DC.WIODGET‡SPECIFIEDTRIGGERDEVICE"DC.WIODGTL‡SPECIFIEDGOTOLOCAL*6NUMCMDSEQU(*-IOSCMDTB)/2‚NUMBEROFCOMMANDSINTABLE  PAGEF***********************************************************************.*ŽCOMMANDBUFFER/MODE/ABILITYVALIDATIONTABLE*:*ˆThistableisusedbyVALIDATESandVALOPERtodetermine4*ˆwhethercertainparameters/modesneedbevalidated:*ˆforthedesiredcommand.Thistableisindexedaccording9*ˆtotheindexforIOSCMDTB.Thestructureisasfollows:**ˆ|--|--|--|--|--|--|--|--|*ˆ|7|6|5|4|3|2|1|0|*ˆ|--|--|--|--|--|--|--|--|:*‰|‚|‚|‚|‚|‚|‚|‚|___musthavetalkerability(VALTALK)**=*‰|‚|‚|‚|‚|‚|‚|______musthavelistenerability(VALLIST)**<*‰|‚|‚|‚|‚|‚|_________musthavecontrollerability(VALCTL)C*‰|‚|‚|‚|‚|____________musthavesys.controllerability(VALSCTL)7*‰|‚|‚|‚|_______________musthaveSRQability(VALSRQ)@*‰|‚|‚|__________________validateprimarybufferaddr.(VALPBUF)C*‰|‚|_____________________validatesecondarybufferaddr.(VALSBUF)G*‰|________________________validateconfigurationbuf.addr.(VALCBUF)**ˆ|--|--|--|--|--|--|--|--|*ˆ|15|14|13|12|11|10|9|8|*ˆ|--|--|--|--|--|--|--|--|2*‰|‚|‚|‚|‚|‚|‚|‚|___validintalkermode(VALTMOD)5*‰|‚|‚|‚|‚|‚|‚|______validinlistenermode(VALLMOD):*‰|‚|‚|‚|‚|‚|_________mustbeincontrollermode(VALCMOD)?*‰|‚|‚|‚|‚|____________validonlyforBUSinT/Lmode(VALBTLM) *‰|‚|‚|‚|ŸordeviceonCTLmode.@*‰|‚|‚|‚|_______________validonlyforbussabledevice(VALBDEV)C*‰|‚|‚|__________________commandvalidonlyforBUSitself(VALBUS)?*‰|‚|_____________________validatesecondaryaddress(VALSADR)>*‰|________________________mustbeincharge(control)ofBUS*A*ˆNOTE:‚DONOTCHANGETHEORDEROFBITS0-4BECAUSETHEYDIRECTLY8*CORRESPONDTOTHEATTRIBUTESWORDINTHECONFIGURATION*BLOCKFOREACHDEVICE.*@*…**NOTE:‚THESECAPABILITIESWHENDESIGNATEDINTHETABLEBELOW9*AREWITHRESPECTTOTHEBUS.‚IFTHATPARTICULARCOMMAND9*ISUSEDANDITISDIRECTEDTOWARDSADEVICERATHERTHAN6*THEBUS,THEBITBEINGSETWILLTAKEONITSOPPOSITE3*MEANING.‚THATIS,IF'VALTALK'ISSPECIFIEDFORA:*COMMAND,IFTHECOMMANDISDIRECTEDTOWARDSTHEBUSTHAT8*IMPLIESTHATTHEBUSHASTALKERABILITIES.HOWEVER,IF?*THATSAMECOMMANDWASDIRECTEDTOWARSADEVICE,THE'VALTALK'=*BITIMPLIESTHATTHEDEVICEMUSTHAVELISTENERCAPABILITIES<*BECAUSETHEBUSWILLBETRYINGTOTALKTOIT.THEOPPOSITE**ISALSOTRUEFORTHE'VALLIST'BITALSO.* 3VALPARTBDC.WVALLIST+VALPBUF+VALBTLM+VALLMOD‡INPUT,DC.WVALTMOD+VALTALK+VALPBUF+VALBTLMOUTPUTGDC.WVALTALK+VALLIST+VALPBUF+VALSBUF+VALBTLM+VALTMOD‚OUTPUTWITHINPUTDC.WVALCBUF§REQUESTSTATUS"DC.WVALCBUF§CHANGECONFIGURATION'DC.WVALCBUF§CHANGEDEF.CONFIGURATION@DC.WVALCTL+VALBUS+VALPBUF+VALSBUF+VALCMOD‰COMMANDOUT/DATAOUT?DC.WVALCTL+VALBUS+VALPBUF+VALSBUF+VALCMOD‰COMMANDOUT/DATAIN/DC.WVALCTL+VALBUS+VALSBUF+VALCMOD‘COMMANDOUT*‚PARAMETERBLOCKELEMENTSIZETABLEFORCONFIGURATIONREQUEST*@****************************************************************PAR_SIZDC.B2…RECORDLENGTHDC.B4ŒDEVICESIZEDC.B4ŒWRITETIMEOUTVALUEDC.B4ŒREADTIMEOUTVALUEDC.B4ŒEORREQUIREMENTSDC.B2ŒEOSWRITE/READCHAR#DC.B1ŒPARALLELPOLLCONFIGURATIONDC.B1ŒPRIMARYADDRESS3DC.B4Œ#OFBYTESINFIXEDWRITE-FORMATTED/IMAGE2DC.B4Œ#OFBYTESINFIXEDREAD-FORMATTED/IMAGE#DC.B4ŒREADSECONDARYADDRESSMASK$DC.B4ŒWRITESECONDARYADDRESSMASK(DC.B8ŒRESERVEDFORLATERUSE/EXPANSIONDC.B0ŒENDOFCONFIGURATION* DS 0=/*=/*†M315DRV.AF=/*==/* Chain file to assemble the MVME315 disk controller driver=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to M315DRV.LS=/*=/IFC \1ƒ=ARGM315DRV.LS=/ENDIF=/*$=ASM M315DRV.SA,M315DRV.RO,\1;RZ=180=/*{ Included files are:=/*ƒ9995.&.DUALPORT.MC=/*ƒ9995.&.TRACE.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.CCB.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.LV5.EQ=/*}=/*=ENDéééééé1 9M315DRV„IDNTƒ5,0VERSAdosM315DiskDriver3.2-11/26/842ŠTTL„VERSADOSM315DISKDRIVERVER.3.2-11/26/84J***************************************************************************,* IPC -- REV. 1.05 02JUN80 (TB59) STEVE BALL8*IPC‰2.0002NOV81(TL09)JIMSMITH-SPLITIPCFROMCMR2*IPC‰2.0101FEB82(TL09)JIMSMITH-VECTORCHAIN.*IPC‰2.0223FEB82(TL09)JIMSMITH-IOCBUSE7*IPC‰4.0001SEP82ˆMARCBRIEL-CONFIGURECLASSREQUESTS7*M315DRV…5.0019MAY83ˆRONIWOOD-CHANGEDFORM315IPC>*M315DRV…5.017JULY83ˆMARCOSCHMIDT-PATCHESTO5.00CHANGES*¡DISKCONTROLLERBOARD. *¡USEDIPCDRVASABASE.‚DELETED*¡ALLREFERENCETOMCCMSTUFF.*¡ALLOTHERCHANGESAREMARKED.?*M315DRV…5.0106DEC83ˆJULIEHOBAN-CHANGESMARKEDBY11/17/83=*M315DRV…5.0124JAN84ˆJULIEHOBAN-BUGFIXESEFFECTINGINIT*¯CHANGESMARKEDBY01/24/848*M315DRV…5.0127JAN84ˆJUTTAKINDERMANN-CHANGESTOTHE*´PARAMETERDEF.PARTAND*´THECONFIGUREDISKPART*´ALLCHANGESAREMARKEDBY*¸'01/27/84'.>*M315DRV…5.1023MAR84ˆFRANZMARSCHNER‚-CHANGETOTHECOMMAND*´SERVICEPARTTOENABLE*´USEINTHEVME/10SYSTEM*´ADDEDTWOXREF'STO*´SATISFYVME/10HARDWARE*´DEPENDENCIES*´ALLCHANGESAREMARKEDBY*¸'03/28/84'.<*M315DRV…5.2009MAY84ˆJULIEHOBAN†-FIXTOCONFIGURELENGTH*´TABLE:CHANGESMARKEDBY*¸'05/09/84'.:*M315DRV…5.3027AUG84ˆJULIEHOBAN†-MODIFIEDTOUSEMACRO*´DUALPORT.MCTOACCESS*´OFFBOARDRAMADDRESSES.8*M315DRV…5.3117OCT84ˆDICKVANDERLINƒ-CONFIGBLKOFFSET*´DEFINATION(SYMBUGPROBLEM)<*M315DRV…5.3226NOV84ˆJULIEHOBAN†-CONFIGURATIONCHECK$47*´ADDED-SAMEASVME320.**;*‰NOTE-----Manycommentsinthisdriverrefertothetime0*”'currently'.‚ThisreferstothetimeframeMay.*”andJune1983.‚Italsoreferstothisdriver3*”onlyinassociationwiththeM315diskcontroller6*”boardandallchanges/additionsforthatboardonly.*.* USER REQUEST SIDE FOR IPC COMMAND PROCESSING*!(31S90A6I7QDY6a7iCqIy?F‰5‘D™?¡5©7±1¹:Á@É4Ñ-Ù4á2é3ñ<ùG> AC9*ƒPURPOSE:‚VALIDATEANDPASSIPCCOMMANDINFORMATIONFROM#*USERTOIPC,68000SHAREDMEMORY.**ƒENTRY:‚JSRFROMCMRHANDLER*‹JSRFROMINTERRUPTHANDLER*5*ƒEXIT:‚RTS-PARAMETERBLOCKVALIDATIONSTATUSIND0**ƒEXECROUTINESCALLED:‚QEVENTT**ƒCODEISRE-ENTRANT*H*-----------------------------------------------------------------------**ŠPAGE *‚IncludedMacrofile**ˆ9995.&.DUALPORT.MC**‚Includedequatefiles:*ˆ9995.&.TRACE.EQ*ˆ9995.&.STR.EQ*ˆ9995.&.TCB.EQ*ˆ9995.&.CCB.EQ*ˆ9995.&.IOE.EQ*ˆ9995.&.NIO.EQ*ˆ9995.&.LV5.EQ*ŠINCLUDE9995.&.DUALPORT.MCŠNOLIST ŠTTLTRACE.SAŠINCLUDE9995.&.TRACE.EQŠNOLISTŠTTL…9995.&.STR.EQŠINCLUDE9995.&.STR.EQŠNOLISTŠTTL…9995.&.TCB.EQŠINCLUDE9995.&.TCB.EQŠNOLISTŠTTL…9995.&.CCB.EQŠINCLUDE9995.&.CCB.EQŠNOLISTŠTTL…9995.&.IOE.EQŠINCLUDE9995.&.IOE.EQŠNOLISTŠTTL…9995.&.NIO.EQŠINCLUDE9995.&.NIO.EQŠNOLISTŠTTL…9995.&.LV5.EQŠINCLUDE9995.&.LV5.EQŠLISTŠPAGE6ŠTTL„VERSADOSM315DISKDRIVERVERSION5.32-11/26/84* ŠSECTION0**$*…EQUATESFORTESTINGVECTORNUMBERS*#AVECTLOƒEQU„25‘LOWESTAUTOVECTOR#$AVECTHIƒEQU„31‘HIGHESTAUTOVECTOR##UVECTLOƒEQU„64‘LOWESTUSERVECTOR# IPCORG„EQU„*ŠPAGE*6* IPC COMMAND PACKET FORMAT (AS SEEN IN SHARED MEMORY)*4*ˆNOTE:‚TheIPCdriverneverusedthepacketIDbyte0*foranything-thevaluewasalwayszero.‚This0*drivercurrentlydoesthesamething-however3*thepacketIDnowistheaddressmodifierforthe.*read/writebufferaddresses.‚Ifthevalueis2*zerotheMVME315firmwareusesadefaultaddress2*modifier-regularglobalmemory.‚Otherwise,the2*valueinpacketIDisusedbytheMVME315asthe1*addressmodifiertouse.‚Thisisset-u2 pforthe4*futurewhenseveralprocessorboardsareusingone0*MVME315diskcontrollerboard.‚Thissuppliesa0*wayforthediskcontrollertousethecorrect*memorylocations. ŠOFFSET0IPCSTX„DS.Bƒ1*2STARTOFTEXTIPCPID„DS.Bƒ1*2PACKETIDIPCPKSZƒDS.Bƒ1*2PACKETSIZE IPCPHDVƒDS.Bƒ1*2PHYSICALDEVICE%IPCCHCMƒDS.Bƒ1*2CHANNELCOMMANDTYPEIPCDVCMƒDS.Bƒ1*2DEVICECOMMAND$IPCNBKSƒDS.Bƒ2*2#BLOCKSTOTRANSFERIPCBKSZƒDS.Bƒ2*2BLOCKSIZE*IPCBUFAD‚DS.Bƒ4*268000ADDRESS(PHYSICAL)IPCCKSMƒDS.Bƒ2*2CHECKSUM$IPCCMPRM‚DS.Bƒ4*2COMMANDPARAMETERSIPCETX„DS.Bƒ1*2ETXLOCATION*9*ˆUIPCCONFIGURATIONPACKET-BOARDLEVEL-COMMAND$5000*2*ˆThisisanewpacketsetupfortheMVME310UIPC4*ˆconcept.‚Itpassesbasicinformationtotheboard.4*ˆThecurrentimpemetationinthisdriveristopass4*ˆtheinterruptvectornumbertothediskcontroller3*ˆboard.‚Ifthispacketisnotsent,theboarduses4*ˆadefaultvalueofvectornumber64.Onlyonebyte5*ˆcurrentlycontainsavalue,therestarezeroedout6*ˆandreservedforfutureuse.‚Thecommandcodeis$505*ˆandcurrentlyimplementedfunctioncodeis00-for1*ˆUIPCconfigurationandcontrol.‚Thiscommandis3*ˆcompletelyunrelatedtotheconfigurecommandthe0*ˆdriverreceivesfromVERSAdos.‚Thiscommandis7*ˆsentbythedrivertotheboardintheinitialization7*ˆportion.‚Interruptsareinhibitedduringexecutionof5*ˆthiscommand.‚Theinitializerpollstilthecommand8*ˆiscomplete.Ifthecommandfails,theboardismarked*ˆdownintheCCB.*‰OFFSETIPCNBKSIPCVECT‚DS.Bƒ1*2vectornumber(IPCRESV‚DS.Bƒ1*2reservedforfutureuse)IPCRESV1DS.Bƒ4*2reservedforfutureuse)IPCRESV2DS.Bƒ4*2reservedforfutureuse)IPCRESV3DS.Bƒ4*2reservedforfutureuse)IPCRESV4DS.Bƒ4*2reservedforfutureuse)IPCRESV5DS.Bƒ4*2reservedforfutureuseIPCVETX‚DS.Bƒ1*2ETXlocation*<*‰UIPCDrive/Mediaconfigurationpacket-commandcode$4008*9*‰Thiscommandisusedtotelltheboardhowthefloppies<*‰andharddisksareconfigured.‚Itissentonbehalfofthe6*‰driverreceivingeitheraconfigurationcommandora?*‰defaultconfigurationcommandfromVERSAdos.‚Thisisnormally:*‰doneduringboottimebyIOI,onceforeachdrive.‚Mount;*‰andInitalsoissuethesecommands.‚Ifthesecommandsare:*‰notsenttotheboardtheboardassumesseveraldefaults<*‰dependingonthedisksize.‚TheM315diskcontrollerknows?*‰ifthefloppyissingleordoubletrackdensitybythenumber*‰ofsectorspertrack.*+*‰Thedefaultsassumedfor8"floppiesare:B*‰MOTOROLAformat,doublesided,singledensity,128bytesectors,=*‰77cylinders,nointerleaving,nospiraloffset,26sectors *‰pertrack./*‰Thedefaultsassumedfor51/4"floppiesare:D*‰IBMformat,doublesided,doubledensity,96TPI,256bytesectors,=*‰80cylinders,nointerleaving,nospiraloffset,16sectors *‰pertrack.*B*‰Thephysicaldevicenumbersforfloppiesare04,05,06,and07.**‰FLOPPYDISKCONFIGUREPACKET*ŠOFFSETIPCNBKS$IPCFATR0‚DS.Bƒ1*2attributesbyte#0*(*‰bitdefinitionsofattributesbyte#0:*G*‚bit0=0=ifacompensationvalueisspecifieditiswritepre-comp?*Š1=ifacompensationvalueisspecifieditisreadpost-comp=*‚bit1=0=compensationvalueisspecified‚(byte$Fvalue))*Š1=compensationvalueisnotspecified*‚bit2=0=51/4"diskette=*Š1=8"diskette‚(if26or52sectors/trackdisketteis8")*‚bit3=notdefined#*‚bit4=0=singlesideddiskette*Š1=doublesideddiskette**‚bit5=0=singledensity(FMencoding)#*Š1=doubledensity(MFMencoding)*‚bit6=0=nospiraloffset*Š1=spiraloffset*‚bit7=0=IBMformatting*Š1=MOTOROLAformatting$IPCFATR1‚DS.Bƒ1*2attributesbyte#1(*‰bitdefinitionsofattributesbyte#1:B*‚bits0,1,2=steppingrate.IfzerotheM315uses6milliseconds.*for8"and12millisecondsfor51/4"disks.* *ž8"‘51/4"2 *!*=001‡3millisecs.‰6millisecs."*=010‡6millisecs.ˆ12millisecs.#*=011†10millisecs.ˆ20millisecs.#*=100†15millisecs.ˆ30millisecs.*"IPCFSPTƒDS.Bƒ1*2sectorspertrack6IPCFSIDƒDS.Bƒ1*2#ofsides-either01or02isvalid5IPCFSLGƒDS.Bƒ2*2sectorlengthinbytes-either128,"*§256,512or1024.‚Currentlyonly'*§128and256arebeingused.‚Theboard)*§doesdoublereadsforsectorlength128IPCFNC„DS.Bƒ2*2#ofcylinders8IPCFPCNƒDS.Bƒ1*21stcylinderwithcompensationƒ01/27/84*-IPCFNU0ƒDS.Bƒ1*2notusedbyMVME315Ž01/27/84*#IPCFNU„DS.Bƒ4*2notused-reserved!IPCFIF„DS.Bƒ1*2interleavefactor$IPCFNU1ƒDS.Bƒ1*2notused-reserved$IPCFNU2ƒDS.Bƒ4*2notused-reserved$IPCFNU3ƒDS.Bƒ2*2notused-reservedIPCHFETX‚DS.Bƒ1*2ETXlocation**9*‰Thelayoutandassociatedvaluesaredifferentforhard:*‰disksfromthefloppydisks.‚Ifthiscommandisnotsent;*‰tothecontrollerorifthevaluesinthepacketarezero"*‰thefollowingdefaultsareused:@*‰4heads,256bytesectors,256cylinders,128pre-compensationA*‰value,128reducedwritecurrent,and7bitsofECCdataburst.7*‰Thisactuallydefinesan8"10megabyte(unformatted)*‰Winchesterdisk.*D*‰Thephysicaldevicenumbersforharddisksare00,01,02,and03.**‰HARDDISKCONFIGUREPACKET*ŠOFFSETIPCFSPT,IPCHSPTƒDS.Bƒ1*2#ofsectors/track…01/27/84IPCHNOHƒDS.Bƒ1*2#ofheads'IPCHSLGƒDS.Bƒ2*2sectorlengthinbytesIPCHNC„DS.Bƒ2*2#ofcylinders1IPCHPC„DS.Bƒ2*2writepre-compensationcylinder#2IPCHRWCƒDS.Bƒ2*2reducedwritecurrentcylinder#.&IPCHECCƒDS.Bƒ1*2ECCdataburstlength,IPCHSCAƒDS.Bƒ1*2SASIcontrollerID01/27/84,*£TheactualversionoftheMVME31501/27/84,*£firmwareexpectsthesasicontrl.01/27/84+*£IDatthislocationforthecon-‚01/27/84+*£figurecommandandinthedevice‚01/27/84)*£#bytefortheothercommands.„01/27/84**£Inalaterrevisionitmightbeƒ01/27/84**£changed,toonlyusethedeviceƒ01/27/84(*£numberbyteforallcommands.…01/27/84(*£Forfurtherinforefertothe…01/27/84*£MVME315manual.“01/27/84!IPCHIF„DS.Bƒ1*2interleavefactor#*§Theremainingfieldsarethesame!*§asthefloppyconfigurepacket.** FORMAT TRACK PACKETŠOFFSETIPCBUFAD'IPCFPSNƒDS.Bƒ4*2PHYSICALSECTORNUMBERIPCFETXƒDS.Bƒ1*2ETXLOCATION** FORMAT DISK PACKETŠOFFSETIPCNBKSIPCDETXƒDS.Bƒ1*2ETXLOCATION** REQUEST STATUS PACKETŠOFFSETIPCNBKSIPCRETXƒDS.Bƒ1*2ETXLOCATION* * IPC RETURN (COMPLETION) PACKET* ŠOFFSET0RTNSTX„DS.Bƒ1*2STARTOFTEXTRTNPID„DS.Bƒ1*2PACKETI.D.RTNPKSZƒDS.Bƒ1*2PACKETSIZE RTNPHDVƒDS.Bƒ1*2PHYSICALDEVICE RTNCHCMƒDS.Bƒ1*2CHANNELCOMMANDRTNSTCMƒDS.Bƒ1*2STATUSCOMMANDRTNSTVLƒDS.Bƒ2*2STATUSVALUERTNSTPRƒEQU„*’STATUSPARAMETERS** IPC NORMAL COMPLETION EVENT*ŠOFFSETRTNSTPRRTNBLKSƒDS.Bƒ2*2NO.OFBLOCKSRTNBKSZƒDS.Bƒ2*2BLOCKSIZE#RTNDADRƒDS.Bƒ4*268KMEMORYADDRESS** DISK ERROR COMPLETION EVENT*ŠOFFSETRTNSTPR%RTNSECNƒDS.Bƒ4*2ENDINGSECTORNUMBER** DISK STATUS RETURN*ŠOFFSETRTNSTPRRTNDSTAƒDS.Bƒ2*2DEVICESTATUS RTNLSECƒDS.Bƒ4*2LOGICALSECTORS*‰OFFSETRTNSTPRRTNSTAD‚DS.B…4*2’DEVICESTATUS** IPC MEM MAPPED EQUATES*;*‚TheMVME315doesnothaveanIPCinterruptbyte,nordoes;*‚ithavearesetinterruptbyte.Everybytewrittentothe=*‚commandchannelinterruptstheboard.‚Allreferencestothe=*‚softwareinterruptaredeletedinthedriver.‚Ifthedriver>*‚determinesaneedforareset,theboardismarkedinerror.=*‚Thedriverusedtotrytoissuearesetifitfoundafatal@*‚error-suchasthecommandpacketfromtheIPCwasclobbered.*-*IPCINT„EQU„$0D68000TOIPCINTERRUPTOFFSET+*IPCRESET‚EQU„$0F68000TOIPCRESETOFFSET'IPCIMB1ƒEQU„$10168000TOIPCWRITEBOX%IPCIAB1ƒEQU„$10368000TOIPCACKBOX#IPCIM1„EQU„$10568000COMMANDWRITE'IPCIMB2ƒEQU„$181IPCTO68000WRITEBOX%IPCIAB2ƒEQU„$183IPCTO68000ACKBOX!IPCIM2„EQU„$185IPCCOMMANDWRITE* * 3 STRUCTURE FOR DEVICE NO. TABLE*9*TheaddressofthistableisintheCCB.‚Thememoryfor<* this table gets allocated in the initialization section of>*thedriver.‚Thelengthisdependenton#ofdevicesandeach<*entrylength.‚Thenumberofdevicesisnowsetto12.‚Each>* entry pertains to a disk - the disk device number is used to?* determine where in the table the entry is; ie, drive 0 is theF*1stentry,drive1the2nd,etc.‚ThecompleteIOCBforconfigurationF* is saved in this table - it is defined as the current configuration.>* The default configuration is save in the DCB for each drive.* ‰OFFSET0LUFLG„DS.Bƒ2–ENTRYFLAGLUDCB„DS.Bƒ4–DCBADDRESSLUIOCBƒDS.Bƒ4–IOCBADDRESSLUTCB„DS.Bƒ4–TCBADDRESSLUBADRƒDS.Bƒ4–BUFFERADDRESS.ACTIVEƒDS.Bƒ1–ACTIVEFLAG-USEDFORCONFIGURE$MOUNTED‚DS.Bƒ1–MOUNTED/DISMOUNTFLAG,CONFGBLKEQU„*-IOSATWOFFSETTOCONFIGBLOCK3LUCONFƒDS.BƒIOSDLN-IOSATWŠconfigureparameterblock(LUENTRY‚EQU„*–LENGTHOFDEVICENO.ENTRY** EQUATES FOR 'LUFLG'*LUFEOFƒEQU„0–EOFPENDINGLUFHLTƒEQU„1–HALTPENDING"LUFXFRƒEQU„2–DATATRANSFERREQUESTLUFACTƒEQU„15•ACTIVEDEVICE** MISCELLANEOUS EQUATES*STX‡EQU„$02startpacketcodeETX‡EQU„$03endpacketcodeACK‡EQU„$06ackcodeNAK‡EQU„$15nakcode%LUMAX…EQU„12‘MAXIMUMDEVICENO.VALUE3SECOFF„EQU„4’OFFSETTONO.OFSECTORSINCONFIGTBL(RTNGDC„EQU„$70NORMALSTATUSPACKETCODE,RTNHLT„EQU„$71HALT/ABORTSTATUSPACKETCODE+RTNSTA„EQU„$72SOLICITEDSTATUSPACKETCODE&RTNUNS„EQU„$80UNSOLICITEDPACKETCODE"RTNGDS„EQU„$0000ŽGOODSTATUSVALUE,SPKT†EQU„$0200ŽFIRST2BYTESOFEVERYPACKETDLUPAGE„EQU„(LUMAX*LUENTRY+256)/256NO.OFPAGESFORDEVICENO.TABLE+SECSIZƒEQU„$100“SYSTEMREQUIREDSECTORSIZE'IOPKSZ„EQU„21”READORWRITEPACKETSIZE'STPKSZ„EQU„7•STATUSREQUESTPACKETSIZE#CNPKSZ„EQU„29”CONFIGUREPACKETSIZE$FDPKSZ„EQU„7•FORMATDISKPACKETSIZE&FTPKSZ„EQU„15”FORMATTRACKPACKETSIZEHLTPKSZƒEQU„7•HALTPACKETSIZEIOEVCD„EQU„1•I/OEVENTCODE*DSKATM„EQUƒ$031Fsupportedattributesmask)IOATM…EQUƒ$031Fsupportedattributesmask/NVALATMƒEQUƒ$FFFF-DSKATMˆunsupportedattributes+DSKPRMM„EQUƒ$DBF3supportedparametersmask)IOPRM†EQUƒ$DBF3supportedparametersmask0NVALPRMƒEQU„$FFFF-DSKPRMM‡unsupportedparameters$VDOSRSZ‚EQU‡256‘VERSAdossectorsizeLCDSCTBTEQU‡7@LCDSCTSZEQU‡1<*ˆAPPROXIMATELY225INSTRUCTIONSEXECUTEDTOGETTOTHISPOINT *ˆ(600us).*J******************************************5 *********************************IOHUSER:** CHECK FOR RESET*ƒIFRESET,DOITANDGETOUT*)ŠCMP.B‚#XDREST,XIOSCD(A2)TESTRESETBYTE#ŠBNE.S‚IOH01000‹BRANCHIFNOTRESETŠBSR„CMRRESTŒCALLRESETROUTINEŠBRA„IPCUSRTN‹RETURN*$* RETURN IF CHANNEL IS IN ERROR MODE*!IOH01000‚BTSTW‚#CCBFGER,CCBFG(A5)2ŠBEQ.S‚IOH01010‹BRANCHIFNOTMARKEDINERRORMODE)ŠMOVE.B#ISTACDN,D1ˆSETUPIOSERRORCODE ŠBRA„ABORT*D* IF WE ARE WAITING FOR ACK/NAK THEN WE CANNOT HONOR THE REQUEST AND2*ƒMUSTSIGNALTHECALLERTHATTHECHANNELISBUSY.*IOH01010‚EQU„* ŠCLR.L‚D7<*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>)*ˆNOTE!!!!!!œNOT:Isdeleted(MS)1*ˆWhentheM315boardhasqueuingdeletetheline *ˆBRA.STEMP3*ˆThisisonlyfortestingandmustbedeletedfrom.*ˆthereleasedversionofthedriver!!!!!=*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+TEMP†BTSTW‚#CCBFGWAK,CCBFG(A5)WAITINGACK?)ŠBEQ.S‚IOH01020‹BRANCHIFNOTWAITINGACK$ŠBRA.S‚TEMPlooptilchannelisfree*F* REQUEST CAME THRU WHILE WAITING FOR ACK - GIVE USER BACK BUSY STATUS*$ŠMOVE.B#XSTBSY,D0‡ERRORRETURNCODE ŠBRA„IPCUSRTN*(* CONVERT LOGICAL PB ADDRESS TO PHYSICAL*IOH01020‚CLR.L‚D5,ŠMOVE.LXIOCPK(A2),D6†ADDROFCOMMANDPACKET+ŠMOVE.WXIOPLN(A2),D5†LENGTHOFCOMMANDPKT"ŠMOVE.LCCBTASKA(A5),A1„SETUPTCB ŠBSR„IOHADRCKŠBRA.S‚IOH01060‹GOODRETURNŠNOP—BADLENGTHRETURN(ŠMOVE.B#ISTAIP,D1‰SETUPIOSERRORCODE ŠBRA„ABORT5IOH01060‚MOVE.LD6,A3ŽCOMMANDPACKETPHYSICALADDRESS*3* DETERMINE IF SHARED MEMORY IS FREE (IT SHOULD BE)*.ŠMOVE.LCCBCHB(A5),A4†MEMORYMAPPEDBASETOA4ŠMOVE.BIPCIMB1(A4),D00ŠBEQ.S‚IOH02060‹BRANCHIFNOERROR(MEMORYFREE)*:* SHARED MEMORY IS NOT FREE AND WE ARE NOT WAITING ON ACK.*ƒERRORCONDITION.*)ŠBSETW‚#CCBFGER,CCBFG(A5)MARKCCBASBAD)ŠMOVE.B#ISTACDN,D1ˆSETUPIOSERRORCODE ŠBRA„ABORTŠPAGEK****************************************************************************(*‚FINDTHECOMMANDINTHECOMMANDTABLE.* IOH02060‚EQU„*)ŠMOVE.LXIOUID(A2),A4†PICKUPDCBPOINTER8ŠMOVE.LCCBTASKA(A5),CCBTASKB(A5)SETUPBUFFERTASKTCB-ŠMOVEQ‚#NUMCMDS-1,D0†Setuptheloopcounter./ŠLEA„CMDTBL,A0ŠA0<--addressofcommandtable./ŠMOVE.WIOSFCT(A3),D6†Setupusercommandcode. 8CMDSRCHƒCMP.W‚(A0)+,D6‹Searchthetableforthecommand.ŠDBEQƒD0,CMDSRCH‰* 3ŠBNE.S‚CMDERRIfwefoundthecommandinthetable,8ŠADD.L‚#JMPOFF-2,A0‡getthecorrespondingentryfromthe5ŠMOVE.W(A0),D0Œjumptableandjumptotheroutineto"ŠJMP„(A0,D0.W)Šhandlethecommand.ŠSPC„2>CMDERR„MOVE.B#ISTAIF,D1ŠThecommandwasn'tfoundinthetable2ŠBRA„ABORTŽsoexitwithaninvalidfunctionerror.ŠPAGEM*******************************************************************************‰REQUESTSTATUS2*‰ThiscommandisarequeststatustotheMVME315.:*‰Itistoreturnthecurrentconfigurationtothecaller.6*‰Itfirstissuesarequeststatuscalltothedriver.8*‰IntheinterruptserviceroutinetheCCBconfiguration;*‰informationisreturnedtotheuseralongwiththestatus*‰fromtheboard..*(*‰Entry:A2=addressofCMRparamblock*A3=addressofuser'sIOCB*A4=addressofDCB*A5=addressofmyCCB*A6=addressofuser'sTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory*™andaddressofdevicetableM******************************************************************************REQSTAT:6ŠMOVE.Lƒ#IOSDLN,D5Šlengthofconfigureparameterblock<ŠMOVE.LƒIOSDBP(A3),D6‡logicaladdressofconfigurepara.blk+ŠBSR†BUFADDRgetthephysicaladdressofit<ŠMOVE.LƒD6,CCBPTR(A5)‡savephys.addrofconfigurepara.blk ŠCLR.L„D6,ŠBSR„DEVTBLgetgetdevicetableentrystuff%ŠMOVE.L‚A0,A1addressoftopoftable"ŠADD.LƒD0,A1addressofthisentry/ŠLEA…LUCONF(A1),A2ˆaddressofthisconfigblockŠCLR.L‚D5‘clearforlateruse/ŠBSR.S‚STATCONF‹STATCONFsetsupA0topointto&*£theIOSATMfie5 ldoftheusersstatus%*£parameterblock.‚Italsodetermines&*£thedrivesdevicestatusandsetsup(*£thefirstgroupoffieldsintheusers*£statusparameterblock.9L0110…EQU„IOATM<<16ŠSetIOSATMfieldandtheIOSPRMfield?ŠMOVE.L#L0110+IOPRM,(A0)+intheusersstatuspara.block.‚The%*£valueswereturnaresignificantto*£thisdriver.L0120…EQU„IOSDLN-IOSATWL0121…EQU„L0120/2L0122…EQU„L0121*2*ŠMOVEQ‚#L0121-1,D0ˆnumberofwordstomove;L0130…MOVE.W(A2)+,(A0)+ˆcopycurrentconfigurationtouserŠDBRAƒD0,L0130ŠCLR.L„D1’setforgoodreturn0ŠLEA†-$48(A2),A2‰*MSadjustA2forABORTroutine.ŠBRA†ABORTuseaborttoqueueeventandreturnŠPAGEL***************************************************************************** *‰STATUS/CONFIGURECOMMONCHORES*6*‰Thissubroutineperformsfunctionscommontostatus,,*‰configure,anddefaultconfigurecommands.*+*‰entry:‚A1=pointertodevicetableentry!*‘A2=IOSATWfieldinCCBorDCB*‘A3=physicaladdressofIOCB*‘A5=physicaladdressofCCB*M***************************************************************************** STATCONF:7ŠMOVE.LIOSDBP(A3),D6†getphysicaladdressofthefirst!*§locationoftheusersconfigure*§parameterblock)ŠMOVE.L#IOSDLN,D5‰parameterblocklength0ŠMOVE.LA1,-(A7)‹savedevicetableentrypointer0ŠBSR„BUFADDRŒconvertlogicaltophysicaladdress3ŠMOVE.L(A7)+,A1‹restoredevicetableentrypointerSTATCON1‚MOVE.LD6,A0Žsaveit&ŠMOVE.LD6,CCBPTR(A5)†saveinCCBalso1ŠTST.B‚MOUNTED(A1)ˆifthediskisnotmountedset'ŠSEQ.B‚(A0)XDSNRBBITofdevicestatus-ŠAND.B‚#1<*‰updatedintheinterruptserviceroutineaftertheconfigure>*‰calltotheboardiscomplete.‚Themounted/dismountedoptionB*‰ischeckedtoseeiftheDCBmustbechangedformount/dismount.*(*‰Entry:A2=addressofCMRparamblock*A3=addressofuser'sIOCB*A4=addressofDCB*A5=addressofmyCCB*A6=addressofuser'sTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory*™anddevicetableM****************************************************************************** CONFIGUR: 3ŠMOVE.L#IOSDLN,D5‰configureparameterblocklength<ŠMOVE.LƒIOSDBP(A3),D6„logicaladdressofconfigurepara.blk(ŠBSR†BUFADDRŠconverttophysicaladdress?ŠMOVE.LƒD6,CCBPTR(A5)„savethephy.addrofconfigurepara.blk ŠCLR.L„D6&ŠBSET„#LUFACT,D6ˆsetforactivedevice%ŠBSR†DEVTBL‹setupdevicetableentry!ŠMOVE.LƒA0,A1ŒtopofdevicetableŠADD.L„D0,A1Œtopofthisentry9ŠMOVE.LƒA2,D7Œmustsavetheparameterblockaddr11/17/83/ŠLEA…LUCONF(A1),A2…sartofthisconfigureblock2L0220…EQU„DCBDKC+IOSWTO†write-timeoutfieldinDBC>2,D1†getVERSAdossectorsize‰ASL.L…#2,D1makeitreal3L0326„EQU‡IOSREC-IOSDRSV†pointtorecordsizefield ‰MOVE.W„D1,L0326(A0)ˆandsaveit*‰DIVU†D0,D1seeifrecordsizemakessense‰SWAP†D1*‰AND.W…#(1<error01/27/84%CONERR46EQU‡$46‘disksizeerrorcode'‰MOVEQ…#CONERR46,D3ˆsetupjustincase‰MOVEQ.Lƒ#0,D5clearforuse*8*ˆComputethenumberofsidesonafloppydisktousein6*ˆcalculationoflogicalsectors.‚Determinerigiddisk9*ˆorfloppyfromthe#IOARDISCbitotheattributesword.6*ˆIfafloppy,setD5=1forasingle-sideddiskette.9*ˆDeterminetheactualnumberofsidesfrom#IOADSIDEbit6*ˆoftheattributesword.‚Ifdouble-sided,setD5=2.*2LC000„EQU‡IOSATW-IOSDRSV†offsettoattributesword0‰BTSTW…#IOARDISC,LC000(A0)seeiffloppyorhard"‰BNE.S…LC010branchifaharddiskM********* Configuration check for floppies only ***************** JH 11/26/845CONERR47EQU†$47”Gettheerrorcodethatwe'lluseto6‰MOVEQ„#CONERR47,D3‰indicatethatwedon'tsupportthe)*¦proposedconfiguration.We'llkeepthis(*¦errorcodeinD3.Baswemakecomputa-$*¦tionsregardingtheconfiguration. 9‰BTSTWƒ#IOADDEN,LC000(A0)„Single-ordouble-datadensity? ‰BEQ.SƒCNF172?EQ375„EQU…IOSPSM-IOSDRSVŠAtthistime,Versadosandthisdriver5‰CMP.Wƒ#256,EQ375(A0)ˆsupportthedoubledata-density5‰BNE…CONERRORŽconfigurationwith256bytespersector.‰BRA.SƒCNF175ONLYandthesingledata-densityCCNF172ƒCMP.Wƒ#128,EQ375(A0)ˆconfigurationwith128bytespersector‰BNE…CONERRORŽONLY.6CNF175ƒMOVEQƒ#CONERR46,D3ŠRestoredisksizeerrorcodeN********************************************************************* 11/26/84‰ADDQ.L„#1,D5setforfloppy8‰BTSTW…#IOADSIDE,LC000(A0)seeifsingleordoublesided#‰BEQ.S…L0845branchifsinglesided"‰ADDQ.L„#1,D5setfordoublesided‰BRA.S…L0845andgocontinueLC010>L0840„EQU‡IOSHDS-IOSDRSV†offsettonumberofheads-harddisk(‰MOVE.B„L0840(A0),D5ˆgetnumberofheads‰PAGE*<*ˆComputethetotalnumberroflogicalsectorsforanentireC*ˆharddiskasIOSSPT*IOSHDS*IOSTRK,andIOSSPT*#ofheads*IOSTRK?*ˆforafloppy.‚TheorderofmultiplicationisimportantastheB*ˆfirst2factorsarebothone-bytevalues,thusassuringthatthe.*ˆintermediateproductdoesn'texceed16bits.*0L0845„MULU†D5,D2#ofheadsbysectorspertrack7L0850„EQU‡IOSTRK-IOSDRSV†offsetthenumberofcylinders.‰MULU.W„L0850(A0),D2ˆtimesnumberofcylinders?CNERROR2BEQ‡CONERROR‹cannotbezero-somevaluemustbewrong6‰CMP.L…#LSNMASK,D2‰seeifbiggerthanlargestpossible1‰BHI‡CONERRORŒbranchifto7 obig-errorsomewhere*@*ˆIfthediskisadoubledensityfloppydisk,subtractIOSSPT/2=*ˆfromthetotalnumberoflogicalsectorstoaccountforthe<*ˆfactthatthesectorsintrackzeroaresingledensityand*ˆhalfthesizeoftherest.*2L0860„EQU‡IOSATW-IOSDRSV†offsettoattributesword/‰BTSTW…#IOADDEN,L0860(A0)‚seeifdoubledensity$‰BEQ.S…L0870branchifsingledesity)‰LSR‡#1,D0get(sectors/track)/2‰01/27/846‰BHI.S…SUBSETRifeven,use(sectors/track)/2‚01/27/843‰ADDQ†#1,D0ifodd,incr.(sectors/track)/2‚01/27/843SUBSETR‚SUB.L…D0,D2getridof1/2trackofsectors3CNERROR3BLS‡CONERRORŒbranchiflessthan0-error*>*ˆNowletsseehavemanyVERSAdossizedsectorswereallyhave*L0870„MOVE.L„D2,D0sectorcount‰CLR.W…D2’clearforuse‰SWAP†D2$‰DIVU†D1,D2dividebyVDOSRSZ/IOSPSM5L0880„EQU‡IOSRSZ-IOSDRSV†offsettototalsectorcount"‰MOVE.W„D2,L0880(A0)ˆandsavehalf‰MOVE.W„D0,D2dofortherest ‰DIVU†D1,D2$‰MOVE.W„D2,L0880+2(A0)†savetherest‰PAGE*4*ˆNowcopytheproposedconfigurationfromtheusers6*ˆconfigurationparameterblockintotheconfiguration<*ˆparameterblockbeingupdated(eithertheCCBortheDCB).*3‰MOVEQ…#IOSDRSV-IOSATW-1,D0Šnumberofbytestomove8L0330„MOVE.B„-(A0),-(A2)‰dothemove-startatthebottom-‰DBRA†D0,L0330ŒA2pointstoIOSATWattheend;‰BTSTW…#CCBFCF,CCBFG(A5)ƒseeifthisisadefaultconfigure2‰BNE.S…L0830branchifadefaultconfigurecommand*8*ˆThissectionofcodeisonlyfortheconfigurecommand*6*ˆSeeifthisisamount,dismount,orconfigureonly.:*ˆIfIOSOPTfieldiszerothisisamountcommand.Setthe:*ˆmountedflagtoindicatethis.‚IftheIOPDMNTbitisset;*ˆthisisadismountandwehavetotellourselvesthatand2*ˆVERSAdosalso.‚VERSAdoswillthenknowtochange;*ˆbacktodefaultconfigurationandthevolumeisnolonger*ˆthere.*7‰MOVE.W„IOSOPT(A3),D0‡gettheoptionsfieldoftheIOCB'‰BNE.S…L0820branchifdismountcommand#‰ST.B†MOUNTED(A1)‰setmountedfield,L0820„ROL.W…#15-IOPDMNTB,D0…getdismountbit‰BPL.S…L0830branchifmount$‰CLR.B…MOUNTED(A1)‰settodismounted)‰ST.B†DCBCCF(A4)ŠsetdismountinDCBalso3L0830„BSR‡STATCON1Œgoupdatedevicestatusandtype‰PAGE*@*ˆNowbuildthepacketinformationforthediskcontrollerboard*%‰BSR‡SETPKTŽsetinitialpacketheader%‰MOVE.W„#XCONFIG,D1‰configurecommand!‰MOVEP.WƒD1,IPCCHCM(A1)†topacket8‰MOVE.L„CCBPTR(A5),A0‡getuser'sparameterblockaddress1‰MOVE.B„#CNPKSZ,IPCPKSZ(A1)29bytepacketlength6‰BTSTW…#IOARDISC,IOSATW(A0)Šseeiffloppyorharddisk#‰BNE‡CONFH010Œbranchifaharddisk*(*ˆbuildfloppydiskconfigurationpacket*ˆdoattributesbyte0first%*ˆA0=user'sparameterblockaddress!*ˆA1=M315sharedmemoryaddress*!‰CLR.L…D1ˆbuildattributesbyte0'‰BTSTW…#IOASIZE,IOSATW(A0)8"or5.25"?4‰BEQ.S…CONFF010‚branchif5.25-isalsothedefault‰BSET†#2,D1…setfor8"disketteA‰BRA.S…CONFF020‚leavecompensationattrib.bitunchanged01/27/84;CONFF010BSET†#1,D1…setnocompensationfor51/4"‹01/27/84CONFF020CLR.L…D2-‰MOVE.W„IOSPCOM(A0),D2…getthepre-compvalue.‰MOVEP.WƒD2,IPCFPCN(A1)setthepre-compvalue2‰BTSTW…#IOADPCOM,IOSATW(A0)‚pre-comporpost-comp?8‰BEQ.S…CONFF030Œbranchifpre-alsothedefault01/27/84%‰BSET†#0,D1setforpost-compensation1CONFF030BTSTW…#IOADSIDE,IOSATW(A0)†singlesided?(‰BEQ.S…CONFF040Œbranchifsinglesided- ‰BSET†#4,D1setfordoublesided/CONFF040BTSTW…#IOADDEN,IOSATW(A0)FMencoding?‰BEQ.S…CONFF050ŒbranchifFM ‰BSET†#5,D1…setforMFMencoding0CONFF050TST.B…IOSSOF(A0)Šspiraloffset?11/7/83*‰BEQ.S…CONFF060Œbranchifnospiraloffset!‰BSET†#6,D1setforspiraloffset.CONFF060BTSTW…#IOAFRMT,IOSATW(A0)IBMformat?‰BNE.S…CONFF070‚branchifIBM#‰BSET†#7,D1…setforMotorolaformat5CONFF070MOVE.B„D1,IPCFATR0(A1)…setattributesbyte0**ˆattributesbyte1*‰CLR.L…D1ˆclearforuse*‰MOVE.B„IOSSR(A0),D1ˆgetthesteppingrate!‰CMP.B…#0,D1isitzero?“01/27/8407 ‰BNE.S…CONFF080Œno-savesteppingrate‡01/27/847‰BTSTW…#IOASIZE,IOSATW(A0)yes-51/4"or8"?‹01/27/844‰BEQ.S…CONFF075Œ51/4",usesteppingcode1ƒ01/27/84-‰ADD.B…#1,D18",usesteppingcode2‡01/27/842CONFF075ADD.B…#1,D1steppingcode1or2Š01/27/845CONFF080MOVE.B„D1,IPCFATR1(A1)…setthesteppingrate**ˆrestofthepacket*0‰MOVE.B„IOSSPT(A0),IPCFSPT(A1)ˆsectorspertrack"‰MOVE.B„#1,D1™setforsinglesided/‰BTSTW…#IOADSIDE,IOSATW(A0)isitsinglesided?&‰BEQ.S…CONFF090‚branchifsinglesided"‰MOVE.B„#2,D1…setfordoublesided-CONFF090MOVE.B„D1,IPCFSID(A1)†set#ofsides%‰MOVE.W„IOSPSM(A0),D1‡getsectorsize'‰MOVEP.WƒD1,IPCFSLG(A1)†setsectorsize(‰MOVE.W„IOSTRK(A0),D1‡get#ofcylinders‰MOVEP.WƒD1,IPCFNC(A1)‡setit ‰CLR.L…D1)‰MOVEP.LƒD1,IPCFNU(A1)‡clearunusedbytes3‰MOVE.B„IOSILV(A0),IPCFIF(A1)…setinterleavefactor‰BRA.S…CONFH050“andcontinue*&*ˆbuildpacketforharddiskconfigure*CONFH010CLR.L…D1&‰MOVEP.WƒD1,IPCFATR0(A1)…noattributes9‰MOVE.B„IOSSPT(A0),IPCHSPT(A1)ˆsetsectors/trackƒ01/27/84-‰MOVE.B„IOSHDS(A0),IPCHNOH(A1)ˆset#ofheads%‰MOVE.W„IOSPSM(A0),D0‡getsectorsize'‰MOVEP.WƒD0,IPCHSLG(A1)†setsectorsize/*ˆMOVE.W„#$8000,D0‹setfordefaultsonpre-comp0*ˆBTSTW…#IOSPCOMB,IOSPRM(A0)Špre-compspecified?(*ˆBEQ.S…CONFH020Œbranchifnotspecified)‰MOVE.W„IOSPCOM(A0),D0†getpre-compvalue%CONFH020MOVEP.WƒD0,IPCHPC(A1)‡setit(‰MOVE.W„IOSTRK(A0),D0‡get#ofcylinders‰MOVEP.WƒD0,IPCHNC(A1)‡SETIT8*ˆMOVE.L„#$8000,D0‹setforreducedwritecurrentdefault=*ˆBTSTW…#IOSRWCCB,IOSPRM(A0)‚reducedwritecurrentspecified?(*ˆBEQ.S…CONFH030Œbranchifnotspecified:‰MOVE.W„IOSRWCC(A0),D0†getspecifiedreducedwritecurrent(‰MOVE.W„IOSECC(A0),D1‡getECCvaluealso?CONFH030MOVEP.WƒD0,IPCHRWC(A1)†setreducedwritecurrentvalue‰MOVE.B„D1,IPCHECC(A1)†setECC6‰MOVE.B„#1,IPCHSCA(A1)†setsasicontrollerIDˆ01/27/84 *ˆCLR.L…D08*ˆBTSTW…#IOSILVB,IOSPRM(A0)interleavefactorspecified?(*ˆBEQ.S…CONFH040Œbranchifnotspecified+‰MOVE.B„IOSILV(A0),D0‡getinterleavefactor3CONFH040MOVE.B„D0,IPCHIF(A1)‡setinterleavefactor,CONFH050CLR.L…D0’usetoclearunusedfields‰MOVE.B„D0,IPCFNU1(A1)†notused ‰MOVEP.LƒD0,IPCFNU2(A1)†notused ‰MOVEP.WƒD0,IPCFNU3(A1)†notused!‰MOVE.B„#ETX,IPCHFETX(A1)ƒsetETX!‰CLR.L…D1’setfornoerrorsfound3‰MOVE.L„D7,A2restoreCMRparablkaddrƒJH01/24/84*‰BRA‡NRMEXITgosendthepacketandreturn‰PAGEL******************************************************************************ˆCONFIGURATIONERRORROUTINE*8*ˆControlcomeshereisthereisadetectederrorinthe*ˆconfigurationcommand.*ˆentry:ƒD3=errorcode0*‘D6=physicaladdressofusersparameterblock7*‘D7=physicaladdressofCMRparameterblock‡11/17/83.*ˆNote:„Mustrestore‚D6andD5beforeexiting.*L**************************************************************************** CONERROR:4‰MOVE.L„CCBDTBL(A5),A0†devicetableaddress‚01/27/84‰MOVEQ.Lƒ#0,D0¥01/27/84,‰MOVE.B„DCBCDV(A4),D0‡devicenumber‰01/27/84-‰MULU†#LUENTRY,D0‰calculateposition„01/27/84/‰CLR.W…LUFLG(A0,D0.L)†unsetactivebit†01/27/84)‰MOVE.L„D6,A0…getusersparameteraddress%‰MOVE.B„D3,IOSDST(A0)‡saveerrorcode1‰MOVEQ…#ISTACNF+$FFFFFF00,D1‰setmajorerrorcode>*ˆMOVEM.Lƒ(A7)+,D5/D6‰restoreregs-notusedfor31501/27/842‰MOVE.L„D7,A2includingCMRparablkaddrƒ11/17/83‰BRA‡ABORTandreturn‰PAGEL******************************************************************************‰READCOMMAND*,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory*L*****************************************************************************READ:5ŠBSR„IOSCOMNŒDothestuffcommontoallI/Ocommands,7ŠMOVE.LD6,CCBPTR(A5)†savethebufferphysicaladdress. ŠCLR.L‚D6&ŠBSETƒ#LUFXFR,D6ŒSETDATATRANSFERBITŠBSETƒ#LUFAC8 T,D6ŒSETACTIVEBIT%ŠBSR„DEVTBLSETUPDEVICETABLEENTRYŠBSR„DSKPRMVALIDATEPARAMETERS/ŠBSR„SETPKTSETUPPACKETHEADERINSHAREDMEM.ŠMOVE.Wƒ#XREAD,D1&ŠBSR†DSKCMDŽYES,SETUPCOMMANDPACKETŠBRA†NRMEXITGOFINISHUPŠPAGEL******************************************************************************‰WRITE**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory**L*****************************************************************************WRITE:5ŠBSR„IOSCOMNŒDothestuffcommontoallI/Ocommands,7ŠMOVE.LD6,CCBPTR(A5)†savethebufferphysicaladdress. ŠCLR.L‚D6&ŠBSETƒ#LUFXFR,D6ŒSETDATATRANSFERBITŠBSETƒ#LUFACT,D6ŒSETACTIVEBIT%ŠBSR„DEVTBLSETUPDEVICETABLEENTRYŠBSR„DSKPRMVALIDATEPARAMETERS/ŠBSR„SETPKTSETUPPACKETHEADERINSHAREDMEM.:ŠBTSTW„#DATWRC,DCBATT(A0)‚WRITEWITHVERIFYFORTHISDCB?ŠBEQ.S„WRIT30ŽNO4ŠMOVE.Wƒ#XWRITC,D1ŠYES,SETUPWRITE/VERIFYCOMMANDS ŠBRA.S„WRIT408WRIT30„MOVE.Wƒ#XWRITN,D1ŠSETUPWRITE/NOVERIFYCOMMANDS 'WRIT40„BSR†DSKCMDŽSETUPCOMMANDPACKETŠBRA†NRMEXITGOFINISHUPŠPAGEH**************************************************************************ˆFORMATDISKCOMMAND*,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB* *‰Additional-*‰Registers‚A1=addressofIPCsharedmemory**I**************************************************************************FORMAT: )‰BTSTWƒ#IOPFTRK,IOSOPT(A3)‚FORMATTRACK?‰BEQ.SƒFORMT20ŽBRANCHIFNO !‰MOVE.L‚IOSRRN(A3),D1‰PICKUPRRN%‰BPL.SƒFORMT20GOODIDPOSITIVEVALUE/FORMT10‚MOVE.B‚#ISTARR,D1ŒSETUPIOSERRORCODE ‰BRA…ABORT FORMT20‚CLR.LƒD6‰BSET„#LUFACT,D6ŒSETACTIVEBIT%‰BSR…DEVTBLSETUPDEVICETABLEENTRY5‰LEA‡LUCONF(A0,D0.L),A1‚GETADDRESSOFCONFIUREBLOCK(‰BTSTW…#IOPFTRK,IOSOPT(A3)‚FORMATTRACK?‰BEQ.S…FORMT25ŽBRANCHIFNO3‰CMP.LƒSECOFF(A1),D1ŠSEEIFTHISISBEYONDTHEDISK*‰BLT.SƒFORMT25BRANCHIFSTILLONTHEDISK*‰CLR.WƒLUFLG(A0,D0.L)ˆUNSETTHEACTIVEBIT‰BRA‡FORMT10ANDRETURN6FORMT25‚BSR…SETPKTSETUPPACKETHEADERINSHAREDMEM. 0FORMT30ƒBTSTW„#IOPFTRK,IOSOPT(A3)‚FORMATTRACK?ŠBNE.S„FORMT40YESŠMOVE.Wƒ#XFDISK,D16ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDS#ŠMOVE.Bƒ#ETX,IPCDETX(A1)„SETUPETX.ŠMOVE.Bƒ#FDPKSZ,IPCPKSZ(A1)SETUPPACKETSIZEŠBRA†NRMEXITGOFINISHUP FORMT40ƒMOVE.Wƒ#XFTRAK,D16ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDSŠMOVE.Wƒ#SECSIZ,D1)ŠMOVEP.W‚D1,IPCBKSZ(A1)†SETUPBLOCKSIZE ŠCLR.L„D1*ŠMOVEP.W‚D1,IPCNBKS(A1)†ZERONO.OFBLOCKSŠMOVE.LƒIOSRRN(A3),D1"ŠMOVEP.L‚D1,IPCFPSN(A1)†SETUPPSN#ŠMOVE.Bƒ#ETX,IPCFETX(A1)„SETUPETX.ŠMOVE.Bƒ#FTPKSZ,IPCPKSZ(A1)…SETUPPACKETSIZEŠBRA†NRMEXITGOFINISHUPŠPAGEL*****************************************************************************C*‰ROUTINECOMMONTOALLI/OCOMMANDS(READ,WRITE,OUTPUTW/INPUT)**‚Entry:A3=addressofIOCB*‰A5=addressofCCB**L*****************************************************************************IOSCOMN:?ŠBTSTW‚#IOPTSKB,IOSOPT(A3)Ifthebuffersresideinadifferent"ŠBEQ.S‚IOSC005ŒtaskfromtheIOCB, 9ŠLEA„IOSTSK(A3),A0†Pointtothetaskname&sessionofthe7ŠTR0$.GETTCB‚,Œbufferowner&callexectogetaddress."ŠBRA.S‚OKTCBŽIfit'sgood,branch.ŠNOP—Ifit'sbad,7ŠMOVE.B#ISTAADD,D1ˆsetstatusinIOCBtoaddresserrorŠTST.L‚(A7)+ŽadjuststackŠBRA„ABORTandexittoCMR. :OKTCB…MOVE.LA0,CCBTASKB(A5)„SavephysicaladdressofTCB. *<*‚ValidatetheinfointheIOCBabouttheprimarybufferand *‚converttophysicaladdresses.*BIOSC005ƒMOVE.LIOSSAD(A3),D6†D6<--bufferphysicalstartaddress.+ŠMOVE.LIOSEAD(A3),D5†D5<--bufferlength.ŠSUB.L‚D6,D5Ž* ŠADDQƒ#1,D5Ž*)ŠMOVE.LD5,CCBLEN(A5)†Savel8 engthinCCB. >ŠMOVE.LCCBTASKB(A5),A1„A1<--addressofTCBofbufferowner. ŠBSR„IOHADRCK‹Checktheaddress.$ŠBRA.S‚IOSC010ŒIfit'sgood,branch.ŠNOP—Ifit'sabadbaseaddrŠTST.L‚(A7)+Žadjuststack4ŠMOVE.B#ISTAADD,D1ˆSetIOCBstatustoADDRESSERROR2ŠBRA„ABORTandexitwithappropriateerrorstatus. IOSC010ƒRTSŠPAGEK****************************************************************************/*‰VALIDATEBUFFERADDRESS&CONVERTTOPHYSICAL*$*‰Entry:D5=bufferlengthinbytes-*D6=bufferlogicalstartaddr(toconvert)*A3=addressofIOCB*A5=addressofCCB***‰Exit:‚D6ƒ=bufferphysicalstartaddress*D5ƒ=bufferlength*K****************************************************************************BUFADDR:>ŠMOVE.LCCBTASKB(A5),A1„A1<--addressofTCBofbufferowner. ŠBSR„IOHADRCK‹Checktheaddress.$ŠBRA.S‚OKADDR2ŒIfit'sgood,branch.ŠNOP—Ifit'sabadbaseaddrŠTST.L‚(A7)+Žadjuststack4ŠMOVE.B#ISTAADD,D1ˆSetIOCBstatustoADDRESSERROR2ŠBRA„ABORTandexitwithappropriateerrorstatus.OKADDR2ƒRTS—Return.ŠPAGEO*********************************************************************************ˆCHECKDISKPARAMETERS**%*‚Entry:A0=addressofdevicetable%*‰A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB,*‰D0=‚offsetindevicetableforthisdevice**O********************************************************************************DSKPRM:3‰LEA…LUCONF(A0,D0.L),A1„GETADDRESSOFCONFIGUREPB%‰MOVE.W‚IOSOPT(A3),D1‰PICKUPOPTIONS+‰AND.Wƒ#IOPRAN,D1ŒRANDOMOPTIONSPECIFIED?‰BNE.SƒDSKPR10YES(‰MOVE.B‚#ISTATM,D1ŒSETUPIOSERRORCODE‰TST.Lƒ(A7)+‘ADJUSTSTACK‰BRA…ABORTERROREXIT(DSKPR10‚MOVE.L‚IOSRRN(A3),D1‰PICKUPRRN‰BPL.SƒDSKPR30GOODRRN/DSKPR20‚MOVE.B‚#ISTARR,D1ŒSETUPIOSERRORCODE DSKPR25‚TST.Lƒ(A7)+‘ADJUSTSTACK*‰CLR.WƒLUFLG(A0,D0.L)‡SETTODOINGNOTHING‰BRA…ABORTERROREXITŠSPC„2ADSKPR30ƒCMP.LƒSECOFF(A1),D1‡Iftherandomrecordnumberspecified7ŠBLT.SƒDSKPR35‹intheIOCBispasttheendofthedisk,2ŠMOVE.B#ISTAEOV,D1ˆreturnanend-of-volumeerror.ŠBRA.S‚DSKPR25ŠSPC„22DSKPR35‚MOVE.L‚CCBLEN(A5),D1‰PICKUPBUFFERLENGTH"‰DIVS„#256,D1CALC.NO.OFSECTORS ‰MOVE.L‚D1,D2*‰AND.Lƒ#$FFFF0000,D2‰MUSTBEWHOLESECTORS‰BEQ.SƒDSKPR40ITSOK5‰MOVE.B‚#ISTAADD,D1‹ERROR,PARTIALSECTORNOTALLOWED‰BRA…DSKPR25RETURN1DSKPR40‚MOVE.W‚D1,CCBBLKS(A5)ˆSAVENO.OFSECTORS2‰ADD.LƒIOSRRN(A3),D1‰CALC.LASTSECTORTOTRANSFER‰CMP.LƒSECOFF(A1),D1‰RANGEOK?‰BLE.SƒDSKPR50YES4‰MOVE.L‚SECOFF(A1),D1‰NO,CALC.MAXSECTORSCANREAD‰SUB.LƒIOSRRN(A3),D1/‰MOVE.W‚D1,CCBBLKS(A5)ˆSAVESECTORSTOTRANSFER ‰BSET„#LUFEOF,D6ŒSETEOFPENDING-‰MOVE.WƒD6,LUFLG(A0,D0.L)„SETINDEVICETABLEDSKPR50‚RTS›RETURN‰PAGEO********************************************************************************** SET UP DEVICE TABLE ENTRY**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB**‰D6=devicetableflag*N*******************************************************************************DEVTBL: ŠCLR.L‚D0(ŠMOVE.BDCBCDV(A4),D0‰PICKUPDEVICENO. ŠCMP.B‚#LUMAX,D0DEVICENO.OK?%ŠBGT„KILR’NO,BRINGTHESYSTEMDOWN! ŠMULUƒ#LUENTRY,D0‹CALC.POSITION3ŠMOVE.LCCBDTBL(A5),A0ˆPICKUPDEVICETABLEPOINTER(ŠTST.W‚LUFLG(A0,D0.L)ŠTHISDEVICEFREE?ŠBEQ.S‚DEVT010YESŠTST.L‚(A7)+‘ADJUSTSTACK+ŠMOVE.B#ISTADB,D1ŒRETURNDEVICEBUSYERRORŠBRA„ABORTERROREXIT2DEVT010ƒMOVE.WD6,LUFLG(A0,D0.L)‡UPDATETABLEFLAG,ŠMOVE.LA4,LUDCB(A0,D0.L)‡SETUPDCBADDRESS.ŠMOVE.LA3,LUIOCB(A0,D0.L)†SETUPIOCBADDRESS6ŠMOVE.LCCBTASKB(A5),LUTCB(A0,D0.L)SETUPTCBADDRESS8ŠMOVE.LCCBPTR(A5),LUBADR(A0,D0.L)SETUPBUFFERADDRESS ŠRTSšRETURNŠPAGEJ***************************************************************************%*ˆSE9 TUPPACKETHEADERINSHAREDMEM.**,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB*,*‰Return:A1=addressofIPCsharedmemory**I**************************************************************************SETPKT:%ŠMOVE.LƒCCBCHB(A5),A1‡MEMMAPPEDADDR)ŠLEA†IPCIM1(A1),A1‡SETUPMESSAGEADDRESSŠMOVE.Wƒ#SPKT,D1/ŠMOVEP.W‚D1,IPCSTX(A1)‡SETUPSTXANDPACKETID0ŠMOVE.BƒDCBCDV(A4),IPCPHDV(A1)‚SETDEVICENUMBER ŠRTSšRETURNŠPAGEJ***************************************************************************)*‰SETUPDISKPARAMETERSINSHAREDMEMORY*&*‚Entry:A1=addressofSHAREDMEMORY%*‰A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB**‰D1=CHANNEL/DEVICEcommands*K****************************************************************************DSKCMD:6ŠMOVEP.W‚D1,IPCCHCM(A1)†SETUPCHANNEL/DEVICECOMMANDSŠMOVE.WƒCCBBLKS(A5),D18ŠMOVEP.W‚D1,IPCNBKS(A1)†SETUPNO.OFBLOCKSTOTRANSFERŠMOVE.Wƒ#SECSIZ,D1)ŠMOVEP.W‚D1,IPCBKSZ(A1)†SETUPBLOCKSIZEŠMOVE.LƒCCBPTR(A5),D1*A*ˆAdjusttheaddressifanoffboardoffsetapplies.…(JH*08/27/84)* ŠGO_OFF_BDD16*‰CMPI.Lƒ#MEMTOP,D1ŠONBOARDMEMORY(VME/10)?ƒ03/28/84*‰BGT.S„GOGON1ŽNOš03/28/845*‰ADDI.Lƒ#OFFST,D1‹YESADJUSTBUFFERADDRESSƒ03/28/84*¦FORVME/10’03/28/84=GOGON1„MOVEP.L‚D1,IPCBUFAD(A1)…SETUPBUFFERADDRESS‡03/28/84 ŠCLR.L„D1'ŠMOVEP.W‚D1,IPCCKSM(A1)†SETUPCHECKSUMŠMOVE.LƒIOSRRN(A3),D1#ŠMOVEP.L‚D1,IPCCMPRM(A1)…SETUPPSN"ŠMOVE.Bƒ#ETX,IPCETX(A1)…SETUPETX.ŠMOVE.Bƒ#IOPKSZ,IPCPKSZ(A1)SETUPPACKETSIZE ŠRTSšRETURNŠPAGEO******************************************************************************** *ˆNORMALEXIT*,*‚Entry:A2=addressofCMRparameterblock*‰A3=addressofIOCB*‰A4=addressofDCB*‰A5=addressofCCB*‰A6=addressofusersTCB*I**************************************************************************NRMEXIT:*/* INDICATE AWAITING ACK, BUMP I/O PENDING COUNT*'ŠBSETW‚#CCBFGWAK,CCBFG(A5)ƒSETCCBFLAGŠMOVE.LCCBTASKB(A5),A0-ŠADD.B‚#1,TCBIOCNT(A0)„BUMPI/OPENDINGCOUNT0D"N*92F:7B:JBR=Z8b<j9r:zF‚>** INTERRUPT THE IPC*0ŠMOVE.LCCBCHB(A5),A1†SETUPSHAREDMEM.POINTER (ŠMOVE.B#$80,IPCIMB1(A1)ƒMESSAGEWAITING0ŠADD.B‚#2,CCBICNT(A5)…BUMPOUTSTANDINGINTCOUNT:*ˆTheMVME315doesnothaveaninterruptbyte.‚Itactually<*ˆgetsinterruptedwitheverybyutewrittentoit.Thisline/*ˆisleftherefordocumentationpurposesonly.&*‰MOVE.B#$80,IPCINT(A1)„INTERRUPTIPC#ŠCLR.L‚D0‘SETUPGOODRETURNTOCMR*7* USER REQUEST SIDE OF IPC ALWAYS EXITS FROM THIS POINT*IPCUSRTN‚EQU„*ŠRTS—RETURNTOMAINLINEŠPAGEJ****************************************************************************ˆKILR(KILLER)*3*“ROUTINECALLEDTOHANDLEUNRECOVERAVLECONDITIONS**K****************************************************************************KILR: ‰TR0$.KILLER    J*****************************************************************************ˆABORTCOMMANDROUTINE*%*’ENTRY:A2=PARAMETERBLOCKADDRESS*™A3=IOCBPACKETADDRESS*™A4=ADDRESSOFDCB*™A5=ADDRESSOFCCB*™A6=ADDRESSOFCALLERSTCB*™D1=IOSERRORCODE*H*************************************************************************ABORT:)‰LEA‡CCBPKT(A5),A4‡SETUPQUEUEWORKAREA ‰MOVE.L„#6,D0SETUPPACKETSIZE"‰MOVE.L„XIOUID(A2),D2‡SETUPPBID‰AND.W…#$FF,D1!‰MOVE.W„D1,D3SETUPSTATUSVALUE!‰MOVE.B„D1,IOSSTA(A3)‡UPDATEIOCB$‰MOVE.B„#XPSNRM,D1ŠSETUPEVENTTYPE‰BSR‡QEVNTGOQUEUEEVENT5‰MOVE.L„XIOUID(A2),A4‡RESTOREDCBADDRESSˆJH01/24/84 ‰CLR.L…D9 0‰BRA‡IPCUSRTNŒRETURNŠPAGEF***********************************************************************B* SUBROUTINE TO CHECK ADDRESS BOUNDARIES TO SEE IF ENTIRELY WITHIN*ƒCALLINGTASKSADDRESSSPACE.*#*ENTRY:ƒD5‚-NO.OFBYTESTOCHECK*ŠD6‚-68000ADDRESS(LOGICAL)*ŠA1‚-TCBADDRESS** EXEC ROUTINE#* REGISTERS USED: D0-D1,D3,D6/A0-A1**7*EXIT:„D6-PHYSICALADDRESSOFBUFFERBASE(IFLEGAL)*ŠRETURNTOPC„FORGOODADDRESS*”PC+2‚FORBADLENGTH*”PC+4‚FORBADADDRESS*F*********************************************************************** IOHADRCK:$ŠBTSTƒ#0,D6ŽMUSTBEONWORDBOUNDARY(ŠBNE.S‚IOHADR6ŒBRANCHIFBADBUFFERBASE ŠTST.L‚D5.ŠBEQ.S‚IOHADR8ŒDON'TGOTOLOGPHYWITH0COUNT/ŠMOVE.LTCBTST(A1),A0†ADDRESSOFTASKSEGTABLE ŠTR0$.LOGPHY&ŠBRA.S‚IOHADR8ŒBRANCHFORGOODADDRESS-IOHADR6ƒADD.L‚#2,(A7)ŒADJUSTFORERRORRETURN IOHADR8ƒRTSŠPAGEI****************************************************************************‚CMRRESETROUTINE8*ˆTheMVME315doesnotsupportthereset.Ifthecommand8*ˆchannelmemoryisincorrectthechannelismarkeddown9*ˆandtheuserisnotified.‚Allthecodetoactuallysend;*ˆaresettotheboardiscommentedout.‚Theresetwasused@*ˆbytheUDCandFDCtotrytorecoverfromabadsharedmemory.*%*ˆENTRY:A2=PARAMETERBLOCKADDRESS*A3=PACKETADDRESS*A5=CCBADDRESS*A6=CALLERSTCBADDRESS*I**************************************************************************CMRREST:*/ŠMOVE.LCCBCHB(A5),A4†SETUPSHAREDMEMPOINTER=* CLEAR ERROR MODE,WAITING FOR ACK, DEALT WITH ACK, EXIT FLAG&*‰CLR.L‚CCBNAKAD(A5)‡CLEARNAKADDRESS(*‰CLR.L‚CCBERAD1(A5)‡CLEARERRORADDRESS*‰INHIB•INHIBITINTERRUPTSEŠAND.W#-1-(1<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1*ˆN: OTE!!!!!!!!!!!!!!!!!!”NOT:Isrestored(MS)/*ˆRESTORETHISLINEWHENTHEBOARDHASQUEUEING*:*‰AND.W‚#$FFFF-(1<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2*‚RESTORETHISLINEALSOšNOT:Isrestoredalso(MS)*IPC15000‚EQU„***%* SEE IF I/O COMPLETION HAS OCCURRED.,*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‚RESTORETHESETWOLINES*²NOT:Arerestored(MS)*‰BCLRW‚#CCBIPCW,CCBFG(A5)0*‰BEQ.S‚IPCNRTN1‹BRANCHIFNOI/OCOMPLETIONSET*A*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;*ˆDELETETHENEXT3LINESWHENQUEUEINGWORKDSONTHEBOARD*°NOT:Havebeendeleted(MS)!IPC15000‚BCLRW#CCBIPCW,CCBFG(A5)‰BEQ.S…IPCNRTN1%‰AND.W…#$FFFF-(1<*ˆThesevariablesareXREFedinthelinkchainfileM320DRV.LG=*ˆandallowtheusertomodifycertainmedia/driveparameters>*ˆwithouthavingtore-assemblethedriver.‚Seethelinkchain+*ˆfileforadescriptionoftheparameters.* ‰XREFFRMT_SD ‰XREFFRMT_DD ‰XREFFRMT_HD ‰XREFSETTM_5 ‰XREFSETTM_8‰XREFSETTM_HD ‰XREFLDTM_5 ‰XREFLDTM_8 ‰XREFLDTM_HD **‰MISCEQUATES*5DRIVESƒEQU‡4“Maximumnumberofdrives(LUN)perboardEXEC…EQU‡0“RMS68Ktrap# PAGE**ˆMACROSUSEDBYTHISDRIVER* (* Macro file to use with VMEbus drivers:*ˆINCLUDE9995.&.DUALPORT.MC‰INCLUDE9995.&.DUALPORT.MC *ˆLONGWORDMACROK* This macro skips zero or more bytes in memory (if necessary) to align theM*assembler'slocationcountertoalong-wordboundary.‚Wedefinealong-wordC* boundary to be a location whose address is evenly divisible by 4.F* If the location counter isn't on a long-word boundary, advance it by-* one word to put it on a long-word boundary. LONGWORD MACRO‰DS.W…0 ‰IFNE…*/4*4-*‰DS.W…1‰ENDC‰ENDM *ˆMOVEIAMACROJ*‚Thismacroisusefulwhenwewanttoputanimmediatevalueintoan1*register,i.e.‚[