IMD 1.17: 11/11/2014 11:25:30 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 14 OF 30  SR14q82VKXSVRDOS 0420¤m-‡SIGNALONEUSER DERQS10:!‰EXIT„SUB“exit(subroutineexit);‰ENDééééé é=/*=/*†M68XXX.DESEM.AF=/**=/* Chain file to assemble M68XXX.DESEM.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.DESEM.LS=/*=/IFC \1ƒ=ARGM68XXX.DESEM.LS=/ENDIF=/*/=ASM M68XXX.DESEM.SA,M68XXX.DESEM.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UST.EQ=/*}=/*=ENDéééééé9‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.UST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.UST.EQ‰LIST‰PAGE5DESEM„IDNT‚5,1„68xxxDIRECTIVE--DETACHFROMSEMAPHORE*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*"*„DESEMƒ--REV1.01ƒ7/01/79ƒ(HLD6)*Œ--TRAP1ROUTINE*-*‡PURPOSE:ƒREQUESTTODETACHAUSERSEMAPHORE*'*‰ENTRY:‚A6HASREQUESTOR'STCBADDRESS *‘A4HASPARAMETERBLOCKADDRESS* 0-SEMAPHORENAME* 4-SEMAPHOREKEY(NOTUSED)* 8-INITIALCOUNT* 9-SEMAPHORETYPE**ŠEXIT:ƒD0HASRETURNCODE)*’D0=0‚GOODRETURN,SEGMENTDEALLOCATED*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE0*ŠRTCDNFND-7ƒENTRYNOTFOUNDINUSERSEMTABLE*‰SECTIONLEVEL04* ‰XDEF†DESEM ‰XDEF†DESEMA‰XDEF†DSEM_SUB ‰XREF†SBDSEMX ‰XREF.S„SEMUST‰PAGE*5*ˆGetexclusiveaccesstousersemaphoretable(UST).* DESEM:+‰MOVE.L‚A4,A5ˆSAVEPHYSADDROFPARAMBLOCK ‰IFNE„MULTPROC ‰TR0.PƒSEMUST‰ENDC  **ˆLookforentryinUST.* *‰MOVE.LƒA6,A4TCBADDRESSINA4FORFNDSEM*‰TR0.FNDSEM‚<(A5),I>ŠARGISSEMAPHORENAME-‰BRA.S…DESEM_10ŒFOUNDMATCHINGENTRYINTABLE **ˆDidn'tfindentryinUST."*ˆReleaseexclusiveaccesstoUST,"*ˆandexitwitherror(notfound);* ‰IFNE„MULTPROC ‰TR0.PƒSEMUST‰END C *‰EXIT…RTCDNFNDERRORCODE-NOENTRYFOUND  **ˆFoundentryinUST.*ˆDeallocateit,&*ˆreleaseexclusiveaccesstotheUST,*ˆandexit(subroutineexit);* DESEM_10:)‰BSR.S…DSEM_SUBŒDEALLOCATETHISSEMAPHORE ‰IFNE„MULTPROC ‰TR0.PƒSEMUST‰ENDC !‰EXIT†SUB‘exit(subroutineexit);‰PAGE*#*ˆHeretodeallocateallsemaphores*ˆattrachedtothistask.* +*ˆSetA4topointtotheclienttask'stcb./*ˆCallthesubroutinetodetachallsemaphores,BjK`SO*ˆandexit(subroutineexit).* DESEMA: ‰MOVE.L„A6,A4 ‰BSR‡SBDSEMX ‰EXIT†SUB‰PAGE=***************************************************************(**‡Subroutinetodeallocateasemaphore."**‡CalledbybothDESEMandDSEMX.**=***************************************************************†FOUNDENTRY--DELETEIT* DSEM_SUB‰MOVE.L‚D0,D3‰ENTRYNUMBER/‰MOVE.L‚D3,D1‰SEMAPHOREADDRWILLBEIN(A1,D3)&‰TST.WƒUSTUCNT(A1,D1)‚ISTHISPOINTER?‰BGE.SƒDSEM_10ˆNO ‰MOVE.L‚USTSPTR(A1,D1),D3 DSEM_10: ‰CMP.Bƒ#1,USTTYPE(A1,D1)†TYPE1?‰BNE.SƒDSEM_20NO &‰TST.BƒUSTXCNT(A1,D1)‡YES-CHECKXCNT‰BEQ.SƒDSEM_20 ‰TR0.Vƒ†SIGNAL DSEM_20:3‰TST.WƒUSTUCNT(A1,D1)‡ISENTRYPOINTERORSEMAPHORE‰BPL.SƒDSEM_30ŽSEMAPHORE‰PAGE*9*†POINTERENTRY--CLEARITANDDECREMENTSEMAPHORECOUNT* &‰CLR.LƒUSTTNAME(A1,D1)„CLEARTASKNAME)‰CLR.WƒUSTUCNT(A1,D1)…CLEARPOINTERENTRY‰CLR.BƒUSTUCNT(A1,D3)‰SUB.Wƒ#1,USTUCNT(A1,D3) ‰BRA…DSEM_99  *;*†SEMAPHOREENTRY--MAKEANOTHERENTRYTHESEMAPHOREENTRY* DSEM_30:‰CLR.BƒUSTUCNT(A1,D3)&‰CMP.Bƒ#3,USTTYPE(A1,D3)‡ISITTYPE3?%‰BEQ.SƒDSEM_80‘TYPE3ISSPECIALCASE ‰SUB.W„#1,USTUCNT(A1,D3)‰BNE.SƒDSEM_40 &‰CMP.Bƒ#2,USTTYPE(A1,D3)‡ISITTYPE2?‰BNE…DSEM_96NO-DONE ‰MOVE.B‚USTXCNT(A1,D3),D01‰CMP.BƒUSTSEM+1(A1,D3),D0…ISINITIALCOUNTINSEM"‰BEQ…DSEM_96YES-OKTODELETEIT '‰MOVE.W‚#$400,USTUCNT(A1,D3)…SAVEENTRY(‰CLR.LƒUSTTNAME(A1,D3)ˆMARKIT-NOUSER ‰BRA…DSEM_99  *** DSEM_40:3‰MOVE.L‚USTSESSN(A1,D3),D7†SAVESESSIONFORCOMPARE4‰MOVE.L‚USTSNAME(A1,D3),D6†SAVESEMNAMEFORCOMPARE(‰CLR.LƒD4”ENTRY#OFNEWSEMAPHOREENTRY (‰MOVE.W‚USTCENT(A1),D2‡CURRENT#ENTRIES(‰MOVE.L‚#USTENTRY,D0‰OFFSETOF1STENTRY DSEM_50:.‰TST.WƒUSTUCNT(A1,D0)‡LOOKFORPOINTERENTRIES‰BGE.SƒDSEM_70 '‰CMP.LƒUSTSESSN(A1,D0),D7ƒSAMESESSION?‰BNE.SƒDSEM_70 .‰CMP.LƒUSTSNAME(A1,D0),D6ƒSAMESEMAPHORENAME?‰BNE.SƒDSEM_70 ‰TST.WƒD4FIRSTONEFOUND?‰BEQ.SƒDSEM_60ŠYES -‰MOVE.L‚D4,USTSPTR(A1,D0)…NOSAVENEWPOINTER‰BRA.SƒDSEM_70 **ˆBuildnewpointer.* DSEM_60:‰MOVE.L‚D0,D4ŠOFFSETVALUE*˜MOVESEMAPHORE%‰MOVE.W‚USTUCNT(A1,D3),USTUCNT(A1,D0)#‰MOVE.WƒUSTSEM(A1,D3),USTSEM(A1,D0)'‰MOVE.L‚USTSEM+2(A1,D3),USTSEM+2(A1,D0)%‰CLR.WƒUSTUCNT(A1,D3)„CLEAROLDENTRY DSEM_70:‰ADD.Lƒ#USTEL,D0‡NEXTENTRY'‰SUB.Wƒ#1,D2‡DECREMENTCOUNTOFENTRIES(‰BNE…DSEM_50…GOBACKTOCHECKNEXTENTRY ‰BRA.SƒDSEM_96‰NO‰PAGE**†DELETETYPE3SEMAPHORE* DSEM_80:#‰TST.B‚USTSEM+1(A1,D3)†ANYWAITERS?‰BPL.S‚DSEM_90ŽNO ,‰MOVE.LUSTSEM+2(A1,D3),A5„GETTCBOFWAITER,‰ADD.W‚#RTCDNFND,TCBRTCD(A5)ŠSENDERRORCODE*‰MOVE.BNE_CC,TCBCC(A5)ANDCONDITIONCODE0‰TR0.Vƒ†TAKEHIMOUTOFWAITLIST ‰BRA…DSEM_80‰PAGE*-*†FINDALLSEMAPHOREPOINTERSANDDELETETHEM* DSEM_90:‰MOVE.L‚USTSESSN(A1,D3),D7‰MOVE.L‚USTSNAME(A1,D3),D6‰MOVE.WƒUSTCENT(A1),D2‰MOVE.Lƒ#USTENTRY,D0 DSEM_92:‰TST.W„USTUCNT(A1,D0)‰BPL.S„DSEM_94 ‰CMP.L„USTSESSN(A1,D0),D7‰BNE.S„DSEM_94 ‰CMP.L„USTSNAME(A1,D0),D6‰BNE.S„DSEM_94 ‰CLR.W„USTUCNT(A1,D0)&‰CLR.L„USTTNAME(A1,D0)†CLEARTASKNAME DSEM_94:‰ADD.L„#USTEL,D0'‰SUB.W „#1,D2…DECREMENTCOUNTOFENTRIES(‰BNE†DSEM_92ƒGOBACKTOCHECKNEXTENTRY ‰CLR.W„USTUCNT(A1,D3)  *!*†GIVEUPEXCLUSIVEACCESSTOUST*DSEM_96:&‰CLR.LƒUSTTNAME(A1,D3)‡CLEARTASKNAME DSEM_99:‰RTS„.ˆRETURNTOUSERˆENDéé**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.ENV.EQ*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ˆINCLUDEƒ9995.&.UTILITY.MC*‰NOLIST‰INCLUDEƒ9995.&.ENV.EQ‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.INTERRUP.MC‰INCLUDEƒ9995.&.UTILITY.MC‰LIST‰PAGE‰IFEQ‚CHIPTYPE-68000"DISPATCHIDNT‚5,1„68000DISPATCHER‰ENDC‰IFEQ‚CHIPTYPE-68010"DISPATCHIDNT‚5,1„68010DISPATCHER‰ENDC*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*************ˆ*DISPATCH**ˆ*************4*„DISPATCH‚READYJOBS-EXECCODE(NOTASUBROUTINE).*‡ENTRY:NOPARAMETERS...CODEENTEREDWITHJMP5*‡EXIT:STARTSTASKEXECUTIONORWAITSFORINTERRUPT*2*‚USESREGISTERS‚(DOESN'TMATTER-NOTASUBROUTINE)**‚REVISIONHISTORY:*‚DATE†IDƒCHANGEJ*‚--------‚---‚-----------------------------------------------------------E*ƒ1/28/85‚SJF‚RemovedchecksforMMUHERE=0aroundcallstoLOADMMU.*ƒ1/8/81‚HLD6*ƒ5/18/79‚7616*ƒ3/6/79‚GGC3*‰SECTIONLEVEL00*‰XDEF†DISPATCH‰XDEF†L1_D0_SAVE ‰XDEF†PREEMPT ‰XREF†BKG_DISPATCH ‰XREF.S„EXCSTACK‰XREF.S„KILLER‰XREF.S„LOADMMU‰XREF.S„PERTURB_FLAGS‰XREF.S„PREEMPT_FLAG‰XREF.S„READYHD‰XREF.S„RUNNER ‰XREF.S„TERM‰XREF.S„TIMEOUT‰XREF.S„TIMESLIC‰XREF.S„TRACER‰XREF.S„TRACFLAG‰PAGE**ˆperformalevel_1restsave;'*(i.e.,savethatportionofthestate/*whichwassavedsomewhereotherthantheTCB,-*duringthelevel_1partialsaveintheTCB,**andthuscompletingalevel_1fullsave)*ˆreadythetask;*ˆandperformadispatch;* L1_D0_SAVE:5‰MOVE.L„D0,TCBD0(A6)ˆsaveD0,beforedoingfullsave; 0‰SAVE_STATEŠL1_FULLƒperformalevel_1fullsave;  *.*ˆGotpreemptedoutofdispatcher-tryagain.* PREEMPT:3‰TR0.READY(A6)MAKETHISGUYREADY,ANDTRYAGAIN.‰PAGE DISPATCH:[_dhl\tN|&‰MOVE.L„EXCSTACK,A7‰RESTOREEXECSTACK  DISP_10:#‰ENABLE_INTERRUPTSALLOWINTERRUPTS5‰LEA‡READYHD-TCBREADY,A6PREPARETOSEARCHREADYLIST)‰DISABLE_INTERRUPTSŒDisable(interrupts);  DISP_20:#‰MOVE.L„A6,A1SAVEPREVIOUSPOINTER/‰MOVE.L„TCBREADY(A1),D0…NEXTTASKONREADYLIST"‰BEQ‡DISP_10BRANCHIFNONEEXISTS  *-*ˆDeterminethattaskisnotinawaitstate.* ‰MOVE.L„D0,A6A6=TCBPOINTER(‰MOVE.B„TCBSTATE(A6),D0…CHECKTASKSTATE&‰BNE‡DISP_20BRANCHIFTASKISWAITING  **ˆTaketaskoffreadylist,(*ˆandestablishhimastherunningtask.* 8‰MOVE.L„TCBREADY(A6),TCBREADY(A1)…REMOVEFROMREADYLIST6‰BCLR†#TSK2NRDY,TCBSTAT2(A6)ˆCLEAR'ONREADYLIST'BIT(‰MOVE.L„A6,RUNNER•ESTABLISHRUNNINGTASK  **ˆRestoretheRTEframe*ˆtotheexecstack.*  0‰MOVE.L„TCBPCLO(A6),-(A7)restore(pc_lo&vor);-‰MOVE.L„TCBSR(A6),-(A7)restore(sr&pc_hi);  **ˆReset(preempt_flag);*ˆEnable(timeslicing);* '‰SFˆPREEMPT_FL AGˆCLEARI/OMESSAGEFLAG:‰MOVE.W„TIMESLIC,TIMEOUT„TICSKTILLPROCESSORRELINQUISHED  *+*ˆDecodethedispatchstatewithinthetcb.* 3*STATE_MASK‰EQU‡1<…Convertaddresstophysical&‰BRA.S…DISP_EV1ŒBranchifgoodaddress ‰NOP›else+‰ADD.L…D7,TCBUSP(A6)Œrestorestackaddress,.‰MOVE.W„#$8099,D7andcallexec_abort($8099);‰TR0.EXABRT(A6)  **ˆNowsetuptheuserstack.* DISP_EV1:$‰ADD.L…D7,D6™USERSTACKPHYSADDRESS%‰MOVE.L„D6,A4™USERS TACKPHYSADDRESS)‰MOVE.W„TCBSR(A6),-6(A4)ŽSRTOUSERSTACK)‰MOVE.L„TCBPC(A6),-4(A4)ŽPCTOUSERSTACK:‰BTST†#ASQSKDIS,ASQSTMD2(A5)ˆAREREGISTERSTOGOONSTACK?‰BNE.S…DISP_EV2–BRANCHIFNO -‰MOVEM.LƒTCBD0(A6),D0-D7/A0-A3‰GETD0THRUA3*‰MOVEM.LƒD0-D7/A0-A3,-66(A4)‹TOUSERSTACK*‰MOVEM.LƒTCBA0+16(A6),D0-D2ŒGETA4THRUA6$‰MOVEM.LƒD0-D2,-18(A4)‘TOUSERSTACK  *+*ˆPlacetheASRaddressonthesuperstack,*ˆandgotodispatchthetask.* DISP_EV2:%‰MOVE.L„ASQXFR(A5),D0‡GETASRADDRESS1‰MOVE.L„D0,2(A7)ŒSAVEONSUPERSTACKFORDISPATCH‰MOVE.L„D0,TCBPC(A6)ˆANDINTCB%*¦(Thisisneccessaryforthecasein$*¦whichthistaskwillgetpreempted$*¦outofthedispatcher,byahigher!*¦prioritytask.‚Thisinstruction&*¦willallowthedispatcherto"retry"%*¦thisdispatch,atsomelaterdate.) $‰BRA‡DISP_MMUŒCONTINUEWITHDISPATCH‰PAGE*1*ˆDispatchthetasktotheplacewithintheexec,!*ˆwherehewaswhenwefrozehim.)*ˆ(Usuallyduetowaitingonasemaphore,&*ˆorwaitingonanexceptionmonitor.)* *%*ˆFirst,loadtheMMUtorecreatethe#*ˆenvironment,priortothefreeze.* DISP_EXEC:%‰MOVE.L„TCBTST(A6),A5‡GETTSTADDRESS‰BSR‡LOADMMUGOLOADTHEMMU  ‰TCBSTK¢RESTOREEXECSTACK#‰ENABLE_INTERRUPTS—ALLOWINTERRUPTS8‰MOVEM.LƒTCBXREGS(A6),D0-D7/A0-A6†RESTOREEXECREGISTERS.‰MOVE.B„D0,TCBRPRI(A6)RESTOREUSER'SPRIORITY‰RTS¥ANDBACKTOEXEC‰PAGE*+*ˆStoppending-Transfertoabortroutine.* DISP_TERM:#‰ENABLE_INTERRUPTSALLOWINTERRUPTS 2‰PUSH.L„A6’Makestacklooklikeresultoftrap#1.‰BRA‡TERMGOTOTERMROUTINE‰ENDééééé=/*=/*†M68XXX.DSEGX.AF=/**=/* Chain file to assemble M68XXX.DSEGX.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.DSEGX.LS=/*=/IFC \1ƒ=ARGM68XXX.DSEGX.LS=/ENDIF=/*/=ASM M68XXX.DSEGX.SA,M68XXX.DSEGX.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.SEG.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.GST.EQ=/*}=/*=ENDéé ééé鄉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.SEG.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.GST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.SEG.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.GST.EQ‰LIST‰PAGE4DSEGX„IDNT‚5,1ƒ68xxxTRAP0--DEALLOCATEALLSEGMENTS*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*#*„DSEGXƒ--REV1.01ƒ10/08/79‚(HLD6)*Œ--TRAP0ROUTINE*1*…PURPOSE:‚DEALLOCATEALLSEGMENTSDEFINEDINTST*'*‰ENTRY:‚A4HASREQUESTOR'STCBADDRESS*0*ŠEXIT:‚ALLENTRIESINTSTFORTHISTASKDELETED* *–01234567*„REGISTERSUSED:D***‚*** *”A***E*ES*‰SECTIONLEVEL03*0‰XDEF„DSEGXŠENTRY--EXEC--DEALLOCATEALLSEGMENTS2‰XDEF„SBDSEGXˆENTRY--EXEC--DEALLOCATEALLSEGMENTS ‰XREF„DESEG_SUB ‰XREF„KILLER‰XREF.S‚GSTBEG‰PAGE*3*ˆGetexclusiveaccesstotasksegmenttable(TST).* SBDSEGX:DSEGX:!‰TST.LƒTCBTST(A4)…ISTHEREATST?‰BEQ.SƒDSEGX_40‡NO ‰IFNE„MULTPROC‰TR0.PƒTCBTSTSM(A4)‰ENDC $‰MOVE.L‚TCBTST(A4),A5„ADDRESSOFTST  **ˆFindsegmenttode-allocate.* ‰CLR.L„D51‰MOVE.WƒTSTLATTR(A5),D5‰OFFSETTOLASTATTRENTRY DSEGX_10:.‰BTST„#SEGAUSED,TSTAATTR(A5,D5)ƒISENTRYUSED?‰BEQ.S„DSEGX_30“BRANCHIFNO  *(*ˆTransfertonormalsegdealsubroutine.* ˆCLR.L†D49ˆBTST‡#TSKILAST,TCBATTI(A4)‰ISTHISLASTTASKINSESSION? (ˆIF‚ƒTHEN.S“IFLASTTASKINSESSION,3ˆBSET‡#SGPBORMV,D4THENSETREMOVEPERMSTATUSBIT.ˆENDI ˆBSRˆDESEG_SUB•calldeseg_sub;ALˆPAGE*/*ˆSeeifthereareanymoresegmentstodelete.* DSEGX_30:!‰SUB.L„#8,D5ŠOFFSETTONEXTENTRY-‰CMP.W„#TSTMMU,D5…DECREMENTCOUNTOFSEGMENTS*‰BGE†DSEGX_10ˆBRANCHBACKFORNEXTSEGMENT  **ˆAllsegmentsdeleted."*ˆReleaseexclusiveaccesstoTST.* ‰IFNE„MULTPROC3‰TR0.VƒTCBTSTSM(A4)‚GIVEUPEXCLUSIVEACCESSTOTST‰ENDC  *!*ˆCheckforlasttaskinsession.* DSEGX_40:n–Q9‰BTSTƒ#TSKILAST,TCBATTI(A4)ƒISTHISLASTTASKINSESSION?&‰BEQ.S‚DSEGX_99ˆBRANCHIFNO--RETURN‰PAGE**ˆLasttaskinsession.5*ˆGetexclusiveaccesstoglobalsegmenttable(GST).* ‰IFNE„MULTPROC)‰TR0.PƒSEMGST†GETEXCLUSIVEACCESSTOGST‰ENDC  **ˆSearchglobalsegmenttable.* -‰MOVE.L‚GSTBEG,A1PNTRTOGLOBOLSYMBOLTABLE'‰LEA…GSTENTRY(A1),A5‡FIRSTENTRYINGST,‰MOVE.W‚GSTLENT(A1),D7ˆNUMBERENTRIESINGST‰BEQ.SƒDSEGX_70ŽTABLEISEMPTY /‰MOVE.L‚TCBSESSN (A4),D6‡GETSESSIONFORCOMPARE  **ˆCheckoneGSTentry.* DSEGX_50:‰TST.WƒGSTCNT(A5)ŒISENTRYUSED‰BEQ.SƒDSEGX_60ŽBRANCHIFNO ,‰CMP.LƒGSTSESSN(A5),D6‡COMPARESESSIONCODES"‰BNE.SƒDSEGX_60ŒBRANCHIFNOMATCH #‰BCLR„#15,GSTCNT(A5)†CLEARPERMBIT%‰TST.WƒGSTCNT(A5)‡ENTRYSTILLINUSE?‰BNE.SƒDSEGX_60ˆBRANCHIFYES‰PAGE*,*ˆFreepagesbelongingtopermanentsegment.* #SPSEGMKEQU…1<ˆBRA.S†DSEGX_60 ˆBSR‡KILLER  *,*ˆSeeifthereareanymoreentriestocheck*ˆintheglobalsegmenttable.* DSEGX_60:#‰ADD.Lƒ#GSTEL,A5INCRTONEXTENTRY'‰SUB.Wƒ#1,D7†DECREMENTCOUNTOFENTRIES-‰BNE…DSEGX_50„BRANCHBACKTOCHECKNEXTENTRY  *"*ˆReleaseexclusiveaccesstoGST.* DSEGX_70:‰IFNE„MULTPROC-‰TR0.VƒSEMGST‰GIVEUPEXCLUSIVEACCESSTOGST‰ENDC DSEGX_99 ‰RTS’RETURN‰ENDé=/*=/*†M68XXX.DSEMX.AF=/**=/* Chain file to assemble M68XXX.DSEMX.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.DSEMX.LS=/*=/IFC \1ƒ=ARGM68XXX.DSEMX.LS=/ENDIF=/*/=ASM M68XXX.DSEMX.SA,M68XXX.DSEMX.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UST.EQ=/*}=/*=ENDééééé鞉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.UST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.UST.EQ‰LIST‰PAGE7DSEMX„IDNT‚5,1„68xxxTRAP0--DETACHFROM ALLSEMAPHORES*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*"*„DSEMXƒ--REV1.01ƒ7/01/79ƒ(HLD6)*Œ--TRAP0ROUTINE*%*…DETACHALLSEMAPHORESFORTHISTASK*ˆSECTIONLEVEL04* ‰XDEF†SBDSEMX ‰XREF†DSEM_SUB ‰XREF.S„SEMUST‰PAGE*9*ˆChecktoseeifthistaskisattachedtoanysemaphore.* SBDSEMX::‰BTST†#TSKIUSEM,TCBATTI(A4)‰Istaskattachedtosemaphore. ‰BEQ.S…DSEMX_99–No,justreturn.   **ˆGetexclusiveaccesstoUST.* ‰IFNE†MULTPROC ‰TR0.P…SEMUST‰ENDC  *&*ˆFindoneentryinUSTforthistask.* DSEMX_10: ‰TR0.FNDSEMƒ0-‰BRA.S…DSEMX_20–Foundone,godetachfromit.  *"*ˆReleaseexclusiveaccesstoUST, *ˆandreturn.* ‰IFNE†MULTPROC ‰TR0.V…SEMUST‰ENDC DSEMX_99:%‰RTS›Return,allsemaphoresdetached.  */*ˆCallsubroutinetodetachfromonesemaphore,*ˆandtryagain.* DSEMX_20: ‰BSR‡DSEM_SUB ‰BRA‡DSEMX_10‰ENDééé§Q=/*=/*†M68XXX.DSERVE.AF=/*+=/* Chain file to assemble M68XXX.DSERVE.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.DSERVE.LS=/*=/IFC \1ƒ=ARGM68XXX.DSERVE.LS=/ENDIF=/*1=ASM M68XXX.DSERVE.SA,M68XXX.DSERVE.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TIOT.EQ=/*}=/*=ENDéééééé °‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TIOT.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TIOT.EQ‰LIST‰PAGE;DSERVEIDNT5,1‚68xxxDIRECTIVE--DEALLOCATESERVERFUNCTION*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*$*„DSERVE‚--REV3.00‚12/01/81‚(HLD6)*REV2.00ƒ6/25/79‚(HLD6)*š2/08/81‚(HLD6)*Œ--TRAP1ROUTINE*%*…PURPOSE:‚DEALLOCATESERVERFUNCTION*'*‰ENTRY:‚A6HASREQUESTOR'STCBADDRESS+*‘A0BITS0-3=TRAPINSTRUCTIONIDENTIFIER**ŠEXIT:ƒD0HASRETURNCODE*’D0=0‚GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*4*ŠRTCDNFND-7ƒSPECIFIEDTRAPNOTASSIGNEDTOCALLER*‰SECTIONLEVEL04* ‰XDEF„DSERVE‰XDEF„DSERV_SUB ‰XREF.S‚TCBHD ‰XREF.S‚TIAT ‰XREF.S‚TIOT‰PAGEDSERVE:‰MOVE.L‚A0,D2‰SAVETRAPNUMBER  **ˆGetexclusiveaccesstoTIOT.* ‰IFNE„MULTPROC‰TR0.PƒSEMTIOT‰ENDC  *&*ˆChecktoseeifrequestorisserver.* "‰AND.Lƒ#$0F,D2ISOLATETRAPNUMBER‰LEA…TIAT,A2ADDRESSOFTIAT+‰CMP.Bƒ#TIATUSER,0(A2,D2)„ISTRAPASSIGNED?‰BNE.SƒDSERV_ERRNO ‰MOVE.L‚D2,D1‘MOVETRAP#TOD1'‰MULU„#TIOTEL,D1ŒCALCULATEENTRYOFFSET‰LEA…TIOT,A1STARTOFTIOT*‰CMP.LƒTIOTTCB(A1,D1),A6…ISTASKTHESAME?&‰BNE.SƒDSERV_ERRBRANCHIFNO-ERROR. (‰BSR.S…DSERV_SUB‹CALLDSERVESUBROUTINE. ‰IFNE„MULTPROC‰TR0.VƒSEMTIOT‰ENDC ‰EXIT†SUB DSERV_ERR:‰IFNE„MULTPROC‰TR0.VƒSEMTIOT‰ENDC !‰EXIT„RTCDNFNDŽRETURN(ERROR_07);‰PAGE=***************************************************************-**‡Subroutinetode-allocateserverfunction.**‡CalledbyDSERVEandDSRVX.**=**************************************************************3*‡REQUESTORISSERVER-LOOKFORANYONEWAITINGFOR"*ACKNOWLEDGEMENTFROMTHISSERVER* *'*ˆGetexclusiveaccesstotcballlist.* DSERV_SUB:‰IFNE„MULTPROC¹jÂ7.‰TR0.PƒSEMTCBŠGETEXCLUSIVEACCESSTOTCBLIST‰ENDC !‰MOVE.L‚TCBHD,A3‘1STTCBINCHAIN DSERV_10:-‰BTSTƒ#TSKSAKWT,TCBSTATE(A3)„ISTASKWAITING?‰BEQ.SƒDSERV_20‘BRANCHIFNO ,‰CMP.BƒTCBUTRP(A3),D2‹WAITINGFORTHISTRAP?‰BNE.SƒDSERV_20‘BRANCHIFNO .‰BCLRƒ#TSK2ACK2,TCBSTAT2(A3)„CLEAR2NDACKBIT)‰BCLRƒ#TSKSAKWT,TCBSTATE(A3)„STOPWAITING-‰MOVE.L‚#RTCDDIRN,TCBD0(A3)†RETURNERRORCODE‰LSL.W‚#3,D2•SHIFTTRAP#-‰MOVE.B‚D2,TCBD0(A3)PUTTRAP#INBITS27-304‰CLR.BTCBCC(A3)CLEARCONDITIONCODEFORBADRETURN‰LSR.W‚#3,D2•RESTORETRAP#‰TR0.READY‚(A3)’REACTIVATETASK DSERV_20:'‰MOVE.L‚TCBALL(A3),A3ŒNEXTTCBINCHAIN%‰MOVE.L‚A3,D0”ISTHEREANOTHERENTRY?‰BNE…DSERV_10‘BRANCHIFYES  *+*ˆReleaseexclusiveaccesstotcballlist.* ‰IFNE„MULTPROC2‰TR0.VƒSEMTCB†RELEASEEXCLUSIVEACCESSTOTCBLIST‰ENDC‰PAGE**ˆDeallocateserverfunction.* %‰CLR.Bƒ0(A2,D2)ŠCLEARTIATASSIGNMENT%‰CLR.LƒTIOTTCB(A1,D1)„CLEARTASKNAME+‰CLR.LƒTIOTADDR(A1,D1)ƒCLEARINTERRUPTADDR#‰CLR.WƒTIOTSTAT(A1,D1)ƒCLEARSTATUS DSERV_30:+‰BTST„#14,TIOTSEM(A1,D1)ANYUSERSWAITING?‰BEQ.SƒDSERV_99ŠBRANCHIFNO -‰TR0.Vƒ‚RESTARTWAITINGUSERS%‰BRA…DSERV_30ŠLOOPBACKTOTESTAGAIN  DSERV_99:‰RTS‰END éé=/*=/*†M68XXX.DSRVX.AF=/**=/* Chain file to assemble M68XXX.DSRVX.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.DSRVX.LS=/*=/IFC \1ƒ=ARGM68XXX.DSRVX.LS=/ENDIF=/*/=ASM M68XXX.DSRVX.SA,M68XXX.DSRVX.RO,\1;MRZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TIOT.EQ=/*}=/*=ENDééééééʉPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TIOT.EQE*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TIOT.EQ‰LIST‰PAGE7DSRVX…IDNT5,1‚68xxxTRAP0--DEALLOCATESERVERFUNCTION*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*"*„DSRVXƒ--REV1.00ƒ7/02/79‚(HLD6)*Œ--TRAP0ROUTINE*%*…PURPOSE:‚DEALLOCATESERVERFUNCTION*'*‰ENTRY:‚A4HASREQUESTOR'STCBADDRESS*1*ŠEXIT:‚ALLENTRIESINTIOTFORTHISTASKDELETED* *–01234567*„REGISTERSUSED:D*** *”A***EES*‰SECTIONLEVEL04* ‰XDEF„SBDSRVX ‰XREF„DSERV_SUB ‰XREF.S‚SEMTIOT ‰XREF.S‚TIAT ‰XREF.S‚TIOT‰PAGESBDSRVX:%‰LEA…TIAT,A2ˆASSIGNMENTTABLEADDRESS ‰LEA…TIOT,A1ˆOWNERTABLEADDRESS&‰MOVE.L‚#2,D2ŠSTARTSEARCHWITHTRAP2  **ˆGetexclusiveaccesstoTIOT.* ‰IFNE„MULTPROC‰TR0.PƒSEMTIOT‰ENDC  *$*ˆLookforTIOTentryforthistask.* DSRVX_10:+‰CMP.Bƒ#TIATUSER,0(A2,D2)„ISTRAPASSIGNED?‰BNE.SƒDSRVX_20‹NO ‰MOVE.L‚D2,D1†PUTTRAP#IND1'‰MULU„#TIOTEL,D1…CALCULATEENTRYOFFSET*‰CMP.LƒTIOTTCB(A1,D1),A4ISTASKTHESAME?‰BEQ.SƒDSRVX_30‡BRANCHIFYES DSRVX_20:#‰ADD.Lƒ#1,D2‡INCREMENTTONEXTTRAP"‰CMP.Lƒ#16,D 2†HAVEWECHECKEDALL?!‰BLT.SƒDSRVX_10ƒGOCHECKNEXTONE  *#*ˆReleaseexclusiveaccesstoTIOT.* ‰IFNE„MULTPROC/‰TR0.VƒSEMTIOT†GIVEUPEXCLUSIVEACCESSTOTIOT‰ENDC ‰RTS“RETURNTOCALLER  *$*ˆTransfertonormalDSERVEroutine.* DSRVX_30:ˆBSR‡DSERV_SUB ˆBRA‡DSRVX_10ˆENDéÓ^=/*=/*†M68XXX.EQDQ.AF=/*)=/* Chain file to assemble M68XXX.EQDQ.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68XXX.EQDQ.LS=/*=/IFC \1ƒ=ARGM68XXX.EQDQ.LS=/ENDIF=/*-=ASM M68XXX.EQDQ.SA,M68XXX.EQDQ.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.TIOT.EQ=/*ƒ9995.&.SRVR.EQ=/*}=/*=ENDéééééé܉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.TIOT.EQ*ˆINCLUDEƒ9995.&.SRVR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.TIOT.EQ‰INCLUDEƒ9995.&.SRVR.EQ‰LIST‰PAGE+EQDQ„IDNT5,1‚68xxxTRAP0--ENQUEUE/DEQUEUE*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*!*†EQDQƒ--REV3.00ƒ6/25/79‚(HLD6)*›2/20/81‚(HLD6)*š11/22/81‚(HLD6)*--TYPE2USERTRAPROUTINE:*†EXEQDQ--TRAP0ROUTINETOSENDFINALMESSAGETOSERVER*$*…PURPOSE:‚ENQUEUE/DEQUEUEUSERTRAP4*TRAPINREQUESTINGTASKISTOBEHANDLEDBYSERVER&*PLACETYPE7MESSAGEINSERVER'SA SQ*'*‰ENTRY:‚A4HASREQUESTOR'STCBADDRESS*‘D7=TRAPNUMBER%*‘A0ANDD0AREREQUESTOR'SA0ANDD0*0*ŠEXIT:ƒRETURNTOREQUESTORDETERMINEDBYSERVER1*’ERRORRETURN(NOSERVER)-CARRYBITSETINCCR*‰SECTIONLEVEL00* ‰XDEF…EQDQ ‰XDEF…EXEQDQ‰XDEF…SBEXEQDQ ‰XREF.SƒTIOT‰PAGE SBEXEQDQDS.W„0•SUBROUTINEENTRY/EXEQDQƒLEA…TIOT,A2ENTERHEREFORFINALMESSAGE)‰BSET„#TYP7TTRM,D7ŠSETFINALMESSAGEFLAG+‰BSET„#TYP7TTRM,TCBUTRP(A4)SETINTCBALSO9‰BTST„#TSKILAST,TCBATTI(A4)ISTHISLASTTASKINSESSION?‰BEQ.SƒEQDQBOTHŽBRANCHIFNO %‰BSET„#TYP7TLST,D7ŠSETLASTTASKFLAG)‰BRA.SƒEQDQBOTHŽBRANCHTOMESSAGEROUTINE  *!*‹ENTRYFORNORMALTRAPEXECUTION* EQDQ:‰MOVE.L‚D7,D1‘TRAPNUMBER‰MULU„#TIOTEL,D1ŒOFFSETTOTIOT&‰LEA…TIOT,A2STARTOFTRAPOWNERTABLE‰MOVE.L‚A6,A4‘CALLER'STCB'‰MOVE.B‚D7,TCBUTRP(A4)ˆSAVETRAPNUMBER  **ƒGETSERVER'STCB* EQDQBOTH:&‰MOVE.L‚TIOTTCB(A2,D1),A5…SERVER'STCB$‰CMP.LƒA6,A5‘ISSERVERCALLINGSELF?"‰BEQ…EQDQERRBRANCHIFYES-ERROR 4‰BTST„#TSKASYST,TCBATTR(A5)ISSERVERASYSTEMTASK?‰IFTHEN.SBRANCHIFYES,ŒMOVE.L‚TCBSESSN(A4),D0„CALLER'SSESSIONNO.0ŒCMP.LƒTCBSESSN(A5),D0„ISCALLER'SSESSIONNO.=*©SERVER'SSESSIONNO.?åVîKö1ŒBNE…EQDQERRŒERRORIFNOTEQUAL‰ENDI *!*†BUILDMESSAGETOSENDTOSERVER* '‰MOVE.L‚#$1C870000,D2‰MESGLENGTH,TYPE5‰MOVE.W‚TIOTADDR(A2,D1),D2„INTERRUPTADDR(UPPER1/2)7‰MOVE.L‚TIOTADDR+2(A2,D1),D3‚INTERRUPTADDR(LOWER1/2)‰MOVE.W‚D7,D3‘TRAPNUMBER 4‰BTST„#TSKASYST,TCBATTR(A4)ISCALLERASYSTEMTASK?‰BEQ.SƒEQDQ1ABRANCHIFNO+‰BSET„#TYP7TSYS,D3ŠYES-SETBITFORSERVER  EQDQ1A:8‰BTSTWƒ#TSKARTIM,TCBATTR(A4)ISCALLERAREALTIMETASK?‰BEQ.SƒEQDQ1A_1ŽBRANCHIFNO +‰BSET„#TYP7TRTT,D3ŠYES-SETBITFORSERVER  EQDQ1A_1:.‰LSL.Wƒ#8,D3‘MOVETRAP#TOUPPERBYTEOFWORD‰MOVE.B‚TCBCPRI(A4),D3ˆPRIORITY‰MOVE.L‚A4,D4‘TCBADDRESS$‰MOVE.L‚TCBSESSN(A4),D5‡SESSIONCODE"‰MOVE.L‚TCBUSER(A4),D6ˆUSERNUMBER*‰MOVE.W‚TCBD0(A4),D6ŠUSER'SD0(UPPER1/2),‰MOVE.L‚TCBD0+2(A4),D7ˆUSER'SD0(LOWER1/2)*‰MOVE.W‚TCBA0(A4),D7ŠUSER'SA0(UPPER1/2),‰MOVE.L‚TCBA0+2(A4),D0ˆUSER'SA0(LOWER1/2)1‰MOVE.W‚#T7STNORQ<<8,D0‡SETPBSTATTONOREQUEST8‰BTST„#TIOTSPBO,TIOTSTAT(A2,D1)‚WASPARAMETERBLOCKREQ?‰BEQ.S„EQDQ1BBRANCHIFNO ‰CLR.W„D0“CLEARPBSTATUS1‰MOVE.BƒTIOTPBSZ(A2,D1),D0ƒPUTPBSIZEINMESSAGE  *B*‚IFTHISISTERMMESSAGE-REPLACECONTENTSOFD0WITHABORTCODE* EQDQ1B:+ˆBTSTƒ#TYP7TTRM+8,D3ŠISTHISATERMMESSAGEˆBEQ.S‚EQDQ1C’BRANCHIFNO >ˆMOVE.WTCBABORT(A4),D6‰REPLACED0(UPPER1/2)WITHABORTCODE7ˆMOVE.LTCBATTR(A4),D7ŠREPLACED0(LOWER1/2)WITHATTR7ˆMOVE.WTCBATSK(A4),D7ŠREPLACEA0(UPPER1/2)WITHATSKˆSWAPƒD0;ˆMOVE.WTCBATSK+2(A4),D0ˆREPLACEA0(LOWER1/2)WITHATSK+2ˆSWAPƒD0 EQDQ1C:-ˆMOVE.LD0,A1“MOVELASTPARTOFMESSAGETOA1  *,*…CHANGEINTERRUPTADDRESSIFSERVERHASONE* .ˆTST.LƒTIOTADDR(A2,D1)‡WASINTERRUPTADDR=0?ˆBNE.SƒEQDQ2‘BRANCHIFNO &ˆMOVE.L‚TCBASQ(A5),D0‰TESTASQADDRESSˆBEQ.SƒEQDQER2BRANCHIFNOASQ ˆMOVE.L‚D0,A3‘ASQADDRESS3ˆMOVE.W‚ASQASR(A3),D2‰INTERRUPTADDRESS(UPPER1/2)ˆSWAP„D35ˆMOVE.W‚ASQASR+2(A3),D3‡INTERRUPTADDRESS(LOWER1/2)ˆSWAP„D3  **…WAITUNTILSERVERISREADY* EQDQ2:ˆTR0.Pƒ-ˆTST.LƒTIOTTCB(A2,D1)ˆISSERVERSTILLACTIVE?ˆBEQ.SƒEQDQER2BRANCHIFNO &ˆMOVEM.LD1/A2/A4,-(A7)ˆSAVEREGISTERSˆTR0.QEVNTTƒ(A5)SENDMESSAGE ˆBRA.SƒEQDQ3  **…ASQFULL-REJECTREQUEST* )ˆMOVEM.L(A7)+,D1/A2/A4ˆRESTOREREGISTERS*ˆTR0.Vƒ„SIGNALSEMAPHORE EQDQER2:*ˆMOVE.B‚TCBUTRP(A4),D7ˆRESTORETRAPNUMBER EQDQERR:)ˆBTSTƒ#TYP7TTRM,D7‹ISTHISFINALMESSA GE? ˆBNE.S‚EQDQRTNYES-JUSTRETURN  !ˆEXITƒTRAPERRTRAPPINGERROREXIT  *+*„SETWAITFORACKNOWLEDGESTATEANDRETURN* EQDQ3:)‡MOVEM.L(A7)+,D1/A2/A4‰RESTOREREGISTERS4‡AND.Bƒ#$0F,TCBUTRP(A4)‡CLEAREXTRABITSFROMTRAP#0‡BSET„#TIOTSMSG,TIOTSTAT(A2,D1)SETMESSAGEFLAG6‡ADD.Wƒ#1,TIOTMCNT(A2,D1)…INCREMENTMESSAGESENTCOUNT-‡BSET„#TSKSAKWT,TCBSTATE(A4)SETWAITFORACK EQDQRTN: ‡RTSœRETURN‡ENDéééé=/*=/*†M68XXX.EXABRT.AF=/*+=/* Chain file to assemble M68XXX.EXABRT.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.EXABRT.LS=/*=/IFC \1ƒ=ARGM68XXX.EXABRT.LS=/ENDIF=/*1=ASM M68XXX.EXABRT.SA,M68XXX.EXABRT.RO,\1;MRZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDééééééþ‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE(EXABRTƒIDNTƒ5,1„68xxxTRAP0--ABORTTASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ *********************ˆ*EXABRT†2.00**ˆ*HLD6„03/24/81**ˆ*********************5*„EXABRTƒEXECROUTINE„ABORTSUSERTASKFROMEXECMODE9*‰ENTRY:A0POINTSTOTASKCONTROLBLOCKOFTASKTOABORT*D7CONTAINSABORTCODE*A6ISADDRESSOFRUNNINGTCB**‰EXIT:RTSWITHNOPARAMETERS*IFA0=A6--NORETURN* *’01234567*USESREGISTERSD*†**AP*ŠSECTIONLEVEL00* ˆXDEF‡EXABRTˆXDEF‡SBEXABRT ˆXREF‡TERMˆPAGEASTATMSKEQU…$FFFF-1<*AddedSIX_TO_FOUR_WORD_FRAMEcodetohandle68020exceptions%*whichthrowsixwordsonthestack.*‰11/27/84ƒSJF=*Addedconditionalassemblycodetohandle68020versionsof0*buserror,addresserror,andtraceexception.**‰SECTIONLEVEL00* ‰XDEF†TRPVCT2 ‰XDEF†TRPVCT3 ‰XDEF†TRPVCT4 ‰XDEF†TRPVCT5 ‰XDEF†TRPVCT6 ‰XDEF†TRPVCT7 ‰XDEF†TRPVCT8 ‰XDEF†TRPVCT9 ‰XDEF†TRPVCTA ‰XDEF†TRPVCTB ‰XDEF†TRPVCTC ‰XDEF†TRPVCTD ‰XDEF†TRPVCTE ‰XDEF†TRPVCTF +‰XDEF†BERR1ŒReferencedbyM68010.AUTOVCT.SA L*NOTE:‚BERR1andBERR2(definedlaterifoperatingon68020)arereferencedJ*ƒintheAUTOVCTmodule.‚TheselabelsrepresentthefirsttwoinstructionsL*ƒthatareexecutedfollowingabuserror.‚AtlabelBERR2wemaskinterruptsH*ƒtolevel7.‚Itisimportantthatonabuserror,wedonotexecuteanyK*ƒotherinstructionsbesidesthoseatBERR1andBERR2beforeinterruptsareI*ƒmasked.‚AUTOVCTmustbeabletodeterminewhetheraninterruptoccurredK*ƒduringbuserrorprocessingbeforetheinterruptsaremaskedandcomparesH*ƒtheaddressonthestackagainsttheaddressesofBERR1andBERR2.‚SeeL*ƒdocumentationinAUTOVCTforfurtherinformationonbuserrorhandlingfor*ƒVME12Xmachines. ‰XDEF†CKEXMON‰XDEF†PROGINT2‰XDEF†PROGINT3‰XDEF†PROGINT4‰XDEF†PROGINT5‰XDEF†PROGINT6‰XDEF†PROGINT7‰XDEF†PROGINT8‰XDEF†PROGINT9‰XDEF†PROGINTA‰XDEF†PROGINTB ‰XREF†ISRERRé ‰XREF†KILLER‰XREF†MMUFAULT ‰XREF†SVXSTAK ‰XREF†TRACER ‰XREF†MMUHERE ‰XREF†TTB_01 ‰XREF†TTE_01 ‰XREF.S„EXCSTACK‰XREF.S„TRACFLAG‰XREF.S„PREEMPT_FLAG‰PAGEO********************************************************************************Í*A*ˆThisisasecondaryvectortableforprogramgeneratedtraps.ˆ*?*ˆItisrequiredtosupportthe68000,becausethe68000doesŠ*0*ˆnotsupporttheVOR(vectoroffsetregister.™**Í*O*******************************************************************************  TRAPVCT‚BSR.S…TRAPX ‰BSR.S…TRAPXTRPVCT2‚BSR.S…TRAPXTRPVCT3‚BSR.S…TRAPXTRPVCT4‚BSR.S…TRAPXTRPVCT5‚BSR.S…TRAPXTRPVCT6‚BSR.S…TRAPXTRPVCT7‚BSR.S…TRAPXTRPVCT8‚BSR.S…TRAPXTRPVCT9‚BSR.S…TRAPXTRPVCTA‚BSR.S…TRAPXTRPVCTB‚BSR.S…TRAPXTRPVCTC‚BSR.S…TRAPXTRPVCTD‚BSR.S…TRAPXTRPVCTE‚BSR.S…TRAPXTRPVCTF‚BSR.S…TRAPX‰NOP‰PAGEO********************************************************************************Í**…TRAPHANDLERFORUSERTRAPS­**…TRAPS2THRUFCOMEHERE°**Í*;*…ENTRY:ƒLOCATIONOFSECONDARYTRAPVECTORSAVEDONSTACK**Í**…EXIT:ƒD7=TRAPNUMBER¯*)*ŽIFSERVEREXISTS-GOTOERDQROUTINEš*8*ŽIFNOSERVER,RETURNTOCALLERWITHCARRYSETINCCR‹**Í*6*USESREGISTERS(ALLUSERREGISTERSSAVEDONSTACK)š**Í*O*******************************************************************************‰PAGE**ˆTrapexceptionoccurred.*ˆPsuedovectoronstack.* TRAPX: ‰TESTIM„4(‰BEQ.S…TRAPX1ŽBRANCHIFNORMALUSERTRAP *‰BTST†#SRMODE,4(A7)‡WASTRAPINSUPRMODE?‰BEQ‡PRGINTTEŒBRANCHIFNO ‰BSR‡KILLER  **ˆTrapexceptionoccurred*ˆinnormalusermode.* TRAPX1:(‰SAVE_STATEƒEXCEPTIONˆSaveuser'sstate. /‰BTST†#TRCFTRAP,TR  ACFLAG‚SHOULDTRAPBETRACED?‰BEQ.S…TRAPX2ŽBRANCHIFNO ‰PUSH.W„SR’SAVESRFORTRACE‰BSR‡TRACERŽBUILDTRACEENTRY ‰DC.W†$AA12‰ADD.L…#2,A7RESTOREA7  *&*ˆGetpointertotrapexceptiontable,&*ˆandgotogenericexceptionhandler.* TRAPX2:*‰LEA‡TRAPXTBL(PC),A5…POINTERTOPARAMETERS‰BRA‡UX  TRAPXTBL:(‰DC.L†TRAPVCT+2‹PSEUDO-VECTORBASE+1*2$‰DC.W†TSKITVCTŒVECTOR-TYPEATTRIBUTE#‰DC.W†TCBTVECTŒVECTORTABLEPOINTER‰DC.W†2“STARTINGBITNUMBER‰PAGEO********************************************************************************Í*F*ˆThisisasecondaryvectortableforprogramgeneratedexceptions.ƒ*?*ˆItisrequiredtosupportthe68000,becausethe68000doesŠ*0*ˆnotsupporttheVOR(vectoroffsetregister.™**Í*O*******************************************************************************  PROGINTƒEQU…*+BERR1…EQU…*ŠReferencedbyM68010.AUTOVCT.SA8PROGINT2‚BSR.SƒPRGINTY„BUSERROR‡--BIT16OFEXMONMASK/PROGINT3‚BSR.SƒPRGINTZZƒADDRESSERRORƒ--BIT170PROGINT4‚BSR.SƒPRGINTX„ILLEGALINSTRCT--BIT18 ŠIFEQƒCHIPTYPE-68020;PROGINT5‚BSR.SƒSIX_TO_FOUR_WORD_FRAME„ZERODIVIDE…--BIT19?PROGINT6‚BSR.SƒSIX_TO_FOUR_WORD_FRAME„CHKINSTRUCTION--BIT20;PROGINT7‚BSR.SƒSIX_TO_FOUR_WORD_FRAME„TRAPVINSTR…--BIT21ŠENDC ŠIFNEƒCHIPTYPE-68020ééé,PROGINT5‚BSR.SƒPRGINTX„ZERODIVIDE…--BIT190PROGINT6‚BSR.SƒPRGINTX„CHKINSTRUCTION--BIT20,PROGINT7‚BSR.SƒPRGINTX„TRAPVINSTR…--BIT21ŠENDC /PROGINT8‚BSR.SƒPRGINTX„PRIVVIOLATION‚--BIT22*PROGINTA‚BSR.SƒPRGINTX„LINE1010‡--BIT23*PROGINTB‚BSR.SƒPRGINTX„LINE1111‡--BIT24ŠNOPŠNOP&PROGINT9‚BSR.SƒPRGINT9„TRACEINTERRUPTŠNOP PRGINTX: ŠBRA…PRGINTXC PRGINTZZ: ŠBRA…PRGINTZ  PRGINT9: ŠBRA…PRGINT9C ŠPAGEO********************************************************************************‰SIX_TO_FOUR_WORD_FRAME*=*‰Thislogicisonlyusedonthe68020.‚Someexceptionswhich@*‰threwfourwordsonthestackinthe68000and68010nowthrow=*‰sixwordsonthestack.‚Oursolution(fornow)istosimply>*‰discardtheextrainformationgivenbythe68020andtomake,*‰thenewstackframelookliketheoldone.* *‰PCfromBSR*‰SR¤PCfromBSR*‰PC¤SR*‰VOR’---------->†PC#*‰Instructionaddr–VORforaTRAP1*>*‰AlltheexceptionswhichcomehereusedtogotoPRGINTX,so%*‰that'swherewegowhenwe'redone.*O******************************************************************************* SIX_TO_FOUR_WORD_FRAME: 4ŠMOVEƒ#$0084,$E(SP)†MaketheVORlooklikeaTRAP1.;ŠMOVEƒ$8(SP),$C(SP)†Movethetop10bytesofthestackdown>ŠMOVE.L$4(SP),$8(SP)†4bytes,andadd4tothestackpointer.ŠMOVE.L(SP)+,(SP)‰* é  é)ŠBRA„PRGINTXC‹Nowgowhereweusedtogo. ŠPAGEO********************************************************************************Í*)*…INTERRUPTHANDLERFORUSERINTERRUPTS£**Í*@*…ENTRY:ƒLOCATIONOFSECONDARYINTERRUPTVECTORSAVEDONSTACKŠ**Í**…EXIT:ƒD7=PRGINTNUMBER­**Í*6*USESREGISTERS(ALLUSERREGISTERSSAVEDONSTACK)š**Í*O*******************************************************************************‰PAGE**ˆHereforbuserror.*!*if(processor=68010)thendo;&*’if(exceptionoccurredinusermode)&*’thencheckforMMUdescriptorfault;2*’makestacklooklikethe68000longstackframe;*end;**if(processor=68020)then/*’ifthisisashortbuserrorstackframethen4*—converta68020shortBEframetoa68000BEframe*’elseéééé4*—converta68020long‚BEframetoa68000BEframe.*)*ˆ(Note:‚IftheMMUFAULTmoduledetectsa*segmentdescriptorerror,'*itwillloadtherequireddescriptor,*andreturntotheusercode.*ItwillnotRTShere.)* PRGINTY:‰IFEQ†CHIPTYPE-68010+‰XDEF†BERR2ReferencedbyM68010.AUTOVCT.SA9BERR2„ORˆ#$0700,SR‹Maskinterruptsduringbuserrorproc.,‰BTST†#5,4(A7)ŒDiderroroccurinusermode?‰IF‚‚THEN.S(‰TST.L…MMUHEREDowehaveanMMU(68451)‰IF‚‚THEN.SŽIFyesTHEN...‰MOVE.L„A0,-(A7)‰MOVE.L„MMUHERE,A09‰BCLR†#7,$2D(A0)ŠDidwehaveanMMUfault?(Andclearit)‰MOVE.L„(A7)+,A0‰IF‚‚THEN.SŽIFyesTHEN...(‰BSR‡MMUFAULTŒAttemptMMUfaulthandling9‰MOVE.L„A0,-(A7)ŒIFwecomebackthenitwasn'tsegfault‰MOVE.L„MMUHERE,A0)‰BSET†#7,$2D(A0)ŠCleartheMMUfaultbit.‰MOVE.L„(A7)+,A0‰ENDI‰ENDI‰ENDI ‰IFNE†ALTINT,‰CLR_ALT_MODE’Clearalternatebuserrormode1‰TEST_BUS_ERRORIfvalidbusorparityerrorTHEN‰IFTHEN.S(‰TST.L‚MMUHEREDowehaveanMMU(68451)‰IFTHEN.SIFyesTHEN...‰MOVE.L‚A0,-(A7)‰MOVE.L‚MMUHERE,A0$‰BCLR„#7,$2D(A0)ŒClearMMUfaultbit‰MOVE.L‚(A7)+,A0‰ENDI 7‰IFƒTHEN.SŽIFwedidnothaveanMMUfaultTHEN...+‰ADDQ.L„#4,A7Bypassreturnstuffonstack.‰RTE›Benignbuserror.‰ENDI ‰ENDI 3‰CLR_BUS_ERROR‘Clearassociatedbitsinmodulestat‰ENDC *2*ˆMakestacklooklikethe68000longstackframe.* ‰MOVE.W„#$0084,60(A7)‡VOR‰MOVE.L„6(A7),56(A7)ˆPC‰MOVE.W„4(A7),54(A7)ˆSR#‰MOVE.W„28(A7),52(A7)‡InstRegister'‰MOVE.L„14(A7),48(A7)‡Addressattempted‰MOVE.W„12(A7),46(A7)‡Other)‰MOVE.L„(A7),42(A7)‰Pseudovectoraddress!‰LEA‡42(A7),A7‹Removeextrastuff‰ENDC *D*‚Ifthisisa68020,therear  etwotypesofbuserrorstackframes.D*‚Whicheverthisis,convertittotheequivalent68000stackframe.*(ŠIFEQƒCHIPTYPE-68020…Ifthisisa68020, ?ŠMOVEƒ6+4(SP),-(SP)†Isolatetheformatcodeofthestackframe;1ŠAND„#VORFMT_MSK,(SP)ƒifitistheshortversion,(ŠIF‚(SP)+#VORFMT_SHORT_BERRTHEN.S *D*„Turna68020shortbuserrorstackframeintoa68000stackframe.*"ŠMOVE„#$0084,$1E+4(SP)….MoveVOR, ŠMOVE.L‚$2+4(SP),$1A+4(SP)ƒ.PC,ŠMOVE„$0+4(SP),$18+4(SP)ƒ.SR,<ŠMOVE†#$0000,$16+4(SP)ƒ.Opcode(thereisn'tone,sincethis)*§.isabetween-instructionsexception),-ŠMOVE.L$10+4(SP),$12+4(SP)ƒ.Errantaddress,/ŠMOVE„$A+4(SP),$10+4(SP)ƒ.SpecialStatusWord,9ŠMOVE.L†(SP),$C+4(SP)„.andthePCpushedbyBSRPRGINTY. 8ŠLEA…$C+4(SP),SPŠ.NowpointSPtothe68000-likeframe. %ŠELSE.S”Else(it'sthelongversion), *C*„Turna68020longbuserrorstackframeintoa68000stackframe.*#*§.Anextra4bytesonstackframe"ŠMOVE„#$0084,$5A+4(SP)†.MoveVOR, ŠMOVE.L‚$2+4(SP),$56+4(SP)„.PC,ŠMOVE„$0+4(SP),$54+4(SP)„.SR,<ŠMOVE†#$0000,$52+4(SP)„.Opcode(wecan'ttellforsurewhat'*§.theopcodewas,duetopipelining),-ŠMOVE.L$10+4(SP),$4E+4(SP)„.Errantaddress,/ŠMOVE„$A+4(SP),$4C+4(SP)„.SpecialStatusWord,:ŠMOVE.L†(SP),$48+4(SP)„.andthePCpushedbyBSRPRGINTY. 9ŠLEA…$48+4(SP),SPŠ.NowpointSPtothe68000-likeframe. ŠENDI ŠENDC 7* The stack now appears as it would if we were a 68000./*‰(A7)„Returnaddress(fromBSRPRGINTY)…(Long)%*‰4(A7)ƒR/W,I/NFunctioncode(Word)'*‰6(A7)ƒAttemptedaccessaddressŽ(Long)$*‰$A(A7)‚Instructionregister’(Word)*‰$C(A7)‚Statusregister—(Word)*‰$E(A7)‚Programcounter—(Long)‰PAGE  ***ˆDecodethestatusregisteronthestack,-*ˆtodeterminethepolicyforthisbuserror.* *if(supervisor_bit(sr)=set)*thengotosuper_be;#*elseif(interrupt_mask(sr)=0)*thengotoprgint_x0;*elsegotoprgint_ae;* 6‰BTST†#SRMODE,12(A7)†Wasbuserrorinsuprevisormode?‰BNE.S…SUPRBEŽBranchifyes. -‰TESTIM„12’Wasbuserrorinnormalusermode?‰BEQ‡PRGINTX0ŒBranchifyes. 1‰BRA‡PRGINTAEŒGotohandlebuserrorinuserISR.‰PAGE*!*ˆThisisthemoduleforhandling"*ˆbuserrorsfromsupervisormode.* SUPRBE:<‰CMP.W…#'BE',18+VORLNGTH(A7)„EXECROUTINEABLETOHANDLEIT?%‰BNE.S…CHECK_TRUST_TABLEˆBRANCHIFNO ‰MOVE.W„$C(A7),SRRestoreSR.‰ADD.L…#20+VORLNGTH,A7ŠREMOVEERRORFROMSTACK‰RTS RETURNTOERRORCODE‰PAGE*0*ˆThisisthemoduleforcheckingforbuserrors1*ˆoraddresserrorsthatwerecausedbyexecuting-*ˆaportionoftrustedcode.‚(Trustedcodeis0*ˆcodethatusessomeparameterthatareal-time/*ˆtaskhaspassedtotheexec,withoutchecking0*ˆthatparameter,andhencethename"trusted".)*/*ˆThistrusttablerepresentsareversalinthe.*ˆprevioussecuritypolicyofRMS.‚Previously,1*ˆRMSwouldvalidateallparametersbeforetaking/*ˆanyaction.‚Thisnewpolicysaystotrustthe4*ˆreal-timetaskstogiveusthecorrectparameters,2*ˆandtoperformpost-catastrophyrecovery,ifthe*ˆparameterwasbad.*  *5*ˆThisisthemacrofordefiningatrusttableentry.6*ˆItcreatesanentryinthetrusttableconsistingof4*ˆalongwordaddressofthebeginningofthetrusted3*ˆcode,andalongwordaddressoftheendingofthe4*ˆtrustedcode,plussixbytes.‚(Theextrasixbytes4*ˆaccountsforthepossiblesixbytepre-fetchqueue*ˆonthe68010.)* TT_ENTRY MACRO‰DC.L†\1 ‰DC.L†\2+6‰ENDM TT_BEGƒEQU‡0 TT_ENDƒEQU‡4 TT_LENƒEQU‡8  **ˆHereisthetrusttable.* TRUST_TABLE:‰TT_ENTRY‚TTB_01,TTE_01END_TRUST_TABLE:‰PAGE***ˆFinally,hereisthecodetosupportthe*ˆtrusttablepolicy.* * *ˆtt_ptr<==addr(trust_table);*ˆdowhile(tt_ptr<>tt_end);*tt_beg<==tt_ptr+;*tt_end<==tt_ptr+;*if"*(fault_addr(stack)>=tt_beg)& *(fault_addr(stack)<=tt_  end)*thenexit(bad_target_task);*ˆend;*ˆcallkiller;*  CHECK_TRUST_TABLE:'‰MOVEM.LƒA0-A1/D0,-(A7)‹saveregisters;6‰LEA‡TRUST_TABLE(PC),A0‡tt_ptr<==addr(trust_table);‰LEA‡END_TRUST_TABLE(PC),A1:‰MOVE.L„4+4+4+$E(A7),D0Šfault_addr<==fault_addr(stack); *¦dowhile(tt_ptr<>tt_end);TT_LOOP:‰CMP.L…TT_BEG(A0),D0Œif0‰BLO.S…TT_NEXT’(fault_addr>=tt_beg(tt_ptr))& 4‰CMP.L…TT_END(A0),D0Œ(fault_addr<=tt_end(tt_ptr))‰BHI.S…TT_NEXT +‰EXIT†RTCDTASK‘thenexit(bad_target_task); TT_NEXT:‰ADD.L…#TT_LEN,A0 ‰CMP.L…A0,A1‰BNE‡TT_LOOPend; *‰MOVEM.Lƒ(A7)+,A0-A1/D0†restoreregisters;‰BSR‡KILLERŽcallkiller;‰PAGE**ˆHereforanaddresserror.**‰If(processor=68010)then9*Œconvert68010addresserrorstackframeto68000frame.**‰If(processor=68020)then9*Œconvert68020addresserrorstackframeto68000frame.* PRGINTZ:‰IFEQ†CHIPTYPE-68010‰MOVE.W„#$0084,60(A7)‡VOR‰MOVE.L„6(A7),56(A7)ˆPC‰MOVE.W„4(A7),54(A7)ˆSR#‰MOVE.W„28(A7),52(A7)‡InstRegister'‰MOVE.L„14(A7),48(A7)‡Addressattempted‰MOVE.W„12(A7),46(A7)‡Other)‰MOVE.L„(A7),42(A7)‰Pseudovectoraddress!‰LEA‡42(A7),A7‹Removeextrastuff‰ENDC *H*‚Ifthisisa68020,turnthe68020addresserrorstackframe(whichisK*‚thesameasa68020longbuserrorstackframe)intoa68000stackframe.*ŠIFEQƒCHIPTYPE-68020 ŠMOVE„#$0084,$5A+4(SP)…MoveVOR,ŠMOVE.L‚$2+4(SP),$56+4(SP)ƒPC,ŠMOVE„$0+4(SP),$54+4(SP)ƒSR,:ŠMOVE†#$0000,$52+4(SP)ƒOpcode(wecan'ttellforsurewhat%*§theopcodewas,duetopipelining),+ŠMOVE.L$10+4(SP),$4E+4(SP)ƒErrantaddress,-ŠMOVE„$A+4(SP),$4C+4(SP)ƒSpecialStatusWord,8ŠMOVE.L†(SP),$48+4(SP)ƒandthePCpushedbyBSRPRGINTZ. 7ŠLEA…$48+4(SP),SP‰NowpointSPtothe68000-likeframe. ŠENDC  *"*ˆNow,decodethesronthestack,&*ˆtodeterminetheappropriatepolicy,"*ˆforhandlingthisaddresserror.*0*if(adresserroroccurredinnormalusermode)*thengotoprgint_x0;'*elseif(supervisor_bit(sr)=reset)*thengotoprgint_ae;*elsegotocheck_trust_table;*  ,‰TESTIM„12’DidAEoccurinnormalusermod?‰BEQ.S…PRGINTX0ŒBranchifyes. 5‰BTST†#SRMODE,12(A7)†DidAEoccurinsupervisormode?5‰BEQ‡PRGINTAEŒBranchifyes.‚(HandleAEinuserISR.) 1‰BRA.S…CHECK_TRUST_TABLEƒGotocheck_trust_table.‰PAGE**ˆHereforatraceinterrupt.*ˆDecodethesronthestack,!*ˆtodeterminetheproperpolicy,$*ˆforhandlingthistraceinterrupt.**if(processor=68020)then1*convert68020tracestackframeto68000frame.3*if(traceinterruptoccurredinnormalusermode)*thengotoprgint_x0;7*elseif(traceinterruptoccurredinsupervisormode)*thengotosuper_trace;3*elseignorethistraceinterruptfromauserISR;  PRGINT9C: *D*‚First,ifthisisa68020,changethe68020tracestackframeinto*‚a68000/68010stackframe.*(ŠIFEQƒCHIPTYPE-68020…Ifthisisa68020, <ŠMOVEƒ#$0084,10+4(SP)„PutdownaTRAP#1VORsothatwhenwe*§RTEwe'llonlytake8bytes.#ŠMOVE.L2+4(SP),6+4(SP)„MovethePC*ŠMOVEƒ0+4(SP),4+4(SP)„andSRdown4bytes.:ŠMOVE.L„(SP),4(SP)†MovethePCpushedbytheBSRPRGINT99. 6ŠADD.L„#4,SPŒMaketheSPpointtothenewstackframe. ŠENDC *#*‚Decodethevariouspossibilities.*.‰TESTIM„4“Didtraceoccurinnormalusermode?‰BEQ.S…PRGINTX0ŒBranchifyes. 7‰BTST†#SRMODE,4(A7)‡Didtraceoccurinsupervisormode?‰BNE‡SUPRTRCBranchifyes. 2‰ADD.L…#4,A7IgnoretraceinterruptfromuserISR..‰BCLR†#TRMODE,(A7)ˆCleartracemodebitinsr.‰RTE›ReturntouserISR.‰PAGE* *ˆHereforallotherexceptions.*ˆDecodethesronthestack,!*ˆtodeterminetheproperpolicy,*ˆforthisexception.*-*if(exceptionoccurredinnormalusermode)*thengotoprgint_x0;**elseif(exceptionoccurredinuserISR)*thengotoprgint_ie;.*else(exceptionoccurredinsupervisor  mode)*socallkiller;*  PRGINTXC:2‰TESTIM„4“Didexceptionoccurinnormalusermode?‰BEQ.S…PRGINTX0ŒBranchifyes. 4‰BTST†#SRMODE,4(A7)‡DidexceptionoccurinuserISR?‰BEQ‡PRGINTIEŒBranchifyes. 4‰BSR‡KILLERŽCrashsystemonexceptioninsupermode.‰PAGE*/*ˆHereformostexceptionsinnormalusermode.*"*savethestateoftheusertask;*if(traceexception=set)*thentracethisexception;/*getapointertotheprogramexceptiontable;)*andgotothegenericexceptionmodule;*  **ˆSaveuser'sstate.* PRGINTX0:(‰SAVE_STATEƒEXCEPTIONˆSaveuser'sstate.  **ˆTraceexceptionifrequired.* 4‰BTST†#TRCFEXCP,TRACFLAG‚Shouldexceptionbetraced.‰BEQ.S…PRGINTX1ŒBranchifno. ‰PUSH.W„SR’SAVESRFORTRACE ‰BSR‡TRACER ‰DC.W†$AA11‰ADD.L…#2,A7RESTOREA7  */*ˆGetapointertotheprogramexceptiontable,)*ˆandgotothegenericexceptionmodule.* PRGINTX1:)‰LEA‡PRGITBL(PC),A5POINTERTOPARAMETERS ‰BRA.S…UX  PRGITBL:*‰DC.L†PROGINT-30”PSEUDO-VECTORBASE-15*2$‰DC.W†TSKIEVCT–VECTOR-TYPEATTRIBUTE#‰DC.W†TCBEVECT–VECTORTABLEPOINTER‰DC.W†16œSTARTINGBITNUMBER‰PAGE*"*ˆTakeactionforuserexceptions.*‰SECTIONLEVEL00  ‰XREF.S„MACSTRC‰XREF.S„RUNNER ‰XREF.S„TIAT ‰XREF†EQDQ  *'*ˆThisisthegenericexceptionmodule.&*ˆIthandlesmostexceptionsandtraps$*ˆthatoccurredinnormalusermode.*  **ˆComputeexceptionnumber.* UX:#‰POP.L…D7’PCSAVEDBYPSEUDO-VECTOR)‰SUB.L…(A5),D7PSEUDO-VECTORDISPLACEMENT"‰LSR.L…#1,D7EXMONMASKBITNUMBER  **ˆIsitatraceexception?* ‰CMP.B…#24,D7ŽL1111BITNUMBER‰BGT‡PRGINTTBRANCHIFTRACE  **ˆDoesuserhavevectortable?* )‰MOVE.W„4(A5),D1ŒGETATTRIBUTEBITNUMBER%‰MOVE.W„TCBATTR(A6),D2†GETATTRIBUTES(‰BTST†D1,D2USERHAVETHISVECTORTABLE?‰BEQ.S…UX5‘BRANCHIFNO  **ˆUserhasvectortable.*ˆHasheclaimedthisvector?* 0‰MOVE.W„6(A5),D1ŒVECTORPOINTERTCBDISPLACEMENT0‰MOVE.L„0(A6,D1),D6‰VECTORTABLELOGICALADDRESS‰MOVE.L„D7,D1VECTORNUMBER3‰SUB.W…8(A5),D1ŒMINUSSTARTINGNUMBERFORTHISTYPE‰LSL.L…#2,D1TIMES4,‰ADD.L…D1,D6SPECIFICVECTORLOGICALADDRESS‰TR0.LOGPHY‚,,#4!‰BRA.S…UX1‘BRANCHIFGOODADDRESS ‰NOP›NOGOOD‰BRA.S™UX5IGNOREBADVECTOR  **ˆUserhasclaimedthisvector.*ˆIsvectorpresent?* UX1:%‰MOVE.L„D6,A1VECTORPHYSICALADDRESS‰TST.L„(A1)‘ISVECTORPRESENT? ‰BEQ.S„UX5’BRANCHIFNOTPRESENT  **ˆUserhasclaimedthisvector,*ˆandvectorispresent.'*ˆMoveexceptionframetouser'sstack.* %‰MOVE.L„EXCSTACK,D5‰TOPOFEXECSTACK5‰SUB.L…#2+4,D5AdjustforA6andVOR(orpseudoVOR).)‰SUB.L…A7,D5MINUSCURRENTSTACK=LENGTH‰MOVE.L„USP,A0 ‰MOVE.L„A0,D6USERSTACKPOINTER+‰SUB.L…D5,D6MINUSLENGTH=STARTOFWINDOW‰TR0.LOGPHY‚"‰BRA.S…UX3‘BRANCHIFUSERSTACKOK ‰NOP›NOGOOD‰BRA.S™UX5IGNOREBADSTACK  **ˆEnoughroomonuser'sstack.*ˆNow,updateUSP,*ˆandprepareformove.* UX3:*‰MOVE.L„D6,A4PHYSICALSTACKSTARTADDRESS‰MOVE.L„D3,A0SAVENEWUSP‰MOVE.L„A0,USP%‰MOVE.L„EXCSTACK,D3‰Topofexecstack*‰SUB‡#2,D3AdjustforVOR(orpseudoVOR).  *!*ˆMovetheexceptionstackframe.* ‰POP.L…A0’Saveuser'sA6. UX4:2‰MOVE.W„(A7)+,(A4)+‰MOVESUPERSTACKTOUSERSTACK‰CMP.L…D3,A7ENDOFSTACK?!‰BNE.S…UX4‘BRANCHIFMORETOMOVE  **ˆExceptionframemoved.A*ˆSetthestackuptocauseustoreturntotheexceptionhandler%*ˆaddress,andgotocheckforEXMON.* 2‰PUSH.L„(A1)PushthePCofhisexceptionhandler,.‰PUSH.W„-6(A4)‹andhisSRontotheexecstack. 0‰PUSH.L„A0PutbackhisA6likewehadonentry.(‰MOVE.W„#1,D6FLAG--USERHASOWNROUTINE‰BRA.S…UX6‘GOTOEXMONTEST  *'*ˆCheckforbuserrororaddresserror.* UX5:/‰CLR.L…D6’FLAG--USERNOTHANDLINGOW  NEXCEPTION‰CMP.B…#16,D7ŽBUSERRORNUMBER?‰BLT.S…UX6‘BRANCHIFNEITHER #‰CMP.B…#17,D7ŽADDRESSERRORNUMBER?‰BGT.S…UX6‘BRANCHIFNEITHER ‰POP.L…A0’TemporarysaveA6/‰POP.L…TCBBERR(A6)‰SaveBuserror/Addresserror!‰POP.L…TCBBERR+4(A6)‡Info.inTCB‰PUSH.L„A0’RestoreA6  *$*ˆShouldwesendamessagetoEXMON.* UX6:0‰BTST†#TSKIEXM,TCBATTI(A6)ŠDOESTASKHAVEEXMON?‰BEQ.S…UX7›BRANCHIFNO &‰MOVE.L„TCBEMMSK(A6),D1GETEXMONMASK(‰BTST†D7,D1™ISTHISEXCEPTIONMONITORED?‰BEQ.S…UX7›BRANCHIFNO **ˆSendamessagetoEXMON, *ˆandEXIT.* "‰BSR‡CKEXMON—GOSENDEXMONMESSAGE)‰CMP.B…#15,D7˜ISTHISATRAPINSTRUCTION?‰EXIT.GTƒEXCEPT˜BRANCHIFNO  *"*ˆLookfortype2trapassignment.* UX7: ‰TST.B…D6’USERHANDLINGHIMSELF?!‰EXIT.NEƒEXCEPTŽBRANCHOUTIFYES )‰CMP.B…#15,D7ŽISTHISATRAPINSTRUCTION?‰BGT.S…UXDFBRANCHIFNO .‰LEA‡TIAT,A1TRAPINSTRUCTIONASSIGNMENTTABLE/‰CMP.B…#2,0(A1,D7)‰2MEANSSERVERHASTHISTRAP$‰EXIT.NEƒTRAPERREXITTRAPPINGERROR  **ˆGotoEQGQonwaytoserver.* #‰BSR‡EQDQSendamessagetoserver.2‰EXIT†TERMExit,leavingthistaskoffreadylist.  ‰PAGE*)*ˆTakedefaultactionforuserexception.* UXDF:‰TST.W…D6’ISUSERHANDLINGIT?‰EXIT.NEƒEXCEPTŽBRANCHIFYES (‰TR0.EXABRT(A6)ABORTTASK--NORETURN‰PAGE*)*ˆThisisthemoduletohandleexceptions8*ˆwhichoccurredwithinuserinterruptserviceroutines.*ˆIthasthreeentrypoints:*2*1.)‚PRGINTTE-fortrapexceptionsinuserISRs,8*2.)‚PRGINTAE-forbusoraddresserrorsinuserISRs,7*3.)‚PRGINTIT-forallotherexceptionsinuserISRs.* PRGINTTE:.‰POP.L…D0•D0<--2*TRAP#whichwasexecuted7‰PEA‡TRAPVCT+2(PC)ŠPCstackedbytheBSRintheTRAPVCT2‰SUB.L…(A7)+,D0table,minus2topointtotheBSR#*«instruction,minustheaddressof*«thebeginningofthetable.‰BRA‡ISRERRˆGOTOERRORROUTINE    *%*ˆBuserrororaddresserroroccurred$*ˆinuserinterruptserviceroutine.* PRGINTAE:‰POP.L…D0’ADDROFPSEUDOVECTOR‰ADD.L…#8,A7SKIPEXTRAINFO‰BRA.S…PRGINTI1    *,*ˆOtherexception(notbusoraddresserror)-*ˆoccurredinuserinterruptserviceroutine.* PRGINTIE:‰POP.L…D0’ADDROFPSEUDOVECTOR  PRGINTI1:)‰SUB.L…#PROGINT-30,D0†GET(EXCEPTION#)*2 ˆBRA‡ISRERR‰PAGE**ˆThisisthemodule"*ˆforprocessingtraceexceptions,*ˆfromnormalusermodecode.* PRGINTT:2‰MOVE.L„#TEMTRAC,D7‰PUT'TRACE1INSTR'CODEIND7%‰MOVE.L„TCBEMMSK(A6),D2…GETXMONMASK/‰BTST†#TEMVCHG,D2‰VALUECHANGETRACEREQUESTED?‰BNE.S…PRGINTT1ŒBRANCHIFYES '‰BTST†#TEMTRAC,D2‰TRACE1INSTRUCTION?‰BNE.S…PRGINTT9ŒBRANCHIFYES !‰BTST†#TEMMCNT,D2‰MAXCOUNTSET?‰BNE.S…PRGINTT6ŒBRANCHIFYES /‰MOVEM.LƒTCBD0(A6),D0-D7/A0-A5‰RELOADREGISTERS ‰POP.L…A6)‰BRA‡GMACSBUG–GOTOMACSBUGTRACEROUTINE‰PAGE*/*ˆValuechange,orvalueequaltracerequested.* PRGINTT1:*‰TR0.LOGPHY‚,TCBEVLOC(A6),#4‰BRA.S…PRGINTT2ŒBRANCHIFFOUND ‰NOP-‰BRA.S…PRGINTT5ŒBADADDR-TREATASNOCHANGE  PRGINTT2:2‰MOVE.L„#TEMVCHG,D7‰MOVE'VALUECHANGE'CODETOD7*‰MOVE.L„D6,A0PHYSICALADDROFVALUEINA0#‰MOVE.L„(A0),D3CURRENTVALUETOD3,‰MOVE.L„TCBEVALU(A6),D4…EXPECTEDVALUETOD4$‰EOR.L…D3,D4CLEARALLMATCHINGBITS#‰BTST†#TEMVEQU,D2‰ISTHISV=TRACE?‰BNE.S…PRGINTT3ŒBRANCHIFYES‰PAGE**ˆValuechangetracerequested.* )‰AND.L…TCBEVMSK(A6),D4…HASVALUECHANGED?‰BEQ.S…PRGINTT5ŒBRANCHIFNO *‰MOVE.L„D3,TCBEVALU(A6)…SAVECHANGEDVALUE(‰BRA.S…PRGINTT9ŒGOSENDMESSAGETOEXMON  **ˆValueequaltracerequested.* PRGINTT3:)‰ADD.L…#1,D7PUT'VALUEEQUAL'CODEIND73‰AND.L…TCBEVMSK(A6),D4…ISCURRVALUE=TOEXPECTED?‰BEQ.S…PRGINTT9ŒBRANCHIFYES  *"*ˆCheckmaximuminstructioncount.* PRGINTT5:&‰BTST†#TEMMCNT,D2‰WASMAXCOUNTGIVEN?‰EXIT.EQƒE  XCEPTŽBRANCHIFNO‰PAGE*$*ˆMaximuminstructioncountwasset.* PRGINTT6:1‰ADD.W…#1,TCBECNT(A6)†ADD1TOUPPER1/2OFCOUNT+‰MOVE.L„TCBECNT(A6),D0†MOVELOWER1/2TOD0%‰CMP.W…TCBECNT(A6),D0†#INSTR=MAX?#‰EXIT.HIƒEXCEPTŽBRANCHIFNOTEQUAL /‰MOVE.L„#TEMMCNT,D7‰PUT'MAXCOUNT'CODEIND7  **ˆSendmessagetoEXMON.* PRGINTT9:.‰BSR.S…CKEXMONBRANCHTOEXMONMESSAGEROUTINE ‰EXIT†EXCEPT‰PAGE*!*ˆThisisthemoduleforhandling(*ˆtraceexceptionsfromsupervisormode.* SUPRTRC: ‰MOVE.L„D1,(A7)’SAVED1ONSTACK‰PUSH.L„A6—SAVEA6ONSTACK)‰MOVE.L„RUNNER,A6GETTCBOFRUNNINGTASK‰CMP.L…#0,A6”DOESTASKEXIST?'‰BEQ.S…SUPRTR4’BRANCHIFNO-NOTEXMON B‰BTST†#SRMODE,4+4+SR_LEN+PC_LEN+VORLNGTH(A7)2NDRTNINUSERMODE?'‰BNE.S…SUPRTR4’BRANCHIFNO-NOTEXMON 6‰BTST†#TSKIEXM,TCBATTI(A6)…ISTASKCONNECTEDTOEXMON?'‰BEQ.S…SUPRTR4’BRANCHIFNO-NOTEXMON -‰MOVE.B„TCBEMMSK(A6),D1ŠLOOKATEXMONOPTIONS‰AND.B…#$38,D1’WASTRACESET?'‰BEQ.S…SUPRTR4’BRANCHIFNO-NOTEXMON -‰BSET†#TRMODE,TCBEMMSK(A6)…REMEMBERTRACEBIT‰POP.L…A6—RESTOREA6‰POP.L…D1—RESTORED18‰BCLR†#TRMODE,SR_LEN+PC_LEN+VORLNGTH(A7)ˆCLEARTRACEBIT!‰STˆPREEMPT_FLAGFORCEAPREEMPT.&‰RTE RETURN-EXMONIGNORESSUPRTRACE  *"*ˆTracebitoninsupervisormode,**ˆandEXMONnotmonitoringthiscondition.* SUPRTR4:‰POP.L…A6’RESTOREA6‰POP.L…D1’RESTORED1  GMACSBUG:&‰PUSH.L„MACSTRCSETUPMACSBUGADDRESS‰RTS›EXITTOBUG‰PAGE*&*ˆSubroutinetosendmessagetoEXMON,.*ˆandtoputrunningtaskintotheWAITstate.*  CKEXMON:%‰BSR‡SVXSTAKSAVESTACKANDREGISTERS  **ˆSendmessagetoEXMON.* CKEXMSG:-‰MOVE.L„#$0C080000,D2‡MESSAGELENGTHANDTYPE,‰MOVE.W„TCBNAME(A6),D2†1STHALFOFTASKNAME@‰MOVE.L„TCBNAME+2(A6),D3„2NDHALFOFTASKNAME,1STHALFOFSESSN-‰MOVE.L„TCBSESSN+2(A6),D4ƒ2NDHALFOFSESSION‰MOVE.W„D7,D4TYPEOFINTERRUPT ‰LSL.W…#8,D4MOVEITTO2NDBYTE.‰MOVE.B„#3,D43=MESSAGEISRESULTOFINTERRUPT '‰TR0.QEVNTN‚TCBEXM(A6)ˆSENDTHEMESSAGE&‰BRA.S…CKEXWAITŒBRANCHIFMESSAGESENT  **ˆERROR-messagenotsent.* 1‰BCLR†#TSKIEXM,TCBATTI(A6)ŠDETACHTASKFROMEXMON3‰MOVEM.LƒTCBXREGS(A6),D0-D7/A0-A6†RESTOREREGISTERS8‰BCLR†#TSK2RTEX,TCBSTAT2(A6)ˆCLEAR'RETURNTOEXEC'FLAG'‰MOVE.B„D0,TCBRPRI(A6)RESTOREPRIORITY ‰RTS¥RETURN.‰PAGE**ˆPlacetaskintothe*ˆ'waitingforcommand'state.* CKEXWAIT:;‰BSET†#TSKSWTEM,TCBSTATE(A6)ˆSetthe'waitforcommand'bit+‰ADD.L…#4,SP™Popsubroutinereturnaddress, "‰EXIT†DISPATCH–andgotodispatch;   ‰ENDééééé  é**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.ENV.EQ*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ˆINCLUDEƒ9995.&.UTILITY.MC*‰NOLIST‰INCLUDEƒ9995.&.ENV.EQ‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.INTERRUP.MC‰INCLUDEƒ9995.&.UTILITY.MC‰LIST‰PAGE‰IFEQ‚CHIPTYPE-68000EXIT…IDNT‚5,1„68000EXITMODULE‰ENDC‰IFEQ‚CHIPTYPE-68010EXIT…IDNT‚5,1„68010EXITMODULE‰ENDC‰SECTIONƒLEVEL00 ‰XREF†BKG_DISPATCH‰XREF†DISPATCH‰XREF†L1_D0_SAVE ‰XREF†PREEMPT ‰XREF.S„EXCSTACK‰XREF.S„RUNNER‰XREF.S„PERTURB_FLAGS‰XREF.S„PREEMPT_FLAG‰PAGE‰XDEF†EXIT_D0SUB7‰XDEF†EXIT_SUBŒExitforsubroutineclassofdirectives.4‰XDEF†EXIT_EXCEPT‰Exitforexceptionhandlermodule.)*¦Exitsforpostemptclassofdirectives.-‰XDEF†EXIT_POSTtemporarypostemptdirective;-‰XDEF†EXIT_TERMpermanentpostemptdirective; &*¦Exitsforpreemptingarunningtask,*¦togotohisownasr:$‰XDEF†EXIT_ASR‘clearD0&gotoasr;-‰XDEF†EXIT_D0ASRgetD0fromtcb&gotoasr;*«(usedbyrtevent); ,‰XDEF†EXIT_TRAPERRˆExitfortrappingerrors.4‰XDEF†EXIT_ERRŒExitforerrorcase,whenD0contains&*§errornumber.‚(SpecialcaseforCMR.%*§becausedriversreturnerrornumber *§inD0).) 4‰XDEF†ERROR_01ŒExitforerrorwithreturncode=01.4‰XDEF†ERROR_02ŒExitforerrorwithreturncode=02.4‰XDEF†ERROR_03ŒExitforerrorwithreturncode=03.4‰XDEF†ERROR_04ŒExitforerrorwithreturncode=04.4‰XDEF†ERROR_05ŒExitforerrorwithreturncode=05.4‰XDEF†ERROR_06ŒExitforerrorwithreturncode=06.4‰XDEF†ERROR_07ŒExitforerrorwithreturncode=07.4‰XDEF†ERROR_08ŒExitforerrorwithreturncode=08.4‰XDEF†ERROR_09ŒExitforerrorwithreturncode=09.4‰XDEF†ERROR_10ŒExitforerrorwithreturncode=10.4‰XDEF†ERROR_11ŒExitforerrorwithreturncode=11.™G¢CªD²Fºu 4‰XDEF†ERROR_12ŒExitforerrorwithreturncode=12.4‰XDEF†ERROR_13ŒExitforerrorwithreturncode=13.4‰XDEF†ERROR_14ŒExitforerrorwithreturncode=14.4‰XDEF†ERROR_15ŒExitforerrorwithreturncode=15.4‰XDEF†ERROR_16ŒExitforerrorwithreturncode=16.‰PAGE***ˆThisistheexitroutineforthetypical+*ˆsubroutinecalltotheexec.‚Asubroutine,*ˆcalltotheexecisacallwhichjustasks(*ˆtheexectodosomethingforthetask,+*ˆandexpectstheexectoreturncontrolto *ˆthetask.*(*ˆThereare,however,certainconditions(*ˆwhichmightoccurwithintheexecthat'*ˆcouldperturbthisnaturalsubroutine*ˆentry/exitmechanism.*&*ˆSpecifically,ahigherprioritytask*ˆcouldhavebeenmadeready,!*ˆeitherbythetrap#1directive*ˆrequestedbytheclienttask,%*ˆorbyatrap#0directiverequested"*ˆbyaninterruptserviceroutine. *ˆThisclassofperturbationsis&*ˆcalledapreempt,isdetectedbythe#*ˆreadymodule,andissignalledby*ˆsettingthepreempt_flag.*#*ˆAnotherclassofperturbationsis*ˆthebackgroundperturbation.%*ˆItiscausedbyainterruptservice *ˆroutinerequestingtheexecto*ˆscheduleabackgroundjob,is%*ˆdetectedbytheschedulebackground%*ˆmodule,andissignalledbysetting*ˆthebkg_flag.*$*ˆCollectively,thetwoperturbation$*ˆflags(blg_flag,preempt_flag)are"*ˆreferedtoastheperturb_flags. *ˆTheyarelocatedinthesystem(*ˆparameterarea(SYSPAR),andorganized%*ˆastwoconsecutiveb  ytesinmemory,+*ˆsuitableforaccessasonewordvariable.)*ˆThebkg_flagisinthehighorderbyte,)*ˆsoastoallowtheTST.Winstructionto *ˆdetermine:*'*1.)‚atleastoneoftheperturb_flags*’areset(CC=NE);*$*2.)‚thebkg_flagisset(CC=MI);*‰PAGE EXIT_EXCEPT: EXIT_D0SUB: ‰MOVE.L„TCBD0(A6),D0ˆRestoreD0,%‰BRA.S…EXIT_TEST‹andgotoEXIT_TEST.  EXIT_SUB:2‰MOVEQ.Lƒ#0,D0SetD0<==0,toindicateno_error.  EXIT_TEST:4‰DISABLE_INTERRUPTSŒfreeze(perturbationdetectors);5‰TST.W…PERTURB_FLAGS‡ifeitherperturbationoccurred,*‰BNE.S…GOT_PERTURB‰thengotogot_perturb;  EXIT_RTE:-‰MOVEM.LƒTCBD1(A6),D1-D7/A0-A5‰elseperforma"‰POP.L…A6œlevel_1partialrestore,‰RTE¥andreturntothetask;‰PAGE*+*ˆThisiswherewedecodetheperturbation,%*ˆandperformtheappropriateaction,'*ˆaccordingtothefollowingalgorithm:**#*release(perturbationdetectors);*if(bkg_flag=set)thendo;!*’calldispatch_background_work);2*’gotoexit_10;Œ/*tryagaintoreturntouser*/*end; *elsedo;*’performalevel_1fullsave;*’gotore_dispatch;*end;*  GOT_PERTURB: '‰BPL.L…L1_D0_SAVEŠif(bkg_flag=reset)*§thengotol1_d0_save; *§elsedo;2‰BSR.L…BKG_DISPATCHcalldispatchbackgroundwork;-‰TST.B…PREEMPT_FLAGif(preempt_flag=reset))‰BEQ.S…EXIT_RTE‘thenreturntousercode;3‰BRA.L…L1_D0_SAVEelsesavethestateofthistask,*°anddoadispatch;‰PAGE*"*ˆHereistheexitroutineforthe*ˆpostemptclassofdirectives."*ˆApostemptdirectiveisonethat"*ˆtypicallywilltakethetaskout*ˆofexecution.‚Therefore,the$*ˆpostemptexitroutinewillperform$*ˆalevel_1fullsave,andgotothe"*ˆdispatcher.‚(Notethatsincethe!*ˆrunningtaskisalreadyoffthe$*ˆreadylist,thisexitroutinewill *ˆleavehimoffthereadylist.)*$*ˆNow,ifapostemptclassdirective**ˆdetectsanerrorthatwillnotallowthe)*ˆexectotakethetaskoutofexecution,'*ˆitmustinformthetaskoftheerror,#*ˆandreturncontroltoit.‚Thisis%*ˆhandledbytheerrorexitroutines.*+*ˆOnelastpoint.‚Therearetwosub-classes(*ˆwithinthepostemptclass;atemporary-*ˆpostemptsubclass,andapermenentpostempt+*ˆsubclass.‚Thetemporarysubclassconsists0*ˆofthosedirectivessuchasdelay,wait,etc.,0*ˆwhichexpecttobebroughtbackintoexecution)*ˆbytheexecatsomelatertime;‚whereas.*ˆthepermenentsubclassconsistsofthosetwo/*ˆdirectives,term,abort,whichcausethetask.*ˆtobepermenentlyprohibitedfromexecuting..*ˆSincethetemporarysubclasswilleventually1*ˆexecute,wemustsaveaD0ofzero,toindicate3*ˆtothetaskthatthetemporarypostemptdirective2*ˆdidindeedexecuteproperly;‚whereasinthecase1*ˆofthepermenentpostemptdirective,wewishto0*ˆpreservetheinitialstateofD0,forpossible*ˆpost-processingprognosis.*‰PAGE EXIT_POST: EXIT_ASR:/‰CLR.L…TCBD0(A6)‹D0<==0toindicateno_error;  EXIT_TERM: EXIT_D0ASR:5‰SAVE_STATE‚L1_FULL‹savethefullstateofthistask,#‰BRA.L…DISPATCHŒandgotodispatch;‰PAGE* *ˆHerearethetwoexitroutines"*ˆforpreemptingtherunningtask,*ˆtogotohisASR.**ˆExit_asristhenormalcase.!*ˆItisusedwhenataskexecutes#*ˆsomedirectivecallwhichresults *ˆinthetaskgettingdispatched$*ˆtoit'sASR(ex.wtevent,setasq)."*ˆSincethedirectivecallworked, *ˆtherefore,weneedtoclearD0&*ˆwithinthetcbtoindicatenoerror,&*ˆbeforesendingthetasktoit'sASR.&*ˆTherefore,uponreturnfromtheASR,'*ˆtheinstructionimmediatelyafterthe"*ˆoriginaldirectivecallwillsee#*ˆD0=0,indicatingagoodstatus.*(*ˆNow,exit_d0_asristheabnormalcase.+*ˆItoccurswhenataskexecutesartevent,&*ˆwiththeenable_asroptionselected,(*ˆandthereisaneventwithinit'sASQ.&*ˆInthiscasewemustnotperturbthe#*ˆvalueofD0withinthetcb,asdwe$*ˆmustsavethepreviousvalueofD0**ˆ fortheeventualreturntonon-ASRcode.*‰PAGE*%*ˆThesearethevariousexitroutines%*ˆforthedifferenterrorconditions."*ˆTheyjustsetD0<==errorcode,'*ˆandjumptothegenericerrorhandler2*ˆwhichwillsettheconditioncodesonthestack,(*ˆandformatD0fortheexecerrorcode.*ˆ(i.e.,D0<==$08DDEEEE;*where:*’$08ƒ:=codeforexecerror;*’$DDƒ:=directivenumber;*’$EEEE:=specificerrorcode;*ˆ)*  ERROR_01:‰MOVEQ.Lƒ#01,D0‰BRA.S…ERROR_XX  ERROR_02:‰MOVEQ.Lƒ#02,D0‰BRA.S…ERROR_XX  ERROR_03:‰MOVEQ.Lƒ#03,D0‰BRA.S…ERROR_XX  ERROR_04:‰MOVEQ.Lƒ#04,D0‰BRA.S…ERROR_XX  ERROR_05:‰MOVEQ.Lƒ#05,D0‰BRA.S…ERROR_XX  ERROR_06:‰MOVEQ.Lƒ#06,D0‰BRA.S…ERROR_XX  ERROR_07:‰MOVEQ.Lƒ#07,D0‰BRA.S…ERROR_XX  ERROR_08:‰MOVEQ.Lƒ#08,D0‰BRA.S…ERROR_XX  ERROR_09:‰MOVEQ.Lƒ#09,D0‰BRA.S…ERROR_XX  ERROR_10:‰MOVEQ.Lƒ#10,D0‰BRA.S…ERROR_XX  ERROR_11:‰MOVEQ.Lƒ#11,D0‰BRA.S…ERROR_XX  ERROR_12:‰MOVEQ.Lƒ#12,D0‰BRA.S…ERROR_XX  ERROR_13:‰MOVEQ.Lƒ#13,D0‰BRA.S…ERROR_XX  ERROR_14:‰MOVEQ.Lƒ#14,D0‰BRA.S…ERROR_XX  ERROR_15:‰MOVEQ.Lƒ#15,D0‰BRA.S…ERROR_XX  ERROR_16:‰MOVEQ.Lƒ#16,D0‰BRA.S…ERROR_XX ‰PAGE*$*ˆThisisthegenericerrorhandler..*ˆ(ItisalsotheerrorhandlerforCMRerrors%*ˆwhichreturntheerrorcodeinD0.)*#*ˆItresetsthesuperstackpointer**ˆtothebeginningoftheRTEstackframe.)*ˆ(Incasewejumpedherefromsomeother)*ˆlevelonthestack.‚i.e.,fromanested(*ˆsubroutine.)‚Thenwesetthecondition(*ˆcodesonthesuperstacktonot_equal.**ˆFinally,weformattheerrorcodeinD0,*ˆandgotoEXIT_TEST.*3*ˆAspecialtraperrorhandlerentry,EXIT_TRAPERR,/*ˆisaddedheretosetthereturncodeandtrap,*ˆnumber,andresetthesuperstackpointer.* EXIT_TRAPERR:%‰MOVE.W„D0,TCBD0(A6)ˆDIRECTIVENUMBER)‰MOVE.W„#RTCDDIRN,TCBD0+2(A6)‚RETURNCODE)‰LSL.L…#3,D7SHIFTTRAPNUMBERTOGOINTO‰MOVE.B„D7,TCBD0(A6)ˆBITS27-30&‰BRA.S…EXIT_UNSTACKˆPOPSTACKANDEXIT  ERROR_XX: EXIT_ERR: ‰SWAP†D0’SETUPD0:‰MOVE.W„#$0800,D0$8000EEEE;!‰MOVE.B„TCBD0+3(A6),D0‹$80DDEEEE;‰SWAP†D0’WHERE:*«$80ƒ:=codeforexecerror;*«$DDƒ:=directivenumber;*«$EEEE:=errorcode; EXIT_UNSTACK:4‰MOVE.L„EXCSTACK,A0‰Getapointertotheexecstack.)‰SUB.L…#2+4+2,A0‹SkipovertheRTEframe.‰SUB.L…#4,A0SkipoverA6.-‰MOVE.L„A0,A7Updatethesuperstackpointer. <‰MOVE.B„#NE_CC,4+COND_CODE(A7)ƒForcetheconditioncodebyte*«withintheRTEframeto.  ‰BRA‡EXIT_TEST‰ENDééééé éé=/*=/*†M68XXX.EXMMSK.AF=/*+=/* Chain file to assemble M68XXX.EXMMSK.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.EXMMSK.LS=/*=/IFC \1ƒ=ARGM68XXX.EXMMSK.LS=/ENDIF=/*1=ASM M68XXX.EXMMSK.SA,M68XXX.EXMMSK.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDééééééÊ 'M68XXX EXMMSK SAßß8qqEXMON AFèèqqEXMON SAññ ˆqqEXMONVR AFqqEXMONVR SA  5qqEXQEVENTAFqqEXQEVENTSA1ZqqEXRQPA AFVVqqEXRQPA SA__+¤qqFNDGSEG AFqqFNDGSEG SA™™ ‘qqFNDTSEG AFªªqqFNDTSEG SA³³MqqFNDUSEM AF¼¼qqFNDUSEM SAÅÅ ¨qqGETTCB AFÖÖqqGETTCB SAßß¿qqGTDTIM AFøøqqGTDTIM SA>qqGTTASKIDAF  qq‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE;EXMMSK‚IDNT‚5,168xxxDIRECTIVE- -SETEXCEPTIONMONITORMASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡*******************,*‡*‚EXMMSK„*ƒSETEXCEPTIONMONITORMASK*‡*‚REV1.00ƒHLD6**‡*‚08/06/79‡**‡**********************‹ENTRY:A6HASADDROFTCB*—0-TASKNAMEOFTARGETTASK*—4-SESSIONCODE *—8-MASK*’A5HASTARGETTCBADDRESS**‹EXIT:D0HASRETURNCODE*’D0=0„GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST***‰SECTIONLEVEL04* ‰XDEF„EXMMSK‰PAGE**ˆSetexceptionmonitormask.* EXMMSK:1‰MOVE.B„TCBEMMSK(A5),D0…SAVE1STBYTEOFOLDMASK6‰MOVE.L„8(A4),TCBEMMSK(A5)‚MOVEENTIRENEWMASKTOTCB.‰AND.B…#$38,D0SAVEEXECOPTIONSFROMOLDMASK;‰AND.B…#$07,TCBEMMSK(A5)ƒCLEAREXECOPTIONAREAINNEWMASK1‰OR.B†D0,TCBEMMSK(A5)…RESTOREEXECOPTIONSTOTCB!‰EXIT†SUB‘exit(subroutineexit);‰ENDééé×9=/*=/*†M68XXX.EXMON.AF=/**=/* Chain file to assemble M68XXX.EXMON.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.EXMON.LS=/*=/IFC \1ƒ=ARGM68XXX.EXMON.LS=/ENDIF=/*/=ASM M68XXX.EXMON.SA,M68XXX.EXMON.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééé à‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE;EXMON„IDNTƒ5,1„68xxxDIRECTIVE--ATTACHTOEXCEPTIONMONITOR*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡*******************+*‡*‚EXMON†*ƒATTACHTOEXCEPTIONMONITOR*‡*‚REV2.00‡**‡*‚03/23/81‚HLD6**‡**********************‹ENTRY:A6HASADDROFTCB *’A4HASPARAMETERBLOCKADDRESS*—0-TASKNAMEOFTARGETTASK*—4-SESSIONCODE$*—8-TASKNAMEOFEXCEPTIONMONITOR*–12-SESSIONCODE*’A5HASTARGETTCBADDRESS**‹EXIT:D0HASRETURNCODE*’D0=0„GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST.*ŠRTCDTFUL-5ƒASQISFULL-ORISNOTENABLED;*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-TARGETATTACHEDTOEXMON#*ŠRTCDNFND-7ƒEXMONTASKNOTFOUND3*ŠRTCDALOW-9ƒTARGETISSYSTEMTASKORNOTDORMANT***‰SECTIONLEVEL04* ‰XDEF„EXMON‰PAGEEXMON:‰MOVE.L„A5,A2SAVETARGETTASK  *!*‡FINDEXCEPTIONMONITORTASKTCB* ‰TR0.GTXTCB‚8(A4),12(A4)‰BRA.S…EXMON2ŽOK-FOUNDTCB ‰EXIT†RTCDNFND  EXMON2:$‰MOVE.L„A0,A5SAVEEXMONTCBADDRESS  **†CHECKFORVALIDTASKS* EXMON3::‰BTST†#TSKIEXM,TCBATTI(A2)…DOESTARGETALREADYHAVEEXMO?3‰EXIT.NEƒRTCDDPRQ‘TARGETALREADYATTACHEDTOEXMON. ,‰CMP.L…A2,A5”ARETARGETANDEXMONSAMETASK?%‰BEQ.S…EXMONE3’BRANCHTOERRORIFYES ‰CMP.L…A2,A6”ISTARGET=CALLER?‰BEQ.S…EXMON5“BRANCHIFYES 8‰BTST†#TSKSDORM,TCBSTATE(A2)ƒNO-TARGETMUSTBEDORMANT-‰BEQ.S…EXMONE3’BRANCHTOERRORIFNOTDORMANT EXMON5:4‰BTST†#TSKASYST,TCBATTR(A6)„ISCALLERASYSTEMTASK?‰BNE.S…EXMON6“BRANCHIFYES 4‰BTST†#TSKASYST,TCBATTR(A2)„ISTARGETASYSTEMTASK?2‰BNE.S…EXMONE3’REJECTUSERREQTOMONITORSYSTASK EXMON6:é^ò+‰MOVE.L„TCBSESSN(A5),A09‰CMP.L…TCBSESSN(A2),A0ŠARETARGETANDEXMONSAMESESSION?‰BEQ.S…EXMON7“SAMESESSIONOK 3‰BTST†#TSKASYST,TCBATTR(A5)„ISEXMONASYSTEMTASK?‰BNE.S…EXMON7“BRANCHIFYES EXMONE3:*‰EXIT†RTCDALOW‘ERROR-INVALIDTARGETTASK  * *…BUILDMESSAGETOSENDTOEXMON* EXMON7:(‰MOVE.L„#$C080000,D2MSGLENGTHANDTYPE.‰MOVE.W„TCBNAME(A2),D2‹FIRSTHALFOFTASKNAME<‰MOVE.L„TCBNAME+2(A2),D3‰2NDHALFOFNAME,1STHALFOFSESSN-‰MOVE.L„TCBSESSN+2(A2),D4ˆ2NDHALFOFSESSION4‰MOVE.W„#$0001,D40001MEANSMSGISRESULTOFATTACH‰TR0.QEVNTT‚(A5)“GOTOQEVENT ‰BRA.S…EXMON8 %‰EXIT†RTCDTFUL‘COULDNOTSENDMESSAGE  *"*…SETTARGET'WAITINGFORCOMMAND'* EXMON8:;‰BSET†#TSKIEXMT,TCBATTI(A5)„GIVEEXMONTASKEXMONATTRIBUTE9‰BSET†#TSKIEXM,TCBATTI(A2)…SETTARGET'ATTACHEDTOEXMON'=‰BSET†#TSKSWTEM,TCBSTATE(A2)ƒSETTARGET'WAITINGFORCOMMAND'?‰MOVE.L„TCBNAME(A5),TCBEXM(A2)ƒSAVENAMEOFEXMONINTARGETTCB9‰MOVE.L„TCBSESSN(A5),TCBEXMS(A2)SAVESESSNINTARGETTCB ‰CMP.L…A2,A6”ISCALLER=TARGET? &‰EXIT.EQƒPOSTEMPT‘yesexit(postempt); ‰EXIT†SUB–noexit(subroutine);‰ENDé éé=/*=/*†M68XXX.EXMONVR.AF=/*,=/* Chain file to assemble M68XXX.EXMONVR.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.EXMONVR.LS=/*=/IFC \1ƒ=ARGM68XXX.EXMONVR.LS=/ENDIF=/*3=ASM M68XXX.EXMONVR.SA,M68XXX.EXMONVR.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDééééééú‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST9EXMONVR‚IDNT„5,1ƒ68xxxSUBROUTINE--VALIDATEEXMONREQUEST*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*+*ˆSUBROUTINEUSEDBYRSTATE,PSTATE,REXMON**ˆVALIDATEREQUEST*‰SECTIONLEVEL04* ‰XDEFEXMONVR‰PAGEEXMONVR:6‰BTST†#TSKIEXM,TCBATTI(A5)ŠISTARGETATTACHEDTOEXMON"‰BEQ.S…EXMONVRE–BRANCHIFNOEXMON %‰MOVE.L„TCBEXM(A5),D0‘EXMONTASKNAME2‰CMP.L…TCBNAME(A6),D0ISCALLERTHISTASK'SEXMON?‰BNE.S…EXMONVRE–BRANCHIFNO $‰MOVE.L„TCBEXMS(A5),D0EXMONSESSION3‰CMP.L…TCBSESSN(A6),D0DOESCALLER'SSESSIONMATCH?‰BNE.S…EXMONVRE–BRANCHIFNO  **ˆCheckbufferaddress.*  ‰TR0.LOGPHY‚,8(A3)‰RTS¥GOODRETURN ‰NOP%*ˆADD.Lƒ#4,A7›SKIPSUBROUTINERETURN.‰EXIT„RTCDADR1˜exit(error_12); EXMONVRE:%*ˆADD.Lƒ#4,A7›SKIPSUBROUTINERETURN.‰EXIT„RTCDSTAT˜exit(error_10);‰END ééé6=/*=/*†M68XXX.EXQEVENT.AF=/*-=/* Chain file to assemble M68XXX.EXQEVENT.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.EXQEVENT.LS=/*=/IFC \1ƒ=ARGM68XXX.EXQEVENT.LS=/ENDIF=/*5=ASM M68XXX.EXQEVENT.SA,M68XXX.EXQEVENT.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.ASQ.MC=/*}=/*=ENDéééééé +EXQEVENTƒIDNT‚5,1ƒ68xxxTRAP0--QUEUEEVENTO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***B***…FILE:‚EXQEVENT-TRAP0HANDLER-QUEUEANEVENTTOATASK‰******É***D***…ENVIRONMENT:‚PartoftheRMS68KexecfortheMotorola68000.‡***(***‡Copyright1983byMotorola,Inc.¢******É***E***…FUNCTION:‚Queuesaneventfromtheregisterstoatargettask†******É******…NOTES:¾******É***E***…REGISTERUSAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SRhi„SRlo(CCR)…******‡D:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.******‡A:ƒ. ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É******…ENTRYCONDITIONS:³******É***<***‰QEVNTN-ENTRY:A0POINTSTOTASKNAME,SESSIONCODEŒ******É***/***‰QEVNTT-ENTRY:A0POINTSTOTARGETTCB™******É***:***‰QEVNTI-ENTRY:A0POINTSTOTARGETTCB,CALLERISŽ*******šEXTERNALINTERRUPTSERVICEROUTINE******É***E***ƒALLENTRYPOINTS:‚D2THRUD7CONTAINEVENTTOBEPLACEDINQˆ***6***—A1ANDA2HAVECONTINUATIONOFEVENTIFNEEDED„******É******É***-***…EXITCONDITIONSDIFFERENTFROMENTRY:Ÿ******É******‹TOPC--SUCCESSFUL«******‹TOPC+2--FAILED­******É******É***O*******************************************************************************O*******************************************************************************O*^*****************************************************************************‰PAGE*,*‚Revisionhistory(addnewchangestotop).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------)*…08/30/84‚MSLŒRe-wroteasstatemachine.(*…06/25/84‚SPTŒPerformanceenhancements..*…10/05/83‚SJFŒSavedD4aroundcalltoASRINT.*…11/06/81‚HLD6 *…08/20/79‚HLD6‹Initialwriting.* * *‚XDEF's.*‰XDEF†EXQEVNTI‰XDEF†EXQEVNTN‰XDEF†EXQEVNTT<i&w.[6h>pF ‰XDEF†SBQEVNTI‰XDEF†SBQEVNTN‰XDEF†SBQEVNTT * *‚XREF's. ‰XREF.S„APPEND_PB‰XREF.S„GTASQBUF‰XREF.S„I_DISP_ASR‰XREF.S„KILLER‰XREF.S„READY_ASR **‚Includedfiles:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.ASQ.MC*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.ASQ.MC‰LIST*‰SECTIONLEVEL01‰PAGE#*exqevntn: proc (msg_regs, pb_ptr);  &*„dclmsg_regslongword(D2-D7/A1-A2);*„dclpb_ptrlongword(A0);  *ˆsession<==session(pb_ptr);!*ˆtaskname<==taskname(pb_ptr);1*ˆtarget_tcb_ptr<==getxtcb(taskname,session); *ˆif(worked)*ˆthengotoexqevasq;*ˆelsereturn(error);* SBQEVNTN: EXQEVNTN:*$*†ENTERWITHTASKNAMESESSIONNUMBER*.‰MOVE.L„4(A0),D1Œsession<==session(pb_ptr);/‰MOVE.L„(A0),A0taskname<==taskname(pb_ptr); ‰TR0.GTXTCB*¦target_tcb_ptr<==*­getxtcb(taskname,session);‰BRA.S…EXQEVASQŒif(worked)*¦thengotoexqevasq; EXQEVER1:#‰ADD.L…#2,(A7)elsereturn(error);‰RTS‰PAGE,*exqevnti: entry (msg_regs, target_tcb_ptr);,*exqebntt: entry (msg_regs, target_tcb_ptr);  &*„dclmsg_regslongword(D2-D7/A1-A2);#*„dcltarget_tcb_ptrlongword(A0);  !*ˆif((target_tcb_ptr)<>'!TCB')*ˆthenreturn(error); *ˆelsedo;*A5<==target_tcb_ptr; *asq_ptr<==tcb_asq(asq_ptr);*if(asq_ptr<>0)*thengotoexqevent;*elsereturn(error);*ˆend;** EXQEVNTI: SBQEVNTI: SBQEVNTT: EXQEVNTT:2‰CMP.L…#'!TCB',(A0)ˆif((target_tcb_ptr<>'!TCB')"‰BNE‡EXQEVER1Œthenreturn(error); *¦elsedo; EXQEVASQ:$‰MOVE.L„A0,A5“A5<==target_tcb_ptr;:‰MOVE.L„TCBASQ(A5),A4‹asq_ptr<==tcb_asq(target_tcb_pt);‰MOVE.L„A4,D0“if(asq_ptr=0);"‰BEQ‡EXQEVER1thenreturn(error);*ªelsegotoexqevent;*¦end;‰PAGE$*exqevent: proc (msg_regs, tcb_ptr);    *ˆmsg_len<==len(msg_regs);*ˆif*ˆ(msg_len=0)*ˆthengotoerror(); *ˆelsedo;*set(tmsg_flag); *freeze(asq); *docase(asq_state,asq_mode); *ˆend;  *end exqevent;‰PAGE*ˆmsg_len<==len(msg_regs);*ˆif(msg_len=0)*ˆthengotoerror(); EXQEVENT:$‰MOVE.L„D2,D0msg_len<==len(msg);‰ROL.L…#8,D0if‰AND.L…#$FF,D0(msg_len=0)$‰BEQ.S…EXQEVER1Œthengotoerror();  *ˆelsedo;*set(tmsg_flag);*freeze(asq);"*docase(asq_state,as_sw_mode);*ˆend; ‰FREEZE_ASQ”freeze_asq 9‰MOVE.W„ASQSTATE(A4),D1…docase(asq_sta te,asq_sw_mode);‰MOVE.W„EXQEV_TBL(PC,D1.W),A0‰JMP‡EXQEV_TBL(PC,A0.W)‰PAGE EXQEV_TBL: ‰DC.W†RQ_DIS00-EXQEV_TBL‰DC.W†RQ_DIS01-EXQEV_TBL‰DC.W†RQ_DIS10-EXQEV_TBL‰DC.W†RQ_DIS11-EXQEV_TBL ‰DC.W†Q_EN_00-EXQEV_TBL‰DC.W†Q_EN_01-EXQEV_TBL‰DC.W†Q_EN_10-EXQEV_TBL‰DC.W†Q_EN_11-EXQEV_TBL ‰DC.W†R_EN_00-EXQEV_TBL‰DC.W†R_EN_01-EXQEV_TBL‰DC.W†R_EN_10-EXQEV_TBL‰DC.W†R_EN_11-EXQEV_TBL ‰DC.W†RQ_EN_00-EXQEV_TBL‰DC.W†RQ_EN_01-EXQEV_TBL‰DC.W†RQ_EN_10-EXQEV_TBL‰DC.W†RQ_EN_11-EXQEV_TBL ‰DC.W†WT_EN_00-EXQEV_TBL‰DC.W†WT_EN_01-EXQEV_TBL‰DC.W†WT_EN_10-EXQEV_TBL‰DC.W†WT_EN_11-EXQEV_TBL ‰DC.W†GT_EN_00-EXQEV_TBL‰DC.W†GT_EN_01-EXQEV_TBL‰DC.W†GT_EN_10-EXQEV_TBL‰DC.W†GT_EN_11-EXQEV_TBL‰PAGE RQ_DIS00: RQ_DIS01: RQ_DIS10: RQ_DIS11: R_EN_00:R_EN_01:R_EN_10:R_EN_11: EXQEVERR:‰RELEASE_ASQ–release(asq);.‰ADD.L…#2,2(A7)Œpc(stack)<==pc(stack)+2; ‰RTS›return;    RQ_EN_00: RQ_EN_10: WT_EN_00: WT_EN_10: GT_EN_00: GT_EN_10:‰RELEASE_ASQ–release(asq);‰BSR‡KILLERŽcall(killer);    Q_EN_00:Q_EN_01:Q_EN_10:Q_EN_11:‰BSR‡GTASQBUFŒcallget_asq_buf;‰BRA.S…EXQEV_20Œif(error)!‰BRA.S…EXQEVERRŒthengotoerror; EXQEV_20: *¦elsedo;,‰BCLR†#ASQMTBIT,ASQSWMD2(A4)ƒreset(asq_mt);‰RELEASE_ASQ˜release_asq;‰BSR‡R_IMPORT‘callr_import; ‰RTS return;*¦end;    GT_EN_01: *ˆdest_ptr<==A0_buf(asq_ptr);*ˆgotoexqev_30 6‰MOVE.L„ASQA0BUF(A4),A0…dest_ptr<==A0_buf(asq_ptr);‰BRA.S…EXQEV_30Œgotoexqev_30; GT_EN_11: !*ˆdest_ptr<==def_buf(asq_ptr); 6‰MOVE.L„ASQDBUF(A4),A0†dest_ptr<==def_buf(asq_ptr); EXQEV_30:4‰AND.B…#SWMD_MASK,D1‡asq_state(asq_ptr)<==asq_en;‰OR.B†#Q_EN,D1‰MOVE.W„D1,ASQSTATE(A4)‰RELEASE_ASQ“release(asq); ‰BSR‡RS_BYPASS‹callrs_bypass;‰E_CHK_PB–check(append_pb);%‰TR0.RYGET(A5)callready(tcb_ptr); ‰RTS›return;    =*„NOTE:‚Wemaywanttobringthefollowingtwocasestogether*‹tosavespace. RQ_EN_01:‰BSR‡GTASQBUFŒcallget_asq_buf;‰BRA.S…EXQEV_40Œif(error)$‰BRA.S…EXQEVERRŒthengotoerror(); EXQEV_40: *¦elsedo;"‰AND.B…#DBUF_EN,D1Žreset(asq_mt);.‰OR.B†#Q_EN,D1‘asq_state(asq_ptr)<==asq_en;‰MOVE.W„D1,ASQSTATE(A4)‰RELEASE_ASQ˜release_asq;‰BSR‡RA_IMPORTcallra_import; ‰BSR‡I_DISP_ASRcalli_disp_asr; ‰RTS return;*¦end; WT_EN_01:‰BSR‡GTASQBUFŒcallget_asq_buf;‰BRA.S…EXQEV_50Œif(error)"‰BRA‡EXQEVERRŒthengotoerror(); EXQEV_50: *¦elsedo;"‰AND.B…#DBUF_EN,D1Žreset(asq_mt);.‰OR.B†#Q_EN,D1‘asq_state(asq_ptr)<==asq_en;‰MOVE.W„D1,ASQSTATE(A4)‰RELEASE_ASQ˜release_asq; ‰BSR.S…RA_IMPORTcallra_import;‰BSR‡READY_ASRcalli_disp_asr; ‰RTS return;*¦end;    RQ_EN_11:4‰AND.B…#SWMD_MASK,D1‡asq_state(asq_ptr)<==asq_en;‰OR.B†#Q_EN,D1‰MOVE.W„D1,ASQSTATE(A4)‰RELEASE_ASQ–release_asq; 7‰MOVE.L„ASQDBUF(A4),A0†dest_ptr<==asq_dbuf(asq_ptr); ‰BSR.S…RA_BYPASS‹callra_bypass;‰E_CHK_PB–check(append_pb); ‰BSR‡I_DISP_ASRŠcalli_disp_asr; ‰RTS›return;    WT_EN_11:4‰AND.B…#SWMD_MASK,D1‡asq_state(asq_ptr)<==asq_en;‰OR.B†#Q_EN,D1‰MOVE.W„D1,ASQSTATE(A4)‰RELEASE_ASQ–release_asq; 7‰MOVE.L„ASQDBUF(A4),A0†dest_ptr<==asq_dbuf(asq_ptr); ‰BSR.S…RA_BYPASS‹callra_bypass;‰E_CHK_PB–check(append_pb);‰BSR‡READY_ASR‹callready_asr; ‰RTS›return;‰PAGE.*ra_import: proc (msg_regs dest_ptr, msg_len);  '*„dcl‚msg_regsbyte(32)(D2-D7/A1-A2);*„dcl‚dest_ptrlongword(A0);*„dcl‚msg_lenword(D0);  *ˆif(bit_7(msg_code)=set)0*ˆthenasq_xfr(asq_ptr)<==alt_asr_addr(msg);/*ˆelseasq_xfr(asq_ptr)<==asq_asr(asq_ptr);*ˆgotor_import;  /*ra_bypass: entry (msg_regs dest_ptr, msg_len);  *ˆreset(bit_7(code));*ˆif(bit_7wasset)thendo;)*asq_xfr(asq_ptr)<==asr_vector(msg);*squeeze(msg);*ˆend;/*ˆelseasq_xfr(asq_ptr)<==asq_asr(asq_ptr);*ˆgot or_import;  0*rs_bypass: entry (msg_regs, dest_ptr, msg_len);  *ˆreset(bit_7(code));*ˆif(bit_7wasset)*ˆthensqueeze(msg);*ˆgotor_import;  /*r_import: entry (msg_regs, dest_buf, msg_len);  /*ˆmsg_len<==msg_len*len(entry(move_tbl));#*ˆA1<==addr(move_tbl+msg_len); *ˆjmp(A1);‰PAGE/*ra_import: entry (msg_regs dest_ptr, msg_len);  '*„dcl‚msg_regsbyte(32)(D2-D7/A1-A2);*„dcl‚dest_ptrlongword(A0);*„dcl‚msg_lenword(D0);  *ˆif(bit_7(msg_code)=set)0*ˆthenasq_xfr(asq_ptr)<==alt_asr_addr(msg);/*ˆelseasq_xfr(asq_ptr)<==asq_asr(asq_ptr);*ˆgotor_import;  RA_IMPORT: ‰BTST†#23,D2‰BEQ.S…USE_DEF_VECT ‰MOVE.L„D3,D1 ‰MOVE.W„D2,D1‰SWAP†D1‰MOVE.L„D1,ASQXFR(A4)‰BRA.S…R_IMPORT  ‰PAGE/*ra_bypass: entry (msg_regs dest_ptr, msg_len);  *ˆreset(bit_7(code));*ˆif(bit_7wasset)thendo;)*asq_xfr(asq_ptr)<==asr_vector(msg);*squeeze(msg);*ˆend;/*ˆelseasq_xfr(asq_ptr)<==asq_asr(asq_ptr);*ˆgotor_import;  RA_BYPASS: ‰BCLR†#23,D2‰BEQ.S…USE_DEF_VECT ‰MOVE.L„D3,D1 ‰MOVE.W„D2,D1‰SWAP†D1‰MOVE.L„D1,ASQXFR(A4)‰BRA.S…SQUEEZE_MSG  USE_DEF_VECT:‰MOVE.L„ASQASR(A4),ASQXFR(A4)‰BRA.S…R_IMPORT‰PAGE0*rs_bypass: entry (msg_regs, dest_ptr, msg_len);  *ˆreset(bit_7(code));*ˆif(bit_7wasset)*ˆthensqueeze(msg);*ˆgotor_import;   RS_BYPASS:$‰BCLR.L„#23,D2Žreset(bit_7(code));+‰BEQ.S…R_IMPORTŒif(bit_7wasset)thendo; SQUEEZE_MSG:%‰SUB.W…#4,D0”msg_len<==msg_len-4;1‰SUB.L…#$04000000,D2Œlen(msg)<==len(msg)-4; ‰MOVE.W„D3,D2”squeeze(msg); ‰MOVE.L„D4,D3 ‰MOVE.L„D5,D4 ‰MOVE.L„D6,D5 ‰MOVE.L„D7,D6 ‰MOVE.L„A1,D7‰MOVE.L„A2,A1end;*¦gotor_import;‰PAGE/*r_import: entry (msg_regs, dest_buf, msg_len);  '*„dcl‚msg_regsbyte(32)(D2-D7/A1-A2);*„dcl‚dest_ptrlongword(A0);*„dcl‚msg_lenword(D0);  /*ˆmsg_len<==msg_len*len(entry(move_tbl));#*ˆA1<==addr(move_tbl+msg_len); *ˆjmp(A1);   R_IMPORT:3‰LSL.W…#2,D0len<==len*len(entryinmove_tbl);*¦(Len=offset(move_tbl);)*‰JMP‡MOVE_TBL(PC,D0.W)ƒjmpmove_tbl(len);‰PAGE*A* The move routines make use of the MOVEM instruction to speed up?*ˆthetransfer.‚TheNOPinstructionsareinsertedtoadjustthe(*ˆthelengthofallroutinestobesame.* *ˆWARNING:6*’DONOTREMOVETHENOPINSTRUCTIONSINTHEMOVERS!!!!1*’THEYADJUSTTHEROUTINEOFFSETSTOBETHESAME.*,MOVE_TBLEQU‡*-8‘INVALIDTOMOVEZEROBYTES.MOVE2‰BRA.S…MOVEFIX‰NOP‰NOP‰NOPMOVE4‰MOVE.L„D2,(A0) ‰BRA.S…MOVEX‰NOP‰NOPMOVE6‰MOVE.L„D2,(A0)‰MOVE.L„D3,-(A7)‰BRA.S…MOVEFIX‰NOPMOVE8‰MOVEM.LƒD2-D3,(A0) ‰BRA.S…MOVEX‰NOPMOVE10‰MOVEM.LƒD2-D3,(A0)‰MOVE.L„D4,-(A7)‰BRA.S…MOVEFIXMOVE12‰MOVEM.LƒD2-D4,(A0) ‰BRA.S…MOVEX‰NOPMOVE14‰MOVEM.LƒD2-D4,(A0)‰MOVE.L„D5,-(A7)‰BRA.S…MOVEFIXMOVE16‰MOVEM.LƒD2-D5,(A0) ‰BRA.S…MOVEX‰NOPMOVE18‰MOVEM.LƒD2-D5,(A0)‰MOVE.L„D6,-(A7)‰BRA.S…MOVEFIXMOVE20‰MOVEM.LƒD2-D6,(A0) ‰BRA.S…MOVEX‰NOPMOVE22‰MOVEM.LƒD2-D6,(A0)‰MOVE.L„D7,-(A7)‰BRA.S…MOVEFIXMOVE24‰MOVEM.LƒD2-D7,(A0) ‰BRA.S…MOVEX‰NOPMOVE26‰MOVEM.LƒD2-D7,(A0)‰MOVE.L„A1,-(A7)‰BRA.S…MOVEFIXMOVE28‰MOVEM.LƒD2-D7/A1,(A0) ‰BRA.S…MOVEX‰NOPMOVE30‰MOVEM.LƒD2-D7/A1,(A0)‰MOVE.L„A2,-(A7)‰BRA.S…MOVEFIXMOVE32‰MOVEM.LƒD2-D7/A1-A2,(A0) ‰BRA.S…MOVEX MOVEFIX:*‰LSR.W…#2,D0movethewordfromthestack,2‰MOVE.W„(A7),-2(A0,D0.W)„totheendofthebuffer. -‰ADD.L…D0,A0dest_ptr<==dest_ptr+msg_len;‰ADDQ.L„#4,A7cleanupstack; ‰RTS›return; MOVEX:-‰LSR.W…#2,D0dest_ptr<==dest_ptr+msg_len; ‰ADD.L…D0,A0 ‰RTS›return;‰END éééééé=/*=/*†M68XXX.EXRQPA.AF=/*+=/* Chain file to assemble M68XXX.EXRQPA.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.EXRQPA.LS=/*=/IFC \1ƒ=ARGM68XXX.EXRQPA.LS=/ENDIF=/*1=ASM M68XXX.EXRQPA.SA,M68XXX.EXRQPA.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééééNŠPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.BAB.EQŠINCLUDE9995.&.PAT.EQŠINCLUDE9995.&.INTERRUP.M CŠLISTŠPAGEDEXRQPA„IDNTƒ5,1‡68xxxTRAP0--REQUESTPERIODICACTIVATIONOFPROCESS*$*ˆCOPYRIGHTED1982BYMOTOROLA,INC.**ˆ*********************ˆ*EXRQPAƒ3.10„**ˆ*’**ˆ*HLD6ƒ02/08/82‚**ˆ**********************…REQUESTPERIODICACTIVATION*:*ˆENTRYREGISTERS:‚A0ˆAddressofproceduretobeactivated'*šA1ˆActivationinterval(Milliseconds)0*šD1‚Bit15=0‚Requestfornewperiodicactvation,*žBit15=1‚Cancelperiodicactvationrequest$*žBit14=0‚Requestsingleactivation(*žBit14=1‚Requestcontinuousactivation&*žBit13=1‚(onlyusedofNOTacancel)*ªDonotcancelanexisting*ªrequestwiththesameIDwhen*ªinsertingthisnewrequest.+*žBit13=0‚Cancelexistingrequestwiththe*ªsameIDbeforeinsertingthis*ªnewrequest.‚Ifthisoption!*ªisused,onlythefirstrequest *ªwithamatchingIDisremoved.(*žBits7-0‚Interruptlevelofactivation*šD2ˆRequestID*>*ˆRETURNREGISTERS:D0andD1Destroyed-Allotherspreserved*0*ˆPCONRETURN:…PCunchanged-Successfulreturn$*šPC=PC+2†-Unabletoacceptrequest*ŠSECTIONLEVEL00* ŠXDEFƒEXRQPA ŠXDEFƒSBRQPA ŠXDEFƒPAT_SCHED_NEW_NODEŠXDEFƒPAT_DEL_NODEŠXDEFƒPAT_1ST_NODE_DELŠXDEFƒPAT_RM_1ST_NODEŠXDEFƒPAT_MID_NODE_DEL** SYSPAR parameters* ŠXREF.SNSEŠXREF.SPATBEGŠXREF.STIME_LEFT 3* IF this is NOT a cancel request (bit 15 = 0) THEN >*ƒIFcancelbeforeinsertoptionISselected(bit13=0)THEN-*†removenodefromPATlistwithmatchingID.*ƒENDI *ƒPlacerquestintoPATlist. * ELSE*ƒcancelrequest.  SBRQPA:EXRQPA:*ŠMOVE.WSR,-(A7)‹Saveforunmaskinglater.>ŠMOVEM.LD2-D3/A1-A4,-(A7)TherearetheregistersImustsave ,SRSTACKƒSET„(2*4)+(4*4)ˆDepthtoSRonstack WW`XhTpBxC€%ŠMOVE.LA1,D0ŽRequestedtimeinterval6ŠMOVE.LPATBEG,A1ŠAddressofPeriodicActivationTable ŠTST.W‚D1ŠIFTHEN.S  *B*Thisisaninsertrequest.‚Ifthecancelbeforeinsertoptionis5*ƒselected(bit13=0)thencancelthisrequestfirst.* BTST‚#13,D1IFTHEN.SBSR.S‚PAT_CAN_REQUESTENDI *A* Try to get a node from the free list and schedule this routine.* DISABLE_INTERRUPTS…Mask +MOVE.L„PATFHDR(A1),D3‚FreePATnodeheaderIFTHEN.SMOVE.WSRSTACK(A7),SR‚Unmask>ADD.L‚#2,SRSTACK+2(A7)Nofreeentrysobiasreturnaddrby2 BRA„EXRQ2RŠGomakeerrorreturn ELSE.SMOVE.LD3,A2‡Newentryaddress;MOVE.LPATNEXT(A2),PATFHDR(A1)RemoveentryfromfreelistMOVE.WSRSTACK(A7),SR‚Unmask  *=* A2 points to free node, plug node with required information* $CLR.L‚PATTCB(A2)‰MarkasExecentry(BCLRƒ#31,D0Insureintervalispositive&MOVE.LD0,PATINTV(A2)…Setupinterval  *D* Note: PATDELTA will be computed and inserted by PAT_SCHED_NEW_NODE* ,MOVE.LA0,PATASR(A2)†Execprocedureaddress$MOVE.LD2,PATARID(A2)…ActivationIDCLR.W‚PATOPT(A2)‰Clearoption-BTSTƒ#PATOINTV,D1‡Shouldcontinuationbeset IFTHEN.S*“BSET‚#PATOINTV,PATOPT(A2)Yes-sosetitENDI #LSL.W‚#8,D1ŽJustifyprioritylevel5OR.Wƒ#$FFFF-$0700,D1„Addallbitsoutsideofi-level(MOVE.WD1,PATILVL(A2)…SetintoPATnode  ** Put entry into active list* .MOVE.LD0,D2ŽmsfromnowforSCHEDsubroutineDISABLE_INTERRUPTSˆmask-BSR„PAT_SCHED_NEW_NODESchedulethenewnode 'MOVE.WSRSTACK(A7),SR…AllowinterruptsBRA„EXRQ2RGoexit ENDIŠENDI  *;* This is a cancel request, find node on list and delete it* PAT_CAN:ŠBSR.S‚PAT_CAN_REQUEST ŠBRA„EXRQ2R‰PAGE*=* Subroutine cancels the request for the 1st EXEC node on theG*ƒPATlistthatmatchestheIDinD2.‚Nodeisremovedfromactivelist, 4*ƒPAT_DELTAandTIME_LEFT(if1stnode)areupdated.**ƒAllregisterspreserved.* PAT_CAN_REQUEST:ŠMOVEM.LD3-D4/A2-A4,-(A7) FSRSTACKƒSET„SRSTACK+(5*4)+4„Addmoreregisters,andsubroutinereturn. 'ŠLEA„PATHDR(A1),A2†StartofACTIVElist2ŠMOVE.LA2,A3ŽA3willtrailA2as‚wescanthelist#ŠDISABLE_INTERRUPTSˆMaskinterrupts6ŠMOVE.LPATNEXT(A3),A2…A2pointstofirstnodeonlist  *<* If PATTCB = 0 then this is an Exec node - see if IDs match* 9ŠIF.LPATTCB(A2)#0AND.LPATARID(A2)D2THEN.S1MOVE.LPATNEXT(A2),PATNEXT(A3)Unlinkthisentry?MOVE.LPATNEXT(A2),A4‚Pointtonewfirstnode,(prev2ndnode)1MOVE.LPATDELTA(A4),D4Deltaofremoved1stnodeADD.L‚D4,TIME_LEFT ADD.L‚D4,NSE$BCLRƒ#31,NSE‰InsurepositivenumberMOVE.WSRSTACK(A7),SR‚Unmask(BRA.S‚EXRQ2.1‰Exitifwefoundanentry ŠENDI  *+* First node wasn't it, walk list for match* +ŠMOVE.LA2,A3ŽA3pointsto1stnodeonlist4ŠMOVE.LPATNEXT(A3),D3…D3pointsto2ndnodeonlist ŠWHILEDO.S/MOVE.LD3,A2‹A2-->node,A3-->previousnode 9IF.L‚PATTCB(A2)#0AND.LPATARID(A2)D2THEN.S,MOVE.LPATNEXT(A2),PATNEXT(A3)Unlinkentry3MOVE.LPATNEXT(A2),A4PointA4tonextnodeifany IFA4#0THEN.S4“MOVE.LPATDELTA(A2),D4‚Therewasanextnodeso...4“ADD.L‚D4,PATDELTA(A4)‚...updatedeltaofthatnodeENDI MOVE.WSRSTACK(A7),SRUnmask#BRA.S‚EXRQ2.1†Branchonfoundnode ELSE.SMOVE.LA2,A3ˆA3-->thisnode/MOVE.LPATNEXT(A2),D3‚D3-->nextnode,ifanyENDI ŠENDW *ŠBRA.SEXRQ2.RBranchifnothingtocancel  ** Free the entry* EXRQ2.1:ŠPAT_FREE_NODEPutonfreelist EXRQ2.R:ŠMOVEM.L(A7)+,D3-D4/A2-A4+ŠRTS—ReturnfromPAT_CAN_REQUESTsubroutine #* End of PAT_CAN_REQUEST subroutine  EXRQ2R::ŠMOVEM.L(A7)+,D2-D3/A1-A4Returnfromthisentireroutine#ŠMOVE.W(A7)+,SR‹LoseSRfromstackŠRTSŠPAGEC*------------------------------------------------------------------ *SubroutinePAT_SCHED_NEW_NODE: *Entry:‚A1pointstoPATheader%*‰A2pointstonodewewishtoinsert:*‰D2containstheintervalinmsuntilthenodeistofire>*ŒNOTE:InterruptsMUSTbeinhibitedwhencallingthisroutine**Exit:ƒD0destroyed*‰D1destroyed*‰A3destroyed*‰A4destroyed#*ŒChecktwoexitpointsfordetails 1ŠMOVE.LPATHDR(A1),A3†pointtocurrentfirstnode$ŠMOVE.LD2,D1Žinterval(msfromnow)4ŠSUB.L‚TIME_LEFT,D1‡D1=interval-original_time_leftŠIFTHEN.S*$*œThisisthecasewherethenodewe)*œscheduleisthefirstnodeinthelist.*œTheformulasweuseare:**žnew_time_left=interval1*žprev_1st_node_delta=orig_time_left-interval0*žnew_NSE=orig_NSE-orig_time_left+interval*"MOVE.LD2,TIME_LEFT„Newtime_left ADD.L‚D1,NSE$BCLRƒ#31,NSE‰Insurepositivenumber NEG.L‚D19MOVE.LD1,PATDELTA(A3)Previous1stnode'supdateddelta?MOVE.LA3,PATNEXT(A2)‚Linkpreviousfirstnodetonew1stnode7MOVE.LA2,PATHDR(A1)ƒLinknewfirstnodetoPATheader  *!* After inserting new first node:"*‰A2pointstonewlyinsertednode3*‰A3pointstofollowingnode(previousfirstnode)5*‰D1containsdeltaoffollowingnode(previousnode)* ŠELSE.S.*œThisisthecasewherewearenotscheduling.*œthefirstnodeonthelistbutmustwalkthe-*œlisttodeterminethespotintimesequence%*œwherethenewnodeistobelinked.**œA1pointstoPATheader%*œA2pointstonodewewishtoinsert/*œA3pointstofirstnodecurrentlyonPATlist2*œD2containstheintervalinmsuntilthenodeis *¡tofire AMOVE.LPATNEXT(A3),A4A4leadsA3bypointingtothe'next'nodeSUB.L‚PATDELTA(A4),D1WHILEDO.S.MOVE.LA4,A3ˆHaven'tfoundplaceyet-so...3MOVE.LPATNEXT(A3),A4‚AdvancetonextnodeonlistSUB.L‚PATDELTA(A4),D1ENDW * Insert middle node:0*œWecurrentlybrackettheplaceinthePATlist /*œwhereweneedtolinkthenewnode.‚A3points3*œtothepreviousnode,A4pointstothenextnode.+*œWemustlinkthenodepointedatbyA2in*œbetweenthesetwonodes.MID_NODE!MOVE.LPATDELTA(A4),PATDELTA(A2)ADD.L‚D1,PATDELTA(A2) NEG.L‚D1MOVE.LD1,PATDELTA(A4);MOVE.LPATNEXT(A3),PATNEXT(A2)Pointnewnodetonextnode6MOVE.LA2,PATNEXT(A3)‚PointpreviousnodetonewnodeŠENDI*!* After inserting new middle node(*‰A2pointstoinsertednode(unchanged)*‰A3pointstopreviousnode*‰A4pointstofollowingnode%*‰D1containsdeltaoffollowingnode* SCHED_RTS RTS * Subroutine PAT_DEL_NODE: *Entry:‚A1…pointstoPATheader"*‰A2…pointstoentrytoberemoved<*‰A3…IfnodewewanttodeleteismiddlenodethenA3points*’tonodejustprior.2*Exit:ƒA2…pointstoentryfollowingremovedentry*‰A3…destroyed-*‰D0…containsDELTAofPATentryjustremoved 8ŠMOVE.LPATHDR(A1),-(A7)‡Pointerto1stiteminPATlistAŠIF.LA2(A7)+THEN.S…IFwe'redeletingthe1stitemthen...BSR.S‚PAT_1ST_NODE_DELŠELSE.S7BSR.S‚PAT_MID_NODE_DEL„Deleteitemotherthan1stitemŠENDIŠRTS * SubroutinePAT_1ST_NODE_DEL: *Entry:‚A1…pointstoPATheader"*‰A2…pointstoentrytoberemoved2*Exit:ƒA2…pointstoentryfollowingremovedentry-*‰D0…containsDELTAofcurrent1stPATentry. +ŠMOVE.LPATNEXT(A2),PATHDR(A1)Unlinkentry1ŠPAT_FREE_NODEputthenodebackonthefreelist;ŠMOVE.LPATHDR(A1),A2†setA2topointtofirstitemonlist>ŠMOVE.LPATDELTA(A2),D0„UpdateSYSPAR'stimeleftandnext...3ŠADD.L‚D0,TIME_LEFT‡...significanteventparameter ŠADD.L‚D0,NSE$ŠBCLRƒ#31,NSEŒInsurepositivenumberŠRTS * SubroutinePAT_MID_NODE_DEL: *Entry:‚A1…pointstoPATheader"*‰A2…pointstoentrytoberemoved4*‰A3…pointstonodejustpriortonodetoberemoved2*Exit:ƒA2…pointstoentryfollowingremovedentry-*‰D0…containsDELTAofPATentryjustremoved 1ŠMOVE.LPATNEXT(A2),PATNEXT(A3)Unlinkthisentry"ŠPAT_FREE_NODEReturntofreepool5ŠMOVE.LPATDELTA(A2),D0„Deltaofnodewejustremoved/ŠMOVE.LPATNEXT(A3),A2…Pointtofollowingentry5ŠADD.L‚D0,PATDELTA(A2)„UpdatedeltaoffollowingnodeŠRTS * SubroutinePAT_RM_1ST_NODE: G*RemovesfirstPATnode.‚Doesnotplaceonfreequeue.‚UpdatesNSEandE*ƒTIME_LEFTaccordingly.‚Absolutetimethatnodewastofire(NSE)is5*ƒplacedintothePATDELTAfieldoftheremovednode. *Entry:‚A1…pointstoPATheader"*‰A2…pointstoentrytoberemoved4*Thisroutinemustbecalledwithinterruptsmasked1*Exit:ƒA2…A2pointstoremovedentry(unchanged)*‰A3…pointstonew1stnode-*‰D0…containsDELTAofcurrent1stPATentry. +ŠMOVE.LPATNEXT(A2),PATHDR(A1)Unlinkentry.ŠMOVE.LPATHDR(A1),A3ŠPointA3tonew1stnodeŠMOVE.LPATDELTA(A3),D06ŠADD.L‚D0,TIME_LEFT‡BumpTIME_LEFTandNSEbydeltaofŠADD.L‚D0,NSEnewfirstnode$ŠBCLRƒ#31,NSEŒInsurepositivenumberŠRTS ŠENDéééé =/*=/*†M68XXX.FNDGSEG.AF=/*,=/* Chain file to assemble M68XXX.FNDGSEG.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.FNDGSEG.LS=/*=/IFC \1ƒ=ARGM68XXX.FNDGSEG.LS=/ENDIF=/*3=ASM M68XXX.FNDGSEG.SA,M68XXX.FNDGSEG.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.GST.EQ=/*}=/*=ENDééééé鈉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.GST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.GST.EQ‰LIST‰PAGE?FNDGSEG‚IDNT‚5,1‚68xxxTRAP0--FINDSEGMENTINGLOBALSEGTABLE*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*$*†FNDGSEG‚--‚REV1.01‚4/10/79ƒ(HLD6)**ˆPURPOSE:‚FINDGLOBALSEGMENT4*LOOKSINGLOBALSEGMENTTABLEFORCALLER'SSEGMENT6*IFFOUND-RETURNSPOINTERTOGSTENTRYFORMATCHING *›SEGMENT7*IFNOTFOUND-RETURNSPOINTERTOUNUSEDENTRYINGST!*ŸPOINTER=0IFNOROOMINTABLE**ˆENTRY:A0=SEGMENTNAME'*D1=SEGMENTATTRIBUTES(NOTCHANGED)!*D2=SESSIONCODE(NOTCHANGED)*3*ˆEXIT:‚RTS„A0=POINTERTOMATCHINGENTRYINTABLE-*RTS+2‚A0=POINTERTOUNUSEDENTRYINTABLE&*–D0=UPDATEDCOUNTOFENTRIESINGST,*›(REPLACESGSTLENTIFUNUSEDENTRYISUSED)+*’OR‚A0=0IFNOSPACEISAVAILABLEINGST***ˆREGISTERSUSED:‚01234567*—D*****—A******ˆCODEISRE-ENTRANT*ˆNOSUBROUTINESCALLED$*ˆGSTTABLECHECKEDBUTNOTMODIFIED**‰SECTIONLEVEL02* ‰XDEF„FNDGSEG‰XDEF„SBFNDGSG ‰XREF.S‚GSTBEG‰PAGE SBFNDGSG:FNDGSEG: ‰CLR.L…D3 ‰CLR.L…D0,‰MOVE.L„GSTBEG,A1‹PTRTOGLOBALSYMBOLTABLE‰MOVE.L„A1,D0DOESTABLEEXIST?‰BEQ.S…FNDGNORBRANCHIFNO '‰LEA‡GSTENTRY(A1),A2…FIRSTENTRYINGST,‰MOVE.W„GSTLENT(A1),D0†NUMBERENTRIESINGST‰BEQ.S…FNDGSXXTABLEISEMPTY +‰SUB.L…A3,A3CLEARPNTRTO1STUNUSEDENTRY  **ˆCHECKONEGSTENTRY* FNDGSG1:‰TST.W…GSTCNT(A2)ŠISENTRYUSED‰BNE.S…FNDGSG2YES *‰CMP.L…#0,A3DOWEHAVEPNTRTO1STUNUSED‰BNE.S…FNDGSG3YES ‰MOVE.L„A2,A3SAVE1STUNUSED ‰BRA.S…FNDGSG3 FNDGSG2:&‰CMP.L…GSTNAME(A2),A0†DONAMESCOMPARE‰BNE.S…FNDGSG3NO ,‰CMP.L…GSTSESSN(A2),D2…COMPARESESSIONCODES‰BEQ.S…FNDGSX2SAME-EXIT ,‰BTST†#SEGAGLBL,GSTATTR(A2)ISENTRYGLOBAL?‰BEQ.S…FNDGSG3NO ‘_š3%‰BTST†#SEGAGLBL,D1ˆCALLERSAYGLOBAL?‰BNE.S…FNDGSX2YES-EXIT #‰BTST†#SEGASHR,D1‰CALLERSAYLOCAL?‰BNE.S…FNDGSG3YES ‰MOVE.L„A2,D3SAVEPOINTER FNDGSG3:#‰ADD.L…#GSTEL,A2‹INCRTONEXTENTRY'‰SUB.W…#1,D0DECREMENTCOUNTOFENTRIES ‰BNE‡FNDGSG1GOCHECKNEXTENTRY ‰TST.L…D3’WASPOINTERSAVED?‰BNE.S…FNDGSX3YES-USEIT  *'*ˆALLENTRIESCHECKED--NOMATCHFOUND* (‰MOVE.W„GSTLENT(A1),D0†CURRENT#ENTRIES ‰MOVE.L„A3,A0$‰CMP.L…#0,A3WASUNUSEDENTRYFOUND?‰BNE.S…FNDGSX1YES FNDGSXX:‰MOVE.L„A2,A0GETNEXTENTRY(‰CMP.W…GSTMENT(A1),D0†COMPAREWITHMAX#&‰BLT.S…FNDGSX0BRANCHIFROOMINTABLE FNDGNOR:(‰SUB.L…A0,A0NOROOM,CLEARA0FORRETURN FNDGSX0: ‰ADD.L…#1,D0INCREMENT#ENTRIES FNDGSX1:‰ADD.L…#2,(A7)RETURNTOPC+2‰RTS  FNDGSX2:(‰MOVE.L„A2,A0RETURNADDROFENTRYFOUND‰RTS  FNDGSX3:)‰MOVE.L„D3,A0RETURNADDROFGLOBALENTRY‰RTS‰ENDéééé=/*=/*†M68XXX.FNDTSEG.AF=/*,=/* Chain file to assemble M68XXX.FNDTSEG.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.FNDTSEG.LS=/*=/IFC \1ƒ=ARGM68XXX.FNDTSEG.LS=/ENDIF=/*3=ASM M68XXX.FNDTSEG.SA,M68XXX.FNDTSEG.RO,\1;MRZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDéééé é颉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGEAFNDTSEG‚IDNTƒ5,1‚68xxxTRAP0--FINDSEGMENTINTASKSEGMENTTABLE*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*FNDTSEG…1.00**ˆ*’**ˆ*761604/23/79„**ˆ*********************…FINDSEGMENTNAMEINTST *ˆ7616,ESQ*$*ENTRY‚A0„POINTSTOTST(PRESERVED)*ˆD7„DESIREDSEGMENTNAME**EXITƒPC„IFFOUND*ˆD5„FOUNDENTRYAT0(A0,D5)**ˆPC+2‚IFNOTFOUND)*ˆD5„0(A0,D5)POINTSTOFIRSTEMPTYENTRY* *’01234567*USESREGISTERSDR„*E*AP†E**ˆDOESNOTGETEXCLUSIVEACCESS*‰SECTIONLEVEL02* ‰XDEFƒFNDTSEG‰XDEFƒSBFNDSEG‰PAGE SBFNDSEG:FNDTSEG:‰CLR.L‚D0ŽCLEARFORSHORTLOADS ‰MOVE.LA0,D5‹BESURETSTEXISTS‰BEQ.S‚FNDTSEG4ˆEXITIFNOT ‰CLR.L‚D5!‰MOVE.WTSTLMMU(A0),D5LASTENTRY FNDTSEG1:,‰BTSTƒ#SEGAUSED,TSTAATTR(A0,D5)ˆEMPTYENTRY?#‰BNE.S‚FNDTSEG2ˆBRANCHIFNOTEMPTY #‰MOVE.LD5,D0‹EMPTY--REMEMBERENTRY(‰BRA.S‚FNDTSEG3ˆLOOKFORANOTHERSEGMENT FNDTSEG2: ‰CMP.L‚TSTANAME(A0,D5),D7…AHIT?‰BEQ.S‚FNDTSEG5ˆBRANCHIFYES FNDTSEG3:!‰SUB.L‚#8,D5ŠTRYNEXTLOWERENTRY‰CMP.W‚#TSTMMU,D5!‰BGE„FNDTSEG1‡GOCHECKNEXTENTRY FNDTSEG4:‰MOVE.LD0,D5‹THEREISN'T$‰ADD.L‚#2,(A7)ˆTAKENOTFOUNDRETURN FNDTSEG5:‰RTS‰ENDéé«N=/*=/*†M68XXX.FNDUSEM.AF=/*,=/* Chain file to assemble M68XXX.FNDUSEM.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.FNDUSEM.LS=/*=/IFC \1ƒ=ARGM68XXX.FNDUSEM.LS=/ENDIF=/*3=ASM M68XXX.FNDUSEM.SA,M68XXX.FNDUSEM.RO,\1;MRZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UST.EQ=/*}=/*=ENDéé éééé´‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.UST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.UST.EQ‰LIST‰PAGE9FNDUSEM‚IDNT‚5,1ƒ68xxxTRAP0--FINDUSERSEMAPHOREINUST*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*#*†FNDUSEM‚--‚REV1.01‚3/3/80ƒ(HLD6)*-*ˆPURPOSE:‚FINDENTRYINUSERSEMAPHORETABLE!*LOOKSINUSTFORMATCHINGENTRY6*IFFOUND-RETURNSPOINTERTOUSTENTRYFORMATCHING*›ENTRY7*IFNOTFOUND-RETURNSPOINTERTOUNUSEDENTRYINUST!*ŸPOINTER=0IFNOROOMINTABLE*?*ˆENTRY:A0=SEMAPHORENAME--IF0,FINDANYENTRY,THISTASK1*A4=ADDROFTCB(TASKNAMEANDSESSIONINTCB)*9*ˆEXIT:‚RTSTOPCƒD0=ENTRY#OFMATCHINGENTRYINTABLE*›A0=SEMAPHORENAME7*RTSTOPC+2D0=ENTRY#OF1STUNUSEDENTRYINTABLE,*›D1=ENTRY#OFSEMAPHOREENTRY(IFFOUND)&*–D2=UPDATEDCOUNTOFENTRIESINUST,*›(REPLACESUSTCENTIFUNUSEDENTRYISUSED)+*’OR‚D0=0IFNOSPACEISAVAILABLEINUST***ˆREGISTERSUSED:‚01234567 *—D******—A*****ˆCODEISRE-ENTRANT*ˆNOSUBROUTINESCALLED$*ˆUSTTABLECHECKEDBUTNOTMODIFIED**‰SECTIONLEVEL02* ‰XDEF„FNDUSEM‰XDEF„SBFNDSEM ‰XREF„KILLER ‰XREF.S‚USTBEG‰PAGE SBFNDSEM:FNDUSEM:‰CLR.LƒD2‰CLEARFORSHORTLOAD%‰CLR.LƒD3‰CLEARUNUSEDENTRYREGISTER*‰CLR.LƒD1‰CLEARSEMAPHOREPOINTERREGISTER.‰MOVE.L‚USTBEG,A1PNTRTOUSERSEMAPHORETABLE  **ˆGETREADYTOSEARCHTABLE* ‰MOVE.L‚A1,D4‰DOESTABLEEXIST?‰BEQ.SƒFNDUNOR‡BRANCHIFNO (‰MOVE.WƒUSTCENT(A1),D2…CURRENT#ENTRIES$‰CMP.WƒUSTMENT(A1),D2ˆISCURR=MAX?‰BEQ.SƒFNDUSM1ŠYES ‰ADD.Wƒ#1,D2 FNDUSM1:‰MOVE.L‚D2,D4ŽPUTCOUNTINBOTH(‰MOVE.L‚#USTENTRY,D0‡OFFSETTO1STENTRY  **‡CHECKONEUSTENTRY;*‡D0=OFFSETTOCURRENTRYD1=ENTRY#OFSEMAPHOREENTRY2*‡D2=COUNTOFENTRIES…D3=ENTRY#OF1STUNUSED&*‡D4=TABLEINDEXŠA0=SEMAPHORENAME½XÆQ'*‡A1=ADDROFCURRENTUST‚A2=SCRATCH* FNDUSM2:‰TST.WƒUSTUCNT(A1,D0)‰BNE.SƒFNDUSM4  **ˆEMPTYENTRY-SAVEFIRSTONE.* ‰TST.LƒD3ˆHAVEWESAVEDONE‰BNE.SƒFNDUSM5ƒYES !‰MOVE.L‚D0,D3‰SAVEUNUSEDENTRY#‰CMP.Lƒ#1,D4…ISTHISLASTENTRY‰BEQ.SƒFNDUSM5ƒYES +‰MOVE.W‚USTCENT(A1),D2‚NO-KEEPORIGVALUE‰BRA.SƒFNDUSM5  *!*…GOODENTRY--SEEIFITMATCHES* FNDUSM4:$‰CMP.L‚#0,A0‡ISSEMAPHORENAME=0?0‰BEQ.S‚FNDUSM4A„FINDANYSEMAPHOREFORTHI STASK 0‰CMP.L‚USTSNAME(A1,D0),A0‚COMPARESEMAPHORENAME‰BNE.S‚FNDUSM5 FNDUSM4A:‰MOVE.LTCBSESSN(A4),A2+‰CMP.L‚USTSESSN(A1,D0),A2‚COMPARESESSION#‰BNE.SƒFNDUSM5 ‰MOVE.LTCBNAME(A4),A2,‰CMP.L‚USTTNAME(A1,D0),A2‚COMPARETASKNAMES‰BEQ.S‚FNDUSM8 )‰TST.W‚USTUCNT(A1,D0)„ISTHISASEMAPHORE‰BMI.S‚FNDUSM5‰NO &‰MOVE.L‚D0,D1ˆSAVESEMAPHOREENTRY#‰* FNDUSM5:‰ADD.Lƒ#USTEL,D0'‰SUB.Wƒ#1,D4‰DECREMENTCOUNTOFENTRIES(‰BNE…FNDUSM2‡GOBACKTOCHECKNEXTENTRY  **ƒNOMATCHINGENTRYFOUND* '‰ADD.L‚#2,(A7)†INCREMENTRETURNADDRESS#‰TST.L‚D3‹ISTHEREANUNUSEDENTRY?‰BNE.S‚FNDUSM7 FNDUNOR:‰CLR.LƒD0‰NOUNUSEDENTRY ‰CLR.LƒD2‰RTSRETURN-TABLEISFULL  FNDUSM7:&‰MOVE.L‚D3,D0„ENTRY#FORUNUSEDENTRY!‰RTSRETURN-WITHUNUSEDENTRY#  **‰FOUNDENTRYINTABLE* FNDUSM8:0‰MOVE.L‚USTSNAME(A1,D0),A0„RETURNSEMAPHORENAME‰RTSRETURN-FOUNDMATCH‰ENDéé=/*=/*†M68XXX.GETTCB.AF=/*+=/* Chain file to assemble M68XXX.GETTCB.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.GETTCB.LS=/*=/IFC \1ƒ=ARGM68XXX.GETTCB.LS=/ENDIF=/*1=ASM M68XXX.GETTCB.SA,M68XXX.GETTCB.RO,\1;MRZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDééééééÎpagebound)!‰BNE.S…GOT_BEŽthengotonot_tcb; (‰MOVE.L„D0,A0AO<==potential_tcb_addr; -‰PEA‡GOT_BE(PC)Šmakebuserrorsgotogot_be;‰MOVE.W„#'BE',-(A7) (‰CMP.L…#'!TCB',(A0)ˆif((A0)<>#'!TCB')"‰BNE.S…NOT_TCBthengotonot_tcb; 5‰CMP.L…TCBSESSN(A0),D1…if(session_number(A0)<>D1)"‰BNE.S…NOT_TCBthengotonot_tcb; GOT_TCB:,‰ADDQ.L„#6,A7popbuserrorstuffoffstack;‰BRA.S…GETTCB9gotogettcb9; NOT_TCB:,‰ADDQ.L„#6,A7popbuserrorstuffoffstack; GOT_BE:&‰ADD.L…#2,(A7)indicatetcbnotfound;*¦andgotogettcb9;  *,*†GIVEUPEXCLUSIVEACCESSTO'TCBALL'LIST* GETTCB9:‰IFNE„MULTPROC ‰TR0.VƒSEMTCB‰ENDC ‰RTS‹DONE‰ENDééééé=/*=/*†M68XXX.GTDTIM.AF=/*+=/* Chain file to assemble M68XXX.GTDTIM.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.GTDTIM.LS=/*=/IFC \1ƒ=ARGM68XXX.GTDTIM.LS=/ENDIF=/*1=ASM M68XXX.GTDTIM.SA,M68XXX.GTDTIM.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééééé ð‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE2GTDTIMƒIDNT„5,1ƒ68xxxDIRECTIVE--GETDATEANDTIME*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡*******************#*‡*‚GTDTIM„*ƒGETDATEANDTIME*‡*‚REV1.00ƒHLD6**‡*‚11/12/79‡**‡********************1*†THISROUTINERETURNSDATEANDTIMETOREQUESTOR***‹ENTRY:A6HASADDROFTCB *’A4HASPARAMETERBLOCKADDRESS*—0-ORDINALDATE(4BYTES)*—4-TIME(MILLISECONDS)**‹EXIT:D0HASRETURNCODE*’D0=0…GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE**‰SECTIONLEVEL04* ‰XDEF„GTDTIM ‰XREF.S‚DATE‰PAGE**…GETDATEANDTIME* GTDTIM: ˆTR0.RDTIMˆMOVE.LƒDATE,D0 ˆCMP.L„#24*60*60*1000,D1ˆBCS.S„GTDTIM3 ˆSUB.L„#24*60*60*1000,D1 ˆADD.L„#1,D0 GTDTIM3:'ˆMOVEM.L‚D0-D1,(A4)„SAVEINPARAMBLOCK ˆEXIT…SUBˆENDéééù?=/*=/*†M68XXX.GTTASKID.AF=/*-=/* Chain file to assemble M68XXX.GTTASKID.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.GTTASKID.LS=/*=/IFC \1ƒ=ARGM68XXX.GTTASKID.LS=/ENDIF=/*5=ASM M68XXX.GTTASKID.SA,M68XXX.GTTASKID.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééé éét'M68XXX GTTASKIDSAQqqGTTNAME AF  qqGTTNAME SA))?qqINIT AF22qqINIT SA;,T >qqKILLER AF••qqKILLER SAžž.qqLOGPHY AF§§qqLOGPHY SA°° ‡qqPAGEALOCAFÁÁqqPAGEALOCSAÊÊ.qqPAGEFREEAFûûqqPAGEFREESAêqqPAUSE AFqqPAUSE SA&&-qqPOWRFAILAF//qqPOWRFAILSA882qqPSTATE AFAAqqPSTATE SAJJ dqqPVSEM SA[[ïqq‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE+GTTASKIDƒIDNT‚5,1„68xxxTRAP1--GETTASKID*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*!*ƒGTTASKIDˆREV1.00„7/25/84„(MSL)*(*ƒGETTASKIDFROMNAME&SESSIONNUMBER*'*ˆENTRY:‚A4‚POINTSTO8BYTEDATATABLE*(A4)4BYTETASKNAME*Ž4(A4)4BYTESESSIONNUMBER*A6‚REQUESTOR'STCBADDRESS***ˆEXIT:'*SUCCESS(REQUESTORAREAL-TIMETASK):*˜A0=TARGETTCBADDRESS/*˜A1=SESSIONNUMBER(RESERVEDFORFUTUREUSE)*+*SUCCESS(REQUESTORNOTAREAL-TIMETASK):*˜A0=‚(A4)ORIGINALTASKNAME$*˜A1=4(A4)ORIGINALSESSIONNUMBER* *FAILURE:*•TCBD0=RTCDTASK"*(3-TARGETTASKDOESNOTEXIST)** *’01234567* USES REGISTERS D ***A**„*ŠA6=REQUESTOR'STCB*‰SECTIONLEVEL02*‰XDEF„GTTASKID‰PAGE*"*ˆCalltheTRAP#0GETTCBroutine.* GTTASKID:‰TR0.GETTCB(A4) ‰BRA.S…GTTID_01–Branchiffound.*‰EXIT†RTCDTASK–Badtargettask.  *!*ˆIf(requestor=real-timetask)*ˆthen(returntcb_address);3*ˆelse(returnoriginaltaskname&sessionnumber);* GTTID_01:9‰BTSTW…#TSKARTIM,TCBATTR(A6)‰If(caller=real-timetask)‰BEQ.S…GTTID_02 *°thendo;+‰MOVE.L„A0,TCBA0(A6)”TCBA0<==tcbaddress;.‰MOVE.L„D1,TCBA1(A6)”TCBA1<==sessionnumber;‰EXIT†SUB›end;* GTTID_02: *°elsedo;1‰MOVE.L„(A4),TCBA0(A6)’TCBA0<==taskname(orig);3‰MOVE.L„4(A4),TCBA1(A6)‘TCBA1<==session#(orig);‰EXIT†SUB›end; ‰ENDéR =/*=/*†M68XXX.GTTNAME.AF=/*,=/* Chain file to assemble M68XXX.GTTNAME.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.GTTNAME.LS=/*=/IFC \1ƒ=ARGM68XXX.GTTNAME.LS=/ENDIF=/*3=ASM M68XXX.GTTNAME.SA,M68XXX.GTTNAME.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééééé‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE*GTTNAMEƒIDNT‚5,1„68xxxTRAP1--GETTASKID*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.* *ƒGTTNAME‰REV1.00„7/25/84„(MSL)**ƒGETTASKNAMEFROMTASKID*9*ˆENTRY:‚A4‚POINTSTO8BYTEDATATABLECONTAININGTASKID*A6‚REQUESTOR'STCBADDRESS***ˆEXIT: *SUCCESS:*˜A0=TARGETTASKNAME!*˜A1=TARGETTASKSESSIONNUMBER* *FAILURE:*•TCBD0=RTCDTASK"*(3-TARGETTASKDOESNOTEXIST)** *’01234567* USES REGISTERS D*A’A6=REQUESTOR'STCB*‰SECTIONLEVEL02* ‰XDEF„GTTNAME‰PAGE*ˆOncewehavegottenhere,!*ˆthetrap#1handlerhasalready&*ˆgottenapointertothetargettask. &*ˆ(Iftheclientgaveusabadtaskid,+*ˆthenthetrap#1handlerdiscoveredthis,&*ˆandreturnedthepropererrorcode.) .*ˆTherefore,allthatisleftforustodois:*7*tcbao(client_tcb_ptr)<==tcb_name(target_tcb_ptr);:*tcba1(client_tcb_ptr)<==tcb_session(target_tcb_ptr);*exit(subroutineexit);* GTTNAME:‰MOVE.L„TCBNAME(A5),TCBA0(A6)‰MOVE.L„TCBSESSN(A5),TCBA1(A6) ‰EXIT†SUB‰ENDé é!@=/*=/*†M68XXX.INIT.AF=/*)=/* Chain file to assemble M68XXX.INIT.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68XXX.INIT.LS=/*=/IFC \1ƒ=ARGM68XXX.INIT.LS=/ENDIF=/*+=ASM M68XXX.INIT.SA,M68XXX.INIT.RO,\1;RZ=75=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.PANEL.EQ=/*ƒ9995.&.GST.EQ=/*ƒ9995.&.UST.EQ=/*ƒ9995.&.TRACE.EQ=/*ƒ9995.&.MAP.EQ=/*ƒ9995.&.IOV.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééé***ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.PANEL.EQ*ˆINCLUDEƒ9995.&.GST.EQ*ˆINCLUDEƒ9995.&.UST.EQ*ˆINCLUDEƒ9995.&.TRACE.EQ*ˆINCLUDEƒ9995.&.MAP.EQ*ˆINCLUDEƒ9995.&.IOV.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.UDR.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TCB.EQŠINCLUDE9995.&.TST.EQŠINCLUDE9995.&.PANEL.EQŠINCLUDE9995.&.GST.EQŠINCLUDE9995.&.UST.EQŠINCLUDE9995.&.TRACE.EQŠINCLUDE9995.&.MAP.EQŠINCLUDE9995.&.IOV.EQŠINCLUDE9995.&.BAB.EQŠINCLUDE9995.&.PAT.EQŠINCLUDE9995.&.UDR.EQŠINCLUDE9995.&.INTERRUP.MCŠLISTŠPAGE INIT†IDNTƒ5,1SYSTEMINITIALIZER*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆSYSTEMINITIALIZER**ˆEXECUTESWHENIPLCHUNKISIN**,*‚Revisionhistory(addnewchangestotop).*…Date†Author‰ChangesH*…________‚_____________‚_______________________________________________:*†12/7/84SJFŒAddedinitializationofLAST_MMU_INT_LEVEL.C*†12/23/83MarkLanus…Re-wrotememoryinitializationroutinetofix.*žbugin"hole"processing(andseveralmore).***‰PAGE ŠXDEFƒKILLER*ŠXREFƒCRASHSAV ŠXREFƒENDMEMT ŠXREFƒMEMTABL  ŠXREF.SADEFTYPŠXREF.SASNTBLŠXREF.SBKG_ACTIVEŠXREF.SBKG_HEADŠXREF.SBKG_TAIL ŠXREF.SCCBHDŠXREF.SCURR_ASNŠXREF.SENDSYSPŠXREF.SEXCSTACKŠXREF.SGSTBEGŠXREF.SIOVCTBGN ŠXREF.SLAMŠXREF.SLAST_MMU_INT_LEVELŠXREF.SMACSTRCŠXREF.SMAPBEGŠXREF.SMIDNIGHT ŠXREF.SNSEŠXREF.SNOTLAM ŠXREF.SPANELŠXREF.SPATBEGŠXREF.SREADYHDŠXREF.SSDEFTYPŠXREF.SSEMENDŠXREF.SSEMLIST ŠXREF.STCBHDŠXREF.STDEFTYP ŠXREF.STIATŠXREF.STIME_LEFTŠXREF.STRACEBEGŠXREF.STRACFLAGŠXREF.SUDEFTYPŠXREF.SUDRBEGŠXREF.SUSTBEGŠXREF.SVCTUBGNŠPAGE* *„REFERENCESTOINITDATASEGMENT* ŠSECTION8 ŠXREFƒASNŠXREFƒDISPATCH ŠXREFƒEEND ŠXREFƒESTACK ŠXREFƒESTART ŠXREFƒGSTSIZ ŠXREFƒIOVSIZ,3g<MD<LGT6\6d/l=t>|@„*Œ0”=œQ¤#¬U´Y¼)ÄIÌSÔVÜ/ä<ìNôAüPT 6P2 ŠXREFƒMEMTYPA ŠXREFƒMEMTYPS ŠXREFƒMEMTYPT ŠXREFƒMEMTYPUŠXREFƒPAGESIZE ŠXREFƒPANELA ŠXREFƒPATSIZ ŠXREFƒRDYHEAD ŠXREFƒSMEMHI ŠXREFƒSMEMLO ŠXREFƒTCBHEAD ŠXREFƒTRCFLAG ŠXREFƒTRCSIZ ŠXREFƒUDRSIZ ŠXREFƒUSTSIZŠXREFƒWHERLOAD**(*ˆEXPECTTHEFIRST16BYTESTODISAPPEAR*(START…MOVE.L#$400,A7‹LOADSTACKPOINTER.ŠMOVE.LD0,$3FCŒBESUREMEMORYCANBEACCESSED*$*ˆCLEARMEMORYTHROUGHENDOFSYSPAR*2ŠLEA„CRASHSAV,A0ˆSTARTWHEREUSEABLEMEMORYSTARTS(ŠMOVE.L#ENDSYSP,D6ˆENDATENDOFSYSPAR$ŠSUB.L‚A0,D6ŽCOUNTOFBYTESTOCLEAR#ŠADD.L‚#255,D6ŒCLEARTOENDOFPAGEŠCLR.B‚D6‘EVENPAGEBOUNDRYŠBSR„TBLCLRBŒCLEARMEMORY*'ŠMOVE.LESTACK(PC),A7†LOADSYSTEMSTACK/ŠMOVE.LA7,EXCSTACKˆSAVESTACKPOINTERFOREXEC$ŠMOVE.L$24,MACSTRCˆSETMACSTRACNOW*,*‡FINDOUTIFPANELEXISTS-PUT'BF'INLED*)ŠMOVE.LPANELA(PC),A1†PANELADDRESSTOA1!ŠMOVE.LA1,PANEL‹SAVEITFOREXEC ŠBEQ.S‚PANELBEŒGOONIFNOPANEL(ŠLEA„PANELBE(PC),A0…GOHEREONBUSERROR"ŠMOVE.LA0,$8ŽSETBUSERRORVECTOR+ŠMOVE.W#$80,FPLEDST(A1)ƒTESTFORBUSERROR ŠMOVE.W#$BF,D1ŒWANT'BF'INLEDŠBSR„PANELEDD‹GOLIGHTITUP ŠBRA.S‚MOVE2LOŒGOTOMOVEMEMORY*1PANELBEƒMOVE.L#CRASHSAV,PANEL„SETPANELTODUMMY'ŠMOVE.LEXCSTACK,A7ˆRESETSTACKPOINTERŠPAGE*/*†MOVEALLOFOSTOLOWERMEMORYIFAPPROPRIATE*3MOVE2LOƒMOVE.LWHERLOAD(PC),D1„WHEREAREWELOADED?ŠBEQ.S‚VECTINIT‹BRANCHIFAT0'ŠMOVE.LESTART(PC),A3†'MOVETO'ADDRESS!ŠMOVE.LD1,A2Ž'MOVEFROM'ADDRESS'ŠLEA„ENDMEMT(PC),A4…ENDOFMEMORYTABLE#ŠADD.L‚#$800,A4‹EXTRAFORMINI-TCBS&ŠLEA„VECTINIT(PC),A0„WHERETOGOLATER%ŠSUB.L‚A2,A0ŽSUBTRACTSTARTOF'FROM'ŠADD.L‚A3,A0ŽADDSTARTOF'TO'(ŠLEA„MOVDONE(PC),A1…GOHEREONBUSERRORŠMOVE.LA1,$8ŽBUSERRORVECTOR*#MOVEALLƒMOVE.L(A2)+,(A3)+ˆMOVEALLŠCMP.L‚A2,A4ŽFINISHED?ŠBGT„MOVEALLŒBRANCHIFNO ŠADD.L‚#6,A7*'MOVDONEƒJMP„(A0)CONTINUEINOTHERCOPYŠPAGE**ˆSETUPVECTORS*;VECTINIT‚MOVE.LESTART(PC),A2†STARTSEARCHATSTARTOFEXEC&ŠMOVE.L#'!VCT',D0‰D0=!VCTFORCOMPARE&ŠLEA„$200(A2),A0ˆENDOFSEARCHADDRESS-VECTSRCH‚CMP.L‚(A2)+,D0‹ISTHISVECTORTABLE?ŠBEQ.S‚VECTSETŒBRANCHIFFOUND%ŠSUB.L‚#2,A2ŽWANTTOCHECKEVERYWORD$ŠCMP.L‚A0,A2ŽSHOULDSEARCHCONTINUE?ŠBNE„VECTSRCH‹BRANCHIFYES#ŠBSR„KILLERNOVECTORTABLE--QUIT*&VECTSETƒLEA„0,A3ADDRESSOFVECTOR#0*ŠMOVE.L(A2)+,A4‹ADDRESSOFCOMINTROUTINE;ŠMOVE.LA4,VCTUBGN‰SAVECOMINTADDRESSFORVECTORUSETABLEŠCLR.L‚D6‘SET1STVECTOR#ŠCLR.L‚D5‘CLEARFORSHORTLOAD+ŠMOVE.LD5,A5ŽINITIALIZEVECTORSETADDRESS+ŠTST.B‚(A2)SHOULDVECTOR0BEINITIALIZED?ŠBEQ.S‚VECTENTŒBRANCHIFYESŠMOVE.W#2,D6Ž1STVECTORTOSETŠLEA„8,A3ADDRESSOFVECTOR#2*,VECTENTƒMOVE.L(A2)+,D0‹GETNEXTTABLEENTRY,ŠBNE.S‚VECTENT2‹BRANCHIFNOTENDOFENTRIES+ŠMOVE.W#300,D5ŒUSEHI#FORVECTORCOMPARE ŠBRA.S‚VECTCMPŒBRANCHTOCOMPARE-VECTENT2‚ROL.L‚#8,D0ŽPUTVECTOR#INBITS0-7ŠMOVE.BD0,D5ŽSAVEVECTOR#ŠLSR.L‚#8,D0ŽRESTOREADDRESS+ŠCMP.L‚#1,D0ŽSHOULDTHISVECTOR BESKIPPED?ŠBNE.S‚VECTCMPŒBRANCHIFNOŠNEG.L‚D0‘NEGATIVE=SKIPFLAG*&VECTCMPƒCMP.W‚D6,D5ŽCOMPAREVECTOR#'S$ŠBMI„VECTENTŒBRANCHTOGETNEWENTRY*ŠBNE.S‚VECTSTOR‹BRANCHIFNOTATENTRYYET ŠMOVE.LD0,A5ŽNEWVECTORADDRESS*"VECTSTOR‚MOVE.LA5,D1ŽTESTADDRESS+ŠBMI.S‚VECTINC2‹IFNEG-SKIPVECTORCHANGE$ŠBNE.S‚VECTINC1‹BRANCHIFADDRESSOK+ŠMOVE.LA4,(A3)+‹USECOMINTROUTINEADDRESS%ŠBRA.S‚VECTINC3‹BRANCHTOINCRVECTOR*0VECTINC1‚MOVE.LA5,(A3)+‹STOREADDRESSINVECTOR%ŠADD.L‚#2,A5ŽINCREMENTVECTORADDRESSŠBRA.S‚VECTINC3*6VECTINC2‚LEA„4(A3),A3‹DONOTSETVECTOR-INCRADDRESS'VECTINC3‚ADD.L‚#1,D6ŽINCREMENTVECTOR#ŠCMP.L‚#$400,A3‹ENDOFVECTORS?ŠBNE„VECTCMPŒBRANCHIFNO*/*‡SETBUSERROR--INCASEERROROCCURSININIT*)ŠPEA„KILLER(PC)‰PUTERRORRETURNONSTACK)ŠMOVE.W#'BE',-(A7)ˆBUSERRORRETURNFLAGŠPAGE*J*‚InitializeSYSPARparametersforbackgroundandCALL_GUARDEDprocessing.*>ŠMOVE.L#0,BKG_HEADˆInitializebackgroundqueuetoempty:‚headDŠMOVE.L#BKG_HEAD,BKG_TAILptris0andtailptrpointstoheadptr.8ŠSF…BKG_ACTIVE‰InitializeACTIVEflagtofalsesincethe*§backgroundisn'trunning. *5*‚InitializeLAST_MMU_INT_LEVELtointerruptlevel0.*+ŠCLR„LAST_MMU_INT_LEVELSetthelevelto0.  *+*‡STARTPROCESSINGMEMORYPARTITIONENTRIES* ŠBSR„IMEM ŠPAGE**†SETDEFAULTMEMORYTYPES*1ŠMOVE.BMEMTYPA(PC),ADEFTYPDEFAULTTYPEFORASQS1ŠMOVE.BMEMTYPT(PC),TDEFTYPDEFAULTTYPEFORTCBS9ŠMOVE.WMEMTYPS(PC),SDEFTYPDEFAULTTYPEFORSYSTEMTASKS7ŠMOVE.WMEMTYPU(PC),UDEFTYPDEFAULTTYPEFORUSERTASKS**ˆPUTTASKSONLISTS*,ŠMOVE.LTCBHEAD(PC),TCBHD‚POINTTOFIRSTTCB0ŠMOVE.LRDYHEAD(PC),READYHDPOINTTOFIRSTREADY * *ˆSEMAPHORES*,SEMS†LEA„SEMLIST,A1‰STARTOFEXECSEMAPHORES+INITSEMƒMOVE.W#1,(A1)ŒSETCOUNTFIELDTO1 ŠCLR.L‚2(A1)ŽCLEARADDRESSFIELD(ŠADD.L‚#6,A1ŽINCREMENTTONEXTSEMAPHORE$ŠCMP.L‚#SEMEND,A1‰ENDOFSEMAPHORES? ŠBLT.S‚INITSEMŒBRANCHBACKIFNO**ˆINITIALIZEMMU* ŠXREFƒINITMMU3ŠBSR„INITMMUŒINVOKECONFIGURATION-DEPENDENTROUTINE**‰ADDRESSSPACEPARAMETERS*$ŠMOVE.LPAGESIZE(PC),D0„GETPAGESIZE:ŠIF…THEN.S‰IfthepagesizespecifiedbytheSysgenis%MOVE.L#256,D0Œzero,defaultto256.ŠENDIƒ* ŠSUB.L‚#1,D0ŽNOTLAM=PAGESIZE-1$ŠMOVE.LD0,NOTLAMŠNOTLAMINTOSYSPAR-ŠMOVE.L#$FFFFFFFF,LAM…PREPARETOCOMPUTELAM$ŠSUB.L‚D0,LAMLAM=$FFFFFFFF-NOTLAM*ŠCLR.L‚ASNTBLSETFORNOASNTBLŠMOVE.LASN,D2ASNTBLDESIRED?ŠBEQ.S‚ASN99ŽBRANCHIFNO.ŠMOVE.L#2,A0Ž512BYTESFOR127ADDRESSSPACES(ŠMOVE.L#T0PAGAL,D0ˆPAGEALOCDIRECTIVE#ŠTRAPƒ#0‘EXECCALL"ŠBRA.S‚ASN10ŽBRANCHIFGOODRETURN!ŠBSR„KILLERCRASHIFERRORRETURN4ASN10…MOVE.LA0,ASNTBLŠSAVEASNTBLADDRESSINSYSPAR/ŠBSR„TBLCLRCLEARADDRESSSPACETABLETOZEROESŠMOVE.L#'!ASN',(A0)‡EYECATCHERASN996ŠMOVE.B#$FF,CURR_ASN†RESETCURR_ASNMEMORYCOMPONENT.**ˆBUILDGLOBALSEGMENTTABLE*ABLDGST„CLR.L‚GSTBEG‹SETSYSPARADDRESSTO0INCASENOGSTNEEDEDŠMOVE.LGSTSIZ(PC),D2†NEEDGST?ŠBEQ.S‚BLDUSTBRANCHIFNO)ŠMOVE.LD2,A0ŽPUTSIZEINA0FORPAGEALOC(ŠMOVE.L#T0PAGAL,D0ˆPAGEALOC‚DIRECTIVE#ŠTRAPƒ#0‘EXECCALL%ŠBRA.S‚BLDGST01‹BRANCHIFGOODRETURN!ŠBSR„KILLERCRASHIFERRORRETURN3BLDGST01‚MOVE.LA0,GSTBEGŠSAVEGSTADDRESSFOREXECŠBSR„TBLCLRCLEARGSTTOZEROESŠMOVE.L#'!GST',(A0)‡EYECATCHER-ŠMOVE.W#1,GSTNSEG(A0)…NUMBEROFGSTSEGMENTS)ŠMOVE.WD2,GSTNPAGE(A0)„GSTLENGTHTOGSTŠLSL.L‚#8,D2ŽLENGTHINBYTES2ŠSUB.L‚#GSTENTRY,D2‡SUBTRACTLENGTHOFHEADERINFO&ŠDIVUƒ#GSTEL,D2ŠDIVIDEBYENTRYLENGTH-ŠMOVE.WD2,GSTMENT(A0)…SAVEMAXIMUM#ENTRIES)ŠLEA„GSTENTRY(A0),A2„ADDRESSOF1STENTRY%ŠMOVE.LA2,GSTFENT(A0)…SAVEINHEADER**ˆBUILDUSERSEMAPHORETABLE*9BLDUST„CLR.L‚USTBEGCLEARUSTADDRESSINCASENONENEEDEDŠMOVE.LUSTSIZ(PC),D2†NEEDUST?ŠBEQ.S‚BLDVTUBRANCHIFNO(ŠMOVE.LD2,A0ŽPUTSIZEINA0FORPAGALOC,ŠMOVE.L#T0PAGAL,D0ˆDIRECTIVE#FORPAGE ALOCŠTRAPƒ#0‘EXECCALL%ŠBRA.S‚BLDUST01‹BRANCHIFGOODRETURNŠBSR„KILLERCRASHIFNOMEMORY3BLDUST01‚MOVE.LA0,USTBEGŠSAVEUSTADDRESSFOREXECŠBSR„TBLCLRCLEARUSTTOZEROES*ŠMOVE.L#'!UST',UST(A0)„EYECATCHERTOUST)ŠMOVE.W#1,USTNSEG(A0)…ONLY1USTSEGMENT(ŠMOVE.WD2,USTNPAGE(A0)„#PAGESINTABLE#ŠLSL.L‚#8,D2ŽCONVERTPAGESTOBYTES(ŠSUB.L‚#USTENTRY,D2‡SUBRTACTHEADERSIZE&ŠDIVUƒ#USTEL,D2ŠDIVIDEBYENTRYLENGTH-ŠMOVE.WD2,USTMENT(A0)…SAVEMAXIMUM#ENTRIES(ŠLEA„USTENTRY(A0),A2„FIRSTENTRYADDRESS(ŠMOVE.LA2,USTFENT(A0)…SAVEITINHEADER**ˆBUILDVECTORUSETABLE*+BLDVTU„MOVE.L#1,A0ŽSIZEISALWAYSONEPAGE,ŠMOVE.L#T0PAGAL,D0ˆDIRECTIVE#FORPAGEALOCŠTRAPƒ#0‘EXECCALL%ŠBRA.S‚BLDVTU01‹BRANCHIFGOODRETURN$ŠBSR„KILLERCRASHIFNOMEMORYFOUNDTHEN.SŒBRANCHIFNO#MOVE.L#1,D2‹PATminimumsizeis1ŠENDI)ŠMOVE.LD2,A0ŽPUTSIZEINA0FORPAGEALOC(ŠMOVE.L#T0PAGAL,D0ˆPAGEALOC‚DIRECTIVE#ŠTRAPƒ#0‘EXECCALL%ŠBRA.S‚BLDPAT01‹BRANCHIFGOODRETURN!ŠBSR„KILLERCRASHIFERRORRETURN3BLDPAT01‚MOVE.LA0,PATBEGŠSAVEPATADDRESSFOREXECŠBSR„TBLCLRCLEARPATTOZEROESŠMOVE.L#'!PAT',(A0)‡EYECATCHER#ŠLSL.W‚#8,D2ŽCONVERTPAGESTOBYTES&ŠMOVE.LD2,PATTSIZ(A0)…SAVETABLESIZEŠLEA„0(A0,D2),A2ˆTOPOFTABLE)ŠLEA„PATENTRY(A0),A1„ADDRESSOF1STENTRYŠLEA„PATFHDR-PATNEXT(A0),A4:BLDPAT04‚MOVE.LA1,PATNEXT(A4)…SAVEENTRYADDRESSINCHAIN)ŠMOVE.L#-1,PATTCB(A1)…FLAGENTRYASFREE(ŠMOVE.LA1,A4ŽSAVECURRENTENTRYADDRESS%ŠLEA„PATEL(A1),A1‡POSSIBLENEXTENTRY#ŠLEA„PATEL(A1),A3‡POINTBEYONDNEXTŠCMP.L‚A3,A2ŽWILLITFIT?#ŠBCC„BLDPAT04‹YES,GOINITIALIZEIT E*InserttwodummyentriesintothePATlist.‚TheseentrieswillhaveG*ƒthemaximumpossibledeltaandwillcauseandexecproceduretofire.F*ƒThecodefortheexecprocedureiscontainedintheRMS.SAmoduleofE*ƒRMS68K.‚ThesenodesareplacedonthePATsothatthePATlistwillE*ƒneverbeempty,simplifyingPATprocessinginmanyplaces.‚WhentheG*ƒPATnodefires,theassociatedcodeintheRMS.SAmodulegetscontrolG*ƒandthiscodesimplyplacesadummyPATnode(liketheonethatfiredE*ƒtogetushere)attheveryendofthePATlist.‚ThisschedulingofI*ƒthedummyPATnodeisaspecialcaseinthatitdoesnotusethenormal/*ƒPATnodescheduleroutinePAT_SCHED_NEW_NODE. #'DUMY'DO.S LEA‚2(A3),A3ŠENDW ŠLEA„4(A3),A3$*£A3nowcontainstheaddressofthe"*£execcodetoreschedulethenode"ŠBSR.S‚BLDPAT12‹Buildadummynode;ŠMOVE.LA4,PATHDR(A0)†LinkthedummynodeintothePATlist4ŠMOVE.LA4,A2ŽSaveaddrofthisnodeforfuturelink1ŠBSR.S‚BLDPAT12‹Buildanidentical2nddummynode/ŠMOVE.LA4,PATNEXT(A2)…Link2ndnodebehind1stŠMOVE.L#PATBIGDELTA,NSE>ŠMOVE.L#PATBIGDELTA,TIME_LEFTMakeTIME_LEFTasbigaswecanŠCLR.L‚MIDNIGHT.ŠBRA.S‚BLDUDRDonewithPATstuffalltogether*$* Subroutine to build dummy PAT node:BLDPAT12‚MOVE.LPATFHDR(A0),A4…A4pointstofreePATentry@ŠMOVE.LPATNEXT(A4),PATFHDR(A0)Unlinkthisentryfromfreelist*£InitializePATentriesŠCLR.L‚PATNEXT(A4)$ŠCLR.L‚PATTCB(A4)‰Indicateexecnode5ŠMOVE.L#PATBIGDELTA,PATDELTA(A4)MakedeltaverybigŠCLR.L‚PATINTV(A4)'ŠMOVE.LA3,PATASR(A4)†Executionaddress(ŠCLR.W‚PATOPT(A4)‰Options-notperiodic4ŠMOVE.L#PATDUMMYID,PATARID(A4)PluginthedummyID4ŠMOVE.W#$FFFF-$0700,PATILVL(A4)Interruptlevel=0ŠRTS *$*ˆBUILDUSERDEFINEDDIRECTIVETABLE*9BLDUDR„CLR.L‚UDRBEGCLEARUDRADDRESSINCASENONENEEDEDŠMOVE.LUDRSIZ(PC),D2†NEEDUDR?ŠBEQ.S‚BLDTRACŒBRANCHIFNO(ŠMOVE.LD2,A0ŽPUTSIZEINA0FORPAGALOC,ŠMOVE.L#T0PAGAL,D0ˆDIRECTIVE#FORPAGEALOCŠTRAPƒ#0‘EXECCALL%ŠBRA.S‚BLDUDR01‹BRANCHIFGOODRETURNŠBSR„KILLERCRASHIFNOMEMORY3BLDUDR01‚MOVE.LA0,UDRBEGŠSAVEUSTADDRESSFOREXECŠBSR„TBLCLRCLEARUSTTOZEROES*ŠMOVE.L#'!UDR',UDR(A0)„EYECATCHERTOUDR#ŠLSL.L‚#8,D2ŽCONVERTPAGESTOBYTES(ŠSUB.L‚#UDRENTRY,D2‡SUBRTACTHEADERSIZE(ŠDIVUƒ#UDRESIZ,D2ˆDIVIDEBYENTRYLENGTH,ŠMOVE.WD2,UDRCNT(A0)†SAVEMAXIMUM#ENTRIES**ˆBUILD‚TRACETABLE*DBLDTRACƒCLR.L‚TRACEBEG‰CLEARSYSPARADDRESSINCASETRACENOTNEEDED'ŠMOVE.LTRCSIZ(PC),D2†NEEDTRACETABLE?ŠBEQ.S‚BLDTIATŒBRANCHIFNO)ŠMOVE.LD2,A0ŽPUTSIZEINA0FORPAGEALOC(ŠMOVE.L#T0PAGAL,D0ˆPAGEALOCDIRECTIVE#ŠTRAPƒ#0‘EXECCALL%ŠBRA.S‚BLDTRC01‹BRANCHIFGOODRETURNŠBSR„KILLERCRASHIFNOMEMORY1BLDTRC01‚MOVE.LA0,TRACEBEGˆSAVEADDRESSFOREXEC'ŠBSR„TBLCLRCLEARTRACETABLETOZEROES+ŠLEA„TRCENTRS(A0),A2„ADDRESSOFFIRSTENTRYŠMOVE.LA2,(A0)ŒSAVEINHEADER#ŠLSL.L‚#8,D2ŽCONVERTBYTESTOPAGES(ŠSUB.L‚#TRCENTRS,D2‡SUBTRACTHEADERSIZE'ŠDIVUƒ#TRCENTSZ,D2‡DIVIDEBYENTRYSIZE)ŠMULUƒ#TRCENTSZ,D2‡MULTIPLYBYENTRYSIZE$ŠADD.L‚A2,D2ŽADDENTRYSTARTADDRESS4ŠMOVE.LD2,TRCLNG(A0)†SAVEENDADDRESSOFLASTENTRY*,ŠMOVE.WTRCFLAG(PC),TRACFLAGSETTRACEFLAGS*#*ˆTRAPINSTRUCTIONASSIGNMENTTABLE*>BLDTIATƒMOVE.L#$01010000,TIAT„SETTRAP0AND1'USEDBYEXEC'ŠPAGE*0*…INITIALIZECONFIGURATION-DEPENDENTI/ODEVICES* ŠXREFƒINITIO)ŠBSR„INITIOSUBROUTINEWILLINITIALIZEIO*1*ˆCREATETASKCONTROLBLOCKSFORROMBASEDSYSTEM**LOOKTCBƒTST.L‚TCBHDŽDOTCBSALREADYEXIST?%ŠBNE„BLDTCB99‹BRANCHIFYES-NOTROM'ŠCLR.L‚READYHDŒBESUREREADYHDISCLEAR4ŠLEA„ENDMEMT(PC),A3…STARTSEARCHATENDOFMEMTABLEŠLEA„$200(A3),A1ˆENDOFSEARCH,ŠMOVE.L#'!TCB',D0‰INITIALIZED0FORCOMPARE'LOOKT2„CMP.L‚(A3),D0ŒLOOKFORMINITCBSŠBEQ.S‚BLDTCBSŒBRANCHIFFOUND!ŠADD.L‚#2,A3ŽCHECKALLEVENBYTESŠCMP.L‚A3,A1ŽENDOFSEARCH?ŠBNE„LOOKT2LOOPBACKŠBSR„KILLERQUITIFNOTCBS*)BLDTCBSƒLEA„4(A3),A3‹STARTOFTABLEENTRY!ŠMOVE.B18(A3),D4ŠTASKPRIORITIESŠLSL.W‚#8,D4ŽUSEPRIORITYTWICE)ŠMOVE.B18(A3),D4ŠFORBOTHCURRANDLIMIT ŠSWAPƒD4‘PRIORITIESTOUPPER1/2!ŠMOVE.W22(A3),D4ŠTASKATTRIBUTESŠMOVE.L24(A3),D5ŠENTRYADDRESS ŠCLR.L‚D6ŠMOVE.W16(A3),D6ŠUSERNUMBER,ŠMOVE.W#$8000,D7ŠOPTIONS-MONITORSUPPLIED1ŠMOVE.L#T0CRTCB,D0ˆDIRECTIVENUMBER-CREATETCBŠTRAPƒ#0‘EXECDIRECTIVE$ŠBRA.S‚BLDTCB2ŒBRANCHIFGOODRETURN&ŠBSR.S‚KILLERQUITIFREQUESTREJECTED*#BLDTCB2ƒMOVE.W20(A3),D2ŠSTATEWORD#ŠMOVE.WD2,TCBSTATE(A5)„SAVEINTCB!ŠBTSTƒ#TSK2NRDY,D2‡ONREADYLIST?ŠBEQ.S‚BLDTCB3ŒBRANCHIFNO3ŠMOVE.LREADYHD,TCBREADY(A5)LINKTOPREVIOUSENTRY ŠMOVE.LA5,READYHD‰ADDNEWENTRY* *ˆPUTTSTINFOINTOTCB*+BLDTCB3ƒLEA„28(A3),A2ŠSTARTOFTSTMMUINFO)ŠMOVE.L#SEGMENTS-1,D0…MAX#SEGMENTS-1ŠCLR.L‚D1‘CLEARFORCOUNT%BLDTCB4ƒTST.W‚6(A2)ŽTESTSEGMENTTYPE#ŠBEQ.S‚BLDTCB6ŒBRANCHIFNOSEGMENT$ŠADD.L‚#1,D1ŽCOUNTSEGMENTSEXISTING.BLDTCB6ƒLEA„8(A2),A2‹INCREMENTTONEXTSEGMENT*ŠDBRAƒD0,BLDTCB4‰DECREMENTANDBRANCHBACK*$ŠLEA„28(A3),A3ŠSTARTOFTSTMMUINFO(ŠMOVE.LTCBTST(A5),A4†ADDRESSOFNEWTST.ŠMOVE.BD1,TSTCSEGS(A4)„SAVEACTUAL#SEGMENTS,ŠLEA„TSTMMU(A4),A4†ADDRESSOFMMUWITHINTST-ŠMOVE.L#4*SEGMENTS-1,D0ƒ#LONGWORDSTOMOVE2BLDTCB8ƒMOVE.L(A3)+,(A4)+ˆMOVEMMUANDATTRIBUTES(ŠDBRAƒD0,BLDTCB8‰CONTINUETILLALLMOVEDŠCMP.L‚#'!TCB',(A3)‡MORETCB'S?ŠBEQ„BLDTCBSŒBRANCHIFYESBLDTCB99* *ˆSTARTTIMER* ŠXREFƒTIMERST3ŠBSR„TIMERSTŒINVOKECONFIGURATION-DEPENDENTROUTINE*(*ˆINDICATESYSTEMRUNNINGONFRONTPANEL*-FPGO†MOVE.LEXCSTACK,A7ˆRESTORESTACKPOINTER)ŠMOVE.W#$C0,D1ŒWANT'C0'INPANELLIGHTS4ŠBSR.S‚PANELEDE‹SETLIGHTS-ENABLEREADY/FAILLIGHT**‰GOTOEXEC-INITCOMPLETE*:INITENDƒMOVE.LDISPATCH(PC),-(A7)ADDRESSOFSTARTOFEXECŠRTS—GOTOEXEC*%*ƒKILLERROUTINE--ERRORDURINGINIT*KILLER„PEA„(A6)SAVEREGISTER6 ŠLEA„CRASHSAV,A6ˆCRASHSAVEAREA'ŠMOVE.L4(A7),(A6)‰SAVEPROGRAMCOUNTER%ŠMOVE.WSR,4(A6)‹SAVESTATUSREGISTER0ŠDISABLE_INTERRUPTSˆBESUREINTERRUPTSINHIBITED ŠLEA„8(A6),A6‹REGISTERSAVEAREA-ŠMOVEM.LD0-D7/A0-A5,(A6)‚SAVEMOSTREGISTERS$ŠMOVE.L(A7)+,56(A6)‡SAVEREGISTER6$ŠMOVE.LA7,60(A6)ŠSAVESTACKPOINTER'KILLOOPƒMOVE.W#$A2,D1ŒWANT'A2'INLED/ŠBSR.S‚PANELEDE‹PUTITTHERE-ALLOWFAILLIGHT4ŠBRA„KILLOOPŒLOOP-WAITFORSOMEONETODOSOMETHINGŠPAGE* *ˆTABLECLEAR*'TBLCLR„MOVE.LD2,D6ŽGETLENGTHINPAGESŠLSL.L‚#8,D6ŽLENGTHINBYTES!TBLCLRBƒMOVE.LD6,A6ŽLENGTHINA6ŠADD.L‚A0,A6ŽEND+1INA6$ŠCLR.L‚D6‘THEZEROTHATGET'SSTORED&TBLCLRLƒMOVE.LD6,-(A6)‹STOREONEWORDŠCMP.L‚A0,A6ŽDONE?&ŠBGT.S‚TBLCLRLŒBRANCHBACKIFNOTDONEŠRTS—GOBACKWHENDONE*#*ƒPANELEDE--ENABLE‚TTO--SETLED$*ƒPANELEDD--DISABLETTO--SETLED*-PANELEDE‚MOVE.W#$10,D0ŒCLEARDISABLETTOBIT&ŠBRA.S‚PANELD2ŒSKIPAROUNDOTHERENTRY+PANELEDD‚MOVE.W#$90,D0ŒSETƒDISABLETTOBIT*PANELD2ƒNOT.B‚D1‘USECOMPLEMENTTOSETLEDŠROR.L‚#4,D1ŽSEPARATEDIGITSŠOR.BƒD1,D0ŽPUTMSDIND0ŠMOVE.W#$02,D1Œ'SETLSD'FLAGŠROL.L‚#4,D1ŽLSDIND1!ŠMOVE.LPANEL,A1‹ADDRESSOFPANEL'ŠLEA„FPLEDST(A1),A1…LEDSTATUSREGISTER+ŠMOVE.WD1,(A1)ŒSETLEASTSIGNIFICANTDIGITŠOR.Wƒ#$30,D1ŒSETLATCHBITSŠMOVE.WD1,(A1)ŒLATCHIT*ŠMOVE.WD0,(A1)ŒSETMOSTSIGNIFICANTDIGITŠOR.Wƒ#$30,D0ŒSETLATCHBITSŠMOVE.WD0,(A1)ŒLATCHITŠRTS +ŠTTL„INITMEMORYPARTITIONS-DOCUMENTATIONŠPAGEN*********************************************************************************.***‚Name:‚IMEM(initialize_memory_partitions).*** ***‚Function:A***ŠChecksallmemorylocationsdescribedintheSYSGENedMEMTBL.F***…Mapsoutany"holes"inmemory.‚SetsupFML(freememorylist)andC***…FML_HEADER(freememorylistheader)ineachpartition.‚SetsupE***…MEMTBL(memorymappingtable)immediatelyaftertheFML_HEADERin***…partitionzero.*** ***‚Inputs:H***…1.)‚Src_memtbl(createdbySYSGEN)locatedataddressMEMTABLwithin***ŠINITDATdataarea.*** ***‚Outputs:I***…1.)‚Dest_memtbllocatedimmediatelyaftertheFML_HEADERinpartition ***Šzero.G***…2.)‚MAPBEGlongwordinSYSPARdataarea.‚Pointstothedest_memtbl.***Š(Item#1above.)E***…3.)‚FML_HEADERsforallRAMmemorypartitions.‚(Pointedtobythe***Šdest_memtbl.)@***…4.)‚FMLsforallRAMmemorypartitions.‚(Pointedtobytheir***ŠFML_HEADERs.)******‚Sideeffects:C***…1.)‚Allregistersdestroyed,exceptforthestackpointer(A7).)***…2.)‚Mightneverreturn(callKILLER).***H***‚Explanation:‚ThisroutineisbasicallyadriverforinitializingtheB***…memorypartitions.‚Itisprimarilyconcernedwithinitializing I***…partitionzero.‚Thelastsubroutinecall(callinit_next_partitions),H***…handlestheinitializationofallmemorypartitionsexceptpartitionI***…zero.‚ThisuniquehandlingofpartitionzeroisneccessaryduetotheI***…factthattheINITmoduleresidesinaportionofpartitionzerothatD***…willlaterbeusedbythesystem.‚Weobviouslycannotclearthis ***…memory.***D***ŠThefirstcallsetsuptheneccessarypointerstothesrc_memtblF***…andtopartitionzero.‚ThenextcallwillbuildtheFML(clearanyE***…memorynotintheINITmodule,mapoutany"holes"inmemory,andA***…setuptheFMLlinkedlistdescribingtheavailablememoryinG***…partitionzero).‚Ifthefirst_node_ptrisreturnedaszero,thenweF***…didnotfindevenone256byteblockofavailablememory.‚SinceweE***…needatleastoneblockinpartitionzerofortheMEMTBL,thisis3***…obviouslyafatalerror,andsowecallKILLER.***F***ŠNextwecallbuild_fml_headertobuildtheFML_HEADERinpartitionE***…zero.‚Ifthefml_header_ptrisreturnedaszero,thenwecouldn'tC***…findenoughmemoryinpartitionzerofortheFML_HEADERandtheG***…dest_memtbl,sowecannotcontinue,andthereforemustcallKILLER.***@***ŠOtherwise,wesetourdest_memtbl_ptrtopointtothememory@***…immediatelyaftertheFML_HEADERforpartitionzero,andsetF***…theMAPBEGvariableinSYSPARequaltothisvalue.‚FinallywecallF***…build_ram_memtbl_entrytorecordthisrampartitionintheMEMTBL,D***…andcallinit_next_partitionstoinitializeallpartitionsafter***…partitionzero.***L****************************************************************************2ŠTTL„INITMEMORYPARTITIONS-REGISTERASSIGNMENTSŠPAGEL**********************************************************************************…A0=src_memtbl_ptr;7***ŠPointstothe"source"MEMTBLinINITDATdataarea.******…A1=dest_memtbl_ptr;<***ŠPointstothe"destination"MEMTBLimmediatelyafterthe!***ŠFML_HEADERinpartitionzero.***+***…A2=temp_memtbl_ptr/previous_node_ptr;?***ŠSharedregister.‚Duringcheck_memmap_conflictitisusedtoB***Šstepthroughthedest_memtbllookingforconflictsbetweentheB***Š"current"RAMpartition(pointedtobythesrc_memtbl_ptr)andB***Šanypreviously-definedRAMpartitions(pointedtobythetemp_***Šmemtbl_ptr.)C***ŠDuringbuild_fml(anditssubroutinebuild_fml_node)A2isused;***Štopointtothe"previous"nodeintheFMLlinkedlist.******…A3=first_node_ptr;0***ŠPointstothefirstnodeinthecurrentFML.******…A4=last_node_ptr;/***ŠPointstothelastnodeinthecurrentFML.***&***…A5=clear_mem_ptr/fml_header_ptr;@***ŠSharedregister.‚Duringbuild_fml(andbuild_fml_node)itis<***Šusedtopointtothenextmemorylocationtobecleared.<***ŠDuringalltheotherroutinesitisusedtopointtothe***ŠFML_HEADERblock.***…A6=scratch;****** ***…D0=0;B***ŠUsedforzeroingoutmemory,andcheckingifaddressregisters***Šareequaltozero.******…D1-D3=scratch;******…D4=start_of_part_ptr;:***ŠPointstothestartofthe"current"memorypartition.******…D5=end_of_part_ptr;8***ŠPointstotheendofthe"current"memorypartition.******…D6=bytes_cleared;>***ŠContainsacountofthenumberofthebytesclearedinthe?***Š"current"memorypartition.‚Whenwefinda"hole"inmemory@***Š(takeabus_error),thenwestopincrementingbytes_cleared.C***ŠThusbytes_clearedwillcontainacountofthenumberof"good"?***Šbytesinthecurrentblockofthecurrentmemorypartition.D***ŠThisvaluewillbeusedtodescribetheammountof"free"memory***Šinthecurrentblock.******…D7=fml_header_len;C***ŠContainsacountofthenumberof256byteblocksneccessarytoA***Šdescribethe"current"FML_HEADER.‚Thisvalueisusuallyone.@***ŠItwasmadeintoavariableinordertoaccommodatethecaseA***ŠwheretheFML_HEADER(26bytes)andthedest_memtbl("n"*10>***Šbytes)requi redmorethanone256byteblock.‚Thisaddeda<***Šcertainammountofcomplexitytothealgorityhms,butitA***Šremovedtheratherarbitraryrestrictionthatthedest_memtblB***Šmustbelimitedto(256-26)/10or23entries.‚(Dest_memtbl2***Šcouldonlydescribe23RAMorROMpartitions.)***L****************************************************************************'ŠTTL„INITMEMORYPARTITIONS-ALGORITHMŠPAGE#*init_memory_partitions: procedure;    *ˆcallinit_pointers;*ˆcallbuild_fml;*ˆif(first_node_ptr=0)*ˆthencallKILLER;*ˆcallbuild_fml_header;*ˆif(fml_header_ptr=0)*ˆthencallKILLER;;*ˆdest_memtbl_ptr<==fml_header_ptr+length(fml_header);&*ˆSYSPAR(MAPBEG)<==dest_memtbl_ptr;*ˆcallbuild_ram_memtbl_entry;*ˆcallinit_next_partitions;  *end init_memory_partitions;ŠPAGE"ŠTTL„INITMEMORYPARTITIONS-CODE*#*init_memory_partitions: procedure;*IMEM:**ˆcallinit_pointers;*ˆcallbuild_fml;*ˆif(first_node_ptr=0)*ˆthencallKILLER;* ŠBSR.S‚IPTRS ŠBSR„BFML ŠIF.LƒA3D0THEN.S BSR„KILLERŠENDI **ˆcallbuild_fml_header;*ˆif(fml_header_ptr=0)*ˆthencallKILLER;;*ˆdest_memtbl_ptr<==fml_header_ptr+length(fml_header);&*ˆSYSPAR(MAPBEG)<==dest_memtbl_ptr;* ŠBSR„BFMLHEAD ŠIF.LƒA5D0THEN.S BSR„KILLERŠENDI ŠLEA„FMLHDSZ(A5),A1 ŠMOVE.LA1,MAPBEG **ˆcallbuild_ram_memtbl_entry;*ˆcallinit_next_partitions;* ŠBSR„BRAMNODE ŠBSR.S‚INEXTMEM **end init_memory_partitions;*ŠRTS "ŠTTL„INITPOINTERS-DOCUMENTATIONŠPAGEN********************************************************************************* ***…Name:‚IPTRS(init_pointers):*** ***…Function:A***ŠInitializesallpointersandcountersforinitializingmemory***„partitionzero.*** ***…Inputs:1***ˆ1.)‚Src_memtblinINITDATataddressMEMTABL.*** ***…Outputs:***ˆ1.)‚A0=src_memtbl_ptr;***ˆ2.)‚A5=clear_mem_ptr;***ˆ3.)‚D0=0;***ˆ4.)‚D4=start_of_part_ptr;***ˆ5.)‚D5=end_of_part_ptr;***ˆ6.)‚D6=bytes_cleared;***ˆ7.)‚D7=fml_header_len;******…Sideeffects:****ˆ1.)‚A2(temp_memtbl_ptr)isdestroyed.$***ˆ2.)‚D1(scratch)getsdestroyed.)***ˆ3.)‚Mightneverreturn(callKILLER).******…Explanation:***?***ŠFirstweinitializeD0andthesrc_memtbl_ptr.‚IfthefirstI***…entryinthesrc_memtblisnotaRAMpartitionwhosepartitionnumber<***…iszero,thenwecannotcontinue,andsowecallKILLER.***E***ŠNextweinitializefml_header_lentoequalthenumberof256byteG***…blocksneccessarytocontaintheFML_HEADERforpartitionzero,andB***…oneentryinthedest_memtblforeveryentryinthesrc_memtbl9***…(includingthelastentrydelimitingthesrc_memtbl).***D***ŠNowweinitializetheend_of_part_ptrtopointtothe"floor"ofB***…theMAPENDAfieldofthefirstentryinthesrc_memtbl.‚(Note:H***…throughoutthesealgorithmswewillalwaystakethe"ceiling"oftheH***…startofthepartition,andthe"floor"oftheendofthepartition.K***…Thisinsuresthatallpartitionsstartandendona256byteblock,andG***…alsothatweonlygrabthesameammountofmemory,orless,thatis%***…describedwithinthesrc_memtbl.)***E***ŠNow,iftheexecisinpartitionzero,thenthestart_of_part_ptrD***…pointstothenext256byteblockaftertheendoftheexec,theJ***…clear_mem_ptrpointstothenext256byteblockafterthestartoftheH***…INITmodule,andbytes_clearedgetssettothedisplacementfromtheI***…startoftheINITmoduletotheendoftheINITDATdataarea(alsoonH***…a256byteboundary).‚Theclear_mem_ptrandbytes_clearedaresetupF***…inthiswayinordertotellthebuild_fmlsubroutinethatwehaveG***…startedclearingmemoryatthelocationpointedtobyclear_mem_ptr@***…andwehavealreadyclearedbytes_clearedlocations.‚ThisisI***…neccessarybecause wewishtoreclaimthememoryoccupiedbytheINITD***…moduleasfreememoryinpartitionzero,butweobviouslycannotG***…clearitoutatthispointintime.‚Thuswemustfakeoutbuild_fmlB***…intothinkingthatwehavealreadyclearedtheINITportionofI***…partitionzero.‚Finally,ifTCBHEAD=0,(wehaveminiTCBsfollowingF***…thesrc_memtbl),thenweincrementbytes_clearedby$800toinsure)***…thatwedon'tzeroouttheminiTCBs.***D***ŠIftheexecisnotinpartitionzero,thenwesetbothstart_of_G***…part_ptrandclear_mem_ptrtopointtothenext256bytepageafter8***…theSYSPARdataarea,andsetbytes_clearedtozero.***B***ŠFinally,ifthestart_of_part_ptrandend_of_part_ptrdescribeF***…apartitionthatdoesnotcontainsomepositiveammountofmemory,=***…thenweobviouslycannotcontinue,andsowecallKILLER.***L**************************************************************************** ŠTTL„INITPOINTERS-ALGORITHMŠPAGE*init_pointers: procedure;   *ˆDO<==0;.*ˆsrc_memtbl_ptr<==addr(INITDAT(MEMTABL));0*ˆif(MAPMTYP.MAPPART(src_memtbl_ptr)<>$0000)*ˆthencallKILLER; *ˆfml_header_len<==0;%*ˆtemp_memtbl_ptr<==src_memtbl_ptr;7*ˆdountil(MAPMTYP.MAPPART(temp_memtbl_ptr)=$FFFF);%*’fml_header_len<==fml_header_len+*¥length(dest_memtbl_entry);'*’temp_memtbl_ptr<==temp_memtbl_ptr+*¦length(src_memtbl_entry); *ˆend;C*ˆfml_header_len<==(length(fml_header)+length(memtbl_entry)+,*œ(temp_memtbl_ptr-src_memtbl_ptr))/256; 7*ˆend_of_part_ptr<==floor(MAPENDA(src_memtbl_ptr));)*ˆif(execisinpartitionxero)thendo;.*’start_of_part_ptr<==ceil(INITDAT(EEND));(*’clear_mem_ptr<==ceil(addr(START));5*’bytes_cleared<==ceil(addr(INITDAT(ENDMEMT)))-*¤clear_mem_ptr;*’if(INITDAT(TCBHEAD)=0).*’thenbytes_cleared<==bytes_cleared+$800;*ˆend; *ˆelsedo;7*’start_of_part_ptr<==ceil(addr(SYSPAR(ENDSYSP)));&*’clear_mem_ptr<==start_of_part_ptr;*’bytes_cleared<==0;*ˆend; +*ˆif(start_of_part_ptr>=end_of_part_ptr)*ˆthencallKILLER;  *end init_pointers; ŠTTL„INITPOINTERS-CODEŠPAGE**init_pointers: procedure;* IPTRS:* *ˆD0<==0;.*ˆsrc_memtbl_ptr<==addr(INITDAT(MEMTABL));,*ˆif(MAPMTYP.MAPPART(src_memtbl_ptr)<>0)*ˆthencallKILLER;* ŠCLR.L‚D0 ŠLEA„MEMTABL(PC),A0 ŠIF.Wƒ(A0)‹D0THEN.S BSR„KILLERŠENDI **ˆfml_header_len<==0;%*ˆtemp_memtbl_ptr<==src_memtbl_ptr;7*ˆdountil(MAPMTYP.MAPPART(temp_memtbl_ptr)=$FFFF);%*’fml_header_len<==fml_header_len+*¥length(dest_memtbl_entry);'*’temp_memtbl_ptr<==temp_memtbl_ptr+*¦length(src_memtbl_entry);*ˆend;* ŠCLR.L‚D7 ŠLEA„(A0),A2 ŠREPEATADD.L‚#MAPENTSZ,D7LEA„12(A2),A2ŠUNTIL.W(A2)Ž#$FFFF *5*ˆfml_header_len<==ceil(length(fml_header_node)+*¡fml_header_len+$*¡length(dest_memtbl_entry))/256;7*ˆend_of_part_ptr<==floor(MAPENDA(src_memtbl_ptr));*!ŠADD.L‚#(FMLHDSZ+MAPENTSZ+255),D7 ŠLSR.L‚#8,D7 ŠMOVE.LMAPENDA(A0),D5 ŠCLR.B‚D5 *)*ˆif(execisinpartitionzerothendo);.*’start_of_part_ptr<==ceil(INITDAT(EEND));(*’clear_mem_ptr<==ceil(addr(START));5*’bytes_cleared<==ceil(addr(INITDAT(ENDMEMT)))-*¤clear_mem_ptr;*’if(INITDAT(TCBHEAD)=0).*’thenbytes_cleared<==bytes_cleared+$800;*ˆend;**ŠMOVE.LEEND(PC),D4ˆD4<==INITDAT(EEND).8ŠIF.LƒD4ˆD5THEN.S†If(exec_end„D0THEN.SADD.L‚#$800,D6ENDI * *ˆelsedo;7*’start_of_part_ptr<==ceil(addr(SYSPAR(ENDSYSP)));&*’clear_mem_ptr<==start_of_part_ptr;*’bytes_cleared<==0;*ˆend;*ELSE.SMOVE.L#ENDSYSP+255,D4  CLR.B‚D4 MOVE.LD4,A5 CLR.L‚D6ŠENDI *+*ˆif(start_of_part_ptr>=end_of_part_ptr)*ˆthencallKILLER;*ŠIF.LƒD4D5THEN.S BSR„KILLERŠENDI **end init_pointers;*ŠRTS )ŠTTL„INIT_NEXT_PARTITIONS-DOCUMENTATIONŠPAGEN*************************************************************************************…Name:‚INEXTMEM(init_next_partitions):*** ***…Function:=***ŠInitializesallpartitionsexceptpartitionzero.‚ForROMH***„partitions,wemakeanentryinthedest_memtbl.‚ForRAMpartitions,A***„weinsurethatnoconflictexistswithapreviously-describedH***„partition,buildtheFML,buildtheFML_HEADER,andmakeanentryin***„thedest_memtbl.*** ***…Inputs:***ˆ1.)‚A0=src_memtbl_ptr;2***(Pointstothefirstentryinthesrc_memtbl.)***ˆ2.)‚A1=dest_memtbl_ptr;3***(Pointstothefirstentryinthedest_memtbl.)*** ***…Outputs:***ˆ1.)‚Dest_memtbl.#***ˆ2.)‚FMLforallRAMpartitions.+***ˆ3.)‚FML_HEADERsforallRAMpartitions.******…Sideeffects:B***ˆ1.)‚Mostregistersaredestroyed,exceptforthestackpointer ***(A7).******…Explanation:D***ŠWekeeploopinguntiltheMAPMTYPandMAPPARTfieldsofthenextH***…entryinthesrc_memtblbothcontain$FF.‚(ThisindicatestheendofH***…thememtbl.)‚Whenweseetheendofthesrc_memtbl,thenwewritean.***…endentryforthedest_memtbl,andreturn.***E***ŠForeverygoodentryinthesrc_memtblwecallinit_next_pointersG***…tosetupourpointersandcountersforthismemorypartition.‚ThenE***…iftheMAPMTYPfieldofthesrc_memtblentry=$FF,wehaveaROM4***…partitionandsowecallbuild_rom_memtbl_entry.***8***ŠForeveryRAMentryinthesrc_memtbl,wefirstcallG***…check_memmap_conflicttoinsurethatthecurrentRAMpartitiondoesH***…notconflictinanywaywithapreviously-describedpartition.‚ThereG***…arethreepossiblereturnconditionsfromthecheck_memmap_conflict***…subroutine:'***Š1.)‚Afatalconflictwasdetected-;***Executionwillneverreturn(check_memmap_conflictwill***callKILLER).@***Š2.)‚Thispartitionisanaliasofapreviouspartition(both+***partitionsstartatthesameaddress)-;***Executionwillreturn,andthegot_alias_partition_flag***willbeset.+***Š3.)‚Thispartitionisanewpartition-;***Executionwillreturn,andthegot_alias_partition_flag***willbereset.H***…Therefore,ifexecutionreturns,andthegot_alias_partition_flagis@***…set,wecallbuild_ram_memmap_entrytobuildanentryinthe(***…dest_memtblforthealiaspartition.***C***ŠIfexecutionreturnsandthegot_alias_partition_flagisreset,H***…thenwecallbuild_fmltobuildthefreememorylistforthenewRAMB***…partition.‚Theniftheprevious_node_ptrisnotequaltozero,C***…build_fmlfoundatleastone256bytepageofmemoryinthenewI***…partitionandsowecallbuild_fml_headertobuildtheFML_HEADERforA***…thenewpartition.‚Now,sincethisisnotpartitionzero,andH***…thereforeallFML_HEADERsrequireonlyone256byteblockofmemory,A***…weknowthatbuild_fml_headersuccessfullyfoundroomfortheD***…FML_HEADERandsowecancallbuild_ram_memtbl_entrytobuildan7***…entryforthecurrentpartitioninthedest_memtbl.***=***ŠIftheprevious_node_ptrisequaltozero,thenbuild_fmlE***…didnotfindevenone256bytepagewithinthecurrentpartition.=***…Inthiscaseweresetthedest_memtbl_ptrtopointtotheE***…previousentrywithinthedest_memtbl(decrementitbythelengthC***…ofoneentry).‚Thishastheeffectofignoringthecurrentnull***…partition.***N****************************************************************************** %ŠTTL„INITNEXTPARTITIONS-ALGORITHMŠPAGE!*init_next_partitions: procedure;    >*ˆdowhile(MAPMTYP.MAPPART(next(src_memtbl_ptr))<>$FFFF);*’callinit_next_pointers;%*’if(MAPMTYP(src_memtbl_ptr)=$FF) #*’thencallbuild_rom_memtbl_entry; *’elsedo;*œcallcheck_memmap_conflict;%*œif(got_alias_partition_flag=set)#*œthencallbuild_ram_memmap_entry; *œelsedo;*¦callbuild_fml;*¦if(previous_node_ptr=0)*¦thendest_memtbl_ptr<==*«dest_memtbl_ptr-*«length(dest_memtbl_entry); *¦elsedo;*°callbuild_fml_header;*°callbuild_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;4*ˆMAPTYP.MAPPART(next(dest_memtbl_ptr))<==$FFFF;  *end init_next_partitions; 'ŠTTL„INITNEXTMEMORYPARTITIONS-CODEŠPAGE*!*init_next_partitions: procedure;* INEXTMEM:*>*ˆdowhile(MAPMTYP.MAPPART(next(src_memtbl_ptr))<>$FFFF);*’callinit_next_pointers;%*’if(MAPMTYP(src_memtbl_ptr)=$FF)#*’thencallbuild_rom_memtbl_entry;* ŠWHILE.W12(A0)#$FFFFDO.S BSR.S‚INEXTPTRS IF.Bƒ(A0)#$FFTHEN.S BSR„BROMNODE * *’elsedo;*œcallcheck_memmap_conflict;%*œif(got_alias_partition_flag=set)#*œthencallbuild_ram_memtbl_entry;*ELSE.S BSR„CMEMCONF TST.B‚D2IF…THEN.Sˆ “BSR„BRAMNODE * *›elsedo;*¦callbuild_fml;*¦if(previous_node_ptr<>0)*¦thendest_memtbl_ptr<==*«dest_memtbl_ptr-*«length(dest_memtbl_entry); *¦elsedo;*°callbuild_fml_header;*°callbuild_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;*“ELSE.S “BSR.S‚BFML “IF.LƒA2D0THEN.S“LEA„-MAPENTSZ(A1),A1“ELSE.S –BSR„BFMLHEAD –BSR„BRAMNODE“ENDIENDIENDIŠENDW *5*ˆMAPMTYP.MAPPART(next(dest_memtbl_ptr))<==$FFFF;*#ŠMOVE.W#$FFFF,MAPMTYP+MAPENTSZ(A1) **end init_next_partitions;*ŠRTS 'ŠTTL„INITNEXTPOINTERS-DOCUMENTATIONŠPAGEM********************************************************************************)***…Name:‚INEXTPTRS(init_next_pointers):*** ***…Function:C***ŠInitializesallpointersandcountersforallmemorypartitions***…exceptpartitionzero.*** ***…Inputs:'***ˆ1.)‚A0=previous(src_memtbl_ptr).(***ˆ2.)‚A1=previous(dest_memtbl_ptr).*** ***…Outputs:&***ˆ1.)‚A0=current(src_memtbl_ptr).'***ˆ2.)‚A1=current(dest_memtbl_ptr).***ˆ3.)‚A5=clear_mem_ptr.***ˆ4.)‚D4=start_of_part_ptr.***ˆ5.)‚D5=end_of_part_ptr.***ˆ6.)‚D6=bytes_cleared.***ˆ7.)‚D7=fml_header_len.******…Sideeffects:1***ˆ1.)‚Executionmightnotreturn(callKILLER).******…Explanation:@***ŠFirstwesetthefml_header_lentoone(anypartitionexceptG***…partitionzerorequiresonlyone256bytepageforitsFML_HEADER),@***…andadvanceboththesrc_memtbl_ptrandthedest_memtbl_ptr.***C***ŠNextwesetthestart_of_part_ptrtotheceilingoftheMAPSTRAH***…fieldinthesrc_memtbl,andtheend_of_part_ptrtotheflooroftheH***…MAPENDAfield.‚(Notethatwealwaysalignourpartitionson256byteI***…pageboundaries,andthatwealwaysroundtothesameammountorless+***…memoryasdescribedinthesrc_memtbl).***D***ŠWethensetclear_mem_ptrtothevalueofstart_of_part_ptr,andE***…setbytes_clearedtozero.‚(ThuswewillstartclearingmemoryatG***…thestartofthecurrentpartition.)‚Finally,wecallKILLERiftheG***…currentpartitiondescribedbythesrc_memtbldoesnotcontainsome'***…positivenumberofpagesofmemory.***L**************************************************************************** #ŠTTL„INITNEXTPOINTERS-ALGORITHMŠPAGE*init_next_pointers: procedure;    *ˆfml_header_len<==1;@*ˆsrc_memtbl_ptr<==src_memtbl_ptr+length(src_memtbl_entry);C*ˆdest_memtbl_ptr<==dest_memtbl_ptr+length(dest_memtbl_entry); 8*ˆstart_of_part_ptr<==ceil(MAPSTRA(src_memtbl_ptr));7*ˆend_of_part_ptr<==floor(MAPENDA(src_memtbl_ptr));&*ˆclear_mem_ptr<==start_of_part_ptr;*ˆbytes_cleared<==0; +*ˆif(start_of_part_ptr>=end_of_part_ptr)*ˆthencallKILLER;  *end init_next_pointers; ŠTTL„INITNEXTPOINTERS-CODEŠPAGE**init_next_pointers: procedure* INEXTPTRS: **ˆfml_header_len<== 1;@*ˆsrc_memtbl_ptr<==src_memtbl_ptr+length(src_memtbl_entry);C*ˆdest_memtbl_ptr<==dest_memtbl_ptr+length(dest_memtbl_entry);* ŠMOVE.L#1,D7 ŠLEA„12(A0),A0 ŠLEA„MAPENTSZ(A1),A1 *8*ˆstart_of_part_ptr<==ceil(MAPSTRA(src_memtbl_ptr));7*ˆend_of_part_ptr<==floor(MAPENDA(src_memtbl_ptr));&*ˆclear_mem_ptr<==start_of_part_ptr;*ˆbytes_cleared<==0;*ŠMOVE.LMAPSTRA(A0),D4ŠADD.L‚#255,D4 ŠCLR.B‚D4 ŠMOVE.LMAPENDA(A0),D5 ŠCLR.B‚D5 ŠMOVE.LD4,A5 ŠCLR.L‚D6 *+*ˆif(start_of_part_ptr>=end_of_part_ptr)*ˆthencallKILLER;*ŠIF.LƒD4D5THEN.S BSR„KILLERŠENDI **end init_next_pointers;*ŠRTS ŠPAGEŠTTL„BUILDŽFML-DOCUMENTATIONL**********************************************************************************…Name:‚BFML(build_fml):*** ***…Function:>***ŠBuild_fmlwillzerooutmemorystartingatclear_mem_ptr+A***…bytes_cleared,andbuildthefreememorylisttodescribetheF***…partition.‚Italsodetects"holes"inthepartition,anddescribes3***…themas"used"memorywithinthecurrentblock.*** ***…Inputs:***ˆ1.)‚A5=clear_mem_ptr.***ˆ2.)‚D4=end_of_part_ptr.***ˆ3.)‚D6=bytes_cleared.*** ***…Outputs:=***ˆ1.)‚A3=first_node_ptr(fromsubroutinebuild_fml_node).***ˆ2.)‚A4=last_node_ptr."***ˆ3.)‚FMLforcurrentpartition.******…Sideeffects:,***ˆ1.)‚A2(previous_node_ptr)isdestroyed.2***ˆ2.)‚A5(clear_mem_ptr)=D5(end_of_part_ptr)./***ˆ3.)‚D1,D2,andD3(scratch)aredestroyed.(***ˆ4.)‚D6(bytes_cleared)isdestroyed.-***ˆ5.)‚Mightnotreturn(mightcallKILLER).******…Explanation:B***ŠFirstweinitializethefirst_node_ptrtozero.‚ThistellstheH***…build_fml_nodesubroutinethatweareworkingwiththefirstnodein ***…theFML.***C**ŠNotethattheclear_next_nodeandbuild_last_fml_nodelabelscanI***…bothbejumpedtobythecodeforhandlingbuserrors(build_fml_be).***B***ŠAtclear_next_nodeweupdatelast_node_ptrtothevalueoftheC***…clear_mem_ptr.‚(Last_node_ptrisaninputtothebuild_fml_nodeG***…subroutinetellinghimwherethe"last"orcurrentnodeislocated,H***…andisalsoanoutputfromthisroutinetellingthecallerwheretheH***…lastnodeintheFMLislocated.)‚Wealsoincrementclear_mem_ptrbyE***…thevalueofbytes_cleared.‚(Thisisneccessaryinorderto"skipD***…over"andnotinitializetheINITcodewhenbuildingtheFMLfor***…partitionzero.***B***ŠNextwesetupthestacksothatanybuserrorwillsendustoI***…build_fml_be.‚Thisisthecodethatwillbeusedformappingoverany$***…"holes"inthememorypartition.***D***ŠNowweloopuntilweeithercleartherestofthecurrentmemoryF***…partition(fallthroughtheloop),orfindaholeinmemory(goto***…build_fml_be).***D***ŠIfwedoclearmemorytotheendofthecurrentpartitionwithinG***…thisloop,wemustpopthebuserrorvectorjunkoffthestack,andI***…calculatethevalueofbytes_cleared(clear_mem_ptr-last_node_ptr).F***…ThiscalculationisneccessaryatthispointinordertomakethisE***…case(foundablockofallgoodmemory)lookthesameasthecaseE***…wherewefoundsomegoodmemoryandthenfounda"hole"inmemoryF***…(tookabuserror,andwenttobuild_fml_be).‚InthatcasewewillH***…"freeze"bytes_clearedtothevalueofclear_mem_ptr-last_node_ptrH***…inordertorememberthenumberof"good"bytesofmemorywithintheI***…currentblock,andincrementclear_mem_ptr(bypages)untilweeitherG***…reachtheendofthepartition,orwefindsomemore"good"memory.I***…Thusatthatpointourcurrentblockwillbeframedbythelast_node_E***…ptr(pointstothestartofthecurrentblock),theclear_mem_ptrJ***…(pointtotheendofthecurrentblock),andthebytes_clearedcounterG***…whichholdsthenumberof"good"bytesinthecurrentblock(ortheD***…numberofbytesoffreememory).‚Thisismostoftheinfor mation&***…neededtobuildanodeintheFML.***C***ŠFinally,thebuild_last_fml_nodelabelwillbuildanodeinthe;***…FMLifthevalueofbytes_clearedisgreaterthanzero.***M***************************************************************************** ŠTTL„BUILDŽFML-ALGORITHMŠPAGE*build_fml: procedure;    *ˆprevious_node_ptr<==0; *clear_next_node:*ˆD1,D2,D3<==0;"*ˆlast_node_ptr<==clear_mem_ptr;2*ˆclear_mem_ptr<==clear_mem_ptr+bytes_cleared;*ˆpushaddr(build_fml_be); *ˆpush'BE';-*ˆdountil(clear_mem_ptr=end_of_part_ptr);'*’four_longwords(clear_mem_ptr)<==0;'*’clear_mem_ptr<==clear_mem_ptr+16;*ˆend;*ˆpopbus_errorjunkoffstack;2*ˆbytes_cleared<==clear_mem_ptr-last_node_ptr; *build_last_fml_node:*ˆif(bytes_cleared>0)*ˆthencallbuild_fml_entry;  *end build_fml; "ŠTTL„BUILDŽFREEMEMORYLIST-CODEŠPAGE**build_fml: procedure;*BFML: **ˆprevious_node_ptr<==0;* ŠSUB.L‚A2,A2 **clear_next_node:*ˆD1,D2,D3<==0;!*ˆlast_node_ptr<==clear_mem_ptr2*ˆclear_mem_ptr<==clear_mem_ptr+bytes_cleared;*ˆpushaddr(build_fml_be); *ˆpush'BE';* CNEXTNODE: ŠCLR.L‚D1 ŠCLR.L‚D2 ŠCLR.L‚D3 ŠLEA„(A5),A4 ŠLEA„(A5,D6.L),A5 ŠPEA„BFMLBE(PC) ŠMOVE.W#'BE',-(A7) *-*ˆdountil(clear_mem_ptr=end_of_part_ptr);'*’four_longwords(clear_mem_ptr)<==0;'*’clear_mem_ptr<==clear_mem_ptr+16;*ˆend;*ŠREPEATMOVEM.LD0-D3,(A5)/NOP”ThisNOPforcestheexecutionunittowait)*§untilthebusinterfaceunitisdoneon&*§a68020,incasewegetabuserror.LEA„16(A5),A5ŠUNTIL.LA5D5**ˆpopbus_errorjunkoffstack;2*ˆbytes_cleared<==clear_mem_ptr-last_node_ptr;* ŠADD.L‚#6,A7 ŠMOVE.LA5,D6 ŠSUB.L‚A4,D6 **build_last_fml_node:*ˆif(bytes_cleared>0)*ˆthencallbuild_fml_entry;* BLASTNODE:ŠIF.LƒD6D0THEN.SBSR.S‚BFMLNODEŠENDI **end build_fml;*ŠRTS 4ŠTTL„BUSERRORWHILECLEARINGMEMORY-DOCUMENTATIONŠPAGEN************************************************************************************…Explanation:?***ŠThiscodeisexecutedifweencounteraholewhileclearing@***…memory.‚Notethetwolabelsbuild_fml_beandbuild_fml_be_x.G***…Executionwill"goto"thebuild_fml_belabelifabuserroroccursB***…whenclearingmemoryviatheloopinthebuild_fmlsubroutine.F***…Likewise,executionwill"goto"thebuild_fml_be_xlabelifabusH***…erroroccurswhilelookingatthetopofeachpageofmemoryfortheF***…next"good"page.‚(i.e.,Thisblockofcodecontainsa"buserror"G***…loop.‚Wekeepgoingtobuild_fml_be_xuntilweeitherreachtheend:***…ofthecurrentpartition,orfindsome"good"memory.)***A***ŠFirstwecalculatebytes_clearedtobethedifferencebetweenG***…theclear_mem_ptrandthelast_node_ptr.‚ThenwecallKILLERiftheJ***…buserroroccurredinthemiddleofapage.‚(Bytes_clearedisnotona***…pageboundary.)***E***ŠOtherwise,weupdatetheclear_mem_ptrtopointtothetopoftheG***…nextpageinmemory.‚Ifweareattheendofthecurrentpartition,@***…thenwegotothebuild_last_fml_nodelabelinthebuild_fml***…subroutine.***B***ŠIfwearenotattheendofthepartition,wesetthestackupF***…sothatabuserrorwillsendusbacktothebuild_fml_be_xlabel.G***…ThenweattempttowriteintothememorylocationpointedtobytheF***…clear_mem_ptr.‚(Ifabuserroroccurs,thenexecutionwill"goto"I***…build_fml_be_x,andwewill"loop"untilwerunoutofmemoryinthis+***…partition,orfindsome"good"memory.)***D***ŠIfwe"fallthrough"tothenextinstruction(findagoodmemoryI***…location),thenwegetridofthebuserrorinformationonthestack.J***…Ifwefoundsomegoodmemoryinthecurrentblock(bytes_cleared>0),E***…thenwecallbuild_fml_nodetobuildanodeintheFML,andresetI***…bytes_clearedtozero.‚Ineithercasewegoto  clear_next_nodeinthe***…build_fmlsubroutine.***N****************************************************************************** 0ŠTTL„BUSERRORWHILECLEARINGMEMORY-ALGORITHMŠPAGE*build_fml_be:2*ˆbytes_cleared<==clear_mem_ptr-last_node_ptr;$*ˆif(mod(bytes_cleared,256)<>0)*ˆthencallKILLER; *build_fml_be_x:(*ˆclear_mem_ptr<==clear_mem_ptr+256;&*ˆif(clear_mem_ptr=end_of_part_ptr)!*ˆthengotobuild_last_fml_node;*ˆpushaddr(build_fml_be_x); *ˆpush'BE';*ˆword(clear_mem_ptr)<==0;*ˆpopbus_errorjunkoffstack;!*ˆif(bytes_cleared>0)thendo;*’callbuild_fml_node;*’bytes_cleared<==0;*ˆend;*ˆgotoclear_next_node;  *end build_fml_be; +ŠTTL„BUSERRORWHILECLEARINGMEMORY-CODEŠPAGE**build_fml_be:*BFMLBE: *2*ˆbytes_cleared<==clear_mem_ptr-last_node_ptr;$*ˆif(mod(bytes_cleared,256)<>0)*ˆthencallKILLER;* ŠMOVE.LA5,D6 ŠSUB.L‚A4,D6 ŠIF.BƒD6D0THEN.S BSR„KILLERŠENDI **build_fml_be_x:*BFMLBEX: *(*ˆclear_mem_ptr<==clear_mem_ptr+256;&*ˆif(clear_mem_ptr=end_of_part_ptr)!*ˆthengotobuild_last_fml_node;*ŠLEA„256(A5),A5 ŠIF.LƒA5D5THEN.SBRA„BLASTNODEŠENDI**ˆpushaddr(build_fml_be_x); *ˆpush'BE';*ˆword(clear_mem_ptr)<==0;*ŠPEA„BFMLBEX(PC)ŠMOVE.W#'BE',-(A7) ŠMOVE.WD0,(A5)/ŠNOP—ThisNOPforcestheexecutionunittowait)*§untilthebusinterfaceunitisdoneon&*§a68020,incasewegetabuserror. **ˆpopbus_errorjunkoffstack;!*ˆif(bytes_cleared>0)thendo;*’callbuild_fml_node;*’bytes_cleared<==0;*ˆend;*ˆgotoclear_next_node;* ŠADD.L‚#6,A7 ŠIF.LƒD6D0THEN.SBSR.S‚BFMLNODE CLR.L‚D6ŠENDI  ŠBRA„CNEXTNODE #ŠTTL„BUILDŽFMLNODE-DOCUMENTATIONŠPAGEL*******************************************************************************$***…Name:‚BFMLNODE(build_fml_node):*** ***…Function:E***ŠBuildsanodeinthefreememorylist(fillsinthefmlfp,fmlbp,E***…fmlfree,andfmlusedfields),andlinksthisnodetoanyprevious***…nodesintheFML.*** ***…Inputs:***ˆ1.)‚A2=previous_node_ptr.***ˆ2.)‚A4=last_node_ptr.***ˆ3.)‚A5=clear_mem_ptr.***ˆ4.)‚D6=bytes_cleared.*** ***…Outputs:8***ˆ1.)‚FMLnode(pointedtobypreviouslast_node_ptr).D***ˆ2.)‚FmlfpofpreviousnodeinFML(ifthisisnotthefirstnode***intheFML).C***ˆ3.)‚A3=first_node_ptr(ifthisisthefirstnodeintheFML).***ˆ4.)‚A4=previous_node_ptr.******…Sideeffects:"***ˆ1.)‚D1(scratch)isdestroyed.******…Explanation:B***ŠFirstwesetupthefmlfpandfmlbplinksinthecurrentnode.E***…NextwesetupfmlusedtocontainthenumberofpagesbetweentheA***…last_node_ptrandtheclear_mem_ptrminusthenumberofpagesE***…describedbythebytes_clearedcounter.‚ThenwesetfmlfreeequalG***…tothenumberofpagesdescribedbythebytes_clearedcounter.‚ThusJ***…thesumoffmlusedandfmlfreeisequaltothenumberofpagesbetween-***…thelast_node_ptr,andtheclear_mem_ptr.***E***ŠNow,ifthisisthefirstnodeintheFML(previous_node_ptr=0)K***…thensetfirst_node_ptrequaltolast_node_ptrandthus"remember"thatG***…thisisthefirstnode.‚Otherwise,updatethefmlfpofthepreviousF***…nodetopointtothisnode.‚Finallysetprevious_node_ptrequalto>***…last_node_ptr(andthus"remember"thisnode),andreturn.***M***************************************************************************** ŠTTL„BUILDŽFMLNODE-ALGORITHMŠPAGE*build_fml_node: procedure;    *ˆfmlfp(last_node_ptr)<==0;.*ˆfmlbp(last_node_ptr)<==previous_node_ptr;@*ˆfmlused(last_node_ptr)<==((clear_mem_ptr-last_node_ptr)-*¥(bytes_cleared))/256;2*ˆfmlfree(last_node_ptr)<==bytes_cleared/256;*ˆif(previous_node_ptr=0)(*ˆthenfirst_node_ptr<==last_node_ptr;3*ˆelsefmlfp(previous_node_ptr)<==last_node_ptr;&*ˆ  previous_node_ptr<==last_node_ptr;  *end build_fml_node; ŠTTL„BUILDŽFMLNODE-CODEŠPAGE**build_fml_node:* BFMLNODE: **ˆfmlfp(last_node_ptr)<==0;.*ˆfmlbp(last_node_ptr)<==previous_node_ptr;*ŠCLR.L‚FMLFP(A4)ŠMOVE.LA2,FMLBP(A4) **ˆfmlused(last_node_ptr)<==8*’(clear_mem_ptr-last_node_ptr-bytes_cleared)/256;2*ˆfmlfree(last_node_ptr)<==bytes_cleared/256;* ŠMOVE.LA5,D1 ŠSUB.L‚A4,D1 ŠSUB.L‚D6,D1 ŠLSR.L‚#8,D1ŠMOVE.LD1,FMLUSED(A4) ŠMOVE.LD6,D1 ŠLSR.L‚#8,D1ŠMOVE.LD1,FMLFREE(A4) *ˆif(previous_node_ptr=0)(*ˆthenfirst_node_ptr<==last_node_ptr;3*ˆelsefmlfp(previous_node_ptr)<==last_node_ptr;*ŠIF.LƒA2D0THEN.S LEA„(A4),A3 ELSE.SMOVE.LA4,FMLFP(A2)ŠENDI *&*ˆprevious_node_ptr<==last_node_ptr;* ŠLEA„(A4),A2 **end build_fml_node;*ŠRTS %ŠTTL„BUILDŽFMLHEADER-DOCUMENTATIONŠPAGEM********************************************************************************&***…Name:‚BFMLHEAD‚(build_fml_header):*** ***…Function:E***ŠFindsablockofmemorytocontaintheFML_HEADERnode(ineitherF***…highorlowmemory),andbuildsanFML_HEADERnodetodescribethe***…currentpartition.*** ***…Inputs:D***ˆ1.)‚Src_memtbl_node(tellswhethertheFML_HEADERbelongsinlow***highmemory).***ˆ2.)‚A0=src_memtbl_ptr.***ˆ3.)‚D4=start_of_part_ptr.***ˆ4.)‚D5=end_of_part_ptr.*** ***…Outputs:9***ˆ1.)‚FML_HEADERnodedescribingthecurrentpartition.E***ˆ2.)‚Fml_header_ptr(Ifthefml_header_ptr=0uponreturningfrom<***thisroutine,thenwecouldn'tfindenoughmemoryintheA***currentpartitionfortheFML_HEADER.‚Thisismeaningfulonly***forpartitionzero.)******…Sideeffects:‚None.******…Explanation:D***ŠFirstwedeterminewhethertheFML_HEADERbelongsinloworhighB***…memoryandcalltheappropriatesubroutinetoreturntoustheI***…correspondingpointer.‚Ifthesubroutinereturnedanon-zeropointer,G***…thenitfoundenoughmemoryinthecurrentpartitiontocontaintheF***…FML_HEADER(itfoundatleastfml_header_lenpages),andsowemay%***…continuetobuildtheFML_HEADER.***?***ŠWesetlowfree,stravail,andendavailtothevaluesoftheH***…first_node_ptr,start_of_part_ptr,andend_of_part_ptrrespectively.E***…WemovetheMAPMTYPandMAPPARTfieldsfromthesrc_memtbltothe7***…FML_HEADERnode,andsetupthesemaphorecounters.***M***************************************************************************** !ŠTTL„BUILDŽFMLHEADER-ALGORITHMŠPAGE*build_fml_header: procedure;    '*ˆif(fml_headerbelongsinlowmemory)#*ˆthencallget_fml_header_ptr_low;$*ˆelsecallget_fml_header_ptr_high; #*ˆif(fml_header_ptr<>0)thendo;.*’lowfree(fml_header_ptr)<==first_node_ptr;2*’stravail(fml_header_ptr)<==start_of_part_ptr;0*’endavail(fml_header_ptr)<==end_of_part_ptr; 8*’memtype(fml_header_ptr)<==MAPMTYP(src_memtbl_ptr);8*’mempart(fml_header_ptr)<==MAPPART(src_memtbl_ptr); "*’semfrmem(fml_header_ptr)<==1;$*’semfrmem+2(fml_header_ptr)<==0;"*’semwtmem(fml_header_ptr)<==0;$*’semwtmem+2(fml_header_ptr)<==0;*ˆend;  *end build_fml_header; ŠTTL„BUILDŽFMLHEADER-CODEŠPAGE**build_fml_header: procedure;* BFMLHEAD: *'*ˆif(fml_headerbelongsinlowmemory)#*ˆthencallget_fml_header_ptr_low;$*ˆelsecallget_fml_header_ptr_high;*:ŠBTSTƒ#0,10(A0)ŠIf(src_memtbl_node(byte_10(bit_0))=0)7ŠIF…THEN.SŒthenfml_headerbelongsinHIGHmemory; 6BSR.S‚GFMLPTRH‹elsefml_headerbelongsinLOWmemory; ELSE.SBSR.S‚GFMLPTRLŠENDI *#*ˆif(fml_header_ptr<>0)thendo;.*’lowfree(fml_header_ptr)<==first_node_ptr;2*’stravail(fml_header_ptr)<==start_of_part_ptr;0*’endavail(fml_header_ptr)<==end_of_part_ptr;*ŠIF.LƒA5D0T! HEN.SMOVE.LA3,LOWFREE(A5)MOVE.LD4,STRAVAIL(A5)MOVE.LD5,ENDAVAIL(A5) *8*’memtype(fml_header_ptr)<==mapmtyp(src_memtbl_ptr);8*’mempart(fml_header_ptr)<==mappart(src_memtbl_ptr);*MOVE.WMAPMTYP(A0),MEMTYPE(A5) *"*’semfrmem(fml_header_ptr)<==1;$*’semfrmem+2(fml_header_ptr)<==0;"*’semwtmem(fml_header_ptr)<==0;$*’semwtmem+2(fml_header_ptr)<==0;*ˆend;*MOVE.W#1,SEMFRMEM(A5)CLR.L‚SEMFRMEM+2(A5)CLR.W‚SEMWTMEM(A5)CLR.L‚SEMWTMEM+2(A5)ŠENDI **end build_fml_header;*ŠRTS 0ŠTTL„GETFMLHEADERPOINTERHIGH-DOCUMENTATIONŠPAGEN*********************************************************************************-***…Name:‚GFMLPTRH(get_fml_header_ptr_high):*** ***…Function::***ŠThissubroutinereturnsapointertoablockofmemoryI***…fml_header_lenpageslonginthecurrentpartition.‚ThisblockistheE***…highestaddressedblockinthecurrentpartitionthatisatleastI***…fml_header_lenpageslong.‚ThissubroutinehandlesallaccountingforE***…theblockit"steals"fromthepartition.‚(IteithercountsitasE***…beinga"usedpageinthecurrentblock,or,ifthecurrentblockH***…consistsofonlyfml_header_lenpages,thenit"unlinks"thecurrentH***…block,andcountsitasa"used"portionofthepreviousblock,ifa***…previousblockexists.)*** ***…Inputs:***ˆ1.)‚A4=last_node_ptr.***ˆ2.)‚D7=fml_header_len.*** ***…Outputs:***ˆ1.)‚A5=fml_header_ptr.;***ˆ2.)‚Ifwecan'tfindanyblockinthecurrentpartition'***atleastfml_header_lenpageslong:+***A.)‚A3(first_node_ptr)issettozero.****B.)‚A4(last_node_ptr)issettozero.******…Sideeffects:&***ˆ1.)‚D1(scratch)maybedestroyed.******…Explanation:E***ŠFirstwesetfml_header_ptrequaltothelast_node_ptrandsearchJ***…backwardthroughtheFMLuntilwefindablockatleastfml_header_lenI***…pageslong.‚IfwereachthebeginningoftheFML(fml_header_pty=0)H***…withoutfindingablockofmemoryfml_header_lenpageslong,thenweG***…zerooutthefirstandlast_node_ptrandreturn.‚(Fml_header_ptris***…alsozero.)***E***ŠOtherwise,wechecktoseeiftheblockisexactlyfml_header_lenG***…pageslong.‚Ifitis,thenwecallunlink_fml_header_nodetounlinkI***…thenodefromtheFMLlinkedlist,andcountitsmemoryasbeingpart.***…oftheusedportionofthepreviousblock.***>***ŠIftheblockisgreaterthanfml_header_lenpages,wethenH***…decrementfmlfreeandincrementfmlusedbyfml_header_lenpages,and@***…incrementfml_header_ptrbyfml_header_len*256bytessothatI***…fml_header_ptrnowpointstothefirst"used"pagewithinthecurrent***…blockandreturn.***N****************************************************************************** ,ŠTTL„GETFMLHEADERPOINTERHIGH-ALGORITHMŠPAGE$*get_fml_header_ptr_high: procedure;    #*ˆfml_header_ptr<==last_node_ptr;7*ˆdowhile(fmlfree(fml_header_ptr)D7DO.S MOVE.LFMLBP(A5),A5 *"*’if(fml_header_ptr=0)thendo;*œfirst_node_ptr<==0;*œlast_n! ode_ptr<==0; *œreturn;*’end;*ˆend;IF.LƒA5D0THEN.S SUB.L‚A3,A3 SUB.L‚A4,A4RTSENDIŠENDW *0*ˆif(fmlfree(fml_header_ptr)=fml_header_len)#*ˆthencallunlink_fml_header_node;* ŠIF.LƒFMLFREE(A5)„D7THEN.SBSR.S‚UFMLHEAD * *ˆelsedo;9*’fmlfree(fml_header_ptr)<==fmlfree(fml_header_ptr)-*¯fml_header_len;9*’fmlused(fml_header_ptr)<==fmlused(fml_header_ptr)+*¯fml_header_len;%*’fml_header_ptr<==fml_header_ptr+!*¥fmlfree(fml_header_ptr)*256;*ˆend*ELSE.SSUB.L‚D7,FMLFREE(A5) ADD.L‚D7,FMLUSED(A5) MOVE.LFMLFREE(A5),D1 LSL.L‚#8,D1LEA„(A5,D1.L),A5ŠENDI**end get_fml_header_ptr_high;*ŠRTS /ŠTTL„GETFMLHEADERPOINTERLOW-DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚GFMLPTRL(get_fml_header_ptr_low):*** ***…Function::***ŠThissubroutinereturnsapointertoablockofmemory;$\-*5[=$ELMPU3]ae3m_uQ}.…BI***…fml_header_lenpageslonginthecurrentpartition.‚ThisblockistheD***…lowestaddressedblockinthecurrentpartitionthatisatleastI***…fml_header_lenpageslong.‚ThissubroutinehandlesalltheaccountingI***…fortheblockit"steals"fromthepartition.‚(ItcountstheblockasI***…partofthe"used"portionofthepreviousblock,ifapreviousblockH***…exists.)‚Also,sincethissubroutine"steals"ablockofmemoryfromE***…lowmemory,itmayhvaetomovethepointersandcounters(fmlfp,J***…fmlbp,fmlfree,fmlused)fromtheirpositiontoalocationfml_header_'***…lenpagesfurther"down"inmemory.*** ***…Inputs:***ˆ1.)‚A3=first_node_ptr.***ˆ2.)‚D7=fml_header_len.*** ***…Outputs:***ˆ1.)‚A5=fml_header_ptr.;***ˆ2.)‚Ifwecan'tfindanyblockinthecurrentpartition'***atleastfml_header_lenpageslong:+***A.)‚A3(first_node_ptr)issettozero.****B.)‚A4(last_node_ptr)issettozero.******…Sideeffects:‚None:******…Explanation:F***ŠFirstwesetfml_header_ptrequaltothefirst_node_ptrandsearchI***…forwardthroughtheFMLuntilwefindablockatleastfml_header_lenC***…pageslong.‚IfwereachtheendoftheFML(fml_header_pty=0)H***…withoutfindingablockofmemoryfml_header_lenpageslong,thenweG***…zerooutthefirstandlast_node_ptrandreturn.‚(Fml_header_ptris***…alsozero.)***E***ŠOtherwise,wechecktoseeiftheblockisexactlyfml_header_lenG***…pageslong.‚Ifitis,thenwecallunlink_fml_header_nodetounlinkI***…thenodefromtheFMLlinkedlist,andcountitsmemoryasbeingpart.***…oftheusedportionofthepreviousblock.***>***ŠIftheblockisgreaterthanfml_header_lenpages,wecallG***…move_fml_nodetomovethepointersandcountersofthecurrentnodeJ***…(fmlfp,fmlbp,fmlfree,fmlused)fml_header_lenpages"down"inmemory;***…inordertomakeroomfortheFML_HEADERinlowmemory.***N****************************************************************************** +ŠTTL„GETFMLHEADERPOINTERLOW-ALGORITHMŠPAGE#*get_fml_header_ptr_low: procedure;    $*ˆfml_header_ptr<==first_node_ptr;7*ˆdowhile(fmlfree(fml_header_ptr)D7DO.S MOVE.LFMLFP(A5),A5 *"*’if(fml_header_ptr=0)thendo;*œfirst_node_ptr<==0;*œlast_node_ptr<==0; *œreturn;*’end;*ˆend;*IF.LƒA5D0THEN.S SUB.L‚A3,A3 SUB.L‚A4,A4RTSENDIŠENDW *0*ˆif(fmlfree(fml_header_ptr)=fml_header_len)#*ˆthencallunlink_fml_header_node;*ˆelsecallmove_fml_node;* ŠIF.LƒFMLFREE(A5)„D7THEN.SBSR.S‚UFMLHEADELSE.SBSR.S‚MFMLNODEŠENDI **end get_fml_header_ptr_low;*ŠRTS +ŠTTL„UNLINKFMLHEADERNODE-DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚UFMLHEAD(unlink_fml_header_node):*** ***…Function:E***ŠThissubroutinehandlestheunlinkingofthefml_header_nodefromI***…theFML.‚Ittakescareoflinkingtheprevious_node(ifthereisone)I***…tothenext_node(ifthereisone)andviceversa.‚ItalsotakescareJ***…ofaccountingforthefml_header_nodeaspartofthe"used"portionof(***…theprevious_node(ifthereisone).*** ***…Inputs:***ˆ1.)‚A3=first_node_ptr.***ˆ2.)‚A4=last_node_ptr.***ˆ3.)‚A5=fml_header_ptr.*** ***…Outputs:E***ˆ1.)‚UpdatedFMLwiththefml_header_node"unlinked"fromtheFML,?***andcountedaspartofthe"used"partofitsprevious_node***(ifthereisone).******…Sideeffects:.***ˆ1.)‚A3(first_node_ptr)couldgetchanged.-***ˆ2.)‚A4(last_node_ptr)couldgetchanged.3***ˆ3.)‚A2(previous_node_ptr)couldgetdestroyed.)***ˆ4.)‚A6(scratch)couldgetdestroyed.&***ˆ5.)‚D1(scratch)maybedestroyed.******…Explanation:C***ŠThefirstdoblockhandlesthecasewherethefml_header_ptrisA***…equaltothefirst_node_ptr.‚InthiscasewemustadvancetheG***…first_node_ptrtopointtothenextnodeintheFML.‚IfthereisnoJ***…nextnode(newfirst_node_ptr=0),thenwezerooutthelast_node_ptrD***…toindicateanemptyFML,andreturn.‚Otherwise,wezeroouttheD***…fmlbpofthenewfirst_node_ptrtoindicatethatthisisnowthe%***…beginningoftheFML,andreturn.***>***ŠThenextlargedoblockofcodehandlesthecasewheretheI***…fml_header_ptrisequaltothelast_node_ptr.‚InthiscaseweattemptJ***…tobackupthelast_node_ptrtopointtothepreviousnodeintheFML.F***…Ifthereisnopreviousnode(newlast_node_ptr=0),thenwezero@***…outthefirst_node_ptrtoindicateanemptyFML,andreturn.J***…Otherwise,wezerooutthefmlfpofthenewlast_nodetoindicatethatG***…thisisnowtheendoftheFML,updatethefmlusedfieldofthenew@***…last_nodetoequalitscurrentvalue,plusthelengthofthe9***…previouslast_node(fmlfreeandfmlused),andreturn.***@***ŠIfneitherofthesecasesoccurred,thenthefml_header_nodeI***…existssomewhereinthemiddleoftheFML.‚InthiscasewemustfirstD***…getapointertothenodebeforethefml_header_nodeintheFML.G***…Nowthefmlfpofthispreviousnodemustbesettothevalueofthe:***…fmlfpofthefml_header_node,andthus"skipover"theG***…fml_header_node.‚Havingdonethis,weupdatethefmlusedportionofI***…thisprevious_nodetoincludeitsoldfmlusedvalueandthelengthof?***…thefml_header_node(fmlfreeandfmlused).‚(ThisinessenceG***…countstheentirefml_header_node,usedandfreememory,aspartofH***…theusedportionofthepreviousnode.)‚Finally,weupdatethefmlbpI***…ofthenodeafterthefml_header_nodeintheFMLtopointbacktothe;***…previousnode,andthuscompletethe"unlinking"ofthe***…fml_header_node.***M***************************************************************************** 'ŠTTL„UNLINKFMLHEADERNODE-ALGORITHMŠPAGE#*unlink_fml_header_node: procedure;    /*ˆif(fml_header_ptr=first_node_ptr)thendo;,*’first_node_ptr<==fmlfp(first_node_ptr);*’if(first_node_ptr=0)" *’thenlast_node_ptr<==0;%*’elsefmlbp(first_node_ptr)<==0);*ˆend;3*ˆelseif(fml_header_ptr=last_node_ptr)thendo;**’last_node_ptr<==fmlbp(last_node_ptr);*’if(last_node_ptr=0)*’thenfirst_node_ptr<==0; *’elsedo;*œfmlfp(last_node_ptr<==0);*œfmlused(last_node_ptr)<==*¦fmlused(last_node_ptr)+*¦fmlfree(fml_header_ptr)+*¦fmlused(fml_header_ptr);*’end;*ˆend; *ˆelsedo;/*’previous_node_ptr<==fmlbp(fml_header_ptr);7*’fmlfp(previous_node_ptr)<==fmlfp(fml_header_ptr);!*’fmlused(previous_node_ptr)<==*œfmlused(previous_node_ptr)+*œfmlfree(fml_header_len)+*œfmlused(fml_header_ptr);+*’next_node_ptr<==fmlfp(fml_header_ptr);.*’fmlbp(next_node_ptr)<==previous_node_ptr;*ˆend;  *end unlink_fml_header_node; "ŠTTL„UNLINKFMLHEADERNODE-CODEŠPAGE#*unlink_fml_header_node: procedure;* UFMLHEAD: */*ˆif(fml_header_ptr=first_node_ptr)thendo;,*’first_node_ptr<==fmlfp(first_node_ptr);*’if(first_node_ptr=0)*’thenlast_node_ptr<==0);$*’elsefmlbp(first_node_ptr)<==0;*ˆend*ŠIF.LƒA5A3THEN.S MOVE.LFMLFP(A3),A3 IF.LƒA3D0THEN.S SUB.L‚A4,A4 ELSE.SCLR.L‚FMLBP(A3)ENDI *3*ˆelseif(fml_header_ptr=last_node_ptr)thendo;**’last_node_ptr<==fmlbp(last_node_ptr);*’if(last_node_ptr=0)*’thenfirst_node_ptr<==0);*ELSE.SIF.LƒA5A4THEN.S MOVE.LFMLBP(A4),A4 IF.LƒA4D0THEN.S  “SUB.L‚A3,A3 * *’elsedo;*œfmlfp(last_node_ptr)<==0;*œfmlused(last_node_ptr)<==*¦fmlused(last_node_ptr)+*¦fmlfree(fml_header_ptr)+*¦fmlused(fml_header_ptr);*’end;*ˆend;*“ELSE.S“CLR.L‚FMLFP(A4) “MOVE.LFMLFREE(A5),D1“ADD.L‚FMLUSED(A5),D1“ADD.L‚D1,FMLUSED(A4)ENDI * *ˆelsedo;/*’previous_node_ptr<==fmlbp(fml_header_ptr);7*’fmlfp(previous_node_ptr)<==fmlfp(fml_header_ptr);!*’fmlused(previous_node_ptr)<==*œfmlused(previous_node_ptr)+*œfmlfree(fml_header_ptr)+*œfmlused(fml_header_ptr);+*’next_node_ptr<==fmlfp(fml_header_ptr);.*’fmlbp(next_node_ptr)<==previous_node_ptr;*ˆend;*ELSE.SMOVE.LFMLBP(A5),A2 MOVE.LFMLFP(A5),FMLFP(A2) MOVE.LFMLFREE(A5),D1ADD.L‚FMLUSED(A5),D1ADD.L‚D1,FMLUSED(A2) MOVE.LFMLFP(A5),A6 MOVE.LA2,FMLBP(A6)ENDIŠENDI**end unlink_fml_header_node;*ŠRTS "ŠTTL„MOVEFMLNODE-DOCUMENTATIONŠPAGEN*********************************************************************************#***…Name:‚MFMLNODE(move_fml_node):*** ***…Function:D***ŠThissubroutine"moves"thepointersandcounters(fmlfp,fmlbp,C***…fmlfree,fmlused)ofanFMLnodefml_header_lenpages"down"inG***…memory.‚ItalsohandlesallaccountingforthechangeinthestatusH***…ofthemovedmemory(fmlfreeofthecurrentnodegetsdecrementedbyH***…fml_header_lenpages,andfmlusedforthepreviousnode(ifthereisB***…one)getsincrementedbythesamevalue).‚ThissubroutinealsoG***…accountsforanychangeinthestatusofthefirst_node_ptr(iftheH***…fml_header_ptrwaspointingtothefirstnode),orthelast_node_ptrF***…(ifthefml_header_ptrwaspointingtothelastnode)asrequired.*** ***…Inputs:***ˆ1.)‚A3=first_node_ptr.***ˆ2.)‚A4=last_node_ptr.***ˆ3.)‚A5=fml_header_ptr.***ˆ4.)‚D7=fml_header_len.*** ***…Outputs:C***ˆ1.)‚AnewFMLnodemoveddowninmemorybyfml_header_lenpage.A***ˆ2.)‚Allnewpointerstoreflectthedisplacementofthenode.******…Sideeffects:***ˆ1.)‚A2getsdestroyed.+***ˆ2.)‚A3(first_node_ptr)maybeupdated.****ˆ3.)‚A4(last_node_ptr)maybeupdated.$***ˆ4.)‚A6(scratch)getsdestroyed.******…Explanation:D***ŠFirstwecomputetheaddressofthemovednodetobetheaddressH***…ofthefml_header_ptrplustheoffset,inbytes,thatthenodeistoH***…bemoved(fml_header_len*256).‚ThenwegetapointertothepreviousE***…nodeintheFML.‚Ifthereisnopreviousnode,# thenweupdatetheG***…first_node_ptrtopointtothemovednode.‚Otherwise,weupdatetheH***…fmlfpfieldofthepreviousnodetopointtothemovednode,andaddH***…thefml_header_lenpagestothe"used"portionofthepreviousnode.***D***ŠNextwedecrementthe"free"fieldofthefml_header_nodebytheJ***…valueofthefml_header_lentoreflectthefactthatthismemoryisnoI***…longeravailabletothatnode.‚ThenwegetapointertothenextnodeD***…intheFML,andifitiszero(nonextnode),thenweupdatetheF***…last_node_ptrtopointtothemovednode.‚Otherwise,weupdatethe;***…fmlbpofthenextnodetopointbacktothemovednode.***C***ŠFinally,weactuallymovethepointersandcountersofthenodeJ***…fromthememorypointedtobythefml_header_ptrtothememorypointed)***…tobythemoved_node_ptr,andreturn.***M***************************************************************************** ŠTTL„MOVEFMLNODE-ALGORITHMŠPAGE*move_fml_node: procedure;    9*ˆmoved_node_ptr<==fml_header_ptr+fml_header_len*256; /*ˆprevious_node_ptr<==fmlbp(fml_header_ptr);*ˆif(previous_node_ptr=0))*ˆthenfirst_node_ptr<==moved_node_ptr; *ˆelsedo;/*’fmlfp(previous_node_ptr)<==moved_node_ptr;!*’fmlused(previous_node_ptr)<==*œfmlused(previous_node_ptr)+*œfml_header_len;*ˆend; *ˆfmlfree(fml_header_ptr)<==*œfmlfree(fml_header_ptr)-*œfml_header_len; +*ˆnext_node_ptr<==fmlfp(fml_header_ptr);*ˆif(next_node_ptr=0)(*ˆthenlast_node_ptr<==moved_node_ptr;0*ˆelsefmlbp(next_node_ptr)<==moved_node_ptr; 2*ˆfmlfp.fmlbp.fmlused.fmlfree(moved_node_ptr)<==/*’fmlfp.fmlbp.fmlused.fmlfree(fml_header_ptr);  *end move_fml_node; ŠTTL„MOVEFMLNODE-CODEŠPAGE*move_fml_node: proc;* MFMLNODE: *9*ˆmoved_node_ptr<==fml_header_ptr+fml_header_len*256;* ŠLSL.L‚#8,D7ŠLEA„(A5,D7.L),A6 ŠLSR.L‚#8,D7 */*ˆprevious_node_ptr<==fmlbp(fml_header_ptr);*ˆif(previous_node_ptr=0))*ˆthenfirst_node_ptr<==moved_node_ptr;*ŠMOVE.LFMLBP(A5),A2 ŠIF.LƒA2D0THEN.S LEA„(A6),A3 * *ˆelsedo;/*’fmlfp(previous_node_ptr)<==moved_node_ptr;!*’fmlused(previous_node_ptr)<==*œfmlused(previous_node_ptr)+*œfml_header_len;*ˆend;*ELSE.SMOVE.LA6,FMLFP(A2) ADD.L‚D7,FMLUSED(A2)ŠENDI *ˆfmlfree(fml_header_ptr)<==*œfmlfree(fml_header_ptr)-*œfml_header_len;*ŠSUB.L‚D7,FMLFREE(A5) *+*ˆnext_node_ptr<==fmlfp(fml_header_ptr);*ˆif(next_node_ptr=0)(*ˆthenlast_node_ptr<==moved_node_ptr;0*ˆelsefmlbp(next_node_ptr)<==moved_node_ptr;*ŠMOVE.LFMLFP(A5),A2 ŠIF.LƒA2D0THEN.S LEA„(A6),A4 ELSE.SMOVE.LA6,FMLBP(A2)ŠENDI *2*ˆfmlfp.fmlbp.fmlused.fmlfree(moved_node_ptr)<==/*’fmlfp.fmlbp.fmlused.fmlfree(fml_header_ptr);*ŠMOVE.LFMLFP(A5),FMLFP(A6)ŠMOVE.LFMLBP(A5),FMLBP(A6)ŠMOVE.LFMLUSED(A5),FMLUSED(A6)ŠMOVE.LFMLFREE(A5),FMLFREE(A6) **end move_fml_node;*ŠRTS *ŠTTL„CHECKŽMEMMAPCONFLICT-DOCUMENTATIONŠPAGEM********************************************************************************+***…Name:‚CMEMCONF(check_memmap_conflict):*** ***…Function:C***ŠThissubroutinecheckstheRAMpartitiondescribedbytheentryB***…inthesrc_memtblpointedtobythesrc_memtbl_ptragainstallE***…previously-describedRAMpartitions.‚IfthissubroutinedetectsaD***…fatalconflictitwillnotreturnexecutiontothecaller.‚IfitC***…detectsanaliaspartition(samestartingaddressassomeotherK***…partition),itreturnsexecutionwiththegot_alias_partition_flagset.9***…Otherwise,itreturnsexecutionwiththatflagreset.*** ***…Inputs:***ˆ1.)‚A0=src_memtbl_ptr.***ˆ2.)‚A1=dest_memtbl_ptr.***ˆ3.)‚D4=start_of_part_ptr.***ˆ4.)‚SYSPAR(MAPBEG).*** ***…Outputs:&***ˆ1.)‚D2=got_alias_partition_flag.@***ˆ2.)‚# A5=fml_header_ptr(ifgot_alias_partition_flag=set).******…Sideeffects:,***ˆ1.)‚A2(temp_memtbl_ptr)getsdestroyed.$***ˆ2.)‚D1(scratch)getsdestroyed.3***ˆ3.)‚Executionmaynotreturn(maycallKILLER).******…Explanation:@***ŠFirstweinitializefortheloopbyresettingthegot_alias_I***…partition_flag,settingthecurrent_partition_number,andsettingtheF***…temp_memtbl_ptrtopointtothebeginningofthedest_memtbl.‚Then***…webegintheloop.***B***ŠIfwedetectaduplicatepartitionnumber,thenwecallKILLERC***…anddie.‚Ifwedetectaduplicatestart_of_part_ptr,wesettheI***…got_alias_partition_flag,setthefml_header_ptrequaltotheMAPFMLPB***…fieldofthealiaspartitionandreturn.‚IfwedetectthatourD***…currentstart_of_part_ptrisatalowermemorylocationthantheF***…ENDAVAILfieldofsomepreviouspartition,thenwecallKILLERandC***…die.‚Otherwise,wekeeploopinguntilwehavelookedatallthe>***…previously-definedentriesinthedest_memtbl,andreturn.***L**************************************************************************** &ŠTTL„CHECKŽMEMMAPCONFLICT-ALGORITHMŠPAGE"*check_memmap_conflict: procedure;    !*ˆresetgot_alias_partition_flag;B*ˆcurrent_partition_number<==MAPMTYP(src_memtbl_ptr).AND.$0F;&*ˆtemp_memtbl_ptr<==SYSPAR(MAPBEG);/*ˆdountil(temp_memtbl_ptr=dest_memtbl_ptr);;*’if(MAPPART(temp_memtbl_ptr)=current_partition_number)*’thencallKILLER;=*’if(MAPSTRA(temp_memtbl_ptr)=start_of_part_ptr)thendo;*œsetgot_alias_partition_flag;/*œfml_header_ptr<==MAPFMLP(temp_memtbl_ptr); *œreturn;*’end;=*’if(start_of_part_ptr„D1THEN.S BSR„KILLERENDI *=*’if(mapstra(temp_memtbl_ptr)=start_of_part_ptr)thendo;*›setgot_alias_partition_flag;/*›fml_header_ptr<==mapfmlp(temp_memtbl_ptr); *›return;*’end;* IF.LƒMAPSTRA(A2)„D4THEN.SST…D2MOVE.LMAPFMLP(A2),A5RTSENDI *>*’if(start_of_part_ptrENDAVAIL(A6)THEN.S BSR„KILLERENDI **’temp_memtbl_ptr<==*œtemp_memtbl_ptr+*œlength(dest_memtbl_entry);*LEA„MAPENTSZ(A2),A2 **ˆend;*ŠUNTIL.LA2A1 **end check_memmap_conflict;*ŠRTS +ŠTTL„BUILDŽRAMMEMTBLENTRY-DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚BRAMNODE(build_ram_memtbl_entry):*** ***…Function:D***ŠThissubroutinewritesinallpointersanddescriptorsforaRAM'***…partitionentryinthedest_memtbl.*** ***…Inputs:***ˆ1.)‚A0=src_memtbl_ptr.***ˆ2.)‚A1=dest_memtbl_ptr.***ˆ3.)‚A5=fml_header_ptr.***ˆ4.)‚D4=start_of_part_ptr.*** ***…Outputs:7***ˆ1.)‚Dest_memtbl_entry(RAMentry)pointedtobythe***dest_memtbl_ptr.******…Sideeffects:+***ˆ1.)‚D1,andD2(scratch)getdestroyed.******…Explanation:D***ŠTheMAPMTYPfieldofthedest_memtbl_entrygetssetequaltotheF***…mostsignificantfourbitsoftheMAPPARTfieldofthesrc_memtbl_H***…entry,andtheMAPPARTfieldofthedest_memtbl_entrygetssetequalI***…tothefourleastsignificantbitsofthesamefield.‚Finally,wesetJ***…theMAPSTRAfiel$ dofthedest_memtbl_entryequaltothestart_of_part_G***…ptr,andtheMAPFMLPfieldequaltothefml_header_ptr,andreturn.***M***************************************************************************** 'ŠTTL„BUILDŽRAMMEMTBLENTRY-ALGORITHMŠPAGE#*build_ram_memtbl_entry: procedure;    *ˆMAPMTYP(dest_memtbl_ptr)<==%*’MAPPART(src_memtbl_ptr).AND.$70;*ˆMAPPART(dest_memtbl_ptr)<==%*’MAPPART(src_memtbl_ptr).AND.$0F;2*ˆMAPSTRA(dest_memtbl_ptr)<==start_of_part_ptr;/*ˆMAPFMLP(dest_memtbl_ptr)<==fml_header_ptr;  *end build_ram_memtbl_entry; "ŠTTL„BUILDŽRAMMEMTBLENTRY-CODEŠPAGE#*build_ram_memtbl_entry: procedure;* BRAMNODE: **ˆMAPMTYP(dest_memtbl_ptr)<==%*’MAPMTYP(src_memtbl_ptr).AND.$70;*ŠMOVE.BMAPMTYP(A0),D1 ŠMOVE.BD1,D2ŠAND.B‚#$70,D1ŠMOVE.BD1,MAPMTYP(A1) **ˆmappart(dest_memtbl_ptr)<==&*’mapmtyp(dest_memtbl_ptr).AND.$0F;*ŠAND.B‚#$0F,D2ŠMOVE.BD2,MAPPART(A1) *2*ˆmapstra(dest_memtbl_ptr)<==start_of_part_ptr;*ŠMOVE.LD4,MAPSTRA(A1) */*ˆmapfmlp(dest_memtbl_ptr)<==fml_header_ptr;*ŠMOVE.LA5,MAPFMLP(A1) **end build_ram_memtbl_entry;*ŠRTS +ŠTTL„BUILDŽROMMEMTBLENTRY-DOCUMENTATIONŠPAGEM********************************************************************************,***…Name:‚BROMNODE(build_rom_memtbl_entry):*** ***…Function:E***ŠThissubroutinedoessomeprimitivecheckingonthelegalityofaB***…ROMpartitiondescribedinthesrc_memtbl,andthenwritestheH***…descriptorsandpointerstodescribethatnodeintothedest_memtbl.*** ***…Inputs:***ˆ1.)‚A0=src_memtbl_ptr.***ˆ2.)‚A1=dest_memtbl_ptr.***ˆ3.)‚D4=start_of_part_ptr.***ˆ4.)‚D5=end_of_part_ptr.*** ***…Outputs:7***ˆ1.)‚Dest_memtbl_entry(ROMentry)pointedtobythe***dest_memtbl_ptr.******…Sideeffects:$***ˆ1.)‚A6(scratch)getsdestroyed./***ˆ2.)‚Executionmaynotreturn(callKILLER).******…Explanation:D***ŠFirstweverifythatthecurrentROMpartitiondoesnotstartatH***…alowermemorylocationthantheendingofthelastpartitionintheH***…dest_memtbl.‚Ifitdoes,wehaveafatalconfigurationerror,andso***…wecallKILLER.***>***ŠOtherwise,wemovetheMAPMTYPandMAPPARTfieldsfromtheH***…src_memtbltothedest_memtbl,settheMAPSTRAandMAPENDAfieldsofF***…thedest_memtblequaltothestart_of_part_ptrandend_of_part_ptr***…respectively,andreturn.***N****************************************************************************** 'ŠTTL„BUILDŽROMMEMTBLENTRY-ALGORITHMŠPAGE#*build_rom_memtbl_entry: procedure;   ?*ˆif(MAPMTYP(previous(dest_memtbl_ptr))=ROM_type)thendo;*’if(start_of_part_ptr<'*œMAPENDA(previous(dest_memtbl_ptr)))é*’thencallKILLER;*ˆend; *ˆelsedo;*’if(start_of_part_ptr<1*œENDAVAIL(MAPFMLP(previous(dest_memtbl_ptr)))*’thencallKILLER;*ˆend; '*ˆMAPMTYP.MAPPART(dest_memtbl_ptr)<==#*’MAPMTYP.MAPPART(src_memtbl_ptr);3*ˆMAPSTRA(dest_memtbl_ptr)<==start_of_part_ptr);0*ˆMAPENDA(dest_memtbl_ptr)<==end_of_part_ptr;  *end build_rom_memtbl_entry; "ŠTTL„BUILDROMMEMTBLENTRY-CODEŠPAGE#*build_rom_memtbl_entry: procedure;* BROMNODE: ?*ˆif(MAPMTYP(previous(dest_memtbl_ptr))=ROM_type)thendo;*’if(start_of_part_ptr<'*œMAPENDA(previous(dest_memtbl_ptr)))*’thencallKILLER;*ˆend; +ŠIF.BƒMAPMTYP-MAPENTSZ(A1)#$FFTHEN.S)ŠIF.LƒD4MAPENDA-MAPENTSZ(A1)THEN.S ŠBSR„KILLERŠEND$ I *ˆelsedo;*’if(start_of_part_ptr<1*œENDAVAIL(MAPFMLP(previous(dest_memtbl_ptr)))*’thencallKILLER;*ˆend; ŠELSE.SŠMOVE.LMAPFMLP-MAPENTSZ(A1),A6!ŠIF.LD4ENDAVAIL(A6)THEN.S ŠBSR„KILLERŠENDIŠENDI *'*ˆmapmtyp.mappart(dest_memtbl_ptr)<==#*’mapmtyp.mappart(src_memtbl_ptr);2*ˆmapstra(dest_memtbl_ptr)<==start_of_part_ptr;0*ˆmapenda(dest_memtbl_ptr)<==end_of_part_ptr;*ŠMOVE.WMAPMTYP(A0),MAPMTYP(A1) ŠMOVE.LD4,MAPSTRA(A1) ŠMOVE.LD5,MAPENDA(A1)**end build_rom_memtbl_entry;*ŠRTS  ŠEND éé=/*=/*†M68XXX.KILLER.AF=/*+=/* Chain file to assemble M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.KILLER.LS=/*=/IFC \1ƒ=ARGM68XXX.KILLER.LS=/ENDIF=/*1=ASM M68XXX.KILLER.SA,M68XXX.KILLER.RO,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.PANEL.EQ=/*}=/*=ENDéééééé‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.PANEL.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.PANEL.EQ‰LIST‰PAGE&KILLERƒIDNT„5,1…68xxxCRASHTHESYSTEM*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*2*†SOMETHINGHASGONEWRONG---GETOUTOFTHISTASK!*‰SECTIONLEVEL00* ‰XDEF„KILLER‰XDEF„KILLERT0 ‰XREF.S‚CRASHSAV ‰XREF.S‚PANEL    KILLERT0:KILLER:‰MOVEM.LD0-D7/A0-A7,CRASHSAV+8%‰MOVE.W‚SR,CRASHSAV+6ŒSAVESTATUSREG% &‰MOVE.L‚(A7),CRASHSAVŒSAVEPCOFCRASH ‰MOVE„USP,A1‰MOVE.L‚A1,CRASHSAV+72‹SAVEUSP4‰MOVE.L‚$8,CRASHSAV+76‹SAVEBUSERRORVECTORADDRESS KILLER2:‰MOVE.L‚PANEL,A1‘PANELADDRESS(‰MOVE.W‚#$95,FPLEDST(A1)‰DISABLETTO--AX!‰MOVE.W‚#$B5,FPLEDST(A1)‰LATCHIT‰MOVE.W‚#$A0,FPLEDST(A1)‰XF!‰MOVE.W‚#$B0,FPLEDST(A1)‰LATCHIT$‰OR.W„#$700,SR‘STOPOTHERINTERRUPTS‰BRA.SƒKILLER2‰ENDéééé–/=/*=/*†M68XXX.LOGPHY.AF=/*+=/* Chain file to assemble M68XXX.LOGPHY.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.LOGPHY.LS=/*=/IFC \1ƒ=ARGM68XXX.LOGPHY.LS=/ENDIF=/*1=ASM M68XXX.LOGPHY.SA,M68XXX.LOGPHY.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDééééééŸ% ‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGEALOGPHYƒIDNT‚5,1ƒ68xxxTRAP0--CONVERTLOGICALADDRESSTOPHYSICAL*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ********************8*ˆ*LOGPHY†2.00*ƒLOGICALTOPHYSICALADDRESSCONVERSION*ˆ*761604/23/79„**ˆ*HLD607/06/79„**ˆ*HLD602/26/81„*=*ˆ*SJF‚10/14/83‚MMIOsegmentsnolongertreateddifferently.*ˆ*********************$*ENTRY‚A0„POINTSTOTST(PRESERVED)%*ˆD6„LOGICALWINDOWBEGINNINGADDRESS*ˆD5„WINDOWLENGTHINBYTES*2*EXITƒPC„IFWINDOWISCOMPLETELYWITHINASEGMENT&*ˆD6„PHYSICALWINDOWBEGINNINGADDRESS!*ˆD5„0(A0,D5)POINTSTOMMUENTRY%*ˆD3„Logicalwindowbeginningaddress*/*ˆPC+2‚IFWINDOWPARTIALLYCONTAINEDINSEGMENT*ˆD6„SAMEASSUPPLIED!*ˆD5„0(A0,D5)POINTSTOMMUENTRY*1*ˆPC+4‚IFWINDOWCOMPLETELYOUTSIDEADDRESSSPACE&*-OR-IFWINDOWWITHINMMIOSEGMEMT*ˆD6„SAMEASSUPPLIED)*ˆD5„0(A0,D5)POINTSTOFIRSTEMPTYENTRY*-OR-POINTSTOMMIOSEGMENT(*ŽD5=0IFNONEEMPTY(ANDNOMMIOSEG)* *’01234567*USESREGISTERSDR‚**RR*AP†E*‰SECTIONLEVEL02* ‰XDEFLOGPHY ‰XDEFLOGPHYO‰XDEFSBLOGPHY‰XDEFSBLOGPHO‰PAGE SBLOGPHY:LOGPHY:(‰BCLRƒ#0,D6ˆSTARTINGADDRESSALWAYSEVEN SBLOGPHO:LOGPHYO::‰AND.L‚#$FFFFFF,D6‚CLEAR1STBYTEOFADDRESS(24BITSMAX),‰CLR.L‚D0‹CLEAR-USEDASEMPTYENTRYOFFSET'‰MOVE.LD6,D3ˆWINDOWBEGINPAGEADDRESS‰LSR.L‚#8,D6ˆCONVERTTOPAGE‰MOVE.LD5,D4ˆLENGTHOFWINDOW3‰BLE.S‚LOGPHY6†ERRORRETURNIFLENGTHIS0ORMINUS -‰ADD.L‚D3,D4ˆBEGADDR+LENGTH=ENDADDR+1‰SUB.L‚#1,D4ˆENDINGADDRESS!‰LSR.L‚#8,D4ˆCONVERTTOLASTPAGE ‰CLR.L‚D5$‰MOVE.WTSTLMMU(A0),D5‰LASTMMULOAD  **ˆLOOKFORENTRYINTST* LOGPHY1:‰TST.B‚TSTCTL+1(A0,D5)ˆINUSE?‰BEQ.S‚LOGPHY4BRANCHIFNO 1‰CMP.W‚TSTLB(A0,D5),D6ˆWINDOWSTARTBEFOREBEGIN?¨V±2$‰BCS.S‚LOGPHY5YES--TRYNEXTSEGMENT .‰CMP.W‚TSTLE(A0,D5),D6ˆWINDOWSTARTAFTEREND?$‰BHI.S‚LOGPHY5YES--TRYNEXTSEGMENT  *4*ˆWINDOWCONTAINEDORPARTIALLYCONTAINEDINSEGMENT* 7‰CMP.W‚TSTLE(A0,D5),D4ˆFOUNDSEG--WINDOWENDAFTEREND?(‰BHI.S‚LOGPHY8BRANCHIFWINDOWOVERLAPS  *%*ˆWINDOWTOTALLYCONTAINEDINSEGMENT* /‰ADD.W‚TSTPO(A0,D5),D6ˆCOMPUTEPHYSICALADDRESS‰LSL.L‚#8,D6’CONVERTTOBYTES(‰ADD.B‚D3,D6’ADDBYTESBEYONDPAGESTART‰RTS  **ˆLOOPBACKTOCHECKNEXTENTRY* LOGPHY4:%‰MOVE.LD5,D0ˆSAVEEMPTYENTRYOFFSET LOGPHY5:‰SUB.L‚#8,D5ˆGETNEXTENTRY&‰CMP.W‚#TSTMMU,D5ƒALLENTRIESCHECKED?(‰BGE„LOGPHY1†GOBACKTOCHECKNEXTENTRY  *.*ˆNOENTRYFOUND-MMIOSEG-PARTLYINSEGMENT* LOGPHY6:'‰MOVE.LD0,D5ˆRETURNEMPTYENTRYOFFSET‰ADD.L‚#2,(A7)†CHANGERETURN LOGPHY8:'‰ADD.L‚#2,(A7)†WINDOWPARTLYINSEGMENT%‰MOVE.LD3,D6ˆRETURNORIGINALADDRESS‰RTS‰ENDééé& é=/*=/*†M68XXX.PAGEALOC.AF=/*-=/* Chain file to assemble M68XXX.PAGEALOC.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.PAGEALOC.LS=/*=/IFC \1ƒ=ARGM68XXX.PAGEALOC.LS=/ENDIF=/*5=ASM M68XXX.PAGEALOC.SA,M68XXX.PAGEALOC.RO,\1;MRZ=070=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.SEG.EQ=/*ƒ9995.&.MAP.EQ=/*}=/*=ENDééééé鹉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.SEG.EQ*ˆINCLUDEƒ9995.&.MAP.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.SEG.EQ‰INCLUDEƒ9995.&.MAP.EQ‰LIST‰PAGE8PAGEALOCIDNT5,1ƒ68xxxTRAP0--ALLOCATEPHYSICALMEMORY*»3/06/79GGC3$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*»2/12/81HLD6&*…PAGAL‚--ALLOCATEPAGESEXECROUTINE*/*‹ENTRY:A0UPPER1/2-OPTIONSANDMEMORYTYPE'*¡BIT‚26=1‚WAITIFMEMORYNOTAVAILABLE+*¡BIT‚25=1‚ALLOCATELARGESTBLOCKAVAILABLE'*¡BIT‚24=1‚ALLOCATEATPHYSICALADDRESS&*¡BIT‚23=1‚SEGMENTISMMIOORPHYSROM*¡BITS22-20MEMORYTYPE*¡BITS19-16PARTITIONNUMBER*,*“A0LOWER1/2-NUMBEROFPAGESTOALLOCATE+*“A1=PHYSICALADDRESSIFBIT24OFA0=1*6*‹EXIT:SUCCESS‚RTSWITHA0=ADDRESSOFNEWALLOCATION*¤D1=1BYTEMEMORYDESCRIPTION*¤D2=NUMBEROFPAGESALLOCATED*“FAIL„RTSTOPC+2* *“01234567*USESREGISTERS‚D****‘A*****‰SECTIONLEVEL01**,*‚Revisionhistory(addnewchangestotop).*…Date†Author‚ChangesH*…--------‚------‚------------------------------------------------------@*†1/19/84‚MSL…FixedsothatusercouldGTSEGonaROMpartition.**‰XDEF‚PAGEALOC ‰XDEF‚SBPAGAL ‰XREFƒDISPATCH ‰XREFƒPSWAIT ‰XREFƒSVXSTAK ‰XREF.SMAPBEG‰PAGESBPAGAL: PAGEALOC:)‰MOVEM.LD3-D5/A3-A5,-(A7)‚SAVEREGISTERS ‰MOVE.L‚A0,D3ˆREQUESTPARAMETERS ‰CLR.LƒD2$‰MOVE.W‚D3,D2ˆD2=#PAGESREQUESTED‰BNE.SƒPAGAL0‡ERRORIF& ZERO ‰MOVE.L‚#1,D4ˆSETERRORCODE‰BRA…PAGALC6†GOTORETURN PAGAL0:4‰SWAP„D3‹LowD3=options,HighD3=numberofpages"‰MOVE.W‚D3,D1ˆD1=REQUESTOPTIONS  *:*ˆIfpartitionnumberisspecified,godirectlytoPAGAL1.9*ˆNotethatinthiscase,weskipthepreparationforthe*ˆWAITMEMoption.* 5‰MOVE.L‚#MAPPART,D4‚D4=PARTITIONOFFSETFORCOMPARE&‰AND.Lƒ#$0F,D3†WASPARTITION#GIVEN?.‰BNE.SƒPAGAL1‡BRANCHIFYES-D3=PARTITION#  *ÂXË[Ó_Û]ã[ëG=*ˆSincepartitionnumberisnotspecified,usepartitiontype* #‰MOVE.W‚D1,D3ˆRESTOREOPTIONSTOD3‰AND.Lƒ#$70,D3†D3=MEMORYTYPE@‰MOVE.L‚#MAPMTYP,D4‚TYPEOFFSETFORCOMPARE-IFPART=0,USETYPE  *3*ˆIF'WAITFORMEMORY'WASREQUESTED--PREPARENOW* ‰IFNE„WAITMEM,‰BTST„#SGPBOWAI,D1‚'WAITFORMEM'REQUESTED? ‰BEQ.SƒPAGAL1 )‰BSR…PAGASVST…GOSAVEREGISTERSANDSTACK‰ENDC  **ˆINITIALIZEFORMEMMAPSEARCH* PAGAL1:7‰LEA…0,A5…A5=POINTERTOFMLHEADERFOR'BESTFIT'ENTRY0‰LEA…0,A4…A4=POINTERTOFMLENTRYFOR'BESTFIT' ‰IFNE„SHARMEM ‰CLR.Lƒ-(A7)„MARKPLACEONSTACK‰ENDC #‰MOVE.L‚A1,A2„SAVEPHYSICALADDRESS)‰MOVE.L‚MAPBEG,A1‚POINTERTOMEMMAPTABLE)‰BTST„#SGPBOPHY,D1‚NEEDPHYSICALADDRESS?‰BNE…PAGPHYA…BRANCHIFYES‰PAGE*4*„LOOKFORPARTITION#ORTYPEMATCHINMEMMAPTABLE@*„D1=OPTIONSƒD2=#PAGESƒD3=PARTITION#ORTYPE#‚D4=TABLEOFFSET$*„A1=POINTERTOCURRENTMEMMAPENTRY* PAGALKM1:/‰TST.WƒMAPMTYP(A1)‚TESTFORROMORNOPARTITION$‰BMI.SƒPAGALKM4…BRANCHTOSKIPENTRY ,‰CMP.Bƒ0(A1,D4),D3‚ISTHISAMATCHINGENTRY?‰BNE.SƒPAGALKM4…BRANCHIFNO ,‰MOVE.L‚MAPFMLP(A1),A3ƒA3=CURRENTFMLHEADER  **ˆCHECKFORDUPLICATEENTRY* ‰IFNE„SHARMEM2‰MOVE.L‚A7,A0‰STACKTOA0-CHECKENTRIESONSTACK PAGALKM2:‰TST.Lƒ(A0)ŠENDOFENTRIES?*‰BEQ.SƒPAGALKM3†BRANCHIFYES-ALLTESTED #‰CMP.Lƒ(A0)+,A3†COMPAREFMLPOINTER+‰BEQ.SƒPAGALKM4†BRANCHIFEQUAL-DUPLICATE #‰BRA…PAGALKM2†GOBACKTOCHECKMORE  PAGALKM3:*‰PEA…(A3)ŠSAVEFMLHEADERADDRESSONSTACK%‰TR0.PƒSEMFRMEM(A3)ƒWAITONSEMAPHORE‰ENDC (‰BSR…PAGASFML†GOSEARCHFREEMEMORYLIST PAGALKM4:&‰LEA…MAPENTSZ(A1),A1‚NEXTMEMMAPENTRY$‰CMP.Wƒ#-1,MAPMTYP(A1)ƒENDOFTABLE?‰BNE…PAGALKM1‰BRANCHIFNO‰PAGE*,*…SEARCHCOMPLETE--ALLOCATEIFSPACEFOUND* PAGALC3:‰CLR.LƒD4ŠCLEARFORRETURNCODE(‰TST.Lƒ(A7)ˆWAS'BESTFIT'HEADERFOUND?‰BEQ.SƒPAGAER2…BRANCHIFNO )‰MOVE.L‚A4,D0‡WAS'BESTFIT'ENTRYFOUND?‰BEQ.SƒPAGALC9…BRANCHIFNO 2‰CMP.LƒFMLFREE(A4),D2‚CHECKFORENOUGHSPACEFOUND ‰BLE.SƒPAGALC3A„BRANCHIFENOUGH ‰BTST„#SGPBOLES,D1‚ACCEPTLESS?‰BEQ.SƒPAGALC9…BRANCHIFNO 1‰MOVE.L‚FMLFREE(A4),D2‚ALLOCATELARGESTAVAILABLE PAGALC3A:%‰BSR…PAGATAK…TAKESPACE-REBUILDFML PAGALC4:-‰MOVE.B‚MAPMTYP(A1),D1ƒRETURNMEMORYMAPTYPE)‰OR.B„MAPPART(A1),D1ƒANDPARTITIONNUMBER PAGALC5: ‰IFNE„SHARMEM ‰BSR…PAGARSM‰ENDC  **…ALLOCATIONCOMPLETE-RETURN* PAGALC6:.‰BCLR„#TSK2RTEX,TCBSTAT2(A6)„CLEARRET-TO-EXEC ‰MOVE.L‚A3,A0‰ALLOCATIONADDRESS‰MOVE.L‚D4,D0‰RETURNCODE*‰BEQ.SƒPAGALC7‡BRANCHIFSUCCESSFULRETURN &‰ADD.Lƒ#2,24(A7)…CHANGERETURNADDRESS PAGALC7:,‰MOVEM.L(A7)+,D3-D5/A3-A5ƒRESTOREREGISTERS‰RTS‰PAGE**„MEMORYNOTAVAILABLENOW* ‰IFNE„WAITMEMPAGALC9:#‰BTST„#SGPBOWAI,D1„WAITFORMEMORY?‰BEQ.SƒPAGAER1‰BRANCHIFNO  *.*„PUTTASKON'WAITFORMEMORY'SEMAPHORELIST* 1‰BSET„#TSK2RTEX,TCBSTAT2(A6)ƒSETRET-TO-EXECFLAG/‰MOVE.B‚#EXECPRIO,TCBRPRI(A6)„SETHIGHPRIORITY)‰LEA…SEMWTMEM(A5),A0„ADDRESSOFSEMAPHORE%‰MOVE.L‚A0,TCBXA0(A6)†SAVEFORRETURN )‰MOVE.W‚SR,-(A7)‹SAVEOLDINTERRUPTLEVEL"‰OR.W„' #$0700,SRŠINHIBITINTERRUPTS #‰MOVE.W‚(A0),D0ŒGETSEMAPHORECOUNT&‰LSL.Wƒ#1,D0ŽSHIFTOUTMULTI-PROCFLAG%‰ASR.Wƒ#1,D0ŽCONVERTCOUNTTO16BITS PAGAWT2:‰SUB.Wƒ#1,D0ŽDECREMENTCOUNT!‰BGE…PAGAWT2ŒSHOULDNEVERBEPLUS ‰MOVE.W‚D0,(A0)ŒRESAVECOUNT‰BSR…PSWAITGOPUTTASKONLIST '‰BCLR„#HIBIT,(A0)ˆCLEARMULTI-PROCFLAG,‰MOVE.W‚(A7)+,SR‹RESTOREOLDINTERRUPTLEVEL &‰TR0.READY‚(A6)ŒPUTTASKONREADYLIST ‰IFNE„SHARMEM#‰BSR…PAGARSM‰RELEASEALLSEMAPHORES‰ENDC $‰BRA…DISPATCH‰GORUNSOMEOTHERTASK-*WILLRETURNTOPAGALC1WHENMEMORYRELEASED‰ENDC  **…ERRORRETURNS*PAGAER2:-‰ADD.Lƒ#1,D4‡PART#ORMEMTYPEDOESNOTEXIST PAGAER1:$‰ADD.Lƒ#1,D4‡MEMSPACENOTAVAILABLE‰BRA…PAGALC5…GOTORETURN  ‰IFEQ„WAITMEMPAGALC9‚EQU…PAGAER1‰ENDC‰PAGE**ˆSEARCHFREEMEMORYLIST* PAGASFML:&‰MOVE.L‚LOWFREE(A3),D0„GETFIRSTENTRY&‰BEQ.SƒPAGAS9†BRANCHIFNOFREEMEMORY PAGAS2:&‰MOVE.L‚D0,A2‡POINTERTOCURRENTENTRY&‰MOVE.L‚A4,D0‡TESTFORANYENTRYSAVED+‰BEQ.SƒPAGAS6†IFNONESAVED-SAVETHISONE 6‰MOVE.L‚FMLFREE(A2),D5ƒD5=FREEPAGES-CURRENTENTRY‰CMP.LƒD2,D5ˆISCURR>=NEED?"‰BLT.SƒPAGAS4‡BRANCHIFNOTENOUGH '‰CMP.LƒFMLFREE(A4),D2ƒISNEED>SAVED?‰BGT.SƒPAGAS6‡BRANCHIFYES '‰CMP.LƒFMLFREE(A4),D5ƒISCURR>SAVED?‰BLT.SƒPAGAS6‡BRANCHIFNO ‰BRA.SƒPAGAS8‡BRANCHIFYES PAGAS4:'‰CMP.LƒFMLFREE(A4),D5ƒISCURR>SAVED?‰BLE.SƒPAGAS8†BRANCHIFNO PAGAS6: ‰MOVE.L‚A2,A4‡SAVECURRENTENTRY)‰MOVE.L‚A3,A5‡SAVECURRENTHEADERADDRESS PAGAS8:7‰MOVE.L(A2),D0…GETFWDPOINTER-NEXTENTRYINFREELIST$‰BNE„PAGAS2†LOOPBACKFORNEXTENTRY PAGAS9:‰RTS‰PAGE*5*‰FOUNDALINKTHATHASENOUGHFREESPACETOALLOCATE* PAGATAK:;‰SUB.L‚D2,FMLFREE(A4)ƒSUBTRACTPAGEDNEEDEDFROMFREEPAGES.‰ADD.L‚D2,FMLUSED(A4)ƒADDPAGESNEEDEDTOUSED.‰MOVE.LFMLFREE(A4),D5ƒNEWCOUNTOFFREEPAGES‰LSL.L‚#8,D5ŒFREEBYTES-‰LEA„0(A4,D5.L),A3†ADDRESSOFSPACEALLOCATED+‰BNE.S‚PAGAT4‹BRANCHIFNOTALLSPACETAKEN  *:*‹FREESPACEINTHISLINKISALLUSEDUP-DISOLVETHISLINK* !‰MOVE.LFMLUSED(A4),D5ƒPAGESUSED‰MOVE.L(A4),A2ŠFORWARDPOINTER%‰MOVE.LFMLBP(A4),D0…BACKWARDPOINTER+‰BEQ.S‚PAGAT6‹BRANCHIFNOBACKWARDPOINTER  **ŒMERGEWITHBACKWARDLINK* ‰MOVE.LD0,A1BACKWARDPOINTERA‰ADD.L‚D5,FMLUSED(A1)„ADDWHATGETSDISSOLVEDTOTOTALPAGESUSED&‰MOVE.LA2,(A1)‹BACK'SNEWFWDPOINTER‰BEQ.S‚PAGAT4ŒIFNONE-RETURN +‰MOVE.LA1,FMLBP(A2)†FWD'SNEWBACKPOINTER PAGAT4: ‰RTS–SUCCESS  ***ŒNOBACKPOINTER--CHANGEMASTERPOINTER* PAGAT6:'‰MOVE.LA2,LOWFREE(A5)„NEWLOWESTENTRY%‰BEQ„PAGAT4ŒRETURNIFALLMEMORYGONE #‰CLR.L‚FMLBP(A2)‰CLEARBACKPOINTER‰RTS‰PAGE*>*„SAVESTACKANDREGISTERSINCASE'WAITFORMEMORY'ISNEEDED* ‰IFNE‚WAITMEM PAGASVST:%‰BSR…SVXSTAK†SAVESTACKANDREGISTERS ;‰MOVE.B‚TCBXREGS+3(A6),TCBRPRI(A6)RESTORECURRENTPRIORITY‰RTS‰ENDC  *%*„RELEASEFREEMEMORYLISTSEMAPHORES* ‰IFNE„SHARMEMPAGARSM:‰MOVE.L‚(A7)+,A1…SAVERETURN PAGARS1:-‰MOVE.L‚(A7)+,D0…GETONEFREEMEMLISTHEADER%‰BEQ.SƒPAGARS2†BRANCHIFALLRELEASED &‰MOVE.L‚D0,A0ˆPUTHDRADDRINADDRREG‰TR0.VƒSEMFRMEM(A0)‰BRA…PAGARS1†GOGETNEXTONE PAGARS2:‰JMP…(A1)‰RETURN‰ENDC‰PAGE*>*„SEARCHMEMORYLISTFORPARTITIONCONTAININGPHYSICALADDRESS* PAGPHYA:*‰CMP.Bƒ#1,MAPMTYP(A1)ƒCHECKFORNULLENTRY‰BEQ…PAGPHY9ŠBRANCHTOSKIP '‰TST.WƒMAPMTYP(A1)†MEMORYTYPE,ISROM?)‰BMI.SƒPAGPA0‹IFYES,NOFMLHEADERSTUFF (‰MOVE.L‚MAPFMLP(A1),A0„A0-->FMLHEADER(‰CMP.LƒENDAVAIL(A0),A2ƒPHYSADDRTOP?‰BGE…PAGPHY9ŠBRANCHIFYES 1PAGPA1:‚CMP.LƒMAPSTRA(A1),A2ƒPHYSADDR>=BOTTOM?+‰BLT…PAGPHY10‰BRANCHIFNO-CAN'TALLOCATE -‰BTST„#SGPBOATR,D1…ISREQFORMEMMAPPEDI/O?(‰BNE' …PAGAER2ŠBRANCHIFYES-BADREQUEST $‰TST.WƒMAPMTYP(A1)†CHECKMEMORYTYPE2‰BMI…PAGPHY12‰BRANCHIFROM-NOALLOCATIONNEEDED 0‰MOVE.L‚MAPFMLP(A1),A5ƒA5=FREEMEMLISTHEADER ‰IFNE„SHARMEM‰PEA…(A5)SAVEHEADERONSTACK‰TR0.PƒSEMFRMEM(A5)‰ENDC  **†FINDFMLENTRY* &‰MOVE.L‚LOWFREE(A5),D0‚FIRSTFMLENTRY.‰BEQ…PAGALC9†BRANCHIFNOMEMORYAVAILABLENOW ‰LSL.Lƒ#8,D2†D2=#BYTESNEEDED+‰MOVE.L‚A2,A3†A2=STARTINGADDRESSREQUESTED‰ADD.LƒD2,A3†A3=TOPBOUNDRY‰LSR.Lƒ#8,D2†D2=#PAGES PAGPHY1:#‰MOVE.L‚D0,A4†CURRENTENTRYPOINTER*‰CMP.LƒA2,D0†ISCURRENTENTRYABOVESTART?,‰BGT…PAGALC9„BRANCHIFYES-MEMORYNOTAVAIL #‰MOVE.L‚FMLFREE(A4),D0‚#FREEPAGES"‰LSL.Lƒ#8,D0†CHANGEPAGESTOBYTES‰ADD.LƒA4,D0†TOPBOUNDRY$‰CMP.LƒA2,D0†ADDRWITHINFREESPACE?-‰BGT.SƒPAGPHY3„BRANCHIFYES-USETHISENTRY ‰MOVE.L‚(A4),D0„FORWARDPOINTER%‰BNE…PAGPHY1„LOOPBACKFORNEXTENTRY %‰BRA…PAGALC9„BRANCHIFNOMOREMEMORY  *)*…STARTINGADDRESSISWITHINCURRENTLINK* PAGPHY3:(‰CMP.LƒA3,D0†ENDINGADDRESSWITHINLINK?"‰BEQ…PAGALC3„BRANCHIFPERFECTFIT )‰BGT.SƒPAGPHY6„BRANCHIFMORETHANNEEDED ‰BTST„#SGPBOLES,D1ƒACCEPTLESS?‰BEQ…PAGALC9„BRANCHIFNO &‰SUB.LƒA2,D0†SUBTRACTADDRESSFROMTOP‰LSR.Lƒ#8,D0†CONVERTTOPAGES!‰MOVE.L‚D0,D2†CHANGEPAGESNEEDED&‰BRA…PAGALC3„BRANCHTOALLOCATEMEMORY  *(*†BUILDANOTHERLINKINFREEMEMORYLIST3*‰A4=POINTERTOCURRENTLINK…A3=POINTERTONEWLINK* PAGPHY6:%‰MOVE.L‚(A4),(A3)ƒNEWFORWARDPOINTER‰BEQ.SƒPAGPHY7…BRANCHIFFP=0 ‰MOVE.L‚(A4),A1…FORWARDENTRY9‰MOVE.L‚A3,FMLBP(A1)CHANGEBACKPOINTERINFORWARDENTRY PAGPHY7:*‰MOVE.L‚A3,(A4)…PREVENTRYFORWARDPOINTER+‰MOVE.L‚A4,FMLBP(A3)‚NEWENTRYBACKPOINTER+‰MOVE.L‚FMLUSED(A4),FMLUSED(A3)‚MEMORYUSED*‰CLR.LƒFMLUSED(A4)ƒNONEUSEDINPREVENTRY'‰SUB.LƒA3,D0‰#BYTESFREEFORNEWENTRY‰LSR.Lƒ#8,D0‰CONVERTTOPAGES(‰MOVE.L‚D0,FMLFREE(A3)‚SAVEINNEWENTRY,‰SUB.LƒD0,FMLFREE(A4)‚DEDUCTFROMPREVENTRY!‰BRA…PAGALC3‡GOFINISHALLOCATION  **ˆNEXTMEMMAPENTRY* PAGPHY9:&‰LEA…MAPENTSZ(A1),A1ƒNEXTMEMMAPENTRY,‰CMP.Wƒ#-1,MAPMTYP(A1)ƒTESTFORENDOFTABLE#‰BNE…PAGPHYA‹BRANCHIFMOREENTRIES PAGPHY10:#‰BTST„#SGPBOATR,D1†ISREQFORMMIO?!‰BEQ…PAGAER2‹BRANCHIFNO-ERROR PAGPHY12:‰MOVE.L‚A2,A3PHYSICALADDRESS‰CLR.LƒD4RETURNCODE&‰BRA…PAGALC4‹BRANCHTOCOMPLETERETURN‰ENDé=/*=/*†M68XXX.PAGEFREE.AF=/*-=/* Chain file to assemble M68XXX.PAGEFREE.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.PAGEFREE.LS=/*=/IFC \1ƒ=ARGM68XXX.PAGEFREE.LS=/ENDIF=/*5=ASM M68XXX.PAGEFREE.SA,M68XXX.PAGEFREE.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.MAP.EQ=/*}=/*=ENDééé( éééó‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.MAP.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.MAP.EQ‰LIST‰PAGE4PAGEFREE‚IDNT5,168xxxTRAP0--FREEPHYSICALMEMORY *¸3-6-79GGC3$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*%*„PAGEFREE‚--‚REV2.00ƒ5/25/79‚(HLD6)*2/18/81‚(HLD6)*Ž--‚TRAP0ROUTINE***„FREEPAGESEXECROUTINE0*…ENTRY:A0=STARTINGADDRESSOF1STPAGETOFREE*ŒD1=NUMBEROFPAGESTOFREE**…EXIT:SUCCESS‚RTS*ŒFAILEDƒRTSTOPC+2 *’01234567* USES REGISTERS D ****A*****‰SECTIONLEVEL01*‰XDEF„PAGEFREE ‰XDEF„SBPGFR ‰XREF.S‚MAPBEG‰PAGESBPGFR: PAGEFREE:#‰MOVEM.LA4-A5,-(A7)‚SAVEREGISTERS‰MOVE.L‚D1,D2ˆSEEIFPAGES<=0‰BGT.SƒPGFRM1‡BRANCHIFNO PGFRER1:&‰MOVEM.L(A7)+,A4-A5‚RESTOREREGISTERS,‰ADD.Lƒ#2,(A7)…CHANGERETURNADDRESS-ERROR PGFRTN1:‰RTS PGFRM1:#‰MOVE.L‚A0,A2ˆSAVESTARTINGADDRESS%‰MOVE.L‚MAPBEG,A1„STARTOFMEMORYMAP‰PAGE*3*„LOOKFORMEMORYPARTITIONCONTAININGTHISADDRESS* PGFRM2:+ˆCMP.B„#-1,MAPMTYP(A1)CHECKFORNULLENTRY'ˆBEQ.S„PGFRM4‡BRANCHTOSKIPNULLENTRY ,ˆMOVE.LƒMAPFMLP(A1),A5ƒADDRESSOFFMLHEADER'ˆCMP.L„ENDAVAIL(A5),A2ˆPHYSADDR=BOTTOM?#ˆBLT.S„PGFRER1†BRANCHIFNO-ERROR $ˆTST.W„MAPMTYP(A1)‚CHECKMEMORYTYPEˆBMI†PGFRTN1†RETURNIFROM #ˆLSL.L„#8,D1ˆCONVERTPAGESTOBYTES#ˆADD.L„A2,D1ˆD1=TOPOFAREATOFREE5ˆCMP.L„ENDAVAIL(A5),D1‚ISAREAPASTENDOFPARTITION?"ˆBHI†PGFRER1†BRANCHIFYES-ERROR &ˆBRA.S„PGFRML1†GOSEARCHFREEMEMLIST PGFRM4:&ˆLEA†MAPENTSZ(A1),A1‚NEXTMEMMAPENTRY$ˆCMP.W„#-1,MAPMTYP(A1)‚ENDOFTABLE?ˆBNE†PGFRM2‡BRANCHIFNO %ˆBRA†PGFRER1†MEMORYNOTFOUND-ERRORˆPAGE**ƒSEARCHFREEMEMORYLIST* PGFRML1:7ˆLEA†0,A1…INITIALIZEPOINTERTOAREACONTAININGADDRESS ˆIFNE…SHARMEMˆTR0.P„SEMFRMEM(A5)ˆENDC 5ˆMOVE.L‚LOWFREE(A5),D3„STARTCHECKINGATLOWESTENTRYücN :*ˆBEQ.SƒPGFRML4†THEREISNOMEMORYFREENOW PGFRML2:#ˆMOVE.L‚D3,A0ˆADDRESSOFNEXTENTRY.ˆCMP.LƒD1,A0ˆISAREATOFREEBELOWTHISENTRY?ˆBGE.SƒPGFRML3†BRANCHIFYES &ˆMOVE.L‚A0,A1ˆNO-ENTRYPRECEDESAREA#ˆMOVE.L‚(A0),D3†GETFORWARDPOINTERˆBNE.SƒPGFRML2†GOTESTIT PGFRML3:(ˆMOVE.L‚A1,D0‡ADDRESSOFPRECEEDINGAREAˆBEQ.SƒPGFRML4…THEREISNONE 1ˆMOVE.L‚FMLFREE(A1),D0„#PAGESINPRECEEDINGAREAˆLSL.Lƒ#8,D0‡CONVERTTOBYTES'ˆADD.LƒA1,D0‡ENDOFPRECEEDINGAREA+1!ˆCMP.LƒD0,A2‡ISTHEREANOVERLAP?ˆBLT…PGFRER2…YES--ERRORˆPAGE*%*‚OKTOFREEPAGES--BUILDNEWENTRY$*ƒA2=STARTINGADDROFAREATOFREE+*ƒA1=ADDROFLINKPRECEEDINGAREATOFREE&*ƒD1=ENDINGADDR+1OFAREATOFREE*ƒD2=NUMBEROFPAGESTO( FREE8*ƒD3=ADDROFLINKFOLLOWINGAREATOFREE(ORENDAVAIL)* PGFRML4:,ˆMOVE.L‚D2,FMLFREE(A2)„NUMBEROFPAGESFREEDˆMOVE.L‚D3,D0*‚TOPBOUNDRYˆBNE.SƒPGFRML5‹*‚ISTOP=0? 3ˆMOVE.L‚ENDAVAIL(A5),D0ƒ*‚YES-USEENDAVAILASTOP PGFRML5:$ˆSUB.LƒD1,D0*‚-ENDOFAREATOFREEˆLSR.Lƒ#8,D0*‚CONVERTTOPAGES'ˆMOVE.L‚D0,FMLUSED(A2)„*‚=#PAGESUSEDˆMOVE.L‚D3,(A2)‹FORWARDPOINTER%ˆMOVE.L‚A1,FMLBP(A2)†BACKWARDPOINTERˆBNE.SƒPGFRML6 &ˆMOVE.L‚A2,LOWFREE(A5)„NEWLOWESTLINKˆBRA.SƒPGFRML7ˆPAGE*(*ƒMERGEWITHPRECEEDINGAREAIFPOSSIBLE* PGFRML6:+ˆMOVE.L‚A2,(A1)ˆCHANGEPRE-LINKFORWARDPTRˆMOVE.L‚A2,D0Š*‚TOPBOUNDRYˆSUB.LƒA1,D0Š*‚-STARTOFAREAˆLSR.Lƒ#8,D0Š*‚CONVERTTOPAGES$ˆSUB.LƒFMLFREE(A1),D0*‚-PAGESFREE2ˆMOVE.L‚D0,FMLUSED(A1)*=PAGESUSED(PREVENTRY)4ˆBNE.SƒPGFRML7ˆTHEREARESOME-CANNOTMERGEENTRIES ˆMOVE.L‚FMLFREE(A2),D0&ˆADD.LƒD0,FMLFREE(A1)TOTALPAGESFREE*ˆMOVE.L‚FMLUSED(A2),FMLUSED(A1)‚PAGESUSED%ˆMOVE.L‚(A2),(A1)…NEWFORWARDPOINTER ˆMOVE.L‚A1,A2  *'*…MERGEWITHFOLLOWINGAREAIFPOSSIBLE* PGFRML7: ˆTST.LƒD3$ˆBEQ.SƒPGFRML9†THEREISNONEXTLINK "ˆMOVE.L‚D3,A1ˆADDRESSOFNEXTLINK,ˆMOVE.L‚A2,FMLBP(A1)CHANGEBACKWARDPOINTER0ˆTST.LƒFMLUSED(A2)‚ANYPAGESUSEDBETWEENLINKS?"ˆBNE.SƒPGFRML9†YES-CANNOTMERGE ˆMOVE.L‚FMLFREE(A1),D0&ˆADD.LƒD0,FMLFREE(A2)TOTALPAGESFREE*ˆMOVE.L‚FMLUSED(A1),FMLUSED(A2)‚PAGESUSED%ˆMOVE.L‚(A1),(A2)†NEWFORWARDPOINTERˆBEQ.SƒPGFRML9ˆFORWARDPTRIS0 ˆMOVE.L‚(A2),A1%ˆMOVE.L‚A2,FMLBP(A1)…NEWBACKWARDPTRˆPAGE*&*‚RELEASEALLUSERSWAITINGFORMEMORY*PGFRML9: ‰IFNEƒWAITMEM‰MOVE.BMEMTYPE(A5),D1#‰AND.B‚#$F0,D1‰GETMEMORYTYPEONLY%‰MOVE.LMAPBEG,A1‡STARTOFMEMORYMAP PGFREL2:/‰CMP.B‚MAPMTYP(A1),D1‚DOESMEMORYTYPECOMPARE?‰BNE.S‚PGFREL6‰BRANCHIFNO /‰MOVE.LMAPFMLP(A1),A4‚FREEMEMORYLISTPOINTER PGFREL4:%‰BTSTƒ#6,SEMWTMEM(A4)ANYONEWAITING?#‰BEQ.S‚PGFREL6‰BRANCHIFNOWAITORS ‰TR0.V‚SEMWTMEM(A4)(‰BRA„PGFREL4‰GOBACKTOFREEALLWAITORS PGFREL6:&‰LEA„MAPENTSZ(A1),A1‚NEXTMEMMAPENTRY$‰CMP.W‚#-1,MAPMTYP(A1)‚ENDOFTABLE?‰BNE„PGFREL2‰BRANCHIFNO ‰ENDC PGFRENDR: ‰IFNEƒSHARMEM‰TR0.V‚SEMFRMEM(A5)‰ENDC &‰MOVEM.L(A7)+,A4-A5ƒRESTOREREGISTERS ‰RTSRETURN  **…ERROR-PAGESCANNOTBEFREED* PGFRER2:"‰ADD.L‚#2,(A7)„INCREMENTRETURNPC ‰BRA„PGFRENDR‰ENDééé=/*=/*†M68XXX.PAUSE.AF=/**=/* Chain file to assemble M68XXX.PAUSE.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.PAUSE.LS=/*=/IFC \1ƒ=ARGM68XXX.PAUSE.LS=/ENDIF=/*/=ASM M68XXX.PAUSE.SA,M68XXX.PAUSE.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDé) ééééé‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE3PAUSE„IDNTƒ5,1…68xxxTRAP0--PAUSEDURINGEXECTOUR*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*PAUSE„2.00„**ˆ*’**ˆ*7616ƒ06/29/79‚**ˆ*HLD6ƒ02/08/81‚**ˆ*********************(*…PAUSEWHILEWAITINGFORIOTOCOMPLETE*%*…REGISTERUSAGE:ALLREGISTERSSAVED*‰SECTIONLEVEL00* ‰XDEFƒPAUSE ‰XDEFƒSBPAUSE ‰XREFƒDISPATCH ‰XREFƒSVXSTAK‰PAGE*.*ˆPUTTHISTASKTOSLEEP(STORETHEREGISTERS)*ˆANDJUMPTOTHEDISPATCHER* SBPAUSE:PAUSE:<‰MOVE.B„#EXECPRIO,TCBLPRI(A6)‰TASKINTERM-SETPRIORITYHI‰BSR‡SVXSTAK—SAVEEXECSTACK(‰BRA‡DISPATCH–GOSTARTUPSOMEOTHERJOB‰ENDéééé.=/*=/*†M68XXX.POWRFAIL.AF=/*-=/* Chain file to assemble M68XXX.POWRFAIL.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.POWRFAIL.LS=/*=/IFC \1ƒ=ARGM68XXX.POWRFAIL.LS=/ENDIF) =/*5=ASM M68XXX.POWRFAIL.SA,M68XXX.POWRFAIL.RO,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDéééééé'‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰LIST‰PAGE4POWRFAILIDNTƒ5,1ƒ68xxxPOWERFAILINTERRUPTHANDLER*ˆ*********************ˆ*POWRFAIL1.00„**ˆ*’**ˆ*HLD6ƒ06/24/81‚**ˆ**********************…POWERFAILINTERRUPTROUTINE*@*…THISROUTINEISUSEDONLYTORESPONDTOAPOWERFAILINTERRUPT-*…ONAVERSAMODULE01(AUTOVECTOR-LEVEL7)*%*…REGISTERUSAGE:ALLREGISTERSSAVED*‰SECTIONLEVEL00**‰XDEFƒPOWRFAIL‰XREF.SCRASHSAV‰PAGE POWRFAIL:2‰MOVEM.LD0-D7/A0-A7,CRASHSAV+8ƒSAVEALLREGISTERS'‰MOVE.W‚(A7),CRASHSAV+6ŠSAVESTATUSREG+‰MOVE.L‚2(A7),CRASHSAV‹SAVEPROGRAMCOUNTER  D*********************************************************************7*„CODETOCALLAPOWERFAILROUTINECANBEENTEREDHERE*D********************************************************************  *)*ˆIfthereisareturn,reloadregisters.* !‰OR.W„#$700,SR†INHIBITINTERRUPTS5‰MOVEM.LCRASHSAV+8,D0-D7/A0-A7ƒRESTOREALLREGISTERS ‰RTE“GOBACK‰ENDééé* 03=/*=/*†M68XXX.PSTATE.AF=/*+=/* Chain file to assemble M68XXX.PSTATE.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.PSTATE.LS=/*=/IFC \1ƒ=ARGM68XXX.PSTATE.LS=/ENDIF=/*1=ASM M68XXX.PSTATE.SA,M68XXX.PSTATE.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééé9‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE;PSTATEƒIDNTƒ5,1„68xxxDIRECTIVE--SETSTATEOFEXMON'EDTASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡**************************2*‡*‚PSTATE‹*ƒSETCURRENTSTATEOFTARGETTASK*‡*‚REV3.0011/25/81HLD6**‡*‹07/15/81…**‡*****************************‹ENTRY:A6HASADDROFTCB *’A0HASPARAMETERBLOCKADDRESS*—0-TASKNAMEOFTARGETTASK*—4-SESSIONCODE*—8-ADDRESSOFBUFFER**‹EXIT:D0HASRETURNCODE*’D0=0„GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST5*ŠRTCDSTAT-10ƒTARGETTASKNOTWAITINGFORTHISEXMON0*ŠRTCDADR1-12ƒBUFFERNOTINCALLER'SADDRSPACE**‰SECTIONLEVEL04* ‰XDEF†PSTATE ‰XREF.S„EXMONVR‰PAGEPSTATE:.‰MOVE.L„A4,A3”Saveaddressofparameterblock.-‰BTST†#TSKSWTEM,TCBSTATE(A5)ƒISTASKWAITING?.‰EXIT.EQƒRTCDSTAT‘ERROR-Taskisnotwaiting. **ˆCheckforvalidrequest.* 1PSPBLEN‚EQU‡74’Equateforparameterblocklength.!‰MOVE.L„#PSPBLEN,D5‰BUFFERLENGTH2‰BSR‡EXMONVRDON'TCOMEBACKUNLESSVALIDREQUEST.  * *ˆPutdatafrombufferintotcb.* ‰MOVE.L„D6,A4”ADDRESSOFBUFFER$‰LEA‡TCBD0(A5),A1REGISTERSAVEAREA‰MOVE.W„#16-1,D0 PSTA* T6:2‰MOVE.L„(A4)+,(A1)+ŽMOVEREGISTERSD0-D7ANDA0-A7,‰DBRA†D0,PSTAT6DECREMENTCOUNTOFREGISTERS 6‰MOVE.L„TCBD0(A5),TCBXREGS(A5)ƒCHANGED0FOREXECALSO4‰MOVE.L„TCBA0(A5),TCBXA0(A5)…CHANGEA0FOREXECALSO,‰MOVE.L„(A4)+,TCBPC(A5)ŠMOVEPROGRAMCOUNTER%‰MOVE.W„(A4)+,D0‘MOVESTATUSREGISTER$‰MOVE.B„TCBEMMSK(A5),D6ŠSAVEOPTIONS*‰MOVE.L„(A4)+,TCBEMMSK(A5)‡MOVEEXMONMASK'‰AND.B…#$03,TCBEMMSK(A5)ˆSAVEONLYMASK‰AND.B…#$F8,D6’OPTIONS)‰OR.B†D6,TCBEMMSK(A5)ŠRESTOREOLDOPTIONSBSK'‰MOVE.B„D0,TCBCC(A5)SAVECONDCODEREG =‰BTST†#TSK2RTEX,TCBSTAT2(A5)ƒIfthetaskisnotinthereturn&‰EXIT.EQƒSUB–toexecstate,thenexit. -PSTATA6‚EQU‡$38–Equatesforfieldswithinthe'PSTATSR‚EQU‡$44–pstateparameterblock.PSTATPC‚EQU‡$40 *°Else,movethe,‰MOVE.L„PSTATA6-PSPBLEN(A4),TCBSTKA6(A5)†A6,0‰MOVE.W„PSTATSR-PSPBLEN(A4),TCBSTKSR(A5)†SR,and<‰MOVE.L„PSTATPC-PSPBLEN(A4),TCBSTKPC(A5)†PC,fromthepstate*°parameterblock,tothe *°execstack,‰EXIT†SUB›andexit. ‰ENDééééé‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.ENV.EQ*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.ENV.EQ‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE‰IFEQƒCHIPTYPE-68000.PVSEM„IDNTƒ5,1†68000TRAP0--SEMAPHOREROUTINE‰ENDC‰IFEQƒCHIPTYPE-68010.PVSEM„IDNTƒ5,1†68010TRAP0--SEMAPHOREROUTINE‰ENDC*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*PSEM4‡2.00**ˆ*GGC303/02/79„**ˆ*761605/18/79„**ˆ*HLD602/08/81„**ˆ*********************$*ƒ'P'‚SEMAPHORE‚CHECKEREXECROUTINE@*ˆROUTINEISUSEDTOQUEUEUPTASKFOREXCLUSIVEUSEOFRESOURCE'*ˆENTRY:ƒA0‚POINTSTOSEMAPHOREADDRESS0*(A0)HASTESTANDSETFLAGFORMULTIPROCESSORS9*(A0)(15BITS)HASNUMBERDEEPINWAITLIST0=AVAILABLE.*2(A0)ADDRESSOF1STTCBINWAITLINKEDLIST#*‘A6‚HASADDRESSOFREQUESTOR'STCB?*ˆEXIT:‚IFRESOURCEAVAILABLE-MARKASBUSYANDRTEBACKTOTASK:*IFBUSY-PUTTASKTOSLEEP,PUTONWAITLIST,BRATODISP*&*ˆREGISTERUSAGE:NONELOSTORCHANGED*‰SECTIONLEVEL00* ‰XDEFƒSBP ‰XDEFƒPSEM ‰XREF.SDISPATCH‰XREF.SEXCSTACK‰XREF.SKILLER‰PAGESBP:PSEM:-‰MOVE.WSR,-(A7)„Savecurrentinterruptlevel=‰OR.Wƒ#$700,SR„TURNOFFINTERRUPTS‚???+ ??????????????????????? PSEM_10:*‰TAS(A0)ŒTEST-AND-SETMULTIPROCESSORFLAG0‰BMI.SPSEM_10‡THISFLAGMUSTBEZEROTOPROCEED ‰MOVE.W(A0),D0†GETUSECOUNT+‰LSL.W‚#1,D0ˆSHIFTOUTMULTI-PROCESSORFLAG!‰ASR.W‚#1,D0ˆMAKECOUNT=16BITS‰SUB.W‚#1,D0ˆDECREMENTCOUNT>‰MOVE.WD0,(A0)†RESAVEIT(IFPOS,ALSOCLEARMULTI-PROCFLAG)5‰BMI.SPSEM_20‡NEGATIVE(LESSTHANZERO)MEANSINUSE 1‰MOVE.W(A7)+,SR…Restorepreviousinterruptlevel‰RTS’RETURNTOCALLER  *1*ˆSOMEOTHERTASKISUSINGTHISCRITICALRESOURCE.*ˆPUTTHISTASKTOSLEEP(STORETHEREGISTERS)1*ˆPUTTHETASKINTHEWAITLISTFORTHISRESOURCE*ˆANDJUMPTOTHEDISPATCHER* PSEM_20:'‰BSR.S‚SVXSTAK…SAVESTACKANDREGISTERS SQ\QdKl-‰SUB.B‚#2,TCBSSP(A6)RemoveSRfromTCBstack-‰BSR.S‚PSWAIT†PUTTASKONSEMAPHOREWAITLIST +‰BCLRƒ#HIBIT,(A0)CLEARMULTIPROCESSORFLAG!‰MOVE.W(A7)+,SR„ALLOWINTERRUPTS&‰TR0.READY‚(A6)…PUTTASKONREADYLIST(‰BRADISPATCH‚GOSTARTUPSOMEOTHERJOB‰PAGE*6*†SUBROUTINEPSWAIT--PUTTASKONSEMAPHOREWAITLIST* ,‰XDEF‚PSWAIT„PUTTASKONSEMAPHOREWAITLIST  PSWAIT:1‰BSET#TSKSSMWT,TCBSTATE(A6)„BLOCKEDONSEMAPHORE-‰CLR.LTCBSEM(A6)ŒNOLINKTONEXTSEM4WAITER&‰MOVE.L2(A0),D0CHECK1STTCBINLINK%‰BNE.S‚PSWAI_10NONZERO=THEREWASONE 2‰MOVE.LA6,2(A0)CURRENTTASKISONLYTASKONLIST‰RTS PSWAI_10: ‰MOVE.LD0,A5CURRENTLISTENTRY7‰MOVE.LTCBSEM(A5),D0ˆGETLINKTONEXTTCBINWAITLIST.‰BNE.S‚PSWAI_10BRANCHIFTHISISNOTLASTONE :‰MOVE.LA6,TCBSEM(A5)‚PUTCURRENTTASKATENDOFWAITLIST‰RTS‰PAGE*@*…SUBROUTINESVXSTAK--SAVEREGISTERSANDEXECSTACKTOPREPARE*›FORRETURNTOEXEC* +‰XDEF„SVXSTAK„SAVEEXECSTACKANDREGISTERS  SVXSTAK:$‰MOVEM.LƒA4-A5,-(A7)“Saveregisters. 1‰MOVE.B„TCBRPRI(A6),D0Savepriorityforrestore.0‰MOVE.B„#EXECPRIO,TCBRPRI(A6)‰Setexecpriority.4‰BSET†#TSK2RTEX,TCBSTAT2(A6)ˆSet'rettoexec'flag. :‰MOVEM.LƒD0-D7/A0-A6,TCBXREGS(A6)†Savetheexecregisters,,‰MOVE.L„USP,A4˜andtheuser'sstackpointer.‰MOVE.L„A4,TCBUSP(A6)  **ˆCheckstackdepth.* 5‰MOVE.L„EXCSTACK,D0‰GetbottomofexecstackintoD0. 0‰LEA‡12(A7),A5‹Adjuststackforsubroutinecall.%‰SUB.L…A5,D0D0containsstackdepth.;‰CMP.L…#TCBROOM,D0‰Isthereroominthetcbforthisstack.‰BGT.S…NO_ROOMBranchifno.  **ˆSavethesystemstackdepth,*ˆandgetpointerintotcb.* 2‰MOVE.B„D0,TCBSSP(A6)‘Savethesystemstackdepth.,‰LEA‡$100(A6),A4“Getapointerintothetcb,(‰SUB.L…D0,A4™equivalentindepthtossp.  *%*ˆSavethesystemstackintothetcb.* /‰LSR.W…#2,D0Preparecounterforlongwordmove.,‰BCC.S…TESTBranchifnoextrawordtomove. (‰MOVE.W„(A5)+,(A4)+‰Movetheextraword,-‰BRA.S…TESTandgotocheckformoretomove. LOOP:$‰MOVE.L„(A5)+,(A4)+‰Movealongword. TEST:%‰DBRA†D0,LOOPCheckformoretomove. '‰MOVEM.Lƒ(A7)+,A4-A5†Restoreregisters. ‰RTS›Done. NO_ROOM: ‰BSR‡KILLER*‰PAGE*ˆ*********************ˆ*VSEM4‡2.00* *ˆ*GGC3**ˆ*761605/18/79„**ˆ*HLD602/08/81„**ˆ*********************ƒ'V'‚SEMAPHOREROUTINE%*ˆRELEASEEXCLUSIVEUSEOFARESOURCE*ˆENTRY:ƒA0‚POINTSTOSEMAPHORE0*(A0)HASTESTANDSETFLAGFORMULTIPROCESSORS9*(A0)(15BITS)HASNUMBERDEEPINWAITLIST0=AVAILABLE.*2(A0)ADDRESSOF1STTCBINWAITLINKEDLIST *‘A6‚HASADDRESSOFCALLER'STCB(*ˆEXIT:‚IFNOTASKINWAITLISTJUSTRTE2*IFSOMEONEISWAITING-TRANSFER1STTOREADYLIST *›01234567*ˆREGISTERUSAGE:‚D**™AP*‰SECTIONLEVEL00* ‰XDEFƒSBV ‰XDEFƒVSEM‰PAGESBV:VSEM:!‰MOVE.WSR,-(A7)„SUBROUTINEENTRY=‰OR.Wƒ#$700,SR„TURNOFFINTERRUPTS‚?????????????????????????? VSEM+ _10:*‰TAS(A0)ŒTEST-AND-SETMULTIPROCESSORFLAG0‰BMI.SVSEM_10‡THISFLAGMUSTBEZEROTOPROCEED ‰MOVE.W(A0),D0†USECOUNT+‰LSL.W‚#1,D0ˆSHIFTOUTMULTI-PROCESSORFLAG‰ASR.W‚#1,D0ˆMAKECOUNT=16BITS ‰ADD.W#1,D0‰INCREMENTUSECOUNT'‰BLE.SVSEM_20‡BRANCHIFTASKTOENABLE :‰MOVE.WD0,(A0)†RESAVEUSECOUNTANDRESETMULTI-PROCFLAG1‰MOVE.W(A7)+,SR…Restorepreviousinterruptlevel‰RTS‘RETURNTOCALLER  *7*ˆSOMEOTHERTASKISWAITINGFORTHISCRITICALRESOURCE7*ˆTHECURRENTTASKWEARERUNNINGISGIVINGITUPSO...4*ˆFINDTHE1STWAITERANDTRANSFERITTOREADYQUEUE* VSEM_20:!‰MOVE.LA1,-(A7)…SAVECALLER'SA11‰MOVE.L2(A0),A1…GETTHE1STTCBINTHEWAITLIST5‰MOVE.LTCBSEM(A1),2(A0)‚UNLINK...NEW1STONEINLIST)‰BCLRƒ#HIBIT,D0ƒCLEARMULTIPROCESSORFLAG‰MOVE.WD0,(A0)…SAVEUSECOUNT'‰CLR.L‚TCBSEM(A1)ƒSETNOSEMAPHORELINK;‰BCLRƒ#TSKSSMWT,TCBSTATE(A1)„CLEAR'WAITONSEMAPHORE'FLAG#‰MOVE.L(A7)+,A1…RESTORECALLERSA1+‰MOVE.W(A7)+,SR…Restorepreviousinterrupt‰RTS‘CONTINUEONWITHTASK‰ENDééééééé„'M68XXX RCVSA AF€€qqRCVSA SA‰‰ ŠqqRDTIMER AFššqqRDTIMER SA££ \qqREADY AF´´qqREADY SA½½ÃqqRELINQ AFÖÖqqRELINQ SAßß*qqRESUME AFèèqqRESUME SAññ9qqREXMON AFúúqqREXMON SA qqRMS AFqqRMS SA|qqRMSPATCHAF..qqRMSPATCHSA77$qqRQSTPA AF@@qqRQSTPA SAII"PqqRSTATE AFrrqqRSTATE SA{{ dqq, =/*=/*†M68XXX.RCVSA.AF=/**=/* Chain file to assemble M68XXX.RCVSA.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.RCVSA.LS=/*=/IFC \1ƒ=ARGM68XXX.RCVSA.LS=/ENDIF=/*/=ASM M68XXX.RCVSA.SA,M68XXX.RCVSA.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.SEG.EQ=/*}=/*=ENDééééééx‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.SEG.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.SEG.EQ‰LIST‰PAGE:RCVSA„IDNTƒ5,1„68xxxDIRECTIVE--RECEIVESEGMENTATTRIBUTES*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*#*„RCVSAƒ--REV2.00ƒ09/30/81‚(HLD6)*Œ--TRAP1ROUTINE*%*…PURPOSE:‚RECEIVESEGMENTATTRIBUTES*'*‰ENTRY:‚A6HASREQUESTOR'STCBADDRESS(*‘A4HASSEGMENTPARAMETERBLOCKADDRESS*–0-TARGETTASKNAME*–4-SESSIONCODE *–8-OPTIONS/*šBIT14,SEGMENTIDENTIFIEDBYLOGICALADDRESS#*¢(ELSEIDENTIFIEDBYSEGMENTNAME)+*šBIT13,RETURNONLYLOGICALADDRESSINA0*¢(NOBUFFERPROVIDED)*•12-SEGMENTNAME*•16-LOGICALADDRESS#*•24-BUFFERADDRESS‚(IFBIT13=0)*ŠEXIT:ƒD0HASRETURNCODE)*’D0=0‚GOODRETURN,SEGMENTDEALLOCATED*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST'*ŠRTCDNFND-7ƒSEGMENTNOTFOUNDINTST;*ŠRTCDADR1-12ƒBUFFERADDRESSNOTINCALLER'SADDRESSSPACE*‰SECTIONLEVEL03* ‰XDEF„RCVSA‰PAGERCVSA:"‰MOVE.W‚SGPBOPT(A4),D7„GETOPTIONS.‰BTST„#SGPBOPAD,D7†WANTPHYSICALADDRESSONLY?‰BNE.SƒRCVSA5A  **ˆGetoutputbufferaddress.* +‰TR0.LOGPHY‚,SGPBBUFF(A4),#18%‰BRA.SƒRCVSA5ŠBRANCHIFADDRESSFOUND ‰NOP&‰EXIT„RTCDADR1ŠERROR-BADBUFFERADDR  **ˆFindsegmentintargettst.* RCVSA5:!‰MOVE.L‚D6,A2‰SAVEBUFFERADDRESS RCVSA5A:.‰BTSTƒ#SGPBOLAD,SGPBOPT(A4)‚ISLOGADDRGIVEN?‰BEQ.SƒRCVSA6BRANCH, IFNO (‰TR0.LOGPHY‚,SGPBLA(A4),#4 ‰BRA.SƒRCVSA8 ‰BRA.SƒRCVSA5E ‰TST.WƒD5‰NOTHINGFOUND? ‰BEQ.SƒRCVSA5E„BRANCHIFNOTHING *‰TST.BƒTSTCTL+1(A0,A5)„ISITMMIOSEGMENT?‰BNE.SƒRCVSA8†BRANCHIFYES RCVSA5E:]Š.(‰EXIT„RTCDNFNDERROR-SEGMENTNOTFOUND  *"*ˆFindsegmentusingsegmentname.* RCVSA6:'‰TR0.FNDSEG‚,SGPBNAME(A4)%‰BRA.S…RCVSA8ŠBRANCHIFSEGMENTFOUND ‰BRA‡RCVSA5E  *%*ˆMovesegmentinformationtobuffer.*  RCVSA8ƒCLR.LƒD0)‰MOVE.W‚TSTLB(A0,D5),D0ˆPHYSOFFSETTOD07‰BTST„#SGPBOPAD,SGPBOPT(A4)‚WANTPHYSICALADDRESSONLY?‰BNE.SƒRCVSA10BRANCHIFYES "‰ADD.WƒTSTPO(A0,D5),D0ˆ+LOGBEGIN‰LSL.L‚#8,D0“*256=PHYSADDR*‰MOVE.L‚D0,14(A2)SAVEPHYSADDRINBUFFER‰CLR.LƒD0ˆCLEARFORSHORTLOAD4‰MOVE.L‚TSTANAME(A0,D5),0(A2)ƒSEGMENTNAMEINBUFFER(‰MOVE.W‚TSTAATTR(A0,D5),4(A2)ƒATTRIBUTES1‰BCLR„#SEGAUSED,4(A2)ˆCLEAR'RESVEDFOREXEC'BIT%‰MOVE.W‚TSTLB(A0,D5),D0ˆLOGICALBEGIN‰LSL.Lƒ#8,D0’CHANGETOBYTES'‰MOVE.LƒD0,6(A2)ŽSAVEBEGINNINGADDRESS ‰CLR.LƒD0#‰MOVE.W‚TSTLE(A0,D5),D0ˆLOGICALEND‰LSL.L‚#8,D0“CHANGETOBYTES‰ADD.Bƒ#$FF,D0ENDOFPAGE$‰MOVE.L‚D0,10(A2)ŽMOVEENDTOBUFFER!‰EXIT†SUB’exit(subroutineexit); RCVSA10:$‰LSL.Lƒ#8,D0’CONVERTPAGETOADDRESS.‰MOVE.L‚D0,TCBA0(A6)‹PUTLOGICAL‚ADDRESSINA0!‰EXIT†SUB’exit(subroutineexit);‰ENDééé=/*=/*†M68XXX.RDTIMER.AF=/*,=/* Chain file to assemble M68XXX.RDTIMER.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.RDTIMER.LS=/*=/IFC \1ƒ=ARGM68XXX.RDTIMER.LS=/ENDIF=/*1=ASM M68XXX.RDTIMER.SA,M68XXX.RDTIMER.RO,\1;RZ=46=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDéééé- éé’-RDTIMERƒIDNTƒ5,1M68xxx--Readssystemtime.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***<***…FILE:‚RDTIMER--GETSTHECURRENTTIMEOUTOFSYSPAR******É***D***…ENVIRONMENT:‚PartoftheRMS68KexecfortheMotorola68000.‡***(***‡Copyright1983byMotorola,Inc.¢******É***G***…FUNCTION:‚Thisroutinereturnsthetimemaintainedbythetimer„******‡logic.‚Onreturn,°***C***‰D1=the#ofmillisecondssincemidnightatwhichthelast…******Žtimertickoccurred.§***C***‰D0=0.‚Thisusedtobethe#ofmicroseconds,butitisn't„***?***Žrealistictothinkthatthefigurewasevermeaningful.„******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revisionhistory(addnewchangestotop).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------?*…11/27/84‚SteveFranckƒCreatedfromadevice-specificversion.* * *‚XDEF's.*$ŠXDEFƒRDTIMERŒEntrypt.forTRAP#0.(ŠXDEFƒSBRDTIMŒEntrypt.forsubroutines.  **‚XREF'sfromSYSPAR.*ŠXREF.SMIDNIGHT ŠXREF.SNSEŠXREF.STIME_LEFT  **‚Includedfiles:*„9995.&.STR.EQ*„9995.&.UTILITY.MC*„9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.UTILITY.MCŠINCLUDE9995.&.INTERRUP.MCŠLISTŠPAGE ŠSECTIONLEVEL00  SBRDTIM:RDTIMER: 0ŠPUSHƒSR‘Wemustdothiswithinterruptsmasked,6ŠDISABLE_INTERRUPTSˆincasewetakeatimerinterrupt. *5*‚Calculate‚(#ofmillisecondssincelastmidnight)==*[(timeofNSEinmsecs)-(timeleftuntilNSEinmsecs)]#*ª-(timeoflastmidnightinmsec)›E¤G*‚NSEstandsforNextSignificantEvent,andistheabsolutetimevalueJ*‚inmsecswhenwenextneedtotakesomethingoffthePeriodicActivationK*‚Table(PAT).‚Recallthattheclockisa31-bit(not32-bit!)numberwhichB*‚wrapsaroundat2**31=0,sowehavetodo"31-bitarithmetic."*%ŠMOVE.LNSE,D1D1<--msectimenow=:ŠSUB.L‚TIME_LEFT,D1‡(timeofNSE)-(timeleftuntilNSE)./ŠSUB.L‚MIDNIGHT,D1ˆD1<--msecsincemidnight=1*Ÿ(msectimenow)-(msectimeatlastmidnight).3ŠBCLRƒ#31,D1Theresultisa31-bitnumber,sozero%*§outthehighbit,whichisgarbage. *J*‚Alwaysset#ofmicrosecondstozero,sincewearereallyonlyreturning6* the millisecond time of the last tick that occurred.*#ŠMOVEQ‚#0,D0ŽD0<--0microseconds.  +ŠPOP„SR‘Restoreinterruptlevelandreturn.ŠRTS—*  ŠEND- éééé=/*=/*†M68XXX.READY.AF=/**=/* Chain file to assemble M68XXX.READY.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.READY.LS=/*=/IFC \1ƒ=ARGM68XXX.READY.LS=/ENDIF=/*.=ASM M68XXX.READY.SA,M68XXX.READY.RO,\1;RZ=055=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééé¬8READY…IDNTƒ5,1M68xxxRMSTRAP0Puttaskonreadylist.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***4***…FILE:‚READY--PUTATASKONTHEREADYLIST.—******É***D***…ENVIRONMENT:‚PartoftheRMS68KexecfortheMotorola68000.‡***(***‡Copyright1983byMotorola,Inc.¢******É***H***…FUNCTION:‚TakestheTCBforataskandputsitonthereadylistƒ***E***‡accordingtoitsrunpriority.‚Therearevariousentrypoints„***D***‡tothismodulewhichprovideminorvariationsonthistheme.†******É******…NOTES:¾******É***E***…REGISTERU. SAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SRhi„SRlo(CCR)…******‡D:ƒDƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD******‡A:ƒAƒ.ƒPƒ.ƒ.ƒ.ƒ.ƒP ******É******É******…ENTRYCONDITIONS:³***>***‡A0ƒ=ptrtoTCBofthetasktobeaddedtoreadylist.Š******É***-***…EXITCONDITIONSDIFFERENTFROMENTRY:Ÿ******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revisionhistory(addnewchangestotop).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------G*†8/15/83‚SteveFranckƒMadeCOMINTentrypointsettherunningpriority1*žlikemostoftheotherroutinesdo.‚Rewrotethe2*žTCBsearchroutinetoexecutefaster(interrupts*žaremaskedduringsearch).*†2/08/81‚HLD6*†5/18/79‚7616*†3/06/79‚GGC3* * *‚XDEF's.*8ŠXDEFƒREADY,SBREADY†Normalentrypointstothisroutine. 'ŠXDEFƒSBRYRELQ‹EntrypointfromRELINQ.5ŠXDEFƒSBRYEXT1‹EntrypointfromEXIT2(TRAP#1exit).:ŠXDEFƒSBRYEXIR‹EntrypointfromEXITR(exitfromexception*§processing).µ5¾VÆ96ŠXDEFƒSBRYXMON‹EntrypointfromEXMONreturn(REXMON).(ŠXDEFƒSBRYDLAY‹EntrypointfromCKDELAY.&ŠXDEFƒSBRYACKŒEntrypointfromAKRQST.)ŠXDEFƒSBRYSTRT‹EntrypointfromTSTSTART.0ŠXDEFƒSBRYWAKE‹EntrypointfromWAKEUPandWAIT.2ŠXDEFƒSBRYASRŒEntrypointfromASRINTandWTEVENT.+ŠXDEFƒSBRYGETŒEntrypointfromASQ=GT_EN.'ŠXDEFƒSBRYCINT‹EntrypointfromCOMINT. * *‚XREF's.*9ŠXREF.SPREEMPT_FLAG‡SYSPARflagwhichsignalsapreempt.;ŠXREF.SREADYHDŒSYSPARpointertoheadentryinreadylist..ŠXREF.SRUNNERSYSPARpointertorunningtask.   **‚Includedfiles:*8*‰UTILITY.MCMacrosofgeneralutility(e.g.PUSH,POP).7*‰INTERRUP.MCMacrosusefulindealingwithinterrupts.2*‰STR.EQ”EquatesforsupervisorcodeunderRMS68K.4*‰TCB.EQ”EquatesrelatingtotheTaskControlBlock.*ŠNOLISTŠINCLUDE9995.&.UTILITY.MCŠINCLUDE9995.&.INTERRUP.MCŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TCB.EQŠLIST  ŠSECTIONLEVEL00ŠOPT„BRSŠPAGE*J*‚ThesearethespecializedentrypointsforallthevariousroutinesthatL*‚wanttoputataskonthereadylist,butwanttofiddlewiththepriority*‚first.* SBRYRELQ: 2ŠMOVEQI$F0,D0Settherunpriorityofthetaskto>ŠAND.B‚TCBCPRI(A0),D0…thecurrentprioritywiththelow4bits#ŠMOVE.BD0,TCBRPRI(A0)…settozero.6ŠBRA„SBREADYŒThenjustgotothenormalREADYroutine.  SBRYEXT1: SBRYEXIR: SBRYXMON: SBRYDLAY:SBRYACK: SBRYSTRT: SBRYWAKE:SBRYASR:SBRYGET: SBRYCINT: CŠMOVE.BTCBCPRI(A0),TCBRPRI(A0)ƒResettherunpriorityforthetask*§toitscurrentpriority.  *,*…FALLTHROUGHtothemainREADYroutine!!!!*ŠPAGE*>*…NOTE--Otherroutinesfallintothisroutinefromabove!!!!* READY:SBREADY:  *(*‚Seeifhe'salreadyonthereadylist.* *ŠPUSHƒSR‘SavetheSRwewereenteredwith.9ŠDISABLE_INTERRUPTSˆDisableinterruptswhileweworkwith*§thevolatileTCBchain.>ŠBSETƒ#TSK2NRDY,TCBSTAT2(A0)‚Setthebitthatsaysthisguyis6ŠIF…THENŠonthereadylist.‚Ifhewasn'talready,  *.*‚He'snot;getsetuptoputhimonthelist.* +ŠSAVEƒD1/A2ŽSaveregisterswe'llblowaway.>ŠLEA„READYHD-TCBREADY,A2‚A2<--addresssuchthatTCBREADY(A2)(*§referstothereadylistheadpointer.@ŠMOVE.BTCBRPRI(A0),D0…D0.B<--priorityoftasktoputonlist.  *>*‚SearchthelistforaTCBoflowerprioritythanthisguy's.* ŠREPEAT <ŠMOVE.LTCBREADY(A2),D1„D1<--ptrtonextTCBinthechain.6ŠBEQ„ADD. _HIMŒIfwehittheendofthelist,justexit. 4ŠEXG.L‚D1,A2ŽA2<--ptrtotheTCBwe'relookingat.#*§D1<--ptrtoTCBjustbeforeit.BŠUNTIL.BD0TCBRPRI(A2)‚KeeploopinguntilwefindaTCBwith'*§aprioritylowerthanourguytoadd. 5ŠEXG.L‚D1,A2ŽD1<--ptrtotheTCBoflowerpriority.#*§A2<--ptrtoTCBjustbeforeit.ŠPAGE*M*‚Eitherwefoundsomebodyoflowerprioritythantheguywe'retryingtoaddK*‚orwehittheendofthechain.‚Eitherway,wewanttoaddthenewguyto5*‚thelistbetweentheTCB'spointedtobyA2andD1.* ADD_HIM:CŠMOVE.LD1,TCBREADY(A0)„Setourforwardlinktopointtotheguywe'*§foundtobeoflowerpriority(or0).AŠMOVE.LA0,TCBREADY(A2)„Setforwardlinkoftheguywewanttobe *§aftersothatitpointstous.ŠMOVE.L‚RUNNER,A2ŠIF.B„D0TCBRPRI(A2)THENŠST†PREEMPT_FLAGŠENDI !ŠRESTORED1/A2Restoreregisters. ŠENDI 2ŠPOP„SR‘RestoretheSRwesavedonentry&return.ŠRTS—*    ŠENDéé=/*=/*†M68XXX.RELINQ.AF=/*+=/* Chain file to assemble M68XXX.RELINQ.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.RELINQ.LS=/*=/IFC \1ƒ=ARGM68XXX.RELINQ.LS=/ENDIF=/*1=ASM M68XXX.RELINQ.SA,M68XXX.RELINQ.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDééééééΉPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE5RELINQƒIDNT‚5,168xxxDIRECTIVE-/ -RELINQUISHEXECUTION*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*RELINQ†2.00**ˆ*’**ˆ*03/23/81ƒHLD6‚**ˆ*********************(*ˆTASKWANTSTORELINQUISHEXECUTIONAND$*ˆGOTOTHEBOTTOMOFTHEREADYLIST**ˆENTRY:‚A6ADDRESSOFTCB*ˆEXIT:‚NOREGISTERSALTERED* *›01234567*ˆUSESREGISTERS‚D*˜AˆP*‰SECTIONLEVEL04* ‰XDEF†RELINQ*RELINQ:(‰TR0.RYRELQ‚(A6)ŽPuttaskonreadylist,%*¦(maskofflast4bitsofpriority);+‰EXIT†POSTEMPTŒexit(postemptclienttask);‰ENDéééé×+=/*=/*†M68XXX.RESUME.AF=/*+=/* Chain file to assemble M68XXX.RESUME.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.RESUME.LS=/*=/IFC \1ƒ=ARGM68XXX.RESUME.LS=/ENDIF=/*1=ASM M68XXX.RESUME.SA,M68XXX.RESUME.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééé/ à‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE8RESUMEƒIDNT‚5,1ƒ68xxxDIRECTIVE--RESUMEASUSPENDEDTASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**…*****************)*…*‚RESUME‚*ƒRESUMEASUSPENDEDTASK*…******************#*„ENTRY:‚A6‚REQUESTOR'STCBADDRESS*ŒA4‚PARAMETERBLOCKADDRESS!*‹(A4)TARGETTASKNAMETORESUME#*Š4(A4)SESSIONCODEOFTARGETTASK*ŒA5‚TARGETTCBADDRESS*$*…EXIT:‚D0=0IFCALLISSUCCESSFUL*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST+*ŠRTCDSTAT-10ƒTARGETTASKISNOTSUSPENDED*‰SECTIONLEVEL04* ‰XDEF†RESUME‰PAGE*"*ˆSeeiftargettaskissuspended.!*ˆ(Failiftargetnotsuspended).* RESUME:8‰BCLR†#TSKSSUSP,TCBSTATE(A5)ˆif(taskwasnotsuspended))‰EXIT.EQƒRTCDSTAT–thenreturn(error_10);  **ˆPuttargetonreadylist, *ˆandreturn.* "‰TR0.READY(A5)šputonreadylist;!‰EXIT†SUB›exit(subroutineexit);‰ENDéééé:=/*=/*†M68XXX.REXMON.AF=/*+=/* Chain file to assemble M68XXX.REXMON.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.REXMON.LS=/*=/IFC \1ƒ=ARGM68XXX.REXMON.LS=/ENDIF=/*1=ASM M68XXX.REXMON.SA,M68XXX.REXMON.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééé0 ééò‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGEAREXMONƒIDNT„5,1†68xxxDIRECTIVE--EXECUTETASKUNDEREXMONCONTROL*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡***************************2*‡*‚REXMONŒ*ƒEXECUTETASKUNDEREXMONCONTROL*‡*‚REV3.00‚11/25/81HLD6**‡*Œ03/23/81HLD6**‡******************************‹ENTRY:A6HASADDROFTCB *’A4HASPARAMETERBLOCKADDRESS*—0-TASKNAMEOFTARGETTASK*—4-SESSIONCODE,*—8-BUFFERADDRESS,POINTERTORUNOPTIONS*›RUNOPTIONS:**œ0-OPTIONS,BITS15-12=TYPEBIT11=MAXCNT"*œ2-LOCATIONOFVALUETOBETESTED *œ6-VALUE*›10-VALUEMASK*›14-MAXINSTRUCTIONCOUNT**‹EXIT:D0HASRETURNCODE*’D0=0„GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST5*ŠRTCDSTAT-10ƒTARGETTASKNOTWAITINGFORTHISEXMON0*ŠRTCDADR1-12ƒBUFFERNOTINCALLER'SADDRSPACE6*ŠRTCDOPT‚-15ƒVALUEOPT-GOODADDROFVALUENOTGIVEN**‰SECTIONLEVEL04* ‰XDEF„REXMON ‰XREF.S‚EXMONVR‰PAGEREXMON:-‰MOVE.L„A4,A3”SAVEADDRESSOFPARAMETERBLOCK-‰BTST†#TSKSWTEM,TCBSTATE(A5)ƒISTASKWAITING?+‰EXIT.EQƒRTCDSTAT‘ERROR-Tasknotwaiting.  **ˆCheckforvalidrequest.* ‰MOVE.L„#18,D5ŽBUFFERLENGTH2‰BSR‡EXMONVRDON'TCOMEBACKUNLESSVALIDREQUEST.‰MOVE.L„D6,A4BUFFERADDRESS  *-*ˆSaveexecutionoptionsandmaketaskready.* 5‰BTST†#TSK2RTEX,TCBSTAT2(A5)ƒClearthetracemodebit‰IF‚‚THEN.S2‰BCLR†#TRMODE,TCBSR(A5)ˆintheappropriatecopyof‰ELSE.S"‰BCLR†#TRMODE,TCBSTKSR(A5)…theSR.‰ENDI .‰MOVE.L„2(A4),TCBEVLOC(A5)‡MOVEVALUELOCATION%‰MOVE.L„6(A4),TCBEVALU(A5)‡MOVEVALUE+‰MOVE.L„10(A4),TCBEVMSK(A5)†MOVEVALUEMASK)‰MOVE.L„14(A4),TCBECNT(A5)‡MOVEMAXCOUNTûU-0‰CLR.W…TCBECNT(A5)ŽCLEARUPPER1/2OFCOUNTWORD9‰AND.B…#$03,TCBEMMSK(A5)ˆCLEAREXECOPTIONSFIELDINMASK!‰MOVE.B„(A4),D7’GETOPTIONSIND7$‰AND.B…#$38,D7’ISOLATEOPTIONSFIELD0‰OR.B†D7,TCBEMMSK(A5)ŠSAVEOPTIONSINEXMONMASK‰TST.B…D7—GETEXECUTIONTYPE'‰BEQ.S…REXMN6“BRANCHIFNOTRACENEEDED 3‰BTST†#TSK2RTEX,TCBSTAT2(A5)ƒSetthetracemodebit‰IF‚‚THEN.S2‰BSET†#TRMODE,TCBSR(A5)ˆintheappropriatecopyof‰ELSE.S"‰BSET†#TRMODE,TCBSTKSR(A5)…theSR.‰ENDI .‰MOVE.L„TCBEMMSK(A5),D7ŠMOVEENTIREMASKTOD7*‰BTST†#TEMVCHG,D7ŽISVALUECHANGEBITSET?‰BEQ.S…REXMN6“BRANCHIFNO >‰TR0.LOGPHY‚,TCBEVLOC(A5),#4ˆGETPADDRFORVLOC‰BRA.S…REXMN5“GOODRETURN ‰NOP‰EXIT†RTCDOPT’BADRETURN. REXMN5:#‰BCLR†#0,D6”BESUREADDRESSISEVEN+‰MOVE.L„D6,A4”MOVEVALUELOCTOADDRESSREG-‰BTST†#TEMVEQU,D7ŽIS'VALUEEQUAL'REQUESTED?‰BNE.S…REXMN6“BRANCHIFYES +‰MOVE.L„(A4),TCBEVALU(A5)ˆGETCURRENTVALUE  REXMN6:-‰BCLR†#TSKSWTEM,TCBSTATE(A5)ƒCLE0 AR'WAIT'BIT‰MOVE.W„TCBSTATE(A5),D0.‰AND.W…#TSKSWMSK,D0WAITINGFORANYTHINGELSE?‰BNE.S…REXMN7“BRANCHIFYES '‰TR0.RYXMON(A5)”PUTTASKONREADYLIST REXMN7:!‰EXIT†SUB–exit(subroutineexit);‰ENDééé=/*=/*†M68XXX.RMS.AF=/*(=/* Chain file to assemble M68XXX.RMS.SA=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to M68XXX.RMS.LS=/*=/IFC \1ƒ=ARGM68XXX.RMS.LS=/ENDIF=/*+=ASM M68XXX.RMS.SA,M68XXX.RMS.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDéééééé ŠPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.TCB.EQŠINCLUDE9995.&.BAB.EQŠINCLUDE9995.&.PAT.EQŠINCLUDE9995.&.INTERRUP.MCŠLISTŠPAGE*RMS‡IDNTƒ5,168xxxRMSINITIALENTRYPOINT*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆRMS‚ISENTEREDHERE*ŠSECTIONLEVEL00* ŠXDEFƒRMS ŠXREF.LDISPATCHŠXREF.LFLUSH_ALL_CACHEŠXREF.LPROGINT9ŠXREF.SPATBEGŠXREF.LSCHED_DATEUP‰PAGE*,*ˆHeretostartupRMSafterinitialization:*Flushthecache,*andgotodispatch.* RMS: &ŠBSR„FLU1 SH_ALL_CACHE„Flushallcaches. K*Schedulethenodetoforcethedateto'rollover'atmidnight.‚AnewnodeF*ƒisnormallyscheduledwhentheuserentersthetimeanddatethroughH*ƒsessioncontrol.‚Ifthesystemhasabatterybackedtimer,however,itJ*ƒmayhappenthattheusermaynotenterthedateandtimebutdependuponK*ƒitbeingpickedupfromthetimeritself.‚Bythetimewereachthiscode,B*ƒthesysteminitializerhasallreadyadjustedNSE,MIDNIGHT,andH*ƒTIMELEFThavebeeninitializedproperlytoreflectthesystemtimeandF*ƒtheBIGDELTAnodethatisnextonthePATlist.‚InthecasewhereweD*ƒdon'thaveabatterybackeduptimer,wewillschedulea'garbage'G*ƒrollovernodebutwereallydon'tcaresinceitwillbecancelledand?*ƒthecorrectrollovernodescheduledwhenthetimeismanually *ƒentered.*K* We do not mask interrupts to schedule the new node because we are entered5*ƒfromthesysteminitializerwithinterruptsmasked.*ŠBSR„SCHED_DATEUP ŠBRA„DISPATCH  **ˆJumpheretocallkiller.*ŠXDEFƒCALLKILLŠXREF.LKILLER CALLKILL: ŠJSR„KILLER‰PAGE*I* This is the exec routine scheduled originally by the system initializerN/I*ƒthatputsadummynodewithalargedeltaontotheendofthePATlist.D*ƒThisinsuresthatthePATlistisneveremptywhichsimplifiestheB*ƒPATprocessinginmanyareas.‚NotethatwedonotgothroughtheF*ƒnormalschedulenoderoutinePAT_SCHED_NEW_NODE.‚Wecouldn'tdothis/*ƒandguaranteethelargedeltathatwedesire.*/ŠDC.Lƒ'DUMY'BitpatternthatINITsearchesfor$*£inordertofindprocedureaddress* DUMY:ŠMOVE.LPATBEG,A1 ŠDISABLE_INTERRUPTSˆMask 2ŠMOVE.LPATFHDR(A1),A2…A2pointstofreePATentry ŠIF.LA2#0THEN.S+BSRKILLERKillsystemofnofreePATnodeŠELSE.S@MOVE.LPATNEXT(A2),PATFHDR(A1)Unlinkthisentryfromfreelist$ENABLE_INTERRUPTS‰Unmaskinterrupts*¦InitializePATentriesCLR.L‚PATNEXT(A2)$CLR.L‚PATTCB(A2)‰Indicateexecnode5MOVE.L#PATBIGDELTA,PATDELTA(A2)MakedeltaverybigCLR.L‚PATINTV(A2)3LEA„DUMY(PC),A3ˆAddressofproceduretoreschedule'MOVE.LA3,PATASR(A2)†Executionaddress(CLR.W‚PATOPT(A2)‰Options-notperiodic4MOVE.L#PATDUMMYID,PATARID(A2)PluginthedummyID4MOVE.W#$FFFF-$0700,PATILVL(A2)Interruptlevel=0#DISABLE_INTERRUPTSˆMaskinterrupts7MOVE.LPATHDR(A1),A3†A3pointsto1stnodeonPATlist !WHILE.LPATNEXT(A3)#0DO.S*LEA‚PATNEXT(A3),A3ƒFindlastnodeonlistENDW 7MOVE.LA2,PATNEXT(A3)„LinkthisentryontoendoflistŠENDI%ŠENABLE_INTERRUPTS‰UnmaskandloseSR(ŠRTE—BacktoPATscheduler(wereallygo(*£backtoabackgroundroutinescheduled%*£byTIMEINT.‚Thisbackgroundroutine *£wastheonethatscheduledus.ŠENDé=/*=/*†M68XXX.RMSPATCH.AF=/*-=/* Chain file to assemble M68XXX.RMSPATCH.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.RMSPATCH.LS=/*=/IFC \1ƒ=ARGM68XXX.RMSPATCH.LS=/ENDIF=/*4=ASM M68XXX.RMSPATCH.SA,M68XXX.RMSPATCH.RO,\1;RZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=END1 éééééé&(RMSPATCH‚IDNTƒ5,1PatchareaforRMS68K.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***3***…ROUTINE:‚RMSPATCH--PATCHAREAFORRMS68K.˜******É***J***…ENVIRONMENT:‚PartoftheRMS68KexecfortheMotorola68000family.***(***‡Copyright1983byMotorola,Inc.¢******É***F***…FUNCTION:‚IfabugisfoundinRMS68K,thisspaceisavailable…***;***‡toMotorolaMicrosystemsforincorporatingpatches.******É***O*******************************************************************************O*******************************************************************************O*^*****************************************************************************  7ŠXDEFƒRMSPATCH‹Locationofthepatcharea;itisXDEFed&*§sothatitwillbeeasiertofindin*§thelinkmap. **‚Includedfiles:5*‰9995.&.STR.EQThesectionnumbertouseisinhere.*ŠINCLUDE9995.&.STR.EQ  ŠSECTIONPATCHES RMSPATCH: )ŠDS.Bƒ256Reservesomespaceforpatches.  ŠENDééé/%2 =/*=/*†M68XXX.RQSTPA.AF=/*+=/* Chain file to assemble M68XXX.RQSTPA.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.RQSTPA.LS=/*=/IFC \1ƒ=ARGM68XXX.RQSTPA.LS=/ENDIF=/*1=ASM M68XXX.RQSTPA.SA,M68XXX.RQSTPA.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDéééééé8ŠPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINLCUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.TCB.EQŠINCLUDE9995.&.BAB.EQŠINCLUDE9995.&.PAT.EQŠINCLUDE9995.&.INTERRUP.MCŠLISTŠPAGEA0THEN.SMOVE.LPATDELTA(A0),D0.ADD.L‚D0,TIME_LEFT„1stnode,updateTIME_LEFT ADD.L‚D0,NSE$BCLRƒ#31,NSE‰InsurepositivenumberŠELSE.S‘Not1stnode2MOVE.LPATDELTA(A2),D0Deltaofnodejustremoved5ADD.L‚D0,PATDELTA(A0)updatedeltaoffollowingnodeŠENDIŠMOVE.W(A7),SRŒUnmask ŠTST.L‚D6‘ADDORCANCEL?ŠBNE.S‚RQST9ŽBRANCHIFCANCEL  **†ADDENTRY--NEWREQUEST* 'RQSTAN„MOVE.LA5,PATTCB(A2)†TCBADDRESS(ŠBCLRƒ#31,D4InsureintervalispositiveŠMOVE.LD4,PATINTV(A2)…INTERVAL%ŠMOVE.L18(A4),PATASR(A2)‚ASRADDRESS&ŠCLR.W‚PATCNT(A2)‰CLEARSEQUENCECOUNT!ŠMOVE.LD5,PATARID(A2)…REQUESTID.ŠBSETƒ#PATO1STE,D3‡FLAG1STACTIVNOTEXECUTEDŠMOVE.WD3,PATOPT(A2)†OPTIONS2ŠSUB.L‚D1,D2ŽD2=msfromnowthatwewanttofireŠDISABLE_INTERRUPTSˆMaskŠBSR„PAT_SCHED_NEW_NODEŠMOVE.W(A7),SRŒUnmaskŠBRA„RQST15Goreturn  #RQST9…ADD.W‚#1,D6ŽCOUNT#CANCELLED.ŠAND.W‚#PATOCMSK,D3‡CALLERWANTFINALMESSAGE?ŠBNE.S‚RQST9ABRANCHIFYES 1ŠBTSTƒ#9,PATOPT(A2)†FINALREQUESTEDWHENSTARTED?ŠBEQ.S‚RQST10BRANCHIFNO  *#*†ADDENTRY--FINALCANCELMESSAGE* 5RQST9A„BSETƒ#7,PATCNT(A2)†SETSEQUENCECOUNTNEGATIVE5ŠBCLRƒ#PATOINTV,PATOPT(A2)STOPCONTINUOUSACTIVATION0ŠBSETƒ#PATOFINL,PATOPT+1(A2)FLAGASFINALENTRY !ŠCLR.L‚D2‘Fireonnextclocktick-ŠMOVEM.LD1-D6/A3,-(A7)„SaveregistersIneedŠDISABLE_INTERRUPTSˆMask ŠBSR„PAT_SCHED_NEW_NODE SRSTACKƒSET„7*4ŠMOVE.WSRSTACK(A7),SR…UnmaskŠMOVEM.L(A7)+,D1-D6/A3 ŠTST.L‚D6‘ISITCANCELALL?ŠBMI„RQST8ABRANCHIFYES ŠBRA.S‚RQST15Goreturn  **ˆRETURNENTRYTOFREELIST* RQST10„DISABLE_INTERRUPTSˆMask$ŠPAT_FREE_NODEPutnodeonfreelistŠMOVE.W(A7),SRŒUnmask ŠTST.L‚D6‘ISITCANCELALL?ŠBMI„RQST8ABRANCHIFYES ŠBRA.S‚RQST15Goreturn  **„ENTIRELISTSEARCHED*  'RQST12„TST.L‚D6‘WASITACANCELREQUESTŠBNE.S‚RQST14BRANCHIFYES &ŠDISABLE_INTERRUPTSˆINHIBITINTERRUPTS%ŠMOVE.LPATFHDR(A1),D0…GETFREEENTRY&ŠBEQ.S‚RQST13BRANCHIFNONEAVAILABLE ŠMOVE.LD0,A2ŽENTRYADDRESS4ŠMOVE.LPATNEXT(A2),PATFHDR(A1)SAVENEWFREEHEADERŠMOVE.W(A7),SRŒUnmaskŠBRA„RQSTANGOADDENTRY  .RQST13„MOVE.W(A7)+,SR‹RESTOREINTERRUPTLEVEL"ŠEXITƒRTCDTFUL‹ERRORIFTABLEFULL  $RQST14„SUB.W‚#1,D6ŽWASCANCELFOUND?ŠBGT.S‚RQST15BRANCHIFYES ŠMOVE.W(A7)+,SR(ŠEXITƒRTCDNFND‹ERROR-NOTHINGTOCANCEL 4RQST15„MOVE.W(A7)+,SR‹UnmaskandloseSRfromstack!ŠEXIT…SUBŽexit(subroutineexit);ŠENDééé3 éé=/*=/*†M68XXX.RSTATE.AF=/*+=/* Chain file to assemble M68XXX.RSTATE.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.RSTATE.LS=/*=/IFC \1ƒ=ARGM68XXX.RSTATE.LS=/ENDIF=/*1=ASM M68XXX.RSTATE.SA,M68XXX.RSTATE.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDééééééj‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LISTˆPAGE0Failure;²******É***5***ŠThefollowingerrorcodesarereturnedinD0:’******É***4***ŒRTCDNTBL-04‚Requiredtabledoesnotexist.******É***7***ŒRTCDNFND-07‚Entrynotfoundintableorlist.******É******É***O*******************************************************************************O*******************************************************************************O*^********************************************************************5 *********‰PAGE*,*‚Revisionhistory(addnewchangestotop).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------)*…09/02/84‚MSLŒRe-wroteasstatemachine.*…11/06/81‚HLD6‹REV3.00‘7š_¢Rª²E*…05/01/79‚HLD6‹REV2.00* * *‚XDEF's.* ‰XDEF†RTEVENT * *‚XREF's.*‰XREF.S„A_EXPORT‰XREF.S„DISP_ASR‰XREF.S„KILLER **‚Includedfiles:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.ASQ.MC*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.ASQ.MC‰LIST‰SECTIONLEVEL04‰PAGE(*rtevent: proc (client_tcb_ptr, en_asr);  *„dcl‚en_asrbit_0(A0);#*„dcl‚client_tcb_ptrlongword(A6);  $*ˆtarget_tcb_ptr<==client_tcb_ptr; '*ˆasq_ptr<==tcb_asq(client_tcb_ptr);*ˆif(asq_ptr=0)*ˆthenreturn(error_04) *ˆelsedo;-*if(asr_nval(asq_st_mode(asq_ptr))=set)*thenreturn(error_07); *elsedo;*’log_usp<==usp(proc);*’stack_depth<==len(sr,pc);/*’if(no_stack(asq_st_mode(asq_ptr))=reset)0*’thenstack_depth<==stack_depth+len(regs);0*’if(client_tcb_ptr<>real_timetask)thendo;(*—phy_usp<==logphy(usp,stack_depth); *—if(error)*—thencallexec_abort($8099);*’end;*’elsephy_usp<==log_usp;!*’if(stack_depth>len(sr,pc))5*’thentcb_regs(client_tcb_ptr)<==regs(phy_usp)+;*’sr(super_stack)<==*™(word(phy_usp)&$00FF)|!*™(trace_bit(sr(super_stack)));+*’pc(super_stack)<==longword(phy_usp)+;5*’tcb_usp(client_tcb_ptr)<==log_usp+stack_depth; *’freeze(asq);$*’docase(asq_state,asq_sw_modes); *end;*ˆend;  *end rtevent;‰PAGE(*rtevent: proc (client_tcb_ptr, en_asr);  $*ˆtarget_tcb_ptr<==client_tcb_ptr; '*ˆasq_ptr<==tcb_asq(client_tcb_ptr);*ˆif(asq_ptr=0)*ˆthenreturn(error_04) RTEVENT:0‰MOVE.L„A6,A5target_tcb_ptr<==client_tcb_ptr; &‰MOVE.L„A0,D1(saveoptionbitinD1);;‰MOVE.L„TCBASQ(A6),A4‡asq_ptr<==tcb_asq(client_tcb_ptr);‰MOVE.L„A4,D0if(asq_ptr=0)'‰BEQ.S…RTEVER04Œthenreturn(error_04);  *ˆelsedo;-*if(asr_nval(asq_st_mode(asq_ptr))=set)*thenreturn(error_07); :‰BTST†#ASQS_RNV,ASQSTMD2(A4)ƒif(asr_nval(asq_ptr)=set)'‰BNE.S…RTEVER07‘thenreturn(error_07);  *elsedo;*’log_usp<==usp(proc);*’stack_depth<==len(sr,pc);/*’if(no_stack(asq_st_mode(asq_ptr))=reset)0*’thenstack_depth<==stack_depth+len(regs);  &‰MOVE.L„USP,A2“log_usp<==usp(proc);7‰MOVE.L„#SR_LEN+PC_LEN,D7ˆstack_depth<==len(sr,pc);@‰BTST†#ASQSKDIS,ASQSTMD2(A4)ƒif(no_stack(asq_st_mode)=reset)#‰BNE.S…RTEV_01’thenstack_depth<== -‰ADD.L…#REGS_LEN,D7’stack_depth+len(regs);  0*’if(client_tcb_ptr<>real_timetask)thendo;(*—phy_usp<==logphy(usp,stack_depth); *—if(error)*—thencallexec_abort($8099);*’end;*’elsephy_usp<==log_usp;  RTEV_01:>‰BTSTW…#TSKARTIM,TCBATTR(A6)„if(client<>real-time)thendo;‰BNE.S…RTEV_03—phy_usp<==*°log_phy(usp,stack_depth; ‰TR0.LOGPHY,A2,D7‰BRA.S…RTEV_02—if(error) "‰NOP¥thencallexec_abort($8099);‰MOVE.W„#$8099,D7end;‰TR0.EXABRT(A6)  RTEVER04:!‰EXIT†RTCDNTBL–return(error_04);  RTEVER07:!‰EXIT†RTCDNFND–return(error_07);  RTEV_02: ‰MOVE.L„D6,A3‰BRA.S…RTEV_04 RTEV_03:'‰MOVE.L„A2,A3”elsephy_usp<==log_usp;  !*’if(stack_depth>len(sr,pc))5*’thentcb_regs(client_tcb_ptr)<==regs(phy_usp)+;  RTEV_04:8‰CMP.L…#SR_LEN+PC_LEN,D7ƒif(stack_depth)>len(sr,pc)‰BLE.S…RTEV_05 <‰MOVEM.Lƒ(A3)+,D0/D2-D5 6/A0-A1thentcb_regs(client_tcb_ptr)6‰MOVEM.LƒD0/D2-D6/A0-A1,TCBD0(A6)Š<==regs(phy_usp)+;‰MOVEM.Lƒ(A3)+,D2-D6/A0-A1‰MOVEM.LƒD2-D6/A0,TCBA0(A6)‰MOVE.L„A1,(SP)  *’tcb_sr(client_tcb_ptr)<==*™(word(phy_usp)&$00FF)|!*™(trace_bit(sr(super_stack)));+*’pc(super_stack)<==longword(phy_usp)+;5*’tcb_usp(client_tcb_ptr)<==log_usp+stack_depth; RTEV_05:%‰MOVE.W„(A3)+,D0Œsr(super_stack)<==+‰AND.W…#$00FF,D0’(word(phy_usp)&$00FF)|/‰BTST†#15,4(A7)’(trace_bit(sr(super_stack)));‰BEQ.S…RTEV_06 ‰BSET†#15,D0 RTEV_06:‰MOVE.W„D0,A6_LEN(SP) **¦pc(super_stack)<==longword(phy_usp); ‰MOVE.L„(A3)+,A6_LEN+SR_LEN(SP) )‰ADD.W…D7,A2tcb_usp(client_tcb_ptr)<==%‰MOVE.L„A2,USP–log_usp+stack_depth;  *’freeze(asq);$*’docase(asq_state,asq_sw_modes); *¦freeze(asq); ‰FREEZE_ASQ9‰MOVE.W„ASQSTATE(A4),D2…docase(asq_state,asq_sw_mode);‰MOVE.W„RTEV_TBL(PC,D2.W),A2‰JMP‡RTEV_TBL(PC,A2.W) *end;*ˆend;  *end rtevent;‰PAGE RTEV_TBL: ‰DC.W†RQ_DIS00-RTEV_TBL‰DC.W†RQ_DIS01-RTEV_TBL‰DC.W†RQ_DIS10-RTEV_TBL‰DC.W†RQ_DIS11-RTEV_TBL ‰DC.W†Q_EN_00-RTEV_TBL‰DC.W†Q_EN_01-RTEV_TBL‰DC.W†Q_EN_10-RTEV_TBL‰DC.W†Q_EN_11-RTEV_TBL ‰DC.W†R_EN_00-RTEV_TBL‰DC.W†R_EN_01-RTEV_TBL‰DC.W†R_EN_10-RTEV_TBL‰DC.W†R_EN_11-RTEV_TBL ‰DC.W†RQ_EN_00-RTEV_TBL‰DC.W†RQ_EN_01-RTEV_TBL‰DC.W†RQ_EN_10-RTEV_TBL‰DC.W†RQ_EN_11-RTEV_TBL ‰DC.W†WT_EN_00-RTEV_TBL‰DC.W†WT_EN_01-RTEV_TBL‰DC.W†WT_EN_10-RTEV_TBL‰DC.W†WT_EN_11-RTEV_TBL ‰DC.W†GT_EN_00-RTEV_TBL‰DC.W†GT_EN_01-RTEV_TBL‰DC.W†GT_EN_10-RTEV_TBL‰DC.W†GT_EN_11-RTEV_TBL‰PAGE WT_EN_00: WT_EN_01: WT_EN_10: WT_EN_11: GT_EN_00: GT_EN_01: GT_EN_10: GT_EN_11: R_EN_00:R_EN_10: RQ_EN_00: RQ_EN_10: *ˆrelease(asq);*ˆcallkiller; ‰RELEASE_ASQ ‰BSR‡KILLER        R_EN_01:R_EN_11: RQ_EN_01: RQ_EN_11: *ˆrelease(asq);*ˆexit(D0_sub); ‰RELEASE_ASQ ‰EXIT†D0_SUB        RQ_DIS00:Q_EN_00: *ˆrelease(asq);*ˆif(en_asr(A0)=reset)*ˆthenexit(D0_sub); *ˆelsedo;*get(asq_xfrvector);*calldisp_asr;*exit(D0_asr);*ˆend; ‰RELEASE_ASQ ‰BTST†#0,D1‰EXIT.EQƒD0_SUB ‰GET_ASQXFR ‰BSR‡DISP_ASR ‰EXIT†D0_ASR        RQ_DIS01: RQ_DIS11: *ˆif(en_asr(option)=set)*ˆthenasq_state<==r_en;*ˆrelease(asq);*ˆexit(D0_sub); ‰BTST†#0,D1‰BEQ.S…RTEV_20 ‰AND.W…#SWMD_MASK,D2‰OR.B†#R_EN,D2‰MOVE.W„D2,ASQSTATE(A4) RTEV_20: ‰RELEASE_ASQ ‰EXIT†D0_SUB        Q_EN_01:Q_EN_11: *ˆif(en_asr(option)=set)*ˆthenasq_state<==rq_en;*ˆrelease(asq);*ˆexit(D0_sub); ‰BTST†#0,D1‰BEQ.S…RTEV_30 ‰AND.W…#SWMD_MASK,D2‰OR.B†#RQ_EN,D2‰MOVE.W„D2,ASQSTATE(A4) RTEV_30: ‰RELEASE_ASQ ‰EXIT†D0_SUB        RQ_DIS10:Q_EN_10: *ˆrelease(asq);*ˆif(en_asr(option)=reset)*ˆthenexit(D0_sub); *ˆelsedo;!*dest_ptr<==def_buf(asq_ptr);*calla_export(dest_ptr);*calldisp_asr;*ˆexit(D0_asr);*ˆend; ‰RELEASE_ASQ ‰BTST†#0,D1‰EXIT.EQƒD0_SUB ‰MOVE.L„ASQDBUF(A4),A0 ‰BSR‡A_EXPORT ‰BSR‡DISP_ASR ‰EXIT†D0_ASR ‰ENDéé6 éé=/*=/*†M68XXX.SEGALOC.AF=/*,=/* Chain file to assemble M68XXX.SEGALOC.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.SEGALOC.LS=/*=/IFC \1ƒ=ARGM68XXX.SEGALOC.LS=/ENDIF=/*3=ASM M68XXX.SEGALOC.SA,M68XXX.SEGALOC.RO,\1;MRZ=070=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.SEG.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDééééé麉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.SEG.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.SEG.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE;SEGALOC‚IDNTƒ5,1ƒ68xxxDIRECTIVE--ALLOCATEAMEMORYSEGMENT*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*SEGALOC…3.00**ˆ*’**ˆ*761604/23/79„**ˆ*HLD609/18/79„**ˆ*HLD612/12/81„**ˆ**********************ˆALLOCATEASEGMENTTOATASK*8*ENTRYƒA4…POINTSTOPARAMETERBLOCKINREQUESTOR'SSPACE!*ˆA5…POINTERTOTARGETTASK'STCB*2*EXITƒA0…PHYSICALADDRESSOFSEGMENTIFSUCCESFUL*ˆD0…RETURNCODE*0--SUCCESSFUL*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST9*ŠRTCDTFUL-5ƒTARGETTSTISFULL-NOROOMFORNEWENTRY8*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-SEGEXISTS,SAMENAME.*ŠRTCDNFND-7ƒMEMORYREQUESTEDDOESNOTEXIST)*ŠRTCDNMEM-8ƒMEMORYSPACENOTAVAILABLE!*ŠRTCDSTAT-10ƒTARGETNOTDORMANT8*ŠRTCDLGCF-11ƒLOGICALADDRCONFLICTSWITHEXISTINGADDR** 6 PARAMETER BLOCK IS SGPB**ˆ0(A4)‚TARGETTASKNAME *ˆ4(A4)‚TARGETTASKSESSIONCODE*ˆ8(A4)‚DIRECTIVEOPTIONS*‡10(A4)‚SEGMENTATTRIBUTES*‡12(A4)‚SEGMENTNAME"*‡16(A4)‚BEGINNINGLOGICALADDRESS*‡20(A4)‚SEGMENTLENGTH(BYTES)*‰SECTIONLEVEL03*‰XREF.SKILLER ‰XREF.SLAM‰XREF.SNOTLAM‰XREF.SSDEFTYP‰XREF.SMMUHERE ‰XREFƒLOADMMU ‰XDEFƒSEGALOC‰PAGE**ˆChecktarget.* SEGALOC:&‰CMP.L…A6,A5ˆSEEIFTARGET=REQUESTOR‰BEQ.SSEGAL2…BRANCHIFYES 9‰BTST#TSKSDORM,TCBSTATE(A5)NOTTHESAME--ISHEDORMANT?‰BNE.S‚SEGAL2…OKIFDORMANT  **‡ERRORRETURNS* "ˆEXITƒRTCDSTATERROR-NOTDORMANT SEGALE3:ˆEXIT‚RTCDTFUL‘NOROOMINTST SEGALE4:Ã^ÌZÔVÜI!ˆEXIT‚RTCDDPRQ‘SEGALREADYEXISTS  **ˆCheckfornameconflict.* SEGAL2:‰IFNE„MULTPROC‰TR0.PƒTCBTSTSM(A5)‰ENDC '‰TR0.FNDSEG,SGPBNAME(A4) ‰BRA‚SEGALE4 ‰TST.L‚D5‡ANYEMPTYENTRIES?"‰BEQ‚SEGALE3„BRANCHTOERRORIFNO  **ˆTestoptionsforpagal.* "‰MOVE.WSGPBATTR(A4),D0‰ATTRIBUTES‰MOVE.WSGPBOPT(A4),D1ŠOPTIONS(‰AND.W‚#$27FF,D1SAVEONLYLEGALOPTIONS  1‰BTSTƒ#SGPBOPHY,D1ŒISREQUESTFOR'ATPHYSADDR'?‰BEQ.S‚SEGAL5’BRANCHIFNO -‰BCLRƒ#SGPBOTYP,D1ŒCLEARTYPEIFATPHYSADDR SEGAL5:+‰BTSTƒ#SEGAPROM,D0ŒISREQUESTFORPHYSROM?‰BNE.S‚SEGAL5A‘BRANCHIFYES '‰BTSTƒ#SEGAMMIO,D0ŒISREQUESTFORMMIO?‰BEQ.S‚SEGAL5B‘BRANCHIFNO "‰BSETƒ#SGPBOATR,D1ŒSETMMIOOPTION SEGAL5A:/‰BSETƒ#SGPBOPHY,D1ŒSET'ALLOCATPHYSADDR'OPT#‰BSETƒ#SGPBOTYP,D1ŒSET'ROM'OPTION*‰BCLRƒ#SGPBOPAD,D1ŒCLEAR'LOG=PHYS'OPTION SEGAL5B:‰CLR.L‚D7–WILLCONTAIN#PAGES&‰MOVE.LSGPBLA(A4),D6‹STARTINGADDRESS-‰BTSTƒ#SGPBOPHY,D1ŒIS'ALLOCATEATPHYS'SET?‰BEQ.S‚SEGAL5C‘BRANCHIFNO #‰BCLRƒ#SGPBOPAD,D1ŒCLEAR'LOG=PHYS' SEGAL5C:(‰BTSTƒ#SGPBOPAD,D1ŒEXECSUPPLYLOGADDR?‰BEQ.S‚SEGAL5CCBRANCHIFNO ‰CLR.L‚D6–NOADDRESS‚GIVEN SEGAL5CC: *6*ˆIFlog=phybitnotsetANDphyaddrbitnotsetTHEN#*’IFnommuORreal-timetasksTHEN*œsetphyaddrbit*’ENDIF*ˆENDIF* #‰BTSTƒ#SGPBOPAD,D1ŒISLOG=PHYSET?‰BNE.S‚SEGAL5CXYES,BRANCH *‰BTSTƒ#SGPBOPHY,D1ŒIS'ATPHYSADDR'SET?‰BNE.S‚SEGAL5CXYES,BRANCH 3‰BTSTW‚#TSKARTIM,TCBATTR(A5)ƒISITREAL-TIMETASK??‰IF.WOR.LMMUHERE#0THEN.SƒYES,AREAL-TIMETASKOR*°NOMMUINTHESYSTEM.BSET‚#SGPBOPHY,D1†ITMUSTBEPHYSICALADDRESS‰ENDI SEGAL5CX:-‰MOVE.LNOTLAM,D7Getpageaddressrangemask1‰AND.L‚D6,D7“Retainstartingaddressdisplacement$‰ADD.L‚SGPBSL(A4),D7‹LENGTHINBYTES6‰ADD.L‚NOTLAM,D7Addpagesizeforroundingtoboundary‰AND.L‚LAM,D7’Roundtoboundary&‰LSR.L‚#8,D7“Convertto256-bytepages:*ˆAND.L‚#$FFFF00,D6Legallimitofaddress(68000and010)#‰MOVE.LD6,A1“GIVEADDRESSTOPAGAL  **ˆAllocatememoryforsegment.* .‰BTSTƒ#SGPBOPHY,D1‡ISREQUESTATPHYSADDRESS?*‰BNE.S‚SEGAL5FŒBRANCHIFYESTOPAGALCALL -‰BCLRƒ#SGPBOTYP,D1‡CLEARANDTESTTYPEOPTION2‰BNE.S‚SEGAL5FŒBRANCHIFCALLERSPECIFIEDMEMTYPE .‰LEA„SDEFTYP,A0‰STARTOFDEFAULTSEGMENTTYPES'‰BTSTƒ#SEGAROM,D0ˆISSEGMENTREADONLY?‰BNE.S‚SEGAL5DŒBRANCHIFYES %‰ADD.L‚#1,A0Ž1=OFFSETFORR/WSEGMENT SEGAL5D:2‰BTSTƒ#TSKASYST,TCBATTR(A5)‚ISTHISASYSTEMTASK?‰BNE.S‚SEGAL5EŒBRANCHIFYES ,‰ADD.L‚#2,A0ŽINCREMENTPOINTERFORUSERTASK SEGAL5E:,‰MOVE.B(A0),D1ŒPUTDEFAULTTYPEINREGISTER SEGAL5F:.‰SWAPƒD7‘SAVE#PAGESINUPPER1/2TEMPORARILY‰MOVE.WD1,D7ŽREQUESTOPTIONS.‰AND.W‚#$87FF,D7ŠSAVEONLYTHOSEUSEDBYPAGAL'‰MOVE.WD1,-(A7)‹SAVEOPTIONSFORLATER%‰SWAPƒD7‘EXCHANGE#PAGESANDOPTIONS‰TR0.PAGAL‚D7ALLOCATEMEMORY%‰BRA.S‚SEGALFMŒBRANCHIFMEMORYFOUND  7 **ˆMemorynotfound-error.* ‰ADD.L‚#2,A7'‰SUB.L‚#1,D0ŽCHECKTYPEOFERRORRETURN-‰BEQ.S‚SEGALE8ŒBRANCHIFMEMORYNOTAVAILABLE  **ˆErrorreturns.* SEGALE7:.‰EXITƒRTCDNFNDMEMORYREQUESTEDDOESNOTEXIST SEGALE8:0‰EXITƒRTCDNMEMMEMORYREQUESTEDISNOTAVAILABLE SEGALE11:‰MOVE.W(A7)+,D1:‰BTSTW‚#SGPBOTYP,D1‹AREEITHERMMIOORPROMSET?‚Notethat&*§weareusingthestackedcopyofthe*§optionsword.3‰BNE.SƒSEGALE12ŽBRANCHIFYES-NOMEMORYALLOCATED ‰TR0.PGFR‚(A3),D7FREEMEMORY'‰BRA.SƒSEGALE12ŽBRANCHTONORMALRETURN ‰BSR…KILLERSHOULDNEVERFAIL SEGALE12:‰EXIT„RTCDLGCFŽADDRESSCONFLICT  *-*ˆFoundmemory--Chekcforaddressconflict.* SEGALFM:#ˆMOVE.L‚A0,A3‰SAVEPHYSICALADDRESSˆMOVE.L‚D2,D7‰SAVE#PAGES%ˆMOVE.L‚D2,D5‰NEED#BYTESFORLOGPHY#ˆLSL.Lƒ#8,D5‰CONVERTPAGESTOBYTES6ˆBTSTWƒ#SGPBOPAD,(A7)‚SHOULDEXECSUPPLYLOGICALADDR?ˆBEQ.SƒSEGALF2‡BRANCHIFNO -ˆMOVE.L‚A3,D6‰USEPHYSICALADDRESSASLOGICAL SEGALF2:"ˆMOVE.L‚D6,A1‰SAVELOGICALADDRESSˆTR0.LOGPHYƒ3ˆBRA.S‚SEGALE11‡ADDRESSCONFLICTSWITHEXISTINGSEG3ˆBRA.S‚SEGALE11‡ADDRESSCONFLICTSWITHEXISTINGSEG 2ˆTST.B‚TSTCTL+1(A0,D5)‚ISTHISENTRYREALLYEMPTY?6ˆBNE.S‚SEGALE11‰BRANCHIFNO--CONFLICTWITHMMIOSEG  *#*ˆChecksoutok--Buildtstentry.* 3CLRMSKƒEQU„$FFFF-1<=BEGIN?‰BCS.S„SEGDE_40ŒBRANCHIFNO  * *ˆUserstackpointerinsegment."*ˆReleaseexclusiveaccesstoTST,*ˆandexitwitherror;* %‰CMP.W„TSTLE(A5,D5),D0…ISUSP<=END?‰BHI.S„SEGDE_40ŒBRANCHIFNO ‰IFNE„MULTPROC)‰TR0.VƒTCBTSTSM(A4)ˆTSTSEMAPHOREADDRESS‰ENDC %‰EXIT…RTCDALOWŒERROR-USPINSEGMENT **ˆUSPnotinsegment."*ˆReleaseexclusiveaccesstoTST,*ˆandexit(subroutineexit);* SEGDE_40: ‰BSR.S…DESEG_SUB‹calldeseg_sub; ‰IFNE„MULTPROC)‰TR0.VƒTCBTSTSM(A4)ˆTSTSEMAPHOREADDRESS‰ENDC !‰EXIT†SUB‘exit(subroutine_exit);‰PAGE=***************************************************************'**‡Subroutinetode-allocateasegment.**‡CalledbySEGDEALandDSEGX.**=*************************************************************  *%*ˆCheckforglobalorsharedsegment.* "SHARMSK‚EQU„1<,,TCBSESSN(A4)‰BRA.SƒDESEG_07ŽFOUNDENTRY +‰BSR…KILLERNOENTRY--THERESHOULDBEONE  **ˆUPDATEGSTENTRY* DESEG_07:'‰MOVE.W‚GSTNP(A0),D6…GET#PAGESINSEG‰SUB.Wƒ#1,D6ŒSUBTRACT1'‰ADD.WƒTSTLB(A5,D5),D6‚PLUSBEGIN=END ‰MOVE.W‚D6,TSTLE(A5,D5)‚SAVEEND&‰SUB.Wƒ#1,GSTCNT(A0)„DECREMENT#USERS ‰CLR.LƒD6 ‰MOVE.W‚GSTCNT(A0),D6…SAVECOUNT3‰BTST„#SGPBORMV,D4†CHECKOPTION-CLEARPERMSTATUS!‰BEQ.SƒDESEG_7AŠBRANCHIFNOTSET "‰BCLR„#15,D6ŒCLEARPERMSTATUSBIT"‰MOVE.W‚D6,GSTCNT(A0)…RESAVECOUNT  *"*ˆGiveupexclusiveaddesstogst.* DESEG_7A:‰IFNE„MULTPROC ‰TR0.VƒSEMGST‰ENDC  *(*ˆChecktoseeifpagesshouldbefreed.* ‰TST.WƒD6”CHECKCOUNT.‰BNE.SƒDESEG_09ŽIFNOTZERO-DONOTFREEPAGES  *+*ˆFreethepagesbelongingtothissegment.* #SPSEGMK‚EQU„1< ‰BRA.SƒDESEG_09†OK-PAGESFREED ‰BSR…KILLER‰PAGEFREEFAILED  *#*ˆRemovethissegmentfromthetst.* *#*ˆUnloadthissegmentfromtheMMU.* DESEG_09:*‰CLR.W…TSTCTL(A5,D5)‡INVALIDATEMMUENTRY.-‰BSR‡UNLDMMUUNLOADTHESEGMENTFROMTHEMMU. )‰CLR.L…TSTANAME(A5,D5)…CLEARSEGMENTNAME8‰CLR.L…TSTAATTR(A5,D5)…CLEARATTRIBUTES,TYPEANDCOUNT. *‰CLR.L…TSTLB(A5,D5)ˆCLEARTSTLBANDTSTLE. ‰CLR.W…TSTPO(A5,D5)ˆCLEARTSTPO. 3‰SUB.B…#1,TSTCSEGS(A5)…DECREMENTNUMBEROFSEGMENTS  *-*ˆGiveupexclusiveaccesstotstandreturn.* ‰IFNE„MULTPROC‰TR0.VƒTCBTSTSM(A4)‰ENDC‰RTS‰END=/*=/*†M68XXX.SEGSHAR.AF=/*,=/* Chain file to assemble M68XXX.SEGSHAR.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.SEGSHAR.LS=/*=/IFC \1ƒ=ARGM68XXX.SEGSHAR.LS=/ENDIF=/*3=ASM M68XXX.SEGSHAR.SA,M68XXX.SEGSHAR.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.SEG.EQ=/*ƒ9995.&.GST.EQ=/*}=/*=END8 éééééé‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.SEG.EQ*ˆINCLUDEƒ9995.&.GST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.SEG.EQ‰INCLUDEƒ9995.&.GST.EQ‰LIST‰PAGEFSEGSHAR‚IDNTƒ5,1ƒ68xxxDIRECTIVES--SHARESEGMENTANDATTACHTOSEGMENT*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*$*„SEGSHAR--REV2.00ƒ4/20/79‚(HLD6)*š2/26/81‚(HLD6) *„ATTSEG‚-*Œ--TRAP1ROUTINES*:*…PURPOSE:‚SEGSHAR-‚GRANTSHAREDACCESSTOMEMORYSEGMENT+*ATTSEG‚-‚ATTACHSHAREABLESEGMENTTOSELF*'*‰ENTRY:‚A6HASREQUESTOR'STCBADDRESS(*‘A4HASSEGMENTPARAMETERBLOCKADDRESS* 0-TARGETTASKNAME* 4-SESSIONCODE*Ÿ10-SEGMENTATTRIBUTES*Ÿ12-SEGMENTNAME*Ÿ16-LOGICALADDRESS*ŠEXIT:ƒD0HASRETURNCODE*’D0=0‚GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST9*ŠRTCDTFUL-5ƒTARGETTSTISFULL-NOROOMFORNEWENTRY8*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-SEGNAMEFOUNDINTST2*ŠRTCDNFND-7ƒENTRYNOTFOUNDINGLOBALSEGTABLE6*ŠRTCDALOW-9ƒREQUESTERCANNOTSPECIFYSELFASTARGET'*ŠRTCDLGCF-11ƒLOGICALADDRESSCONFLICT*‹SECTIONLEVEL03* ‰XDEF†ATTSEG ‰XDEF†SEGSHAR ‰XREF†KILLER ‰XREF†LOADMMU‰PAGE**ˆHereforATTSEG. *ˆSettarget_tcb<==client_tcb.* ATTSEG:5‰MOVE.L„A6,A5MOVECALLER'STCBADDRTOA5FORATTSEG9‰BSR.S…SEGSHR_SUBŠCallthecommonsubroutine,SEGSHR_SUB. :‰MOVE.L„TCBTST(A6),A5‡Now,setA5<==TSTofcallingtask,4‰BSR‡LOADMMUloadtheMMU(todescribenewsegment),%‰EXIT†SUB‘andexit(subroutineexit).‰PAGE **ˆHereforSEGSHAR.)*ˆIftarget_tcb=client_tcb,thenerror.* SEGSHAR:+‰CMP.L…A6,A5AREREQUESTORANDTARGETSAME?<‰EXIT.EQƒRTCDALOWŠERROR-REQUESTORANDTARGETARESAMETASK Si )9 9‰BSR.S…SEGSHR_SUBŠCallthecommonsubroutine,SEGSHR_SUB,%‰EXIT†SUB‘andexit(subroutineexit).‰PAGE**ˆGetexclusiveaccesstogst.* SEGSHR_SUB:‰IFNE„MULTPROC ‰TR0.PƒSEMGST‰ENDC **ˆFindentryingst.* 2‰TR0.FNDGSG‚SGPBNAME(A4),SGPBATTR(A4),TCBSESSN(A5)‰BRA.SƒSEGSHR5FOUNDENTRY ‰EXIT„RTCDNFNDŽNOENTRYINGST  **ˆErrorreturns.* SEGSHR7E:ŠEXIT„RTCDTFULNOROOMINTST SEGSHR8E:ŠEXIT„RTCDLGCFADDRESSCONFLICT SEGSHR9E: ŠEXIT„RTCDDPRQNAMEFOUNDINTST  *!*ˆLookfortargetsegmentintst.**A3=GSTENTRYƒA4=PARAMBLK!*A5=TARGETTCB‚A2=TARGETTST SEGSHR5:$‰MOVE.L‚A0,A3ŠSAVEGSTENTRYADDRESS ‰IFNE…MULTPROC‰TR0.P„TCBTSTSM(A5)‰ENDC 6‰MOVE.L‚TCBTST(A5),A2„A2,A3,A6TARGTST,GST,CALLERTCB‰TR0.FNDSEG‚(A2),GSTNAME(A3)*‰BRA.SƒSEGSHR9E†FOUNDIT--INVALIDTARGET !‰TST.LƒD5ŒISTHEREANEMPTYENTRY‰BEQ…SEGSHR7E†BRANCHIFNO  **ˆCheckforaddressconflict.* !‰CLR.L„D5ˆCLEARBEFORESHORTMOVE,‰MOVE.W‚GSTNP(A3),D5ƒ#PAGES,LOGADDRIND6$‰LSL.Lƒ#8,D5†SEGMENTLENGTHINBYTES9‰BTST„#SGPBOLNG,SGPBOPT(A4)‚ISLENGTHSUPPLIEDBYCALLER?‰BEQ.SƒSEGSHR5BŽBRANCHIFNO #‰CMP.LƒSGPBSL(A4),D5‰ISSIZEVALID?‰BCC.SƒSEGSHR5AŽBRANCHIFYES %‰EXIT„RTCDPCNTŽERROR-BADSIZEFIELD SEGSHR5A:/‰MOVE.L‚SGPBSL(A4),D5…GETSIZEFROMPARAMBLOCK‰ADD.Lƒ#$FF,D5‹*‰CLR.BƒD5*ROUNDTOPAGES SEGSHR5B:!‰MOVE.L‚D5,D2ŒSAVELENGTH(BYTES))‰MOVE.L‚SGPBLA(A4),D6„GETLOGICALADDRESS ‰CLR.BƒD68‰BTST„#SGPBOPAD,SGPBOPT(A4)‚SHOULDEXECSUPPLYLOGADDR?‰BEQ.SƒSEGSHR5CŽBRANCHIFNO -‰MOVE.L‚GSTPA(A3),D6ŠUSEPHYSADDRASLOGICAL SEGSHR5C:‰TR0.LOGPHY‚(A2)‰BRA.SƒSEGSHR8E$‰BRA.SƒSEGSHR8EŠLOGADDRESSCONFLICT '‰TST.LƒD5ŠDIDLOGPHYRETURNMMUOFFSET?‰BNE.SƒSEGSHR6…BRANCHIFYES $‰BSR…KILLER†SHOULDNEVERRETURNZERO SEGSHR6:-‰TST.BƒTSTCTL+1(A0,D5)ƒISENTRYREALLYEMPTY?‰BNE.SƒSEGSHR8E  **ˆPutnewentryintargettst.* 0‰MOVE.L‚GSTNAME(A3),TSTANAME(A2,D5)SEGMENTNAME&‰CLR.BƒTSTAUCNT(A2,D5)CLEARUSECOUNT'‰MOVE.L‚D6,D0‹LOGICALBEGINNINGADDRESS!‰LSR.Lƒ#8,D6‹LOGICALBEGIN(PAGE)‰MOVE.W‚D6,TSTLB(A2,D5)SAVEIT#‰LSR.Lƒ#8,D2‹CONVERTBYTESTOPAGES‰ADD.WƒD2,D6‹PLUS#PAGES‰SUB.Wƒ#1,D6‹MINUS1%‰MOVE.W‚D6,TSTLE(A2,D5)=LOGICALEND'‰NEG.LƒD0ŽGETNEGATIVEOFLOGICALBEGIN'‰ADD.LƒGSTPA(A3),D0„PHYSADDR-LOGBEG#‰LSR.Lƒ#8,D0‹DIVBY8=PHYSOFFSET,‰MOVE.W‚D0,TSTPO(A2,D5)SAVEPHYSICALOFFSET)‰MOVE.W‚#RAMCTL,TSTCTL(A2,D5)SETFORRAM%‰BTST„#SEGAROM,GSTATTR(A3)‚ISITROM?‰BEQ.S„SEGSHR7ŽNO )‰MOVE.W‚#ROMCTL,TSTCTL(A2,D5)ˆSETFORROM SEGSHR7:3‰MOVE.WƒGSTATTR(A3),TSTAATTR(A2,D5)‚MOVEATTRIBUTES+‰BSET…#SEGAUSED,TSTAATTR(A2,D5)„MARKINUSE(‰ADD.B„#1,TSTCSEGS(A2)‡COUNTNEWSEGMENT(‰ADD.W„#1,GSTCNT(A3)‰ADDTOCOUNTINGST6‰MOVE.LƒGSTPA(A3),TCBA0(A6)ƒRETURNPHYSADDRTOCALLER  *-*ˆGiveupexclusiveaccesstotstandreturn.* ‰IFNE„MULTPROC‰TR0.VƒTCBTSTSM(A5)‰ENDC ‰IFNEƒMULTPROC ‰TR0.V‚SEMGST‰ENDC !‰RTS›Returntocallingdirective.‰ENDééé9 =/*=/*†M68XXX.SELFTEST.AF=/*-=/* Chain file to assemble M68XXX.SELFTEST.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.SELFTEST.LS=/*=/IFC \1ƒ=ARGM68XXX.SELFTEST.LS=/ENDIF=/*5=ASM M68XXX.SELFTEST.SA,M68XXX.SELFTEST.RO,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDéééééé(‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰LIST‰PAGE9SELFTESTIDNTƒ5,1ƒ68xxxSYSTEMSELFTESTINTERRUPTHANDLER*ˆ*********************ˆ*SELFTEST1.00„**ˆ*’**ˆ*HLD6ƒ06/24/81‚**ˆ**********************…SELFTESTINTERRUPTROUTINE*>*…THISROUTINEISUSEDONLYTORESPONDTOASELFTESTINTERRUPT-*…ONAVERSAMODULE01(AUTOVECTOR-LEVEL2)*%*…REGISTERUSAGE:ALLREGISTERSSAVED*‰SECTIONLEVEL00*3CONTREG‚EQU„$F70030‡VERSAMODULE01CONTROLREGISTER*‰XDEFƒSELFTEST‰XREF.SSLFTSTA7*7SELFTESTTST.L‚SLFTSTA7‡ISTHISFIRSTENTRYTOROUTINE?‰BNE.S‚SELFT4‰BRANCHIFNO!‰OR.Wƒ#$700,SR‡INHIBITINTERRUPTS-‰MOVEM.LD0-D7/A0-A6,-(A7)‚SAVEALLREGISTERS&‰MOVE.L‚A7,SLFTSTA7ƒSAVESTACKPOINTER)‰MOVE.W‚60(A7),SR…RESTOREINTERRUPTLEVELBSELFT4ƒMOVE.L‚SLFTSTA7,A7ƒRESTOREA7INCASETHISISNOT1STENTRY*6*„CODETOCALLASELFTESTROUTINECANBEENTEREDHERE*!‰OR.W„#$700,SR†INHIBITINTERRUPTS'‰MOVE.B‚CONTREG,D0„GETCONTROLREGISTER%‰OR.B„#$20,D0‡SETBITTOTURNOFFLED/‰MOVE.B‚D0,CONTREG„PUTITINTOCONTROLREGISTER4‰MOVE.L‚SLFTSTA7,A7ƒRELOADA7(MAYBEITWASCHANGED)0‰MOVEM.L(A7)+,D0-D7/A0-A7ƒRESTOREALLREGISTERS%‰CLR.LƒSLFTSTA7†CLEARENTRYFLAGWORD ‰RTE“GOBACK‰ENDé: é12=/*=/*†M68XXX.SERVE.AF=/**=/* Chain file to assemble M68XXX.SERVE.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.SERVE.LS=/*=/IFC \1ƒ=ARGM68XXX.SERVE.LS=/ENDIF=/*/=ASM M68XXX.SERVE.SA,M68XXX.SERVE.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TIOT.EQ=/*}=/*=ENDéééééé:‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TIOT.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TIOT.EQ‰LIST‰PAGE4SERVE„IDNTƒ5,1‡68xxxDIRECTIVE--BECOMEASERVERTASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*#*„SERVER‚--REV2.00ƒ6/25/79‚(HLD6)*š2/20/81‚(HLD6)*Œ--TRAP1ROUTINE*0*…PURPOSE:‚REQUESTORWISHESTOCLAIMAUSERTRAP/*WILLBECOMESERVERFOROTHERTASKSUSINGTRAP*'*‰ENTRY:‚A6HASREQUESTOR'STCBADDRESS'*‘A4HASSERVERPARAMETERBLOCKADDRESS* 0-INTERRUPTADDRESS* 4-TRAPIDENTIFIER* 5-1BYTERESERVED**ŠEXIT:ƒD0HASRETURNCODE*’D0=0‚GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE**ŠRTCDNTBL-4ƒCALLER'SASQDOESNOTEXIST=*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-THISTRAPALREADYASSIGNED-*ŠRTCDALOW-9ƒONLYSYSTEMTASKCANBESERVER8*ŠRTCDADR1-12ƒINTERRUPTADDRNOTINCALLER'SADDRSPACE*‰SECTIONLEVEL04* ‰XDEF‚SERVER‰XREF.SƒSEMTIOT ‰XREF.SƒTIAT ‰XREF.SƒTIOT‰PAGESERVER:)‰MOVE.W‚4(A4),D7ŽSAVEOPTIONSANDPBSIZE4‰BTST„#TSKASYST,TC: BATTR(A6)ISCALLERASYSTEMTASK?‰BNE.SƒSERV1‘BRANCHIFYES 2‰BCLR„#14,D7DONOTALLOWUSERTOSETTERMMSGBIT  **‡CHECKINTERRUPTADDRESS* SERV1:"‰TST.Lƒ(A4)’WASINTADDRSUPPLIED?+‰BEQ.SƒSERV2‘NOINTERRUPTADDRESS-USEASR "‰TR0.LOGPHY‚,(A4),#4#‰BRA.SƒSERV2‘BRANCHIFGOODADDRESS ‰NOP(‰EXIT„RTCDADR1ŽILLEGALINTERRUPTADDRESS  **‡CHECKREQUESTOR'SASQ* SERV2:!‰TST.LƒTCBASQ(A6)ŒDOESASQEXIST?.‰EXIT.EQRTCDNTBLŽERROR-REQUESTORHASNOASQ  **…GETEXCLUSIVEACCESSTOTIOT* ˆIFNE…MULTPROCˆTR0.P„SEMTIOTˆENDC  *"*…CHECKCURRENTASSIGNMENTINTIAT* ‰MOVE.B‚4(A4),D2„TRAPIDENTIFIER$‰AND.Lƒ#$0F,D2…MUSTBEINRANGE0-15CbL"‰LEA…TIAT,A2…ADDRESSOFTIAT!‰TST.Bƒ0(A2,D2)„ISTRAPASSIGNED?,‰EXIT.NERTCDDPRQ„YES-ERROR-CAN'TCLAIMIT  **†BUILDTIOTENTRY*  7‰MOVE.B‚#TIATUSER,0(A2,D2)„SETASSIGNMENTVALUEINTIAT‰LEA…TIOT,A2ADDRESSOFTIOT$‰MULU„#TIOTEL,D2ŒGETOFFSETTOENTRY9‰MOVE.L‚A6,TIOTTCB(A2,D2)…SAVETASKCONTROLBLOCKADDRESS,‰MOVE.L‚TCBSESSN(A6),TIOTSESS(A2,D2)SESSION.‰MOVE.W‚#1,TIOTSEM(A2,D2)…INITIALIZESEMAPHORE)‰CLR.LƒTIOTSEM+2(A2,D2)†CLEARSEMPOINTER.‰MOVE.L‚(A4),TIOTADDR(A2,D2)‚INTERRUPTADDRESS*‰CLR.WƒTIOTMCNT(A2,D2)‡CLEARMESSAGECOUNT2‰MOVE.W‚D7,TIOTSTAT(A2,D2)„SAVESTATUSANDPBSIZE1‰AND.Bƒ#$60,TIOTSTAT(A2,D2)‚SAVEONLYSTATUSBITS1‰BSET„#TIOTSON,TIOTSTAT(A2,D2)SETENABLEFLAGON  *"*„GIVEUPEXCLUSIVEACCESSTOTIOT* SERVX1ƒEQU…*‰IFNE„MULTPROC‰TR0.VƒSEMTIOT‰ENDC ‰EXIT„SUB‰ENDéééé=/*=/*†M68XXX.SETPRI.AF=/*+=/* Chain file to assemble M68XXX.SETPRI.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.SETPRI.LS=/*=/IFC \1ƒ=ARGM68XXX.SETPRI.LS=/ENDIF=/*1=ASM M68XXX.SETPRI.SA,M68XXX.SETPRI.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéé; ééééT‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE7SETPRI‚IDNT‚5,1…68xxxDIRECTIVE--CHANGETASK'SPRIORITY*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡********************‡*‚SETPRI„*ƒSETPRIORITY*‡*‚REV1.00ƒHLD6**‡*‚08/29/79‡**‡********************>*†THISROUTINESETSANEWCURRENTPRIORITYFORTHETARGETTASK***‹ENTRY:A6HASADDROFTCB *’A4HASPARAMETERBLOCKADDRESS*—0-TASKNAME*—4-SESSIONCODE*—8-PRIORITY(1BYTE)*’A5HASTARGETTCBADDRESS**‹EXIT:D0HASRETURNCODE&*’D0=0„GOODRETURN,ATTRIBUTESINA0*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST.*ŠRTCDALOW-9ƒUSERCANNOTSETSYSTEMPRIORITY**ŠRTCDSTAT-10ƒPRIORITYSPECIFIEDIS>MAX***‰SECTIONLEVEL04* ‰XDEF„SETPRI‰PAGE*$*ˆIscallerallowedtosetpriority?* SETPRI:4‰BTST„#TSKASYST,TCBATTR(A6)†ISCALLERASYSTEMTASK?‰BNE.SƒSETPRI3”BRANCHIFYES 4‰BTST„#TSKASYST,TCBATTR(A5)†ISTARGETASYSTEMTASK? $‰EXIT.NERTCDALOW“IFYESTHENERROR.*«USERTASKCANNOTSETPRIORITY*«FORSYSTEMTASK. **ˆSetpriority.* SETPRI3:2‰MOVE.Bƒ8(A4),D0’GETNEWPRIORITYFROMPARAMBLOCK,‰CMP.B„TCBLPRI(A5),D0ŒISNEWPRIORITY>MAX?‰BLS.S„SETPRI4“BRANCHIFNO ‰CLR.L„TCBA0(A6)‘CLEARA0:‰MOVE.BƒTCBLPRI(A5),TCBA0+3(A6)ƒRETURNMAXPRIORTOCALLER (‰EXIT…RTCDSTAT’ERROR-PRIORITYTOOHIGH SETPRI4:/‰MOVE.BƒD0,TCBCPRI(A5)ŒSETNEWCURRENTPRIORITY-‰MOVE.BƒD0,TCBRPRI(A5)ŒSETNEWREADYPRIORITY!‰EXIT…SUB—exit(subroutineexit);‰END]S=/*=/*†M68XXX.SGSEM.AF=/**=/* Chain file to assemble M68XXX.SGSEM.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.SGSEM.LS=/*=/IFC \1ƒ=ARGM68XXX.SGSEM.LS=/ENDIF=/*/=ASM M68XXX.SGSEM.SA,M68XXX.SGSEM.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UST.EQ=/*}=/*=END; ééééééf‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.UST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.UST.EQ‰LIST‰PAGE:SGSEM„IDNTƒ5,1„68xxxDIRECTIVES--SIGNALANDWAITSEMAPHORE*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*"*„WTSEMƒ--REV2.00ƒ5/26/81ƒ(HLD6)*…SGSEM‚--TRAP1ROUTINES*8*‡PURPOSE:ƒREQUESTTOSIGNALORWAITONAUSERSEMAPHORE*'*‰ENTRY:‚A6HASREQUESTOR'STCBADDRESS *‘A4HASPARAMETERBLOCKADDRESS* 0-SEMAPHORENAME* 4-SEMAPHOREKEY* 9-SEMAPHORETYPE(1BYTE)**ŠEXIT:ƒD0HASRETURNCODE)*’D0=0‚GOODRETURN,SEGMENTDEALLOCATED*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE0*ŠRTCDNFND-7ƒENTRYNOTFOUNDINUSERSEMTABLE4*ŠRTCDALOW-9ƒTYPE1WAITORSIGNALOUTOFSEQUENCE*‰SECTIONLEVEL04* ‰XDEF‚SGSEM ‰XDEF‚WTSEM‰XREF.SUSTBEG‰PAGESGSEM:'‰CLR.WƒD7‡FLAG--ENTRYPOINTISSIGNAL ‰BRA.SƒWTSEM1  WTSEM:)‰MOVE.W‚#1,D7„FLAG--ENTRYPOINTISWAIT  **ˆDECODESEMAPHOREKEY* WTSEM1:‰MOVE.Lƒ4(A4),D3‰SEMAPHOREKEY  **†CHECKENTRYFOUND*'*‰A1=ADDRESSOFUST„D3=ENTRYOFFSET* (‰MOVE.L‚USTBEG,A1‡ADDROFUSERSEMTABLE‰MOVE.W‚D3,D0‹ENTRYOFFSET‰LSR.Wƒ#8,D0‹PAGE#OFOFFSET/‰CMP.WƒUSTNPAGE(A1),D0‚CHECKFOROFFSETTOOBIG&‰BGE.SƒWTSEME2‰ERRORIFOFFSETTOOBIG *‰MOVE.L‚(A4),D4‰GETSEMAPHORENAMEFROMPB0‰CMP.LƒUSTSNAME(A1,D3),D4ƒCOMPARESEMAPHORENAME#‰BNE.SƒWTSEME2‹NOCOMPARE-BADKEY *‰TST.WƒUSTUCNT(A1,D3)„ISSEMAPHOREINUSE?‰BEQ.SƒWTSEME2ŒCANNOTBE0 (‰CMP.Bƒ#1,USTTYPE(A1,D3)ƒISTHISTYPE1?‰BNE.SƒWTSEM4ŽNO +‰CMP.BƒUSTXCNT(A1,D3),D7„COMPARESG-WTFLAG(‰BEQ.SƒWTSEME3ŽBRANCHIFOUTOFSEQUENCE *‰MOVE.B‚D7,USTXCNT(A1,D3)„RESETSG-WTFLAG WTSEM4:-‰TST.WƒUSTUCNT(A1,D3)‡ISTHISSEMORPOINTER? ‰BPL.SƒWTSEM5 o^x< ‰MOVE.L‚USTSPTR(A1,D3),D3  *$*†FOUNDGOODENTRY-DOPSEMORVSEM* WTSEM5‚TST.W„D7ŠWHICHENTRY?ˆBEQ.S„SGSEM5†ITWASSGSEM ˆTR0.P„ ˆEXIT…SUB SGSEM5:ˆTR0.V„ ˆEXIT…SUB  **†ERRORRETURNS* WTSEME2‚EXIT„RTCDNFND WTSEME3‚EXIT„RTCDALOW‰ENDéééééé‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.IOV.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.IOV.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE‰IFEQ…CHIPTYPE-680008SINT…IDNT…5,1ƒ68000DIRECTIVE--SIMULATEINTERRUPTTOISR‰ENDC‰IFEQ…CHIPTYPE-680108SINT…IDNT…5,1ƒ68010DIRECTIVE--SIMULATEINTERRUPTTOISR‰ENDC*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡*******************'*‡*‚SINTˆ*ƒSIMULATEINTERRUPTTOISR*‡*‘**‡*‚2.00…HLD6‚**‡*…10/14/80„**‡*…03/30/81„**‡*********************,*‚Revisionhistory(addnewchangestotop).*…Date†Author‚ChangesG*…--------‚------‚-----------------------------------------------------D*†1/24/84ƒMSL„PushedaVORonstack(ifM68010)beforeSINTRTN,and4*—anSRafter,sothattheRTEinCOMINTZwillwork.***†ENTRY:‚A6‚REQUESTOR'STCB*ŽA4‚PARAMETERTABLEPOINTER*(A4)N/A‚OPTIONS*Œ2(A4)INTERRUPTPRIORITY*Œ3(A4)VECTORNUMBER**„EXIT‚D0=0‚SUCCESS*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE *ŠRTCDALOW-9ƒLEVEL#NOTVALID**ŠRTCDENAB-14ƒVECTORHASNOTBEENCLAIMED*‰SECTIONLEVEL03* ‰XDEF„SINT ‰XREF.S‚TRACER‰XREF.S‚TRACFLAG‰XREF.S‚VCTUBGN‰PAGESINT: ‰CLR.LƒD2‰MOVE.B‚3(A4),D2†VECTORNUMBER#‰MOVE.L‚VCTUBGN,A1„VECTORUSETABLE(‰TST.Bƒ0(A1,D2)†HASVECTORBEENCLAIMED?,‰EXIT.LERTCDENAB†ERROR-VECTORNOTCLAIMED ‰CLR.LƒD32‰MOVE.B‚2(A4),D3‡LEVELNUMBER(INTERRUPTPRIORITY)‰BEQ.SƒSINT04‰ZEROISNOTVALID ‰CMP.Wƒ#6,D3ŠMUSTBE1TO6‰BLE.SƒSINT06‰BRANCHIFOK SINT04:'‰EXIT„RTCDALOW‡ERROR-BADLEVELNUMBER  SINT06:‰LSL.L„#8,D3ŠMOVELEVEL#$‰BSET…#SRMODE,D3…SETSUPERVISORMODE  *.*ˆTEMPORARY--FORTIMING--RETURNTOSINTRTN* ‰IFEQ…CHIPTYPE-680101‰MOVE.Wƒ#$0084,-(A7)ƒIF68010,PUSHVORONSTACK.‰ENDC < €^‰#‰PEA†SINTRTN(PC)„RETURNADDRESS*‰MOVE.WƒSR,-(A7)‡SR(FORRTEINSTRUCTION). ‰IFEQ…CHIPTYPE-680101‰MOVE.Wƒ#$0084,-(A7)„IF68010,PUSHVORONSTACK.‰ENDC (‰LSL.L„#2,D2‹CONVERTVECTOR#TOADDRESS)‰MOVE.LƒD2,A0‹PUTVECTORADDRESSINAREG2‰MOVE.Lƒ(A0),-(A7)†PUTCONTENTSOFVECTORONSTACK/‰MOVE.WƒD3,-(A7)ˆPUTSRWITHLEVELSETONSTACK.‰BTST…#TRCFSINT,TRACFLAG+1‚TRACEENTRYWANTED?‰BEQ.S„SINT10ŠBRANCHIFNO ‰BSR†TRACERŠGOBUILDTRACEENTRY‰DC.W…$EE07‹TRACECODE SINT10:‰RTE–PHONEYINTERRUPT  **„RETURNTODOTRACE* SINTRTN:.‰BTST„#TRCFSINT,TRACFLAG+1‚TRACEENTRYWANTED? ‰BEQ.SƒSINT99 ‰BSR…TRACER‹BUILDTRACEENTRY‰DC.W„$DD07ŒTRACECODE SINT99:!‰EXIT„SUBŽexit(subroutineexit);‰ENDééééé=/*=/*†M68XXX.SNAPTRAC.AF=/*-=/* Chain file to assemble M68XXX.SNAPTRAC.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.SNAPTRAC.LS=/*=/IFC \1ƒ=ARGM68XXX.SNAPTRAC.LS=/ENDIF=/*5=ASM M68XXX.SNAPTRAC.SA,M68XXX.SNAPTRAC.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRACE.EQ=/*}=/*=ENDééééé= 鑉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TRACE.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TRACE.EQ‰LISTˆPAGE=SNAPTRAC‚IDNTƒ5,1„68xxxDIRECTIVE--GIVETRACETABLETOCALLER*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡***************************‡*‚SNAPTRACŽ**‡*˜**‡*ƒ1.00ƒC313‚7-30-79**‡**************************#*ˆMOVETRACETABLETOUSER'SBUFFER"*ˆANDCHANGEPOINTERANDENDTOBE*ˆCORRECTADDRESSES**ˆENTRY:‚A6ƒREQUESTOR'STCB*A0ƒADDRESSOFUSER'SBUFFER**ˆEXIT:ƒD0=0‚SUCCESS*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*3*ŠRTCDADR1-12ƒBUFFERADDRNOTINUSER'SADDRSPACE* *01234567*‡USESƒDR**** *ŽA*********„CHECKBUFFERINUSER'SSPACE*‹SECTIONLEVEL04*‹XDEFƒSNAPTRAC‹XREF.STRACEBEG‰PAGE SNAPTRAC:‰MOVE.L„A0,D6LOGICALSTART!‰MOVE.L„A0,A5SAVEBUFFERADDRESS*‰MOVE.L„TRACEBEG,A1‰ADDRESSOFTRACETABLE ‰MOVE.L„A1,D0‰BEQ.S…SNPTRCER *‰MOVE.L„TRCLNG(A1),A0‡ENDADDRESSOFTABLE‰SUB.L…A1,A0LENGTHOFTABLE‰MOVE.L„A0,D5LENGTH‰MOVE.L„A0,D2SAVELENGTH"‰MOVE.L„TCBTST(A6),A0‡WHERETSTIN ‰TR0.LOGPHY‰BRA.S…SNAPTRC1ŒGOODRETURN ‰NOP SNPTRCER:!‰EXIT†RTCDADR1ŒBADBUFFERADDRESS  *#*ƒMOVETRACETABLETOUSER'SBUFFER*ƒA1CONTAINS'FROM'ADDRESS* SNAPTRC1:‰MOVE.L„D6,A2'TO'ADDRESS‰MOVE.L„D2,D3SAVELENGTH‰LSR.L…#2,D2DIVIDELENGTHBY42‰SUB.L…#1,D2ADJUSTFORDECREMENTANDBRANCHINST. SNAPTRC2:#‰MOVE.L„(A1)+,(A2)+‰MOVELONGWORDS!‰DBRA†D2,SNAPTRC2‰DECREMENTCOUNT  *2*ƒUPDATETRCPTRANDTRCLNGTOUSER'SADDRESSSPACE* ‰MOVE.L„D6,A2'TO'ADDRESS‰MOVE.L„A5,A4BUFFERADDRESS*‰MOVE.L„TRACEBEG,A1‰ADDRESSOFTRACETABLE#‰MOVE.L„TRCPTR(A1),A3‡TRACEPOINTER.‰SUB.L…A1,A3TRACEPOINTERSTRIPPEDOFADDRESS+‰ADD.L…A3,A4UPDATEDTRACEPOINTERFORUSERš_£0‰MOVE.L„A4,(A2)+ŒUPDATEDPOINTERTOUSER'STABLE'‰ADD.L…D3,A5LENGTHPLUSBUFFERADDRESS/‰MOVE.L„A5,(A2)+ŒUPDATEDLENGTHTOUSER'STABLE!‰EXIT†SUB‘exit(subroutineexit);‰ENDéééé= ééé=/*=/*†M68XXX.SPURINT.AF=/*,=/* Chain file to assemble M68XXX.SPURINT.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.SPURINT.LS=/*=/IFC \1ƒ=ARGM68XXX.SPURINT.LS=/ENDIF=/*3=ASM M68XXX.SPURINT.SA,M68XXX.SPURINT.RO,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.PANEL.EQ=/*}=/*=ENDéééééé« \'M68XXX SPURINT SAÀÀ6qqSTDTIM AFÉÉqqSTDTIM SAÒÒ”qqSUPER SAãã uqqSUSPEND AFôôqqSUSPEND SAýýqqTERM AFqqTERM SA2 qqTFRSEG AFPPqqTFRSEG SAYYqqTIMEINT AIzz WqqTRACER AF‹‹qqTRACER SA””UqqTRAP0 SA¥¥+nqqTRAP1 SAÖÖ<mqqTSKATTR AF  qqTSKATTR SA CqqTSKBORN AF ) )qqTSKBORN SA 2 2 qqTSKINFO AF [ [qq> ŠPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.PANEL.EQ*ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.PANEL.EQŠLISTŠPAGE1SPURINTƒIDNTƒ5,168xxxSPURIOUSINTERRUPTHANDLER*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*SPURINT‚1.00„**ˆ*’**ˆ*HLD6ƒ09/30/80‚**ˆ**********************…SPURIOUSINTERRUPTROUTINE*.*…REGISTERUSAGE:D0ANDA1SAVEDANDRESTORED*ŠSECTIONLEVEL00* ŠXDEFƒSPURINT ŠXREF.SPANELŠXREF.SSPURCNT‰PAGESPURINT:!ŠADD.W‚#1,SPURCNT‰INCREMENTCOUNT*ŠCMP.W‚#100,SPURCNT‡HAVE100OCCURREDYET?ŠBMI.S‚SPURINT8‹BRANCHIFNO  **ˆToomanyinterrupts.,*ˆLetuserknow,byputtingA1intodisplay.* ŠMOVE.LA1,-(A7)‹SAVEA1ŠMOVE.LPANEL,A1‹PANELADDRESS)ŠMOVE.W#$15,FPLEDST(A1)ƒPUTAXINLIGHTS!ŠMOVE.W#$35,FPLEDST(A1)ƒLATCHIT)ŠMOVE.W#$2E,FPLEDST(A1)ƒPUTX1INLIGHTS!ŠMOVE.W#$3E,FPLEDST(A1)ƒLATCHITŠMOVE.L(A7)+,A1‹RESTOREA1ŠCLR.W‚SPURCNTŒRESETCOUNT  SPURINT8:ŠRTEŠENDééé¸7=/*=/*†M68XXX.STDTIM.AF=/*+=/* Chain file to assemble M68XXX.STDTIM.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.STDTIM.LS=/*=/IFC \1ƒ=ARGM68XXX.STDTIM.LS=/ENDIF=/*0=ASM M68XXX.STDTIM.SA,M68XXX.STDTIM.RO,\1;RZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééé> éÁŠPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.TCB.EQŠINCLUDE9995.&.BAB.EQŠINCLUDE9995.&.PAT.EQŠINCLUDE9995.&.INTERRUP.MCŠLISTŠPAGE2STDTIM„IDNTƒ5,168xxxDIRECTIVE--SETDATEANDTIME*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡****************************#*‡*‚STDTIM*ƒSETDATEANDTIME*‡*‚REV1.00‚HLD611/12/79**‡*‚REV3.00‚HLD611/06/81**‡*****************************;*†THISROUTINESETSDATEANDTIMETOVALUESGIVENBYCALLER***‹ENTRY:A6HASADDROFTCB *’A4HASPARAMETERBLOCKADDRESS *”0(A4)-ORDINALDATE(4BYTES)*”4(A4)-TIME(MILLISECONDS)**‹EXIT:D0HASRETURNCODE*’D0=0…GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE1*ŠRTCDALOW-9ƒUSERTASKCANNOTSETDATEANDTIME**ŠSECTIONLEVEL04* ŠXDEFƒSTDTIM0ŠXDEFƒSCHED_DATEUP‡ReferencedfromM68XXX.RMS.SA ŠXREF.SDATEŠXREF.SMIDNIGHT ŠXREF.SNSEŠXREF.STIME_LEFT ŠXREFƒKILLER ŠXREFƒSBRQPA‰PAGE:STDTIM„BTSTƒ#TSKASYST,TCBATTR(A6)Iscallerasystemtask?ŠIFTHEN.S,EXITƒRTCDALOW‹Error-callernotasystaskŠENDI 4ŠMOVE.WSR,-(A7)‹Saveforunmaskinginterruptslater  *.* Cancel the DATE periodic activation routine.* !ŠMOVE.W#1<<15,D1ŠIndicatecancel1ŠMOVE.L#PATDATEID,D2†IDofnodeIwishtocancelŠBSR„SBRQPACancelitŠNOP—ProvideforPC+2return =ŠMOVEM.L(A4)+,D3-D4‡D3=ordinaldate,D4=mspastmidnight8ŠMOVE.L#24*60*60*1000,D7‚24hoursworthofmilliseconds $ŠWHILE.LD4D7DO.Sƒ=0SUB.L‚D7,D4‹Biassomspastmidnight<24hours$ADD.L‚#1,D3‹BumpdateforeachbiasŠENDW  * * Formulas:!*ƒABSOLUTE_TIME=NSE-TIME_LEFTÊYÓ<(*ƒTIME_OF_DAYƒ=ABSOLUTE_TIME-MIDNIGHTE*ƒMidnightcorrection(DELTA)=CURRENT_TIME_OF_DAY-NEW_TIME_OF_DAYC*…addingDELTAtoMIDNIGHTwillmakeourNEW_ABSOLUTE_TIMEcorrect. 7* Compute DELTA = CURRENT_TIME_OF_DAY - NEW_TIME_OF_DAY* ŠDISABLE_INTERRUPTSˆMaskŠMOVE.LD3,DATEŒUpdateDATEŠMOVE.LNSE,D3.ŠSUB.L‚TIME_LEFT,D3‡D3=currentabsolutetime>ŠSUB.L‚MIDNIGHT,D3ˆD3=currenttimeofday(mspastmidnight) 4ŠSUB.L‚D4,D3ŽSubtractdesirednewtimeofdayto...*£...giveusDELTA9ŠADD.L‚D3,MIDNIGHTˆAdjustMIDNIGHTsoabstimeiscorrect)ŠBCLRƒ#31,MIDNIGHT‡Insurepositivenumber 7ŠBSR.S‚SCHED_DATEUP‡Nowgoscheduledatebumperroutine .ŠMOVE.W(A7)+,SR‹UnmaskandloseSRfromstack!ŠEXITƒSUBexit(subroutineexit);  *<* Now reschedule the date update routine to fire at midnight%*ƒDelaytimefromnowtomidnightis:**‰(MIDNIGHT+24hrsofms)-ABSOLUTE_TIME* SCHED_DATEUP:ŠMOVE.LMIDNIGHT,D1 ŠSUB.L‚NSE,D12ŠADD.L‚TIME_LEFT,D1‡Timedelayfornextactivation;ŠADD.L‚#24*60*60*1000,D1‚Add24hoursworthofmilliseconds#ŠBCLRƒ#31,D1Insurepositivenumber ŠMOVE.LD1,A1.ŠCLR.LƒD1Options=new,one-shot,intlevel0ŠMOVE.L#PATDATEID,D2†ID%ŠLEA„DATEUP(PC),A0†Addressofroutine ŠBSR? „SBRQPA ŠBRA.S‚*+61ŠBSR„KILLERCrashonillegalinstructioniferrorŠRTS  J*Thisistheroutinethatgetsscheduledtoupdatethedate.‚Itrunsfrom2*ƒexecrequestperiodicactivationevery24hours.*DATEUP: 0ŠMOVE.WSR,-(A7)‹Savetounmaskinterruptslater#ŠDISABLE_INTERRUPTSˆMaskinterrupts'ŠADD.L‚#1,DATEŒUpdateDATEandMIDNIGHTŠADD.L‚#24*60*60*1000,MIDNIGHTŠBSR„SCHED_DATEUP.ŠMOVE.W(A7)+,SR‹UnmaskandloseSRfromstack*ŠRTE—Returntobackgroundroutinethat...*£...scheduledme(TIMEINT)ŠEND‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.ENV.EQ*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.PANEL.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.ENV.EQ‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.PANEL.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE‰IFEQ…CHIPTYPE-68000:SUPER„IDNT…5,1‚M68000DIRECTIVE--SWITCHTOSUPERVISORMODE‰ENDC‰IFEQ…CHIPTYPE-68010:SUPER„IDNT…5,0‚M68010DIRECTIVE--SWITCHTOSUPERVISORMODE‰ENDC*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ******************** *ˆ*SUPERŒ**ˆ*’**ˆ*7616„01/10/80*)*ˆ*7616„12/06/80*ADDPRIVILEDGECHECKS*ˆ**********************ˆGIVESUPERVISORMODETOTASK* ‰SECTIONLEVEL04* ‰XDEF„SUPER *‰XREF.S‚EXCSTACK†GETUSER'SRETURNADDRESS%‰XREF.S‚PANEL‰CHECKFORENABLEDPANEL2‰XREF.S‚RUNNERˆRESTOREA6UPONRETURNTOUSERMODE ‰XREF†LOADMMU‰PAGE**ˆVERIFYSUPERPASSWORD* SUPER:!‰MOVE.L„TCBA0(A6),D0ˆGETPASSWORD‰CMP.L…#1269464059,D0†CHECKIT1‰EXIT.NEƒRTCDDIRNŒifbad,thenreturn(error_01);  **ˆOKIFUSER0* "‰TST.W…TCBUSER(A6)‰ISTHISUSER0?‰BEQ.S…SUPER_01ŒPROCEEDIFYES  *+*ˆIFNOTUSER0,THENPANELMUSTBEENABLED* )‰MOVE.L„PANEL,A0ŒGETFRONTPANELADDRESS.&‰BTST†#1,FPDMPTST+1(A0)ƒSEEIFENABLED$‰EXIT.NEƒRTCDDIRNŒreturn(error_01);  *#*ˆCHECKTOSEEIFDIRECTIVEADDRESS*ˆWITHINUSER'SADDRESSSPACE.* SUPER_01:&‰MOVE.L„EXCSTACK,A0‰TOPOFSUPERSTACK *6*ˆNote:‚Under4.4wehavea"pseudo-vor"onthebottom*ofthestackfora68000.* $*ˆSUB.L…#VORLNGTH,A0ˆCORRECTFORVOR-‰SUB.L…#2,A0CORRECTFORVOR(ORPSEUDO-VOR). '‰MOVE.L„-(A0),D6ŒLOGICALRETURNADDRESS$‰MOVE.L„#6,D52BYTESPLUSPRE-FETCH6‰TR0.LOGPHY…GETPHYSICALRETURNADDRESS‰BRA.S…SUPER_02ŒGOOD‰NOP›BAD!‰EXIT†RTCDDIRNŒreturn(error_01);  **ˆGRANTSUPERACCESS.* SUPER_02:$‰MOVE.L„D6,A5PHYSICALADDRESSINA5Ûhä5‰MOVEM.LƒTCBD0(A6),D0-D7/A0-A4RESTOREMOSTREGISTERS ‰JSR(A5)  **ˆRETURNFROMSUPERMODE* ‰MOVE.L„RUNNER,A6‹RestoreA6.8‰MOVE.L„TCBTST(A6),A5‡GetTSTaddress,andloadtheMMU.+‰BSR‡LOADMMU(incasehechangedanything).‰EXIT†SUB‘exit(subroutine); ‰ENDéé? éééé=/*=/*†M68XXX.SUSPEND.AF=/*,=/* Chain file to assemble M68XXX.SUSPEND.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.SUSPEND.LS=/*=/IFC \1ƒ=ARGM68XXX.SUSPEND.LS=/ENDIF=/*3=ASM M68XXX.SUSPEND.SA,M68XXX.SUSPEND.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDééééééì‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰PAGE)SUSPEND‚IDNTƒ5,1…68xxxDIRECTIVE--SUSPEND*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*,*ˆTASKISSUSPENDEDUNTILRESUMEDBYANOTHER$*ENTRY:‚A6HASADDRESSOFSUSPENDEE*‰SECTIONLEVEL04* ‰XDEF†SUSPEND*SUSPEND:1‰BSET†#TSKSSUSP,TCBSTATE(A6)ˆSetsuspendedstate;&‰EXIT†POSTEMPT–Exit(postemptclient);‰END@ éééééõ=/*=/*†M68XXX.TERM.AF=/*)=/* Chain file to assemble M68XXX.TERM.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68XXX.TERM.LS=/*=/IFC \1ƒ=ARGM68XXX.TERM.LS=/ENDIF=/*-=ASM M68XXX.TERM.SA,M68XXX.TERM.RO,\1;MRZ=065=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.TIOT.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééééþŠPAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.TIOT.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*@ ŠNOLISTŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.TCB.EQŠINCLUDE9995.&.TST.EQŠINCLUDE9995.&.TIOT.EQŠINCLUDE9995.&.BAB.EQŠINCLUDE9995.&.PAT.EQŠINCLUDE9995.&.INTERRUP.MCŠLISTŠPAGEETERM†IDNTƒ5,1„68xxxDIRECTIVES--TERMINATESELF,TERMINATETASK,ABORT*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*#*…TERMT--‚REV3.00ƒ11/06/81„(HLD6)*REV2.00„2/08/81„(HLD6)*REV1.01„9/10/79„(HLD6)*‹--‚TRAP1ROUTINE**5*…PURPOSE:‚TERMT-TERMINATIONOFONETASKBYANOTHER**…ENTRY:‚A6HASREQUESTOR'STCB*A4HASTERMTPARAMETERBLOCK*“0(A4)-TASKNAME*“4(A4)-SESSION*“8(A4)-ABORTCODE(2BYTES)**…EXIT:‚D0HASRETURNCODE*D0=0GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST2*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-TERMINPROCESS(*ŠRTCDALOW-9ƒUSERCANNOTTERMSYSTASK*ŠSECTIONLEVEL04* ŠXDEFƒTERMT*‰PAGE%TERMT…TST.L‚(A4)ISTASKNAME=ZERO?ŠBNE.S‚TERMT4BRANCHIFNO  **ŠSELECTATASKTOTERMINATE* -ŠMOVE.L4(A4),D1‹CHECKSESSIONINPARAMBLOCKŠBEQ.S‚TERMT1AŒBRANCHIFZERO 4ŠBTSTƒ#TSKASYST,TCBATTR(A6)ISCALLERASYSTEMTASK?ŠBNE.S‚TERMT1BŒBRANCHIFNO ( 0X8g@1ŠBSETƒ#TSK2TRMP,TCBSTAT2(A5)ISTASKTERMINATING?.ŠBEQ.S‚TERMT9BRANCHIFNO-FOUNDONETOTERM 0TERMT3„MOVE.LTCBALL(A5),A5†GETADDROFNEXTTCB%ŠBRA.S‚TERMT2BRANCHBACKTOCHECKIT  *(*‡LOOKFORTASKNAMEDINPARAMETERBLOCK* #TERMT4„TR0.GETTCB(A4)‹LOOKFORTCBŠBRA.S‚TERMT6BRANCHIFFOUND  **…NOTASKFOUND-RETURNERROR* ,TERMT5„CLR.L‚TCBA0(A6)ŠNOTASKNAMERETURNEDŠEXITƒRTCDTASK‹ERROR-NOTASK  **‡CHECKFORLEGALREQUEST* 5TERMT6„MOVE.LA0,A5ŽTCBADDRESSOFTASKTOBESTOPPEDŠCMP.L‚A5,A6ŽISTASK=CALLER?$ŠBEQ.S‚TERMT7BRANCHIFYES-ERROR. 4ŠBTSTƒ#TSKASYST,TCBATTR(A5)ISTARGETASYSTEMTASK?ŠBEQ.S‚TERMT8BRANCHIFNO 4ŠBTSTƒ#TSKASYST,TCBATTR(A6)ISCALLERASYSTEMTASK?ŠBNE.S‚TERMT8BRANCHIFYES. %TERMT7„EXITƒRTCDALOW‹EXIT(ERROR_09); ?TERMT8„BSETƒ#TSK2TRMP,TCBSTAT2(A5)ISTASKALREADYTERMINATING?)ŠEXIT.NERTCDDPRQŠEXITIFYES(ERROR_06);  *2*†SAVEABORTCODE,STATEWORDANDRETURNTASKNAME* %TERMT9„MOVE.W8(A4),D0‹GETABORTCODE(ŠBEQ.S‚TERMT9AŒDONOTSETHIBITONZERO ŠBSETƒ#HIBIT,D0ŠSETBIT155TERMT9AƒBSETƒ#TSKIABRT,TCBATTI(A5)SETTASKABORTBIT*ŠMOVE.WD0,TCBABORT(A5)„SAVEINTARGETTCB<ŠMOVE.WTCBSTATE(A5),TCBSTATE+2(A5)SAVESTATEWORDFORDUMP8ŠMOVE.LTCBNAME(A5),TCBA0(A6)RETURNTASKNAMETOCALLER>ŠMOVE.LTCBNAME(A6),TCBATSK(A5)GIVECALLER'STASKNAMETOTGT2ŠMOVE.LTCBSESSN(A6),TCBASES(A5)GIVESESSIONALSO  **„CLEARWAITFOREXMON5*„IFTASKWAITINGONSEMAPHORE‚--‚REMOVEITFROMLIST* 1ŠBCLRƒ#TSKSWTEM,TCBSTATE(A5)CLEAREXMONWAITBIT0ŠBCLRƒ#TSK2RTEX,TCBSTAT2(A5)RTNTOEXECCLEARED?TERMTT0ƒBCLRƒ#TSKSSMWT,TCBSTATE(A5)CLEARANDTESTSEM-WAITBIT$ŠBEQ.S‚TERMTT5ŒBRANCHIFNOTWAITING *ŠMOVE.LTCBXA0(A5),A0†POINTERTOSEMAPHORE-ŠMOVE.WSR,-(A7)‹Savecurrentinterruptlevel&ŠDISABLE_INTERRUPTSˆINHIBITINTERRUPTS1TERMTT1ƒTAS„(A0)TESTANDSETMULTIPROCESSORFLAG"ŠBMI.S‚TERMTT1ŒLOOPIFALREADYSET A "ŠLEA„2-TCBSEM(A0),A1„FIRSTPOINTER*TERMTT2ƒTST.L‚TCBSEM(A1)‰DOESENTRYEXIST?#ŠBEQ.S‚TERMTT4ŒNO-SEARCHFINISHED +ŠCMP.L‚TCBSEM(A1),A5†HAVEWEFOUNDAMATCH?ŠBEQ.S‚TERMTT3ŒBRANCHIFYES ŠMOVE.LTCBSEM(A1),A1†NEXTENTRY+ŠBRA.S‚TERMTT2ŒLOOPBACKTOCONTINUESEARCH 6TERMTT3ƒMOVE.LTCBSEM(A5),TCBSEM(A1)UNLINKFROMCHAIN(ŠADD.W‚#1,(A0)ŒINCREMENTSEMAPHORECOUNT2TERMTT4ƒBCLRƒ#HIBIT,(A0)ˆCLEARMULTIPROCESSORFLAG(ŠMOVE.W(A7)+,SR‹RESTORESTATUSREGISTER  *1*ˆCLEARWAITSTATES(EXCEPTWAITFORACKNOWLEDGE)* @CLRMSK„EQU„$FFFF-1<toperiodicactivationtableheader*ŠLEA„PATHDR(A1),A2†A2-->headofPATlist ŠMOVE.LA2,A3;ŠMOVE.WSR,-(A7)‹Saveoldstatusforunmaskoperationlater#ŠDISABLE_INTERRUPTSˆMaskinterrupts5ŠMOVE.LPATNEXT(A3),D0…D0-->firstPATentryonlist  I* Walk thru PAT list keeping A2 pointing to entry under consideration andJ*ƒA3pointingtopreviousentry.‚RemoveanyentriesfromthePATlistthat(*ƒbelongtothetaskweareterminating. ŠWHILEDO.S'MOVE.LD0,A2ŽA2-->nextentryonlistIF.LPATTCB(A2)A4THEN.S(BSR„PAT_DEL_NODE‚GodeletethePATnodeELSE.S MOVE.LA2,A3ENDI7MOVE.LPATNEXT(A3),D0‚AdvancetonextnodeonthelistŠENDWA -ŠCLR.L‚TCBDLAY(A4)ˆCleardelaypointerinTCB #ŠMOVE.W(A7)+,SRŒUnmaskinterrupts.  **&*†CLEARUSERINTERRUPTSIFANYCLAIMED* ééééééé/ŠBTSTƒ#TSKIUVCT,TCBATTI(A4)DOESTASKHAVEISR?ŠBEQ.S‚TERMNWDŒBRANCHIFNO ŠTR0.DIOVX  *?*ˆIfthistaskNetworkServicesattachment,putindisconnectQ* NATNXDCƒEQU„4’DisconnectQlinkNATTCB„EQU„8’TCBAddress @TERMNWDƒMOVE.LTCBNAU(A4),D0†IstaskaNetworkAddressableUnit?ŠBEQ.S‚TERMC0BranchifNO )ŠMOVE.LD0,A0ŽNetworkAddressTableEntry#ŠCLR.L‚NATTCB(A0)‰ClearTCBaddress1ŠMOVE.LNWDQHD,NATNXDC(A0)LinkintodisconnectQŠMOVE.LA0,NWDQHDŠUpdateQhead  **…ISTHISLASTTASKINSESSION?0*…IFTHISTASKISEXMON-LOOKFORWAITINGTASKS* 7TERMC0„MOVE.LTCBNAME(A4),D3…SAVETASKNAMEFORCOMPARE0ŠMOVE.LTCBSESSN(A4),D4„SAVESESSIONFORCOMPARE5ŠBSETƒ#TSKILAST,TCBATTI(A4)SET'LASTINSESSION'BITŠIFNEƒMULTPROC TR0.P‚SEMTCBŠENDC!ŠMOVE.LTCBHD,A1‹1STTCBINCHAIN7TERMC1„BTSTƒ#TSK2TRMP,TCBSTAT2(A1)ISTASKTERMINATING?*ŠBNE.S‚TERMC4BRANCHIFYES-DONOTCOUNT 'ŠCMP.L‚TCBSESSN(A1),D4„COMPARESESSIONSŠBNE.S‚TERMC2NOTSAMESESSION 7ŠBCLRƒ#TSKILAST,TCBATTI(A4)CLEAR'LASTINSESSION'BIT?TERMC2„BTSTƒ#TSKIEXMT,TCBATTI(A4)ISTERMINATINGTASKANEXMON?ŠBEQ.S‚TERMC4BRANCHIFNO ;ŠBTSTƒ#TSKSWTEM,TCBSTATE(A1)ISTHISTASKWAITINGFOREXMONŠBEQ.S‚TERMC4BRANCHIFNO /ŠCMP.L‚TCBEXM(A1),D3†EXMONWITHTHISTASKNAME?ŠBNE.S‚TERMC4BRANCHIFNO 0ŠCMP.L‚TCBEXMS(A1),D4…ISEXMONSESSIONTHESAME?ŠBNE.S‚TERMC4BRANCHIFNO /ŠMOVE.W#T1EXMON,D7ˆUSEDIRECTIVEASABORTCODEŠTR0.EXABRT(A1)‹ABORTTASK  -TERMC4„MOVE.LTCBALL(A1),A1†NEXTTCBINCHAIN ŠMOVE.LA1,D0 ŠBNE„TERMC1 ŠIFNEƒMULTPROC TR0.V‚SEMTCBŠENDC  *"*„DETACHFROMEXMON--IFATTACHED* 5ŠBTSTƒ#TSKIEXM,TCBATTI(A4)ISTASKATTACHEDTOEXMON?ŠBEQ.S‚TERMA8BRANCHIFNO $ŠTR0.DMONX.DETACHANDSENDMESSAGEŠNOP—.ŠIGNOREERRORRETURN  *)*…IFSERVER--DEALLOCATESERVERFUNCTION* TERMA8„EQU„* ŠTR0.DSRVX * *†DEALLOCATEALLUSERSEMAPHORES* B 5ŠBTSTƒ#TSKIUSEM,TCBATTI(A4)ARETHEREANYSEMAPHORES?ŠBEQ.S‚TERMS1NO ŠTR0.DSEMXŠPAGE**…SENDMESSAGETOTRAPSERVERS* TERMS1„MOVE.L#1,D7+TERMS3„LEA„TIAT,A1ŒADDROFASSIGNMENTTABLE ŠLEA„TIOT,A2ŒADDROFOWNERTABLEŠMOVE.LD7,D1ŽTRAPNUMBERŠMULUƒ#TIOTEL,D1‰OFFSETTOTIOT"ŠCMP.B‚#2,0(A1,D7)ˆISITASSIGNED?ŠBNE.S‚TERMS8NO 9ŠBTSTƒ#TIOTSTRM,TIOTSTAT(A2,D1)DOESSERVERWANTMESSAGE?ŠBEQ.S‚TERMS8BRANCHIFNO ŠMOVE.LD7,-(A7)#ŠTR0.EXEQDQ.ŽGOTOMESSAGEROUTINEŠMOVE.L(A7)+,D7ŠBTSTƒ#TSKSAKWT,TCBSTATE(A4) ŠBEQ.S‚TERMS8 ŠTR0.PAUSE TERMS8„ADD.L‚#1,D7 ŠCMP.L‚#15,D7*ŠBLE„TERMS3BRANCHBACKTOCKECKNEXTTRAP  **‡DEALLOCATEASQ* ŠTR0.DASQX  * *ƒDEALLOCATEALLMEMORYSEGMENTS* ŠTR0.DSEGX  **…SENDMESSAGETOMONITOR*  ŠTST.L‚TCBMON(A4)ŠBEQ.S‚TERME1NOMONITOR &ŠMOVE.W#$1805,D2ŠMESGLENGTHANDTYPEŠSWAPƒD2)ŠMOVE.WTCBNAME(A4),D2…TASKNAME1STHALF;ŠMOVE.LTCBNAME+2(A4),D3ƒTASKNAME2NDHALF,SESSN1STHALF*ŠMOVE.WTCBSESSN+2(A4),D4‚SESSION2NDHALFŠSWAPƒD4,ŠMOVE.WTCBATSK(A4),D4…TASKATSK-REQUESTOR8ŠMOVE.LTCBATSK+2(A4),D5ƒATSK2NDHALF,SESSION1STHALF)ŠMOVE.WTCBASES+2(A4),D6ƒSESSION2NDHALFŠSWAPƒD6%ŠMOVE.W#$0100,D6ŠEVENTTYPE-1=TERM"ŠMOVE.LTCBABORT(A4),D7„ABORTCODE$ŠMOVE.WTCBD0(A4),D7‡UPPER1/2OFD0 -ŠBTSTƒ#TSKIABRT,TCBATTI(A4)WASTASKABORTED?ŠBEQ.S‚TERMD2BRANCHIFNO &ŠMOVE.W#$0200,D6ŠEVENTTYPE-2=ABORT'TERMD2„MOVE.LA4,A2ŽSAVEADDRESSOFTCB.ŠTR0.QEVNTNTCBMON(A4)…SENDMESSAGETOMONITORŠNOP—DON'TCAREIFITFAILED$ŠMOVE.LA2,A4ŽRESTOREADDRESSOFTCB  **†REMOVEFROMTCBALLLIST* TERME1„EQU„*ŠIFNEƒMULTPROC1TR0.P‚SEMTCBGETEXCLUSIVEACCESSTOTCBALLLISTŠENDCŠLEA„TCBHD-TCBALL,A1 TERME2„MOVE.LTCBALL(A1),D0 ŠBEQ.S‚TERME4 ŠCMP.L‚D0,A4ŽDOWEHAVEAMATCHŠBEQ.S‚TERME3YES ŠMOVE.LD0,A1 ŠBRA.S‚TERME2  5TERME3„MOVE.LTCBALL(A4),TCBALL(A1)REMOVEFROMCHAIN TERME4„EQU„*  *)*‰Deletethistask'sAddressSpaceNumber* ŠBSR„DEASNŽDeleteASNŠIFNEƒMULTPROC(TR0.V‚SEMTCBGIVEUPEXCLACCESSTOTCBŠENDC/ŠCLR.L‚RUNNERCLEARRUNNER-TCBWILLDISAPPEAR  **…DEALLOCATETCBANDRETURN* TERMP1:ŠTR0.PGFR(A4),#2ŠBRA.S‚TERMP2GOODRETURN. .ŠSAVE_STATE‚L1_FULLŠPERFORMAFULLSTATESAVE.%ŠBSR„KILLERBADRETURN-CALLKILLER. TERMP2:#ŠEXITƒTERM’EXIT-TERMINATECALLER.ŠENDééééééB =/*=/*†M68XXX.TFRSEG.AF=/*+=/* Chain file to assemble M68XXX.TFRSEG.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.TFRSEG.LS=/*=/IFC \1ƒ=ARGM68XXX.TFRSEG.LS=/ENDIF=/*1=ASM M68XXX.TFRSEG.SA,M68XXX.TFRSEG.RO,\1;MRZ=070=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.SEG.EQ=/*ƒ9995.&.GST.EQ=/*}=/*=ENDééééééH‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.SEG.EQ*ˆINCLUDEƒ9995.&.GST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.SEG.EQ‰INCLUDEƒ9995.&.GST.EQ‰LIST‰PAGEATFRSEGƒIDNT„5,1‚68xxxDIRECTIVE--TRANSFERSEGMENTTOANOTHERTASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.*#*„TFRSEG‚--REV2.00ƒ4/24/79‚(HLD6)*š2/26/81‚(HLD6)*Œ--TRAP1ROUTINE*1*…PURPOSE:‚TRANSFERSEGMENTFROMCALLERTOTARGET*'*‰ENTRY:‚A6HASREQUESTOR'STCBADDRESS(*‘A4HASSEGMENTPARAMETERBLOCKADDRESS*•0-TARGETTASKNAME*•4-SESSIONCODE *•8-OPTIONS)*™BIT15,ATTRIBUTESGIVENINPARAMBLOCK+*™BIT14,LOGICALADDRGIVENINPARAMBLOCK0*™BIT13,EXECSUPPLIESLOGICALADDR(=PHYSICAL)*”10-SEGMENTATTRIBUTES*”12-SEGMENTNAME*”16-LOGICALADDRESS**ŠEXIT:ƒD0HASRETURNCODE*’D0=0‚GOODRETURN*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST9*ŠRTCDTFUL-5ƒTARGETTSTISFULL-NOROOMFORNEWENTRY5*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-TARGETHASSEGMENT0*ŠRTCDNFND-7ƒSEGMENTNOTFOUNDINCALLER'STST=*ŠRTCDALOW-9ƒCALLERCANNOTGIVEUPSEG-A7POINTSINTOSEG'*ŠRTCDLGCF-11ƒLOGICALSEGMENTCONFLICT*‹SECTIONLEVEL03* ‹XDEFƒTFRSEG ‹XREF.SKILLER‹XREF.SUNLDMMU‰PAGETFRSEG:*ŠMOVE.LA5,A3†SAVETARGETTASKTCBADDRESS  *'*ˆGetexclusiveaccesstocaller'stst.* ‰IFNEƒMULTPROC‰TR0.P‚TCBTSTSM(A6)‰ENDC '‰MOVE.L‚TCBTST(A6),A5ˆA5=CALLER'STST  **ˆFindC segmentincaller'stst.* ‰TR0.FNDSEG‚(A5),SGPBNAME(A4)‰BRA.S‚TFRSEG3ƒFOUNDIT--GOOD TFRSEG4E:(‰EXITƒRTCDNFNDSEGNAMENOTFOUNDINTST  *'*ˆCancallerhavesegmentde-allocated?* TFRSEG3:Q]ZabGj'‰TST.LƒTCBASQ(A6)†DOESCALLERHAVEASQ?‰BEQ.SƒTFRSEG4‰BRANCHIFNO %‰MOVE.L„USP,A0‰GETCALLER'SA7(USP). ‰MOVE.L„A0,D0‰LSR.Lƒ#8,D0ŒGETPAGENUMBER&‰CMP.WƒTSTLB(A5,D5),D0‚ISUSPEND?,‰EXIT.LSRTCDALOW‰ERROR-USPWITHINSEGMENT  **ˆFindtargettask'stcb.* TFRSEG4:+‰CMP.LƒA6,A3ˆAREREQUESTORANDTARGETSAME?,‰EXIT.EQRTCDTASK‰BADTARGETNAME--NOTFOUND *%*ˆGetexclusiveaccesstotargettst.* ‰IFNEƒMULTPROC‰TR0.P‚TCBTSTSM(A3)‰ENDC "‰MOVE.L‚D5,A1ˆCALLER'SMMUPOINTER%‰MOVE.L‚A4,A2ˆPARAMETERBLOCKPOINTER *!*ˆLookfortargetsegmentintst.* '‰TR0.FNDSEG,SGPBNAME(A2)*‰BRA.SƒTFRSEG6E†FOUNDIT--INVALIDTARGET ‰TST.LƒD5”ISTHEREROOMINTST?‰BNE.SƒTFRSEG6BRANCHIFYES "‰EXIT„RTCDTFULŽERROR-TSTISFULL TFRSEG6E:+‰EXITƒRTCDDPRQERROR-TARGETHASSEGNAMED  **ˆChekclogicaladdress.* TFRSEG6:)‰MOVE.L‚A1,D5‘RESTORECALLER'SMMUOFFSET.‰MOVE.L‚SGPBLA(A2),D6‰LOGADDRINPARAMBLOCK?:‰BTST„#SGPBOLAD,SGPBOPT(A2)ISLOGICALADDRESSOPTIONSET?‰BNE.SƒTFRSEG7YES--USEIT ‰CLR.LƒD6-‰MOVE.W‚TSTLB(A5,D5),D6‡LOGBEGINFROMCALLER1‰BTST„#SGPBOPAD,SGPBOPT(A2)ISPHYSADDROPTSET?‰BEQ.SƒTFRSEG6AŽBRANCHIFNO &‰ADD.WƒTSTPO(A5,D5),D6‡ADDPHYSOFFSET TFRSEG6A:!‰LSL.Lƒ#8,D6‘HAVELOGICALADDRESS TFRSEG7: ‰CLR.LƒD0#‰MOVE.W‚TSTLE(A5,D5),D0‡LOGICALEND*‰SUB.WƒTSTLB(A5,D5),D0‡MINUSLOGICALBEGIN#‰MOVE.L‚D0,D2‘SAVEDIFFFORNEWMMU‰ADD.Wƒ#1,D0‘+1=#PAGES ‰MOVE.L‚D0,D5‘MOVE#PAGESTOD5‰LSL.Lƒ#8,D5‘#BYTES ‰TR0.LOGPHY ‰BRA.SƒTFRSEG8EŽADDRESSCONFLICT‰BRA.SƒTFRSEG8E #‰TST.LƒD5ˆWASANEMPTYENTRYFOUND?‰BNE.SƒTFRSEG8ƒBRANCHIFYES ,‰BSR…KILLER„KILLSYSTEMIFNO-CAN'THAPPEN TFRSEG8E:‰EXIT„RTCDLGCF TFRSEG8:0‰TST.BƒTSTCTL+1(A0,D5)„ISTHEREAMMIOSEGHERE?‰BNE„TFRSEG8E…BRANCHIFYES  **ˆAllok-transfersegment.* ‰MOVE.L‚D6,D1LOGICALADDRESS‰MOVE.L‚A1,D4CALLER'STSTMMU‰LSR.Lƒ#8,D1NEWLOGICALBEGIN‰ADD.WƒD1,D2NEWLOGICALEND*‰MOVE.W‚D1,TSTLB(A0,D5)ƒSAVELOGICALBEGIN(‰MOVE.W‚D2,TSTLE(A0,D5)ƒSAVELOGICALEND4‰SUB.WƒTSTLB(A5,D4),D1ƒOLDLOGBEGIN-NEWLOGBEGIN ‰NEG.WƒD1'‰ADD.WƒTSTPO(A5,D4),D1ƒ+OLDPHYSOFFSET)‰MOVE.W‚D1,TSTPO(A0,D5)ƒ=NEWPHYSOFFSET1‰MOVE.L‚TSTANAME(A5,D4),TSTANAME(A0,D5)MOVENAME6‰MOVE.W‚TSTAR1(A5,D4),TSTAR1(A0,D5)…MOVER1ANDUSECNT)‰MOVE.W‚TSTAATTR(A5,D4),D3„OLDATTRIBUTES/‰BTST„#SGPBOATR,SGPBOPT(A2)ISATTROPTIONSET?+‰BEQ.SƒTFRSEG9BRANCHIFNO--USEOLDATTR %‰BCLR„#SEGAROM,D3‹CLEARREADONLYBIT>‰BTST„#SEGAROM,SGPBATTR(A2)ISREADONLYSETINPBATTRIBUTES?‰BEQ.SƒTFRSEG9BRANCHIFNO 3‰BSET„#SEGAROM,D3‹IFYES-SETITFORNEWTSTENTRY TFRSEG9:‰BSET„#SEGAUSED,D3ŠSETUSEDBIT*‰MOVE.W‚D3,TSTAATTR(A0,D5)„SAVEATTRIBUTES0‰MOVE.W‚#RAMCTL,TSTCTL(A0,D5)SETCONTROLTORAM#‰BTST„#SEGAROM,D3‹SHOULDITBEROM?‰BEQ.SƒTFRSEG9AŽBRANCHIFNO 0‰MOVE.W‚#ROMCTL,TSTCTL(A0,D5)SETCONTROLTOROM **ˆRemovesegmentfromMMU.* TFRSEG9A:(‰CLR.WƒTSTCTL(A5,D4)‰INVALIDATESEGMENT. *‰EXG…D4,D5‘PUTCALLER'SSEGOFFSETINTOD5$‰BSR…UNLDMMUREMOVECALLER'SSEGMENT‰EXG…D5,D4‘RESTOREREGISTERS ‰CLR.LƒTSTANAME(A5,D4)‡*(‰CLR.LƒTSTAATTR(A5,D4)‡*CLEAROLDENTRY ‰CLR.LƒTSTLB(A5,D4)Š*‰CLR.WƒTSTPO(A5,D4)Š* .‰SUB.Bƒ#1,TSTCSEGS(A5)†DECRCOUNTIN'OLD'TST.‰ADD.Bƒ#1,TSTCSEGS(A0)†INCRCOUNTIN'NEW'TST %‰MOVE.W‚TSTLB(A0,D5)C ,D1†LOGICALBEGIN&‰ADD.WƒTSTPO(A0,D5),D1†ADDPHYSOFFSET‰LSL.Lƒ#8,D1‘=PHYSICALADDRESS-‰MOVE.L‚D1,TCBA0(A6)‰GIVEPHYSADDRTOCALLER  */*ˆLookforlocallysharedsegment-changegst.* ,ŠBTSTƒ#SEGASHR,D3…ISSEGMENTLOCALLYSHARED?ŠBEQ.S‚TFRSEGX1ˆBRANCHIFNO ,ŠMOVE.LTCBSESSN(A6),D2‚GETCALLER'SSESSION.ŠCMP.L‚TCBSESSN(A3),D2‚SAMEASTARGETSESSION?ŠBEQ.S‚TFRSEGX1ˆBRANCHIFYES 'ŠMOVE.LTSTANAME(A0,D5),A0‚SEGMENTNAMEŠMOVE.LD3,D1‹ATTRIBUTESŠMOVE.LA3,A4‹SAVEA3 ŠTR0.FNDGSGŠBRA.S‚TFRSEG12ˆBRANCHIFFOUND ŠBSR„KILLERŠNOTFOUND--CRASH  TFRSEG12:ŠMOVE.LA4,A3ŒRESTOREA3&ŠMOVE.LTCBSESSN(A3),D2‚TARGETSESSION#ŠMOVE.LD2,GSTSESSN(A0)‚SAVEINGST  *7*ˆGiveupexclusiveaccesstobothtst's-thenreturn.* TFRSEGX1:‰IFNE„MULTPROC‰TR0.VƒTCBTSTSM(A3)‰ENDC ‰IFNE„MULTPROC‰TR0.VƒTCBTSTSM(A6)‰ENDC!‰EXIT†SUB‘exit(subroutineexit);‰ENDéééééé‰PAGE********************** M68XXX.TIMEINT.SA **********************E* This file is appended to the device dependent source for all of theA*ƒTIMEINTmodulesduringtheassemblyprocess.‚Itcontainscommon4*ƒcodefortimerinterruptfunctionsonallsystems.*B*ƒThiscodewillscheduleabackgroundroutinetofireoffanyPAT*…nodeswhosetimehascome. ŠIFTHEN.S3MOVE.LPATBEG,A1‡A1containsaddressofPATheader:LEA„PATBABT(A1),A0‚AddressofbackgroundactivationblockLEA„PATFIRE(PC),A13MOVE.LA1,BABPTR(A0)ƒAddressofbackgroundroutineBSR„BKG_SCHEDULE„ScheduleitŠENDI ***†RESTOREREGISTERSANDTRACEIFREQUESTED* ,ŠMOVEM.L(A7)+,D0-D1/A0-A1RESTOREREGISTERS&ŠBTSTƒ#TRCFTIMR,TRACFLAGTRACEWANTED?ŠIF…THEN.SˆBSR„TRACERCALLTRACEROUTINE DC.Wƒ$FF13ŠENDI  *G*‚Checktoseewhetherthisticrepresentstheendofthetimeslicefor*‚therunningtask,andexit.* 7ŠTST„TIMESLIC‹Ifwe'resupposedtobedoingtimeslicing9ŠIF…THEN.SŠ(i.e.,iftics/timesliceparameter<>0), .SUB„#1,TIMEOUT‰decrementthetimeoutcounter.'IF…THEN.SIfitis0ornegative,9ST…PREEMPT_FLAG„settheflagthatwillcauseadispatch.ENDIƒ* ŠENDIƒ* 3ŠEXITƒINTERRUPTŠEitherway,exitthroughthecommon*§interrupthandler.‰PAGE*I* This is a background routine (scheduled when TIME_LEFT <= 0) that fires *ƒallPATnodeselibibletorun.* PATFIRE:$ŠMOVE.LPATBEG,A1ŠPATheaderaddress*SRSTACKƒD SET„0’OffsettoSRbeforeonstack#ŠDISABLE_INTERRUPTSˆMaskinterruptsŠMOVE.LTIME_LEFT,D2ŠWHILEDO.S,MOVE.LPATHDR(A1),A2ƒPointA2tofirstnode*BSRƒPAT_RM_1ST_NODE‚Removethefirstnode%ENABLE_INTERRUPTS†Unmaskinterrupts..TST.L‚PATTCB(A2)ƒIsitExecnode?0meansyes IFTHEN.SMOVE.WSR,D0ˆSRbeforemaskingIFEQƒCHIPTYPE-68010%“MOVE.W#$0084,-(A7)…PushTRAP#1VORENDCrF{IFEQƒCHIPTYPE-68020%“MOVE.W#$0084,-(A7)…PushTRAP#1VORENDCBSR„CKEXPAŽGofireexecnode ELSE.SBSR„CKDELAYGofiretasknodeENDI ENABLE_INTERRUPTS$MOVE.L„PATBEG,A1‹PATheaderaddressDISABLE_INTERRUPTS*MOVE.L„PATHDR(A1),A2‡Lookatnew1stnodeMOVE.L„TIME_LEFT,D2ŠENDW ŠENABLE_INTERRUPTS‰UnmaskŠRTS—BacktotheEXECéééééé=/*=/*†M68XXX.TRACER.AF=/*+=/* Chain file to assemble M68XXX.TRACER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.TRACER.LS=/*=/IFC \1ƒ=ARGM68XXX.TRACER.LS=/ENDIF=/*0=ASM M68XXX.TRACER.SA,M68XXX.TRACER.RO,\1;MRZ=46=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TRACE.EQ=/*}=/*=ENDéééD éé郉PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TRACE.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TRACE.EQ‰LISTŠPAGE#TRACER„IDNT1,0‚TRACEEXECACTIVITY*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆTRACERƒREV1.0ƒ7-19-79„(C313)+*ˆSAVESTRACECODE-SR-PC-A0-A6-D0$*ˆALLREGISTERSARERESTOREDONEXIT*ˆCALL:‚JSR‚TRACER*DC.WX*ˆXISTRACECODEOFCALLER*‹SECTIONLEVEL01*'‹XDEF‚TRACER„ENTRY--TRACEEXECACTIVITY‹XREF.S‚TRACEBEG‰PAGE0TRACERSPƒEQU‚20‡OFFSETTOORIGINALSTACKPOINTER /TRACER…MOVEM.LD0-D1/A3-A5,-(A7)ƒSAVEREGISTERS%‹MOVE.W‚SR,-(A7)†SAVESTATUSREGISTER*‹MOVE.L‚TRACEBEG,A3ƒADDRESSOFTRACETABLE"‹ORI.Wƒ#$700,SR‡INHIBITINTERRUPTS5‹MOVE.L‚TRCPTR(A3),A5ˆGETCURRENTTABLEENTRYPOINTER(‹CMP.LƒTRCLNG(A3),A5ƒSEEIFBEYONDTABLE.‹BNE.S„TRACER1‡TABLEFILLED-STARTATTOPAGAIN +‹LEA†TRCENTRS(A3),A5„ADDRESSOFFIRSTENTRY .TRACER1„LEA†TRCENTSZ(A5),A4‡NEXTENTRYPOINTER‹MOVE.LƒA4,TRCPTR(A3)†SAVEIT(‹MOVE.Wƒ(A7)+,SRŒRESTOREINTERRUPTLEVEL  **‰FILLINONEENTRY* &‹MOVE.L‚D0,TRCD0(A5)„USERSD0TOTABLE&‹MOVE.L‚A0,TRCA0(A5)„USERSA0TOTABLE ‹MOVE.L‚A6,TRCA6(A5)„A6TOTABLE9‹MOVE.L‚TRACERSP(A7),A4ƒGETRETURNADDRESS-HASTRACECODE,‹MOVE.W‚(A4),TRCCODE(A5)‚TRACECODETOTABLE,‹ADD.Lƒ#2,TRACERSP(A7)ƒUPDATERETURNADDRESS,‹MOVE.W‚TRACERSP+4(A7),TRCSR(A5)…SRTOTABLE,ˆMOVE.L‚TRACERSP+6(A7),TRCPC(A5)ƒPCTOTABLE3ˆCMP.W‚#$EFFF,TRCCODE(A5)ƒISTHISANI/OINTENTRY?ˆBHI.S‚TRACER4ŽBRANCHIFNO 8ˆMOVE.LTRACERSP+12(A7),TRCA0(A5)ƒREPLACEA0WITH2NDPC  * *‡SAVETIME* TRACER4 TR0.RDTIM'ˆMOVE.L‚D1,TRCTIME(A5)‡SAVETIMEOFDAY'ˆMOVE.W‚#249,D1ŒMAXCOUNTFORLSBTIMERˆSUB.BƒD0,D1ŽGETACTUALCOUNTˆLSR.Wƒ#8,D0ŽMSBOFTIMERˆNOT.WƒD0‘COMPLEMENTITˆAND.Wƒ#3,D0ŽWANT2BITS ˆMULU„#250,D0ˆADD.WƒD0,D1ŽADDMICROSECS*ˆMOVE.W‚D1,TRCTIM2(A5)…SAVEINTRACEENTRY  **‡RETURN* ,ˆMOVEM.L‚(A7)+,D0-D1/A3-A5…RESTOREREGISTERS ˆRTSœRETURNŒU•ˆENDééE ééééé‰IFEQ„CHIPTYPE-68000/TRAP0…IDNTƒ5,1‡68000TRAP#0handlerandtable.‰ENDC‰IFEQ„CHIPTYPE-68010/TRAP0…IDNTƒ5,1‡68010TRAP#0handlerandtable.‰ENDCO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***H***…FILE:‚TRAP0--ALLTHESTUFFDEALINGWITHTHETRAP#0MECHANISM.ƒ******É***J***…ENVIRONMENT:‚PartoftheRMS68KexecfortheMotorola68000family.***(***‡Copyright1983byMotorola,Inc.¢******É***I***…FUNCTION:‚Inthisfileare(1)theTRAP#0handler,(2)thetable‚***E***‡containingoffsetstotheTRAP#0routines,and(3)aTRAP#0…***I***‡routinewhichreturnstheentrypointaddressforagivenTRAP#0******‡directive.¸******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revisionhistory(addnewchangestotop).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------2*…09/10/84‚MSLŒRemovedentriesforsubroutinesnot(*ždocumentedin"GuidetoWritingDevice*žDriversforVersados".*C*†8/12/83‚SteveFranckƒRemovedrestrictionthatTRAP#0routinesbe-*žinlow32Kofaddressspace,andchangedto**žword-wide,position-independentoffsets..*žTRAP0andTABLE0werecombinedatthistime,"*žandtheENTRYroutinewasadded.*  **‚Includedfiles:*8*‰UTILITY.MCMacrosofgeneralutility(e.g.PUSH,POP).2*‰ENV.EQ”Equatesdependentonprocessorchiptype.2*‰STR.EQ”EquatesforsupervisorcodeunderRMS68K.*ŠNOLISTŠINCLUDE9995.&.UTILITY.MCŠINCLUDE9995.&.ENV.EQŠINCLUDE9995.&.STR.EQŠLIST  * *‚XDEF's.*2ŠXDEFƒHI_DIR_NUM‰HighestTRAP#0directivenumber.:¦@®;¶O¾IÆ"0ŠXDEFƒTABLE0StartaddressoftheTRAP#0table.0ŠXDEFƒTRAP0ŽEntrypointfortheTRAP#0handler.  *6*‚XREF's.‚TABLE0'sroutinenamesareXREFedinTABLE0.*+ŠXREFƒKILLERT0‹Routinetocrashthesystem.  ŠSECTIONLEVEL00ŠOPT„BRSŠPAGEO*v*****************************************************************************O**********************************************************************************É***1***…ROUTINE:‚TRAP0--CALLATRAP#0ROUTINE.š******É***J***…FUNCTIONE :‚Whenanentityrunninginsupervisormodebutnotlinked***D***‡withRMS68Kwantstoinvokesomeexecfunction,hemovesthe†***D***‡directivenumberofthefunctionintoD0anddoesaTRAP#0.†***E***‡ThempuvectorshereandweusetheTRAP#0table,TABLE0,to…***#***‡JMPtothedesiredroutine.§******É***8***…NOTES:‚TRAP#0callsfromusermodeareignored.“******É***E***…REGISTERUSAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SRhi„SRlo(CCR)…******‡D:ƒAD‚.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒP ******É******…ENTRYCONDITIONS:³***7***‡D0ƒ=directive#oftheroutinetobeexecuted.‘***F***‡PC&SR(&maybeVOR)ofcallerarestacked,aswithanyTRAP.„******É***O*******************************************************************************O*^*****************************************************************************‰PAGE***‚Ensureweweren'tcalledfromusermode.* TRAP0:9ŠBTSTƒ#5,(SP)ŒChecktheSRonthestacktoseeifwewere)ŠIF…THENŠinsupervisormode.‚Ifnot,,ŠRTE—justreturntowhoeverdidtheTRAP#0.ŠENDI–*  *K*‚CleanupthestacktomakeitlooklikehejustdidaJSRtotheroutine.* +ŠADDQ.L#2,SPŽRemovetheSRfromthestack.‰IFEQ„CHIPTYPE-680102ŠMOVE.W2(SP),4(SP)ˆLowerhalfofPCreplacesVOR.8ŠMOVE.W(SP)+,(SP)‰UpperhalfofPCreplaceslowerhalf.‰ENDC  *5*‚Validatethedirectivenumberandcalltheroutine.* >ŠCMP.L‚#HI_DIR_NUM,D0…Ifthedirectivenumberisoutofrange,ŠBHI.L‚KILLERT0‹callKILLER.1ŠADD.L‚D0,D0ŽD0<--directive#*2foruseasan*§indexintoatableofwords.>ŠMOVEƒTABLE0(PC,D0.L),D0D0<--offsetfromstartofTABLE0to*§theroutinehewants.5ŠJMP„TABLE0(PC,D0)†Jumptotheroutine;theaddress= *§*ƒbaseaddrofTABLE0+offset*§*ƒfromTABLE0totheroutine.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***G***…ROUTINE:‚ENTRY--GETENTRYPOINTFORANEXECROUTINE(TRAP#0)„******É***F***…FUNCTION:‚Returnstheentrypointaddressforanexecroutine.…***B***‡DoingaJSRtothereturnedaddressisfasterthandoingaˆ***A***‡TRAP#0,whichisusefulfordrivers.‚Itcanalsobeusedˆ***=***‡tovalidatethataroutinewithsuchanumberexists.******É***E***…REGISTERUSAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SRhi„SRlo(CCR)…******‡D:ƒ.ƒAP‚.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD******‡A:ƒRƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒP ******É******…ENTRYCONDITIONS:³***G***‡D1ƒ=numberoftheroutineforwhichtheentrypointisdesired.******É***-***…EXITCONDITIONSDIFFERENTFROMENTRY:Ÿ******‡Iftheroutineexists:¬***;***‰A0ƒ=entrypointaddressforthespecifiedroutine.‹***2***‰ReturntocalleratthePCafterhiscall.–***&***‡Iftheroutinedoesnotexist:¤***6***‰ReturntocalleratthePCafterhiscall+2.’******É***O*******************************************************************************O*^*****************************************************************************‰PAGE* *‚Saveregs.* ENTRY: ‰PUSH.L„D1’Savethecaller'sD1;  ***‚Ensurethedirectivenumberisinrange.* *‰CMP.L…#HI_DIR_NUM,D1†if(D1>HI-DIR-NUM)$‰BHI.S…ENTRY_01Œthenreturn(error);  *2* It's in range, so calculate the routine address.* ,‰ADD.L…D1,D1D1<--D1*len(TABLE0_entry);>‰MOVE†TABLE0(PC,D1.L),D1‚D1<--offsettoroutinefromTABLE0;=‰LEA‡TABLE0(PC,D1),A0„A0<--addressoftheTRAP#0routine=*­addressofTABLE0+*­offset(routine-TABLE0);  *K* If the address = killer, then make sure that it is the legitimate killer.* If not, then return an error.* ‰CMP.L…#KILLER,A0Šif&‰BNE.S…ENTRY_02Œ(A0=addr(killer))& ,‰CMP.L…#2*T0KILLER,D1†(D1<>index(killer))$‰BEQ.S…ENTRY_02Œthenreturn(error);  ** Here if we had an error. *†IncrF ementreturnaddressby2,*†andfallthroughtoENTRY_02.* ENTRY_01:1‰ADDQ.L„#2,4(SP)ŒPC(return)<==PC(return)+2;  ** Here for all exits.*†restoreregs, *†andreturn. ENTRY_02:"‰POP.L…D1’Restorethecaller'sD1.‰RTS›Returntothecaller.‰PAGEO**********************************************************************************É***G***…DATASTRUCTURE:‚TABLE0--TABLEOFOFFSETSTOTRAP#0ROUTINES.„******É***F***…FUNCTION:‚ThistableisusedtocalculateaddressesofTRAP#0…***C***‡routines.‚ThereisanentryforeachTRAP#0directive,and†***E***‡theyareinorderbydirectivenumber.‚Eachentryistheword„***D***‡displacementfromthebeginningofthistabletotheTRAP#0†***D***‡routine.‚ThistechniquehelpsmakeRMSposition-independent.…******É***O******************************************************************************* *L*‚UsetheSETUPmacrotodefinetableentries.‚YougivethemacrotheequateN*‚forthedirectivenumberandthelabeloftheroutineyouwanttogotowhen1*‚thatdirectiveiscalled,anditdoestherest.*0*‚SETUP[.L],*I*‚Usethe.LiftheroutineisLocaltothismoduleratherthanexternal.* SETUP…MACRODIR_NUMƒSET„(*-TABLE0)/2ŠIFEQƒDIR_NUM-\1ŒNOLISTŒIFNCƒ'\0','L'ŽXREFƒ\2ŒENDC ŒDC…\2-TABLE0ŒLISTŒMEXITŠENDCSHOULD_BESET„\10ŠFAILƒ499Thisdirectiveisinthewrongplace!!ŠENDM  ŠOPT„MEX,NOCL  TABLE0: *§Whatitdoes(*§-------------------------------------- *ŠSETUP‚0,KILLERT0‰Unassigned;callKILLER. 0ŠSETUP‚T0P,PSEM‹Poperation(wait)onsemaphore. 2ŠSETUP‚T0V,VSEM‹Voperation(signal)onsemaphore. 0ŠSETUP‚T0READY,READY†Puttaskonthereadylist. :ŠSETUP‚T0PAGAL,PAGEALOCƒAllocatepagesofphysicalmemory. :ŠSETUP‚T0PGFR,PAGEFREE„Free(return)pagesofphysmemory. <ŠSETUP‚T0GETTCB,GETTCB„GetTCBaddrgiventaskname,session. 3ŠSETUP‚T0FNDSEG,FNDTSEGƒFindsegmentnameinaTST. BŠSETUP‚T0LOGPHY,LOGPHY„Validatelogicaladdr,converttophysical. 1ŠSETUP‚T0FNDGSG,FNDGSEGƒFindsegmentnameinGST. .*‰SETUP‚T0ASRINT,ASRINT„Interrupttargettask.'ŠSETUP‚10,KILLERŠInterrupttargettask. /ŠSETUP‚T0QEVNTN,EXQEVNTN‚PlaceeventinanASQ. ;ŠSETUP‚T0FNDSEM,FNDUSEMƒFindentryinusersemaphoretable. 8ŠSETUP‚T0GTXTCB,GTXTCB„GetTCBusingsessionprovidedin =ŠSETUP‚T0PAUSE,PAUSE†PausewhilewaitingforI/Otocomplete. A*‰SETUP‚T0DSRVX,DSRVX†Deallocateserverfunctionwhentaskstops.ŠSETUP‚15,KILLER A*‰SETUP‚T0DSEMX,DSEMX†Deallocateusersemaphoreswhentaskstops.ŠSETUP‚16,KILLER 5*‰SETUP‚T0DASQX,DASQX†DeallocateASQwhentaskstops.ŠSETUP‚17,KILLER A*‰SETUP‚T0DSEGX,DSEGX†Deallocatememorysegmentswhentaskstops.ŠSETUP‚18,KILLER ?*‰SETUP‚T0EXEQDQ,EXEQDQ„Sendmessagetoserverwhentaskstops.ŠSETUP‚19,KILLER )*§Detachtaskfromexceptionmonitorwhen!*‰SETUP‚T0DMONX,DMONX†taskstops.ŠSETUP‚20,KILLER (*‰SETUP‚T0EXABRT,EXABRT„Abortusertask.ŠSETUP‚21,KILLER &ŠSETUP‚T0WAKEUP,WAKEUPXƒWakeupatask. (*§PlaceeventinASQwhileNOTservicing&ŠSETUP‚T0QEVNTT,EXQEVNTT‚aninterrupt. $*§PlaceeventinASQwhileservicing&ŠSETUP‚T0QEVNTI,EXQEVNTI‚aninterrupt. $*‰SETUP‚T0UPDATQ,UPDTASQƒUpdateASQ.ŠSETUP‚25,KILLER "*§ValidateODDlogicaladdressand,ŠSETUP‚T0LOGPHO,LOGPHYOƒconverttophysical. 3*‰SETUP‚T0PAGALL,PAGEALLE‚Allocatepagesofmemory.ŠSETUP‚27,KILLER 7ŠSETUP‚T0RDTIM,RDTIMER„Gettimeofdayinmilliseconds. '*§Disconnecttaskfromuservectorwhen!*‰SETUP‚T0DIOVX,DIOVX†taskstops.ŠSETUP‚29,KILLER +*‰SETUP‚T0ADDPA,ADDPA†AddentrytothePAT.ŠSETUP‚30,KILLER 9ŠSETUP‚T0CRTCB,TCBCR†CreateaTCB.‚(INITusesthiscall.)*‰SETUP‚31,KILLER *ŠSETUP‚T0KILLER,KILLERT0‚Crashthesystem. 6*‰SETUP‚T0FREEPA,FREEPA„ReturnPATentrytofreelist.ŠSETUP‚33,KILLER 1ŠSETUP‚T0RQPA,EXRQPA†Requestperiodicactivation. =ŠSETUP.LT0ENTF RY,ENTRY…Getentrypointforatrap#0routine. #*§Scheduleroutineforexecutionin'ŠSETUP‚T0SCHED,BKG_SCHEDULEƒbackground. <ŠSETUP‚T0GUARD,CALL_GUARDED‚Callsubroutineinguardedmode.    DHI_DIR_NUMEQU(*-TABLE0)/2-1‡Highestdirective#forTRAP#0calls.   ‰ENDéééé‰IFEQ„CHIPTYPE-68000/TRAP1„IDNTƒ5,1‡68000TRAP#0handlerandtable.‰ENDC‰IFEQ„CHIPTYPE-68010/TRAP1„IDNTƒ5,1‡68010TRAP#0handlerandtable.‰ENDCO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***D***…FILE:‚TRAP1--EVERYTHINGDEALINGWITHTHETRAP#1MECHANISM‡******•FORREAL-TIMETASKS. ******É***J***…ENVIRONMENT:‚PartoftheRMS68KexecfortheMotorola68000family.***(***‡Copyright1983byMotorola,Inc.¢******É***#***…FUNCTION:‚Inthisfileare:¨***4***1.)‚theTRAP#1handlerforreal-timetasks,Œ***=***2.)‚theTRAP#1tableforreal-timetaskscontaining:ƒ***"***•A.)‚offsetstodirectives,™***%***•B.)‚offsetstoexitroutines.–******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revisionhistory(addnewchangestotop).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------&*†7/27/84‚MarkLanus…Originalwriting.*  **‚Includedfiles:*8*‰UTILITY.MCMacrosofgeneralutility(e.g.PUSH,POP).2*‰ENV.EQ”Equatesdependentonprocessorchiptype.2*‰STR.EQ”EquatesforsupervisorcodeunderRMS68K.(*‰TCB.EQ”Equatesfortaskcontrolblock.**‰UDR.EQ”Equatesforuserdirectivetable.1*‰TR1RTCD.EQReturncodesforTRAP#1directives.**ŠNOLISTŠINCLUDE9995.&.UTILITY.MCŠINCLUDE9995.&.ENV.EQŠINCLUDE9995.&.STR.EQŠINCLUDE9995.&.TCB.EQŠINCLUDE9995.&.UDR.EQŠINCLUDE9995.&.TR1RTCD.EQŠLIST  * *ˆxdef's.* 0‰XDEF†TRAP1EntrypointfortheTRAP#1handler. /‰XDEF†TTB_01ŽBeginningandendingaddressesfor‰XDEF†TTE_01Žtrusttableentry.  * *ˆxref's.ÎC×QßXçRïJ÷Mÿk .* ‰XREF†CKEXMON ‰XREF†ISRRTE ‰XREF†TRACER ‰XREF.S„RUNNER‰XREF.S„TRACFLAG‰XREF.S„UDRBEG ‰SECTIONƒLEVEL00 ‰OPT‡MEX,NOCL‰PAGEO*v*****************************************************************************O********************G **************************************************************É***1***…ROUTINE:‚TRAP1--CALLATRAP#1ROUTINE.š******É******…FUNCTION:»***D***‡Whenataskwantstoinvokesomeexecfunction,hemovesthe†***D***‡directivenumberofthefunctionintoD0anddoesaTRAP#1.†***B***‡ThempuvectorshereandweusetheTRAP#1table,TABLE1,ˆ***&***‡toJMPtothedesiredroutine.¤******É******É***E***…REGISTERUSAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SRhi„SRlo(CCR)…******‡D:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******…ENTRYCONDITIONS:³***7***‡D0ƒ=directive#oftheroutinetobeexecuted.‘***8***‡A0ƒ=parameterblock(ifrequiredbydirective).***F***‡PC&SR(&maybeVOR)ofcallerarestacked,aswithanyTRAP.„******É***O*******************************************************************************O*^*****************************************************************************‰PAGE**ˆif&*ˆ(interrupt_mask(super_stack)>0)|,*ˆ(supervisor_state_bit(super_stack)=set)*ˆthengotoisrrte;* TRAP1:‰TESTIM3‰BNE.S…ISR_RTEBranchifnotfromnormalusermode.  *1*ˆforcetheconditioncodesonthestackto,+*ˆandperformalevel_1partialstatesave;* =‰MOVE.B„#EQ_CC,COND_CODE(A7)…savecondcodeofonstack. ‰SAVE_STATEŠL1_PART  *"*ˆif(requestor<>real-timetask)*ˆthengotonot_rt_task;* ‰BTSTW…#TSKARTIM,TCBATTR(A6)‰BEQ.S…NOT_RT_TASK  */*ˆmultiplyD0by4;/*‚Getindexintotable1‡*/ *ˆif(D0<0)7*ˆthengotouser_dir;Š/*‚Userconfigureddirective.‚*/* ‰ASL.W…#2,D0‰BMI.S…USER_DIR  *$*ˆif(D0>biggestdirectivenumber)*ˆthenexit(baddirective);* ‰CMP.W…#HI_T1_NUM*4,D0‰BHI.S…BAD_DIR  * *ˆA4<==addr(parameterblock);.*ˆD2<==(option_bits)&(offset(directive)); *ˆif(target_tcb_required=set)*ˆthenget(target_tcb);#*ˆgotodirectivepointedtobyD0;* ‰MOVE.L„A0,A4‰MOVE.L„TABLE1(PC,D0.W),D2 ‰IF‚‚THEN.S‰GET_TARGET_TCB‰ENDI ‰JMP‡TABLE1(PC,D2.W)‰PAGE*:*ˆHerearesomebranchinstructions.‚Thepurposeinhaving=*ˆthisbranchtobrancharchitecture,wastomakethetrap#1>*ˆhandlerforreal-timetasksasfastaspossible,eventhough<*ˆthisarchitecturewouldslowdownthetrap#1handlingfor*ˆnonreal-timetasks.*=*ˆTheprioritiesonhandlingtrap#1requestsareasfollows:**1.)‚real-timetasks,*2.)‚nonreal-timetasks,!*3.)‚userconfigureddirectives.  *1*ˆUserexecutedatrap#1whileexecutinganISR.* ISR_RTE: ‰BRA.L…ISRRTE  *&*ˆClienttaskisnotareal-timetask.* NOT_RT_TASK:‰BRA.L…TRAP1_10  ***ˆTrapisforauserconfigureddirective.* USER_DIR:‰BRA.L…TRAPUSR  *(*ˆTrapcontainedabaddirectivenumber:* BAD_DIR:$‰EXIT†RTCDDIRNŒexit(baddirective);‰PAGE@*****************************************************************"*ˆENTRYCONDITIONSFORDIRECTIVES:*+*A4<==parameteraddress(ifapplicable);!*A6<==clienttasktcbaddress;*?***************************************************************‰PAGEO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***I***…FUNCTION:‚Inthisfileisthe#TRAP#1tablecontainingoneentry‚***<***foreveryTRAP#1directive.‚Eachentrycontainsthe„******followingfields:¨******É***.***•1.)‚bytedescribingdirectiveoptions:***%***šA.)‚parameterblockrequired:‘*** ***šB.)‚targettcbrequired:–******É***5***•2.)‚bytedescribinglengthofparameterblock†******š(ifrequired):¡******É***5***•3.)‚wordcontainingoffsettodirectivecode:†******É***O******************************************************G *************************O*******************************************************************************O*^*****************************************************************************‰PAGE*:*ˆTheSETUP1macroisusedfordefiningentriesinTABLE1.?*ˆInputstothismacroaretheequateforthedirectivenumber,>*ˆandthelableoftheroutinewhichprocessesthatdirective.<*ˆSETUP1willgeneratea16bitoffset,fromthebeginingof*ˆTABLE1,tothedirective.* * *ˆexample:*A*ˆSETUP1‚,,,,* TT‡EQU‡%10000000PB‡EQU‡%01000000T1TRGTSKEQU‡31T1PARBLKEQU‡30 SETUP1ƒMACRODIR_NUM‚SET‡(*-TABLE1)/4‰IFNE†DIR_NUM-\1SHOULD_BE‚SET…\10‹FAIL„499‘Thisdirectiveisinthewrongplace!!‹MEXIT‰ENDC‰IFC‡'\5','TT'‹DC.B„TT+PBget(pb&tt);‹DC.B„\4’len(pb);‹NOLIST ‹XREF.S‚\2‹LIST#‹DC.W„\2-TABLE1‹offset(directive);‹MEXIT‰ENDC‰IFC‡'\3','PB'‹DC.B„PB’get(pb);‹DC.B„\4’len(pb);‹NOLIST ‹XREF.S‚\2‹LIST#‹DC.W„\2-TABLE1‹offset(directive);‹MEXIT‰ENDC‰DC.B†%00000000‹get();‰DC.B†0“len(pb)=0;‰NOLIST ‰XREF.S„\2‰LIST#‰DC.W†\2-TABLE1‹offset(directive);ˆENDM  ‰PAGETABLE1:2‡SETUP1ƒT10,ERROR_01Error-baddirectivenumber. 4‡SETUP1ƒT1GTSEG,SEGALOC,PB,24,TTƒAllocateasegment. 6‡SETUP1ƒT1DESEG,SEGDEAL,PB,24,TTƒDeallocateasegment. 3‡SETUP1ƒT1TRSEG,TFRSEG,PB,24,TT„Transferasegment. <‡SETUP1ƒT1ATTSEG,ATTSEG,PB,24†Attachtoashareablesegment. >‡SETUP1ƒT1SHRSEG,SEGSHAR,PB,24,TT‚Grantsharedsegmentaccess. ;‡SETUP1ƒT1MOVELL,MOVELL,PB,28,TTƒMovefromlogicaladdress. ;‡SETUP1ƒT1DCLSHR,DCLSHAR,PB,24…Declareasegmentshareable. 5‡SETUP1ƒT1SNAPTRAC,SNAPTRACˆMovetracetabletouser. :‡SETUP1ƒT1RCVSA,RCVSA,PB,28,TT…Receivesegmentattributes. /‡SETUP1ƒT1GTTID,GTTASKID,PB,08…GetTCBaddress. '‡SETUP1ƒT1CRTCB,CRTCB,PB,28ˆCreateTCB. 0‡SETUP1ƒT1GTTNAME,GTTNAME,PB,08,TTGettaskname. *‡SETUP1ƒT1START,TSKSTART,PB,10…Starttask. (‡SETUP1ƒT1ABORT,ABORTŽAborttask(self). *‡SETUP1ƒT1TERM,TERMTerminatetask(self). 6‡SETUP1ƒT1TERMT,TERMT,PB,10ˆTerminatetask(notself). -‡SETUP1ƒT1SUSPND,SUSPEND‹Suspendtask(self). 7‡SETUP1ƒT1RESUME,RESUME,PB,08,TTƒResumesuspendedtask. )‡SETUP1ƒT1WAIT,TSKWAITBlocktask(self). 7‡SETUP1ƒT1WAKEUP,WAKEUP,PB,08,TTƒWakeupawaitingtask. #‡SETUP1ƒT1DELAY,DELAYŽDelay(self). -‡SETUP1ƒT1RELINQ,RELINQŒRelinquishexecution. :‡SETUP1ƒT1TSKATTR,TSKATTR,PB,08,TTReturntaskattributes. 6‡SETUP1ƒT1SETPRI,SETPRI,PB,09,TTƒSetcurrentpriority. -‡SETUP1ƒT1STOP,STOPT,PB,08‰Stoprunningtask. 6‡SETUP1ƒT1EXPVCT,EXPVCT,PB,36†Claimexceptionvectors. 1‡SETUP1ƒT1TRPVCT,TRPVCT,PB,56†Claimtrapvectors. =‡SETUP1ƒT1TSKINFO,TSKINFO,PB,14,TTMovetask'sTCBtocaller. =‡SETUP1ƒT1RQSTPA,RQSTPA,PB,26,TTƒRequestperiodicactivation. /‡SETUP1ƒT1DELAYW,DELAYWŒDelaywithwaitoption. 1‡SETUP1ƒT1GTASQ,ASQALOC,PB,22,TTƒAllocateanASQ. *‡SETUP1ƒT1DEASQ,ASQFREEŒDeallocateanASQ. )‡SETUP1ƒT1SETASQ,ASQSTATSŠSetASQstatus. -‡SETUP1ƒT1RDEVNT,ASQREAD‹ReadeventfromASQ. 5‡SETUP1ƒT1QEVNT,ASQEVENT,PB,18,TT‚QueueeventtoASQ. (‡SETUP1ƒT1WTEVNT,WTEVENT‹Waitforevent. +‡SETUP1ƒT1RTEVNT,RTEVENT‹Returnfromevent. ,‡SETUP1ƒT1GTEVNT,GTEVENT‹GeteventfromASQ. ,‡SETUP1ƒT139,ERROR_01ŽError-baddirective. ,‡SETUP1ƒT140,ERROR_01ŽError-baddirective. 0‡SETUP1ƒT1ATSEM,ATSEM,PB,10ˆAttachtosemaphore. .‡SETUP1ƒT1WTSEM,WTSEM,PB,10ˆWaitonsemaphore. -‡SETUP1ƒT1SGSEM,SGSEM,PB,10ˆSignalsemaphore. 2‡SETUP1ƒT1DESEM,DESEM,PB,10ˆDetachfromsemaphore. -‡SETUP1ƒT1CRSEM,CRSEM,PB,10ˆCreatesemaphore. <‡SETUP1ƒT1DESEMA,DESEMAŒDetachallsemaphoresforthistask. ,‡SETUP1ƒT147,ERROR_01ŽError-baddirective. ,‡SETUP1ƒT148,ERROR_01ŽError-baddirective. ,‡SETUP1ƒT149,ERROR_01ŽError-baddiH rective. ,‡SETUP1ƒT150,ERROR_01ŽError-baddirective. =‡SETUP1ƒT1SERVER,SERVER,PB,06†Establishserverforusertask. 4‡SETUP1ƒT1DSERVE,DSERVEŒDetachfromserverfunction. 7‡SETUP1ƒT1DERQST,DERQSTŒSetuser/serverrequeststatus. <‡SETUP1ƒT1AKRQST,AKRQST,PB,20,TTƒAcknowledgeserverrequest. ,‡SETUP1ƒT155,ERROR_01ŽError-baddirective. ,‡SETUP1ƒT156,ERROR_01ŽError-baddirective. ,‡SETUP1ƒT157,ERROR_01ŽError-baddirective. 2‡SETUP1ƒT1CDIR,CDIR,PB,08ŠConfigureuserdirectiv. )‡SETUP1ƒT159,SUPER‘Entersupervisormode. "‡SETUP1ƒT1CMR,CMR’Channelrequest. 4‡SETUP1ƒT1CISR,CISR,PB,20,TT‡Claiminterruptvector. 6‡SETUP1ƒT1SINT,SINT,PB,04ŠSimulateuserI/Ointerrupt. ,‡SETUP1ƒT163,ERROR_01ŽError-baddirective. ;‡SETUP1ƒT1EXMON,EXMON,PB,16,TT…Attachtoexceptionmonitor. >‡SETUP1ƒT1DEXMON,DEMON,PB,16,TT„Detachfromexceptionmonitor. <‡SETUP1ƒT1EXMMSK,EXMMSK,PB,12,TTƒSetexceptionmonitormask. 6‡SETUP1ƒT1RSTATE,RSTATE,PB,12,TTƒReceivetask'sstate. 2‡SETUP1ƒT1PSTATE,PSTATE,PB,12,TTƒSettask'sstate. B‡SETUP1ƒT1REXMON,REXMON,PB,12,TTƒExecutetaskunderexmoncontrol. ,‡SETUP1ƒT170,ERROR_01ŽError-baddirective. ,‡SETUP1ƒT171,ERROR_01ŽError-baddirective. 9‡SETUP1ƒT1MOVEPL,MOVEPL,PB,28†Movefromphysicaladdress. 0‡SETUP1ƒT1STDTIM,STDTIM,PB,08†Setdateandtime. 0‡SETUP1ƒT1GTDTIM,GTDTIM,PB,08†Getdateandtime. )‡SETUP1ƒT1FLUSHC,FLUSHCŒFlushusercache.  >HI_T1_NUMEQU(*-TABLE1)/4-1HighestTRAP#1directivenumber. ‰PAGE*3*ˆThisistheroutinewhichprocessestrap#1calls*ˆfromnonreal-timetasks.* *"*ˆTracethistrap#1,ifrequired.* TRAP1_10:-‰BTST†#TRCFTRP1,TRACFLAGŒDowewanttotrace?‰BEQ.S…TRAP1_20–Branchifno. !‰BSR‡TRACER˜Tracethisdirective. ‰DC.W†$FF15 *'*ˆSendamessagetoEXMON,ifrequried.* TRAP1_20:0‰BTST†#TSKIEXM,TCBATTI(A6)ŠDoestaskhaveEXMON?‰BEQ.S…TRAP1_30–Branchifno. 3‰MOVE.L„TCBEMMSK(A6),D1Movemasktodataregister.(‰BTST†#TEMTRAP1,D1’IsTRAP#1monitored?‰BEQ.S…TRAP1_30–Branchifno. %‰MOVE.L„#1,D7™PassTRAP#toCKEXMON.&‰BSR‡CKEXMON—GosendmessagetoEXMON.  */*ˆmultiplyD0by4;/*‚Getindexintotable1‡*/ *ˆif(D0<0)7*ˆthengototrap_usr;Š/*‚Userconfigureddirective.‚*/* TRAP1_30: ‰ASL.W…#2,D0‰BMI.S…TRAPUSR  *$*ˆif(D0>biggestdirectivenumber)*ˆthenexit(baddirective);* ‰CMP.W…#HI_T1_NUM*4,D0‰BHI.S…TRAP1BAD  *.*ˆGetaddressofparameterblock,ifrequired.* ‰LEA‡TABLE1(PC),A3‰MOVE.L„(A3,D0.W),D2‰BTST†#T1PARBLK,D2‰BEQ.S…TRAP1_GO ‰MOVE.L„D2,D5‰SWAP†D5‰AND.L…#$FF,D5-‰MOVE.L„A0,D6LOGICALPARAMETERBLOCKADDRESS‰TR0.LOGPHY‚&‰BRA.S…TRAP1_40ŒBRANCHIFGOODADDRESS ‰NOP›BADADDRESS&‰EXIT†RTCDPBLKŒBADADDRESSRETURNCODE  TRAP1_40:.‰MOVE.L„D6,A4PARAMETERPHYSICALADDRESSTOA4  *&*ˆGettargetTCBaddress,ifrequired.* $‰BTST†#T1TRGTSK,D2ˆNEEDTARGETTASK?‰BEQ.S…TRAP1_GOŒBRANCHIFNO ‰TR0.GETTCB‚(A4)‰BRA.S…TRAP1_50ŒBRANCHIFFOUND‰EXIT†RTCDTASKŒBADTARGETTASK TRAP1_50:&‰MOVE.L„A0,A5TARGETTCBADDRESSTOA5 **ˆNowgotodirectivecode.* TRAP1_GO: ‰JMP‡(A3,D2)   *'*ˆHereisanotherbranchfromabranch,$*ˆemployedforperformancepurposes.* TRAP1BAD:‰EXIT†RTCDDIRN‰PAGETRAPUSR:&‰MOVE.L„UDRBEG,A2‹USERDIRECTIVETABLE‰MOVE.L„A2,D2DOESTABLEEXIST?‰BEQ.S…TRAP1BADŒBRANCHIFNO ,‰ASR.W…#2,D0GETUNMODIFIEDDIRECTIVENUMBER.‰NEG.W…D0’CHANGEDIRECTIVE#TOPOSITIVEVALUE2‰CMP.W…UDRCNT(A2),D0‡ISVALUEWITHINTABLELIMITS?&‰BGT.S…TRAP1BADŒBRANCHIFNOTINTABLE ‰SUB.W…#1,D0ENTRYNUMBER‰MULU†#UDRESIZ,D0‰*ENTRYSIZE(‰LEA‡UDRENTRY(A2,D0),A2‚POINTERTOENTRY!‰TST.L…UDRADDR(A2)‰ADDRESSEXIST?‰BEQ.S…TRAP1BADŒBRANCHIFNO .‰MOVE.W„UDROPT(A2),D2‡GETOPTION&EXITINDEX.)‰BCLR†#4,D2THISTRAPFOR1SESSIONONLY?‰BNE.S…TRAPUSR1ŒBRH ANCHIFNO "‰MOVE.L„UDRSESS(A2),D1†GETSESSION'‰CMP.L…TCBSESSN(A6),D1…DOESITCOMPARE?‰BNE.S…TRAP1BADŒBRANCHIFNO TRAPUSR1:(‰MOVE.L„(A7),TCBA6(A6)†MOVEA6INTOTCB.%‰CLR.W…TCBRTCD(A6)‰CLEARRETRUNCODE.(‰MOVE.W„D2,-(A7)ŒPUTEXITINDEXONSTACK ‰IFEQ†CHIPTYPE-680101‰MOVE.W„#$84,-(A7)ŠSIMULATETRAP1ONM68010STACK‰ENDC )‰PEAˆTRAP1XIT(PC)‡RETURNADDRESSTOSTACK‰MOVE.W…SR,-(A7)‹SRTOSTACK $‰MOVE.L„UDRADDR(A2),A2†ENTRYADDRESS ‰JMP‡(A2)  **ˆRETURNFROMDIRECTIVE* TRAP1XIT:'‰MOVE.W„TCBRTCD(A6),D0†Getreturncode.*‰EXIT.NEƒERRORExitiferrorindirective. ‰MOVE.W„(A7)+,D0ŒGetexitindex.5‰EXIT.EQƒSUB‘If(index=0)thentakesubroutineexit ‰IF.W†D0#2THEN.S4‰TR0.READY(A6)If(index=2)thenmaketaskready.‰ENDI 2‰EXIT†POSTEMPTŒIneithercase,takepostemptexit.‰ENDééé=/*=/*†M68XXX.TSKATTR.AF=/*,=/* Chain file to assemble M68XXX.TSKATTR.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.TSKATTR.LS=/*=/IFC \1ƒ=ARGM68XXX.TSKATTR.LS=/ENDIF=/*3=ASM M68XXX.TSKATTR.SA,M68XXX.TSKATTR.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééé I ‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE9TSKATTR‚IDNTƒ5,1‰68xxxDIRECTIVE--RECEIVETASKATTRIBUTES*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡*********************‡*‚TSKATTR‚*ƒRETURNTASKATTRIBUTES*‡*‚REV1.00ƒHLD6**‡*‚06/29/79‡**‡********************3*†THISROUTINERETURNSTASKATTRIBUTESTOREQUESTOR***‹ENTRY:A6HASADDROFTCB*’A5HASADDROFTARGETTASK *’A4HASPARAMETERBLOCKADDRESS*—0-TASKNAME*—4-SESSIONCODE**‹EXIT:D0HASRETURNCODE&*’D0=0„GOODRETURN,ATTRIBUTESINA0*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST$*ŠRTCDSTAT-10ƒTASKHASPENDINGSTOP*)*’A0HASATTRIBUTESFROMTCBINBITS0-15*™USERIDINBITS16-31***‰SECTIONLEVEL04* ‰XDEF†TSKATTR‰PAGE**ˆReturnattributes.* TSKATTR:0ŠMOVE.L‚TCBUSER(A5),TCBA0(A6)„RETURNUSERNUMBERŠMOVE.W‚TCBATTR(A5),TCBA0+2(A6)  **ˆCheckstoppendingbit:* 9‰BTST„#TSK2TRMP,TCBSTAT2(A5)Šif(taskisnotterminating))‰EXIT.EQƒSUB›thenexit(subroutineexit);&‰EXIT†RTCDSTAT–elsereturn(error_10);‰ENDéé D=/*=/*†M68XXX.TSKBORN.AF=/*,=/* Chain file to assemble M68XXX.TSKBORN.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.TSKBORN.LS=/*=/IFC \1ƒ=ARGM68XXX.TSKBORN.LS=/ENDIF=/*3=ASM M68XXX.TSKBORN.SA,M68XXX.TSKBORN.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDéééééI é !‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGE1TSKBORN‚IDNTƒ5,1…68xxxDIRECTIVE--CREATENEWTASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*TSKBORN…2.00**ˆ*’**ˆ*GGC303/21/79„**ˆ*761605/24/79„**ˆ*HLD603/02/81„**ˆ**********************ˆCREATEANDLINKANEWTCB*9*†ENTRY:‚A6ƒREQUESTOR'STCBADDRESS(MUSTBESYSTEMTASK)"*ŽA4ƒPARAMETERBLOCKINUSERSPACE*(A4)‚NEWTASKNAME*Œ4(A4)‚SESSIONCODE*Œ8(A4)‚W‚DIRECTIVEOPTION*‹10(A4)‚MONITOR*‹14(A4)‚SESSIONCODE%*‹18(A4)‚W‚CURRENTANDLIMITPRIORITY*‹20(A4)‚ATTRIBUTES*‹22(A4)‚ENTRYPOINT*‹26(A4)‚W‚USERNUMBER*0*„EXIT:‚SUCCESSD0=0‚NEWTCBCREATED/INITIALIZED*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE*ŠRTCDTFUL-5ƒASNTABLEFULL6*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-TASKALREADYEXISTS)*ŠRTCDNMEM-8ƒMEMORYSPACENOTAVAILABLE* *”01234567*‚USESREGISTERS‚D********’A*****‰SECTIONLEVEL04* ‰XDEF†ASGNMON ‰XDEF†CRTCB ‰XDEF†TCBCR ‰XREF.S„SEMTCB ‰XREF.S„TCBHD‰XREF.S„TDEFTYP ‰XREF†CRASN‰PAGE*'*ˆTrap#0entry--usedbyinitializer.**‡A3=ADDRESSOFMINI-TCB/*‡D4=PRIORITIES/ATTRIBUTES‡D5=ENTRYADDRESS)*‡D6=USERNUMBER‘D7=DIRECTIVEOPTIONS* TCBCR:&‰LEA‡-2(A3),A4‹POINTERTOMONITORTASK%‰MOVE.W„#$8001,D3‹CALLER'SATTRIBUTES ,‰BSR.S…CRTCB_SUB‹Callcreate_tcbsubroutine.‰RTS›Goodreturn. $‰ADD.L…#2,(A7)Error-signalerror,‰RTS›andreturn.‰PAGE*&*ˆTrap#1entry--usedbydirectives.* 0CRTCB„MOVE.L„A4,A3BOTHPOINTTOPARAMETERBLOCK2‰MOVEM.Lƒ18(A4),D4-D6ˆMOVEPARAMETERSTOREGISTERS"‰SWAP†D6’PUTUSERNUMINLOWER1/2"‰MOVE.W„8(A4),D7ŒDIRECTIVEOPTIONS *] 3^ ;T Cd K *‰MOVE.W„TCBATTR(A6),D3†CALLER'SATTRIBUTES#‰CLR.B…D3’CLEARINTERNALATTRIBUTES ,‰BSR.S…CRTCB_SUB‹Callcreate_tcbsubroutine.‰BRA.S…CRTCB_GOODŠGoodreturn. ,‰EXIT†ERRORError-gotoerrorreturn,with*¦errorcodeinD0.W. CRTCB_GOOD:'‰EXIT†SUB‘Goodreturn-returntouser.‰PAGE* *ˆCheckforduplicatetaskname.* CRTCB_SUB:‰TR0.GETTCB„(A3)6‰BRA.S…CRTCB_01ŒRETURNSHEREIFITISALREADYINTABLE5‰BRA.S…CRTCB_02ŒRETURNSHEREIFNOTINLIST-OK,GOON* CRTCB_01:%‰MOVE.L„#RTCDDPRQ,D0ˆSaveerrorcode,‰ADD.L…#2,(A7)signalerror,‰RTS›andreturn.  *3*ˆAllocatetwopagesofmemoryfornewtcbandtst.* CRTCB_02:‰CLR.L…D0’CLEARFORSHORTLOAD*‰MOVE.B„TDEFTYP,D0ŠGETDEFAULTMEMORYTYPE‰SWAP†D0’PUTTYPEINUPPER1/2!‰MOVE.W„#2,D0GET2PAGESFORTCB‰TR0.PAGALD0’REQUESTMEMORY"‰BRA.S…CRTCB_03ŒRETURNSHEREIFOK 9‰MOVE.L„#RTCDNMEM,D0ˆNotenoughmemory-saveerrorcode,‰ADD.L…#2,(A7)signalerror,‰RTS›andreturn.  **ˆCleartcbandtstareas.* CRTCB_03:&‰MOVE.L„A0,A5Holdaddressofnewtcb.2‰MOVE.W„#$200/4-1,D2ˆNumberoflongwordstoclear. CRTCB_04: ‰CLR.L…(A0)+Clearonelongword.#‰DBRA†D2,CRTCB_04‰Branchtilldone.  **ˆInitializethenewJ tcb.* (‰MOVE.L„(A3),TCBNAME(A5)„Savetaskname.)‰MOVE.L„4(A3),D0ŒSessionfromparameters. $‰BTST†#0,D3Wasthisatrap#0call?‰BNE.S…CRTCB_07ŒBranchifyes. +‰BTST†#TSKASYST,D3ˆIsclientasystemtask?8‰BEQ.S…CRTCB_05ŒIfnot,useclient'ssessionanduser#. ‰TST.L…D0’Issession=0?)‰BNE.S…CRTCB_07ŒIfnotzero,thenuseit..‰BRA.S…CRTCB_06ŒIfzero,useclient'ssession. CRTCB_05:+‰MOVE.W„TCBUSER(A6),D6†CALLER'SUSERNUMBER CRTCB_06:(‰MOVE.L„TCBSESSN(A6),D0…CALLER'SSESSION CRTCB_07:'‰MOVE.W„D6,TCBUSER(A5)†SAVEUSERNUMBER&‰MOVE.L„D0,TCBSESSN(A5)…SESSIONTOTCB  *#*ˆAssignamonitortothenewtask.* ‰BSR„ASGNMON  **ˆSettask'sattributes.* 6TCLRATTREQU„$FFFF-1<MAX‰BLS.S…CRTCB_12ŒBRANCHIFNO CRTCB_11:)‰MOVE.B„TCBLPRI(A6),D4†USECALLER'SLIMIT CRTCB_12:(‰MOVE.B„D4,TCBLPRI(A5)†SAVEMAXPRIORITY$‰CMP.B…D4,D0ISCURRPRIORITY>MAX?‰BLS.S…CRTCB_13ŒBRANCHIFNO "‰MOVE.B„D4,D0USELIMITASCURRENT CRTCB_13:,‰MOVE.B„D0,TCBCPRI(A5)†SAVECURRENTPRIORITY/‰MOVE.B„D0,TCBRPRI(A5)†SAVEREADYLISTPRIORITY  **ˆInitializeconstants.* *‰MOVE.L„#'!TCB',(A5)ˆEyecatcherfordump.7‰MOVE.B„#$80,TCBSTATE(A5)ƒSetinitialstatetodormant.:‰MOVE.W„#1,TCBASQSM(A5)…Initializesemaphorecounttoone.  * *ˆInitializetasksegmenttable.* 2‰MOVE.W„#1,TCBTSTSM(A5)SEMAPHOREWAITERCODE=NONE$‰MOVE.L„A5,A2™COMPUTEADDRESSOFTST‰ADD.L…#TSTBEGIN,A2’FOLLOWSTCB$‰MOVE.L„A2,TCBTST(A5)‘POINTERINTCB(‰MOVE.L„#'!TST',TST(A2)DUMPEYECATCHER1‰MOVE.B„#SEGMENTS,TSTNSEGS(A2)ˆNUMBEROFSEGMENTS2‰MOVE.W„#TSTMMU+24,TSTLMMU(A2)ˆPOINTTOMMUINUSE+‰MOVE.W„#TSTATTR+24,TSTLATTR(A2)†ATTRIBUTES  *#*ˆGetexclusiveaccesstotcblist.* ‰IFNEƒMULTPROC ‰TR0.P‚SEMTCB‰ENDC  *0*ˆSearch'tcb-all'listforduplicatetaskname.* ‰MOVE.L„TCBHD,A0 ‰MOVE.L„TCBNAME(A5),D0†TASKNAME‰MOVE.L„TCBSESSN(A5),D1…SESSION CRTCB_20:)‰CMP.L…#0,A0ISTHISENDOFTCB-ALLLIST?3‰BEQ.S…CRTCB_40ŒIfyes--Good.Noconflict.Goon. +‰CMP.L…TCBNAME(A0),D0†DOESTASKNAMEMATCH?‰BNE.S…CRTCB_21ŒBRANCHIFNO ,‰CMP.L…TCBSESSN(A0),D1…ISSESSIONSAMEALSO?)‰BEQ.S…CRTCB_30ŒBRANCHIFYES-DUPLICATE CRTCB_21:*‰MOVE.L„TCBALL(A0),A0‡GETNEXTTCBINLIST(‰BRA.S…CRTCB_20ŒBRANCHBACKTOTESTNEXT  *,*ˆDuplicatenamefound,freememoryfortcb.* CRTCB_30:‰IFNE†MULTPROC3‰TR0.V…SEMTCBŽRELEASEEXCLUSIVEACCESSTOTCBLIST.‰ENDC&‰TR0.PGFR‚(A5),#2Freememoryfortcb. ‰NOP›Ignorebadreturn.$‰MOVE.L„#RTCDDPRQ,D0ˆSeterrorcode,‰ADDQ.L„#2,(A7)signalerror,‰RTS›adnreturn.  **ˆGetAddressSpaceNumber* CRTCB_40:$‰BSR‡CRASNAttempttoassignanASN.$‰BRA.S…CRTCB_50ŒBranchifitworked. $‰MOVE.L„#RTCDTFUL,D0ˆSeterrorcode,‰ADD.L…#2,(A7)signalerror,‰RTS›andreturn.  **ˆPutnewtcbintcballlist.* CRTCB_50:-‰MOVE.L„TCBHD,TCBALL(A5)„Newforwardpointer.-‰MOVE.L„A5,TCBHDŒPutatheadoftcb-alllist.  J ‰IFNE†MULTPROC ‰TR0.V…SEMTCB‰ENDC  ‰RTS›Normalreturn.‰PAGE*+*ˆSubroutinetoassignmonitortonewtask.*ˆUsedbyCRTCBandTSKSTART.* ASGNMON:‰BTST†#15,D7ŽMONITORSUPPLIED?‰BNE.S…ASGMON_2ŒBRANCHIFYES ‰BTST†#14,D7ŽMONITORPROPAGATED?‰BEQ.S…ASGMON_9ŒBRANCHIFNO $‰MOVE.L„TCBMON(A6),D0‡PROPAGATENAME)‰MOVE.L„TCBMON+4(A6),D1…PROPAGATESESSION‰BRA.S…ASGMON_5ŒSTORETHEM ASGMON_2:'‰MOVE.L„14(A4),D1‹GETSPECIFIEDSESSION$‰MOVE.L„10(A4),D0‹GETSPECIFIEDNAME!‰BEQ.S…ASGMON_3ŒBRANCHIFNONAME 0‰BTST†#TSKASYST,TCBATTR(A6)‰ISREQUESTORAUSER?‰BEQ.S…ASGMON_4–BRANCHIFYES ‰TST.L…D1œISSESSIONSUPPLIED?‰BEQ.S…ASGMON_4–BRANCHIFNO-‰BRA.S…ASGMON_5–USENAMEANDSESSIONSUPPLIED  ASGMON_3:)‰MOVE.L„TCBNAME(A6),D0USEREQUESTORNAME ASGMON_4:-‰MOVE.L„TCBSESSN(A6),D1USEREQUESTORSESSION ASGMON_5:‰MOVE.L„D0,TCBMON(A5)‘PUTNAME#‰MOVE.L„D1,TCBMON+4(A5)PUTSESSION ASGMON_9:‰RTS‰ENDééééééé=/*=/*†M68XXX.TSKINFO.AF=/*,=/* Chain file to assemble M68XXX.TSKINFO.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.TSKINFO.LS=/*=/IFC \1ƒ=ARGM68XXX.TSKINFO.LS=/ENDIF=/*3=ASM M68XXX.TSKINFO.SA,M68XXX.TSKINFO.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééK ééé S'M68XXX TSKINFO SA h hQqqTSKMOVE AF q qqqTSKMOVE SA z zÈqqTSKSTARTAF “ “qqTSKSTARTSA œ œ%‹qqTSKWAIT AF Å ÅqqTSKWAIT SA Î Î<qqUSERVECTAF × ×qqUSERVECTSA à à eqqWAKEUP AF ñ ñqqAKEUP SAÿÿÿÿÿÿÿÿqq‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‡PAGEBTSKINFO‚IDNT„5,1„68xxxDIRECTIVE--MOVETARGETTASK'STCBTOBUFFER*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**Š********************Š*‚TSKINFO‚**Š*‘**Š*‚REV1.00HLD6‚**Š*†06/29/80ƒ**Š*********************ŠENTRY:‚A6‚REQUESTOR'STCB*’A4‚PARAMETERTABLEPOINTER*–0(A0)ƒTASKNAME*–4(A0)„SESSION&*–8(A0)„OPTIONS(BIT15ON=MOVETCB)*•10(A0)„BUFFERADDRESS*’A5‚TARGETTCBADDRESS*<*ŠTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2ODD0*8*ŠRTCDPBLK‚-2…PARAMBLOCKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK‚-3…SOURCETASKDOESNOTEXIST3*ŠRTCDALOW‚-9…ONLYSYSTEMTASKALLOWEDTOCOPYTCB1*ŠRTCDADR1‚-12…BUFFERNOTINUSER'SADDRESSSPACE$*ŠRTCDOPTƒ-15…OPTIONSNOTRECOGNIZED*ŒSECTION‚LEVEL04* ‰XDEF†TSKINFO‰PAGE**ˆCheckbufferaddress.* TSKINFO:4‰BTST†#TSKASYST,TCBATTR(A6)‰ISCALLERASYSTEMTASK?‰EXIT.EQƒRTCDALOW–ERRORIFNO. &‰TR0.LOGPHY‚,10(A4),#512‰BRA.S…TSKINFO2‰NOP '‰EXIT†RTCDADR1–BUFFERNOTINUSERSPACE  * *ˆFoundbuffer--checkoptions.* TSKINFO2:!‰BTST†#15,8(A4)•CHECKTCBOPTION."‰EXIT.EQƒRTCDOPT—ERRORIFNOTSET.  * *ˆMovetcb.* ‰MOVE.L„D6,A3™BUFFERADDRESS%‰MOVE.L„#128-1,D0•MOVE128LONGWORDS TSKINFO5:&‰MOVE.L„(A5)+,(A3)+“MOVETCBTOBUFFER‰DBRA†D0,TSKINFO5 !‰EXIT†SUB›EXIT(SUBROUTINEEXIT);‰ENDéK  `R=/*=/*†M68XXX.TSKMOVE.AF=/*,=/* Chain file to assemble M68XXX.TSKMOVE.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.TSKMOVE.LS=/*=/IFC \1ƒ=ARGM68XXX.TSKMOVE.LS=/ENDIF=/*3=ASM M68XXX.TSKMOVE.SA,M68XXX.TSKMOVE.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDéééééé i‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGEATSKMOVE‚IDNT…5,1ƒ68xxxDIRECTIVES--MOVELOGICALANDMOVEPHYSICAL*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**‡*******************6*‡*‚TSKMOVE‚*ƒMOVEDATAFROMONETASKTOANOTHER*‡*‘*0*‡*‚2.00…HLD6‚*†ORFROMPHYSICALADDRESSTOTASK*‡*…06/29/79„**‡*…02/26/81„**‡*********************†ENTRY:‚A6‚REQUESTOR'STCB*ŽA4‚PARAMETERTABLEPOINTER&*(A4)SENDER'SNAME‚0=USEREQUESTOR'S*Œ4(A4)ŠSESSN#&*Œ8(A4)‚STARTADDRESSOFSOURCEBUFFER**‹12(A4)‚RECEIVER'SNAME‚0=USEREQUESTOR'S*‹16(A4)SESSN#'*‹20(A4)‚RECEIVINGBUFFERSTARTADDRESS *‹24(A4)‚LENGTHOFDATAINBYTES**„EXIT‚D0=0‚SUCCESS*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARAMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒSOURCETASKDOESNOTEXIST)*ŠRTCDNFND-7ƒDESTINATIONTASKNOTFOUND8*ŠRTCDALOW-9ƒUSERTASKCANNOTMOVEDATATOSYSTEMTASK=*ŠRTCDLGCF-11ƒTRYINGTOMOVEODDTOEVENOREVENTOODDADDR5*ŠRTCDADR1-12ƒSOURCEBUFFERNOTINUSER'SADDRSPACE:*ŠRTCDADR2-13ƒDESTINATIONBUFFERNOTINUSER'SADDRSPACE*‰SECTIONLEVEL03* ‰XDEF„MOVELL ‰XDEF„MOVEPL*‰PAGEMOVEPL:‰MOVE.L‚8(A4),D6‰BRA.SƒTSKMOV4  *(*ˆCheck'from'taskandblockaddresses.* MOL VELL:%‰MOVE.L‚TCBTST(A5),D1‰ISTHEREATST?‰BEQ.SƒTSKMOV2EŽNO ‰TR0.LOGPHO‚,8(A4),24(A4)(‰BRA.SƒTSKMOV4GOODRETURN-FOUNDENTRY 3‰BRA.SƒTSKMOV2EŽONLYPARTOFBUFFERINTASK'SSPACE ‰TST.LƒD5”POINTERTOTSTENTRY?$‰BEQ.SƒTSKMOV2EŽBRANCHIFNO-ERROR +‰TST.BƒTSTCTL+1(A0,D5)‡ISITANMMIOENTRY?%‰BNE.SƒTSKMOV4BRANCHIFYES-USEIT TSKMOV2E:'‰EXIT„RTCDADR1ŽBUFFERNOTINUSERSPACE  *&*ˆCheck'to'taskandblockaddresses.* TSKMOV4: rY {V ƒ(‰MOVE.L„D6,D7SAVE'FROM'BUFFERADDRESS 6‰BTSTW…#TSKARTIM,TCBATTR(A6)‰ISTASKAREAL-TIMETASK.‰BEQ.S…TSKMOV4B–BRANCHIFNO. "‰MOVE.L„12(A4),D0•IFTCBA_DDR=0,$‰BEQ.S…TSKMOV4D–THENGOTOTSKMOV4D. #‰MOVE.L„D0,A0™IFTCB_ADDRPOINTSTO‰CMP.L…#'!TCB',(A0)•!TCB,"‰BEQ.S…TSKMOV5—THENGOTOTSKMOV5; "‰BRA.S…TSKMOV4C–ELSEREPORTERROR; TSKMOV4B:‰TR0.GETTCB‚12(A4)ŒFINDTCB‰BRA.SƒTSKMOV5 TSKMOV4C:#‰EXIT„RTCDNFNDŽCAN'TFIND'TO'TASK  **ˆFoundtask-checkaddresses.* TSKMOV4D:'‰MOVE.L„A6,A0USECLIENTTASKTCB_ADDR; TSKMOV5:4‰BTSTƒ#TSKASYST,TCBATTR(A6)ISCALLERASYSTEMTASK?‰BNE.S‚TSKMOV5AŽBRANCHIFYES 7‰BTSTƒ#TSKASYST,TCBATTR(A0)IS'TO'TASKASYSTEMTASK?‰BEQ.S‚TSKMOV5AŽBRANCHIFNO (‰EXITƒRTCDALOWŽUSERCAN'TMOVETOSYSTEM TSKMOV5A:%‰MOVE.L‚TCBTST(A0),D1…ISTHEREATST?‰BEQ.SƒTSKMOV6EŠNO ‰TR0.LOGPHO‚,20(A4),24(A4))‰BRA.SƒTSKMOV7‹BRANCHIFGOODENTRYFOUND 4‰BRA.SƒTSKMOV6EŠBUFFERPARTLYINTASK'SMEMORYSPACE (‰TST.LƒD5WASANENTRYPOINTERRETURNED?$‰BEQ.SƒTSKMOV6EŠBRANCHIFNO-ERROR /‰TST.BƒTSTCTL+1(A0,D5)ƒISTHISANMMIOSEGMENT?%‰BNE.SƒTSKMOV7‹BRANCHIFYES-USEIT TSKMOV6E:'‰EXIT„RTCDADR2ŠBUFFERNOTINUSERSPACE  *%*ˆFoundbothbuffers-movethedata.* TSKMOV7:,‰PEA…TSKMOV2E(PC)‚ERRORRETURNFORBUSERROR"‰MOVE.W‚#'BE',-(A7)ƒBUSERRORFLAG‰MOVE.L‚D7,A2‰'FROM'ADDRESS‰MOVE.L‚D6,A3‰'TO'ADDRESS‰MOVE.L‚24(A4),D3…LENGTH‰ADD.LƒD6,D7‰ADDADDRESSES‰BTST„#0,D7‰ISRESULTEVEN?-‰BEQ.SƒTSKMOV8‡BRANCHIFYES-GOODADDRESSES .‰ADD.Lƒ#6,A7‰REMOVEBUSERRORSTUFFFROMSTACK.‰EXIT„RTCDLGCF†CAN'TMOVEEVEN-ODDORODD-EVEN TSKMOV8:$‰BTST„#0,D6‰AREBOTHADDRESSESEVEN?‰BEQ.SƒTSKMOV9‡YES -‰MOVE.B‚(A2)+,(A3)+ƒBOTHODD-MAKETHEMEVEN/‰NOP˜ThisNOPcausestheexecutionunittowait)*§forthebusinterfaceunittofinishon&*§a68020,incasewegetabuserror.‰SUB.Lƒ#1,D3‰DECREMENTCOUNT‰BEQ.SƒTSKMOVR‡IF0--DONE TSKMOV9:‰MOVE.L‚D3,D4‰SAVELENGTH‰LSR.Lƒ#2,D3‰DIVIDEBY4/‰BRA.SƒTSKMOV11†BRANCHIFNOLONGWORDSTOMOVE TSKMOV10:#‰MOVE.L‚(A2)+,(A3)+ƒMOVELONGWORDS TSKMOV11:/‰DBRA„D3,TSKMOV10ƒDECREMENTCOUNTOFLONGWORDS/‰NOP˜ThisNOPcausestheexecutionunittowait)*§forthebusinterfaceunittofinishon&*§a68020,incasewegetabuserror.#‰AND.Lƒ#3,D4‰BITS0AND1OFLENGTH‰BRA.SƒTSKMOV14†NOMORETOMOVE TSKMOV12:‰MOVE.B‚(A2)+,(A3)+ƒMOVEBYTES TSKMOV14:*‰DBRA„D4,TSKMOV12ƒDECREMENTCOUNTOFBYTES/‰NOP˜ThisNOPcausestheexecutionunittowait)*§forthebusinterfaceunittofinishon&*§a68020,incasewegetabuserror. TSKMOVR:4‰ADD.Lƒ#6,A7‰REMOVE'BE'ANDERRORRETURNFROMSTACK!‰EXIT„SUB“exit(subroutineexit);‰ENDéL ééé=/*=/*†M68XXX.TSKSTART.AF=/*-=/* Chain file to assemble M68XXX.TSKSTART.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.TSKSTART.LS=/*=/IFC \1ƒ=ARGM68XXX.TSKSTART.LS=/ENDIF=/*5=ASM M68XXX.TSKSTART.SA,M68XXX.TSKSTART.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDéééééé ‹‰PAGE**ˆINCLUDEFILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGE5TSKSTARTIDNTƒ5,2†68xxxDIRECTIVE--STARTDORMANTTASK*$*ˆCOPYRIGHTED1980BYMOTOROLA,INC.**ˆ*********************ˆ*TSKSTART„2.00**ˆ*’**ˆ*GGC303/21/79„**ˆ*761605/02/79„**ˆ*HLD603/24/81„*'*ˆ*baw‚01/30/85‚fixforrealtimetask*ˆ*********************!*ˆSTARTATASKATITSENTRYPOINT*"*ƒENTRY:A6‚REQUESTORSTCBADDRESS*ŠA4‚PARAMETERBLOCK*‰(A4)TASKNAME*ˆ4(A4)SESSIONNO.1*ˆ8(A4)W‚DIRECTIVE‚15ON=MONITOR‚13ON=REGISTERS*ˆ10(A4)MONITORNAME*ˆ14(A4)SESSIONCODE'*ˆ18(A4)‚REGISTERSINSUPERSTACKFORMAT**IFREQUESTORISUSERTASKZEROTOPOFSR*(*ƒEXIT:‚D0=0‚IFTASKPUTONREADYLIST*<*ˆTHEFOLLOWINGRETURNCODESARERETURNEDINLOWER1/2OFD0*6*ŠRTCDPBLK-2ƒPARM AMBLKADDRNOTINUSER'SADDRSPACE)*ŠRTCDTASK-3ƒTARGETTASKDOESNOTEXIST/*ŠRTCDDPRQ-6ƒDUPLICATEREQUEST-TASKSTARTED1*ŠRTCDALOW-9ƒUSERTASKCANNOTSTARTSYSTEMTASK**.*ˆCHECKPARAMETERBLOCKFORALLINUSERMEMORY*‰SECTIONLEVEL04*‰XDEF‚TSKSTART‰XREF.SASGNMON‰PAGE**…CHECKPARAMETERBLOCKAGAIN* 5TSKSTARTMOVE.WSR,-(A7)ƒSavecurrentinterruptlevel#‰BTST‚#13,8(A4)ƒREGISTERSSUPPLIED?‰BEQ.STSKSTR0A *‰MOVE.L#82,D5„82BYTESIFREGISTERSGIVEN‰BRA.S‚TSKSTR0B )TSKSTR0A‚BTST‚#15,8(A4)ƒMONITORSUPPLIED?ŠBEQ.S‚TSKSTR1ƒBRANCHIFNO +ŠMOVE.L‚#18,D5„18BYTESIFMONITORSUPPLIED,TSKSTR0B‚MOVE.LTCBA0(A6),D6…LOGICALADDRESS.ŠTR0.LOGPHYƒ…CHECKPHYSICALADDR%ŠBRA.SƒTSKSTR1…BRANCHIFGOODADDRESS ŠNOPŠMOVE.W‚(A7)+,SRŠEXIT„RTCDPBLK 'TSKSTR1TST.Lƒ(A4)ˆISTASKNAME=ZERO?ˆBNE.SƒTSKSTR4†BRANCHIFNO **ŠSELECTATASKTOSTART* 5ˆMOVE.L‚TCBSESSN(A6),D1ƒWANTTASKINCALLER'SSESSION ”Y X ¥N ­U µ8(ˆMOVE.L‚TCBHD,A5‰1STTCBONTCB-ALLLIST(TSKSTR2‚CMP.Lƒ#0,A5‰ISTHISENDOFLIST?,ˆBEQ.SƒTSKSTR5‰BRANCHIFYES-NOTASKFOUND +ˆCMP.LƒTCBSESSN(A5),D1„CHECKSESSIONNUMBER!ˆBNE.SƒTSKSTR3‰BRANCHIFNOMATCH 2ˆBTST„#TSKASYST,TCBATTR(A5)‚ISTHISASYSTEMTASK?ˆBNE.SƒTSKSTR3ŒBRANCHIFYES -ˆBTST„#TSKSDORM,TCBSTATE(A5)‚ISTASKDORMANT?ˆBEQ.SƒTSKSTR3ˆBRANCHIFNO 0ˆBTST„#TSKSDORM,TCBSTATE+2(A5)‚WASTASKSTOPPED?2ˆBNE.SƒTSKSTR9AˆBRANCHIFYES-FOUNDONETOSTART 1TSKSTR3MOVE.L‚TCBALL(A5),A5ƒGETADDROFNEXTTCB&ˆBRA.SƒTSKSTR2‹BRANCHBACKTOCHECKIT  *(*‡LOOKFORTASKNAMEDINPARAMETERBLOCK* $TSKSTR4TR0.GETTCB‚(A4)„LOOKFORTCBˆBRA.S„TSKSTR6ƒBRANCHIFFOUND  **…NOTASKFOUND-RETURNERROR* -TSKSTR5CLR.LƒTCBA0(A6)‡NOTASKNAMERETURNEDˆMOVE.W‚(A7)+,SRˆEXIT„RTCDTASKˆERROR-NOTASK  **‡CHECKFORLEGALREQUEST* 6TSKSTR6MOVE.L‚A0,A5‚TCBADDRESSOFTASKTOBESTARTEDˆCMP.LƒA5,A6‚ISTASK=CALLER?$ˆBEQ.SƒTSKSTR7„BRANCHIFYES-ERROR 4ˆBTST„#TSKASYST,TCBATTR(A5)‚ISTARGETASYSTEMTASK?ˆBEQ.SƒTSKSTR8†BRANCHIFNO 4ˆBTST„#TSKASYST,TCBATTR(A6)‚ISCALLERASYSTEMTASK?ˆBNE.SƒTSKSTR8†BRANCHIFYES  TSKSTR7:)‰MOVE.W‚(A7)+,SRRESTOREINTERRUPTLEVEL.‰EXIT„RTCDALOWERROR  ,TCBPC(A5),#2%‰BRA.S‚TSKSTRR1ŒBRANCHIFGOODRETURN ‰NOP(‰MOVE.W(A7)+,SRRESTOREINTERRUPTLEVEL(‰EXITƒRTCDADR1ERROR-BADENTRYADDRESS  7TSKSTRR1MOVE.LD6,TCBPC(A5)ŠPHYSICALADDRESSFORENTRY  *1*ˆCHANGEALLLOGICALADDRESSESINTSTTOPHYM SICAL* /‰MOVE.W‚TSTLMMU(A0),D5‡OFFSETTOLASTMMUENTRY4TSKSTRR2BTST„#SEGAUSED,TSTAATTR(A0,D5)‚EMPTYENTRY?‰BEQ.SƒTSKSTRR3BRANCHIFYES +‰MOVE.W‚TSTPO(A0,D5),D0†GETPHYSICALOFFSET+‰ADD.WƒD0,TSTLB(A0,D5)†ADDTOLOGICALBEGIN)‰ADD.WƒD0,TSTLE(A0,D5)†ADDTOLOGICALEND)‰CLR.WƒTSTPO(A0,D5)‰CLEARPHYSICALOFFSET&TSKSTRR3SUB.Lƒ#8,D5NEXTENTRYOFFSET'‰CMP.Wƒ#TSTMMU,D5‹ALLSEGMENTSCHECKED?‰BGE…TSKSTRR2BRANCHIFNO  **ˆSETINITIALREGISTERS* 4TSKSTRT6CLR.W‚TCBSTATE+2(A5)†CLEARSAVEDSTATEWORD'‰BTSTƒ#13,8(A4)‡AREREGISTERSSUPPLIED?‰BEQ.S‚TSKSTRT7ˆBRANCHIFNO #‰LEA„18(A4),A3†POINTTOSUPPLIEDD0'‰MOVEM.L(A3)+,D0-D7ƒGETDATAREGISTERS)‰MOVEM.LD0-D7,TCBD0(A5)‚PUTINTCBSTACK*‰MOVEM.L(A3)+,D0-D6ƒGETADDRESSREGISTERS)‰MOVEM.LD0-D6,TCBA0(A5)PUTINTCBSTACK  **†SHOULDTASKBEONREADYLIST* )TSKSTRT7‚OR.Wƒ#$700,SR‡INHIBITINTERRUPTS.ŠBCLR‚#TSKSDORM,TCBSTATE(A5)‚CLEARDORMANTBIT&ŠMOVE.WTCBSTATE(A5),D0„GETSTATEWORD0ŠAND.W‚#TSKSWMSK-1<