X7$ ?BOOT-U-No boot on volume ߋtv\Xe%P%,%A%SRT11A DECRT11A V۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶mx`"vx`"[x`"_x`"vQ>}Ԁ}'}'4}''}' }'}%}v\}'}'}' }' }d}d9g&tzą^%pkQ%kQ%`^%`3kQ%m+`^m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m  @ƎMICROVMS MICROVMS13 SYSTEM DECFILE11B  %Yf~ MICROVMS.V [SYS0.SYSLIB]SMGSHR.EXE;11 MICROVMS.NBACKUP/VERIFY _DUB0: _DUA1:[000000]MICROVMS/SAVESET/IMAGE/INTERCHANGE/NOREWIND SYSTEM @ƎY4.4 _::  _DUA1: V4.4 ~   |(FBa&fe@BJ%@& fEA  w J&Z hDxDzpD|D~x_ ^_ h_ ޜ_ 6_ _ ܝ_ &_ p_ _ ҟ_ _  _  n_  _  _  _ _ _ d_ _ H_ _ F_ x_ _ _ _ :_ _ "_ $F_ $_ $_ *F||| 1164 122316 131 10514157553=6120212223?63242526-4527312829$36,44 32!33"34%37&38'39(40)41#3530*42.46+43149/47048@64A65B66C673514522500v Da       B A @  A @  @ 7%   D%"& N % Be %e B A @ N B    m B A @ m A @ m@ m00         C B A D 6 ve\          B A @  A @  @ 0 B A @      @effff & & & &De*&f    & N & QR  v  6    66 6 6 6 "v     1 %6 6 6 6 ?     |6  l6  \6  L e%v 6 6 6  D v v v 6e\  B A @ -  - --     effff & & & &Be*&f f &  6    6 v %w     6        e B A @  B A @ *%%B    C B A @  6 ve\      mB A @ E mA @ E m@ E m E      m@ E m E    &    C 5UA B C C  \ &    \B`  ?huj  "&=f&  b' 5  L F5& b?   &!+7(??E&?&E" &P!ۃe" stsuvxF3l3 # s ! b 5 #>"e!ePe"Pj3h3|3z  U $ F &  fW  u"\?Err 59 USR not locked?Err 62 FORTRAN start failr&Lf&AE=@ lB`)  rrwʊ@ҋed ^H R X΋ + +(= C wFP <z|  [ <? DW=W?m A @ @)M鈇& e:   낃 (   3 E`E& N U%@"w?Err 60 stack overflowed ABCDEFGHIJKLMNOPQRSTUVWXYZ$. 0123456789fromin routine "" line ?Err (PC=U\N E\N MEP\ ' ' \\%&&Af&  e\f&: 35w6ȋwR -`Y5  /5,4( 54- jpthp&朢d j3 & B  5@a3 s 5@55& &e& w 6 @ 3@3 r3 p3!  #p   3 3?& & & & b9e*e,& & & && & & && & & && & & &  CR$ $$ "` \ `C \ f B % % e@ ( B`  ` A@^   A ^”E eBCIE `-    D E A@D D e0bb %- ҕ* V  ɥFɥT Kѥ K Е ȕT‹ȕFK\\PH\PP& P   \%\e&&&&\  \\5@5&E! !5 m5 ҕ   mU j&j&e j6d  j D6gV`b Xw b63p\53r\5p5r @ 3@œ r@E |dt&6ej53 Dt~ J5t~3 r3 p3 X 3\w %c m4@ ы@ e"     , ;3  ,FF3 F V  {` `3 V3 Tl ,FFBFF R w  3oAsk F g  @  X[ `X DTB ;  J  @ B   D \$w V- D  ׬RDD r33 V3  b33 F  `P B3 \ b@  VEx H3I \sJ *sL% sN DL׬I( R%RNN @ 3`"  ,    h2 JœH @ & %NR W w l  %D C& & EF   x(1w (¥Ef (1w DR%% $J J N ꇁ   Е `CBД w SD @` 6<p\  `\ `\e\e\e\e\e\e\g\g\g\\%\%\%\%\%\'\'\'\&\\&\\\\&\\\&\\\& \ \ \\\\ \ \& \ \ \& \&e\ b\b\b\b\&%\ "\"\"\"\&\ \&\\\ \\&\ \\\\\\\\\\\\\&\\&\\\&\\\\ \\\\\ \& \\\\\֋\܋\\ȋ\fffD j(!H`"w`H`"w`%\AH`"w(H`"w(%\A  "w "w "w \j&Tj&^&f-  f&- ե W(k3 "3 $3 (3 &  @ Z@0#9 0 ` `P &azE (8 #Eq$3 (# S!!!!#!+!9!L! !oU& " &ec9`3 " &[ "V y t $ $,$?R d $\   D O :f II  d x@  -$')(/.,: & 0 " &W W0W9e ( & " ݁U ; , ‡:ddddn::: ~"$&43 ( j "3((3 "3 (W   @ " .@ v "5  &  "  >+ %tw&4 4-45@E4   <%&vC j5EUe  & 4-/ . %& &v    E5@ߋ*3 p5Up3 rw@f&&$  J"Kv v&f& ) D\ &&&+J) f3! ,f$ f nH5$ &STOP --  %(t&& fAP  t\ %(t \\ \ \ \ l(& eN t RD \RD ^ & e\& ew&& e\& e\&&&e\e&\&g\g&\&e\&e\&&&g\&g\&&4LPFVx^^^^ԜL @@@ @Ћ @7 8RK ʓ ̓X0D761hNCB9: Op O,p O>,p O!,p O/,p O<-p O\,p ON-p OL,p O ,p O )p O 2-p O )p O<,p O,,p O2-p O,p O2-p O+,p O-,p O(,p O@,p O.,p O0 p O9 x ,p O p O t `-7TpK9TKTKHp O"T*B9: OTO@: p*7)!z+~xTz(>OdOO!p*`(QQXO.O*dOO`O xXOV(y O\(Oy TQTQ>ATQTQ8>O(ORv`(O}{ O\(O}{ \(xyTQTQrB6Qƃ0+dQƃ6Qȃ@+dQȃp Of+`(Or gb+\(O q+p O p O t nx +xOx\(xy Ol OO8'O+TK*TQTQ>ATQTQ8>O(ORv\(O}{ "(O4st\(O g7Tv(TJ: `-,,<,L,\,`-l,,`-6(6(6(6(`Qd QLO2O,~OTOTQ(dQOOTOTQ(TK((x(-(7T~K9TKTKHTO@: -7)7Tv(1(TQTr(TQTt(;)7 :K7TK9TK9TLTLHTK9B9: Op O\1p O\1p O`. OX  Op OA p OZ t V1 OX Al.v..////V10V1V10V1V1V10V10$1V1V1,1V141V1V1\1TQTQ8>O`(O}{ OTQTQ>A\(O}{ \(O g"(O4st(ORvpp O p O t nx .x\1T*L@: \1HP\1$TQTQ8>O`(O}{TOr  p O x V17T8L9TLTLH&(O4sP(̓@: \1`(O}{r /7$TQTQ>ATzTQTQrB\1TLp\17TBL9TnL9TLTLHTL9TL9B9: Op O\1p O\1p O`D0 OX  Op OF\0TLp\1p OAp0 n\1p OM0 n\1p OC0 o\1p OR0 o\1p OS0$p OO0 p\1p ONV1 p\1$$$: 1$!n1x1$$h$TL@: \1TLJ;7$7 BLHJITMTMHITL9dQO\(OQLO OLPTPXPOPTP2OOQ1dQOITM`9TM`9TMXPOPTPR;IpOdQPXPOPTPX PP PT P8:V(}{r 2dPOPQR26OQ2dQPX PO PT PXPPPTP3PO2OQ2$7 MP3 PP` PTP&; PPP`PhLPTMTP!>PPZ38'Pr3TM`9dPPA PTP`9$`PA LPTP`9Z37 BM` P`P8>(P`((P $P2(PQL&P`((P}{33B4B4THM`T&P&;$p $P- 4T&P&((P4sP(̓:$p $PR,4T&P&((P4sP(̓N:$T&P&((P4sP(̓9$ ((PR*PT&PT*P;: d4$p $PG p $Pg t 4p $PI4p $P*5p $P$N5p $P%5p $PE5p $P0 p $P9 x J6TJMT&PT*P;j6&PTLMT&PT*P;\(&P͓ j6`&P\*P5*PL&P8'&P$5p&PT&PT6M:2(PQd &PL4PT4P&;$TJMT&PT*P;X)2PN()͓L"P "P 5"P.!2Pp5j6\(2P͓ $j6TFMd&P6P6PT6P*P C8PT8P;\(&P͓ %\(&PΓ j68'*P5T&P&;$d&P@P` @PT@P&;T>M98'*P *PNM t >6*PL2PTJMT2P2$TBM9$ $PX 0LBPTBPT&PT*P;TΓ9$7 PVMTQTQHTQTQ3$7 (^MdQDPdQFP` FP`FP`(DPQL LFP8'FP6DP6DPQ6dDPQQ$7 fMdQHPdQJP` JP`JP`(HPQL LJP8'JP87HP8'HP7dHPQQ$7 nM`Q QX LQ6QQl7dQQ$7 hvM`Qd QLQ2Q7~Q$7 @~MTMTMH|ITMTMH|I$7 MTQTQ8>NP`(NP}{r  `(NPr g x  8\(NP qTQTQ>ATPPTLPTxTzx MP!MPL8TM8 LP(NPRPP\(NP}{ !nn8x!LP8\(NP}{ TzTQTQrB`(NPr E 8'PP x 8;6Qƃ8dQƃ6Qȃ8dQȃ!MP87$7 MXP XPQ tZP tZPQ t *9TM` ZPQXPL\P$\P7 M(>`P8'`PH9$`P7 vM!ʓ9`bP(>dP2dPn9$ bPLfPTfP$7 0M~jP`jPl(hP 9$2jP9TM``jPf(hP`9jP97 M~pP`pPl(lP 0:pPnP:$`pPf(lP`9pP9 nPd pPLrPTrP&;$7 M`tP(>zP vP~Pl zP~PT~P&;~|Plf(tPLxP !xP:$`xP`9xP!|PvP:$7 (M~PpPj(P :TM`PP:$`Pl(P :~P`Pf(P`9PP:7 MTM`9$7 MP8;$~PTM`9!PP<;$7 M`P<>PTNTPTΓ!`Pd'l*(PΓ TΓ9$7 @N`P<>P`P<>PT NTPTΓ!`PR'l*(PΓ $7 N PPP2P;$P P2Pc<2Pb< PP` PTP&;TN9`Ph LPT&NTP!>PdPP0 PTP`9dPP0 PTP`9$P PP` PTP&;TN9$P PP` PTP&;T"N9$P7 (N PP`Ph 0  PT4NTP!:0  PdPP$P7 6N~PP 2=XPPcB=XPPR=XPP'b=XPTP`PR;$7 b>NTJNTHNHTz9Tz(>xdxP !P= PP=TxTHNHB9: Pp PR@p P0@p Pb?p PZ@p P@@p P0@p P @p P d@p P =p P?p Pn@p P>p P @2PO@xP`xXP.P>dPP\(PyLP\(PxLP PPPPf!PP>\(xy PdxP\(PyLP`P`9PPP>|I=8'P> P$P8'x@TFNH`xXPPV?dPP\(PxLP\(PyLP PP`P`9PPPP6?xP>6xP@`xXPP?dPP\(PxLP\(PyLP PP`P`9PPPP?P>8'x@TJNTHNHpP`xXPP"@dPP\(PyLPP\(Py P`P`9PPP?pxdPP>8'x@x=6xP@x=px=dPx=dxP>TJ: @R@Z@@@0@@@@@8'P>;=\(Pz ~x P$P7 LN z`Pt=x P$P7 TN`P(:LQ~QN(yLPlf(PLP PPPPQQAT\Nt=x P$P7 ^N`Q`Q8>Q`(Q}{TQr  p Q x xA$&(Q4sL Q2 Q 6 Qʃ t ATfN`2̃ 6̃ʃ t AThN`\( Q̓(:L Q2 QATjN`~Q~QTQTQ8>Q&(Q4sXQ Q*B"(Q4s`Qd QPQȃAQƃAl Q̃d QQ\(Q̓LQ` Q QV(̓ QQQ̃PB$7 dlN`Q(:L$Q2$QBTtN`2̃ 6̃ʃ t BTvN``Q`Q8>"Q`̃ $Qʃ(Cd̃&Q&Q~(Qlf(QL Q`&Q (QP(̓ Q Q(Q$QB"("Q4sh̃$Q̃$("QRv"("Q4st\("Q}{  ̓$7 xNHITNTQ2TQ=TN9TQTQ8>.Q`(.Q}{CCCCTN`TN9,DTN9CTN9TQTQ3,DTN9&(.Q4sP(̓(>0Q20Q-DX-0QT0Q&(.Q4sP(̓9|ITNTNH!nVDTN9vD!olDTN9vDTN9TN`ʃd ̃L4QT4QR;`Qd QLQXQ`QX6Q.QDdQ2Q\(2QQL,Q ,QQ,Q2Q6QDTQTQHTQTQ3I!̓ETN8 ̓TNTNH$7 OTE:Q :Ql(8QT>Qr PEp >Q PE!>Q !/+-(@.09 Label: "ggNumber or Expression:xxOAuto-advance Blankcell Clearsheet Delete Edit Format Global Insert Load Print Replicate Save Version eXit AZAgClear Sheet: Editing: Format Auto-recalc Manual-recalc recalc-by-Columns recalc-by-RowsShape-of-spreadsheet Overflow-labels No-overflow-labels FAMCRSONExit: /d@O  \g$P AA\gP-RGgI*$%E09* $%ERR??/E_qDP%&$DP(&$HP%&rLP(&rLPLP_X#LPg?Bad expressionEt:#XP]9x}^P\gbP\gvhP\gxlP\gytP\gXqPT KPAyP \g:P(/@P(a""PERR00N/ADEP o;@P00 \g<P,P,vPP4MqQ4`"Qy[*Q (blank) (label) (number) (expression) ManRowCol?Not enough room in heap to store cellF:d!8Q :d@QAZAZ0909:d:TQ0909:dp^Q:_lQ[HD lQpQ[;H!xQ[0J!xQ[0K"xQ[7m`xQ[0mxQ[24;1H E|Q[ABCDOPQRS(I) (F. )Ox$5 ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggGfD @ C:  f#e&&&&\);@ ~(z 6~Fz <~~ & & & @e&&& ~ |O    G6Af& l>f&"yB ~ Z ~ ~ lz  fffD   a  \e\ \%6  \&&&&\\\ \@3eޘ@7Q@׋@êg{H& fDezr&&&&A  e35@e35@ z ~ ~ ~ ~ ~ ~ ~ ~ ~ Җ ~ e    CBf&&&&& B\\& \\zr1@\ r(7[?\ -?v9?uοMc?kA`5?I2f?(*@ A/fEA77B  e@ & & f& & ff& & f ~ ffff      \CEf&\& P\&W @ EE Em B @0 f % e\ e\\\&\\\\\6e*6 6 e*  e*&fU%f& )( $  " • 0f& * ev\@    7 x7T9TtTrHT,9B9: p Np Np `ș X  p -Dp $Dp %Dp *Dp GDp IDp RDp EDp 0 p 9 x Dp Wr;N !hTQTQ8:P( N qN7Td9Tt@: NTTxTz@G: HTxTzFE: H2 2( t H !\(QQ` ~N(QL` Q66QQ4dQQ61NC$;7$7 nv~~TT8>`(}{r &(4sLTTTT΃: ޛ`(r E 8' t ޛ; (R\(R6Q 6Q t6Q t6Q t `d QLX`X.QpdQ\(QL ZTTHTT3!o6ƃv~6ȃv$6ȃv~6ƃv$7 !$NC6QtTQdQT$dQTTr$7 2QN;$Q6QQ^$`Qd QLQ2Q~~QD71$7 D6QQ;$Q6QQ$dQQD7n71$7 6QQ;$Q6QQ$dQQ661$7 2Q>;$Q6QQN$dQQ661$7 f7T9Tد@: ܞTTTxTzE: TxTzFE: TT$7$Tį8$7 އگ Q t $ Q t 2$ Q Q x h Q66 Q Q x  QD7n7 !61 Q Q7$7 ⯼ İ ǰ pp~̰ l( ưp ư` ưX  ưp ư p ư,p ư !ưܤp ư(p ư+Bp ư-jp ư*p ư/p ư^p ư)¡p ư@:p ư.ʢp ư0 p ư9 x ʢp ưA p ưZ x p ư=tp ư<p ư>ʣp ư&p ư!ʤ ǰ ǰ2\( \(/ !ǰZ Ȱ ɰT Ȱ ɰT!ǰ Ȱ ɰT Ȱ ɰT Ȱ ɰT Ȱ ɰT Ȱ ɰT8'ʤ`(TҰr p ҰT̰T``: ʤ¡T̰T``: ʤTʰTȰ`` : ʤ2\( Ȱ\(/ ǰ!ʰT̰T``: ʤ ǰ (p: `°``(: ʤ2(p° TаTΰ``E: ʤ2(pTаTΰ8:'R(p: T`° Ȱ ɰT ɰ l(TӰr =p Ӱ> ȰT ȰP ȰP ɰ l(r = ȰT ȰP Ȱ ɰT Ȱ ɰT2`(/ T̰T``: ʤ8'n`(/ɰƗn2\( Ȱ\(/ ɰp ɰnT̰T``: ʤTX̰ʤT̰`°$İ2T̰T``: ʤܤ2ʤ (p° İ$İ7  ְְְܰ ְl(԰Tr 0 p 9 x 8p .ְ ְl(԰Tr 0 p 9 x j`ְְܰܰ ְXl(԰Tr E p e tp d t r(԰ D ְl(԰r Dpְ ְl(԰Tr + p - t $ְ ְl(԰Tr 0 p 9 t ְ ְl(԰Tr 0 p 9 x H`ذ ְްl ܰްTް`ܰf(԰:  ڰ$ڰtذ ڰ$ڰ7 "F`갾<>`T`!`R'l $ $7 N 2j`(T"r  x j ""x|̧DRpШ0V|ȩ6Z~ƪЪ"Rtȫ쫪j2j(h (h (p~ 2j(h (h (pz 2j(h (h (p 2j(h (h (p 2j(h (h (p☖2j2j(p (pX2j (h (p~HZ2j (h (p~HZ2j (h (p~HZ2j (h (p~HZ2j (h (p~HZ2j (h (p~HZ2j (p0'Z (h0'ZH2j (p0'H (h0'HZT TT``(: |jT TT``(: |jTT T``(: |j2j(p(pB䗖2j(p(pҗ䗖2j(p(p䗖2j(p(p•䗖2j(p(p䗖2j(p(pB䗖V|T^T|2j`  (p0'(p (x(p (2j (p0'D(pv(p@TT``: |jTT``: |j2j (p (x~(p (x2j (p (x~2j (p@  (p0'b (p (p @ TB䗦 (p@(pv $$2r(p`x $7 z`X (T*T(2*쬖(¬ &$&($& $ &$&7 yh,.2. 6$67 ypX< :>p@pB<8$E@ABCD !%    % e    @    B 7 6yx LT\TVTZTT`F`DG: ֭$L`F`DFE: $L Fl(Dr )$LF L NT`HT`JdTRdZXTXTR8>P`(P}{T^r  p ^ x ڮ(PR: ڮ!N (PRf`H`J Nڮ (PRfhXH®hH (PRfpXJڮpJX\>RV8$L'$ % * 0 thru 9 General IntegerRight Width - Error -$%*GIRE09WColumn width:Kq#EoWq 5K},.8^Goto cell position:?Bad Cell position_Xkf"K ,(+-*/^)@.09AZ=<>&!=>=b:dZ԰09.09EedDD+-0909o gfIA!hcYPs$=;Ps,,.""8QRD)b(D00.0 ) @@c@c ZXœ 3 r3 3&5 w 䅔X  `35@  j&~ "U   U j`5 @j&. U   U Z5    DRSҋ3 te \^ zD  sN$S sLls & V LL &E xlL z(w @Pѕ ѕ(s b ֹD,  J) s  ʋsN& &  LcN& &  Tw ȕ̕@   2e3d & 35 5  X3d X @E`se K  sW7s5rX5@EEW W 5@W U5W ÉX@@c@c LNbXœeNU 5E33 r3 &5 Vw ,X5@U@X5,Nɥ R  <& & & f@ |w ́eeX55@X5W U5@CW UU 56W UX5@5)  {w .ĉX5  ‰ U@ X5. 5@5@UX5  5UX 5UX5‰5X5X5ÉX5@5 & ( A t tX5ÉX5ÉXf&̋ƚTT 5 Eť1 ť+ť$ 3 Tť0 H̋  <̋s  Ş@{s @ s ツ̋% F4 m 54 w$j&,  E j&  U5@ 5 ̴&  n&SD   \ \% 0m UJ  \ D  3-^5 H4 E^ %\   ^  , w f  BB@Qijs^3\ \`D Da E j& 8    A pU@3 3&e &&& &&P0j&J = 5F:  6 0 l plpEEj&  ˁ  U5B&f 0 Dl0E&l&  V! ̋wR0 p  plpw@ "S 0D0,  `&l   E  dlʋDD V&l   E 4f ppNl /Uc 0, & T > ff& %N* +ABC    C΢   E3  e l ADEn % b %e ee e  (@7 hTTTTT!$TTTTTThTTTT TttTd'Tƃd'Tȃd'T̃d'TnF'ToF'lTttTQd'TQd'Trd'Ttd'TvF'TpF'TqF'lTtt~N(QL`F'ƃPl~~TT8>`(}{r  `(r g x ڠTttTd'Td'(RR'"(4sd'\(}{F'\(F'lȃlƃhTttTd'Td'T R'Td'T̫TΫlTtt~N(̓L`F'̃:lTTT7$TЫ8$T⫾8TTTT$7 :TĭTƭTTT!ĭơ$TTTTTΤTTTT TṰd'Tȭd'Tʭd'Tέd'TڭF'TۭF'l2̭ 2̭ x ڤ2ȭ 2ʭ t2έ t ڤ6ȭQ `ȭʭQ t6έʃ t 褾Hdȭƃdʭȃdέ̃ ڭn ۭo2̭8TTQd'TQd'Trd'Ttd'TvF'TpF'TqF'l2Q 2Q t2r t2t t ڤ6QQ `QQQ x `QdƃdȃLޭTޭ(:ƃLQ6QQldQQ`QdQLQ2QXQ6ƃQ 6ȃQ x dƃQdȃQ6rQ vx6tQ x ڣ~rdQt vT~ȭN(QL`F'ȭƃlTTȭd'Tʭd'TҭR'Ṱd'TڭF'TۭF'l8'ȭTʭTȭ8>Э(ЭRҭ"(Э4sh̭\(Э}{ ڭ\(Э ۭ T~ܭN(̓L­`­F'­ܭ̃lTTTP$T,8$T>8 T`8 HPT~8TTT$7  hLd d hLdl T譾f:Dd$~$7 D 7`ꭾ9T֬TԬHT֬@: ֥7$Tz(>H\(Hz =\(H{ DT֬TTzTBT>J8'J0T8$`TTجd( :d(TTҬd( .d( TTجd( ~L~Nlf(LF !F F t ¦`Lf( FLFN`Lf(  $7 ڬ7T⬾9TFTDHTF@: 67$~xTlTjThTfTxTzG: x~f~hdƃjdȃl~xTxTzFE: TbTdTPT`T!b$TDTDTPTdT@TȨT@TDTDT@TH ʓTBdhnppdfrXtntTtXvrvTv8:V(}{r >drprj6pfdfrXxnxTxXzrzTz3rpVTFnl ʓTFT@T@7$ ʓT8$ ʓT8$7 }J|@'|$~\(~} | 2~6$p~$8'~6~~ ~TXTTv~N(}L`F'~Nlp~$f&f&  e `e& e  XeB N"Q$B(< U& 8 u @ 3 & @  }PA&eW! '& f@! ! & etXw ow ow o' B   ` ׮PU ׮P׮P!U, U1 0 55  5 55 U U& @&&=¥6 &$5 , &@ #& 5ff@ & 5 EE 爄 Mxdxd zv@Save into file:g ?Cannot OPEN file?EOF or I/O error writing fileAYMLoad from file:?Cannot OPEN file?Data in file is in wrong format ?Saved spreadsheet is too big?EOF or I/O error reading fileRI;sଡ଼,&=?Bad filespec typed:. fZPRange for Print: Print into file: ?Bad range specified ?Cannot open file?EOF or I/O erroryu| <&N<ڗNԘBzڙp晰xx N7 ܒޭ7T歾9B9: p hp hp C p c t pp R p r t Ж;7$7T96Qƃh6ƃQdƃ \( QL\( QL ~ ` X.LTd T8>T.d T8>(R (R"(4s&(4sP\(}{`(}{ \(`(  ȃf! Q\(QQ ~ d TTQ8>(Rv"(4st\(}{ \( g ȃbƃ~ ~ d Td T8>`(}{r ~x~TTTTzTx&(4sP(̓: L6Q2TTTTz:\(y ` X0LT` X2LT>ATzT0T2rB ȃ ƃ66QQ–dQQ661$7T,96Qȃh6ȃQ~ dȃ d T` X4L T 8>d ""T"T48>(R (R"(4s&(4sP\(}{`(}{ \(`( f! Q ƃ~ TQd $$T$8>(Rv"(4st\(}{ \( g ƃȃ~ ~ d &&T&d ((T(8>`(}{r ʘ~x~TTTTzTx&(4sP(̓: 6QfTTTTz:,\(y ` X6L*T*` X8L,T,>ATzT6T8rB ȃ엌 ƃ藾1$T@8$7 ҍh7Tp9B9: @p @rp @rp @C p @c t zp @R p @r t ;7$7T96Qƃr~LdLPPTPTQ>ALȃ`ƃXvQdQN\(NQL<\(NQL> ><~L`LXxLRTRXTNTTT8>HTxdNVVTV8>J(HR (JR"(H4s&(J4sP\(H}{`(J}{ \(H`(J Lȃ<>Nv\(ƃQ ~LdLXXTXTƃ8>H(HRv"(H4st\(H}{ \(H gLȃp~N~LdLZZTZX\N\T\8>H`(H}{r Λ~x~BTFTDTBTzTx&(H4sP(̓: 6DQjDTFTDTBTz:0\(By `LXzL^T^T NX|L`T`>ATzTzT|rBLȃNƃ욾66QQdQQ661$7T96Qȃr~NTQXbNbTb>ANƃ&`ȃQ~NdȃdddQLdLffTfT NX~LhTh8>HdLjjTjT~8>J(HR (JR"(H4s&(J4sP\(H}{`(J}{ \(H`(J LdjNƃZ~NTȃXlNlTl8>H(HRv"(H4st\(H}{ \(H gNƃp~N~LdLnnTnXpNpTp8>H`(H}{r 6~x~BTFTDTBTzTx&(H4sP(̓: 6FQҝFTFTDTBTz:\(By `LXLrTrT NXLtTt>ATzTTrBLȃXNƃT1$7 rȮ7TЮ9T@: ȠTTTTTxTzG: TxTzFE: 7Tޮ9T@: ȠTTTTTxTzG: TxTzFE: ddTT8>`(}{r b&(4sP(̓2,6ƃdƃ6ȃdȃ7T9dd6ddTTTTx6d6dğpddTTTTx6`d6`d"ddTT8:(4sP(̓,|vp $T8Π7 $7 ``8:(4sLxpx`(x̓ \(y !ء XTx,' \(x̓T`x dxTTTxT΃E: \(̓ `: L`: LTTTTz:\(y`(̓ dx Tz``rB$7 7T&9TjThH~*T`9`l( p @p .p 0 p 9 x p A p Z xp a p z xt ڢ!$T`9`l(T± !±Ģ$`l(r (dT`9`l( p ` X  p A p Z xp 0 p 9 xt ࢾB9: p `j X  p A*p R`Xıf(v(ıTt *;BT`9`l( p 0 p 9 x p .!$p ep Ep dp D*7 lpȱȱ`ȱl(Ʊ L$`ȱXʱl(ƱX̱Tx,'6r(ʱƱT`̱x 67 Rt ڱб бl(α ܱ Աf(ұ ܱԱp ܱ@p ܱ.p ܱ0 p ܱ9 x p ܱA p ܱZ xp ܱa p ܱz xt Z!ܱ$ڱб бl(α ܱ Աf(ұ ܱԱ!ܱL$ڱp ܱ( бޱԱ`ر`ֱ`б`αE:  ڱ$ڱޱб Աf(ұ`ޱl(α ޱԱб бl(α ܱ Աf(ұ ܱԱp ܱ0 p ܱ9 x p ܱ.!ܱ $ڱp ܱep ܱEp ܱdp ܱDԱ7 2`hLTT豾!> ⱘf(`A   ⱘf(`A   hdLT`汾!>`h LTT챾!>8'豮8'걮* ⱘf(`0   ⱘf(`0   ⱘf(`0  $7 7T9B9: p x$p $p N p n t p A p a t Χ;$ v~rdQt$7Tޯ9T@: $TTxTz: TxTzFE: 7T9T@: F$TTxTz: TxTzFE:  vdrdt$7 D~p7T 9 T氾@: bTxTzFE: &TTxTz@G: jTxTzFE: j26Qr 7T"9 T氾@: bTxTzFE: TTxTz@G: jTxTzFE: j22~  t Ωdƃdȃ!`QdL6QdQ!`QdL2X6Q 6Q x b`Q6ƃ 6ȃ t 6r vx6t x ~rdt v6Q ~~`XQ L` L\(}{`(}{ \(`( "(4s&(4sP(R (Rƃȃdȃdƃ`XQ L` L\(}{`(}{ \(`( "(4s&(4sP(R (R.!.!dQdQ`ƃXd~` L\(}{ \( g"(4st(Rv`ȃXZd~` L\(}{ \( g"(4st(RvƃP$7$;$T:8$Tj8$T8$T8$7 (z  ` ` FE: ج$ Xl( Tr `r( X   l( Tr A p Z t .$ l( X A  Xl( Tr `vr( X   l( Tr A p Z t   X A ƭ$Qԭ$ $:$"insert-Column insert-Row CcRrInserting column...gInserting row... g?Too many columns or rows to do inserte":delete-Column delete-Row CcRrDeleting column... gDeleting row...gXqSource range:Destination range: Replicating... ?Bad range syntaxTq8^zQDAbsolute or Relative:@.09AZaz(AZ09AR09.eEdD} Ʊ9wWα@.09AZaz(09.eEdDAA000d wAdvance No-advance NnAaBeginning Column:Ending Column:xdNew number of columns: New number of rows:ggThe new spreadsheet would have too many columnsThe new spreadsheet would have too many rows The new spreadsheet would be too big The new spreadsheet would be too small:d$ AZAZ7 t ~ִд дl(δ p p p ((p ` X  p A p Z tp 0 p 9 tx ֲ$2$\(մ \д дl(δTr p p (($д~'ִLִV:$ ` Ҵ`(m Դ$7 ^s´ TTTT``G: $``FE: ȳ$ l(r )޳$ ttddTT8>`(}{Tr  p  x \(R: \ (R< P @@'T̴`$ $:d(δ (AZ09 ( )bSUM AVERAGE COUNT INT ABS EXP LN LOG10 SQRT PI NA IF NOT MAXR MINR MAX2 MIN2 ROUND ͥ @E|llA eH @ @H7 VtTp:TPtL T Tx$7 tTTH`9|I;$7 s7`9T9B9: p Y p y t $7 sִ~ƃ~ȃ~̃ n o Gq p~rdQt v~"N(QL "Q~"N(}{LN(L(4sL'RL  g t  "Q$7 r~Q~Q~Q~Q6D71$7 rTTFTTFTTFTTFTTFTTF$7 VrT `9T`9$y: $\g""&](Type a "Y" to confirmYyxGgy:Fw$|e$ X$<$7 tTⴾJT 9 xȲزT9T*9T89Tf9T9T9T9Tƴ9$7 s䴾7T촾9T9TzTxHT49TQ=TF9TQ=TP9TQ=Tf9TQ=Tv9$7 Ds|~~~~TT8:V(}{r 6Գd6dȃƃdƃdȃ$m?SHEET-F-Bad STRPTR in HPFREE HEAPFF is badNull string in heap--heap has been messed up Attempt to store a null string in the heap Bad cell typeString not ASCIZ Cannot repeat null Bad internal row/col numberZx SHEET version x3.1, Copyright (C) 1987 by Randall Meyers Current shape is cols by rows. Max cells is ; max cols is .w<*7 t (, *. x f$`*`(8>0`.`,8>2`.`,>A(2R (0R\(2`(0 \(2}{`(0}{ `(0}{ֲֲ"(24st$&(04sP(̓`.`,rB$`.`,`*`(`.`,$j!( 1.0 SHEET X3.0 INSTALLATION GUIDE AND RELEASE NOTES This file explains how to install SHEET version X3.0 and summarizes the changes to SHEET from version X2.1 to version X3.0. For more information on old and new features of SHEET, see the file SHEET.MAN. The most important new feature of SHEET X3.0 is the ability for the user to dynamicly change the shape of the spreadsheet upon command. At any point, a user may issue a command that changes the maximum number of columns and rows supported by SHEET. Version 3 of SHEET has a different format for saved spreadsheet files. However, version 3 of SHEET can read any saved spreadsheet (subject only to memory restrictions) written by version 1 or version 2 of SHEET. Previous versions of SHEET cannot read saved spreadsheet files written by version 3. This topic is discussed more fully in *********. 2.0 SHEET DISTRIBUTION KIT The following files are in the SHEET distribution kit: SHEET.DOC Installation Guide and Release Notes SHEET.MAN SHEET User Manual SHEET.100 .SAV file for a VT100 SHEET.62 .SAV file for a VT62 SHEET.52 .SAV file for a VT52 Since the version 3 of SHEET allows the user to select the maximum number of rows and columns allowed in a spreadsheet, the separate wide and narrow configurations of SHEET made available in version 2 of SHEET are no longer needed. Version 3 of SHEET has specific support of VT52 terminals. Previously, VT52 owners used the VT62 configuration of SHEET. The VT62 configuration of SHEET depended on the reverse video capabilities of the VT62 to indicate the current cell in the spreadsheet. Since the VT52 does not have reverse video, the results were somewhat unsatisfactory on that model of terminal. A suggestion was made when version x2.1 was distributed to provide a configuration of SHEET specificly for VT52 terminals. This was done, and SHEET x3.0 continues that support. The VT52 configuration positions the cursor to the rightmost character position of the current cell rather than displaying the current cell in reverse video as do the VT62 and VT100 configurations. Page 2 3.0 INSTALLING SHEET To install SHEET, select the file that supports the type of terminal that you will be using. Then copy that file to either SY: or DK:, and then rename it to be "SHEET.SAV". If you wish to use the CTRL/F and CTRL/B commands to SHEET and you are using the foreground/background RT monitor, then you should give the command "SET TT NO FB" before running SHEET. You may want to put this command in your STARTF.COM file so that its effect will be permanent. SHEET is a very big program. In order to run it, the foreground job and most device handlers may need to be unloaded. If this is not done, SHEET may fail to start, or the commands which do file I/O may fail. (This last is most dangerous because you may have spent an hour typing in a spreadsheet before you discover that you can not save your work!) You may want to try a load or save command right after starting SHEET to make sure that there is sufficient memory to load, save, and print your work later. Depending on your system configuration and number of device handlers loaded, you may be able to use SHEET with the RT SPOOL/SP transparent spooling package loaded. PRO users will find that they will need to use the VBGEXE utility shipped with RT-11 in order to run SHEET. See the RT documentation for how to use VBGEXE to run a program. 4.0 NEW FEATURES 4.1 New Functions The following five new functions have been defined: @MAXR() Maximum of all the cells in the specified range. @MAX2(, ) Maximum of the two expressions. @MINR() Minimum of all the cells in the specified range. @MIN2(, ) Minimum of the two expressions. @ROUND(, ) Round the first expression to be a multiple of the second expression. Note that the @ROUND function rounds away from zero. For example, @ROUND(1.5, 1) is 2 and @ROUND(-1.5, 1) is -2. Page 3 4.2 New Cell Name Syntax The format of a cell name has been changed: == | == | | In other words, the column part of a cell name can be one or two letters long, and the row part can be up to three digits long. The column after column Z is column AA. After column AA follow the columns AB through AZ. After column AZ is column BA, and so on. Thus, SHEET has the potential to allow up to 702 columns and up to 999 rows to be in a spreadsheet. Although, practical limitations prevent a spreadsheet from ever being that big (those limitations will be discussed in the next section). Note that SHEET will signal a syntax error if the name of a cell is used that does not exist in the current spreadsheet. For example, if the cell name A100 is used when the current shape of the spreadsheet only has 99 rows, SHEET will signal an error. 4.3 The New /GS (Global Shape) Command The /GS command now allows you to change the maximum number of columns and rows that are allowed in a spreadsheet. This command may be used freely at any point during the developement or use of a spreadsheet. None of the cells in the spreadsheet are affected in any way; the only difference in the spreadsheet is that the maximum allowed number of columns and the maximum number of rows is set to the values given by the user. The command will first prompt you for the new maximum number of columns in the spreadsheet and then it will prompt you for the new maximum number of rows in the spreadsheet. When it prompts for either of these two parameters you may do two things: You may type an integer number to be used as the value, or you may just press return to request that SHEET calculate the value requested. If you request that SHEET calculate the number of columns or the number of rows, it will calculate the requested value on the basis of the value of the other parameter and the maximum number of cells that this configuration of SHEET can handle. If you request that SHEET calculate both the number of columns and the number of rows, SHEET will set the number of columns to the maximum column currently used in the spreadsheet and the number of rows to the maximum row currently used in the spreadsheet. Page 4 SHEET will not allow you to make the spreadsheet so small that a non-blank cell would be excluded from the spreadsheet 4.4 Change To The /V (Version) Command The /V command now indicates maximum size and shape of the spreadsheet supported by the copy of SHEET that is being used. 4.5 The New /GO (Overflow-labels) And /GN (No-overflow-labels) Commands 4.6 Change To The /C (Clearsheet) Command Now clears default format, string overflow, atoadv. 4.7 Change To The /S (Save) And /L (Load) Commands Now sets default format, string overflow, atoadv. 4.8 New And Changed Command Characters The following new command character has been defined: Character Description --------- --------------------------------------------------- CTRL/E Move to the logical end column of the current row. The following new command characters have been defined: Character Description --------- --------------------------------------------------- CTRL/A Move to the logical first column of the current row. Tab Move to the logical next cell. The logical first column in a row is column A if autoadvance mode is off; if auto advance mode is on, then the logical start column is the beginning column of the autoadvance region. The logical last column in a row is the last column in the spreadsheet if autoadvance mode is off; if auto advance mode is on, then the logical last column is the ending column of the autoadvance region. The logical next column is the column to the right of the present column (or the column A of the next row if the present column is the rightmost column in a row) if autoadvance mode is off. If autoadvance Page 5 mode is on, then the logical next column is the next column that autoadvance mode will autoadvance to. 4.9 New Error Format The new error format (it also rings the bell). 4.10 Revised User Manual SHEET.MAN has been revised to reflect the new features of SHEET version X3.0. Also, the section describing range specifiers now explains about single cell ranges. 5.0 COMPATIBILITY WITH SAVED SPREADSHEET FILES 6.0 BUGS FIXED No bugs were reported in version 2. 7.0 KNOWN BUGS IN VERSION X3.0 None. 1.0 SHEET X2.1 INSTALLATION GUIDE AND RELEASE NOTES This file explains how to install SHEET version x2.1 and summarizes the changes to SHEET from version x1.0 to version x2.1. For more information on old and new features of SHEET, see the file SHEET.MAN. There has been no change to the format of saved spreadsheet files: Any past or present version of SHEET can read any .SHE files produced by any other version of SHEET. However, different versions and configurations of SHEET support different maximum sizes of spreadsheets. If an attempt is made to read a spreadsheet that is to big for whatever version of SHEET that is being used, an error message will be given and SHEET will refuse to read the file. 2.0 SHEET DISTRIBUTION KIT The following files are in the SHEET distribution kit: SHEET.DOC Installation Guide and Release Notes SHEET.MAN SHEET User Manual NARROW.100 SHEET for a VT100 that supports a spreadsheet of 10 columns by 117 rows NARROW.62 SHEET for a VT62 or VT52 that supports a spreadsheet of 10 columns by 117 rows WIDE.100 SHEET for a VT100 that supports a spreadsheet of 24 columns by 59 rows WIDE.62 SHEET for a VT62 or VT52 that supports a spreadsheet of 24 columns by 59 rows Version 1 of SHEET only supported one maximum size and shape of spreadsheet, 26 columns by 60 rows. Version 2 supports two different maximum sizes and shapes of spreadsheet. The files WIDE.100 and WIDE.62 most closely correspond to the old size and shape of the version 1 spreadsheet. The size of the wide spreadsheet is slightly smaller than the version 1 spreadsheet because of an increase code size to support new features and an increase in heap size to allow more expressions to be stored. The files NARROW.100 and NARROW.62 support a spreadsheet with a larger number of rows and larger heap size; this makes them better suited than the wide SHEET for such applications as tax forms. The wide configuration of SHEET is a very big program. In order to run it, the foreground job and most device handlers should be unloaded. If this is not done, SHEET may fail to start, or the commands which do file I/O may fail. (This last is most dangerous because you may have spent an hour typing in a spreadsheet before you discover that you can not save your work!) You may want to try a load or save command right after starting SHEET to make sure that there is sufficient memory for load, save, and print to work later. The narrow configuration of SHEET needs less memory than the wide configuration. (I have been able to use it with the RT v5.1 SPOOL/SP transparent spooling package loaded.) But, the same cautions about the Page 2 number of device handlers and the size of the foreground job still apply. To install SHEET, select the file that supports the type of terminal that you will be using and that supports the maximum size and shape of spreadsheet that you want. Then copy that file to either SY: or DK:, and then rename it to be "SHEET.SAV". If you wish to use the new CTRL/F and CTRL/B commands to SHEET and you are using the foreground/background RT monitor, then you should give the command "SET TT NO FB" before running SHEET. You may want to put this command in your STARTF.COM file so that its effect will be permanent. 3.0 NEW FEATURES 3.1 New Operators And Functions The following new operators have been defined: Operator Description -------- -------------------------------------- = Test for "is equal to" <> Test for "is not equal to" < Test for "is less than" <= Test for "is less than or equal to" > Test for "is greater than" >= Test for "is greater than or equal to" & Logical AND ! Logical OR The two new functions have been defined: @NOT() Logical NOT of expression. @IF(, , ) Return the second expression (the THEN expression) if the first expression is true. Return the third expression (the ELSE expression) if the first expression is false. 3.2 Change To /GF (Global Format) Command There has been no change to the /GFW (set the width of all columns) command, but all other /GF commands have changed meaning. Previously, these commands would set the format of every cell in the spreadsheet to the new value. Now, these commands set a default format. Previously, all cells in the spreadsheet started out with a format of "G". Now, all cells in the spreadsheet start out without a format, Page 3 and the default format is set to "G". If a value is typed into a blank cell and the blank cell does not have a format, SHEET will set the cell's format to the current default format. (Since the cell's format is actually set, changing the default format after the cell's value is typed in does not affect the cell's format.) 3.3 Change To /P (Print) Command If you wish to /Print the entire spreadsheet, you need not specify a range to be printed. If you type a carriage return to the prompt for the range, then the entire spreadsheet will be printed. 3.4 Change To /V (Version) Command The /V command now indicates maximum size and shape of the spreadsheet supported by the copy of SHEET that is being used. 3.5 New Command Characters The following new command characters have been defined: Character Description --------- ----------------------------------------- CTRL/L Redraw the screen. Tab Move to cell in the next column. CTRL/P Move to cell on the preceding row CTRL/N Move to cell on the next row CTRL/B Move to cell in the preceding column CTRL/F Move to cell in the next column. PF2 Move to the previous screenfull of the spreadsheet. PF3 Move to the next screenfull of the spreadsheet. CTRL/V Move to the next screenfull of the spreadsheet. CTRL/A Move to the cell in column A of the current row. The VT100 function key PF2 is the red function key on the VT52 and the "BACK FIELD" function key on a VT62. The VT100 function key PF3 is the black function key on the VT52 and the "FORWD FIELD" function key on the VT62. Many of the new command characters are control character synonyms for special function key commands. The control characters are for those people who dislike moving their hand from the typing region to the keypad. Page 4 3.6 New Editing Characters The following new editing characters may be used during value typein or editing: Character Description --------- ----------------------------------------- CTRL/K Delete the text right of the cursor CTRL/A Go to beginning of line CTRL/E Go to end of line CTRL/F Go right one character CTRL/B Go left one character 3.7 Revised User Manual SHEET.MAN (formerly called SHEET.MEM with version 1 of SHEET) has been revised to reflect the new features of SHEET version X2.1. Also, the section describing range specifiers now explains about single cell ranges. 4.0 BUGS FIXED 4.1 @INT() In the previous version of SHEET, @INT was limited to the precision of a single precision variable. SHEET now uses an improved version of @INT that is as precise as a double precision variable. 4.2 Heap Deallocation Bug In the previous version of SHEET, the /DR (delete row) command would fail to free all of the heap space used by the row that was deleted. (SHEET would only deallocate the heap used by cells A to the cursor cell in the line.) This has been fixed. 4.3 Used Col/Used Row The previous version of SHEET would sometimes have values for last used column and last used row in the spreadsheet that were larger than the true size of the spreadsheet. This could happen because SHEET did realize that commands like /B (blankcell) or /R (replicate) could cause the spread sheet to shrink dramatically, or that the commands /DR (delete row) and /DC (delete column) could cause the spreadsheet to shrink by more than one row or column. This bug only effected attempts to insert a new row or column. The bug could be seen by: Page 5 Start with a clean spreadsheet Go to the last cell position Type in a label Give a /B command to blank the cell containing the label Go to cell A1 Type in a label Give /IR to insert a new row At this point, SHEET would complain that there were too many rows or columns to allow the insert. The reason was that SHEET still thought that the last cell in the spreadsheet was used. 5.0 KNOWN BUGS IN VERSION X2.1 5.1 @SUM/@AVERAGE/@COUNT The functions @SUM, @AVERAGE, and @COUNT quietly ignore any cells whose value is in unavailable (the cell is in error, is N/A, or is DEP). The functions treat these cells as if they were labels. For example, if cells A1 and A2 are N/A and A3 and A4 are 2, then: @COUNT(A1:A4) is 2 @SUM(A1:A4) is 4 @AVERAGE(A1:A4) is 2 Normally, any expression will have the value "DEP" if it references a cell whose value is unavailable, and these functions do not do that. This "bug" is unlikely to be fixed: I like the way it works now. 1.0 SHEET X2.1, A SPREADSHEET PROGRAM SHEET is a spreadsheet program modeled after VISICALC and SUPERCALC. SHEET requires no special hardware, and has almost all of the features of its more famous counterparts. Features: No special PDP-11 hardware required. Version available for VT62 (or VT52) or VT100. All calculations done in double precision. Very fast: Overlay scheme keeps most of program memory resident most of time. Full function spreadsheet: INSERT, DELETE, PRINT, REPLICATE. Most math functions available. Real expression syntax with operator precedence. Logical expressions complete with an IF-THEN-ELSE. Similar to VISICALC in most respects. Extensive prompting. Disadvantages: Memory pig: requires 24K+ words. The maximum size and shape of the largest spreadsheet that SHEET can handle is set when it is built. Sources not (yet) available. 2.0 BASICS The spreadsheet is made up of cells in a rectangular array. The columns in the array are identified by letters, and the rows in the array are identified by numbers. Each cell in the spreadsheet has a unique name that is derived from its column and row position. The cell that is in column A and row 5 is named A5. The maximum size of the spreadsheet that SHEET can handle is set when SHEET is built. Typical sizes of spreadsheets that can be handled by SHEET are 10 columns by 117 rows or 24 columns by 59 rows. (The /V command, described below, will tell you the maximum size of the spreadsheet Page 2 handled by your copy of SHEET.) There are four types of cells: 1. Blank: These cells provide whitespace in the spreadsheet. Initially all cells in the spreadsheet are blank. 2. Label: These cells contain a string. They are used as titles and labels in the spreadsheet. 3. Number: These cells contain a number. Their values are used by expressions stored in other cells. 4. Expression: These cells contain an expression to be evaluated when the value of a cell changes. Both cells of type number and expression get their value the same way: you type an expression as their value. The only difference is that if the expression has a constant value (does not contain any references to cells in the spreadsheet) then it is only evaluated once, and only the value, not the expression is stored. If the value of a cell of type blank or label is used as in an expression, then a value of zero is used in most cases. The exceptions are the @SUM, @AVERAGE, and @COUNT functions, which merely ignore the reference to the cell. 3.0 EXPRESSIONS Expressions handled by SHEET are similar to expressions in many programming languages: == | ! == | & == | = | "<>" | "<" | "<=" | ">" | ">=" == | + | - == | * | / Page 3 == | ^ == - | + | | ( ) | | == @ABS( ) | @AVERAGE( ) | @COUNT( ) | @EXP( ) | @INT( ) | @LN( ) | @LOG10( ) | @NA() | @NOT( ) | @PI() | @SQRT( ) | @SUM( ) | @IF( , , ) == | : == == == . | . | == E | E + | E - | D | D + | D - | In other words, the following operators are available: OPERATOR FUNCTION PRECEDENCE ASSOCIATIVITY -------- ---------- ---------- ------------- () Grouping 8 - unary minus 7 + unary plus 7 ^ exponentiation 6 left-to-right * multiply 5 right-to-left Page 4 / division 5 right-to-left + addition 4 right-to-left - subtraction 4 right-to-left = test for = 3 right-to-left <> test for not = 3 right-to-left < test for less 3 right-to-left <= less or equal 3 right-to-left > greater than 3 right-to-left >= greater or equal 3 right-to-left & logical AND 2 right-to-left ! logical OR 1 right-to-left The logical operators (&, !, @NOT()) consider zero to be false and non-zero to be true. The logical and relational (=, <>, <, <=, >, >=) operators return the value 0 for a false result and 1 for a true result. Some examples: Expression Result ---------------------- ------ @NOT(0) 1 @NOT(1) 0 @NOT(-1E-25) 0 1 & 2 1 0 ! -1 1 5-4 < 2 1 1 < 2 & 5 > 4 1 Note that the @AVERAGE, @COUNT, and @SUM functions take a range as their argument. These functions operate on all the cells in the rectangular array specified by the two end points of the range. The first cell in a range specifier gives the upper left corner of the rectangle, and the second cell in the range specifier gives the lower right corner of the rectangle. Thus, @SUM(A1:B3) sums the cells A1, A2, A3, B1, B2, and B3. A degenerate case of a rectangle can be a row or column: for example, @AVERAGE(A1:A5) averages the cells A1, A2, A3, A4, and A5. An even more degenerate case of a range is a single point: If both endpoints of a range are the same, then the range references a single cell. In that case, the colon and the second cell reference may be left off. For example, @COUNT(A1:A1) is the same as @COUNT(A1). The following functions are available: @ABS() Take the absolute value of the expression. @AVERAGE() Take the average of the specified range. This function ignores blank and label cells in the range. @COUNT() Return the number of expressions and numbers Page 5 in the specified range. @EXP() Raise e to a power. @IF(, , ) Return the second expression (the THEN expression) if the first expression is true. Return the third expression (the ELSE expression) if the first expression is false. @INT() Throw away the fractional part of a number. @LN() Take the natural logarithm. @LOG10() Take the base 10 logarithm. @NA() Cause the cell's value to be displayed as N/A. The @NA() function is used as a prompt: in general purpose spreadsheets, cells marked N/A are to be filled in by the user of the spreadsheet. @NOT() Logical NOT of expression. Returns 0 if the expression is non-zero and 1 if the expression is zero. @PI() Returns the value of pi. @SQRT() Take the square root of a number. @SUM() Sum all the elements of the indicated range. 4.0 OPERATION See the file SHEET.DOC for information on installing SHEET on your system. That file will help you pick the copy of SHEET that supports your type of terminal and that supports the size and shape of spreadsheet most suited for your needs. SHEET is a very big program. If you choose the copy of SHEET that supports the largest spreadsheet, you may find the foreground job and most device handlers should be unloaded. If this is not done, SHEET may fail to start, or the commands which do file I/O may fail. (This last is most dangerous because you may have spent an hour typing in a spreadsheet before you discover that you can not save your work!) You may want to try a load or save command right after starting SHEET to make sure that there is sufficient memory for load, save, and print to work later. SHEET has a heap that it uses to store labels and expressions. If this heap becomes full, SHEET will not allow any new expressions or labels to be stored until space in the heap is freed. Space in the heap is freed anytime the length of a label or expression is changed Page 6 to be smaller (i.e., when the cell is blanked, the cell is edited, or a new string is typed in, etc.). SHEET uses the top three lines of the terminal screen to provide feedback on the state of the spreadsheet. Line one displays the current cell address, the cell's type, and the cell's contents. The far right of line one tells you the recalculation order and the number of characters of heap remaining. Line two is used for prompts and for error messages. Line three is sometimes used for prompts, but usually this line is used as an echo area when expressions, numbers, filespecs, and the like are typed in. SHEET starts is a state where it is waiting for the user to type a command or a new value for a cell. SHEET decides if the input is a command, a label to be stored in the current cell, or an expression to be stored in the cell on the basis of the first character typed: The following printing characters signal the start of a command (see the next section): / " ! > The following characters signal the start of an expression (or number): 0 1 2 3 4 5 6 7 8 9 + - ( @ . Any other printing character signals the start of a label. The next section will discuss commands in detail. Value type in will be discussed now. When SHEET was determined that a label or expression is being typed in, it will write either "Label:" or "Expression:" in the prompt line, and will echo the user's input into the echo line. During type in, various editing characters can be used: Character Description --------- ----------------------------------------- Up arrow Go to beginning of line Down arrow Go to end of line Right arrow Go right one character Left arrow Go left one character Delete Delete the character left of the cursor CTRL/D Delete the character at the cursor CTRL/U Delete the text left of the cursor CTRL/K Delete the text right of the cursor CTRL/A Go to beginning of line CTRL/E Go to end of line CTRL/F Go right one character CTRL/B Go left one character If the foreground/background RT monitor is used, the command "SET TT NO FB" needs to be done before running SHEET in order to be able to use CTRL/F and CTRL/B. Page 7 If all the text on the line is deleted, then SHEET aborts value type in, and returns to its normal state of waiting for a command or value type in. Value type in is ended by pressing return at any point in the line. If a label was being typed in, then the cell becomes of type label and has the line assigned as its value. If an expression was being typed in, then the expression is evaluated. If the expression is a constant expression (does not reference any cells in the sheet) then the cell become type number with the value of the expression. If the expression is not a constant expression, then the cell becomes of type expression and stores the both the expression and the expression value. If the recalculation mode is automatic and a expression is typed in, then all expressions in the spreadsheet are reevaluated after the current cell gets its new value. (Recalculation mode is automatic by default.) If autoadvance mode is on and a new cell value is typed in, then the cursor moves to the next cell in the autoadvance region. (Autoadvance is off by default.) 5.0 COMMANDS Commands to SHEET are one one character long, but several commands may display menus of additional one character commands to be typed, or prompt for additional information. The commands to SHEET are: / Begin a muti-level command. A menu of the second level commands will be displayed in the second and third lines of the screen. ! Recalculate the spreadsheet. This command is most useful while in manual recalculation mode, but it can also be used in automatic recalculation mode to force a recalculation. > Go to a particular cell. The command will prompt for the cell name of the new location. " Start a label. This command is used to start a label that begins with a character which normally begins an expression. SHEET will write "Label:" in the prompt line and begin label type in mode. The quote is not part of the label value. CTRL/R Redraw the screen. Useful if the screen becomes corrupted because of RT echoing typeahead. CTRL/L Redraw the screen. Page 8 tab Move to cell in the next column. Up arrow Move to cell on the preceding row Down arrow Move to cell on the next row Left arrow Move to cell in the preceding column Right arrow Move to cell in the next column. CTRL/P Move to cell on the preceding row CTRL/N Move to cell on the next row CTRL/B Move to cell in the preceding column CTRL/F Move to cell in the next column. PF2 Move to the previous screenfull of the spreadsheet. PF3 Move to the next screenfull of the spreadsheet. CTRL/V Move to the next screenfull of the spreadsheet. CTRL/A Move to the cell in column A of the current row. If the foreground/background RT monitor is used, the command "SET TT NO FB" needs to be done before running SHEET in order to be able to use CTRL/F and CTRL/B. The VT100 function key PF2 is the red function key on the VT52 and the "BACK FIELD" function key on a VT62. The VT100 function key PF3 is the black function key on the VT52 and the "FORWD FIELD" function key on the VT62. As is noted above and below, some commands prompt for additional information like filenames, cell positions, ranges, etc. While typing an answer to one of these prompts, the same editing keys used for value type in can be used. Note that the entire command is aborted if all the text being typed in is deleted. Thus, if you mistakenly begin a /L (load) command, you can abort it by typing a CONTROL/U or delete to the filename prompt. After a "/" command, SHEET puts up a small menu of secondary commands which can be given. The secondary commands are all one letter long; the commands are the capital letters in the words in the menu. The following is a list of the commands which can be given after "/": Word Command in Menu Function ------- ------- ------------------------------------------ A Autoadvance Controls autoadvance mode B Blankcell Blanks the current cell C Clearsheet Blanks all of the spreadsheet Page 9 D Delete Deletes a row or column E Edit Allows editing of labels or expressions F Format Controls the format (typeout) of a cell G Global Controls properties of entire spreadsheet I Insert Inserts a new row or column L Load Loads in a saved spreadsheet from disk P Print Prints a portion of the spreadsheet R Replicate Copies and relocates portions of the sheet S Save Save a copy of the spreadsheet on disk V Version Show the version number of SHEET X eXit Exit to RT 5.1 Autoadvance Command The Autoadvance command controls autoadvance mode. When autoadvance mode is on, SHEET will automatically move to the "next" cell after a value is entered in the current cell. This allows data to be entered into a large number of cells in a spreadsheet rapidly without the user having to use the arrow keys to position to the next cell. The autoadvance command will display a menu in line two of the screen, and wait for a one letter command: Word Command in Menu Function ------- ------- ------------------------------------------ A Advance Turn on autoadvance mode N No-advance Turn off autoadvance mode If the "A" subcommand is given, SHEET will prompt for a beginning column and an ending column. These two columns will define the autoadvance region. After a value is typed into a cell, SHEET will either move to: the cell in the next column, if the next column is less than or equal to the ending column; or, the cell in the next row whose column position is the beginning column. 5.2 Blankcell Command The Blankcell command causes the current cell to become of type blank. The cell's numeric value becomes zero and any label or expression stored by the cell is deallocated from the heap. In addition, the cell's format information is cleared. If the cell remains in this state, its format will be set to the default format the next time a value is typed into the cell. (See the discussion in the section on the Global command.) Page 10 5.3 Clearsheet Command This command will ask to be confirmed by typing the letter "Y". If the command is confirmed, the all cells in the sheet will be blanked (see the Blankcell command). 5.4 Delete Command The Delete command allows you to delete a row or column at the current cell position. A "C" in response to the Delete command menu causes the current column to be deleted; a "R" in response to the Delete command menu causes the current row to be deleted. The delete command automatically adjusts all expressions in the spreadsheet to reflect the deletion of the row or column. However, expressions which contained references to the deleted row or column may now be logically invalid, and should be reviewed by the user. 5.5 Edit Command This command allows you to edit that value of the current cell (if the cell is of type label or expression). The current value of the cell will appear in the echo area, and the usual editing keys may be used to change its value. Note that it is not possible to change a label into an expression (or the reverse) by use of the Edit command. 5.6 Format Command This command sets the format of a cell or the width of a column. The cell's format controls how it is displayed. A menu of options is displayed. The "W" or Width command sets the width of the current column. After the "W" is typed, SHEET will prompt for the integer to use as the new width of the current column. The remaining options to the Format command set the format of the current cell. The following formats are valid for cells of type label: Format Meaning ------ ------------------------------------------- G General--Display the label left justified R Right--Display the label right justified - Duplicate label across entire width of cell The following formats are valid for type number and expression: Page 11 Format Meaning ------ ------------------------------------------- G Display 2 digits past decimal point 0 Display 0 digits past decimal point 1 Display 1 digit past decimal point 2 Display 2 digits past decimal point 3 Display 3 digits past decimal point 4 Display 4 digits past decimal point 5 Display 5 digits past decimal point 6 Display 6 digits past decimal point 7 Display 7 digits past decimal point 8 Display 8 digits past decimal point 9 Display 9 digits past decimal point $ Display the number with a dollar sign and two digits past the decimal point % Display the number as a percentage. (Multiply number by 100, and put "%" after number.) * Bar graph--Display @INT(cell) asterisks. I Display the number as an integer (no decimal point). If a cell's format is not valid for the type of cell that it is, then the "G" format will be used when displaying the cell. 5.7 Global Command The global command controls general properties of the spreadsheet. A menu is displayed which has the following commands: Word Command in Menu Function ------- ------- ------------------------------------------- F Format Set the column width or the default format A Auto-recalc Set automatic recalculation mode M Manual-Recalc Set manual recalculation mode C recalc-by-Columns Set the recalculation order to column major R recalc-by-Rows Set the recalculation order to row major The F subcommand will prompt for format information just like the /F command. The W subsubcommand prompts for an integer, and then sets the width of every column in the spreadsheet. All of the other subsubcommands set the default format used by SHEET. If a cell is of type blank and does not have a format set for it, SHEET will set the cell's format to the current default format when a value is typed into the cell. (Note that if a value is typed into a cell that is of type number, expression, or label then SHEET will not automatically set the cell's format to the default format. Likewise, if a cell is of type blank but has had a format set for it [by a /F, for example], then SHEET will not automatically set the cell's format to the default format when a value is typed into it.) Initially, the default format is "G" and all the blank cells in the spreadsheet do not have a format. Page 12 The A subcommand turns on automatic recalculation mode. In this mode, SHEET will recalculate all the expressions in the spreadsheet anytime a new value is entered for a cell of type number or expression. This is the default mode. The M subcommand turns off automatic calculation mode. SHEET will only recalculate the expressions in the spreadsheet when an "!" command is given. When automatic calculation mode is off, SHEET informs you of this fact by writing "Man" in the upper right corner of the screen ("Man" stands for "manual mode"). The C subcommand set the recalculation order to column major order. When the spreadsheet is being recalculated, SHEET will evaluate all the expressions in column A, then column B, etc. SHEET will remind you that the recalculation order in column major by writing "Col" in the upper right corner of the screen. This is the default recalculation order. The R subcommand set the recalculation order to row major order. When the spreadsheet is being recalculated, SHEET will evaluate all the expressions in row 1, then row 2, etc. SHEET will remind you that the recalculation order in row major by writing "Row" in the upper right corner of the screen. 5.8 Insert Command The Insert command allows you to insert a new row or column at the current cell position. A "C" in response to the Insert command menu causes a new column to be inserted; a "R" in response to the Insert command menu causes a new row to be inserted. All expressions in the spreadsheet are adjusted to reflect the insertion of the new row or column. 5.9 Load Command This command loads a saved spreadsheet into memory from a file. SHEET will prompt for an RT filespec (full RT filespecs are supported). The default device is DK:, and the default extension is ".SHE". 5.10 Print Command This command causes a region of the spreadsheet to be written out to a file in the same format as it is displayed on the terminal screen. SHEET will prompt for two things a range of cells to write out and a file to which to write them. When SHEET prompts for the range, you may type a return if you wish the entire spreadsheet written out, or a range specifier like the @SUM function takes. The second prompt is for an RT filespec (full RT filespecs are supported). The default Page 13 device is DK:, and the default extension is ".LST". 5.11 Replicate Command This command will copy one region of the spreadsheet into another region of the spreadsheet performing optional relocation on the cell references in expressions. The command first prompts for a source range. This range has the same meaning as the range for the @SUM function. (Remember that a range can specify a rectangular array, a row, a column, or a single cell.) Then the command will prompt for a destination range (to be given in the same format as the source range). Then for every expression in the source range, the user will have to mark each cell reference as being either absolute or relative. SHEET will display the expressions, one by one, and will pause after each cell reference. The user then types "A" to mark the cell reference as absolute; "R" to mark it as relative. As SHEET copies an expression into a cell in the destination range, it will relocate all the cells marked as relative. When SHEET replicates a cell, it also copies the current numeric value (if any) and format from the source cell to the destination cell. The source and destination ranges may overlap. 5.12 Save Command This command saves the current spreadsheet into a file. SHEET will prompt for an RT filespec (full RT filespecs are supported). The default device is DK:, and the default extension is ".SHE". 5.13 Version Command This command causes the version number of SHEET to be displayed along with the name of the maximum cell address that SHEET can handle. 5.14 eXit Command This command will ask for confirmation with the letter "Y". If the command is confirmed, SHEET will exit to RT. Page 14 6.0 ERRORS IN CALCULATION If certain exceptional conditions occur when an expression's value is calculated, then the following will be displayed right justified as the cell's value: ERR01 Syntax Error in expression ERR02 Expression too complex ERR03 Floating Overflow ERR04 Floating Underflow ERR05 Zero divide ERR06 Square root of a negative number ERR07 Undefined Exponentiation ERR08 Log of zero or negative number N/A Not available--expression references the @NA() function DEP Expression references a cell in error or DEP or N/A ===== UNMAC ===== Robert Walraven University of California Applied Science Davis, CA 95616 (916)752-3300 UNMAC is a FORTRAN program to convert an RT-11 object file into a source or listing file. Object files are much more useful to decode then SAV files because they contain information such as subroutine names, variable names, psect info, etc. You will be suprised at how similar the output of UNMAC looks to hand coding. This version of UNMAC has not been modified in over a year, and will probably not be improved for some time. If I get a chance I may try fixing some minor problems for Fall Decus. This distribution contains complete sources and a command file for building UNMAC. The file UNMAC7.SAV is an executable version that was built with the FORTRAN-77 compiler. If you have a floating point processor, you should be able to run this file directly. If it doesn't run, use UNMAC.BLD to build a working version on your system. UNMAC has an interesting internal diagnostic procedure built into it. If you want to build a diagnostic version, execute the command file UNMACD.BLD. NOTES ON USAGE: 1. Be sure to specify the extension .OBJ for the input file. 2. If data and instruction attributes were not assigned correctly in the original source, then the output of UNMAC will not be of use, because UNMAC treats data and instruction psects differently: for data psects only the octal code is output (with ASCII and RAD50 translations as comments), while for instruction psects code is always output. In some cases, if a minor amount of data is mixed into an instruction psect, you will be able to correct the output source by inspecting the code and editing appropriately. 3. In some cases compilers do a strange thing: they output a 0 word in a section of code, then go back later with a relocation assignment to fill in the missing value. The BLISS compiler and the FORTRAN-77 both like to use this trick. If this occurs, you will have to do a little editing to fix things up. A future release of UNMAC may fix the code up automatically. 4. You may have some objects that are too big for UNMAC to handle. This is because UNMACs internal tables are maintained completely in memory and may overflow. A future release may maintain data bases on disk. C File Name: UNMAC0.FOR !Rev 8302.031 C C******************* UNMAC ROUTINES CALLED ONLY ONCE ******************* C SUBROUTINE QUERY !Rev 8302.021 C C==============>> Find out what to do from the user. <<================= C IMPLICIT INTEGER (A-Z) C C------------------------------- COMMONS ------------------------------- C COMMON /LUN/ LUN IN, LUN OUT, LUN TT COMMON /MACRO/ MACRO LOGICAL MACRO C C------------------ LOCAL VARIABLES AND DATA --------------------------- C BYTE FIL NAM (30), STRING (31) EQUIVALENCE (FILNAM(1),STRING(1)) C C======================================================================= C C--------------------------- FIND INPUT FILE --------------------------- C 10 WRITE (LUN TT,20) 20 FORMAT(' Input filename: ',$) READ (LUN TT,30) LEN, FIL NAM 30 FORMAT (Q,30A1) IF (LEN.GT.30) CALL FTL ERR (24,'Filename too long') FIL NAM (LEN+1) = 0 OPEN (UNIT=LUN IN, NAME=FIL NAM, TYPE='OLD', ACCESS='DIRECT', 1 RECORDSIZE=128, READONLY, ERR=40) GO TO 60 40 WRITE (LUN TT,50) 50 FORMAT (' ?UNMAC-W-Can not find input file. Try again.') CALL ERRSNS (IRES,IUNIT) WRITE (LUN TT,55) IRES,IUNIT 55 FORMAT (' (FORTRAN error 'I3' on unit 'I2')') GO TO 10 60 CONTINUE C C-------------------------- OPEN OUTPUT FILE -------------------------- C 100 WRITE (LUN TT,110) 110 FORMAT(' Output filename: ',$) READ (LUN TT,120) LEN, FIL NAM 120 FORMAT (Q,30A1) IF (LEN.GT.30) CALL FTL ERR (24,'Filename too long') FIL NAM (LEN+1) = 0 OPEN (UNIT=LUN OUT, NAME=FIL NAM, TYPE='NEW', 1 CARRIAGECONTROL='LIST',ERR=130) GO TO 150 130 WRITE (LUN TT,140) 140 FORMAT (' ?UNMAC-W-Can not open output file. Try again.') CALL ERRSNS (IRES,IUNIT) WRITE (LUN TT,145) IRES,IUNIT 145 FORMAT (' (FORTRAN error 'I3' on unit 'I2')') GO TO 100 150 CONTINUE C C--------------------- GET TYPE OF OUTPUT DESIRED ---------------------- C 200 WRITE (LUN TT,210) 210 FORMAT(' Do you want a listing (L) or a source (S)? ',$) READ (LUN TT,220) LCHAR 220 FORMAT(A1) IF (LCHAR.NE.'L' .AND. LCHAR.NE.'S') GO TO 200 MACRO = LCHAR.EQ.'S' C C------------------------ GET DEBUG INFORMATION ------------------------ C D CALL Q DEBUG C RETURN END LOGICAL FUNCTION LIB FND (IDUMMY) !Rev 8301.291 C C==================>> See if input file is a library <<================= C IMPLICIT INTEGER (A-Z) C C------------------------------- COMMONS ------------------------------- C COMMON /INPUT/ BLOCK, COUNT, INPUT(512) BYTE INPUT COMMON /LIB/ FND LIB LOGICAL FND LIB COMMON /LUN/ LUN IN, LUN OUT, LUN TT COMMON /SYSTEM/ SYSTEM, RT, RSX C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C======================================================================= C C------------------------- Determine the system ------------------------ C READ (LUNIN'1) INPUT I = INPUT(1) IF (I.EQ.1) SYSTEM=RT IF (I.NE.1) SYSTEM=RSX C C---------------------- See if input is a library ---------------------- C IF (SYSTEM .EQ. RT ) CODE = INPUT(5) IF (SYSTEM .EQ. RSX) CODE = INPUT(2) IF (SYSTEM.EQ. RT) FND LIB = CODE .EQ. 7 IF (SYSTEM.EQ.RSX) FND LIB = CODE .EQ. 2 LIB FND = FND LIB C C------------------------- Diagnostic printout ------------------------- C C BEGIN DEBUG D IF (.NOT.DEBUG(3)) GO TO 20 D CALL NEWLIN D CALL OUT TXT ('; System is ') D IF (SYSTEM.EQ. RT) CALL OUT TXT ('RT-11') D IF (SYSTEM.EQ.RSX) CALL OUT TXT ('RSX') D IF (.NOT.FND LIB) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';Input file is a library.') D 10 CONTINUE D 20 CONTINUE C END DEBUG C RETURN C END SUBROUTINE ONCE !Rev 8302.031 C C====================> Once-only initialization <===================== C IMPLICIT INTEGER (A-Z) C COMMON /LUN/ LUN IN, LUN OUT, LUN TT COMMON /OUTPUT/ OUT(132), NOUT BYTE OUT COMMON /XFR/ XFR ADR, XFR NAM(2), STARTF LOGICAL STARTF C C--------------------------------------------------------------------- C LUN IN = 2 LUN OUT = 3 LUN TT = 5 C NOUT = 1 C XFR ADR = 1 STARTF = .FALSE. C RETURN END SUBROUTINE GET DIR !Rev 8301.291 C C======>> Gets directory information if object is a library <<====== C C IMPLICIT INTEGER (A-Z) C C------------------------------ COMMONS ------------------------------ C COMMON /INPUT/ BLOCK, COUNT, INPUT(512) BYTE INPUT COMMON /SAVE/ SAV BLK, SAV CNT COMMON /SYSTEM/ SYSTEM, RT, RSX C C===================================================================== C-------- If a library, call system dependent library routine -------- C IF (SYSTEM.EQ. RT) CALL RTLIB IF (SYSTEM.EQ.RSX) CALL RSXLIB C C----------- Set the starting location of first module --------------- C SAV BLK = BLOCK + 1 SAV CNT = 1 C RETURN END SUBROUTINE RTLIB !Rev 8301.291 C C===============> Process header for an RT library <================== C IMPLICIT INTEGER (A-Z) C C------------------------------ COMMONS ------------------------------ C COMMON /INPUT/ BLOCK, COUNT, INPUT(512) BYTE INPUT COMMON /LUN/ LUN IN, LUN OUT, LUN TT C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C---------------------- LOCAL VARIABLES ------------------------------ C INTEGER INWORD(256), NRAD50(2) EQUIVALENCE (INPUT(1),INWORD(1)) BYTE NAME(7) DATA NAME /7*0/ C C==================================================================== C------------------ Get header pointers and count ------------------- C BLOCK = 1 READ (LUNIN'BLOCK) INPUT OFFSET = INWORD(12) START = OFFSET/2 + 13 NREC = (INWORD(13)/2 - (START-1))/4 C C BEGIN DEBUG D IF (.NOT.DEBUG(4)) GO TO 1 D CALL NEWLIN D CALL OUT TXT (';RT library of ') D CALL OUT OCT (NREC) D CALL OUT TXT (' records begins at word ') D CALL OUT OCT (START) D 1 CONTINUE C END DEBUG C C------------------------ Output title line ------------------------- C CALL NEWLIN CALL OUT TXT ('; OBJECT LIBRARY') CALL CRLF CALL NEWLIN CALL OUT TXT ('; MODULE BLOCK OFFSET') PTR = START C C------------------ Get and print module data ----------------------- C DO 100 N = 1,NREC IF (PTR.LT.256.) GO TO 10 BLOCK = BLOCK + 1 READ (LUNIN'BLOCK) INPUT PTR = 1 10 CONTINUE C NRAD50(1) = INWORD(PTR) NRAD50(2) = INWORD(PTR+1) NBLOCK = INWORD(PTR+2) OFFSET = INWORD(PTR+3) PTR = PTR + 4 C CALL NEWLIN CALL OUT TXT ('; ') CALL R50ASC (6,NRAD50,NAME) CALL OUT TXT (NAME) CALL OUT TXT (' ') CALL OUT OCR (NBLOCK) CALL OUT TXT (' ') CALL OUT OCR (OFFSET) 100 CONTINUE C CALL CRLF CALL CRLF C C BEGIN DEBUG D IF (.NOT.DEBUG(4)) GO TO 200 D CALL NEWLIN D CALL OUT TXT (';RT library ends at block ') D CALL OUT OCT (BLOCK) D 200 CONTINUE C END DEBUG C RETURN END SUBROUTINE RSXLIB !Rev 8301.291 C C======>> Get entry point and module name info from RSX lib <<======= C IMPLICIT INTEGER (A-Z) C C----------------------------- COMMONS ------------------------------ C COMMON /INPUT/ BLOCK, COUNT, INPUT(512) BYTE INPUT COMMON /LUN/ LUN IN, LUN OUT, LUN TT C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C-------------------------- LOCAL VARIABLES ------------------------- C INTEGER IWORD(256),NRAD50(2) EQUIVALENCE (INPUT(1),IWORD(1)) BYTE NAME(7) DATA NAME /7*0/ C C==================================================================== C C---------------- Get information from header block ----------------- C BLOCK = 1 READ (LUNIN'BLOCK) INPUT EPTSIZ = INPUT(19) EPTSB = IWORD(11) NEPT = IWORD(13) MNTSIZ = INPUT(27) MNTSB = IWORD(15) NMNT = IWORD(17) C C BEGIN DEBUG D IF (.NOT.DEBUG(5)) GO TO 1 D CALL NEWLIN D CALL OUT TXT (';RSX library') D CALL NEWLIN D CALL OUT TXT ('; ') D CALL OUT OCT (NEPT) D CALL OUT TXT (' entry point entries of length ') D CALL OUT OCT (EPTSIZ) D CALL OUT TXT (' words starting at block ') D CALL OUT OCT (EPTSB) D CALL NEWLIN D CALL OUT TXT ('; ') D CALL OUT OCT (NMNT) D CALL OUT TXT (' module entries of length ') D CALL OUT OCT (MNTSIZ) D CALL OUT TXT (' words starting at block ') D CALL OUT OCT (MNTSB) D CALL CRLF D 1 CONTINUE C END DEBUG C C--------------------- Output entry point table --------------------- C CALL NEWLIN CALL OUT TXT ('; RSX LIBRARY') CALL CRLF CALL NEWLIN CALL OUT TXT ('; Entry Point Table') CALL CRLF CALL NEWLIN CALL OUT TXT ('; NAME BLOCK OFFSET') C BLOCK = EPTSB NCOUNT = 0 NPTR = 257 C 10 IF (NPTR .LE. 256) GO TO 20 READ (LUNIN'BLOCK) INPUT BLOCK = BLOCK + 1 NPTR = 1 20 IF (IWORD(NPTR) .EQ. "177777) GO TO 30 NRAD50(1) = IWORD (NPTR) NRAD50(2) = IWORD (NPTR+1) NBLOCK = IWORD (NPTR+2) OFFSET = IWORD (NPTR+3) NPTR = NPTR + EPTSIZ NCOUNT = NCOUNT + 1 CALL R50ASC (6,NRAD50,NAME) C CALL NEWLIN CALL OUT TXT ('; ') CALL OUT TXT (NAME) CALL OUT TXT (' ') CALL OUT OCR (NBLOCK) CALL OUT TXT (' ') CALL OUT OCR (OFFSET) GO TO 10 30 CONTINUE C C--------------------- Output module name table --------------------- C CALL CRLF CALL NEWLIN CALL OUT TXT ('; Module Name Table') CALL CRLF CALL NEWLIN CALL OUT TXT ('; MODULE BLOCK OFFSET') C BLOCK = MNTSB NCOUNT = 0 NPTR = 257 C 40 IF (NPTR .LE. 256) GO TO 50 READ (LUNIN'BLOCK) INPUT BLOCK = BLOCK + 1 NPTR = 1 50 IF (IWORD(NPTR).EQ."177777) GO TO 60 NRAD50(1) = IWORD (NPTR) NRAD50(2) = IWORD (NPTR+1) NBLOCK = IWORD (NPTR+2) OFFSET = IWORD (NPTR+3) NPTR = NPTR + MNTSIZ NCOUNT = NCOUNT + 1 CALL R50ASC (6,NRAD50,NAME) C CALL NEWLIN CALL OUT TXT ('; ') CALL OUT TXT (NAME) CALL OUT TXT (' ') CALL OUT OCR (NBLOCK) CALL OUT TXT (' ') CALL OUT OCR (OFFSET) GO TO 40 60 CONTINUE C C------------------------------ Finish up ------------------------------ C CALL CRLF CALL CRLF BLOCK = BLOCK - 1 C C BEGIN DEBUG D IF (.NOT.DEBUG(5)) GO TO 100 D CALL NEWLIN D CALL OUT TXT (';RSX library ends at block ') D CALL OUT OCT (BLOCK) D 100 CONTINUE C END DEBUG C RETURN END C File Name: UNMAC1.FOR !Rev 8302.031 C C This module performs the first pass through an input module C C********************************************************************** C SUBROUTINE PASS 1 !Rev 8301.291 C C On pass 1, get information from the global symbol blocks about C how to assign addresses and how to allocate memory. C C Each data block starts with an identification code in the C first word that describes the type of information contained C in the rest of the data block: C C CODE TYPE FUNCTION OF BLOCK C C 1 GSD Holds Global Symbol Directory information C 2 ENDGSD Signals the end of GSD blocks in the module C 3 TXT Holds the actual binary text of the module C 4 RLD Holds Relocation Directory information C 5 ISD Holds Internal Symbol Directory information C (Not supported in RT-11) C 6 ENDMOD Signals the end of the module C 7 LIBHDR Holds status of a library file C 8 LIBEND Signals end of a library file C C An object module must begin with a Global Symbol Directory (GSD) C block and end with an End of Module (ENDMOD) block. Additional C GSD blocks can occur anywhere in the file, but must appear before C an End of Global Symbol Directory (ENDGSD) block. An ENDGSD C block must appear before the ENDMOD block, and at least one C Relocation Directory (RLD) block must appear before the first C Text Information (TXT) block. Additional RLD and TXT blocks C can appear anywhere in the file. The Internal Symbol Directory C (ISD) block can appear anywhere in the file between the initial C GSD and ENDMOD blocks. C C All program sections (PSECTs, VSECTs, and CSECTs) must be declared C by defining them in GSD blocks. The word size of each program C section definition contains the size in bytes to be reserved C for the section. If a program section is declared more than C once in a single object module, the linker uses the largest C declared size for that section. All global symbols that are C defined in a given program section must appear in the GSD items C immediately following the definition item of that program section. C C A special program section, called the absolute section (. ABS.), C is allocated by the linker beginning at location 0 in memory. C Immediately after the GSD item that defines the absolute section, C all global symbols that contain absolute (non-relocatable) values C must be declared. If the size word is zero, no memory space C is allocated for the absolute section. C C Global symbols that are referenced but not defined in the current C object module must also appear in GSD items. These global C references may appear in any GSD item except the very first, C which contains the module name. In MACRO, referenced globals C are seen in a GSD block under the . ABS. p-sect. C C--------------------------------------------------------------------------- C IMPLICIT INTEGER (A-Z) C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C---------------------- Get the next data block --------------------------- C 10 CALL GET BLK C C-------------------------------------------------------------------------- C Get data block identification code and jump to appropriate C routine to process the data block C CALL RD WORD (CODE) IF (CODE.GE.0 .AND. CODE.LE.8) GO TO 15 CALL NEWLIN CALL OUT TXT ('PASS1: Illegal identification code = ') CALL OUT OCT (CODE) CALL FTL ERR (ERR,'Data block ident. code out of range') 15 CONTINUE C C BEGIN DEBUG D IF (.NOT.DEBUG(21)) GO TO 20 D CALL NEWLIN D IF (CODE.EQ.0) CALL OUT TXT(';Skip RSX LIB header') D IF (CODE.EQ.1) CALL OUT TXT(';GSD') D IF (CODE.EQ.2) CALL OUT TXT(';ENDGSD') D IF (CODE.EQ.3) CALL OUT TXT(';TXT') D IF (CODE.EQ.4) CALL OUT TXT(';RLD') D IF (CODE.EQ.5) CALL OUT TXT(';ISD') D IF (CODE.EQ.6) CALL OUT TXT(';ENDMOD') D IF (CODE.EQ.7) CALL OUT TXT(';Librarian header') D IF (CODE.EQ.8) CALL OUT TXT(';Librarian end') D CALL OUT TXT (' - Pass 1') D 20 CONTINUE C END DEBUG C GO TO (10,100,10,300,400,10,600,10,10), CODE+1 C C----------- GSD - Global symbol directory information -------------------- C 100 CALL GSD 1 GO TO 10 C C--------------- TXT - Binary text information block ---------------------- C 300 CALL TXT1 GO TO 10 C C--------------- RLD - Relocation directory block ------------------------ C 400 CALL RLD1 GO TO 10 C C----------------------- ENDMOD - End of module --------------------------- C 600 CALL END MOD RETURN END SUBROUTINE GSD 1 !Rev 8302.031 C C GSD - Get global symbol directory information for pass 1 C C Global Symbol Directory blocks contain all the information the C linker needs to assign addresses to global symbols and to C allocate the memory a job requires. There are eight types of C entries that GSD blocks can contain: C C Entry type Description C ---------- ----------- C 0 Module Name C 1 Control Section Name (CSECT) C 2 Internal Symbol Name C 3 Transfer Address C 4 Global Symbol Name C 5 Program Section Name C 6 Program Version Identification (IDENT) C 7 Mapped Array Declaration (VSECT) C C Each type of entry is represented by four words in the GSD data C block. The first two words contain six Radix-50 characters. The C third word contains a flag byte and the entry type identification. C The fourth word contains additional information about the entry. C ================================== C | 0 | 1 | C ================================== C | RADIX - 50 | C ----- ----- C | NAME | C ---------------------------------- C | ENTRY TYPE | FLAGS | C ---------------------------------- C | VALUE | C ================================== C | RADIX - 50 | C ----- ----- C | NAME | C ---------------------------------- C | ENTRY TYPE | FLAGS | C ---------------------------------- C | VALUE | C ================================== C : C : C ================================== C | RADIX - 50 | C ----- ----- C | NAME | C ---------------------------------- C | ENTRY TYPE | FLAGS | C ---------------------------------- C | VALUE | C ================================== C IMPLICIT INTEGER (A-Z) C C------------------------ COMMON ----------------------------------- C COMMON /RECORD/ LEN, NXT CHR, RECORD(256) BYTE RECORD COMMON /MACRO/ MACRO LOGICAL MACRO COMMON /XFR/ XFR ADR, XFR NAM (2), STARTF LOGICAL STARTF COMMON /PSECTS/ NPSECT,PSNAME(2,100),PSFLAG(100),PSVALU(100) BYTE PSFLAG COMMON /GLOBLS/ NGLBLS,GNAME(2,400),GFLAGS(400),GVALUE(400), 1 GPSECT(400) BYTE GFLAGS,GPSECT D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C---------------- LOCAL VARIABLES AND DATA ------------------------- C INTEGER NRAD50 (2) BYTE ABS NAM (6), NAME (7), BLANK DATA ABS NAM /'.',' ','A','B','S','.'/ DATA BLANK /' '/ DATA BIT3, BIT4, BIT5, BIT6, BIT7 1 / "10, "20, "40, "100, "200/ C C====================== START OF CODE ============================== C C-------------------Get the next GSD record ------------------------ C 100 CALL RD NAME (NAME,NRAD50) CALL RD BYTE (FLAGS) FLAGS = FLAGS .AND. "377 CALL RD BYTE (TYPE) CALL RD WORD (VALUE) C C BEGIN DEBUG D IF (.NOT.DEBUG(23)) GO TO 101 D CALL NEWLIN D CALL OUT TXT (';GSD: ') D CALL OUT TXT (NAME) D CALL OUT TXT ('; Type = ') D CALL OUT OCT (TYPE) D CALL OUT TXT ('; Value = ') D CALL OUT OCT (VALUE) D CALL OUT TXT ('; Flags = ') D CALL OUT BYT (FLAGS) D 101 CONTINUE C END DEBUG C IF (TYPE.GE.0 .AND. TYPE.LE.7) GO TO 102 CALL NEWLIN CALL OUT TXT (';GSD 1: Illegal type = ') CALL OUT OCT (TYPE) CALL FTL ERR ("10,'GSD entry type out of range') 102 CONTINUE C GO TO (110,120,130,140,150,160,170,180), TYPE+1 C C---->> TYPE 0: Module name <<-------------------------------------- C C Declares the name of the object module. The name need not be C unique with respect to other object modules because modules C are identified by file, not module name. However, only one C module name declaration can occur in a single object module. C C ----------------------------------- C | RADIX-50 MODULE | C ---- ---- C | NAME | C ----------------------------------- C | 0 | 0 | C ----------------------------------- C | 0 | C ----------------------------------- C 110 CALL CRLF CALL CRLF CALL NEWLIN CALL OUT TXT (' .TITLE ') CALL OUT TXT (NAME) CALL CRLF CALL NEWLIN CALL OUT TXT (';Floating point register assignments:') DO 111 I=0,3 CODE = I+"60 CALL NEWLIN CALL OUT TXT ('AC') CALL OUT TXT (CODE) CALL OUT TXT ('=%') CALL OUT TXT (CODE) 111 CONTINUE CALL CRLF GO TO 1000 C C---->> TYPE 1: Control section name (CSECT) <<--------------------- C C Declares the name of a control section. The linker converts C control sections - which include ASECTs, blank CSECTS, and C named CSECTS - to PSECTs. For convenience, control sections C are converted as follows: C Blank CSECT: .PSECT ,RW,I,LCL,REL,CON C Named CSECT: .PSECT name,RW,I,GBL,REL,OVR C ASECT: .PSECT . ABS.,RW,I,GBL,ABS,OVR C C ---------------------------------- C | RADIX-50 CONTROL | C ----- ----- C | NAME | C ---------------------------------- C | 1 | IGNORED | C ---------------------------------- C | MAXIMUM LENGTH | C ---------------------------------- C 120 DO 121 I=1,6 IF (NAME(I) .NE. ABS NAM(I)) GO TO 122 121 CONTINUE FLAGS = "104 ! ASECT GO TO 160 C 122 DO 123 I=1,6 IF (NAME(I) .NE. BLANK) GO TO 124 123 CONTINUE FLAGS = "40 ! Blank CSECT GO TO 160 C 124 FLAGS = "144 ! Named CSECT GO TO 160 C C---->> TYPE 2: Internal symbol name <<----------------------------- C C Declares the name of an internal symbol with respect to the C module. Because the linker does not support internal symbol C tables, the detailed format of this entry is not defined. C If the linker encounters an internal symbol entry while C reading the GSD, it ignores it. C C ---------------------------------- C | SYMBOL | C ----- ----- C | NAME | C ---------------------------------- C | 2 | 0 | C ---------------------------------- C | UNDEFINED | C ---------------------------------- C 130 CALL NEWLIN CALL OUT TXT ('; Internal symbol name') CALL OUT TXT (NAME) CALL OUT TXT (', value = ') CALL OUT OCT (VALUE) GO TO 1000 C C---->> TYPE 3: Transfer address <<---------------------------------- C C Declares the transfer address of a module relative to C a p-sect. The first two words of the entry define the name C of the p-sect. The fourth word indicates the relative offset C from the beginning of that p-sect. If no transfer address C is declared in a module, the transfer address entry must C not be included in the GSD, or else a transfer address 000001 C relative to the default absolute p-sect (. ABS.) must be C specified. C C ---------------------------------- C | SYMBOL | C ----- ----- C | NAME | C ---------------------------------- C | 3 | 0 | C ---------------------------------- C | OFFSET | C ---------------------------------- C C NOTE C When the p-sect is absolute, OFFSET is the actual transfer C address if it is not equal to 000001. C 140 XFRADR = VALUE DO 141 I=1,2 141 XFR NAM (I) = NRAD50 (I) GO TO 1000 C C---->> TYPE 4: Global symbol name <<----------------------------------- C C Declares either a global reference or a definition. All C definition entries must appear after the declaration of the C p-sect under which they are defined, and before the declaration C of another p-sect. Global references can appear anywhere within C the GSD. C +--------------------------------+ C | SYMBOL | C +--- ---+ C | NAME | C +--------------------------------+ C | 4 | FLAGS | C +--------------------------------+ C | VALUE | C +--------------------------------+ C C The first two words of the entry define the name of the global C symbol. The flag byte declares the attributes of the symbol. C The fourth word contains the value of the symbol relative to C the p-sect under which it is defined. C C The flag byte of the symbol declaration entry has the bit C assignments as shown in the following table. Bits 0, 1, 2, C 4, 6, and 7 are not used. C C Bit Meaning C ................................................................ C 3 Definition C 0 = Global symbol reference C 1 = Global symbol definition C 5 Relocation C 0 = Absolute symbol value C 1 = Relative symbol value C ................................................................ C 150 N GLBLS = N GLBLS + 1 IF (N GLBLS .GT. 400) CALL FTL ERR ("12,'More than 400 globals') G NAME (1, N GLBLS) = NRAD50(1) G NAME (2, N GLBLS) = NRAD50(2) G FLAGS (N GLBLS) = FLAGS G VALUE (N GLBLS) = VALUE G PSECT (N GLBLS) = N PSECT 154 GO TO 1000 C C---->> TYPE 5: Program section name (PSECT) <<------------------------ C C Declares the name of a p-sect and its maximum length in the C module. It also uses the flag byte to declare the attributes C of the p-sect. The default attributes of the p-sect are as C follows: C .PSECT ,RW,I,LCL,REL,CON C C NOTE: The length of all absolute sections is zero C C GSD records must be constructed in such a way that once a p-sect C name has been declared, all global symbol definitions pertaining C to it must appear before another p-sect name is declared. C Global symbols are declared by means of symbol declaration C entries. Thus the normal format is a series of p-sect names, C each followed by optional symbol declarations. C C +--------------------------------+ C | P-SECT | C +--- ---+ C | NAME | C +--------------------------------+ C | 5 | FLAGS | C +--------------------------------+ C | MAXIMUM LENGTH | C +--------------------------------+ C C The following table shows the bit assignments of the flag byte. C Bits 0, 1, and 3 are not used. C C Bit Meaning C ............................................................... C 2 Allocation C 0 = P-sect references are to be concatenated with C other references to the same p-sect to form the C total amount of memory allocated to the section. C 1 = P-sect references are to be overlaid. The total C amount of memory allocated to the p-sect is the C size of the largest request made by individual C references to the same p-sect. C 4 Access (not supported by RT-11 monitors) C 0 = P-sect has read/write access. C 1 = P-sect has read-only access. C 5 Relocation C 0 = P-sect is absolute and requires no relocation. C 1 = P-sect is relocatable and references to the C control section must have a relocation bias C added before they become absolute. C 6 Scope C 0 = The scope of the p-sect is local. References C to the same p-sect will be collected only within C the overlay segment in which the p-sect is C defined. C 1 = The scope of the p-sect is global. References C to the p-sect are collected across overlay C segment boundaries. C 7 Type C 0 = The p-sect contains instruction (I) references. C Concatenation of this p-sect will be by word C boundary. Globals will be given overlay C control blocks. C 1 = The p-sect contains data (D) references. Con- C catentation of this p-sect will be by byte C boundary. Globals will not go through the C overlay handler. C .................................................................... C 160 IF (N PSECT .EQ. 0) GO TO 166 DO 162 I = 1,N PSECT IF (PSNAME(1,I).NE.NRAD50(1)) GO TO 162 IF (PSNAME(2,I).NE.NRAD50(2)) GO TO 162 GO TO 168 162 CONTINUE C 166 NPSECT = NPSECT + 1 IF (NPSECT .GT. 100) CALL FTL ERR ("13,'More than 100 PSECTS.') I = NPSECT PSNAME (1,I) = NRAD50 (1) PSNAME (2,I) = NRAD50 (2) 168 PSFLAG (I) = FLAGS IF (PSVALU(I).LT.VALUE) PSVALU (I) = VALUE GO TO 1000 C C---->> TYPE 6: Program version identification (IDENT) <<------------- C C Declares the version of the module. The linker saves the C version identification, or IDENT, of the first module that C declares a nonblank version. It then includes this ident- C ification on the memory allocation map. C C The first two words of the entry contain the version ident- C ification. The linker does not use either the flag byte or C the fourth word because they contain no meaningful information. C C +--------------------------------+ C | SYMBOL | C +--- ---+ C | NAME | C +--------------------------------+ C | 6 | 0 | C +--------------------------------+ C | 0 | C +--------------------------------+ C 170 CALL NEWLIN CALL OUT TXT (' .IDENT /') CALL OUT TXT (NAME) CALL OUT TXT ('/') GO TO 1000 C C---->> TYPE 7: Mapped array declaration (VSECT) <<-------------------- C C Allocates space within the mapped array area of the job's C memory. The linker adds the length (in units of 32-word C blocks) to the job's mapped area allocation. It rounds C up the total amount of memory allocated to each mapped C array to the nearest 256-word boundary. The contents of C the flag byte are reserved and assumed to be zero. C (Only the FORTRAN IV produces this VSECT.) For convenience, C VSECT statements are translated into PSECTs as follows: C .PSECT . VIR.,RW,D,GBL,REL,CON C The size is equal to the number of 32-word blocks required. C There must never be globals under this section, which starts C at a base of 0. C NOTE C One additional address window is allocated whenever a mapped C array is declared. C C ---------------------------------- C | RADIX-50 MAPPED | C ----- ----- C | ARRAY NAME | C ---------------------------------- C | 7 | RESERVED | C ---------------------------------- C | LENGTH | C ---------------------------------- C 180 CALL NEWLIN CALL OUT TXT (' .VSECT /') CALL OUT TXT (NAME) CALL OUT TXT ('/') CALL OUT TXT (' ;length = ') CALL OUT INT (VALUE) CALL OUT TXT ('. 32-word blocks') C C======================= Check for end of GSD ======================== C 1000 IF (LEN .GT. 1) GO TO 100 C C End of binary block C RETURN END SUBROUTINE TXT 1 !Rev 8302.031 C C====================> Scan text for branch labels <==================== C IMPLICIT INTEGER (A-Z) C C--------------------------------- COMMONS ----------------------------- C COMMON /LABELS/ NLABEL,LABL PS(2,1000),LABL OF(1000), 1 PL NAME(2), L OFF COMMON /RECORD/ LEN, NXT CHR, RECORD(256) BYTE RECORD C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG D BYTE NAME(7) D DATA NAME /7*0/ C C======================================================================= C CALL RD WORD (COUNT) LOC TXT = COUNT C C---------------------------- Get the text ----------------------------- C 40 CALL RD WORD (TEXT) C C-------------------------- Look for a branch -------------------------- C IN = TEXT .AND. "77777 IF (IN .NE. TEXT) GO TO 50 IF (IN .LT. "400) GO TO 100 50 IF (IN .GE. "4000) GO TO 100 OFFSET = TEXT .AND. "377 IF (OFFSET.GE."200) OFFSET = OFFSET - "400 OFFSET = 2*(OFFSET+1) + L OFF NLABEL = NLABEL + 1 IF (NLABEL .GT. 1000) 1 CALL FTL ERR("14,'More than 1000 labels') LABL PS (1,NLABEL) = PL NAME(1) LABL PS (2,NLABEL) = PL NAME(2) LABL OF (NLABEL) = OFFSET C C BEGIN DEBUG D IF (.NOT.DEBUG(23)) GO TO 200 D CALL NEWLIN D CALL OUT TXT (';TXT 1: label ') D CALL OUT OCT (NLABEL) D CALL OUT TXT (' in psect #') D CALL R50ASC (6,LABL PS (1,NLABEL),NAME) D CALL SHORTN (NAME) D CALL OUT TXT (NAME) D CALL OUT TXT (', ') D CALL OUT OCT (L OFF) D CALL OUT TXT (' = ') D CALL OUT OCT (OFFSET) D CALL OUT TXT ('$ for text = ') D CALL OUT OCT (TEXT) D 200 CONTINUE C END DEBUG C 100 CONTINUE C L OFF = L OFF + 2 IF (LEN .GT. 1) GO TO 40 RETURN C END SUBROUTINE RLD 1 !Rev 8301.311 C C====================> Process RLD record on pass 1 <===================== C IMPLICIT INTEGER (A-Z) C COMMON /LABELS/ NLABEL,LABL PS(2,1000),LABL OF(1000), 1 PL NAME(2), L OFF C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C--------------------------- LOCAL VARIABLES ---------------------------- C BYTE NAME(7) DATA NAME /7*0/ C C======================================================================== C N RLD = 0 N R PTR = 1 C 10 B = "40 CALL RD BYTE (CODE) TYPE = CODE.AND."177 IF ((CODE.AND."200) .NE. 0) B="102 CALL RD BYTE (CODE) RELOC = CODE C C BEGIN DEBUG D IF (.NOT.DEBUG(24)) GO TO 15 D CALL NEWLIN D CALL OUT TXT (';RLD: Type = ') D CALL OUT OCT (TYPE) D CALL OUT TXT (', Reloc = ') D CALL OUT OCT (RELOC) D IF (B.EQ."102) CALL OUT TXT (' B') D 15 CONTINUE C END DEBUG C IF (TYPE.GE.1 .AND. TYPE.LE."17) GO TO 20 CALL NEWLIN CALL OUT TXT ('RLD 1: Illegal type = ') CALL OUT OCT (TYPE) CALL FTL ERR ("15,'RLD entry type out of range') 20 CONTINUE C IF (TYPE .NE. 7) GO TO 100 C C------------------- Process location counter definition ----------------- C CALL RD NAME (NAME,PL NAME) CALL SHORTN (NAME) CALL RD WORD (L OFF) C C BEGIN DEBUG D IF (.NOT. DEBUG(24)) GO TO 50 D CALL OUT TXT (', Psect ') D CALL OUT TXT (NAME) D CALL OUT TXT (', offset = ') D CALL OUT OCT (L OFF) D 50 CONTINUE C C--------------------------- All types go here --------------------------- C 100 CONTINUE IF (LEN .GT. 0) GO TO 10 C RETURN END SUBROUTINE ENDMOD !Rev 8302.031 C C===============>> Process an ENDMOD in pass 1 of UNMAC <<================ C IMPLICIT INTEGER (A-Z) C C-------------------------------- COMMONS -------------------------------- C COMMON /INPUT/ BLOCK,COUNT,INPUT(512) BYTE INPUT COMMON /GLOBLS/ NGLBLS,GNAME(2,400),GFLAGS(400),GVALUE(400), 1 GPSECT(400) BYTE GFLAGS,GPSECT COMMON /PSECTS/ NPSECT,PSNAME(2,100),PSFLAG(100),PSVALU(100) BYTE PSFLAG COMMON /SAVE/ SAV BLK, SAV CNT C C---------------------------- LOCAL VARIABLES ---------------------------- C BYTE NAME(7) DATA BIT2,BIT3,BIT4,BIT5,BIT6,BIT7 /"4,"10,"20,"40,"100,"200/ DATA ZERO /0/, NAME /7*0/ C C------------------------------------------------------------------------ C C Reset pointers to the beginning of the module and force C a read of the first record C BLOCK = SAV BLK - 1 COUNT = 513 CALL RD NEXT (CODE) COUNT = SAV CNT C C------------------ Print out global symbol references ------------------ C IF (N GLBLS .EQ. 0) GO TO 60 CALL CRLF N G OUT = 5 DO 50 I = 1, N GLBLS FLAGS = GFLAGS (I) STATE = FLAGS .AND. BIT3 IF (STATE .NE. 0) GO TO 40 N G OUT = N G OUT + 1 IF (N G OUT .NE. 6) GO TO 30 CALL NEWLIN N G OUT = 0 CALL OUT TXT (' .GLOBL ') 30 CONTINUE CALL R50ASC (6,GNAME(1,I),NAME) CALL OUT GBL (NAME) 40 CONTINUE 50 CONTINUE 60 CONTINUE C C------------------ Print out the global definitions ----------------- C IF (NGLBLS.EQ.0) GO TO 120 CALL CRLF DO 110 I = 1, N GLBLS FLAGS = GFLAGS (I) STATE = FLAGS .AND. BIT3 IF (STATE .EQ. 0) GO TO 100 STATE = FLAGS .AND. BIT5 IF (STATE .NE. 0) GO TO 100 CALL R50ASC (6,GNAME(1,I),NAME) CALL NEWLIN CALL OUT TXT (NAME) CALL OUT TXT ('==') CALL OUT OCT (GVALUE(I)) 100 CONTINUE 110 CONTINUE 120 CONTINUE C C---------------------------- Output PSECTS ---------------------------- C 200 IF (N PSECT .EQ. 0) GO TO 230 CALL CRLF DO 220 I = 1, N PSECT II = I CALL R50ASC (6,PSNAME(1,II),NAME) CALL NEWLIN CALL OUT TXT (' .PSECT ') CALL OUT TXT (NAME) FLAGS = PSFLAG(II) VALUE = PSVALU(II) C STATE = FLAGS .AND. BIT 4 IF (STATE.EQ.ZERO) CALL OUT TXT (',RW') IF (STATE.EQ.BIT4) CALL OUT TXT (',RO') STATE = FLAGS .AND. BIT 7 IF (STATE.EQ.ZERO) CALL OUT TXT (',I') IF (STATE.EQ.BIT7) CALL OUT TXT (',D') STATE = FLAGS .AND. BIT 6 IF (STATE.EQ.ZERO) CALL OUT TXT (',LCL') IF (STATE.EQ.BIT6) CALL OUT TXT (',GBL') STATE = FLAGS .AND. BIT 5 IF (STATE.EQ.ZERO) CALL OUT TXT (',ABS') IF (STATE.EQ.BIT5) CALL OUT TXT (',REL') STATE = FLAGS .AND. BIT 2 IF (STATE.EQ.ZERO) CALL OUT TXT (',CON') IF (STATE.EQ.BIT2) CALL OUT TXT (',OVR') C IF (VALUE .EQ. 0) GO TO 210 CALL OUT TXT (' ;Length = ') CALL OUT OCT (VALUE) CALL NEWLIN CALL OUT TXT (NAME) CALL OUT TXT ('=.') 210 CONTINUE 220 CONTINUE 230 CONTINUE CALL CRLF C C----------------------------------------------------------------------- C RETURN END C File name: UNMAC2.FOR !Rev 8303.091 C C********************************************************************** C SUBROUTINE PASS 2 !Rev 8302.071 C C On pass 2, finish the disassembly process C IMPLICIT INTEGER (A-Z) C C------------------------------ COMMONS ------------------------------ C COMMON /PSECT2/ N CUR PS, N OLD PS, CUR PS(8), PS LOC(100) BYTE CUR PS COMMON /RLD/ NRLD,NRPTR,NPOFF(50),NBOFF(50),NRBUFF(512) BYTE NRBUFF COMMON /TXT/ N TXT, LOC TXT, TXT(256), INST PS, N TXT OF LOGICAL INST PS C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C------------------------- LOCAL VARIABLES -------------------------- C LOGICAL GOT TXT C C==================================================================== C C BEGIN DEBUG D IF (.NOT.DEBUG(31)) GO TO 1 D CALL CRLF D CALL NEWLIN D CALL OUT TXT (';* * * * * P A S S 2 * * * * *') D CALL CRLF D 1 CONTINUE C END DEBUG C C----------------------- Initialize some stuff ----------------------- C N CUR PS = 0 GOT TXT = .FALSE. N TXT = 0 N RLD = 0 N TXT OF = 0 N OLD PS = 0 DO 2 I=1,100 PS LOC(I) = 0 2 CONTINUE C C----------------------- Find first RLD block ------------------------ C 10 CONTINUE CALL GET BLK CALL RD WORD (TYPE) IF (TYPE.EQ.6) GO TO 600 IF (TYPE.EQ.1) CALL GSD 2 IF (TYPE.NE.4) GO TO 10 CALL RLD 2 C C DEBUG BEGIN D IF (.NOT.DEBUG(31)) GO TO 20 D CALL NEWLIN D CALL OUT TXT (';Found first RLD.') D 20 CONTINUE C DEBUG END C C---------------------- Get the next data block ---------------------- C 40 CALL GET BLK C C Get data block identification code and jump to appropriate C routine to process the data block C CALL RD WORD (CODE) IF (CODE.GE.0 .AND. CODE.LE.6) GO TO 41 CALL NEWLIN CALL OUT TXT (' PASS2: Illegal identification code = ') CALL OUT OCT (CODE) CALL FTL ERR("10,'Data block ident. code out of range') 41 CONTINUE C C BEGIN DEBUG D IF (.NOT.DEBUG(31)) GO TO 50 D IF (CODE.EQ.3 .AND. DEBUG(33)) GO TO 50 D IF (CODE.EQ.4 .AND. DEBUG(34)) GO TO 50 D CALL NEWLIN D IF (CODE.EQ.0) CALL OUT TXT (';Get RSX LIB header') D IF (CODE.EQ.1) CALL OUT TXT (';GSD') D IF (CODE.EQ.2) CALL OUT TXT (';ENDGSD') D IF (CODE.EQ.3) CALL OUT TXT (';TXT') D IF (CODE.EQ.4) CALL OUT TXT (';RLD') D IF (CODE.EQ.5) CALL OUT TXT (';ISD') D IF (CODE.EQ.6) CALL OUT TXT (';ENDMOD') D CALL OUT TXT (' - Pass 2') D 50 CONTINUE C END DEBUG C GO TO (40,100,40,300,400,40,600), CODE+1 C C------------------- GSD - Global symbol directory -------------------- C 100 CALL GSD 2 GO TO 40 C C---------------- TXT - Binary text information block ----------------- C 300 IF (GOT TXT) CALL BUILD CALL TXT 2 GOT TXT = .TRUE. GO TO 40 C C------------------ RLD - Relocation directory block ------------------- C 400 CALL RLD 2 IF (GOT TXT) CALL BUILD GOT TXT = .FALSE. GO TO 40 C C-------------------- ENDMOD - End of object module ------------------ C 600 IF (GOT TXT) CALL BUILD CALL CRLF C RETURN END SUBROUTINE GSD 2 !Rev 8302.031 C C GSD - Get global symbol directory information for pass 2 C (See subroutine GSD 1 in UNMAC1.FOR for more complete comments.) C IMPLICIT INTEGER (A-Z) C C---------------------------- COMMONS --------------------------------- C COMMON /PSECT2/ N CUR PS, N OLD PS, CUR PS(8), PS LOC(100) BYTE CUR PS COMMON /RECORD/ LEN, NXT CHR, RECORD(256) BYTE RECORD C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C--------------------- LOCAL VARIABLES AND DATA ---------------------- C LOGICAL PS OUT INTEGER NRAD50(2) BYTE NAME(7) DATA BIT3,BIT5 /"10,"40/ C C====================================================================== C------------------- Get the next GSD record -------------------------- C 100 CALL RD NAME (NAME,NRAD50) CALL RD BYTE (FLAGS) FLAGS = FLAGS .AND. "377 CALL RD BYTE (TYPE) CALL RD WORD (VALUE) C C BEGIN DEBUG D IF (.NOT.DEBUG(32)) GO TO 101 D CALL NEWLIN D CALL OUT TXT (';GSD 2: ') D CALL OUT TXT ('; Type = ') D CALL OUT OCT (TYPE) D CALL OUT TXT ('; Value = ') D CALL OUT OCT (VALUE) D CALL OUT TXT ('; Flags = ') D CALL OUT BYT (FLAGS) D CALL OUT TXT ('; Name = ') D CALL OUT TXT (NAME) D 101 CONTINUE C END DEBUG C IF (TYPE.GE.0 .AND. TYPE.LE.7) GO TO 102 CALL NEWLIN CALL OUT TXT ('GSD 2: Illegal entry type = ') CALL OUT OCT (TYPE) CALL FTL ERR ("11,'GSD entry type out of range') 102 CONTINUE C IF (TYPE .NE. 5) GO TO 190 C C----------------- TYPE 5: Program section name ----------------------- C 150 CONTINUE DO 152 I=1,7 CUR PS(I) = NAME(I) 152 CONTINUE PS OUT = .FALSE. C C------------------------- All types go here -------------------------- C 190 IF (LEN .GT. 0) GO TO 100 C RETURN END SUBROUTINE TXT 2 !Rev 8302.031 C IMPLICIT INTEGER (A-Z) C C------------------------------ COMMONS ---------------------------- C COMMON /MACRO/ MACRO LOGICAL MACRO COMMON /PSECTS/ NPSECT,PSNAME(2,100),PSFLAG(100),PSVALU(100) BYTE PSFLAG COMMON /PSECT2/ N CUR PS, N OLD PS, CUR PS(8), PS LOC(100) BYTE CUR PS COMMON /RECORD/ LEN, NXT CHR, RECORD (256) BYTE RECORD COMMON /TXT/ N TXT, LOC TXT, TXT(256), INST PS, N TXT OF LOGICAL INST PS C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C==================================================================== C------------------------ LOCAL VARIABLES --------------------------- C BYTE NAME(7) C C-------------------------------------------------------------------- C OLD LOC = PS LOC (N CUR PS) CALL RD WORD (COUNT) IF (N CUR PS .GT. 100) 1 CALL FTL ERR (26,'N CUR PS out of range in TXT 2') PS LOC (N CUR PS) = COUNT LOC TXT = COUNT C C BEGIN DEBUG D IF (.NOT.DEBUG(33)) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';TXT - Binary text information at ') D CALL R50ASC(6,PSNAME(1,NCURPS),NAME) D CALL OUT TXT (NAME) D CALL OUT TXT ('+') D CALL OUT OCT (COUNT) D 10 CONTINUE C END DEBUG C C------------ Find out if it is an instruction psect ---------------- C I = PSFLAG (N CUR PS) INST PS = (I.AND."200) .EQ. 0 C C------------ If it is a new psect, write its name ------------------ C IF (N CUR PS .EQ. N OLD PS) GO TO 20 CALL R50ASC (6,PSNAME(1,NCURPS),NAME) CALL NEWLIN CALL OUT TXT (' .PSECT ') CALL OUT TXT (NAME) N OLD PS = N CUR PS 20 CONTINUE C C----- If the location counter has moved, output the new pointer ----- C IF (COUNT .EQ. OLD LOC) GO TO 30 CALL NEWLIN CALL OUT TXT ('.=.+') I = COUNT - OLD LOC CALL OUT OCT (I) 30 CONTINUE C C----------------------- Get the text ------------------------------- C 40 CALL RD WORD (TEXT) C C BEGIN DEBUG D IF (.NOT.DEBUG(33)) GO TO 50 D CALL NEWLIN D CALL OUT TXT (';') D CALL OUT OCR (PS LOC (N CUR PS)) D CALL OUT TXT (' ') D CALL OUT OCR (TEXT) D 50 CONTINUE C END DEBUG C 60 PS LOC (N CUR PS) = PS LOC (N CUR PS) + 2 N TXT = N TXT + 1 IF (N TXT .GT. 256) CALL FTL ERR("16,'TXT record > 256 bytes') TXT (N TXT) = TEXT IF (LEN .GT. 1) GO TO 40 IF (LEN .LE. 0) RETURN C C---------------- Process last byte in odd length records ------------- C CALL RD BYTE (TEXT) TEXT = TEXT .AND. "377 GO TO 60 C RETURN END SUBROUTINE RLD 2 !Rev 8302.031 C C RLD - Relocation directory block C IMPLICIT INTEGER (A-Z) C C---------------------------- COMMONS ------------------------------ C COMMON /COMPLX/ NBUF, BUF(100) BYTE BUF COMMON /MACRO/ MACRO LOGICAL MACRO COMMON /PSECTS/ NPSECT,PSNAME(2,100),PSFLAG(100),PSVALU(100) BYTE PSFLAG COMMON /PSECT2/ N CUR PS, N OLD PS, CUR PS(8), PS LOC(100) BYTE CUR PS COMMON /RECORD/ LEN, NXT CHR, RECORD(256) BYTE RECORD COMMON /RLD/ NRLD,NRPTR,NPOFF(50),NBOFF(50),NRBUFF(512) BYTE NRBUFF COMMON /TXT/ N TXT, LOC TXT, TXT(256), INST PS, N TXT OF LOGICAL INST PS C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C-------------------- LOCAL VARIABLES AND DATA ---------------------- C INTEGER NRAD50(2) BYTE NAME(7) DATA MAX RLD /50/, MAXBUF /512/, NAME /7*0/ C C=================================================================== C N RLD = 0 N R PTR = 1 4000 CALL RLD BLK (RELOC,B,TYPE) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';RLD: Type = ') D CALL OUT OCT (TYPE) D CALL OUT TXT ('; Reloc = ') D CALL OUT OCT (RELOC) D IF (B.EQ."102) CALL OUT TXT (' B') D 10 CONTINUE C END DEBUG C IF (TYPE.GE.1 .AND. TYPE.LE."17) GO TO 1 CALL NEWLIN CALL OUT TXT ('RLD 2: Illegal RLD type = ') CALL OUT OCT (TYPE) CALL FTL ERR ("15,'RLD entry type out of range') 1 CONTINUE C GO TO (401,402,403,404,405,406,407,410,411,412,413,414, 1 415,416,417), TYPE C C------ TYPE 1: Internal relocation ----------------------------- C 401 CALL RD WORD (CONST) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4010 D CALL NEWLIN D CALL OUT TXT ('; Type 1: Substitute #') D CALL OUT OCT (CONST) D4010 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL R50ASC (6,PSNAME(1,NCURPS),NAME) CALL RLD TXT (NAME) CALL RLD TXT ('+') CALL RLD OCT (CONST) GO TO 480 C C------ TYPE 2: Global relocation ------------------------------- C 402 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4020 D CALL NEWLIN D CALL OUT TXT ('; Type 2: Substitute global #') D CALL OUT TXT (NAME) D4020 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) GO TO 480 C C------ TYPE 3: Internal displaced relocation ------------------- C 403 CALL RD WORD (CONST) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4030 D CALL NEWLIN D CALL OUT TXT ('; Type 3: Substitute ') D CALL OUT OCT (CONST) D4030 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD OCT (CONST) GO TO 480 C C------ TYPE 4: Global displaced relocation ---------------------- C 404 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4040 D CALL NEWLIN D CALL OUT TXT ('; Type 4: Substitute global ') D CALL OUT TXT (NAME) D4040 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) GO TO 480 C C------ TYPE 5: Global additive relocation ----------------------- C 405 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) CALL RD WORD (CONST) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4050 D CALL NEWLIN D CALL OUT TXT ('; Type 5: Substitute global #') D CALL OUT TXT (NAME) D CALL OUT TXT ('+') D CALL OUT OCT (CONST) D4050 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) CALL RLD TXT ('+') CALL RLD OCT (CONST) GO TO 480 C C------ TYPE 6: Global additive displaced relocation -------------- C 406 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) CALL RD WORD (CONST) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4060 D CALL NEWLIN D CALL OUT TXT ('; Type 6: Substitute global ') D CALL OUT TXT (NAME) D CALL OUT TXT ('+') D CALL OUT OCT (CONST) D4060 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) CALL RLD TXT ('+') CALL RLD OCT (CONST) GO TO 480 C C------ TYPE 7: Location counter definition ----------------------- C 407 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) CALL RD WORD (CONST) DO 408 I=1,NPSECT II = I IF (PSNAME(1,II).NE.NRAD50(1)) GO TO 408 IF (PSNAME(2,II).NE.NRAD50(2)) GO TO 408 GO TO 409 408 CONTINUE II = 0 C 409 IF (N CUR PS .NE. II) PS OUT = .FALSE. N CUR PS = II PS LOC (N CUR PS) = CONST C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4090 D CALL NEWLIN D CALL OUT TXT ('; Type 7: Location counter ') D CALL OUT TXT ('definition: .=') D CALL OUT TXT (NAME) D IF (CONST.NE.0) CALL OUT TXT ('+') D IF (CONST.NE.0) CALL OUT OCT (VALUE) D4090 CONTINUE C END DEBUG C GO TO 490 C C------ TYPE 10: Location counter modification -------------------- C 410 CALL RD WORD (CONST) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4100 D CALL NEWLIN D CALL OUT TXT ('.=') D CALL R50ASC (6,PSNAME(1,NCURPS),NAME) D CALL SHORTN (NAME) D CALL OUT TXT (NAME) D CALL OUT TXT ('+') D CALL OUT OCT (CONST) D CALL OUT TXT (' ;Type 10') D4100 CONTINUE C END DEBUG C GO TO 490 C C------ TYPE 11: Program limits ----------------------------------- C 411 CALL NEWLIN CALL OUT TXT (' .LIMIT') NTXT = NTXT - 2 GO TO 490 C C------ TYPE 12: P-sect relocation -------------------------------- C 412 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4120 D CALL NEWLIN D CALL OUT TXT ('; Type 12: Substitute PSECT #') D CALL OUT TXT (NAME) D4120 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) GO TO 480 C C------ TYPE 13: Not used ----------------------------------------- C 413 CALL FTL ERR ("41,'RLD type 13 (not used)') C C------ TYPE 14: P-sect displaced relocation ---------------------- C 414 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4140 D CALL NEWLIN D CALL OUT TXT ('; Type 14: Substitute PSECT ') D CALL OUT TXT (NAME) D4140 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) GO TO 480 C C------ TYPE 15: P-sect additive relocation ----------------------- C 415 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) CALL RD WORD (CONST) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4150 D CALL NEWLIN D CALL OUT TXT ('; Type 15: Substitute PSECT #') D CALL OUT TXT (NAME) D CALL OUT TXT ('+') D CALL OUT OCT (CONST) D4150 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) CALL RLD TXT ('+') CALL RLD OCT (CONST) GO TO 480 C C------ TYPE 16: P-sect additive displaced relocation ------------- C 416 CALL RD NAME (NAME,NRAD50) CALL SHORTN (NAME) CALL RD WORD (CONST) C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 4160 D CALL NEWLIN D CALL OUT TXT ('; Type 16: Substitute PSECT ') D CALL OUT TXT (NAME) D CALL OUT TXT ('+') D CALL OUT OCT (CONST) D4160 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR CALL RLD TXT (NAME) CALL RLD TXT ('+') CALL RLD OCT (CONST) GO TO 480 C C------ TYPE 17: Complex relocation expression ---------------------- C 417 CONTINUE C C BEGIN DEBUG D IF (.NOT. DEBUG(34)) GO TO 418 D CALL NEWLIN D CALL OUT TXT ('; Type 17: ') D CALL OUT TXT ('Complex relocation expression:') D CALL NEWLIN D 418 CONTINUE C END DEBUG C N RLD = N RLD + 1 IF (N RLD .GT. MAX RLD) GO TO 999 N B OFF (N RLD) = N R PTR NBUF = 1 4170 CALL RD BYTE (CODE) IF (CODE.GE.0 .AND. CODE.LE."20) GO TO 4171 CALL NEWLIN CALL OUT TXT ('RLD 2: Illegal complex relocation code = ') CALL OUT OCT (CODE) CALL FTL ERR ("17,'Complex relocation code out of range') 4171 CONTINUE C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 419 D CALL NEWLIN D CALL OUT TXT ('; CODE ') D CALL OUT OCT (CODE) D 419 CONTINUE C END DEBUG C GO TO (1400,1401,1402,1403,1404,1405,1406,1407, 1 1410,1411,1412,1413,1414,1415,1416,1417,1420), CODE+1 C 1400 GO TO 4170 1401 CALL OPER ('+') GO TO 4170 1402 CALL OPER ('-') GO TO 4170 1403 CALL OPER ('*') GO TO 4170 1404 CALL OPER ('/') GO TO 4170 1405 CALL OPER ('&') GO TO 4170 1406 CALL OPER ('!') GO TO 4170 1407 GO TO 4170 1410 CALL UNOPER ('-') GO TO 4170 1411 CALL UNOPER ('^C') GO TO 4170 1412 CALL STORE GO TO 480 1413 CALL STORE GO TO 480 1414 CONTINUE 1415 CALL FTL ERR("20,'Complex relocation expression code not used') 1416 CALL RD NAME (NAME) CALL SHORTN (NAME) CALL TSTUFF (NAME) GO TO 4170 1417 CALL RD BYTE (SECTOR) CALL RD WORD (OFFSET) CALL R50ASC(6,PSNAME(1,SECTOR+1),NAME) CALL SHORTN (NAME) NAME(7) = 0 CALL TSTUFF (NAME) IF (OFFSET .EQ. 0) GO TO 4170 CALL TSTUFF ('+') CALL OSTUFF (OFFSET) GO TO 4170 1420 CALL RD WORD (CONST) CALL OSTUFF (CONST) GO TO 4170 C C-------------------------------------------------------------------- C 480 CONTINUE LOC = LOC TXT + RELOC - 4 C C BEGIN DEBUG D IF (.NOT.DEBUG(34)) GO TO 481 D CALL OUT TXT (' At ') D CALL OUT OCT (LOC) D CALL OUT TXT (B) D 481 CONTINUE C END DEBUG C N P OFF (N RLD) = LOC IF (NR PTR .GT. MAX BUF) GO TO 998 N R BUFF (N R PTR) = 0 N R PTR = N R PTR + 1 490 IF (LEN .GT. 0) GO TO 4000 C RETURN C C------------------ Out of RLD buffer space ---------------------- C 998 CALL FTL ERR ("21,'RLD NRBUFF buffer overflow (>512 bytes)') 999 CALL FTL ERR ("22,'RLD NBOFF buffer overflow (>50 RLDs)') RETURN END SUBROUTINE BUILD !Rev 8303.091 C C=============> Build output line for an instruction <================ C IMPLICIT INTEGER (A-Z) C COMMON /INSTR/ INST,NARG,ARG1,ARG2,NWRDS COMMON /MACRO/ MACRO LOGICAL MACRO COMMON /TXT/ N TXT, LOC TXT, TXT(256), INST PS, N TXT OF LOGICAL INST PS LOGICAL VALUE D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C BEGIN DEBUG D IF (.NOT.DEBUG(35)) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';Enter build with NTXT = ') D CALL OUT OCT (NTXT) D 10 CONTINUE C END DEBUG C IF (N TXT .LE. 0) GO TO 1000 N = LOC TXT - N TXT OF * 2 I = 1 20 NARG = 0 IF (.NOT. INST PS) GO TO 222 CALL CHECK (TXT(I)) IF (I .GT. 256) 1 CALL FTL ERR (27,'TXT buffer overflow in BUILD') IF (I+NWRDS .GT. N TXT) GO TO 100 C C BEGIN DEBUG D IF (.NOT.DEBUG(35)) GO TO 22 D CALL NEWLIN D CALL OUT TXT (';BUILD: INST = ') D CALL OUT OCT (INST) D CALL OUT TXT (', NARG = ') D CALL OUT OCT (NARG) D IF (NARG .EQ. 0) GO TO 21 D CALL OUT TXT (', ARG1 = ') D CALL OUT OCT (ARG1) D IF (NARG .EQ. 1) GO TO 21 D CALL OUT TXT (', ARG2 = ') D CALL OUT OCT (ARG2) D 21 CALL CRLF D 22 CONTINUE C END DEBUG C C-------------------- Output listing stuff ---------------------------- C 222 CALL CRLF IF (MACRO) GO TO 30 CALL OUT OCR (N) CALL OUT TXT (' ') CALL OUT OCR (TXT(I)) CALL OUT TXT (' ') NN = 2 IF (NARG .EQ. 0) GO TO 26 IF (NWORD(ARG1) .EQ. 0) GO TO 24 CALL OUT OCR (TXT(I+1)) CALL OUT TXT (' ') NN = 1 24 IF (NARG .NE. 2) GO TO 26 IF (NWORD(ARG2) .EQ. 0) GO TO 26 CALL OUT OCR (TXT(I+2)) CALL OUT TXT (' ') NN = NN - 1 26 IF (NN .EQ. 0) GO TO 30 DO 28 II=1,NN CALL OUT TXT (' ') 28 CONTINUE 30 CONTINUE C C---------------------- Output label, instruction --------------------- C CALL LABEL (N) IF (.NOT.INST PS .OR. INST.EQ.0) GO TO 40 CALL OUT INS (N,INST) N = N+2 I = I+1 IF (NARG .NE. 0) CALL OUT ARG (ARG1,N,I) IF (NARG .EQ. 2) CALL OUT TXT (',') IF (NARG .EQ. 2) CALL OUT ARG (ARG2,N,I) GO TO 50 C 40 CALL OUT ADR (N,I) C 50 IF (I .LE. NTXT) GO TO 20 N TXT = 0 N TXT OF = 0 GO TO 1000 C 100 CONTINUE K = NTXT - I + 1 IF (K.LT.1 .OR. K.GT.100) 1 CALL FTL ERR (28,'Illegal TXT address in BUILD') DO 200 J=1,K TXT(J) = TXT(I+J-1) 200 CONTINUE NTXT = NTXT-I+1 N TXT OF = N TXT C 1000 N RLD = 0 C RETURN END C File name: UNMAC3.FOR !Rev 8301.291 C C*********************** Support routines for UNMAC2 ****************** C SUBROUTINE RLD BLK (RELOC,B,TYPE) !Rev 8205.231 C IMPLICIT INTEGER (A-Z) C B = "40 !ascii space CALL RD BYTE (CODE) TYPE = CODE.AND."177 IF ((CODE.AND."200) .NE. 0) B="102 !ascii B CALL RD BYTE (CODE) RELOC = CODE C RETURN END SUBROUTINE TSTUFF (STRING) !Rev 8301.291 C C============>> Stuff a string in complex buffer <<====================== C COMMON /COMPLX/ NBUF, BUF(100) BYTE BUF BYTE STRING(1) C N = 1 10 LCHAR = STRING(N) IF (LCHAR .EQ. 0) GO TO 20 IF (NBUF .GT. 100) GO TO 99 BUF (NBUF) = LCHAR NBUF = NBUF + 1 N = N+1 GO TO 10 20 IF (NBUF .GT. 100) GO TO 99 BUF(NBUF) = N-1 NBUF = NBUF + 1 RETURN C 99 CALL FTL ERR ("23,'Complex buffer overflow (>100 bytes)') RETURN END SUBROUTINE OSTUFF (NVALUE) !Rev 8301.261 C C==========>> Write a value into the complex buffer <<=================== C COMMON /COMPLX/ NBUF, BUF(100) BYTE BUF BYTE STRING (7) INTEGER SPACE DATA SPACE /"40/, STRING /7*0/ C C----------------------- Translate NVALUE ----------------------------- C N = 1 IF (NVALUE .GE. 0) GO TO 1 N = 6 GO TO 3 1 NCODE = NVALUE 2 NCODE = NCODE/"10 IF (NCODE .EQ. 0) GO TO 3 N = N+1 GO TO 2 3 CONTINUE ENCODE (6,10,STRING) NVALUE 10 FORMAT (O6) C C---------------------- Find first non-zero space --------------------- C N PTR = 1 DO 20 I=1,5 LCHAR = STRING(I) IF (LCHAR .EQ. SPACE) NPTR = NPTR + 1 20 CONTINUE NN = N + NPTR IF (NN.GT.7) NN=7 STRING(NN) = 0 C C------------------------ Output string ------------------------------- C CALL TSTUFF (STRING(NPTR)) C RETURN END SUBROUTINE OPER (STRING) !Rev 8301.202 C C=============>> Position an operator in the complex buffer <<=========== C COMMON /COMPLX/ NBUF, BUF (100) BYTE BUF BYTE STRING(1) C C------------------- Move the last argument out of the way -------------- C NBUF = NBUF - 1 N = BUF (NBUF) M = 100 DO 10 I=1,N NBUF = NBUF - 1 BUF(M) = BUF(NBUF) M = M-1 10 CONTINUE C C-------------Back over the char count of earlier argument-------------- C IF (NBUF.LE.1) GO TO 999 NBUF = NBUF - 1 NN = BUF(NBUF) C C--------------------------Stick in operator----------------------------- C M = 1 20 LCHAR = STRING(M) IF (LCHAR .EQ. 0) GO TO 30 BUF(NBUF) = STRING(M) NBUF = NBUF + 1 IF (NBUF .GT. 100) GO TO 999 M = M + 1 NN = NN + 1 GO TO 20 30 CONTINUE C C-----------------------Replace the first argument----------------------- C M = 101-N DO 40 I=1,N BUF(NBUF) = BUF(M) M = M + 1 NBUF = NBUF + 1 IF (NBUF .GT. 99) GO TO 999 NN = NN + 1 40 CONTINUE C C-------------------------Put in the new count--------------------------- C BUF(NBUF) = NN NBUF = NBUF + 1 C 999 CONTINUE RETURN END SUBROUTINE UNOPER (STRING) C C==============> Put a unary operator in the complex buffer-------------- C COMMON /COMPLX/ NBUF, BUF(100) BYTE BUF BYTE STRING(1) C C--------------------Put in the trailing >------------------------------- C IF (NBUF .EQ. 100) RETURN BUF(100) = '>' C C-------------------Move the last argument------------------------------- C NBUF = NBUF - 1 N = BUF(NBUF) M = 99 DO 10 I=1,N NBUF = NBUF - 1 BUF(M) = BUF(NBUF) M = M - 1 10 CONTINUE C C-------------------Put in the leading <--------------------------------- C BUF(M) = '<' M = M-1 C C---------------------Put in the unary operator-------------------------- C NN = N + 2 M = 1 20 LCHAR = STRING(M) IF (LCHAR .EQ. 0) GO TO 30 BUF(NBUF) = STRING(M) M = M + 1 NBUF = NBUF + 1 IF (NBUF .GT. 100) RETURN NN = NN + 1 GO TO 20 30 CONTINUE C C--------------------Replace the argument-------------------------------- C M = 99-N DO 40 I=1,N+2 BUF(NBUF) = BUF(M) NBUF = NBUF + 1 M = M + 1 40 CONTINUE C C-------------------Put in the new count--------------------------------- C BUF(NBUF) = NN NBUF = NBUF + 1 C RETURN END SUBROUTINE STORE !Rev 8301.192 C C===============> Pass the complex buffer to the RLD buffer <============ C COMMON /COMPLX/ NBUF, BUF(100) BYTE BUF C C---------Move all items to end of buffer, stripping counts-------------- C IF (NBUF .EQ. 1) RETURN M = 100 10 NBUF = NBUF - 1 N = BUF(NBUF) DO 20 I=1,N NBUF = NBUF - 1 BUF(M) = BUF(NBUF) M = M - 1 20 CONTINUE IF (NBUF .GT. 1) GO TO 10 C C-----------Move all text to the beginning of buffer--------------------- C NBUF = 1 NCOUNT = 100 - M M = M + 1 DO 30 I=1,NCOUNT BUF(NBUF) = BUF(M) NBUF = NBUF + 1 M = M + 1 30 CONTINUE C C----------------------Put in the trailing 0----------------------------- C BUF(NBUF) = 0 C C------------------------Pass the string--------------------------------- C CALL RLD TXT (BUF) C RETURN END SUBROUTINE RLD TXT (STRING) !Rev 8212.291 C C===============> Writes a string into RLD buffer <==================== C COMMON /RLD/ NRLD,NRPTR,NPOFF(50),NBOFF(50),NRBUFF(512) BYTE NRBUFF BYTE STRING(1), SPACE DATA SPACE /"40/ C DO 10 N=1,132 LCHAR = STRING(N) IF (LCHAR.EQ. 0) GO TO 20 IF (LCHAR.EQ.SPACE) GO TO 20 N R BUFF (N R PTR) = LCHAR N R PTR = N R PTR + 1 10 CONTINUE 20 CONTINUE C RETURN END SUBROUTINE RLD OCT (NVALUE) !Rev 8301.2410 C C=====> Write a left justified octal value into the RLD buffer <======= C BYTE STRING (7) INTEGER SPACE DATA SPACE /"40/ DATA STRING /6*"40,"200/ C C----------------------- Translate NVALUE ----------------------------- C N = 1 IF (NVALUE .GE. 0) GO TO 1 N = 6 GO TO 3 1 NCODE = NVALUE 2 NCODE = NCODE/"10 IF (NCODE .EQ. 0) GO TO 3 N = N+1 GO TO 2 3 CONTINUE ENCODE (6,10,STRING) NVALUE 10 FORMAT (O6) C C---------------------- Find first non-zero space --------------------- C N PTR = 1 DO 20 I=1,5 LCHAR = STRING(I) IF (LCHAR .EQ. SPACE) NPTR = NPTR + 1 20 CONTINUE NN = N + NPTR IF (NN.GT.7) NN=7 STRING(NN) = 0 C C------------------------ Output string ------------------------------- C CALL RLD TXT (STRING(NPTR)) C RETURN END C File name: UNMAC4.FOR !Rev 8303.091 C C******************** Support routines for UNMAC2 ********************* C SUBROUTINE LABEL (I) !Rev 8303.091 C C=======================> Fill the label field <======================= C IMPLICIT INTEGER (A-Z) C C------------------------------- COMMONS ----------------------------- C COMMON /GLOBLS/ NGLBLS,GNAME(2,400),GFLAGS(400),GVALUE(400), 1 GPSECT(400) BYTE GFLAGS,GPSECT COMMON /LABELS/ NLABEL,LABL PS(2,1000),LABL OF(1000), 1 PL NAME(2),L OFF COMMON /PSECTS/ NPSECT,PSNAME(2,100),PSFLAG(100),PSVALU(100) BYTE PSFLAG COMMON /PSECT2/ N CUR PS, N OLD PS, CUR PS(8), PS LOC(100) BYTE CUR PS COMMON /XFR/ XFR ADR, XFR NAM(2), STARTF LOGICAL STARTF C C--------------------------LOCAL VARIABLES --------------------------- C BYTE STRING(9) DATA STRING /9*0/ DATA BIT3, BIT5 /"10,"40/ C C===================================================================== C-------------------------- Check for start -------------------------- C IF (STARTF) GO TO 100 IF (XFRNAM(1) .NE. PS NAME(1,N OLD PS)) GO TO 100 IF (XFRNAM(2) .NE. PS NAME(2,N OLD PS)) GO TO 100 IF (I .NE. XFR ADR) GO TO 100 CALL OUT TXT ('START') STARTF = .TRUE. GO TO 1000 100 CONTINUE C C------------------- Look for subroutine name table ------------------- C IF (NGLBLS .EQ. 0) GO TO 300 IF (NGLBLS .GT. 400) CALL FTL ERR (29,'NGLBLS > 400 in LABEL') DO 200 II=1,NGLBLS NP = GPSECT (II) IF (NP .NE. N OLD PS) GO TO 200 VALUE = GVALUE(II) IF (I .NE. VALUE) GO TO 200 FLAGS = G FLAGS (II) IF ((FLAGS.AND.BIT3).EQ.0) GO TO 200 IF ((FLAGS.AND.BIT5).EQ.0) GO TO 200 CALL R50ASC (6,GNAME(1,II),STRING) DO 110 III = 6,2,-1 N = III IF (STRING(N).NE."40) GO TO 120 110 CONTINUE 120 STRING(N+1) = ':' STRING(N+2) = ':' N = N+2 130 CONTINUE STRING(N+1) = 0 CALL OUT TXT (STRING) IF (N.LT.8) CALL OUT TXT (' ') RETURN 200 CONTINUE 300 CONTINUE C C---------------------- Look for branch label ----------------------- C IF (NLABEL .EQ. 0) GO TO 500 DO 400 II=1,NLABEL IF (LABLPS(1,II).NE.PSNAME(1,NOLDPS)) GOTO 400 IF (LABLPS(2,II).NE.PSNAME(2,NOLDPS)) GOTO 400 IF (LABL OF(II).NE.I) GO TO 400 CALL OUT OCT (I) CALL OUT TXT ('$') GO TO 1000 400 CONTINUE 500 CONTINUE C C-------------------------- No label found --------------------------- C CALL OUT TXT (' ') RETURN C C---------------- Do extra processing for real labels ---------------- C 1000 CALL OUT TXT (': ') RETURN END SUBROUTINE CHECK (NEXT) !Rev 8301.245 C C=====> Examine the next instruction to determine the arguments <===== C C NOTE: If you want to understand what is going on in this C subroutine, take a look at a PDP11 numerical op C code list. C IMPLICIT INTEGER (A-Z) C COMMON /INSTR/ INST, NARG, ARG1, ARG2, NWRDS C C===================================================================== C NARG = 0 ARG1 = 0 ARG2 = 0 INST = NEXT IF (INST .LT. 0) GO TO 10 C C-------Instructions with bit 15=0 C IF (INST.GE."10000 .AND. INST.LT."70000) GO TO 200 IF (INST.LT."100) GO TO 1000 I = INST/"100 IF (I.EQ.2) GO TO 1000 IF (I.GE.4 .AND. I.LT."40) GO TO 1000 IF (I.EQ."64) GO TO 1000 IF (I.GE."700 .AND. I.LT."750) GO TO 300 IF (I.GE."750) GO TO 1000 GO TO 100 C C------Instructions with bit 15=1 C 10 IN = INST.AND."77777 IF (IN.GE."10000 .AND. IN.LT."70000) GO TO 200 IF (IN.LT."5000) GO TO 1000 IF (IN.LT."10000) GO TO 100 C C------Floating point instructions C IF (IN.LT."70100) GO TO 1000 IF (IN.LT."71000) GO TO 100 NARG = 2 ARG2 = (INST.AND."300)/"100 + "100 ARG1 = INST .AND. "77 IF (IN.LT."74000) GO TO 1000 IF (IN.GE."74400 .AND. IN.LT."75000) GO TO 1000 IF (IN.GE."76400) GO TO 1000 TEMP = ARG1 ARG1 = ARG2 ARG2 = TEMP GO TO 1000 C C------Process one-argument instructions C 100 NARG = 1 ARG1 = INST.AND."77 GO TO 1000 C C------Process two-argument instructions C 200 NARG = 2 ARG2 = INST.AND."77 ARG1 = (INST.AND."7777)/"100 GO TO 1000 C C------Process arithmetic operations C 300 NARG = 2 ARG1 = INST.AND."77 ARG2 = (INST.AND."777)/"100 C C------Compute the number of extra words included with instuction C 1000 CONTINUE NWRDS = NWORD(ARG1)+NWORD(ARG2) C RETURN END FUNCTION NWORD (N) !Rev 8301.243 C C=======> Compute the number of words required by an argument <========= C NWORD = 0 IF (N .GE. "60 .AND. N .LT. "100) NWORD = 1 IF (N .EQ. "27) NWORD = 1 IF (N .EQ. "37) NWORD = 1 IF (N .EQ. "67) NWORD = 1 IF (N .EQ. "77) NWORD = 1 C RETURN END SUBROUTINE OUT ARG (ARG,N,I) !Rev 8301.246 C C==================> Output an instruction argument <================== C IMPLICIT INTEGER (A-Z) C MODE = ARG/"10 R = ARG.AND.7 IF (ARG.EQ."27) GO TO 20 IF (ARG.EQ."37) GO TO 30 IF (ARG.EQ."67) GO TO 60 IF (ARG.EQ."77) GO TO 70 GO TO (10,11,12,13,14,15,16,17,100),MODE+1 10 CALL OUT REG (R) RETURN 11 CALL OUT TXT ('(') CALL OUT REG (R) CALL OUT TXT (')') RETURN 12 CALL OUT TXT ('(') CALL OUT REG (R) CALL OUT TXT (')+') RETURN 13 CALL OUT TXT ('@') GO TO 12 14 CALL OUT TXT ('-(') CALL OUT REG (R) CALL OUT TXT (')') RETURN 15 CALL OUT TXT ('@') GO TO 14 16 CALL OUT ADR (N,I) CALL OUT TXT ('(') CALL OUT REG (R) CALL OUT TXT (')') RETURN 17 CALL OUT TXT ('@') GO TO 16 C 20 CALL OUT TXT ('#') CALL OUT ADR (N,I) RETURN 30 CALL OUT TXT ('@#') CALL OUT ADR (N,I) RETURN 60 CALL OUT ADR (N,I) RETURN 70 CALL OUT TXT ('@') CALL OUT ADR (N,I) RETURN C 100 R = ARG .AND. 3 CALL OUT TXT ('AC') CALL OUT OCT (R) RETURN C END SUBROUTINE OUT REG (R) !Rev 8301.053 C C==================> Output a register expression <=================== C IMPLICIT INTEGER (A-Z) C NREG = R.AND.7 IF (NREG.EQ.6) GO TO 60 IF (NREG.EQ.7) GO TO 70 CALL OUT TXT ('R') CALL OUT OCT (NREG) RETURN 60 CALL OUT TXT ('SP') RETURN 70 CALL OUT TXT ('PC') RETURN C END SUBROUTINE OUT ADR (N,I) !Rev 8302.011 C C===========> Output next argument from TXT or RLD buffer <=========== C IMPLICIT INTEGER (A-Z) C COMMON /RLD/ NRLD,NRPTR,NPOFF(50),NBOFF(50),NRBUFF(512) BYTE NRBUFF COMMON /TXT/ N TXT, LOC TXT, TXT(256), INST PS, N TXT OF LOGICAL INST PS BYTE CHAR(4) EQUIVALENCE (CHAR(1),CHARS) C IF (NRLD .EQ. 0) GO TO 200 C DO 100 J=1,NRLD NN = N P OFF(J) IF (NN .NE. N) GO TO 100 M = NBOFF(J) 10 LCHAR = NRBUFF(M) M = M+1 IF (LCHAR .EQ. 0) GO TO 300 CALL OUT TXT (LCHAR) GO TO 10 100 CONTINUE C 200 IF (N .NE. (N/2)*2) GO TO 210 CALL OUT OCT (TXT(I)) GO TO 230 210 CHARS = TXT(I) CALL OUT TXT ('.BYTE ') LCHAR = CHAR(1) LCHAR = LCHAR.AND."377 CALL OUT BYT (LCHAR) CALL OUT TXT (',') LCHAR = CHAR(2) LCHAR = LCHAR.AND."377 CALL OUT BYT (LCHAR) C 230 IF (INST PS) GO TO 300 CALL OUT TXT (' ;') NOUT = 0 CHARS = TXT(I) DO 250 II=1,2 LCHAR = CHAR(II) LCHAR = LCHAR .AND. "377 IF (LCHAR .GE."177) GO TO 240 IF (LCHAR .LT. "40) GO TO 240 CALL OUT TXT (LCHAR) NOUT = NOUT + 1 GO TO 250 240 CALL OUT TXT ('<') CALL OUT OCT (LCHAR) CALL OUT TXT ('>') NOUT = NOUT + 3 IF (LCHAR .GE. "10) NOUT = NOUT + 1 IF (LCHAR .GE. "100) NOUT = NOUT + 1 250 CONTINUE C DO 260 II=NOUT,15 CALL OUT TXT (' ') 260 CONTINUE C LCHAR = TXT(I) K = R50ASC (3,LCHAR,CHAR) CHAR(4) = 0 CALL OUT TXT (CHAR) C 300 I = I+1 N = N+2 RETURN C END SUBROUTINE OUT INS (NADR,INSTR) !Rev 8303.091 C C===================> Output an instruction code <==================== C IMPLICIT INTEGER (A-Z) C COMMON /FPI/ RFLAG,IFLAG LOGICAL RFLAG,IFLAG C INST = INSTR IF (INST.LT. 0) GO TO 500 IF (INST.GE."10000) GO TO 100 IF (INST.GE. "5000) GO TO 45 IF (INST.GE. "400) GO TO 30 IF (INST.GE. "100) GO TO 20 IF (INST.GT. 6) RETURN C C Misc. instructions C GO TO (10,11,12,13,14,15,16),INST+1 10 CALL OUT TXT ('HALT') RETURN 11 CALL OUT TXT ('WAIT') RETURN 12 CALL OUT TXT ('RTI') RETURN 13 CALL OUT TXT ('BPT') RETURN 14 CALL OUT TXT ('IOT') RETURN 15 CALL OUT TXT ('RESET') RETURN 16 CALL OUT TXT ('RTT') RETURN C 20 IN = INST/"100 GO TO (21,22,23),IN 21 CALL OUT TXT ('JMP') GO TO 1005 22 IF (INST.GT."240) GO TO 24 IF (INST.EQ."240) CALL OUT TXT ('NOP') IF (INST.GE."210) RETURN CALL OUT TXT ('RTS ') CALL OUT REG (INST) RETURN 23 CALL OUT TXT ('SWAB') GO TO 1004 24 I = INST.AND."17 IF (I.EQ."17) GO TO 28 N = 0 I = INST.AND.1 IF (I.EQ.0) GO TO 25 IF (INST.LT."260) CALL OUT TXT ('CLC') IF (INST.GE."260) CALL OUT TXT ('SEC') N = 1 25 I = INST.AND.2 IF (I.EQ.0) GO TO 26 IF (N.EQ.1) CALL OUT TXT (',') IF (INST.LT."260) CALL OUT TXT ('CLV') IF (INST.GE."260) CALL OUT TXT ('SEV') N = 1 26 I = INST.AND.4 IF (I.EQ.0) GO TO 27 IF (N.EQ.1) CALL OUT TXT (',') IF (INST.LT."260) CALL OUT TXT ('CLZ') IF (INST.GE."260) CALL OUT TXT ('SEZ') N = 1 27 I = INST.AND."10 IF (I.EQ.0) RETURN IF (N.EQ.1) CALL OUT TXT (',') IF (INST.LT."260) CALL OUT TXT ('CLN') IF (INST.GE."260) CALL OUT TXT ('SEN') RETURN 28 IF (INST.EQ."257) CALL OUT TXT ('CCC') IF (INST.EQ."277) CALL OUT TXT ('SCC') RETURN C C Branch instructions C 30 IF (INST.GE."4000) GO TO 40 IN = INST/"400 GO TO (31,32,33,34,35,36,37),IN 31 CALL OUT TXT ('BR ') GO TO 38 32 CALL OUT TXT ('BNE ') GO TO 38 33 CALL OUT TXT ('BEQ ') GO TO 38 34 CALL OUT TXT ('BGE ') GO TO 38 35 CALL OUT TXT ('BLT ') GO TO 38 36 CALL OUT TXT ('BGT ') GO TO 38 37 CALL OUT TXT ('BLE ') GO TO 38 38 OFFSET = INST .AND. "377 IF (OFFSET .GE. "200) OFFSET = OFFSET - "400 OFFSET = 2*(OFFSET+1) + NADR CALL OUT TXT (' ') CALL OUT OCT (OFFSET) CALL OUT TXT ('$') RETURN C C JSR C 40 CALL OUT TXT ('JSR ') REG = (INST.AND."777)/"100 CALL OUT REG (REG) CALL OUT TXT (',') RETURN C C Single argument instructions C 45 IF (INST.GE."7000) RETURN IN = INST/"100 - "47 GO TO (50,51,52,53,54,55,56,57,60,61,62,63,64,49,49,67),IN 49 RETURN 50 CALL OUT TXT ('CLR') GO TO 68 51 CALL OUT TXT ('COM') GO TO 68 52 CALL OUT TXT ('INC') GO TO 68 53 CALL OUT TXT ('DEC') GO TO 68 54 CALL OUT TXT ('NEG') GO TO 68 55 CALL OUT TXT ('ADC') GO TO 68 56 CALL OUT TXT ('SBC') GO TO 68 57 CALL OUT TXT ('TST') GO TO 68 60 CALL OUT TXT ('ROR') GO TO 68 61 CALL OUT TXT ('ROL') GO TO 68 62 CALL OUT TXT ('ASR') GO TO 68 63 CALL OUT TXT ('ASL') GO TO 68 64 CALL OUT TXT ('MARK ') NN = INST - (INST/"100)*"100 CALL OUT OCT (NN) RETURN 67 CALL OUT TXT ('SXT') 68 IF (INSTR.GT.0) GO TO 1005 CALL OUT TXT ('B') GO TO 1004 C 100 IF (INST.LT."75040) GO TO 110 IF (INST.LT."77000) RETURN NN = INST.AND."77 REG = (INST.AND."777)/"100 CALL OUT TXT ('SOB ') CALL OUT REG (REG) CALL OUT TXT (',.-') CALL OUT OCT (2*NN-2) RETURN 110 IF (INST.LT."75000) GO TO 140 REG = INST.AND.7 IN = (INST.AND."77)/"10 + 1 GO TO (120,121,122,123),IN 120 CALL OUT TXT ('FADD') GO TO 130 121 CALL OUT TXT ('FSUB') GO TO 130 122 CALL OUT TXT ('FMUL') GO TO 130 123 CALL OUT TXT ('FDIV') 130 CALL OUT TXT (' ') CALL OUT REG (REG) RETURN 140 IF (INST.LT."70000) GO TO 170 REG = (INST.AND."777)/"100 IN = (INST.AND."7777)/"1000 + 1 GO TO (150,151,152,153,154),IN 150 CALL OUT TXT ('MUL ') GO TO 160 151 CALL OUT TXT ('DIV ') GO TO 160 152 CALL OUT TXT ('ASH ') GO TO 160 153 CALL OUT TXT ('ASHC') GO TO 160 154 CALL OUT TXT ('XOR ') 160 CALL OUT TXT (' ') RETURN C C Two argument instructions C 170 IN = INST/"10000 GO TO (171,172,173,174,175,176),IN 171 CALL OUT TXT ('MOV') GO TO 177 172 CALL OUT TXT ('CMP') GO TO 177 173 CALL OUT TXT ('BIT') GO TO 177 174 CALL OUT TXT ('BIC') GO TO 177 175 CALL OUT TXT ('BIS') GO TO 177 176 CALL OUT TXT ('ADD') 177 IF (INSTR.GE.0) GO TO 1005 CALL OUT TXT ('B') GO TO 1004 C C Instructions with bit 15=1 C 500 INST = INSTR.AND."77777 IF (INST.GE."70000) GO TO 900 IF (INST.GE."10000) GO TO 800 IF (INST.GE. "5000) GO TO 700 IF (INST.GE. "4000) GO TO 640 I = (INST.AND."3777)/"400 + 1 GO TO (600,604,610,614,620,624,630,634),I 600 CALL OUT TXT ('BPL ') GO TO 38 604 CALL OUT TXT ('BMI ') GO TO 38 610 CALL OUT TXT ('BHI ') GO TO 38 614 CALL OUT TXT ('BLOS') GO TO 38 620 CALL OUT TXT ('BVC ') GO TO 38 624 CALL OUT TXT ('BVS ') GO TO 38 630 CALL OUT TXT ('BCC ') GO TO 38 634 CALL OUT TXT ('BCS ') GO TO 38 C 640 IF (INST.LT."4400) CALL OUT TXT ('EMT ') IF (INST.GE."4400) CALL OUT TXT ('TRAP ') I = INST.AND."377 CALL OUT OCT (I) RETURN C 700 IF (INST.LT."6400) GO TO 45 IF (INST.LT."6700) CALL OUT TXT ('MTPS') IF (INST.GE."6700) CALL OUT TXT ('MFPS') RETURN C 800 IF (INST.LT."60000) GO TO 170 CALL OUT TXT ('SUB') GO TO 1005 C C Floating point instructions C 900 IF (INST .GE. "70100) GO TO 930 I = INST.AND."17 IF (I .GT. 2) GO TO 920 GO TO (910,911,912),I+1 910 CALL OUT TXT ('CFCC') GO TO 1004 911 CALL OUT TXT ('SETF') RFLAG = .TRUE. GO TO 1004 912 CALL OUT TXT ('SETI') IFLAG = .TRUE. GO TO 1004 C 920 GO TO (921,922),I-"10 921 CALL OUT TXT ('SETD') RFLAG = .FALSE. GO TO 1004 922 CALL OUT TXT ('SETL') RFLAG = .FALSE. GO TO 1004 C 930 IF (INST .GE. "71000) GO TO 940 I = (INST .AND. "700)/"100 GO TO (931,932,933,934,935,936,937),I 931 CALL OUT TXT ('LDFPS') GO TO 1003 932 CALL OUT TXT ('STFPS') GO TO 1003 933 CALL OUT TXT ('STST') GO TO 1004 934 IF ( RFLAG) CALL OUT TXT ('CLRF') IF (.NOT.RFLAG) CALL OUT TXT ('CLRD') GO TO 1004 935 IF ( RFLAG) CALL OUT TXT ('TSTF') IF (.NOT.RFLAG) CALL OUT TXT ('TSTD') GO TO 1004 936 IF ( RFLAG) CALL OUT TXT ('ABSF') IF (.NOT.RFLAG) CALL OUT TXT ('ABSD') GO TO 1004 937 IF ( RFLAG) CALL OUT TXT ('NEGF') IF (.NOT.RFLAG) CALL OUT TXT ('NEGD') GO TO 1004 C 940 I = (INST.AND."7400)/"400 GO TO (941,942,943,944,945,946,947,948,949,950,951,952, 1 953,954),I-1 941 CALL OUT TXT ('MUL') GO TO 2004 942 CALL OUT TXT ('MOD') GO TO 2004 943 CALL OUT TXT ('ADD') GO TO 2004 944 CALL OUT TXT ('LD') GO TO 2005 945 CALL OUT TXT ('SUB') GO TO 2004 946 CALL OUT TXT ('CMP') GO TO 2004 947 CALL OUT TXT ('ST') GO TO 2005 948 CALL OUT TXT ('DIV') GO TO 2004 949 CALL OUT TXT ('STEXP') GO TO 1003 950 CALL OUT TXT ('STC') GO TO 2100 951 CALL OUT TXT ('STC') GO TO 2200 952 CALL OUT TXT ('LDEXP') GO TO 1003 953 CALL OUT TXT ('LDC') GO TO 2100 954 CALL OUT TXT ('LDC') GO TO 2200 C 2004 IF ( RFLAG) CALL OUT TXT ('F') IF (.NOT.RFLAG) CALL OUT TXT ('D') GO TO 1004 2005 IF ( RFLAG) CALL OUT TXT ('F') IF (.NOT.RFLAG) CALL OUT TXT ('D') GO TO 1005 2100 IF ( IFLAG) CALL OUT TXT ('I') IF (.NOT.IFLAG) CALL OUT TXT ('L') IF ( RFLAG) CALL OUT TXT ('F') IF (.NOT.RFLAG) CALL OUT TXT ('D') GO TO 1003 2200 IF ( RFLAG) CALL OUT TXT ('FD') IF (.NOT.RFLAG) CALL OUT TXT ('DF') GO TO 1003 C C------------------------------------------------------------------- C 1008 CALL OUT TXT (' ') RETURN 1005 CALL OUT TXT (' ') RETURN 1004 CALL OUT TXT (' ') RETURN 1003 CALL OUT TXT (' ') RETURN C END !ASS RK2 WF !RUN RK1:F77 !UNMACR=UNMACR/F:256. !UNMACO=UNMACO/F:256. !UNMACI=UNMACI/F:256. !UNMAC0=UNMAC0/F:256. !UNMAC1=UNMAC1/F:256. !UNMAC2=UNMAC2/F:256. !UNMAC3=UNMAC3/F:256. !UNMAC4=UNMAC4/F:256. !^C R LINK UNMAC7,UNMAC7=UNMACR,UNMACO,UNMACI,RK1:F77OTS// UNMAC0,UNMAC1/O:1 UNMAC2,UNMAC3,UNMAC4/O:1 // ^C bbbbx? &f)eB J%@& fE7 ʋ, A6w 4Ά zVHANDL-F-Window errorXfzXf4 XfB_ Zf_ g_ dh_ h_ Ll_  Zf ~OP P R P P P P P 67 07 7 \7 - 0 2 dX .l1&d1@7r1 7n1f  &wZ1f4  w@1f4      v   7 t7f v H ~m|7zf pl7f7c 4 P-L @-<f $ $[  t, -"101 10 \Q 0 eA5 4Y 0 vS0  (Wf FY RS w@  !7e /f4 h `  Vf X RQ wN@  !7:4e R/f4 @7B/ 7>/ m0/ȋ-///1A5 / @7 / 7/m.71  -  f R  Uf W Qf (  Uf W Qf @7P. 7L.,(m>.7   -   m.7 m-0---\ -` ,\ f f `,-d-d-R,-N,j >,p 0,..`-\".\ FLD3 B->.---=+\ -,,\ +- 6-  |D& ~P5 0U 8Pb^=E Lfv x L~ Lv BW .  .-P,   @7t, 7p,@7p, 7l,h,7-7f, b,f05 8,R,eL,05 $wB,w>,f45 -,0f  *3= * z*?UNMAC-F-Error , Error occurred at block , count Block contents: V f j         " .       First byte of RT data block not 1Data block > 256 wordsData block < 1 word   D , D H <5>5.END START       IOAA$: called with D.STAT = IOAA$: formatted recordIOAA$: unformatted recordIOAA$: calling coroutine with W.VTYP = ITEMSZ = VARAD = A.SIZB = COUNT = IOAA$: got element with ITEMSZ= , VARAD= , COUNT= ADE:7 % b %e ee e  (@[  &&f ( E3  ߆ %  І %Ć BB  (,($ ,($;( (,(TT(` 3`ȥ ȕ$ȥ+ `l s(F Ps`(A Fs(,(9(5,R,-, 3% 0As* : e 83e  < "(TtŀpՀlgcB ;  Ye 0@ 3`J3 Xe & $(VwNwP3e  " R d3 *3 `3 X (Te  ",e.,P3 d XE% % % 5%% a 3a R Xwv <5@ @  \E5e73e *,(T(T ?,(T (Tҕ (Tx?^96%  ^tr  $%^ %^ \%^\3,% e3VsXZ(3VsX NsZ%% %2 >s\%2%4 *sP\XdV(&Z$ e N Ne5@ Х,  (N? %\N Nc( %e U%!%  2 4e %2\%6\\*e |%B%.D ^RwA??`A?R l^  BE&~WtEB~V@  Dsaw\+. ?%V,,R^D` B~ĵ\R^&@%S%.S@ DRA?V ?`Aj?  $J J N   - ΋  BE~WtEB~w . ?%V&@R^ w w Е `CBwzД~wr ^R @` C~;; :88999498988X9;;;;;;;;; ;;P;b;b;b;b;69>9F9H9P988;;;;;;;<(0+  "1""$BBDBBDB  @@>0@6@AtCnC@A Ee f  z % % e@ `5 & & D  6N D D eD e`D %   &fH”E  D   D 慡e BCE DIEN   ` ɕ = -5+-` #"   A s&DE s& sA ae0b  ~ҕ*~%  0   -+% v&EEU-`5 6! 6 BN~ ; R 2R + E      R~e eE R~  )E 5%% W!%&W!0 E -6vAQ~Ue B@E DEIC D `6 0a  0 .< |EM   % ee0bv  @`ae ҕ*~ ~  0   ~e  f U  DtEEEEl77P|E7NOtc`c_[Uzb?Err 59 USR not lockedlnrhjT U8U@ XX(@_Invalid error callNot enough memory for OTS tablesOdd address trapSegment faultT-bit or BPT trapIOT trapReserved instruction trapNon-FORTRAN error call TRAP instruction trap PDP-11/40 FIS trap FPP hardware fault FPP illegal opcode trap FPP undefined variable trapFPP maintenance trapInvalid logical unit numberNo available channelsInput record too longBACKSPACE errorEnd-of-fileRecord number outside rangeAccess mode not specifiedToo many records in I/O statementClose errorNo such fileOpen failureMixed file access modes Duplicate file specifications!ENDFILE error"Unit already open#Random I/O to non-file structured device$Attempt to access non-existent record%Inconsistent record length&Error during write'Error during read(Recursive I/O operation)No buffer room*No such device+File name specification error,Inconsistent record type-Keyword value error in OPEN statement.Inconsistent OPEN/CLOSE parameters/Write to readonly file0Unsupported I/O operation1REWIND error2Hard I/O error3List-directed I/O syntax error4Infinite format loop5Format/variable-type mismatch6Syntax error in format7Output conversion error8Input conversion error9Format too big for 'FMTBUF':Output statement overflows record;Record too small for I/O list7 >VFw0w.e(7 ( 5 EEE 爄DplFtw& dF5   5`R&  vFhF &!IzE&t@&E(~&RP!0 De"  m  3 s e |B P~F `   ߉&5 D 3,5E 0    4  $ ",$,"es 5D3 v & fFA BU%D~  F  v耖% v& ~ n{lb3 3 n3 d 3UvE0@A tDj ܨ+ & E w Dl|ʋ3r3 &l|Հ5 pn  NAw 6DD& e(3!w&f&f U@$w &3 d5   UUU nw{w q5 V B&f n 551 d h Uw &O N#err & s eWp(eAar '< w && d%&&f ̋4O 7 5-55 ) $ť+#ť ť1 ť0 ť$ 3 ŋ 3 ̋  5(& 5Ε -  ̋ Ş(({( \mU :  > e"t $̋mU 54 & PmEs s fy Py -ft Μ0|yft `s ` f u lt Dy jy b nJ(t " \:>t y 8Py 4 <-vft 6b0|yfu Dt f u vt y y t t 6y -L -S  -S @ 76ɇd&  Zy h p7 --̾z7-̰g7x-̞ -j@ 7-̈ -R@ 7|̇JT7 V̇-DD,u "-46,u ^஀ 7̮̇x Į  by x Į re 7 r  rju plu ju xju Xpu xz|x-tnT7fD , $  by 62 777"7eju ؚtu xu *u u u u Лu z -ju ju , x r pjy , 4t7nlh7b`v .v Nv 6v v 6v v v 87 <8-4 ڬ Ԭ jy    27777m v v n$v (v ,v ~0v (4v n8v v Lv ,4v 8v .v bv Z Bv Ěv -z v v 6v Ҙv vN & v v v xv w ڛw h7+ w \w ,  - w w w Hw Vw & <w tw lw Lw lw dw Lw ,w L7  e07 w w ,w $w w  f -b w wL H 0yy  < -8 D( b& " 7y   -   Od Kw xw w w w $wP  0y4  w, -x  l  h x K t tps hb¤ V -R J 7,1 7, 1  0 -, r  (-$dx x   1 1 2 7,2  2-w Vx vw nx fw 4x Tw Lx Dx <w tx ,-@w2 wy x޾"- wl e17py y "y By :27 w2A @@77 y -y @ @ww t"y ܒ-pb&y ̒RZ@ @wTw F*y -B2.y ",@ @w&w 2y -6y p@ @ww :y R->y B By 4Fy Бy y Jy  -wy 쐇 Input filename:   - ?UNMAC-W-Can not find input file. Try again.  (FORTRAN error " on unit ")  Output filename:   . ?UNMAC-W-Can not open output file. Try again.  (FORTRAN error " on unit ") + Do you want a listing (L) or a source (S)?   Filename too longtt<5|yfyy >5|yLg; OBJECT LIBRARY; MODULE BLOCK OFFSET;  .u@uZu^uyyybuyfuy; RSX LIBRARY; Entry Point Table; NAME BLOCK OFFSET; ; Module Name Table; MODULE BLOCK OFFSETuuuuyyuyuyuyuuPASS1: Illegal identification code = Data block ident. code out of rangeyDvylv LllLlllLllLlLl;GSD 1: Illegal type = GSD entry type out of range .TITLE ;Floating point register assignments:AC=%; Internal symbol name, value = More than 400 globals More than 100 PSECTS. .IDENT // .VSECT / ;length = . 32-word blocksyyzzzvvv$mmn4nXnn*oLovyvwz"w&w>w`wJwzwdw~wwwwwMore than 1000 labels  zz8x"xRLD 1: Illegal type = RLD entry type out of range "zJx$z~xbxz1z1 .GLOBL == .PSECT ,RW,RO,I,D,LCL,GBL,ABS,REL,CON,OVR ;Length = =.@zx*zxxxxxxxxxxxxxLzy|y{y    x*z. ABS.  @ @ISF$: calling $INITIOISF$: jumping to $FIOISF$: GFMTRC: calling $GETSISF$: GFMTRC: return with length = , BLBUF = ^ ` z"w (B`$D3 v HfA BU%D~    v뀖% ve 5E  n{lb3 3 n3  ȋ35(Uv vA WBA U v@ 4~ r 7 ,7 +7 007 `-7 .27 , 0 dl+V X x-Z+Y-R+V -B+V 4V N\ @ $+-+V ` \ \d jj* & PV T *V V *V  *V 7 * *V V 6 0 7*ˆ ƈ |*-v*ʈ ̈ ˆ Ј -N*  8*7 *  + 7*** -*d. ^*  **z.*27)E A w`0-*** e17P0 4 &6 F: >**-))4 > ))7)B F fF* e ---J - N)- F J71)7 ** L-.)-&) h  $ 2( ؊ Ɵ z*-v*(wj* f*0) e172/ j܊  ؊ w\ ܊ *-*|(w~ * *0܊ h w$؊ 6 )-)L(wN) )0؊ w ܊ )-)(w) )0܊ w `܊ j؊ r)-n)'wb) ^)0܊  ؊ wl ܊ ؊ n ")-)'w) )0܊ p  h ؊ w ܊ ʛ؊ .>'-:'-2'2'.' 7,1 '7, 1' '-'-7 '-''7 &&'' &w؊ w  :+w ܊ & 6(-2(&w&( "(0܊ w@  ܜ܊ 暷 '-'X&wZ' '0܊ Dw ܊ ؊  '-'&w' '0܊  ؊ <w T܊ ^؊ f'-b'%wV' R'0܊  ؊ w` .'-*'%w' '0P, x ~%-x%  И l zL% & ` & * . |2 r6 h& P: F ,M "H> ܊ ,܊ 6܊ D H x$ e 17+ 8܊ 7r$܊  ~$w H w؊ &؊ w(m6$7B$% 1̓-%$ %0 % wL 0R ( N(wJ* @(w##7 + .*# e74* Z-# ֔#m*7 'wL Ve  # 72*7)e)  Ȗd# *1 h ))e) N 0#-L* 2 )t)en)  ^ " ""-"" ċ > "-""  )$ )!ȋ e" " )΋  -)֋ -)ڋ  -p"&w|7 &7 (.&V" 7V" -N"d V:"0"  `  "T& wL&wN(7 " f ֘!E==!Bf !@7( 7(!!m(7! -L(dD(1 <( !-2(d ~! $(1 (f ph! \!wV!R! r7H!  >!"b f  a7!7 ! !7! `!7 4a ea('f @7' 7' T'P' 7 d   4'0' 1  -'M '' 7r h d m&w` &1 &-&d/ > > 2 e7* & -"  &1 &-&c -~& t&@7.& 7*&-`&d>& P&L& c  6&2&t  7< e77|xm%wt %1 ^ %-%d Pc@7>8e!(%1 %  !7% %-~%d n%j% 7- P%L%1  --.%$%d7 -$1 $ r r-nn$0 & @7$ 7$JFm$7> 2 b1 Z - w  r7  * ff 77  !7`!74e#fޘ   -1- 1w/ fZ Z~wn u-f^ #6-2v#a*7$7 XR 7w/IK770B70? e 7#f  e-::e2fd -fh n t-p" :54"Z-V"+N  1,11, 1. =,0)wL"f l   -F"fh 䎅fp ֎7 "7 "7 "w" |"1-v"-n"pw-f"@w0Z" r@7 w  w 4w  f vD"E7h  pB f 2 @p` r,!!E? r@e@7!!Ew!-xD-y-z<-}8w7!w!1!!E7!'x!r!E7p!f!E r@7Z!P!J!E7F!>!E r@74!ft &fx e7! W/0W/@W/W/W/7W/?@ < A r7AEwW/zW/wW/7w(W/?w6 & Zf hf  R f t 4 df Vf H  8f *wbw^f "   f ꋅf ܋wwf fČ wwf wwf f vwwf p@E7pfȌ D @E7P  f֌ ڌ fތ f  0:-.& 7̓-707  wf  -A r @/@ e7f $@ 7tf Df7l7i  (K7P7M  uf 7 .@ 7Ւ77 - - f  f  J e- -@  -- f X -@ 7nf n7f7U" $ ewH Dw-:w-. wj-"wf-@>-d & pft fx f| f f ~f pf b r@7& f <wb -jf "-Tf  f w* $E7 w27 E7  f -f E7 !-f x-f d-f P|E7x !-rf &-Xf -Dfď 4*E7& -f ҆-fȏ -f̏ -fЏ -fԏ -] r7؏& f R)f D"f 6f (f  f f 0E  @of ΅ j f E r@7f X - r@'7& ۇf: Rlf> DefB 6^fF (WfJ PfN IfR BfV ;fZ ℅4f^ Ԅ-fb Ƅ&ff fj  r@twfn *fr x wfv bw z0 ~E7E r@7pfz $ ~ R &Nf  & z:E7 E r 7& pf f  f f f  @ pAE r@7E r 7~& f 0f "f  f f f 삅 r7& fΐ Ƃ"fҐ f֐ fڐ  fސ f  wfv jw@E7 pwF w  r NE r 7b& f wf wf wf ⁅wf ҁwf wf wf w- f - f vE7f - w- f$ <-n f( (-X`w0f, w4-<@pJ4E70 $0 & f8 ؀w f< Ȁwf@ wD & DfJ 7 څwfN v7 ƅw- rw E? r@7 R& fb <w~ff ,wnfj wP hfn  Vfr w( @fv  .fz w f~  f w f  ބf |w E r7  & f L\f >Uf 0Nf "Zf, @fҐ 9f ~Ef ~+f ~wfđ ~Bfđ ~`fȑ ~zf̑ ~-f̑ ~K fБ ~ Ѓfԑ n~R fБ Z~ fԑ H~8 fؑ 4~ fܑ "~ rfБ ~ `fԑ }! Lf } :f }f }f }f } PASS2: Illegal identification code = Data block ident. code out of rangeR.fgfg8gfTgGSD 2: Illegal entry type = GSD entry type out of range zN CUR PS out of range in TXT 2 .PSECT .=.+TXT record > 256 bytes ֈ"$&RLD 2: Illegal RLD type = RLD entry type out of range + .LIMITRLD type 13 (not used)!RLD 2: Illegal complex relocation code = Complex relocation code out of range-*/&!^CComplex relocation expression code not usedRLD NRBUFF buffer overflow (>512 bytes)RLD NBOFF buffer overflow (>50 RLDs)68:T:pDiiijm@mJmTm^mhmhmpmmmFHrJvTXT buffer overflow in BUILD ,Illegal TXT address in BUILDvXNztv~NptNPvNPNP\Complex buffer overflow (>100 bytes)    STARTNGLBLS > 400 in LABEL $: .J4RTVtv())+@-(#@#AC yy2yPy^y|yyyVzҒ|~RSPPČԒΌҌ.BYTE , ;<> ֒֒HALTWAITRTIBPTIOTRESETRTTJMPNOPRTS SWABCLCSEC,CLVSEVCLZSEZCLNSENCCCSCCBR BNE BEQ BGE BLT BGT BLE $JSR CLRCOMINCDECNEGADCSBCTSTRORROLASRASLMARK SXTBSOB ,.-FADDFSUBFMULFDIV MUL DIV ASH ASHCXOR MOVCMPBITBICBISADDBPL BMI BHI BLOSBVC BVS BCC BCS EMT TRAP MTPSMFPSSUBCFCCSETFSETISETDSETLLDFPSSTFPSSTSTCLRFCLRDTSTFTSTDABSFABSDNEGFNEGDMULMODLDSTDIVSTEXPSTCLDEXPLDCFDILFDDF || }}(}6}D}&,26:>Dj}z}}HLPZ`dhjnrvz~Tbp~Tbp~ĀҀRR.ƍʍ΍ҍ֍ڍލ  "(v.4:@F &LPTX\`ăԃdjpv|΄ބĎ0ʎЎjz…֎܎ Zhvʆچ $(,26<@BDFHLPZ` 2  *NC File name: UNMACD.FOR !Rev 8301.301 C C This module provides diagnostic support for UNMAC. C C***************************************************************** C SUBROUTINE Q DEBUG !Rev 8301.301 C COMMON /LUN/ LUN IN, LUN OUT, LUN TT COMMON /REWIND/ RWND FL, DO RWND LOGICAL RWND FL, DO RWND COMMON /DEBUG/ DEBUG(50) LOGICAL DEBUG C WRITE (LUN TT,10) 10 FORMAT(//' UNMAC has been compiled with diagnostic support.'/ 1 ' You may selectively turn on diagnostics for some of the'/ 2 ' routines in the program.'//) C DO 20 I=1,50 DEBUG(I) = .FALSE. 20 CONTINUE RWND FL = .FALSE. C WRITE (LUN TT,30) 30 FORMAT(' Do you want any diagnostics? ',$) IF (NO()) RETURN WRITE (LUN TT,40) 40 FORMAT(' Diagnostics for UNMACR routines? ',$) IF (NO()) GO TO 50 CALL DQUERY (1,'MD INIT') CALL DQUERY (2,'NXT MOD') 50 CONTINUE C WRITE (LUN TT,60) 60 FORMAT (' Diagnostics for UNMAC0 routines? ',$) IF (NO()) GO TO 70 CALL DQUERY (3,'LIB FND') CALL DQUERY (4,'RT LIB') CALL DQUERY (5,'RSX LIB') 70 CONTINUE C DEBUG(10) = .FALSE. WRITE (LUN TT,110) 110 FORMAT (' Diagnostics for UNMACI routines? ',$) IF (NO()) GO TO 120 DEBUG(10) = .TRUE. CALL DQUERY (11,'GET BLK') CALL DQUERY (12,'RD NEXT') CALL DQUERY (13,'RD NAME') CALL DQUERY (14,'RD WORD') CALL DQUERY (15,'RD BYTE') 120 CONTINUE C WRITE (LUN TT,210) 210 FORMAT (' Diagnostics for UNMAC1 routines? ',$) IF (NO()) GO TO 220 CALL DQUERY (21,'PASS 1 ') CALL DQUERY (22,'GSD 1 ') CALL DQUERY (23,'TXT 1 ') CALL DQUERY (24,'RLD 1 ') 220 CONTINUE C WRITE (LUN TT,310) 310 FORMAT(' Diagnostics for UNMAC2 routines? ',$) IF (NO()) GO TO 320 CALL DQUERY (31,'PASS 2 ') CALL DQUERY (32,'GSD 2 ') CALL DQUERY (33,'TXT ') CALL DQUERY (34,'RLD ') CALL DQUERY (35,'BUILD ') 320 CONTINUE C WRITE (LUN TT,400) 400 FORMAT (' Do you want to REWIND after each module? ',$) RWND FL = .NOT. NO() C RETURN END SUBROUTINE DQUERY (N,STRING) !Rev 8301.121 BYTE OUT(10),STRING(1) COMMON /DEBUG/ DEBUG(50) LOGICAL DEBUG,NO COMMON /LUN/ LUN IN, LUN OUT, LUN TT C DO 10 I=1,8 LCHAR = STRING(I) IF (LCHAR.EQ.0) GO TO 20 OUT(I) = LCHAR K = I 10 CONTINUE C 20 OUT(K+1) = '?' OUT(K+2) = ' ' K = K+2 C DO 40 I=1,K WRITE (LUN TT, 30) OUT(I) 30 FORMAT (1H+,A1,$) 40 CONTINUE C IF (NO()) GO TO 50 DEBUG(N) = .TRUE. 50 CONTINUE C RETURN END LOGICAL FUNCTION NO(IDUMMY) !Rev 8205.181 C COMMON /LUN/ LUN IN, LUN OUT, LUN TT C BYTE IANS C READ (LUN TT,10) IANS 10 FORMAT (A1) NO = IANS.NE.'Y' C RETURN END C File Name: UNMACI.FOR !Rev 8302.021 C C********** All input routines for UNMAC are in this file ********** C SUBROUTINE GET BLK !Rev 8302.021 C C GET BLK gets the next data block from the input file. On C return the data block is in variable RECORD of common C /RECORD/ and the length of the data block is in the variable C LENGTH of common /RECORD/. C C In RT-11, object modules are made up of formatted binary C blocks. A formatted binary block is a sequence of 8-bit C bytes arranged as follows: C C ------------------------------ C | 1 | C ------------------------------ C | 0 | C ------------------------------ C | Low order byte of length | C ------------------------------ C | High order byte of length | C ------------------------------ C | . | C | . | C | Data block | C | . | C | . | C ------------------------------ C | Checksum byte | C ------------------------------ C C The length includes all bytes except the checksum. The C checksum byte is the negative of the sum of all preceeding C bytes. Formatted binary blocks may be separated by a C variable number of null (0) bytes. C C For RSX object modules the structure is similar except C that the first two bytes and the checksum are omitted. Thus, C the length of the binary block is shorter by 3. Note, C however, that when FLX is used to copy an RSX object to C an RT-11 formatted device, the binary records are modified C by FLX to look exactly like RT-11 formatted binary records C by adding the first two bytes and the checksum, and changing C the length appropriately. C IMPLICIT INTEGER (A-Z) C C------------------------------ COMMONS ------------------------------ C COMMON /RECORD/ LEN, NXT CHR, RECORD (256) BYTE RECORD COMMON /SYSTEM/ SYSTEM, RT,RSX C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C-------------------------- LOCAL VARIABLES -------------------------- C BYTE INB(2) EQUIVALENCE (INB(1),IN) C C===================================================================== C------------------ If RT-11, do some extra stuff -------------------- C IF (SYSTEM .NE. RT) GO TO 20 C C Look for RT-11 header bytes, skipping over nulls C 10 CALL RD NEXT (CODE) IF (CODE.EQ.0) GO TO 10 IF (CODE.NE.1) 1 CALL FTL ERR (1,'First byte of RT data block not 1') CALL RD NEXT (CODE) C 20 CONTINUE C C---------------- Get the length of the binary block ----------------- C CALL RD NEXT (N) INB(1) = N CALL RD NEXT (N) INB(2) = N LEN = IN C C BEGIN DEBUG D IF (.NOT.DEBUG(11)) GO TO 30 D CALL NEWLIN D IF (SYSTEM.EQ.RT)CALL OUT TXT(';GET RT BLK of length ') D IF(SYSTEM.EQ.RSX)CALL OUT TXT(';GET RSX BLK of length ') D CALL OUT INT (LEN) D 30 CONTINUE C END DEBUG C C------- Correct the length for the stuff that is stripped off ------- C IF (SYSTEM.EQ.RT) LEN = LEN-4 C C--------------------------- Check bounds ---------------------------- C IF (LEN .GT. 256) CALL FTL ERR (2,'Data block > 256 words') IF (LEN .LE. 0) CALL FTL ERR (2,'Data block < 1 word') C C-------------- Put the data block in the RECORD array --------------- C DO 40 I=1,LEN CALL RD NEXT (CODE) RECORD (I) = CODE 40 CONTINUE C C--------------- If RSX and LEN odd, read another byte --------------- C IF (SYSTEM.EQ.RSX .AND. (LEN.AND.1).NE.0) CALL RD NEXT(CODE) C C-------------------- If RT-11, skip the checksum -------------------- C NOTE: If someone would like to put in the appropriate code C to verify the checksum, please do it. C IF (SYSTEM .EQ. RT) CALL RD NEXT (CODE) C C------------------ Reset pointers into RECORD array ------------------ C NXT CHR = 1 C RETURN END SUBROUTINE RD NEXT (VALUE) !Rev 8301.291 C C===========>> Gets the next byte from the input buffer <<=========== C IMPLICIT INTEGER (A-Z) C COMMON /INPUT/ BLOCK,COUNT,INPUT(512) BYTE INPUT COMMON /LUN/ LUN IN, LUN OUT, LUN TT D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C---------------- If a new block is needed, read it ---------------- C IF (COUNT.LE.512) GO TO 20 BLOCK = BLOCK + 1 READ (LUNIN'BLOCK,END=100) INPUT COUNT = 1 C C BEGIN DEBUG D IF (.NOT.DEBUG(10)) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';RD NEXT - Block ') D CALL OUT OCT (BLOCK) D 10 CONTINUE C END DEBUG C 20 CONTINUE C C---------------------- Get the byte value ----------------------- C VALUE = INPUT (COUNT) VALUE = VALUE .AND. "377 COUNT = COUNT + 1 C C BEGIN DEBUG D IF (.NOT.DEBUG(12)) GO TO 30 D CALL NEWLIN D CALL OUT TXT (';RD NEXT - Byte: ') D CALL OUT OCT (VALUE) D 30 CONTINUE C END DEBUG C RETURN C C====================>> End of input file <<==================== C 100 CONTINUE CALL END ALL C C BEGIN DEBUG D IF (.NOT.DEBUG(10)) GO TO 110 D CALL NEWLIN D CALL OUT TXT (';RD NEXT - Close files and exit') D CALL CRLF D CALL CRLF D 110 CONTINUE C END DEBUG C CLOSE (UNIT=LUNIN) CLOSE (UNIT=LUNOUT) CALL EXIT END SUBROUTINE END ALL !Rev 8301.111 C C======================> Write the .END <========================== C IMPLICIT INTEGER (A-Z) C COMMON /XFR/ XFR ADR, XFR NAM(2), STARTF LOGICAL STARTF C C------------------------------------------------------------------ C CALL CRLF CALL NEWLIN CALL OUT TXT ('.END') IF (XFR ADR .NE. 1) CALL OUT TXT (' START') CALL CRLF CALL CRLF C RETURN END SUBROUTINE RD NAME (NAME,NRAD50) !Rev 8301.291 C C===========>> Returns a name from the record <<=================== C BYTE NAME(7),NRAD50(4) C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C------------- Get four bytes of RAD50 string --------------------- C CALL RD WORD (NRAD50(1)) CALL RD WORD (NRAD50(3)) C C------------------ Convert to ASCII ------------------------------ C CALL R50ASC (6,NRAD50,NAME) NAME(7) = 0 C C BEGIN DEBUG D IF (.NOT.DEBUG(13)) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';RD NAME: ') D CALL OUT TXT (NAME) D 10 CONTINUE C END DEBUG C RETURN END SUBROUTINE RD WORD (NVALUE) !Rev 8206.171 C C===>> Returns a word value from next two bytes of the record <<=== C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG BYTE INB(2) EQUIVALENCE (IN,INB(1)) C C------------------------------------------------------------------- C CALL RD BYTE (N) INB(1) = N CALL RD BYTE (N) INB(2) = N NVALUE = IN C C BEGIN DEBUG D IF (.NOT.DEBUG(14)) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';RDWORD: ') D CALL OUT OCT (NVALUE) D 10 CONTINUE C END DEBUG C RETURN END SUBROUTINE RD BYTE (VALUE) !Rev 8206.171 C C===============>> Gets the next byte from the record <<=============== C IMPLICIT INTEGER (A-Z) C COMMON /RECORD/ LEN, NXT CHR, RECORD(256) BYTE RECORD C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C--------------------------------------------------------------------- C VALUE = RECORD (NXT CHR) NXT CHR = NXT CHR + 1 LEN = LEN - 1 C C BEGIN DEBUG D IF (.NOT.DEBUG(15)) GO TO 10 D CALL NEWLIN D CALL OUT TXT (';RD BYTE: ') D CALL OUT OCT (VALUE) D 10 CONTINUE C END DEBUG C RETURN END C File Name: UNMACO.FOR !Rev 8302.051 C C All output routines for UNMAC are in this file C C******************************************************************** C SUBROUTINE FTL ERR (N,STRING) !Rev 8202.051 C C====================>> FATAL ERROR HANDLER <<===================== C IMPLICIT INTEGER (A-Z) C COMMON /INPUT/ BLOCK, COUNT, INPUT(512) BYTE INPUT BYTE STRING(1) C CALL CRLF CALL OUT TXT ('?UNMAC-F-Error ') CALL OUT OCT (N) CALL OUT TXT (', ') CALL OUT TXT (STRING) CALL CRLF CALL OUT TXT (' Error occurred at block ') CALL OUT OCT (BLOCK) CALL OUT TXT (', count ') CALL OUT OCT (COUNT) CALL CRLF CALL CRLF CALL OUT TXT ('Block contents:') DO 20 I = 0,31 NN = I*16 CALL NEWLIN CALL OUT OCR (NN) CALL OUT TXT (' ') DO 10 J = 1,16 NNN = NN + J CALL OUT TXT (' ') LOUT = INPUT(NNN) LOUT = LOUT.AND."377 CALL OUT BYT (LOUT) 10 CONTINUE 20 CONTINUE CALL CRLF C CALL EXIT END SUBROUTINE NEWLIN !Rev 8205.181 C C=======>> Output new line and if a listing also four tabs <<======== C COMMON /MACRO/ MACRO LOGICAL MACRO C CALL CRLF IF (.NOT.MACRO) CALL OUT TXT (' ') C RETURN END SUBROUTINE CRLF !Rev 8302.021 C C=================>> Flushes the output buffer <<=================== C COMMON /LUN/ LUN IN, LUN OUT, LUN TT COMMON /OUTPUT/ OUT(132), NOUT BYTE OUT D COMMON /REWIND/ RWND FL, DO RWND D LOGICAL RWND FL, DO RWND C BYTE SPACE DATA SPACE /"40/ C C---------------- If buffer is empty, put in a space ---------------- C IF (NOUT.NE.1) GO TO 10 OUT(1) = SPACE NOUT = 2 10 CONTINUE C C--------------------------- Write it out --------------------------- C NOUT = NOUT - 1 D IF (DO RWND) REWIND LUN OUT D DO RWND = .FALSE. WRITE (LUN OUT, 20) (OUT(I),I=1,NOUT) 20 FORMAT (132A1) C C----------------- Reset pointer for next character ----------------- C NOUT = 1 C RETURN END SUBROUTINE OUT INT (NVALUE) !Rev 8301.291 C C========>> Writes an integer value into the output file <<========= C BYTE STRING (7), SPACE DATA STRING /7*0/, SPACE /"40/ C C------------------------ Translate NVALUE ------------------------- C ENCODE (6,10,STRING) NVALUE 10 FORMAT (I6) C C---------------------- Find first non space ----------------------- C N PTR = 1 DO 20 I=1,5 LCHAR = STRING(I) IF (LCHAR .EQ. SPACE) N PTR = N PTR + 1 20 CONTINUE C C------------------------ Output the string ------------------------ C CALL OUT TXT (STRING(N PTR)) CALL OUT TXT ('.') C RETURN END SUBROUTINE OUT OCT (NVALUE) !Rev 8301.291 C C===>> Write a left justified octal value into the output file <<=== C BYTE STRING (7), SPACE DATA STRING /7*0/, SPACE /"40/ C C------------------------- Translate NVALUE ------------------------- C ENCODE (6,10,STRING) NVALUE 10 FORMAT (O6) C C----------------------- Find first non space ----------------------- C N PTR = 1 DO 20 I=1,5 LCHAR = STRING(I) IF (LCHAR .EQ. SPACE) N PTR = N PTR + 1 20 CONTINUE C C-------------------------- Output string --------------------------- C CALL OUT TXT (STRING(N PTR)) C RETURN END SUBROUTINE OUT TXT (STRING) !Rev 8302.021 C C==========>> Move a string of text to the output buffer <<========== C COMMON /OUTPUT/ OUT(132), NOUT BYTE OUT BYTE STRING(1) C C-------------------------------------------------------------------- C N = 1 10 IF (STRING(N).EQ.0) RETURN IF (NOUT.GT.132) NOUT = 132 OUT(NOUT) = STRING(N) NOUT = NOUT + 1 N = N + 1 GO TO 10 C END SUBROUTINE OUT GBL (NAME) !Rev 8301.291 C C Writes NAME to output file, padding it out with spaces to C six characters, then adds two additional spaces. C BYTE NAME(1), STRING(9), SPACE DATA STRING/9*0/, SPACE/"40/ C C---------------------------- Output name ---------------------------- C DO 20 I = 1,6 II = I LCHAR = NAME(I) STRING(I) = LCHAR IF (LCHAR .EQ. 0) GO TO 30 20 CONTINUE II = 7 C 30 CONTINUE C C---------------------------- Add spaces ----------------------------- C DO 40 J =II,8 STRING(J) = SPACE 40 CONTINUE C C------------------------- Output the string ------------------------- C CALL OUT TXT (STRING) C RETURN END SUBROUTINE OUT OCR (NVALUE) !Rev 8301.261 C C===>> Writes a right justified octal value into the output file <<=== C BYTE STRING(7) DATA STRING /7*0/ C C--------------------------------------------------------------------- C ENCODE (6,10,STRING) NVALUE 10 FORMAT (O6) CALL OUT TXT (STRING) C RETURN END SUBROUTINE OUT BYT (NVALUE) !Rev 8301.261 C C====>> Writes a right justified byte value to the output file <<==== C BYTE STRING(4) DATA STRING /4*0/ C C-------------------------------------------------------------------- C ENCODE (3,10,STRING) NVALUE 10 FORMAT (O3) CALL OUT TXT (STRING) C RETURN END SUBROUTINE SHORTN (STRING) !Rev 8302.031 C C============>> Strip trailing spaces from a string <<============= C BYTE STRING(1), SPACE DATA SPACE /"40/ C C--------------------------- Find the end --------------------------- C N = 1 10 LCHAR = STRING(N) IF (LCHAR .EQ. 0) GO TO 20 N = N+1 IF (N.GE.7) GO TO 20 GO TO 10 20 CONTINUE C C----------------------- Back up over spaces ------------------------ C 30 N = N-1 IF (N.EQ.0) GO TO 40 LCHAR = STRING(N) IF (LCHAR .EQ. SPACE) GO TO 30 40 CONTINUE C C---------------------- Put a null at the end ---------------------- C STRING(N+1) = 0 RETURN END C File Name: UNMACR.FOR !Rev 8302.051 C C************************ MAIN MODULE FOR UNMAC ************************ C PROGRAM UNMAC !Rev 8301.291 C C*********************** UNMAC Version 1.0 ***************************** C C 'UNMAC' decodes an RT-11 or RSX-11 object file into an assembly C language source or listing as desired. The input object file C may be in library format, and also may contain several object C modules. C C Decoding is performed by making two passes through each object C module of the input file. The first pass gathers information C about globals and how to assign addresses and allocate memory. C The second pass completes the decoding. C C NOTE: This program was written as an attempt to provide better C tools to span all of DEC's operating systems. Since C decoding is not likely to be performed very often, the C intent of this program is not to provide the fastest C possible program (which would probably result in a C difficult to read MACRO source), but to provide a C thouroughly documented and well structured program in a C high-level language so that others may easily be able C to understand what is involved in the decoding process. C If you are able to improve this code in any way, send C me a listing of your changes and I will see that they C get installed in future releases. C C Written by Robert Walraven C Dept. of Applied Science C University of California C Davis, CA 95616 C 916/752-0360 C C********************************************************************** C CALL ONCE !Once-only initialization CALL QUERY !Find out what user wants to do. IF (LIB FND ()) CALL GET DIR !If input is a library file, C ! get the library directory. 10 CALL MD INIT !Initialize module data. CALL PASS1 !Scan module first time. CALL PASS2 !Then again. CALL NXT MOD !Reset pointers for next module GO TO 10 C END SUBROUTINE MD INIT !Rev 8302.031 C C=======>> Initialize parameters for the next object module <<======= C IMPLICIT INTEGER (A-Z) C C------------------------------ COMMONS ----------------------------- C COMMON /FPI/ RFLAG,IFLAG LOGICAL RFLAG,IFLAG COMMON /GLOBLS/ NGLBLS, GNAME(2,400), GFLAGS(400), GVALUE(400), 1 GPSECT(400) BYTE GFLAGS, GPSECT COMMON /INPUT/ BLOCK, COUNT, INPUT(512) BYTE INPUT COMMON /LABELS/ NLABEL, LABL PS(2,1000), LABL OF(1000), 1 PL NAME(2), L OFF COMMON /MACRO/ MACRO LOGICAL MACRO COMMON /PSECTS/ NPSECT, PSNAME(2,100), PSFLAG(100), PSVALU(100) BYTE PSFLAG COMMON /RECORD/ LEN, NXT CHR, RECORD(256) BYTE RECORD COMMON /SAVE/ SAV BLK, SAV CNT COMMON /SYSTEM/ SYSTEM, RT, RSX COMMON /XFR/ XFR ADR, XFR NAM(2), STARTF LOGICAL STARTF C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG C C---------------------- LOCAL VARIABLES AND DATA ----------------------- C DATA SAV BLK/1/, SAV CNT/0/ !Start of current module DATA BLOCK/0/, COUNT/513/ !These values force an initial read DATA RT/1/, RSX/2/ !System codes C C======================================================================= C C BEGIN DEBUG D IF (DEBUG(1)) CALL NEWLIN D IF (DEBUG(1)) CALL OUT TXT (';MDINIT called') C END DEBUG C LEN = 0 !Empty record buffer N GLBLS = 0 !No GLOBLS found yet N LABEL = 0 !No labels found yet N PSECT = 0 !No PSECTS found yet DO 10 I=1,100 !Zero psect switches PS VALU (I) = 0 10 CONTINUE C C......................... Floating Point Flags ......................... C RFLAG = .TRUE. !TRUE = REAL, FALSE = DOUBLE IFLAG = .TRUE. !TRUE = INTEGER, FALSE = LOGICAL C RETURN END SUBROUTINE NXT MOD !Rev 8302.051 C C==============> Set pointers to start of next module <============== C IMPLICIT INTEGER (A-Z) C C----------------------------- COMMONS ------------------------------ C COMMON /LIB/ FND LIB LOGICAL FND LIB COMMON /INPUT/ BLOCK, COUNT, INPUT(512) BYTE INPUT COMMON /SAVE/ SAV BLK, SAV CNT C D COMMON /DEBUG/ DEBUG(50) D LOGICAL DEBUG D COMMON /REWIND/ RWND FL, DO RWND D LOGICAL RWND FL, DO RWND C C=================================================================== C C BEGIN DEBUG D IF (DEBUG(2)) CALL NEWLIN D IF (DEBUG(2)) CALL OUT TXT (';NXT MOD - Reset pointers ') D IF (DEBUG(2)) CALL OUT TXT ('for next module') D CALL CRLF D IF (RWND FL) DO RWND = .TRUE. C END DEBUG C SAV CNT = COUNT SAV BLK = BLOCK C RETURN END FORTRAN UNMACR/NOLINE FORTRAN UNMACO/NOLINE FORTRAN UNMACI/NOLINE FORTRAN UNMAC0/NOLINE FORTRAN UNMAC1/NOLINE FORTRAN UNMAC2/NOLINE FORTRAN UNMAC3/NOLINE FORTRAN UNMAC4/NOLINE R LINK UNMAC=UNMACR,UNMACO,UNMACI// UNMAC0,UNMAC1/O:1 UNMAC2,UNMAC3,UNMAC4/O:1 // ^C DEL UNMAC*.OBJ/NOQ RUN UNMAC FORTRAN UNMACR/NOLINE/ONDEBUG FORTRAN UNMACO/NOLINE/ONDEBUG FORTRAN UNMACI/NOLINE/ONDEBUG FORTRAN UNMAC0/NOLINE/ONDEBUG FORTRAN UNMACD/NOLINE/ONDEBUG FORTRAN UNMAC1/NOLINE/ONDEBUG FORTRAN UNMAC2/NOLINE/ONDEBUG FORTRAN UNMAC3/NOLINE/ONDEBUG FORTRAN UNMAC4/NOLINE/ONDEBUG R LINK UNMACD=UNMACR,UNMACO,UNMACI// UNMAC0,UNMACD,UNMAC1/O:1 UNMAC2,UNMAC3,UNMAC4/O:1 // ^C DEL UNMAC*.OBJ/NOQ RUN UNMACD   Qs`D Da E / 4,0z8>Y`;m+OD 0"Y`;h*Sfm+RD 0:hwh8hh w8hhzhwzhOB  @a H V NN&LNEm+SD 0,8hhzhhp4Ca K VLNvm+VD 0dshszhs8hhl@a H VA @  CECDAB&LɉLNv>m+WD 04z8hhzzhzh"<@a&& V@fLlj NԪm+RD 06#S8hh#Szh#Sh>@a  VEC&LANԪ>m+UD 0**S8hh*Szh*Sh2@a&& V&LNm+RD 0 XzhXhX8hh(AaA & LvWPm+vDsz@#Sz@ 0g?hgAhgAhg8h.g:h2gS;h>@a ,  %ȉ L& @a &  & 6 6& ) @&   36^r|&&7 &6&7 6 e &   @67 %Le҉n#Sz$#SzVsz~~Wm+wD#@_M@ 0gqhgshgsh,gh4ghgh8ghFghgh@a H  V@a H  V @a H  VA &ff  &L@j_Mp#|A҉ NW9m+UD 0lg8hg:hgS;ht@a    p Cp fLƉ L   Le  L҉LM~W@m+WD*Sz@ 0 g8h&g:h*gS;h g?hg?h>gAh gAhgAhBgAh6  @a   @a  @a   V <4v@&ff & 5| 7   7 eLv& Lvv& & LeB  "*Sz6*Sz  Ɖ҉~Wqm+vD 0g:h:gS;hLg?hg?hgAh gAhgAhgAh"g8h,g8h0g:h6gS;hH  @a     @a    W@ v   @v.|v@ @@fL҉w^WPsm+xD_M@@ 0PgqhgshgshX@a H VA &ff  L@A҉|2_M8e~W8m+QD`@P@,@ p:@9x@_M@#Sz@@ 0g[hghgSh@a & e&&fv6 & f& & 6&7  &6 &6 &7 <2P<9x@,L_MZ#Szbl p:v`|#Sz|% %%L~ϫgm+SD 0hzh:hzh,hzkhLhzshdhzh|hzhhzhhzh hz+hT&L&LBPPPPLf&f&BCPPPPLe !!!L^J|e  !!!LeK LNm+SD 0 hzh8hh(Ca &  ULeFm+RD 0PhXf& % b %e ee e   ](@}Fm+QD 0BheJ Հ e  C b @` `  aZ@9/ $#.-F@F m+PD"@ 0T@F h\  A!B~!AB~CaD!A#B~aABaB~R ">@m+OD 0@h& &ef&f C ~ C  ~ C ~ e| (N]m+SD@ @ 0gh  B ~܉w FÜm+SD @ 0") h* B" 5Bl"މ4  >?]m+SD 0$h,-   eۉe>ɪom+SD 0RsQhKZ& 5C&C ݉ pDpB^>ɪpm+SD 0~sQ8h& 5 ݉p & & ݉pp`pp Bppp b& |>ɪ^m+RD 0sQ[h55@e &fEeeaa& @@ ݉"pCb@q  Aqp|p b>ɪfm+PD 0|sQh55@e &fEeeaa& @@ ݉"pCb@q pRVӪm+VD@@ 0RhR8h fqqe  CeB   &BE@eDe`` $ pbLq~ D &&|pqDqqw݉[ V@Qm+VD,0z@YBxHq 0"@Qh WhC* %߉,0z,0zv4am+PD9s@ :Eh:FhjHhzh0 9XhNh9s 則~9sm+~D,0z@@YBxHqsa@ 0dxUhdQhdh,dSh*dxXZ]fh|($ҕ C~$s(s`$( f" fۀlw (   H  "26L7 #P!Z#d n"v6i;z: ( "  H X(!6i;#$ ."~]m+D,0z@Ϋ(@YBxHq :pf]h4::(:t:t:t:t:g  &&f  E3  ߆ %  І %Ć  Ϋ( |BB  (,($ ,($;( (,(TT(` 3`ȥ ȕ$ȥ+ `l s5(F Ps`(A Fs(,(9(5,R,-, 3% 0As* : e 83e *t < "(TtŀpՀlgcB ;  Ye 0@ 3`J3 Xe & !$(VwNwP3e  " R d3 *3 `3 X (Te  ",e.,lP3 d XE% % % 5%% a 3a R Xwv <5@ @  \E5Qe73e *,(T(T ,(T (Tҕ (Tx^9 6: p:\d6%  ^tr  $%^ %^ \%^\3,% e3VsXZ(3VsX NsZ%% %2 >s\%2%4 *sP\XdV(&Z$\ e N Ne5@ Х,  (N %\N Nc( %e  D:bU%!%  2 4e %2\%6\\*e |%B%.D ^RTwA`AR l^  BE&~WtEB~V  saw\+, : : : ^:j,0z&. %V,,R^D` B~ĵ\R^%S%.S  : d: v:*LRAV `AX  $J J N   - ΋  BE$,0z : : ":X~WtEB~w . %VR^ w w Е `CBwzД~w *: >:n*Dr ^R @` C~h:f&VX^.d>R~ :V :X :^ : :. : :d : : :> : : :R : : &Z`fQ~ : : : : : : : :Z :` :f : : : : :<f<(0+  "1""$BBDBBDB ev : : : : : : : : :f : : : : :E N:< F :F^}m+D,0z@@YBxHq 0'KhD & & ~ե W(I3 .3 03 2 @ A Zaz090 ` ` 2,0z6| A x !!+!1!D!R!X!.!1!4!5h.2b3_/Z3/VwT3 . 2O.K E    s/ c ^ |Y3s3 0 0,0$. F 0F; 6f II 4t < R@  ~* 2  .32 .5 U 3!~ ~  .5 2  . 2.ͥLͥR   N f. : Ns. ( @.$l   ,s..wfե 0ͥ9ee w @   ͥNͥZ   wI ww ͥPͥS w w wfե W0ե9ե.ե W0ͥ9" d fե WEW0ե9ͥ,ͥ/ͥ)ե. ե Wͥ9& ,-+:$')(/.,   $ $   & &   ( ( !p ! * *!   , ,     . .8 8L  0 08 8I   2 2Lr L; " 4 4Lp L> $ 6 6^\ ^- & 8 88   ( : :nH n   * < <^V ^ 0  , > >  . @ @ #~ #0 B BHf H]V7) m+zD,0z@@YBxHq 0:x hF &&50WtE % s^sRlsb 3l^R,Rb3 ,0zb,0zX$|3R3^ ? ,0zT~7%!m+zD,0z@"@@ @YBxHq 0H:th:h:Bh:xFT\ jr|       ^3R& eR3 B " 08"FN"R,0zr,0zX3  ы &3R^3   $,0z(,0z@,0zJ [V7m+UD,0z@@YBxHq 0:Éh &WtE &%  s^ : 3  l^R,Rb 3 Z ,0zP,0zj&|33t 3b>kL+wm+OD :kL+whZ~h~m+D,0z@YBxHq@F @ :pph~h:L:(:t:t:t:g " RE , ` D* (%sX 3 X 4 X R@ . R8| X R/A3`ÜW&fw  @ A BC &f&  ":/ &:3 <:P f&&( B A @ "!   B      T  V@ U&^fE& t J(j/B,A'@(. (@FD~ H %) <% B%& &  D@F >:F r:e %% %  4 "' "'B f& (  ,0zbl v @   U% N @ %   ( )  (  e M& p&,0zP,0zm P,N  ( ( R1; D~1AF~ ,(L    " ( , 2:; >:Ad($(:fSA) )C+ +W''S$  ,/*)EeDd.TtFfvXm+{D,0z@YBxHq :pXh:,:(:t:t:t]:g3* R5- 3 \\  ^,( 3Zl(3 $,( "^R   .: 2: z:M|{"lZ(,($  (Z` (ZB` R~(Z\*& & & &   :&,0z`#(  3(Z(ҕ ҕ((  @(ҕ,(lZ $ "R^`( | )( ( Xt B (D3(~( ҕ $ &f( "(ҕ R~(%:f4   x^ : : : : ": $: &: (:  *:x ,: .:H~vqm+VD 0vh!h&h0%h*hnhhh h #h$h$:"h~  &ef& v cc6 6` 6N}sm+wD,0z@YBxHq 0""wh@B A?W nvm+QD 0vh}A@EAV머`m+xD6}@ $m@ 0^머`hf=7 @   7@f > 77&щ:,@ $mH6}PT @>oQm+RD 0 oQh\AQ$@A>Zm+UD 0Zh=@f^^m+}D 0^h 7Lh_Mh 0h = = & . @? @W@@e BPBAC~ e: *| Ӊ(1@r5@?U?*@ڪAr?[F<m+SD 0.:h hT6 D@ @/   Ċ&HV<m+UD 0BѪX\h:h hɪؚh1J& & UB] ]@΋΋Š &f>`^m+WD 0`^hA&=@&|F:m+SD 00n:h:h8  =@@@f Vp:m+xD6}@ $m@ 0Np:hV=@7  @f ^@ &щ" : $mD6} @^pm+wD 06}hbphThPh(=} YAA@%A@ (@щ@7= 1@ W@@0PV|@ 7 @ @R  PBPC~&k&  8l0IA@?0@׳@ >:L]L?ƪ@&F9xm+VD $m@ 0B9xhmJD  L T @f    2 $mp^=m+UD`@ p:@#Sz@@ 04=h<Ef &> &> &7   p:$`*#Sz^D^m+wDP@,@9x@_M@ 04D^h<EfU & f& &pP9x,*_M>Eem+RD 0EehrCCC>GYm+RD 0GYhFCeNGxm+QD@ 0zGxh=@E ? Cf &> @ 7C  ; @AC~@&ȉQ0&0@L \1@r;s*>@@d^Kp:m+WD`@ p:@@ 0j;`hKp:h7r& Ef &> &Q$ W@@@@V  &Cf%Bf& p:`,VK$mm+yD $m@,@9x@ 0ZK$mhibEf & f&@ u@@W@f  &9x,* $mA>axm+RD 0axhCE Va+m+xDzy@n @ 0ba+hj =7 @"  7@f > 77&щ:,@zyHn PTk@!h Va6xm+xDzy@n @ 0Ra6xhZ =@7  @f ^@ &щY" :zyDn @!h Va6}m+VD 0a6}hTn hbaPhp =} YAA@%:A@ (@щ@7 = 1@ W@@PZ|@ 7 @ @R  (PBPC~&&  8(LxIA!h@!h?0j@׳BTe@ k,5>愾 >Fl.&ź+ k>''+$IriL?̨̔몿@>bKm+RD 0bKhB  Nc`m+QD#@ 0~c`h8 =@E ? Cf &> @ 7C  3 @AC~@&ȉ(&#0#@L# \w |~@1@r|ϔ5S(>8 (Oʶ;` *>o@@E>dH:m+SD 0dH:h$ ==&>i@Qm+TD 0i@Qh ==&>iZm+WD 0iZh =@f^l^m+wD 0l0h7Lh"l^h _Mh$Xa =  = & . @? @W@@e BPBAC~  .|e Ӊ`1@rz5@3e-?v9?uοMc?kA`5?I2f?(*@ A/rz?[7r((Fm<m+vD 02m hm:h: B ] ]@  Š&>m`^m+UD 0"m`^hM* =@&A>prm+RD 0prh4  =}&3>sf9m+TD 0sf9h"CD D ^sp:m+{D 0c`hsp:h +h"6xh(Pw =  = &7H@  AA @  2PBPC~@(H 2*|@7H"HX"?NnD-ÍJ7,kt4yNq(:5;oS%]-1@!h Nsx:m+QD#@ 0sx:h8 =@E ?f C  &> @ 7C  3 @AC~&(&#0#@L# bq|ȉ8@1@r|3kt6v875dP: BѡC=jv*?j^tpm+{D+@6x@ 0H6}htphP = && @ N @Vщ7"6x,+DtNtxm+zD#@ 0ltxh`t E@ E%9&%B@ %?@AE~  @@W@& 2V#h3kt6v5S(>875d8 (OP: BѡC;` =jv*>o*?@@^dm+|D 0dh#h6ehh(P,= & = & *)% DBCPCE X >s,|eua@ʉȉXrC3B;\)By"l> A6@êg{H@׋@7Q@3eއ>,m+RD 0,hf %>]m+RD 0]h=&N`m+SD 0"`hf)Nhf*Nh*f @&& &|NJ'm+SD 0T:h^}hV)xm+RD 0)xhV@ Ɖ >) Xm+RD 0) Xhv@AA @@>+:2m+PD 0+:2h @:>,H:m+RD 0,H:hV@@ Ɖ>-`m+RD 0 -`h@A@xN.<m+UD 0,:h.6m+OD 0P6hXDEBEf&   ` ~   C~%>6`m+SD 06`h@@ >7pm+RD 0 7phn@@__>;3m+SD 0;3hA =v@>;f9m+RD 0;f9h @  Ɖ >Qxm+TD 0QxhA@A Ɖ>Q Xm+RD 0Q Xh"A@ACB C @@>TH:m+UD 0.TH:h6A@ACC    Ɖ  _>U`m+RD 0U`h&A@ACxxV]<m+SD 0X] hSh Uh]:h`   DBĊC,"      >]`^m+vD 0,]`^h@4 @A&&ffV@C&>^`m+RD 0^`h|A@A@ A >_pm+RD 0_phA@ABTRJ>c3m+RD 0<c3hVDD  @ vv v@@@>cf9m+UD 0*cf9h2B A@A   Ɖ  >Wm+PD 0Wh@F@m+OD@@ 0 @h|(D&&D&& @  @F}m+OD@@ 0 }h@(D&&D&& @  @F@m+OD@@ 0 @hr(D&&D&& @  @F}m+OD@@ 0 }h6(D&&D&& @  @>ɪm+RD 0ɪhD@@/ Ċ>Ѫ0\m+RD 0Ѫ0\hD@@/ Ċ>תm+UD 05`^hA =r@-VZm+SD 0&,YhTYhZhZh.  =@@@fD> m+RD 0 h@A@A\FRm+RD 06] h]:h> B = Š =   &>-m+TD 0-hA@AD D ^Wm+D 0`h p:h(GvhWh $= = & 7   AA @  9PBPC~i( 4.|@@7 E& ,,@!h"?NnD:יc&>X4%]@NXm+QD@ 0~Xh=@E ?f C  &> @ 7C  ; @AC~&ȉz(&0@L b ||1@rP:i=z*?b>ƫ-m+RD 0ƫ-h$DD A @ ȉ  P^ɫsm+D 0zyh* $mh(s$mhɫsh= & = & +ԉW    @`@@W@  A@Wk H R|@D@>@?#KT@?J<*^ᫀWm+{D`@ p:@ 0DᫀWh phL= && @ N @Vщ7" p:(`@ tNXm+{D@ 0hXh (pE@ E%9&%B@ %?@AE~  @@W@& 2V (P:i;s=z*>*?@@vrm+DYBxHq 00eh}h$Wh.e}hek~hrh7th b8Օ Օ  ͕&x鈀x >Ԁm+VD ~ԀhInvalid error callNot enough memory for OTS tablesOdd address trapSegment faultT-bit or BPT trapIOT trapReserve|d instruction trapNon-FORTRAN error call TRAP instruction trap PDP-11/40 FIS trap FPP hardware fault FPP illegal opcode trap FPP undefined variable trapFPP maintenance trapInvalid logical unit numberNo available channelsInput record ttoo longBACKSPACE errorEnd-of-fileRecord number outside rangeAccess mode not specifiedToo many records in I/O stat>ementClose errorNo such fileOpen failureMixed file access modes Duplicate file specifications!ENDFILE error"Unit lalready open#Random I/O to non-file structured device$Attempt to access non-existent record%Inconsistent record length&Error during write'Error during read(Recursive I/O operation)No buffer room*No such device+File name specification errord,Inconsistent record type-Keyword value error in OPEN statement.Inconsistent OPEN/CLOSE parameters/Write to readonly file0Unsupported I/O operation1REWIND error2Hard I/O error3List-directed I/O syntax error4Infinite format loop5Format/var\iable-type mismatch6Syntax error in format7Output conversion error8Input conversion error9Format too big for 'FMTBUF':Output statement overflows record;Record too small for I/O list0th\LhWhbgrhZw B N  v n * \ Tr   B rы * h  Q No ,0z&e 0* 8H7tLԀbrj7ttr xQ| 03 h p : , )   5Օ,e Օ:e Օ.e  ?(r :,r 0~e}  % je Օ" L @ Օ Օ-  >  (ek~: H T dek~j}jt  e:f s!zU Օ D~  A M•0 M MT2bERRORLUN in " from " at or afterExiting due to (Error count exceeded)at PC = ~sm+UD,0z@@YBxHqo@gr@D`@7 #@ 02˫hL˫Ȃhn`;h n{;h6 #8h |hpht˫h˫؁h˫(h˫Ph˫hnshshne  h >j ܨ+ & E w 0,0z<,0zzo~,0zG|l|ʋ3r3 &l|Հ5 pn  Aw :bgrp7 #zgrFB &f e(Jw ,0z,0z0D`@ 1____________________;_______}__y___ FF;;;;1;P P P;;;;;x V V;b [[13;; e e;:FZgm+OD  ~ 7>h7Dh~ y6vXuD 0 oh(&f&f %>; aNOD 0(; ah0efEe0b E~>`3XD 0,xhU@$>,xm+OD 0,xhA kNw8m+OD,0z@YBxHq 0w8hx ,0zfN8'D@kHѫx@ z( L8'hbz(TBC B%   ` , f @@  e2 &N59}D@nc"Hѫx@ z( B59}hz(J &@@ B, @@   NB9 D@ѫx@nMqH z(  B9 h.z((@ A < s@ N]9x}D@oc"Hѫx@ z( *]9x}hz(2   @ B  N]9D@os"Hѫx@ z( .]9hXz(6 D B e  !B  ^:wDEe@@vHJ@ @ z( :whz2z( D&E5&e@ E@ 7w,  2   u:(z&@zDz, HzLEeP lz|*zN0,^ e,} $J@ ,U,N:`"D@ѫx@ywH z( >:`"hz(FB@ B% `  B,    "V5:WXD,0z@YBxHq 4pX5:Wh&`Yh$4p`B 5 ɋ@ %cs e( $  ,0zbNw3XлDi@ ,a z( ^w3Xh,a HHCpCz(fp@A f&  5Q$& VI=7&P4 ,a  ,a i *,a .,a X,a ,yǐDa  ,a YGx@7 7=f  B-m& - @m0ww ,a ,a  Da (S,>;x# 01xs4:x<>1xsB1xsH1xsL,a R:V1xsZ1xs`!yh,a r,a 4pf - ,a  @Q 1xs.>;x#:x<:!y@QdG ,y(G  G`   GX @  f ` \.Da  ,a 1xsS,;\gyǐDa  ,a ^G|@7 7=mȋ - 7f -m& ~ ,a ,a  1xs 1xs",a  *1xs .1xs 61xs<1xs JDa V`x# \1xs `1xsb1xs h1xsl,a r: v1xspt- f f -m& - n 1xs1xs!y Da $`x#,: 21xs 61xs81xs >1xsB,a H: L1xs P1xsR1xsX!y`x#:!yGG \gy(G " >! J G  N G `  ,E f G  b G  5   &Da ,a  1xs,;WV{8f9m+rD@<4@ѫx@ z( {8f9h{z(DĊB 5DĊePĊ<B%$UĊ.% p Ċ&%#B  U U U) <4*|U UU U ,~̀m+SD&,0z@9s@@7>@7D@YBxHqsa@ :Eh:FhjHhNzh xjLh60h<9XhNh~$o $*  9s7> 7D> Exiting due to ERROR 103 Virtual needs LINK/XM :5   B   |3l 3L ,0zsa"(0saT\saf|lsa;|E .ząDѫ#zH  .TITLE CHAR ; 17-Oct-85 ; Implementation of CHAR function for FORTRAN-77/RT. ; ; Robert Walraven ; Multiware, Inc. ; ; Example usage: ; ; CHARACTER CHAR ; CHARACTER*12 STRING ; . ; . ; . ; STRING (I:I) = CHAR (IVALUE) ; ; ; NOTE: This routine cannot be guaranteed to work in all cases ; because the stack contents on entry to this routine ; are not predictable, but depend on the nature of the ; FORTRAN code. For example, if the call is from a main ; routine, the top two items of the stack are the length ; and address of the destination character variable, but ; if the call is from a subroutine, R5 is pushed on the ; stack just before the call, which effectively moves the ; destination length and address down the stack. This ; situation is detected in the following way: if R5 ; is pushed on the stack, it will contain the address of ; the argument list for the calling subroutine, which will ; always be located after address #1000. If R5 was not ; pushed on the stack, however, the same stack location ; will contain the destination length, which certainly ; will not be over #1000. Therefore a comparision of this ; stack item with the value #1000 will determine whether ; the call was from a subroutine or a main program. ; Unfortunately, if the FORTRAN code is sufficiently ; complicated, additional things are pushed on the stack ; before the call to CHAR, and this case the routine will ; fail. For this reason the CHAR function should not be ; called with a complicated argument and the destination ; variable should be a single character expression. For ; example, ; CHR = CHAR ( ICHAR( STRING(I:I) ) .AND. '137'O ) ; and ; CHR(2:7) = CHAR ( IVALUE ) ; will not work, but ; CHR(2:2) = CHAR ( IVALUE ) ; will. ; ; Since this routine will not work in all cases, heed the ; following warning: ; ; USE THIS ROUTINE AT YOUR OWN RISK! CHAR:: CMP -(SP),-(SP) ; Add four items to the stack CMP -(SP),-(SP) ; MOV 10(SP),(SP) ; Move the return address to top CMP 12(SP),#1000 ; Were we called from a subroutine? BHI 10$ ; Branch if so MOV 14(SP),10(SP) ; Copy destination address MOV 12(SP),6(SP) ; Copy destination length CLR 12(SP) ; Clear original length MOV 2(R5),4(SP) ; Store source address MOV #1,2(SP) ; Source is one character long RETURN 10$: MOV 12(SP),2(SP) ; Move saved R5 value MOV 16(SP),12(SP) ; Copy destination address MOV 14(SP),10(SP) ; Copy destination length CLR 14(SP) ; Clear original length MOV 2(R5),6(SP) ; Store source address MOV #1,4(SP) ; Source is one character long RETURN .END .TITLE VIRDSK - FORTRAN-77 Disk Virtual Array Handling .IDENT /F7750B/ ;RLW 20-Feb-87 ;----------------------------------------------------------------------------- ; ; This module provides FORTRAN-77 disk virtual array capability for ; FORTRAN-77 running under RT-11. VIRDSK will allow you to use ; VIRTUAL arrays in a FORTRAN-77 program running under the SJ or ; FB monitors. To use VIRDSK, link it explicitly with your ; FORTRAN-77 program (don't use VIRTXM). ; ; Before using VIRDSK, read through these comments to see if you ; need to change any of the defaults. Then assemble it with ; MACRO and you are ready to go. ; ; VIRDSK works as follows: a number of 256-word buffers are ; maintained in memory, and a disk file is created that has ; enough room for all required VIRTUAL arrays in the user's ; program. When a VIRTUAL array reference is made VIRDSK ; checks the buffers to see if the requested data is in memory. ; If not, the appropriate block of data is read into memory on ; channel 14. If there are no buffers available, then the one ; with the least recent access is written out to disk first. ; Finally, VIRDSK returns the address of the data to the calling ; program. ; ; The number of memory buffers that VIRDSK uses is determined ; by the NUMBUF parameter below. NUMBUF must be one of the ; following values: 2, 4, 8, or 16. The fastest handling of ; VIRTUAL arrays will occur with NUMBUF = 16, ; but this value ; will also allocate the biggest memory buffer space: ; 16 * 256 = 4096 words, which is the same amount of memory as ; is required by the VIRTUAL array support that is supplied with ; F77OTS (it uses PAR7, which is also 4096 words). NUMBUF = 2 ; will result in the slowest handling of VIRTUAL arrays, but will ; only require 512 words of memory buffer space. (If you really ; like slow jobs, you could modify this module so that it worked ; with NUMBUF = 1). ; ; The default disk file name is "DK:FORTRA.VIR". If you wish ; to change this name (say, for example, to always create the ; file on VM:), then change the RAD50 name at the label $VDBLK. ; ; VIRDSK keeps statistics on its usage: ACCESS is incremented ; each time a VIRTUAL array access occurs, and FAULT is incremented ; each time a page fault occurs (requested data is not in a memory ; buffer). Note: These counters can be picked up by the user's ; FORTRAN program as follows: ; ; INTEGER*4 ACCESS, FAULT ; COMMON / VCOUNT / ACCESS, FAULT ; ; Although VIRDSK imposes more overhead for handling of VIRTUAL ; arrays than the extended memory mapping mechanism provided ; in F77OTS, it actually produces faster performance in some ; cases, particularly when the disk file resides on VM. If ; you are using the XM monitor, you may want to experiment with ; VIRDSK to see if it works faster for your programs. ; ;----------------------------------------------------------------------------- .MCALL .ENTER .READW .WRITW .PRINT .EXIT NUMBUF = 16 ; Miscellaneous internal variables .PSECT $VHAND,D $VDBLK::.RAD50 /DK FORTRAVIR/ ; Name of virtual disk file AREA: .BLKW 5 ; argument area for RT-11 EMT calls ACOUNT: .BLKW ; access counter ; Define F77 ADB array parameters A.PLYV =2 A.ASUM =100000 A.CWRD =4 A.SIZB =2 ARYREF =336 .PSECT VCOUNT,RW,D,GBL,REL,OVR ; FORTRAN-77 COMMON compatible psect ACCESS: 0,0 ; Number of array accesses (INTEGER*4) FAULT: 0,0 ; Number of block faults (INTEGER*4) .PSECT $$OTSV,RW,D,GBL,REL,OVR ; FORTRAN-77 F77OTS psect QBLK$:: 0 VIRSZ$::$VIRSZ IOBKF$::0 IOBKL$::0 ; Error messages NOINIT: .ASCIZ /?-F-Virtual array initialization error/ NOROOM: .ASCIZ /?-F-Not enough room for virtual array disk file/ .EVEN ; Disk buffer area BUFF00: .BLKW 256. BUFF01: .BLKW 256. .IF GT NUMBUF-2 BUFF02: .BLKW 256. BUFF03: .BLKW 256. .IF GT NUMBUF-4 BUFF04: .BLKW 256. BUFF05: .BLKW 256. BUFF06: .BLKW 256. BUFF07: .BLKW 256. .IF GT NUMBUF-8. BUFF08: .BLKW 256. BUFF09: .BLKW 256. BUFF10: .BLKW 256. BUFF11: .BLKW 256. BUFF12: .BLKW 256. BUFF13: .BLKW 256. BUFF14: .BLKW 256. BUFF15: .BLKW 256. .ENDC .ENDC .ENDC BUFTBL: BUFF00 ; Table of addresses of buffers BUFF01 .IF GT NUMBUF-2 BUFF02 BUFF03 .IF GT NUMBUF-4 BUFF04 BUFF05 BUFF06 BUFF07 .IF GT NUMBUF-8. BUFF08 BUFF09 BUFF10 BUFF11 BUFF12 BUFF13 BUFF14 BUFF15 .ENDC .ENDC .ENDC ; Buffer control tables RESTBL: .REPT NUMBUF ; RESTBL+N holds current resident blk no. for block N .WORD -1 .ENDR ACCTBL: .REPT NUMBUF ; ACCTBL+N is value of access counter at last access .WORD 0 .ENDR .PSECT $VHANC,I ;======================================================================= ; $VINIT : Initialize virtual array mapping ;======================================================================= $VINIT::TST VIRSZ$ ; any virtual arrays? BEQ 1$ ; branch if not MOV VIRSZ$,R0 ; get size needed CLR R1 ; prepare 32-bit shift ROR R0 ; Shift 3 unsigned bits right ROR R1 ; R0 = number of blocks ROR R0 ROR R1 ROR R0 ROR R1 INC R0 ; Add one to round off MOV R0,R4 ; R4 = number of blocks needed .ENTER #AREA,#14.,#$VDBLK,R4 BCC 1$ .PRINT #NOINIT .EXIT 1$: $NOLXM::RETURN ;======================================================================= ; VIRTUAL ARRAY MAPPING FUNCTIONS: ; ; Map a virtual array element to a real memory address ; ; CALLING SEQUENCE: ; ; MOV ,R0 ; MOV #ADB,-(SP) ; JSR PC,VRTX$ ; for no subscript checking ; or ; JSR PC,VRTXC$ ; for subscript checking ; ; Returns materialized address in R0, all other registers preserved. ;======================================================================= .GLOBL $OTSV VRTBC$:: ; LOGICAL*1 element checking entry MOV (PC)+,-(SP) ; flag checking VRTB$:: ; LOGICAL*1 element entry CLR -(SP) ; flag no checking MOV #-5,-(SP) ; push BPE/32 BR COM ; and join common flow VRTLC$:: ; LOGICAL*2 element checking entry VRTIC$:: ; INTEGER*2 element checking entry MOV (PC)+,-(SP) ; flag checking VRTL$:: ; LOGICAL*2 element entry VRTI$:: ; INTEGER*2 element entry CLR -(SP) ; flag no checking MOV #-4,-(SP) ; push BPE/32 BR COM ; and join common flow VRTMC$:: ; LOGICAL*4 element checking entry VRTJC$:: ; INTEGER*4 element checking entry VRTRC$:: ; REAL*4 element checking entry MOV (PC)+,-(SP) ; flag checking VRTM$:: ; LOGICAL*4 element entry VRTJ$:: ; INTEGER*4 element entry VRTR$:: ; REAL*4 element entry CLR -(SP) ; flag no checking MOV #-3,-(SP) ; push BPE/32 BR COM ; and join common flow VRTDC$:: ; REAL*8 element checking entry VRTCC$:: ; COMPLEX*8 element checking entry MOV (PC)+,-(SP) ; flag checking VRTD$:: ; REAL*8 element entry VRTC$:: ; COMPLEX*8 element entry CLR -(SP) ; flag no checking MOV #-2,-(SP) ; push BPE/32 COM: MOV R1,-(SP) ; save R1, R2, R3, and R4 MOV R2,-(SP) MOV R3,-(SP) MOV 14(SP),R2 ; get ADB ptr SUB A.PLYV(R2),R0 ; subtract POLYA to get real elem number TST 10(SP) ; Bounds checking? BEQ 20$ ; Branch if not TST R0 ; Within lower array bounds? BMI 10$ ; Branch if not. BIT #A.ASUM,A.CWRD(R2); Assumed size array? BNE 20$ ; If so skip around upper bounds check CMP R0,A.SIZB(R2) ; within upper bound? BLE 20$ ; OK 10$: TRAP+ARYREF ; subscript out of bounds 20$: CLR R1 ; prepare for 32-bit shift ROR R0 ; Shift one unsigned bit first ROR R1 ASHC 6(SP),R0 ; scale by total of BPE/64 ADD (R2),R0 ; add base block number ROR R0 ; Shift unsigned to convert to ROR R1 ; block number ROR R0 ROR R1 ROR R0 ROR R1 ADD #1,ACCESS ; count access ADC ACCESS+2 ; as two-word integer ; Scan residency table for desired block MOV #RESTBL,R2 ; R2 -> residency table MOV #NUMBUF,R3 ; R3 = buffer count 1$: CMP R0,(R2)+ ; desired block in buffer (R2)? BEQ BLKIN ; branch if it is SOB R3,1$ ; else continue search ADD #1,FAULT ; count block fault ADC FAULT+2 ; as two-word integer ; Scan access table for least recently accessed buffer MOV R4,-(SP) MOV #NUMBUF,R4 ; R4 = buffer count MOV #ACCTBL,R2 ; R2 -> access table MOV R2,R3 ; will do compares in same table 2$: CMP (R2),(R3)+ ; buffer R3 less recently accessed? BLOS 3$ ; branch if not MOV R3,R2 ; else make new pointer SUB #2,R2 ; but back it up one word 3$: SOB R4,2$ ; keep on searching SUB #ACCTBL,R2 ; correct to an index number ; Write current buffer and read desired block MOV R0,R4 ; R0 is volatile in following calls MOV R0,-(SP) ; so save it CMP RESTBL(R2),#-1 ; used buffer? BEQ 4$ ; branch if not .WRITW #AREA,#14.,BUFTBL(R2),#256.,RESTBL(R2) BCS OOPS 4$: .READW #AREA,#14.,BUFTBL(R2),#256.,R4 BCS OOPS MOV (SP)+,R0 ; restore R0 MOV R4,RESTBL(R2) ; update residency word MOV (SP)+,R4 BR BLKI ; Desired block is now resident in buffer (R2) BLKIN: SUB #RESTBL+2,R2 ; correct for buffer number BLKI: INC ACOUNT ; increment access counter BNE 2$ ; continue unless counter=0 MOV #NUMBUF,R0 ; get buffer count MOV #ACCTBL,R3 ; R3 -> access table 1$: CLR (R3)+ ; clear entry SOB R0,1$ ; continue until all clear INC ACOUNT ; set count to 1 2$: MOV ACOUNT,ACCTBL(R2) ; update accesss count for buffer (R2) ; Now set up materialize address CLR R0 ; Pick up offset ASHC #9.,R0 ; ADD BUFTBL(R2),R0 ; Add table offset MOV (SP)+,R3 ; restore registers MOV (SP)+,R2 ; MOV (SP)+,R1 ; CMP (SP)+,(SP)+ ; dump check flag and scale factor MOV (SP)+,(SP) ; copy up return address RETURN ; and return ; Not enough room error OOPS: .PRINT #NOROOM .EXIT .END ~,@8m+D,0z@@˫@˫Ȃ@s@@@YBxHq9X@,x@,x@̫(@~˫@s@s@˫(@˫P@N@˫@ H  `  :v:p:::t:t:t:tF 0 {`"h0`hȫK3ERROR 19 USR not locked"˫s,, ˫˫( ˫P! |B P~p0B~$ 5t& 5 4,0z ,x , 20D˫ JB|  w 5&    &- ! E&jhN(. 8 @LNTXt ~3&E(~&! e"  m  s 3 e m@ 0,0zX ^ d| ,t8 `  ( 8̫( 9X$,x S눇 88lnrhjw .TITLE OTSHK1 .IDENT /F7750B/ ;RLW 20-Feb-87 ;------------------------------------------------------------------- ; OTSHK1 is called by the FORTRAN-77/RT initialization routine OTI$ ; after it has completed its initialization and just before it is ; about to enter the user's program. Any specific things you want ; to do at this point should be included here. There are three ; default operations that are performed by OTSHK1: ; ; 1. Provide a location, $SEQNM, for holding the sequence number ; to be used by the OPEN statement when it performs .LOOKUP ; or .ENTER requests to magtape or cassette devices. If you ; intend to do OPEN commands on magtape devices, you may prefer ; to change $SEQNM to -1 (see the RT-11 Programmer's Reference ; manual for the effect of sequence numbers on the .LOOKUP ; and .ENTER requests). The default value of $SEQNM given ; here is 0 for compatibility with previous versions of F77/RT. ; $SEQNM can be changed by the user's program with the ; following FORTRAN-callable MACRO subroutine: ; ; .TITLE MTSEQN ; MTSEQN::MOV @2(R5),$SEQNM ; RETURN ; .END ; ; To use this subroutine, CALL MTSEQN (NSEQ), where NSEQ is ; the desired sequence number to use for a magtape OPEN. ; ; 2. Set the console lowercase bit in the Job Status Word. This ; allows both uppercase and lowercase letters to be accepted ; from the console. FORTRAN-IV behaves differently - it ; converts all lowercase letters typed on the console to ; uppercase. If you want FORTRAN-77 to behave the same way, ; delete the BIS instruction below. ; ; 3. A NOP instruction is provided at the global $BPT so that ; there is a convenient place to put a BPT instruction for ; DBG-11. If you use SIPP to change this location to a ; BPT (that is, a value of 3), then DBG-11 will start up ; at this location (assuming DBG-11 is loaded and the program ; has been linked with OTID). You could alternatively make ; a special version of OTHK1 with the BPT instruction already ; inserted and link explicitly with this module. ; ; If you insert a BPT instruction below, then the next two ; instructions encountered by DBG-11 will be the RETURN ; from OTSHK1 and a RETURN from OTI$. At this point the ; the code for the first line of the user's program will ; begin. ;------------------------------------------------------------------- .PSECT $$OTSD,D,RO,LCL,CON $SEQNM::.WORD 0 ; Default mag tape sequence number .PSECT $$OTSI,RO,I,LCL,REL,CON $OTSH1::BIS #40000,@#44 ; Enable lower case in JSW $BPT:: NOP ; Put BPT here to make DBG-11 start RETURN .END ޭحޭЭԭ|~|~8|~PGѭԏB=@ȟ߭߭7BPRR RfP ݬ5P`PP ^ЬSЬRSPP阮Ь Q QPPSQ PSQSQ6APS߭߭nP`6mAPSS SP6qA^ZYլì iլìjЬWЬ TWTXXiЬUЬSUSVVjTS …PTS:PRbԢWU TSԢ|"|.pPР**dPR*XiVjWi Uj6 k@PQQ QP߭߭5P`60@PQQ QP߭69@PQQ QlP6@߭߭6?PQQ Q@PRP^ԭԭЬWЧSЬTФRSRSURUUYЧ RФ SRSRXSXXV(:dݧ `PTVTPUVVTUY1߭߭6>P PPЬR6>P PcP߭߭ЬS6>P P@P6>P P$PRVBd BdBeRRVFe~P U$Y?P^ԭЬV(:fЬTФRЦSRSRPSPPWФ UЦ RURUVRVVSUPUSUWh߭߭6=P PKPЬR6=P P+PCe~P UCWP^߭ݭݬRP@VPQQQP^APPPKP߬ݬﳌPQ΁P PQP^ЬR6<PQQ QPb6b<PQQ QPbעP^ТQWQ5Q PWP+SXSQWPbTТUPSݬRcPTbUТ2RP^ЬQP \~Pԡa6\9PQQ QPP^߭߭߭ЬR6H9PQQ QPҬPPPP߭߭߭6*9P PlPP ^ЬP`߭߭68PQQ Q2PP ^ЬP`߭߭ 68PQQ QPP^ЬP`߭߭߭6M8PQQ QPP^ЬP`߭68PQQ QPP^ЬP67PQQ QZPP ^߭ݬPQQQP^<~ݬݬ^ԭЬRb߭߭쟢697PQQ QP6&7P PPP^߭ݬMPPP ^ЬPP`߭߭66PQQ QHPP^YЬVfS~SݬVPYPf6m6P PPfצզ21fXXWWЦ.RЦ2SRSSR`RVUТSXSLSPXPBТQWQ9Q PWP/SXSQWPbTТUPSݬݬPYPTbUТ2RYP^ЬRЬPR Ь QQ  zPR`QP^߭ݭݬP@ݬ-PQQQP^BzPЬP'"LzP`5PQQ QPЬRzP6=5PQQ QxP6%5PQQ Q\PP^PРPA ݬPPP߬ ݬSPQnyP ayPQP^߭߭߭ЬR6P4PQQ QPȬ߭߭߭684P PzPP^߭߭߭ЬR63PQQ QFP߭߭߭63P PPP^߭߭߭ЬR63PQQ QP߭߭߭63P P¾PP^VfԭZЬX[ݬXPYЬW߬߬ 62P PWP hY1Z1ߦWPSCg TTTUSW6t2PRR RPUЬP`[쟠6C2ZЬRb6$2PQQ QﯽPbעSCgWSYZ1ZP<0^wUӰ$<<ޭӭԭЬSc߭߭䟣61PRRR61P61PRRR61PePՠ 1>ڭePRR@SSSRRePRRRȏeP<ЬS6??֟߭߭eP` 0PRRR`61P RcRIePRR?9RTTT쟭쟣60PRRR60PeP2֠ ePР eQС P@Ь PeRТ SPSPTSTTSSݢЬRRCbePSePS ЬRb6/bע6:0P$^YܐސԭԭZЬVݦ ϼP[ [ݬPXЬW߬߬ 6j/P PP fX15Z1-iWPTDg SSSUTWf߭߭쟭ܟ6/PRR RPU1ЬS1֭쟭䟣6.PRR R[P6.PRR R?P߭߭쟣6.PRR RP߭߭쟣6e.PRRRPZЬRb6F.PQQ QѹPbעTDgWTXZ1[OZPYX$^,n$ ЬV:fQVQV,nnn(iPW1&HC>,nPPƐϞPVܞ:fQVQ<,nPPƐϞPVܞf:fQVQ,n`P`PR,TZP\0PWhP hGRHP.SP@,S,iP RPPşhRPP|"VP^,nPPƐϞPЬܞ:QQ,n`P`PZf\0PRR[P@fn\ RfPPЬQС(Pՠ04Q0"W^,n$܈:QìQЬ,nnn/PV&Vg:fQVQQ(QfgPVP ЬPР RSbcՠbP*PJcPQcccbP. .b0bbQ.bbP/bQPP ^Ь R]> .b/brPbPPnnb~P/bSn:.nQQS/cSbPPnSbbS:]ncQQb :>ncQQbPЬXШ W[gVЬZZYZ/gY1ZZ Z.ШYZk(  gkkkk/cZ ШYkk k/g.BZ@1ШYkkk k/g.g.gYk k0g(YYgZ!g*VQQgYY:%YfQQ?aQVPPYQVZkPPЬ P/`.`.`PЬ PQaa/`.`.`.`aP\s\g\[\ O\@~A\<~2\& P`P P`P^nV,ffPЦ Pf^nW~^}V~PP΄^PЬTЬRVQ;Q*>S8SSQ[5Q%ܑQ?׊QQSVVVTXRdPdTVRXQQWWQQ]ȑQ-#QӑQ]S-QSSW͑SQ QQSQQ]1Wb [^,n$0,n0lլZЬZPѬPPYЬVTW}RQP"PPPRQ/P/PSQR1QЬVTW, |$$$(ЏЏЏ04S8W<P P 8%P1   1[,,$T$PTP- [   .,,$T$PTPH,U- + -e$-.e,VW.,,dT1    Z,PPX  ..`[`,  .,,( ,<PP,],,Y~,nPPƐϞP؞ܞ[ PP,,n`P`PRPTZP\0PRR,$k1X, 1   Z1,P.,],,VW .,,VW ,P% .,, I ',Q.,,PQPa* *,,.,,VW$$   $k1;,nPPƐϞP؞ܞPP,,n`P`PRPTZP\0P$k:1  #,$k PWHPcSP(PTnSP@P.RZWR P PWRPݬP SP(PnT$kWPPXWά^,n0nT, |n$$$(ЏЏЏ,n$004:QìQ8ЬM.;-*.]>.$-]&>"-.]>.]>[<]>j7.-~".]>D.-\-T.]>*- -*%p//hm.;"nh. ;@ !"".( ./*- ~-*?R[]-LNM$FILE_DEVXXXXXX%09d%s: non-translatable vms error code: 0x%X, vms message: %s %s: %s DCLMCRSHELLFOP=TMDw+SYS$INPUT:error 0not ownerno such file or directoryno such processinterrupted system calli/o errorno such device or addressarg list too longexec format errorbad file numberno childrenno more processesnot enough corepermission deniedbad addressblock device requiredmount device busyfile existscross-device linkno such devicenot a directoryis a directoryinvalid argumentfile table overflowtoo many open filesnot a typewritertext file busyfile too largeno space left on deviceillegal seekread-only file systemtoo many linksbroken pipemath argumentresult too largeI/O stream emptySYS$LOGINSYS$COMMANDSYS$DISKLNM$FILE_DEVPATH=HOME=TERM=USER=PATHHOMETERMUSERft1-132ft1-80ft1ft2-132ft2-80ft2ft3-132ft3-80ft3ft4-132ft4-80ft4ft5-132ft5-80ft5ft6-132ft6-80ft6ft7-132ft7-80ft7ft8-132ft8-80ft8la12-132la12-80la12la120-132la120-80la120la24-132la24-80la24la34-132la34-80la34la36-132la36-80la36la38-132la38-80la38unknown-132unknown-80unknownvk100-132vk100-80vk100vt05-132vt05-80vt05vt100-132vt100-80vt100vt101-132vt101-80vt101vt102-132vt102-80vt102vt105-132vt105-80vt105vt125-132vt125-80vt125vt131-132vt131-80vt131vt132-132vt132-80vt132vt173-132vt173-80vt173vt52-132vt52-80vt52vt55-132vt55-80vt55vt200-132vt200-80vt200undefinedSYS$OUTPUT SHELL$FILE_ $ 5 J̄*55Q$5d,5 |Ą45<5DD5L5 T5  \5 D  Ԅ  d5 $  l5 t5|5l@AHr555  5(5555Ā5̀5Ԁ5܀5PD55\555 !!!!!̂!! 5!""Ă"5"5#Q aaaundefined errorhlp     ̱}PPQ{PPQ@Kg|eVAXCMSG@@xxpH@( x0HPp H`X`p @80PxphP N@FORRTLLIBRTLMTHRTLSMGSHR9!F&QCTIJȲ̲0 8 , жD H L P T X \ ` d h l p t x |  $8VAXCRTLGV04-00922-MAR-1986 17:5022-MAR-1986 17:50VAX-11 Linker V04-00 .$$ABS$$. 5C$_EPERM5 C$_ENOENT5C$_ESRCH$5C$_EINTR,5C$_EIO45C$_ENXIO<5C$_E2BIGD5 C$_ENOEXECL5C$_EBADFT5 C$_ECHILD\5 C$_EAGAINd5 C$_ENOMEMl5 C$_EACCESt5 C$_EFAULT|5 C$_ENOTBLK5C$_EBUSY5 C$_EEXIST5C$_EXDEV5 C$_ENODEV5 C$_ENOTDIR5 C$_EISDIR5 C$_EINVAL5 C$_ENFILEĀ5 C$_EMFILÈ5 C$_ENOTTYԀ5 C$_ETXTBSY܀5C$_EFBIG5 C$_ENOSPC5 C$_ESPIPE5C$_EROFS5 C$_EMLINK5C$_EPIPE 5C$_EDOM5 C$_ERANGE5C$_EWOULDBLOCKD5C$_ERRORL5 C$_INV_FRAMET5C$_KILL\5 C$_LONGJMPd5C$_LONGJMP_FAILED CC$_GFLOAT tC$$TRNS_VALUES t _CTYPE_  C$$EX_HANDLER  COLS  CURSCR  ENVIRON  ERRNO $ LINES ( RANDX , STDERR 0 STDIN 4 STDKB 8 STDOUT < STDPB @ STDSCR D SYS_ERRLIST  SYS_NERR  VAXC$ERRNO CC$RMS_FABP CC$RMS_NAM CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT@ CC$RMS_XABFHCl CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT$ CC$RMS_XABSUM0 CC$RMS_XABTRM WSTANDOUT WSTANDENDWSETATTRWSCANW|WREFRESHtWPRINTWlWMOVEdWINSSTR\ WINSERTLNTWINSCHLWINCHDWGETSTR<WGETCH4WERASE, WDELETELN$WDELCH WCLRTOEOL WCLRTOBOT WCLRATTRWCLEARWADDSTRWADDCHTOUCHWINSUBWINSCROLLSCANWPRINTW OVERWRITEOVERLAYNEWWIN MVWINLONGNAMEINITSCR<ENDWIN DELWINBOX VAXC$VA_COUNTVAXC$VA_START_1 VAXC$VA_START|VAXC$ESTABLISHtTTYNAME TOUPPERTOLOWERTTMPFILE STRRCHR STRNCMPSTRCMP|STRCHR|STRPBRK<STRSPN<STRCSPNSTRNCATt|STRCATSTRNCPY|STRCPYSTRLENdSTATLSLEEP SIGVECSIGBLOCK SIGSETMASKSIGPAUSESIGSTACK SHELL$CLI_NAMESHELL$IS_SHELLDSETUID<SETGIDSRANDRAND4<PERROR,PAUSE$ NICE\TMPNAM,MKTEMP$LONGJMP<SETJMPKILLD SIGNALTSSIGNALGSIGNALGETPID GETUIDGETEUIDGETENVGETGIDGETEGIDLTIMEFTIMEl|FSTAT CUSERIDCTIME LOCALTIME <CTERMIDFREEREALLOCCALLOCMALLOCCFREE C$V_CTYPEDEFSC$MAIN C$MAIN_ARGSlWAITdVFORKTTIMESPIPE_EXITEXECVEEXECVEXECLEEXECLEXIT4|SBRK<BRK ATOLATOI|<ALARMdWRITE\UNGETC\UMASKLSSCANFDSPRINTF<SETBUF4SCANF,REWIND$READPUTWPUTS PUTCHARPRINTFOPEN,MKDIR4LWAITLSEEKISAPIPEISATTYGETWGETSGETNAMEGETCHAR<FWAITFWRITEFTELLFSEEKFSCANFFREOPENFREADFPUTStFPUTC|FPRINTFlFOPEN C$$FLSBUF C$$FILBUFdFGETS\FGETNAMETFGETCLFFLUSHDFDOPEN<FCLOSE4DUP2,DUP$DELETECREATCLOSECHOWNCHMODCHDIRtACCESSABSlABORTTANHTAN<SQRTSINHSINPOWMODFLOG10LOGLDEXPGCVTtFREXPl FLOORdFABS\|EXPFCVTECVTTCOSHLCOSD CEIL|<HYPOT<CABSATOF4ATAN2,ATAN$ASINACOS SHELL$TO_VMS$SHELL$MATCH_WILDSHELL$GET_ARGVSHELL$FROM_VMSL|SHELL$$RMS_PARSEDSHELL$TRANSLATE_VMS SHELL$FIX_TIME*[SYS0.SYSLIB]VMSRTL.EXE;1+,[."/ 4""j- 0123 KPWO#56Ǝ7 NƎ89GHJ0DX0205* ("VMSRTLV04-000@P1Ŏ04-00  !  BASRTL_001:!  COBRTL_001@!d FORRTL_001!  LIBRTL_001y! MTHRTL_0010<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<|0<x0<t0p0l0h0d0`0\0X0T0P0L0H0D0@0<0804000H,0(0$0 00000 0|0|00///////////////|//|@/|@/***//@//@/,<|/<x/,,@d/,@X/@T/,@H/,@eӅ0FSppB:vA74Z:jSFphwdGƯn," 6&w=(Dh,JRl*d|s26ׯyy1HͫNvt)d\vRdU>C)p!~Õ* ^?f0TS_MTǰ)k+P edl=iKzυ c-Ū?*re\HotQyV.0⬰]ykHbYDZC6/RY`zg xIg.\`;D7?]etv 6~jS# "o[g+5=W hD.{L &ጀUzg{4_N@q>pEO.OPHw5V9LRX,=p~#2f9י$XQER0%{pb=ʫ/VC% [Ifm&t0V2Dc%\C I!R`H>B,S ߟڠ[,:77\Td6ƒ:Mg)DFԀdӲ52aQc+k' ՠۚ: ɵ1֢i4l8.* 4?2Rvni`.@`xL* m) ܏˂? wW, =@fU$wWcɡMx|r RpIJ&'`вdd?7 )#-0#p|@T"m8j?5,p8 -*)WXbtr3Tp~YP}6:DmO*XT(p@Aޕģ^w|1ȦQ>Zc;x(Pʗ =>Y.Ce|ea'v=]Rx7膀Nhw֗ [iyʹ\gNcJ*ĆB'wIFl''r GϰR&hF![xhaYuxĖPqd E/+a ER@O YtS$ lCɼ)o6r 5?G ,3 N'yϱ'۟c?)<ʺW ^ʓǨXF1a7pe ܢ8ZFFFH玮Kc"k5. 4hH*jݱ v=Š?)"zi_pN&%!x%TB_"i8HL`3D\3.8w 4->ŴU]5rx1yko?ߖa!dFMd4]3N+9&q]ϱpޭZW}O׌ ov#goT Ko=d+Ly#Z#ID%ős]RT3&D!Ӝ\a+36ZNm0IGCAoBp7JM.ymiFl-Mk.~ˢ8<)͎u8z>vTa!zUK& y]}Lu-GpXYܭD" qpƾU.>v?@^|&ܱZًDa_\)Υd>5 (񾀰ik ޼s 'T^Yu{ u3zdyB#B9PXtq]WɅ;A<ޓүp1\LD;eKLj跜6?*`YOF>i"8q" FDe۹PG4J9F!zD7ΚsozlUB&ݥ1; qhlܓz}]-&itzOp)  a~\Ev&&,I`ߦ;ࡗ ]`|{L)'3<;~TNEutsuLNs0yWru-X*ɿ+;AZȋ>խBL<] Ǐ,0WWÜIŽ2Hwa?J[iaRW 9A>STje32cڶ?o*6z>ڴΨk W>љ)^lf"7 fLv0fq'1%/f?aCbelё^3"[t ^٫`XF!{ۡv;W (F<@o'd)5,}X\%oN{~<=4UDgqF;?>Z}&SZtzeT%8\k5y@ܯ=& 7xk =2a R %b~jOOӲ HzKSD}ۙ-h͔= ':( cp[a }U<+ܐkBA4#8$E> B))c⼨ׂ.@ơP͡ HK3j]iTCOl{6G JKp̶T0ZE NqNztby,=XXFDXmUΰdхJU!\<$>.8SwKQZ.{=kW#797:í^@ףA;.fP׎8S'ôh.旨d'=%v~O"PF+~:m1PBnvP~19zwf1d\/UŽDUmtnD+#PH&zvUkð8Һ bڠB|b?.K0ⶸG[K9In_ҟ2={ Ms ~~ងNy432*-BO{q.ߺֿE5 mypQ@ynv]XݻqVW^| 1X\VZ2OBM&ZK=˄1Չd. )Y~& 5 IxB LBbʨ—T ERJ0'E߼ $MOTG~>{G]KMkw1Xndo&y֍|"|QHÚ @ؒJomPMpx{¨ c'CZcf ;R=F/ź`[vz4#_wQ$#ܛ&h.7= 8dVR]}!fyPJ+W27A]CuMy_T\y<# ^l.ZND,|}Uo6.,F8fv%%%AA ANY`99">-o^^M3#S[v!1Ioe.Ajݩ3ɮXYm@)WAo9t0 ,j"?*\ ͗L7r;sU@2SPO{]w +bY,D_8C3lN?vB$C,1|y!3K=a-ݼ |~s/rng4^$,@%0+%]+yr^ #eZdE[*q' Kh~8O浽e2lPd5ϴ :0kt82j6.n IQ߶a- {.ԙp4f*"r׎ϧ~=9b5hqFPLՐ՘+Z-8Ev06P?QU ;<0fb餁^6^wmr6`")ѻVۡ!a8@`lJ dIE-Q- m7)x . 5 ZkW" ]!êɱ̯LUꥐ4LΕETb:0 $lugћh6cM'Z{ͽӐbݜw 4_dս6'źy2DJ^sщ|/#*?c4i^;Mk1/  3FZƩdXxWzUn}|D<]8j\h (RY|{%8^ag={ZuCw0]@S?>dˇQy8lbPK6A*yk-c;fe_î6楏vȤI.7` Ҫ$a<41rJpfQ 7X;ڽ+T#s%snlX۶Ӿ1FOXVsq*{ڊѣٜB P@!;EJ4|J($;,MdfR66^gyA;ȊScfy@0{mteݩ[~-Թ}ftm'SE{%dZ|1rlVHE P/~Igbi}{@"qHk ixI('3"+wG2ƥZPBɲ5f/zStv/güTn#*g KQXG"A$2&uKtJ[O:UZ<9.CV,|L"jo(f8Vzs*dr3.2Sdkmd.ѡ=qkXcQ=> ߚ܂$Gl^[+"LzLq0uU攋q9/#4Ӊާ|<*P7rM#L7Z+@n\D_*NN.'( h[ʹx0.6ژG[tw!ZGH[l> (HndW,KbS2u zKAB0etM~ژߍB tb4yJYq3OxlRŚoOtׇwjQ0!?,-c5@9:94Ul|F~ U_@1G?Ee4:6jyȑnw>J7Mڃ,$; sŎ 2tDܸ&0C~j¨me@TE`8J<0(k#~6WII98e^4T\ vӌMRo{uD->bK*|*)_8 ;9X]dJZƀ1B͸t6z]:O2p!;ٽ9{b1۹%v\ #0j-бY(lWtu ]eNpO+ho!n>joA5r$nEȀS` `MؾΝd A*wtz 5ݩ'"q1툝f`T*ЂVR"yۀENtef #1䇣#;'tlr젦ʃV ?^3 oYm&-v6;>ϤwZmMKy{-~hVw?3Z//U҅i~<]yi0m66[OQk?1JE V%)&3>) J{ ;{{H|!2UyUcߊgmbh!,1m?WҚޟP8W/bE+hлvkm _ 2=xUt=N}b "L nnin l` SǓ]E 7[lIMӷĬV涌nN \yr}yI~> ]v ]wI6 M5y5Pٸ^1>)h4?ZkP;P6jCS/koD!كg4=Sг.GUKR.ڻ85H^,0*TڒuXw<Řy?\V]a֡4obm5ϰm}Fd+U+QۇJ˲QߥT~[bFן9`K&g%"3exe\"%#b&[S<&+መ*)k[<7V|IM) LE&ҪRe or*yșTvo` UTGVH}R=0ăoDҠB^!1i2%$KnGgbbl #$DΞm8\oj.VSFz]vh\wgJ1]fi!D)5wֆ~)oHkvʎxeっ /.G8^wj;z {iDup޵x7>V{Q~(igsH=t=L1śMUH`Sshb# 8)T.\7]8ZRmĞc ax&kJWh7Xp7B~p8fYISH؆ID#[f"#1neKݝY#"y2J0=:*VRv8hNg"*VIL.B)}B)p/{ ߤMNdžxWVF& 7L P0x0uF /Il-3Tk*+}UJcӞrЀZ~xRSk .%.JftY54, 5-]J?e’]`pF)񪌻~/7BێVcX, Fll(f5R3P-G>)/f6 H&*/\ )[l0p Tۛs' 9h Z/E:<:o y4G\2tq"s(듄(T9* ɔs{ +])\_D1BE3Yk:n>$n[k3xe<#%Ysl7,LAYrt6SL4U2 S'aw%iL.l8h!_D*Kcm)llBH"&: 7Ҡcp]Zr&*GH5 ڦ2Kõ!uNC?e齮n BUj1΀<0%f;p^hbFQg^:h 4qs;@`QnxܲWqL?qBp琫t$Hਭl] xE=37^,c]qn$p4b]-7\):[,ŵ o^05#]NSE.d5dA܅ъ4ȰTXX56Lm s],%O-^Ky&,7 ]eR4 F`}$ )3A[}x2aȼvxgEӠ"<L^,Ի=ϬrR}-/j9NoIa$1 ^~d]v#GT?<^)]uܚ )mAmzw)1cӃs"EF7{2p=Ys)|b]"<ٞ$w#^XJ\Ҽ."0ϦaNv}xя8X,7 ^a N9|2xޤ5S#9߁[7ߋKPl>HfmFcȅ .i3I BZߟ!)okjFĄd"l[kӖ޺"ZxC$Q#ƫ^eP-'޹P2?LOr- RͽS7K (1pha=fcE$h (tbVُGI@8sHýrE]+O" r2q < :m%͏^3;/.=& tYWrOT"7ekn;L)[옼zJ]$d <1dqHAdd1TEBC&@sSW5zXViTBZ1G;IM~vXNJ+]s  z5mFOB䋰Պri/ ^Tm((:PΞ^>ǧce؜!#Jod 懭OHWt^ԞWr:ckkVw>uD(_hWͳG m Pa2!Pzy$)kG1rM*PӯC.GF-JVq{'zţpy H}>W8Z->\٣ u'p{LMcC)VNxQ@CWQ HôSV7Sn1)]]0+8M,'& Ɖ &د/1N)D8MW~%D  _{9QD?NFpͬu.VP8"YPTdbfH'r[6m<,u;ij 8pvMw `;V5Zpli3v PƠΖTov 12KfÇ$MNK˽3a+|b g *ݻZ*4%ʋ(D:*}ef~UzzS< 81"(9c'ebvc^O/Y"Y&ܣ\OD&| nrFb8"lNbi~~yFU^+r8}tYG[(MR[=#|>zn2=Ѷ~8Ja0I!~ nY! K(̔<2c*>4 mRg'r~ b*3'S眮U4Qҷg'0wG\N1EoZj~k8zRA2x{|@Rp.YZbg9KBw7=L!)Z2gv:pʊۏ ^7@d2v.41c/3qX2ҫŃHLW8eaʃI)c+Ic:v.f͛B]ኴ0|Bq3\{跹*?݂w;bKfi#c;C SzQm]?`7#I%J"c)—ɂ VW~3Po O*ا dEoK~s`㫌BM4XOMJ&-ܒO'fNQ23Y6?ʴI ~0(+]*R$sZLjGfvЛQd޳ʧRW <,''8KĺƭEfY4fVRޖ\ߗάp|ڶÚ1H#OHnECImr8}k^t-NsiA$ӵ5bshX|+E>H{(#d2cW N{  WEbNłF忷R&өHXR!q9aO{N̞a&#a@r$B i<<;!u9qE&8m'&mmcHS4Y_JwFR uNkKA \hmrs8ÇD᳷)^D%\1Sd_A$!́"a'O.BQph Ozm# ITE|Lm'7s=n.68Ymg Z)FLA& Dj!rM)4/lcJmnd1+ֽ!/>=XU]p3׻JaC=$>֨xdaoS< HlcC;n2fuD ]aLJnQp. %:7;Bi{E3waIpOV/j;vN F%RQy^@Ő(-_-[Wϴ<[ DX#xhiT(q|us_0lj-IWga 1I!ZeVӑZ]ɾ(/;'xiu̵]‚ÿD2j. 0lc҂,@5]ۯۖR@д}UlxKR$ Q +zLG|hIvIrV1,r[vvޔ'^mKQpl, sGm\?i4v5 $4q3b?6N?9XnϠ ne˵Yv&mEpmC`JwyW䇴W27_v%fֵ?t9*+x0j)rm'ʆ+e{U2ng~>`&;y,]n xG"!@rrjܚHj Ֆ[JCvҽGNF("J3D=4"4o+$Z=H5/+Dqg@;bDd1|}_O?l&,8 o)(Tخ ./"oOD_ tȮ)'eՅلiTИ#^$l UM98nhZ@X%[٘4(o`~]A'9:w'ER69pQ^ IdG$!fGU?5SuY2,K醢yaF&CA.*P,X(>2gI؏/FĀQ~k,p,^NJ9VU@nm. ߫9_ubtsl*bxG頪ыhW N*YPd, LDيJ2>,WnB\lJ[׼~(6+u1hAv.,69Yk lO8xJ`<5*W5YSM Y8[: . L#X ']eru@^ ꩲ7'2#Tw=~xBA2v(A-hO*ڎX8\*uku{[c̐q}C -EόB}]]~|}%&9$n-ȯ+o~FBA2t=!Z b:^4HdDH;~"OST)hFkء.2LRvaY ;}ƴ+ 4y k{ԧ䋹l\cJҿf@xiQ*@k#K_pL%yU)Nrc~J`Ӌ~'Ì&AGS^vkhJ_*Y]-Xeicq*u ά!fYĬlU濡f[ ^ϳ}U L3rJ5ō}S4b  .' k/[pkxZeW'v"#d2J"zO}HulX渼Pt w-=J)xXd(:TZ>\]F)f`-2H gu*ďJɵV FW)kkBxm,dڨa5?YlEor]ww20pEd~.zu$v[W**یc,XjjU .ҫrm"-EY]uxz5) Z"CaH+06օ0 if7 FQ_QՂm~'BE1Ю[Hg=~l4QDMX^tn=K9ltbػԫ:8%2J5kf_}um/sOP/ sy`0SpazWZ噛a6OwJ7gGz\ ,5D2=8Ѭ mFUWᤂiS(yQ֠;m%؃@6Df >fɍdS6[ܯn#,ybCLzqg}dOJlu),'/! ;h1Rdz8%9|'e9B7~9(Pĥ 4 Xh%egUt:PqzapE6 ?T4՘4U~ $S*-2a{ 4>YpzCӇ_) ߠH|m/v]lx8rs(m'Es3I^`UZlb06Kw>4µzϊcsGc;[j|HHh'JO4PD- lv#Yγ8h i}q6їJ2YZ u0-Hs5cZ@$&Sj-vּOkvq-'/[z~uUҾdJQyJqQ2xO_{T](ea/+qv3q^Xbf{i,D{cĀQ!<,X -G)l6y}(~w6r (&O.x`簸 }AVi{v;瑑15xG*fWw1?~g?6mYY0;$丵^9R3O>%#0~%dVuQP8-/T^pR`>ŧR\EÌ3V-W| #l2207_8&4= ?YTu3@Lrḫ>mE}W/j{Re,/|v$|Ly)[eeX*%<LJw޷;ǥb;!#>]ΞɃ`zcHq'OK,C~Yd>dP6eHDI`|U9˒ ^CG;~yAZY9+={IsKsw;_qWԔ\`ɸO|J,UyÊFFUmU#Z'bh*(KsO"Pԛ@ B%4<6>D $web=4ɲ>@ 8ܯ+ w'' YiQ}Vy>K3m?6rbTIFy8Ln~…ݡc=3u8gn9ٱ@tKdEEefi^M(B̶-fԾTg"NT`'+ J7?X]rsj59i&[ba܎='Mg;QZ˿+*TE> P`tAhz%!Pa TR,l g+]_a&{qbrg{3Y4`Q*2CĨLn/cUO2FF7ℚ]%iRAQ`3 %fW,KHBI^{: 7J'RŮ T/d(nJ +^|r*6E0k7:U:)= ֽ "5:3 3@ԩm.- |{]P;a* hڪZ3Zoޘ.PQܰX(@%Zt ayHABikyW:=r5/ ,CXdr`Mѣ$~4Y>"m:E[{YB9NDRxsowk[ȉ∸sۮ\! #BLpe ~4 枡|Z*LNs勲] 96U2SmQ΁֟?ynkp13:n)UrQ3Y`"ȿ]%O"KDˆ8:qZ{d^3JGnFBƛ&p,຅ 2KQ9p/SRZ3$S#\ #h\ ߥDT6m:OpDt?etq=S*7vB#:a:؝NR4ZHZ^&cՎ\ ZZƿ S,oٽmJ>Wiv2 0)7DLI,.Et'Lv0WadM>k teq)j;$81/_DZϯqȜ4 ^,n[YOQ瞲NN^v=M3/br tb1ϧT ;FSSAZcMLq7<@Ȗ7Po }_;vcg¾;s*6xE5C YKNkٷ+;F_Y}P(Ѳ2}R3*@i\m?|h!1fg$OMuk'!Aa+tX蒍h͚ /K8`;H; n0Pz 42-/P!&2b{NҢ!"ʝ$ Z&ݘ~p*!Wɢ-1;ގaTY7zs;q|زuB q0K\PIȅ`5H7io=7kܮl//J2(m5IW~h9awgkk̝-*ETk(￸ ݱ pؗ+Y[Y4OG0SQlՒRԫ *YX&a_,<} tKz #&LHoZM\N.};'YjLc9FAp/-0ۙ Gp|۝&pLD :C)b- aD殒 l;`lY͹IH=%KDO o ~u'KfH`>A~+w-j+Uk %lg-n]1$0 iD xdBv_A,z@J*h˽cP0a|Gfѵk+kot<[^CTzTݹ!k)94ZJN:Up#BN_)8=ӟmkK*„jJJnA.l4۔sIPvngm^ [2TP EhYݰgeCqFG?,|n$R1,BM[}xθˆ,=l90sl=hf/\sd&t3A= x>s]2"[S(iŭr"-8* FFeػߧ>VK܌28$/'HX0ZOT\cy˝BQFxv y,^@!N׷.lmFj ( xMB?5o i"T ;\qH/I5U=_>fl(@ 7q͎3B댰s (cֈkpԛÞD)P&Otn*w*kG`=1 L,#JTt6׽{Z͕D BpJtAJD UE#VhT4&)Q9T Nifۮ9,yfT0[q$$wY(f "6- qK6/N>:2o 7:? =r )8F 3G^֓MY[PIΆMFoz,fbl!W%T Ηc`$wv~xwD[5}kpssEADjc4K!i՚+QxEtf|)D>>zKT1R5-BgwЫPF^\%㇀{X_7hm2?稩qO/ d.힀0L`1m14KAr3kNBAxBL*=~o*gޗ$ ̭ޏ1_s@ i-;.CayX~ a{ف.KS w20]'_+vB\|C> ǵ"Sy0^] l L/6}` >(E0nVhp%WPIg?]ϴK :ho&䱔c26spcZ%ⓠ\55D7PF-E@[>v..G@[,#ݾ$}7UG{ڠZ)EkySyСQد.Q)@mvxH`0Z`j{z>T Hb4̯v,&,?NVV2335I,RTPop]T̋Dj&N`W:[Rr*B$Yжmdw(ށoce}g&~oBp'u^Gkf][ s_6VPM6o)Wa{NХl9Sv%HQiA8=ϾrїvWʇOۭq1,Eq#:v_9L vv>Sv<̾^)pdBa:oQ>Y f5(@`l4\T\V2Nr lk#>.&$'NnEUyAX)5L x \WN^rh,L^CE0/J~«\0ٵ|`ٙ) uaj|Yg9,&KR&$`{ v9:I@HH",I$j@:l}pBh!aL [rNwת]+XF-;CW9 { eDՌu'ʮ" 1Tڊ! ;=OcSKG:v 7 Y:Ke׍d |-;Q5֡mᒆ䋫N2۝O0.كTwY[L "m:["I-5L<ڮ J3{ N/Sst 󟆑~#zMzI ].bjm!PTIֹ2^El{BRK>|֯|LBKsK vl9PhRk|  ~9Ě<NJ 8piHʣcS3T]Xţ'9ewF F6F7eov؃(U\ #$jNG< *] HzW 4{ Thzz4w!`>ߚ,I7dta&PfP<2.X aahc KI7!ij+=i1Ҫ%iiF 1:='񧵋H7̘B/A xesݐ9~i!]TuK9k'9?/τOILjpk*ӯdMMVQ(| E.ӕ;Nw~cl7%߬)bY ո1[M?h+CǍ*7{rѣ**jʋ:_TsΗr8N8hR,4@UviOoJTGgzBiºٮ0,q'24< \x#LBI%-.qZ#od`W֨ޫ0Q{XT;gEuQƧ6Ռ:JoDeeYOjgc, -sq1ovN)H9ĸg",Df]6Hfv%tc (c+ADwwmmS ٟΔ7WG{55N%aL7R.M\X*Q CZj)a*c$Ww^e uGI"-i{)lb7s-~HUx"NYӦ0vN N'pT1e+ϩll=RD)GaE  ;F˴OzP\Q|q6X1`G b0,Cn_T]k/_v.ݝY=ü Զt4#!3 "Q@ɶq'囌U/}5 '[{VYݳ%`[.Ľ:s_<Ul-K[]&3D~w%JghӶ)/শ՗<C_TZ.qc<ܲݖiDt^DEf)46ӊ`Lיe6BP}"YfؑYDA :n_3,< -;L=J6۞ N}h$TMXB"1r!_fWLaPawjK:E:JQ|0s`i?vO$O1@sB#[:S3;3d=2Zǔx35|]U킍U[\2Q{63rLJ*?wR'ܻLט;#/MR%MIck5"G?c[ 0k? !t-VܓCKfR6{bPG̫Cʯ?hr WҡckR)GT% 1Y"\ҥcN÷{`ӝ.تq #v@ꎊZ 'vc.ޢvH5 }"*\>&"=YZ=aA(kcɚBz]`~a'ﭙbiPNQ]Y1>wLXkq_q[j&2,V'9Eo yͶQtf9wL})%zP첕ld;}+k, "X:7 ܖT@ Mkآq^o@0bQp2?/aC+ƏMUq1t.` 0Kا?Zo_kr /yznb:W.3T\ #6ɫY@Z!ML`DL}"&[|GfgFD}n' gsAUޟM(ӽ[v1(Caዡ!0Q`<&2iUV8Iyۭ ;>QWڻ +F]q89T>H[f<͇2_H CRn{RdĎ3PѴ"¼ kyWW& (883$Bx塇D5L_z͂gD{qRŁ: x ~7ٲyK75ܾܺih\XFtUNvOg'Oxw JȠ,5os1ؙd}8eVm(6S+({BѣNnoFh~. #E' 2*$4\) eVw%I6RΗllXG-؋(&|+3R8es+UZab)of7?X^S[R M;L%A%>9<05Tv"[oP94T4pKbo@޾k;gXvU郾Wanzm&7\@سóU{LNԅ.DguD!陑5)w^YmB2Ƚu: d+̢cn"M#!oR l~cYn%r0*ެtL3W?(whi)](>qMJO٩{M3*iJic!FW;N{+`;QWJ>GU/$33Ht>d5Ntq1,D;S,=R} 1kWFm ;!3俈71":dvshX}LVTPڈ!~J (u$?v[j+o(N'j^,!XBQ{~6"LsSxA< {^erU<x=ɻEHu94qzqCxRfuuBPwΕ@5>F[!3/JKC|'#n0azFx2E)!UYM].˖ (A܀GŻyEakm>4umdYpN{,)NaX+KxeY7>am.0_DǺ[_&]tu-?@ /ExV>5X$CS MQثWP2NoPuqU C\6N +c2X*\g=dh~=n"m3 R3 eQWqg$UQ,]Np} (cNu=RQ6?_>G`wQ,w?ҁ H {#DזRHFesM-=~Xgb1+|mIt$1zDz/2d=&P.:!c*v1 bd%xd= " MCpS]+n$dIGfS:J}!@vLizߋ7 ]6z1&7{ח&%DskamjdyjNd#XYk$) NU7mٕ]YI^JE>h#k4:%hMu j|Q7GusTnj4vYwԁ< '4;,?ZiaYA->N%%@"m\E07'-mcei^Tb+_ |bobzb6U29 RFm[WN!B(Feǔ7; !A2Xjp^FqXsӖU.4 >2dG:T+NOxd|fyQ _%.D"w[){@f4W 5[yuK.R4Һf F^}.}5X~~U Q'Z9sII%T?6.E*dVV _PME;7- )LNpZ32Ĝ`7/+'ߚ0ǥE J )_H~~(pˇ:+py\riR/'K! T}{ɣz#dPwnV]a>2njP๽5ٜf ȧ9~?u qrq:fs\ҰYMM}X#ݠ ?r02f2N-z-61@sL,{b[:ɨciK(%Zy4HET!΃@c"$С[vxeLOIz%^> :+j2h/Gij^J͘mŃvwmVl7$ Pv( $ڂ-^k8@LH[؅}J>δV? S`d_' QM*xG !\ ". ppy쭤%#Fs.Ĵ4[{̠4A:[xlV>@J1VYe{A ſz,ءz~.9-%HocO"ƏA1@CVeJ=gzOS  *z؍ӗ~r5}z񧶿`q;Jww95#p R͐bR-'rD$a ӊvk<+a&s&g6}gh'v3m3UtLf-n_, {mSM8yaYу,k1TcL2$Nxni;e Q /^9 Q8dGW0+QśVpI:B+cG5%ؿldK쳔*̐_42{mzy1U˭6os v]2B$:p?"{j;El++7ZLlkCba(ޤ3 j!xFreK5*(_" []>각1\-CԿ e NyPӆo+̲gM0Lҽ绪7s6] 90n3|h"Jl;cL>[&y%hb=]΋F1)ȣ7'(!oI44(u>RQc L}2ԣ qNwO0O3DNe{L%U¯+2<[& "\MVlRb|Q,jOqL6ߺdaGǂwHmt{Y~iuF? Ǒ:wT\Ί )ZU<0XH9Rs5I!pEGWr Ɇ:,_`e"h|waG ?nb Fq<]?gx,3 ,ѯ*Se`7])z-}kzu22 "(/4~W$ s[/B*Qgjۣ޻@uܪp&^=GAVI}<ƐS-Z|bkⲘ3MVĐÓ[49>^E) JS]羭^|J&8׹{w+Fb?XWmr2xtq'ގ.oڽ ,ǕwdU5;?2摬x-J 8_VMDgLUF{2`4*;q_zjk+ҦPms@f'(VM38MzG;L9oY4Խd["nV^r HNq6sc|}P Ė̕Q(3K%B^WY8SޢfWl9_/~<;*تA?^ĩ.gUl]FE9|AL ;7~EqU|x0U\Ej@'{=ZYN|Y8#>H.Rc/3RrǢyjJ(o&- -~UB]6ExtUKDT%͹SOTVЀoa;􍛊$u  ~J˓%Yk,=9Y%wg\CF^. Яo9*Ws?D/c~yLO~D'$#-`p8b*a@T9"H=u$q5{Z x8*[ñ:{1{97:L.a @EnMyb"S KT "T/|n/p}/C./p}p@RXШVl լ м YY Џ PмWIPP<YWY<QYQZ<PZP,nQ@,nYG0WȨYZȪȬZȮX>^lPPЏDPмQмPѠ8۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m