IMD 1.17: 11/11/2014 11:22:36 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 13 OF 30  SR13q82VKXSVRDOS 0420¤j-Híÿÿ|+o t$3 <+@xaÿ:`ÿ H@0-4H@,NA4R1OPTION AFIX gUTILRR OPTION SA3U ƒ68K PASCAL OPTION PROCESSOR SUBROUTINE 2p.PCLSCOD H.POPTION (ZH3 B€B�IúA ú am zn ,gè4k6 -fÀ`Ög0ƒF3 gÁ` =fRŠa`  f@` NuBƒ:< &J $g�F3 am zn 4gˆ`6 am zn 4k6gãƒF3 (åƒÖ„�Ö�SEf΂ am zn 4jè  f" am zF3 n +ÿþNu:< am zn  am zn 4k´f 3 gŒ_�郆�SEfÌ`ÿz4 Q1CLSCOD AFIX gIOSRR CLSCOD SA ƒ68K PASCAL CHARACTER CLASS CODE TABLE2H.PCLSCOD (€F3 €€€@@ P€@  €@F3 4P1ALSTS AFIX gUTILRR ALSTS SA)0 ƒ68K PASCAL ALLOCATE STACK SUBROUTINE$2H.PALSTS H.PALSTSL (,23 HÄR„„ÿÿÿþŸÄŸü ¿íb O÷H pNNOï .·HNu4L1CLO AFIX gIORR CLO SA# ƒ68K PASCAL CLOSE FILE SUBROUTINE+2H.PCLO p.PCLOSPL p.PPRGBUF (&3  .LÐ2*(-0aA ðaA ì+D0Nu4\1IFD AFIX gIORR IFD SA$ ƒ68K PASCAL INITIALIZE FILE DESCRIPTOR SUBROUTINEL2H.PIFD p.PACCPER p.PCLOSPL p.PEDTFIL p.PSTDFLT p.PALSTS (H3 "_. HÂ&g&<…(„QR„Dÿþ$O•ĵíldEïµíle•ílØŠaA ÂF3 !OEïP/JEò8ÿ/JA??B$O eTgv`gvC)CL3 BjBBjBªL@O(-0fgA@aB ÿZJf<gJ-(gaB ÿFat`I3@ aúgJ-$gaB ÿ.a\`aâgaÄ`8°m"b"?S@å@@,J5LŸI3 g gaB þöa$` ga¤`aŠgNq5A+D0NÑHçØžMê$gI3 pÿS@å@@,Aõ|B€(@AõJaB þœ$€ÿ€üLßyg/p(NNI3 g g%m6*HBB|g€BNÁ NupaB þT|&8%m:*NuH瀀F3 Aê$0¼€NCgNN *&o|&BjFB*K*E f|'`  3 f|'`|'BjDLßNu4L1RST AFIX gIORR RST SA ƒ68K PASCAL RESET FILE SUBROUTINEm2H.PRST p.PACCPER p.PASGNF p.PCFLDAD p.PCALCLU p.PCLOSPL p.PSTDFLT p.PFLSCN p.PPRGBUF (²L3€ .LÐ2*aA ôaA ðB� f† fpÀj& g faA Ê g4/ N3 ¢ &JaA ¼5 c ¼5‚aA  aA œH‚?aA ”2&_g*8 >3€ gAê0¼NBgNN` ap÷Áj&aB ÿbAìB’5ANup`B ÿP4N1RWT AFIX gIORR RWT SA ƒ68K PASCAL REWRITE FILE SUBROUTINEL2H.PRWT p.PACCPER p.PASGNF p.PCLOSE p.PCALCLU p.PBUFSZ (€J3„ .LÐ ª2*aA ð fFaA æp�j&aV*8 &g, g&Aê$0¼€NCgL3 f0¼NCf0¼€NCgNNaA ¤B’A€� aA –CòO%I5ANup`A ‚4^1AFI AFIX gIORR AFI SA ƒ68K PASCAL ASSIGN FILE TO RESOURCE NAME SUBROUTINEA2H.PAFI p.PDFLT p.PCLOSPL p.PEDTFIL p.POPTION (ìJ3 .0/2R�Aÿþ/7¼ Aï Hç,o,nMî$aA ÒLßx$W$jaA Ä&F3 €ÿ€ügp(NNfg0<÷ÿÁj äH@ãÅHBEBF ;g  gI3€ `ð ;fäHçaB ÿpLß g/pANN Bfafèt…h Æ`F3 ¤ Cfa4<øÿÅh&!CHÆ`† DfaðCKÆ`p FfaÜCF3 JÆ`\ Rf$a¸…gÅÅ4( 1B`2 Wf$aŽ…F3 gÅÅ4( 1B`gÿ:gÿ 2(JEg;PBpøÁh&‰(I3 '$HfŠFgg(-0aB þh+D05A gþô _"_0R€@ÿþO÷NÑ23 g/pANNNugðfêfäNu4Z1ACCPER AFIX gIORR ACCPER SAX ƒ68K PASCAL ACCESS PERMISSION SET UP SUBROUTINE2H.PACCPER ("(3  f?*8 &g pøÀj&€W5@&0Nu4X1CALCLU AFIX gIORR CALCLU SA9 ƒ68K PASCAL CALCULATE LOGICAL UNIT SUBROUTINE2H.PCALCLU (RF3 /(-0fBg<`"g<`BR ft bfì c3 p@NNB B)(Nu4 P1EDTFIL AFIX gIOSRR EDTFIL SA ƒ68K PASCAL EDIT FILE NAME SUBROUTINE 2H.PEDTFIL p.PCLSCOD (âH3 B€B�IúA ú&H6<%B„aük$ #fÀ` ff&@€€€Nu€üF3 `öaÊkBfôgÚ .f R nÐ`Þ :f€@`Ð (f€`Ä F3 )fª@`¸g Jfžf˜ggŒfF*H Kf  aF3 m zn (g24f.f. gD gô .fRˆF3 `*Rˆ`DÀ` 6<Gîa&4<aškÌ`À`Â&<€€€F3  am zn 4k^f0fR *g2À  am zn F3 4kR .fâ`JÆü �Ö�`¤ ƒ€f4 .fÄÀ6<ÿþ` ƒ€g ƒF3 'cÀ` =C ` À`À4<aÚk 6< Gî aN4<aÂkôF3 n& f| 6< Gîa(4<aœkÎ (g 6<Gîa 4<a~F3 k° (f¨BBBC am zn 4kD )gg8 Pn2AéKF3 †AB`ÈBÿg BnÀ BcÀ=C `JÀÀÀBÿ BcÀF3 `.Rˆ6<Gîap4<aæk$< Gî &Â&Â&Â&Â6ÂBn $B|gÀ4F3 B|gÀJ€NuJCfBA`$ am zn SC /f À<€`4NuF3 4HB€€»ÈgF am zn 4k.f(f @À`< F3 *fÀÁSCn¾€€`$HB´CfÀ`< (*ÿþf<*`ÂSCnúNuJ€j(3 À`QBgQBÀ`ÀBgÀNu4N1PRGBUF AFIX gIORR PRGBUF SAR ƒ68K PASCAL PURGE BUFFER SUBROUTINE 2H.PPRGBUF p.PWRTBUF ("3 g g ³êgaA ì ‰Nu4Y1STDFLT AFIX gIORR STDFLT SA' ƒ68K PASCAL SET START FILE DEFAULTS SUBROUTINE 2p.PDFLT H.PSTDFLT (^H3 %| 8%| .f "3 %m@0%mD4` g%m6*Nu4Y1MPJ AFIX gUTILRR MPJ SA3 ƒ68K PASCAL 32 BIT INTEGER MULTIPLY SUBROUTINE2H.PMPJ (vF3 HçýÀ./$T¯$ G0å@A÷X@ @fB@C÷ "*jD€³…J�jD�$&H@HAÀÁ<3 ÆÂ(ÂÂHBHDÄÄÔ�"HABAÒƒBBHBÑ‚VÂJ…jD�F…Ê�[à �†DÃLß¿Nu4`1DVJMODJ AFIX gUTILRR DVJMODJ SA1 ƒ68K PASCAL 32 BIT INTEGER DIVIDE AND MOD SUBROUTINES$2H.PDVJ H.PMODJ (–F3 HçùÀ./ T¯ a( ‚DÁLߟNuHçùÀ./ T¯ aãƒjD€ €DÁLߟNu G0å@A÷F3 X@ @fB@C÷ "fpNN&âƒjD€³ƒJ�jD�tÿB²€dã‰R`ö��dÐ�ã’3 â‰SdòF‚"jD‚F�‚[ÁNu4I1WLN AFIX gIOSRR WLN SA$X ƒ68K PASCAL WRITELN SUBROUTINE 2H.PWLN p.PWRTBUF (3 .LÐR’aA ö ‰Nu4Q1WRC AFIX gIOSRR WRC SA%# ƒ68K PASCAL WRITE CHARACTER SUBROUTINE+2H.PWRC p.PIWPTR p.PLBLKS ("3@ .LÐ8SDaA ô€aA î ‰Nu4P1WRI AFIX gIOSRR WRI SA%5 ƒ68K PASCAL WRITE INTEGER SUBROUTINESI2H.PWRH H.PWRI H.PWRJ p.PIWPTR p.PLBLKS (ŽJ3 H€HÀ.LÐ8v / BJ€jt-D€SDGúL°›dSCnø˜CSDaA ÒJg‚aA ÈJCg(+J3@@ ÿür0°„e�„R`ö�aA ®(SCnè0€aA ž ‰&_Nu;šÊõᘖ€B@† 3 'èd 4Z1WRSWRV AFIX gIOSRR WRSWRV SA%Q ƒ68K PASCAL WRITE STRING AND VECTOR SUBROUTINES:2H.PWRS H.PWRV p.PIWPTR p.PLBLKS (JJ3 0/8/`8/0/./ Gï 2RAAÿþ sLИ@aA ÒJ@g ›aA ÈS@nö ‰3 &_$_O÷NÒ4 O1WRB AFIX gIOSRR WRB SA% ƒ68K PASCAL WRITE BOOLEAN SUBROUTINE+2H.PWRB p.PIWPTR p.PLBLKS (:D3@ ./ LÐtGú"JgÖÂSB8˜BaA ä›aA ÞSBnö&_ ‰NuFALSETRUE 4T1WRR AFIX gIOSRR WRR SA($ ƒ68K PASCAL REAL NUMBER WRITE SUBROUTINES_2H.PWRR H.PWRW H.PWRX (p.PFPOINT p.PALSTS p.PIWPTR p.PLBLKS (F3 .JAlra�`ašNu.JAlra|`a†Nu.JAlrah`arNu8DN3 € aA ¼p °fp-€aA ¬MúpžaA  S@föNuINFINITY8DaA ˆpMú:O3  žaB ÿ|S@fö , ré˜tÄ0 9o‚aB ÿXSAfâ¼)aB ÿLNuNAN(16#I3 Hçð XLBFBpBFgèvÆŠg RFPÅ0ÃS@fâLßPNuJEo ¼0aB ÿSEL3 `JFo žaB þöSF`¼0aB þêS@Nu86,HCBCB@zé›Àü ÐCBCSEfòR@JjD@L3 Nuaÿ|aÔ @o˜@˜AUD`˜AWDaB þ¤v gv-ƒaB þ”,H…šFRElBE?BEL3 @n :DESEÚ_`T�aÿ^nú¼.aB þb0aÿNnúNuHçLÐx"aB þJM×Iï AI3 lr4 B€o4<€DBaB þ*ðT¸ð Àfaþ†`  g °faþ@`L3 aÿ@ ‰Þü"Lß@`Nu¼EaB ýêp+Jjp-€aB ýÜ0, AfáX` AféXtéXL3@ Ä0‚aB ý¶SAfìNufv `v-ƒaB ýžaþZ,H…šFRElBEY@�A @lL3 paþn¼.aB ýtaþbfúaÿzNuHçLÐx"aB ýZM×Iï4YB”A Blt` BI3 otaB ý8ðT¸ð Àfaý”`  g °faýN`aÿ^ ‰Þü"Lß@`3 Nu4L1PUT AFIX gIOSRR PUT SA"! ƒ68K PASCAL PUT BUFFER SUBROUTINE 2H.PPUT p.PWRTBUF (0:3„ .LÐ8*R’Òê³êcg !aA àÀR’`aA Ö ‰Nu4^1PAG AFIX gIOSRR PAG SA!V ƒ68K PASCAL SEND PAGE EJECT TO TEXT FILE SUBROUTINE 2H.PPAG p.PWRTBUF ( *3„ .LгêgR’aA ðü T’aA æ ‰Nu4N1WRTBUF AFIX gIORR WRTBUF SAC ƒ68K PASCAL WRITE BUFFER SUBROUTINE 2p.PBUFSZ H.PWRTBUF (jF3 HçÀ€2*fpDNN³êggS‰` g¼ `S‰`¼ %IAê23 0¼NBg ÆgNNaA ªCòO%I"jLßNu4V1LBLKS AFIX gIOSRR LBLKS SA!' ƒ68K PASCAL WRITE LEADING BLANKS SUBROUTINE 2p.PIWPTR H.PLBLKS (3 JDo ¼ aA öSDnôNu4c1IWPTR AFIX gIOSRR IWPTR SA! ƒ68K PASCAL INCREMENT TEXT FILE COMPONENT PTR SUBROUTINE 2H.PIWPTR p.PWRTBUF (3 ³êfaA öŸRIR’Nu4c1EOL AFIX gIOSRR EOL SAV ƒ68K PASCAL TEST FOR END OF LINE IN TEXT FILE SUBROUTINE 2H.PEOL p.PRDBUF (3D aA ¾SBnìaA ¶€ Am Zo �Lß ŠNup3NNALSERUE 4 W1RDSTR AFIX gIOSRR RDSTR SA#U ƒ68K PASCAL READ STRING OR VECTOR SUBROUTINE+2p.PGETCH p.PIRPTR H.PRDSTR (*43 LÐ 8+24aA òµëgaA èJAgîÀSA`è”A ŠNu4U1SBLKS AFIX gIOSRR SBLKS SA$F ƒ68K PASCAL SKIP LEADING BLANKS SUBROUTINE+2p.PGETCH p.PIRPTR H.PSBLKS (3B aA þ faA ô`ðNu4a1GETCH AFIX gIOSRR GETCH SA " ƒ68K PASCAL GET CHARACTER FROM INPUT BUFFER SUBROUTINE 2p.PRDBUF H.PGETCH (&3 faA ú8+gp"NNB€Nu4_1IRPTR AFIX gIOSRR IRPTR SA! ƒ68K PASCAL INCREMENT INPUT COMPONENT PTR SUBROUTINE2H.PIRPTR ($3 R“µëf•Ê`RеëfÄ7DNu4R1PEE AFIX gIOSRR PEE SA"  ƒ68K PASCAL PEEK INTO A FILE SUBROUTINE 2H.PPEE p.PRDBUF (*23€ .$P f/ &haA ð8+gp"NN Š&_ JNu4`1GET AFIX gIOSRR GET SA  ƒ68K PASCAL ADVANCE FILE COMPONENT POINTER SUBROUTINE 2H.PGET p.PRDBUF (JH3@ ./ LÐ 8+ faA î8+gp"NNR“Ôëµëmng Ä7D3 `•Ê Š&_Nu4X1GETINT AFIX gIOSRR GETINT SA 4 ƒ68K PASCAL COLLECT INTEGER DIGITS SUBROUTINE+2p.PGETCH H.PGETINT p.PIRPTR (J3 z"Bv 0m 9op1NN`@JEoJf 0g 0ÀPÁSE`RCaA ÈaA Ä J3 am zn 0m 9oÀ #f¬ÃJEoÀSE`RCBaA ŠaA † aF3 m zn 9o Am0 oJ@m @op1NN`TJEoJfL3P gÀPÁSE`RCaB ÿ.aB ÿ* am zn 9o Am0 o3 Jm o¬E"DENu4]1MAKINT AFIX gIOSRR MAKINT SA!9 ƒ68K PASCAL MAKE AN INTEGER FROM DIGITS SUBROUTINE2H.PMAKINT (^F3 B@BAt JEoNv #f(J@gpbNN` Ac AcpbNN`4B@BA`´Cn$3 pcNNÀÂÂÂÒƒHA6HAЃSE`°H@0Nu4W1RDBUF AFIX gIORR RDBUF SA ƒ68K PASCAL READ BUFFER FROM FILE SUBROUTINEL2p.PASGNF p.PCFLDAD p.PCLOSE H.PRDBUF p.PBUFSZ p.PFLSCN (þH3 HçøÐ2+$KaA ôHÀgS€`R€@ÿþЫS€'@fpCNNAë0¼NBJ3@€ gz Ægt ÂgNNA€7A gXaA ž5´5cJaA ��7AR55L3D H‚5 J /g RB5 J /fôRB‚aB ÿ^2*aB ÿV5ALß `ÿJ•Ê`8�D3 $k +g�J€fÁ¼ ` J€g0+HÀS€ÐŠ'@7ALß Nu4M1ASGNF AFIX gIORR ASGNF SA8 ƒ68K PASCAL ASSIGN FILE SUBROUTINE2H.PASGNF ($*3 Aê$0¼@NCgNN$-0*)Â+B0ÁNu4X1BUFSZ AFIX gIORR BUFSZ SAT ƒ68K PASCAL FIGURE OUT BUFFER SIZE SUBROUTINE2H.PBUFSZ (3 0<…f0*Nu4M1CLOSE AFIX gIORR CLOSE SA8 ƒ68K PASCAL FILE CLOSE SUBROUTINES$2H.PCLOSE H.PCLOSPL (283 gH瀀Aê$0¼NCgNNLßNuaÞAý¿?* „6Nu4Y1CFLDAD AFIX gIORR CFLDAD SA ƒ68K PASCAL CALCLUATE FIELD ADDRESS SUBROUTINE2H.PCFLDAD ((.3 g0<$`g0<(`+OSH€å@@,Nu4P1FLSCN AFIX gIORR FLSCN SA  ƒ68K PASCAL FILE LIST SCAN SUBROUTINE+2p.PDFLT p.PEDTFIL H.PFLSCN (*43 Aõ JHçMë$aA òLßpaA ê€ÿ€üg/p(NNNu4 a1LDC AFIX gUTILRR LDC SA24 ƒ68K PASCAL LOAD CONSTANT STRING AND VECTOR SUBROUTINE/2H.PLDCS H.PLDCV p.PALSTS (*23 pþ`B@ _.8˜@gAðaA ê"OUDg"ØYDnúm2ØNÐ4b1LODV AFIX gUTILRR LODV SA3 ƒ68K PASCAL VECTOR LOADS DIRECT AND INDIRECT SUBROUTINEM2H.PINDV H.PLODV H.PINDVL H.PLODVL p.PALSTSL (8@3 "_. 0HÀ`"_. (aA ì$O"gØS€nú`U„g$ØY„núm4ØNÑ4W1STCV AFIX gUTILRR STCV SA5P ƒ68K PASCAL STORE CONSTANT VECTOR SUBROUTINE/2H.PSTCV H.PSTCVL p.PSTOREV ("3 $_. 0HÀ`$_. "JaA ìNò84W1STOV AFIX gUTILRR STOV SA62 ƒ68K PASCAL STORE VECTOR INDIRECT SUBRUOTINE/2H.PSTOV p.PSTOREV H.PSTOVL ((03€ $_. 0HÀ`$_. "R�Aÿþ w"OaA àO÷8NÒ4U1STRV AFIX gUTILRR STRV SA7 ƒ68K PASCAL STORE VECTOR DIRECT SUBROUTINE/2H.PSTRV p.PSTOREV H.PSTRVL ($3 $_. 0HÀ`$_. "OaA ìO÷8NÒ4V1STOREV AFIX gUTILRR STOREV SA6 ƒ68K PASCAL STORE VECTOR SUPPORT SUBROUTINE2H.PSTOREV (6<3 &RƒCÿþ(gÙS€nú`â€UÁâ€UÂg ÙS€núJg0ÙJgÙNu4R1EQUV  AFIX gUTILRR EQUV SA13 ƒ68K PASCAL COMPARE VECTORS SUBROUTINESº2H.PGEQV PH.PEQUV H.PGRTV @H.PLEQV 0H.PLESV H.PNEQV H.PGEQVL XH.PEQUVL H.PGRTVL HH.PLEQVL 8H.PLESVL (H.PNEQVL (¬F3 a^WÀDNÒa`WÀDNÒaNVÀDNÒaPVÀDNÒa>UÀDNÒa@UÀDNÒa.SÀDNÒa0SÀDNÒF3 aRÀDNÒa RÀDNÒaTÀDNÒaTÀDNÒ$o0HÀ`$o . &RƒCÿþCïA÷23 8Öƒâ€UÁâ€UÂg±‰fS€nøJg±IfJg± _O÷8NÐ4a1LODS AFIX gUTILRR LODS SA2G ƒ68K PASCAL DIRECT AND INDIRECT STRING LOAD SUBROUTINE/2H.PINDS H.PLODS p.PALSTS (&3 $_. 8TDaA ö"OUDg"ØYDnúm2ØNÒ4U1STRS  AFIX gUTILRR STRS SA6E ƒ68K PASCAL STRING DIRECT STORE SUBROUTINE2H.PSTRS (4:3 "_. 2RAAÿþU@°Am0`>€R@@ÿþ$OJ@o ÚY@núf0’O÷NÑ4W1STOS  AFIX gUTILRR STOS SA6 ƒ68K PASCAL STRING STORE INDIRECT SUBROUTINE2H.PSTOS (8>3 "_. 2RAAÿþU@ w°Am0`>€R@@ÿþ$OJ@o ÚY@núf0’O÷NÑ4R1EQUS AFIX gUTILRR EQUS SA1 ƒ68K PASCAL COMPARE STRINGS SUBROUTINES`2H.PGEQS (H.PEQUS H.PGRTS H.PLEQS H.PLESS H.PNEQS (”F3 a.WÀDNÒa&VÀDNÒa]ÀDNÒa_ÀDNÒa^ÀDNÒa\ÀDNÒ./Eï46RCCF3 ÿþCò026RCCÿþHq00°Bo0J@g³ fS@nøp ”Agma `aLß.HNѰ3 fSBnøNu²fRBmöNu4W1NEW AFIX gUTILRR NEW SA3@ ƒ68K PASCAL NEW (HEAP ALLOCATION) SUBROUTINE/2H.PNEW H.PNEWL p.PCHKOVF (‚J3@ ."GaA ú(` ."GaA îB„8R„„ÿÿÿþ.‰v¸ƒl(X„"mQ‰$I&)g""C¸‘nòF3 �„ €lX‰%Q`*"€ÓÀ"Ä`""mEñH ¿ÊbpNNEêÿØQ‰$Ñ"Ä$Ñ+J ‰3 Nu4]1DIS AFIX gUTILRR DIS SA0E ƒ68K PASCAL DISPOSE (HEAP DEALLOCATION) SUBROUTINE/2H.PDIS H.PDISL p.PCHKOVF (pH3 T—T—.aA ø$PB� mQˆµÈbVB€“É("µÈb "H h`ò%H#J"gÒ�µÁb •È63 ØŠ „$H#J" Ò„³ÁbJ€f $‘PŠ+J`"  ’ŠÒ‘$� @!JNu4U1MRK AFIX gUTILRR MRK SA3( ƒ68K PASCAL MARK (HEAP MARKING) SUBROUTINE 2H.PMRK p.PCHKOVF (3 .aA ü ­Y�Nu4]1RLS AFIX gUTILRR RLS SA4 ƒ68K PASCAL RELEASE (HEAP DEALLOCATION) SUBROUTINE 2H.PRLS p.PCHKOVF (6>3 .aA üYˆ"mQ‰³Èc""i³Èbø g Б±Àb I"ipÿ À É+HNu4_1CHKOVF AFIX gUTILRR CHKOVF SA)F ƒ68K PASCAL CHECK FOR STACK HEAP OVERFLOW SUBROUTINE2H.PCHKOVF (3 Oïÿà¿íOï bpNNNu4c1CVBSV AFIX gUTILRR CVBSV SA)X ƒ68K PASCAL CONVERT STRING S->V STR UNDER VEC SUBROUTINE 2H.PCVBSV p.PCVTSV (.63 .R@@ÿþ24A÷ÔPUAo!`YAnøf1`0‚Ð@`A ÖNu4Z1CVTSV AFIX gUTILRR CVTSV SA0& ƒ68K PASCAL CONVERT STRING TO VECTOR SUBROUTINE/2p.PALSTSL H.PCVTSV H.PCVTSVL (bF3 HÀ _.2HÁ6< R€@ÿþgƒR�(˜�g:nE÷C÷U@g#"Y@núm3".I*3 `"OaA º$OU�g m $ÙY�núm4Ù4ÃU„núNÐ4`1CVTSU AFIX gUTILRR CVTSU SA0 ƒ68K PASCAL CONVERT STRING TO UNNORMALIZED SUBROUTINE 2p.PALSTS H.PCVTSU (NH3 _.U@2RAAÿþR@@ÿþ8˜Ag2nC÷E÷>€g%!Y@núm5!.JNÐ"OaA Æ$OJA3 g$ÙYAnúm4ÙNÐ4`1CVTUS AFIX gUTILRR CVTUS SA0@ ƒ68K PASCAL CONVERT UNNORMALIZED TO STRING SUBROUTINE2H.PCVTUS (063 _.R@@ÿþC÷2RAAÿþE÷µÉgJAg#"YAnúm3".INÐ4O1SLEN AFIX gUTILRR SLEN SA5$ ƒ68K PASCAL STRING LENGTH SUBROUTINE2H.PSLEN (3 _.02RAAÿþÞÁNÐ4V1SCON AFIX gUTILRR SCON SA4& ƒ68K PASCAL STRING CONCATINATION SUBROUTINE 2H.PSCON p.PALSTS (JH3 _.4$O6RCCÿþC÷028aA æHq@ÒÁ0g!S@nú"_ÒB0R@@ÿþÔÀJ@g"3 S@nú3.INÐ4P1SCOP  AFIX gUTILRR SCOP SA4@ ƒ68K PASCAL SUBSTRING COPY SUBROUTINE 2H.PSCOP p.PVALSI (rH3 _.46RCCÿþC÷0aA ìfBA`PS@8˜@²Do2JAg@E÷0²Df8µDDg*83 g’ÁS‰ÚS@nú’Á`R@@ÿþÔÀµÉg"S@nú`”À"J.I?NÐ4T1SPOS AFIX gUTILRR SPOS SA56 ƒ68K PASCAL SUBSTRING POSITION SUBROUTINE2H.PSPOS (bF3 ."O20R@@ÿþEñ40R@@ÿþHrB@JAg6”Am2RB0SA I?¶fJAg ( (3 µ f SAnø�BR@` 2$D"HSBnÞB@2.W GNÐ4R1SINS AFIX gUTILRR SINS SA5 ƒ68K PASCAL STRING INSERTION SUBROUTINE+2H.PSINS p.PALSTS p.PVALSI (lJ3 _.4$O6RCCÿþCò02g�sys�task)*�0003‹EVUPRI�DS.B„1ƒRequestor's�priority**�0004‹EVUTSK�DS.L„1ƒRequestor's�task�name(*�0008‹EVUSES�DS.L„1ƒRequestor's�session«S´\,*�000C‹EVUUNM�DS.W„1ƒRequestor's�user�number,*�000E‹EVURD0�DS.L„1ƒRequestor's�register�D0,*�0012‹EVURA0�DS.L„1ƒRequestor's�register�A0+*�0016‹EVUPST�DS.B„1ƒParameter�block�status** Length = $18 (EVUNLN)*N* Following the above portion of the event is a normal FHS (TRAP #3) parameter?*ƒblock�which�is�also�part�of�the�event,�length�=�$34�(FHSNLN).*�FHS�Parameter�block�follows.*ASQUE„DS.B„EVULENŽEVENT�QUEUECALBLKƒDS.B„FHSNLNŽPARAM�BLOCK* *ˆSTACK�AREA*ENDSTKƒDS.B„$80‘STACK�AREAFHSTAKƒEQU…*“STACK�POINTER**ˆWORK�BUFFERS*BYTE…DS.L„1“CATCH�ALL*LUNCMDƒDS.W„1“COMMAND�HOLDLUNCSFƒDS.W„1“COMMAND�TYPE�FLAGTSKATTƒDS.L„1“TASK�ATTRIBUTES+FDMBUFƒDS.W„5“FETCH�DEVICE�MNEMONICS�BUFFER**ˆDEVICE�STATUS�EVENT*FMSEVTƒDS.B„1“EVENT�LENGTH ‰DS.B„1“CODEFMSUB„DS.B„1“SUB-CODE‰DS.B„1“RESERVEDFMSDCBƒDS.L„1“DCB�ADDRESS* *Ë***É*****Ç***2****…GENERAL�PURPOSE�BUFFER�FOR�DYNAMIC�USAGE˜*******Ç*****É***Ë*GPBUFR:‰DS.B†22GPBLNTH‚EQU‡*-GP BUFR  *Ë***É*****Ç*******…IOS�TASK�IDµ*******Ç*****É***Ë* IOSTSKID:‰DS.B†8 *Ë***É*****Ç*******…FMS�TASK�IDµ*******Ç*****É***Ë* FMSTSKID:‰DS.B†8 *Ë***É*****Ç***(****…SYSTEM�OUT�OF�SPACE�DIAGNOSTIC¢*******Ç*****É***Ë*SYSPACE:‰DS.L†1/*œThe�out�of�system�space�error�can�occur�under0*œone�conditon�only�in�FHS,�namely�when�a�LUT�is0*œtrying�to�be�built�for�a�task.�This�field�will1*œnormally�be�zero�unless�FHS�encounters�an�error1*œtrying�to�allocate�space�for�an�LUT.�There�is�a2*œsingle�routine�'LUTBLD'�which�will�build�the�LUT-*œfor�a�task.�This�routine�can�be�called�from2*œvarious�places�in�FHS.�If�this�field�is�non-zero.*œthe�value�contained�therein�will�reflect�the1*œreturn�address�from�the�call�to�the�subroutine. TSEGSIZE�EQU‡*#GSEGSIZE�EQU‡((TSEGSIZE/256)+1)*256 **ˆPARAMETER�BLOCKS** ‰OFFSET„0STRBLK„DS.Lƒ1’TASK�NAMEŠDS.Lƒ1’SESSIONŠDS.Wƒ1’OPTIONS�STOPMP+STOPRGŠDS.Lƒ1’MONITOR�TASK�IDŠDS.Lƒ1’MONITOR�TASK�SESSIONŠDS.Lƒ8’REGISTERS REGA0…DS.Lƒ7**ˆALLOCATE�CHANNEL*!ALLBLK„DS.Bƒ1’COMMAND�CODE•XDCALLŠDS.Bƒ1’COMMAND�SUB-CODEŠDS.Bƒ1’RESERVED)ŠDS.Bƒ1’OPTIONS�(EXCLUSIVE�ACCESS)‡XOPEXCŠDS.Lƒ1’CHANNEL�MNEMONIC)ŠDS.BƒXIOALN+(2*XIOXLN)-XIOPRM�PARAMETERSŠDS.Lƒ1’PRECAUTION**ˆSHARE�SEGMENT�DIRECTIVE�BLOCK*SEGBLK„DS.Lƒ1’TASK�IDŠDS.Lƒ1’SESSIONŠDS.Wƒ1’OPTIONSŠDS.Wƒ1’ATTRIBUTES—SGATSSŠDS.Lƒ1’SEGMENT�NAME•IOCOMNŠDS.Lƒ1’LOGICAL�ADDRESS’IOCOMS!ŠDS.Lƒ1’LENGTH�OF�SEGMENTS�IOCOML* *ˆCREATE�SEGMENT�DIRECTIVE�BLOCK*CSEGBLKƒDS.Lƒ1’TASK�IDŠDS.Lƒ1’SESSIONŠDS.Wƒ1’OPTIONSŠDS.Wƒ1’ATTRIBUTESŠDS.Lƒ1’SEG.�NAMEŠDS.Lƒ1’LOGICAL�ADDRESSŠDS.Lƒ1’SEGMENT�LENGTH**ˆALLOCATE�ASQ*ASQBLK„DS.Lƒ1’TASK�IDŠDS.Lƒ1’SESSIONŠDS.Bƒ1’STATUSŠDS.Bƒ1’MAX.�MESSAGE�LENGTHŠDS.Lƒ1’QQUEUE�LENGTHŠDS.Lƒ1’ASR�ADDRESSŠDS.Wƒ1’KEEP�4�BYTE�BOUNDARY***LSV:ŠDS.Lƒ1’LOW‚START�VALUEHSV:ŠDS.Lƒ1’HIGH�START�VALUELVP:ŠDS.Lƒ1’LAST�VALUES�PROCESSEDNVTP:ŠDS.Lƒ1’NEXT�VALUE�T0�PROCESS STARTVAL:$ŠDS.Bƒ1’START�VALUE�ENTRY�PROCESSINGBITNBR:"ŠDS.Bƒ1’BIT�NUMBER‚ENTRY�PROCESSINŠDS.Bƒ$80�ROOM�FOR�STACK STACK…EQU„*TSEGSIZE�EQU‡*#GSEGSIZE�EQU‡((TSEGSIZE/256)+1)*256 éé¼H**********(*****„OFFSET�VALUES�FOR�IOS�DATA�SEGMENT********** ‰OFFSET„0 GSEGADDR:‰DS.L†1*œADDRESS�OF�SEGMENT�FOR�IOSIOCOMS:‰DS.L†1*œI/O�COMMON�SEGMENT�ADDRESS ***************„HALT�I/O�PARAMETER�BLOCK**********HLTCBLD:&‰DS.W†1‰FUNCTION�CODE�COMMAND‰(IOHALT)‰DS.W†1‰OPTIONSHLTSTLN:�DS.W†1‰STATUS�AND�LUN‰DS.W†1‰RESERVEDHLTCBLT‚EQU‡*-HLTCBLD**Ë***É*****Ç***#****…ATTENTION�PARAMETER�BLOCK§*******Ç*****É***Ë*%QEVATNLD�DS.L„1“TASK�TO�RECEIVE�EVENT+‰DS.L„1“SESSION�NBR�OF�TASK�RECEIVING�EVENT‰DS.W„1“OPTIONS�FOR�EVENT.‰DS.L„1“ADDRESS�OF�INFORMATION�PACKETƒ(ATTNLD)*‰DS.L„1“ADDRESS�OF�BREAK�INTERRUPT�ADDRESS*Ë***É*****Ç***&****…ATTENTION�INFORMATION�PACKE T¤*******Ç*****É***Ë*#ATTNLDƒDS.B„1‹EVENT�LENGTHˆ(EVALEN)‰DS.B„1‹EVENT�CODEŠ(EVCATN)‰DS.L„1‹DEVICE�MNEMONIC‰DS.W„1‹DEVICE�STATUS**ˆREQUEST�TIMER�EVENT*!TEVPRMLD�DS.L†1‰TASK�I.D.�(IOSID)#‰DS.L†1‰I/O�SESSION�NUMBER�(IOSESS)/T_OPTSLD�DS.W†1‰OPTIONS�FOR�PERIODIC�ACTIVATION0*�15�TIME�OF�FIRST�ACTIVATION�IS�COMPUTED�AS�SUM(* OF�INTERVAL�PLUS�TIME�DIRECTIVE�ISSUED+*�14�TASK�IS�ACTIVATED�AT�INITIAL�TIME�ONLY*�13-120* TIMER�EVENT�IS�FOR�DEFAULT�ASR�SERVICE�ADDRESS!*�11�UNIQUE�ID�PROVIDED�FOR�TIMER*�15-14#* IF�BOTH�ZERO�CANCEL�TIMER�REQUEST(‰DS.L†1‰TIME�FOR�INITIAL�ACTIVATIONƒ(-1)1IOINTRLD�DS.L†1‰TIME�INTERVAL�BETWEEN�ACTIVATIONS2‰DS.L†1‰ASR�SERVICE�ADDRESS�WHERE�TIMEOUT�IS�TO�BE *œSERVICED�IF�OTHER�THAN�DEFAULT UNIQIDLD:7‰DS.L†1‰UNIQUE�IDENTIFIER�USED�TO�IDENTIFY�THIS�REQUEST *Ë***É*****Ç***&****…INITIATE�I/O�PARAMETER�BLOCK¤*******Ç*****É***Ë*INTPRMLD�DS.B„1“CODEˆ(XDINIT)‰DS.B„1“SUB,CODE‰DS.B„1“RESERVED‰DS.B„1“OPTIONS‰DS.L„1“CHANNEL�MNEMONIC‰DS.L„1“TASK�ID‰DS.L„1“SESSION‰DS.L„1“DCB�ADDRESS‰DS.L„1“ADDRESS�USER�IOCB‰DS.W„1“LENGTH�OF�USER�IOCB**�PARAMETER�BLOCKS****ˆMOVE�LOGICAL�TO�LOGICAL*MOVPRMƒDS.L„1“SOURCE�TASKÅfÎWÖW‰DS.L„1“SOURCE�SESSION�NUMBER‰DS.L„1“SOURCE�LOGICAL�ADDRESS‰DS.L„1“DESTINATION�TASK"‰DS.L„1“DESTINATION�SESSION�NUMBER#‰DS.L„1“DESTINATION�LOGICAL�ADDRESS‰DS.L„1“LENGTH**ˆESTABLISH�TRAP�SERVER*.SRVPRMƒDS.L„1“SERVICE�ADDRESS�(DEFAULT�TO�ASR)‰DS.B„1‹TRAP�INSTRUCTION*0*œSRTREOT�-�TASK�ELECTS�TO�RECEIVE�AN�EVENT�EACH*¦TIME�A�TASK�TERMINATES1*œSRTRPRM�-�SERVER�TASK�EXPECTS�A�PARAMETER�BLOCK*¦WITH�THE�EVENT.*œIOSTIN‚-�VALUE�OF�TRAP�NUMBER�(2)�WHICH�THIS*¦SERVER�TASK�WILL�SERVICE*‰DS.B…1’PB�LENGGTH0*œIOSNLN‚-�SIZE�OF�PARAMETER�BLOCK�WHICH�WILL�BE)*¦GIVEN�TO�THE�SERVER�TASK�WITH�THE�EVENTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>%*ˆThe�following�is�position�dependent**ˆQUEUE�EVENT�TO�FMS*QEVPRMƒDS.L„1“TASK�ID…(FMSID)$‰DS.L„1’TASK�SESSION�NUMBER�(IOSESS)‰DS.W„1“OPTIONS!‰DS.L„1“POINTER�TO�EVENT†(EVNLEN)‰DS.L„1“VECTOR�ADDRESS*************************,EVNLENƒDS.B…1’EVENT�LENGTH�(EVTLEN+IOSNLN-8)‰DS.B…1’EVENT�CODEƒ(EVCQUE)‰DS.B…1’SUB�CODE…(IOLEVT)‰DS.B…1’RESERVEDLUNR…DS.L…1’LUN�POINTERLUTR…DS.W…1’LUT�POINTER.*œLUTR�SHOULD�BE�A�'.L'�BUT�IT�CAUSES�PROBLEMS)*œELSEWHERE�IN�THE�FMS�PART�OF�THE�SYSTEMARQUE„DS.B„EVULENŽEVENT�QUEUEIOCBLKƒDS.B„IOSNLNŽPARAM�BLOCK*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< **ˆACKNOWLEDGE�SERVICE�REQUEST*AKRPRMƒDS.L„1“TASK�ID‰DS.L„1“TASK�SESSION�NUMBER‰DS.W„1“OPTIONS‰DS.B„1“TRAP�NUMBER‰DS.B„1“CONDITION�CODE‰DS.L„1“D0�RETURN‰DS.L„1“A0�RETURN**ˆQUEUE�EVENT�TO�DRIVER*QEVDRVƒDS.L„1“TASK�ID‰DS.L„1“SESSION…(IOSESS)‰DS.W„1“OPTIONS!‰DS.L„1“POINTER�TO�EVENT„(EVTDRV)‰DS.L„1“VECTOR�ADDRESS***%EVTDRVƒDS.B„1“EVENT�LENGTH„(EVTLNG-8)‰DS.B„1“EVENT�CODE†(EVCQUE)%SUBEVCƒDS.B„1“EVENT�SUB�CODE‚(DRVEVT)‰DS.B„1“RESERVEDDCBADDR‚DS.L„1“DCB�ADDRESS***ˆQUEUE�I/O�COMPLETION�EVENT*QEVREQƒDS.L„1“TASK�ID‰DS.L„1“SESSION‰DS.W„1“OPTIONS‰DS.L„1“EVENT�ADDRESS‰(REQEVT)CMPADDR‚DS.L„1“VECTOR�ADDRESS*#REQEVTƒDS.B„1“EVENT�LENGTHŠ(EVIOND)‰DS.B„1“EVENT�CODEŒ(EVCIOC)IOCBADR‚DS.L„1“IOCB�ADDRESS* *ˆWORK�AREAS***ONEB…DS.W†1‘CATCH�ALL CURDCBLD:‰DS.L†1*œADDRESS�DCB�PROCESSING RTSADRLD:‰DS.L†1*œSAVE�AREA�FOR�BSR�RETURN�WHEN"*œROUTINE�'SETPERLD'�IS�PROCESSING TIMVALLD:‰DS.L†1"*œCONTAINS�TIME�INTERVAL�FOR�TIMER*Ë***É*****Ç***%****…TIME�OF�DAY�PARAMETER�BLOCK¥*******Ç*****É***Ë*  TIMPRMLD:CURDAYLD�DS.L†1CURTIMLD�DS.L†1***ˆWAKE�UP�TSK�(FHS)*WUFHS„DS.L†1‘TASK�ID�(FHSID)‰DS.L†1‘TASK�SESSIONŠ(IOSESS)*,*ˆEND�OF�THIS�PART�OF�THE�OLD�IOD.SA�VERSIONO*------------------------------------------------------------------------------*Ë***É*****Ç***,****…ATTATCH�I/O�CHANNEL�PRAMETER�BLOCKž*******Ç*****É***Ë*ATTPRMLD�DS.B„1“CODE’(XDATCH)‰DS.B„1“SUB-CODE‰DS.B„1“RESERVED*‰DS.B„1“OPTIONS(ASQ�INTERRUPT�AND�PROCEED)*º(XOPASQ+XOPPRO)‰DS.L„1“CHANNEL�MNEMONIC‰DS.B„1“CHANNEL�KEY"‰DS.B„1“LENGTH�OF�STATUS†(XRP1LEN)‰DS.L„1“VECTOR�SERVICE�ADDRESS‰DS.W„1“TIMEOUT�COUNT‰DS.W„1“RETRY�COUNT*Ë***É*****Ç***2****…GENERAL�PURPOSE�BUFFER�FOR�DYNAMIC�USAGE˜*******Ç*****É***Ë*GPBUFR:‰DS.B†22GPBLNTH‚EQU‡*-GPBUFR *Ë***É*****Ç*** ****Å*******Ç*****É***Ë* LASL:„DS.W†1*œUPPPER�STACK�DELIMITER ‰DS.B†$80IOSTAK:*œSTART�OF�STACK UASL:„DS.W†1*œLOWER�STACK�LIMITTSEGSIZE�EQU‡*#GSEGSIZE�EQU‡((TSEGSIZE/256)+1)*256é'EXORMACSLOADMMU AFêêqqLOADMMU SAóó kqqVECTORS AFqqVECTORS SA  qqVECTTBL AG•qqLOADMMU RO//qqRMS CD88RqqRMS CIIIqqRMS LGRR mqqVECTORS ROccqqVECTTBL ROllqqRMS LOmZqqRMS LL̾ñeqq=/*=/*†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=/*6=ASM EXORMACS.LOADMMU.SA,EXORMACS.LOADMMU.RO,\1;RZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDéééé ééâ‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGELOADMMU‚IDNT‚2,0„LOAD�MMU*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�LOADMMU‚2.00„**ˆ*�HLD6ƒ09/18/80‚**ˆ*�HLD6ƒ03/30/81‚**ˆ**********************…LOAD�MMU�SUBROUTINE**…REGISTER�USAGE:ƒ01234567 *–D*********–A�*ƒ**…ENTRY:„A5�POINTS�TO�TST*‰SECTION�LEVEL00* ŠXDEFƒCRASN ŠXDEFƒDEASN ŠXDEFƒLOADMMUŠXDEFƒLOADMMUIŠXDEFƒMMUFAULT ŠXDEFƒUNLDMMU ŠXREF.S�MMUHEREŠXREF.S�MMULOADŠXREF.S�TRACERŠXREF.S�TRACFLAG*,LOADMMU‚MOVE.W‚SR,-(A7)ŠSAVE�STATUS�REGISTER)LOADMMUI�OR.W„#$700,SRŠINHIBIT�INTERRUPTS.‰MOVEM.L�TSTMMU(A5),D0-D7‚SEGMENT�DESCRIPTIONS/‰MOVE.L‚A5,MMULOADˆSAVE�ADDRESS�OF�CURRENT�LOAD!‰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‰PAGE*;*ˆThis�routine�will�unload�a�segment�from�the�EXORMACS�MMU.D*ˆThe�segment�to�unload�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.‚The�TSTCTL�field�within�thisA*ˆsegment�entry�should�be�set�to�zero�before�calling�this�module.B*ˆThis�tells�the�EXORMACS�MMU�that�that�segment�is�no�longer�valid=*ˆ(if�TSTCTL�(bit_0)�=�0),�and�therefore�we�have�successfully'*ˆ"unloaded"�that�segment�from�the�MMU.*A*ˆThis�routine�is�called�from�two�directives,�SEGDEAL�and�TFRSEG.A*ˆBasically�it�just�calls�LOADMMU�to�mve�the�new�segment�map�into=*ˆthe�EXORMACS�MMU.‚However,�there�is�one�complication.‚Since?*ˆSEGDEAL�can�delete�a�segment�from�a�target�tasks�TST,�we�must@*ˆverify�that�the�requesting�task�is�also�the�target�task�before=*ˆcalling�LOADMMU.‚If�we�didn't�do�this�check�we�would�arriveëJô"?*ˆat�the�situation�where�we�return�to�the�requesting�task,�with6*ˆthe�MMU�containing�the�load�map�for�the�target�task.*2*ˆHere�is�the�algorithm�for�performing�this�check: -*�if�(tcb_tst�(client_task)�=�target_tst_ptr)&*�then�call�load_mmu�(target_tst_ptr); UNLDMMU::‰CMP.L…TCBTST(A6),A5‡Does�A5�point�to�the�requestor's�TST?‰IFˆ†THEN.S„Branch�if�no. '‰MOVEM.LƒD0-D7/A5,-(A7)†Save�registers.5‰BSR.S…LOADMMU�Load�the�new�segment�map�into�the�MMU.*‰MOVEM.Lƒ(A7)+,D0-D7/A5†Restore�registers. ‰ENDI ‰RTS›Return.‰PAGE*J*‚Dummy�entry�points--our�MMU�isn't�an�M68451,�but�other�exec�routines�areK*‚going�to�be�calling�us�at�these�entry�points�because�they�don't�know�what *‚we�have.*CRASN:DEASN: MMUFAULT: &ŠRTS—Just�return--he'll�never�know....   ‰END éééé=/*=/*†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=46=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDééééééüŠPAGE"VECTORSƒIDNTƒ1,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ŠENDé ééééé5VECTTBLƒIDNTƒ5,1�RMS68K�vector�table�for�the�EXORMACSO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***@***…ROUTINE:‚VECTTBL�--�RMS68K�VECTOR�TABLE�FOR�THE�EXORMACS‹******É***J***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family.***@***‡Copyright�1983�by�Motorola,�Inc.‚This�version�is�for�the‰******‡EXORMACS�microcomputer.«******É***E***…FUNCTION:‚This�table�gets�linked�with�RMS68K.‚When�the�system…***C***‡boots,�the�exec�initializer�finds�this�table�and�uses�it�to‡***:***‡take�over�vectors�in�the�processor's�vector�table.�******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------/*…10/21/83‚DICK�VANDERLIN�Revision�for�EXORMACS(*…10/�4/83‚Steve�FranckƒInitial�writing.*  *E*‚XREF's.‚Note�that�there�are�many�more�XREF's�created�by�invocations8*‚of�the�VECTOR�macro;�those�XREF's�are�not�listed�here.*.ŠXREFƒCOMINT�Common�interrupt�handler�routine.   **‚Included�files:*5*‰9995.&.STR.EQ�The�section�number�to�use�is�in�here.*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠLISTŠPAGE*E*‚The�VECTOR�macro�defines�entries�in�the�vector�table.‚The�format�is%*‰VECTOR‚,5*‚There�are�two�special�values�for�:,*‰0�=�COMINT�(the�common�interrupt�handler).(*‰1�=�don't�take�over�the�vector�at�all.E*‚Entries�in�the�vector�table�must�be�assigned�in�order--that�is,�theB*‚vector�#'s�in�the�VECTOR�invocations�must�be�in�ascending�order.59(H*‚In�the�case�where�two�contiguous�VECTOR�invocations�leave�a�gap�in�theK*‚vector�#'s,�those�vector�#'s�in�the�gap�will�be�assigned�the�same�handler9*‚as�that�of�the�lower�vector�#�of�the�pair.‚For�example,+*‰VECTOR�$23,0ŽPoints�$23�to�$27�to�COMINT  .-*‰VECTOR�$28,1ŽLeaves�$28�to�$2F�as�they�are.-*‰VECTOR�$30,ROUTINE1‡Points�$30�to�ROUTINE1.G*‚If�the�gap�to�be�filled�has�a�second�parameter�other�than�0�or�1,�theJ*‚address�assigned�to�the�vector�will�be�incremented�by�2�for�each�vector:7*‰VECTOR�$23,XŽPoints�$23�to�X,�$24�to�X+2,�$25�to�X+4.$*‰VECTOR�$26,0ŽPoints�$26�to�COMINT.'*‚The�end�of�the�list�is�signified�by�a*‰DC.Lƒ0F*‚and�the�second�parameter�of�the�last�prior�VECTOR�invocation�will�beK*‚applied�to�all�further�vectors,�up�to�$FF.‚Again,�if�the�second�parameterK*‚was�not�a�0�or�1,�the�address�assigned�to�the�vectors�will�be�incremented#*‚by�2�for�each�vector�in�sequence.* VECTOR„MACROŒIFLEƒ\1-VECT_NUM0ŽFAILƒ499ŒVector�#'s�must�be�in�ascending�order!ŽMEXITŒENDCŒIFNCƒ'\2','0'ŽIFNCƒ'\2','1'�XREFƒ\2ŽENDCŒENDCVECT_NUM„SET„\1ŒDC.Lƒ\1<<24+\2ŠENDM  * *‚First�set�up�the�table�header.*ŠSECTION�LEVEL00  0ŠDC.Lƒ'!VCT'�Dump�eyecatcher�for�'VeCtor�Table.'2ŠDC.LƒCOMINT�Put�the�address�of�COMINT�here�so�the"*§exec�initializer�can�find�it;�he#*§isn't�linked�with�the�exec,�so�he*§wouldn't�know�otherwise.ŠPAGE*)*‚Here�are�the�actual�vector�assignments.I*‚Notice�that�whether�or�not�the�illegal�instruction�vector�is�taken�overE*‚by�RMS68K�is�controlled�by�an�sysgen�parameter.‚During�RMSGEN,�this$*‚parameter�is�substituted�such�thatA*„0�=�the�exec�should�leave�the�illegal�instruction�vector�alone.?*„1�=�the�exec�should�take�over�the�illegal�instruction�vector.J*‚You�might�want�the�exec�to�leave�the�illegal�instruction�vector�alone�ifI*‚you�want�to�use�the�ROM�debugger,�since�it�uses�illegal�instructions�as*‚breakpoints.* 8VECT_NUM‚SET„1’Initialize�the�vector�number�to�1�so�that&*§the�lowest�vector�number�that�can�be*§set�afterwards�is�2.7*‰VECTOR�$00,CALLKILLŠSHOULD�NEVER�GET�HERE�this�was�in>*‰VECTOR�$01,CALLKILLŠSHOULD�NEVER�GET�HERE�4.2�exormacs�vectt*ŠVECTOR�$02,PROGINT2‡Bus�error.#ŠVECTOR�$03,PROGINT3‡Address�error.$*§If�we're�not�supposed�to�take�over/ŠIFEQƒ\ILLINSTRŠthe�illegal�instruction�vector,9ŠVECTOR�$04,1Žleave�the�illegal�instruction�vector�alone.ŠENDC–*!*§If�we�are�supposed�to�take�over/ŠIFNEƒ\ILLINSTRŠthe�illegal�instruction�vector,>ŠVECTOR�$04,PROGINT4‡take�over�the�illegal�instruction�vector.ŠENDC–*#ŠVECTOR�$05,PROGINT5‡Division�by�0.+*‚in�sequence„$06,PROGINT6ŠCHK�instruction.-*‚in�sequence„$07,PROGINT7ŠTRAPV�instruction./*‚in�sequence„$08,PROGINT8ŠPrivilege�violation.'ŠVECTOR�$09,PROGINT9‡Instruction�trace.8ŠVECTOR�$0A,PROGINTA‡Reserved�instruction�opcodes�$AXXX.>*‚in�sequence„$0B,PROGINTBŠReserved�instruction�opcodes�$FXXX.'ŠVECTOR�$0C,0Ž($0C�-�$0E�go�to�COMINT.)+ŠVECTOR�$0F,KILLER‰Uninitialized�Interrupt.'ŠVECTOR�$10,0Ž($10�-�$17�go�to�COMINT.)'ŠVECTOR�$18,SPURINTˆSpurious�interrupt.'ŠVECTOR�$19,0Ž($19�-�$1C�go�to�COMINT.)'ŠVECTOR�$1D,0Ž($1D�-�$1F�go�to�COMINT.)ŠVECTOR�$20,TRAP0ŠTRAP�#0.ŠVECTOR�$21,TRAP1ŠTRAP�#1.#ŠVECTOR�$22,TRPVCT2ˆTRAP�#2�to�#15.'ŠVECTOR�$30,0Ž($30�-�$8B�go�to�COMINT.))ŠVECTOR�$8C,TIMEINTˆM6840�time�interrupt.!ŠVECTOR�$8D,0Ž($8D�go�to�comint.)8ŠVECTOR�$8E,1ŽSoftware�abort�vector(leave�it�pointing�to*¦BUG) ŠVECTOR�$8F,0'ŠVECTOR�$95,0Ž($95�-�$FF�go�to�COMINT.)!ŠDC.Lƒ0’(End�of�table�indicator.)ŠENDé41LOADMMU ASREL'EXORMACSLOADMMU SA!B)(…LOAD MMUŒ2BLOADMMU BLOADMMUI BMMUFAULT :pMMULOAD BUNLDMMU (BCRASN :BDEASN :pTRACER pTRACFLAG pMMUHERE "*g4gRjÇ fX g­,fí-`­ ,g` B­X­,AÕa Bf|$©#JF×`$* |a ¢F×FßNuHçAp@ç|a Ì$8 >&68 @FßHC(HD4<  g 4<8***HB g2Hçz,* m6aX`NqLß8`Lßp&*HC6‚€4*AÕa&NqLß‚R�`ÿX?5|$* *g |a þ` |$©#J"*0<@ÂÄjFÂ&jNÓ8 4ga‚î`*_a ¶ _N`Lßÿ\�|Jx fNsj?_f aþJ8 fNs?_'fö/,x Hî?ÿL× NiHî8`ö@ç8 4gaî HçÿþNi/ /9 d oF,hHV/(@À@ÿ?"h 0P*n6` & fÿr\�,_( „!TCBga ÎJ@gÿJ @f AÖa?>`ÿ: @fÿ2J�f&HC4<HBAÖaæNq`ÿHBHA(&64< ‚HB4`àâˆ&T�(,_" �!TCBga jCð=C^AÖa>ÞJ®@gþÖ$< ÿÿHCHD6`¤-@L× NiHî8AÖa þ.x |øÿMø |"N ) gì,@.,fð#n ®-!Î /.D/.@Qø 1ø H FpàÀ.-fh|øÿ*n6a  n<€™AÖa®Ü‡(F9n@ÿú)nBÿü-'fLîÿHìÿÿ¾Lî0Hìÿî -/@-@B`ÿ*n6a n, ,"0<2 gB@2g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòa`J²gHç@(AÕa ø`Lß raì,sf`žLß,sò Rrì ,NuÇ1G*è)!|EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†1F,|ð& faôNu1F,X�`5|a aaaaaaaaaa a aaaaNq?/_'g/ g*8 ]…š�Nh,œ… n6aŒ`Nq`"(F CN`&8 UC _8ß¿Ãfú/?,ÿú/<<`B† m n _-_¸-_¼/.)g".èg a nbJf\ nCø ˜ 1pfÊaü8`rJFf:AÖaý6 HzýŽ�Ÿ`ú P�` €†`ú ~$.èffffNLî?ÿ,_` z,.ð n6a°`Nq`&~ F&(.ô·„f È®ìg-Cô`"R‡È®ìgg°Rnø .ø°nøb ~aN`˜.�/,x ½üg0/ f(.)g .è8gîè,_"¯Pø Ns,_"/8 6Nua¸$< 4.&.(.8áL<AîàaØ`®)Lîÿt®-@&Nuî ,X�`ùJ .`p|Jx f Lî?þ,_Nsjùaö J8 gè`ùB®L× NiHî8`ùp`Np`Jp`Fp`Bp`>p`:p`6p`2p `.p `*p `&p `"p `p`p`p`=@=|ç�G` H@0<.H@ x QˆYˆ.H|`ÿV@çHç0x "x ,JAkj fah|&)fFïT¯`Ø`J$C#RFïBª€%@ %H%BBjgêáIAøÿ5A$|aœFï`Œa`†Hç8Eé&J|$S ªf"´ªf&’(R(,Ù¸ NÙ¸ J¸ JFï0`:&J&g2$C ªf ´ªf&’(R¸üg(*Ù¬Fï0` `&J&`Ì`$©#JLßNuLß FßNu&i"’¸ Nl! NÓ¸ J¸ JD�'A$‹#J`&(S’¬m &L(S’¬`ô%lÓªD�)A$“&ŠNu/)µßfa`a&Nu#R$©#J$i *Ѹ NѸ J¸ JNu&’$©#J *$SѪNu#R&i +Ѹ NѸ J¸ JNuHøÿÿ@ø!×Ni!ÉH!øL"x :3|•3|µ3| 3|°|`Þ@ç|Líÿ !Í d*x HÕÿ8 4ga  ÝNs»î6f HçÿaÌLß ÿNuNu|ð%ax`öNHøÿÿ1×!ï|LøÿÿNs@ç|JÐkü0ãHâ@S@  0€kFßNua:U.ra�FßAÖa`öî ,B® (f!NNu*@ - fø+N NuHç .&|ð&î-HîÿtNl-L< 8 Kï �� €Pn@rIî™ÀäHd8Ý`(ÝQÈÿüLß0Nuaþ¶@ç|JÐkü0ãHâ@R@o0€FßNu/ "h!i €0€B© © ,"_FßNu/ x BB�@ç| 0àIDAÒx XäIÒ¸ J’¸ N’¸ RFß� _NupðÀ($@&`h$&@ç|è-f6Hç@ Eø (&"* g ʰ*&còÊ!A %H $x °*&cPø LßFßNuJ¸ vf|Hçÿþ!Ï vFï<.x v|9÷0 À÷0.x vLßÿÿB¸ vNsRx ^ xd ^k$/ "x :3|3|53|.3|>"_Bx ^NsHçÀÀ x :| x B(( B�28 V“¸ Nn"x ,AéCú1º& |ù¢ù¢@ @@ (@ (@ ²@ :Èù¢ù¢ù¢ù¢@'^! DÀxù¢ù¢ù¢@ ‚)f2ŒÀ @Úù¢À!èÀèÀ !ÌÀ %¢À "ÜÀ #hù¢ù¢@–@(Ì@"¼à8 4gašÿ.)g".èg~a÷Àå@kN @,bDGúþž$3g2*HE…ÿ, n6a¬`Nq`ø(FgAÔaò``ø*HNó `÷ü$x ($ gôä@D@°jnêS@Àü EòJªgÚ4*‚f"²®fÈ-W8BnH?Hz @ç$jNÒ0.Hf÷ü0g÷h @fAÖaûš`÷€"( Pa^` T—Nu �!TCBfô*H(m@ gê ᘀÿgÞ@ç|2,$0{Nû€0000>>>>00008Š8Ê8ª8ö8T8ZFßT¯NuFßaùJaf``ê¬%FßaNu l` l 9A$Fßaà"HA faúAÕaúÈNua``ž9A$Fßa€aÐNuaú``ÿ~9A$Fßa^a°Nu9A$Fß l aV"HA faŒa„Nu9A$Fß l a*"HA fa`aXNug"2HA)A`6‚g "2HA)A`)l`‚gY@‚4&(*,. "JåHNûú`|NqNqNq ‚`~NqNq ‚/`hNqHÐ `lNqHÐ /`VHÐ`\NqHÐ/`FHÐ<`LNqHÐKøIøB§$I"x fFJQk$¶1@f&i OJ�g·Øg`öHSAëa÷ºa”Cé QÿÿfÎB„J—g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu g@î-|ð&Aí-H”@ç|0ãHâ@S@lü0€a÷p�FßAÖaø^a‚`íZR„R„`œ g*$@ g**º‚m´¬nº¬m` º¬o(J*K fÖNu•¬Õ¬ *,á�GôXf*, $T ,g"@Û© "Šg%INu*ŠgúBªNua÷ nw&Nu"_ g @Aèa÷H`ðNÑ g®JQk iµèlž`µél”µém˜fÿ@JQk’*iHUAíaöT gþâáŠ&J×ÂàŠ(@°ŠnþÒ ,áˆÐŒ°Šn fè`þ¾°‹gþzn gþ®�Šàˆ$`þf&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þHç $nLß0T—Nu$H"x ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé QÿÿfÐ`ÀCøAíaõv&g C±Ál"H&fô g )áˆÐ‰µÀm¬%B f -��àˆ%@ $ƒ%If*Š`$"Š �‰àˆ�©#@ f *Ñ©#j "’$IJƒg$"C#JJª f )Ѫ%i $‘g"R#J- ð"x ²f(i,g Aìaõn`îCé QÿÿfÜAíaõZLß0NuT—`îHçÀ@ç&x 0|*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o Uïÿb+o aõ8+A2<ù’àHF@@ÀüúÒ@;ALß8NuBƒB€"x gbEé0)gP—ËJj f ·üf$&J` ±êf´’gB* g f4 f& ÕüS@fÄJƒf"0) K·üf J°i m‘ÈR€T—Nu JNu CNuB€*g B…:(0P$f `¾°P g Q… E læ*T—NuB‚BƒB�"x $( gd4)´i gRB(pJq fJƒf:& „g04)`*±üg±ñf$lµñf$lµñg"Jq k"€SDf²T—JƒfB€B‚Nu Nu qNu gJ�g` N".Nu gô"(g.(f".°®f²®gÖ x ±üg°¨f²¨g* h`æJf @Hz?)gB,,Jm g.¼•f*­ Jm f0-@ fB�2- m aù&`aîFÛüSGfÂNu>, fz,, n6aüx`Nq`ì$F,g z,, m6aüX` ` JEgJ0Ðf`ëÔ., m6aúÖ``ìB€00P, f:ÐpPáˆ%@B€$°P 5pP$ª00Páˆ%@B€00Páˆÿ%@ `ë(áˆ-@ `ë»Îg-,f `ën`ëV`ëV., m6aú\`îJ…gæ0, 2,A'ÿg� f  gÁÁÁ� B‡,,g�  gB† ff-)f ¸ fÁ.8 xΆެÞ¸ xθ |à�"Ff�fAø rfRˆ-(fTˆHG>G‡ÿ?HG Gaõ&`(T�S€g`ê„`ê„2f"AÓa÷f`aì†`êv&H.*á�g, "F m6aú¾`Ê`ÈJ0PfÂ!¬ P 0, @Oÿ gÀ1€P$1¼Pg1¼P àˆ1€PЇS€1€P �‰àˆ1€P�P&ðP$R(-K gá�-G$½Íf *n6aì(*NT�`ét., 8,(M¹Îg ,,f `éºNh)H<*l6AÕaø¬``é˜J¬@g ,<àˆ°uPe °uPb`é„a`é"05P$@0g@$,25P$ uP a÷ì`aër<(SFÜuP;†PSh B†<(  g†1F JFf.05P$@ f$B€05PÐuPáˆB�25P’uPR� @aõú`aëBuPaëvBµP BµP$BµPBuPS-Nu*Na*n6aë,`è|»ÎgèÒa`èp$-2, l a÷D``è®`è¢`è¶`èž&H$m6.+AÒa÷ `êJ…gÞB…:+á�, gº¬d`è–*,…ÿB$,,B, g,+ AÒaø¾` `žJ…faê\J0Pf�%«P B2P' àŽ5†PàŠÜBSF5†PD€Ð« àˆ5€P5¼P+g5¼P5«P$òP$R*Rk -k  NuB‚,"x hJ1 oçìBƒ,g Co`çÆá‹à Hz@çåŠ B/?8 5gaõ¸îNs8 5gaõ¨Ý`ç4&M*n6., AÕaö†``çrJ®@gNh àˆ°uPe°uPcç`·ÎgçB"E$L.* k6aöP`J…f`ç0`ç0* ,**fB†<5P* gÜuPáŽB€05P�uP$R@*á�a÷n` `J…faé `æüJ0Pfö"( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gÃÃ1ƒP$1¼Pg1¼PBu@ÉEaèüËDBµ@ Bµ@$Bµ@Bu@S-R(20PÒpPá‰-A  g$$.´«g pP "(KaôÈ`aèN&L$+ ‚`åÒ,,`&"-6g*,,, Aaö‚`` J…gJ0Pf`æ..)g , g @ �!TCBg` Aì aõ¤``åÐ N.(f ((g`åÂ"(6g*,,, Aaö`` J…gJ0Pf`å¬Hzÿ”?,--gGÿg­-g- ,gSs­-f­ ,Ss3g³ gAóaègl A g+l  g+l  g- ,fAÕaè\`ä  g í,`ä gØí ,`äJ­@fäHB‚,gfäXB‡, g*,, m6aô�`Nq`ä*fä.B†&, $‚0¶‚l&ƒÿà‹HC8 pHC Caîz``ãâ ¼!ASQ!l!F Gè,!K!K!K 1G(áŠÔˆX‡”‡!BBƒ,481B&;01B$Bh*+H@`ã2 $L(m@ gb.)g@"j B€ cPr fY fP@R@€°l(b0@ç|4,$6{ (Nû°$z,* n6aó�`Nq`ã*"F`ª`ã`ã.0000<<<<00006‚6¨6Æ6ê6\6bFß`âðFßaäêaÈa`Fß`ⶬ%FßaÖ`âZ l` l B9B$FßaàAÕaæp`â4a‚a¼``¸9B$Fßa€ar`â9B$Fß l a†aT`áða>az``ÿv9B$Fßa`aã^Nu*N(n@ g@ç|4,$4{ Nû `á<6ª6<rª˜6666666600000000FßaãFß`àðB9B$Fß.)fB…:,(, n6añ0`Nq`àÊ Faj`àZ.)fB…:,(, n6añ`NqFß`Ô F)HB(9B$Fß`àJB9B$Fß l a`à )l"lJ)j)i"lB€�gX‰Y@ÀÁU@äHd0Ù` ÙQÈÿü@ç|³ìe"l)ISl*fì%Fß faNu$hÿì-)f!jÿì(ÿêf`B�(ÿÿgX,(ÿúfD0,(@gD�Al |ÿþÒ@Aÿÿ*)g"FäId0Ù` ÙQÉÿüNu/* j6aïø`Nq _1|ÿþ`ä1|ÿþ`Ü _`È*N(n@ g@ç|4,$4{ Nû `ß@<fˆ�<fˆ�6666666600000000Fßaá2Fß`ßFß.)fB…:,(, n6aïh``ß Faþ¤`Þ’Fß.)fz, n6aïB``Ø FBP`ÞpFß l `ÎFß l `êa`ÞZ*N(n@ gÞ– @g ,'fÞŒg ,'gÞŒ@ç|.-g€ãH,%gÀ;T€f9@$FßNu€f&9@$Fß)l"lJ)j)ia0X�`Ýò9@$Fß l aý´aX�`ÝÚ  €ˆÄÌ­ ,@ç| -XgaäFß»ø fPø AÕaá²í-Nu/ l ",’ˆg j*Ј°¬d)@ �ˆRl*"Nu)l `îJl*gÜT¯`è²€köѬ `Ú~HG`B‡*LB® B†- g"m nJ‡g-g`Ýr`Ýj`ÝBB‡(N Uaìv`J€fR`Ý*  -@ J‡gJ gØ&¼10f6Jq0 l 10`ê‡0J10k‡0`JgAñ0aàTSGfô`î)-@ &#®0#®0#ˆ0JAf@3¼0 †0‡03‡0B±03B Ff3¼0`´ Fg®J‡fªB±03¼0 `ÿBÃC¼10f”J‡g †gF †fJ±0gh#ƒ3¼ÿÿ †B13BRq0 J‡fÿ8 Ff\J±0fVAñ0aÞì`ÛÖJ±0fþÚ-C #®0Rq0 ‡0`Añ0aßnJ10kò‡0`-C #®0Rq0 J‡g`þÚ`Ûð`Ûˆ`Û„a`Û¦$ ‚&\c$<&\"x ,Eé&J@ç| g$@½êf ªfaÝN`&J `àF×|.-f* )g($@#RF×%NBj%|!DLY-JX|aܾFßNuFß`ÛFaÿz .@g(@,'f0|,%gTHaü|@ç|®-g .Xg*NaFß`Ú¶î,Fß`ÚÒHç@p$@"x ,GéµÓg&S`øaÜšLßB­X­,Nu$M*)gÚÔa `Ún$Lª ,$< 4*&*(*8<AêàaâòNq(Jª)ª@Bªèª ,gAÒaÞdNu"� Cø ˜ 1fÂüCø ¨$1´®g`ÚLf"Jñkú±1fBq±`ÙÐñ± gAñaÝv`Ù¶*L(N Uaé:``Ùúa`Ù (Na$`Ù–&"Jq l&1 1fJ1gAñ0aÝ.Jq jB±Bq B10 Sq0 `àB10 10gzSq0 f$ 10fÀ10°10g´3¼0 B±0`ª.10,10B„4)pJq l.¾±f(¼±f"JDg#„`(3±0 3±0#±0Bq0 €SBfÂ`TJ10j*q0^mHxAAñ0aÜr`â.10,104)pJq j¾±f¼±fBq B±€SBfÜBq0 B±0Nu,)g Aøaçö`NuaþÌ`î$‚Eø ˜ 2 f"ÂüCø ¨½ñfa`Ø4`Ø„&x + ,g,´+sf&«-« ,'|çJBB+AæJAÓaÜ6&k fÄB2 B±B±Bq1g AñaÛŒ`îNuEø ˜Cø ¨t 2 f "Âü¹ñg R‚ ‚mâNuaÿp`Ú-è+lè8-è�-è`×€$M l", aç‚``×À*H*)f×°»Êg.½Êg*,g".(f*(f m±êg -(f`׆$< 4*&*(*8<AÕaßÈ``×Tí)ê)ê ,%mà%mä½Êg× `Öà-)g( -à°®f -ä°®f,+ n6aç~NuNq`×`× aÚ  8 > �&\e�&\R€HÔ`ÖŒ&L- ,gÖàzJaÿœ(FCí0<"ÜQÈÿü+mt+m ”+\B0-è+\è-èø�-è@A--gÖ4+lÿîô;lÿúø+lÿöú`ÖAÖaÚD`Ö<­ ,gÖjAÕaÚB`Ö&L- ,gÖTzaÿ(F--f­@`­ø+lð+lô+l ì+løBmø-è8�-èJgF--fí@`íø.-èg&z,-ð m6aæ>`Nq`Õä†(Ff+Tô­ ,0-,@ÿfAÕaÙ‚`ÕF@ç$, 6,|B„g (,nFß`ÕžB… g *,fÆaÙCÀg*B†6, gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x ,Eé|&J$S gλêfð*fèJ†kºªfÞ&’ R±éf (Ѹ NѸ J¸ J` *ѨF×J†f2%M„%D %lBj%EÃ5C”�|aÖ F×`‚RFCf* g0êªêB‚Hç~|aÕÖFïLß~J†kÿF`@|$©#JF×J†kÿ0`*J†f| )g $@#RF×`ÿ`Fß`Ô"SFnFß`Ô Fß`ÓÆ&Lz`aüà(FCí0<(ÙQÈÿü(íB8í@ -è€ÿÿÿ(À(í,0-è@ø8À(íð(íô(íì(íø--gÓr)môÿØ9møÿä)múÿà`Ó\*N"(n@ g<,'f8Nj~,'f‡<.)f&*, n6aãè`Nq><€™AÖaÏ`ÓX`Ó`&F`&J ‡oLÛ}Hî}LÛ|Hî| .‰0@ÿ/gÀ?@/[ÔÇNb@ç|4,$4{ Nû <d”d<|”|0606060600000000FßaÔòFß`ÒvFßgÒl)l"lJ)j)iaô¸`Ò€g B9B$Fß`Ò6g B9B$Fß`ÒFßgÒ l aò aôn`Ò6>,.(f‡J”gz, n6aâ°`Nq`ÒJJ®@gÒ",‚Eø ˜J2 fÒ¼ Eø ¨Äü%Ž %® 5¼ B² %” Br 5‡ 2` ò `ц.(f -(fÑÐ,°-%cB® m%#`Ѽ@$@&`ÑPBG`><&,"x $0àH°i lF(¸±0f>Jq0 g8 10f ¾10g.‡0Jq0 j&10JGg Añ0aÔ`ÐüAñ0aÔ°`Ðð`Ñ@`ÑD,*H"x 0 g i‘É*$ n6aá�`Nq`Ñ*$F&äŠS‚$ÙQÊÿü$F(M"x 0&Q—ÉÙË$ÌÛÃ$Í`М.(f`Ðì@ç2<€tÿaÑ2NqLÜ.<&\¾„b˜‡Rƒ`ö|!à >&8 J–¸ N–¸ R–„׸ R¸ RaFß`ÐF"8 R’¸ JÒ¸ N�&\�"AB�tÿAúaÐÐ`aÒŒNu@ç|R¸ >¸&\ RaÀFßNs . €Kª{ûfÐ0Jnpg x :(fÐ x Uˆ, z n6aà”`Nq`Ð*FLîÿN•,x *n6aÒ\`Ϭî ,`ÏÊJ”f@",g.(f".*y »üg(²­f-(f ½Ígí-g:*m`ØAÔaßz`B® `Ï’*H½Íg-(g .(f`Ï�í-fÏz0,gÀí);@*;m,.-m +n°+n´­ ,­-­ ,g2 m”@ç|JÐküCèÿâJ© g»é g"i `î#m RP�Fßm-ÿ,|ð&­ ,gí-@ç|­-g <  @ ( g °�fô!m AÕaÒ°Fß`Îlî)=H*fî*.(g. (gL× NiHî8aЪ.-g`$.)fÎ=H*=n,.î--n°-n´(N"x ,Eé&J@ç| g$@¹êfaÏô`&J `êFß,)gaàb ,Tg @B¨!x <!È <&,(,ì)"x )-f2¸©f¬),)g) ,g¶©àf¸©äf ><@AÑaÉn"i f¾,)gaòòNqaõŽ,)gaôÖ~Cø ˜Eø ¨"Âü 1pf2g/aÇø., ,gaÐR‡ ‡oÄaëæaà²J¬gH4<HB4,&,8,HD8,°*,²<,¶HF <<.,*>,,)g<<$LAìaÕfNq(JCø )g¹Àg"@`ò#laÏ‚B¸ rAÔaÙÚ`L× NiHî8aÎî`̦-mp =m("--gÌd`ÌÀIëÿþ6<€a&NuT—Nu&LLìpHF>,6.(Ba ``ÌÂ`Ì0AÓaÜL``pT—NuB€8 qH@0< @aÖø`pT—Nu*H4<B˜QÊÿü+S +fgJ€f `<.p .;Fp+@aÚ€fDÿ;D(+El+EB;|„FHD0àHgfJg¸.%c.%D%°c@$@&*¼!TCB|€,;|:;|0$MÕü`+J6$¼!TST|5|$5|D x  -"-±üg"°¨f²¨g h`ærAÕaØ^NqpT—NuaÍî`pT—Nu+x !Í Nufg2 .".` ", , g.(g J�g` .".+@+ANu.(gË*<,, n6aÛ^`Nq`Êø,gÊú&Fp&ÝQÈÿü`Êx@ç, gzR` ,gz,. n6aÛ`NqFß`ÊŠJ”f6".*y »üg,²­f-(f-,g-.fB*m`ÔAÔaÚ,` B® Fß`ÊB*H½Íg-(g.(fFß`Ê>-,f Fß`Ê$-m -.fX>,aþÌ+mlB<-(F€g@z,-B m6aÚf`NqFß`Éþ+FB:(0P$g00PÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­,0-,@ßfF×AÕaÍfFß`É(@çJ”f8".*x »üg0²­f-(f½Íg--fí,gJ*m`ÐAÔaÙ` B® Fß`É*H--fì½Íg-(g.(fFß`Éí,gFß`Èö;m,.-m |­-gCø  I"h ³üg ³Ífî!i Fß`Èl|®-fî,|øÿ`Èz|øÿAÖaÌ€0.^gÈ@Bn^`ÈÆ-n Hî)`È(-n Lî)`È Ma`È@ç|¨,f è-FßNu (Xg"Hçp$@"x ,GéµÓg&S`øaÉâB¨XLßFß0(^g1|1@|ABh^aËèNu*N(n@ g(,'f$@ç|.-f 4,$4{ Nû Fß`Ç|`ÇÀ`ÇÈN6z6N6z60606060600000000FßaÉ®î , 9B$Fß`ÇN9B$Fß)l"lJ)j)iaé^`Ç"9B$Fß l aæÜaé@`Ç..)f,fz n6a׆`Nq`Æø F$H"*f`ÇAø ŒAø ŒaɰGø "SJ“g²©gØGé`ì f¾.)f, n6B…*ç�Ea×&`Nq` B€* e c @dpËa„r Âj A fp ar"x hJ1gj´*fª *ÿg Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*²sPdpÏa ²sPd pÏa``\Q…lâp Àjf" * @fRˆHyQT? *(SJ“fp a¦Gì°¬fì*,Ig°,(gp a† ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aÏö` LßpaÿJLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLê?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@D&j ×Ó#K )ÿf#|W*géI*géH`R*fbB€*&x hJ3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #K)I`#K&iD3|N¹J#|W¸LIéJ&ŒB€* x h¼ÿ iÑè*I/N�,_`‚`jp aøp aôpað gFo opÁaÜ n6B€S&@B… f )e: )c )€e* )�b".)f;°g,aÔ ` Nq`š×ËGû°ÖÓNÓÿþ Ê Øî *aºf² © ©HfV")D(A&TGëÿ¶ `&lJ¬faÅn°‹g(K`ê¹Áf$J«g&(k9|N¹J)|W¸LIìJ&kD&Œ` )k`B�)(&iDHzºš&Ÿ&x hB3Iø  &TJ”faŰ‹gIë`ì(«Aø ŒaÆD IraÏÊ`@aÄèp�az&Iaø"Kfpal)Hgp‚a`)IgpƒaT)Ig .(gþ€)Igp a6 )c )c )€e )�c*g< * d pÆa¢`žj :#j `Á )AîDJ�g"P°©gAé `îF€NuX�B�Aø ŒaÄ `ÀÔAø ŒaÃú`À:,m4B€-9f NpN@`F|q|ptAíp!­< g ­€pX‚€ ­8 T‚´-:cm:pLí<pažNuHç`CípB€ m"-+g|00J)fFÄ)fCéS`â0))gJ0`(©0-&ЈfS€�ˆ$J0U@løB0 UBlø@À@FÀ-Hg Hç:aÿ Lß\øLß|NuLß|ÿþNuHç m4pN@`Lßx`LßxNu8 4g @ça͆îFßHç€Ä*oKíÿ°"m/ N‘*_e -g*@`êLß#X�|Jx fNs`¶ê8 5gaÍ>îHç€Ä 8 g*@ m ( g / @çN°Fß*_ -`àLß#|Jx fNs`¶   DMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�1    Command Line: 5LINK ,EXORMACS.RMS.LO,EXORMACS.RMS.LL;H,M,I,X,-U,Z=40  8Options�in�Effect:‚A,-B,-D,H,I,-L,M,O,P,-Q,-R,-S,-U,-W,X  User Commands: SEG�RMS0:0�$0,$BFFSEG�RMS2:2,3,4,5,6,7,15‚$C00INPUT EXORMACS.VECTORS.ROIN‹&.SYSPAR.ROIN†M68XXX.RMS.ROIN„EXORMACS.VECTTBL.ROIN†M68XXX.AKRQST.ROIN†M68XXX.ASQALOC.ROIN†M68XXX.ASQEVENT.ROIN†M68XXX.ASQFREE.ROIN†M68XXX.ASQGET.ROIN†M68XXX.ASQREAD.ROIN†M68XXX.ASQSTATS.ROIN†M68XXX.ASRINT.ROIN†M68XXX.ATSEM.ROIN†M68XXX.BKG.ROIN…NOCACHE.CACHE.ROIN†M68XXX.CDIR.ROIN†M68XXX.CISR.ROIN†M68XXX.CKDELAY.ROIN†M68XXX.CKEXPAT.ROIN†M68XXX.CMR.ROIN†M68000.COMINT.ROIN†M68XXX.DCLSHAR.ROIN†M68XXX.DELAY.ROIN†M68XXX.DEMON.ROIN†M68XXX.DERQST.ROIN†M68XXX.DESEM.ROIN†M68000.DISPATCH.ROIN†M68XXX.DSEGX.ROIN†M68XXX.DSEMX.ROIN†M68XXX.DSERVE.ROIN†M68XXX.DSRVX.ROIN†M68XXX.EQDQ.ROIN†M68XXX.EXABRT.ROEÈ3Í/Ñ)ÕÙÝáåéíñõùý   !%)-159=IN†M68000.EXCEPT.ROIN†M68000.EXIT.ROIN†M68XXX.EXMMSK.ROIN†M68XXX.EXMON.ROIN†M68XXX.EXMONVR.ROIN†M68XXX.EXQEVENT.ROIN†M68XXX.EXRQPA.ROIN†M68XXX.FNDGSEG.ROIN†M68XXX.FNDTSEG.RO  DMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�2  IN†M68XXX.FNDUSEM.ROIN†M68XXX.GETTCB.ROIN†M68XXX.GTDTIM.ROIN†M68XXX.GTTASKID.ROIN†M68XXX.GTTNAME.ROIN†M68XXX.KILLER.ROIN„EXORMACS.XLOADMMU.ROIN†M68XXX.LOGPHY.ROIN†M68XXX.PAGEALOC.ROIN†M68XXX.PAGEFREE.ROIN†M68XXX.PAUSE.ROIN†M68XXX.POWRFAIL.ROIN†M68XXX.PSTATE.ROIN†M68000.PVSEM.ROIN†M68XXX.RCVSA.ROIN‡M6840.RDTIMER.ROIN†M68XXX.READY.ROIN†M68XXX.RELINQ.ROIN†M68XXX.RESUME.ROIN†M68XXX.REXMON.ROIN†M68XXX.RQSTPA.ROIN†M68XXX.RSTATE.ROIN†M68XXX.RTEVENT.ROIN†M68XXX.SEGALOC.ROIN†M68XXX.SEGDEAL.ROIN†M68XXX.SEGSHAR.ROIN†M68XXX.SELFTEST.ROIN†M68XXX.SERVE.ROIN†M68XXX.SETPRI.ROIN†M68XXX.SGSEM.ROIN†M68000.SINT.ROIN†M68XXX.SNAPTRAC.ROIN†M68XXX.SPURINT.ROIN†M68XXX.STDTIM.ROIN†M68000.SUPER.ROIN†M68XXX.SUSPEND.ROIN†M68XXX.TERM.ROIN†M68XXX.TFRSEG.ROIN‡M6840.TIMEINT.ROIN†M68XXX.TRACER.ROIN†M68000.TRAP0.ROIN†M68000.TRAP1.ROIN†M68XXX.TSKATTR.ROIN†M68XXX.TSKBORN.ROIN†M68XXX.TSKINFO.ROIN†M68XXX.TSKMOVE.ROIN†M68XXX.TSKSTART.ROIN†M68XXX.TSKWAIT.ROIN†M68XXX.USERVECT.ROIN†M68XXX.WAKEUP.ROIN†M68XXX.WTEVENT.ROINPUTƒM68XXX.RMSPATCH.ROEND  DMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�3    !Object Module Header Information: 4Module…Ver�Rev�Language�Date…Time…Creation�File�Name DVECTORS†1ƒ0�Assembly�02/28/85�21:43:01�SREL:9999.EXORMACS.VECTORS.SA‹INTERRUPT�VECTORS ;SYSPAR‡5ƒ1�Assembly�03/01/85�00:25:30�SREL:9999..XSYSPAR.AG/‹System�parameters�at�$900;�Crash�save�at�$400. :RMSŠ5ƒ1�Assembly�02/28/85�23:10:17�SREL:9999.M68XXX.RMS.SA‹68xxx�RMS�INITIAL�ENTRY�POINT EVECTTBL†5ƒ1�Assembly�03/01/85�00:26:02�SREL:9999.EXORMACS.XVECTTBL.AG%‹RMS68K�vector�table�for�the�EXORMACS @AKRQST‡5ƒ1�Assembly�02/28/85�22:16:40�SREL:9999.M68XXX.AKRQST.SA-‹68xxx�DIRECTIVE--ACKNOWLEDGE�SERVICE�REQUEST BASQALOC†6ƒ0�Assembly�02/28/85�22:17:58�SREL:9999.M68XXX.ASQALOC.SA'‹68xxx�DIRECTIVE--ALLOCATE�ASQ“07/13/84 DASQEVENT…6ƒ0�Assembly�02/28/85�22:19:25�SREL:9999.M68XXX.ASQEVENT.SA&‹68xxx�DIRECTIVE--QUEUE�EVENT’07/13/84 BASQFREE†5ƒ2�Assembly�02/28/85�22:21:41�SREL:9999.M68XXX.ASQFREE.SA ‹68xxx�DIRECTIVE--DEALLOCATE�ASQ AGTEVENT†6ƒ0�Assembly�02/28/85�22:22:36�SREL:9999.M68XXX.ASQGET.SA$‹68xxx�DIRECTIVE--GET�EVENT�07/13/84 BASQREAD†6ƒ0�Assembly�02/28/85�22:24:23�SREL:9999.M68XXX.ASQREAD.SA%‹68xxx�DIRECTIVE--READ�EVENT�07/13/84 DASQSTATS…5ƒ1�Assembly�02/28/85�22:25:53�SREL:999 9.M68XXX.ASQSTATS.SA ‹68xxx�DIRECTIVE--SET�ASQ�STATUS @ASRINT‡6ƒ0�Assembly�02/28/85�22:27:18�SREL:9999.M68XXX.ASRINT.SA/‹68xxx�TRAP�0--PROVIDE�EVENT�INTERRUPTŽ07/13/84 >ATSEMˆ5ƒ1�Assembly�02/28/85�22:28:04�SREL:9999.M68XXX.ATSEM.SA1‹68xxx�DIRECTIVES--CREATE�AND�ATTACH�TO�SEMAPHORE :BKGŠ5ƒ1�Assembly�02/28/85�22:29:44�SREL:9999.M68XXX.BKG.SA,‹M68xxx�--�Background�and�guarded�processing ?CACHEˆ5ƒ1�Assembly�02/28/85�23:42:57�SREL:9999.NOCACHE.CACHE.SA&‹Cache�code�for�systems�with�no�cache. DELAYˆ5ƒ1�Assembly�02/28/85�22:39:45�SREL:9999.M68XXX.DELAY.SA‹68xxx�DIRECTIVE--DELAY >DEMONˆ5ƒ1�Assembly�02/28/85�22:41:01�SREL:9999.M68XXX.DEMON.SA*‹68xxx�DIRECTIVE--DETACH�EXCEPTION�MONITOR @DERQST‡5ƒ1�Assembly�02/28/85�22:41:58�SREL:9999.M68XXX.DERQST.SA0‹68xxx�DIRECTIVE--SET�USER/SERVER�REQUEST�STATUS >DESEMˆ5ƒ1�Assembly�02/28/85�22:42:59�SREL:9999.M68XXX.DESEM.SA'‹68xxx�DIRECTIVE--DETACH�FROM�SEMAPHORE DDISPATCH…5ƒ1�Assembly�02/28/85�21:46:56�SREL:9999.M68XXX.DISPATCH.SA‹68000�DISPATCHER >DSEGXˆ5ƒ1�Assembly�02/28/85�22:44:13�SREL:9999.M68XXX.DSEGX.SA&‹68xxx�TRAP�0--DEALLOCATE�ALL�SEGMENTS >DSEMXˆ5ƒ1�Assembly�02/28/85�22:44:56�SREL:9999.M68XXX.DSEMX.SA)‹68xxx�TRAP�0--DETACH�FROM�ALL�SEMAPHORES @DSERVE‡5ƒ1�Assembly�02/28/85�22:45:31�SREL:9999.M68XXX.DSERVE.SA,‹68xxx�DIRECTIVE--DEALLOCATE�SERVER�FUNCTION >DSRVXˆ5ƒ1�Assembly�02/28/85�22:46:31�SREL:9999.M68XXX.DSRVX.SA)‹68xxx�TRAP�0--DEALLOCATE�SERVER�FUNCTION EXMONˆ5ƒ1�Assembly�02/28/85�22:49:29�SREL:9999.M68XXX.EXMON.SA-‹68xxx�DIRECTIVE--ATTACH�TO�EXCEPTION�MONITOR BEXMONVR†5ƒ1�Assembly�02/28/85�22:50:49�SREL:9999.M68XXX.EXMONVR.SA)‹68xxx�SUBROUTINE--VALIDATE�EXMON�REQUEST DEXQEVENT…5ƒ1�Assembly�02/28/85�22:51:41�SREL:9999.M68XXX.EXQEVENT.SA‹68xxx�TRAP�0--QUEUE�EVENT @EXRQPA‡5ƒ1�Assembly�02/28/85�22:52:41�SREL:9999.M68XXX.EXRQPA.SA5‹68xxx�TRAP�0--REQUEST�PERIODIC�ACTIVATION�OF�PROCESS BFNDGSEG†5ƒ1�Assembly�02/28/85�22:53:26�SREL:9999.M68XXX.FNDGSEG.SA/‹68xxx�TRAP�0--FIND�SEGMENT�IN�GLOBAL�SEG�TABLE BFNDTSEG†5ƒ1�Assembly�02/28/85�22:54:03�SREL:9999.M68XXX.FNDTSEG.SA1‹68xxx�TRAP�0--FIND�SEGMENT�IN�TASK�SEGMENT�TABLE BFNDUSEM†5ƒ1�Assembly�02/28/85�22:54:36�SREL:9999.M68XXX.FNDUSEM.SA)‹68xxx�TRAP�0--FIND�USER�SEMAPHORE�IN�UST @GETTCB‡5ƒ1�Assembly�02/28/85�22:55:11�SREL:9999.M68XXX.GETTCB.SA-‹68xxx�TRAP�0--GET�TASK�CONTROL�BLOCK�ADDRESS @GTDTIM‡5ƒ1�Assembly�02/28/85�22:55:44�SREL:9999.M68XXX.GTDTIM.SA#‹68xxx�DIRECTIVE--GET�DATE�AND�TIME DGTTASKID…5ƒ1�Assembl y�02/28/85�22:56:31�SREL:9999.M68XXX.GTTASKID.SA‹68xxx�TRAP�1--GET�TASK�ID BGTTNAME†5ƒ1�Assembly�02/28/85�22:57:29�SREL:9999.M68XXX.GTTNAME.SA‹68xxx�TRAP�1--GET�TASK�ID @KILLER‡5ƒ1�Assembly�02/28/85�23:00:29�SREL:9999.M68XXX.KILLER.SA‹68xxx�CRASH�THE�SYSTEM DLOADMMU†2ƒ0�Assembly�02/28/85�21:42:29�SREL:9999.EXORMACS.LOADMMU.SA ‹LOAD�MMU @LOGPHY‡5ƒ1�Assembly�02/28/85�23:00:53�SREL:9999.M68XXX.LOGPHY.SA2‹68xxx�TRAP�0--CONVERT�LOGICAL�ADDRESS�TO�PHYSICAL DPAGEALOC…5ƒ1�Assembly�02/28/85�23:01:28�SREL:9999.M68XXX.PAGEALOC.SA'‹68xxx�TRAP�0--ALLOCATE�PHYSICAL�MEMORY DPAGEFREE…5ƒ1�Assembly�02/28/85�23:02:30�SREL:9999.M68XXX.PAGEFREE.SA#‹68xxx�TRAP�0--FREE�PHYSICAL�MEMORY >PAUSEˆ5ƒ1�Assembly�02/28/85�23:03:12�SREL:9999.M68XXX.PAUSE.SA%‹68xxx�TRAP�0--PAUSE�DURING�EXEC�TOUR  DMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�6   DPOWRFAIL…5ƒ1�Assembly�02/28/85�23:03:42�SREL:9999.M68XXX.POWRFAIL.SA#‹68xxx�POWER�FAIL�INTERRUPT�HANDLER @PSTATE‡5ƒ1�Assembly�02/28/85�23:04:04�SREL:9999.M68XXX.PSTATE.SA,‹68xxx�DIRECTIVE--SET�STATE�OF�EXMON'ED�TASK >PVSEMˆ5ƒ1�Assembly�02/28/85�21:51:41�SREL:9999.M68XXX.PVSEM.SA ‹68000�TRAP�0--SEMAPHORE�ROUTINE >RCVSAˆ5ƒ1�Assembly�02/28/85�23:05:01�SREL:9999.M68XXX.RCVSA.SA,‹68xxx�DIRECTIVE--RECEIVE�SEGMENT�ATTRIBUTES ARDTIMER†1ƒ0�Assembly�02/28/85�22:14:08�SREL:9999.M6840.RDTIMER.SA-‹READ�TIMER�routine�for�the�M6840�timer�chip. >READYˆ5ƒ1�Assembly�02/28/85�23:06:50�SREL:9999.M68XXX.READY.SA*‹M68xxx�RMS�TRAP�0�Put�task�on�ready�list. @RELINQ‡5ƒ1�Assembly�02/28/85�23:07:33�SREL:9999.M68XXX.RELINQ.SA&‹68xxx�DIRECTIVE--RELINQUISH�EXECUTION @RESUME‡5ƒ1�Assembly�02/28/85�23:08:19�SREL:9999.M68XXX.RESUME.SA)‹68xxx�DIRECTIVE--RESUME�A�SUSPENDED�TASK @REXMON‡5ƒ1�Assembly�02/28/85�23:09:11�SREL:9999.M68XXX.REXMON.SA2‹68xxx�DIRECTIVE--EXECUTE�TASK�UNDER�EXMON�CONTROL @RQSTPA‡5ƒ1�Assembly�02/28/85�23:11:25�SREL:9999.M68XXX.RQSTPA.SA-‹68xxx�DIRECTIVE--REQUEST�PERIODIC�ACTIVATION @RSTATE‡5ƒ1�Assembly�02/28/85�23:12:42�SREL:9999.M68XXX.RSTATE.SA-‹68xxx�DIRECTIVE--READ�STATE�OF�EXMON'ED�TASK BRTEVENT†5ƒ1�Assembly�02/28/85�23:13:33�SREL:9999.M68XXX.RTEVENT.SA+‹68xxx�DIRECTIVE--RETURN�FROM�EVENT�SERVICE BSEGALOC†5ƒ1�Assembly�02/28/85�23:15:23�SREL:9999.M68XXX.SEGALOC.SA+‹68xxx�DIRECTIVE--ALLOCATE�A�MEMORY�SEGMENT BSEGDEAL†5ƒ1�Assembly�02/28/85�23:17:07�SREL:9999.M68XXX.SEGDEAL.SA+‹68xxx�DIRECTIVE--DEALLOCATE�MEMORY�SEGMENT BSEGSHAR†5ƒ1�Assembly�02/28/85�23:18:29�SREL:9999.M68XXX.SEGSHAR.SA6‹68xxx�DIRECTIVES--SHARE�SEGMENT�AND�ATTACH�TO�SEGMENT DSELFTEST…5ƒ1�Assembly�02/28/85�23:20:11�SREL:9999.M68XXX.SELFTEST.SA(‹68xxx�SYSTEM�SELFTEST�INTERRUPT�HANDLER >SERVEˆ5ƒ1�Assembly�02/28/85�23:20:35�SREL:9999.M68XXX.SERVE.SA&‹68xxx�DIRECTIVE--BECOME�A�SERVER�TASK @SETPRI‡5ƒ1�Assembly�02/28/85�23:21:42�SREL:9999.M68XXX.SETPRI.SA(‹68xxx�DIRECTIVE--CHANGE�TASK'S�PRIORITY  DMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�7   >SGSEMˆ5ƒ1�Assembly�02/28/85�23:22:37�SREL:9999.M68XXX.SGSEM.SA,‹68xxx�DIRECTIVES--SIGNAL�AND�WAIT�SEMAPHORE SUPERˆ5ƒ1�Assembly�02/28/85�21:53:17�SREL:9999.M68XXX.SUPER.SA,‹M68000�DIRECTIVE--SWITCH�TO�SUPERVISOR�MODE BSUSPEND†5ƒ1�Assembly�02/28/85�23:26:04�SREL:9999.M68XXX.SUSPEND.SA‹68xxx�DIRECTIVE--SUSPEND TRAP0ˆ5ƒ1�Assembly�02/28/85�21:54:23�SREL:9999.M68XXX.TRAP0.SA!‹68000�TRAP�#0�handler�and�table. >TRAP1ˆ5ƒ1�Assembly�02/28/85�21:55:13�SREL:9999.M68XXX.TRAP1.SA!‹68000�TRAP�#0�handler�and�table. BTSKATTR†5ƒ1�Assembly�02/28/85�23:31:17�SREL:9999.M68XXX.TSKATTR.SA)‹68xxx�DIRECTIVE--RECEIVE�TASK�ATTRIBUTES BTSKBORN†5ƒ1�Assembly�02/28/85�23:32:06�SREL:9999.M68XXX.TSKBORN.SA!‹68xxx�DIRECTIVE--CREATE�NEW�TASK BTSKINFO†5ƒ1�Assembly�02/28/85�23:33:18�SREL:9999.M68XXX.TSKINFO.SA2‹68xxx�DIRECTIVE--MOVE�TARGET�TASK'S�TCB�TO�BUFFER BTSKMOVE†5ƒ1�Assembly�02/28/85�23:34:22�SREL:9999.M68XXX.TSKMOVE.SA1‹68xxx�DIRECTIVES--MOVE�LOGICAL�AND�MOVE�PHYSICAL DTSKSTART…5ƒ2�Assembly�02/28/85�23:35:50�SREL:9999.M68XXX.TSKSTART.SA$‹68xxx�DIRECTIVE--START�DORMANT�TASK  DMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�8   BTSKWAIT†5ƒ1�Assembly�02/28/85�23:37:53�SREL:9999.M68XXX.TSKWAIT.SA‹68xxx�DIRECTIVE--WAIT DUSERVECT…5ƒ1�Assembly�02/28/85�23:38:52�SREL:9999.M68XXX.USERVECT.SA2‹68xxx�DIRECTIVES--USER�EXCEPTION�AND�TRAP�VECTORS @WAKEUP‡5ƒ1�Assembly�02/28/85�23:39:42�SREL:9999.M68XXX.WAKEUP.SA(‹68xxx�DIRECTIVE--WAKE�UP�A�WAITING�TASK BWTEVENT†5ƒ1�Assembly�02/28/85�23:40:43�SREL:9999.M68XXX.WTEVENT.SA ‹68xxx�DIRECTIVE--WAIT�FOR�EVENT DRMSPATCH…5ƒ1�Assembly�02/28/85�23:11:03�SREL:9999.M68XXX.RMSPATCH.SA‹Patch�area�for�RMS68K.  Load Map:  !Segment RMS0: 00000000 00000BFF 0/Module†SƒT‚Start…End‡Externally�Defined�Symbols VECTORS‰A‚00000000‚00000027  .Segment RMS2: 00000C00 000059FF 2,3,4,5,6,7,15/Module†SƒT‚Start…End‡Externally�Defined�Symbols 6RMSŠ2…00000C00‚00000C7F‚RMSˆ00000C00‚CALLKILLƒ00000C0CVECTTBL†2…00000C80‚00000CDF;BKGŠ2…00000CE0‚00000D61‚CALL_GUAƒ00000D50‚BKG_DISPƒ00000D04§BKG_SCHEƒ00000CE0=CACHEˆ2…00000D62‚00000D65‚FLUSH_ONƒ00000D64‚FLUSH_ALƒ00000D62,CKDELAY†2…00000D66‚00000E7D‚CKDELAY„00000D66+CKEXPAT†2…00000E7E‚00000EBD‚CKEXPA…00000E7E=COMINT‡2…00000EBE‚00001007‚COMINTZ„00000EDE‚COMINT_Pƒ00000EEA §COMINT…00000EBE‚ISRERR…00000FCC!§ISRRTE…00000F66‚COMNISR„00000F24?DISPATCH…2…00001008‚000011AD‚PREEMPT„00001018‚DISPATCHƒ0000101E§L1_D0_SAƒ00001008:EQDQ‰2…000011AE‚000012D7‚EXEQDQ…000011AE‚SBEXEQDQƒ000011AE§EQDQ‡000011CAEXCEPT‡2…00001334‚000016D5‚PROGINT2ƒ000013A4‚PROGINT3ƒ000013A6$§PROGINT4ƒ000013A8‚PROGINT5ƒ000013AA$§PROGINT6ƒ000013AC‚PROGINT7ƒ000013AE$§PROGINT8ƒ000013B0‚PROGINT9ƒ000013BA$§PROGINTAƒ000013B2‚PROGINTBƒ000013B4 §BERR1†000013A4‚TRPVCT2„00001338"§TRPVCT3„0000133A‚TRPVCT4„0000133C"§TRPVCT5„0000133E‚TRPVCT6„00001340"§TRPVCT7„00001342‚TRPVCT8„00001344"§TRPVCT9„00001346‚CKEXMON„0000168A"§TRPVCTA„00001348‚TRPVCTB„0000134A"§TRPVCTC„0000134C‚TRPVCTD„0000134E  DMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�9  "§TRPVCTE„00001350‚TRPVCTF„00001352EXRQPA‡2…0000178A‚0000194B‚PAT_DEL_ƒ000018E6‚PAT_MID_ƒ0000191A$§PAT_SCHEƒ00001896‚PAT_RM_1ƒ00001930 §EXRQPA…0000178A‚SBRQPA…0000178A§PAT_1ST_ƒ000018 F6LOADMMU†2…00001988‚000019C3‚LOADMMU„00001988‚LOADMMUIƒ0000198A#§MMUFAULTƒ000019C2‚UNLDMMU„000019B0§CRASN†000019C2‚DEASN†000019C29PAUSEˆ2…000019C4‚000019D1‚SBPAUSE„000019C4‚PAUSE†000019C4.POWRFAIL…2…000019D2‚000019ED‚POWRFAILƒ000019D25PVSEMˆ2…000019EE‚00001AD3‚PSEM‡000019EE‚VSEM‡00001A98§SBPˆ000019EE‚SVXSTAK„00001A44§SBVˆ00001A98‚PSWAIT…00001A20=RDTIMER†2…00001AD4‚00001B07‚RDTIMER„00001AD4‚SBRDTIM„00001AD4PAGEFREE…3…00002426‚00002549‚SBPGFR…00002426‚PAGEFREEƒ00002426*TRACER‡3…0000254A‚000025BF‚TRACER…0000254A>FNDGSEG†4…000025C0‚0000263D‚SBFNDGSGƒ000025C0‚FNDGSEG„000025C0>FNDTSEG†4…0000263E‚00002669‚SBFNDSEGƒ0000263E‚FNDTSEG„0000263E>FNDUSEM†4…0000266A‚000026EB‚SBFNDSEMƒ0000266A‚FNDUSEM„0000266A>GETTCB‡4…000026EC‚00002763‚SBGETTCBƒ000026FE‚SBGTXTCBƒ000026EC §GETTCB…000026FE‚GTXTCB…000026EC.GTTASKID…4…00002764‚00002791‚GTTASKIDƒ00002764,GTTNAME†4…00002792‚000027A1‚GTTNAME„00002792;LOGPHY‡4…000027A2‚000027F7‚LOGPHY…000027A2‚LOGPHYO„000027A6$§SBLOGPHOƒ000027A6‚SBLOGPHYƒ000027A2  EMotorola�M68000�Linkage�Editor�Version‚1.80‚03/01/85‚00:26:38‡Page�10  &CDIR‰5…000027F8‚00002891‚CDIR‡000027F87CISR‰5…00002892‚000029AF‚CISR‡00002892‚SBDIOVX„0000296A,DCLSHAR†5…000029B0‚00002A87‚DCLSHAR„000029B09DSEGXˆ5…00002A88‚00002B13‚SBDSEGX„00002A88‚DSEGX†00002A88(RCVSAˆ5…00002B14‚00002BBF‚RCVSA†00002B14,SEGALOC†5…00002BC0‚00002D69‚SEGALOC„00002BC0>SEGDEAL†5…00002D6A‚00002E51‚DESEG_SUƒ00002DBC‚SEGDEAL„00002D6AASRINT‡6…0000393C‚000039AF‚I_DISP_Aƒ0000393C‚SBUPDATQƒ0000396C#§DISP_ASRƒ0000393C‚UPDTASQ„0000396C$§READY_ASƒ0000393C‚GTASQBUFƒ0000396C7ATSEMˆ6…000039B0‚00003B55‚ATSEM†000039B6‚CRSEM†000039B0)CACHEˆ6…00003B56‚00003B59‚FLUSHC…00003B56:DELAYˆ6…00003B5A‚00003C5D‚PAT_CAN_ƒ00003C34‚DELAY†00003B5A§DELAYW…00003BE49DEMONˆ6…00003C5E‚00003CB9‚SBDMONX„00003C70‚DEMON†00003C5E§DMONX†00003C70*DERQST‡6…00003CBA‚00003D27‚DERQST…00003CBA:DESEMˆ6…00003D28‚00003E65‚DSEM_SUBƒ00003D48‚DESEM†00003D28§DESEMA…00003D3E*DSEMXˆ6…00003E66‚00003E7F‚SBDSEMX„00003E66‚14™***‡take�over�vectors�in�the�processor's�vector�table.�*** ‚15™***É***S‚16™*******************************************************************************S‚17™*******************************************************************************S‚18™*^*****************************************************************************‚19‚20™*0‚21™*‚Revision�history�(add�new�changes�to�top).‚22™*…Date†Author‰ChangesK‚23™*…--------‚-------------‚----------------------------------------------3‚24™ *…10/21/83‚DICK�VANDERLIN�Revision�for�EXORMACS,‚25™*…10/�4/83‚Steve�FranckƒInitial�writing.‚26™*‚27‚28‚29™*I‚30™*‚XREF's.‚Note�that�there�are�many�more�XREF's�created�by�invocations<‚31™*‚of�the�VECTOR�macro;�those�XREF's�are�not�listed�here.‚32™*1‚33¢XREF…COMINT�Common�interrupt�handler�routine.‚34‚35‚36‚37™*‚38™*‚Included�files:‚39™*9‚40™*‰9995.&.STR.EQ�The�section�number�to�use�is�in�here.‚41™* XMotorola�M68000�ASM�Version‚1.80�SREL:9999.EXORMACS.XVECTTBL.AG�03/01/85�00:26:02žPAGEƒ2  �554™*J�555™*‚The�VECTOR�macro�defines�entries�in�the�vector�table.‚The�format�is*�556™*‰VECTOR‚,:�557™*‚There�are�two�special�values�for�:1�558™*‰0�=�COMINT�(the�common�interrupt�handler).-�559™*‰1�=�don't�take�over�the�vector�at�all.J�560™*‚Entries�in�the�vector�table�must�be�assigned�in�order--that�is,�theG�561™*‚vector�#'s�in�the�VECTOR�invocations�must�be�in�ascending�order.M�562™*‚In�the�case�where�two�contiguous�VECTOR�invocations�leave�a�gap�in�theP�563™*‚vector�#'s,�those�vector�#'s�in�the�gap�will�be�assigned�the�same�handler>�564™*‚as�that�of�the�lower�vector�#�of�the�pair.‚For�example,0�565™*‰VECTOR�$23,0ŽPoints�$23�to�$27�to�COMINT.2�566™*‰VECTOR�$28,1ŽLeaves�$28�to�$2F�as�they�are.2�567™*‰VECTOR�$30,ROUTINE1‡Points�$30�to�ROUTINE1.L�568™*‚If�the�gap�to�be�filled�has�a�second�parameter�other�than�0�or�1,�theO�569™*‚address�assigned�to�the�vector�will�be�incremented�by�2�for�each�vector:<�570™*‰VECTOR�$23,XŽPoints�$23�to�X,�$24�to�X+2,�$25�to�X+4.)�571™*‰VECTOR�$26,0ŽPoints�$26�to�COMINT.,�572™*‚The�end�of�the�list�is�signified�by�a �573™*‰DC.Lƒ0K�574™*‚and�the�second�parameter�of�the�last�prior�VECTOR�invocation�will�beP�575™*‚applied�to�all�further�vectors,�up�to�$FF.‚Again,�if�the�second�parameterP�576™*‚was�not�a�0�or�1,�the�address�assigned�to�the�vectors�will�be�incremented(�577™*‚by�2�for�each�vector�in�sequence.�578™*�579™VECTORƒMACRO�580¢IFLE…\1-VECT_NUM4�581¢FAIL…499ŒVector�#'s�must�be�in�ascending�order! �582¢MEXIT �583¢ENDC�584¢IFNC…'\2','0'�585¢IFNC…'\2','1' �586¢XREF…\2 �587¢ENDC �588¢ENDC�589™VECT_NUM�SET†\1�590¢DC.L…\1<<24+\2 �591¢ENDM 592 593�594™*%�595™*‚First�set�up�the�table�header.�596™*�597Œ00000002ŽSECTION‚LEVEL00 598 599H�600�2�00000000�21564354ŽDC.L…'!VCT'�Dump�eyecatcher�for�'VeCtor�Table.'J�601�2�00000004�00000000ŽDC.L…COMINT�Put�the�address�of�COMINT�here�so�the'�602™*§exec�initializer�can�find�it;�he(�603™*§isn't�linked�with�the�exec,�so�he�604™*§wouldn't�know�otherwise. XMotorola�M68000�ASM�Version‚1.80�SREL:9999.EXORMACS.XVECTTBL.AG�03/01/85�00:26:02žPAGEƒ3  �606™*.�607™*‚Here�are�the�actual�vector�assignments.N�608™*‚Notice�that�whether�or�not�the�illegal�instruction�vector�is�taken�overJ�609™*‚by�RMS68K�is�controlled�by�an�sysgen�parameter.‚During�RMSGEN,�this)�610™*‚parameter�is�substituted�such�thatF�611™*„0�=�the�exec�should�leave�the�illegal�instruction�vector�alone.D�612™*„1�=�the�exec�should�take�over�the�illegal�instruction�vector.O�613™*‚You�might�want�the�exec�to�leave�the�illegal�instruction�vector�alone�ifN�614™*‚you�want�to�use�the�ROM�debugger,�since�it�uses�illegal�instructions�as�615™*‚breakpoints.�616™* 617F�618Œ00000001…VECT_NUM�SET†1•Initialize�the�vector�number�to�1�so�that+�619™*§the�lowest�vector�number�that�can�be�620™*§set�afterwards�is�2.<�621™*‰VECTOR�$00,CALLKILLŠSHOULD�NEVER�GET�HERE�this�was�inC�622™*‰VECTOR�$01,CALLKILLŠSHOULD�NEVER�GET�HERE�4.2�exormacs�vectt�623™*.�624�2�00000008—VECTORƒ$02,PROGINT2ŠBus�error.2�625�2�0000000C—VECTORƒ$03,PROGINT3ŠAddress�error.)�626™*§If�we're�not�supposed�to�take�over,�627¢IFEQ…$1”the�illegal�instruction�vector, �629¢ENDC›*&�630™*§If�we�are�supposed�to�take�over,�631¢IFNE…$1”the�illegal�instruction�vector,M�632�2�00000010—VECTORƒ$04,PROGINT4Štake�over�the� illegal�instruction�vector. �633¢ENDC›*2�634�2�00000014—VECTORƒ$05,PROGINT5ŠDivision�by�0.0�635™*‚in�sequence„$06,PROGINT6ŠCHK�instruction.2�636™*‚in�sequence„$07,PROGINT7ŠTRAPV�instruction.4�637™*‚in�sequence„$08,PROGINT8ŠPrivilege�violation.6�638�2�00000018—VECTORƒ$09,PROGINT9ŠInstruction�trace.G�639�2�0000001C—VECTORƒ$0A,PROGINTAŠReserved�instruction�opcodes�$AXXX.C�640™*‚in�sequence„$0B,PROGINTBŠReserved�instruction�opcodes�$FXXX.6�641�2�00000020—VECTORƒ$0C,0‘($0C�-�$0E�go�to�COMINT.):�642�2�00000024—VECTORƒ$0F,KILLERŒUninitialized�Interrupt.6�643�2�00000028—VECTORƒ$10,0‘($10�-�$17�go�to�COMINT.)6�644�2�0000002C—VECTORƒ$18,SPURINT‹Spurious�interrupt.6�645�2�00000030—VECTORƒ$19,0‘($19�-�$1C�go�to�COMINT.)6�646�2�00000034—VECTORƒ$1D,0‘($1D�-�$1F�go�to�COMINT.))�647�2�00000038—VECTORƒ$20,TRAP0�TRAP�#0.)�648�2�0000003C—VECTORƒ$21,TRAP1�TRAP�#1.2�649�2�00000040—VECTORƒ$22,TRPVCT2‹TRAP�#2�to�#15.6�650�2�00000044—VECTORƒ$30,0‘($30�-�$8B�go�to�COMINT.)8�651�2�00000048—VECTORƒ$8C,TIMEINT‹M6840�time�interrupt.0�652�2�0000004C—VECTORƒ$8D,0‘($8D�go�to�comint.)G�653�2�00000050—VECTORƒ$8E,1‘Software�abort�vector(leave�it�pointing�to �654™*¦BUG)�655�2�00000054—VECTORƒ$8F,06�656�2�00000058—VECTORƒ$95,0‘($95�-�$FF�go�to�COMINT.)9�657�2�0000005C�00000000ŽDC.L…0•(End�of�table�indicator.)�658¢END ******�TOTAL�ERRORS†0--******�TOTAL�WARNINGS„0-- XMotorola�M68000�ASM�Version‚1.80�SREL:9999.EXORMACS.XVECTTBL.AG�03/01/85�00:26:02žPAGEƒ4  SYMBOL TABLE LISTING  -SYMBOL�NAME…SECTƒVALUE‡SYMBOL�NAME…SECTƒVALUE  %COMINT…XREFƒ*ƒ00000000…TCBSTK…MACRƒ*�GET_TARGƒMACRƒ*�TESTIM…MACRƒ*�.KILLER…XREFƒ*ƒ00000000…TIMEINT„XREFƒ*ƒ00000000LEVEL00�00000002…TR0ˆMACRƒ*�LVLBASE�00000002…TR0$‡MACRƒ*�&PROGINT2ƒXREFƒ*ƒ00000000…TR02X†MACRƒ*�.PROGINT3ƒXREFƒ*ƒ00000000…TRAP0†XREFƒ*ƒ00000000.PROGINT4ƒXREFƒ*ƒ00000000…TRAP1†XREFƒ*ƒ000000000PROGINT5ƒXREFƒ*ƒ00000000…TRPVCT2„XREFƒ*ƒ00000000'PROGINT9ƒXREFƒ*ƒ00000000…VECTOR…MACRƒ*�*PROGINTAƒXREFƒ*ƒ00000000…VECT_NUMŽ00000095SPURINT„XREFƒ*ƒ00000000� QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ1  Aƒ1™SYSPARƒIDNT…5,1“System�parameters�at�$900;�Crash�save�at�$400.Rƒ2™*v*****************************************************************************Rƒ3™*******************************************************************************Rƒ4™******************************************************************************* ƒ5™***É***Aƒ6™***…ROUTINE:‚SYSPAR�--�SYSTEM�PARAMETERS�TABLE�FOR�RMS68K.�*** ƒ7™***É***Mƒ8™***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family.***+ƒ9™***‡Copyright�1983�by�Motorola,�Inc.¢*** ‚10™***É***L‚11™***…FUNCTION:‚This�table�gets�SUBSed�and�ASMed�during�an�RMSGEN,�andƒ***J‚12™***‡is�then�linked�in�with�RMS68K.‚The�data�defined�in�this�moduleƒ***H‚13™***‡are�primarily�the�variables�and�parameters�needed�by�RMS68K.†*** ‚14™***É***S‚15™*******************************************************************************S‚16™*******************************************************************************S‚17™*^*****************************************************************************‚18‚19™*0‚20™*‚Revision�history�(add�new�changes�to�top).‚21™*…Date†Author‚ChangesD‚22™*…--------‚------‚----------------------------------------------,‚23™*…12/�7/84‚SJF…Added�LAST_MMU_INT_LEVEL.#‚24™*…10/�4/83‚SJF…Format�revision.‚25™*‚26‚27‚28™*‚29™*‚Included�files:‚30™*‚31™*‰9995.&.TIOT.EQ‚32™* QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ2  ‚69¢XDEF…ACOTBL‚70¢XDEF…ADEFTYP‚71¢XDEF…ASNTBL‚72¢XDEF…BKG_ACTIVE‚73¢XDEF…BKG_FLAG‚74¢XDEF…BKG_HEAD‚75¢XDEF…BKG_TAIL‚76¢XDEF…CCBHD‚77¢XDEF…CRASHSAV‚78¢XDEF…CTRLREG‚79¢XDEF…CURR_ASN‚80¢XDEF…CURR451‚81¢XDEF…CURRSD‚82¢XDEF…DACTBL ‚83¢XDEF…DATE‚84¢XDEF…DBUFSZ‚85¢XDEF…DCOTBL‚86¢XDEF…DPRVAO‚87¢XDEF…ENDSYSP‚88¢XDEF…EXCSTACK‚89¢ XDEF…FQBCNT‚90¢XDEF…FQLWM‚91¢XDEF…FREEQHD‚92¢XDEF…FREEQND‚93¢XDEF…FRST451‚94¢XDEF…GSTBEG‚95¢XDEF…INPTBL‚96¢XDEF…IOVCTBGN ‚97¢XDEF…LAM‚98¢XDEF…LAST451‚99¢XDEF…LAST_MMU_INT_LEVEL�100¢XDEF…LCTBEG�101¢XDEF…MACSTRC�102¢XDEF…MAPBEG�103¢XDEF…MEMOFF�104¢XDEF…MIDNIGHT�105¢XDEF…MMUHERE�106¢XDEF…MMULOAD�107¢XDEF…NATBEG�108¢XDEF…NNTBEG�109¢XDEF…NOTLAM �110¢XDEF…NSE�111¢XDEF…NWDQHD�112¢XDEF…NWPSEG�113¢XDEF…NWSTATUS�114¢XDEF…NWTSEG�115¢XDEF…PANEL�116¢XDEF…PATBEG�117¢XDEF…PERTURB_FLAG�118¢XDEF…PREEMPT_FLAG�119¢XDEF…PTMADDR�120¢XDEF…RAD1TBL�121¢XDEF…READYHD�122¢XDEF…RIOTBL�123¢XDEF…RUNNER�124¢XDEF…SDEFTYP�125¢XDEF…SDLCPCB�126¢XDEF…SEMCCB QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ3  �127¢XDEF…SEMEND�128¢XDEF…SEMGST�129¢XDEF…SEMLIST�130¢XDEF…SEMTCB�131¢XDEF…SEMTIOT�132¢XDEF…SEMUST�133¢XDEF…SLFTSTA7�134¢XDEF…SPURCNT�135¢XDEF…SPURTIME�136¢XDEF…SYSPAR�137¢XDEF…SYSPOFF�138¢XDEF…TCBHD�139¢XDEF…TDEFTYP�140¢XDEF…TIAT�141¢XDEF…TIME_LEFT�142¢XDEF…TIMEOUT�143¢XDEF…TIMESLIC�144¢XDEF…TIMINTV�145¢XDEF…TIMINTV4�146¢XDEF…TIMINTR�147¢XDEF…TINTFLAG�148¢XDEF…TIOT�149¢XDEF…TRACEBEG�150¢XDEF…TRACFLAG�151¢XDEF…UDEFTYP�152¢XDEF…UDRBEG�153¢XDEF…USERQHD�154¢XDEF…USERQND�155¢XDEF…USTBEG�156¢XDEF…V2RQHD�157¢XDEF…VCTUBGN QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ4  �159™*J�160™*‚First�define�the�location�of�the�'crash�save�area,'�the�place�whereI�161™*‚the�KILLER�module�will�save�the�processor's�registers,�etc.�in�the�162™*‚event�of�a�system�crash.�163™*�164Œ00000400…CRASHSAV�EQU†$400 165 166�167™*J�168™*‚Now�define�the�structure�of�the�'system�parameters�area'�to�all�theI�169™*‚various�RMS68K�modules.‚Note�that�we�are�not�actually�defining�anyJ�170™*‚storage�here--this�is�just�a�big�offset�block�which�will�define�theG�171™*‚locations�of�the�parameters.‚Initialization�of�the�parameters�is6�172™*‚handled�by�the�RMS68K�initializer�at�boot�time.�173™*�174¢OFFSETƒ$900�175Œ00000900…SYSPARƒEQU†* 1769�177ƒ00000900�00000004…MAPBEGƒDS.L…1•POINTS�TO�MEMORY�MAP 178*�179ƒ00000904�00000002…PERTURB_FLAG�DS.W�1'�180Œ00000904…BKG_FLAG�EQU†PERTURB_FLAG-�181Œ00000905…PREEMPT_FLAG�EQU‚PERTURB_FLAG+1 182�183ƒ00000906�00000002ŽDS.W…1 184<�185ƒ00000908�00000004…EXCSTACK�DS.L…1•ADDRESS�OF�EXEC�STACK 186;�187ƒ0000090C�00000004…RUNNERƒDS.L…1•ADDRESS�OF�RUNNING�TCB 188G�189ƒ00000910�00000004…TCBHD„DS.L…1•POINTS�TO�FIRST�TCB�IN�ALL-TCB�LIST 190G�191ƒ00000914�00000004…READYHD‚DS.L…1•POINTS�TO�FIRST�TCB�IN�READY�LIST 192I�193ƒ00000918�00000004…CCBHD„DS.L…1•POINTS�TO�FIRST�CHANNEL�CONTROL�BLOCK 194Q�195ƒ0000091C�00000004…MMUHERE‚DS.L…1•HOLDS�ADDRESS�OF�MMU�HARDWARE�IN�MEMORY�MAP 196B�197ƒ00000920�00000004…GSTBEGƒDS.L…1•START�OF�GLOBAL�SEGMENT�TABLE 198B�199ƒ00000924�00000004…USTBEGƒDS.L…1•START�OF�USER�SEMAPHORE�TABLE 200L�201ƒ00000928�00000004…UDRBEGƒDS.L…1•Pointer�to�User�Defined�Directive�Table 202G�203ƒ0000092C�00000004…PATBEGƒDS.L…1•START�OF�PERIODIC�ACTIVATION�TABLE 204B�205ƒ00000930�00000004…TRACEBEG�DS.L…1•START�OF�SYSTEM�TRACE�TABLE 2069�207ƒ00000934�00000002…TRACFLAG�DS.W…1•SYSTEM�TRACE�FLAGS 208C�209ƒ00000936�00000004…MACSTRC‚DS.L…1•MACSBUG�TRACE�ROUTINE�ADDRESS 2107�211ƒ0000093A�00000004…PANEL„DS.L…1•FRONT�PANEL�ADDRESS�212™*�213™*„TIMER�PARAMETERS�214™*�215™* 216 QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ5  /�217ƒ0000093E�00000004…DATE…DS.L…1•ORDINAL�DATE 218O�219ƒ00000942�00000004…PTMADDR‚DS.L…1•ADDRESS�USED�TO�ACCESS�PROGRAMMABLE�TIMER 220=�221ƒ00000946�00000002…TIMEOUT‚DS.W…1•TIMER�INTERRUPT�COUNTER 222Y�223ƒ00000948�00000002…TIMESLIC�DS.W…1•NUMBER�OF�TIMER�INTERRUPTS�BEFORE�TASK�INTERRUPTED 224D�225ƒ0000094A�00000004…NSE†DS.L…1•ms�value�of�next�significant�event 226M�227 ƒ0000094E�00000004…TIME_LEFT�DS.L„1•ms�value�until�next�significant�event 228D�229ƒ00000952�00000004…MIDNIGHT�DS.L…1•ms�value�of�previous�midnight 230J�231ƒ00000956�00000002…TIMINTV‚DS.W…1•#�MILLISECS�BETWEEN�TIMER�INTERRUPTS 2322�233ƒ00000958�00000002…TIMINTV4�DS.W…1•TIMINTV*4-1 234N�235ƒ0000095A�00000002…TIMINTR‚DS.W…1•Holds�usec�remainder�for�odd�clock�rates 236;�237ƒ0000095C�00000001…TINTFLAG�DS.B…1•TIMER�INTERRUPT�FLAG 238N�239ƒ0000095D�00000001…TMSGFLAG�DS.B…1•FLAG�-�MESSAGE�SENT�DURING�I/O�HANDLING 240B�241ƒ0000095E�00000002…SPURCNT‚DS.W…1•COUNT�OF�SPURIOUS�INTERRUPTS 242P�243ƒ00000960�00000004…SPURTIME�DS.L…1•TIME�THAT�1ST�SPURIOUS�INTERRUPT�OCCURRED 244B�245ƒ00000964�00000004…MMULOAD‚DS.L…1•MMU�LOADED�FROM�THIS�ADDRESS 246?�247ƒ00000968�00000004…VCTUBGN‚DS.L…1•START�OF�VECTOR�USE�TABLE 248G�249ƒ0000096C�00000004…IOVCTBGN�DS.L…1•START�OF�VECTOR�ASSIGNMENT�TABLE 250C�251ƒ00000970�00000001…ADEFTYP‚DS.B…1•DEFAULT�MEMORY�TYPE�FOR�ASQ'S 252C�253ƒ00000971�00000001…TDEFTYP‚DS.B…1•DEFAULT�MEMORY�TYPE�FOR�TCB'S 254U�255ƒ00000972�00000002…SDEFTYP‚DS.B…2•DEFAULT�MEMORY�TYPE�FOR�SYSTEM�TASKS(RO�AND�RW) 256S�257ƒ00000974�00000002…UDEFTYP‚DS.B…2•DEFAULT�MEMORY�TYPE�FOR�USER�TASKS(RO�AND�RW) 258;�259ƒ00000976�00000004…SLFTSTA7�DS.L…1•SAVE�A7�FOR�SELFTEST�260™*�261™*ŒEXEC�SEMAPHORES�262™*1�263Œ0000097A…SEMLIST‚EQU†*•SEMAPHORES�BEGIN�HERE 2641�265ƒ0000097A�00000006…SEMTCBƒDS.W…3•ALL�TCB�LIST 2669�267ƒ00000980�00000006…SEMGSTƒDS.W…3•GLOBAL�SEGMENT�TABLE 2689�269ƒ00000986�00000006…SEMUSTƒDS.W…3•USER�SEMAPHORE�TABLE 2702�271ƒ0000098C�00000006…SEMCCBƒDS.W…3•CCB�SEMAPHORE 272A�273ƒ00000992�00000006…SEMTIOT‚DS.W…3•TRAP�INSTR�ALLOCATION�TABLE 274 QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ6  6�275Œ00000998…SEMENDƒEQU†*•PREVIOUS�WAS�LAST�SEMAPHORE�276™*0�277™*…TIAT�--�TRAP�INSTRUCTION�ALLOCATION�TABLE+�278™*…TIOT�--�TRAP�INSTRUCTION�OWNER�TABLE�279™*#�280ƒ00000998�00000010…TIAT…DS.B…16 281�282Œ000009A8…TIOT…EQU†*%�283ƒ000009A8�00000160ŽDS.B…16*TIOTEL�284™*-�285™*‚Parameters�relating�to�the�background.�286™*.�287™*£Pointer�to�the�first�entry�(BAB)�in�theQ�288ƒ00000B08�00000004…BKG_HEAD�DS.L…1•background�queue;�0�if�the�queue�is�empty. 289-�290™*£Pointer�to�the�last�entry�(BAB)�in�theR�291ƒ00000B0C�00000004…BKG_TAIL�DS.L…1•background�queue;�points�to�BKG_HEAD�if�the�292™*§queue�is�empty. 293+�294™*£This�flag�is�true�(nonzero)�when�the?�295ƒ00000B10�00000001…BKG_ACTIVE�DS.Bƒ1•background�is�running. 296�297™*�298™*>�299ƒ00000B11�00000001…CURR_ASN�DS.B…1•Only�upper�byte�is�used�300™*1�301™*ˆPOINTERS�USED�BY�SDLC�AND�NETWORK�SERVICES�302™*<�303ƒ00000B12�00000004…FREEQHD‚DS.L…1•Free�Buffer�Queue�Head 304@�305ƒ00000B16�00000002…DBUFSZƒDS.W…1•Size�of�data�area�in�buffer 306=�307ƒ00000B18�00000002…FQLWM„DS.W…1•Free�Queue�Low�Water�Mark 308D�309ƒ00000B1A�00000002…FQBCNTƒDS.W…1•Free�Queue�Current�Buffer�Count 310<�311ƒ00000B1C�00000004…USERQHD‚DS.L…1•User�Buffer�Queue�Head 312;�313ƒ00000B20�00000004…USERQND‚DS.L…1•User�Buffer�Queue�End 314F�315ƒ00000B24�00000004…SDLCPCB‚DS.L…1•Pointer�to�Primary�Control�Block 316B�317ƒ00000B28�00000004…NNTBEGƒDS.L…1•Pointer�to�Network�Name�Table 318E�319ƒ00000B2C�00000004…NATBEGƒDS.L…1•Pointer�to�Network�Address�Table 320E�321ƒ00000B30�00000004…LCTBEGƒDS.L…1•Pointer�to�Logical�Connect�Table 322H�323ƒ00000B34�00000004…NWPSEGƒDS.L…1•Limits�of�Network�Procedure�Segment 324D�325ƒ00000B38�00000004…NWTSEGƒDS.L…1•Limits�of�Network�Table�Segment 326L�327ƒ00000B3C�00000004…NWDQHDƒDS.L…1•Disconnect�(task�terminated)�Queue�Head 328A�329ƒ00000B40�00000004…NWSTATUS�DS.L…1•Network�Status�(-1�=�dead) 330G�331ƒ00000B44�00000004…V2RQHDƒDS.L…1•Requests�for�action�by�VM02�system 332 QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ7  =�333ƒ00000B48�000000 04…MEMOFFƒDS.L…1•VM02�Board�memory�offset 334=�335ƒ00000B4C�00000004…SYSPOFF‚DS.L…1•VM02�SYSPAR�area�offset�336™*(�337™*ˆPointers�used�by�IO�Drivers,�etc.�338™*F�339ƒ00000B50�00000004…CTRLREG‚DS.L…1•Pointer�to�VM02�Control�Register 340L�341ƒ00000B54�00000004…DPRVAOƒDS.L…1•Dual-ported�RAM�VERSAdos�address�offset 342J�343ƒ00000B58�00000004…RAD1TBL‚DS.L…1•Pointer�to�table�used�by�RAD1�driver 344@�345ƒ00000B5C�00000004…RIOTBLƒDS.L…1•Pointer�to�RIO�driver�table 346@�347ƒ00000B60�00000004…DCOTBLƒDS.L…1•Pointer�to�DCO�driver�table 348@�349ƒ00000B64�00000004…ACOTBLƒDS.L…1•Pointer�to�ACO�driver�table 350M�351ƒ00000B68�00000004…INPTBLƒDS.L…1•Address�of�interrupt�Queue�Control�Table"�352™*™for�the�VME�610/620�driver. 353A�354ƒ00000B6C�00000004…DACTBLƒDS.L…1•MVME605�driver�table�address�355™*�356™*‰SDLC/NTS�Free�Queue�End�357™*B�358ƒ00000B70�00000004…FREEQND‚DS.L…1•Pointer�to�end�of�free�queue�359™*,�360™*‰Parameters�relating�to�address�spaces�361™*S�362ƒ00000B74�00000004…ASNTBLƒDS.L…1•Pointer�to�table�of�task�address�space�numbers 363H�364ƒ00000B78�00000004…NOTLAMƒDS.L…1•(Pagesize-1)�for�segment�allocation 365D�366ƒ00000B7C�00000004…LAM†DS.L…1•(68451�logical�address�mask)�*�256 367<�368ƒ00000B80�00000004…FRST451‚DS.L…1•Address�of�first�68451 369;�370ƒ00000B84�00000004…LAST451‚DS.L…1•Address�of�last�68451 371Q�372ƒ00000B88�00000004…CURR451‚DS.L…1•Address�of�68451�to�next�check�for�swapping 373P�374ƒ00000B8C�00000004…CURRSDƒDS.L…1•Segment�descriptor�in�CURR451�to�next�check�375™*�376™*%�377™*‚Parameters�for�flushing�cache.�378™*�379¢XDEF…CFLUSHM�380ƒ00000B90�00000004…CFLUSHƒDS.L…1•Address�for�flushing�cache�(VME120/128).�381™*Ÿif�((CFLUSH)�=�F_BANK1) �382™*Ÿthen�(flush�bank�1�only);#�383™*Ÿelse�if�((CFLUSH)�=�F_BANK2) �384™*Ÿthen�(flush�bank�2�only);!�385™*Ÿelse�if�((CFLUSH)�=�F_ALL)"�386™*Ÿthen�(flush�banks�1�and�2); 387Y�388ƒ00000B94�00000002…LAST_MMU_INT_LEVEL�DS.W�1�On�systems�using�the�68451�MMU,�we�store+�389™*§here�the�interrupt�level�of�the�last+�390™*§bus�error�which�resulted�in�the�load QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ8  ,�391™*§of�a�segment�descriptor.‚See�LOADMMU. 392�393™*�394™*�395™*�396Œ00000B96…ENDSYSP‚EQU†*�397¢END ******�TOTAL�ERRORS†0--******�TOTAL�WARNINGS„0-- QMotorola�M68000�ASM�Version‚1.80�SREL:9999.ˆ.XSYSPAR�.AG�03/01/85�00:25:30ªPAGEƒ9  SYMBOL TABLE LISTING  -SYMBOL�NAME…SECTƒVALUE‡SYMBOL�NAME…SECTƒVALUE  +ACOTBL…XDEF‡00000B64…PREEMPT_ƒXDEF‡00000905+ADEFTYP„XDEF‡00000970…PTMADDR„XDEF‡00000942*ASNTBL…XDEF‡00000B74…RAD1TBL„XDEF‡00000B58,BKG_ACTIƒXDEF‡00000B10…READYHD„XDEF‡00000914+BKG_FLAGƒXDEF‡00000904…RIOTBL…XDEF‡00000B5C+BKG_HEADƒXDEF‡00000B08…RUNNER…XDEF‡0000090C,BKG_TAILƒXDEF‡00000B0C…SDEFTYP„XDEF‡00000972)CCBHD†XDEF‡00000918…SDLCPCB„XDEF‡00000B24)CFLUSH…XDEF‡00000B90…SEMCCB…XDEF‡0000098C+CRASHSAVƒXDEF‡00000400…SEMEND…XDEF‡00000998*CTRLREG„XDEF‡00000B50…SEMGST…XDEF‡00000980+CURR451„XDEF‡00000B88…SEMLIST„XDEF‡0000097A)CURRSD…XDEF‡00000B8C…SEMTCB…XDEF‡0000097A,CURR_ASNƒXDEF‡00000B11…SEMTIOT„XDEF‡00000992)DACTBL…XDEF‡00000B6C…SEMUST…XDEF‡00000986)DATE‡XDEF‡0000093E…SLFTSTA7ƒXDEF‡00000976*DBUFSZ…XDEF‡00000B16…SPURCNT„XDEF‡0000095E+DCOTBL…XDEF‡00000B60…SPURTIMEƒXDEF‡00000960)DPRVAO…XDEF‡00000B54…SYSPAR…XDEF‡00000900+ENDSYSP„XDEF‡00000B96…SYSPOFF„XDEF‡00000B4C*EXCSTACKƒXDEF‡00000908…TCBHD†XDEF‡00000910*FQBCNT…XDEF‡00000B1A…TDEFTYP„XDEF‡00000971&FQLWM†XDEF‡00000B18…TIAT‡XDEF‡00000998+FREEQHD„XDEF‡00000B12…TIMEOUT„XDEF‡00000946,FREEQND„XDEF‡00000B70…TIMESLICƒXDEF‡00000948,FRST451„XDEF‡00000B80…TIME_LEFƒXDEF‡0000094E*GSTBEG…XDEF‡00000920…TIMINTR„XDEF‡0000095A*INPTBL…XDEF‡00000B68…TIMINTV„XDEF‡00000956-IOVCTBGNƒXDEF‡0000096C…TIMINTV4ƒXDEF‡00000958(LAMˆXDEF‡00000B7C…TINTFLAGƒXDEF‡0000095C(LAST451„XDEF‡00000B84…TIOT‡XDEF‡000009A8(LAST_MMUƒXDEF‡00000B94…T IOTADDRŽ0000000E$LCTBEG…XDEF‡00000B30…TIOTEL�00000016'MACSTRC„XDEF‡00000936…TIOTMCNTŽ00000012&MAPBEG…XDEF‡00000900…TIOTPBSZŽ00000015%MEMOFF…XDEF‡00000B48…TIOTSEM�00000008(MIDNIGHTƒXDEF‡00000952…TIOTSESSŽ00000004'MMUHERE„XDEF‡0000091C…TIOTSTATŽ00000014&MMULOAD„XDEF‡00000964…TIOTTCB�00000000&NATBEG…XDEF‡00000B2C…TMSGFLAGŽ0000095D+NNTBEG…XDEF‡00000B28…TRACEBEGƒXDEF‡00000930+NOTLAM…XDEF‡00000B78…TRACFLAGƒXDEF‡00000934'NSEˆXDEF‡0000094A…UDEFTYP„XDEF‡00000974)NWDQHD…XDEF‡00000B3C…UDRBEG…XDEF‡00000928*NWPSEG…XDEF‡00000B34…USERQHD„XDEF‡00000B1C,NWSTATUSƒXDEF‡00000B40…USERQND„XDEF‡00000B20)NWTSEG…XDEF‡00000B38…USTBEG…XDEF‡00000924(PANEL†XDEF‡0000093A…V2RQHD…XDEF‡00000B44*PATBEG…XDEF‡0000092C…VCTUBGN„XDEF‡00000968PERTURB_ƒXDEF‡00000904� ééEº'M146818 M146818 EQËËqqRDTIMER AFÔÔqqRDTIMER SAÝÝ7qqSTDTIM AFææqqSTDTIM SAïï 4qqTIMEINT AFqqTIMEINT SA!!IqqTRACER AF**qqTRACER SA33CqqRDTIMER RO<<qqSTDTIM ROEEqqTIMEINT RONNqqTRACER ROWWqq ******************************** * Beginning M146818.M146818.EQ * ********************************O********************************************************************************'*‘OFFSET�TO�DESCRIBE�M146818�TIMER�CHIP*O*******************************************************************************  ‰OFFSET�0SECS…DS.B†2„SECONDSSECSALRM�DS.B†2„SECONDS�ALARMMINS…DS.B†2„MINUTESMINSALRM�DS.B†2„MINULTES�ALARMHRS†DS.B†2„HOURSHRSALRM‚DS.B†2„HOURS�ALARMDAYOWKƒDS.B†2„DAY�OF�WEEKDAYOMTH‚DS.B†2„DAY�OF�MONTHMONTH„DS.B†2„MONTHYEAR…DS.B†2„YEARREGA…DS.B†2„CONTROL�REGISTER�AREGB…DS.B†2„CONTROL�REGISTER�BREGC…DS.B†2„CONTROL�REGISTER�CREGD…DS.B†2„CONTROL�REGISTER�D****************************** Ending M146818.M146818.EQ ******************************é éééÃ=/*=/*†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.RDTIMER.LS=/ENDIF=/*4=ASM M146818.RDTIMER.SA,M146818.RDTIMER.RO,\1;RZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééééÌŠPAGE**ˆINCLUDE�FILES**‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.INTERRUP.MCŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE@RDTIMERƒIDNTƒ5,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�-�TIMINT V4�=�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ŠENDéééÕ8=/*=/*†M146818.STDTIM.AF=/*,=/* Chain file to assemble M146818.STDTIM.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M146818.STDTIM.LS=/*=/IFC \1ƒ=ARG�M146818.STDTIM.LS=/ENDIF=/*2=ASM M146818.STDTIM.SA,M146818.STDTIM.RO,\1;RZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9999.M146818.M146818.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééééÞŠPAGE**‰INCLUDE�FILES**‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.TR1RTCD.EQ*‰INCLUDE�9995.&.TCB.EQ*‰INCLUDE�9995.&.BAB.EQ*‰INCLUDE�9995.&.PAT.EQ!*‰INCLUDE�9999.M146818.M146818.EQ*‰INCLUDE�9995.&.INTERRUP.MC*ŠNOLISTŠINCLU DE�9995.&.STR.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQ ŠINCLUDE�9999.M146818.M146818.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE:STDTIM„IDNTƒ5,0�SET�DATE�&�TIME�FOR�THE�M146818�CLOCK�CHIP*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**‡****************************#*‡*‚S�T�D�T�I�M�*ƒSET�DATE�AND�TIME*‡*‚REV�1.00‚HLD6�11/12/79�**‡*‚REV�3.00‚HLD6�11/06/81�**‡*****************************;*†THIS�ROUTINE�SETS�DATE�AND�TIME�TO�VALUES�GIVEN�BY�CALLER***‹ENTRY:�A6�HAS�ADDR�OF�TCB *’A4�HAS�PARAMETER�BLOCK�ADDRESS *”0(A4)�-�ORDINAL�DATE�(4�BYTES)*”4(A4)�-�TIME�(MILLISECONDS)**‹EXIT�:�D0�HAS�RETURN�CODE*’D0=�0…GOOD�RETURN*<*ˆTHE�FOLLOWING�RETURN�CODES�ARE�RETURNED�IN�LOWER�1/2�OF�D0*6*ŠRTCDPBLK�-�2ƒPARAM�BLK�ADDR�NOT�IN�USER'S�ADDR�SPACE1*ŠRTCDALOW�-�9ƒUSER�TASK�CANNOT�SET�DATE�AND�TIME**ŠSECTION�LEVEL04* ŠXDEFƒSTDTIM0ŠXDEFƒSCHED_DATEUP‡Referenced�from�M68XXX.RMS.SA ŠXREFƒKILLER ŠXREFƒSBRQPA ŠXREF.S�DATEŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�PTMADDRŠXREF.S�TIME_LEFT ŠPAGE:STDTIM„BTSTƒ#TSKASYST,TCBATTR(A6)�Is�caller�a�system�task?ŠIF��THEN.S,�EXITƒRTCDALOW‹Error�-�caller�not�a�sys�taskŠENDI 4ŠMOVE.W�SR,-(A7)‹Save�for�unmasking�interrupts�later  *.*ˆCancel�the�DATE�periodic�activation�routine.* !ŠMOVE.W�#1<<15,D1ŠIndicate�cancel1ŠMOVE.L�#PATDATEID,D2†ID�of�node�I�wish�to�cancelŠBSR„SBRQPA�Cancel�itŠNOP—Provide�for�PC+2�return =ŠMOVEM.L�(A4)+,D3-D4‡D3�=�ordinal�date,�D4�=�ms�past�midnight8ŠMOVE.L�#24*60*60*1000,D7‚24�hours�worth�of�milliseconds "ŠWHILE.L�D4��D7�DO.Sƒ=0�SUB.L‚D7,D4‹Bias�so�ms�past�midnight�<�24�hours$�ADD.L‚#1,D3‹Bump�date�for�each�biasŠENDWçXðDøDR  * * Formulas:!*ƒABSOLUTE_TIME�=�NSE�-�TIME_LEFT(*ƒTIME_OF_DAYƒ=�ABSOLUTE_TIME�-�MIDNIGHTE*ƒMidnight�correction�(DELTA)�=�CURRENT_TIME_OF_DAY�-�NEW_TIME_OF_DAYC*…adding�DELTA�to�MIDNIGHT�will�make�our�NEW_ABSOLUTE_TIME�correct. 7* Compute DELTA = CURRENT_TIME_OF_DAY - NEW_TIME_OF_DAY ŠDISABLE_INTERRUPTSˆMaskŠMOVE.L�D3,DATEŒUpdate�DATEŠMOVE.L�NSE,D3.ŠSUB.L‚TIME_LEFT,D3‡D3�=�current�absolute�time>ŠSUB.L‚MIDNIGHT,D3ˆD3�=�current�time�of�day�(ms�past�midnight) 4ŠSUB.L‚D4,D3ŽSubtract�desired�new�time�of�day�to�...*£...�give�us�DELTA9ŠADD.L‚D3,MIDNIGHTˆAdjust�MIDNIGHT�so�abs�time�is�correct)ŠBCLRƒ#31,MIDNIGHT‡Insure�positive�number 7ŠBSR.S‚SCHED_DATEUP‡Now�go�schedule�date�bumper�routine  *(* Load timer calander with new date/time* ŠMOVE.L�DATE,D0ŒDate�in�D0�...#ŠMOVE.L�NSE,D1�...�ms�past�midnightŠSUB.L‚TIME_LEFT,D1‡...�in�...ŠSUB.L‚MIDNIGHT,D1ˆ...�D1�...#ŠBCLRƒ#31,D1�Insure�positive�numberŠMOVE.L�D0,D4ŽSave�date�in�D4'ŠMOVE.L�PTMADDR,A0‰Get�address�of�timer ŠMOVE.L�D1,D0ŽPut�time�into�D0$ŠBSR.S‚TIMECONV‹Msecs�to�D0=00MM00HH;ŠMOVE.B�#$82,REGB(A0)†Set�timer�to�receive�binary�date/time3ŠMOVEP.L�D0,SECSALRM(A0)ƒMinutes�and�hours�to�timer$ŠMOVE.B�D1,SECS(A0)ˆSeconds�to�timer ŠMOVE.L�D4,D0ŽPut�date�into�D0/ŠBSR„DATEOG�Convert�ordinal�date�to�D0=YYYYMMDD,ŠMOVE.B�D0,DAYOMTH(A0)…Day�of�month�to�timerŠLSR.L‚#8,D0ŽD0=00YYYYMM#ŠMOVE.B�D0,MONTH(A0)‡Month�to�timerŠLSR.L‚#8,D0ŽD0=0000YYYY6ŠDIVU.W�#100,D0ŒD0=00rr00qq‚rr=last�two�digits�of�year/ŠSWAPƒD0‘D0=00qq00rr‚rr=last�two�digits�of�year!ŠMOVE.B�D0,YEAR(A0)ˆYear�to�timer 0ŠMOVE.B�#$46,REGB(A0)†Take�timer�out�of�set�mode .ŠMOVE.W�(A7)+,SR‹Unmask�and�lose�SR�from�stack ŠEXITƒSUB�exit�(subroutine);  <* Now reschedule the date update routine to fire at midnight%*ƒDelay�time�from�now�to�midnight�is:**‰(MIDNIGHT�+�24hrs�of�ms)�-�ABSOLUTE_TIME SCHED_DATEUP:ŠMOVE.L�MIDNIGHT,D1 ŠSUB.L‚NSE,D12ŠADD.L‚TIME_LEFT,D1‡Time�delay�for�next�activation ;ŠADD.L‚#24*60*60*1000,D1‚Add�24�hours�worth�of�milliseconds#ŠBCLRƒ#31,D1�Insure�positive�number ŠMOVE.L�D1,A1.ŠCLR.LƒD1�Options�=�new,�one-shot,�int�level�0ŠMOVE.L�#PATDATEID,D2†ID%ŠLEA„DATEUP(PC),A0†Address�of�routine ŠBSR„SBRQPA ŠBRA.S‚*+61ŠBSR„KILLER�Crash�on�illegal�instruction�if�errorŠRTS J*�This�is�the�routine�that�gets�scheduled�to�update�the�date.‚It�runs�from2*ƒexec�request�periodic�activation�every�24�hours.*DATEUP: 0ŠMOVE.W�SR,-(A7)‹Save�to�unmask�interrupts�later#ŠDISABLE_INTERRUPTSˆMask�interrupts'ŠADD.L‚#1,DATEŒUpdate�DATE�and�MIDNIGHTŠADD.L‚#24*60*60*1000,MIDNIGHT)ŠBCLRƒ#31,MIDNIGHT‡Insure�positive�numberŠBSR„SCHED_DATEUP.ŠMOVE.W�(A7)+,SR‹Unmask�and�lose�SR�from�stack*ŠRTE—Return�to�background�routine�that�...*£...�scheduled�me�(TIMEINT)  H************************************************************************2*ˆ**�SUBROUTINES�TO�SUPPORT�DATE/TIME�CONVERSIONS�H************************************************************************H*************************************************************************Ç-*‹SUBROUTINE�TO�CONVERT�INTERNAL�MILLISECONDS**�TO�HOURS,�MINUTES,�AND�SECONDS�IN�ASCII�**ˆCALL†BSR‡TIMECONV**ˆINPUT6*’D0�=�CONTAINS�NUMBER�OF�MILLISECONDS�TO�BE�CONVERTED**ˆOUTPUT***’BINARY�TIME�RETURNED�IN�FOLLOWING�FORMAT*#*’D0�=�00MM00HH‹MM=MINUTESŠHH=HOURS*’D1�=�----00SS‹SS=SECONDS**œ0�1�2�3�4�5�6�7*ˆREGISTERS‰D�*�* *ˆALTERED‹A*ÇH************************************************************************TIMECONV‚EQU„*/ŠDIVUƒ#60000,D0ŠCONVERT�MILLISECONDS�TO�MINUTESŠMOVE.L�D0,D1ŽCHANGE�REGISTERS&ŠCLR.L‚D0‘INITIALIZE�HI�ORDER�DIVIDENDŠMOVE.W�D1,D0ŽFETCH�MINUTESŠDIVUƒ#60,D0�GET�MINUTES,HOURSŠCLR.W‚D1‘CLEAR�FUTURE�HI�ORDERŠSWAPƒD1‘GET�MILLISECONDS!ŠDIVUƒ#1000,D1‹CONVERT�TO�SECONDSŠRTSŠPAGEH************************************************************************'*ˆDATE�CONVERSIONS�FROM�BINARY�TO�ASCII*Ç*6*ˆORDINAL�DATE�-->�DAY�NUMBER�WHERE�DAY�1�=�JAN�1�1980***ˆCALL *’BSR‡DATEOG*¦BINARY�ORDINALƒ-�DAY�NUMBER*§TO*¦BINARY�GREGORIAN�-�YYYYMMDD**ˆINPUT(*’D0�=�DATE�TO�BE�CONVERTED‚-�DAY�NUMBER**ˆOUTPUT!*’D0�=�CONVERTED�DATED‡-�YYYYMMDD*5*ˆREGISTER�ALTERNATION�=�NONE�OTHER�THAN�INPUT/OUTPUT*ÇO*********************************************************************************ˆNON-LEAP�DAYS�BEFORE�TABLE¥*Ç�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?+*‰INCLUDE�M68XXX.TIMEINT.AI�Yes�-�so�do�it.ŠINCLUDE�M68XXX.TIMEINT.AIŠENDéJ=/*=/*†M146818.TRACER.AF=/*,=/* Chain file to assemble M146818.TRACER.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M146818.TRACER.LS=/*=/*=/IFC \1ƒ=ARG�M146818.TRACER.LS=/ENDIF=/*2=ASM M146818.TRACER.SA,M146818.TRACER.RO,\1;RZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TRACE.EQ=/*}=/*=ENDéééé éé"‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TRACE.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TRACE.EQ‰LIST‰PAGEHTRACERƒIDNT�5,0…TRACE�EXEC�ACTIVITY�routine�for�M146818�real�time�clock.*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆTRACERƒREV�1.0ƒ7-19-79„(C313)+*ˆSAVES�TRACE�CODE�-�SR�-�PC�-�A0�-�A6�-�D0$*ˆALL�REGISTERS�ARE�RESTORED�ON�EXIT*ˆCALL:‚JSR‚TRACER*�DC.W�X*ˆX�IS�TRACE�CODE�OF�CALLER*ˆSECTION�LEVEL01*'ˆXDEF‚TRACER„ENTRY--TRACE�EXEC�ACTIVITY ˆXREF.S‚TRACEBEG*0TRACERSP�EQU‚20‡OFFSET�TO�ORIGINAL�STACK�POINTER*/TRACER‚MOVEM.L�D0-D1/A3-A5,-(A7)ƒSAVE�REGISTERS%ˆMOVE.W‚SR,-(A7)†SAVE�STATUS�REGISTER*ˆMOVE.L‚TRACEBEG,A3ƒADDRESS�OF�TRACE�TABLE"ˆORI.Wƒ#$700,SR‡INHIBIT�INTERRUPTS5ˆMOVE.L‚TRCPTR(A3),A5ˆGET�CURRENT�TABLE�ENTRY�POINTER(ˆCMP.LƒTRCLNG(A3),A5ƒSEE�IF�BEYOND�TABLE.ˆBNE.S„TRACER1‡TABLE�FILLED-START�AT�TOP�AGAIN+ˆLEA†TRCENTRS(A3),A5„ADDRESS�OF�FIRST�ENTRY.TRACER1�LEA†TRCENTSZ(A5),A4‡NEXT�ENTRY�POINTERˆMOVE.LƒA4,TRCPTR(A3)†SAVE�IT(ˆMOVE.Wƒ(A7)+,SRŒRESTORE�INTERRUPT�LEVEL**‰FILL�IN�ONE�ENTRY*&ˆMOVE.L‚D0,TRCD0(A5)„USERS�D0�TO�TABLE&ˆMOVE.L‚A0,TRCA0(A5)„USERS�A0�TO�TABLE ˆMOVE.L‚A6,TRCA6(A5)„A6�TO�TABLE9ˆMOVE.L‚TRACERSP(A7),A4ƒGET�RETURN�ADDRESS-HAS�TRACE�CODE,ˆMOVE.W‚(A4),TRCCODE(A5)‚TRACE�CODE�TO�TABLE,ˆADD.Lƒ#2,TRACERSP(A7)ƒUPDATE�RETURN�ADDRESS,ˆMOVE.W‚TRACERSP+4(A7),TRCSR(A5)…SR�TO�TABLE,ˆMOVE.L‚TRACERSP+6(A7),TRCPC(A5)ƒPC�TO�TABLE3ˆCMP.W‚#$EFFF,TRCCODE(A5)ƒIS�THIS�AN�I/O�INT�ENTRY?ˆBHI.S‚TRACER4ŽBRANCH�IF�NO8ˆMOVE.L�TRACERSP+12(A7),TRCA0(A5)ƒREPLACE�A0�WITH�2ND�PC* *‡SAVE�TIME*TRACER4 TR0.RDTIM'ˆMOVE.L‚D1,TRCTIME(A5)‡SAVE�TIME�OF�DAY*ˆMOVE.W‚D0,TRCTIM2(A5)…SAVE�IN�TRACE�ENTRY**‡RETURN*,ˆMOVEM.L‚(A7)+,D0-D1/A3-A5…RESTORE�REGISTERS ˆRTSœRETURNˆEND+D[1RDTIMER ASREL'M146818 RDTIMER SA!C(…READ TIMER routine for M146818 real time clock.[2pNSE BRDTIMER pTIME_LEF pTIMINTV4 BSBRDTIM pMIDNIGHT pTINTFLAG "$*3Q@ç <è|"8 ’¸ ’¸ ��x FßNu4ééé éééé4V1STDTIM ASREL'M146818 STDTIM SA!C&(…SET DATE & TIME FOR THE M146818 CLOCK CHIP‡2pPTMADDR pNSE pDATE pEXIT_SUB pTIME_LEF pKILLER FSTDTIM pSBRQPA pERROR_09 pMIDNIGHT FSCHED_DA ¢&¼J3*.(f`Aö@ç2<€tÿaAêNqLÜ.<&\¾„b˜‡Rƒ`ö|!à &8 –¸ –¸F3’U –„׸ ¸ aR 8 "8 ’¸ ’¸ �( x  a~|‚È� aºI3ª@àˆ@àˆ€üdH@@|FFß`Bÿ`"8 ’¸ Ò¸ �&\�"AB�tÿAúL3$ aBÿ<`aBÿ6Nu@ç|R¸ ¸&\ ¸ aºFßNs€üê`"B€0€ü=ASM M68000.M68000.SA/M68XXX.EXIT.SA,M68000.EXIT.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDéééééw ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68000‚Type�of�processorééééééé €=/*=/*†M68000.PVSEM.AF=/*6=/* Chain file to assemble M68XXX.PVSEM.SA for a 68000=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68000.PVSEM.LS=/*=/IFC \1ƒ=ARG�M68000.PVSEM.LS=/ENDIF=/*@=ASM M68000.M68000.SA/M68XXX.PVSEM.SA,M68000.PVSEM.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééé‰=/*=/*†M68000.SINT.AF=/*5=/* Chain file to assemble M68XXX.SINT.SA for a 68000=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68000.SINT.LS=/*=/IFC \1ƒ=ARG�M68000.SINT.LS=/ENDIF=/*>=ASM M68000.M68000.SA/M68XXX.SINT.SA,M68000.SINT.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.IOV.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééé éé’=/*=/*†M68000.SUPER.AF=/*6=/* Chain file to assemble M68XXX.SUPER.SA for a 68000=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68000.SUPER.LS=/*=/IFC \1ƒ=ARG�M68000.SUPER.LS=/ENDIF=/*@=ASM M68000.M68000.SA/M68XXX.SUPER.SA,M68000.SUPER.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.PANEL.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééééé›=/*=/*†M68000.TRAP0.AF=/*6=/* Chain file to assemble M68XXX.TRAP0.SA for a 68000=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68000.TRAP0.LS=/*=/IFC \1ƒ=ARG�M68000.TRAP0.LS=/ENDIF=/*?=ASM M68000.M68000.SA/M68XXX.TRAP0.SA,M68000.TRAP0.RO,\1;RZ=046=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*}=/*=ENDéé éééé¤=/*=/*†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=075=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééééé­K1COMINT ASREL'M68XXX COMINT SA!EH(…68000 common interrupt handler.ü2pLOADMMU pLOADMMUI pPTMADDR pMMULOAD pPREEMPT pPREEMPT_ BCOMINTZ pPERTURB_ pIOVCTBGN pVCTUBGN BCOMINT_P ,pSBWAKEUP pSBQEVNTI pTRACER pKILLER BCOMINT pRUNNER BISRERR BISRRTE ¨pBKG_FLAG pBKG_HEAD +2pTRACFLAG pBKG_DISP BCOMNISR f"JL3$  8 !gaAöî`*_aAì _N`Lßÿ\�|Jx fNsj?_f aA"ÈJ8 fJ3"@Ns?_'fö/,x Hî?ÿL× NiHî8`Aœ@ç8 !gaA Žî HçÿþNi/ /9L3€ ( oF,hHV/(@À@ÿ?"h 0P*n6`BÿZ fÿr\�,_( „!TCBgaBÿ@L3€€J@gÿJ @f AÖaBÿ.`ÿ: @fÿ2J�f&HC4<HBAÖaBÿNq`ÿHBHA(&L3@€64< ‚HB4`àâˆ&T�(,_" �!TCBgaBþÜCð=C^AÖaBþÎJ®@gþÖ$< ÿÿ3HCHD6`¤4éééé¶<1DISPATCH ASREL'M68XXX DISPATCHSA!FV(…68000 DISPATCHERã2pLOADMMU pREADYHD BPREEMPT pPREEMPT_ pPERTURB_ pTIMESLIC pSBREADY pTIMEOUT pTERM pTRACER pKILLER pRUNNER BDISPATCH pTRACFLAG pEXCSTACK pBKG_DISP pSBEXABRT BL1_D0_SA pSBLOGPHY "¦I3(€-@L× NiHî8AÖaAì.x |øÿMø!ô|"N ) gì,@.,fð#n ®H3 °-!Î /.D/.@Qø 1ø  pàÀ.-fh|øÿ*n6aA– n<€™AÖaBþÞ܇(F9n@ÿú)nBÿü-'fLîÿI3Hìÿÿ¾Lî0Hìÿî -/@-@B`ÿ*n6aBþ– n*8 "]…š�Nh,œ… n6aB'þ`Nq`"(F CN`&8 "UC _8ß¿Ãfú/?,ÿú/<<`L3$B† m n _-_¸-_¼/.)g".èg a nBýÀJfBýº \3!RAnCø  1pfBý¦aB&ý¢`BýžJFfBý˜AÖaB$ý’ HzýŽ�Ÿ`Bý† P�` €)R`BýtI3€~$.èffffNLî?ÿ,_` z,.ð n6aB'ýB`Nq`&~ F&(.O3 "ô·„f È®ìg-Cô`"R‡È®ìggBýRnø .ø°nøbBüþ~aN`Büö.�F3 /,x ½üg0/ f(.)g .è8gîè,_"¯Pø Ns,_L3$"/8 #NuaBü¨$< 4.&.(.8áL<AîàaBü†`®)Lîÿt®3@-@&Nuî ,X�`B ü`4È=1EXIT ASREL'M68XXX EXIT SA!P@(…68000 EXIT MODULEÿ2BEXIT_TER 2pPREEMPT pPREEMPT_ pPERTURB_ BEXIT_POS .BEXIT_ERR ”BEXIT_TRA ‚BEXIT_ASR .BEXIT_SUB BEXIT_EXC pRUNNER BERROR_01 BBERROR_02 FBERROR_03 JBERROR_04 NBERROR_05 RBERROR_06 VBERROR_07 Z×2BERROR_08 ^BERROR_09 bBERROR_10 fBERROR_11 jBERROR_12 nBERROR_13 rBERROR_14 vBERROR_15 zBERROR_16 ~pDISPATCH BEXIT_D0A 2BEXIT_D0S pEXCSTACK pBKG_DISP pL1_D0_SA "´L3R .`p|Jx f Lî?þ,_NsjAâaAÞJ8 gè`AÔB®L× NiHî8`H3€AÀp`Np`Jp`Fp`Bp`>p`:p`6p`2p `.p `*p `&p `"p `p`p`p:3@`=@=|ç�G` H@0<.H@ x QˆYˆ.H|`ÿV4éééé éÑK1PVSEM ASREL'M68XXX PVSEM SA!QA(…68000 TRAP 0--SEMAPHORE ROUTINEŒ2BPSEM pSBREADY BVSEM ªBSBP BSVXSTAK VBSBV ªpKILLER BPSWAIT 2pDISPATCH pEXCSTACK "æJ3€@ç|JÐkü0ãHâ@S@0€kFßNua:U.ra�FßAÖaAÔ`AÐî ,B® (F3f!NNu*@ - fø+N NuHç .&|ð&î-HîÿtNl-L< 8 Kï ��I3 €Pn@rIî™ÀäHd8Ý`(ÝQÈÿüLß0NuaBÿX@ç|JÐkü0ãHâ@R@o0€,3FßNu/ "h!i €0€B© © ,"_FßNu4ééééééÚV1SINT ASREL'M68XXX SINT SA!R (…68000 DIRECTIVE--SIMULATE INTERRUPT TO ISRW2pVCTUBGN pEXIT_SUB ESINT pTRACER pERROR_09 pERROR_14 pTRACFLAG %ZK3€@B‚,"x J1 oAðBƒ,g Co`AÞá‹à Hz@çåŠ B/?8!g'3BHaA¾îNs8!gaA®Ý`A¨4ééé éééãW1SUPER ASREL'M68XXX SUPER SA!S(…M68000 DIRECTIVE--SWITCH TO SUPERVISOR MODEb2pLOADMMU pEXIT_SUB pRUNNER pPANEL FSUPER pERROR_01 pEXCSTACK pSBLOGPHY &VN3 D . €Kª{ûfAôJnpg x (fAà x Uˆ, z n6aAÎ`Nq`AÆ*FLî 3 ÿN•,x *n6aA°`A¬4ééééééìL1TRAP0 ASREL'M68XXX TRAP0 SA!T#(…68000 TRAP #0 handler and table.ÿ2pKILLERT0 pPSEM pEXQEVNTI pEXQEVNTN pEXQEVNTT pVSEM pCALL_GUA pRDTIMER BTRAP0 PHI_DIR_N %pWAKEUPX pLOGPHY BTABLE0 JpKILLER pGETTCB pGTXTCB pEXRQPA pTCBCR pPAUSE pREADY pPAGEFREE pBKG_SCHE =2pFNDGSEG pFNDTSEG pPAGEALOC pFNDUSEM pLOGPHYO "–H3@ fNsT� €%bAîЀ0;2Nû./ �%bÒ�2;Aû±ü(f �@g~3ÿÿÿT¯"NuA¶A¶A¶A!¶A&¶A"¶A¶A%¶A¶A$¶A¶A¶A'¶A¶A ¶A¶A¶A¶A¶A¶A¶A¶A¶A¶A¶A¶A(¶A¶,3þÀA¶A¶A¶A¶A¶A¶A¶ÿÔA#¶A¶4  éééééõL1TRAP1 ASREL'M68XXX TRAP1 SA!U(…68000 TRAP #0 handler and table.÷2pSUSPEND pRTEVENT pCDIR pSBGETTCB pSEGSHAR pTSKWAIT pWTEVENT pASQEVENT pGTTASKID pASQSTATS pCMR pCISR pEXIT_POS pTSKINFO pEXIT_ERR pSBREADY pEXIT_SUB pTSKATTR pTSKSTART pSINT pTERM BTRAP1 û2BTTB_01 :BTTE_01 @pGTDTIM pEXPVCT pCRTCB pATTSEG pTRACER pDEMON pDSERVE pEXMON pSTDTIM pATSEM pCRSEM pFLUSHC pABORT pDESEM pDESEMA pEXMMSK pRUNNER pAKRQST pTRPVCT pDELAY þ2pDELAYW pDERQST pRCVSA pSERVER pTFRSEG pRELINQ pUDRBEG pISRRTE pMOVELL pRESUME pMOVEPL pSGSEM pRQSTPA pSUPER pSTOPT pWAKEUP pWTSEM pPSTATE pERROR_01 pERROR_02 pERROR_03 pREXMON pSETPRI  2pRSTATE pTERMT pASQREAD pTRACFLAG pASQALOC pGTTNAME pCKEXMON pGTEVENT pASQFREE pSEGALOC pSNAPTRAC pDCLSHAR pSEGDEAL pSBLOGPHY "lF3@?_'fD|/,x 6Hî?ÿ.)g.å@k. @,b,(H$;,j g*@ •!TCB^3!UUg`AN¼*NNû `AA²`:`®`AL¦AL¤ÀAZ¤ÀA]¤ÀA>¤@A)¤ÀA¤ÀAB¤@A\¤A[¤f3UUUUÀA<¤@A¤@A(¤ÀAV¤@ A#¤A2¤A%¤@ AR¤A¤ÀAC¤A¤ÀAI¤A9¤A?¤ÀA"¤À AP¤f3UUUU@AH¤@$A'¤@8A8¤ÀA¤ÀAF¤A:¤ÀAU¤AY¤A¤AS¤ÀA¤A¤A¤AX¤AL¤AL¤f3UUUU@ A/¤@ AJ¤@ AE¤@ A3¤@ A0¤A4¤AL¤AL¤AL¤AL¤@A=¤A,¤A;¤ÀA7¤AL¤AL¤f3UUUUAL¤@A¤AG¤A¤ÀA¤@A$¤AL¤ÀA-¤ÀA+¤À A5¤À AQ¤À AK¤À AO¤AL¤AL¤@AD¤R3T�€@A.¤@A&¤A1¤8 TgaB*þjÿ.)g".èg~aBWþPå@kN @,bDGúþžR3 H$3g2*HE…ÿ, n6aB^þ$`Nq`BMþ(FgAÔaBþ``BNþ*HNó I3P`BLýþ$x @$ gôä@D@°jnêS@Àü EòJªgÚ4*‚f"²®fÈ-W8BnH>3$?Hz @ç$jNÒ0.HfBý¬0gB!ý¦ @fAÖaB ýš`Bý–4þ×'M68010 AUTOVCT SAªqqBUSERRFTEQ44 qqCOMINT AF==qqDISPATCHAFFFqqEXCEPT AFOOq  qEXCEPT SAXXqqEXIT AFaaqqM68010 SAjjqqPVSEM AFssqqSINT AF||qqSUPER AF……qqTRAP0 AFŽŽqqTRAP1 AF——qqCOMINT RO  qqDISPATCHRO©©qqEXCEPT RO²²qqEXIT RO»»qqPVSEM ROÄÄqqSINT ROÍÍqqSUPER ROÖÖqq6AUTOVCTƒIDNTƒ1,1�68010�--�Intercept�autovct�interrupts*ˆ*********************ˆ*�M68010.AUTOVCT.SA* *ˆ*‡1.00‡**ˆ*********************3*„AUTOVECT�-�Autovectors�1-6�point�to�this�routine.*>*‰The�interrupt�handler�on�the�VME120�and�VME128�has�two�modes@*‰of�operation,�normal�and�alternate.ƒWhen�the�interrupt�handlerE*‰operates�in�the�normal�interrupt�mode,�interrupt�acknowledge�cyclesC*‰that�acknowledge�VMEbus�interrupt�requests,�use�the�vector�passed>*‰by�the�interrupting�slave.‚Interrupt�acknowledge�cycles�thatB*‰acknowledge�software�abort�interrupt�requests�use�auto-vector�7.@*‰When�the�interrupt�handler�operates�in�the�alternate�interrupt<*‰mode,�all�interrupt�acknowledge�cycles�use�the�auto-vector;*‰corresponding‚to�the�level�of�the�interrupt�request�beingB*‰acknowledged.‚The�interrupting�device�(VMEbus�or�68901)�does�not;*‰see�the�acknowledge�cycle;�thus�it�continues�to�drive�its*‰interrupt�request�line.*?*‰The�alternate�interrupt�mode�is�entered�when�a�bus�error�or�a;*‰retry�occurs�to�the�MPU,�if�the�ALTCLR*�bit�is�set�in�the*‰control�register.* ** BUS ERROR NOTES AS APPLIED TO VME120/128 F*‚Bus�error�handling�on�the�VME120/128�poses�special�problems.‚We�mustF*‚guard‚against�executing�in�an�interrupt�service�routine�while�we�areE*‚processing�bus�errors.‚The�following�problem�may�arise�if‚interrupt?*‚service‚is‚executed‚during‚bus‚error‚processing.ƒA�process�atF*‚interrupt�level�0�starts�to�execute�an�ADD.L�#1,COUNT.‚Count�is�readF*‚from‚memory,�1�is�added�to�it,�but�before�it�is�written�back,�we�getF*‚a�bus�error.‚During�bus�error�processing�a�level�2�interrupt�occurs.D*‚The‚interrupt‚service�routine�performs�a�SUB.L�#1,COUNT.‚Interrupt?*‚service�concludes�and�we‚get‚back‚to‚the‚write‚portion‚of‚theA*‚instruction‚that‚is‚adding‚#1‚to�COUNT.‚The�effect�of�the�SUB.L*‚#1,COUNT�is�lost. >*‚S.�F.ˆwrote�a�bus�error�summary�dated�11/28/83�that‚is‚quiteF*‚useful‚in�understanding�what's�going�on�with�bus�errors�on�these�two *$%$8B*‚boards.‚There�are�three�types�of�bus�errors‚(crash‚and‚burn,‚MMU+*‚fault,�benign).‚These�are�outlined�below: F*‚CRASH�AND�BURN�BUS�ERROR.‚A�bus�error�of�this�type�can�be�recognizedE*‚because�either�bit�2�or�bit�3�of�the�module�status�register‚will‚beA*‚set.ƒBit‚2‚represents‚a�BERR*�signal�line�going�true.‚Bit�3�setC*‚represents�a�parity�error.‚Refer�to�the�VME120‚spec‚section‚6.9.1F*‚(module�status).‚The�module�status�register�that�we�want�to�check�isE*‚really�port�6�(IPRB)�of�the�MK68901�multi-function‚peripheral‚chip.G*‚Note�that�to�enable�this�function�on�the�board,�we�must�write�ones�toF*‚the�corresponding�positions�on�the�port�4�(IERB)�at�INITIO�time.‚TheC*‚above‚discussion‚applies‚only�to�the�VME120.‚The�VME128�also�usesD*‚the�same�bits�but�in�addition�uses�bit�1�for�VMXbus�errors.ƒOn‚theB*‚120,‚bit‚1‚is‚a�software�readable�switch.‚If�alternate�interruptG*‚mode�is�enabled,�all�subsequent�interrupts�will�be�autovectored�untilE*‚alternate‚interrupt�mode�is�cleared.‚We�go�into�! alternate�interrupt!*‚mode�for�any�type�of�bus�error. D*‚MMU�FAULT�BUS�ERROR.‚This�type�of�bus�error�should�only‚occur‚whenF*‚we�are�in�user�mode.‚Bits�2�and�3�of�the�module�status�register�willE*‚NOT�be�set�for�this�type�of�bus�error.‚Note�that�even�though�we‚are5*‚in�user�mode,�a�bus�error�need�not�be�an�MMU�fault. F*‚BENIGN�BUS�ERROR.‚If�the�bus�error�is�neither�of�the�above�two�typesD*‚then�it�must�be�a�benign�bus�error.‚If�it�is�we‚should‚essentially**‚perform�an�RTE�to�retry�the�instruction. #*‚AUTOVECTOR�SCHEME�WITH�BUS�ERRORS D*‚We�should�normally�operate�VERSAdos�with�the�ALTCLR�(bit‚6)‚in‚theF*‚module�control�register�set�to�1.‚The�module�control�register�is�NOT*‚associated�with�the�68901.*­Bit�6�(ALTCLR*)�is�the�key>*‚bit�here.‚Refer�to‚the‚VME120‚spec,‚section‚6.9.2.ƒWe‚shouldE*‚normally‚run�with�bit�6�set�to�1�(accomplished�during�INITIO).‚ThisF*‚will�allow�interrupts�to�occur�normally�but�when�a�bus�error‚occurs,E*‚all‚subsequent‚interrupts�will�be�converted�into�an�autovector�withE*‚the�same�interrupt�priority�level.‚Note�that�the�interrupt�will‚notE*‚be‚acknowledged‚so�the�peripheral�or�other�interrupting�device�willF*‚keep�the�interrupt�active.‚To�clear�the�alternate�interrupt�mode,�weC*‚must‚toggle‚the‚ALTCLR�bit�to�a�0�and�then�back�to�a�1.‚The�basicF*‚idea�here�it�to�get�interrupts�masked�while�handling�a�bus�error.‚AsE*‚soon‚as‚possible�in�the�bus�error�handler�we�should�mask�interruptsC*‚to�7.‚Because�there�is�a�small�amount�of�time�after‚the‚bus‚errorF*‚occurred‚and�before�we�can�mask�the�interrupts�we�need�to�be�able�toA*‚respond�properly�when�an�interrupt‚causes‚us‚to‚autovector.ƒTheA*‚solution‚to‚this‚is‚to‚code‚up�a�routine�which�is�pointed�at�byC*‚autovectors�1-6.‚The�situation�is�further�complicated‚by‚the‚factB*‚that‚dual‚port‚lock‚is�possible.‚This�is�a�situation�in�which�anF*‚external�device�is�trying�to�reach�on-board�to�the�VME120/128�at‚theF*‚same�time�the�VME120/128�is�trying�to�reach�off-board.‚In�most�casesG*‚the�hardware�will�cause�a�retry�on�the�VME120/128�but�we�will�also�goD*‚into‚alternate‚interrupt�mode.‚In�this�case�we�could�arrive�at�theD*‚autovector�routine�without�ever�having�experienced�a�bus‚error.ƒIfE*‚the‚instruction‚the�120�was�trying�to�execute,�however,�was�a�TAS�a%*‚benign�bus�error�will�be�generated. A* The EXCEPT bus error module should contain the following logic: * mask interrupts to 7; * If error was in user mode then*„handle�as�MMU�fault:*„{mmu�fault�logic�either�returns�to�faulting�task�via�RTE=*…or�returns�to�this�module�via�RTS�if�not�regular�mmu�fault}!* clear alternate interrupt mode;E* If module status register indicates 'crash and burn' bus error then-*„clear�error�bits�in�module�status�register;(*„handle�as�exception;�{as�4.3�would�do}* else *„RTE�{benign�bus�error�-�retry} G*______________________________________________________________________*@*‡ENTRY:�Normal�interrupt�information�associated�with�autovector*Žinterrupt�is�on�stack. *�SP…-->�SR *�SP+2‡PC *�SP+6‡VOR*?*‡EXIT�:�Alternate�interrupt�mode�is�always�cleared.‚Interrupts6*Žare�masked�if�we�entered�from�the�bus�error�handler.* *‡ALGORITHM:8*ŽIF�we�came�from�the�bus�error�handler�(in�EXCEPT)�THEN>*‘Set�the�SR�image�on�the�stack�to�indicate�masked�interrupts.@*ŽClear�alternate�interrupt�mode�(put�us�back�into�normal�mode).*ŽReturn�via�RTE.*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠLIST*‰INCLUDE�9995.&.STR.EQ ŠXDEFƒAUTOVCT ŠXREFƒBERR1 ŠXREFƒBERR2 ŠSECTION�LEVEL00* AUTOVCTƒEQU„*ŠMOVE.L�A0,-(A7)*-*�Stack�now�looks�like�this‰SP…-->�Copy�of�A0 *£SP+4ƒ-->�SR *£SP+6‡PC *£SP+$10…VORŠBTSTƒ#SRMODE,4(A7)/ŠBEQ.S‚CLRALT�Branch�if�we�came�from�user�mode. "*£We�came�from�supervisor�routine.$*£See�if�we�came�from�EXCEPT�module. ,ŠLEA„BERR1(PC),A0‡Address�of�BSR.S�in�EXCEPT9ŠCMP.L‚6(A7),A0‹Compare�to�pushed�bus�error�addr�on�stack+ŠBEQ.S! ‚BUSERR�Branch�if�we�came�from�EXCEPT2ŠLEA„BERR2(PC),A0‡Address�of�OR�#0700,SR�in�EXCEPTŠCMP.L‚6(A7),A03ŠBNE.S‚CLRALT�Branch�if�we�did�NOT�come�from�EXCEPT E* The following instruction is executed only if an interrupt occurredC*ƒon�the�two�instructions�in�EXCEPT�between�the�occurrence�of�a�bus&*ƒerror�and�the�masking�of�interrupts. BBUSERR„OR…#$0700,4(A7)‡Set�SR�image�on�stack�for�masked�interrupts )CLRALT„CLR_ALT_MODEŽClear�alternate�mode.ŠMOVE.L�(A7)+,A0ŠRTEŠENDéé#***********************************#* Beginning of M68010.BUSERRFT.EQ *#***********************************ŠPAGE**‰BUS�ERROR�FORMAT�FOR�68010* ŠOFFSET�0 ŠDS.Wƒ1‡SR ŠDS.Wƒ2‡PC ŠDS.Wƒ1‡VOR#SSWB†DS.Wƒ1‡SPECIAL�STATUS�WORD�BUSAOB‡DS.Wƒ2‡FAULT�ADDRESSŠDS.Wƒ1DOB‡DS.Wƒ1‡DATA�OUTPUT�BUFFERŠDS.Wƒ1DIB‡DS.Wƒ1‡DATA�INPUT�BUFFERŠDS.Wƒ1'IRC‡DS.Wƒ1‡INSTRUCTION�REGISTER�(INPUT)ŠDS.Wƒ16* *‰SSWBƒFORMAT*3SSWBRR„EQU„15†RERUN�FLAG�--�0=PROCESSOR,�1=SOFTWARE&SSWBIF„EQU„13†INSTRUCTION�FETCH�TO�IRCSSWBDF„EQU„12†DATA�FETCH�TO�DIB%SSWBRM„EQU„11†READ-MODIFY-WRITE�CYCLE3SSWBHB„EQU„10†HIGH�BYTE�TRANSFER�FROM�DOB�OR�TO�DIBSSWBBY„EQU„9‡BYTE�TRANSFER*SSWBRW„EQU„8‡READ/WRITE�--�0=WRITE,�1=READ ******************************** * Ending of M68010.BUSERRFT.EQ * ********************************éééé,!=/*=/*†M68010.COMINT.AF=/*7=/* Chain file to assemble M68XXX.COMINT.SA for a 68010=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68010.COMINT.LS=/*=/IFC \1ƒ=ARG�M68010.COMINT.LS=/ENDIF=/*@=ASM M68010.M68010.SA/M68XXX.COMINT.SA,M68010.COMINT.RO,\1;RZ=66=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.IOV.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDé" ééééé5=/*=/*†M68010.DISPATCH.AF=/*9=/* Chain file to assemble M68XXX.DISPATCH.SA for a 68010=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68010.DISPATCH.LS=/*=/IFC \1ƒ=ARG�M68010.DISPATCH.LS=/ENDIF=/*F=ASM M68010.M68010.SA/M68XXX.DISPATCH.SA,M68010.DISPATCH.RO,\1;MRZ=065=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDééééé>=/*=/*†M68010.EXCEPT.AF=/*7=/* Chain file to assemble M68XXX.EXCEPT.SA for a 68010=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68010.EXCEPT.LS=/*=/IFC \1ƒ=ARG�M68010.EXCEPT.LS=/ENDI" F=/*B=ASM M68010.EXCEPT.SA/M68XXX.EXCEPT.SA,M68010.EXCEPT.RO,\1;MRZ=065=/*{ Included files are:=/*ƒM68010.M68010.SA=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDééééééGŠINCLUDE�M68010.M68010.SA3ALTINT„SET„0’Indicates�no�alternate�interrupt�mode.'*£Alternate�interrupt�mode�applies�only*£to�VME120/VME128.ééééééé# P=/*=/*†M68010.EXIT.AF=/*5=/* Chain file to assemble M68XXX.EXIT.SA for a 68010=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68010.EXIT.LS=/*=/IFC \1ƒ=ARG�M68010.EXIT.LS=/ENDIF=/*>=ASM M68010.M68010.SA/M68XXX.EXIT.SA,M68010.EXIT.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDéééééY ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68010‚Type�of�processorééééé# ééb=/*=/*†M68010.PVSEM.AF=/*6=/* Chain file to assemble M68XXX.PVSEM.SA for a 68010=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68010.PVSEM.LS=/*=/IFC \1ƒ=ARG�M68010.PVSEM.LS=/ENDIF=/*@=ASM M68010.M68010.SA/M68XXX.PVSEM.SA,M68010.PVSEM.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééék=/*=/*†M68010.SINT.AF=/*5=/* Chain file to assemble M68XXX.SINT.SA for a 68010=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68010.SINT.LS=/*=/IFC \1ƒ=ARG�M68010.SINT.LS=/ENDIF=/*>=ASM M68010.M68010.SA/M68XXX.SINT.SA,M68010.SINT.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.IOV.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéé$ éééét=/*=/*†M68010.SUPER.AF=/*6=/* Chain file to assemble M68XXX.SUPER.SA for a 68010=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68010.SUPER.LS=/*=/IFC \1ƒ=ARG�M68010.SUPER.LS=/ENDIF=/*@=ASM M68010.M68010.SA/M68XXX.SUPER.SA,M68010.SUPER.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.PANEL.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééééé}=/*=/*†M68010.TRAP0.AF=/*6=/* Chain file to assemble M68XXX.TRAP0.SA for a 68010=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68010.TRAP0.LS=/*=/IFC \1ƒ=ARG�M68010.TRAP0.LS=/ENDIF=/*?=ASM M68010.M68010.SA/M68XXX.TRAP0.SA,M68010.TRAP0.RO,\1;RZ=050=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*}=/*=END$ éééééé†=/*=/*†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=075=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDéééééé�% K1COMINT ASREL'M68XXX COMINT SA!X(…68010 common interrupt handler.ü2pLOADMMU pLOADMMUI pPTMADDR pMMULOAD pPREEMPT pPREEMPT_ BCOMINTZ pPERTURB_ pIOVCTBGN pVCTUBGN BCOMINT_P ,pSBWAKEUP pSBQEVNTI pTRACER pKILLER BCOMINT pRUNNER BISRERR BISRRTE ¬pBKG_FLAG pBKG_HEAD +2pTRACFLAG pBKG_DISP BCOMNISR f"PL3$  8 !gaAöî`*_aAì _N`Lßÿ\�|Jx fNsj?_f aA"ÈJ8 fJ3"@Ns?_'fö/,x Hî?ÿL× NiHî8`Aœ@ç8 !gaAŽî HçÿþNi/ /9I3€( oF,hHV?<„/(@À@ÿ?"h 0P*n6`BÿV fÿnP�,_( „!TCBgO3@ aBÿ<€™AÖaBþÞ܇(F9n@ÿú)nBÿü-'fLîÿI3Hìÿÿ¾Lî0Hìÿî -/@-@B`ÿ*n6aBþ– n*8 "]…š�Nh,œ… n6aB'ýŒ`Nq`"(F CN`&8 "UC _8ß¿Ãfú/F3?,ÿú/<<`B† m n _-_¸-_¼/.)g".èg a n^3�…IBý.JfBý( nCø  1pfBýaB&ý`Bý JFfBýAÖaB$ý Hzüü�Ÿ`Büô P�M3` €)R`Büâ~$.èffffNLî?ÿ,_` z,.ð n6aB'ü°`I3€Nq`&~ F&(.ô·„f È®ìg-Cô`"R‡È®ìggBü|Rnø .ø°nøbL3ˆ€Bül~aN`Büd.�/,x ½üg0/ f(.)g .è8gîè,_"¯L3�Pø Ns,_"/8 #NuaBü$< 4.&.(.8áL<AîàaBûô`®)3)Lîÿt®-@&Nuî ,X�`B ûÎ4ª=1EXIT ASREL'M68XXX EXIT SA"(…68010 EXIT MODULEÿ2BEXIT_TER 2pPREEMPT pPREEMPT_ pPERTURB_ BEXIT_POS .BEXIT_ERR ”BEXIT_TRA ‚BEXIT_ASR .BEXIT_SUB BEXIT_EXC pRUNNER BERROR_01 BBERROR_02 FBERROR_03 JBERROR_04 NBERROR_05 RBERROR_06 VBERROR_07 Z×2BERROR_08 ^BERROR_09 bBERROR_10 fBERROR_11 jBERROR_12 nBERROR_13 rBERROR_14 vBERROR_15 zBERROR_16 ~pDISPATCH BEXIT_D0A 2BEXIT_D0S pEXCSTACK pBKG_DISP pL1_D0_SA "´L3R .`p|Jx f Lî?þ,_NsjAâaAÞJ8 gè`AÔB®L× NiHî8`H3€AÀp`Np`Jp`Fp`Bp`>p`:p`6p`2p `.p `*p `&p `"p `p`p`p:3@`=@=|ç�G` H@0<.H@ x QˆYˆ.H|`ÿV4éé& ééé³K1PVSEM ASREL'M68XXX PVSEM SA"(…68010 TRAP 0--SEMAPHORE ROUTINEŒ2BPSEM pSBREADY BVSEM ªBSBP BSVXSTAK VBSBV ªpKILLER BPSWAIT 2pDISPATCH pEXCSTACK "æJ3€@ç|JÐkü0ãHâ@S@0€kFßNua:U.ra�FßAÖaAÔ`AÐî ,B® (F3f!NNu*@ - fø+N NuHç .&|ð&î-HîÿtNl-L< 8 Kï ��I3 €Pn@rIî™ÀäHd8Ý`(ÝQÈÿüLß0NuaBÿX@ç|JÐkü0ãHâ@R@o0€,3FßNu/ "h!i €0€B© © ,"_FßNu4éééééé¼V1SINT ASREL'M68XXX SINT SA"@(…68010 DIRECTIVE--SIMULATE INTERRUPT TO ISRW2pVCTUBGN pEXIT_SUB ESINT pTRACER pERROR_09 pERROR_14 pTRACFLAG %bJ3€@B‚,"x J1 oAðBƒ,g Co`AÞá‹à ?<„Hz @ç?<„åŠ B/?03$$€8!gaA¶îNs8!gaA¦Ý`A 4é& éééééÅW1SUPER ASREL'M68XXX SUPER SA"7(…M68010 DIRECTIVE--SWITCH TO SUPERVISOR MODEb2pLOADMMU pEXIT_SUB pRUNNER pPANEL FSUPER pERROR_01 pEXCSTACK pSBLOGPHY &VN3 D . €Kª{ûfAôJnpg x (fAà x Uˆ, z n6aAÎ`Nq`AÆ*FLî 3 ÿN•,x *n6aA°`A¬4ééééééÎ'M68010 TRAP0 ROããqqTRAP1 ROììqq' L1TRAP0 ASREL'M68XXX TRAP0 SA"C(…68010 TRAP #0 handler and table.ÿ2pKILLERT0 pPSEM pEXQEVNTI pEXQEVNTN pEXQEVNTT pVSEM pCALL_GUA pRDTIMER BTRAP0 PHI_DIR_N %pWAKEUPX pLOGPHY BTABLE0 RpKILLER pGETTCB pGTXTCB pEXRQPA pTCBCR pPAUSE pREADY pPAGEFREE pBKG_SCHE =2pFNDGSEG pFNDTSEG pPAGEALOC pFNDUSEM pLOGPHYO "žH3fNsT�?o>Ÿ €%bAæÐ€0;2Nû./ �%bÒ�2;Aû±ü(f v3ÿÿÿ �@gT¯"NuA®A®A®A!®A&®A"®A®A%®A®A$®A®A®A'®A®A ®A®A®A®A®A®A®A®A®A®<3ÿìA®A®A(®A®A®A®A®A®A®A®A®ÿÔA#®A®4éééééÛL1TRAP1 ASREL'M68XXX TRAP1 SA"3(…68010 TRAP #0 handler and table.÷2pSUSPEND pRTEVENT pCDIR pSBGETTCB pSEGSHAR pTSKWAIT pWTEVENT pASQEVENT pGTTASKID pASQSTATS pCMR pCISR pEXIT_POS pTSKINFO pEXIT_ERR pSBREADY pEXIT_SUB pTSKATTR pTSKSTART pSINT pTERM BTRAP1 û2BTTB_01 :BTTE_01 @pGTDTIM pEXPVCT pCRTCB pATTSEG pTRACER pDEMON pDSERVE pEXMON pSTDTIM pATSEM pCRSEM pFLUSHC pABORT pDESEM pDESEMA pEXMMSK pRUNNER pAKRQST pTRPVCT pDELAY þ2pDELAYW pDERQST pRCVSA pSERVER pTFRSEG pRELINQ pUDRBEG pISRRTE pMOVELL pRESUME pMOVEPL pSGSEM pRQSTPA pSUPER pSTOPT pWAKEUP pWTSEM pPSTATE pERROR_01 pERROR_02 pERROR_03 pREXMON pSETPRI  2pRSTATE pTERMT pASQREAD pTRACFLAG pASQALOC pGTTNAME pCKEXMON pGTEVENT pASQFREE pSEGALOC pSNAPTRAC pDCLSHAR pSEGDEAL pSBLOGPHY "pF3@?_'fD|/,x 6Hî?ÿ' .)g.å@k. @,b,(H$;,j g*@ •!TCB^3!UUg`AN¼*NNû `AA²`:`®`AL¦AL¤ÀAZ¤ÀA]¤ÀA>¤@A)¤ÀA¤ÀAB¤@A\¤A[¤f3UUUUÀA<¤@A¤@A(¤ÀAV¤@ A#¤A2¤A%¤@ AR¤A¤ÀAC¤A¤ÀAI¤A9¤A?¤ÀA"¤À AP¤f3UUUU@AH¤@$A'¤@8A8¤ÀA¤ÀAF¤A:¤ÀAU¤AY¤A¤AS¤ÀA¤A¤A¤AX¤AL¤AL¤f3UUUU@ A/¤@ AJ¤@ AE¤@ A3¤@ A0¤A4¤AL¤AL¤AL¤AL¤@A=¤A,¤A;¤ÀA7¤AL¤AL¤f3UUUUAL¤@A¤AG¤A¤ÀA¤@A$¤AL¤ÀA-¤ÀA+¤À A5¤À AQ¤À AK¤À AO¤AL¤AL¤@AD¤R3T�€@A.¤@A&¤A1¤8 TgaB*þjÿ.)g".èg~aBWþPå@kN @,bDGúþžR3 H$3g2*HE…ÿ, n6aB^þ$`Nq`BMþ(FgAÔaBþ``BNþ*HNó I3P`BLýþ$x @$ gôä@D@°jnêS@Àü EòJªgÚ4*‚f"²®fÈ-W8BnHB3 ??<„Hz @ç$jNÒ0.HfBý¨0gB!ý¢ @fAÖaB ý–`Bý’4ä'M68020 CACR EQùù'qqEXCEPT AFqqM68020 SA  qqEXCEPT ROqq*>*‚These�equates�describe�the�control�bits�in�the�68020's�CACR.*CACR_E„EQU„0’1�=�Enable�cache.CACR_F„EQU„1’1�=�Freeze�cache.4CACR_CEƒEQU„2’1�=�Clear�cache�entry�w/�addr�in�CAAR.)CACR_C„EQU„3’1�=�Clear�all�cache�entries.  *I*‚These�macros�generate�the�code�to�read�and�write�the�68020's�CACR.‚ThisH*‚is�necessary�for�now�because�the�68020�assembler�is�not�being�releasedH*‚in�time�for�4.4�VERSAdos,�which�supports�the�68020.‚The�following�code<*‚demonstrates�their�use;�this�code�flushes�the�68020�cache.!*‰READ_CACR_INTO_D�3ˆD3�<--�CACR.=*‰BSETƒ#CACR_C,D3‰Set�the�bit�that�causes�the�cache�to�clear."*‰WRITE_CACR_FROM_D�3‡CACR�<--�D3.*READ_CACR_INTO_DƒMACRO ŠIFGEƒ\1-0 ŠIFLEƒ\1-7 ŒDC.Wƒ$4E7AŒDC.Wƒ\1<<12+2ŒMEXITŠENDCŠENDC4ŠFAILƒ499�Bad�register�specification�for�this�macro.ˆENDM WRITE_CACR_FROM_DƒMACRO ŠIFGEƒ\1-0 ŠIFLEƒ\1-7 ŒDC.Wƒ$4E7BŒDC.Wƒ\1<<12+2ŒMEXITŠENDCŠENDC4ŠFAILƒ499�Bad�register�specification�for�this�macro.ˆENDM ééé( éñ(=/*=/*†M68020.EXCEPT.AF=/*7=/* Chain file to assemble M68XXX.EXCEPT.SA for a 68020=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68020.EXCEPT.LS=/*=/IFC \1ƒ=ARG�M68020.EXCEPT.LS=/ENDIF=/*B=ASM M68020.M68020.SA/M68XXX.EXCEPT.SA,M68020.EXCEPT.RO,\1;MRZ=065=/*{ Included files are:=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDééééééú ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68020‚Type�of�processoréééé( éééQ1EXCEPT ASREL'M68XXX EXCEPT SA"$(…68020 USER TRAP AND EXCEPTION HANDLERþ2pMMUFAULT pEXIT_TER pPREEMPT_ pTIAT BPROGINT2 pBPROGINT3 rBPROGINT4 tBPROGINT5 vBPROGINT6 xBPROGINT7 zBPROGINT8 |BPROGINT9 †BPROGINTA ~BPROGINTB €pEXIT_TRA pEXIT_EXC BBERR1 ppSVXSTAK pTTB_01 ö2pSBQEVNTN pTTE_01 pTRACER pKILLER pRUNNER pISRERR pERROR_03 BTRPVCT2 BTRPVCT3 pDISPATCH BTRPVCT4 pTRACFLAG BTRPVCT5 BTRPVCT6  BTRPVCT7 pEXCSTACK BTRPVCT8 BTRPVCT9 BCKEXMON —2pMACSTRC BTRPVCTA BTRPVCTB BTRPVCTC pSBEXABRT BTRPVCTD pMMUHERE BTRPVCTE BTRPVCTF pEQDQ pSBLOGPHY "NH3a aaaaaaaaaa a aaaaNq?/_'g/ gèaAÈ//NI3A ,y(Hî?ÿ8 !g @çaA¨ªT�Kú`Ô)La*8 "]…š�Nh,œ… n6I3@@aB'ýr`Nq`"(F CN`&8 "UC _8ß¿Ãfú/?,ÿú/<<`B† m n  _-_¸R3�…-_¼/.)g".èg a nBýJfBý nCø  1pfBüúaB&üöV3I`BüòJFfBüìAÖaB$üæ Hzüâ�Ÿ`BüÚ P�` €)R`BüÈ~$.èfffI3fNLî?ÿ,_` z,.ð n6aB'ü–`Nq`&~ F&(.ô·„f È®ìg-CôO3€ˆ€`"R‡È®ìggBübRnø .ø°nøbBüR~aN`BüJ.�/,x ½üg0/ I3�f(.)g .è8gîè,_"¯Pø Ns,_"/8 #NuaBûü$< 4.L3&.(.8áL<AîàaBûÚ`®)Lîÿt®-@&Nuî ,X�`B û´4 'M68230 M68230 EQ!!)qqRDTIMER AF**qqRDTIMER SA336qqTIMEINT AF<<qqTIMEINT SAEE=qqRDTIMER RONNqqTIMEINT ROWWqq) !*********************************!* Beginning of M68230.M68230.EQ *!*********************************‰PAGE*:*ˆThese�are�the�equates�for�the�M68230�Parallel�Interrupt/6*ˆTimer�chip�(MFP)�as�used�on�the�VME115�board�for�the:*ˆsystem�timer,�local�serial�port,�and�local�printer�port.* 0PIT_BASE‚EQU„$F81001ŒBase�address�for�PI/T�chip.#*£All�registers�have�odd�addresses.(PGCR†EQU„0’Port�General�Control�Register(PSRR†EQU„2’Port�Service�Request�Register*PADDR…EQU„4’Port�A�Data�Direction�Register*PBDDR…EQU„6’Port�B�Data�Direction�Register*PCDDR…EQU„8’Port�C�Data�Direction�Register*PIVR†EQU„10‘Port�Interrupt�Vector�Register#PACR†EQU„12‘Port�A�Control�Register#PBCR†EQU„14‘Port�B�Control�Register PADR†EQU„16‘Port�A�Data�Register PBDR†EQU„18‘Port�B�Data�Register%PAAR†EQU„20‘Port�A�Alternate�Register%PBAR†EQU„22‘Port�B�Alternate�Register PCDR†EQU„24‘Port�C�Data�RegisterPSR‡EQU„26‘Port�Status�Register**"TCR‡EQU„$20�Timer�Control�Register,TIVR†EQU„$22�Timer�Interrupt�Vector�Register**CPRH†EQU„$26�Counter�Preload�Register�High,CPRM†EQU„$28�Counter�Preload�Register�Middle)CPRL†EQU„$2A�Counter�Preload�Register�Low*!CRH‡EQU„$2E�Counter�Register�High#CRM‡EQU„$30�Counter�Register�Middle CRL‡EQU„$32�Counter�Register�Low!TSR‡EQU„$34�Timer�Status�Register******************************* Ending of M68230.M68230.EQ *******************************éé*=/*=/*†M68230.RDTIMER.AF=/*,=/* Chain file to assemble M68230.RDTIMER.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68230.RDTIMER.LS=/*=/IFC \1ƒ=ARG�M68230.RDTIMER.LS=/ENDIF=/*2=ASM M68230.RDTIMER.SA,M68230.RDTIMER.RO,\1;RZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDéééé) éé"ŠPAGE**ˆINCLUDE�FILES**‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.INTERRUP.MCŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGECRDTIMERƒIDNTƒ1,0‰READ�TIMER�routine�for�M68230�PIT�real�time�clock.*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�RDTIMER‚1.00„**ˆ*’**ˆ*�SCB„05/02/84‚**ˆ*********************,*…READ�TIMER�-�RETURN�TIEMR�VALUE�(MS)�IN�D1*™TIMER�VALUE�(US)�IN�D0*5* Currently code returns only the number of MS in D1.* D1 is returned as 0.*ŠSECTION�LEVEL00* ŠXDEFƒRDTIMER ŠXDEFƒSBRDTIM ** SYSPAR parameters* ŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�TIME_LEFTŠXREF.S�TINTFLAGŠPAGESBRDTIM:RDTIMER: ŠCLR.L‚D0$ŠMOVE.W�SR,-(A7)‹For�later�unmaskingŠDISABLE_INTERRUPTSˆMask ŠMOVE.L�NSE,D1ŠSUB.L‚TIME_LEFT,D10ŠSUB.L‚MIDNIGHT,D1ˆD1�=�current�ms�past�midnight#ŠBCLRƒ#31,D1�Insure�positive�number ŠMOVE.W�(A7)+,SR‹UnmaskŠRTSŠENDéééé+7=/*=/*†M68230.TIMEINT.AF=/*,=/* Chain file to assemble M68230.TIMEINT.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68230.TIMEINT.LS=/*=/IFC \1ƒ=ARG�M68230.TIMEINT.LS=/ENDIF=/*D=ASM M68010.M68010.SA/M68230.TIMEINT.SA,M68230.TIMEINT.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9999.M68230.M68230.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒM68XXX.TIMEINT.AI=/*}=/*=ENDé* éééé4ŠPAGE**ˆINCLUDE�FILES**ˆINCLUDE�9995.&.STR.EQ*ˆINCLUDE�9995.&.BAB.EQ*ˆINCLUDE�9995.&.PAT.EQ*ˆINCLUDE�9999.M68230.M68230.EQ*ˆINCLUDE�9995.&.TR1RTCD.EQ*ˆINCLUDE�9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9999.M68230.M68230.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE>TIMEINTƒIDNTƒ1,0ŽTIMER�INTERRUPT�HANDLER�FOR�M68230�CLOCK�CHIP*$*‰COPYRIGHTED�1983�BY�MOTOROLA,�INC.***†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�10�MS*!*•05/02/84�--�Cloned�routine�from*­M146818.TIMEINT.SA*Š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.S�TRACERŠXREF.S�TRACFLAG ŠXREFƒBKG_SCHEDULE ŠXREFƒCKDELAY ŠXREFƒCKEXPAŠXREFƒPAT_RM_1ST_NODEŠPAGE**0TIMEINTƒMOVEM.L�D0-D1/A0-A1,-(A7)�SAVE�REGISTERSŠMOVE.L�PTMADDR,A0*ŠMOVE.B�#$01,TSR(A0)‡Clear�timer�interrupt0ŠCLR.L‚D1‘D1.L�<--�time�interval�corresonding�to'ŠMOVE.W�TIMINTV,D1‰a�tick�of�the�timer..ŠSUB.L‚D1,TIME_LEFT‡Do�we�have�a�node�to�fire?1*‰INCLUDE�M68XXX.TIMEINT.AI‚Yes�so�go�schedule�itŠINCLUDE�M68XXX.TIMEINT.AIŠENDéé=>^1RDTIMER ASREL'M68230 RDTIMER SA"V(…READ TIMER routine for M68230 PIT real time clock.P2pNSE BRDTIMER pTIME_LEF BSBRDTIM pMIDNIGHT pTINTFLAG ""3@B€@ç|"8 ’¸ ’¸ �FßNu4é* ééééééFY1TIMEINT ASREL'M68230 TIMEINT SA"(…TIMER INTERRUPT HANDLER FOR M68230 CLOCK CHIPÛ2pPTMADDR pPREEMPT_ pPERTURB_ pCOMINT_P pDATE pTIMESLIC BTIMEINT pTIMEOUT pTIME_LEF pTIMINTV pTIMINTV4 pPAT_RM_1 pCKEXPA pTRACER pPATBEG pTRACFLAG pBKG_SCHE pTINTFLAG pCKDELAY "¬J3RHçÀÀ x |4B�28 “¸ n"x AéCú*‰which�causes�a�bus�error�which�results�in�the�loading�of�the,*‰same�descriptor�as�the�original�bus�error.*6*‰TASKS�WITH�ADDRESS�SPACE�0�GET�UNMAPPED�ENTIRE�SPACE*?*‰TASKS�WITH�OTHER�ADDRESS�SPACES�GET�ONLY�THEIR�ASSIGNED�SPACE*0*‰PAGE�FAULT�IS�USED�TO�SWAP�SEGMENT�DESCRIPTORS*ŠSECTION�LEVEL00 ‰XDEF†LOADMMU‰XDEF†LOADMMUI ‰XREF†FLUSH_ON_CONTEXT_SWITCH ‰XREF.S„CURR_ASN‰XREF.S„MMUHERE‰XREF.S„MMULOAD‰XREF.S„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. **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.*¨R±^¹9ÁÉEÑ@ÙTáŠ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ŠPAGE 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ŠPAGE**ˆMake�entry�in�!ASN**:*‰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*‰USES�REGISTERS‚D�**™A�*„P** ŠXDEF†CRASN*ŠXREF.S„ASNTBLŠXREF.S„KILLER*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�yes2‰BSR„KILLER‘Mu!!�It�is�there,�but�it�is�not�there.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,CRA. SN12�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ŠPAGE**‡Delete�task�from�!ASN**%*‰ENTRY:ƒA4‚Points�to�TCB�to�lose�ASN* *›01234567*‰USES�REGISTERS‚D�**™A�*‚** ŠXDEF…DEASN ŠXREF.SƒASNTBLŠXREF.SƒKILLER*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�yes1ˆBSR…KILLER‡Mu!!�It�is�there,�but�it�is�not�thereDEASN5#ˆ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ˆBSR…KILLER‡Else�crashDEASN6ˆLSL.Wƒ#2,D0ˆIndex�into�!ASNˆCLR.Lƒ(A0,D0.W)„Remove�entryDEASN7ŠRTS�Return�to�callerŠPAGE*"*‰Unload�a�segment�from�68451�MMUs*(*‰ENTRY:‚(A5,D5)�-->�Segment�information* ŠXDEF„UNLDMMU ŠXREF.S‚CURRSDŠXREF.S‚CURR451ŠXREF.S‚FRST451ŠXREF.S‚LAST451*UNLDMMU *=*‚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�68451$Š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�no'ŠMOVE.W�AC0(A1),D1ŠGet�descriptor's�LBA!ŠCMP.W‚TSTLB(A5,D5),D1†LBA�<�LB�?ŠBLT.S‚UNLDNEXTŒBranch�if�yes!ŠCMP.W‚TSTLE(A5,D5),D1†LBA�>�LE�?ŠBGT.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ŠRTS˜Else�returnŠPAGE*>*‰Diagnose�bus�error�and�attempt�68451�segment�descriptor�swap*"*‰Saves�and�restores�all�registers*ŠXDEF„MMUFAULT ŠXREF.S‚CURRSDŠXREF.S‚CURR451ŠXREF.S‚FRST451ŠXREF.S‚LAST451ŠXREF.S‚MMUHEREŠXREF.S‚RUNNER 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(ŠBSR…CRSD�Create�lba,lam,pba�in�D0,D1,D2ŠMOVE.W‚TSTASN(A0),D3†ASN�to�D3$ŠMOVE.B‚TSTCTL+1(A0,D5),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�interrupts2ŠMOVEM.L�FRST451,A0-A3…Get�68451�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�descriptor�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ƒFSD/ 100‹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.Bƒ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*CRSDCŠMOVE.W‚D0,D1�D1�=�laŠAND.WƒD3,D1�D1�=�lam�AND�la(ŠCMP.Wƒ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�=�NOTlamCRSDD10ŠMOVE.W‚D0,D1ŒD1�=�laŠAND.WƒD3,D1ŒD1�=�lam�AND�la'ŠADD.WƒD4,D1ŒD1�=�(lam�AND�la)�+�NOTlam2ŠCMP.Wƒ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.W‚TSTPO(A0,D5),D2‚D2�=�PHYSICAL�OFFSETŠADD.WƒD0,D2ŒD2�=�paŠMOVE.W‚D3,D1ŒD1�=�lam ŠRTS–RETURNŠENDééééé/ é!*********************************!* Beginning of M68451.M68451.EQ *!*********************************ŠPAGE*‰MC68451�DESCRIPTION**)*‰AST�ENTRY�OFFSETS�FROM�MMU�BASE�ADDRESS*AST1†EQU„$02�USER�DATAAST2†EQU„$04�USER�PROGRAMAST5†EQU„$0A�SUPERVISOR�DATAAST6†EQU„$0C�SUPERVISOR�PROGRAM*+*‰ACCUMULATOR�OFFSETS�FROM�MMU�BASE�ADDRESS*%AC0‡EQU„$20�LOGICAL�BASE�ADDRESS,�MSB%AC1‡EQU„$21�LOGICAL�BASE�ADDRESS,�LSB%AC2‡EQU„$22�LOGICAL�ADDRESS�MASK,�MSB%AC3‡EQU„$23�LOGICAL�ADDRESS�MASK,�LSB&AC4‡EQU„$24�PHYSICAL�BASE�ADDRESS,�MSB&AC5‡EQU„$25�PHYSICAL�BASE�ADDRESS,�LSB AC6‡EQU„$26�ADDRESS�SPACE�NUMBERAC7‡EQU„$27�STATUS�REGISTERAC8‡EQU„$28�ADDRESS�SPACE�MASK*0*‰CONTROL‚REGISTER�OFFSETS�FROM�MMU�BASE�ADDRESS*DPˆEQU„$29�DESCRIPTOR�POINTER"GSR‡EQU„$2D�GLOBAL�STATUS�REGISTER!LSR‡EQU„$2F�LOCAL�STATUS�REGISTER#SSR‡EQU„$31�SEGMENT�STATUS�REGISTER%RDP‡EQU„$3B�RESULT�DESCRIPTOR�POINTER(DTO‡EQU„$3D�DIRECT�TRANSLATION�OPERATION%LDO‡EQU„$3F�LOAD�DESCRIPTOR�OPERATION***‰SEGMENT�STATUS�REGISTER�(SSR)�DEFINITION*SSRUSEDƒEQU„7�USEDSSRMOD„EQU„2�MODIFIEDSSRWP…EQU„1�WRITE�PROTECTEDSSREN…EQU„0�ENABLED******************************* Ending of M68451.M68451.EQ *******************************éééé-U1LOADMMU ASREL'M68451 LOADMMU SA"9(…68451 MMU HANDLER FOR 68010-BASED SYSTEMSõ2BLOADMMU BLOADMMUI ,BMMUFAULT *pFLUSH_ON pMMULOAD BUNLDMMU ÈpCURR_ASN pLAST_MMU pASNTBL BCRASN TBDEASN –pCURR451 pTRACER pKILLER pFRST451 pLAST451 pRUNNER pCURRSD pTRACFLAG pMMUHERE 2pSBLOGPHY "\H3PPB- °8 g @ç|!Í *x @@À aAÚFßNu- °8 g|!Í *xJ3‚� @@À aA°Ns-)f8 8 g2 @ �!ASNgaA’Aè0<~J˜WÈÿügL3T—Nu! D m6@ Nu 8 g* @ �!ASNgaBÿX"l6B@) g @€maBÿBI3åHB°Nu/ aBÿ4*_J- gR"x <@))1g()&²- f2) ²uPmG3@ ˆ²uPn|1!É À!R fÂCé@B³ø o¶NuHçÿþJ¸ gÔ x J( gI3Èz,/NaBþ¶`Nq`¶a¸6( 0PÃ@ç|Lø (J. G),1F3g(†g"F1R  fIì@B¹Éo(HR¾KfιÊfʺqqASQREAD AF))qqASQREAD SA22JqqASQSTATSAFSSqqASQSTATSSA\\)�qqASRINT AF��qqASRINT SA–– qqATSEM AF··qqATSEM SAÀÀLqqBKG AFááqqBKG SAêê"ùqq=/*=/*†M68XXX.AKRQST.AF=/*+=/* Chain file to assemble M68XXX.AKRQST.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.AKRQST.LS=/*=/IFC \1ƒ=ARG�M68XXX.AKRQST.LS=/ENDIF=/*1=ASM M68XXX.AKRQST.SA,M68XXX.AKRQST.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TIOT.EQ=/*ƒ9995.&.TACK.EQ=/*}=/*=ENDééééééÿ0 ‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TIOT.EQ*ˆINCLUDEƒ9995.&.TACK.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TIOT.EQ‰INCLUDEƒ9995.&.TACK.EQ‰LIST‰PAGE  *'*…MOVE�RETURN�PARAMETERS�TO�TARGET�TASK* AKRQ4D:1ˆBTSTƒ#TACKOSCC,D7‡SHOULD�CONDITION�CODES�BE�SET?ˆBEQ.S‚AKRQ5ŽBRANCH�IF�NO (ˆMOVE.B‚11(A4),TCBCC(A5)‚CONDITION�CODES AKRQ5:,ˆBTSTƒ#TACKOSD0,D7‡SHOULD�DATA�REG�0�BE�SET?ˆBEQ.S‚AKRQ6ŽBRANCH�IF�NO ˆMOVE.L‚12(A4),TCBD0(A5)‚SET�D0 AKRQ6:,ˆBTSTƒ#TACKOSA0,D7‡SHOULD�ADDR�REG�0�BE�SET?ˆBEQ.S‚AKRQ7ŽBRANCH�IF�NO ˆMOVE.L‚16(A4),TCBA0(A5)‚SET�A0 AKRQ7:'ˆBTSTƒ#TACKORDY,D7‡REACTIVATE�THE�TASK?ˆBEQ.S‚AKRQ9ŽBRANCH�IF�NO AKRQ8:3ˆBTSTƒ#TSKSAKWT,TCBSTATE(A5)�IS�TASK�STILL�WAITING?ˆBNE.S‚AKRQ8A�BRANCH�IF�YES &ˆTR0.RYACK‚(A5)‹MAKE�TARGET�TASK�REA1 DY AKRQ8A: ˆEXITƒSUB AKRQ9:+ˆBTSTƒ#TACKOWT,D7ˆPUT�TASK�IN�'WAIT'�STATE?ˆBEQ.S‚AKRQ10�BRANCH�IF�NO 5ˆBSETƒ#TSKSBLCK,TCBSTATE(A5)ƒPUT�TARGET�IN�WAIT�STATE ˆEXITƒSUB AKRQ10:$ˆBTSTƒ#TACKOSPD,D7‡SUSPEND�THE�TASK?)ˆBEQ.S‚AKRQ8ŽIF�NO�-�GO�BACK�AND�READY�IT 0ˆBSETƒ#TSKSSUSP,TCBSTATE(A5)†SUSPEND�TARGET�TASK ˆEXITƒSUBˆENDééééééé=/*=/*†M68XXX.ASQALOC.AF=/*,=/* Chain file to assemble M68XXX.ASQALOC.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.ASQALOC.LS=/*=/IFC \1ƒ=ARG�M68XXX.ASQALOC.LS=/ENDIF=/*3=ASM M68XXX.ASQALOC.SA,M68XXX.ASQALOC.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDééééé1 é!7ASQALOCƒIDNT‚6,0‚68xxx�DIRECTIVE--ALLOCATE�ASQ“07/13/84O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***9***…FILE:‚ASQALOC�-�TRAP�#1�HANDLER�-�ALLOCATE�AN�ASQ’******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***F***…FUNCTION:‚Gets�an�ASQ�for�the�target�task.‚Initializes�the�ASQ„***<***�according�to�the�options�within�the�parameter�block.…******É******…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:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É******…ENTRY�CONDITIONS:³******É***"***‰A6ƒREQUESTOR'S�TCB�ADDRESS¤******‰A5ƒTARGET'S�TCB�ADDRESS§*******‰A4ƒLOGICAL�PARAMETER�BLOCK�ADDRESSœ******É******ˆ(A4)‚TARGET�TASK�NAME«******‡4(A4)‚SESSN�NO.²******‡8(A4)‚B‚ASQ�STATUS®******‡9(A4)‚B‚MAX�MSG�LEN­***$***†10(A4)‚LEN�OF�QUEUE�IN�BYTES¦***$***†14(A4)‚ASR�ADDRESS�(LOGICAL)¦***'***†18(A4)‚RECIEVING�AREA�(LOGICAL)£******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É******‡D0�=�0‚Success;²******É******‡D0�<>�0�Failure;²******É***5***ŠThe�following�error�codes�are�returned�in�D0:’******É***-***ŒRTCDPBLK�-�02‚Parameter�block�address—***$***›not�in�user's�address�space.’******É***1***ŒRTCDTASK�-�03‚Target�task�does�not�exist.“******É***(***ŒRTCDDPRQ�-�06‚Duplicate�request:œ***+***›Function�cannot�be�performed�twice.‹******É***7***ŒRTCDNFND�-�07‚Entry�not�found�in�table�or�list.�******É***1***ŒRTCDNMEM�-�08‚Memory�space�not�available.“******É***/***ŒRTCDADR1�-�12‚Address�of�some�parameter•***$***›not�in�user's�address�space.’******É******É****;3L;YCGKO*******************************************************************************O*******************************************************************************O*^******************************************************************************,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------)*…09/01/84‚MSLŒRe-wrote�as�state�machine.**…07/09/84‚SPTŒImplemented�automatic�read.*…03/03/81‚HLD6*…05/15/79‚GGC3‹REV�2.00 * *‚XDEF's.* ŠXDEFƒASQALOC * *‚XREF's.*ŠXREF.S�ADEFTYP **‚Included�files:**ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰INCLUDEƒ9995.&.ASQ.EQ‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰SECTION�LEVEL04‰PAGE9*asq_aloc: proc (pb_ptr, target_tcb_ptr, client_tcb_ptr);  *„dcl‚pb_ptr�longword�(A4);#*„dcl‚target_tcb_ptr�longword�(A5);#*„dcl‚client_tcb_ptr�longword�(A6);  %*ˆif�(tcb_asq�(target_tcb_addr)�<>�0)*ˆthen�return�(error_06); *ˆelse�do;*�status�<==�status�(pb_ptr);*�if*�(asr_nval�(status)�=�set)�&*�(asr_en�(status)�=�set)*�then�return�(error_12 5);'*�if�(dbuf_val�(status)�=�set)�then�do;<*’dbuf_ptr�<==�logphy�(dbuf_addr�(pb_ptr),�max_ml�(pb_ptr)); *’if�(error)*’then�return�(error_12);*�end;"*�else�if�(dbuf_en�(status)�=�set)*�then�return�(error_15); *�else�do;1*’asq_ptr�<==�pagealoc�(number�of�pages�for�ASQ); *’if�(error)*’then�return�(error_08); *’else�do;*—asq�(asq_ptr)�<==�'!ASQ';**—asq_asr�(asq_ptr)�<==�asr_addr�(pb_ptr);"*—asq_dbuf�(asq_ptr)�<==�dbuf_ptr;)*—asq_bot�(asq_ptr)�<==�addr�(asq_start);)*—asq_get�(asq_ptr)�<==�addr�(asq_start);)*—asq_put�(asq_ptr)�<==�addr�(asq_start);**—asq_mx_ml�(asq_ptr)�<==�max_ml�(pb_ptr);+*—asq_top�(asq_ptr)�<==�asq_ptr�+�len�(asq)*²-�(max_ml�+�4);5*—asq_st_mod�(asq_ptr)�<==�bit_5-3�(status�(pb_ptr));*—asq_state�(asq_ptr)�<==&*¡map_tbl�(bit_2-0�(status�(pb_ptr)));*—asq_count�(asq_ptr)�<==�0;'*—tcb_asq�(client_tcb_ptr)�<==�asq_ptr;*’end;*�end;*ˆend;  *end asqaloc;‰PAGE ASQALOC: $*ˆif�(tcb_asq�(target_tcb_ptr)�<>�0)*ˆthen�return�(error_06); 4‰TST.L…TCBASQ(A5)Šif�(tcb_asq�(target_tcb_ptr)�<>�0))‰EXIT.NEƒRTCDDPRQŒthen�return�(error_06); *ˆelse�do;*�status�<==�status�(pb_ptr);*�if*�(asr_nval�(status)�=�set)�&*�(asr_en�(status)�=�set)*�then�return�(error_15); $‰CLR.L…D2’status�<==�stats�(pb_ptr);‰MOVE.B„8(A4),D2 ‰BTST†#ASQS_RNV,D2ˆif+‰BEQ.S…ASQAL_02Œ(asr_nval�(status)�=�set)�& )‰BTST†#ASQSREN,D2‰(asr_en�(status)�=�set)(‰EXIT.NEƒRTCDOPT�then�return�(error_15);  '*�if�(dbuf_val�(status)�=�set)�then�do;<*’dbuf_ptr�<==�logphy�(dbuf_addr�(pb_ptr),�max_ml�(pb_ptr)); *’if�(error)*’then�return�(error_12);*�end;"*�else�if�(dbuf_en�(status)�=�set)*�then�return�(error_15); ASQAL_02:#‰CLR.L…D7’(D7�<==�max_ml�(pb_ptr));‰MOVE.B„9(A4),D7 8‰BTST†#ASQS_DBV,D2ˆif�(dbuf_val�(status)�=�set)�then�do;‰BEQ.S…ASQAL_03 D‰TR0.LOGPHY�,18(A4),D7ƒdbuf_ptr�<==�logphy�(dbuf_ptr�;‰BRA.S…ASQAL_04‘if�(error) ‰NOP then�return�(error_12);‰EXIT†RTCDADR1  ASQAL_03:3‰BTST†#ASQSDBEN,D2ˆelse�if�(dbuf_en�(status)�=�set)(‰EXIT.NEƒRTCDOPT�then�return�(error_15);‰CLR.L…D6’(dbuf_ptr�in�D6):‰PAGE *�else�do;1*’asq_ptr�<==�pagealoc�(number�of�pages�for�ASQ); *’if�(error)*’then�return�(error_08);*C*ˆ(NOTE:�number�of�pages�for�ASQ�>=�len�(asq_header)�+�max_ml�+�4;) ASQAL_04:/‰MOVE.L„10(A4),D3‹D3�<==�bytes�in�message�area; -‰MOVE.L„D7,D2�D2�<==�maximum�message�length�+)‰ADD.L…#ASQLEN+4,D2�len�(asq_header)�+�4; ‰CMP.L…D2,D3�if�(D3�<�D2)‰BGE.S…ASQAL_05Œthen�D3�<==�D2; ‰MOVE.L„D2,D3 ASQAL_05:0‰ADD.L…#$FF,D3�D3�<==�ceil�(D3,�256_byte_pages); ‰LSR.L…#8,D3 ‰SWAP†D3’high_word�(D3)�<=='‰MOVE.B„ADEFTYP,D3™default�memory�type;‰SWAP‚D3 )‰TR0.PAGAL�D3’asq_ptr�<==�page_aloc�(D3);*¦(NOTE:�pagealoc�returns:*­A0�<==�addr�(memory);*­D2�<==�no_pages�(memory);�) ‰BRA.S…ASQAL_06Œif�(error) &‰EXIT†RTCDNMEM‘then�return�(error_08);‰PAGE *’else�do;*—asq�(asq_ptr)�<==�'!ASQ';**—asq_asr�(asq_ptr)�<==�asr_addr�(pb_ptr);"*—asq_dbuf�(asq_ptr)�<==�dbuf_ptr;)*—asq_bot�(asq_ptr)�<==�addr�(asq_start);)*—asq_get�(asq_ptr)�<==�addr�(asq_start);)*—asq_put�(asq_ptr)�<==�addr�(asq_start); ASQAL_06:1‰MOVE.L„#'!ASQ',ASQ(A0)…asq�(asq_ptr)�<==�'!ASQ';B‰MOVE.L„14(A4),ASQASR(A0)ƒasq_asr�(asq_ptr)�<==�asr_addr�(pb_ptr);7‰MOVE.L„D6,ASQDBUF(A0)†asq_dbuf�(asq_ptr)�<==�dbuf_ptr; ‰LEA‡ASQSTART(A0),A3=‰MOVE.L„A3,ASQBOT(A0)‡asq_bot�(asq_ptr)�<==�addr�(asq_start);=‰MOVE.L„A3,ASQGET(A0)‡asq_get�(asq_ptr)�<==�addr�(asq_start);=‰MOVE.L„A3,ASQPUT(A0)‡asq_put�(asq_ptr)�<==�addr�(asq_start); **—asq_mx_ml�(asq_ptr)�<==�max_ml�(pb_ptr);+*—asq_top�(asq_ptr)�<==�asq_ptr�+�len�(asq)*²-�(max_ml�+�4); =‰MOVE.W„D7,ASQML(A0)ˆasq_mx_ml�(asq_ptr)�<==�max_ml�(pb_ptr); "‰LSL.L…#8,D2�asq_top�(asq_ptr)�<== ‰ADD.L…A0,D2™asq_ptr�+�len�(asq)‰ADD.L…#4,D7ž-�(max_ml�+�4); ‰SUB.L…D7,D2‰MOVE.L„D2,ASQTOP(A0) 5*—asq_st_mod�(asq_ptr)�<==�bit_5-3�(status�(pb_ptr));*—asq_state�(a2 sq_ptr)�<==&*¡map_tbl�(bit_2-0�(status�(pb_ptr))); ‰CLR.L…D3)‰MOVE.B„8(A4),D3Œasq_st_mod�(asq_ptr)�<==(‰MOVE.W„D3,D2šbit_5-3�(status�(pb_ptr));‰AND.B…#%00111000,D2‰MOVE.W„D2,ASQSTMOD(A0) 6‰AND.B…#%00000111,D3‡asq_state�(asq_ptr)�<==�map_tbl�(7‰MOVE.B„MAP_TBL(PC,D3.W),D2Šbit_2-0�(status�(pb_ptr)));‰MOVE.W„D2,ASQSTATE(A0) *—asq_count�(asq_ptr)�<==�0;'*—tcb_asq�(client_tcb_ptr)�<==�asq_ptr;*’end;*�end;*ˆend;  *end asqaloc; ,‰CLR.W…ASQCNT(A0)Šasq_count�(asq_ptr)�<==�0;;‰MOVE.L„A0,TCBASQ(A5)‡tcb_asq�(client_tcb_ptr)�<==�asq_ptr;!‰EXIT†SUB‘exit�(subroutine�exit);‰PAGEMAP_TBL: $MAP_000:�DC.B†RQ_DIS+DBUF_DIS+ASQ_MT"MAP_001:�DC.B†Q_EN+DBUF_DIS+ASQ_MT#MAP_010:�DC.B†RQ_DIS+DBUF_EN+ASQ_MT!MAP_011:�DC.B†Q_EN+DBUF_EN+ASQ_MT "MAP_100:�DC.B†R_EN+DBUF_DIS+ASQ_MT#MAP_101:�DC.B†RQ_EN+DBUF_DIS+ASQ_MT!MAP_110:�DC.B†R_EN+DBUF_EN+ASQ_MT"MAP_111:�DC.B†RQ_EN+DBUF_EN+ASQ_MT ‰ENDééééééé=/*=/*†M68XXX.ASQEVENT.AF=/*-=/* Chain file to assemble M68XXX.ASQEVENT.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.ASQEVENT.LS=/*=/IFC \1ƒ=ARG�M68XXX.ASQEVENT.LS=/ENDIF=/*5=ASM M68XXX.ASQEVENT.SA,M68XXX.ASQEVENT.RO,\1;MRZ=065=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.ASQ.MC=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*}=/*=ENDééé3 éééS7ASQEVENT‚IDNT�6,0…68xxx�DIRECTIVE--QUEUE�EVENT’07/13/84O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***B***…FILE:‚ASQEVENT�-�TRAP�#1�-�QUEUE�AN�EVENT�TO�A�TARGET�TASK‰******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***A***…FUNCTION:‚ASQEVENT�will�queue�the�event�pointed�to�by�theŠ***6***�event�field�within�the�parameter�block,�to�the‹***3***�task�pointed�to�by�the�target_tcb_ptr.‚(The�***2***�target_tcb_ptr�was�computed�by�the�trap�#1�***5***�handler�from�the�target�taskname�field�of�theŒ******�parameter�block.)¨******É******…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:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É******…ENTRY�CONDITIONS:³******É******‡A4�<==�pb_ptr;´******‡A5�<==�target_tcb_ptr;¬******‡A6�<==�client_tcb_ptr;¬******É***'***†(A4)�TASK�NAME�TO�SEND�EVENT�TO¤******…4(A4)�SESSION�CODE²***A***…8(A4)�W‚DIR�OPTION‚-�BIT�15�ON,�INTERRUPT�ADDRESS�PRESENT‰***4***„10(A4)�LOGICAL�ADDRESS�OF�EVENT�DATA�TO�SEND™*** ***„14(A4)�INTERRUPT�ADDRESS­******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É******‡D0�=�0‚Success;²******É******‡D0�<>�0�Failure;²******É***5***ŠThe�following�error�codes�are�returned�in�D0:’******É***-***ŒRTCDPBLK�-�02‚Parameter�block�address—***$***›not�in�user's�address�space.’******É***1***ŒRTCDTASK�-�03‚Target�task�does�not�exist.“******É***4***ŒRTCDNTBL�-�04‚Required�table�does�not�exist.�******É***;***ŒRTCDTFUL�-�05‚Table�is�full:‚No�room�for�new�entry.ˆ******É***/***ŒRTCDADR1�-�12‚Address�of�some�parameter•***$***›not�in�user's�address�space.’******É***\9eXmQua}z…d�O•H�I¥L­ .***ŒRTCDENAB�-�14‚Function�is�not�enabled.–******É***3***ŒRTCDPCNT�-�16‚Invalid�count�or�length�field‘******›in�parameter�block.›******É******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------)*…09/02/84‚MSLŒRe-wrote�as�state�machine.&*…07/09/84‚SPTŒImplement�an�auto-read.**…06/25/84‚SPTŒImplement�an�overflow�area.*…11/06/81‚HLD6‹REV�3.00.*…02/26/81‚HLD6‹REV�2.00.*…08/17/79‚HLD6‹REV�1.3 00.* * *‚XDEF's.*‰XDEF†ASQEVENT * *‚XREF's.*‰XREF.S„DISP_ASR‰XREF.S„GTASQBUF‰XREF.S„KILLER‰XREF.S„READY_ASR **‚Included�files:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.ASQ.MC*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.ASQ.MC‰INCLUDEƒ9995.&.BAB.EQ‰INCLUDEƒ9995.&.PAT.EQ‰LIST‰SECTION�LEVEL04‰PAGE**ˆROUTINE�REGISTER�USE**ˆD0�=�msg_len;*ˆD1�=�msg_code;*ˆD2�=�asq_state;**ˆA0�=�dest_ptr;*ˆA1�=�src_ptr;*ˆA2�=�pb_ptr;*ˆA4�=�asq_ptr;*ˆA5�=�target_tcb_ptr;*ˆA6�=�requestor_tcb_ptr;*‰PAGE9*asqevent: proc (pb_ptr, target_tcb_ptr, client_tcb_ptr);  *„dcl‚pb_ptr�longword�(A4);#*„dcl‚target_tcb_ptr�longword�(A5);#*„dcl‚client_tcb_ptr�longword�(A6);  6*ˆA2�<==�pb_ptr;�/*�For�compatability�with�EXQEVENT�*/'*ˆasq_ptr�<==�tcb_asq�(target_tcb_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�go�to�error�(04); *ˆelse�do;'*�if�(client_tcb_ptr�<>�real-time�task)0*�then�src_ptr�<==�logphy�(event_addr�(pb_ptr));'*�else�src_ptr�<==�event_addr�(pb_ptr);*�msg_len�<==�len�(src_ptr);*�if�(msg_len�<�4)*�then�go�to�error�(16); *�else�do;*’msg_code�<==�code�(src_ptr);*’mask�(bit_7,�msg_code);*’if�(msg_code�=�server_event)*’then�msg_code�<==�user_event;*’if�(msg_code�=�user_event)5*’then�msg_len�<==�msg_len�+�len�(taskname,�session);+*’round�msg_len�up�to�even�number�of�bytes;!*’if�(msg_len�>�max_ml�(asq_ptr))*’then�go�to�error�(); *’else�do; *—freeze�(asq);$*—do�case�(asq_state,�asq_sw_modes); *’end;*�end;*ˆend;  *end asqevent;‰PAGE*ˆA2�<==�pb_ptr;'*ˆasq_ptr�<==�tcb_asq�(target_tcb_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�go�to�error�(04); ASQEVENT‰MOVE.L„A4,A2�A2�<==�PB_PTR;;‰MOVE.L„TCBASQ(A5),A4‡asq_ptr�<==�tcb_asq�(target_tcb_ptr);‰MOVE.L„A4,D0�if�(asq_ptr�=�0)&‰BEQ.S…ASQERR04Œthen�go�to�error�(04);  *ˆelse�do;#*�if�(client_tcb�<>�real-time�task)0*�then�src_ptr�<==�logphy�(event_addr�(pb_ptr));'*�else�src_ptr�<==�event_addr�(pb_ptr); :‰BTSTW…#TSKARTIM,TCBATTR(A6)„if�(client�<>�real-time�task) ‰BEQ.S…ASQEV_10‘then�src_ptr�<==*´logphy�(event_addr(pb));3‰MOVE.L„10(A2),A1�else�src_ptr�<==�event_addr�(pb);  *�msg_len�<==�len�(src_ptr);*�if�(msg_len�<�4)*�then�go�to�error�(16); ASQEV_01:#‰GET_LEN—msg_len�<==�len�(src_ptr);‰CMP.B…#3,D0�if�(msg_len�<�4)&‰BLS.S…ASQERR16Œthen�go�to�error�(16); *�else�do;*’msg_code�<==�code�(src_ptr);*’mask�(bit_7,�msg_code);*’if�(msg_code�=�server_event)*’then�msg_code�<==�user_event; 2‰MOVE.L„#$7F,D1�msg_code�<==�code�(src_ptr)�&�$7F;,‰AND.B…(A1)+,D1Œ(mask�off�bit_7�of�msg_code) 0‰CMP.B…#EVNTSERV,D1ˆif�(msg_code�=�server_event)-‰BNE.S…ASQEV_02Œthen�msg_code�<==�user_event; ‰SUB.B…#4,D1  *’if�(msg_code�=�user_event)5*’then�msg_len�<==�msg_len�+�len�(taskname,�session); ASQEV_02:*‰CMP.B…#EVNTUSER,D1ˆif�(code�=�user_event)*‰BNE.S…ASQEV_03Œthen�msg_len�<==�msg_len�+$‰ADD.W…#8,D0˜len�(taskname,session); +*’round�msg_len�up�to�even�number�of�bytes; *’if�(msg_len�>�max_ml�(asq_ptr)*’then�go�to�error�(16); ASQEV_03:‰ADD.W…#1,D0�round�msg_len�up$‰BCLR†#0,D0�to�even�number�of�byte�; 3‰CMP.W…ASQML(A4),D0ˆif�(msl_len�>�max_ml�(asq_ptr))&‰BHI.S…ASQERR16Œthen�go�to�error�(16);  *’else�do;*—freeze�(asq);$*—do�case�(asq_state,�asq_sw_modes);*’end;*�end;*ˆend; ‰FREEZE_ASQ™freeze�(asq);9‰MOVE.W„ASQSTATE(A4),D2Šdo�case�(asq_state,asq_sw_modes);‰MOVE.W„ASQEV_TBL(PC,D2.W),A3‰JMP‡ASQEV_TBL(PC,A3.W)‰PAGE+*ˆsrc_ptr�<==�logphy�(event_addr�(pb_ptr));*ˆgo�to�asqev1;  $*�ENTRY‚A0„POINTS�TO�TST�(PRESERVED)%*ˆD6„LOGICAL�WINDOW�BEGINNING�ADDRESS*ˆD5„WINDOW�LENGTH�IN�BYTES*2*�EXITƒPC„IF�WINDOW�IS�COMPLETELY�WITHIN�A�SEGMENT&*ˆD6„PHYSICAL�WINDOW�BEGINNING�ADDRESS!*ˆD5„0(A0,D5)�POINTS�TO�MM4 U�ENTRY%*ˆD3„Logical�window�beginning�address*/*ˆPC+2‚IF�WINDOW�PARTIALLY�CONTAINED�IN�SEGMENT*ˆD6„SAME�AS�SUPPLIED!*ˆD5„0(A0,D5)�POINTS�TO�MMU�ENTRY  ASQEV_10:$‰TR0.LOGPHY‚,10(A2),#2‰BRA.S�ASQEV_11šGOOD�RETURN.‰NOP ASQERR12:+‰EXIT†RTCDADR1Œmessage�not�in�task's�space. ASQEV_11:7‰MOVE.L„D6,A1Žsrc_ptr�<==�logphy�(event_addr�(pb_ptr)�;‰BRA.S…ASQEV_01‹go�to�asqev_01;    ** Out of the way error codes* ASQERR04: ‰EXIT†RTCDNTBLŒTarget�has�no�ASQ ASQERR16:"‰EXIT†RTCDPCNTŒMessage�is�too�long‰PAGE ASQEV_TBL: ‰DC.W†RQ_DIS00-ASQEV_TBL‰DC.W†RQ_DIS01-ASQEV_TBL‰DC.W†RQ_DIS10-ASQEV_TBL‰DC.W†RQ_DIS11-ASQEV_TBL ‰DC.W†Q_EN_00-ASQEV_TBL‰DC.W†Q_EN_01-ASQEV_TBL‰DC.W†Q_EN_10-ASQEV_TBL‰DC.W†Q_EN_11-ASQEV_TBL ‰DC.W†R_EN_00-ASQEV_TBL‰DC.W†R_EN_01-ASQEV_TBL‰DC.W†R_EN_10-ASQEV_TBL‰DC.W†R_EN_11-ASQEV_TBL ‰DC.W†RQ_EN_00-ASQEV_TBL‰DC.W†RQ_EN_01-ASQEV_TBL‰DC.W†RQ_EN_10-ASQEV_TBL‰DC.W†RQ_EN_11-ASQEV_TBL ‰DC.W†WT_EN_00-ASQEV_TBL‰DC.W†WT_EN_01-ASQEV_TBL‰DC.W†WT_EN_10-ASQEV_TBL‰DC.W†WT_EN_11-ASQEV_TBL ‰DC.W†GT_EN_00-ASQEV_TBL‰DC.W†GT_EN_01-ASQEV_TBL‰DC.W†GT_EN_10-ASQEV_TBL‰DC.W†GT_EN_11-ASQEV_TBL‰PAGE RQ_DIS00: RQ_DIS01: RQ_DIS10: RQ_DIS11: R_EN_00:R_EN_01:R_EN_10:R_EN_11: *ˆrelease�(asq);*ˆreturn�(error_14); ‰RELEASE_ASQ ASQERR14:(‰EXIT†RTCDENABŒTarget�ASQ�is�not�enabled       GT_EN_00: GT_EN_10: RQ_EN_00: RQ_EN_10: WT_EN_00: WT_EN_10: *ˆrelease�(asq);*ˆcall�killer; ‰RELEASE_ASQ ‰BSR‡KILLER‰PAGEQ_EN_00:Q_EN_01:Q_EN_10:Q_EN_11: *ˆcall�check_alt_asr;*ˆcall�get_asq_buf;*ˆif�(error)�then�do;*�release�(asq);*�return�(error_05);*ˆend; *ˆelse�do;*�reset�(asq_mt);*�release�(asq);*�call�m_import; *�return;*ˆend; #‰BSR‡CK_ALT_ASRŠcall�check_alt_asr;‰BSR‡GTASQBUFŒcall�get_asq_buf;#‰BRA.S…ASQEV_21Œif�(error)�then�do; ASQ_FULL:‰RELEASE_ASQ˜release�(asq); ASQERR05:!‰EXIT†RTCDTFUL‘return�(error_05); *¦else�do; ASQEV_21:+‰BCLR†#ASQMTBIT,ASQSWMD2(A4)ƒreset�(asqmt);‰RELEASE_ASQ˜release�(asq);‰BSR‡M_IMPORT‘call�m_import;!‰EXIT†SUB–exit�(subroutine�exit);*¦end;‰PAGE GT_EN_01: *ˆdest_buf�<==�A0_buf�(asq_ptr);*ˆgo�to�ASQEV_30 ‰MOVE.L„ASQA0BUF(A4),A0‰BRA.S…ASQEV_30  GT_EN_11: !*ˆdest_buf�<==�def_buf�(asq_ptr); ‰MOVE.L„ASQDBUF(A4),A0  !*ˆasq_state�(asq_ptr)�<==�asq_en;*ˆrelease�(asq);*ˆcall�ms_bypass;*ˆcall�ready�(target_tcb_ptr); *ˆreturn; ASQEV_30:4‰AND.W…#SWMD_MASK,D2‡asq_state�(asq_ptr)�<==�asq_en;‰ORI.B…#Q_EN,D2‰MOVE.W„D2,ASQSTATE(A4)‰RELEASE_ASQ“release�(asq); ‰BSR‡MS_BYPASS‹call�ms_bypass;,‰TR0.RYGET�(A5)�call�ready�(target_tcb_ptr);!‰EXIT†SUB‘exit�(subroutine�exit);‰PAGE RQ_EN_01: *ˆcall�check_alt_asr;*ˆcall�get_asq_buf;*ˆif�(error)�then�do;*�release�(asq);*�return�(error_05);*ˆend; *ˆelse�do;*�reset�(asq_mt);!*�asq_state�(asq_ptr)�<==�asq_en;*�release�(asq);*�call�ma_import;*�call�disp_asr; *�return; #‰BSR‡CK_ALT_ASRŠcall�check_alt_asr;‰BSR‡GTASQBUFŒcall�get_asq_buf;#‰BRA.S…ASQEV_40Œif�(error)�then�do;‰BRA.S…ASQ_FULL‘release�(asq);*«return�(error_05);*¦end; ASQEV_40: *¦else�do;"‰AND.B…#DBUF_EN,D2Žreset�(asq_mt);/‰ORI.B…#Q_EN,D2�asq_state�(asq_ptr)�<==�asq_en;‰MOVE.W„D2,ASQSTATE(A4)‰RELEASE_ASQ˜release�(asq);‰BSR‡MA_IMPORT�call�ma_import;‰BSR‡DISP_ASR‘call�disp_asr;!‰EXIT†SUB–exit�(subroutine�exit);*¦end;‰PAGE RQ_EN_11: !*ˆasq_state�(asq_ptr)�<==�asq_en;*ˆrelease�(asq);!*ˆdest_ptr�<==�def_buf�(asq_ptr);*ˆcall�ma_bypass;*ˆcall�disp_asr; *ˆreturn; 4‰AND.B…#SWMD_MASK,D2‡asq_state�(asq_ptr)�<==�asq_en;‰ORI.B…#Q_EN,D2‰MOVE.W„D2,ASQSTATE(A4)‰RELEASE_ASQ–release�(asq);6‰MOVE.L„ASQDBUF(A4),A0†dest_buf�<==�def_buf�(asq_ptr);‰BSR‡MA_BYPASS‹call�ma_bypass;‰BSR‡DISP_ASRŒcall�disp_asr;!‰EXIT†SUB‘exit�(subroutine�exit);        WT_EN_01:4  *ˆcall�check_alt_asr;*ˆcall�get_asq_buf;*ˆif�(error)�then�do;*�release�(asq);*�return�(error_05);*ˆend; *ˆelse�do;*�reset�(asq_mt);!*�asq_state�(asq_ptr)�<==�asq_en;*�release�(asq);*�call�ma_import;*�call�ready_asr; *�return;*ˆend; %‰BSR.S…CK_ALT_ASRŠcall�check_alt_asr;‰BSR‡GTASQBUFŒcall�get_asq_buf;#‰BRA.S…ASQEV_50�if�(error)�then�do;‰BRA‡ASQ_FULL‘release�(asq);*«return�(error_05);*¦end; ASQEV_50: *¦else�do;"‰AND.B…#DBUF_EN,D2Žreset�(asq_mt);/‰ORI.B…#Q_EN,D2‘asq_state�(asq_ptr)�<==�asq_en;‰MOVE.W„D2,ASQSTATE(A4)‰RELEASE_ASQ˜release�(asq); ‰BSR.S…MA_IMPORT�call�ma_import;‰BSR‡READY_ASR�call�ready_asr;!‰EXIT†SUB–exit�(subroutine�exit);*¦end;         WT_EN_11: !*ˆasq_state�(asq_ptr)�<==�asq_en;*ˆrelease�(asq);!*ˆdest_ptr�<==�def_buf�(asq_ptr);*ˆcall�ma_bypass;*ˆcall�ready_asr; *ˆreturn; 4‰AND.B…#SWMD_MASK,D2‡asq_state�(asq_ptr)�<==�asq_en;‰ORI.B…#Q_EN,D2‰MOVE.W„D2,ASQSTATE(A4)‰RELEASE_ASQ–release�(asq); 6‰MOVE.L„ASQDBUF(A4),A0†dest_buf�<==�def_buf�(asq_ptr); ‰BSR.S…MA_BYPASS‹call�ma_bypass;‰BSR‡READY_ASR‹call�ready_asr;!‰EXIT†SUB‘exit�(subroutine�exit);‰PAGE*check_alt_asr: proc;  3*ˆif�(alt_asr_bit�(option�(pb_ptr))�=�set)�then�do;-*�msg_len�<==�msg_len�+�len�(alt_asr_vector);**�if�(msg_len�>�max_ml�(asq_ptr))�then�do;&*’discard�(subroutine�return�address);*’release�(asq);*’return�(error_16);*�end;*ˆend;  *end check_alt_asr;  CK_ALT_ASR:1‰TST.B…8(A2)�if�(alt_asr_bit�(op�(pb_ptr))�=�set)‰BPL.S…CK_RETŽthen�do; 0‰ADD.L…#4,D0”msg_len�<==�msg_len�+�len�(vector);2‰CMP.W…ASQML(A4),D0�if�(msg_len�>�max_ml)�then�do; ‰BHI.S…CK_ERR CK_RET:‰RTS CK_ERR:*‰ADD.L…#4,A7™discard�(sub�return�address);‰RELEASE_ASQ�release�(asq);!‰EXIT†RTCDPCNT–return�(error_16);*«end;*¦end;‰PAGE7*ma_import:‚proc�(src_ptr,�dest_ptr,�msg_len,�msg_code,"*‘client_tcb_ptr,�target_tcb_ptr); *…dcl‚src_ptr�longword�(A1);*…dcl‚dest_ptr�longword�(A0);*…dcl‚msg_len�byte�(D0);*…dcl‚msg_code�byte�(D1);*…dcl‚pb_ptr�longword�(A2);#*…dcl‚client_tcb_ptr�longword�(A6);*…dcl‚target_tcb�longword�(A5);*…dcl‚asq_ptr�longword�(A4);  5*ˆif�(alt_asr_bit�(option�(pb_ptr))�=�reset)�then�do;**�asq_xfr�(asq_ptr)�<==�asq_asr�(asq_ptr);*�go�to�import;*ˆend; *ˆelse�do;.*�asq_xfr�(asq_ptr)�<==�alt_asr_addr�(pb_ptr);!*�(dest_ptr)+�<==�byte�(msg_len);"*�(dest_ptr)+�<==�byte�(msg_code);/*�(dest_ptr)+�<==�longword�(asr_addr�(pb_ptr));@*�msg_len�<==�msg_len�-�len�(msg_len,�msg_code,�alt_asr_vector);*�go�to�move_msg;*ˆend;  7*m_import:‚entry�(src_ptr,�dest_ptr,�msg_len,�msg_code,"*‘client_tcb_ptr,�target_tcb_ptr);  ,*ˆif�(alt_asr_bit�(option�(pb_ptr))�=�reset)*ˆthen�go�to�import; *ˆelse�do;!*�(dest_ptr)+�<==�byte�(msg_len);"*�(dest_ptr)+�<==�byte�(msg_code);/*�(dest_ptr)+�<==�longword�(asr_addr�(pb_ptr));@*�msg_len�<==�msg_len�-�len�(msg_len,�msg_code,�alt_asr_vector);*�go�to�move_msg;*ˆend;‰PAGE7*ma_bypass:�proc‚(src_ptr,�dest_ptr,�msg_len,�msg_code,3*’pb_ptr,�client_tcb_ptr,�target_tcb_ptr,�asq_ptr);  *…dcl‚src_ptr�longword�(A1);*…dcl‚dest_ptr�longword�(A0);*…dcl‚msg_len�byte�(D0);*…dcl‚msg_code�byte�(D1);*…dcl‚pb_ptr�longword�(A2);#*…dcl‚client_tcb_ptr�longword�(A6);*…dcl‚target_tcb�longword�(A5);*…dcl‚asq_ptr�longword�(A4);  **ˆif�(alt_asr_bit�(option�(pb_ptr))�=�set)/*ˆthen�asq_xfr�(asq_ptr)�<==�asr_addr�(pb_ptr);/*ˆelse�asq_xfr�(asq_ptr)�<==�asq_asr�(asq_ptr);*ˆgo�to�import;  8*ms_bypass: entry (src_ptr, dest_ptr, msg_len, msg_code,"*’client_tcb_ptr,�target_tcb_ptr);  *import: *ˆbyte�(dest_ptr)+�<==�msg_len; *ˆbyte�(dest_ptr)+�<==�msg_code;/*ˆmsg_len�<==�msg_len�-�len�(msg_len,�msg_code)%*ˆif�(msg_code�=�user_event)�then�do;"*�if�(target_tcb�=�real_time�task)/*�then�longword�(dest_ptr)+�<==�client_tcb_ptr;:*�else�longword�(dest_ptr)+�<==�taskname�(client_tcb_ptr);4*�longwo5 rd�(dest_ptr)+�<==�session�(client_tcb_ptr);0*�msg_len�<==�msg_len�-�len�(taskname,�session);*ˆend; *ˆmsg_len�<==�msg_len�/�4;*ˆif�(carry_bit�=�set),*ˆthen�word�(dest_ptr)+�<==�word�(src_ptr)+;*ˆdo�while�(msg_len�>�0);/*�longword�(dest_ptr)+�<==�longword�(src_ptr)+;*�msg_len�<==�msg_len�-�1;*ˆend;  /*end ma_bypass: ms_bypass: m_import: ma_import;‰PAGE7*ma_import:‚proc�(src_ptr,�dest_ptr,�msg_len,�msg_code,"*‘client_tcb_ptr,�target_tcb_ptr);  *…dcl‚src_ptr�longword�(A1);*…dcl‚dest_ptr�longword�(A0);*…dcl‚msg_len�byte�(D0);*…dcl‚msg_code�byte�(D1);*…dcl‚pb_ptr�longword�(A2);#*…dcl‚client_tcb_ptr�longword�(A6);*…dcl‚target_tcb�longword�(A5);*…dcl‚asq_ptr�longword�(A4);  5*ˆif�(alt_asr_bit�(option�(pb_ptr))�=�reset)�then�do;**�asq_xfr�(asq_ptr)�<==�asq_asr�(asq_ptr);*�go�to�import;*ˆend; *ˆelse�do;.*�asq_xfr�(asq_ptr)�<==�alt_asr_addr�(pb_ptr);!*�(dest_ptr)+�<==�byte�(msg_len);"*�(dest_ptr)+�<==�byte�(msg_code);/*�(dest_ptr)+�<==�longword�(asr_addr�(pb_ptr));@*�msg_len�<==�msg_len�-�len�(msg_len,�msg_code,�alt_asr_vector);*�go�to�move_msg;*ˆend;  MA_IMPORT:.‰TST.B…8(A2)Šif�(alt_asr_bit�=�reset)�then�do;8‰BPL.S…MA_BY_01Œasq_xfr�(asq_ptr)�<==�asq_asr�(asq_ptr);*¦go�to�import;*¡end; *¡else�do;B‰MOVE.L„14(A2),ASQXFR(A4)ƒasq_xfr�(asq_ptr)�<==�alt_asr_addr�(pb);.‰BRA.S…M_IM_01�(dest_ptr)+�<==�byte�(msg_len);"*¦(dest_ptr)+�<==�byte�(msg_code);'*¦(dest_ptr)+�<==�longword�(asr_addr)�;*¦(msg_len)�<==�msg_len�-�6;*¦go�to�move_msg;*¡end;‰PAGE6*m_import:‚proc�(src_ptr,�dest_ptr,�msg_len,�msg_code,"*‘client_tcb_ptr,�target_tcb_ptr);  ,*ˆif�(alt_asr_bit�(option�(pb_ptr))�=�reset)*ˆthen�go�to�import; *ˆelse�do;!*�(dest_ptr)+�<==�byte�(msg_len);0*�(dest_ptr)+�<==�byte�(alt_asr_bit�|�msg_code);/*�(dest_ptr)+�<==�longword�(asr_addr�(pb_ptr));@*�msg_len�<==�msg_len�-�len�(msg_len,�msg_code,�alt_asr_vector);*�go�to�move_msg;*ˆend;  M_IMPORT:%‰TST.B…8(A2)Šif�(alt_asr_bit�=�reset) ‰BPL.S…IMPORT‰then�go�to�import; M_IM_01: *¡else�do;0‰MOVE.B„D0,(A0)+Œ(dest_ptr)+�<==�byte�(msg_len);5‰MOVE.B„#$80,(A0)‹(dest_ptr)+�<==�byte�(alt_asr_bit�|‰OR.B†D1,(A0)+¢msg_code);:‰MOVE.L„14(A2),(A0)+ˆ(dest_ptr)+�<==�lword�(asr_addr�(pb);*¦msg_len�<==�msg_len�-.‰SUB.W…#6,D0“len�(msg_len,�msg_code,�alt_asr);‰BRA.S…MOVE_MSGŒgo�to�move_msg;*¡end;‰PAGE7*ma_bypass:�proc‚(src_ptr,�dest_ptr,�msg_len,�msg_code,3*’pb_ptr,�client_tcb_ptr,�target_tcb_ptr,�asq_ptr);  *…dcl‚src_ptr�longword�(A1);*…dcl‚dest_ptr�longword�(A0);*…dcl‚msg_len�byte�(D0);*…dcl‚msg_code�byte�(D1);*…dcl‚pb_ptr�longword�(A2);#*…dcl‚client_tcb_ptr�longword�(A6);*…dcl‚target_tcb�longword�(A5);*…dcl‚asq_ptr�longword�(A4);  **ˆif�(alt_asr_bit�(option�(pb_ptr))�=�set)/*ˆthen�asq_xfr�(asq_ptr)�<==�asr_addr�(pb_ptr);/*ˆelse�asq_xfr�(asq_ptr)�<==�asq_asr�(asq_ptr);*ˆgo�to�import; MA_BYPASS:#‰TST.B…8(A2)™if�(alt_asr_bit�=�set)‰BPL.S…MA_BY_01 4‰MOVE.L„14(A2),ASQXFR(A4)�then�asq_xfr�(asq_ptr)�<== ‰BRA.S…IMPORT�asr_addr�(pb_ptr); MA_BY_01:8‰MOVE.L„ASQASR(A4),ASQXFR(A4)‰else�asq_xfr�(asq_ptr)�<==*µasq_xfr�(asq_ptr);‰PAGE8*ms_bypass: entry (src_ptr, dest_ptr, msg_len, msg_code,"*’client_tcb_ptr,�target_tcb_ptr);  *…dcl‚src_ptr�longword�(A1);*…dcl‚dest_ptr�longword�(A0);*…dcl‚msg_len�byte�(D0);*…dcl‚msg_code�byte�(D1);#*…dcl‚client_tcb_ptr�longword�(A6);*…dcl‚target_tcb�longword�(A5);  *import:*ˆbyte�(dest_ptr)+�<==�msg_len; *ˆbyte�(dest_ptr)+�<==�msg_code;/*ˆmsg_len�<==�msg_len�-�len�(msg_len,�msg_code)%*ˆif�(msg_code�=�user_event)�then�do;"*�if�(target_tcb�=�real_time�task)/*�then�longword�(dest_ptr)+�<==�client_tcb_ptr;:*�else�longword�(dest_ptr)+�<==�taskname�(client_tcb_ptr);4*�longword�(dest_ptr)+�<==�session�(client_tcb_ptr);0*�msg_len�<==�msg_len�-�len�(taskname,�session);*ˆend; *move_msg:*ˆmsg_len�<==�msg_len�/�4;*ˆif�(carry_bit�=�set),*ˆthen�word�(dest_ptr)+�<==�word5 �(src_ptr)+;*ˆdo�while�(msg_len�>�0);/*�longword�(dest_ptr)+�<==�longword�(src_ptr)+;*�msg_len�<==�msg_len�-�1;*ˆend;  $*end ma_bypass: ms_bypass: m_import;‰PAGE*ˆbyte�(dest_ptr)+�<==�msg_len; *ˆbyte�(dest_ptr)+�<==�msg_code;0*ˆmsg_len�<==�msg_len�-�len�(msg_len,�msg_code); MS_BYPASS:IMPORT:‰PUT_LC  %*ˆif�(msg_code�=�user_event)�then�do;&*�if�(target_tcb_ptr�=�real_time�task)/*�then�longword�(dest_ptr)+�<==�client_tcb_ptr;:*�else�longword�(dest_ptr)+�<==�taskname�(client_tcb_ptr);4*�longword�(dest_ptr)+�<==�session�(client_tcb_ptr);0*�msg_len�<==�msg_len�-�len�(taskname,�session);*ˆend; MOVE_MSG:7‰CMP.B…#EVNTUSER,D1ˆif�(msg_code�=�user_event)�then�do;‰BNE.S…M_MOV_3 5‰BTSTW…#TSKARTIM,TCBATTR(A5)„if�(target�<>�real-time)‰BNE.S…M_MOV_1 .‰MOVE.L„TCBNAME(A6),(A0)+ˆthen�(dest_ptr)+�<==)‰BRA.S…M_MOV_2—taskname�(client_tcb_ptr);M_MOV_1:1‰MOVE.L„A6,(A0)+‘else�(dest_ptr)+�<==�client_tcb; M_MOV_2:*‰MOVE.L„TCBSESSN(A6),(A0)+‡(dest_ptr)+�<==*µsession�(client_tcb);"‰SUB.B…#8,D0”msg_len�<==�msg_len�-*°len�(taskname,�session);*¦end;‰PAGE*ˆmsg_len�<==�msg_len�/�4;*ˆif�(carry_bit�=�set),*ˆthen�word�(dest_ptr)+�<==�word�(src_ptr)+; *ˆdo�while�(msg_len�>�0);/*�longword�(dest_ptr)+�<==�longword�(src_ptr)+;*�msg_len�<==�msg_len�-�1;*ˆend; M_MOV_3:‰PUT_MSG‰RTS *end m_import: m_bypass;‰ENDééééééé=/*=/*†M68XXX.ASQFREE.AF=/*,=/* Chain file to assemble M68XXX.ASQFREE.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.ASQFREE.LS=/*=/IFC \1ƒ=ARG�M68XXX.ASQFREE.LS=/ENDIF=/*3=ASM M68XXX.ASQFREE.SA,M68XXX.ASQFREE.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.ASQ.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDé6 éééééµ0ASQFREE‚IDNT‚5,2‚68xxx�DIRECTIVE--DEALLOCATE�ASQO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***=***…FILE:‚ASQFREE�-�TRAP�#1�&�TRAP�#0�-�DEALLOCATE�AN�ASQŽ******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***D***…FUNCTION:‚ASQFREE�will�deallocate�the�memory�allocated�for�a‡***:***�task's�ASQ.‚It�will�also�ensure�that�the�task�will†***=***�not�be�dispatched,�one�last�time,�to�the�non-existant„******�ASR.***É******…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:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É******…ENTRY�CONDITIONS:³***%***‹ASQFREE:‚A6�=�client_tcb_ptr; ***#***‹DASQX:„A4�=�target_tcb_ptr; ******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******‹D0�=�0„Success;¬******É******É***O*******************************************************************************O*******************************************************************************O*^*****************************************************************************‰PAGE*,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------)*…09/02/84‚MSLŒRe-wrote�as�state�machine.*…06/25/84‚SPT*…07/02/79‚HLD6*…04/10/79‚GGC3* * *‚XDEF's.*‰XDEF†ASQFREE�TRAP�#1�entry;$‰XDEF†SBDASQX�EXEC�subroutine�entry; * *‚XREF's.*‰XREF.S„KILLER **‚Included�files:**ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.ASQ.MC*ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*‰NOLIST‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.ASQ.MC‰INCLUDEƒ9995.&.STR.EQ¾EÇWωINCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST‰SECTION�LEVEL04‰PAGE*asqfree: proc (target_tcb_ptr)  $*ˆtarget_tcb_ptr�<==�client_tcb_ptr;*ˆcall�sb_dasqx;*ˆexit�(subroutine�exit);  *end asqfree;‰PAGE*asqfree: 6 proc (target_tcb_ptr)  $*ˆtarget_tcb_ptr�<==�client_tcb_ptr;*ˆcall�sb_dasqx;*ˆexit�(subroutine�exit);$*ˆtarget_tcb_ptr�<==�client_tcb_ptr; ASQFREE:/‰MOVE.L„A6,A4…target_tcb_ptr�<==�client_tcb_ptr‰BSR.S…SBDASQXƒcall�sb_dasqx;!‰EXIT†SUB‡exit�(subroutine�exit); *end asqfree;‰PAGE!*sb_dasqx: proc (target_tcb_ptr);  '*ˆasq_ptr�<==�tcb_asq�(target_tcb_ptr);*ˆif�(asq_ptr�<>�0)�then�do;*�freeze�(asq);*�tcb_asq�(tcb_ptr)�<==�0;/*�reset�(tsk2evwk�(tcbstat2�(target_tcb_ptr)));*�release�(asq);9*�asq_end�<==�(asq_top�(asq_ptr)�+�max_ml�(asq_ptr)�+�4);1*�asq_pages�<==�(asq_end�-�asq_ptr�+�#$FF)�/�256;%*�call�pagefree�(asq_ptr,�asq_pages); *�if�(error)*�then�call�killer;*ˆend;  *end sb_dasqx;‰PAGE'*ˆasq_ptr�<==�tcb_asq�(target_tcb_ptr);*ˆif�(asq_ptr�<>�0)�then�do;*�freeze�(asq);*�tcb_asq�(tcb_ptr)�<==�0;/*�reset�(tsk2evwk�(tcbstat2�(target_tcb_ptr)));*�release�(asq); SBDASQX:;‰MOVE.L„TCBASQ(A4),A0‡asq_ptr�<==�tcb_asq�(target_tcb_ptr);(‰MOVE.L„A0,D1�if�(asq_ptr�<>�0)�then�do;‰BEQ.S…ASQFR_01 ‰FREEZE_ASQ™freeze�(asq);1‰CLR.L…TCBASQ(A4)�tcb_asq�(target_tcb_ptr)�<==�0;?‰BCLR†#TSK2EVWK,TCBSTAT2(A4)ƒreset�(tck2evwk�(tcbstat2�(tcb)));*«release�(asq); ‰RELEASE_ASQ  9*�asq_end�<==�(asq_top�(asq_ptr)�+�max_ml�(asq_ptr)�+�4);1*�asq_pages�<==�(asq_end�-�asq_ptr�+�#$FF)�/�256;%*�call�pagefree�(asq_ptr,�asq_pages); *�if�(error)*�then�call�killer;*ˆend;  *end asqfree; ‰MOVE.L„#4,D1”asq_end�<==�4&‰ADD.W…ASQML(A0),D1™+�max_ml�(asq_ptr))‰ADD.L…ASQTOP(A0),D1˜+�asq_top�(asq_ptr); -‰SUB.L…A0,D1”asq_pages�<==�(asq_end�-�asq_ptr‰ADD.L…#$FF,D1¡+�#$FF)‰ASR.L…#8,D1£/�256;%*«call�pagefree�(asq_ptr,�asq_pages); ‰TR0.PGFR‰BRA.S…ASQFR_01‘if�(error)‰BSR‡KILLER“then�call�killer;*¦end; ASQFR_01: ‰RTS›return;‰ENDééééééé=/*=/*†M68XXX.ASQGET.AF=/*+=/* Chain file to assemble M68XXX.ASQGET.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.ASQGET.LS=/*=/IFC \1ƒ=ARG�M68XXX.ASQGET.LS=/ENDIF=/*1=A7 SM M68XXX.ASQGET.SA,M68XXX.ASQGET.RO,\1;MRZ=065=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.ASQ.MC=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.SRVR.EQ=/*}=/*=ENDéééééé×4GTEVENT�IDNT‚6,0‚68xxx�DIRECTIVE--GET�EVENT�07/13/84O*******************************************************************************O*******************************************************************************O**********************************************************************************É***/***…FILE:‚GTEVENT�-�TRAP�#1�HANDLER�-�GTEVNT›*****É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***>***…FUNCTION:‚This�routine�will�get�an�event�from�the�ASQ,Œ***2***�if�there�is�one.‚If�not,�it�will�lpace�theŽ***6***�task�into�a�wait�state�until�an�event�arrives.‹******É******…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:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É******…ENTRY�CONDITIONS:³***?***‡A0�=�addr�(receive�buffer).‚Valid�if�(dbuf_en�=�reset).Š******‡A6�=�client_tcb_ptr.®******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É******‡D0�=�0ƒSuccess.±***%***‡Event�is�in�effective�buffer.¥******�if�(dbuf_en�=�set)ª***/***�then�effective�buffer�=�default�buffer;•***#***�else�effective�buffer�=�A0;¡******É******‡D0�<>�0ƒFAILURE.°******É***5***�The�following�error�codes�are�returned�in�the�******�lower�1/2�of�D0.¬***(***‘RTCDNTBL�-‚4‚ASQ�does�not�exist.–***>***‘RTCDADR1�-�12‚Buffer�is�not�in�caller's�address�space.�***9***‘RTCDSTAT�-�10‚ASR�is�enabled.‚This�is�not�a�valid…***!*** state�for�this�directive.�******É***O*******************************************************************************O*******************************************************************************O*^*****************************************************************************‰PAGE,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------*…08/31/84‚MSLŒInitial�writing.*7 à4éoñyù[W ^LC * *‚XDEF's.*‰XDEF†A_EXPORT‰XDEF†APPEND_PB ‰XDEF†GTEVENT‰XDEF†S_EXPORT * *‚XREF's.*‰XREF.S„KILLER **‚Included�files:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.ASQ.MC*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.SRVR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.ASQ.MC‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.SRVR.EQ‰LIST‰SECTION�LEVEL04‰PAGE)*gtevent: proc (rcv_buf, client_tcb_ptr):  *„dcl‚rcv_buf�longword�(A0);$*„dcl‚client_tcb_addr�longword�(A6);  $*ˆtarget_tcb_ptr�<==�client_tcb_ptr; '*ˆasq_ptr�<==�tcb_asq�(client_tcb_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�return�(error_04); *ˆelse�do; *�freeze�(asq);$*�do�case�(asq_state,�asq_sw_modes); *ˆend;  *end gtevent;‰PAGEGTEVENT: $*ˆtarget_tcb_ptr�<==�client_tcb_ptr; '*ˆasq_ptr�<==�tcb_asq�(client_tcb_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�return�(error_04); 0‰MOVE.L„A6,A5�target_tcb_ptr�<==�client_tcb_ptr; ;‰MOVE.L„TCBASQ(A6),A4‡asq_ptr�<==�tcb_asq�(client_tcb_ptr);‰MOVE.L„A4,D0�if�(asq_ptr�=�0)'‰BEQ.S…ASQGERR4Œthen�return�(error_04); *ˆelse�do; *�freeze_asq;$*�do�case�(asq_state,�asq_sw_modes);*ˆend; ‰FREEZE_ASQ‰MOVE.W„ASQSTATE(A4),D2‰MOVE.W„GT_EV_TBL(PC,D2.W),A2‰JMP‡GT_EV_TBL(PC,A2.W)   ASQGERR4:!‰EXIT†RTCDNTBL–return�(error_04);‰PAGE GT_EV_TBL: ‰DC.W†RQ_DIS00-GT_EV_TBL‰DC.W†RQ_DIS01-GT_EV_TBL‰DC.W†RQ_DIS10-GT_EV_TBL‰DC.W†RQ_DIS11-GT_EV_TBL ‰DC.W†Q_EN_00-GT_EV_TBL‰DC.W†Q_EN_01-GT_EV_TBL‰DC.W†Q_EN_10-GT_EV_TBL‰DC.W†Q_EN_11-GT_EV_TBL ‰DC.W†R_EN_00-GT_EV_TBL‰DC.W†R_EN_01-GT_EV_TBL‰DC.W†R_EN_10-GT_EV_TBL‰DC.W†R_EN_11-GT_EV_TBL ‰DC.W†RQ_EN_00-GT_EV_TBL‰DC.W†RQ_EN_01-GT_EV_TBL‰DC.W†RQ_EN_10-GT_EV_TBL‰DC.W†RQ_EN_11-GT_EV_TBL ‰DC.W†WT_EN_00-GT_EV_TBL‰DC.W†WT_EN_01-GT_EV_TBL‰DC.W†WT_EN_10-GT_EV_TBL‰DC.W†WT_EN_11-GT_EV_TBL ‰DC.W†GT_EN_00-GT_EV_TBL‰DC.W†GT_EN_01-GT_EV_TBL‰DC.W†GT_EN_10-GT_EV_TBL‰DC.W†GT_EN_11-GT_EV_TBL‰PAGE WT_EN_00: WT_EN_01: WT_EN_10: WT_EN_11: GT_EN_00: GT_EN_01: GT_EN_10: GT_EN_11: *ˆrelease�(asq);*ˆcall�killer; ‰RELEASE_ASQ“release�(asq);‰BSR‡KILLERŽcall�killer;        R_EN_00:R_EN_01:R_EN_10:R_EN_11: RQ_EN_00: RQ_EN_01: RQ_EN_10: RQ_EN_11: RQ_DIS01: RQ_DIS11: *ˆrelease�(asq);*ˆreturn�(error_10); ‰RELEASE_ASQ‰EXIT†RTCDSTAT‰PAGE RQ_DIS00:Q_EN_00: *ˆasq_state�(asq_ptr)�<==�q_en;*ˆrelease�(asq);&*ˆif�(client_tcb_ptr�=�real-time�task)*ˆthen�dest_ptr�<==�A0; *ˆelse�do;*�dest_ptr�<==�logphy�(A0); *�if�(error)*�then�return�(error_12);*ˆend;*ˆcall�s_export�(dest_ptr);*ˆexit�(subroutine�exit); 2‰AND.W…#SWMD_MASK,D2‘asq_state�(asq_ptr)�<==�q_en;‰ORI.B…#Q_EN,D2‰MOVE.W„D2,ASQSTATE(A4) ‰RELEASE_ASQ�release�(asq);9‰BTSTW…#TSKARTIM,TCBATTR(A6)‰if�(client�=�real-time�task)$‰BNE.S…GTEV_31—then�dest_ptr�<==�A0; ‰CLR.L…D5‰MOVE.W„ASQML(A4),D5=‰TR0.LOGPHY�,A0,‹else�dest_ptr�<==�logphy�(A0);‰BRA.S…GTEV_30—if�(error) ‰NOP ASQRER12:&‰EXIT†RTCDADR1›then�return�(error_12); GTEV_30: ‰MOVE.L„D6,A0 GTEV_31:‰BSR.S…S_EXPORT–call�s_export;!‰EXIT†SUB›exit�(subroutine�exit);        Q_EN_01: (*ˆif�(client�<>�real-time�task)�then�do;6*�A0_buf�(asq_ptr)�<==�log_phy�(A0,�max_ml�(asq_ptr));*�if�(error)�then�do;*’release�(asq);*’return�(error_12);*�end;*ˆend;*ˆelse�A0_buf�(asq_ptr)�<==�A0; :‰BTSTW…#TSKARTIM,TCBATTR(A6)‰if�(client�<>�real-time�task)‰BNE.S…GTEV_41—then�do; ‰CLR8 .L…D5‰MOVE.W„ASQML(A4),D53‰TR0.LOGPHY�,A0,�A0_buf�(asq_ptr)�<==#‰BRA.S…GTEV_40œlogphy�(A0,�max_ml);‰NOPªif�(error)�then�do;‰RELEASE_ASQ§release�(asq);"‰BRA.S…ASQRER12 return�(error_12);*µend;*°end; GTEV_40: ‰MOVE.L„D6,A0 GTEV_41:5‰MOVE.L„A0,ASQA0BUF(A4)�else�A0_buf�(asq_ptr)�<==�A0; Q_EN_11: *ˆasq_state�(asq_ptr)�<==�gt_en;*ˆrelease�(asq);*ˆexit�(postempt); 3‰AND.W…#SWMD_MASK,D2‘asq_state�(asq_ptr)�<==�gt_en;‰ORI.B…#GT_EN,D2‰MOVE.W„D2,ASQSTATE(A4) ‰RELEASE_ASQ˜release�(asq);)‰EXIT†POSTEMPT‘exit�(postempt�this�task);        RQ_DIS10:Q_EN_10: *ˆasq_state�(asq_ptr)�<==�q_en;*ˆrelease�(asq);!*ˆdest_ptr�<==�def_buf�(asq_ptr);*ˆcall�s_export�(dest_buf);*ˆexit�(subroutine); 2‰AND.W…#SWMD_MASK,D2‘asq_state�(asq_ptr)�<==�q_en;‰ORI.B…#Q_EN,D2‰MOVE.W„D2,ASQSTATE(A4) ‰RELEASE_ASQ“release�(asq);6‰MOVE.L„ASQDBUF(A4),A0†dest_ptr�<==�def_buf�(asq_ptr);)‰BSR.S…S_EXPORTŒcall�s_export�(dest_ptr);‰EXIT†SUB‘exit�(subroutine);‰PAGE4*a_export: proc (dest_ptr, asq_ptr, target_tcb_ptr);  *„dcl‚dest_ptr�longword�(A0);*„dcl‚asq_ptr�longword�(A4)#*„dcl‚target_tcb_ptr�longword�(A5);  *ˆget�(asq_xfr�vector);  5*s_export: entry (dest_ptr, asq_ptr, target_tcb_ptr);  *„dcl‚dest_ptr�longword�(A0);*„dcl‚asq_ptr�longword�(A4)#*„dcl‚target_tcb_ptr�longword�(A5);  *ˆsrc_ptr�<==�asq_get�(asq_ptr);*ˆmsg_len�<==�byte�(src_ptr)+;*ˆmsg_code�<==�byte�(src_ptr)+;!*ˆreset�(alt_asr_bit�(msg_code));.*ˆif�(alt_asr_bit�(msg_code)�was�set)�then�do;'*�src_ptr�<==�src_ptr�+�len�(longword);'*�msg_len�<==�msg_len�-�len�(longword);*ˆend; *ˆ(dest_buf)+�<==�msg_len;*ˆ(dest_buf)+�<==�msg_code;0*ˆmsg_len�<==�msg_len�-�len�(msg_len,�msg_code);'*ˆmsg_len�<==�msg_len�/�len�(longword);*ˆif�(carry_bit�=�set)&*ˆthen�(dest_ptr)+�<==�word�(src_ptr)+*ˆdo�while�(msg_len�>�0);&*�(dest_ptr)+�<==�longword�(src_ptr)+;*�msg_len�<==�msg_len�-�1;*ˆend; *ˆfreeze�(asq); *ˆasq_get�(asq_ptr)�<==�src_ptr;2*ˆasq_count�(asq_ptr)�<==�asq_count�(asq_ptr)�-�1;*ˆif�(asq_count�(asq_ptr)�=�0),*ˆthen�set�(asq_mt�(asq_st_mode�(asq_ptr)));*ˆrelease�(asq); *ˆif*ˆ(msg_code�=�server_event)*ˆthen�call�append_pb; *end export;‰PAGE$*a_export: proc (dest_ptr, asq_ptr);  *„dcl‚dest_ptr�longword�(A0);*„dcl‚asq_ptr�longword�(A4)  *ˆget�(asq_xfr�vector); A_EXPORT:!‰GET_ASQXFR”get�(asq_xfr�vector);  %*s_export: entry (dest_ptr, asq_ptr);  *„dcl‚dest_ptr�longword�(A0);*„dcl‚asq_ptr�longword�(A4)  *ˆsrc_ptr�<==�asq_get�(asq_ptr);*ˆmsg_len�<==�byte�(src_ptr)+;*ˆmsg_code�<==�byte�(src_ptr)+; S_EXPORT:4‰MOVE.L„ASQGET(A4),A1‡src_ptr�<==�asq_get�(asq_ptr); ‰CLR.L…D0-‰MOVE.B„(A1)+,D0Œmsg_len�<==�byte�(src_ptr)+;.‰MOVE.B„(A1)+,D1Œmsg_code�<==�byte�(src_ptr)+;  !*ˆreset�(alt_asr_bit�(msg_code));.*ˆif�(alt_asr_bit�(msg_code)�was�set)�then�do;'*�src_ptr�<==�src_ptr�+�len�(longword);'*�msg_len�<==�msg_len�-�len�(longword);*ˆend; /‰BCLR†#BIT_7,D1‹reset�(alt_asr_bit�(msg_code));1‰BEQ.S…EXPRT_01Œif�(alt_asr_bit�was�set)�then�do; 0‰ADDQ.L„#4,A1”src_ptr�<==�src_ptr�+�len�(lword);/‰SUB.W…#4,D0”msg_len�<==�msg_len�-�len�(lword);*¦end;  *ˆ(dest_buf)+�<==�msg_len;*ˆ(dest_buf)+�<==�msg_code;0*ˆmsg_len�<==�msg_len�-�len�(msg_len,�msg_code); EXPRT_01:‰PUT_LC  '*ˆmsg_len�<==�msg_len�/�len�(longword);*ˆif�(carry_bit�=�set)&*ˆthen�(dest_ptr)+�<==�word�(src_ptr)+*ˆdo�while�(msg_len�>�0);&*�(dest_ptr)+�<==�longword�(src_ptr)+;*�msg_len�<==�msg_len�-�1;*ˆend; ‰PUT_MSG  *ˆfreeze�(asq);"*ˆif�(src_ptr�>�asq_top�(asq_ptr);%*ˆthen�src_ptr�<==�asq_bot�(asq_ptr); *ˆasq_get�(asq_ptr)�<==�src_ptr;2*ˆasq_count�(asq_ptr)�<==�asq_count�(asq_ptr)�-�1;*ˆif�(asq_count�(asq_ptr)�=�0),*ˆthen�set�(asq_mt�(asq_st_mode�(asq_ptr)));*ˆrelease�(asq); *¦freeze�(asq); ‰FREEZE_ASQ5‰CMP.L…ASQTOP(A4),A1‡if�(src_ptr�>�asq_top�(as8 q_ptr))‰BCS.S…EXPRT_029‰MOVE.L„ASQBOT(A4),A1‡then�src_ptr�<==�asq_bot�(asq_ptr); EXPRT_02:4‰MOVE.L„A1,ASQGET(A4)‡asq_get�(asq_ptr)�<==�src_ptr;5‰SUB.W…#1,ASQCNT(A4)‡dec�(asq_count�(asq_ptr),�by�1); ,‰BNE.S…EXPRT_03Œif�(asq_count�(asq_ptr)�=�0)‰BSET†#ASQMTBIT,ASQSWMD2(A4)!*¦then�set�(asq_mt�(asq_st_mode); EXPRT_03:‰RELEASE_ASQ“release�(asq);  *ˆif*ˆ(msg_code�=�server_event)*ˆthen�call�append_pb; *ˆreturn; *end export; ‰CHECK_PB‰RTS‰PAGE6*append_pb: proc (dest_ptr', asq_ptr, server_tcb_ptr);  *„dcl‚dest_ptr'�longword�(A0);*„dcl‚asq_ptr�longword�(A4);#*„dcl‚server_tcb_ptr�longword�(A5);  C*(NOTE:‚Dest_ptr'�points�to�the�location�at�the�beginning�of�the�pb>*ˆpart�of�the�destination�buffer,�immediately�after�the�server*ˆevent.‚(See�figure�1). >*ˆTherefore,�we�can�use�all�of�the�pre-defined�equates�for�the<*ˆserver�event,�but�we�must�bias�them�by�the�negative�length*ˆof�the�server�event.  *œ_____________________‡_____ *ˆdest_ptr‚----->„|‚/ƒ/ƒ/ƒ/ƒ/|‰^*œ|�/ƒ/ƒ/ƒ/ƒ/�|‰|*œ|/ƒ/ƒ/ƒ/ƒ/‚|‰|*œ|ƒ/ƒ/ƒ/ƒ/ƒ|‰|*œ|‚/ƒ/ƒ/ƒ/ƒ/|‰|*œ|�/ƒ/ƒ/ƒ/ƒ/�|‰|*œ|/ƒ/ƒ/ƒ/ƒ/‚|†server_*œ|ƒ/ƒ/ƒ/ƒ/ƒ|†event_*œ|‚/ƒ/ƒ/ƒ/ƒ/|†part*œ|�/ƒ/ƒ/ƒ/ƒ/�|‰|*œ|/ƒ/ƒ/ƒ/ƒ/‚|‰|*œ|ƒ/ƒ/ƒ/ƒ/ƒ|‰|*œ|‚/ƒ/ƒ/ƒ/ƒ/|‰|*œ|�/ƒ/ƒ/ƒ/ƒ/�|‰|*œ|/ƒ/ƒ/ƒ/ƒ/‚|‰v*œ|-------------------|‡-----*ˆdest_ptr'�----->„|“|‰^*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰| *œ|“|‡pb_ *œ|“|‡part*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰|*œ|“|‰v*œ---------------------‡-----  *¡(figure�1)‰PAGE**ˆclient_tcb_ptr�<==�tcb_addr�(dest_ptr');*ˆif�(server�<>�real_time�task):*ˆthen�taskname�(dest_ptr')�<==�taskname�(client_tcb_ptr);*ˆif-*ˆ(term_bit�(trap_field�(dest_ptr'))�=�set)�|*ˆ(pb_size�(dest_ptr')�=�0),*ˆthen�return�(pb_stat�(dest_ptr')�=�no_pb); *ˆelse�do;*�src_ptr�<==�A0�(dest_ptr');*�if�(src_ptr�=�odd_addr)-*�then�return�(pb_stat�(dest_ptr')�=�bad_pb); *�else�do;"*’msg_len�<==�pb_size�(dest_ptr');2*’space�<==�max_ml�(asq_ptr)�-�len�(server_event);*’if�(space�=�0),*’then�return�(pb_stat�(dest_ptr')�=�no_pb); *’else�do;*—space�<==�space�-�msg_len;*—if�(space�<�0)�then�do;'*œpb_stat�(dest_ptr')�<==�pb_part_move;*œmsg_len�<==�msg_len�+�space;"*œpb_size�(dest_ptr')�<==�msg_len;*—end;(*—if�(client�<>�real-time�task)�then�do;(*œsrc_ptr�<==�logphy�(src_ptr,�msg_len); *œif�(error)-*œthen�return�(pb_stat�(dest_ptr')�=�bad_pb);*—end; '*—msg_len�<==�msg_len�/�len�(longword);*—if�(carry_bit�=�set)(*—then�(dest_ptr')+�<==�word�(src_ptr)+;*—do�while�(msg_len�>�0);'*œ(dest_ptr')+�<==�longword�(src_ptr)+;*œmsg_len�<==�msg_len�-�1;*—end;*’end;*�end;*ˆend;  *end append_pb;‰PAGE**ˆclient_tcb_ptr�<==�tcb_addr�(dest_ptr');*ˆif�(server�<>�real_time�task):*ˆthen�taskname�(dest_ptr')�<==�taskname�(client_tcb_ptr); APPEND_PB: 3‰MOVE.L„TYP7TASK-TYP7PBLK(A0),A2†client_tcb_ptr�<==*¸tcb_addr�(dest_ptr');:‰BTSTW…#TSKARTIM,TCBATTR(A5)‰if�(server�<>�real-time�task),‰BNE.S…APPB_01—then�taskname�(dest_ptr')�<==B‰MOVE.L„TCBNAME(A2),TYP7TASK-TYP7PBLK(A0)‚taskname�(client_tcb_ptr  *ˆif-*ˆ(term_bit�(trap_field�(dest_ptr'))�=�set)�|*ˆ(pb_size�(dest_ptr')�=�0),*ˆthen�return�(pb_stat�(dest_ptr')�=�no_pb); APPB_01:*‰BTST†#TYP7TTRM+8,TYP7TRAP-TYP7PBLK(A0)‚if#‰BNE.S…APPB_NOPBš(term_bit�=�set)�| ‰CLR.L…D1¡(pb_size�=�0),‰MOVE.B„TYP7PBSZ-TYP7PBLK(A0),D1‹then�return#‰BEQ.S…APPB_NOPBŸ(pb_stat�=�no_pb);  *ˆelse�do;*�src_ptr�<==�A0�(dest_ptr');*�if�(src_ptr�=�odd_addr)-*�then�return�(pb_stat�(dest_ptr')�=�bad_pb); 9‰MOVE.L„TYP7A0-TYP7PBLK(A0),D6‡src_ptr�<==�A0�(dest_ptr);#‰BTST†#0,D6˜if�(src_ptr�=�odd_addr)1‰BNE.S…APPB_BADPB“then�return�(pb_stat�=�bad_pb�;  *�else�do;"*’msg_len�<==�pb_size�(dest_ptr');2*’space�<==�max_ml�(asq_ptr)�-�len�(server_event);*’if�(space�=�0),*’then�return�(pb_stat�(dest_ptr')�=�no_pb); '*¦msg_len�<==�pb_size;‚/9 *�from�above�*/1‰MOVE.W„ASQML(A4),D0ˆspace�<==�max_ml�(asq_ptr)�-'‰SUB.W…#TYP7PBLK,D0’len�(server_event);‰BEQ.S…APPB_NOPB‹if�(space�=�0) *¦then�return�(pb_stat�=�no_pb); *’else�do;*—space�<==�space�-�msg_len;*—if�(space�<�0)�then�do;'*œpb_stat�(dest_ptr')�<==�pb_part_move;*œmsg_len�<==�msg_len�+�space;"*œpb_size�(dest_ptr')�<==�msg_len;*—end; '‰SUB.W…D1,D0�space�<==�space�-�msg_len;&‰BGE.S…APPB_02�if�(space�<�0)�then�do;*«pb_stat�<==�pb_part_move; '‰MOVE.B„#T7STPART,TYP7PBST-TYP7PBLK(A0))‰ADD.W…D0,D1”msg_len�<==�msg_len�+�space; A‰MOVE.B„D1,TYP7PBSZ-TYP7PBLK(A0)�pb_size�(dest_ptr')�<==�msg_len;*¦end;  (*—if�(client�<>�real-time�task)�then�do;(*œsrc_ptr�<==�logphy�(src_ptr,�msg_len); *œif�(error)-*œthen�return�(pb_stat�(dest_ptr')�=�bad_pb);*—end; APPB_02::‰BTSTW…#TSKARTIM,TCBATTR(A2)„if�(client�<>�real-time�task)‰BEQ.S…APPB_04’then�src_ptr�<==*°logphy�(src_ptr,�msg_len);APPB_03:‰MOVE.L„D6,A1”(A1�<==�src_ptr;)  '*—msg_len�<==�msg_len�/�len�(longword);*—if�(carry_bit�=�set)(*—then�(dest_ptr')+�<==�word�(src_ptr)+;*—do�while�(msg_len�>�0);'*œ(dest_ptr')+�<==�longword�(src_ptr)+;*œmsg_len�<==�msg_len�-�1;*—end;*’end;*�end;*ˆend; ‰PUT_MSG1 APPB_EXIT:‰RTS‰PAGEAPPB_04:1‰MOVE.L„A0,-(A7)‘(SAVE�A0�-�logphy�blows�it�away)*‰TR0.LOGPHY�,,D1†src_ptr�<==*‰BRA.S…APPB_05–log_phy�(src_ptr,�msg_len);‰NOP if�(error) APPB_BADPB:‰MOVE.L„(A7)+,A0‘(RESTORE�A0)6‰MOVE.W„#T7STPADR<<8,TYP7PBST-TYP7PBLK(A0)�then�return$‰BRA.S…APPB_EXITŸ(pb_stat�=�bad_pb); APPB_NOPB:6‰MOVE.W„#T7STNORQ<<8,TYP7PBST-TYP7PBLK(A0)�then�return#‰BRA.S…APPB_EXITŸ(pb_stat�=�no_pb); APPB_05:‰MOVE.L„(A7)+,A0‰BRA.S…APPB_03 *end append_pb;‰PAGE‰ENDé=/*=/*†M68XXX.ASQREAD.AF=/*,=/* Chain file to assemble M68XXX.ASQREAD.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.ASQREAD.LS=/*=/IFC \1ƒ=ARG�M68XXX.ASQREAD.LS=/ENDIF=/*3=ASM M68XXX.ASQREAD.SA,M68XXX.ASQREAD.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.ASQ.MC=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.SRVR.EQ=/*}=/*=ENDééééé9 é!5ASQREAD�IDNT‚6,0‚68xxx�DIRECTIVE--READ�EVENT�07/13/84O*******************************************************************************O*******************************************************************************O**********************************************************************************É***0***…FILE:‚ASQREAD�-�TRAP�#1�HANDLER�-�RDEVNT›******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***?***…FUNCTION:‚This�routine�will�read�an�event�from�the�ASQ,Œ***2***�if�there�is�one.‚If�not,�it�will�return�anŽ***&***�event�of�length�=�0,�code�=�0.›******É******…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:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É******…ENTRY�CONDITIONS:³***?***‡A0�=�addr�(receive�buffer).‚Valid�if�(dbuf_en�=�reset).Š******‡A6�=�client_tcb_ptr.®******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É******‡D0�=�0‚Success;²******É***%***‡Event�is�in�effective�buffer.¥******�if�(dbuf_en�=�set)ª***/***�then�effective�buffer�=�default�buffer;•***#***�else�effective�buffer�=�A0;¡******É******‡D0�<>�0�Failure;²******É***5***ŠThe�following�error�codes�are�returned�in�D0:’******É***4***ŒRTCDNTBL�-�04‚Required�table�does�not�exist.�******É***4***ŒRTCDSTAT�-�10‚State�of�target�task�not�valid�******›for�this�directive.›******É***/***ŒRTCDADR1�-�12‚Address�of�some�parameter•***$***›not�in�user's�address�space.’******É******É***O*******************************************************************************O*******************************************************************************O*^*****************************************************************************‰PAGE,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------*73o;†C*…04/26/79‚GGC3‹Revision�2.00*…03/02/81‚HLD6%*…06/25/84‚SPTŒImplemented�auto�read.* * *‚XDEF's.* ‰XDEF†ASQREAD * *‚XREF's.*‰XREF.S„KILLER‰XREF.S„S_EXPORT **‚Included�files:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.ASQ.MC*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.SRVR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.ASQ.MC‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.SRVR.EQ‰LIST‰SECTION�LEVEL04‰PAGE)*asqread: proc (rcv_buf, client_tcb_ptr):  *„dcl‚rcv_buf�longword�(A0);$*„dcl‚client_tcb_addr�longword�(A6);  $*ˆtarget_tcb_ptr�<==�client_tcb_ptr; '*ˆasq_ptr�<==�tcb_asq�(client_tcb_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�return�(error_04); *ˆelse�do; *�freeze�(asq);$*�do�case�(asq_state,�asq_sw_modes); *ˆend;  *end asqread;‰PAGEASQREAD: $*ˆtarget_tcb_ptr�<==�client_tcb_ptr; '*ˆasq_ptr�<==�tcb_asq�(client_tcn_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�return�(error_04); 0‰MOVE.L„A6,A5�target_tcb_ptr�<==�client_tcb_ptr; ;‰MOVE.L„TCBASQ(A6),A4‡asq_ptr�<==�tcb_asq�(client_tcb_ptr);‰MOV: E.L„A4,D0�if�(asq_ptr�=�0)'‰BEQ.S…ASQRERR4Œthen�return�(error_04); *ˆelse�do; *�freeze_asq;$*�do�case�(asq_state,�asq_sw_modes);*ˆend; ‰FREEZE_ASQ‰MOVE.W„ASQSTATE(A4),D2‰MOVE.W„RD_EV_TBL(PC,D2.W),A2‰JMP‡RD_EV_TBL(PC,A2.W)   ASQRERR4:!‰EXIT†RTCDNTBLŒreturn�(error_04);‰PAGE RD_EV_TBL: ‰DC.W†RQ_DIS00-RD_EV_TBL‰DC.W†RQ_DIS01-RD_EV_TBL‰DC.W†RQ_DIS10-RD_EV_TBL‰DC.W†RQ_DIS11-RD_EV_TBL ‰DC.W†Q_EN_00-RD_EV_TBL‰DC.W†Q_EN_01-RD_EV_TBL‰DC.W†Q_EN_10-RD_EV_TBL‰DC.W†Q_EN_11-RD_EV_TBL ‰DC.W†R_EN_00-RD_EV_TBL‰DC.W†R_EN_01-RD_EV_TBL‰DC.W†R_EN_10-RD_EV_TBL‰DC.W†R_EN_11-RD_EV_TBL ‰DC.W†RQ_EN_00-RD_EV_TBL‰DC.W†RQ_EN_01-RD_EV_TBL‰DC.W†RQ_EN_10-RD_EV_TBL‰DC.W†RQ_EN_11-RD_EV_TBL ‰DC.W†WT_EN_00-RD_EV_TBL‰DC.W†WT_EN_01-RD_EV_TBL‰DC.W†WT_EN_10-RD_EV_TBL‰DC.W†WT_EN_11-RD_EV_TBL ‰DC.W†GT_EN_00-RD_EV_TBL‰DC.W†GT_EN_01-RD_EV_TBL‰DC.W†GT_EN_10-RD_EV_TBL‰DC.W†GT_EN_11-RD_EV_TBL‰PAGE WT_EN_00: WT_EN_01: WT_EN_10: WT_EN_11: GT_EN_00: GT_EN_01: GT_EN_10: GT_EN_11: *ˆrelease�(asq);*ˆcall�killer; ‰RELEASE_ASQ ‰BSR‡KILLER        R_EN_00:R_EN_01:R_EN_10:R_EN_11: RQ_EN_00: RQ_EN_01: RQ_EN_10: RQ_EN_11: *ˆrelease�(asq);*ˆreturn�(error_10); ‰RELEASE_ASQ‰EXIT†RTCDSTAT        RQ_DIS00:Q_EN_00: *ˆrelease�(asq);&*ˆif�(client_tcb_ptr�=�real-time�task)*ˆthen�dest_ptr�<==�A0; *ˆelse�do;*�dest_ptr�<==�logphy�(A0); *�if�(error)*�then�return�(error_12);*ˆend;*ˆcall�s_export�(dest_ptr);*ˆexit�(subroutine�exit); ‰RELEASE_ASQ�release�(asq);9‰BTSTW…#TSKARTIM,TCBATTR(A6)‰if�(client�=�real-time�task)%‰BNE.S…ASQRE_31–then�dest_ptr�<==�A0; ‰CLR.L…D5‰MOVE.W„ASQML(A4),D5=‰TR0.LOGPHY�,A0,‹else�dest_ptr�<==�logphy�(A0);‰BRA.S…ASQRE_30–if�(error) ASQRER12:&‰EXIT†RTCDADR1›then�return�(error_12); ASQRE_30: ‰MOVE.L„D6,A0 ASQRE_31:‰BSR‡S_EXPORT–call�s_export;‰EXIT†SUB›return;        RQ_DIS01:Q_EN_01: *ˆrelease�(asq);&*ˆif�(client_tcb_ptr�=�real-time�task)*ˆthen�dest_ptr�<==�A0; *ˆelse�do;*�dest_ptr�<==�logphy�(A0); *�if�(error)*�then�return�(error_12);*ˆend;*ˆ(dest_ptr)�<==�$00,�$00;*ˆexit�(subroutine); ‰RELEASE_ASQ˜release�(asq);<‰BTSTW…#TSKARTIM,TCBATTR(A6)„if�(client_tcb_ptr�=�real-time)%‰BNE.S…ASQRE_41‘then�dest_ptr�<==�A0; ?‰TR0.LOGPHY�,A0,#2‰else�dest_ptr�<==�logphy�(A0);‰BRA.S…ASQRE_40–if�(error)'‰BRA.S…ASQRER12–then�return�(error_12);*«end; ASQRE_40: ‰MOVE.L„D6,A0 ASQRE_41:$‰CLR.W…(A0)•(dest_ptr)�<==�$00,�$00;‰EXIT†SUB–exit�(subroutine);        RQ_DIS10:Q_EN_10: *ˆrelease�(asq);!*ˆdest_ptr�<==�def_buf�(asq_ptr);*ˆcall�s_export�(dest_buf);*ˆexit�(subroutine); ‰RELEASE_ASQ“release�(asq);6‰MOVE.L„ASQDBUF(A4),A0†dest_ptr�<==�def_buf�(asq_ptr);)‰BRA.S…ASQRE_31Œcall�s_export�(dest_ptr);*¦exit�(subroutine);        RQ_DIS11:Q_EN_11: *ˆrelease�(asq);!*ˆdest_ptr�<==�def_buf�(asq_ptr);*ˆ(dest_ptr)�<==�$00,�$00; *ˆreturn; ‰RELEASE_ASQ“release�(asq);6‰MOVE.L„ASQDBUF(A4),A0†dest_buf�<==�def_buf�(asq_ptr);(‰BRA.S…ASQRE_41Œ(dest_ptr)�<==�$00,�$00;*¦exit�(subroutine); ‰ENDéé: ééé=/*=/*†M68XXX.ASQSTATS.AF=/*-=/* Chain file to assemble M68XXX.ASQSTATS.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.ASQSTATS.LS=/*=/IFC \1ƒ=ARG�M68XXX.ASQSTATS.LS=/ENDIF=/*5=ASM M68XXX.ASQSTATS.SA,M68XXX.ASQSTATS.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.ASQ.MC=/*}=/*=ENDééééééK1ASQSTATSƒIDNT�5,1�68xxx�DIRECTIVE--SET�ASQ�STATUSO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***1***…FILE:‚ASQSTATS�-�TRAP�#1�-�SET�ASQ�STATUSš******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***E***…FUNCTION:‚ASQSTATS�sets�the�status�of�the�ASQ�to�the�proposed†***7***�status�indicated�within�the�input�parameter.‚If‰***9***�the�proposed�status�indicates�that�the�ASR�shouldˆ***;***�be�enabled,�and�the�ASQ�is�not�empty,�then�ASQSTATS†***+***�will�dispatch�the�task�to�it's�ASR.–******É******…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:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É***; ***…ENTRY�CONDITIONS:³******É******‡A6�=�client_tcb_ptr;®******‡A0�=�parameter;³******Œbit_2�:=�enable�(asr);§***)***Œbit_1�:=�enable�(default�buffer);œ******Œbit_0�:=�enable�(asq);§******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É******‡D0�=�0‚Success;²******É******‡D0�<>�0�Failure;²******É***5***ŠThe�following�error�codes�are�returned�in�D0:’******É***4***ŒRTCDNTBL�-�04‚Required�table�does�not�exist.�******É***7***ŒRTCDNFND�-�07‚Entry�not�found�in�table�or�list.�******É***,***ŒRTCDLGCF�-�11‚Request�conflicts�with˜******›existing�table�entries.—******É******É******É******É***O*******************************************************************************O*******************************************************************************O*^*****************************************************************************‰PAGE*,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesT9]deTmVuA}G*…--------‚-------------‚----------------------------------------------)*…09/02/84‚MSLŒRe-wrote�as�state�machine.C*…12/27/83‚Mark�Lanus…Added�code�to�insure�that�status�was�entirely.*župdated�in�one�memory�cycle.‚(Or�old�and�new-*žstatus'�together,�and�then�write�new�status*žbyte.)*…11/06/81‚HLD6‹REV�3.00*…04/25/79‚GGC3‹REV�1.00* * *‚XDEF's.*‰XDEF†ASQSTATS‰XDEF†SETASQ_SUB * *‚XREF's.*‰XREF.S„A_EXPORT‰XREF.S„DISP_ASR **‚Included�files:***ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.ASQ.MC*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.ASQ.MC‰LIST‰SECTION�LEVEL04‰PAGE)*asqstats: proc (client_tcb_ptr, status);  *„dcl‚status�bits_2-0�(A0);#*„dcl‚client_tcb_ptr�longword�(A6);  *ˆcall�setasq_sub;*ˆexit�(subroutine);  *end asq_stats;‰PAGE)*asqstats: proc (client_tcb_ptr, status);  *„dcl‚status�bits_2-0�(A0);#*„dcl‚client_tcb_ptr�longword�(A6);  *ˆcall�setasq_sub;*ˆexit�(subroutine); ASQSTATS: ‰BSR.S…SETASQ_SUB ‰EXIT†SUB  *end asq_stats;‰PAGE+*setasq_sub: proc (client_tcb_ptr, status);  *„dcl‚status�bits_2-0�(A0);#*„dcl‚client_tcb_ptr�longword�(A6);  $*ˆtarget_tcb_ptr�<==�client_tcb_ptr;'*ˆasq_ptr�<==�tcb_asq�(client_tcb_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�return�(error_04); *ˆelse�do; *�status�<==�status�&�%00000111;*�if*�(en_asr�(status)�=�set)�&**�(asr_nval�(asq_st_mode�(asq_ptr))�=�set)*�then�return�(error_07); *�else�if*�(en_dbuf�(status)�=�set)�&,*�(dbuf_val�(asq_st_mode�(asq_ptr))�=�reset)*�then�return�(error_11); *�else�do;*’freeze�(asq);*’if�(task�is�going�to�asr)*’then�reset�(en_asr�(status));7*’new_state�<==�map_tbl�((status�<<�1)�|�(asqmt�>>�1)); *’reset�(go_to_asr�(new_state));/*’if�(go_to_asr�(new_state)�was�reset)�then�do;$*—asq_state�(asq_ptr)�<==�new_state;*—release�(asq);*’end; *’else�do;*—reset�(export�(new_state));,*—if�(export�(new_state)�was�reset)�then�do;$*œasq_state�(asq_ptr)�<==�new_state;*œrelease�(asq);*œget�(asq_xfr�vector);*œcall�disp_asr;**œpop�subroutine�return�address�off�stack;*œexit�(to�asr);*—end; *—else�do;$*œasq_state�(asq_ptr)�<==�new_state;*œrelease�(asq);!*œdest_ptr�<==�def_buf�(asq_ptr);*œcall�a_export�(dest_ptr);*œcall�disp_asr;**œpop�subroutine�return�address�off�stack;*œexit�(to�asr);*—end;*’end;*�end;*ˆend;  *end setasq_sub;‰PAGE$*ˆtarget_tcb_ptr�<==�client_tcb_ptr;'*ˆasq_ptr�<==�tcb_asq�(client_tcb_ptr);*ˆif�(asq_ptr�=�0)*ˆthen�return�(error_04); SETASQ_SUB: 0‰MOVE.L„A6,A; 5�target_tcb_ptr�<==�client_tcb_ptr;:‰MOVE.L„TCBASQ(A6),A4‡asq_ptr�<==�tcb_asq�(clien_tcb_ptr);‰MOVE.L„A4,D0�if�(asq_ptr�=�0))‰EXIT.EQƒRTCDNTBLŒthen�return�(error_04);  *ˆelse�do; *�status�<==�status�&�%00000111;*�if*�(en_asr�(status)�=�set)�&**�(asr_nval�(asq_st_mode�(asq_ptr))�=�set)*�then�return�(error_07); ‰MOVE.L„A0,D03‰AND.W…#%00000111,D0‡status�<==�status�&�%00000111;‰BTST†#ASQSREN,D0‰if)‰BEQ.S…ASQST_01‘(en_asr�(status)�=�set)�& ;‰BTST†#ASQS_RNV,ASQSTMD2(A4)ƒ(asr_nval�(asq_st_mode)�=�set))‰EXIT.NEƒRTCDNFNDŒthen�return�(error_07);  *�else�if*�(en_dbuf�(status)�=�set)�&,*�(dbuf_val�(asq_st_mode�(asq_ptr))�=�reset)*�then�return�(error_11); ASQST_01:‰BTST†#ASQSDBEN,D0ˆelse�if*‰BEQ.S…ASQST_02‘(en_dbuf�(status)�=�set)�& =‰BTST†#ASQS_DBV,ASQSTMD2(A4)ƒ(dbuf_val�(asq_st_mode)�=�reset))‰EXIT.EQƒRTCDLGCFŒthen�return�(error_11);‰PAGE *�else�do;*’freeze�(asq);*’if�(task�is�going�to�asr)*’then�reset�(en_asr�(status)); ASQST_02: ‰FREEZE_ASQ*‰BTST†#TSK2EVWK,TCBSTAT2(A6)ˆfreeze�(asq);)‰BEQ.S…ASQST_03–if�(task�is�going�to�asr) /‰BCLR†#ASQSREN,D0“then�reset�(en_asr�(status));  7*’new_state�<==�map_tbl�((status�<<�1)�|�(asqmt�>>�1)); *’reset�(go_to_asr�(new_state));/*’if�(go_to_asr�(new_state)�was�reset)�then�do;$*—asq_state�(asq_ptr)�<==�new_state;*—release�(asq);*’end;  ASQST_03: ‰LSL.W…#1,D0‰BTST†#ASQMTBIT,ASQSWMD2(A4)‰BEQ.S…ASQST_04 ‰BSET†#0,D0 ASQST_04:;‰MOVE.B„MAP_TBL(PC,D0.W),D0�new_state�<==�map_tbl�(status); 1‰BCLR†#GOTO_BIT,D0ˆreset�(go_to_asr�(new_state));1‰BNE.S…ASQST_05Œif�(go_to_asr�was�reset)�then�do; :‰MOVE.W„D0,ASQSTATE(A4)Šasq_state�(asq_ptr)�<==�new_state;*«release�(asq); ‰RELEASE_ASQ ‰RTS›end;  *’else�do;*—reset�(export�(new_state));,*—if�(export�(new_state)�was�reset)�then�do;$*œasq_state�(asq_ptr)�<==�new_state;*œrelease�(asq);*œget�(asq_xfr�vector);*œcall�disp_asr"*œpop�subroutine�return�off�stack;*œexit�(to�asr);*—end;  ASQST_05:,‰BCLR†#EX_BIT,D0Šreset�(export�(new_state));.‰BNE.S…ASQST_06Œif�(export�was�reset)�then�do; :‰MOVE.W„D0,ASQSTATE(A4)Šasq_state�(asq_ptr)�<==�new_state;‰RELEASE_ASQ˜release�(asq);!‰GET_ASQXFR™get�(asq_xfr�vector);‰BSR‡DISP_ASR‘call�disp_asr;*‰ADD.L…#4,A7”pop�return�address�off�stack;‰EXIT†ASR–exit�(to�asr);*¦end; *—else�do;$*œasq_state�(asq_ptr)�<==�new_state;*œrelease�(asq);!*œdest_ptr�<==�def_buf�(asq_ptr);*œcall�a_export�(dest_ptr);*œcall�disp_asr;"*œpop�subroutine�return�off�stack;*œexit�(to�asr);*—end;  ASQST_06:9‰MOVE.W„D0,ASQSTATE(A4)…asq_state�(aq_ptr)�<==�new_state;*¦release�(asq); ‰RELEASE_ASQ6‰MOVE.L„ASQDBUF(A4),A0†dest_ptr�<==�def_buf�(asq_ptr);'‰BSR‡A_EXPORTŒcall�a_export�(dest_ptr);‰BSR‡DISP_ASRŒcall�disp_asr;*‰ADD.L…#4,A7”pop�return�address�off�stack;‰EXIT†ASR–exit�(to�asr);*¦end;*’end;*�end;*ˆend;  *end asqstats;‰PAGE(*‡This�is�the�input�byte�to�the�map_tbl:**C*‡_________________________________________________________________*‡|‡|‡|‡|‡|‡|‡|‡|‡|+*‡|‰Must�be�zeroŠ|…proposed�state„|�curr_�|*‡|Ÿ|—|�state�|*‡|‡|‡|‡|‡|‡|‡|‡|‡|C*‡-----------------------------------------------------------------*‡|‡|‡|‡|‡|‡|‡|‡|‡|+*‡|‰Must�be�zeroŠ|‚en_‚|‚en_‚|‚en_‚|‚asq_�|*‡|Ÿ|‚asr‚|‚dbuf�|‚asq‚|‚mtƒ|*‡|‡|‡|‡|‡|‡|‡|‡|‡|C*‡-----------------------------------------------------------------*** +*‡This�is�the�output�byte�from�the�map_tbl:**C*‡_________________________________________________________________*‡|‡|‡|‡|‡|‡|‡|‡|‡|?*‡|‚Control�bits�|‚New�asq_state�and�asq_sw_mode�bits.‚|�must‚|*‡|�|§|�be�0.�|*‡|‡|‡|‡|‡|‡|‡|‡|‡|C*‡-----------------------------------------------------------------*‡|‡|‡|‡|‡|‡|‡|‡|‡|5*‡|�go_to�|�export|‡asq_state‡|�dbuf_�|�asq_‚|�must‚|*‡|�asrƒ|‡|—|�en„|�mt„|�be�0.�|*‡|‡|‡|‡|‡|‡|‡|‡|‡|C*‡-----------------------------------------------------------------**GOTO_ASR:ŠEQU‡$80NOGO< _ASR:ŠEQU‡$00EXPORT:ŒEQU‡$40NO_EXPORT:‰EQU‡$00*GOTO_BIT:ŠEQU‡$07EX_BIT:ŒEQU‡$06‰PAGE*‡And�this�is�the�map_tbl: *�INPUT:‡|„OUTPUT:*Ž|*ƒADAA‡|*ƒSBSS‡|*ƒRUQQ‡|D*ƒ|F||‡|------------------------------------------------------------ *ƒE|EM‡|—|£|6*ƒNENT‡|…CONTROL�BITS†|ƒASQ_STATE�&�ASQ_SW_MODE�BITS„| *„N‰|—|£|?*Ž------------|-----------|-----------------------------------|*ƒ||||‡|‹|‹|‹|‹|‹|6*ƒ||||‡|�GOTO_ASR‚|�EXPORT„|�ASQ_†|�DBUF_ENƒ|�ASQ_MT„|*ƒVVVV‡|‹|‹|�STATE…|‹|‹|?*Ž------------------------------------------------------------- MAP_TBL: 9MAP_0000:�DC.BƒNOGO_ASR+NO_EXPORT+RQ_DIS+DBUF_DIS+ASQ_NMT8MAP_0001:�DC.BƒNOGO_ASR+NO_EXPORT+RQ_DIS+DBUF_DIS+ASQ_MT7MAP_0010:�DC.BƒNOGO_ASR+NO_EXPORT+Q_EN+DBUF_DIS+ASQ_NMT6MAP_0011:�DC.BƒNOGO_ASR+NO_EXPORT+Q_EN+DBUF_DIS+ASQ_MT 8MAP_0100:�DC.BƒNOGO_ASR+NO_EXPORT+RQ_DIS+DBUF_EN+ASQ_NMT7MAP_0101:�DC.BƒNOGO_ASR+NO_EXPORT+RQ_DIS+DBUF_EN+ASQ_MT6MAP_0110:�DC.BƒNOGO_ASR+NO_EXPORT+Q_EN+DBUF_EN+ASQ_NMT5MAP_0111:�DC.BƒNOGO_ASR+NO_EXPORT+Q_EN+DBUF_EN+ASQ_MT 9MAP_1000:�DC.BƒGOTO_ASR+NO_EXPORT+RQ_DIS+DBUF_DIS+ASQ_NMT6MAP_1001:�DC.BƒNOGO_ASR+NO_EXPORT+R_EN+DBUF_DIS+ASQ_MT7MAP_1010:�DC.BƒGOTO_ASR+NO_EXPORT+Q_EN+DBUF_DIS+ASQ_NMT7MAP_1011:�DC.BƒNOGO_ASR+NO_EXPORT+RQ_EN+DBUF_DIS+ASQ_MT 5MAP_1100:�DC.BƒGOTO_ASR+EXPORT+RQ_DIS+DBUF_EN+ASQ_NMT5MAP_1101:�DC.BƒNOGO_ASR+NO_EXPORT+R_EN+DBUF_EN+ASQ_MT3MAP_1110:�DC.BƒGOTO_ASR+EXPORT+Q_EN+DBUF_EN+ASQ_NMT6MAP_1111:�DC.BƒNOGO_ASR+NO_EXPORT+RQ_EN+DBUF_EN+ASQ_MT ‰ENDéééééé=/*=/*†M68XXX.ASRINT.AF=/*+=/* Chain file to assemble M68XXX.ASRINT.SA=/*:=/* If no output argument is specified for the listing the/=/* chain file will default to M68XXX.ASRINT.LS=/*=/IFC \1ƒ=ARG�M68XXX.ASRINT.LS=/ENDIF=/*1=ASM M68XXX.ASRINT.SA,M68XXX.ASRINT.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDé< ééééé…>ASRINTƒIDNT�6,0�68xxx�TRAP�0--PROVIDE�EVENT�INTERRUPTŽ07/13/84O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***4***…FILE:‚ASRINT�-�INTERNAL�SUBROUTINE�OF�RMS68K—******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***I***…FUNCTION:‚ASRINT�will�set�up�a�task�to�be�dispatched�to�it's�ASR.‚******É******…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:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******É******…ENTRY�CONDITIONS:³******É******‡A4�<==�asq_ptr;³******‡A5�<==�target_tcb_ptr;¬******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------)*…09/04/84‚MSLŒRe-wrote�as�state�machine.2*…07/03/84‚SPTŒRemove�unnecassary�calls�to�LOGPHY.0*…10/03/81‚SJFŒFix�errant�longword�access�of�ASR*žaddress�when�past�end�of�ASQ.*…02/08/82‚HLD6‹REV�3.10.*…11/06/81‚HLD6‹REV�3.00.*…03/24/81‚HLD6‹REV�2.00.*…08/16/79‚HLD6‹REV�1.01.*…04/26/79‚GGC3‹REV�1.00. * *‚XDEF's.*‰XDEF†DISP_ASR‰XDEF†GTASQBUF‰XDEF†I_DISP_ASR‰XDEF†READY_ASR * *‚XREF's.*‰XREF.S„PATBEG‰XREF.S„PREEMPT_FLAG‰XREF.S„RUNNER ‰XREF†PAT_CAN_NODE **‚Included�files:**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.ASQ.EQ*ˆINCLUDEƒ9995.&.BAB.EQŽF—_ŸS§*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.ASQ.EQ‰INCLUDEƒ9995.&.BAB.EQ‰INCLUDEƒ9995.&.PAT.EQ‰INCLUDEƒ9995.&.INTERRUP.MC‰LIST‰SECTION�LEVEL04‰PAGE"= *ready_asr:‚proc‚(target_tcb_ptr);"*disp_asr:ƒentry�(target_tcb_ptr);$*i_disp_asr:ƒentry�(target_tcb_ptr);  #*„dcl‚target_tcb_ptr�longword�(A5);  3*****„reset�(tsksevwt�(tcbstate�(target_tcb_ptr)));&*ˆif�(tcb_delay�(target_tcb_ptr)�<>�0)*ˆthen�cancel�(delay);*ˆcall�ready�(target_tcb_ptr);-*ˆset�(tsk2evwk�(tcbstate�(target_tcb_ptr)));  *end ready_asr;‰PAGE"*ready_asr:‚proc‚(target_tcb_ptr);"*disp_asr:ƒentry�(target_tcb_ptr);$*i_disp_asr:ƒentry�(target_tcb_ptr);  #*„dcl‚target_tcb_ptr�longword�(A5);  READY_ASR: DISP_ASR: I_DISP_ASR: 3*****„reset�(tsksevwt�(tcbstate�(target_tcb_ptr))); ‰BCLR†#TSKSEVWT,TCBSTATE(A5)  &*ˆif�(tcb_delay�(target_tcb_ptr)�<>�0)*ˆthen�cancel�(delay); ‰MOVE.W„SR,-(A7)‰DISABLE_INTERRUPTS;‰MOVE.L„TCBDLAY(A5),D0†if�(tcb_delay�(target_tcb_ptr)�<>�0)‰IFˆ„THEN.S&‰BSR‡PAT_CAN_NODEˆthen�calcel�(delay);‰ENDI *ˆif�(tcb_ptr�=�runner)*ˆthen�set�(preempt_flag); "‰MOVE.W„(A7)+,SR‰Enable�interrupts‰CMPA.L„RUNNER,A5‰IFˆ„THEN.S‰STˆPREEMPT_FLAG‰ENDI  *ˆcall�ready�(target_tcb_ptr); ,‰TR0.RYASR�(A5)•call�ready�(target_tcb_ptr);  *-*ˆset�(tsk2evwk�(tsbstate�(target_tcb_ptr)));* =‰BSET†#TSK2EVWK,TCBSTAT2(A5)ƒset�(tsk2evwk�(target_tcb_ptr)); RDASR_99:‰RTS‰PAGE**‡******************9*‡*‚U�P�D�T�A�S�Q�*ƒUPDATE�ASQ�POINTERS�WHEN�MESSAGE�Q'ED*‡*******************>*…SPT‚06/25/84†REV‚2.00…Include�an�overflow�area�at�the�end�of *¦the�ASQ.*…HLD6�8-16-79‡REV‚1.00* *†ENTRY:‚A4�POINTS�TO�TARGET�ASQ.*ŽD0�CONTAINS�TOTAL�#�BYTES�NEEDED�FOR�MESSAGE**…EXIT�:‚PCƒ--�GOOD�RETURN;*‘D0�=�MESSAGE�BYTE�COUNT�ROUNDED�UP�TO�FIRST�WORD�BOUNDARY6*‘A0�=�BEGINNING�ADDRESS�OF�SPACE�RESERVED�FOR�MESSAGE*‘A4�=�PRESERVED!*�PC+2�--�ERROR�--�NO�ROOM�IN�ASQ***…REGISTERS�USED�:�01234567*** ŠXDEF„UPDTASQŠXDEF„SBUPDATQ**8*ˆThe�function�of�this�routine�is�to�verify�that�the�ASQ+*ˆhas�enough�space�for�the�pending�message.(*ˆThe�flow�of�the�routine�is�as�follows:!*’1.�Save�current�interrupt�mask.<*’2.�Round�up�the�message�length�to�the�first�word�boundary.*’3.�Disable�all�interrupts.*’4.�if�ASQPUT�=�ASQGET*œif�ASQCNT�<>�0*Ÿthen�goto�REJECT;�ASQ�is�full**œif�ASQCNT�=�0;�this�is�the�first�message*Ÿthen�set�D0�=�1st_msg_flag *Ÿgoto�DO*•else*œif�ASQPUT�>�ASQGET**Ÿthen�goto�DO�;�we�do�not�check�for�space*¬;�since�message�can�overflow.*•else*œif�ASQPUT�<�ASQGET*Ÿif�D1�>�(ASQGET�-�ASQPUT)$*¢then�goto�REJECT;�not�enough�space *Ÿelse�set‚DO *’5.�REJECT *œmodify�return_address�on�stack4*œset�ASQPUT�=�ASQPUT�+�D1;�point�to�next�msg�buffer/*œgoto�EXIT;�we�can�not�be�in�the�overflow�area*’6.�DO*œset�A3�=�ASQPUT.4*œset�ASQPUT�=�ASQPUT�+�D1;�point�to�next�msg�buffer2*œif�ASQPUT�>�ASQTOP;�are�we�in�the�overflow�area?-*Ÿthen�ASQPUT�=�ASQBOT;�wrap�it�to�the�bottom*œelse *’7.�EXIT*œrestore�interrupt�mask*œend�of�routine* GTASQBUF: SBUPDATQUPDTASQ ‰MOVE.L„D1,-(A7)ŒSAVE�REGISTERS. ** Set D1 = ASQGET - ASQPUT*‰MOVE.L„ASQPUT(A4),A0‰MOVE.L„ASQGET(A4),D1 ‰SUB.L…A0,D1‰BEQ.S…P.EQU.G�put�=�get‰BPL.S…P.LT.GŽput�<�get UPDATASQ�EQU‡*“put�>�get*‰ADD.L…A0,D0�Update�pointer�to�next�buffer1‰CMP.L…ASQTOP(A4),D0‡Are�we�in�the�overflow�area?.‰BCC.S…WRAP�Yes..wrap�pointer�to�bottom�of�ASQ/‰MOVE.L„D0,ASQPUT(A4)‡no...save�new�put_pointerRESTORE'‰SUB.L…A0,D0�Restore�message�byte�countINC_CNT:+‰ADD.W…#1,ASQCNT(A4)‡increment�(asq_count);UPDTASQX#‰MOVE.L„(A7)+,D1ŒRestore�registers.‰RTSWRAP>‰MOVE.L„ASQBOT(A4),ASQPUT(A4)�Set�put_pointer�to�bottom�of�ASQ ‰BRA‡RESTORE** Put_pointer = get_pointer*P.EQU.G#‰TST.W…ASQCNT(A4)ŠIs�the�ASQ�empty;+‰BEQ‡UPDATASQŒYes...update�the�ASQ�pointers** Error, no room in ASQ*REJECT$‰ADD.L…#2,4(A7)ŒSignal�error�return. ‰BRA‡UPDTASQX** Put_pointer < get_pointer*>*ˆThis�condition�will�happen�after�the�ASQ�has�already�wrapped *ˆaround.= *P.LT.G*‰CMP.L…D0,D1�Enough�space�for�new�message?‰BMI‡REJECTŽNo...reject�message'‰ADD.L…D0,ASQPUT(A4)‡Update�put_pointer‰BRA‡INC_CNT�Get�out�here‰ENDéééééé=/*=/*†M68XXX.ATSEM.AF=/**=/* Chain file to assemble M68XXX.ATSEM.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.ATSEM.LS=/*=/IFC \1ƒ=ARG�M68XXX.ATSEM.LS=/ENDIF=/*/=ASM M68XXX.ATSEM.SA,M68XXX.ATSEM.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UST.EQ=/*}=/*=ENDéééééé¯> ‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.UST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.UST.EQ‰LIST‰PAGE?ATSEMƒIDNT…5,1„68xxx�DIRECTIVES--CREATE�AND�ATTACH�TO�SEMAPHORE*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.*"*„ATSEMƒ--�REV�1.00ƒ5/16/79ƒ(HLD6)*Œ--�TRAP�1�ROUTINE*-*‡PURPOSE:ƒREQUEST�TO�ATTACH�A�USER�SEMAPHORE*'*‰ENTRY:‚A6�HAS�REQUESTOR'S�TCB�ADDRESS *‘A4�HAS�PARAMETER�BLOCK�ADDRESS* 0�-�SEMAPHORE�NAME* 4�-�SEMAPHORE�KEY�(NOT�USED)* 8�-�INITIAL�COUNT* 9�-�SEMAPHORE�TYPE**ŠEXIT:ƒD0�HAS�RETURN�CODE)*’D0�=�0‚GOOD�RETURN,�SEGMENT�DEALLOCATED*’A0�=�SEMAPHORE�KEY*<*ˆTHE�FOLLOWING�RETURN�CODES�ARE�RETURNED�IN�LOWER�1/2�OF�D0*6*ŠRTCDPBLK�-�2ƒPARAM�BLK�ADDR�NOT�IN�USER'S�ADDR�SPACE=*ŠRTCDTFUL�-�5ƒUSER�SEMAPHORE�TABLE�IS�FULL�-�NO�ROOM�FOR�NEW7*ŠRTCDDPRQ�-�6ƒDUPLICATE�REQUEST�-�CREATE�OF�TYPE�1�SEM5*ŠRTCDLGCF�-11ƒSEM�TYPE�DOES�NOT�MATCH�ENTRY�IN�TABLE.*ŠRTCDOPT‚-15ƒILLEGAL�SEM�TYPE�-�1,2,3�ALLOWED,*ŠRTCDPCNT�-16ƒNEGATIVE�COUNT�FIELD�SUPPLIED*‰SECTION�LEVEL04* ‰XDEF†ATSEM ‰XDEF†CRSEM ‰XREF.S„SEMUST‰PAGECRSEM: ‰MOVE.L�#1,D7‰SWAPƒD7 ‰BRA.S‚ATSEM1 ATSEM: ‰CLR.L‚D7  *(*…CHECK�SEMAPHORE�TYPE�AND�INITIAL�COUNT* ATSEM1:%ˆMOVE.L‚A4,A5‡PARAMETER�BLOCK�ADDRESS8ˆCLR.LƒTCBA0(A6)ƒCLEAR�SEM�KEY�RETURNED�IN�CASE�OF�ERROR ˆCLR.LƒD6ˆMOVE.B‚9(A5),D6…SEMAPHORE�TYPEˆCMP.Bƒ#1,D6‰IS�IT�TYPE�1ˆBEQ.SƒATSEM1A†YES ˆBLT.SƒATSEME4†<�1�IS�ILLEGAL ˆCMP.Bƒ#3,D6ˆBGT.SƒATSEME4†>�3�IS�ILLEGAL ˆTST.LƒD7'ˆBEQ.SƒATSEM2†SKIP�COUNT�TEST�IF�ATTACH !ˆMOVE.B‚8(A5),D7„SAVE�COUNT�IN�D7 ˆBTST„#7,D7&ˆBEQ.SƒATSEM2†COUNT�CANNOT�BE�NEGATIVE  **‡ERROR�RETURNS* ˆEXITƒRTCDPCNT  ATSEME4: ˆEXITƒRTCDOPT  ATSEME5:ˆEXITƒRTCDDPRQˆPAGEATSEM1A: ‰CLR.L‚D7ŠTYPE�1�CREATE�=�ATTACH  **ˆGET�EXCLUSIVE�ACCESS�TO�UST*¸kÁ_ÉhÑ ATSEM2:‰IFNE„MULTPROC ‰TR0.PƒSEMUST‰ENDC  **ˆLOOK�FOR�ENTRY�IN�UST*ATSEM3:*‰MOVE.L‚A6,A4ˆADDR�OF�TCB�IN�A4�FOR�FNDSEM*‰TR0.FNDSEM‚<(A5),I>‰ARG�IS�SEMAPHORE�NAME+‰BRA.S…ATSEM4ˆFOUND�MATCHING�ENTRY�IN�TABLE &‰TST.L„D0ŠIS�THERE�ROOM�FOR�NEW�ENTRY?‰BNE.S„ATSEM5†YES ‰EXIT…RTCDTFUL�ERROR�CODE **‡FOUND�ENTRY�FOR�THIS�TASK* ATSEM4:(‰MOVE.LƒD0,TCBA0(A6)†RETURN�ENTRY�NUMBER#‰TST.L„D7ŽIS�THIS�ATTACH�OR�CREATE?‰BEQ†ATSEMX4‰RETURN�IF�ATTACH ‰CMP.B„#3,D6$‰BEQ†ATSEME5‹MULTIPLE�CALLS�-�TYPE�3  ATSEM4A:‰MOVE.LƒD0,D3ŠENTRY�OFFSET‰CMP.B„USTTYPE(A1,D3),D6&‰BNE†ATSEME6‰EXISTING�ENTRY�NOT�TYPE�2 .‰TST.W„USTUCNT(A1,D3)ƒIS�THIS�ENTRY�A�POINTER?#‰BGE.S„ATSEM4BŠNO�-�IT�IS�SEMAPHORE )‰MOVE.LƒUSTSPTR(A1,D3),D0„GET�SEM�POINTER‰BRA.S„ATSEM4A  ATSEM4B:)‰MOVE.B‚D7,USTXCNT(A1,D3)„SAVE�INIT�COUNT&‰TST.BƒUSTSEM+1(A1,D3)†RESET�SEM�COUNT‰BMI.SƒATSEM4C *‰MOVE.B‚D7,USTSEM+1(A1,D3)‚RESET�SEM�COUNT ‰BRA…ATSEMX4  ATSEM4C:ŠTST.B„D7‹SEMAPHORE�HAS�WAITERS ŠBEQ†ATSEMX4 ATSEM4D:'ŠTR0.V„„SIGNAL�SEMAPHORE&ŠSUB.W„#1,D7‡DECREMENT�SEMAPHORE�COUNT$ŠBNE†ATSEM4D…BRANCH�BACK�IF�NOT�ZERO ATSEMXY4: ŠBRA†ATSEMX4  **ˆADD�ENTRY�TO�TABLE*�D0�=�ENTRY�#�OF�UNUSED�ENTRY1*�D1�=�ENTRY�#�OF�SEMAPHORE�ENTRY�(IF�ONE�EXISTS)#*�D2�=�COUNT�USED�TO�UPDATE�USTCENT* ATSEM5:2‰BSET„#TSKIUSEM,TCBATTI(A6)„SET�USEM�ATTRIBUTE�BIT0‰MOVE.L‚D0,TCBA0(A6)†RETURN�ENTRY�NUMBER�TO�USER‰MOVE.L‚D0,D3ˆENTRY�OFFSET-‰MOVE.L‚TCBNAME(A6),USTTNAME(A1,D3)„TASK�NAME1‰MOVE.L‚TCBSESSN(A6),USTSESSN(A1,D3)ƒSESSION�CODE)‰MOVE.LƒA0,USTSNAME(A1,D3)�SEMAPHORE�NAME#‰TST.WƒD1�WAS�SEMAPHORE�ENTRY�FOUND‰BNE.SƒATSEM6‰YES  **ˆBUILD�SEMAPHORE�ENTRY* -‰M> OVE.W‚#1,USTUCNT(A1,D3)…SET�USER�COUNT�TO�1(‰MOVE.B‚D6,USTTYPE(A1,D3)…SEMAPHORE�TYPE)‰MOVE.B‚D7,USTXCNT(A1,D3)…SAVE�INIT�COUNT4‰MOVE.W‚D7,USTSEM(A1,D3)†PUT�INIT�COUNT�IN�SEMAPHORE‰CLR.LƒUSTSEM+2(A1,D3)(‰MOVE.W‚D2,USTCENT(A1)ˆCURRENT�#�ENTRIES‰CMP.W„#1,D6�IS�THIS�TYPE�1?‰BNE.SƒATSEM5A ,‰MOVE.W‚#1,USTSEM(A1,D3)…SET�INIT�COUNT�TO�1 ‰BRA…ATSEMXY4  ATSEM5A:‰CMP.W„#2,D6�TYPE�2�-�DONE ‰BEQ…ATSEMXY4 ‰TST.LƒD7"‰BNE…ATSEMXY4�TYPE�3�CREATE�-�DONE .‰CLR.LƒUSTTNAME(A1,D3)‡CLEAR�NAME�IN�SEM�ENTRY4‰MOVE.W‚#$400,USTUCNT(A1,D3)ƒMARK�ENTRY�-�NO�CREATOR$‰BRA…ATSEM3�GO�BACK�TO�BUILD�POINTER  **…BUILDƒPOINTER�ENTRY* ATSEM6:1‰EXG…D1,D3‰EXCHANGE�SEM�ENTRY�OFFSET�-�PTR�OFFSET  */*ƒ(A1,D1)�=�NEW�ENTRY…(A1,D3)�=�SEMAPHORE�ENTRY* ‰CMP.BƒUSTTYPE(A1,D3),D6*‰BNE…ATSEMXY4„TYPE�DOES�NOT�MATCH�ORIGINAL ‰TST.LƒD7‰BEQ.S„ATSEM6A !‰CMP.L„#3,D6ˆIS�IT�TYPE�3�CREATE? ‰BEQ.S„ATSEM7ˆYES�-�SPECIAL�CASE ATSEM6A:‰CMP.Lƒ#2,D6ŒTYPE�2?‰BNE.S‚ATSEM6B 2‰TST.LƒUSTTNAME(A1,D3)†IS�NAME�IN�SEMAPHORE�ENTRY? ‰BEQ.SƒATSEM9�NO�-�GO�FILL�IT�IN ATSEM6B:8‰MOVE.L‚D3,USTSPTR(A1,D1)„PUT�SEMAPHORE�POINTER�IN�ENTRY4‰MOVE.W‚#$FFFF,USTUCNT(A1,D1)„-1�FLAGS�POINTER�ENTRY(‰MOVE.B‚D6,USTTYPE(A1,D1)‡SEMAPHORE�TYPE#‰CLR.BƒUSTXCNT(A1,D1)ŠINITIAL�COUNT1‰MOVE.W‚D2,USTCENT(A1)ˆUPDATE�CURRENT�ENTRY�COUNT5‰ADD.Wƒ#1,USTUCNT(A1,D3)…INCREMENT�COUNT�IN�SEM�ENTRY ‰TST.LƒD7‰BNE…ATSEM4B�CREATE�-�TYPE�2 ‰CMP.Wƒ#3,D6’TYPE�3�?‰BNE.SƒATSEMX4�NO .‰TST.LƒUSTTNAME(A1,D3)ˆWAS�TYPE�3�CREATE�DONE?‰BNE.SƒATSEMX4�YES  ‰IFNE„MULTPROC-‰TR0.VƒSEMUST�GIVE�UP�EXCLUCIVE�ACCESS�TO�UST‰ENDC %‰TR0.Pƒ‡USER�MUST�WAIT!‰EXIT„SUB“exit�(subroutine�exit);   *#*…TYPE�3�CREATE�--�SEMAPHORE�EXISTS* ATSEM7:‰TST.LƒUSTTNAME(A1,D3)‰BNE…ATSEME5ŽMULTIPLE�CREATES -‰MOVE.L‚D3,TCBA0(A6)�RETURN�KEY�TO�THIS�ENTRY#‰MOVE.L‚TCBNAME(A6),USTTNAME(A1,D3)‰ADD.Wƒ#1,USTUCNT(A1,D3)‰MOVE.BƒD7,USTXCNT(A1,D3)‰BRA.S„ATSEM7B ATSEM7A:‰TR0.Vƒ ATSEM7B:‰TST.BƒUSTSEM+1(A1,D3) ‰BMI…ATSEM7A ‰MOVE.B‚D7,USTSEM+1(A1,D3)‰BRA.SƒATSEMX4  */*†TYPE�2�SEMAPHORE�ENTRY�IS�EMPTY�--�FILL�IT�IN* ATSEM9:‰MOVE.L‚D3,TCBA0(A6)#‰MOVE.L‚TCBNAME(A6),USTTNAME(A1,D3)‰ADD.Wƒ#1,USTUCNT(A1,D3)#‰TST.LƒD7‘IS�THIS�CREATE�OR�ATTACH?‰BEQ.SƒATSEMX4ŒATTACH ‰BRA…ATSEM4BŒCREATE  **ƒERROR* ATSEME6:‰EXIT„RTCDLGCF  *!*†GIVE�UP�EXCLUSIVE�ACCESS�TO�UST* ATSEMX4:‰IFNE„MULTPROC ‰TR0.VƒSEMUST‰ENDC !‰EXIT„SUB“exit�(subroutine�exit);‰ENDééééé? é=/*=/*†M68XXX.BKG.AF=/*(=/* Chain file to assemble M68XXX.BKG.SA=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to M68XXX.BKG.LS=/*=/IFC \1ƒ=ARG�M68XXX.BKG.LS=/ENDIF=/**=ASM M68XXX.BKG.SA,M68XXX.BKG.RO,\1;RZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.BAB.EQ=/*}=/*=ENDééééééÙ8BKG‡IDNTƒ5,1�M68xxx�--�Background�and�guarded�processingO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***;***…FILE:‚BKG�--�BACKGROUND�AND�CALL_GUARDED�PROCESSING�******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***C***…FUNCTION:‚These�routines�provide�support�for�background�andˆ***B***‡guarded�processing�modes.‚See�the�RMS68K�documentation�for‡***E***‡full�details,�but�basically�the�background�is�a�way�for�ISR's…***D***‡to�defer�execution�of�code�until�the�interrupt�level�returns†******‡to�zero.º******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------'*†8/11/83‚Steve�FranckƒInitial�writing.* * *‚XDEF's.*<ŠXDEFƒBKG_DISPATCH‡Entry�pt.�to�execute‚background�activity.=ŠXDEFƒBKG_SCHEDULE‡Entry�pt.�to�schedule�background�activity.=ŠXDEFƒCALL_GUARDED‡Entry�pt.�to�execute�a�guarded�subroutine.  * *‚XREF's.*ŠXREF.S�BKG_ACTIVEŠXREF.S�BKG_? FLAGŠXREF.S�BKG_HEADŠXREF.S�BKG_TAIL  **‚Included�files:*2*‰STR.EQ”Equates�for�supervisor�code�under�RMS68K.7*‰UTILITY.MC�Macros�of�general�utility,�e.g.�PUSH,�POP.3*‰INTERRUP.MC�Macros�related�to�interrupt�handling.<*‰BAB.EQ†(listed)†Equates�related�to�the�BAB�data�structure.*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠINCLUDE�9995.&.BAB.EQ   ŠSECTION�LEVEL00ŠOPT„BRSŠPAGEâ@ë5ó9û8O*v*****************************************************************************O**********************************************************************************É***F***…ROUTINE:‚BKG_SCHEDULE�--�SCHEDULE�A�ROUTINE�FOR�BKG�EXECUTION.…******É***H***…FUNCTION:‚Takes�the�passed�BAB,�which�represents�some�routine�toƒ***G***‡be�executed�in�background,�and�adds�it�to�the�background�queue.ƒ******É******…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�******‡A:ƒAƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒP ******É******…ENTRY�CONDITIONS:³***D***‡A0ƒ=�pointer�to�the�BAB�representing�the�background�routine.„******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*******************************************************************************O*^***************************************************************************** BKG_SCHEDULE: *ŠPUSH.L�A1‘Save�registers�we'll�blow�away.ŠPUSHƒSR‘Disable�interrupts.ŠDISABLE_INTERRUPTSˆ* -ŠTAS„BABUSE(A0)‰Mark�that�this�BAB�is�in�use.#ŠIF…�THENŠIf�it�wasn't�already, =ŠCLR.L‚BABLNK(A0)‰Clear�the�forward�link�to�mark�end�of�list.:ŠMOVE.L�BKG_TAIL,A1ˆA1�<--�ptr�to�tail�entry�in�bkg�queue.<ŠMOVE.L�A0,BABLNK(A1)†Make�old�tail�entry,�and�the�tail�ptr,?ŠMOVE.L�A0,BKG_TAILˆpoint�to�this�new�guy�(the�new�tail�entry).3ŠST…BKG_FLAG‹Set�BKG_FLAG�to�signal�that�background*£activity�was�scheduled. ŠENDI .ŠPOP„SR‘Restore�interrupt�level�and�registers. ŠPOP.L‚A1‘* ŠRTS—Exit�w/�good�status.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***J***…ROUTINE:‚BKG_DISPATCH�--�DISPATCH�ALL�PENDING�BACKGROUND�ROUTINES.�******É***C***…FUNCTION:‚If�the�background�queue�is�not�empty,�entries�areˆ***@***‡removed�one�at�a�time�from�the�head�of�the�queue�and�theŠ***9***‡designated�routines�are�dispatched�in�background.‘******É******…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:ƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡PˆD�******‡A:ƒPƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒP ******É******…ENTRY�CONDITIONS:³******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*******************************************************************************O*^***************************************************************************** *J*‚NOTE:‚This�code�is�a�bit�touchy.‚Since�it�might�be�called�as�a�result�of7*‚an�interrupt,�the�following�potential�problem�exists:E*ƒ(1)�An�interrupt�occurs�which�results�in�this�routine�being�called.*ƒ(2)�We�lower�the�mask.H*ƒ(3)�Another�interrupt�of�the�same�level�is�waiting,�so�go�back�to�(1).I*‚The�result�would�be�that�the�supervisor�stack�could�grow�without�bound,8*‚which�of�course�would�crash�the�system�in�short�order.*I*‚The�solution�to�this�is�for�this�routine�to�be�careful�not�to�lower�theH*‚interrupt�mask�until�it�has�taken�precautions�that�it�will�not�nest�toG*‚arbitrary�levels.‚The�BKG_ACTIVE�flag�is�the�key�here--the�first�timeE*‚through�we�set�it,�then�lower�the�mask.‚Further�invocation@ s�of�thisH*‚routine�will�result�in�our�noticing�that�BKG_ACTIVE�is�already�set�and**‚exitting�without�ever�lowering�the�mask.*‰PAGE*8*‚Lock�the�background�and�get�set�up�to�dispatch�things.* BKG_DISPATCH:9ŠTAS„BKG_ACTIVE‰If�we're�not�already�running�or�otherwiseŠIF…�THENŠlocked�out, 3ŠSAVEƒD0-D7/A0-A6ˆSave�all�the�registers�except�SP.:ŠLEA„BKG_HEAD,A0ˆA0�<--�addr�of�the�ptr�to�the�head�of�the*§background�queue.  *3*‚Dispatch�the�background�activity�if�there�is�any.* *ŠPUSHƒSR‘Save�the�caller's�interrupt�mask.;ŠDISABLE_INTERRUPTSˆWith�interrupts�disabled,�check�whether9ŠMOVE.L�(A0),D0Œthere's�any�background�work�on�the�queue.ŠIF…�THENŠIf�there�is, ŠREPEAT 6ŠMOVE.L�D0,A1ŽA1�<--�ptr�to�the�next�BAB�in�the�queue.AŠMOVE.L�BABLNK(A1),(A0)„Make�this�guy's�forward�link�the�new�head%*§ptr�(to�remove�him�from�the�queue)..ŠIF…�THENŠIf�this�is�the�end�of�the�queue,=ŠMOVE.L�A0,BKG_TAILˆSet�the�tail�pointer�to�point�to�the�headŠENDI–pointer. 8ŠENABLE_INTERRUPTS‰With�interrupts�enabled,�mark�the�BAB>ŠMOVE.L�BABPTR(A1),A2†available�and�call�the�routine�specifiedŠSF…BABUSE(A1)‰in�the�BAB. ŠJSR„(A2)�*;ŠLEA„BKG_HEAD,A0ˆRestore�A0�as�the�addr�of�the�head�pointer1ŠDISABLE_INTERRUPTSˆand�disable�interrupts�again. 6ŠMOVE.L�(A0),D0ŒKeep�doing�this�until�the�forward�linkŠUNTIL‚�is�zero. ŠENDI  *I*‚All�background�work�has�been�dispatched,�so�get�out�of�background�mode.* 9ŠSF…BKG_ACTIVE‰Come�out�of�background�processing�by�first ŠSF…BKG_FLAG2ŠPOP„SR‘marking�that�the�background�is�not�active,?ŠRESTORE�D0-D7/A0-A6‡then�restoring�the�interrupt�level�to�what'*§it�was�on�entry,�then�restoring�regs. ŠENDI ŠRTS—Return�to�the�caller.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***C***…ROUTINE:‚CALL_GUARDED�--�CALL�A�SUBROUTINE�IN�GUARDED�MODE.ˆ******É***B***…FUNCTION:‚Calls�a�subroutine�in�such�a�way�that�background‰***C***‡routines�initiated�as�the�result�of�interrupt�activity�will‡***C***‡not�execute�until�the�guarded�subroutine�is�done�executing.‡******É******…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:ƒ?ƒ?ƒ?ƒ?ƒ?ƒ?ƒ?ƒ?‡PˆD�******‡A:ƒA?‚?ƒ?ƒ?ƒ?ƒ?ƒ?ƒP ******É******…ENTRY�CONDITIONS:³***<***‡A0ƒ=�Address�of�the�routine�to�call�in�guarded�mode.Œ***?***‡All�other�registers�except�SP�may�be�used�to�pass�info.‹******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ***A***‡On�return�from�the�call,�the�contents�of�all�registers�is‰***A***‡just�what�was�left�in�them�by�the�guarded�subroutine;�the‰***A***‡guarded�routine�may�not�wreck�the�stack�pointer,�however.‰******É***O*******************************************************************************O*^***************************************************************************** CALL_GUARDED: 6ŠST…BKG_ACTIVE‰Lock�out�the�background�from�execution.#ŠJSR„(A0)�Call�the�guarded�routine.7ŠSF…BKG_ACTIVE‰Unlock�the�background�so�it�can�execute. 5ŠTST.B‚BKG_FLAG‹If�we�caused�the�background�to�miss�a0ŠBNE„BKG_DISPATCH‡dispatch,�do�the�dispatch�now. ŠRTS—Return�to�the�caller.   ŠENDéé@ ééé'M68XXX CDIR AFqqCDIR SA  ˆqqCISR AF11qqCISR SA::çqqCKDELAY AFSSqqCKDELAY SA\\¢qqCKEXPAT AFuuqqCKEXPAT SA~~ VqqCMR AF��qqCMR SA˜˜ÇÒqqCOMINT SA a a,²qqDCLSHAR AF ’ ’qqDCLSHAR SA › ›ÑqqDELAY AF ´ ´qqDELAY SA ½ ½TqqDEMON AF Þ ÞqqDEMON SA ç ç cqqERQST AFÿÿÿÿÿÿÿÿqq=/*=/*†M68XXX.CDIR.AF=/*)=/* Chain file to assemble M68XXX.CDIR.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68XXX.CDIR.LS=/*=/IFC \1ƒ=ARG�M68XXX.CDIR.LS=/ENDIF=/*-=ASM M68XXX.CDIR.SA,M68XXX.CDIR.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UDR.EQ=/*}=/*=ENDééééééA ‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.UDR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.UDR.EQ‰LIST‰PAGE2CDIR…IDNT…5,1ˆ68xxx�DIRECTIVE--CONFIGURE�DIRECTIVE*$*ˆCOPYRIGHTED�1982�BY�MOTOROLA,�INC.**‡*************************&*‡*‚C�D�I�RŽ*ƒCONFIGURE�EXEC�DIRECTIVE*‡*—**‡*‚3.10�02/09/82‚HLD6‚**‡***************************†ENTRY:‚A6ƒREQUESTOR'S�TCB*ŽA4ƒPARAMETER�BLOCK�POINTER*�(A4)‚DIRECTIVE�NUMBER*Œ2(A4)‚OPTIONS'*Œ6(A4)‚DIRECTIVE�ROUTINE�ENTRY�ADDRESS*(*ŠOPTIONS:‚Bit‚5=0ƒEnable�this�directive*š=1ƒDisable�this�directive**™4=0ƒTo�be�recognized�only�within�session2*š=1ƒDirective�can�be�called�by�any�task�in�system5*’Bits�1-0=00‚When�directive�exits,�return�control�to*Ÿrequesting�task.4*š=01‚When�directive�exits,�go�to�dispatcher.�Do�not$*Ÿput�requesting�task�on�ready�list.2*š=10‚When�directive�exits,�put�requesting�task�on'*ŸREADY�list�and�then�go�to�dispatcher.**„EXIT‚D0�=�0‚SUCCESS*<*ˆTHE�FOLLOWING�RETURN�CODES�ARE�RETURNED�IN�LOWER�1/2�OF�D0*6*ŠRTCDPBLK�-�2ƒPARAM�BLK�ADDR�NOT�IN�USER'S�ADDR�SPACE#*ŠRTCDNTBL�-�4ƒTABLE�DOES�NOT�EXIST?*ŠRTCDTFUL�-�5ƒTABLE�NOT�LARGE�ENOUGH�FOR�THIS�DIRECTIVE�NUMBER/*ŠRTCDDPRQ�-�6ƒDIRECTIVE�NUMBER�ALREADY�DEFINED@*ŠRTCDALOW�-�9ƒNOT�ALLOWED�TO�DELETE�ANOTHER�SESSION'S�DIRECTIVE?*ŠRTCDADR1�-12ƒEXEC�ROUTINE�ADDRESS�NOT�IN�USER'S�ADDRESS�SPACE*‰SECTION�LEVEL03* ‰XDEF„CDIR ‰XREF.S‚UDRBEG*3CDIR…MOVE.L„UDRBEG,A2‹Start�of�User�Directive�Table‰MOVE.L„A2,D0�Does�table�exist?-‰BEQ.S…CDIRE4Žif�not,�then�return�(error_04); ‰CLR.L…D0’Clear�for�short�load#‰MOVE.W„(A4),D0�Get�Dirctive�number'‰BGE.S…CDIRE5ŽBranch�if�positive�number ‰NEG.W…D0’Change�neg�to�positive1‰CMP.W…UDRCNT(A2),D0‡Will�directive�fit�in�table?‰BGT.S…CDIRE5ŽBranch�if�no ‰SUB.L…#1,D0�Entry�offset%‰MULU†#UDRESIZ,D0‰=(NUM-1)*entry�sizeJ!?%‰LEA‡UDRENTRY(A2,D0),A2‚ENTRY�ADDRESS‰MOVE.W„2(A4),D2ŒOptions‰BTST†#5,D2�Enable�or�disable?‰BNE.S…CDIRD1ŽBranch�if�disable *‰TST.L…UDRADDR(A2)‰Has�entry�been�claimed?‰BNE.S…CDIRE6ŽBranch�if�yes %‰BTST†#4,D2�Is�this�a�global�request?‰BEQ.S…CDIR04ŽBranch�if�NO 4‰BTST†#TSKASYST,TCBATTR(A6)�Is�caller�a�system�task?‰BNE.S…CDIR04ŽBranch�if�yes #‰BCLR†#4,D2�Change�to�local�request)CDIR04ƒTR0.LOGPHY‚,4(A4),#2 ‰BRA.S…CDIR06 ‰NOP!‰EXIT†RTCDADR1ŒERROR-�BAD�ADDRESS  **ˆError�Returns* /CDIRE4ƒEXIT†RTCDNTBLŒError-�Table�doesn't�exist .CDIRE5ƒEXIT†RTCDTFULŒError-�Won't�fit�in�table /CDIRE6ƒEXIT†RTCDDPRQŒError-�Number�already�used 1CDIRE9ƒEXIT†RTCDALOWŒError-�Not�allowed�to�delete  **ˆBuild�New�Entry�in�UDR* ?CDIR06ƒMOVE.L„D6,UDRADDR(A2)†Entry�address�of�directive�routine#‰AND.W…#$13,D2�Mask�off�unused�bits2‰MOVE.W„D2,UDROPT(A2)‡Save�options�and�exit�number6‰MOVE.L„TCBSESSN(A6),UDRSESS(A2)„Save�caller's�session‰EXIT†SUB‘exit�(subroutine);  **ˆDisable�Entry* *CDIRD1ƒTST.L…UDRADDR(A2)‰Does�Entry�exist?,‰BEQ‡CDIRE6ŽBranch�if�no�-�return�error�code (‰MOVE.L„TCBSESSN(A6),D0…Caller's�session-‰CMP.L…UDRSESS(A2),D0†Is�caller�same�session?*‰BEQ.S…CDIRD2ŽBranch�if�yes�-�ok�to�delete 4‰BTST†#TSKASYST,TCBATTR(A6)�Is�caller�a�system�task?0‰BEQ‡CDIRE9ŽBranch�if�no�-�not�allowed�to�delete 5CDIRD2ƒCLR.L…UDRADDR(A2)‰Clear�entry�-�means�not�used‰EXIT†SUB‘exit�(subroutine);‰ENDéA é=/*=/*†M68XXX.CISR.AF=/*)=/* Chain file to assemble M68XXX.CISR.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68XXX.CISR.LS=/*=/IFC \1=ARG M68XXX.CISR.LS=/ENDIF=/*-=ASM M68XXX.CISR.SA,M68XXX.CISR.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.IOV.EQ=/*}=/*=ENDéééééé)‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.IOV.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.IOV.EQ‰LIST‰PAGEBCISR…IDNT…5,1‚68xxx�DIRECTIVE--CONFIGURE�INTERRUPT�SERVICE�ROUTINE*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**‡*******************1*‡*‚C�I�S�Rˆ*ƒCONFIGURE�INTERRUPT�SERVICE�ROUTINE*‡*‘**‡*‚3.10…HLD6‚**‡*…10/14/80„**‡*…03/30/81„**‡*…02/15/82„**‡*********************†ENTRY:‚A6ƒREQUESTOR'S�TCB*ŽA4ƒPARAMETER�TABLE�POINTER*�(A4)‚TASK‚0=USE�REQUESTOR'S*Œ4(A4)‚SESSN�#*Œ8(A4)‚OPTIONS*‹10(A4)‚VECTOR�NUMBER*‹12(A4)‚ISR�ADDRESS*‹16(A4)‚ARGUMENT**‹OPTION�BITS�15-13:*˜000…ALLOCATE�VECTOR*˜001…DEALLOCATE�VECTOR*˜010…SWITCH�TO�NEW�ISR**„EXIT‚D0�=�0‚SUCCESS*<*ˆTHE�FOLLOWING�RETURN�CODES�ARE�RETURNED�IN�LOWER�1/2�OF�D0*6*ŠRTCDPBLK�-�2ƒPARAM�BLK�ADDR�NOT�IN�USER'S�ADDR�SPACE)*ŠRTCDTASK�-�3ƒSOURCE�TASK�DOES�NOT�EXIST4*ŠRTCDTFUL�-�5ƒNO�ROOM�IN�IOVCT�TABLE�(MAX�#�CLAIMS)-*ŠRTCDDPRQ�-�6ƒREQUESTED�VECTOR�NOT�AVAILABLE/*ŠRTCDNFND�-�7ƒVECTOR�DOES�NOT�BELONG�TO�CALLER6*ŠRTCDADR1�-12ƒISR�ADDRESS�NOT�IN�USER'S�ADDRESS�SPACE*ŠRTCDOPT‚-15ƒINVALID�OPTIONS*‰SECTION�LEVEL03* ‰XDEF„CISR ‰XREF.S‚COMINT‰XREF.S‚COMNISR‰XREF.S‚IOVCTBGN‰XREF.S‚VCTUBGN‰PAGE*H*‚DOES�THIS�NEED�TO�BE�A�JSR?‚WE�END�UP�PUTTING�A�PC�AND�SR�ON�THE�STACKG*‚AND�JUST�ADDING�6�TO�THE�SP�IN�COMINB T--MAYBE�WE�DON'T�NEED�EITHER....* -JSRINST‚EQU…$4EB9‰OP�CODE�FOR�JSR�INSTRUCTION  CISR:#‰MOVE.L‚VCTUBGN,A1„VECTOR�USE�TABLE&‰MOVE.L‚IOVCTBGN,A2ƒVECTOR�CLAIM�TABLE ‰CLR.LƒD7 ‰CLR.LƒD2%‰MOVE.B‚CISVCT+1(A4),D2‚VECTOR�NUMBER‰TST.WƒCISOPT(A4)…CHECK�OPTIONS$‰BNE.SƒCISR12‰BRANCH�IF�NOT�ALLOCATE  **ˆAllocate�vector.* $‰TST.Bƒ0(A1,D2)†IS�VECTOR�AVAILABLE?.‰EXIT.NE�RTCDDPRQ†ERROR�-�VECTOR�NOT�AVAILABLE '‰MOVE.L‚#IOVENTR,D7ƒOFFSET�TO�1ST�ENTRY CISR04:2\;UC7‰LEA…0(A2,D7),A3ƒENTRY�ADDRESS*‰CMP.LƒIOVEND(A2),A3‚IS�THIS�END�OF�TABLE?*‰EXIT.GE�RTCDTFUL†ERROR�-�NO�ROOM�IN�TABLE '‰TST.LƒIOVTCB+6(A3)‚IS�ENTRY�AVAILABLE?‰BEQ.SƒCISR07ˆBRANCH�IF�YES ‰ADD.Lƒ#IOVESZ,D7„GET�NEXT�ENTRY ‰BRA…CISR04 CISR07:'‰MOVE.W‚#JSRINST,(A3)+ƒPUT�JSR�IN�TABLE6‰LEA…COMNISR(PC),A0ƒSTART�OF�INTERRUPT�SERVICE�ROUTINE‰MOVE.L‚A0,(A3)+‰SAVE�IN�TABLE  **ˆCheck�ISR�address.* CISR08:(‰TR0.LOGPHY‚,CISISR(A4),#4$‰BRA.SƒCISR10ˆBRANCH�IF�GOOD�ADDRESS‰NOP &‰EXIT„RTCDADR1‰ERROR�-�BAD�ISR�ADDRESS **ˆPut�entry�in�table.* CISR10:)‰MOVE.WƒD2,IOVVECT(A3)ˆSAVE�VECTOR�NUMBER&‰MOVE.LƒA5,IOVTCB(A3)‰SAVE�TCB�ADDRESS.‰MOVE.LƒCISISR(A4),IOVADR(A3)�SAVE�ISR�ADDRESS+‰MOVE.LƒCISARG(A4),IOVARG(A3)�SAVE�ARGUMENT3‰ADD.L„#IOVESZ-IOVENTR,D7„ADJUST�FOR�START�OF�TABLE/‰DIVU…#IOVESZ,D7ŒCONVERT�OFFSET�TO�ENTRY�NUMBER,‰MOVE.BƒD7,0(A1,D2)‹SAVE�IN�VECTOR�USE�TABLE,‰BSET…#TSKIUVCT,TCBATTI(A5)�SET�BIT�FOR�TERM‰LEA†-6(A3),A3�POINT�AT�JSR#‰LSL.L„#2,D2‘MULTIPLY�VECTOR�#�BY�4‰MOVE.LƒD2,A0‘VECTOR�ADDRESS‰MOVE.LƒA3,(A0)�CHANGE�VECTOR!‰EXIT…SUB“exit�(subroutine�exit);  *"*ˆSwitch�ISR�or�deallocate�vextor.* CISR12:/‰MOVE.Bƒ0(A1,D2),D7†GET�ENTRY�OFFSET�FOR�VECTOR"‰BEQ.S„CISR14‹ENTRY�DOES�NOT�EXIST !‰SUB.L„#1,D7ŒDECREMENT�FOR�OFFSET*‰MULU…#IOVESZ,D7‡CONVERT�ENTRY�#�TO�OFFSET"‰ADD.L„#IOVENTR,D7†ADD�HEADER�SIZE‰LEA†0(A2,D7),A3†ENTRY�ADDRESS#‰MOVE.LƒIOVTCB+6(A3),A0‚TCB�ADDRESS1‰MOVE.LƒTCBSESSN(A0),D0‚SESSION�TO�D0�FOR�COMPARE$‰CMP.L„TCBSESSN(A6),D0‚SAME�SESSION?‰BEQ.S„CISR16‹IF�YES�-�OK 4‰BTST…#TSKASYST,TCBATTR(A6)ƒIS�CALLER�A�SYSTEM�TASK?‰BNE.S„CISR16‹IF�YES�-�OK CISR14:1‰EXIT…RTCDNFND‰ERROR�-�VECTOR�NOT�OWNED�BY�TARGET  **ˆIs�this�switch�or�deallocate?* CISR16:ŠLEA…6(A3),A3ŠSKIP�JSR�ENTRY!ŠBTST„#6,CISOPT(A4)…IS�IT�SWITCH?ŠBNE…CISR08ŒBRANCH�IF�YES %ŠBTST„#5,CISOPT(A4)…IS�IT�DEALLOCATE?,ŠEXIT.EQ�RTCDOPT‹NO�-�ERROR�-�INVALID�OPTION  * *ˆDeallocate.* ŠBSR.SƒDIOV_SUBŠCLEAR�TABLES!ŠEXIT„SUB�exit�(subroutine�exit);ŠPAGE**ˆTrap�#0�routine�to3*ˆdisconnect�user�ISR�vectors�when�task�terminates.* ‰XDEF†SBDIOVX SBDIOVX:+ŠMOVE.L‚VCTUBGN,A1ˆADDR�OF�VECTOR�USE�TABLE.ŠMOVE.L‚IOVCTBGN,A2‡ADDR�OF�VECTOR�CLAIM�TABLE'ŠMOVE.L‚#IOVENTR,D7‡OFFSET�TO�1ST�ENTRY DIOVX2:ŠLEA…0(A2,D7),A3‡ENTRY�ADDRESS*ŠCMP.LƒIOVEND(A2),A3…IS�THIS�END�OF�TABLE?ŠBGE.SƒDIOVX12‹BRANCH�IF�YES +ŠCMP.LƒIOVTCB+6(A3),A4ƒENTRY�FOR�THIS�TASK?ŠBNE.SƒDIOVX10‹BRANCH�IF�NO ŠLEA…6(A3),A3ŠSKIP�JSR ŠCLR.LƒD2"ŠMOVE.W‚IOVVECT(A3),D2„D2=VECTOR�#ŠBSR.SƒDIOV_SUBŠCLEAR�TABLES DIOVX10:#ŠADD.Lƒ#IOVESZ,D7ˆNEXT�ENTRY�OFFSETŠBRA…DIOVX2ŒGO�BACK DIOVX12:ŠRTS    *&*ˆSubroutine�to�deallocate�ISR�vector.* DIOV_SUB:,ŠLEA…COMINT(PC),A0…POINTER�TO�COMINT�ROUTINEŠMOVE.L‚A0,D3�WANT�IT�IN�D3#ŠLSL.Lƒ#2,D2�MULTIPLY�VECTOR�#�BY�4ŠMOVE.L‚D2,A0�VECTOR�ADDRESS8ŠMOVE.L‚D3,(A0)‹RESTORE�COMINT�ROUTINE�ADDRESS�IN�VECTORŠLSR.Lƒ#2,D2�BACK�TO�VECTOR�#&ŠCLR.Bƒ0(A1,D2)ŠCLEAR�VECTOR�USE�TABLE*ŠCLR.LƒIOVTCB(A3)ˆCLEAR�VECTOR�CLAIM�TABLEŠRTSŠENDB ééé=/*=/*†M68XXX.CKDELAY.AF=/*,=/* Chain file to assemble M68XXX.CKDELAY.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.CKDELAY.LS=/*=/IFC \1ƒ=ARG�M68XXX.CKDELAY.LS=/ENDIF=/*3=ASM M68XXX.CKDELAY.SA,M68XXX.CKDELAY.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééééKŠPAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE'CKDELAYƒIDNTƒ5,1�68xxx�CHECK�DELAY�LIST*$*†COPYRIGHTED�1980�BY�MOTOROLA,�INC.*#* Fires task PAT node passed to it.*;* Modified 21 Aug 1984 to conform to redesigned PAT scheme.*A*†CKEXPA‚is�called�from�a�background�routine�scheduled�by�TIMEINT* *�Entry:‚A1…points�to�PAT�header?*‰A2…points�to�PAT�entry�to�fire.‚This�entry�has�all�ready�been*’removed�from�the�PAT�list.3*‰D2…TIME_LEFT�value�when�node�was�pulled�from�list9*‰A7…points�to�word�containing�interrupt�level�of�TIMEINT *�Entered�with�interrupts�masked@*‰PATDELTA(A2)�contains�NSE�when�node�was�pulled�from�list.‚This5*’is�actually�the�desired�absolute�firing�time�and�is)*’less�than�or�equal�to�the�cuC rrent�time.*ŠSECTION�LEVEL00* ŠXDEFƒCKDELAY ŠXREFƒPAT_RM_1ST_NODEŠXREFƒPAT_SCHED_NEW_NODE ŠXREFƒSBRDTIM ŠXREF.S�DATE ŠXREF.S�NSEŠXREF.S�PATBEG‰PAGECKDELAY:(ŠMOVE.W�SR,-(A7)‹Use�for�unmasking�later:ŠMOVE.L�PATTCB(A2),A5†TCB�address�associated�with�1st�node1ŠBTSTƒ#TSK2TRMP,TCBSTATE(A5)�Is�task�terminating? ŠIF��THEN.S3�DISABLE_INTERRUPTS…Yes�-�so�just�free�the�node�...�PAT_FREE_NODEŠ...�and�return �MOVE.W�(A7),SR‰Unmask�interrupt�BRA.S‚CKDELAYRŠENDI 6ŠBCLRƒ#PATO1STE,PATOPT+1(A2)�Clear�1st�activation�flag(ŠMOVE.W�PATOPT(A2),D7†activation�options ŠBEQ.S‚CKDELAY6‹BRANCH�IF�DELAY)ŠBTSTƒ#PATOINTV,D7‡Should�delay�be�reset?ŠIF��THEN.S2�ADD.W‚#1,PATCNT(A2)ƒYes,�increment�sequence�count*�BSETƒ#PATO1STE,D7„Flag�-�reactivate�entryŠENDI  "ŠBTSTƒ#PATOEVNT,D7‡Message�wanted?ŠBNE.S‚CKDELAY7‹BRANCH�IF�YES $ŠBTSTƒ#PATOWAKE,D7‡Wakeup�or�resume? ŠBEQ.S‚CKDELAY5‹BRANCH�IF�RESUME +ŠBCLRƒ#TSKSBLCK,TCBSTATE(A5)�TASK�WAITING�?TP]KeŠBNE.S‚CKDELY6A‹BRANCH�IF�YES /ŠBSETƒ#TSK2WKWT,TCBSTAT2(A5)�SET�PENDING�WAKEUPŠBRA.S‚CKDLYNX 8CKDELAY5‚BCLRƒ#TSKSSUSP,TCBSTATE(A5)�WAS�TASK�SUSPENDED?ŠBEQ.S‚CKDLYNXŒBRANCH�IF�NO ŠBRA.S‚CKDELY6A‹BRANCH�IF�YES 4CKDELAY6‚CLR.L‚TCBDLAY(A5)ˆDELAY�-�CLEAR�TCB�POINTER.ŠBCLRƒ#TSKSBLCK,TCBSTATE(A5)�CLEAR�'WAIT'�ALSO*CKDELY6A‚TR0.RYWAKE�(A5)‹PUT�ON�READY�LIST 5CKDLYNXƒBTSTƒ#PATO1STE,D7‡Was�node�to�be�reactivated?ŠIF��THEN.S/�DISABLE_INTERRUPTS…No�-�so�just�free�the�entry�PAT_FREE_NODE�MOVE.W�(A7),SR‰UnmaskŠELSE.S=�MOVE.L�PATINTV(A2),D2‚Interval�from�now�we�want�node�to�fire *H* D2 contains elapsed time from now that we want to fire this node again* �DISABLE_INTERRUPTS…Mask,�BSR„PAT_SCHED_NEW_NODE�Reschedule�this�node�MOVE.W�(A7),SRŒUnmaskŠENDI 6CKDELAYR‚MOVE.W�(A7)+,SR‹Unmask�and�lose�SR�from�stackŠRTS  **„SEND�MESSAGE�TO�ASR* 4CKDELAY7‚MOVEM.L�D1/D7/A1/A1-A3,-(A7)�Save�registers#ŠMOVE.W�SR,-(A7)‹Save�for�unmaskingŠDISABLE_INTERRUPTSˆMaskŠBSR„SBRDTIMŒGet�time�into�D1#ŠMOVE.L�DATE,D2ŒPUT�DATE�IN�MESSAGEŠMOVE.L�D1,D3ŽUPPER�1/2�OF�TIME#ŠMOVE.W�DATE+2,D3ŠLOWER�1/2�OF�DATEŠMOVE.W�(A7)+,SR‹UnmaskŠSWAPƒD3ŠMOVE.L�D1,D4ŽLOWER�1/2�OF�TIMEŠSWAPƒD4!ŠMOVE.W�#$0A04,D2ŠLENGTH�AND�TYPEŠBTSTƒ#PATOARID,D7‡ID�PROVIDED?ŠBEQ.S‚CKDELAY8‹BRANCH�IF�NO !ŠMOVE.W�#$1004,D2ŠLENGTH�AND�TYPE&ŠMOVE.W�PATARID(A2),D4…UPPER�1/2�OF�ID3ŠMOVE.L�PATARID+2(A2),D5ƒLOWER�1/2�OF�ID�PLUS�COUNT CKDELAY8‚SWAPƒD2(ŠBTSTƒ#PATOASRA,D7‡Special�ASR�proviced?ŠBEQ.S‚CKDELY11‹BRANCH�IF�NO !ŠMOVEM.L�D3-D5,-(A7)‡SAVE�MESSAGE(ŠTR0.LOGPHY�,PATASR(A2),#2&ŠBRA.S‚CKDELY10‹BRANCH�IF�GOOD�ADDRESS ŠNOP$ŠMOVEM.L�(A7)+,D3-D5‡RESTORE�MESSAGEŠBRA.S‚CKDELY11‹GO�SEND�IT ;CKDELY10‚MOVEM.L�(A7)+,D4-D6‡MOVE�MSG�TO�MAKE�ROOM�FOR�ADDR!ŠMOVE.L�PATASR(A2),D3†ASR�ADDRESS&ŠSWAPƒD3‘SAVE�LOWER�1/2�OF�ASR�ADDRESS#ŠMOVE.W�D2,D3ŽMOVE�START�OF�MESSAGE.ŠADD.L‚#$04800000,D2†INCREMENT�LENGTH�AND�TYPE&ŠMOVE.W�PATASR(A2),D2†UPPER�1/2�OF�ASR CKDELY11‚TR0.QEVNTT�(A5)ŠNOP—IGNORE�FAILSŠMOVEM.L�(A7)+,D1/D7/A1-A3 ŠADD.L‚#1,D1 ŠBRA„CKDLYNXŒGO�CHECK�NEXT�ENTRYŠENDééC ééééé=/*=/*†M68XXX.CKEXPAT.AF=/*,=/* Chain file to assemble M68XXX.CKEXPAT.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.CKEXPAT.LS=/*=/IFC \1ƒ=ARG�M68XXX.CKEXPAT.LS=/ENDIF=/*3=ASM M68XXX.CKEXPAT.SA,M68XXX.CKEXPAT.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDéééééémŠPAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE;CKEXPATƒIDNTƒ5,1�68xxx�CHECK�PAT�FOR�EXEC�ENTRY�TO�ACTIVATE*$*†COPYRIGHTED�1982�BY�MOTOROLA,�INC.*:*†Fire�Exec�node�(pulled�from�PAT�list�by�calling�routine)**;* ModifiedD  21 Aug 1984 to conform to redesigned PAT scheme.*A*†CKEXPA‚is�called�from�a�background�routine�scheduled�by�TIMEINT*4*†On�entry�the�stack�is�set�up�in�the�following�way:0*‰SP�-->�PC.L�PC�from�calling�background�routine!*�VOR.WŽVector�offset�(if�68010).*A*‰If�an�exec�procedure�is�dispatched,�when�it�returns�with�an�RTE?*‹it�will�return�immediately�following�the�background�routine's *‹BSR�CKEXPA*A*†Registers�on�entry:�D0�=�Status�Register�of�background�routine./*šD2�=�TIME_LEFT�when�node�was�pulled�from�list*šA1ƒPoints�to�PAT�header-*šA2ƒPoints�to�node�to�fire,�the�node�has�all#*¡ready�been�removed�from�PAT�list.1*šPATDELTA(A2)�contains�the�NSE�(Next�Significant'*¡Event)�value�when�the�node�was�pulled'*¡from�the�pat�list.‚This�is�in�reality)*¡the�desired�absolute�time�that�the�node*¡was�to�fire.**2*†Registers�on�exit�:�A2,A3,A4,D0,D1,D2�destroyed.*1*†Registers�on�entry�to�activated�Exec�Procedure:*šD0�=�1*šD1�=�Request�ID*ŠSECTION�LEVEL00* ŠXDEFƒCKEXPAŠXREFƒPAT_SCHED_NEW_NODECKEXPA:8ŠMOVE.W�D0,-(A7)‹Save�status�reg�so�RTE�(perfromed�by...%*£...scheduled�PAT�routine)�will�work,ŠMOVE.W�#1,PATCNT(A2)†Set�count�of�intervals>ŠMOVE.L�PATINTV(A2),D2…Desired�interval�until�node�fires�again 0ŠBTST�#PATOINTV,PATOPT(A2)�Should�we�reschedule?ŠIF��THEN.S�DISABLE_INTERRUPTS…Yes�-‚Mask)�BSR‚PAT_SCHED_NEW_NODE�Schedule�the�nodeŠELSE.S�DISABLE_INTERRUPTS…Mask�PAT_FREE_NODEŠENDI !ŠMOVE.L�PATARID(A2),D1…Request�IDvK ŠMOVE.W�#1,D0ŽInterval�count* ŠMOVE.W�SR,D2ŠAND.W‚PATILVL(A2),D23ŠMOVE.W�D2,SRŽSet�interrupt�level�of�Exec�procedureŠMOVE.L�PATASR(A2),A3,ŠJMP„(A3)�We�will�JMP�into�the�EXEC�periodic#*£activation�routine.‚When�the�Exec#*£periodic�activations�RTEs�it�will(*£take�us�back�to�the�background�routine*£that�called�us.ŠENDéééééé=/*=/*†M68XXX.CMR.AF=/*(=/* Chain file to assemble M68XXX.CMR.SA=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to M68XXX.CMR.LS=/*=/IFC \1ƒ=ARG�M68XXX.CMR.LS=/ENDIF=/**=ASM M68XXX.CMD R.SA,M68XXX.CMR.RO,\1;RZ=099=/*{ Included files are:=/*ƒ9995.&.TRACE.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.CCB.EQ=/*ƒ9995.&.LV5.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDéééééé‡5CMR‡IDNTƒ5,1ˆ68xxx�RMS68K�CHANNEL�MANAGEMENT�ROUTINES.ŠTTL„LEVEL�5�CHANNEL�MANAGEMENT�REQUEST�MODULE ŠLLENƒ120J****************************************************************************,* CMR -- REV. 1.00 XXYYYZZ (TB59) STEVE BALL*�4.00�02NOV81�(TL09)�JIM�SMITH*�4.01�01FEB82�(TL09)�JIM�SMITH*�4.02‚6/15/82‡SJF$*’Added�supervisor/subordinate�junk.*�4.03‚9/�1/82‡SJF.*’Added�code�to�support�variable-length�CCB's.*�4.04‚9/12/82‡SJF3*’Moved�the�polling�table�to�the�top�of�the�device-3*’dependent�portion�of�the�CCB.‚Also,�CMR�now�moves5*’in�only�the�#�of�polling�table�entries�defined�from*’the�allocate�parameter�block.*�4.30�10/�4/83‡SJF#*’Added�SYSFAIL�processing�routine.*�4.40�11/27/84‡SJF,*’Changes�to�make�code�position-independent.7*’Fix�to�DELETE�logic�that�sets�up�the�JSR�instruction.*-*ƒPURPOSE:‚PERFORM�CHANNEL�MANAGEMENT�REQUEST/*�ALLOCATE,�DELETE,�ATTACH,�DETACH,�PUT�ON-LINE'*�TAKE�OFF-LINE.‚ALSO�HANDLE�LINKAGE�TO.*�APPROPRIATE�HANDLER�TO�PERFORM�I/O�FUNCTION.*�VALIDATE�PARAMETER�BLOCK�FOR+*�ALL�I/O�REQUESTS�OTHER�THAN�INITIATE�I/O.***ƒENTRY:‚TRAP�1�ROUTINE*‹A0�POINTS�TO�PARAMETER�BLOCK*‹A6�POINTS�TO�CALLER'S�TCB***ƒEXIT:*ŠD0�CONTAINS�COMPLETION�CODE&*Œ0�-�SUCCESSFUL�COMPLETION�OF�REQUEST2*ŒNONZERO�-�ERROR�CONDITION,�REQUEST�NOT�COMPLETED**ƒREGISTERS�USED:ƒ01234567 *”D**ƒ*** *”A********ƒCODE�IS�RE-ENTRANT**ƒTRAP�0�ROUTINES�CALLED:*œP*œV*œLOGPHY *œPAGEALOC *œPAGEFREE*H*----------------------------------------------------------------------- )ŠXDEFƒCMR�TRAP�#1�processing�entry�point..ŠXDEFƒCMRSFAIL‹SYSFAIL�processing�entry�point.ŠPAGE**‚Included�equate�files: *‰TRACE.EQ*‰STR.EQ*‰TCB.EQ*‰CCB.EQ*‰LV5.EQ *‰TR1RTCD.EQ *‰UTILITY.MC*ŠNOLISTŠINCLUDE�9995.&.TRACE.EQŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.CCB.EQŠINCLUDE�9995.&.LV5.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.UTILITY.MCŠLIST *E �Q™/¡.©C±7¹PÁKÉLÑ6Ù9á<é:ñGùP B T Q _ !] )S 1S 9D AC I2 QF?*‚EXTERNAL�REFERENCES�TO�EXEC�ROUTINES,�SYSTEM�PARAMETERS,�ETC.*ŠSECTION�LEVEL05 ŠXREF.S�CCBHDŠXREF.S�COMINTŠXREF.S�KILLERŠXREF.S�SEMCCBŠXREF.S�TRACERŠXREF.S�TRACFLAGŠXREF.S�VCTUBGN  *$*…EQUATES�FOR�TESTING�VECTOR�NUMBERS*#AVECTLOƒEQU„25‘LOWEST�AUTO�VECTOR�#$AVECTHIƒEQU„31‘HIGHEST�AUTO�VECTOR�##UVECTLOƒEQU„64‘LOWEST�USER�VECTOR�#ŠPAGEO********************************************************************************6*‰NOTES�CONCERNING�SUPERVISOR�AND�SUBORDINATE�CHANNELS6*‰Description�of�changes�made�by�Steve�Franck�in�6/82.*O******************************************************************************* J*‚Some�devices�possess�more�than�one�channel�(e.g.,�some�serial�controllerI*‚chips).‚In�many�cases�such�a�device�gives�the�same�interrupt�regardlessK*‚of�the�channel�which�caused�it,�and�each�of�the�channels�must�inspect�theD*‚device�to�determine�whether�the�interrupt�belongs�to�that�channel.*I*‚This�can�create�a�problem�if�reading�the�device's�registers�in�some�wayJ*‚signals�the�device�(it�might�clear�the�interrupt,�for�example).‚In�order@*‚to�provide�for�this�situation�CMR�had�to�be�changed�to�either:2*‰pass�information�from�one�handler�to�another,�or@*‰provide�the�capacity�for�another,�separate�module�to�field�the@*Œinterrupts�from�the�7201�and�correctly�call�the�right�handler.J*‚The�second�approach�was�chosen�because�it�is�more�general�and�because�it=*‚still�allows�the�channels�to�be�independent�of�one�another.*M*‚So�it�is�possible�to�declare�channels�to�be�supervisors�or�subordinates�(orJ*‚neither).‚A�SUPERVISOR�CHANNEL�is�allocated�first�(option�bit�CMRFGSP�onH*‚the�allocate�command),�and�then�the�SUBORDINATE�CHANNELS�are�allocatedH*‚(option�bit�CMRFGSB)�with�the�supervisor's�channel�mnemonic�in�CMRSUP.J*‚The�way�things�operate�is�that�the�subordinate�channels�receive�requestsH*‚to�initiate�I/O�as�usual,�but�all�their�interrupts�are�directed�to�theI*‚supervisor.‚The�supervisor�(which�must�be�written�to�fit�the�device�andI*‚subordinate�channels)�then�fields�the�interrupt�and�farms�it�out�to�theH*‚appropriate�subordinate�in�whatever�manner�the�designer�desires.‚I.E.,H*‚the�details�of�entry�into�the�subordinate�channel�for�proper�interruptJ*‚handling�are�left�undefined--all�CMR�cares�about�is�giving�the�interrupt*‚to�the�supervisor.*I*‚The�supporting�data�structure�is�a�linked�list�starting�from�the�super-H*‚visor�channel�and�containing�all�(there�is�no�limit)�subordinates,�viaI*‚the�longword�CCBSUB�in�the�CCB.‚It�is�expected�that�the�supervisor�willJ*‚traverse�this�list�in�search�of�a�driver�corresponding�to�the�particular*‚interrupt�type.*H*‚The�supervisor�channel�is�(of�course)�linked�into�the�vector�chain�forG*‚the�specified�vector,�but�the�subordinate�channels�are�not.‚Hence�theD*‚only�way�they�will�ever�be�entered�for�interrupt�service�is�if�the%*‚supervisor�channel�jumps�into�them.*,*‚There�are�some�rules�associated�with�this:B*‰A�single�channel�may�not�be�both�a�supervisor�and�a�subordinate.D*‰A�channel�may�not�be�allocated�as�a�subordinate�to�a�channel�which*�is�not�a�supervisor.;*‰The�supervisor�must�be�allocated�before�its�subordinates.G*‰The�supervisor�and�all�its�subordinates�must�specify�the�same�vector.**‰It�is�illegal�to�ATTACH�to�a�supervisor.F*‚Violation�of�any�of�these�rules�results�in�exec�error�code�RTCDLGCF.*‰PAGE*** ALLOCATE CHANNEL PARAMETER BLOCK FORMAT:* ŠOFFSET�0$CMRCODEƒDS.Bƒ1’CMR�FUNCTION�CODE�=�1ŠDS.Bƒ1’SUBCODECMRFG…DS.Bƒ2’CMR�OPTIONS�WORDCMRMNEMƒDS.Bƒ4’CHANNEL�MNEMONICCMRTYPEƒDS.Bƒ1’TYPE&CMRCMCTƒDS.Bƒ1’RESERVED�(USED�BY�CHPI)1CMRCADDƒDS.Bƒ4’I/O�HANDLER�SERVICE�VECTOR�ADDRESS4CMRSUP„DS.Bƒ4’SUPERVISOR�CHANNEL�MNEMONIC�(used�only*§if�option�bit�CMRFGSB�is�set)-CMRCHB„DS.Bƒ4’BAE SE�OF�MEMORY�MAPPED�I/O�SPACE/CMRMME„DS.Bƒ2’EXTENT�OF�MEMORY�MAPPED�I/O�SPACECMRVECTƒDS.Bƒ1’VECTOR�NUMBER0CMRPPRIO‚DS.Bƒ1’POLLING(HARDWARE)�PRIORITY�(1-7))CMRSPRIO‚DS.Bƒ1’SOFTWARE�PRIORITY�(0-$FF).CMRPECTƒDS.Bƒ1’NUMBER�OF�POLLING�TABLE�ENTRIES,ALLOCLGH‚EQU„*’LENGTH�OF�FIXED�PART�OF�BLOCK)* POLLING TABLE ENTRIES FOLLOW THIS POINTCMRPBASE‚EQU„*)ŠOFFSET�0’POLLING�TABLE�(VARIABLE�LENGTH)"CMRPOFFƒDS.Bƒ2’POLLING�BYTE�OFFSETCMRMASKƒDS.Bƒ1’POLLING�MASK!CMRPTSTƒDS.Bƒ1’POLLING�TEST�VALUE CMRRESOƒDS.Bƒ2’RESET�BYTE�OFFSETCMRRESVƒDS.Bƒ1’RESET�VALUEŠDS.Bƒ1’RESERVED  ** CMRFG (OPTIONS) EQUATES*1CMRFGSYS‚EQU„0’SYSTEM�ATTACH�ONLY�FLAG�(ALLOCATE)/CMRFGAQƒEQU„0’OPTION�FOR�ASQ�SPCEIFIED�(ATTACH)0CMRFGB1ƒEQU„1’RESERVED�(USED�BY�CHPI)�(ALLOCATE)-CMRFGDIR‚EQU„2’EXCLUSIVE�VECTORING�(ALLOCATE)6CMRFGSBƒEQU„3’THIS�CHANNEL�IS�TO�BE�SUBORDINATE�TO�THE(*§SUPERVISOR�WHOSE�MNEMONIC�IS�IN�CCBSUP0CMRFGSPƒEQU„4’THIS�CHANNEL�IS�TO�BE�A�SUPERVISOR  *B*�DELETE�CHANNEL�PARAMETER�BLOCK�CODE�=�2.‚THE�REMAINING�PARAMETER>*ƒBLOCK�IS�THE�SAME�AS�ALLOCATE�BUT�CONTINUES�ONLY�THROUGH�THE*ƒCHANNEL�MNEMONIC�FIELD.*6CMRCD2LƒEQU„8’LENGTH�OF�DELETE�CHANNEL�PARAMETER�BLOCK*'* ATTACH CHANNEL PARAMETER BLOCK FORMAT* ŠOFFSET�0ŠDS.Bƒ1’CMR�FUNCTION�CODE�=�3ŠDS.Bƒ1’SUBCODE�(NONE)ŠDS.Bƒ2’OPTIONS�WORDŠDS.Bƒ4’CHANNEL�MNEMONIC$CMRKEY„DS.Bƒ1’USER�SUPPLIED�I.D.�KEY%CMRASQLƒDS.Bƒ1’ASQ�LENGTH�IF�REQUIRED,CMRSVVCƒDS.Lƒ1’ASQ�SERVICE�VECTOR�(0�=�NONE)&CMRTMOUT‚DS.Wƒ1’RESERVED�(USED�BY�IPC)%CMRRTRYƒDS.Wƒ1’RESERVED�(USED�BY�IPC)'CMRCD3LƒEQU„*’LENGTH�OF�PARAMETER�BLOCK*+* IOH PARAMETER BLOCK FORMAT (INITIATE I/O)* ŠOFFSET�0 ŠDS.Bƒ1’CODE(CMRSUBCD‚DS.Bƒ1’SUBCODE�(0-I/O,�1-RESET)ŠDS.Bƒ2’RESERVEDŠDS.Bƒ4’CHANNEL�MNEMONICCMRTASKƒDS.Bƒ4’TASK�NAMEŠDS.Bƒ4’SESSION�CODECMRBB…DS.Bƒ4’RESERVED.CMRCB…DS.Bƒ4’LOGICAL�ADDRESS�OF�COMMAND�PACKET ŠDS.Bƒ2’LENGTH�OF�COMMAND�PACKET'CMRPBLGƒEQU„*’LENGTH�OF�PARAMETER�BLOCK**D*�DETACH�CHANNEL�PARAMETER�BLOCK�CODE�=�4.‚THE�REMAININING�PARAMETER>*ƒBLOCK�IS�THE�SAME�AS�ALLOCATE�BUT�CONTINUES�ONLY�THROUGH�THE*ƒCHANNEL�MNEMONIC�FIELD.*'CMRCD4LƒEQU„8’LENGTH�OF�PARAMETER�BLOCK*E*�PUT�ON-LINE�PARAMETER�BLOCK�CODE�=�5.‚THE�REMAINING�PARAMETER�BLOCK@*ƒIS�THE�SAME�AS�ALLOCATE�BUT�CONTINUES�ONLY�THROUGH�THE�CHANNEL*ƒMNEMONIC�FIELD.*'CMRCD5LƒEQU„8’LENGTH�OF�PARAMETER�BLOCK*G*�TAKE�OFF-LINE�PARAMETER�BLOCK�CODE�=�6.‚THE�REMAINING�PARAMETER�BLOCK@*ƒIS�THE�SAME�AS�ALLOCATE�BUT�CONTINUES�ONLY�THROUGH�THE�CHANNEL*ƒMNEMONIC�FIELD.*'CMRCD6LƒEQU„8’LENGTH�OF�PARAMETER�BLOCK*C*�INITIATE�I/O�PARAMETER�BLOCK�CODE�=�7.‚REMAINING�FORMAT�IS�UNIQUE?*ƒTO�SPECIFIC�HANDLER�(EITHER�STANDARD�OR�NONSTANDARD�HANDLER).*-CMRCD7LƒEQU„CMRPBLGŒLENGTH�OF�PARAMETER�BLOCK*** ERROR CODE EQUATES*$* ERROR CODES COMMON TO REST OF EXEC*=CMRPBX„EQU„RTCDPBLK‹PARAMETER�BLOCK�NOT�WITHIN�CALLER'S�SPACE=CMRATHXƒEQU„RTCDDPRQ‹DUPLICATE�REQUEST�-�CAN'T�DO�TWICE�(ATCH'CMRONX„EQU„RTCDDPRQ‹DITTO�(PUT�ON�LINE)4CMRMEMXƒEQU„RTCDNMEM‹MEMORY�NOT�AVAILABLE�(ALLOCATE)6CMRSYSXƒEQU„RTCDALOW‹NO�PERMISSION�(NOT�A�SYSTEM�TASK):CMRMNEXƒEQU„RTCDLGCF‹CONFLICT�(DUPLICATE�CHANNEL�MNEMONIC)=CMRISUPX‚EQU„RTCDLGCF‹INVALID�USE/SPECIFICATION�OF�SUPERVISOR *§CHANNEL�(SEE�DISCUSSION�ABOVE)0IOHTASKX‚EQU„RTCDTASK‹TARGET�TASK�DOES�NOT�EXIST**@* ERROR CODES UNIQUE TO LEVEL 5 AND NOT DIRECTLY RELATING TO BAD*ƒPARAMETER�BLOCK.*4CMRASGXƒEQU„$FFFFFF81ŠCHANNEL�NOT�ATTACHED�TO�CALLER6CMRUSEXƒEQU„$FFFFFF82ŠCHANNEL�ATTACHED�TO�ANOTHER�TASK&CMROFFXƒEQU„$FFFFFF83ŠCHANNEL�OFF�LINE9CMRBADFƒEQU„$FFFFFF85ŠINVALID�FUNCTION�FOR�THIS�CHNL�TYPE** PARAMETER BLOCK ERROR CODES*&CMRCDX„EQU„$FFFFFFC1ŠBAD�FUNCTION�CODE$CMROPTXƒEQU„$FFFFFFC3ŠINVALID�OPTION.CMRASQLX‚EQU„$FFFFFFC6ŠBAD�ASQ�LENGTH�(ATTACH)4CMRSVVCX‚EQU„$FFFFFFC7ŠSERVICE�VECTOR�ERROR�(ATTACH)8CMRCHAXƒEQU„$FFFFFFC9ŠBAD�CHANNEL�BASE�ADDRESS(ALLOCATE)1CMRVECXƒEQU„$FFFFFFCBŠBAD�VECTOR�NUMBER(ALLOCATE);CMRPPRXƒEQU„$FFFFFFCCŠBAD�POLLING�(HARDWARE)�PRIORITY(F ALLO)3CMRPECTX‚EQU„$FFFFFFCEŠBAD�POLLING�TBL�COUNT�(ALLO)3CMRPOFXƒEQU„$FFFFFFCFŠBAD�POLLING�OFFSET�(ALLOCATE)7CMRRESOX‚EQU„$FFFFFFCFŠBAD�RESET�BYTE�OFFSET�(ALLOCATE)&IOHSESXƒEQU„$FFFFFFC6ŠBAD�SESSION�CODE*%CMRALLOC‚EQU„1’ALLOCATE�FUNCTION�CODE*#* MISC. EQUATES TO MAKE LIFE EASIER*,IPCL†EQU„$10�LOW�#�FOR�STANDARD�TYPE�CHANNEL-IPCH†EQU„$7F�HIGH�#�FOR�STANDARD�TYPE�CHANNEL5EXECASMƒEQU„0’CONDITIONAL�ASSEMBLY�FOR�EXEC�EXTERNALS.CMRASQML‚EQU„4’MIN.�LGH.�ALLOWED�FOR�ASQ�ENTRY+CMRONLYƒEQU„$FF�INTERRUPT�ONLY�CHANNEL�TYPE!IOEVCD„EQU„1’INTERRUPT�EVENT�CODE%CHPRTBLG‚EQU„6’INTERRUPT�EVENT�LENGTH+SHRL†EQU„$80�LOW�#�FOR�SHARED�TYPE�CHANNELS,SHRH†EQU„$8F�HIGH�#�FOR�SHARED�TYPE�CHANNELS** CCB EXTENSION EQUATES*‰OFFSET�CCBDDP#CCBSTAGE�DS.Bƒ32’EVENT�STAGING�AREA‰PAGEI***************************************************************************$* ENTRY POINT FOR TRAP 1 CMR SERVICE**#*ˆENTRY:‚A6�=�TCB�ADDRESS�OF�CALLER***K****************************************************************************ŠSECTION�LEVEL05 CMR‡EQU„* +‰MOVE.L„A0,D7™PRESERVE�LOGICAL�ADDR�OF�P.B.;‰BTSTW…#TSKARTIM,TCBATTR(A6)‰IF�CLIENT�IS�A�REAL-TIME�TASK,.‰BNE.S…CMR00003–THEN�SKIP�ADDRESS�TRANSLATION.  *-* SEE IF P.B. BEGINS IN CALLERS ADDRESS SPACE*%ŠMOVE.L�A0,D6ŽLOGICAL�ADDRESS�OF�P.B.$ŠBTSTW‚#0,D6ŽSEE�IF�ON�EVEN�BOUNDARY&ŠBNE.S‚CMR00001‹BRANCH�IF�BAD�BOUNDARY +ŠMOVE.L�#8,D5ŽMUST�BE�AT�LEAST�8�BYTES�LONGŠMOVE.L�TCBTST(A6),A0 ŠTR0.LOGPHY(ŠBRA.S‚CMR00002‹BRANCH�IF�P.B.�BEGINS�OK ŠNOP—BAD�P.B.�BEGINCMR00001‚EQU„* ŠEXITƒRTCDPBLK‹ERROR�RETURN�CODE *CMR00002‚EQU„*(ŠMOVE.L�D6,A0ŽSAVE�PHYSICAL�P.B.�ADDRESS CMR00003‚EQU„* ŠMOVE.L�A0,A2*1* ISSUE ERROR RETURN IF CHANNEL MNEMONIC IS ZERO.*'ŠMOVE.L�CMRMNEM(A2),D1…CHANNEL�MNEMONIC)ŠBNE.S‚CMR00010‹BRANCH�IF�MNEMONIC�PASSES /ŠEXITƒRTCDLGCF‹BAD�CHANNEL�MNEMONIC�RETURN�CODE *D* TRY TO FIND THE CCB WITH THE INDICATED MNEMONIC ON THE "ALL" CHAIN*CMR00010‚EQU„*ŠLEA„SEMCCB,A0 ŠTR0.P‚SEMCCB*ŠLEA„CCBHD,A3‹CCB�CHAIN�"ALL"�HEAD�ADDRESSCMR00015‚EQU„*'ŠMOVE.L�(A3),A1ŒCCB�CHAIN�"ALL"�POINTER ŠTST.L‚(A3)&ŠBEQ.S‚CMR00020‹BRANCH�IF�END�OF�CHAIN.ŠCMP.L‚CCBMNEM(A1),D1…IS�THIS�THE�DESIRED�CCB?ŠBEQ„CMR01000‹BRANCH�IF�YES2ŠLEA„CCBALL(A1),A3†LETS�LOOK�AT�NEXT�ITEM�ON�CHAIN ŠBRA„CMR00015*A*�CHANNEL�MNEMONIC�DOES�NOT�EXIST.‚IF�THIS�IS�AN�ALLOCATE�REQUEST*ƒWE'RE�OK�SO�FAR.*CMR00020‚EQU„*ŠCMP.B‚#CMRALLOC,(A2)/ŠBNE„CMRBADMN‹BRANCH�IF�NOT�AN�ALLOCATE�(ERROR)‰PAGEO*********************************************************************************ˆALLOCATE�COMMAND*O******************************************************************************* *!*ƒDETERMINE�IF�PARAMETER�BLOCK�IS'*ƒENTIRELY�WITHIN�USER'S�ADDRESS�SPACE.* ‰BTSTW…#TSKARTIM,TCBATTR(A6)‰BNE.S…CMR00040 *ŠMOVE.L�D7,D6ŽPARAMETER�BLOCK�LOG.�ADDRESS-ŠMOVE.L�TCBTST(A6),A0†REQUESTOR'S�TST�POINTER ŠCLR.L‚D56ŠMOVE.B�CMRPECT(A2),D5…NUMBER�OF�POLLING�TABLE�ENTRIES ŠLSL.L‚#3,D5ŽTIMES�8�BYTES/ENTRY.ŠADDI.W�#ALLOCLGH,D5‡PLUS�LENGTH�OF�FIXED�PART ŠTR0.LOGPHY"ŠBRA.S‚CMR00040‹PARAMETER�BLOCK�OK ŠNOP—BAD�PARAMETER�BLOCK,ŠBRA„CMRBADPB‹BRANCH�FOR�BAD�PARAMETER�BLOCK  *)* PERFORM INDIVIDUAL PARAMETER VALIDATION** VALIDATE VECTOR NUMBER CMR00040‚EQU„* ŠCLR.L‚D0)ŠMOVE.B�CMRVECT(A2),D0ˆPICK�UP�VECTOR�NO.ŠCMPI.B�#AVECTLO,D0ŠBCS.S‚CMRBADVC‹TOO�SMALLŠCMPI.B�#AVECTHI,D0ŠBLS.S‚CMR00042‹OKŠCMPI.B�#UVECTLO,D0ŠBCC.S‚CMR00042‹BRANCH�IF�OK'CMRBADVC‚EQU„*’HANDLE�BAD�VECTOR�NUMBER3ŠMOVEQ‚#CMRVECX,D0ˆERROR�CODE�FOR�BAD�VECTOR�NUMBER ŠBSR„CMRTNVE1‹GO�SIGNAL�AND�EXIT CMR00042‚EQU„**B*‚IF�THE�CHANNEL�IS�TO�BE�SUBORDINATE,�THE�EXCLUSIVE�VECTOR�OPTION*‚SHOULD�NOT�BE�SET.*<ŠMOVEQ�#XOPDIR+XOPSUB,D1ƒISOLATE�THE�EXCLUSIVE�VECTORING�AND;ŠAND.W‚CMRFG(A2),D1‡SUBORDINATE�CHANNEL�OPTIONS.‚IF�THEY'RE>ŠIF.W�D1��#XOPDIR+XOPSUB�THEN.S„BOTH�SET,�THAT'S�AN�ERROR.ŠMOVEQ‚#CMRISUPX,D0ŠBSR.S‚CMRTNVE1ŠENDI F /ŠMOVE.L�VCTUBGN,A1ŒGET�VECTOR�USE�TABLE�ADDRESS%ŠTST.B‚0(A1,D0)ŽIS�VECTOR�AVAILABLE�?ŠBEQ.S‚CMR00045ŽYESŠBPL„CMRALLALŽNO,�ISR�HAS�IT:ŠBTSTW‚#CMRFGDIR,CMRFG(A2)ƒEXCLUSIVE�VECTORING�SPECIFIED�?*ŠBNE„CMRALLALŽYES,�ERROR-ALREADY�ALLOCATED** VALIDATE SERVICE ADDRESS*CMR00045‚EQU„*4ŠCMP.B‚#CMRONLY,CMRTYPE(A2)�INTERRUPT�ONLY�CHANNEL�?$ŠBEQ.S‚CMR00060‹YES,�SKIP�VALIDATION/ŠTST.L‚CMRCADD(A2)ˆVALID�SERVICE�VECTOR�ADDRESSŠBNE.S‚CMR00060‹BRANCH�IF�YES5ŠMOVEQ‚#CMRSVVCX,D0‡ERROR�CODE�FOR�BAD�SERVICE�VECTOR"ŠBSR.S‚CMRTNVE1‹GO�SIGNAL�AND�EXIT*‰*7*‰*‡****************************************************‰*‡*±*4*‰*‡*ƒNEED�ROUTINE�TO�SEARCH�CCB�LIST�FOR�MATCH�ON‚*4*‰*‡*ƒCHANNEL�TYPE�CODE�AND�USE�ITS�SERVICE�VECTOR‚***‰*‡*ƒADDRESS�ELSE�IF�NOT�FOUND�-�ERROR.Œ**‰*‡*±*7*‰*‡****************************************************‰* ** VALIDATE POLLING PRIORITY*CMR00060‚EQU„*ŠCMPI.B�#7,CMRPPRIO(A2)*ŠBHI.S‚CMRBADPP‹POLLING�PRIORITY�TOO�LARGEŠCMPI.B�#1,CMRPPRIO(A2)ŠBCC.S‚CMR00070‹BRANCH�IF�OK4CMRBADPP‚EQU„*’HANDLE�BAD�POLLING(HARDWARE)�PRIORITYŠMOVEQ‚#CMRPPRX,D0ŠBSR.S‚CMRTNVE1*$* VALIDATE POLLING TABLE INFORMATION*CMR00070‚EQU„**ŠLEA„CMRPBASE(A2),A3„BASE�OF�POLLING�TABLE ŠCLR.L‚D56ŠMOVE.B�CMRPECT(A2),D5…NUMBER�OF�POLLING�TABLE�ENTRIES0ŠBEQ.S‚CMR00085‹ZERO�MEANS�OWN�INTERRUPT�HANDLER2ŠCMP.B‚#CCBMCNT,D5ˆTOO�MANY�POLLING�TABLE�ENTRIES?ŠBLE.S‚CMR00072‹BRANCH�IF�YES*CMR00071‚EQU„*&ŠMOVEQ‚#CMRPECTX,D0‡BAD�ICNT�PARAMETER"ŠBSR.S‚CMRTNVE1‹GO�GET�OUT�OF�HERECMR00072‚EQU„*ŠSUB.L‚#1,D5ŽMAKE�ZERO�RELATIVEŠLSL.L‚#3,D5Ž8-BYTE�INDEX** CHECK POLLING BYTE OFFSET**ŠMOVE.W�CMRMME(A2),D1†ZERO�RELATIVE�EXTENTCMR00075‚EQU„*ŠCMP.W‚CMRPOFF(A3,D5),D1ŠBCC.S‚CMR00078‹BRANCH�IF�OK*$ŠMOVEQ‚#CMRPOFX,D0ˆERROR�RETURN�CODEŠBSR.S‚CMRTNVE1*CMR00078‚EQU„*** VALIDATE RESET BYTE OFFSET*ŠCMP.W‚CMRRESO(A3,D5),D1#ŠBCC.S‚CMR00080‹BRANCH�IF�OFFSET�OK*,ŠMOVEQ‚#CMRRESOX,D0‡ERROR�CODE�FOR�BAD�RESETŠBSR„CMRRTNVE‹GO�ERROR�EXIT1CMRTNVE1‚BRA„CMRRTNVE‹COLLECT�SHORT�BRANCHES�HERECMR00080‚EQU„* ŠSUB.L‚#8,D5%ŠBGE„CMR00075‹BRANCH�IF�MORE�TO�CHECK*I* DETERMINE IF MEMORY MAPPED SPACE IS WITHIN ACCESSIBLE MEMORY BY TESTING*ƒFOR�BUS�ERROR.* @CMR00085‚MOVEQ‚#XOPINH,D0‰If�the�options�on�the�ALLOCATE�command7ŠAND„CMRFG(A2),D0‡do�not�inhibit�testing�for�the�device"ŠIF…�THEN.Sˆin�the�memory�map, *ŠMOVE.L�CMRCHB(A2),D0†CHANNEL�BASE�ADDRESS ŠMOVE.L�D0,A0ŠBTSTƒ#0,D0ŽIS�IT�EVEN�ADDRESS'ŠBNE.S‚CMR00093‹BRANCH�IF�NO�(WE'RE�OK) ŠADD.L‚#1,A03CMR00093‚PEA„CMR00094‹ADDRESS�TO�TAKE�FOR�BUS�ERROR8ŠMOVE.W�#'BE',-(A7)ˆCODE�TO�TELL�EXEC�WE'RE�JUST�TESTINGŠTST.B‚(A0)�TEST�FOR�BUS�ERROR/ŠADD.L‚#6,A7ŽNO�BUS�ERROR,�BYPASS�STACKED�STUFF'ŠBRA.S‚CMR00095‹BRANCH�FOR�NO�BUS�ERROR*4CMR00094‚MOVE.L�#CMRCHAX,D0ˆBAD�CHANNEL�BASE�ADDRESSŠBSR„CMRTNVE1‹TAKE�ERROR�EXIT ŠENDI–* :CMR00095‚LEA„CCBHD,A3‹A3�<--�ADDRESS�OF�CCB�LIST�HEAD�PTR. *E*‚IF�THIS�IS�TO�BE�A�SUBORDINATE,�SEARCH�FOR�THE�SPECIFIED�SUPERVISOR<*‚(HIS�MNEMONIC�IS�IN�CCBSUP)�AND�GET�HIS�CCB�ADDRESS�IN�A4.*>ŠMOVEQ‚#XOPSUP+XOPSUB,D0‚CHECK�TO�MAKE�SURE�HE�ISN'T�TRYING�TO;ŠAND.W‚CMRFG(A2),D0‡ALLOCATE�A�CHANNEL�AS�BOTH�A�SUPERVISOR@ŠIF.B�D0��#XOPSUP+XOPSUB�THEN.S„AND�A�SUBORDINATE.‚IF�HE�IS,%ŠMOVE.L�#CMRISUPX,D0‡SIGNAL�AN�ERROR. ŠBSR…CMRTNVE1ŠENDI =ŠIF.B�D0��#XOPSUB�THEN.SƒIF�HE�WANTS�TO�BE�A�SUBORDINATE, ;ŠMOVE.L�CMRSUP(A2),D0†D0�<--�SUPERVISOR�CHANNEL'S�MNEMONIC.ŠREPEAT”REPEAT�ALL�THIS....:ŠMOVE.L�(A3),A4Œ.�A4�<--�ADDRESS�OF�NEXT�CCB�IN�ALL�CHAIN..ŠTST.L‚(A3)�.�IF�THIS�IS�THE�END�OF�THE�CHAIN,2ŠIF…�THEN.Sˆ.ƒTHE�SPECIFIED�SUPERVISOR�HAS�NOT9ŠMOVE.L�#CMRISUPX,D0‡.ƒBEEN�ALLOCATED,�WHICH�IS�AN�ERROR.ŠBSR„CMRTNVE1‹.ŠENDI–.8ŠLEA„CCBALL(A4),A3†.�A3�<--�ADDRESS�OF�LINK�TO�NEXT�CCB.3ŠCMP.L‚CCBMNEM(A4),D0….�BUT�FIRST,�IS�THIS�THE�ONE?1ŠUNTIL‚�UNTIL�WE�FIND�THE�SUPERVISOR�CHANNEL. =ŠMOVE.B�CMRVECT(A2),D0…IF�THE�VECTOR�FOR�THE�SUBORDINATE�(D0)<ŠBTSTW‚#CCBFGSUP,CCBSTR(A4)ƒG DOESN'T�MATCH�THE�VECTOR�FOR�THEBŠIF��OR.B�CCBVECT(A4)��D0�THEN.SƒSUPERVISOR�(CCBVECT(A4)),?ŠMOVE.L�#CMRISUPX,D0‡OR�THE�TASK�THAT'S�SUPPOSED�TO�BE�A�SUPER-6ŠBSR„CMRTNVE1‹VISOR�WASN'T�ALLOCATED�AS�ONE,�THAT'S�AN ŠENDI–ERROR. @ŠWHILE.L�CCBSUB(A4)��#0�DO.SƒFIND�THE�END�OF�THE�SUBORDINATE4ŠMOVE.L�CCBSUB(A4),A4†CHAIN�(MARKED�BY�A�LINK�OF�0).ŠENDW ŠENDI ** FIND END OF CCB CHAIN IN A3*/CMR00096‚MOVE.L�(A3),A1ŒCCB�CHAIN�'ALL'�POINTER ŠTST.L‚(A3)2ŠBEQ.S‚CMR00098‹BRANCH�IF�A3�HAS�LAST�LINK�ADDRESS$ŠLEA„CCBALL(A1),A3†LOOK�AT�NEXT�LINK ŠBRA„CMR00096*F*‚We've�found�where�the�new�CCB�should�go.‚Now�allocate�memory�for�it.F*‚We�need�at�least�a�page,�but�a�byte�near�the�top�of�the�driver�tells *‚how�many�extra�pages�he�wants.*9CMR00098‚EQU„*’First�find�out�the�#�of�pages�to�allocate.0ŠMOVE.L�CMRCADD(A2),A0…A0�<--�address�of�driver.2ŠMOVEQ‚#0,D0ŽD0�<--�#�of�extra�pages�driver�wants.ŠMOVE.B�16(A0),D0Š*2ŠADDQ.W�#1,D0ŽD0�<--�#�of�total�pages�to�allocate..ŠMOVE.L�D0,A0ŽExec�wants�that�parameter�in�A0. 6ŠMOVEM.L�D0/A2-A4,-(A7)„Save�addresses�and�#�of�pages.)ŠTR0.PAGAL�,�Ask�exec�to�allocate�memory.5ŠBRA.S‚CMR00099‹Exec�allocated�the�memory,�so�branch.?ŠMOVEM.L�(A7)+,D0/A2-A4„Exec�returned�an�error;�restore�things,5ŠMOVE.L�#CMRMEMX,D0ˆset�error�condition�code�and�exit!ŠBSR„CMRTNVE1‹through�error�exit. ACMR00099‚MOVEM.L�(A7)+,D0/A2-A4„Restore�addresses�and�#�of�pages.*E*‚Initialize�the�memory�to�zeroes.‚D0�contains�the�number�of�pages�weK*‚got.‚We�are�initializing�a�longword�at�a�time,�and�there�are�64�longwordsF*‚in�a�page�(256�bytes).‚Hence�we�multiply�by�64�(left�shift�6)�to�get*‚the�number�of�iterations.*(ŠMOVE.L�A0,A1ŽSave�address�of�CCB�in�A1.,ŠLSL.L‚#6,D0ŽD0�<--�#�of�longwords�to�clear. CMRLOP1ƒEQU„*ŠCLR.L‚(A0)+ŽClear�a�longword.,ŠSUB.L‚#1,D0ŽKeep�going�until�we've�done�theŠBGT„CMRLOP1Œwhole�CCB. *H*‚IF�HE�IS�TO�BE�A�SUBORDINATE,�LINK�HIM�ONTO�THE�END�OF�THE�SUBORDINATE<*‚CHAIN�(THE�ADDRESS�OF�THE�LAST�CCB�IN�THE�CHAIN�IS�IN�A4).*CŠBTSTW‚#CMRFGSB,CMRFG(A2)ƒIF�THE�OPTION�IS�SET�TO�BE�A�SUBORDINATE,7ŠIF…�THEN.SˆMAKE�THE�LAST�CCB�IN�THE�CHAIN�POINT�TO"ŠMOVE.L�A1,CCBSUB(A4)†THE�NEW�GUY.ŠENDI *%* LINK THIS PAGE ONTO THE "ALL" CHAIN*ŠMOVE.L�A1,(A3)*E* NOW PLUG INTO THE CCB ALL OF THE RELAVENT INFORMATION PASSED BY THE*ƒUSER.*%ŠMOVE.L�#'!CCB',(A1)‡DUMP�EYE�CATCHER.ŠBTSTW‚#CMRFGSYS,CMRFG(A2)�SYS�ONLY�TO�ATTACH?ŠBEQ.S‚CMR00300‹BRANCH�IF�NO(ŠOR.Wƒ#(1<ŠLEA„CMRPBASE(A2),A3„A3�<--�addr�of�polling�table�in�alloc�pb.9ŠLEA„CCBPBASE(A1),A4„A4�<--�addr�of�polling�table�in�CCB.AŠMOVE.B�CCBPECT(A1),D0…D0�<--�#�of�polling�table�entries�defined. 5ŠWHILEƒ�DO.S‰Loop�to�move�each�8-byte�entry.‚Only:ŠMOVE.L�(A3)+,(A4)+ˆmove�as�many�as�there�are�defined�(the$ŠMOVE.L�(A3)+,(A4)+ˆcount�is�in�D0).ŠSUB.B‚#1,D0Ž*ŠENDW–* ** SET UP VECTOR ADDRESS* ‰CLR.L…D0,‰MOVE.B„CMRVECT(A2),D0†PICK�UP�VECTOR�NUMBER ‰LSL.L…#2,D0�TIMES�4�FOR�ADDRESS"‰MOVE.L„D0,CCBVADR(A1)†SAVE�IN�CCB*G*‚Compute�the�address�of�the�driver's�interrupt�service�routine�and�putH*‚it�in�the�CCB.‚The�address�is�the�sum�of�the�driver's�base�address�(inH*‚the�allocate�parameter�block)�and�the�offset�from�the�beginning�of�theI*‚driver�to�the�interrupt�service�routine�(in�the�vector�table�at�the�top*‚of�the�driver).*0‰MOVE.L„CMG RCADD(A2),A3ƒA3�<--�address�of�driver.9‰ADD.L…(A3),A3ŠA3�<--�addr�of�driver's�interrupt�routine.*‰MOVE.L„A3,CCBRTNI(A1)ƒSave�it�in�the�CCB. *E*‚If�this�is�an�interrupt-only�channel,�the�interrupt�handler�will�be *‚within�CMR.*9‰CMP.B…#CMRONLY,CCBTYPE(A1)�CHANNEL�TYPE�INTERRUPT�ONLY�?‰BNE.S…CMR00345ŒBRANCH�IF�NO4‰MOVE.L„#CMRJSR3,CCBRTNI(A1)�YES,�SET�UP�CMR�HANDLER CMR00345‚EQU„**:*‚IF�HE'S�SUPPOSED�TO�BE�A�SUPERVISOR,�MARK�IT�IN�HIS�CCB.*=ŠBTSTW‚#CMRFGSP,CMRFG(A2)ƒIF�THE�OPTION�BIT�IS�SET�INDICATING6ŠIF…�THEN.SˆTHIS�DRIVER�IS�TO�BE�A�SUPERVISOR,�SET4ŠBSETW‚#CCBFGSUP,CCBSTR(A1)�THE�FLAG�BIT�IN�HIS�CCB.ŠENDI *C*‚IF�EXCLUSIVE�VECTORING�WAS�REQUESTED,�MARK�IT�IN�HIS�CCB�AND�SKIP*‚SOFTWARE�PRIORITY�JUNK.*:ŠBTSTW‚#CMRFGDIR,CMRFG(A2)ƒIF�THE�OPTION�BIT�FOR�EXCLUSIVE!ŠIF…�THEN.SˆVECTORING�IS�SET,?ŠBSETW‚#CCBFGDIR,CCBSTR(A1)�SET�EXCLUSIVE�VECTORING�FLAG�IN�CCB5ŠBRA.S‚CMR00380‹AND�SKIP�TO�THE�PART�WHERE�WE�PUT�THEŠENDI–JSR�IN�THE�CCB.*1*‚IF�THIS�IS�NOT�A�SUBORDINATE�CHANNEL,�SET�UP�TO5*‚LINK�THIS�PAGE�ONTO�THE�PROPER�POLLING�CHAIN�AT�THE*‚APPROPRIATE�PRIORITY.*@ŠBTSTW‚#CMRFGSB,CMRFG(A2)�IF�THIS�IS�A�SUBORDINATE�CHANNEL,�JUST4ŠBNE.S‚CMRRTNV1‹SKIP�AHEAD�TO�DRIVER�INITIALIZATION. ŠCLR.L‚D0)ŠMOVE.B�CMRVECT(A2),D0ˆPICK�UP�VECTOR�NO.3ŠMOVE.L�VCTUBGN,A3ŒPICK�UP�VECTOR�USE�TABLE�ADDRESS-ŠTST.B‚0(A3,D0.L)ŒFIRST�CCB�FOR�THIS�VECTOR�?ŠBEQ.S‚CMR00380ŽYES-ŠMOVE.L�CCBVADR(A1),A4ˆPICK�UP�VECTOR�ADDRESSŠMOVE.L�A4,D0‘SAVE�FOR�COMPARE"ŠMOVE.L�(A4),A3�GET�VECTOR�POINTER(ŠLEA„-(CCBJSR)(A3),A3†GET�ADDRESS�OF�CCB*5* AT THIS STAGE OUR REGISTER CONTENTS ARE AS FOLLOWS:7*ƒA1�-�ADDRESS�OF�NEWLY�ALLOCATED�PAGE�FOR�THE�NEW�CCB.)*ƒA2�-�ADDRESS�OF�USER'S�PARAMETER�BLOCK.*ƒA3�-�ADDRESS�OF�FIRST�CCB.*ƒA4�-�ADDRESS�OF�VECTOR.*5* LINK THE NEW CCB PAGE INTO THE VECTOR CHAIN AT USER*ƒREQUESTED�SOFTWARE�PRIORITY.*4ŠMOVE.B�CMRSPRIO(A2),D1„USER�REQUESTED�SOFTWARE�PRIOŠBRA.S‚CMR00367CMR00365‚EQU„*-ŠMOVE.L�CCBPOLL(A4),A3…A3�CONTAINS�LINK�VALUE2ŠTST.L‚CCBPOLL(A4)ˆARE�WE�AT�THE�END�OF�THE�CHAIN?ŠBEQ.S‚CMR00370‹BRANCH�IF�YESCMR00367‚MOVE.B�CCBSPRIO(A3),D2)ŠCMP.B‚D2,D1ŽFIND�PROPER�PLACE�TO�LINK�IN*©FOR�USER�SOFTWARE�PRIORITY,ŠBGT.S‚CMR00370‹BRANCH�IF�TIME�TO�LINK�IT�IN.ŠMOVE.L�A3,A4ŽA4�CONTAINS�ADDRESS�OF�NEXT�LINK ŠBRA„CMR00365CMR00370‚EQU„*!ŠCMP.L‚D0,A4ŽFIRST�CCB�ON�CHAIN�?ŠBEQ.S‚CMR00375‹YES+ŠMOVE.L�A3,CCBPOLL(A1)…LINK�FROM�ME�TO�NEXT,ŠMOVE.L�A1,CCBPOLL(A4)…LINK�FROM�PRIOR�TO�MEŠBRA.S‚CMRRTNV1+CMR00375‚MOVE.L�A3,CCBPOLL(A1)…LINK�TO�NEXT*!* IF FIRST CCB FOR THIS VECTOR...#* 1. STUFF JSR INSTRUCTION INTO CCB8* 2. STUFF VECTOR WITH ADDRESS OF JSR INSTRUCTION IN CCB*CMR00380‚EQU„*-ŠMOVE.L�CCBVADR(A1),A3†PICK�UP�VECTOR�ADDRESS8ŠMOVE.W�#CMRJSR1,CCBJSR(A1)�SET�JSR�INSTRUCTION�INTO�CCB0ŠMOVE.L�#CMRJSR2,CCBJSR+2(A1)�ADDRESS�TO�JUMP�TOŠLEA„CCBJSR(A1),A43ŠMOVE.L�A4,(A3)�SET�ADDRESS�OF�JSR�INST�INTO�VECTOR*M*�NOW�CALL�I/O�HANDLER�FOR�INITIALIZATION.‚Address�of�driver's�initializationJ* routine is the sum of the driver's base address (taken from the CCB) andM* the offset from the driver's base to its initialization routine (taken from-* the vector table at the top of the driver).*CMRRTNV1‚EQU„* ŠCLR.L‚D0%ŠMOVE.B�CMRVECT(A2),D0…GET�VECTOR�NO.3ŠMOVE.L�VCTUBGN,A0‰PICK�UP�VECTOR�USE�TABLE�ADDRESS(ŠMOVE.B�#$FF,0(A0,D0)†MARK�VECTOR�IN�USE0ŠMOVE.L�CCBUSER(A1),A0…A0�<--�address�of�driver.;ŠADD.L‚8(A0),A0‹A0�<--�addr�of�driver's�initialize�routine.)ŠMOVE.L�A1,A5ŽMAKE�CCB�POINTER�CONSISTANT!ŠMOVE.L�A6,-(A7)‹SAVE�TCB�POINTERŠJSR„(A0)�CALL�INITIALIZATION$ŠMOVE.L�(A7)+,A6‹RESTORE�TCB�POINTER ŠBRA„CMRRTNV1CMRTNVE3‚BRA„CMRRTNVE‹COLLECT�SHORT�BRANCHES�HERE** BAD CHANNEL MNEMONIC*CMRBADMN‚EQU„*ŠMOVE.L�#CMRMNEX,D0ŠBSR.S‚CMRTNVE3** NOT A SYSTEM TASK*CMRNOTSY‚EQU„*ŠMOVE.L�#CMRSYSX,D0ŠBSR.S‚CMRTNVE3** BAD PARAMETER BLOCK*CMRBADPB‚EQU„*ŠMOVE.L�#CMRPBX,D0ŠBSR.S‚CMRTNVE3‰PAGE***%H * WE DO NOT HAVE AN ALLOCATE FUNCTION*4* VALIDATE FUNCTION CODE AND PARAMETER BLOCK LENGTH.***/CMR01000‚EQU„*’CHECK�FOR�FUNCTION�CODE�IN�RANGEŠCMP.B‚#1,(A2)0ŠBEQ„CMRALLAL‹GO�GRIPE�SINCE�ALL�READY�ALLOCATED+ŠBLE.S‚CMRBADCD‹BRANCH�IF�BAD�FUNCTION�CODEŠCMP.B‚#CMRLTABL,(A2)ŠBLE.S‚CMR01020 -CMRBADCD‚EQU„*’HANDLE�BAD�FUNCTION�CODE�ERRORŠMOVEQ‚#CMRCDX,D0ŠBSR.S‚CMRTNVE3 8CMR01020‚EQU„*’SEE�IF�PARAMETER�BLOCK�WITHIN�USER'S�SPAC,ŠMOVE.L�TCBTST(A6),A0†TASK�SEG�TABLE�ADDRESSŠCLR.L‚D0‘FOR�BYTE�LOAD%ŠMOVE.B�(A2),D0ŒCALLERS�FUNCTION�CODE"ŠSUB.B‚#1,D0ŽMAKE�IT�ZERO�RELATIVE ŠMOVE.L�D0,A3 ŠCLR.L‚D5ŠCMP.B‚#7,(A2)ŒINITIATE�I/O�?ŠBNE.S‚CMR01030‹BRANCH�IF�NO0ŠCMP.B‚#IPCL,CCBTYPE(A1)‚STANDARD�CHANNEL�TYPE�?ŠBLO.S‚CMR01040‹BRANCH�IF�NOŠCMP.B‚#IPCH,CCBTYPE(A1)ŠBLS.S‚CMR01030‹BRANCH�IF�YES.ŠCMP.B‚#SHRL,CCBTYPE(A1)‚SHARED�CHANNEL�TYPE�?ŠBLO.S‚CMR01040‹BRANCH�IF�NOŠCMP.B‚#SHRH,CCBTYPE(A1)ŠBHI.S‚CMR01040‹BRANCH�IF�NO CMR01030‚EQU„* 9ŠBTSTW‚#TSKARTIM,TCBATTR(A6)�IF�TASK�IS�A�REAL-TIME�TASK,.ŠBNE.S‚CMR01040ŽTHEN�SKIP�ADDRESS�TRANSLATION. 0ŠMOVE.B�CMRLTAB(PC,A3),D5‚PARAMETER�BLOCK�LENGTH/ŠBEQ.S‚CMR01040‹BRANCH�IF�NOT�TO�COMPUTE�BOUNDS "ŠMOVE.L�D7,D6ŽLOGICAL�P.B.�ADDRESS ŠTR0.LOGPHY!ŠBRA.S‚CMR01040‹BRANCH�IF�PB�GOOD ŠNOP,ŠBRA„CMRBADPB‹BRANCH�FOR�BAD�PARAMETER�BLOCK *CMRLTABƒEQU„*’PARAMETER�BLOCK�LENGTH�TABLE ŠDC.Bƒ0’DUMMY ŠDC.BƒCMRCD2L ŠDC.BƒCMRCD3L ŠDC.BƒCMRCD4L ŠDC.BƒCMRCD5L ŠDC.BƒCMRCD6L ŠDC.BƒCMRCD7LCMRLTABL‚EQU„*-CMRLTABŠDS…0’MAKE�WORD�BOUNDARY*2* BRANCH TO APPROPRIATE ROUTINE TO HANDLE REQUEST.* CMR01040‚EQU„*ŠADD.L‚A3,A3ŽMULT�BY�2,ŠLEA„CMRJTB(PC,A3),A3ƒADDRESS�OF�TABLE�ENTRYŠADD.W‚(A3),A3ŒJUMP�VECTORCMR01050‚EQU„*'ŠJMP„(A3)�GO�HANDLE�INDIVIDUAL�FUNCTION!CMRJTB„EQU„*’ADDRESS�VECTOR�TABLE'ŠDC.WƒCMR01050-*‰BAD�ADDRESS�(ALLOCATE)ŠDC.WƒCMR02000-*‰DELETEŠDC.WƒCMR03000-*‰ATTACHŠDC.WƒCMR04000-*‰DETACHŠDC.WƒCMR05000-*‰ON-LINEŠDC.WƒCMR06000-*‰OFF-LINEŠDC.WƒCMR07000-*‰INITIATE�I/O‰PAGEH*************************************************************************** DELETE A CHANNEL FUNCTION**ˆENTRY:‚A1�=�CCB�POINTER*�A2�=�CMR�PB�POINTER*�A6�=�TCB�POINTER**J**************************************************************************CMR02000‚EQU„**0* SEE IF CHANNEL CURRENTLY ATTACHED TO THIS TASK*-ŠMOVE.L�CMRMNEM(A2),D0…USER�SUPPLIED�MNEMONIC ŠBSR„CMRCCBAM$ŠBNE„CMRNOTAT‹BRANCH�IF�NOT�ATTACHED*0* CHANNEL ATTACHED - REMOVE IT FROM USER'S CHAIN*ŠMOVE.L�CCBTLNK(A1),(A0)CŠBCLRW‚#CCBFGDIR,CCBSTR(A1)�WAS�THIS�AN�EXCLUSIVE�VECTORED�CHANNEL?ŠBNE.S‚CMR02100‹BRANCH�IF�YES** UNLINK CCB FROM POLLING CHAIN*-ŠMOVE.L�CCBVADR(A1),D1…PICK�UP�VECTOR�ADDRESS ŠMOVE.L�D1,A4"ŠMOVE.L�(A4),A3ŒGET�VECTOR�POINTER+ŠLEA„-(CCBJSR)(A3),A3ƒESTABLISH�CCB�ADDRESS&ŠMOVE.L�A1,D0ŽADDRESS�OF�CCB�TO�UNLINKŠBRA.S‚CMR02080CMR02070‚EQU„*;ŠMOVE.L�CCBPOLL(A4),A3…A3�CONTAINS�ADDRESS�OF�CCB�TO�EXAMIN ŠTST.L‚CCBPOLL(A4)ˆEND�OF�CHAIN?ŠBNE.S‚CMR02080‹NO'ŠBSR„KILLER�CAN'T�FIND�ON�POLLING�CHAIN0CMR02080‚EQU„*’***�LOOP�TRAP�FOR�MISSING�CHANNEL%ŠCMP.L‚A3,D0ŽIS�THIS�THE�CCB�WE�WANT?ŠBEQ.S‚CMR02090‹BRANCH�IF�SO"ŠMOVE.L�A3,A4ŽADDRESS�OF�NEXT�LINKŠBRA„CMR02070‹GO�LOOK�AT�NEXTCMR02090‚EQU„*ŠCMP.L‚D1,A4‘FIRST�ON�CHAIN�?ŠBNE.S‚CMR02092ŽNO"ŠTST.L‚CCBPOLL(A3)‹YES,�ONLY�ONE�?ŠBEQ.S‚CMR02100ŽYES(ŠMOVE.L�CCBPOLL(A3),A4ˆMORE�THAN�ONE�CCB-ŠMOVE.W�#CMRJSR1,CCBJSR(A4)ƒSET�UP�JSR�IN�CCBŠMOVE.L�#CMRJSR2,CCBJSR+2(A4)(ŠLEA„CCBJSR(A4),A4‰SET�UP�VECTOR�POINTER-ŠMOVE.L�CCBVADR(A3),A3ˆPICK�UP�VECTOR�ADDRESSŠMOVE.L�A4,(A3)�INIT�VECTORŠBRA.S‚CMR02110CMR02092‚EQU„*3ŠMOVE.L�CCBPOLL(A3),CCBPOLL(A4)ƒFINALLY!�UNLINK�IT!ŠBRA.S‚CMR02110**CMR02100‚CLR.L‚D1$ŠMOVE.B�CCBVECT(A1),D1ˆVECTOR�NUMBER-ŠMOVE.L�CCBVADR(A1),A3ˆPICK�UP�VECTOR�ADDRESS6ŠPEA„COMINT(PC)‰Make�the�vector�point�to�COMINT�again.ŠMOVE.L�(SP)+,(A3)‰*/ŠMOVE.L�VCTUBGN,A3ŒGET�VECTOR�USE�TABLE�ADDRESS%ŠCLR.B‚0(A3,D1)ŽMARK�VECTOR�H AVAILABLE** REMOVE CHANNEL FROM ALL CHAIN*1CMR02110‚LEA„CCBHD,A4‹ADDRESS�OF�HEAD�OF�CCB�LIST ŠMOVE.L�A1,D0CMR02120‚EQU„*5ŠMOVE.L�(A4),A3ŒA3�CONTAINS�ADDRESS�OF�CCB�TO�EXAMINEŠTST.L‚(A4)�END�OF�CHAIN?ŠBNE.S‚CMR02140‹NO#ŠBSR„KILLER�CAN'T�FIND�ON�ALL�CHAIN0CMR02140‚EQU„*’***�LOOP�TRAP�FOR�MISSING�CHANNEL%ŠCMP.L‚A3,D0ŽIS�THIS�THE�CCB�WE�WANT?ŠBEQ.S‚CMR02160‹BRANCH�IF�SO'ŠLEA„CCBALL(A3),A4†ADDRESS�OF�NEXT�LINKŠBRA„CMR02120‹GO�LOOK�AT�NEXTCMR02160‚EQU„*!ŠMOVE.L�CCBALL(A3),(A4)„UNLINK�IT** SIGNAL THE CCB SEMAPHORE*ŠLEA„SEMCCB,A0ŠTR0.V*1* FREE THE PAGE OF MEMORY OCCUPIED BY THE OLD CCB*ŠMOVE.L�A1,A0ŽADDRESS�OF�MEMORYŠMOVE.L�#1,D1ŽNUMBER�OF�PAGES ŠTR0.PGFRŠBRA„CMRRTNOK‹GOOD�RETURNŠBSR„KILLER�CAN'T�FREE�PAGE**-CMRNOTAT‚EQU„*’ERROR�FOR�CHANNEL�NOT�ATTACHEDŠMOVEQ‚#CMRASGX,D0ŠBSR.S‚CMRTNVE2‰PAGE**** ATTACH CHANNEL FUNCTION***CMR03000‚EQU„**0* SEE IF CHANNEL ALL READY ATTACHED TO THIS TASK*"ŠMOVE.L�A1,A3ŽPRESERVE�CCB�ADDRESS ŠBSR„CMRCCBBA!ŠMOVE.L�A3,A1ŽRESTORE�CCB�ADDRESS&ŠBNE.S‚CMR03060‹BRANCH�IF�NOT�ATTACHED(CMRALLAL‚EQU„*’CHANNEL�ALREADY�ALLOCATED'CMRALLAT‚EQU„*’CHANNEL�ALREADY�ATTACHEDŠMOVE.L�#CMRATHX,D0ŠBSR.S‚CMRTNVE2CMR03060‚EQU„**2* SEE IF CHANNEL IN USE (ATTACHED TO ANOTHER TASK)*ŠBTSTW‚#CCBFGATH,CCBSTR(A1)ŠBEQ.S‚CMR03100‹BRANCH�IF�NOTCMRINUSE‚EQU„*2ŠMOVEQ‚#CMRUSEX,D0ˆHANDLE�CHANNEL�IN�USE�EXCEPTIONŠBSR.S‚CMRTNVE2** SEE IF CHANNEL OFF LINE*CMR03100‚EQU„*ŠBTSTW‚#CCBFGOFF,CCBSTR(A1)ŠBEQ.S‚CMR03120‹BRANCH�IF�NOT CMROFFLƒEQU„*ŠMOVEQ‚#CMROFFX,D0ŠBSR.S‚CMRTNVE2*B* SEE IF CHANNEL SET UP FOR SYSTEM REQUESTS ONLY AND IF SO WHETHER$*ƒOR�NOT�REQUESTOR�IS�A�SYSTEM�TASK.*CMR03120‚EQU„*ŠBTSTW‚#CCBFGSYS,CCBSTR(A1)4ŠBEQ.S‚CMR03130‹BRANCH�IF�NOT�FOR�SYSTEM�ONLY�ATTACHŠBTSTW‚#TSKASYST,TCBATTR(A6)%ŠBEQ„CMRNOTSY‹WE'RE�NOT�A�SYSTEM�TASK*I*‚SEE�IF�CHANNEL�IS�A�SUPERVISOR�(IN�WHICH�CASE�IT�IS�ILLEGAL�TO�ATTACH).*CMR03130‚EQU„*=ŠBTSTW‚#CCBFGSUP,CCBSTR(A1)‚IF�FLAG�IS�SET�IN�CCB�SAYING�THIS(ŠIF…�THEN.SˆCHANNEL�IS�A�SUPERVISOR,$ŠMOVEQ‚#CMRISUPX,D0‡SIGNAL�AN�ERROR.ŠBSR.S‚CMRTNVE2ŠENDI*?* IF ASQ TYPE RETURN SPECIFIED - SAVE SERVICE VECTOR AND LENGTH*ƒIPC�ALWAYS�USES�ASQ�OPTION*ŠCMP.B‚#IPCL-1,CCBTYPE(A1)+ŠBLS.S‚CMR03132‹BRANCH�IF�NOT�STANDARD�TYPEŠCMP.B‚#IPCH,CCBTYPE(A1)'ŠBLS.S‚CMR03133‹BRANCH�IF�STANDARD�TYPE.ŠCMP.B‚#SHRL,CCBTYPE(A1)‚SHARED�CHANNEL�TYPE�?ŠBLO.S‚CMR03132‹BRANCH�IF�NOŠCMP.B‚#SHRH,CCBTYPE(A1)ŠBLS.S‚CMR03133‹BRANCH�IF�YESCMR03132‚EQU„*+ŠBTSTW‚#CMRFGAQ,CMRFG(A2)�IS�ASQ�SPECIFIED?ŠBEQ.S‚CMR03140‹BRANCH�IF�NO*7* IF ASQ ENTRY LENGTH NOT TOO SHORT THEN SAVE IT IN CCB*CMR03133‚EQU„*.ŠCMP.B‚#CMRASQML,CMRASQL(A2)�IS�ASQ�TOO�SHORT?ŠBCC.S‚CMR03135‹BRANCH�IF�NOT** ASQ ENTRY LENGTH TOO SHORT*ŠMOVEQ‚#CMRASQLX,D0‡ERROR�CODEŠBSR„CMRRTNVE‹GET�OUT1CMRTNVE2‚BRA„CMRRTNVE‹COLLECT�SHORT�BRANCHES�HERE** ASQ ENTRY LENGTH OK*CMR03135‚EQU„*2ŠMOVE.B�CMRASQL(A2),CCBASQL(A1)�SAVE�IT�IN�THE�CCB3ŠMOVE.L�CMRSVVC(A2),CCBSVVC(A1)�SAVE�SERVICE�VECTOR+ŠBEQ.S‚CMR03140‹BRANCH�IF�NO�SERVICE�VECTOR*ŠMOVE.L�A0,-(A7)‹PRESERVE�CCB�LINK�ADDRESS.ŠMOVE.L�TCBTST(A6),A0†SEE�IF�SERVICE�VECTOR�IS5ŠMOVE.L�CCBSVVC(A1),D6…WITHIN�TASK�ADDRESS�BOUNDARIES ŠMOVE.L�#4,D5 ŠTR0.LOGPHY+ŠBRA.S‚CMR03139‹BRANCH�IF�SERVICE�VECTOR�OKŠNOP„0’BAD�SERVICE�VECTOR** BAD SERVICE VECTOR*2ŠMOVE.L�(A7)+,A0‹RESTORE�CCB�LINK�ADDR�&�FIX�STACK,*£ERROR�CODE�FOR�BAD�DRIVER�ID�DURING�ALLOC.ŠMOVEQ‚#CMRSVVCX,D0‡ERROR�CODEŠBSR.S‚CMRTNVE2*1CMR03139‚MOVE.L�(A7)+,A0‹RESTORE�CCB�LINK�ADDRESSCMR03140‚EQU„*** SAVE REQUESTOR'S TCB ADDRESS*ŠMOVE.L�A6,CCBRQSTA(A1)** SAVE I/O RETURN OPTIONS*ŠMOVE.B�CMRFG+1(A2),CCBRTN(A1)ŠAND.B‚#3,CCBRTN(A1)** * SAVE KEY*4ŠMOVE.B�CMRKEY(A2),CCBKEY(A1)�USER�SUPPLIED�I.D.�KEY*#* NOW ATTACH THE CHANNEL TO OURSELF*+ŠMOVE.L�A1,(A0)ŒLINK�UP�CCB�TO�END�OF�CHAIN'ŠMOVE.L�TCBNAME(A6),D0…CALLERS�TASK�AND$ŠMOVE.L�I TCBSESSN(A6),D1„SESSION�NAME,ŠMOVE.L�D0,CCBRQST(A1)…REQUESTOR'S�TASK�NAME1ŠMOVE.L�D1,CCBRQST+4(A1)ƒREQUESTOR'S�SESSION�NAME/ŠOR.Wƒ#(1<�system_task)�&'*—(session�<>�session�(client_tcb_ptr))*—then�go�to�error�(iohsesx);*’end;**’tcb_ptr�<==�get_tcb�(taskname,�session); *’if�(error)*’then�go�to�error�(iohtaskx);*�end;*ˆend;*ˆccbtaska�(A5)�<==�tcb_ptr;&*ˆccbtask�(A5)�<==�taskname�(tcb_ptr);)*ˆccbtask�+�4�(A5)�<==�session�(tcb_ptr);‰PAGE*ˆif�(cmrtask�(A2)�=�0�)"*ˆthen�tcb_ptr�<==�client_tcb_ptr; IOH01017:‰MOVE.L„CMRTASK(A2),D0‰BEQ.S…IOH01050  *ˆelse�do;*�if�(client�=�real-time�task) *�then�tcb_ptr�<==�cmrtask�(A2); ‰MOVE.L„D0,A0‰BTSTW…#TSKARTIM,TCBATTR(A6)‰BNE.S…IOH01060  *�else�do;*’taskname�<==�cmrtask�(A2);*’if�(cmrtask�+�4�(A2)�=�0),*’then�session�<==�session�(client_tcb_ptr); ‰MOVE.L„CMRTASK+4(A2),D1‰BEQ.S…IOH01020  *’else�do;*—session�<==�cmrtask�+�4�(A2);*—if*—(client�<>�sI ystem_task)�&'*—(session�<>�session�(client_tcb_ptr))*—then�go�to�error�(iohsesx);*’end; ‰BTSTW…#TSKASYST,TCBATTR(A6)‰BNE.S…IOH01030 ‰CMP.L…TCBSESSN(A6),D1‰BEQ.S…IOH01030 ‰MOVEQ.Lƒ#IOHSESX,D7‰BSR.S…CMRRTNVE  **’tcb_ptr�<==�get_tcb�(taskname,�session); *’if�(error)*’then�go�to�error�(iohtaskx);*�end;*ˆend; IOH01020:‰MOVE.L„TCBSESSN(A6),D1  IOH01030: ‰TR0.GTXTCB‰BRA.S…IOH01060 ‰MOVEQ.Lƒ#IOHTASKX,D7‰BSR.S…CMRRTNVE  *ˆccbtaska�(A5)�<==�tcb_ptr;&*ˆccbtask�(A5)�<==�taskname�(tcb_ptr);)*ˆccbtask�+�4�(A5)�<==�session�(tcb_ptr); IOH01050: ‰MOVE.L„A6,A0  IOH01060:‰MOVE.L„A0,CCBTASKA(A5)‰MOVE.L„TCBNAME(A0),CCBTASK(A5)"‰MOVE.L„TCBSESSN(A0),CCBTASK+4(A5)‰PAGE**-* WE CAN NOW SIGNAL SEMAPHORE FOR "ALL" CHAIN*CMR07040‚EQU„*ŠLEA„SEMCCB,A0ŠTR0.V**ƒA6�CONTAINS�TCB�ADDRESS*ƒA5�CONTAINS�CCB�ADDRESS*ƒA2�CONTAINS�P.B.�ADDRESS*H*‚Now�JSR�to�the�command�service�entry�point�of�the�driver.‚This�addressJ*‚is�computed�as�the�sum�of�the�driver's�base�address�(taken�from�the�CCB)J*‚and�the�offset�from�the�driver's�base�to�its�command�service�entry�point;*‚(taken�from�the�vector�table�near�the�top�of�the�driver).*0ŠMOVE.L�CCBUSER(A5),A0…A0�<--�address�of�driver.7ŠADD.L‚4(A0),A0‹A0�<--�addr�of�driver's�command�service *§routine."ŠMOVE.L�A6,-(A7)‹SAVE�TCB�REGISTERŠJSR„(A0)�CALL�I/O�HANDLER%ŠMOVE.L�(A7)+,A6‹RESTORE�TCB�REGISTERŠTST.W‚D0‘WAS�THERE�AN�ERROR?ŠBEQ.S‚CMRRTNOK‹BRANCH�IF�NO ŠEXITƒERRORŽBRANCH�TO�SUB�IF�YES‰PAGEI**************************************************************************2* SUBROUTINE TO SEE IF CHANNEL IS ATTACHED TO TASK**ƒENTRY:ƒCMRCCBAA*ŒA1�-�ADDRESS�OF�CCB*ŒA6�-�TCB�ADDRESS* *ŒCMRCCBAM*ŒD0�-�CHANNEL�MNEMONIC*ŒA6�-�ADDRESS�OF�TCB**ƒEXIT:„D0�-�DESTROYED0*ŒNONZERO�CONDITION�CODE�IF�CHANNEL�NOT�ATTACHED)*ŒZERO�CONDITION�CODE�IF�CHANNEL�ATTACHED0*�A0�-�ADDRESS�OF�CCBTLNK�POINTER�TO�DESIRED�CCB*�A1�-�ADDRESS�OF�DESIRED�CCB*M******************************************************************************'CMRCCBBA‚EQU„*’ENTRY�FOR�CCB�ADDR�IN�A13ŠMOVE.L�CCBMNEM(A1),D0…SEARCH�FOR�MATCH�ON�MNEMONIC*'CMRCCBAM‚EQU„*’ENTRY�FOR�MNEMONIC�IN�D03ŠLEA„TCBCHAN(A6),A0…BASE�OF�CHANNELS�LINKED�TO�TASK)CMRCCBAL‚TST.L‚(A0)�ARE�WE�THROUGH�CHAIN?ŠBEQ.S‚CMRCCBAY‹IF�SO,�BRANCH/ŠMOVE.L�(A0),A1ŒBASE�ADDRESS�TO�CCB�TO�CONSIDER.ŠCMP.L‚CCBMNEM(A1),D0…IS�THIS�THE�DESIRED�CCB?,ŠBEQ.S‚CMRCCBAZ‹BRANCH�IF�YES�-�ITS�ATTACHED5ŠLEA„CCBTLNK(A1),A0…NO�SO�TRY�LOOKING�AT�NEXT�CHANNEL ŠBRA„CMRCCBAL,CMRCCBAY‚NOT.L‚D0‘SET�COND�CODES�FOR�NO�FINDCMRCCBAZ‚RTS„0’BACK�TO�CALLERŠPAGE**** EXITS*G* ERROR RETURN CODE IN D0, SIGNAL "ALL" SEMAPHORE FOR CCB CHAIN AND RET* CMRRTNVE:.ŠADDQ.L�#4,A7ŽGET�RID�OF�PHONY�RETURN�ADDRESS.ŠCLR.L‚D1‘FOR�BYTE�MOVEŠMOVE.B�D0,D1ŽSAVE�RETURN�CODEŠLEA„SEMCCB,A0ŠTR0.V ŠMOVE.L�D1,D0 ŠEXITƒERROR  *5* NONERROR RETURN - SIGNAL "ALL" SEMAPHORE AND RETURN* CMRRTNV:ŠLEA„SEMCCB,A0ŠTR0.V  *=* NONERROR RETURN WITH NON SIGNAL TO "ALL" SEMAPHORE REQUIRED* CMRRTNOK:ŠEXITƒSUB�CMR�ALWAYS�EXITS�HEREŠPAGEG************************************************************************7* ROUTINE TO HANDLE NOTIFICATION TO CALLER OF INTERRUPT+*ƒNOTIFICATION�VIA�WAKEUP�OR�ASQ�INTERRUPT.**ˆENTRY:‚A5�=�CCB�ADDRESS***G************************************************************************CMRNOTFY‚EQU„**-* SEE WHETHER NOTIFICATION IS WAKEUP OR EVENT**ŠMOVE.L�CCBRQSTA(A5),A6„SET�UP�TCB�ADDRESS ŠCLR.L‚D0)ŠMOVE.B�CCBRTN(A5),D1†RETURN�OPTIONS�BYTE ŠBTSTW‚#0,D1$ŠBNE.S‚CMRN2100‹BRANCH�IF�ASQ�OPTION** WAKE UP THE CALLING TASK*ŠMOVE.L�A6,A0ŽTCB�ADDRESS ŠTR0$.WAKEUPŠBRA.S‚CMRNRTN1*/* ASQ OPTION - CONSTRUCT EVENT IN CCB WORK AREA*CMRN2100‚EQU„*-ŠMOVE.B�#IOEVCD,CCBSTAGE+1(A5)�I/O�EVENT�CODE7ŠMOVE.B�#CHPRTBLG,CCBSTAGE(A5)�LENGTH�NO�SERVICE�VECTOR!ŠMOVE.L�#2,D2ŽWHERE�NEXT�TJ O�STAGE$ŠLEA„CCBSTAGE(A5),A0„STAGING�ADDRESS3ŠMOVE.L�CCBSVVC(A5),0(A0,D2)�PLUG�IN�SERVICE�VECTOR+ŠBEQ.S‚CMRN2010‹BRANCH�IF�NO�SERVICE�VECTOR9ŠADD.L‚#$04800000,CCBSTAGE(A5)�CORRECT�FOR�SERVICE�VECTOR0ŠADD.L‚#4,D2ŽCORRECT�STAGING�POINTER�FOR�SVC�VCTCMRN2010‚EQU„*.ŠMOVE.B�D0,0(A0,D2)ˆPLUG�IN�INTERP�RETURN�CODE&ŠMOVE.B�CCBKEY(A5),1(A0,D2)�USER'S�KEYŠADD.L‚#2,D2ŽTOTAL�LENGTH.ŠCMP.B‚CCBASQL(A5),D2…CMP�TO�USER'S�MAX�LENGTH"ŠBLS.S‚CMRN2020‹BRANCH�IF�WE'RE�OK;ŠMOVE.B�CCBASQL(A5),CCBSTAGE(A5)�ADJUST�LENGTH�TO�SUIT�USERCMRN2020‚EQU„**:* PUT COMPLETION STATUS INTO REGESTERS AND SEND IT TO TASK*CMRN2060‚EQU„*ŠMOVEM.L�CCBSTAGE(A5),D2-D5ŠBSR„CMRQEVNT‹QUEUE�EVENT*'* CMRNOTFY ALWAYS EXITS THRU THIS POINT*CMRNRTN1ƒEQU„**ŠRTSŠPAGEG*************************************************************************'*‚INTERRUPT�ROUTINE�FOR�CHANNEL�TYPE�FF**ˆENTRY:‚A0�=�WORK�REGISTER *�A1�=�SELF*�A5�=�CCB�ADDRESS*�D0�=�WORK�REGISTER**H************************************************************************* CHNLFF„EQU„*CMRJSR3ƒEQU„CHNLFF*(ŠMOVEM.L�D1-D2,-(A7)ŠSAVE�SOME�REGISTERS+ŠLEA„CCBPBASE(A5),A1‡GET�POLL�TABLE�ADDRESS ŠCLR.L‚D0-ŠMOVE.L�CCBCHB(A5),A0‰GET�DEVICE�BASE�ADDRESS/ŠMOVE.B�CCBPECT(A5),D1ˆGET�NO.�OF�TABLE�ENTRIES CHNL010ƒBEQ.S‚CHNL120�FINISHED�!+ŠMOVE.W�CCBPOFF(A1),D0ˆGET�POLL�BYTE�OFFSET%ŠMOVE.B�0(A0,D0),D2‹PICK�UP�POLL�BYTE/ŠTST.B‚CCBPTST(A1)‹ZERO�OR�NONZERO�POLLING�TEST*ŠBNE.S‚CHNL020�BRANCH�FOR�<>0�POLLING�TEST$ŠNOT.B‚D2”PREPARE�FOR�CLEAR�BIT�TEST6CHNL020ƒAND.B‚CCBMASK(A1),D2ˆNONZERO�POLLING�TEST�TYPE ŠBNE.S‚CHNL030�INTERRUPT�FOUND�!&ŠLEA„8(A1),A1ŽBUMP�TO�NEXT�TABLE�ENTRY"ŠSUB.B‚#1,D1‘DECREMENT�TABLE�COUNTŠBRA.S‚CHNL010/CHNL030ƒMOVE.W�CCBRESO(A1),D0ˆRESET�BYTE�OFFSET4ŠBTSTƒ#CCBRSR,CCBRESP(A1)ƒIS�THIS�READ�ONLY�OPTION�?ŠBEQ.S‚CHNL040�BRANSCH�IF�NOŠTST.B‚0(A0,D0)ŽYESŠBRA.S‚CHNL100�GET�OUT CHNL040ƒEQU„*-ŠMOVE.B�CCBRESV(A1),0(A0,D0)�RESET�THE�DEVICE3ŠMOVE.W�CCBMME(A5),D0†EXTENT�OF�MEMORY�MAPPED�SPACE ŠADD.L‚A0,D0ŽFIRST�ADDR�TO�CLEARŠBTSTW‚#0,D0ŽIS�IT�ODD?ŠBNE.S‚CHNL060ŒYES�-�OKŠSUB.L‚#1,D0ŽNO�-�FORCE�ODDCHNL060ƒSUB.L‚A0,D0ŽREADJUST�D0ŠMOVE.L�D0,D2ŽDUPLICATE�COPY&CHNL070ƒTST.B‚0(A0,D0)‹READ�EVERY�BYTE(ŠSUB.W‚#2,D0ŽDON'T�USE�QUESTIONABLE�DCNT,ŠBGE.S‚CHNL070ŒLOOP�FOR�ALL�MEM�MAPPED�SPACE CHNL080ƒEQU„* ŠCLR.B‚0(A0,D2)‹CLEAR�EVERY�BYTE ŠSUB.W‚#2,D2 ŠBGE„CHNL080 CHNL100ƒEQU„*%ŠMOVE.W�SR,D0‘PICK�UP�STATUS�REGISTER$ŠSUB.W‚#$100,D0ŽDROP�PRIORITY�BY�ONEŠMOVE.W�D0,SR‘DROP�PRIORITY.ŠBTSTW‚#CCBFGATH,CCBSTR(A5)‚CHANNEL�ATTACHED�?ŠBEQ.S‚CHNL110�NO0ŠMOVEM.L�D3-D7/A2-A4/A6,-(A7)„SAVE�THE�REGISTERSŠBSR„CMRNOTFYŽNOTIFY�THE�TASK3ŠMOVEM.L�(A7)+,D3-D7/A2-A4/A6‚RESTORE�THE�REGISTERS1CHNL110ƒMOVEM.L�(A7)+,D1-D2ŠRESTORE�THE�REGISTERS$ŠOR.Wƒ#$0001,SR�SET�RETURN�CONDITIONŠRTS CHNL120ƒEQU„**ŠMOVEM.L�(A7)+,D1-D2ŠRESTORE�THE�REGISTERS%ŠAND.W‚#$FFFE,SR�SET�RETURN�CONDITIONŠRTSŠPAGEI***************************************************************************;* ROUTINE TO QUEUE EVENT (ALL READY STAGED IN REGISTERS) TO*ƒDRIVING�TASK.*ƒEVENT�BEGINS�IN�REGISTER�D2.**H*************************************************************************CMRQEVNT‚EQU„*#ŠMOVEM.L�A3-A6,-(A7)‡SAVE�REGISTERS)ŠMOVE.L�CCBRQSTA(A5),A0„CALLER'S�TCB�ADDR ŠTR0$.QEVNTI"ŠBRA.S‚CMRQ5ŽBRANCH�IF�QUEUEING�OK&ŠMOVEM.L�(A7)+,A3-A6‡RESTORE�REGISTERSŠBRA.S‚CMRQRTN CMRQ5…EQU„*&ŠMOVEM.L�(A7)+,A3-A6‡RESTORE�REGISTERS CMRQRTNƒEQU„*ŠRTS‰PAGEJ**************************************************************************** INTERRUPT HANDLER CMR*D*ƒPURPOSE:‚HANDLE�INTERFACE�BETWEEN�INTERRUPT�AND�SPECIFIC�INTERRUPT *�HANDLER.2*�IT�SAVES�THE�REGISTERS,�SETS�UP�CCB�ADDRESS�INTO(*�A0�FOR�SECOND�LEVEL�INTERRUPT�HANDLER,;*�AND�JSR'S�TO�THE�APPROPRIATE�SECONDARY�INTERRUPT�HANDLER. *�UPON�RETURN�FROM�THE�SECONDARY3*�INTERRUPT�HANDLER,�THE�REGISTERS�ARE�RESTORED�AND+*�WE�EXIT�THROUGH�THE�EXIT�INTERRUPT�MACRO.*K******************************J ********************************************* EXCINT„EQU„*/CMRJSR1ƒEQU„$4EB9ŽHEX�VALUE�FOR�JSR�INSTRUCTIONCMRJSR2ƒEQU„EXCINT**3ŠBTSTƒ#TRCFIO,TRACFLAGƒIf�we're�supposed�to‡16(4/0)-ŠIF…�THEN.Sˆtrace�I/O�interrupts,†10(2/0) 5ŠMOVE.W�SR,-(A7)‹Push�status�register�(as�argument�to3ŠBSR„TRACER�TRACER�routine)�and�call�TRACER�(within/ŠDC.Wƒ$EE14Žanother�RMS68K�module).‚Restore�SR.8ŠMOVE.W�(A7)+,SR‹($EE14�is�the�code�for�an�interrupt�notŠENDI–claimed�by�a�task.)* EXCINT1ƒEQU„*6ŠMOVEM.L�D0/A0-A1/A5,-(A7)„SAVE�WORK�REGISTERS…48(2/8),ŠMOVE.L�16(A7),A5�GET�CCB�PC�ADDRESS†16(4/0)3ŠLEA„-(CCBJSR+6)(A5),A5„GET�CCB�BASE�ADDRESS…8(2/0)=EXCINT2ƒMOVE.L�CCBRTNI(A5),A1ˆGET�I/O�HANDLER�ADDRESS�16(4/0))ŠMOVE.L�A5,-(A7)ŽSAVE�CCB�ADDRESSˆ12(3/0)"ŠJSR„(A1)’CALL�I/O�HANDLERˆ18(2/2),ŠMOVE.L�(A7)+,A5ŽRESTORE�CCB�ADDRESS…12(3/0),ŠBCS.S‚EXCINT3�INTERRUPT�WAS�CLAIMEDƒ10(2/0)4ŠMOVE.L�CCBPOLL(A5),D0ˆINTERRUPT�NOT�CLAIMEDƒ16(4/0)'ŠBEQ.S‚EXCINT3�END�OF�CCB�CHAINˆ10(2/0)%ŠMOVE.L�D0,A5‘SET�UP�NEXT�CCB�ADDRESSŠBRA.S‚EXCINT2*:* GIVE CONTROL TO LEVEL ZERO COMMON INTERRUPT HANDLER HERE* EXCINT3ƒEQU„*,ŠMOVEM.L�(A7)+,D0/A0-A1/A5„RESTORE�REGISTERSŠADD.L‚#4,A7‘BUMP�PAST�CCB�RTS7ŠEXITƒINTERRUPT�HANDLE�COMMON�INTERRUPT�POST�PROCESSINGŠPAGEO*v*****************************************************************************O**********************************************************************************É***7***…ROUTINE:‚CMRSFAIL�--�SYSFAIL�INTERRUPT�HANDLER.”******É***D***…FUNCTION:‚This�routine�gets�control�when�a�SYSFAIL�interrupt‡***F***‡occurs�on�the�system�bus,�probably�indicating�a�board�is�down.„***H***‡We�have�to�call�each�driver�which�has�a�SYSFAIL�handling�routine‚***G***‡so�it�can�look�at�its�board,�determine�whether�or�not�the�boardƒ***;***‡is�down,�and�take�appropriate�action�if�it�is�down.�******É******…NOTES:¾***G***‡Like�all�interrupt�handlers,�this�one�must�exit�through�COMINT.ƒ******É***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:ƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡PˆP�******‡A:ƒPƒPƒ.ƒ.ƒ.ƒPƒ.ƒP ******É******…ENTRY�CONDITIONS:³******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***8***…ENTRY�CONDITIONS�FOR�THE�CALLED�SYSFAIL�HANDLER:”***%***‡A5ƒ=�ptr�to�the�driver's�CCB.£******É***7***…EXIT�CONDITIONS�FOR�THE�CALLED�SYSFAIL�HANDLER:•***F***‡D0,A0,A1,A5�may�be�modified�by�the�driver�without�restoration.„***G***‡Interrupt�level�may�be�raised,�and�need�not�be�restored,�but�itƒ***D***‡MUST�NOT�BE�LOWERED!‚That�would�make�it�possible�to�take�the…*** ***‡SYSFAIL�interrupt�again.ª******É***O*******************************************************************************O*^***************************************************************************** ŠOPT„BRS CMRSFAIL: *3*‚Trace�the�SYSFAIL�interrupt�if�we're�supposed�to.*AŠBTSTW‚#TRCFSYSF,TRACFLAG�If�the�flag�telling�us�to�trace�SYSFAIL ŠIF…�THENŠinterrupts�is�set,3ŠBSR.L‚TRACER�call�the�tracer�routine�with�the�code,ŠDC.Wƒ$EE07Ždesignating�a�SYSFAIL�interrupt.ŠENDI–* *&*‚Loop�through�the�ALL�chain�of�CCB's.*8ŠSAVEƒD0/A0/A1/A5ˆSave�registers�we�and�the�drivers�will *§blow�away.6ŠMOVE.L�CCBHD,D0‹D0�<--�ptr�to�first�CCB�in�ALL�chain. 5ŠWHILE‚‚DO‹While�there�are�more�CCB's�to�process, $ŠMOVE.L�D0,A5ŽA5�<--�ptr�to�the�CCB. *$*„Call�the�driver's�SYSFAIL�handler.*0ŠMOVE.L�CCBUSER(A5),A0…A0�<--�address�of�driver.=ŠMOVE.L�3*4(A0),D0‰D0�<--�offset�from�the�start�of�the�driver&*§to�his�SYSFAIL�handler�routine;�this *§will�be�0�if�he�doesn't�have�a*§SYSFAIL�handler.*ŠIF…�THENŠIf�he�has�a�SYSFAIL�handler, 1ŠPUSH.L�A5‘Call�the�driver's�SYSFAIL�handler,�but,ŠPUSHƒSR‘preserve�the�CCB�pointer�and�the�SRŠJSR„(A0,D0.L)Šwhile�we�do�it. ŠPOP„SR‘* ŠPOP.L‚A5‘* ŠENDI **„Move�on�to�the�next�CCB.*:ŠMOVE.L�CCBALL(A5),D0†D0�<--�ptr�to�next�CCB�in�ALL�chain. ŠENDW **‚Exit.*?ŠRK ESTORE�D0/A0/A1/A5‡Restore�registers�and�exit�through�COMINT.ŠEXIT„INTERRUPT‰*   ŠENDŠIFEQƒCHIPTYPE-68000/COMINT„IDNTƒ5,1�68000�common�interrupt�handler.ŠENDCŠIFEQƒCHIPTYPE-68010/COMINT„IDNTƒ5,1�68010�common�interrupt�handler.ŠENDCO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***>***…ROUTINE:‚COMINT�--�COMMON�INTERRUPT�HANDLER�FOR�68XXX.�******É***J***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family.***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***B***…FUNCTION:‚Contains�various�entry�points�for�returning�from‰******‡interrupts.·******É******…NOTES:¾******É******…ENTRY�POINTS:·******‡Entry�point…Usage­***A***‡-----------…---------------------------------------------…***<***‡COMINTŠHandler�for�interrupts�not�claimed�by�anyone.…***;***‡COMINTZ‰Return�from�interrupts�which�do�not�use�the‡******—EXIT�INTERRUPT�macro.�***F***‡COMINT_PERTURB‚Return�from�CMR�and�timer�interrupts�which�haveƒ***7***—detected�a�perturbation,�via�the�EXIT�INTERRUPTƒ******—macro.¬***,***‡COMNISR‰Pathway�to‚task-level�ISR's.•***,***‡ISRRTEŠReturn�from�task-level�ISR's.•******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesI*…--------‚-------------‚------------------------------------------------;*†9/28/84‚MSLŒAdded�knowledge�of�the�perturbation�detectors *žto�COMINTZ.*7*†1/24/84‚MSLŒ1.)‚After�COMISRA,�we�push�the�VOR�on�the%*£stack,�if�the�processor�is�a�68010.**ž2.)‚After�ISRRTE,�we�adjust�the�stack�by(*£adding�#6+VORLNGTH�to�A7.‚(Thus�is�the,*£processor�is�a�68000,�we�add�#6,�but�if�it*£is�a�68010,�we�add�#8.)* Y2 bb j+ ru zT ‚+F*†8/16/83‚Steve�FranckƒGot�rid�of�block�transfer�stuff�for�VM02;�added2*žcode�to�call�background�dispatcher�if�necessary.*†2/12/82‚HLD6*†2/08/81‚HLD6*†6/25/79‚7616* * *‚XDEF's.*.ŠXDEFƒCOMINT�Entry�points�to�this�routine;�see*ŠXDEFƒCOMINTZŒdescriptions�in�file�header.ŠXDEFƒCOMINT_PERTURB ŠXDEFƒCOMNISR ŠXDEFƒISRRTE * *‚XREF's.**‡Routine�entry�points:?ŠXREFƒBKG_DISPATCH†Routine�to�dispatch�all�background�activity. ŠXREFƒKILLER ŠXREFƒLOADMMUŠXREFƒLOADMMUI ŠXREFƒMMULOAD ŠXREFƒTRACER *‡Data�structures:ŠXREF.S�BKG_FLAG7ŠXREF.S�BKG_HEAD‹Head�pointer�for�the�background�queue.ŠXREF.S�IOVCTBGNŠXREF.S�PERTURB_FLAGSŠXREF.S�PREEMPT_FLAGŠXREF.S�PTMADDRŠXREF.S�RUNNERŠXREF.S�TRACFLAGŠXREF.S�VCTUBGN  **‚Included�files:**‰ENV.EQ*‰STR.EQ*‰TCB.EQ*‰IOV.EQ *‰INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.ENV.EQŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.IOV.EQŠINCLUDE�9995.&.INTERRUP.MCŠINCLUDE�9995.&.TR1RTCD.EQŠLIST   ŠSECTION�LEVEL00 ŠOPT„MEX,BRSŠPAGE*=*‰COMINT�--�Entry�point�for�interrupts�not�claimed�by�anyone.* COMINT:?ŠBTSTƒ#TRCFIO,TRACFLAGƒIf�the�trace�flag�says�to�trace�non-user ŠIF…�THENŠinterrupts,!ŠBSR„TRACER�trace�this�interrupt. ŠDC.Wƒ$EE14Ž*ŠENDI–* /ŠBRA.S‚COMINTZŒGo�to�the�common�interrupt�exit.  **ˆFinal�return�from�ISR.* COMIRTN:.ˆMOVE.Lƒ(A7)+,A5ŒGET�PREVIOUS�MMU�LOAD�ADDRESSˆBSR†LOADMMU�RESTORE�MMU ˆMOVE.Lƒ(AK 7)+,A0ŒREMOVE�USP#ˆMOVE.LƒA0,USPŽGIVE�IT�BACK�TO�USER,ˆMOVEM.L‚(A7)+,D0-D7/A0-A6…RESTORE�REGISTERS ˆADD.L„#6,A7‘SKIP�PHANTOM�RETURN‰PAGE*D*‚Common�return�from�all�interrupts;�this�is�the�entry�point�for�CMR*‚to�exit�from�interrupts.*G*‚ALL�INTERRUPTS�MUST�EXIT�THROUGH�THIS�CODE!!!‚If�some�interrupts�just:*‚do�an�RTE,�then�we�could�run�into�a�situation�like�this:3*†an�interrupt�occurs�and�we�vector�to�the�handler;C*†a�higher�priority�interrupt�occurs�and�we�vector�to�that�handler;C*†the�higher�priority�handler�schedules�background�activity�&�exits'*‰through�COMINT,�who�just�does�an�RTE;0*†the�lower�priority�interrupt�just�does�an�RTE.I*‚The�result�would�be�that�the�background�routine�doesn't�get�dispatched.* D*‚Here�for�all�interrupts�which�do�not�use�the�EXIT�INTERRUPT�macro.@*‚(In�fact�this�is�merely�a�copy�of�that�macro.)‚Anyway,�we�mustE*‚freeze�the�perturbation�detectors�within�the�ready�and�bkg_scheduleE*‚modules�by�disabling�interrupts,�and�then�snapshot�the�state�of�theF*‚perturb_flags.‚If�neither�the�preempt_flag,�nor�the�bkg_flag�is�set,D*‚then�we�may�reliably�return�to�the�interrupted�code.‚Otherwise,�weB*‚fall�into�the�comint_perturb�routine�to�decode�the�perturbation,#*‚and�perform�the�necessary�action.* COMINTZ:4ŠDISABLE_INTERRUPTSˆfreeze�(perturbation�detectors);2ŠTST.W‚PERTURB_FLAGS†if�(no�perturbation�detected) ŠIF…�THEN%ŠRTE—then�return�to�interrupted�code;ŠENDIŠPAGE*J*‚Check�to�see�whether�what�we're�returning�to�is�another�(lower�priority)J*‚interrupt�service�routine.‚Actually,�there's�no�way�to�do�that�with�100%J*‚accuracy,�but�checking�the�interrupt�mask�of�the�pushed�SR�gets�it�right=*‚most�of�the�time.‚There�are�two�problems�with�this,�though:F*„(1)�we�could�have�interrupted�an�ISR�which�lowered�the�mask�to�zero.L*„(2)�we�could�have�interrupted�some�non-interrupt�code�which�had�interruptsD*ˆmasked�to�some�level�<�6�(which�means�we�could�take�an�interrupt).* @*ˆWe�are�here�because�an�interrupt�service�routine�tried�to�RTE,>*ˆbut�discovered�that�one�or�both�of�the�perturb�flags�was�set?*ˆ(bkg_flag,�preempt_flag),�and�so�we�must�take�the�appropriate>*ˆaction�to�service�the�perturbation�before�executing�the�RTE.*>*ˆSince�the�perturb�flags�are�arranged�as�two�consecutive�byte>*ˆflags,�with�the�bkg_flag�in�the�most�significant�byte�of�the<*ˆword,�and�since�we�did�a�TST.W�on�the�perturb�flags�to�get@*ˆhere,�we�also�know�if�the�bkg_flag�was�set�(n_bit�(cc)�=�set).:*ˆIf�the�bkg�flag�was�set,�then�we�must�try�to�service�theA*ˆbackground�request,�and�then�re-check�the�preempt_flag,�because>*ˆa�background�job�could�cause�a�prior�priority�task�to�become&*ˆready�and�thus�set�the�preempt_flag. A*ˆHere�is�the�algorithm�for�servicing�this�detected�perturbation:**�if�(bkg_flag�=�set)�then�do;'*’if�(interrupt_mask�(sr)�=�0)�then�do; *—call�dispatch_background_work;*—if*—(preempt_flag�=�set)�&*—(interrupt_mask�(sr)�=�0)�&*—(supervisor_bit�(sr)�=�reset)*—then�preempt�this�task; *—else�RTE;*’end; *’else�RTE;*�end; *�else�do;*’if*’(interrupt_mask�(sr)�=�0)�&*’(supervisor_bit�(sr)�=�reset)*’then�preempt�this�task; *’else�RTE;*�end;*‰PAGE*4*ˆhere�if�one�or�both�of�the�perturb�flags�were�set:**�if�(bkg_flag�=�reset)*�then�go�to�int_preempt;* COMINT_PERTURB:‰BPL.S…INT_PREEMPT  **ˆhere�if�(bkg_flag�=�set):**�if�(interrupt_mask�(sr)�<>�0) *�then�RTE;* ‰MOVE†(SP),-(SP)‰AND.W…#$0700,(SP)+‰BNE.S…INT_RTE  * *ˆhere�if*ˆ(bkg_flag�=�set)�&*ˆ(interrupt_mask�(sr)�=�0):* *�call�dispatch_background_work;* ‰BSR‡BKG_DISPATCH  *,*ˆhere�after�returning�from�background�work:**�if�(preempt_flag�=�set)*�then�go�to�int_preempt; *�else�RTE;* ‰TST.B…PREEMPT_FLAG‰BNE.S…INT_PREEMPT  INT_RTE:‰RTE‰PAGE* *ˆhere�if*ˆ(preempt_flag�=�set)�&*ˆ(bkg_flag�=�reset):**�if*�(interrupt_mask�(sr)�=�0)�&*�(supervisor_bit�L (sr)�=�reset)*�then�preempt�this�task; *�else�RTE;* INT_PREEMPT:‰TESTIM‰BNE.S…INT_RTE  **ˆhere�to�preempt�task:*7*�first�save�the�full�state�of�the�task�within�the�tcb;*�then�go�to�preempt;*’(preempt�will:*—ready�this�task;*—fall�into�the�dispatcher;*’)* ‰SAVE_STATE‚L1_PART ‰SAVE_STATE‚L1_FULL ‰EXITˆPREEMPT‰PAGE*>*ˆCommon�entry�for�all�interrupts�on�vectors�claimed�by�users.* COMNISR:%ˆMOVE.W‚SR,-(A7)„SAVE�STATUS�REGISTER-ˆBTST„#TRCFUIO,TRACFLAGƒTRACE�THIS�INTERRUPT?ˆBEQ.SƒCOMISRA…BRANCH�IF�NO ˆBSR…TRACER†TRACE�THIS�INTERRUPT ˆDC.W„$EE09 COMISRA:-ˆMOVEM.L�D0-D7/A0-A6,-(A7)…SAVE�CURRENT�STATEˆMOVE.L‚USP,A1�GET�USER'S�STACK!ˆMOVE.L‚A1,-(A7)ŽSAVE�IT�ON�STACK+ˆMOVE.L‚MMULOAD,-(A7)‰SAVE�MMU�LOAD�ADDRESS  *3*ˆInterrupt�user�task�at�special�interrupt�address.* 6ˆMOVE.L‚70(A7),A0�ADDRESS�OF�ENTRY�IN�VECT�CLAIM�TABLE!ˆMOVE.L‚IOVTCB(A0),A6‰TCB�ADDRESS$ˆPEA…(A6)’SAVE�TCB�ADDRESS�ON�STACK. ˆIFEQ„CHIPTYPE-680101ˆMOVE.W‚#$0084,-(A7)ŠIF�68010,�PUSH�VOR�ON�STACK.ˆENDC 7ˆMOVE.L‚IOVADR(A0),-(A7)†PUT�INTERRUPT�ADDRESS�ON�STACK#ˆMOVE.W‚SR,D0‘USE�SR�WITH�LEVEL�SET"ˆAND.Wƒ#$0FFF,D0�MASK�OFF�SUPR�BIT'ˆMOVE.W‚D0,-(A7)ŽSAVE�THE�STAT�REGISTER1ˆMOVE.L‚IOVARG(A0),A1‰GIVE�USER'S�ARGUMENT�TO�HIM+ˆMOVE.W‚IOVVECT(A0),A0ˆRETURN�VECTOR�NUMBER!ˆMOVE.L‚TCBTST(A6),A5‰TST�ADDRESS%ˆBRA…LOADMMUIŽLOAD�MMU�AND�GO�TO�USERˆPAGE*(*ˆReturn�from�interrupt�service�routine.* ISRRTE:,ˆBTSTƒ#SRMODE,(A7)‚WAS�TRAP�#1�IN�SUPR�MODE?ˆBNE„COMINTZ‡RETURN�IF�YES *ˆADD.L‚#6+VORLNGTH,A7�REMOVE�TRAP�1�RETURN+ˆMOVE.L�(A7)+,A6†GET�TCB�ADDRESS�FROM�STACK!ˆMOVE.L�(A6),D4‡FIRST�WORD�OF�TCB#ˆCMP.L‚#'!TCB',D4„BE�SURE�IT�IS�TCBˆBEQ.S‚ISRRTE2‡BRANCH�IF�YES ˆBSR„KILLERˆIF�NOT�-�WHY�NOT ISRRTE2:ˆTST.W‚D0ŒCHECK�RETURN�OPTION&ˆBEQ„COMIRTN‡BRANCH�IF�STANDARD�RETURN #ˆCMP.W‚#1,D0‰DOES�USER�WANT�WAKEUP?ˆBNE.S‚ISRRTE4‡BRANCH�IF�NO ˆTR0.WAKEUP‚(A6)…ISSUE�WAKEUP"ˆBRA„COMIRTN‡GO�TO�STANDARD�RETURN ISRRTE4:ˆCMP.W‚#2,D0‰SEND�MESSAGE?ˆBNE„COMIRTN‡BRANCH�IF�NO )ˆTST.L‚D1ŒIS�EVENT�SERVICE�ADDRESS�GIVEN?ˆBNE.S‚ISRRTE8‡BRANCH�IF�YES ˆMOVE.L�D2,D3‰MESSAGE�CONTENTˆSWAPƒD3ŒLAST�2�BYTES�IN�D3)ˆMOVE.W‚#$0602,D2„MESSAGE�LENGTH�AND�TYPEˆSWAPƒD2 ISRRTE6:ˆTR0.QEVNTIƒ(A6)…SEND�MESSAGEˆNOP’ALLOW�FOR�ERROR�RETURN ˆBRA„COMIRTN‰PAGE*+*ˆBuild�message�with�event�service�address.* ISRRTE8:ˆSWAPƒD2ŒMESSAGE�CONTENTˆSWAPƒD1ŒASR�ADDRESS3ˆMOVE.L�D2,D4‰LAST�2�BYTES�OF�MESSAGE�IN�D3�(UPPER)!ˆMOVE.L�D1,D3‰LAST�2�BYTES�OF�ASR&ˆMOVE.W�D2,D3‰FIRST�2�BYTES�OF�MESSAGE)ˆMOVE.W�#$0A82,D2…MESSAGE�LENGTH�AND�TYPEˆSWAPƒD2*ˆMOVE.W�D1,D2‰FIRST�2�BYTES�OF�ASR�ADDRESSˆBRA„ISRRTE6‡SEND�MESSAGEˆPAGE*D*ˆUser�interrupt�service�routine�executed�illegal�trap�or�exception.* ˆXDEF„ISRERR ISRERR:ˆLSR.Lƒ#1,D0ˆADJUST�ERROR�CODEˆMOVE.L‚D0,D3ˆSAVE�FOR�MESSAGE!ˆADD.Lƒ#2,A7ˆREMOVE�SR�FROM�STACK%ˆMOVE.L‚(A7)+,D4…ADDRESS�OF�EXCEPTION ˆIFEQ„CHIPTYPE-68010#ˆADD.Lƒ#2,A7ˆREMOVE�VOR�FROM�STACK.ˆENDC ˆMOVE.L‚(A7)+,A6…GET�TCB�ADDRESS ˆMOVE.L‚(A6),D1†CHECK�FIRST�WORD#ˆCMP.Lƒ#'!TCB',D1ƒBE�SURE�IT�IS�TCBˆBEQ.SƒISRERR2†BRANCH�IF�TCB ˆBSR…KILLER‡IF�NOT�-�WHY�NOT ISRERR2:&ˆOR.W„#$F000,D3„ADD�FLAG�TO�ERROR�CODE&ˆMOVE.W‚D3,TCBISRS(A6)ƒSAVE�FOR�WAKEUPˆTR0.WAKEUP‚(A6)†ISSUE�WAKE�UP!ˆTST.LƒTCBASQ(A6)„DOES�ASQ�EXIST?ˆBEQ…COMIRTN‡IF�NO�-�RETURN .ˆMOVE.L‚#$0A02FFFF,D2‚MSG�LENGTH-TYPE-ERR�FLAGˆSWAP„D3ŒERROR�CODEˆSWAP„D4ŒUPPER�1/2�OF�ADDRESS"ˆMOVE.W‚D4,D3‰LOWER�1/2�OF�ADDRESS$ˆBRA…ISRRTE6‡SEND�MESSAGE�AND�RETURN‰ENDéL éé=/*=/*†M68XXX.DCLSHAR.AF=/*,=/* Chain file to assemble M68XXX.DCLSHAR.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.DCLSHAR.LS=/*=/IFC \1ƒ=ARG�M68XXX.DCLSHAR.LS=/ENDIF=/*3=ASM M68XXX.DCLSHAR.SA,M68XXX.DCLSHAR.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.SEG.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.GST.EQ=/*}=/*=ENDéééééé Š‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.SEG.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.GST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.SEG.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.GST.EQ‰LIST‰PAGE:DCLSHAR‚IDNT�5,1�68xxx�DIRECTIVE--DECLARE�SEGMENT�SHARABLE*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.*%*„DCLSHAR�--�REV�2.00ƒ10/05/79‚(HLD6)*›2/26/81‚(HLD6)*Œ--�TRAP�1�ROUTINE*$*…PURPOSE:‚DECLARE�SEGMENT�SHAREABLE*'*‰ENTRY:‚A6�HAS�REQUESTOR'S�TCB�ADDRESS(*‘A4�HAS�SEGMENT�PARAMETER�BLOCK�ADDRESS* 0�-�TARGET�TASK�NAME* 4�-�SESSION�CODE * 8�-�OPTIONS%*¤BIT�15,�ALL�ATTR�GIVEN�IN�PARAM�BLK%*¤BIT�12,MAKE�SHAREABLE�SEG�PERMANENT*Ÿ10�-�SEGMENT�ATTRIBUTES*Ÿ12�-�SEGMENT�NAME*ŠEXIT:ƒD0�HAS�RETURN�CODE*’D0�=�0‚GOOD�RETURN*<*ˆTHE�FOLLOWING�RETURN�CODES�ARE�RETURNED�IN�LOWER�1/2�OF�D0*6*ŠRTCDPBLK�-�2ƒPARAM�BLK�ADDR�NOT�IN�USER'S�ADDR�SPACE2*ŠRTCDTFUL�-�5ƒGST�IS�FULL�-�NO�ROOM�FOR�NEW�ENTRY6*ŠRTCDDPRQ�-�6ƒDUPLICATE�REQUEST�-�NAME�ALREADY�IN�GST1*ŠRTCDNFND�-�7ƒSEG�NAME�NOT�FOUND�IN�CALLER'S�TST2*ŠRTCDALOW�-�9ƒUSER�TASK�CANNOT�DECLARE�SEG�GLOBAL:*ŠRTCDOPT‚-1M 5ƒATTRIB�SPECIFY�BOTH�GLOBAL�AND�LOCAL�OR�NONE*)*ŠTHIS�ROUTINE�HAS�HARD-CODED�BIT�NUMBERS*‰SECTION�LEVEL03*3‰XDEF‚DCLSHAR„ENTRY--DIR�--DECLARE�SEGMENT�SHARABLE‰PAGEDCLSHAR:%‰MOVE.L�TCBTST(A6),A5…A5=CALLER'S�TST ‰IFNEƒMULTPROC ‰TR0.P‚(A5)‰ENDC  **ˆFind�segment�in�caller's�tst.* ‰TR0.FNDSEG‚(A5),SGPBNAME(A4)‰BRA.S‚DCLSHR3ƒFOUND�IT�--�GOOD DCLSHRE2:(‰EXITƒRTCDNFND“SEG�NAME�NOT�FOUND�IN�TST  *%*†Check�for�global�or�shared�segment.* #SHARBITS�EQU…1<‰BTSTƒ#SGPBOATR,SGPBOPT(A4)�ARE�ALL�ATTRIBUTES�GIVEN�BY�CALLER‰BEQ.S‚DCLSHR5ŒBRANCH�IF�NO %‰BCLRƒ#SEGAROM,D6ˆCLEAR�READ�ONLY�BIT+‰BTSTƒ#SEGAROM,SGPBATTR(A4)‚CALLER�SAY�ROM?‰BEQ.S‚DCLSHR5ŒBRANCH�IF�NO ,‰BSETƒ#SEGAROM,D6ˆSET�ROM�BIT�FOR�SHARED�SEG DCLSHR5:‰MOVE.L�D6,D1ŽNEW�ATTRIBUTES!‰BCLRƒ#SEGAUSED,D1‡CLEAR�USED�BIT  **ˆGet�exclusive�access�to�gst.* ˆIFNE„MULTPROC ˆTR0.PƒSEMGSTˆENDC  **ˆFind�entry�in�gst.* $‰MOVE.L‚TCBSESSN(A6),D2‡SESSION�CODE‰TR0.FNDGSG‚‰BRA.SƒDCLSHR5E�FOUND�ENTRY  * *ˆNo�entry�in�gst�--�so�add�one.* "‰CMP.Lƒ#0,A0‹IS�THERE�ROOM�IN�GST?‰BNE.S„DCLSHR6‰BRANCH�IF�YES %‰EXIT„RTCDTFUL’ERROR�-�NO�ROOM�IN�GST DCLSHR5E:‰EXIT„RTCDDPRQ�ALREADY�IN�GST  **ˆBuild�gst�entry.* DCLSHR6:.‰OR.W„D6,TSTAATTR(A5,D5)†SET�G�OR�S�BIT�IN�TST0‰MOVE.LƒTSTANAME(A5,D5),GSTNAME(A0)‚SEGMENT�NAME(‰MOVE.LƒD2,GSTSESSN(A0)ˆCALLER'S�SESSION!‰MOVE.WƒD1,GSTATTR(A0)†ATTRIBUTES‰MOVE.Wƒ#1,GSTCNT(A0)ŽONE�USER ‰CLR.LƒD3*‰MOVE.WƒTSTLB(A5,D5),D3‰LOGICAL�BEG�OF�SEG'‰ADD.W„TSTPO(A5,D5),D3‹PLUS�PHYS�OFFSET ‰LSL.Lƒ#8,D3–*256�=�PHYS�ADDRESS*‰MOVE.LƒD3,GSTPA(A0)…SAVE�PHYSICAL�ADDRESS&‰MOVE.WƒTSTLE(A5,D5),D3‰LOG�END�OF�SEG$‰SUB.W„TSTLB(A5,D5),D3‰MINUS�LOG�BEG‰ADD.W„#1,D3“PLUS�1�=�#�PAGES‰MOVE.WƒD3,GSTNP(A0).‰MOVE.WƒD0,GSTLENT(A1)ŠUPDATE�COUNT�OF�ENTRIES!‰MOVE.Wƒ#1,GSTCNT(A0)‰SET�#�USERS4‰BTST„#SGPBOPRM,SGPBOPT(A4)„IS�PERMANENT�OPTION�SET?‰BEQ.SƒDCLSHRX1�BRANCH�IF�NO &‰BSET„#15,GSTCNT(A0)ˆSET�PERMANENT�BIT  *8*ˆGive�up�exclusive�access�to�gst�and�tst�-�then�return.* DCLSHRX1:ŠIFNE„MULTPROC ŠTR0.VƒSEMGSTŠENDC DCLSHRX:‰IFNE„MULTPROC ‰TR0.VƒTCBTSTSM(A6)‰ENDC !‰EXIT†SUB‘exit�(subroutine�exit);‰ENDééM éééé=/*=/*†M68XXX.DELAY.AF=/**=/* Chain file to assemble M68XXX.DELAY.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.DELAY.LS=/*=/IFC \1ƒ=ARG�M68XXX.DELAY.LS=/ENDIF=/*/=ASM M68XXX.DELAY.SA,M68XXX.DELAY.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDéééééé ¬ Š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.&.ASQ.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.ASQ.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE%DELAY…IDNTƒ5,1�68xxx�DIRECTIVE--DELAY*$*‡COPYRIGHTED�1980�BY�MOTOROLA,�INC.**‡****************************1*‡*‚D�E�L�A�Y�*ƒDELAY�SOME�NUMBER�OF�MILLISECONDS*‡*‚REV�2.00‚HLD6‚05/21/81**‡*‚REV�3.00‚HLD6‚11/06/81**‡*******************************‹ENTRY:�A6�HAS�ADDR�OF�TCB%*’A0�CONTAINS�#�MILLISECONDS�TN O�DELAY*‹EXIT�:�RETURNS�TO�DISPATCHER* *Ž01234567 *‡USES�D�*)*ŒA�*…*ƒ(TRAP�1�SAVES�ALL�USER�REGISTERS)**ŠSECTION�LEVEL04* ŠXDEFƒDELAY ŠXDEFƒDELAYWŠXDEFƒPAT_CAN_NODE ŠXREFƒPAT_DEL_NODEŠXREFƒPAT_SCHED_NEW_NODEŠXREFƒSETASQ_SUB * SYSPAR parametersŠXREF.S�PATBEGŠPAGE!*delay: proc (tcb_ptr, interval);  *„dcl‚tcb_ptr�longword�(A6);*„dcl‚interval�longword�(A0);  *ˆcall�delay_sub; *ˆreturn;  *end delay;‰PAGE!*delay: proc (tcb_ptr, interval);  *„dcl‚tcb_ptr�longword�(A6);*„dcl‚interval�longword�(A0);  *ˆcall�delay_sub;*ˆexit�(postempt); DELAY:‰BSR.S…DELAY_SUB‰EXIT†POSTEMPT *end delay;‰PAGE!*delay: proc (tcb_ptr, interval);  *„dcl‚tcb_ptr�longword�(A6);*„dcl‚interval�longword�(A0);  *ˆif�(interval�>�24�hours)*ˆthen�interval�<==�24�hours);0*ˆcancel�node�with�(pat_tcb�=�tcb_ptr�&�id�=�0);&*ˆif�(headed�for�asr�=�reset)�then�do;*�if�(free_list�=�empty))*�then�tcb_rtcd�(tcb_ptr)�<==�table_full; *�else�do;*’dequeue�(node,�free_list);*’init�(node);*’schedule�(node,�pat_list);*�end;*ˆend;  *end delay;‰PAGE**…if�(interval�>�24�hours)*…then�interval�<==�24�hours);* DELAY_SUB: µr ¾\ Æ` Î'#ŠMOVE.L�A0,D2ŽDelay�time�(interval)#ŠIF.L�D2��#24*60*60*1000�THEN.S?�MOVE.L�#24*60*60*1000,D2�Insure�that�24�hours�is�the�max�delayŠENDI  *0*ˆcancel�node�with�(pat_tcb�=�tcb_ptr�&�id�=�0);* <ŠMOVE.L�PATBEG,A1ŠA1�-->�to�periodic�activation�table�header*ŠLEA„PATHDR(A1),A2†A2�-->�head�of�PAT�list ŠMOVE.L�A2,A3;ŠMOVE.W�SR,-(A7)‹Save�old�status�for�unmask�operation�later#ŠDISABLE_INTERRUPTSˆMask�interrupts5ŠMOVE.L�PATNEXT(A3),D0…D0�-->�first�PAT�entry�on�list I* Walk thru PAT list keeping A2 pointing to entry under consideration andJ*ƒA3�pointing�to�previous�entry.‚Remove�any�entries�from�the�PAT�list�that+*ƒbelong�to�the�caller�and�have�an�ID�of�0. ŠWHILE��DO.S'�MOVE.L�D0,A2ŽA2�-->�next�entry�on�list9�IF.L�A6��PATTCB(A2)�AND.L�PATARID(A2)��#0�THEN.S(�BSR„PAT_DEL_NODE‚Go�delete�the�PAT�node�ELSE.S �MOVE.L�A2,A3�ENDI7�MOVE.L�PATNEXT(A3),D0‚Advance�to�next�node�on�the�listŠENDW  **ˆopen�(interrupt�window);* $ŠMOVE.W�(A7),SRŒenable�(interrupts);)ŠDISABLE_INTERRUPTSˆdisable�(interrupts);  *&*ˆif�(headed�for�asr�=�reset)�then�do;* -ŠBTSTW‚#TSK2EVWK,TCBSTATE(A6)‡HEADED�FOR�ASR?ŠBNE.S‚DELAY_01•BRANCH�IF�YES. **�if�(free_list�=�empty))*�then�tcb_rtcd�(tcb_ptr)�<==�table_full;* -ŠMOVE.L�PATFHDR(A1),D0…1ST�ENTRY�IN�FREE�LIST)ŠBEQ.S‚DLYER_05‹BRANCH�IF�NO�ENTRY�EXISTS * *�else�do;*’dequeue�(node,�free_list);*’init�(node);*’schedule�(node,�pat_list);*�end;* **†DEQUEUE�(NODE,�FREE_LIST);* $ŠMOVE.L�D0,A2˜ADDRESS�OF�EMPTY�ENTRY0ŠMOVE.L�PATNEXT(A2),PATFHDR(A1)†UPDATE�FREE�LIST ŠMOVE.W�(A7),SR–ALLOW�INTERRUPTS  **†INIT�(NODE);*!ŠMOVE.L�A6,PATTCB(A2)�TCB�ADDRESS*ŠCLR.W‚PATOPT(A2)“CLEAR�ACTIVATION�OPTIONS*ŠMOVE.L�#'!DLY',PATARID(A2)ŠSET�REQUEST�ID3ŠMOVE.L�A2,TCBDLAY(A6)�SAVE�ADDRESS�OF�ENTRY�IN�TCB **†SCHEDULE�(NODE);* ŠDISABLE_INTERRUPTS)ŠBSR„PAT_SCHED_NEW_NODE‹Schedule�new�node * *…RETURN;* DELAY_01:#ŠMOVE.W�(A7)+,SR•ENABLE�INTERRUPTS; ŠRTS¡RETURN;  DLYER_05:ŠMOVE.W�(A7)+,SR'ŠEXITƒRTCDTFUL•ERROR�-�NO�ROOM�IN�TABLEŠPAGE**delay_and_wait: proc (tcb_ptr, interval);  *„dcl‚tcb_ptr�longword�(A6);*„dcl‚interval�longword�(A0);  %*ˆcall�delay_sub�(tcb_ptr,�interval);*ˆif�(tcb_asq�(tcb_ptr)�<>�0)1*ˆthen�call�setasq_sub�(tcb_ptr,�en_asr,�en_asq);*ˆdisable�(interrupts);*ˆreset�(wakeup_pending);&*ˆif�(wakeup_pending�was�set)�then�do;*�if�(tcb_delay�(tcb_ptr)�<>�0N )8*�then�call�cancel_delay�(tcb_ptr,�tcb_delay�(tcb_ptr));*�exit�(subroutine);*ˆend; *ˆelse�do;*�set�(blocked�bit);*�exit�(postempt);*ˆend;  *end delay_and_wait;ŠPAGE**delay_and_wait: proc (tcb_ptr, interval);  *„dcl‚tcb_ptr�longword�(A6);*„dcl‚interval�longword�(A0);  %*ˆcall�delay_sub�(tcb_ptr,�interval); DELAYW:‰BSR‡DELAY_SUB  *ˆif�(tcb_asq�(tcb_ptr)�<>�0)1*ˆthen�call�setasq_sub�(tcb_ptr,�en_asr,�en_asq); ‰MOVE.L„TCBASQ(A6),D0‰BEQ.S…DLAYW_02 ,‰MOVE.L„D0,A4”asq_ptr�<==�tcb_asq�(tcb_ptr);;‰BTST†#ASQS_RNV,ASQSTMD2(A4)ƒif�(asr_nval�(asq_ptr)�=�reset‰BNE.S…DLAYW_02 -‰MOVE.W„#5,A0”asq_status�<==�asr_en�+�asq_en; :‰BTST†#ASQDBBIT,ASQSWMD2(A4)ƒif�(dbuf�(asq_ptr)�=�enabled)‰BEQ.S…DLAYW_01 ‰ADD.W…#2,A0 DLAYW_01:‰BSR‡SETASQ_SUB  *ˆdisable�(interrupts);*ˆreset�(wakeup_pending);&*ˆif�(wakeup_pending�was�set)�then�do;*�if�(tcb_delay�(tcb_ptr)�<>�0)8*�then�call�cancel_delay�(tcb_ptr,�tcb_delay�(tcb_ptr));*�exit�(subroutine);*ˆend; *ˆelse�do;*�set�(blocked�bit);*�enable�(interrupts);*�exit�(postempt);*ˆend;  *end delay_and_wait; DLAYW_02:&‰MOVE.W„SR,-(A7)‘disable�(interrupts);‰DISABLE_INTERRUPTS 5‰BCLRW…#TSK2WKWT,TCBSTATE(A6)ƒreset�(wakeup_pending);+‰BEQ.S…DLAYW_03‘if�(wakeup_pending�was�set) *«then�do;*‰MOVE.L„TCBDLAY(A6),D0�if�(tcb_delay�<>�0)‰BEQ.S…DLAYW_04 %‰MOVE.L„A6,A5™then�call�cancel_delay;‰BSR.S…PAT_CAN_NODE DLAYW_04:%‰MOVE.W„(A7)+,SR–enable�(interrupts);!‰EXIT†SUB›exit�(subroutine�exit);*«end;  DLAYW_03: *«else�do;0‰BSETW…#TSKSBLCK,TCBSTATE(A6)ˆset�(blocked�bit);%‰MOVE.W„(A7)+,SR–enable�(interrupts);)‰EXIT†POSTEMPT–exit�(postempt�this�task);*«end;‰PAGE *ˆentry�conditions:*ŽD0�=�ADDR�(NODE�TO�CANCEL);*ŽA5�=�TCB_PTR;*  PAT_CAN_NODE:‰MOVEM.L�D1/A1-A3,-(A7) /‰MOVE.L�D0,A2“Address�of�node�we�want�to�remove$‰MOVE.L�PATBEG,A1�PAT�header�address5‰LEA.L‚PATHDR(A1),A3�A3ˆpoints�to�pointer�to�1st�node !‰WHILE.L�PATNEXT(A3)��A2�DO.S1ŒMOVE.L�PATNEXT(A3),A3‡Find�this�node�on�the�list‰ENDW (‰BSR„PAT_DEL_NODEŒNow�go�delete�the�node ‰MOVEM.L�(A7)+,D1/A1-A3 ‰CLR.L‚TCBDLAY(A5)ŒCLEAR�POINTER.‰BCLRƒ#TSKSBLCK,TCBSTATE(A5)�CLEAR�'WAIT'�ALSO‰RTS ‰ENDéééé=/*=/*†M68XXX.DEMON.AF=/**=/* Chain file to assemble M68XXX.DEMON.SA=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68XXX.DEMON.LS=/*=/IFC \1ƒ=ARG�M68XXX.DEMON.LS=/ENDIF=/*/=ASM M68XXX.DEMON.SA,M68XXX.DEMON.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDO éééééé Ö‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE8DEMON„IDNT�5,1‚68xxx�DIRECTIVE--DETACH�EXCEPTION�MONITOR*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**‡*******************:*‡*‚D�E�M�O�N†*ƒDETACH�TASK�FROM�EXCEPTION�MONITOR�-TRAP�1:*‡*‚D�M�O�N�X†*ƒDETACH�TASK�FROM�EXCEPTION�MONITOR�-TRAP�0*‡*‚REV�1.00ƒHLD6**‡*‚08/06/79‡**‡**********************‹ENTRY:�A6�HAS�ADDR�OF�TCB *’A4�HAS�PARAMETER�BLOCK�ADDRESS*—0�-�TASK�NAME�OF�TARGET�TASK*—4�-�SESSION�CODE*’A5�HAS�TARGET�TCB�ADDRESS**‹EXIT�:�D0�HAS�RETURN�CODE*’D0�=�0„GOOD�RETURN*<*ˆTHE�FOLLOWING�RETURN�CODES�ARE�RETURNED�IN�LOWER�1/2�OF�D0*6*ŠRTCDPBLK�-�2ƒPARAM�BLK�ADDR�NOT�IN�USER'S�ADDR�SPACE)*ŠRTCDTASK�-�3ƒTARGET�TASK�DOES�NOT�EXIST0*ŠRTCDSTAT�-10ƒTARGET�TASK�NOT�ATTACHED�TO�EXMON***ˆSECTION�LEVEL041ˆXDEF„DEMONŠENTRY--DIR�--DETACH�EXCEPTION�MONITOR1ˆXDEF„DMONXŠENTRY--EXEC--DETACH�EXCEPTION�MONITOR3ˆXDEF„SBDMONXˆENTRY--EXEC--DETACH�EXCEPTION�MONITOR‰PAGE**ˆTrap�#1�entry�point.* DEMON:%‰MOVE.L„A5,A2™SAVE�TARGET�TCB�ADDRESS7‰BTST†#TSKIEXM,TCBATTI(A2)ŠIS�TARGET�ATTACHED�TO�EXMON?.‰EXIT.EQƒRTCDSTAT–TARGET�NOT�ATTACHED�TO�EXMON !‰BSR.S…DEMON_SUB•call�subroutine.!‰EXIT†SUB›exit�(subroutine�exit);‰PAGE*&*ˆSubroutine�and�trap�#0�entry�points.* SBDMONX:DMONX:$‰MOVE.L„A4,A2™MOVE�TCB�ADDRESS�TO�A2-‰BCLR†#TSKSWTEM,TCBSTATE(A2)ˆCLEAR�'WAIT'�BIT  *!*ˆBuild�message�to�send�to�exmon.* DEMON_SUB:(‰MOVE.L„#$C080000,D2ˆMSG�LENGTH�AND�TYPE.‰MOVE.W„TCBNAME(A2),D2†FIRST�HALF�OF�TASK�NAME>‰MOVE.L„TCBNAME+2(A2),D3„2ND�HALF�OF�NAME,�1ST�HALF�OF�SESSION-‰MOVE.L„TCBSESSN+2(A2),D4ƒ2ND�HALF�OF�SESSION4‰MOVE.W„#$0002,D4‹0002�MEANS�MSG�IS�RESULT�OF�DETACH‰TR0.QEVNTN‚TCBEXM(A2)‰NOP›IGNORE�ERROR�RETURN  **ˆClear�target�task.*  ßX è O 1‰MOVE.L„A2,A4”Restore�tcb�to�A4�for�term�routine.8‰BCLR†#TSKIEXM,TCBATTI(A2)…CLEAR�'ATTACHED�TO�EXMON'�BIT+‰BCLR†#TRMODE,TCBSR(A2)ˆENSURE�NO�TRACE�BIT$‰CLR.L…TCBEMMSK(A2)�CLEAR�EXMON�MASK<‰BCLR†#TSKSWTEM,TCBSTATE(A2)ƒCLEAR�'WAITING�FOR�COMMAND'�BIT/‰BEQ.S…DEMON_99‘if�waiting�for�command�was�set, ,‰TR0.READY‚(A2)”then�make�target�task�ready. DEMON_99:‰RTS return�from�subroutine.‰ENDéééééééééééééé