IMD 1.17: 11/11/2014 14:50:13 82VKXBVERDOS C* VERSADOS/RMS68K OBJECT 4.4 SN=48634 14 OF 22  BT14\82VKXBVERDOS 0420¿8-;FH+G0Bm4¼ `J(HÙüÿ$HGê`+Kp&üÿÿÿÿB›+K+Ll2<€0<ìBµX@YAbö&Jr`B›Y�fúAúv%H,Aú6%H0Aú„%H8Aúš%HJf @fpBNNCíK& –‰CCaZJfR@  g ;fÿz;@" ;fXa =faôg ,fò  g. Zg( Ae" [dCíK( ˜‰ -fDDH�ã‰Gíj7„aÀ  f¨JgŒáƒåƒaf() ˜©„‰ ƒŠclÖ„ƒÿBAíB¨B�B¨BhBh B¨!|SEG2 pNAfþAí!CB�B¨1| B¨!|SEG2 1| pNAfýè–„ƒŠ`BƒaÞ,iÝüˆÝÃKí¼0<¼=%U@fú.N*O$iGê`+Kp&üÿÿÿÿB›+K+i l&Jr`B›Y�fúAú´%H,Aút%H0AúÂ%H8AúØ%HHíÿÿ|+o t <+@xaÿ:`ÿ H@0-4H@,NAB€B�IúT am zn ,gè4k6 -fÀ`Ög0ƒgÁ` =fRŠa`  f@` NuBƒ:< &J $g� am zn 4gˆ`6 am zn 4k6gãƒ(åƒÖ„�Ö�SEf΂ am zn 4jè  f" am zn +ÿþNu:< am zn  am zn 4k´fgŒ_�郆�SEfÌ`ÿz€€€@@ P€@  €@ HÄR„„ÿÿÿþŸÄŸü ¿íb O÷H pNNOï .·HNu.LÐ2*(-0a®a+D0Nu"_. HÂ&g&<…(„QR„Dÿþ$O•ĵíldEïµíle•ílØŠaÿz!OEïP/JEò8ÿ/JA??B$O eTgv`gvC)C BjBBjBªL@O(-0fgA@aJf<gJ-(ga Xat`aúgJ-$ga @a\`aâgaÄ`8°m"b"?S@å@@,J5LŸg ga a$` ga¤`aŠgNq5A+D0NÑHçØžMê$gpÿS@å@@,Aõ|B€(@AõJa\$€ÿ€üLßyg/p(NNg g%m6*HBB|g€BNÁ Nupa |&8%m:*NuH瀀Aê$0¼€NCgNN *&o|&BjFB*K*E f|'` f|'`|'BjDLßNu.LÐ2*aHaxB� f† fpÀj& g fa  g4/ &Ja Æ5 c ¼5‚a ˜a>H‚?a Æ2&_g*8 gAê0¼NBgNN` ap÷Áj&a AìB’5ANup`‚.LÐ ª2*a’ fFa p�j&aV*8 &g, g&Aê$0¼€NCg f0¼NCf0¼€NCgNNa –B’A€� a ¬CòO%I5ANup` f?*8 &g pøÀj&€W5@&0Nu/(-0fBg<`"g<`BR ft bfì cp@NNB B)(NuB€B�Iúûr&H6<%B„aük$ #fÀ` ff&@€€€Nu€ü`öaÊkBfôgÚ .f R nÐ`Þ :f€@`Ð (f€`Ä )fª@`¸g Jfžf˜ggŒfF*H Kf  am zn (g24f.f. gD gô .fRˆ`*Rˆ`DÀ` 6<Gîa&4<aškÌ`À`Â&<€€€ am zn 4k^f0fR *g2À  am zn 4kR .fâ`JÆü �Ö�`¤ ƒ€f4 .fÄÀ6<ÿþ` ƒ€g ƒ'cÀ` =C ` À`À4<aÚk 6< Gî aN4<aÂkô n& f| 6< Gîa(4<aœkÎ (g 6<Gîa 4<a~k° (f¨BBBC am zn 4kD )gg8 Pn2AéK†AB`ÈBÿg BnÀ BcÀ=C `JÀÀÀBÿ BcÀ`.Rˆ6<Gîap4<aæk$< Gî &Â&Â&Â&Â6ÂBn $B|gÀ4B|gÀJ€NuJCfBA`$ am zn SC /f À<€`4Nu4HB€€»ÈgF am zn 4k.f(f @À`< *fÀÁSCn¾€€`$HB´CfÀ`< (*ÿþf<*`ÂSCnúNuJ€jÀ`QBgQBÀ`ÀBgÀNug g ³êga° ‰Nu%| 8%| .f %m@0%mD4` g%m6*NuHçùÀ./ T¯ a( ‚DÁLߟNuHçùÀ./ T¯ aãƒjD€ €DÁLߟNu G0å@A÷X@ @fB@C÷ "fpNN&âƒjD€³ƒJ�jD�tÿB²€dã‰R`ö��dÐ�ã’â‰SdòF‚"jD‚F�‚[ÁNu.LÐR’aP ‰Nu0/8/`8/0/./ Gï 2RAAÿþ sLИ@a†J@g ›aŽS@nö ‰&_$_O÷NÒHçÀ€2*fpDNN³êggS‰` g¼ `S‰`¼ %IAê0¼NBg ÆgNNa&CòO%I"jLßNuJDo ¼ aSDnôNu³êfaÿzŸRIR’Nu./ LÐ 8+ fa¸8+gp"NN„7D +�ŠR€Ñ“&_B�Nu.a2€Nu.a"€NuHçx"aõjLÐ 8+,Oa¤B +g -f -f|ÿaºa˜ am zn aÀ,OaÎJjD€ ŠÞü"LßH`Nu.HçPBYU@a"Lß 2‚Nu./ aJAgp ÀSAnú&_NuLÐ 8+24a.µëgaBJAgîÀSA`è”A ŠNua fa$`ðNu fa¨8+gp"NNB€NuR“µëf•Ê`RеëfÄ7DNuz"Bv 0m 9op1NN`@JEoJf 0g 0ÀPÁSE`RCaÿªaÿˆ am zn 0m 9oÀ #f¬ÃJEoÀSE`RCBaÿlaÿJ am zn 9o Am0 oJ@m @op1NN`TJEoJf gÀPÁSE`RCaÿaþî am zn 9o Am0 oJm o¬E"DENuB@BAt JEoNv #f(J@gpbNN` Ac AcpbNN`4B@BA`´CnpcNNÀÂÂÂÒƒHA6HAЃSE`°H@0NuHçøÐ2+$KaHÀgS€`R€@ÿþЫS€'@fpCNNAë0¼NBgz Ægt ÂgNNA€7A gXa5´5cJaÂ�7AR55H‚5 J /g RB5 J /fôRB‚aê2*aT5ALß `ÿJ•Ê`8�$k +g�J€fÁ¼ ` J€g0+HÀS€ÐŠ'@7ALß NuAê$0¼@NCgNN$-0*)Â+B0ÁNu0<…f0*NugH瀀Aê$0¼NCgNNLßNuaÞAý¿?* „6Nug0<$`g0<(`+OSH€å@@,NuAõ JHçMë$aõfLßpaù¸€ÿ€üg/p(NNNupþ`B@ _.8˜@gAðañ,"OUDg"ØYDnúm2ØNÐ$_. 0HÀ`$_. "JaNò8&RƒCÿþ(gÙS€nú`â€UÁâ€UÂg ÙS€núJg0ÙJgÙNu$_. 8TDað¾"OUDg"ØYDnúm2ØNÒ."Ga|(` ."GapB„8R„„ÿÿÿþ.‰v¸ƒl(X„"mQ‰$I&)g""C¸‘nò �„ €lX‰%Q`*"€ÓÀ"Ä`""mEñH ¿Êb pNNEêÿØQ‰$Ñ"Ä$Ñ+J ‰NuOïÿà¿íOï bpNNNu _.02RAAÿþÞÁNÐNuNVÿîB.ÿópCîÿøAíÿøN«ŠN« ØBnÿô=|ÿö?.ÿöAîÿøN«ÒN«ˆ°_m„0.ÿö 60ùm 69ùo0.ÿö 6Aùmb 6FùnZ0.ÿö 6Aùm2.ÿôHÁé�6ùH‚HÂÒ‚�7=Aÿô` 0.ÿôHÀé€2.ÿö6ùH‚HÂЂ€0=@ÿô0.ÿöHÀR€=@ÿö`ÿj?.ÿöAîÿøN«ÒN«ˆ°_m>|ÿóHmÿðN«XInvalid hex number - reenter > BgN« /N“ÆJ.ÿófþð=nÿôN^NuNVÿîAîÿúN«‚ -|ÿò0.HÀrN« p-@ÿö4.HÂ&N« X=B € m8.ÿô€7€@û`0.ÿô".ÿö�0�ûS®ÿò ®ÿòl¤HmÿðAîÿúN«ÒBgN« N« îN^ _T�NÐNVÿò-mÿ®ÿö-ÿÂ`\ nÿöBh`~ nÿö1|`p nÿö1|`b nÿö1|`T nÿö1|`F nÿö1|`8?<NN WnòAú Vˆ°númæÐÐNÐCÿ¨DÿÀEÿ®OÿŽSÿÂWÿz nÿö0(HÀJ€gÂHmÿðN«XEnter channel mnemonic > BgN« /N“BpCíÿžAíÿøN« N« Ø nÿö0(HÀ €gNHmÿðN«XEnter channels mask in hex. > BgN« /N“è nÿöHhU�aý0 _0€`HmÿðN«X#Enter number of channels to open > BgN« /N“” nÿöCèAíÿøN«N« ØB®ÿú nÿö0(HÀS€-@ÿò`ªHmÿðN«XEnter channel number > BgN« /N“8 nÿö .ÿúå@CðAíÿøN«N« ØHmÿðN«X&Enter channel configuration in hex. > BgN« /N“à nÿö .ÿúå@HpU�aûú0 _0€R®ÿúi .ÿò°®ÿúlÿNU�Hmÿ˜Hmÿ¼N“l nÿö0Ÿ0(HÀJ€gx0(HÀ €f6HmÿðN«XChannel Status = BgN« /N“\ nÿö?(aüžHmÿðN«XCommand Status is BgN« /N“& nÿö?aüjN^NužüntrpAíÿðN«âAíÿðN«®trpAíÿøN«âAíÿøN«ü|ÿšB-ÿ›Aíÿ®N«ü&HmÿðN«XEnter number of tasks (1-26) > BgN« /N“šCíÿ´AíÿøN«N« ØAíÿ¼N«‚INPx/-ÿ´N“F+|ÿ¸+mÿ´ÿ’` -ÿ¸€@@ÿ¿HmÿðN«X** Task BgN« //-ÿ¼?<?<N« þ/?<*/< *BgN« N« îHmÿðN«X9Command (O-pen,C-lose,E-nable,D-isable,S-tatus,W-ait ) > BgN« /N“Àp CíÿÀAíÿøN«ŠN« ØAíÿÀN«ÒN«ˆHÀJ€g,-ÿ "<ˆ€8t ?c°` m`gaûTAíÿÀN«ÒN«ˆHÀJ€fþþR­ÿ¸i -ÿ’°­ÿ¸lþì`þÖAíÿðN«ÆAíÿøN«ÆBgNN(_.S‡Oïÿœ O ¼INPAB¨1|@||1| Cú>!I1|2p NAgaàR(QÉÿð ¼INPA1| 1| ""Op#|CODE INAga®p#|SEG2 INAgašR)QÉÿÒ I ¼INPA| | !| Cú>!I"pNAgabR(QÉÿð ¼INPA1|"p NAgaBR(QÉÿðOïdNÔLßOïÿœ O ’1|€Eú˜!JEè!J B\4ü$Ì9|$l jf2*Âü\�9Ap#NAgaàJ,ÿþgúOïd>’NÑ STAKpAúÿäNAga¬Oèøp$NAgúažpNAùþ`¹þ``êŸü Op"NAgav h ßü"hJigp  Enter one of the above... 0 = READ THE CURRENT INPUT STATUS. 1 = ENABLE FOR AN INTERRUPT. 2 = QUIT. STATUS OF ALL CHANNELS (ASCII) = <<< Starting command >>> <<< Command done >>> *** OPEN ABORTED *** -- *** ENABLE INTERRRUPT ABORTED *** -- *** DISABLE INTERRRUPT ABORTED *** -- *** READ STATUS ABORTED *** -- *** CLOSE ABORTED *** -- Error code returned in D0 = Oúý(Iúü\Aúþ)HDAúþ)HHAúý€NBAúþ)HDAúþ6)HHAúýjNBAúüô)H`Aúüô)HdAúýpNBAúüÞab €m €o`º9@’AúÜ09@š9@ 9@¦Aúþ)HDAúþ%)HHAúý NBAúþ)HDAúþ2)HHAúüöNBAúþ&)HDAúþ-)HHAúüàNBAúý )HDAúý¶)HHAúüÊNBAúüT)H`AúüT)HdAúüÐNBAúü>a @m @o`¾ fÈAúýú)HDAúþ )HHAúü€NBa²0< aAúü¦CúüÈ!I1|pNBB€0,ša¸)B0)C4Aúýl)HDAúý†)HHAúüNBAúü)HDAúü)HHAúüNBAúþ^)HDAúþW)HHAúûêNBAúýj)HDAúýz)HHAúûÔNB`þR f^Aúý.)HDAúýA)HHAúû´NBaæ0<aLpNAg0:ü)@,AúýP)HDAúýn)HHAúû†NBAúý)HDAúý)HHAúûpNB`ýî f`’`ýàAúû�Cúû¨9@”!I1| p error : boolean; E ? E @begin E A repeat E B m%PROGRAM DOWNLOAD(INPUT,OUTPUT,INFIL); J(************************************************************************)D(*�THIS�PROGRAM�READS�RECORDS�FROM�A�SOURCE�FILE,�PACKS�THEM�INTO‡*)D(*�BLOCKS�AND�WRITES�THEM�TO�THE�TERMINAL.‚THE�PROGRAM�RUNS�ON�AN†*)(*�EXORMACS�SYSTEM.µ*)J(************************************************************************) 6ƒCONST�CMAX‚=‚132;ˆ(*�MAX�NO.�OF�CHARS�IN�ONE�BLOCK�*)-‰RMAX‚=‚132;ˆ(*�MAXIMUM�SINGLE�RECORD�SIZE�*)5‰BLKCNT=‚1;Š(*�NUMBER�OF�BLOCKS�UNDER�ONE� CHECKSUM�*)3‰BMAX‚=‚268;ˆ(*�BUFFER�SIZE�=�BLKCNT*CMAX+RMAX+2�*)/‰OPTION�=�'AA';‡(*�COM/CHAR�PROTOCOL�OPTIONS�*),‰CHRMAX�=�127;ˆ(*�MAXIMUM�CHARACTER�VALUE�*) ƒTYPE‚BKINDEX‚=�1..CMAX;‰BFINDEX‚=�INTEGER;*‰BFTYPEƒ=�PACKED�ARRAY(.1..BMAX.)�OF�CHAR;(‰RSPTYPE‚=�PACKED�ARRAY(.1..2.)�OF�CHAR;+‰RECTYPE‚=�PACKED�ARRAY(.1..RMAX.)�OF�CHAR; ƒVARƒQ…:‚BOOLEAN; ‰INFIL�:‚TEXT;™(*�SOURCE�FILE�*)>‰ASCII�:‚ARRAY(.CHAR.)�OF�INTEGER;…(*�ASCII�CHARACTER�CODES�*)v{!%ƒ/‡$‹?‰ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;(*�FOR�HEX�CONVERSION�*)&‰RECƒ:‚RECTYPE;–(*�HOLDS�RAW�RECORD�*)/‰RECSIZ:‚INTEGER;–(*�HOLDS�LENGTH�OF�RAW�REC�*)-‰BUFF‚:‚BFTYPE;—(*�BUFF�HOLDS�PACKED�BLOCK�*))‰BUFFP�:‚BFINDEX;–(*�INDEX�INTO�BUFFER�*)*‰RESPONSE:�RSPTYPE;•(*�ACK�NAK�RESPONSE�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO0‰ASCII(.CHR(I).)�:=�32;…(*�FORCE�ASCII�BLANKS�*) †RESET(INFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); -†BUFFP�:=�4;œ(*�START�PACKING�RECORDS�HERE�*)†REPEAT/‰WRITE(OUTPUT,'PREAMBLED');Œ(*�SEND�PREAMBLE�*)(‰WRITE(OUTPUT,OPTION);‘(*�SEND�OPTION�*),‰WRITE(OUTPUT,CMAX:3);‘(*�SEND�BLOCK�SIZE�*)1‰WRITELN(OUTPUT,BLKCNT:1);�(*�SEND�BLOCK�COUNT�*)‰READLN(INPUT,RESPONSE);6†UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');†IF�RESPONSE(.1.)�=�'T'(‰THEN�Q�:=�TRUE;˜(*�EARLY�TERMINATION�*)†END;‚(*�INITIALIZE�*) IƒPROCEDURE�COMPRESS(VAR�REC:RECTYPE;�VAR�RECSIZ:INTEGER;�VAR�BUFF:BFTYPE;"–VAR�P:BFINDEX;�VAR�CCNT:INTEGER); ƒVARƒI,Jƒ:‚INTEGER;‰RECPTR:‚INTEGER; †PROCEDURE�COUT(C:CHAR);‰BEGIN�(*�COUT�*)‰BUFF(.P.)�:=�C; ‰P�:=�P�+�1;‰CCNT�:=�CCNT�+�1‰END;‚(*�COUT�*) ƒBEGIN�(*�COMPRESS�*) ƒRECPTR�:=�1;ƒWHILE�RECPTR�<=�RECSIZ�DO†BEGIN †I�:=�RECPTR;F†WHILE�(I<=RECSIZ)�AND�(REC(.RECPTR.)�=�REC(.I.))�AND�(I-RECPTR<35)�DO ‰I�:=�I�+�1;5†I�:=�I�-�RECPTR;‚(*�NUMBER�OF�MATCHING�CHARACTERS�*)/†IF�(I<=3)�AND�(I>0)�AND�(REC(.RECPTR.)�<>�'|')†THEN‰BEGIN‰FOR�J�:=�1�TO�I�DOŒCOUT(REC(.RECPTR.));‰RECPTR�:=�RECPTR�+�I‰END†ELSE ‰IF�I�>�0‰THENŒBEGIN ŒCOUT('|');ŒCOUT(REC(.RECPTR.));ŒCOUT(ASHEX(.I+1.));ŒRECPTR�:=�RECPTR�+�I ŒENDƒ(*THEN*)†ENDƒ(*WHILE*)ƒEND;‚(*�COMPRESS�*) 2ƒPROCEDURE�GETREC(VAR�P:BFINDEX;�VAR�BUFF:BFTYPE);?†VARƒCPOS‚:‚BFINDEX;„(*�POSITION�IN�BUFF�FOR�CHARACTER�COUNT�*)5ŒCCNT‚:‚INTEGER;„(*�NUMBER�OF�CHARACTERS�IN�RECORD�*) ŒQ…:‚BOOLEAN; †BEGIN„(*�GETREC�*)#†IF�EOLN(INFIL)�THEN�READLN(INFIL);†IF�NOT�EOF(INFIL)†THEN‰BEGIN ‰CPOS�:=�P; ‰CCNT�:=�0;,‰P�:=�P+2;’(*�LEAVE�ROOM�FOR�RECORD�COUNT�*) ‰RECSIZ�:=�0;‰WHILE�NOT�EOLN(INFIL)�DOŒBEGINŒREAD(INFIL,REC(.RECSIZ+1.));ŒRECSIZ�:=�RECSIZ�+�1;ŒEND;�(*WHILE*)‰IF�RESPONSE(.2.)�=�'B'‰THENŒBEGIN ŒQ�:=�FALSE;"ŒWHILE�(NOT�Q)�AND�(RECSIZ�>�0)�DO�IF�REC(.RECSIZ.)�=�'�'�THEN’RECSIZ�:=�RECSIZ�-�1�ELSE ’Q�:=�TRUEŒEND;"‰COMPRESS(REC,RECSIZ,BUFF,P,CCNT);F‰BUFF(.CPOS.)�:=�ASHEX(.CCNT�DIV�16+1.);ƒ(*�CONSTRUCT�HEX�CHAR�COUNT*)*‰BUFF(.CPOS+1.)�:=�ASHEX(.CCNT�MOD�16+1.); ‰ENDƒ(*THEN*)†END;‚(*�GETREC�*) @ƒPROCEDURE�PUTREC(VAR�Q:BOOLEAN;�VAR�P:BFINDEX;�VAR�BUFF:BFTYPE;”VAR�RESPONSE:RSPTYPE); †VARƒI‚:‚BFINDEX; †PROCEDURE�OUTBLOCK(RTYPE:CHAR);‰VAR�I�:‚INTEGER; �J�:‚INTEGER;�C�:‚INTEGER;‡(*�CHECKSUM�*) ‰BEGIN �(*�OUTBLOCK�*)*‰BUFF(.3.)�:=�RTYPE;‹(*�MARK�BLOCK�TYPE�*)‰C�:=�0;4‰FOR�I�:=�3�TO�CMAX*BLKCNT�DOˆ(*�COMPUTE�CHECKSUM�*)ŒC�:=�C�+�ASCII(.BUFF(.I.).);2‰C�:=�C�MOD�255�+�1;�(*�0�CHECKSUM�IS�WILD�CARD�*)B‰BUFF(.1.)�:=�ASHEX(.C�DIV�16+1.);�(*�PLACE�CHECKSUM�INTO�BLOCK�*)"‰BUFF(.2.)�:=�ASHEX(.C�MOD�16+1.);‰REPEATŒFOR�J�:=�0�TO�BLKCNT-1�DO�BEGIN<�FOR�I�:=�J*CMAX+1�TO�(J+1)*CMAX�DO„(*�WRITE�OUTPUT�BLOCK�*)’WRITE(OUTPUT,BUFF(.I.));�WRITELN(OUTPUT);�END;ŒREADLN(INPUT,RESPONSE)6‰UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');‰Q�:=�RESPONSE(.1.)='T';5‰C�:=�BLKCNT*CMAX+1;‘(*�JUSTIFY�ANY�BLOCK�OVERFLOW�*)‰WHILE�C�<�P�DOŒBEGIN&ŒBUFF(.C-BLKCNT*CMAX+3.)�:=�BUFF(.C.); ŒC�:=�C�+�1ŒEND;8‰P�:=�P�-�(BLKCNT*CMAX�-�3);‰(*�RESET�NEXT�IN�POINTER�*)‰END;‚(*�OUTBLOCK�*) †BEGIN„(*�PUTREC�*)†WHILE�P�>�BLKCNT*CMAX+1�DO/‰OUTBLOCK('A');Š(*�OUTPUT�INTERMEDIATE�BLOCK�*)†IF�EOF(INFIL)†THEN‰BEGIN‰FOR�I�:=�P�TO�BLKCNT*CMAX�DO5ŒBUFF(.I.)�:=�'�';„(*�FORCE�BLANKS�TO�END�OF�BLOCK�*)'‰OUTBLOCK('Z');Š(*�OUTPUT�LAST�BLOCK�*) ‰Q�:=�TRUE;‰END†ELSEF‰IF�P�>�BLKCNT*CMAX�THEN�OUTBLOCK('A')�(*�OUTPUT�INTERMEDIATE�BLOCK�*)†END;…(*�PUTREC�*) ƒBEGIN„(*�MAIN�*) ƒQ�:=�FALSE; ƒINITIALIZE;ƒWHILE�NOT�Q�DO†BEGIN†GETREC(BUFFP,BUFF);†PUTREC(Q,BUFFP,BUFF,RESPONSE);†ENDƒEND.…(*�MAIN�*)QAÿÿÿ˜Aÿÿÿ¼E ¢ if code <> WAIT E £ then (&S5FÿÿÿöBE ¤ begin E ¥ if code = STAT E ¦ then ('$5FÿÿÿöB†character�function�ITOA(�INT�) †integer‚INT ‰character„CHARS*352‰dataˆCHARS/'123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'/ ,‰if�(�(INT�.lt.�1)�.or.�(INT�.gt.�35)�)�then ŒITOA�=�'0'‰elseŒITOA�=�CHARS(�INT:INT�)‰end�if †end "†character*2�function�ITOX2(�INT�) †integer„INT ‰character„HEX*16‰integer„INDEX ‰dataˆHEX/'0123456789ABCDEF'/ -‰if�(�(INT�.lt.�0)�.or.�(INT�.gt.�255)�)�then ŒITOX2�=�'ZZ'‰elseŒINDEX�=�(INT�/�16)�+�1"ŒITOX2(�1:1�)�=�HEX(�INDEX:INDEX�)ŒINDEX�=�mod(�INT,�16�)�+�1"ŒITOX2(�2:2�)�=�HEX(�INDEX:INDEX�)‰end�if‰return †end "†subroutine�INIT(�BUFFP,�Q,�RESP�)†integer…BUFFP †logical…Q†characterƒRESP*(*) ‰include�'common' ‰characterƒPRAMBL*8‰characterƒDEST‰characterƒOPTION*2 ‰dataˆPRAMBL/'PREAMBLE'/‰dataˆDEST/'D'/‰dataˆOPTION/'AA'/ -‰open(7,file='fort.7',access='DIRECT',recl=1) ‰BUFFP�=�4 10‡continueŒwrite�(6,�2000)�PRAMBLŒwrite�(6,�2000)�DESTŒwrite�(6,�2000)�OPTION�9”;˜5ª5®0²Œwrite�(6,�2000)�'132'Œwrite�(6,�1000)�'1'Œread�(5,�3000)�RESP:‰if�((RESP(1:1)�.ne.�'N')�.and.�(RESP(1:1)�.ne.�'T'))�then Œgo�to�10‰end�if ‰if�(�RESP(1:1)�.eq.�'T'�)�then ŒQ�=�.true.‰end�if ‰return 1000‚format�(A)2000‚format�(A$)3000‚format�(A)†end $†subroutine�COUT(�BUFF,�P,�C,�CCNT�)†characterƒBUFF*(*) †integer…P †characterƒC †integer…CCNT ‰BUFF(�P:P�)�=�C ‰P�=�P�+�1‰CCNT�=�CCNT�+�1 ‰return †end 4†subroutine�COMPRS(�REC,�RECSIZ,�BUFF,�BUFFP,�CCNT�)†characterƒREC*(*)†integer…RECSIZ†characterƒBUFF*(*)†integer…BUFFP †integer…CCNT ‰include�'common' ‰integer…RPTR‰integer…MATCH ‰integer…I‰characterƒITOA‰characterƒCHR ‰RPTR�=�120‡if�(�RPTR�.le.�RECSIZ�)�then ŒMATCH�=�1ŒCHR�=�REC(�RPTR:RPTR�)Œdo�30�I�=�RPTR+1,�RPTR+346�if�(�(I�.le.�RECSIZ)�.and.�(REC(I:I)�.eq.�CHR)�)�then’MATCH�=�MATCH�+�1�else ’go�to�40�end�if 30Šcontinue  :40Šif�((MATCH�.ge.�3)�.or.�(REC(RPTR:RPTR)�.eq.�'|'))�then$�call�COUT(�BUFF,�BUFFP,�'|',�CCNT�)1�call�COUT(�BUFF,�BUFFP,�REC(�RPTR:RPTR�),�CCNT�).�call�COUT(�BUFF,�BUFFP,�ITOA(�MATCH�),�CCNT�)�RPTR�=�RPTR�+�MATCHŒelse�do�50�I�=�1,�MATCH/’call�COUT(�BUFF,�BUFFP,�REC(RPTR:RPTR),�CCNT�)’RPTR�=�RPTR�+�1 50�continueŒend�if‰elseŒreturn‰end�if ‰go�to�20 †end 6†subroutine�GETREC(�BUFF,�P,�RESP,�EOFINF,�Q,�CHRCNT�)†characterƒBUFF*(*) †integer…P†characterƒRESP*(*)†logical…EOFINF †logical…Q†integer…CHRCNT ‰include�'common' ‰characterƒREC*132‰characterƒITOX2*2‰characterƒCHR ‰integer…I ‰integer…CPOS ‰integer…CCNT‰integer…RECSIZ ‰CPOS�=�P ‰CCNT�=�0 ‰P�=�P�+�2 ‰RECSIZ�=�0 ‰do�53�I�=�1,�RMAXŒCHRCNT�=�CHRCNT�+�1"Œread(�7,�rec=CHRCNT,�err=80�)�CHR!Œif�(�ichar(�CHR�)�.ne.�10�)�then�RECSIZ�=�RECSIZ�+�1�REC(�RECSIZ:RECSIZ�)�=�CHRŒelse �go�to�55Œend�if 53‡continue #55‡if�(�RESP(�2:2�)�.eq.�'B'�)�then¶'M615DRV TEST615 LF©©aaTESTAC LF²²aaTEST615 LO³ aaTESTAC LO¿aa=/*=/*†M615DRV.TEST615.LF=/*G=/*†This�chain�file�will�generate�the�TEST615�test�program�load�module.=/*5=/*†The�command�line�will�accept�arguments�as�follows=/*7=/*‹Argument�01ˆ\1�=�Output�file�link�listing�or�device=/*D=/*†The�following�shows�the�link�chain�sequence.‚In�this�example�theF=/*†printer�was�chosen�as�Argument�1,�however,�the�user�could�if�he�so2=/*†desired�have�requested�an�output�listing�file.=/*!=/*�=CHAIN�M615DRV.TEST615.LF�#PR=/*-=/*†Default�argument�01�is�M615DRV.TEST615.LL=/*=/IFC \1ƒ=ARG�M615DRV.TEST615.LL=/ENDIF=/*=/*"=LINK ,M615DRV.TEST615.LO,\1;HAMIXSEG SEG0:0,1,8,14 $000000ATTRIBUTES D PINPUT M615DRV.TEST615.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééé é¡=/*=/*†M615DRV.TESTAC.LF=/*/=/* Link chain file to create M615DRV.TESTAC.LO=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M615DRV.TESTAC.LL=/*=/IFC \1ƒ=ARG�M615DRV.TESTAC.LL=/ENDIF=/* =LINK ,M615DRV.TESTAC.LO,\1;HMIX SEG SEG0:0INPUT M615DRV.TESTAC.ROEND=/*=ENDééééééªTEST8ÿÿÿÿÿ€SEG0 ÿÿÿÿ ÿÿACO1€ MVME615 Driver Test Program Number of the channel to convert  > Enter one of the above... Time (in milliseconds) for output pulse > 0 = OUTPUT ON. 1 = OUTPUT OFF. 2 = PULSE AN OUTPUT FOR A SPECIFIED TIME. 3 = READ THE CURRENT OUTPUT STATUS. 4 = QUIT. STATUS OF ALL CHANNELS (ASCII) = <<< Starting command >>> <<< Command done >>> *** OPEN ABORTED *** -- *** START OUTPUT ON ABORTED *** -- *** TURN OUTPUT OFF ABORTED *** -- *** START OUTPUT PULSE ABORTED *** -- *** READ STATUS ABORTED *** --  *** CLOSE ABORTED *** -- Error code returned in D0 = OúüŽIúûÂAúýv)HDAúýŽ)HHAúüæNBAúý‚)HDAúý¨)HHAúüÐNBAúüZ)H`AúüZ)HdAúüÖNBAúüDaÄ €m €o`º9@’9@¨Aú:09@š9@ 9@²Aúý )HDAúý¯)HHAúünNBAúý¢)HDAúý¯)HHAúüXNBAúý¢)HDAúýÉ)HHAúüBNBAúý¼)HDAúýÝ)HHAúü,NBAúýÐ)HDAúýØ)HHAúüNBAúüâ)HDAúüø)HHAúüNBAúûŠ)H`AúûŠ)HdAúüNBAúûtaô @m @o`¾ fva2Aúý¤)HDAúý·)HHAúû´NB0<€a0AúûÞCúü!I1|pCúÐEúÍa 2Cú ¬Eú ×a &Cú¸Eúµa Aú lCú È!I2|1Ip!I2| 1IpCúÿÔEú` >Aú ~áètáè Aú|RP0:v @kÿxAú `Cú Æ!I2|1Ip!I2| 1Ip Enter one of the above... Time (in milliseconds) for output pulse > 0 = OUTPUT ON. 1 = OUTPUT OFF. 2 = PULSE AN OUTPUT FOR A SPECIFIED TIME. 3 = READ THE CURRENT OUTPUT STATUS. 4 = QUIT. STATUS OF ALL CHANNELS (ASCII) = <<< Starting command >>> <<< Command done >>> *** OPEN ABORTED *** -- *** START OUTPUT ON ABORTED *** -- *** TURN OUTPUT OFF ABORTED *** -- *** START OUTPUT PULSE ABORTED *** -- *** READ STATUS ABORTED *** -- *** CLOSE ABORTED *** -- Error code returned in D0 = OúüŽIúûÂAúýv)HDAúýŽ)HHAúüæNBAúý‚)HDAúý¨)HHAúüÐNBAúüZ)H`AúüZ)HdAúüÖNBAúüDaÄ €m €o`º9@’9@¨Aú:09@š9@ 9@²Aúý )HDAúý¯)HHAúünNBAúý¢)HDAúý¯)HHAúüXNBAúý¢)HDAúýÉ)HHAúüBNBAúý¼)HDAúýÝ)HHAúü,NBAúýÐ)HDAúýØ)HHAúüNBAúüâ)HDAúüø)HHAúüNBAúûŠ)H`AúûŠ)HdAúüNBAúûtaô @m @o`¾ fva2Aúý¤)HDAúý·)HHAúû´NB0<€a0AúûÞCúü!I1|pCúÐEúÍa 2Cú ¬Eú ×a &Cú¸Eúµa Aú lCú È!I2|1Ip!I2| 1IpCúÿÔEú` >Aú ~áètáè Aú|RP0:v @kÿxAú `Cú Æ!I2|1Ip!I2| 1IpH{ˆB§B§rHÁ/HxN« OïN«v=|ÿÚ=|ÿÜBnÿÞ=| ÿàHnÿvHnÿÖAùN»ˆP�2.ÿÖJAk g0`B§AùIôH{ˆB§B§rHÁ/HxN« OïN«v`(B§AùIòH{ˆB§B§rHÁ/HxN« OïN«v=|ÿ´=|ÿ¶=nÿ¢ÿ¸HnÿvHnÿ°AùN»ˆP�B§AùI¾H{ˆB§B§rHÁ/HxN« OïN«v=|ÿ´=|ÿ¶=nÿ¢ÿ¸HnÿvHnÿ°AùÆN»ˆP�2.ÿ°JAk g0`B§AùI†H{ˆB§B§rHÁ/HxN« OïN«v`(B§AùI„H{ˆB§B§rHÁ/HxN« OïN«vB§AùFŠH{ˆB§B§rHÁ/HxN« OïN«vB§AùINH{ˆB§B§rHÁ/HxN« OïN«vB§AùF>H{ˆB§B§rHÁ/HxN« OïN«vAùI,EûˆAîÿv <N«<¬gAùIEîÿvAûˆü <N«<Œ`õJB§N«\X�LßþN^Nu/,OŸüHçB§AùHÜH{ˆB§B§rHÁ/HxN« Oï n/HxHx!B§N«zOïN«vLßþN^Nu/,OŸü Hçp-@ÿü=|cÿúJnÿúm*p-@ÿö=|]ÿôJnÿôm SnÿôR®ÿö`îSnÿúR®ÿü`ÐLßþN^NuHç€pa‚$¼B€0*å€\€2€ KpJAf Cðh.IŸÇGÔ*‹'I8AìÿÄ'H`«ƒ++g, (=f$Tˆ&ˆ ,gJgJƒf ;gRˆ`èB`pRˆNu ,fRˆ`öNuHç0øNVÿ¬$U(jd Ef #gZ&O"KvSüQËÿú7|,E1"Aë,NC A|,|@-7|.|0E1aœJ@f€B� (f (WfPk.   ()g``"Aë,NCg fkÿþ.NCf J�f0`H f$J�g^ A (Dfk.k.7|P` (Ff ((fþCèah :g )fè �ÿþbÞR�Aÿþ7AN" |€-|0Aë,NCf¬|@-|0NCfšJ�g° A :f¦CèaJAg˜||7|+.g7|d‰|k1'|B€0+NAïÿÿ'H ŸÀ'OB—SAAëSAR«R—NBfQÉÿô7|NBg,pB�+N^Lß NupB�+0N^Lß NupB�N^Lß NuB€N^Lß Nu #faÊNu)| 2"j<'i27i6'i8'i<'| @'| D7|FTH :gL 0m 9oJ"Hp :g*QÈÿøB€"H .fR€` 0m ZnR‰`æ @oL`.pCë2avJ@fnÐü .g"Ha¶ A'bX I7A6 .fL .gpCë8aBJ@f: .f4ÐüpCë@a,J@f$ .fÐüpCëHaJ@fJg (fB€NupNu @b2¼ `"¼ @c#|  Am$ ZbØ 0m 9c Am ZbQÈÿäpNuB€NuB€B� 0m 9bÃü Ò@`æNu&LaRJ@fþVEE19|,Aì,NC|@-9|.NCg&L`þ,|l1l.9lL9lN `þ& < '@2'@8'@<'@@'@D7@HRˆJf "j<'i$2`" Ef)| 2Cë2rJg ØQÉÿøpNuB€NuHçÿþ?oL@/oHJ?oBD?oNBAïD*UEí@$�|Œ *ÿ†f5|ex|zNº|ÿ†5PÐü*g5P%h Cúð%IlÐü ``*f"25A Ao Aco$5|fx|zNº®5|*g5|ÐüCú Æ*g Cú %hÿòÐü%IlCúà*gCú%P<Ðü%IhCú" *f@Cú,f%|*g%PÐü%|*g%PÐü*g%P%Ipr"jlN‘J@gT f*g"j`Nºè*g"j`NºÖ*g j0€*f €5|†.R/Ia²%L0pNuB‚‚"jb*f ü QÊÿú&+$"jba€%L0pNu‘ê,5Hv&*,–Œgad"j(*g.&*,–ª(C3C2¼4*t Bÿf(5|ux|zNº°4 Bg5|tx|zNº˜4*tB5Bt0<Nuƒ*fÉIÙQËÿü*fÉINu *ÿ[f|[ *ðUg`Æ *ŒgN *[fl *ÿUg*Ua¤ @gT|ðUNu&j@ )f5|hx|zNº|U0<Nu&j@S‹Öü (g  gð`Öü%KD%K@`H"jpN‘B�2*\ÒŒ²ª,bz(A%L02*P Ab^|[%|\|X|W|Y|VBƒ&j@CúšB��BB1ÄüCú(Nñ *WfÖü%K@`Ì2*PA5APB€Nu`Þ`Ö`¶` `†``F``z`"`P`z`Ò``0`f`~``’`ª`Â`Þ`ö `ÿ5|ix|z|{%K~Nº @5|gx|zNº 05|mx|zNº "aÔ&5|P2*LJAf05|L5|Ž Cg5CL5CŽª�Öü%KD%K@`þV2*NJAf 5|N Cg5CNÖü%KH%K@`þ.5|jx|zNº ¢aX2*NJAgA5ANJAgþ.&jH%K@`ýø2*LJAgA5ALJAgþ &jD%K@`ýÖ|ÿU *Œgþ*�f5|hx|zNº 0%jD@5jŽLB@Nu&j<×ü%K@B@NuaÄ|ðV`ý®a¶|ÿV`ý a¨Öü%K@0<|ÿ[NuÖü%K@aˆ`ýFS‹%K@`þhÆü ÖA Cmý\5|kx|zNº ž *Vfþf *[g * [g *[g *[fþJCgþ *ÿXgþ *[gþ|ÿX5C\BC`üö *VfþJCg~ *[f5CPBƒNu *ÿYgR *Xg5C^`5C\Bƒ2*\4*^ *[g$ * [g *[gJAg6JBf` *[g`6JAg"´Al.` C5C`BƒÞü`ü€ *[fŒNu5|kx|zNº ¢5|lx|zNº ’ê� +,g( +)g +/gaÿ* *Vfý8|[`ü aÿBƒ*f5C\|$[ *ŒfJfv`ûä *[gaþä *Vfüò CfüÀÖü Nf|ÿT` Zfü¦|TÖü%K@`ûhê�aþœ|[Öü%K@`ûLê� *[faþx| [Öü%K@`û(5C^|ÿYÖü%K@`ûê�aþF|[Öü%K@`úöê�aþ*|[Öü%K@`úÚê�aþ|[Öü%K@`ú¾ê�aýò|[Öü%K@`ú¢JCg *ÿVfDC5CRBCÖü%K@`ú‚ *VfûÎJCf6<  (j0ØÃ¹ê,nû¨%L0Öü%K@`úR *VfûžJCf5|kx|zNº¸(j0"LØÃ¹ê,nûjÖü*fÇICÛQËÿü*fÇI%L0%K@`ùö *[gaý( *Vfû6JCfû(j0Öü"KBƒ 'g ÖüC`ð LÐñê,búø*fÉIJCg CÙQËÿü*fÉIÖü 'f*g¤“Øü%L0`˜%K@%L0`ùfê�aüš| [Öü%K@`ùJHçÿþCúNñ` `(`.Nºô« @g|Nº¾NºÚë +f5|‚x|zNºz +(g +)g +2g +3g +4f5|x|zNºB*g+ f.5|zx`+ f5|yx| z||Cë%I‚Nº+ gë « « « « « *g« 7| +fª7|I`~ +g( +#g +Zg +[g +_g +df5|€x|zNºrë 7|  +f k f«««`0 +f7|I+ f«+ f ««B@@*fë |` ë ||*gV < *fB€&*,(j(–Œ Cm (ÀCg`ð Cm 8ÀCg`ð8€Lßÿ(j(B@Nu&j« &j*g*(j0 +Zg$ +[g +_g +g, +#g$`äaÊ�ª( €„o"5|gx|zNº,BkNa¦/+ "k`h/+ ë"k 1fAú”'HRH'H `( 0fAú‚'HRH'H ` +g(Aúj'H'H AëNBJkNf¹Éf 'IOï`®'I �«f¼ `JkNgSŒ IS@RHØQÈÿü"_¼ 'I ` JkNfS€'@ Nu kNf °«gSŒ'L AëNBgF*g +Êf||NBg *f +Âgˆ5|„x|z`t|(k%L(%L0*fþ kNf"LÓë$%I,S‰'I `þ6"k Òü%I, +$"�k lþD@HÀ j(ÐÁ< *fBAÁQÈÿü`ýúp`5|†x|zpÞüLßþNuHçÿþCúNñ` `þ`úNº¢ @g5|�x|zNºJ +f5|ƒx|zNº2*g+ f05|zx`+ f 5|yx| z||Cë%I‚Nºò*g> +(g6 +)g. +2g& +3g +4g7|` +fR7|dI`7|d  +f7|dIë*fë+ f«+ f ««|*g$| +g +g +g|| *n5|Šx| z||Cê%I‚Nº'@(j((€*gˆ < *fB€&*,(j(–Œ Cm (ÀCg`ð Cm 8ÀCg`ð8€ Af*g (j( *(€(j( AfØü%L0Lßÿ(j(B@NupÞüLßþ(j(%L0Nu&jAë*ga$J€fNBg5|…x|z`Â*fÿH`€0¼NBJf0¼B€` Ég Âf0¼B€Nu o /Hçÿþ*UEí@$�&j +gfÀ7|,NC7|@,7|.NC|7|(k"LÒü…%I,(ü** F(üORTR8üANü Bƒ:�CúŽ f:�Cú„ÙQËÿü&ƒÿÿÿg"*,’Œ¶Ao6 o CØQËÿüSŒ'L |AëNBg5|Œx|zNº< g|NBfÞLßÿNuNº pAúNAPAUSE STOP Hçÿþ` Hçÿþ*UEí@5@x|zfêzNVÿê.ª0/j(/j,/jb jfjgj[?j\"j$&j ")2²«2g ©PR 2f&I +g *zfè7|,NC7|@,7|.NC(k%L(%L0"LÒü…%I,"L"<„ü QÉÿú(ü** E(üRRORØü%L0|[5|\Cêx%Ib|f|gHçNº øLß4*x”y-ìCú ÌBƒÄü61 Cú¤81 CúÖÒÄ(j0Øüa®Øü*zgBƒ*{"j~a”%L0*zgB|[5|\0* @co5|\Cê%Ib|fHçNº jLߨê\Øü%L0*zg2| [5|\"jCé%Ib|fHçNºªLߨü%L0*zg*| [*|CfÆü5C\"j‚%IbHçNºpLß||7|·ê$fAúÔ'HTH'H AëNB'j(SŒ'L AëNB·ê$f &j +g°7|@,7|.Aë,NCgœ*zgB5|x|z%W0%o(%o,%o bofogo[5o\N^LßÿNuNº :B€B�0*x�üd2áIB@H@�ü éH‚@H@‚@p ANAJCgC¹ê0gÙQËÿöNu d RECURSIVE CALL UNIT NO. OUT OF RANGE END OF RECORD FORMAT CODE MISSING INVALID CHARACTER IN FORMAT NEST OUT OF RANGE IN FORMAT NUMBER OUT OF RANGE IN FORMAT ILLEGAL DESCRIPTORS IN FORMAT ILLEGAL SIGN WITHOUT SCALE FACTOR INVALID DECIMAL CHARACTER INVALID CHARACTER INVALID HEXADECIMAL CHARACTER FIXED OVERFLOW FLOATING OVERFLOW FLOATING UNDERFLOW NOT ENOUGH RECORDS UNFORMATED READ TOO MANY RECORDS UNFORMATED WRITE ASSIGN MISSING INSUFFICIENT MEMORY FOR BUFFER ERROR RETURN ON FHS READ NOT SUPORTED DEVICE WRITE NOT SUPORTED DEVICE BACKSPACE NOT SUPORTED DEVICE REWIND NOT SUPORTED DEVICE ENDFILE NOT SUPORTED DEVICE DIRECT ACCESS NOT SUPORTED SEQUENTIAL ACCESS NOT SUPORTED UNFORMATED NOT SUPORTED ILLEGAL DIRECT WITHOUT OPEN STMT. ALREADY ACCESSED DIRECT ALREADY ACCESSED SEQUENTIAL I/O ERROR AT SEQUENTIAL ACCESS I/O ERROR AT DIRECT ACCESS END OF FILE ALREADY OPENED ILLEGAL RECORD FORMAT RECORD LENGTH OF OPEN STMT GT OF FILE RECORD NUMBER LE 0 NO FORMATTING FILE I/O ERROR AT PAUSE OR STOP ERROR OCCURED AT CLOSE OUT OF RANGE OF ARRAY   ELEMENT INSUFFICIENT MEMORY ZERO DIVIDE SOURCE ERROR ILLEGAL LABEL ASSIGNED TO VARIABLE IN ASSIGNED GOTO REAL ZERO DIVIDE DOUBLE PRECISION ZERO DIVIDE INTEGER ZERO DIVIDE REAL POWER BASE=0,EXP=<0 DOUBLE PRECISION POWER BASE=0,EXP=<0 INTEGER POWER BASE=0,EXP=<0 SQRT ARG.<0 DSQRT ARG.<0 EXP ARG.>=127LOG(2) DEXP ARG.>=1023LOG(2) ALOG ARG.=<0 DLOG ARG.=<0 ALOG10 ARG.=<0 DLOG10 ARG.=<0 SIN ARG.>=10**6 DSIN ARG.>=10**14 COS ARG.>=10**6 DCOS ARG.>=10**14 TAN ARG. TOO LARGE DTAN ARG. TOO LARGE ARSIN ABS ARG.>1 DARSIN ABS ARG.>1 ATAN ABS ARG. TOO LARGE DATAN ABS ARG. TOO LARGE ATAN2(X/Y) ARG.X=Y=0 DATAN2(X/Y) ARG.X=Y=0 ATAN2(X/Y) ARG. Y TOO LARGE DATAN2(X/Y) ARG. Y TOO LARGE &4Hd€ž¼Þø (7I\¡°Ïãü4Ok†¥½ß÷2MYh~¤·Êåü.:G{|}~�­ÁÚÿ'4H^kx‡–¦¸ÈÚí$<Uj€œ¹º»¼½¾¿ÀÁÂÃÄ"#"" & 4%  Hçÿþ&j·üg8|,|-Aë,NCg @gk05|�x|†zNºóÎ&S·êfÀLßÿNu/&j·üf&j8 Ъˆ°ª4nj`€0*°+fDB@ +g0<"j8%I(%I0'I"j4 kNg"j8ÒëN%I,S‰'I %K"Nu&S·êfª"j8 Ъˆ°ª4o5|wx|zNºó("“&‰&I`&‹(KØü"*ˆAüQÉÿú%K%@8jj1|,|€-0<`ÿ\Aë,NCg jxgNuk05|vx|zNºò¸ j (1g Aè1Cë1³gÒ+Lg7|„N|k1k.7kL7kN kNg"kÒëNS‰'I Nu"j4S‰'I NuHçÿþBA*[Cú$1N» LßÿNu0f$Rp®pNVÿð(j0"L-LÿüÒê\-Iÿø-jbÿôB@*f=@ÿò=|ÿð*NNº N^NuNVÿè|ÿè&jb g|ÿÿè(j0-Lÿì:*\=Eÿê*NNº²(j0&LÖê\B@0*^ÖÀÖÇÐGg~ÖêR¹ËbtÐjRJ@lD  gdB€S‹ :m8 @¹Ëb €`âBƒ6*\C&LÖÃCcQËÿú¼1RG`†6*^ÖG&LÖê\ÖÃDƒCü QËÿú0*^ÐGÐjRD@J@oÈ2*^4*\”@n"LÒê\Bƒ6Ckh<0QËÿú`^&LÖÂ"LÒê\Bƒ6´Ao6Ck + ÿÿg#` <0—üQËÿè´Amg$<.6–AC#QËÿü`6–BC<0QËÿú<.&I³Ìc<0&I³Ìc< `ö .ÿÿèf·Ìc<-` 0f ,.f¼-N^Nu6*\Cü*QËÿú`êNVÿä|ÿè&jb g|ÿÿèB�2*`Aÿé *fg|ÿé(j00*\�j^BA.ÿé�A @m¨ØÀ-Lÿì0*^@=@ÿê*NNºÊ(mÿìØíÿê , ÿÿg>$"L :m.$ :m$¹íÿìg¼0`ê(mÿìØíÿê"LSŒRG$¹íÿìfø`¶¼ *[f„JGl~B€0-ÿêD€¾@opBA-ÿéDAÒj\’j^(j0"nÿì6-ÿê¼ 0ÿ�GD€S‰J@g³Ìmô&ƒéQËÿú¼. ) ÿÿf|0ÿÿ .ÿÿèfÄ“ÀS‰³Ìm¾¼-`²0-ÿê�jRÐG;@ÿäCíÿä+Iÿô;|ÿò;|ÿð(j0Øê\+LÿøB€-ÿé™ÀØü+LÿüNºf0-ÿð(mÿüJ@g8B�2A¼+ 4-f¼-¼ @AJAm¼0ÿ@QÉÿð|Dÿÿ *fg|EÿÿBA-ÿéDAÒj\’j^ÒjR(j0 j^g4*RJBnmv¼.ÿ`Ž´j^b"&mÿì·ÌgÔBƒ6C"KS‰ÛQËÿü¼.`r6–j^C8˜jR¸Cm¦&mÿì"K“ÃB…:*^EÛQÍÿü:Eü0QÍÿú¼.`0 Acr¼.ÿCô6DCCü0QËÿú Ac¼0þ .ÿÿèf< Bb Am4gA¼-þ`"´j^b Dm¼-@þ`C¸Cm ¼-@úN^Nu(j06*\Cü*QËÿú`æ*ggNºûNugNºüÜNugNº NuNº"Nu(j0Øê\<F"jbJ‘g<TAÿÿNuB�*[ $f*f5A\(j0&jb2*\Bƒ*f’CgmØÁ`ÖACÛQËÿüNu(j0&jbØê\BC*fÖÃÆü¶j\c6*\JCg CB�# m0QËNuQÉÿàèH`ÜNVÿþ&mÿô6-ÿò| ÿÿ(mÿø Cb&gB�2JAlDA|-ÿÿ`"J�lD�|-ÿÿB€` "+B„B…B†B‡:H@8>HA<" Db Eb Fb* ‡'mB`0ˆü' "a’(*Šü' "a‚*,Œü' "ar,.Žü' B�ab.HA`B‡vJAg‚ü HA0BAHA¹íÿügb0QËÿâJDfBJEf>JFf:JGf6¹íÿøf<0 .-ÿÿf ¹íÿüg0<-™íÿü;LÿðN^Nu$BBH@B@H@Ò‚NuJCkÿ4<0QËÿô`ÿ((mÿüü*¹íÿøföN^NuNVÿÈ"jb € €f4 *fg ") �f "mÿìBƒ6-ÿêCü0QËÿú>-ÿêDGN^Nu *fgH"€ÿÿ�€HAîI4 f4<Bãˆgô€B�vâˆâ‘QËÿúB€éJHBBB€‚`")Cú úB‡$‚ðfAúL/ / //N‘ "><ÿà$‚ðHB€ÿÿ€C0-@ÿè-AÿìB@(HBBƒ-Bÿð-CÿôD?ð:<ÑÉÅHD DnDÞDDDHĉü :HDçDçEAú ~ 0@"0@ Eg Aú ÔÐÅ Dg/ / //N‘ "`" Юÿð€?ðJEgm€`€ €?ðlGAúŠ/ / //N‘ "`( €@$m n �mGAúh/ / //N‘ "Aîÿð/ / //N‘ "$€ÿÿÀ-@ÿø-AÿüBBHBèJB3oB&.ÿüã‹-Cÿü&.ÿøã“-CÿøQÊ  ÿêCîÿø+Iÿô;|ÿòCîÿÈ+IÿüÒü +Iÿø;|ÿð/NºüŽ.G žmÿðžmÿê"mÿüÒíÿð&IB€*fÁü@°mÿêo0-ÿêÖÀZ@S‹ :m2 @³ËbR@€`äBƒ6-ÿêC&IÖÃcQËÿú|1RG&mÿìBƒ6-ÿêB€*fÁü@¶@o60CÙQËÿü°mÿêg$ * [g6-ÿê–@0ÖG¶@bCkü0QËÿúN^NuF“¸µµn@$?¹™™™™™šHçÿþBA*[Cú$1N» LßÿNu0üüüN|Ò$ÒNVÿð=|ÿð=|ÿò=|ÿô=|ÿöjfÿ÷-jbÿø&nÿø6¼ .ÿ÷g7| .ÿ÷g'|(j0"LÒê\-Iÿü*NNºb¹íÿüg5|nx|zNºç, mÿôg&5|qx|€zNºç"mÿø2¼ÿ -ÿ÷g"¼ÿÿÿ -ÿÿðf"mÿø -ÿ÷g2DA2�`"D�"�N^NuNVÿè=|ÿè=|ÿê=|ÿî=|ÿð=|ÿò=|ÿô|ÿöjfÿ÷-jbÿø(j0"LÒê\-Iÿü*NNºêN^Nu*ggNºþÖNugNºÿ–NugNº NuNºZNuNVÿü(j0"LÒê\-Iÿü¹îÿüg2  gô ,.ÿÿg ,Tÿÿfr`¹îÿüg  gô ,Tÿÿfr`B�"jb"�N^NuB�*[ $f*f5A\(j0&jb2*\Bƒ*f’CgmØÁ`ÖADAÖÃAü QÉÿú&jbCÜQËÿüNu(j0Øê\&jbB€*fJ@gb@üQÈÿúBƒ6*\B@*fÀü¶@m6JCg<C$ f *ÿTfQËÿîNu 0mT 9c FbH @ÿÿQËNu$ f *ÿTfQËÿîNu 0m 9c Fb éÑ#QËÿ”Nu5|px|z|{Cìÿÿ%I~NºäâB€¹íÿüfNu mÿòf +fSŒNu -fSŒNuSŒ` gÎ +g -f|ÿÿð`SŒ¹íÿüfNu 1m 9b2-ÿòA;Aÿò`( 0g gSŒNu2-ÿòJAgÀ 0gÐ *ÿTg²`Æ4-ÿô Bg B;Bÿô`œ"mÿø6-ÿö Cmb4(ã„ir*å…ilØ…ihØ€id"„`ÿt8ãDiX:åEiRØEiNØ@iJ2„`ÿZ(*)B‚ã�Õ‚ã„i4Ø‚i0,.B‚ã�Õ‚ãJBƒã�Õƒå„iØ‚iÚ‡Ù†iÚ€Ùƒi "„#E`ÿ;|ÿô`ÿ NVÿò=mÿöÿú-mÿøÿüCîÿò+Iÿø;|ÿö-|ÿò-|ÿöNºþ�;mÿôÿê¹íÿüf2-ÿê’j^;Aÿê`: Eg4 Dg. +g( -g" .g� +g¶ -f|ÿÿî`¦2-ÿê’j^;Aÿê`Ð Eg( Dg"5|ox|zNVÿþ@ÿþ|{%O~Nºâܹíÿügº  fØü`ì +gL -f|ÿÿî`> 0m® 9b¨SŒ`.;|ÿòNºý¸2-ÿòA mÿêf’mÿô“mÿê¹íÿüg^`ÿFCíÿè+Iÿø;|ÿö;|ÿè;|ÿò;|ÿôNºýp¹íÿüg5|ox|z|{%L~Nºâ02-ÿè -ÿÿîfDAÓmÿê` 2-ÿê’jR;AÿêCîÿò"<B‚&f6QÉÿø"<$< &)fQÉÿöB€"nÿü"€ nÿúgò#@`ê”�‚ <3�BéHH@ Bg6nD‚B&â‹"ƒ&)â“#CQÊÿî`B&)ã‹#C&ã“"ƒQÊÿî&ƒ€ƒ")B‚4-ÿêH ‚gÀ…ü 6HB BlB C C"nb CÿÞmxÅüÇüCúÐ BgAúÈÐÂ///(/N‘ "JCglAúÐÃ///(/N‘ "$BBHBèJ8< é¨è¨JCmB€ Bÿlø`DB€ BÿËoJBl4ÀDBB„â‰dxâˆdÁQÊÿîB‚Ò„Ñ‚B‚`$BBHBèJ8< é¨è¨ nÿúftBÿB Bÿlš Bÿèo°À8HDHA8HAçˆç‰çŒJBnBDBB„8B‚è¨e`"HA2HAHD0g€gâˆR‚eî€(<骀‚`€(<骀‚"nÿü"€ nÿúg#A -ÿÿðf"nÿüÑN^Nu5|rx <€ nÿúg <ðB�` 5|sxB€B�|€zNºßª`¦=Û|ßÙ×½»>. è&Ö•>EyŽâ0Œ:>z×òš¼¯I>°Æ÷ µí�>äøµˆãhñ?6âëC-?PbMÒñ©ü?„záG®{?¹™™™™™š?ð@$@Y@�@@È@øjA.„€AcÐA—ׄAÍÍeWUÜ/ôGÜk*} IpË èðX’h‹pæ+ ¥nÂøóa ¸ò°a® | Í ¤‘ë’àçÉî¼DSó®5‘õ´âé?]¢‚S¬ ù¹æh/ 䃑˜äBÝMç U aÖ©Áh~’N÷³ |ƒç­No"�™›úXÏ$£R›§Ñžº&¶~œ{n}(Ê/çj?”}*Þ|_{Ø„,ñ¾½õx²ù/¨rŸÃݼ1 �?syö3+ÿ.äŽ45@KÙ„™r7Rø¬Ma$9fé�5ž;y¶ª¬¦&=�îzJÔ¸?¡l&'wWœA´HKþëŸCÇœ¡ ’B#EÛ|ßÙ×½»7ð: _ <¯xµŒ@>)>Y9 Œê@=c)ñÃ\¦BQÅ~dšDcéääÂóDFw.ºÖÝÇ=HŠüïQðû_JŸk )YÇL²I­%”Ã|NÅJ0GÆ”ýPØÈÚÆ 4)RìÚb[-�UËpÒKsxW�5.P–®Y&ÂÔ%oüÁ[:REå¢Î]NØÓNTs_aôޝ#JÓatç××bYcˆU12k»eœT»’ãåg°}Eq$:iÃ24Þz×àkÖXã«yRmêýâÊéoþI@4çžTr üfЬjt$…ΞzWv7ä<ˆu‘xKÐ<�@inz`0…å>Y’|rØÜV¡4~…ðàGs~/2H@S@ØSAgQÈÿøSAü QÉÿú"NuHç@ 2H@€°AlÅHÁAÀSAS@± VÉÿúggÅH °"LßNuS@k"  VÈÿúgLßf Nu< ° NuLßDüNuHçÿNVLî(J€fJ�gÂJ‚fJƒg’(µ„/*.…ÿÿ‡ÿÿB@BBH@HB<<ðÀFÄF°Fgl´FgfJ@fB„Dfã�ã‰dÅD`ê�DÅJBfBDDfã�ã‹dÇD`ê”DÇÔ@/8<ã�ã‰dÅã�ã‹dÇQÌÿê8<HAHC $H@HBÌÀÈÂBFBDHFHDÜ„8ÈÅBDHDÜ„8ÈÇBDHDÜ„B„ÆÀÂÂÖ�dx"ÂÇÖ�d„܃d„ÎÀÊÂÞ…d(<*BEHEHGBGÞ†d„ÀÂЅЄ"� d€BC8<gD6<JDgâ‰âˆdÁSD`î$(/ÔCB?ðc B¿Ðb Bðj,`4DBBèŠ B5jJBg"â‰âˆdÁB`ìB€B�` Y�B� <ð` €HBBB€‚gÀ €€fJ�fB€Hî0N^LßÿP�NÐDCO1(' ***** DC OUTPUT MODULE TEST PROGRAM ****** ',A4)(' ')(' NON-EXISTANT TASK - ',A4)(' OPEN & OUTPUT TO EACH CHANNEL INDIVIDUALLY')(' CALL OPEN - ERROR')(' CALL OUT - ERROR')(' OPEN & OUTPUT TO EACH CHANNEL UNTIL ALL ARE ON')(' CLOSE CHANNELS, OUTPUTS SHOULD TURN OFF')(' TURN ON ALL OUTPUTS, THEN TURN OFF')(' PULSE EACH OUTPUT IN TURN')(' TRY COMMANDS WITH   CHANNELS CLOSED')(' CALL CLOSE AND CHANNELS CLOSED--OK')(' CALL CLOSE - ERROR')(' CALL OUT AND CHANNELS CLOSED--OK')(' CALL OUT - ERROR')(' CALL OFF AND CHANNELS CLOSED--OK')(' CALL OFF - ERROR')(' CALL STATUS AND CHANNELS CLOSED-OK')(' CALL STATUS - ERROR')(' CALL PULSE AND CHANNELS CLOSED--OK')(' CALL PULSE - ERROR')(' TRY CALL OPEN AND ALREADY OPENED')(' CALL OPEN AND CHANNELS ARE OPEN-OK')(' CALL OPEN - ERROR')('********* TEST COMPLETED **********')DCO2DCO2(' STATUS ERROR-BIT ',I1)(ÿÿÿÿZIO 'RIODRV TESTE LFŠŠ aaTESTRIO LF““aaTESTE LO”aaTESTRIO LO� aa=/*=/*†RIODRV.TESTE.LF=/*=/*=/IFC \1ƒ=ARG�RIODRV.TESTE.LL=/ENDIF=/*=LINK ,RIODRV.TESTE.LO,\1;MIXHS SEG SEG0:0 $0INPUT RIODRV.TESTE.ROEND=/*=ENDééééé  éé‚=/*=/*†RIODRV.TESTRIO.LF=/*G=/*†This�chain�file�will�generate�the�TESTRIO�test�program�load�module.=/*5=/*†The�command�line�will�accept�arguments�as�follows=/*7=/*‹Argument�01ˆ\1�=�Output�file�link�listing�or�device=/*D=/*†The�following�shows�the�link�chain�sequence.‚In�this�example�theF=/*†printer�was�chosen�as�Argument�1,�however,�the�user�could�if�he�so2=/*†desired�have�requested�an�output�listing�file.=/* =/*�=CHAIN�RIODRV.TESTRIO.LF�#PR=/*,=/*†Default�argument�01�is�RIODRV.TESTRIO.LL=/*=/IFC \1ƒ=ARG�RIODRV.TESTRIO.LL=/ENDIF=/*!=LINK ,RIODRV.TESTRIO.LO,\1;HAMIXSEG SEG0:0,1,8,14 $000000ATTRIBUTES D PINPUT RIODRV.TESTRIO.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééé‹TESTÿÿÿÿÿ€SEG0ÿÿÿÿÿÿMúÿþOîöB®ŒAîvCîb-I„pNAf*Aî�Cîª-I¤=|*¨p Enter one of the above... Time (in milliseconds) for output pulse > <<< Starting command >>> <<< Command done >>> *** START OUTPUT ON ABORTED *** -- *** TURN OUTPUT OFF ABORTED *** -- *** START OUTPUT PULSE ABORTED *** -- *** OPEN ABORTED *** -- *** ENABLE INTERRRUPT ABORTED *** -- *** DISABLE INTERRRUPT ABORTED *** -- *** READ STATUS ABORTED *** -- *** CLOSE ABORTED *** -- Error code returned in D0 = OúüIúûHAúý)HDAúý)HHAúülNBAúýð)HDAúþ)HHAúüVNBAúûà)H`Aúûà)HdAúü\NBAúûÊaŽ €m €o`º9@’9@¨Aúìã009@²9@¸9@¾9@š9@ Aúü¤)HDAúü³)HHAúûêNBAúü¦)HDAúü³)HHAúûÔNBAúü¦)HDAúüÍ)HHAúû¾NBAúüÀ)HDAúüà)HHAúû¨NBAúüÔ)HDAúüî)HHAúû’NBAúüâ)HDAúüé)HHAúû|NBAúý0)HDAúýF)HHAúûfNBAúúð)H`Aúúð)HdAúûlNBAúúÚaž @m @o`¾ fva˜Aúý4)HDAúýG)HHAúûNB0<aèAúûDCúûf!I1|pH?PUXK`GhGp<xG€FˆN�R˜J F¨I°J)INITREGS‚EQU„*’SAVE�FOR�INITIAL�REGISTERS ŠDS.Lƒ1’D0ŠDS.Lƒ1’D1=SESSION�NUMBERVOLNAM„DS.Lƒ1’D2=VOLUME�NAMEUSERNUMƒDS.Lƒ1’D3=USER�NUMBERCATNAM„DS.Lƒ1’D4=CATALOGUE�NAME ŠDS.Lƒ1’D5 ŠDS.Lƒ1’D6 ŠDS.Lƒ1’D7 ******************** VERSION MESSAGE ******************** /VMSGS…DC.Bƒ'ASCII�FILE�TRANSFER�-�VERSION�2.05' VMSGE…EQU„*-1ŠDS…0 ******************************** COMMAND LINE RECEIVING AREA ******************************** CLINE…COMLINE�$A0 * RETURN REGISTERS FROM PARSE 1PARSAREG‚DS.Lƒ1’A1�-�ADDRESS�OF�OUTPUT�FIELD�OR�0*ŠDS.Lƒ1’A2�-�ADDRESS�OF�OPTIONS�FIELD�OR�0  * PREAMBLE VARIABLES #COMOPT„DS.Bƒ1’COMMUNICATIONS�OPTION)CHROPT„DS.Bƒ1’CHARACTER�CONVERSION�OPTION,CHRBLK„DC.Lƒ0’NUMBER�OF�CHARACTERS�PER�BLOCK+BLKSUM„DC.Lƒ0’NUMBER�OF�BLOCKS�PER�CHECKSUM +BLKRED„DC.Lƒ0’RUNNING�NUMBER�OF�BLOCKS�READ%WBUF†DS.Lƒ1’ADDRESS�OF�WORKING�BUFFER,WLGH†DC.Lƒ0’LENGTH�OF�DATA�IN�WORKING�BUFFER,CHRNUM„DC.Lƒ0’NUMBER�OF�CHARACTERS�PER�FRAME%BLKCMAXƒDS.Lƒ1’LIMIT�ADDRESS�OF�FRAME0DPSAV…DS.Lƒ14‘SAVE�RGISTERS�FOR�DOWNLOAD�PROCESS,RESPONSE‚DC.Bƒ'‚'�RESPONSE�(ACK/NAK)�TO�HOST ŠDC.Bƒ$0DŠDS…0 DLTEMP„DS.Lƒ1’TEMPORARY*BBOUNDSƒDS.Lƒ2’BUFFER�BOUNDARIES�ON�UPLOAD3UREC1…DS.Lƒ1’ADDRESS�OF�1ST�REC�IN�FRAME�FOR�UPLOAD4USAVCHRƒDS.Wƒ1’SAVE�FOR�CHR�REPLACED�BY�CR�IN�UPLOAD)BCHR†DS.Wƒ1’SAVE�FOR�COMPRESSED�CHARACTER * OPTIONS EQUATES AND FLAG WORD "B‰EQU„0’1=TRUNCATE�TRAILING�BLANKSC‰EQU„1’1=USE�CHECKSUMS*D‰EQU„2’1=DISPLAY�DATA�AS�IT�IS�TRANSFEREDH‰EQU„3’1=HALF�DUPLEX�MODE%R‰EQU„4’1=C/R�TO�BE�ADDED�AFTER�BLOCK OPTFLG„DC.Bƒ(1< TO TERMINATE PROGRAM'TRANME„EQU„*-1ŠDS…0 *********************** TRANSP„EQU„************************ 6* SET UP SERVICE ADDRESSES IN VARIOUS PARAMETER BLOCKS ŠLEA„HOSTIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„TERMIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)ŠLEA„TIMEV-A(A6),A0ŠMOVE.L�A0,TSVC-A(A6) ŠLEA„TRANMS-A(A6),A1ŠLEA„TRANME-A(A6),A2)ŠBSR„MSGOUT�TELL�THEM�OF�TRANSPARENT�MODE  >* PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT AND HOST PORT 1ŠBTSTƒ#H,OPTFLG-A(A6)„ARE�WE�IN�HALF�DUPLEX�MODE?ŠBNE.S‚TRANS04ŒBRANCH�IF�YES-ŠBSR„INPP5C�INPUT�ONE�CHARACTER�FROM�TERMINALŠBRA.S‚TRANS05.TRANS04ƒBSR„INPP5ŽINPUT�ONE�LINE�FROM�TERMINALTRANS05ƒBSR„INPP1ŽHOST�PORT  !*********************************!* ENABLE ASQ AND WAIT FOR EVENT *!********************************* TRANSRTN‚EQU„*4ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�CURRENT�STACK�POINTER!ŠMOVE.L�#WTEVNT,D0‰ENABLE�ASQ,ASRŠTRAPƒ#1  J* IN CASE OF TIMEOUT EVENT, PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT)*ƒAND�GO�BACK�AND�WAIT�FOR�ANOTHER�EVENT. TIMEV…EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTER ŠBSR„ASQREAD%ŠLEA„TIM1-A(A6),A0†ADDR�OF�TIMER�P.B.&ŠCLR.W‚8(A0)ŽCLEAR�PERIODIC�ACTIVATIONŠMOVE.L�#RQSTPA,D0ŠTRAPƒ#12ŠBTSTƒ#TBSY,TRANFLG-A(A6)�IS�TERMINAL�BUFFER�BUSY?5ŠBNE„TRANS48ŒBRANCH�IF�YES�-�QUEUE�ANOTHER�TIME�EVENT.ŠBTSTƒ#H,OPTFLG-A(A6)„NO�-�IS�HALF�DUPLEX�SET?ŠBNE.S‚TRANS07ŒBRANCH�IF�YES-ŠBSR„INPP5C�ONPUT�ONE�CHARACTER�FROM�TERMINALŠBRA.S‚TRANS09.TRANS07ƒBSR„INPP5ŽINPUT�ONE�LINE�FROM�TERMINALTRANS09ƒBRA„TRANSRTN  '* IN CASE OF BREAK EVENT, TERMINATE !!! BREAKSVƒEQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTER(BREAKSV2‚BSR„HALT1ŽHALT�I/O�ON�HOST�PORTŠBEQ.S‚BREAKSV2BREAKSV4‚BSR„HALT5ŠBEQ.S‚BREAKSV4ŠBRA„XFRTERMŒGO�TERMINATEŠPAGE *******************************************)*�EVENT�WAS�I/O�COMPLETION�ON�HOST�PORT‚********************************************  HOSTIO„EQU„*7ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�CURRENT�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS1H-A(A6),A0ŠBSR„HLTCHK�CHECK�FOR�HALT�I/OŠBEQ„TRANSRTN‹BRANCH�IF�YES ŠLEA„IOS1-A(A6),A0ŠCMP.B‚#$EA,4(A0)(ŠBEQ.S‚TRANS12ŒDON'T�COMPLAIN�ON�OVERRUN ŠBSR„IOERCHKŒCHECK�FOR�I/O�ERROR3TRANS12ƒCMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ.S‚TRANS55ŒBRANCH�IF�YES  3* EVENT WAS FROM INPUT OR OUTPUT WITH INPUT REQUEST /ŠBTSTƒ#2,IOS1+1-A(A6)„WAS�IT�OUTPUT�WITH�INPUT?ŠBEQ.S‚TRANS16ŒBRANCH�IF�NO;ŠMOVE.L�IOS1+8-A(A6),IOS1+12-A(A6)�CORRECT�STARTING�ADDRESS9TRANS16ƒBTSTƒ#TBSY,TRANFLG-A(A6)�IS�TERMINAL�BUFFER�FREE?ŠBEQ.S‚TRANS20ŒBRANCH�IF�YES7ŠBSETƒ#TPND,TRANFLG-A(A6)�SET�TERMINAL�I/O�PENDING�FLAGŠBRA„TRANSRTN‹RETURN�FROM�EVENT   1TRANS20ƒLEA„TBUF-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO0ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�OUTPUT�BUFFERŠBSR„PREACHKŒSEE�IF�'PREAMBLE'ŠBEQ„TRANNXTŒBRANCH�IF�YES)ŠBSR„INPP1ŽINPUT�AND�PROCEED�ON�HOST�PORT6ŠTST.L‚TERMLGH-A(A6)†LENGTH�OF�DATA�IN�TERMINAL�BUFFER*ŠBEQ.S‚TRANS52ŒBRANCH�IF�NO�DATA�TO�OUTPUTŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL7ŠBSETƒ#TBSY,TRANFLG-A(A6)�MARK�TERMINAL�BUFFER�NOT�FREE7ŠBTSTƒ#TIN,TRANFLG-A(A6)�ARE�WE�IN�TERMINAL�INPUT�MODE?ŠBNE.S‚TRANS50ŒBRANCH�IF�YES*ŠBSR„OUTP5F�OUTPUT�AND�PROCEED�TO�TERMINAL  =* SET TIMER TO ACTIVATE US A LITTLE LATER ONLY IF NOT ECHOING /TRANS48ƒLEA„TIM1-A(A6),A0†TIMER�PARAMETER�BLOCK;ŠMOVE.W�#$7000,8(A0)‡INTERVAL�ACTIVATION�AT�SPC.�SVC.�ADDR.ŠMOVE.L�#RQSTPA,D0ŠTRAPƒ#1 ŠBSR„XFRABORT+ŠBRA.S‚TRANS52ŒGO�RETURN�FROM�EVENT�SERVICE  * OUTPUT TO TERMINAL (IMAGE) /TRANS50ƒBSR„OUTW5I�OUTPUT�CHARACTER�TO�TERMINAL2ŠBCLRƒ#TBSY,TRANFLG-A(A6)�CLEAR�TERMINAL�BUSY�FLAG<ŠTST.W‚IOS5H+28-A(A6)…WAS�ANY�ACTIVE�I/O�HALTED�ON�TERMINAL?9ŠBEQ.S‚TRANS52ŒBRANCH�IF�NO�-�HAVE�I/O�COMPLETION�ALREADY,ŠBSR„INPP5C�YES�SO�TAKE�IN�ANOTHER�CHARACTERTRANS52ƒBRA„TRANSRTN  (* EVENT WAS OUTPUT COMPLETE TO HOST PORT -TRANS55ƒBSR„INPP1ŽINPUT�AND�PROCEED�FROM�HOST ŠBRA„TRANSRTNŠPAGE .**********************************************-*�EVENT�WAS�I/O�COMPLETION�ON�TERMINAL�PORT‚*.**********************************************  TERMIO„EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„TRANSRTN‹BRANCH�IF�YES  ŠLEA„IOS5-A(A6),A0 ŠBSR„IOERCHK,ŠCMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ.S‚TRANS80ŒBRANCH�IF�YES  -* EVENT WAS INPUT COMPLETION ON TERMINAL PORT 3ŠBTSTƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL-A�MODE?ŠBNE.S‚TRANS63ŒBRANCH�IF�YES1ŠCMP.B‚#CNTL.A,BUFF5S-A(A6)�WAS�THIS�A�CONTROL�A?ŠBNE.S‚TRANS60ŒBRANCH�IF�NO1ŠBSETƒ#CTLA,TRANFLG-A(A6)�SET�CONTROL�A�MODE�FLAGŠBRA.S‚TRANS637TRANS60ƒBSETƒ#TIN,TRANFLG-A(A6)�SET�TERMINAL�INPUT�FLAG ŠBSR„HALT1ŽHALT�I/O�ON�HOST�PORT0TRANS63ƒBTSTƒ#H,OPTFLG-A(A6)„IS�HALF�DUPLEX�SET?+ŠBNE.S‚TRANS70ŒYES�-�GO�OUTPUT�LINE�TO�HOST7ŠCMP.B‚#$0D,BUFF5S-A(A6)‚WAS�A�CARRIAGE�RETURN�ENTERED?ŠBEQ.S‚TRANS70ŒBRANCH�IF�YES2ŠBTSTƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL-A�MODEŠBNE.S‚TRANS66ŒBRANCH�IF�YES4ŠBSR„OIP1CŽNO�SO�GIVE�HOST�CHAR�ON�OUTPUT�WITH�INPUT.TRANS66ƒBSR„INPP5C�ASK�FOR�NEXT�TERMINAL�INPUTŠBRA.S‚TRANS88  :TRANS70ƒBCLRƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL�A�MODE?)ŠBNE„BREAKSVŒBRANCH�IF�YES�-�GO�TERMINATE(ŠBSR„OIP15ŽOUTPUT�THE�LINE�OR�CR�TO�HOSTŠBCLRƒ#TIN,TRANFLG-A(A6) ŠBRA„TRANS48  .* EVENT WAS OUTPUT COMPLETION ON TERMINAL PORT 5TRANS80ƒBTSTƒ#TPND,TRANFLG-A(A6)�IS�PENDING�FLAG�SET?ŠBNE.S‚TRANS86ŒBRANCH�IF�YES8ŠBCLRƒ#TBSY,TRANFLG-A(A6)�NO�SO�CLEAR�TERMINAL�BUSY�FLAGŠBRA.S‚TRANS88 1TRANS86ƒLEA„TBUF-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO)ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�BUFFERŠBSR„PREACHKŒSEE�IF�'PREAMBLE'ŠBEQ.S‚TRANNXTŒBRANCH�IF�YES$ŠBSR„INPP1ŽINPUT�AND�PROCEED�ON�HOST*ŠBSR„OUTP5F�OUTPUT�AND�PROCEED�TO�TERMINAL,ŠBCLRƒ#TPND,TRANFLG-A(A6)�CLEAR�PENDING�FLAGTRANS88ƒBRA„TRANSRTNŠPAGE 6******************************************************3*�TRANNXT�IS�BRANCHED�TO�AFTER�READING�'PREAMBLE'„*1*ƒFROM�THE�HOST.‚HALTS�ALL�I/O�ON�LU�1�AND�LU�5ƒ*1*ƒUNITS,�DELAYS�2�SECONDS,�READS�THE�ASQ�OF�ALL„* *ƒEVENTS,�AND�PERFORMS�AN�RTS.•*6******************************************************  TRANNXTƒEQU„* ŠBSR„HALT1ŽHALT�I/O�ON�HOST�PORTŠBEQ.S‚TRANNXT,TRANNXT2‚BSR„HALT5ŽHALT�I/O�ON�TERMINAL�PORTŠBEQ.S‚TRANNXT2ŠMOVE.L�#DELAY,D0ŠMOVE.L�#2000,A0ŠTRAPƒ#1‘DELAY�2�SECONDSTRANNXT4‚BSR„ASQREADŒFLUSH�ASQŠTST.B‚ASQBUFF-A(A6) ŠBNE„TRANNXT4.ŠCLR.W‚IOS1H+28-A(A6)…INDICATE�HALT�EVENT�READ.ŠCLR.W‚IOS5H+28-A(A6)…INDICATE�HALT�EVENT�READŠRTSŠPAGE  %*************************************%* INITIATE UPLOAD/DOWNLOAD SEQUENCE *%*************************************  UPDN†EQU„*   (* INITIALIZE VARIABLES FROM THE PREAMBLE 8ŠMOVE.B�TBUF+9-A(A6),COMOPT-A(A6)�COM�OPTION/CHAR�OPTION9ŠMOVE.B�TBUF+10-A(A6),CHROPT-A(A6)�CHAR�CONVERSION�OPTION2ŠLEA„TBUF+11-A(A6),A1ƒADDRESS�OF�CHARS/BLOCK�FIELDŠMOVE.L�#3,D1Ž#CHARS�IN�FIELD"ŠBSR„ASCDBINŒBINARY�TO�ASCII�IN�D06ŠMOVE.W�D0,CHRBLK+2-A(A6)‚SET�UP�NUMBER�OF�CHARS/BLOCK7ŠLEA„TBUF+14-A(A6),A1ƒADDRESS�OF�#BLOCKS/CHECKSUM�FIELDŠMOVE.L�#1,D1Ž#CHARS�IN�FIELD"ŠBSR„ASCDBINŒBINARY�TO�ASCII�IN�D0:ŠMOVE.W�D0,BLKSUM+2-A(A6)‚SET�UP�NUMBER�OF�BLOCKS/CHECKSUMŠMULUƒCHRBLK+2-A(A6),D06ŠMOVE.L�D0,CHRNUM-A(A6)„NUMBER�OF�CHARACTERS�PER�FRAMEŠLEA„TBUF-A(A6),A0 ŠADD.L‚A0,D0.ŠSUB.L‚#1,D0ŽFRAME�LIMIT�ADDRESS�OFF�FROM�TBUFŠMOVE.L�D0,BLKCMAX-A(A6) * CLOSE ANY ASSIGNMENT TO LU 4 ŠLEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3 * INITIALIZE FRAME VARIABLES ŠBSR„DLINITF ŠCLR.W‚TRANFLG-A(A6)ŠBTSTƒ#B,OPTFLG-A(A6) ŠBEQ.S‚UPDN10=ŠMOVE.B�#'B',RESPONSE+1-A(A6)‚FLAG�TRAILING�BLANK�SUPPRESSION  /* BRANCH TO APPROPRIATE UPLOAD/DOWNLOAD ROUTINE UPDN10„CMP.B‚#'U',TBUF+8-A(A6) ŠBEQ„UPLOADŠCMP.B‚#'D',TBUF+8-A(A6) ŠBEQ„DOWNLOAD ŠBSR„XFRABORTŠPAGE ********************** DOWNLOAD SEQUENCE **********************  !DLOADMSƒDC.Bƒ'DOWNLOAD�INITIATED'DLOADMEƒEQU„*-1ŠDS…0  JREVMS DC.B 'ENTER RECEIVING FILE NAME OR ''Q'' TO RESUME TRANSPARENT MODE' REVME…EQU„*-1ŠDS…0  RDONS…DC.Bƒ'RECORD�DISPLAY�ON' RDONE…EQU„*-1ŠDS…0  RDOFS…DC.Bƒ'RECORD�DISPLAY�OFF' RDOFE…EQU„*-1ŠDS…0  "BADCCS„DC.Bƒ'BAD�CHARACTER�COUNT‚'BADCCR„DC.Bƒ'…RECEIVED�'(BADCCT„DC.Bƒ'…EXPECTED�-�RETRANSMITTING'BADCCE„EQU„*-1ŠDS…0  BADCSS„DC.Bƒ'BAD�CHECKSUMƒ'BADCSR„DC.Bƒ'…RECEIVED�'(BADCST„DC.Bƒ'…EXPECTED‚-�RETRANSMITTING'BADCSE„EQU„*-1ŠDS…0  4DTERMS„DC.Bƒ'DOWNLOAD�TERMINATED�WITH�''T''�KEY-IN�'(DTERMN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'DTERME„EQU„*-1ŠDS…0  !DDONES„DC.Bƒ'DOWNLOAD�COMPLETED‚'(DDONEN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'DDONEE„EQU„*-1ŠDS…0  BFORCMS„DC.Bƒ'**************�FORCING�CHECKSUM�MATCH�**************'FORCME„EQU„*-1ŠDS…0ŠPAGE ***************************‚DOWNLOADING‚ROUTINE‚***************************  7DOWNLOAD‚LEA„REVMS-A(A6),A1…ASK�FOR�RECEIVING�FILE�NAMEŠLEA„REVME-A(A6),A2 ŠBSR„MSGOUT*ŠBSR„INPW5ŽTAKE�THE�INPUT�(INPUT�AND�WAIT)0ŠBSR„SBARGŽCONVERT�FILENAME�TO�UPPER�CASE�111484 (ŠBSR„ASGFLD�GO�ASSIGN�THE�FILE�TO�LUN�#4&ŠBEQ.S‚DL00�BRANCH�IF�'Q'�NOT�KEYED�IN*ŠMOVE.B�#'T',D0ŒTERMINATION�ACKNOWLEDGMENT!ŠBSR„RESPOND2‹SEND�IT�TO�THE�HOST ŠBRA„QUITUPDN  DL00†BSR„LF65ŠLEA„DLOADMS-A(A6),A1ƒTELL�THEM�DOWNLOAD�IS�INITIATEDŠLEA„DLOADME-A(A6),A2 ŠBSR„MSGOUT *ŠBSR„IMSG�TELL�THEM�OF�INTERACTIVE�OPTIONS.ŠCLR.L‚IOS4+8-A(A6)‡CLEAR�RANDOM�RECORD�NUMBER  2* PLACE COMPLETION ADDRESSES INTO PARAMETER BLOCKS ŠLEA„DHIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„DTIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)  !* INITIALIZE RECORD POINTERS ETC. ŠLEA„RBUF-A(A6),A06ŠMOVE.L�A0,RPTR-A(A6)†INITIALIZE�RECORD�BUFFER�POINTERŠLEA„DPIN-A(A6),A0>ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�PROCESSING�INPUT�ADDRESS 2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL02�BRANCH�IF�NO ŠBSR„WAITDC1 DL02†MOVE.B�#'N',D0.ŠBSR„RESPOND1‹RESPOND�TO�PREAMBLE�WITH�'NEXT?')ŠBSR„INPP5C�INPUT�AND�PROCEED�ON�TERMINAL  ********************�WAIT�FOR�EVENT‚********************  DLWAIT„EQU„*,ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�STACK�POINTERŠMOVE.L�#WTEVNT,D0(ŠTRAPƒ#1‘WAIT�FOR�HOST�OR�TERMINAL�INPUTŠPAGE ,********************************************+*�EVENT�WAS�I/O�COMPLETION�FROM�HOST�PORT‚*,********************************************  DHIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS1H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„DLWAIT�BRANCH�IF�YES ŠLEA„IOS1-A(A6),A0+ŠCMP.B‚#$EA,4(A0)‰DON'T�COMPLAIN�ON�OVERRUN ŠBEQ.S‚DL10 ŠBSR„IOERCHKŒCHECK�FOR�I/O�ERROR 0DL10†CMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ„DL500ŽBRANCH�IF�YES  )* EVENT WAS INPUT COMPLETION ON HOST PORT /ŠBTSTƒ#2,IOS1+1-A(A6)„WAS�IT�OUTPUT�WITH�INPUT?ŠBEQ.S‚DL40�BRANCH�IF�NO;ŠMOVE.L�IOS1+8-A(A6),IOS1+12-A(A6)�CORRECT�STARTING�ADDRESS/ŠBTSTƒ#H,OPTFLG-A(A6)„IS�THIS�JUST�AN�ACK�ECHO?,ŠBEQ.S‚DL45�BRANCH�IF�YES,�PUT�UP�READ�AGAIN DL40†LEA„TBUF-A(A6),A3,ŠADD.L‚WLGH-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO)ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�BUFFER5ŠADD.L‚#1,BLKRED-A(A6)„BUMP�#BLOCKS�READ�FOR�CHECKSUMŠMOVE.L�TERMLGH-A(A6),D0ŠLEA„TBUF-A(A6),A2?ŠADD.L‚WLGH-A(A6),A2†POINT�A2�TO�FIRST�BYTE�OF�LAST�MOVED�BLOCK 6DL42†CMP.L‚CHRBLK-A(A6),D0„DID�WE�FILL�THE�FULL�BLOCK?ŠBHS.S‚DL43�BRANCH�IF�YES0ŠMOVE.B�#'�',0(A2,D0)†FORCE�BLANKS�TO�FULL�BLOCK ŠADD.L‚#1,D0 ŠBRA„DL42 DL43†ADD.L‚WLGH-A(A6),A27ŠADD.L‚D0,WLGH-A(A6)†BUMP�DATA�LENGTH�IN�WORKING�BUFFERŠMOVE.L�BLKRED-A(A6),D0ŠCMP.L‚BLKSUM-A(A6),D0'ŠBHS.S‚DL60�BRANCH�IF�ENTIRE�FRAME�READ !DL45†BSR„INPP1ŽREAD�ANOTHER�BLOCKŠBRA„DLWAIT�GO�WAIT�FOR�EVENT  J* ENTIRE FRAME HAS BEEN RECEIVED - IF TERMINATE HAS BEEN KEYED IN, GET OUT 9DL60†BTSTƒ#TFLG,TRANFLG-A(A6)�HAS�TERMINATE�BEEN�KEYED�INŠBEQ.S‚DL90�BRANCH�IF�NO 2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL62�BRANCH�IF�NO ŠBSR„WAITDC1 DL62†MOVE.B�#'T',D0-ŠBSR„RESPOND2‹RESPOND�WITH�OUTPUT�AND�PROCEED ŠBRA„DLWAIT  A*�NO�TERMINATION�YET�-�VALIDATE�CHECKSUM.‚IF�BAD�CHECKSUM�ASK�FOR* RETRANSMISSION ?DL90†MOVE.L�CHRNUM-A(A6),D0„NUMBER�OF�CHARACTERS�WE�SHOULD�HAVEŠCMP.L‚WLGH-A(A6),D0)ŠBEQ.S‚DL100ŽBRANCH�IF�CHARACTER�COUNT�OK-ŠMOVE.L�#4,D1ŽCOMPLAIN�ON�BAD�CHARACTER�COUNTŠLEA„BADCCT-A(A6),A0-ŠBSR„BINDASCŒCONVERT�EXPECTED�CHARACTER�COUNTŠMOVE.L�WLGH-A(A6),D0ŠLEA„BADCCR-A(A6),A0-ŠBSR„BINDASCŒCONVERT�RECEIVED�CHARACTER�COUNTŠBSR„LF6ŠLEA„BADCCS-A(A6),A1ŠLEA„BADCCE-A(A6),A2*ŠBSR„MOUT�TELL�THEM�OF�BAD�CHARACTER�COUNT DL95†EQU„*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL97�BRANCH�IF�NO ŠBSR„WAITDC1 #DL97†MOVE.L�#DELAY,D0ŠWAIT�A�SECONDŠMOVE.L�#1000,A0ŠTRAPƒ#1ŠMOVE.B�#'R',D0)ŠBSR„RESPOND1‹RESPOND�/�OUTPUT�WITH�INPUT'ŠBSR„DLINITFŒINITIALIZE�FRAME�VARIABLES ŠBRA„DLWAIT 2DL100…BTSTƒ#C,OPTFLG-A(A6)„IS�CHECKSUM�OPTION�SET?ŠBEQ.S‚DL130ŽBRANCH�IF�NO'ŠLEA„TBUF-A(A6),A1†POINT�A1�TO�CHECKSUM.ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�IN�CHECKSUMŠBSR„ASCHBINŒCONVERT�TO�ASCIIŠTST.W‚D0‘IS�CHECKSUM�WILD?'ŠBEQ.S‚DL130ŽBRANCH�IF�YES�(0�CHECKSUM)3ŠMOVE.W�D0,-(A7)‹SAVE�CHECKSUM�FOR�LATER�COMPARISON6ŠLEA„TBUF+2-A(A6),A1„WHERE�TO�BEGIN�COMPUTING�CHECKSUM ŠMOVE.L�A1,A2ŠADD.L‚WLGH-A(A6),A2!ŠSUB.L‚#2,A2ŽEND�OF�DATA�+�1�BYTE ŠCLR.L‚D0 ŠCLR.L‚D1 6DL110…MOVE.B�(A1)+,D1‹ACCUMULATE�CHECKSUM�IN�THIS�LOOP ŠADD.L‚D1,D0 ŠCMP.L‚A1,A2-ŠBNE.S‚DL110ŽBRANCH�IF�MORE�CHARACTERS�TO�SUM ŠDIVUƒ#255,D0 ŠCLR.W‚D0ŠSWAPƒD0‘SUM�MOD�255�IN�D0.W$ŠADD.W‚#1,D0ŽINSURE�NONZERO�CHECKSUM ŠCLR.L‚D20ŠMOVE.W�(A7)+,D2‹CHECKSUM�SENT�FROM�OTHER�SYSTEMŠCMP.W‚D0,D2ŽSEE�IF�IT�MATCHESŠBEQ.S‚DL130ŽBRANCH�ON�MATCH+ŠBSR„NAKRPT�SEE�IF�RETRY�COUNT�IS�EXHAUSTEDŠBNE.S‚DL115ŽBRANCH�IF�NO-ŠLEA„FORCMS-A(A6),A1„TELL�OF�FORCING�CHECKSUMŠLEA„FORCME-A(A6),A2 ŠBSR„MOUT ŠBRA.S‚DL130 0DL115…MOVE.L�#4,D1ŽCOMPLAIN�ON�CHECKSUM�MISMATCHŠLEA„BADCST-A(A6),A0 ŠBSR„BINDASC ŠMOVE.L�D2,D0ŠLEA„BADCSR-A(A6),A0 ŠBSR„BINDASCŠBSR„LF6ŠLEA„BADCSS-A(A6),A1ŠLEA„BADCSE-A(A6),A2%ŠBSR„MOUT�PUT�UP�BAD�CHECKSUM�MESSAGE$ŠBRA„DL95�GO�TELL�THEM�TO�RETRANSMIT  (* CHECKSUM MATCHES - GO PROCESS THE DATA ?DL130…MOVE.L�REP2-A(A6),REP1-A(A6)�RESET�CHECKSUM�RETRY�COUNTERŠLEA„TBUF-A(A6),A0%ŠADD.L‚#3,A0ŽBYPASS�CHAR�AND�CHECKSUM,ŠMOVE.L�A0,TPTR-A(A6)†SAVE�POINTER�INTO�TBUFŠBSR„DPROCESS‹PROCESS�THE�DATAŠBEQ.S‚DL140ŽBRANCH�IF�DONE  ,* COME HERE FOR FRAME PROCESSED SUCCESSFULLY 6ŠCMP.B‚#'Z',TBUF+2-A(A6)‚HAS�THE�LAST�FRAME�BEEN�READ?ŠBEQ.S‚DL140ŽBRANCH�IF�YES 2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL138ŽBRANCH�IF�NO ŠBSR„WAITDC1  DL138…MOVE.B�#'N',D0)ŠBSR„RESPOND1‹RESPOND�/�OUTPUT�WITH�INPUT&ŠBSR„DLINITFŒINITIALIZE�FOR�NEXT�FRAMEŠBRA„DLWAIT�GO�WAIT�FOR�NEXT  DL140…EQU„*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL148ŽBRANCH�IF�NO ŠBSR„WAITDC1 DL148…MOVE.B�#'T',D0-ŠBSR„RESPOND2‹RESPOND�WITH�OUTPUT�AND�PROCEED ŠBRA„DLWAIT  (* EVENT WAS OUTPUT COMPLETE ON HOST PORT DL500…EQU„*ŠBTSTƒ#TFLG,TRANFLG-A(A6)+ŠBNE.S‚DL550ŽBRANCH�IF�''T''�KEYIN�FLAG�SET * NORMAL TERMINATION )ŠMOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„DDONEN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6)ŠLEA„DDONES-A(A6),A1„'DOWNLOAD�COMPLETED'ŠLEA„DDONEE-A(A6),A2 ŠBSR„MOUT ŠBRA„QUITUPDN  * TERMINATED BT 'T' KEYIN .DL550…MOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„DTERMN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6:ŠLEA„DTERMS-A(A6),A1„'DOWNLOAD�TERMINATED�WITH�'T'�KEY-IN'ŠLEA„DTERME-A(A6),A2 ŠBSR„MOUT ŠBRA„QUITUPDNŠPAGE )*****************************************(*�EVENT�WAS�I/O�COMPLETION�ON�TERMINAL‚*)*****************************************  DTIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„TRANSRTN‹BRANCH�IF�YES ŠMOVE.B�BUFF5S-A(A6),D0ŠCMP.B‚#'T',D0'ŠBNE.S‚DL700ŽBRANCH�IF�NOT�A�'T'�KEY�IN-ŠBSETƒ#TFLG,TRANFLG-A(A6)�YES�-�FLAG�THE�FACT ŠBRA.S‚DL800 .DL700…CMP.B‚#'D',D0ŒWAS�KEYIN�A�'D'�(DISPLAY)? ŠBNE.S‚DL800)ŠBCHGƒ#D,OPTFLG-A(A6)„CHANGE�DISPLAY�FLAG1ŠBEQ.S‚DL750ŽBRANCH�IF�DISPLAY�WAS�PREVIOUSLY�OFFŠBSR„LF61ŠLEA„RDOFS-A(A6),A1…PUT�OUT�'DISPLAY�OFF�MESSAGE'ŠLEA„RDOFE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚DL800 DL750…BSR„LF60ŠLEA„RDONS-A(A6),A1…PUT�OUT�'DISPLAY�ON�MESSAGE'ŠLEA„RDONE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 *DL800…BSR„INPP5C�TAKE�ANOTHER�CHARACTER�IN ŠBRA„DLWAITŠPAGE 2**************************************************0*�DLINITF�INITIALIZES�VARIABLES�IN�PREPARATIONƒ**‹FOR�READING�NEXT�FRAME�*2************************************************** 6DLINITFƒCLR.L‚BLKRED-A(A6)‡CLEAR�NUMBER�OF�BLOCKS�READ,ŠLEA„TBUF-A(A6),A0†ADDRESS�OF�WORKING�BUFFER/ŠMOVE.L�A0,WBUF-A(A6)†ADDRESS�IN�WORKING�BUFFER'ŠCLR.L‚WLGH-A(A6)‰CLEAR�LENGTH�OF�FRAMEŠRTS   9*********************************************************+*�DPROCESS�PROCESSES�THE�FRAME�JUST�READ.�**ƒEXIT�CONDITION�CODES�ARE:›*7*ƒEQUAL�-�FRAME�PROCESSING�OK�(LAST�RECORD�PROCESSED)�*0*ƒPLUS‚-�FRAME�PROCESSING�OK�(NOT�LAST�RECORD)‡*9*********************************************************  DPROCESS‚EQU„*=ŠMOVEM.L�DPSAV-A(A6),D0-D7/A0-A5�PICK�UP�RESUME�REGISTERS�...ŠJMP„(A0)�...�AND�GO�THERE&DPIN†BSR„GETCHR�GET�1ST�CHAR�OF�LENGTH)ŠBEQ.S‚DL910ŽBRANCH�ON�CHARACTER�OBTAINED%ŠLEA„DPIN-A(A6),A0†NEED�ANOTHER�BLOCK6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERSŠBRA„DPEXOK�TAKE�OK�EXIT *DL910…CMP.B‚#'�',D0ŒSEE�IF�NO�MORE�RECORDS&ŠBEQ„DPEXENDŒBRANCH�IF�NO�MORE�RECORDS/ŠMOVE.B�D0,DLTEMP-A(A6)„SAVE�CHARACTER�OBTAINED 'DL915…BSR„GETCHR�GET�2ND�CHAR�OF�LENGTH)ŠBEQ.S‚DL920ŽBRANCH�ON�CHARACTER�OBTAINED&ŠLEA„DL915-A(A6),A0…NEED�ANOTHER�BLOCK6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS ŠBRA„DPEXOK DL920…MOVE.B�D0,DLTEMP+1-A(A6)0ŠLEA„DLTEMP-A(A6),A1„CONVERT�ASCII�HEX�TO�BINARY-ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERT ŠBSR„ASCHBIN(ŠMOVE.L�D0,RLGH-A(A6)†SAVE�RECORD�LENGTH 4* MOVE RECORD FROM TBUF TO RBUF - EXPANDING AS WE GO +ŠLEA„RBUF-A(A6),A3†ADDRESS�OF�RECORD�BUFFER ŠCLR.L‚D3‘'GET'�RELATIVE�COUNTER4ŠMOVE.L�RPTR-A(A6),D2†D2�=�POINTER�INTO�'PUT'�BUFFER ŠSUB.L‚A3,D2 6DL951…CMP.L‚RLGH-A(A6),D3†SEE�IF�WE'VE�MOVED�ALL�CHARSŠBHS.S‚DL1000�BRANCH�IF�YES #DL960…BSR„GETCHR�GET�NEXT�CHARACTER*ŠBEQ.S‚DL962ŽBRANCH�IF�CHARACTER�AVAILABLE"ŠLEA„DL960-A(A6),A0…RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS !ŠBRA„DPEXOK�GO�EXIT�FOR�NEW�FRAME $DL962…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER.ŠCMP.B‚#'|',D0ŒIS�IT�THE�COMPRESSION�SENTINEL?ŠBNE.S‚DL980ŽBRANCH�IF�NO )DL964…BSR„GETCHR�GET�COMPRESSED�CHARACTER*ŠBEQ.S‚DL965ŽBRANCH�IF�CHARACTER�AVAILABLE&ŠLEA„DL964-A(A6),A0…GET�RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS)ŠBRA„DPEXOK�BRANCH�FOR�NEW�FRAME�REQUIRED $DL965…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER/ŠMOVE.B�D0,BCHR-A(A6)†SAVE�COMPRESSED�CHARACTER $DL966…BSR„GETCHR�GET�COUNT�CHARACTER*ŠBEQ.S‚DL968ŽBRANCH�IF�CHARACTER�AVAILABLE&ŠLEA„DL966-A(A6),A0…GET�RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS+ŠBRA.S‚DPEXOK�BRANCH�FOR�NEW�FRAME�REQUIRED $DL968…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER2ŠSUB.B‚#'0',D0ŒCONVERT�CODE�TO�BINARY�REPEAT�VALUE ŠCMP.L‚#9,D0 ŠBLS.S‚DL970ŽBRANCH�IF�RANGE�0-9ŠSUB.B‚#7,D0ŽRANGE�10-35 *DL970…TST.B‚D0‘ARE�WE�STILL�UNCOMPRESSING?ŠBEQ.S‚DL951ŽBRANCH�IF�NO0ŠSUB.L‚#1,D0ŽDECREMENT�REMAING�COMPRESSION�COUNT*ŠMOVE.B�BCHR-A(A6),0(A3,D2.L)�MOVE�TO�BUFF"ŠADD.L‚#1,D2ŽADVANCE�'PUT'�POINTER ŠBRA.S‚DL970 9DL980…MOVE.B�D0,0(A3,D2.L)†MOVE�'RAW'�DATA�BYTE�TO�BUFFER"ŠADD.L‚#1,D2ŽADVANCE�'PUT'�POINTER ŠBRA„DL951  '* OUTPUT RECORD TO DISK AND/OR TERMINAL (DL1000„TST.L‚D2‘TEST�UNCOMPRESSED�LENGTH"ŠBHI.S‚DL1005�BRANCH�IF�LENGTH�>�0-ŠMOVE.L�#1,D2ŽIF�NOT�THEN�FORCE�LENGTH�OF�ONE$ŠMOVE.B�#'�',(A3)ŠFOR�A�BLANK�RECORD 4DL1005„MOVE.L�A3,RPTR-A(A6)†SET�POINTER�BACK�TO�RBUF2ŠLEA„IOS4-A(A6),A0†ADDRESS�OF�DISK�PARAMETER�BLOCK ŠMOVE.L�A3,12(A0)ŠBUFFER�ADDRESS$ŠADD.L‚D2,A3ŽADD�UNCOMPRESSED�LENGTH'ŠSUB.L‚#1,A3ŽPOINT�A3�TO�LAST�CHARACTER'ŠMOVE.L�A3,16(A0)ŠENDING�BUFFER�ADDRESSŠMOVE.L�#$00026028,(A0)ŠTRAPƒ#2‘OUTPUT�TO�DISK ŠBEQ.S‚DL1010�BRANCH�ON�GOOD�I/O ŠMOVE.L�D0,-(A7)‹SAVE�ERROR�CODEŠBSR„HALT5ŽHALT�THE�I/OŠMOVE.L�(A7)+,D0$ŠBSR„IOSERR�COMPLAIN�OF�BAD�DISK�I/O$ŠBRA„XABORT�ERROR�ON�BAD�DISK�OUTPUT 6DL1010„ADD.L‚#1,IOS4+8-A(A6)„BUMP�RANDOM�RECORD�NUMBER4ŠBTSTƒ#D,OPTFLG-A(A6)„ARE�WE�TO�DISPLAY�TO�TERMINAL?ŠBEQ.S‚DL1020�BRANCH�IF�NOŠMOVEM.L�$C(A0),A1/A2ŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL"ŠBSR„MSGOUT�PUT�DATA�ONTO�TERMINAL"DL1020„BRA„DPIN�GO�FOR�NEXT�RECORD  1DPEXOK„MOVE.L�#1,D0ŽINDICATE�PLUS�CONDITION�CODES ŠBRA.S‚DPIO /DPEXENDƒCLR.L‚D0‘INDICATE�EQUAL�CONDITION�CODES +DPIO†MOVEƒD0,-(A7)‹SAVE�FOR�CONDITION�CODES,ŠCMP.B‚#$FF,IOS5+4-A(A6)‚IS�I/O�IN�PROGRESS?ŠBEQ.S‚DPRTSŽBRANCH�IF�YESŠBSR„INPP5C�NO�SO�REISSUE�INPUT+DPRTS…MOVEƒ(A7)+,D0‹RESTORE�CONDITION�CODESŠRTSŠPAGE .**********************************************'*�GETCHR�GETS�ONE�CHARACTER�FROM�TBUFˆ*)*ƒPOINTED�AT�BY�TPTR.‚IF�ALL�CHARACTERSƒ*(*ƒHAVE�BEEN�FETCHED,�UNEQUAL�CONDITION…*(*ƒCODES�ARE�RETURNED.‚OTHERWISE,�EQUAL„*(*ƒCONDITION�CODES�ARE�RETURNED�AND�THE…* *ƒCHARACTER�IS�RETURNED�IN�D0.�*.**********************************************  GETCHR„MOVE.L�TPTR-A(A6),A0ŠMOVE.B�(A0),D0ŠLEA„TBUF-A(A6),A1 ŠSUB.L‚A1,A0ŠCMP.L‚CHRNUM-A(A6),A0.ŠBHS.S‚GETCNO�BRANCH�IF�NO�CHARACTER�TO�RETURN+ŠADD.L‚#1,TPTR-A(A6)†ADVANCD�BUFFER�POINTER&ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠRTS/GETCNO„MOVE.L�#1,D0ŽSET�UNEQUAL�CONDITION�CODESŠRTSŠPAGE2**************************************************0*�IMSG�DISPLAYS�MESSAGE�EXPLAINING�INTERACTIVEƒ* *’OPTIONS.–*2**************************************************  JIM1S DC.B 'KEY IN ''T'' TO TERMINATE TRANSFER AND RESUME TRANSPARENT MODE' IM1E�EQU‚*-1…DSƒ0 /IM2S�DC.B�'‡''D''�TO�TOGGLE�THE�RECORD�DISPLAY' IM2E�EQU‚*-1…DSƒ0  IMSG†EQU„*ŠBSR„LF6�TWO�LINE�FEEDSŠLEA„IM1S-A(A6),A1ŠLEA„IM1E-A(A6),A2 ŠBSR„MSGOUTŠLEA„IM2S-A(A6),A1ŠLEA„IM2E-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6�TWO�LINE�FEEDSŠRTSŠPAGE %**************************************‰UPLOAD�SEQUENCE‹*%*************************************  ULOADMSƒDC.Bƒ'UPLOAD�INITIATED'ULOADMEƒEQU„*-1ŠDS…0  HSEVMS DC.B 'ENTER SENDING FILE NAME OR ''Q'' TO RESUME TRANSPARENT MODE' SEVME…EQU„*-1ŠDS…0  *NAKMS…DC.Bƒ'NAK�RECEIVED�-�RETRANSMITTING'  NAKME…EQU„*-1ŠDS…0  2UTERMS„DC.Bƒ'UPLOAD�TERMINATED�WITH�''T''�KEY-IN�'(UTERMN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'UTERME„EQU„*-1ŠDS…0  UDONES„DC.Bƒ'UPLOAD�COMPLETED‚'(UDONEN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'UDONEE„EQU„*-1ŠDS…0ŠPAGE *************************‚UPLOADING�ROUTINEƒ*************************  3UPLOAD„LEA„SEVMS-A(A6),A1…ASK�FOR�SENDING�FILE�NAMEŠLEA„SEVME-A(A6),A2 ŠBSR„MSGOUT2ŠBSR„INPW5ŽTAKE�SENDING�FILE�NAME�(INPUT�AND�WAIT)'ŠBSR„SBARGŽCONVERT�TO�UPPER�CASE�111484 ŠBSR„ASGFLU�ASSIGN�THE�FILE&ŠBEQ.S‚UL00�BRANCH�IF�'Q'�NOT�KEYED�IN*ŠMOVE.B�#'T',D0ŒTERMINATION�ACKNOWLEDGMENT!ŠBSR„RESPOND2‹SEND�IT�TO�THE�HOST ŠBRA„QUITUPDN UL00†BSR„LF63ŠLEA„ULOADMS-A(A6),A1ƒTELL�THEM�UPLOAD�IS�INITIATEDŠLEA„ULOADME-A(A6),A2 ŠBSR„MSGOUT ŠBSR„IMSG1ŠCLR.B‚BUFF5S-A(A6)‡CLEAR�BYTE�FOR�OPERATOR�INPUT0ŠBSR„INPP5C�INPUT�AND�PROCEED�FROM�HOME�TERMINAL  2* PLACE COMPLETION ADDRESSES INTO PARAMETER BLOCKS ŠLEA„UHIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„UTIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)  * INITIALIZE FOR RECORD READS /ŠLEA„IOS4-A(A6),A0†ADDR�OF�FILE�PARAMETER�BLOCK$ŠCLR.L‚8(A0)ŽCLEAR�RRN�FOR�DISK�READ#ŠLEA„RBUF-A(A6),A1†STARTING�ADDRESS(ŠLEA„RBUF+RMAX-1-A(A6),A2�ENDING�ADDRESS/ŠMOVEM.L�A1/A2,12(A0)†PLUG�IN�BUFFER�BOUNDARIES-ŠMOVE.L�#$00016020,(A0)„PLUG�IN�READ�FUNCTION!ŠLEA„TBUF-A(A6),A0†PACKING�BUFFER.ŠADD.L‚#3,A0ŽBYPASS�CHECKSUM�AND�EOF�CHARACTER6ŠMOVE.L�A0,TPTR-A(A6)†SAVE�POINTER�FOR�PACKING�RECORDS/ŠMOVE.B�#'A',-1(A0)ˆINDICATE�INTERMEDIATE�FRAME:ŠMOVE.L�A0,UREC1-A(A6)…SAVE�ADDRESS�OF�1ST�RECORD�IN�FRAME6ŠCLR.L‚USTAGEL-A(A6)†INDICATE�NO�STAGED�DISPLAY�RECORD  =* READ ANOTHER RECORD ONLY IF WE STILL HAVE ROOM IN THE FRAME 5UL10†MOVE.L�TPTR-A(A6),D0†POINTER�INTO�PACKING�BUFFER1ŠLEA„TBUF-A(A6),A0†BASE�ADDRESS�OF�PACKING�BUFFER-ŠSUB.L‚A0,D0ŽD0�=�NUMBER�OF�CHARACTERS�PACKED(ŠCMP.L‚CHRNUM-A(A6),D0„SEE�IF�FULL�FRAME!ŠBHS.S‚UL100ŽBRANCH�IF�FRAME�FULLŠLEA„IOS4-A(A6),A0ŠTRAPƒ#2‘READ�THE�RECORDŠBNE.S‚UL15�BRANCH�ON�BAD�READ  E*�READ�WAS�GOOD,�TRANSFER�RECORD�TO�TBUF�UNDER�AN�EDITING�MOVE.‚PLACED*ƒTHE�ACTUAL�NUMBER�OF�CHARACTERS�MOVED�INTO�THE�LENGTH�FIELD�OF�THE*ƒFRAME. *ŠADD.L‚#1,8(A0)‹BUMP�RANDOM�RECORD�POINTER+ŠMOVE.L�TPTR-A(A6),A3†POINT�TO�LENGTH�FIELD"ŠADD.L‚#2,A3ŽWHERE�TO�MOVE�DATA�TOŠBSR„EDITMOV2‹MOVE�DATA�TO�TBUF3ŠMOVE.L�TERMLGH-A(A6),D0ƒNUMBER�OF�CHARACTERS�MOVED ŠMOVE.L�D0,D2#ŠBSR„BINHASCŒCONVERT�TO�ASCII�IN�D1ŠMOVE.L�TPTR-A(A6),A0$ŠMOVE.B�D1,1(A0)‹2ND�DIGIT�OF�LENGTHŠROR.L‚#8,D1ŽPOSITION�1ST�DIGITŠMOVE.B�D1,(A0)ŒPLACE�1ST�DIGIT$ŠADD.L‚#2,A0ŽPOSITION�TO�DESTINATIONŠADD.L‚TERMLGH-A(A6),A0!ŠMOVE.L�A0,TPTR-A(A6)†UPDATE�TPTR"ŠBRA.S‚UL10�CONTINUE�FILLING�FRAME &UL15†CMP.B‚#$C2,D0ŒWAS�IT�END�OF�FILE?!ŠBEQ.S‚UL20�BRANCH�ON�END�OF�FILE"ŠMOVE.L�D0,-(A7)‹SAVE�ERROR�STATUSŠBSR„HALT5ŽHALT�THE�I/O%ŠMOVE.L�(A7)+,D0‹RECOVER�ERROR�STATUSŠBSR„IOSERR�COMPLAIN�ON�ERROR"ŠBRA„XABORT�ABORT�ON�BAD�DISK�READ  * BLANK FILL THE FRAME 1UL20†MOVE.L�TPTR-A(A6),A0†WHERE�TO�MOVE�BLANKS�TOŠLEA„TBUF-A(A6),A1$ŠADD.L‚CHRNUM-A(A6),A1„LAST�ADDR�+�1'UL25†MOVE.B�#'�',(A0)+‰STUFF�BLANKS�...ŠCMP.L‚A0,A1Ž...�TO�THE�END�...ŠBNE.S‚UL25�...�OF�THE�FRAME2ŠMOVE.L�A0,TPTR-A(A6)†SET�TPTR�TO�END�OF�FRAME�+�1-ŠMOVE.B�#'Z',TBUF+2-A(A6)‚INDICATE�LAST�FRAME  )* COMPUTE CHECKSUM FOR THIS FRAME OF DATA UL100…EQU„*-ŠBTSTƒ#C,OPTFLG-A(A6)„IS�CHECKSUM�OPTION�SET?ŠBNE.S‚UL102ŽBRANCH�IF�YES>ŠMOVE.W�#'00',TBUF-A(A6)ƒNO�SO�INSERT�ZERO�(WILDCARD)�CHECKSUM ŠBRA.S‚UL150 0UL102…LEA„TBUF+2-A(A6),A1„WHERE�TO�START�SUMMING ŠMOVE.L�A1,A2ŠADD.L‚CHRNUM-A(A6),A2ŠSUB.L‚#2,A2ŽENDING�ADDRESS�+�1ŠCLR.L‚D0‘ACCUMULATORŠCLR.L‚D1‘HOLDS�BYTE 6UL110…MOVE.B�(A1)+,D1‹ACCUMULATE�CHECKSUM�IN�THIS�LOOP ŠADD.L‚D1,D0 ŠCMP.L‚A1,A2 ŠBNE.S‚UL110 ŠDIVUƒ#255,D0ŠSWAPƒD0‘SUM�MOD�255�IN�D0.W$ŠADD.W‚#1,D0ŽINSURE�NONZERO�CHECKSUM'ŠBSR„BINHASCŒCONVERT�TO�HEX�ASCII�IN�D1&ŠMOVE.W�D1,TBUF-A(A6)†PLUG�IN�CHECKSUM   '* LOOP FOR SENDING FRAME BLOCK BY BLOCK 5UL150…LEA„TBUF-A(A6),A2†BASE�OF�FRAME�AND�FIRST�BLOCK ŠMOVE.L�A2,A1ŠADD.L‚CHRBLK-A(A6),A2+ŠSUB.L‚#1,A2ŽBRACKET�FIRST�BLOCK�WITH�A1/A2 ŠBRA.S‚UL182 UL180…EQU„*ŠMOVEM.L�BBOUNDS-A(A6),A1/A20ŠBTSTƒ#R,OPTFLG-A(A6)„ARE�WE�ADDING�C/R'SŽ111484ŠBEQ.S‚UL181ŽNOŸ111484;ŠMOVE.B�USAVCHR-A(A6),1(A2)�REPLACE�CR�WITH�SAVED�CHARACTER*ƒIF�D�OPTION�SET�THEN�DISPLAY�RECORDS�JUST�SENT�ONTO�TERMINAL "UL700…MOVE.L�REP2-A(A6),REP1-A(A6)ŠBTSTƒ#D,OPTFLG-A(A6)#ŠBEQ„UL800ŽBRANCH�IF�OPTION�NOT�SET 5ŠMOVE.L�UREC1-A(A6),D0…SEE�IF�USTAGE�READY�TO�DISPLAYŠLEA„TBUF-A(A6),A0 ŠSUB.L‚A0,D0ŠCMP.L‚CHRNUM-A(A6),D0.ŠBHI„UL800ŽBRANCH�IF�USTAGE�STILL�ACCUMULATINGŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL8ŠTST.L‚USTAGEL-A(A6)†DO�WE�HAVE�A�STAGED�DISPLAY�RECORD?ŠBEQ.S‚UL710ŽBRANCH�IF�NO A* DISPLAY THE STAGING BUFFER (LEFT OVER FROM LAST FRAME OVERFLOW) ŠLEA„USTAGE-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚USTAGEL-A(A6),A2 ŠSUB.L‚#1,A2 ŠBSR„MSGOUTŠCLR.L‚USTAGEL-A(A6)  M* NOW SET UP TO DISPLAY THE REST OF THE RECORDS FROM TBUF THAT HAVE JUST BEEN* SENT IN THIS FRAME. UL710…LEA„TBUF-A(A6),A35ŠADD.L‚CHRNUM-A(A6),A3„A3�=�LAST�ADDRESS�+�1�OF�FRAMEBŠMOVE.L�UREC1-A(A6),DLTEMP-A(A6)�POINTER�TO�NEXT�RECORD�TO�DISPLAY >UL720…MOVE.L�DLTEMP-A(A6),A1„ADDRESS�OF�LENGTH�FIELD�OF�RECORD8ŠCMP.B‚#'�',(A1)ŠIS�THIS�THE�LAST�RECORD�OF�ENTIRE�FILE?ŠBEQ.S‚UL790ŽBRANCH�IF�YES ŠCLR.L‚D0ŠLEA„TBUF-A(A6),A0ŠADD.L‚CHRNUM-A(A6),A0,ŠCMP.L‚A0,A1ŽARE�WE�AT�THE�END�OF�THE�FRAME?ŠBHS.S‚UL790ŽBRANCH�IF�YES =* NOT THE LAST RECORD IN TBUF SO MOVE IT TO USTAGE TO DISPLAY -ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERT-ŠBSR„ASCHBINŒCONVERT�FROM�ASCII�HEX�TO�BINARY,ŠMOVE.L�A1,A2ŽADDRESS�OF�BEGINNING�OF�RECORD)ŠADD.L‚D0,A2ŽADDRESS�+�1�OF�END�OF�RECORD4ŠMOVE.L�D0,USTAGEL-A(A6)ƒLENGTH�OF�COMPRESSED�RECORD+ŠLEA„USTAGE-A(A6),A4„BASE�OF�DISPLAY�BUFFER   * MOVE AND UNCOMPRESS RECORD*ƒA1‚-‚'FROM'�ADDRESS*ƒA4‚-‚'TO'�ADDRESS 3UL740…MOVE.B�(A1)+,D0‹CHARACTER�UNDER�CONSIDERATIONŠCMP.B‚#'|',D0/ŠBNE.S‚UL760ŽBRANCH�IF�NOT�COMPRESSION�SENTINEL%ŠMOVE.B�(A1)+,D0‹COMPRESSED�CHARACTER ŠMOVE.B�(A1)+,D1‹REPETITION�CODE ŠSUB.B‚#'0',D1ŒCONVERT�TO�BINARY ŠCMP.B‚#9,D1%ŠBLS.S‚UL750ŽBRANCH�IF�IN�RANGE�0�-�9%ŠSUB.B‚#7,D1ŽCONVERT�IN�RANGE�10�-�35 UL750…TST.B‚D1 ŠBEQ.S‚UL761*ŠMOVE.B�D0,(A4)+‹MOVE�COMPRESSED�CHARACTER ŠSUB.B‚#1,D1 ŠBRA.S‚UL750 3UL760…MOVE.B�D0,(A4)+‹MOVE�NON�COMPRESSED�CHARACTER%UL761…CMP.L‚A2,A1ŽARE�WE�DONE�MOVING?ŠBLO.S‚UL740ŽBRANCH�IF�NO 1ŠCMP.L‚A3,A2ŽSEE�IF�THIS�RECORD�FLOWS�OFF�THE�ENDŠBHI.S‚UL780ŽBRANCH�IF�YES6ŠMOVE.L�A1,DLTEMP-A(A6)„ADDRESS�OF�NEXT�RECORD�IN�TBUF  $* NOW DISPLAY THE RECORD FROM USTAGE ŠMOVE.L�A4,A2$ŠSUB.L‚#1,A2ŽLAST�ADDRESS�TO�DISPLAYŠLEA„USTAGE-A(A6),A1ŠBSR„MSGOUT�DISPLAY�THE�RECORD)ŠCLR.L‚USTAGEL-A(A6)†CLEAR�STAGING�LENGTHŠBRA„UL720ŽCONTINUE�DISPLAYING >UL780…LEA„USTAGE-A(A6),A1„CALCULATE�UNCOMPRESSED�RECORD�LENGTH ŠSUB.L‚A1,A4ŠMOVE.L�A4,USTAGEL-A(A6) /UL790…BSR„INPP5C�TAKE�INPUT�FROM�TERMINAL�AGAIN   #* ENTIRE FRAME HAS BEEN TRANSMITTED8* IF LAST FRAME, ISSUE TERMINATION OR COMPLETION MESSAGE  6UL800…CMP.B‚#'Z',TBUF+2-A(A6)‚WAS�THIS�THE�LAST�FRAME?%ŠBNE.S‚UL840ŽBRANCH�IF�NOT�LAST�FRAME0ŠBTSTƒ#TFLG,TRANFLG-A(A6)�HAS�'T'�BEEN�KEYED�IN?ŠBEQ.S‚UL830ŽBRANCH�IF�NO )ŠMOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„UTERMN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6ŠLEA„UTERMS-A(A6),A1ŠLEA„UTERME-A(A6),A2(ŠBSR„MOUT�TELL�THEM�UPLOAD�IS�TERMINATED ŠBRA„QUITUPDN .UL830…MOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„UDONEN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6ŠLEA„UDONES-A(A6),A1ŠLEA„UDONEE-A(A6),A2'ŠBSR„MOUT�TELL�THEM�UPLOAD�IS�COMPLETED ŠBRA„QUITUPDN 5UL840…BTSTƒ#TFLG,TRANFLG-A(A6)�HAS�'T'�BEEN�KEYED�IN?ŠBEQ.S‚UL850ŽBRANCH�IF�NO4ŠLEA„TBUF-A(A6),A0†SET�UP�TBUF�POINTER�TO�BLANK�FILL)ŠADD.L‚#3,A0ŽBYPASS�CHECKSUM�AND�SEQUENCEŠMOVE.L�A0,TPTR-A(A6)/ŠBRA„UL20�GO�CONSTRUCT�ENDING�FRAME�AND�SEND�IT  >* JUSTIFY ANY FRAME OVERFLOW AND CONTINUE SENDING DATA TO HOST 3UL850…MOVE.L�TPTR-A(A6),A2†LAST�ADDRESS�+�1�TO�MOVEŠLEA„TBUF-A(A6),A0,ŠADD.L‚CHRNUM-A(A6),A0„FIRST�ADDRESS�TO�MOVE$ŠLEA„TBUF+3-A(A6),A1„WERE�TO�MOVE�TOUL855…CMP.L‚A2,A0"ŠBHS.S‚UL900ŽBRANCH�IF�DONE�MOVINGŠMOVE.B�(A0)+,(A1)+ ŠBRA.S‚UL855:UL900…MOVE.L�A1,TPTR-A(A6)†UPDATE�TEMPORARY�BUFFER�POINTER ,ŠMOVE.L�A1,UREC1-A(A6)…FIRST�RECORD�OF�FRAME5ŠMOVE.B�#'A',TBUF+2-A(A6)‚INDICATE�INTERMEDIATE�FRAMEŠBRA„UL10�GO�CONTINUE�FILLINGŠPAGE )*****************************************(*�EVENT�WAS�I/O�COMPLETION�ON�TERMINAL‚*)***************************************** UTIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ.S‚ULWAIT�BRANCH�IF�YES ŠMOVE.B�BUFF5S-A(A6),D0(ŠCMP.B‚#'D',D0ŒWAS�KEYIN�A�'D'�(DISPLAY) ŠBNE.S‚UTIO10ŠBCHGƒ#D,OPTFLG-A(A6)2ŠBEQ.S‚UTIO08�BRANCH�IF�DISPLAY�WAS�PREVIOUSLY�OFF*ŠCLR.L‚USTAGEL-A(A6)†CLEAR�HANGING�DISPLAYŠBSR„LF61ŠLEA„RDOFS-A(A6),A1…PUT�OUT�'DISPLAY�OFF�MESSAGE'ŠLEA„RDOFE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚UTIO99 UTIO08„BSR„LF60ŠLEA„RDONS-A(A6),A1…PUT�OUT�'DISPLAY�ON�MESSAGE'ŠLEA„RDONE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚UTIO99 (UTIO10„CMP.B‚#'T',D0ŒWAS�A�'T'�KEYED�IN?ŠBNE.S‚UTIO99�BRANCH�IF�NO5ŠBSETƒ#TFLG,TRANFLG-A(A6)�YES�SO�SET�TERMINATION�FLAG UTIO99„BSR„INPP5C   7* RESET STACK POINTER AND POINTER AND GO WAIT FOR EVENT ULWAIT„EQU„*,ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�STACK�POINTER!ŠMOVE.L�#WTEVNT,D0‰WAIT�FOR�EVENTŠTRAPƒ#1  2**************************************************$*�QUITUPDN�HALTS�ANY�ACTIVE�I/O�ON�*%*ƒTERMINAL�OR�HOST�PORT,�DELAYS�FORŒ*.*ƒ2�SECONDS.‚READS�ALL�THE�EVENTS�IN�THE�ASQ‚**ƒAND�PERFORMS�RTS.œ*2************************************************** QUITUPDN‚BRA„TRANNXT  <************************************************************,*�ASGFLD�ASSIGNS�THE�FILE�KEYED�IN�IN�TBUF‘*8*ƒTO�LOGICAL�UNIT�#4�FOR�UPLOAD.‚EQUAL�CONDITION�CODES‚*0*ƒRETURNED�FOR�GOOD�ASSIGN,�NE�CONDITION�CODES‹*%*ƒRETURNED�IF�OPERATOR�KEYS�IN�'Q'.–*<************************************************************  0RENTRS„DC.Bƒ'REENTER�FILE�NAME�OR�''Q''�TO�QUIT'RENTRE„EQU„*-1ŠDS…0  3OVRMSGSƒDC.Bƒ'FILE�EXISTS�-�OK�TO�OVERWRITE(Y/N)�?'OVRMSGEƒEQU„*-1ŠDS…0  ASGFLD„EQU„*!ŠBSR„EDFILŽSET�UP�PARAMETER�BLOCK&ŠBNE.S‚ASGFLD40‹BRANCH�IF�'Q'�KEYED�INŠLEA„FHS4-A(A6),A0#ŠMOVE.L�#$00400000,(A0)„ASSIGN�CODEŠTRAPƒ#38ŠBEQ.S‚ASGOVRWŒBRANCH�IF�GOOD�ASSIGN�(OVERWRITE�REQUEST)  >* ASSIGN FAILED - SEE IF NONEXISTENT FILE AND IF NOT, COMPLAIN ŠCMP.B‚#$17,D0#ŠBEQ.S‚ASALLO�BRANCH�IF�NONEXISTENT!ŠBSR„FHSERR�COMPLAIN�OF�FHS�ERROR ;ASGFLD20‚LEA„RENTRS-A(A6),A1„TELL�THEM�TO�REENTER�FILE�NAMEŠLEA„RENTRE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽGET�INPUTŠBRA„ASGFLD�GO�FOR�ANOTHER�TRY  8*�THE�FILE�ALREADY�EXISTS.‚ASK�IF�THEY�WISH�TO�OVERWRITE ASGOVRWƒLEA„OVRMSGS-A(A6),A1ŠLEA„OVRMSGE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽWAIT�FOR�THE�INPUTŠCMP.B‚#'Y',BUFF5S-A(A6) ŠBNE„ASGFLD20  ;*�THEY�WANT�TO�OVERWRITE.‚FREE�THE�FILE�AND�DELETE�IT,�THEN* REALLOCATE IT AND ASSIGN IT. ŠLEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3‘FREE�THE�FILEŠMOVE.L�#$00020000,(A0)ŠTRAPƒ#3‘DELETE�THE�FILE ASALLO„MOVE.L�#$00C00304,(A0)%ŠTRAPƒ#3‘ALLOCATE�AND�ASSIGN�THE�FILEŠBEQ.S‚ASGFLD40$ŠBSR„FHSERR�PUT�UP�FHS�ERROR�MESSAGE/ŠBRA„ASGFLD20‹GO�TELL�THEM�TO�REENTER�FILE�NAME ASGFLD40‚RTSŠPAGE <************************************************************,*�ASGFLU�ASSIGNS�THE�FILE�KEYED�IN�IN�TBUF‘*8*ƒTO�LOGICAL�UNIT�#4�FOR�UPLOAD.‚EQUAL�CONDITION�CODES‚*0*ƒRETURNED�FOR�GOOD�ASSIGN,�NE�CONDITION�CODES‹*&*ƒRETURNED�IF�OPERATOR�KEYS�IN�QUIT.•*<************************************************************  ASGFLU„EQU„*#ŠBSR.S‚EDFILŽSET�UP�PARAMETER�BLOCK&ŠBNE.S‚ASGFLU50‹BRANCH�IF�'Q'�KEYED�IN ŠLEA„FHS4-A(A6),A0#ŠMOVE.L�#$00400000,(A0)„ASSIGN�CODEŠTRAPƒ#3%ŠBEQ.S‚ASGFLU50‹BRANCH�ON�GOOD�ASSIGN  2* ASSIGN FAILED - COMPLAIN AND LET THEM TRY AGAIN. !ŠBSR„FHSERR�COMPLAIN�OF�FHS�ERROR3ŠLEA„RENTRS-A(A6),A1„TELL�THEM�TO�REENTER�FILE�NAMEŠLEA„RENTRE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽGET�INPUTŠBRA„ASGFLU�GO�FOR�ANOTHER�TRY 5*�THE�FILE�IS�ASSIGNED.‚RETURN�EQUAL�CONDITION�CODES. ASGFLU50‚RTSŠPAGE  :**********************************************************5*�EDFIL�FREES�ANY�FILE�ATTACHED�TO�LOGICAL�UNIT�#3,†*3*ƒAND�ATTEMPTS�TO�ASSIGN�THE�FILE�KEYED�IN�IN�THE†*.*ƒBUFFER�POINTED�AT�BY�IOS5�PARAMETER�BLOCK.‹*6*ƒIF�THE�ASSIGNMENT�WAS�GOOD,�EQ�CONDITION�CODES�AREƒ*/*ƒRETURNED.‚IF�'Q'�WAS�KEYED-IN,�NE�CONTITION‰*6*ƒCODES�ARE�RETURNED.‚EDFIL�WILL�INTERACTIVELY�QUERY‚*4*ƒTHE�OPERATOR�IF�A�ERROR�WAS�MADE�IN�ENTERING�THE…**ƒFILE�NAME.«*:**********************************************************  DBADFILSƒDC.Bƒ'BAD�FILE�NAME�ENTERED�-�REENTER�NAME�OR�''Q''�TO�QUIT'BADFILEƒEQU„*-1ŠDS…0  4* FIRST FREE IF ANY FILE ATTACHED TO LOGICAL UNIT #3 EDFIL…LEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3  8* SEE IF 'Q' WAS KEYED IN - IF SO BRANCH TO QUIT ROUTINE EDFIL4„BSR„QUITCHK%ŠBEQ.S‚EDFIL8�BRANCH�IF�QUIT�KEYED�IN  /* NOW SET UP PARAMETER BLOCK TO ASSIGN THE FILE ŠLEA„FHS4-A(A6),A0ŠBSR.S‚DEFAULTS6ŠMOVE.L�IOS5+12-A(A6),A0ƒADDRESS�OF�KEYED�IN�FILE�NAME ŠMOVE.L�A0,A2ŠADD.L‚IOS5+20-A(A6),A24ŠMOVE.B�#',',1(A2)‰TERMINATE�WITH�COMMA�FOR�EDITFILEŠLEA„FHS4-A(A6),A6 ŠBSR„EDITFILE ŠLEA„A(PC),A6 ŠTST.L‚D0#ŠBPL.S‚EDFIL6�BRANCH�IF�EDITFILE�OKŠLEA„BADFILS-A(A6),A1ŠLEA„BADFILE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽWAIT�FOR�THE�INPUT ŠBRA.S‚EDFIL4 ,EDFIL6„CMP.L‚D0,D0ŽSET�EQUAL�FOR�GOOD�ASSIGNŠBRA.S‚EDFILRTS 3EDFIL8„MOVE.L�#1,D0ŽSET�NE�CONDITION�CODES�FOR�QUIT EDFILRTS‚RTSŠPAGE 5*****************************************************5* RESPOND1 RESPONDS TO HOST WITH OUTPUT WITH INPUT. *+*ƒRESPONSE�VALUE�PASSED�IN�LOW�ORDER�BYTE‰***ƒOF�DO.‚INPUT�IS�DONE�INTO�BUFF1S.�THIS‰**ƒROUTINE�CALLS�OIP1.�*5*****************************************************  /RESPOND1‚MOVE.B�D0,RESPONSE-A(A6)‚SAVE�RESPONSE3ŠLEA„RESPONSE-A(A6),A1‚SET�UP�BUFFER�BOUNDARIES�...ŠMOVE.L�A1,A2Ž...�FOR�OIP1 ŠADD.L‚#2,A2 ŠBSR„OIP1ŠRTS  7*******************************************************5*�RESPOND2�RESPONDS�TO�HOST�WITH�OUTPUT�AND�PROCEEDƒ*7* WITH RESPONSE VALUE PASSED IN LOW ORDER BYTE OF D0. *7*******************************************************  RESPOND2‚EQU„*)ŠMOVE.B�D0,RESPONSE-A(A6)‚SET�UP�RESPONSE*ŠLEA„RESPONSE-A(A6),A1‚ADDRESS�OF�RESPONSE&ŠMOVE.L�A1,A2ŽSET�UP�BUFFER�BOUNDARIES ŠADD.L‚#2,A2ŠLEA„IOS1-A(A6),A0ŠMOVEM.L�A1/A2,12(A0)6ŠMOVE.L�#$0002020A,(A0)„IMAGE�WRITE,�SVC�ADDR,�PROCEED"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2 ŠBSR„XFRABORTŠRTSŠPAGE 2****************************************************�DEFAULTS�SETS�UP�DEFAULT�VALUES�IN�FHS‰*.*ƒPARAMETER�BLOCK.‚A0�CONTAINS�FHS�PARAMETER‚**ƒBLOCK�ADDRESS.Ÿ*2**************************************************  :DEFAULTS‚MOVE.W�USERNUM+2-A(A6),$A(A0)�DEFAULT�USER�NUMBER'ŠMOVE.L�VOLNAM-A(A6),$6(A0)„VOLUME�NAME(ŠMOVE.L�CATNAM-A(A6),$C(A0)„CATALOG�NAME7ŠMOVE.L�CATNAM+4-A(A6),$10(A0)�2ND�PART�OF�CATALOG�NAMEŠRTS   5*******************************************************�NAKRPT�COUNTS�DOWN�THE�REP1�COUNTER�TOŒ*-*ƒSEE�IF�THE�REPETITION�COUNT�IS�EXHAUSTED.‡*0*ƒIF�REP1�IS�ZERO,�COUNT�IS�EXHAUSTED�AND�REP1„*0*ƒIS�RESET�WITH�REP2�VALUE�AND�EQUAL�CONDITION„**ƒCODES�ARE�RETURNED.�*-*ƒOTHERWISE�REP1�IS�DECREMENTED�AND�UNEQUAL‡*!*ƒCONDITION�CODES�ARE�RETURNED.“*5*****************************************************   NAKRPT„TST.L‚REP1-A(A6),ŠBGT.S‚NAKRPT2ŒBRANCH�IF�COUNT�NOT�EXHAUSTED5ŠMOVE.L�REP2-A(A6),REP1-A(A6)‚EXHAUSTED�-�RESET�COUNT ŠCMP.L‚D0,D0ŠBRA.S‚NAKRRTSNAKRPT2ƒSUB.L‚#1,REP1-A(A6)'ŠTST.L‚(A7)�SET�NONZERO�CONDITION�CODES NAKRRTSƒRTSŠPAGE 3***************************************************0*�PREACHK�CHECKS�THE�TERMINAL�BUFFER�TO�SEE�IF„*+*ƒIT�CONTAINS�'PREAMBLE'.‚EQUAL�CONDITION†*0*ƒCODES�ARE�RETURNED�IF�SO,�UNEQUAL�OTHERWISE.‚*3***************************************************   2PREACHKƒLEA„PREAM-A(A6),A1…STRING�TO�CHECK�AGAINST"ŠLEA„TBUF-A(A6),A2†BUFFER�TO�CHECK ŠBSR.S‚SCHKŠRTS   8********************************************************/*�QUITCHK�CHECKS�THE�IOS5�BUFFER�TO�SEE�IF�ITŠ*4*ƒCONTAINS�'Q'.‚EQUAL�CONDITION�CODES�ARE�RETURNED‚**ƒIF�SO,�UNEQUAL�OTHERWISE.š*8********************************************************  QUITCHKƒMOVE.L�IOS5+12-A(A6),A2ŠCMP.B‚#'Q',(A2)ŠRTS  >**************************************************************<*�SCHK�CHECKS�THE�TERMINAL�BUFFER�POINTED�AT�BY�A2�FOR�THEƒ***ƒCHARACTER�STRING�SPECIFIED�BY�A1.‚UPON’*.*ƒENTRY,�A1�POINTS�TO�A�LONG�WORD�SPECIFYING�*-*ƒTHE�NUMBER�OF�CHARACTERS�IN�THE�STRING�TO�*-*ƒMATCH,�FOLLOWED�IMMEDIATELY�BY�THE�STRING�* *ƒITSELF.²*>**************************************************************  SCHK†EQU„*ŠMOVE.L�(A1)+,D0 ŠSUB.L‚#1,D0TCHK2…CMP.B‚(A1)+,(A2)+ŠDBNEƒD0,TCHK2ŠRTSŠPAGE 1*************************************************(*�MOUT�HALTS�ANY�I/O�ON�LU�5�AND�CALLSŠ*,*ƒMSGOUT�TO�OUTPUT�DATA�TO�LU�6.‚IF�A�REALƒ*-*ƒI/O�FUNCTION�WAS�ACTUALLY�HALTED�ON�LU�5,ƒ*+*ƒMOUT�WILL�REISSUE�THE�I/O�REQUEST�AFTER…**ƒCALLING�MOUT.Ÿ*1*************************************************  #MOUT†BSR„HALT5ŽHALT�I/O�ON�TERMINAL(ŠBEQ.S‚MOUT4ŽBRANCH�IF�I/O�REALLY�HALTED ŠBSR„MSGOUTŠBRA.S‚MOUTRTS MOUT4…BSR„MSGOUTŠMOVE.L�A0,-(A7)ŠLEA„IOS5-A(A6),A0"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/O!ŠTRAPƒ#2‘REISSUE�THE�PREVIOUS�I/OŠMOVE.L�(A7)+,A0 MOUTRTSƒRTS  0************************************************+*�FHSERR�PUTS�UP�A�MESSAGE�COMPLAINING�OF†*-*ƒFHS�ERROR�NUMBER�AND�LOGICAL�UNIT�NUMBER.‚*)*ƒENTERED�WITH�ERROR�CODE�IN�D0�AND�FHS†*"*ƒPARAMETER�BLOCK�ADDRESS�IN�A0.�**ƒA0,A1,A2,D0�DESTROYED–*0************************************************ FHSERR„BSR„BINHASCŠMOVE.W�D1,FHSERRS-A(A6)ŠMOVE.B�5(A0),FHSERLUN-A(A6)ŠADD.B‚#$30,FHSERLUN-A(A6)ŠLEA„FHSERRS-A(A6),A1ŠLEA„FHSERRE-A(A6),A2 ŠBSR„MOUTŠRTSŠPAGE 0************************************************+*�IOSERR�PUTS�UP�A�MESSAGE�COMPLAINING�OF†*-*ƒIOS�ERROR�NUMBER�AND�LOGICAL�UNIT�NUMBER.‚*)*ƒENTERED�WITH�ERROR�CODE�IN�D0�AND�IOS†*!*ƒPARAMETER�BLOCK�ADDRESS�IN�A0Ž**ƒA0,A1,A2,D0�DESTROYED.•*0************************************************  IOSERR„BSR„BINHASCŠMOVE.W�D1,IOSERRS-A(A6)ŠMOVE.B�5(A0),IOSERLUN-A(A6)ŠADD.B‚#$30,IOSERLUN-A(A6)ŠLEA„IOSERRS-A(A6),A1ŠLEA„IOSERRE-A(A6),A2 ŠBSR„MOUTŠRTS  2**************************************************0*�IOP�PERFORMS�I/O�REQUEST�FOR�I/O�AND�PROCEEDƒ***ƒA0�CONTAINS�ADDRESS�OF�PARAMETER�BLOCK‡*$*ƒA1�CONTAINS�BUFFER�START�ADDRESS�*"*ƒA2�CONTAINS�BUFFER�END�ADDRESS�*+*ƒSTATUS�BYTE�OF�P.B.�IS�FLAGGED�WITH�$FF†***ƒTO�SHOW�ACTIVE�I/O.‚REQUEST�IS�IGNORED†**ƒIF�I/O�IS�ALREADY�ACTIVE.”*2**************************************************  IOP‡EQU„*(ŠCMP.B‚#$FF,4(A0)‰IS�I/O�ALREADY�ACTIVE?ŠBEQ.S‚IOPRTS�BRANCH�IF�YES.ŠMOVEM.L�A1/A2,12(A0)†PLUG�IN�BUFFER�ADDRESSES"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2,ŠBSR„XFRABORT‹ABORT�ON�PARAMETER�BLOCK�ERROR IOPRTS„RTSŠPAGE 1*************************************************(*�INPP5C�PERFORMS�INPUT�AND�PROCEED�ONŠ*,*ƒLOGICAL�UNIT�5�(TERMINAL).‚ONE�CHARACTERƒ**ƒIS�INPUT�AT�BUFF5S.™* *ƒINPUT�IS�IMAGE�MODE,�NO�ECHO�*1************************************************* INPP5C„LEA„BUFF5S-A(A6),A1 ŠMOVE.L�A1,A2ŠLEA„IOS5-A(A6),A03ŠMOVE.L�#$0001022A,(A0)„READ,IMAGE,SVC�ADDR,PROCEEDŠBSR„IOPŠRTS   5*****************************************************'*�INPP5�PERFORMS�INPUT�AND�PROCEED�ON�*0*ƒLOGICAL�UNIT�5�(TERMINAL).‚BUFFER�BOUNDARIESƒ**ƒARE�BUFF5S�AND�BUFF5E›* *ƒINPUT�IS�FORMATTED�WITH�ECHO”*5*****************************************************  INPP5…LEA„BUFF5S-A(A6),A1ŠLEA„BUFF5E-A(A6),A2ŠLEA„IOS5-A(A6),A0-ŠMOVE.L�#$00010202,(A0)„READ,SVC�ADDR,PROCEEDŠBSR„IOPŠRTS  ,********************************************,* INPW5 PERFORMS INPUT AND WAIT ON LOGICAL *(*ƒUNIT�5�(TERMINAL).‚BUFFER�BOUNDARIES‚**ƒARE�BUFF5S�AND�BUFF5E.‘* ,******************************************** INPW5…LEA„BUFF5S-A(A6),A1ŠLEA„BUFF5E-A(A6),A2ŠLEA„IOS5-A(A6),A0ŠMOVEM.L�A1/A2,12(A0)ŠMOVE.L�#$00010000,(A0)"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2 ŠBSR„XFRABORTŠRTS )*****************************************'*�INPP1�PERFORMS�INPUT�AND�PROCEED�ONƒ*&*ƒLOGICAL�UNIT�1�(HOST�PORT).‚BUFFER�*$*ƒBOUNDARIES�ARE�BUFF1S�AND�BUFF1E„*)***************************************** INPP1…LEA„BUFF1S-A(A6),A1ŠLEA„BUFF1E-A(A6),A2ŠLEA„IOS1-A(A6),A0<ŠMOVE.L�#$0001022E,(A0)„READ,SVC�ADDR,NO�ECHO,IMAGE,PROCEED,ŠBSR„IOP�REJECT�IF�BUSY‚012885ŠRTSŠPAGE 0************************************************(*�OUTP1�PERFROMS�OUTPUT�AND�PROCEED�ON‰*&*ƒLOGICAL�UNIT�1�(HOST�PORT).‚BUFFERˆ*,*ƒARE�DEFINED�IN�A1/A2.‚THIS�ROUTINE�CALLS‚**ƒIOP.§*0************************************************  OUTP1…LEA„IOS1-A(A6),A04ŠMOVE.L�#$0002020A,(A0)„IMAGE�WRITE,SVC�ADDR,PROCEEDŠBSR„IOP ŠBSR„XFRABORTŠRTS  4****************************************************3*�OUTW5I�PERFORMS�OUTPUT�AND�WAIT�(IMAGE�MODE)�ON‚*.*ƒLOGICAL�UNIT�5�(TERMINAL�PORT).‚BOUNDARIES„*%*ƒARE�TBUF�FOR�A�LENGTH�OF�TERMLGH.Ž*,*ƒOUTPUT�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS‡**ƒIS�RETURNED.£*4****************************************************  OUTW5I„LEA„IOS5W-A(A6),A0ŠLEA„TBUF-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚TERMLGH-A(A6),A2 ŠSUB.L‚#1,A2/ŠMOVEM.L�A1/A2,12(A0)†MOVE�IN�BUFFER�BOUNDARIES(ŠMOVE.L�#$00020008,(A0)„IMAGE�WRITE,WAIT)OUTW5IAƒMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSYŠBNE.S‚OUTW5IX!ŠBSR„TINYWAIT‹WAIT�A�LITTLE�WHILEŠBRA.S‚OUTW5IA OUTW5IXƒRTS   7*******************************************************5*�OUTP5F�PERFORMS�OUTPUT�AND�PROCEED�(FORMATTED)�ONƒ*.*ƒLOGICAL�UNIT�5�(TERMINAL�PORT).‚BOUNDARIES‡*%*ƒARE�TBUF�FOR�A�LENGTH�OF�TERMLGH.‘*,*ƒOUTPUT�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUSŠ**ƒIS�RETURNED.¦*7*******************************************************  ϸLÁDÉGÑ@Ù:á@éJñWùHK OUTP5F„LEA„IOS5-A(A6),A0ŠLEA„TBUF-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚TERMLGH-A(A6),A2 ŠSUB.L‚#1,A2/ŠMOVEM.L�A1/A2,12(A0)†MOVE�IN�BUFFER�BOUNDARIES5ŠMOVE.L�#$00020202,(A0)„FORMAT�WRITE,SVC�ADDR,PROCEED )OUTP5FAƒMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSYŠBNE.S‚OUTP5FX!ŠBSR„TINYWAIT‹WAIT�A�LITTLE�WHILEŠBRA.S‚OUTP5FA OUTP5FXƒRTS   6******************************************************'*�OIP15�PERFORMS�OUTPUT�WITH�INPUT�ON�*1*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTPUT�BOUNDARIES„*(*ƒARE�DEFINED�IN�IOS5�PARAMETER�BLOCK.�***ƒINPUT�BOUNDARIES�ARE�BUFF1S�AND�BUFF1E‹*,*ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS‰*&*ƒRETURNED.‚THIS�ROUTINE�CALLS�OIP1.Ž*6******************************************************  ;OIP15…MOVE.L�IOS5+12-A(A6),A1ƒCONSTRUCT�BOUNDARIES�IN�A1/A2 ŠMOVE.L�A1,A2,ŠBTSTƒ#H,OPTFLG-A(A6)„HALF�DUPLEX�SET’111484+ŠBEQ.S‚OIP15A�NO,�OUTPUT�1�CHAR�ONLY‹1114843ŠADD.L‚IOS5+20-A(A6),A2ƒYES,�SEND�WHOLE�LINE�111484OIP15A„BSR.S‚OIP1°111484ŠRTSŠPAGE 4****************************************************&*�OIP1�PERFORMS�OUTPUT�WITH�INPUT�ON�*1*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTPUT�BOUNDARIES‚**ƒARE�DEFINED�IN�A1/A2.š***ƒINPUT�BOUNDARIES�ARE�BUFF1S�AND�BUFF1E‰*,*ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS‡* *ƒRETURNED.¦*4**************************************************** OIP1†LEA„IOS1-A(A6),A02ŠMOVEM.L�A1/A2,12(A0)†SET�OUTPUT�BUFFER�BOUNDARIESŠLEA„BUFF1S-A(A6),A1#ŠMOVE.L�A1,8(A0)‹INPUT�BUFFER�STARTŠLEA„BUFF1E-A(A6),A2 ŠSUB.L‚A1,A2 ŠADD.L‚#1,A2!ŠMOVE.L�A2,20(A0)ŠLENGTH�OF�INPUT>ŠMOVE.L�#$0004062A,(A0)„OUT/IN,�IMAGE,SVC�ADDR,NO�ECHO,PROCEED'OIP1A…MOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSY ŠBNE.S‚OIP1X#ŠBSR.S‚TINYWAI T‹WAIT�A�LITTLE�WHILE ŠBRA.S‚OIP1A OIP1X…RTS  2**************************************************'*�OIP1C�PERFORMS�OUTPUT�WITH�INPUT�ONŒ*-*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTUPT�IS�ONE„*)*ƒCHARACTER�FROM�BUFFER�DEFINED�IN�IOS5ˆ**ƒPARAMETER�BLOCK.�*'*ƒINPUT�IS�ONE�CHARACTER�INTO�BUFF1S.Š*,*ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS…* *ƒRETURNED.¤*2************************************************** OIP1C…LEA„IOS1-A(A6),A0ŠMOVE.L�IOS5+12-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚IOS5+20-A(A6),A2 ŠSUB.L‚#1,A22ŠMOVEM.L�A1/A2,12(A0)†SET�OUTPUT�BUFFER�BOUNDARIESŠLEA„BUFF1S-A(A6),A1#ŠMOVE.L�A1,8(A0)‹INPUT�BUFFER�START!ŠMOVE.L�#1,20(A0)ŠLENGTH�OF�INPUT>ŠMOVE.L�#$0004062A,(A0)„OUT/IN,�IMAGE,SVC�ADDR,NO�ECHO,PROCEED (OIP1CA„MOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSY ŠBNE.S‚OIP1CX#ŠBSR.S‚TINYWAIT‹WAIT�A�LITTLE�WHILE ŠBRA.S‚OIP1CA OIP1CX„RTSŠPAGE  +*********************************************�TINYWAIT�DOES�A�RELINQUISH�AND�RETURNS‚*+******************************************* TINYWAIT‚MOVE.L�#RELINQ,D0ŠTRAPƒ#1ŠRTS  :**************************************************<<011785+*�HALT1�HALTS�THE�I/O�IN�PROGRESS�ON�LU�1ˆ**°*.*‚ROUTINE�WAITS�FOR�HALT�STATUS�TO�APPEAR�IN„*.*‚IOS1H�PARAMETER�BLOCK�BEFORE�RETURNING.‚IFƒ*+*‚A�HALT�IS�ACTUALLY�EFFECTED�(0�STATUS),‡***‚THE�HALT�SYNC�COUNTER�WORD�IMMEDIATELYˆ*)*‚FOLLOWING�THE�HALT�PARAMETER�BLOCK�IS‰*,*‚INCREMENTED.‚IF�NO�I/O�HAD�TO�BE�STOPPED…*&*‚(STATUS�NE�0�&�NE�$FF,�RETURN�NOW.Œ*2************************************************** HALT1:ŠLEA„IOS1H-A(A6),A0&ŠMOVE.B�#$FF,IOSSTA(A0)„PRELOAD�STATUSŠTRAPƒ#2‘HALT�THE�I/O7ŠWHILE.B�IOSSTA(A0)��#$FF�DO.S‚WAIT�TILL�GET�ANSWER ŒBSR‚TINYWAITŠENDW 7ŠIF.BƒIOSSTA(A0)��#0�THEN.S‚WAS�THERE�I/O�TO�HALT�?4ŒADD.W‚#1,IOS1H+28-A(A6)‚YES,�BUMP�HALT�SYNC�COUNTER&ŒCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠENDI HALT1RTS‚RTS   2**************************************************+*�HALT5�HALTS�THE�I/O�IN�PROGRESS�ON�LU�5ˆ**°*.*‚ROUTINE�WAITS�FOR�HALT�STATUS�TO�APPEAR�IN„*.*‚IOS5H�PARAMETER�BLOCK�BEFORE�RETURNING.‚IFƒ*+*‚A�HALT�IS�ACTUALLY�EFFECTED�(0�STATUS),‡***‚THE�HALT�SYNC�COUNTER�WORD�IMMEDIATELYˆ*)*‚FOLLOWING�THE�HALT�PARAMETER�BLOCK�IS‰*,*‚INCREMENTED.‚IF�NO�I/O�HAD�TO�BE�STOPPED…*&*‚(STATUS�NE�0�&�NE�$FF,�RETURN�NOW.Œ*2************************************************** HALT5:ŠLEA„IOS5H-A(A6),A0&ŠMOVE.B�#$FF,IOSSTA(A0)„PRELOAD�STATUSŠTRAPƒ#2‘HALT�THE�I/O7ŠWHILE.B�IOSSTA(A0)��#$FF�DO.S‚WAIT�TILL�GET�ANSWER ŒBSR‚TINYWAITŠENDW 7ŠIF.BƒIOSSTA(A0)��#0�THEN.S‚WAS�THERE�I/O�TO�HALT�?4ŒADD.W‚#1,IOS5H+28-A(A6)‚YES,�BUMP�HALT�SYNC�COUNTER&ŒCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠENDIHALT5RTS‚RTS—011785>>   4****************************************************(*�HLTCHK�CHECKS�FOR�A�HALTED�I/O.‚ZEROŒ*'*ƒCONDITION�CODES�ARE�RETURNED�IF�THEŒ*&*ƒI/O�HAS�HALTED,�NONZERO�OTHERWISE.�*)*ƒTHE�ADDRESS�OF�THE�HALT�I/O�PARAMETERŠ*&*ƒBLOCK�IS�PASSED�IN�A0.‚THE�ROUTINEŒ*-*ƒCHECKS�THE�SYSC�COUNTER�(WORD�IMMEDIATELY†***ƒFOLLOWING�THE�HALT�PARAMETER�BLOCK�FOR‰*,*ƒZERO.‚IF�ZERO,�NO�HALT�HAS�BEEN�EFFECTED†*,*ƒIF�NONZERO,�A�HALT�HAS�BEEN�EFFECTED�AND‡*0*ƒTHE�ROUTINE�WILL�DECREMENT�THE�SYNC�COUNTER.ƒ*4****************************************************  +HLTCHK„TST.W‚28(A0)�HAS�HALT�BEEN�EFFECTED?ŠBEQ.S‚HLTCHKBŒBRANCH�IF�NO$ŠSUB.W‚#1,28(A0)ŠCHECK�OFF�THIS�HALT/ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODES�FOR�HALTŠBRA.S‚HLTCRTSŒGO�RETURN:HLTCHKBƒTST.L‚(A7)�SET�NONZERO�CONDITION�CODES�FOR�NO�HALT HLTCRTSƒRTSŠPAGE 2****************************************************�IOERCHK�CHECKS�PARAMETER�BLOCK�POINTED‰*.*ƒAT�BY�A0�FOR�ERROR.‚IF�ERROR�THEN�COMPLAIN‚**ƒWITH�MESSAGE. *2**************************************************  IOERCHKƒMOVE.B�4(A0),D0"ŠBEQ.S‚IOERRTSŒBRANCH�FOR�NO�ERROR$ŠMOVEM.L�D0/A0,-(A7)‡SAVE�ERROR�CODE!ŠBSR„IOSERR�COMPLAIN�OF�I/O�ERROR'ŠMOVEM.L�(A7)+,D0/A0‡RESTORE�ERROR �CODE IOERRTSƒRTS   :**********************************************************,*�WAITDC1�WILL�PUT�UP�A�TWO�CHARACTER�READ�*&*ƒTO�THE�HOST�PORT.‚WHEN�THE�READ�IS’*-*ƒSATISFIED�THE�ROUTINE�PERFORMS�AN�RTS.‚IF‹*/*ƒTHE�READ�IS�NOT�SATISFIED,�THE�ROUTINE�WILLŠ*2*ƒRTS�AFTER�TWO�SECONDS.‚THE�PURPOSE�IS�TO�DELAY†*6*ƒUNTIL�RECEIPT�OF�A�DC1�INDICATING�LINE�TURNAROUND.ƒ*7*ƒTHE�TWO�CHARACTERS�READ�SHOULD�BE�A�LINE�FEED�($0A)‚*"*ƒFOLLOWED�BY�A�CARRIAGE�RETURN.—*:**********************************************************  WAITDC1ƒEQU„*ŠMOVE.L�#10,D1�LOOP�COUNT+ŠLEA„WAITDRTN-A(A6),A0‚EVENT�RETURN�ADDRESSŠMOVE.L�IOS1+24-A(A6),-(A7)5ŠMOVE.L�A0,IOS1+24-A(A6)ƒSET�NEW�EVENT�RETURN�ADDRESSŠLEA„BUFF1S-A(A6),A1 ŠMOVE.L�A1,A2*ŠADD.L‚#1,A2ŽSET�UP�FOR�TWO�CHARACTER�READŠLEA„IOS1-A(A6),A0;ŠMOVE.L�#$0001022A,(A0)„READ,SVC�ADDR,NO�ECHO,IMAGE,PROCEEDŠBSR„IOPŠMOVE.L�(A7)+,IOS1+24-A(A6) 0WAITD05ƒCMP.B‚#$FF,IOS1+4-A(A6)‚IS�THE�I/O�DONE?ŠBNE.S‚WAITDRTS‹BRANCH�IF�YES(ŠSUB.L‚#1,D1ŽNO�-�DECREMENT�WAIT�COUNTER1ŠBMI.S‚WAITD08ŒBRANCH�IF�WE'VE�WAITED�LONG�ENOUGH&ŠMOVE.L�#DELAY,D0ŠWAIT�FOR�2/10�SECONDŠMOVE.L�#200,A0ŠTRAPƒ#1-ŠBRA.S‚WAITD05ŒGO�BACK�AND�CHECK�FOR�I/O�DONE WAITD08ƒBSR„HALT1ŽHALT�THE�I/O'ŠBNE.S‚WAITDRTS‹BRANCH�IF�NO�I/O�HALTED,ŠSUB.W‚#1,IOS1H+28-A(A6)‚ADJUST�SYNC�COUNTER WAITDRTS‚RTS !WAITDRTN‚BSR„ASQREADŒDUMMY�RETURN+ŠMOVE.L�#WTEVNT,D0‰JUST�READ�EVENT�AND�WAITŠTRAPƒ#1 ŠPAGE >**************************************************************/*�EDITMOV1�MOVES�DATA�THAT�HAS�JUST�BEEN�READ�*2*ƒFROM�THE�HOST�INTO�A�WORKING�BUFFER�POINTED�AT‹*+*ƒBY�A3.‚PARITY�BIT�(BIT�7)�IS�MASKED�OFF‘**ƒTHE�NUMBER�OF�CHARACTERS¡*'*ƒACTUALLY�MOVED�IS�SAVED�IN�TERMLGH.–*6*ƒONLY�DATA�IN�THE�RANGE�$20-$7E�INCLUSIVE�IS�MOVED.‡*2*ƒIF�A�CARRIAGE�RETURN�IS�ENCOUNTERED�BEFORE�ANY‹*9*ƒOTHER�DATA,�A�BLANK�IS�MOVED�IN�PLACE�OF�THE�CARRIAGE„*6*ƒRETURN.‚IF�A�LINE�FEED�IS�ENCOUNTERED�IN�THE�DATA,†*5*ƒALL�MOVEMENT�UP�TO�AND�INCLUDING�THE�LINE�FEED�ISˆ*7*ƒSCRUBBED�AND�ONLY�THE�PORTION�OF�THE�LINE�FOLLOWING†*4*ƒIS�MOVED.‚THE�BUFFER�BOUNDARIES�FOR�EDITMOV1�AREˆ***ƒIMPLIED�FROM�THE�IOS1�PARAMETER�BLOCK.“*>**************************************************************  EDITMOV1‚EQU„*ŠMOVEM.L�A1-A4/D0,-(A7)0ŠMOVE.L�IOS1+12-A(A6),A1ƒSTART�ADDRESS�FROM�HOST ŠMOVE.L�A1,A2ŠADD.L‚IOS1+20-A(A6),A2ŠSUB.L‚#1,A2ŽEND�ADDRESS�IN�A2 ŠMOVE.L�A3,A4 EDMV2…CMP.L‚A2,A1"ŠBHI.S‚EDMV4ŽBRANCH�IF�DONE�MOVING%ŠMOVE.B�(A1)+,D0‹CHARACTER�TO�EXAMINE"ŠAND.B‚#$7F,D0ŒMASK�OFF�PARITY�BIT ŠCMP.L‚A3,A4.ŠBNE.S‚EDMV3ŽBRANCH�IF�AT�LEAST�ONE�CHAR�MOVED)ŠCMP.B‚#$0D,D0ŒIS�THIS�A�CARRIAGE�RETURN?ŠBNE.S‚EDMV3ŽBRANCH�IF�NO4ŠMOVE.B�#$20,D0ŒSUBSTITUTE�BLANK�FOR�CARRIAGE�RETURN$ŠBRA.S‚EDMV5ŽFORCE�MOVEMENT�OF�BLANK &EDMV3…CMP.B‚#$0A,D0ŒIS�IT�A�LINE�FEED?+ŠBNE.S‚EDMV8ŽBRANCH�IF�NO�-�NORMAL�MOVEMENT'ŠMOVE.L�A4,A3ŽRESET�DESTINATION�POINTER(ŠBRA„EDMV2ŽCONTINUE�WITH�NORMAL�MOVEMENT EDMV8…CMP.B‚#$20,D0 ŠBLO.S‚EDMV2ŽBRANCH�ON�NON-ASCIIŠCMP.B‚#$7F,D0ŠBHS.S‚EDMV2ŽBRANCH�NON�ASCII -EDMV5…MOVE.B�D0,(A3)+‹MOVE�IN�ASCII�CHARACTER ŠBRA.S‚EDMV2 EDMV4…SUB.L‚A4,A38ŠMOVE.L�A3,TERMLGH-A(A6)ƒSAVE�NUMBER�OF�CHARACTERS�MOVEDŠMOVEM.L�(A7)+,A1-A4/D0ŠRTSŠPAGE 8********************************************************/*�EDITMOV2�MOVES�DATA�THAT�HAS�JUST�BEEN�READŠ*2*ƒVIA�IOS4�PARAMETER�BLOCK�TO�A�LOCATION�POINTED…*1*ƒTO�BY�A3.‚NUMBER�OF�CHARACTERS�ACTUALLY�MOVED…*4*ƒIS�RETURNED�IN�TERMLGH.‚THE�DATA�IS�EDITED�AS�IT‚*1*ƒIS�MOVED�IN�THE�FOLLOWING�WAY:‚ALL�CHARACTERS…*1*ƒTHAT�DO�NOT�FALL�IN�THE�CODE�RANGE�OF�$20-$7E†*2*ƒINCLUSIVE�(NON�PRINTABLE�ASCII�CHARACTERS)�ARE…*.*ƒCONVERTED�TO�BLANK�(CODE�$20).‚IN�ADDITIONˆ*5*ƒIF�COMOPT�CONTAINS�A�'B'�(OBTAINED�FROM�PREAMBLE)‚*6*ƒANY�LOWER�CASE�LETTERS�ARE�CONVERTED�TO�UPPER�CASE.*5*ƒCHARACTER�COMPRESSION�PACKET�IS�MOVED�IN�PLACE�OF‚*2*ƒANY�REPETITION�OF�4�OR�MORE�LIKE�CHARACTERS�IS…*%*ƒREPLACED�BY�A�COMPRESSION�PACKET.’*8****************************************** **************  EDITMOV2‚MOVEM.L�A1-A4,-(A7)*ŠMOVE.L�IOS4+12-A(A6),A1ƒMOVE�FROM�ADDRESS ŠMOVE.L�A1,A2ŠADD.L‚IOS4+20-A(A6),A2ŠSUB.L‚#1,A2ŽEND�ADDRESS�IN�A2 ŠMOVE.L�A3,A4 EDMV222ƒCMP.L‚A2,A1$ŠBHI.S‚EDMV299ŒBRANCH�IF�DONE�MOVINGŠBSR.S‚GETC�GET�NEXT�CHARACTER+ŠMOVE.B�D0,D2ŽSAVE�CHARACTER�FOR�COMPARISON*ŠMOVE.L�#1,D3ŽCOUNT�OF�MATCHING�CHARACTERS -EDMV250ƒCMP.L‚A2,A1ŽHAVE�WE�FETCHED�THE�LAST?ŠBHI.S‚EDMV262ŒBRANCH�IF�YES ŠCMP.L‚#35,D34ŠBEQ.S‚EDMV262ŒBRANCH�ON�MAX�SIZE�COMPRESSION�PACKET ŠBSR.S‚GETC ŠCMP.B‚D0,D2+ŠBNE.S‚EDMV260ŒBRANCH�ON�NO�CHARACTER�MATCH.ŠADD.L‚#1,D3ŽBUMP�COUNT�OF�MATCHING�CHARACTERSŠBRA.S‚EDMV250 7EDMV260ƒSUB.L‚#1,A1ŽPOINT�A1�TO�NEXT�CHARACTER�TO�FETCH4EDMV262ƒCMP.L‚#3,D3ŽDO�WE�NEED�A�COMPRESSION�PACKET?ŠBHI.S‚EDMV268ŒBRANCH�IF�YESŠCMP.B‚#'|',D25ŠBEQ.S‚EDMV268Œ'|'�ALWAYS�REQUIRES�COMPRESSION�PACKET ?EDMV264ƒMOVE.B�D2,(A3)+‹NO�COMPRESSION�SO�PLUG�IN�RAW�CHARACTER ŠSUB.L‚#1,D3ŠBNE.S‚EDMV264ŒKEEP�PLUGGINGŠBRA.S‚EDMV222 6EDMV268ƒMOVE.B�#'|',(A3)+‰PLUG�IN�COMPRESSION�SENTINEL-ŠMOVE.B�D2,(A3)+‹PLUG�IN�COMPRESSED�CHARACTER.ŠADD.B‚#'0',D3ŒCONVERT�D3�TO�ASCII�LENGTH�CODEŠCMP.B‚#'9',D3'ŠBLS.S‚EDMV272ŒBRANCH�IF�IN�RANGE�0�-�9-ŠADD.B‚#7,D3ŽCONVERT�IN�RANGE�10�-�35�(A�-�Z) +EDMV272ƒMOVE.B�D3,(A3)+‹PLUG�IN�LENGTH�CODEŠBRA.S‚EDMV222 EDMV299ƒSUB.L‚A4,A38ŠMOVE.L�A3,TERMLGH-A(A6)ƒSAVE�NUMBER�OF�CHARACTERS�MOVEDŠMOVEM.L�(A7)+,A1-A4ŠRTS *GETC†MOVE.B�(A1)+,D0‹CHARACTER�IN�QUESTIONŠCMP.B‚#'�',D0+ŠBLO.S‚GETC23�BRANCH�IF�NOT�PRINTABLE�ASCIIŠCMP.B‚#$7F,D0'ŠBLO.S‚GETC24�BRANCH�IF�PRINTABLE�ASCII 3GETC23„MOVE.B�#'�',D0ŒCHANGE�NON�PRINTABLE�TO�BLANK#ŠBRA.S‚GETCRTSŒGO�PLUG�IN�CHARACTER *�ASCDBIN�CONVERTS�ASCII�DECIMAL�TO�BINARY.�INPUT�POINTED�ATƒ*1*ƒBY�A1,�NUMBER�OF�CHARS�IN�D1.‚RESULT�RETURNED�*3*ƒIN�D0.‚LEADING�BLANKS�TREATED�AS�L EADING�ZEROS.‹*1*ƒSCAN�TERMINATES�AT�END�OF�FIELD�OR�UPON�FIRSTŽ*0*ƒNONNUMERIC�CHARACTER�ENCOUNTERED�AFTER�FIRST�**ƒNUMERIC�CHARACTER.©*@****************************************************************  ASCDBINƒEQU„*ŠCLR.L‚D0‘RETURN�VALUEASCDB2„BSR.S‚ASCDB200ŠBRA.S‚ASCDB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCDB2�BRANCH�ON�BLANK ASCDB4„MOVE.L�D0,-(A7) ŠLSL.L‚#3,D0ŠADD.L‚(A7),D0ŠADD.L‚(A7)+,D0‹*10ŠADD.L‚D2,D0ŽADD�IN�NEW�DIGITŠBSR.S‚ASCDB200ŠBRA.S‚ASCDB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCDB12ŒBRANCH�ON�BLANKŠBRA.S‚ASCDB4�BRANCH�ON�NUMERICASCDB12ƒRTS—MAIN�RETURN ASCDB20ƒSUB.L‚#1,D1,ŠBPL.S‚ASCDB22ŒBRANCH�IF�NOT�DONE�WITH�FIELD6ŠLEA„4(A7),A7‹BYPASS�RETURN�ADDRESS�ON�DONE�WITH�FIELD(ŠBRA.S‚ASCDB12ŒDONE�WITH�FIELD�SO�RETURN ASCDB22ƒCLR.L‚D2#ŠCMP.B‚#'�',(A1)ŠCLASSIFY�CHARACTERŠBEQ.S‚ASCDB24ŒBRANCH�ON�BLANKŠCMP.B‚#'0',(A1)$ŠBLO.S‚ASCDB30ŒBRANCH�ON�NON-NUMERICŠCMP.B‚#'9',(A1)$ŠBHI.S‚ASCDB30ŒBRANCH�ON�NON-NUMERICŠADD.L‚#2,(A7) ASCDB24ƒADD.L‚#2,(A7)"ASCDB30ƒMOVE.B�(A1)+,D2‹ADVANCE�A1ŠSUB.B‚#'0',D2ŒBINARY�TO�D2ŠRTSŠPAGE  ;***********************************************************:*�ASCHBIN�CONVERTS�ASCII�HEX�TO�BINARY.‚INPUT�POINTED�AT�*1*ƒBY�A1,�NUMBER�OF�CHARS�IN�D1.‚RESULT�RETURNEDˆ*3*ƒIN�D0.‚LEADING�BLANKS�TREATED�AS�LEADING�ZEROS.†*1*ƒSCAN�TERMINATES�AT�END�OF�FIELD�OR�UPON�FIRST‰*5*ƒNON�HEX�NUMERIC�CHARACTER�ENCOUNTERED�AFTER�FIRST…**ƒHEX�NUMERIC�CHARACTER¡*;*********************************************************** ASCHBINƒEQU„*ŠCLR.L‚D0‘RETURN�VALUEASCHB2„BSR.S‚ASCHB200ŠBRA.S‚ASCHB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCHB2�BRANCH�ON�BLANK ASCHB4„LSL.L‚#4,D0Ž*16ŠADD.B‚D2,D0ŽADD�IN�NEW�DIGITŠBSR.S‚ASCHB200ŠBRA.S‚ASCHB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCHB12ŒBRANCH�ON�BLANKŠBRA.S‚ASCHB4�BRANCH�ON�NUMERICASCHB12ƒRTS—MAIN�RETURN  ASCHB20ƒSUB.L‚#1,D1,ŠBPL.S‚ASCHB22ŒBRANCH�IF�NOT�DONE�WITH�FIELD6ŠLEA„4(A7),A7‹BYPASS�RETURN�ADDRESS�ON�DONE�WITH�FIELD(ŠBRA.S‚ASCHB12ŒDONE�WITH�FIELD�SO�RETURN ASCHB22ƒCLR.L‚D2#ŠCMP.B‚#'�',(A1)ŠCLASSIFY�CHARACTERŠBEQ.S‚ASCHB24ŒBRANCH�ON�BLANKŠCMP.B‚#'0',(A1)$ŠBLO.S‚ASCHB30ŒBRANCH�ON�NON-NUMERICŠCMP.B‚#'9',(A1) ŠBLS.S‚ASCHB23ŒBRANCH�IF�NUMERICŠCMP.B‚#'A',(A1) ŠBLO.S‚ASCHB30ŒBRANCH�IF�NOT�HEXŠCMP.B‚#'F',(A1) ŠBHI.S‚ASCHB30ŒBRANCH�IF�NOT�HEXŠSUB.B‚#7,D2ŽCORRECTION�FOR�A-F ASCHB23ƒADD.L‚#2,(A7)ASCHB24ƒADD.L‚#2,(A7)!ASCHB30ƒADD.B‚(A1)+,D2‹ADVANCE�A1ŠSUB.B‚#'0',D2ŒBINARY�TO�D2ŠRTSŠPAGE 9*********************************************************-*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINEŒ**·*.*‚CONVERTS�BINARY�IN�D0�AND�PUTS�ASCII�DIGIT‹***…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.Œ***…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.Œ*-*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED‰*"*…IN�D1�IN�THE�CALLING�SEQUENCE.”**·**‚CALLING�SEQUENCE:¤*#*…MOVE.L�,�D0“**…MOVE.L�,D1š*3*…MOVE.L�,A0ƒ**…BSR�BINDASC§**·* *‚RETURNS:­**…D0�=�0�=>GOOD�CONVERSIONš**·**‚REGS�USED:‚0�1�2�3�4�5�6�7š* *ŠDƒ*�P�P¤* *ŠAƒP�P¦*9*********************************************************  !BINDASCƒMOVEM.L�D1/D2/A0/A1,-(A7)ŠMOVE.L�#8,D2ŽMAX�NO.�DIGITSŠSUB.L‚D1,D2ŽNO.�DIGITS�TO�SKIP!ŠBMI.S‚BINDASC5‹BRANCH�ERROR�EXITŠLSL.L‚#2,D2ŽDOUBLE�WORD�LENGTH!ŠLEA„TENS-A(A6),A1†START�OF�TABLE"ŠADD.L‚D2,A1ŽADJUST�FOR�DIFFERENCE&ŠMOVE.W�#'‚',D2‹INITIALIZE�ACCUMULATOR %BINDASC1‚SUB.L‚(A1),D0ŒSUBTRACT�10**NŠBCS.S‚BINDASC2‹BRANCH�TOO�BIG*ŠADD.W‚#1,D2ŽINCREMENT�CURRENT�DIGIT�COUNTŠBRA„BINDASC1‹CONTINUE )BINDASC2‚ADD.L‚(A1)+,D0‹RESTORE,�ADV�PNTRŠTST.L‚(A1)�TEST�DONEŠBEQ.S‚BINDASC4‹BRANCH�DONE ŠCMP.W‚#'‚',D2‹LEADING�ZERO�TEST!ŠBEQ.S‚BINDASC3‹BRANCH�STILL�ZERO#ŠADD.B‚#$10,D2ŒBRING�TO�ASCII�DIGIT %BINDASC3‚MOVE.B�D2,(A0)+‹DEPOSIT�CHARŠLSL„#8,D2ŽSAVE�CHAR�DEPOSITED#ŠMOVE.B�#$20,D2ŒRESTORE�LS�TO�SPACEŠBRA„BINDASC1‹CONTINUE 4BINDASC4‚ADD.B‚#$10,D2ŒLAST�ONE�BECOMES�DIGIT�ALWAYS "ŠMOVE.B�D2,(A0)+‹DEPOSIT�LAST�CHAR'ŠTST.L‚D0‘SET�CONDITION�CODE,�0�IF�GOOD"BINDASC5‚MOVEM.L�(A7)+,D1/D2/A0/A1ŠRTS  7TENS†DC.Lƒ10000000,1000000,100000,10000,1000,100,10,1,0 ŠPAGE .**********************************************&*�XFRABORT�TESTS�CONDITION�CODES.‚IFˆ*$*ƒEQUAL,�RTS�IS�MADE.‚IF�NOT�EQUALˆ*$*ƒBSR�ADDRESS�FROM�STACK�IS�PLACED‰*(*ƒINTO�A0�AND�SELF�ABORT�IS�PERFORMED.…*.* XABORT ENTRY POINT UNCONDITIONALLY ABORTS. *.**********************************************  XFRABORT‚BEQ.S‚ABORTS)XABORT„MOVE.L�D0,-(A7)‹SAVE�D0�FOR�A�LOOKŠMOVE.L�#ABORT,D0ŠTRAPƒ#1 ABORTS„RTS PATCH…DS.Bƒ50‘PATCH�AREAŠEND„XFRéééééé=/* =/*†ULOAD.LF=/*&=/* Link chain file to create ULOAD.LO=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to ULOAD.LL=/*=/IFC \1ƒ=ARG�ULOAD.LL=/ENDIF=/*=LINK ,ULOAD.LO,\1;HAMIX ATTRIBUTES PINPUT ULOAD.ROLIB 0.&.PASVMDOS.ROLIB 0.&.PASCALIB.ROEND=/*=ENDééééé é=/* =/*†ULOAD.PF=/*M=/* Chain file to compile ULOAD which is associated with the TRANSFER utility=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to ULOAD.PL=/*@=/* NOTE: this chain file requires the pascal compiler reside on9=/*‡the�system�default.�The�compiler�is�not�provided�with7=/*‡this�product,�therefore�this�chain�file�will�abort.=/*=/IFC \1ƒ=ARG�ULOAD.PL=/ENDIF=/*=PASCAL ULOAD.SA,ULOAD.PC,\1=/*{ Included files are:=/*ƒ--�none�--=/*}=PASCAL2 ULOAD.PC,ULOAD.RO;-L=/*=ENDééééé$PROGRAM UPLOAD(INPUT,OUTPUT,OUTFIL); E(*******************************************************************)C(*�THIS�PROGRAM�READS�PACKED�BLOCKS�FROM�THE�TERMINAL,�SEPARATESƒ*)?(*�INDIVUDUAL�RECORDS�AND�WRITES�THEM�TO�AN�OUTPUT�FILE.‚THE†*))(*�PROGRAM�RUNS�ON�AN�EXORMACS�SYSTEM.�*)E(*******************************************************************) "CONST�CMAX‚=‚132;Š(*�BLOCK�SIZE�*)&†RMAX‚=‚132;Š(*�MAXIMUM�RECORD�SIZE�*)5†BLKCNT=‚1;Œ(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*),†BMAX‚=‚132;Š(*�BUFFER�SIZE�=�BLKCNT*CMAX�*)/†OPTION�=�'AA';‰(*�COM/CHAR�PROTOCOL�OPTIONS�*),†CHRMAX�=�127;Š(*�MAXIMUM�CHARACTER�VALUE�*) TYPE‚CINDEXƒ=‚0..255;$†RECTYPE‚=‚ARRAY(.1..RMAX.)�OF�CHAR;*†BFTYPEƒ=‚PACKED�ARRAY(.1..BMAX.)�OF�CHAR;†BFINDEX‚=‚INTEGER;*†BKTYPEƒ=‚PACKED�ARRAY(.1..CMAX.)�OF�CHAR; VARƒQ…:‚BOOLEAN; †OUTFIL:‚TEXT;–(*�OUTPUT�FILE�*)D†ASCII�:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ASCII�CHARACTER�CODES�*)@†ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;„(*�FOR�HEX�CONVERSION�*)#(,+074.8 E†NUMƒ:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ACCII-DECIMAL�CONVERSION�*))†RECƒ:‚RECTYPE;“(*�HOLDS�OUTPUT�RECORD�*)1†BUFFP�:‚BFINDEX;“(*�INDEX�INTO�HOLDING�BUFFER�*)$†BUFF‚:‚BFTYPE;”(*�HOLDING�BUFFER�*)3†COUNT�:‚INTEGER;“(*�HOLDS�CHAR�COUNT�FOR�RECORD�*)/†RESPONSE:�CHAR;•(*�HOLDS�RESPONSE�CHARACTER�*)4†BCNT‚:‚INTEGER;“(*�NUMBER�OF�REPEATED�CHARACTERS�*)&†BCHR‚:‚CHAR;–(*�REPEATED�CHARACTER�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; ŒCˆ:‚CHAR; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO‰BEGIN9‰ASCII(.CHR(I).)�:=�0;‰(*�INDICATE�NON-ASCII�CHARCTERS�*)‰NUM(.CHR(I).)�:=�0‰END;†REWRITE(OUTFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno');†FOR�I�:=�1�TO�36�DO‰NUM(.ASHEX(.I.).)�:=�I�-�1;†BUFFP�:=�BLKCNT*CMAX+1;†BUFF(.3.)�:=�'A';/†WRITE(OUTPUT,'PREAMBLEU');‰(*�SEND�PREAMBLE�*)(†WRITE(OUTPUT,OPTION);Ž(*�SEND�OPTION�*),†WRITE(OUTPUT,CMAX:3);Ž(*�SEND�BLOCK�SIZE�*)1†WRITELN(OUTPUT,BLKCNT:1);Š(*�SEND�BLOCK�COUNT�*)†RESPONSE�:=�'�';†END;‚(*�INITIALIZE�*)  .PROCEDURE GETREC(VAR Q:BOOLEAN; VAR P:BFINDEX;6“VAR�BUFF:BFTYPE;�VAR�REC:RECTYPE;�VAR�RESPONSE:CHAR); VARƒI,Jƒ:‚INTEGER;†C1,C2�:‚CHAR; GƒPROCEDURE�GETFRAME(VAR�BUFF:BFTYPE;�VAR�Q:BOOLEAN;�VAR�RESPONSE:CHAR);  ƒVARƒI…:‚INTEGER; ‰J…:‚INTEGER; ‰K…:‚INTEGER;‰CKSUM1:‚INTEGER;‰CKSUM2:‚INTEGER;‰TBLOCK:‚BKTYPE; †BEGIN�(*�GETFRAME�*) †IF�BUFF(.3.)�=�'Z'†THEN ‰Q�:=�TRUE; †IF�NOT�Q†THEN‰REPEATŒI�:=�1;ŒJ�:=�1;ŒIF�RESPONSE�<>�'�';ŒTHEN�WRITELN(OUTPUT,RESPONSE);�(*�RESPOND�TO�LAST�FRAME�*)ŒWHILE�J�<=�BLKCNT�DO�BEGIN�READLN(INPUT,TBLOCK); �J�:=�J�+�1;�FOR�K�:=�1�TO�CMAX�DO’BEGIN’BUFF(.I.)�:=�TBLOCK(.K.); ’I�:=�I�+�1;’END;�IF�BUFF(.1.)�=�'T'�THEN*’J�:=�BLKCNT�+�1;‚(*�FORCED�TERMINATION�*)�END;ŒQ�:=�BUFF(.1.)�=�'T'; ŒIF�NOT�QŒTHEN�BEGIN�RESPONSE�:=�'N';2�CKSUM1�:=�16*NUM(.BUFF(.1.).)�+�NUM(.BUFF(.2.).);�IF�CKSUM1�<>�0�THEN’BEGIN ’CKSUM2�:=�0;’FOR�I�:=�3�TO�BLKCNT*CMAX�DO%•CKSUM2�:=�CKSUM2+ASCII(.BUFF(.I.).); ’CKSUM2�:=�(CKSUM2�MOD�255)�+�1;’IF�CKSUM1�<>�CKSUM2’THEN•RESPONSE�:=�'R'Œ(*�NAK�*)’END;�(*THEN*) �END�(*THEN*)‰UNTIL�(RESPONSE�=�'N')�OR�(Q)†END;�(*�GETFRAME�*)  ;ƒPROCEDURE�GETC(VAR�C:CHAR;�VAR�BUFF:BFTYPE;�VAR�P:BFINDEX;•VAR�Q:BOOLEAN); †BEGIN�(*GETC*)†IF�P�<=�BLKCNT*CMAX†THEN‰BEGIN‰C�:=�BUFF(.P.); ‰P�:=�P�+�1‰END†ELSE‰BEGIN‰GETFRAME(BUFF,Q,RESPONSE);‰C�:=�BUFF(.4.);‰P�:=�5‰END†END;�(*GETC*)  ƒBEGIN�(*�GETREC�*)2ƒGETC(C1,BUFF,P,Q);‹(*�DIGIT�#1�OF�LENGTH�FIELD�*)2ƒGETC(C2,BUFF,P,Q);‹(*�DIGIT�#2�OF�LENGTH�FIELD�*)ƒIF�C1�=�'�'�THEN�Q�:=�TRUE; ƒIF�NOT�QƒTHEN†BEGIN#†COUNT�:=�NUM(.C1.)*16�+�NUM(.C2.);†J�:=�1;†I�:=�1;†WHILE�I�<=�COUNT�DO‰BEGIN‰GETC(REC(.J.),BUFF,P,Q);‰IF�REC(.J.)�=�'|'‰THENŒBEGIN4ŒGETC(BCHR,BUFF,P,Q);„(*�GET�COMPRESSED�CHARACTER�*)(ŒGETC(C1,BUFF,P,Q);†(*�GET�COUNT�CODE�*)8ŒBCNT�:=�NUM(.C1.);†(*�COUNT�OF�COMPRESSED�CHARACTERS�*)ŒWHILE�BCNT�>�0�DO�BEGIN5�REC(.J.)�:=�BCHR;„(*�EXPAND�COMPRESSED�CHARACTERS�*)�BCNT�:=�BCNT�-�1; �J�:=�J�+�1�END;%ŒI�:=�I�+�3Ž(*�ADVANCE�GET�COUNTER�*) ŒENDƒ(*THEN*)‰ELSEŒBEGIN&ŒI�:=�I�+�1;�(*�ADVANCE�GET�COUNTER�*)&ŒJ�:=�J�+�1;�(*�ADVANCE�PUT�POINTER�*) ŒENDƒ(*ELSE*)‰END;‚(*WHILE*)†COUNT�:=�J�-�1;†END‚(*�THEN�*)ƒEND;�(*�GETREC�*)  5PROCEDURE PUTREC(VAR COUNT:INTEGER; VAR REC:RECTYPE); ƒVARƒI‚:‚INTEGER; ƒBEGIN�(*�PUTREC�*)ƒI�:=�1;ƒWHILE�I�<=�COUNT�DO†BEGIN †WRITE(OUTFIL,REC(.I.)); †I�:=�I+1†END;ƒWRITELN(OUTFIL);ƒEND;�(*�PUTREC�*) BEGIN„(*�MAIN�*) INITIALIZE; Q := FALSE;"GETREC(Q,BUFFP,BUFF,REC,RESPONSE);WHILE NOT Q DOƒBEGINƒPUTREC(COUNT,REC);#ƒGETREC(Q,BUFFP,BUFF,REC,RESPONSE);ƒEND;,WRITELN(OUTPUT,'T')�(*�TERMINATE�WITH�'T'�*)END.…(*�MAIN�*)éé‹integer�function�ATOI(�ALPHA�) ŽcharacterˆALPHA ŽcharacterˆCHARS*35 ŽintegerŠI .ŽCHARS�=�'123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' ŽATOI�=�0Ždo�3�I�=�1,�35"‘if�(ALPHA�.eq.�CHARS(�I:I�))�then ”ATOI�=�I”return‘end�if 3�continue ŽATOI�=�-1Žreturn ‹end ‹integer�function�X2TOI(�X2�) �characterˆX2*2 �characterˆHEX*16 �integerŠI�integerŠRESULT �logicalŠFND1 �logicalŠFND2 �X2TOI�=�0�HEX�=�'0123456789ABCDEF' �RESULT�=�0�FND1�=�.false.�FND2�=�.false.�do�5�I�=�1,�16$�if�(X2(�1:1�)�.eq.�HEX(�I:I�))�then!“RESULT�=�RESULT�+�((I�-�1)�*�16)“FND1�=�.true.�end�if$�if�(X2(�2:2�)�.eq.�HEX(�I:I�))�then“RESULT�=�RESULT�+�(I�-�1)“FND2�=�.true.�end�if 5Œcontinue�if�(�FND1�.and.�FND2�)�then�X2TOI�=�RESULT�else �X2TOI�=�-1�end�if�return Šend !Šsubroutine�INIT(�BUFF,�P,�RESP�) �characterˆBUFF*(*) �integerŠP�characterˆRESP �include�'common' �characterˆPRAMBL*8�characterˆDEST<CA<E=I>M!�characterˆOPTION*2 �dataˆPRAMBL/'PREAMBLE'/�dataˆDEST/'U'/�dataˆOPTION/'AA'/ �P�=�133�BUFF(�3:3�)�=�'A'�write�(6,�200)�PRAMBL�write�(6,�200)�DEST�write�(6,�200)�OPTION�write�(6,�200)�'132'�write�(6,�100)�'1' �RESP�=�'�'�return 100Šformat�(A)200Šformat�(A$)Šend #Šsubroutine�GETFRM(�BUFF,�Q,�RESP�) �characterˆBUFF*(*) �logical�Q�characterˆRESP �include�'common' �integer�I �integer�J�integer�CKSUM1�integer�CKSUM2�integer�X2TOI  �if�(�BUFF(�3:3�)�.eq.�'Z')�then “Q�=�.true.�end�if�if�(�.not.�Q�)�then'C“do�until�(�RESP�.eq.�'N'�)�.or.�(�Q�) 10“continue˜if�(�RESP�.ne.�'�'�)�then›write�(6,�100)�RESP˜end�if˜do�20�J�=�1,�BLKCNT›read�(5,�400)�BUFF400›format�(�A132�)!›if�(�BUFF(�1:1�)�.eq.�'T'�)�then  Q�=�.true. return›end�if 20˜continue ˜RESP�=�'N'˜CKSUM1�=�X2TOI(BUFF(�1:2�))˜if�(�CKSUM1�.lt.�0�)�then ›RESP�=�'R'˜end�if˜if�(�CKSUM1�.ne.�0�)�then ›CKSUM2�=�0›do�40�I�=�3,�132! CKSUM2�=�CKSUM2+ichar(BUFF(I:I)) 40›continue›CKSUM2�=�mod(CKSUM2,�255)�+�1›if�(�CKSUM1�.ne.�CKSUM2�)�then  RESP�=�'R'›end�if˜end�if.“if�((�RESP�.ne.�'N'�)�.and.�(�.not.�Q�))�then –go�to�10“end�if�end�if�return 100‹format�(A)‹end '‹subroutine�GETC(�C,�BUFF,�P,�Q,�RESP�) �characterˆC�characterˆBUFF*(*) �integer�P �logical�Q�characterˆRESP �include�'common' �if�(�P�.le.�132�)�then“C�=�BUFF(�P:P�) “P�=�P�+�1�else“call�GETFRM(�BUFF,�Q,�RESP�)“C�=�BUFF(�4:4�)“P�=�5�end�if�return 100‹format�(A)‹end 3‹subroutine�GETREC(�Q,�P,�BUFF,�REC,�RESP,�CHRCNT�) �logical�Q �integer�P�characterˆBUFF*(*)�characterˆREC*(*)�characterˆRESP�integer�CHRCNT �integer �I �integer�J �integer�K�integer�X2TOI �integer�ATOI �integer�BCNT�characterˆLEN*2�characterˆBCHR�characterˆLCHR *�call�GETC(�LEN(�1:1�),�BUFF,�P,�Q,�RESP�)*�call�GETC(�LEN(�2:2�),�BUFF,�P,�Q,�RESP�) �if�(�LEN(�1:1�)�.eq.�'�'�)�then “Q�=�.true.�end�if�if�(�.not.�Q�)�then“CHRCNT�=�X2TOI(LEN(�1:2�))“if�(�CHRCNT�.lt.�0�)�then1˜write�(0,�100)�'uload:�FATAL�Transmission�error'˜stop“end�if“J�=�1“I�=�1C“do�while�(�I�.le.�CHRCNT�)50“if�(�I�.le.�CHRCNT�)�then*˜call�GETC(�REC(�J:J�),�BUFF,�P,�Q,�RESP�) ˜if�(�REC(�J:J�)�.eq.�'|'�)�then$›call�GETC(�BCHR,�BUFF,�P,�Q,�RESP�)$›call�GETC(�LCHR,�BUFF,�P,�Q,�RESP�)œBCNT�=�ATOI(�LCHR�)›if�(�BCNT�.gt.�0�)�then do�60�K�=�J,�J�+�BCNT�-�1§REC(�K:K�)�=�BCHR 60 continue  J�=�J�+�BCNT›else  J�=�J�+�1 REC(�J:J�)�=�BCHR  J�=�J�+�1 REC(�J:J�)�=�LCHR  J�=�J�+�1œend�if ŸI�=�I�+�3œelse ŸI�=�I�+�1 ŸJ�=�J�+�1›end�if ›go�to�50“end�if“CHRCNT�=�J�-�1�end�if�return 100‹format�(A)‹end  ‹subroutine�PUTREC(�COUNT,�REC�) �integer�COUNT�characterˆREC*(*) �integer�I �do�70�I�=�1,�COUNT“write�(7,�200)�REC(�I:I�) 70�continue�write�(7,�100)�return 100‹format�(A)200‹format�(A$)‹end ˆPROGRAM�UPLOAD ˆcharacterˆBUFF*132ˆcharacterˆREC*132ˆcharacterˆRESP ˆlogical�Qˆinteger�BUFFPˆinteger�RECLENˆcharacter‡ID*50 ˆinclude�'common' ,ˆdata„ID/'@(#)uload.f:1.3ˆ8/4/83(13:31:48)'/ˆdataˆCMAX/132/ˆdataˆRMAX/132/ˆdataˆBLKCNT/1/ˆdataˆBMAX/132/ˆdataˆEOTRAN/'T'/ˆdataˆCHRMAX/127/ ˆrewind�7 ˆcall�INIT(�BUFF,�BUFFP,�RESP�) ˆQ�=�.false.1ˆcall�GETREC(�Q,�BUFFP,�BUFF,�REC,�RESP,�RECLEN�)Cˆdo�while�(�.not.�Q�)80ˆif�(�.not.�Q�)�thenŒcall�PUTREC(�RECLEN,�REC�)1Œcall�GETREC(�Q,�BUFFP,�BUFF,�REC,�RESP,�RECLEN�) Œgo�to�80ˆend�ifˆwrite�(6,�100)�EOTRAN 100ˆformat�(A)ˆendéO*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**ˆMESSAGE�NUMBER�ALLOCATION*ˆ00000000�-�000002FF‹UTILITIES(*ˆ00000300�-�000004FF‹SESSION�MANAGEMENT*ˆ00000500�-�000006FF‹SYMBUG*ˆ00000700�-�000008FF‹BASIC�M$*ˆ00001000�-�00002FFF‹PASCAL�RUNTIME*ˆ00003000�-�000035FF‹FORTRAN$*ˆ00008000�-�0000FFFF‹USER�GENERATED/*ˆ00010000�-�FFFFFFFF‹VERSADOS�OPERATING�SYSTEM*O*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~O*------------------------------------------------------------------------------*–ERROR�MESSAGE�LINE�FORMATO*------------------------------------------------------------------------------*ˆCOLUMNS„CONTENT+*�1…*�TREATS�REMAINDER�OF�LINE�AS�A�COMMENT(*Š1-�8…KEY�VALUE�OF�ERROR�MESSAGE�IN�HEX*�9…SPACE�DELIMITER5*‰10-89…ERROR�MESSAGE�TEXT�AND�SUBSTITUTION�SENTINELSO*------------------------------------------------------------------------------*•ERROR�CODE�KEY�VALUE�FORMAT:*‹BITS„INTERPRETATION�(of�register�D0�following�trap�call)*Š0-15…ERROR�STATUS�CODE*‰16-26…DIRECTIVE�NUMBER3*‰27-30…TRAP�NUMBER‚(0�for�non-trap�related�errors)1*Œ31…RESERVED�(For�internal�error�classification)**˜BIT�POSITIONS*A*�3�3�2�2ƒ2�2�2�2ƒ2�2�2�2ƒ1�1�1�1ƒ1�1�1�1ƒ1�1�0�0ƒ0�0�0�0ƒ0�0�0�0A*�1�0�9�8ƒ7�6�5�4ƒ3�2�1�0ƒ9�8�7�6ƒ5�4�3�2ƒ1�0�9�8ƒ7�6�5�4ƒ3�2�1�0*A*�X�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�X*O*------------------------------------------------------------------------------0*ŽSUBSTITUTION�SENTINEL�FORMAT�IS�\Soo[ll][kkkk]'*„Where�\…Is�the�required�Sentinel�Flag0*ŠS…Is�one�of�the�Sentinel�Codes�explained�below6*Šoo„Is�the�decimal�offset�from�reg�A0�to�be�converted2*’and�inserted�at�this�point�in�the�error�message.,*’A0�norma lly�points�at�an�FHS�or�IOS�block.3*Šll„Is�a�length�value�required�only�for�Sentinel�C2*Škkkk‚Is�a�key�value�required�only�for�Sentinel�KO*------------------------------------------------------------------------------Q.Z+b+j4r,z(‚(Š*’%š!¢#ª$²#º(Â&Ê/Ò.Ú?â:ê1ò(ú( &#*"!*,*ŽSUBSTITUTION�SENTINEL�CODE�INTERPRETATIONS;*‚\Boo„Convert�1�byte�at�offset�oo�from�A0�to�Decimal�Ascii*‚\Woo‡"„2�bytes†"‡"‹"*‚\Loo‡"„4ƒ"ˆ"‡"‹"*‚\Xoo‡"„1�byte‡"‡"‰Hex�Ascii*‚\Yoo‡"„2�bytes†"‡"‹"*‚\Zoo‡"„4ƒ"ˆ"‡"‹"-*‚\Cooll‚Copyƒll�bytes†"‡"‰String�length�=�ll5*‚\Too„Translate�code‡"‡"‰Ascii�prose�from�this�file.2*”Error�Message�#ttoocccc�contains�the�prose�where+*£ttƒ=�original�trap�code�+�trap#4�(bit�29)*£ooƒ=�offset�from�A0�of�code%*£cccc�=�code�value�to�be�interpreted9*‚\Aoo„Convertƒregister�A0�to�Hex�Ascii�(oo�is�always�00)D*‚\Ioo„Copyƒ??�bytes�at�offset�0�from�Text�Plug�#oo�until�an�illegal&*”Ascii�char�{FF}�flags�end�of�string.I*‚\Kkkkk‚Copy‚all�of�Error�Message�#0000kkkk�expanding�any�of�it�embedded:*”sentinels�at�this�point�before�continuing�the�interpret-9*”ation�of�this�message.‚CRLF�issued�automatically�before *”the�insertion�of�message�kkkk.*J*‚\Doo„Will�eleminate�the�standard�error�message�text�of�task�name,sessionA*Šnumber,user�key�value,error�originator,and�the�variable�message6*Šsepartor�(**)�from�the�error�message�to�be�displayedO*------------------------------------------------------------------------------F*„TYPICAL�PROSE�TO�CAUSE�AN�ERROR�MESSAGE�FROM�THIS�FILE�TO�BE�PRINTED*‹.�.�.4*‹LEA‡IOSBLK,A0†Where�IOSBLK�is�usually�a�FHS�or�IOS#*‹TRAP†#n�Where�n�is�usually�2�or�31*‹BEQ‡CONT‹WHERE�CONT�IS�LABEL�FOR�GOOD�TRAP�CALL,*‹MOVEM.LƒD0/A0,ERRPBLK‚Save�regs�in�ERRPBLK5*‹LEA‡ERRPBLK,A0…Where�ERRPBLK�is�in�the�format�below,*‹MOVE.L„#2,D0ŠError�handler�is�directive�#2#*‹TRAP†#4�Invokes�the�Error�handler*‹.�.�.6*‚ERRPBLK‚DC.L†0ŽUSER�REG�D0‚CONTAINS�ERRMSG�KEY�VALUE6*‚ERRPBA0‚DC.L†0ŽUSER�REG�A0‚POINTS�AT�I/O�CONTROL�BLK)*‚ERRPOPT‚DC.B†0ŽERROR�OPTIONS�FUTURE�USE+*‚ERRPLDF‚DC.B†0ŽUSER�LDFLUN‚LUN�FOR�SCREEN*‚ERRPQUY‚DC.B†0ŽFUTURE�USE-*‚ERRPCDF‚DC.B†0ŽUSER�CDFLUN‚LUN�FOR�KEYBOARD2*‚ERRPLUGB�DC.L†0ŽBEGINNING�OF�USER�TEXT�PLUG�POOL,*‚ERRPLUGE�DC.L†0ŽEND�OF�USER�TEXT�PLUG�POOLL*„This�plug�pool�may�contain�multiple�strings�of�text�delimited�by�Hex�FF's.J*„Maximum�pool�length�is�96�bytes.‚Sentinels�\I01,\I02�....�etc.�cause�theJ*„deblocked�text�to�be�inserted�into�the�basic�error�message�format.‚PlugsL*„are�numbered�beginning�with�one�so�\I03�will�access�the�text�following�theJ*„second�FF�delimiter.‚This�plug�capability�provides�the�caller�with�a�wayH*„to�include�variable�message�content�from�a�source�external�to�the�parm!*„block�addressed�by�register�A0.O*------------------------------------------------------------------------------F*„The�utility�EMFGEN�converts�the�leading�Ascii�hex�number�to�a�4�byteD*„binary�key�value�in�the�process�of�creating�the�indexed�sequential=*„file�ERRORMSY.SY�used�by�the�Trap�#4�ERROR�MESSAGE�HANDLER.)*‹NOTE�:�ERROR�MESSAGE�00000000�IS�A�NULL7*’AND�CAN�BE�USED�IN�CONJUNCTION�WITH�ERRPLUGS�TO�PRINT,*’ONLY�THE�MESSAGE�CONTAINED�IN�THE�PLUGPOOL:*’THIS�MERELY�RELIEVES�THE�CALLER�FROM�DEFINING�IOS�BLOCKSO*------------------------------------------------------------------------------*2*ˆERRORMSG�FILE�GENERATION�UTILITY�EMFGEN�MESSAGES*7*ˆTHESE�MESSAGES�MUST�BE�THE�FIRST�MESSAGES�IN�THE�FILE*D000002FE KEY VALUE \I01 WILL NOT BE ADDED TO FILE ** INPUT ERROR\D00I000002FF KEY VALUE \I01 ERROR MESSAGE ADDED BUT TRUNCATED TO 84 BYTES\D00*O*------------------------------------------------------------------------------*O*------------------------------------------------------------------------------3*ˆKEY�VALUES�MUST�BE�H EX�--�UPPER�LIMIT�IS�000000FF*00000000 \I01\D00***"0000000C CMD=\T00 OPT=\T02 LU=\B0500000000D CMD=\T00 OPT=\T02 LU=\B05 DEVICE=\C060490000000E CMD=\T00 OPT=\T02 LU=\B05 PSN=\Z08 DEVICE=\C0604.0000000F FILE=\C0604:\W10.\C1208.\C2008.\C2802+00000010 CMD=\T00 OPT=\T02 LU=\B05 PSN=\Z36100000011 USE DEFAULT VOLUME = \C0804:\W14.\C1608.00000012 USER NUMBER = \W3400000013 USER TASK = \C240400000014 SESSION = \C040400000015 TERMINAL = \C2804(00000016�TASK�=�\C0004,‚SESSION�=�\C0404&00000017�TASK�=�\C0004,‚SESSION�=�\L04%00000018 --------------------> BREAK!!00000019 OPTION(S) SET = \I01\D00O*------------------------------------------------------------------------------**ˆNON-TRAP�RELATED�MESSAGES***’REFERENCE�IOE.SA�FOR�APPROPRIATE�EQUATES*00000100 INVALID ENTRY,00000101 SUBSTITUTION CAUSED BUFFER OVERFLOW00000102 ARGUMENT NOT FOUND00000103 INVALID OPTION00000104 INSUFFICIENT MEMORY00000105 OPTION CONFLICT"00000106 COMMAND LINE SYNTAX ERROR(00000107 INVALID DEVICE NAME FOR REQUESTO*------------------------------------------------------------------------------*"*ˆUSER�SESSION�MANAGEMENT�MESSAGES*200000300 \D00\I01 START SESSION \C0404 USER = \W42000000301 \D00\I01 END SESSION \C0404 USER = \W4200000302 \D00\K0018H00000303 SYSTEM VOLUME = \C0004:\K0011\K0012\K0013\K0014\K0015\K0019\D00!00000304 OPTION(S) SET = \I01\D00 00000305 \D0000000306 \D00\I01"00000307 \D00\C0004 \C1204: LOADED 00000308 \D00\C0004 \L12: LOADED#00000309 \D00\C0004 \C0404: STOPPED!0000030A \D00\C0004 \L04: STOPPED%0000030B \D00\C0004 \C0404: CONTINUED#0000030C \D00\C0004 \L04: CONTINUED&0000030D \D00\C0004 \C0404: TERMINATED$0000030E \D00\C0004 \L04: TERMINATED#0000030F \D00\C0004 \C0404: ABORTED!00000310 \D00\C0004 \L04: ABORTED'00000311 \D00LOGON REJECTED, LOGGED OFF000000312 \D00WARNING: NO."<" NOT EQUAL TO NO.">"J00000313 \D00------>CAUTION: YOU WILL CHANGE PASSWORD FOR USER = 0 <------00000314 \D00ER: NOT USER = 0+00000315 \D00ER: "\C0008" COMMAND NOT FOUND*00000316 \D00ER: "\C0604" VOLUME NOT FOUND200000317 \D00ER: NO. ARGUMENTS EXCEEDS STACK SPACE00000318 \D00ER: TASK NOT FOUND"00000319 \D00ER: INVALID TASK NAME(0000031A \D00ER: LUN \C0001 NOT ASSIGNED50000031B \D00ER: CANNOT BE CONTINUED, MUST BE STARTED:0000031C \D00ER: MUST BE STARTED INDIVIDUALLY BY TASK NAME80000031D \D00ER: NESTING LEVEL EXCEEDS NO. LUNS PER TASKC0000031E \D00ER: NO ROOM IN RETURN STACK SPACE (TOO MANY ARGUMENTS)#0000031F \D00ER: DEVICE NOT ALLOWED$00000320 \D00ER: "IF" LEVEL EXCEEDED(00000321 \D00ER: =/ENDIF's EXCEED =/IF's%00000322 \D00ER: CHAIN COMMAND SYNTAX$00000323 \D00RX=\Y00 RA=\Y02 RD=\Y04000000324 \D00ER: BATCH NOT ALLOWED IN BATCH MODE;00000325 \D00ER: LOGON TERMINAL NOT AVAILABLE IN BATCH MODE%00000326 \D00ER: BATCH SESSION NUMBER$00000327 \D00BATCH SESSION NOT FOUND&00000328 \D00ER: USER NUMBER NOT FOUND*00000329 \D00ER: NOT ALLOWED IN BATCH MODE0000032A \D00\C0404: QUEUED0000032B \D00\C0404: RUNNING,0000032C \D00\C0404: DONE STATUS = \Y02:\T02!0000032D \D00ER: BATCH QUEUE FULL'0000032E \D00BATCH JOB \C0404 CANCELLED!0000032F \D00ER: RECORD NOT FOUND#00000330 \D00ER: USER NO. NOT FOUND!00000331 \D00ER: INVALID USER NO.&00000332 \D00ER: MUST BE IN CHAIN MODE#00000333 \D00ER: VALUE SIZE TOO BIG(00000334 \D00ER: INVALID FILE DESCRIPTOR<00000335 \D00ER: NO CHANGE TO VOLUME,USER NUMBER, OR CATALOG+00000336 \D00ER: DEFAULT VOLUME NOT CHANGED,00000337 \D00ER: OPTION LETTERS ARE A-O ONLY:00000338 \D00ER: NOT ALLOWED ON LINE, SUBMIT IN BATCH MODE"00000339 \D00ER: INVALID LU NUMBER$0000033A \D00ER: FILE/DEVICE MISSING"0000033B \D00ER: ACCESS PERMISSION 0000033C \D00ER: VALUES REVERSED?0000033D \D00ER: YOU FAILED IN YOUR ATTEMPT TO CRASH THE SYSTEM0000033E \D00ER: COMMAND SYNTAX$0000033F \D00ER: FIELD SIZE EXCEEDED&00000340 \D00ER: FILE WAS NOT ASSIGNED+00000341 \D00ER: NUMERICAL CONVERSION ERROR O*------------------------------------------------------------------------------&*†START�OF�BASICM�ERROR�MESSAGES‚(MIL)O*------------------------------------------------------------------------------* Basic-m syntax error messagesO*------------------------------------------------------------------------------>00000701 Invalid logical expression in an IF or WHEN statement300000702 Missing THEN in an IF,ON or WHEN statement900000703 THEN must be followed by an executable statement.00000704 Incomplete bit selector (missing "]")C00000705 Illegal procedure name or bit selector not followed by "="00000706 Equal sign expected!00000707 Illegal branch statement800000708 GOTO or GOSUB not followed by valid line number700000709 CALL is not followed by a valid procedure name@0000070A Missing ")" in an argument list, selector or array size&0000070B Illegal arithmetic expression00000070C Missing ")" in an arithmetic expression#0000070D Illegal literal expression=0000070E Missing or invalid argument list in a POKE statement*0000070F Invalid unsigned integer constant00000710 Invalid exponent700000711 Filename must be a string variable or constant100000712 Invalid variable name in a DIM statement=00000713 Illegal or unspecified array size in a DIM statement>00000714 Illegal ADDRESS clause in a DIM or EXTERNAL statement=00000715 Illegal variable name in a BYTE or INTEGER statement?00000716 Missing address specification in an EXTERNAL statement-00000717 Illegal operands in a READ statement-00000718 Illegal operands in a DATA statement:00000719 Missing "#" in an OPEN, CLOSE or REWIND statement+0000071A Missing comma in an OPEN statement:0000071B Undefined data transfer mode in an OPEN statement0000071C Illegal file access30000071D "=" required in a LINE or DIGITS statement60000071E Illegal index name in a FOR or NEXT statement50000071F Index not followed by "=" in a FOR statement&00000720 Missing TO in a FOR statement&00000721 Invalid NEVER or ON statement;00000722 Invalid line number list in an ON...GOTO statement.00000723 IMAGE not followed by a format string+00000724 Illegal variable or procedure name300000725 Missing parethesis in a logical expression/00000726 Invalid line number in an EOF function$00000727 Invalid relational operator;00000728 Invalid or missing separator in an INPUT statement00000729 Invalid key70000072A No argumant list following the TAB keyword, or@0000072B Invalid operand in a MAT READ, INPUT or PRINT statement<0000072C Missing comma in a MAT INPUT or MAT PRINT statement50000072D Missing "=" in a matrix assignment statement>0000072E Expression not enclosed in [ ] in a MAT SET statement;0000072F Missing argumant in a MAT INV or MAT TRN statement"00000730 Illegal character scanned00000731 Illegal statement00000732 Statement too long:00000733 Missing argument list following a string function00000734 Invalid line number>00000735 Missing comma in argumant list of a built-in function=00000736 Missing "(" for argument list in a built-in function00000737 Missing separator100000738 Invalid key or logical unit number (LUN).00000739 String not allowed when LUN indicated%0000073A Invalid number of dimensionsK0000073B USING not followed by line number,format string or string variable-0000073C Unrecognized characters in statementB0000073D Data Block size expected after comma in an OPEN statement<0000073E Nesting of parenthesis forbidden in a format string/0000073F Access permission expected after comma00000740 Unbalanced parenthesis00000741 "]" expected00000742 Unexpected end of line!00000743 String constant expected=00000744 FAB (File Access Block) size is expected after comma(00000745 Illegal variable or string name=00000746 Illegal character scanned in beginning of expression(00000747 Operator expected in expression'00000748 Operand expected in expression00000749 Meaningless combinatonI0000074A Illegal number of dimensions in assigned variable or "=" missing"0000074B Num eric constant expected!0000074C String variable expected:0000074D Invalid variable name or invalid numeric constant#0000074E Missing TO or SUB after GO?0000074F TAB is not allowed in PRINT statement if USING appearsJ00000750 Illegal variable or procedure name,or string variable not allowed00000751 Unbalanced bracketsG00000752 Logical or relational operator not allowed in arithmetic expr.<00000753 More than one relational operator in a logical term800000754 GOTO or GO TO are not allowed in WHEN statement<00000755 ON ERROR must not appear in an IF or WHEN statement00000756 Too many dimensions000000757 Expected variable name or constant name=00000758 String variable not allowed in arithmetic expression-00000759 Missing arguments in INPUT statement>0000075A Expected option T or D after comma in CLOSE statement,0000075B Illegal entity in string expression0000075C Missing '('0000075D Missing ')'J0000075E String matrix and arithmetic matrix not allowed in same statement<0000075F�(RECORD�FREE)„Impossible�to�update�a�contigous�fileE00000760�illegal�operation�in�string�MAT‚(only�concatenation�allowed)E00000761 ZER/CON/IDN/SET/TRN/INV can operate on numeric matrices only000000762 NEXT not allowed as secondary statement100000763 value in brackets of SET must be numericA00000764 Illegal or missing line number in beginning of statement00000765 Invalid key after AT.00000766 Invalid format string in function STR700000767 Expected I,O,U after '%' in mode of OPEN file.D00000768 Expected mode of file (%I,%U,%O,%OV,%UV) in OPEN statement.900000769 GOTO not allowed in WHEN and ON INTR statements.,0000076A TRACE must be followed by ON or OFF50000076B missing '/' before the write protection.\D00F0000076C invalid or missing integer constant for write protection.\D00!0000076D matrix name missing.\D00-0000076E missing '=' after key-word RECL.\D00-0000076F missing '=' after key-word KEYL.\D00O*------------------------------------------------------------------------------ * Basic-m general error messagesO*------------------------------------------------------------------------------&00000770 Error \Z00 in trap 4 call\D0000000771 Rms error \Z00 \D00 00000772 Command line error \D0000000773 Bad options \D00"00000774 No such option \C0001\D0000000775 Bad z option\D0000000776 No '=' after z\D0000000777 '=' not allowed\D0000000778 No input file\D00&00000779 \Z00 edit file name error\D00 0000077A \Z00 access problem\D00.0000077B Overflow! request bigger z option\D00/0000077C Waiting for \L00 k-bytes of memory\D00*0000077D Overflow! resequence not done\D00"0000077E bad function no. \L00\D000000077F file already exits\D00"00000780 symbol table overflow\D00/00000781 warning! updated file is not saved\D00700000782 Can not run, compilation errors in program\D00J00000783 Can not assign logical unit 5 to user program, run terminated\D00J00000784 Can not assign logical unit 6 to user program, run terminated\D00F00000785 Can not load run-time lo, error code \A00, run terminated\D00'00000786 Illegal interupt vector number400000787 GOTO is not allowed in interrupt processing100000788 LOGEN - unable to open \P temporary file500000789 LOGEN - unable to assign run-time library LO50000078A LOGEN - error in run-time library Lo reading>0000078B LOGEN - unable to read the \P temporary file, rc = \N10000078C LOGEN - run-time routine \P not in index?0000078D LOGEN - user routine \P was not added to library indexF0000078E LOGEN - unable to write a record to a temporary file, rc = \N40000078F LOGEN - run-time library index format error500000790 WHEN is used without D option - WHEN ignored700000791 TRACE is used without D option - TRACE ignoredN00000792 LOGEN - unable to write last record on the \P temporary file, rc = \N@00000793�LOGEN�-�unable�to�rewind�the‚\P�temporary�file,�rc�=�\NO00000794 LOGEN - attempt to write \N bytes to LO. Too big (more then one block),00000795 RUN - unable to start user task\D00 $00000796 illegal logical unit number00000797 illegal FAB size00000798 illegal block size00000799 illegal record length50000079A conflict between formal and actual parameter,0000079B a subscript can't be of string typeB0000079C a logical primary must be either a relation or 'EOF(lun)'$0000079D missing '[' in bit-selectorJ0000079E bit selector is allowed only for simple-variable or array-elementI0000079F left side of assignment must be simple variable or array elementA000007A0‚INTERNAL:�"bin_code"�-�Illegal�operation�code�passed:�\NA000007A1‚INTERNAL:�"bin_tert"�-�Illegal�operation�code�passed:�\NL000007A2‚INTERNAL:�"nextwork"�-�Too�many�work-registers�needed�by�"bin_code"B000007A3‚INTERNAL:�"bin_special"�-�Illegal�command-code�passed:�\NG000007A4‚INTERNAL:�"bnflsmpl"�-�Illegal�var-kind�in�simple-var�node:�\NG000007A5‚INTERNAL:�"bnflarray"�-�Illegal�var-kind�in�array-var�node:�\NM000007A6‚INTERNAL:�"bnflopnd/bnflrutn"�-�Illegal�operand�node-type�passed:�\NH000007A7‚Code�size�is�greater�than�32KB�which�conflicts�with�'-B'�optionL000007A8‚INTERNAL:�"bincre"�-�Illegal�operand�address-mode�(MDxxx)�found:�\NN000007A9‚INTERNAL:�"binpseud"�-�Illegal�operand�address-mode�(MDxxx)�found:�\NE000007AA‚INTERNAL:�"binwrt"�-�Illegal�reacod-code�(WR_xxx)�passed:�\N;000007AB‚INTERNAL:�"binclose"�-�Write�on�ro-file�failed:�\PG000007AC‚STRING-CONSTANTS�and�FORMATS�section�size�is�greater�that�32KB5000007AD‚INTERNAL:�"binopen"�-�Can't�open�ro-file:�\PC000007AE‚INTERNAL:�"bntmopen"�-�Can't�re-open�temporary�ro-file:�\PD000007AF‚INTERNAL:�"bntmread"�-�Read�of�temporary�ro-file�failed:�\P;000007B0‚INTERNAL:�"bnwrbyte"�-�Write�on�ro-file�failed:�\P@000007B1‚INTERNAL:�"bncaddoff"�-�Illegal�address�mode�passed:�\N000007B2‚bad�assignmentE000007B3‚INTERNAL:�"bin_cmnd"�-�Width�of�machine-command�is�undefinedG000007B4‚digits�cannot�be�separated�by�'�'�in�IMAGE�statement�(use�'!')&000007B5‚quotation�mark�('"')�expected(000007B6�\D00‚CLOSE�of�input�file�failed)000007B7�\D00‚Access�of�input�file�failed5000007B8�\D00‚Failed�to�check�existence�of�input�file-000007B9�\D00‚WARNING�-�input�file�not�found!.000007BA�\D00‚ALLOCATION�of�E-code�file�failed"000007BB�\D00‚Input�file�NOT�FOUND6000007BC�\D00‚Line�number�not�in�order�after�line�\L00?000007BD same matrix in both sides of '=' in MAT MULTIPLICATION2000007BE 3-dimensional array in MAT MULTIPLICATION:000007BF INTERNAL: "Code_Gen" - Unrecognizable i-operation"000007C0�\D00‚Illegal�command�line(000007C1�\D00‚Illegal�input�file-name(s)&000007C2�\D00‚Allocation�of�ASQ�failed#000007C3�\D00‚Initialization�failed@000007C4�\D00‚Open�of�E-code�file,�after�initialization,�failed.N000007C5�\D00‚WARNING:�second�file-name�with�R-option�is�illegal.�Name�ignored0000007C6�\D00‚WARNING:�Listing�file�name�ignored1000007C7‚Illegal�parameters�for�built-in�function000007C8‚Illegal�expression000007C9000007CA=000007CB�\D00‚Unable�to�close�E-CODE�file�before�LIST�or�SAVE<000007CC�\D00‚Unable�to�open�E-CODE�file�before�LIST�or�SAVEB000007CD�\D00‚Unable�to�assign�E-CODE�file�back�after�LIST�or�SAVE9000007CE�\D00‚Unable�to�close�EMH�FILE�after�LIST�or�SAVEG000007CF�\D00‚Unable�to�get�a�syntax-error�message�text�in�LIST�or�SAVE5000007D0�\D00‚Unable�to�output�a�line�in�LIST�or�SAVE<000007D1�\D00‚Unable�to�close�E-CODE�file�after�LIST�or�SAVEO000007D2 \D00Unable to close output file after LIST or SAVE, file may be damage1000007D3�\D00‚Unable�to�delete�the�requested�line:000007D4�\D00‚Unable�to�close�EMH�file�after�adding�a�lineN000007D5�\D00‚Unable�to�get�a�syntax-error�message�text�after�a�new�line�added9000007D6�\D00‚Unable�to�close�E-CODE�file�for�DEL�command4000007D7�\D00‚Unable�to�delete�a�line�in�DEL�command8000007D8�\D00‚Unable�to�open�E-CODE�file�for�DEL�command9000007D9�\D00‚Unable�to�position�E-CODE�file�before�RESEQ5000007DA�\D00‚Unable�to�close�E-CODE�file�befor�RESEQ4000007DB�\D00‚Unable�to�assign�E-CODE�file�for�RESEQ.000007DC�\D00‚Unable�to�open�RESEQ�output�file7000007 DD�\D00‚Unable�to�close�old�E-CODE�file�for�RESEQM000007DE�\D00‚Unable�to�write�last�record�to�new�E-CODE�file�in�RESEQ�command?000007DF�\D00‚Unable�to�delete�old�E-CODE�file�in�RESEQ�command?000007E0�\D00‚Unable�to�rename�new�E-CODE�file�in�RESEQ�command>000007E1�\D00‚Unable�to�close�new�E-CODE�file�in�RESEQ�commandA000007E2�\D00‚Unable�to�open�current�E-CODE�file�in�RESEQ�commandF000007E3�\D00‚Unable�to�assign�the�new�E-CODE�file�after�RESEQ�command7000007E4�\D00‚Unable�to�output�a�line�in�SYMBOL�commandI000007E5�\D00‚Unable�to�write�last�block�of�output�file�in�SYMBOL�command;000007E6�\D00‚Unable�to�close�output�file�in�SYMBOL�commandM000007E7�\D00‚Unable�to�close�E-CODE�file�after�range�counting�in�DEL�commandK000007E8�\D00‚Unable�to�assign�E-CODE�file�to�keyed�deleting�in�DEL�commandJ000007E9�\D00‚Unable�to�position�E-CODE�file�on�first�record�to�be�deletedI000007EA�\D00‚Unable�to�position�E-CODE�file�on�last�record�to�be�deleted;000007EB�\D00‚Unable�to�close�E-CODE�file�after�DEL�command<000007EC�\D00‚Unable�to�assign�E-CODE�file�after�DEL�commandJ000007ED�\D00‚Unable�to�write�an�output�record�to�new�E-CODE�file�in�RESEQ/000007EE�\D00‚Unable�to�open�SYMBOL�output�file.000007EF�\D00‚Unable�to�display�an�output�line)000007F0�\D00‚Unable�to�get�an�input�line:000007F1�\D00‚Unable�to�add�next�record�of�E-CODE�to�block3000007F2�\D00‚Unable�to�add�a�record�to�E-CODE�file=000007F3 Missing ENDEF / nesting of DEF statements is illegal9000007F4 Expected array name - array declaration missing.B000007F5 Definition must preceed use - name in DEF is already used0000007F6 Illegal transfer into a FOR or IF block)000007F7 Reference to illegal line numberC000007F8 ELSE or ENDIF statement without cooresponding IF statement0000007F9 FOR and IF statements nested too deeply#000007FA STEP size must not be zero.000007FB Anything after a statement is illegal000007FC Illegal statement typeH000007FD LOGEN - Unable to get a segment for the generated LO, rc is \N.-000007FE Reference to non-exstent line number7000007FF type of variables missing in a LOCAL statement00000800 illegal key lengthN00000801 The argument of LOC function must be either variable or array element00000802 illegal record number!00000803 illegal number of DIGITS00000804 illegal width of LINE00000805 illegal value of TAB400000806 impossible to specify FAB to contigous file400000807 key may be specified only for indexed files300000808 bad type of argument of intrinsic function00000809 illegal expressionE0000080A�illegal�operation�in�string�MAT‚(only�concatenation�allowed)10000080B value in brackets of SET must be numericE0000080C ZER/CON/IDN/SET/TRN/INV can operate on numeric matrices only00000080D NEXT not allowed as secondary statement"0000080E expected integer constant0000080F overflow in number800000810 bit-operand is illegal in INPUT/READ statements'00000811 incorrect number of parametersD00000812 impossible to specify 'overwrite' option for contigous file:00000813 'T' option is not available - option 'T' ignored.00000814 underflow in number00000815 illegal real number600000816 conflict with prior definitions - illegal '('100000817 missing parameter list or array selectorC00000818 conflict with prior definitions - subroutine name expectedJ00000819 conflict with prior definitions - sub-program in left side of '='60000081A conflict with prior definitions - missing '('40000081B array selector not allowed in MAT statement-0000081C expected array name in MAT statementH0000081D conflict with prior definitions - DEF/EXTERNAL must precede useK0000081E specifications must be in one statement and precede any use of var@0000081F external procedure forbidden as parameter / illegal '('@00000820 parameter name appears more than once in parameter list=00000821 local name appears more than once in LOCAL statementA00000822 local variable has been previously declared as parameterK00000823 variable af ter ADDRESS must be an already declared simple variable;00000824 expected simple variable as index of FOR statement<00000825 illegal READ/INPUT - variable is a sub-program name600000826 missing parenthesis or variable is not simple700000827 type of variables missing in a LOCAL statementM00000828 LOCAL statement allowed only in sub-program - check statements order+00000829 illegal operator for string matrixA0000082A array declarator for variable missing in a DIM statement10000082B string length must be in the range 1-25530000082C data-type of string length must be numeric;0000082D adjusted string length must be passed as parameter0000082E missing ')'90000082F equivalence between local and global not allowed.00000830 fatal! check scanalyzer and getsynu()00000831 doublely defined00000832 too many dimensions=00000833 only dummy array can contain variables as dimensions@00000834 dimension in array declarator must be a simple variable/00000835 variable dimension must be a parameter00000836 illegal dimension)00000837 missing ')' for array declarator600000838 array declarator must be of numeric data type 00000839 procedure name expected+0000083A illegal delimitor in DEF statement90000083B expected parameter after comma in parameter list10000083C missing sub-program name or '(' after it20000083D internal error in elesize() - missing dtp80000083E internal error in elenum() - missing dimensions"0000083F internal error in space() 00000840 incorrect internal type!00000841 illegal number of commas.00000842 unary minus must have numeric operand<00000843 operand(s) of IAND/IOR/IEOR must be of integer typeH00000844 operand of INOT must be of integer type (BYTE/INTEGER/DINTEGER);00000845�operand�of�FLOAT�or�DFLOAT‚must�be�of�integer�type/00000846�operand�of�ATNƒmust�be�of�integer�type500000847 operand of built-in function must be numeric'00000848 operand of RND must be numeric'00000849 operand of ABS must be numeric?0000084A parameter of LEN/ASC/TRIM/VAL/STR/CHR must be a stringA0000084B disagreement between type of actual and formal parameter,0000084C first param of MID must be a string70000084D second and third params of MID must be numeric60000084E parameter of SNGL must be of DOUBLE data-type*0000084F parameter of DBLE must be numericA00000850 parameter of ISHFT and IROT must be of integer data-type-00000851 PEEK/POKE parameters must be numeric.00000852 string notallowed as parameter of EOF/00000853 illegal operator for string expression.00000854 internal - disagreement of data-types*00000855 operands in power must be numeric200000856 operand(s) of SGN must be of integer type400000857 IDN operates only on two dimensional arrays500000858 arrays in TRN must be two dimensional arrays400000859 INV operates only on two dimensional arraysC0000085A string variable with adjusted length - must be a parameter0000085B useless MAT assignment>0000085C number of dimensions in MAT assignment does not agree(0000085D number of dimensions must agree=0000085E INTERNAL: "Execute_Op" - undefined operand data type,0000085F unrecognized operator in MAT op MAT100000860 missing parameter in a built-in function$00000861 expecting right parenthesisB00000862 POKE is a subroutine and must not appear in an expression00000863 missing comma00000864 undecodable statementI00000865 undefined one-line-function or one-line-function reference errorK00000866 disagreement between types or number of actual and dummy arguments*00000867 internal fatal error in: "expars"#00000868 expression nested too deep00000869 expecting commaF0000086A�simple�variable‚or‚array�element�expected�in�left�side�of�'='*0000086B internal fatal error in: "sontof"-0000086C value in [] of SET - must be numericH0000086D number of dimensions in new working space must agree with array80000086E internal fatal: illegal node in Match_Convert()00000086F internal: no more buffer room available700000870 INTERNAL: "Execute_Op" -  unrecognized operator?00000871 INTERNAL: "Convert" - unrecognized conversion operator?00000872 NonLOCAL specification occurs in an external procedure700000873 DATA statement occurs in an external procedure(00000874 Missing NEXT or ENDIF statement 00000875 Missing ENDEF statementB00000876 No reference to statement following RETURN, STOP, or GOTO700000877 Statement other than REM follows END statement>00000878 DEF statement not preceded by GOTO or ENDEF statementG00000879 ON ERROR or ON hardware-exception is not allowed in subroutine+0000087A EVERY is not allowed in subroutine-0000087B ON INTR is not allowed in subroutine*0000087C WHEN is not allowed in subroutine-0000087D‚ILLEGAL�OPTION(S)�IN�COMMAND�LINE�\P 0000087E‚CAN'T�OPEN�LISTING�FILE:0000087F Declaration of parameter must folow DEF statement800000880�\D00‚Unable�to�close�E-CODE�file�in�NEW�command=00000881�\D00‚Unable�to�delete�old�E-CODE�file�in�NEW�command?00000882�\D00‚Unable�to�allocate�new�E-CODE�file�in�NEW�command=00000883�\D00‚Unable�to�assign�new�E-CODE�file�in�NEW�commandO*------------------------------------------------------------------------------*ˆEND�BASIC�M�MESSAGESO*------------------------------------------------------------------------------****ˆ**�TRANSLATE�TABLE�FOR�NON�TRAP�MESSAGES*#2002A006 CANCELLED WAITING IN QUEUE(2002C001 NORMAL TERMINATION FROM RUNNING 2002C006 CANCELLED WHILE RUNNING2002C009 CANCELLED DUE TO BREAK+2002C010 ABORTED DUE TO BUS ERROR (ADDRESS).2002C011 TERMINATED DUE TO BUS ERROR (ADDRESS)*O*------------------------------------------------------------------------------**ˆFHS�/�IOS�ERROR�MESSAGES*18000002 INVALID COMMAND \K000C$18000003 INVALID LOGICAL UNIT \K000C918000004 INVALID OR NONEXISTENT VOLUME \K000C VOLN=\C0604*18000005 DUPLICATE FILE NAME \K000C \K000F,18000006 FILE DESCRIPTOR ERROR \K000C \K000F)18000007 PROTECT CODE ERROR \K000C \K000F418000008 RECORD LENGTH ERROR \K000C \K000F RECL=\W34+18000009 SHARED SEGMENT ERROR \K000C \K000F31800000A INSUFFICIENT DIRECTORY SPACE \K000C \K000F.1800000B ACCESS PERMISSION ERROR \K000C \K000F01800000C INSUFFICIENT SYSTEM SPACE \K000C \K000F 1800000D ASSIGNMENT ERROR \K000C#1800000E INVALID DEVICE TYPE \K000C1800000F BUFFER OVERFLOW \K000C!18000010 INVALID TASK NAME \K000C018000011 INVALID BUFFER ADDRESS \K000C BUFF=\Z12(18000012 INVALID FILE TYPE \K000C \K000F)18000013 INTERNAL FHS ERROR \K000C \K000F,18000014 INVALID PARAM BLOCK ADDRESS A0=\A00818000015 DATA BLOCK LENGTH ERROR \K000C \K000F SIZE=\Z36+18000016 SIZE ERROR \K000C \K000F SIZE=\Z36,18000017 NONEXISTENT FILE NAME \K000C \K000F 18000018 END OF DIRECTORY \K000C118000019 KEY LENGTH ERROR \K000C \K000F SIZE=\Z3611800001A FAB LENGTH ERROR \K000C \K000F SIZE=\Z36*1800001B DEFAULT VOLUME NOT DEFINED \K000C"1800001C INVALID STATE FOR COMMAND(1800001D USER NOT OWNER OR ADMINISTRATOR&180000CD DISK SPACE FULL \K000C \K000F1180000D1 UNRECOVERABLE DEVICE ERROR \K000C \K000F)180000D2 DATA COMPARE ERROR \K0010 \K000F+180000D3 SECTOR PROTECT ERROR \K0010 \K000F180000D4 DEVICE NOT MOUNTED'180000E1 DEVICE NOT READY \K000C \K000F"180000E2 DEVICE BUSY \K000C \K000F%180000E3 DATA CRC ERROR \K0010 \K000F-180000E4 WRITE PROTECTED DEVICE \K000C \K000F1180000E5 DELETED DATA MARK DETECTED \K0010 \K000F180000E6 TIMEOUT \K000C \K000F-180000E7 INVALID SECTOR ADDRESS \K000C \K000F%180000E8 CHECKSUM ERROR \K000C \K000F)180000E9 DISK RESTORE ERROR \K000C \K000F#180000EA DATA OVERRUN \K000C \K000F,180000EB DEVICE STATUS CHANGED \K000C \K000F0180000EC TRACK/SECTOR ID NOT FOUND \K0010 \K000F-180000ED ADDRESS MARK CRC ERROR \K0010 \K000F!180000EE SEEK ERROR \K000C \K000F!180000EF BAD SECTOR \K0010 \K000F#180000F1 CHANNEL BUSY \K000C \K000F(180000F2 CHANNEL DMA ERROR \K000C \K000F2180000F3 UNRECOVERABLE CHANNEL ERROR \K000C \K000F'180000F4 CONTROLLER ERROR \K000C \K000F1180000F5 DEVICE CONFIGURATION ERROR \K000C \K000F$1800 00F6 DMA BUS ERROR \K000C \K000F(180000F7 DMA MAPPING ERROR \K000C \K000F+180000F8 DMA CONTROLLER ERROR \K000C \K000F2180000F9 INDETERMINATE CHANNEL ERROR \K000C \K000FO*------------------------------------------------------------------------------)1000000C INSUFFICIENT SYSTEM SPACE \K000C 10000082 INVALID FUNCTION \K000C$10000083 INVALID LOGICAL UNIT \K000C-10000084 INVALID DATA BUFFER \K000C BUFF=\Z12.10000085 INVALID RANDOM RECORD \K000C RRN=\Z08,10000086 INVALID PARAM BLOCK ADDRESS A0=\A00"10000087 PROTECT CODE ERROR \K000C10000088 CONFIGURATION ERROR2100000C1 BUFFER OVERFLOW/RECORD SIZE TOO BIG\K000C100000C2 END OF FILE \K000C100000C3 END OF VOLUME \K000C$100000C4 INVALID OR EMPTY FAB \K000C+100000C5 INVALID TRANSFER FOR DEVICE \K000C100000C6 BREAK CONDITION \K000C!100000C7 INTERNAL IO ERROR \K000C'100000C8 FAB/DATA BLOCK CONFLICT \K000C%100000C9 RECORD DOES NOT EXIST \K000C%100000CA RECORD ALREADY EXISTS \K000C>100000CB RECORD OVERFLOW/TOO MANY RECORDS IN DATA BLOCK \K000C+100000CC KEY ERROR, FAB KEY CONFLICT \K000C100000CD DISK SPACE FULL \K000D*100000D1 UNRECOVERABLE DEVICE ERROR \K000D"100000D2 DATA COMPARE ERROR \K000E$100000D3 SECTOR PROTECT ERROR \K000E"100000D4 DEVICE NOT MOUNTED \K000D-100000D5 BEGINNING OF TAPE ENCOUNTERED \K000C2100000D7 A TAPE IS ALREADY MOUNTED ON DRIVE \K000C 100000E1 DEVICE NOT READY \K000D100000E2 DEVICE BUSY \K000D100000E3 DATA CRC ERROR \K000E&100000E4 WRITE PROTECTED DEVICE \K000D*100000E5 DELETED DATA MARK DETECTED \K000E100000E6 TIMEOUT \K000D&100000E7 INVALID SECTOR ADDRESS \K000D100000E8 CHECKSUM ERROR \K000D"100000E9 DISK RESTORE ERROR \K000D100000EA DATA OVERRUN \K000D%100000EB DEVICE STATUS CHANGED \K000D)100000EC TRACK/SECTOR ID NOT FOUND \K000E&100000ED ADDRESS MARK CRC ERROR \K000E100000EE SEEK ERROR \K000D100000EF BAD SECTOR \K000E100000F1 CHANNEL BUSY \K000D!100000F2 CHANNEL DMA ERROR \K000D3100000F3 CHANNEL UNRECOVERABLE CHANNEL ERROR \K000D 100000F4 CONTROLLER ERROR \K000D*100000F5 DEVICE CONFIGURATION ERROR \K000D100000F6 DMA BUS ERROR \K000D!100000F7 DMA MAPPING ERROR \K000D$100000F8 DMA CONTROLLER ERROR \K000D+100000F9 INDETERMINATE CHANNEL ERROR \K000D*"*ˆTRANSLATE�TABLE�FOR�IOSFCT�FIELD* 30000001 READ30000002 WRITE30000004 OUTPUT WITH INPUT30000008 UPDATE30000010 DELETE30000020 FORMAT30000101 POSITION30000102 REWIND30000104 TEST I/0 COMPLETE 30000108 WAIT30000110 HALT I/O30000120 BREAK*"*ˆTRANSLATE�TABLE�FOR�FHSCMD�FIELD*38000001 CHECKPOINT38000002 DELETE38000004 CLOSE38000008 CHANGE PROTECT CODES38000010 RENAME38000020 CHANGE ACCESS38000040 ASSIGN38000080 ALLOCATE380000C0 ALLOCATE/ASSIGN38000108 FETCH DEFAULT VOLUME38000110 CHANGE LU38000120 FETCH DEVICE MNEMONICS38000140 FETCH DIR. ENTRY38000180 RETRIEVE ATTRIBUTES38000204 DISPLAY SPOOLER QUEUE38000208 CHANGE COPIES38000210 PRINT FILE38000220 CHANGE FORMS38000240 CONTINUE SPOOLER JOB38000280 CANCEL SPOOLER JOB38008001 SET DEFAULT VOLUME**O*------------------------------------------------------------------------------**’TRAP�1�RELATED�MESSAGES**.08010003 NONEXISTENT TARGET TASK (GTSEG)\K0016#08010005 SEGMENT TABLE FULL (GTSEG)'08010006 DUPLICATE SEGMENT NAME (GTSEG)008010007 REQUESTED MEMORY DOES NOT EXIST (GTSEG)$08010008 INSUFFICIENT MEMORY (GTSEG)(0801000A NON-DORMANT TARGET TASK (GTSEG))0801000B LOGICAL ADDRESS CONFLICT (GTSEG).08020003 NONEXISTENT TARGET TASK (DESEG)\K0016/08020007 NONEXISTENT SEGMENT NAME (DESEG)\K0016(0802000A NON-DORMANT TARGET TASK (DESEG)00803000B SEGMENT ERROR - TASK LINKED INCORRECTLY$08040005 SEGMENT TABLE FULL (ATTSEG)(08040006 DUPLICATE SEGMENT NAME (ATTSEG)008040007 NONEXISTENT SEGMENT NAME (ATTSEG)\K0016*0804000B LOGICAL ADDRESS CONFLICT (ATTSEG)'08060003 SOURCE TASK NOT FOUND (MOVELL),08060007 DESTINATION TASK NOT FOUND (MOVELL)108060009 USER TO SYSTEM TASK NOT ALLOWED (MOVELL)70806000B ADDRESSES DIFFERENT EVEN/ODD BOUNDARY (MOVELL)&08090003  TARGET TASK NOT FOUND (RCVSA)$080B0006 DUPLICATE TASK NAME (CRTCB)$080B0008 INSUFFICIENT MEMORY (CRTCB)*080D0003 TASK DOES NOT EXIST (START)\K0016*080D0023 TASK DOES NOT EXIST (START)\K0017!080D000A TASK NOT DORMANT (START)108100003 TARGET TASK DOES NOT EXIST (TERMT)\K0016108100023 TARGET TASK DOES NOT EXIST (TERMT)\K0017308100006 TARGET TASK ALREADY IN TERMINATION (TERMT):08100009 USER TASK CAN NOT TERMT SYSTEM TASK OR SELF\K0016308170003 TARGET TASK DOES NOT EXIST (TSKATTR)\K0016308170023 TARGET TASK DOES NOT EXIST (TSKATTR)\K0017,0817000A TASK IS TERMINATING (TSKATTR)\K0016008190003 TARGET TASK DOES NOT EXIST (STOP)\K0016008190023 TARGET TASK DOES NOT EXIST (STOP)\K0017$08190006 TARGET TASK ALREADY STOPPED108190009 USER TASK CAN NOT STOP SYSTEM TASK\K0016**O*------------------------------------------------------------------------------**ˆTRAP�4�RELATED�MESSAGES*#20000001 UNDEFINED DIRECTIVE NUMBER?20000012 LOAD SEGMENT LOGICAL ADDRESS EXCEEDS SEGMENT BOUNDRIES+20000013 FILE REFERENCED IS NOT A LOAD FILE****O*------------------------------------------------------------------------------;***********************************************************;*----------------------------------------------------------*-* The following are the Pascal error messages*;*----------------------------------------------------------$00001001 Case index out of range\D0000001002 Value out of range\D00%00001004 Integer division by zero\D00;00001008 Bus error - bad pointer or stack/heap overflow\D00 00001010 Stack/heap overflow\D00?00001011 Address error - bad pointer or stack/heap overflow\D00?00001012 Memory allocation error during processing Z option\D00+00001013 Data segment name must be SEG2\D00"00001022 Read past end of file\D0000001028 Illegal file name\D00*00001031 Integer expected in text file\D00'00001032 Real expected in text file\D00*00001033 Boolean expected in text file\D00?00001040 Too many files in use, or unrecognizable device ID\D00100001041 Option error in 'reset' or 'rewrite'\D00)00001042 Too many command line fields\D00#00001043 File not open at input\D00$00001044 File not open at output\D00200001051 Real number out of range in text file\D00700001052 Attempt to enable 6809 floating point trap\D00900001053 Attempt to set 6809 floating point exception\D00>00001054 Attempt to set 6809 floating point precision mode\D00200001062 Invalid base for integer in text file\D00900001063 Invalid digit for based integer in text file\D00#00001070 Attempt to take NAN(0)\D00?00001099 Illegal TRAP 14 error code - internal Pascal error\D00;*----------------------------------------------------------<* The following are the Pascal floating point error messages;*----------------------------------------------------------'00002000 No invalid operation error\D00"00002100 Illegal SQRT argument\D00500002200 (+infinity) + (-infinity) in affine mode\D00700002300 Conversion of a not-a-number to an integer\D0000002400 Illegal division\D00400002500 An argument was a trapping not-a-number\D00G00002600 Unordered condition tested by predicate other than = or <>\D00300002700 Projective closure use of +/- infinity\D0000002800 0 * infinity\D00"00002900 Illegal REM arguments\D00K00002A00 Binary-to-decimal or decimal-to-binary conversion out of range\D00D00002B00 Moved single precision unnormalized to double precision\D00G00002C00 Returned unnormalized number to single or double precision\D0000002001 Invalid operation\D0000002002 Overflow\D0000002004 Underflow\D0000002008 Division by zero\D0000002010 Inexact result\D00B00002020 Overflow on conversion from floating point to integer\D00:00002040 Reserved exponent value seen as input operand\D00;*----------------------------------------------------------* End of Pascal error messages;*----------------------------------------------------------*$*ˆVERSAdos�Operating�System�Messages*+20010013 FILE REFERE  NCED IS NOT A LOAD FILEO*------------------------------------------------------------------------------?*--------------------------------------------------------------"* FORTRAN COMPILER ERROR MESSAGES.?*--------------------------------------------------------------900003002‚INVALID�CHARACTER�APPEARS�IN�COLUMNS�1-5�OF�LINE600003003‚THE�STATEMENT�NUMBER�HAS�ALREADY�BEEN�DEFINED?00003004‚THE�FIRST�CHARACTER�OF�THE�STATEMENT�IS�NOT�ALPHABETICL00003005‚CONTINUATION�LINE�ENCOUNTERED�WHEN�COMMENT�OR�INITIAL�LINE�EXPECTED/00003006‚LIMIT�OF�9�CONTINUATION�LINES�EXCEEDED900003007‚COLUMNS�1-5�OF�A�CONTINUATION�LINE�ARE�NOT�BLANK 00003009‚MISSING�'END'�STATEMENTI00003010‚THE�NAME�\P�IS�TOO�LONG.‚IT�HAS�BEEN�TRUNCATED�TO�SIX�CHARACTERS00003011‚SYMBOL�TABLE�OVERFLOW00003014‚REAL�CONSTANT�OVERFLOW00003015‚ILLEGAL�COMMAND�LINE 00003016‚INVALID�CONSTANT�FORMAT"00003017‚INTEGER�CONSTANT�OVERFLOW?00003018‚INTERNAL�ERROR:�illegal�node�type�found�in�"Code_Gen".$00003022‚EXPECTING�RIGHT�PARENTHESIS00003023‚EXPECTING�SINGLE�QUOTE00003025‚UNDECODABLE�STATEMENT00003026‚INVALID�CHARACTER‚\P?00003033‚INVALID�STATEMENT�AFTER�END�STATEMENT.‚IT�WAS�IGNORED.*00003035‚ILLEGAL�OPTION(S)�IN�COMMAND�LINE 00003036‚ILLEGAL�INPUT�FILE�NAME!00003037‚ILLEGAL�OUTPUT�FILE�NAME"00003038‚ILLEGAL�LISTING�FILE�NAME00003040‚MISSING�PROGRAM�NAME 00003041‚MISSING�SUBROUTINE�NAME00003042‚MISSING�FUNCTION�NAMEG00003044‚NON-SYMBOLIC�NAME�IS�SPECIFIED�IN�TYPE�SPECIFICATION�STATEMENT$00003045‚INVALID�ARRAY�DECLARATOR‚\P#00003047‚EXPECTED�COMMON�BLOCK�NAME00003048‚MISSING�COMMA100003049‚NON-SYMBOLIC�NAME�IN�AN�EQUIVALENCE�LISTG00003051‚INCORRECT�LENGTH�SPECIFICATION�IN�TYPE�SPECIFICATION�STATEMENT500003052‚MISSING�LIST�OF�NAMES�IN�INTRINSIC�STATEMENTC00003053‚INVALID�TYPE�OR�LENGTH�SPECIFICATION�IN�IMPLICIT�STATEMENT000003054‚INVALID�LETTER�IN�IMPLICIT�STATEMENTƒ\P+00003055‚INVALID�DIMENSION�DECLARATOR�IN�\PM00003056‚THE�LENGTH�OF�A�LITERAL�IS�LONGER�THAN�THE�VARIABLE�OR�ARRAY�ELEMENT200003064‚ILLEGAL�STATEMENT�IN�BLOCKDATA�SUBPROGRAMM00003065‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�IN�EXTERNAL�STATEMENT�\PM00003067‚NAME�IN�AN�INTRINSIC�STATEMENT�MUST�BE�AN�INTRINSIC�FUNCTION�NAME�\PN00003069‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�IN�INTRINSIC�STATEMENT�\PF00003070‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�IN�SAVE�STATEMENTD00003072‚ATTEMPT�TO�ESTABLISH�THE�TYPE�OF�A�CHARACTER�MORE�THAN�ONCEM00003073‚THE�RANGE�OF�LETTERS�IN�AN�IMPLICIT�STATEMENT�LIST�IS�NOT�ALPHABETICL00003079‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�AS�A�COMMON�VARIABLE�\P:00003083‚WRONG�NUMBER�OF�SUBSCRIPTS�IN�AN�EQUIVALENCE�LISTC00003085‚A�VARIABLE'S�DIMENSION�IS�NOT�A�SIMPLE�INTEGER�VARIABLE�\PC00003086‚ATTEMPTING�TO�USE�A�PREVIOUSLY�DEFINED�NAME�AS�AN�ARRAY�\PN00003087‚AN�ADJUSTABLE�ARRAY�OR�ASSUMED�SIZE�ARRAY�MUST�BE�A�DUMMY�ARGUMENT�\P000003088‚ATTEMPTING�TO�REDIMENSION�A�VARIABLE�\P<00003090‚INVALID�FORMAT�OF�AN�ASSUMED�SIZE�ARRAY�DECLARATIONK00003092‚A�VARIABLE�DIMENSION�\P�IS�NOT�A�DUMMY�ARGUMENT�OR�COMMON�VARIABLE000003093‚MORE�THAN�3�DIMENSIONS�FOR�THE�ARRAY�\P;00003098‚INVALID�SYMBOLIC�NAME�APPEARS�IN�DATA�STATEMENT‚\PB00003099‚A�VARIABLE�WAS�PREVIOUSLY�INITIALIZED�IN�A�DATA�STATEMENTK00003100‚ATTEMPT�TO�INITIALIZE�NAMED�COMMON�ENTITY�\P�NOT�IN�BLOCK�DATA�SUB<00003101‚ATTEMPTING�TO�INITIALIZE�A�BLANK�COMMON�VARIABLE�\P/00003102‚TYPE�OF�DATA�AND�VARIABLE�DO�NOT�MATCH100003108‚A�FUNCTION�MUST�NOT�BE�OF�TYPE�CHARACTERB00003112‚ADJUSTABLE�ARRAYS�ARE�VALID�ONLY�IN�PROCEDURE�SUBPROGRAMS-00003123‚INVALID�REFERENCE�TO�SUBROUTINE�NAMEG00003126‚A�DO�LOOP�PARAMETER�IS�NOT�AN�INTEGER�EXPRESSION�OR�IS�MISSING600003131‚THE�DO�INDEX�IS�NOT�A�SIMPLE�INTEGER�VARIABLE500003133‚MISSING�INPUT/OUTPUT�LIST�IN�IMPLIED�DO�LISTD00003135‚TYPE�DISAGREEMENT�BETWEEN�LEFT�AND�RIGHT�SIDE�OF�EQUAL�SIGN=00003139‚ILLEGAL�SEQUENCE�OF�OPERATORS/OPERANDS�IN�EXPRESSION<00003143‚TYPE�DISAGREEMENT�BETWEEN�ACTUAL�AND�DU  MMY�ARGUMENT00003150‚DIVIDE�BY�ZEROL00003152‚UNDEFINED�STATEMENT�FUNCTION,�OR�STATEMENT�FUNCTION�REFERENCE�ERRORN00003154‚STATEMENT�FUNCTION�STATEMENT�NAME�CONFLICTS�WITH�PRIOR�DEFINITIONS�\PJ00003155‚DISAGREEMENT�BETWEEN�TYPE�OR�NUMBER�OF�ACTUAL�AND�DUMMY�ARGUMENTSN00003156‚MISMATCH�IN�NUMBER�OF�ACTUAL�AND�DUMMY�ARGUMENTS�IN�AN�INTRINSIC�FUNC00003157‚\P�IS�DOUBLY�DEFINEDF00003158‚PROCEDURE�\P�APPEARS�AS�ARGUMENT�WITHOUT�EXTERNAL�DECLARATION?00003159‚THERE�IS�AN�ASSUMED�SIZE�ARRAY�IN�INPUT/OUTPUT�LIST�\PN00003160‚STATEMENT�FUNCTION�STATEMENT�NAME�\P�PASSED�AS�PARAMETER�OR�IN�COMMONF00003163‚THERE�IS�AN�ERROR�ON�THE�LEFT�SIDE�OF�AN�ASSIGNMENT�STATEMENT+00003166‚UNDECODABLE�TYPE�OF�GOTO�STATEMENT100003172‚LOGICAL�IF�CONTAINS�ILLEGAL�STATEMENT(S)800003174‚DO�CONTROL�VARIABLE�USED�PREVIOUSLY�IN�THE�NEST)00003175‚ILLEGAL�TERMINAL�STATEMENT�OF�DO*00003179‚RECORD�AND�EOF�SPECIFIER�CONFLICT-00003180‚FORMAT�AND�RECORD�SPECIFIER�CONFLICTF00003181‚MISSING�FORMAT�IDENTIFIER�WHERE�AN�INTERNAL�FILE�IS�SPECIFIED400003182‚INTERNAL�FILE�AND�RECORD�SPECIFIER�CONFLICT:00003183‚WRITE�STATEMENT�MUST�NOT�CONTAIN�AN�EOF�SPECIFIER500003189‚RETURN�STATEMENT�APPEARS�IN�THE�MAIN�PROGRAM+00003195‚MAIN�PROGRAM�HAS�NO�STOP�STATEMENT>00003197‚FUNCTION�VALUE�NOT�DEFINED�IN�THE�FUNCTION�SUBPROGRAM.00003199‚ANYTHING�AFTER�A�STATEMENT�IS�ILLEGAL"00003200‚EXPECTING�STATEMENT�LABEL-00003201‚EXPECTING�COMMA�OR�RIGHT�PARENTHESIS 00003203‚EXPECTING�SYMBOLIC�NAME-00003204‚EXPECTING�COMMA�OR�RIGHT�PARENTHESIS#00003205‚EXPECTING�LEFT�PARENTHESIS00003206‚EXPECTING�COMMA00003207‚EXPECTING�EQUAL�SIGNK00003208‚EXPECTING�LABEL,�SYMBOLIC�NAME,�CHARACTER�CONSTANT,�'REC'�OR�'END'00003211‚EXPECTING�'DIRECT'00003215‚EXPECTING�'THEN'00003218‚EXPECTING�'TO'*00003220‚MULTIPLE�'END'�OR�'REC'�SPECIFIEDK00003224‚NO�STATEMENT�LABEL�AFTER�ARITHMETIC�IF,�'GOTO',�'STOP'�OR�'RETURN'-00003226‚REFERENCE�TO�ILLEGAL�STATEMENT�LABELM00003227‚ILLEGAL�TRANSFER�INTO�DO�LOOP,�IF�BLOCK,�ELSE�IF�BLOCK�OR�ELSE�BLOCK(00003230‚INCREMENTAION�PARAMETER�IS�ZERO@00003235‚THE�DO�CONTROL�VARIABLE�IS�REDEFINED�WITHIN�THE�DO�LOOP-00003237‚THE�VARIABLE�MUST�BE�OF�TYPE�INTEGERF00003251‚MORE�THAN�THREE�LEVELS�OF�PARENTHESES�IN�FORMAT�SPECIFICATIONG00003254‚NUMERIC�SPECIFICATION�GREATER�THAN�255�IN�FORMAT�SPECIFICATION>00003255‚NUMERIC�SPECIFICATION�IS�ZERO�IN�FORMAT�SPECIFICATION@00003257‚DIGITS�OF�FRACTIONAL�PART�EXCEED�TOTAL�DIGITS�OF�NUMBERK00003260‚CHARACTER�CONSTANT�LENGTH�GREATER�THAN�255�IN�FORMAT�SPECIFICATION%00003261‚MISSING�'N'�OR�'Z'�AFTER�'B'K00003265‚THE�FIRST�CHARACTER�OF�A�CHARACTER�FORMAT�SPECIFICATION�IS�NOT�'('/00003267‚NO�STATEMENT�LABEL�ON�FORMAT�STATEMENT000003270‚FORMAT�INDEX�VARIABLE�MUST�BE�INTEGER*4C00003271‚Useless�data�type�-�expected�variable,array�or�function�\P=00003272‚Overflow�in�Hexadecimal�number�(more�than�8�digits).400003273‚Illegal�character�in�Hexadecimal�number.�\P200003274‚Missing�ending�'H'�in�Hexadecimal�number.:00003275‚Unrecognized�name�of�LOGICAL/RELATIONAL�operator.'00003276‚Double-real�constant�overflow.800003277‚More�than�one�period�detected�in�real�constant.:00003278‚More�than�one�exponent�detected�in�real�constant.$00003279‚Underflow�in�real�constant.K00003281‚TWO�DIFFERENT�VARIABLE�TYPES�ARE�BOUND�BY�EQUIVALENCE�STATEMENT�\PK00003282‚TWO�EQUIVALENCED�CHARACTER�ENTITIES�DO�NOT�HAVE�THE�SAME�LENGTH�\PI00003283‚TWO�DIFFERENT�ARRAY�ELEMENTS�ARE�ASSIGNED�TO�THE�SAME�ADDRESS�\PM00003285‚CHARACTER�DATA�AND�NONCHARACTER�DATA�CANNOT�BE�IN�THE�SAME�COMMON�\PI00003287‚COMMON�BLOCK�STORAGE�CANNOT�BE�EXTENDED�UPWARD�BY�EQUIVALENCE�\PB00003289‚A�COMMON�VARIABLE�AND�A�SAVE�VARIABLE�ARE�EQUIVALENCED‚\P@00003290‚ELEMENTS�OF�DIFFERENT�COMMON�BLOCKS�ARE�EQUIVALENCED�\PC00003293‚THE�SUBSCRIPT�OF�\P�IN�AN�EQUIVALENCE�STATEMENT�IS�INVALID00003297‚CAN'T�OPEN�INPUT�FILE 00003298‚CAN'T�OPEN�LISTING�FILE00003300‚INTERNAL�ERROR'00003301‚Integer�expression�is�expected+00003302‚Numbe! r�should�be�greater�than�zero700003303‚EOF�must�not�be�specified�for�an�internal�fileB00003304‚Format�identifier,�if�any,�must�be�second�item�in�ciolist00003305‚Unexpected�equal�sign%00003306‚Illegal�format�specificationE00003307‚Implied-do�control�variable�is�not�a�simple�integer�variable900003308‚Implied-do�loop�has�too�many�simple�iolist�items900003309‚DO�control�variable�\P�is�redefined�in�an�iolistA00003310‚Implied-do�control�variable�is�redefined�in�an�iolist�\P$00003311‚Unexpected�left�parenthesis%00003312‚Unexpected�right�parenthesis00003313‚Unexpected�comma00003314‚Unexpected�slash00003315‚Unexpected�number00003316‚Unexpected�minus�sign00003317‚Unexpected�apostrophe*00003318‚Unexpected�B�format�specification'00003319‚Illegal�X�format�specification*00003320‚Unexpected�I�format�specification*00003321‚Unexpected�L�format�specification*00003322‚Unexpected�A�format�specification*00003323‚Unexpected�D�format�specification*00003324‚Unexpected�E�format�specification*00003325‚Unexpected�F�format�specification800003326‚Number�is�missing�before�P�format�specification800003327‚Number�is�missing�before�H�format�specificationA00003328‚A�non-logical�operand�\P�appears�in�a�logical�expression$00003329‚Unexpected�end-of-statement100003330‚Unexpected�character�in�format�statement00003331‚Missing�field�width)00003332‚Internal�error�-�name�not�found.&00003333‚Illegal�use�of�module�name�\PG00003334‚Attempted�to�pass�statement-function-statement�name�as�address,00003335‚Conflict�with�prior�definitions:�\P.00003336‚Illegal�attempt�to�pass�\P�as�addressC00003337‚No�INTRINSIC�statement�for�\P�but�it�is�passed�as�argument700003338‚An�attempt�was�made�to�assign�the�procedure�\P400003339‚Procedure�name�\P�appears�in�DATA�statement000003340‚Unbalanced�parentheses�in�IF�statement.L00003341‚Internal�-�name�in�attribute�table�does�not�start�with�alpha�charac$00003342‚Internal�-�hash�table�full.;00003343‚Expected�variable�name�or�array�name�instead�of�\PH00003344‚Dummy�argument�\P�appears�more�than�once�in�dummy�argument�listL00003345‚Dummy�argument�list�missing�-�parentheses�must�appear�even�if�empty00003346‚'RECL'�expected00003347‚'ACCESS'�expected-00003348‚Missing�elements�in�EQUIVALENCE�list00003349‚Slash�expectedB00003350‚Dummy�argument�or�SAVEd�entitity�\P�not�allowed�in�COMMON.00003351‚Array�elements�not�allowed�in�SAVE‚\P?00003352‚Dummy�argument�or�COMMON�entity�\P�not�allowed�in�SAVEM00003353‚SAVE�entities�must�be�simple�variables,�array�names�or�common�blocks*00003354‚Numeric�integer�constant�expected:00003355‚Dummy�argument�\P�not�allowed�in�EQUIVALENCE�list100003356‚RETURN�missing�in�function�or�subroutineJ00003357‚More�than�one�header�(PROGRAM,�FUNCTION,�SUBROUTINE�or�BLOCKDATA)$00003358‚Illegal�order�of�statements800003359‚Missing�DATA�statements�in�BLOCKDATA�subprogram&00003360‚Missing�executable�statements00003361‚Unclosed�blocks300003362‚Illegal�statements�in�BLOCKDATA�subprogram600003363‚Illegal�characters�in�STOP�or�PAUSE�statement400003364‚Missing�dimension�number�in�attribute�of�\P700003365‚"bin_code"�-�Illegal�operation�code�passed:�\NL00003366‚INTERNAL:�"nextwork"�-�Too�many�work-registers�needed�by�"bin_code"B00003367‚INTERNAL:�"bin_special"�-�Illegal�command-code�passed:�\NG00003368‚INTERNAL:�"bnflsmpl"�-�Illegal�var-kind�in�simple-var�node:�\NG00003369‚INTERNAL:�"bnflarray"�-�Illegal�var-kind�in�array-var�node:�\NM00003370‚INTERNAL:�"bnflopnd/bnflrutn"�-�Illegal�operand�node-type�passed:�\NH00003371‚Code�size�is�greater�than�32KB�which�conflicts�with�'-B'�optionL00003372‚INTERNAL:�"bincre"�-�Illegal�operand�address-mode�(MDxxx)�found:�\NN00003373‚INTERNAL:�"binpseud"�-�Illegal�operand�address-mode�(MDxxx)�found:�\N600003374‚INTERNAL:�"binopen"�-�Cant't�open�ro-file:�\PC00003375‚INTERNAL:�"bntmopen"�-�Can't�re-open�temporary�ro-file:�\PD00003376‚INTERNAL:�"bntmread"�-�Read�of�temporary�ro-file�failed:�\PE00003377‚INTERNAL:�"binwrt"�-�Illega! l�reacod-code�(WR_xxx)�passed:�\NN00003378‚SAVE+COMMON�code�is�greater�than�32KB�which�conflicts�with�'C'�option;00003379‚INTERNAL:�"bnwrbyte"�-�Write�on�ro-file�failed:�\P;00003380‚INTERNAL:�"binclose"�-�Write�on�ro-file�failed:�\P00003381‚Nesting�errorG00003382‚STRING-CONSTANTS�and�FORMATS�section�size�is�greater�that�32KB00003383‚Illegal�integer�number=00003384‚CHARACTER�LENGTH�OF�BOTH�OPERANDS�SHOULD�BE�THE�SAME(00003385‚Illegal�syntax�in�DATA�statment)00003386‚Inconsistent�subscript�reference+00003387‚Unequal�number�of�names�and�valuesM00003388‚Attempt�to�initialize�nonCOMMON�variable�\P�in�BLOCK�DATA�subprogram300003389‚Subscript�of�\P�is�not�an�integer�constant100003390‚FATAL�error�in�DATA�-�data�table�is�full?00003391‚FATAL�error�in�data/keep_gen�-�keep_gen�got�odd�offset900003393‚MISMATCH�BETWEEN�OPERAND�AND�OPERATOR�DATA�TYPES00003394‚UNDEFINED�LABEL�\N00003395‚FIXED-POINT�OVERFLOWD00003396‚FIXED-POINT�ZERO�RAISED�TO�POWER�OF�NEGATIVE�OR�ZERO�NUMBER*00003397‚Unexpected�Z�format�specification*00003398‚Unexpected�G�format�specification00003399‚PROGRAM�IS�EMPTY100003400‚INTERNAL�FATAL�ERROR�IN:ƒ"match_convert",00003401‚INTERNAL�FATAL�ERROR�IN:ƒ"subst_op".00003402‚INTERNAL�FATAL�ERROR�IN:ƒ"execute_op"+00003403‚INTERNAL�FATAL�ERROR�IN:ƒ"convert"*00003404‚INTERNAL�FATAL�ERROR�IN:ƒ"expars"=00003405‚INTERNAL�FATAL�ERROR�IN„"elesize"�(VARIABLE�NAME�\P)#00003406‚EXPRESSION�NESTED�TOO�DEEP*00003407‚INTERNAL�FATAL�ERROR�IN:ƒ"sintof"000003408‚INTERNAL:�no�more�buffer�room�available(00003409‚INTERNAL:�attributes�table�full(00003410‚INTERNAL:�an�I/O�error�occurredO*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *ˆTEST�LINEO*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~éé' TSO DLOAD CF::aaDLOAD SA??ÕaaULOAD CFXXaaULOAD SA]]àaa PROC 1 FILEALLOC DDNAME(OUTPUT) DSNAME(*)ALLOC�DDNAME(INPUT)‚DSNAME(*)"ALLOC�DDNAME(INFIL)‚DSNAME(&FILE.) CALL DLOADFREEALLé" éé6%PROGRAM DOWNLOAD(INPUT,OUTPUT,INFIL); J(************************************************************************)D(*�THIS�PROGRAM�READS�RECORDS�FROM�A�SOURCE�FILE,�PACKS�THEM�INTO‡*)D(*�BLOCKS�AND�WRITES�THEM�TO�THE�TERMINAL.‚THE�PROGRAM�RUNS�ON�AN†*)(*�IBM�370�UNDER�TSO.³*)J(************************************************************************) 5ƒCONST�CMAX‚=‚80;‰(*�MAX�NO.�OF�CHARS�IN�ONE�BLOCK�*),‰RMAX‚=‚80;‰(*�MAXIMUM�SINGLE�RECORD�SIZE�*)5‰BLKCNT=‚1;Š(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*)3‰BMAX‚=‚162;ˆ(*�BUFFER�SIZE�=�BLKCNT*CMAX+RMAX+2�*)/‰OPTION�=�'BB';‡(*�COM/CHAR�PROTOCOL�OPTIONS�*),‰CHRMAX�=�255;ˆ(*�MAXIMUM�CHARACTER�VALUE�*) ƒTYPE‚BKINDEX‚=�1..CMAX;‰BFINDEX‚=�INTEGER;*‰BFTYPEƒ=�PACKED�ARRAY(.1..BMAX.)�OF�CHAR;(‰RSPTYPE‚=�PACKED�ARRAY(.1..2.)�OF�CHAR;+‰RECTYPE‚=�PACKED�ARRAY(.1..RMAX.)�OF�CHAR; ƒVARƒQ…:‚BOOLEAN; ‰INFIL�:‚TEXT;™(*�SOURCE�FILE�*)>‰ASCII�:‚ARRAY(.CHAR.)�OF�INTEGER;…(*�ASCII�CHARACTER�CODES�*);@ D%H0L%P$?‰ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;(*�FOR�HEX�CONVERSION�*)&‰RECƒ:‚RECTYPE;–(*�HOLDS�RAW�RECORD�*)/‰RECSIZ:‚INTEGER;–(*�HOLDS�LENGTH�OF�RAW�REC�*)-‰BUFF‚:‚BFTYPE;—(*�BUFF�HOLDS�PACKED�BLOCK�*))‰BUFFP�:‚BFINDEX;–(*�INDEX�INTO�BUFFER�*)*‰RESPONSE:�RSPTYPE;•(*�ACK�NAK�RESPONSE�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO0‰ASCII(.CHR(I).)�:=�32;…(*�FORCE�ASCII�BLANKS�*) †INTERACTIVE(INPUT);†RESET(INFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); >†(*#�THE�FOLLOWING�STATEMENT�WAS�REQUIRED�TO�ALLOW�DOWNLOADING†OF�'~'�FROM�IBM�*) †ASCII(.CHR(95).)�:=�126; -†BUFFP�:=�4;œ(*�START�PACKING�RECORDS�HERE�*)†REPEAT/‰WRITE(OUTPUT,'PREAMBLED');Œ(*�SEND�PREAMBLE�*)(‰WRITE(OUTPUT,OPTION);‘(*�SEND�OPTION�*),‰WRITE(OUTPUT,CMAX:3);‘(*�SEND�BLOCK�SIZE�*)1‰WRITELN(OUTPUT,BLKCNT:1);�(*�SEND�BLOCK�COUNT�*)‰READLN(INPUT,RESPONSE);6†UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');†IF�RESPONSE(.1.)�=�'T'(‰THEN�Q�:=�TRUE;˜(*�EARLY�TERMINATION�*)†END;‚(*�INITIALIZE�*) IƒPROCEDURE�COMPRESS(VAR�REC:RECTYPE;�VAR�RECSIZ:INTEGER;�VAR�BUFF:BFTYPE;"–VAR�P:BFINDEX;�VAR�CCNT:INTEGER); ƒVARƒI,Jƒ:‚INTEGER;‰RECPTR:‚INTEGER; †PROCEDURE�COUT(C:CHAR);‰BEGIN�(*�COUT�*)‰BUFF(.P.)�:=�C; ‰P�:=�P�+�1;‰CCNT�:=�CCNT�+�1‰END;‚(*�COUT�*) ƒBEGIN�(*�COMPRESS�*) ƒRECPTR�:=�1;ƒWHILE�RECPTR�<=�RECSIZ�DO†BEGIN †I�:=�RECPTR;F†WHILE�(I<=RECSIZ)�AND�(REC(.RECPTR.)�=�REC(.I.))�AND�(I-RECPTR<35)�DO ‰I�:=�I�+�1;" 5†I�:=�I�-�RECPTR;‚(*�NUMBER�OF�MATCHING�CHARACTERS�*)/†IF�(I<=3)�AND�(I>0)�AND�(REC(.RECPTR.)�<>�'|')†THEN‰BEGIN‰FOR�J�:=�1�TO�I�DOŒCOUT(REC(.RECPTR.));‰RECPTR�:=�RECPTR�+�I‰END†ELSE ‰IF�I�>�0‰THENŒBEGIN ŒCOUT('|');ŒCOUT(REC(.RECPTR.));ŒCOUT(ASHEX(.I+1.));ŒRECPTR�:=�RECPTR�+�I ŒENDƒ(*THEN*)†ENDƒ(*WHILE*)ƒEND;‚(*�COMPRESS�*) 2ƒPROCEDURE�GETREC(VAR�P:BFINDEX;�VAR�BUFF:BFTYPE);?†VARƒCPOS‚:‚BFINDEX;„(*�POSITION�IN�BUFF�FOR�CHARACTER�COUNT�*)5ŒCCNT‚:‚INTEGER;„(*�NUMBER�OF�CHARACTERS�IN�RECORD�*) ŒQ…:‚BOOLEAN; †BEGIN„(*�GETREC�*)#†IF�EOLN(INFIL)�THEN�READLN(INFIL);†IF�NOT�EOF(INFIL)†THEN‰BEGIN ‰CPOS�:=�P; ‰CCNT�:=�0;,‰P�:=�P+2;’(*�LEAVE�ROOM�FOR�RECORD�COUNT�*) ‰RECSIZ�:=�0;‰WHILE�NOT�EOLN(INFIL)�DOŒBEGINŒREAD(INFIL,REC(.RECSIZ+1.));ŒRECSIZ�:=�RECSIZ�+�1;ŒEND;�(*WHILE*)‰IF�RESPONSE(.2.)�=�'B'‰THENŒBEGIN ŒQ�:=�FALSE;"ŒWHILE�(NOT�Q)�AND�(RECSIZ�>�0)�DO�IF�REC(.RECSIZ.)�=�'�'�THEN’RECSIZ�:=�RECSIZ�-�1�ELSE ’Q�:=�TRUEŒEND;"‰COMPRESS(REC,RECSIZ,BUFF,P,CCNT);F‰BUFF(.CPOS.)�:=�ASHEX(.CCNT�DIV�16+1.);ƒ(*�CONSTRUCT�HEX�CHAR�COUNT*)*‰BUFF(.CPOS+1.)�:=�ASHEX(.CCNT�MOD�16+1.); ‰ENDƒ(*THEN*)†END;‚(*�GETREC�*) @ƒPROCEDURE�PUTREC(VAR�Q:BOOLEAN;�VAR�P:BFINDEX;�VAR�BUFF:BFTYPE;”VAR�RESPONSE:RSPTYPE); †VARƒI‚:‚BFINDEX; †PROCEDURE�OUTBLOCK(RTYPE:CHAR);‰VAR�I�:‚INTEGER; �J�:‚INTEGER;�C�:‚INTEGER;‡(*�CHECKSUM�*) ‰BEGIN�(*�OUTBLOCK�*)*‰BUFF(.3.)�:=�RTYPE;‹(*�MARK�BLOCK�TYPE�*)‰C�:=�0;4‰FOR�I�:=�3�TO�CMAX*BLKCNT�DOˆ(*�COMPUTE�CHECKSUM�*)ŒBEGINŒIF�BUFF(.I.)�=�'^',ŒTHEN�BUFF(.I.)�:=�'~';‹(*#�UNIQUE�TO�IBM�*)ŒC�:=�C�+�ASCII(.BUFF(.I.).)ŒEND;2‰C�:=�C�MOD�255�+�1;�(*�0�CHECKSUM�IS�WILD�CARD�*)B‰BUFF(.1.)�:=�ASHEX(.C�DIV�16+1.);�(*�PLACE�CHECKSUM�INTO�BLOCK�*)"‰BUFF(.2.)�:=�ASHEX(.C�MOD�16+1.);‰REPEATŒFOR�J�:=�0�TO�BLKCNT-1�DO�BEGIN<�FOR�I�:=�J*CMAX+1�TO�(J+1)*CMAX�DO„(*�WRITE�OUTPUT�BLOCK�*)’WRITE(OUTPUT,BUFF(.I.));�WRITELN(OUTPUT);�END;ŒREADLN(INPUT,RESPONSE)6‰UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');‰Q�:=�RESPONSE(.1.)='T';5‰C�:=�BLKCNT*CMAX+1;‘(*�JUSTIFY�ANY�BLOCK�OVERFLOW�*)‰WHILE�C�<�P�DOŒBEGIN&ŒBUFF(.C-BLKCNT*CMAX+3.)�:=�BUFF(.C.); ŒC�:=�C�+�1ŒEND;8‰P�:=�P�-�(BLKCNT*CMAX�-�3);‰(*�RESET�NEXT�IN�POINTER�*)‰END;‚(*�OUTBLOCK�*) †BEGIN„(*�PUTREC�*)†WHILE�P�>�BLKCNT*CMAX+1�DO/‰OUTBLOCK('A');Š(*�OUTPUT�INTERMEDIATE�BLOCK�*)†IF�EOF(INFIL)†THEN‰BEGIN‰FOR�I�:=�P�TO�BLKCNT*CMAX�DO5ŒBUFF(.I.)�:=�'�';„(*�FORCE�BLANKS�TO�END�OF�BLOCK�*)'‰OUTBLOCK('Z');Š(*�OUTPUT�LAST�BLOCK�*) ‰Q�:=�TRUE;‰END†ELSEF‰IF�P�>�BLKCNT*CMAX�THEN�OUTBLOCK('A')�(*�OUTPUT�INTERMEDIATE�BLOCK�*)†END;…(*�PUTREC�*) ƒBEGIN„(*�MAIN�*) ƒQ�:=�FALSE; ƒINITIALIZE;ƒWHILE�NOT�Q�DO†BEGIN†GETREC(BUFFP,BUFF);†PUTREC(Q,BUFFP,BUFF,RESPONSE);†ENDƒEND.…(*�MAIN�*) PROC 1 FILE'ATTR FIL LRECL(80) BLKSIZE(80) RECFM(F)ALLOC DDNAME(OUTPUT) DSNAME(*)ALLOC�DDNAME(INPUT)‚DSNAME(*).ALLOC‚DDNAME(OUTFIL)�DSNAME(&FILE.)�USING(FIL) CALL ULOADFREEALLééé# T$PROGRAM UPLOAD(INPUT,OUTPUT,OUTFIL); E(*******************************************************************)C(*�THIS�PROGRAM�READS�PACKED�BLOCKS�FROM�THE�TERMINAL,�SEPARATESƒ*)?(*�INDIVUDUAL�RECORDS�AND�WRITES�THEM�TO�AN�OUTPUT�FILE.‚THE†*)+(*�PROGRAM�RUNS�ON�AN�IBM�370�UNDER�TSO.›*)E(*******************************************************************) !CONST�CMAX‚=‚80;‹(*�BLOCK�SIZE�*)%†RMAX‚=‚80;‹(*�MAXIMUM�RECORD�SIZE�*)5†BLKCNT=‚1;Œ(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*)+†BMAX‚=‚80;‹(*�BUFFER�SIZE�=�BLKCNT*CMAX�*)/†OPTION�=�'BB';‰(*�COM/CHAR�PROTOCOL�OPTIONS�*),†CHRMAX�=�255;Š(*�MAXIMUM�CHARACTER�VALUE�*) TYPE‚CINDEXƒ=‚0..255;$†RECTYPE‚=‚ARRAY(.1..RMAX.)�OF�CHAR;*†BFTYPEƒ=‚PACKED�ARRAY(.1..BMAX.)�OF�CHAR;†BFINDEX‚=‚INTEGER;*†BKTYPEƒ=‚PACKED�ARRAY(.1..CMAX.)�OF�CHAR; VARƒQ…:‚BOOLEAN; †OUTFIL:‚TEXT;–(*�OUTPUT�FILE�*)D†ASCII�:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ASCII�CHARACTER�CODES�*)@†ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;„(*�FOR�HEX�CONVERSION�*)Y^b)f7j0nE†NUMƒ:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ACCII-DECIMAL�CONVERSION�*))†RECƒ:‚RECTYPE;“(*�HOLDS�OUTPUT�RECORD�*)1†BUFFP�:‚BFINDEX;“(*�INDEX�INTO�HOLDING�BUFFER�*)$†BUFF‚:‚BFTYPE;”(*�HOLDING�BUFFER�*)3†COUNT�:‚INTEGER;“(*�HOLDS�CHAR�COUNT�FOR�RECORD�*)/†RESPONSE:�CHAR;•(*�HOLDS�RESPONSE�CHARACTER�*)4†BCNT‚:‚INTEGER;“(*�NUMBER�OF�REPEATED�CHARACTERS�*)&†BCHR‚:‚CHAR;–(*�REPEATED�CHARACTER�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; ŒCˆ:‚CHAR; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO‰BEGIN9‰ASCII(.CHR(I).)�:=�0;‰(*�INDICATE�NON-ASCII�CHARCTERS�*)‰NUM(.CHR(I).)�:=�0‰END;)†INTERACTIVE(INPUT);Ž(*#�UNIQUE�TO�IBM�*)†REWRITE(OUTFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); <†(*#�THE�FOLLOWING�STATEMENT�WAS�REQUIRED�TO�ALLOW�UPLOADING†OF�'~'�TO�IBM�*) †ASCII(.CHR(95).)�:=�126; †FOR�I�:=�1�TO�36�DO‰NUM(.ASHEX(.I.).)�:=�I�-�1;†NUM(.'�'.)�:=�0;†BUFFP�:=�BLKCNT*CMAX+1;†BUFF(.3.)�:=�'A';/†WRITE(OUTPUT,'PREAMBLEU');‰(*�SEND�PREAMBLE�*)(†WRITE(OUTPUT,OPTION);Ž(*�SEND�OPTION�*),†WRITE(OUTPUT,CMAX:3);Ž(*�SEND�BLOCK�SIZE�*)1†WRITELN(OUTPUT,BLKCNT:1);Š(*�SEND�BLOCK�COUNT�*)†RESPONSE�:=�'�';†END;‚(*�INITIALIZE�*)  .PROCEDURE GETREC(VAR Q:BOOLEAN; VAR P:BFINDEX;6“VAR�BUFF:BFTYPE;�VAR�REC:RECTYPE;�VAR�RESPONSE:CHAR); VARƒI,Jƒ:‚INTEGER;†C1,C2�:‚CHAR; GƒPROCEDURE�GETFRAME(VAR�BUFF:BFTYPE;�VAR�Q:BOOLEAN;�VAR�RESPONSE:CHAR);  ƒVARƒI…:‚INTEGER; ‰J…:‚INTEGER; ‰K…:‚INTEGER;‰CKSUM1:‚INTEGER;‰CKSUM2:‚INTEGER;‰TBLOCK:‚BKTYPE; †BEGIN�(*�GETFRAME�*) †IF�BUFF(.3.)�=�'Z'†THEN ‰Q�:=�TRUE; †IF�NOT�Q†THEN‰REPEATŒI�:=�1;ŒJ�:=�1;ŒIF�RESPONSE�<>�'�';ŒTHEN�WRITELN(OUTPUT,RESPONSE);�(*�RESPOND�TO�LAST�FRAME�*)ŒWHILE�J�<=�BLKCNT�DO�BEGIN�READLN(INPUT,TBLOCK); �J�:=�J�+�1;�FOR�K�:=�1�TO�CMAX�DO’BEGIN’BUFF(.I.)�:=�TBLOCK(.K.); ’I�:=�I�+�1;’END;�IF�BUFF(.1.)�=�'T'�THEN*’J�:=�BLKCNT�+�1;‚(*�FORCED�TERMINATION�*)�END;ŒQ�:=�BUFF(.1.)�=�'T'; ŒIF�NOT�QŒTHEN�BEGIN�RESPONSE�:=�'N';2�CKSUM1�:=�16*NUM(.BUF# F(.1.).)�+�NUM(.BUFF(.2.).);�IF�CKSUM1�<>�0�THEN’BEGIN ’CKSUM2�:=�0;’FOR�I�:=�3�TO�BLKCNT*CMAX�DO%•CKSUM2�:=�CKSUM2+ASCII(.BUFF(.I.).); ’CKSUM2�:=�(CKSUM2�MOD�255)�+�1;’IF�CKSUM1�<>�CKSUM2’THEN•RESPONSE�:=�'R'Œ(*�NAK�*)’END;�(*THEN*) �END�(*THEN*)‰UNTIL�(RESPONSE�=�'N')�OR�(Q)†END;�(*�GETFRAME�*)  ;ƒPROCEDURE�GETC(VAR�C:CHAR;�VAR�BUFF:BFTYPE;�VAR�P:BFINDEX;•VAR�Q:BOOLEAN); †BEGIN�(*GETC*)†IF�P�<=�BLKCNT*CMAX†THEN‰BEGIN‰C�:=�BUFF(.P.); ‰P�:=�P�+�1‰END†ELSE‰BEGIN‰GETFRAME(BUFF,Q,RESPONSE);‰C�:=�BUFF(.4.);‰P�:=�5‰END†END;�(*GETC*)  ƒBEGIN�(*�GETREC�*)2ƒGETC(C1,BUFF,P,Q);‹(*�DIGIT�#1�OF�LENGTH�FIELD�*)2ƒGETC(C2,BUFF,P,Q);‹(*�DIGIT�#2�OF�LENGTH�FIELD�*)ƒIF�C1�=�'�'�THEN�Q�:=�TRUE; ƒIF�NOT�QƒTHEN†BEGIN#†COUNT�:=�NUM(.C1.)*16�+�NUM(.C2.);†J�:=�1;†I�:=�1;†WHILE�I�<=�COUNT�DO‰BEGIN‰GETC(REC(.J.),BUFF,P,Q);‰IF�REC(.J.)�=�'|'‰THENŒBEGIN4ŒGETC(BCHR,BUFF,P,Q);„(*�GET�COMPRESSED�CHARACTER�*)(ŒGETC(C1,BUFF,P,Q);†(*�GET�COUNT�CODE�*)8ŒBCNT�:=�NUM(.C1.);†(*�COUNT�OF�COMPRESSED�CHARACTERS�*)ŒWHILE�BCNT�>�0�DO�BEGIN5�REC(.J.)�:=�BCHR;„(*�EXPAND�COMPRESSED�CHARACTERS�*)�BCNT�:=�BCNT�-�1; �J�:=�J�+�1�END;%ŒI�:=�I�+�3Ž(*�ADVANCE�GET�COUNTER�*) ŒENDƒ(*THEN*)‰ELSEŒBEGIN&ŒI�:=�I�+�1;�(*�ADVANCE�GET�COUNTER�*)&ŒJ�:=�J�+�1;�(*�ADVANCE�PUT�POINTER�*) ŒENDƒ(*ELSE*)‰END;‚(*WHILE*)†COUNT�:=�J�-�1;†END‚(*�THEN�*)ƒEND;�(*�GETREC�*)  5PROCEDURE PUTREC(VAR COUNT:INTEGER; VAR REC:RECTYPE); ƒVARƒI‚:‚INTEGER; ƒBEGIN�(*�PUTREC�*)ƒI�:=�1;ƒWHILE�I�<=�COUNT�DO†BEGIN†WRITE(OUTFIL,REC(.I.)); †I�:=�I+1†END;ƒWRITELN(OUTFIL);ƒEND;�(*�PUTREC�*) BEGIN„(*�MAIN�*) INITIALIZE; Q := FALSE;"GETREC(Q,BUFFP,BUFF,REC,RESPONSE);WHILE NOT Q DOƒBEGINƒPUTREC(COUNT,REC);#ƒGETREC(Q,BUFFP,BUFF,REC,RESPONSE);ƒEND;,WRITELN(OUTPUT,'T')�(*�TERMINATE�WITH�'T'�*)END.…(*�MAIN�*)éé'EXORMACSLOADMMU AF~~bbLOADMMU SA‡‡ kbbLOADMMU RO˜˜bbVECTORS AF¡¡bbVECTTBL AGªª•bbVECTORS SAÃÃbbVECTORS ROÌÌbbRMS CDÕÕRbbRMS CIææbbRMS LGïï mbbVECTTBL RObb=/*=/*†EXORMACS.LOADMMU.AF=/*.=/* Chain file to assemble EXORMACS.LOADMMU.SA=/*:=/* If no output argument is specified for the listing the2=/* chain file will default to EXORMACS.LOADMMU.LS=/*=/IFC \1ƒ=ARG�EXORMACS.LOADMMU.LS=/ENDIF=/*6=ASM EXORMACS.LOADMMU.SA,EXORMACS.LOADMMU.RO,\1;RZ=050=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*}=/*=END$ éééééév‰PAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.TST.EQ*‰NOLIST‰INCLUDEƒ9995.&.STR.EQ‰INCLUDEƒ9995.&.TCB.EQ‰INCLUDEƒ9995.&.TST.EQ‰LIST‰PAGELOADMMU‚IDNT‚2,0„LOAD�MMU*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�LOADMMU‚2.00„**ˆ*�HLD6ƒ09/18/80‚**ˆ*�HLD6ƒ03/30/81‚**ˆ**********************…LOAD�MMU�SUBROUTINE**…REGISTER�USAGE:ƒ01234567 *–D*********–A�*ƒ**…ENTRY:„A5�POINTS�TO�TST*‰SECTION�LEVEL00* ŠXDEFƒCRASN ŠXDEFƒDEASN ŠXDEFƒLOADMMUŠXDEFƒLOADMMUIŠXDEFƒMMUFAULT ŠXDEFƒUNLDMMU ŠXREF.S�MMUHEREŠXREF.S�MMULOADŠXREF.S�TRACERŠXREF.S�TRACFLAG*,LOADMMU‚MOVE.W‚SR,-(A7)ŠSAVE�STATUS�REGISTER)LOADMMUI�OR.W„#$700,SRŠINHIBIT�INTERRUPTS.‰MOVEM.L�TSTMMU(A5),D0-D7‚SEGMENT�DESCRIPTIONS/‰MOVE.L‚A5,MMULOADˆSAVE�ADDRESS�OF�CURRENT�LOAD!‰MOVE.L‚MMUHERE,A5ˆADDRESS�OF�MMU‰MOVEM.L�D0-D7,(A5)ˆLOAD�MMU*/‰BTST„#TRCFMMU,TRACFLAG�SHOULD�ENTRY�BE�TRACED?‰BEQ.SƒLOADMMUZŠBRANCH�IF�NO‰BSR…TRACERŒBUILD�TRACE�ENTRY‰DC.W„$DD08�TRACE�CODELOADMMUZ�RTE—RETURN‰PAGE*;*ˆThis�routine�will�unload�a�segment�from�the�EXORMACS�MMU.D*ˆThe�segment�to�unload�is�pointed�to�by�a�combination�of�A5�and�D5.C*ˆA5�points�to�the�TST�containing�the�segment,�and�D5�points�to�the?*ˆspecific�segment�within�the�TST.‚The�TSTCTL�field�within�thisA*ˆsegment�entry�should�be�set�to�zero�before�calling�this�module.B*ˆThis�tells�the�EXORMACS�MMU�that�that�segment�is�no�longer�valid=*ˆ(if�TSTCTL�(bit_0)�=�0),�and�therefore�we�have�successfully'*ˆ"unloaded"�that�segment�from�the�MMU.*A*ˆThis�routine�is�called�from�two�directives,�SEGDEAL�and�TFRSEG.A*ˆBasically�it�just�calls�LOADMMU�to�mve�the�new�segment�map�into=*ˆthe�EXORMACS�MMU.‚However,�there�is�one�complication.‚Since?*ˆSEGDEAL�can�delete�a�segment�from�a�target�tasks�TST,�we�must@*ˆverify�that�the�requesting�task�is�also�the�target�task�before=*ˆcalling�LOADMMU.‚If�we�didn't�do�this�check�we�would�arriveJˆ"$ ?*ˆat�the�situation�where�we�return�to�the�requesting�task,�with6*ˆthe�MMU�containing�the�load�map�for�the�target�task.*2*ˆHere�is�the�algorithm�for�performing�this�check: -*�if�(tcb_tst�(client_task)�=�target_tst_ptr)&*�then�call�load_mmu�(target_tst_ptr); UNLDMMU::‰CMP.L…TCBTST(A6),A5‡Does�A5�point�to�the�requestor's�TST?‰IFˆ†THEN.S„Branch�if�no. '‰MOVEM.LƒD0-D7/A5,-(A7)†Save�registers.5‰BSR.S…LOADMMU�Load�the�new�segment�map�into�the�MMU.*‰MOVEM.Lƒ(A7)+,D0-D7/A5†Restore�registers. ‰ENDI ‰RTS›Return.‰PAGE*J*‚Dummy�entry�points--our�MMU�isn't�an�M68451,�but�other�exec�routines�areK*‚going�to�be�calling�us�at�these�entry�points�because�they�don't�know�what *‚we�have.*CRASN:DEASN: MMUFAULT: &ŠRTS—Just�return--he'll�never�know....   ‰ENDéééé41LOADMMU ASYST'EXORMACSLOADMMU SA"2…LOAD MMUŒ2BLOADMMU BLOADMMUI BMMUFAULT :pMMULOAD BUNLDMMU (BCRASN :BDEASN :pTRACER pTRACFLAG pMMUHERE ",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.¢5«9³(H*‚In�the�case�where�two�contiguous�VECTOR�invocations�leave�a�gap�in�theK*‚vector�#'s,�those�vector�#'s�in�the�gap�will�be�assigned�the�same�handler9*‚as�that�of�the�lower�vector�#�of�the�pair.‚For�example,+*‰VECTOR�$23,0ŽPoints�$23�to�$27�to�COMINT.-*‰VECTOR�$28,1ŽLeaves�$28�to�$2F�as�they�are.-*‰VECTOR�$30,ROUTINE1‡Points�$30�to�ROUTINE1.G*‚If�the�gap�to�be�filled�has�a�second�parameter�other�than�0�or�1,�theJ*‚address�assigned�to�the�vector�will�be�incremented�by�2�for�each�vector:7*‰VECTOR�$23,XŽPoints�$23�to�X,�$24�to�X+2,�$25�to�X+4.$*‰VECTOR�$26,0ŽPoints�$26�to�COMINT.'*‚The�end�of�the�list�is�signified�by�a*‰DC.Lƒ0F*‚and�the�second�parameter�of�the�last�prior�VECTOR�invocation�will�beK*‚applied�to�all�further�vectors,�up�to�$FF.‚Again,�if�the�second�parameterK*‚was�not�a�0�or�1,�the�address�assigned�to�the�vectors�will�be�incremented#*‚by�2�for�each�vector�in�sequence.* VECTOR„MACROŒIFLEƒ\1-VECT_NUM0ŽFAILƒ499ŒVector�#'s�must�be�in�ascending�order!ŽMEXITŒENDCŒIFNCƒ'\2','0'ŽIFNCƒ'\2','1'�XREFƒ\2ŽENDCŒENDCVECT_NUM„SET„\1ŒDC.Lƒ\1<<24+\2ŠENDM  * *‚First�set�up�the�table�header.*ŠSECTION�LEVEL00  0ŠDC.Lƒ'!VCT'�Dump�eyecatcher�for�'VeCtor�Table.'2ŠDC.LƒCOMINT�Put�the�address�of�COMINT�here�so�the"*§exec�initializer�can�find�it;�he#*§isn't�linked�with�the�exec,�so�he*§wouldn't�know�otherwise.ŠPAGE*)*‚Here�are�the�actual�vector�assignments.I*‚Notice�that�whether�or�not�the�illegal�instruction�vector�is�taken�overE*‚by�RMS68K�is�controlled�by�an�sysgen�parameter.‚During�RMSGEN,�this$*‚parameter�is�substituted�such�thatA*„0�=�the�exec�should�leave�the�illegal�instruction�vector�alone.?*„1�=�the�exec�should�take�over�the�illegal�instruction�vector.J*‚You�might�want�the�exec�to�leave�the�illegal�instruction�vector�alone�ifI*‚you�want�to�use�the�ROM�debugger,�since�it�uses�illegal�instructions�as*‚breakpoints.* 8VECT_NUM‚SET„1’Initialize�the�vector�number�to�1�so�that&*§the�lowest�vector�number�that�can�be*§set�afterwards�is�2.7*‰VECTOR�$00,CALLKILLŠSHOULD�NEVER�GET�HERE�this�was�in>*‰VECTOR�$01,CALLKILLŠSHOULD�NEVER�GET�HERE�4.2�exormacs�vectt*ŠVECTOR�$02,PROGINT2‡Bus�error.#ŠVECTOR�$03,PROGINT3‡Address�error.$*§If�we're�not�supposed�to�take�over/ŠIFEQƒ\ILLINSTRŠthe�illegal�instruction�vector,9ŠVECTOR�$04,1Žleave�the�illegal�instruction�vector�alone.ŠENDC–*!*§If�we�are�supposed�to�take�over/ŠIFNEƒ\ILLINSTRŠthe�illegal�instruction�vector,>ŠVECTOR�$04,PROGINT4‡take�over�the�illegal�instruction�vector.ŠENDC–*#ŠVECTOR�$05,PROGINT5‡Division�by�0.+*‚in�sequence„$06,PROGINT6ŠCHK�instruction.-*‚in�sequence„$07,PROGINT7ŠTRAPV�instruction./*‚in�sequence„$08,PROGINT8ŠPrivilege�violation.'ŠVECTOR�$09,PROGINT9‡Instruction�trace.8ŠVECTOR�$0A,PROGINTA‡Reserved�instruction�opcodes�$AXXX.>*‚in�sequence„$0B,PROGINTBŠReserved�instruction�opcodes�$FXXX.'ŠVECTOR�$0C,0Ž($0C�-�$0E�go�to�COMINT.)+ŠVECTOR�$0F,KILLER‰Uninitialized�Interrupt.'ŠVECTOR�$10,0Ž($10�-�$17�go�to�COMINT.)'ŠVECTOR�$18,SPURINTˆSpurious�interrupt.'ŠVECTOR�$19,0Ž($19�-�$1C�go�to�COMINT.)'ŠVECTOR�$1D,0Ž($1D�-�$1F�go�to�COMINT.)ŠVECTOR�$20,TRAP0ŠTRAP�#0.ŠVECTOR�$21,TRAP1ŠTRAP�#1.#ŠVECTOR�$22,TRPVCT2ˆTRAP�#2�to�#15.'ŠV& ECTOR�$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éŠ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éééééé»=1VECTORS ASYST'EXORMACSVECTORS SA"…INTERRUPT VECTORS 2pPROGINT4 pSYSPAR (*3�((þˆ4ééé& ééééÄ'***************************************'* Sysgen command file EXORMACS.RMS.CD *'***************************************SYSTEM„=�"EXORMACS"*E*‚Indicate�whether�or�not�you�will�have�an�MMU�in�the�system.‚You�mayF*‚tell�the�system�there�is�no�MMU�even�if�one�is�physically�installed;*‚it�just�won't�ever�be�used.*MMU‡=�1Œ0�=�no�MMU;�1�=�MMU.*C*‚Select�the�appropriate�LOADMMU�module�to�be�included�in�the�LINK.* IFEQ \MMU.ƒ=COPY�NOMMU.LOADMMU.RO,EXORMACS.XLOADMMU.RO;YENDC IFNE \MMU1ƒ=COPY�EXORMACS.LOADMMU.RO,EXORMACS.XLOADMMU.RO;YENDC*%* Assemble SYSPAR (System Parameters)*INCLUDE…C4O9.SYSPAR.CI*:*�Define�RMS's�starting�address.‚Pass�starting�address�and?* stack address to VERSAdos sysgen through file EXORMACS.RMS.CI*%RMS‡=�$0‹Address�where�RMS68K�starts.SUBS†&.RMSEXM.CI$=COPY…&.XRMSEXM.CI,EXORMACS.RMS.CI;Y*C*‚Now�indicate�whether�or�not�the�exec�should�take�over�the�illegalC*‚instruction�vector.‚If�you�are�going�to�be�using�the�ROM�debuggerE*‚to�set�breakpoints,�then�you'll�want�the�illegal�instruction�vectorB*‚left�as�the�debugger�has�it�set.‚In�an�environment�where�the�ROMB*‚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.**'*‚Now�create�a�VECTTBL�for�this�system.*SUBSˆEXORMACS.VECTTBL.AGDASM‰EXORMACS.VECTTBL.AG,EXORMACS.VECTTBL.RO,EXORMACS.VECTTBL.TF;Z=50*)* Now we generate the RMS68K load module.* Now link it all together.* RMS0LO„=�\RMSRMS0HI„=�\RMS+$BFFRMS2LO„=�\RMS+$C00*SUBSˆEXORMACS.RMS.LGLINKˆEXORMACS.RMS.LG=DELˆ&.SYSPAR.RO*!* Create one concatenated listing*+=COPY‡EXORMACS.VECTTBL.TF,EXORMACS.RMS.LL;A&=COPY‡C4O9.SYSPAR.TF,EXORMACS.RMS.LL;A** Cleanup junk files* =DELˆ*.*.TF;Y*0* The following files are created by this RMSgen**ˆC4O9.SYSPAR.RO$*ˆ&.SYSPAR.RO‰copy�of�C4O9.SYSPAR.RO*ˆEXORMACS.RMS.LOÍIÖ *ˆEXORMACS.RMS.LL*ˆEXORMACS.RMS.CI**ˆ&.XSYSPAR.AG*ˆ&.XRMSEXM.CI*ˆEXORMACS.XVECTTBL.AG*ˆEXORMACS.VECTTBL.RO*ˆEXORMACS.XRMS.LG*END‰é' éééééé* *ˆ&.RMSEXM.CI*ˆEXORMACS�.RMS.CI*B******************************************************************0*�RMS�sysgen�include�file�for�VERSAdos�sysgen.“*B*******************************************************************7* This file is created at RMSgen time to be included in*ƒthe�VERSAdos�sysgen.*PCˆ=�$0 STACK…=�$900STARTRMS‚=�$0+$C00 ROMSADDR‚=�$0MMU‡=�$1ééééééÞ=/*=/*†EXORMACS.RMS.LG=/*$=/* RMS link chain file for EXORmacs=/*E=/*�Note:‚Module�LOADMMU�in�this�catalog�uses�the�MMU�on�the�EXORMACSD=/*ˆprocessor�board.‚If�you�want�to�generate�a�system�which�pretendsD=/*ˆthat�there�is�no�MMU,�change�t' he�IN�statement�in�this�link�chainH=/*ˆfile�to�bring�in�EXORMACS.FAKEMMU.RO�instead�of�EXORMACS.LOADMMU.RO.=/*6=LINK ,EXORMACS.RMS.LO,EXORMACS.RMS.LL;H,M,I,X,-U,Z=40SEG�RMS0:0�\RMS0LO,\RMS0HISEG�RMS2:2,3,4,5,6,7,15‚\RMS2LOINPUT EXORMACS.VECTORS.ROIN‹&.SYSPAR.ROIN†M68XXX.RMS.ROIN„EXORMACS.VECTTBL.ROIN†M68XXX.AKRQST.ROIN†M68XXX.ASQALOC.ROIN†M68XXX.ASQEVENT.ROIN†M68XXX.ASQFREE.ROIN†M68XXX.ASQGET.ROIN†M68XXX.ASQREAD.ROIN†M68XXX.ASQSTATS.ROIN†M68XXX.ASRINT.ROIN†M68XXX.ATSEM.ROIN†M68XXX.BKG.ROIN…NOCACHE.CACHE.ROIN†M68XXX.CDIR.ROIN†M68XXX.CISR.ROIN†M68XXX.CKDELAY.ROIN†M68XXX.CKEXPAT.ROIN†M68XXX.CMR.ROIN†M68000.COMINT.ROIN†M68XXX.DCLSHAR.ROIN†M68XXX.DELAY.ROIN†M68XXX.DEMON.ROIN†M68XXX.DERQST.ROIN†M68XXX.DESEM.ROIN†M68000.DISPATCH.ROIN†M68XXX.DSEGX.ROIN†M68XXX.DSEMX.ROIN†M68XXX.DSERVE.ROIN†M68XXX.DSRVX.ROIN†M68XXX.EQDQ.ROIN†M68XXX.EXABRT.ROIN†M68000.EXCEPT.ROIN†M68000.EXIT.ROIN†M68XXX.EXMMSK.ROIN†M68XXX.EXMON.ROIN†M68XXX.EXMONVR.ROIN†M68XXX.EXQEVENT.ROIN†M68XXX.EXRQPA.ROIN†M68XXX.FNDGSEG.ROIN†M68XXX.FNDTSEG.ROIN†M68XXX.FNDUSEM.ROIN†M68XXX.GETTCB.ROIN†M68XXX.GTDTIM.ROIN†M68XXX.GTTASKID.ROIN†M68XXX.GTTNAME.ROIN†M68XXX.KILLER.ROIN„EXORMACS.XLOADMMU.ROIN†M68XXX.LOGPHY.ROIN†M68XXX.PAGEALOC.ROIN†M68XXX.PAGEFREE.ROIN†M68XXX.PAUSE.ROIN†M68XXX.POWRFAIL.ROIN†M68XXX.PSTATE.ROIN†M68000.PVSEM.ROIN†M68XXX.RCVSA.ROIN‡M6840.RDTIMER.ROIN†M68XXX.READY.ROIN†M68XXX.RELINQ.ROIN†M68XXX.RESUME.ROIN†M68XXX.REXMON.ROIN†M68XXX.RQSTPA.ROIN†M68XXX.RSTATE.ROIN†M68XXX.RTEVENT.ROIN†M68XXX.SEGALOC.ROIN†M68XXX.SEGDEAL.ROIN†M68XXX.SEGSHAR.ROIN†M68XXX.SELFTEST.ROIN†M68XXX.SERVE.ROIN†M68XXX.SETPRI.ROIN†M68XXX.SGSEM.ROçUðIN†M68000.SINT.ROIN†M68XXX.SNAPTRAC.ROIN†M68XXX.SPURINT.ROIN†M68XXX.STDTIM.ROIN†M68000.SUPER.ROIN†M68XXX.SUSPEND.ROIN†M68XXX.TERM.ROIN†M68XXX.TFRSEG.ROIN‡M6840.TIMEINT.ROIN†M68XXX.TRACER.ROIN†M68000.TRAP0.ROIN†M68000.TRAP1.ROIN†M68XXX.TSKATTR.ROIN†M68XXX.TSKBORN.ROIN†M68XXX.TSKINFO.ROIN†M68XXX.TSKMOVE.ROIN†M68XXX.TSKSTART.ROIN†M68XXX.TSKWAIT.ROIN†M68XXX.USERVECT.ROIN†M68XXX.WAKEUP.ROIN†M68XXX.WTEVENT.ROINPUTƒM68XXX.RMSPATCH.ROEND=/*=ENDéééééé( P1VECTTBL ASYST'EXORMACSXVECTTBLAG"GE…RMS68K vector table for the EXORMACS•2pPROGINT2 pPROGINT3 pPROGINT4 pPROGINT5 pPROGINT9 pPROGINTA pTIMEINT pSPURINT pTRAP0 pTRAP1 pKILLER pCOMINT pTRPVCT2 "`v3?’€!VCT(,,,,, , ,,, ,!,"0,Œ�Ž�• 34ééééééø'M146818 RDTIMER AF  bbRDTIMER SA7bbRDTIMER RObbTIMEINT AF((bbTIMEINT SA11IbbTIMEINT RO::bbSTDTIM ROCCbbTRACER ROLLbb=/*=/*†M146818.RDTIMER.AF=/*@=/* Chain file to assemble file for M146818 Real Time Clock chip=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M146818.RDTIMER.LS=/*=/IFC \1ƒ=ARG�M146818.RDTIMER.LS=/ENDIF=/*4=ASM M146818.RDTIMER.SA,M146818.RDTIMER.RO,\1;RZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDé( éééééŠPAGE**ˆINCLUDE�FILES**‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.INTERRUP.MCŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE@RDTIMERƒIDNTƒ5,0ŒREAD�TIMER�routine�for�M146818�real�time�clock.*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�RDTIMER‚1.00„**ˆ*’**ˆ*�HLD6ƒ09/30/80‚**ˆ*�SFF5ƒ01/18/83‚**ˆ*********************,*…READ�TIMER�-�RETURN�TIMER�VALUE�(MS)�IN�D1*™TIMER�VALUE�(US)�IN�D0*ŠSECTION�LEVEL00* ŠXDEFƒRDTIMER ŠXDEFƒSBRDTIM  **ˆSYSPAR�parameters* ŠXREF.S�NSEŠXREF.S�MIDNIGHTŠXREF.S�TIME_LEFTŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAGŠPAGESBRDTIM:RDTIMER:'ŠMOVE.W�SR,-(A7)‹Value�to�use�in�unmask/ŠMOVE.L�#1000,D0‹1000�-�TIMINTV4�=�microsecondsŠDISABLE_INTERRUPTS %ŠMOVE.L�NSE,D1�Next�significant�eventŠSUB.L‚TIME_LEFT,D10ŠSUB.L‚MIDNIGHT,D1ˆD1�=�current�ms�past�midnight#ŠBCLRƒ#31,D1�Insure�positive�numberŠSUB.W‚TIMINTV4,D0ˆMICROSECONDS ŠMOVE.W�(A7)+,SRŠRTSŠENDééé8[1RDTIMER ASYST'M146818 RDTIMER SA"…READ TIMER routine for M146818 real time clock.[2pNSE BRDTIMER pTIME_LEF pTIMINTV4 BSBRDTIM pMIDNIGHT pTINTFLAG "$*3Q@ç <è|"8 ’¸ ’¸ ��x FßNu4) ééééééé=/*=/*†M146818.TIMEINT.AF=/*7=/* Chain file to assemble M146818.TIMEINT.SA for 68010=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M146818.TIMEINT.LS=/*=/IFC \1ƒ=ARG�M146818.TIMEINT.LS=/ENDIF=/*F=ASM M68010.M68010.SA/M146818.TIMEINT.SA,M146818.TIMEINT.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9999.M146818.M146818.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒM68XXX.TIMEINT.AI=/*}=/*=ENDééééé)  ŠPAGE**ˆINCLUDE�FILES**ˆINCLUDE�9995.&.STR.EQ!*ˆINCLUDE�9999.M146818.M146818.EQ*ˆINCLUDE�9995.&.BAB.EQ*ˆINCLUDE�9995.&.PAT.EQ*ˆINCLUDE�9995.&.TR1RTCD.EQ*ˆINCLUDE�9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQ ŠINCLUDE�9999.M146818.M146818.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.INTERRUP.MCŠLIST?TIMEINTƒIDNTƒ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ƒTIMEINT ŠXREF.S�DATEŠXREF.S�PATBEGŠXREF.S�PREEMPT_FLAGŠXREF.S�PTMADDRŠXREF.S�TIME_LEFTŠXREF.S�TIMESLICŠXREF.S�TIMEOUTŠXREF.S�TIMINTVŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAGŠXREF.S�TRACERŠXREF.S�TRACFLAG ŠXREFƒBKG_SCHEDULE ŠXREFƒCKDELAY ŠXREFƒCKEXPAŠXREFƒPAT_RM_1ST_NODE**0TIMEINTƒMOVEM.L�D0-D1/A0-A1,-(A7)�SAVE�REGISTERS ŠMOVE.L�PTMADDR,A0‰TIMER�ADDRESS6ŠMOVE.B�REGC(A0),D0ˆREAD�REGC�TO�CLEAR�TIMER�INTERRUPT ŠCLR.W‚D04ŠMOVE.L�#15,D1�Amount�of�time�to�decrement�TIME_LEFT-ŠMOVE.W�SR,-(A7)‹Value�to�use�in�unmask�laterŠDISABLE_INTERRUPTSˆMask.ŠSUB.W‚#625,TIMINTV4†625�usec�HAVE�ALSO�PASSEDŠIF��THEN.S�ADD.L‚#1,D1‹Add�the�extra�ms"�ADD.W‚#1000,D0ˆand�Reset�us�countŠENDI !ŠADD.W‚D0,TIMINTV4ˆReset�us�count.ŠSUB.L‚D1,TIME_LEFT‡Do�we�need�to�fire�a�node?ŠMOVE.W�(A7)+,SR‹Unmask+ŠTST.L‚TIME_LEFTŠDo�we�need�to�fire�a�node?+*‰INCLUDE�M68XXX.TIMEINT.AI�Yes�-�so�do�it.ŠINCLUDE�M68XXX.TIMEINT.AIŠENDé)JZ1TIMEINT ASYST'M146818 TIMEINT SA"3…TIMER INTERRUPT HANDLER FOR M146818 CLOCK CHIPÛ2pPTMADDR pPREEMPT_ pPERTURB_ pCOMINT_P pDATE pTIMESLIC BTIMEINT pTIMEOUT pTIME_LEF pTIMINTV pTIMINTV4 pPAT_RM_1 pCKEXPA pTRACER pPATBEG pTRACFLAG pBKG_SCHE pTINTFLAG pCKDELAY "ÆF3�HçÀÀ x (B@r@ç|xq nR�@èÑx “¸ FßJ¸ n"x AéCú¤@A)¤ÀA¤ÀAB¤@A\¤A[¤f3UUUUÀA<¤@A¤@A(¤ÀAV¤@ A#¤A2¤A%¤@ AR¤A¤ÀAC¤A¤ÀAI¤A9¤A?¤ÀA"¤À AP¤f3UUUU@AH¤@$A'+ ¤@8A8¤ÀA¤ÀAF¤A:¤ÀAU¤AY¤A¤AS¤ÀA¤A¤A¤AX¤AL¤AL¤f3UUUU@ A/¤@ AJ¤@ AE¤@ A3¤@ A0¤A4¤AL¤AL¤AL¤AL¤@A=¤A,¤A;¤ÀA7¤AL¤AL¤f3UUUUAL¤@A¤AG¤A¤ÀA¤@A$¤AL¤ÀA-¤ÀA+¤À A5¤À AQ¤À AK¤À AO¤AL¤AL¤@AD¤R3T�€@A.¤@A&¤A1¤8 TgaB*þjÿ.)g".èg~aBWþPå@kN @,bDGúþžR3 H$3g2*HE…ÿ, n6aB^þ$`Nq`BMþ(FgAÔaBþ``BNþ*HNó I3P`BLýþ$x @$ gôä@D@°jnêS@Àü EòJªgÚ4*‚f"²®fÈ-W8BnH>3$?Hz @ç$jNÒ0.HfBý¬0gB!ý¦ @fAÖaB ýš`Bý–4cK1COMINT ASREL'M68XXX COMINT SA!EH(…68000 common interrupt handler.ü2pLOADMMU pLOADMMUI pPTMADDR pMMULOAD pPREEMPT pPREEMPT_ BCOMINTZ pPERTURB_ pIOVCTBGN pVCTUBGN BCOMINT_P ,pSBWAKEUP pSBQEVNTI pTRACER pKILLER BCOMINT pRUNNER BISRERR BISRRTE ¨pBKG_FLAG pBKG_HEAD +2pTRACFLAG pBKG_DISP BCOMNISR f"JL3$  8 !gaAöî`*_aAì _N`Lßÿ\�|Jx fNsj?_f aA"ÈJ8 fJ3"@Ns?_'fö/,x Hî?ÿL× NiHî8`Aœ@ç8 !gaAŽî HçÿþNi/ /9L3€ ( oF,hHV/(@À@ÿ?"h 0P*n6`BÿZ fÿr\�,_( „!TCBgaBÿ@L3€€J@gÿJ @f AÖaBÿ.`ÿ: @fÿ2J�f&HC4<HBAÖaBÿNq`ÿHBHA(&L3@€64< ‚HB4`àâˆ&T�(,_" �!TCBgaBþÜCð=C^AÖaBþÎJ®@gþÖ$< ÿÿ3HCHD6`¤4éééél<1DISPATCH ASREL'M68XXX DISPATCHSA!FV(…68000 DISPATCHERã2pLOADMMU pREADYHD BPREEMPT pPREEMPT_ pPERTURB_ pTIMESLIC pSBREADY pTIMEOUT pTERM pTRACER pKILLER pRUNNER BDISPATCH pTRACFLAG pEXCSTACK pBKG_DISP pSBEXABRT BL1_D0_SA pSBLOGPHY "¦I3(€-@L× NiHî8AÖaAì.x |øÿMø!ô|"N ) gì,@.,fð#n ®H3 °-!Î /.D/.@Qø 1ø  pàÀ.-fh|øÿ*n6aA– n<€™AÖaBþÞ܇(F9n@ÿú)nBÿü-'fLîÿI3Hìÿÿ¾Lî0Hìÿî -/@-@B`ÿ*n6aBþ– n*8 "]…š�Nh,œ… n6aB'þ`Nq`"(F CN`&8 "UC _8ß¿Ãfú/?,ÿú/<<`L3$B† m n _-_¸-_¼/.)g".èg a nBýÀJfBýº \3!RAnCø  1pfBý¦aB&ý¢`BýžJFfBý˜AÖaB$ý’ HzýŽ�Ÿ`Bý† P�` €)R`BýtI3€~$.èffffNLî?ÿ,_` z,.ð n6aB'ýB`Nq`&~ F&(.O3 "ô·„f È®ìg-Cô`"R‡È®ìggBýRnø .ø°nøbBüþ~aN`Büö.�F3 /,x ½üg0/ f(.)g .è8gîè,_"¯Pø Ns,_L3$"/8 #NuaBü¨$< 4.&.(.8áL<AîàaBü†`®)Lîÿt®3@-@&Nuî ,X�`B ü`4~=1EXIT ASREL'M68XXX EXIT SA!P@(…68000 EXIT MODULEÿ2BEXIT_TER 2pPREEMPT pPREEMPT_ pPERTURB_ BEXIT_POS .BEXIT_ERR ”BEXIT_TRA ‚BEXIT_ASR .BEXIT_SUB BEXIT_EXC pRUNNER BERROR_01 BBERROR_02 FBERROR_03 , JBERROR_04 NBERROR_05 RBERROR_06 VBERROR_07 Z×2BERROR_08 ^BERROR_09 bBERROR_10 fBERROR_11 jBERROR_12 nBERROR_13 rBERROR_14 vBERROR_15 zBERROR_16 ~pDISPATCH BEXIT_D0A 2BEXIT_D0S pEXCSTACK pBKG_DISP pL1_D0_SA "´L3R .`p|Jx f Lî?þ,_NsjAâaAÞJ8 gè`AÔB®L× NiHî8`H3€AÀp`Np`Jp`Fp`Bp`>p`:p`6p`2p `.p `*p `&p `"p `p`p`p:3@`=@=|ç�G` H@0<.H@ x QˆYˆ.H|`ÿV4ééééé‡K1PVSEM ASREL'M68XXX PVSEM SA!QA(…68000 TRAP 0--SEMAPHORE ROUTINEŒ2BPSEM pSBREADY BVSEM ªBSBP BSVXSTAK VBSBV ªpKILLER BPSWAIT 2pDISPATCH pEXCSTACK "æJ3€@ç|JÐkü0ãHâ@S@0€kFßNua:U.ra�FßAÖaAÔ`AÐî ,B® (F3f!NNu*@ - fø+N NuHç .&|ð&î-HîÿtNl-L< 8 Kï ��I3 €Pn@rIî™ÀäHd8Ý`(ÝQÈÿüLß0NuaBÿX@ç|JÐkü0ãHâ@R@o0€,3FßNu/ "h!i €0€B© © ,"_FßNu4éééééé- �V1SINT ASREL'M68XXX SINT SA!R (…68000 DIRECTIVE--SIMULATE INTERRUPT TO ISRW2pVCTUBGN pEXIT_SUB ESINT pTRACER pERROR_09 pERROR_14 pTRACFLAG %ZK3€@B‚,"x J1 oAðBƒ,g Co`AÞá‹à Hz@çåŠ B/?8!g'3BHaA¾îNs8!gaA®Ý`A¨4éééééé™W1SUPER ASREL'M68XXX SUPER SA!S(…M68000 DIRECTIVE--SWITCH TO SUPERVISOR MODEb2pLOADMMU pEXIT_SUB pRUNNER pPANEL FSUPER pERROR_01 pEXCSTACK pSBLOGPHY &VN3 D . €Kª{ûfAôJnpg x (fAà x Uˆ, z n6aAÎ`Nq`AÆ*FLî 3 ÿN•,x *n6aA°`A¬4éééé- éé¢L1TRAP0 ASREL'M68XXX TRAP0 SA!T#(…68000 TRAP #0 handler and table.ÿ2pKILLERT0 pPSEM pEXQEVNTI pEXQEVNTN pEXQEVNTT pVSEM pCALL_GUA pRDTIMER BTRAP0 PHI_DIR_N %pWAKEUPX pLOGPHY BTABLE0 JpKILLER pGETTCB pGTXTCB pEXRQPA pTCBCR pPAUSE pREADY pPAGEFREE pBKG_SCHE =2pFNDGSEG pFNDTSEG pPAGEALOC pFNDUSEM pLOGPHYO "–H3@ fNsT� €%bAîЀ0;2Nû./ �%bÒ�2;Aû±ü(f �@g~3ÿÿÿT¯"NuA¶A¶A¶A!¶A&¶A"¶A¶A%¶A¶A$¶A¶A¶A'¶A¶A ¶A¶A¶A¶A¶A¶A¶A¶A¶A¶A¶A¶A(¶A¶,3þÀA¶A¶A¶A¶A¶A¶A¶ÿÔA#¶A¶4ééééé«'M68010 M68010 SAÀÀbbTRAP1 AFÉÉbbTRAP1 ROÒÒbbCOMINT ROÛÛbbDISPATCHROääbbEXCEPT ROííbbEXIT ROööbbPVSEM ROÿÿbbSINT RObbSUPER RObbTRAP0 RObb.  ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68010‚Type�of�processorééééééé¸=/*=/*†M68010.TRAP1.AF=/*6=/* Chain file to assemble M68XXX.TRAP1.SA for a 68010=/*:=/* If no output argument is specified for the listing the.=/* chain file will default to M68010.TRAP1.LS=/*=/IFC \1ƒ=ARG�M68010.TRAP1.LS=/ENDIF=/*?=ASM M68010.M68010.SA/M68XXX.TRAP1.SA,M68010.TRAP1.RO,\1;RZ=075=/*{ Included files are:=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.ENV.EQ=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*}=/*=ENDééééé. éÁL1TRAP1 ASYST'M68XXX TRAP1 SA""A…68010 TRAP #0 handler and table.÷2pSUSPEND pRTEVENT pCDIR pSBGETTCB pSEGSHAR pTSKWAIT pWTEVENT pASQEVENT pGTTASKID pASQSTATS pCMR pCISR pEXIT_POS pTSKINFO pEXIT_ERR pSBREADY pEXIT_SUB pTSKATTR pTSKSTART pSINT pTERM BTRAP1 û2BTTB_01 :BTTE_01 @pGTDTIM pEXPVCT pCRTCB pATTSEG pTRACER pDEMON pDSERVE pEXMON pSTDTIM pATSEM pCRSEM pFLUSHC pABORT pDESEM pDESEMA pEXMMSK pRUNNER pAKRQST pTRPVCT pDELAY þ2pDELAYW pDERQST pRCVSA pSERVER pTFRSEG pRELINQ pUDRBEG pISRRTE pMOVELL pRESUME pMOVEPL pSGSEM pRQSTPA pSUPER pSTOPT pWAKEUP pWTSEM pPSTATE pERROR_01 pERROR_02 pERROR_03 pREXMON pSETPRI  2pRSTATE pTERMT pASQREAD pTRACFLAG pASQALOC pGTTNAME pCKEXMON pGTEVENT pASQFREE pSEGALOC pSNAPTRAC pDCLSHAR pSEGDEAL pSBLOGPHY "pF3@?_'fD|/,x 6Hî?ÿ.)g.å@k. @,b,(H$;,j g*@ •!TCB^3!UUg`AN¼*NNû `AA²`:`®`AL¦AL¤ÀAZ¤ÀA]¤ÀA>¤@A)¤ÀA¤ÀAB¤@A\¤A[¤f3UUUUÀA<¤@A¤@A(¤ÀAV¤@ A#¤A2¤A%¤@ AR¤A¤ÀAC¤A¤ÀAI¤A9¤A?¤ÀA"¤À AP¤f3UUUU@AH¤@$A'¤@8A8¤ÀA¤ÀAF¤A:¤ÀAU¤AY¤A¤AS¤ÀA¤A¤A¤AX¤AL¤AL¤f3UUUU@ A/¤@ AJ¤@ AE¤@ A3¤@ A0¤A4¤AL¤AL¤AL¤AL¤@A=¤A,¤A;¤ÀA7¤AL¤AL¤f3UUUUAL¤@A¤AG¤A¤ÀA¤@A$¤AL¤ÀA-¤ÀA+¤À A5¤À AQ¤À AK¤À AO¤AL¤AL¤@AD¤R3T�€@A.¤@A&¤A1¤8 TgaB*þjÿ.)g".èg~aBWþPå@kN @,bDGúþžR3 H$3g2*HE…ÿ, n6aB^þ$`Nq`BMþ(FgAÔaBþ``BNþ*HNó I3P`BLýþ$x @$ gôä@D@°jnêS@Àü EòJªgÚ4*‚f"²®fÈ-W8BnHB3 ??<„Hz @ç$jNÒ0.HfBý¨0gB!ý¢ @fAÖaB ý–`Bý’4ÊK1COMINT ASREL'M68XXX COMINT SA!X(…68010 common interrupt handler.ü2pLOADMMU pLOADMMUI pPTMADDR pMMULOAD pPREEMPT pPREEMPT_ BCOMINTZ pPERTURB_ pIOVCTBGN pVCTUBGN BCOMINT_P ,pSBWAKEUP pSBQEVNTI pTRACER pKILLER BCOMINT pRUNNER BISRERR BISRRTE ¬pBKG_FLAG pBKG_HEAD +2pTRACFLAG pBKG_DISP BCOMNISR f"PL3$  8 !gaAöî`*_aAì _N`Lßÿ\�|Jx fNsj?_f aA"ÈJ8 fJ3"@Ns?_'fö/,x Hî?ÿL× NiHî8`Aœ@ç8 !gaAŽî HçÿþNi/ /9I3€( oF,hHV?<„/(@À@ÿ?"h 0P*n6`BÿV fÿnP�,_( „!TCBgO3@ aBÿ<€™AÖaBþÞ܇(F9n@ÿú)nBÿü-'fLîÿI3Hìÿÿ¾Lî0Hìÿî -/@-@B`ÿ*n6aBþ– n*8 "]…š�Nh,œ… n6aB'ýŒ`Nq`"(F CN`&8 "UC _8ß¿Ãfú/F3?,ÿú/<<`B† m n _-_¸-_¼/.)g".èg a n^3�…IBý.JfBý( nCø  1pfBýaB&ý`Bý JFfBýAÖaB$ý Hzüü�Ÿ`Büô P�M3` €)R`Büâ~$.èffffNLî?ÿ,_` z,.ð n6aB'ü°`I3€Nq`&~ F&(.ô·„f È®ìg-Cô`"R‡È®ìggBü|Rnø .ø°nøbL3ˆ€Bül~aN`Büd.�/,x ½üg0/ f(.)g .è8gîè,_"¯L3�Pø Ns,_"/8 #NuaBü$< 4.&.(.8áL<AîàaBûô`®)3)Lîÿt®-@&Nuî ,X�`B ûÎ4å=1EXIT ASREL'M68XXX EXIT SA"(…68010 EXIT MODULEÿ2BEXIT_TER 2pPREEMPT pPREEMPT_ pPERTURB_ BEXIT_POS .BEXIT_ERR ”BEXIT_TRA ‚BEXIT_ASR .BEXIT_SUB BEXIT_EXC pRUNNER BERROR_01 BBERROR_02 FBERROR_03 JBERROR_04 NBERROR_05 RBERROR_06 VBERROR_07 Z×2BERROR_08 ^BERROR_09 bBERROR_10 fBERROR_11 jBERROR_12 nBERROR_13 rBERROR_14 vBERROR_15 zBERROR_16 ~pDISPATCH BEXIT_D0A 2BEXIT_D0S pEXCSTACK pBKG_DISP pL1_D0_SA "´L3R .`p|Jx f Lî?þ,_NsjAâaAÞJ8 gè`AÔB®L× NiHî8`H3€AÀp`Np`Jp`Fp`Bp`>p`:p`6p`2p `.p `*p `&p `"p `p`p`p:3@`=@=|ç�G` H@0<.H@ x QˆYˆ.H|`ÿV4éééééîK1PVSEM ASREL'M68XXX PVSEM SA"(…68010 TRAP 0--SEMAPHORE ROUTINEŒ2BPSEM pSBREADY BVSEM ªBSBP BSVXSTAK VBSBV ªpKILLER BPSWAIT 2pDISPATCH pEXCSTACK "æJ3€@ç|JÐkü0ãHâ@S@0€kFßNua:U.r0 a�FßAÖaAÔ`AÐî ,B® (F3f!NNu*@ - fø+N NuHç .&|ð&î-HîÿtNl-L< 8 Kï ��I3 €Pn@rIî™ÀäHd8Ý`(ÝQÈÿüLß0NuaBÿX@ç|JÐkü0ãHâ@R@o0€,3FßNu/ "h!i €0€B© © ,"_FßNu4éééééé÷V1SINT ASREL'M68XXX SINT SA"@(…68010 DIRECTIVE--SIMULATE INTERRUPT TO ISRW2pVCTUBGN pEXIT_SUB ESINT pTRACER pERROR_09 pERROR_14 pTRACFLAG %bJ3€@B‚,"x J1 oAðBƒ,g Co`AÞá‹à ?<„Hz @ç?<„åŠ B/?03$$€8!gaA¶îNs8!gaA¦Ý`A 4éééééé0 W1SUPER ASREL'M68XXX SUPER SA"7(…M68010 DIRECTIVE--SWITCH TO SUPERVISOR MODEb2pLOADMMU pEXIT_SUB pRUNNER pPANEL FSUPER pERROR_01 pEXCSTACK pSBLOGPHY &VN3 D . €Kª{ûfAôJnpg x (fAà x Uˆ, z n6aAÎ`Nq`AÆ*FLî 3 ÿN•,x *n6aA°`A¬4éééééé L1TRAP0 ASREL'M68XXX TRAP0 SA"C(…68010 TRAP #0 handler and table.ÿ2pKILLERT0 pPSEM pEXQEVNTI pEXQEVNTN pEXQEVNTT pVSEM pCALL_GUA pRDTIMER BTRAP0 PHI_DIR_N %pWAKEUPX pLOGPHY BTABLE0 RpKILLER pGETTCB pGTXTCB pEXRQPA pTCBCR pPAUSE pREADY pPAGEFREE pBKG_SCHE =2pFNDGSEG pFNDTSEG pPAGEALOC pFNDUSEM pLOGPHYO "žH3fNsT�?o>Ÿ €%bAæÐ€0;2Nû./ �%bÒ�2;Aû±ü(f v3ÿÿÿ �@gT¯"NuA®A®A®A!®A&®A"®A®A%®A®A$®A®A®A'®A®A ®A®A®A®A®A®A®A®A®A®<3ÿìA®A®A(®A®A®A®A®A®A®A®A®ÿÔA#®A®4ééé1 éé'M68020 M68020 SA''bbEXCEPT RO00bb ‰LLEN�120* *ˆType�of�68000-family�processor*$CHIPTYPE‚EQU�68020‚Type�of�processorééééééé1 Q1EXCEPT ASREL'M68XXX EXCEPT SA"$(…68020 USER TRAP AND EXCEPTION HANDLERþ2pMMUFAULT pEXIT_TER pPREEMPT_ pTIAT BPROGINT2 pBPROGINT3 rBPROGINT4 tBPROGINT5 vBPROGINT6 xBPROGINT7 zBPROGINT8 |BPROGINT9 †BPROGINTA ~BPROGINTB €pEXIT_TRA pEXIT_EXC BBERR1 ppSVXSTAK pTTB_01 ö2pSBQEVNTN pTTE_01 pTRACER pKILLER pRUNNER pISRERR pERROR_03 BTRPVCT2 BTRPVCT3 pDISPATCH BTRPVCT4 pTRACFLAG BTRPVCT5 BTRPVCT6  BTRPVCT7 pEXCSTACK BTRPVCT8 BTRPVCT9 BCKEXMON —2pMACSTRC BTRPVCTA BTRPVCTB BTRPVCTC pSBEXABRT BTRPVCTD pMMUHERE BTRPVCTE BTRPVCTF pEQDQ pSBLOGPHY "NH3a aaaaaaaaaa a aaaaNq?/_'g/ gèaAÈ//NI3A ,y(Hî?ÿ8 !g @çaA¨ªT�Kú`Ô)La*8 "]…š�Nh,œ… n6I3@@aB'ýr`Nq`"(F CN`&8 "UC _8ß¿Ãfú/?,ÿú/<<`B† m n  _-_¸R3�…-_¼/.)g".èg a nBýJfBý nCø  1pfBüúaB&üöV3I`BüòJFfBüìAÖaB$üæ Hzüâ�Ÿ`BüÚ P�` €)R`BüÈ~$.èfffI3fNLî?ÿ,_` z,.ð n6aB'ü–`Nq`&~ F&(.ô·„f È®ìg-CôO3€ˆ€`"R‡È®ìggBübRnø .ø°nøbBüR~aN`BüJ.�/,x ½üg0/ I3�f(.)g .è8gîè,_"¯Pø Ns,_"/8 #NuaBûü$< 4.L3&.(.8áL<AîàaBûÚ`®)Lîÿt®-@&Nuî ,X�`B û´4('M68230 RDTIMER AF==bbRDTIMER SAFF6bbRDTIMER ROOObbTIMEINT AFXXbbTIMEINT SAaa=bbTIMEINT ROjjbb=/*=/*†M68230.RDTIMER.AF=/*,=/* Chain file to assemble M68230.RDTIMER.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68230.RDTIMER.LS=/*=/IFC \1ƒ=ARG�M68230.RDTIMER.LS=/ENDIF=/*2=ASM M68230.RDTIMER.SA,M68230.RDTIMER.RO,\1;RZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDé2 ééééé5ŠPAGE**ˆINCLUDE�FILES**‰INCLUDE�9995.&.STR.EQ*‰INCLUDE�9995.&.INTERRUP.MCŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGECRDTIMERƒIDNTƒ1,0‰READ�TIMER�routine�for�M68230�PIT�real�time�clock.*$*ˆCOPYRIGHTED�1980�BY�MOTOROLA,�INC.**ˆ*********************ˆ*�RDTIMER‚1.00„**ˆ*’**ˆ*�SCB„05/02/84‚**ˆ*********************,*…READ�TIMER�-�RETURN�TIEMR�VALUE�(MS)�IN�D1*™TIMER�VALUE�(US)�IN�D0*5* Currently code returns only the number of MS in D1.* D1 is returned as 0.*ŠSECTION�LEVEL00* ŠXDEFƒRDTIMER ŠXDEFƒSBRDTIM ** SYSPAR parameters* ŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�TIME_LEFTŠXREF.S�TINTFLAGŠPAGESBRDTIM:RDTIMER: ŠCLR.L‚D0$ŠMOVE.W�SR,-(A7)‹For�later�unmaskingŠDISABLE_INTERRUPTSˆMask ŠMOVE.L�NSE,D1ŠSUB.L‚TIME_LEFT,D10ŠSUB.L‚MIDNIGHT,D1ˆD1�=�current�ms�past�midnight#ŠBCLRƒ#31,D1�Insure�positive�number ŠMOVE.W�(A7)+,SR‹UnmaskŠRTSŠENDéééé>7^1RDTIMER ASYST'M68230 RDTIMER SA"%V…READ TIMER routine for M68230 PIT real time clock.P2pNSE BRDTIMER pTIME_LEF BSBRDTIM pMIDNIGHT pTINTFLAG ""3@B€@ç|"8 ’¸ ’¸ �FßNu42 éééééééG=/*=/*†M68230.TIMEINT.AF=/*,=/* Chain file to assemble M68230.TIMEINT.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68230.TIMEINT.LS=/*=/IFC \1ƒ=ARG�M68230.TIMEINT.LS=/ENDIF=/*D=ASM M68010.M68010.SA/M68230.TIMEINT.SA,M68230.TIMEINT.RO,\1;MRZ=060=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9999.M68230.M68230.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.INTERRUP.MC=/*ƒM68XXX.TIMEINT.AI=/*}=/*=ENDééééé3 PŠPAGE**ˆINCLUDE�FILES**ˆINCLUDE�9995.&.STR.EQ*ˆINCLUDE�9995.&.BAB.EQ*ˆINCLUDE�9995.&.PAT.EQ*ˆINCLUDE�9999.M68230.M68230.EQ*ˆINCLUDE�9995.&.TR1RTCD.EQ*ˆINCLUDE�9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9999.M68230.M68230.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE>TIMEINTƒIDNTƒ1,0ŽTIMER�INTERRUPT�HANDLER�FOR�M68230�CLOCK�CHIP*$*‰COPYRIGHTED�1983�BY�MOTOROLA,�INC.***†TIMER�INTERRUPT�-�OCCURS�ONCE�EACH�10�MS*!*•05/02/84�--�Cloned�routine�from*­M146818.TIMEINT.SA*ŠSECTION�LEVEL00* ŠXDEFƒTIMEINT ŠXREF.S�DATEŠXREF.S�PATBEGŠXREF.S�PREEMPT_FLAGŠXREF.S�PTMADDRŠXREF.S�TIME_LEFTŠXREF.S�TIMEOUTŠXREF.S�TIMESLICŠXREF.S�TIMINTVŠXREF.S�TIMINTV4ŠXREF.S�TINTFLAGŠXREF.S�TRACERŠXREF.S�TRACFLAG ŠXREFƒBKG_SCHEDULE ŠXREFƒCKDELAY ŠXREFƒCKEXPAŠXREFƒPAT_RM_1ST_NODEŠPAGE**0TIMEINTƒMOVEM.L�D0-D1/A0-A1,-(A7)�SAVE�REGISTERSŠMOVE.L�PTMADDR,A0*ŠMOVE.B�#$01,TSR(A0)‡Clear�timer�interrupt0ŠCLR.L‚D1‘D1.L�<--�time�interval�corresonding�to'ŠMOVE.W�TIMINTV,D1‰a�tick�of�the�timer..ŠSUB.L‚D1,TIME_LEFT‡Do�we�have�a�node�to�fire?1*‰INCLUDE�M68XXX.TIMEINT.AI‚Yes�so�go�schedule�itŠINCLUDE�M68XXX.TIMEINT.AIŠENDééY>Y1TIMEINT ASYST'M68230 TIMEINT SA"&…TIMER INTERRUPT HANDLER FOR M68230 CLOCK CHIPÛ2pPTMADDR pPREEMPT_ pPERTURB_ pCOMINT_P pDATE pTIMESLIC BTIMEINT pTIMEOUT pTIME_LEF pTIMINTV pTIMINTV4 pPAT_RM_1 pCKEXPA pTRACER pPATBEG pTRACFLAG pBKG_SCHE pTINTFLAG pCKDELAY "¬J3RHçÀÀ x |4B�28 “¸ n"x AéCú*‰which�causes�a�bus�error�which�results�in�the�loading�of�the,*‰same�descriptor�as�the�original�bus�error.*6*‰TASKS�WITH�ADDRESS�SPACE�0�GET�UNMAPPED�ENTIRE�SPACE*?*‰TASKS�WITH�OTHER�ADDRESS�SPACES�GET�ONLY�THEIR�ASSIGNED�SPACE*0*‰PAGE�FAULT�IS�USED�TO�SWAP�SEGMENT�DESCRIPTORS*ŠSECTION�LEVEL00 ‰XDEF†LOADMMU‰XDEF†LOADMMUI ‰XREF†FLUSH_ON_CONTEXT_SWITCH ‰XREF.S„CURR_ASN‰XREF.S„MMUHERE‰XREF.S„MMULOAD‰XREF.S„TRACER‰XREF.S„TRACFLAGA‰XREF.S„LAST_MMU_INT_LEVEL�Parameter�which�contains�the�interrupt$*§level�at�which�we�got�the�last�Bus$*§Error�which�might�have�been�due�to *§an6 �unloaded�segment�desciptor. **LOADMMU:.ŠMOVE.B‚TSTASN(A5),D0…Get�address�space�number*ŠCMP.BƒCURR_ASN,D0‡If�same�as�current�ASN,ŠBEQ.SƒLOADEXITŠthen�EXIT. ŠPUSH„SR�Save�interrupt�level!ŠOR.W„#$700,SRŠInhibit�interrupts/ŠMOVE.L‚A5,MMULOADˆSave�address�of�current�loadŠMOVE.L‚MMUHERE,A5ˆPoint�to�MMUŠMOVE.B‚D0,AST1(A5)‡User�data ŠMOVE.B‚D0,AST2(A5)‡User�program* *„SAVE�THE�ADDRESS�SPACE�NUMBER.*ŠMOVE.B‚D0,CURR_ASN **„FLUSH�THE�USER�CACHE.*²R»^Ã9ËÓEÛ@ãTëŠBSR…FLUSH_ON_CONTEXT_SWITCH **„TEMPORARILY�DISABLE�TRACING.*0*‰BTST„#TRCFMMU,TRACFLAG�Should�entry�be�traced?*‰IF…�THEN.S*‰BSR…TRACERŒBuild�trace�entry*‰DC.W„$DD08�Trace�code*‰ENDI (ŠPOP…SR�Restore�previous�interrupt�level LOADEXIT: ŠRTS—ReturnŠPAGE LOADMMUI:.ŠMOVE.B‚TSTASN(A5),D0…Get�address�space�number*ŠCMP.BƒCURR_ASN,D0‡If�same�as�current�ASN,ŠBEQ.SƒLOADIEX‹then�EXIT. !ŠOR.W„#$700,SRŠInhibit�interrupts/ŠMOVE.L‚A5,MMULOADˆSave�address�of�current�loadŠMOVE.L‚MMUHERE,A5ˆPoint�to�MMUŠMOVE.B‚D0,AST1(A5)‡User�data ŠMOVE.B‚D0,AST2(A5)‡User�program * *„SAVE�THE�ADDRESS�SPACE�NUMBER.*ŠMOVE.B‚D0,CURR_ASN  **„FLUSH�THE�USER�CACHE.*ŠBSR…FLUSH_ON_CONTEXT_SWITCH **…TEMPORARILY�DISABLE�TRACING.*0*‰BTST„#TRCFMMU,TRACFLAG�Should�entry�be�traced?*‰IF…�THEN.S*‰BSR…TRACERŒBuild�trace�entry*‰DC.W„$DD08�Trace�code*‰ENDI LOADIEX:ŠRTEŠPAGE**ˆMake�entry�in�!ASN**:*‰Create�a�new�Address�Space�Number�and�insert�it�into�TCB**,*‰ENTRY:„A5‚Points�to�TCB�to�receive�new�ASN**‰EXIT:…Return�PC�if�successful(*“Return�PC+2�if�no�new�ASN�is�available* *›01234567*‰USES�REGISTERS‚D�**™A�*„P** ŠXDEF†CRASN*ŠXREF.S„ASNTBLŠXREF.S„KILLER*CRASN=‰BTSTW‚#TSKARTIM,TCBATTR(A5)‚If�the�task�is�a�real-time�task,.‰BNE.S‚CRASN13�then�use�the�default�(ASN�=�0),*¦as�initialized�in�TSKBORN. "‰MOVE.L�ASNTBL,D0ŽIs�there�a�!ASN?‰BEQ.S‚CRASN13�Branch�if�none‰MOVE.L�D0,A0’A0�--->�!ASN‰CMP.L‚#'!ASN',(A0)‹Is�it�!ASN?‰BEQ.S‚CRASN11�Branch�if�yes2‰BSR„KILLER‘Mu!!�It�is�there,�but�it�is�not�there.CRASN11"‰LEA„4(A0),A0�Point�to�first�entry$‰MOVE.W�#127-1,D0Ž127�entries�in�allCRASN12‚TST.L‚(A0)+’Free�entry?(‰DBEQƒD0,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ŠXREF.SƒKILLER*DEASN#ˆMOVE.L‚ASNTBL,D0„Is�there�an�!ASN?ˆBEQ.SƒDEASN7‡Branch�if�noneˆMOVE.L‚D0,A0ˆA0�--->�!ASNˆCMP.Lƒ#'!ASN',(A0)�Is�it�!ASN?ˆBEQ.SƒDEASN5‡Branch�if�yes1ˆBSR…KILLER‡Mu!!�It�is�there,�but�it�is�not�thereDEASN5#ˆMOVE.L‚TCBTST(A4),A1�Point�to�!TST ˆCLR.WƒD0‹Prepare�for�short�load4ˆMOVE.B‚TSTASN(A1),D0�Get�Address�Space�Number�(ASN)!ˆBEQ.SƒDEASN7‡ASN�#0�not�relevant&ˆCMP.Wƒ#128,D0†Should�be�less�than�128ˆBLT.SƒDEASN6‡Branch�if�okˆBSR…KILLER‡Else�crashDEASN6ˆLSL.Wƒ#2,D0ˆIndex�into�!ASNˆCLR.Lƒ(A0,D0.W)„Remove�entryDEASN7ŠRTS�Return�to�callerŠPAGE*"*‰Unload�a�segment�from�68451�MMUs*(*‰ENTRY:‚(A5,D5)�-->�Segment�information* ŠXDEF„UNLDMMU ŠXREF.S‚CURRSDŠXREF.S‚CURR451ŠXREF.S‚FRST451ŠXREF.S‚LAST451*UNLDMMU *=*‚Flush�any�cached�information�this�user�might�have�built�up.*6 ééé ŠPUSH.L�A5ŠBSR„FLUSH_ON_CONTEXT_SWITCH ŠPOP.L‚A5 *ŠTST.B‚TSTASN(A5)ŠIs�this�address�space�0?ŠBEQ.S‚UNLDEXITŒBranch�if�yes'ŠMOVE.L�FRST451,A1ŠPoint�to�first�68451$ŠMOVE.B�#1,D0�Segment�descriptor�#�1UNLD10%ŠMOVE.B�D0,DP(A1)‹Point�to�descriptor"ŠMOVE.B�SSR(A1),D1ŠRead�descriptor+ŠBTSTƒ#SSREN,D1‹Is�this�descriptor�enabled?ŠBEQ.S‚UNLDNEXTŒBranch�if�no'ŠMOVE.B�AC6(A1),D1ŠGet�descriptor's�ASN8ŠCMP.B‚TSTASN(A5),D1‡Is�this�the�address�space�we're�in?ŠBNE.S‚UNLDNEXTŒBranch�if�no'ŠMOVE.W�AC0(A1),D1ŠGet�descriptor's�LBA!ŠCMP.W‚TSTLB(A5,D5),D1†LBA�<�LB�?ŠBLT.S‚UNLDNEXTŒBranch�if�yes!ŠCMP.W‚TSTLE(A5,D5),D1†LBA�>�LE�?ŠBGT.S‚UNLDNEXTŒBranch�if�yes-ŠMOVE.B�#0,SSR(A1)ŠElse�clear�this�descriptor5ŠMOVE.L�A1,CURR451ŠGive�this�descriptor�to�next�fault5ŠMOVE.B�D0,CURRSD+3‰Rest�of�descriptor�info�for�faultUNLDNEXTŠADDQ.B�#1,D0�Next�descriptorŠCMP.B‚#$20,D0�End�of�this�MMU?ŠBNE.S‚UNLD10ŽBranch�if�noéééé#ŠLEA„$40(A1),A1ŠMove�on�to�next�MMUŠCLR.B‚D0’Descriptor�#�0)ŠCMP.L‚LAST451,A1ŠAre�we�beyond�all�MMUs?ŠBLE.S‚UNLD10ŽBranch�if�noUNLDEXITŠRTS˜Else�returnŠPAGE*>*‰Diagnose�bus�error�and�attempt�68451�segment�descriptor�swap*"*‰Saves�and�restores�all�registers*ŠXDEF„MMUFAULT ŠXREF.S‚CURRSDŠXREF.S‚CURR451ŠXREF.S‚FRST451ŠXREF.S‚LAST451ŠXREF.S‚MMUHEREŠXREF.S‚RUNNER MMUFAULT ŠSAVE„D0-D7/A0-A6ˆSave�registersŠTST.LƒMMUHEREŒIs�there�an�mmu?ŠBEQ…MMUFRTSŒBranch�if�no<ŠMOVE.L‚MMULOAD,A0‰A0�<--�ptr�to�TST�of�task�that's�running;'*§note�that�this�is�not�necessarily�the*§RUNNER�(we�may�be�in�an�ISR)./ŠTST.BƒTSTASN(A0)‰Is�this�task�address�space�0?ŠBEQ…MMUFRTSŒBranch�if�yes8ŠTR0.LOGPHY�,<15*4+8+AOB(A7)>,#2�Check�for�valid�address/ŠBRA.SƒMMUF10�Branch�if�AOB�is�in�logical�space ŠNOP˜Else,+ŠBRA…MMUFRTSŒBranch�if�not�in�logical�spaceMMUF10(ŠBSR…CRSD�Create�lba,lam,pba�in�D0,D1,D2ŠMOVE.W‚TSTASN(A0),D3†ASN�to�D3$ŠMOVE.B‚TSTCTL+1(A0,D5),D3�DST�to�D3:ŠBSET„#SSRUSED,D3ˆSet�to�used�so�it�won't�get�swapped�soonŠPAGE**‰Select�a�descriptor�to�swap**‰1.‚Disabled�descriptor.*‰2.‚First�descriptor�checked�and�found�unused*‰3.‚First�descriptor�checked*%ŠPUSH„SR�Save�current�interrupt�level7 !ŠOR.W„#$700,SRŠInhibit�interrupts2ŠMOVEM.L�FRST451,A0-A3…Get�68451�SYSPAR�parameters'ŠMOVE.L‚A2,A4�A4�-->�MMU�being�examined&ŠMOVE.L‚A3,D7�D7�has�descriptor�numberFSD20%ŠMOVE.B‚D7,DP(A4)‰Point�to�descriptor"ŠMOVE.B‚SSR(A4),D6ˆRead�descriptor+ŠBTST„#SSREN,D6‰Is�this�descriptor�enabled?ŠBEQ.SƒFSDEMPTYŠBranch�if�no0ŠBCLRƒ#SSRUSED,D6‡Has�this�descriptor�been�used?ŠBEQ.S‚FSDNOUSEŠBranch�if�no/ŠMOVE.B�D6,SSR(A4)ˆErase�used�bit�in�descriptorŠADDQ.B�#1,D7�Next�descriptorŠCMP.B‚#$20,D7‹End�of�this�MMU?ŠBNE.S‚FSD40�Branch�if�no#ŠLEA„$40(A4),A4ˆMove�on�to�next�MMU#ŠCLR.B‚D7�Begin�with�descriptor�#�0$ŠCMP.L‚A1,A4�Are�we�beyond�all�MMUs?ŠBLE.S‚FSD40�Branch�if�no"ŠMOVE.L�A0,A4�Go�back�to�first�MMUŠADDQ.B�#1,D7�Descriptor�#�1FSD40+ŠCMP.W‚A3,D7�Same�descriptor�we�started�on?ŠBNE.S‚FSD20�Branch�back�if�no$ŠCMP.L‚A2,A4�Same�MMU�we�started�on?ŠBNE.S‚FSD20�Branch�back�if�noŠPAGE**‰Use�first�descriptor�checked*FSDFIRST*(*‰Use�first�descriptor�found�to�be�empty*FSDEMPTY*(*‰Use�first�descriptor�not�recently�used*FSDNOUSE?SR_ON_STACK�SET‚4+4+15*4+2‰This�is�the�depth�of�the�original�SR%*§pushed�by�the�bus�error.‚In�the�way'*§are�the�PC�from�the�BSR�PROGINT2�(4),&*§the�PC�from�the�BSR�MMUFAULT�(4),�15%*§registers�saved�by�MMUFAULT�(15*4),#*§and�the�SR�saved�by�MMUFAULT�(2). BŠMOVEƒSR_ON_STACK(SP),D6�Isolate�in�D6�the�interrupt�level�we�were6ŠAND„#$0700,D6Šrunning�at�when�the�bus�error�occurred. /ŠMOVEM.W�D0-D3,AC0(A4)„Load�most�of�accumulatorŠMOVE.B‚#$FF,AC8(A4)…ASM#ŠMOVE.B‚D7,DP(A4)ˆDescriptor�number 5ŠTST.BƒLDO(A4)‹If�there�was�no�collision�on�the�load,ŠIF‚‚THEN.SŠ* TRY_AGAIN*J*‚At�this�point�we�have�either�successfully�loaded�a�segment�descriptor�orI*‚we�got�a�collision�that�may�be�due�to�a�previous�interrupt�which�causedK*‚us�to�load�a�descriptor.‚In�either�case�we�want�to�remember�the�interruptH*‚level�of�this�load�and�proceed�under�the�assumption�that�the�bus�errorJ*‚was�caused�by�the�absence�of�the�right�segment�descriptor.‚If�we�get�theJ*‚bus�error�again,�the�LAST_MMU_INT_LEVEL�will�be�lower�so�we'll�know�it's*‚the�user's�fault.*>ŠMOVE.B‚AC6(A4),AST1(A0)‚Load�the�ASN�for�this�descriptor�into?ŠMOVE.B‚AC6(A4),AST2(A0)‚the�user�data�and�user�program�entries*§in�the�address�space�table. **‰Fix�up�SYSPAR�parameters*:ŠMOVEƒD6,LAST_MMU_INT_LEVELƒRemember�this�interrupt�level. 2ŠADDQ.B‚#1,D7ŒStart�next�time�with�next�descriptorŠCMP.Bƒ#$20,D7ŠEnd�of�this�MMU?ŠBNE.SƒFSD100‹Branch�if�no#ŠLEA…$40(A4),A4‡Move�on�to�next�MMU#ŠCLR.BƒD7�Start�with�descriptor�#�0$ŠCMP.LƒA1,A4ŒAre�we�beyond�all�MMUs?ŠBLE.SƒFSD100‹Branch�if�no"ŠMOVE.L‚A0,A4ŒGo�back�to�first�MMUŠADDQ.B‚#1,D7ŒDescriptor�#�1FSD100#ŠMOVE.L‚A4,CURR451‡Save�current�MMU+ŠMOVE.B‚D7,CURRSD+3†Save�current�descriptor**‰Return�to�faulted�task*!ŠADD.Lƒ#2,A7ŒRemove�SR�from�stack/ŠRESTORE�D0-D7/A0-A6†Restore�original�registers+ŠADD.Lƒ#8,A7ŒRemove�unused�return�addressesŠRTE–Continue�task ŠENDI  *C*‚There�was�a�collision;�can�we�tell�whether�the�user�was�at�fault?*BŠCMP„LAST_MMU_INT_LEVEL,D6‚If�the�interrupt�level�of�the�last�load:ŠBMI„TRY_AGAINŠwas�higher�than�the�interrupt�level�of�this'*§load,�then�it's�possible�that�we�took(*§the�interrupt�during�the�processing�of%*§this�bus�error.‚If�that�happened�we(*§might�have�already�loaded�this�segment'*§descriptor�for�the�code�at�the�higher$*§interrupt�level.‚Therefore�we�must*§try�the�access�again.  *F*‚We�know�the�collision�was�the�user's�fault,�since�we�know�we�did�not7*‚come�through�this�path�from�a�higher�interrupt�level.*(ŠPOP…SR�Restore�previous�interrupt�levelMMUFRTS&ŠRESTORE�D0-D7/A0-A6†Restore�registersŠRTS–Continue�normal�handlingŠPAGE* *‰Compute�one�segment�descriptor**‰ENTRY:‚D6�=�Physical�address*‘D3�=�Logical�address*‘(A0,D5)�-->�TST�MMU�entry**‰EXIT:ƒD0�=�lba *‘D1�=�lam *‘D2�=�pba*‘(A0,D5)�UNDISTURBED*CRSDŠMOVE.L‚D3,D0�D0�=�la 7 Š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"(C…68451 MMU HANDLER FOR 68010-BASED SYSTEMSõ2BLOADMMU BLOADMMUI ,BMMUFAULT *pFLUSH_ON pMMULOAD BUNLDMMU ÈpCURR_ASN pLAST_MMU pASNTBL BCRASN TBDEASN –pCURR451 pTRACER pKILLER pFRST451 pLAST451 pRUNNER pCURRSD pTRACFLAG pMMUHERE 2pSBLOGPHY "\H3PPB- °8 g @ç|!Í *x @@À aAÚFßNu- °8 g|!Í *xJ3‚� @@À aA°Ns-)f8 8 g2 @ �!ASNgaA’Aè0<~J˜WÈÿügL3T—Nu! D m6@ Nu 8 g* @ �!ASNgaBÿX"l6B@) g @€maBÿBI3åHB°Nu/ aBÿ4*_J- gR"x <@))1g()&²- f2) ²uPmG3@ ˆ²uPn|1!É À!R fÂCé@B³ø o¶NuHçÿþJ¸ gÔ x J( gI3Èz,/NaBþ¶`Nq`¶a¸6( 0PÃ@ç|Lø (J. G),1F3g(†g"F1R  fIì@B¹Éo(HR¾KfιÊfÊbbINIT ROáá bbKILLER AFòòbbKILLER SAûû.bbKILLER RO  bbPOWRFAILAF bbPOWRFAILSA  2bbPOWRFAILRO  bbREADY AF ( (bbREADY SA 1 1ÃbbREADY RO J JbbRMS AF S SbbRMS SA \ \|bbRMS RO m mbb=/*=/*†M68XXX.RDTIMER.AF=/*,=/* Chain file to assemble M68XXX.RDTIMER.SA=/*:=/* If no output argument is specified for the listing the0=/* chain file will default to M68XXX.RDTIMER.LS=/*=/IFC \1ƒ=ARG�M68XXX.RDTIMER.LS=/ENDIF=/*1=ASM M68XXX.RDTIMER.SA,M68XXX.RDTIMER.RO,\1;RZ=46=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.UTILITY.MC=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééé8 é-RDTIMERƒIDNTƒ5,1�M68xxx�--�Reads�system�time.O*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***<***…FILE:‚RDTIMER�--�GETS�THE�CURRENT�TIME�OUT�OF�SYSPAR�******É***D***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000.‡***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***G***…FUNCTION:‚This�routine�returns�the�time�maintained�by�the�timer„******‡logic.‚On�return,°***C***‰D1�=�the�#�of�milliseconds�since�midnight�at�which�the�last…******Žtimer�tick�occurred.§***C***‰D0�=�0.‚This�used�to�be�the�#�of�microseconds,�but�it�isn't„***?***Žrealistic�to�think�that�the�figure�was�ever�meaningful.„******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------?*…11/27/84‚Steve�FranckƒCreated�from�a�device-specific�version.* * *‚XDEF's.*$ŠXDEFƒRDTIMERŒEntry�pt.�for�TRAP�#0.(ŠXDEFƒSBRDTIMŒEntry�pt.�for�subroutines.  **‚XREF's�from�SYSPAR.*ŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�TIME_LEFT  **‚Included�files:*„9995.&.STR.EQ*„9995.&.UTILITY.MC*„9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.INTERRUP.MCŠLISTŠPAGE ŠSECTION�LEVEL00  SBRDTIM:RDTIMER: 0ŠPUSHƒSR‘We�must�do�this�with�interrupts�masked,6ŠDISABLE_INTERRUPTSˆin�case�we�take�a�timer�interrupt. *5*‚Calculate‚(#�of�milliseconds�since�last�midnight)�==*�[�(time�of�NSE�in�msecs)�-�(time�left�until�NSE�in�msecs)�]#*ª-�(time�of�last�midnight�in�msec) EG*‚NSE�stands�for�Next�Significant�Event,�and�is�the�absolute�time�valueJ*‚in�msecs�when�we�next�need�to�take�something�off�the�Periodic�ActivationK*‚Table�(PAT).‚Recall�that�the�clock�is�a�31-bit�(not�32-bit!)�number�whichB*‚wraps�around�at�2**31�=�0,�so�we�have�to�do�"31-bit�arithmetic."*%ŠMOVE.L�NSE,D1�D1�<--�msec�time�now�=:ŠSUB.L‚TIME_LEFT,D1‡(time�of�NSE)�-�(time�left�until�NSE)./ŠSUB.L‚MIDNIGHT,D1ˆD1�<--�msec�since�midnight�=1*Ÿ(msec�time�now)�-�(msec�time�at�last�midnight).3ŠBCLRƒ#31,D1�The�result�is�a�31-bit�number,�so�zero%*§out�the�high�bit,�which�is�garbage. *J*‚Always�set�#�of�microseconds�to�zero,�since�we�are�really�only�returning6* the millisecond time of the last tick that occurred.*#ŠMOVEQ‚#0,D0ŽD0�<--�0�microseconds.  +ŠPOP„SR‘Restore�interrupt�level�and�return.ŠRTS—*  ŠENDé9 éééH1RDTIMER ASYST'M68XXX RDTIMER SA"3E…M68xxx -- Reads system time.E2pNSE BRDTIMER pTIME_LEF BSBRDTIM pMIDNIGHT ""3 €@ç|"8 ’¸ ’¸ �pFßNu4ééééééé‰PAGE********************** M68XXX.TIMEINT.SA **********************E* This file is appended to the device dependent source for all of theA*ƒTIMEINT�modules�during�the�assembly�process.‚It�contains�common4*ƒcode�for�timer�interrupt�functions�on�all�systems.*B*ƒThis�code�will�schedule�a�background�routine�to�fire�off�any�PAT*…nodes�whose�time�has�come. ŠIF��THEN.S3�MOVE.L�PATBEG,A1‡A1�contains�address�of�PAT�header:�LEA„PATBABT(A1),A0‚Address�of�background�activation�block�LEA„PATFIRE(PC),A13�MOVE.L�A1,BABPTR(A0)ƒAddress�of�background�routine�BSR„BKG_SCHEDULE„Schedule�itŠENDI ***†RESTORE�REGISTERS�AND�TRACE�IF�REQUESTED* ,Š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�timesl9 icing9Š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,9�ST…PREEMPT_FLAG„set�the�flag�that�will�cause�a�dispatch.�ENDIƒ* ŠENDIƒ* 3ŠEXITƒINTERRUPTŠEither�way,�exit�through�the�common*§interrupt�handler.‰PAGE*I* This is a background routine (scheduled when TIME_LEFT <= 0) that fires *ƒall�PAT�nodes�elibible�to�run.* PATFIRE:$ŠMOVE.L�PATBEG,A1ŠPAT�header�address*SRSTACKƒSET„0’Offset�to�SR�before�on�stack#ŠDISABLE_INTERRUPTSˆMask�interruptsŠMOVE.L�TIME_LEFT,D2ŠWHILE��DO.S,�MOVE.L�PATHDR(A1),A2ƒPoint�A2�to�first�node*�BSRƒPAT_RM_1ST_NODE‚Remove�the�first�node%�ENABLE_INTERRUPTS†Unmask�interrupts..�TST.L‚PATTCB(A2)ƒIs�it�Exec�node?�0�means�yes �IF��THEN.S�MOVE.W�SR,D0ˆSR�before�masking�IFEQƒCHIPTYPE-68010%“MOVE.W�#$0084,-(A7)…Push�TRAP�#1�VOR�ENDC$F-�IFEQƒCHIPTYPE-68020%“MOVE.W�#$0084,-(A7)…Push�TRAP�#1�VOR�ENDC�BSR„CKEXPAŽGo�fire�exec�node �ELSE.S�BSR„CKDELAY�Go�fire�task�node�ENDI �ENABLE_INTERRUPTS$�MOVE.L„PATBEG,A1‹PAT�header�address�DISABLE_INTERRUPTS*�MOVE.L„PATHDR(A1),A2‡Look�at�new�1st�node�MOVE.L„TIME_LEFT,D2ŠENDW ŠENABLE_INTERRUPTS‰UnmaskŠRTS—Back�to�the�EXECéééééé‰IFEQ„CHIPTYPE-68000/TRAP1„IDNTƒ5,1‡68000�TRAP�#0�handler�and�table.‰ENDC‰IFEQ„CHIPTYPE-68010/TRAP1„IDNTƒ5,1‡68010�TRAP�#0�handler�and�table.‰ENDCO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***D***…FILE:‚TRAP1�--�EVERYTHING�DEALING�WITH�THE�TRAP�#1�MECHANISM‡******•FOR�REAL-TIME�TASKS. ******É***J***…ENVIRONMENT:‚Part�of�the�RMS68K�exec�for�the�Motorola�68000�family.***(***‡Copyright�1983�by�Motorola,�Inc.¢******É***#***…FUNCTION:‚In�this�file�are:¨***4***�1.)‚the�TRAP�#1�handler�for�real-time�tasks,Œ***=***�2.)‚the�TRAP�#1�: table�for�real-time�tasks�containing:ƒ***"***•A.)‚offsets�to�directives,™***%***•B.)‚offsets�to�exit�routines.–******É***O*******************************************************************************O*******************************************************************************O*^***************************************************************************** *,*‚Revision�history�(add�new�changes�to�top).*…Date†Author‰ChangesG*…--------‚-------------‚----------------------------------------------&*†7/27/84‚Mark�Lanus…Original�writing.*  **‚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.(*‰TCB.EQ”Equates�for�task�control�block.**‰UDR.EQ”Equates�for�user�directive�table.1*‰TR1RTCD.EQ�Return�codes�for�TRAP�#1�directives.**ŠNOLISTŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.ENV.EQŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.UDR.EQŠINCLUDE�9995.&.TR1RTCD.EQŠLIST  * *ˆxdef's.* 0‰XDEF†TRAP1�Entry�point�for�the�TRAP�#1�handler. /‰XDEF†TTB_01ŽBeginning�and�ending�addresses�for‰XDEF†TTE_01Žtrust�table�entry.  * *ˆxref's.5C>QFXNRVJ^Mfkn.* ‰XREF†CKEXMON ‰XREF†ISRRTE ‰XREF†TRACER ‰XREF.S„RUNNER‰XREF.S„TRACFLAG‰XREF.S„UDRBEG ‰SECTIONƒLEVEL00 ‰OPT‡MEX,NOCL‰PAGEO*v*****************************************************************************O**********************************************************************************É***1***…ROUTINE:‚TRAP1�--�CALL�A�TRAP�#1�ROUTINE.š******É******…FUNCTION:»***D***‡When�a�task�wants�to�invoke�some�exec�function,�he�moves�the†***D***‡directive�number�of�the�function�into�D0�and�does�a�TRAP�#1.†***B***‡The�mpu�vectors�here�and�we�use�the�TRAP�#1�table,�TABLE1,ˆ***&***‡to�JMP�to�the�desired�routine.¤******É******É***E***…REGISTER�USAGE:‚(A)rgument‚(D)estroyed‚(P)reserved‚(R)eturnedƒ***)***Œ0ƒ1ƒ2ƒ3ƒ4ƒ5ƒ6ƒ7‡SR�hi„SR�lo�(CCR)…******‡D:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.‡.ˆ.�******‡A:ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ.ƒ. ******É******…ENTRY�CONDITIONS:³***7***‡D0ƒ=�directive�#�of�the�routine�to�be�executed.‘***8***‡A0ƒ=�parameter�block�(if�required�by�directive).�***F***‡PC�&�SR�(&�maybe�VOR)�of�caller�are�stacked,�as�with�any�TRAP.„******É***O*******************************************************************************O*^*****************************************************************************‰PAGE**ˆif&*ˆ(interrupt_mask�(super_stack)�>�0)�|,*ˆ(supervisor_state_bit�(super_stack)�=�set)*ˆthen�go�to�isrrte;* TRAP1:‰TESTIM3‰BNE.S…ISR_RTE�Branch�if�not�from�normal�user�mode.  *1*ˆforce�the�condition�codes�on�the�stack�to�,+*ˆand�perform�a�level_1�partial�state�save;* =‰MOVE.B„#EQ_CC,COND_CODE(A7)…save�cond�code�of��on�stack. ‰SAVE_STATEŠL1_PART  *"*ˆif�(requestor�<>�real-time�task)*ˆthen�go�to�not_rt_task;* ‰BTSTW…#TSKARTIM,TCBATTR(A6)‰BEQ.S…NOT_RT_TASK  */*ˆmultiply�D0�by�4;�/*‚Get�index�into�table1‡*/ *ˆif�(D0�<�0)7*ˆthen�go�to�user_dir;Š/*‚User�configured�directive.‚*/* ‰ASL.W…#2,D0‰BMI.S…USER_DIR  *$*ˆif�(D0�>�biggest�directive�number)*ˆthen�exit�(bad�directive);* ‰CMP.W…#HI_T1_NUM*4,D0‰BHI.S…BAD_DIR  * *ˆA4�<==�addr�(parameter�block);.*ˆD2�<==�(option_bits)�&�(offset�(directive)); *ˆif�(target_tcb_required�=�set)*ˆthen�get�(target_tcb);#*ˆgo�to�directive�pointed�to�by�D0;* ‰MOVE.L„A0,A4‰MOVE.L„TABLE1(PC,D0.W),D2 ‰IF‚‚THEN.S‰GET_TARGET_TCB‰ENDI ‰JMP‡TABLE1(PC,D2.W)‰PAGE*:*ˆHere�are�some�branch�instructions.‚The�purpose�in�having=*ˆthis�branch�to�branch�architecture,�was�: to�make�the�trap�#1>*ˆhandler�for�real-time�tasks�as�fast�as�possible,�even�though<*ˆthis�architecture�would�slow�down�the�trap�#1�handling�for*ˆnon�real-time�tasks.*=*ˆThe�priorities�on�handling�trap�#1�requests�are�as�follows:**�1.)‚real-time�tasks,*�2.)‚non�real-time�tasks,!*�3.)‚user�configured�directives.  *1*ˆUser�executed�a�trap�#1�while�executing�an�ISR.* ISR_RTE: ‰BRA.L…ISRRTE  *&*ˆClient�task�is�not�a�real-time�task.* NOT_RT_TASK:‰BRA.L…TRAP1_10  ***ˆTrap�is�for�a�user�configured�directive.* USER_DIR:‰BRA.L…TRAPUSR  *(*ˆTrap�contained�a�bad�directive�number:* BAD_DIR:$‰EXIT†RTCDDIRNŒexit�(bad�directive);‰PAGE@*****************************************************************"*ˆENTRY�CONDITIONS�FOR�DIRECTIVES:*+*�A4�<==�parameter�address�(if�applicable);!*�A6�<==�client�task�tcb�address;*?***************************************************************‰PAGEO*v*****************************************************************************O*******************************************************************************O**********************************************************************************É***I***…FUNCTION:‚In�this�file�is�the�#TRAP�#1�table�containing�one�entry‚***<***�for�every�TRAP�#1�directive.‚Each�entry�contains�the„******�following�fields:¨******É***.***•1.)‚byte�describing�directive�options:�***%***šA.)‚parameter�block�required:‘*** ***šB.)‚target�tcb�required:–******É***5***•2.)‚byte�describing�length�of�parameter�block†******š(if�required):¡******É***5***•3.)‚word�containing�offset�to�directive�code:†******É***O*******************************************************************************O*******************************************************************************O*^*****************************************************************************‰PAGE*:*ˆThe�SETUP1�macro�is�used�for�defining�entries�in�TABLE1.?*ˆInputs�to�this�macro�are�the�equate�for�the�directive�number,>*ˆand�the�lable�of�the�routine�which�processes�that�directive.<*ˆSETUP1�will�generate�a�16�bit�offset,�from�the�begining�of*ˆTABLE1,�to�the�directive.* * *ˆexample:*A*ˆSETUP1‚,,,,* TT‡EQU‡%10000000PB‡EQU‡%01000000T1TRGTSK�EQU‡31T1PARBLK�EQU‡30 SETUP1ƒMACRODIR_NUM‚SET‡(*-TABLE1)/4‰IFNE†DIR_NUM-\1SHOULD_BE‚SET…\10‹FAIL„499‘This�directive�is�in�the�wrong�place!!‹MEXIT‰ENDC‰IFC‡'\5','TT'‹DC.B„TT+PB�get�(pb�&�tt);‹DC.B„\4’len�(pb);‹NOLIST ‹XREF.S‚\2‹LIST#‹DC.W„\2-TABLE1‹offset�(directive);‹MEXIT‰ENDC‰IFC‡'\3','PB'‹DC.B„PB’get�(pb);‹DC.B„\4’len�(pb);‹NOLIST ‹XREF.S‚\2‹LIST#‹DC.W„\2-TABLE1‹offset�(directive);‹MEXIT‰ENDC‰DC.B†%00000000‹get�();‰DC.B†0“len�(pb)�=�0;‰NOLIST ‰XREF.S„\2‰LIST#‰DC.W†\2-TABLE1‹offset�(directive);ˆENDM  ‰PAGETABLE1:2‡SETUP1ƒT10,ERROR_01�Error�-�bad�directive�number. 4‡SETUP1ƒT1GTSEG,SEGALOC,PB,24,TTƒAllocate�a�segment. 6‡SETUP1ƒT1DESEG,SEGDEAL,PB,24,TTƒDeallocate�a�segment. 3‡SETUP1ƒT1TRSEG,TFRSEG,PB,24,TT„Transfer�a�segment. <‡SETUP1ƒT1ATTSEG,ATTSEG,PB,24†Attach�to�a�shareable�segment. >‡SETUP1ƒT1SHRSEG,SEGSHAR,PB,24,TT‚Grant�shared�segment�access. ;‡SETUP1ƒT1MOVELL,MOVELL,PB,28,TTƒMove�from�logical�address. ;‡SETUP1ƒT1DCLSHR,DCLSHAR,PB,24…Declare�a�segment�shareable. 5‡SETUP1ƒT1SNAPTRAC,SNAPTRACˆMove�trace�table�to�user. :‡SETUP1ƒT1RCVSA,RCVSA,PB,28,TT…Receive�segment�attributes. /‡SETUP1ƒT1GTTID,GTTASKID,PB,08…Get�TCB�address. '‡SETUP1ƒT1CRTCB,CRTCB,PB,28ˆCreate�TCB. 0‡SETUP1ƒT1GTTNAME,GTTNAME,PB,08,TT�Get�taskname. *‡SETUP1ƒT1START,TSKSTART,PB,10…Start�task. (‡SETUP1ƒT1ABORT,ABORTŽAbort�task�(self). *‡SETUP1ƒT1TERM,TERM�Terminate�task�(self). 6‡SETUP1ƒT1TERMT,TERMT,PB,10ˆTerminate�task�(not�self). -‡SETUP1ƒT1SUSPND,SUSPEND‹Suspe; nd�task�(self). 7‡SETUP1ƒT1RESUME,RESUME,PB,08,TTƒResume�suspended�task. )‡SETUP1ƒT1WAIT,TSKWAIT�Block�task�(self). 7‡SETUP1ƒT1WAKEUP,WAKEUP,PB,08,TTƒWakeup�a�waiting�task. #‡SETUP1ƒT1DELAY,DELAYŽDelay�(self). -‡SETUP1ƒT1RELINQ,RELINQŒRelinquish�execution. :‡SETUP1ƒT1TSKATTR,TSKATTR,PB,08,TT�Return�task�attributes. 6‡SETUP1ƒT1SETPRI,SETPRI,PB,09,TTƒSet�current�priority. -‡SETUP1ƒT1STOP,STOPT,PB,08‰Stop�running�task. 6‡SETUP1ƒT1EXPVCT,EXPVCT,PB,36†Claim�exception�vectors. 1‡SETUP1ƒT1TRPVCT,TRPVCT,PB,56†Claim�trap�vectors. =‡SETUP1ƒT1TSKINFO,TSKINFO,PB,14,TT�Move�task's�TCB�to�caller. =‡SETUP1ƒT1RQSTPA,RQSTPA,PB,26,TTƒRequest�periodic�activation. /‡SETUP1ƒT1DELAYW,DELAYWŒDelay�with�wait�option. 1‡SETUP1ƒT1GTASQ,ASQALOC,PB,22,TTƒAllocate�an�ASQ. *‡SETUP1ƒT1DEASQ,ASQFREEŒDeallocate�an�ASQ. )‡SETUP1ƒT1SETASQ,ASQSTATSŠSet�ASQ�status. -‡SETUP1ƒT1RDEVNT,ASQREAD‹Read�event�from�ASQ. 5‡SETUP1ƒT1QEVNT,ASQEVENT,PB,18,TT‚Queue�event�to�ASQ. (‡SETUP1ƒT1WTEVNT,WTEVENT‹Wait�for�event. +‡SETUP1ƒT1RTEVNT,RTEVENT‹Return�from�event. ,‡SETUP1ƒT1GTEVNT,GTEVENT‹Get�event�from�ASQ. ,‡SETUP1ƒT139,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT140,ERROR_01ŽError�-�bad�directive. 0‡SETUP1ƒT1ATSEM,ATSEM,PB,10ˆAttach�to�semaphore. .‡SETUP1ƒT1WTSEM,WTSEM,PB,10ˆWait�on�semaphore. -‡SETUP1ƒT1SGSEM,SGSEM,PB,10ˆSignal�semaphore. 2‡SETUP1ƒT1DESEM,DESEM,PB,10ˆDetach�from�semaphore. -‡SETUP1ƒT1CRSEM,CRSEM,PB,10ˆCreate�semaphore. <‡SETUP1ƒT1DESEMA,DESEMAŒDetach�all�semaphores�for�this�task. ,‡SETUP1ƒT147,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT148,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT149,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT150,ERROR_01ŽError�-�bad�directive. =‡SETUP1ƒT1SERVER,SERVER,PB,06†Establish�server�for�user�task. 4‡SETUP1ƒT1DSERVE,DSERVEŒDetach�from�server�function. 7‡SETUP1ƒT1DERQST,DERQSTŒSet�user/server�request�status. <‡SETUP1ƒT1AKRQST,AKRQST,PB,20,TTƒAcknowledge�server�request. ,‡SETUP1ƒT155,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT156,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT157,ERROR_01ŽError�-�bad�directive. 2‡SETUP1ƒT1CDIR,CDIR,PB,08ŠConfigure�user�directiv. )‡SETUP1ƒT159,SUPER‘Enter�supervisor�mode. "‡SETUP1ƒT1CMR,CMR’Channel�request. 4‡SETUP1ƒT1CISR,CISR,PB,20,TT‡Claim�interrupt�vector. 6‡SETUP1ƒT1SINT,SINT,PB,04ŠSimulate�user�I/O�interrupt. ,‡SETUP1ƒT163,ERROR_01ŽError�-�bad�directive. ;‡SETUP1ƒT1EXMON,EXMON,PB,16,TT…Attach�to�exception�monitor. >‡SETUP1ƒT1DEXMON,DEMON,PB,16,TT„Detach�from�exception�monitor. <‡SETUP1ƒT1EXMMSK,EXMMSK,PB,12,TTƒSet�exception�monitor�mask. 6‡SETUP1ƒT1RSTATE,RSTATE,PB,12,TTƒReceive�task's�state. 2‡SETUP1ƒT1PSTATE,PSTATE,PB,12,TTƒSet�task's�state. B‡SETUP1ƒT1REXMON,REXMON,PB,12,TTƒExecute�task�under�exmon�control. ,‡SETUP1ƒT170,ERROR_01ŽError�-�bad�directive. ,‡SETUP1ƒT171,ERROR_01ŽError�-�bad�directive. 9‡SETUP1ƒT1MOVEPL,MOVEPL,PB,28†Move�from�physical�address. 0‡SETUP1ƒT1STDTIM,STDTIM,PB,08†Set�date�and�time. 0‡SETUP1ƒT1GTDTIM,GTDTIM,PB,08†Get�date�and�time. )‡SETUP1ƒT1FLUSHC,FLUSHCŒFlush�user�cache.  >HI_T1_NUM�EQU�(*-TABLE1)/4-1�Highest�TRAP�#1�directive�number. ‰PAGE*3*ˆThis�is�the�routine�which�processes�trap�#1�calls*ˆfrom�non�real-time�tasks.* *"*ˆTrace�this�trap�#1,�if�required.* TRAP1_10:-‰BTST†#TRCFTRP1,TRACFLAGŒDo�we�want�to�trace?‰BEQ.S…TRAP1_20–Branch�if�no. !‰BSR‡TRACER˜Trace�this�directive. ‰DC.W†$FF15 *'*ˆSend�a�message�to�EXMON,�if�requried.* TRAP1_20:0‰BTST†#TSKIEXM,TCBATTI(A6)ŠDoes�task�have�EXMON?‰BEQ.S…TRAP1_30–Branch�if�no. 3‰MOVE.L„TCBEMMSK(A6),D1�Move�mask�to�data�register.(‰BTST†#TEMTRAP1,D1’Is�TRAP�#1�monitored?‰BEQ.S…TRAP1_30–Branch�if�no. %‰MOVE.L„#1,D7™Pass�TRAP�#�to�CKEXMON.&‰BSR‡CKEXMON—Go�send�message�to�EXMON.  */*ˆmultiply�D0�by�4;�/*‚Get�index�into�table1; ‡*/ *ˆif�(D0�<�0)7*ˆthen�go�to�trap_usr;Š/*‚User�configured�directive.‚*/* TRAP1_30: ‰ASL.W…#2,D0‰BMI.S…TRAPUSR  *$*ˆif�(D0�>�biggest�directive�number)*ˆthen�exit�(bad�directive);* ‰CMP.W…#HI_T1_NUM*4,D0‰BHI.S…TRAP1BAD  *.*ˆGet�address�of�parameter�block,�if�required.* ‰LEA‡TABLE1(PC),A3‰MOVE.L„(A3,D0.W),D2‰BTST†#T1PARBLK,D2‰BEQ.S…TRAP1_GO ‰MOVE.L„D2,D5‰SWAP†D5‰AND.L…#$FF,D5-‰MOVE.L„A0,D6�LOGICAL�PARAMETER�BLOCK�ADDRESS‰TR0.LOGPHY‚&‰BRA.S…TRAP1_40ŒBRANCH�IF�GOOD�ADDRESS ‰NOP›BAD�ADDRESS&‰EXIT†RTCDPBLKŒBAD�ADDRESS�RETURN�CODE  TRAP1_40:.‰MOVE.L„D6,A4�PARAMETER�PHYSICAL�ADDRESS�TO�A4  *&*ˆGet�target�TCB�address,�if�required.* $‰BTST†#T1TRGTSK,D2ˆNEED�TARGET�TASK?‰BEQ.S…TRAP1_GOŒBRANCH�IF�NO ‰TR0.GETTCB‚(A4)‰BRA.S…TRAP1_50ŒBRANCH�IF�FOUND‰EXIT†RTCDTASKŒBAD�TARGET�TASK TRAP1_50:&‰MOVE.L„A0,A5�TARGET�TCB�ADDRESS�TO�A5 **ˆNow�go�to�directive�code.* TRAP1_GO: ‰JMP‡(A3,D2)   *'*ˆHere�is�another�branch�from�a�branch,$*ˆemployed�for�performance�purposes.* TRAP1BAD:‰EXIT†RTCDDIRN‰PAGETRAPUSR:&‰MOVE.L„UDRBEG,A2‹USER�DIRECTIVE�TABLE‰MOVE.L„A2,D2�DOES�TABLE�EXIST?‰BEQ.S…TRAP1BADŒBRANCH�IF�NO ,‰ASR.W…#2,D0�GET�UNMODIFIED�DIRECTIVE�NUMBER.‰NEG.W…D0’CHANGE�DIRECTIVE�#�TO�POSITIVE�VALUE2‰CMP.W…UDRCNT(A2),D0‡IS�VALUE�WITHIN�TABLE�LIMITS?&‰BGT.S…TRAP1BADŒBRANCH�IF�NOT�IN�TABLE ‰SUB.W…#1,D0�ENTRY�NUMBER‰MULU†#UDRESIZ,D0‰*�ENTRY�SIZE(‰LEA‡UDRENTRY(A2,D0),A2‚POINTER�TO�ENTRY!‰TST.L…UDRADDR(A2)‰ADDRESS�EXIST?‰BEQ.S…TRAP1BADŒBRANCH�IF�NO .‰MOVE.W„UDROPT(A2),D2‡GET�OPTION�&�EXIT�INDEX.)‰BCLR†#4,D2�THIS�TRAP�FOR�1�SESSION�ONLY?‰BNE.S…TRAPUSR1ŒBRANCH�IF�NO "‰MOVE.L„UDRSESS(A2),D1†GET�SESSION'‰CMP.L…TCBSESSN(A6),D1…DOES�IT�COMPARE?‰BNE.S…TRAP1BADŒBRANCH�IF�NO TRAPUSR1:(‰MOVE.L„(A7),TCBA6(A6)†MOVE�A6�INTO�TCB.%‰CLR.W…TCBRTCD(A6)‰CLEAR�RETRUN�CODE.(‰MOVE.W„D2,-(A7)ŒPUT�EXIT�INDEX�ON�STACK ‰IFEQ†CHIPTYPE-680101‰MOVE.W„#$84,-(A7)ŠSIMULATE�TRAP1�ON�M68010�STACK‰ENDC )‰PEAˆTRAP1XIT(PC)‡RETURN�ADDRESS�TO�STACK‰MOVE.W…SR,-(A7)‹SR�TO�STACK $‰MOVE.L„UDRADDR(A2),A2†ENTRY�ADDRESS ‰JMP‡(A2)  **ˆRETURN�FROM�DIRECTIVE* TRAP1XIT:'‰MOVE.W„TCBRTCD(A6),D0†Get�return�code.*‰EXIT.NEƒERROR�Exit�if�error�in�directive. ‰MOVE.W„(A7)+,D0ŒGet�exit�index.5‰EXIT.EQƒSUB‘If�(index�=�0)�then�take�subroutine�exit ‰IF.W†D0��#2�THEN.S4‰TR0.READY�(A6)�If�(index�=�2)�then�make�task�ready.‰ENDI 2‰EXIT†POSTEMPTŒIn�either�case,�take�postempt�exit.‰ENDééé=/*=/*†M68XXX.INIT.AF=/*)=/* Chain file to assemble M68XXX.INIT.SA=/*:=/* If no output argument is specified for the listing the-=/* chain file will default to M68XXX.INIT.LS=/*=/IFC \1ƒ=ARG�M68XXX.INIT.LS=/ENDIF=/*+=ASM M68XXX.INIT.SA,M68XXX.INIT.RO,\1;RZ=75=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.PANEL.EQ=/*ƒ9995.&.GST.EQ=/*ƒ9995.&.UST.EQ=/*ƒ9995.&.TRACE.EQ=/*ƒ9995.&.MAP.EQ=/*ƒ9995.&.IOV.EQ=/*ƒ9995.&< .BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDééééév**ˆ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.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.UDR.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.TST.EQŠINCLUDE�9995.&.PANEL.EQŠINCLUDE�9995.&.GST.EQŠINCLUDE�9995.&.UST.EQŠINCLUDE�9995.&.TRACE.EQŠINCLUDE�9995.&.MAP.EQŠINCLUDE�9995.&.IOV.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.UDR.EQŠINCLUDE�9995.&.INTERRUP.MCŠ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*…________‚_____________‚_______________________________________________:*†12/�7/84�SJFŒAdded�initialization�of�LAST_MMU_INT_LEVEL.C*†12/23/83�Mark�Lanus…Re-wrote�memory�initialization�routine�to�fix.*žbug�in�"hole"�processing�(and�several�more).***‰PAGE ŠXDEFƒKILLER*ŠXREFƒCRASHSAV ŠXREFƒENDMEMT ŠXREFƒMEMTABL ŠXREF.S�ADEFTYPŠXREF.S�ASNTBLŠXREF.S�BKG_ACTIVEŠXREF.S�BKG_HEADŠXREF.S�BKG_TAIL ŠXREF.S�CCBHDŠXREF.S�CURR_ASNŠXREF.S�ENDSYSPŠXREF.S�EXCSTACKŠXREF.S�GSTBEGŠXREF.S�IOVCTBGN ŠXREF.S�LAMŠXREF.S�LAST_MMU_INT_LEVELŠXREF.S�MACSTRCŠXREF.S�MAPBEGŠXREF.S�MIDNIGHT ŠXREF.S�NSEŠXREF.S�NOTLAM ŠXREF.S�PANELŠXREF.S�PATBEGŠXREF.S�READYHDŠXREF.S�SDEFTYPŠXREF.S�SEMENDŠXREF.S�SEMLIST ŠXREF.S�TCBHDŠXREF.S�TDEFTYP ŠXREF.S�TIATŠXREF.S�TIME_LEFTŠXREF.S�TRACEBEGŠXREF.S�TRACFLAGŠXREF.S�UDEFTYPŠXREF.S�UDRBEGŠXREF.S�USTBEGŠXREF.S�VCTUBGNŠPAGE* *„REFERENCES�TO�INITDATA�SEGMENT* ŠSECTION�8 ŠXREFƒASNŠXREFƒDISPATCH ŠXREFƒEEND ŠXREFƒESTACK ŠXREFƒESTART ŠXREFƒGSTSIZ ŠXREFƒIOVSIZxgˆM�<˜G 6¨6°/¸=À>È@Ð*Ø0à=èQð#øUY)IS V(/0<8N@AHPPTX6`Ph2<  ŠXREFƒMEMTYPA ŠXREFƒMEMTYPS ŠXREFƒMEMTYPT ŠXREFƒMEMTYPUŠXREFƒPAGESIZE ŠXREFƒPANELA ŠXREFƒPATSIZ ŠXREFƒRDYHEAD ŠXREFƒSMEMHI ŠXREFƒSMEMLO ŠXREFƒTCBHEAD ŠXREFƒTRCFLAG ŠXREFƒTRCSIZ ŠXREFƒUDRSIZ ŠXREFƒUSTSIZŠXREFƒWHERLOAD**(*ˆ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*$*ˆ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�$24,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?ŠBEQ.S‚VECTINIT‹BRANCH�IF�AT�0'ŠMOVE.L�ESTART(PC),A3†'MOVE�TO'�ADDRESS!ŠMOVE.L�D1,A2Ž'MOVE�FROM'�ADDRESS'ŠLEA„ENDMEMT(PC),A4…END�OF�MEMORY�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:‚head= DŠMOVE.L�#BKG_HEAD,BKG_TAIL�ptr�is�0�and�tail�ptr�points�to�head�ptr.8ŠSF…BKG_ACTIVE‰Initialize�ACTIVE�flag�to�false�since�the*§background�isn't�running. *5*‚Initialize�LAST_MMU_INT_LEVEL�to�interrupt�level�0.*+ŠCLR„LAST_MMU_INT_LEVEL�Set�the�level�to�0.  *+*‡START�PROCESSING�MEMORY�PARTITION�ENTRIES* ŠBSR„IMEM Š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 * *ˆ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)‡EYECATCHERASN996ŠMOVE.B�#$FF,CURR_ASN†RESET�CURR_ASN�MEMORY�COMPONENT.**ˆ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�FOUND�THEN.SŒBRANCH�IF�NO#�MOVE.L�#1,D2‹PAT�minimum�size�is�1ŠENDI)ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGEALOC(ŠMOVE.L�#T0PAGAL,D0ˆPAGEALOC‚DIRECTIVE�#ŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDPAT01‹BRANCH�IF�GOOD�RETURN!ŠBSR„KILLER�CRASH�IF�ERROR�RETURN3BLDPAT01‚MOVE.L�A0,PATBEGŠSAVE�PAT�ADDRESS�FOR�EXECŠBSR„TBLCLR�CLEAR�PAT�TO�ZEROESŠMOVE.L�#'!PAT',(A0)‡EYECATCHER#ŠLSL.W‚#8,D2ŽCONVERT�PAGES�TO�BYTES&ŠMOVE.L�D2,PATTSIZ(A0)…SAVE�TABLE�SIZEŠLEA„0(A0,D2),A2ˆTOP�OF�TABLE)ŠLEA„PATENTRY(A0),A1„ADDRESS�OF�1ST�ENTRYŠLEA„PATFHDR-PATNEXT(A0),A4:BLDPAT04‚MOVE.L�A1,PATNEXT(A4)…SAVE�ENTRY�ADDRESS�IN�CHAIN)ŠMOVE.L�#-1,PATTCB(A1)…FLAG�ENTRY�AS�FREE(ŠMOVE.L�A1,A4ŽSAVE�CURRENT�ENTRY�ADDRESS%ŠLEA„PATEL(A1),A1‡POSSIBLE�NEXT�ENTRY#ŠLEA„PATEL(A1),A3‡POINT�BEYOND�NEXTŠCMP.L‚A3,A2ŽWILL�IT�FIT?#ŠBCC„BLDPAT04‹YES,�GO�INITIALIZE�IT E*�Insert�two�dummy�entries�into�the�PAT�list.‚These�entries�will�haveG*ƒthe�maximum�possible�delta�and�will�cause�and�exec�procedure�to�fire.F*ƒThe�code�for�the�exec�procedure�is�contained�in�the�RMS.SA�module�ofE*ƒRMS68K.‚These�nodes�are�placed�on�the�PAT�so�that�the�PAT�list�willE*ƒnever�be�empty,�simplifying�PAT�processing�in�many�places.‚When�theG*ƒPAT�node�fires,�the�associated�code�in�the�RMS.SA�module�gets�controlG*ƒand�this�code�simply�places�a�dummy�PAT�node�(like�the�one�that�firedE*ƒto�get�us�here)�at�the�very�end�of�the�PAT�list.‚This�scheduling�ofI*ƒthe�dummy�PAT�node�is�a�special�case�in�that�it�does�not�use�the�normal/*ƒPAT�node�schedule�routine�PAT_SCHED_NEW_NODE. �#'DUMY'�DO.S �LEA‚2(A3),A3ŠENDW ŠLEA„4(A3),A3$*£A3�now�contains�the�address�of�the"*£exec�code�to�reschedule�the�node"ŠBSR.S‚BLDPAT12‹Build�a�dummy�node;ŠMOVE.L�A4,PATHDR(A0)†Link�the�dummy�node�into�the�PAT�list4ŠMOVE.L�A4,A2ŽSave�addr�of�this�node�for�future�link1ŠBSR.S‚BLDPAT12‹Build�an�identical�2nd�dummy�node/ŠMOVE.L�A4,PATNEXT(A2)…Link�2nd�node�behind�1stŠMOVE.L�#PATBIGDELTA,NSE>ŠMOVE.L�#PATBIGDELTA,TIME_LEFT�Make�TIME_LEFT�as�big�as�we�canŠCLR.L‚MIDNIGHT.ŠBRA.S‚BLDUDR�Done�with�PAT�stuff�all�together*$* Subroutine to build dummy PAT node:BLDPAT12‚MOVE.L�PATFHDR(A0),A4…A4�points�to�free�PAT�entry@ŠMOVE.L�PATNEXT(A4),PATFHDR(A0)�Unlink�this�entry�from�free�list*£Initialize�PAT�entriesŠCLR.L‚PATNEXT(A4)$ŠCLR.L‚PATTCB(A4)‰Indicate�exec�node5ŠMOVE.L�#PATBIGDELTA,PATDELTA(A4)�Make�delta�very�bigŠCLR.L‚PATINTV(A4)'ŠMOVE.L�A3,PATASR(A4)†Execution�address(ŠCLR.W‚PATOPT(A4)‰Options�-�not�periodic4ŠMOVE.L�#PATDUMMYID,PATARID(A4)�Plug�in�the�dummy�ID> 4ŠMOVE.W�#$FFFF-$0700,PATILVL(A4)�Interrupt�level�=�0ŠRTS *$*ˆBUILD�USER�DEFINED�DIRECTIVE�TABLE*9BLDUDR„CLR.L‚UDRBEG�CLEAR�UDR�ADDRESS�IN�CASE�NONE�NEEDEDŠMOVE.L�UDRSIZ(PC),D2†NEED�UDR?ŠBEQ.S‚BLDTRACŒBRANCH�IF�NO(ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGALOC,ŠMOVE.L�#T0PAGAL,D0ˆDIRECTIVE�#�FOR�PAGEALOCŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDUDR01‹BRANCH�IF�GOOD�RETURNŠBSR„KILLER�CRASH�IF�NO�MEMORY3BLDUDR01‚MOVE.L�A0,UDRBEGŠSAVE�UST�ADDRESS�FOR�EXECŠBSR„TBLCLR�CLEAR�UST�TO�ZEROES*ŠMOVE.L�#'!UDR',UDR(A0)„EYE�CATCHER�TO�UDR#ŠLSL.L‚#8,D2ŽCONVERT�PAGES�TO�BYTES(ŠSUB.L‚#UDRENTRY,D2‡SUBRTACT�HEADER�SIZE(ŠDIVUƒ#UDRESIZ,D2ˆDIVIDE�BY�ENTRY�LENGTH,ŠMOVE.W�D2,UDRCNT(A0)†SAVE�MAXIMUM�#�ENTRIES**ˆBUILD‚TRACE�TABLE*DBLDTRACƒCLR.L‚TRACEBEG‰CLEAR�SYSPAR�ADDRESS�IN�CASE�TRACE�NOT�NEEDED'ŠMOVE.L�TRCSIZ(PC),D2†NEED�TRACE�TABLE?ŠBEQ.S‚BLDTIATŒBRANCH�IF�NO)ŠMOVE.L�D2,A0ŽPUT�SIZE�IN�A0�FOR�PAGEALOC(ŠMOVE.L�#T0PAGAL,D0ˆPAGEALOC�DIRECTIVE�#ŠTRAPƒ#0‘EXEC�CALL%ŠBRA.S‚BLDTRC01‹BRANCH�IF�GOOD�RETURNŠBSR„KILLER�CRASH�IF�NO�MEMORY1BLDTRC01‚MOVE.L�A0,TRACEBEGˆSAVE�ADDRESS�FOR�EXEC'ŠBSR„TBLCLR�CLEAR�TRACE�TABLE�TO�ZEROES+ŠLEA„TRCENTRS(A0),A2„ADDRESS�OF�FIRST�ENTRYŠMOVE.L�A2,(A0)ŒSAVE�IN�HEADER#ŠLSL.L‚#8,D2ŽCONVERT�BYTES�TO�PAGES(ŠSUB.L‚#TRCENTRS,D2‡SUBTRACT�HEADER�SIZE'ŠDIVUƒ#TRCENTSZ,D2‡DIVIDE�BY�ENTRY�SIZE)ŠMULUƒ#TRCENTSZ,D2‡MULTIPLY�BY�ENTRY�SIZE$ŠADD.L‚A2,D2ŽADD�ENTRY�START�ADDRESS4ŠMOVE.L�D2,TRCLNG(A0)†SAVE�END�ADDRESS�OF�LAST�ENTRY*,ŠMOVE.W�TRCFLAG(PC),TRACFLAG�SET�TRACE�FLAGS*#*ˆTRAP�INSTRUCTION�ASSIGNMENT�TABLE*>BLDTIATƒMOVE.L�#$01010000,TIAT„SET�TRAP�0�AND�1�'USED�BY�EXEC'ŠPAGE*0*…INITIALIZE�CONFIGURATION-DEPENDENT�I/O�DEVICES* ŠXREFƒINITIO)ŠBSR„INITIO�SUBROUTINE�WILL�INITIALIZE�IO*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�LIGHTS> 4Š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�REGISTER0ŠDISABLE_INTERRUPTSˆ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�partition? E***…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�in�partition�zero,�then�we�set�both�start_of_G***…part_ptr�and�clear_mem_ptr�to�point�to�the�next�256�byte�page�after8***…the�SYSPAR�data�area,�and�set�bytes_cleared�to�zero.***B***ŠFinally,�if�the�start_of_part_ptr�and�end_of_part_ptr�describeF***…a�partition�that�does�not�contain�some�positive�ammount�of�memory,=***…then�we�obviously�cannot�continue,�and�so�we�call�KILLER.***L**************************************************************************** ŠTTL„INIT�POINTERS�-�ALGORITHMŠPAGE@ *init_pointers: procedure;   *ˆDO�<==�0;.*ˆsrc_memtbl_ptr�<==�addr�(INITDAT�(MEMTABL));0*ˆif�(MAPMTYP.MAPPART�(src_memtbl_ptr)�<>�$0000)*ˆthen�call�KILLER; *ˆfml_header_len�<==�0;%*ˆtemp_memtbl_ptr�<==�src_memtbl_ptr;7*ˆdo�until�(MAPMTYP.MAPPART�(temp_memtbl_ptr)�=�$FFFF);%*’fml_header_len�<==�fml_header_len�+*¥length�(dest_memtbl_entry);'*’temp_memtbl_ptr�<==�temp_memtbl_ptr�+*¦length�(src_memtbl_entry); *ˆend;C*ˆfml_header_len�<==�(length�(fml_header)�+�length�(memtbl_entry)�+,*œ(temp_memtbl_ptr�-�src_memtbl_ptr))�/�256; 7*ˆend_of_part_ptr�<==�floor�(MAPENDA�(src_memtbl_ptr));)*ˆif�(exec�is�in�partition�xero)�then�do;.*’start_of_part_ptr�<==�ceil�(INITDAT�(EEND));(*’clear_mem_ptr�<==�ceil�(addr�(START));5*’bytes_cleared�<==�ceil�(addr�(INITDAT�(ENDMEMT)))�-*¤clear_mem_ptr;*’if�(INITDAT�(TCBHEAD)�=�0).*’then�bytes_cleared�<==�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�partitions�except�partition�zero.‚For�ROMH***„partitions,�we�make�an�entry�in�the�dest_memtbl.‚For�RAM�partitions,A***„we�insure�that�no�conflict�exists�with�a�previously-describedH***„partition,�build�the�FML,�build�the�FML_HEADER,�and�make�an�entry�in***„the�dest_memtbl.*** ***…Inputs:***ˆ1.)‚A0�=�src_memtbl_ptr;2***�(Points�to�the�first�entry�in�the�src_memtbl.)***ˆ2.)‚A1�=�dest_memtbl_ptr;3***�(Points�to�the�first�entry�in�the�dest_memtbl.)*** ***…Outputs:***ˆ1.)‚Dest_memtbl.#***ˆ2.)‚FML�for�all�RAM�partitions.@ +***ˆ3.)‚FML_HEADERs�for�all�RAM�partitions.******…Side�effects:B***ˆ1.)‚Most�registers�are�destroyed,�except�for�the�stack�pointer ***�(A7).******…Explanation:D***ŠWe�keep�looping�until�the�MAPMTYP�and�MAPPART�fields�of�the�nextH***…entry�in�the�src_memtbl�both�contain�$FF.‚(This�indicates�the�end�ofH***…the�memtbl.)‚When�we�see�the�end�of�the�src_memtbl,�then�we�write�an.***…end�entry�for�the�dest_memtbl,�and�return.***E***ŠFor�every�good�entry�in�the�src_memtbl�we�call�init_next_pointersG***…to�set�up�our�pointers�and�counters�for�this�memory�partition.‚ThenE***…if�the�MAPMTYP�field�of�the�src_memtbl�entry�=�$FF,�we�have�a�ROM4***…partition�and�so�we�call�build_rom_memtbl_entry.***8***ŠFor�every�RAM�entry�in�the�src_memtbl,�we�first�callG***…check_memmap_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�RAMB***…partition.‚Then�if�the�previous_node_ptr�is�not�equal�to�zero,C***…build_fml�found�at�least�one�256�byte�page�of�memory�in�the�newI***…partition�and�so�we�call�build_fml_header�to�build�the�FML_HEADER�forA***…the�new�partition.‚Now,�since�this�is�not�partition�zero,�andH***…therefore�all�FML_HEADERs�require�only�one�256�byte�block�of�memory,A***…we�know�that�build_fml_header�successfully�found�room�for�theD***…FML_HEADER�and�so�we�can�call�build_ram_memtbl_entry�to�build�an7***…entry�for�the�current�partition�in�the�dest_memtbl.***=***ŠIf�the�previous_node_ptr�is�equal�to�zero,�then�build_fmlE***…did�not�find�even�one�256�byte�page�within�the�current�partition.=***…In�this�case�we�reset�the�dest_memtbl_ptr�to�point�to�theE***…previous�entry�within�the�dest_memtbl�(decrement�it�by�the�lengthC***…of�one�entry).‚This�has�the�effect�of�ignoring�the�current�null***…partition.***N****************************************************************************** %ŠTTL„INIT�NEXT�PARTITIONS�-�ALGORITHMŠPAGE!*init_next_partitions: procedure;    >*ˆdo�while�(MAPMTYP.MAPPART�(next�(src_memtbl_ptr))�<>�$FFFF);*’call�init_next_pointers;%*’if�(MAPMTYP�(src_memtbl_ptr)�=�$FF)#*’then�call�build_rom_memtbl_entry; *’else�do;*œcall�check_memmap_conflict;%*œif�(got_alias_partition_flag�=�set)#*œthen�call�build_ram_memmap_entry; *œelse�do;*¦call�build_fml;*¦if�(previous_node_ptr�=�0)*¦then�dest_memtbl_ptr�<==*«dest_memtbl_ptr�-*«length�(dest_memtbl_entry); *¦else�do;*°call�build_fml_header;*°call�build_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;4*ˆMAPTYP.MAPPART�(next�(dest_memtbl_ptr))�<==�$FFFF;  *end init_next_partitions; 'ŠTTL„INIT�NEXT�MEMORY�PARTITIONS�-�CODEŠPAGE*!*init_next_partitions: procedure;* INEXTMEM:*>*ˆdo�while�(MAPMTYP.MAPPART�(next�(src_memtbl_ptr))�<>�$FFFF);*’call�init_next_pointers;%*’if�(MAPMTYP�(src_memtbl_ptr)�=�$FF)#*’then�call�build_rom_memtbl_entry;* ŠWHILE.W�12(A0)��#$FFFF�DO.S �BSR.S‚INEXTPTRS �IF.Bƒ(A0)��#$FF�THEN.S �BSR„BROMNODE * *’else�do;*œcall�check_memmap_conflict;%*œif�(got_alias_partition_flag�=�set)#*œthen�call�build_ram_memtbl_entry;*A �ELSE.S �BSR„CMEMCONF �TST.B‚D2�IF…�THEN.Sˆ “BSR„BRAMNODE * *›else�do;*¦call�build_fml;*¦if�(previous_node_ptr�<>�0)*¦then�dest_memtbl_ptr�<==*«dest_memtbl_ptr�-*«length�(dest_memtbl_entry); *¦else�do;*°call�build_fml_header;*°call�build_ram_memtbl_entry;*¦end;*œend;*’end;*ˆend;*“ELSE.S “BSR.S‚BFML “IF.LƒA2��D0�THEN.S“LEA„-MAPENTSZ(A1),A1“ELSE.S –BSR„BFMLHEAD –BSR„BRAMNODE“ENDI�ENDI�ENDIŠENDW *5*ˆMAPMTYP.MAPPART�(next�(dest_memtbl_ptr))�<==�$FFFF;*#ŠMOVE.W�#$FFFF,MAPMTYP+MAPENTSZ(A1) **end init_next_partitions;*ŠRTS 'ŠTTL„INIT�NEXT�POINTERS�-�DOCUMENTATIONŠPAGEM********************************************************************************)***…Name:‚INEXTPTRS�(init_next_pointers):*** ***…Function:C***ŠInitializes�all�pointers�and�counters�for�all�memory�partitions***…except�partition�zero.*** ***…Inputs:'***ˆ1.)‚A0�=�previous�(src_memtbl_ptr).(***ˆ2.)‚A1�=�previous�(dest_memtbl_ptr).*** ***…Outputs:&***ˆ1.)‚A0�=�current�(src_memtbl_ptr).'***ˆ2.)‚A1�=�current�(dest_memtbl_ptr).***ˆ3.)‚A5�=�clear_mem_ptr.***ˆ4.)‚D4�=�start_of_part_ptr.***ˆ5.)‚D5�=�end_of_part_ptr.***ˆ6.)‚D6�=�bytes_cleared.***ˆ7.)‚D7�=�fml_header_len.******…Side�effects:1***ˆ1.)‚Execution�might�not�return�(call�KILLER).******…Explanation:@***ŠFirst�we�set�the�fml_header_len�to�one�(any�partition�exceptG***…partition�zero�requires�only�one�256�byte�page�for�its�FML_HEADER),@***…and�advance�both�the�src_memtbl_ptr�and�the�dest_memtbl_ptr.***C***ŠNext�we�set�the�start_of_part_ptr�to�the�ceiling�of�the�MAPSTRAH***…field�in�the�src_memtbl,�and�the�end_of_part_ptr�to�the�floor�of�theH***…MAPENDA�field.‚(Note�that�we�always�align�our�partitions�on�256�byteI***…page�boundaries,�and�that�we�always�round�to�the�same�ammount�or�less+***…memory�as�described�in�the�src_memtbl).***D***ŠWe�then�set�clear_mem_ptr�to�the�value�of�start_of_part_ptr,�andE***…set�bytes_cleared�to�zero.‚(Thus�we�will�start�clearing�memory�atG***…the�start�of�the�current�partition.)‚Finally,�we�call�KILLER�if�theG***…current�partition�described�by�the�src_memtbl�does�not�contain�some'***…positive�number�of�pages�of�memory.***L**************************************************************************** #ŠTTL„INIT�NEXT�POINTERS�-�ALGORITHMŠPAGE*init_next_pointers: procedure;    *ˆfml_header_len�<==�1;@*ˆsrc_memtbl_ptr�<==�src_memtbl_ptr�+�length�(src_memtbl_entry);C*ˆdest_memtbl_ptr�<==�dest_memtbl_ptr�+�length�(dest_memtbl_entry); 8*ˆstart_of_part_ptr�<==�ceil�(MAPSTRA�(src_memtbl_ptr));7*ˆend_of_part_ptr�<==�floor�(MAPENDA�(src_memtbl_ptr));&*ˆclear_mem_ptr�<==�start_of_part_ptr;*ˆbytes_cleared�<==�0; +*ˆif�(start_of_part_ptr�>=�end_of_part_ptr)*ˆthen�call�KILLER;  *end init_next_pointers; ŠTTL„INIT�NEXT�POINTERS�-�CODEŠPAGE**init_next_pointers: procedure* INEXTPTRS: **ˆfml_header_len�<==�1;@*ˆsrc_memtbl_ptr�<==�src_memtbl_ptr�+�length�(src_memtbl_entry);C*ˆdest_memtbl_ptr�<==�dest_memtbl_ptr�+�length�(dest_memtbl_entry);* ŠMOVE.L�#1,D7 ŠLEA„12(A0),A0 ŠLEA„MAPENTSZ(A1),A1 *8*ˆstart_of_part_ptr�<==�ceil�(MAPSTRA�(src_memtbl_ptr));7*ˆend_of_part_ptr�<==�floor�(MAPENDA�(src_memtbl_ptr));&*ˆclear_mem_ptr�<==�start_of_part_ptr;*ˆbytes_cleared�<==�0;*ŠMOVE.L�MAPSTRA(A0),D4ŠADD.L‚#255,D4 ŠCLR.B‚D4 ŠMOVE.L�MAPENDA(A0),D5 ŠCLR.B‚D5 ŠMOVE.L�D4,A5 ŠCLR.L‚D6 *+*ˆ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�theA F***…partition.‚It�also�detects�"holes"�in�the�partition,�and�describes3***…them�as�"used"�memory�within�the�current�block.*** ***…Inputs:***ˆ1.)‚A5�=�clear_mem_ptr.***ˆ2.)‚D4�=�end_of_part_ptr.***ˆ3.)‚D6�=�bytes_cleared.*** ***…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: procedure;*BFML: **ˆprevious_node_ptr�<==�0;*B  Š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)/�NOP”This�NOP�forces�the�execution�unit�to�wait)*§until�the�bus�interface�unit�is�done�on&*§a�68020,�in�case�we�get�a�bus�error.�LEA„16(A5),A5ŠUNTIL.L�A5��D5**ˆpop�bus_error�junk�off�stack;2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;* ŠADD.L‚#6,A7 ŠMOVE.L�A5,D6 ŠSUB.L‚A4,D6 **build_last_fml_node:*ˆif�(bytes_cleared�>�0)*ˆthen�call�build_fml_entry;* BLASTNODE:ŠIF.LƒD6��D0�THEN.S�BSR.S‚BFMLNODEŠENDI **end build_fml;*ŠRTS 4ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�DOCUMENTATIONŠPAGEN************************************************************************************…Explanation:?***ŠThis�code�is�executed�if�we�encounter�a�hole�while�clearing@***…memory.‚Note�the�two�labels�build_fml_be�and�build_fml_be_x.G***…Execution�will�"go�to"�the�build_fml_be�label�if�a�bus�error�occursB***…when�clearing�memory�via�the�loop�in�the�build_fml�subroutine.F***…Likewise,�execution�will�"go�to"�the�build_fml_be_x�label�if�a�busH***…error�occurs�while�looking�at�the�top�of�each�page�of�memory�for�theF***…next�"good"�page.‚(i.e.,�This�block�of�code�contains�a�"bus�error"G***…loop.‚We�keep�going�to�build_fml_be_x�until�we�either�reach�the�end:***…of�the�current�partition,�or�find�some�"good"�memory.)***A***ŠFirst�we�calculate�bytes_cleared�to�be�the�difference�betweenG***…the�clear_mem_ptr�and�the�last_node_ptr.‚Then�we�call�KILLER�if�theJ***…bus�error�occurred�in�the�middle�of�a�page.‚(Bytes_cleared�is�not�on�a***…page�boundary.)***E***ŠOtherwise,�we�update�the�clear_mem_ptr�to�point�to�the�top�of�theG***…next�page�in�memory.‚If�we�are�at�the�end�of�the�current�partition,@***…then�we�go�to�the�build_last_fml_node�label�in�the�build_fml***…subroutine.***B***ŠIf�we�are�not�at�the�end�of�the�partition,�we�set�the�stack�upF***…so�that�a�bus�error�will�send�us�back�to�the�build_fml_be_x�label.G***…Then�we�attempt�to�write�into�the�memory�location�pointed�to�by�theF***…clear_mem_ptr.‚(If�a�bus�error�occurs,�then�execution�will�"go�to"I***…build_fml_be_x,�and�we�will�"loop"�until�we�run�out�of�memory�in�this+***…partition,�or�find�some�"good"�memory.)***D***ŠIf�we�"fall�through"�to�the�next�instruction�(find�a�good�memoryI***…location),�then�we�get�rid�of�the�bus�error�information�on�the�stack.J***…If�we�found�some�good�memory�in�the�current�block�(bytes_cleared�>�0),E***…then�we�call�build_fml_node�to�build�a�node�in�the�FML,�and�resetI***…bytes_cleared�to�zero.‚In�either�case�we�go�to�clear_next_node�in�the***…build_fml�subroutine.***N****************************************************************************** 0ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�ALGORITHMŠPAGE*build_fml_be:2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;$*ˆif�(mod�(bytes_cleared,�256)�<>�0)*ˆthen�call�KILLER; *build_fml_be_x:(*ˆclear_mem_ptr�<==�clear_mem_ptr�+�256;&*ˆif�(clear_mem_ptr�=�end_of_part_ptr)!*ˆthen�go�to�build_last_fml_node;*ˆpush�addr�(build_fml_be_x); *ˆpush�'BE';*ˆword�(clear_mem_ptr)�<==�0;*ˆpop�bus_error�junk�off�stack;!*ˆif�(bytes_cleared�>�0)�then�do;*’call�build_fml_node;*’bytes_cleared�<==�0;*ˆend;*ˆgo�to�clear_next_node;  *end build_fml_be; +ŠTTL„BUS�ERROR�WHILE�CLEARING�MEMORY�-�CODEŠPAGE**build_fml_be:*BFMLBE: *2*ˆbytes_cleared�<==�clear_mem_ptr�-�last_node_ptr;$*ˆif�(mod�(bytes_cleared,�256)�<>�0)*ˆthen�call�KILLER;* ŠMOVE.L�A5,D6 ŠSUB.L‚A4,D6 ŠIF.BƒD6��D0�THEN.S �BSR„KILLERŠENDIB  **build_fml_be_x:*BFMLBEX: *(*ˆclear_mem_ptr�<==�clear_mem_ptr�+�256;&*ˆif�(clear_mem_ptr�=�end_of_part_ptr)!*ˆthen�go�to�build_last_fml_node;*ŠLEA„256(A5),A5 ŠIF.LƒA5��D5�THEN.S�BRA„BLASTNODEŠENDI**ˆpush�addr�(build_fml_be_x); *ˆpush�'BE';*ˆword�(clear_mem_ptr)�<==�0;*ŠPEA„BFMLBEX(PC)ŠMOVE.W�#'BE',-(A7) ŠMOVE.W�D0,(A5)/ŠNOP—This�NOP�forces�the�execution�unit�to�wait)*§until�the�bus�interface�unit�is�done�on&*§a�68020,�in�case�we�get�a�bus�error. **ˆpop�bus_error�junk�off�stack;!*ˆif�(bytes_cleared�>�0)�then�do;*’call�build_fml_node;*’bytes_cleared�<==�0;*ˆend;*ˆgo�to�clear_next_node;* ŠADD.L‚#6,A7 ŠIF.LƒD6��D0�THEN.S�BSR.S‚BFMLNODE �CLR.L‚D6ŠENDI  ŠBRA„CNEXTNODE #ŠTTL„BUILDŽFML�NODE�-�DOCUMENTATIONŠPAGEL*******************************************************************************$***…Name:‚BFMLNODE�(build_fml_node):*** ***…Function:E***ŠBuilds�a�node�in�the�free�memory�list�(fills�in�the�fmlfp,�fmlbp,E***…fmlfree,�and�fmlused�fields),�and�links�this�node�to�any�previous***…nodes�in�the�FML.*** ***…Inputs:***ˆ1.)‚A2�=�previous_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�clear_mem_ptr.***ˆ4.)‚D6�=�bytes_cleared.*** ***…Outputs:8***ˆ1.)‚FML�node�(pointed�to�by�previous�last_node_ptr).D***ˆ2.)‚Fmlfp�of�previous�node�in�FML�(if�this�is�not�the�first�node***�in�the�FML).C***ˆ3.)‚A3�=�first_node_ptr�(if�this�is�the�first�node�in�the�FML).***ˆ4.)‚A4�=�previous_node_ptr.******…Side�effects:"***ˆ1.)‚D1�(scratch)�is�destroyed.******…Explanation:B***ŠFirst�we�set�up�the�fmlfp�and�fmlbp�links�in�the�current�node.E***…Next�we�set�up�fmlused�to�contain�the�number�of�pages�between�theA***…last_node_ptr�and�the�clear_mem_ptr�minus�the�number�of�pagesE***…described�by�the�bytes_cleared�counter.‚Then�we�set�fmlfree�equalG***…to�the�number�of�pages�described�by�the�bytes_cleared�counter.‚ThusJ***…the�sum�of�fmlused�and�fmlfree�is�equal�to�the�number�of�pages�between-***…the�last_node_ptr,�and�the�clear_mem_ptr.***E***ŠNow,�if�this�is�the�first�node�in�the�FML�(previous_node_ptr�=�0)K***…then�set�first_node_ptr�equal�to�last_node_ptr�and�thus�"remember"�thatG***…this�is�the�first�node.‚Otherwise,�update�the�fmlfp�of�the�previousF***…node�to�point�to�this�node.‚Finally�set�previous_node_ptr�equal�to>***…last_node_ptr�(and�thus�"remember"�this�node),�and�return.***M***************************************************************************** ŠTTL„BUILDŽFML�NODE�-�ALGORITHMŠPAGE*build_fml_node: procedure;    *ˆfmlfp�(last_node_ptr)�<==�0;.*ˆfmlbp�(last_node_ptr)�<==�previous_node_ptr;@*ˆfmlused�(last_node_ptr)�<==�((clear_mem_ptr�-�last_node_ptr)�-*¥(bytes_cleared))�/�256;2*ˆfmlfree�(last_node_ptr)�<==�bytes_cleared�/�256;*ˆif�(previous_node_ptr�=�0)(*ˆthen�first_node_ptr�<==�last_node_ptr;3*ˆelse�fmlfp�(previous_node_ptr)�<==�last_node_ptr;&*ˆprevious_node_ptr�<==�last_node_ptr;  *end build_fml_node; ŠTTL„BUILDŽFML�NODE�-�CODEŠPAGE**build_fml_node:* BFMLNODE: **ˆfmlfp�(last_node_ptr)�<==�0;.*ˆfmlbp�(last_node_ptr)�<==�previous_node_ptr;*ŠCLR.L‚FMLFP(A4)ŠMOVE.L�A2,FMLBP(A4) **ˆfmlused�(last_node_ptr)�<==8*’(clear_mem_ptr�-�last_node_ptr�-�bytes_cleared)�/�256;2*ˆfmlfree�(last_node_ptr)�<==�bytes_cleared�/�256;* ŠMOVE.L�A5,D1 ŠSUB.L‚A4,D1 ŠSUB.L‚D6,D1 ŠLSR.L‚#8,D1ŠMOVE.L�D1,FMLUSED(A4) ŠMOVE.L�D6,D1 ŠLSR.L‚#8,D1ŠMOVE.L�D1,FMLFREE(A4) *ˆif�(previous_node_ptr�=�0)(*ˆthen�first_node_ptr�<==�last_node_ptr;3*ˆelse�fmlfp�(previous_node_ptr)�<==�last_node_ptr;*ŠIF.LƒA2��D0�THEN.S �LEA„(A4),A3 �ELSE.S�MOVE.L�A4,FMLFP(A2)ŠENDI *&*ˆprevious_node_ptr�<==�last_node_ptr;* ŠLEA„(A4),A2 **end build_fml_node;*ŠRTS %ŠTTL„BUILDŽFML�HEADER�-�DOCUMENTATIONŠPAGEC M********************************************************************************&***…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�leastC I***…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�currentH***…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�memoryD ‡p\y*�[‰$‘L™P¡3©a±3¹_ÁQÉ.ÑBI***…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�of�the�"used"�portion�of�the�previous�block,�if�a�previous�blockH***…exists.)‚Also,�since�this�subroutine�"steals"�a�block�of�memory�fromE***…low�memory,�it�may�hvae�to�move�the�pointers�and�counters�(fmlfp,J***…fmlbp,�fmlfree,�fmlused)�from�their�position�to�a�location�fml_header_'***…len�pages�further�"down"�in�memory.*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚D7�=�fml_header_len.*** ***…Outputs:***ˆ1.)‚A5�=�fml_header_ptr.;***ˆ2.)‚If�we�can't�find�any�block�in�the�current�partition'***�at�least�fml_header_len�pages�long:+***�A.)‚A3�(first_node_ptr)�is�set�to�zero.****�B.)‚A4�(last_node_ptr)�is�set�to�zero.******…Side�effects:‚None:******…Explanation:F***ŠFirst�we�set�fml_header_ptr�equal�to�the�first_node_ptr�and�searchI***…forward�through�the�FML�until�we�find�a�block�at�least�fml_header_lenC***…pages�long.‚If�we�reach�the�end�of�the�FML�(fml_header_pty�=�0)H***…without�finding�a�block�of�memory�fml_header_len�pages�long,�then�weG***…zero�out�the�first�and�last_node_ptr�and�return.‚(Fml_header_ptr�is***…also�zero.)***E***ŠOtherwise,�we�check�to�see�if�the�block�is�exactly�fml_header_lenG***…pages�long.‚If�it�is,�then�we�call�unlink_fml_header_node�to�unlinkI***…the�node�from�the�FML�linked�list,�and�count�its�memory�as�being�part.***…of�the�used�portion�of�the�previous�block.***>***ŠIf�the�block�is�greater�than�fml_header_len�pages,�we�callG***…move_fml_node�to�move�the�pointers�and�counters�of�the�current�nodeJ***…(fmlfp,�fmlbp,�fmlfree,�fmlused)�fml_header_len�pages�"down"�in�memory;***…in�order�to�make�room�for�the�FML_HEADER�in�low�memory.***N****************************************************************************** +ŠTTL„GET�FML�HEADER�POINTER�LOW�-�ALGORITHMŠPAGE#*get_fml_header_ptr_low: procedure;    $*ˆfml_header_ptr�<==�first_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlfp�(fml_header_ptr);"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;*ˆelse�call�move_fml_node;  *end get_fml_header_low; &ŠTTL„GET�FML�HEADER�POINTER�LOW�-�CODEŠPAGE#*get_fml_header_ptr_low: procedure;* GFMLPTRL: *$*ˆfml_header_ptr�<==�first_node_ptr;7*ˆdo�while�(fmlfree�(fml_header_ptr)�<�fml_header_len);,*’fml_header_ptr�<==�fmlfp�(fml_header_ptr);* ŠLEA„(A3),A5 !ŠWHILE.L�FMLFREE(A5)��D7�DO.S �MOVE.L�FMLFP(A5),A5 *"*’if�(fml_header_ptr�=�0)�then�do;*œfirst_node_ptr�<==�0;*œlast_node_ptr�<==�0; *œreturn;*’end;*ˆend;*�IF.LƒA5��D0�THEN.S �SUB.L‚A3,A3 �SUB.L‚A4,A4�RTS�ENDIŠENDW *0*ˆif�(fmlfree�(fml_header_ptr)�=�fml_header_len)#*ˆthen�call�unlink_fml_header_node;*ˆelse�call�move_fml_node;* ŠIF.LƒFMLFREE(A5)�„D7�THEN.S�BSR.S‚UFMLHEAD�ELSE.S�BSR.S‚MFMLNODEŠENDI **end get_fml_header_ptr_low;*ŠRTS +ŠTTL„UNLINK�FML�HEADER�NODE�-�DOCUMENTATIONŠPAGEN*********************************************************************************,***…Name:‚UFMLHEAD�(unlink_fml_header_node):*** ***…Function:E***ŠThis�subroutine�handles�the�unlinking�of�the�fml_header_node�fromI***…the�FML.‚It�takes�care�of�linking�the�previous_node�(if�there�is�one)I***…to�the�next_node�(if�there�is�one)�and�vice�versa.‚It�also�takes�careJ***…of�accounting�for�the�fml_D header_node�as�part�of�the�"used"�portion�of(***…the�previous_node�(if�there�is�one).*** ***…Inputs:***ˆ1.)‚A3�=�first_node_ptr.***ˆ2.)‚A4�=�last_node_ptr.***ˆ3.)‚A5�=�fml_header_ptr.*** ***…Outputs:E***ˆ1.)‚Updated�FML�with�the�fml_header_node�"unlinked"�from�the�FML,?***�and�counted�as�part�of�the�"used"�part�of�its�previous_node***�(if�there�is�one).******…Side�effects:.***ˆ1.)‚A3�(first_node_ptr)�could�get�changed.-***ˆ2.)‚A4�(last_node_ptr)�could�get�changed.3***ˆ3.)‚A2�(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_E 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: procedE ure;    9*ˆmoved_node_ptr�<==�fml_header_ptr�+�fml_header_len*256; /*ˆprevious_node_ptr�<==�fmlbp�(fml_header_ptr);*ˆif�(previous_node_ptr�=�0))*ˆthen�first_node_ptr�<==�moved_node_ptr; *ˆelse�do;/*’fmlfp�(previous_node_ptr)�<==�moved_node_ptr;!*’fmlused�(previous_node_ptr)�<==*œfmlused�(previous_node_ptr)�+*œfml_header_len;*ˆend; *ˆfmlfree�(fml_header_ptr)�<==*œfmlfree�(fml_header_ptr)�-*œfml_header_len; +*ˆnext_node_ptr�<==�fmlfp�(fml_header_ptr);*ˆif�(next_node_ptr�=�0)(*ˆthen�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�deF st_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_ptr)�.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�F (dest_memtbl_ptr)�<==�start_of_part_ptr;*ŠMOVE.L�D4,MAPSTRA(A1) */*ˆmapfmlp�(dest_memtbl_ptr)�<==�fml_header_ptr;*ŠMOVE.L�A5,MAPFMLP(A1) **end build_ram_memtbl_entry;*ŠRTS +ŠTTL„BUILDŽROM�MEMTBL�ENTRY�-�DOCUMENTATIONŠPAGEM********************************************************************************,***…Name:‚BROMNODE�(build_rom_memtbl_entry):*** ***…Function:E***ŠThis�subroutine�does�some�primitive�checking�on�the�legality�of�aB***…ROM�partition�described�in�the�src_memtbl,�and�then�writes�theH***…descriptors�and�pointers�to�describe�that�node�into�the�dest_memtbl.*** ***…Inputs:***ˆ1.)‚A0�=�src_memtbl_ptr.***ˆ2.)‚A1�=�dest_memtbl_ptr.***ˆ3.)‚D4�=�start_of_part_ptr.***ˆ4.)‚D5�=�end_of_part_ptr.*** ***…Outputs:7***ˆ1.)‚Dest_memtbl_entry�(ROM�entry)�pointed�to�by�the***�dest_memtbl_ptr.******…Side�effects:$***ˆ1.)‚A6�(scratch)�gets�destroyed./***ˆ2.)‚Execution�may�not�return�(call�KILLER).******…Explanation:D***ŠFirst�we�verify�that�the�current�ROM�partition�does�not�start�atH***…a�lower�memory�location�than�the�ending�of�the�last�partition�in�theH***…dest_memtbl.‚If�it�does,�we�have�a�fatal�configuration�error,�and�so***…we�call�KILLER.***>***ŠOtherwise,�we�move�the�MAPMTYP�and�MAPPART�fields�from�theH***…src_memtbl�to�the�dest_memtbl,�set�the�MAPSTRA�and�MAPENDA�fields�ofF***…the�dest_memtbl�equal�to�the�start_of_part_ptr�and�end_of_part_ptr***…respectively,�and�return.***N****************************************************************************** 'ŠTTL„BUILDŽROM�MEMTBL�ENTRY�-�ALGORITHMŠPAGE#*build_rom_memtbl_entry: procedure;   ?*ˆif�(MAPMTYP�(previous�(dest_memtbl_ptr))�=�ROM_type)�then�do;*’if�(start_of_part_ptr�<'*œMAPENDA�(previous�(dest_memtbl_ptr)))é*’then�call�KILLER;*ˆend; *ˆelse�do;*’if�(start_of_part_ptr�<1*œENDAVAIL�(MAPFMLP�(previous�(dest_memtbl_ptr)))*’then�call�KILLER;*ˆend; '*ˆMAPMTYP.MAPPART�(dest_memtbl_ptr)�<==#*’MAPMTYP.MAPPART�(src_memtbl_ptr);3*ˆMAPSTRA�(dest_memtbl_ptr)�<==�start_of_part_ptr);0*ˆMAPENDA�(dest_memtbl_ptr)�<==�end_of_part_ptr;  *end build_rom_memtbl_entry; "ŠTTL„BUILD�ROM�MEMTBL�ENTRY�-�CODEŠPAGE#*build_rom_memtbl_entry: procedure;* BROMNODE: ?*ˆif�(MAPMTYP�(previous�(dest_memtbl_ptr))�=�ROM_type)�then�do;*’if�(start_of_part_ptr�<'*œMAPENDA�(previous�(dest_memtbl_ptr)))*’then�call�KILLER;*ˆend; +ŠIF.BƒMAPMTYP-MAPENTSZ(A1)��#$FF�THEN.S)ŠIF.LƒD4��MAPENDA-MAPENTSZ(A1)�THEN.S ŠBSR„KILLERŠENDI *ˆelse�do;*’if�(start_of_part_ptr�<1*œENDAVAIL�(MAPFMLP�(previous�(dest_memtbl_ptr)))*’then�call�KILLER;*ˆend; ŠELSE.SŠMOVE.L�MAPFMLP-MAPENTSZ(A1),A6!ŠIF.L�D4��ENDAVAIL(A6)�THEN.S ŠBSR„KILLERŠENDIŠENDI *'*ˆmapmtyp.mappart�(dest_memtbl_ptr)�<==#*’mapmtyp.mappart�(src_memtbl_ptr);2*ˆmapstra�(dest_memtbl_ptr)�<==�start_of_part_ptr;0*ˆmapenda�(dest_memtbl_ptr)�<==�end_of_part_ptr;*ŠMOVE.W�MAPMTYP(A0),MAPMTYP(A1) ŠMOVE.L�D4,MAPSTRA(A1) ŠMOVE.L�D5,MAPENDA(A1)**end build_rom_memtbl_entry;*ŠRTS  ŠEND éG é>1INIT ASYST'M68XXX INIT SA")S…SYSTEM INITIALIZERþ2pREADYHD pENDSYSP pASN pINITMMU pMEMTYPA pRDYHEAD pEEND pNSE pIOVCTBGN pTIAT pVCTUBGN pSDEFTYP pSEMLIST pTDEFTYP pLAM pUDEFTYP pPAGESIZE pTIME_LEF pMEMTYPS pCURR_ASN pMEMTYPT pTIMERST pMEMTYPU ÷2pLAST_MMU pCCBHD pASNTBL pTCBHD pINITIO pESTACK HKILLER œpGSTBEG pSMEMHI pTRCSIZ pMAPBEG pNOTLAM pGSTSIZ pSMEMLO pIOVSIZ pPATBEG pPANEL pPANELA pESTART pUDRBEG pCRASHSAV pPATSIZ ×2pSEMEND pUSTBEG pUDRSIZ pBKG_HEAD pUSTSIZ pDISPATCH pTRACFLAG pBKG_ACTI pEXCSTACK pTCBHEAD pTRACEBEG pENDMEMT pMIDNIGHT pBKG_TAIL pMACSTRC pMEMTABL pWHERLOAD pADEFTYP pTRCFLAG (BJ3€R  .|!ÀüAù(;,<(œˆ†ÿBaª.zA- Ú!Ï E!ø$ K"zA8 Ì!É 7gAú!ÈL3jH 3|€2<¿a�` !ü(; 7.x E":AM žg*&zA9 ˜$AIúAH ’ÙüAú‘ÊÑËCú!ÉI3 &Ú¹Ênú\�NÐ$zB9 ÿn $:BA ýüg< BpF3 N@`aŠ!È >a® ¼!UST1|1B ኂ„ü1B Eè!J |pI3 N@`aJ(x !È tahtÿ  Â0ÂEø(tÿ¹Úg‚AèµüfîB¸ $:B5 ýxg$I3 BpN@`a!È a* ¼!IOVáŠÔˆS‚!B!ü(; 6$:B< ýFft BpN@`aÒ!ÈI3€ 6aö ¼!PATáJ!B Eð CèIè(‰#|ÿÿÿÿ(ICéGéµËdè&zBB üú “DUMYF3 gGë`òGëa !L$La$Œ!üÿÿÿ !üÿÿÿ "B¸ I`2(h!TB”B¬)|ÿI3P ÿÿB¬ )KBl)|ÿÿÿþ9|øÿNuB¸ :$:B? üŒg& BpN@`a!È :a> ¼I3P !UDRáŠ]‚„ü 1BB¸ G$:B0 ü\g2 BpN@`aê!È GaEè ŠáŠQ‚„üÄüO3 TP ÔŠ!B1úBO ü* C!ü aB, üJ¸ +fœB¸ GúBH ü Cë <€pN@`ad4+;B,g Ùâ+x  !ÍI3€ EëpB�JjgR�EêQÈÿòGë(m6AIì p(ÛQÈÿü “!TCBg†aB& ûv.xI3„@ E2<ÀaD/:BB ûhNuHVMù(;,¯@î|MîHÖ?ÿ-_8-O<2<¢a`ø,áŽ,FÝÈF3@ B†-½ÈnúNu0<`0<�F虀2<é™"x 7Cé2�A02�2€@02€Nua&aI3 °‹fa†a†°�faÿ|Cí!É 1aÌazNuB€AúBL úʰPgaÿ^B‡EЇ Eê RO3  ÿÿfð‡#à�*(B(:B úœº„c*„ÿBKúû‹" B*AMúBH û�,Bœ�°ºBF úxf†H3 ` (<*ÿB*DB†º„baþöNu hÿÿ g2a8 ÿfaX`"aúJga.`aF°ŠF3 fCéÿö`aÂa`Æ3|ÿÿ Nu~Aè Cé ((„ÿB*(B*DB†º„baF3 þŠNu•ÊB�B‚BƒIÕKõhHz"?***‡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 2V :96ŠXDEFƒSBRYXMON‹Entry�point�from�EXMON�return�(REXMON).(ŠXDEFƒSBRYDLAY‹Entry�point�from�CKDELAY.&ŠXDEFƒSBRYACKŒEntry�point�from�AKRQST.)ŠXDEFƒSBRYSTRT‹Entry�point�from�TSTSTART.0ŠXDEFƒSBRYWAKE‹Entry�point�from�WAKEUP�and�WAIT.2ŠXDEFƒSBRYASRŒEntry�point�from�ASRINT�and�WTEVENT.+ŠXDEFƒSBRYGETŒEntry�point�from�ASQ�=�GT_EN.'ŠXDEFƒSBRYCINT‹Entry�point�from�COMINT. * *‚XREF's.*9ŠXREF.S�PREEMPT_FLAG‡SYSPAR�flag�which�signals�a�preempt.;ŠXREF.S�READYHDŒSYSPAR�pointer�to�head�entry�in�ready�list..ŠXREF.S�RUNNER�SYSPAR�pointer�to�running�task.   **‚Included�files:*8*‰UTILITY.MC�Macros�of�general�utility�(e.g.�PUSH,�POP).7*‰INTERRUP.MC�Macros�useful�in�dealing�with�interrupts.2*‰STR.EQ”Equates�for�supervisor�code�under�RMS68K.4*‰TCB.EQ”Equates�relating�to�the�Task�Control�Block.*ŠNOLISTŠINCLUDE�9995.&.UTILITY.MCŠINCLUDE�9995.&.INTERRUP.MCŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TCB.EQŠLIST  ŠSECTION�LEVEL00ŠOPT„BRSŠPAGE*J*‚These�are�the�specialized�entry�points�for�all�the�various�routines�thatL*‚want�to�put�a�task�on�the�ready�list,�but�want�to�fiddle�with�the�priority*‚first.* SBRYRELQ: 2ŠMOVEQI�$F0,D0�Set�the�run�priority�of�the�task�to>ŠAND.B‚TCBCPRI(A0),D0…the�current�priority�with�the�low�4�bits#ŠMOVE.B�D0,TCBRPRI(A0)…set�to�zero.6ŠBRA„SBREADYŒThen�just�go�to�the�normal�READY�routine.  SBRYEXT1: SBRYEXIR: SBRYXMON: SBRYDLAY:SBRYACK: SBRYSTRT: SBRYWAKE:SBRYASR:SBRYGET: SBRYCINT: CŠMOVE.J B�TCBCPRI(A0),TCBRPRI(A0)ƒReset�the�run�priority�for�the�task*§to�its�current�priority.  *,*…FALL�THROUGH�to�the�main�READY�routine!!!!*ŠPAGE*>*…NOTE�--�Other�routines�fall�into�this�routine�from�above!!!!* READY:SBREADY:  *(*‚See�if�he's�already�on�the�ready�list.* *ŠPUSHƒSR‘Save�the�SR�we�were�entered�with.9ŠDISABLE_INTERRUPTSˆDisable�interrupts�while�we�work�with*§the�volatile�TCB�chain.>ŠBSETƒ#TSK2NRDY,TCBSTAT2(A0)‚Set�the�bit�that�says�this�guy�is6ŠIF…�THENŠon�the�ready�list.‚If�he�wasn't�already,  *.*‚He's�not;�get�set�up�to�put�him�on�the�list.* +ŠSAVEƒD1/A2ŽSave�registers�we'll�blow�away.>ŠLEA„READYHD-TCBREADY,A2‚A2�<--�address�such�that�TCBREADY(A2)(*§refers�to�the�ready�list�head�pointer.@ŠMOVE.B�TCBRPRI(A0),D0…D0.B�<--�priority�of�task�to�put�on�list.  *>*‚Search�the�list�for�a�TCB�of�lower�priority�than�this�guy's.* ŠREPEAT <ŠMOVE.L�TCBREADY(A2),D1„D1�<--�ptr�to�next�TCB�in�the�chain.6ŠBEQ„ADD_HIMŒIf�we�hit�the�end�of�the�list,�just�exit. 4ŠEXG.L‚D1,A2ŽA2�<--�ptr�to�the�TCB�we're�looking�at.#*§D1�<--�ptr�to�TCB�just�before�it.BŠUNTIL.B�D0��TCBRPRI(A2)‚Keep�looping�until�we�find�a�TCB�with'*§a�priority�lower�than�our�guy�to�add. 5ŠEXG.L‚D1,A2ŽD1�<--�ptr�to�the�TCB�of�lower�priority.#*§A2�<--�ptr�to�TCB�just�before�it.ŠPAGE*M*‚Either�we�found�somebody�of�lower�priority�than�the�guy�we're�trying�to�addK*‚or�we�hit�the�end�of�the�chain.‚Either�way,�we�want�to�add�the�new�guy�to5*‚the�list�between�the�TCB's�pointed�to�by�A2�and�D1.* ADD_HIM:CŠMOVE.L�D1,TCBREADY(A0)„Set�our�forward�link�to�point�to�the�guy�we'*§found�to�be�of�lower�priority�(or�0).AŠMOVE.L�A0,TCBREADY(A2)„Set�forward�link�of�the�guy�we�want�to�be *§after�so�that�it�points�to�us.ŠMOVE.L‚RUNNER,A2ŠIF.B„D0��TCBRPRI(A2)�THENŠST†PREEMPT_FLAGŠENDI !ŠRESTORE�D1/A2�Restore�registers. ŠENDI 2ŠPOP„SR‘Restore�the�SR�we�saved�on�entry�&�return.ŠRTS—*    ŠENDééU1READY ASYST'M68XXX READY SA"4…M68xxx RMS TRAP 0 Put task on ready list.ê2pREADYHD BSBRYACK BSBRYEXIR pPREEMPT_ BSBRYCINT BSBRYASR BSBRYEXT1 BSBREADY BSBRYGET BSBRYRELQ BSBRYWAKE BSBRYSTRT  BSBRYXMON pRUNNER BREADY BSBRYDLAY "ZG3pðÀ($@&`h$&@ç|è-f6Hç@ Eø!ô(&"* g ʰ*&còÊ!A 3€%H $x °*&cPø LßFßNu4ééééJ éé B=/*=/*†M68XXX.RMS.AF=/*(=/* Chain file to assemble M68XXX.RMS.SA=/*:=/* If no output argument is specified for the listing the,=/* chain file will default to M68XXX.RMS.LS=/*=/IFC \1ƒ=ARG�M68XXX.RMS.LS=/ENDIF=/*+=ASM M68XXX.RMS.SA,M68XXX.RMS.RO,\1;MRZ=055=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.INTERRUP.MC=/*}=/*=ENDéééééé KŠPAGE**ˆINCLUDE�FILES**ˆINCLUDEƒ9995.&.STR.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆINCLUDEƒ9995.&.TCB.EQ*ˆINCLUDEƒ9995.&.BAB.EQ*ˆINCLUDEƒ9995.&.PAT.EQ*ˆINCLUDEƒ9995.&.INTERRUP.MC*ŠNOLISTŠINCLUDE�9995.&.STR.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.BAB.EQŠINCLUDE�9995.&.PAT.EQŠINCLUDE�9995.&.INTERRUP.MCŠ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�DISPATCHŠXREF.L�FLUSH_ALL_CACHEŠXREF.L�PROGINT9ŠXREF.S�PATBEGŠXREF.L�SCHED_DATEUP‰PAGE*,*ˆHere�to�start�up�RMS�after�initialization:*�Flush�the�cache,*�and�go�to�dispatch.* RMS: &ŠBSR„FLUSH_ALL_CACHE„Flush�all�caches. K*�Schedule�the�node�to�force�the�date�to�'rollover'�at�midnight.‚A�new�nodeF*ƒis�normally�scheduled�when�the�user�enters�the�time�and�date�throughH*ƒsession�control.‚If�the�system�has�a�battery�backed�timer,�however,�K itJ*ƒmay�happen�that�the�user�may�not�enter�the�date�and�time�but�depend�uponK*ƒit�being�picked�up�from�the�timer�itself.‚By�the�time�we�reach�this�code,B*ƒthe�system�initializer�has�all�ready�adjusted�NSE,�MIDNIGHT,�andH*ƒTIMELEFT�have�been�initialized�properly�to�reflect�the�system�time�andF*ƒthe�BIGDELTA�node�that�is�next�on�the�PAT�list.‚In�the�case�where�weD*ƒdon't�have�a�battery�backed�up�timer,�we�will�schedule�a�'garbage'G*ƒrollover�node�but�we�really�don't�care�since�it�will�be�cancelled�and?*ƒthe�correct�rollover�node�scheduled�when�the�time�is�manually *ƒentered.*K* We do not mask interrupts to schedule the new node because we are entered5*ƒfrom�the�system�initializer�with�interrupts�masked.*ŠBSR„SCHED_DATEUP ŠBRA„DISPATCH  **ˆJump�here�to�call�killer.*ŠXDEFƒCALLKILLŠXREF.L�KILLER CALLKILL: ŠJSR„KILLER‰PAGE*I* This is the exec routine scheduled originally by the system initializer TN ]/I*ƒthat�puts�a�dummy�node�with�a�large�delta�onto�the�end�of�the�PAT�list.D*ƒThis�insures�that�the�PAT�list�is�never�empty�which�simplifies�theB*ƒPAT�processing�in�many�areas.‚Note�that�we�do�not�go�through�theF*ƒnormal�schedule�node�routine�PAT_SCHED_NEW_NODE.‚We�couldn't�do�this/*ƒand�guarantee�the�large�delta�that�we�desire.*/ŠDC.Lƒ'DUMY'�Bit�pattern�that�INIT�searches�for$*£in�order�to�find�procedure�address* DUMY:ŠMOVE.L�PATBEG,A1 ŠDISABLE_INTERRUPTSˆMask 2ŠMOVE.L�PATFHDR(A1),A2…A2�points�to�free�PAT�entry ŠIF.L�A2��#0�THEN.S+�BSR�KILLER�Kill�system�of�no�free�PAT�nodeŠELSE.S@�MOVE.L�PATNEXT(A2),PATFHDR(A1)�Unlink�this�entry�from�free�list$�ENABLE_INTERRUPTS‰Unmask�interrupts*¦Initialize�PAT�entries�CLR.L‚PATNEXT(A2)$�CLR.L‚PATTCB(A2)‰Indicate�exec�node5�MOVE.L�#PATBIGDELTA,PATDELTA(A2)�Make�delta�very�big�CLR.L‚PATINTV(A2)3�LEA„DUMY(PC),A3ˆAddress�of�procedure�to�reschedule'�MOVE.L�A3,PATASR(A2)†Execution�address(�CLR.W‚PATOPT(A2)‰Options�-�not�periodic4�MOVE.L�#PATDUMMYID,PATARID(A2)�Plug�in�the�dummy�ID4�MOVE.W�#$FFFF-$0700,PATILVL(A2)�Interrupt�level�=�0#�DISABLE_INTERRUPTSˆMask�interrupts7�MOVE.L�PATHDR(A1),A3†A3�points�to�1st�node�on�PAT�list !�WHILE.L�PATNEXT(A3)��#0�DO.S*�LEA‚PATNEXT(A3),A3ƒFind�last�node�on�list�ENDW 7�MOVE.L�A2,PATNEXT(A3)„Link�this�entry�onto�end�of�listŠENDI%ŠENABLE_INTERRUPTS‰Unmask�and�lose�SR(ŠRTE—Back�to�PAT�scheduler�(we�really�go(*£back�to�a�background�routine�scheduled%*£by�TIMEINT.‚This�background�routine *£was�the�one�that�scheduled�us.ŠENDéI1RMS ASYST'M68XXX RMS SA"4Y…68xxx RMS INITIAL ENTRY POINTf2pPROGINT9 BRMS pKILLER pPATBEG pDISPATCH pSCHED_DA pFLUSH_AL BCALLKILL "€N3UaAþaAú`AöN¹(DUMY"x |$iµüfaAÔ`J#R|øÿB’Bª%|ÿD3ÿÿBª GúÿÊ%KBj%|ÿÿÿþ5|øÿ|&i “gGÓ`ô&Š|øÿNs4éK ééééé e'M68XXX SELFTESTAF z zbbSELFTESTSA ƒ ƒ1bbSELFTESTRO Œ ŒbbAKRQST RO • •bbASQALOC RO ž žbbASQEVENTRO § §bbASQFREE RO ° °bbASQGET RO ¹ ¹bbASQREAD RO  ÂbbASQSTATSRO Ë ËbbASRINT RO Ô ÔbbATSEM RO Ý ÝbbBKG RO æ æbbCDIR RO ï ïbbISR ROÿÿÿÿÿÿÿÿbb=/*=/*†M68XXX.SELFTEST.AF=/*-=/* Chain file to assemble M68XXX.SELFTEST.SA=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to M68XXX.SELFTEST.LS=/*=/IFC \1ƒ=ARG�M68XXX.SELFTEST.LS=/ENDIF=/*5=ASM M68XXX.SELFTEST.SA,M68XXX.SELFTEST.RO,\1;MRZ=040=/*{ Included files are:=/*ƒ9995.&.STR.EQ=/*}=/*=ENDééééL éé r‰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"5E…68xxx SYSTEM SELFTEST INTERRUPT HANDLER 2BSELFTEST pSLFTSTA7 ",--gGÿg­-g- ,gSs­-f­ ,Ss3I3@g³ gAóaBÿngl A g+l  g+l  g-B3 ,fAÕaBÿ6`Bÿ2 g í,`Bÿ" gØí ,`Bÿ4éééééé �d1ASQALOC ASREL'M68XXX ASQALOC SA"X(…68xxx DIRECTIVE--ALLOCATE ASQ 07/13/84m2pSBPAGAL pEXIT_SUB pERROR_06 pERROR_08 pERROR_12 pERROR_15 FASQALOC pADEFTYP pSBLOGPHY &ÖN3"J­@fAúB‚,gfAæB‡, g*,, m6aAÌ`Nq`AÄL3  fA¼B†&, $‚0¶‚l&ƒÿà‹HC8 HC CaA’``AŒ ¼!ASQ!lF3!F Gè,!K!K!K 1G(áŠÔˆX‡”‡!BBƒ,481B&;01B3$Bh*+H@`Bÿ4 4M éééééé –b1ASQEVENT ASREL'M68XXX ASQEVENTSA"%(…68xxx DIRECTIVE--QUEUE EVENT 07/13/84™2FASQEVENT pSBRYGET pEXIT_SUB pDISP_ASR pKILLER pERROR_04 pERROR_05 pERROR_12 pERROR_14 pERROR_16 pREADY_AS pGTASQBUF pSBLOGPHY &üF3$L(m@ gb.)g@"j B€ cPr fY fP@R@€°l(b0N3@@ç|4,$6{ (Nû°$z,* n6aA¢`Nq`Aš"F`ª`A’`AŽ0000<aBþÂR3 (``ÿv9B$Fßa