IMD 1.17: 25/11/2014 13:16:46 82VKXBVERDOS D* BT24:0 68K VERSADOS/RMS68K OBJECT 4.5 (DS,DD 96 tpi 5.1/4" DISK) REVISED: 04/22/86 DISK 24 OF 24  BT24 82VKXBVERDOS 0420²g-=/* to accomodate the PASCAL ROM capability, and is now called=/* RROM.FINIT.SA=/*=/IFC \1ƒ=ARG�RROM.FINIT.LS=/ENDIF=/*(=ASM RROM.FINIT.SA,RROM.FINIT.RO,\1;Z=64=/*{ Included files are:=/*ƒRR.RTEQU.SA=/*ƒRR.MACROS.SA=/*ƒRR.FPMACRO.SA=/*}=/*=ENDNNNNNN(=/*=/*†RROM.FPOINT.AF=/*G=/* This file was originally called FPSRR.FPOINT.SA but it was modified>=/* to accomodate the PASCAL rom capability, and is now called=/* RROM.FPOINT.SA=/*=/IFC \1ƒ=ARG�RROM.FPOINT.LS=/ENDIF=/**=ASM RROM.FPOINT.SA,RROM.FPOINT.RO,\1;Z=64=/*{ Included files are:=/*ƒRR.RTEQU.SA=/*ƒRR.MACROS.SA=/*}=/*=ENDNNNNN N1=/*=/*†RROM.INIT.AF=/*F=/* This file was originally called UTILRR.INIT.SA but it was modified>=/* to accomodate the PASCAL rom capability, and is now called=/* RROM.INIT.SA=/*E=/* Chain file to assemble the rom version of the PASCAL initializer.=/*&=/*�Parameter�01†Output�listing/device4=/*“This�parameter�is�optional�and�will�be�defaulted=/*“if�not�specified=/*=/IFC \1ƒ=ARG�RROM.INIT.LS=/ENDIF=/*3=ASM RR.VDOSVM.SA/RROM.INIT.SA,RROM.INIT.RO,\1;Z=64=/*{ Included files are:=/*ƒRR.FIOEQU.SA=/*}=/*=ENDNNNNN:=/*=/*†RROM.PFPOINT.AF=/*C=/*†Chain�file�to�assemble�the�dummy�module�to�satisfy�the�externalB=/*†reference�'.PFPOINT'�for�the�file�IOSRR.WRR.SA.�This�module�isC=/*†used�with�the�version�of�the�rom�library�which�DOES�NOT�support=/*†floating�point�capability.=/*&=/*ˆParameter�01†Output�listing/device4=/*šThis�parameter�is�optional�and�will�be�defaulted=/*šif�not�specified.=/*=/*ˆPARAMETER�01�EDITS=/*=/IFC \1ƒ=ARG�RROM.PFPOINT.LS=/ENDIF=/*)=ASM RROM.PFPOINT.SA,RROM.PFPOINT.RO,\1;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDNN NNNC=/*=/*ˆRROM.PLJSR.AF=/*;=/*ˆChain�file�to�assemble�the�PASCAL�long�jump�subroutine.=/*=/IFC \1=ARG RROM.PLJSR.LS=/ENDIF=/*=/*%=ASM RROM.PLJSR.SA,RROM.PLJSR.RO,\1;R=/*{ Included files are:=/*ƒ--�none�--=/*}=ENDNNNNNNNL**E*†The�relocatable�output�from�this�assembly�will�be�use�in�the�SYSGEN*†link.*G*†It�contains�a�MINIMUM�dummy�comand�line�which�can�be�modified�to�meetF*†the�user's�needs.�Typically�the�user�WILL�modify�the�command�line�toD*†assign�logical�units�5�and�6�when�a�requirement�for�terminal�usage *†exists.*E*†Normally�SESSION�CONTROL�would�assign�logical�units�5�and�6�for�theC*†task�being�invoked,�however�SESSION�CONTROL�does�not�exist�in�the*†ROM�based�system.**,*†If�the�user�had�the�following�PROGRAM�line**ˆPROGRAM�TASK(INPUT,OUTPUT);*?*�THEN�he�should�modify�the�command�line�to�assign�BOTH�logical*�units�five�(5)�and�six�(6):**’I=#CN00,O=#CN00;Z=1* *�HOWEVER*,*�If�the�user�had�the�following�PROG RAM�line**ˆPROGRAM�TASK(OUTPUT)*?*�THEN�he�should�modify�the�command�line�to�assign�ONLY�logical *�six�(6).* *’O=#CN00;Z=1*-*ˆwhere�terminal�CN00�was�arbitrarily�chosen.***E*ˆA�data�definition�to�create�the�MINIMUM�command�line�which�contains *ˆthe�'Z'�option�is�shown�below.*B*ˆThe�intent�of�this�comand�line�is�to�force�PASCAL�to�have�to�get*ˆa�new�dymamic�data�segment.*?*ˆThis�command�line�can�be�altered�to�suit�the�user's�needs�BUTF*ˆthe�'Z'�option�is�required.�The�value�of�the�'Z'�has�been�arbitrarlyH*ˆchosen.�If�the�user�does�not�have�a�need�for�additional�'Z'�space�thenC*ˆthe�'Z'�option�part�of�the�command�line�as�shown�will�accompolishH*ˆthe�desired�intent.�If�for�whatever�reason�the�user�determines�that�heB*ˆneeds�a�'Z'�value�larger�than�that�arbitrarly�chosen�then�he�canA*ˆchange�the�'Z'�option�accordingly.�Typically�the�user�will�haveC*ˆdebugged�his�PASCAL�task�prior�to�putting�it�in�rom�and�amount�of.*ˆ'Z'�space�will�have�already�been�determined.*A*ˆThe�user�will�note�that�a�buffer�space�of�hexadecimal�$9E�existB*ˆwith�the�unused�portion�being�set�to�NULL.�This�has�been�done�so?*ˆthat�the�user�can�patch�the�comand�line�if�necessary�prior�toU:^?*ˆburning�the�roms.�This�is�the�maximum�that�PASCAL�will�allow.** ‰SECTIONƒ9 ‰XDEF†CMDLINE‰XDEF†CMDLINEL* CR‡EQU‡$0DCMDLINBF�EQU‡$9E*CMDLINE: O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*@*ˆThe�following�line�is�all�that�needs�to�be�MODIFIED�to�reflect%*ˆthe�users�command�line�requirements*‰DC.B†';Z=1',CR *œThis�is�a�MINIMUM�command�line!*�The�'Z'�option�MUST�be�present.*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰DCB.B…(CMDLINBF-(*-CMDLINE)),0.*œFORCE�BALANCE�OF�COMAND�LINE�BUFFER�TO�NULLSCMDLINEL�DC.W†CMDLINBF*œFORCED�COMMAND�LINE�LENGTH‰ENDNNNNN?†TTL‰V�2.00�68K�PASCAL�FLOATING�POINT�INITIALIZATION�SUBROUTINE‰NOLIST‰INCLUDEƒRR.RTEQU.SA‰INCLUDEƒRR.MACROS.SA‰INCLUDEƒRR.FPMACRO.SA‰LIST*$*ˆFILE�RR.RTEQU.SA�HAS�BEEN�INCLUDED%*ˆFILE�RR.MACROS.SA�HAS�BEEN�INCLUDED&*ˆFILE�RR.FPMACRO.SA�HAS�BEEN�INCLUDED* †NOFORMATCFINIT�IDNT‚2,00‚68K�PASCAL�FLOATING�POINT�INITIALIZATION�SUBROUTINE †SECTION…8********E*….PFINIT�--‚INITIALIZE�THE�FLOATINT�POINT�PROCESSOR,�AND�THE�DEFAULT*‘EXCEPTION�HANDLER�ADDRESSES**…ENTRY:!*ˆ A5�=‚POINTER�TO�THE�PASCAL�RMA.**…EXIT:!*ˆA5�=‚POINTER�TO�THE�PASCAL�RMA.**…USES:*ˆ.‚==�NOT�TOUCHED*ˆ*‚==�USED�AND�DESTROYED*ˆP‚==�USED�BUT�PRESERVED*ˆR‚==�RETURNED1*ˆA‚==�RETURNED�ADJUSTED�(LIKE�THE�STACK�POINTER)*ˆ-‚==�NOT�APPLICABLE*%*‹0�1�2�3�4�5�6�7�CNTRL�STATUS�INSTAD*ˆD:�P�.�.�.�.�.�.�.ƒ-…-…-*ˆA:�P�P�.�.�.�.�.�Aƒ-…-…-*‡FP:�.�.�.�.�-�-�-�-ƒR…R….* *…FUNCTION:<*‹THE�FUNCTION�OF�THIS�ROUTINE�IS�TO�INITIALIZE�THE�FLOATINGA*ˆPOINT�PROCESSOR�AND�SET�UP�THE�DEFAULT�TRAP�HANDLER�FOR�ALL�THE*ˆFLOATING�POINT�EXCEPTIONS.* *…EXTERNALS:*C*ˆ.PFINIT‚=‚DEF,�THE�ENTRY�POINT�TO�THE�FLOATING�POINT�INIT�ROUTINEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*?*ˆ.PFLOATP�=‚DEF,�DOUBLY-DEFINED�LABEL�WITH�FAST�FLOATING�POINT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**4*ˆ.PFPOINT�=‚REF,�THE�F-LINE�TRAP�SIMULATING�ROUTINE********B†XDEF‚.PFINIT…!�THE�ENTRY�POINT�TO�THE�FLOATING�POINT�INIT�ROUTINEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*?*…XDEF‚.PFLOATP„!�DOUBLY-DEFINED�LABEL�WITH�FAST�FLOATING�POINT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*3†XREF‚.PFPOINT„!�THE�F-LINE�TRAP�SIMULATING�ROUTINE*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**.PFLOATP�EQU‡**fGoPw@O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<**6*….PFINIT�--�THE�FLOATING�POINT�INITIALIZATION�ROUTINE*!ƒPROCEDURE�.PFINIT,*,*…SAVE�THE�REGISTERS�USED�AS�LOCAL�VARIABLES*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**…MOVEM.L‚D0/A0/A1,-(A7)*D*ˆThe�following�instructions�were�graciously�supplied�by�Dave�Mosley* ‰MOVE.L„A7,A6 ‰SUB.L…#58,A7 ‰MOVE.L„A7,A5‰MOVE.W„#RMASIZE+8,D0MLOOP:‰MOVE.W„(A6)+,(A5)+ ‰SUBQ.W„#2,D0 ‰BNE.S…MLOOP ‰LEA‡8(A7),A5 ‰MOVE.L„A5,A6*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*6*…INITIALIZE�THE�FLOATING�POINT�EXCEPTION�VECTOR�TABLE*C†MOVEQ„#NUMEXCEPTIONS,D0�!�D0�=�NUMBER�OF�EXCEPTION�VECTORS�TO�INIT5†MOVE.LƒLOWHEAP(A5),A0„!�A0�=�THE�LOWEST�HEAP�ADDRESSA†LEA†EXCEPTION_HANDLER(PC),A1ƒ!�A1�=�ADDRESS�OF�EXCEPTION�ROUTINE*F*…FILL�ALL�EXCEPTION�VECTORS�WITH�THE�ADDRESS�OF�THE�DEFAULT�EXCEPTION *…HANDLER*†REPEAT'‰MOVE.LƒA1,(A0)+‡!�FILL�WITH�AN�ADDRESS0‰SUBQ.Wƒ#1,D0Š!�DECREMENT�EXCEPTION�VECTOR�COUNT5†UNTIL�‘!�LOOP�UNTIL�ALL�EXCEPTION�VECTORS�FILLED**…SAVE�NEW�LOWEST�HEAP�ADDRESS*†MOVE.LƒA0,LOWHEAP(A5)*%*…BUILD�A�NEW�FREE�LIST�HEADER�RECORD* †MOVEQ„#-1,D0†MOVE.LƒD0,(A0)+ †MOVEQ„#0,D0†MOVE.LƒD0,(A0)+*"*…SAVE�THE�NEW�TOP�OF�HEAP�POINTER*†MOVE.LƒA0,HPTR(A5)*:*…INITIALIZE�THE�FLOATING�POINT�STATUS�AND�CNTRL�REGISTERS*†MOVE.Wƒ#INITSTATUS,D0†FMOVEEƒD,0,,S,STATUS†MOVE.Wƒ#INITCNTRL,D0†FMOVEEƒD,0,,S,CNTRL*4*…RETURN�TO�THE�ISLAND�IN�THE�COMMON�SECTION�'FINIT'*†MOVEM.L‚(A7)+,D0/A0/A1 ƒEND_PROCƒPAGE*;*‚EXCEPTION_HANDLER�IS�THE�DEFAULT�FLOATING�POINT�EXCEPTION *‚HANDLER.*'*Ž*************************************%*Ž*‚NOTE:�THIS�VERSION�IS�ONLY�GOOD‚*%*Ž*‚FOR�THE�SOFTWARE�IMPLEMENTATION‚*%*Ž*‚OF�THE�FLOATING�POINT�PROCESSOR‚*'*Ž***************************************‚ARGUMENTS�ARE:%*…A5‡=‚POINTER�TO�THE�USERS�REGISTERS.*…STATUSƒ=‚THE�FLOATING�POINT�ERROR�INDICATORS=*…INSTADƒ=‚THE�ADDRESS�OF�THE�FLOATING�POINT�INSTRUCTION�THAT*‘CAUSED�THE�ERROR*/ƒPROCEDURE�EXCEPTION_HANDLER,*0*…PUSH�THE�FLOATING�POIN T�PROCESSORS�A5�REGISTER*D***************************TEMP PATCH*******************************D*************THIS PATCH COMPENSATES FOR A BUG IN THE FP SOFTWARE****D********************************************************************3‰CLR.B‚3(A3)ˆCLEAR�TEMPSTAT�SO�WE�DON'T�ABORT�AGAIND**************************PATCH END*********************************D********************************************************************†MOVE.LƒA5,-(A7)*F*…LOAD�THE�PASCAL�PROGRAMS�A5�REGISTER�BACK�INTO�A5�(THE�RMA�POINTER).*†MOVE.LƒA5OFFSET(A5),A5*A*…SAVE�THE�REGISTER�CONTENTS�NOW�THAT�THE�RMA�POINTER�IS�RESTORED*†MOVEM.L‚D0-D7/A0-A7,REGS(A5)*9*…CHANGE�THE�SAVED�A5�TO�THE�FLOATING�POINT�PROCESSORS�A5*†MOVE.Lƒ(A7)+,REGS+52(A5)**…SAVE�THE�ERROR�ADDRESS*†FMOVEEƒS,INSTAD,,A,5,ERRADR**…BUILD�THE�ERROR�NUMBER�IN�D0.*†FMOVEEƒS,STATUS,,D,0†ROR.W„#8,D0�!�SWAP�BYTES2†LSR.B„#2,D0�!�MOVE�IOP�CODE�TO�THE�RIGHT�TWO�BITS"†ANDI.Bƒ#$F,D0Œ!�CLEAR�HIGH�NIBBLE1†ORI.B„#$20,D0‹!�SET�ERROR�KIND�TO�FLOATING�POINT†ROR.W„#8,D0�!�SWAP�BYTES�BACK0†MOVE.WƒD0,A0�!�A0�=�FLOATING�POINT�ERROR�NUMBER**…DO�AN�OPERATING�SYSTEM�ABORT*†TRAP…#14�!�DO�AN�EXEC�CALL)†DC.W…FP$ERRŒ!�FOR�A�FLOATING�POINT�ERROR* *‚END_PROCƒPAGE*$*Ž**********************************"*Ž*�THE�FOLLOWING�IS�THE�SPECIALƒ**Ž*�COMMON�SECTION�NEEDED�SO‡*#*Ž*�FLOATING�POINT�IS�ONLY�NEEDED‚*"*Ž*�AND�BROUGHT�IN�WHEN�THE�USERƒ*$*Ž*�REQUESTS�IT�BY�DOING�A�FLOATING**Ž*�POINT�OPERATION.�*$*Ž***********************************-FINIT�SECTION…8…!�COMMON�SECTION�CALLED�FINIT†CALL�.PFINIT,†RTS†END‰NOLIST‰INCLUDEƒRR.RTEQU.SA‰INCLUDEƒRR.MACROS.SA‰LIST ‰NOFORMAT*$*ˆFILE�RR.RTEQU.SA�HAS�BEEN�INCLUDED%*ˆFILE�RR.MACROS.SA�HAS�BEEN�INCLUDED*F‰TTL‚V�2.01�68K�PASCAL�FLOATING�POINT�F-LINE�TRAP�SIMULATOR�SUBROUTINEKFPOINTƒIDNT‚2,01‚68K�PASCAL�FLOATING�POINT�F-LINE�TRAP�SIMULATOR�SUBROUTINE*Ì!* ‰SECTION…8********D*….PFPOINT�--�THE�68K�PASCAL�TO�FLOATING�POINT�F-LINE�TRAP�SIMULATOR**…ENTRY:&*ˆALL�REGISTERS�=�68K�PASCAL�REGISTERS**ˆ(A7)Š=�POINTER�TO�THE�F-LINE�INSTRUCTION**…EXIT:D*ˆALL�REGISTERS�=�68K�PASCAL�REGISTERS,�POSSIBLY�MODIFIED�DUE�TO�THE)*˜RESULT�OF�THE�FLOATING�POINT�OPERATION.**…USES:2*ˆALL�REGISTERS�HAVE�THE�POSSIBLITY�OF�BEING�USED.* *…FUNCTION:7*‹THIS�ROUTINE�SIMULATES�AN�F-LINE�TRAP�THAT�WAS�CAUSED>*ˆBY�EXECUTING�A�F-LINE�INSTRUCTION.‚THIS�ROUTINE�WAS�SUPPLIEDA*ˆTO�CUT�DOWN�THE�TIME�REQUIRED�TO�DO�A�FLOATING�POINT�OPERATION.* *…EXTERNALS:*>*ˆ.PFPOINT�=‚DEF,�THE�ENTRY�POINT�TO�THE�F-LINE�TRAP�SIMULATOR*E*ˆ.P68341P�=‚REF,�THE�MAJOR�ENTRY�POINT�OF�THE�FLOATING�POINT�PACKAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*1*ˆ.PZMAIN‚=‚REF,�THE�PASCAL�PROGRAM�STACK�SEGMENT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<********=†XDEF….PFPOINT�!�THE�ENTRY�POINT�TO�THE�F-LINE�TRAP�SIMULATOR*B†XREF….P68341P�!�THE�MAJOR�ENTRY�POINT�OF�THE�FLOATING�PT.�PACKAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*1*…XREF….PZMAIN‚!�THE�PASCAL�PROGRAM�STACK�SEGMENT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*;*….PFPOINT�--�THE�F-LINE�TRAP�SIMULATOR�FOR�PASCAL�PROGRAMS*ƒPROCEDURE�.PFPOINT,*$*…FIRST�OFF�SAVE�THE�STATUS�REGISTER* †CLR.W„-(A7)�!CLEAR�SPOT�FOR�CCR"†MOVE.LƒD0,-(A7)�!PUSH�D0�ON�STACK!†SF‡D0“!CLR.B�D0�W/O�CHANGING�CCR%†BNE.S„CCZ’!CHECK�Z�BIT,BRANCH�IF�CLR%†BSET…#6,D0�!SET�BIT�6�TO�1�FOR�Z�BIT(CCZƒBCC.S„CCC’!CHECK�C�BIT,BRANCH�IF�CLREˆC�C %†BSET…#4,D0�!SET�BIT�4�TO�1�FOR�C�BIT(CCCƒBVC.S„CCV’!CHECK�V�BIT,BRANCH�IF�CLR%†BSET…#5,D0�!SET�BIT�5�TO�1�FOR�V�BIT(CCVƒBPL.S„CCN’!CHECK�N�BIT,BRANCH�IF�CLR%†BSET…#7,D0�!SET�BIT�7�TO�1�FOR�N�BIT!CCNƒROXR.Bƒ#4,D0�!ROTATE�X�BIT�IN †AND.W„#$1F,D0Ž!CLEAR�UPPER�BYTE#†MOVE.WƒD0,4(A7)�!SAVE�CCR�ON�STACK&†MOVE.Lƒ(A7)+,D0�!RESTORE�OLD�D0�VALUE*D*…CHECK�TO�SEE�IF�THERE�IS�ENOUGH�ROOM�ON�THE�STACK�TO�DO�A�FLOATING0*…POINT�OPERATION�WITHOUT�OVER-RUNNING�THE�HEAP.*†LEA†-FPSTACK(A7),A7†CMP.L„HPTR(A5),A7†LEA†FPSTACK(A7),A7**…IF�NO�MORE�ROOM�THEN�ERROR*†IF��THEN.S‰ERROR�STKHEAP†ENDI*/*…NOW�SAVE�ALL�OF�THE�PASCAL�PROGRAMS�REGISTERS*†MOVEM.L‚D0-D7/A0-A7,-(A7)*C*…MODIFY�THE�SAVED�VALUE�OF�THE�STACK�POINTER�SO�IT�POINTS�TO�WHERE<*…THE�TOP�OF�THE�STACK�WAS�WHEN�THE�JSR�TO�.PFPOINT�WAS�DONE!*…(I.E.�BELOW�THE�RETURN�ADDRESS)*†ADDQ.Lƒ#6,60(A7)*A*…SET�UP�THE�VALUES�NEEDED�BY�THE�FLOATING�POINT�PROCESSOR�IN�THE*…PROPPER�REGISTERS.*A†LEA†USER_MEM(PC),A4ƒ!�A4�=�A�POINTER�TO�THE�USER�MEMORY�TRANSFERO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*E*…MOVE.Lƒ#FPREGS-.PZMAIN+RMASIZE,D0�!�D0�=�OFFSET�FROM�A5�TO�FP�REGS.5†MOVE.Lƒ#RMASIZE,D0‡!�D0�=�OFFSET�FROM�A5�TO�FP�REGS.*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=†LEA†0(A5,D0.L),A3…!�A3�=�A�POINTER�TO�THE�FP.�REGISTER�BLOCK?†MOVE.LƒLOWHEAP(A5),A1„!�A1�=�ADDRESS�OF�LOWEST�ADDRESS�IN�HEAP:†LEA†-28(A1),A1ˆ!�A1�=�A�POINTER�TO�EXCEPTION�VECTOR�TABLE3†MOVE.LƒA7,A5�!�A5�=�POINTER�TO�THE�USERS�REGISTERS*!*…CALL�THE�FLOATING�POINT�PACKAGE*†CALL‚.P68341P,*1*…RESTORE�ALL�THE�PASCAL�REGISTERS�EXCEPT�FOR�A7.*†MOVEM.L‚(A7)+,D0-D7/A0-A6*-*…POP�THE�OLD�A7�OFF�THE�STACK�AND�IGNORE�IT.* †ADDQ.Wƒ#4,A7**…RETURN�TO�THE�CALLING�ROUTINE*†MOVE.Wƒ(A7)+,CCR ƒEND_PROCƒPAGE*D*‚USER_MEM�--�THIS�ROUTINE�TRANSFERS�DATA�TO/FROM�THE�FLOATING�POINT7*‚PROCESSORS�MEMORY�AREAS�OUT�OF/IN�TO�THE�USERS�MEMORY*‚ARGUMENTS�ARE:,*…D6�=‚DATA�SPACE�OR�PROGRAM�SPACE�INDICATOR9*…D7�=‚COUNT�OF�BYTES�TO�TRANSFER�AND�DIRECTION�INDICATOR/*…A2�=‚POINTER�TO�F.P.�PROCESSORS�MEMORY�BUFFER&*…A3�=‚POINTER�TO�USERS�MEMORY�OPERAND*!ƒPROCEDURE�USER_MEM,*#*…CHECK�IF�IT�IS�A�FETCH�OR�A�STORE* †TST.W„D7†IF��THEN.S**ˆIT�IS�A�STORE*.‰NEG.W�D7‡!�NEGATE�BYTE�COUNT�TO�MAKE�POSITIVE1‰EXGƒA2,A3„!�SWAP�SOURCE�AND�DESTINATION�POINTERS†ENDI**…TRANSFER�THE�DATA**…IS�IT�A�ONE�BYTE�TRANSFER�?* †SUBQ.Wƒ#1,D7†IF��THEN.S**ˆYES,�SO�TRANSFER�THE�BYTE*‰MOVE.Bƒ(A3),(A2)†ELSE.S**ˆIT�IS�A�MULTI-BYTE�TRANSFER* ‰SUBQ.Wƒ#1,D7‰WHILE��DO.S)ŒMOVE.Lƒ(A3)+,(A2)+�!�TRANSFER�FOUR�BYTES,ŒSUBQ.Wƒ#4,D7‡!�DECREMENT�BYTE�COUNT�BY�FOUR‰ENDW*/*ˆIS�THERE�STILL�A�WORD�LEFT�TO�BE�TRANSFERED�?*‰IF��THEN.S**‹YES�SO�TRANSFER�THE�WORD*ŒMOVE.Wƒ(A3),(A2)‰ENDI†ENDI*(*…RETURN�TO�THE�FLOATING�POINT�PROCESSOR* ƒEND_PROCƒPAGE***Ž****************************************)*Ž*�DECLARE�THE�MEMORY�FOR�THE�FLOATING‚**Ž*�REGISTER�BLOCK.–***Ž*****************************************O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?*ˆSECTION‚15‡!�THE�REGISTER�BLOCK�IS�SECTION�15�(STACK�SECTION) ‰OFFSETƒ0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<)FPREGSƒDS.W…29‡!�RESERVE�29�WORDS�FOR�IT.*ƒENDN ŠNOLISTŠINCLUDE�RR.FIOEQU.SAŠLIST*%*ˆFILE�RR.FIOEQU.SA�HAS�BEEN�INCLUDED* ‰OPT�PCS,FRS'‰IFEQ„VDOSEXˆ!�FOR�VERSADOS�ON�EXORMACS5‰TTL…V�2.12�68K�PASCAL�INITIALIZE�RUNTIME�ENVIRONMENT8INIT…IDNT„2,12‚68K�PASCAL�INITIALIZE�RUNTIME�ENVIRONMENT‰ENDC’!*ž!*‰IFEQ„VDOSVMˆ!�FOR�VERSADOS�ON�VERSAMODULE7‰TTL…V�2.12�68K�PASCAL�RUNTIME�INIT�FOR�VDOS�ON�VM01/02:INIT…IDNT„2,12ƒ68K�PASCAL�RUNTIME�INIT�FOR�VDOS�ON�VM01/02‰ENDC’!*ž!,‰IFEQ„RMSVM‰!�FOR�RMS68K�ONLY�ON�VERSAMODULE>‰TTL…V�2.12�68K�PASCAL�RUNTIME�INIT�FOR�RMS68K�ONLY�ON�VM01/02AINIT…IDNT„2,12ƒ68K�PASCAL�RUNTIME�INIT�FOR�RMS68K�ONLY�ON�VM01/02‰ENDC’!O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ‰IFEQ†VDOSEX!*ˆEXORMACS�VERSION�OF�INITIALIZER‰ENDC ‰IFEQ†VDOSVM$*ˆVERSAMODULE�VERSION�OF�INITIALIZER‰ENDC ‰IFEQ†RMSVM0*ˆVERSAMODULE�RMS68K�ONLY�VERSION�OF�INITIALIZER‰ENDCO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>* *ˆSECTION�8 ‰SECTION�9*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ** COPYRIGHT 1982 MOTOROLA, INC.** 1980-04-16 : JOHN KAUFMANN*-*�INIT�-�RUNTIME�DATA�INITIALIZATION.‚COMMAND%*ˆLINE�SCAN�IS�DETERMINED�BY�BIT�0�OF*ˆLOCATION�.PMAIN** LAST MODIFIED:1*ˆApril�19,�1982�by�Dave�Standage�-�Added�support3*ˆfor�VERSAdos�on�the�VM01�and�VM02,�and�for�RMS68K!*ˆplus�BIOS�on�the�VM01�and�VM02.*2*ˆ1982�Feb�08�by�John�Kaufmann�-�Corrected�problem3*ˆin�determining�size�of�current�stack-heap�segment/*ˆfor�comparison�with�z�option�request.‚Changed1*ˆmovement�of�rma�to�be�from�hi�to�lo�addrs�after*ˆadding�memory�via�z�option.*/*ˆ30�JULY�1981�BY�JOHN�KOEHRING�-�ADDED�SUPPORT-*ˆFOR�CHAIN�COMMAND�DIAGNOSTIC�REGISTER.‚CODE+*ˆREQUIRED�TO�ZERO�OUT�REGISTER�AT�START�OF *ˆEXECUTION.*%* MODIFIES REGISTERS: 0 1 2 3 4 5 6 7*“D�*�*�*�*�*�*�*�**“A�*�*�*�*�*�*�*�**˜E¡H©B±1¹DÁBÉEÑCÙMáMéFñOùJ 9* ON ENTRY (UNDER VERSADOS FOR EXORMACS OR VM01 OR VM02):*ˆD0.L„LOADING�TASK�NAME*ˆD1.L„SESSION�NUMBER*ˆD2.L„DEFAULT�USER�VOLUME*ˆD3.L„DEFAULT�USER�NUMBER*ˆD4.L,D5.L�DEFAULT�CATALOG*ˆD6.W„COMMAND�LINE�LENGTH*ˆD7.L„BIT�MASK�OF�LUN'S�PASSED**ˆA1.L„DEFAULT�TERMINAL�ID*,* ON ENTRY (UNDER RMS68K FOR VM01 AND VM02):(*ˆ(ALL�REGISTERS�HAVE�UNKNOWN�CONTENTS.)* * ON EXIT (IN ALL ENVIRONMENTS):!*ˆA3.L„POINTS�TO�LONG�JSR�ROUTINE&*ˆA5.L„POINTS�TO�START�OF�RUNTIME�DATA&*ˆA6.L„POINTS�TO�START�OF�RUNTIME�DATA&*ˆA7.L„POINTS�TO�START�OF�RUNTIME�DATA* * EXTERNALS: ‰XDEF„.PINITO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰XDEF†ASIGNRET *ˆXDEF„.PLJSR ‰XREF†CMDLINE‰XREF†CMDLINEL ‰XREF„.PLJSR‰XREF„.PZSTARTO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</‰XREF„.PMAIN,.PZMAIN,.PVTRAPD,.PVTRAPE,.PVBUSER‰XREF„.PSYMBUG0‰XREF„.PADDRER,.PVZDIV,.PVCHKI,.PVTRAPV,.POPTION*'‰IFNE„VDOSEXˆ!�NOT�VERSADOS�ON�EXORMACS** REFERENCE TO SYMBOL TO MARK THE START OF)* THE PASCAL DATA SEGMENT (IN SECTION 15)*ž!O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆXREF„.PZSTART†!*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰ENDC’!*ž!*ž!******8* REFERENCE TO MAKE SURE THAT THE ALLOCATE STACK ROUTINE6*�IS�LOADED�SINCE�INIT�WILL�ALWAYS�BE�LOADED.‚ALSTS�IS* NOT USED IN INIT.* ‰XREF„.PALSTS‰PAGE* ‰OPT…MEX‹!�SHOW�MACRO�EXPANSIONS*#* RECEIVE SEGMENT ATTRIBUTES MACRO.* \1 = SEGMENT NAME.=* (0 IN EXORMACS CASE WHERE CODE AND DATA SEGS ARE ADJACENT.)-* \2 = OFFSET INTO RMA TO PUT PARAMETER BLOCK$DORCVSA‚MACRO‘!�RECEIVE�SEGMENT�INFO9*�BEGIN‚DORCVSA�MACRO� ***********************************:* USES A5. MODIFIES A0,D0,A1. ****************************%‰LEA…\2(A5),A0…!�RECEIVE�SEGMENT�INFO ‰CLR.Lƒ(A0)Š!‰CLR.LƒSEGSES(A0)„!*ž!‰IFC…'\1','0'†!‰MOVE.W‚#SGOPLA,SEGOPT(A0)‰CLR.WƒSEGATT(A0)„!3‰CLR.LƒSEGNAM(A0)„!�NO�SEGMENT�NAME,�STORE�BINARY�0‰ENDC’!‰IFNC„'\1','0'†!‰CLR.WƒSEGOPT(A0)„!‰CLR.WƒSEGATT(A0)„!1‰MOVE.L‚#'\1',SEGNAM(A0)�!�STORE�THE�SEGMENT�NAME‰ENDC’!*ž!‰CLR.LƒSEGLEN(A0)„!‰LEA…SEGPTR+4(A0),A1�!‰MOVE.L‚A1,SEGPTR(A0)�!‰MOVE.L‚A0,SEGLAD(A0)�!‰MOVE.L‚#RCVSA,D0…! ‰TRAP„#1Œ!:* END OF DORCVSA MACRO ***********************************‰ENDM’!*?*�GET�A�SEGMENT�FROM�RMS68K.‚NAME�AND�SEG�LENGTH�ARE�ARGUMENTS.A* IF NAME IS '0', SEGMENT IS ALLOCATED NEXT TO EXISTING DATA SEG.DOGTSEG‚MACRO‘!9*�BEGIN‚DOGTSEG�MACRO�***********************************?*�A0�AND�D0�ARE�MODIFIED.‚D1�MAY�BE�MODIFIED.‚\2�(LEN)�IS�USED.*‰LEA…DL0(A5),A0„!�ALLOCATE�ANOTHER�SEGMENT2‰MOVE.L‚\2,SEGLEN(A0)�!�DATA�BLOCK�IN�DISPLAY�AREA‰CLR.LƒSEGTCB(A0)„!‰CLR.LƒSEGSES(A0)„!*ž!&‰IFC…'\1','0'†!�NO�SEGMENT�NAME�GIVEN.‰CLR.WƒSEGOPT(A0)„!.‰MOVE.L‚SGBRK(A5),D1‚!�MAKE�IT�CONTIGUOUS�WITH%‰ADDQ.L‚#1,D1‰!�CURRENT�DATA�SEGMENT.‰MOVE.L‚D1,SEGLAD(A0)�!‰MOVE.L‚D1,SEGNAM(A0)�!‰ENDC’!‰IFNC„'\1','0'†!1‰MOVE.W‚#SGOPPA,SEGOPT(A0)�!�LET�RMS�SUPPLY�ADDR.‰CLR.LƒSEGLAD(A0)„!2‰MOVE.L‚#'\1',SEGNAM(A0)�!�USE�SEG.�NAME�AS�IDENT.‰ENDC’!*ž!‰MOVE.W‚#SGATRW,SEGATT(A0)‰MOVE.L‚#GTSEG,D0…! ‰TRAP„#1Œ!:* END OF DOGTSEG MACRO ***********************************‰ENDM’!*2*�DEALLOCATE�A�SEGMENT.‚SEG�NAME�IS�ONLY�ARGUMENT.<* ASSUMES STACK POINTER DOES NOT POINT INTO DELETED SEGMENT.*DODESEG‚MACRO‘!�SEG�NAME�IS�ONLY�ARGUMENT.9*�BEGIN‚DODESEG�MACRO�***********************************9*�USES�A5.‚MODIFIES�A0�AND�D0.�**************************(‰LEA…DL0(A5),A0„!�GET�SOME�SCRATCH�SPACE‰CLR.LƒSEGLEN(A0)„!‰CLR.LƒSEGTCB(A0)„!‰CLR.LƒSEGSES(A0)„!‰CLR.WƒSEGOPT(A0)„!‰CLR.WƒSEGATT(A0)„!‰CLR.LƒSEGLAD(A0)„!%‰MOVE.L‚#'\1',SEGNAM(A0)�!�STORE�NAME‰MOVE.L‚#DESEG,D0…!"‰TRAP„#1Œ!�DEALLOCATE�THE�SEGMENT.&‰BNE…DERRŠ!�SHOULD�NEVER�REACH�DERR...:* END OF DODESEG MACRO ***********************************‰ENDM’!*#* INITIALIZE IMPORTANT PASCAL INFO./INITINFO�MACRO‘!�ARGS�ARE�START�ADD�AND�END�ADD9*�BEGIN‚INITINFO�MACRO�**********************************9*�MODIFIES�2,�A3.‚USES�A5.�******************************:* INITIALIZES SMALLEST HEAP ADDR, HEAP POINTER, SEGMENT **:* BOUNDARY AND FREE LIST. ********************************'‰MOVEA.L�\1,A2‰!�GET�DATA�SEGMENT�START‰LEA…VTABSZ(A2),A3.‰MOVE.L‚A3,SHPAD(A5)‚!�INIT�SMALLEST�HEAP�ADDR"‰MOVE.L‚#-1,(A3)+…!�INIT�FREE�LIST ‰CLR.Lƒ(A3)+%‰MOVE.L‚A3,HP(A5)…!�INIT�HEAP�POINTER(‰MOVE.L‚\2,SGBRK(A5)‚!�INIT�SEG�BOUNDARY:* END OF INITINFO MACRO **********************************‰ENDM*)* INITIALIZE PASCAL RT INTERRUPT VECTORS.!* ARGUMENTS ARE TWO ERROR LABELS.INITVECS�MACRO‘!9*�BEGIN‚INITVECS�MACRO�**********************************9*�USES�A2.‚MODIFIES�A0,A3,D0,D1.�************************#‰MOVEA.L�A2,A3‰!�CLEAR�VECTOR�TABLE‰MOVEQ.L�#VTABSZ,D1DI1\@„CLR.Lƒ(A3)+ ‰SUBQ.L‚#4,D1 ‰BNE.SƒDI1\@*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>)*‰LEA….PVTRAPD(PC),A0‚!�INIT�TRAP�VECTORS‰MOVE.L‚#.PVTRAPD,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,TRAPD(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVTRAPE(PC),A0‰MOVE.L‚#.PVTRAPE,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,TRAPE(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVBUSER(PC),A0‰MOVE.L‚#.PVBUSER,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,BUSER(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PADDRER(PC),A0‰MOVE.L‚#.PADDRER,A0O*<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,ADDRER(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVZDIV(PC),A0‰MOVE.L‚#.PVZDIV,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,ZDIV(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVCHKI(PC),A0‰MOVE.L‚#.PVCHKI,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,CHKI(A2)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*‰LEA….PVTRAPV(PC),A0‰MOVE.L‚#.PVTRAPV,A0O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰MOVE.L‚A0,TRAPV(A2)**‰LEA…VT2TF(A2),A0‚!�RECEIVE�TRAPS�2�THRU�F‰MOVE.L‚#RT2TF,D0‰TRAP„#1/‰BEQ.SƒDI2\@‰!�ERROR�CHECK�(*�NO�HANDLER�YET�*)\2‡MOVEA.L�D0,A0‰MOVE.L‚#ABORT,D0‰TRAP„#1+DI2\@„CLR.LƒD7Œ!�SAVE�RETURN�ADDR�FOR�ERROR2‰LEA…VBETLF(A2),A0�!�RECEIVE�BUS�ERROR�THRU�LINE�F‰MOVE.L‚#RBETLF,D0‰TRAP„#1‰BEQ.SƒDI3\@‰!�ERROR�CHECK*\1‡MOVE.L‚D0,-(A7)‰MOVEQ.L�#MAL,D0 ‰TRAP„#14‰DC.W„0* DI3\@„EQU…*:* END OF INITVECS MACRO **********************************‰ENDM*3* MACRO COPYRMA COPIES RMA TO ADDR POINTED TO BY A6<* FROM END ADDR POINTED TO BY A5. USES DO. UPDATES A7,A6,A5. COPYRMA‚MACRO9*�BEGIN‚COPYRMA�MACRO�***********************************:* USES A5 AND A6. MODIFIES D0. UPDATES A5,A6,A7. *********‰MOVE.W‚#RTDSZ,D0DI33…MOVE.W‚-(A5),-(A6) ‰SUBQ.W‚#2,D0 ‰BNE.SƒDI33‰MOVEA.L�A6,A7‰!�..UPDATE�A7,A5‰MOVEA.L�A7,A5:* END OF COPYRMA MACRO ***********************************‰ENDM‰PAGE*#*ˆCONSTANTS�FOR�USE�BY�INIT.SA�ONLY*+SEGTLEN‚EQU…768‹!�LEN�OF�TEMPORARY�SEGMENT.%*ž!�MUST�HOLD�RMA�AND�EXCEPTION�VECS.****** * ENTRY POINT***** .PINITƒEQU…* INIT…EQU…* O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>‰MOVE.L‚#RELINQ,D0‰TRAP„#1!*¦RELINQUITSH�CONTROL�SO�THAT�I/O#*¦I/O�INITIALIZATION�CAN�TAKE�PLACEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆWith�invocation�of�assignment�using�the�command�line�this�is�no�longer *’necessary**ˆMOVE.L„#ROMASIGN,A0 *ˆJMP‡(A0)&*¦ASSIGN�LOGICAL�UNITS�FOR�APPLICATION*¦TASK&*¦THE�JUMP�INSTRUCTION�IS�USED�BECAUSE&*§A�STACK�HAS�NOT�BEEN�DEFINED�AT�THIS*§POINT�IN�TIME*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ASIGNRET:)*¦RETURN�ADDRESS�AFTER�LOGICAL�UNITS�HAVE*§BEEN�ASSIGNEDO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  &‰IFEQ„VDOSEXˆ!�IF�VERSADOS�ON�EXORMACSN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*<*.INIT1ƒMOVE.L‚#.PZMAIN-*-RTDSZ,A7�!�SET�A7�TO�START�OF�DATA*ˆLEA….INIT1(PC,A7.L),A7**ˆA7�=�ADDRESS�OF�SEG2*!.INIT1ƒADD.L…#.PZMAIN-.PZSTART,A7‰SUB.L…#RTDSZ,A7*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰ENDC'‰IFNE„VDOSEXˆ!�VDOS�OR�RMS�ON�VM01/VM021*ˆALLOCATE�THE�TEMPORARY�SEGMENT�'SEGT'�TO�USE�IN+*ˆLIEU�OF�'SEG2'�UNTIL�'SEG2'�IS�VALIDATED.!‰MOVE.L‚D0,A2‰!�SAVE�STARTUP�INFO ‰MOVE.L‚A1,A3*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆIFEQ„RMSVM‰!�RMS�ON�VM01/02*ˆMOVE.L‚#RELINQ,D0„!/*ˆTRAP„#1Œ!�RELINQUISH�CONTROL�OF�THE�PROCESSOR&*ž!�SO�BIOS�HAS�A�CHANCE�TO�INITIALIZE*ˆENDC’!O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*+‰MOVE.L‚#GTSEG,D0…!�GET�A�TEMPORARY�SEGMENT+‰LEA…PRMBLK(PC),A0�!�WITH�THESE�PARAMETERS.‰TRAP„#1Œ!�DO�IT‰BNE…DERR1‰!�ERRORS�ABORT.4*ˆ!�A0�NOW�CONTAINS�START�PHYSICAL�ADDR�OF�THE�SEGT.+‰MOVEA.L�A0,A7‰!�INIT�STACK�PTR�TO�START�AD0‰ADD.Lƒ#SEGTLEN-RTDSZ-2,A7�!�PLUS�LEN�-�RMA�SIZE$‰MOVE.L‚A2,D0‰!�RESTORE�STARTUP�INFO‰MOVE.L‚A3,A1‰!‰E NDC ‰MOVEA.L�A7,A5‰!�A5�:=�A7‰MOVEA.L�A7,A6‰!�A6�:=�A7&‰CLR.LƒSC(A5)ˆ!�STATEMENT�COUNTER�:=�0 (‰IFNE„RMSVM‰!�VERSADOS�ON�EXORMACS�OR�VM+‰MOVEM.L�D0-D1,LTN(A5)�!�SAVE�START�UP�DATA‰MOVE.L‚A1,DTID(A5)‰MOVEM.L�D4-D5,DCAT(A5)‰MOVE.L‚D2,DVOL(A5)‰MOVE.W‚D3,DUN(A5)‰MOVE.W‚D6,CLL(A5)‰MOVE.L‚D7,LUIU(A5)‰ENDC &‰IFEQ„RMSVM‰!�RMS68K�ONLY�ON�VM01/VM023*ˆINITIALIZE�VERSADOS�STARTUP�DATA�TO�'SAFE'�VALUES*ˆFOR�RMS68K+BIOS�ENVIRONMENT;*ˆMOVEM.L�D0-D1,LTN(A5)�!�NO�NEED�TO�INIT�LOADING�TASK�NAME/‰MOVE.L‚#'CN00',DTID(A5)�!�SET�DEFAULT�TERM.�ID!‰MOVE.L‚#'„',D0„!�USEFUL�CONSTANT7‰MOVE.L‚D0,DCAT(A5)ƒ!�BLANK�OUT�8�CHARS�OF�CATALOG�NAME‰MOVE.L‚D0,DCAT+4(A5)�!6‰MOVE.L‚D0,DVOL(A5)ƒ!�BLANK�OUT�4�CHARS�OF�VOLUME‚NAME;‰CLR.WƒDUN(A5)‡!�SET�DEFAULT�USER�NO�TO�AN�ACCEPTABLE�VALUE$‰CLR.LƒD6Œ!�COMMAND�LINE�LENGTH�IS�0)‰CLR.WƒCLL(A5)‡!�COMMAND�LINE�LENGTH�IS�0)‰CLR.LƒLUIU(A5)†!�NO�LOGICAL�UNITS�IN�USE‰ENDC -‰CLR.WƒCCDR(A5)†!�ZERO�OUT�CHAIN�CMD�DIAG�REG0‰MOVE.B‚#$D,CL(A5,D6)�!�PUT�CR�AT�END�OF�COMMAND &‰IFEQ„VDOSEXˆ!�IF�VERSADOS�ON�EXORMACS3‰DORCVSA�0,EFI‰!�RECEIVE�SEGMENT�INFO,�NAME�UNKNOWN‰BNE…DERR1‰!�ERROR�CHECK‰ENDC '‰IFNE„VDOSEXˆ!�NOT�VERSADOS�ON�EXORMACS‰MOVEA.L�A0,A4‰!(‰ADD.Lƒ#SEGTLEN-1,A4�!�CALC�SEG�END�ADDR&‰INITINFO�A0,A4ˆ!�INIT�IMPORTANT�STUFF‰ENDC’! #‰IFEQ„VDOSEXˆ!�VERSADOS�ON�EXORMACS‰INITINFO�SRELSA(A1),SRELEA(A1)‰ENDC’! '‰MOVE.W‚#EFI-OFAR,D1‚!�CLEAR�FIELD�INFO‰MOVE.W‚#OFAR,D0DI5†CLR.Lƒ0(A5,D0) ‰ADDQ.W‚#4,D0 ‰SUBQ.W‚#4,D1 ‰BHI.SƒDI5 -‰INITVECS�DERR,DERR1ƒ!�INIT�INTERRUPT�VECTORS O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆThis�logic�has�been�remove�because�'SEG2'�will�be�obtained�dynamically!*ˆconsequently�it�is�not�required**(*ˆIFNE„VDOSEXˆ!�NOT�VDOS�ON�THE�EXORMACS**ˆBSR…SEG2INFO†!�RECEIVE�SEG�INFO�FOR�SEG2 *ˆBEQ.SƒDIOK1*&*ˆMOVEQ.L�#WSN,D0‡!�RUNTIME�ERROR�1013/*ˆTRAP„#14‹!�**WRONG�SEGMENT�NAME,�MUST�BE�SEG2*ˆDC.W„0*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DIOK1„EQU…*(‰IFNE„RMSVM‰!�NOT�RMS68K�ONLY�ON�VM01/02 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*(*ˆ!READ�COMMAND�LINE�FROM�SEG2�INTO�SEGT*ˆMOVEA.L�SRELSA(A1),A3B*ˆADD.Lƒ#.PZMAIN-.PZSTART-RTDSZ+CL,A3�!�START�OF�COM�LINE�IN�SEG2.+*ˆLEA…CL(A5),A2…!�START�ADDR�FOR�OUTPUT�BUF'*ˆMOVE.W‚CLL(A5),D0„!�NO�OF�BYTES�TO�DO*>*ˆ!!!�FORCE�THE�COMMAND�LINE�TO�BE�TAKEN�FROM�RROM.ASSIGNLU.RO‰LEA‡CMDLINE(PC),A3$*œA3�=�ADDRESS�OF�CMDLINE�TO�PROCESS‰LEA‡CL(A5),A2&*œADDRESS�OF�CMDLINE�IN�SEGMENT�'SEGT'‰MOVE.W„CMDLINEL(PC),D0,*œD0�=�NUMBER�OF�BYTES�IN�CMDLINE�TO�PROCESS*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +DIITER1‚TST.WƒD0Œ!�WHILE�MORE�BYTES�TO�COPY‰BEQ.SƒDIDONE1‡!�.DO%‰MOVE.B‚(A3)+,(A2)+ƒ!�..COPY�ONE�MORE(‰SUBQ.W‚#1,D0‰!�..DECREMENT�NUMBER�TO�DO‰BRA.SƒDIITER1‡!�.ODDIDONE1‚EQU…*�! O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*A*ˆThis�'ENDC'�statement�corresponds�to�the�'IF'�statement�removed*’above**ˆENDC*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰ENDC (‰IFNE„RMSVM‰!�NOT�RMS68K�ONLY�ON�VM01/02‰CLR.LƒD6Œ!�Z�OPT�:=�FALSE"‰LEA…CL(A5),A2…!�INIT�SCAN�POINTER-.INIT2ƒMOVE.L‚#.PMAIN-*,D2‚!�IF�NOT�SCAN�THEN‰MOVE.W‚.INIT2(PC,D2.L),D2 ‰BTST„#0,D2#‰BNE.SƒDI4‹!�.(*�SCAN�FOR�Z�ONLY�*)‰MOVE.B„.PSYMBUG(PC),D1+‰TST.B…D1Š!�CHECK�FOR�"THIS�IS�SYMBUG"�FLAG'‰BNE.S…DI7‰!�IF�SO,�DON'T�SCAN�ANYTHINGDI6†EQU…*�!�.DO‰BSR…GNC‹!�..GET�NEXT�CHAR‰BEQ.SƒDI7‹!�.UNTIL�CHAR�=�CR ‰CMP.Bƒ#';',D1‡!�.\OR�CHAR�=�';' ‰BNE.SƒDI6‹!�.IF�CHAR�=�';'�THENDI8†EQU…*�!�..DODI9†EQU…*�!�...DO%‰MOVE.B‚D1,D5‰!�....LAST�CHAR�:=�CHAR‰BSR…GNC‹!�....GET�NEXT�CHAR'‰CMP.Bƒ#'=',D1‡!�....IF�CHAR�=�'='�THEN ‰BNE.SƒDI90DI91…EQU…*�!�.....DO'‰MOVE.B‚D1,D5‰!�......LAST�CHAR�:=�CHAR‰BSR…GNC‹!�......GET�NEXT� CHAR!‰BEQ.SƒDI7‹!�.....UNTIL�CHAR�=�CR$‰CMP.Bƒ#',',D1‡!�.....\OR�CHAR�=�',' ‰BNE.SƒDI91DI90…EQU…*�!�....FI"‰CMP.Bƒ#$D,D1ˆ!�...UNTIL�CHAR�=�CR ‰BEQ.SƒDI7"‰CMP.Bƒ#'Z',D1‡!�...\OR�CHAR�=�'Z' ‰BNE.SƒDI9‰BSR…SCANZ‰!�...SCAN�Z�OPTION!‰CMP.Bƒ#$D,D1ˆ!�..UNTIL�CHAR�=�CR ‰BNE.SƒDI8DI7†EQU…*�!�.FI‰BRA…DI10Š!�ELSE DI4†EQU…*‰CLR.WƒD0Œ!�.FIELD�NUM�:=�0DI11…EQU…*�!�.DO‰BSR…GNC‹!�..GET�NEXT�CHAR$‰CMP.Bƒ#'�',D1‡!�.UNTIL�CHAR�#�SPACE ‰BEQ.SƒDI11‰CMP.Bƒ#$D,D1ˆ!�.IF�CHAR�#�CR ‰BEQ…DI95&‰CMP.Bƒ#';',D1‡!�.\AND�CHAR�#�';'�THEN ‰BEQ…DI95DI12…EQU…*�!�..DO.‰LEA…FNNF(A5),A0ƒ!�...CALC�ADDR�FROM�FIELD�NUM ‰LSL.Lƒ#2,D0‰LEA…0(A0,D0),A0 ‰LSR.Lƒ#2,D0%‰CLR.BƒD2Œ!�...SPECIAL�FIELD�:=�FALSE&‰CMP.Bƒ#'I',D1‡!�...IF�CHAR�=�'I'�THEN ‰BNE.SƒDI13‰BSR…GNC‹!�....GET�NEXT�CHAR'‰CMP.Bƒ#'=',D1‡!�....IF�CHAR�=�'='�THEN ‰BNE.SƒDI14(‰LEA…IENF(A5),A0ƒ!�.....ADDR�:=�I=�FIELD+‰MOVEQ.L�#1,D2‰!�.....SPECIAL�FIELD�:=�TRUE‰BSR…GNC‹!�.....GET�NEXT�CHAR‰BRA.SƒDI15Š!�....ELSE DI14…EQU…*‰BSR…BACKSPˆ!�.....BACKSPACEDI15…EQU…*�!�....FI‰BRA.SƒDI16Š!�...ELSE DI13…EQU…*'‰CMP.Bƒ#'O',D1‡!�....IF�CHAR�=�'O'�THEN ‰BNE.SƒDI17‰BSR…GNC‹!�.....GET�NEXT�CHAR(‰CMP.Bƒ#'=',D1‡!�.....IF�CHAR�=�'='�THEN ‰BNE.SƒDI18)‰LEA…OENF(A5),A0ƒ!�......ADDR�:=�O=�FIELD,‰MOVEQ.L�#1,D2‰!�......SPECIAL�FIELD�:=�TRUE‰BSR…GNC‹!�......GET�NEXT�CHAR‰BRA.SƒDI19Š!�.....ELSE DI18…EQU…*‰BSR…BACKSPˆ!�......BACKSPACEDI19…EQU…*�!�.....FIDI17…EQU…*�!�....FIDI16…EQU…*�!�...FI#‰TST.BƒD2Œ!�...IF�NOT�SPECIAL�FIELD ‰BNE.SƒDI20+‰CMP.Wƒ#16,D0ˆ!�...\AND�FIELD�NUM�=�16�THEN ‰BNE.SƒDI20‰MOVEQ.L�#CLF,D0ˆ!�....ERROR ‰TRAP„#14‰DC.W„0DI20…EQU…*�!�...FI8‰LEA…CL+1(A5),A1ƒ!�...FIELD�START�OFF�:=�CHAR�PTR-(CL+1) ‰MOVE.L‚A2,D3 ‰SUB.LƒA1,D3‰MOVE.B‚D3,2(A0)4‰MOVE.B‚D3,3(A0)†!�...CURRENT�OFF�:=�FIELD�START�OFF‰BSR…SCANF‰!�...SCAN�FILES(‰TST.BƒD2Œ!�...IF�NOT�SPECIAL�FIELD�THEN ‰BNE.SƒDI21.‰ADDQ.W‚#1,D0‰!�....FIELD�NUM�:=�FIELD�NUM�+�1DI21…EQU…*�!�...FI!‰CMP.Bƒ#$D,D1ˆ!�..UNTIL�CHAR�=�CR ‰BEQ.SƒDI22!‰CMP.Bƒ#';',D1‡!�..\OR�CHAR�=�';' ‰BNE…DI12 DI22…EQU…*,‰MOVE.W‚D0,NFCL(A5)ƒ!�..UPDATE�NUM�OF�FIELDSDI95…EQU…*�!�.FI$‰CMP.Bƒ#';',D1‡!�.IF�CHAR�=�';'�THEN ‰BNE.SƒDI23DI24…EQU…*�!�..DO$‰MOVE.B‚D1,D5‰!�...LAST�CHAR�:=�CHAR‰BSR…GNC‹!�...GET�NEXT�CHAR&‰CMP.Bƒ#'=',D1‡!�...IF�CHAR�=�'='�THEN ‰BNE.SƒDI25DI26…EQU…*�!�....DO&‰MOVE.B‚D1,D5‰!�.....LAST�CHAR�:=�CHAR‰BSR…GNC‹!�.....GET�NEXT�CHAR!‰BEQ.SƒDI27Š!�....UNTIL�CHAR�=�CR#‰CMP.Bƒ#',',D1‡!�....\OR�CHAR�=�',' ‰BNE.SƒDI26 DI27…EQU…*DI25…EQU…*�!�...FI‰CMP.Bƒ#$D,D1ˆ!�...IF�CHAR�#�CR ‰BEQ.SƒDI28(‰CMP.Bƒ#'Z',D1‡!�...\AND�CHAR�#�'Z'�THEN ‰BEQ.SƒDI28*‰CMP.Bƒ#'A',D1‡!�....IF�CHAR�IS�ALPHA�THEN ‰BCS.SƒDI29‰CMP.Bƒ#'Z'+1,D1 ‰BCC.SƒDI29-‰LEA…CL+1(A5),A1ƒ!�.....CALC�OFFSET�TO�OPTION ‰MOVE.L‚A2,D4 ‰SUB.LƒA1,D4-‰CMP.Bƒ#'-',D5‡!�.....IF�LAST�CHAR�=�'-'�THEN ‰BNE.SƒDI30‰NEG.WƒD4Œ!�......NEGATE�OFFSETDI30…EQU…*�!�.....FI‰EXT.WƒD1Œ!�.....UPDATE�OFFSET ‰LSL.Lƒ#1,D1‰LEA…OFAR-$82(A5),A3‰MOVE.W‚D4,0(A3,D1)DI29…EQU…*�!�....FIDI28…EQU…*�!�...FI‰BSR…SCANZ‰!�...SCAN�Z�OPTION!‰CMP.Bƒ#$D,D1ˆ!�..UNTIL�CHAR�=�CR ‰BNE.SƒDI24DI23…EQU…*�!�.FIDI10…EQU…*�!�FI‰TST.BƒD6Œ!�IF�Z�OPTION�THEN '‰IFEQ„VDOSEXˆ!�VERSADOS�ON�THE�EXORMACS ‰BEQ.SƒDI315‰LEA…RTDSZ+VTABSZ+2(A5),A0�!�.IF�REQ�SZ�>�CUR�SZ�THEN‰MOVE.L‚SHPAD(A5),D1 ‰SUBA.L‚D1,A0 ‰ASL.Lƒ#8,D3 ‰ASL.Lƒ#2,D3 ‰SUB.LƒA0,D3 ‰BLS.SƒDI31*ž!�ALLOCATE�ADDITIONAL�SEGMENT)‰DOGTSEG�0,D3Š!�NO�SEG�NAME,�LENGTH�IN�D3‰BNE…DERRŠ!�..ERROR�CHECK*'‰LEA…RTDSZ(A7),A6‚!�..MOVE�RUNTIME�DATA ‰ADDA.L‚D3,A6‰LEA…RTDSZ(A5),A5'*ž!�COPIES�RMA�TO�ADDR�POINTED�TO�BY�A6"*ž!�FROM�END�ADDR�POINTED�TO�BY�A5%‰COPYRMA�!�USES�DO.�UPDATES�A7,A6,A5.!‰ENDC’!�VERSADOS�ON�EXORMACS�ONLY*$‰IFEQ„VDOSVMˆ!�VERSADOS�ON�VM01/VM02 ‰BEQ…DI31!‰ASL.Lƒ#8,D3‰!�MULTIPLY�Z�BY�1024 ‰ASL.Lƒ#2,D3 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*D*ˆThis�logic�has�been�replaced�with�a�move�to�register�D4.�The�value9*’in�t he�register�is�the�maximum�value�D4�could�have�with*’the�current�logic**ˆBSR…SEG2INFO5*ˆMOVE.L‚SRELEA(A1),D4�!�CALCULATE�SIZE�OF�USER�BLOCK*ˆSUB.LƒSRELSA(A1),D4*ˆSUB.Lƒ#.PZMAIN-.PZSTART+1,D4 ‰MOVE.L„#254,D4**œD4�=�MAXIMUM�VALUE�IF�CURRENT�LOGIC�USED*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< * O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>**ˆCMPI.L‚#.PZMAIN-.PZSTART+2,D3 *ˆBLS.SƒDI31(„IF.L‹#.PZMAIN-.PZSTART+2��D3ƒTHEN.S‰MOVE.L„#.PZMAIN-.PZSTART+2,D3„ENDI*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $‰ADD.LƒD4,D3‰!�Z-OPTION�+�USER�BLOCK#‰ADD.Lƒ#255,D3‡!�ROUND�SEGMENT�SIZE ‰CLR.BƒD3 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆDeletion�of�'SEG2'�no�longer�required�since�it�is�acquired�dynamically*-*ˆFIRST�DELETE�OFF�PREVIOUS�'SEG2'�VIA�DESEG.*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< %*ˆTHEN�ALLOCATE�A�NEW�SEGMENT�'SEG2'.*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*H*ˆDeletion�of�'SEG2'�no�longer�required�since�it�is�acquired�dynamically**ˆDODESEGƒSEG2*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< *‰DOGTSEGƒSEG2,D3…!�NAME,�LEN ‰BNE‡DERR ‰SUB.L…D4,D3‡!�REMOVE�USER�BLOCK1‰SUB.L…#.PZMAIN-.PZSTART+2,D3�!�REMOVE�STACK/HEAP ‰BRA.S…DI32‰ENDC DI31…EQU‡*‹!�FI‰ENDC’!�END�OF�NON-RMS68K�STUFF '‰IFNE„VDOSEXˆ!�VDOS�OR�RMS�ON�VM01/VM02 ‰CLR.LƒD3 DI32…EQU…*)‰BSR…SEG2INFO†!�RECEIVE�SEG�INFO�FOR�SEG2*‰MOVEA.L�SRELSA(A1),A6�!�GET�START�ADDRESS‰ADD.Lƒ#.PZMAIN-.PZSTART,A6‰ADD.LƒD3,A6‰!�NEW�END�OF�RMA*&‰LEA…RTDSZ(A5),A5‚!�CURRENT�END�OF�RMA.‰COPYRMA�!�COPIES�RMA�TO�ADDR�POINTED�TO�BY�A6"*ž!�FROM�END�ADDR�POINTED�TO�BY�A5*ž!�USES�DO.�UPDATES�A7,A6,A5.3‰INITINFO�SRELSA(A1),SRELEA(A1)�!�INIT�HEAP�POINTER‰INITVECS�DERR2,DERR3 ‰DODESEG�SEGT‰ENDC O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+*ˆLEA….PLJSR(PC),A3�!�INIT�LONG�JSR�POINTER*‰MOVE.L„#.PLJSR,A3O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*,*ˆCALL�FLOATING�POINT�INIT�ROUTINE�IF�NEEDED* ‰BSR…INITFPF.INIT3ƒMOVE.L‚#.PMAIN-*,D0‚!�START�MAIN�PROGRAM�RELATIVE�AT�.PMAIN�+�2‰JMP….INIT3+2(PC,D0.L)‰PAGE** SUPPORT ROUTINES FOR INIT*'‰IFNE„VDOSEXˆ!�VDOS�OR�RMS�ON�VM01/VM02** THIS SUBROUTINE MODIFIES D0, A0, AND A1.* IT USES A5 (RMA POINTER)./* IT ALSO USES THE PARAMETER BLOCK FROM EOD(A5)5* TO EOD+$1B(A5) FOR INPUT TO THE RCVSA TRAP #1 CALL.+* IT RETURNS SEGMENT INFO FOR 'SEG2' IN THE?* PARAMETER BLOCK DENOTED BY EOD+$1C(A5) (AND ALSO A1 ON EXIT).SEG2INFO�EQU…*�!*‰DORCVSA�SEG2,EOD†!�FIND�OUT�SEGMENT�ADDRS‰RTS“!‰ENDC’!**%‰IFNE„RMSVM‡!�NOT�RMS68K�ON�VM01/VM02**�BACKSP‚BACK�UP�A�CHARACTER*BACKSPƒIF.B�D1#$D�THEN.S ‰SUB.L�#1,A2‰ENDI ‰SUB.L�#1,A2*�FALL�THROUGH‚TO�GNC *,*�GNC�-�GET�NEXT�CHARACTER.‚A2�POINTS�AT�THE%*ˆSTRING�BEING�SCANNED.‚THE�CHARACTER&*ˆIS�RETURNED�IN�D1.‚THE�Z�FLAG�IS�SET(*ˆIF�THE�CHARACTER�IS�A�CARRIAGE�RETURN.* GNC†EQU…*4‰MOVE.B‚(A2)+,D1†!�GET�CURRENT�CHAR�&�UPDATE�POINTER!‰CMP.Bƒ#$D,D1ˆ!�IF�CHAR�=�CR�THEN ‰BNE.SƒGNC1‰SUBQ.L‚#1,A2‰!�.DEC�POINTERGNC1…EQU…*�!�FI ‰RTS“!�END‰SPC…1*/*�SCANZ�-�SCAN�Z�OPTION.‚A2�POINTS�TO�CHARACTER)*ˆPAST�Z.‚A2�WILL�BE�UPDATED�TO�CHARACTER(*ˆPAST�END�OF�Z�OPTION�FIELD.‚CHECKS�FOR(*ˆERROR�IN�OPTION�FIELD.‚EQUALS�VALUE�IS*ˆRETURNED�IN�D3.* SCANZ„EQU…*#‰CMP.Bƒ#'Z',D1‡!�IF�CHAR�=�'Z'�THEN ‰BNE.SƒSZ1)‰CMP.Bƒ#'-',D5‡!�.IF�LAST�CHAR�=�'-'�THEN‰BEQ.SƒSZ3‹!�..ERRORSZ2†EQU…*�!�.FI‰SUBQ.L‚#1,A2‰!�.DEC�POINTER)‰BSR….POPTION†!�.OPTION�(*�GET�=�VALUE�*)‰BTST„#4,D0‰!�.ERROR�CHECK ‰BEQ.SƒSZ4‰AND.Bƒ#$AA,D0 ‰BEQ.SƒSZ5SZ4†MOVE.L‚D0,-(A7)SZ3†MOVEQ.L�#MAL,D0 ‰TRA P„#14‰DC.W„0"SZ5†MOVEQ.L�#1,D6‰!�.Z�OPT�:=�TRUESZ1†EQU…*�!�FI ‰RTS“!�END‰SPC…1*/*�SCANF�-�SCAN�FILES.‚COUNTS�NUMBER�OF�FILES�IN(*ˆFILE�LIST�WITHIN�A�FIELD.‚A2�POINTS�TO)*ˆLINE�BEING�SCANNED.‚COUNT�OF�FILES�WILL)*ˆBE�PLACED�IN�FIELD�INFO�AREA.‚A0�POINTS#*ˆTO�START�OF�FIELD�AREA.‚CHARACTER'*ˆAT�START�OF�FIELD�IS�IN�D1.‚CHARACTER+*ˆTERMINATING�FIELD�WILL�BE�RETURNED�IN�D1.&*ˆA2�WILL�BE�RETURNED�POINTING�AT�NEXT *ˆCHARACTER.* SCANF„EQU…*"‰MOVE.B‚#',',D5‡!�LAST�CHAR�:=�','‰CLR.Bƒ(A0)Š!�NUM�FILES�:=�0SF1†EQU…*�!�DO"‰CMP.Bƒ#'/',D1‡!�.WHILE�CHAR�=�'/' ‰BNE.SƒSF2-‰ADDQ.B‚#1,(A0)‡!�.NUM�FILES�:=�NUM�FILES�+�1"‰MOVE.B‚D1,D5‰!�.LAST�CHAR�:=�CHAR‰BSR…GNC‹!�.GET�NEXT�CHAR‰BRA.SƒSF1‹!�OD SF2†EQU…*SF3†EQU…*�!�DO ‰CMP.Bƒ#$D,D1ˆ!�.WHILE�CHAR�#�CR ‰BEQ.SƒSF4!‰CMP.Bƒ#';',D1‡!�.\AND�CHAR�#�';' ‰BEQ.SƒSF4!‰CMP.Bƒ#',',D1‡!�.\AND�CHAR�#�',' ‰BEQ.SƒSF4-‰ADDQ.B‚#1,(A0)‡!�.NUM�FILES�:=�NUM�FILES�+�1SF5†EQU…*�!�.DO‰CLR.BƒD5Œ!�..LAST�CHAR�:=�NULL‰BSR…GNC‹!�..GET�NEXT�CHAR‰BEQ.SƒSF3‹!�.UNTIL�CHAR�=�CR ‰CMP.Bƒ#';',D1‡!�.\OR�CHAR�=�';' ‰BEQ.SƒSF3 ‰CMP.Bƒ#',',D1‡!�.\OR�CHAR�=�',' ‰BEQ.SƒSF3 ‰CMP.Bƒ#'/',D1‡!�.\OR�CHAR�=�'/' ‰BNE.SƒSF5‰BRA.SƒSF3‹!�OD SF4†EQU…*(‰CMP.Bƒ#'/',D5‡!�IF�LAST�CHAR�=�'/'�THEN ‰BNE.SƒSF6-‰ADDQ.B‚#1,(A0)‡!�.NUM�FILES�:=�NUM�FILES�+�1SF6†EQU…*�!�FI#‰CMP.Bƒ#',',D1‡!�IF�CHAR�=�','�THEN ‰BNE.SƒSF7‰BSR…GNC‹!�.GET�NEXT�CHARSF7†EQU…*�!�FI ‰RTS“!�END"‰ENDC’!�END�OF�ROUTINES�NOT�USEFUL*ž!�TO�RMS68K�ON�VM01/VM02 ‰PAGEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>** .PLJSR - LONG JSR ROUTINE* *.PLJSRƒEQU…*%*ˆMOVE.L‚(A7),A4‡!�GET�RETURN�ADDRESS%*ˆADD.Lƒ#4,(A7)‡!�CORRECT�IT�ON�STACK'*ˆADD.Lƒ(A4),A4‡!�CALCULATE�DESTINATION*ˆJMP…(A4)Š!�GO�TO�IT*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'‰IFNE„VDOSEXˆ!�NOT�VERSADOS�ON�EXORMACS$PRMBLKƒDC.L„0�!�DON'T�KNOW�TASK�NAME‰DC.L„0�!�SESSION'‰DC.W„SGOPPAˆ!�LET�RMS68K�PICK�THE�ADDR!‰DC.W„SGATRWˆ!�READ/WRITE�SEGMENT‰DC.L„'SEGT'ˆ!�SEGMENT�NAME%‰DC.L„0�!�START�LOGICAL�ADDR�(IF�<>0)'‰DC.L„SEGTLEN‡!�SEGMENT�LENGTH�IN�BYTES‰ENDC’! ‰PAGE*C*‚FINIT�-�THE�COMMON�SECTION�USED�FOR�LINKAGE�TO�THE�FLOATING�POINT*ŠPACKAGE�IF�PRESENT*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*FINIT„SECTION�8FINIT„SECTION�9O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</INITFPƒRTS“!�RETURN�TO�INIT�UNLESS�OVER�WRITTEN* ‰END…INITNNNNN N*<*ˆThe�file�IOSRR.WRR.SA�has�defined�an�external�reference�to>*ˆ'.PFPOINT'.�Since�this�version�of�the�rom�library�for�PASCAL<*ˆdoes�not�support�floating�point�processing�this�dummy�file5*ˆhas�been�created�to�satisfy�the�external�reference.A*ˆThis�location�should�not�be�accessed�since�there�is�no�floatingA*ˆpoint�capability�for�this�version�of�the�library,�however�if�byC*ˆchance�it�should�happpen�an�illegal�instruction�will�be�executed.** ‰SECTION�8‰XDEF†.PFPOINT .PFPOINT: ‰DC.W†$4AFC/*œIF�BY�CHANCE�SOMEONE�SHOULD�TRY�AND�REFERENCE+*œTHIS�LOCATION�AN�ILLEGAL�INSTRUCTION�WILL$*œBE�EXECUTED�BRING�THE�SYSTEM�DOWN.‰END NNNNN O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*?*ˆThis�routine�was�removed�from�the�initilaizer�and�placed�back,*ˆin�the�library�because�of�its�heavy�usage.* ‰SECTIONƒ8* ‰XDEF†.PLJSR** .PLJSR - LONG JSR ROUTINE* .PLJSRƒEQU‡*$‰MOVE.L„(A7),A4�!�GET�RETURN�ADDRESS$‰ADD.L…#4,(A7)�!�CORRECT�IT�ON�STACK&‰ADD.L…(A4),A4�!�CALCULATE�DESTINATION‰JMP‡(A4)�!�GO�TO�IT* ‰END‡.PLJSRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<NNN  NN'RR FIOEQU SA'' 4  FPMACRO SAPPB  MACROS SAiiU  RTEQU SArrˆ  VDOSVM SA‹‹  +********************************************* PASCAL FILE I/O EQUATES** COPYRIGHT 1982 MOTOROLA, INC.**�VERSION‚2.01�:�4-19-82** 1980-04-11 : JOHN KAUFMANN*+********************************************%*ˆDATA�STRUCTURES�AND�EQUATES�FOR�I/O**$*�FHS�PARAMETER�BLOCK�DATA�STRUCTURE* ‰OFFSET�0FHSCMDƒDS.W�1�COMMANDFHSOPTƒDS.W�1�OPTIONSFHSSTAƒDS.B�1�STATUS!FHSLUNƒDS.B�1�LOGICAL�UNIT�NUMBERFHSVOLƒDS.B�4�VOLUME�NAMEFHSUSNƒDS.W�1�USER�NUMBERFHSCLGƒDS.B�8�CATALOG�NAMEFHSFILƒDS.B�8�FILE�NAMEFHSEXTƒDS.B�2�EXTENSIONFHSGENƒDS.W�1�RESERVED FHSWCDƒDS.B�1�WRITE�PROTECT�CODEFHSRCDƒDS.B�1�READ�PROTECT�CODE#FHSLRLƒDS.W�1�LOGICAL�RECORD�LENGTH7FHSSIZƒDS.L�1�CONTIGUOUS�FILE�SIZE�/�DIR.�ENTRY�POINTER* FOR NONCONTIGUOUS FILES‰OFFSET�FHSSIZFHSRESƒDS.B�1�UNUSED'FHSKEYƒDS.B�1�KEY�LENGTH�(0�IF�NO�KEYS)FHSFABƒDS.B�1�FAB�SIZEFHSDATƒDS.B�1�DATA�BLOCK�SIZE"FHSBLNƒEQU‚*�LENGTH�OF�PARAM�BLOCK**�FHSCMD�EQUATES�(16�BITS)*'FHALLOƒEQU�$80�ALLOCATE�(CREATE�A�FILE)FHASGNƒEQU�$40�ASSIGN�(OPEN)FHCLOSƒEQU�$4�CLOSEFHDELTƒEQU�$2�DELETE#FHRATTƒEQU�$180�RETRIEVE�ATTRIBUTES**ˆEQUATES�FOR�LU�ASSIGNMENTS* CDFLUNƒEQU…5“CMD�DEVICE/FILE�LUN LDFLUNƒEQU…6“LOG�DEVICE/FIEL�LUN**�FHSOPT�EQUATES�(16�BITS)#*ACCESS PERMISSION FIELD (BITS 0-2)*)FAPBIT EQU $7 BITS FOR ACCESS PERM. FIELDFOPPR„EQU�0�PUBLIC�READFOPER„EQU�1�EXCLUSIVE�READFOPPW„EQU�2�PUBLIC�WRITEFOPEW„EQU�3�EXCLUSIVE�WRITEFOPPRPW‚EQU�4�PUBLIC�READ-WRITE*FOPPREW‚EQU�5�PUBLIC�READ,�EXCLUSIVE�WRITE*FOPERPW‚EQU�6�EXCLUSIVE�READ,�PUBLIC�WRITE"FOPEREW‚EQU�7�EXCLUSIVE�READ-WRITE**OVERWRITE FIELD (BIT 3)FOPOVRT‚EQU�8�OVERWRITE�FILE*$* ALLOCATE DATA BUFFER FIELD (BIT 5)*FOPABF EQU $20 ALLOCATE SHARED DATA BUFFER**POSITION FIELD (BIT 6)*FOPBEG EQU 0 POSITION AT BEGINNING OF FILE&FOPEND EQU $40 POSITION AT END OF FILE*!*RESERVED FIELD (BITS 7 NOT USED)**FILE TYPE FIELD (BITS 8-10)"FFTBIT EQU $700 BITS FOR FILE TYPEFOPCON‚EQU�0�CONTIGUOUSQ(N0G8I@  $FOPSEQƒEQU�$100�SEQUENTIAL�(FRL/VRL)CFOPISKƒEQU�$200�KEYED�RECORD,�INDEXED�SEQUENTIAL,�NO�DUPLICATE�KEYS,FOPISDƒEQU�$300�",�",�DUPLICATE�KEYS�ALLOWED*!*RESERVED FIELD (BIT 11 NOT USED)*#*USER ATTRIBUTES FIELD (BITS 15-12))FUSBITƒEQU�$F000�BITS�FOR�USER�ATTRIBUTES**�FHSSTA�EQUATES�(8�BITS)*"FSTADNM‚EQU�$5�DUPLICATE�FILE�NAME‰PAGE**�IOS�PARAMETER�BLOCK�STRUCTURE* ‰OFFSET�0IOSFCTƒDS.W�1�FUNCTIONIOSOPTƒDS.W�1�OPTIONSIOSSTAƒDS.B�1�STATUS!IOSLUNƒDS.B�1�LOGICAL�UNIT�NUMBERIOSSRVƒDS.B�1�RESERVED IOSPKLƒDS.B�1�PARTIAL�KEY�LENGTH.IOSRRNƒDS.L�1�RANDOM�RECORD�NUMBER:�LRN�OR�LSN"IOSSADƒDS.L�1�START�BUFFER�ADDRESS IOSEADƒDS.L�1�END�BUFFER�ADDRESS IOSLENƒDS.L�1�LENGTH�OF�TRANSFER IOSCADƒDS.L�1�COMPLETION�ADDRESS"IOSBLNƒEQU‚*�LENGTH�OF�PARAM�BLOCK**�IOSFCT�EQUATES�(16�BITS)*IOREADƒEQU�$1�READ�REQUESTIOWRITƒEQU�$2�WRITE�REQUESTIOREWDƒEQU�$102�REWIND**�IOSOPT�EQUATES�(16�BITS)*IOPASCƒEQU�0�ASCIIIOPWAT EQU 0 WAIT"IOPUNPƒEQU�0�UNCONDITIONAL�PROCEEDIOPFORƒEQU�0�FORMATTEDIOPECH EQU 0 ECHO MODEIOPRECƒEQU�0�RECORD�ACCESSIOPLRNƒEQU�0�LOGICAL�RECORD�IOIOPKEYƒEQU�0�FULL�KEY�ACCESS"IOPNOCƒEQU�0�NO�COMPLETION�ADDRESSIOPINF EQU 0 INPUT FORMATTEDIOPBINƒEQU�1�BINARY6IOPPOSƒEQU�$6000�BITS�13-14:�LOGICAL�ACCESS�/�POSITIONIOPNXTƒEQU�$0„NEXT(FORWARD)�/�>%IOPCUR EQU $2000 CURRENT POSITION / ='IOPPRVƒEQU�$4000�PREVIOUS(BACKWARD)�/�<2IOPRANƒEQU�$6000�RANDOM(LRN�OR�LSN�GIVEN)�/�>�OR�=**�IOSSTA�EQUATES�(8�BITS)*ISTAEOF‚EQU�$C2�END�OF�FILE‰PAGE*"*ŒSEGMENT�DIRECTOR�PARAMETER�BLOCK* ‰OFFSET�0%SEGTCBƒDS.B�4—TASK�TO�RECEIVE�SEGMENT!SEGSESƒDS.B�4—TASK�SESSION�NUMBERSEGOPTƒDS.W�1—OPTIONSSEGATTƒDS.W�1—ATTRIBUTESSEGNAMƒDS.B�4—SEGMENT�NAME(SEGLADƒDS.L�1—LOGICAL�ADDRESS�OF�SEGMENT*SEGLENƒDS.L�1—LENGTH�(IN�BYTES)�OF�SEGMENT)SEGPTRƒDS.L�1—POINTER�TO�RECEIVING�BUFFER*&*ˆRECEIVING�BUFFER�FOR�'REC.SEG.ATTR.'* ‰OFFSET�0SRENAMƒDS.B�4—SEGMENT�NAMESREATTƒDS.W�1—ATTRIUBTES#SRELSAƒDS.L�1—LOGICAL�START�ADDRESS!SRELEAƒDS.L�1—LOGICAL�END�ADDRESSSREPADƒDS.L�1—PHYSICAL�ADDRESSSRELENƒDS.L�1—LENGTH* *ˆEQUATES�FOR�'SEGATT'�(16�BITS)*SGATROƒEQU…$4000�READ�ONLYSGATRWƒEQU…0”READ�/�WRITE!SGATSSƒEQU…$2000�SESSION�SHARABLE!SGATNSƒEQU…0”NOT�SESSION�SHARABLE"SGATGSƒEQU…$1000�GLOBALLY�SHARABLE"SGATNGƒEQU…0”NOT�GLOBALLY�SHARABLE%SGATDPƒEQU…$800‘SEGMENT�IS�DUPLICATED&SGATNDƒEQU…0”SEGMENT�IS�NOT�DUPLICATED.SGATSDƒEQU…$400‘SEGMENT�SHARABLE�IF�DUPLICATED/SGATNNƒEQU…0”SEGMENT�NOT�SHARABLE�IF�DUPLICATED* *ˆEQUATES�FOR�'SEGOPT'�(16�BITS)*8SGOPATƒEQU…$8000�15�ATTRIBUTES�GIVEN:�TRSEG,DCLSHR,SETSAASGOPLAƒEQU…$4000Š14�LOGICAL�ADDRESS�(NOT�NAME):�TRSEG,SETSA,RCVSADSGOPPAƒEQU…$2000†13�SET�LOGICAL�ADDR.=PHYSICAL�ADDR.(RET�ADR�IN�A0):!*›GTSEG,TRSEG,ATTSEG,SHRSEG,SETSA0SGOPSPƒEQU…$1000�12�MAKE�PERMANENT:�DCLSHR,SETSA8SGOPRPƒEQU…$0800�11�REMOVE�PERMANENT�STATUS:�DESEG,SETSA1SGOPSLƒEQU…$0400�10�SEGMENT�LENGTH:�SHRSEG,ATTSEG;SGOPLGƒEQU…$0200‰9�ALLOCATE�NEXT�LARGER�BLOCK�IF�SIZE�ERROR‰PAGE*Æ*ˆTRAP�1�EQUATES°*ÆGTSEG„EQU‚1�ALLOCATE�SEGMENT™DESEG„EQU‚2�DEALLOCATE�SEGMENT"RELINQƒEQU‚22ŽRELINQUISH�EXECUTION'RCVSA„EQU‚9�RECEIVE�SEGMENT�ATTRIBUTES�ABORT„EQU‚14ŽABORT�TASK�(SELF)+RBETLFƒEQU‚26ŽRECEIVE�BUS�ERROR�THRU�LINE�F&RT2TF„EQU‚27ŽRECEIVE�TRAPS�2�THROUGH�F‰SPC…10*$* VECTOR TABLE FOR TRAPS 2 THROUGH F* ‰OFFSET�0 VT2TF„DS.L„11TRAPD„DS.L„1�TRAP�DTRAPE„DS.L„1�TRAP�E *3* VECTOR TABLE FOR BUS ERROR THRU LINE F EXCEPTIONS*‰OFFSET‚VT2TF+56 VBETLFƒEQU…*BUSER„DS.L„1�BUS�ERRORADDRERƒDS.L„1�ADDRESS�ERROR‰DS.L„1�UNUSEDZDIV…DS.L„1�ZERO�DIVIDECHKI…DS.L„1�CHK�INSTRUCTIONTRAPV„DS.L„1�TRAPV�INSTRUCTIONVTABSZƒEQU…VBETLF+40‰PAGE-* RUNTIME DATA MAINTAINENCE - OFFSETS FROM A5 ‰OFFSET‚0SC‡DS.L„1�STATEMENT�COUNTERHP‡DS.L„1�HEAP�POINTERDL0†DS.L„8�DISPLAY�LEVEL�0LTN†DS.B„4�LOADING�TASK�NAMESN‡DS.B„4�SESSION�NUMBERLUIU…DS.L„1�LU'S�IN�USECCDR…DS.W„1�CHAIN�CMD�DIAG�REGDTID…DS.B„4�DEFAULT�TERMINAL�IDDVOL…DS.B„4�DEFAULT�USER�VOLUME  DUN†DS.W„1�DEFAULT�USER�NUMBERDCAT…DS.B„8�DEFAULT�CATALOGCLL†DS.W„1�COMMAND�LINE�LENGTHCL‡DS.B„162‹COMMAND�LINEOFAR…DS.W„26ŒOPTION�FIELD�ARRAY‰DS.W„1�UNUSED"NFCL…DS.W„1�NUMBER�OF�FIELDS�IN�CLIENF…DS.B„1�I=�NUMBER�OF�FILESIECF…DS.B„1�I=�CURRENT�FILEIEOF…DS.B„1�I=�OFFSET"IECO…DS.B„1�I=�CURRENT�FILE�OFFSETOENF…DS.B„1�O=�NUMBER�OF�FILESOECF…DS.B„1�O=�CURRENT�FILEOEOF…DS.B„1�O=�OFFSETOECO…DS.B„1�O=�CURRENT�OFFSET#FNNF…DS.B„1�FIELD�N�NUMBER�OF�FILES FNCF…DS.B„1�FIELD�N�CURRENT�FILEFNOF…DS.B„1�FIELD�N�OFFSET"FNCO…DS.B„1�FIELD�N�CURRENT�OFFSET'‰DS.B„4*15ŠABOVE�INFO�FOR�15�MORE�FILESEFI†EQU…*�END�OF�FIELD�INFO"SGBRK„DS.L„1�SEGMENT�BREAK�ADDRESSSHPAD„DS.L„1�SMALLEST�HEAP�ADDR2EOD†EQU…*�END�OF�DATA�NEEDED�DURING�INITIALIZATION&‰DS.B„72ŒRUNTIME�ERROR�ROUTINE�STORAGERTDSZ„EQU…*�RUNTIME�DATA�SIZE (* FILE POINTER - OFFSETS FROM INITIAL A0 ‰OFFSET‚0$CCP†DS.L„1�CURRENT�COMPONENT�POINTER"FDP†DS.L„1�FILE�DESCRIPTOR�POINTER =* FILE PARAMETER BLOCK - OFFSETS FROM FILE DESCRIPTOR POINTER*ˆPASCAL�PARAMETER�BLOCK ‰OFFSET‚0FP‡DS.L„1�FILE�POSITIONPFS†DS.W„1�PASCAL�FILE�STATUSCS‡DS.W„1�COMPONENT�SIZE*ˆIOS�PARAMETER�BLOCKIOS†DS.B„IOSBLN*ˆFHS�PARAMETER�BLOCKFHS†DS.B„FHSBLN*ˆMORE�FILE�STATUSFSR†DS.W„1�RESERVEDFSSCN„DS.B„1�FILE�SCAN�STATUSFPOS…DS.B„1�FILE�POSITION*ˆCOMPONENT�BUFFERCB‡EQU…*TXTBS„EQU…132‹TEXT�BUFFER�SIZE )* PASCAL FILE STATUS WORD BIT ASSIGNMENTSPFSSO„EQU…0�STANDARD�OUTPUTPFSSI„EQU…1�STANDARD�INPUTPFSTF„EQU…2�TEXT�FILEPFSLF„EQU…3�LOCAL�FILEPFSIF„EQU…4�INDEXED�FILEPFSOP„EQU…6�OPENPFSEOFƒEQU…7�END�OF�FILEPFSEOLN‚EQU…8�END�OF�LINEPFSPA„EQU…9�PASSED�ASSIGNED'PFSAPCƒEQU…10ŒACCESS�PERMISSION�CHANGEDPFSCLFƒEQU…11ŒCOMMAND�LINE�FILEPFSOUTƒEQU…12ŒOUTPUTISTAT„EQU…$3F‹INITIAL�STATUS * ADDITIONAL LU EQUATEMAXLU„EQU…31ŒMAXIMUM�VALID�LU * ERROR EQUATES OSE†EQU…0�OPERATING�SYSTEM�ERROR#LUA†EQU…$40‹LOGICAL�UNIT�ASSIGNMENTNAM†EQU…$28‹FILENAMEOPT†EQU…$41‹OPTIONMAL†EQU…$12‹MEMORY�ALLOCATION:WSN†EQU…$13‹WRONG�SEGMENT�NAME,�MUST�BE�'SEG2'�(VM0X�ONLY)%CLF†EQU…$42‹TOO�MANY�CMND�LINE�FIELDSFNR†EQU…$43‹FILE�NOT�RESETFNW†EQU…$44‹FILE�NOT�REWRITTEN‰PAGENNNNNNN  ‰PAGE ˆOPT‡MEX3ˆXREF†.PFPOINTƒ!�THE�F_LINE�TRAP�SIMULATING�ROUTINE O******* Definition of Special FP Registers (and their bit field values) ******* CNTRL„EQU‡0 STATUSƒEQU‡1 TMPSTAT‚EQU‡2 INSTADƒEQU‡3 O******* Definition of FP instruction "data types" (size codes, bits 5-3) ****** .FP.S„EQU‡0 .FP.D„EQU‡8 .FP.X„EQU‡$10 .FP.B„EQU‡$18 .FP.W„EQU‡$20 .FP.…EQU‡$20 .FP.L„EQU‡$28 .FP.P„EQU‡$30.FP.PDYN�EQU‡$38‘('K'�dynamic)  ‰PAGE FMOVE„MACRO‰NOLIST?‰IFC‡'\4','FP'�.........�move�to�FPn�.......................... !‰IFC‡'\1','FP'‹..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','S'Œ..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','#'Œ..�not�implemented ‰FAIL†999‰ENDC .FP.WRD2�SET‡$0000+.FP.\0+\5 ‰IFC‡'\1','D'Œ..�Dn�source.FP.WRD1�SET‡$F040+\2‰LIST********�FMOVE.\0‚\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC ‰IFC‡'\1','A'Œ..�disp(An)�source‰IFC‡'\3',''�..�no�displacement.FP.WRD1�SET‡$F050+\2‰LIST********�FMOVE.\0‚(\1\2),\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC‰IFNC†'\3',''�..�displacement.FP.WRD1�SET‡$F068+\2‰LIST********�FMOVE.\0‚\3(\1\2),\4\5‰DC.W†.FP.WRD1,.FP.WRD2,\3‰NOLIST‰ENDC‰ENDC >‰ENDC†...................�move�to�FPn�........................  >‰IFC‡'\4','S'‚.........�move�to�Special�FP�Reg�............... !‰IFC‡'\1','FP'‹..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','S'Œ..�not�implemented ‰FAIL†999‰ENDC ‰IFC‡'\1','A'Œ..�not�implemented ‰FAIL†999‰ENDC .FP.WRD2�SET‡$2000+\5 ‰IFC‡'\1','D'Œ..�Dn�source.FP.WRD1�SET‡$F040+\2‰LIST********�FMOVE.\0‚\1\2,\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC !‰IFC‡'\1','#'Œ..�immediate�source.FP.WRD1�SET‡$F07C‰LIST********�FMOVE.\0‚\1\2,\5‰DC.W†.FP.WRD1,.FP.WRD2 ‰IFC‡'\0','L'‰DC.L†\2‰ENDC‰IFNC†'\0','L'‰DC.W†\2‰ENDC‰NOLIST‰ENDC >‰ENDC†...................�move�to�Special�FP�Reg�.............  ‰IFNC†'\4','FP'‰IFNC†'\4','S' HqQuY]=‰IFC‡'\1','FP'�.........�move�from�FP�to�memory�............. ‰IFC‡'\4','#'Œ..�not�implemented ‰FAIL†999‰ENDC %‰IFC‡'\0\7','PD'‰..�BCD�w/'k'�dynamic%.FP.WRD2�SET‡$1000+(\8<<6)+.FP.PDYN\2‰ENDC‰IFNC†'\0\7','PD'.FP.WRD2�SET‡$1000+.FP.\0+\2‰ENDC ‰IFC‡'\4','D'Œ..�Dn�destination.FP.WRD1�SET‡$F040+\5‰LIST********�FMOVE.\0‚\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC %‰IFC‡'\4','A'Œ..�disp(An)�destination!‰IFC‡'\6',''�....�no�displacement.FP.WRD1�SET‡$F050+\5‰LIST‰IFC‡'\0\7','PD'"********�FMOVE.\0‚\1\2,(\4\5),\7\8‰ENDC‰IFNC†'\0\7','PD'********�FMOVE.\0‚\1\2,(\4\5)‰ENDC‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC‰IFNC†'\6',''�....�displacement.FP.WRD1�SET‡$F068+\5‰LIST********�FMOVE.\0‚\1\2,\6(\4\5)‰DC.W†.FP.WRD1,.FP.WRD2,\6‰NOLIST‰ENDC‰ENDC >‰ENDC†...................�move�from�FP�to�memory�.............  >‰IFC‡'\1','S'‚.........�move�from�Spec�FP�Reg�to�memory�...... ‰IFC‡'\4','#'Œ..�not�implemented ‰FAIL†999‰ENDC .FP.WRD2�SET‡$3000+\2 ‰IFC‡'\4','D'Œ..�Dn�destination.FP.WRD1�SET‡$F040+\5‰LIST********�FMOVE.\0‚\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰NOLIST‰ENDC %‰IFC‡'\4','A'Œ..�disp(An)�destination!‰IFC‡'\6',''�....�not�implemented ‰FAIL†999‰ENDC‰IFNC†'\6',''�....�displacement.FP.WRD1�SET‡$F068+\5‰LIST********�FMOVE.\0‚\2,\6(\4\5)‰DC.W†.FP.WRD1,.FP.WRD2,\6‰NOLIST‰ENDC‰ENDC @‰ENDC†...................�move�from�Spec�FP�Reg�to�memory�...... ‰ENDC‰ENDC ‰LIST‰SPC‡1‰ENDM   FMOVEEƒMACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST!‰FMOVE.\0‚\1,\2,\3,\4,\5,\6,\7,\8‰ENDM  ‰PAGE FADD…MACRO‰NOLIST‰IFNC†'\1\4','DFP'4‰FAIL†999‡must�be:ƒFADD�Dn,FPn�...�\1,  \2,\3,\4,\5,\6‰ENDC‰IFC‡'\1\4','DFP'.FP.WRD1�SET‡$F040+\2.FP.WRD2�SET‡$6000+.FP.\0+\5‰LIST********�FADD.\0ƒ\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰ENDC‰SPC‡1‰ENDM   FADDE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FADD.\0ƒ\1,\2,\3,\4,\5,\6‰ENDM   FMUL…MACRO‰NOLIST‰IFNC†'\1\4','FPFP'5‰FAIL†999‡must�be:‚FMUL�FPn,FPn�...�\1,\2,\3,\4,\5,\6‰ENDC‰IFC‡'\1\4','FPFP'.FP.WRD1�SET‡$F000+\2 ‰IFC‡'\0',''0.FP.WRD2�SET‡$6080+\5Œdefault�is�"S",�not�"W"�!!‰ENDC ‰IFNC†'\0',''.FP.WRD2�SET‡$6080+.FP.\0+\5‰ENDC‰LIST********�FMUL.\0ƒ\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2‰ENDC‰SPC‡1‰ENDM   FMULE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FMUL.\0ƒ\1,\2,\3,\4,\5,\6‰ENDM   FCMP…MACRO‰NOLIST‰IFNC†'\1\4','#FP'4‰FAIL†999‡must�be:‚FCMP�#n,FPn�...�\1,\2,\3,\4,\5,\6‰ENDC‰IFC‡'\1\4','#FP'.FP.WRD1�SET‡$F07C.FP.WRD2�SET‡$6140+.FP.\0+\5‰LIST********�FCMP.\0ƒ\1\2,\4\5‰DC.W†.FP.WRD1,.FP.WRD2 ‰IFC‡'\0','L'‰DC.L†\2‰ENDC‰IFNC†'\0','L'‰DC.W†\2‰ENDC‰ENDC‰SPC‡1‰ENDM   FCMPE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FCMP.\0ƒ\1,\2,\3,\4,\5,\6‰ENDM   FSLT…MACRO‰NOLIST‰IFNC†'\1','D'‰FAIL†999‘must�be:ƒFSLT�Dn‰ENDC ‰IFC‡'\1','D'.FP.WRD1�SET‡$F040+\2.FP.WRD2�SET‡$A0C0‰LIST********�FSLT.\0ƒ\1\2‰DC.W†.FP.WRD1,.FP.WRD2‰ENDC‰SPC‡1‰ENDM   FSLTE„MACRO‰LIST ‰BSR‡.PFPOINT‰NOLIST‰FSLT.\0ƒ\1,\2‰ENDM ‰PAGENNN6†TTL†68K�PASCAL�MACRO�DEFINITIONS�FOR�RUNTIME�ROUTINES*<*Ž**********************************************************7*Ž*�MACRO�DEFINITIONS�FOR�68K�PASCAL�RUNTIME�ROUTINES†*<*Ž***********************************************************F…MACRO'‰BSRƒ.PFPOINTŠ!�CALL�THE�TRAP�SIMULATOR ‰IFNC‚'\1','' ŒIFNC‚'\2','' �IFNC‚'\3',''3’F\0ƒ\1,\2,\3�!�THREE�ARGUMENT�FLOATING�INSTRUCTION�ENDC �IFCƒ'\3',''.’F\0ƒ\1,\2„!�TWO�ARGUMENT�FLOATING�INSTRUCTION�ENDCŒENDC ŒIFCƒ'\2',''*�F\0ƒ\1Š!�ONE�AGUMENT�FLOATING�INSTRUCTIONŒENDC‰ENDC ‰IFCƒ'\1',''-ŒF\0’!�FLOATING�INSTRUCTION�WITH�NO�ARGUMENTS‰ENDC†ENDM**…CALL�PROCEDURE�MACRO* CALL‚MACRO‰BSRƒ\1�!�ARGUMENTS�ARE�\2†ENDM**…PROCEDURE�ENTRY�MACRO*PROCEDUREƒMACRO**ŽARGUMENTS�ARE�\2*"�DS.W…0ˆ!�ALIGN�ON�A�WORD�BOUNDARY\1�EQU†*ˆ!�PUT�ENTRY�POINT�HEREŒENDM**…PROCEDURE�EXIT�MACRO*END_PROC„MACRO �RTS†!�RETURN�TO�WHO�EVER�CALLEDŒENDM*1*…MACRO�FOR�ROUNDING�A�VALUE�UP�TO�AN�EVEN�NUMBER* EVENˆMACRO�ADDQ.\0‚#1,\1�ANDI.\0‚#-2,\1ŒENDM*@*…MACRO�FOR�CONVERTING�A�CHARACTER�STORED�IN�A�BYTE�TO�UPPERCASE*UPPERCASEƒMACRO,�IF.B�\1��#'a'�AND.B�\1��#'z'�THEN.S’SUBI.Bƒ#'a'-'A',\1�ENDIŒENDM*&*…MACRO�FOR�WRITING�A�SINGLE�CHARACTER*WRITE_CHAR‚MACRO�MOVE.Bƒ\1,(A1)�CALL….PIWPTR,ŒENDM*!*…MACRO�FOR�READING�A�SINGLE�CHAR*GET_CHAR„MACRO�CALL�.PIRPTR,ƒ\1�CALL�.PGETCH, �UPPERCASE�D0ŒENDM*=*…MACRO�FOR�GENERATING�A�RUNTIME�ERROR�FROM�A�RUNTIME�ROUTINE* ERROR‡MACRO&�MOVEQ„#\1,D0ƒ!�PUT�ERROR�NUMBER�IN�D0�TRAP…#14†!�DO�A�TRAP�14...)�DC.W…0ˆ!�...�FOLLOWED�BY�A�WORD�OF�ZEROSŒENDM*  NaV‰TTL…68K�PASCAL�SYMBOL�EQUATES* **********0*ˆPASCAL�RUNTIME�ROUTINES�EQUATE,�AND�MACRO�FILE* ***********œGLOBAL�EQUATES* ***********ˆVARIABLE�OFFSETS* **********1FDP†EQU…4‹*�4�=�OFFSET�TO�FILE�DESCRIPTOR�POINTER1PFS†EQU…4‹*�4�=�OFFSET�TO�PASCAL�FILE�STATUS�WORD-CSZ†EQU…6‹*�6�=�OFFSET�TO�COMPONENT�SIZE�WORD1BCD†EQU…6‹*�6�=�OFFSET�TO�BCD�BUFFER�IN�REAL�READ3HPTR…EQU…4‹*�4�=�OFFSET�TO�HEAP�PTR�IN�RT�MAINTENCE6CCDR…EQU…52Š*�52�=�OFFSET�TO�CHAIN�CMD�DIAG�REG�IN�RMA3SBP†EQU…20Š*�20�=�OFFSET�TO�START�OF�BUFFER�POINTER1EBP†EQU…24Š*�24�=�OFFSET�TO�END�OF�BUFFER�POINTER7BUF†EQU…32Š*�32�=�BUFFER�ZONE�SIZE�FOR�STACK�ALOCATIONS7A5OFFSET�EQU…52Š*�OFFSET�TO�A5�REG�IN�FP�USER�REG�BLOCK2LOWHEAP‚EQU…368‰*�OFFSET�TO�LOWEST�ADDRESS�IN�HEAP* ***********ˆSYMBOLIC�CONSTANTS* **********9RR$ERRƒEQU…0‹*�0�=�#�After�Trap�14�means�RR�routine�error1FP$ERRƒEQU…1‹*�1�=�#�After�Trap�14�means�Fp�error7FHSIOSƒEQU…2‹*�2�=�#�AFTER�TRAP�14�WHICH�MEANS�FHS/IOS„6INLNRTƒEQU…3‹*�3�=�#�AFTER�TRAP�14�WHICH�MEANS�IN�LINE*7ABORT„EQU…14Š*�14�=�EXEC�PARAM�FOR�ABNORMAL�TERMINATION4TERM…EQU…15Š*�15�=�EXEC�PARAM�FOR�NORMAL�TERMINATION'FORM…EQU…12Š*�12�=�ASCII�FORM�FEED�CODE(SPC†EQU…$20‰*�$20�=�ASCII�SPACE�CODE�'�'-NEG†EQU…$2D‰*�$2D�=�ASCII�MINUS�SIGN�CODE�'-'-PLUS…EQU…$2B‰*�$2B�=�ASCII�PLUS‚SIGN�CODE�'+''ZERO…EQU…$30‰*�$30�=�ASCII�CODE�FOR�'0''NINE…EQU…$39‰*�$39�=�ASCII�CODE�FOR�'9'$AˆEQU…$41‰*�$41�=�ASCII�CODE�FOR�'A'$EˆEQU…$45‰*�$45�=�ASCII�CODE�FOR�'E'$IˆEQU…$49‰*�$49�=�ASCII�CODE�FOR�'I'$NˆEQU…$4E‰*�$4E�=�ASCII�CODE�FOR�'N'$TˆEQU…$54‰*�$54�=�ASCII�CODE�FOR�'T'$ZˆEQU…$5A‰*�$5A�=�ASCII�CODE�FOR�'Z'=MINUS_INFƒEQU‚$B0‰*�$B0�=�SIGN�OF�EXPONENT�FOR�MINUS�INFINITY;PLUS_INF„EQU‚$A0‰*�$A0�=�SIGN�OF�EXPONENT�FOR�PLUS�INFINITY3NAN_SIGN„EQU‚$C0‰*�$C0�=�SIGN�OF�EXPONENT�FOR�A�NANANAN_WIDTHƒEQU‚16Š*�16�=�NUM�COLUMN�POSITION�NEEDED�TO�WRITE�A�NAN;OVRHD‡EQU‚4‹*�4�=�NUMBER�OF�OVERHEAD�DIGITS�IN�A�REAL�WRITEj:s3{9MAXRODIG„EQU‚17Š*�17�=�MAX�NUM�DIGITS�CONVERTED�ON�OUTPUT@MAXRIDIG„EQU‚19Š*�19�=�MAX�NUM�DIGITS�CONVERTED�ON�INPUT�OF�REAL?MAXIIDIG„EQU‚34Š*�34�=�MAX�NUM�DIGITS�CONVERTED�ON�INPUT�OF�INTBCLRRNDMODE‚EQU‚$FCFF‡*�$FCFF�=�MASK�TO�CLEAR�ROUNDING�MODE�TO�ZEROFRNDTOZEROƒEQU‚$0100‡*�$0100�=�MASK�TO�SET�ROUNDING�MODE�TO�RND�TO�ZERO=INITSTATUS‚EQU‚0‹*�0�=�VALUE�TO�INIT�68341�STATUS�REGISTER�TO;INITCNTRLƒEQU‚0‹*�0�=�VALUE�TO�INIT�68341�CNTRL�REGISTER�TO8MAXRNDPREC‚EQU‚2‹*�2�=�MAX�VALUE�OF�ROUNDING�PREC.�FIELD1MAXCLOSURE‚EQU‚1‹*�1�=�MAX�VALUE�OF�CLOSURE�FIELD@MAXNORMMODE�EQU‚1‹*�1�=�MAX�VALUE�OF�THE�NORMAIZATION�MODE�FIELD;MAXRNDMODE‚EQU‚3‹*�3�=�MAX�VALUE�OF�THE�ROUNDING�MODE�FIELD1MAXPOSEXPƒEQU‚4931ˆ*�4931�=�MAX�POSITIVE�EXPONENT1MAXNEGEXPƒEQU‚4952ˆ*�4952�=�MAX�NEGATIVE�EXPONENT=�THE�CUR�BASE�WAS�FOUNDAREADOVF‚EQU…$64‰*�$64�=�OVERFLOW�OCCURED�WHILE�READING�AN�INTEGER4BADNANƒEQU…$70‰*�$70�=�BAD�MANTISA�IN�NAN�GENERATION* *ˆBUFFER�BLOCK�OFFSETS�AND�SIZES* ŒOFFSETƒ0UNPACKED„DS.B…20PACKED†DS.B…14BCDBUFSIZE‚DS.W…0CHARBUFSIZE�DS.W…0* ŒOFFSETƒ0 SIGNS‡DS.B…1AFTER_DP„DS.B…1EXPONENT„DS.W…1BCDDIGITSƒDS.B…64NAN_VALUEƒDS.B…4‹!�THIS�FIELD�ALSO�PART�OF�BCDDIGITSENDPACKEDƒDS.W…0* ŒOFFSETƒ$1748ERRADR†DS.L…1Š*�$174�=�OFFSET�TO�ERROR�ADDRESS�SAVE�AREA9ERRNUM†DS.L…1Š*�ERRNMR�=�OFFSET�TO�ERROR�NUMBER�SAVE�AREA8REGSˆDS.L…1Š*�REGS�=OFFSET�FROM�A5�TO�REGISTER�SAVE�AREA*NNNNA*********BEGINNING RR.VDOSVM.SA**********************************‰NOLIST*7*ˆEQUATES�TO�SET�PASCAL�COMPILER�OPERATING�ENVIRONMENT.**ˆTHE�EQUATE�WHOSE�VALUE�IS�0�IS�SELECTED.**ˆCOPYRIGHT�1982�MOTOROLA,�INC.**ˆVERSION�2.01�:�04-19-82**ˆ04-19-82�:�DAVE�STANDAGE*A*****************************************************************‰LIST1VDOSEXƒEQU‡1‰!�!�NO!�!�!�VERSADOS�ON�THE�EXORMACS4VDOSVMƒEQU‡0‰!�!�YES�!�!�VERSADOS�ON�THE�VERSAMODULE1RMSVM„EQU‡1‰!�!�NO!�!�!�RMS68KƒON�THE�VERSAMODULE A*********ENDING OF RR.VDOSVM.SA********************************** NN  NNNƒ'EXORMACSLOADMMU AF˜˜  VECTORS AF¡¡  KILLER AFªª  LOADMMU SA³³ø  VECTORS SAÔÔ  KILLER SAÝÝ>  =/*=/*†EXORMACS.LOADMMU.AF=/*.=/* Chain file to assemble EXORMACS.LOADMMU.SA=/*:=/* If no output argument is specified for the listing the2=/* chain file will default to EXORMACS.LOADMMU.LS=/*=/IFC \1ƒ=ARG�EXORMACS.LOADMMU.LS=/ENDIF=/*5=ASM EXORMACS.LOADMMU.SA,EXORMACS.LOADMMU.RO,\1;RZ=50=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDNNNNNN  �=/*=/*†EXORMACS.VECTORS.AF=/*.=/* Chain file to assemble EXORMACS.VECTORS.SA=/*:=/* If no output argument is specified for the listing the2=/* chain file will default to EXORMACS.VECTORS.LS=/*=/IFC \1ƒ=ARG�EXORMACS.VECTORS.LS=/ENDIF=/*6=ASM EXORMACS.VECTORS.SA,EXORMACS.VECTORS.RO,\1;MRZ=50=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDNNNNNN™=/*=/*†EXORMACS.KILLER.AF=/*B=/* Chain file to assemble EXORMACS.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to EXORMACS.KILLER.LS=/*=/IFC \1ƒ=ARG‚EXORMACS.KILLER.LS=/ENDIF=ARG \1,EXORMACS.KILLER.RO=/*F=ASM M68000.M68000.SA/M68XXX.KILLER.SA/EXORMACS.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*ƒ9995.&.PANEL.EQ=/*}=/*=ENDNNN  NN¢‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST9LOADMMU‚IDNT‚45,0…LOADMMU�SUBROUTINES�FOR�EXORMACS�SYSTEM‰SPCƒ1O*********************************************************************************ˆEXORMACS.LOADMMU*H*ˆSubroutines�to�add�segments�and�delete�segments�from�the�EXORMACS�MMU.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*'*ˆEntry:„A5�=�target�task's�TST�address*’D5�=�offset�to�TSTMMU�entry*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*�*�*�*�*�**™A„*‡P**™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed**D*ˆExit:‚RTS�to�caller‚(ADD_SEG_TO_MMU�AND�DEL_SEG_FROM_MMU�must�have*�condition�codes�set�)**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------@*ˆ08/20/85‚Chuck�Smith„Changed�for�new�format�of�TST�-�Load�regs.*¡individually�instead�of�MOVEM.L�instruction.@*ˆ07/26/85‚Julie�Hoban„Added�ADD_SEG_TO_MMU�subroutine.�Replaced+*¡UNLDMMU�subroutine�with�DEL_SEG_FROM_MMU.*ˆ03/30/81‚HLD6‹Rev�2.00*ˆ09/18/80‚HLD6*O*******************************************************************************‰PAGE ‰SECTION�2 ‰OPT…CL **‚XDEF's*ŠXDEFƒADD_SEG_TO_MMUŠXDEFƒADD_SEG2 ŠXDEFƒCRASN ŠXDEFƒDEASNŠXDEFƒDEL_SEG_FROM_MMU ŠXDEFƒLOADMMUŠXDEFƒLOADMMUIŠXDEFƒMMUFAULT **‚XREF's*ŠXREF.S�MMUHEREŠXREF.S�MMULOAD ŠXREFƒTRACERŠXREF.S�TRACFLAG **‚INCLUDED�FILES:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ* *!*‚MACRO�TO�SET�CONDITION�CODES�EQ* SETCCEQ‚MACRO ‰CMP.L…D0,D0‰ENDM‰PAGEO********************************************************************************%*ˆLOADMMU�Subroutine�for�the�EXORMACS* *ˆEntry:„A5�=�target�TST�address*«Z´.¼8Ä9O******************************************************************************* ,LOADMMU‚MOVE.W‚SR,-(A7)ŠSAVE�STATUS�REGISTER)LOADMMUI�OR.W„#$700,SRŠINHIBIT�INTERRUPTS=******ƒMOVEM.L�TSTMMU(A5),D0-D7‚SEGMENT�DESCRIPTIONSŽ08/20/85 ?*ˆTHE�OLD�FORMAT�OF�THE�TST�PERMITTED�US�TO�LOAD�D0-D7�WITH�ONE?*ˆMOVEM.L�INSTRUCTION.‚NOW�WE�HAVE�TO�LOAD�THE�REGISTERS�ONE�BY*ˆONE. ‰MOVE.L‚A1,-(A7)ŽSAVE�A1!‰MOVE.L‚A5,A1‘COPY�POINTER�TO�TST/‰MOVE.L‚A5,MMULOADŒSAVE�ADDRESS�OF�CURRENT�LOAD @‰MOVE.L‚TSTLB+TSTMMU(A5),D0ƒGET�BEGINNING�(32�BIT)�ADDRESS�IN�D04‰LSL.Lƒ#8,D0‘GET�MIDDLE�2�BYTES�OF�TSTLB�IN�UPPER�D0?‰MOVE.L‚TSTLE+TSTMMU(A5),D7ƒSTORE�32�BIT�LOGICAL�ENDING�ADDRESS4‰LSR.Lƒ#8,D7‘GET�MIDDLE�2�BYTES�OF�TSTLE�IN�LOWER�D76‰MOVE.W‚D7,D0‘D0�NOW�HAS�OLD�FORMAT�OF�TSTLB�AND�TSTLE <‰MOVE.L‚TSTPO+TSTMMU(A5),D1ƒGET�32�BIT�PHYSICAL�OFFSET�IN�D14‰LSL.Lƒ#8,D1‘GET�MIDDLE�2�BYTES�OF�TSTPO�IN�UPPER�D1‰CLR.WƒD1”CLEAR�FOR�SHORT�LOAD:‰MOVE.B‚TSTCTL+TSTATTR(A1),D1‚GET�CONTROL�INFO�IN�LOWER�D1 3‰ADD.L ƒ#TSTMLEN,A5‹UPDATE�POINTER�TO�NEXT�MMU�ENTRY4‰ADD.Lƒ#TSTALEN,A1‹UPDATE�POINTER�TO�NEXT�ATTR�ENTRY @‰MOVE.L‚TSTLB+TSTMMU(A5),D2ƒGET�BEGINNING�(32�BIT)�ADDRESS�IN�D24‰LSL.Lƒ#8,D2‘GET�MIDDLE�2�BYTES�OF�TSTLB�IN�UPPER�D2?‰MOVE.L‚TSTLE+TSTMMU(A5),D7ƒSTORE�32�BIT�LOGICAL�ENDING�ADDRESS4‰LSR.Lƒ#8,D7‘GET�MIDDLE�2�BYTES�OF�TSTLE�IN�LOWER�D76‰MOVE.W‚D7,D2‘D2�NOW�HAS�OLD�FORMAT�OF�TSTLB�AND�TSTLE <‰MOVE.L‚TSTPO+TSTMMU(A5),D3ƒGET�32�BIT�PHYSICAL�OFFSET�IN�D34‰LSL.Lƒ#8,D3‘GET�MIDDLE�2�BYTES�OF�TSTPO�IN�UPPER�D3‰CLR.WƒD3”CLEAR�FOR�SHORT�LOAD:‰MOVE.B‚TSTCTL+TSTATTR(A1),D3�GET�CONTROL�INFO�IN�LOWER�D3 3‰ADD.Lƒ#TSTMLEN,A5‹UPDATE�POINTER�TO�NEXT�MMU�ENTRY4‰ADD.Lƒ#TSTALEN,A1‹UPDATE�POINTER�TO�NEXT�ATTR�ENTRY‰PAGE@‰MOVE.L‚TSTLB+TSTMMU(A5),D4ƒGET�BEGINNING�(32�BIT)�ADDRESS�IN�D44‰LSL.Lƒ#8,D4‘GET�MIDDLE�2�BYTES�OF�TSTLB�IN�UPPER�D4?‰MOVE.L‚TSTLE+TSTMMU(A5),D7ƒSTORE�32�BIT�LOGICAL�ENDING�ADDRESS4‰LSR.Lƒ#8,D7‘GET�MIDDLE�2�BYTES�OF�TSTLE�IN�LOWER�D76‰MOVE.W‚D7,D4‘D4�NOW�HAS�OLD�FORMAT�OF�TSTLB�AND�TSTLE <‰MOVE.L‚TSTPO+TSTMMU(A5),D5ƒGET�32�BIT�PHYSICAL�OFFSET�IN�D54‰LSL.Lƒ#8,D5‘GET�MIDDLE�2�BYTES�OF�TSTPO�IN�UPPER�D5‰CLR.WƒD5”CLEAR�FOR�SHORT�LOAD:‰MOVE.B‚TSTCTL+TSTATTR(A1),D5�GET�CONTROL�INFO�IN�LOWER�D5 3‰ADD.Lƒ#TSTMLEN,A5‹UPDATE�POINTER�TO�NEXT�MMU�ENTRY5‰ADD.Lƒ#TSTALEN,A1‹UPDATE�POINTER�TO�NEXT�ATTR.�ENTRY @‰MOVE.L‚TSTLB+TSTMMU(A5),D6ƒGET�BEGINNING�(32�BIT)�ADDRESS�IN�D64‰LSL.Lƒ#8,D6‘GET�MIDDLE�2�BYTES�OF�TSTLB�IN�UPPER�D6?‰MOVE.L‚TSTLE+TSTMMU(A5),D7ƒSTORE�32�BIT�LOGICAL�ENDING�ADDRESS4‰LSR.Lƒ#8,D7‘GET�MIDDLE�2�BYTES�OF�TSTLE�IN�LOWER�D76‰MOVE.W‚D7,D6‘D6�NOW�HAS�OLD�FORMAT�OF�TSTLB�AND�TSTLE <‰MOVE.L‚TSTPO+TSTMMU(A5),D7ƒGET�32�BIT�PHYSICAL�OFFSET�IN�D74‰LSL.Lƒ#8,D7‘GET�MIDDLE�2�BYTES�OF�TSTPO�IN�UPPER�D7‰CLR.WƒD7”CLEAR�FOR�SHORT�LOAD:‰MOVE.B‚TSTCTL+TSTATTR(A1),D7�GET�CONTROL�INFO�IN�LOWER�D7 *ˆWE�ARE�DONE�LOADING�REGISTERS! ‰MOVE.L‚(A7)+,A1ŠRESTORE�A1!‰MOVE.L‚MMUHERE,A5ˆADDRESS�OF�MMU‰MOVEM.L�D0-D7,(A5)ˆLOAD�MMU*/‰BTST„#TRCFMMU,TRACFLAG�SHOULD�ENTRY�BE�TRACED?‰BEQ.SƒLOADMMUZŠBRANCH�IF�NO‰BSR…TRACERŒBUILD�TRACE�ENTRY‰DC.W„$DD08�TRACE�CODELOADMMUZ�RTE—RETURN‰PAGEO********************************************************************************.*ˆDEL_SEG_FROM_MMU�subroutine�for�the�EXORMACS*;*ˆThis�routine�will�delete�a�segment�from�the�EXORMACS�MMU.D*ˆThe�segment�to�delete�is�pointed�to�by�a�combination�of�A5�and�D5.C*ˆA5�points�to�the�TST�containing�the�segment,�and�D5�points�to�the"*ˆspecific�segment�within�the�TST.*@*ˆTo�delete�a�segment�from�the�EXORMACS�MMU,�we�clear�the�TSTCTL=*ˆfield�of�the�TST�segment�entry,�and�then�call�LOADMMU.‚This**ˆwill�invalidate�that�particular�segment.*;*ˆHowever,�we�don't�want�to�do�this�unless�we�know�that�the=*ˆtask�segment�information�already�in�the�MMU�belongs�to�this*ˆtask.***ˆSo�we�check�MMULOAD�against�A5�to�start.**A*ˆThis�routine�is�called�from�two�directives,�SEGDEAL�and�TFRSEG.** *ˆEntry:„A5�=�target�TST�address*’D5�=�offset�to�TSTMMU�entry*O******************************************************************************* DEL_SEG_FROM_MMU:9‰CMP.L…MMULOAD,A5ŠIs�the�target�TST�currently�in�the�MMU?‰IF��THEN.S�If�yes,�then... <‰CLR.B…TSTCTL(A5,D7)‡Set�the�EXORMACS�segment�entry�invalid.'‰MOVEM.LƒD0-D7/A5,-(A7)†Save�registers.3‰BSR‡LOADMMU�Load�the�new�segment�map�into�the�MMU.*‰MOVEM.Lƒ(A7)+,D0-D7/A5†Restore�registers. ‰ENDI‰SETCCEQ ‰RTS›Return.‰PAGEO********************************************************************************,*ˆADD_SEG_TO_MMU�subroutine�for�the�EXORMACS* *ˆEntry:„A5�=�target�TST�address*’D5�=�offset�to�TSTMMU�entry*O******************************************************************************* ADD_SEG_TO_MMU:9‰CMP.L…MMULOAD,A5ŠIf�the�target�TST�currently�in�the�MMU?‰IF��THEN.S�If�yes,�then... '‰MOVEM.L‚D0-D7/A5,-(A7)‡Save�registers.3‰BSR†LOADMMUŽLoad�the�new�segment�map�into�the�MMU. .‰MOVEM.L‚(A7)+,D0-D7/A5‡Restore�the�registers. ‰ENDI ADD_SEG2:‰SETCCEQ‰RTS O********************************************************************************5*ˆCRASN,�DEASN,�MMUFAULT�subroutines�for�the�EXORMACS*A*ˆThese�are�dummy�entry�points--�these�routines�are�called�by�the?*ˆexec�for�the�M68451�MMU,�but�they�don't�know�that�we're�not�a*ˆM68451,�so�we�simply�return.*O******************************************************************************* CRASN:DEASN: MMUFAULT: &‰RTS›Just�return--he'll�never�know.... ‰ENDNŠPAGE#VECTORSƒIDNTƒ45,0�INTERRUPT�VECTORS*‰VECTOR�TABLE�IN�LOW�MEMORY*ŠORG„03ILLINSTR‚EQU„0’SET�FOR�ILLEGAL�INSTRUCTION�VECTOR�4%*¦0�=�RMS�WILL�LEAVE�THE�VECTOR�ALONE'*¦1�=�RMS�WILL�TAKE�CONTROL�OF�VECTOR�4**INITSTRT‚EQU„$0* ŠXREFƒSYSPAR #ŠDC.LƒSYSPAR�STACK�POINTER�ON�RESETŠDC.LƒINITSTRTŠDC.Lƒ0ŠDC.Lƒ0 ŠXREFƒPROGINT4 &ŠDC.LƒPROGINT4‹SV4‚ILLEGAL�INSTRUCTIONŠDC.Lƒ0ŠDC.Lƒ0ŠDC.Lƒ0ŠDC.Lƒ0ŠDC.Lƒ$FE8808ŒTRACE�TRAPŠENDNNNNNN̉LIST‰PAGE‰SPCƒ1(*–EXORMACS�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.EXORMACS.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�BoardFail�LED.2*’2.‚Writes�a�hex�'AF'�to�the�front�panel�display.A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BSR�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�Exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚----------- --‚---------------------------------------------(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 *ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.PANEL.EQ*‰NOLIST‰INCLUDEƒ9995.&.PANEL.EQ‰OPT…CL‰LIST ‰XREF.S‚PANEL ‰SECTION�LEVEL00* *ˆEQUATESHALFSEC‚EQU‡$3FFFF  -*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED KILLER3: ‰MOVE.L‚PANEL,A1‘PANEL�ADDRESS(‰MOVE.W‚#$95,FPLEDST(A1)‰DISABLE�TTO--AX!‰MOVE.W‚#$B5,FPLEDST(A1)‰LATCH�IT‰MOVE.W‚#$A0,FPLEDST(A1)‰XF!‰MOVE.W‚#$B0,FPLEDST(A1)‰LATCH�IT‰BRA.SƒKILLER3 KILLER8:�BRA.SƒKILLER8 ‰ENDNNÕ?'BESTFIT INIT AFêê  IMEM SAóä @  =/*=/*†BESTFIT.INIT.AF=/**=/* Chain file to assemble BESTFIT.INIT.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to BESTFIT.INIT.LS=/*=/IFC \1ƒ=ARG�BESTFIT.INIT.LS=/ENDIF=/*<=ASM M68XXX.INIT.SA/BESTFIT.IMEM.SA,BESTFIT.INIT.RO,\1;RZ=90=/*{ 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=/*ƒ9995.&.KILL.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=ENDNNN NNâ ‰PAGEO*********************************************************************************ˆBESTFIT.IMEM.SA*@*ˆThis�module�is�an�include�file�for�M68XXX.INIT.SA.‚It�contains;*ˆtwo�entry�points�--�memory�initialization�code�and�system?*ˆinitializer�exit�code.‚The�memory�initialization�code�in�this>*ˆmodule�is�based�on�the�best�fit�method.‚It�must�be�used�withD*ˆBESTFIT.PAGEALOC.SA‚and�BESTFIT.PAGEFREE.SA.‚The�exit�code�in�this4*ˆdoes�a�fake�RTS�to�go�to�the�exec�module�DISPATCH.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*;*ˆEntry:‚IMEM„-�Called�as�a�subroutine�from‚M68XXX.INIT.SA.,*�INITEND�-�Branched�to�from�M68XXX.INIT.SA.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*�*�*�*�*�**™A‚*�*�*�*�*�*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed**ˆExits:/*ˆIMEM„Good�return�-�RTS�back�to�M68XXX.INIT.SA0*ˆIMEM„Bad�return‚-�Exits�via�KILL.EXECT0�macro.B*ˆINITEND�Good�return�-�Fake�RTS�to�free�memory�&�DISPATCH�module.*ˆINITEND�Bad�return‚-�None.**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------?*ˆ04/08/86‚Julie�Hoban„Added�code�to�grab�SYSINIT�and�return�it,*¡to�prevent�allocating�SYSINIT�during�boot.@*ˆ02/12/86‚Julie�Hoban„Added�code�to�allow�RMS�in�RAM�parts�1-X.A*ˆ11/05/85‚Julie�Hoban„Removed�IMEM�subroutine�from�INIT�to�here.*O*******************************************************************************ŠPAGEINITEND:,‰LEA„MEMTABL(PC),A0“Memory�table�in�INITDAT.-‰MOVE.L�MAPENDA(A0),D0“End�of�partition�zero. ‰CLR.L‚D1 C*‚If�the�exec�is�in�partition�zero,�and�its�a�RAM�system,�then..... 7‰IF.L�EEND(PC)��D0�AND.L�TCBHEAD(PC)��D1�THEN.S 9ŠMOVE.L�#T0PGFR,D1‰Free�pages�of�memory�directive�number.,ŠMOVE.L�#T0ENTRY,D0ˆGet�entry�point�address.ŠTRAPƒ#0$ŠBRA.S‚INITE1�Branch�if�good�return. äë:ô7ü(1 Y@'$P,V4-<?D[LJTA\$dil&tc|<„KŒL”9œQ¤;¬R´0¼2ÄhÌ*ÔW%ŠKILL.EXECT0�BESTIMEMSA,NO_FRBLK_ADDR 9INITE1„MOVE.L�DISPATCH(PC),-(A7)�Address�of�start�of�exec/ŠMOVE.L�A0,-(A7)‹Address�of�FREE_BLOCK�routine. 8ŠLEA„255+START(PC),A0ƒStart�of�Init�(from�INITDAT)�+�255 ŠMOVE.L�A0,D0ŠCLR.B‚D0‘Form�"ceiling"/ŠMOVE.L�D0,A0ŽA0�<--�start�of�memory�to�return. ?ŠLEA„255+ENDMEMT(PC),A1�End�of�src�memtabl�(from�INITDAT)�+�255 ŠMOVE.L�A1,D1ŠCLR.B‚D1‘Form�"ceiling"&ŠSUB.L‚A0,D1ŽCalculate�length�in�bytes)ŠLSR.L‚#8,D1ŽD1�<--�page-count�to�return. ‰ELSE.S3ŠMOVE.L�DISPATCH(PC),-(A7)�Address�of�start�of�exec‰ENDI ‰RTS›Go�to�exec.ŠPAGEN*********************************************************************************.***‚Name:‚IMEM�(initialize_memory_partitions).*** ***‚Function:A***ŠChecks�all�memory�locations�described�in�the�SYSGENed�MEMTBL.F***…Maps�out�any�"holes"�in�memory.‚Sets�up�FML�(free�memory�list)�andC***…FML_HEADER�(free�memory�list�header)�in�each�partition.‚Sets�upE***…MEMTBL�(memory�mapping�table)�immediately� after�the�FML_HEADER�in***…partition�zero.*** ***‚Inputs:H***…1.)‚Src_memtbl�(created�by�SYSGEN)�located�at�address�MEMTABL�within***ŠINITDAT�data�area.*** ***‚Outputs:I***…1.)‚Dest_memtbl�located�immediately�after�the�FML_HEADER�in�partition ***Šzero.G***…2.)‚MAPBEG�longword�in�SYSPAR�data�area.‚Points�to�the�dest_memtbl.***Š(Item�#1�above.)E***…3.)‚FML_HEADERs�for�all�RAM�memory�partitions.‚(Pointed�to�by�the***Šdest_memtbl.)@***…4.)‚FMLs�for�all�RAM�memory�partitions.‚(Pointed�to�by�their***ŠFML_HEADERs.)******‚Side�effects:C***…1.)‚All�registers�destroyed,�except�for�the�stack�pointer�(A7).)***…2.)‚Might�never�return�(call�KILLER).***H***‚Explanation:‚This�routine�is�basically�a�driver�for�initializing�theB***…memory�partitions.‚It�is�primarily�concerned�with�initializingI***…partition�zero.‚The�last�subroutine�call�(call�init_next_partitions),H***…handles�the�initialization�of�all�memory�partitions�except�partitionI***…zero.‚This�unique�handling�of�partition�zero�is�neccessary�due�to�theI***…fact�that�the�INIT�module�resides�in�a�portion�of�partition�zero�thatD***…will�later�be�used�by�the�system.‚We�obviously�cannot�clear�this ***…memory.***D***ŠThe�first�call�sets�up�the�neccessary�pointers�to�the�src_memtblF***…and�to�partition�zero.‚The�next�call�will�build�the�FML�(clear�anyE***…memory�not�in�the�INIT�module,�map�out�any�"holes"�in�memory,�andA***…set�up�the�FML�linked�list�describing�the�available�memory�inG***…partition�zero).‚If�the�first_node_ptr�is�returned�as�zero,�then�weF***…did�not�find�even�one�256�byte�block�of�available�memory.‚Since�weE***…need�at�least�one�block�in�partition�zero�for�the�MEMTBL,�this�is3***…obviously�a�fatal�error,�and�so�we�call�KILLER.***F***ŠNext�we�call�build_fml_header�to�build�the�FML_HEADER�in�partitionE***…zero.‚If�the�fml_header_ptr�is�returned�as�zero,�then�we�couldn'tC***…find�enough�memory�in�partition�zero�for�the�FML_HEADER�and�theG***…dest_memtbl,�so�we�cannot�continue,�and�therefore�must�call�KILLER.***@***ŠOtherwise,�we�set�our�dest_memtbl_ptr�to�point�to�the�memory@***…immediately�after�the�FML_HEADER�for�partition�zero,�and�setF***…the�MAPBEG�variable�in�SYSPAR�equal�to�this�value.‚Finally�we�callF***…build_ram_memtbl_entry�to�record�this�ram�partition�in�the�MEMTBL,D***…and�call�init_next_partitions�to�initialize�all�partitions�after***…partition�zero.***L****************************************************************************2ŠTTL„INIT�MEMORY�PARTITIONS�-�REGISTER�ASSIGNMENTSŠPAGEL**********************************************************************************…A0�=�src_memtbl_ptr;7***ŠPoints�to�the�"source"�MEMTBL�in�INITDAT�data�area.******…A1�=�dest_memtbl_ptr;<***ŠPoints�to�the�"destination"�MEMTBL�immediately�after�the!***ŠFML_HEADER�in�partition�zero.***+***…A2�=�temp_memtbl_ptr/previous_node_ptr;?***ŠShared�register.‚During�check_memmap_conflict�it�is�used�toB***Šstep�through�the�dest_memtbl�looking�for�conflicts�between�theB***Š"current"�RAM�partition�(pointed�to�by�the�src_memtbl_ptr)�andB***Šany�previously-defined�RAM�partitions�(pointed�to�by�the�temp_***Šmemtbl_ptr.)C***ŠDuring�build_fml�(and�its�subroutine�build_fml_node)�A2�is�used;***Što�point�to�the�"previous"�node�in�the�FML�linked�list.******…A3�=�first_node_ptr;0***ŠPoints�to�the�first�node�in�the�current�FML.******…A4�=�last_node_ptr;/***ŠPoints�to�the�last�node�in�the�current�FML.***&***…A5�=�clear_mem_ptr/fml_header_ptr;@***ŠShared�register.‚During�build_fml�(and�build_fml_node)�it�is<***Šused�to�point�to�the�next�memory�location�to�be�cleared.<***ŠDuring�all�the�other�routines�it�is�used�to�point�to�the***ŠFML_HEADER�block.***…A6�=�scratch;****** ***…D0�=�0;B***ŠUsed�for�zeroing�out�memory,�and�checking�if�address�registers***Šare�equal�to�zero.******…D1-D3�=�scratch;******…D4�=�start_of_part_ptr;:***ŠPoints�to�the�start�of�the�"current"�m emory�partition.******…D5�=�end_of_part_ptr;8***ŠPoints�to�the�end�of�the�"current"�memory�partition.******…D6�=�bytes_cleared;>***ŠContains�a�count�of�the�number�of�the�bytes�cleared�in�the?***Š"current"�memory�partition.‚When�we�find�a�"hole"�in�memory@***Š(take�a�bus_error),�then�we�stop�incrementing�bytes_cleared.C***ŠThus�bytes_cleared�will�contain�a�count�of�the�number�of�"good"?***Šbytes�in�the�current�block�of�the�current�memory�partition.D***ŠThis�value�will�be�used�to�describe�the�ammount�of�"free"�memory***Šin�the�current�block.******…D7�=�fml_header_len;C***ŠContains�a�count�of�the�number�of�256�byte�blocks�neccessary�toA***Šdescribe�the�"current"�FML_HEADER.‚This�value�is�usually�one.@***ŠIt�was�made�into�a�variable�in�order�to�accommodate�the�caseA***Šwhere�the�FML_HEADER�(26�bytes)�and�the�dest_memtbl�("n"�*�10>***Šbytes)�required�more�than�one�256�byte�block.‚This�added�a<***Šcertain�ammount�of�complexity�to�the�algorityhms,�but�itA***Šremoved�the�rather�arbitrary�restriction�that�the�dest_memtblB***Šmust�be�limited�to�(256�-�26)�/�10�or�23�entries.‚(Dest_memtbl2***Šcould�only�describe�23�RAM�or�ROM�partitions.)***L****************************************************************************'ŠTTL„INIT�MEMORY�PARTITIONS�-�ALGORITHMŠPAGE#*init_memory_partitions: procedure;    *ˆcall�init_pointers;*ˆcall�build_fml;*ˆif�(first_node_ptr�=�0)*ˆthen�call�KILLER;*ˆcall�build_fml_header;*ˆif�(fml_header_ptr�=�0)*ˆthen�call�KILLER;;*ˆdest_memtbl_ptr�<==�fml_header_ptr�+�length�(fml_header);&*ˆSYSPAR�(MAPBEG)�<==�dest_memtbl_ptr;*ˆcall�build_ram_memtbl_entry;*ˆcall�init_next_partitions;  *end init_memory_partitions;ŠPAGE"ŠTTL„INIT�MEMORY�PARTITIONS�-�CODE*#*init_memory_partitions: procedure;*IMEM:**ˆcall�init_pointers;*ˆcall�build_fml;*ˆif�(first_node_ptr�=�0)*ˆthen�call�KILLER;* ŠBSR.S‚IPTRS ŠBSR„BFML ŠIF.LƒA3��D0�THEN.S$�KILL.EXECT0ƒBESTIMEMSA,NOMEM_MEMTBLŠENDI **ˆcall�build_fml_header;*ˆif�(fml_header_ptr�=�0)*ˆthen�call�KILLER;;*ˆdest_memtbl_ptr�<==�fml_header_ptr�+�length�(fml_header);&*ˆSYSPAR�(MAPBEG)�<==�dest_memtbl_ptr;* ŠBSR„BFMLHEAD ŠIF.LƒA5��D0�THEN.S(�KILL.EXECT0ƒBESTIMEMSA,NOMEM_FML_HEADERŠENDI ŠLEA„FMLHDSZ(A5),A1 ŠMOVE.L�A1,MAPBEG **ˆcall�build_ram_memtbl_entry;*ˆcall�init_next_partitions;* ŠBSR„BRAMNODE ŠBSR„INEXTMEM‰PAGE *E*‚For�safety,�grab�the�memory�SYSINIT�resides�in�so�we�can't�allocateD*‚it�to�someone�who�might�write�over�it.‚Only�do�it�when�RMS�resides*‚in�RAM�partition�zero.* ‰CLR.LƒD1,‰LEA…MEMTABL(PC),A0’Memory�table�in�INITDAT.-‰MOVE.L‚MAPENDA(A0),D0’End�of�partition�zero. I*‚If�the�exec�is�within�partition�zero,�and�its�a�RAM�system,�then....... 7‰IF.L„EEND(PC)��D0�AND.L�TCBHEAD(PC)��D1�THEN.S 8ŠLEA„255+START(PC),A1ƒStart�of�Init�(from�INITDAT)�+�255 ŠMOVE.L�A1,D0ŠCLR.B‚D0‘Form�"ceiling"1ŠMOVE.L�D0,A1ŽA1�<--�start�of�memory�to�allocate. ?ŠLEA„255+ENDMEMT(PC),A0�End�of�src�memtabl�(from�INITDAT)�+�255 ŠMOVE.L�A0,D0ŠCLR.B‚D0‘Form�"ceiling"&ŠSUB.L‚A1,D0ŽCalculate�length�in�bytes+ŠLSR.L‚#8,D0ŽD1�<--�page-count�to�allocate.*ŠBSETƒ#24,D0�Set�"physical�address"�option,ŠMOVE.L�D0,A0ŽA0�<--�page-count�to�allocate. "ŠMOVEQ.L�#T0PAGAL,D0‡Call�pagealocŠTRAPƒ#0ŠBRA.S‚INITDONE‹Good�return.&ŠKILL.EXECT0�BESTIMEMSA,PA_SINT_FAILEDINITDONE ‰ENDI "‰RTS›Go�to�free�memory,�then�exec. **end init_memory_partitions;*"ŠTTL„INIT�POINTERS�-�DOCUMENTATIONŠPAGEN********************************************************************************* ***…Name:‚IPTRS�(init_pointers):*** ***…Function:A***ŠInitializes�all�pointers�and�counters�for�initializing�memory***„partition�zero.*** ***…Inputs:1***ˆ1.)‚Src_memtbl�in�INITDAT�at�address�MEMTABL.*** ***…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;******…Side�effects:****ˆ1.)‚A2�(temp_memtbl_ptr)�is�destroyed.$***ˆ2.)‚D1�(scratch)�gets�destroyed.)***ˆ3.)‚Might�never�return�(call�KILLER).******…Explanation:***?***ŠFirst�we�initialize�D0�and�the�src_memtbl_ptr.‚If�the�firstI***…entry�in�the�src_memtbl�is�not�a�RAM�partition�whose�partition�number<***…is�zero,�then�we�cannot�continue,�and�so�we�call�KILLER.***E***ŠNext�we�initialize�fml_header_len�to�equal�the�number�of�256�byteG***…blocks�neccessary�to�contain�the�FML_HEADER�for�partition�zero,�andB***…one�entry�in�the�dest_memtbl�for�every�entry�in�the�src_memtbl9***…(including�the�last�entry�delimiting�the�src_memtbl).***D***ŠNow�we�initialize�the�end_of_part_ptr�to�point�to�the�"floor"�ofB***…the�MAPENDA�field�of�the�first�entry�in�the�src_memtbl.‚(Note:H***…throughout�these�algorithms�we�will�always�take�the�"ceiling"�of�theH***…start�of�the�partition,�and�the�"floor"�of�the�end�of�the�partition.K***…This�insures�that�all�partitions�start�and�end�on�a�256�byte�block,�andG***…also�that�we�only�grab�the�same�ammount�of�memory,�or�less,�that�is%***…described�within�the�src_memtbl.)***E***ŠNow,�if�the�exec�is�in�partition�zero,�then�the�start_of_part_ptrD***…points�to�the�next�256�byte�block�after�the�end�of�the�exec,�theJ***…clear_mem_ptr�points�to�the�next�256�byte�block�after�the�start�of�theH***…INIT�module,�and�bytes_cleared�gets�set�to�the�displacement�from�theI***…start�of�the�INIT�module�to�the�end�of�the�INITDAT�data�area�(also�onH***…a�256�byte�boundary).‚The�clear_mem_ptr�and�bytes_cleared�are�set�upF***…in�this�way�in�order�to�tell�the�build_fml�subroutine�that�we�haveG***…started�clearing�memory�at�the�location�pointed�to�by�clear_mem_ptr@***…and�we�have�already�cleared�bytes_cleared�locations.‚This�isI***…neccessary�because�we�wish�to�reclaim�the�memory�occupied�by�the�INITD***…module�as�free�memory�in�partition�zero,�but�we�obviously�cannotG***…clear�it�out�at�this�point�in�time.‚Thus�we�must�fake�out�build_fmlB***…into�thinking�that�we�have�already�cleared�the�INIT�portion�ofI***…partition�zero.‚Finally,�if�TCBHEAD�=�0,�(we�have�mini�TCBs�followingI***…the�src_memtbl),�then�we�increment�bytes_cleared�by�about�15�mini-TCB;***…lengths�to�insure�that�we�don't�zero�out�the�mini�TCBs.***D***ŠIf�the�exec�is�not�in�partition�zero,�then�we�set�both�start_of_G***…part_ptr�and�clear_mem_ptr�to�point�to�the�next�256�byte�page�after8***…the�SYSPAR�data�area,�and�set�bytes_cleared�to�zero.***B***ŠFinally,�if�the�start_of_part_ptr�and�end_of_part_ptr�describeF***…a�partition�that�does�not�contain�some�positive�ammount�of�memory,=***…then�we�obviously�cannot�continue,�and�so�we�call�KILLER.***L**************************************************************************** ŠTTL„INIT�POINTERS�-�ALGORITHMŠPAGE*init_pointers: procedure;   *ˆDO�<==�0;.*ˆsrc_memtbl_ptr�<==�addr�(INITDAT�(MEMTABL));0*ˆif�(MAPMTYP.MAPPART�(src_memtbl_ptr)�<>�$0000)*ˆthen�call�KILLER; *ˆfml_header_len�<==�0;%*ˆtemp_memtbl_ptr�<==�src_memtbl_ptr;7*ˆdo�until�(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�(exec�is�in�partition�xero)�then�do;.*’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)=*’then�bytes_cleared�<==�ceil(bytes_cleared+15*length(MTCBs))*ˆend; *ˆelse�do;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)*ˆthen�call�KILLER;  *end init_pointers; ŠTTL„INIT�POINTERS�-�CODEŠPAGE**init_pointers: procedure;* IPTRS:* *ˆD0�<==�0;.*ˆsrc_memtbl_ptr�<==�addr�(INITDAT�(MEMTABL));,*ˆif�(MAPMTYP.MAPPART�(src_memtbl_ptr)�<>�0)*ˆthen�call�KILLER;* ŠCLR.L‚D0 ŠLEA„MEMTABL(PC),A0 ŠIF.Wƒ(A0)�‹D0�THEN.S"�KILL.EXECT0ƒBESTIMEMSA,PT_1ST_BADŠENDI **ˆfml_header_len�<==�0;%*ˆtemp_memtbl_ptr�<==�src_memtbl_ptr;7*ˆdo�until�(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 ŠREPEAT�ADD.L‚#MAPENTSZ,D7�LEA„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.L�MAPENDA(A0),D5 ŠCLR.B‚D5 *)*ˆif�(exec�is�in�partition�zero�then�do);.*’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)>*’then�bytes_cleared�<==�ceil(bytes_cleared�+�15*length(MTCBs)*ˆend;**ŠMOVE.L�EEND(PC),D4ˆD4�<==�INITDAT�(EEND).8ŠIF.LƒD4�ˆD5�THEN.S†If�(exec_end�<�end_of_part_ptr),!*§Then�exec�is�in�partition�zero;�ADD.L‚#255,D4 �CLR.B‚D4 �LEA„255+START(PC),A5 �MOVE.L�A5,D1 �CLR.B‚D1 �MOVE.L�D1,A5 �LEA„255+ENDMEMT(PC),A6 �MOVE.L�A6,D6 �CLR.B‚D6 �SUB.L‚A5,D6 �IF.LƒTCBHEAD(PC)�„D0�THEN.SN*-------------------------------------------------------------------- 08/20/85**ŽADD.L‚#$800,D6�ADD.L‚#(15*MTCBLN)+255,D6 �CLR.B‚D6N*-----------------------------------------------------------------------------�ENDI * *ˆelse�do;7*’start_of_part_ptr�<==�ceil�(addr�(SYSPAR�(ENDSYSP)));&*’clear_mem_ptr�<==�start_of_part_ptr;*’bytes_cleared�<==�0;*ˆend;*�ELSE.S�MOVE.L�#ENDSYSP+255,D4 �CLR.B‚D4 �MOVE.L�D4,A5 �CLR.L‚D6ŠENDI *+*ˆif�(start_of_part_ptr�>=�end_of_part_ptr)*ˆthen�call�KILLER;*ŠIF.LƒD4��D5�THEN.S#�KILL.EXECT0‚BESTIMEMSA,PT_PTRS_BADŠENDI **end init_pointers;*ŠRTS )ŠTTL„INIT_NEXT_PARTITIONS�-�DOCUMENTATIONŠPAGEN*************************************************************************************…Name:‚INEXTMEM�(init_next_partitions):*** ***…Function:=***ŠInitializes�all�partitions�except�partition�zero.‚For�ROMH***„partitions,�we�make�an�entry�in�the�dest_memtbl.‚For�RAM�partitions,A***„we�insure�that�no�conflict�exists�with�a�previously-describedH***„partition,�build�the�FML,�build�the�FML_HEADER,�and�make�an�entry�in***„the�dest_memtbl.*** ***…Inputs:***ˆ1.)‚A0�=�src_memtbl_ptr;2***�(Points�to�the�first�entry�in�the�src_memtbl.)***ˆ2.)‚A1�=�dest_memtbl_ptr;3***�(Points�to�the�first�entry�in�the�dest_memtbl.)*** ***…Outputs:***ˆ1.)‚Dest_memtbl.#***ˆ2.)‚FML�for�all�RAM�partitions.+***ˆ3.)‚FML_HEADERs�for�all�RAM�partitions.******…Side�effects:B***ˆ1.)‚Most�registers�are�destroyed,�except�for�the�stack�pointer ***�(A7).******…Explanation:D***ŠWe�keep�looping�until�the�MAPMTYP�and�MAPPART�fields�of�the�nextH***…entry�in�the�src_memtbl�both�contain�$FF.‚(This�indicates�the�end�ofH***…the�memtbl.)‚When�we�see�the�end�of�the�src_memtbl,�then�we�write�an.***…end�entry�for�the�dest_memtbl,�and�return.***E***ŠFor�every�good�entry�in�the�src_memtbl�we�call�init_next_pointersG***…to�set�up�our�pointers�and�counters�for�this�memory�partition.‚ThenE***…if�the�MAPMTYP�field�of�the�src_memtbl�entry�=�$FF,�we�have�a�ROM4***…partition�and�so�we�call�build_rom_memtbl_entry.***8***ŠFor�every�RAM�entry�in�the�src_memtbl,�we�first�callG***…check_memmap_con flict�to�insure�that�the�current�RAM�partition�doesH***…not�conflict�in�any�way�with�a�previously-described�partition.‚ThereG***…are�three�possible�return�conditions�from�the�check_memmap_conflict***…subroutine:'***Š1.)‚A�fatal�conflict�was�detected�-;***�Execution�will�never�return�(check_memmap_conflict�will***�call�KILLER).@***Š2.)‚This�partition�is�an�alias�of�a�previous�partition�(both+***�partitions�start�at�the�same�address)�-;***�Execution�will�return,�and�the�got_alias_partition_flag***�will�be�set.+***Š3.)‚This�partition�is�a�new�partition�-;***�Execution�will�return,�and�the�got_alias_partition_flag***�will�be�reset.H***…Therefore,�if�execution�returns,�and�the�got_alias_partition_flag�is@***…set,�we�call�build_ram_memmap_entry�to�build�an�entry�in�the(***…dest_memtbl�for�the�alias�partition.***C***ŠIf�execution�returns�and�the�got_alias_partition_flag�is�reset,H***…then�we�call�build_fml�to�build�the�free�memory�list�for�the�new�RAMB***…partition.‚Then�if�the�previous_node_ptr�is�not�equal�to�zero,C***…build_fml�found�at�least�one�256�byte�page�of�memory�in�the�newI***…partition�and�so�we�call�build_fml_header�to�build�the�FML_HEADER�forA***…the�new�partition.‚Now,�since�this�is�not�partition�zero,�andH***…therefore�all�FML_HEADERs�require�only�one�256�byte�block�of�memory,A***…we�know�that�build_fml_header�successfully�found�room�for�theD***…FML_HEADER�and�so�we�can�call�build_ram_memtbl_entry�to�build�an7***…entry�for�the�current�partition�in�the�dest_memtbl.***=***ŠIf�the�previous_node_ptr�is�equal�to�zero,�then�build_fmlE***…did�not�find�even�one�256�byte�page�within�the�current�partition.=***…In�this�case�we�reset�the�dest_memtbl_ptr�to�point�to�theE***…previous�entry�within�the�dest_memtbl�(decrement�it�by�the�lengthC***…of�one�entry).‚This�has�the�effect�of�ignoring�the�current�null***…partition.***N****************************************************************************** %ŠTTL„INIT�NEXT�PARTITIONS�-�ALGORITHMŠPAGE!*init_next_partitions: procedure;    >*ˆdo�while�(MAPMTYP.MAPPART�(next�(src_memtbl_ptr))�<>�$FFFF);*’call�init_next_pointers;%*’if�(MAPMTYP�(src_memtbl_ptr)�=�$FF)#*’then�call�build_rom_memtbl_entry; *’else�do;*œcall�check_memmap_conflict;%*œif�(got_alias_partition_flag�=�set)#*œthen�call�build_ram_memmap_entry; *œelse�do;*¦call�build_fml;*¦if�(previous_node_ptr�=�0)*¦then�dest_memtbl_ptr�<==*«dest_memtbl_ptr�-*«length�(dest_memtbl_entry); *¦else�do;*°call�build_fml_header;*°call�build_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;4*ˆMAPTYP.MAPPART�(next�(dest_memtbl_ptr))�<==�$FFFF;  *end init_next_partitions; 'ŠTTL„INIT�NEXT�MEMORY�PARTITIONS�-�CODEŠPAGE*!*init_next_partitions: procedure;* INEXTMEM:*>*ˆdo�while�(MAPMTYP.MAPPART�(next�(src_memtbl_ptr))�<>�$FFFF);*’call�init_next_pointers;%*’if�(MAPMTYP�(src_memtbl_ptr)�=�$FF)#*’then�call�build_rom_memtbl_entry;* ŠWHILE.W�12(A0)��#$FFFF�DO.S �BSR.S‚INEXTPTRS �IF.Bƒ(A0)��#$FF�THEN.S �BSR„BROMNODE * *’else�do;*œcall�check_memmap_conflict;%*œif�(got_alias_partition_flag�=�set)#*œthen�call�build_ram_memtbl_entry;*�ELSE.S �BSR„CMEMCONF �TST.B‚D2�IF…�THEN.Sˆ “BSR„BRAMNODE * *›else�do;*¦call�build_fml;*¦if�(previous_node_ptr�<>�0)*¦then�dest_memtbl_ptr�<==*«dest_memtbl_ptr�-*«length�(dest_memtbl_entry); *¦else�do;*°call�build_fml_header;*°call�build_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;*“ELSE.S “BSR.S‚BFML “IF.LƒA2��D0�THEN.S“LEA„-MAPENTSZ(A1),A1“ELSE.S –BSR„BFMLHEAD –BSR„BRAMNODE“ENDI�ENDI�ENDIŠENDW *5*ˆMAPMTYP.MAPPART�(next�(dest_memtbl_ptr))�<==�$FFFF;*#ŠMOVE.W�#$FFFF,MAPMTYP+MAPENTSZ(A1) **end init_next_partitions;*ŠRTS 'ŠTTL„INIT�NEXT�POINTERS�-�DOCUMENTATIONŠPAGEM********************************************************************************)** *…Name:‚INEXTPTRS�(init_next_pointers):*** ***…Function:C***ŠInitializes�all�pointers�and�counters�for�all�memory�partitions***…except�partition�zero.*** ***…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.******…Side�effects:1***ˆ1.)‚Execution�might�not�return�(call�KILLER).******…Explanation:@***ŠFirst�we�set�the�fml_header_len�to�one�(any�partition�exceptG***…partition�zero�requires�only�one�256�byte�page�for�its�FML_HEADER),@***…and�advance�both�the�src_memtbl_ptr�and�the�dest_memtbl_ptr.***C***ŠNext�we�set�the�start_of_part_ptr�to�the�ceiling�of�the�MAPSTRAH***…field�in�the�src_memtbl,�and�the�end_of_part_ptr�to�the�floor�of�theH***…MAPENDA�field.‚(Note�that�we�always�align�our�partitions�on�256�byteI***…page�boundaries,�and�that�we�always�round�to�the�same�ammount�or�less+***…memory�as�described�in�the�src_memtbl).***D***ŠWe�then�set�clear_mem_ptr�to�the�value�of�start_of_part_ptr,�andE***…set�bytes_cleared�to�zero.‚(Thus�we�will�start�clearing�memory�atG***…the�start�of�the�current�partition.)‚Finally,�we�call�KILLER�if�theG***…current�partition�described�by�the�src_memtbl�does�not�contain�some'***…positive�number�of�pages�of�memory.***L**************************************************************************** #ŠTTL„INIT�NEXT�POINTERS�-�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)*ˆthen�call�KILLER;  *end init_next_pointers; ŠTTL„INIT�NEXT�POINTERS�-�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.L�MAPSTRA(A0),D4ŠADD.L‚#255,D4 ŠCLR.B‚D4 ŠMOVE.L�MAPENDA(A0),D5 ŠCLR.B‚D5 ŠMOVE.L�D4,A5 ŠCLR.L‚D6 M* See if the exec is in this partition (start_of_p < end of exec =< end_of_p) =‰IF.W�(A0)��#$FF00�THEN.S‚If�this�is�NOT�a�ROM�partition, 4‰IF.L�EEND(PC)��D4�AND.L�EEND(PC)��D5�THEN.S6ŠMOVE.L�EEND(PC),D4‹Start�of�partition�is�end�of�exec.;ŠLEA„255+ENDMEMT(PC),A5„End�of�initdat�(from�INITDAT)�+�255!ŠMOVE.L�A5,D6‘D6�=�end�of�initdatŠCLR.B‚D6”Form�"ceiling".*ŠMOVE.L�D6,A5‘A5�<--�clear_memory_pointer. ŠCLR.L‚D6‰ENDI ‰ENDI  *+*ˆif�(start_of_part_ptr�>=�end_of_part_ptr)*ˆthen�call�KILLER;*ŠIF.LƒD4��D5�THEN.S#�KILL.EXECT0ƒBESTIMEMSA,PT_PTRS_BADŠENDI **end init_next_pointers;*ŠRTS ŠPAGEŠTTL„BUILDŽFML�-�DOCUMENTATIONL**********************************************************************************…Name:‚BFML�(build_fml):*** ***…Function:>***ŠBuild_fml�will�zero�out�memory�starting�at�clear_mem_ptr�+A***…bytes_cleared,�and�build�the�free�memory�list�to�describe�theF***…partition.‚It�also�detects�"holes"�in�the�partition,�and�describes3***…them�as�"used"�memory�within�the�current�block.*** ***…Inputs:***ˆ1.)‚A5�=�clear_mem_ptr.***ˆ2.)‚D4�=�end_of_part_ptr.***ˆ3.)‚D6�=�bytes_cleared.*** ***…Outp uts:=***ˆ1.)‚A3�=�first_node_ptr�(from�subroutine�build_fml_node).***ˆ2.)‚A4�=�last_node_ptr."***ˆ3.)‚FML�for�current�partition.******…Side�effects:,***ˆ1.)‚A2�(previous_node_ptr)�is�destroyed.2***ˆ2.)‚A5�(clear_mem_ptr)�=�D5�(end_of_part_ptr)./***ˆ3.)‚D1,�D2,�and�D3�(scratch)�are�destroyed.(***ˆ4.)‚D6�(bytes_cleared)�is�destroyed.-***ˆ5.)‚Might�not�return�(might�call�KILLER).******…Explanation:B***ŠFirst�we�initialize�the�first_node_ptr�to�zero.‚This�tells�theH***…build_fml_node�subroutine�that�we�are�working�with�the�first�node�in ***…the�FML.***C**ŠNote�that�the�clear_next_node�and�build_last_fml_node�labels�canI***…both�be�jumped�to�by�the�code�for�handling�bus�errors�(build_fml_be).***B***ŠAt�clear_next_node�we�update�last_node_ptr�to�the�value�of�theC***…clear_mem_ptr.‚(Last_node_ptr�is�an�input�to�the�build_fml_nodeG***…subroutine�telling�him�where�the�"last"�or�current�node�is�located,H***…and�is�also�an�output�from�this�routine�telling�the�caller�where�theH***…last�node�in�the�FML�is�located.)‚We�also�increment�clear_mem_ptr�byE***…the�value�of�bytes_cleared.‚(This�is�neccessary�in�order�to�"skipD***…over"�and�not�initialize�the�INIT�code�when�building�the�FML�for***…partition�zero.***B***ŠNext�we�set�up�the�stack�so�that�any�bus�error�will�send�us�toI***…build_fml_be.‚This�is�the�code�that�will�be�used�for�mapping�over�any$***…"holes"�in�the�memory�partition.***D***ŠNow�we�loop�until�we�either�clear�the�rest�of�the�current�memoryF***…partition�(fall�through�the�loop),�or�find�a�hole�in�memory�(go�to***…build_fml_be).***D***ŠIf�we�do�clear�memory�to�the�end�of�the�current�partition�withinG***…this�loop,�we�must�pop�the�bus�error�vector�junk�off�the�stack,�andI***…calculate�the�value�of�bytes_cleared�(clear_mem_ptr�-�last_node_ptr).F***…This�calculation�is�neccessary�at�this�point�in�order�to�make�thisE***…case�(found�a�block�of�all�good�memory)�look�the�same�as�the�caseE***…where�we�found�some�good�memory�and�then�found�a�"hole"�in�memoryF***…(took�a�bus�error,�and�went�to�build_fml_be).‚In�that�case�we�willH***…"freeze"�bytes_cleared�to�the�value�of�clear_mem_ptr�-�last_node_ptrH***…in�order�to�remember�the�number�of�"good"�bytes�of�memory�within�theI***…current�block,�and�increment�clear_mem_ptr�(by�pages)�until�we�eitherG***…reach�the�end�of�the�partition,�or�we�find�some�more�"good"�memory.I***…Thus�at�that�point�our�current�block�will�be�framed�by�the�last_node_E***…ptr�(points�to�the�start�of�the�current�block),�the�clear_mem_ptrJ***…(point�to�the�end�of�the�current�block),�and�the�bytes_cleared�counterG***…which�holds�the�number�of�"good"�bytes�in�the�current�block�(or�theD***…number�of�bytes�of�free�memory).‚This�is�most�of�the�information&***…needed�to�build�a�node�in�the�FML.***C***ŠFinally,�the�build_last_fml_node�label�will�build�a�node�in�the;***…FML�if�the�value�of�bytes_cleared�is�greater�than�zero.***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;*ˆpush�addr�(build_fml_be); *ˆpush�'BE';-*ˆdo�until�(clear_mem_ptr�=�end_of_part_ptr);'*’four_longwords�(clear_mem_ptr)�<==�0;'*’clear_mem_ptr�<==�clear_mem_ptr�+�16;*ˆend;*ˆpop�bus_error�junk�off�stack;2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr; *build_last_fml_node:*ˆif�(bytes_cleared�>�0)*ˆthen�call�build_fml_entry;  *end build_fml; "ŠTTL„BUILDŽFREE�MEMORY�LIST�-�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;*ˆpush�addr�(build_fml_be); *ˆpush�'BE';* CNEXTNODE: ŠCLR.L‚D1 ŠCLR.L‚D2 ŠCLR.L‚D3 ŠLEA„(A5),A4 ŠLEA„(A5,D 6.L),A5 ŠPEA„BFMLBE(PC) ŠMOVE.W�#'BE',-(A7) *-*ˆdo�until�(clear_mem_ptr�=�end_of_part_ptr);'*’four_longwords�(clear_mem_ptr)�<==�0;'*’clear_mem_ptr�<==�clear_mem_ptr�+�16;*ˆend;*ŠREPEAT�MOVEM.L�D0-D3,(A5)/�NOP”This�NOP�forces�the�execution�unit�to�wait)*§until�the�bus�interface�unit�is�done�on&*§a�68020,�in�case�we�get�a�bus�error.�LEA„16(A5),A5ŠUNTIL.L�A5��D5**ˆpop�bus_error�junk�off�stack;2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;* ŠADD.L‚#6,A7 ŠMOVE.L�A5,D6 ŠSUB.L‚A4,D6 **build_last_fml_node:*ˆif�(bytes_cleared�>�0)*ˆthen�call�build_fml_entry;* BLASTNODE:ŠIF.LƒD6��D0�THEN.S�BSR.S‚BFMLNODEŠENDI **end build_fml;*ŠRTS 4ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�DOCUMENTATIONŠPAGEN************************************************************************************…Explanation:?***ŠThis�code�is�executed�if�we�encounter�a�hole�while�clearing@***…memory.‚Note�the�two�labels�build_fml_be�and�build_fml_be_x.G***…Execution�will�"go�to"�the�build_fml_be�label�if�a�bus�error�occursB***…when�clearing�memory�via�the�loop�in�the�build_fml�subroutine.F***…Likewise,�execution�will�"go�to"�the�build_fml_be_x�label�if�a�busH***…error�occurs�while�looking�at�the�top�of�each�page�of�memory�for�theF***…next�"good"�page.‚(i.e.,�This�block�of�code�contains�a�"bus�error"G***…loop.‚We�keep�going�to�build_fml_be_x�until�we�either�reach�the�end:***…of�the�current�partition,�or�find�some�"good"�memory.)***A***ŠFirst�we�calculate�bytes_cleared�to�be�the�difference�betweenG***…the�clear_mem_ptr�and�the�last_node_ptr.‚Then�we�call�KILLER�if�theJ***…bus�error�occurred�in�the�middle�of�a�page.‚(Bytes_cleared�is�not�on�a***…page�boundary.)***E***ŠOtherwise,�we�update�the�clear_mem_ptr�to�point�to�the�top�of�theG***…next�page�in�memory.‚If�we�are�at�the�end�of�the�current�partition,@***…then�we�go�to�the�build_last_fml_node�label�in�the�build_fml***…subroutine.***B***ŠIf�we�are�not�at�the�end�of�the�partition,�we�set�the�stack�upF***…so�that�a�bus�error�will�send�us�back�to�the�build_fml_be_x�label.G***…Then�we�attempt�to�write�into�the�memory�location�pointed�to�by�theF***…clear_mem_ptr.‚(If�a�bus�error�occurs,�then�execution�will�"go�to"I***…build_fml_be_x,�and�we�will�"loop"�until�we�run�out�of�memory�in�this+***…partition,�or�find�some�"good"�memory.)***D***ŠIf�we�"fall�through"�to�the�next�instruction�(find�a�good�memoryI***…location),�then�we�get�rid�of�the�bus�error�information�on�the�stack.J***…If�we�found�some�good�memory�in�the�current�block�(bytes_cleared�>�0),E***…then�we�call�build_fml_node�to�build�a�node�in�the�FML,�and�resetI***…bytes_cleared�to�zero.‚In�either�case�we�go�to�clear_next_node�in�the***…build_fml�subroutine.***N****************************************************************************** 0ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�ALGORITHMŠPAGE*build_fml_be:2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;$*ˆif�(mod�(bytes_cleared,�256)�<>�0)*ˆthen�call�KILLER; *build_fml_be_x:(*ˆclear_mem_ptr�<==�clear_mem_ptr�+�256;&*ˆif�(clear_mem_ptr�=�end_of_part_ptr)!*ˆthen�go�to�build_last_fml_node;*ˆpush�addr�(build_fml_be_x); *ˆpush�'BE';*ˆword�(clear_mem_ptr)�<==�0;*ˆpop�bus_error�junk�off�stack;!*ˆif�(bytes_cleared�>�0)�then�do;*’call�build_fml_node;*’bytes_cleared�<==�0;*ˆend;*ˆgo�to�clear_next_node;  *end build_fml_be; +ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�CODEŠPAGE**build_fml_be:*BFMLBE: *2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;$*ˆif�(mod�(bytes_cleared,�256)�<>�0)*ˆthen�call�KILLER;* ŠMOVE.L�A5,D6 ŠSUB.L‚A4,D6 ŠIF.BƒD6��D0�THEN.S"�KILL.EXECT0ƒBESTIMEMSA,BAD_MEMORYŠENDI **build_fml_be_x:*BFMLBEX: *(*ˆclear_mem_ptr�<==�clear_mem_ptr�+�256;&*ˆif�(clear_mem_ptr�=�end_of_part_ptr)!*ˆthen�go�to�build_last_fml_node;*ŠLEA„256(A5),A5  ŠIF.LƒA5��D5�THEN.S�BRA„BLASTNODEŠENDI**ˆpush�addr�(build_fml_be_x); *ˆpush�'BE';*ˆword�(clear_mem_ptr)�<==�0;*ŠPEA„BFMLBEX(PC)ŠMOVE.W�#'BE',-(A7) ŠMOVE.W�D0,(A5)/ŠNOP—This�NOP�forces�the�execution�unit�to�wait)*§until�the�bus�interface�unit�is�done�on&*§a�68020,�in�case�we�get�a�bus�error. **ˆpop�bus_error�junk�off�stack;!*ˆif�(bytes_cleared�>�0)�then�do;*’call�build_fml_node;*’bytes_cleared�<==�0;*ˆend;*ˆgo�to�clear_next_node;* ŠADD.L‚#6,A7 ŠIF.LƒD6��D0�THEN.S�BSR.S‚BFMLNODE �CLR.L‚D6ŠENDI  ŠBRA„CNEXTNODE #ŠTTL„BUILDŽFML�NODE�-�DOCUMENTATIONŠPAGEL*******************************************************************************$***…Name:‚BFMLNODE�(build_fml_node):*** ***…Function:E***ŠBuilds�a�node�in�the�free�memory�list�(fills�in�the�fmlfp,�fmlbp,E***…fmlfree,�and�fmlused�fields),�and�links�this�node�to�any�previous***…nodes�in�the�FML.*** ***…Inputs:***ˆ1.)‚A2�=�previous_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�clear_mem_ptr.***ˆ4.)‚D6�=�bytes_cleared.*** ***…Outputs:8***ˆ1.)‚FML�node�(pointed�to�by�previous�last_node_ptr).D***ˆ2.)‚Fmlfp�of�previous�node�in�FML�(if�this�is�not�the�first�node***�in�the�FML).C***ˆ3.)‚A3�=�first_node_ptr�(if�this�is�the�first�node�in�the�FML).***ˆ4.)‚A4�=�previous_node_ptr.******…Side�effects:"***ˆ1.)‚D1�(scratch)�is�destroyed.******…Explanation:B***ŠFirst�we�set�up�the�fmlfp�and�fmlbp�links�in�the�current�node.E***…Next�we�set�up�fmlused�to�contain�the�number�of�pages�between�theA***…last_node_ptr�and�the�clear_mem_ptr�minus�the�number�of�pagesE***…described�by�the�bytes_cleared�counter.‚Then�we�set�fmlfree�equalG***…to�the�number�of�pages�described�by�the�bytes_cleared�counter.‚ThusJ***…the�sum�of�fmlused�and�fmlfree�is�equal�to�the�number�of�pages�between-***…the�last_node_ptr,�and�the�clear_mem_ptr.***E***ŠNow,�if�this�is�the�first�node�in�the�FML�(previous_node_ptr�=�0)K***…then�set�first_node_ptr�equal�to�last_node_ptr�and�thus�"remember"�thatG***…this�is�the�first�node.‚Otherwise,�update�the�fmlfp�of�the�previousF***…node�to�point�to�this�node.‚Finally�set�previous_node_ptr�equal�to>***…last_node_ptr�(and�thus�"remember"�this�node),�and�return.***M***************************************************************************** ŠTTL„BUILDŽFML�NODE�-�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)(*ˆthen�first_node_ptr�<==�last_node_ptr;3*ˆelse�fmlfp�(previous_node_ptr)�<==�last_node_ptr;&*ˆprevious_node_ptr�<==�last_node_ptr;  *end build_fml_node; ŠTTL„BUILDŽFML�NODE�-�CODEŠPAGE**build_fml_node:* BFMLNODE: **ˆfmlfp�(last_node_ptr)�<==�0;.*ˆfmlbp�(last_node_ptr)�<==�previous_node_ptr;*ŠCLR.L‚FMLFP(A4)ŠMOVE.L�A2,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.L�A5,D1 ŠSUB.L‚A4,D1 ŠSUB.L‚D6,D1 ŠLSR.L‚#8,D1ŠMOVE.L�D1,FMLUSED(A4) ŠMOVE.L�D6,D1 ŠLSR.L‚#8,D1ŠMOVE.L�D1,FMLFREE(A4) *ˆif�(previous_node_ptr�=�0)(*ˆthen�first_node_ptr�<==�last_node_ptr;3*ˆelse�fmlfp�(previous_node_ptr)�<==�last_node_ptr;*ŠIF.LƒA2��D0�THEN.S �LEA„(A4),A3 �ELSE.S�MOVE.L�A4,FMLFP(A2)ŠENDI *&*ˆprevious_node_ptr�<==�last_node_ptr;* ŠLEA„(A4),A2 **end build_fml_node;*ŠRTS %ŠTTL„BUILDŽFML�HEADER�-�DOCUMENTATIONŠPAGEM********************************************************************************&***…Name:‚BFMLHEAD‚(build_fml_header):*** ***…Function:E***ŠFinds�a�block�of�memory�to�contain�the�FML_HEADER�node�(in�eitherF***…high�or�low�memory),�and�builds� an�FML_HEADER�node�to�describe�the***…current�partition.*** ***…Inputs:D***ˆ1.)‚Src_memtbl_node�(tells�whether�the�FML_HEADER�belongs�in�low***�high�memory).***ˆ2.)‚A0�=�src_memtbl_ptr.***ˆ3.)‚D4�=�start_of_part_ptr.***ˆ4.)‚D5�=�end_of_part_ptr.*** ***…Outputs:9***ˆ1.)‚FML_HEADER�node�describing�the�current�partition.E***ˆ2.)‚Fml_header_ptr�(If�the�fml_header_ptr�=�0�upon�returning�from<***�this�routine,�then�we�couldn't�find�enough�memory�in�theA***�current�partition�for�the�FML_HEADER.‚This�is�meaningful�only***�for�partition�zero.)******…Side�effects:‚None.******…Explanation:D***ŠFirst�we�determine�whether�the�FML_HEADER�belongs�in�low�or�highB***…memory�and�call�the�appropriate�subroutine�to�return�to�us�theI***…corresponding�pointer.‚If�the�subroutine�returned�a�non-zero�pointer,G***…then�it�found�enough�memory�in�the�current�partition�to�contain�theF***…FML_HEADER�(it�found�at�least�fml_header_len�pages),�and�so�we�may%***…continue�to�build�the�FML_HEADER.***?***ŠWe�set�lowfree,�stravail,�and�endavail�to�the�values�of�theH***…first_node_ptr,�start_of_part_ptr,�and�end_of_part_ptr�respectively.E***…We�move�the�MAPMTYP�and�MAPPART�fields�from�the�src_memtbl�to�the7***…FML_HEADER�node,�and�set�up�the�semaphore�counters.***M***************************************************************************** !ŠTTL„BUILDŽFML�HEADER�-�ALGORITHMŠPAGE*build_fml_header: procedure;    '*ˆif�(fml_header�belongs�in�low�memory)#*ˆthen�call�get_fml_header_ptr_low;$*ˆelse�call�get_fml_header_ptr_high; #*ˆif�(fml_header_ptr�<>�0)�then�do;.*’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ŽFML�HEADER�-�CODEŠPAGE**build_fml_header: procedure;* BFMLHEAD: *'*ˆif�(fml_header�belongs�in�low�memory)#*ˆthen�call�get_fml_header_ptr_low;$*ˆelse�call�get_fml_header_ptr_high;*:ŠBTSTƒ#0,10(A0)ŠIf�(src_memtbl_node�(byte_10�(bit_0))�=�0)7ŠIF…�THEN.SŒthen�fml_header�belongs�in�HIGH�memory; 6�BSR.S‚GFMLPTRH‹else�fml_header�belongs�in�LOW�memory; �ELSE.S�BSR.S‚GFMLPTRLŠENDI *#*ˆif�(fml_header_ptr�<>�0)�then�do;.*’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ƒA5��D0�THEN.S�MOVE.L�A3,LOWFREE(A5)�MOVE.L�D4,STRAVAIL(A5)�MOVE.L�D5,ENDAVAIL(A5) *8*’memtype�(fml_header_ptr)�<==�mapmtyp�(src_memtbl_ptr);8*’mempart�(fml_header_ptr)�<==�mappart�(src_memtbl_ptr);*�MOVE.W�MAPMTYP(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„GET�FML�HEADER�POINTER�HIGH�-�DOCUMENTATIONŠPAGEN*********************************************************************************-***…Name:‚GFMLPTRH�(get_fml_header_ptr_high):*** ***…Function::***ŠThis�subroutine�returns�a�pointer�to�a�block�of�memoryI***…fml_header_len�pages�long�in�the�current�partition.‚This�block�is�theE***…highest�addressed�block�in�the�current�partition�that�is�at�leastI***…fml_header_len�pages�long.‚This�subroutine�handles�all�accounting�forE***…the�block�it�"steals"�from�the�partition.‚(It�either�counts�it�asE***…being�a�"used�page�in�the�current�block,�or,�if�the�current�blockH***…consists�of�only�fml_header_len�pages,�then�it�"unlinks"�the�curre ntH***…block,�and�counts�it�as�a�"used"�portion�of�the�previous�block,�if�a***…previous�block�exists.)*** ***…Inputs:***ˆ1.)‚A4�=�last_node_ptr.***ˆ2.)‚D7�=�fml_header_len.*** ***…Outputs:***ˆ1.)‚A5�=�fml_header_ptr.;***ˆ2.)‚If�we�can't�find�any�block�in�the�current�partition'***�at�least�fml_header_len�pages�long:+***�A.)‚A3�(first_node_ptr)�is�set�to�zero.****�B.)‚A4�(last_node_ptr)�is�set�to�zero.******…Side�effects:&***ˆ1.)‚D1�(scratch)�may�be�destroyed.******…Explanation:E***ŠFirst�we�set�fml_header_ptr�equal�to�the�last_node_ptr�and�searchJ***…backward�through�the�FML�until�we�find�a�block�at�least�fml_header_lenI***…pages�long.‚If�we�reach�the�beginning�of�the�FML�(fml_header_pty�=�0)H***…without�finding�a�block�of�memory�fml_header_len�pages�long,�then�weG***…zero�out�the�first�and�last_node_ptr�and�return.‚(Fml_header_ptr�is***…also�zero.)***E***ŠOtherwise,�we�check�to�see�if�the�block�is�exactly�fml_header_lenG***…pages�long.‚If�it�is,�then�we�call�unlink_fml_header_node�to�unlinkI***…the�node�from�the�FML�linked�list,�and�count�its�memory�as�being�part.***…of�the�used�portion�of�the�previous�block.***>***ŠIf�the�block�is�greater�than�fml_header_len�pages,�we�thenH***…decrement�fmlfree�and�increment�fmlused�by�fml_header_len�pages,�and@***…increment�fml_header_ptr�by�fml_header_len*256�bytes�so�thatI***…fml_header_ptr�now�points�to�the�first�"used"�page�within�the�current***…block�and�return.***N****************************************************************************** ,ŠTTL„GET�FML�HEADER�POINTER�HIGH�-�ALGORITHMŠPAGE$*get_fml_header_ptr_high: procedure;    #*ˆfml_header_ptr�<==�last_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlbp�(fml_header_ptr);"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node; *ˆelse�do;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; *end get_fml_header_ptr_high; 'ŠTTL„GET�FML�HEADER�POINTER�HIGH�-�CODEŠPAGE*$*get_fml_header_ptr_high: procedure;* GFMLPTRH: *#*ˆfml_header_ptr�<==�last_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlbp�(fml_header_ptr);* ŠLEA„(A4),A5 !ŠWHILE.L�FMLFREE(A5)��D7�DO.S �MOVE.L�FMLBP(A5),A5 *"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;�IF.LƒA5��D0�THEN.S �SUB.L‚A3,A3 �SUB.L‚A4,A4�RTS�ENDIŠENDW *0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;* ŠIF.LƒFMLFREE(A5)�„D7�THEN.S�BSR.S‚UFMLHEAD * *ˆelse�do;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.S�SUB.L‚D7,FMLFREE(A5) �ADD.L‚D7,FMLUSED(A5) �MOVE.L�FMLFREE(A5),D1 �LSL.L‚#8,D1�LEA„(A5,D1.L),A5ŠENDI**end get_fml_header_ptr_high;*ŠRTS /ŠTTL„GET�FML�HEADER�POINTER�LOW�-�DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚GFMLPTRL�(get_fml_header_ptr_low):*** ***…Function::***ŠThis�subroutine�returns�a�pointer�to�a�block�of�memoryI***…fml_header_len�pages�long�in�the�current�partition.‚This�block�is�theD***…lowest�addressed�block�in�the�current�partition�that�is�at�leastI***…fml_header_len�pages�long.‚This�subroutine�handles�all�the�accountingI***…for�the�block�it�"steals"�from�the�partition.‚(It�counts�the�block�asI***…part�o f�the�"used"�portion�of�the�previous�block,�if�a�previous�blockH***…exists.)‚Also,�since�this�subroutine�"steals"�a�block�of�memory�fromE***…low�memory,�it�may�hvae�to�move�the�pointers�and�counters�(fmlfp,J***…fmlbp,�fmlfree,�fmlused)�from�their�position�to�a�location�fml_header_'***…len�pages�further�"down"�in�memory.*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚D7�=�fml_header_len.*** ***…Outputs:***ˆ1.)‚A5�=�fml_header_ptr.;***ˆ2.)‚If�we�can't�find�any�block�in�the�current�partition'***�at�least�fml_header_len�pages�long:+***�A.)‚A3�(first_node_ptr)�is�set�to�zero.****�B.)‚A4�(last_node_ptr)�is�set�to�zero.******…Side�effects:‚None:******…Explanation:F***ŠFirst�we�set�fml_header_ptr�equal�to�the�first_node_ptr�and�searchI***…forward�through�the�FML�until�we�find�a�block�at�least�fml_header_lenC***…pages�long.‚If�we�reach�the�end�of�the�FML�(fml_header_pty�=�0)H***…without�finding�a�block�of�memory�fml_header_len�pages�long,�then�weG***…zero�out�the�first�and�last_node_ptr�and�return.‚(Fml_header_ptr�is***…also�zero.)***E***ŠOtherwise,�we�check�to�see�if�the�block�is�exactly�fml_header_lenG***…pages�long.‚If�it�is,�then�we�call�unlink_fml_header_node�to�unlinkI***…the�node�from�the�FML�linked�list,�and�count�its�memory�as�being�part.***…of�the�used�portion�of�the�previous�block.***>***ŠIf�the�block�is�greater�than�fml_header_len�pages,�we�callG***…move_fml_node�to�move�the�pointers�and�counters�of�the�current�nodeJ***…(fmlfp,�fmlbp,�fmlfree,�fmlused)�fml_header_len�pages�"down"�in�memory;***…in�order�to�make�room�for�the�FML_HEADER�in�low�memory.***N****************************************************************************** +ŠTTL„GET�FML�HEADER�POINTER�LOW�-�ALGORITHMŠPAGE#*get_fml_header_ptr_low: procedure;    $*ˆfml_header_ptr�<==�first_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlfp�(fml_header_ptr);"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;*ˆelse�call�move_fml_node;  *end get_fml_header_low; &ŠTTL„GET�FML�HEADER�POINTER�LOW�-�CODEŠPAGE#*get_fml_header_ptr_low: procedure;* GFMLPTRL: *$*ˆfml_header_ptr�<==�first_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlfp�(fml_header_ptr);* ŠLEA„(A3),A5 !ŠWHILE.L�FMLFREE(A5)��D7�DO.S �MOVE.L�FMLFP(A5),A5 *"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;*�IF.LƒA5��D0�THEN.S �SUB.L‚A3,A3 �SUB.L‚A4,A4�RTS�ENDIŠENDW *0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;*ˆelse�call�move_fml_node;* ŠIF.LƒFMLFREE(A5)�„D7�THEN.S�BSR.S‚UFMLHEAD�ELSE.S�BSR.S‚MFMLNODEŠENDI **end get_fml_header_ptr_low;*ŠRTS +ŠTTL„UNLINK�FML�HEADER�NODE�-�DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚UFMLHEAD�(unlink_fml_header_node):*** ***…Function:E***ŠThis�subroutine�handles�the�unlinking�of�the�fml_header_node�fromI***…the�FML.‚It�takes�care�of�linking�the�previous_node�(if�there�is�one)I***…to�the�next_node�(if�there�is�one)�and�vice�versa.‚It�also�takes�careJ***…of�accounting�for�the�fml_header_node�as�part�of�the�"used"�portion�of(***…the�previous_node�(if�there�is�one).*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�fml_header_ptr.*** ***…Outputs:E***ˆ1.)‚Updated�FML�with�the�fml_header_node�"unlinked"�from�the�FML,?***�and�counted�as�part�of�the�"used"�part�of�its�previous_node***�(if�there�is�one).******…Side�effects:.***ˆ1.)‚A3�(first_node_ptr)�could�get�changed.-***ˆ2.)‚A4�(last_node_ptr)�could�get�changed.3***ˆ3.)‚A2�(pr evious_node_ptr)�could�get�destroyed.)***ˆ4.)‚A6�(scratch)�could�get�destroyed.&***ˆ5.)‚D1�(scratch)�may�be�destroyed.******…Explanation:C***ŠThe�first�do�block�handles�the�case�where�the�fml_header_ptr�isA***…equal�to�the�first_node_ptr.‚In�this�case�we�must�advance�theG***…first_node_ptr�to�point�to�the�next�node�in�the�FML.‚If�there�is�noJ***…next�node�(new�first_node_ptr�=�0),�then�we�zero�out�the�last_node_ptrD***…to�indicate�an�empty�FML,�and�return.‚Otherwise,�we�zero�out�theD***…fmlbp�of�the�new�first_node_ptr�to�indicate�that�this�is�now�the%***…beginning�of�the�FML,�and�return.***>***ŠThe�next�large�do�block�of�code�handles�the�case�where�theI***…fml_header_ptr�is�equal�to�the�last_node_ptr.‚In�this�case�we�attemptJ***…to�back�up�the�last_node_ptr�to�point�to�the�previous�node�in�the�FML.F***…If�there�is�no�previous�node�(new�last_node_ptr�=�0),�then�we�zero@***…out�the�first_node_ptr�to�indicate�an�empty�FML,�and�return.J***…Otherwise,�we�zero�out�the�fmlfp�of�the�new�last_node�to�indicate�thatG***…this�is�now�the�end�of�the�FML,�update�the�fmlused�field�of�the�new@***…last_node�to�equal�its�current�value,�plus�the�length�of�the9***…previous�last_node�(fmlfree�and�fmlused),�and�return.***@***ŠIf�neither�of�these�cases�occurred,�then�the�fml_header_nodeI***…exists�somewhere�in�the�middle�of�the�FML.‚In�this�case�we�must�firstD***…get�a�pointer�to�the�node�before�the�fml_header_node�in�the�FML.G***…Now�the�fmlfp�of�this�previous�node�must�be�set�to�the�value�of�the:***…fmlfp�of�the�fml_header_node,�and�thus�"skip�over"�theG***…fml_header_node.‚Having�done�this,�we�update�the�fmlused�portion�ofI***…this�previous_node�to�include�its�old�fmlused�value�and�the�length�of?***…the�fml_header_node�(fmlfree�and�fmlused).‚(This�in�essenceG***…counts�the�entire�fml_header_node,�used�and�free�memory,�as�part�ofH***…the�used�portion�of�the�previous�node.)‚Finally,�we�update�the�fmlbpI***…of�the�node�after�the�fml_header_node�in�the�FML�to�point�back�to�the;***…previous�node,�and�thus�complete�the�"unlinking"�of�the***…fml_header_node.***M***************************************************************************** 'ŠTTL„UNLINK�FML�HEADER�NODE�-�ALGORITHMŠPAGE#*unlink_fml_header_node: procedure;    /*ˆif�(fml_header_ptr�=�first_node_ptr)�then�do;,*’first_node_ptr�<==�fmlfp�(first_node_ptr);*’if�(first_node_ptr�=�0)*’then�last_node_ptr�<==�0;%*’else�fmlbp�(first_node_ptr)�<==�0);*ˆend;3*ˆelse�if�(fml_header_ptr�=�last_node_ptr)�then�do;**’last_node_ptr�<==�fmlbp�(last_node_ptr);*’if�(last_node_ptr�=�0)*’then�first_node_ptr�<==�0; *’else�do;*œfmlfp�(last_node_ptr�<==�0);*œfmlused�(last_node_ptr)�<==*¦fmlused�(last_node_ptr)�+*¦fmlfree�(fml_header_ptr)�+*¦fmlused�(fml_header_ptr);*’end;*ˆend; *ˆelse�do;/*’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„UNLINK�FML�HEADER�NODE�-�CODEŠPAGE#*unlink_fml_header_node: procedure;* UFMLHEAD: */*ˆif�(fml_header_ptr�=�first_node_ptr)�then�do;,*’first_node_ptr�<==�fmlfp�(first_node_ptr);*’if�(first_node_ptr�=�0)*’then�last_node_ptr�<==�0);$*’else�fmlbp�(first_node_ptr)�<==�0;*ˆend*ŠIF.LƒA5��A3�THEN.S �MOVE.L�FMLFP(A3),A3 �IF.LƒA3��D0�THEN.S �SUB.L‚A4,A4 �ELSE.S�CLR.L‚FMLBP(A3)�ENDI *3*ˆelse�if�(fml_header_ptr�=�last_node_ptr)�then�do;**’last_node_ptr�<==�fmlbp�(last_node_ptr);*’if�(last_node_ptr�=�0)*’then�first_node_ptr�<==�0);*�ELSE.S�IF.LƒA5��A4�THEN.S �MOVE.L�FMLBP(A4),A4 �IF.LƒA4��D0�THEN.S “SUB.L‚A3,A3 * *’else�do;*œfmlfp�(last_node_ptr)�<==�0;*œfm lused�(last_node_ptr)�<==*¦fmlused�(last_node_ptr)�+*¦fmlfree�(fml_header_ptr)�+*¦fmlused�(fml_header_ptr);*’end;*ˆend;*“ELSE.S“CLR.L‚FMLFP(A4) “MOVE.L�FMLFREE(A5),D1“ADD.L‚FMLUSED(A5),D1“ADD.L‚D1,FMLUSED(A4)�ENDI * *ˆelse�do;/*’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.S�MOVE.L�FMLBP(A5),A2 �MOVE.L�FMLFP(A5),FMLFP(A2) �MOVE.L�FMLFREE(A5),D1�ADD.L‚FMLUSED(A5),D1�ADD.L‚D1,FMLUSED(A2) �MOVE.L�FMLFP(A5),A6 �MOVE.L�A2,FMLBP(A6)�ENDIŠENDI**end unlink_fml_header_node;*ŠRTS "ŠTTL„MOVE�FML�NODE�-�DOCUMENTATIONŠPAGEN*********************************************************************************#***…Name:‚MFMLNODE�(move_fml_node):*** ***…Function:D***ŠThis�subroutine�"moves"�the�pointers�and�counters�(fmlfp,�fmlbp,C***…fmlfree,�fmlused)�of�an�FML�node�fml_header_len�pages�"down"�inG***…memory.‚It�also�handles�all�accounting�for�the�change�in�the�statusH***…of�the�moved�memory�(fmlfree�of�the�current�node�gets�decremented�byH***…fml_header_len�pages,�and�fmlused�for�the�previous�node�(if�there�isB***…one)�gets�incremented�by�the�same�value).‚This�subroutine�alsoG***…accounts�for�any�change�in�the�status�of�the�first_node_ptr�(if�theH***…fml_header_ptr�was�pointing�to�the�first�node),�or�the�last_node_ptrF***…(if�the�fml_header_ptr�was�pointing�to�the�last�node)�as�required.*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�fml_header_ptr.***ˆ4.)‚D7�=�fml_header_len.*** ***…Outputs:C***ˆ1.)‚A�new�FML�node�moved�down�in�memory�by�fml_header_len�page.A***ˆ2.)‚All�new�pointers�to�reflect�the�displacement�of�the�node.******…Side�effects:***ˆ1.)‚A2�gets�destroyed.+***ˆ2.)‚A3�(first_node_ptr)�may�be�updated.****ˆ3.)‚A4�(last_node_ptr)�may�be�updated.$***ˆ4.)‚A6�(scratch)�gets�destroyed.******…Explanation:D***ŠFirst�we�compute�the�address�of�the�moved�node�to�be�the�addressH***…of�the�fml_header_ptr�plus�the�offset,�in�bytes,�that�the�node�is�toH***…be�moved�(fml_header_len*256).‚Then�we�get�a�pointer�to�the�previousE***…node�in�the�FML.‚If�there�is�no�previous�node,�then�we�update�theG***…first_node_ptr�to�point�to�the�moved�node.‚Otherwise,�we�update�theH***…fmlfp�field�of�the�previous�node�to�point�to�the�moved�node,�and�addH***…the�fml_header_len�pages�to�the�"used"�portion�of�the�previous�node.***D***ŠNext�we�decrement�the�"free"�field�of�the�fml_header_node�by�theJ***…value�of�the�fml_header_len�to�reflect�the�fact�that�this�memory�is�noI***…longer�available�to�that�node.‚Then�we�get�a�pointer�to�the�next�nodeD***…in�the�FML,�and�if�it�is�zero�(no�next�node),�then�we�update�theF***…last_node_ptr�to�point�to�the�moved�node.‚Otherwise,�we�update�the;***…fmlbp�of�the�next�node�to�point�back�to�the�moved�node.***C***ŠFinally,�we�actually�move�the�pointers�and�counters�of�the�nodeJ***…from�the�memory�pointed�to�by�the�fml_header_ptr�to�the�memory�pointed)***…to�by�the�moved_node_ptr,�and�return.***M***************************************************************************** ŠTTL„MOVE�FML�NODE�-�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))*ˆthen�first_node_ptr�<==�moved_node_ptr; *ˆelse�do;/*’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)(*ˆthen�l ast_node_ptr�<==�moved_node_ptr;0*ˆelse�fmlbp�(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„MOVE�FML�NODE�-�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))*ˆthen�first_node_ptr�<==�moved_node_ptr;*ŠMOVE.L�FMLBP(A5),A2 ŠIF.LƒA2��D0�THEN.S �LEA„(A6),A3 * *ˆelse�do;/*’fmlfp�(previous_node_ptr)�<==�moved_node_ptr;!*’fmlused�(previous_node_ptr)�<==*œfmlused�(previous_node_ptr)�+*œfml_header_len;*ˆend;*�ELSE.S�MOVE.L�A6,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)(*ˆthen�last_node_ptr�<==�moved_node_ptr;0*ˆelse�fmlbp�(next_node_ptr)�<==�moved_node_ptr;*ŠMOVE.L�FMLFP(A5),A2 ŠIF.LƒA2��D0�THEN.S �LEA„(A6),A4 �ELSE.S�MOVE.L�A6,FMLBP(A2)ŠENDI *2*ˆfmlfp.fmlbp.fmlused.fmlfree�(moved_node_ptr)�<==/*’fmlfp.fmlbp.fmlused.fmlfree�(fml_header_ptr);*ŠMOVE.L�FMLFP(A5),FMLFP(A6)ŠMOVE.L�FMLBP(A5),FMLBP(A6)ŠMOVE.L�FMLUSED(A5),FMLUSED(A6)ŠMOVE.L�FMLFREE(A5),FMLFREE(A6) **end move_fml_node;*ŠRTS *ŠTTL„CHECKŽMEMMAP�CONFLICT�-�DOCUMENTATIONŠPAGEM********************************************************************************+***…Name:‚CMEMCONF�(check_memmap_conflict):*** ***…Function:C***ŠThis�subroutine�checks�the�RAM�partition�described�by�the�entryB***…in�the�src_memtbl�pointed�to�by�the�src_memtbl_ptr�against�allE***…previously-described�RAM�partitions.‚If�this�subroutine�detects�aD***…fatal�conflict�it�will�not�return�execution�to�the�caller.‚If�itC***…detects�an�alias�partition�(same�starting�address�as�some�otherK***…partition),�it�returns�execution�with�the�got_alias_partition_flag�set.9***…Otherwise,�it�returns�execution�with�that�flag�reset.*** ***…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�(if�got_alias_partition_flag�=�set).******…Side�effects:,***ˆ1.)‚A2�(temp_memtbl_ptr)�gets�destroyed.$***ˆ2.)‚D1�(scratch)�gets�destroyed.3***ˆ3.)‚Execution�may�not�return�(may�call�KILLER).******…Explanation:@***ŠFirst�we�initialize�for�the�loop�by�resetting�the�got_alias_I***…partition_flag,�setting�the�current_partition_number,�and�setting�theF***…temp_memtbl_ptr�to�point�to�the�beginning�of�the�dest_memtbl.‚Then***…we�begin�the�loop.***B***ŠIf�we�detect�a�duplicate�partition�number,�then�we�call�KILLERóÜAåFíRõMýNC***…and�die.‚If�we�detect�a�duplicate�start_of_part_ptr,�we�set�theI***…got_alias_partition_flag,�set�the�fml_header_ptr�equal�to�the�MAPFMLPB***…field�of�the�alias�partition�and�return.‚If�we�detect�that�ourD***…current�start_of_part_ptr�is�at�a�lower�memory�location�than�theF***…ENDAVAIL�field�of�some�previous�partition,�then�we�call�KILLER�andC***…die.‚Otherwise,�we�keep�looping�until�we�have�looked�at�all�the>***…previously-defined�entries�in�the�dest_memtbl,�and�return.***L**************************************************************************** &ŠTTL„CHECKŽMEMMAP�CONFLICT�-�ALGORITHMŠPAGE"*check_memmap_conflict: procedure;    !*ˆreset�got_alias_partition_flag;B*ˆcurrent_partition_number�<==�MAPMTYP�(src_memtbl_p tr)�.AND.�$0F;&*ˆtemp_memtbl_ptr�<==�SYSPAR�(MAPBEG);/*ˆdo�until�(temp_memtbl_ptr�=�dest_memtbl_ptr);;*’if�(MAPPART�(temp_memtbl_ptr)�=�current_partition_number)*’then�call�KILLER;=*’if�(MAPSTRA�(temp_memtbl_ptr)�=�start_of_part_ptr)�then�do;*œset�got_alias_partition_flag;/*œfml_header_ptr�<==�MAPFMLP�(temp_memtbl_ptr); *œreturn;*’end;=*’if�(start_of_part_ptr�<�ENDAVAIL�(MAPFMLP�(temp_memtbl�ptr)*’then�call�KILLER;'*’temp_memtbl_ptr�<==�temp_memtbl_ptr�+*¦length�(dest_memtbl_entry); *ˆend;  *end check_memmap_conflict; !ŠTTL„CHECKŽMEMMAP�CONFLICT�-�CODEŠPAGE"*check_memmap_conflict: procedure;* CMEMCONF: *!*ˆreset�got_alias_partition_flag;B*ˆcurrent_partition_number�<==�MAPMTYP�(src_memtbl_ptr)�.AND.�$0F;'*ˆtemp_memtbl_ptr�<==�SYSPAR�(MAPBEG));/*ˆdo�until�(temp_memtbl_ptr�=�dest_memtbl_ptr);* ŠCLR.B‚D2 ŠMOVE.B�MAPMTYP(A0),D1ŠAND.B‚#$0F,D1 ŠMOVE.L�MAPBEG,A2 ŠREPEAT *;*’if�(mappart�(temp_memtbl_ptr)�=�current_partition_number)*’then�call�KILLER;* �IF.BƒMAPPART(A2)�„D1�THEN.S!�KILL.EXECT0ƒBESTIMEMSA,PT_DUPNUM�ENDI *=*’if�(mapstra�(temp_memtbl_ptr)�=�start_of_part_ptr)�then�do;*›set�got_alias_partition_flag;/*›fml_header_ptr�<==�mapfmlp�(temp_memtbl_ptr); *›return;*’end;* �IF.LƒMAPSTRA(A2)�„D4�THEN.S�ST…D2�MOVE.L�MAPFMLP(A2),A5�RTS�ENDI *>*’if�(start_of_part_ptr�<�endavail�(mapfmlp�(temp_memtbl_ptr))*’then�call�KILLER;*'�IF.Bƒ(A2)��#$FF�THEN.SˆIf�not�ROM, �MOVE.L�MAPFMLP(A2),A6!�IF.LƒD4��ENDAVAIL(A6)�THEN.S,�KILL.EXECT0ƒBESTIMEMSA,PT_END_START_OVERLAP�ENDI�ENDI **’temp_memtbl_ptr�<==*œtemp_memtbl_ptr�+*œlength�(dest_memtbl_entry);*�LEA„MAPENTSZ(A2),A2 **ˆend;*ŠUNTIL.L�A2��A1 **end check_memmap_conflict;*ŠRTS +ŠTTL„BUILDŽRAM�MEMTBL�ENTRY�-�DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚BRAMNODE�(build_ram_memtbl_entry):*** ***…Function:D***ŠThis�subroutine�writes�in�all�pointers�and�descriptors�for�a�RAM'***…partition�entry�in�the�dest_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�(RAM�entry)�pointed�to�by�the***�dest_memtbl_ptr.******…Side�effects:+***ˆ1.)‚D1,�and�D2�(scratch)�get�destroyed.******…Explanation:D***ŠThe�MAPMTYP�field�of�the�dest_memtbl_entry�gets�set�equal�to�theF***…most�significant�four�bits�of�the�MAPPART�field�of�the�src_memtbl_H***…entry,�and�the�MAPPART�field�of�the�dest_memtbl_entry�gets�set�equalI***…to�the�four�least�significant�bits�of�the�same�field.‚Finally,�we�setJ***…the�MAPSTRA�field�of�the�dest_memtbl_entry�equal�to�the�start_of_part_G***…ptr,�and�the�MAPFMLP�field�equal�to�the�fml_header_ptr,�and�return.***M***************************************************************************** 'ŠTTL„BUILDŽRAM�MEMTBL�ENTRY�-�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ŽRAM�MEMTBL�ENTRY�-�CODEŠPAGE#*build_ram_memtbl_entry: procedure;* BRAMNODE: **ˆMAPMTYP�(dest_memtbl_ptr)�<==%*’MAPMTYP�(src_memtbl_ptr)�.AND.�$70;*ŠMOVE.B�MAPMTYP(A0),D1 ŠMOVE.B�D1,D2ŠAND.B‚#$70,D1ŠMOVE.B�D1,MAPMTYP(A1) **ˆmappart�(dest_memtbl_ptr)�<==&*’mapmtyp�(dest_memtbl_ptr)�.AND.�$0F;*ŠAND.B‚#$0F,D2ŠMOVE.B�D2,MAPPART(A1) *2*ˆmapstra�(dest_memtbl_ptr)�<==�start_of_part_ptr;*ŠMOVE.L�D4,MAPSTRA(A1) */*ˆmapfmlp�(dest_memtbl_ptr)�<==�fml_header_ptr;*ŠMOVE.L�A5,MAPFMLP(A1) **end build _ram_memtbl_entry;*ŠRTS +ŠTTL„BUILDŽROM�MEMTBL�ENTRY�-�DOCUMENTATIONŠPAGEM********************************************************************************,***…Name:‚BROMNODE�(build_rom_memtbl_entry):*** ***…Function:E***ŠThis�subroutine�does�some�primitive�checking�on�the�legality�of�aB***…ROM�partition�described�in�the�src_memtbl,�and�then�writes�theH***…descriptors�and�pointers�to�describe�that�node�into�the�dest_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�(ROM�entry)�pointed�to�by�the***�dest_memtbl_ptr.******…Side�effects:$***ˆ1.)‚A6�(scratch)�gets�destroyed./***ˆ2.)‚Execution�may�not�return�(call�KILLER).******…Explanation:D***ŠFirst�we�verify�that�the�current�ROM�partition�does�not�start�atH***…a�lower�memory�location�than�the�ending�of�the�last�partition�in�theH***…dest_memtbl.‚If�it�does,�we�have�a�fatal�configuration�error,�and�so***…we�call�KILLER.***>***ŠOtherwise,�we�move�the�MAPMTYP�and�MAPPART�fields�from�theH***…src_memtbl�to�the�dest_memtbl,�set�the�MAPSTRA�and�MAPENDA�fields�ofF***…the�dest_memtbl�equal�to�the�start_of_part_ptr�and�end_of_part_ptr***…respectively,�and�return.***N****************************************************************************** 'ŠTTL„BUILDŽROM�MEMTBL�ENTRY�-�ALGORITHMŠPAGE#*build_rom_memtbl_entry: procedure;   ?*ˆif�(MAPMTYP�(previous�(dest_memtbl_ptr))�=�ROM_type)�then�do;*’if�(start_of_part_ptr�<'*œMAPENDA�(previous�(dest_memtbl_ptr)))*’then�call�KILLER;*ˆend; *ˆelse�do;*’if�(start_of_part_ptr�<1*œENDAVAIL�(MAPFMLP�(previous�(dest_memtbl_ptr)))*’then�call�KILLER;*ˆ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„BUILD�ROM�MEMTBL�ENTRY�-�CODEŠPAGE#*build_rom_memtbl_entry: procedure;* BROMNODE: ?*ˆif�(MAPMTYP�(previous�(dest_memtbl_ptr))�=�ROM_type)�then�do;*’if�(start_of_part_ptr�<'*œMAPENDA�(previous�(dest_memtbl_ptr)))*’then�call�KILLER;*ˆend; +ŠIF.BƒMAPMTYP-MAPENTSZ(A1)��#$FF�THEN.S)ŠIF.LƒD4��MAPENDA-MAPENTSZ(A1)�THEN.S'ŠKILL.EXECT0‚BESTIMEMSA,PT_RORO_OVERLAPŠENDI *ˆelse�do;*’if�(start_of_part_ptr�<1*œENDAVAIL�(MAPFMLP�(previous�(dest_memtbl_ptr)))*’then�call�KILLER;*ˆend; ŠELSE.SŠMOVE.L�MAPFMLP-MAPENTSZ(A1),A6!ŠIF.L�D4��ENDAVAIL(A6)�THEN.S'ŠKILL.EXECT0‚BESTIMEMSA,PT_RARO_OVERLAPŠ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.W�MAPMTYP(A0),MAPMTYP(A1) ŠMOVE.L�D4,MAPSTRA(A1) ŠMOVE.L�D5,MAPENDA(A1)**end build_rom_memtbl_entry;*ŠRTS ŠEND'BUDDY INIT AF  IMEM SAr�   =/*=/*†BUDDY.INIT.AF=/*(=/* Chain file to assemble BUDDY.INIT.SA=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to BUDDY.INIT.LS=/*=/IFC \1ƒ=ARG�BUDDY.INIT.LS=/ENDIF=/*8=ASM M68XXX.INIT.SA/BUDDY.IMEM.SA,BUDDY.INIT.RO,\1;RZ=85=/*{ 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=/*ƒ9995.&.KILL.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=ENDNNNNN ‰PAGEO*********************************************************************************ˆBUDDY.IMEM.SA*@*ˆThis�module�is�an�include�file�for�M68XXX.INIT.SA.‚It�contains;*ˆtwo�entry�points�--�memory�initialization�code�and�system?*ˆinitializer�exit�code.‚The�memory�initialization�code�in�thisB*ˆmodule�is�based�on�the�buddy�buffer�method.‚It�must�be�used�with@*ˆBUDDY.PAGEALOC.SA‚and�BUDDY.PAGEFREE.SA.‚The�exit�code�in�thisD*ˆmodule�frees�the�memory�belonging�to�INIT�and�INITDAT,�and�finally&*ˆends�up�in�the�exec�module�DISPATCH.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*;*ˆEntry:‚IMEM„-�Called�as�a�subroutine�from‚M68XXX.INIT.SA.,*�INITEND�-�Branched�to�from�M68XXX.INIT.SA.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*�*�*�*�*�**™A‚*�*�*�*�*�*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed**ˆExits:/*ˆIMEM„Good�return�-�RTS�back�to�M68XXX.INIT.SA0*ˆIMEM„Bad�return‚-�Exits�via�KILL.EXECT0�macro.G*ˆINITEND�Good�return�-�Fake�RTS�to�FRBLK�routine�in�BUDDY.PAGEFREE.SA.3*ˆINITEND�Bad�return‚-�Exits�via�KILL.EXECT0�macro.**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------@*ˆ02/12/86‚Julie�Hoban„Added�code�to�allow�RMS�in�RAM�parts�1-X.A*ˆ11/05/85‚Julie�Hoban„Removed�IMEM�subroutine�from�INIT�to�here.*O********************************************** *********************************‰PAGEINITEND:8ŠLEA„255+START(PC),A4ƒStart�of�Init�(from�INITDAT)�+�255 ŠMOVE.L�A4,D1ŠCLR.B‚D1‘Form�"ceiling"-ŠMOVE.L�D1,A4ŽA4�<--�start�of�memory�to�clear ŠMOVE.L�MAPBEG,A1ŠMEMMAP�table5ŠLEA„256(A1),A3‰A3�<--�free�memory�header�partition�0@ŠMOVE.L�LOWFREE(A3),D6…End�of�memory�to�free�(partition�0�only).=ŠMOVE.L�#'BUDY',LOWFREE(A3)�Memory�allocation�ID�for�SYSANAL. FIND_PTR:<ŠIF.L�A4��STRAVAIL(A3)�AND.L�A4��ENDAVAIL(A3)�THEN.S 87#D+@3N;5CGKCS9[c'k>s;{FƒC‹$‹SUB.LƒA4,D6ŒD6�<--�#�bytes�to�free.ŠELSE.S)‹LEA.Lƒ128(A3),A3‡Next�partition�pointer.>‹MOVE.L‚LOWFREE(A3),D6ƒEnd�of�memory�to�free�(partitions�1-X). ‹BEQ.SƒGOTOEX1‹MOVE.L�#'BUDY',LOWFREE(A3)�Memory�allocation�ID. ‹BRA…FIND_PTRŠENDI 0ŠMOVE.L�#T0FRBLK,D1ˆFree�block�directive�number.6ŠMOVE.L�#T0ENTRY,D0ˆGet�address�of�free�block�routine.ŠTRAPƒ#0$ŠBRA.S‚GOTOEX�Branch�if�good�return.%ŠKILL.EXECT0�BUDYIMEMSA,NO_FRBLK_ADDR :GOTOEX„MOVE.L�DISPATCH(PC),-(A7)�Adresss�of�start�of�exec. G* If this is a ROMed system, or if we couldn't find a good pointer to aC* memory partition, then DON'T FREE THE MEMORY OCCUPIED BY SYSINIT! ŠCLR.L‚D01ŠIF.LƒTCBHEAD(PC)��D0�AND.L�D6��D0�THEN.S/‹MOVE.L�A0,-(A7)ŠAddress�of�FREE_BLOCK�routine.ŠENDI "ŠRTS—Go�to�free�memory,�then�exec.ŠPAGEO********************************************************************************$*ˆIMEM�subroutine�for�buddy�buffers.*?*ˆChecks�all�memory�locations�described�in�the�SYSGENed�MEMTBL.9*ˆMaps�out�any�"holes"�in�memory.‚Sets�up�the�Free�MemoryB*ˆHeader�and�the�Free�Memory�Array�in�partition�zero�(this�differs=*ˆfrom�versions�prior�to�4.5)�for�all�partitions.‚Sets�up�the?*ˆMemory�Map�Table�in�partition�zero�describing�all�partitions.*@*ˆPartition�zero�is�handled�differently�due�to�the�fact�that�theD*ˆINIT�module�resides�in�a�portion�of�partition�zero�that�will�later*ˆbe�used�by�the�system.*@*ˆSubroutine�IPTRS�sets�up�the�pointers�to�the�src_memtbl�and�to*ˆpartition�zero.*C*ˆSubroutine�SIZEMEM�will�size�and�clear�any�memory�not�in�the�INITC*ˆmodule,�map�out�any�"holes"�in�memory,�and�set�up�the�Free�Memory:*ˆArray�describing�the�available�memory�in�partition�zero.*B*ˆSubroutine�BFM_HEAD�will�build�the�FM_HEADER�for�partition�zero,C*ˆand�subroutine�BRAM_ENT�will�record�partition�zero�in�the�MEMTBL.*@*ˆFinally,�subroutine�INEXTMEM�will�perform�all�of�the�above�for*ˆthe�remaining�partitions.**=*ˆEntry:„Src_memtbl�(as�created�by�SYSGEN)�located�at�address"*’MEMTABL�within�the�INITDAT�area.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*�*�*�*�*�**™A‚*�*�*�*�*�*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed*"*ˆExit:…MAPBEG�in�SYSPAR�is�setup.+*’Memory�Map�Table�in�partition�0�is�setup.3*’Free�Memory�Headers�for�all�partitions�are�setup.2*’Free�Memory�Arrays�for�all�partitions�are�setup.*#*ˆExit:‚Good�return�-�RTS‚to�caller;*�Bad�return‚-�No�return;�goes�to�KILLER�in�the�INIT�module**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------6*ˆ09/06/85‚Julie�Hoban„Rewritten�to�use�buddy�buffers.*O*******************************************************************************ŠPAGEJ****************************************************************************‡A0�=�src_memtbl_ptr;5*ŒPoints�to�the�"source"�MEMTBL�in�INITDAT�data�area.**‡A1�=�dest_memtbl_ptr;:*ŒPoints�to�the�"destination"�MEMTBL�immediately�following*ŒINITDAT�in�partition�zero.**‡A2�=�scratch;**‡A3�=�fm_header_addr;**‡A4�=�start_clear_mem_ptr;:*ŒDuring�size_memory,�this�is�initiali zed�to�clear_mem_ptr9*Œand�is�used�to�address�the�start�of�the�block�of�memory*Œbeing�initialized.**‡A5�=�clear_mem_ptr;>*ŒDuring�size_memory�(and�build_fma_entry)�it�is�used�to�point,*Œto�the�next�memory�location�to�be�cleared.**‡A6�=�scratch;** *‡D0�=�0;@*ŒUsed�for�zeroing�out�memory,�and�checking�if�address�registers*Œare�equal�to�zero.**‡D1-D3�=�scratch;**‡D4�=�start_of_partition;8*ŒPoints�to�the�start�of�the�"current"�memory�partition.**‡D5�=�end_of_partition;6*ŒPoints�to�the�end�of�the�"current"�memory�partition.**‡D6�=�bytes_cleared;<*ŒContains�a�count�of�the�number�of�the�bytes�cleared�in�the=*Œ"current"�memory�partition.‚When�we�find�a�"hole"�in�memory>*Œ(take�a�bus_error),�then�we�stop�incrementing�bytes_cleared.A*ŒThus�bytes_cleared�will�contain�a�count�of�the�number�of�"free">*Œmemory�in�the�current�block�of�the�current�memory�partition.**‡D7�=�scratch;*J**************************************************************************ŠPAGEIMEM:**‚Initialize�Partition�0.*0ŠBSR.S‚IPTRS‘Call�init_pointers�for�partition�0. .ŠBSR„SIZEMEM�Call�size_memory�for�partition�0. 3ŠBSR„BFM_HEADŽCall�build_fm_header�for�partition�0. 5ŠBSR„BRAM_ENTŽBuild_ram_memtbl_entry�for�partition�0. *$*‚Initialize�Partitions�1�through�X.*6ŠBSR„INEXTMEMŽInit_next_partitions�for�partitions�1-X. ŠRTSŠPAGEL******************************************************************************ˆIPTRS*?*ˆInitializes�all�pointers�and�counters�for�initializing�memory*ˆpartition�zero.*?*ˆ-�Initialize�D0�and�the�src_memtbl_ptr.‚If�the�first�entry�in8*Šthe�src_memtbl�is�not�RAM�partition�zero,�call�KILLER.*>*ˆ-�Initialize�the�end_of_partition�to�point�to�the�"floor"�of9*Šthe�MAPENDA�field�of�the�first�entry�in�the�src_memtbl.*A*ˆ-�If�the�exec�is�in�partition�zero,�then�the�start_of_partitionB*Špoints�to�the�next�256�byte�block�after�the�end�of�the�exec,�theF*Šclear_mem_ptr�points�to�the�next�256�byte�block�after�the�end�of�the*ŠINITDAT�area.*F*ˆ-�If�TCBHEAD�=�0,�then�the�mini�TCBs�follow�src_memtbl,�so�increment@*Šclear_mem_ptr�by�approx�15�mini-TCB�lengths�to�insure�that�the#*Šmini�TCB�area�is�not�cleared�out.*A*ˆ-�If�the�exec�is�not�in�partition�zero,�then�set�both�start_of_F*Špartition�and�clear_mem_ptr�to�point�to�the�next�256�byte�page�after6*Šthe�SYSPAR�data�area,�and�set�bytes_cleared�to�zero.*G*ˆ-�If�the�partition�does�not�have�positive�amt�of�memory,�call�KILLER.*2*ˆEntry:„Src_memtbl�in�INITDAT�at�address�MEMTABL.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚R�*…R�R�*�R *™A‚Rƒ*�RƒR�***ˆExit:…A0�=�src_memtbl_ptr;*’A1�=�dest_memtbl_ptr;*’A3�=�fm_header_addr;*’A5�=�clear_mem_ptr; *’D0�=�0;*’D4�=�start_of_partition;*’D5�=�end_of_partition;*"*ˆExits�to:�RTS�to�caller�if�okay.*’KILLER�if�not�okay.*J**************************************************************************ŠPAGE*F*„Throughout�these�algorithms�we�will�always�take�the�"ceiling"�of�theF*„start�of�the�partition,�and�the�"floor"�of�the�end�of�the�partition.I*„This�insures�that�all�partitions�start�and�end�on�a�256�byte�block,�andD*„also�that�we�only�grab�the�same�amount�of�memory,�or�less,�that�is#*„described�within�the�src_memtbl.)* IPTRS: ŠCLR.L‚D0”D0�=�zero�always. 9ŠLEA„MEMTABL(PC),A0ˆA0�<--�src_memtbl_ptr�(from�INITDAT). AŠIF.Wƒ(A0)��D0�THEN.SƒIf�first�entry�defining�type.part�<>�0,0�KILL.EXECT0‚BUDYIMEMSA,PT_1ST_BAD�Go�to�killer.ŠENDI ***‡CLR.L‚D7***‡LEA„(A0),A2*** ***‡REPEAT***ŠADD.L‚#MAPENTSZ,D7***ŠLEA„12(A2),A2***‡UNTIL.W�(A2)Ž�#$FFFF******$***‡ADD.L‚#(FMLHDSZ+MAPENTSZ+255),D7***‡LSR.L‚#8,D7*** !*‚Count�the�number�of�partitions. ŠCLR.L‚D7”Clear�count.0ŠLEA„(A0),A2�A2�<--�First�partition�type/number. ŠREPEAT4�ADDQ.L�#1,D7ŽIncrement�for�each�sysgened�partition.1�LEA„12(A2),A2ŠA2�<--�Next�partition�type/number.<ŠUNTIL.W�(A2)��# $FFFF…Until�the�end�of�table�is�reached. .ŠMOVE.L�MAPENDA(A0),D5ˆD5�<--�end�of�partitionŠCLR.B‚D5”Form�"floor".6ŠMOVE.L�EEND(PC),D4‹D4�<--�End�of�exec�(from�INITDAT). PAGE:ŠIF.LƒD4��D5�THEN.S…If�end�of�exec�<�end�of�partition, *‚EXEC�IS�IN�PARTITION�ZERO: �ADD.L‚#255,D4ŒForm�"ceiling".#�CLR.B‚D4‘D4�<--�start_of_partition ;�LEA„255+ENDMEMT(PC),A6‚End�of�initdat�(from�INITDAT)�+�255!�MOVE.L�A6,D6ŽD6�=�end�of�initdat�CLR.B‚D6‘Form�"ceiling". #�MOVE.L�D6,A5ŽA5�<--�clear_mem_ptr. ‹ELSE.S *‚EXEC�IS�BEYOND�PARTITION�ZERO: =�MOVE.L�#ENDSYSP+255,D4„Form�"ceiling"�ENDSYSP�(from�SYSPAR).$�CLR.B‚D4‘D4�<--�start_of_partition.#�MOVE.L�D4,A5ŽA5�<--�clear_mem_ptr. ŠENDI '*‚SPECIAL�PROCESSING�FOR�ROMed�SYSTEMS:>*ˆIf�this�system�is�to�be�ROMed,�then�the�memory�map�table�and?*ˆassociated�free�memory�arrays�must�be�moved�to�RAM.‚The�rules<*ˆstate�that�when�the�exec�is�in�a�partition�other�than�zeroE*ˆthen�system�memory�start�right�after�SYSPAR.‚We�use�that�assumptionB*ˆhere,�and�change�the�start_of_partition�and�clear_memory_pointer?*ˆto�point�to�the�end�of�syspar�PLUS�the�space�required�for�the'*ˆmemory�tables�for�ROMed�systems�only. 9‰IF.LƒTCBHEAD(PC)��D0�THEN.SƒIf�this�is�ROMed�system,1ŠMULU†#128,D7ŒMultiply�count�of�paritions�by�128.5ŠADD.L…#$1FF,D7‹Add�bytes�for�memmap�table�plus�some.*ŠCLR.B…D7‘Clear�lsb�for�256-byte�boundary.,ŠMOVE.L„D4,A1ŽA1�<--�destination_memtbl_ptr.'ŠADD.L…D7,D4ŽChange�start_of_partition.*ŠMOVE.L„D4,A5ŽChange�clear_memory_pointer. ŠMOVE.L�D7,A6ŽLENGTH�IN�A6ŠADD.L‚A1,A6ŽEND�+�1�IN�A6;IPTRSCLR‚MOVE.L�D0,-(A6)‹STORE�ONE�WORD�(D0�IS�ALWAYS�ZERO)ŠCMP.L‚A1,A6ŽDONE?'ŠBHI.S‚IPTRSCLR‹BRANCH�BACK�IF�NOT�DONE '‰ELSE.S˜Else�we're�a�simple�RAM�system.<ŠLEA„255+STARTMAP(PC),A1ƒStart�of�table�space(INITDAT)�+�255 ŠMOVE.L�A1,D1ŠCLR.B‚D1”Form�"ceiling"+ŠMOVE.L�D1,A1‘A1�<--�destination_memtbl_ptr‰ENDI "ŠMOVE.L�A1,MAPBEG�Store�in�SYSPAR.2ŠLEA„256(A1),A3ŒA3�<--�fm_header_addr�partition�0. 5ŠIF.L�D4��D5�THEN.S‡If�start�>=�end�of�partition,1�KILL.EXECT0ƒBUDYIMEMSA,PT_PTRS_BADˆGo�to�killer.ŠENDI =ŠMOVE.L�A5,LOWFREE(A3)ˆSave�to�use�when�we�free�memory�later. ŠRTSŠPAGEL***************************************************************************** *ˆINEXTMEM*;*ˆInitializes�all�partitions�except�partition�zero.‚For�ROMF*ˆpartitions,�we�make�an�entry�in�the�dest_memtbl.‚For�RAM�partitions,?*ˆwe�insure�that�no�conflict�exists�with�a�previously-describedE*ˆpartition,�build�the�FMA,�build�the�FM_HEADER,�and�make�an�entry�in*ˆthe�dest_memtbl.*?*ˆ-�Loop�until�the�MAPMTYP�and�MAPPART�fields�of�the�next�entry>*Šin�the�src_memtbl�both�contain�$FF�(this�indicates�the�end).=*ŠWhen�the�end�is�reached,�write�an�end�entry�in�dest_memtbl.*B*ˆ-�For�every�good�entry�in�the�src_memtbl�call�init_next_pointers*Šfor�this�memory�partition.*A*ˆ-�If�MAPMTYP�of�the�src_memtbl�=�$FF,�its�ROM�so�call�BROM_ENT.*A*ˆ-�If�RAM�partition�in�the�src_memtbl,�call�CMEMCONF�to�validate@*Špartition�parameters�do�not�conflict�with�previous�partitions.@*ŠIf�got_alias_partition_flag�is�set�upon�return,�call�BRAM_ENT.8*ŠIf�got_alias_partition_flag�is�reset�upon�return,�call8*ŠSIZEMEM�to�size�memory.‚If�successful,�cll�BFM_HEAD�to1*Šbuild�the�free�memory�array,�and�then�BRAM_ENT.*>*ˆ-�If�there�was�no�memory�in�the�current�partition,�reset�the?*Šdest_memtbl_ptr�to�point�to�previous�entry�to�ignore�the�null*Šentry.**ˆEntry:„A0�=�src_memtbl_ptr;0*’(Points�to�the�first�entry�in�the�src_memtbl.)*’A1�=�dest_memtbl_ptr;1*’(Points�to�the�first�entry�in�the�dest_memtbl.)*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*�*�*�*�*�**™A‚P�P�*�*�*�*�***ˆExit:…Dest_memtbl.*’FM�for�all�RAM�partitions.$*’FM_HEADERs�for�all�RAM�partitions.*B*ˆCalls:„INEXTPTRS,�BROM_ENT,�CMEMCONF,�SIZEMEM,�BFM_HEAD,�BRAMENT*"*ˆExits�to:�RTS�to�caller�if�okay.*’KILLER�if�not�okay.*L******************************************** ********************************ŠPAGE INEXTMEM: ;ŠWHILE.W�12(A0)��#$FFFF�DO.SˆWhile�entries�still�exist,  )�BSR.S‚INEXTPTRS”Call�init_next_pointers. #�IF.Bƒ(A0)��#$FF�THEN.SˆIf�ROM, *�BSR„BROM_ENT’Call�build_rom_memtbl_entry. �ELSE.SžElse�its�not�ROM, 3�LEA„128(A3),A3ˆA3�<--�fm_header_addr�(next�entry).=�MOVE.L�A5,LOWFREE(A3)‚Save�to�use�when�we�free�memory�later.)�BSR„CMEMCONF’Call�check_memmap_conflict, '�TST.B‚D2˜Check�flag�ret'd�by�CMEMCONF. �IF…�THEN.S�If�SET�then, *“BSR„BRAM_ENT�Call�build_ram_memtbl_entry. �ELSE.S›If�CLEAR�then, “BSR.S‚SIZEMEM�Call�size_memory. #“BSR„BFM_HEAD�Call�build_fm_header, *“BSR„BRAM_ENT�Call�build_ram_memtbl_entry. �ENDI�ENDIŠENDW <ŠMOVE.W�#$FFFF,MAPMTYP+MAPENTSZ(A1)…Mark�end�of�dest_memtbl! ŠRTSŠPAGEK**************************************************************************** *ˆINEXTPTRS*A*ˆInitializes�all�pointers�and�counters�for�all�memory�partitions*ˆexcept�partition�zero.*E*ˆ-�Set�start_of_partition�to�the�"ceiling"�of�the�MAPSTRA�field,�andA*Šend_of_partition�to�the�"floor"�of�MAPENDA�field�in�src_memtbl.*9*ˆ-�Set�clear_mem_ptr�to�the�value�of�start_of_partition.*C*ˆ-‚If�partition�does�not�have�positive�amt�of�memory,�call�KILLER.*&*ˆEntry:„A0�=�previous�src_memtbl_ptr. *’A1�=�previous�dest_memtbl_ptr.*’A1�=�previous�fm_header_addr.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7 *™DŠR�RƒR *™A‚P�PƒRƒR*$*ˆExit:…A0�=�current�src_memtbl_ptr.*’A1�=�current�dest_memtbl_ptr.*’A3�=�current�fm_header_addr.*’A5�=�clear_mem_ptr.*’D4�=�start_of_partition.*’D5�=�end_of_partition.*"*ˆExits�to:�RTS�to�caller�if�okay.*’KILLER�if�not�okay.*J************************************************************************** INEXTPTRS:2ŠLEA„12(A0),A0�A0�<--�src_memtbl_ptr�(next�entry).9ŠLEA„MAPENTSZ(A1),A1‡A1�<--�dest_memtbl_ptr�(next�entry). 7ŠMOVE.L�MAPSTRA(A0),D4ˆStart�of�partition�(from�SYSPAR)ŠADD.L‚#255,D4�Form�"ceiling".#ŠCLR.B‚D4”D4�<--�start_of_partition&ŠMOVE.L�D4,A5‘A5�<--�clear_memory_ptr. 5ŠMOVE.L�MAPENDA(A0),D5ˆEnd�of�partition�(from�SYSPAR),ŠCLR.B‚D5”Form�"floor"�<--�end�of_partition. M* See if the exec is in this partition (start_of_p < end of exec =< end_of_p) =‰IF.W�(A0)��#$FF00�THEN.S‚If�this�is�NOT�a�ROM�partition, 4‰IF.L�EEND(PC)��D4�AND.L�EEND(PC)��D5�THEN.S6ŠMOVE.L�EEND(PC),D4‹Start�of�partition�is�end�of�exec.;ŠLEA„255+ENDMEMT(PC),A5„End�of�initdat�(from�INITDAT)�+�255!ŠMOVE.L�A5,D6‘D6�=�end�of�initdatŠCLR.B‚D6”Form�"ceiling".*ŠMOVE.L�D6,A5‘A5�<--�clear_memory_pointer.‰ENDI ‰ENDI 5ŠIF.LƒD4��D5�THEN.S…If�start�>=�end�of�partition,1�KILL.EXECT0‚BUDYIMEMSA,PT_PTRS_BAD„Go�to�killer.ŠENDIŠRTSŠPAGEO******************************************************************************** *ˆSIZEMEM*<*ˆSize_memory�will�zero�out�memory�starting�at�clear_mem_ptrD*ˆand�build�the�Free�Memory�Array�to�describe�the�partition.�It�also?*ˆdetects�"holes"�in�the�partition,�so�that�only�memory�that�is+*ˆ"free"�gets�put�on�the�Free�Memory�Array.*E*ˆ-�Initialize�start_clear_mem_ptr�to�the�value�of�the�clear_mem_ptr.*B*ˆ-�Set�up�the�stack�so�that�any�bus�error�will�send�us�to�BFM_BE.A*ŠThis�is�the�code�used�for�mapping�out�"holes"�in�the�partition.*@*ˆ-�Loop�until�we�clear�the�rest�of�the�current�memory�partitionC*Š(fall�through�the�loop),�OR�find�a�hole�in�memory�(go�to�BFM_BE).*D*ˆ-�If�we�do�clear�memory�to�the�end�of�the�current�partition�within@*Šthis�loop,�we�pop�the�bus�error�vector�junk�off�the�stack,�and@*Šcalculate�bytes_cleared�(clear_mem_ptr�-�start_clear_mem_ptr).*E*ˆ-�When�a�hole�is�encountered,�bytes_cleared�is�"frozen"�to�remember@*Šthe�number�of�"good"�bytes�within�the�current�block.‚IncrementC*Šclear_mem_ptr�(by�256�bytes)�until�we�reach�the�end�of�partition,@*Šor�we�find�some�more�"good"�memory.‚At�that�point,�the�currentC*Šblock�will�be�fr amed�by�the�A4�=�start_clear_mem_ptr,�A5�=�clear_D*Šmem_ptr�(end),�and�D6�=�bytes�cleared�(#�of�bytes�of�free�memory).*G*ˆ-�Call�BLAST_ENT�to�build�last�free�memory�array�when�number�of�bytes*Šcleared�is�greater�then�zero.*D*ˆ-�Note�that�the�C_NEXT_ENT�and�BLAST_ENT�labels�can�both�be�jumped)*Što�by�the�code�for�handling�bus�errors.**ˆEntry:„A3�=�fm_header_addr.*’A5�=�clear_mem_ptr.*’D0�=�0*’D4�=�start_of_partition.*’D5�=�end_of_partition.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚P�*�*�*�P�P�* *™A†*�PƒP***ˆCalls:„BFMA_ENT*)*ˆExit:…Must�Preserve�A0,�A1,�A3,�D4,�D5.7*’Free�memory�array�is�built�for�the�current�partition.*"*ˆExits�to:�RTS�to�caller�if�okay.*’KILLER�if�not�okay.*O*******************************************************************************ŠPAGESIZEMEM: ** Clear next entry:* C_NEXT_ENT:.ŠCLR.L‚D1”Zero�D1/D2/D3�used�for�clearing�mem. ŠCLR.L‚D2”* ŠCLR.L‚D3”* 'ŠLEA„(A5),A4�A4�<==�start_clear_mem_ptr 3***‡LEA„(A5,D6.L),A5ŠNO�OFFSET�DUE�TO�BYTES�CLEARED 3ŠPEA„BFM_BE(PC)ŒPush�addr�of�our�bus�error�handler.%ŠMOVE.W�#'BE',-(A7)‹BE�for�bus�error. AŠWHILE.L�A5��D5�DO.S†While��as�SYSGENed�end�of�partition. NNNNNN:�MOVEM.L�D0-D3,(A5)ˆClear�memory�four�longwords�at�a�time.*�NOP—This�NOP�forces�the�execution�unit�to&*§wait�until�the�bus�interface�unit�is(*§done�on�a�68020,�in�case�of�bus�error.6�LEA„16(A5),A5ŠIncrement�clear_mem_ptr�by�4�longwords.ŠENDW *ŠADD.L‚#6,A7‘Pop�bus�error�junk�off�stack. 5ŠMOVE.L�A5,D6‘Sub�start_clear_mem�from�clear_mem_ptr."ŠSUB.L‚A4,D6‘D6�<==�bytes_cleared.**‚Build_last_fma_entry:* BLAST_ENT:>ŠIF.LƒD6��D0�THEN.S…If�bytes_cleared�is�greater�than�zero,(�BSR.S‚BFMA_ENT‹then�build�an�fma_entry.ŠENDI ŠRTSŠPAGEO********************************************************************************C*ˆThis�code�is�executed�when�a�hole�is�found�while�clearing�memory.:*ˆExecution�will�"go�to"�BFM_BE�if�a�bus�error�occurs�when9*ˆclearing�memory�via�the�loop�in�the�SIZEMEM�subroutine.@*ˆExecution�will�"go�to"�the�BFM_BEX�label�if�a�bus�error�occursA*ˆwhile�looking�at�the�top�of�each�page�for�the�next�"good"�page.*<*ˆFirst�calculate�bytes_cleared�to�be�the�difference�between;*ˆclear_mem_ptr�and�start_clear_mem_ptr.‚Call�KILLER�if�the7*ˆbus�error�occurred�in�the�middle�of�a�256�byte�block.*>*ˆUpdate�clear_mem_ptr�to�point�to�the�top�of�the�next�page�in@*ˆmemory.‚If�at�the�end�of�the�current�par tition,�call�BFMA_ENT.*?*ˆIf�not�at�the�end�of�the�partition,�set�the�stack�up�so�a�busA*ˆerror�will�send�us�back�to�the�BFM_BEX�label.‚Write�into�memoryE*ˆat�clear_mem_ptr.�If�a�bus�error�occurs,�execution�goes�to�BFM_BEX.NNB*ˆLoop�until�we�run�out�of�memory�partition�or�find�"good"�memory.*B*ˆIf�we�"fall�through"�to�the�next�instruction�(find�a�good�memoryD*ˆlocation),�then�get�rid�of�the�bus�error�information�on�the�stack.F*ˆIf�some�good�memory�exists�in�the�current�block�(bytes_cleared�>�0),E*ˆthen�call�BFMA_ENT�to�build�the�FMA�for�the�current�block�and�reset5*ˆbytes_cleared�to�zero.‚Always�branch�to�C_NEXT_ENT.*O******************************************************************************* BFM_BE:(ŠMOVE.L�A5,D6‘"freeze"�bytes�cleared�as,1ŠSUB.L‚A4,D6‘clear_mem_ptr�-�start_mem_clear_ptr.9ŠIF.BƒD6��D0�THEN.S…Must�have�#�bytes�not�equal�zero."�KILL.EXECT0‚BUDYIMEMSA,BAD_MEMORYŠENDI BFM_BEX:5ŠLEA„256(A5),A5ŒIncrement�clear_mem_ptr�by�256�bytes.=ŠIF.LƒA5��D5�THEN.S…If�end_of_partition�has�been�reached,2�BRA„BLAST_ENTŠbranch�to�build�the�last�FMA�entry.ŠENDI 9ŠPEA„BFM_BEX(PC)‹Put�the�address�of�BEX�routine�on�stack.)ŠMOVE.W�#'BE',-(A7)‹and�BE�for�bus�error.7ŠMOVE.W�D0,(A5)�Test�first�word�of�this�256�byte�block.*ŠNOPšThis�NOP�forces�the�execution�unit�to&*§wait�until�the�bus�interface�unit�is#*§done�on�a�68020,�in�of�bus�error. )ŠADD.L‚#6,A7‘Pop�bus�error�junk�of�stack.=ŠIF.LƒD6��D0�THEN.S…If�#�bytes�cleared�is�greater�than�0,&�BSR.S‚BFMA_ENT‹go�to�build�FMA�entry.ŠENDI +ŠBRA„C_NEXT_ENTŒBranch�to�check�next�entry.ŠPAGEJ*************************************************************************** *ˆBFMA_ENT*F*ˆBuilds�the�free�memory�array�for�the�current�block�in�the�partition.**ˆEntry:„A3�=�fm_header_addr.*’A4�=�start_clear_memory_ptr.*’D6�=�bytes_cleared.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™DŽP*™AˆP�P*2*ˆCalls:„TRAP�#0�directive�T0FRBLK�to�do�the�work.**ˆExits�to:�RTS�to�caller.*O******************************************************************************* BFMA_ENT:0ŠMOVE.Lƒ#T0FRBLK,D0“Call�free_block�in�PAGEFRE�.#ŠTRAP…#0œNo�possible�error�returns.ŠCLR.L„D0œRestore�D0�to�zero.ŠRTSŠPAGEK**************************************************************************** *ˆBFM_HEAD*@*ˆGiven�the�block�of�memory�to�contain�the�FM_HEADER�,�build�the.*ˆFM_HEADER�to�describe�the�current�partition.*2*ˆ-�Set�stravail�and�endavail�to�the�values�of�the8*Šstart_of_partition�and�end_of_partition,�respectively.*B*ˆ-�Move�the�MAPMTYP�and�MAPPART�fields�from�the�src_memtbl�to�the4*ŠFM_HEADER�node,�and�set�up�the�semaphore�counters.**ˆEntry:„A0�=�src_memtbl_ptr.*’A3�=�fm_header_addr.*’D4�=�start_of_partition.*’D5�=�end_of_partition.**ˆExits�to:�RTS�to�caller.*K*************************************************************************** BFM_HEAD: 2ŠMOVE.L�D4,STRAVAIL(A3)ŽStart�of�available�memory,0ŠMOVE.L�D5,ENDAVAIL(A3)ŽEnd�of�available�memory, :ŠMOVE.W�MAPMTYP(A0),MEMTYPE(A3)†Memory�type�and�partition, 6ŠMOVE.W�#1,SEMFRMEM(A3)ŽInitialize�semaphore�fields...ŠCLR.L‚SEMFRMEM+2(A3)ŠCLR.W‚SEMWTMEM(A3)ŠCLR.L‚SEMWTMEM+2(A3) ŠRTSŠPAGEO******************************************************************************** *ˆCMEMCONF*A*ˆThis�subroutine�checks�the�RAM�partition�described�by�the�entry@*ˆin�the�src_memtbl�pointed�to�by�the�src_memtbl_ptr�against�allC*ˆpreviously-describ ed�RAM�partitions.‚If�this�subroutine�detects�aB*ˆfatal�conflict�it�will�not�return�execution�to�the�caller.‚If�itA*ˆdetects�an�alias�partition�(same�starting�address�as�some�otherD*ˆpartition),�it�returns�execution�with�the�got_alias_partition_flagB*ˆset.�(Alias�partition�is�a�concept�developed�a�few�versions�back;*ˆwith�multi-processing�in�mind.‚It�is�currently�not�used.)7*ˆOtherwise,�it�returns�execution�with�that�flag�reset.*B*ˆ-�Initialize�got_alias_partition_flag,�current_partition_number,*Šand�temp_memtbl_ptr.*4*ˆ-�If�duplicate�partition�number,�then�call�KILLER.*F*ˆ-�If�duplicate�start_of_partition,�set�the�got_alias_partition_flag,@*Šset�the�fm_header_addr�=�MAPFML�of�alias�partition�and�return.*D*ˆ-�If�current�start_of_partition�is�at�a�lower�memory�location�than?*Šthe�ENDAVAIL�field�of�a�previous�partition,�then�call�KILLER.*>*ˆ-�Otherwise,�loop�until�we�have�looked�at�all�the�previously1*Šdefined�entries�in�the�dest_memtbl,�and�return.**ˆEntry:„A0�=�src_memtbl_ptr.*’A1�=�dest_memtbl_ptr.*’D4�=�start_of_partition.*&*ˆExit:…D2�=�got_alias_partition_flag.:*’A3�=�fm_header_addr�(if�got_alias_partition_flag�=�set).*!*ˆRegister�usage:…0�1�2�3�4�5�6�7 *™D„*�RƒP *™A‚P�P�*‡***@*ˆExits�to:�RTS�to�caller�with�got_alias_partition_flag�if�okay.*’KILLER�if�not�okay.*J**************************************************************************ŠPAGE CMEMCONF: )ŠCLR.B‚D2”Reset�got_alias_partition_flag. ŠMOVE.B�MAPMTYP(A0),D1-ŠAND.B‚#$0F,D1�D1�=�current_partition_number. )ŠMOVE.L�MAPBEG,A2�A2�<--�temp_memtbl_ptr. ŠREPEAT :�IF.BƒMAPPART(A2)��D1�THEN.SƒIf�duplicate�partition�#,/�KILL.EXECT0ƒBUDYIMEMSA,PT_DUPNUM„Go�to�killer.�ENDI =�IF.LƒMAPSTRA(A2)��D4�THEN.SƒIf�duplicate�start�part�ptr,$�ST…D2˜Set�got_alias_partition_flag,-�MOVE.L�MAPFMLP(A2),A3ŒA3�<--�fm_header_addr. �RTSžReturn.�ENDI '�IF.Bƒ(A2)��#$FF�THEN.SˆIf�not�ROM, /�MOVE.L�MAPFMLP(A2),A6�If�overlapping-duplicate3�IF.LƒD4��ENDAVAIL(A6)�THEN.S‚partition�number,8�KILL.EXECT0‚BUDYIMEMSA,PT_END_START_OVERLAP‚Call�KILLER�ENDI�ENDI 0�LEA„MAPENTSZ(A2),A2ŽGet�next�temp_memtbl_ptr... ,ŠUNTIL.L�A2��A1•Until�temp�=�destination ŠRTSŠPAGEL***************************************************************************** *ˆBRAM_ENT*B*ˆThis�subroutine�writes�in�all�pointers�and�descriptors�for�a�RAM%*ˆpartition�entry�in�the�dest_memtbl.*D*ˆ-�The�MAPMTYP�field�of�the�dest_memtbl_entry�gets�set�equal�to�theD*Šmost�significant�four�bits�of�the�MAPPART�field�of�the�src_memtbl_F*Šentry,�and�the�MAPPART�field�of�the�dest_memtbl_entry�gets�set�equal7*Što�the�four�least�significant�bits�of�the�same�field.*?*ˆ-�Set�the�MAPSTRA�field�of�the�dest_memtbl_entry�equal�to�the8*Šstart_of_partition,�and�the�MAPFMLP�field�equal�to�the*Šfm_header_addr,�and�return.**ˆEntry:„A0�=�src_memtbl_ptr.*’A1�=�dest_memtbl_ptr.*’A3�=�fm_header_addr.*’D4�=�start_of_partition.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7 *™D„*�*ƒP *™A‚P�P‡P*7*ˆExit:…Dest_memtbl_entry�(RAM�entry)�pointed�to�by�the*’dest_memtbl_ptr.**ˆExits�to:�RTS�to�caller*K*************************************************************************** BRAM_ENT:>ŠMOVE.B�MAPMTYP(A0),D1ˆMemory�type�and�partition�(from�SYSPAR)ŠMOVE.B�D1,D2‘Save�it.3ŠAND.B‚#$70,D1�AND�it�to�get�memory�type�(bits�7-4)'ŠMOVE.B�D1,MAPMTYP(A1)ˆStore�in�MEMMAP. 1ŠAND.B‚#$0F,D2�AND�it�to�get�partition�(bits�3-0)'ŠMOVE.B�D2,MAPPART(A1)ˆStore�in�MEMMAP. 5ŠMOVE.L�D4,MAPSTRA(A1)ˆStart�of�partition�-->�MAPSTRA 5ŠMOVE.L�A3,MAPFMLP(A1)ˆFML�header�address�-->�MAPFMLP ŠRTSŠPAGEK**************************************************************************** *ˆBROM_ENT*C*ˆThis�subroutine�does�some�primitive�checking�on�the�legality�of�a@*ˆROM�partition�described�in�the�src_memtbl,�and�then�writes�theF*ˆdescriptors�and�pointers�to�describe�that�node�into�the�dest_memtbl.*C*ˆ -�Verify�that�the�current�ROM�partition�does�not�start�at�a�lower>*‹memory�location�than�the�ending�of�the�last�partition�in�the'*Šdest_memtbl.‚If�it�does,�call�KILLER.*F*ˆ-�Otherwise,�move�the�MAPMTYP�and�MAPPART�fields�from�the�src_memtbl?*Što�the�dest_memtbl,�set�the�MAPSTRA�and�MAPENDA�fields�of�theA*Šdest_memtbl�equal�to�the�start_of_partition�and�end_of_part_ptr*Šrespectively,�and�return.**ˆEntry:„A0�=�src_memtbl_ptr.*’A1�=�dest_memtbl_ptr.*’D4�=�start_of_partition.*’D5�=�end_of_partition.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™DŠP�P *™A‚P�P�*‡**7*ˆExit:…Dest_memtbl_entry�(ROM�entry)�pointed�to�by�the*’dest_memtbl_ptr.*"*ˆExits�to:�RTS�to�caller�if�okay.*’KILLER�if�not�okay.*L**************************************************************************** BROM_ENT:8ŠIF.BƒMAPMTYP-MAPENTSZ(A1)��#$FF�THEN.S…If�ROM�then,:ŠIF.LƒD4��MAPENDA-MAPENTSZ(A1)�THEN.S‡If�overlap�then,5‹KILL.EXECT0‚BUDYIMEMSA,PT_RORO_OVERLAPˆGo�to�killer.ŠENDI ŠELSE.S¡Else�its�RAM,ŠMOVE.L�MAPFMLP-MAPENTSZ(A1),A6>ŠIF.L�D4��ENDAVAIL(A6)�THEN.S‡If�overlaps�exist�partition,5‹KILL.EXECT0‚BUDYIMEMSA,PT_RARO_OVERLAP„Go�to�killer.ŠENDIŠENDI AŠMOVE.W�MAPMTYP(A0),MAPMTYP(A1)‚MAPMTYP�(from�SYSPAR)�-->�MAPMTYP5ŠMOVE.L�D4,MAPSTRA(A1)ˆStart�of�partition�-->�MAPSTRA3ŠMOVE.L�D5,MAPENDA(A1)ˆEnd�of�partition�-->�MAPENDA ŠRTS ŠEND NNNNN'M146818 RDTIMER AFŸŸ  TIMEINT AF¨¨  RDTIMER SA±±7  TIMEINT SAººI  =/*=/*†M146818.RDTIMER.AF=/*@=/* Chain file to assemble file for M146818 Real Time Clock chip=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M146818.RDTIMER.LS=/*=/IFC \1ƒ=ARG�M146818.RDTI MER.LS=/ENDIF=/*3=ASM M146818.RDTIMER.SA,M146818.RDTIMER.RO,\1;RZ=40=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDNNNNNN—=/*=/*†M146818.TIMEINT.AF=/*7=/* Chain file to assemble M146818.TIMEINT.SA for 68010=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M146818.TIMEINT.LS=/*=/IFC \1ƒ=ARG�M146818.TIMEINT.LS=/ENDIF=/*E=ASM M68010.M68010.SA/M146818.TIMEINT.SA,M146818.TIMEINT.RO,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9999.M146818.M146818.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9999.M68XXX.TIMEINT.AI=/*}=/*=ENDNNNNN  ŠPAGE**ˆINCLUDE�FILES**‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.INTERRUP.MCŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGEARDTIMERƒIDNTƒ45,0‹READ�TIMER�routine�for�M146818�real�time�clock.*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�RDTIMER‚1.00„**ˆ*’**ˆ*�HLD6ƒ09/30/80‚**ˆ*�SFF5ƒ01/18/83‚**ˆ*********************,*…READ�TIMER�-�RETURN�TIMER�VALUE�(MS)�IN�D1*™TIMER�VALUE�(US)�IN�D0*ŠSECTION�LEVEL00* ŠXDEFƒRDTIMER ŠXDEFƒSBRDTIM  **ˆSYSPAR�parameters* ŠXREF.S�NSEŠXREF.S�MIDNIGHTŠXREF.S�TIME_LEFTŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAGŠPAGESBRDTIM:RDTIMER:'ŠMOVE.W�SR,-(A7)‹Value�to�use�in�unmask/ŠMOVE.L�#1000,D0‹1000�-�TIMINTV4�=�microsecondsŠDISABLE_INTERRUPTS %ŠMOVE.L�NSE,D1�Next�significant�eventŠSUB.L‚TIME_LEFT,D10ŠSUB.L‚MIDNIGHT,D1ˆD1�=�current�ms�past�midnight#ŠBCLRƒ#31,D1�Insure�positive�numberŠSUB.W‚TIMINTV4,D0ˆMICROSECONDS ŠMOVE.W�(A7)+,SRŠRTSŠENDNNN©8ŠPAGE**ˆINCLUDE�FILES**ˆINCLUDE�9995.&.STR.EQ!*ˆINCLUDE�9999.M146818.M146818.EQ*ˆINCLUDE�9995.&.BAB.EQ*ˆINCLUDE�9995.&.PAT.EQ*ˆINCLUDE�9995.&.TR1RTCD.EQ*ˆINCLUDE�9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQ ŠINCLUDE�9999.M146818.M146818.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.INTERRUP.MCŠLIST@TIMEINTƒIDNTƒ45,0ŒTIMER�INTERRUPT�HANDLER�FOR�M146818�CLOCK�CHIP*$*‰COPYRIGHTED�1983�BY�MOTOROLA,�INC.*.*†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�15.625�MS**•01/18/83‚(SFF5)*•04/07/83‚(7616)*:*•08/15/83‚Steve�Franck�--�Changed�to�exit�through�COMINT.*ŠSECTION�LEVEL00* ŠXDEFƒTIMEINT ŠXREF.S�DATEŠXREF.S�PATBEGŠXREF.S�PREEMPT_FLAGŠXREF.S�PTMADDRŠXREF.S�TIME_LEFTŠXREF.S�TIMESLICŠXREF.S�TIMEOUTŠXREF.S�TIMINTVŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAG ŠXREFƒTRACERŠXREF.S�TRACFLAG ŠXREFƒBKG_SCHEDULE ŠXREFƒCKDELAY ŠXREFƒCKEXPAŠXREFƒPAT_RM_1ST_NODE**0TIMEINTƒMOVEM.L�D0-D1/A0-A1,-(A7)�SAVE�REGISTERS ŠMOVE.L�PTMADDR,A0‰TIMER�ADDRESS6ŠMOVE.B�REGC(A0),D0ˆREAD�REGC�TO�CLEAR�TIMER�INTERRUPT ŠCLR.W‚D04ŠMOVE.L�#15,D1�Amount�of�time�to�decrement�TIME_LEFT-ŠMOVE.W�SR,-(A7)‹Value�to�use�in�unmask�laterŠDISABLE_INTERRUPTSˆMask.ŠSUB.W‚#625,TIMINTV4†625�usec�HAVE�ALSO�PASSEDŠIF��THEN.S�ADD.L‚#1,D1‹Add�the�extra�ms"�ADD.W‚#1000,D0ˆand�Reset�us�countŠENDI !ŠADD.W‚D0,TIMINTV4ˆReset�us�count.ŠSUB.L‚D1,TIME_LEFT‡Do�we�need�to�fire�a�node?ŠMOVE.W�(A7)+, SR‹Unmask+ŠTST.L‚TIME_LEFTŠDo�we�need�to�fire�a�node?0*‰INCLUDE�9999.M68XXX.TIMEINT.AI�Yes�-�so�do�it.ŠINCLUDE�9999.M68XXX.TIMEINT.AIŠENDN²J'VME117 TIMEINT AFÇÇ  KILLER AFÐÐ  KILLER SAÙÙ }  =/*=/*†VME117.TIMEINT.AF=/*6=/* Chain file to assemble VME117.TIMEINT.SA for 68010=/* with 6840 timer module=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to VME117.TIMEINT.LS=/*=/IFC \1ƒ=ARG�VME117.TIMEINT.LS=/ENDIF=/*B=ASM M68010.M68010.SA/M6840.TIMEINT.SA,VME117.TIMEINT.RO,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9999.M6840.M6840.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.PANEL.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9999.M68XXX.TIMEINT.AI=/*}=/*=ENDNNNNN¿ =/*=/*†VME117.KILLER.AF=/*@=/* Chain file to assemble VME117.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to VME117.KILLER.LS=/*=/IFC \1ƒ=ARG�VME117.KILLER.LS=/ENDIF=ARG‚\1,VME117.KILLER.RO=/*D=ASM M68010.M68010.SA/M68XXX.KILLER.SA/VME117.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*ƒ9999.VME117.CTRLREG.EQ=/*}=/*=ENDNNNNNȉLIST‰PAGE‰SPCƒ1&*–VME117�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VME117.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�BoardFail�LED.!*’2.‚Output�system�crash�message.A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 *ˆINCLUDE�FILES**ˆ9999.VME117.CTRLREG.EQ*‰NOLIST‰INCLUDE‚9999.VME117.CTRLREG.EQ‰OPT…CL‰LIST * *ˆEQUATES*HALFSEC‚EQU‡$5FFFF‰PAGE*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: (‰BSET.B‚#BDFAIL,M117MCRŠTURN�FAIL�LED�ON *C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‹Get�TRAP�#15�capability�flags�in�D12‰BTST„#T15IO,D1�Test�for�PHOENIX�TRAP�#15�su pport.,‰IFƒƒTHEN.SŒIf�yes,�then�output�message.*F*ˆTRAP�#15�PHOENIX�format�-�uses�A5,A6�to�point�to�string,�endstring+1*.‹LEA…MSGCRASH(PC),A5…Start�of�'SYSTEM�CRASHED'&‹LEA…ENDCRASH(PC),A6…End�of�string�+�1 ÑKÚ3,‹TRAP15‚BUGTRP15,KILLER4„Do�pseudo�TRAP�#15.KILLER4:)‹DC.W„5“Output�string,�no�added�CR�or�LF. #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D2�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 8OUTLOOP„ROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character)‹MOVE.L‚A7,A5�A5�=�start�of�output�string-*ŸA6�=�end�of�string�+�1�(set�up�by�HXTOASCI)‹TRAP15‚BUGTRP15,OUTNEXTOUTNEXT:#‹DC.W„5“Output�string,�no�CR�or�LF.‹PAGE#*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹DBRA„D2,OUTLOOPŠOutput�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack. -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. *‹LEA…MSGBLANK(PC),A5…Start�of�blank�string,‹LEA…ENDBLANK(PC),A6…End�of�blank�string�+�1 +‹TRAP15‚BUGTRP15,KILLER5„Do�pseudo�TRAP�#15KILLER5:#‹DC.W„5“Output�string,�no�CR�or�LF. #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. 5‹BRA…KILLOOP�Branch�back�to�create�a�flashing�message ‰ELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ‰ENDI  ‰ENDNN'M68000 TRAP1 AFîî  M68000 SA÷÷  =/*=/*†M68000.TRAP1.AF=/*6=/* Chain file to assemble M68XXX.TRAP1.SA for a 68000=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68000.TRAP1.LS=/*=/IFC \1ƒ=ARG�M68000.TRAP1.LS=/ENDIF=/*>=ASM M68000.M68000.SA/M68XXX.TRAP1.SA,M68000.TRAP1.RO,\1;RZ=75=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=END NNNNNNæ ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68000‚Type�of�processorNNNNNNNï  'M68010 TRAP1 AF  M68010 SA    =/*=/*†M68010.TRAP1.AF=/*6=/* Chain file to assemble M68XXX.TRAP1.SA for a 68010=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68010.TRAP1.LS=/*=/IFC \1ƒ=ARG�M68010.TRAP1.LS=/ENDIF=/*>=ASM M68010.M68010.SA/M68XXX.TRAP1.SA,M68010.TRAP1.RO,\1;RZ=75=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDNNNNNNü ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68010‚Type�of�processorNN  NNNNN'M68020 TRAP1 AF  M68020 SA##  =/*=/*†M68020.TRAP1.AF=/*6=/* Chain file to assemble M68XXX.TRAP1.SA for a 68020=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68020.TRAP1.LS=/*=/IFC \1ƒ=ARG�M68020.TRAP1.LS=/ENDIF=/*>=ASM M68020.M68020.SA/M68XXX.TRAP1.SA,M68020.TRAP1.RO,\1;RZ=90=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDNNNN! NN ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68020‚Type�of�processorNNNNNNN'M6840 RDTIMER AF00  TIMEINT AF99  RDTIMER SABBF  TIMEINT SAKKF  ! =/*=/*†M6840.RDTIMER.AF=/*+=/* Chain file to assemble M6840.RDTIMER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M6840.RDTIMER.LS=/*=/IFC \1ƒ=ARG�M6840.RDTIMER.LS=/ENDIF=/*/=ASM M6840.RDTIMER.SA,M6840.RDTIMER.RO,\1;RZ=50=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9999.M6840.M6840.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDNNNNNN(=/*=/*†M6840.TIMEINT.AF=/*5=/* Chain file to assemble M6840.TIMEINT.SA for 68000=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M6840.TIMEINT.LS=/*=/IFC \1ƒ=ARG�M6840.TIMEINT.LS=/ENDIF=/*A=ASM M68000.M68000.SA/M6840.TIMEINT.SA,M6840.TIMEINT.RO,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9999.M6840.M6840.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.PANEL.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9999.M68XXX.TIMEINT.AI=/*}=/*=ENDNNNN" N1ŠPAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9999.M6840.M6840.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9999.M6840.M6840.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE>RDTIMERƒIDNTƒ45,0ŽREAD�TIMER�routine�for�the�M6840�timer�chip.*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�RDTIMER‚1.00„**ˆ*’**ˆ*�HLD6ƒ09/30/80‚**ˆ*********************'*…READ�TIMER�-�RETURN�TIME�OF�DAY�IN�D1*™TIMER�VALUE�IN�D0*ŠSECTION�LEVEL00* ŠXDEFƒRDTIMER ŠXDEFƒSBRDTIM  ** SYSPAR parameters* ŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�PTMADDRŠXREF.S�TIME_LEFTŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAGŠPAGESBRDTIM:RDTIMER:!ŠMOVE.L�A0,-(A7)‹Don't�destroy�A0#ŠMOVE.L�PTMADDR,A0‰ADDRESS�OF�TIMER ŠCLR.L‚D1 ŠMOVE.W�SR,-(A7)ŠDISABLE_INTERRUPTS ŠMOVEP‚MSBT3(A0),D1‡READ�TIMER�3ŠMOVE.W�D1,D0ŽSAVE�TIMER�VALUEŠLSR.W‚#8,D1ŽGET�MS�BYTE�ONLY ŠNEG.W‚D1.ŠADD.W‚TIMINTV4,D1ˆ#�TIMES�COUNTER�DECREMENTEDŠLSR.W‚#2,D1ŽWANT�TIMEINTV�ONLY-ŠADD.L‚NSE,D1�Add�next�significant�event�timeŠSUB.L‚TIME_LEFT,D10ŠSUB.L‚MIDNIGHT,D1ˆD1�=�current�ms�past�midnight "ŠMOVE.W�(A7)+,SR‹Unmask�interrupts #ŠBCLRƒ#31,D1�Insure�positive�numberŠMOVE.L�(A7)+,A0ŠRTSŠENDNN:GŠPAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9999.M6840.M6840.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.PANEL.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9999.M6840.M6840.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.PANEL.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTCTIMEINTƒIDNTƒ45,0‰TIMER�INTERRUPT�HANDLER�FOR�THE�M6840�TIMER�CHIP.*$*‰COPYRIGHTED�1980�BY�MOTOROLA,�INC.*,*†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�TIMINTV**ˆREV‚2.00„02/08/81‚(HLD6)*ˆREV‚3.00„11/06/81‚(HLD6)*ˆREV‚3.10„02/09/82‚(HLD6)*.*•09/83‚SJF�--�Changed�to�exit�through�COMINT;*£eliminated�VM01FLAG�stuff.*ŠSECTION�LEVEL00* ŠXDEFƒTIMEINT ŠXREF.S�DATE ŠXREF.S�PANELŠXREF.S�PATBEGŠXREF.S�PREEMPT_FLAGŠXREF.S�PTMADDRŠXREF.S�TIME_LEFTŠXREF.S�TIMEOUTŠXREF.S�TIMESLICŠXREF.S�TIMINTV ŠXREFƒTRACERŠXREF.S�TRACFLAG ŠXREFƒBKG_SCHEDULE ŠXREFƒCKDELAY ŠXREFƒCKEXPAŠXREFƒPAT_RM_1ST_NODE*0TIMEINTƒMOVEM.L�D0-D1/A0-A1,-(A7)�SAVE�REGISTERS-SRSTACKƒSET…(2*4)+(2*4)‡Offset�to�SR�on�stack!ŠMOVE.L�PANEL,A0‹ADDRESS�OF�PANEL(ŠM" OVE.B�#0,FPTTO(A0)‡KEEP�READY�LIGHT�ON ŠMOVE.L�PTMADDR,A0‰TIMER�ADDRESS!ŠMOVE.B�CR2SR(A0),D0‡CLEAR�STATUS'ŠMOVE.B�MSBT3(A0),D0‡CLEAR�T3�INTERRUPT 1ŠCLR.L‚D1‘D1.L�<--�time�interval�corresponding�to'ŠMOVE.W�TIMINTV,D1‰a�tick�of�the�timer.2ŠSUB.L‚D1,TIME_LEFT‡Do�we�need�to�fire�a�PAT�node?4*‰INCLUDE�9999.M68XXX.TIMEINT.AI‚Yes�-�fire�the�nodeŠINCLUDE�9999.M68XXX.TIMEINT.AIŠENDNCG'M68451 LOADMMU AFXX  LOADMMU SAaa?J  =/*=/*†M68451.LOADMMU.AF=/*,=/* Chain file to assemble M68451.LOADMMU.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68451.LOADMMU.LS=/*=/IFC \1ƒ=ARG�M68451.LOADMMU.LS=/ENDIF=/*2=ASM M68451.LOADMMU.SA,M68451.LOADMMU.RO,\1;MRZ=65=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9999.M68451.M68451.EQ=/*ƒ9999.M68010.BUSERRFT.EQ=/*ƒ9995.&.KILL.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=ENDNNNNN# PŠNOLISTŠINCLUDE„9995.&.UTILITY.MCŠINCLUDE„9995.&.STR.EQŠINCLUDE„9995.&.TCB.EQŠINCLUDE„9995.&.TST.EQŠINCLUDE„9999.M68451.M68451.EQ ŠINCLUDE„9999.M68010.BUSERRFT.EQŠINCLUDE„9995.&.KILL.MCŠINCLUDE„9999.&.KILLEXEC.EQŠLISTCLOADMMU‚IDNT‚45,0…LOADMMU�SUBROUTINES�FOR�M68451�MMU�WITH�THE�68010‰SPCƒ1O*********************************************************************************ˆM68451.LOADMMU*F*ˆSubroutines�to�add�segments�and�delete�segments�from�the�M68451�MMU.7*ˆTasks�with�address�space�0�get�unmapped�entire�space.@*ˆTasks�with�other�address�spaces�get�only�their�assigned�space.1*ˆPage�fault�is�used�to�swap�segment�descriptors.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*'*ˆEntry:„A5�=�target�task's�TST�address*’D5�=�offset�to�TSTMMU�entry*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*�*�*�*�*�**™A„*‡P**™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed**D*ˆExit:‚RTS�to�caller‚(ADD_SEG_TO_MMU�AND�DEL_SEG_FROM_MMU�must�have*�condition�codes�set�)**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------:*ˆ10/30/85‚CBSŒChanged�KILLER�calls�to�use�KILL.EXEC�macro-*ˆ08/20/85‚CBSŒChanged�for�new�format�of�TST.@*ˆ07/26/85‚Julie�Hoban„Added�ADD_SEG_TO_MMU�subroutine.�Replaced+*¡UNLDMMU�subroutine�with�DEL_SEG_FROM_MMU.;*ˆ07/12/85‚CBSŒChanged�2�signed�branches�to�unsigned�for�32*¡32-bit�address�support.<*ˆ12/05/84‚SJFŒAdded�handling�to�MMUFAULT�for�the�case�where)*¡we�get�interrupted�out�of�the�bus�error-*¡handler�for�a�user�interrupt�which�causes�a/*¡bus�error�which�results�in�the�loading�of�the,*¡same�descriptor�as�the�original�bus�error.4*ˆ01/28/84‚SJFŒAdded�call�to�flush�cache�in�UNLDMMU.*ˆ02/28/83‚7616*O*******************************************************************************‰PAGE ‰SECTION�2 ‰OPT…CL Y@bbjOrKz?‚CŠ<’Q**‚XDEF's*‰XDEF†ADD_SEG_TO_MMU‰XDEF†ADD_SEG2 ‰XDEF†CRASN ‰XDEF†DEASN‰XDEF†DEL_SEG_FROM_MMU ‰XDEF†LOADMMU‰XDEF†LOADMMUI‰XDEF†MMUFAULT  **‚XREF's*‰XREF†FLUSH_ON_CONTEXT_SWITCH ‰XREF.S„ASNTBL‰XREF.S„CURR_ASN‰XREF.S„CURRSD‰XREF.S„CURR451‰XREF.S„FRST451‰XREF.S„LAST451‰XREF.S„MMUHERE‰XREF.S„MMULOAD‰XREF.S„RUNNER ‰XREF†TRACER‰XREF.S„TRACFLAGA‰XREF.S„LAST_MMU_INT_LEVEL�Parameter�which�contains�the�interrupt$*§level�at�which�we�got�the�last�Bus$*§Error�which�might�have�been�due�to *§an�unloaded�segment�desciptor. **‚INCLUDED�FILES:**‰INCLUDE„9995.&.UTILITY.MC*‰INCLUDE„9995.&.STR.EQ*‰INCLUDE„9995.&.TCB.EQ*‰INCLUDE„9995.&.TST.EQ*‰INCLUDE„M68451.M68451.EQ*‰INCLUDE„M68010.BUSERRFT.EQ*‰INCLUDE„9995.&.KILL.MC*‰INCLUDE„9999.&.KILLEXEC.EQ* *#*‚MACRO�TO�SET�CONDITION�CODES�* SETCCEQ‚MACRO ‰CMP.L…D0,D0‰ENDM‰PAGEO********************************************************************************#*ˆLOADMMU�subroutine�for�the�M68451* *ˆEntry:„A5�=�target�TST�address* *ˆCalls:„FLUSH_ON_CONTEXT_SWITCH*O******************************************************************************* LOADMMU:.ŠMOVE.B‚TSTASN(A5),D0…Get�address�space�number*ŠCMP.BƒCURR_ASN,D0‡If�same�as�current�ASN,ŠBEQ.SƒLOADEXITŠthen�EXIT. ŠPUSH„SR�Save�interrupt�level!ŠOR.W„#$700,SRŠInhibit�interrupts/ŠMOVE.L‚A5,MMULOADˆSave�address�of�current�loadŠMOVE.L‚MMUHERE,A5ˆPoint�to�MMUŠMOVE.B‚D0,AST1(A5)‡# User�data ŠMOVE.B‚D0,AST2(A5)‡User�program* *„SAVE�THE�ADDRESS�SPACE�NUMBER.*ŠMOVE.B‚D0,CURR_ASN **„FLUSH�THE�USER�CACHE.*ŠBSR…FLUSH_ON_CONTEXT_SWITCH **„TEMPORARILY�DISABLE�TRACING.*0*‰BTST„#TRCFMMU,TRACFLAG�Should�entry�be�traced?*‰IF…�THEN.S*‰BSR…TRACERŒBuild�trace�entry*‰DC.W„$DD08�Trace�code*‰ENDI (ŠPOP…SR�Restore�previous�interrupt�level LOADEXIT: ŠRTS—ReturnŠPAGEO********************************************************************************$*ˆLOADMMUI�subroutine�for�the�M68451* *ˆEntry:„A5�=�target�TST�address* *ˆCalls:„FLUSH_ON_CONTEXT_SWITCH*O******************************************************************************* LOADMMUI:.ŠMOVE.B‚TSTASN(A5),D0…Get�address�space�number*ŠCMP.BƒCURR_ASN,D0‡If�same�as�current�ASN,ŠBEQ.SƒLOADIEX‹then�EXIT. !ŠOR.W„#$700,SRŠInhibit�interrupts/ŠMOVE.L‚A5,MMULOADˆSave�address�of�current�loadŠMOVE.L‚MMUHERE,A5ˆPoint�to�MMUŠMOVE.B‚D0,AST1(A5)‡User�data ŠMOVE.B‚D0,AST2(A5)‡User�program * *„SAVE�THE�ADDRESS�SPACE�NUMBER.*ŠMOVE.B‚D0,CURR_ASN  **„FLUSH�THE�USER�CACHE.*ŠBSR…FLUSH_ON_CONTEXT_SWITCH **…TEMPORARILY�DISABLE�TRACING.*0*‰BTST„#TRCFMMU,TRACFLAG�Should�entry�be�traced?*‰IF…�THEN.S*‰BSR…TRACERŒBuild�trace�entry*‰DC.W„$DD08�Trace�code*‰ENDI LOADIEX:ŠRTEŠPAGEO********************************************************************************!*ˆCRASN�subroutine�for�the�M68451*:*ˆCreate�a�new�Address�Space�Number�and�insert�it�into�TCB*,*ˆEntry:„A5‚Points�to�TCB�to�receive�new�ASN**ˆExit:…Return�PC�if�successful(*’Return�PC+2�if�no�new�ASN�is�available* *›01234567*ˆRegister�Usage:‚D�**™A�*„P*O******************************************************************************* CRASN:=‰BTSTW‚#TSKARTIM,TCBATTR(A5)‚If�the�task�is�a�real-time�task,.‰BNE.S‚CRASN13�then�use�the�default�(ASN�=�0),*¦as�initialized�in�TSKBORN. "‰MOVE.L�ASNTBL,D0ŽIs�there�a�!ASN?‰BEQ.S‚CRASN13�Branch�if�none‰MOVE.L�D0,A0’A0�--->�!ASN‰CMP.L‚#'!ASN',(A0)‹Is�it�!ASN?‰BEQ.S‚CRASN11�Branch�if�yes?‰KILL.EXEC‚M451_LOADMMUSA,NO_ASN_ADD„Crash�system�-�ASN�is�bad.CRASN11"‰LEA„4(A0),A0�Point�to�first�entry$‰MOVE.W�#127-1,D0Ž127�entries�in�allCRASN12‚TST.L‚(A0)+’Free�entry?(‰DBEQƒD0,CRASN12�Branch�back�if�not�free,‰BEQ.S‚CRASN12A�Branch�if�an�entry�was�found"ŠADD.L‚#2,(A7)�Error�--�table�fullŠRTSšTake�error�return"CRASN12A�MOVE.L�A5,-(A0)�Use�entry‰NEG.B‚D0•Compute�ASN‰ADD.B‚#127,D0#‰MOVE.L�TCBTST(A5),A0ŠPoint�to�!TST"‰MOVE.B�D0,TSTSTAT(A0)‰Drop�in�ASNCRASN13ŠRTSšReturn�to�callerŠPAGEO********************************************************************************!*ˆDEASN�subroutine�for�the�M68451**ˆDelete�task�from�!ASN*(*ˆEntry:„A4�=�pointer�to�TCB�to�lose�ASN* *›01234567*ˆRegister�Usage:‚D�**™A�*‚**O******************************************************************************* DEASN:#ˆMOVE.L‚ASNTBL,D0„Is�there�an�!ASN?ˆBEQ.SƒDEASN7‡Branch�if�noneˆMOVE.L‚D0,A0ˆA0�--->�!ASNˆCMP.Lƒ#'!ASN',(A0)�Is�it�!ASN?ˆBEQ.SƒDEASN5‡Branch�if�yes>ˆKILL.EXECƒM451_LOADMMUSA,NO_ASN_DELETEƒCrash�system�-�bad�ASNDEASN5#ˆMOVE.L‚TCBTST(A4),A1�Point�to�!TST ˆCLR.WƒD0‹Prepare�for�short�load4ˆMOVE.B‚TSTASN(A1),D0�Get�Address�Space�Number�(ASN)!ˆBEQ.SƒDEASN7‡ASN�#0�not�relevant&ˆCMP.Wƒ#128,D0†Should�be�less�than�128ˆBLT.SƒDEASN6‡Branch�if�ok>ˆKILL.EXEC‚M451_LOADMMUSA,ASN_TOO_BIG„Crash�system,�ASN�>�127.DEASN6ˆLSL.Wƒ#2,D0ˆIndex�into�!ASNˆCLR.Lƒ(A0,D0.W)„Remove�entryDEASN7ŠRTS�Return�to�caller‰PAGEO**********************************************************************************ˆADD_SEG_TO_MMU�subroutine�for�the�M68451*0*ˆThis�is�a�dummy�routine�when�using�the�M68451.*(*ˆEntry:ƒ(A5,D5)�-->�Segment�information*4*ˆExit:…RTS�to�caller�with�condition�codes�set�.*O********************************************$ *********************************** ADD_SEG_TO_MMU: ADD_SEG2:‰SETCCEQ‰RTSŠPAGEO********************************************************************************,*ˆDEL_SEG_FROM_MMU�subroutine�for�the�M68451*#*ˆDelete�a�segment�from�M68451�MMUs*(*ˆEntry:ƒ(A5,D5)�-->�Segment�information* *ˆCalls:„FLUSH_ON_CONTEXT_SWITCH*4*ˆExit:…RTS�to�caller�with�condition�codes�set�.*O******************************************************************************* DEL_SEG_FROM_MMU: *=*‚Flush�any�cached�information�this�user�might�have�built�up.* ŠPUSH.L�A5ŠBSR„FLUSH_ON_CONTEXT_SWITCH ŠPOP.L‚A5 *ŠTST.B‚TSTASN(A5)ŠIs�this�address�space�0?ŠBEQ.S‚UNLDEXITŒBranch�if�yes(ŠMOVE.L�FRST451,A1ŠPoint�to�first�M68451$ŠMOVE.B�#1,D0�Segment�descriptor�#�1UNLD10%ŠMOVE.B�D0,DP(A1)‹Point�to�descriptor"ŠMOVE.B�SSR(A1),D1ŠRead�descriptor+ŠBTSTƒ#SSREN,D1‹Is�this�descriptor�enabled?ŠBEQ.S‚UNLDNEXTŒBranch�if�no'ŠMOVE.B�AC6(A1),D1ŠGet�descriptor's�ASN8ŠCMP.B‚TSTASN(A5),D1‡Is�this�the�address�space�we're�in?ŠBNE.S‚UNLDNEXTŒBranch�if�no1ŠCLR.L‚D1’High�byte�must�be�zero�for�long�compare'ŠMOVE.W�AC0(A1),D1ŠGet�descriptor's�LBA%ŠLSL.L‚#8,D1�Convert�to�32�bit�format!ŠCMP.L‚TSTLB(A5,D5),D1†LBA�<�LB�?ŠBLO.S‚UNLDNEXTŒBranch�if�yes!ŠCMP.L‚TSTLE(A5,D5),D1†LBA�>�LE�?ŠBHI.S‚UNLDNEXTŒBranch�if�yes-ŠMOVE.B�#0,SSR(A1)ŠElse�clear�this�descriptor5ŠMOVE.L�A1,CURR451ŠGive�this�descriptor�to�next�fault5ŠMOVE.B�D0,CURRSD+3‰Rest�of�descriptor�info�for�faultUNLDNEXTŠADDQ.B�#1,D0�Next�descriptorŠCMP.B‚#$20,D0�End�of�this�MMU?ŠBNE.S‚UNLD10ŽBranch�if�no#ŠLEA„$40(A1),A1ŠMove�on�to�next�MMUŠCLR.B‚D0’Descriptor�#�0)ŠCMP.L‚LAST451,A1ŠAre�we�beyond�all�MMUs?ŠBLE.S‚UNLD10ŽBranch�if�noUNLDEXITŠSETCCEQŠRTS˜Else�returnŠPAGEO********************************************************************************$*ˆMMUFAULT�subroutine�for�the�M68451*?*ˆDiagnose�bus�error�and�attempt�M68451�segment�descriptor�swap*"*ˆSaves�and�restores�all�registers*O******************************************************************************* MMUFAULT: ŠSAVE„D0-D7/A0-A6ˆSave�registersŠTST.LƒMMUHEREŒIs�there�an�mmu?ŠBEQ…MMUFRTSŒBranch�if�no<ŠMOVE.L‚MMULOAD,A0‰A0�<--�ptr�to�TST�of�task�that's�running;'*§note�that�this�is�not�necessarily�the*§RUNNER�(we�may�be�in�an�ISR)./ŠTST.BƒTSTASN(A0)‰Is�this�task�address�space�0?ŠBEQ…MMUFRTSŒBranch�if�yes8ŠTR0.LOGPHY�,<15*4+8+AOB(A7)>,#2�Check�for�valid�address/ŠBRA.SƒMMUF10�Branch�if�AOB�is�in�logical�space ŠNOP˜Else,+ŠBRA…MMUFRTSŒBranch�if�not�in�logical�spaceMMUF10-ŠMOVE.L‚D0,A1ŽSave�offset�into�TSTATTR�fields(ŠBSR…CRSD�Create�lba,lam,pba�in�D0,D1,D2ŠMOVE.W‚TSTASN(A0),D3†ASN�to�D3"ŠMOVE.B‚TSTCTL(A0,A1),D3‚DST�to�D3:ŠBSET„#SSRUSED,D3ˆSet�to�used�so�it�won't�get�swapped�soonŠPAGE**‰Select�a�descriptor�to�swap**‰1.‚Disabled�descriptor.*‰2.‚First�descriptor�checked�and�found�unused*‰3.‚First�descriptor�checked*%ŠPUSH„SR�Save�current�interrupt�level!ŠOR.W„#$700,SRŠInhibit�interrupts3ŠMOVEM.L�FRST451,A0-A3…Get�M68451�SYSPAR�parameters'ŠMOVE.L‚A2,A4�A4�-->�MMU�being�examined&ŠMOVE.L‚A3,D7�D7�has�descriptor�numberFSD20%ŠMOVE.B‚D7,DP(A4)‰Point�to�descriptor"ŠMOVE.B‚SSR(A4),D6ˆRead�descriptor+ŠBTST„#SSREN,D6‰Is�this�descriptor�enabled?ŠBEQ.SƒFSDEMPTYŠBranch�if�no0ŠBCLRƒ#SSRUSED,D6‡Has�this�descriptor�been�used?ŠBEQ.S‚FSDNOUSEŠBranch�if�no/ŠMOVE.B�D6,SSR(A4)ˆErase�used�bit�in�descriptorŠADDQ.B�#1,D7�Next�descriptorŠCMP.B‚#$20,D7‹End�of�this�MMU?ŠBNE.S‚FSD40�Branch�if�no#ŠLEA„$40(A4),A4ˆMove�on�to�next�MMU#ŠCLR.B‚D7�Begin�with�descriptor�#�0$ŠCMP.L‚A1,A4�Are�we�beyond�all�MMUs?ŠBLE.S‚FSD40�Branch�if�no"ŠMOVE.L�A0,A4�Go�back�to�first�MMUŠADDQ.B�#1,D7�Descriptor�#�1FSD40+ŠCMP.W‚A3,D7�Same�descriptor�we�started�on?ŠBNE.S‚FSD20�Branch�back�if�no$ŠCMP.L‚A2,A4�Same�MMU�we�started�on?ŠBNE.S‚FSD20�Branch�back�if�noŠPAGE**‰Use�first�descriptor�checked*FSDFIRST*(*‰Use�first�descri$ ptor�found�to�be�empty*FSDEMPTY*(*‰Use�first�descriptor�not�recently�used*FSDNOUSE?SR_ON_STACK�SET‚4+4+15*4+2‰This�is�the�depth�of�the�original�SR%*§pushed�by�the�bus�error.‚In�the�way'*§are�the�PC�from�the�BSR�PROGINT2�(4),&*§the�PC�from�the�BSR�MMUFAULT�(4),�15%*§registers�saved�by�MMUFAULT�(15*4),#*§and�the�SR�saved�by�MMUFAULT�(2). BŠMOVEƒSR_ON_STACK(SP),D6�Isolate�in�D6�the�interrupt�level�we�were6ŠAND„#$0700,D6Šrunning�at�when�the�bus�error�occurred. /ŠMOVEM.W�D0-D3,AC0(A4)„Load�most�of�accumulatorŠMOVE.B‚#$FF,AC8(A4)…ASM#ŠMOVE.B‚D7,DP(A4)ˆDescriptor�number 5ŠTST.BƒLDO(A4)‹If�there�was�no�collision�on�the�load,ŠIF‚‚THEN.SŠ* TRY_AGAIN*J*‚At�this�point�we�have�either�successfully�loaded�a�segment�descriptor�orI*‚we�got�a�collision�that�may�be�due�to�a�previous�interrupt�which�causedK*‚us�to�load�a�descriptor.‚In�either�case�we�want�to�remember�the�interruptH*‚level�of�this�load�and�proceed�under�the�assumption�that�the�bus�errorJ*‚was�caused�by�the�absence�of�the�right�segment�descriptor.‚If�we�get�theJ*‚bus�error�again,�the�LAST_MMU_INT_LEVEL�will�be�lower�so�we'll�know�it's*‚the�user's�fault.*>ŠMOVE.B‚AC6(A4),AST1(A0)‚Load�the�ASN�for�this�descriptor�into?ŠMOVE.B‚AC6(A4),AST2(A0)‚the�user�data�and�user�program�entries*§in�the�address�space�table. **‰Fix�up�SYSPAR�parameters*:ŠMOVEƒD6,LAST_MMU_INT_LEVELƒRemember�this�interrupt�level. 2ŠADDQ.B‚#1,D7ŒStart�next�time�with�next�descriptorŠCMP.Bƒ#$20,D7ŠEnd�of�this�MMU?ŠBNE.SƒFSD100‹Branch�if�no#ŠLEA…$40(A4),A4‡Move�on�to�next�MMU#ŠCLR.BƒD7�Start�with�descriptor�#�0$ŠCMP.LƒA1,A4ŒAre�we�beyond�all�MMUs?ŠBLE.SƒFSD100‹Branch�if�no"ŠMOVE.L‚A0,A4ŒGo�back�to�first�MMUŠADDQ.B‚#1,D7ŒDescriptor�#�1FSD100#ŠMOVE.L‚A4,CURR451‡Save�current�MMU+ŠMOVE.B‚D7,CURRSD+3†Save�current�descriptor**‰Return�to�faulted�task*!ŠADD.Lƒ#2,A7ŒRemove�SR�from�stack/ŠRESTORE�D0-D7/A0-A6†Restore�original�registers+ŠADD.Lƒ#8,A7ŒRemove�unused�return�addressesŠRTE–Continue�task ŠENDI  *C*‚There�was�a�collision;�can�we�tell�whether�the�user�was�at�fault?*BŠCMP„LAST_MMU_INT_LEVEL,D6‚If�the�interrupt�level�of�the�last�load:ŠBMI„TRY_AGAINŠwas�higher�than�the�interrupt�level�of�this'*§load,�then�it's�possible�that�we�took(*§the�interrupt�during�the�processing�of%*§this�bus�error.‚If�that�happened�we(*§might�have�already�loaded�this�segment'*§descriptor�for�the�code�at�the�higher$*§interrupt�level.‚Therefore�we�must*§try�the�access�again.  *F*‚We�know�the�collision�was�the�user's�fault,�since�we�know�we�did�not7*‚come�through�this�path�from�a�higher�interrupt�level.*(ŠPOP…SR�Restore�previous�interrupt�levelMMUFRTS&ŠRESTORE�D0-D7/A0-A6†Restore�registersŠRTS–Continue�normal�handlingŠPAGE* *‰Compute�one�segment�descriptor**‰ENTRY:‚D6�=�Physical�address*‘D3�=�Logical�address*‘(A0,D5)�-->�TST�MMU�entry**‰EXIT:ƒD0�=�lba *‘D1�=�lam *‘D2�=�pba*‘(A0,D5)�UNDISTURBED*CRSDŠMOVE.L‚D3,D0�D0�=�la ŠLSR.Lƒ#8,D0�LOSE�LOW�BYTE�OF�la ŠLSR.Lƒ#8,D6�LOSE�LOW�BYTE�OF�pa,ŠMOVE.L‚#-1,D1ŒONES�TO�STOP�lam�FORMING�LOOPŠMOVE.W‚D1,D3�D3�=�lamŠCLR.LƒD2�D2�=�nŠMOVE.W‚D6,D1�D1�=�paŠEOR.WƒD0,D1�D1�=�pa�EOR�la**‰FORM�LARGEST�POSSIBLE�lam*CRSDAŠBTST„D2,D1�la�=�pa�IN�BIT�n?ŠBNE.SƒCRSDC�BRANCH�IF�NOŠBCLR„D2,D3�CLEAR�THIS�lam�BITŠADD.Bƒ#1,D2�BUMP�nŠBRA.SƒCRSDA�TRY�NEXT�BIT**‰ADJUST�lam�FOR�LOWER�BOUNDARY*CRSDC5ŠCLR.LƒD1�Upper�word�of�D1�must�=�0�for�compare�belowŠMOVE.W‚D0,D1�D1.W�=�laŠAND.WƒD3,D1�D1.W‚=�lam�AND�la%ŠLSL.Lƒ#8,D1�Convert�to�32�bit�format(ŠCMP.LƒTSTLB(A0,D5),D1ƒlam�AND�la�>=�lb?ŠBHS.SƒCRSDD�BRANCH�IF�YESŠSUB.Bƒ#1,D2�DECREMENT�nŠBSETƒD2,D3�HALVE�THE�lam�RANGEŠBRA.S‚CRSDC�TRY�AGAIN**‰ADJUST�lam�FOR�UPPER�BOUNDARY*CRSDDŠMOVE.W‚D3,D4ŒD4�=�lamŠNOT.WƒD4�D4�=�NOTlamCRSDD105ŠCLR.LƒD1�Upper�word�of�D1�must�=�0�for�compare�belowŠMOVE.W‚D0,D1ŒD1�=�laŠAND.WƒD3,D1ŒD1�=�lam�AND�la'ŠADD.WƒD4,D1ŒD1�=�(lam�A% ND�la)�+�NOTlam%ŠLSL.Lƒ#8,D1ŒConvert�to�32�bit�format2ŠCMP.LƒTSTLE(A0,D5),D1‚(lam�AND�la)�+�NOTlam�<=�leŠBLS.SƒCRSDEŒBRANCH�IF�YESŠSUB.Bƒ#1,D2ŒDECREMENT�nŠBSET„D2,D3ŒHALVE�THE�lam�RANGE"ŠBCLR„D2,D4ŒHALVE�THE�NOTlam�RANGEŠBRA.SƒCRSDD10ŠTRY�AGAINCRSDEŠAND.WƒD3,D0ŒD0�=�lba,ŠMOVE.L‚TSTPO(A0,D5),D2‚D2�=�PHYSICAL�OFFSET*ŠLSR.Lƒ#8,D2ŒConvert�back�to�24�bit�formatŠADD.WƒD0,D2ŒD2�=�paŠMOVE.W‚D3,D1ŒD1�=�lam ŠRTS–RETURNŠEND'M68XXX RDTIMER AF¦¦  POWRFAILAF¯¯  READY AF¸¸  RMS AFÁÁ  SELFTESTAFÊÊ  RDTIMER SAÓÓ \  TRAP1 SAää<…  INIT SA%%k3  KILLER SA®®?E  POWRFAILSAÿÿ2  READY SA¼  RMS SA!!  SELFTESTSA221  =/*=/*†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ƒ=ARG�M68XXX.RDTIMER.LS=/ENDIF=/*1=ASM M68XXX.RDTIMER.SA,M68XXX.RDTIMER.RO,\1;RZ=50=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDNNNNNNž=/*=/*†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ƒ=ARG�M68XXX.POWRFAIL.LS=/ENDIF% =/*4=ASM M68XXX.POWRFAIL.SA,M68XXX.POWRFAIL.RO,\1;MRZ=40=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDNNNNNN§=/*=/*†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ƒ=ARG�M68XXX.READY.LS=/ENDIF=/*-=ASM M68XXX.READY.SA,M68XXX.READY.RO,\1;RZ=55=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDNNNNNN& °=/*=/*†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ƒ=ARG�M68XXX.RMS.LS=/ENDIF=/**=ASM M68XXX.RMS.SA,M68XXX.RMS.RO,\1;MRZ=65=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.KILL.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=ENDNNNNNN¹=/*=/*†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ƒ=ARG�M68XXX.SELFTEST.LS=/ENDIF=/*4=ASM M68XXX.SELFTEST.SA,M68XXX.SELFTEST.RO,\1;MRZ=40=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDNNNN& NNÂ.RDTIMERƒIDNTƒ45,0�M68xxx�--�Reads�system�time.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***<***…FILE:‚RDTIMER�--�GETS�THE�CURRENT�TIME�OUT�OF�SYSPAR�******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***G***…FUNCTION:‚This�routine�returns�the�time�maintained�by�the�timer„******‡logic.‚On�return,°***C***‰D1�=�the�#�of�milliseconds�since�midnight�at�which�the�last…******Žtimer�tick�occurred.§***C***‰D0�=�0.‚This�used�to�be�the�#�of�microseconds,�but�it�isn't„***?***Žrealistic�to�think�that�the�figure�was�ever�meaningful.„******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------?*…11/27/84‚Steve�FranckƒCreated�from�a�device-specific�version.* * *‚XDEF's.*$ŠXDEFƒRDTIMERŒEntry�pt.�for�TRAP�#0.(ŠXDEFƒSBRDTIMŒEntry�pt.�for�subroutines.  **‚XREF's�from�SYSPAR.*ŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�TIME_LEFT  **‚Included�files:*„9995.&.STR.EQ*„9995.&.UTILITY.MC*„9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE ŠSECTION�LEVEL00  SBRDTIM:RDTIMER: 0ŠPUSHƒSR‘We�must�do�this�with�interrupts�masked,6ŠDISABLE_INTERRUPTSˆin�case�we�take�a�timer�interrupt. *5*‚Calculate‚(#�of�milliseconds�since�last�midnight)�==*�[�(time�of�NSE�in�msecs)�-�(time�left�until�NSE�in�msecs)�]#*ª-�(time�of�last�midnight�in�msec)ËEÔG*‚NSE�stands�for�Next�Significant�Event,�and�is�the�absolute�time�valueJ*‚in�msecs�when�we�next�need�to�take�something�off�the�Periodic�ActivationK*‚Table�(PAT).‚Recall�that�the�clock�is�a�31-bit�(not�32-bit!)�number�whichB*‚wraps�around�at�2**31�=�0,�so�we�have�to�do�"31-bit�arithmetic."*%ŠMOVE.L�NSE,D1�D1�<--�msec�time�now�=:ŠSUB.L‚TIME_LEFT,D1‡(time�of�NSE)�-�(time�left�until�NSE)./ŠSUB.L‚MIDNIGHT,D1ˆD1�<--�msec�since�midnight�=1*Ÿ(msec�time�now)�-�(msec�time�at�last�midnight).3ŠBCLRƒ#31,D1�The�result�is�a�31-bit�number,�so�zero%*§out�the�high�bit,�which�is�garbage. *J*‚Always�set�#�of�microseconds�to�zero,�since�we�are�really�only�returning6* the millisecond time of the last tick that occurred.*#ŠMOVEQ‚#0,D0ŽD0�<--�0�microseconds.  +ŠPOP„SR‘Restore�interrupt�level�and�return.ŠRTS—*  ŠEND' NNNN‰NOLIST‰INCLUDE�9995.&.UTILITY.MC‰INCLUDE�9995.&.ENV.EQ‰INCLUDE�9995.&.STR.EQ‰INCLUDE�9995.&.TCB.EQ‰INCLUDE�9995.&.UDR.EQ‰INCLUDE�9995.&.TR1RTCD.EQ ‰OPT…NOCL‰SPC�1‰LIST‰IFEQƒCHIPTYPE-680000TRAP1„IDNTƒ45,0‡68000�TRAP�#0�handler�and�table.‰ENDC‰IFEQƒCHIPTYPE-680100TRAP1„IDNTƒ45,0‡68010�TRAP�#0�handler�and�table.‰ENDC‰IFEQƒCHIPTYPE-680200TRAP1„IDNTƒ45,0‡68020�TRAP�#0�handler�and�table.‰ENDC‰SPC�1O*********************************************************************************ˆTRAP1*3*ˆCommon�module�to�call�a�trap�1�directive�routine.*>*ˆWhen�a�task�wants�to�invoke�some�exec�function,�he�moves�the>*ˆdirective�number�of�the�function�into�D0�and�does�a�TRAP�#1.A*ˆThe�mpu�vectors�here�and�we�use�the�TRAP�#1�table�called�TABLE1D*ˆto�JMP�to�the�desired�routine.�Everything�dealing�with�the�TRAP�#1<*ˆmechanism�for�real-time�tasks�is�contained�in�this�module.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1983�by�Motorola,�Inc.*8*ˆEntry:„D0ƒ=�directive�#�of�the�routine�to�be�executed.2*’A0ƒ=�parameter�block�(if�required�by�directive)..*’PC�&�SR�(&�maybe�VOR)�of�caller�are�stacked,*šas�with�any�TRAP.*’A6ƒ=�Requestor's�TCB�address*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*…*�*�**™A‚*ƒ*�*�R�R�P**™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed*5*ˆCalls:�TRACER,�CKEXMON,�SBLOGPHY,�SBGETTCB,�SBREADY*=*ˆExit:‚Good�return�-�JMP�to�the�routine�to�handle�directive.*’A4�=�Parameter�block�address *’A5�=�Target�task's�TCB�address*’A6�=�Requestor's�TCB�address@*�Bad�return‚-�EXIT�ERROR�macro�with�the�following�return�codes:*1*�RTCDDIRN�-�01‚Directive�number�is�not�assigned.9*�RTCDPBLK�-�02‚Parameter�block�not�in�user's�addr�space.+*�RTCDTASK�-�03‚Target�task�does�not�exist.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------ÜAåmíQõVýGJ n2A*ˆ10/07/85‚Chuck�Smith„Added�new�ABORTC�directive�(XX)�to�TABLE1.=*ˆ09/06/85‚Julie�Hoban„New�directives�made�specific�to�68020.C*ˆ07/26/85‚Julie�Hoban„Added�directives�(39,40,63,70,71)�to�TABLE1.'*ˆ07/27/84‚Mark�Lanus…Original�writing.*O*******************************************************************************‰PAGE ‰SECTIONƒ2 ‰OPT‡MEX **‚XDEF's*0‰XDEF†TRAP1�Entry�point�for�the�TRAP�#1�handler. /‰XDEF†TTB_01ŽBeginning�and�ending�addresses�for‰XDEF†TTE_01Žtrust�table�entry. **‚XREF's* ‰XREF†CKEXMON ‰XREF†ISRRTE ‰XREF†TRACER‰XREF†SBGETTCB‰XREF†SBLOGPHY ‰XREF†SBREADY ‰XREF.S„RUNNER‰XREF.S„TRACFLAG‰XREF.S„UDRBEG **ƒINCLUDED�FILES:**‰INCLUDE�9995.&.UTILITY.MC*‰INCLUDE�99' 95.&.ENV.EQ*‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.TCB.EQ*‰INCLUDE�9995.&.UDR.EQ*‰INCLUDE�9995.&.TR1RTCD.EQ*‰PAGE**ˆif&*ˆ(interrupt_mask�(super_stack)�>�0)�|,*ˆ(supervisor_state_bit�(super_stack)�=�set)*ˆthen�go�to�isrrte;* TRAP1:‰TESTIM3‰BNE.S…ISR_RTE�Branch�if�not�from�normal�user�mode.  *1*ˆforce�the�condition�codes�on�the�stack�to�,+*ˆand�perform�a�level_1�partial�state�save;* =‰MOVE.B„#EQ_CC,COND_CODE(A7)…save�cond�code�of��on�stack. ‰SAVE_STATEŠL1_PART  *"*ˆif�(requestor�<>�real-time�task)*ˆthen�go�to�not_rt_task;* ‰BTSTW…#TSKARTIM,TCBATTR(A6)‰BEQ.S…NOT_RT_TASK  */*ˆmultiply�D0�by�4;�/*‚Get�index�into�table1‡*/ *ˆif�(D0�<�0)7*ˆthen�go�to�user_dir;Š/*‚User�configured�directive.‚*/* ‰ASL.W…#2,D0‰BMI.S…USER_DIR  *$*ˆif�(D0�>�biggest�directive�number)*ˆthen�exit�(bad�directive);* ‰CMP.W…#HI_T1_NUM*4,D0‰BHI.S…BAD_DIR  * *ˆA4�<==�addr�(parameter�block);.*ˆD2�<==�(option_bits)�&�(offset�(directive)); *ˆif�(target_tcb_required�=�set)*ˆthen�get�(target_tcb);#*ˆgo�to�directive�pointed�to�by�D0;* ‰MOVE.L„A0,A4‰MOVE.L„TABLE1(PC,D0.W),D2 ‰IF‚‚THEN.S‰GET_TARGET_TCB‰ENDI ‰JMP‡TABLE1(PC,D2.W)‰PAGE*:*ˆHere�are�some�branch�instructions.‚The�purpose�in�having=*ˆthis�branch�to�branch�architecture,�was�to�make�the�trap�#1>*ˆhandler�for�real-time�tasks�as�fast�as�possible,�even�though<*ˆthis�architecture�would�slow�down�the�trap�#1�handling�for*ˆnon�real-time�tasks.*=*ˆThe�priorities�on�handling�trap�#1�requests�are�as�follows:**�1.)‚real-time�tasks,*�2.)‚non�real-time�tasks,!*�3.)‚user�configured�directives.  *1*ˆUser�executed�a�trap�#1�while�executing�an�ISR.* ISR_RTE: ‰BRA.L…ISRRTE  *&*ˆClient�task�is�not�a�real-time�task.* NOT_RT_TASK:‰BRA.L…TRAP1_10  ***ˆTrap�is�for�a�user�configured�directive.* USER_DIR:‰BRA.L…TRAPUSR  *(*ˆTrap�contained�a�bad�directive�number:* BAD_DIR:$‰EXIT†RTCDDIRNŒexit�(bad�directive);‰PAGE@*****************************************************************"*ˆENTRY�CONDITIONS�FOR�DIRECTIVES:*+*�A4�<==�parameter�address�(if�applicable);!*�A6�<==�client�task�tcb�address;*?***************************************************************‰PAGEO*********************************************************************************ˆTABLE1*F*ˆIn�this�file�is�the�TRAP�#1�table�called�TABLE1�containing�one�entryD*ˆfor�every�TRAP�#1�directive.‚Each�entry�is�set�up�using�the�SETUP1**ˆmacro�and�contains�the�following�fields:'*’1.�Byte�describing�directive�options:*–a.‚parameter�block�required.*–b.‚target�tcb�required.:*’2.�Byte�describing�length�of�parameter�block�(if�req'd)..*’3.�Word�containing�offset�to�directive�code.*C*ˆThe�SETUP1�macro�has�up�to�five�input�parameters.‚The�inputs�are:%*’1.‚Equate�for�the�directive�number.4*’2.‚Label�of�the�routine�to�process�that�directive..*’3.‚Equate�to�define�parameter�block�is�used.3*’4.‚Byte�equal�to�number�bytes�in�parameter�block.,*’5.‚Equate�to�define�target�task�interface.**ˆRegister�usage:*œ0�1�2�3�4�5�6�7*™D*™A*O*******************************************************************************  * *ˆExample:*A*ˆSETUP1‚,,,,* 2TT‡EQU‡%10000000‹One�byte�equate�-�input�to�SETUP12PB‡EQU‡%01000000‹One�byte�equate�-�input�to�SETUP12T1TRGTSK�EQU‡31’Bit�number�tested�for�target�task.1T1PARBLK�EQU‡30’Bit�number�tested�for�para�block.‰PAGE SETUP1ƒMACRODIR_NUM‚SET‡(*-TABLE1)/4‰IFNE†DIR_NUM-\1SHOULD_BE‚SET…\10‹FAIL„499‘This�directive�is�in�the�wrong�place!!‹MEXIT‰ENDC‰IFC‡'\5','TT'‹DC.B„TT+PB�get�(pb�&�tt);‹DC.B„\4’len�(pb);‹NOLIST‹XREF„\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„\2( ‹LIST#‹DC.W„\2-TABLE1‹offset�(directive);‹MEXIT‰ENDC‰DC.B†%00000000‹get�();‰DC.B†0“len�(pb)�=�0;‰NOLIST‰XREF†\2‰LIST#‰DC.W†\2-TABLE1‹offset�(directive);ˆENDM  ‰PAGETABLE1:2‡SETUP1ƒT10,ERROR_01�Error�-�bad�directive�number. 4‡SETUP1ƒT1GTSEG,SEGALOC,PB,24,TTƒAllocate�a�segment. 6‡SETUP1ƒT1DESEG,SEGDEAL,PB,24,TTƒDeallocate�a�segment. 3‡SETUP1ƒT1TRSEG,TFRSEG,PB,24,TT„Transfer�a�segment. <‡SETUP1ƒT1ATTSEG,ATTSEG,PB,24†Attach�to�a�shareable�segment. >‡SETUP1ƒT1SHRSEG,SEGSHAR,PB,24,TT‚Grant�shared�segment�access. ;‡SETUP1ƒT1MOVELL,MOVELL,PB,28,TTƒMove�from�logical�address. ;‡SETUP1ƒT1DCLSHR,DCLSHAR,PB,24…Declare�a�segment�shareable. 5‡SETUP1ƒT1SNAPTRAC,SNAPTRACˆMove�trace�table�to�user. :‡SETUP1ƒT1RCVSA,RCVSA,PB,28,TT…Receive�segment�attributes. /‡SETUP1ƒT1GTTID,GTTASKID,PB,08…Get�TCB�address. '‡SETUP1ƒT1CRTCB,CRTCB,PB,28ˆCreate�TCB. 0‡SETUP1ƒT1GTTNAME,GTTNAME,PB,08,TT�Get�taskname. *‡SETUP1ƒT1START,TSKSTART,PB,10…Start�task. (‡SETUP1ƒT1ABORT,ABORTŽAbort�task�(self). *‡SETUP1ƒT1TERM,TERM�Terminate�task�(self). 6‡SETUP1ƒT1TERMT,TERMT,PB,10ˆTerminate�task�(not�self). -‡SETUP1ƒT1SUSPND,SUSPEND‹Suspend�task�(self). 7‡SETUP1ƒT1RESUME,RESUME,PB,08,TTƒResume�suspended�task. )‡SETUP1ƒT1WAIT,TSKWAIT�Block�task�(self). 7‡SETUP1ƒT1WAKEUP,WAKEUP,PB,08,TTƒWakeup�a�waiting�task. #‡SETUP1ƒT1DELAY,DELAYŽDelay�(self). -‡SETUP1ƒT1RELINQ,RELINQŒRelinquish�execution. :‡SETUP1ƒT1TSKATTR,TSKATTR,PB,08,TT�Return�task�attributes. 6‡SETUP1ƒT1SETPRI,SETPRI,PB,09,TTƒSet�current�priority. -‡SETUP1ƒT1STOP,STOPT,PB,08‰Stop�running�task. 6‡SETUP1ƒT1EXPVCT,EXPVCT,PB,36†Claim�exception�vectors. 1‡SETUP1ƒT1TRPVCT,TRPVCT,PB,56†Claim�trap�vectors. =‡SETUP1ƒT1TSKINFO,TSKINFO,PB,14,TT�Move�task's�TCB�to�caller. =‡SETUP1ƒT1RQSTPA,RQSTPA,PB,26,TTƒRequest�periodic�activation. /‡SETUP1ƒT1DELAYW,DELAYWŒDelay�with�wait�option. 1‡SETUP1ƒT1GTASQ,ASQALOC,PB,22,TTƒAllocate�an�ASQ. *‡SETUP1ƒT1DEASQ,ASQFREEŒDeallocate�an�ASQ. )‡SETUP1ƒT1SETASQ,ASQSTATSŠSet�ASQ�status. -‡SETUP1ƒT1RDEVNT,ASQREAD‹Read�event�from�ASQ. 5‡SETUP1ƒT1QEVNT,ASQEVENT,PB,18,TT‚Queue�event�to�ASQ. (‡SETUP1ƒT1WTEVNT,WTEVENT‹Wait�for�event. +‡SETUP1ƒT1RTEVNT,RTEVENT‹Return�from�event. ,‡SETUP1ƒT1GTEVNT,GTEVENT‹Get�event�from�ASQ. †IFEQƒCHIPTYPE-680209‡SETUP1ƒT1RESVCT,CPRVCT,PB,128…Claim�coprocessor�vectors. =‡SETUP1ƒT1CRXTCB,CRXTCB,PB,24,TTƒCreate�XTCB�for�coprocessors†ENDC†IFNEƒCHIPTYPE-680200‡SETUP1ƒT1RESVCT,ERROR_01ŠError�-�bad�directive. 0‡SETUP1ƒT1CRXTCB,ERROR_01ŠError�-�bad�directive.†ENDC 0‡SETUP1ƒT1ATSEM,ATSEM,PB,10ˆAttach�to�semaphore. .‡SETUP1ƒT1WTSEM,WTSEM,PB,10ˆWait�on�semaphore. -‡SETUP1ƒT1SGSEM,SGSEM,PB,10ˆSignal�semaphore. 2‡SETUP1ƒT1DESEM,DESEM,PB,10ˆDetach�from�semaphore. -‡SETUP1ƒT1CRSEM,CRSEM,PB,10ˆCreate�semaphore. <‡SETUP1ƒT1DESEMA,DESEMAŒDetach�all�semaphores�for�this�task. ,‡SETUP1ƒT147,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT148,ERROR_01ŽError�-�bad�directive. L*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;‡SETUP1ƒT1ABORTC,ABORTC,PB,16†Abort�a�critical�task�(self).L*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ,‡SETUP1ƒT150,ERROR_01ŽError�-�bad�directive. =‡SETUP1ƒT1SERVER,SERVER,PB,06†Establish�server�for�user�task. 4‡SETUP1ƒT1DSERVE,DSERVEŒDetach�from�server�function. 7‡SETUP1ƒT1DERQST,DERQSTŒSet�user/server�request�status. <‡SETUP1ƒT1AKRQST,AKRQST,PB,20,TTƒAcknowledge�server�request. ,‡SETUP1ƒT155,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT156,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT157,ERROR_01ŽError�-�bad�directive. 2‡SETUP1ƒT1CDIR,CDIR,PB,08ŠConfigure�user�directiv. )‡SETUP1ƒT159,SUPER‘Enter�supervisor�mode. "‡SETUP1ƒT1CMR,CMR’Channel�request. 4‡SETUP1ƒT1CISR,CISR,PB,20,TT‡Claim�interrupt�vector. 6‡SETUP1ƒT1SINT,SINT,PB,04ŠSi( mulate�user�I/O�interrupt. †IFEQƒCHIPTYPE-68020<‡SETUP1ƒT1XEXMSK,CEXMSK,PB,12,TTƒSet�coprocessor�exmon�mask.†ENDC†IFNEƒCHIPTYPE-680200‡SETUP1ƒT1XEXMSK,ERROR_01ŠError�-�bad�directive.†ENDC ;‡SETUP1ƒT1EXMON,EXMON,PB,16,TT…Attach�to�exception�monitor. >‡SETUP1ƒT1DEXMON,DEMON,PB,16,TT„Detach�from�exception�monitor. <‡SETUP1ƒT1EXMMSK,EXMMSK,PB,12,TTƒSet�exception�monitor�mask. 6‡SETUP1ƒT1RSTATE,RSTATE,PB,12,TTƒReceive�task's�state. 2‡SETUP1ƒT1PSTATE,PSTATE,PB,12,TTƒSet�task's�state. B‡SETUP1ƒT1REXMON,REXMON,PB,12,TTƒExecute�task�under�exmon�control. †IFEQƒCHIPTYPE-680207‡SETUP1ƒT1XPSTAT,CPSTAT,PB,16,TTƒPut�coprocessor�state. ;‡SETUP1ƒT1XRSTAT,CRSTAT,PB,16,TTƒReceive�coprocessor�state.†ENDC†IFNEƒCHIPTYPE-680200‡SETUP1ƒT1XPSTAT,ERROR_01ŠError�-�bad�directive. 0‡SETUP1ƒT1XRSTAT,ERROR_01ŠError�-�bad�directive.†ENDC 9‡SETUP1ƒT1MOVEPL,MOVEPL,PB,28†Move�from�physical�address. 0‡SETUP1ƒT1STDTIM,STDTIM,PB,08†Set�date�and�time. 0‡SETUP1ƒT1GTDTIM,GTDTIM,PB,08†Get�date�and�time. )‡SETUP1ƒT1FLUSHC,FLUSHCŒFlush�user�cache.  >HI_T1_NUM�EQU�(*-TABLE1)/4-1�Highest�TRAP�#1�directive�number. ‰PAGE*3*ˆThis�is�the�routine�which�processes�trap�#1�calls*ˆfrom�non�real-time�tasks.* *"*ˆTrace�this�trap�#1,�if�required.* TRAP1_10:-‰BTST†#TRCFTRP1,TRACFLAGŒDo�we�want�to�trace?‰BEQ.S…TRAP1_20–Branch�if�no. !‰BSR‡TRACER˜Trace�this�directive. ‰DC.W†$FF15 *'*ˆSend�a�message�to�EXMON,�if�requried.*  TRAP1_20:0‰BTST†#TSKIEXM,TCBATTI(A6)ŠDoes�task�have�EXMON?‰BEQ.S…TRAP1_30–Branch�if�no. 3‰MOVE.L„TCBEMMSK(A6),D1�Move�mask�to�data�register.(‰BTST†#TEMTRAP1,D1’Is�TRAP�#1�monitored?‰BEQ.S…TRAP1_30–Branch�if�no. %‰MOVE.L„#1,D7™Pass�TRAP�#�to�CKEXMON.&‰BSR‡CKEXMON—Go�send�message�to�EXMON.  */*ˆmultiply�D0�by�4;�/*‚Get�index�into�table1‡*/ *ˆif�(D0�<�0)7*ˆthen�go�to�trap_usr;Š/*‚User�configured�directive.‚*/* TRAP1_30: ‰ASL.W…#2,D0‰BMI.S…TRAPUSR  *$*ˆif�(D0�>�biggest�directive�number)*ˆthen�exit�(bad�directive);* ‰CMP.W…#HI_T1_NUM*4,D0‰BHI.S…TRAP1BAD  *.*ˆGet�address�of�parameter�block,�if�required.* ‰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,D6�LOGICAL�PARAMETER�BLOCK�ADDRESS‰TR0.LOGPHY‚&‰BRA.S…TRAP1_40ŒBRANCH�IF�GOOD�ADDRESS ‰NOP›BAD�ADDRESS&‰EXIT†RTCDPBLKŒBAD�ADDRESS�RETURN�CODE  TRAP1_40:.‰MOVE.L„D6,A4�PARAMETER�PHYSICAL�ADDRESS�TO�A4  *&*ˆGet�target�TCB�address,�if�required.* $‰BTST†#T1TRGTSK,D2ˆNEED�TARGET�TASK?‰BEQ.S…TRAP1_GOŒBRANCH�IF�NO ‰TR0.GETTCB‚(A4)‰BRA.S…TRAP1_50ŒBRANCH�IF�FOUND‰EXIT†RTCDTASKŒBAD�TARGET�TASK TRAP1_50:&‰MOVE.L„A0,A5�TARGET�TCB�ADDRESS�TO�A5 **ˆNow�go�to�directive�code.* TRAP1_GO: ‰JMP‡(A3,D2)   *'*ˆHere�is�another�branch�from�a�branch,$*ˆemployed�for�performance�purposes.* TRAP1BAD:‰EXIT†RTCDDIRN‰PAGETRAPUSR:&‰MOVE.L„UDRBEG,A2‹USER�DIRECTIVE�TABLE‰MOVE.L„A2,D2�DOES�TABLE�EXIST?‰BEQ.S…TRAP1BADŒBRANCH�IF�NO ,‰ASR.W…#2,D0�GET�UNMODIFIED�DIRECTIVE�NUMBER.‰NEG.W…D0’CHANGE�DIRECTIVE�#�TO�POSITIVE�VALUE2‰CMP.W…UDRCNT(A2),D0‡IS�VALUE�WITHIN�TABLE�LIMITS?&‰BGT.S…TRAP1BADŒBRANCH�IF�NOT�IN�TABLE ‰SUB.W…#1,D0�ENTRY�NUMBER‰MULU†#UDRESIZ,D0‰*�ENTRY�SIZE(‰LEA‡UDRENTRY(A2,D0),A2‚POINTER�TO�ENTRY!‰TST.L…UDRADDR(A2)‰ADDRESS�EXIST?‰BEQ.S…TRAP1BADŒBRANCH�IF�NO .‰MOVE.W„UDROPT(A2),D2‡GET�OPTION�&�EXIT�INDEX.)‰BCLR†#4,D2�THIS�TRAP�FOR�1�SESSION�ONLY?‰BNE.S…TRAPUSR1ŒBRANCH�IF�NO "‰MOVE.L„UDRSESS(A2),D1†GET�SESSION'‰CMP.L…TCBSESSN(A6),D1…DOES�IT�COMPARE?‰BNE.S…TRAP1BADŒBRANCH�IF�NO TRAPUSR1:(‰MOVE.L„(A7),TCBA6(A6)†MOVE�A6�INTO�TCB.%‰CLR.W…TCBRTCD(A6)‰CLEAR�RETURN�CODE.(‰MOVE.W„D2,-(A7)ŒPUT�EXIT�INDEX�ON�STACK ‰IFNE†CHIPTYPE-680005‰MOVE.W„#$84,-(A7)ŠSIMULATE�TRAP1�ON�M68010/020�STACK‰ENDC )‰PEAˆTRAP1XIT(PC)‡RETURN�ADDRE) SS�TO�STACK‰MOVE.W…SR,-(A7)‹SR�TO�STACK $‰MOVE.L„UDRADDR(A2),A2†ENTRY�ADDRESS ‰JMP‡(A2)  **ˆRETURN�FROM�DIRECTIVE* TRAP1XIT:'‰MOVE.W„TCBRTCD(A6),D0†Get�return�code.*‰EXIT.NEƒERROR�Exit�if�error�in�directive. ‰MOVE.W„(A7)+,D0ŒGet�exit�index.5‰EXIT.EQƒSUB‘If�(index�=�0)�then�take�subroutine�exit ‰IF.W†D0��#2�THEN.S4‰TR0.READY�(A6)�If�(index�=�2)�then�make�task�ready.‰ENDI 2‰EXIT†POSTEMPTŒIn�either�case,�take�postempt�exit.‰ENDNNNŠNOLISTŠ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ŠINCLUDE�9995.&.KILL.MCŠINCLUDE�9999.&.KILLEXEC.EQŠLIST‰SPCƒ1!INIT…IDNT‚45,0„SYSTEM�INITIALIZER‰SPC�1O*********************************************************************************ˆINIT�(Also�known�as�SYSINIT).*@*ˆSystem�initializer.‚This�module�initializes�memory�(calls�IMEM9*ˆsubroutine�in�another�module)�and�builds�system�tables.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:ˆFirst�module�to�execute�when�after�IPL�gives�control *–tp�the�program�it�just�loaded.**!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚*�*�*�*�*�*�*�**™A‚*�*�*�*�*�*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed**+*ˆExit:‚Good�return�-�DISPATCH�in�the�exec.+*�Bad�return‚-�Exits�via�KILL.EXECT0�macro.**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------NN 3&.j6<>8FIN)V^fn*v6~7†/Ž<–ž5C*ˆ03/07/86‚Julie�Hoban„Moved�BLDTCB�routine�before�call�to�INITMMU..*¡Also�renamed�KILLER�to�KILL_INIT�and�changed*¡format�from�'OLDF'�to�'0001'.?*ˆ02/11/86‚Julie�Hoban„Added�coprocessor�support�for�mini-TCBs.A*ˆ11/05/85‚Julie�Hoban„Removed�IMEM�subroutine�to�xxxxxx.IMEM.SA.D*ˆ10/30/85‚Chuck�Smith„Changed�KILLER�calls�to�use�KILL.EXECT0�macro-*ˆ10/23/85‚Julie�Hoban„Fixed�bug�in�CMEMCONF.<*ˆ10/19/85‚CBSŒAdded�initialization�of�BUGTRP15�and�TRP15TYP7*ˆ10/08/85‚Julie�Hoban„Re-wrote�IMEM�for�bud) dy�buffers.;*ˆ08/20/85‚CBSŒChanged�the�way�mini-TCBs�are�handled�to�use)*¡the�new�32�bit/8�segment�format�of�TST.7*ˆ07/30/85‚CBSŒRe-wrote�VECTINIT�to�allow�32�bit�vector-*¡addresses�and�simplified�format�of�VECTTBL.8*ˆ07/12/85‚CBSŒChanged�3�signed�branches�to�unsigned�for*¡32-bit�addressing�support.NNNN:*ˆ12/�7/84‚SJFŒAdded�initialization�of�LAST_MMU_INT_LEVEL.C*ˆ12/23/83‚Mark�Lanus…Re-wrote�memory�initialization�routine�to�fix.*¡bug�in�"hole"�processing�(and�several�more).*O*******************************************************************************‰PAGE ‰SECTION�2 ‰OPT…CL **‚INCLUDED�FILES:**ˆ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*ˆINCLUDEƒ9995.&.KILL.MC*ˆINCLUDEƒ9999.&.KILLEXEC.EQ* **‚XREF's*ŠXREFƒCRASHSAV ŠXREFƒENDMEMT ŠXREFƒMEMTABL ŠXREF.S�ADEFTYPŠXREF.S�ASNTBLŠXREF.S�BKG_ACTIVEŠXREF.S�BKG_HEADŠXREF.S�BKG_TAILŠXREF.S�BUGTRP15 ŠXREF.S�CCBHDŠXREF.S�CURR_ASNŠXREF.S�ENDSYSPŠXREF.S�EXCSTACKŠXREF.S�GSTBEGŠXREF.S�IOVCTBGN ŠXREF.S�LAMŠXREF.S�LAST_MMU_INT_LEVELŠXREF.S�MACSTRCŠXREF.S�MAPBEGŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�NOTLAM ŠXREF.S�PANELŠXREF.S�PATBEGŠXREF.S�READYHDŠXREF.S�SDEFTYPŠXREF.S�SEMENDŠXREF.S�SEMLIST ŠXREF.S�TCBHDŠXREF.S�TDEFTYP ŠXREF.S�TIATŠXREF.S�TIME_LEFTŠXREF.S�TRACEBEGŠXREF.S�TRACFLAGŠXREF.S�TRP15TYPŠXREF.S�UDEFTYPŠXREF.S�UDRBEGŠXREF.S�USTBEGŠXREF.S�VCTUBGN * *„REFERENCES�TO�INITDATA�SEGMENT* ŠSECTION�8 ŠXREFƒASNŠXREFƒDISPATCH ŠXREFƒEEND ŠXREFƒESTACK ŠXREFƒESTART ŠXREFƒGSTSIZ ŠXREFƒIOVSIZ ŠXREFƒMEMTYPA ŠXREFƒMEMTYPS ŠXREFƒMEMTYPT ŠXREFƒMEMTYPUŠXREFƒPAGESIZE ŠXREFƒPANELA ŠXREFƒPATSIZ ŠXREFƒRDYHEAD ŠXREFƒSMEMHI ŠXREFƒSMEMLOŠXREFƒSTARTMAP ŠXREFƒTCBHEAD ŠXREFƒTRCFLAG ŠXREFƒTRCSIZ ŠXREFƒUDRSIZ ŠXREFƒUSTSIZŠXREFƒWHERLOAD‰PAGE(START…MOVE.L�#$400,A7‹LOAD�STACK�POINTER.ŠMOVE.L�D0,$3FCŒBE�SURE�MEMORY�CAN�BE�ACCESSED*$*ˆCLEAR�MEMORY�THROUGH�END�OF�SYSPAR*2ŠLEA„CRASHSAV,A0ˆSTART�WHERE�USEABLE�MEMORY�STARTS(ŠMOVE.L�#ENDSYSP,D6ˆEND�AT�END�OF�SYSPAR$ŠSUB.L‚A0,D6ŽCOUNT�OF�BYTES�TO�CLEAR#ŠADD.L‚#255,D6ŒCLEAR�TO�END�OF�PAGEŠCLR.B‚D6‘EVEN�PAGE�BOUNDRYŠBSR„TBLCLRBŒCLEAR�MEMORY*'ŠMOVE.L�ESTACK(PC),A7†LOAD�SYSTEM�STACK/ŠMOVE.L�A7,EXCSTACKˆSAVE�STACK�POINTER�FOR�EXEC 1*ˆIMPORTANT�-�D4�MUST�NOT�BE�ALTERED�BEFORE�THIS!*BŠMOVE.L�D4,TRP15TYP„Save�flag�from�IPL�or�BUG�in�SYSPAR�describing%*Ÿwhat�TRAP�#15�* support�is�available.4ŠMOVE.L�$24,MACSTRCˆSAVE�BUG'S�TRACE�ROUTINE�ADDRESS8ŠMOVE.L�$BC,BUGTRP15‡SAVE�BUG'S�TRAP�#15�ROUTINE�ADDRESS *,*‡FIND�OUT�IF�PANEL�EXISTS�-�PUT�'BF'�IN�LED*)ŠMOVE.L�PANELA(PC),A1†PANEL�ADDRESS�TO�A1!ŠMOVE.L�A1,PANEL‹SAVE�IT�FOR�EXEC ŠBEQ.S‚PANELBEŒGO�ON�IF�NO�PANEL(ŠLEA„PANELBE(PC),A0…GO�HERE�ON�BUS�ERROR"ŠMOVE.L�A0,$8ŽSET�BUS�ERROR�VECTOR+ŠMOVE.W�#$80,FPLEDST(A1)ƒTEST�FOR�BUS�ERROR ŠMOVE.W�#$BF,D1ŒWANT�'BF'�IN�LEDŠBSR„PANELEDD‹GO�LIGHT�IT�UP ŠBRA.S‚MOVE2LOŒGO�TO�MOVE�MEMORY*1PANELBEƒMOVE.L�#CRASHSAV,PANEL„SET�PANEL�TO�DUMMY'ŠMOVE.L�EXCSTACK,A7ˆRESET�STACK�POINTERŠPAGE*/*†MOVE�ALL�OF�OS�TO�LOWER�MEMORY�IF�APPROPRIATE*3MOVE2LOƒMOVE.L�WHERLOAD(PC),D1„WHERE�ARE�WE�LOADED?ŠBEQ.S‚VECTINIT‹BRANCH�IF�AT�0'ŠMOVE.L�ESTART(PC),A3†'MOVE�TO'�ADDRESS!ŠMOVE.L�D1,A2Ž'MOVE�FROM'�ADDRESS'ŠLEA„ENDMEMT(PC),A4…END�OF�MEMORY�TABLEM*------------------------------------------------------------------- 08/20/85%**ˆADD.L‚#$800,A4‹EXTRA�FOR�MINI-TCBS1ŠMOVE.L�#MTCBLN*15+255,D0‚LENGTH�OF�~15�MINI-TCBS#ŠCLR.B‚D0‘MAKE�SURE�ON�256�BOUNDARY ŠADD.L‚D0,A4ŽEXTRA�FOR�MINI-TCBSM*----------------------------------------------------------------------------&ŠLEA„VECTINIT(PC),A0„WHERE�TO�GO�LATER%ŠSUB.L‚A2,A0ŽSUBTRACT�START�OF�'FROM'ŠADD.L‚A3,A0ŽADD�START�OF�'TO'(ŠLEA„MOVDONE(PC),A1…GO�HERE�ON�BUS�ERRORŠMOVE.L�A1,$8ŽBUS�ERROR�VECTOR*#MOVEALLƒMOVE.L�(A2)+,(A3)+ˆMOVE�ALLŠCMP.L‚A2,A4ŽFINISHED?ŠBHI„MOVEALLŒBRANCH�IF�NO ŠADD.L‚#6,A7*'MOVDONEƒJMP„(A0)�CONTINUE�IN�OTHER�COPYŠPAGE*J*ƒHere�we�read�the�VECTTBL�file�and�use�it�to�initialize�the�vector�table.D*ˆRefer�to�.VECTTBL.AG�for�detailed‚format�and�definition�of@*ˆthe�VECTTBL.‚Basically�4�types�of�entries�are�generated�by�the *ˆmacros:*ˆType�1:ƒVEXX00AAAAAAAA*ˆType�2:ƒRAXXYYAAAAAAAA*ˆType�2:ƒBTXXYYAAAAAAAA*ˆType�3:ƒET000000000000**A*ˆWhere�VE,�RA,�BT,�and�ET�are�Ascii�strings�representing�VEctor,D*ˆRAnge,�By-Twos,�and�End-of-Table,�repectively.‚XX�is�the�beginning=*ˆvector�number�of�the�vector�range�(0-$FF),�YY�is�the�endingF*ˆvector�of�the�vector�range�(0-$FF).‚AAAAAAAA�is�the�32�bit�vector�toE*ˆbe�stored�in�the�Vector�table.‚For�BT,�AAAAAAAA�is�incremented�by�2A*ˆfor�each�successive�vector.‚Gaps�in�the�vector�numbers�indicateB*ˆdon't�take�over�the�vector.‚If�an�ET�entry�is�hit�before�all�the@*ˆvectors�have�been�initialized,�the�rest�of�the�vectors�are�not *ˆtaken�over.*;*ˆExample:ƒRANGE,05,08,PROGINT1‡(addr�of�PROGINT1�=�$30100)-*“BYTWOS,$C,$F,TRAP3‰(addr�of�TRAP3�=�$40000)-*“VECTOR,$10,COMINTŠ(addr�of�COMINT�=�$50000) *“ENDTABLE**“is�stored�in�VECTTBL�as**“5241050800030100*“42540C0F00040000*“5645100000050000*“4554000000000000*6*“and�indicates�that�vectors�0-4�are�to�be�left�alone,6*“vectors�5-8�are�to�be�initialized�to�$30100,�vectors7*“9-$B�are�left�alone,�vectors�$C-$F�are�initialized�to3*“$40000,�$40002,�$40004,�and�$40006,�respectively,9*“vector�$10�is�to�be�initialized�to�$50000,�and�the�rest$*“of�the�vector�table�is�left�alone. :*“The�first�long�word�of�VECTTBL�is�!VCT,�and�the�2nd�long *“word�is�the�address�of�COMINT.‰PAGE**ˆSET�UP�VECTORS*;VECTINIT‚MOVE.L�ESTART(PC),A2†START�SEARCH�AT�START�OF�EXEC&ŠMOVE.L�#'!VCT',D0‰D0=!VCT�FOR�COMPARE&ŠLEA„$200(A2),A0ˆEND�OF�SEARCH�ADDRESS-VECTSRCH‚CMP.L‚(A2)+,D0‹IS�THIS�VECTOR�TABLE?ŠBEQ.S‚VECTSETŒBRANCH�IF�FOUND%ŠSUB.L‚#2,A2ŽWANT�TO�CHECK�EVERY�WORD$ŠCMP.L‚A0,A2ŽSHOULD�SEARCH�CONTINUE?ŠBNE„VECTSRCH‹BRANCH�IF�YES&ŠBSR„KILL_INITŠNO�VECTOR�TABLE�--�QUIT*B*ˆNOTE:‚We�can't�use�new�KILL.EXECT0�macro�here�since�TRAP0�vector*�has�not�been�initialized.*VECTSET:*ŠMOVE.L�(A2)+,A4‹ADDRESS�OF�COMINT�ROUTINE;ŠMOVE.L�A4,VCTUBGN‰SAVE�COMINT�ADDRESS�FOR�VECTOR�USE�TABLE +ŠMOVE.W�(A2)+,D0‹Get�first�VECTTBL�entry_ID&ŠCLR.L‚D5‘Initialize�upper�bytes�of�D5'ŠMOVE.B�(A2)+,D5‹Get�beginning�vector�#/ŠMOVE.B�(A2)+,D6‹Get�ending�vector�#�(may�be�0) >*‰Now�proceed�through�VECTTBL�until�hit�end_of_table�indicator*  .ŠWHILE.W‚D0��#'ET'‚AND.B‚D5��#$FF‚DO.S #�MOVE.L‚(A2)+,A5‡Get�vector�address �MOVE.L‚D5,D4ŠGet�vector�#�in�D40�LSL.Lƒ#2,D4ŠVector-table�address�=�vector�#�*�4'�MOVE.L‚D4,A3ŠA3�=�Vector-table�address ,�BSR.SƒVECTSTOR‡Store�vector�in�Vector-tableC*ŒNow�store�vectors�in�Vector-table�until�hit�end�of�user-specified *Œrange�for�this�vector�address. +�WHILE.B‚D5��D6‚AND.B‚D5��#$FF‚DO.S $�ADD.B‚#1,D5ˆIncrement�vector�number%�MOVE.L�D5,D4ˆGet�vector�number�in�D40�LSL.L‚#2,D4ˆVector-table�address�=�vector�#�*�4'�MOVE.L�D4,A3ˆA3�=�Vector�table�address :*�If�VECTTBL�entry�is�"by_twos",�then�we�need�to�increment*�vector�address�by�2 �IF.W‚D0��#'BT'‚THEN.S “ADD.L‚#2,A5�ENDI 0�BSR.S‚VECTSTOR‰Now�store�vector�in�Vector-table�ENDW *�MOVE.W‚(A2)+,D0‹Get�next�VECTTBL�entry-ID0�MOVE.B‚(A2)+,D5‹Get�next�starting�vector�number.�MOVE.B‚(A2)+,D6‹Get�next�ending�vector�numberŠENDW ŠBRA.S‚VECTDONEŒWe�are�done  *‰Store�vector�in�Vector-table VECTSTOR:-*‰Don't�store�vector�if�it�is�a�"SKIP"�entry.ŠIF.W‚D0��#'SK'‚THEN.S,�MOVE.L�A5,(A3)ŒStore�vector�in�Vector-tableŠENDIŠRTS VECTDONE:**/*‡SET�BUS�ERROR�--�IN�CASE�ERROR�OCCURS�IN�INIT*+ŠPEA„GOTOKILR(PC)‡PUT�ERROR�RETURN�ON�STACK)ŠMOVE.W�#'BE',-(A7)ˆBUS�ERROR�RETURN�FLAGŠPAGE*J*‚Initialize�SYSPAR�parameters�for�background�and�CALL_GUARDED�processing.*>ŠMOVE.L�#0,BKG_HEADˆInitialize�background�queue�to�empty:‚headDŠMOVE.L�#BKG_HEAD,BKG_TAIL�ptr�is�0�and�tail�ptr�points�to�head�ptr.8ŠSF…BKG_ACTIVE‰Initialize�ACTIVE�flag�to�false�since�the*§background�isn't�running. *5*‚Initialize�LAST_MMU_INT_LEVEL�to�interrupt�level�0.*+ŠCLR„LAST_MMU_INT_LEVEL�Set�the�level�to�0.  *+*‡START�PROCESSING�MEMORY�PARTITION�ENTRIES* ŠBSR„IMEM **†SET�DEFAULT�MEMORY�TYPES*1ŠMOVE.B�MEMTYPA(PC),ADEFTYP�DEFAULT�TYPE�FOR�ASQS1ŠMOVE.B�MEMTYPT(PC),TDEFTYP�DEFAULT�TYPE�FOR�TCBS9ŠMOVE.W�MEMTYPS(PC),SDEFTYP�DEFAULT�TYPE�FOR�SYSTEM�TASKS7ŠMOVE.W�MEMTYPU(PC),UDEFTYP�DEFAULT�TYPE�FOR�USER�TASKS**ˆPUT�TASKS�ON�LISTS*,ŠMOVE.L�TCBHEAD(PC),TCBHD‚POINT�TO�FIRST�TCB0ŠMOVE.L�RDYHEAD(PC),READYHD�POINT�TO�FIRST�READY * *ˆSEMAPHORES*,SEMS†LEA„SEMLIST,A1‰START�OF�EXEC�SEMAPHORES+INITSEMƒMOVE.W�#1,(A1)ŒSET�COUNT�FIELD�TO�1 ŠCLR.L‚2(A1)ŽCLEAR�ADDRESS�FIELD(ŠADD.L‚#6,A1ŽINCREMENT�TO�NEXT�SEMAPHORE$ŠCMP.L‚#SEMEND,A1‰END�OF�SEMAPHORES? ŠBLO.S‚INITSEMŒBRANCH�BACK�IF�NO PAGE*1*ˆCREATE�TASK�CONTROL�BLOCKS�FOR�ROM�BASED�SYSTEM*NNN*LOOKTCBƒTST.L‚TCBHDŽDO�TCBS�ALREADY�EXIST?%ŠBNE„BLDTCB99‹BRANCH�IF�YES�-�NOT�ROM'ŠCLR.L‚READYHDŒBE�SURE�READYHD�IS�CLEAR4ŠLEA„ENDMEMT(PC),A3…START�SEARCH�AT�END�OF�MEM�TABLEŠLEA„$200(A3),A1ˆEND�OF�SEARCH,ŠMOVE.L�#'!TCB',D0‰INITIALIZE�D0�FOR�COMPARE'LOOKT2„CMP.L‚(A3),D0ŒLOOK�FOR�MINI�TCBSŠBEQ.S‚BLDTCBSŒBRANCH�IF�FOUND!ŠADD.L‚#2,A3ŽCHECK�ALL�EVEN�BYTESŠCMP.L‚A3,A1ŽEND�OF�SEARCH?ŠBNE„LOOKT2�LOOP�BACK2ŠKILL.EXECT0ƒINITSA,NO_MTCBS_FOUND‚QUIT�IF�NO�TCBS*M*-------------------------------+ ------------------------------------ 08/20/85.BLDTCBSƒMOVE.B�MTCBLPRI(A3),D4„TASK�PRIORITIESŠLSL.W‚#8,D4ŽUSE�PRIORITY�TWICE/ŠMOVE.B�MTCBLPRI(A3),D4„FOR�BOTH�CURR�AND�LIMIT ŠSWAPƒD4‘PRIORITIES�TO�UPPER�1/2'ŠMOVE.W�MTCBATTR(A3),D4„TASK�ATTRIBUTES&ŠMOVE.L�MTCBENTRY(A3),D5ƒENTRY�ADDRESS ŠCLR.L‚D6#ŠMOVE.W�MTCBUSER(A3),D6„USER�NUMBER,ŠMOVE.W�#$8000,D7ŠOPTIONS�-�MONITOR�SUPPLIED1ŠMOVE.L�#T0CRTCB,D0ˆDIRECTIVE�NUMBER�-�CREATE�TCBŠMOVE.L�A3,-(A7)‹SAVE�REGISTER-ŠLEA„4(A3),A3‹A3�=�ADDRESS�OF�PARAMETER�BLOCKŠTRAPƒ#0‘EXEC�DIRECTIVE$ŠBRA.S‚BLDTCB2ŒBRANCH�IF�GOOD�RETURN3ŠMOVE.L�(A7)+,A3‹RESTORE�REGISTER‚-�ERROR�IN�TRAP�0NNN<ŠKILL.EXECT0‚INITSA,CTCB_ROM_FAILED„QUIT�IF�REQUEST�REJECTED*(BLDTCB2ƒMOVE.L�(A7)+,A3‹RESTORE�REGISTERN*-------------------------------------------------------------------- 02/11/86:*ˆCoprocessor�support�for�ROMed�tasks.‚We�call�the�trap�#0?*ˆroutine�to�build�the�XTCB�for�each�bit�set�in�the�coprocessor<*ˆflag�in�the�mini-TCB.‚We�will�test�all�8�bits�in�the�flag.@*ˆThe�bit�position�in�the�flag�is�equivalent�to�the�coprocessor_?*ˆid.‚We�expect�the�user�to�want�RMS�to�supply�the�save/restore9*ˆroutines�(option�bit�0=0),�otherwise�the�task�must�call;*ˆCRXTCB�as�a�trap�#1.‚If�the�user�specifies�a�user-defined>*ˆcoprocessor_id,�we�go�to�killer�with�CXTCB_ROM_FAILED�error.*!‰MOVEQ.Lƒ#0,D1�Initialize�counter‰REPEAT.ŠBTST…D1,MTCBCFLG(A3)…Is�the�coprocessor�used?)ŠIF��THEN.S�Yes,�when�the�bit�is�set.2‹MOVE.L‚D1,D7�D7�<--�coprocessor�id�(bit�position)5‹MOVEQ.L�#0,D6�D6�<--�options�(RMS�supplies�routines)%‹MOVEM.L�D1/A3,-(A7)‰Save�these�away.9‹MOVE.L‚#T0CRXTCB,D0ˆCreate�the�XTCB�for�the�coprocessor.‹TRAP„#0‹BRA.SƒBLDTCB1�Good�return.$‹KILL.EXECT0�INITSA,CXTCB_ROM_FAILEDNNN*BLDTCB1„MOVEM.L�(A7)+,D1/A3‰Restore�these.ŠENDI+ŠADDQ.L‚#1,D1�Check�for�another�coprocessor‰UNTIL.BƒD1��#8E*--------------------------------------------------------------------#ŠMOVE.W�MTCBSTATE(A3),D2ƒSTATE�WORD#ŠMOVE.W�D2,TCBSTATE(A5)„SAVE�IN�TCB!ŠBTSTƒ#TSK2NRDY,D2‡ON�READY�LIST?ŠBEQ.S‚BLDTCB3ŒBRANCH�IF�NO3ŠMOVE.L�READYHD,TCBREADY(A5)�LINK�TO�PREVIOUS�ENTRY ŠMOVE.L�A5,READYHD‰ADD�NEW�ENTRY**ˆPUT�TST�INFO�INTO�TCB*7BLDTCB3ƒLEA„MTSTATTR(A3),A1„START�OF�TST�ATTRIBUTE�INF+ O)ŠLEA„MTSTMMU(A3),A2…START�OF�TST�MMU�INFO)ŠMOVE.L�#SEGMENTS-1,D0…MAX�#�SEGMENTS�-�1ŠCLR.L‚D1‘CLEAR�FOR�COUNT*BLDTCB4ƒTST.B‚TSTCTL(A1)‰TEST�SEGMENT�TYPE#ŠBEQ.S‚BLDTCB6ŒBRANCH�IF�NO�SEGMENT$ŠADD.L‚#1,D1ŽCOUNT�SEGMENTS�EXISTING4BLDTCB6ƒLEA„TSTMLEN(A2),A2…INCREMENT�TO�NEXT�SEGMENT-ŠLEA„TSTALEN(A1),A1…INCREMENT�TO�NEXT�SEGMENT*ŠDBRAƒD0,BLDTCB4‰DECREMENT�AND�BRANCH�BACK*)ŠLEA„MTSTMMU(A3),A3…START�OF�TST�MMU�INFO(ŠMOVE.L�TCBTST(A5),A4†ADDRESS�OF�NEW�TST.ŠMOVE.B�D1,TSTCSEGS(A4)„SAVE�ACTUAL�#�SEGMENTS,ŠLEA„TSTMMU(A4),A4†ADDRESS�OF�MMU�WITHIN�TST:ŠMOVE.L�#(TSTMLEN+TSTALEN)*SEGMENTS/2-1,D0‚#�WORDS�TO�MOVENNN2BLDTCB8ƒMOVE.W�(A3)+,(A4)+ˆMOVE�MMU�AND�ATTRIBUTESM*----------------------------------------------------------------------------(ŠDBRAƒD0,BLDTCB8‰CONTINUE�TILL�ALL�MOVEDŠCMP.L‚#'!TCB',(A3)‡MORE�TCB'S?ŠBEQ„BLDTCBSŒBRANCH�IF�YESBLDTCB99 PAGE**ˆINITIALIZE�MMU* ŠXREFƒINITMMU3ŠBSR„INITMMUŒINVOKE�CONFIGURATION-DEPENDENT�ROUTINE **‰ADDRESS�SPACE�PARAMETERS*$ŠMOVE.L�PAGESIZE(PC),D0„GET�PAGESIZE:ŠIF…�THEN.S‰If�the�pagesize�specified�by�the�Sysgen�is%�MOVE.L�#256,D0Œzero,�default�to�256.ŠENDIƒ* ŠSUB.L‚#1,D0ŽNOTLAM�=�PAGESIZE-1$ŠMOVE.L�D0,NOTLAMŠNOTLAM�INTO�SYSPAR-ŠMOVE.L�#$FFFFFFFF,LAM…PREPARE�TO�COMPUTE�LAM$ŠSUB.L‚D0,LAM�LAM�=�$FFFFFFFF-NOTLAM*ŠCLR.L‚ASNTBL�SET�FOR�NO�ASNTBLŠMOVE.L�ASN,D2�ASNTBL�DESIRED?ŠBEQ.S‚ASN99ŽBRANCH�IF�NO.ŠMOVE.L�#2,A0Ž512�BYTES�FOR�127�ADDRESS�SPACES(ŠMOVE.L�#T0PAGAL,D0ˆPAGEALOC�DIRECTIVE�#ŠTRAPƒ#0‘EXEC�CALL"ŠBRA.S‚ASN10ŽBRANCH�IF�GOOD�RETURN7ŠKILL.EXECT0ƒINITSA,PA_ASN_FAILED„CRASH�IF�ERROR�RETURN4ASN10…MOVE.L�A0,ASNTBLŠSAVE�ASNTBL�ADDRESS�IN�SYSPAR/ŠBSR„TBLCLR�CLEAR�ADDRESS�SPACE�TABLE�TO�ZEROESŠMOVE.L�#'!ASN',(A0)‡EYECATCHERASN996ŠMOVE.B�#$FF,CURR_ASN†RESET�CURR_ASN�MEMORY�COMPONENT. **ˆBUILD�GLOBAL�SEGMENT�TABLE*NNNABLDGST„CLR.L‚GSTBEG‹SET�SYSPAR�ADDRESS�TO�0�IN�CASE�NO�GST�NEEDEDŠMOVE.L�GSTSIZ(PC),D2†NEED�GST?ŠBEQ.S‚BLDUST�BRANCH�IF�NO)ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGEALOC(ŠMOVE.L�#T0PAGAL,D0ˆPAGEALOC‚DIRECTIVE�#ŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDGST01‹BRANCH�IF�GOOD�RETURN7ŠKILL.EXECT0ƒINITSA,PA_GST_FAILEDƒCRASH�IF�ERROR�RETURN3BLDGST01‚MOVE.L�A0,GSTBEGŠSAVE�GST�ADDRESS�FOR�EXECŠBSR„TBLCLR�CLEAR�GST�TO�ZEROESŠMOVE.L�#'!GST',(A0)‡EYECATCHER-ŠMOVE.W�#1,GSTNSEG(A0)…NUMBER�OF�GST�SEGMENTS)ŠMOVE., W�D2,GSTNPAGE(A0)„GST�LENGTH�TO�GSTŠLSL.L‚#8,D2ŽLENGTH�IN�BYTES2ŠSUB.L‚#GSTENTRY,D2‡SUBTRACT�LENGTH�OF�HEADER�INFO&ŠDIVUƒ#GSTEL,D2ŠDIVIDE�BY�ENTRY�LENGTH-ŠMOVE.W�D2,GSTMENT(A0)…SAVE�MAXIMUM�#�ENTRIES)ŠLEA„GSTENTRY(A0),A2„ADDRESS�OF�1ST�ENTRY%ŠMOVE.L�A2,GSTFENT(A0)…SAVE�IN�HEADER PAGE**ˆBUILD�USER�SEMAPHORE�TABLE*9BLDUST„CLR.L‚USTBEG�CLEAR�UST�ADDRESS�IN�CASE�NONE�NEEDEDŠMOVE.L�USTSIZ(PC),D2†NEED�UST?ŠBEQ.S‚BLDVTU�BRANCH�IF�NO(ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGALOC,ŠMOVE.L�#T0PAGAL,D0ˆDIRECTIVE�#�FOR�PAGEALOCŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDUST01‹BRANCH�IF�GOOD�RETURN4ŠKILL.EXECT0‚INITSA,PA_UST_FAILED‚CRASH�IF�NO�MEMORY3BLDUST01‚MOVE.L�A0,USTBEGŠSAVE�UST�ADDRESS�FOR�EXECŠBSR„TBLCLR�CLEAR�UST�TO�ZEROES*ŠMOVE.L�#'!UST',UST(A0)„EYE�CATCHER�TO�UST)ŠMOVE.W�#1,USTNSEG(A0)…ONLY�1�UST�SEGMENT(ŠMOVE.W�D2,USTNPAGE(A0)„#�PAGES�IN�TABLE#ŠLSL.L‚#8,D2ŽCONVERT�PAGES�TO�BYTES(ŠSUB.L‚#USTENTRY,D2‡SUBRTACT�HEADER�SIZE&ŠDIVUƒ#USTEL,D2ŠDIVIDE�BY�ENTRY�LENGTH-ŠMOVE.W�D2,USTMENT(A0)…SAVE�MAXIMUM�#�ENTRIES(ŠLEA„USTENTRY(A0),A2„FIRST�ENTRY�ADDRESS(ŠMOVE.L�A2,USTFENT(A0)…SAVE�IT�IN�HEADER **ˆBUILD�VECTOR�USE�TABLE*+BLDVTU„MOVE.L�#1,A0ŽSIZE�IS�ALWAYS�ONE�PAGE,ŠMOVE.L�#T0PAGAL,D0ˆDIRECTIVE�#�FOR�PAGEALOCŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDVTU01‹BRANCH�IF�GOOD�RETURN:ŠKILL.EXECT0‚INITSA,PA_VTU_FAILED„CRASH�IF�NO�MEMORY�FOUND�THEN.SŒBRANCH�IF�NO#�MOVE.L�#1,D2‹PAT�minimum�size�is�1ŠENDI)ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGEALOC(ŠMOVE.L�#T0PAGAL,D0ˆPAGEALOC‚DIRECTIVE�#ŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDPAT01‹BRANCH�IF�GOOD�RETURN7ŠKILL.EXECT0ƒINITSA,PA_PAT_FAILED…CRASH�IF�ERROR�RETURN3BLDPAT01‚MOVE.L�A0,PATBEGŠSAVE�PAT�ADDRESS�FOR�EXECŠBSR„TBLCLR�CLEAR�PAT�TO�ZEROESŠMOVE.L�#'!PAT',(A0)‡EYECATCHER#ŠLSL.W‚#8,D2ŽCONVERT�PAGES�TO�BYTES&ŠMOVE.L�D2,PATTSIZ(A0)…SAVE�TABLE�SIZEŠLEA„0(A0,D2),A2ˆTOP�OF�TABLE)ŠLEA„PATENTRY(A0),A1„ADDRESS�OF�1ST�ENTRYŠLEA„PATFHDR-PATNEXT(A0),A4:BLDPAT04‚MOVE.L�A1,PATNEXT(A4)…SAVE�ENTRY�ADDRESS�IN�CHAIN)ŠMOVE.L�#-1,PATTCB(A1)…FLAG�ENTRY�AS�FREE(ŠMOVE.L�A1,A4ŽSAVE�CURRENT�ENTRY�ADDRESS%ŠLEA„PATEL(A1),A1‡POSSIBLE�NEXT�ENTRY#ŠLEA„PATEL(A1),A3‡POINT�BEYOND�NEXTŠCMP.L‚A3,A2ŽWILL�IT�FIT?#ŠBCC„BLDPAT04‹YES,�GO�INITIALIZE�IT PAGEE*�Insert�two�dummy�entries�into�the�PAT�list.‚These�entries�will�haveG*ƒthe�maximum�possible�delta�and�will�cause�and�exec�procedure�to�fire.F*ƒThe�code�for�the�exec�procedure�is�contained�in�the�RMS.SA�module�ofE*ƒRMS68K.‚These�nodes�are�placed�on�the�PAT�so�that�th, e�PAT�list�willE*ƒnever�be�empty,�simplifying�PAT�processing�in�many�places.‚When�theG*ƒPAT�node�fires,�the�associated�code�in�the�RMS.SA�module�gets�controlG*ƒand�this�code�simply�places�a�dummy�PAT�node�(like�the�one�that�firedE*ƒto�get�us�here)�at�the�very�end�of�the�PAT�list.‚This�scheduling�ofI*ƒthe�dummy�PAT�node�is�a�special�case�in�that�it�does�not�use�the�normal/*ƒPAT�node�schedule�routine�PAT_SCHED_NEW_NODE. �#'DUMY'�DO.S �LEA‚2(A3),A3ŠENDW ŠLEA„4(A3),A3$*£A3�now�contains�the�address�of�the"*£exec�code�to�reschedule�the�node"ŠBSR.S‚BLDPAT12‹Build�a�dummy�node;ŠMOVE.L�A4,PATHDR(A0)†Link�the�dummy�node�into�the�PAT�list4ŠMOVE.L�A4,A2ŽSave�addr�of�this�node�for�future�link1ŠBSR.S‚BLDPAT12‹Build�an�identical�2nd�dummy�node/ŠMOVE.L�A4,PATNEXT(A2)…Link�2nd�node�behind�1stŠMOVE.L�#PATBIGDELTA,NSE>ŠMOVE.L�#PATBIGDELTA,TIME_LEFT�Make�TIME_LEFT�as�big�as�we�canŠCLR.L‚MIDNIGHT.ŠBRA.S‚BLDUDR�Done�with�PAT�stuff�all�together*$* Subroutine to build dummy PAT node:BLDPAT12‚MOVE.L�PATFHDR(A0),A4…A4�points�to�free�PAT�entry@ŠMOVE.L�PATNEXT(A4),PATFHDR(A0)�Unlink�this�entry�from�free�list*£Initialize�PAT�entriesŠCLR.L‚PATNEXT(A4)$ŠCLR.L‚PATTCB(A4)‰Indicate�exec�node5ŠMOVE.L�#PATBIGDELTA,PATDELTA(A4)�Make�delta�very�bigŠCLR.L‚PATINTV(A4)'ŠMOVE.L�A3,PATASR(A4)†Execution�address(ŠCLR.W‚PATOPT(A4)‰Options�-�not�periodic4ŠMOVE.L�#PATDUMMYID,PATARID(A4)�Plug�in�the�dummy�ID4ŠMOVE.W�#$FFFF-$0700,PATILVL(A4)�Interrupt�level�=�0ŠRTS PAGE*$*ˆBUILD�USER�DEFINED�DIRECTIVE�TABLE*9BLDUDR„CLR.L‚UDRBEG�CLEAR�UDR�ADDRESS�IN�CASE�NONE�NEEDEDŠMOVE.L�UDRSIZ(PC),D2†NEED�UDR?ŠBEQ.S‚BLDTRACŒBRANCH�IF�NO(ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGALOC,ŠMOVE.L�#T0PAGAL,D0ˆDIRECTIVE�#�FOR�PAGEALOCŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDUDR01‹BRANCH�IF�GOOD�RETURN4ŠKILL.EXECT0‚INITSA,PA_UDR_FAILEDƒCRASH�IF�NO�MEMORY3BLDUDR01‚MOVE.L�A0,UDRBEGŠSAVE�UST�ADDRESS�FOR�EXECŠBSR„TBLCLR�CLEAR�UST�TO�ZEROES*ŠMOVE.L�#'!UDR',UDR(A0)„EYE�CATCHER�TO�UDR#ŠLSL.L‚#8,D2ŽCONVERT�PAGES�TO�BYTES(ŠSUB.L‚#UDRENTRY,D2‡SUBRTACT�HEADER�SIZE(ŠDIVUƒ#UDRESIZ,D2ˆDIVIDE�BY�ENTRY�LENGTH,ŠMOVE.W�D2,UDRCNT(A0)†SAVE�MAXIMUM�#�ENTRIES **ˆBUILD‚TRACE�TABLE*DBLDTRACƒCLR.L‚TRACEBEG‰CLEAR�SYSPAR�ADDRESS�IN�CASE�TRACE�NOT�NEEDED'ŠMOVE.L�TRCSIZ(PC),D2†NEED�TRACE�TABLE?ŠBEQ.S‚BLDTIATŒBRANCH�IF�NO)ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGEALOC(ŠMOVE.L�#T0PAGAL,D0ˆPAGEALOC�DIRECTIVE�#ŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDTRC01‹BRANCH�IF�GOOD�RETURN4ŠKILL.EXECT0‚INITSA,PA_TRC_FAILEDƒCRASH�IF�NO�MEMORY1BLDTRC01‚MOVE.L�A0,TRACEBEGˆSAVE�ADDRESS�FOR�EXEC'ŠBSR„TBLCLR�CLEAR�TRACE�TABLE�TO�ZEROES+ŠLEA„TRCENTRS(A0),A2„ADDRESS�OF�FIRST�ENTRYŠMOVE.L�A2,(A0)ŒSAVE�IN�HEADER#ŠLSL.L‚#8,D2ŽCONVERT�BYTES�TO�PAGES(ŠSUB.L‚#TRCENTRS,D2‡SUBTRACT�HEADER�SIZE'ŠDIVUƒ#TRCENTSZ,D2‡DIVIDE�BY�ENTRY�SIZE)ŠMULUƒ#TRCENTSZ,D2‡MULTIPLY�BY�ENTRY�SIZE$ŠADD.L‚A2,D2ŽADD�ENTRY�START�ADDRESS4ŠMOVE.L�D2,TRCLNG(A0)†SAVE�END�ADDRESS�OF�LAST�ENTRY*,ŠMOVE.W�TRCFLAG(PC),TRACFLAG�SET�TRACE�FLAGS *#*ˆTRAP�INSTRUCTION�ASSIGNMENT�TABLE*>BLDTIATƒMOVE.L�#$01010000,TIAT„SET�TRAP�0�AND�1�'USED�BY�EXEC'ŠPAGE*0*…INITIALIZE�CONFIGURATION-DEPENDENT�I/O�DEVICES* ŠXREFƒINITIO)ŠBSR„INITIO�SUBROUTINE�WILL�INITIALIZE�IO * *ˆSTART�TIMER* ŠXREFƒTIMERST3ŠBSR„TIMERSTŒINVOKE�CONFIGURATION-DEPENDENT�ROUTINE *(*ˆINDICATE�SYSTEM�RUNNING�ON�FRONT�PANEL*-FPGO†MOVE.L�EXCSTACK,A7ˆRESTORE�STACK�POINTER)ŠMOVE.W�#$C0,D1ŒWANT�'C0'�IN�PANEL�LIGHTS4ŠBSR.S‚PANELEDE‹SET�LIGHTS�-�ENABLE�READY/FAIL�LIGHT**‰GO�TO�EXEC�-�INIT�COMPLETE*‰BRA.L…INITEND‰PAGE**ƒGO�TO�REGULAR�KILLER�ROUTINE* GOTOKILR:4‰KILL.EXECT0‚INITSA,BERR_UNEXPECTEDƒCrash�the�system *- NNNNNN-*ƒSPECIAL�KILLER�ROUTINE�--�ERROR�DURING�INIT*"KILL_INIT�PEA„(A6)�SAVE�REGISTER�6 ŠLEA„CRASHSAV,A6ˆCRASH�SAVE�AREA/ŠMOVE.W�#0001,(A6)‰Indicate�exec�crashed�system!ŠMOVE.B�#INITSA,2(A6)†Module�code&ŠMOVE.B�#NO_VCT_FOUND,3(A6)�Error�code(ŠMOVE.L�4(A7),8(A6)‰SAVE�PROGRAM�COUNTER&ŠMOVE.W�SR,14(A6)‹SAVE�STATUS�REGISTER0ŠDISABLE_INTERRUPTSˆBE�SURE�INTERRUPTS�INHIBITED!ŠLEAƒ20(A6),A6‹REGISTER�SAVE�AREA-ŠMOVEM.L�D0-D7/A0-A5,(A6)‚SAVE�MOST�REGISTERS$ŠMOVE.L�(A7)+,56(A6)‡SAVE�REGISTER�6$ŠMOVE.L�A7,60(A6)ŠSAVE�STACK�POINTER'KILLOOPƒMOVE.W�#$A2,D1ŒWANT�'A2'�IN�LED/ŠBSR.S‚PANELEDE‹PUT�IT�THERE�-�ALLOW�FAIL�LIGHT4ŠBRA„KILLOOPŒLOOP�-�WAIT�FOR�SOMEONE�TO�DO�SOMETHING * *ˆTABLE�CLEAR*'TBLCLR„MOVE.L�D2,D6ŽGET�LENGTH�IN�PAGESŠLSL.L‚#8,D6ŽLENGTH�IN�BYTES!TBLCLRBƒMOVE.L�D6,A6ŽLENGTH�IN�A6ŠADD.L‚A0,A6ŽEND�+�1�IN�A6$ŠCLR.L‚D6‘THE�ZERO�THAT�GET'S�STORED&TBLCLRLƒMOVE.L�D6,-(A6)‹STORE�ONE�WORDŠCMP.L‚A0,A6ŽDONE?&ŠBHI.S‚TBLCLRLŒBRANCH�BACK�IF�NOT�DONEŠRTS—GO�BACK�WHEN�DONEŠPAGE*#*ƒPANELEDE�--�ENABLE‚TTO�--�SET�LED$*ƒPANELEDD�--�DISABLE�TTO�--�SET�LED*-PANELEDE‚MOVE.W�#$10,D0ŒCLEAR�DISABLE�TTO�BIT&ŠBRA.S‚PANELD2ŒSKIP�AROUND�OTHER�ENTRY+PANELEDD‚MOVE.W�#$90,D0ŒSETƒDISABLE�TTO�BIT*PANELD2ƒNOT.B‚D1‘USE�COMPLEMENT�TO�SET�LEDŠROR.L‚#4,D1ŽSEPARATE�DIGITSŠOR.BƒD1,D0ŽPUT�MSD�IN�D0ŠMOVE.W�#$02,D1Œ'SET�LSD'�FLAGŠROL.L‚#4,D1ŽLSD�IN�D1!ŠMOVE.L�PANEL,A1‹ADDRESS�OF�PANEL'ŠLEA„FPLEDST(A1),A1…LED�STATUS�REGISTER+ŠMOVE.W�D1,(A1)ŒSET�LEAST�SIGNIFICANT�DIGITŠOR.Wƒ#$30,D1ŒSET�LATCH�BITSŠMOVE.W�D1,(A1)ŒLATCH�IT*ŠMOVE.W�D0,(A1)ŒSET�MOST�SIGNIFICANT�DIGITŠOR.Wƒ#$30,D0ŒSET�LATCH�BITSŠMOVE.W�D0,(A1)ŒLATCH�ITŠRTS N‰NOLIST* **‚INCLUDED�FILES:* **ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.KILL.MC*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TRAP15.MC*ˆINCLUDEƒ9999.&.KILLEXEC.EQ*‰NOLIST‰INCLUDEƒ9995.&.KILL.MC‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TRAP15.MC‰INCLUDEƒ9999.&.KILLEXEC.EQ‰PAGE‰LIST‰SPCƒ1HKILLERƒIDNT‚45,0„M68XXX�-�SAVE�THE�CRASH�INFO.�AND�BRING�THE�SYSTEM�DOWN‰SPC�1O**********************************************- ***********************************ˆ9999.M68XXX.KILLER.SA**ˆThe�system�has�crashed:7*‹1.�Save�the�processor�registers�in�the�CRASHSAV�area.?*‹2.�Format�information�about�the�crash�into�the�CRASHSAV�area.,*‹3.�Turn�on�board�specific�fail�indicators.?*‹4.�Output�a�'SYSTEM�CRASHED'�message�to�the�console�using�the0*Žfirmware�debugger's�TRAP�#15�I/O�capabilities.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*<*ˆEntry:„7�different�entry�points,�each�with�their�own�entry3*’conditions,�as�specified�before�each�entry�point.*1*ˆCalls:�Firmware�debugger�TRAP�#15�I/O�routines.**ˆExit:‚No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------C*ˆ04/01/86‚Julie�Hoban„Changed�order�of�displayed�items�in�CRASHSAVNN¦4¯·N¿NÇPÏA×=ß'ç<ï1.*¡and�moved�output�message�routines�to�device-$*¡dependent�modules�for�all�systems.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 ‰OPT…CL ‰SECTION�LEVEL00*‰XDEF„KILLER�OLD�ENTRY�POINT‰XDEF„KILLERT0ŽOLD�ENTRY�POINT5‰XDEF„ABORT_KILLŒCritical�task�has�aborted�via�ABORTC9‰XDEF„ACCESS_KILL‹Bad�Bus�Error�or�Address�Error�in�Exec.9‰XDEF„DRIVER_KILL‹Driver�has�crashed�system�-�TRAP�#‚ent.8‰XDEF„SBDRIVER_KILL‰Subroutine�interface�for�KILL_DRIVERB‰XDEF„EXCEPT_KILLƒBad�supervisor�mode�exception�(zero�divide,etc.)(‰XDEF„EXEC_KILL�Exec�has�crashed�system.NNNNN9‰XDEF„EXECT0_KILL‹Exec�has�crashed�system�-�TRAP�#0�entry ‰XDEF„TRAP0_KILLŒBad�TRAP0�call.6‰XDEF„VECTOR_KILL‹Vectored�directly�here�from�VECTTBL. 9‰XREF.S‚BUGTRP15ŽSyspar�variable�-�TRAP�#15�routine�addr.‰XREF„CRASHSAV ‰XREF.S‚PANEL‰XREF„PR. OGINT8‰XREF„RESVCT23>‰XREF.S‚TRP15TYPˆSyspar�variable�-�Type�of�TRAP�#15�I/O�avail. *ˆEQUATES EXEC…EQU‡1CRITICAL�EQU‡2 VECTORƒEQU‡3 EXCEPTƒEQU‡4 ACCESSƒEQU‡5 DRIVERƒEQU‡6*9T15IO„EQU‡0‰SET�IF�PRIMARY�TRAP�#15�I/O�SUPPORT�AVAILABLE=ALT15IO‚EQU‡2‰SET�IF�ALTERNATE�TRAP�#15�I/O�SUPPORT�AVAILABLECR‡EQU‡$0D‡Carriage�return1STRTCRSH�EQU‡20ˆLength�of�first�part�of�CRASHSAV. *ˆMessages /MSGCRASH„DC.BƒCR,'SYSTEM�CRASHED…CRASHSAV�AT‚$' ENDCRASH„DS…0 MSGBLANK„DC.BƒCR,'�' ENDBLANK„DS…0  ‰PAGE* *ƒEXEC_KILL#*ƒEXECT0_KILL�-�TRAP�#0�ENTRY�POINT1*‰An�exec�module�has�decided�to�crash�the�system.*;*ˆCalled�From:‚Any�Exec�routine�which�can�crash�the�system.**ˆEntry�Conditions:6*’(A7)†Points�to�2�byte�error�code�-�source�and�reason*œfor�the�crash.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚* *™A‚*‡PƒP**™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed* !*’The�EXEC�has�crashed�the�system EXECT0_KILL: EXEC_KILL:/‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+20‚Save�registers"‰MOVE.W„SR,D0’Save�status�register$‰OR.W„#$700,SR‘STOP�OTHER�INTERRUPTS F*ƒNOTE:‚If�we�arrive�here�from�a�TRAP�#0,�the�SR�will�have�the�correct0*Šinterrupt�mask,�but�incorrect�condition�codes. .‰MOVE.L„#STRTCRSH,D1‹Number�of�bytes�to�clear.-‰LEA‡CRASHSAV,A0ŒAddress�to�start�clearing�at0‰BSR‡CLRAREA�Clear�1st�20�bytes�of�CRASHSAV�area 2‰MOVE.W„#EXEC,CRASHSAV‰Indicate�format�of�CRASHSAV6‰MOVE.W„D0,CRASHSAV+6ŠSave�status�register�in�CRASHSAV 4‰MOVE.L„(A7),A0�Stacked�PC�points�to�Source�&�Reason7‰MOVE.W„(A0),CRASHSAV+2ˆSave�Reason�and�Source�of�crash‰MOVE.L„A0,CRASHSAV+8ŠSave�PC.!‰BRA‡KILLER2�Branch�to�next�piece‰PAGE *ˆABORT_KILL7*ˆA�critical�task�has�aborted�via�the�ABORTC�directive.**ˆCalled�from:‚ABORTC**ˆEntry�Conditions:**’A4�=�parameter�block�address*’A6�=�requester's�TCB�address**ˆParameter�Block:1*’2(A4)‚Abort�code�-�module�and�reason�for�crash.*’4(A4)‚Task�defined�field. !*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚**™AŠPƒP**™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed* ABORT_KILL:/‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+20‚Save�registers$‰OR.W„#$700,SR‘STOP�OTHER�INTERRUPTS .‰MOVE.L„#STRTCRSH,D1‹Number�of�bytes�to�clear.-‰LEA‡CRASHSAV,A0ŒAddress�to�start�clearing�at0‰BSR‡CLRAREA�Clear�1st�20�bytes�of�CRASHSAV�area 6‰MOVE.W„#CRITICAL,CRASHSAV…Indicate�format�of�CRASHSAV 6‰MOVE.W„2(A4),CRASHSAV+2‡Save�Source�&�Reason�of�Crash8‰MOVE.L„TCBNAME(A6),CRASHSAV+4�Save�Taskname�in�CRASHSAV5‰MOVE.L„10(A7),CRASHSAV+8†Save�stacked�PC�in�CRASHSAV;‰MOVE.L„TCBSESSN(A6),CRASHSAV+12�Save�Session�#�in�CRASHSAV=‰MOVE.L„4(A4),CRASHSAV+16†Save�task�defined�field�in�CRASHSAV !‰BRA‡KILLER2�Branch�to�next�piece‰PAGE *„VECTOR_KILL>*ˆWe�had�a�bad�exception�that�vectored�directly�to�this�point.*4*ˆCalled�From:‚Vectored�directly�here�-�see�VECTTBL.**ˆEntry�Conditions:*’(A7)‚Exception�stack�frame.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚**™AŒ*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed*>*ˆWe�had�a�bad�exception�that�vectored�directly�to�this�point. VECTOR_KILL:/‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+20‚Save�registers$‰OR.W„#$700,SR‘STOP�OTHER�INTERRUPTS .‰MOVE.L„#STRTCRSH,D1‹Number�of�bytes�to�clear.-‰LEA‡CRASHSAV,A0ŒAddress�to�start�clearing�at0‰BSR‡CLRAREA�Clear�1st�20�bytes�of�CRASHSAV�area 4‰MOVE.W„#VECTOR,CRASHSAV‡Indicate�format�of�CRASHSAV ,‰MOVE.W„(A7)+,CRASHSAV+6‡Save�SR�in�CRASHSAV,‰MOVE.L„(A7)+,CRASHSAV+8‡Save�PC�in�CRASHSAV *ˆ68000�doesn't�stack�a�VOR. ‰IFNE†CHIPTYPE-68000"ŒMOVE.W„(A7)+,CRASHSAV+12ƒSave�VOR‰ENDC !‰BRA‡KILLER2�Branch�to�next�piece ‰PAGE *ƒEXCEPT_KILL#*‰Bad�exception�in�Supervisor�Mode.**ˆCalled�From:ƒEXCEPT.**ˆEntry�Conditions:&*‘4(A7)†Secondary�vector�table�address3*‘8(A7)†VOR�for�1st�entry�in�secondary�vector�table3. *�10(A7)†Return�PC�from�secondary�vector�table�BSR.*�14(A7)†Stacked�SR*�16(A7)†Stacked�PC*!*ˆRegister�usage:…0�1�2�3�4�5�6�7 *™D‚*�*�**™A‚***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed*,*ˆWe�had�a�bad�exception�in�supervisor�mode. EXCEPT_KILL:/‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+20‚Save�registers$‰OR.W„#$700,SR‘STOP�OTHER�INTERRUPTS .‰MOVE.L„#STRTCRSH,D1‹Number�of�bytes�to�clear.-‰LEA‡CRASHSAV,A0ŒAddress�to�start�clearing�at0‰BSR‡CLRAREA�Clear�1st�20�bytes�of�CRASHSAV�area 4‰MOVE.W„#EXCEPT,CRASHSAV‡Indicate�format�of�CRASHSAV -‰MOVE.W„14(A7),CRASHSAV+6†Save�SR�in�CRASHSAV-‰MOVE.L„16(A7),CRASHSAV+8†Save�PC�in�CRASHSAV 4‰MOVE.L„4(A7),A0�Address�of�start�of�exception�table1‰MOVE.W„8(A7),D1�Vector�offset�for�first�entry�in*©exception�table.6‰MOVE.L„10(A7),D0ŽGet�stacked�PC�from�secondary�vector*©table. ‰BSR‡CALCVOR�Calculate�VOR. 3‰MOVE.W„D0,CRASHSAV+12‰Save�pseudo�VOR�in�CRASHSAV. !‰BRA‡KILLER2�Branch�to�next�piece‰PAGE *ƒACCESS_KILL*=*ˆWe�had�a�bad�Bus�Error�or�Address�Error�in�Supervisor�Mode.**ˆCalled�From:ˆEXCEPT.**ˆEntry�Conditions:&*‘4(A7)†Secondary�vector�table�address8*‘8(A7)†VOR�for�the�1st�entry�the�secondary�vector�table8*�10(A7)†Return�address�from�secondary�vector�table�BSR..*�14(A7)�-�27(A7)‚68000�Bus�Error�stack�frame.*!*ˆRegister�usage:…0�1�2�3�4�5�6�7 *™D‚*�*�* *™A‚*�*‡*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed*3*ˆBad�Bus�Error�or�Address�error�in�Supervisor�mode ACCESS_KILL:/‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+20‚Save�registers$‰OR.W„#$700,SR‘STOP�OTHER�INTERRUPTS .‰MOVE.L„#STRTCRSH,D1‹Number�of�bytes�to�clear.-‰LEA‡CRASHSAV,A0ŒAddress�to�start�clearing�at0‰BSR‡CLRAREA�Clear�1st�20�bytes�of�CRASHSAV�area 4‰MOVE.W„#ACCESS,CRASHSAV‡Indicate�format�of�CRASHSAV 2‰MOVE.Wƒ14(A7),CRASHSAV+2‡Save�Function�Code,�etc..‰MOVE.Lƒ16(A7),CRASHSAV+16†Save�Access�Address*‰MOVE.Lƒ20(A7),CRASHSAV+4‡Save�Opcode�&�SR9‰MOVE.Lƒ24(A7),CRASHSAV+8‡Save�PC�when�exception�occurred 4‰MOVE.L„4(A7),A0�Address�of�start�of�exception�table5‰MOVE.W„8(A7),D1�Vector�offset�of�1st�entry�in�table.7‰MOVE.Lƒ10(A7),D0�Return�address�from�2nd�vector�table. ‰BSR‡CALCVOR�Go�calculate�VOR. =‰MOVE.W„#'BE',CRASHSAV+16†Put�Bus�Error�indicator�in�CRASHSAV=‰IF.WˆD0��#8ƒTHEN.S‚If�VOR�<>�8�then�must�be�Address�Err.ŒMOVE.W„#'AE',CRASHSAV+12‰ENDI #‰BRA.S…KILLER2�Branch�to�next�piece‰PAGE *„DRIVER_KILL*„SBDRIVER_KILL***ˆA�driver�has�done�a�TRAP�#0�KILLER�call.*'*ˆCalled�From:ˆSupervisor�Mode�drivers.**ˆEntry�Conditions:1*’(A7)†Stacked�PC�from�TRAP�#0�or�BSR�-�points�to1*œ2�byte�error�code,�source�and�reason�for�crash.*‘4(A7)†CCB�address*‘8(A7)†Driver-defined�field*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚* *™A‚*�*‡*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed***ˆA�driver�has�done�a�TRAP�#0�KILLER�call. DRIVER_KILL:SBDRIVER_KILL:/‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+20‚Save�registers "‰MOVE.W„SR,D0’Save�status�registerB*ˆNote�-�The�Condition�Codes�will�not�be�accurate�in�the�saved�SR,<*ˆbut�the�Supervisor�bit�and�interrupt�mask�will�be�correct. .‰MOVE.L„#STRTCRSH,D1‹Number�of�bytes�to�clear.-‰LEA‡CRASHSAV,A0ŒAddress�to�start�clearing�at0‰BSR‡CLRAREA�Clear�1st�20�bytes�of�CRASHSAV�area 6‰MOVE.W„D0,CRASHSAV+6ŠSave�status�register�in�CRASHSAV 4‰MOVE.W„#DRIVER,CRASHSAV‡Indicate�format�of�CRASHSAV $‰OR.W„#$700,SR‘STOP�OTHER�INTERRUPTS !‰MOVE.L„(A7)+,A0�Pop�PC�off�stack5‰MOVE.W„(A0),CRASHSAV+2ˆSave�Source�&�Reason�of�Crash)‰MOVE.L„A0,CRASHSAV+8ŠSave�PC�in�CRASHSAV6‰MOVE.L„(A7)+,CRASHSAV+12†Save�CCB�Address�in�CRASHSAV3‰MOVE.L„(A7)+,CRASHSAV+16†Save�Driver-Defined�info. #‰BRA.S…KILLER2�Branch�to�next�piece‰P/ AGE* *ƒTRAP0_KILL*#*ˆA�bad�TRAP�#0�call�has�been�made.*$*ˆCalled�From:ˆSupervisor�Mode�code.**ˆEntry�Conditions:*’(A7)†Stacked�PC�from�TRAP�#0*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚**™A**™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed**ˆA�bad�TRAP�#0�call�was�made.**E*ˆWe�come�here�from�the�TRAP0�module.‚Someone�has�done�a�TRAP�#0�withD*ˆa�directive�number�that�points�here.‚We�would�like�to�just�use�theE*ˆKILL.EXEC�macro�call�to�get�to�the�EXEC_KILL�entry�point�in�KILLER,B*ˆbut�the�KILL.EXEC�macro�does�an�XREF�of�EXEC_KILL�so�we�manually;*ˆdo�the�equivalent�of�the�KILL.EXEC�here.‚Note�that�the�PCA*ˆthat�will�end�up�in�CRASHSAV�will�be�the�PC�here,�not�the�PC�inB*ˆthe�TRAP0�module.‚This�will�have�to�be�documented�as�there�is�no@*ˆgood�way�around�the�problem�without�totally�re-structuring�the*ˆTRAP0�mechanism. TRAP0_KILL:0‰BSR.LƒEXEC_KILL�Call�KILLER�-�EXEC�entry�point.'‰DC.B„TRAP0SA�Module�that�called�KILLER+‰DC.B„TRAP0_BAD_NUMBER†Reason�for�the�crash‰PAGE*‚KILLER *‚KILLERT0/*ˆSomebody�has�used�the�old�KILLER�entry�point.*$*ˆCalled�From:ƒThird�party�software?**ˆEntry�Conditions:#*’(A7)†Return�PC�from�BSR�to�KILLER*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™D‚* *™A‚*�*‡*�***™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed*N 4*ˆOLD�ENTRY�POINT�-�KEEP�FOR�BACKWARDS�COMPATABILITY KILLERT0:KILLER: ‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+20 "‰MOVE.W„SR,D0’Save�status�register .‰MOVE.L„#STRTCRSH,D1‹Number�of�bytes�to�clear.-‰LEA‡CRASHSAV,A0ŒAddress�to�start�clearing�at0‰BSR‡CLRAREA�Clear�1st�20�bytes�of�CRASHSAV�area 8‰MOVE.W„D0,CRASHSAV+14‰Save�status�register�in�CRASHSAV. 6‰MOVE.L‚#'OLDF',CRASHSAV‰Indicate�old�CRASHSAV�format. $‰OR.W„#$700,SR‘STOP�OTHER�INTERRUPTS (‰MOVE.L‚(A7),CRASHSAV+8ŠSAVE�PC�OF�CRASH !*ˆNow�fall�through�to�next�piece. ‰PAGEKILLER2: *-*ˆSave�rest�of�registers�and�mask�interrupts.* ‰MOVE„USP,A1‰MOVE.L‚A1,CRASHSAV+84‹SAVE�USP 6‰LEA…CRASHSAV,A0ŽPut�address�of�CRASHSAV�in�A0�to�help *©the�user. *<*ˆNow�branch�to�device-dependent�routine�to�turn�on�fail�lt.*ˆand�output�flashing�message.*-‰BRA.LƒKILLER3’Now�do�board-specific�stuff...NNNN‰PAGE* *ˆCLRAREA*?*ˆClear�the�specified�number�of�bytes�at�the�specified�address.*5*ˆENTRY:„D1�=�number�of�bytes�to�clear�(Must�be�>=�0)$*’A0�=�Address�to�start�clearing�at.* CLRAREA: (‰SUB.Lƒ#1,D1‘Adjust�for�DBRA�instruction/ +‰BMI.SƒCLRDONE�If�D1�was�0�coming�in,�exit.$CLRLOOP‚MOVE.B‚#0,(A0)+ŽClear�a�byte'‰DBRA„D1,CLRLOOPŒDone?�-�branch�if�not. CLRDONE‚RTS‰PAGE* *ˆCALCVORB*ˆNow�we�calculate�the�VOR.‚The�formula�for�exceptions�that�are�in)*ˆorder�in�the�secondary�vector�table�is:D*ˆVOR�=�2*[(stacked�PC�-�2)�-�addr(start�of�table)]�+�VOR(1st�entry)G*ˆFor�exceptions�that�are�not�in�order�in�the�vector�table,�the�formula*ˆis:H*ˆVOR�=�2*[((stacked�PC�-�2)�+�offset)�-�addr(start�of�table)]�+�VOR(1st@*ˆentry)†Where�offset�=�the�number�of�bytes�that�were�skipped�in6*”the�secondary�vector�table�between�the�last�in-order+*”vector�and�the�first�out-of-order�vector.*F*ˆENTRY�CONDITIONS:‚D0�contains�PC�stacked�from�secondary�vector�table*žBSR.2*›A0�contains�address�of�start�of�secondary�vector*žtable.0*›D1�contains�the�VOR�for�the�first�entry�in�the*žsecondary�vector�table.**ˆDESTROYS:ŠD2 CALCVOR:0‰SUB.L…#2,D0’D0�now�points�to�entry�in�secondary*©vector�table�that�was�taken. +‰IF.W‚D1��#8ƒTHEN.SˆIf�PROGINT�table...3ŒLEA‡PROGINT8,A1‰Address�of�last�in-order�secondary*©vector�table�entry.‰ELSE.S ,ŒIF.W‚D1��#$30‚THEN.S„If�RESVCT�table... 3ŽLEA‡RESVCT23,A1‰Address�of�last�in-order�secondary*©vector�table�entry.ŒELSE.SŽBRA.SƒKILLRVORŒENDI‰ENDI .‰CMP.L…A1,D0’Was�exception�vector�>�PROGINT8�?4‰BLS.S…KILLRVOR�Branch�if�no�-�no�adjustment�needed. N8‰IF.W‚D1��#8ƒTHEN.S‰If�came�through�PROGINT�table...2‹ADD.L…#2,D0ŽAdjust�vector�address�because�PROGINT%*©table�is�out�of�order�beyond�TRACE.‰ELSE.S2‹ADD.L…#40,D0�Adjust�vector�address�because�RESVCT'*©table�is�out�of�order�beyond�RESVCT23‰ENDI‰PAGE KILLRVOR:+‰MOVE.L„A0,D2’Address�of�beginning�of�table+‰SUB.L…D2,D0’Offset�from�beginning�of�table‰LSL.L…#1,D0’*�2,‰ADD.W…D1,D0’Offset�from�start�of�table�VOR.1*ˆD0.W‚now�contains�pseudo�VOR�for�the�exception.‰RTS  KILLDLAY:)‰MOVE.L„#HALFSEC,D3ŒDelay�for�small�time.DLOOP„SUB.L…#1,D3 ‰BNE‡DLOOP‰RTSžThen�return‰PAGE K****************************************************************************!*ˆHEX�TO�ASCII�CONVERSION�ROUTINE*.*‚ENTRY:ƒD1.B�=�HEX�nibble�to�convert�to�ASCII*‹A6�points�to�output�buffer(*‚EXIT:„ASCII�character�in�output�buffer *‹A6�=�A6�+�1*‹D1.B�=�ASCII�characterK*************************************************************************** HXTOASCI:‰AND.B…#$0F,D1 ‰OR.B†#$30,D1‰CMP.B…#$39,D1‰BLE.S…SAVCHAR ‰ADD‡#7,D1SAVCHAR‚MOVE.B„D1,(A6)+‰RTS   :*ˆNo�end�statement�in�source�here�since�.KILLER.SA8*ˆwill�be�merged�in�here�and�will�have�an�END�statement. NNN‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰LIST‰PAGE5POWRFAIL�IDNTƒ45,0‚68xxx�POWER�FAIL�INTERRUPT�HANDLER*ˆ*********************ˆ*�POWRFAIL�1.00„**ˆ*’**ˆ*�HLD6ƒ06/24/81‚**ˆ******0 ****************…POWER�FAIL�INTERRUPT�ROUTINE*@*…THIS�ROUTINE�IS�USED�ONLY�TO�RESPOND�TO�A�POWER�FAIL�INTERRUPT-*…ON�A�VERSAMODULE�01�(AUTO�VECTOR�-�LEVEL�7)*%*…REGISTER�USAGE:�ALL�REGISTERS�SAVED*‰SECTION�LEVEL00**‰XDEFƒPOWRFAIL‰XREFƒCRASHSAV‰PAGE POWRFAIL:2‰MOVEM.L�D0-D7/A0-A7,CRASHSAV+8ƒSAVE�ALL�REGISTERS'‰MOVE.W‚(A7),CRASHSAV+6ŠSAVE�STATUS�REG+‰MOVE.L‚2(A7),CRASHSAV‹SAVE�PROGRAM�COUNTER  D*********************************************************************7*„CODE�TO�CALL�A�POWER�FAIL�ROUTINE�CAN�BE�ENTERED�HERE*D********************************************************************  *)*ˆIf�there�is�a�return,�reload�registers.* !‰OR.W„#$700,SR†INHIBIT�INTERRUPTS5‰MOVEM.L�CRASHSAV+8,D0-D7/A0-A7ƒRESTORE�ALL�REGISTERS ‰RTE“GO�BACK‰ENDNNN÷39READY…IDNTƒ45,0�M68xxx�RMS�TRAP�0�Put�task�on�ready�list.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***4***…FILE:‚READY�--�PUT�A�TASK�ON�THE�READY�LIST.—******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***H***…FUNCTION:‚Takes�the�TCB�for�a�task�and�puts�it�on�the�ready�listƒ***E***‡according�to�its�run�priority.‚There�are�various�entry�points„***D***‡to�this�module�which�provide�minor�variations�on�this�theme.†******É******…NOTES:¾******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒDƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒAƒ.ƒPƒ.ƒ.ƒ.ƒ.ƒP ******É******É******…ENTRY�CONDITIONS:³***>***‡A0ƒ=�ptr�to�TCB�of�the�task�to�be�added�to�ready�list.Š******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------G*†8/15/83‚Steve�FranckƒMade�COMINT�entry�point�set�the�running�priority1*žlike�most�of�the�other�routines�do.‚Rewrote�the2*žTCB�search�routine�to�execute�faster�(interrupts*žare�masked�during�search).*†2/08/81‚HLD6*†5/18/79‚7616*†3/06/79‚GGC3* * *‚XDEF's.*8ŠXDEFƒREADY,SBREADY†Normal�entry�points�to�this�routine. 'ŠXDEFƒSBRYRELQ‹Entry�point�from�RELINQ.0 2 R96ŠXDEFƒSBRYXMON‹Entry�point�from�EXMON�return�(REXMON).(ŠXDEFƒSBRYDLAY‹Entry�point�from�CKDELAY.&ŠXDEFƒSBRYACKŒEntry�point�from�AKRQST.)ŠXDEFƒSBRYSTRT‹Entry�point�from�TSTSTART.0ŠXDEFƒSBRYWAKE‹Entry�point�from�WAKEUP�and�WAIT.2ŠXDEFƒSBRYASRŒEntry�point�from�ASRINT�and�WTEVENT.+ŠXDEFƒSBRYGETŒEntry�point�from�ASQ�=�GT_EN. * *‚XREF's.*9ŠXREF.S�PREEMPT_FLAG‡SYSPAR�flag�which�signals�a�preempt.;ŠXREF.S�READYHDŒSYSPAR�pointer�to�head�entry�in�ready�list..ŠXREF.S�RUNNER�SYSPAR�pointer�to�running�task.   **‚Included�files:*8*‰UTILITY.MC�Macros�of�general�utility�(e.g.�PUSH,�POP).7*‰INTERRUP.MC�Macros�useful�in�dealing�with�interrupts.2*‰STR.EQ”Equates�for�supervisor�code�under�RMS68K.4*‰TCB.EQ”Equates�relating�to�the�Task�Control�Block.*ŠNOLISTŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.INTERRUP.MCŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠLIST  ŠSECTION�LEVEL00ŠOPT„BRSŠPAGE*J*‚These�are�the�specialized�entry�points�for�all�the�various�routines�thatL*‚want�to�put�a�task�on�the�ready�list,�but�want�to�fiddle�with�the�priority*‚first.* SBRYRELQ: 2ŠMOVEQI�$F0,D0�Set�the�run�priority�of�the�task�to>ŠAND.B‚TCBCPRI(A0),D0…the�current�priority�with�the�low�4�bits#ŠMOVE.B�D0,TCBRPRI(A0)…set�to�zero.6ŠBRA„SBREADYŒThen�just�go�to�the�normal�READY�routine.  SBRYXMON: SBRYDLAY:SBRYACK: SBRYSTRT: SBRYWAKE:SBRYASR:SBRYGET: CŠMOVE.B�TCBCPRI(A0),TCBRPRI(A0)ƒReset�the�run�priority�for�the�task*§to�its�current�priority.  *,*…FALL�THROUGH�to�the�main�READY�routine!!!!*ŠPAGE*>*…NOTE�--�Other�routines�fall�into�this�routine�from�above!!!!* READY:SBREADY:  *(*‚See�if�he's�already�on�the�ready�list.* *ŠPUSHƒSR‘Save�the�SR�we�were�entered�with.9ŠDISABLE_INTERRUPTSˆDisable�interrupts�while�we�work�with*§the�volatile�TCB�chain.>ŠBSETƒ#TSK2NRDY,TCBSTAT2(A0)‚Set�the�bit�that�says�this�guy�is6ŠIF…�THENŠon�the�ready�list.‚If�he�wasn't�already,  *.*‚He's�not;�get�set�up�to�put�him�on�the�list.* +ŠSAVEƒD1/A2ŽSave�registers�we'll�blow�away.>ŠLEA„READYHD-TCBREADY,A2‚A2�<--�address�such�that�TCBREADY(A2)(*§refers�to�the�ready�list�head�pointer.@ŠMOVE.B�TCBRPRI(A0),D0…D0.B�<--�priority�of�task�to�put�on�list.  *>*‚Search�the�list�for�a�TCB�of�lower�priority�than�this�guy's.* ŠREPEAT <ŠMOVE.L�TCBREADY(A2),D1„D1�<--�ptr�to�next�TCB�in�the�chain.6ŠBEQ„ADD_HIMŒIf�we�hit�the�end�of�the�list,�just�exit. 4ŠEXG.L‚D1,A2ŽA2�<--�ptr�to�the�TCB�we're�looking�at.#*§D1�<--�ptr�to�TCB�just�before�it.BŠUNTIL.B�D0��TCBRPRI(A2)‚Keep�looping�until�we�find�a�TCB�with'*§a�priority�lower�than�our�guy�to�add. 5ŠEXG.L‚D1,A2ŽD1�<--�ptr�to�the�TCB�of�lower�priority.#*§A2�<--�ptr�to�TCB�just�before�it.ŠPAGE*M*‚Either�we�found�somebody�of�lower�priority�than�the�guy�we're�trying�to�addK*‚or�we�hit�the�end�of�the�chain.‚Either�way,�we�want�to�add�the�new�guy�to5*‚the�list�between�the�TCB's�pointed�to�by�A2�and�D1.* ADD_HIM:CŠMOVE.L�D1,TCBREADY(A0)„Set�our�forward�link�to�point�to�the�guy�we'*§found�to�be�of�lower�priority�(or�0).AŠMOVE.L�A0,TCBREADY(A2)„Set�forward�link�of�the�guy�we�want�to�be *§after�so�that�it�points�to�us.ŠMOVE.L‚RUNNER,A2ŠIF.B„D0��TCBRPRI(A2)�THENŠST†PREEMPT_FLAGŠENDI !ŠRESTORE�D1/A2�Restore�registers. ŠENDI 2ŠPOP„SR‘Restore�the�SR�we�saved�on�entry�&�return.ŠRTS—*    ŠENDN1 NŠPAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ˆINCLUDEƒ9995.&.KILL.MC*ˆINCLUDEƒ9999.&.KILLEXEC.EQ*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.INTERRUP.MCŠINCLUDE�9995.&.KILL.MCŠINCLUDE�9999.&.KILLEXEC.EQŠLISTŠPAGE+RMS‡IDNT‚45,0�68xxx�RMS�INITIAL�ENTRY�POINT*+*‰Revision�History�(Add�changes�to�the�top)*9*‰10/29/85ƒCBSƒChanged�KILLER�call�to�use�KILL.EXEC�macro**$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆRMS‚IS�ENTERED�HERE*ŠSECTION�LEVEL00* ŠXDEFƒRMS ŠXREF.L�DISPATCHŠXREF.L�FLUSH_ALL_CACHEŠXREF.L�PROGINT9ŠXREF.S�PATBEGŠXREF.L�SCHED_DATEUP‰PAGE*,*ˆHere�to�start�up�RMS�after�initialization:*�Flush�the�cache,*�and�go�to�dispatch.* RMS: &ŠBSR„FLUSH_ALL_CACHE„Flush�all�caches. K*�Schedule�the�node�to�force�the�date�to�'rollover'�at�midnight.‚A�new�nodeF*ƒis�normally�scheduled�when�the�user�enters�the�time�and�date�throughH*ƒsession�control.‚If�the�system�has�a�battery�backed�timer,�however,�itJ*ƒmay�happen�that�the�user�may�not�enter�the�date�and�time�but�depend�uponK*ƒit�being�picked�up�from�the�timer�itself.‚By�the�time�we�reach�this�code,B*ƒthe�system�initializer�has�all�ready�adjusted�NSE,�MIDNIGHT,�andH*ƒTIMELEFT�have�been�initialized�properly�to�reflect�the�system�time�andF*ƒthe�BIGDELTA�node�that�is�next�on�the�PAT�list.‚In�the�case�where�weD*ƒdon't�have�a�battery�backed�up�timer,�we�will�schedule�a�'garbage'G*ƒrollover�node�but�we�really�don't�care�since�it�will�be�cancelled�and?*ƒthe�correct�rollover�node�scheduled�when�the�time�is�manually *ƒentered.*K* We do not mask interrupts to schedule the new node because we are entered5*ƒfrom�the�system�initializer�with�interrupts�masked.*ŠBSR„SCHED_DATEUP ŠBRA„DISPATCHJ"6‰PAGE*I* This is the exec routine scheduled originally by the system initializerI*ƒthat�puts�a�dummy�node�with�a�large�delta�onto�the�end�of�the�PAT�list.D*ƒThis�insures�that�the�PAT�list�is�never�empty�which�simplifies�theB*ƒPAT�processing�in�many�areas.‚Note�that�we�do�not�go�through�theF*ƒnormal�schedule�node�routine�PAT_SCHED_NEW_NODE.‚We�couldn't�do�this/*ƒand�guarantee�the�large�delta�that�we�desire.*/ŠDC.Lƒ'DUMY'�Bit�pattern�that�INIT�searches�for$*£in�order�to�find�procedure�address* DUMY:ŠMOVE.L�PATBEG,A1 ŠDISABLE_INTERRUPTSˆMask 2ŠMOVE.L�PATFHDR(A1),A2…A2�points�to�free�PAT�entry ŠIF.L�A2��#0�THEN.S=�KILL.EXEC‚RMSSA,PAT_NO_FREE_NODESƒKill�system�if�no�free�PAT*±nodes.ŠELSE.S@�MOVE.L�PATNEXT(A2),PATFHDR(A1)�Unlink�this�entry�from�free�list$�ENABLE_INTERRUPTS‰Unmask�interrupts*¦Initialize�PAT�entries�CLR.L‚PATNEXT(A2)$�CLR.L‚PATTCB(A2)‰Indicate�exec�node5�MOVE.L�#PATBIGDELTA,PATDELTA(A2)�Make�delta�very�big�CLR.L‚PATINTV(A2)3�LEA„DUMY(PC),A3ˆAddress�of�procedure�to�reschedule'�MOVE.L�A3,PATASR(A2)†Execution�address(�CLR.W‚PATOPT(A2)‰Options�-�not�periodic4�MOVE.L�#PATDUMMYID,PATARID(A2)�Plug�in�the�dummy�ID4�MOVE.W�#$FFFF-$0700,PATILVL(A2)�Interrupt�level�=�0#�DISABLE_INTERRUPTSˆMask�interrupts7�MOVE.L�PATHDR(A1),A3†A3�points�to�1st�node�on�PAT�list !�WHILE.L�PATNEXT(A3)��#0�DO.S,**ŽLEA‚PATNEXT(A3),A3ƒFind�last�node�on�list6�MOVE.L�PATNEXT(A3),A3�Find�last�node�on�list‰10/23/85�ENDW 7�MOVE.L�A2,PATNEXT(A3)1 „Link�this�entry�onto�end�of�listŠENDI%ŠENABLE_INTERRUPTS‰Unmask�and�lose�SR(ŠRTE—Back�to�PAT�scheduler�(we�really�go(*£back�to�a�background�routine�scheduled%*£by�TIMEINT.‚This�background�routine *£was�the�one�that�scheduled�us.ŠNOPŠNOPŠEND‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰LIST‰PAGE:SELFTEST�IDNTƒ45,0‚68xxx�SYSTEM�SELFTEST�INTERRUPT�HANDLER*ˆ*********************ˆ*�SELFTEST�1.00„**ˆ*’**ˆ*�HLD6ƒ06/24/81‚**ˆ**********************…SELFTEST�INTERRUPT�ROUTINE*>*…THIS�ROUTINE�IS�USED�ONLY�TO�RESPOND�TO�A�SELFTEST�INTERRUPT-*…ON�A�VERSAMODULE�01�(AUTO�VECTOR�-�LEVEL�2)*%*…REGISTER�USAGE:�ALL�REGISTERS�SAVED*‰SECTION�LEVEL00*3CONTREG‚EQU„$F70030‡VERSAMODULE�01�CONTROL�REGISTER*‰XDEFƒSELFTEST‰XREF.S�SLFTSTA7*7SELFTEST�TST.L‚SLFTSTA7‡IS�THIS�FIRST�ENTRY�TO�ROUTINE?‰BNE.S‚SELFT4‰BRANCH�IF�NO!‰OR.Wƒ#$700,SR‡INHIBIT�INTERRUPTS-‰MOVEM.L�D0-D7/A0-A6,-(A7)‚SAVE�ALL�REGISTERS&‰MOVE.L‚A7,SLFTSTA7ƒSAVE�STACK�POINTER)‰MOVE.W‚60(A7),SR…RESTORE�INTERRUPT�LEVELBSELFT4ƒMOVE.L‚SLFTSTA7,A7ƒRESTORE�A7�IN�CASE�THIS�IS�NOT�1ST�ENTRY*6*„CODE�TO�CALL�A�SELF�TEST�ROUTINE�CAN�BE�ENTERED�HERE*!‰OR.W„#$700,SR†INHIBIT�INTERRUPTS'‰MOVE.B‚CONTREG,D0„GET�CONTROL�REGISTER%‰OR.B„#$20,D0‡SET�BIT�TO�TURN�OFF�LED/‰MOVE.B‚D0,CONTREG„PUT�IT�INTO�CONTROL�REGISTER4‰MOVE.L‚SLFTSTA7,A7ƒRELOAD�A7�(MAYBE�IT�WAS�CHANGED)0‰MOVEM.L�(A7)+,D0-D7/A0-A7ƒRESTORE�ALL�REGISTERS%‰CLR.LƒSLFTSTA7†CLEAR�ENTRY�FLAG�WORD ‰RTE“GO�BACK‰ENDNN*2'MK68901 TIMEINT AF??  TIMEINT SAHHL  =/*=/*†MK68901.TIMEINT.AF=/*-=/* Chain file to assemble MK68901.TIMEINT.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to MK68901.TIMEINT.LS=/*=/IFC \1ƒ=ARG�MK68901.TIMEINT.LS=/ENDIF2 =/*E=ASM M68010.M68010.SA/MK68901.TIMEINT.SA,MK68901.TIMEINT.RO,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9999.MK68901.MK68901.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9999.M68XXX.TIMEINT.AI=/*}=/*=ENDNNNNN7ŠPAGE**ˆINCLUDE�FILES**ˆINCLUDE�9995.&.STR.EQ*ˆINCLUDE�9995.&.BAB.EQ*ˆINCLUDE�9995.&.PAT.EQ!*ˆINCLUDE�9999.MK68901.MK68901.EQ*ˆINCLUDE�9995.&.TR1RTCD.EQ*ˆINCLUDE�9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQ ŠINCLUDE�9999.MK68901.MK68901.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE@TIMEINTƒIDNTƒ45,0ŒTIMER�INTERRUPT�HANDLER�FOR�M146818�CLOCK�CHIP*$*‰COPYRIGHTED�1983�BY�MOTOROLA,�INC.*.*†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�10.000�MS**•01/18/83‚(SFF5)*•04/07/83‚(7616)*:*•08/15/83‚Steve�Franck�--�Changed�to�exit�through�COMINT.*ŠSECTION�LEVEL00*ŠPAGE ŠXDEFƒTIMEINT ŠXREF.S�DATEŠXREF.S�PATBEGŠXREF.S�PREEMPT_FLAGŠXREF.S�PTMADDRŠXREF.S�TIMEOUTŠXREF.S�TIMESLICŠXREF.S�TIMINTRŠXREF.S�TIMINTVŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAG ŠXREFƒTRACERŠXREF.S�TRACFLAGŠXREF.S�TIME_LEFT ŠXREFƒBKG_SCHEDULE ŠXREFƒCKEXPA ŠXREFƒCKDELAYŠXREFƒPAT_RM_1ST_NODEŠPAGE**0TIMEINTƒMOVEM.L�D0-D1/A0-A1,-(A7)�SAVE�REGISTERS ŠMOVE.L�PTMADDR,A0‰TIMER�ADDRESS)ŠBCLRƒ#5,MFP_ISRA(A0)„Clear�the�interrupt!ŠMOVE.W�SR,D0ŽFor�later�unmasking ŠCLR.L‚D1ŠDISABLE_INTERRUPTSˆMask$ŠMOVE.W�TIMINTR,D1‰microseconds�overŠSUB.W‚D1,TIMINTV4ŠIF…‚THEN.S4�ADD.W‚#1000,TIMINTV4‚Set�usec�rollover�counter�back3�SUB.L‚#1,TIME_LEFT„Account�for�passage�of�extra�msŠENDI7ŠMOVE.W�TIMINTV,D1‰Number�of�ms�elapsed�since�last�tickŠSUB.L‚D1,TIME_LEFT‡ms�updateŠMOVE.W�D0,SRŽUnmaskŠTST.L‚TIME_LEFT *‰INCLUDE�9999.M68XXX.TIMEINT.AIŠINCLUDE�9999.M68XXX.TIMEINT.AIŠENDN2 @M'NOMMU J'NOMMUC h'VM03 †'VM04 ¤'VME101 Ê'VME110 è'VME120 'VME130 ,'VME133 J'VMES10 q'Z8036 —'NOMMU LOADMMU AFVV  LOADMMU SA__ v  =/*=/*†NOMMU.LOADMMU.AF=/*+=/* Chain file to assemble NOMMU.LOADMMU.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to NOMMU.LOADMMU.LS=/*=/IFC \1ƒ=ARG�NOMMU.LOADMMU.LS=/ENDIF=/*0=ASM NOMMU.LOADMMU.SA,NOMMU.LOADMMU.RO,\1;MRZ=50=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDNNNNNNN‰PAGE‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST)**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------@*ˆ07/26/85‚Julie�Hoban„Added�ADD_SEG_TO_MMU�subroutine.�Replaced+*¡UNLDMMU�subroutine�with�DEL_SEG_FROM_MMU.:*ˆ01/25/84‚MSLŒSplit�routine�into�two�routines�in�order�to%*¡support�both�the�RTE�and�RTS�exits.*ˆ03/30/81‚HLD6‹Rev�2.00*ˆ09/18/80‚HLD6*O*******************************************************************************‰PAGE ‰SECTION�2 ‰OPT…CL **‚XDEF's*‰XDEFƒADD_SEG_TO_MMU‰XDEFƒADD_SEG2 ‰XDEFƒCRASN ‰XDEFƒDEASN‰XDEFƒDEL_SEG_FROM_MMU ‰XDEFƒLOADMMU‰XDEFƒLOADMMUI‰XDEFƒMMUFAULT **‚XREF's*‰XREF.S�MMUHERE‰XREF.S�MMULOAD ‰XREFƒTRACER‰XREF.S�TRACFLAG **‚INCLUDED�FILES:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰PAGEO********************************************************************************D*ˆCRASN,�DEASN,�LOADMMU,�MMUFAULT�subroutines�for�boards�without�MMU*G*ˆThese�are�dummy�entry�points--�we�don't�really�have�an�MMU,�but�other@*ˆexec�routines�are�going�to�be�calling�us�at�these�entry�points)*ˆbecause�they�don't�know�there's�no�MMU.*WT`#O******************************************************************************* CRASN:DEASN:LOADMMU MMUFAULT:&ŠRTS—Just�return--he'll�never�know.... O********************************************************************************D*ˆADD_SEG_TO_MMU�and�DEL_SEG_FROM_MMU�subroutines�for�boards�w/o�MMU*G*ˆThese�are�dummy�entry�points--�we�don't�really�have�an�MMU,�but�other@*ˆexec�routines�are�going�to�be�calling�us�at�these�entry�pointsG*ˆbecause�they�don't�know�there's�no�MMU.�The�callers�of�these�routines/*ˆrequire�that�the�condition�codes�be�set�.*O******************************************************************************* ADD_SEG_TO_MMU: ADD_SEG2:DEL_SEG_FROM_MMU:&‰CMP.L…D0,D0�Set�condition�codes�<EQ>,%‰RTS›And�return--he'll�never�know.... O*********************************************************************************‚LOADMMUI�must�exit�with�RTE*O******************************************************************************* LOADMMUI ‰RTE—RETURN ‰ENDNNN3 'NOMMUC LOADMMU AFtt  LOADMMU SA}}›  =/*=/*†NOMMUC.LOADMMU.AF=/*,=/* Chain file to assemble NOMMUC.LOADMMU.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to NOMMUC.LOADMMU.LS=/*=/IFC \1ƒ=ARG�NOMMUC.LOADMMU.LS=/ENDIF=/*2=ASM NOMMUC.LOADMMU.SA,NOMMUC.LOADMMU.RO,\1;MRZ=50=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDNNNNNNl‰NOLIST‰INCLUDEƒ9995.&.UTILITY.MC‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TST.EQ‰LISTGLOADMMU‚IDNT‚45,0…LOADMMU�SUBROUTINES�FOR�BOARDS�WITH�CACHE�WITHOUT�MMU‰SPCƒ1O*********************************************************************************ˆNOMMUC.LOADMMU*?*ˆSubroutines�to�add�segments�and�delete�segments�from�the�MMU.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*'*ˆEntry:„A5�=�target�task's�TST�address*’D5�=�offset�to�TSTMMU�entry*!*ˆRegister�usage:…0�1�2�3�4�5�6�7*™DŒP*™AŒP**™P�=�entry�parameter*™R�=�returned�parameter*™S�=�saved�and�restored*™*�=�destroyed**D*ˆExit:‚RTS�to�caller‚(ADD_SEG_TO_MMU�AND�DEL_SEG_FROM_MMU�must�4 have*�condition�codes�set�)**,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------@*ˆ07/26/85‚Julie�Hoban„Added�ADD_SEG_TO_MMU�subroutine.�Replaced+*¡UNLDMMU�subroutine�with�DEL_SEG_FROM_MMU.<*ˆ01/25/85‚SJFŒAdded�call�to�flush�cache�to�UNLDMMU�routine.:*ˆ01/25/84‚MSLŒSplit�routine�into�two�routines�in�order�to%*¡support�both�the�RTE�and�RTS�exits.*ˆ03/30/81‚HLD6‹Rev�2.00*ˆ09/18/80‚HLD6*O*******************************************************************************‰PAGE ‰SECTION�2 ‰OPT…CL **‚XDEF's*‰XDEFƒADD_SEG_TO_MMU‰XDEFƒADD_SEG2 ‰XDEFƒCRASN ‰XDEFƒDEASN‰XDEFƒDEL_SEG_FROM_MMU ‰XDEFƒLOADMMU‰XDEFƒLOADMMUI‰XDEFƒMMUFAULT **‚XREF's*‰XREFƒFLUSH_ON_CONTEXT_SWITCH ‰XREF.S�MMUHERE‰XREF.S�MMULOAD ‰XREFƒTRACER‰XREF.S�TRACFLAG**‚INCLUDED�FILES:**ˆINCLUDEƒ9995.&.UTILITY.MC*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰PAGEO********************************************************************************5*ˆLOADMMU�subroutine�for�boards�with�CACHE�and�no�MMU*O******************************************************************************* LOADMMU:*uW~E*„FLUSH�THE�USER�CACHE.*‰BSR‡FLUSH_ON_CONTEXT_SWITCH ‰RTS—RETURN O********************************************************************************3*ˆLOADMMUI�routine�for�boards�with�CACHE�and�no�MMU*O******************************************************************************* LOADMMUI:**„FLUSH�THE�USER�CACHE.*‰BSR‡FLUSH_ON_CONTEXT_SWITCH ‰RTE—RETURN O********************************************************************************>*ˆDEL_SEG_FROM_MMU�subroutine�for�boards�with�CACHE�and�no�MMU*A*ˆThe�caller�of�this�routine�requires�that�the�condition�codes�be *ˆset�.*O******************************************************************************* DEL_SEG_FROM_MMU:**„FLUSH�THE�USER�CACHE.* ‰PUSH.L‚A5‰BSR…FLUSH_ON_CONTEXT_SWITCH ‰POP.LƒA5&‰CMP.LƒD0,D0‘Set�condition�codes�,‰RTS›And�return.‰PAGEO********************************************************************************E*ˆCRASN,�DEASN,�MMUFAULT�subroutines�for�boards�with�CACHE�and�no�MMU*G*ˆThese�are�dummy�entry�points--�we�don't�really�have�an�MMU,�but�other@*ˆexec�routines�are�going�to�be�calling�us�at�these�entry�points)*ˆbecause�they�don't�know�there's�no�MMU.*O******************************************************************************* CRASN:DEASN: MMUFAULT:&ŠRTS—Just�return--he'll�never�know.... O********************************************************************************<*ˆADD_SEG_TO_MMU�subroutine�for�boards�with�CACHE�and�no�MMU*G*ˆThis�is�a�dummy�entry�point�--�we�don't�really�have�an�MMU,�but�otherB*ˆexec�routines�are�going�to�be�calling�us�because�they�don't�know>*ˆthere's�no�MMU.�The�caller�of�this�routine�requires�that�the*ˆcondition�codes�be�set�.*O******************************************************************************* ADD_SEG_TO_MMU: ADD_SEG2:&‰CMP.L…D0,D0�Set�condition�codes�,%‰RTS›And�return--he'll�never�know.... ‰END'VM03 KILLER AF’’  KILLER SA›› z  4 =/*=/*†VM03.KILLER.AF=/*>=/* Chain file to assemble VM03.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to VM03.KILLER.LS=/*=/IFC \1ƒ=ARG�VM03.KILLER.LS=/ENDIF=ARG \1,VM03.KILLER.RO=/*B=ASM M68010.M68010.SA/M68XXX.KILLER.SA/VM03.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=ENDNNNNNNЉLIST‰PAGE‰SPCƒ1$*–VM03�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VM03.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�Board�Fail�LED!*’2.‚Output�system�crash�message.A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 *ˆINCLUDE�FILES**‰NOLIST‰OPT…CL‰LIST * *ˆEQUATES*HALFSEC‚EQU‡$4FFFF&CREG…EQU‡$F80100�VM03�CONTROL�REGISTER‰PAGE*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: *‰AND.W…#$FFBF,CREGŒTurn�on�Board�Fail�LED.*C*ˆIf�Firmw5 are�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‹Get�TRAP�#15�capability�flags�in�D12‰BTST„#T15IO,D1�Test�for�PHOENIX�TRAP�#15�support.,‰IFƒƒTHEN.SŒIf�yes,�then�output�message.*F*ˆTRAP�#15�PHOENIX�format�-�uses�A5,A6�to�point�to�string,�endstring+1*.‹LEA…MSGCRASH(PC),A5…Start�of�'SYSTEM�CRASHED'&‹LEA…ENDCRASH(PC),A6…End�of�string�+�1 “Iœ2,‹TRAP15‚BUGTRP15,KILLER4„Do�pseudo�TRAP�#15.KILLER4:)‹DC.W„5“Output�string,�no�added�CR�or�LF. #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D2�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 8OUTLOOP„ROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character)‹MOVE.L‚A7,A5�A5�=�start�of�output�string-*ŸA6�=�end�of�string�+�1�(set�up�by�HXTOASCI)‹TRAP15‚BUGTRP15,OUTNEXTOUTNEXT:#‹DC.W„5“Output�string,�no�CR�or�LF. PAGE#*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹DBRA„D2,OUTLOOPŠOutput�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack. -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. *‹LEA…MSGBLANK(PC),A5…Start�of�blank�string,‹LEA…ENDBLANK(PC),A6…End�of�blank�string�+�1 +‹TRAP15‚BUGTRP15,KILLER5„Do�pseudo�TRAP�#15KILLER5:#‹DC.W„5“Output�string,�no�CR�or�LF. #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. 5‹BRA…KILLOOP�Branch�back�to�create�a�flashing�message ‰ELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ‰ENDI ‰ENDNN'VM04 KILLER AF°°  KILLER SA¹¹…  5 =/*=/*†VM04.KILLER.AF=/*>=/* Chain file to assemble VM04.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to VM04.KILLER.LS=/*=/IFC \1ƒ=ARG�VM04.KILLER.LS=/ENDIF=ARG \1,VM04.KILLER.RO=/*B=ASM M68020.M68020.SA/M68XXX.KILLER.SA/VM04.KILLER.SA,\2,\1;MRZ=65=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*ƒ9999.VM04.CTRLSTAT.EQ=/*}=/*=ENDNNNNN¨‰LIST‰PAGE‰SPCƒ1$*–VM04�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VM04.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�BoardFail�LED.1*’2.‚Writes�a�hex�'F'�to�the�front�panel�display.!*’3.‚Output�system�crash�message.A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.NNN6 N±º4Â7(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 *ˆINCLUDE�FILES**ˆINCLUDEƒ9999.VM04.CTRLSTAT.EQ*‰NOLIST‰INCLUDEƒ9999.VM04.CTRLSTAT.EQ‰OPT…CL‰LIST**ˆXREF's* ‰XREF.S‚PANEL * *ˆEQUATES*HALFSEC‚EQU‡$5FFFFPANLF„SET‡$0F–LED�VALUE�"F"‰PAGE*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: *‰MOVE.B‚#PANLF,PALADRŒSET�PANEL�LED�TO�"F" *‰BSET.B‚#CT4BF,CNT4ŽTURN�ON�BOARD�FAIL�LED KILLOOP:*C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message* @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‰Get�TRAP�#15�capability�flags�in�D13‰BTST„#ALT15IO,D1‰Test�for�AUSTIN�TRAP�#15�support.'‰IFƒ„THEN.S‰If�yes,�output�message. &�PEA‡ENDCRASHˆEnd�of�crash�message�+�1NNN'�PEA‡MSGCRASHˆStart�of�'SYSTEM�CRASHED' +�TRAP15„BUGTRP15,KILLER6ƒDo�Pseudo�TRAP�#15KILLER6:$�DC.W†$21�Output�string,�no�CR�or�LF #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D0�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 9OUTLOOP2ƒROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character'‹MOVE.L‚A6,-(A7)ŒA6�=�end�of�string�+�1‹MOVE.L‚A7,-(A7))‹ADD.Lƒ#4,(A7)�Starting�address�of�string-‹TRAP15‚BUGTRP15,OUTNXT2„Output�the�characterOUTNXT2:%‹DC.W„$21‘Output�string,�no�CR�or�LF. PAGE#*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE .‹DBRA„D0,OUTLOOP2‰Output�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack.  -�BSR‡KILLDLAYˆDelay�here�for�flashing�effect. %�PEA‡ENDBLANKˆEnd�of�blank�string�+�1#�PEA‡MSGBLANKˆStart�of�blank�string +�TRAP15„BUGTRP15,KILLER7ƒDo�Pseudo�TRAP�#15KILLER7:$�DC.W†$21�Output�string,�no�CR�or�LF #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -�BSR‡KILLDLAYˆDelay�here�for�flashing�effect. 5�BRA‡KILLOOP‰Now�loop�back�to�create�flashing�effect. ŠELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ŠENDI  ‰END6 NN'VME101 KILLER AFÖÖ  KILLER SAßß z  =/*=/*†VME101.KILLER.AF=/*@=/* Chain file to assemble VME101.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to VME101.KILLER.LS=/*=/IFC \1ƒ=ARG�VME101.KILLER.LS=/ENDIF=ARG \1,VME101.KILLER.RO=/*D=ASM M68000.M68000.SA/M68XXX.KILLER.SA/VME101.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=ENDNNNNNΉLIST‰PAGE‰SPCƒ1&*–VME101�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VME101.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�t7 he�BoardFail�LED.*’2.‚Write�'F'�to�the�display.!*’3.‚Output�system�crash�message.A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 ‰NOLIST‰OPT…CL‰LIST * *ˆEQUATES*HALFSEC‚EQU‡$4FFFF'MCR†EQU‡$FE00F1‘VME101�control�register ‰PAGE*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: #‰MOVE.L‚#MCR,A1’CONTROL�REG�ADDRESS-‰MOVE.B‚#$9F,(A1)�DISABLE�INTERRUPTS�AND�TURN*©ON�THE�FAIL�LIGHT *C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 *F*ˆTRAP�#15�PHOENIX�format�-�uses�A5,A6�to�point�to�string,�endstring+1*.‹LEA…MSGCRASH(PC),A5…Start�of�'SYSTEM�CRASHED'×Fà5&‹LEA…ENDCRASH(PC),A6…End�of�string�+�1 ,‹TRAP15‚BUGTRP15,KILLER4„Do�pseudo�TRAP�#15.KILLER4:+‹DC.W„$14‘Output�string,�no�added�CR�or�LF. :‹MOVE.B‚#$9F,(A1)‹Disable�interrupts/Output�'F'�to�display #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D2�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 8OUTLOOP„ROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character)‹MOVE.L‚A7,A5�A5�=�start�of�output�string-*ŸA6�=�end�of�string�+�1�(set�up�by�HXTOASCI)‹TRAP15‚BUGTRP15,OUTNEXTOUTNEXT:%‹DC.W„$14‘Output�string,�no�CR�or�LF. :‹MOVE.B‚#$9F,(A1)‹Disable�interrupts/Output�'F'�to�display #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹DBRA„D2,OUTLOOPŠOutput�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack. -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. *‹LEA…MSGBLANK(PC),A5…Start�of�blank�string,‹LEA…ENDBLANK(PC),A6…End�of�blank�string�+�1 +‹TRAP15‚BUGTRP15,KILLER5„Do�pseudo�TRAP�#15KILLER5:%‹DC.W„$14‘Output�string,�no�CR�or�LF. :‹MOVE.B‚#$9F,(A1)‹Disable�interrupts/Output�'F'�to�display #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. 5‹BRA…KILLOOP�Branch�back�to�create�a�flashing�message  ‰ENDNN7 'VME110 KILLER AFôô  KILLER SAýýy  =/*=/*†VME110.KILLER.AF=/*@=/* Chain file to assemble VME110.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to VME110.KILLER.LS=/*=/IFC \1ƒ=ARG�VME110.KILLER.LS=/ENDIF=ARG‚\1,VME110.KILLER.RO=/*D=ASM M68000.M68000.SA/M68XXX.KILLER.SA/VME110.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=ENDNNNNNì‰LIST‰PAGE‰SPCƒ1&*–VME110�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VME110.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�BoardFail�LED./*’2.‚Output�the�message�using�trap�#15,�code�6.A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---8 ------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 ‰NOLIST‰OPT…CL‰LIST * *ˆEQUATES*HALFSEC‚EQU‡$5FFFF'MCR†EQU‡$FE8021‘VME110�control�register‰PAGE*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: #‰MOVE.L‚#MCR,A1’CONTROL�REG�ADDRESS0‰MOVE.B‚#$10,(A1)�DISABLE�INTERRUPTS�AND�TURN�ON *©FAIL�LED.*C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‹Get�TRAP�#15�capability�flags�in�D12‰BTST„#T15IO,D1�Test�for�PHOENIX�TRAP�#15�support.,‰IFƒƒTHEN.SŒIf�yes,�then�output�message.*F*ˆTRAP�#15�PHOENIX�format�-�uses�A5,A6�to�point�to�string,�endstring+1*.‹LEA…MSGCRASH(PC),A5…Start�of�'SYSTEM�CRASHED'õFþ3&‹LEA…ENDCRASH(PC),A6…End�of�string�+�1 ,‹TRAP15‚BUGTRP15,KILLER4„Do�pseudo�TRAP�#15.KILLER4:)‹DC.W„6“Output�string,�no�added�CR�or�LF. #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D2�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 8OUTLOOP„ROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character)‹MOVE.L‚A7,A5�A5�=�start�of�output�string-*ŸA6�=�end�of�string�+�1�(set�up�by�HXTOASCI)‹TRAP15‚BUGTRP15,OUTNEXTOUTNEXT:#‹DC.W„6“Output�string,�no�CR�or�LF. PAGE#*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹DBRA„D2,OUTLOOPŠOutput�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack. -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. *‹LEA…MSGBLANK(PC),A5…Start�of�blank�string,‹LEA…ENDBLANK(PC),A6…End�of�blank�string�+�1 +‹TRAP15‚BUGTRP15,KILLER5„Do�pseudo�TRAP�#15KILLER5:#‹DC.W„6“Output�string,�no�CR�or�LF. #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. 5‹BRA…KILLOOP�Branch�back�to�create�a�flashing�message ‰ELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ‰ENDI NN‰ENDN8 NNNNNN'VME120 KILLER AF  KILLER SA##�  =/*=/*†VME120.KILLER.AF=/*@=/* Chain file to assemble VME120.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to VME120.KILLER.LS=/*=/IFC \1ƒ=ARG�VME120.KILLER.LS=/ENDIF=ARG \1,VME120.KILLER.RO=/*D=ASM M68010.M68010.SA/M68XXX.KILLER.SA/VME120.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*ƒ9999.VME12X.BOARD.EQ=/*}=/*=ENDNNN9 NN‰LIST‰PAGE‰SPCƒ1;*ƒVME120,VME121,VME122,VME123ƒBOARD�INDEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VME120.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�BoardFail�LED.!*’2.‚Output�system�crash�message.A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9999.VME12X.BOARD.EQ*‰NOLIST‰INCLUDEƒ9999.VME12X.BOARD.EQ‰OPT…CL‰LIST * *ˆEQUATES*HALFSEC‚EQU‡$5FFFF‰PAGE ‰SECTION�2*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: &‰BSET.B‚#BRDFAIL,CREGŒTURN�FAIL�LED�ONA*�NOTE:‚This�will�also�turn�on�the�SYSFAIL�LED�on�the�MVME050,�if;*�it�is�in�the�system.‚The�050�monitors�the�VMEbus�SYSFAIL*<*�line,�and�turns�on�its�fail�LED�if�anyone�in�the�system�is*�asserting�SYSFAIL*.  *C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‹Get�TRAP�#15�capability�flags�in�D1H$:2‰BTST„#T15IO,D1�Test�for�PHOENIX�TRAP�#15�support.,‰IFƒƒTHEN.SŒIf�yes,�then�output�message.*F*ˆTRAP�#15�PHOENIX�format�-�uses�A5,A6�to�point�to�string,�endstring+1*.‹LEA…MSGCRASH(PC),A5…Start�of�'SYSTEM�CRASHED'&‹LEA…ENDCRASH(PC),A6…End�of�string�+�1 ,‹TRAP15‚BUGTRP15,KILLER4„Do�pseudo�TRAP�#15.KILLER4:)‹DC.W„5“Output�string,�no�added�CR�or�LF. #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D2�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 8OUTLOOP„ROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character)‹MOVE.L‚A7,A5�A5�=�start�of�output�string-*ŸA6�=�end�of�string�+�1�(set�up�by�HXTOASCI)‹TRAP15‚BUGTRP15,OUTNEXTOUTNEXT:#‹DC.W„5“Output�string,�no�CR�or�LF. PAGE#*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹DBRA„D2,OUTLOOPŠOutput�9 all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack. -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. *‹LEA…MSGBLANK(PC),A5…Start�of�blank�string,‹LEA…ENDBLANK(PC),A6…End�of�blank�string�+�1 +‹TRAP15‚BUGTRP15,KILLER5„Do�pseudo�TRAP�#15KILLER5:#‹DC.W„5“Output�string,�no�CR�or�LF. #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. 5‹BRA…KILLOOP�Branch�back�to�create�a�flashing�message ‰ELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ‰ENDI ‰ENDN'VME130 KILLER AF88  KILLER SAAA ~  =/*=/*†VME130.KILLER.AF=/*@=/* Chain file to assemble VME130.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to VME130.KILLER.LS=/*=/IFC \1ƒ=ARG�VME130.KILLER.LS=/ENDIF=ARG \1,VME130.KILLER.RO=/*D=ASM M68020.M68020.SA/M68XXX.KILLER.SA/VME130.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*ƒ9999.VME13X.CTRLSTAT.EQ=/*}=/*=ENDNNNNN: 0‰LIST‰PAGE‰SPCƒ1&*–VME130�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VME130.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�BoardFail�LED.!*’2.‚Output�system�crash�message.C*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrement�a;*ˆcounter�in�a�loop�to�delay�approximately�one�half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 *ˆINCLUDE�FILES**ˆ9999.VME13X.CTRLSTAT.EQ*‰NOLIST ‰INCLUDE‚9999.VME13X.CTRLSTAT.EQ‰OPT…CL‰LIST * *ˆEQUATES*HALFSEC‚EQU‡$5FFFF‰PAGE*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED* KILLER3:.‰MOVE.L‚#CNT5,A1‘ADDRESS�OF�CONTROL�REGISTER�5$‰BSET.B‚#CT5BF,(A1)ŽTURN�FAIL�LED�ON *C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‰Get�TRAP�#15�capability�flags�in�D13‰BTST„#ALT15IO,D1‰Test�for�AUSTIN�TRAP�#15�support.'‰IFƒ„THEN.S‰If�yes,�output�message. &�PEA‡ENDCRASHˆEnd�of�crash�message�+�1'�PEA‡MSGCRASHˆStart�of�'SYSTEM�CRASHED' +�TRAP15„BUGTRP15,KILLER6ƒDo�Pseudo�TRAP�#15KILLER6:9LB3$�DC.W†$21�Output�string,�no�CR�or�LF #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D0�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 9OUTLOOP2ƒROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character'‹MOVE.L‚A6,-(A7)ŒA6�=�end�of�string�+�1‹MOVE.L‚A7,-(A7))‹ADD.Lƒ#4,(A7)�Starting�address�of�string-‹TRAP15‚BUGTRP15,OUTNXT2„Output�the�characterOUTNXT2:%‹DC.W„$21‘Output�string,�no�CR�or�LF. PAGE#*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE .‹DBRA„D0,OUTLOOP2‰Output�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack.  -�BSR‡KILLDLAYˆDelay�here�for�flashing�effect. %�PEA‡ENDBLANKˆEnd�of�blank�string�+�1#�PEA‡MSGBLANKˆStart�of�blank�string +�TRAP15„BUGTRP15,KILLER7ƒDo�Pseudo�TRAP�#15KILLER7:$�DC.W†$21�Output�string,�no�CR�or�LF #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -�BSR‡KILLDLAYˆDelay�here�for�flashing�effect. 5�BRA‡KILLOOP‰Now�loop�back�to�create�flashing�effect. ŠELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ŠENDI  ‰END: NN'VME133 TIMEINT AFVV  KILLER AF__  KILLER SAhh }  =/*=/*†VME133.TIMEINT.AF=/*,=/* Chain file to assemble VME133.TIMEINT.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to VME133.TIMEINT.LS=/*=/IFC \1ƒ=ARG�VME133.TIMEINT.LS=/ENDIF=/*D=ASM M68020.M68020.SA/MK68901.TIMEINT.SA,VME133.TIMEINT.RO,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9999.MK68901.MK68901.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9999.M68XXX.TIMEINT.AI=/*}=/*=ENDNNNNNN=/*=/*†VME133.KILLER.AF=/*@=/* Chain file to assemble VME133.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to VME133.KILLER.LS=/*=/IFC \1ƒ=ARG‚VME133.KILLER.LS; =/ENDIF=ARG‚\1,VME133.KILLER.RO=/*D=ASM M68020.M68020.SA/M68XXX.KILLER.SA/VME133.KILLER.SA,\2,\1;MRZ=80=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*ƒ9999.MK68901.MK68901.EQ=/*ƒ9999.VME133.BOARD.EQ=/*}=/*=ENDNNNNNW‰LIST‰PAGE‰SPCƒ1O*********************************************************************************ˆ9999.VME133.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:*’1.‚Turn�on�the�BoardFail�LED. *’2.‚Output�system�crash�message*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=*ˆEntry:„BRA�from�board-independent�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------1*ˆ03/27/86‚JAHŒMoved�output�message�routine�here. *ˆ11/27/85‚BAWŒOriginal�writing.*O*******************************************************************************‰PAGE *ˆINCLUDE�FILES**ˆINCLUDEƒ9999.VME133.BOARD.EQ*‰NOLIST ‰INCLUDEƒ9999.MK68901.MK68901.EQ‰INCLUDEƒ9999.VME133.BOARD.EQ‰OPT…CL‰LIST* *‚EQUATES*HALFSEC‚EQU‡$5FFFF‰PAGE ‰SECTION�2*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: &‰BSET.B‚#BRDFAIL,CREGŒTURN�FAIL�LED�ONA*�NOTE:‚This�will�also�turn�on�the�SYSFAIL�LED�on�the�MVME050,�if;*�it�is�in�the�system.‚The�050�monitors�the�VMEbus�SYSFAIL*<*�line,�and�turns�on�its�fail�LED�if�anyone�in�the�system�is*�asserting�SYSFAIL*. *C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‰Get�TRAP�#15�capability�flags�in�D13‰BTST„#ALT15IO,D1‰Test�for�AUSTIN�TRAP�#15�support.'‰IFƒ„THEN.S‰If�yes,�output�message. &�PEA‡ENDCRASHˆEnd�of�crash�message�+�1'�PEA‡MSGCRASHˆStart�of�'SYSTEM�CRASHED' +�TRAP15„BUGTRP15,KILLER6ƒDo�Pseudo�TRAP�#15KILLER6:; `Ki3$�DC.W†$21�Output�string,�no�CR�or�LF #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D0�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 9OUTLOOP2ƒROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character'‹MOVE.L‚A6,-(A7)ŒA6�=�end�of�string�+�1‹MOVE.L‚A7,-(A7))‹ADD.Lƒ#4,(A7)�Starting�address�of�string-‹TRAP15‚BUGTRP15,OUTNXT2„Output�the�characterOUTNXT2:%‹DC.W„$21‘Output�string,�no�CR�or�LF. PAGE#*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE .‹DBRA„D0,OUTLOOP2‰Output�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack.  -�BSR‡KILLDLAYˆDelay�here�for�flashing�effect. %�PEA‡ENDBLANKˆEnd�of�blank�string�+�1#�PEA‡MSGBLANKˆStart�of�blank�string +�TRAP15„BUGTRP15,KILLER7ƒDo�Pseudo�TRAP�#15KILLER7:$�DC.W†$21�Output�string,�no�CR�or�LF #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -�BSR‡KILLDLAYˆDelay�here�for�flashing�effect. 5�BRA‡KILLOOP‰Now�loop�back�to�create�flashing�effect. ŠELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ŠENDI  ‰ENDNN'VMES10 KILLER AF}}  KILLER SA†† ‚  =/*=/*†VMES10.KILLER.AF=/*@=/* Chain file to assemble VMES10.KILLER.SA and M68XXX.KILLER.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to VMES10.KILLER.LS=/*=/IFC \1ƒ=ARG�VMES10.KILLER.LS=/ENDIF=ARG \1,VMES10.KILLER.RO=/*D=ASM M68010.M68010.SA/M68XXX.KILLER.SA/VMES10.KILLER.SA,\2,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.KILL.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TRAP15.MC=/*ƒ9999.&.KILLEXEC.EQ=/*}=/*=END< NNNNNu‰LIST‰PAGE‰SPCƒ1&*–VMES10�-�BOARD�DEPENDANT�KILLER�CODE‰SPC�1O*********************************************************************************ˆ9999.VMES10.KILLER.SA*2*ˆThis�module�contains�board�specific�routines�to:.*’1.‚Would�turn�on�boardfail�LED�if�available.2*’2.‚Contains�output�message�via�trap�#15,�code�6.NNNNNN~ ‡J�-A*ˆIt�also�contains�an�equate�for�the�amount�of�times�to�decrementD*ˆa�counter�in�a�loop�in�order�to�delay�for�approx.�one-half�second.*E*ˆEnvironment:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family."*–Copyright�1985�by�Motorola,�Inc.*=< *ˆEntry:„BRA�from�board-independant�KILLER�(M68XXX.KILLER.SA)**ˆExit:…No�exit.*,*ˆRevision�history�(add�new�changes�to�top).*ˆDate†Author‰ChangesF*ˆ--------‚-------------‚---------------------------------------------9*ˆ03/27/86‚Julie�Hoban„Moved�output�message�routine�here.(*ˆ10/03/85‚Chuck�Smith„Original�writing.*O*******************************************************************************‰PAGE ‰SECTION�2 *ˆINCLUDE�FILES**‰NOLIST‰OPT…CL‰LIST * *ˆEQUATES*HALFSEC‚EQU‡$4FFFF‰PAGE*-*ˆBoard�Specific�Code�-�turn�on�BoardFail�LED*KILLER3: #*ˆNo�board�fail�LED�for�the�VME/10. *C*ˆIf�Firmware�debugger�has�TRAP�#15�I/O�-�use�it�to�display�message*KILLOOP: @*ˆThere�are�two�general�TRAP�#15�formats�for�Firmware�debuggers:;*ˆPrimary�(PHOENIX)�and�Alternate�(AUSTIN).‚During�the�boot8*ˆsequence�the�format�is�passed�by�the�bug�in�a�register=*ˆand�ends�up�in�SYSPAR�(although�we�found�some�bugs�don't�so"*ˆIPL�has�kindly�saved�it�for�us). ‰CLR.LƒD0 7‰MOVE.L‚TRP15TYP,D1‹Get�TRAP�#15�capability�flags�in�D12‰BTST„#T15IO,D1�Test�for�PHOENIX�TRAP�#15�support.,‰IFƒƒTHEN.SŒIf�yes,�then�output�message.*F*ˆTRAP�#15�PHOENIX�format�-�uses�A5,A6�to�point�to�string,�endstring+1*.‹LEA…MSGCRASH(PC),A5…Start�of�'SYSTEM�CRASHED'&‹LEA…ENDCRASH(PC),A6…End�of�string�+�1 ,‹TRAP15‚BUGTRP15,KILLER4„Do�pseudo�TRAP�#15.KILLER4:)‹DC.W„6“Output�string,�no�added�CR�or�LF. #*ˆTHE�DEBUGGER�RETURNS�CONTROL�HERE$*ˆNow�output�the�address�of�CRASHSAV !‹MOVE.L‚#7,D2�Output�8�characters)‹LEA…CRASHSAV,A0‰Make�sure�CRASHSAV�in�A0 ‹MOVE.L‚A0,D30‹SUB.Lƒ#2,A7�Make�room�on�stack�for�ASCII�chars. 8OUTLOOP„ROL.Lƒ#4,D3�Get�next�HEX�nibble�ready�to�convert‹MOVE.B‚D3,D1�Get�nibble�in�D1(‹MOVE.L‚A7,A6�A6�=�where�output�is�to�go,‹BSR…HXTOASCIŒConvert�HEX�to�ASCII�character)‹MOVE.L‚A7,A5�A5�=�start�of�output�string-*ŸA6�=�end�of�string�+�1�(set�up�by�HXTOASCI)‹TRAP15‚BUGTRP15,OUTNEXTOUTNEXT:#‹DC.W„6“Output�string,�no�CR�or�LF. PAGE#*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹DBRA„D2,OUTLOOPŠOutput�all�8�characters�yet?*¦Branch�back�if�no.‹ADD.Lƒ#2,A7�Clean�up�stack. -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. *‹LEA…MSGBLANK(PC),A5…Start�of�blank�string,‹LEA…ENDBLANK(PC),A6…End�of�blank�string�+�1 +‹TRAP15‚BUGTRP15,KILLER5„Do�pseudo�TRAP�#15KILLER5:#‹DC.W„6“Output�string,�no�CR�or�LF. #*ŠTHE�DEBUGGER�RETURNS�CONTROL�HERE -‹BSR…KILLDLAYŒDelay�here�for�flashing�effect. 5‹BRA…KILLOOP�Branch�back�to�create�a�flashing�message ‰ELSE.S @KILLER8:ƒBRA„KILLER8‰No�TRAP�#15�I/O�available,�so�loop�forever. ‰ENDI ‰END        NNNN'Z8036 TIMEINT AF££  TIMEINT SA¬¬F  = =/*=/*†Z8036.TIMEINT.AF=/*5=/* Chain file to assemble Z8036.TIMEINT.SA for 68020=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to Z8036.TIMEINT.LS=/*=/IFC \1ƒ=ARG�Z8036.TIMEINT.LS=/ENDIF=/*A=ASM M68020.M68020.SA/Z8036.TIMEINT.SA,Z8036.TIMEINT.RO,\1;MRZ=60=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9999.Z8036.Z8036.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9999.M68XXX.TIMEINT.AI=/*}=/*=ENDNNNNN›ŠPAGE**ˆINCLUDE�FILES**ˆINCLUDE�9995.&.STR.EQ*ˆINCLUDE�9999.Z8036.Z8036.EQ*ˆINCLUDE�9995.&.BAB.EQ*ˆINCLUDE�9995.&.PAT.EQ*ˆINCLUDE�9995.&.TR1RTCD.EQ*ˆINCLUDE�9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9999.Z8036.Z8036.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.INTERRUP.MCŠLIST@TIMEINTƒIDNTƒ45,0ŒTIMER�INTERRUPT�HANDLER�FOR�M146818�CLOCK�CHIP*$*‰COPYRIGHTED�1983�BY�MOTOROLA,�INC.*.*†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�15.625�MS**•01/18/83‚(SFF5)*•04/07/83‚(7616)*:*•08/15/83‚Steve�Franck�--�Changed�to�exit�through�COMINT.*ŠSECTION�LEVEL00* ŠXDEFƒTIMEINT ŠXREF.S�DATEŠXREF.S�PATBEGŠXREF.S�PREEMPT_FLAGŠXREF.S�PTMADDRŠXREF.S�TIME_LEFTŠXREF.S�TIMEOUTŠXREF.S�TIMESLICŠXREF.S�TIMINTVŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAG ŠXREFƒTRACERŠXREF.S�TRACFLAG ŠXREFƒBKG_SCHEDULE ŠXREFƒCKEXPA ŠXREFƒCKDELAYŠXREFƒPAT_RM_1ST_NODE**CLRINT„SET„$24�CLEAR�INT= ERRUPT*¥RESUME�COUNTDOWN 0TIMEINTƒMOVEM.L�D0-D1/A0-A1,-(A7)�SAVE�REGISTERS ŠMOVE.L�PTMADDR,A0‰TIMER�ADDRESS/ŠMOVE.B�#CLRINT,C1CSR(A0)‚CLEAR�TIMER�INTERRUPT -ŠMOVE.W�SR,-(A7)‹Value�to�use�in�unmask�laterŠDISABLE_INTERRUPTSˆMask /ŠCLR.L‚D1‘Subtract�from�TIME_LEFT�the�number�of4ŠMOVE.W�TIMINTV,D1‰milliseconds�between�timer�ticks.ŠSUB.L‚D1,TIME_LEFT‡*ŠMOVE.W�(A7)+,SR‹Unmask+ŠTST.L‚TIME_LEFTŠDo�we�need�to�fire�a�node? *‰INCLUDE�9999.M68XXX.TIMEINT.AIŠINCLUDE�9999.M68XXX.TIMEINT.AIŠENDN¤GNNNNNNNNNNN> NNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNM NNNNNNNNNNNNNNNNM NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNO NNNNNNNNNNNNNNNNO NNNNNNNNNNNNNNNN