IMD 1.17: 11/11/2014 13:03:43 82VKXBVERDOS B* VERSADOS/RMS68K OBJECT 4.3 SN=39358 10 OF 11  BT1082VKXBVERDOS 0420¾y-*g>*g RjÇaÞ* f@* g­,fí-`­ ,g` B­X­,AÕa žfÿfa|`ÿ`HçAP$8 >&68 @HC(HD4<  g 4<8***HB* g2Hçz,* m6a€`NqLß8`Lßp&*HC6‚€4*AÕa8NqLß ‚R�`ÿ|@ç|$©%|ÿÿÿÿ#JFßNuIé L g(@´¬lò%B$€ ŠNu"x ,Aé ?Fü'"HJ‘fNs Q²¨mð°hlê/(?(Bh (RhШ ²€lô!@B€0("((f"�"x , ©#H!|ÿÿÿÿFßNu9 4ga î`*_aœ _N`Lßÿ\�?_f,J¹ gaýžfJ9 [g|øÿa¢AÖa 4`tNs@ç9 4gaFî HçÿþNi/ /9 b oF,hHV/(@À@ÿ?"h 0P*n6` f€\�,_( „!TCBgaÄJ@gÿZ @f AÖa7``ÿJ @fÿBJ�f&HC4<HBAÖa ÀNq`ÿ(HBHA(&64< ‚HB4`àâˆ&T�(,_" �!TCBga`Cð=C^AÖa7J®@gþæ$< ÿÿHCHD6`¤.x Fü aüæMø "NJ© gì|,i 0.,@ÿfæ#n ®-!Î Kî.r?%2 °føB8 [|øÿ1ø T R®-fd.-fh®-fhJ¸ g*n6aú n®ú`þðJngAÖa¤Hzþˆ`>®úHzþÖ`AÖaŽHzþr`JnfB®@ÁAû-oü|úrNuHV,x Hî?ÿ-_8Ni-I<"x =iÿúúNuEø ¦Çìs,)gÇ`"ÂüEø ¦(NGs*r»Îg°$<‡42&26,(gÃáK,$( *,,,p<,.,>, ,"0<2 gB@2g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòa>J²gHç@(AÕa ¤`0Lß raÆ,sf-|çOGB.ûAúþ¶.ˆNuLß,sò Rrì ,NuÇ1G*Bh\è)!|EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†1F,|ð& fa˜Nu1F,X� <1Wú!oü` a aaaaaaaaaa a aaaaNq?/_g/ gºa aþ8 4g @ça ĪT�Kú`ª^Laaaaaaa a aNqNqa Nq`"`6`>?/_gL/ fX�—Ns?/_g0/ gNa"/ fÈ?/ _g/ g&aaýr8 4g @ça $ªT�Kú`  H.ž•â� n2-4.(g^2-,6"’må‰Ü�z n6aÒ`Nq`<"FJ‘g6*8 š�,.<œ… n6a²`Nq`(F-C<&8 8ß¿Ãfú/?,ÿú<<`B† m n-_¸-_¼.)g".Hg a@ nü|Jfüv n,Cø – 1pfHzüf`üÄ=@=|ç�GB.û`üDJFfü>AÖaý¤ Hzþ�Ÿ`új P�` € `úX~$.HffdfLLîÿ`®z,.P n6a Ì`Nq`&~ F&(.T·„f È®Lg-CT`"R‡È®Lggû¶RnX .X°nXbû¦~Hzû `X oBEgaFßüNu.�/,x ½üg*/ f".)g.H8gîH,_"—Ns,_"/8 6Nuaæ$< 4.&.(.8áL<Aî@aÊ`®)Lîÿt®-@&Nuî ,`ùv@çHçp "x ,Gé Fü'$K&g&&C´«fò$“JAj.&©#K'|ÿÿÿÿLßT�NuJAkô&)fT¯`è&C#SFïB«'@ '@'H'BB«BkgëáIAA 7Aa”Ó«Fü'&© #K LßT�NuHøÿÿ@ø!×Ni!ÉH!øL"x :3|•3|µ3| 3|°|`Þ@ç|»ø bgLíÿ !Í b*x HÕÿ8 4ga ÒÝNsNu|ð%a|`øNHøÿÿ1×!ï|LøÿÿNs@ç|JÐkü0ãHâ@S@0€kFßNua>T.ra�Fß.x AÖaÜ`÷ü î ,B® (f!NNu*@ - fø+N Nu.&|ð&î-HîÿtHç 8 Kï�� €Poaþâ. ‡ÿIöpGr8ÝU@núLß0€Nu@ç|JÐkü0ãHâ@R@o0€FßNu/ "h!i €0€B© © ,"_FßNu/ x NB�B8 Z 0àIDAÒx XäIÒ¸ BJ8 Zfà _Nu@çè-f0Hç`Cø |(&$I"j ³üg°)&cì!I %H LßNs(&Ue°($e @&`°Jhfæh%&`¢($ð@&`”`’J¸ tf|Hçÿþ!Ï tFï<.x t|9÷0 À÷0.x tLßÿÿB¸ tNsRx \ xd \k$/ "x :3|3|53|.3|>"_Bx \Nsp þÀˆÀÚÀj€nÀLÀ À€$: 0ÀH(¼€@*ž ‚&À&ì%z ‚%n Â,œ,ܼø(fÀ#R Â+È€,¨$€,²8€*À œÀ” ÂŒ<Â,Þ"ØÔР€#L €#D € €¬ €<´°¬¨"X€BˆTÀ”�Œ €$n, ¶ÀŒ€tìÁÀÊ À!> Àê ÀZ ÀXT>€#†€´€HçÀÀ x :| x NPø Z(( B�28 VÓ¸ B 8 B€&\k:R¸ >!À B <&\"x ,@ç| i "g‘¨ P`ôFß i"g‘¨ P`ô"x ,J© g0/@'ÿ@ "8 BaòæLß8 4gaòÿJx Tg Sx RnPø [`óRfNsT� €%bû�Ѐ0;"Nû �%cT—Nu/Ò�2; Aû"Nuûhüü¦ý&|P”˜,`ÀBûÖˆÞ~ ®öä÷"+v˜èœxüâ ~òf&ÆûhòNú¼ÿäð¦ñ?_fóKøIøB§$I"x fFJQk$¶1@f&i OJ�g·Øg`öHSAëaùla”Cé QÿÿfÎB„ g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu g@î-|ð&Aí-H”|0ãHâ@S@lü0€aù(�Fü AÖaùða‚`ñ R„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øö`ðNÑ g  iµèl”µém˜fÿNJQk’*iHUAíaø gþðáŠ&J×ÂàŠ(@°Šnþà ,áˆÐŒ°Šn fè`þ̰‹gþˆn gþ¼�Šàˆ$`þt&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þJCé QÿÿfÿPgþ¸&JB„`þLaöðHç $nLß0T—Nu$H"x ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé QÿÿfÐ`ÀCøAía÷2&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÷&`îCé QÿÿfÜAía÷Lß0NuT—`îHçÀ@ç&x 0|*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o Uïÿb+o aöð+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` NNu gø"(g.(f".°®f²®gÚ"x ³üg°©f²©g"i`æT— INu`††ÿÿÿB€&àŽ(o8؃S„àŒB…:(J0Pg¼pPe¼pPb¸pPbÜpPáŽÜNu Q… E lÔ*T—T—,Nu$x ( gTB€0lTD@°jnLS€Àü Eò4,f^Jªf8g .(f‚z,, n6aÿ\`$Nqn NuXnNuZnNu\nNun Nu%FBó5B$®NuJªgÚ .°’g.(gÐBªNu"x f$x jB‡B‚, Jlf„J1 g\nNu~Gòp·êmZnNuJ«g‡`â6üN¹Aúêp&Èz,, m6aþ¬` Nqn Nu6‚'M'l 'l ‡ Žü‡ í)GëÿúåŠ B ‹Nu1 g"S‡ÎüP‡Gòp k (°®g.(f=|NuGë,fÿx,f=|Nua0Nu"x f$x j~Gòp·êl¹ëf GëB‚4a ‡`ÞNuAúéF&åŠ B ƒäŠB1 B«Nu*n6., AÕaüÄ`^n`Ò<5P$0@0f22, A0g ŒA g& f.(fn `œn`¾\n`¸,g†, gÆ"�$. uP aûÎ`±üf Zn`R\n`L�uP$!uP  ‚1A1| Bƒ65PÖuPá‹!C 65P–uPRC1C3@1| , gè NuJ¬6g*l6B…:-5P$gabQ… E lî,)gP"x Ké>)gB,,Jm g.¼•f*­ Jm f0-@ fB�2- m aùf`aðNÛüSGfÂNuB„,)gÄ `–>, fz,, n6aüF` Nqn Nu$F,g"z,, m6aü"`"` JEgJ0Ðf^nNu., m6aúþ``êB€00P, f8ÐpPáˆ%@B€$°P 5pP$ª00Páˆ%@B€00Páˆÿ%@ Nuáˆ-@ Nu»Îg -,fn NuZn`r\n`jB¸ b., m6aúx`æJ…gÚ0, 2,A'ÿg � f  gÁÁÁ� B‡,,g�  gB†.8 vΆެÞ¸ vθ zà�"Ff�fAø pfRˆ-(fTˆHG>G‡ÿ?HG Gaõn`.S€g^n`®Pn`ön /fè"AÓa÷š`Þaî‚&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$T�Nu., 8,(M¹Îg,,f n NuB¸ b*l6AÕaøò`^n`´J¬@g ,<àˆ°uPe°uPb n `’05P$@0g@$,25P$ uP aø.`aí|<(SFÜuP;†PSh B†<(  g†1F JFf.05P$@ f$B€05PÐuPáˆB�25P’uPR� @aö<`aí$aíŠBµP BuP$B5P'BuPS-Nu*NB¸ b` »Îfn Nu$-2, l a÷’`^n`ÜZn`Ôn `ô\n`î&H$m6.+AÒa÷à`èJ…gÔB…:+á�, gº¬d n`�*,…ÿ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 fJ1 n=|NuBƒ,g Co=| Nuá‹à Hz@çåŠ B/?8 5gaõèîNs8 5gaõØÝNu&MB¸ b*n6., AÕaö´`^n`ZJ®@g .<àH°uPe°uPbn `ÜVn`Ö·Îgö"E$F.* k6aöp` J…fZn`\n`ö* ,**fB†<5P* gÜuPáŽB€05P�uP$R@*á�a÷(` `J…f aêîn `ªJ0Pfò"( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gÃÃ1ƒP$1¼Pg1¼PBµ@ Bµ@$Bµ@Bµ@S-R(20PÒpPá‰-A ÉEaê¾ËD g$$.´«g pP "(Kaôâ`aê0&L$+ ‚Nu,,`*"-6g*,,, Aaö8`` J…gJ0Pfn Nu.Aì aõÒ`^nNu.(f((gn Nu"(6g*,,, Aaõä`` J…gJ0Pfn NuHzÿ¢?,--gGÿg­-g- ,gSs­-f­ ,Ss3g³ gAóaéúgl û g+l  g+l  g- ,fAÕaêxNu gí,Nu gÜí ,NuJ­@g\n`h&, ƒÿà‹HC8 nHC Caîþ`Pn`F&H&¼!ASQl«l 'l'l Aë('H'H'H"áŠÔ‹'BBk&+K@Nu&L(m@ fXn`Þ,fn`ìz,+ n6aóð` Nqn `Ò"FB�,+ Ü�àŽ¼pPbä �c6B…,B‡ fY‡+gX� ‡fP†P�P…B€,¼€cn`X($KaÐ`Zn`H(m@ JÄ(gÇÇtU„a0(g tEèaY„J…g $EîaQ„$I$gaaÆNu6Ú·ìe&lUBnðNu(N¬-J¬@g l@B¬@"(’ˆ�ÿà�aïÚ`aæÂNu(n@ fXnNuJl&f~`*lB‡-gY‡*, n6aò¶` Nqn Nu&F GfBSNuT�‚gX�»ìe›ìÛìÇÂn`6Ý»ìe*lUGnð. R‡‡¾¬e.,@ç|)GSl&Fß&F f$k'jJ+g+g7|NuB€00PR@ÐpPሀ�‹B‡+°‡l.oÔ|G*,+g7|Nu j6añÚ`"``êàŽÜpPáŽÜ>0PR‡á�žƒ|GB‡+*FGë6ÝU‡núNu(n@ fXn`$ . ?,ø€_@Jl&gKÖaNu--f°, g˜", l(gTˆ±ìe l2HA±ìe l2J�kL"Az, m6añ`Nq`8)I,- �&\e�&\R€HÔNu&F- ,fm NuzNaÿŒ(FCí0<"ÜS@fú+mt+m ”+\ü0-H+\H-Hø�-H@ûNuAÖaß.Nu¨ ,fn NuaÞºNu&L- ,fm Nuzaÿ(F­ú+lP+lT+l L+lXBmX-H8�-HJg:íú.-Hg*z,-P m6aèÖ` NqnNs†(Ff+TT­ ,0-,@ÿfAÕaÞTNu$, 6,|B„g(,n=|NuB… g *,fÆaݶCÀg*B†6, gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x ,Eé&J$S gŒJªf&’aÒÊ`ê»êfâ*fÚJ†kºªfÐ&’J†f$%M%D %lBj%EÃ5CaÒ¤NuRFCf* gêªêaÒ|J†kÿ~NuaÒTJ†kÿrNuJ†f @ç| )g $@#RFß`ˆ=|FßNuSFn=|Nu&Fz`aýL(FCí0<(ÙS@fú(íü8íú -H€ÿÿÿ(À(í,0-H@ø8À(íP(íT(íL(íXNu*H(n@zB, gz.,.< n6aæü` Nq><€™AÖaÖxß®<&F, fLÛÿHîÿLÛHî 2Aÿ/gÁ=Aú/[(n@ g gì Jl&gKÖaõ$Nu>,.(f‡J”gz, n6aæn` Nqn NuJ®@fXnNu,‚Eø –J2 g\n`:¼ Eø ¦Äü%Ž %® 5¼ B² %” Br 5‡ 2` ò Nu.(f((gn Nu,°(%cB® h%#n Nu@$@&NuBG`><&,"x $0àH°i lB(¸±0f:Jq0 g4 10f ¾10g,‡0Jq0 j&10JGg Añ0aÙÚNuAñ0aÚvNu^nNun Nu,*H"y 0 g i‘É*$ n6aå8` Nqn Nu$F&äŠ$ÙS‚fú$F(M"y 0&Q—ÉÙË$ÌÛÃ$ÍNu.(fn NuLÜ.<&\²‡e’‡R€`ö&(@ç|–¸ B˜¸ >!À >!Á B׸ FÙ¸ JFßB§"x ,Eé&J$S g@*g2&’$—.Š*fä * gÞ²ªn ‘ª²ªgÎmôѪ²ªnö`Àת`¸.g$G$*.aÏ.J‡fðNu=| . €Kª{ûfDJnpg x :(f2 x ‘ü, z n6aä```*FB®LîÿN•B¸ b,x Nuî ,NuJ”f@",g.(f".*y »üg(²­f-(f ½Ígí-gD*m`ØAÔaãf` B® VnNu*H½Íg-(g.(fn Nuí-g\nNu0,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Ø2FßNuî)=H*fî*.(g . (gaÖf.-g`$.)fÚ=H*=n,.î--n°-n´(N"x ,Eé&J g$@¹êfò&’aÌü`ì,)gaä ,Tg @B¨!x :!È :&,(,ì)"x )-f2¸©f¬),)g) ,g¶©@f¸©Df ><@AÑaÑb"i f¾,)gaôNqaö®,)gaõø~Cø –Eø ¦"Âü 1pf2g/aÏö., ,gaÕ¼R‡ ‡oÄaîVaä‚J¬gH4<HB4,&,8,HD8,°*,²<,¶HF<<.,*>,\,)g<<$LAìaÚêNq(JCø )g¹Àg"@`ò#laÕ>B¸ rAÔaÝÚNuaÔÂ(-gn -hp =h("NuIëÿþ6<€`&LLìpHF>,6.(BAÓaàh``0<`,B€8 oH@0< @aÛ `0<`*H4<B˜QÊÿü+S +fgJ€f `<.p .;Fp+@aæBfDÿ;D(+El+EüHD0àHgfJg¸.%c.%D%°c@$@&*¼!TCB|€,;|:|úr;|0$MÕü`+J6$¼!TST|5|$5|D x  -"-±üg °¨f²¨g h`ærAÕaÜ|0<`aÓÊ`0<` +x !Í Nuf=@NuT—Nufg2 .".` ", , g.(g J�g` .".+@+ANu.(fn Nu*<,, n6aß` Nqn Nu,fnNu&Fp&ÝQÈÿüNu@ç, gzR` ,gz,. n6aÞ¼` NqTnFßNuJ”f6".*y »üg,²­f-(f-,g-.fD*m`ÔAÔaÞ(` B® Vn`°*H½Íg-(g.(fn `’-,f \n`„-m -.f`>,aþº+mlü|úr- (gDz,-ü m6aÞ` Nqn `ÿ@+Fü:(0P$g00PÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­,0-,@ßfF×AÕaÓT`þÔ@ç FJ�f8".*x »üg.²­f-(f½Íg--fí,gL*m`ÐaÜú` B® VnFßNu*H--fê½Íg-(g.(fn `Öí,g\n`È;m,.-m |­-gCø  I"h ³üg ³Ífî!i `’î,®-fNu®,=n^Bn^AÖaÒnNu-n Hî)Nu-n Lî)Nu»Î`ø [¨,g( (Xg "@B©B¨X1h^g 1|Bh^aÒNuè-Nu(n@ fXn`4î ,.-g® ,AÖaÑæ`ìì Jl&gKÖaê–Nu,fz. n6aÛì`NqpaX$F"*fp aJAø ŠAø ŠaÐ0Gø "SJ“g²©gÒGé`ì f¸, n6B…*ç�EaÛ’`Nq`¢B€* e c @dpËa„r Âj A  fp ar"x fJ1gj°*f¦ *ÿg Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*²sPdpÏa ²sPd pÏaR`NQ…lâp Àjf$ * @fRˆ/<Hª? *(SJ“fp a¤Gì°¬fì*,Ig°,(gp a„ ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aÔÊ` LßpaÿHLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLê?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@D&j ×Ó#K )ÿf#|NP*géI*géH`R*fbB€*&x fJ3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #K)I`#K&iD3|N¹J#|OLIéJ&ŒB€* x f¼ÿ iÑè*I/N�,_`t`Zp aøp aôpað g@o opÁaÜ n6B€S&@B… f )e2 )c )€e" )�b;°g,aØ’` Nq`¢×ËGû°ÖÓNÓÿþ Ì¢Úð *a²f´ © ©HfX")D(A&TGëÿ¶ `&lJ¬fa̰‹g(K`ê¹Áf&J«g((k)|N¹J)|OLIìJ&kD&Œ` )k`B�)(&iD&¼¾&x fB3Iø  &TJ”fa˦°‹gIë`ì(«Aø ŠaÌÌ IraÔš`8aË€p�az&Iaî"Kfpal)Hgp‚a`)IgpƒaT)Ig .(gþ†)Igp a6 )c )c )€e )�c*g< * d pÆa˜`”j :#j +HPAø ŠaÊÚ mÑè/N�,_J@g>a, )AîDJ�g"P°©gAé `îF€NuB�Aø ŠaÊœ X�=@`Aø ŠaÊŠB€B®Nu,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ÒZîFßHç€Ä*oKíÿ°"m/ N‘*_e -g*@`êLß#X�`¿ 8 5gaÒîHç€Ä 8 g*@ m ( g / @çN°Fß*_ -`àLß#`¿b |PpNAg`B DATAb ,H <BXS€fú=| ä=|\ æ-| èOî Aî&"HB™B™2ü2ü"üSHRS"üþà"¼pNAf´Aî&"HB™B™ü ü4"ü"üTfB‘pNAfŽAî&"H"üRÖü"¼"Hp3NAfrX‰üBp3NAfdAî&"HB™B™BY2ü‹"üUØ"Žp=NAfFAÖ Mp üPIA üþà üÿÿüB˜ üÅ üTÀ üÅB˜B˜üÿÿBBX*H&|þà B@@¼ÿ@<@@+|.|<*|ÿÿÿÿCîBp éAÓüBS€fðp$NAp! | NAf¸p CîB)Ag $i8J*%g ÓüBS€fä`Ê)@g@Aî&!i$!i,g. ¼!|!i4!i !ipNAg"|„`)@g©@Aî&!i `°a¢B)@B)AR®èéAB©4Bª B*%S*#fB*$B€)a¬`ÿ0B€)ažCîBp )Agµé8gÓüBS€fèB*$B*#`Ê|$|%©AéAB€) fS€S€åˆ$i8(r%I &jB)@N”gþº@B*%B©,`þàCîBp )AfÓüBS€fî`P Ip"NAfHS®è)€ gr$iB©Aî&p ¼!|!I¨!i !i!JX¨!|NAfäB)@B)AéAR®èB€a†p! | NAfÈNw) g g g <‚`¬S€)vEÖ²*g²* gÕü&Sƒfê <ƒ`‚#J8S€åˆ(r €Åf`hR*#B)@B)AJ*$géA`*|%éA|$&j%I N”g @B©,B*%J®èop! | NAf p5 |‚NAfüNw@B©,#@a` )a”`ÂAî&p"NAfÒ"h$i8B))@g j$|$)@f)@f)@g U© ¼!UDRáŠ]‚„ü 1BB¸ 0$:Žg2 BpN@`aê!È 0aEè ŠáŠQ‚„üÄüÔŠ!B1ú` 4!ü –aÀJ¸ fœB¸ GúœCë <€pN@`ad4+;B,g +x  !Í EëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†a¢.x 2<ÀaD/:†NuHVMù,¯@îFü'MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈB†-½ÈnúNu0<`0<�F虀2<é™"x :Cé2�A02�2€@02€Nua&a°‹fa†a|°�faÿ|Cí!É aÂazNuB€Aú$°Pgaÿ^B‡EЇ Eê Rÿÿfð‡#à�*(B(:¢º„c*„ÿBKúûû" B*AMú,Bœ�°ºrf†` (< �B*DB†º„baþöNu hÿÿ g,a2 ÿfaN`aðJga$`a@°‹ga¾a`Ì3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baþ�Nu•ÊB�B‚BƒIÕKõhHz ?þàB9þà ü>þà9þà è àÁþàü6þàOïNuNu]] P þ þ þà@ þˆÿÿ ‘'EXORMACSREPL CD••ÏREPLGEN CF®®¯FAKEMMU AFÇÇFAKEMMU SAÐÐ;FAKEMMU ROÙÙLOADMMU AFââLOADMMU SAëë@LOADMMU ROôôVECTORS AFýýVECTORS SAVECTTBL AG“INITIO AG((�VECTORS ROAAINT LGJJ READY AFSSREADY SA\\’READY ROmmRMS CDvv,RMS LG fVECTTBL RO��‚*�EXORMACS.REPL.CDA‚*�REPL�sysgen�command�file�will�generate�a�REPL�demonstration�to;‚*ƒrun�on�an�EXORmacs�system.‚Four�different�configurations‚*ƒare�possible.‚*:‚*�THREE�-�STEP�PROCESS�TO�PUT�TOGETHER�REPL�DEMONSTRATION8‚*�-----ƒ----�-------�--�---�--------�----�-------------‚*A‚*�1.‚Assemble�REPL�for�your�particular�configuragion�by�invoking$‚*‡one�of�the�following�chain�files:‚*,‚*‡VERSADOS.REPL.AFƒ-�To�run�under�VERSAdos.‚*9‚*‡BIOS.REPL.AF‡-�To�run�without�VERSAdos�but�with�RMS68K(‚*žand�using�BIOS�as�an�I/O�server�task.‚*9‚*‡INT.REPL.AFˆ-�To�run�without�VERSAdos�or�BIOS�but�with+‚*žRMS68K�and�handle�I/O�using�an�interrupt‚*žservice�routine.‚*:‚*‡POLL.REPL.AF‡-�To�run�without�VERSAdos�or�BIOS�but�with,‚*žRMS68K�and�handle�I/O�by�polling�the�ACIA‚*žserial�port.‚*D‚*�2.‚Assemble�BIOS�to�suit�your�configuration.‚To�assemble�BIOS�forB‚*‡your�configuration,�set�the�appropriate�equate�switch(s)�in�the?‚*‡BIOS.SA�source.‚Explanations�for�the�switches�appear�in�thisA‚*‡source.‚As�shipped,�BIOS�is�configured�to�run�on�an�MMU�system"‚*‡with�ACIAs�as�the�serial�ports.‚*F‚*�3.‚Perform�the�appropriate�sysgen.‚Select�from�one�of�the�following‚*‡four�command�lines:.‚*‡=EXORMACS.REPLGEN.CF�,,L1.LS,VERSADOS,L2.LS*‚*‡=EXORMACS.REPLGEN.CF�,,L1.LS,BIOS,L2.LS)‚*‡=EXORMACS.REPLGEN.CF�,,L1.LS,INT,L2.LS*‚*‡=EXORMACS.REPLGEN.CF�,,L1.LS,POLL,L1.LS‚*A‚*…In�all�of�the�above�cases,‚two�listings�will�be�generated,‚one=‚*…in�L1.LS�and�the�other�in�L2.LS.‚If�the�VERSADOS�option�isA‚*…selected�then�the�output�from�the�sysgen�will�be�REPL.LO�which@‚*…can�be�taken�to�an�EXORmacs�system�running�under�VERSAdos�and@‚*…invoked�like�a�normal�utility.‚In�all�other�cases,�the�output?‚*…created�will�be�a�boot�file�called�REPL.SY.‚This�file�can�beD‚*…put�onto�an�bootable�diskette�and�booted�into�an�EXORmacs�system.‚*?‚*�The�following�files�are�required�to�perform�the�REPL�sysgen.C‚*ƒThey�must�be�present�in�the�account�in�which�the�sysgen�is�done.‚*�0–\žD"‚*ˆFILE•ACCOUNT�WHERE�FILE�RESIDES"‚*ˆ----•-------�-----�----�-------‚*‚*ˆ&.BIOS.LG�99997‚*ˆ&.BIOS.RO�9999�(Assemble�to�suit�your�configuration)‚*ˆ&.REPL.LG�99997‚*ˆ&.REPL.RO�9999�(Assemble�to�suit�your�configuration)‚*ˆC4O9.SYSPAR.ROˆ9999‚*ˆEXORMACS.INITIO.AG„9999‚*ˆEXORMACS.INT.LG‡9999‚*ˆEXORMACS.REPL.CD†9999‚*ˆEXORMACS.REPLGEN.CFƒ9999‚*ˆM6840.M6840.EQˆ9999‚*ˆEXORMACS.RMS.LO‡9999‚*ˆM68XXX.INIT.ROˆ9999‚*ˆM68XXX.INITDAT.AG…9999‚*‚*3‚MSG†There�are�four�sysgen�options �for�this�system.5‚MSGˆThe�appropriate�switch�value�is�passed�to�SYSGEN:‚MSGˆfrom�the�EXORMACS.REPLGEN.CF�chain�file.‚The�possible‚MSGˆvalues�are:$‚MSG‹"VERSADOS"�-�I/O�with�VERSAdos.(‚MSG‹"BIOS"…-�I/O�with�BIOS�server�task.)‚MSG‹"INT"†-�I/O�with�interrupt�handling.'‚MSG‹"POLL"…-�I/O�with�status�checking.‚MSG(‚MSG‚You�have�selected�option�"\CONFIG". *‚ASMLSW„=�\2‹*ASSEMBLY�LISTING�FILE�SWITCH‚*”0�=�ASMLS�IS�A�FILE‚*”1�=�ASMLS�IS�A�DEVICE'‚LINKLSWƒ=�\2‹*LINK�LISTING�FILE�SWITCH‚*”0�=�LINKLS�IS�A�FILE‚*”1�=�LINKLS�IS�A�DEVICE ‚IFEQˆ\ASMLSW!…ASMLS…=�"\4"‰*ASM�LISTING�DEVICE‚ENDC ‚IFNEˆ\ASMLSW$…ASMLS…=�"\1"‰*ASM�LISTING�WORK�FILE‚ENDC ‚IFEQˆ\LINKLSW#…LINKLS„=�"\4"‰*LINK�LISTING�DEVICE‚ENDC‚IFNEˆ\LINKLSW!…LINKLS„=�"\1"‰*LINK�LISTING�FILE‚ENDC +‚WORKLS„=�"\1"‰*OVERALL�LISTING�FILE/DEVICE ‚&SESS…=�1‚CONFIG„=�"\3"‚MEMEND1ƒ=�$180000 ‚MEMEND2ƒ=�$0 ‚MEMEND3ƒ=�$0‚PAGESIZE‚=�256‚ASN‡=�0‚GST‡=�4‚UST‡=�1 ‚TRACE…=�5‚IOV‡=�1‚PAT‡=�1‚UDR‡=�0‚MMU‡=�$FE2000‚TIMER…=�$FEE040‚CLOCKFRQ‚=�1000‚BUGTRACƒ=�$FE8808‚TRCFLAGƒ=�$0000 ‚TIMINTVƒ=�10 ‚TIMSLICƒ=�2 ‚WHERLOAD‚=�0 ‚STACK…=�$900‚STARTRMS‚=�$C00‚IFNEˆ"\CONFIG","VERSADOS"…PROCESS…EXORMACS.RMS.LO…END‰RMS‚ENDC-‚=COPY‡9999.EXORMACS.RMS.LL,EXORMACS.RMS.LL;Y‚IFEQˆ\LINKLSW …=COPY‡EXORMACS.RMS.LL,\WORKLS;A‚ENDC ‚MEMBEG„=�* ‚&SESS…=�1 ‚IFEQˆ"\CONFIG","BIOS" …TASKˆBIOS …BIOSSTRT‚=�* …SUBSˆBIOS.LG …LINKˆBIOS.LG…IFEQˆ\LINKLSWˆ=COPY‡BIOS.LL,\WORKLS;A…ENDC…SESSIONƒ=�\&SESS…&SESS…=�\&SESS+1…PRIORITY‚=�200 …END‰BIOS‚ENDC ‚IFEQˆ"\CONFIG","VERSADOS" …REPLSTRT‚=�* …SUBSˆREPL.LG …LINKˆREPL.LG…IFEQˆ\LINKLSWˆ=COPY‡\LINKLS,\WORKLS;A…ENDC‚ENDC ‚IFNEˆ"\CONFIG","VERSADOS" …TASKˆREPL …REPLSTRT‚=�* …SUBSˆREPL.LG …LINKˆREPL.LG…IFEQˆ\LINKLSWˆ=COPY‡\LINKLS,\WORKLS;A…ENDC…SESSIONƒ=�\&SESS…PRIORITY‚=�100…ATTRIB„=�'USER' …END‰REPLB …PROCESS…INIT…MEMEND„=�$20000…PANEL…=�$FE0000…SUBSˆM68XXX.INITDAT.AG/…ASM‰M68XXX.INITDAT.AG,M68XXX.INITDAT.RO,\ASMLS …IFEQˆ\ASMLSWˆ=COPY‡\ASMLS,\WORKLS;A…ENDC…SUBSˆEXORMACS.INITIO.AG1…ASM‰EXORMACS.INITIO.AG,EXORMACS.INITIO.RO,\ASMLS …IFEQˆ\ASMLSWˆ=COPY‡\ASMLS,\WORKLS;A…ENDC …INTSTR„=�*…SUBSˆEXORMACS.INT.LG…LINKˆEXORMACS.INT.LG…IFEQˆ\LINKLSWˆ=COPY‡\LINKLS,\WORKLS;A…ENDC …END‰INIT‚ENDC‚IFEQˆ"\CONFIG","VERSADOS"<…MSG‰*******************************************************5…MSG‰REPL�sysgen�complete.‚You�now�have�a�file�called9…MSG‰REPL.LO�which�can�be�run�on�an�EXORmacs�system�under5…MSG‰VERSAdos.‚To�run�the�demonstration,�just�execute(…MSG‰REPL�as�you�would�a�normal�utility.<…MSG‰*******************************************************‚ENDC‚IFNEˆ"\CONFIG","VERSADOS"<…MSG‰*******************************************************5…MSG‰REPL�sysgen�complete.‚You�now�have�a�file�called8…MSG‰REPL.SY�which�includes�RMS68K�and�the�REPL�task.‚To:…MSG‰run�the�demonstration,�boot�the�REPL.SY�file�directly…MSG‰into�an�EXORmacs.<…MSG‰*******************************************************‚ENDC ‚END‰SYSGENé=/***********************=/* EXORMACS.REPLGEN.CF *=/***********************=OPT K,NM=/***************************************************************************"=/*�Chain�file�to�perform�sysgen¬*=/*É*=/*�Calling�sequence:·*=/*É*)=/*ƒ=SYSGEN.CF�arg1,arg2,arg3,arg4,arg5£*=/*É*7=/*„Not�all�of�the�arguments�need�to�be�entered�since”*$=/*†they�each�have�a�default�value¥*=/*É*==/*„arg1�-�command�file�name�(defaults�to�EXORMACS.REPL.CD)Ž*=/*É*,=/*„arg2�-�Temp�vol�and�user�n o./Boot�fileŸ*9=/*�Temp.�vol.�and�user�no.�defaults�to�volume�name�and‰*)=/*�user�number�of�command�file�(arg1).—*&=/*�Boot�file�defaults�to�'REPL.SY'.œ*=/*É*=/*É*9=/*„arg3�-�List�device�or�file�name�for�sysgen�messages’*=/*�(defaults�to�SYSLIST.LS)¤*;=/*‹If�file�name�-�sysgen�uses�'.LS'�as�default�extension‰*=/*É*9=/*‡NOTE:�The�first�three�arguments�are�the�same�as�the�*4=/*�three�command�line�fields�used�in�invoking�theŽ*=/*�sysgen�utility�directly.¤*=/*É*B=/*„arg4�-�Type�of�system�configuration�(defaults�to�'VERSADOS')‰*&=/*�'VERSADOS'†For�use�with�VERSAdos—**=/*�'BIOS'ŠFor�use�with�BIOS�server�task�*5=/*�'INT'‹For�use�without�BIOS�or�VERSAdos�and�withƒ*$=/*Ÿinterrupt�service�routine�I/O.Œ*6=/*�'POLL'ŠFor�use�without�BIOS�or�VERSAdos�and�withƒ*=/*ŸI/O�polling�type�I/O.•*=/*É*5=/*„arg5�-�Listing�device�or�file�(Defaults�to�#PR)–*A=/*�Legal�devices�are�#,#PR,#PR1,#PR2,#PR3,#NULL�or�a�file�name.*:=/*�All�assembly�listings�and�link�maps�will�be�directedˆ*<=/*�To�the�specified�device�or�file�using�the�copy�utility†*>=/*�with�append�option.‚SYSGEN.TF�is�used�as�an�intermediateƒ*7=/*�file�to�contain�the�assembly�or�link�list�output.‹*@=/*�Due�to�restrictions�in�sysgen�literal�substitution�process‚*8=/*�this�field�cannot�contain�more�than�10�characters.Š*M=/***************************************************************************=/*'=/* Force the definition of 5 arguments=/*=/RX=\0 =/IF RX=07ƒ=ARG�EXORMACS.REPL.CD,/REPL.SY,SYSLIST.LS,VERSADOS,#PR¦5¯a·=/ENDIF =/IF RX=1)ƒ=ARG�\1,/REPL.SY,SYSLIST.LS,VERSADOS,#PR=/ENDIF =/IF RX=2#ƒ=ARG�\1,\2,SYSLIST.LS,VERSADOS,#PR=/ENDIF =/IF RX=3ƒ=ARG�\1,\2,\3,VERSADOS,#PR=/ENDIF =/IF RX=4ƒ=ARG�\1,\2,\3,\4,#PR=/ENDIF=/*8=/* We have 5 arguments - now default any null arguments=/*=/IFC \1"ƒ=ARG�EXORMACS.REPL.CD,\2,\3,\4,\5=/ENDIF=/IFC \2ƒ=ARG�\1,/REPL.SY,\3,\4,\5=/ENDIF=/IFC \3ƒ=ARG�\1,\2,SYSLIST.LS,\4,\5=/ENDIF=/IFC \4ƒ=ARG�\1,\2,\3,VERSADOS,\5=/ENDIF=/IFC \5ƒ=ARG�\1,\2,\3,\4,#PR=/ENDIF=/*N=/* If arg5 is not #PR,#PR1,#PR2,#PR3,# or #NULL then treat as file and delete:=/*ƒset�switch�(arg6)�to�1�for�printer�device,�0�for�file.=/*0=ARG \1,\2,\3,\4,\5,0,#PR,#PR1,#PR2,#PR3,#,#NULL =/FOR 7,\0ƒ=/IFEQ�"\5"\(RX)1†=ARG�\1,\2,\3,\4,\5,1,#PR,#PR1,#PR2,#PR3,#,#NULLƒ=/ENDIF=/ENDFOR=/RX=\6 =/IF RX=0ƒ=DEL�\5=/ENDIF=/*=/* Set switch (arg7) TO:=/*„00�--‚VERSADOS=/*„01�--‚BIOS =/*„02�--‚INT=/*„03�--‚POLL=/*=/RX = 0=ARG \1,\2,\3,\4,\5,\6,10=/IFEQ "\4"VERSADOS ƒ=/RX�=�1=/ENDIF=/IFEQ "\4"BIOS ƒ=/RX�=�1=/ENDIF=/IFEQ "\4"INT ƒ=/RX�=�1=/ENDIF=/IFEQ "\4"POLL ƒ=/RX�=�1=/ENDIF=/*9=/* Abort chain if an invalid configuration was requested=/* =/IF RX=05ƒ=/ABT�\4�is�an�invalid�configuration�-�(argument�#4)=/ENDIF#=ARG \1,\2,\3,\4,\5,\6,\4,SYSGEN.TF=/*3=/* The argument list now looks like the following:=/* =/*ƒarg1ƒ-ƒName�of�command�file.=/*0=/*ƒarg2ƒ-ƒTemporary�volume/boot�file�(or�null).=/*3=/*ƒarg3ƒ-ƒList�device�or�file�for�sysgen�messages.=/*(=/*ƒarg4ƒ-ƒSystem�configuration�mnemonic$=/*�'VERSADOS,�'BIOS',�'INT',�'POLL'=/*�(see�arg7)=/*@=/*ƒarg5ƒ-ƒListing�file�or�device�for�assemblies�and�link-edits.4=/*�SYSGEN.TF�is�the�temporary�file�which�is�used�in1=/*�conjunction�with�=COPY�;A�to�produce�a�single=/*�listing�file.=/*�(see�arg6)=/*=/*ƒarg6ƒ-ƒSwitch�-"=/*�0�=‚arg5�specifies�a�file�name=/*�1�=‚arg5�specifies�a�device=/*�(see�arg5)=/*=/*ƒarg7ƒ-ƒSame�as�arg4=/*8=/*ƒarg8ƒ-ƒSYSGEN.TF�temporary�file�for�use�with�copy�in+=/*�creating�listing�file�specified�by�arg3=/*=/*9=/* Justify argument positions and invoke sysgen utility.=/*=ARG \5,\6,\7,\8,\1,\2,\3,\4=/*)=/*  Turn off echo of sysgen command lines=OPT J=SYSGEN \5,\6,\7;T=200 =OPT -J,-NM=/***************************************************************************M=/***************************************************************************=/**=/**‚Sysgen�Completed�--=/**6=/**„Assembly�and�link�listings�have�been�output�to�\1=/**1=/**„Sysgen�command�listing�has�been�output�to�\7M=/***************************************************************************M=/***************************************************************************=OPT -K=ENDéééé=/*†EXORMACS.FAKEMMU.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN,=/*†FILE�WILL�DEFAULT�TO�EXORMACS.FAKEMMU.LS=/*=/IFC \1=ARG EXORMACS.FAKEMMU.LS=/ENDIF=/*6=ASM EXORMACS.FAKEMMU.SA,EXORMACS.FAKEMMU.RO,\1;RZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDéééééé¿ ‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.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ƒLOADMMU,LOADMMUI"ŠXDEFƒCRASN,DEASN,UNLDMMU,MMUFAULT‰XREF.S�MMUHERE,MMULOAD*,LOADMMU‚MOVE.W‚SR,-(A7)ŠSAVE�STATUS�REGISTER)LOADMMUI�OR.W„#$700,SRŠINHIBIT�INTERRUPTS!‰MOVE.L‚MMUHERE,A5ˆADDRESS�OF�MMU/‰MOVEM.L�MMUFAKE,D0-D7…GET�ENTIRE�ADDRESS�RANGE‰MOVEM.L�D0-D7,(A5)ˆLOAD�MMU ‰RTE—RETURN MMUFAKE‚DC.Lƒ$0000FFFF,$00000001‰DC.Lƒ0,0,0,0,0,0ŠPAGE*I*‚Dummy�entry�points--we're�pretending�not�to�have�an�MMU,�but�other�execH*‚routines�are�going�to�be�calling�us�at�these�entry�points�because�they+*‚don't�know�whether�we�have�an�MMU�or�not.*CRASN:DEASN:UNLDMMU: MMUFAULT: &ŠRTS—Just�return--he'll�never�know....   ‰ENDéééÈ<41LOADMMU ASYST'EXORMACSFAKEMMU SA!ƒLOAD MMUv2BLOADMMU BLOADMMUI BMMUFAULT 8pMMULOAD BUNLDMMU 8BCRASN 8BDEASN 8pMMUHERE ":?3 @ç|*x Lùÿ)HÕÿNsÿÿNu4éééééé éÑ=/*†EXORMACS.LOADMMU.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�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.&.TST.EQ=/*}=/*=ENDééééééÚ‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.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ƒLOADMMU,LOADMMUI"ŠXDEFƒCRASN,DEASN,UNLDMMU,MMUFAULT‰XREF.S�MMUHERE,MMULOAD‰XREF.S�TRACER,TRACFLAG*,LOADMMU‚MOVE.W‚SR,-(A7)ŠSAVE�STATUS�REGISTER)LOADMMUI�OR.W„#$700,SRŠINHIBIT�INTERRUPTS(‰CMP.LƒMMULOAD,A5ˆIS�MMU�ALREADY�LOADED?‰BEQ.SƒLOADMMURŠBRANCH�IF�YES.‰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�MMU7LOADMMUR�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*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:UNLDMMU: MMUFAULT: &ŠRTS—Just�return--he'll�never�know....   ‰ENDééãA41LOADMMU ASYST'EXORMACSLOADMMU SA'!ƒLOAD MMUŒ2BLOADMMU BLOADMMUI BMMUFAULT .pMMULOAD BUNLDMMU .BCRASN .BDEASN .pTRACER pTRACFLAG pMMUHERE "083(H@ç|»ø gLíÿ !Í *x HÕÿ8 gaAØÝNsNu4éééééééì=/*†VECTORS.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN,=/*†FILE�WILL�DEFAULT�TO�EXORMACS.VECTORS.LS=/*=/IFC \1=ARG EXORMACS.VECTORS.LS=/ENDIF=/*4=ASM :.EXORMACS.VECTORS,:.EXORMACS.VECTORS,\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�-�$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éé‰INCLUDE�9999.M6840.M6840.EQ ‰SECTIONƒ8‰PAGE*J*‚This�code�is�needed�to�satisfy�INIT,�which�is�board-independent�and�must/*‚call�upon�us�to�do�the�board-dependent�stuff.**„Initialize�the�MMU.*/ŠXDEFƒINITMMUŒEXORmacs�MMU�comes�up�initialized ŠXREFƒMMUŠXREF.S�MMUHERE INITMMU‚EQU‡*2ŠMOVE.L�MMU(PC),MMUHERE„Save�MMU�address�in�sysparŠRTS—nothing�to�do�here. **„Start�the�timer�running.*+ŠXREF.S�CRASHSAV‹These�are�found�in�SYSPAR.ŠXREF.S�EXCSTACKŠXREF.S�PTMADDRŠXREF.S�TIMESLICŠXREF.S�TIMINTVŠXREF.S�TIMINTV4 &ŠXREFƒCLOCKFRQ‹These�are�found�in�IND. ŠXREFƒTIMERAŠXREFƒTIMINTVA ŠXREFƒTIMSLIC 1ŠXDEFƒTIMERSTŒEntry�point�to�START�TIMER�routine.* TIMERST‚EQU‡*;‰MOVE.L�TIMSLIC(PC),TIMESLIC†Set�the�sysgen�parameter�which'*¦dictates�the�#�of�timer�tics�per�time*¦slice'‰MOVE.L�TIMERA(PC),A1‡GET�TIMER�ADDRESS#‰MOVE.L�A1,PTMADDRŠSAVE�IT�FOR�EXEC$‰BEQ.S‚TIMER_EXITŠBRANCH�IF�NO�TIMER)‰PEA„TIMERBE(PC)‰WHERE�TO�GO�ON�BUS�ERROR$‰MOVE.W�#'BE',-(A7)‰SET�BUS�ERR�FLAG3‰MOVE.B�#$01,CR2SR(A1)†ALLOW�WRITE�TO�CONTROL�REG�1&‰MOVE.B�#$01,CR13(A1)‡ALL�TIMERS�RESET$‰MOVE.L�#CLOCKFRQ,D0ˆCLOCK�FREQUENCY‰DIVUƒ#4,D0�DIVIDE�BY�4#‰SUB.W‚#1,D0�CLOCK�INTERRUPTS�AT�-1*‰MOVE.W�TIMINTVA(PC),D1…INTERRUPT�INTERVAL ‰MOVE.W�D1,TIMINTVŠSAVE�FOR�EXEC‰MULUƒ#4,D1�MULTIPLY�BY�4*‰SUB.W‚#1,D1�SUBTRACT�1�-�TIMER�GOES�TO�-1!‰MOVE.W�D1,TIMINTV4‰SAVE�FOR�EXEC‰LSL.W‚#8,D1�PUT�IN�HIGH�BYTE)‰ADD.W‚D1,D0�VALUE�FOR�TIMER�3�(2�HALVES)‰MOVEP‚D0,MSBT3(A1)ˆSET�TIMER�34‰MOVE.W�#256,D0�VALUE�FOR�TIMER�1�(OVERFLOW�COUNTER)‰MOVEP‚D0,MSBT1(A1)ˆSET�TIMER�18‰MOVE.B�#$00,CR2SR(A1)†ALLOW�WRITE�TO�CONTROL�REGISTER�3;‰MOVE.B�#$C6,CR13(A1)‡T3--INTERNAL�CLOCK,INTERRUPT�ENABLED,*£OUTPUT�ENABLED,�8-BIT�MODE8‰MOVE.B�#$01,CR2SR(A1)†ALLOW�WRITE�TO�CONTROL�REGISTER�1;‰MOVE.B�#$00,CR13(A1)‡T1--EXTERNAL�CLOCK,�ENABLE�ALL�TIMERS/‰ADDQ.L�#6,SP’Everything�went�OK;�just�get�that'*¦bus�error�junk�off�the�stack�and�exit‰BRA.S‚TIMER_EXIT*   B)A1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*‚>>>>>>>µ<<<<<<<*‚>>>>>>>•NOTICEš<<<<<<<*‚>>>>>>>µ<<<<<<<>*‚>>>>>>>…When�incorporating�any�drivers�during�SYSGEN„<<<<<<<?*‚>>>>>>>…that�require�memory�allocated�for�them�as�perƒ<<<<<<<?*‚>>>>>>>…the�driver�package�instructions�-�this�is�theƒ<<<<<<<,*‚>>>>>>>…spot�the�file(s)�go�into!!–<<<<<<<*‚>>>>>>>µ<<<<<<<=*‚>>>>>>>…This�is�also�the�spot�for�code�for�a�driver…<<<<<<<>*‚>>>>>>>…that‚requires�other�types�of�initialization,ƒ<<<<<<<0*‚>>>>>>>…such‚as�clearing�an�interrupt.‘<<<<<<<*‚>>>>>>>µ<<<<<<<*‚>>>>>>>‘MERGE�IT�HERE—<<<<<<<*<*ˆWhen�you�write�the�code�that�is�to�be�merged�here,�wrap�it*ˆaround�with�the�following:*:*ˆAt�the�beginning,�with�DRVRxOUT�referring�to�your�unique*ˆlabel,�put�this�code:*'*‹PEA„DRVRxOUT(PC)„IF�BUS�ERROR�OCCURS,*¢RETURN�OR�GO�ON�TO�NEXT*¢DRIVER'S�INITIALIZATION**‹MOVE.W�#'BE',-(A7)…SAVE�'BUS�ERROR'�FLAG*9*ˆThen�insert�the�code�to�do�what�you�need�to�do�for�this*ˆparticular�driver.**ˆAt�the�end,�put�this:***‹LEA„6(A7),A7ˆREMOVE�BUS�ERROR�FROM�STACK*DRVRxOUTƒEQU„**=*ˆIn�this�way,�if�the�code�for�one�driver�causes�a�bus�error,.*ˆthe�code�for�other�drivers�will�be�executed.*E*‚>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<G*********************************************************************** ŠRTS‰ENDééééé  é=1VECTORS ASYST'EXORMACSVECTORS SA !ƒINTERRUPT VECTORS 2pPROGINT4 pSYSPAR (*3�((þˆ4ééééééé9=/*=/*†Important�note:5=/*†The�order�of�the�INPUT�modules�for�this�LINK�must=/*†be�as�specified�below.=/*=LINK ,INIT,\LINKLS;IXHMSEGMENT .INT:8 \INTSTRINPUT M68XXX.INIT.ROINPUT EXORMACS.INITIO.ROINPUT M68XXX.INITDAT.ROINPUT C4O9.SYSPAR.ROEND=ENDéééé  ééB =/*†EXORMACS.READY.AF=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN*=/*†FILE�WILL�DEFAULT�TO�EXORMACS.READY.LS=/*=/IFC \1=ARG :.EXORMACS.READY=/ENDIF=/*0=ASM :.EXORMACS.READY,:.EXORMACS.READY,\1;RZ=045=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDééééééK‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰LIST‰PAGE.READY„IDNT„2,0ƒTRAP�0�-�PUT�TASK�ON�READY�LIST*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�READY‡2.00�**ˆ*�GGC3�03/06/79„**ˆ*�7616�05/18/79„**ˆ*�HLD6�02/08/81„**ˆ*********************9*„READY‚EXEC�ROUTINE„PUTS�TASK�IN�READY�QUEUE�BY�PRIORITY>*‰ENTRY:�A0�POINTS�TO�TASK�CONTROL�BLOCK�OF�TASK�TO�MAKE�READY *�A6�IS�ADDRESS�OF�REQUESTOR�TCB*‰EXIT�:�RTE�WITH�NO�PARAMETERS *’01234567* USES REGISTERS D **�A�P*‰SECTION�LEVEL00*‰XDEFƒREADY,SBREADY‰XREF.S�READYHD*(SBREADY‚MOVE.W�SR,-(A7)ŒSUBROUTINE�ENTRY=READY„BSETƒ#TSK2NRDY,TCBSTAT2(A0)†IS�'ON�READY�LIST'�BIT�SET?-‰BNE.S‚READYRŠBRANCH�IF�YES�-�ALREADY�ON�LIST'‰MOVEM.L�A1-A2,-(A7)„SAVE�REGS�ON�STACK8‰LEA„READYHD-TCBREADY,A1…ADDRESS�OF�POINTER�TO�FIRST�TCB"‰OR.Wƒ#$700,SRˆTURN�OFF�INTERRUPTS4‰MOVE.B�TCBRPRI(A0),D0ƒGET�PRIORIT  Y�OF�TASK�TO�READY*%READY2ƒMOVE.L‚A1,A2ŠSAVE�BACK�POINTER'‰MOVE.L‚TCBREADY(A2),A1‚PTR�TO�NEXT�TCB+‰CMP.Lƒ#0,A1‹IS�THERE�ANOTHER�TCB�IN�CHAIN?&‰BEQ.SƒREADY4‰NO�-�ADD�TO�END�OF�CHAIN$‰CMP.BƒTCBRPRI(A1),D0†CHECK�PRIORITY'‰BLS.SƒREADY2ŠGO�BACK�TO�CKECK�NEXT�ONE1READY4ƒMOVE.L‚A1,TCBREADY(A0)‚ADDED�ONE'S�FWD�PTR*‰MOVE.L‚A0,TCBREADY(A2)†BACK'S�NEW�FWD�PTR,READY5ƒMOVEM.L�(A7)+,A1-A2ƒRESTORE�REGISTERSREADYRƒRTE“DONE‰PAGE*?* THE FOLLOWING ARE ALTERNATE ENTRY POINTS TO THE READY ROUTINE*8*‚THESE�ENTRIES�ARE�PROVIDED�SO�THAT�TASK�READY�PRIORITY9*‚CAN�BE�ADJUSTED�BEFORE�A�TASK�IS�PUT�ON�THE�READY�LIST.*B*„THESE�ENTRIES�ARE�INTERNAL�SUBROUTINE�ENTRIES�-�NO�CORRESPONDING1*•TRAP�#0�ENTRIES�ARE�PROVIDED�FOR�EXTERNAL�CALLS*E**********************************************************************6*…SBRYEXT1‚-�CALLED�FROM�EXIT2�(TRAP�#�1�EXIT�ROUTINE)*‰XDEFƒSBRYEXT1SBRYEXT1�EQU„**?*…SBRYEXIR‚-�CALLED�FROM�EXITR�(EXIT�FROM�EXCEPTION�PROCESSING)*‰XDEFƒSBRYEXIRTJ]ISBRYEXIR�EQU„**:*…SBRYTINT‚-�CALLED�FROM�TIMER�INTERRUPT�ROUTINE�(TIMEINT)*‰XDEFƒSBRYTINTSBRYTINT�EQU„**.*…SBRYXMON‚-�CALLED�FROM�EXMON�RETURN�(REXMON)*‰XDEFƒSBRYXMONSBRYXMON�EQU„**5*…SBRYDLAY‚-�CALLED�FROM�RETURN�AFTER�DELAY�(CKDELAY)*‰XDEFƒSBRYDLAYSBRYDLAY�EQU„*I**************************************************************************?*…DECREMENT�READY�PRIORITY‚-�IF�LESS�THAN�CURRENT,�SET�TO�LIMIT*1PRIODECR�MOVE.B�TCBRPRI(A0),D0ˆGET�READY�PRIORITY‰SUB.B‚#2,D0‘DECREMENT�BY�2"‰BCS.S‚PRIOLIMTŽBRANCH�IF�NEGATIVE.‰CMP.B‚TCBCPRI(A0),D0ˆIS�IT�LESS�THAN�CURRENT?‰BCS.S‚PRIOLIMTŽBRANCH�IF�YES)‰MOVE.B�D0,TCBRPRI(A0)ˆSET�READY�PRIORITY+‰BRA„SBREADY�BRANCH�TO�NORMAL�READY�ROUTINEI**************************************************************************3*„SBRYACK‚-�CALLED�FROM�SERVER�ACKNOWLEDGE�(AKRQST)* ‰XDEFƒSBRYACK2SBRYACK‚TST.W‚TCBRTCD(A0)‹IS�THIS�AN�ERROR�RETURN?,‰BNE„PRIODECRŽBRANCH�IF�YES�TO�DECR�PRIORITY*.*„SBRYSTRT�-�CALLED�FROM�TASK�START�(TSKSTART)*‰XDEFƒSBRYSTRTSBRYSTRT�EQU„**(*„SBRYWAKE�-�CALLED�FROM�WAKEUP�AND�WAIT*‰XDEFƒSBRYWAKESBRYWAKE�EQU„****„SBRYASR‚-�CALLED�FROM�ASRINT�AND�WTEVENT* ‰XDEFƒSBRYASR SBRYASR‚EQU„**H**************************************************************************†SET�PRIORITY�TO�LIMIT*1PRIOLIMT�MOVE.B�TCBLPRI(A0),TCBRPRI(A0)‚SET�LIMIT+‰BRA„SBREADY’BRANCH�TO�NORMAL�READY�ROUTINEH*************************************************************************4*„SBRYRELQ�-�CALLED�FROM�RELINQUISH�ROUTINE�(RELINQ)*‰XDEFƒSBRYRELQ3SBRYRELQ�MOVE.B�TCBCPRI(A0),D0‹GET�CURRENT�PRIORITY"‰AND.B‚#$F0,D0’SET�TO�LOWEST�LEVEL)‰MOVE.B�D0,TCBRPRI(A0)‹SET�READY�PRIORITY+‰BRA„SBREADY’BRANCH�TO�NORMAL�READY�ROUTINEG************************************************************************:*ƒSBRYCINT�-�CALLED�FROM�COMMON�INTERRUPT�HANDLER�(COMINT)*‰XDEF‚SBRYCINTSBRYCINT�EQUƒ*+‰BRA„SBREADY’BRANCH�TO�NORMAL�READY�ROUTINE‰ENDK1READY ASYST'EXORMACSREADY SAI!ƒTRAP 0 - PUT TASK ON READY LISTÔ2pREADYHD BSBRYACK PBSBRYEXIR þàB9þà ü>þà9þà è àÁþ3 àü6þàOïNuNu4é  ééééé•'INT REPL AFªªREPL SA³³REPL SY´_=/*†INT.REPL.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN$=/*†FILE�WILL�DEFAULT�TO�INT.REPL.LS=/*=/IFC \1=ARG INT.REPL.LS=/ENDIF=/*)=ASM INT.REPL.SA/&.REPL.SA,REPL,\1;MRZ=66=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDéééé  éé¢**‰ASSEMBLY�OPTIONS�FOR�REPLB* Assemble for I/O with task interrupt handling not under VERSADOS*6VERSADOS‚EQU„0’1�=�ASSEMBLE�FOR�RUNNING�UNDER�VERSADOS-BIOS†EQU„0’1�=�ASSEMBLE�FOR�RUNNING�WITH�BIOS2INT‡EQU„1’1�=�ASSEMBLE�FOR�TASK�INTERRUPT�HANDLING4MMU‡EQU„1’1�=�ASSEMBLE�IF�HAVE�AN�MMU�AND�ASSEMBLING)*§FOR�EITHER�INTERRUPT�OR�STATUS�CHECKINGéééééé« REPLUREP0_ÿÿÿÿ^ÿÿ UÂþˆ NùúBo=|NuN¹4!VCT¾¾ÀÂÄ Ô Ì € �!"`0ŒÞ�Ž�•/ @ç|Jèf B�"x "ˆ!È Fß"_NuJø f@HçÿþAø @ç| g$"@ ‘f!È |øÿ$iQéN’Aø | fÜQø FßLßÿNuPø N�Qø J¸ f¨NurÒx VÒ¸ B"x ,Gé$S g Jªf&’`ŒNu²ªmøa ”²ªmî&’*j--fjª$* Ôª>*g>*g RjÇaÞ* f@* g­,fí-`­ ,g` B­X­,AÕa žfÿfa|`ÿ`HçAP$8 >&68 @HC(HD4<  g 4<8***HB* g2Hçz,* m6a€`NqLß8`Lßp&*HC6‚€4*AÕa8NqLß ‚R�`ÿ|@ç|$©%|ÿÿÿÿ#JFßNuIé L g(@´¬lò%B$€ ŠNu"x ,Aé ?Fü'"HJ‘fNs Q²¨mð°hlê/(?(Bh (RhШ ²€lô!@B€0("((f"�"x , ©#H!|ÿÿÿÿFßNu9 4ga î`*_aœ _N`Lßÿ\�?_f,J¹ gaýžfJ9 [g|øÿa¢AÖa 4`tNs@ç9 4gaFî HçÿþNi/ /9 b oF,hHV/(@À@ÿ?"h 0P*n6` f€\�,_( „!TCBgaÄJ@gÿZ @f AÖa7``ÿJ @fÿBJ�f&HC4<HBAÖa ÀNq`ÿ(HBHA(&64< ‚HB4`àâˆ&T�(,_" �!TCBga`Cð=C^AÖa7J®@gþæ$< ÿÿHCHD6`¤.x Fü aüæMø "NJ© gì|,i 0.,@ÿfæ#n ®-!Î Kî.r?%2 °føB8 [|øÿ1ø T R®-fd.-fh®-fhJ¸ g*n6aú n®ú`þðJngAÖa¤Hzþˆ`>®úHzþÖ`AÖaŽHzþr`JnfB®@ÁAû-oü|úrNuHV,x Hî?ÿ-_8Ni-I<"x =iÿúúNuEø ¦Çìs,)gÇ`"ÂüEø ¦(NGs*r»Îg°$<‡42&26,(gÃáK,$( *,,,p<,.,>, ,"0<2 gB@2g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòa>J²gHç@(AÕa ¤`0Lß raÆ,sf-|çOGB.ûAúþ¶.ˆNuLß,sò Rrì ,NuÇ1G*Bh\è)!| EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†1F,|ð& fa˜Nu1F,X� <1Wú!oü` a aaaaaaaaaa a aaaaNq?/_g/ gºa aþ8 4g @ça ĪT�Kú`ª^Laaaaaaa a aNqNqa Nq`"`6`>?/_gL/ fX�—Ns?/_g0/ gNa"/ fÈ?/ _g/ g&aaýr8 4g @ça $ªT�Kú`  H.ž•â� n2-4.(g^2-,6"’må‰Ü�z n6aÒ`Nq`<"FJ‘g6*8 š�,.<œ… n6a²`Nq`(F-C<&8 8ß¿Ãfú/?,ÿú<<`B† m n-_¸-_¼.)g".Hg a@ nü|Jfüv n,Cø – 1pfHzüf`üÄ=@=|ç�GB.û`üDJFfü>AÖaý¤ Hzþ�Ÿ`új P�` € `úX~$.HffdfLLîÿ`®z,.P n6a Ì`Nq`&~ F&(.T·„f È®Lg-CT`"R‡È®Lggû¶RnX .X°nXbû¦~Hzû `X oBEgaFßüNu.�/,x ½üg*/ f".)g.H8gîH,_"—Ns,_"/8 6Nuaæ$< 4.&.(.8áL<Aî@aÊ`®)Lîÿt®-@&Nuî ,`ùv@çHçp "x ,Gé Fü'$K&g&&C´«fò$“JAj.&©#K'|ÿÿÿÿLßT�NuJAkô&)fT¯`è&C#SFïB«'@ '@'H'BB«BkgëáIAA 7Aa”Ó«Fü'&© #K LßT�NuHøÿÿ@ø!×Ni!ÉH!øL"x :3|•3|µ3| 3|°|`Þ@ç|»ø bgLíÿ !Í b*x HÕÿ8 4ga ÒÝNsNu|ð%a|`øNHøÿÿ1×!ï|LøÿÿNs@ç|JÐkü0ãHâ@S@0€kFßNua>T.ra�Fß.x AÖaÜ`÷üî ,B® (f!NNu*@ - fø+N Nu.&|ð&î-HîÿtHç 8 Kï�� €Poaþâ. ‡ÿIöpGr8ÝU@núLß0€Nu@ç|JÐkü0ãHâ@R@o0€FßNu/ "h!i €0€B© © ,"_FßNu/ x NB�B8 Z 0àIDAÒx XäIÒ¸ BJ8 Zfà _Nu@çè-f0Hç`Cø |(&$I"j ³üg°)&cì!I %H LßNs(&Ue°($e @&`°Jhfæh%&`¢($ð@&`”`’J¸ tf|Hçÿþ!Ï tFï<.x t|9÷0 À÷0.x tLßÿÿB¸ tNsRx \ xd \k$/ "x :3|3|53|.3|>"_Bx \Nsp þÀˆÀÚÀj€nÀLÀ À€$: 0ÀH(¼€@*ž ‚&À&ì%z ‚%n Â,œ,ܼø(fÀ#R Â+È€,¨$€,²8€*À œÀ” ÂŒ<Â,Þ"ØÔР€#L €#D € €¬ €<´°¬¨"X€BˆTÀ”�Œ €$n, ¶ÀŒ€tìÁÀÊ À!> Àê ÀZ ÀXT>€#†€´€HçÀÀ x :| x NPø Z(( B�28 VÓ¸ B 8 B€&\k:R¸ >!À B <&\"x ,@ç| i "g‘¨ P`ôFß i"g‘¨ P`ô"x ,J© g0/@'ÿ@ "8 BaòæLß8 4gaòÿJx Tg Sx RnPø [`óRfNsT� €%bû�Ѐ0;"Nû �%cT—Nu/Ò�2; Aû"Nuûhüü¦ý&|P”˜,`ÀBûÖˆÞ~ ®öä÷"+v˜èœxüâ ~òf&ÆûhòNú¼ÿäð¦ñ?_fóKøIøB§$I"x fFJQk$¶1@f&i OJ�g·Øg`öHSAëaùla”Cé QÿÿfÎB„ g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu g@î-|ð&Aí-H”|0ãHâ@S@lü0€aù(�Fü AÖaùða‚`ñ R„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øö`ðNÑ g  iµèl”µém˜fÿNJQk’*iHUAíaø gþðáŠ&J×ÂàŠ(@°Šnþà ,áˆÐŒ°Šn fè`þ̰‹gþˆn gþ¼�Šàˆ$`þt&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þJCé QÿÿfÿPgþ¸&JB„`þLaöðHç $nLß0T—Nu$H"x ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé QÿÿfÐ`ÀCøAía÷2&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÷&`îCé QÿÿfÜAía÷Lß0NuT—`îHçÀ@ç&x 0|*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o Uïÿb+o aöð+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` NNu gø"(g.(f".°®f²®gÚ"x ³üg°©f²©g"i`æT— INu`††ÿÿÿB€&àŽ(o8؃S„àŒB…:(J0Pg¼pPe¼pPb¸pPbÜpPáŽÜNu Q… E lÔ*T—T—,Nu$x ( gTB€0lTD@°jnLS€Àü Eò4,f^Jªf8g .(f‚z,, n6aÿ\`$Nqn NuXnNuZnNu\nNun Nu%FBó5B$®NuJªgÚ .°’g.(gÐBªNu"x f$x jB‡B‚, Jlf„J1 g\nNu~Gòp·êmZnNuJ«g‡`â6üN¹Aúêp&Èz,, m6aþ¬` Nqn Nu6‚'M'l 'l ‡ Žü‡ í)GëÿúåŠ B ‹Nu1 g"S‡ÎüP‡Gòp k (°®g.(f=|NuGë,fÿx,f=|Nua0Nu"x f$x j~Gòp·êl¹ëf GëB‚4a ‡`ÞNuAúéF&åŠ B ƒäŠB1 B«Nu*n6., AÕaüÄ`^n`Ò<5P$0@0f22, A0g ŒA g& f.(fn `œn`¾\n`¸,g†, gÆ"�$. uP aûÎ`±üf Zn`R\n`L�uP$!uP  ‚1A1| Bƒ65PÖuPá‹!C 65P–uPRC1C3@1| , gè NuJ¬6g*l6B…:-5P$gabQ… E lî,)gP"x Ké>)gB,,Jm g.¼•f*­ Jm f0-@ fB�2- m aùf`aðNÛüSGfÂNuB„,)gÄ `–>, fz,, n6aüF` Nqn Nu$F,g"z,, m6aü"`"` JEgJ0Ðf^nNu., m6aúþ``êB€00P, f8ÐpPáˆ%@B€$°P 5pP$ª00Páˆ%@B€00Páˆÿ%@ Nuáˆ-@ Nu»Îg -,fn NuZn`r\n`jB¸ b., m6aúx`æJ…gÚ0, 2,A'ÿg� f  gÁÁÁ� B‡,,g�  gB†.8 vΆެÞ¸ vθ zà�"Ff�fAø pfRˆ-(fTˆHG>G‡ÿ?HG Gaõn`.S€g^n`®Pn`ön /fè"AÓa÷š`Þaî‚&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$T�Nu., 8,(M¹Îg,,f n NuB¸ b*l6AÕaøò`^n`´J¬@g ,<àˆ°uPe°uPb n `’05P$@0g@$,25P$ uP aø.`aí|<(SFÜuP;†PSh B†<(  g†1F JFf.05P$@ f$B€05PÐuPáˆB�25P’uPR� @aö<`aí$aíŠBµP BuP$B5P'BuPS-Nu*NB¸ b` »Îfn Nu$-2, l a÷’`^n`ÜZn`Ôn `ô\n`î&H$m6.+AÒa÷à`èJ…gÔB…:+á�, gº¬d n`�*,…ÿ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 fJ1 n=|NuBƒ,g Co=| Nuá‹à Hz@çåŠ B/?8 5gaõèîNs8 5gaõØÝNu&MB¸ b*n6., AÕaö´`^n`ZJ®@g .<àH°uPe°uPbn `ÜVn`Ö·Îgö"E$F.* k6aöp` J…fZn`\n`ö* ,**fB†<5P* gÜuPáŽB€05P�uP$R@*á�a÷(` `J…f aêîn `ªJ0Pfò"( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gÃÃ1ƒP$1¼Pg1¼PBµ@ Bµ@$Bµ@Bµ@S-R(20PÒpPá‰-A ÉEaê¾ËD g$$.´«g pP "(Kaôâ`aê0&L$+ ‚Nu,,`*"-6g*,,, Aaö8`` J…gJ0Pfn Nu.Aì aõÒ`^nNu.(f((gn Nu"(6g*,,, Aaõä`` J…gJ0Pfn NuHzÿ¢?,--gGÿg­-g- ,gSs­-f­ ,Ss3g³ gAóaéúgl û g+l  g+l  g- ,fAÕaêxNu gí,Nu gÜí ,NuJ­@g\n`h&, ƒÿà‹HC8 nHC Caîþ`Pn`F&H&¼!ASQl«l 'l'l Aë('H'H'H"áŠÔ‹'BBk&+K@Nu&L(m@ fXn`Þ,fn`ìz,+ n6aóð` Nqn `Ò"FB�,+ Ü�àŽ¼pPbä �c6B…,B‡ fY‡+gX� ‡fP†P�P…B€,¼€cn`X($KaÐ`Zn`H(m@ JÄ(gÇÇtU„a0(g tEèaY„J…g $EîaQ„$I$gaaÆNu6Ú·ìe&lUBnðNu(N¬-J¬@g l@B¬@"(’ˆ�ÿà�aïÚ`aæÂNu(n@ fXnNuJl&f~`*lB‡-gY‡*, n6aò¶` Nqn Nu&F GfBSNuT�‚gX�»ìe›ìÛìÇÂn`6Ý»ìe*lUGnð. R‡‡¾¬e.,@ç|)GSl&Fß&F f$k'jJ+g+g7|NuB€00PR@ÐpPሀ�‹B‡+°‡l.oÔ|G*,+g7|Nu j6añÚ`"``êàŽÜpPáŽÜ>0PR‡á�žƒ|GB‡+*FGë6ÝU‡núNu(n@ fXn`$ . ?,ø€_@Jl&gKÖaNu--f°, g˜", l(gTˆ±ìe l2HA±ìe l2J�kL"Az, m6añ`Nq`8)I,- �&\e�&\R€HÔNu&F- ,fm NuzNaÿŒ(FCí0<"ÜS@fú+mt+m ”+\ü0-H+\H-Hø�-H@ûNuAÖaß.Nu¨ ,fn NuaÞºNu&L- ,fm Nuzaÿ(F­ú+lP+lT+l L+lXBmX-H8�-HJg:íú.-Hg*z,-P m6aèÖ` NqnNs†(Ff+TT­ ,0-,@ÿfAÕaÞTNu$, 6,|B„g(,n=|NuB… g *,fÆaݶCÀg*B†6, gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x ,Eé&J$S gŒJªf&’aÒÊ`ê»êfâ*fÚJ†kºªfÐ&’J†f$%M%D %lBj%EÃ5CaÒ¤NuRFCf* gêªêaÒ|J†kÿ~NuaÒTJ†kÿrNuJ†f @ç| )g $@#RFß`ˆ=|FßNuSFn=|Nu&Fz`aýL(FCí0<(ÙS@fú(íü8íú -H€ÿÿÿ(À(í,0-H@ø8À(íP(íT(íL(íXNu*H(n@zB, gz.,.< n6aæü` Nq><€™AÖaÖxß®<&F, fLÛÿHîÿLÛHî 2Aÿ/gÁ=Aú/[(n@ g gì Jl&gKÖaõ$Nu>,.(f‡J”gz, n6aæn` Nqn NuJ®@fXnNu,‚Eø –J2 g\n`:¼ Eø ¦Äü%Ž %® 5¼ B² %” Br 5‡ 2` ò Nu.(f((gn Nu,°(%cB® h%#n Nu@$@&NuBG`><&,"x $0àH°i lB(¸±0f:Jq0 g4 10f ¾10g,‡0Jq0 j&10JGg Añ0aÙÚNuAñ0aÚvNu^nNun Nu,*H"y 0 g i‘É*$ n6aå8` Nqn Nu$F&äŠ$ÙS‚fú$F(M"y 0&Q—ÉÙË$ÌÛÃ$ÍNu.(fn NuLÜ.<&\²‡e’‡R€`ö&(@ç|–¸ B˜¸ >!À >!Á B׸ FÙ¸ JFßB§"x ,Eé&J$S g@*g2&’$—.Š*fä * gÞ²ªn ‘ª²ªgÎmôѪ²ªnö`Àת`¸.g$G$*.aÏ.J‡fðNu=| . €Kª{ûfDJnpg x :(f2 x ‘ü, z n6aä```*FB®LîÿN•B¸ b,x Nuî ,NuJ”f@",g.(f".*y »üg(²­f-(f ½Ígí-gD*m`ØAÔaãf` B® VnNu*H½Íg-(g.(fn Nuí-g\nNu0,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Ø2FßNuî)=H*fî*.(g . (gaÖf.-g`$.)fÚ=H*=n,.î--n°-n´(N"x ,Eé&J g$@¹êfò&’aÌü`ì,)gaä ,Tg @B¨!x :!È :&,(,ì)"x )-f2¸©f¬),)g) ,g¶©@f¸©Df ><@AÑaÑb"i f¾,)gaôNqaö®,)gaõø~Cø –Eø ¦"Âü 1pf2g/aÏö., ,gaÕ¼R‡ ‡oÄaîVaä‚J¬gH4<HB4,&,8,HD8,°*,²<,¶HF<<.,*>,\,)g<<$LAìaÚêNq(JCø )g¹Àg"@`ò#laÕ>B¸ rAÔaÝÚNuaÔÂ(-gn -hp =h("NuIëÿþ6<€`&LLìpHF>,6.(BAÓaàh``0<`,B€8 oH@0< @aÛ `0<`*H4<B˜QÊÿü+S +fgJ€f  `<.p .;Fp+@aæBfDÿ;D(+El+EüHD0àHgfJg¸.%c.%D%°c@$@&*¼!TCB|€,;|:|úr;|0$MÕü`+J6$¼!TST|5|$5|D x  -"-±üg °¨f²¨g h`ærAÕaÜ|0<`aÓÊ`0<` +x !Í Nuf=@NuT—Nufg2 .".` ", , g.(g J�g` .".+@+ANu.(fn Nu*<,, n6aß` Nqn Nu,fnNu&Fp&ÝQÈÿüNu@ç, gzR` ,gz,. n6aÞ¼` NqTnFßNuJ”f6".*y »üg,²­f-(f-,g-.fD*m`ÔAÔaÞ(` B® Vn`°*H½Íg-(g.(fn `’-,f \n`„-m -.f`>,aþº+mlü|úr- (gDz,-ü m6aÞ` Nqn `ÿ@+Fü:(0P$g00PÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­,0-,@ßfF×AÕaÓT`þÔ@ç FJ�f8".*x »üg.²­f-(f½Íg--fí,gL*m`ÐaÜú` B® VnFßNu*H--fê½Íg-(g.(fn `Öí,g\n`È;m,.-m |­-gCø  I"h ³üg ³Ífî!i `’î,®-fNu®,=n^Bn^AÖaÒnNu-n Hî)Nu-n Lî)Nu»Î`ø [¨,g( (Xg "@B©B¨X1h^g 1|Bh^aÒNuè-Nu(n@ fXn`4î ,.-g® ,AÖaÑæ`ìì Jl&gKÖaê–Nu,fz. n6aÛì`NqpaX$F"*fp aJAø ŠAø ŠaÐ0Gø "SJ“g²©gÒGé`ì f¸, n6B…*ç�EaÛ’`Nq`¢B€* e c @dpËa„r Âj A fp ar"x fJ1gj°*f¦ *ÿg Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*²sPdpÏa ²sPd pÏaR`NQ…lâp Àjf$ * @fRˆ/<Hª? *(SJ“fp a¤Gì°¬fì*,Ig°,(gp a„ ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aÔÊ` LßpaÿHLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLê?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@D&j ×Ó#K )ÿf#|NP*géI*géH`R*fbB€*&x fJ3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #K)I`#K&iD3|N¹J#|OLIéJ&ŒB€* x f¼ÿ iÑè*I/N�,_`t`Zp aøp aôpað g@o opÁaÜ n6B€S&@B… f )e2 )c )€e" )�b;°g,aØ’` Nq`¢×ËGû°ÖÓNÓÿþ Ì¢Úð *a²f´ © ©HfX")D(A&TGëÿ¶ `&lJ¬fa̰‹g(K`ê¹Áf&J«g((k)|N¹J)|OLIìJ&kD&Œ` )k`B�)(&iD&¼¾&x fB3Iø  &TJ”fa˦°‹gIë`ì(«Aø ŠaÌÌ IraÔš`8aË€p�az&Iaî"Kfpal)Hgp‚a`)IgpƒaT)Ig .(gþ†)Igp a6 )c )c )€e )�c*g< * d pÆa˜`”j :#j +HPAø ŠaÊÚ mÑè/N�,_J@g>a, )AîDJ�g"P°©gAé `îF€NuB�Aø ŠaÊœ X�=@`Aø ŠaÊŠB€B®Nu,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ÒZîFßHç€Ä*oKíÿ°"m/ N‘*_e -g*@`êLß#X�`¿ 8 5gaÒîHç€Ä 8 g*@ m ( g / @çN°Fß*_ -`àLß#`¿bAùPpNAg` DATAÜ,HpnU€BXS€fú-ApAÖ"HB™B™BY2ü $I&I"üREP0"üPB‘NAfÄ$üDATA$ŽpNAf´-|nCî<"üTASK"ü NUM"üBER "ü S"üTART2ü "üTASK"ü NUM"üBER "ü T"üERMI"üNATE2¼ =| lOîÜ..na:Cî ¼!UDRáŠ]‚„ü 1BB¸ 0$:Žg2 BpN@`aê!È 0aEè ŠáŠQ‚„üÄüÔŠ!B1ú` 4!ü –aÀJ¸ fœB¸ GúœCë <€pN@`ad4+;B,g +x  !Í EëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†a¢.x 2<ÀaD/:†NuHVMù,¯@îFü'MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈB†-½ÈnúNu0<`0<�F虀2<é™"x :Cé2�A02�2€@02€Nua&a°‹fa†a|°�faÿ|Cí!É aÂazNuB€Aú$°Pgaÿ^B‡EЇ Eê Rÿÿfð‡#à�*(B(:¢º„c*„ÿBKúûû" B*AMú,Bœ�°ºrf†` (< �B*DB†º„baþöNu hÿÿ g,a2 ÿfaN`aðJga$`a@°‹ga¾a`Ì3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baþ�Nu•ÊB�B‚BƒIÕKõhHz ?þàB9þà ü>þà9þà è àÁþàü6þàOïNuNuSS P þ þ þà@ þˆÿÿ'M146818 RDTIMER AF  RDTIMER SA))&RDTIMER RO22TIMEINT AF;;TIMEINT SADD qTIMEINT ROUUSTDTIM RO^^TRACER ROgg /=/*†RDTIMER.AFŠFOR�M146818�REAL�TIME�CLOCK�CHIP=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�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=/*}=/*=ENDéééééé‰PAGE**ˆINCLUDE�FILES**ˆEQUSTR‰NOLIST‰INCLUDE�9995.&.STR.EQ‰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,SBRDTIM ‰XREF.S�TINTFLAG,TIMEOD,TIMINTV4*SBRDTIM‚DS.W„0ŒSUBROUTINE�ENTRYRDTIMERRDTIM1$‰CLR.BƒTINTFLAG…CLEAR�INTERRUPT�FLAG'‰MOVE.L‚TIMEOD,D1„TIMEOD�=�MILLISECONDS/‰MOVE.L‚#1000,D0…1000�-�TIMINTV4�=�MICROSECONDS‰SUB.WƒTIMINTV4,D0‚MICROSECONDS$‰TST.BƒTINTFLAG…DID�INTERRUPT�OCCUR? ‰BNE…RDTIM1‡IF�YES�-�DO�IT�AGAIN‰RTS‰ENDééé é!'[1RDTIMER ASYST'M146818 RDTIMER SA!ƒREAD TIMER routine for M146818 real time clock.E2BRDTIMER pTIMINTV4 BSBRDTIM pTIMEOD pTINTFLAG " 3P B8 "8  <è�x J8 fèNu4ééééééé*=/*†M146818.TIMEINT.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN#=/*†FILE�WILL�DEFAULT�TO�TIMEINT.LS=/*=/IFC \1=ARG M146818.TIMEINT.LS=/ENDIF=/*5=ASM M146818.TIMEINT.SA,M146818.TIMEINT.RO,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9999.M146818.M146818.EQ=/*ƒ9995.&.PAT.EQ=/*}=/*=ENDééé ééé3‰PAGE**ˆINCLUDE�FILES**ˆINCLUDE�9995.&.STR.EQ!*ˆINCLUDE�9999.M146818.M146818.EQ*ˆINCLUDE�9995.&.PAT.EQ*‰INCLUDE�9995.&.STR.EQ ‰INCLUDE�9999.M146818.M146818.EQ‰INCLUDE�9995.&.PAT.EQ‰PAGE?TIMEINT‚IDNTƒ5,1…TIMER�INTERRUPT�HANDLER�FOR�M146818�CLOCK�CHIP*$*‰COPYRIGHTED�1983�BY�MOTOROLA,�INC.*.*†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�15.625�MS**•01/18/83‚(SFF5)*•04/07/83‚(7616)*:*•08/15/83‚Steve�Franck�--�Changed�to�exit�through�COMINT.*‰SECTION�LEVEL00* ‰XDEF„TIMEINT4‰XREF.S‚TINTFLAG,PTMADDR,TIMEOD,DATE,SVSTATE,COMINTZ9‰XREF.S‚TIMESLIC,TIMEOUT,TMSGFLAG,PATBEG,TIMINTV,TIMINTV4‰XREF.S‚TRACER,TRACFLAG,CKEXPA**0TIMEINT‚MOVEM.L�D0-D1/A0-A1,-(A7)‡SAVE�REGISTERS ‰MOVE.L‚PTMADDR,A0ˆTIMER�ADDRESS3ŠST…TINTFLAG‹Set�flag�to�indicate�that�the�time�has$*§changed.‚If�we�interrupted�someone&*§who�is�reading�the�time,�he�can�tell%*§that�he's�got�garbage�by�looking�at *§this�flag.6‰MOVE.B‚REGC(A0),D0…READ�REGC�TO�CLEAR�TIMER�INTERRUPTTIMEIA)‰ADD.Lƒ#15,TIMEOD†TIMEOD�=�TIMEOD�+�15�MS.‰SUB.Wƒ#625,TIMINTV4ƒ625�usec�HAVE�ALSO�PASSED'‰BGT.SƒTIMEIBŠBRANCH�IF�NO�EXTRA�MS�YET&‰ADD.Lƒ#1,TIMEOD‡ELSE�ADD�THE�EXTRA�MS(‰ADD.Wƒ#1000,TIMINTV4‚AND�RESET�US�COUNTTIMEIB!‰MOVE.L‚TIMEOD,D0ˆGET�TIME�OF�DAY-‰SUB.Lƒ#24*60*60*1000,D0‚IS�IT�PAST�MIDNIGHT?‰BMI.SƒTIMEI4‹BRANCH�IF�NO**…MIDNIGHT�ADJUSTMENTS*‰ADD.Lƒ#1,DATEŽINCREMENT�DATE‰MOVE.L‚D0,TIMEODŒSAVE�TOD"‰MOVE.L‚#24*60*60*1000,D0„24�HOURS4‰MOVE.L‚PATBEG,A1ŒSTART�OF�PERIODIC�ACTIVATION�TABLE%‰MOVE.W‚SR,-(A7)�SAVE�STATUS�REGISTER!‰OR.W„#$700,SR�INHIBIT�INTERRUPTS)‰MOVE.L‚PATEHDR(A1),A0‡START�OF�EXEC�LIST%TIMEI1ƒMOVE.L‚A0,D1�TEST�FOR�NO�ENTRY+‰BEQ.SƒTIMEI2�BRANCH�IF�ALL�ENTRIES�CHANGED+‰SUB.LƒD0,PATTIME(A0)‡ADJUST�FOR�DAY�CHANGE,‰MOVE.L‚PATNEXT(A0),A0‡GET�NEXT�ENTRY�IN�PAT"‰BRA…TIMEI1�GO�BACK�FOR�NEXT�ENTRY'TIMEI2ƒMOVE.W‚(A7)+,SR�ALLOW�INTERRUPTS)‰MOVE.L‚PATTHDR(A1),A0‡START�OF�TASK�LIST%TIMEI3ƒMOVE.L‚A0,D1�TEST�FOR�NO�ENTRY+‰BEQ.SƒTIMEI4�BRANCH�IF�ALL�ENTRIES�CHANGED<DE.+‰SUB.LƒD0,PATTIME(A0)‡ADJUST�FOR�DAY�CHANGE,‰MOVE.L‚PATNEXT(A0),A0‡GET�NEXT�ENTRY�IN�PAT!‰BRA…TIMEI3�GO�BACK�FOR�NEXT�TASK*6*ˆCHECK�FOR�ANY�EXEC�PROCEDURES�WAITING�FOR�ACTIVATION*:TIMEI4ƒMOVE.L„PATBEG,A1‹START�OF�PERIODIC�ACTIVATION�TABLE*‰TST.L…PATEHDR(A1)‰ANY�PROCEDURES�WAITING?‰BEQ.S…TIMEI12�BRANCH�IF�NO%‰MOVE.W„16(A7),D0‹GET�SR�AT�INTERRUPT&‰AND.W…#$27FF,D0‹GET�RID�OF�EXTRA�BITS#‰OR.W†#$2000,D0‹BE�SURE�SUPR�IS�SET‰MOVE.L„TIMEOD,D1‹GET�TOD.‰MOVE.W„#$0084,-(A7)ˆPUSH�VOR�FOR�EVENTUAL�RTE(‰BSR‡CKEXPAŽGO�TEST�ALL�PAT�EXEC�ENTRIES***†RESTORE�REGISTERS�AND�TRACE�IF�REQUESTED*3TIMEI12‚MOVEM.L‚(A7)+,D0-D1/A0-A1„RESTORE�REGISTERS&‰BTST„#TRCFTIMR,TRACFLAG„TRACE�WANTED?ŠIF…�THEN.SŠBSR„TRACER�CALL�TRACE�ROUTINE ŠDC.Wƒ$F F13ŠENDI *G*‚Check�to�see�whether�this�tic�represents�the�end�of�the�timeslice�for*‚the�running�task,�and�exit.*7ŠTST„TIMESLIC‹If�we're�supposed�to�be�doing�timeslicing9ŠIF…�THEN.Sˆ(i.e.,�if�tics/timeslice�parameter�<>�0), .ŠSUB„#1,TIMEOUT‰decrement�the�timeout�counter.'ŠIF…�THEN.SˆIf�it�is�0�or�negative,5ŠST…TMSGFLAG‹set�the�flag�that�will�cause�a�dispatch.ŠENDI–* ŠENDI–* 2ŠBRA.L‚COMINTZŒEither�way,�exit�through�the�common*§interrupt�handler.    ‰ENDééZ1TIMEINT ASYST'M146818 TIMEINT SA !ƒTIMER INTERRUPT HANDLER FOR M146818 CLOCK CHIPº2pPTMADDR pCOMINTZ pDATE pTIMESLIC BTIMEINT pTIMEOUT pTIMINTV pTIMINTV4 pCKEXPA pTRACER pPATBEG pTIMEOD pTRACFLAG pTINTFLAG pSVSTATE pTMSGFLAG "¸F3J HçÀÀ x Pø (¸ xq n R¸ xè  8 €&\k:R¸ !À  3" �!TCBgaBþêCð=C^AÖaBþÜJ®@gþæ$< ÿÿHCHD6`¤4ééééé‡<1DISPATCH ASREL'M68XXX DISPATCHSA3R „68000 DISPATCHERù2pLOADMMU pREADYHD pSBRYEXIR pTIMESLIC pSBRYEXT1 BEXIT0 ZBEXIT1 jpTIMEOUT BEXIT2 ppTERM BEXITI ŒBEXITIR †pTRACER pRUNNER pBKG_HEAD BDISPATCH BEXITABLE PpTRACFLAG pEXCSTACK pBKG_DISP A2pCKDELAY pMMUHERE BSVSTATE °pSBLOGPHY pTMSGFLAG "ÒI3E.x Fü aAöMø!ô"NJ© gì|,i 0.,@ÿfæ#n ®-!Î Kî.H30Br?%2 °føB8 !|øÿ1ø  ®-fd.-fh®-fhJ¸ g*n6aA„ nO3 ®ú`þðJngAÖaBþŒHzþˆ`>®úI3 HzþÖ`AÖaBþvHzþr`JnfB®@ÁAû-oü|úrNuHV,x Hî?ÿ-_83Ni-I<"x =iÿúúNu4éééé �Q1EXCEPT ASREL'M68XXX EXCEPT SA4A „68000 USER TRAP AND EXCEPTION HANDLERú2pMMUFAULT pTIAT BPROGINT2 bBPROGINT3 dBPROGINT4 fBPROGINT5 hBPROGINT6 jBPROGINT7 lBPROGINT8 nBPROGINT9 xBPROGINTA pBPROGINTB rpSVXSTAK pSBQEVNTN pEXITI pEXITIR pTRACER pKILLER pRUNNER ÷2pISRERR BTRPVCT2 BTRPVCT3 pDISPATCH BTRPVCT4 pTRACFLAG BTRPVCT5 BTRPVCT6 BTRPVCT7 pEXCSTACK BTRPVCT8 BTRPVCT9 BCKEXMON àpMACSTRC BTRPVCTA BTRPVCTB BTRPVCTC pSBEXABRT T2BTRPVCTD pSVSTATE BTRPVCTE BTRPVCTF pEQDQ pSBLOGPHY "*J3 a aaaaaaaaaa a aaaaNq?/_g/ gºaAÈaA Ä8I3D g @çaA¶ªT�Kú`ª)Laaaaaaa a aNqNqa Nq`"`6I3 `>?/_gL/ fX�—Ns?/_g0/ gNaBÿJ/ fÈP3ˆ ?/ _g/ g&aBÿ(aB ÿ$8 g @çaBÿªT�Kú` )DH.ž•I3€â� n2-4.(g^2-,6"’må‰Ü�z n6aB"þÌ`Nq`<"FJ‘g6*8I3€€€ š�,.<œ… n6aB"þ¬`Nq`(F-C<&8 8ß¿Ãfú/?,ÿú<<`B† m L3$ n-_¸-_¼.)g".Hg a@ nBþXJfBþR n,Cø  1pfHzX3 H Bþ<`B!þ8=@=|ç�GB.û`Bþ JFfBþAÖaBþ Hzþ�Ÿ`Bþ P�` €M3  )D`Býö~$.HffdfLLîÿ`®z,.P n6aB"ýÆ`Nq`&~ FO3 &(.T·„f È®Lg-CT`"R‡È®LggBý’RnX .X°nXbBý‚~HzBý|I3`X oBEgaBýnßüNu.�/,x ½üg*/ f".)g.H8gL3îH,_"—Ns,_"/8 NuaBý$< 4.&.(.8áL<Aî@aBüü-3@`®)Lîÿt®-@&Nuî ,`BüØ4é™K1PVSEM ASREL'M68XXX PVSEM SA5F „68000 TRAP 0--SEMAPHORE ROUTINEŒ2pSBREADY BSBP BSVXSTAK ZBPSEM4 BSBV ¦BVSEM4 ¦pKILLER BPSWAIT 6pDISPATCH pEXCSTACK "âJ3 @ç|JÐkü0ãHâ@S@0€kFßNua>T.ra�Fß.x AÖaAÐ`AÌî ,B® F3 (f!NNu*@ - fø+N Nu.&|ð&î-HîÿtHç 8 Kï�� €I3PoaBÿx. ‡ÿIöpGr8ÝU@núLß0€Nu@ç|JÐkü0ãHâ@R@o0€FßNu(3/ "h!i €0€B© © ,"_FßNu4éééé éé¢V1SINT ASREL'M68XXX SINT SA6! „68000 DIRECTIVE--SIMULATE INTERRUPT TO ISR62pVCTUBGN ESINT pTRACER pTRACFLAG %bF3B‚,"x J1 n=|NuBƒ,g Co=| Nuá‹à Hz@çåŠ B/.3?8!gaA´îNs8!gaA¤ÝNu4éééééé«W1SUPER ASREL'M68XXX SUPER SA6R „M68000 DIRECTIVE--SWITCH TO SUPERVISOR MODEL2pMMULOAD pRUNNER pPANEL FSUPER pEXCSTACK pSBLOGPHY &XH3=| . €Kª{ûfDJnpg x (f2 x ‘ü, z n6aAÈ```3 *FB®LîÿN•B¸ ,x Nu4éé éééé´N1TRAP1 ASREL'M68XXX TRAP1 SA8  „68000 INVOKE RMS TRAP 1 DIRECTIVESØ2pSBGETTCB BT1NULLR  pT1PARBLK pT1TRGTSK pEXIT2 BTRAP1 BTRAP1B HpTRACER pENDTAB1 pTABLE1 pRUNNER pUDRBEG pISRRTE pEXITABLE pTRACFLAG pCKEXMON pSVSTATE pSBLOGPHY "N3 ?_fAøaAô=n\8 gaAâÿ.)g".Hg~aAÈ=@|J3Bn€ÿÿJ@kZåˆ €Iün¦Eù(ÕÀ4*? g0B…, n6aA‚`NqK3@HTn`d(F gAÔaBÿj`Vn`N*HÔÒHy*îNÒ$x $ gND@°jnFS€Àü EòH3€@Jªg6*f"²®f&?*$jHy*î@çNÒ0€ãˆAù(Nð=|`3€Bþö=|Ns4ééééé½'M68010 M68010 SAÒÒTRAP0 AFÛÛTRAP0 ROääCOMINT ROííDISPATCHROööEXCEPT ROÿÿPVSEM ROSINT ROSUPER ROTRAP1 RO##  ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68010‚Type�of�processoréééééééÊ=/*†TRAP0.AFŒFOR�M68010=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN!=/*†FILE�WILL�DEFAULT�TO�TRAP0.LS=/*=/IFC \1=ARG :.M68010.TRAP0.LS=/ENDIF=/*<=ASM :.M68010.M68010/:.M68XXX.TRAP0,:.M68010.TRAP0,\1;RZ=046=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*}=/*=ENDééé éééÓL1TRAP0 ASYST'M68XXX TRAP0 SAR!ƒ68010 TRAP #0 handler and table.ÿ2pKILLERT0 pEXQEVNTI pEXQEVNTN pEXQEVNTT pCALL_GUA pRDTIMER BTRAP0 pADDPA pPSEM4 PHI_DIR_N %pWAKEUPX pEXEQDQ pVSEM4 pEXABRT pFREEPA pLOGPHY BTABLE0 BpGETTCB pASRINT pDSEGX pDSEMX pGTXTCB Á2pEXRQPA pTCBCR pPAUSE pDIOVX pDMONX pREADY pDSRVX pDASQX pPAGEFREE pBKG_SCHE pFNDGSEG pFNDTSEG pPAGEALLE pPAGEALOC pFNDUSEM pLOGPHYO pUPDTASQ "ŽH3fNsT�?o>Ÿ €%bAæÐ€0;"Nû �%cT—Nu/Ò�2; Aû"„3ÿÿÿNuA¾A¾A¾A)¾A1¾A,¾A¾A/¾A¾A.¾A ¾A¾A2¾A#¾A&¾A*¾A"¾A+¾A!¾A¾A(¾A¾A¾A¾A¾A4¾A3¾A0¾A¾A'¾A¾ 3öA%¾A¾A¾A$¾ÿäA-¾A¾4ééééÜK1COMINT ASREL'M68XXX COMINT SA8P „68010 common interrupt handler.ü2pLOADMMU pLOADMMUI pPTMADDR pMMULOAD pSBRYCINT BCOMINTZ "pIOVCTBGN pVCTUBGN pSBWAKEUP pSBQEVNTI pEXITI pTRACER pKILLER BCOMINT pRUNNER BISRERR BISRRTE  pBKG_HEAD pTRACFLAG pBKG_DISP BCOMNISR X2pSVSTATE pTMSGFLAG "DL3$ „9(gaAôî`*_aAê _N`Lßÿ\�?_f,J¹(gaA ÌfJ9("g|N3% øÿaA!¶AÖaA°`A¬Ns@ç9 (gaAšî HçÿþNi/ /9( oF,hHV?<„/(L3 @À@ÿ?"h 0P*n6`Bÿb fÿ|P�,_( „!TCBgaBÿHJ@gÿT @f AÖaL3€€Bÿ6`ÿD @fÿ®ú`þðJngAÖaBþˆHzþ„`I3>®úHzþÖ`AÖaBþrHzþn`JnfB®@ÁAû-oü|úrNuHV,x Hî?ÿ3-_8Ni-I<"x =iÿøúNu4ééééîQ1EXCEPT ASREL'M68XXX EXCEPT SA@3 „68010 USER TRAP AND EXCEPTION HANDLERú2pMMUFAULT pTIAT BPROGINT2 bBPROGINT3 dBPROGINT4 fBPROGINT5 hBPROGINT6 jBPROGINT7 lBPROGINT8 nBPROGINT9 xBPROGINTA pBPROGINTB r pSVXSTAK pSBQEVNTN pEXITI pEXITIR pTRACER pKILLER pRUNNER ÷2pISRERR BTRPVCT2 BTRPVCT3 pDISPATCH BTRPVCT4 pTRACFLAG BTRPVCT5 BTRPVCT6 BTRPVCT7 pEXCSTACK BTRPVCT8 BTRPVCT9 BCKEXMON HpMACSTRC BTRPVCTA BTRPVCTB BTRPVCTC pSBEXABRT T2BTRPVCTD pSVSTATE BTRPVCTE BTRPVCTF pEQDQ pSBLOGPHY "’J3 a aaaaaaaaaa a aaaaNq?/_g/ g"aAÈaA Ä8I3D g @çaA¶ªT�Kú`)LaaTaaaaa a aNqNqanNq`†/I3faBÿv?o ?/_gL/ f X�—O3Ns?/_g0/ gRaBþæ/ fÌ?/ _g/ g*aBþÄaB þÀJ3"8 g @çaBþ²ªT�Kú` )DH.ž•â� n2-4.(gb2-,6L3 "’må‰Ü�z n6aB"þh`Nq`@"FJ‘g:*8 U…š�,.<œ… n6aB"þF`Nq`(FF3-C<&8 Uƒ8ß¿Ãfú/?,ÿú<<`B† m n-_¸-_¼.)g".HR3B g a@ nBýðJfBýê n,Cø  1pfHzBýÔ`B!ýÐ=@=|ç�GB.V3$‚ û`Bý¸JFfBý²AÖaBý¬ Hzý¨�Ÿ`Bý  P�` €)D`BýŽ~$.HffdI3fLLîÿ`®z,.P n6aB"ý^`Nq`&~ F&(.T·„f È®Lg-CTR3€� `"R‡È®LggBý*RnX .X°nXbBý~HzBý`X oBEgaBýßüNu.�F3 /,x ½üg*/ f".)g.H8gîH,_"—Ns,_"/8 L3 NuaBü¶$< 4.&.(.8áL<Aî@aBü”`®)Lîÿt®-@&3Nuî ,`Büp4é÷K1PVSEM ASREL'M68XXX PVSEM SAA9 „68010 TRAP 0--SEMAPHORE ROUTINEŒ2pSBREADY BSBP BSVXSTAK ZBPSEM4 BSBV ªBVSEM4 ªpKILLER BPSWAIT 6pDISPATCH pEXCSTACK "æJ3 @ç|JÐkü0ãHâ@S@0€kFßNua>T.ra�Fß.x AÖaAÐ`AÌî ,B® F3 (f!NNu*@ - fø+N Nu.&|ð&î-HîÿtHç 8 U€Kï��I3 €PoaBÿv. T‡‡ÿIöpGr8ÝU@núLß0€Nu@ç|JÐkü0ãHâ@R@o0€,3FßNu/ "h!i €0€B© © ,"_FßNu4éééééé V1SINT ASREL'M68XXX SINT SAB „68010 DIRECTIVE--SIMULATE INTERRUPT TO ISR62pVCTUBGN ESINT pTRACER pTRACFLAG %jF3B‚,"x J1 n=|NuBƒ,g Co=| Nuá‹à ?<„Hz @ç?<63! „åŠ B/?8!gaA¬îNs8!gaAœÝNu4éééééé W1SUPER ASREL'M68XXX SUPER SABD „M68010 DIRECTIVE--SWITCH TO SUPERVISOR MODEL2pMMULOAD pRUNNER pPANEL FSUPER pEXCSTACK pSBLOGPHY &TH3 =| . €Kª{ûf@Jnpg x (f. x Uˆ, z n6aAÌ```*FB®3€LîÿN•B¸ ,x Nu4éééé ééN1TRAP1 ASREL'M68XXX TRAP1 SAD „68010 INVOKE RMS TRAP 1 DIRECTIVESØ2pSBGETTCB BT1NULLR pT1PARBLK pT1TRGTSK pEXIT2 BTRAP1 BTRAP1B HpTRACER pENDTAB1 pTABLE1 pRUNNER pUDRBEG pISRRTE pEXITABLE pTRACFLAG pCKEXMON pSVSTATE pSBLOGPHY "N3 ?_fAøaAô=n\8 gaAâÿ.)g".Hg~aAÈ=@|J3Bn€ÿÿJ@kZåˆ €IünªEù(ÕÀ4*? g0B…, n6aA‚`NqK3@HTn`h(F gAÔaBÿj`Vn`R*HÔÒHy*òNÒ$x $ gRD@°jnJS€Àü EòH3 Jªg:*f"²®f*?*$j?<„Hy*ò@çNÒ0€ãˆAù(Nð=|3 `Bþò=|Ns4ééééé'M6840 RDTIMER AF00RDTIMER SA991RDTIMER ROBBTIMEINT AFKKTIMEINT SATT wTIMEINT ROee =/*†M6840.RDTIMER.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN)=/*†FILE�WILL�DEFAULT�TO�M6840.RDTIMER.LS=/*=/IFC \1=ARG M6840.RDTIMER.LS=/ENDIF=/*/=ASM M6840.RDTIMER.SA,M6840.RDTIMER.RO,\1;RZ=46=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9999.M6840.M6840.EQ=/*}=/*=ENDéééééé(‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9999.M6840.M6840.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9999.M6840.M6840.EQ‰LIST‰PAGE=RDTIMER‚IDNTƒ1,0…READ�TIMER�routine�for�the�M6840�timer�chip.*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�RDTIMER‚1.00„**ˆ*’**ˆ*�HLD6ƒ09/30/80‚**ˆ*********************'*…READ�TIMER�-�RETURN�TIME�OF�DAY�IN�D1*™TIMER�VALUE�IN�D0*‰SECTION�LEVEL00*‰XDEFƒRDTIMER,SBRDTIM‰XREF.S�TINTFLAG,TIMINTV4‰XREF.S�PTMADDR,TIMEOD*SBRDTIM‚EQU…*ŒSUBROUTINE�ENTRYRDTIMER‚MOVE.L‚A0,-(A7)#‰MOVE.L‚PTMADDR,A0ƒADDRESS�OF�TIMERRDTIM1ƒCLR.LƒD1$‰CLR.BƒTINTFLAG…CLEAR�INTERRUPT�FLAG ‰MOVEPƒMSBT3(A0),D1‚READ�TIMER�3‰MOVE.W‚D1,D0ˆSAVE�TIMER�VALUE‰LSR.Wƒ#8,D1ˆGET�MS�BYTE�ONLY ‰NEG.WƒD1.‰ADD.WƒTIMINTV4,D1‚#�TIMES�COUNTER�DECREMENTED‰LSR.Wƒ#2,D1ˆWANT�TIMEINTV�ONLY ‰ADD.LƒTIMEOD,D1…ADD�TIME�OF�DAY$‰TST.BƒTINTFLAG…DID�INTERRUPT�OCCUR? ‰BNE…RDTIM1‡IF�YES�-�DO�IT�AGAIN‰MOVE.L‚(A7)+,A0‰RTS‰ENDéé é12X1RDTIMER ASYST'M6840 RDTIMER SAB!ƒREAD TIMER routine for the M6840 timer chip.P2pPTMADDR BRDTIMER pTIMINTV4 BSBRDTIM pTIMEOD pTINTFLAG "*03$ @/ x B�B8  0àIDAÒx äIÒ¸ J8 fà _Nu4ééééééé:=/*†M6840.TIMEINT.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN)=/*†FILE�WILL�DEFAULT�TO�M6840.TIMEINT.LS=/*=/IFC \1=ARG M6840.TIMEINT.LS=/ENDIF=/*0=ASM M6840.TIMEINT.SA,M6840.TIMEINT.RO,\1;MRZ=46=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9999.M6840.M6840.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.PANEL.EQ=/*}=/*=ENDééé éééC‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9999.M6840.M6840.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.PANEL.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9999.M6840.M6840.EQ‰INCLUDEƒ9995.&.PAT.EQ‰INCLUDEƒ9995.&.PANEL.EQ‰LIST‰PAGEBTIMEINT‚IDNTƒ3,1…TIMER�INTERRUPT�HANDLER�FOR�THE�M6840�TIMER�CHIP.*$*‰COPYRIGHTED�1980�BY�MOTOROLA,�INC.*,*†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�TIMINTV**ˆREV‚2.00„02/08/81‚(HLD6)*ˆREV‚3.00„11/06/81‚(HLD6)*ˆREV‚3.10„02/09/82‚(HLD6)*.*•09/83‚SJF�--�Changed�to�exit�through�COMINT;*£eliminated�VM01FLAG�stuff.*‰SECTION�LEVEL00* ‰XDEF„TIMEINT4‰XREF.S‚TINTFLAG,PTMADDR,TIMEOD,DATE,SVSTATE,COMINTZ0‰XREF.S‚TIMESLIC,TIMEOUT,TMSGFLAG,PATBEG,TIMINTV$‰XREF.S‚TRACER,PANEL,TRACFLAG,CKEXPA*0TIMEINT‚MOVEM.L�D0-D1/A0-A1,-(A7)‡SAVE�REGISTERS!‰MOVE.L‚PANEL,A0†ADDRESS�OF�PANEL(‰MOVE.B‚#0,FPTTO(A0)‚KEEP�READY�LIGHT�ON ‰MOVE.L‚PTMADDR,A0ˆTIMER�ADDRESS3ŠST…TINTFLAG‹Set�flag�to�indicate�that�the�time�has$*§changed.‚If�we�interrupted�someone&*§who�is�reading�the�time,�he�can�tell%*§that�he's�got�garbage�by�looking�at *§this�flag.!‰MOVE.B‚CR2SR(A0),D0„CLEAR�STATUS'‰MOVE.B‚MSBT3(A0),D0…CLEAR�T3�INTERRUPT 1ŠCLR.L‚D1‘D1.L�<--�time�interval�corresponding�to'ŠMOVE.W�TIMINTV,D1‰a�tick�of�the�timer. #‰ADD.LƒD1,TIMEODˆADD�TO�TIME�OF�DAY!‰MOVE.L‚TIMEOD,D0ˆGET�TIME�OF�DAY-‰SUB.Lƒ#24*60*60*1000,D0‚IS�IT�PAST�MIDNIGHT?‰BMI.SƒTIMEI4‹BRANCH�IF�NO**…MIDNIGHT�ADJUSTMENTS*‰ADD.Lƒ#1,DATEŽINCREMENT�DATE‰MOVE.L‚D0,TIMEODŒSAVE�TOD"‰MOVE.L‚#24*60*60*1000,D0„24�HOURS4‰MOVE.L‚PATBEG,A1ŒSTART�OF�PERIODIC�ACTIVATION�TABLE%‰MOVE.W‚SR,-(A7)�SAVE�STATUS�REGISTER!‰OR.W„#$700,SR�INHIBIT�INTERRUPTS)‰MOVE.L‚PATEHDR(A1),A0‡START�OF�EXEC�LIST%TIMEI1ƒMOVE.L‚A0,D1�TEST�FOR�NO�ENTRY+‰BEQ.SƒTIMEI2�BRANCH�IF�ALL�ENTRIES�CHANGED+‰SUB.LƒD0,PATTIME(A0)‡ADJUST�FOR�DAY�CHANGE,‰MOVE.L‚PATNEXT(A0),A0‡GET�NEXT�ENTRY�IN�PAT"‰BRA…TIMEI1�GO�BACK�FOR�NEXT�ENTRYLHU0'TIMEI2ƒMOVE.W‚(A7)+,SR�ALLOW�INTERRUPTS)‰MOVE.L‚PATTHDR(A1),A0‡START�OF�TASK�LIST%TIMEI3ƒMOVE.L‚A0,D1�TEST�FOR�NO�ENTRY+‰BEQ.SƒTIMEI4�BRANCH�IF�ALL�ENTRIES�CHANGED+‰SUB.LƒD0,PATTIME(A0)‡ADJUST�FOR�DAY�CHANGE,‰MOVE.L‚PATNEXT(A0),A0‡GET�NEXT�ENTRY�IN�PAT!‰BRA…TIMEI3�GO�BACK�FOR�NEXT�TASK*6*ˆCHECK�FOR�ANY�EXEC�PROCEDURES�WAITING�FOR�ACTIVATION*:TIMEI4ƒMOVE.L„PATBEG,A1‹START�OF�PERIODIC�ACTIVATION�TABLE*‰TST.L…PATEHDR(A1)‰ANY�PROCEDURES�WAITING?‰BEQ.S…TIMEI12�BRANCH�IF�NO%‰MOVE.W„16(A7),D0‹GET�SR�AT�INTERRUPT&‰AND.W…#$27FF,D0‹GET�RID�OF�EXTRA�BITS#‰OR.W†#$2000,D0‹BE�SURE�SUPR�IS�SET‰MOVE.L„TIMEOD,D1‹GET�TOD(‰BSR‡CKEXPAŽGO�TEST�ALL�PAT�EXEC�ENTRIES***†RESTORE�REGISTERS�AND�TRACE�IF�REQUESTED*3TIMEI12‚MOVEM.L‚(A7)+,D0-D1/ A0-A1„RESTORE�REGISTERS&‰BTST„#TRCFTIMR,TRACFLAG„TRACE�WANTED?ŠIF…�THEN.SŠBSR„TRACER�CALL�TRACE�ROUTINE ŠDC.Wƒ$FF13ŠENDI *G*‚Check�to�see�whether�this�tic�represents�the�end�of�the�timeslice�for*‚the�running�task,�and�exit.*7ŠTST„TIMESLIC‹If�we're�supposed�to�be�doing�timeslicing9ŠIF…�THEN.Sˆ(i.e.,�if�tics/timeslice�parameter�<>�0), .ŠSUB„#1,TIMEOUT‰decrement�the�timeout�counter.+ŠIF…�THEN.SˆIf�it�is�now�0�or�negative,5ŠST…TMSGFLAG‹set�the�flag�that�will�cause�a�dispatch.ŠENDI–* ŠENDI–* 2ŠBRA.L‚COMINTZŒEither�way,�exit�through�the�common*§interrupt�handler.   ‰ENDéé]1TIMEINT ASYST'M6840 TIMEINT SA!ƒTIMER INTERRUPT HANDLER FOR THE M6840 TIMER CHIP.º2pPTMADDR pCOMINTZ pDATE pTIMESLIC BTIMEINT pTIMEOUT pTIMINTV pCKEXPA pTRACER pPATBEG pPANEL pTIMEOD pTRACFLAG pTINTFLAG pSVSTATE pTMSGFLAG "²F3 THçÀÀ x | x Pø (( B�28 Ó¸  8 €&\k:R¸ !À  <&F3 €\"x @ç| i "g‘¨ P`ôFß i"g‘¨ P`ô"x J© g0/@'ÿA3$’€@ "8 aBÿvLß8 gaBÿfÿJx g Sx nPø `BÿP4éééééé]'M68451 LOADMMU AFrrLOADMMU SA{{'oLOADMMU RO¬¬ =/*†M68451.LOADMMU.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN*=/*†FILE�WILL�DEFAULT�TO�M68451.LOADMMU.LS=/*=/IFC \1=ARG M68451.LOADMMU.LS=/ENDIF=/*3=ASM M68451.LOADMMU.SA,M68451.LOADMMU.RO,\1;MRZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒM68451.M68451.EQ=/*ƒM68010.BUSERRFT.EQ=/*}=/*=ENDééééééj**‰INCLUDE�FILES**‰INCLUDE„9995.&.STR.EQ*‰INCLUDE„9995.&.TCB.EQ*‰INCLUDE„9995.&.TST.EQ*‰INCLUDE„M68451.M68451.EQ*‰INCLUDE„M68010.BUSERRFT.EQ*ŠNOLISTŠINCLUDE„9995.&.STR.EQŠINCLUDE„9995.&.TCB.EQŠINCLUDE„9995.&.TST.EQŠINCLUDE„M68451.M68451.EQŠINCLUDE„M68010.BUSERRFT.EQŠLISTŠPAGE:LOADMMU‚IDNTˆ5,1‚68451�MMU�HANDLER�FOR�68010-BASED�SYSTEMS*#*‰COPYRIGHTED�1983�BY�MOTOROLA,INC.**‰*********************‰*�LOADMMU…5.00�**‰*’**‰*�7616�02/28/83„**‰*********************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,LOADMMUI'ŠXREF.S‚MMUHERE,MMULOAD,TRACER,TRACFLAG*LOADMMU%ŠMOVE.W‚SR,-(A7)ŠSave�interrupt�level!ŠOR.W„#$700,SRŠInhibit�interrupts.ŠMOVE.B‚TSTASN(A5),D0…Get�address�space�number/Š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 /ŠBTST„#TRCFMMU,TRACFLAG�Should�entry�be�traced? ŠIF…�THENŠBSR…TRACERŒBuild�trace�entryŠDC.W„$DD08�Trace�codeŠENDI 1ŠMOVE.W‚(A7)+,SRŠRestore�previous�interrupt�level ŠR TS—ReturnŠPAGELOADMMUI!ŠOR.W„#$700,SRŠInhibit�interrupts.ŠMOVE.B‚TSTASN(A5),D0…Get�address�space�number/Š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 /ŠBTST„#TRCFMMU,TRACFLAG�Should�entry�be�traced? ŠIF…�THENŠBSR…TRACERŒBuild�trace�entryŠDC.W„$DD08�Trace�codeŠENDI Š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,KILLER*CRASNs]|M„"Œ”Mœ8"‰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,CRASN12�Branch�back�if�not�free,‰BEQ.S‚CRASN12A�Branch�if�an�entry�was�found"ŠADD.L‚#2,(A7)�Error�--�table�fullŠRTSšTake�error�return"CRASN12A�MOVE.L�A5,-(A0)�Use�entry‰NEG.B‚D0•Compute�ASN‰ADD.B‚#127,D0#‰MOVE.L�TCBTST(A5),A0ŠPoint�to�!TST"‰MOVE.B�D0,TSTSTAT(A0)‰Drop�in�ASNCRASN13ŠRTSšReturn�to�callerŠPAGE**‡Delete�task�from�!ASN**%*‰ENTRY:ƒA4‚Points�to�TCB�to�lose�ASN* *›01234567*‰USES�REGISTERS‚D�**™A�*‚** ŠXDEF…DEASNŠXREF.SƒASNTBL,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‚FRST451,LAST451,CURR451,CURRSD*UNLDMMU*Š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‚MMUHERE,RUNNER&ŠXREF.S‚FRST451,LAST451,CURR451,CURRSDMMUFAULT)ŠMOVEM.L�D0-D7/A0-A6,-(A7)‚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�th e*§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*-ŠMOVE.W‚SR,-(A7)Š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**‰Load�this�descriptor*/ŠMOVEM.W�D0-D3,AC0(A4)„Load�most�of�accumulatorŠMOVE.B‚#$FF,AC8(A4)…ASM#ŠMOVE.B‚D7,DP(A4)ˆDescriptor�number"ŠMOVE.B‚LDO(A4),D6‡Load�descriptor(ŠBNE.SƒMMUFRTSR‰Branch�if�it�didn't�work"ŠMOVE.B‚AC6(A4),AST1(A0)�User�data%ŠMOVE.B‚AC6(A4),AST2(A0)�User�program**‰Fix�up�SYSPAR�parameters*2 ŠADDQ.B‚#1,D7ŒStart�next�time�with�next�descriptorŠCMP.Bƒ#$20,D7ŠEnd�of�this�MMU?ŠBNE.SƒFSD100‹Branch�if�no#ŠLEA…$40(A4),A4‡Move�on�to�next�MMU#ŠCLR.BƒD7�Start�with�descriptor�#�0$ŠCMP.LƒA1,A4ŒAre�we�beyond�all�MMUs?ŠBLE.SƒFSD100‹Branch�if�no"ŠMOVE.L‚A0,A4ŒGo�back�to�first�MMUŠADDQ.B‚#1,D7ŒDescriptor�#�1FSD100#ŠMOVE.L‚A4,CURR451‡Save�current�MMU+ŠMOVE.B‚D7,CURRSD+3†Save�current�descriptor**‰Return�to�faulted�task*!ŠADD.Lƒ#2,A7ŒRemove�SR�from�stack5ŠMOVEM.L�(A7)+,D0-D7/A0-A6�Restore�original�registers+ŠADD.Lƒ#8,A7ŒRemove�unused�return�addressesŠRTE–Continue�task*%*‰Return�to�normal�exception�handling*MMUFRTSR1ŠMOVE.W‚(A7)+,SR‰Restore�previous�interrupt�levelMMUFRTS,ŠMOVEM.L�(A7)+,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ééU1LOADMMU ASYST'M68451 LOADMMU SA@!ƒ68451 MMU HANDLER FOR 68010-BASED SYSTEMSä2BLOADMMU BLOADMMUI .BMMUFAULT pMMULOAD BUNLDMMU ÄpASNTBL BCRASN XBDEASN ’pCURR451 pTRACER pKILLER pFRST451 pLAST451 pRUNNER pCURRSD pTRACFLAG pMMUHERE pSBLOGPHY ">H3� @ç|- !Í *x @@8 gaAÚÝFßNu|- !Í *x @J3D@8 gaA®ÝNs 8 g2 @ �!ASNgaA–Aè0<~J˜WÈÿügT—NuL3 ! D m6@ Nu 8 g* @ �!ASNgaBÿ\"l6B@) g @€maBÿFåHB°F3NuJ- gR"x <@))1g()&²- f2) ²uPm²uPn|1J3P"!É À!R fÂCé@B³ø o¶NuHçÿþJ¸ g x J( g¶z,/NaBþÂF3@`Nq`¤a¦6( 0PÃ@ç|Lø (J. G),1g(†g"F1F3R  fIì@B¹Éo(HR¾KfιÊfÊH¬ |ÿ(G),?f4l&l&G3 R  fIì@B¹Éo(HR!Ì Ç!T�LßÿP�NsFßLßÿNu àˆàŽrÿ6B2±AD3fƒR`ö2ÂC²pPdSÃ`ð8FD2ÂCÒD²pPcSÄ`ìÀC40PÔ@2Nu4 ééé餿'M68XXX TRAP0 SA¹¹(7INIT AFêêINIT SAóäD ÂINIT RO== KILLER AFNNKILLER SAWW&KILLER RO``POWRFAILAFiiPOWRFAILSArr,POWRFAILRO{{READY AF„„READY SA��±READY RO¦¦RMS AF¯¯RMS SA¸¸)RMS ROÁÁSELFTESTAFÊÊSELFTESTSAÓÓ1SELFTESTROÜÜTABLE1 AFåå‰IFEQ„CHIPTYPE-68000/TRAP0…IDNTƒ5,1‡68000�TRAP�#0�handler�and�table.‰ENDC‰IFEQ„CHIPTYPE-68010/TRAP0…IDNTƒ5,1‡68010�TRAP�#0�handler�and�table.‰ENDCO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***H***…FILE:‚TRAP0�--�ALL�THE�STUFF�DEALING�WITH�THE�TRAP�#0�MECHANISM.ƒ******É***J***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family.***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***I***…FUNCTION:‚In�this�file�are�(1)�the�TRAP�#0�handler,�(2)�the�table‚***E***‡containing�offsets�to�the�TRAP�#0�routines,�and�(3)�a�TRAP�#0…***I***‡routine�which�returns�the�entry�point�address�for�a�given�TRAP�#0�******‡directive.¸******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------C*†8/12/83‚Steve�FranckƒRemoved�restriction�that�TRAP�#0�routines�be-*žin�low�32K�of�address�space,�and�changed�to**žword-wide,�position-independent�offsets..*žTRAP0�and�TABLE0�were�combined�at�this�time,"*žand�the�ENTRY�routine�was�added.*  **‚Included�files:*8*‰UTILITY.MC�Macros�of�general�utility�(e.g.�PUSH,�POP).2*‰ENV.EQ”Equates�dependent�on�processor�chip�type.2*‰STR.EQ”Equates�for�supervisor�code�under�RMS68K.*ŠNOLISTŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.ENV. EQŠINCLUDE�9995.&.STR.EQŠLIST  * *‚XDEF's.*0ŠXDEFƒTRAP0ŽEntry�point�for�the�TRAP�#0�handler. 0ŠXDEFƒTABLE0�Start�address�of�the�TRAP�#0�table.2ŠXDEFƒHI_DIR_NUM‰Highest�TRAP�#0�directive�number.  *±<º:Â3ÊCÒIÚ6*‚XREF's.‚TABLE0's�routine�names�are�XREFed�in�TABLE0.*+ŠXREFƒKILLERT0‹Routine�to�crash�the�system.  ŠSECTION�LEVEL00ŠOPT„BRSŠPAGEO*v*****************************************************************************O**********************************************************************************É***1***…ROUTINE:‚TRAP0�--�CALL�A�TRAP�#0�ROUTINE.š******É***J***…FUNCTION:‚When�an�entity�running�in�supervisor�mode�but�not�linked�***D***‡with�RMS68K�wants�to�invoke�some�exec�function,�he�moves�the†***D***‡directive�number�of�the�function�into�D0�and�does�a�TRAP�#0.†***E***‡The�mpu�vectors�here�and�we�use�the�TRAP�#0�table,�TABLE0,�to…***#***‡JMP�to�the�desired�routine.§******É***8***…NOTES:‚TRAP�#0�calls�from�user�mode�are�ignored.“******É***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:ƒAD‚.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒP ******É******…ENTRY�CONDITIONS:³***7***‡D0ƒ=�directive�#�of�the�routine�to�be�executed.‘***F***‡PC�&�SR�(&�maybe�VOR)�of�caller�are�stacked,�as�with�any�TRAP.„******É***O*******************************************************************************O*^***************************************************************************** TRAP0: ***‚Ensure�we�weren't�called�from�user�mode.*9ŠBTSTƒ#5,(SP)ŒCheck�the�SR�on�the�stack�to�see�if�we�were)ŠIF…�THENŠin�supervisor�mode.‚If�not,,ŠRTE—just�return�to�whoever�did�the�TRAP�#0.ŠENDI–* *K*‚Clean�up�the�stack�to�make�it�look�like�he�just�did�a�JSR�to�the�routine.*+ŠADDQ.L�#2,SPŽRemove�the�SR�from�the�stack.‰IFEQ‚CHIPTYPE-680102ŠMOVE.W�2(SP),4(SP)ˆLower�half�of�PC�replaces�VOR.8ŠMOVE.W�(SP)+,(SP)‰Upper�half�of�PC�replaces�lower�half.‰ENDC *5*‚Validate�the�directive�number�and�call�the�routine.*>ŠCMP.L‚#HI_DIR_NUM,D0…If�the�directive�number�is�out�of�range,ŠBHI.L‚KILLERT0‹call�KILLER.1ŠADD.L‚D0,D0ŽD0�<--�directive�#�*�2�for�use�as�an*§index�into�a�table�of�words.>ŠMOVEƒTABLE0(PC,D0.L),D0�D0�<--�offset�from�start�of�TABLE0�to*§the�routine�he�wants.5ŠJMP„TABLE0(PC,D0)†Jump�to�the�routine;�the�address�= *§*ƒbase�addr�of�TABLE0�+�offset*§*ƒfrom�TABLE0�to�the�routine.ŠPAGEO*v*****************************************************************************O**********************************************************************************É***G***…ROUTINE:‚ENTRY�--�GET�ENTRY�POINT�FOR�AN�EXEC�ROUTINE�(TRAP�#0)„******É***F***…FUNCTION:‚Returns�the�entry�point�address�for�an�exec�routine.…***B***‡Doing�a�JSR�to�the�returned�address�is�faster�than�doing�aˆ***A***‡TRAP�#0,�which�is�useful�for�drivers.‚It�can�also�be�usedˆ***=***‡to�validate�that�a�routine�with�such�a�number�exists.�******É***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:ƒ.ƒAP‚.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒRƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒP ******É******…ENTRY�CONDITIONS:³***G***‡D1ƒ=�number�of�the�routine�for�which�the�entry�point�is�desired.******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******‡If�the�routine�exists:¬***;***‰A0ƒ=�entry�point�address�for�the�specified�routine.‹***2***‰Return�to�caller�at�the�PC�after�his�call.–***&***‡If�the�routine�does�not�exist:¤***6***‰Return�to�caller�at�the�PC�after�his�call�+�2.’******É***O*******************************************************************************O*^******************************************************** ********************* ENTRY: ***‚Ensure�the�directive�number�is�in�range.*<ŠIF.L�D1��#HI_DIR_NUM�THEN‚If�the�routine�#�is�too�high,6ŠADDQ.L�#2,(SP)Œreturn�to�the�caller�2�bytes�after�the-ŠRTS—normal�return�point,�to�signal�an�error.ŠENDI–* *=* It's in range, so calculate the routine address and return.* ŠPUSH.L�D1‘Save�the�caller's�D1.5ŠADD.L‚D1,D1ŽD1�<--�2�*�routine�#�(to�use�as�an�index*§into�a�table�of�words).BŠMOVEƒTABLE0(PC,D1.L),D1�D1�<--�offset�to�the�routine�from�TABLE0.=ŠLEA„TABLE0(PC,D1),A0ƒA0�<--�address�of�the�TRAP�#0�routine�=%*§addr�of�TABLE0�+�offset�from�TABLE0*§to�the�routine."ŠPOP.L‚D1‘Restore�the�caller's�D1. 'ŠRTS—Return�to�the�caller�successfully.ŠPAGEO**********************************************************************************É***G***…DATA�STRUCTURE:‚TABLE0�--�TABLE�OF�OFFSETS�TO�TRAP�#0�ROUTINES.„******É***F***…FUNCTION:‚This�table�is�used�to�calculate�addresses�of�TRAP�#0…***C***‡routines.‚There�is�an�entry�for�each�TRAP�#0�directive,�and†***E***‡they�are�in�order�by�directive�number.‚Each�entry�is�the�word„***D***‡displacement�from�the�beginning�of�this�table�to�the�TRAP�#0†***D***‡routine.‚This�technique�helps�make�RMS�position-independent.…******É***O******************************************************************************* *L*‚Use�the�SETUP�macro�to�define�table�entries.‚You�give�the�macro�the�equateN*‚for�the�directive�number�and�the�label�of�the�routine�you�want�to�go�to�when1*‚that�directive�is�called,�and�it�does�the�rest.*0*‚SETUP[.L]�,*I*‚Use�the�.L�if�the�routine�is�Local�to�this�module�rather�than�external.* SETUP…MACRODIR_NUMƒSET„(*-TABLE0)/2ŠIFEQƒDIR_NUM-\1ŒNOLISTŒIFNCƒ'\0','L'ŽXREFƒ\2ŒENDC ŒDC…\2-TABLE0ŒLISTŒMEXITŠENDCSHOULD_BE�SET„\10ŠFAILƒ499�This�directive�is�in�the�wrong�place!!ŠENDM  ŠOPT„MEX,NOCL  TABLE0: *§What�it�does(*§-------------------------------------- *ŠSETUP‚0,KILLERT0‰Unassigned;�call�KILLER. 1ŠSETUP‚T0P,PSEM4ŠP�operation�(wait)�on�semaphore. 3ŠSETUP‚T0V,VSEM4ŠV�operation�(signal)�on�semaphore. 0ŠSETUP‚T0READY,READY†Put�task�on�the�ready�list. :ŠSETUP‚T0PAGAL,PAGEALOCƒAllocate�pages�of�physical�memory. :ŠSETUP‚T0PGFR,PAGEFREE„Free�(return)�pages�of�phys�memory. <ŠSETUP‚T0GETTCB,GETTCB„Get�TCB�addr�given�taskname,�session. 3ŠSETUP‚T0FNDSEG,FNDTSEGƒFind�segment�name�in�a�TST. BŠSETUP‚T0LOGPHY,LOGPHY„Validate�logical�addr,�convert�to�physical. 1ŠSETUP‚T0FNDGSG,FNDGSEGƒFind�segment�name�in�GST. -ŠSETUP‚T0ASRINT,ASRINT„Interrupt�target�task. /ŠSETUP‚T0QEVNTN,EXQEVNTN‚Place�event�in�an�ASQ. ;ŠSETUP‚T0FNDSEM,FNDUSEMƒFind�entry�in�user�semaphore�table. 8ŠSETUP‚T0GTXTCB,GTXTCB„Get�TCB�using�session�provided�in =ŠSETUP‚T0PAUSE,PAUSE†Pause�while�waiting�for�I/O�to�complete. @ŠSETUP‚T0DSRVX,DSRVX†Deallocate�server�function�when�task�stops. @ŠSETUP‚T0DSEMX,DSEMX†Deallocate�user�semaphores�when�task�stops. 4ŠSETUP‚T0DASQX,DASQX†Deallocate�ASQ�when�task�stops. @ŠSETUP‚T0DSEGX,DSEGX†Deallocate�memory�segments�when�task�stops. >ŠSETUP‚T0EXEQDQ,EXEQDQ„Send�message�to�server�when�task�stops. )*§Detach�task�from�exception�monitor�when ŠSETUP‚T0DMONX,DMONX†task�stops. 'ŠSETUP‚T0EXABRT,EXABRT„Abort�user�task. &ŠSETUP‚T0WAKEUP,WAKEUPXƒWakeup�a�task. (*§Place�event�in�ASQ�while�NOT�servicing&ŠSETUP‚T0QEVNTT,EXQEVNTT‚an�interrupt. $*§Place�event�in�ASQ�while�servicing&ŠSETUP‚T0QEVNTI,EXQEVNTI‚an�interrupt. #ŠSETUP‚T0UPDATQ,UPDTASQƒUpdate�ASQ. "*§Validate�ODD�logical�address�and,ŠSETUP‚T0LOGPHO,LOGPHYOƒconvert�to�physical. 2ŠSETUP‚T0PAGALL,PAGEALLE‚Allocate�pages�of�memory. 7ŠSETUP‚T0RDTIM,RDTIMER„Get�time�of�day�in�milliseconds. '*§Disconnect�task�from�user�vector�when ŠSETUP‚T0DIOVX,DIOVX†task�stops. *ŠSETUP‚T0ADDPA,ADDPA†Add�entry�to�the�PAT.  "ŠSETUP‚T0CRTCB,TCBCR†Create�a�TCB. *ŠSETUP‚T0KILLER,KILLERT0‚Crash�the�system. 5ŠSETUP‚T0FREEPA,FREEPA„Return�PAT�entry�to�free�list. 1ŠSETUP‚T0RQPA,EXRQPA†Request�periodic�activation. =ŠSETUP.L�T0ENTRY,ENTRY…Get�entry�point�for�a�trap�#0�routine. #*§Schedule�routine�for�execution�in'ŠSETUP‚T0SCHED,BKG_SCHEDULEƒbackground. <ŠSETUP‚T0GUARD,CALL_GUARDED‚Call�subroutine�in�guarded�mode.    DHI_DIR_NUM�EQU�(*-TABLE0)/2-1‡Highest�directive�#�for�TRAP�#0�calls.   ‰ENDééééééé =/*†INIT.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN =/*†FILE�WILL�DEFAULT�TO�INIT.LS=/*=/IFC \1=ARG :.M68XXX.INIT.LS=/ENDIF=/*)=ASM :.M68XXX.INIT,:.M68XXX.INIT,\1;RZ=75=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.PANEL.EQ=/*ƒ9995.&.GST.EQ=/*ƒ9995.&.UST.EQ=/*ƒ9995.&.TRACE.EQ=/*ƒ9995.&.MAP.EQ=/*ƒ9995.&.IOV.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.UDR.EQ=/*}=/*=ENDéééé ééâ**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*ˆINCLUDEƒ9995.&.PANEL.EQ*ˆINCLUDEƒ9995.&.GST.EQ*ˆINCLUDEƒ9995.&.UST.EQ*ˆINCLUDEƒ9995.&.TRACE.EQ*ˆINCLUDEƒ9995.&.MAP.EQ*ˆINCLUDEƒ9995.&.IOV.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.UDR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰INCLUDEƒ9995.&.PANEL.EQ‰INCLUDEƒ9995.&.GST.EQ‰INCLUDEƒ9995.&.UST.EQ‰INCLUDEƒ9995.&.TRACE.EQ‰INCLUDEƒ9995.&.MAP.EQ‰INCLUDEƒ9995.&.IOV.EQ‰INCLUDEƒ9995.&.PAT.EQ‰INCLUDEƒ9995.&.UDR.EQ‰LIST‰PAGE INIT…IDNTƒ5,1„SYSTEM�INITIALIZER*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆSYSTEM�INITIALIZER**ˆEXECUTES�WHEN�IPL�CHUNK�IS�IN**,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesH*…________‚_____________‚_______________________________________________C*†12/23/83�Mark�Lanus…Re-wrote�memory�initialization�routine�to�fix.*žbug�in�"hole"�processing�(and�several�more).** ‰XREF.S„PANEL‰XREF.S„MACSTRC‰XREF.S„MAPBEG‰XREF.S„EXCSTACK ‰XREF.S„TCBHD‰XREF.S„READYHD‰XREF.S„SEMLIST‰XREF.S„SEMEND‰XREF.S„GSTBEG‰XREF.S„USTBEG‰XREF.S„PATBEG‰XREF.S„UDRBEG‰XREF.S„TRACEBEG‰XREF.S„TRACFLAG ‰XREF.S„TIAT ‰XREF.S„CCBHD‰XREF†CRASHSAV‰XREF.S„VCTUBGN‰XREF.S„IOVCTBGN‰XREF.S„ADEFTYP‰XREF.S„TDEFTYP‰XREF.S„SDEFTYP‰XREF.S„UDEFTYP‰XREF.S„ASNTBL‰XREF.S„NOTLAM ‰XREF.S„LAM‰XREF.S„ENDSYSPŠXREF.S�BKG_HEADŠXREF.S�BKG_TAILŠXREF.S�BKG_ACTIVE* ‰XDEF†KILLER*‰PAGE* *„REFERENCES�TO�INITDATA�SEGMENT* ‰SECTION�8‰XREF„MEMTABL,ENDMEMT‰XREF„TCBHEAD,RDYHEAD'‰XREF„ESTART,EEND,ESTACK,PANELA,TRCFLAG*‰XREF„SMEMLO,SMEMHI,DISPATCH,GSTSIZ,UDRSIZ!‰XREF„USTSIZ,TRCSIZ,IOVSIZ,PATSIZ%‰XREF„MEMTYPA,MEMTYPT,MEMTYPS,MEMTYPU ‰XREF„BUGTRAC‰XREF„WHERLOAD,PAGESIZE,ASN**(*ˆEXPECT�THE�FIRST�16�BYTES�TO�DISAPPEAR*(START„MOVE.L�#$400,A7‚LOAD�STACK�POINTER.‰MOVE.L�D0,$3FCƒBE�SURE�MEMORY�CAN�BE�ACCESSED*äëbôAüBB 67<$@,=4$<6DML;T-\UdSl'th|?„LŒ ”jœ%¤e¬<´K¼LÄ9ÌQÔ;$*ˆCLEAR�MEMORY�THROUGH�END�OF�SYSPAR*2‰LEA„CRASHSAV,A0„START�WHERE�USEABLE�MEMORY�STARTS(‰MOVE.L�#ENDSYSP,D6„END�AT�END�OF�SYSPAR$‰SUB.L‚A0,D6ŠCOUNT�OF�BYTES�TO�CLEAR#‰ADD.L‚#255,D6ˆCLEAR�TO�END�OF�PAGE‰CLR.B‚D6�EVEN�PAGE�BOUNDRY‰BSR„TBLCLRBˆCLEAR�MEMORY*'‰MOVE.L�ESTACK(PC),A7‚LOAD�SYSTEM�STACK/‰MOVE.L�A7,EXCSTACK„SAVE�STACK�POINTER�FOR�EXEC,‰MOVE.L�BUGTRAC(PC),MACSTRC‚SET�MACSTRAC�NOW*,*‡FIND�OUT�IF�PANEL�EXISTS�-�PUT�'BF'�IN�LED*)‰MOVE.L�PANELA(PC),A1„PANEL�ADDRESS�TO�A1!‰MOVE.L�A1,PANEL‰SAVE�IT�FOR�EXEC ‰BEQ.S‚PANELBEŠGO�ON�IF�NO�PANEL(‰LEA„PANELBE(PC),A0ƒGO�HERE�ON�BUS�ERROR"‰MOVE.L�A0,$8ŒSET�BUS�ERROR�VECTOR+‰MOVE.W�#$80,FPLEDST(A1)�TEST�FOR�BUS�ERROR ‰MOVE.W�#$BF,D1ŠWANT�'BF'�IN�LED‰BSR„PANELEDD‰GO�LIGHT�IT�UP ‰BRA.S‚MOVE2LOŠGO�TO�MOVE�MEMORY*1PANELBE‚MOVE.L�#CRASHSAV,PANEL‚SET�PANEL�TO�DUMMY'‰MOVE.L�EXCSTACK,A7†RESET�STACK�POINTER‰PAGE*/*†MOVE�ALL�OF�OS�TO�LOWER�MEMORY�IF�APPROPRIATE*3MOVE2LO‚MOVE.L‚WHERLOAD(PC),D1ƒWHERE�ARE�WE�LOADED?‰B  EQ.SƒVECTINITŠBRANCH�IF�AT�0'‰MOVE.L‚ESTART(PC),A3…'MOVE�TO'�ADDRESS!‰MOVE.L‚D1,A2�'MOVE�FROM'�ADDRESS'‰LEA…ENDMEMT(PC),A4„END�OF�MEMORY�TABLE#‰ADD.Lƒ#$800,A4ŠEXTRA�FOR�MINI-TCBS&‰LEA…VECTINIT(PC),A0ƒWHERE�TO�GO�LATER%‰SUB.LƒA2,A0�SUBTRACT�START�OF�'FROM'‰ADD.LƒA3,A0�ADD�START�OF�'TO'(‰LEA…MOVDONE(PC),A1„GO�HERE�ON�BUS�ERROR‰MOVE.L‚A1,$8�BUS�ERROR�VECTOR*#MOVEALL‚MOVE.L‚(A2)+,(A3)+‡MOVE�ALL‰CMP.LƒA2,A4�FINISHED?‰BGT…MOVEALL‹BRANCH�IF�NO ‰ADD.Lƒ#6,A7*'MOVDONE�JMP†(A0)ŽCONTINUE�IN�OTHER�COPY‰PAGE**ˆSET�UP�VECTORS*;VECTINIT�MOVE.L�ESTART(PC),A2ƒSTART�SEARCH�AT�START�OF�EXEC&‰MOVE.L�#'!VCT',D0†D0=!VCT�FOR�COMPARE&‰LEA„$200(A2),A0…END�OF�SEARCH�ADDRESS-VECTSRCH�CMP.L‚(A2)+,D0ˆIS�THIS�VECTOR�TABLE?‰BEQ.S‚VECTSET‰BRANCH�IF�FOUND%‰SUB.L‚#2,A2‹WANT�TO�CHECK�EVERY�WORD$‰CMP.L‚A0,A2‹SHOULD�SEARCH�CONTINUE?‰BNE„VECTSRCHˆBRANCH�IF�YES#‰BSR„KILLERŠNO�VECTOR�TABLE�--�QUIT*&VECTSET‚LEA„0,A3ŒADDRESS�OF�VECTOR�#�0*‰MOVE.L�(A2)+,A4ˆADDRESS�OF�COMINT�ROUTINE;‰MOVE.L�A4,VCTUBGN†SAVE�COMINT�ADDRESS�FOR�VECTOR�USE�TABLE‰CLR.L‚D6ŽSET�1ST�VECTOR�#‰CLR.L‚D5ŽCLEAR�FOR�SHORT�LOAD+‰MOVE.L�D5,A5‹INITIALIZE�VECTOR�SET�ADDRESS+‰TST.B‚(A2)ŒSHOULD�VECTOR�0�BE�INITIALIZED?‰BEQ.S‚VECTENT‰BRANCH�IF�YES‰MOVE.W�#2,D6‹1ST�VECTOR�TO�SET‰LEA„8,A3ŒADDRESS�OF�VECTOR�#�2*,VECTENT‚MOVE.L�(A2)+,D0ˆGET�NEXT�TABLE�ENTRY,‰BNE.S‚VECTENT2ˆBRANCH�IF�NOT�END�OF�ENTRIES+‰MOVE.W�#300,D5‰USE�HI�#�FOR�VECTOR�COMPARE ‰BRA.S‚VECTCMP‰BRANCH�TO�COMPARE-VECTENT2�ROL.L‚#8,D0‹PUT�VECTOR�#�IN�BITS�0-7‰MOVE.B�D0,D5‹SAVE�VECTOR�#‰LSR.L‚#8,D0‹RESTORE�ADDRESS+‰CMP.L‚#1,D0‹SHOULD�THIS�VECTOR�BE�SKIPPED?‰BNE.S‚VECTCMP‰BRANCH�IF�NO‰NEG.L‚D0ŽNEGATIVE=SKIP�FLAG*&VECTCMP‚CMP.W‚D6,D5‹COMPARE�VECTOR�#'S$‰BMI„VECTENT‰BRANCH�TO�GET�NEW�ENTRY*‰BNE.S‚VECTSTORˆBRANCH�IF�NOT�AT�ENTRY�YET ‰MOVE.L�D0,A5‹NEW�VECTOR�ADDRESS*"VECTSTOR�MOVE.L�A5,D1‹TEST�ADDRESS+‰BMI.S‚VECTINC2ˆIF�NEG�-�SKIP�VECTOR�CHANGE$‰BNE.S‚VECTINC1ˆBRANCH�IF�ADDRESS�OK+‰MOVE.L�A4,(A3)+ˆUSE�COMINT�ROUTINE�ADDRESS%‰BRA.S‚VECTINC3ˆBRANCH�TO�INCR�VECTOR*0VECTINC1�MOVE.L�A5,(A3)+ˆSTORE�ADDRESS�IN�VECTOR%‰ADD.L‚#2,A5‹INCREMENT�VECTOR�ADDRESS‰BRA.S‚VECTINC3*6VECTINC2�LEA„4(A3),A3ˆDO�NOT�SET�VECTOR�-�INCR�ADDRESS'VECTINC3�ADD.L‚#1,D6‹INCREMENT�VECTOR�#‰CMP.L‚#$400,A3ˆEND�OF�VECTORS?‰BNE„VECTCMP‰BRANCH�IF�NO*/*‡SET�BUS�ERROR�--�IN�CASE�ERROR�OCCURS�IN�INIT*)‰PEA„KILLER(PC)†PUT�ERROR�RETURN�ON�STACK)‰MOVE.W�#'BE',-(A7)„BUS�ERROR�RETURN�FLAG‰PAGE*J*‚Initialize�SYSPAR�parameters�for�background�and�CALL_GUARDED�processing.*>ŠMOVE.L�#0,BKG_HEADˆInitialize�background�queue�to�empty:‚headDŠMOVE.L�#BKG_HEAD,BKG_TAIL�ptr�is�0�and�tail�ptr�points�to�head�ptr.8ŠSF…BKG_ACTIVE‰Initialize�ACTIVE�flag�to�false�since�the*§background�isn't�running.   *+*‡START�PROCESSING�MEMORY�PARTITION�ENTRIES* ‰BSR‡IMEM ‰PAGE**†SET�DEFAULT�MEMORY�TYPES*1‰MOVE.B‚MEMTYPA(PC),ADEFTYPƒDEFAULT�TYPE�FOR�ASQS1‰MOVE.B‚MEMTYPT(PC),TDEFTYPƒDEFAULT�TYPE�FOR�TCBS9‰MOVE.W‚MEMTYPS(PC),SDEFTYPƒDEFAULT�TYPE�FOR�SYSTEM�TASKS7‰MOVE.W‚MEMTYPU(PC),UDEFTYPƒDEFAULT�TYPE�FOR�USER�TASKS**ˆPUT�TASKS�ON�LISTS*,‰MOVE.L�TCBHEAD(PC),TCBHDƒPOINT�TO�FIRST�TCB0‰MOVE.L�RDYHEAD(PC),READYHD�POINT�TO�FIRST�READY**ˆMISC�SYSPARS*/‰MOVE.L�BUGTRAC(PC),MACSTRCƒMACSBUG�TRACE�ENTRY* *ˆSEMAPHORES*,SEMS…LEA„SEMLIST,A1�START�OF�EXEC�SEMAPHORES+INITSEM‚MOVE.W�#1,(A1)�SET�COUNT�FIELD�TO�1 ‰CLR.L‚2(A1)’CLEAR�ADDRESS�FIELD(‰ADD.L‚#6,A1’INCREMENT�TO�NEXT�SEMAPHORE$‰CMP.L‚#SEMEND,A1�END�OF�SEMAPHORES? ‰BLT.S‚INITSEM�BRANCH�BACK�IF�NO**ˆINITIALIZE�MMU* ‰XREF„INITMMU3‰BSR…INITMMUˆINVOKE�CONFIGURATION-DEPENDENT�ROUTINE**‰ADDRESS�SPACE�PARAMETERS*$ŠMOVE.L�PAGESIZE(PC),D0‡GET�PAGESIZE:ŠIF…�THEN.SˆIf�the�pagesize�specified�by�the�Sysgen�is%ŠMOVE.L�#256,D0Œzero,�default�to�256.ŠENDI–* ŠSUB.L‚#1,D0‘NOTLAM�=�PAGESIZE-1$ŠMOVE.L�D0,NOTLAM�NOTLAM�INTO�SYSPAR-ŠMOVE.L�#$FFFFFFFF,LAMˆPREPARE�TO�COMPUTE�LAM$ŠSUB.L‚D0,LAM�LAM�=�$FFFFFFFF-NOTLAM*  ŠCLR.L‚ASNTBL�SET�FOR�NO�ASNTBLŠMOVE.L�ASN,D2�ASNTBL�DESIRED?ŠBEQ.S‚ASN99‘BRANCH�IF�NO.ŠMOVE.L�#2,A0‘512�BYTES�FOR�127�ADDRESS�SPACES(ŠMOVE.L�#T0PAGAL,D0‹PAGEALOC�DIRECTIVE�#ŠTRAPƒ#0”EXEC�CALL"ŠBRA.S‚ASN10‘BRANCH�IF�GOOD�RETURN!ŠBSR„KILLER�CRASH�IF�ERROR�RETURN4ASN10…MOVE.L�A0,ASNTBL�SAVE�ASNTBL�ADDRESS�IN�SYSPAR/ŠBSR„TBLCLR�CLEAR�ADDRESS�SPACE�TABLE�TO�ZEROESŠMOVE.L�#'!ASN',(A0)ŠEYECATCHERASN99**ˆBUILD�GLOBAL�SEGMENT�TABLE*ABLDGSTƒCLR.L‚GSTBEGˆSET�SYSPAR�ADDRESS�TO�0�IN�CASE�NO�GST�NEEDED‰MOVE.L�GSTSIZ(PC),D2�NEED�GST?‰BEQ.S‚BLDUSTˆBRANCH�IF�NO)‰MOVE.L�D2,A0‰PUT�SIZE�IN�A0�FOR�PAGEALOC(‰MOVE.L�#T0PAGAL,D0ƒPAGEALOC‚DIRECTIVE�#‰TRAPƒ#0ŒEXEC�CALL%‰BRA.S‚BLDGST01†BRANCH�IF�GOOD�RETURN!‰BSR„KILLERˆCRASH�IF�ERROR�RETURN3BLDGST01�MOVE.L�A0,GSTBEG…SAVE�GST�ADDRESS�FOR�EXEC‰BSR„TBLCLRˆCLEAR�GST�TO�ZEROES‰MOVE.L�#'!GST',(A0)‚EYECATCHER-‰MOVE.W�#1,GSTNSEG(A0)‚NUMBER�OF�GST�SEGMENTS)‰MOVE.W�D2,GSTNPAGE(A0)�GST�LENGTH�TO�GST‰LSL.L‚#8,D2‰LENGTH�IN�BYTES2‰SUB.L‚#GSTENTRY,D2‚SUBTRACT�LENGTH�OF�HEADER�INFO&‰DIVUƒ#GSTEL,D2…DIVIDE�BY�ENTRY�LENGTH-‰MOVE.W�D2,GSTMENT(A0)�SAVE�MAXIMUM�#�ENTRIES)‰LEA„GSTENTRY(A0),A2ƒADDRESS�OF�1ST�ENTRY%‰MOVE.L‚A2,GSTFENT(A0)ƒSAVE�IN�HEADER**ˆBUILD�USER�SEMAPHORE�TABLE*9BLDUSTƒCLR.L‚USTBEG†CLEAR�UST�ADDRESS�IN�CASE�NONE�NEEDED‰MOVE.L�USTSIZ(PC),D2‚NEED�UST?‰BEQ.S‚BLDVTU†BRANCH�IF�NO(‰MOVE.L�D2,A0‡PUT�SIZE�IN�A0�FOR�PAGALOC,‰MOVE.L�#T0PAGAL,D0�DIRECTIVE�#�FOR�PAGEALOC‰TRAPƒ#0ŠEXEC�CALL%‰BRA.S‚BLDUST01„BRANCH�IF�GOOD�RETURN‰BSR„KILLER†CRASH�IF�NO�MEMORY3BLDUST01�MOVE.L�A0,USTBEGƒSAVE�UST�ADDRESS�FOR�EXEC‰BSR„TBLCLR†CLEAR�UST�TO�ZEROES*‰MOVE.L�#'!UST',UST(A0)ƒEYE�CATCHER�TO�UST)‰MOVE.W�#1,USTNSEG(A0)„ONLY�1�UST�SEGMENT(‰MOVE.W�D2,USTNPAGE(A0)ƒ#�PAGES�IN�TABLE#‰LSL.L‚#8,D2�CONVERT�PAGES�TO�BYTES(‰SUB.L‚#USTENTRY,D2„SUBRTACT�HEADER�SIZE&‰DIVUƒ#USTEL,D2‡DIVIDE�BY�ENTRY�LENGTH-‰MOVE.W�D2,USTMENT(A0)‚SAVE�MAXIMUM�#�ENTRIES(‰LEA„USTENTRY(A0),A2�FIRST�ENTRY�ADDRESS(‰MOVE.L�A2,USTFENT(A0)‚SAVE�IT�IN�HEADER**ˆBUILD�VECTOR�USE�TABLE*+BLDVTUƒMOVE.L�#1,A0ŠSIZE�IS�ALWAYS�ONE�PAGE,‰MOVE.L�#T0PAGAL,D0ŠDIRECTIVE�#�FOR�PAGEALOC‰TRAPƒ#0�EXEC�CALL%‰BRA.S‚BLDVTU01‡BRANCH�IF�GOOD�RETURN$‰BSR„KILLER‰CRASH�IF�NO�MEMORY�FOUNDBLDTIAT‚MOVE.L�#$01010000,TIATƒSET�TRAP�0�AND�1�'USED�BY�EXEC'‰PAGE*0*…INITIALIZE�CONFIGURATION-DEPENDENT�I/O�DEVICES* ‰XREFƒINITIO)‰BSR„INITIO‰SUBROUTINE�WILL�INITIALIZE�IO*1*ˆCREATE�TASK�CONTROL�BLOCKS�FOR�ROM�BASED�SYSTEM**LOOKTCB‚TST.L‚TCBHD‹DO�TCBS�ALREADY�EXIST?%‰BNE„BLDTCB99ˆBRANCH�IF�YES�-�NOT�ROM'‰CLR.L‚READYHD‰BE�SURE�READYHD�IS�CLEAR4‰LEA„ENDMEMT(PC),A3‚START�SEARCH�AT�END�OF�MEM�TABLE‰LEA„$200(A3),A1…END�OF�SEARCH,‰MOVE.L�#'!TCB',D0†INITIALIZE�D0�FOR�COMPARE'LOOKT2ƒCMP.L‚(A3),D0‰LOOK�FOR�MINI�TCBS‰BEQ.S‚BLDTCBS‰BRANCH�IF�FOUND!‰ADD.L‚#2,A3‹CHECK�ALL�EVEN�BYTES‰CMP.L‚A3,A1‹END�OF�SEARCH?‰BNE„LOOKT2ŠLOOP�BACK‰BSR„KILLERŠQUIT�IF�NO�TCBS*)BLDTCBS‚LEA„4(A3),A3ˆSTART�OF�TABLE�ENTRY!‰MOVE.B�18(A3),D4‡TASK�PRIORITIES‰LSL.W‚#8,D4‹USE�PRIORITY�TWICE)‰MOVE.B�18(A3),D4‡FOR�BOTH�CURR�AND�LIMIT ‰SWAPƒD4ŽPRIORITIES�TO�UPPER�1/2!‰MOVE.W�22(A3),D4‡TASK�ATTRIBUTES‰MOVE.L�24(A3),D5‡ENTRY�ADDRESS ‰CLR.L‚D6‰MOVE.W�16(A3),D6‡USER�NUMBER,‰MOVE.W�#$8000,D7‡OPTIONS�-�MONITOR�SUPPLIED1‰MOVE.L�#T0CRTCB,D0…DIRECTIVE�NUMBER�-�CREATE�TCB‰TRAPƒ#0ŽEXEC�DIRECTIVE$‰BRA.S‚BLDTCB2‰BRANCH�IF�GOOD�RETURN&‰BSR.S‚KILLERŠQUIT�IF�REQUEST�REJECTED*#BLDTCB2‚MOVE.W�20(A3),D2‡STATE�WORD#‰MOVE.W�D2,TCBSTATE(A5)�SAVE�IN�TCB!‰BTSTƒ#TSK2NRDY,D2„ON�READY�LIST?‰BEQ.S‚BLDTCB3‰BRANCH�IF�NO3‰MOVE.L�READYHD,TCBREADY(A5)‚LINK�TO�PREVIOUS�ENTRY ‰MOVE.L�A5,READYHD†ADD�NEW�ENTRY**ˆPUT�TST�INFO�INTO�TCB*+BLDTCB3‚LEA„28(A3),A2‡START�OF�TST�MMU�INFO)‰MOVE.L�#SEGMENTS-1,D0‚MAX�#�SEGMENTS�-�1‰CLR.L‚D1ŽCLEAR�FOR�COUNT%BLDTCB4‚TST.W‚6(A2)‹TEST�SEGMENT�TYPE#‰BEQ.S‚BLDTCB6‰BRANCH�IF�NO�SEGMENT$‰ADD.L‚#1,D1‹COUNT�SEGMENTS�EXISTING.BLDTCB6‚LEA„8(A2),A2ˆINCREMENT�TO�NEXT�SEGMENT*‰DBRAƒD0,BLDTCB4†DECREMENT�AND�BRANCH�BACK*$‰LEA„28(A3),A3‡START�OF�TST�MMU�INFO(‰MOVE.L�TCBTST(A5),A4ƒADDRESS�OF�NEW�TST.‰MOVE.B�D1,TSTCSEGS(A4)�SAVE�ACTUAL�#�SEGMENTS,‰LEA„TSTMMU(A4),! A4ƒADDRESS�OF�MMU�WITHIN�TST-‰MOVE.L�#4*SEGMENTS-1,D0‚#�LONG�WORDS�TO�MOVE2BLDTCB8‚MOVE.L�(A3)+,(A4)+…MOVE�MMU�AND�ATTRIBUTES(‰DBRAƒD0,BLDTCB8†CONTINUE�TILL�ALL�MOVED‰CMP.L‚#'!TCB',(A3)„MORE�TCB'S?‰BEQ„BLDTCBS‰BRANCH�IF�YESBLDTCB99* *ˆSTART�TIMER* ‰XREFƒTIMERST3‰BSR„TIMERST‰INVOKE�CONFIGURATION-DEPENDENT�ROUTINE*(*ˆINDICATE�SYSTEM�RUNNING�ON�FRONT�PANEL*-FPGO†MOVE.L�EXCSTACK,A7„RESTORE�STACK�POINTER)ŠMOVE.W�#$C0,D1ˆWANT�'C0'�IN�PANEL�LIGHTS4ŠBSR.S‚PANELEDE‡SET�LIGHTS�-�ENABLE�READY/FAIL�LIGHT**‰GO�TO�EXEC�-�INIT�COMPLETE*:INITEND‚MOVE.L�DISPATCH(PC),-(A7)‚ADDRESS�OF�START�OF�EXEC‰RTS˜GO�TO�EXEC*%*ƒKILLER�ROUTINE�--�ERROR�DURING�INIT*KILLERƒPEA…(A6)ŽSAVE�REGISTER�6 ‰LEA…CRASHSAV,A6ƒCRASH�SAVE�AREA'‰MOVE.L‚4(A7),(A6)ˆSAVE�PROGRAM�COUNTER%‰MOVE.W‚SR,4(A6)ŠSAVE�STATUS�REGISTER.‰MOVE.W‚#$2700,SR‰BE�SURE�INTERRUPTS�INHIBITED ‰LEA…8(A6),A6ŠREGISTER�SAVE�AREA-‰MOVEM.L�D0-D7/A0-A5,(A6)‚SAVE�MOST�REGISTERS$‰MOVE.L‚(A7)+,56(A6)†SAVE�REGISTER�6$‰MOVE.L‚A7,60(A6)‰SAVE�STACK�POINTER'KILLOOP‚MOVE.W‚#$A2,D1‹WANT�'A2'�IN�LED/‰BSR.SƒPANELEDEŠPUT�IT�THERE�-�ALLOW�FAIL�LIGHT4‰BRA…KILLOOP‹LOOP�-�WAIT�FOR�SOMEONE�TO�DO�SOMETHING‰PAGE* *ˆTABLE�CLEAR*'TBLCLRƒMOVE.L�D2,D6„GET�LENGTH�IN�PAGES‰LSL.L‚#8,D6„LENGTH�IN�BYTES!TBLCLRB‚MOVE.L�D6,A6„LENGTH�IN�A6‰ADD.L‚A0,A6„END�+�1�IN�A6$‰CLR.L‚D6‡THE�ZERO�THAT�GET'S�STORED&TBLCLRL‚MOVE.L�D6,-(A6)�STORE�ONE�WORD‰CMP.L‚A0,A6„DONE?&‰BGT.S‚TBLCLRL‚BRANCH�BACK�IF�NOT�DONE‰RTS�GO�BACK�WHEN�DONE*#*ƒPANELEDE�--�ENABLE‚TTO�--�SET�LED$*ƒPANELEDD�--�DISABLE�TTO�--�SET�LED*-PANELEDE�MOVE.W�#$10,D0‰CLEAR�DISABLE�TTO�BIT&‰BRA.S‚PANELD2‰SKIP�AROUND�OTHER�ENTRY+PANELEDD�MOVE.W�#$90,D0‰SETƒDISABLE�TTO�BIT*PANELD2‚NOT.B‚D1ŽUSE�COMPLEMENT�TO�SET�LED‰ROR.L‚#4,D1‹SEPARATE�DIGITS‰OR.BƒD1,D0‹PUT�MSD�IN�D0‰MOVE.W�#$02,D1‰'SET�LSD'�FLAG‰ROL.L‚#4,D1‹LSD�IN�D1!‰MOVE.L�PANEL,A1ˆADDRESS�OF�PANEL'‰LEA„FPLEDST(A1),A1‚LED�STATUS�REGISTER+‰MOVE.W�D1,(A1)‰SET�LEAST�SIGNIFICANT�DIGIT‰OR.Wƒ#$30,D1‰SET�LATCH�BITS‰MOVE.W�D1,(A1)‰LATCH�IT*‰MOVE.W�D0,(A1)‰SET�MOST�SIGNIFICANT�DIGIT‰OR.Wƒ#$30,D0‰SET�LATCH�BITS‰MOVE.W�D0,(A1)‰LATCH�IT‰RTS +ŠTTL‡INIT�MEMORY�PARTITIONS�-�DOCUMENTATIONŠPAGEN*********************************************************************************.***‚Name:‚IMEM�(initialize_memory_partitions).*** ***‚Function:A***ŠChecks�all�memory�locations�described�in�the�SYSGENed�MEMTBL.F***…Maps�out�any�"holes"�in�memory.‚Sets�up�FML�(free�memory�list)�andC***…FML_HEADER�(free�memory�list�header)�in�each�partition.‚Sets�upE***…MEMTBL�(memory�mapping�table)�immediately�after�the�FML_HEADER�in***…partition�zero.*** ***‚Inputs:H***…1.)‚Src_memtbl�(created�by�SYSGEN)�located�at�address�MEMTABL�within***ŠINITDAT�data�area.*** ***‚Outputs:I***…1.)‚Dest_memtbl�located�immediately�after�the�FML_HEADER�in�partition ***Šzero.G***…2.)‚MAPBEG�longword�in�SYSPAR�data�area.‚Points�to�the�dest_memtbl.***Š(Item�#1�above.)E***…3.)‚FML_HEADERs�for�all�RAM�memory�partitions.‚(Pointed�to�by�the***Šdest_memtbl.)@***…4.)‚FMLs�for�all�RAM�memory�partitions.‚(Pointed�to�by�their***ŠFML_HEADERs.)******‚Side�effects:C***…1.)‚All�registers�destroyed,�except�for�the�stack�pointer�(A7).)***…2.)‚Might�never�return�(call�KILLER).***H***‚Explanation:‚This�routine�is�basically�a�driver�for�initializing�theB***…memory�partitions.‚It�is�primarily�concerned�with�initializingI***…partition�zero.‚The�last�subroutine�call�(call�init_next_partitions),H***…handles�the�initialization�of�all�memory�partitions�except�partitionI***…zero.‚This�unique�handling�of�partition�zero�is�neccessary�due�to�theI***…fact�that�the�INIT�module�resides�in�a�portion�of�partition�zero�thatD***…will�later�be�used�by�the�system.‚We�obviously�cannot�clear�this ***…memory.***D***ŠThe�first�call�sets�up�the�neccessary�pointers�to�the�src_memtblF***…and�to�partition�zero.‚The�next�call�will�build�the�FML�(clear�anyE***…memory�not�in�the�" INIT�module,�map�out�any�"holes"�in�memory,�andA***…set�up�the�FML�linked�list�describing�the�available�memory�inG***…partition�zero).‚If�the�first_node_ptr�is�returned�as�zero,�then�weF***…did�not�find�even�one�256�byte�block�of�available�memory.‚Since�weE***…need�at�least�one�block�in�partition�zero�for�the�MEMTBL,�this�is3***…obviously�a�fatal�error,�and�so�we�call�KILLER.***F***ŠNext�we�call�build_fml_header�to�build�the�FML_HEADER�in�partitionE***…zero.‚If�the�fml_header_ptr�is�returned�as�zero,�then�we�couldn'tC***…find�enough�memory�in�partition�zero�for�the�FML_HEADER�and�theG***…dest_memtbl,�so�we�cannot�continue,�and�therefore�must�call�KILLER.***@***ŠOtherwise,�we�set�our�dest_memtbl_ptr�to�point�to�the�memory@***…immediately�after�the�FML_HEADER�for�partition�zero,�and�setF***…the�MAPBEG�variable�in�SYSPAR�equal�to�this�value.‚Finally�we�callF***…build_ram_memtbl_entry�to�record�this�ram�partition�in�the�MEMTBL,D***…and�call�init_next_partitions�to�initialize�all�partitions�after***…partition�zero.***L****************************************************************************2‰TTL‡INIT�MEMORY�PARTITIONS�-�REGISTER�ASSIGNMENTS‰PAGEL**********************************************************************************…A0�=�src_memtbl_ptr;7***ŠPoints�to�the�"source"�MEMTBL�in�INITDAT�data�area.******…A1�=�dest_memtbl_ptr;<***ŠPoints�to�the�"destination"�MEMTBL�immediately�after�the!***ŠFML_HEADER�in�partition�zero.***+***…A2�=�temp_memtbl_ptr/previous_node_ptr;?***ŠShared�register.‚During�check_memmap_conflict�it�is�used�toB***Šstep�through�the�dest_memtbl�looking�for�conflicts�between�theB***Š"current"�RAM�partition�(pointed�to�by�the�src_memtbl_ptr)�andB***Šany�previously-defined�RAM�partitions�(pointed�to�by�the�temp_***Šmemtbl_ptr.)C***ŠDuring�build_fml�(and�its�subroutine�build_fml_node)�A2�is�used;***Što�point�to�the�"previous"�node�in�the�FML�linked�list.******…A3�=�first_node_ptr;0***ŠPoints�to�the�first�node�in�the�current�FML.******…A4�=�last_node_ptr;/***ŠPoints�to�the�last�node�in�the�current�FML.***&***…A5�=�clear_mem_ptr/fml_header_ptr;@***ŠShared�register.‚During�build_fml�(and�build_fml_node)�it�is<***Šused�to�point�to�the�next�memory�location�to�be�cleared.<***ŠDuring�all�the�other�routines�it�is�used�to�point�to�the***ŠFML_HEADER�block.***…A6�=�scratch;****** ***…D0�=�0;B***ŠUsed�for�zeroing�out�memory,�and�checking�if�address�registers***Šare�equal�to�zero.******…D1-D3�=�scratch;******…D4�=�start_of_part_ptr;:***ŠPoints�to�the�start�of�the�"current"�memory�partition.******…D5�=�end_of_part_ptr;8***ŠPoints�to�the�end�of�the�"current"�memory�partition.******…D6�=�bytes_cleared;>***ŠContains�a�count�of�the�number�of�the�bytes�cleared�in�the?***Š"current"�memory�partition.‚When�we�find�a�"hole"�in�memory@***Š(take�a�bus_error),�then�we�stop�incrementing�bytes_cleared.C***ŠThus�bytes_cleared�will�contain�a�count�of�the�number�of�"good"?***Šbytes�in�the�current�block�of�the�current�memory�partition.D***ŠThis�value�will�be�used�to�describe�the�ammount�of�"free"�memory***Šin�the�current�block.******…D7�=�fml_header_len;C***ŠContains�a�count�of�the�number�of�256�byte�blocks�neccessary�toA***Šdescribe�the�"current"�FML_HEADER.‚This�value�is�usually�one.@***ŠIt�was�made�into�a�variable�in�order�to�accommodate�the�caseA***Šwhere�the�FML_HEADER�(26�bytes)�and�the�dest_memtbl�("n"�*�10>***Šbytes)�required�more�than�one�256�byte�block.‚This�added�a<***Šcertain�ammount�of�complexity�to�the�algorityhms,�but�itA***Šremoved�the�rather�arbitrary�restriction�that�the�dest_memtblB***Šmust�be�limited�to�(256�-�26)�/�10�or�23�entries.‚(Dest_memtbl2***Šcould�only�describe�23�RAM�or�ROM�partitions.)***L****************************************************************************'‰TTL‡INIT�MEMORY�PARTITIONS�-�ALGORITHM‰PAGE#*init_memory_partitions: procedure;"     *ˆcall�init_pointers;*ˆcall�build_fml;*ˆif�(first_node_ptr�=�0)*ˆthen�call�KILLER;*ˆcall�build_fml_header;*ˆif�(fml_header_ptr�=�0)*ˆthen�call�KILLER;;*ˆdest_memtbl_ptr�<==�fml_header_ptr�+�length�(fml_header);&*ˆSYSPAR�(MAPBEG)�<==�dest_memtbl_ptr;*ˆcall�build_ram_memtbl_entry;*ˆcall�init_next_partitions;  *end init_memory_partitions;ŠPAGE"ŠTTL„INIT�MEMORY�PARTITIONS�-�CODE*#*init_memory_partitions: procedure;*IMEM:**ˆcall�init_pointers;*ˆcall�build_fml;*ˆif�(first_node_ptr�=�0)*ˆthen�call�KILLER;* ŠBSR.S‚IPTRS ŠBSR„BFML ŠIF.L�A3��D0�THEN.S ŠBSR„KILLERŠENDI **ˆcall�build_fml_header;*ˆif�(fml_header_ptr�=�0)*ˆthen�call�KILLER;;*ˆdest_memtbl_ptr�<==�fml_header_ptr�+�length�(fml_header);&*ˆSYSPAR�(MAPBEG)�<==�dest_memtbl_ptr;* ŠBSR„BFMLHEAD ŠIF.L�A5��D0�THEN.S ŠBSR„KILLERŠENDI ŠLEA„FMLHDSZ(A5),A1 ŠMOVE.L�A1,MAPBEG **ˆcall�build_ram_memtbl_entry;*ˆcall�init_next_partitions;* ŠBSR„BRAMNODE ŠBSR.S‚INEXTMEM **end init_memory_partitions;*ŠRTS "ŠTTL‡INIT�POINTERS�-�DOCUMENTATIONŠPAGEN********************************************************************************* ***…Name:‚IPTRS�(init_pointers):*** ***…Function:A***ŠInitializes�all�pointers�and�counters�for�initializing�memory***„partition�zero.*** ***…Inputs:1***ˆ1.)‚Src_memtbl�in�INITDAT�at�address�MEMTABL.*** ***…Outputs:***ˆ1.)‚A0�=�src_memtbl_ptr;***ˆ2.)‚A5�=�clear_mem_ptr;***ˆ3.)‚D0�=�0;***ˆ4.)‚D4�=�start_of_part_ptr;***ˆ5.)‚D5�=�end_of_part_ptr;***ˆ6.)‚D6�=�bytes_cleared;***ˆ7.)‚D7�=�fml_header_len;******…Side�effects:****ˆ1.)‚A2�(temp_memtbl_ptr)�is�destroyed.$***ˆ2.)‚D1�(scratch)�gets�destroyed.)***ˆ3.)‚Might�never�return�(call�KILLER).******…Explanation:***?***ŠFirst�we�initialize�D0�and�the�src_memtbl_ptr.‚If�the�firstI***…entry�in�the�src_memtbl�is�not�a�RAM�partition�whose�partition�number<***…is�zero,�then�we�cannot�continue,�and�so�we�call�KILLER.***E***ŠNext�we�initialize�fml_header_len�to�equal�the�number�of�256�byteG***…blocks�neccessary�to�contain�the�FML_HEADER�for�partition�zero,�andB***…one�entry�in�the�dest_memtbl�for�every�entry�in�the�src_memtbl9***…(including�the�last�entry�delimiting�the�src_memtbl).***D***ŠNow�we�initialize�the�end_of_part_ptr�to�point�to�the�"floor"�ofB***…the�MAPENDA�field�of�the�first�entry�in�the�src_memtbl.‚(Note:H***…throughout�these�algorithms�we�will�always�take�the�"ceiling"�of�theH***…start�of�the�partition,�and�the�"floor"�of�the�end�of�the�partition.K***…This�insures�that�all�partitions�start�and�end�on�a�256�byte�block,�andG***…also�that�we�only�grab�the�same�ammount�of�memory,�or�less,�that�is%***…described�within�the�src_memtbl.)***E***ŠNow,�if�the�exec�is�in�partition�zero,�then�the�start_of_part_ptrD***…points�to�the�next�256�byte�block�after�the�end�of�the�exec,�theJ***…clear_mem_ptr�points�to�the�next�256�byte�block�after�the�start�of�theH***…INIT�module,�and�bytes_cleared�gets�set�to�the�displacement�from�theI***…start�of�the�INIT�module�to�the�end�of�the�INITDAT�data�area�(also�onH***…a�256�byte�boundary).‚The�clear_mem_ptr�and�bytes_cleared�are�set�upF***…in�this�way�in�order�to�tell�the�build_fml�subroutine�that�we�haveG***…started�clearing�memory�at�the�location�pointed�to�by�clear_mem_ptr@***…and�we�have�already�cleared�bytes_cleared�locations.‚This�isI***…neccessary�because�we�wish�to�reclaim�the�memory�occupied�by�the�INITD***…module�as�free�memory�in�partition�zero,�but�we�obviously�cannotG***…clear�it�out�at�this�point�in�time.‚Thus�we�must�fake�out�build_fmlB***…into�thinking�that�we�have�already�cleared�the�INIT�portion�ofI***…partition�zero.‚Finally,�if�TCBHEAD�=�0,�(we�have�mini�TCBs�followingF***…the�src_memtbl),�then�we�increment�bytes_cleared�by�$800�to�insure)***…that�we�don't�zero�out�the�mini�TCBs.***D***ŠIf�the�exec�is�not�i# n�partition�zero,�then�we�set�both�start_of_G***…part_ptr�and�clear_mem_ptr�to�point�to�the�next�256�byte�page�after8***…the�SYSPAR�data�area,�and�set�bytes_cleared�to�zero.***B***ŠFinally,�if�the�start_of_part_ptr�and�end_of_part_ptr�describeF***…a�partition�that�does�not�contain�some�positive�ammount�of�memory,=***…then�we�obviously�cannot�continue,�and�so�we�call�KILLER.***L**************************************************************************** ‰TTL‡INIT�POINTERS�-�ALGORITHM‰PAGE*init_pointers: procedure;   *ˆDO�<==�0;.*ˆsrc_memtbl_ptr�<==�addr�(INITDAT�(MEMTABL));0*ˆif�(MAPMTYP.MAPPART�(src_memtbl_ptr)�<>�$0000)*ˆthen�call�KILLER; *ˆfml_header_len�<==�0;%*ˆtemp_memtbl_ptr�<==�src_memtbl_ptr;7*ˆdo�until�(MAPMTYP.MAPPART�(temp_memtbl_ptr)�=�$FFFF);%*’fml_header_len�<==�fml_header_len�+*¥length�(dest_memtbl_entry);'*’temp_memtbl_ptr�<==�temp_memtbl_ptr�+*¦length�(src_memtbl_entry); *ˆend;C*ˆfml_header_len�<==�(length�(fml_header)�+�length�(memtbl_entry)�+,*œ(temp_memtbl_ptr�-�src_memtbl_ptr))�/�256; 7*ˆend_of_part_ptr�<==�floor�(MAPENDA�(src_memtbl_ptr));)*ˆif�(exec�is�in�partition�xero)�then�do;.*’start_of_part_ptr�<==�ceil�(INITDAT�(EEND));(*’clear_mem_ptr�<==�ceil�(addr�(START));5*’bytes_cleared�<==�ceil�(addr�(INITDAT�(ENDMEMT)))�-*¤clear_mem_ptr;*’if�(INITDAT�(TCBHEAD)�=�0).*’then�bytes_cleared�<==�bytes_cleared�+�$800;*ˆend; *ˆelse�do;7*’start_of_part_ptr�<==�ceil�(addr�(SYSPAR�(ENDSYSP)));&*’clear_mem_ptr�<==�start_of_part_ptr;*’bytes_cleared�<==�0;*ˆend; +*ˆif�(start_of_part_ptr�>=�end_of_part_ptr)*ˆthen�call�KILLER;  *end init_pointers; ŠTTL„INIT�POINTERS�-�CODEŠPAGE**init_pointers: procedure;* IPTRS:* *ˆD0�<==�0;.*ˆsrc_memtbl_ptr�<==�addr�(INITDAT�(MEMTABL));,*ˆif�(MAPMTYP.MAPPART�(src_memtbl_ptr)�<>�0)*ˆthen�call�KILLER;* ŠCLR.L‚D0 ŠLEA„MEMTABL(PC),A0 ŠIF.W�(A0)��D0�THEN.S ŠBSR„KILLERŠENDI **ˆfml_header_len�<==�0;%*ˆtemp_memtbl_ptr�<==�src_memtbl_ptr;7*ˆdo�until�(MAPMTYP.MAPPART�(temp_memtbl_ptr)�=�$FFFF);%*’fml_header_len�<==�fml_header_len�+*¥length�(dest_memtbl_entry);'*’temp_memtbl_ptr�<==�temp_memtbl_ptr�+*¦length�(src_memtbl_entry);*ˆend;* ŠCLR.L‚D7 ŠLEA„(A0),A2 ŠREPEATŠADD.L‚#MAPENTSZ,D7ŠLEA„12(A2),A2ŠUNTIL.W�(A2)��#$FFFF *5*ˆfml_header_len�<==�ceil�(length�(fml_header_node)�+*¡fml_header_len�+$*¡length�(dest_memtbl_entry))�/�256;7*ˆend_of_part_ptr�<==�floor�(MAPENDA�(src_memtbl_ptr));*!ŠADD.L‚#(FMLHDSZ+MAPENTSZ+255),D7 ŠLSR.L‚#8,D7 ŠMOVE.L�MAPENDA(A0),D5 ŠCLR.B‚D5 *)*ˆif�(exec�is�in�partition�zero�then�do);.*’start_of_part_ptr�<==�ceil�(INITDAT�(EEND));(*’clear_mem_ptr�<==�ceil�(addr�(START));5*’bytes_cleared�<==�ceil�(addr�(INITDAT�(ENDMEMT)))�-*¤clear_mem_ptr;*’if�(INITDAT�(TCBHEAD)�=�0).*’then�bytes_cleared�<==�bytes_cleared�+�$800;*ˆend;**ŠMOVE.L�EEND(PC),D4ˆD4�<==�INITDAT�(EEND).8ŠIF.L�D4��D5�THEN.S†If�(exec_end�<�end_of_part_ptr),!*§Then�exec�is�in�partition�zero;ŠADD.L‚#255,D4 ŠCLR.B‚D4 ŠLEA„255+START(PC),A5 ŠMOVE.L�A5,D1 ŠCLR.B‚D1 ŠMOVE.L�D1,A5 ŠLEA„255+ENDMEMT(PC),A6 ŠMOVE.L�A6,D6 ŠCLR.B‚D6 ŠSUB.L‚A5,D6 ŠIF.L�TCBHEAD(PC)��D0�THEN.SŠADD.L‚#$800,D6ŠENDI * *ˆelse�do;7*’start_of_part_ptr�<==�ceil�(addr�(SYSPAR�(ENDSYSP)));&*’clear_mem_ptr�<==�start_of_part_ptr;*’bytes_cleared�<==�0;*ˆend;*ŠELSE.SŠMOVE.L�#ENDSYSP+255,D4 ŠCLR.B‚D4 ŠMOVE.L�D4,A5 ŠCLR.L‚D6ŠENDI *+*ˆif�(start_of_part_ptr�>=�end_of_part_ptr)*ˆthen�call�KILLER;*ŠIF.L�D4��D5�THEN.S ŠBSR„KILLERŠENDI **end init_pointers;*ŠRTS )ŠTTL„INIT_NEXT_PARTITIONS�-�DOCUMENTATIONŠPAGEN*************************************************************************************…Name:‚INEXTMEM�(init_next_partitions):*** ***…Function:=***ŠInitializes�all�partit# ions�except�partition�zero.‚For�ROMH***„partitions,�we�make�an�entry�in�the�dest_memtbl.‚For�RAM�partitions,A***„we�insure�that�no�conflict�exists�with�a�previously-describedH***„partition,�build�the�FML,�build�the�FML_HEADER,�and�make�an�entry�in***„the�dest_memtbl.*** ***…Inputs:***ˆ1.)‚A0�=�src_memtbl_ptr;2***�(Points�to�the�first�entry�in�the�src_memtbl.)***ˆ2.)‚A1�=�dest_memtbl_ptr;3***�(Points�to�the�first�entry�in�the�dest_memtbl.)*** ***…Outputs:***ˆ1.)‚Dest_memtbl.#***ˆ2.)‚FML�for�all�RAM�partitions.+***ˆ3.)‚FML_HEADERs�for�all�RAM�partitions.******…Side�effects:B***ˆ1.)‚Most�registers�are�destroyed,�except�for�the�stack�pointer ***�(A7).******…Explanation:D***ŠWe�keep�looping�until�the�MAPMTYP�and�MAPPART�fields�of�the�nextH***…entry�in�the�src_memtbl�both�contain�$FF.‚(This�indicates�the�end�ofH***…the�memtbl.)‚When�we�see�the�end�of�the�src_memtbl,�then�we�write�an.***…end�entry�for�the�dest_memtbl,�and�return.***E***ŠFor�every�good�entry�in�the�src_memtbl�we�call�init_next_pointersG***…to�set�up�our�pointers�and�counters�for�this�memory�partition.‚ThenE***…if�the�MAPMTYP�field�of�the�src_memtbl�entry�=�$FF,�we�have�a�ROM4***…partition�and�so�we�call�build_rom_memtbl_entry.***8***ŠFor�every�RAM�entry�in�the�src_memtbl,�we�first�callG***…check_memmap_conflict�to�insure�that�the�current�RAM�partition�doesH***…not�conflict�in�any�way�with�a�previously-described�partition.‚ThereG***…are�three�possible�return�conditions�from�the�check_memmap_conflict***…subroutine:'***Š1.)‚A�fatal�conflict�was�detected�-;***�Execution�will�never�return�(check_memmap_conflict�will***�call�KILLER).@***Š2.)‚This�partition�is�an�alias�of�a�previous�partition�(both+***�partitions�start�at�the�same�address)�-;***�Execution�will�return,�and�the�got_alias_partition_flag***�will�be�set.+***Š3.)‚This�partition�is�a�new�partition�-;***�Execution�will�return,�and�the�got_alias_partition_flag***�will�be�reset.H***…Therefore,�if�execution�returns,�and�the�got_alias_partition_flag�is@***…set,�we�call�build_ram_memmap_entry�to�build�an�entry�in�the(***…dest_memtbl�for�the�alias�partition.***C***ŠIf�execution�returns�and�the�got_alias_partition_flag�is�reset,H***…then�we�call�build_fml�to�build�the�free�memory�list�for�the�new�RAMI***…partition.‚Then�if�the�first_node_ptr�is�not�equal�to�zero,�build_fmlH***…found�at�least�one�256�byte�page�of�memory�in�the�new�partition,�andG***…so�we�call�build_fml_header�to�build�the�FML_HEADER�for�the�currentG***…partition.‚Now,�since�this�is�not�partition�zero,�and�therefore�allG***…FML_HEADERs�require�only�one�256�byte�block�of�memory,�we�know�thatI***…build_fml_header�successfully�found�room�for�the�FML_HEADER�and�so�weE***…can�call�build_ram_memtbl_entry�to�build�an�entry�for�the�current!***…partition�in�the�dest_memtbl.***N****************************************************************************** %ŠTTL„INIT�NEXT�PARTITIONS�-�ALGORITHMŠPAGE!*init_next_partitions: procedure;    >*ˆdo�while�(MAPMTYP.MAPPART�(next�(src_memtbl_ptr))�<>�$FFFF);*’call�init_next_pointers;%*’if�(MAPMTYP�(src_memtbl_ptr)�=�$FF)#*’then�call�build_rom_memtbl_entry; *’else�do;*œcall�check_memmap_conflict;%*œif�(got_alias_partition_flag�=�set)#*œthen�call�build_ram_memmap_entry; *œelse�do;*¦call�build_fml;#*¦if�(first_node_ptr�<>�0)�then�do;*°call�build_fml_header;*°call�build_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;4*ˆMAPTYP.MAPPART�(next�(dest_memtbl_ptr))�<==�$FFFF;  *end init_next_partitions; 'ŠTTL„INIT�NEXT�MEMORY�PARTITIONS�-�CODEŠPAGE*!*init_next_partitions: procedure;* INEXTMEM:*>*ˆdo�while�(MAPMTYP.MAPPART�(next�(src_memtbl_ptr))�<>�$FFFF);*’call�init_next_pointers;%*’if�(MAPMTYP�(src_memtbl_ptr)�=�$FF)#*’then�call�build_rom_memtbl_entry;* ŠWHILE.W�12(A0)��#$FFFF�DO.S ŠBSR.S‚INEXTPTRS ŠIF.B�(A0)��#$FF�THEN.S ŠBSR„BROMNODE * *’else�do;*œcall�check_m$ emmap_conflict;%*œif�(got_alias_partition_flag�=�set)#*œthen�call�build_ram_memtbl_entry;*ŠELSE.S ŠBSR„CMEMCONF ŠTST.B‚D2ŠIF��THEN.S ŠBSR„BRAMNODE * *›else�do;*¦call�build_fml;#*¦if�(first_node_ptr�<>�0)�then�do;*°call�build_fml_header;*°call�build_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;*ŠELSE.S ŠBSR.S‚BFML ŠIF.L�A3��D0�THEN.S ŠBSR„BFMLHEAD ŠBSR„BRAMNODEŠENDIŠENDIŠENDIŠENDW *5*ˆMAPMTYP.MAPPART�(next�(dest_memtbl_ptr))�<==�$FFFF;*#ŠMOVE.W�#$FFFF,MAPMTYP+MAPENTSZ(A1) **end init_next_partitions;*ŠRTS 'ŠTTL„INIT�NEXT�POINTERS�-�DOCUMENTATIONŠPAGEM********************************************************************************)***…Name:‚INEXTPTRS�(init_next_pointers):*** ***…Function:C***ŠInitializes�all�pointers�and�counters�for�all�memory�partitions***…except�partition�zero.*** ***…Inputs:'***ˆ1.)‚A0�=�previous�(src_memtbl_ptr).(***ˆ2.)‚A1�=�previous�(dest_memtbl_ptr).*** ***…Outputs:&***ˆ1.)‚A0�=�current�(src_memtbl_ptr).'***ˆ2.)‚A1�=�current�(dest_memtbl_ptr).***ˆ3.)‚A5�=�clear_mem_ptr.***ˆ4.)‚D4�=�start_of_part_ptr.***ˆ5.)‚D5�=�end_of_part_ptr.***ˆ6.)‚D6�=�bytes_cleared.***ˆ7.)‚D7�=�fml_header_len.******…Side�effects:1***ˆ1.)‚Execution�might�not�return�(call�KILLER).******…Explanation:@***ŠFirst�we�set�the�fml_header_len�to�one�(any�partition�exceptG***…partition�zero�requires�only�one�256�byte�page�for�its�FML_HEADER),@***…and�advance�both�the�src_memtbl_ptr�and�the�dest_memtbl_ptr.***C***ŠNext�we�set�the�start_of_part_ptr�to�the�ceiling�of�the�MAPSTRAH***…field�in�the�src_memtbl,�and�the�end_of_part_ptr�to�the�floor�of�theH***…MAPENDA�field.‚(Note�that�we�always�align�our�partitions�on�256�byteI***…page�boundaries,�and�that�we�always�round�to�the�same�ammount�or�less+***…memory�as�described�in�the�src_memtbl).***D***ŠWe�then�set�clear_mem_ptr�to�the�value�of�start_of_part_ptr,�andE***…set�bytes_cleared�to�zero.‚(Thus�we�will�start�clearing�memory�atG***…the�start�of�the�current�partition.)‚Finally,�we�call�KILLER�if�theG***…current�partition�described�by�the�src_memtbl�does�not�contain�some'***…positive�number�of�pages�of�memory.***L**************************************************************************** #ŠTTL„INIT�NEXT�POINTERS�-�ALGORITHMŠPAGE*init_next_pointers: procedure;    *ˆfml_header_len�<==�1;@*ˆsrc_memtbl_ptr�<==�src_memtbl_ptr�+�length�(src_memtbl_entry);C*ˆdest_memtbl_ptr�<==�dest_memtbl_ptr�+�length�(dest_memtbl_entry); 8*ˆstart_of_part_ptr�<==�ceil�(MAPSTRA�(src_memtbl_ptr));7*ˆend_of_part_ptr�<==�floor�(MAPENDA�(src_memtbl_ptr));&*ˆclear_mem_ptr�<==�start_of_part_ptr;*ˆbytes_cleared�<==�0; +*ˆif�(start_of_part_ptr�>=�end_of_part_ptr)*ˆthen�call�KILLER;  *end init_next_pointers; ŠTTL„INIT�NEXT�POINTERS�-�CODEŠPAGE**init_next_pointers: procedure* INEXTPTRS: **ˆfml_header_len�<==�1;@*ˆsrc_memtbl_ptr�<==�src_memtbl_ptr�+�length�(src_memtbl_entry);C*ˆdest_memtbl_ptr�<==�dest_memtbl_ptr�+�length�(dest_memtbl_entry);* ŠMOVE.L�#1,D7 ŠLEA„12(A0),A0 ŠLEA„MAPENTSZ(A1),A1 *8*ˆstart_of_part_ptr�<==�ceil�(MAPSTRA�(src_memtbl_ptr));7*ˆend_of_part_ptr�<==�floor�(MAPENDA�(src_memtbl_ptr));&*ˆclear_mem_ptr�<==�start_of_part_ptr;*ˆbytes_cleared�<==�0;*ŠMOVE.L�MAPSTRA(A0),D4ŠADD.L‚#255,D4 ŠCLR.B‚D4 ŠMOVE.L�MAPENDA(A0),D5 ŠCLR.B‚D5 ŠMOVE.L�D4,A5 ŠCLR.L‚D6 *+*ˆif�(start_of_part_ptr�>=�end_of_part_ptr)*ˆthen�call�KILLER;*ŠIF.L�D4��D5�THEN.S ŠBSR„KILLERŠENDI **end init_next_pointers;*ŠRTS ŠPAGEŠTTL„BUILD�FML�-�DOCUMENTATIONL**********************************************************************************…Name:‚BFML�(build_fml):*** ***…Function:>***ŠBuild_fml�will�zero�out�memory�starting�at�clear_mem_ptr�+A***…bytes_cleared,�and�build�the�free�memory�list�to�describe�theF***…partition.‚I$ t�also�detects�"holes"�in�the�partition,�and�describes3***…them�as�"used"�memory�within�the�current�block.*** ***…Inputs:***ˆ1.)‚A5�=�clear_mem_ptr.***ˆ2.)‚D4�=�end_of_part_ptr.***ˆ3.)‚D6�=�bytes_cleared.*** ***…Outputs:=***ˆ1.)‚A3�=�first_node_ptr�(from�subroutine�build_fml_node).***ˆ2.)‚A4�=�last_node_ptr."***ˆ3.)‚FML�for�current�partition.******…Side�effects:,***ˆ1.)‚A2�(previous_node_ptr)�is�destroyed.2***ˆ2.)‚A5�(clear_mem_ptr)�=�D5�(end_of_part_ptr)./***ˆ3.)‚D1,�D2,�and�D3�(scratch)�are�destroyed.(***ˆ4.)‚D6�(bytes_cleared)�is�destroyed.-***ˆ5.)‚Might�not�return�(might�call�KILLER).******…Explanation:B***ŠFirst�we�initialize�the�first_node_ptr�to�zero.‚This�tells�theH***…build_fml_node�subroutine�that�we�are�working�with�the�first�node�in ***…the�FML.***C**ŠNote�that�the�clear_next_node�and�build_last_fml_node�labels�canI***…both�be�jumped�to�by�the�code�for�handling�bus�errors�(build_fml_be).***B***ŠAt�clear_next_node�we�update�last_node_ptr�to�the�value�of�theC***…clear_mem_ptr.‚(Last_node_ptr�is�an�input�to�the�build_fml_nodeG***…subroutine�telling�him�where�the�"last"�or�current�node�is�located,H***…and�is�also�an�output�from�this�routine�telling�the�caller�where�theH***…last�node�in�the�FML�is�located.)‚We�also�increment�clear_mem_ptr�byE***…the�value�of�bytes_cleared.‚(This�is�neccessary�in�order�to�"skipD***…over"�and�not�initialize�the�INIT�code�when�building�the�FML�for***…partition�zero.***B***ŠNext�we�set�up�the�stack�so�that�any�bus�error�will�send�us�toI***…build_fml_be.‚This�is�the�code�that�will�be�used�for�mapping�over�any$***…"holes"�in�the�memory�partition.***D***ŠNow�we�loop�until�we�either�clear�the�rest�of�the�current�memoryF***…partition�(fall�through�the�loop),�or�find�a�hole�in�memory�(go�to***…build_fml_be).***D***ŠIf�we�do�clear�memory�to�the�end�of�the�current�partition�withinG***…this�loop,�we�must�pop�the�bus�error�vector�junk�off�the�stack,�andI***…calculate�the�value�of�bytes_cleared�(clear_mem_ptr�-�last_node_ptr).F***…This�calculation�is�neccessary�at�this�point�in�order�to�make�thisE***…case�(found�a�block�of�all�good�memory)�look�the�same�as�the�caseE***…where�we�found�some�good�memory�and�then�found�a�"hole"�in�memoryF***…(took�a�bus�error,�and�went�to�build_fml_be).‚In�that�case�we�willH***…"freeze"�bytes_cleared�to�the�value�of�clear_mem_ptr�-�last_node_ptrH***…in�order�to�remember�the�number�of�"good"�bytes�of�memory�within�theI***…current�block,�and�increment�clear_mem_ptr�(by�pages)�until�we�eitherG***…reach�the�end�of�the�partition,�or�we�find�some�more�"good"�memory.I***…Thus�at�that�point�our�current�block�will�be�framed�by�the�last_node_E***…ptr�(points�to�the�start�of�the�current�block),�the�clear_mem_ptrJ***…(point�to�the�end�of�the�current�block),�and�the�bytes_cleared�counterG***…which�holds�the�number�of�"good"�bytes�in�the�current�block�(or�theD***…number�of�bytes�of�free�memory).‚This�is�most�of�the�information&***…needed�to�build�a�node�in�the�FML.***C***ŠFinally,�the�build_last_fml_node�label�will�build�a�node�in�the;***…FML�if�the�value�of�bytes_cleared�is�greater�than�zero.***M***************************************************************************** ŠTTL„BUILD�FML�-�ALGORITHMŠPAGE*build_fml: procedure;    *ˆprevious_node_ptr�<==�0; *clear_next_node:*ˆD1,D2,D3�<==�0;"*ˆlast_node_ptr�<==�clear_mem_ptr;2*ˆclear_mem_ptr�<==�clear_mem_ptr�+�bytes_cleared;*ˆpush�addr�(build_fml_be); *ˆpush�'BE';-*ˆdo�until�(clear_mem_ptr�=�end_of_part_ptr);'*’four_longwords�(clear_mem_ptr)�<==�0;'*’clear_mem_ptr�<==�clear_mem_ptr�+�16;*ˆend;*ˆpop�bus_error�junk�off�stack;2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr; *build_last_fml_node:*ˆif�(bytes_cleared�>�0)*ˆthen�call�build_fml_entry;  *end build_fml; "ŠTTL‡BUILD�FREE�MEMORY�LIST�-�CODEŠPAGE**build_fml: proc% edure;*BFML: **ˆprevious_node_ptr�<==�0;* ŠSUB.L‚A2,A2 **clear_next_node:*ˆD1,D2,D3�<==�0;!*ˆlast_node_ptr�<==�clear_mem_ptr2*ˆclear_mem_ptr�<==�clear_mem_ptr�+�bytes_cleared;*ˆpush�addr�(build_fml_be); *ˆpush�'BE';* CNEXTNODE: ŠCLR.L‚D1 ŠCLR.L‚D2 ŠCLR.L‚D3 ŠLEA„(A5),A4 ŠLEA„(A5,D6.L),A5 ŠPEA„BFMLBE(PC) ŠMOVE.W�#'BE',-(A7) *-*ˆdo�until�(clear_mem_ptr�=�end_of_part_ptr);'*’four_longwords�(clear_mem_ptr)�<==�0;'*’clear_mem_ptr�<==�clear_mem_ptr�+�16;*ˆend;*ŠREPEATŠMOVEM.L�D0-D3,(A5)ŠLEA„16(A5),A5ŠUNTIL.L�A5��D5**ˆpop�bus_error�junk�off�stack;2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;* ŠADD.L‚#6,A7 ŠMOVE.L�A5,D6 ŠSUB.L‚A4,D6 **build_last_fml_node:*ˆif�(bytes_cleared�>�0)*ˆthen�call�build_fml_entry;* BLASTNODE:ŠIF.L�D6��D0�THEN.SŠBSR.S‚BFMLNODEŠENDI **end build_fml;*ŠRTS 4ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�DOCUMENTATIONŠPAGEN************************************************************************************…Explanation:?***ŠThis�code�is�executed�if�we�encounter�a�hole�while�clearing@***…memory.‚Note�the�two�labels�build_fml_be�and�build_fml_be_x.G***…Execution�will�"go�to"�the�build_fml_be�label�if�a�bus�error�occursB***…when�clearing�memory�via�the�loop�in�the�build_fml�subroutine.F***…Likewise,�execution�will�"go�to"�the�build_fml_be_x�label�if�a�busH***…error�occurs�while�looking�at�the�top�of�each�page�of�memory�for�theF***…next�"good"�page.‚(i.e.,�This�block�of�code�contains�a�"bus�error"G***…loop.‚We�keep�going�to�build_fml_be_x�until�we�either�reach�the�end:***…of�the�current�partition,�or�find�some�"good"�memory.)***A***ŠFirst�we�calculate�bytes_cleared�to�be�the�difference�betweenG***…the�clear_mem_ptr�and�the�last_node_ptr.‚Then�we�call�KILLER�if�theJ***…bus�error�occurred�in�the�middle�of�a�page.‚(Bytes_cleared�is�not�on�a***…page�boundary.)***E***ŠOtherwise,�we�update�the�clear_mem_ptr�to�point�to�the�top�of�theG***…next�page�in�memory.‚If�we�are�at�the�end�of�the�current�partition,@***…then�we�go�to�the�build_last_fml_node�label�in�the�build_fml***…subroutine.***B***ŠIf�we�are�not�at�the�end�of�the�partition,�we�set�the�stack�upF***…so�that�a�bus�error�will�send�us�back�to�the�build_fml_be_x�label.G***…Then�we�attempt�to�write�into�the�memory�location�pointed�to�by�theF***…clear_mem_ptr.‚(If�a�bus�error�occurs,�then�execution�will�"go�to"I***…build_fml_be_x,�and�we�will�"loop"�until�we�run�out�of�memory�in�this+***…partition,�or�find�some�"good"�memory.)***D***ŠIf�we�"fall�through"�to�the�next�instruction�(find�a�good�memoryI***…location),�then�we�get�rid�of�the�bus�error�information�on�the�stack.J***…If�we�found�some�good�memory�in�the�current�block�(bytes_cleared�>�0),E***…then�we�call�build_fml_node�to�build�a�node�in�the�FML,�and�resetI***…bytes_cleared�to�zero.‚In�either�case�we�go�to�clear_next_node�in�the***…build_fml�subroutine.***N****************************************************************************** 0ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�ALGORITHMŠPAGE*build_fml_be:2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;$*ˆif�(mod�(bytes_cleared,�256)�<>�0)*ˆthen�call�KILLER; *build_fml_be_x:(*ˆclear_mem_ptr�<==�clear_mem_ptr�+�256;&*ˆif�(clear_mem_ptr�=�end_of_part_ptr)!*ˆthen�go�to�build_last_fml_node;*ˆpush�addr�(build_fml_be_x); *ˆpush�'BE';*ˆword�(clear_mem_ptr)�<==�0;*ˆpop�bus_error�junk�off�stack;!*ˆif�(bytes_cleared�>�0)�then�do;*’call�build_fml_node;*’bytes_cleared�<==�0;*ˆend;*ˆgo�to�clear_next_node;  *end build_fml_be; +ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�CODEŠPAGE**build_fml_be:*BFMLBE: *2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;$*ˆif�(mod�(bytes_cleared,�256)�<>�0)*ˆthen�call�KILLER;* ŠMOVE.L�A5,D6 ŠSUB.L‚A4,D6 ŠIF.B�D6��D0�THEN.S ŠBSR„KILLERŠENDI **build_fml_be_x:*BFMLBEX: *(*ˆclear_% mem_ptr�<==�clear_mem_ptr�+�256;&*ˆif�(clear_mem_ptr�=�end_of_part_ptr)!*ˆthen�go�to�build_last_fml_node;*ŠLEA„256(A5),A5 ŠIF.L�A5��D5�THEN.SŠBRA„BLASTNODEŠENDI**ˆpush�addr�(build_fml_be_x); *ˆpush�'BE';*ˆword�(clear_mem_ptr)�<==�0;*ŠPEA„BFMLBEX(PC)ŠMOVE.W�#'BE',-(A7) ŠMOVE.W�D0,(A5) **ˆpop�bus_error�junk�off�stack;!*ˆif�(bytes_cleared�>�0)�then�do;*’call�build_fml_node;*’bytes_cleared�<==�0;*ˆend;*ˆgo�to�clear_next_node;* ŠADD.L‚#6,A7 ŠIF.L�D6��D0�THEN.SŠBSR.S‚BFMLNODE ŠCLR.L‚D6ŠENDI  ŠBRA„CNEXTNODE #ŠTTL„BUILD�FML�NODE�-�DOCUMENTATIONŠPAGEL*******************************************************************************$***…Name:‚BFMLNODE�(build_fml_node):*** ***…Function:E***ŠBuilds�a�node�in�the�free�memory�list�(fills�in�the�fmlfp,�fmlbp,E***…fmlfree,�and�fmlused�fields),�and�links�this�node�to�any�previous***…nodes�in�the�FML.*** ***…Inputs:***ˆ1.)‚A2�=�previous_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�clear_mem_ptr.***ˆ4.)‚D6�=�bytes_cleared.*** ***…Outputs:8***ˆ1.)‚FML�node�(pointed�to�by�previous�last_node_ptr).D***ˆ2.)‚Fmlfp�of�previous�node�in�FML�(if�this�is�not�the�first�node***�in�the�FML).C***ˆ3.)‚A3�=�first_node_ptr�(if�this�is�the�first�node�in�the�FML).***ˆ4.)‚A4�=�previous_node_ptr.******…Side�effects:"***ˆ1.)‚D1�(scratch)�is�destroyed.******…Explanation:B***ŠFirst�we�set�up�the�fmlfp�and�fmlbp�links�in�the�current�node.E***…Next�we�set�up�fmlused�to�contain�the�number�of�pages�between�theA***…last_node_ptr�and�the�clear_mem_ptr�minus�the�number�of�pagesE***…described�by�the�bytes_cleared�counter.‚Then�we�set�fmlfree�equalG***…to�the�number�of�pages�described�by�the�bytes_cleared�counter.‚ThusJ***…the�sum�of�fmlused�and�fmlfree�is�equal�to�the�number�of�pages�between-***…the�last_node_ptr,�and�the�clear_mem_ptr.***E***ŠNow,�if�this�is�the�first�node�in�the�FML�(previous_node_ptr�=�0)K***…then�set�first_node_ptr�equal�to�last_node_ptr�and�thus�"remember"�thatG***…this�is�the�first�node.‚Otherwise,�update�the�fmlfp�of�the�previousF***…node�to�point�to�this�node.‚Finally�set�previous_node_ptr�equal�to>***…last_node_ptr�(and�thus�"remember"�this�node),�and�return.***M***************************************************************************** ŠTTL„BUILD�FML�NODE�-�ALGORITHMŠPAGE*build_fml_node: procedure;    *ˆfmlfp�(last_node_ptr)�<==�0;.*ˆfmlbp�(last_node_ptr)�<==�previous_node_ptr;@*ˆfmlused�(last_node_ptr)�<==�((clear_mem_ptr�-�last_node_ptr)�-*¥(bytes_cleared))�/�256;2*ˆfmlfree�(last_node_ptr)�<==�bytes_cleared�/�256;*ˆif�(previous_node_ptr�=�0)(*ˆthen�first_node_ptr�<==�last_node_ptr;3*ˆelse�fmlfp�(previous_node_ptr)�<==�last_node_ptr;&*ˆprevious_node_ptr�<==�last_node_ptr;  *end build_fml_node; ŠTTL„BUILD�FML�NODE�-�CODEŠPAGE**build_fml_node:* BFMLNODE: **ˆfmlfp�(last_node_ptr)�<==�0;.*ˆfmlbp�(last_node_ptr)�<==�previous_node_ptr;*ŠCLR.L‚FMLFP(A4)ŠMOVE.L�A2,FMLBP(A4) **ˆfmlused�(last_node_ptr)�<==8*’(clear_mem_ptr�-�last_node_ptr�-�bytes_cleared)�/�256;2*ˆfmlfree�(last_node_ptr)�<==�bytes_cleared�/�256;* ŠMOVE.L�A5,D1 ŠSUB.L‚A4,D1 ŠSUB.L‚D6,D1 ŠLSR.L‚#8,D1ŠMOVE.L�D1,FMLUSED(A4) ŠMOVE.L�D6,D1 ŠLSR.L‚#8,D1ŠMOVE.L�D1,FMLFREE(A4) *ˆif�(previous_node_ptr�=�0)(*ˆthen�first_node_ptr�<==�last_node_ptr;3*ˆelse�fmlfp�(previous_node_ptr)�<==�last_node_ptr;*ŠIF.L�A2��D0�THEN.S ŠLEA„(A4),A3 ŠELSE.SŠMOVE.L�A4,FMLFP(A2)ŠENDI *&*ˆprevious_node_ptr�<==�last_node_ptr;* ŠLEA„(A4),A2 **end build_fml_node;*ŠRTS %ŠTTL„BUILD�FML�HEADER�-�DOCUMENTATIONŠPAGEM********************************************************************************&***…Name:‚BFMLHEAD‚(build_fml_header):*** ***…Function:E***ŠFinds�a�block�of�memory�to�contain�the�FML_HEADER�node�(in�eitherF***…high�or�low�memory),�and�builds�& an�FML_HEADER�node�to�describe�the***…current�partition.*** ***…Inputs:D***ˆ1.)‚Src_memtbl_node�(tells�whether�the�FML_HEADER�belongs�in�low***�high�memory).***ˆ2.)‚A0�=�src_memtbl_ptr.***ˆ3.)‚D4�=�start_of_part_ptr.***ˆ4.)‚D5�=�end_of_part_ptr.*** ***…Outputs:9***ˆ1.)‚FML_HEADER�node�describing�the�current�partition.E***ˆ2.)‚Fml_header_ptr�(If�the�fml_header_ptr�=�0�upon�returning�from<***�this�routine,�then�we�couldn't�find�enough�memory�in�theA***�current�partition�for�the�FML_HEADER.‚This�is�meaningful�only***�for�partition�zero.)******…Side�effects:‚None.******…Explanation:D***ŠFirst�we�determine�whether�the�FML_HEADER�belongs�in�low�or�highB***…memory�and�call�the�appropriate�subroutine�to�return�to�us�theI***…corresponding�pointer.‚If�the�subroutine�returned�a�non-zero�pointer,G***…then�it�found�enough�memory�in�the�current�partition�to�contain�theF***…FML_HEADER�(it�found�at�least�fml_header_len�pages),�and�so�we�may%***…continue�to�build�the�FML_HEADER.***?***ŠWe�set�lowfree,�stravail,�and�endavail�to�the�values�of�theH***…first_node_ptr,�start_of_part_ptr,�and�end_of_part_ptr�respectively.E***…We�move�the�MAPMTYP�and�MAPPART�fields�from�the�src_memtbl�to�the7***…FML_HEADER�node,�and�set�up�the�semaphore�counters.***M***************************************************************************** !ŠTTL„BUILD�FML�HEADER�-�ALGORITHMŠPAGE*build_fml_header: procedure;    '*ˆif�(fml_header�belongs�in�low�memory)#*ˆthen�call�get_fml_header_ptr_low;$*ˆelse�call�get_fml_header_ptr_high; #*ˆif�(fml_header_ptr�<>�0)�then�do;.*’lowfree�(fml_header_ptr)�<==�first_node_ptr;2*’stravail�(fml_header_ptr)�<==�start_of_part_ptr;0*’endavail�(fml_header_ptr)�<==�end_of_part_ptr; 8*’memtype�(fml_header_ptr)�<==�MAPMTYP�(src_memtbl_ptr);8*’mempart�(fml_header_ptr)�<==�MAPPART�(src_memtbl_ptr); "*’semfrmem�(fml_header_ptr)�<==�1;$*’semfrmem+2�(fml_header_ptr)�<==�0;"*’semwtmem�(fml_header_ptr)�<==�0;$*’semwtmem+2�(fml_header_ptr)�<==�0;*ˆend;  *end build_fml_header; ŠTTL„BUILD�FML�HEADER�-�CODEŠPAGE**build_fml_header: procedure;* BFMLHEAD: *'*ˆif�(fml_header�belongs�in�low�memory)#*ˆthen�call�get_fml_header_ptr_low;$*ˆelse�call�get_fml_header_ptr_high;*:ŠBTSTƒ#0,10(A0)ŠIf�(src_memtbl_node�(byte_10�(bit_0))�=�0)7ŠIF��THEN.SŠthen�fml_header�belongs�in�HIGH�memory; 6ŠBSR.S‚GFMLPTRH‹else�fml_header�belongs�in�LOW�memory; ŠELSE.SŠBSR.S‚GFMLPTRLŠENDI *#*ˆif�(fml_header_ptr�<>�0)�then�do;.*’lowfree�(fml_header_ptr)�<==�first_node_ptr;2*’stravail�(fml_header_ptr)�<==�start_of_part_ptr;0*’endavail�(fml_header_ptr)�<==�end_of_part_ptr;*ŠIF.L�A5��D0�THEN.SŠMOVE.L�A3,LOWFREE(A5)ŠMOVE.L�D4,STRAVAIL(A5)ŠMOVE.L�D5,ENDAVAIL(A5) *8*’memtype�(fml_header_ptr)�<==�mapmtyp�(src_memtbl_ptr);8*’mempart�(fml_header_ptr)�<==�mappart�(src_memtbl_ptr);*ŠMOVE.W�MAPMTYP(A0),MEMTYPE(A5) *"*’semfrmem�(fml_header_ptr)�<==�1;$*’semfrmem+2�(fml_header_ptr)�<==�0;"*’semwtmem�(fml_header_ptr)�<==�0;$*’semwtmem+2�(fml_header_ptr)�<==�0;*ˆend;*ŠMOVE.W�#1,SEMFRMEM(A5)ŠCLR.L‚SEMFRMEM+2(A5)ŠCLR.W‚SEMWTMEM(A5)ŠCLR.L‚SEMWTMEM+2(A5)ŠENDI **end build_fml_header;*ŠRTS 0ŠTTL„GET�FML�HEADER�POINTER�HIGH�-�DOCUMENTATIONŠPAGEN*********************************************************************************-***…Name:‚GFMLPTRH�(get_fml_header_ptr_high):*** ***…Function::***ŠThis�subroutine�returns�a�pointer�to�a�block�of�memoryI***…fml_header_len�pages�long�in�the�current�partition.‚This�block�is�theE***…highest�addressed�block�in�the�current�partition�that�is�at�leastI***…fml_header_len�pages�long.‚This�subroutine�handles�all�accounting�forE***…the�block�it�"steals"�from�the�partition.‚(It�either�counts�it�asE***…being�a�"used�page�in�the�current�block,�or,�if�the�current�blockH***…consists�of�only�fml_header_len�pages,�then�it�"unlinks"�the�curre& ntH***…block,�and�counts�it�as�a�"used"�portion�of�the�previous�block,�if�a***…previous�block�exists.)*** ***…Inputs:***ˆ1.)‚A4�=�last_node_ptr.***ˆ2.)‚D7�=�fml_header_len.*** ***…Outputs:***ˆ1.)‚A5�=�fml_header_ptr.;***ˆ2.)‚If�we�can't�find�any�block�in�the�current�partition'***�at�least�fml_header_len�pages�long:+***�A.)‚A3�(first_node_ptr)�is�set�to�zero.****�B.)‚A4�(last_node_ptr)�is�set�to�zero.******…Side�effects:&***ˆ1.)‚D1�(scratch)�may�be�destroyed.******…Explanation:E***ŠFirst�we�set�fml_header_ptr�equal�to�the�last_node_ptr�and�searchJ***…backward�through�the�FML�until�we�find�a�block�at�least�fml_header_lenI***…pages�long.‚If�we�reach�the�beginning�of�the�FML�(fml_header_pty�=�0)H***…without�finding�a�block�of�memory�fml_header_len�pages�long,�then�weG***…zero�out�the�first�and�last_node_ptr�and�return.‚(Fml_header_ptr�is***…also�zero.)***E***ŠOtherwise,�we�check�to�see�if�the�block�is�exactly�fml_header_lenG***…pages�long.‚If�it�is,�then�we�call�unlink_fml_header_node�to�unlinkI***…the�node�from�the�FML�linked�list,�and�count�its�memory�as�being�part.***…of�the�used�portion�of�the�previous�block.***>***ŠIf�the�block�is�greater�than�fml_header_len�pages,�we�thenH***…decrement�fmlfree�and�increment�fmlused�by�fml_header_len�pages,�and@***…increment�fml_header_ptr�by�fml_header_len*256�bytes�so�thatI***…fml_header_ptr�now�points�to�the�first�"used"�page�within�the�current***…block�and�return.***N****************************************************************************** ,ŠTTL„GET�FML�HEADER�POINTER�HIGH�-�ALGORITHMŠPAGE$*get_fml_header_ptr_high: procedure;    #*ˆfml_header_ptr�<==�last_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlbp�(fml_header_ptr);"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node; *ˆelse�do;9*’fmlfree�(fml_header_ptr)�<==�fmlfree�(fml_header_ptr)�-*¯fml_header_len;9*’fmlused�(fml_header_ptr)�<==�fmlused�(fml_header_ptr)�+*¯fml_header_len;%*’fml_header_ptr�<==�fml_header_ptr�+!*¥fmlfree�(fml_header_ptr)�*�256;*ˆend; *end get_fml_header_ptr_high; 'ŠTTL„GET�FML�HEADER�POINTER�HIGH�-�CODEŠPAGE*$*get_fml_header_ptr_high: procedure;* GFMLPTRH: *#*ˆfml_header_ptr�<==�last_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlbp�(fml_header_ptr);* ŠLEA„(A4),A5 !ŠWHILE.L�FMLFREE(A5)��D7�DO.S ŠMOVE.L�FMLBP(A5),A5 *"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;ŠIF.L�A5��D0�THEN.S ŠSUB.L‚A3,A3 ŠSUB.L‚A4,A4ŠRTSŠENDIŠENDW *0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;* ŠIF.L�FMLFREE(A5)��D7�THEN.SŠBSR.S‚UFMLHEAD * *ˆelse�do;9*’fmlfree�(fml_header_ptr)�<==�fmlfree�(fml_header_ptr)�-*¯fml_header_len;9*’fmlused�(fml_header_ptr)�<==�fmlused�(fml_header_ptr)�+*¯fml_header_len;%*’fml_header_ptr�<==�fml_header_ptr�+!*¥fmlfree�(fml_header_ptr)�*�256;*ˆend*ŠELSE.SŠSUB.L‚D7,FMLFREE(A5) ŠADD.L‚D7,FMLUSED(A5) ŠMOVE.L�FMLFREE(A5),D1 ŠLSL.L‚#8,D1ŠLEA„(A5,D1.L),A5ŠENDI**end get_fml_header_ptr_high;*ŠRTS /ŠTTL„GET�FML�HEADER�POINTER�LOW�-�DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚GFMLPTRL�(get_fml_header_ptr_low):*** ***…Function::***ŠThis�subroutine�returns�a�pointer�to�a�block�of�memoryI***…fml_header_len�pages�long�in�the�current�partition.‚This�block�is�theD***…lowest�addressed�block�in�the�current�partition�that�is�at�leastI***…fml_header_len�pages�long.‚This�subroutine�handles�all�the�accountingI***…for�the�block�it�"steals"�from�the�partition.‚(It�counts�the�block�asI***…part�o' f�the�"used"�portion�of�the�previous�block,�if�a�previous�blockH***…exists.)‚Also,�since�this�subroutine�"steals"�a�block�of�memory�fromE***…low�memory,�it�may�hvae�to�move�the�pointers�and�counters�(fmlfp,J***…fmlbp,�fmlfree,�fmlused)�from�their�position�to�a�location�fml_header_'***…len�pages�further�"down"�in�memory.*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚D7�=�fml_header_len.*** ***…Outputs:***ˆ1.)‚A5�=�fml_header_ptr.;***ˆ2.)‚If�we�can't�find�any�block�in�the�current�partition'***�at�least�fml_header_len�pages�long:+***�A.)‚A3�(first_node_ptr)�is�set�to�zero.****�B.)‚A4�(last_node_ptr)�is�set�to�zero.******…Side�effects:‚None:******…Explanation:F***ŠFirst�we�set�fml_header_ptr�equal�to�the�first_node_ptr�and�searchI***…forward�through�the�FML�until�we�find�a�block�at�least�fml_header_lenC***…pages�long.‚If�we�reach�the�end�of�the�FML�(fml_header_pty�=�0)H***…without�finding�a�block�of�memory�fml_header_len�pages�long,�then�weG***…zero�out�the�first�and�last_node_ptr�and�return.‚(Fml_header_ptr�is***…also�zero.)***E***ŠOtherwise,�we�check�to�see�if�the�block�is�exactly�fml_header_lenG***…pages�long.‚If�it�is,�then�we�call�unlink_fml_header_node�to�unlinkI***…the�node�from�the�FML�linked�list,�and�count�its�memory�as�being�part.***…of�the�used�portion�of�the�previous�block.***>***ŠIf�the�block�is�greater�than�fml_header_len�pages,�we�callG***…move_fml_node�to�move�the�pointers�and�counters�of�the�current�nodeJ***…(fmlfp,�fmlbp,�fmlfree,�fmlused)�fml_header_len�pages�"down"�in�memory;***…in�order�to�make�room�for�the�FML_HEADER�in�low�memory.***N****************************************************************************** +ŠTTL„GET�FML�HEADER�POINTER�LOW�-�ALGORITHMŠPAGE#*get_fml_header_ptr_low: procedure;    $*ˆfml_header_ptr�<==�first_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlfp�(fml_header_ptr);"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;*ˆelse�call�move_fml_node;  *end get_fml_header_low; &ŠTTL„GET�FML�HEADER�POINTER�LOW�-�CODEŠPAGE#*get_fml_header_ptr_low: procedure;* GFMLPTRL: *$*ˆfml_header_ptr�<==�first_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlfp�(fml_header_ptr);* ŠLEA„(A3),A5 !ŠWHILE.L�FMLFREE(A5)��D7�DO.S ŠMOVE.L�FMLFP(A5),A5 *"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;*ŠIF.L�A5��D0�THEN.S ŠSUB.L‚A3,A3 ŠSUB.L‚A4,A4ŠRTSŠENDIŠENDW *0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;*ˆelse�call�move_fml_node;* ŠIF.L�FMLFREE(A5)��D7�THEN.SŠBSR.S‚UFMLHEADŠELSE.SŠBSR.S‚MFMLNODEŠENDI *óÜRå0í2õhý*W AGS%M-4*end get_fml_header_ptr_low;*ŠRTS +ŠTTL„UNLINK�FML�HEADER�NODE�-�DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚UFMLHEAD�(unlink_fml_header_node):*** ***…Function:E***ŠThis�subroutine�handles�the�unlinking�of�the�fml_header_node�fromI***…the�FML.‚It�takes�care�of�linking�the�previous_node�(if�there�is�one)I***…to�the�next_node�(if�there�is�one)�and�vice�versa.‚It�also�takes�careJ***…of�accounting�for�the�fml_header_node�as�part�of�the�"used"�portion�of(***…the�previous_node�(if�there�is�one).*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�fml_header_ptr.*** ***…Outputs:E***ˆ1.)‚Updated�FML�with�the�fml_header_no' de�"unlinked"�from�the�FML,?***�and�counted�as�part�of�the�"used"�part�of�its�previous_node***�(if�there�is�one).******…Side�effects:.***ˆ1.)‚A3�(first_node_ptr)�could�get�changed.-***ˆ2.)‚A4�(last_node_ptr)�could�get�changed.3***ˆ3.)‚A2�(previous_node_ptr)�could�get�destroyed.)***ˆ4.)‚A6�(scratch)�could�get�destroyed.&***ˆ5.)‚D1�(scratch)�may�be�destroyed.******…Explanation:C***ŠThe�first�do�block�handles�the�case�where�the�fml_header_ptr�isA***…equal�to�the�first_node_ptr.‚In�this�case�we�must�advance�theG***…first_node_ptr�to�point�to�the�next�node�in�the�FML.‚If�there�is�noJ***…next�node�(new�first_node_ptr�=�0),�then�we�zero�out�the�last_node_ptrD***…to�indicate�an�empty�FML,�and�return.‚Otherwise,�we�zero�out�theD***…fmlbp�of�the�new�first_node_ptr�to�indicate�that�this�is�now�the%***…beginning�of�the�FML,�and�return.***>***ŠThe�next�large�do�block�of�code�handles�the�case�where�theI***…fml_header_ptr�is�equal�to�the�last_node_ptr.‚In�this�case�we�attemptJ***…to�back�up�the�last_node_ptr�to�point�to�the�previous�node�in�the�FML.F***…If�there�is�no�previous�node�(new�last_node_ptr�=�0),�then�we�zero@***…out�the�first_node_ptr�to�indicate�an�empty�FML,�and�return.J***…Otherwise,�we�zero�out�the�fmlfp�of�the�new�last_node�to�indicate�thatG***…this�is�now�the�end�of�the�FML,�update�the�fmlused�field�of�the�new@***…last_node�to�equal�its�current�value,�plus�the�length�of�the9***…previous�last_node�(fmlfree�and�fmlused),�and�return.***@***ŠIf�neither�of�these�cases�occurred,�then�the�fml_header_nodeI***…exists�somewhere�in�the�middle�of�the�FML.‚In�this�case�we�must�firstD***…get�a�pointer�to�the�node�before�the�fml_header_node�in�the�FML.G***…Now�the�fmlfp�of�this�previous�node�must�be�set�to�the�value�of�the:***…fmlfp�of�the�fml_header_node,�and�thus�"skip�over"�theG***…fml_header_node.‚Having�done�this,�we�update�the�fmlused�portion�ofI***…this�previous_node�to�include�its�old�fmlused�value�and�the�length�of?***…the�fml_header_node�(fmlfree�and�fmlused).‚(This�in�essenceG***…counts�the�entire�fml_header_node,�used�and�free�memory,�as�part�ofH***…the�used�portion�of�the�previous�node.)‚Finally,�we�update�the�fmlbpI***…of�the�node�after�the�fml_header_node�in�the�FML�to�point�back�to�the;***…previous�node,�and�thus�complete�the�"unlinking"�of�the***…fml_header_node.***M***************************************************************************** 'ŠTTL„UNLINK�FML�HEADER�NODE�-�ALGORITHMŠPAGE#*unlink_fml_header_node: procedure;    /*ˆif�(fml_header_ptr�=�first_node_ptr)�then�do;,*’first_node_ptr�<==�fmlfp�(first_node_ptr);*’if�(first_node_ptr�=�0)*’then�last_node_ptr�<==�0;%*’else�fmlbp�(first_node_ptr)�<==�0);*ˆend;3*ˆelse�if�(fml_header_ptr�=�last_node_ptr)�then�do;**’last_node_ptr�<==�fmlbp�(last_node_ptr);*’if�(last_node_ptr�=�0)*’then�first_node_ptr�<==�0; *’else�do;*œfmlfp�(last_node_ptr�<==�0);*œfmlused�(last_node_ptr)�<==*¦fmlused�(last_node_ptr)�+*¦fmlfree�(fml_header_ptr)�+*¦fmlused�(fml_header_ptr);*’end;*ˆend; *ˆelse�do;/*’previous_node_ptr�<==�fmlbp�(fml_header_ptr);7*’fmlfp�(previous_node_ptr)�<==�fmlfp�(fml_header_ptr);!*’fmlused�(previous_node_ptr)�<==*œfmlused�(previous_node_ptr)�+*œfmlfree�(fml_header_len)�+*œfmlused�(fml_header_ptr);+*’next_node_ptr�<==�fmlfp�(fml_header_ptr);.*’fmlbp�(next_node_ptr)�<==�previous_node_ptr;*ˆend;  *end unlink_fml_header_node; "ŠTTL„UNLINK�FML�HEADER�NODE�-�CODEŠPAGE#*unlink_fml_header_node: procedure;* UFMLHEAD: */*ˆif�(fml_header_ptr�=�first_node_ptr)�then�do;,*’first_node_ptr�<==�fmlfp�(first_node_ptr);*’if�(first_node_ptr�=�0)*’then�last_node_ptr�<==�0);$*’else�fmlbp�(first_node_ptr)�<==�0;*ˆend*ŠIF.L�A5��A3�THEN.S ŠMOVE.L�FMLFP(A3),A3 ŠIF.L�A3��D0�THEN.S ŠSUB.L‚A4,A4 ŠELSE.SŠCLR.L‚FMLBP(A3)ŠENDI *3*ˆelse�if�(fml_header_ptr�=�last_node_ptr)�then�do;**’last_node_ptr�( <==�fmlbp�(last_node_ptr);*’if�(last_node_ptr�=�0)*’then�first_node_ptr�<==�0);*ŠELSE.SŠIF.L�A5��A4�THEN.S ŠMOVE.L�FMLBP(A4),A4 ŠIF.L�A4��D0�THEN.S ŠSUB.L‚A3,A3 * *’else�do;*œfmlfp�(last_node_ptr)�<==�0;*œfmlused�(last_node_ptr)�<==*¦fmlused�(last_node_ptr)�+*¦fmlfree�(fml_header_ptr)�+*¦fmlused�(fml_header_ptr);*’end;*ˆend;*ŠELSE.SŠCLR.L‚FMLFP(A4) ŠMOVE.L�FMLFREE(A5),D1ŠADD.L‚FMLUSED(A5),D1ŠADD.L‚D1,FMLUSED(A4)ŠENDI * *ˆelse�do;/*’previous_node_ptr�<==�fmlbp�(fml_header_ptr);7*’fmlfp�(previous_node_ptr)�<==�fmlfp�(fml_header_ptr);!*’fmlused�(previous_node_ptr)�<==*œfmlused�(previous_node_ptr)�+*œfmlfree�(fml_header_ptr)�+*œfmlused�(fml_header_ptr);+*’next_node_ptr�<==�fmlfp�(fml_header_ptr);.*’fmlbp�(next_node_ptr)�<==�previous_node_ptr;*ˆend;*ŠELSE.SŠMOVE.L�FMLBP(A5),A2 ŠMOVE.L�FMLFP(A5),FMLFP(A2) ŠMOVE.L�FMLFREE(A5),D1ŠADD.L‚FMLUSED(A5),D1ŠADD.L‚D1,FMLUSED(A2) ŠMOVE.L�FMLFP(A5),A6 ŠMOVE.L�A2,FMLBP(A6)ŠENDIŠENDI**end unlink_fml_header_node;*ŠRTS "ŠTTL„MOVE�FML�NODE�-�DOCUMENTATIONŠPAGEN*********************************************************************************#***…Name:‚MFMLNODE�(move_fml_node):*** ***…Function:D***ŠThis�subroutine�"moves"�the�pointers�and�counters�(fmlfp,�fmlbp,C***…fmlfree,�fmlused)�of�an�FML�node�fml_header_len�pages�"down"�inG***…memory.‚It�also�handles�all�accounting�for�the�change�in�the�statusH***…of�the�moved�memory�(fmlfree�of�the�current�node�gets�decremented�byH***…fml_header_len�pages,�and�fmlused�for�the�previous�node�(if�there�isB***…one)�gets�incremented�by�the�same�value).‚This�subroutine�alsoG***…accounts�for�any�change�in�the�status�of�the�first_node_ptr�(if�theH***…fml_header_ptr�was�pointing�to�the�first�node),�or�the�last_node_ptrF***…(if�the�fml_header_ptr�was�pointing�to�the�last�node)�as�required.*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�fml_header_ptr.***ˆ4.)‚D7�=�fml_header_len.*** ***…Outputs:C***ˆ1.)‚A�new�FML�node�moved�down�in�memory�by�fml_header_len�page.A***ˆ2.)‚All�new�pointers�to�reflect�the�displacement�of�the�node.******…Side�effects:***ˆ1.)‚A2�gets�destroyed.+***ˆ2.)‚A3�(first_node_ptr)�may�be�updated.****ˆ3.)‚A4�(last_node_ptr)�may�be�updated.$***ˆ4.)‚A6�(scratch)�gets�destroyed.******…Explanation:D***ŠFirst�we�compute�the�address�of�the�moved�node�to�be�the�addressH***…of�the�fml_header_ptr�plus�the�offset,�in�bytes,�that�the�node�is�toH***…be�moved�(fml_header_len*256).‚Then�we�get�a�pointer�to�the�previousE***…node�in�the�FML.‚If�there�is�no�previous�node,�then�we�update�theG***…first_node_ptr�to�point�to�the�moved�node.‚Otherwise,�we�update�theH***…fmlfp�field�of�the�previous�node�to�point�to�the�moved�node,�and�addH***…the�fml_header_len�pages�to�the�"used"�portion�of�the�previous�node.***D***ŠNext�we�decrement�the�"free"�field�of�the�fml_header_node�by�theJ***…value�of�the�fml_header_len�to�reflect�the�fact�that�this�memory�is�noI***…longer�available�to�that�node.‚Then�we�get�a�pointer�to�the�next�nodeD***…in�the�FML,�and�if�it�is�zero�(no�next�node),�then�we�update�theF***…last_node_ptr�to�point�to�the�moved�node.‚Otherwise,�we�update�the;***…fmlbp�of�the�next�node�to�point�back�to�the�moved�node.***C***ŠFinally,�we�actually�move�the�pointers�and�counters�of�the�nodeJ***…from�the�memory�pointed�to�by�the�fml_header_ptr�to�the�memory�pointed)***…to�by�the�moved_node_ptr,�and�return.***M***************************************************************************** ŠTTL„MOVE�FML�NODE�-�ALGORITHMŠPAGE*move_fml_node: procedure;    9*ˆmoved_node_ptr�<==�fml_header_ptr�+�fml_header_len*256; /*ˆprevious_node_ptr�<==�fmlbp�(fml_header_ptr);*ˆif�(previous_node_ptr�=�0))*ˆthen�first_node_ptr�<==�moved_node_ptr; *ˆelse�do;/*’fmlfp�(previous_node_ptr)�<==�moved_node_ptr;!*’fmlused�(p( revious_node_ptr)�<==*œfmlused�(previous_node_ptr)�+*œfml_header_len;*ˆend; *ˆfmlfree�(fml_header_ptr)�<==*œfmlfree�(fml_header_ptr)�-*œfml_header_len; +*ˆnext_node_ptr�<==�fmlfp�(fml_header_ptr);*ˆif�(next_node_ptr�=�0)(*ˆthen�last_node_ptr�<==�moved_node_ptr;0*ˆelse�fmlbp�(next_node_ptr)�<==�moved_node_ptr; 2*ˆfmlfp.fmlbp.fmlused.fmlfree�(moved_node_ptr)�<==/*’fmlfp.fmlbp.fmlused.fmlfree�(fml_header_ptr);  *end move_fml_node; ŠTTL„MOVE�FML�NODE�-�CODEŠPAGE*move_fml_node: proc;* MFMLNODE: *9*ˆmoved_node_ptr�<==�fml_header_ptr�+�fml_header_len*256;* ŠLSL.L‚#8,D7ŠLEA„(A5,D7.L),A6 ŠLSR.L‚#8,D7 */*ˆprevious_node_ptr�<==�fmlbp�(fml_header_ptr);*ˆif�(previous_node_ptr�=�0))*ˆthen�first_node_ptr�<==�moved_node_ptr;*ŠMOVE.L�FMLBP(A5),A2 ŠIF.L�A2��D0�THEN.S ŠLEA„(A6),A3 * *ˆelse�do;/*’fmlfp�(previous_node_ptr)�<==�moved_node_ptr;!*’fmlused�(previous_node_ptr)�<==*œfmlused�(previous_node_ptr)�+*œfml_header_len;*ˆend;*ŠELSE.SŠMOVE.L‚A6,FMLFP(A2) ŠADD.L‚D7,FMLUSED(A2)ŠENDI *ˆfmlfree�(fml_header_ptr)�<==*œfmlfree�(fml_header_ptr)�-*œfml_header_len;*ŠSUB.L‚D7,FMLFREE(A5) *+*ˆnext_node_ptr�<==�fmlfp�(fml_header_ptr);*ˆif�(next_node_ptr�=�0)(*ˆthen�last_node_ptr�<==�moved_node_ptr;0*ˆelse�fmlbp�(next_node_ptr)�<==�moved_node_ptr;*ŠMOVE.L�FMLFP(A5),A2 ŠIF.L�A2��D0�THEN.S ŠLEA„(A6),A4 ŠELSE.SŠMOVE.L‚A6,FMLBP(A2)ŠENDI *2*ˆfmlfp.fmlbp.fmlused.fmlfree�(moved_node_ptr)�<==/*’fmlfp.fmlbp.fmlused.fmlfree�(fml_header_ptr);*ŠMOVE.L�FMLFP(A5),FMLFP(A6)ŠMOVE.L�FMLBP(A5),FMLBP(A6)ŠMOVE.L�FMLUSED(A5),FMLUSED(A6)ŠMOVE.L�FMLFREE(A5),FMLFREE(A6) **end move_fml_node;*ŠRTS *ŠTTL„CHECK�MEMMAP�CONFLICT�-�DOCUMENTATIONŠPAGEM********************************************************************************+***…Name:‚CMEMCONF�(check_memmap_conflict):*** ***…Function:C***ŠThis�subroutine�checks�the�RAM�partition�described�by�the�entryB***…in�the�src_memtbl�pointed�to�by�the�src_memtbl_ptr�against�allE***…previously-described�RAM�partitions.‚If�this�subroutine�detects�aD***…fatal�conflict�it�will�not�return�execution�to�the�caller.‚If�itC***…detects�an�alias�partition�(same�starting�address�as�some�otherK***…partition),�it�returns�execution�with�the�got_alias_partition_flag�set.9***…Otherwise,�it�returns�execution�with�that�flag�reset.*** ***…Inputs:***ˆ1.)‚A0�=�src_memtbl_ptr.***ˆ2.)‚A1�=�dest_memtbl_ptr.***ˆ3.)‚D4�=�start_of_part_ptr.***ˆ4.)‚SYSPAR�(MAPBEG).*** ***…Outputs:&***ˆ1.)‚D2�=�got_alias_partition_flag.@***ˆ2.)‚A5�=�fml_header_ptr�(if�got_alias_partition_flag�=�set).******…Side�effects:,***ˆ1.)‚A2�(temp_memtbl_ptr)�gets�destroyed.$***ˆ2.)‚D1�(scratch)�gets�destroyed.3***ˆ3.)‚Execution�may�not�return�(may�call�KILLER).******…Explanation:@***ŠFirst�we�initialize�for�the�loop�by�resetting�the�got_alias_I***…partition_flag,�setting�the�current_partition_number,�and�setting�theF***…temp_memtbl_ptr�to�point�to�the�beginning�of�the�dest_memtbl.‚Then***…we�begin�the�loop.***B***ŠIf�we�detect�a�duplicate�partition�number,�then�we�call�KILLERC***…and�die.‚If�we�detect�a�duplicate�start_of_part_ptr,�we�set�theI***…got_alias_partition_flag,�set�the�fml_header_ptr�equal�to�the�MAPFMLPB***…field�of�the�alias�partition�and�return.‚If�we�detect�that�ourD***…current�start_of_part_ptr�is�at�a�lower�memory�location�than�theF***…ENDAVAIL�field�of�some�previous�partition,�then�we�call�KILLER�andC***…die.‚Otherwise,�we�keep�looping�until�we�have�looked�at�all�the>***…previously-defined�entries�in�the�dest_memtbl,�and�return.***L**************************************************************************** &ŠTTL„CHECK�MEMMAP�CONFLICT�-�ALGORITHMŠPAGE"*check_memmap_conflict: procedure;    !*ˆreset�got_alias_partition_flag;B*ˆcurrent_partition_number�<==�MAPMTYP�(src_memtbl_p) tr)�.AND.�$0F;&*ˆtemp_memtbl_ptr�<==�SYSPAR�(MAPBEG);/*ˆdo�until�(temp_memtbl_ptr�=�dest_memtbl_ptr);;*’if�(MAPPART�(temp_memtbl_ptr)�=�current_partition_number)*’then�call�KILLER;=*’if�(MAPSTRA�(temp_memtbl_ptr)�=�start_of_part_ptr)�then�do;*œset�got_alias_partition_flag;/*œfml_header_ptr�<==�MAPFMLP�(temp_memtbl_ptr); *œreturn;*’end;=*’if�(start_of_part_ptr�<�ENDAVAIL�(MAPFMLP�(temp_memtbl�ptr)*’then�call�KILLER;'*’temp_memtbl_ptr�<==�temp_memtbl_ptr�+*¦length�(dest_memtbl_entry); *ˆend;  *end check_memmap_conflict; !ŠTTL„CHECK�MEMMAP�CONFLICT�-�CODEŠPAGE"*check_memmap_conflict: procedure;* CMEMCONF: *!*ˆreset�got_alias_partition_flag;B*ˆcurrent_partition_number�<==�MAPMTYP�(src_memtbl_ptr)�.AND.�$0F;'*ˆtemp_memtbl_ptr�<==�SYSPAR�(MAPBEG));/*ˆdo�until�(temp_memtbl_ptr�=�dest_memtbl_ptr);* ŠCLR.B‚D2 ŠMOVE.B�MAPMTYP(A0),D1ŠAND.B‚#$0F,D1 ŠMOVE.L�MAPBEG,A2 ŠREPEAT *;*’if�(mappart�(temp_memtbl_ptr)�=�current_partition_number)*’then�call�KILLER;* ŠIF.B�MAPPART(A2)��D1�THEN.S ŠBSR„KILLERŠENDI *=*’if�(mapstra�(temp_memtbl_ptr)�=�start_of_part_ptr)�then�do;*›set�got_alias_partition_flag;/*›fml_header_ptr�<==�mapfmlp�(temp_memtbl_ptr); *›return;*’end;* ŠIF.L�MAPSTRA(A2)��D4�THEN.SŠST…D2ŠMOVE.L�MAPFMLP(A2),A5ŠRTSŠENDI *>*’if�(start_of_part_ptr�<�endavail�(mapfmlp�(temp_memtbl_ptr))*’then�call�KILLER;*ŠMOVE.L�MAPFMLP(A2),A6!ŠIF.L�D4��ENDAVAIL(A6)�THEN.S ŠBSR„KILLERŠENDI **’temp_memtbl_ptr�<==*œtemp_memtbl_ptr�+*œlength�(dest_memtbl_entry);*ŠLEA„MAPENTSZ(A2),A2 **ˆend;*ŠUNTIL.L�A2��A1 **end check_memmap_conflict;*ŠRTS +ŠTTL„BUILD�RAM�MEMTBL�ENTRY�-�DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚BRAMNODE�(build_ram_memtbl_entry):*** ***…Function:D***ŠThis�subroutine�writes�in�all�pointers�and�descriptors�for�a�RAM'***…partition�entry�in�the�dest_memtbl.*** ***…Inputs:***ˆ1.)‚A0�=�src_memtbl_ptr.***ˆ2.)‚A1�=�dest_memtbl_ptr.***ˆ3.)‚A5�=�fml_header_ptr.***ˆ4.)‚D4�=�start_of_part_ptr.*** ***…Outputs:7***ˆ1.)‚Dest_memtbl_entry�(RAM�entry)�pointed�to�by�the***�dest_memtbl_ptr.******…Side�effects:+***ˆ1.)‚D1,�and�D2�(scratch)�get�destroyed.******…Explanation:D***ŠThe�MAPMTYP�field�of�the�dest_memtbl_entry�gets�set�equal�to�theF***…most�significant�four�bits�of�the�MAPPART�field�of�the�src_memtbl_H***…entry,�and�the�MAPPART�field�of�the�dest_memtbl_entry�gets�set�equalI***…to�the�four�least�significant�bits�of�the�same�field.‚Finally,�we�setJ***…the�MAPSTRA�field�of�the�dest_memtbl_entry�equal�to�the�start_of_part_G***…ptr,�and�the�MAPFMLP�field�equal�to�the�fml_header_ptr,�and�return.***M***************************************************************************** 'ŠTTL„BUILD�RAM�MEMTBL�ENTRY�-�ALGORITHMŠPAGE#*build_ram_memtbl_entry: procedure;    *ˆMAPMTYP�(dest_memtbl_ptr)�<==%*’MAPPART�(src_memtbl_ptr)�.AND.�$70;*ˆMAPPART�(dest_memtbl_ptr)�<==%*’MAPPART�(src_memtbl_ptr)�.AND.�$0F;2*ˆMAPSTRA�(dest_memtbl_ptr)�<==�start_of_part_ptr;/*ˆMAPFMLP�(dest_memtbl_ptr)�<==�fml_header_ptr;  *end build_ram_memtbl_entry; "ŠTTL„BUILD�RAM�MEMTBL�ENTRY�-�CODEŠPAGE#*build_ram_memtbl_entry: procedure;* BRAMNODE: **ˆMAPMTYP�(dest_memtbl_ptr)�<==%*’MAPMTYP�(src_memtbl_ptr)�.AND.�$70;*‰MOVE.B„MAPMTYP(A0),D1 ‰MOVE.B„D1,D2‰AND.B…#$70,D1‰MOVE.B„D1,MAPMTYP(A1) **ˆmappart�(dest_memtbl_ptr)�<==&*’mapmtyp�(dest_memtbl_ptr)�.AND.�$0F;*‰AND.B…#$0F,D2‰MOVE.B„D2,MAPPART(A1) *2*ˆmapstra�(dest_memtbl_ptr)�<==�start_of_part_ptr;*‰MOVE.L„D4,MAPSTRA(A1) */*ˆmapfmlp�(dest_memtbl_ptr)�<==�fml_header_ptr;*‰MOVE.L„A5,MAPFMLP(A1) **end build_ram_memtbl_entry;*ŠRTS +ŠTTL„BUILD�ROM�MEMTBL�ENTRY�-�DOCUMENTATIONŠPAGEM**************************************************************) ******************,***…Name:‚BROMNODE�(build_rom_memtbl_entry):*** ***…Function:E***ŠThis�subroutine�does�some�primitive�checking�on�the�legality�of�aB***…ROM�partition�described�in�the�src_memtbl,�and�then�writes�theH***…descriptors�and�pointers�to�describe�that�node�into�the�dest_memtbl.*** ***…Inputs:***ˆ1.)‚A0�=�src_memtbl_ptr.***ˆ2.)‚A1�=�dest_memtbl_ptr.***ˆ3.)‚D4�=�start_of_part_ptr.***ˆ4.)‚D5�=�end_of_part_ptr.*** ***…Outputs:7***ˆ1.)‚Dest_memtbl_entry�(ROM�entry)�pointed�to�by�the***�dest_memtbl_ptr.******…Side�effects:$***ˆ1.)‚A6�(scratch)�gets�destroyed./***ˆ2.)‚Execution�may�not�return�(call�KILLER).******…Explanation:D***ŠFirst�we�verify�that�the�current�ROM�partition�does�not�start�atH***…a�lower�memory�location�than�the�ending�of�the�last�partition�in�theH***…dest_memtbl.‚If�it�does,�we�have�a�fatal�configuration�error,�and�so***…we�call�KILLER.***>***ŠOtherwise,�we�move�the�MAPMTYP�and�MAPPART�fields�from�theH***…src_memtbl�to�the�dest_memtbl,�set�the�MAPSTRA�and�MAPENDA�fields�ofF***…the�dest_memtbl�equal�to�the�start_of_part_ptr�and�end_of_part_ptr***…respectively,�and�return.***N****************************************************************************** 'ŠTTL„BUILD�ROM�MEMTBL�ENTRY�-�ALGORITHMŠPAGE#*build_rom_memtbl_entry: procedure;   *ˆif�(start_of_part_ptr�<1*’ENDAVAIL�(MAPFMLP�(previous�(dest_memtbl_ptr)))*ˆthen�call�KILLER; '*ˆMAPMTYP.MAPPART�(dest_memtbl_ptr)�<==#*’MAPMTYP.MAPPART�(src_memtbl_ptr);3*ˆMAPSTRA�(dest_memtbl_ptr)�<==�start_of_part_ptr);0*ˆMAPENDA�(dest_memtbl_ptr)�<==�end_of_part_ptr;  *end build_rom_memtbl_entry; "ŠTTL„BUILD�ROM�MEMTBL�ENTRY�-�CODEŠPAGE#*build_rom_memtbl_entry: procedure;* BROMNODE: **ˆif�(start_of_part_ptr�<1*’endavail�(mapfmlp�(previous�(dest_memtbl_ptr)))*ˆthen�call�KILLER;*ŠMOVE.L�MAPFMLP-MAPENTSZ(A1),A6!ŠIF.L�D4��ENDAVAIL(A6)�THEN.S ŠBSR„KILLERŠENDI *'*ˆmapmtyp.mappart�(dest_memtbl_ptr)�<==#*’mapmtyp.mappart�(src_memtbl_ptr);2*ˆmapstra�(dest_memtbl_ptr)�<==�start_of_part_ptr;0*ˆmapenda�(dest_memtbl_ptr)�<==�end_of_part_ptr;*ŠMOVE.W�MAPMTYP(A0),MAPMTYP(A1) ŠMOVE.L�D4,MAPSTRA(A1) ŠMOVE.L�D5,MAPENDA(A1)**end build_rom_memtbl_entry;*ŠRTS  ŠENDééé>1INIT ASYST'M68XXX INIT SA7!ƒSYSTEM INITIALIZERþ2pREADYHD pENDSYSP pASN pINITMMU pMEMTYPA pRDYHEAD pEEND pIOVCTBGN pTIAT pVCTUBGN pSDEFTYP pSEMLIST pTDEFTYP pLAM pUDEFTYP pPAGESIZE pMEMTYPS pMEMTYPT pTIMERST pMEMTYPU pCCBHD pASNTBL pTCBHD ÷2pINITIO pESTACK HKILLER ,pGSTBEG pSMEMHI pTRCSIZ pMAPBEG pNOTLAM pGSTSIZ pSMEMLO pIOVSIZ pPATBEG pPANEL pPANELA pESTART pUDRBEG pCRASHSAV pPATSIZ pSEMEND pUSTBEG pUDRSIZ pBKG_HEAD «2pUSTSIZ pDISPATCH pTRACFLAG pBKG_ACTI pBUGTRAC pEXCSTACK pTCBHEAD pTRACEBEG pENDMEMT pBKG_TAIL pMACSTRC pMEMTABL pWHERLOAD pADEFTYP pTRCFLAG (´L3€V  .|!ÀüAù(7,<(œˆ†* ÿBa:.zA) Ú!Ï B!úAA Ò G"zA4 Ì!É 3gAú!ÈL3jH 3|€2<¿a ` !ü(7 3.x B":AI žg*&zA5 ˜$AIúAE ’ÙüAú‘ÊÑËCú!ÉI3 &Ú¹Ênú\�NÐ$zB5 ÿn ¼!UDRáŠ]‚„ü 1BB¸ D$:B, üÌg2 BpN@`aê!È DaEèO3 TP  ŠáŠQ‚„üÄüÔŠ!B1úBK üš ?!ü aB( üŒJ¸ 'fœB¸ GúBE ü|Cë <€pN@`ad4+;BF3€ ,g +x  !Í EëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈL3„@ ÿü “!TCBg†aB# ûæ.x B2<ÀaD/:B> ûØNuHVMù(7,¯@îFü'MîHÖ?ÿ-_8-OÈnúNu0<`0<�F虀2<é™"x 3Cé2�A02�I3 2€@02€Nua&a°‹fa†a|°�faÿ|Cí!É -aÂazNuB€AúBH û:°Pgaÿ^L3  B‡EЇ Eê Rÿÿfð‡#à�*(B(:B û º„c*„ÿBKúûû" B*AMúBE ûñK3 ,Bœ�°ºBC úèf†` (<*ÿB*DB†º„baþöNu hÿÿ g,a2 ÿfaN`aF3 ðJga$`a@°‹ga¾a`Ì3|ÿÿ Nu~Aè Cé ((„ÿB*(BF3 *DB†º„baþ�Nu•ÊB�B‚BƒIÕKõhHz ?H3%Høÿÿ!@ø!!× Ni!É!H!ø!L"x 3|•3|µ3| 3|°|`Þ4éééééééX=/*†POWRFAIL.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN$=/*†FILE�WILL�DEFAULT�TO�POWRFAIL.LS=/*=/IFC \1=ARG :.M68XXX.POWRFAIL.LS=/ENDIF=/*3=ASM :.M68XXX.POWRFAIL,:.M68XXX.POWRFAIL,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDééééé+ éa‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰LIST‰PAGE4POWRFAIL�IDNTƒ5,1ƒ68xxx�POWER�FAIL�INTERRUPT�HANDLER*ˆ*********************ˆ*�POWRFAIL�1.00„**ˆ*’**ˆ*�HLD6ƒ06/24/81‚**ˆ**********************…POWER�FAIL�INTERRUPT�ROUTINE*@*…THIS�ROUTINE�IS�USED�ONLY�TO�RESPOND�TO�A�POWER�FAIL�INTERRUPT-*…ON�A�VERSAMODULE�01�(AUTO�VECTOR�-�LEVEL�7)*%*…REGISTER�USAGE:�ALL�REGISTERS�SAVED*‰SECTION�LEVEL00**‰XDEFƒPOWRFAIL‰XREF.S�CRASHSAV*:POWRFAIL�MOVEM.L�D0-D7/A0-A7,CRASHSAV+8ƒSAVE�ALL�REGISTERS'‰MOVE.W‚(A7),CRASHSAV+6ŠSAVE�STATUS�REG+‰MOVE.L‚2(A7),CRASHSAV‹SAVE�PROGRAM�COUNTERD*********************************************************************7*„CODE�TO�CALL�A�POWER�FAIL�ROUTINE�CAN�BE�ENTERED�HERE*D***********************************************************************„IF�THERE�IS�A�RETURN‚--�RELOAD�REGISTERS*!‰OR.W„#$700,SR†INHIBIT�INTERRUPTS5‰MOVEM.L�CRASHSAV+8,D0-D7/A0-A7ƒRESTORE�ALL�REGISTERS ‰RTE“GO�BACK‰ENDéééj-N1POWRFAIL ASYST'M68XXX POWRFAILSA!ƒ68xxx POWER FAIL INTERRUPT HANDLER 2BPOWRFAIL pCRASHSAV "%3)Høÿÿ!1×!!ï |Løÿÿ!Ns4éééé, ééés=/*†M68XXX.READY.AF=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN(=/*†FILE�WILL�DEFAULT�TO�M68XXX.READY.LS=/*=/IFC \1=ARG :.M68XXX.READY=/ENDIF=/*,=ASM :.M68XXX.READY,:.M68XXX.READY,\1;RZ=045=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.INTERRUP.MC=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDéééééé|8READY…IDNTƒ5,1�M68xxx�RMS�TRAP�0�Put�task�on�ready�list.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***4***…FILE:‚READY�--�PUT�A�TASK�ON�THE�READY�LIST.—******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***H***…FUNCTION:‚Takes�the�TCB�for�a�task�and�puts�it�on�the�ready�listƒ***E***‡according�to�its�run�priority.‚There�are�various�entry�points„***D***‡to�this�module�which�provide�minor�variations�on�this�theme.†******É******…NOTES:¾******É***E***…REGISTER�U, SAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒDƒPƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆD�******‡A:ƒAƒ.ƒPƒ.ƒ.ƒ.ƒ.ƒP ******É******É******…ENTRY�CONDITIONS:³***>***‡A0ƒ=�ptr�to�TCB�of�the�task�to�be�added�to�ready�list.Š******É***-***…EXIT�CONDITIONS�DIFFERENT�FROM�ENTRY:Ÿ******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------G*†8/15/83‚Steve�FranckƒMade�COMINT�entry�point�set�the�running�priority1*žlike�most�of�the�other�routines�do.‚Rewrote�the2*žTCB�search�routine�to�execute�faster�(interrupts*žare�masked�during�search).*†2/08/81‚HLD6*†5/18/79‚7616*†3/06/79‚GGC3* * *‚XDEF's.*8ŠXDEFƒREADY,SBREADY†Normal�entry�points�to�this�routine. 'ŠXDEFƒSBRYRELQ‹Entry�point�from�RELINQ.5ŠXDEFƒSBRYEXT1‹Entry�point�from�EXIT2�(TRAP�#1�exit).:ŠXDEFƒSBRYEXIR‹Entry�point�from�EXITR�(exit�from�exception*§processing).…5ŽT–)6ŠXDEFƒSBRYXMON‹Entry�point�from�EXMON�return�(REXMON).(ŠXDEFƒSBRYDLAY‹Entry�point�from�CKDELAY.&ŠXDEFƒSBRYACKŒEntry�point�from�AKRQST.)ŠXDEFƒSBRYSTRT‹Entry�point�from�TSTSTART.0ŠXDEFƒSBRYWAKE‹Entry�point�from�WAKEUP�and�WAIT.2ŠXDEFƒSBRYASRŒEntry�point�from�ASRINT�and�WTEVENT.'ŠXDEFƒSBRYCINT‹Entry�point�from�COMINT. * *‚XREF's.*;ŠXREF.S�READYHDŒSYSPAR�pointer�to�head�entry�in�ready�list.  **‚Included�files:*8*‰UTILITY.MC�Macros�of�general�utility�(e.g.�PUSH,�POP).7*‰INTERRUP.MC�Macros�useful�in�dealing�with�interrupts.2*‰STR.EQ”Equates�for�supervisor�code�under�RMS68K.4*‰TCB.EQ”Equates�relating�to�the�Task�Control�Block.*ŠNOLISTŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.INTERRUP.MCŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠLIST  ŠSECTION�LEVEL00ŠOPT„BRSŠPAGE*J*‚These�are�the�specialized�entry�points�for�all�the�various�routines�thatL*‚want�to�put�a�task�on�the�ready�list,�but�want�to�fiddle�with�the�priority*‚first.* SBRYRELQ: 2ŠMOVEQI�$F0,D0�Set�the�run�priority�of�the�task�to>ŠAND.B‚TCBCPRI(A0),D0…the�current�priority�with�the�low�4�bits#ŠMOVE.B�D0,TCBRPRI(A0)…set�to�zero.6ŠBRA„SBREADYŒThen�just�go�to�the�normal�READY�routine.  SBRYEXT1: SBRYEXIR: SBRYXMON: SBRYDLAY:SBRYACK: SBRYSTRT: SBRYWAKE:SBRYASR: SBRYCINT: CŠMOVE.B�TCBCPRI(A0),TCBRPRI(A0)ƒReset�the�run�priority�for�the�task*§to�its�current�priority.  *,*…FALL�THROUGH�to�the�main�READY�routine!!!!*ŠPAGE*>*…NOTE�--�Other�routines�fall�into�this�routine�from�above!!!!* READY:SBREADY: *(*‚See�if�he's�already�on�the�ready�list.**ŠPUSHƒSR‘Save�the�SR�we�were�entered�with.>ŠBSETƒ#TSK2NRDY,TCBSTAT2(A0)‚Set�the�bit�that�says�this�guy�is6ŠIF…�THENŠon�the�ready�list.‚If�he�wasn't�already, *.*‚He's�not;�get�set�up�to�put�him�on�the�list.*+ŠSAVEƒD1/A2ŽSave�registers�we'll�blow�away.>ŠLEA„READYHD-TCBREADY,A2‚A2�<--�address�such�that�TCBREADY(A2)(*§refers�to�the�ready�list�head�pointer.9ŠDISABLE_INTERRUPTSˆDisable�interrupts�while�we�work�with*§the�volatile�TCB�chain.@ŠMOVE.B�TCBRPRI(A0),D0…D0.B�<--�priority�of�task�to�put�on�list. *>*‚Search�the�list�for�a�TCB�of�lower�priority�than�this�guy's.*ŠREPEAT <ŠMOVE.L�TCBREADY(A2),D1„D1�<--�ptr�to�next�TCB�in�the�chain.6ŠBEQ„ADD_HIMŒIf�we�hit�the�end�of�the�list,�just�exit. 4ŠEXG.L‚D1,A2ŽA2�<--�ptr�to�the�TCB�we're�looking�at.#*§D1�<--�ptr�to�TCB�just�before�it.BŠUNTIL.B�D0��TCBRPRI(A2)‚Keep�looping�until�we�f- ind�a�TCB�with'*§a�priority�lower�than�our�guy�to�add. 5ŠEXG.L‚D1,A2ŽD1�<--�ptr�to�the�TCB�of�lower�priority.#*§A2�<--�ptr�to�TCB�just�before�it. *M*‚Either�we�found�somebody�of�lower�priority�than�the�guy�we're�trying�to�addK*‚or�we�hit�the�end�of�the�chain.‚Either�way,�we�want�to�add�the�new�guy�to5*‚the�list�between�the�TCB's�pointed�to�by�A2�and�D1.*JADD_HIMƒMOVE.L�D1,TCBREADY(A0)„Set�our�forward�link�to�point�to�the�guy�we'*§found�to�be�of�lower�priority�(or�0).AŠMOVE.L�A0,TCBREADY(A2)„Set�forward�link�of�the�guy�we�want�to�be *§after�so�that�it�points�to�us. !ŠRESTORE�D1/A2�Restore�registers. ŠENDI 2ŠPOP„SR‘Restore�the�SR�we�saved�on�entry�&�return.ŠRTS—*    ŠENDéééU1READY ASYST'M68XXX READY SA!!ƒM68xxx RMS TRAP 0 Put task on ready list.Å2pREADYHD BSBRYACK BSBRYEXIR BSBRYCINT BSBRYASR BSBRYEXT1 BSBREADY BSBRYRELQ BSBRYWAKE BSBRYSTRT BSBRYXMON BREADY  BSBRYDLAY "LG3@pðÀ($@&`h$&@çè-f,Hç@ Eø!ô|(&"* g ʰ*&còÊ!A 3%H LßFßNu4ééééééž =/*†RMS.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN=/*†FILE�WILL�DEFAULT�TO�RMS.LS=/*=/IFC \1=ARG :.M68XXX.RMS.LS=/ENDIF=/*)=ASM :.M68XXX.RMS,:.M68XXX.RMS,\1;MRZ=040=/*{ Included files are:- =/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*}=/*=ENDééééé駉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‰PAGE*RMS†IDNT„5,1‡68xxx�RMS�INITIAL�ENTRY�POINT*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆRMS‚IS�ENTERED�HERE*‰SECTION�LEVEL00* ‰XDEF„RMS‰XREF.L‚PROGINT9,DISPATCH*RMS†JMP„DISPATCH*(*…NULL�RETURNS�FOR�TRAPS�AND�SUBROUTINES*‰XDEFƒT1NULL,T0NULL,SBNULL*T1NULLƒCLR.W‚4(A7)†BE�SURE�WE�GO�TO�EXIT�0.‰MOVE.W�#RTCDDIRN,TCBRTCD(A6)‚SET�ERROR�RETURNT0NULL* SBNULLƒRTS**„JUMP�HERE�TO�CALL�KILLER*‰XDEFƒCALLKILL‰XREF.L�KILLERCALLKILL�JSR„KILLER‰ENDééééé. °*I1RMS ASYST'M68XXX RMS SAX!ƒ68xxx RMS INITIAL ENTRY POINTr2pPROGINT9 BRMS pKILLER BSBNULL BT0NULL BT1NULL pDISPATCH BCALLKILL "3@@Nù(Bo=|NuN¹(4ééééééé¹=/*†SELFTEST.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN$=/*†FILE�WILL�DEFAULT�TO�SELFTEST.LS=/*=/IFC \1=ARG :.M68XXX.SELFTEST.LS=/ENDIF=/*3=ASM :.M68XXX.SELFTEST,:.M68XXX.SELFTEST,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDéééé. éé‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰LIST‰PAGE9SELFTEST�IDNTƒ5,1ƒ68xxx�SYSTEM�SELFTEST�INTERRUPT�HANDLER*ˆ*********************ˆ*�SELFTEST�1.00„**ˆ*’**ˆ*�HLD6ƒ06/24/81‚**ˆ**********************…SELFTEST�INTERRUPT�ROUTINE*>*…THIS�ROUTINE�IS�USED�ONLY�TO�RESPOND�TO�A�SELFTEST�INTERRUPT-*…ON�A�VERSAMODULE�01�(AUTO�VECTOR�-�LEVEL�2)*%*…REGISTER�USAGE:�ALL�REGISTERS�SAVED*‰SECTION�LEVEL00*3CONTREG‚EQU„$F70030‡VERSAMODULE�01�CONTROL�REGISTER*‰XDEFƒSELFTEST‰XREF.S�SLFTSTA7*7SELFTEST�TST.L‚SLFTSTA7‡IS�THIS�FIRST�ENTRY�TO�ROUTINE?‰BNE.S‚SELFT4‰BRANCH�IF�NO!‰OR.Wƒ#$700,SR‡INHIBIT�INTERRUPTS-‰MOVEM.L�D0-D7/A0-A6,-(A7)‚SAVE�ALL�REGISTERS&‰MOVE.L‚A7,SLFTSTA7ƒSAVE�STACK�POINTER)‰MOVE.W‚60(A7),SR…RESTORE�INTERRUPT�LEVELBSELFT4ƒMOVE.L‚SLFTSTA7,A7ƒRESTORE�A7�IN�CASE�THIS�IS�NOT�1ST�ENTRY*6*„CODE�TO�CALL�A�SELF�TEST�ROUTINE�CAN�BE�ENTERED�HERE*!‰OR.W„#$700,SR†INHIBIT�INTERRUPTS'‰MOVE.B‚CONTREG,D0„GET�CONTROL�REGISTER%‰OR.B„#$20,D0‡SET�BIT�TO�TURN�OFF�LED/‰MOVE.B‚D0,CONTREG„PUT�IT�INTO�CONTROL�REGISTER4‰MOVE.L‚SLFTSTA7,A7ƒRELOAD�A7�(MAYBE�IT�WAS�CHANGED)0‰MOVEM.L�(A7)+,D0-D7/A0-A7ƒRESTORE�ALL�REGISTERS%‰CLR.LƒSLFTSTA7†CLEAR�ENTRY�FLAG�WORD ‰RTE“GO�BACK‰ENDééË2S1SELFTEST ASYST'M68XXX SELFTESTSA%!ƒ68xxx SYSTEM SELFTEST INTERRUPT HANDLER 2BSELFTEST pSLFTSTA7 "EX1†EQU‚1„NUMBER�FOR�EXIT1�-�GO�TO�DISPATCH,�DO�NOT�READY�TASKBEX2†EQU‚2„NUMBER�FOR�EXIT2�-�PUT�TASK�ON�READY�LIST,�THEN�DISPATCH%EX3†EQU‚3„NUMBER�FOR�EXIT�TO�DISPATCHFEX4†EQU‚4„NUMBER�FOR�EXIT4�-�DO�NOT�ALTER�TASK'S�SR�ON�RETURN�(RTEVNT)*"TABLE1ƒEQU�*ŽSTART�OF�TRAP�TABLE�1*T1NONEƒEQU„0�NO�DIRECTIVE‰DC.WƒT1NULLR-*,00*256+EX0T1GTSEG‚EQU„1�ALLOCATE�SEGMENT‰XREF.S�SEGALOC ‰DC.WƒSEGALOC-*,24*256+EX0+PB+TT T1DESEG‚EQU‚2�DEALLOCATE�SEGMENT‰XREF.S�SEGDEAL ‰DC.W�SEGDEAL-*,24*256+EX0+PB+TTT1TRSEG‚EQU‚3�TRANSFER�SEGMENT‰XREF.S�TFRSEG‰DC.W�TFRSEG-*,24*256+EX0+PB+TT'T1ATTSEG�EQU‚4�ATTACH�SHAREABLE�SEGMENT‰XREF.S�ATTSEGŠDC.W�ATTSEG-*,24*256+EX0+PB*T1SHRSEG�EQU‚5�GRANT�SHARED�SEGMENT�ACCESS‰XREF.S�SEGSHAR ‰DC.W�SEGSHAR-*,24*256+EX0+PB+TT'T1MOVELL�EQU‚6�MOVE�DATA�BETWEEN�SPACES‰XREF.S�MOVELL‰DC.W�MOVELL-*,28*256+EX0+PB+TT(T1DCLSHR�EQU‚7�DECLARE�SEGMENT�SHAREABLE‰XREF.S�DCLSHAR‰DC.W�DCLSHAR-*,24*256+EX0+PB(T1SNPTRAC…EQU‚8ŒMOVE�TRACE�TABLE�TO�USER‰XREF.S�SNAPTRACŠDC.W�SNAPTRAC-*,00*256+EX0(T1RCVSA‚EQU‚9‹RECEIVE�SEGMENT�ATTRIBUTES ‰XREF.S�RCVSA‰DC.W�RCVSA-*,28*256+EX0+PB+TT T1R10„EQU‚10‰DC.W�T1NULLR-*,00*256+EX0T1CRTCB‚EQU‚11ŽCREATE�TCB ‰XREF.S�CRTCB‰DC.W�CRTCB-*,28*256+EX0+PB T112…EQU‚12‰DC.W�T1NULLR-*,00*256+EX0T1START‚EQU‚13ŽSTART�TASK‰XREF.S�TSKSTARTŠDC.W�TSKSTART-*,10*256+EX2+PBêHóGûO T1ABORT‚EQU‚14ŠABORT�TASK�(SELF) ‰XREF.S�ABORT‰DC.W�ABORT-*,00*256+EX3‰XDEF�T1TERMŠFOR�EXABRT#T1TERMƒEQU‚15ŽTERMINATE�TASK�(SELF) ‰XREF.S�TERM‰DC.W�TERM-*,00*256+EX3(T1TERMT‚EQU‚16ŽTERMINATE�TASK�(NOT�SELF) ‰XREF.S�TERMT‰DC.W�TERMT-*,10*256+EX2+PB#T1SUSPND�EQU‚17ŽSUSPEND�TASK�(SELF)‰XREF.S�SUSPEND‰DC.W�SUSPEND-*,00*256+EX1%T1RESUME�EQU‚18ŽRESUME�SUSPENDED�TASK‰XREF.S�RESUME‰DC.W�RESUME-*,08*256+EX2+PB+TT‰XDEF�T1WAITŠNEEDED�FOR�WAKEUP)T1WAITƒEQU‚19ŽTASK�BECOMES�BLOCKED�(SELF)‰XREF.S�TSKWAIT‰DC.W�TSKWAIT-*,00*256+EX1%T1WAKEUP�EQU‚20ŽWAKEUP�A�WAITING�TASK‰XREF.S�WAKEUP‰DC.W�WAKEUP-*,08*256+EX2+PB+TT0T1DELAY‚EQU‚21‹DELAY�SOME�NUMBER�OF�MILLISECONDS ‰XREF.S�DELAY‰DC.W�DELAY-*,00*256+EX1$T1RELINQ�EQU‚22‹RELINQUISH�EXECUTION‰XREF.S�RELINQ‰DC.W�RELINQ-*,00*256+EX1&T1TSKATR�EQU‚23‹RETURN�TASK�ATTRIBUTES‰XREF.S�TSKATTR ‰DC.W�TSKATTR-*,08*256+EX0+PB+TT$T1SETPRI�EQU‚24†SET�CURRENT�PRIORITY‰XREF.S�SETPRI‰DC.W�SETPRI-*,09*256+EX2+PB+TTT1STOPƒEQU‚25†STOP�RUNNING�TASK ‰XREF.S�STOPT‰DC.W�STOPT-*,08*256+EX0+PB4T1EXPVCT�EQU‚26ŠSAVE�TASK'S�EXCEPTION�VECTOR�ADDRESS‰XREF.S�EXPVCT‹DC.W�EXPVCT-*,36*256+EX0+PB/T1TRPVCT‚EQU‚27ŠSAVE�TASK'S�TRAP�VECTOR�ADDRESS‰XREF.S�TRPVCTŠDC.W�TRPVCT-*,56*256+EX0 0+PB(T1TSKINF‚EQU‚28�MOVE�TASK�INFO�TO�CALLERŠXREF.S�TSKINFO ŠDC.W�TSKINFO-*,14*256+EX0+PB+TT+T1RQSTPA‚EQU‚29�REQUEST�PERIODIC�ACTIVATIONŠXREF.S�RQSTPAŠDC.W�RQSTPA-*,26*256+EX0+PB+TT'T1DELAYW‚EQU‚30�DELAY�WITH�WAIT�OPTIONSŠXREF.S�DELAYWŠDC.W�DELAYW-*,00*256+EX1T1GTASQƒEQU‚31ŽALLOCATE�AN�ASQ‰XREF.S�ASQALOC ŠDC.W�ASQALOC-*,22*256+EX2+PB+TTT1DEASQƒEQU‚32�DEALLOCATE�ASQ‰XREF.S�ASQFREEŠDC.W�ASQFREE-*,00*256+EX0T1SETASQ‚EQU‚33�SET�ASQ�STATUS‰XREF.S�ASQSTATSŠDC.W�ASQSTATS-*,00*256+EX0#T1RDEVNT‚EQU‚34ŽREAD�EVENT�FROM�ASQ‰XREF.S�ASQREADŠDC.W�ASQREAD-*,00*256+EX0T1QEVNTƒEQU…35ŠXREF.S�ASQEVENT!ŠDC.W„ASQEVENT-*,18*256+EX2+PB+TTT1WTEVNT‚EQU…36ŒWAIT�FOR�EVENTŠXREF.S�WTEVENTŠDC.W„WTEVENT-*,00*256+EX1!T1RTEVNT‚EQU…37ŒRETURN�FROM�EVENTŠXREF.S�RTEVENTŠDC.W„RTEVENT-*,00*256+EX4 T1R38…EQU…38ŠDC.W„T1NULLR-*,00*256+EX0 T1R39…EQU…39ŠDC.W„T1NULLR-*,00*256+EX0 T1R40…EQU…40ŠDC.W„T1NULLR-*,00*256+EX0"T1ATSEMƒEQU…41ŒATTACH�TO�SEMAPHORE ŠXREF.S‚ATSEMŠDC.W„ATSEM-*,10*256+EX0+PB T1WTSEMƒEQU…42ŒWAIT�ON�SEMAPHORE ŠXREF.S‚WTSEMŠDC.W„WTSEM-*,10*256+EX0+PBT1SGSEMƒEQU…43ŒSIGNAL�SEMAPHORE ŠXREF.S‚SGSEMŠDC.W„SGSEM-*,10*256+EX0+PBT1DESEMƒEQU…44ŒDETACH�SEMAPHORE ŠXREF.S‚DESEMŠDC.W„DESEM-*,10*256+EX0+PBT1CRSEMƒEQU…45ŒCREATE�SEMAPHORE ŠXREF.S‚CRSEMŠDC.W„CRSEM-*,10*256+EX0+PB3T1DESEMA‚EQU…46�DETACH�ALL�SEMAPHORES�FOR�THIS�TASKŠXREF.S‚DESEMAŠDC.W„DESEMA-*,00*256+EX0 T147†EQU…47ŠDC.W„T1NULLR-*,00*256+EX0 T148†EQU…48ŠDC.W„T1NULLR-*,00*256+EX0 T149†EQU…49ŠDC.W„T1NULLR-*,00*256+EX0 T150†EQU…50ŠDC.W„T1NULLR-*,00*256+EX0.T1SERVER‚EQU…51ŽESTABLISH�SERVER�FOR�USER�TRAPŠXREF.S‚SERVERŠDC.W„SERVER-*,06*256+EX0+PB+T1DSERVE‚EQU…52�DETACH�FROM�SERVER�FUNCTIONŠXREF.S‚DSERVEŠDC.W„DSERVE-*,00*256+EX0.T1DERQST‚EQU…53ŽSET�USER/SERVER�REQUEST�STATUSŠXREF.S‚DERQSTŠDC.W„DERQST-*,00*256+EX0+T1AKRQST‚EQU…54ŽACKNOWLEDGE�SERVICE�REQUESTŠXREF.S‚AKRQSTŠDC.W„AKRQST-*,20*256+EX0+PB+TT T155†EQU…55ŠDC.W„T1NULLR-*,00*256+EX0 T156†EQU…56ŠDC.W„T1NULLR-*,00*256+EX0 T157†EQU…57ŠDC.W„T1NULLR-*,00*256+EX0 T1CDIR„EQU…58 ŠXREF.S‚CDIRŠDC.W„CDIR-*,08*256+EX0+PB T159†EQU…59 ŠXREF.S‚SUPERŠDC.W„SUPER-*,00*256+EX0T1CMR…EQU…60�CHANNEL�REQUEST ŠXREF.S‚CMRŠDC.W„CMR-*,00*256+EX0 ŠXREF.S‚CISR1T1CISR„EQU…61ŽCLAIM�VECTOR�-�INTRRUPT�SERVICE�RTNŠDC.W„CISR-*,20*256+EX0+PB+TT ŠXREF.S‚SINT)T1SINT„EQU…62‰SIMULATE�USER�I/O�INTERRUPTŠDC.W„SINT-*,04*256+EX0+PB T163†EQU…63ŠDC.W„T1NULLR-*,00*256+EX0 ŠXDEF„T1EXMON*T1EXMONƒEQU…64ˆATTACH�TO�EXCEPTION�MONITOR ŠXREF.S‚EXMONŠDC.W„EXMON-*,16*256+EX1+PB+TT,T1DEMONƒEQU…65ˆDETACH�FROM�EXCEPTION�MONITOR ŠXREF.S‚DEMONŠDC.W„DEMON-*,16*256+EX0+PB+TT*T1EXMMSK‚EQU…66ˆSET�EXCEPTION�MONITOR�MASKŠXREF.S‚EXMMSKŠDC.W„EXMMSK-*,12*256+EX0+PB+TT"T1RSTATE‚EQU…67ˆRECEIVE�TASK�STATEŠXREF.S‚RSTATEŠDC.W„RSTATE-*,12*256+EX0+PB+TTT1PSTATE‚EQU…68ˆPUT�TASK�STATEŠXREF.S‚PSTATEŠDC.W„PSTATE-*,12*256+EX0+PB+TT0T1REXMON‚EQU…69ˆEXECUTE�TASK�UNDER�EXMON�CONTROLŠXREF.S‚REXMONŠDC.W„REXMON-*,12*256+EX0+PB+TT T170†EQU…70ŠDC.W„T1NULLR-*,00*256+EX0 T171†EQU…71ŠDC.W„T1NULLR-*,00*256+EX0T1MOVEPL‚EQU…72 ŠXREF„MOVEPLŠDC.W„MOVEPL-*,28*256+EX0+PB!T1STDTIM‚EQU…73‰SET�DATE�AND�TIMEŠXREF.S‚STDTIMŠDC.W„STDTIM-*,08*256+EX0+PB!T1GTDTIM‚EQU…74‰GET�DATE�AND�TIMEŠXREF.S‚GTDTIMŠDC.W„GTDTIM-*,08*256+EX0+PB!ENDTAB1ƒEQU�*ŽEND�OF�TRAP�TABLE�1ŠENDéé0 éééJ1TABLE1 ASYST'M68XXX TABLE1 SA !ƒM68xxx TABLE OF TRAP 1 MODULESÿ2pSUSPEND pRTEVENT pCDIR pSEGSHAR PT1EXMON @pTSKWAIT pWTEVENT pASQEVENT pASQSTATS pCMR pCISR pTSKINFO pT1NULLR PT1PARBLK PT1TRGTSK pTSKATTR pTSKSTART pSINT pTERM pGTDTIM pEXPVCT pCRTCB û2pATTSEG BENDTAB1 ,BTABLE1 pDEMON pDSERVE pEXMON pSTDTIM pATSEM pCRSEM pABORT pDESEM pDESEMA pEXMMSK pAKRQST pTRPVCT pDELAY pDELAYW pDERQST pRCVSA pSERVER pTFRSEG pRELINQ ø2pMOVELL pRESUME pMOVEPL pSGSEM PT1WAIT PPB €pRQSTPA pSUPER pSTOPT pWAKEUP pWTSEM pPSTATE pREXMON pSETPRI PTT @pRSTATE PT1TERM pTERMT pASQREAD pASQALOC pASQFREE 22pSEGALOC pSNAPTRAC pDCLSHAR pSEGDEAL ",e3ªªªª@AIüÀALøÀA6ôÀA$ð€AìÀA8èÀAKä€AJàA4ÜÀAØA#Ô€AÐAÌ ‚A+ÈA Äf3ªªªªAEÀ ‚A¼A9¸ÂA´A?°ÂA1¬A7¨A¤ÀAC  ÂA>œ€A"˜$€A0”8€A�ÀA<ŒÀA2ˆAG„Âu3ªªªªAH€Bÿ|BFÿxBÿtÂBÿpBÿlBÿhBÿdBÿ`B)ÿ\ €B@ÿX €B;ÿT €B,ÿP €B*ÿL €B-ÿHBÿDv3ªªªªBÿ@Bÿ<Bÿ8B5ÿ4€B&ÿ0B3ÿ,B/ÿ(ÀBÿ$Bÿ BÿBÿ€B=ÿBÿBÿ ÀBÿ€BÿS3ªª¨B'ÿÁB%þüÀB.þø ÀBDþô ÀBAþð ÀBBþì ÀBþèBþäB:þà€B(þÜ€B!þØ€4éé -INITDAT‚IDNT†3,1�System�Initializer�DATA�Area*-*„THE�FOLLOWING�EQUATES�ARE�USED�FOR�BUILDING%*„A�MEMORY�TABLE�FOR�THE�INIT�ROUTINE*MTYP0‚EQU�0‰RAM�MEMORY�TYPE�0 MTYP1‚EQU�1*16†RAM�MEMORY�TYPE�1 MTYP2‚EQU�2*16†RAM�MEMORY�TYPE�2 MTYP3‚EQU�3*16†RAM�MEMORY�TYPE�3 MTYP4‚EQU�4*16†RAM�MEMORY�TYPE�4 MTYP5‚EQU�5*16†RAM�MEMORY�TYPE�5 MTYP6‚EQU�6*16†RAM�MEMORY�TYPE�6 MTYP7‚EQU�7*16†RAM�MEMORY�TYPE�7*PART0‚EQU�0‰PARTITION�NUMBER�0PART1‚EQU�1‰PARTITION�NUMBER�1PART2‚EQU�2‰PARTITION�NUMBER�2PART3‚EQU�3‰PARTITION�NUMBER�3PART4‚EQU�4‰PARTITION�NUMBER�4PART5‚EQU�5‰PARTITION�NUMBER�5PART6‚EQU�6‰PARTITION�NUMBER�6PART7‚EQU�7‰PARTITION�NUMBER�7PART8‚EQU�8‰PARTITION�NUMBER�8PART9‚EQU�9‰PARTITION�NUMBER�9!PART10�EQU�10ˆPARTITION�NUMBER�10!PART11�EQU�11ˆPARTITION�NUMBER�11!PART12�EQU�12ˆPARTITION�NUMBER�12!PART13�EQU�13ˆPARTITION�NUMBER�13!PART14�EQU�14ˆPARTITION�NUMBER�14!PART15�EQU�15ˆPARTITION�NUMBER�15‡PAGE*#*†MACRO�TO�BUILD�MEMORY�TABLE�ENTRY* MTENTRY MACRO1  \@A„SET„0‡IFC„'\1','RAM' ‡DC.Bƒ\4+\5,0 ‡DC.Lƒ\2,\3‡DC.B„\6‡DC.B„0 \@A„SET„1‡ENDC‡IFC„'\1','ROM' ‡DC.Bƒ$FF,0 ‡DC.Lƒ\2,\3‡DC.Wƒ0 \@A„SET„1‡ENDC ‡IFEQƒ\@A ‡FAILƒ2000‡ENDC‡ENDM* MTENDƒMACRO ˆDC.Wƒ$FFFFˆENDM ‰PAGE ‰SECTION�8*%*ˆDATA�REQUIRED�BY�SYSTEM�INITIALIZER* ‰XDEFƒTCBHEADTCBHEAD‚DC.Lƒ\$TCBLSTˆTCBHD ‰XDEFƒRDYHEADRDYHEAD‚DC.Lƒ\$TCBRDYˆREADYHD ‰XDEFƒESTART#ESTARTƒDC.Lƒ\STARTRMS‡START�OF�EXEC ‰XDEFƒEENDEEND…DC.Lƒ\MEMBEG‰END�OF�EXEC ‰XDEFƒESTACK%ESTACKƒDC.Lƒ\STACKŠEXEC�STACK�ADDRESS ‰XDEFƒMMUMMU†DC.Lƒ\MMUŒMMU�ADDRESS ‰XDEFƒPANELA&PANELAƒDC.Lƒ\PANELŠFRONT�PANEL�ADDRESS ‰XDEFƒSMEMLOSMEMLOƒDC.Lƒ0�SECMEMLO ‰XDEFƒSMEMHISMEMHIƒDC.Lƒ0�SECMEMHI‰XDEFƒDISPATCH"DISPATCH�DC.Lƒ\STARTRMS‡DISPATCHER ‰XDEFƒGSTSIZGSTSIZƒDC.Lƒ\GSTŒGST�#�OF�PAGES ‰XDEFƒUSTSIZUSTSIZƒDC.Lƒ\USTŒUST�#�OF�PAGES ‰XDEFƒUDRSIZUDRSIZƒDC.Lƒ\UDRŒUDR�#�OF�PAGES ‰XDEFƒPATSIZPATSIZƒDC.Lƒ\PATŒPAT�#�OF�PAGES ‰XDEFƒTRCSIZ\4)TRCSIZƒDC.Lƒ\TRACE‹TRACE�TABLE�#�OF�PAGES ‰XDEFƒTRCFLAGTRCFLAG‚DC.Wƒ\TRCFLAG ‰XDEFƒTIMERA#TIMERAƒDC.Lƒ\TIMER‹ADDRESS�OF�TIMER‰XDEFƒTIMINTVA;TIMINTVA�DC.Wƒ\TIMINTVˆ#�MILLISECS�BETWEEN�TIMER�INTERRUPTS ‰XDEFƒTIMSLIC?TIMSLIC‚DC.Wƒ\TIMSLICˆ#�TIMER�INTERRUPTS�BEFORE�TASK�RELINQUISH‰XDEFƒCLOCKFRQ1CLOCKFRQ�EQU„\CLOCKFRQ‡#�CLOCK�TICKS�PER�MILLISEC ‰XDEFƒIOVSIZ$IOVSIZƒDC.Lƒ\IOV�SIZE�OF�IOVCT�TABLE ‰XDEFƒMEMTYPA0MEMTYPA‚DC.BƒMTYP0ŒDEFAULT�MEMORY�TYPE�FOR�ASQ'S ‰XDEFƒMEMTYPT0MEMTYPT‚DC.BƒMTYP0ŒDEFAULT�MEMORY�TYPE�FOR�TCB'S ‰XDEFƒMEMTYPSEMEMTYPS‚DC.BƒMTYP0,MTYP0†DEFAULT�MEMORY�TYPE�FOR�SYSTEM�TASKS�(RO,RW) ‰XDEFƒMEMTYPUCMEMTYPU‚DC.BƒMTYP0,MTYP0†DEFAULT�MEMORY�TYPE�FOR�USER�TASKS�(RO,RW) ‰XDEFƒBUGTRAC8BUGTRAC‚DC.Lƒ\BUGTRAC‰ADDRESS�OF�MACSBUG'S�TRACE�ROUTINE‰XDEFƒDUMMYPTRADUMMYPTR�EQU„$A00‰USE�AS�DUMMY�POINTER�FOR�NON-EXISTANT�ADDRESSES‰XDEFƒWHERLOAD/WHERLOAD�DC.Lƒ\WHERLOAD…WHERE�MACSBUG�WILL�LOADŠXDEF†PAGESIZE7PAGESIZE‚DC.L…\PAGESIZE„PAGESIZE�FOR�SEGMENT�ALLOCATION ŠXDEF…ASN;ASN‡DC.L…\ASN‰NUMBER�OF�ADDRESS�SPACES�(CURRENTLY�0�OR�127)‹PAGE*9*‚MEMORY�TABLE�-�USED�BY�INIT�TO�SET�UP�FREE�MEMORY�LISTS* ‹SECTIONƒ8 ‹OPT‡NOCL*‹XDEF†MEMTABL,ENDMEMT* TOPˆSET†0 BOTTOM…SET†1* MEMTABL„EQU†*,‹MTENTRY‚RAM,$00000,\MEMEND1,MTYP0,PART0,TOP‹IFNE…\MEMEND21‹MTENTRY‚RAM,\MEMEND2,\MEMEND3,MTYP0,PART1,BOTTOM‹ENDC‹MTEND‹DS.L…10 ENDMEMT„EQU†*‹ENDééX1AKRQST ASREL'M68XXX AKRQST SAF# „68xxx DIRECTIVE--ACKNOWLEDGE SERVICE REQUEST62pSBRYACK pTIOT pSBV FAKRQST &ðF3 - ,f--fn Nu, A²-sg--gâÂüGø $3´®gF3^nNu>,--gGÿg­-g- ,gSs­-f­ ,SsI33g³ gAóaBÿhgl û g+l  g+l 93€ g- ,fAÕaBÿ0Nu gí,Nu gÜí ,Nu4é1 ééééé%I1ASQALOC ASREL'M68XXX ASQALOC SAG „68xxx DIRECTIVE--ALLOCATE ASQ+2pSBPAGAL FASQALOC pADEFTYP &vH3 J­@g\n`h&, ƒÿà‹HC8 HC CaAÜ`Pn`F&H&¼!ASQl«<3l 'l'l Aë('H'H'H"áŠÔ‹'BBk&+K@Nu4ééééééé.H1ASQEVENT ASREL'M68XXX ASQEVENTSAG8 „68xxx DIRECTIVE--QUEUE EVENT62pSBASRINT FASQEVENT pSBUPDATQ pSBLOGPHY &H3&L(m@ fXn`Þ,fn`ìz,+ n6aAÒ` Nqn `Ò"FB�F3,+ Ü�àŽ¼pPbä �c6B…,B‡ fY‡+2 gX� ‡fP†I3P�P…B€,¼€cn`X($KaBÿd`Zn`H(m@ JÄ(gÇÇtU„I3a0(g tEèaY„J…g $EîaQ„$I$gaaBÿNu6Ú·ìe&lUBnð3Nu4éééééé7K1ASQFREE ASREL'M68XXX ASQFREE SAH$ „68xxx DIRECTIVE--DEALLOCATE ASQI2FSBDASQX pKILLER pSBPGFR FDASQX FASQFREE &0:3(N¬-J¬@g l@B¬@"(’ˆ�ÿà�aAÚ`aAÔNu4ééééééé2 @G1ASQREAD ASREL'M68XXX ASQREAD SAHU „68xxx DIRECTIVE--READ EVENT 2FASQREAD pSBLOGPHY &LH3(n@ fXnNuJl&f~`*lB‡-gY‡*, n6aAÊ` Nqn F3Nu&F GfBSNuT�‚gX�»ìe›ìÛìÇÂn`6Ý»ìe*lUGnðF3. R‡‡¾¬e.,@ç|)GSl&Fß&F f$k'jJ+g+F3g7|NuB€00PR@ÐpPሀ�‹B‡+°‡l.oÔ|G*,+I3@g7|Nu j6aBþî`"``êàŽÜpPáŽÜ>0PR‡á�žƒ|GB‡+*F3Gë6ÝU‡núNu4ééééééIK1ASQSTATS ASREL'M68XXX ASQSTATSSAIC „68xxx DIRECTIVE--SET ASQ STATUS 2pSBASRINT FASQSTATS &4<3€(n@ fXn`$ . ?,ø€_@Jl&gKÖaAÐNu4ééééé3 ééRQ1ASRINT ASREL'M68XXX ASRINT SAP „68xxx TRAP 0--PROVIDE EVENT INTERRUPTX2FSBASRINT pSBRYASR FSBUPDATQ ºFASRINT FUPDTASQ ¼pSBLOGPHY &F3--f°, g˜", l(gTˆ±ìe l2HA±ìe lJ3@2J�kL"Az, m6aA®`Nq`8)I,-*g>*g RjÇaÞ* f@* g­I3 ,fí-`­ ,g` B­X­,AÕaBÿ\fÿfa|`ÿ`HçAP$8 &68J3€!HC(HD4<  g 4<8***HB* g2Hçz,* m6aBÿ`NqLßI38`Lßp&*HC6‚€4*AÕaBþâNqLß ‚R�`ÿ|@ç|$©%|ÿÿÿÿ#J*3FßNuIé L g(@´¬lò%B$€ ŠNu4éééééˆV1CKEXPAT ASREL'M68XXX CKEXPAT SAT1 „68xxx CHECK PAT FOR EXEC ENTRY TO ACTIVATEA2pDATE pTIMINTV BCKEXPA pPATBEG pTIMEOD "pF3@"x Aé ?Fü'"HJ‘fNs Q²¨mð°hlê/(?(Bh (RhШ ²€lô63!@B€0("((f"�"x  ©#H!|ÿÿÿÿFßNu4ééééé5 é‘T1CMR ASREL'M68XXX CMR SAU „68xxx RMS68K CHANNEL MANAGEMENT ROUTINES³2pSBPAGAL pCOMINTZ GCMR pVCTUBGN pSBP pCCBHD pSBV pTRACER pKILLER pCOMINT pSEMCCB pSBPGFR pTRACFLAG GCMRSFAIL ÞpSBLOGPHY 'J3@T,fz. n6aAî`NqpaX$F"*fp aJAø Aø aAÊGø "SJ“H3g²©gÒGé`ì f¸, n6B…*ç�EaA”`Nq`¢B€* F3e c @dpËa„r Âj A fp ar"x J1gj°*f¦ *ÿF3g Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*H3²sPdpÏa ²sPd pÏaR`NQ…lâp Àjf$ * @fRˆ/<*F? *(SJ“fp a¤Gì°¬fì*,F3Ig°,(gp a„ ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aI3€Bþ>` LßpaÿHLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLêF3?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@H3D&j ×Ó#K )ÿf#|*ì*géI*géH`R*fbF3B€*&x J3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #KH3)I`#K&iD3|N¹J#|* LIéJ&ŒB€* x ¼ÿ iÑè*I/N�,_F3`t`Zp aøp aôpað g@o opÁaÜ n6B€S&@B… f )I3e2 )c )€e" )�b;°g,aBü”` Nq`¢×ËGû°ÖÓNÓF3ÿþ Ì¢Úð *a²f´ © ©HfX")D(A&TGëÿ¶ `&lJ¬fK3@ aBü8°‹g(K`ê¹Áf&J«g((k)|N¹J)|* LIìJ&kD&Œ` )k`B�)O3 €Q(&iD&¼(&x B3Iø  &TJ”faBûÖ°‹gIë`ì(«Aø aBûÀ IraBû¸I3`8aBû°p�az&Iaî"Kfpal)Hgp‚a`)IgpƒaT)Ig .(F3gþ†)Igp a6 )c )c )€e )�c*g< * d I3pÆa˜`”j :#j +HPš£Aø aBùÎ mÑè/N�,_J@g>a, )L3P(AîDJ�g"P°©gAé `îF€NuB�Aø aBù� X�=@`Aø aBù~B€B®F3Nu,m4B€-9f NpN@`F|q|ptAíp!­< g ­€pX‚€F3 ­8 T‚´-:cm:pLí<pažNuHç`CípB€ m"-+g|00J)F3fFÄ)fCéS`â0))gJ0`(©0-&ЈfS€�ˆ$J0F3U@løB0 UBlø@À@FÀ-Hg Hç:aÿ Lß\øLß|NuLß|ÿþNuHçI3@ m4pN@`Lßx`LßxNu8 g @çaBøTîFßHç€Ä*oKíÿ°"m/ N‘*_e M3I -g*@`êLß#X�`Bø$8!gaBøîHç€Ä 8 g*@ m ( g / @çN°3€Fß*_ -`àLß#`B÷æ4éé5 éééU1DCLSHAR ASREL'M68XXX DCLSHAR SAWD „68xxx DIRECTIVE--DECLARE SEGMENT SHARABLE+2pSBFNDGSG pSBFNDSEG EDCLSHAR %êH3*n6., AÕaAô`^n`Ò<5P$0@0f22, A0g ŒA g& f.F3(fn `œn`¾\n`¸,g†, gÆ"�$. uI3 P aBÿ|`±üf Zn`R\n`L�uP$!uP  ‚1A1| Bƒ65PÖuPá‹!C03 65P–uPRC1C3@1| , gè Nu4éééééé«B1DELAY ASREL'M68XXX DELAY SAX) „68xxx DIRECTIVE--DELAYq2pSBASRINT pSBRYASR pSBRDTIM pSBRYWAKE FDELAY FDELAYW pPATBEG pSBADDPA pSBFREEPA &ðH3 ~`B‡$ ‚&\c$<&\aAèÔ�"x Eé&J g$@Jªg ½êfìJªfæ&’J3@aA¾`à@ç .@gF(@|JGg ìì .-g¬ F×AÖaAˆ`f, L3€gJl&gF×KÖaBÿp`à|JGgî,®-g®,F×AÖaBÿJ`( )g&93€$@#RF×%NBj%|!DLY-JXF×aBÿ FßNuF×=|`ò4éé6 éééé´U1DEMON ASREL'M68XXX DEMON SAY& „68xxx DIRECTIVE--DETACH EXCEPTION MONITORI2FSBDMONX pSBREADY pSBQEVNTN FDEMON FDMONX &`H3$Lª ,`$H*)fn Nu$< 4*&*(*8<Aê@aAÈNq(Jª(3)ªúBªHª ,fNuAÒaA¤Nu4éééééé½~'M68XXX DERQST ROÒÒDESEM ROÛÛDSEGX ROääDSERVE ROííDSRVX ROööEQDQ ROÿÿEXABRT ROEXMMSK ROEXMON ROEXMONVR RO##6 EXQEVENTRO,,EXRQPA RO55FNDGSEG RO>>FNDTSEG ROGGFNDUSEM ROPPGETTCB ROYYGTDTIM RObbLOGPHY ROkkPAGEALOCROttPAGEFREERO}}[1DERQST ASREL'M68XXX DERQST SA „68xxx DIRECTIVE--SET USER/SERVER REQUEST STATUS62pTIAT pTIOT pSBV FDERQST &lF3"� Cø  1fÂüCø $1´®g^nNuf Jñkú±431fBq±Nuñ± gAñaA˜Nu4ééééééÊR1DESEM ASREL'M68XXX DESEM SA6 „68xxx DIRECTIVE--DETACH FROM SEMAPHOREr2FSBDSEMX .pSBV FDSEMX .FDESEM FDESEM4 FDESEMA ,pSEMUST pSBFNDSEM &JJ3*F(N UaAø`^n`&"Jq l&1 1fJ1gAñ0aAÊJq jB±F3Bq B10 Sq0 `ÚB10 10gzSq0 f$ 10fº10°10g®3¼0 F3B±0`¤.10,10B„4)pJq l.¾±f(¼±f"JDg#„`(3±0 3±0I3#±0Bq0 €SBfÂ`NJ10j*q0^mAñ0aBÿ`è.10,104)pJqI3 j¾±f¼±fBq B±€SBfÜBq0 B±0Nu(N,)g AøaBþÄ`3Nua`ð`þÌ4éé7 éééÓQ1DSEGX ASREL'M68XXX DSEGX SA( „68xxx TRAP 0--DEALLOCATE ALL SEGMENTSP2ESBDSEGX pKILLER pGSTBEG EDSEGX pSBPGFR pSEGDAL5 %ŽF3J¬6g*l6B…:-5P$gabQ… E lî,)gP"x Ké>)gB,,Jm J3 g.¼•f*­ Jm f0-@ fB�2- m aA˜`aA’ÛüSGfÂNuB„,3)gÄ `Bÿt4ééééééÜW1DSERVE ASREL'M68XXX DSERVE SA „68xxx DIRECTIVE--DEALLOCATE SERVER FUNCTION[2pTIAT pSBREADY pTIOT pSBV pTCBHD FDSERV3 *FDSERVE &ŽF3$‚Eø  2 f"ÂüCø ½ñg^n`b&x + ,g,´+sf&«H3€-« ,'|çJBB+ûæJAÓaA &k fÄB2 B±B±Bq13g AñaBÿx`îNu4é7 éééééåT1DSRVX ASREL'M68XXX DSRVX SAE „68xxx TRAP 0--DEALLOCATE SERVER FUNCTIONP2pTIAT pSEMTIOT FSBDSRVX pTIOT pDSERV3 FDSRVX &2:3P€Eø Cø t 2 f "Âü¹ñg R‚ ‚mâNua`Ü`AÐ4éééééééîI1EQDQ ASREL'M68XXX EQDQ SA „68xxx TRAP 0--ENQUEUE/DEQUEUEj2pSBP pTIOT pSBQEVNTT pSBV BEXEQDQ pEXITIR BSBEXEQDQ BEQDQ " F3@ Eø Çìs,)gÇ`"ÂüEø (NGs*r»Îg°$<‡42F38 &26,(gÃáK,$( *,,,p<,.,>, ,"0<2 gB@F32g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòaR3€�Bÿ@J²gHç@(AÕaBÿ0`0Lß raBÿ",sf-|çOGB.ûAúBÿ&3.ˆNuLß,sò Rrì ,Nu4ééééé÷D1EXABRT ASREL'M68XXX EXABRT SA „68xxx TRAP 0--ABORT TASKE2pSBREADY pTRAP1B BEXABRT pT1TERM BSBEXABRT "pF3Ç1G*Bh\è)!|EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†83A1F,|ð& faA®Nu1F,X� <(1Wú!oü`A’4éééééé8 W1EXMMSK ASREL'M68XXX EXMMSK SA3 „68xxx DIRECTIVE--SET EXCEPTION MONITOR MASK2FEXMMSK & 3(H!lH8(H�(HNu4ééééééé X1EXMON ASREL'M68XXX EXMON SAX „68xxx DIRECTIVE--ATTACH TO EXCEPTION MONITOR+2pSBGTXTCB pSBQEVNTT FEXMON &°H3$M l", aAô`^nNu*H*)g\nNu»Êg.½Êg*,g".(f*H3(f m±êg-(fn Nu$< 4*&*(*8<AÕaA†`Zn63Nuí)ê)ê ,%m@%mD½ÊfNu?|Nu4éééé9 ééT1EXMONVR ASREL'M68XXX EXMONVR SA5 „68xxx SUBROUTINE--VALIDATE EXMON REQUEST 2FEXMONVR pSBLOGPHY &@H3-)g. -@°®f$ -D°®f*,+ n6aAØNuNqn `n X�Nu4éééééééE1EXQEVENT ASREL'M68XXX EXQEVENTSA „68xxx TRAP 0--QUEUE EVENTŒ2pSBASRINT pSBGTXTCB CEXQEVNTI 8CEXQEVNTN CEXQEVNTT pSBUPDATQ CSBQEVNTI 8CSBQEVNTN CSBQEVNTT pTMSGFLAG #ÆH3*I"H Q")aAô`T—Nu"M �!TCBfò*H(m@ ”!ASQfì`T—`n �!TCBfH3*H(m@ gÆPø ,fT—`B"á™�ÿaAš``êHç<ta4gßüHç`I3@ta$ßüJ€g/aBÿn`T¯(¬fNuNuAï6Ø·ìe&lUBgU�fì 3NuUANu4éé9 éééé$`1EXRQPA ASREL'M68XXX EXRQPA SAI „68xxx TRAP 0--REQUEST PERIODIC ACTIVATION OF PROCESS:2pSBRDTIM BEXRQPA pPATBEG BSBRQPA "¬F3@çHçp "x Gé Fü'$K&g&&C´«fò$“JAj.&©#K'|ÿÿÿÿLßT�NuF3JAkô&)fT¯`è&C#SFïB«'@ '@'H'BB«Bkgë53@áIAA 7AaBÿnÓ«Fü'&© #K LßT�Nu4éééééé-Z1FNDGSEG ASREL'M68XXX FNDGSEG SA „68xxx TRAP 0--FIND SEGMENT IN GLOBAL SEG TABLE/2DSBFNDGSG pGSTBEG DFNDGSEG $~F3BƒB€"x  gbEé0)gP—ËJj f ·üf$&J` ±êf´’gB* g D3f4 f& ÕüS@fÄJƒf"0) K·üf J°i m‘ÈR€T—Nu JNu CNu4: éééééé6\1FNDTSEG ASREL'M68XXX FNDTSEG SAP „68xxx TRAP 0--FIND SEGMENT IN TASK SEGMENT TABLE$2DSBFNDSEG DFNDTSEG $,23B€*g B…:(0P$f `¾°P g Q… E læ*T—Nu4ééééééé?: T1FNDUSEM ASREL'M68XXX FNDUSEM SA „68xxx TRAP 0--FIND USER SEMAPHORE IN UST:2pKILLER pUSTBEG DSBFNDSEM DFNDUSEM $‚F3B‚BƒB�"x ( gd4)´i gRB(pJq fJƒf:& „g04)`*±ügF3±ñf$lµñf$lµñg"Jq k"€SDf²T—JƒfB€B‚Nu Nu q3Nu4ééééééHX1GETTCB ASREL'M68XXX GETTCB SAI „68xxx TRAP 0--GET TASK CONTROL BLOCK ADDRESSX2DSBGETTCB DSBGTXTCB pTCBHD DGETTCB DGTXTCB pSEMTCB $TF3@ gJ�g` NNu gø"(g.(f".°®f²®gÚ"x ³üg°©3f²©g"i`æT— INu4ééééé; éQN1GTDTIM ASREL'M68XXX GTDTIM SA  „68xxx DIRECTIVE--GET DATE AND TIME+2pDATE pSBRDTIM FGTDTIM &&3PaAþ 8  �&\e�&\R€HÔNu4éééééééZ]1LOGPHY ASREL'M68XXX LOGPHY SA „68xxx TRAP 0--CONVERT LOGICAL ADDRESS TO PHYSICALB2DLOGPHY DLOGPHYO DSBLOGPHO DSBLOGPHY $XF3`††ÿÿÿB€&àŽ(o8؃S„àŒB…:(J0Pg¼pPe¼pPb¸pPbÜpPáŽ3ÜNu Q… E lÔ*T—T—,Nu4ééé; ééécR1PAGEALOC ASREL'M68XXX PAGEALOCSAC „68xxx TRAP 0--ALLOCATE PHYSICAL MEMORY‹2CSBPAGAL pSBREADY pSBP pSVXSTAK pSBV pKILLER pMAPBEG pPSWAIT pDISPATCH CPAGEALLE RCPAGEALOC #VF3Hç&B‚4fx`–HC2xƒf6ƒpx ga>KøIøB§$IH3@"x fFJQk$¶1@f&i OJ�g·Øg`öHSAëaA’a”Cé QÿÿfÎB„F3 g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu O3g@î-|ð&Aí-H”|0ãHâ@S@lü0€aBÿ�Fü AÖaBÿ a‚`BÿF3R„R„`œ g*$@ g**º‚m´¬nº¬m` º¬o(J*K fÖNu•¬Õ¬ *,I3@á�GôXf*, $T ,g"@Û© "Šg%INu*ŠgúBªNuaBþŽnw&Nu"_ I3g @AèaBþv`ðNÑ g  iµèl”µém˜fÿNJQk’*iHUI3AíaBþ: gþðáŠ&J×ÂàŠ(@°Šnþà ,áˆÐŒ°Šn fè`þ̰‹gþˆn gF3þ¼�Šàˆ$`þt&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þJCé Qÿÿf3 ÿPgþ¸&JB„`þLaBý¬4éééélN1PAGEFREE ASREL'M68XXX PAGEFREESAA „68xxx TRAP 0--FREE PHYSICAL MEMORYE2pSBP pSBV pMAPBEG CSBPGFR CPAGEFREE #$F3 Hç $nLß0T—Nu$H"x  ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé H3@ QÿÿfÐ`ÀCøAíaA®&g C±Ál"H&fô g )áˆÐ‰µÀm¬%B f -F3��àˆ%@ $ƒ%If*Š`$"Š �‰àˆ�©#@ f *Ñ©#j "’$IJƒg$"CF3#JJª f )Ѫ%i $‘g"R#J- ð"x ²f(i,g Aì03 aBþü`îCé QÿÿfÜAíaBþèLß0NuT—`î4é< éééééu6'M68XXX PAUSE ROŠŠPSTATE RO““RCVSA ROœœRELINQ RO¥¥RESUME RO®®REXMON RO··RMSPATCHROÀÀRQSTPA ROÉÉRSTATE ROÒÒRTEVENT ROÛÛSEGALOC ROääSEGDEAL ROííSEGSHAR ROööSERVE ROÿÿSETPRI ROSGSEM ROSNAPTRACROSPURINT RO##STDTIM RO,,SUSPEND RO55P1PAUSE ASREL'M68XXX PAUSE SA „68xxx TRAP 0--PAUSE DURING EXEC TOUR:2BSBPAUSE pSVXSTAK BPAUSE pDISPATCH "3 |ð%aAø`Aô4ééééé< éé‚W1PSTATE ASREL'M68XXX PSTATE SA „68xxx DIRECTIVE--SET STATE OF EXMON'ED TASK 2pEXMONVR FPSTATE &VH3&F- ,fm NuzNaAê(FCí0<"ÜS@fú+mt+m ”+\ü0-H+\3H-Hø�-H@ûNu4ééééééé‹W1RCVSA ASREL'M68XXX RCVSA SA2 „68xxx DIRECTIVE--RECEIVE SEGMENT ATTRIBUTES+2ERCVSA pSBFNDSEG pSBLOGPHY %®J3>, fz,, n6aAê` Nqn Nu$F,g"z,, m6aAÆ`"` H3JEgJ0Ðf^nNu., m6aA¦``êB€00P, f8ÐpPáˆ%@B€$°P 5p43P$ª00Páˆ%@B€00Páˆÿ%@ Nuáˆ-@ Nu4éé= éééé”Q1RELINQ ASREL'M68XXX RELINQ SAR „68xxx DIRECTIVE--RELINQUISH EXECUTION 2pSBRYRELQ FRELINQ &3 AÖaAüNu4ééééééé�T1RESUME ASREL'M68XXX RESUME SA! „68xxx DIRECTIVE--RESUME A SUSPENDED TASK 2pSBREADY FRESUME &3@¨ ,fn NuaAîNu4é= éééééé¦]1REXMON ASREL'M68XXX REXMON SAR „68xxx DIRECTIVE--EXECUTE TASK UNDER EXMON CONTROL62pEXMONVR pSBRYXMON FREXMON pSBLOGPHY &¢H3&L- ,fm NuzaAê(F­ú+lP+lT+l L+lXBmX-H3H8�-HJg:íú.-Hg*z,-P m6aA”` NqnNs†(F+3f+TT­ ,0-,@ÿfAÕaBÿbNu4éééééé¯> B1RMSPATCH ASREL'M68XXX RMSPATCHSAW „Patch area for RMS68K.2ORMSPATCH /@3€@4ééééééé¸X1RQSTPA ASREL'M68XXX RQSTPA SA „68xxx DIRECTIVE--REQUEST PERIODIC ACTIVATIONA2pSBRDTIM pPATBEG FRQSTPA pSBADDPA pSBFREEPA &:H3 $, 6,|B„g(,n=|NuB… g *,fÆaAÌCÀg*B†6,F3€ gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x Eé&J$S gŒI3Jªf&’aBÿv`ê»êfâ*fÚJ†kºªfÐ&’J†f$%M%D %lBj%EL3 Ã5CaBÿ4NuRFCf* gêªêaBÿ J†kÿ~NuaC3€BÿJ†kÿrNuJ†f @ç| )g $@#RFß`ˆ=|FßNuSFn=|Nu4éééé> éÁX1RSTATE ASREL'M68XXX RSTATE SA  „68xxx DIRECTIVE--READ STATE OF EXMON'ED TASK 2pEXMONVR FRSTATE &LH3&Fz`aAú(FCí0<(ÙS@fú(íü8íú -H€ÿÿÿ(À(í,0-H@ø8À(íP(í3T(íL(íXNu4éééééééÊV1RTEVENT ASREL'M68XXX RTEVENT SA 6 „68xxx DIRECTIVE--RETURN FROM EVENT SERVICE62FRTEVENT pSBASRINT pSBEXABRT pSBLOGPHY &ŽJ3*H(n@zB, gz.,.< n6aAâ` Nq><€™AÖaAÔß®<&F, fLÛÿF3HîÿLÛHî 2Aÿ/gÁ=Aú/[(n@ g gì 3Jl&gKÖaBÿvNu4ééé? éééÓV1SEGALOC ASREL'M68XXX SEGALOC SA! „68xxx DIRECTIVE--ALLOCATE A MEMORY SEGMENTx2pMMULOAD pSBPAGAL pSDEFTYP pLAM pKILLER pNOTLAM pSBPGFR pSBFNDSEG ESEGALOC pSBLOGPHY %ŽH3@»Îg -,fn NuZn`r\n`jB¸ ., m6aAÎ`æJ…gÚ0, 2,F3A'ÿg� f  gÁÁÁ� B‡,,g�  F3 gB†.8 ΆެÞ¸ θ à�"Ff�fAø fRˆ-(fTˆHGO3 >G‡ÿ?HG GaBÿ2`.S€g^n`®Pn`ön /fè"AÓaBÿ`ÞaBÿI3&H.*á�g, "F m6aBþè`È`ÆJ0PfÀ!¬ P 0, @Oÿ gÀ1€P$F31¼Pg1¼P àˆ1€PЇS€1€P �‰àˆ1€P�P&ðP$R(-K 3gá�-G$T�Nu4éééééÜV1SEGDEAL ASREL'M68XXX SEGDEAL SA" „68xxx DIRECTIVE--DEALLOCATE MEMORY SEGMENTf2pSBFNDGSG pMMULOAD pUNLDMMU pKILLER pSBPGFR ESEGDAL5 XpSBFNDSEG ESEGDEAL %êH3„., 8,(M¹Îg,,f n NuB¸ *l6AÕaAÖ`^n`´J¬@g ,,.(f‡J”gz, n6aAâ` Nqn NuJ®@fXnNu,‚F3 Eø J2 g\n`:¼ Eø @ Äü%Ž %® 5¼ B² %” Br 5‡ 32` ò Nu4éééééé÷S1SETPRI ASREL'M68XXX SETPRI SA$H „68xxx DIRECTIVE--CHANGE TASK'S PRIORITY2FSETPRI &>D3.(f((gn Nu,°(%cB® h%#n Nu@$@&Nu4ééééééé@ W1SGSEM ASREL'M68XXX SGSEM SA% „68xxx DIRECTIVES--SIGNAL AND WAIT SEMAPHOREE2pSBP pSBV pUSTBEG FSGSEM FWTSEM &jF3BG`><&,"x 0àH°i lB(¸±0f:Jq0 g4 10f ¾10g,‡0Jq0 j43&10JGg Añ0aA²NuAñ0aA¨Nu^nNun Nu4éééééé W1SNAPTRAC ASREL'M68XXX SNAPTRACSA%U „68xxx DIRECTIVE--GIVE TRACE TABLE TO CALLER+2pTRACEBEG FSNAPTRAC pSBLOGPHY &PH3,*H"y( g i‘É*$ n6aAâ` Nqn Nu$F&äŠ$ÙS‚fú$F(M"y(&Q3—ÉÙË$ÌÛÃ$ÍNu4éééééA ééL1SPURINT ASREL'M68XXX SPURINT SA&0 „68xxx SPURIOUS INTERRUPT HANDLERA2pSPURCNT BSPURINT pSPURTIME pPANEL pTIMEOD "283H€Rx  xd k$/ "x 3|3|53|.3|>"_Bx Ns4éééééééN1STDTIM ASREL'M68XXX STDTIM SA&P „68xxx DIRECTIVE--SET DATE AND TIMEW2pDATE FSTDTIM pPATBEG pTIMEOD pSBADDPA pDATBASE pTIMBASE &°F3ª.(fn NuLÜ.<&\²‡e’‡R€`ö&(@ç|–¸ ˜¸ !À !Á ׸F3¢ Ù¸ FßB§"x Eé&J$S g@*g2&’$—.Š*fä * gÞ²ªn ‘ª93²ªgÎmôѪ²ªnö`Àת`¸.g$G$*.aBÿXJ‡fðNu4ééA éééé$D1SUSPEND ASREL'M68XXX SUSPEND SA'( „68xxx DIRECTIVE--SUSPEND2FSUSPEND &3î ,Nu4ééééééé-'M68XXX TERM ROBBTFRSEG ROKKTRACER ROTTTSKATTR RO]]TSKBORN ROffTSKINFO ROooTSKMOVE ROxxTSKSTARTRO��TSKWAIT ROŠŠUSERVECTRO““B WAKEUP ROœœWTEVENT RO¥¥INITDAT RO®®c1TERM ASREL'M68XXX TERM SA() „68xxx DIRECTIVES--TERMINATE SELF, TERMINATE TASK, ABORTû2pREADYHD pSBGETTCB pSBDSEGX pSBDSEMX pT1EXMON pTIAT pSBPAUSE pSBDIOVX pSBDMONX pSBREADY pSBDSRVX pSBDASQX pTIOT FTERM npSBQEVNTN pDEASN pNWDQHD pTCBHD pKILLER pSEMTCB FABORT >pRUNNER L2pPATBEG pSBPGFR FTERMT pSBEXEQDQ pSBEXABRT pSBFREEPA &F3J”f@",g.(f".*y(!»üg(²­f-(f ½Ígí-gD*mH3`ØAÔaA¸` B® VnNu*H½Íg-(g.(fn Nuí-g\nNuF30,gÀí);@*;m,.-m +n°+n´­ ,­-­ ,g2F3 m”@ç|JÐküCèÿâJ© g»é g"i `î#m RP�Fßm-ÿ,|ð&­J3  ,gí-@ç|­-g <)ô @ ( g °�fô!m AÕaBþÈFßNuî)I3=H*fî*.(g . (gaB"þž.-g`$.)fÚ=H*=n,.îL3@--n°-n´(N"x %Eé&J g$@¹êfò&’aB)þR`ì,)gaBþD ,TgF3 € @B¨!x !È &,(,ì)"x !)-f2¸©f¬),)g)O3$  ,g¶©@f¸©Df >< AÑaB(ýâ"i f¾,)gaBýÎNqaBýÈ,)gaO3” Bý¼~Cø Eø "Âü 1pf2g/aB'ý–., ,gaBýˆR‡ ‡oÄL3PaBýzaBývJ¬gH4<HB4,&,8,HD8,°*,²<,¶HF<<.,*>,\,P3ˆ¢)g<<$LAìaBý,Nq(JCø!!ü )g¹Àg"@`ò#laBý B¸ $rAÔaB&ýNu 3@aB"üú4éé:]1TFRSEG ASREL'M68XXX TFRSEG SA0 „68xxx DIRECTIVE--TRANSFER SEGMENT TO ANOTHER TASKW2pSBFNDGSG pMMULOAD pUNLDMMU pKILLER ETFRSEG pSBFNDSEG pSBLOGPHY %xH3 @&MB¸ *n6., AÕaAî`^n`ZJ®@g .<àH°uPe°uPbn `ÜVnH3`Ö·Îgö"E$F.* k6aAª` J…fZn`\n`ö* ,**fB†<5PL3A* gÜuPáŽB€05P�uP$R@*á�aBÿ^` `J…f aBÿRn `ªJ0Pfò"F3( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gF3ÃÃ1ƒP$1¼Pg1¼PBµ@ Bµ@$Bµ@Bµ@S-R(20PÒpPá‰G3-A ÉEaBþ¸ËD g$$.´«g pP "(KaBþš`aBþ”&L$+ ‚Nu4ééB éééC?1TRACER ASREL'M68XXX TRACER SA1 „TRACE EXEC ACTIVITY+2pSBRDTIM CTRACER pTRACEBEG #vF3HçÀ@ç&x |*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o>3@ Uïÿb+o aA®+A2<ù’àHF@@ÀüúÒ@;ALß8Nu4éééééééLT1TSKATTR ASREL'M68XXX TSKATTR SA12 „68xxx DIRECTIVE--RECEIVE TASK ATTRIBUTES2FTSKATTR &"3(-gn -hp =h("Nu4ééC éééééUL1TSKBORN ASREL'M68XXX TSKBORN SA2 „68xxx DIRECTIVE--CREATE NEW TASK€2pSBGETTCB pSBPAGAL pTDEFTYP pCRASN FCRTCB pTCBHD pSEMTCB FTCBCR pSBPGFR FASGNMON j&ªH3@ Iëÿþ6<€`&LLìpHF>,6.(BAÓaAÞ``0<`,B€8 H@0< @aH3€AÀ`0<`*H4<B˜QÊÿü+S +fgJ€f `<.p .;Fp+@F3aæBfDÿ;D(+El+EüHD0àHgfJg¸.%c.%D%°F3c@$@&*¼!TCB|€,;|:|úr;|0$MÕü`+J6$¼!TST|I3€5|$5|D x  -"-±üg °¨f²¨g h`ærAÕaBþÆ0<I3 �`aBþ¼`0<` +x !Í Nuf=@NuT—Nufg2 .".` 03", , g.(g J�g` .".+@+ANu4ééééé^]1TSKINFO ASREL'M68XXX TSKINFO SA2P „68xxx DIRECTIVE--MOVE TARGET TASK'S TCB TO BUFFER 2FTSKINFO pSBLOGPHY &JH3€.(fn Nu*<,, n6aAà` Nqn Nu,fnNu&F3p&ÝQÈÿüNu4C ééééééég\1TSKMOVE ASREL'M68XXX TSKMOVE SA3# „68xxx DIRECTIVES--MOVE LOGICAL AND MOVE PHYSICAL:2pSBGETTCB EMOVELL EMOVEPL pSBLOGPHO %ÎJ3,,`*"-6g*,,, AaAè`` J…gJ0Pfn Nu.Aì aAÈ`^nH3Nu.(f((gn Nu"(6g*,,, AaA”`` J…gJ0Pfn F3NuHzÿ¢?,aBÿD+mlI3ü|úr- (gDz,-ü m6aBÿ"` Nqn `ÿ@+Fü:(0P$g00PF3ÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­I3@,0-,@ßfF×AÕaBþ¬`þÔ@ç FJ�f8".*x »üg.²­f-(f½ÍI3g--fí,gL*m`ÐaBþd` B® VnFßNu*H--fê½Íg-(gG3.(fn `Öí,g\n`È;m,.-m |­-gCø!ô I"h 3³üg ³Ífî!i `’4ééééyA1TSKWAIT ASREL'M68XXX TSKWAIT SA5  „68xxx DIRECTIVE--WAIT 2FTSKWAIT pSBRYWAKE &(03 î,®-fNu®,=n^Bn^AÖaAÜNu4éééééD éé‚]1USERVECT ASREL'M68XXX USERVECTSA59 „68xxx DIRECTIVES--USER EXCEPTION AND TRAP VECTORS$2FEXPVCT FTRPVCT &"3-n Hî)Nu-n Lî)Nu4ééééééé‹S1WAKEUP ASREL'M68XXX WAKEUP SA6 „68xxx DIRECTIVE--WAKE UP A WAITING TASKT2pSBRYWAKE FSBWAKEUP FWAKEUPX pT1WAIT FWAKEUP pTMSGFLAG &BJ3»Î`ø ¨,g( (Xg "@B©B¨X1h^g 1|"Bh^aAÊNuè-3Nu4ééE éééé”K1WTEVENT ASREL'M68XXX WTEVENT SA69 „68xxx DIRECTIVE--WAIT FOR EVENT+2pSBASRINT FWTEVENT pSBRYASR &DH3(n@ fXn`4î ,.-g® ,AÖaAÚ`ìì Jl&gKÖa 3€AÀNu4ééééééé�H1INITDAT ASYST'M68XXX XINITDATAG4 !ƒSystem Initializer DATA Areañ2PCLOCKFRQ èHTIMSLIC DHASN \HMEMTYPA JHRDYHEAD HEEND PDUMMYPTR HPAGESIZE XHTIMINTVA BHMEMTYPS LHMEMTYPT KHMMU HMEMTYPU NHESTACK HSMEMHI HTRCSIZ 8ö2HGSTSIZ (HSMEMLO HIOVSIZ FHPANELA HESTART HPATSIZ 4HUDRSIZ 0HUSTSIZ ,HTIMERA >HDISPATCH $HBUGTRAC PHTCBHEAD HENDMEMT –E HMEMTABL `HWHERLOAD THTRCFLAG <(–F3 SS P þ þ þ63 à@ þˆÿÿ(4ééééé¦'NOMMU LOADMMU AF»»LOADMMU SAÄÄdLOADMMU ROÕÕ=/*†NOMMU.LOADMMU.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN)=/*†FILE�WILL�DEFAULT�TO�NOMMU.LOADMMU.LS=/*=/IFC \1=ARG NOMMU.LOADMMU.LS=/ENDIF=/*0=ASM NOMMU.LOADMMU.SA,NOMMU.LOADMMU.RO,\1;MRZ=46=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=ENDéééF éé鳉PAGE6LOADMMUƒIDNTƒ5,1�Dummy�LOADMMU�for�boards�with�no�MMU.**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGE*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�LOADMMU‚2.00„**ˆ*�HLD6ƒ09/18/80‚**ˆ*�HLD6ƒ03/30/81‚**ˆ**********************,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‚ChangesG*…--------‚------‚-----------------------------------------------------A*†1/25/84‚MSL…Split�routine�into�two�routines�in�order�to�support*—both�the�RTE�and�RTS�exits.***…LOAD�MMU�SUBROUTINE**…REGISTER�USAGE:ƒ01234567 *–D*********–A�*ƒ**…ENTRY:„A5�POINTS�TO�TST*‰SECTION�LEVEL00*‰XDEFƒLOADMMU,LOADMMUI"‰XDEFƒCRASN,DEASN,UNLDMMU,MMUFAULT‰XREF.S�MMUHERE,MMULOAD‰XREF.S�TRACER,TRACFLAG*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.*LOADMMU%‰MOVE.W‚SR,-(A7)ŠSAVE�STATUS�REGISTER!‰OR.W„#$700,SRŠINHIBIT�INTERRUPTS 6*ˆCMP.LƒMMULOAD,A5ˆIF�MMU�IS�NOT�LOADED,�THEN�LOAD�IT.*ˆIF†�THEN.S/*ˆMOVEM.L�TSTMMU(A5),D0-D7‚SEGMENT�DESCRIPTIONS0*ˆMOVE.L‚A5,MMULOADˆSAVE�ADDRESS�OF�CURRENT�LOAD"*ˆMOVE.L‚MMUHERE,A5ˆADDRESS�OF�MMU*ˆMOVEM.L�D0-D7,(A5)ˆLOAD�MMU*ˆENDI /‰BTST„#TRCFMMU,TRACFLAG�SHOULD�ENTRY�BE�TRACED? ‰IF†�THEN‰BSR…TRACERŒBUILD�TRACE�ENTRY‰DC.W„$DD08�TRACE�CODE‰ENDI ‰MOVE.W‚(A7)+,SR ‰RTS—RETURN‰PAGELOADMMUI!‰OR.W„#$700,SRŠINHIBIT�INTERRUPTS 6*ˆCMP.LƒMMULOAD,A5ˆIF�MMU�IS�NOT�LOADED,�THEN�LOAD�IT.*ˆIF†�THEN.S/*ˆMOVEM.L�TSTMMU(A5),D0-D7‚SEGMENT�DESCRIPTIONS0*ˆMOVE.L‚A5,MMULOADˆSAVE�ADDRESS�OF�CURRENT�LOAD"*ˆMOVE.L‚MMUHERE,A5ˆADDRESS�OF�MMU*ˆMOVEM.L�D0-D7,(A5)ˆLOAD�MMU*ˆENDI é¼NÅ/‰BTST„#TRCFMMU,TRACFLAG�SHOULD�ENTRY�BE�TRACED? ‰IF†�THEN‰BSR…TRACERŒBUILD�TRACE�ENTRY‰DC.W„$DD08�TRACE�CODE‰ENDI ‰RTE—RETURN‰PAGE*N*‚Dummy�entry�points--we�don't�really�have�an�MMU,�but�other�exec�routines�areN*‚going�to�be�calling�us�at�these�entry�points�because�they�don't�know�there's *‚no�MMU.*CRASN:DEASN:UNLDMMU: MMUFAULT: &ŠRTS—Just�return--he'll�never�know....   ‰ENDéF éééééQ1LOADMMU ASYST'NOMMU LOADMMU SA E!ƒDummy LOADMMU for boards with no MMU.Œ2BLOADMMU BLOADMMUI BMMUFAULT 0pMMULOAD BUNLDMMU 0BCRASN 0BDEASN 0pTRACER pTRACFLAG pMMUHERE "2<3@D@ç|8 gaAîÝFßNu|8 gaAÖÝNsNu4ééééééÍ'POLL REPL AFââREPL SAëëREPL SYì_G =/*†POLL.REPL.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN%=/*†FILE�WILL�DEFAULT�TO�POLL.REPL.LS=/*=/IFC \1=ARG POLL.REPL.LS=/ENDIF=/**=ASM POLL.REPL.SA/&.REPL.SA,REPL,\1;MRZ=66=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDééééééÚ**‰ASSEMBLY�OPTIONS�FOR�REPL:* Assemble for I/O with status checking not under VERSADOS*6VERSADOS‚EQU„0’1�=�ASSEMBLE�FOR�RUNNING�UNDER�VERSADOS-BIOS†EQU„0’1�=�ASSEMBLE�FOR�RUNNING�WITH�BIOS2INT‡EQU„0’1�=�ASSEMBLE�FOR�TASK�INTERRUPT�HANDLING4MMU‡EQU„1’1�=�ASSEMBLE�IF�HAVE�AN�MMU�AND�ASSEMBLING)*§FOR�EITHER�INTERRUPT�OR�STATUS�CHECKINGéééG éééã REPLUREP0_ÿÿÿÿ^ÿÿ UÂþˆH NùúBo=|NuN¹4!VCT¾¾ÀÂÄ Ô Ì € �!"`0ŒÞ�Ž�•/ @ç|Jèf B�"x "ˆ!È Fß"_NuJø f@HçÿþAø @ç| g$"@ ‘f!È |øÿ$iQéN’Aø | fÜQø FßLßÿNuPø N�Qø J¸ f¨NurÒx VÒ¸ B"x ,Gé$S g Jªf&’`ŒNu²ªmøa ”²ªmî&’*j--fjª$* Ôª>*g>*g RjÇaÞ* f@* g­,fí-`­ ,g` B­X­,AÕa žfÿfa|`ÿ`HçAP$8 >&68 @HC(HD4<  g 4<8***HB* g2Hçz,* m6a€`NqLß8`Lßp&*HC6‚€4*AÕa8NqLß ‚R�`ÿ|@ç|$©%|ÿÿÿÿ#JFßNuIé L g(@´¬lò%B$€ ŠNu"x ,Aé ?Fü'"HJ‘fNs Q²¨mð°hlê/(?(Bh (RhШ ²€lô!@B€0("((f"�"x , ©#H!|ÿÿÿÿFßNu9 4ga î`*_aœ _N`Lßÿ\�?_f,J¹ gaýžfJ9 [g|øÿa¢AÖa 4`tNs@ç9 4gaFî HçÿþNi/ /9 b oF,hHV/(@À@ÿ?"h 0P*n6` f€\�,_( „!TCBgaÄJ@gÿZ @f AÖa7``ÿJ @fÿBJ�f&HC4<HBAÖa ÀNq`ÿ(HBHA(&64< ‚HB4`àâˆ&T�(,_" �!TCBga`Cð=C^AÖa7J®@gþæ$< ÿÿHCHD6`¤.x Fü aüæMø "NJ© gì|,i 0.,@ÿfæ#n ®-!Î Kî.r?%2 °føB8 [|øÿ1ø T R®-fd.-fh®-fhJ¸ g*n6aú n®ú`þðJngAÖa¤Hzþˆ`>®úHzþÖ`AÖaŽHzþr`JnfB®@ÁAû-oü|úrNuHV,x Hî?ÿ-_8Ni-I<"x =iÿúúNuEø ¦Çìs,)gÇ`"ÂüEø ¦(NGs*r»Îg°$<‡42&26,(gÃáK,$( *,,,p<,.,>, ,"0<2 gB@2g<,*.,(>,°H@0,²H@"@J²f -@g4&@4+HC6+HCAòa>J²gHç@(AÕa ¤`0Lß raÆ,sf-|çOGB.ûAúþ¶.ˆNuLß,sò Rrì ,NuÇ1G*Bh\è)!|EXEC°!| ´<(,Æ1F.½Èg$F-ÿ† g†1F,|ð& fa˜Nu1F,X� <1Wú!oü` a aaaaaaaaaa a aaaaNq?/_g/ gºa aþ8 4g @ça ĪT�Kú`ª^Laaaaaaa a aNqNqa Nq`"`6`>?/_gL/ fX�—Ns?/_g0/ gNa"/ fÈ?/ _g/ g&aaýr8 4g @ça $ªT�Kú`  H.ž•â� n2-4.(g^2-,6"’må‰Ü�z n6aÒ`Nq`<"FJ‘g6*8 š�,.<œ… n6a²`Nq`(F-C<&8 8ß¿Ãfú/?,ÿú<<`B† m n-_¸-_¼.)g".Hg a@ nü|Jfüv n,Cø – 1pfHzüf`üÄ=@=|ç�GB.û`üDJFfü>AÖaý¤ Hzþ�Ÿ`új P�` € `úX~$.HffdfLLîÿ`®z,.P n6a Ì`Nq`&~ F&(.T·„f È®Lg-CT`"R‡È®Lggû¶RnX .X°nXbû¦~Hzû `X oBEgaFßüNu.�/,x ½üg*/ f".)g.H8gîH,_"—Ns,_"/8 6Nuaæ$< 4.&.(.8áL<Aî@aÊ`®)Lîÿt®-@&Nuî ,`ùv@çHçp "x ,Gé Fü'$K&g&&C´«fò$“JAj.&©#K'|ÿÿÿÿLßT�NuJAkô&)fT¯`è&C#SFïB«'@ '@'H'BB«BkgëáIAA 7Aa”Ó«Fü'&© #K LßT�NuHøÿÿ@ø!×Ni!ÉH!øL"x :3|•3|µ3| 3|°|`Þ@ç|»ø bgLíÿ !Í b*x HÕÿ8 4ga ÒÝNsNu|ð%a|`øNHøÿÿ1×!ï|LøÿÿNs@ç|JÐkü0ãHâ@S@0€kFßNua>T.ra�Fß.x AÖaÜ`÷üî ,B® (f!NNu*@ - fø+N Nu.&|ð&î-HîÿtHç 8 Kï�� €Poaþâ. ‡ÿIöpGr8ÝU@núLß0€Nu@ç|JÐkü0ãHâ@R@o0€FßNu/ "h!i €0€B© © ,"_FßNu/ x NB�B8 Z 0àIDAÒx XäIÒ¸ BJ8 Zfà _Nu@çè-f0Hç`Cø |(&$I"j ³üg°)&cì!I %H LßNs(&Ue°($e @&`°Jhfæh%&`¢($ð@&`”`’J¸ tf|Hçÿþ!Ï tFï<.x t|9÷0 À÷0.x tLßÿÿB¸ tNsRx \ xd \k$/ "x :3|3|53|.3|>"_Bx \Nsp þÀˆÀÚÀj€nÀLÀ À€$: 0ÀH(¼€@*ž ‚&À&ì%z ‚%n Â,œ,ܼø(fÀ#R Â+È€,¨$€,²8€*À œÀ” ÂŒ<Â,Þ"ØÔР€#L €#D € €¬ €<´°¬¨"X€BˆTÀ”�Œ €$n, ¶ÀŒ€tìÁÀÊ À!> Àê ÀZ ÀXT>€#†€´€HçÀÀ x :| x NPø Z(( B�28H  VÓ¸ B 8 B€&\k:R¸ >!À B <&\"x ,@ç| i "g‘¨ P`ôFß i"g‘¨ P`ô"x ,J© g0/@'ÿ@ "8 BaòæLß8 4gaòÿJx Tg Sx RnPø [`óRfNsT� €%bû�Ѐ0;"Nû �%cT—Nu/Ò�2; Aû"Nuûhüü¦ý&|P”˜,`ÀBûÖˆÞ~ ®öä÷"+v˜èœxüâ ~òf&ÆûhòNú¼ÿäð¦ñ?_fóKøIøB§$I"x fFJQk$¶1@f&i OJ�g·Øg`öHSAëaùla”Cé QÿÿfÎB„ g| g4´¬o  g($,aœ‚)aØ®- K gT¯Lß88Nu g@î-|ð&Aí-H”|0ãHâ@S@lü0€aù(�Fü AÖaùða‚`ñ R„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øö`ðNÑ g  iµèl”µém˜fÿNJQk’*iHUAíaø gþðáŠ&J×ÂàŠ(@°Šnþà ,áˆÐŒ°Šn fè`þ̰‹gþˆn gþ¼�Šàˆ$`þt&”g"T#K(‹'L'l B¬ �‹àˆ'@‘¬`þJCé QÿÿfÿPgþ¸&JB„`þLaöðHç $nLß0T—Nu$H"x ÿÿg *iµílµémÜJQkÞá‰Òв­bÎ` Cé QÿÿfÐ`ÀCøAía÷2&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÷&`îCé QÿÿfÜAía÷Lß0NuT—`îHçÀ@ç&x 0|*S»ëfKëIí&ŒFß+@+H+N (o:”T¯;o+o Uïÿb+o aöð+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` NNu gø"(g.(f".°®f²®gÚ"x ³üg°©f²©g"i`æT— INu`††ÿÿÿB€&àŽ(o8؃S„àŒB…:(J0Pg¼pPe¼pPb¸pPbÜpPáŽÜNu Q… E lÔ*T—T—,Nu$x ( gTB€0lTD@°jnLS€Àü Eò4,f^Jªf8g .(f‚z,, n6aÿ\`$Nqn NuXnNuZnNu\nNun Nu%FBó5B$®NuJªgÚ .°’g.(gÐBªNu"x f$x jB‡B‚, Jlf„J1 g\nNu~Gòp·êmZnNuJ«g‡`â6üN¹Aúêp&Èz,, m6aþ¬` Nqn Nu6‚'M'l 'l ‡ Žü‡ í)GëÿúåŠ B ‹Nu1 g"S‡ÎüP‡Gòp k (°®g.(f=|NuGë,fÿx,f=|Nua0Nu"x f$x j~Gòp·êl¹ëf GëB‚4a ‡`ÞNuAúéF&åŠ B ƒäŠB1 B«Nu*n6., AÕaüÄ`^n`Ò<5P$0@0f22, A0g ŒA g& f.(fn `œn`¾\n`¸,g†, gÆ"�$. uP aûÎ`±üf Zn`R\n`L�uP$!uP  ‚1A1| Bƒ65PÖuPá‹!C 65P–uPRC1C3@1| , gè NuJ¬6g*l6B…:-5P$gabQ… E lî,)gP"x Ké>)gB,,Jm g.¼•f*­ Jm f0-@ fB�2- m aùf`aðNÛüSGfÂNuB„,)gÄ `–>, fz,, n6aüF` Nqn Nu$F,g"z,, m6aü"`"` JEgJ0Ðf^nNu., m6aúþ``êB€00P, f8ÐpPáˆ%@B€$°P 5pP$ª00Páˆ%@B€00Páˆÿ%@ Nuáˆ-@ Nu»Îg -,fn NuZn`r\n`jB¸ b., m6aúx`æJ…gÚ0, 2,A'ÿg� f  gÁÁÁ� B‡,,g�  gB†.8 vΆެÞ¸ vθ zà�"Ff�fAø pfRˆ-(fTˆHG>G‡ÿ?HG Gaõn`.S€g^n`®Pn`ön /fè"AÓa÷š`Þaî‚&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$T�Nu., 8,(M¹Îg,,f n NuB¸ b*l6AÕaøò`^n`´J¬@g ,<àˆ°uPe°uPb n `’05P$@0g@$,25P$ uP aø.`aí|<(SFÜuP;†PSh B†<(  g†1F JFf.05P$@ f$B€05PÐuPáˆB�25P’uPR� @aö<`aí$aíŠBµP BuP$B5P'BuPS-Nu*NB¸ b` »Îfn Nu$-2, l a÷’`^n`ÜZn`Ôn `ô\n`î&H$m6.+AÒa÷à`èJ…gÔB…:+á�, gº¬d n`�*,…ÿB$,,B, g,+ AÒaø˜`”`’J…faì^J0Pf„%«P B2P' àŽ5†PàŠÜBSF5†PD€Ð« I àˆ5€P5¼P+g5¼P5«P$òP$R*Rk -k  NuB‚,"x fJ1 n=|NuBƒ,g Co=| Nuá‹à Hz@çåŠ B/?8 5gaõèîNs8 5gaõØÝNu&MB¸ b*n6., AÕaö´`^n`ZJ®@g .<àH°uPe°uPbn `ÜVn`Ö·Îgö"E$F.* k6aöp` J…fZn`\n`ö* ,**fB†<5P* gÜuPáŽB€05P�uP$R@*á�a÷(` `J…f aêîn `ªJ0Pfò"( à‰ÔA1�P1‚P’u@DAÒu@1�P!µ@ P 1µ@&P&65@$*gƒ* gÃÃ1ƒP$1¼Pg1¼PBµ@ Bµ@$Bµ@Bµ@S-R(20PÒpPá‰-A ÉEaê¾ËD g$$.´«g pP "(Kaôâ`aê0&L$+ ‚Nu,,`*"-6g*,,, Aaö8`` J…gJ0Pfn Nu.Aì aõÒ`^nNu.(f((gn Nu"(6g*,,, Aaõä`` J…gJ0Pfn NuHzÿ¢?,--gGÿg­-g- ,gSs­-f­ ,Ss3g³ gAóaéúgl û g+l  g+l  g- ,fAÕaêxNu gí,Nu gÜí ,NuJ­@g\n`h&, ƒÿà‹HC8 nHC Caîþ`Pn`F&H&¼!ASQl«l 'l'l Aë('H'H'H"áŠÔ‹'BBk&+K@Nu&L(m@ fXn`Þ,fn`ìz,+ n6aóð` Nqn `Ò"FB�,+ Ü�àŽ¼pPbä �c6B…,B‡ fY‡+gX� ‡fP†P�P…B€,¼€cn`X($KaÐ`Zn`H(m@ JÄ(gÇÇtU„a0(g tEèaY„J…g $EîaQ„$I$gaaÆNu6Ú·ìe&lUBnðNu(N¬-J¬@g l@B¬@"(’ˆ�ÿà�aïÚ`aæÂNu(n@ fXnNuJl&f~`*lB‡-gY‡*, n6aò¶` Nqn Nu&F GfBSNuT�‚gX�»ìe›ìÛìÇÂn`6Ý»ìe*lUGnð. R‡‡¾¬e.,@ç|)GSl&Fß&F f$k'jJ+g+g7|NuB€00PR@ÐpPሀ�‹B‡+°‡l.oÔ|G*,+g7|Nu j6añÚ`"``êàŽÜpPáŽÜ>0PR‡á�žƒ|GB‡+*FGë6ÝU‡núNu(n@ fXn`$ . ?,ø€_@Jl&gKÖaNu--f°, g˜", l(gTˆ±ìe l2HA±ìe l2J�kL"Az, m6añ`Nq`8)I,- �&\e�&\R€HÔNu&F- ,fm NuzNaÿŒ(FCí0<"ÜS@fú+mt+m ”+\ü0-H+\H-Hø�-H@ûNuAÖaß.Nu¨ ,fn NuaÞºNu&L- ,fm Nuzaÿ(F­ú+lP+lT+l L+lXBmX-H8�-HJg:íú.-Hg*z,-P m6aèÖ` NqnNs†(Ff+TT­ ,0-,@ÿfAÕaÞTNu$, 6,|B„g(,n=|NuB… g *,fÆaݶCÀg*B†I 6, gƒg´�lJ„gÔ„`ô‚&\`6,$Ô„"x ,Eé&J$S gŒJªf&’aÒÊ`ê»êfâ*fÚJ†kºªfÐ&’J†f$%M%D %lBj%EÃ5CaÒ¤NuRFCf* gêªêaÒ|J†kÿ~NuaÒTJ†kÿrNuJ†f @ç| )g $@#RFß`ˆ=|FßNuSFn=|Nu&Fz`aýL(FCí0<(ÙS@fú(íü8íú -H€ÿÿÿ(À(í,0-H@ø8À(íP(íT(íL(íXNu*H(n@zB, gz.,.< n6aæü` Nq><€™AÖaÖxß®<&F, fLÛÿHîÿLÛHî 2Aÿ/gÁ=Aú/[(n@ g gì Jl&gKÖaõ$Nu>,.(f‡J”gz, n6aæn` Nqn NuJ®@fXnNu,‚Eø –J2 g\n`:¼ Eø ¦Äü%Ž %® 5¼ B² %” Br 5‡ 2` ò Nu.(f((gn Nu,°(%cB® h%#n Nu@$@&NuBG`><&,"x $0àH°i lB(¸±0f:Jq0 g4 10f ¾10g,‡0Jq0 j&10JGg Añ0aÙÚNuAñ0aÚvNu^nNun Nu,*H"y 0 g i‘É*$ n6aå8` Nqn Nu$F&äŠ$ÙS‚fú$F(M"y 0&Q—ÉÙË$ÌÛÃ$ÍNu.(fn NuLÜ.<&\²‡e’‡R€`ö&(@ç|–¸ B˜¸ >!À >!Á B׸ FÙ¸ JFßB§"x ,Eé&J$S g@*g2&’$—.Š*fä * gÞ²ªn ‘ª²ªgÎmôѪ²ªnö`Àת`¸.g$G$*.aÏ.J‡fðNu=| . €Kª{ûfDJnpg x :(f2 x ‘ü, z n6aä```*FB®LîÿN•B¸ b,x Nuî ,NuJ”f@",g.(f".*y »üg(²­f-(f ½Ígí-gD*m`ØAÔaãf` B® VnNu*H½Íg-(g.(fn Nuí-g\nNu0,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Ø2FßNuî)=H*fî*.(g . (gaÖf.-g`$.)fÚ=H*=n,.î--n°-n´(N"x ,Eé&J g$@¹êfò&’aÌü`ì,)gaä ,Tg @B¨!x :!È :&,(,ì)"x )-f2¸©f¬),)g) ,g¶©@f¸©Df ><@AÑaÑb"i f¾,)gaôNqaö®,)gaõø~Cø –Eø ¦"Âü 1pf2g/aÏö., ,gaÕ¼R‡ ‡oÄaîVaä‚J¬gH4<HB4,&,8,HD8,°*,²<,¶HF<<.,*>,\,)g<<$LAìaÚêNq(JCø )g¹Àg"@`ò#laÕ>B¸ rAÔaÝÚNuaÔÂ(-gn -hp =h("NuIëÿþ6<€`&LLìpHF>,6.(BAÓaàh``0<`,B€8 oH@0< @aÛ `0<`*H4<B˜QÊÿü+S +fgJ€f `<.p .;Fp+@aæBfDÿ;D(+El+EüHD0àHgfJg¸.%c.%D%°c@$@&*¼!TCB|€,;|:|úr;|0$MÕü`+J6$¼!TST|5|$5|D x  -"-±üg °¨f²¨g h`ærAÕaÜ|0<`aÓÊ`0<` +x !Í Nuf=@NuT—Nufg2 .".` ", , g.(g J�g` .".+@+ANu.(fn Nu*<,, n6aß` Nqn Nu,fnNu&Fp&ÝQÈÿüNu@ç, gzR` ,gz,. n6aÞ¼` NqTnFßNuJ”f6".*y »üg,²­f-(f-,g-.fD*m`ÔAÔaÞ(` B® Vn`°*H½Íg-(g.(fn `’-,f \n`„-m -.f`>,aþº+mlü|úr- (gDz,-ü m6aÞ` Nqn `ÿ@+Fü:(0P$g00PÑpPÑpPBpPQ… E làBm., gGìLÛÿHíÿLÛHí |­,0-,@ßfF×AÕaÓT`þÔ@ç FJ�f8".*x »üg.²­f-(f½Íg--fí,gL*m`ÐaÜú` B® VnFßNu*H--fê½Íg-(g.(fn `Öí,g\n`È;m,.-m |­-gCø  I"h ³üg ³Ífî!i `’î,®-fNu®,=n^Bn^AÖaÒnNu-n Hî)Nu-n Lî)Nu»Î`ø [¨,g( (Xg "@B©B¨X1h^g 1|Bh^aÒNuè-Nu(n@ fXn`4î ,.-g® ,AÖaÑæ`ìì Jl&gKÖaê–Nu,fz. n6aÛì`NqpaX$F"*fp aJAø ŠAø ŠaÐ0Gø "SJ“g²©gÒGé`ì f¸, n6B…*ç�EaÛ’`Nq`¢B€* e c @dpËa„r Âj A fp ar"x fJ1gj°*f¦ *ÿg Jª fpÇaH *b *dpÌa4GêB…*g0 opÎaS…ç�2*²sPdpÏa ²sPd pÏaR`NQ…lâp Àjf$ * @fRˆ/<Hª? *(SJ“fp a¤Gì°¬fì*,Ig°,(gp a„ ¬g(l`ð"SJ“gGé`ô j p(R@ @Hç€8aÔÊ` LßpaÿHLß"HíˆB˜S€nú*g)I&‰"¼!CCB*giHLê?Hé?))àáˆ3@B@3@@GêIép)+g(Û(ÛS`öB€*åˆ#@D&j ×Ó#K )ÿf#|NP*géI*géH`R*fbB€*&x fJ3g:(iD &TGëÿ¶*` &lJ¬g +*²n(K`ê¹Àg #K)I`#K&iD3|N¹J#|OLIéJ&ŒB€* x f¼ÿ iÑè*I/N�,_`t`Zp aøp aôpað g@o opÁaÜ n6B€S&@B… f )e2 )c )€e" )�b;°g,aØ’` Nq`¢×ËGû°ÖÓNÓÿþ Ì¢Úð *a²J f´ © ©HfX")D(A&TGëÿ¶ `&lJ¬fa̰‹g(K`ê¹Áf&J«g((k)|N¹J)|OLIìJ&kD&Œ` )k`B�)(&iD&¼¾&x fB3Iø  &TJ”fa˦°‹gIë`ì(«Aø ŠaÌÌ IraÔš`8aË€p�az&Iaî"Kfpal)Hgp‚a`)IgpƒaT)Ig .(gþ†)Igp a6 )c )c )€e )�c*g< * d pÆa˜`”j :#j +HPAø ŠaÊÚ mÑè/N�,_J@g>a, )AîDJ�g"P°©gAé `îF€NuB�Aø ŠaÊœ X�=@`Aø ŠaÊŠB€B®Nu,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ÒZîFßHç€Ä*oKíÿ°"m/ N‘*_e -g*@`êLß#X�`¿ 8 5gaÒîHç€Ä 8 g*@ m ( g / @çN°Fß*_ -`àLß#`¿bAùPpNAg` DATAÜ,HpnU€BXS€fú-ApAÖ"HB™B™BY2ü $I&I"üREP0"üPB‘NAfÄ$üDATA$ŽpNAf´-|nCî<"üTASK"ü NUM"üBER "ü S"üTART2ü "üTASK"ü NUM"üBER "ü T"üERMI"üNATE2¼ =| lOîÜ..na:Cî ¼!UDRáŠ]‚„ü 1BB¸ 0$:Žg2 BpN@`aê!È 0aEè ŠáŠQ‚„üÄüÔŠ!B1ú` 4!ü –aÀJ¸ fœB¸ GúœCë <€pN@`ad4+;B,g +x  !Í EëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†a¢.x 2<ÀaD/:†NuHVMù,¯@îFü'MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈB†-½ÈnúNu0<`0<�F虀2<é™"x :Cé2�A02�2€@02€Nua&a°‹fa†a|°�faÿ|Cí!É aÂazNuB€Aú$°Pgaÿ^B‡EЇ Eê Rÿÿfð‡#à�*(B(:¢º„c*„ÿBKúûû" B*AMú,Bœ�°ºrf†` (< �B*DB†º„baþöNu hÿÿ g,a2 ÿfaN`aðJga$`a@°‹ga¾a`Ì3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baþ�Nu•ÊB�B‚BƒIÕKõhHz ?þàB9þà ü>þà9þà è àÁþàü6þàOïNuNuSS P þ þ þà@ þˆÿÿ'VERSADOSREPL AF X XREPL SA a aREPL LO b=/*†VERSADOS.REPL.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN)=/*†FILE�WILL�DEFAULT�TO�VERSADOS.REPL.LS=/*=/IFC \1=ARG VERSADOS.REPL.LS=/ENDIF=/*.=ASM VERSADOS.REPL.SA/&.REPL.SA,REPL,\1;MRZ=66=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=ENDééééééK  P**‰ASSEMBLY�OPTIONS�FOR�REPL%* Assemble for running under VERSAdos*6VERSADOS‚EQU„1’1�=�ASSEMBLE�FOR�RUNNING�UNDER�VERSADOS-BIOS†EQU„0’1�=�ASSEMBLE�FOR�RUNNING�WITH�BIOS2INT‡EQU„0’1�=�ASSEMBLE�FOR�TASK�INTERRUPT�HANDLING4MMU‡EQU„0’1�=�ASSEMBLE�IF�HAVE�AN�MMU�AND�ASSEMBLING)*§FOR�EITHER�INTERRUPT�OR�STATUS�CHECKINGéééééé Y REPLÿÿÿÿÿ€REP0ÿÿÿÿÿÿAùpNAg` DATAÜ,HpnU€BXS€fú-ApAÖ"HB™B™BY2ü $I&I"üREP0"üB‘NAfÄ$üDATA$ŽpNAf´-|nCî<"üTASK"ü NUM"üBER "ü S"üTART2ü "üTASK"ü NUM"üBER "ü T"üERMI"üNATE2¼ =| lOîÜ..na:Cî ž +ŠXREF.S�PTMADDRŒAddr�of�timer�chip�(M6840). *„Others:.ŠXREFƒCRASHSAV‹Place�to�SAVE�info�if�we�CRASH.   **‚Included�files:**‰9999.M6840.M6840.EQ*ŠNOLISTŠINCLUDE�9999.M6840.M6840.EQ*ŠLIST ŠSECTION�8ŠPAGE*J*‚This�code�is�needed�to�satisfy�INIT,�which�is�board-independent�and�must/*‚call�upon�us�to�do�the�board-dependent�stuff.**„Initialize�the�MMU.*3INITMMUƒRTS—It's�easy�for�us�to�initialize�the�MMU,*§since�we�don't�have�one. **„Start�the�timer�running.*TIMERSTDŠMOVE.L�TIMSLIC(PC),TIMESLIC‚Set�the�sysgen�parameter�which�dictates%*§the�#�of�timer�tics�per�time�slice.'‰MOVE.L�TIMERA(PC),A1‡GET�TIMER�ADDRESS#‰MOVE.L�A1,PTMADDRŠSAVE�IT�FOR�EXEC$‰BEQ.S‚TIMER_EXITŠBRANCH�IF�NO�TIMER)‰PEA„TIMERBE(PC)‰WHERE�TO�GO�ON�BUS�ERROR$‰MOVE.W�#'BE',-(A7)‰SET�BUS�ERR�FLAG3‰MOVE.B�#$01,CR2SR(A1)†ALLOW�WRITE�TO�CONTROL�REG�1&‰MOVE.B�#$01,CR13(A1)‡ALL�TIMERS�RESET$‰MOVE.L�#CLOCKFRQ,D0ˆCLOCK�FREQUENCY‰DIVUƒ#4,D0�DIVIDE�BY�4#‰SUB.W‚#1,D0�CLOCK�INTERRUPTS�AT�-1*‰MOVE.W�TIMINTVA(PC),D1…INTERRUPT�INTERVAL ‰MOVE.W�D1,TIMINTVŠSAVE�FOR�EXEC‰MULUƒ#4,D1�MULTIPLY�BY�4*‰SUB.W‚#1,D1�SUBTRACT�1�-�TIMER�GOES�TO�-1!‰MOVE.W�D1,TIMINTV4‰SAVE�FOR�EXEC‰LSL.W‚#8,D1�PUT�IN�HIGH�BYTE)‰ADD.W‚D1,D0�VALUE�FOR�TIMER�3�(2�HALVES)‰MOVEP‚D0,MSBT3(A1)ˆSET�TIMER�34‰MOVE.W�#256,D0�VALUE�FOR�TIMER�1�(OVERFLOW�COUNTER)‰MOVEP‚D0,MSBT1(A1)ˆSET�TIMER�18‰MOVE.B�#$00,CR2SR(A1)†ALLOW�WRITE�TO�CONTROL�REGISTER�3;‰MOVE.B�#$C6,CR13(A1)‡T3--INTERNAL�CLOCK,INTERRUPT�ENABLED,*£OUTPUT�ENABLED,�8-BIT�MODE8‰MOVE.B�#$01,CR2SR(A1)†ALLOW�WRITE�TO�CONTROL�REGISTER�1;‰MOVE.B�#$00,CR13(A1)‡T1--EXTERNAL�CLOCK,�ENABLE�ALL�TIMERS3‰ADDQ.L�#6,SP�Everything�went�OK;�just�get�that�bus4‰BRA.S‚TIMER_EXITŠerror�junk�off�the�stack�and�exit.*;TIMERBE‚MOVE.L‚#CRASHSAV,PTMADDR‚USE�DUMP�POINTER�FOR�TIMER TIMER_EXIT�RTS–Return�to�INIT. ŠPAGE ‰SECTIONƒ80************************************************,*ƒValue�to�put�in�VME101�control�register.ƒ*0*************************************************7CTRL†SET„%1101ŽStatus�display�bit�pattern.�Also�used�to-*£assert�the�SYSFAIL*�signal�on�the�VMEbus�by,*£setting�them�all�to�1.�Status�display�here*£is�setup�for�"D".*ª0000‚=‚display�"0"*ª0001‚=‚display�"1"*¶:*ª1110‚=‚display�"E"*ª1111‚=‚display�"F",CTRL†SET„1<<4+CTRLŠStatus�display�(enabled).9CTRL†SET„0<<5+CTRLŠBus�block�transfer�request�(disabled).;CTRL†SET„0<<6+CTRLŠBus�request�time-out�counter�(disabled).>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*‚>>>>>>>µ<<<<<<<*‚>>>>>>>•NOTICEš<<<<<<<*‚>>>>>>>µ<<<<<<<>*‚>>>>>>>…When�incorporating�any�drivers�during�SYSGEN„<<<<<<<?*‚>>>>>>>…that�require�memory�allocated�for�them�as�perƒ<<<<<<<?*‚>>>>>>>…the�driver�package�instructions�-�this�is�theƒ<<<<<<<,*‚>>>>>>>…spot�the�file(s)�go�into!!–<<<<<<<*‚>>>>>>>µ<<<<<<<=*‚>>>>>>>…This�is�also�the�spot�for�code�for�a�driver…<<<<<<<>*‚>>>>>>>…that‚requires�other�types�of�initialization,ƒ<<<<<<<0*‚>>>>>>>…such‚as�clearing�an�interrupt.‘<<<<<<<*‚>>>>>>>µ<<<<<<<*‚>>>>>>>‘MERGE�IT�HERE—<<<<<<<*<*ˆWhen�you�write�the�code�that�is�to�be�merged�here,�wrap�it*ˆaround�with�the�following:*:*ˆAt�the�beginning,�with�DRVRxOUT�referring�to�your�unique*ˆlabel,�put�this�code:*'*‹PEA„DRVRxOUT(PC)„IF�BUS�ERROR�OCCURS,*¢RETURN�OR�GO�ON�TO�NEXT*¢DRIVER'S�INITIALIZATION**‹MOVE.W�#'BE',-(A7)…SAVE�'BUS�ERROR'�FLAG*9*ˆThen�insert�the�code�to�do�what�you�need�to�do�for�this*ˆparticular�driver.**ˆAt�the�end,�put�this:***‹LEA„6(A7),A7ˆREMOVE�BUS�ERROR�FROM�STACK*DRVRxOUTƒEQU„**=*ˆIn�this�way,�if�the�code�for�one�driver�causes�a�bus�error,.*ˆthe�code�for�other�drivers�will�be�executed.*E*‚>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<G*********************************************************************** INITIORƒRTS  ŠENDéééééé4VECTTBLƒIDNTƒ5,1�RMS68K�vector�table�for�the�VME101.O*******************************************************************************O*******************************************************************************O**********************************************************************************É***?***…ROUTINE:‚VECTTBL�--�RMS68K�VECTOR�TABLE�FOR�THE�VME101.Œ******É***J***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family.***G***‡Copyright�1983�by�Motorola,�Inc.‚This�versioM n�is�for�the�VME101‚*** ***‡monoboard�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‚Changes@*…--------‚------‚----------------------------------------------*…10/25/83ƒSJF„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.H*‚In�the�case�where�two�contiguous�VECTOR�invocations�leave�a�gap�in�the ¦5 ¯< ·'K*‚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. Š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�ilN legal�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�-�$17�go�to�COMINT.)'ŠVECTOR�$18,SPURINTˆSpurious�interrupt..ŠVECTOR�$19,CMRSFAIL‡SYSFAIL*�from�the�VMEbus.*ŠVECTOR�$1A,TIMEINTˆM6840�timer�interrupt.%ŠVECTOR�$1B,0Ž($1B-$1D�go�to�COMINT.)'ŠVECTOR�$1E,KILLER‰Bus�Clear�interrupt.$*¦Since�we�don't�use�that�bus�access(*¦mode,�we�shouldn't�get�this�interrupt.2ŠVECTOR�$1F,1ŽSoftware�abort�and/or�VMEbus�ACFAIL. *§We�essentially�ignore�ACFAIL*,'*§and�leave�this�vector�pointing�to�the*§bug's�software�abort�routine.ŠVECTOR�$20,TRAP0ŠTRAP�#0.ŠVECTOR�$21,TRAP1ŠTRAP�#1.#ŠVECTOR�$22,TRPVCT2ˆTRAP�#2�to�#15.'ŠVECTOR�$30,0Ž($30�-�$FF�go�to�COMINT.)  !ŠDC.Lƒ0’(End�of�table�indicator.)   ŠENDéé=/*=/*†Important�note:5=/*†The�order�of�the�INPUT�modules�for�this�LINK�must=/*†be�as�specified�below.=/*=LINK ,INIT,\LINKLS;HAMIXSSEGMENT .INT:8 \INTSTRINPUT M68XXX.INIT.ROINPUT VME101.INITIO.ROINPUT M68XXX.INITDAT.ROINPUT C8OC.SYSPAR.ROEND=ENDéééééé ¿ N C‚******************************************************************&‚*�Sysgen�command�file�VME101.RMS.CD *C‚******************************************************************‚*‚INCLUDE…C8OC.SYSPAR.CI‚**‰RMS†=�$10000�Address�where�RMS68K�starts.‚*D‚*‚Now�indicate�whether�or�not�the�exec�should�take�over�the�illegalD‚*‚instruction�vector.‚If�you�are�going�to�be�using�the�ROM�debuggerF‚*‚to�set�breakpoints,�then�you'll�want�the�illegal�instruction�vectorC‚*‚left�as�the�debugger�has�it�set.‚In�an�environment�where�the�ROMC‚*‚debugger�will�not�be�used,�you�will�want�RMS68K�to�field�illegal‚*‚instructions�as�exceptions.‚*.‰ILLINSTR�=�1’Illegal�instruction�vector�flag:#‚*¨0�=�RMS�should�not�take�it�over.‚*¨1�=�RMS�should…take�it�over.N‚*****************************************************************************‚**‚*ˆNow�we�generate�the�RMS68K�load�module.‚*N‚*****************************************************************************‚*‚*‚*‚*(‚*‚Now�create�a�VECTTBL�for�this�system.‚*‰SUBS†VME101.VECTTBL.AG:‰ASM‡VME101.VECTTBL.AG,VME101.VECTTBL.RO,VME101.VECTTBL.TF‚*‚*‚Now�link�it�all�together.‚*‰RMS0LO‚=�\RMS‰RMS0HI‚=�\RMS+$FF‰RMS2LO‚=�\RMS+$100‰SUBS†VME101.RMS.LG‚LINKˆVME101.RMS.LG‚=DEL�.&.SYSPAR.RO(‚=COPY‡VME101.VECTTBL.TF,VME101.RMS.LL;A ‚=COPY‡SYSGEN.TF,VME101.RMS.LL;A‚=DELƒ*.*.TF;Y‚*‚END‰ éé È.=/*7=/*†VME101.RMS.LG�--�RMSGEN�link�chain�file�for�RMS68K.=/*=/*2=LINK ,VME101.RMS.LO,VME101.RMS.LL;H,M,I,X,-U,Z=40SEG�RMS0:0�\RMS0LO,\RMS0HISEG�RMS2:2,3,4,5,6,7,15‚\RMS2LOINPUTˆ&.SYSPAR.ROINPUTƒM68XXX.RMS.ROINPUTƒVME101.VECTTBL.ROIN†M68XXX.AKRQST.ROIN†M68XXX.ASQALOC.ROIN†M68XXX.ASQEVENT.ROIN†M68XXX.ASQFREE.ROIN†M68XXX.ASQREAD.ROIN†M68XXX.ASQSTATS.ROIN†M68XXX.ASRINT.ROIN†M68XXX.ATSEM.ROIN†M68XXX.BKG.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.DSERVE.ROIN†M68XXX.DSRVX.ROIN†M68XXX.EQDQ.ROIN†M68XXX.EXABRT.ROIN†M68000.EXCEPT.ROIN†M68XXX.EXMMSK.ROIN†M68XXX.EXMON.ROIN†M68XXX.EXMONVR.ROIN†M68XXX.EXQEVENT.ROIN†M68XXX.EXRQPA.ROIN†M68XXX.FNDGSEG.ROIN†M68XXX.FNDTSEG.ROIN†M68XXX.FNDUSEM.ROIN†M68XXX.GETTCB.ROIN†M68XXX.GTDTIM.ROIN†VME101.KILLER.ROIN‡NOMMU.LOADMMU.ROIN†M68XXX.LOGPHY.ROIN†M68XXX.PAGEALOC.ROIN†M68XXX.PAGEFREE.ROIN†M68XXX.PAUSE.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.TABLE1.ROIN†M68XXX.TERM.ROIN†M68XXX.TFRSEG.ROIN‡M6840.TIMEINT.ROO IN†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.RO Ñ\ ÚIN†M68XXX.WTEVENT.ROINPUTƒM68XXX.RMSPATCH.ROEND=ENDéééééééO1VECTTBL ASYST'VME101 XVECTTBLAG!ƒRMS68K vector table for the VME101. 2pPROGINT2 pPROGINT3 pPROGINT4 pPROGINT5 pPROGINT9 pPROGINTA pTIMEINT pSPURINT pTRAP0 pTRAP1 pKILLER pCOMINT pTRPVCT2 pCMRSFAIL "Pn3?œœ!VCT(,,,,, , ,,,,, ,!,"04ééééO éé â'VME110 KILLER AF ÷ ÷ILLER SAÿÿÿÿÿÿÿÿ=/*†VME110.KILLER.AF=/*=/*=/*@=/*†IF�NO�OUTPUT�ARGUMENT�FOR�THE�LISTING�IS�SPECIFIED�THE�CHAIN)=/*†FILE�WILL�DEFAULT�TO�VME110.KILLER.LS=/*=/IFC \1=ARG :.VME110.KILLER.LS=/ENDIF=/*/=ASM :.VME110.KILLER,:.VME110.KILLER,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDéééééé ï