IMD 1.17: 11/11/2014 15:02:21 82VKXBVERDOS C* VERSADOS/RMS68K OBJECT 4.4 SN=48634 18 OF 22  BT18b82VKXBVERDOS 0420¿ -Š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éééé*‚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.*@*‰ThistableisexaminedbyCMRwhenthec hannelisallocatedtoC*‰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,D1hasbeensetup'*§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*ˆThe subordinatechannel'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*Œtheinterruptisnotforus.‚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éééééé  é>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.éééé "*T2F::B4J<R6Zb>j>rzN‚LŠ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_R  ESET‰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*pa  sstheinterruptontothenextguyinthechain*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‡branchifanyerrorbitsareon‰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,aspertheMPSCDRVdr  iver:***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‰MOVE.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  ééé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*„deviceare  awasdeleted.*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Û9ãGëHóIûH: 7KX#L+J3;;6C<KASE[<c9kIsH{?ƒ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‘TERMINALCONFIGPARAMETEREDITMASK5TERATM„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…$1001RE AD!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ˆDROPPROCESSORPRIORITYBYONE‰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ƒ#ISTAC NF,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*%*‰SETUPSTOPBITSFROMATTRIBUTE WORD*(Š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„IPC R240Ž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<--addressofDCBconfiguration. *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)†theus ersconfiguredatablockandreturn(Š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ƒ#XREAD,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=a ddressofusersTCB* *‰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„DEVTBLSETUPDEVICETABLEENTRY /Š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ŽSETUPPACKETHEADERINSHAREDMEM. Š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ƒDSKPR10YES(‰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ŒSET EOFPENDINGDSKPR50‚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=addressofDCB*‰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**************************************************************************NRME XIT:*/* 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ü:N H@C$;,B4H<'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ƒPRINTE R? *º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*,*‰MovecurrentconfigBRKcharto2ndpa cket*Š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(thosenotAŠ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?ŠB NE.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***"* DI SK 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ééé&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%*¦DMAwa scomplete.‚Alsotore-enable"*¦ifHaltIOorBusErroroccurred.*)*£5)FixedlengthbuffertransfersofDMA&*¦readwerenotbeingproperlysetup.&*¦TheIOSbufferlengthwasbeingused&*¦insteadofthesysgenedfixedbuffer!*¦length.Alabelandbranchwere*¦modifiedinREADDATA.*#*ˆ5/31/84ƒBWNŽVME/10problemfixed:'*¦ThedriverdidnotworkonthwVME/10&*¦becausetheoff-boardRAMisseenat"*¦differentaddressesbythe68010*¦andtheGPIBdevice.&*¦Twomacroswerecreatedtocorrectly*¦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.DDMJU-*œ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 é ééééé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*V]3fSn0v6~7†DŽ6–7žC¦I®?¶F¾5ÆDÎ?Ö5Þ7æ1î:ö@þ4-423&<.G6>>AFC9*ƒ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.&.T CB.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-upforthe4*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,26se ctors *‰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"*!*=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*2STATUSVALUE RTNSTPRƒ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* * 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***************************************************************************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Žsoexitwithaninvalidfunctionerro r.Š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&*£theIOSATMfieldoftheusersstatus%*£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=a ddressofuser'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-de  nsity5‰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Œbranchiftoobig-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/840‰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=physicaladdr! essofCMRparameterblock‡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ƒ#LUFACT,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)†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ƒ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)ˆSAV" ESECTORSTOTRANSFER ‰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***************************************************************************%*ˆ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)‡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/OPENDINGCOUNTeNDWN_9gFo7w:B‡=8—<Ÿ9§:¯F·>** INTERRUPT THE IPC*0ŠMOVE.LCCBCHB(A5),A1†SETUPSHAREDMEM.POINTER (ŠMOVE.B#$80,IPCIMB1(A1)ƒMESSAGEWAITING0ŠADD.B‚#2,CCBICNT(A5)…BUMPOUTSTANDINGINTCOUNT:*ˆTheMVME315doesnothaveaninterruptbyte.‚Itactually<*ˆgetsinterrupted# witheverybyutewrittentoit.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…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/Š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*ˆNOTE!!!!!!!!!!!!!!!!!!”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.‚[