!  "W N  f kr pX7 p&B :  /B e&7 `   Ce Ԥ!e  N   " et ZEWue T!e 5 &     f r f rvr t@P ! ɋp ȋ?E A Ze   ?    7?P6 : p t *  ) k j I K J ] [ Y W V U T S R Q P O M L K J I H G F D C B A @ ? > Z = e c f d b a `  - ^ ] \ [ Y X W V U T S R Q P O N M L Z I K J ] \ [ Z Y W V U T S R Q P O M L K J I ] !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghimkm rs]Y /ld lib1 ---644 3 1 /usr/sys/lib1 lib2 ---644 3 1 /usr/sys/lib2 param.h ---644 3 l ]]\\RSTY Y XaY Y nY Y oY Y zY Y Y Y Y Y  Y Y Y Y Y Y Y Y Y Y HY Y tY Y Y Y Y Y 8Y Y Y Y Y Y Y Y ~Y Y Y Y Y Y "Y Y Y Y Y Y Y Y  Y Y Y Y  Y Y  Y Y LY Y Y Y  Y Y   !Y Y f,Y Y  -./0123Y Y 45678Y Y CY Y rDY Y BEFGHY Y $IY Y UY Y VWXY Y bY Y cY Y defgY Y hijkY Y lY Y mY Y ,noY Y |yY Y zY Y {|}~Y Y bY Y Y Y @Y Y ϶Y Y $Y Y \\Y Y Y Y Y Y (Y Y Y Y Y Y Y Y ϤY Y ϤFY Y Ϥ8Y Y Y Y  Y Y \\Y Y 8Y Y  JY Y Ϥ  ]]` Y Y Ϥ 5(Y Y ϤT)Y Y Ϥ1C\IY ϤGL\\褑2Y Y Ϥ Y Y ϤLY Y  Y Y  Y Y 9 \\" Y Y z\\ Y Y Y Y bY Y *$Y Y Y Y Y Y Y Y $Y Y Y Y ZY Y Y Y bY Y 0Y Y Y Y Y Y `Y Y Y Y >Y Y Y Y $0Y Y :123Y Y 45Y Y 06789Y Y GY Y HIJKLY Y hMNOPY Y "OyY Y Y Y Ϥ`-Y Y Ϥ6Y Y ϤY Y ϤY Y Ϥ,Y Y Ϥt1Y Y Ϥ1 Y Y Ϥ@     Y Y Ϥ*Y Y ϤY Y Ϥ3 !"#$%Y Y Ϥ&'()Y Y Ϥ AKY Y Ϥ#^Y Y ϤN_`abcY Y Ϥ defghiY Y ϤjkY Y ϤlmnY Y  opqrsY Y ϤYtuvwxyz{Y Y Ϥ|}~Y Y ϤY Y Ϥ]Y Y Ϥ=Y Y ϤZ@Y Y Ϥ[Y Y dY Y ϤY Y  /Y Y Ϥ2Y Y Ϥ2 Y Y Ϥ9(Y Y Ϥn#;Y Y ϤBF`Y Y ϤabcY Y \ Y efghY Y 7Y Y  Y Y pY Y Y Y ϶ Y Y  Y Y \ Y ϤY Y ϤY Y ϤY Y ϤY Y ϤRY Y ϤTY Y ϤyUY Y $Y Y ϤY Y ϤY Y Ϥ     Y Y ϤY Y ϤY Y ϤJY Y Ϥ*Y Y ϤY Y ϤV Y Y Ϥ  !"#Y Y `+\Y Ϥ %&'Y Y Ϥ(Y Y Ϥ)Y Y Ϥ*Y Y p^Y Y ϤR,Y Y Ϥ:Y Y Ϥ+KY Y Ϥ<LMNOPQRSY Y ϤP]Y Y pE Y Y ; \\椑?hY Y ϤuY Y ϤvwxY Y ϤdyzY Y Ϥ{|}Y Y Ϥc ~Y Y ϤFY Y Ϥm Y Y ϤY Y ϤY Y Ϥ{Y Y Ϥ; Y Y Ϥ5Y Y Ϥ Y Y ϤY Y ϤGY Y ϤY Y Ϥj Y Y ϤY Y Ϥ|Y Y ϤY Y Ϥ Y Y Ϥe Y Y ϤY Y ϤY Y Ϥ Y Y ϤY Y Ϥ, Y Y ϤY Y Ϥh!Y Y Ϥ'Y Y Ϥ$;Y Y Ϥ}<Y Y ϤC=>?Y Y Ϥ@AY Y ϤBCDY Y ϤEFGHY Y Ϥ4IJKY Y ϤLMNOPY Y Ϥ!bY Y Ϥ cdefghiY Y ϤwY Y ϤxyY Y ϤBY Y ϤY Y ϤY Y ϤY Y ϤY Y ϤY Y ϤY Y ϤY Y ϤY Y Ϥ Y Y ϤAY Y ϤY Y ϤY Y Ϥ'Y Y Ϥ}Y Y Ϥ*Y Y Ϥ5+Y Y Ϥs:Y Y Ϥ<=>Y Y ϤKY Y Ϥ`UY Y Ϥ0"hY Y ϤDijklmY Y ϤnoY Y ϤpqrsY Y Ϥ tuvwxyY Y Ϥ&Y Y ϤNY Y Ϥ0Y Y Ϥ Y Y ϤLY Y ϤY Y ϤY Y Ϥ* Y Y ϤY Y ϤY Y ϤeY Y ϤY Y ϤY Y ϤD Y Y Ϥu \Y Ϥ \_ Y Y Ϥ` a Y Y Ϥb c d Y Y Ϥe Y Y Ϥf g h Y Y Ϥi j k Y Y Ϥl Y Y Ϥ2m n o p Y Y Ϥtq r Y Y Ϥs Y Y Ϥu v Y Y ` Y Y ϤIw Y Y Ϥx Y Y Ϥy Y Y ϤKz Y Y Ϥ{ Y Y Ϥ| Y Y Ϥ} Y Y Ϥ~ Y Y Ϥ{ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ: Y Y Ϥ Y Y Ϥ Y Y Ϥ  Y Y Ϥ Y Y Ϥ{ Y Y Ϥu Y Y Ϥ Y Y Ϥt Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ7 Y Y Ϥ Y Y ϤS Y Y Ϥ Y Y Ϥl Y Y Ϥ Y Y Ϥ, Y Y Ϥ9 Y Y Ϥe Y Y Ϥ Y Y Ϥ Y Y Ϥ/ Y Y Ϥ{ Y Y Ϥ Y Y Ϥ Y Y Ϥ| Y Y Ϥ Y Y Ϥ Y Y ϤC Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y ϤI Y Y Ϥ* Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥj Y Y Ϥ{ Y Y Ϥg Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ, Y Y Ϥ Y Y ϤU Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y ϤW Y Y Ϥ Y Y D Y Y Ϥv Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ       Y Y Ϥ?! Y Y Ϥ" # $ Y Y Ϥ ;C Y Y 7 ]]tF G Y Y Ϥ#H Y Y t ]]k ]]$ \\&+S ]\wq \Y Ϥr Y Y Ϥxs Y Y  \\ \Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥ9 Y Y Ϥ Y Y Ϥ! Y Y Ϥ Y Y ϤI Y Y Ϥv Y Y Ϥ_ Y Y Ϥ4 Y Y Ϥ Y Y Ϥ Y Y Ϥ Y Y Ϥf Y Y Ϥ Y Y Ϥ Y Y Ϥ- Y Y Ϥ Y Y ϤJ Y Y Ϥ1 Y Y Ϥt Y Y Ϥ Y Y Ϥ Y Y Ϥ1 Y Y @_ Y Y Ϥ( Y Y Ϥo Y Y Ϥ:    Y Y Ϥp      \Y Ϥq   Y Y ϤI       Y Y Ϥn   Y Y Ϥl       \Y ϤB ! " Y Y Ϥ- Y Y Ϥ2. / 0 1 2 \Y Ϥ`> Y Y Ϥr ? @ A B C D E Y Y ϤO Y Y ϤP Q Y Y ϤR S T U Y Y ϤV W X Y Y Y ϤjZ [ \ ] ^ Y Y Ϥ#` Y Y Ϥ ]Y Ϥ ]\餁  Y Y Ϥ Y Y Ϥ! Y Y Ϥ" Y Y Ϥ# Y Y Ϥs$ Y Y ϤG% & Y Y ϶\0 ]\줁- ]|]\ ]]4 5 6 Y Y  8 \Y ]]`1 E ]]]]V ]]]].s r \@\(  ~ | } { z y \X\]u\ o \\m n \\嶁\\-  ɋ Wv  B   J  yru0drx<tpw (bad usage 7w@w Aw H ^ 7(- :w w -- not in archive format ׭z0 06 77w ^cannot open temp file  w  ~zvr E7Nȋ/@ w  Ћa%wwHD7@w  7  5~w nw w  -- cannot open Pw w -- phase error 4J"wW 7 5 47wW 7 5x&fw w  -- cannot create w  w f@:w  w w  w - - w w lw w >cw vw &w w w w dw w cw w no archive file w cannot create archive file w" W, w w a0؇77 w Tw `w  w Rw w Lxw w .w ,w  w w w w  W w w  -- not found /tmp/vtmamH. w < w i h R R @ pbw 0p? S ^ i t pS ^ i t y/lib/as2-g&D7 ԋ 7w &D7<7$  z7w ? A&f@N ? F&w v (7,J r e0H~Df xxxx  @% ! ?. e( -$ < < < a w t 7 f 8t ! | r& 8!=9!:7d vT!!w x̵w mݎ  , z H r n 7d N   W w xW E . E бw \. !;!  ! w 2xw *x  Bw w f ! !;!ef2& `ҐE  r@ eZ Z*2 $$$$B&e7! ev   7& R R  re  re    7\ f  dw b09 0Wq `Wt` b f  .A 7@@ ea be e7  EH 7H7 w @iw 7 7l w ? wt7LV&f fPD Z P87 2  6 " !yJlL$prp bыD//<>%7W 0W 9wv N  | v& pU7     w g< v7 f $ U ` P R< 8    \  Rҋ  > w <wn t e0r apw  <w te" w & r x444@Vbnx"xx   e !,  e !,  ef  \!, mH >E8 ~ w pU  ! z!, p N7( 7! U @!, 6 w x!('!-6!$G!*M !(   e  en r!+  !(7- v ^ : be r * @7`w :*w 2a    w e!)w ) f+7 N  w @[!a!k   Ow fK  Hb D$    | y+ - * / &    % [ ^  ! + 0 T 2!]w "] r # Y}+B -L *l /x b &V &  %0 ! ^ =   w tt3w jf rB*w XB`%w NB w DA B@w 8BPw .BpBw "f rw A B`+wd&PEEE &     U.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz/tmp/atm1a/tmp/atm2a/tmp/atm3a/tmp/atm4Z~<R ...r0r1r2r3r4r5sppcexitforkreadwriteopenclosewaitcreatlink unlink exec chdir time makdirchmodchownbreakstatseektellmountumountsetuidgetuidstimefstatmdatesttygtty nice"signal0mov movb cmp cmpb bit 0bitb bic @bicb bis Pbisb add `sub brbnebeqbgebltbgtblebplbmibhiblosbvcbvsbhisbecbccblobcsbesjbrjnejeqjgejltjgtjlejpljmijhijlosjvcjvsjhisjecjccjlojcsjesclr clrb com @ comb @inc incb dec decb neg negb adc @ adcb @sbc sbcb tst tstb ror rorb rol @ rolb @asr asrb asl aslb jmp @swab jsrrtssys clcclvclzclnsecsevsezsencfccsetfsetd setisetl clrf negf absf tstf @movf movif movfimovof movfoaddf subf mulf divf cmpf modf movie moveildfps @stfps fr0fr1fr2fr3fr4fr5alstalscvmpypmulpdivrashtashcvdvdrxorxsxt mark sob~.byte.even.if.endif.globl.text.data.bss.comm0 0P@W- 7 H7 w w S 7 w v^ 7 w 2 fDa~ Ke W 퇇 r eZ Z* UVWXYZ[\]^_`8#0 @7 0 07 jaw W z 7 d Tmp file? 7 #$ 7 Cannot open file 0 w Fw ready "7   V5w R /2@  e 6 w too many lines r@ " 7`\7`& & ȋ  4 -"[   ? 7 w,7    J @@ :w r7 jC _w w @w W w7 27 0 9e a zeb 1 W f  - - eeW :j --eW 6 w out of symbol space ~|1 1   7& 2 -6 "Newwfde2  ew 4label not found j:W@PPW ^ 7 <R " \ 1  !.w out of code space ,7 . J-  < !2 w zout of code space 7.ww  w H R \ T p    V y$0J<TpzT  _e        H   [ W  Qt   <  _ " D F ̔" &eE 0 &   `     .L & & =  7%T@ 8 >   0 7  J w jfor/next imbalance @7:  $ > 4 . @ n  *  J  6 " = & &  w  . & |   w    w ~  ,& &       > <  = ע=  ע>   ע=   ע=  Pe . + -  4 w $  $ w   . * /   w  w   ^ w    _   (  p )'  .  w zR   w &reserved name D T7 X B L (  >w RB  ) [ * w 2z 7  ] T 2 ( & ע)  ,T: \S \ \#  @w & F D\ l  *R\ $ 7 & 7 r -  b     \   v   \ 7 \w \w 2\Sw \ ` X\ w \ "w  E\ 6 w @out of space 7 \S$K!SK ~ v n  f  ^ V1@.@*eU" !\  S S w w Bad exponentiation #\ \  @#\  w Tbad return    eWpC`& D#B w subscript out of range E  j e 6 w out of symbol space Q$&0 BE E P  \SKe5 w vused before set &e 5 =w 4w > w \ 7 7 b &\e E  [w 6@ w ]w   @   x  ( 0 F \ t  H%c Zw Vw Rw nBad log w Gw XBad sine w   > * e\%  @@ewJw arg count  @ e1w bad arg % GB7w&f J 77| 7r 7r@@@@F& 7PJ7: } &  - } 0 Wp `e0  Wff&  } - } 0    } 0  f 5ww l0B`W@ &  W B~  e0VV \ B@e 7 -}     e}  wmmB W0  .} 0}   .} }  Wf ;}   V7N 7F7B@e0}  f -}  r f e0} b.out/tmp/btma/dev/vt0listdonerunprindispifgotoretufornextoctadraweraspromsavedumpargexplogsincosatnrndexprint7d@w h&w `!7J& @ Aew 875775VVfW@H77 wf@@w 7`7PwLw 7R<XCX   Bv~@@!hI@!hAy1?ϑy"?D{Av#OP#C!+C|]2CU*j 4xBJh{CW*RsCL~Sz& Wf&&7rW?WA@mW@ @ V@hZL>0BhZL>VV "@NnDOLX2xة3I䔶TX]1 D!L%dIgN5&GbqhDK-?7 fWp3e @7 E7 '&W&f: 7&@%&@A&@:7@L> Be0# @:є :    BA   W :e B@e0:m\ P&` :eȐ9 ȕ0 :ȕ1 &$`0::VV@AfW@Vw fW@Vw w VWf@@67f@f @AdVHB`R@7^&e# 7V # VVE=sMBԝ`=B.pF:|+eiD(/zC@;\)@3d@Wf&7V @W@@`RD6B^PBVwVV5@3e1@rzlB#"3h@?ØGe@lB,k$aXU> bcdefghijklm W! $-7 j77XT  & 4  Z & 6 "% /lib/c0/lib/c1/lib/crt0.ow \ 55555 @@-_ @m%-T@ @mF 7 y & & & & ^ & &@ @m :$ 2@ @m%02 @ @m%1< @ @m5N > %c@ px&of & z 5N& T _N@ p&N > %o_N _N _j %%f 2 7f  `  5 J <  .   56   2 71 2 72 2 73 $  2 75 $  2 745 u-_jW- @ x&r x b# $i@ &x& h & z 7P@ x& 7,# T$_b b$_b _^ ## 4$| "7 "7 "& _^ """ #s@ &x&  & z 7" #"7 "&r _ # h"zd"p`"7 ^"& \  n#E 6" 2">."7 ,"0 * & & o@ &x& z 5 N   N " _ "_ \5  ! !~!u-@ A p&& @  &@  &@  &@ 0 && W-W- oV! z  wj w X  "  !    w w  7 !@e7!7!@e7!!f $ @_! `%#! @_p! h! @e7^!@e7^! !Wp Aa1Wp Aa1  ^ 7*!0 ^ 7!0@eT7 !@eT7 7     n %-     WT#  Ĕ &     r Nj ^ 0w w -F F  J D @ ?<  f%#! _ _!a!z !A!Z!_g . %a!z!A!Z!0!9!_ . f ^ 5 7 w- ! _ _  @` |%   n  n f%' "K .   8 !   . !\  . 7  (? %  - ! f $ N!   . _* . ,! ww V %oC@e”ԋ w w   N ww wDe   % Tw7 7 ׯ- x v"j'7 n .h' B JB d o x f ep c~ sN l ӕ- C r f e0 1 / ҋ D~'!! f v Le0 9e z p&  m| z T~  T  T~ w7 N D @0  6Wp `e0[eӕ?f ,P   @f  x'7 !x'-f@w wfww!wwfww!wrfwd wffw~!7A 7 2fA & UfA  @e721@!  1 @ wfww!w wfww!wwfwA!F  Df@A&  6f@A @+ 9 & fA @e&7bw^X@!w7 fAwzwv5nWpe!W ! W " TwN"wwf& fw "wz w|f "& w` }w\f@Af w,.w"(e w"ew"@l  %e7F @&HF,"&/lib/mcrt0.o/lib/crt2.o/lib/crt20.o/usr/c/c0/usr/c/c12OPScpt/tmp/ctm0a%s: c0-Pc1c2/lib/c2as-/bin/asa.outa.outmove failed: %s ld-x-l2-lc-l/bin/lddefineincludeCan't creat %s Undefined controlNested 'include'Missing file %sControl syntax%d: Line overflow * Can't find %s Try again Fatal error in %s x'  7 777777777770 pqrstuvwxy  & 6 % w  W- @5W- @5 f 7 N D _r f 7h N" D _r!H %-  $ - N0 D P m 7   -  e!  e7$! %%h$%f$ @ D 7 ! ?%  ȋ! w w  5 j/ N5ׯZ  m`#D @7Pׯ6  0 ##   m #wR w @ h# $D D _~#H D _l# $E J GJ# $5N $E5N J ,# $  ` z 5 W- @!L D    P 7 y wb w P ׯ , " w" "w"@w w  N 5  @ww W- W-}Nl D Np D ww 7 "5 +7 t5 ׯNaׯFzׯ>_H5 @ @a_ ׯaׯz ׯ0ׯ9ׯ_W-@ @a W-@ @a0@e <   ׯ0-ׯ9) 7 ׯ0 ׯx0ׯp9upw~\ Xe7`l_DT @mR J @J 5 +  x_ _  j 7 z v Nm 7  wV ׯ] _t 7  y ww   m 5 m 5 < _n 5u >]Nf t 55 W- @! D  D _Ne  D @e5 e@  D  D Ne 5N 5ww Ne 5Ne 5% @E?% 5  2 :Ne W- @ ` N 5W- @ W-%@eW-e Ne  @m@ww  B ^ N t  | ww DCe!% ww  -J @E%_  w`w N5 w- fe %@e& %% @-/bm\XeE5 fe %@e&| %% t@ww bb TN %ww  B   & %%  w^w L !W-!@ 5 u-@ HW- !@ ww wXDeN  H % w7 47 *ׯ*- " "'7  .' B J d* o$ xZ fd e c s l ӕ- C r f e0 1 / ҋ D~'   f v Le0 9eN zD p&  m& $ ~    ~ w7   0  Wp `e0[eӕ?f@ ww n'@w b'-w t'@7 |wfwpw Z'7 fwf V%PH%  78 4 07B 7 f@w w wfww wfwjf@ww wDwHf@ww w" w$w7F @&HFfA7n   fA & 9 &fA @e&7:w60@ /corea.out%s not found %s not found Bad format: %s ? %o %o %c"$&'/=J(\%o%c +-[savr5%c(%o,%o) w w&w w crt0.ocdb.oprintf.oD ffltpr.o putchr.o getchr.o@ fstat.o open.o read.o seek.o reset.o retrn.o rsave.o. put.oN savr5$'_main"_fcore$ _fsym$ _symoff$ _lp$ _errflg$ _symlen$ _symct$ _symbol$ _symflg$!_symval$!_ssymbol$!_ssymflg$ !_ssymval$!_line$!_regbuf$!_uuusp$%_usize$%_uregs$%_textsiz$%_pc# _r5# _dot$%_tdot$%_dotinc# _lastcom# rsave"0 _open" _printf"D _read" _fstat" _setexit" _getchar"@ _command"vrretrn"> _expr"_getcnt"_scomman"_cget"$_printc"J_putchar" _vallook"_reset" _printtr"j_get"_symlook"<_findrou"t_symset"_symget"_eqstr"t_savsym"_seek" ndigit$'pfloat" pscien" _fout$'_flush"* putc"p flush" retrn"( _errno$)_fin$%cerror" mrsave". putw# fcreat"N {|}~  & 6 $% /dev/rk2/dev/rp0/tmp/ktmpw @ @m W-@  W-^@%-W euL@ =   @ >  1 e@ >  1 e@ >7 e7 y  7  7` eN  N  8 .W-N  ww  f  7  N$  _6  N ?   7  _6*  7 ~ 5: ~ ^ 7:740  _6 7^t 7z  _6  _6 7!*@e&e N   t@e`    1t-%v& %nawt@0 R  D4  6_67 , t_>n  *  7ZP r& e w-F@ W/6N8 z D/l  D -@e&  f   < z e * _6  N fQ f  7  N@  _67 <7 777  ee!7  R& l%   r  _6   V& l%  X VP\ z e76 ! aE7`tE7`  n z  :t!aE  & z z%  z  z  z | z l z b z V z J z , ww *  ww @@5 @ @A@ww 5_h $& %7t a  @mep@@&e@~mvep5  R_h @E%@6@&@& % v! r d^ 7  7 F0 e  (i 5H  !A @m 8   @m& l% _,@e @m& N   @a  @a& l%   ! @m   @m& l% w w D  , N& e  7! N& e  7!7e!7!Nz& e_ && % %7t` 6 2 _ N"&, e_ ` _ @e& N  _ _  @a5_ c @a%. @aU @a%. @aG d^ 7rn  7 ^P @a?LH   `@a  f  &@e`R %`Je D 5, @e`ff> e W-t@- N&X e_ ~@me_ w@ w .  @% . . . .@,(,7!*A1"  N&  e? ? ? /  @& Z%@e& %@ej z wv w d fe& %7!7N& N t@mEp z e @ e @ w w N /& /&  & :&  & ww A r e0 A r Ne0 N wxw f   dv  _J     @e& N w d   Aap ww f Z%f %% N  ww -*d!"5 W-d @ @aA p 7 @ef  pwVw DfT Z%fB %% N  ww 5 @ 5W-0W-9AWp Ameu@ww N f fff ze ww W- _ wvw dC W-  ,7! #  N  %  N  e  N ww CB7!-eww wDe   % w7 7 ׯ-  "7  .B J d`oZxfe8cFsl ӕ- C r f e0 1 /R ҋ D~' f v Le0 9e z p&  m  ~    ~ w7   0  Wp `e0[eӕ?f ,|P r l @f P 7^ > 4,-&f@w wfw w wtwxf@)w`wdfwwwDfwww*w.w 2w f wb AupNNmf 8 ww  < @@5 _ fA rBpu@@m55D@5!f& %5 @&   ` 3f %5 `@&   5!`@&& %`@&  `5!$@@AA Nf` 8 u Nf 8 @`5_B@& %@_ww  DCԒ ww z DCB5ҒS w^f@www"w&fwmwwmwfwww wf@w|wxw wfAww5WpeW  W 0 w|0wvwff& f$wNfwD6w2 w4f@w*w&:wwf@7x F @&HFESTEDTw N  ww @eL@4 &   , J, J  , Uvow d 5/ d 5D   ,  , &    ww DC 0@mem e rfww p@&f % ! r<R r< r<R r< rWtC` re rw F 0! 0 ~ 7~  0%n  ,@ @  7 D !ww bAA Wpe|CԔԔԔ @eWpeCԔԔԔ& T ed& T ed& T ed& T e@ & T ww A r nmww D W- C r  r e0Tԕ A r e0Tw6rw 6r@f@  P`Hm`  dbgilsu.%s: /bin/checkcannot open %s %l %4l/.cannot write %s URKfree%l dups in free %l missing %6l %3o spcl %6l files %6l large %6l direc %6l indir %6l used %6l last %6l free %6l idirldirsdir%l blk; i=%l(%s) %l geq; i=%l(%s) %l bad; i=%l(%s) %l dup; i=%l(%s) %l ino; i=%l(%s) "%.16s" %l din; i=%l(%s) %.14s%4o bad freeblock read error %d write error %d out of memory  !7777777777770 PF^bDay Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecv & 6 % w >W-v  >@  ʋ07  >te@P 5! @m&    @m N >ww -F> 5N  Nf %wdw RwDe   % w67 7 ׯ-  "7  .nB Jdoxf"ecsl ӕ- C r f e0 1 /* ҋ D~' f v Le0 9e z p&  m  ~    ~ w7   0  zWp `e0[eӕ?f^ ,TP J D @f (  7   -fwww wError 0Not super-userNo such file or directoryNo such processError 4I/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedError 14Block 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 systemf@7F @&HFarg count bad mode Unknown error%s%s: %s  4<Lfv~ 6HTfv(2D! w nchown uid f1 ... eCע0ע9w 7w w 2Can't open /etc/uids w w Who?  : w  ʋw :w F>w w77 Ћ w ?  }  0 Wp ` /etc/passwdfA7~ fA @e7x1@  1 @ &@wLՋ@@ 7B Ewww &w ~U%F2^   Wq 0W 3E`e@t7 &&@tEe B &error /dev/junk%w Usage: cmp arg1 arg2   w Can't open arg1. 7H w Can't open arg2. 7& w w (  w T:  w F  w : ew H w &EOF on arg1. w EOF on arg2. w EAW,@E @we1qe@e& w#we07   & 6 % w 5 W-@-@t eW-   %  @& t 5   % @ef  uN@&  5p@e@& T @E%@Q@5@5@e5@ A AH@@/u@ = @ /uN@e&  5 4  %  L  % @e&f 2%5/@ d  % N@e&f %@-  p  %  @@ef t% @e& % wNw <u@ @@mȕ A r 5 N ff t% @@mC r e0Ȑ @wfww~ wwf@f@wd w wf@wJwF wwfw2w. wd wffww wDwHf@ww w"w&@&HF7FUsage: cp oldfile newfile Cannot open old file. Cannot creat new file. Cannot creat new file. Read error Write error. X & 6 % w W-a@7    % l  R    R  |\  f   % $ 5 }, & f B%  f %     %  Z & %  %ww  p _h _h V5W-_hW-_h 65W-5 5 \W-;X  @e @e  ׯpe ;W-77 7 el!  r   > rNe rN  N<   <  wnw \>@m7!4 ,7*wLw :upw  rN rww ʋ$eWp @ !dʋe `wfww. wwf@ww4 wb wdf@AwH wJf BRw4f@ww: wwf@74F @&HFESTEDTw N  ww @eL@4& & R  6, J, J  , Uow  5/  5   ,  , & R  6 ww DC @mem e rfww p@&f 0%  r<R r< r<R r< rWtC` re rwZF !  :7: %n`  ,@  @ B 7  ww  b AA Wpe| C ԔԔԔ @eWpe CԔԔԔ&  ed&  ed&  ed&  e@ &   ww A r nmww D W- C r  r e0Tԕ A r e0Tw6rw6r@f@  P`Hm` bad conversion no permission /usr/adm/wtmpPFDay Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDeczD ! ww$w,!w"wX7J7 H7<4"-P-F(m- e7@ ]]7`"7@"e"7@w ,7 7 0 0r!!!dr7tjdE7h7 N p BT,:: .:,$   0rw ? w File not found.  ׭ ԝ A  y +7 7 ~7 7  0  9Y a zw A Zfw 0 @fZ+Z-Z ._^*P .  7 ] w t 7 -+m+     0 p P` 0 9 . w  "f   fԋ.09AZ _az   2;wԋw7$ww `n /\?,P^=:!d'"$&%`A Aw A !%)6=G^nrvb`^ZLNPXRhjrzz~llllllD  D   6D   w   j  D  @ 7w JD7  w H   t 7 h w F7 V w 87 Dw r w 4.  8 4mR 4N w  5 w <  7  w &   - E     w \ v e0 ve0 ve0 w  XV R7t DBL ,E@w   E  m2  W&  @-   @e0 . @e0 E f -  r f e0 -*.L@ ,d  7 : f$ $ $$ w Q$B 쇷 7 f" w! A  C W  CBe @w <7 zx & 6-H? mTm6 6 !0  w@ L Ew w w *w (w )w bw ,@w `7  w  䇅EE @ Ex. 6 L f  ` I \F  B F w )+9  (w -( j (,   ~ L 5  5 w $ L  e@` 8 E 7 r0r1r2r3r4r5sppcff # @  , w ,-w $+ Aew, w t4  & @D@$f &^emov cmp0bit@bicPbis`addsu? clr?@ com? inc? dec? neg?@ adc? sbc? tst? ror?@ rol? asr? asl?@jmp?swab?@ldfps?stfps?stst?clrf?@tstf?absf?negf? sxt? mtpi?mtpd?@ mfpi?@mfpdpmulrdivtashvashcLbrLbneLbeqLbgeLbltLbgtLbleLbplLbmiLbhiLblosLbvcLbvsLbhisLblonhaltnwaitnrtiniotnresetmulfmodfaddfmovfsubfcmpfmovfdivfmoveimovfimovfomoviemovifmovofncfccnsetfnseti nsetd nsetlrjsrxrxorrtscflgsflgemtsys? mark~0sobsploctE  E8& E  tw 7`m7 w 7`  lw 7`~ Zt tE  >E5U m( t d 2w 7`  H 5 5@  nzvcEE E d E 0 2  w ^;ezew   !',16<CJQW\agkrw|  jcorea.out?0HangupInterruptQuitIllegal instructionTrace/BPTIOTEMTFP exceptionKilledBus errorSegmentation violationBad system call?15?16?17sp ps pc r0 r1 r2 r3 r4 r5 fr0 fr1 fr2 fr3 fr4 fr5 fpsr releexitforkreadwriteopenclosewaitcreatlinkunlinkexecchdirtimemakdirchmodchownbreakstatseektellmountumountsetuidgetuidstimequitintrfstatemtsmdatesttygttyilginshogsleepsynckillswitchesboot"/sppspcr0r1r2r3r4r5fr0fr1fr2fr3fr4fr5\% R\  Input file. 70 07 , .w  w    wZ wX wP  tw  `w w :   yw-ZxR VFB F6w0L&,7 4 X7 w| 7  *       /etc/msh! W!_ @ .  C  rd 8 w _ X W!sw_  , pw w F _  f  "  ,  wL : _    w0  v   C   w F tw r l  f X H J   > vw _B  Z_C N   wn \_f   B_@@ _  _7    ^  Fw _C _B ,  V Pw _BD C 0 _0  _5WpdD `    LBe  r v f C f  C f   d   B    V P  D 8 n * w F V w& 0 @ 0 ]   [  wP wH 6_f  q, e-   7Nesting depth. eX-T? L7  | ! j7 Z ^ V  w 2 l      wP :   w4  w   J N   xw  w rJv^w f X ~׭06׭9%0 4  w: N  `N  *7׭~A ׭vFn7d` XR7 N  @ 4f 7" 7 r vfwW!_ w W!   A LfW! xW!  & 7R wLf&&  c U  7wVu > B a  e ` f N V       p- (     Y   0  S N )~ B   \ n r 7J    @ D  r e0 xe0 l   d  r &  P   C " B v $  1  *_@^    -1fv m &&  Z0 ( ^ b     v   z e0 4  P6 0   -     . f & Re0 9e   _@ zb  l d7 \w6UW!P Out of pushdown. W! A 0? v!%*+r-~ ./Z0Z1Z2Z3Z4Z5Z6Z7Z8Z9D<v=>?ZAZBZCZDZEZFPIrK2LboPQSVvXZD[^h_cd0fPirk2lbopqsvvxz&&f  f t l7 f !  @amJ7 F dd6ed(     q   c  qf& 7   eddd7   J * . * cq *  qf& 7 :      Hv  Jw      v  w l  v7    . m 6  pc ` rd@  `  c  F  t-  *-   f& "vwd7   w  d p t w w 7   w  6 B F w w w   l_7p   \ 7 b N  W!  J Wqd ` < Dqd `D D s  pd `pd `B @ v  r     &  p c rd    x | & r h  edL H  @ l  . $ q,w   <  0  :f   7 Em 7  dd    8 <q  |  q p ^ T FF & Pf   <f  *f  7    3 v    \v  B " 8v z t ! Pw  X J v  @  2 $ @@@@ ,7 " 7   q,@W W f&@l1 11 1   r bqq,Æ @f&q,@ @ J q,  f1N1N1N1f&q,@ @  2 q, q,q f&CC  n H 8I 9 Blqqq&@1 7 &  P    e &e  p@11      r  Out of space. p`Z pr@@ @l12& $  1 p f&7   `C? <<\L\\\e ),  B,4l\4  02 A  p Z&Out of headers. 8&N ~  @ @W W W,W,-@@& ,\e  &f7e0 ~0   zwv1 1  p\e1A  w\ J_fn fj    d h &  6 @ De B  % !! ! _7 ! !m - 5  m #  > %7 - " 5  &7  x  `ȋ   x  -j L  j 5F :T  T B F E5"  5S     7  _ Ԧ _w4w " -   %7!"  67 ww =@ ȋ  7jww V 0 9 Wp @@`et  t 7 CpC"7 y " L w,w D5!a!ze5!A!Ze  vww   -p zww  @ P b 2"!  f  ` v R 2 40-& v7 7 ,wTw BD5!a!ze5!A!Ze !E  v"W- - v 7 -  - vww   ww d^# L%VP# L% F_<&# L wbw P@e& %wBw 0-D#  #f<# L%ww wDe   % w7 7 ׯ-  "8$7  .6$B Jd2o,xbfle csl ӕ- C r f e0 1 / ҋ D~'R#V# f v Le0 9e z p&  m  ~    ~ w7  x t0  jWp `e0[eӕ?fwdw`Z#w8w<f@)w$w(fw8w4`#ww f@wwf#wwfwml#wwmwfwl#ww wfAww5Wpel#W r# W # w#w\wLf& f@ww#wwError 0Not super-userNo such file or directoryNo such processError 4I/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedError 14Block 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 systemf@7F @&HF    [.<(+!&]$*);^-/|,%_>?`:#@'="abcdefghijklmnopqr~stuvwxyz{ABCDEFGHI}JKLMNOPQR\STUVWXYZ01234567897-./% <=2&?'@O{[lP}M]\Nk`Kaz^L~no|JZ_myjС !"#$()*+, 01345689:;>ABCDEFGHIQRSTUVWXYbcdefghipqrstuvwxibs=obs=cbs=bs=if=of=skip=count=conv=,ebcdicasciilcaseucaseswabnoerrorsyncbad arg: %s cannot open: %s cannot create: %s counts: cannot be zero not enough memory readwrite*bkwxnot a number: %s %l+%l records in %l+%l records out %l truncated records %s: %s Unknown errorB$7~7x7r7l7f7`7Z7T7N7H7B7<0, 4 D ^ n v   . @ L ^ n ~   & 6 % /dev/rk2/dev/rp0w W-@   u-W- @ @m  @ @m w0w  f 6 7! !N      5 $  N  ! ww  5 W-d  D@ 5  9\e@-w-N N0  % 8@ef  w5 W-d @ A Aap @ww f v%f T%5%NF  "fV % ww w De  ~  % w7 j 7 ` ׯ` - X V ,"7 N  ." B Jdofecsl ӕ- 6 r f e0 $C~ fWtE Ee0     p`wp d  `XΟT N  F  :  2w7 $  0  Wp `e0[eӕ?f@ ww "@w "-w ""@7 wfww "7 wf@w~ wfw0w,n w^wbf@wwt w<w@f@wwz w wf$wf@7 F @&HFfA7   fA & 9 &fA @e&7jwf`@  %s cannot open %s %l bad free count bad free block (%l) read error %d count = %d; errno = %d w w&w jw `% ZiFE @b[7]@R P : ׬/ӕ/Z95`ҋ  ׭  ׭  ׭ ׭x׭y .? V( nw  -a s  7 ($(V( ΀w Ef5 ` (P   w e%@$ w ~ &f # ! -.-.. ѕ/W/   De  w  L p d ZfpĝkeD wW!feweD&f  s f e0 w ( .fA7vV  fA & 9 &fA @e&7Bw>8@xw w&w w d  & 6 (% i/dev/rp0/etc/ddate/dev/mt0w ) W- @    eu@_@ g   d 5@ )f %N 2@ Wp w&e  ( 7(7(`T((((@ t5e @ w-v( n(wj(  0d hisu_|W-$  @>   @& 7!! @D  nT )  !  t& $ t  & 7!!5 5 5 w-;#fe  # %*# & $ 5,H',@',:' um@ ee  Nfl % # .&&&&&# Lt& $ 5 @  |e 5 w-#fe  # %e  ee  R&  F&~ 5@)f % ) ww @ @ N ~  ww %C .@e % L5 @ W@e@e!835 '&  ' ) @$%  % |e @%&  % |e@% . @% | $ww f N %f %% N  ww C  ww ~ B d 3 N |w`w Nd& `&-~ &$ 2 @7B&% 8& 7 ,& f# %%  bww  @  0 9Wp `eDww ffE %' ww x 7X#T#   wVw Dw^%DeT%  N% % Rw(7 :%7 0%ׯ0%- (% &%,+7 % .+ B JdZofeBcLs l ӕ- 6 r f e0 $$C~ fWtE Ee0p$ f$    @$`w@$ 4$ R 0$($Ο$$ $ R $  $ R $w7 # # #0  #Wp `e0[eӕ?f@w wf@f@ ##w~#w +@w +-z#w +@7 V#w^fwJ#w +7 @#wHf@w<w8 w"w&f BRwf )  )  7 ߼ 7$ 7 fwm wwmwf@ww!w wB@$Yfwzwv!wNwRf@w^wZ !w,w0f$w&@&HF7$FfA7!  fA & 9 &fA @e&7w@4!ESTEDTw LN  wDw 2 @eL@4 &  , J, J  , UXow | 5/ | 5&   ,  , &   w`w NDC H @mem e rfw w p@&f %6". r<R r< r<R r< rWtC` re rw!F H ! H  !7! H %n  ,:! :!  7 !.w@w .+\!AA Wpev!C+ԔԔԔ @eWpe!CԔԔԔ& l ed& l ed& l ed& l e@ & l +ww A r nmwpw ^D W- C r  r e0Tԕ A r e0Tw&6rwN 6r@f@  P`Hm` ".:bad character in key no file system specified %s: cannot open %s incremental dump from %l files %l blocks %l phase errors date updated the epoch special read error %l change tapes write error can not open %s .w w&w w PFv z Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec@. & 6 % w L u-u-  @ @m& `% ww wDe   % w7 7 ׯ-  ,2 7  .0  B Jd4oZfdec&sl ӕ- 6 r f e0 $C~ fWtE Ee0     `w   Ο     t  lw7 ^ T P0  FWp `e0[eӕ?f@ &w w > @w > -w > @7 w<fww x> 7 w&@&HF7FfA7n   fA & 9 &fA @e&7:w60@( %s%cw w&w w @t - $w w l 0 000 < 07 *7 T*7 j$ @$\$7   ע-  Z**Ғє$$$ $w@w,w P0 7 $w P$w W # p$ 7 j$#j$#f$w X$# 7!# 5 7#*d w  #,7 ($w  $ $ $$$w XD;N,\-#X##R#w X##w *racdefgi6klmnbpboqrsvw=V!t w pw W DCw p s  v87 ww w N&w w Dw N 2#2#w w 0w : #"-""z"z"w w #-"`" "\"w 2f wfw6w w w "w w r Z%e"-""""w w w V w w  W 8% 7 dw 6 w  w w Z*7p"`"!7 l"7 f"w  w w 4w W W fw  Z)w W \w W USW N #w t W g !7 !ww !!w w ! ׯ! w w Z'!w *w !e!-!!؃ w ww w nw Z*7|!7 |!Z'z!`!w HZ%w  7a`!D?^! Z!-V!Z) F!Z'ӇZ'@!! e!-!!ك(!Z'7! ! *w Dw w  B w &w &0  0w L    /etc/mshww * | -eb ^ Z w~w w Xw :F w .w e8 -4 4 . wZ%Z'7 , ( -$ 2ԕ\ԕ w Z'   "ԕԕ^ ы ԕ\ $eTԕԕ-ԕ w L Z'  r  e0\ > <OIww& w w > Fw W W w 0 7!E7!ew     *% w \ W  W \  T!B+T w:w w fw w w -- ~w`  fd\    @7 6*b ^?Zw w W Cw w 2 :e4-0$z$&JZEw w z$Z%Pы w jZ%w w (W ww *ы w <* w 7 7 w  B p  +/T?-.($00123456789'0 ^8w $w $rw j ww pP%wDw Re#H@#<w #0w $##w #w P%m~wx , ~w w w W 0W 9p0C`wf 6. :7 4 `wwlww w ,hE 7!\ 7w ^P%w\& z$ J  $ $@$W $ &f Z%w ӕ w :Z% r fw e0 x  p7! 7RN R7<7:27!0w &w 7!7!~ - r w|wLw fW pw \ W Z%w HTW !Z'-. - J܆]  7w f e#7!Z%w 5w 6` w W rz" 5: 2z" -e * 4TMPZ%EEz E7!7!z" 7 z w  5ewZ*w W W w W W T!*!Z* 7 Z**Ԕ*Z*Z%w TW !Z' >: 6 $Z'7`7Z' (w Bwjw F`76 w ab Z%b ׭z#7b 7~B+777w <>7 .z$7  $w <8 b eE# ww$w d w w V& w P, w w bS 4% 3%ӕ w w :W S 4%݇7 &ww pw ww  w Zӕ$ 4%Ƈw Hw @ w W ^zerw W S 3%͆w W ]LFS 4%Ջ׭Z%Z' פ e7w Z%7 7$yXnv7 &w   Ԥ&  & w Tw J7 z&wn  &w d 7!X6e! W Sˋ   Ӌww`Z%Z'Z)w R & D7! Z)E Z)@  Z)w D T  w| ~   8% X7 w@w 7jwd\   ! tmp file ? Editing System *Z'z w^l ^> * ^ \r . * $ [ w  w/tmp/etma*z$ & 6 % w 8& & .%w2f@ww w$ w&@&HF7F@J & 6 % w  5555 @@-[ @m%-@ @m 7 y@ @m5N %f@ p &of $ & 5N& @ p&N %o  % % _  5  5 u-_W- @  & v 7  h$@  & 7X$ %U %R M7 D$% , 5 @ : Z 7( $, $. $7 $%6 , o@ & & 5 Z N> L D Z NJ v $  $[ X5 \ #` #d #u-@ A p&%@ p %@ t %@  %@ 0 %% , W-W- oT#  Z wH w 6  | w2 w 7 #@e7#7#@e7##f @_# %## @_# # @e7#@e7#5 RW-RARWp Aa1ARWp Aa1 R l 7L#0 l 78#0@eT7,#@eT7#7 #if  & 7" l  v t (-"""  WT#""" ""&  ""  t" l" `" :w w z -H"H" L"F"B"?>"5 5%#W- _ _W-aW-zW-AW-ZW-__!N " Z5%a zW-AW-ZW-0W-9W-_ " !Nf l 5W-#7 z!w-l! W- _ _ 5W-@,! 5%   h h_@5%' "RN " R5@-   "W-\ , "7 W-*? 5%  -l n  ` f N  _< 6 N " 5_ "W- @w< w *   v Nf v    w w e-!  He-e7ww  Hww  _v7 p_7 h v5@!7` y + V5%/ H5%/  47%*/-  @ww  5-   5  @ww  u5 @ 55`A 7rfuWp mVu6uu@ =@ ȋ@e@- 4Nf \ ,Wp mBe B ˆ 5 W- @@mH   @ww w@5 "@  "ww z5 u@ 5 W/5  W-W- @ %.@ w(w u@ ȋ@p@ww  5Nf N! v  @e @- W-.! v _ @E5   N:! v (@tEw`w N.( $A H@w6w $N %o%u@e5u@ 5@ 5@ ȋ ww   N |ww wDe  | %  w7 h7 ^ׯ^- V T" '7 L . ' B J d\ oV x f e4 cB s l ӕ- C r f e0 1 / ҋ D~'N!R! f v Le0 9e zx p&  mZ X  ~      ~ w7 , " 0  Wp `e0[eӕ?f ,P   @f  '7 V!'-f@wr wtfww\!wTfwF wHfwb!7A 7 .fA & UfA  @e7D1@h!  1 @ wfwwn!w wfwAt!F  Df@A&  6f@A @+ 9 & fA @e&7w@z!w7 fAww5Wpez!W ! W ! ~wx!wwf& fwJ!wz w|f "& w` }w\f@Af w,.w"(e w"ew"@l  %e7 F @&HF!cpl%s: fc1/usr/fort/fc1as-f.tmp1/bin/asa.outa.outmove failed: %s ld-x/lib/fr0.o-lf/lib/filib.a-l/bin/ldf.tmp1defineincludeCan't creat %s Undefined controlNested 'include'Missing file %sControl syntax%d: Line overflow *Can't find %s Try again Fatal error in %s '  7777777777770 @^4 & 6 % w *BW- %x   "%& & %1 & & % 7@e   "%@@e& X  T& %ww 5 5AW-: W- @ 5 5% W- W- @ @ @mH h5W-  V5@@m ww 5 @@mAAm  @ @m ww  ` wf@)wwfw   f  Ew `   7 dwlf@ww wF wHf@ww& w"w&@&HF7 FfA7,  fA @e71@R   1 @  x h""X @h" h"$$ttyЋ7l@ bgoto error label not found www R&w FU/dev|  & 6 % w D@ @m wwW- Z  R  | %& & %ww -~~ r n mlww  05 &   @] 0@ww  45 &   AA @@ @wTw B R&       ww 5 _&   $5 &  _@_&   &  _&   &  _&   ~ _&  % J @e  RD @ &    < 5 (f   &  $f   &      % ww Nf v 5 N 4 w^w LwNw < @aAa   @mȋww j 5  f   @ap  f   _0 @a0 @8@e&f J% @` @m @`0 @e&fe J%@e&f J%w8f@w  w fwwwfw wfwpwlwwf@wTwPw wf D& w }w~f@wwwXw\f@Af w,.w"(e w"ew"@l  %e7F @&HFno command -o-a!()-r-w-c{}=!=if error }}/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  1 W- 7 0@ 0 p `   % ܆   r f  e07(: not found non-numeric arg  v0 0 7  w w h 7 w  7 .)w!P W-  7 7 ~ 7 7 > e & 6 e?E?w eE C`    .)w! W- @ 5 ` E`'e 7a .)w! G  +W- ' $7.  $ 5 7 ~ "j 7 #V W-# W-'$` 5a u` e wF D 7a@  | m  .)  7  w 6@ eT w (F w R w X w L  w 4Z  7  7 @  w @@w @  7 v 7 t 7 r ? Z ^T w Bw w @w F T w Rw X.)w $ W,  @7 w Zn " e @w dL w ~L b h b 7 V w Xs  h b  h      7 f ^w 0 w F8-  e w 0, - "  -  7, w :- w @     x W!^4-  m  w ZZ m<  ^w > w(  W p xPU 7w m7mv7fw 0 ^ыw W/ы$ P , B .w xw 1w , - w  w rG -r  w @7,X7, Rw  W!^!w 6 ww w 0 w 8  w X  w Rw @w 0 w 8 7ww   \w Xw Fw w 0 G w 8w  EE . w 6- .)mVf s uQm !E m  Pn 5$ @w L  ABU efe!"7w w w7 w  wLAB wdew@e 7w @qAB b7E@`e@efBJ b &w eB$wE`wU ( w $ @@d@d@d rD e^! $ P$P$P$P$ !.)^!e 7 e7.) $ P 7 f& @ &} w    | fAw  w $ w 0    e@*  7p w Pw wPF    _ Nw m*  e 2  wW-w 7 n7 7 w  "K a D7#, > . E74 7~e7%* e``BdBd7 77 w . w "8 w@u5lxe&rsnBdB v ~7 h raA@7p   w 7F e~$      w w  `E  7n N^7!&% w ,G w7 77w ' 7 mvmrmnfM$ u$u$u$ a.outl.outun: Can't move output fileNo relocation bits: Too many routines loaded at: Multiply defined: Too many symbols in: Relocation error in: Premature EOF on: ld: can't create l.out File not found: Format error: Symbol not found: Multiple entry point:/lib/liba.a ;_etext_edata_end^.) mP& & 6 % w :W-   2% W-@/@, @0R @&  E%@   2% @@&  2  2%  wzf@fwDw@> wf whfw*w&D wF wHf@w wJ w"w&@&HF7FUsage: ln target [ newname ] No directory link Can't link ...arasbascatcccdb check chmod chown clri cmpcpdatedbdcdddfdswdudumpechoedexitfcgotoifkillldln login@h & 6 % w      @! 7(!%x   % B!!h!W-@!p!ˋԔ5   % 5h%  h !p!Th!p!ԕ @ezh!  _@ez Dע:Zx!& @ f lE^ x!& P    %@ep 25h%  h JAex Thwl x!& P &  %@ep _ר:_ D5 fע: AfWp ”`euf 5 dע: AdWp ”`eud  D D   (  %_nr! n6 ^ 5j%5nW-na'n @net&fj %h!fj %Nj @ ^ 5j& fj %h!fj %Nj  N ^ 5j@en&fj |% @en& %Nj  X ^ 5j `  %Nj Nf"  Nd Nf ˋp  x  $% z  %   %_nww   ^ 7%DC 5%  SC @e!ר:5 V 7 N7 L7 J@ww xD:ԋ   % 8wTf !!  7  7 7 fw w wfww w wf@w wfwr@ $7 fwfw@e7 wpf@wz wX wZfwdw` w8w<f@wHwD wwf@w,w( w wf@.w wf@w wfAw,w(5 Wpe W W $! w$!wwvf& f@w*!wH wJf BRw4f@ww.!wwf@7F @&HF x #"4!@# #$$ttyЋ7~@ tf&f%ЕЕ %P %Cx 4&$# ^! rB`E \:! d!\>! h! !% %T&T'E R#S$ 4&4&'T& 0 T'& s>e0W!9eW!ZeT!<&ᇅ4&/dev/ttyxSorry. Name: Password: No directory /tmp/utmp/usr/adm/wtmp/etc/motdmailboxYou have mail. /bin/sh-No shell. Login incorrect. /etc/passwdBad /etc/passwd  7Z7T7N7H7B7<76707*7$770/dev @ @  @ & 6 % .w " 7P$ a@-Ze @ȋO@, h# h# r# Z# V# b#   7zp 8# @# 0# ,# (#a  xZjp`  "  "7 "7 "7 "7 "   5 u-e@& t LU & r&& : e&!G5 :" @"7W-  V  "> r& : e !!    e e Fw w D-_V !&  !d D,  @e&E Z @e2  E:  5`E&E@ %& H  e eL   &  X  5^  b  w w Z & R h %7 J5 5 5 ! 5% ) 0W-: 0 @ @mHW- AWp Ameuu-@ @m w. w  ff %5 !et`ww w !  fww C =\  ww #CˋԔԕ/C Ԕ  #wrw `!f _N  _p7 `$ !   N ׭D.-: b$f R%& t , `Ȝb$ T p ww &e- epjed4 4   (_@ef N  55 5   _tE@E%`E @E%@E`Utttttt5` ^ttt LttN@&  7`2ww tDC E}% E}%P E}%E  , , , , wp@%55 @5up@  ww wDe   %  w~7 7 ׯ-  r$7  .p$B JddofeBcPs l ӕ- ; r f e0 ) ' ҋ D~ fWtE Ee0 z p&  m   ~      ~ w7   0  |Wp `e0[eӕ?f@ XPww 4z$@w (z$-6w :z$@7 wfww z$7 wf@w wf@)wwfwZ 7A 7 fA & UfA  @e71@!  1 @ wfww!www w wAupNNmf h ww  l@@5 _  fA rBpu@@m55D@5!f& %5 @&  ` 3f %5 `@&  5!`@&& %`@& `5!$@@AA Nf` h u Nf h @`5_r @& %@_ wfw TDCԒ wBw 0DCB5ҒS wfwm!wwmwfw!ww wf@ww!w wfww!wp wrf&&CB  ԕ- & e0fv   vA W  ~7rF @&HFfA7 !  fA & 9 &fA @e&7w@B!ESTEDTw ZN  wRw @ @eL@4^ & "  J, J, J  , Uow  5/  5   ,  , & "   wnw \DC @mem e rfw.w p@&f %x& r<R r< r<R r< rWtC` re rwF !  7 %n  ,H! H! z 7 &wNw <#j!AA Wpe!C#ԔԔԔ @eWpe!CԔԔԔ&  ed&  ed&  ed&  e@ &  #ww A r nmw~w lD W- C r  r e0Tԕ A r e0Tw46rw6r@f@  P`Hm` &&/etc/passwd %s: total %d %5d %2d %-6.6s%-6d%3d,%3d%7s %-12.12s %4d %s %.14s d@b c-r-w-s@x- r-w-sx-r-w-x-j z %s unreadable %s not found &w w&w 2w (PF Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec   t"  & 6 % w W-_W- @%-_<t  p  5;  0 52Bf N % '@ N l 5 W-@B% @ApBn @0n= < 5n z $ z  z  z  z  z  z  p  @- l W-@55 W- 5<  z Y z S z M z G z A z ; z 5u @@-*@ @m& | nf e@ @m @@- u @@-&@ @mȋ7@ @m&  @ @m&nf e   0 5 p <f N %5 N< %W- p<5&& N %@ 5Wy  D%  p lww ~5 fNm< H 5W:W @@m  w<w *5 @ @m ȋN   7   f       &  f f De N p @ @mww |5 @@m5AAmA   wNw <5 5 @@mȋAWp B Bm`eu@ww 5 @@mȋ 5 @ @mA AmHww  *@a@%zf p @6 p Rf 5 5  f 0 5N l N NL p  5 @ @m ȋNef f %f N %5 Nf %  ^f % N l f p - f 0 5 N l N ff N %5 Nf %N l N l  f 0 5N _f 5 N l N %f N %5 Nf %N l N l N ww wDe   %  wl7 r7 hׯh- ` ^"7 V .B JdVoPxfe.c<s l ӕ- C r f e0 1 / ҋ D~'`d f v Le0 9e z p&  md b  ~      ~ w7 6 , (0  Wp `e0[eӕ?f@ wB w @w -w @7  wfw w 7  wf@wp wrfwwhwPwTfwn7A 7 \fA & UfA  @e7z1@t  1 @ wfEwfwBw>zwwf@w&w"wwfww wb wdf BRwNfww2 w4f@wwwwf@7.F @&HFfA7v  fA & 9 &fA @e&7Bw>8@ x  "r@   $$ttyЋ7\@ RESTEDTw N   ww @eL@4 & Z  > , J, J  , U`ow 5/ 5.   ,  , & Z  >  w w DC @mem e rfww p@&f 8%J r<R r< r<R r< rWtC` re rwF !  7 %n  ,   7 FJww RAA WpeCRԔԔԔ @eWpeCԔԔԔ&  ed&  ed&  ed&  e@ &  Rw@w .A r nmww D W- C r  r e0Tԕ A r e0Tw6rw 6r@f@  P`Hm` /etc/passwdCan't open password file /tmp/utmpWho are you? /etc/passwdmailboxNo mail Save? mailboxmboxOld mail in `mbox' mailbox/mailbox From Can't send to `%s' /tmp/mtmcan't creat tmp file can't open `%s'  w w&w w /devPF Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec 7 @D /ѕ/ѕ.  D E#6'F$Ct www ѕ.  @77 Ћ . ? J & 6 % f|uW-   |% @5@5J!@&    |%  E%@_J!@&  2  |% @5@5} @ L  |% F@@ / R  |% @@ / j  |%  @. %  |% _  N!f  _E%@=!@ A AH@@/@5@5@ @ /u@ A AH@!N!f  `- -   |%    $w=#Ef r% 55W- @ x5W-y lN    |% JNf t _ :5W-    |% @ @e @-?@e5u@ A AH@u@ A AH@ ff  ,e! |% H5 ! |% V@ LN   ! |% *w f @e& |%wf)@e&& %% @FfwnDe`  Z % && " e7 <7 2ׯ2- * (.!7  .!B J dPovfe8cBsl ӕ- 6 r f e0 $C~ fWtE Ee0t j   & D`wD 8 " 4,Ο( " "    "  w7   0  Wp `e0[eӕ?fw@e7(!wf@fw wfEwfww.!w wf@ww4!wrwvf@w^ w`fwfwb:!w> w@fwL@!w$ w&f $w }w7FDf 7-.7#(e 7#e7#m  %ef@wwD!wwf/EwUsage: mv name1 name2 Source file non-existent Directory target exists. ??? Directory rename only Directory rename only values of B will give rise to dom! Files are identical. %s: %o mode Cannot remove target file. Try again. /bin/cpcpno cp ? Cannot unlink source file.  @ 8 & 6 % w  D@%-=e @ȋ2@c  xZ6666666666666     b      e@&  7     %- -  x %pf %-lTL %D: % 6& %5 (  &AWp N <7AWp N %   f 4e 7 5 u-_ 5 _ ~ׯ_b5 W- n@mfAmH T0LE5  *   , " 6  |5 B J @m>  R  e   ww 5 @A1, Awp@.@A1, 5 W-@@mAAm @@mAAm  wTw B 10X  5 W-@tEe0\  @t5 ww wDe   % |w7 7 ׯ-  " 7  . FB Jjdoxfecsvl ӕ- C r f e0 1 / ҋ D~'` d  f v Le0 9e z p&  m  |~  |  |~ w7 h ^ Z0  PWp `e0[eӕ?f4 ,*P   @f   7 h  -f@w wf@)wwfwPwLn www w dw`AupNNmf b wnw \ :@@5 _ fA rBpu@@m55D@5!f& %5 @&   ` 3f %5 `@&   5!`@&& %`@&  `5!$@@AA Nf` b u Nf b @`5_l@& %@_ww DCԒ ww DCB5ҒS wf@wNwJt wzw~f:6wm0z w\$wmwVfwz w:w w6f@ww w wf@7F @&HF6rw6r@a.outcannot open input bad format no name list %c UATDBCuatdbc%.8s %c%c "R & 6 % w  7$eW-buW-[@ 5N@+U$<U$5U|$.Un$'U`$ U R$a  xvhZw-$w $ e###W-@+ f  7## N _,e W-N ##5 w-  5v#@ p"@  u- @ 5@u @)@2#8#w-.#  Rw"#w#w#wm#  4N"@e& %"% Z w w | " 7 " %% %wh w V f n%@& n% w. w  @A=H"9@N Z5 5 W- 5 u-N@ @m& 2 @e@-  umw w ~ @j f n%l  f n%^ N U f n%G N  @t 3 fE n% @t&E n% H >Zv 2w w z  <5W-  "5W-5 @t@]wF w 4 -v v "` %7^ Z 7 L P L -F @ 7 > 2 . "Ew w EW-W- W-\  N ,\ @0 n \ t ?   > * 4\HwT w B @-Nefff& e& n%Nf& n%5% NeW Ne0 ww uw- ww u@ @@e55 @ @b @@.  5 5 @@%@@m5W-0W-9 AwpXAmeu 5 @@@@m5W-0W-9 AwpAmeu @ AwpAmu5 5 @ ew- 5  @-e-  ft :%w-tw-n %ww N 55 @ 5N W- ww @E_ @E  _  _ _6 4~6@E _ " _ & _ * _ . _ 2 _ 6 _ _ @HPX`hp@E?J: _ > _ D _ H _ L _ P _ T _ X _ \ _ ` _ d _ h _ l _ p _ t _ z _  _  _ _R .H R @E _ _t \ t @E  _  _ _ ~ @E _  _  _  _  _ !_ !_ _    x _  !_ !_ !_ !_ !_ "!_ @E&!_ *!_ .!_ 2!_ 8!_ _ B pJ rR tZ vb x _ @E*"_ D"_ J"_ @E      N"`"n"|"""_ ww w De   % w7 7 ׯ-  ,%7  .% l B J d o f e c s l ӕ- 6 r f e0 $HC~ fWtE Ee0     `w  Ο      w7   0  Wp `e0[eӕ?f@)wwf@ TLw8w (%@w %-2w .%@7 wfww %7 wf@wxwt"wwf@w\wX"wz w|B@$Y r Cd$Yfw w"w"w&@&HF7NFfA7"  fA & 9 &fA @e&7w@"6rw6r@cannot open %s jsrsobbrbnebeqbgebltbgtblejmpswabclrcomincdecnegadcsbctstrorrolasraslmarkmfpimtpisxt @ 2   @ *   " @    @@   flagrtssplhaltwaitrtibptiotrsetrttmov cmpbitbicbisaddmuldivashashcxorbplbmibhiblosbvcbvsbhisbloemtsys clrbcombincbdecbnegbadcbsbcbtstbrorbrolbasrbaslbmfpdmfpd " : R @ @* B Z j @ 2 @J b r movbcmpbbitbbicbbisbsub ( P  0 `  8 p  0 @???w w&w @w 6"#$%&'()*+ ^ & 6 % w V 5 J75 4  54  5 W-Ze@%-7 @ 7 yW-<e@7 2 N5/ N X7>& N X7*N X7@%+  N X74N      wJw 844   Vw,w &4 41@e4 ^ @E74x4  ww &-d BZ THL-DH-<>  & R4 4% x" 7r74j 7   f | 7P _*@e< ^ 7 0@e  w@e 237  h!wpj5 ~  Hr j5h ,j5h! Z Veh!pj57 2 H34 fe f8 f f< f3 D f 2 3 -b2  2F 474wPw > e-"2_L     1 7j51 z:  ph5j5 w-d  %    - m*2 "    e-`11   -6 e-(1 w.w  eh!! %˕ ateh! h!˕ww B ej5E  E   eh!"h! w~w l 007 0N H 7& y ,5& 0 7 !   ww CĔ ww C r   r Ne0 ww C\ 7 y .0 =7 7 0 / 0,-0!h0U-ZTe7/  <7 6 /7 / /    w&w B %0  9Wp `eDww -j/f/N wf~/ ,t/P j/ d/ @f H/ ,676/ p ,6,/$/-//fwZwVv w2 w4f@w wf@)ww f@w| w wfww wwf@ww wwfAww 5Wpe W W w whwXf& f BRw4f@ww wwf@7/F @&HF x/ .8"/ @.8 .8$$ttyЋ7r/@ h/ESTEDTw tN    wlw Z @eL@4 & R  6 , J, J  , Uow 5/ 5X   ,  , & R  6  ww vDC @mem e rfwHw 6p@&f 0 %.X8 r<R r< r<R r< rWtC` re rw-F !  -7- %n  ,    7 \-X8whw V 6!AA Wpe"!C 6ԔԔԔ @eWpe8!CԔԔԔ& ed& ed& ed& e@ &  6ww A r nmww D W- C r  r e0Tԕ A r e0TwN6rw*,6r@f@  P`Hm` HB/dev/ttyxhltwVery funny. Page  \2J\N   ,67x7r7l7f7`7Z7T7N7H7B7<760/devPFDay Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec & 6 % w W-'@5@      7 y           &  2 , _0:b P DV  P 0 5N _0 2 0 7"  V 0 7 u f p% 55 W-2_0Nf N%r^r 45%? Ru- K E<&5t&*` e fNj  n  <etr  v  z    w~w lA r5 W- W-@e02@eY-A r5 W-@e8Al r5 W-@ef?ww @ A Hww 5 5  e5`@t5`@Et5ff p%ff p%0 f N%% G0 W-0 >@"5@e5 uW-0 @5  W- W-~? N   ww wDe   % wf7 7 ׯ-  "8 7  .6 B Jdox4f>ecsl ӕ- C r f e0 1 /H ҋ D~' f v Le0 9e z p&  m  ~    ~ w7   0  Wp `e0[eӕ?f| ,rP h b @f F F 74 F *"-fww~wJwNf@wfwbw(w,f@wJwFw w7F @&HF&fwA@ e  TH KV`N-FFL:m8-> e7--) "H  @ 7"7,7, 7, e  x Z"@Z Z$$ttyЋ7@ akltx@XRFLp_proc_dc11_kl11_dh11/unixNo namelist /dev/mem/dev/rk0No mem /dev/rf0%3o%5d%5d%2c%6d%4d%8o %.32s F f w /dev  & 6 % t/dev/mt0w H W-@   eu3@  @5  i  xpppppppp|p|pp| <   777777~t&  5@t  7\X@  &  e@_L5   5 t@-(  u-N Nf %5  @ 5  N z W- f @7|t 7~ z ` 2 N v F 65 w-*Lfe F  25 *w- !    ne @eNe  e fe  v  X W- @ e V5 Lt@-_F Z5 @  @ A , 55 b    N <7 @   ?@ &   ,N 2 %,rl R    2 _* r  x\jHjjjw w D5 5 1 a )5@e a& F   @a  @a  a ww ~D5 _  a0  W-    a1 ES W-"   1   a1 a&   '  0    6 1  Z a1 a&  Uww  *   &  whw V  @  N  w6w $f0  %f %% N" ww f  %f 2 %% N2 ww Nf   B d 3B @wdw RH D-b _bR B R 7"%   7      %f %%` ww  @  0 9Wp `eDww ffE H%  wrw ` t 7^ Z ` l w@w .f  :,~ h!x_x ! !y B!  6%    h ww  f& H%N&  5 f& Z%e0A  =@w`w N T P   d  |    & F   d   p| ww - d  !d   p| 7 f   p|ww w|Der  l % v wf7 X7 NׯN- F Dn7 < .lT B Jt d o f e c s l ӕ- ; r f e0 ) ' ҋ D~ fWtE Ee0 z| p&  m^ \ v ~  v   v ~ w7 0 & "0  Wp `e0[eӕ?f@ ww v@w v-w "v@7 wfww v7 wf h~h  7n j f7t 7 Vfwww2 w4fwpwlw wf@w wfw@w<wwfw(w$wwf@w wwwfwmw~wmwxfww\w wXf@www2 w4f@wwwwf@7F @&HFfA7B  fA & 9 &fA @e&7w @ESTEDTw ZN * .wRw @ @eL@4 & j  N, J, J  , Uow  5/  5V   ,  , & j  N wnw \DC @mem e rfw.w p@&f H% ~  r<R r< r<R r< rWtC` re rwF !  7 %n  ,   7 j~ wNw <AA Wpe8CԔԔԔ @eWpeNCԔԔԔ&  ed&  ed&  ed&  e@ &  ww A r nmw~w lD W- C r  r e0Tԕ A r e0Tw46rw86r@f@  P`Hm` :bad characteer in key %l %l-%l %l- no filesystem name can not open %s last chance before scribbling on %s isize too small the epoch read error %l write error %l checksum error change tapes read error can not open %s %s bad freeblock out of freelist  w w&w w PF Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec9:;<=>?@ABb%  W mw@ȋN w5ȋ XbL? /dev/tap0/dev/mt0 & 6 % w &5 5 @'e@5W-@f @r Nff %ww 0@ef | N L _@E%@]@R r5@ N L _@ @-_N  N" L 5  @R f@L P H D > 4 e NT L Nb L B@2 @u="Nfr L% l55uW- @ L5W-y N  N L wPw >@e& %w0w @e&& Z%% @ww w`DeV  P % w7 <7 2ׯ2- * (, 7  .  B Jd oFfPecsl ӕ- 6 r f e0 $C~ fWtE Ee0r h    B`wB 6  2*Ο&       w7   0  Wp `e0[eӕ?fw wR wTfw|@e7t w0f@fw wfEw f@w6w2 wwfww w wfw w wf w }wDf 7-.7#(e 7#e7#m  %ef@ww~ w"w&@&HF7`F%s: non existent %s: try again %s: cannot chdir /etc/globglobrm-r-f**%s: no glob %s: directory %s: %o mode %s: not removed  P w R 7 [<WE%@P. I/E. >/:6@<  ׭. ׭. F@@ҕ/ҕ.ҕ. " 2   -- directory not empty ? 0 & 6 % HangupQuitIllegal instructionTrace/BPT trapIOT trapEMT trapFloating exceptionKilledBus errorMemory faultBad system callw  & Z% &B , ! 7!50 !4   7!W-7 ! &     l F 6 -! &  & e7V!@e7L! J!D! l t7D! w w @e7$!@e7!@e7 !@e7!7 !7! Jע @eJ7   @e& &  T 6  ww r e  &    7x Ah d UHT P J F ,b y 7: b & 7  &   ww @ 7`ww ĝ7_- % e 6 _-xx n % e Z 6 Z? > 8 4ċ37 & b\  V  "U$ 409e- m7Eww @e&& %% @Ewrw `u- @& eNf n  w*w 5 D5!C5 : .2 & f & 33 &U!N&e & 3 7 y e Nf & wr w ` 5 uu-C@2 7 4 ( 5Nf  A1Nfe & A1@0 @ 7N yeNf  w w 5 "@%)U"5 5 5 (5 &5 ,5 *D5!_5$` *  e5 *X * *5Pe5!>U" *)e5!B!& $W-$< (5( &5& *@, , @a0.!7, ye  , Nf n 3* ,@, , @a0 .N,e 5 *u-*,@* `A* Aap. *s"s(s&w w e @e &  w w &!f _@w w @Ew w x _2 @_ @ *!  _z@ _n@  _l0! 6 F! 6 _2 X!  _-&_^! l _2  e _2 n!  _ _ &Ne t! n ! l _2 !  _(   H _2 !  _2 @55 5 05W-! 6 _2 )5 N &@ &5 N ! l _2 5Nf H _2 @  & @&  5 @ l ! 6 @ A5@&  5 & f %@& < 5 @ l ! 6  &N ZN &5 &N ZN &@ &5 &@ ZN &@ &5 @  5  & !  5    &   & W/@@E4P  ` &7Rf  @@!Ne@& n ! l \f  Ne @& n ! @ Ne e n Ne  n  @!@ Ne@& n @ l " 6 @5@e @@EU4P@ef& %@@EU4PN@e&& %,@E5@t] @t]     x* &< j wbw PN l " l j_h & & % w,w  @  w w @e& %ww  f& %  f& %e0 ww  @ @- ww n@ = @ ȋ wPw > G" " @e !5@E 5! " l   l 5" l (" 6 D-N  ww  *" "_W/0" "_@ "wvw d"@e @e @5@5@|5CW/ @ ȋ ! @aˋ (& & %@e&& %ww R@e   5I` wfw 4"wZ w\f@wD wFfww8"w$w(f@)wwfww>"wfw wfEwfwwD"wwf*wBJ wf@w^wZJ"w|wf@wBw>P"wZ w\fAwnwj5bWpeP"W V" W " HwB"wwf& fww"w wf BRwfw"wf X& w }wf@ww"wlwpf@ r dA! Af w,.w"(e w"ew"@l  %e7bF @&HF6rw*6r@$8HR\px/usr/adm/sh_acct% # /usr/adm/su_acct: cannot opensyntax errorj r ~   ) 02dd2ddd0dddd '" ;&<>()|^ "'Too many argsToo many characters;& &();()^|HNTT<>(()<>&FtV[?*chdirchdir: bad directorychdir: arg countshiftshift: no args login/bin/loginlogin: cannot execute wait:try again : cannot open: cannot create/dev/null/etc/globglob: cannot execute /usr/bin//bin/sh: not found : -- Core dumped**gok()  777 7777777770+JKLMNOPQRST@r & 6 % w JuW-   @`e f F 5N  @e&f $%W-W- N  N W-N$  Nff* e@@m@m5Nf4 %N wjw XwdDeZ  T % w<7 @7 6ׯ6- . ,,v 7 $ .t  vB Jdof ecsl ӕ- 6 r f e0 $C~ fWtE Ee0v l    F`wF :  6.Ο* $      w7   0  Wp `e0[eӕ?f@w wf@ ww @w -w @7 hw|fw\w 7 Rwff@ww > w@wDfwwD w"w&@&HF7FfA7J   fA & 9 &fA @e&7w|v@l a.out%s not found Bad format: %s %s: %l+%l+%l=%l (%o) w w&w Tw J2 & 6 % w Vw& _e@%-Ju @6@%- % % m% - $ $ $ $ e@7%X N T 7H  7N y@%+  N T 7B$ @% <% m8%H ,% &% "% m%&  !4%  # a!z4%% 7r$   ! %@4%  #' !0! ! ! % @: `[ {   a$ x% xD&,#D&e E7## r7##t7"" m"7"( """ׯ"X "a"""  "   ׯ"z"%t8 "D t" h"  5  Z#B" L"& X 6" 4#e-"  e& V e7!! J!& V w6 w $ 5 5 !!! m! ?!m!!9! v % '  | w-"N 57 Z !f : N    0! &(! j e  !  ` ! #&  # &  w( w   5 B , 5  & 4ef : N @ 0!   e B ! j e 4 !#& פ  !    e!%!e  3B  e     # &  w w @eD v    w w #H " & X &w~ w l w-, @ m" %- @ m  !@ mA rea?C reaw w  # l 2hww  N  ww  > 8J7!0    Nwrw `Bu   N 5   N 5 _@ @e  @ef  5u- upu@  u@  uu B-u- @ AA@B- @%0  @ @ _ u- @%0  @@_  up@_ @%. @5%.  @ @ @  upA@_  0  @ @ L@ @ %0  @@3% @% !  Bu   @@wpf@ww CLע ע  ע ע ע   ע ע  ww rC,ע  wbw PD   -  w*w C  Wp @@`eww W-9W-0 ww  f  4%ww D5!% wf@w^ w`fww| w>wBf@)w*w.fwT 7A 7 fA & UfA  @e71@  1 @ wfwA F  Df@A&  6f@A @+ 9 & fA @e&7jwf`@ w7 w w wAupNNmf ww  @@5 _  fA rBpu@@m55D@5!f& D%5 @&  ` 3f %5 `@&  5!`@&& "%`@& `5!$@@AA Nf` u Nf @`5_ @& "%@_ ww n6DCԒ w\w JDCB5ҒS w.fZVwmP wDwm>wfw. ww  wfAwZwV5NWpe W W 4w. ww|f& fww!wL wNfw!w2 w4f@ww !wwf@7F @&HF-admnorRtz-/usr/tmp/stmXaa/tmp/stmXaaCannot locate temp Can't create temp Can't create output Can't open D&7,7&7 7777777770 YZ[\]^_`a   7 w ropen error: 7aw W zw :can't create temp file for 7b7 bX-RF-J@ w improper format: ,m*e7 && w unexpected EOF: 7 w rcan't rewrite: w7w Ncan't read temp file for: 7tp7 bTPwpwJ Ew0/tmp/stma @  & 6 % w |  x @_e@7p    .   >  @ .  @ >   .     >(   .,   >0   .6   ><   .B   >J   .P   >V   .^   >d   >l   .t T _*  Z ww  5 @mAAm  @ m7 wvw dw]wfw T@@ @ 7@lwPw >wdDeZ  T % w"7 @7 6ׯ6- . ,, 7 $ .  B Jd(oNfXecsl ӕ- 6 r f e0 $C~ fWtE Ee0v l    F`wF :  6.Ο* $      w7   0  Wp `e0[eӕ?f@ ww @w -w @7 ~wxfwrw 7 hwbf@w  wB wDf@w w$ w&@&HF7FfA7   fA & 9 &fA @e&7w@ even-evenodd-oddraw-rawcooked-nlnlecho-echolcase-lcase-tabstabs-delaydelaytdelay-tdelayunknown mode: %s  w w&w Bw 8  & 6 % w & I7 (:ԋ@ :>P&  EP&    8 % Ӌ4 UP&    Ԥ:    %  wLw : d @e & wJ D > N & . %5 5 B@e b%  2ҐB %: %: 0 9Wp `eD5! wtw bwDe   % VwF7 l7 bׯb- Z Xb 7 P .` 4B JTdofecs`l ӕ- ; r f e0 ) ' ҋ D~ fWtE Ee0 z p&  mr p V~  V  V~ w7 D : 60  ,Wp `e0[eӕ?f@ ww j @w j -w j @7 wfww j 7 wvf \\  7 ~ z7 7 jfwb@ 7 Vwfw@e7wfw7A 7 (fA & UfA  @e71@  1 @ wvf@wp$w^ w`f@wVwR(w: w<f@w$ w&f@w".w w7NF @&HFfA72  fA & 9 &fA @e&7w@Tf&frЕЕ P rCx r r  ~ rB`E \Z \^  !r rE Rr Sr   0 & s>e0W!9eW!ZeT!ᇅpassword: bad password file /bin/sh-cannot execute shell sorry /etc/passwd  w w&w (w  @ @    "oprd  @  zaE ~| &P ~@? &fA  r f e0  & 6 % w  wf$w&@&HF7F6# wL H B+Z@p<74w2w  realZw w userw w sys w + w Try again. 0 5w vCommand terminated abnormally.   jҔ   j`x/usr/bin/ e aw Command not found. Tw w w w 0ԕ !SPr& r<wYw z w t:w h w b:w X w R w L 0:ԕ !XP w 8.N re07>w  f re0dw El/@@@y@ -@@@ R  T  BA L>@6@ Bh@X@T@D@-@7$@$@Wtw@@Wpew@w *Tape open error w-? w?@ȋw Bad usage wn0H1H2H3H4H5H6H7HcRd^fXifmlr~turvwxw|w1?,?w h???w P7 ?w Dw <>>w (Lw .@@@->w& lw  Jw >> J $  R7w @@@ *>w mode uid gid tapa size date time name w  w @@ w   w tEND  B ҋfABR&e E7 7w Out of core w@ @  E7=@ @z== ~fe N 7 ^=  4@/@=7j=b=5 0f & d~S=   e fe N e@Ee~ <w "Directory checksum <w  < 0@<0  6<w NTape read error ;0  2w;0  ;w Tape write error wz7;7 ;|!&;  p  j ;;@;V ~;w Tape seek error w w4 );";+  f@ X ;w X t x jw  y V  L w  -:.: -: ::e:@R |@%&@  :@@W.Ћ &/Е/P 0@ zw -- Cannot open file w@A:E @&  New :w ,Directory overflow ww aw @w @@@Ӌ 9 w, (:'w, :#w Lr9U99Z9797 9999 9 & w &@-L9@B9ˋ ʋ/f  ew &9߇ -9  9 $w , not found 8e8-8 w d >f& f&@@ @W#00 @7~ r f e0 T )5% T8 BCeB v8 8 t 0~ 8 ew 8Ї 0&  5N,Nvew 7 Ew7B 7w @@  @- 7 0!   x7\ 7 N  `0 w@f@ Xw ` -- Phase error 1 0  @ 5  ew 6퇇BCeB vB 0Ն0 ~ 6E&t6tEw Tape overflow w* \  H6e j6b6 d6 V6 0 "6"6 66 ~6w Rw H entries 5w :w 0 used 5 5w w  free 5w w last 5_@&t5 t5 5 @w  @w @w @w fe  w /  w r/ vw ^w R: Vw > B@ w $ s5x-5w-5r-   w4 Gw @xC@ @wt< x4  (0( % V4F  7 4w.w*@ fA  f @ w -- create error ESTEDTw pN  whw V @eL@4 & 4  , J, J  , Uow 5/ 5   ,  , & 4   ww rDC @mem e rfwDw 2p@&f %3.A r<R r< r<R r< rWtC` re rw2F !  272 %n2  ,   7 P2.Awdw RlAA Wpe0ClԔԔԔ @eWpeFCԔԔԔ&  ed&  ed&  ed&  e@ &  lww A r nmww D W- C r  r e0Tԕ A r e0TwJ6rw16r@f@  P`Hm` @&HFw w w Lx 0@0@@@/dev/tapx/dev/mt0/usr/mdec/tboot/usr/mdec/mbootPF Day Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecpqrstuvwx*  7ttyx  x "P@ $$ttyЋ7:@ 0/dev@`  & 6 % w BW-Y@- @9 @ L7@7 e@+@ L7p e @& $ 5 @  tw 7W-@&  5 @  (w,) 7)  n"  V&  n"  $ V&n" p n" 7  n"  V&   V&n" p V& 7 ww  5%   @ H= wjw XX T7 N* F%:&   D"cd uF7 @ 5N @ @ww N 5N 5@ 5 @ 5   ww  55@ -W W  W W @ @ - @ @ww 5 @ e5 W- AWp @@m5@ww w&De&  & % @w7 ~&7 t&ׯt&- l& j&,@*7 b& .>* B J"dhofePcZs.l ӕ- 6 r f e0 $%C~ fWtE Ee0% %    %`w% x% @ t%l%Οh% b% @ Z%  N% @ F%w7 8% .% *%0  %Wp `e0[eӕ?f@ %$ww RL*@w FL*-$w XL*@7 wfww >L*7 wf l l   7 ߤ 7& 7 f@w` wbfw2w., w@wDf@)w,w0fww2 wwf@7&F @&HFB@$YfA78   fA & 9 &fA @e&7rwnh@Z cannot open %s cannot create %s %4d w w&w bw X8 & 6 % w N W-@5 f  5  ,  7"  f %5     ]W-R5 W-@@mȋ@@mȕ @@m h 5 W- @  h @ hNe 5W- @@m h  hewf@ z!r!wl!w $"@w "-X!w *"@7 D!wfw8!w "7 .!wf@w wf@)wpwtfw,w( wRwVf@ww & w0w4f@ww, wwf@7"F @&HFfA72   fA & 9 &fA @e&7rwnh@T ESTEDTw ZN $ (wRw @ @eL@4. & d  H, J, J  , Uow  5/  5   ,  , & d  H wnw \DC @mem e rfw.w p@&f B% $ r<R r< r<R r< rWtC` re rwB F !  " 7"  %nh  ,Z  Z J 7 $wNw <"| AA Wpe C"ԔԔԔ @eWpe CԔԔԔ&  ed&  ed&  ed&  e@ &  "ww A r nmw~w lD W- C r  r e0Tԕ A r e0Tw46rw6r@f@  P`Hm` /tmp/utmpcannot open wtmp ttyw w&w bw XPFDay Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDech%   7    w D    , 57v t7Z r  c N Х   ew" 0 T  5  -(! 67 -   T wT  ??~ /etc/mshArg count Cannot open utmp ! ... /tmp/utmpEOT not logged in. Message from Permission denied.  xZ X "( @X  X $$ttyЋ7@   /dev/ttyx/dev!ls"mail#mkdir$mv%nm&od'pr(ps)restor*rew+rm,rmdir-sh.size/sort0strip1stty2su3sum4sync5time6tp7tty8uniq9who:writeolpr..;.<tty8=nullfH$00 E7w w    @ #W! W!UR  @ A Ze 5 a zE] f R " E  | Vw   BwZX6 jLJfw>w"@ E7lXznt :login: ;login: /bin/login d  & 6 % w JW-    %_(5 e5 e@55@ 5 W-*W-?W-[N A md  @%_H @%/= u- f  5@ ȕ/u-   5    %_(u@e&f % 4@e&f % N@e& , @5=@ef 2 A m` }N u@e@-8u @@-+@ m@ m&  @ m5@ mA mH@ mH  @%_HW-  "  %_(@ m  x~  -v'Cl, 2 5Zf  -N'/N2 2 52f  -&'8   @  % T  %ww W.W. Nf Z ww  @5@5_Z5 @5@@+  N f Z b `@5@- u- A @@5Ph 7z y@5@-  2  N f Z # ! Nf z @ t 7 yu- ww Nf  Z  ww z@ 5 @ 5 u-u- w>w , A H@ww  A H  A H@ww Dˋŀwf@w wfww wbfww wHwLf@ww w&w*f@ww ww7#F @&HFp( Arg count /.No directory No match /bin//usr/bin/shCommand not found Arg list too long -]*?[H4zj crt0.oglob.oclose.oexecv.oopen.oread.owrite.oretrn.o&rsave.o4savr5$*_main"_ab$ _ava$p(_av# _string# _errno$*rsave"6_write"_copy"_open"_read"_match",_cat"2_close"_compar"_strip"x_execv"rretrn"D_amatch"Z_umatch"zretrn".cerror"&mrsave"4 & 6 Z% /bin/sh-/etc/rc/etc/init/etc/ttys/tmp/utmp/usr/adm/wtmp/dev/tty8/etc/gettyw @ t%C V    e  J!<   pF  & & P%~4 ! !& % p ~ t  !  p  - >  T     %  !  ( %  D*j  2  7  (-0 !,   ee p  ! e !   e  ! "  ewPw > !! ew0w D   &  4 ww  ! .%%׭K  <757.e7 -7 ww B  ,  t    P  0      & %  w2w <   @!ae et& P%$! % pF   @7! &  P%! % pwfww wT wVfww w4 w6f@w w fww wwf@)wwfw^@e7V wfw wf&wf&$ w wfww ( wtwxf@ww. wRwVf@ww4 w0 w2fAww5Wpe4 W : W w wwf& f BRwf D& w }wf@wpwl wtwxf@Af w,.w"(e w"ew"@l  %ew7F @&HFB@$Y^/dev/ttyx %77|7v7p7j7d7^7X7R7L7F7@0b & 6 % w  W-b @7@7 N 7f b n  ~ l 7< 8 j j  X l 7 U5 5 <@mȋ*0@m%0 @m%9   AWp Bm`eu wf& @%e+f& @%7 jW   l 5  :f %-* !m5W- Nf %&  N 8 x7 p7 -  e-    %   e5 @-N 5 W-@ 0  5 w- fe   5 W-@ 0    wH w 6 0 @ `& e5P & %5P& %5PW-/@%0@%7@& % x @eCpt5P  5 5 62(& @%-4 "  55 5 W- @ @a0 5 W-@ @a0 @ @a0  @e55 5 @E_ |  l 5 4 _@e&f %5um@e@e&@e&@e& Z eN 8 _ t5 t5Po@@e@e&@e&@e&Ff e @e@e&@e&@e&Jf e  p׭D$=#@e@e&@e&@e&J e e@e  L7t  y @e@e&@e&@e& Z eW-U 5@ef  u5 u-@ @aA Aap F 55< 55@e5f& @%5f& R%te5@e5f r 5 W-@eAeH f  ww 5 @@mȋ@AAmA @ @a W- @&` % ww  n5 5 5 @'@%0@%9 r BAWp B`eu @w@w . 5  % 7l y 5 @ p ~5W- W- W-  @0ww f> %f, %5W- N Nwrw `f %f %5W- N w&w   5 0    f r t 5 W-d @ A p @ww -d0 5 W-d @ A p f  7 NJ p >wNw <@ @m H @ @m 55 W-@ H  eW/ Nf f f Z eww  5Nf  5 W- @ @m = @ @m H W/ Jwnw \   wLw :w De    % w7 7 ׯ - "7  .P B Jt d o x f e c s l ӕ- C r f e0 1 /N  ҋ D~' f v Le0 9e z p&  m   ~    ~ w7  0  Wp `e0[eӕ?f  ,x P n h  @f L 7*:  0 ( -"  f   7 ߞ 7 7 f@w wfwwwwfwwwwf@wpwlwjwnf@wTwP wH wJf BRw4f@w wwwf@7 F @&HF6rw 6r@arg count %s: cannot create %s: cannot open %s: cannot open isize = %d d--777 0 0 $ %s: cannot open init %s: bad format %s: too big %l/%l: bad ratio bcdug%c/%s: bad digit too many inodes %s: cannot open ... @`p %c/%s: bad mode %s: bad number EOF :.read error: %l write error: %l out of free space indirect block full @ & 6 % w FW- E@b @c.@ 5@#@ 5@@tN]f@& $%  J  ww 5 @ 5W-0W-9AWp Ameu@wZw HwDe   % w,7 z7 pׯp- h f, 7 ^ .  B Jdofecsl ӕ- 6 r f e0 $C~ fWtE Ee0     `w t  phΟd ^  V  J  Bw7 4 * &0  Wp `e0[eӕ?f@f@ ww  @w  -w  @7 wxfww  7 wbfw ww6 w: w<w -zF l V f> %wError 0Not super-userNo such file or directoryNo such processError 4I/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedError 14Block 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 device@&HF7LFfA7   fA & 9 &fA @e&7w@ arg count mknodusage: mknod name b/c major minor %s: %s Unknown errorz (:J\f|(8Hw w&w w @ & 6 % w ^   5 f %W- $ˋ e  %e@_W- _ W- @&@& %  _@ҋ / @,// @ $OˋJe e? @& @ e @& @ $&  5 t t f <%e@ww -6%8 (% h f0 %ww w"De"  " % ^w7 "7 "ׯ"- " "$7 " .$<B J\dofecshl ӕ- ; r f e0 ) '4" ҋ D~ fWtE Ee0" z! p&  m! ! ^~  ^  ^~ w7 ! ! !0  !Wp `e0[eӕ?f@ p!h!wX!w >$@w 2$-N!w D$@7 0!wfw$!w *$7 !wfwwF wwfnjfL wr wtfwPwLT wRwVf@w4w0Z w0w4f@ww` wwError 0Not super-userNo such file or directoryNo such processError 4I/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedError 14Block 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 system7t F @&HFfA7    fA & 9 &fA @e&7w@ /etc/mtab%s on %s arg count mount/etc/mtab%s: %s Unknown error^fv .@J`r~ ,DRw w&w w  | R x   X   /binЕ/ /usr H ?     ? * [ /etc/globroot::0:1::/: bin::3:1::/bin: rm -f /etc/mtab chdir /tmp rm -f [a-t]* [x-z]* v* chdir / /etc/update 000 010 020 030 040 050 060 070 180 090 0a0 0b0 0c0 0d0  & 6 % w   l 5 f %W- f_2@ h  6c@Ӌ ר/ @,ר/ע/ @ !$7@e ʤ*ҋ'e@ $ N 5 t t f % e@@( f ww -%LH %  f@ f%ww ~w#De#  z# % wb7 f#7 \#ׯ\#- T# R#$7 J# .$B JdBohfre c.sl ӕ- ; r f e0 ) '" ҋ D~ fWtE Ee0" z" p&  ml" j" ~    ~ w7 >" 4" 0"0  &"Wp `e0[eӕ?f@ "!w!w %@w %-!w %@7 !wfw!w %7 !wfwwV wpwtfww\ wRwVf@wwb w0w4f@ww wwError 0Not super-userNo such file or directoryNo such processError 4I/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedError 14Block 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 system7,!F @&HFfA7   fA & 9 &fA @e&7w@ /etc/mtabarg count umount/etc/mtab%s not in mount table %s: %s Unknown errorf 7wX"<N`p| 0BVj|w w&w Fw <$#..>.?getty@globAinitBmkfsCmknodDmountEmshFpasswdGrcHttysIumountJupdatesmtabnlpd$0 0w ^"e  R N J FE   e *   w7   e  w,  ~-xwD7 4,,7 pw 7t7 r   E  Ew  E C6.`.& e  C   ew z w | w r@w   7 <w w 77 L w . #w < w 0 w $ w @w @w   w *        Ew4X@E   mmfew ev !7  ԋ! w w^- M5 Be ;& C N *b UE    m    Uw ez w en w To w Fx-r  w 0r6w f5P  w Je  8 hf&\wX@70  r e0H~f xxxx  @% 4!!< T$&# :7Z !=[!:7 tT v -r }j w!!*w x E   w mE]$ 7n h - w p vȝ 78 2  J W E       ( w `. w RrEE б! ! w! !;!e tveD t AE@`e@eww fBJ b &w  B$w4E`wU ( w  7  $!!ee  7   7    w 7   e w 6!D!<wP     w && 0 H7 x. & > Z |  |  \  ѕ    r h  #w xUU HE BCwb &      R #e`e z8 x X_ L D l  P X#B w h}e  6 w H5    EU w b   Fw  :   @  U  :!,  8E  "5 -x   h l ! !,  &6 20w Zw Tew ew 7  7 !& L H 5U  & !(>!-X!$k!*w !(   U0U  UE UXW!H 7U > !+  U8   U zUU n!(7 - Z h >UU B 8 U w ~* ww la W     w Fe!)w 8) W  & Jw n fEtWt1ЬdW fE NWtAVt 7 df+  Pw   w u 7( VS!a I` D$  y+ - * / &    % [ ^   ! +   (!]w ] # Z}+J -T *t / j &^ , " %6 ^ ! >   w vt4w l r*w X:B`%w N^B w DA B@w 8BPw .BpBw " rw A B`+wX &PEEE & W%^   Uf7  (Wp @e@` w r E7 x7r    ? a.out//      "0  0 @ P `  @ @ @ @ @ @ @    @    @ tvpprtvrx ~#w8% r w 7hw 7Xw 7V7Lw 7Pw @/X , & 6 % intcharfloatdoublestructautoexternstaticregistergotoreturnifwhileelseswitchcasebreakcontinuedodefaultforsizeofw t.W-f@  . @& (. 7] @p@   .^\@& F. XZ@& F. ~@  .W- 0X *X @XI!`IԔ  de7 W@e&7WXZW d. W  #^\ .XZ . W  .wj-w X-5 XI `IE5`A rWtebIDeȋXI `I6E e%UbI ,G(G%@  . 4 4 4 XI WՀe `IҔw,w , v= p=j=!7 V_ VV7 V  V _V +H&,Ay. V =7 V rV _(& %_2)> je&& %_&  % P_ .!(%!1" U z*7UUH%~!)!/!*@  Ue_!P<_7J<P_& & % ._>?= %_& & % -_@A= %_="= %_ * % +_ U@  _ &U ;7 U p)@7b< y U R)!/_7T!0 +%<; 8;7T\ Y TVXI Tӕ.7 TH{H| `I ( `I7HT 7NT/JT,'4T70T5/& %60| %@ _Hw)w ) S J(7S-S@7 S@wv)w d)ShAnA.: *:7S StA D,%" n A D, pS rSA D, w)w (7 De8D , $ DD",^C CeCu@E%N '5f %#  &  eCeC ( @E%_n$ _nW-52 5 _N T&&  Wp eADHu@E5 @5W-P!W- 5 _W-YEUW-!5!KW-?5!W-<C 7W-5 55 *W-)u5  5=W-5 5 (ff re5W-= !W-e5 f % E  (ff re&ff e AeA  AA (f&  re~AexA ww @ 8 x*+N & &  ef& f& e 34N& f& eC @w*w DCB  % x8R|||||R`|||nn 8 &  \ && %ww DE%&  &# ewnw \CE%",?e?&  & %# ??ww @%!C ww D!E%h E!Ee ww  B^\ .ĝEEL)D D, Nff f fff D,e  +^\ .7dEw2w @ee>@   0ww >e>H @B D  .ww D##$ D ww D#] W/U@@% H x&.J>6`>e=-BpC r rC@ @Px @ t t ww  2A #0D  Aww  _"!_"5 @!*-@ @5%_5   @e& r& 5 7'%   !_7&7 ^@t@N& fE e:@_"e5(@ՀNBD D, 7 @@E% 7&% N &JE%E 5Y '2 (, upurfff e % ! PD  v% w w 7 V?%NlD D,  %D% %7? "7%%zD  >D D, 7|%ww B 7`%%  ABpN EfD D,%d ND D, %ff e % !7$ 7$ ff e  ABpND D, W-@E% @E%D @A @@5D D,ww  7\$%W-H$  =fD D,%= Eb-$@ [ = <7 =@ J x"4rE D,# v#  E D, @ * && & h e & (7=5&E7<&E e ## ww t,E wtw b F7B) y RE _!  <bEE e& D, V< l%_!7" E _!6<  _ xRj H <Pd V  (_t! _t! 8 _t! p5 %l;  e xzzzzz*0 2 *" &"&f '% ~  (+ 4 %;Z; ! !&f '%  ( ,;$; R*f '% 4%_! $%- ;_!_!! |! x!&f '%  %-:L! H! ( (  (_!7(! (_!p:n:! !7`: (  7N:& & '% 4: (.: ($:":_!: R*: (_t!: R*9 (_t!99 79 79x t 5 ( 9 (9 %_!-9 _!f d& '%~9 (v9_t! d %_! T9E _-B9VYE _,9(9e"9  (_9 79 5 , f& & n e & ( 8_! 8E  %iN J78 (_880 ,78$ 7v8 Jj8 (`8^8JE < %:'7 N8X8 E _  3 ( 07%_7 & ( % "F  v%_w w 4 %_" %D n& ( %_"t7 ( % & X7 .&g e & ( ^%f N7%   7S7 76 5 %Ad3^36 % 4F 6e,7>3@e67!.3 w3@e67! 3x6 (f ( N ( w0 w   x%   f%JF  v% w w 65 66V75 5 (57 5 5 (N (# +5 ( 5 Z V75 (5XZ & d. XZ5 d. XZ d. XZ d. !XZ&Z5wL5w" w  H5 % Z5&V50 L57D5,3E% )`bI U@:"E%E Y3EU3" E Ye\F  " evF  e4^40 R9i e& ( 44w w bI!U eF  4 #ew w D! 7pw w  5 B5 5%R3 M x%F&F&F&F&&%%%% F 3   N& $ eV3  @e& r& 5w.3 F 3 w ww  3 %2  l b ^ 0 Y"  4w2 7 2    G" F E Y0\27 v2 %5 w>2 R% E YeF  E 0Yww -dF  .ww D5G  tEE@Pwlw Z@tEAE@PUwHw 6fffg e & ( ww  /# +-21 *1XZ& d. XZf d. XZf d. XZ d.  XZww NG D, ww ~N$G D, wxw fB5  '2 (2w@w .BE%  'E YE% 6! 0E & xT)`)f)j)r)z)) ttE AYCp@ *G  8G ww xN (5 wlw Z 70%' P%;"/     4 # - ww ./H%~ 7//ww  PG ww  l+ef+ $ V+R+ , && & f Ne & ( wpw ^ b%; ^&& & n e & ( d. (w0w ^\f . w 7 P57 P57 J57 F.<5w @ ,5 (57 5 .5 5$ e!& 7 .57 - 4 d + - 7-w t 7 --47- 4' 44 ~ vY   r-n-R-7 L- 0 J4D-wp<4`w:- e0w w,4De"4  4 % +w7 47 3ׯ3- 3 3"z`7 3 .x`,B J,d*-o$-xZ-fd-e-c-s,l ӕ- C r f e0 1 /d3 ҋ D~'>IBI f v Le0 9e"3 z3 p&  m2 2 +~  +  +~ w7 2 2 20  2Wp `e0[eӕ?f z0l^t0l0l^  7\0 X0 T07d2 7 D0fwwFIwwfwALIF  Df@A&  6f@A @+ 9 & fA @e&7w@RIw&7 1f@ r dA! 7l1F @&HF &.6<DLV \ d h nt|Arg countCan't find %sCan't create tempSymbol table overflowWarning: assignment understoodNonterminated comment *RdrUnknown character AA$A,A:A   d4 6Px.text.data%s L%d:.byte 0%o,0 .even %s Long character constantNonterminated stringAAAA& $&. .. \..data L%d:0%o;0%o;0%o;0%o .text Expression overflow !dp p . . p 4 expression overflowde Expression syntaxBad function.bss L%d:.=.+%d. .text Bad register %o* Declaration syntax%.8s redeclaredIllegal conditionalCall of non-functionIllegal indirectionIllegal lvalueIllegal structure ref~CCCCC    xJxxxIllegal conversionC error-- convertInteger operand required%d: Expression overflowLvalue requiredConstant required.globl _%.8s External definition syntax.text _%.8s: Compound statement requiredL%d:jmp rretrn .comm _%.8s,0%o .data _%.8s=. .=.+%d. Too many initializers.even .text _%.8s=L%d .byte %d. 0%o;0%o 0%o;0%o;0%o;0%o Inconsistent external initializationUnexpected EOFjsr r5,mrsave;0f;%o .bss;0:.=.+2 .text jsr r5,rsave; %o Missing '}'Case not in switchSwitch table overflowDefault not in switchUnknown keywordRedefinition!!:!`!Statement syntaxExpression too largeStatement syntaxUndefined structure: %.8sNot an argument: %.8s%.8s undefinedConflict in storage classType clashBad structure name%.8s redeclaredDimension/struct table overflowIllegal indirectionjbr L%d L%d:Bad structureCompiler error (length)Break/continue error<<8888888888)w ,)Bu5%d45 5 5 . ] " @e 5` @e 5` er@ 5,EW-5W-6:W-F6NF; B;5& TeNf@ % ; ,! N `!Nf@ %: : `!@_N W-Z]W-F_N N& : :5& Te\Nf %5w\ : :5& ,! N `!Nf %5@-Nf  &A h*euN `!cW-#. ,(A !N  5 5Nf R % <9Nf %5_N @55  5,E@ 5&AyD"e  x!5 w[  "+"I @_N D5 W' N& 0 @5%' 5 N `  5,E D-b   f ,@,b @@A h* _ DvK@ e55lY5# #!8NhH& % hHF5  W-lY /UW-fbW-lYfb5u 5,E-uuNf& %55DA h* 5u_u-_W-vK_   95+57Nef  AAE 56Ne  AE u@ 5_Nf > &PA h*e_uW- uw-\6`A !NA h* _W(_B dXW-fb_- _) W+_ 4X_@  _A707 y _A h* _ & 0 _ mA h* _? _l A h* _A h* _ V % _ F % _NA h* _ _A h*_N _w$"w " D4N& V % j555Nf@e& 8%w!w !D-VB ! V   lY& % V   fb& % wt!w b!B _  _  ,E5_ 5 _ 5@  r_   2  253 & @ % r? ,. V% ,   &  5   &  5$ hBy ONf  2..(A p_J   ee..e& %u- @Nf  2ww C_ _"g  3X  3"$ ###F"3#47:Trbe   T(#%  xx| 4@ 4    3ww b5 5 B 5@ef T% )@ Ae@`u .. ef % W-(_@ _@ .   _..#. A1l W-(  @e @e  &  5W-*  5 u-7@ @ae54N @-@ W-*@ @a# "@54 "*   : &  2ww @ @me,55 @e,5!_/*_"h5 @e, O!J.*F"@A1,p(  N  AA 2r #AA 2r  e u-u5ue S@  @m5DC(@p@0@pAf r2p  5! N  _KN&  _ww D5! eww D@( I xH,<=a=ADp}7@ =@2=Q/=x@) B"W-+A r=A r}&@ t= @t=B !w"w BC"  `f T%f T%_  "  B"*".<.8.(4"-"* &eAA~p^ AADtp0(W-( 5 " @ `, 5!@ `5,@ `,BD  `,ww ^`fE , ww u-@@ww D  ##### 5,E - wFw 4C _  xPr r          0@B h* _B h* _B h*  4 x B h* _e B h* _B !C h*_ C ! C h* _ C h* _$ _:"($.# & 0   C h* O &&C h*%A"   +& 0C h*%-" & -8C h*%" , @C h* * _:FC !w^w LDN& V   - W-w w D _ _ x~ _ _-__ _"" S"$"(. ,. :"(.#., , " ", ", 5-ww BCE%E ! ! A @@?   ! A @@,55EU !" ,     ww  F 5#  ^C h* eNbC ! ww C"(!!#! ww D 5,E--\Hf wZw HDN  @vC7D) y Uw w W-@  xzww CB NC h* _@z% v%5 D _@t55 FAWp @ C h* NC h* NC h* C h*C h*,_8, C h* eNC h* W-c$ $5$ $5NC h* NC h* t$C h* f$ b$D h* NfD h*%N,D h* 8D h* eN>p:&E h* Nff f fff h*e  ^` ,7<>wP addsubincdecjeqjnejlejgtjltjgejlosjhijlojhis/nopjbrNGNGVGVG?cG?cGfGfGpGpG?G?GTGTGGG?TG?TG?G?GGG?G?G?G??H??H!H+H?:H?FH??SH??dH??dH?H?H?H?H?H?H?H?H?H?H?H?HHHHHHHHH?HHHTITIIT,IT,IT?@IQIQI?gIzI?IITIT?ITIII?IJ?J0JT?AJXJ?oJJJJ?JJTJJ?JT?K?K?#K?JKKKSK?`KaKiK? L?L?L ?L?L?%L?%L?0L?0L???L???L?ML?TL?\L?fL?pL?{L?{L?{L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?L?M?M?M??@M?eM?eM?oM?oM?M?M?M?M?M?M?M?M??M??M?? N??N??)N??)N??3N?X?ZX?ZX?{XT?X?X?X?X?Y?7Y?BY??RY??_Y?Y?Y?Y?Y?Y?Y?Y?Y?Y?Z?Z?!Z?6Z?6Z?OZ ?lZ?zZ?Z?Z?Z?Z?Z?[?,[??:[??U[??q[??[?[?[?[??[?[??[?[? \??\w w 8De8  7 % w7 77 7ׯ7- 7 7"|b7 7 .zb*B J*dN+oH+x~+f+e&+c4+s+l ӕ- C r f e0 1 /B7 ҋ D~'0\4\ f v Le0 9e7 z6 p&  m6 6 ~    ~ w7 6 6 60  6Wp `e0[eӕ?fw&08\7A 7 X6fA & UfA  @e7/1@>\  1 @ wfw/AD\F  Df@A&  6f@A @+ 9 & fA @e&7?DEBC=EDCBvKhHFlY'Arg countMissing temp fileCan't create %sTree space botch.globl fltused Illegal initializationmov%c r%d,r0 @@@$47$34T:jTmov%c r%d,%c(sp) tst%c r%d No match for op %dmov%c r%d,r%d Illegal use of register0%oadd r5,r%d mov%c r%d,r%d Register overflow: simplify expressionr%d%d.%d.#r $0%o0%otst r%d *$AAAAAAB BB        B d, B   B @  B : PB h B *B  J B Illegal structurepBxBBB!  | f 2 f | f ( 2 F p p Divide checkC error: const$0%oL%d%d.+%d.(r5)_%.8sIllegal structure reference$0Bad reg. referencer%dL%d(r%d)%d.(r%d)(r%d)%c%c(r%d)(r%d)pname called illegally%sNo match' for op %d*+,HIJHFFHFFPjbr L%d sub $0%o,r0 cmp r0,$0%o jhi L%d asl r0 jmp *.+4(r0) L%d L%d mov $L%d,r1 mov r0,L%d L%d:cmp r0,(r1)+ jne L%d jmp *L%d-L%d(r1) .data L%d:%o L%d:.. L%d L%d .text jsr r2,hsw; %o; L%d jmp *L%d-L%d(r1) .data L%d:L%d L%d:.. %o L%d:L%d L%d .text /esw Duplicate case (%d) "56z X ~ cfcc jbr L%d L%d:tst (sp)+ cmp (sp)+,(sp)+ add $0%o,sp %d: <<888888888>"B"?F"J"@J"F"AB">"BN"S"CW"["D["W"ES"N"6":":"6">"B"F"J"J"F" B">" 6":" `"e" e"`" :"6"j0#0#0#0#0#0#"0##0#$0#%0#(0#)0#*0#+0#-0#.0#/#00#<l"=l">l"?l"@l"Al"Bl"Cl"Dl"El"F0#G0#H0#I0#K0#L0#M0#N0#O0#P0#tstC A GBtstC #(I) GEcmpL A,B GBcmpL #(I),B GAVcmpD B,I GBKJcmpL #(I),"(J) GBKIcmpC #(I),J GAKJVcmpD "(J),I GAKIcmpP I,J GDKBcmpL *(sp)+,"(I) GDKAcmpC *(sp)+,I GCKBcmp (sp)+,"(I) KCGAVcmpP (sp)+,I bitL B,A GBbitL B,#(I) GAbitD B,I GAKIbit J,I GCKAbit (sp)+,I HA@#@# @#!@#P#Fb$Gb$M<$N$K$L$MC A M' $^,A GBMC #(I) GBM' $^,#(I) clrC A GBclrC #(I) movL B,A KBmovL "(I),A KAmovC I,A GBmovL B,#(I) GBKJmovL "(J),#(I) GBKImovL J,#(I) KBGJmovL "(I),#(J) KAGJmovC I,#(J) GDKBmovL "(I),*(sp)+ GDKAmovL I,*(sp)+ bisL B,A KAbisC I,A GBbisL B,#(I) KBGJbisL "(I),#(J) KAGJbisL I,#(J) GBKJbisL "(J),#(I) GBKIbisL J,#(I) GDKBbisL "(I),*(sp)+ GDKAbisL I,*(sp)+ bicC $!F,A KAcom I bicC I,A GBbicC $!F,#(I) KAGJcom I bicC I,#(J) GBKIcom J bicC J,#(I) GDKAcom I bicC I,*(sp)+ M'C A M B,A KBM "(I),A KAM I,A GBM'C #(I) KBGJM "(I),#(J) KBmovC A',J M "(I),J movC J,A KAmovC A',J M I,J movC J,A KAGJM I,#(J) KCGBM (sp)+,#(I) KCGBmovC #(I),J M (sp)+,J movC J,#(I) asrC A GBasrC #(I) aslC A GBaslC #(I) j%8%8% %!%"%#%%$%%:&&H&e$PP&(.').'*x'+','-&.'/&0&1&F)G)H'I&(Jd(K(L(M(N~(O(f$3\)4p)h$E A jmp A GBjmp #(I) jsr pc,`A GBjsr pc,#(I) GAjsr pc,(I) clr I clrf I movC A,I movf A,I movof A,I MC A' movC A,I M' $^,A' mov A,I GBMC #(I) movC #(I),I GBM' $^,#(I) mov #(I),I movC A',I MC A mov A',I M' $^,A GBmovC #(I),-(sp) MC #(I) movC (sp)+,I GBmov #(I),-(sp) M' $^,#(I) mov (sp)+,I GEbeq 1f clr I br 2f 1: mov $1,I 2: mov $A,I mov r5,I add Z,I GBmovb *#(I),I GBmovf *#(I),I GBmovof *#(I),I GBmov *#(I),I movb *A,I movf *A,I movof *A,I mov *A,I HBmovb ~(I),I HBmovf ~(I),I HBmovof ~(I),I HBmov ~(I),I GAnegP I GAcom I KAmovC I,A KAmovfo I,A GBKAmovf I,#(I) GBmovC B,#(I) movC #(I),I GBKAmovfo I,#(I) GBKImovC J,#(I) movC J,I KAGJmovf I,#(J) KAGJmovfo I,#(J) GDKAmovC I,*(sp)+ GDKAmovfo I,*(sp)+ KAmovfi I,I movC I,A KAGJmovfi I,I movC I,#(J) GDKAmovfi I,I movC I,*(sp)+ GAKIxor J,I GCKAxor I,(sp) mov (sp)+,I GAbisD B,I GAKJbisD "(J),I GAKIbis J,I GCKAbis (sp)+,I GAbic $!F,I GAKIcom J bic J,I GCKAcom (sp) bic (sp)+,I GAGAasr I GAash $-F,I GAKIneg J ash J,I KCneg (sp) GAash (sp)+,I GAGAasl I GAash B,I GAKJash #(J),I GAKIash J,I KCGAash (sp)+,I GAGAM' I GAMP B,I GAKJMP "(J),I GAKIMP J,I KDGAMP *(sp)+,I KCGAMP (sp)+,I GAmulP B,I GAKJmulP "(J),I GAKImulP J,I KCGAmulP (sp)+,I GATsxt I- div B,I- GATsxt I- KJdiv "(J),I- GATsxt I- KIdiv J,I- KCGATsxt I- div (sp)+,I- GAdivf B,I GAKJdivf "(J),I GAKIdivf J,I KCGAdivf (sp)+,I movC A',I mulP B,I movC I,A KCmovof A',I mulf (sp)+,I movfo I,A movC A',I KJmulP "(J),I movC I,A KAmulP A',I movP I,A KCmovC A',I mulP (sp)+,I movC I,A GDKAmulP *(sp),I movC I,*(sp)+ GDKCmovC *2(sp),I mul (sp)+,I movC I,*(sp)+ GDmovof *(sp),I movf I,-(sp) KAmulf (sp)+,I movfo I,*(sp)+ movC A',I sxt I- divP B,I- movC I-,A KCmovC A',I sxt I- div (sp)+,I- movC I-,A KCGJmovC #(J),I sxt I- div (sp)+,I- movC I-,#(J) GDKCmovC *2(sp),I sxt I- div (sp)+,I- movC I-,*(sp)+ movf A',I divf B,I movf I,A movf A',I KIdivf J,I movf I,A KCmovf A',I divf (sp)+,I movf I,A KCmovof A',I divf (sp)+,I movfo I,A GDKCmovf *8(sp),I divf (sp)+,I movf I,*(sp)+ GDKCmovof *8(sp),I divf (sp)+,I movfo I,*(sp)+ movC A',I sxt I- div B,I- movC I,A KCmovC A',I sxt I- div (sp)+,I- movC I,A KCGJmovC #(J),I sxt I- div (sp)+,I- movC I,#(J) GDKCmovC *2(sp),I sxt I- div (sp)+,I mov I,*(sp)+ bisL B,A' movC A,I KAbisC I,A' movC A,I GBbisL B,#(I) movC #(I),I KBGJbisL #(J),"(I) movC "(I),I KAGJbisL I,#(J) movC #(J),I GBKJbisL "(J),#(I) movC #(I),I GBKIbisL J,#(I) movD #(I),I GDKBbisL "(I),*(sp) movD *(sp)+,I GDKAbisL I,*(sp) mov *(sp)+,I KAxor I,A' mov A,I KCmovb A',I xor I,(sp) mov (sp)+,I movb I,A GDmovC *(sp),-(sp) KAxor I,(sp) movC (sp)+,I movC I,*(sp)+ bicC $!F,A' movD A,I KAcom I bicC I,A' movC A,I KAGJcom I bicC I,#(J) movC #(J),I GBKIcom J bicC J,#(I) movC #(I),I GDKAcom I bicC I,*(sp) movC *(sp)+,I movC A',I ash $-F,I movC I,A KCmovC A',I neg (sp) ash (sp)+,I movC I,A KCGJmovC #(J),I neg (sp) ash (sp)+,I movC I,#(J) movC A',I ash B,I movC I,A KCmovC A',I ash (sp)+,I movC I,A KCGJmovC #(J),I ash (sp)+,I movC I,#(J) M B,A' mov A,I KBM "(I),A' mov A,I KAM I,A' mov A,I KBGJM "(I),#(J) mov #(J),I KCmovC A',I MP (sp)+,I movC I,A KCmovof A,I MP (sp)+,I movfo I,A KAGJM I,#(J) mov #(J),I KCGBM (sp)+,#(I) mov #(I),I KCGBmovC #(I),J MP (sp)+,J movC J,#(I) movP J,I KCGBmovof #(I),J MP (sp)+,J movfo J,#(I) movf J,I movif A,I GBmovif #(I),I GAmovif I,I GAmovfi I,I jz))) )!)#)$)(,*),*/F*0T*clrC -(sp) movC A,-(sp) M A mov A,-(sp) M' $^,A mov A,-(sp) GBM #(I) mov #(I),-(sp) GBmov #(I),-(sp) M' $^,#(I) mov A,-(sp) M A mov A,-(sp) M' $^,A GBmov #(I),-(sp) M #(I) GBmov #(I),-(sp) M' $^,#(I) mov $A,-(sp) GBmovb *#(I),I mov I,-(sp) GBmovf *#(I),I movf I,-(sp) GBmovof *#(I),I movf I,-(sp) GBmov *#(I),-(sp) movb *A,I mov I,-(sp) movf *A,I movf I,-(sp) movof *A,I movf I,-(sp) mov *A,-(sp) HBmovb ~(I),I mov I,-(sp) HBmovf ~(I),I movf I,-(sp) HBmovof ~(I),I movf I,-(sp) HBmov ~(I),-(sp) GCM' (sp) GCM B,(sp) GCKBM "(I),(sp) GCKAM I,(sp) GCbic $!F,(sp) GCKAcom I bic I,(sp) GCbisD B,(sp) GCKBbisD "(I),(sp) GCKAbis I,(sp) (*bdevsw[])(){ 0};int (*cdevsw[])(){ 0};int rootdev {(0<<8)|0};int swapdev {(0<<8)|0};int swplo 4000;int nswap 872;w  J F n  55"  7(  hn ` Z5V-  5  h-,! 5 5  h5 5& ee5`.  5 @ 55 u- Nf& % e  h hn   5  & : %e  @  7  h5 @ 5D   h5 @ 5H   h *~ ww @e5NL  ww f@e $%   _   @e0 9 Wp Be` ̋@n 3  )  P  )`,, , f  r n  et  ww @ = @ ȋ ww wDe    % Xwx7 7 ׯu q x aw v -  "7  ."B JFdoxfetcsRl ӕ- C r f e0 1 / ҋ D~' f v Le0 9e  z p&  m  X~  X  X~ w7   0  Wp `e0[eӕ?f ,xP n h @f L 7: 0(-"f   7  7 7 f@w$ w&fwlwhww7F @&HF7 W&f 7 @% t@A&@7@L> Be0# @є     BA   W e B@e0m ` eȐ9 ȕ0 ȕ1 N `0VV<6bF>@xd~04@Pl 8:>JZv@x|*V4  F4Jnprtv4z,00@Bln04 <hj, & ( 2 < F P R Z b f h x  0 N P Z h v x z    L d     " & ( @ X h l.s .=.+4 . = %d^. %s%sc.c%s %s %s %s: no more, no less %s: only one %s: cannot find >  @e <ww D  4 &  d J 4  JwPw >BʵJ  Ce5f |  : 5f  tA@lee ʵ^P\PeʵJPHPN ;ww D5 Fe5e@-2 +5N& : e & e W fb^R7F fF E5074[ 50 [ 0 5 @@QDQEQ@  5 Q 2pv Er bؗҗI 2 —`5U0 J7JBE   5 e E ZZ1 rdB YY  5 YY  Ԗ ͖ W ` f EAZ `E Bv EE (&v  2  D>I  \ & D:  P ~ & ~╂ ԕ&   PII.*   P ~hbV  & C~FmH   W W @5v a~tE<8ķ (\  ԙ  0 P&  6r 6r@@A6v@@&HFw 7 Ze ,  # /* * Copyright 1973 Bell Telephone Laboratories Inc */ /* * DV disk driver */ #include "../param.h" #include "../buf.h" #include "../conf.h" #include "../user.h" struct { int dvcsr; int dvdbr; int dvmar; int dvwcr; int dvcbr; int dvssr; int dvair; int dvusr; }; struct { char lbyte, hbyte; }; #define DVADDR 0164000 #define NDV 1 struct { char *nblocks; int cyloff; } dv_sizes[] { 48720, 0, /* cyl 0 thru 202 */ 48720, 203, /* cyl 203 thru 405 */ 5040, 0, /* cyl 0 thru 20 */ 21840, 21, /* cyl 21 thru 111 */ 21840, 112, /* cyl 112 thru 202 */ 21840, 203, /* cyl 203 thru 293 */ 21840, 294, /* cyl 294 thru 384 */ 5040, 385, /* cyl 385 thru 405 */ }; struct { int hd1; int hd2; int cksum; char *chadr; } dvhdr; int dv_unit -1, dv_cyl, dv_head, dv_sctr, dv_count, dv_addr[2]; int dvhist; struct devtab dvtab; struct buf rdvbuf; #define HTBCOM 000000 #define CTBCOM 020000 #define CNBCOM 030000 #define INCHD 01 #define RECAL 02 #define RESET 020 #define SEEK 040 #define CLRDA); } dvstart() { register struct buf *bp; if ((bp = dvtab.d_actf) == 0) return; dv_cyl = bp->cylhd>>5; dv_head = bp->cylhd&037; dv_sctr = bp->dvsec; dv_count = bp->b_wcount<<1; dv_addr[0] = (bp->b_flags&B_XMEM)>>4; dv_addr[1] = bp->b_addr; dvexec(); } dvexec() { register struct buf *bp; bp = dvtab.d_actf; dvtab.d_active++; if (dv_unit!=(bp->b_dev.d_minor>>3)) { /* select unit */ dv_unit = bp->b_dev.d_minor>>3; DVADDR->dvcbr = LDSCOM | dv_unit; } DVADDR->dvcbr = CNBCOM | RESET | CLRD$ & 6 % savr5$_main startmio.ot x  7  e  7  err iill7     w 7 h  w zT 7 x 7 T 7 7 7 b  V T w X H  (w 0j7 | w 6% % w w ia\ftegdziblfhHxRp-l0t1t2t3t4t5t6t7t8t9t,/( )"> w r  w f7    \ w w \w `   7 F w V w (kw  . (  h w \  P7 } w l8 6 7  & " w  $0   + && w t7 w T7lw  .6w B7^ e @e w ` 7 &~   wLvww mww @ @ . @#w ef r @Pe007w $ q 5w fw w.  . Ћ     . HeB>@ . >W w :  4.$w ee*ed w ~emw -w 0` w  0w @ w ~.w  0w ~@w ~w -w  +w r e0w @e0w x & 7 <& w ze   m\cm ` 7 -w  0w @w ~ .w    0w ~@w ~7 p ׭rr׭i ׭_?X R ׭I?B?<&w F w Z |w ojw &  "w 4 TL w |  w hww  w @fҋ tw y& w  w   ѕ  JJ w  t  T 1 ,7 ? 7  7 w 8׭r׭׭ ??׭?   & w %    + - w %  00 @ e0 .    d  + - ew J 4 `  &    ,% w n&  +  -w 0 + - w 0 q p `e0  ,w " w "w |w D~w \ w x!7 vw | OLw D~\ w 1 @. 1 .  \\fortxx             Xrerr endio"rio4"Brio8"<iio2"Niio4"Hlio2"Tlio1"Zcio8"cio16" ecvt fcvt _ndigit slcnt ilval itype iowf"viowp"liorf"formpX setiordflg binflg itmfnd^ scale\ itmflg pbuf ppar llpcnt fmtchrllp crackngflg` repZ itemswitchmswitchafmt\ffmttefmtgfmtdfmtzifmtblfmtfhfmtHxfmtRscalminuslnumbtslashlpar rparquote>gnumelist_nocr$d eorec1xeorec`getitm"crack1width err1ndig cvswgflg iocviicvlocvLlicvfocvficvdocvdicvgocvgicveocveicvaocvaicvvxocvxicvhocvhicvqocvqicvgetbuf"vchkunit"creatf"openf"unit utable$ btable$. filnam buffer bufp fputc&flush1XfflushJfgetcnlflgb fputcc4nspace spacesgetarg~nflg ilen twidth fgetcnR storin gcflg gatof> atoi iowu"h ioru" rewi" enfl" ftable$V _end r1.od\\ \&\e&&&&\&&\H`" \ p`B `$"% \%\  a  \   \ \w P)gas1" gas2"gas4"gas8"stop"lval" rval4"4rval8"$do1"Zdo12"Bdo14"Zdo2"Tdo22">do24"Tgoto"~cgoto"cagoto"agoto"rerr gotoer2.o d N!#! B 6 *      \ \%H#pU\  \ %%%%%%ilt4"ile4" ieq4"ine4"$ige4"0igt4"<lan2"hlor2"dlnt2"pieq2"vile2"igt2"ige2"leq2"vine2"ilt2"|lne2"leq1"lne1"comparRoneHzeroNr3.o 0H \ \ V    \lif2"lif1"rif4"iif2""iif4"rif8" r4.o4e\\Vpf\ r\ \ \ \&\&\iad2"isb2"imp2"idv2"i2i4" i1i4" i4i2"i4i1"ing2"&rval2"*rval1".l2l1"2r5.oL8` @  @ @ @f\ VH 6  \iad4"isb4"imp4"idv4"ing4".rerr load"storer6.oa|     V&\ \ &\  &\  &\rad4"rad8"rsb4"rsb8" rmp4"rmp8"rdv4"*rdv8"&rng4":rng8"6r4r8"Dr8r4"@i4r4"Zi2r4"Vr4i4"rr8i2"di2r8"Lr4i2"ni4r8"Pr8i4"hrerr store2r7.owe&\e&\e&\e$&&\ e&\w 2&N`\w &ew ` f\bf~\  ePp~ f Pp~N w fMw e&N`\lvalp"rval1p"rval2p"rval4p"rval8p"&alval"2alvalp"arval"Larvalp">rerr getsubhr8.ol(  \  pApf\ipi2"r9.oR{X< 66w f\ w f\%W@  @@ W@ @ Mw Ione@ipi4"rpi4"rpi8"rerr ra.oR0H V fw w &\Aw )9Irpr4"rpr8"log exp rerr error*rb.o<0`&&\  E`f\\call"callp"retrn"stsp"8rc.o: \e \  C  C   rCCf&\  T@E@DD@CDD@ED@BD \VEH    &&\ Vf&\    Ef\c8c16"c16c8"i4c8"r4c8"r8c8"i4c16"r4c16"r8c16"cad8",csb8"<cmp8"Pcdv8"ncng8"cad16"(csb16"8cmp16"Lcdv16"jcng16"rval16"rval16p"gas16"ceq8"cne8"ceq16" cne16"abcdefgargsargdrd.o.0Pp~R \ \d b\898slist1"slist2"slist3"$temp re.oFl 6 . &      \& \ Hrle8"rlt8"req8"rne8"rge8" rgt8"(compar:one0zero6rf.oFl 6 . &      \& \Hrlt4"rle4"req4"rne4"rge4" rgt4"(compar:one0zero6rg.o T`\\\ \ \`\`\`\ `\ `\gmv1"gmv2"gmv4"gmv8"gmv16"stst"gmv1p"&gmv2p".gmv4p"6gmv8p"Bgmv16p"Nrh.or     #e\w  #e&\ #e\   e$&&\ #؆e&\   ʆePf&\gal1"gal2"gal4"gal8"gal16"$gar1"@gar2"Pgar4"`gar8"xgar16"rerr rx.o ecore$  !"#$%&'xT0W \A  hw ҕ ZZ r fw e0Runtime error 8YIImain temp"hrerr"fptrap erret argp mesgZmget.oo,H^,$fA7X^ fA @e7R1@  1 @ www &w Ugetc" getw#dfopen"put.oo,|(<fA7v|  fA & 9 &fA @e&7Bw>8@w w&w w putc""putw#flush"Bfcreat"flRatan.o,AX7d@w h&w `!7J& @ Aew 875775VVfW@H77 wf@@w 7`7PwLw 7RXCX   B (08@HP8@@!hI@!hAy1?ϑy"?D{Av#OP#C!+C|]2CU*j 4xBJh{CW*RsCL~Szatan"atan2"savehsatanvret\pi2sq2m1arctansq2p1onepi4p4pp4p3 p2(p10p08q3@q2Hq1Phypot.o,.$f@@&@V@w Vhypot"sqrt one@mesg.o,0t& &@w Ջ@@ 7& Emesg"nlist.o,@ <&fwA@ e  T K-m- e7v-v-n) n"  @ 7"D7,>7,8 7,2.* e nlist"donebufcdonecountsin.oo,& Wf&&7rW?WA@mW@ @ V@hZL>0BhZL>VV "@NnDOLX2xة3I䔶TX]1 D!L%dIgN5&GbqhDK-?sin"cos"frpi2fourth?fourAone@p4p3p2p1p0q3q2q1q0switch.o,՗L fA  AEswitch"sqrt.o,ȗJ@&E@f& e@ B@~VVsqrt"half@qsort.oJY`xf&55   w E ` s qDD`fD @ `   pD D  `D&`@ f f@Df@D@ qsort"compare exch1exchangewidthexchwexchbqs1@loopZloop1jttyn.oD(u4b*T x h"Pb@h h$$ttyЋ7:@ 0/devttyn"_ttyn"namebufher1ZdevberVrand.o,|"$7fWp3e @7Erand"srand"ranx"compar.o,pd$ &   compare"crypt.o,.lf&f"ЕЕ bP "Cx ""  rB`E \ \ " !" "E R"S" B 0 & s>e0W!9eW!ZeT!ᇅ @ @  crypt"word$key"wheelcod"cagecode"wheeldivshiftcagewheelecvt.oYE  ,7 2*W&f  7 @% @A&@47@L> Be0# @ є 4    BA   W 4e B@e0 mZ ` eȐ9 ȕ0 ȕ1 P" J`0  VV> _ndigit# ecvt"fcvt"eflag6buf sign4zerrone@lssvgtr:buftop4tenthepsilonL>ten Bpaddigit1digitoutoutoutpow.o,rHT@AfW@Vw fW@Vw w V)pow"log exp badDone@bad1Bhalf@exp.o,PWf@@67f@f @AdVHB`R@7^&e# 7V # VVE=sMBԝ`=B.pF:|+eiD(/zC@;\)@3dexp"ldexp stexpone@outlog2ehalf@P2P1P0Q1Q0sqrt2biglog.o,#8@Wf&7V @W@@`RD6B^PBVwVV5@3e1@rzlB#"3h@?ØGe@lB,k$aXUlog"ldexp stexpbignegsqrt2o2xone@p3p2p1p0q2q1q0log2ctime.o> @xXESTEDTw N " &ww @eL@4 &  F, J, J  , Uow  5/  5   ,  , &  F ww DC @mem e rfww p@&f % r<R r< r<R r< rWtC` re rwF !  7 %nP  ,@ @ 2 7 ww bAA Wpe|CԔԔԔ @eWpeCԔԔԔ&  ed&  ed&  ed&  e@ &  w.w *A r nmw w D W- C r  r e0Tԕ A r e0TwPFDay Mon 00 00:00:00 1900 SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec_cbuf _dmsize#@_timezon#X_tzname#ZL1L2_dayligh#^_nixonfl#`_ctime"rsave _localti""_asctime"&L3rretrn _dpadd _gmtime"FL5L10000L10001L6_sunday"L7L10002L10003L4_dysize"L8BL10_ldiv _ldivr L11L12L13L14L15L16 L17L9"L21bL194L20<L22|L23_numb"L18L25L24L27$L28(L26<ldiv.oax"$6rw6r@_ldiv"_ldivr$"_lrem"dpadd.oP f@  P`Hm` _dpadd"fp.o.oS( fptrap"atof.o?`Wff&  } - } 0    } 0  f 5ww 0B`W@ &  W B~  e0VV \ B@eatof"atoi digitone@outhugeten Bbig\atoi.o?4  } &  - } 0 Wp `e0  atoi"gamma.oEU7W7 f@3Bw w VVVV&w W@7W@V&fA&  7pw | hb7Tw `&@w XHA A&@&@w @ @&Aw &  BX  d\TLD<l|tǹ-q'k@?%CIA!h99I9gamma"signgam$_signgam$log sin half@one@twoAeightBlargenegativexasymptot:regularlretret&erret.goobiep5ppip4p p6dp5\p4Tp3Lp2Dp1<p0lq6q5q4q3q2|q1tq0s5s4s3s2s1s0*+,-./0123456789:;<=>?@ABrsave L3&L4_fopen L5,L68L1_seek L7NL9R_getc L10tL11pL12~L13L14L15L16L17L18L19L8rretrn mon.ooEBw   & & & e  & % T %5 w }@p@p wA Wp@5`A Wp@5 '@@ ED-  & f % f@ &f ew mon.out9XxX _monitor"L2L3rsave L4H_profil L5_creat _write _close L1_nargs L6VL7_ldiv L8rretrn perror.oTVLw L- 5NZ Nf^ %wUnknown error%s%s: %s I  (_errno _sys_ner _sys_err _perror"rsave L2LL3 L46L5Z_printf L6HL7^L1Hrretrn rin.o.oEC(Pxw   -  0  9Wp `eDBp@w9Y_rin"rsave L2 _getchar L3_exit L4(L5DL1Lrretrn alloc.oECDw D OeE%"m"e5a2  e%!5N %    % bJe wNw J@e!a b`! c33wOut of space 9 999_freelis#_slop# _alloc"rsave L2L1L3L5fL6dL7DL10000rL10001t_sbrk L8L9 _write _exit _free"L4rretrn L11L12L13L14L15L16L10fltpr.oYMH  ӕ- ӕ0B~ӕ.  ӕ0~ B~  ӕ-ӕ.B~ӕe ӕ- ӕ+ r e0e0S9Y99I9pfloat"pscien"Jfltused"_ndigit ecvt fcvt printf.oY Mp w wDe   % w7 r7 ׯh- ` ^"7 V .lB Jdoxf ecsl ӕ- C r f e0 1 /0 ҋ D~' f v Le0 9e  &  md b ~    ~ w7 6 , (0  Wp `e0[YHidiFreset.oET<w _setexit"_reset"sspsr5spc retrn.oETP$7 Fretrn"cerror"_errno$rsave.oETt $ @&HFrsave"mrsave"rretrn"ltod.ooNk< f =_ltod"bDEFGHIJMNOPQRSTUVWXYZ[\]^_`cdefghiK)9HHH_printf"_ndigit pfloat pscien _putchar rsave rretrn formplooprjustgnumlwidthndfndswtabldecimaloctalhexfloatscien characstringlogicalprbuf*prstr.ffltpr.oED< eӕ?pfloat"pscien"putchr.oED,p0fr ,hP ^ X @f < |7,* p| - |_putchar"_flush"._fout$vfl:getchr.oEDB0f   7 7 7 )())())))_getchar"_errno _fin badret4atan.ooEDp0fw5w 7 w99)_atan"atan retrn savr5 atan2.oEEx0fw5u w 7 w99)_atan2"atan2 retrn savr5 atof.oEE"Hfww 7 w  I9atof _atof"a_tof"retrn savr5 ptr"chdir.oEEp$fww w )_chdir"retrn cerror chmod.oEE $fww w w)_chmod"retrn cerror chown.oEE $fww w w)_chown"retrn cerror close.oEE`$f@w w)_close"retrn cerror cos.ooEFp0fw5w 7 w99)_cos"cos retrn savr5 crand.oEF<f@ wf wI)9)_srand"_rand"retrn rand srand creat.oEF|$fwwww)_creat"retrn cerror crypt.oEFp0fw@ 7 w99)_crypt"crypt retrn savr5 dup.ooEFh0f@)ww9)dup)_dup"retrn cerror ecvt.oG6`w " w  7 }w6 M)9YYiYI_ecvt"_fcvt" ecvt fcvt _ndigit savr5 retrn setup&execl.oEFlfw@e7 w _execl"cerror execv.oEGdfww w _execv"cerror exp.ooEGp0fw5w 7 w99)_exp"exp retrn savr5 floor.oEG.<6@@W@@@6 _floor"_ceil" floor"ceil"$one@fork.oEG\$fw w)_fork"retrn cerror fstat.oEGx$f@ww w)_fstat"retrn cerror gamma.oE_p0fw5w 7 w99)_gamma"gamma retrn savr5 getc.oEH `fwz7A 7 fA & UfA  @e7.1@  1 @ w~YIindir_getc"<_getw"_fopen"cerror _errno badret~getc1Lgetcsw.oEH< f&w_getcsw"retrn getgid.oEHP$f/Ew)getgid/_getgid"retrn getuid.oEHDfEw_getuid"retrn gtty.ooEHx$f@ww w )_gtty"retrn cerror kill.ooEH<fw w%)_kill"retrn cerror kill%indirlink.ooEI $fww w w )_link"retrn cerror log.ooEIp0fw5w 7 w99)_log"log retrn savr5 makdir.oEIp$fww w)_makdir"retrn cerror mdate.oEI"$fwA@A"w w)_mdate"retrn cerror mknod.oEI&0fwww&w w)_mknod"retrn cerror mknodmount.oEI&$f&w w)_mount"retrn cerror nice.oEI`$f"w w)_nice"retrn cerror nlist.oEJp$f w )_nlist#savr5 nlist open.oEJ|$fwwww)_open"retrn cerror pipe.oEJt0f*wBJ w)_pipe"retrn cerror pipe*pow.oEJx0fw5u w 7 w9)_pow"savr5 retrn pow prof.oEJ$ fwwww $w,_profil"retrn putc.oEK xfwAF  Df@A&  6f@A @+ 9 & fA @e&72w.(@wZ7 VIY_putc":_putw"_fflush"j_fcreat"cerror _errno badretgoodretputc1Pflxqsort.oEK\w w wAupNNmf . ww @@5 _ fA rBpu@@m55D@5!f& r%5 @&   ` 3f <%5 `@&   5!`@&& %`@&  `5!$@@AA Nf` . u Nf . @`5_8@& %@_~wlw hbDCԒ wHw D>DCB5ҒS w9 i9  i9i9i_qscmp _qses _qsort"rsave _qs1".L1*rretrn L38L2L4~L6L7_qsexc"L8L9L10 L11L12L13 _qstexc"L14nL15RL16jL5L20L18L19L17L24L22L23L21read.oEK"$f@ww"ww)_read"retrn cerror sbrk.oEKHHfD@wm:Hw.wm(wfwHww w9)9)_sbrk"_end retrn cerror ndL_brk"(seek.oEL$$f@ww$w w)_seek"retrn cerror setgid.oELl0f@.w w9)setgid._setgid"retrn cerror setuid.oEM`$f@w w)_setuid"retrn cerror signal.oEMbNTfAww5Wpe\W b W zwtwwf& 77777777777709Irtisignal0_signal"retrn cerror vectbevectsin.o.oENp0fw5w 7 w99)_sin"sin retrn savr5 sleep.oENP$f@#w_sleep"retrn sleep#sqrt.ooENp0fw5w 7 w99)_sqrt"sqrt retrn savr5 stat.ooEO $fwwu: jsr r0,call; _dcxint &dcopen, &dcclose, &dcread, &dcwrite, &dcsgtty,kl klin; br4+1+%d. klou; br4+1+%d. dp dpin; br6+%d. dpou; br6+%d. .globl _dprint dpin: jsr r0,call; _dprint .globl _dpxint dpou: jsr r0,call; _dpxint &dpopen, &dpclose, &dpread, &dpwrite, &nodev,dn dnou; br5+%d. .globl _dnint dnou: jsr r0,call; _dnint &dnopen, &dnclose, &nodev, &dnwrite, &nodev,dhdm dmin; br4+%d. .globl _dmint dmin: jsr r0,call; _dmint dhmgetpw.oEB ,w  @e w N &  %5 5 B@e %  2ҐB %: %: 0 9Wp `eD5! w(/etc/passwd)X_getpw"L2 w w)_stat"retrn cerror stime.oEOh$f@Aw w)_stime"retrn cerror stty.oEOx$f@ww w)_stty"retrn cerror sync.oEPH $f$w_sync"retrn sync$time.oEQTf BRw_time"retrn times.oEQ`$fw w+_times"retrn times+umount.oEQt $f 7w)_umount#retrn _errno unlink.oERp$fww w )_unlink"retrn cerror wait.ooER 0f & w }w9)_wait"_nargs retrn cerror write.oER"$f@ww"ww)_write"retrn cerror abort.oER( f_abort"errlst.oES0 @Error 0Not super-userNo such file or directoryNo such processError 4I/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough corePermission deniedError 14Block 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 system2BJTn 2BRbt_sys_ner# _sys_err# L1L2L3L42L5BL6JL7TL8nL9L10L11L12L13L14L15L16L17L18L19 L202L21BL22RL23bL24tL25L26L27L28L29L30L31exit.ooES0 f@_exit"hmul.ooES0 6p_hmul"hsw.oo\dD  r dA! hsw"locv.ooESj $f&jCB  ԕ- j e0fv   vA W  ~_locv"bufjdividNnargs.oETJ<Af w,.w"(e w"ew"@l  %e_nargs"jsrsd>tstiBcmpiDadmccos.oh@A(Hhhhh(8HhhhxHHccos."ccos_rval8p z1_gmv8 z2_stsp ftrval4 b_call exp. gmv4 c_c0rdv4 d_a_sin. rsb4 rmp4 c1cos. rad4 c2rval8 retrn d0basedummy_clog.or zrtrrtvrrtrz(Hhhhh(h8HHHclog."clog_zrval8p z1_gmv8 z2_stsp ftrrval8 call cabs. gmv4 c_lval b_stst a_atan2. rval4 alog. retrn d0lbasexdummy_csin.oh@A(Hhhhh(8HhhhxHHcsin."csin_rval8p z1_gmv8 z2_stsp ftrval4 b_call exp. gmv4 c_c0rdv4 d_a_cos. rsb4 rmp4 c1sin. rad4 c2rval8 retrn d0basedummy_csqrt.o\A(Hhhhhh8XhhhxhhxHcsqrt."csqrt_rval8p z1_gmv8 z2_stsp ftrval8 call cabs. gmv4 c_rval4 sqrt. lval b_stst a_atan2. c0rdv4 cos. rmp4 sin. retrn d0basedummy_dccos.o6h@A(Hhhhh(8HhhhxHHdccos."dccos_rval16p z1_gmv16 z2_stsp ftrval8 b_call dexp. gmv8 c_c0rdv8 d_a_dsin. rsb8 rmp8 c1dcos. rad8 c2rval16 retrn d0basedummy_dclog.o$t0,|tvttvxttvt|(Hhhh(h8hHHXXdclog."dclog_|rval16p z1_gmv16 z2_stsp fttrval16 call dcabs. gmv8 c_lval b_stst a_datan2. r4r8 rval8 dlog. retrn d0nbasezdummy_dcsin.o6h@A(Hhhhh(8HhhhxHHdcsin."dcsin_rval16p z1_gmv16 z2_stsp ftrval8 b_call dexp. gmv8 c_c0rdv8 d_a_dcos. rsb8 rmp8 c1dsin. rad8 c2rval16 retrn d0basedummy_dcsqrt.o!0hA(Hhhhhh8HhhhxhhHdcsqrt."dcsqrt_rval16p z1_gmv16 z2_stsp ftrval16 call dcabs. gmv8 c_rval8 dsqrt. lval b_stst a_datan2. r4r8 c0rdv8 dcos. rmp8 dsin. retrn d0basedummy_tanh.oo-LRLNLVHVZVZVZR@(H(hxtanh."tanh_Rstsp ftLrval4p a_call exp. gmv4 b_Vrval4 c0Hrdv4 c_Zrsb4 rad4 retrn basePabs.oox0  ;7w889)abs."dabs."retrn temp aimag.ol0V7w89)aimag."rval8p retrn temp aint.o+Vql0;@ww9aint."temp one@retrn alog.o(H  ;w 7ww XX)Y9Ialog."dlog."log retrn rerr temp alog10.o2T  ;w 77ww ?[7f(XX)Y9Idlog10."alog10."log retrn rerr temp const*amax0.o>0    Y@  www8899)amax0."max0."retrn temp amax1.oH<    Y@  wwwHHHII9amax1."dmax1." max1."retrn temp amin0.o>0    Y@  www8899)amin0."min0."retrn temp amin1.o H<    Y@  wwwHHHII9amin1."dmin1." min1."retrn temp amod.o+Jq8H  /;{@7ww HHI)Yamod."dmod."retrn one@temp rerr atan.o-<  ;w 7wHH)I9atan."datan."atan retrn temp atan2.o70H  / ;{w 7ww HHYI)9atan2."datan2."retrn rerr temp atan2 cabs.oM*H  Qw 7ww XX)Y9Icabs."dcabs."hypot retrn rerr temp cexp.o_<`w 7w 77w 77ww 8Y9i99y99)Icexp."rval8p retrn temp rerr exp sin cos cmplx.ok0<  /  YQww 888)Icmplx."dcmplx."retrn temp rerr conjg.owx077w899)conjg."rval8p retrn temp cos.oo<  ;w 7wHH)I9cos."dcos."cos retrn temp dble.oTh(h8HXdble."rval4p lval r4r8 gas8 retrn temp dim.o*0/ ;;7ww ()9dim."retrn temp rerr dimag.ol0 V7w89)dimag."rval16p retrn temp exp.oo(H  ;w 7ww XX)Y9Iexp."dexp."exp retrn rerr temp float.oTh(hH8Xfloat."rval4p lval gas4 i4r4 retrn temp iabs.o`$ ;7w()iabs."retrn temp idim.o.0 / ;{7ww 89)idim."retrn rerr temp idint.o%\$ ;7w()idint."retrn temp ierr.o7pl(ltz7 d -^w xeNH ePwz"e7 "e&&pwwz)99ierror."erret#lrerr retrn zeroterrbufzcerrpxeerbufonepifix.oU`x(xX8Hhifix."int."lval r4i4 gas4 rval4p retrn temp isign.og.0 / ;{7ww 89)isign."retrn rerr temp mod.oo+Bq2< /;{@7ww ()Imod."retrn temp one@rerr real.ot0  ;7w889)real."dreal."retrn temp sign.o4<  / ;{7ww 889)Isign."dsign."retrn temp rerr sin.o<  ;w 7wHH)I9sin."dsin."sin retrn temp sngl.oTh(h8HXsngl."rval8p lval r8r4 gas4 retrn temp sqrt.o&H  ;w 7ww XX)Y9Isqrt."dsqrt."sqrt retrn rerr temp ctime.o ,$ 7 7 7Hww7w())))))ctime."retrn temp setfil.o<TAw w pw  ѥ !wX)HiH9setfil."getbuf chkunit retrn utable temp rerr nice.oo&l$ "w(nice."retrn temp getarg.oT r,p</ AH  `A T  ԕ 5  wb7 w8I)89I9)getarg."iargc."^retrn temp argp jklmnopqrstuvwxyz{|}~mmain.o.,$Tw Nf  w(9Yi_main"rsave _yyinit _yyparse L1 _yyaccpt rretrn parser.oHvP x w 87 pl7 j5 @e5 L J@ ee@&e  e5@e5E5@t_^    V7  :7@-ew   xN @  5@  77N @   e5}/ e@7_( _t@^  @Ae .@  e5@t%W/e @f %3@E7\_( RP B:_b   xT"   xjwstate %d, value %d, char %d character %d read reduce %d syntax errorerror recovery pops state %d, uncovers %d error recovery discards char %d H) )) YY )) (8) _yyval _yylval _yypv _yydebug#x_yyv ,_yystate#z_yychar#|_yynerrs#~_yyparse"rsave L2(L3FL4_printf L5b_yypact _yyact L6vL8^L9L10_yylex L11L10000L10001L12L13L14L15L16L17_yyr2 _yyactr _yyr1 _yypgo _yygo L18\L19rL20jL21L1tL22L24HL25L26_yyerror L27L28L29L30L31L32L34L33L35L36L37L38"L396L40L23\L41\L7tL42trretrn zacc.oo9,T 0w w9_yyaccpt"rsave L1rretrn zerr.oo=08w N   -   %      xhT ^ rwd %s, line %d, on input: %s \t \n \0 %c )H HHHHHHH_yyline _yyerror"rsave L2_printf L3(L4L5_yychar L6NL7_yysterm L8L10L11TL12L1L13^L14L15hL16L17rL18L9sswitch rretrn zinit.oM,T 0w w9_yyinit"rsave L1rretrn  & 6eWtEef f  &e7 e % f& @ANeHQ}  @&HFNo space for monitor buffer X)X9cbufs_monitor _sbrk _main _exit"h_etext savr5 starteprolcountbasmrsave"zrsave"rretrn"..K.Las2Mc0Nc1c2Pcrt0.oQfilib.aRfr0.oSliba.aTlibc.aUlibf.aVliby.aWmcrt0.onhsw.ohsw.o..X...Y.Z..[. d & 6 6% JanFebMarAprMayJunJulAugSepOctNovDecw P * ,e@-# @ t* e@7Z* V*  vdp|wwR*wN* +&* Z *^ | V  !  + 5<S 5  !/ 5W-0W-9W-aW-zW-AW-Z  W-   4   7R~T  Dww 7_ 2_ pC7׭|7 7()_׭}w)_6* * 77(&33e7(`7(w@ @77(w@7(w( 77( (77(  j  6*2e ׭L~7< 8%a(0 !Wpe6*C   wRw @ 55 W->N  5AWp q u55&55 'AWp q AWp q WpCfAWp fe f $e 5  5pC&t e ww 6*!* N&  ewrw ` 7:'575  5Aq5u@7 5 5&@pVp@@50 >= 8 W-6*5 W- @@mA1  W-e 5 W- @@mAH }w|w j Z&" 7!L& mD& AWp `J ҋ   w"w w%pD7%7%w@ 7&7%7%ww  %]57275 r _x7&55557t%  5&557X%54E7TT r  D  ,    r C  &8  |%w  '7 ' ӕ0B~&ӕ.  ӕ0~ B~ && :ӕ.&B~ӕe ӕ- ӕ+ r e0e0S&e@7r&e(l& @&- @A&@D&7@L> Be0# @є &    BA   w %e B@e0m% %`  eȐ9 ȕ0 ȕ1 >w w%De%  % % wv7 p%7 f%ׯf%- ^% \%-7 T% .-B JdXo~fe6cDsl ӕ- ; r f e0 ) '$ ҋ D~ fWtE Ee0$ |$ &  mv$ t$ ~    ~ w7 H$ >$ :$0  0$Wp `e0[f@ $$w#w H"-@w <"--#w N"-@7 #wfw#w 4"-7 #wfw0 7A 7 %fA & UfA  @e71@  1 @ w&f BRwf =7"%F @&HFB@$YfA7V   fA & 9 &fA @e&7"w@ E"&*.26:>B/usr/adm/wtmpNo %s %-8.8s%6.2f total%9.2f D%s %2dw w&w w  & 6 L%  S M Tu W Th F SJanFebMarAprMayJunJulAugSepOctNovDecw W- H ~W-S@ L5W-_@W- _@@ L!_@!'_@@ &2 H%@ H  &f e e  e @ L!_@!'_@D HH H P H e 0   R H   X H   ^ H l HeH & eH &e eH &e e  He  eHez H ~ Hww  B 0 9 Wp `eDww CD  @  ר 3N H ww ~BN N e r@ zy    x6"  `  rDWpB`@ >  AW  @0 e  @ ep  r e0  r e0R % @@m  wvw dDetae!e[ rde r`!e r@ww w(De   % w7 7 ׯ-  ,z"7  .x" B JdoBfLecsl ӕ- 6 r f e0 $fC~ fWtE Ee0: 0     `w    Ο       w7   0  Wp `e0[eӕ?f@f@ |tw`w "@w "-Zw "@7 8w<fw,w x"7 "w&@&HF7FfA7   fA & 9 &fA @e&7w@ ,048<@DHLPTXusage: cal [month] year %s %l %s %l %s %s %s %s %s %s Bad argument %s w w&w w d& & 6 %  w W-Y@%-R@ ȋB@1 @ mȕ?t*  @ m\@ "  1  xZ~e W- N " X@& 4 @ " ^ @& 4 @" " f@eX  @eX^   6@eX&^ %@eX^  @e&X % _@eX@e&  _@e& D @eX  @eX^   @eX&^ %@eX^  @e&X %@e& D @eX  @eX&^ %@eX& D @eX^  @e&X %_   xl_ww  N p A W = ww @        xxPX`N@ &2 "%wDw 2Nf D Nf   . ww  @ @   ̋  ww   ww w<De2  , % w7 7 ׯ-  "h 7  .f B Jdox8fBecsl ӕ- C r f e0 1 /t ҋ D~'8< f v Le0 9e2 z( p&  m   ~    ~ w7   0  Wp `e0[eӕ?f ,P   @f r v 78` @v VN-H@fw F7A 7 fA & UfA  @e71@L  1 @ w f@7F @&HFIllegal flag: %c Argc = %d Can't open %s Can't open %s %s%s v $:T & 6 ^% /tmp/crt0a/tmp/crt1a/tmp/crt2a/tmp/crt3a/tmp/crt4a/usr/lib/aign/usr/lib/atabw W-  >@%-N 5@ 5`u 5 @@-e_L! G! D!8!L@ @m& F @ @m&  LL !  A Amf p&"-   &"%/  &"-   & 5 W- f R @   K 6@FJ5 5 W-@ 55@ef  K  N^5 dt| @% @ @aA p 6K @ @a0 @ef  ww xX TPe!J  7@%7-2 $ & %  :4 :" t@` 5@  -^J^JXJTJww  IDJK@J6:7 l"f&7  F  5  @%@t&ef %% N    5 @e&f %%)W-%Nf %@- Nf %@- N N  T    HS *  7  p p p p   7J  7:  7*  7: `:".L"#׭>׭ ׭  7t  y w w - L"N׭* x!%/M `L" r:"=׭H  .׭</0!%*')T7L"׭\  @<L"2 r:" 7  y w w - 7   7 w w - 7    _v qh7 w~ w l  Wpu-fD X ? 9(e!@7"-7  @- @A p"-  " " 7 ww Wc Wh Wrww ww x7 w|w j LDwfw T@7,C_ @7CwC@7 C@7C@7C@7C@@muu@ A AupuW- A 7rRCC rFCu  @ m*Cm,C5-$C$@e5u @ A @RAAm 7rBu C BB-B @ mBB B@m-B @  |B xBm~BA HdB `BmfBH @PB@LB ww u@ @@mȕ A r 5 N ff % @@mC r e0Ȑ @w0w    @ A  ww -  7 &  7 L9 J9 7  _  7 .97 ww  @ M@me5+u@ A @lMe5   @ AH@ MN Ru@ A @lMe5@A 1`M   @ AH ww @ M@ M;@ &M M%  ,8 N   &@@ M@ &@ & %A @,M@ 0 M wNw <w?De?  ? % w 7 ?7 ?ׯ?- ? ?"U7 ? .UVB Jzdoxf ecsl ӕ- C r f e0 1 /? ҋ D~' f v Le0 9e> z> p&  m> > ~    ~ w7 > |> x>0  n>Wp `e0[eӕ?f@ J>B>w&>w U@w U-(>w U@7 =wRfw=w U7 =w<f@w$ w&fww"wwfww(wfw wfw.7A 7 ?fA & UfA  @e71@4  1 @ wRfwjwf:w8w<f@wNwJ@wwfAw|wx5pWpe@W F W  VwPwwf& fw"w wf D& w }w~f@wwwXw\f@Af w,.w"(e w"ew"@l  %e7=F @&HF r dA! fA7<  fA & 9 &fA @e&7w@ 2  `rHv@".:FR`Usage: cref [-aceilosux] file1 ... Can't open %s /bin/sortsort-a-o/usr/bin/upostupost/usr/bin/crpostcrpost-3Illegal character: %o line %d Can't create user's temp file.Error %d Can't find %s Try again Fatal error in %s t = %d Unrecognized flag: %c /usr/lib/ctab/usr/lib/cign/usr/lib/etab/usr/lib/eign/usr/lib/ctab/usr/lib/cignx  h0D n "'/<\r8Fd"'*\&:MOQSWraparound temp file %d  7 777777777770 w w&w w crt0.odr.oacts.o put.oprintf.offltpr.oputchr.oclose.ocreat.oexecv.ofork.o2getc.oFopen.oread.osignal.ounlink.ojwait.owrite.oexit.onargs.oretrn.orsave.o(nhsw.oHput.o\savr5$U_main"n_temp$_t1$z_level$|_hlevel$~_dlevel$_xtrn$_tp$_tab$_coll" _save"2 _out" _asym" _asw"`_csym"_csw"r_incl"H_decl"v_sk2"_sk"_tabs"_semi"@_line$!_l$"_lno$"_c$"_cursl$"_curs$"_curfl$$"_curf$&"_usw$0"_xsw$2"_only$4"_cross#_file$6"_cs$8"_flag$:"_fl$J"_gch$L"_itab$T"_xtab$`"_ipsp$l"_issp$f&_xpsp$6_xssp$:_ib1$I_ib2$K_ibuf$M_ibuf1$M_ibuf2$M_mone#_order#_ssw$M_type$M_utmp$M_acts#_tmp#_ignonl#_gtab#rsave"*_printf"_exit"_flags"_init"^_fopen"F_dexit"_driver"_close"_flsh"R_callsys"rretrn"8_getc"_error"_open"_read"_compile"_signal"_creat"_unlink"j_fork"2_execv"_wait"hsw"H_search"_comp"_dfile"f_put"_conf"_bct$M_optr$M_bsp$M_obuf#_nflush$U_write"ndigit$Upfloat"pscien"_putchar"_fout$U_flush"putc"~flush"retrn""cerror"_getw"d_errno$W_nargs"mrsave"(putw#fcreat"\:0 & 6 % w  W-P x @%-.@%E^@e5W-W- t x te 5 @@- @ @m&  5Nf N   w:w (8@eZ55 u-_ ff  _ u=@eZ5@ <f   P  55_ @@a _E@ <f p N@e`f p 5` @@apW-    @@a u @@-@ <f Xu=@eZ5@ <f  _3@ <f p N@e`f p 5` @@a u @@-@ <6Q _2 x422222222:( _  f@e`f % @@a TW & J% 8 N@e&& J%_ ww   @5 @ AH@@ww n   @ A  wHw 6  & f %7x  r  X N x ww  @  @me5+u@ A @l e5   @ AH@  N u@ A @l e5@A 1`   @ AH ww @ @  $ @  @ &@ & %A @, @ 0 ww wXDeN  H % w7 47 *ׯ*- " " 7  . B Jd^oXxfe6cDsl ӕ- C r f e0 1 / ҋ D~' f v Le0 9eN zD p&  m& $ ~    ~ w7   0  Wp `e0[eӕ?f ,P   @f   7D|  rj-d\f@wr wtfwwwRwVf@www0w4f@wwwwf@7F @&HF 4 R p Usage: crpost [-d] file1 file2 ... -d: 0 < d < 10  read error    , & 6 % w W- @- eW-   %  j7(N > &" e5N j7 W-N j77T e j75 w-: @ m $ e me7N (  %N ww   j7:5 W-c@  m p@ @m&  & %  %  r  j m 2 8 e ~@  m~B  p  w w \@&  L@&   55 ?2?,5 7!_ m  %   m AHo m" %   m AH  5& 5% W  W   mv \ 5  mN AHW   m< $ 5  m AH _r t  %   m AH  ~ ~@wB w 0  & ff< ef fD e $ !@A1,e@N mNeA: H   ( %@ @mA Am "@ A @` m A B `H _f _f ? ? @ 5 f fff je  f @ &NmefN@ &Nme je 5 5 5 u- @ m6 A A m( @b5@-uu @e@e& ffff He@e@e& f N@ &NmefN@ &Nme HeNfff eN@ &Nm@ f@ &Nm@  ew w Nf fL eNf  fR e  @m  u u-6u Aup Amuu e @ "B @ 5`@5"! D   ww  *Nf: fX eNf  f` ef f f h eC  @m  Am 1" up AmuA up AmBD @ 5" =w w @- 5 7t  @& * ?>  @& * ?, ? 4 @ m*  p cu-[u-@ m A m A " @ m  5@e5u- @ m  @ m e5@ m HNffff * e@ 5juW-cW-@ m4 A m* Ae" @ m  @ m e5@ 5W- @ m  @ m 5@ mHNffff * e@e5 Bww u-u- jNf  u-a u- dc $ N f   $ pff d eu-_ u- _ t _ z_ ~f f d e u-  ww u-N u-N u-N ww uu-H @ @m&f %@ @m@ @mf ef H%N 5 @ @mA Am@@- @ @m $  ww N u- Aup N@@ `  u- Aup AmN  ww xwDe   % $w\7 7 ׯ-  7  . B J" dr o f eP c^ s. l ӕ- ; r f e0 ) 'D ҋ D~ fWtE Ee0 z p&  m  $~  $  $~ w7   0  Wp `e0[eӕ?f@ xwhw p@w d-^w v@7 @wfw4w \7 *wf@wt wvf@)w^wbfw^7A 7 fA & UfA  @e71@  1 @ wfwwwwf@ww wwfwm&w~wmwxfw&w\w~ wXf@wnwj,w2 w4f@wPwL2wwf@7F @&HFfA78 fA @e71@^  1 @ fA7d  fA & 9 &fA @e&7w@arg count jackpot can't open input xxpart apart binn ainn bstrip astrip bstrip x* --- . . %d%d,%d%s %7o %7o f6 6 w &E v6v6`v v`v e- -%www &w Uw w&w 8w .Bn"0 z 7 x    /       &e  & !eRɋʋe7 7 xnpedmfinqc? ^ B 77zawM p >  8ҕ d "    "    wLNf0q e7   w x www ʋ @ n | @ \  ~/bin/ed/tmp/ftmpaCannot open temp. file t f w< 2 jN   F       xw p w ww|< = f  B L v .  "  8  " @ F wP  ww< , ҕ  w 6"(  z  ҕ  d P ҕ zww` / "ҕ   D ҕ:  .ҕ wZ      ҕ w& H z  > p WpUWfU| 7  \,    H |c  h e 45 $ \)  ~8w -5 (   Ve   w  w vw f w8w  `-X P J @ vҕ lB-*w > w header not accounted for part of asmem released free headers free blocks size  &@     ʋeʋB   & T P D D* 7 0 ʋ.| &'ʋ%f ?  J % <  xeʋBf    w  wɋR b `  ҕ | ey q  Z   H   . wN hCB C B8  7 :  e8 f rfe0 w f r fe0 w f    q,   &8   7X  7K Be8&8 " q,  n7q,  Z7e8 &fCC  j @q o  &  6`( d  Vw`  Bl error on copy f1N1N1N1&0C  Bqqq&qq, qf& H@l1 11 1  D ( & qf7 q,@ @  b@  ȝ q,q q,@   h \   f7d Hq,@ @  T 8 @  \ȝ(  x f   Wv Ee    2 2 2  7 f& Wv Ee  @E7 2bwe2 @` .&&w2 f  2 2 Wv E@`e & ! ,   e e$ fhr    ,  e7 & 2 ,    &e " ::e8p:@11     : bwOut of space.  :e8p:e8Bl s3 B88& F V 1:1 8p: f&7 H 0 :`CKe8 Gxe, 2e8 Be8, 2 8 4l4 4<80<Ae8   ,Out of headers.      @ @W \W 85W,W,@@& ,e ":e8  & 87 & 7 7  v 8 d e8^ U\87R e e 052 :  Z. e8& 2   8:8A e8 8  bw w 8  not in memory. Cannot open file cannot open output file form.m, & 6 % w x twTwPF@7,@& ,   @77 @ @m W-. B  J5B B -N B NxfB ^ ew<w * @5d Z& ,   f4 % \@ww  @5h & ,   f % @ww  n B   & ,  &x %  wRw @ |5f ,  & 5 V5f , _@_ 05uW+ 5`f ,  f %_f , @f  5& %_f , @f  5& %_f , "N Z 5% N B  @fH %__f ,  < &  %__f , @f  5&p %_f , @f  5& %_f , @f  5& %_f , &W-@t5@@me5 @fE %UGf ,  e5 & ,  f> %1#f , e5 & ,  fV % Nf B% ww `WpqRWpqDWpq6 2Wpe@ww -""   mww w  B  @aȋ@a%/@a 7 f@  D    B Bw,w @&@ @&@  w w @&@ @&@  w w @&@  wx w f @ h wZ w H  B w< w * @@&~WpWtf %w w @@&JlWpWtf %w w @@&'& %w w @ , w w x @@&& %wb w P ttEP@@&& %w& w  @,-@5hAA @@A@, w w @  w w 5 @ m& B% 5%yW  5 @   w\ w J W+ u- W- AWpA-  u- w w r 55@  mL5+*f , _ ,f , _| @ @a_ @ @ap@ @a0  W 0 @e DN@e&f %5 0@@m5 @ @mp @@m0 N@e&fe %N@e&f %   w w  X  70 5KW F@e5 =%:@ ȋ5=N@e& , & ~5%:@e5 ^=%: =@e 5 7@ww DC ԋ   ww f T Nd B _d  E%@WfWbff %_d WdWbff % 5 u-_^ @@%@@5 f  5 Nv B _d  ff 0%N@e&f % N B _d N  @t!`t@a Wt@a%.Nt@a,H @aA`pr @aq%/ @a/r  @aWt`Aapr  @a0rN f@&@er& ^ e N B e_ ww W.W. Nf ww tC@5b @7&  N f X V@  C- A @@P7 y5   /  N f !  Nf   78 yC- ww xNf   wL  7 ӕ0B~ ӕ.  ӕ0~ B~   :ӕ.| B~ӕe ӕ- ӕ+ r e0e0S @'- @A&@7@L> Be0# @є     BA   W e B@e0m `  eȐ9 ȕ0 ȕ1 >w wf De\  V  % w7 B 7 8 ׯ8 - 0 . "7 &  .B Jd(o"xXfbecsl ӕ- C r f e0 1 /  ҋ D~' f v Le0 9e\ pR &  m4  2  ~    ~ w7   0  Wp `e0[f  , P  @f  7    -| t f VPH  78 4 07@ 7 fw* w 7 wb  f@w@ wBfw*w&w"fw wfwwwwf@wwwwf@www wfwww wf BRw|f "& w` }w\f@Af w,.w"(e w"ew"@l  %e7 F @&HFWff&  } - } 0    } 0  f 5ww l0B`W@ &  W B~  e0VV \ B@e } &  - } 0 Wp `e0  +Insufficient args Odd usage Missing conjunction -or-andoperand follows operand. !()-name-mtime-atime-userCannot find user <%s> -print-group-size-links-perm-exec;-ok;Error <%s / %s> %s. %s !%s! for <%s>? ;{}/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/etc/passwd--bad status %s --cannot open %s --cannot read %s --%s -] *?[dP0   D 0jz f`` z0*Hcannot open output file formaletter77 h S  S  vrh& \  R  r N e0 6 e0 , w08AGMQV[blt}JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember ( w w  w w{  } 7  w 6 w w  p j   2 &f VV\[{]V}Q  A  Hw  f 80 9 ] }  NN6         f rt  rlw T @N z F@w@. X$ `&n p7  ,  <7    @ [w  ]w  B 7   t   wf n0  Nf \ 7 J T &D ~7 *7 ,&[w  e0w ]w  Lp &:w w w    w    B 6  &f   "&   z e q,  78  w :   H wfBBb2 W"f&@w  w        v$p t  \V z PJ l :  :4 T     q,   &J   7   7 eJ&J " q,  n7q,  Z7eJ &fCC  j @q o  &F  6`( &   w`&  Bl~error on copy f1N1N1N1&0tC  BZqqq&qq, qf& @l1 11 1  D ( & qf7 q,@ @  b@  ȝv q,q >q,@      f7 q,@ @  T 8 @  \ȝ   x f   Wv Ee&    2 2 2  7 4 f& Wv Ee&  @E7 2 we2 @` & w2 f  2 2 Wv E@`e& & ! , e e6 f r   ,e7 &      &e " LLeJpL@11     L  wOut of space. x LeJpLeJ@BlR s3 BJJ& F 1L1 JpL f&7 L`CKeJ GBxe, 2eJ BeJ, 2 J 4lB4 4NJ0NAeJ  J ,Out of headers.      @ @W nW J0W,W,@@& ,Be "LeJ  r &r J7 d & L 7B 74  * J@  eJ UnJ7 e e B02 L  leJ2   JLJA eJJ  bwpwJcannot open output file form.m 050z42  W-Wv Wc Wb Wn        7 7 7   " : w d ^]   d Q zMd @ B wf7`eTw Nw  8 0 ,  *(  w d   t   w d ^@w d  @w d w d  f 2w  R J7 7 7  xten ^A2W ^w  W*(AW \W .%W *VW $#W [,w Sw  ^ w AS w n͋w b$w Vze 7w >(AW ^:A  mh AW ]ZTS^^[ &[ %ԋ S [ &6ԋ[&ԋ-L ld [d Zd [L& Dc  d& ,c  ̋[ &[ e! fEtWtE w d  @w jd :w ^d r f e0w @d fwfA7  fA & 9 &fA @e&7w@>&@wՋ@@ 7D E: cannot open arg count regular expression too long regular expression syntax j w w&w w * 7jlv&% n 5Pll56yXwas n j? /dev/tty0 x !N@ $$tty7:@ 0/devR) & 6 % w  W-  eR !5 W- @ AA H 5 u-@eH@e5@ A AH@ =  "R #!  R !  R !  #! wLw :w*GDe G  G % w7 G7 FׯF- F F,.H7 F .,H hB Jdofecsl ӕ- 6 r f e0 $hFC~ fWtE Ee0) & 6 % w  W-   e h!5 W- @ AA H 5 u-@eH@e5@ A AH@ =  D  D  D  q!   l!   h!  q!  ww wVGDeLG  FG % wj7 2G7 (Gׯ(G- G G,|H7 G .zH B Jdof ecsl ӕ- 6 r f e0 $FC~ fWtE Ee0hF ^F    8F`w8F ,F  (F FΟF F  F  F  Ew7 E E E0  EWp `e0[eӕ?fwTwP$ wf@f@ EEwvEw H@w H-pEw H@7 NEwfwBEw H7 8EwfAw$w 5Wpe$ W * W r wr wDw4f& @&HF7FFfA7x   fA & 9 &fA @e&7lwhb@ arg count /usr/bin/%s not found 7b7\7V7P7J7D7>78727,7&7 0w w&w hw ^%w Usage: passwd uid password  ȋ 07~w w cannot open password file w ttemp file busy -- try again 7 B : 4 ы  :@ :   :Wp 0`  w permission denied   w ~p ~6 z3 tw w cannot reopen temp file w w jcannot reopen password file  @ w w xw (format error on password file w Hw   w uid not valid fA7& fA @e71@L  1 @ fA7R  fA & 9 &fA @e&7w@t&@w~Ջ@@ 7tz Ef&f ЕЕ  P  Cx F    rB`E \ \  !  f f E RS  F F  f  0 f & s>e0W!9eW!ZeT!N ᇅF /etc/passwd/tmp/ptmpwww &w Uw w&w 6w , @ @  W  EA&w6AYpNo error. Floating op code error Floating divide check Integer conversion error Floating overflow Floating underflow Floating undefined Floating maintennace trap `1 & 6 % w  2 7@e`W-.@%- @%l >@@%a &@@%v @u e f d 5 Nf * 0@f h%-^? -V? Nv * D??8?m6?7?-8? ? ?ef %  d 5 * ^0@f F X@f h%V@f h%@f h%> ? Wp@7>?WpN;f h%> E7>> E7>P>7 > >6 0@f h%D>]>%""8> E7.>>&>7 8>-4> p>m(>$>H0@ >eX> > X> > N * <0>e$>;*>Wpe;A-)P>->>@e=A  =Ap=Ape=ez=P e^=\=w^=W7p=@=Z@f h%%_6 (=_.7=7$= =H&7=7=7 =&7 =7=7<7=7<7<7<      && eF&& ne  && VeF&& Fe7 j;-f; #  FwR;WE&& eFw4;WE&& e ;7H;F7H;F;eA7$; H; Wpff %Z@f h%%Q7:7: :H&7:7:  7:&7:& je7:E7:7:7:&7:& De  7:&7:& (e7t:&7~:7x:7t:&7f:& eF$:":A7>:HC7>:PH:-D:D:_8:7,9_(:7,9_:0 7979F:A9Aw979  79&& pe79&HC& \e  79&79HC& <e79&79& (e  7|9pC&7j9 B& e    7 9-9L9m9%_<9m8  8  D&7 97979EHC78e8_L  * 8 8P eP88e-8K80 787x8C7p8&8 (e 8e P5u"r8j8&   * P80 uw&  e  * e$8 (ww u-@@ww u-@@ww x@A@wnw \@0 Aq 55 5 w.w NE ww 5& e5 & eww 57755555@  @  ww  H w 67 6 ӕ0B~6ӕ.  ӕ0~ B~ 66 :ӕ.6B~ӕe ӕ- ӕ+ r e0e0S&e@7^6e(X6 @&- @A&@067@L> Be0# @є 6    BA   w 5e B@e0m5 5`  eȐ9 ȕ0 ȕ1 >w w5Dev5  p5 % w7 \57 R5ׯR5- J5 H5"@7 @5 .@ B J d o x@ fJ e c s l ӕ- C r f e0 1 /4 ҋ D~',0 f v Le0 9ev4 hl4 &  mN4 L4 ~    ~ w7 4 4 40  4Wp `e0[f3 ,3P 3 3 @f 3 @7.3 4@33-33f@)wwf@w:w wfww>www w 3w3AupNNmf ww ~ 2@@5 _ fA rBpu@@m55D@5!f& 2%5 @&   ` 3f b2%5 `@&   5!`@&& :%`@&  `5!$@@AA Nf` u Nf @`5_ @& :%@_w*w 1DCԒ ww f1DCB5ҒS wf@wwDwwf@wwJwz w|f@f&BCB  ԕ- B e0fv   vA W  ~72F @&HFf =a.outCan't find %s Bad format: %s mon.outNo mon.out No symbols: %s No time accumulated /dev/vt0Cannot open vt name %%time #call ms/call %8.8s%6.1f%6s %7.2f u>(\ EE@J!%w  0h0h  7 F"4  w +w  -s , h7 Vw  j`\T  0"   ^ w<1#1a׭]zw7F 17ABwыwToo many files. 7  77  | N  7'# E''7?w 7 x7 r j | 9   ~7 v  t h_ B 0 9 A  Z a z  6*7 $ 7    \ w VR  nw Dh  7 f hw`durxylt a@n#\\7894312fA@ ыW hW x@ 0 *Xf  0 6w 4 P7 = @`7@w  ȋЭ7 P    e7   t 0 1-` 7 E"  z 7 n7 ") d&  -T W   <w6& @& 2   !&w bj%&     v w`? - e-tn98734127j \& VSNE N  -~ ten^W$ ad bp$ br( cc. ceF ds^ fij int ix li ll ls na ne nf pa$ blF plp sk sp ss ta ti tr ul un he> hx( foL ehZ ohb efj ofr m1z m2 m3 m4 hc hy n1 n2 nn* ni: joJ arV ro\ nxb po de ig tc mk      77 w  7  v   w * 77w * 7w &  7 0  w  7$ L * " 7w  ~ 77 7 w \ ^ B 7     w 0 27 w  &     w 7x w  7 w w d X t2 J B  6  1"w    (w t* v7,w d f7w T P7 7    w "88w "..w "w x "w p "w h "w  7\w  7Nw  7@w  72  : 2 7& "   7w x7  7 w R 77 w < >7w , .7w 77   w  J h7 F w  7F &" Zw 7 & NE-UtW$     (  b%  7 T?  w X G-  w J5w "w "vw J \ v r j :#%  , ^ R 7 R7 Fdd ^ m 7 7 -  $ m  -d -  m w ~   , 7  f & & | +  - 0  p `6e07:@W -W +` ) & w J5w "w "-w J7  - >w( ^ - ( -% ?~ z Bw`wb #7 z7 7 h7 l#F&  97 R P%  &  z7  p 7   % % . e #  #7 7 7  dw` p~m7  h  fA p ! ~7L A 7 . > 7  . #    *# w<-8.*7^w|" -  vn, 2 ^ A Z a zfE?w - w  F EF 7 F7 ^7 , P0  - 7 %  ( %  ,  7 D   ^  t 7 >  fw`   v  7` e 7 V 7 T   7   H ^  r   L ,  5  -       7a    w  - -  m 7  m 7  z7   - Հ E #’E -2 &  < w> d   :    & )-> (    ׬-˕-  ˋ w w` w`  7 ŀ!#  7 ~ 7 l mj mp 7 7V 7T 7R 7P BR -\ \ V R 7 D     %  X ]       w*   & B L w v&w n&w f& m 6Bw B~~ m  & rw ~\ e Zw ~ & f  % N`  F  D $@ jN` .N` w ~&  V%   f r  ve0 e  fr  v  r  N`  x t p l e \ N` L N` #   7  2  ^ V 7 ȋ w w   . , (  ) " ' ` ae a e  i o u y&  @ S  7, H 7 7 aw l b w Hw >3w 2 77 ̇-Հ &EE a B a p   B `De  Ep 0 C a F"E8 jC1E`C`˜ E ^  CEC`ѵ 7 @w VՀ  &&  (2 E  2 0 "!S3"#`p`Аp@РP`p"! #!4!@``Pp`#s5$#D"1f1@` @P` 0P` @````p``p0#!Q "b"1P```PPp@ P@0`` @!`@PA! "Qp@`p``@F! g 3!Bp ``Phk22jWf@P`@P0@ 00 @P@`0#b&`2gY&FI00 @0 @ @@@ @`6%e`8XC  @`PP P 00p P P p P`P` )Vh`0fuP p`0```0@`P000 `@``8U)rPEVD$*``00 0`p`5"0f Pf"G>B"f()/ /// @/N@//_?OU3u&'=  //`O@//?@/0e:ou36t(OUH/,oL+/???L?>???o,O=U5/63'V /)P./0>._|-ݶm?o//3"? /?@~(wf"J?H2*s0 P0 o UͯfV/ @p o~%hlr"gjC@ `@P0@ `0 @P@`0r&bY*FH0"p @` `P P @@``&@`6%XfXC@  ``P P"`q"cr Q"0`S!Q"0P`Sp!)Vha0f6uP p`@`aR pc"b'cP `0a@ `@``HU)rPUWDD*` p`0  ˙`.`p`5"0 f`a'AAB.  (08@H/usr/lib/suftabixcmvld/dev/tty0/tmp/rtma %vE q  b7 . R7 x801234567abcd      @:Z & 6 % w j W-R@-Ke @@mȋ=@@m. !1 !. !+ ~!( z!% v!" r! n! n! `!@@me7V  L!  H! y4  7HyW-x    e@   _>  _5 W-_AWp"i5 W- AWpAmW"?  AWpW, "N- 7vAWpjpsl " "AWpq"fNWp""AWpq"f,Wp""AWpq"f Wp""AWp1"  55W-SAWp"I5 W-AWpAmCpCm"" AWpCp " "AWpq"Cps"AWpq"Cps"AWpq"Cps"  *B    5 D dAWpN"f H%N x tt  5 D N x    |f" e  D 7^t&7Tt&7Jt&7Rt& e 5 u-:AWp"0AWpq "uAWpNe" D AWpq"fAWpq"fAWpq"f5& e  wPw >5& e 5ws@  D C5wxs& e 7Vs&5 &5& e 67:s&5&5& re7$s&5&5& Xe7sws&55&5& 2e 5 uu& e  wP w >  5 uWpC& e 5 aF& e j5 5  D C5 5& e w w 4  .r! D wr f  5 N! D _@e&f %%_@eAe E   ̕?   @e@&*! D %@&7tq7nq@e 5AWp "555H&55pC&555&AWp""5&7p7p555H&555&AWp""5&7p7p555H&555&AWp""5&7dp7^p_N xw w @A1,Nf |   @A@ @A@w w ~ N Aq5N Aq55u@  5u@   w w  N 5N 55u@  L5u@  , w w  @0Aqw w v  4!  5_ @e&f %%H@e 55&7n7nAWpq "5&7zn7tnAWpuq"5&7^n7XnAWpuq"5&7Bn7 Be0# @є Rm    BA   w *me B@e0mm m`  eȐ9 ȕ0 ȕ1 >w <wlDel  l % w 7 l7 lׯl- l l"z7 l .z B J d*o$xZfdecs l ӕ- C r f e0 1 /l ҋ D~'X!\! f v Le0 9ek hk &  mk k ~    ~ w7 jk `k \k0  RkWp `e0[f@ 8k0kwkw  z@w  z-kw  z@7 jw\fwjw  z7 jwFf h xhh x  7h ߨh h7l 7 hf@w wfww`!wwf@)wwfwwf!www w "jwjAupNNmf  ww t i@@5 _n fA rBpu@@m55D@5!f& i%5 @& r  ` 3f ji%5 `@& r  5!`@&& %`@& r `5!$@@AA Nf`  u Nf  @`5_@& %@_\w w hDCԒ ww nhDCB5ҒS wf@wwl!wwfAww5Wpel!W r! W ! w!wRwBf& f@wlwh!wwf@7iF @&HF r dA! fA7 !  fA & 9 &fA @e&7w@!  $ . : D     vp|^dj/usr/adm/sh_acct***other/usr/adm/sht_acctCan't save Can't truncate %8s%-8.8s%6.0f%7s%6.2f%%%6.1f%9.2f%9.2f%7s%6.2f%%Only 1 file with -s Can't open %s %3d %.8s /usr/adm/sht_acct**junk**%.8s--777777777777z0w w&w w D & 6 % w 5 W- @5@ 5W-0W-9 AWp AmeuN w,w wDe   % Bw7 7 ׯ- | z,H 7 r .F  B Jd`ofeHcRs&l ӕ- 6 r f e0 $C~ fWtE Ee0     `w  B |Οx r B j  ^ B Vw7 H > :0  0Wp `e0[eӕ?f@f@ ww T @w T -w T @7 wJfww T 7 w4f@#w&@&HF7FfA7@   fA & 9 &fA @e&7 w@> arg count bad character w w&w w @!~2 & 6 J% w N 0 Jww N 0 r sww W- @&  7,E(E@  X 7C @ . 7B @ . 7B @ . 7B @ . 7B $@ . 7B ,@ . 7B 4@ . 7B<@ . D@ . RB  BB 4B(B 0 ww  5%  5 BW- " 2 s@C C 7 C 5A n5A  w*w B !  ww  @ 5  p 2ww @")&#     L@b@t@ wRw @@% @@% %  2@@ % e`@@8D@B@555u-u-!   wVw DB5  @ l%! *e5 W-    @P@ AWp Amu!Aup@ww u Z T@@ 5A r e0rA r 5@@ - w2w N f ` jw w N f  jww N &f x VpN jww N &f N  r jww |@N @N N N  <w<w *Nf  N N ww @D@! < <ww N N ww &< vww @>D j@ 05N     J _@ 0   J @5w$w N 0@  &  l; < &   J H;_X         rww ; 7;; :@  ::7 :7 : ::,: < :?:wHw 6: 7:7 :: 0_v : l_ t:j:_v b:X:_v P: ,7H:D:4_v 4: l% : <:_v :9_v 9 9_v 9 799 l% 9_v 9 799 l% ~9_v l9 b9_v Z9 0F9 <9 < _v  7 99@ 9993888b88Z88R  x 2 D ( : 8  j788 l   f8 @0 Z8V8 27N83J8 r  l ww  Z <ww v ,pwnw \C@  <wFw 4 @ t5 u@B5  5@_`  < @@@@ 5 _ @_ @ _@_ @WA @_ @K "5 25@ 4 5 Nf %5@5%}uN& %5W-"A = N <%5    xr 2 b b F T x x @4A 5 5u- W-t_ 5 3!W- W-TA _ W- 5ssKCww  5 @0C  |5 D_ < j  % < B5 ׬  < $ 55 W-  W- @P W-  @P W- @P= N  %@=׬@0   <N& %@ ׬T < v5 W-  W-  @0<t@p < 0@ _T  xjxxxx4bA ww  555555    <  A  <w-3_ V5 & %_0 <  $5N ( _0 $ A  < 5& %_0 A  <        @Po    <7!2-7!2EA  < T5 L5N& %׬@Ap &7@ ׬ 5& %׬@ ׬ 5& %׬_@@B @@s@ }u@ e}u B5 @ @=N <@0 @ @ApN <}s0_ 5@_u@B @B@ D5uJ@=@G 5@=r@0B 5@N <@N < (5N < F52 }@0 @.B w2 w C5/ 5D5!!  l5W- W- 3@ w w B  2 w w v @ $55 55*= -. _*u@ 55u@5_  5A1}5@pW-  Z A1u h5 `5 XA1Jr@=  f Z =@@0 f Z 5N A1N _D-_*5@5@@ Nf   Nf l @5!5 5D) L@ 4 _*C@@4_* u-_*C5@5@@5W-!@_D3_ 5!_}@0 @52Nf  5@_@_du@_d@_Nf  5@_@ W-   @0@p_d_|@ Nf l __duN <CN <I@5@@     @0@N <5 N f B @N <N < <wBw 0C." , j$ : j   x0>>JB  ww  -,* _ uu@_W-  ׬lB  B _  r  3B B  55@2 @5    @0 5!B $ r5=u A1@& Z & B u 0u@2uN <u_x@& B    5f %5 N K_x@ @5   s_x _ xdNwlw ZDC@& j )& @ #&  &  &    x ww  @@7L'@_5& Z  _5u& Z f   _ <_5u & Z @& Z  B _5uu & Z f  5@f@& Z @N <   B  @@1,  B N <. LAAH4   B N < <     xVr%C7 %@@  Z  x%  p%l% ׬B ww CB-<% ,B   J    xntffwjf@wj wlf@)wTwXf@f@ $$w$w C@w C-$w C@7 j$w fw^$w C7 T$wfwH$ R&  E D&Ew E  7 $wf##wm#Cwt#wmn#w r Cd$Yfw>#w:#CwDwHf@w"#w#$Cw"w&@&HF7t'FfA7"*C fA @e7"1@PC  1 @ fA7"VC  fA & 9 &fA @e&7z"wv"p"@xCGcannot open inputfsendstartdefinereturnfreturnsyspitsyspot $'*-"~(+= x),/Out of free space bad integer string eof on inputillegal literal stringpopno operand preceding operatorillegal juxtaposition of operandserror in functionno operand at end of expressiontoo many ('sunrecognized component in matchno space beginning statementunrecognized component in matchunrecognized component in assignmentunrecognized component in gotoname doubly definedname doubly definedillegal component in defineattempt to take an illegal valueattempt to store in a valuephase errorillegal functionillegal functionparameters do not matchattempt to transfer to non-labelattempt to make an illegal assignmentGwww (&w Uw w&w Zw P !"#$%&'()*+,-./|z & 6 % w v5!: @m-  @mP$ @m 7L pt " @m7 @m7  -,   .%   7!Y, :  2  J = `ȋ`28  rea 18 rea@ 1828 28   .%  2   2  ww  Cˋע0 ע9Wp ’`eD wf@w wfw 7A 7 fA & UfA  @e71@  1 @ wfwAF  Df@A&  6f@A @+ 9 & fA @e&7w@wZ7 xf@ww$w4w8f@ r Cd$Y7F @&HFFN0N2N4N6N8N1N3N5N7N9cannot open input xCannot create output 2 & 6 % w &@e  @E%  7@ %*@& z   1 @e@&  @E%  re  ! T 2 & %     p2 2" w6w $  @55 u-'5 w-@@@-NNNfe2"@ & % umwfww wwf@wx wj wlf@w^wZ wFwJfwFwB& w( w*f@w(w$, ww7"F @&HF`  & 6 % w  7F#7:# 7>#72# 76#7*# 7,#7 # -e@%-# @ȋ@    | 7~ y e w"W-@7"5 W-@A`"A`"p`  .`# 5@E`"5 W-@`"@ p`" @0`"`"5 W-@0`!  @ 5`# 5 h# 5 u@Ep` @E`!h# 5@E`!v5 W-@` @p`  @0` 7 L! 27H# p# 5$ @E` E5  w-@E`!@7  tw|w j @ @_ @A1" @_ @%[_N N 5=@0 N _N 5u-[@& %]P@p@e@%0 55 @5%0@e0@-AupAmeu@ @& %] @p@   %  *  x@N ww @& 5W-\8 55W-@5%0W-7@t@me5 @  u @& 5 @ @EwPf@  w w fx%@w Zx%- w lx%@7 t wfwh w Rx%7 ^ wf@w wf@)wwfw& 7A 7 "fA & UfA  @e71@,  1 @ w,f@w^wZ2 wwf@7!F @&HFfA78   fA & 9 &fA @e&7w@Z cdsv|Bad string w w&w w  pa & 6 % w b @% \  rq tq vq7 q7 qq@ @m%-7@ @m@ @m \ v X  T<7 y @%L \ < X X  5f 8%5W-f 4f 8%5W-4p :f 8%5W-z Lf 8%5W-L N N Z ZpVpRpNp@p  7*p &p" p N @%@ r p %z @ @ &r  A 1q@  _ @ @m&  7o o  6 5{N q4o&  & %5 @  78@ @-;A m,AWpB m`u@ :  A 1:AWpB m`u@E  A1AmAWpBm`u@ :  A 1:_pn N_H@  f @ q N@ 4 5  @ &r@ &r e   5u-  @%1 5 @ r@ &r e  <5u-  Jm  74m 0m&  0  7m m@  m fe  % @%_ @ &r  7l lL l fm Z % @mȋ_p5 @@-7`@mA1 NJ& %<@mA1 fe  % @ N& % Am @m% N& %k N@ r _  & `k NVk NTk Rk  7>k :kV 4k  7k k`  6 5_7 j7 5 @ @-E7 jA mAWpB m`uN J AmAWpN@m` J xjAWpB m`uN $ -PjPjHjHj Bj7 j7 4j ӕ0B~ jӕ.  ӕ0~ B~ ii :ӕ.iB~ӕe ӕ- ӕ+ r e0e0S&e@7ie(i @&- @A&@vi7@L> Be0# @є Ni    BA   w &ie B@e0mi i`  eȐ9 ȕ0 ȕ1 >w whDeh  h % w7 h7 hׯh- h h",x7 h .*xB JdBo<xrf|ec(sl ӕ- C r f e0 1 /g ҋ D~'*. f v Le0 9eg hg &  mg g ~    ~ w7 fg \g Xg0  NgWp `e0[f@ 4g,gwfw 4x@w 4x-gw 4x@7 fw<fwfw 4x7 fw&f@w wf@ wf wfww2wwfw@e78wfwHf5w 7 wTwXfwe5u w 7 ew<f@wwDwwfAw.w*5"WpeDW J W  wwwf& fww wf D& w }w~f@wwwXw\f@Af w,.w"(e w"ew"@l  %e7fF @&HFfA7  fA & 9 &fA @e&7w@7fWp3e @7E@AfW@Vw fW@Vw w VWf@@67f@f @AdVHB`R@7^&e# 7V # VVE=sMBԝ`=B.pF:|+eiD(/zC@;\)@3d@Wf&7V @W@@`RD6B^PBVwVV5@3e1@rzlB#"3h@?ØGe@lB,k$aXUarg count Unrecognizable argument: %c 1narg count /usr/lib/saltread saltread saltread saltread salt/tmp/ttmpa1/tmp/ttmpa2/tmp/ttmpa3/tmp/ttmpa4creat tmp fileopen input file/bin/sortsort-osortforkprobs/bin/uniquniquniqforkprobcreat tmp/usr/lib/w2006open w2006open tmpopen tmp create tmp/bin/sortsort-r-osortforkprob/bin/catcat/bin/prpr-3-hPossible typo's and spelling errorsprforkprobcannot %s read error write error on t.%d B"`@,Czlx 7X7R7L7F7@7:747.7(7"770 w w&w w :;<=>?@ABCDEF & 6 % fW-  P@-@e5W-W- (  e 5 @@- @ @m&  5Nf N l7 : F w:f fe$f  % @$@$_ @$5% @0$$$   K(  N$& r%$$  5$$  @Ap$7  fe$f B % @$@ $@$_N 7"% "_*  N$& r% Ff)  ff W W u=@ Ff)  @5 @ AAH@@@Ff   @ A @ Ff 2._ l" h"_l f %7  >":" 6" <  Ff @ "@me5.u@ J A @l"e5 @  @ AAH@ "N Fu@ J A @l"e5@A 1`" @  @ AAH Ff @ "@ "$ & @ "@ &J @ &H 4%A @,"@ 0 " Ffw De   % &&  e7 7 ׯ - .%7 ~  .%*B JJdofexcsVl ӕ- 6 r f e0 $C~ fWtE Ee0    & `w   Ο   x  l  d w7 R H D0  :Wp `e0[eӕ?f@w wf@f@ ww %@w %-w %@7 w@fww %7 w*f@wZwVL ww7 Ffw4w0R wwf@wwX wwfA7^   fA & 9 &fA @e&7w@ Usage: cpost [-d] file1 file2 ... -d: 0 < d < 10 read error "w w&w w > & 6 % -lww  @% eAAW- @0!@@m !r  ~wx e5 7H  @ @m&  @ @m  M @mȋ1@m #     a"clpwJ   @ @m  @@-wXw F  l l l l l RE $ 0 . '         55    5  5 5wpw ^@=wTw B  @ w8w &N@& T   ww w De    % xw7 7 ׯ-  ,"7  ." :B JZdofecsfl ӕ- 6 r f e0 $^C~ fWtE Ee02 (    `w  x Ο  x    x w7   0  Wp `e0[eӕ?f@ ~vwbw #@w #-\w #@7 :w fw.w x#7 $wfw 7A 7 fA & UfA  @e7~1@  1 @ wjf&%CB  ԕ- % e0fv   vA W  ~7RF @&HFB@$YfA7   fA & 9 &fA @e&7xwtn@ %s: cannot open %s %7s w w&w \w Rd8f TYH  & 6 % w (7 5 Nf  0:et7E N F   N \ N l% N X* N  2w6w 6@e 6@ AAmp~:w6w p69wr6w `69wb6w P6 9~9f / wD6w 26@e55 @ @m5_|W-%N _x@e5@ @m5_R @ 5- N N u@ 5N u 6; 0<; w-8!@t @mAE t  @0N@;  D; _ N _ N _ F;78 y % N _ w4w 4A r 5N A r Ne0 w4w 4 7b;  7r;  5;  ; w-l7@t,>xN;  ;  ; 5 w-07 Ne;  7e;  X6666; e4444< e66$< %4 5E`76H< %444@,O &b< e(7"7< %6J4 <  l6<  b6\6< %H6=  <6=  <= @ ~:@ ~:@ |:J=  @ |:5R=  w-5%Nh=  @ 5 Nn=  @ 5tr=  5 w-X5'Net=  @ 5 Nz=  @ 5t~=   05 ,5)4=  55=  5 4=  44=  = w1w n14= Nf f fff e  5=  `4 .5N  R-w1w 1N=  w0w 0N=  tp r  w0w 0= w0w 04@ @ A Hw0w p0H4e@-@A    w>0w ,0P1@ 7`B1>1,O -21= @w0w /5 u- @ @mH w/w /  7!F> @m Am@R @m" @m w/w |/ w= 0 77 W-@%-@%v w= 0 7u- r@ @m& 0 742 =  >  2 >  > ,O/5 5 25m@b 5@ pJ5  @tU5 @tU5 @tU5> :> .  @t,>x2L>  % f> 1N>  .>y.l.e..e..e..e. .l5 5_ @_ -.ll>  ?  ?v./r.? eZ. ?L./H. F. :. pJv8e,. D? . Uv8 N? .h?  @r?  -e-- H -- -x_ ׭Z} G׭S}\CM}@F}4-t >x4-t >x,-t0 >x%-t'>x-t">xx-t\>x @ @73 y JL-tH- D-p>x-<-<׭| 5@5!W-aW-zW-AW-Z W-_W-0W-9 ,e@ %, 0 J,w)w |) 5 Z- T-mJ-F-7 , .5W- W- W- W-  -\, .5W-/6F, .%*@ 0, .5 W-  ,W-*  , .5%/+ .5  _5 @_Z"'@ + .5@- w-J,@ p@%\ w-$,@ p_j^+ .5 _______(@y@:@_W-0;W-97@e7W-0 5* .5W-0W-9xupAmewh* .5w0+ _@:w-+@ p +**@* .5 A w*"A70 yw-*@ 0 X6A  __xe T 0N TW-@ TW- TNe Te  ##e0 T T@ A p L@ 7`#wf w T NB  @ 5E@ 5Eu- NB  e@ L@  L B  _ w-"=@ 5b}3NB  _W-_B _W-B _NB  @ B   " "B  _B  w@w .u e@ 58  L, (w w  $  z@e&LC % 5E 5Eu- u/dC e}N A1 eApEu@,O -C wbw P~ 7t p h L%w-T@ vA @W- @ H@m j @ H@mm4 Jww u5 u- @ @m  u- _*u5 w-_*5 u-%@@m @m @@m @mAAm 1"j @@m j_*  z  NfhD %5 u-2@@m @m &@@m-@zD @@m-,@@m7@@m AAm Ampj  '5 w- !D 5 W- @@m jD  D e @@ _)D wj w X  D 6w-l_(,N ^,@ p5 5 w-. 5@ L,@ 5, L%5 @ 5 Luw- @ 5, L u-uu @e 7` (5 w- !@ L@ 5, LN T@  L Tee e TN Te _+ ZD 6w-6 @  T  ,w w    b} L%@ b} 65 5 w- -@ f)@-5  f 5 52f 5 5%f 5 5NRE 0   1>1$11a1r81wR1@Nf 1 @Fw *AWp eRu@AApfe   d J ed=@A p N 8%x@@ef 5 W-(  @@W/c&fe2  =@2W/@A eʜp@=@ww AWp eRu@ @ 2@ "& f 6%@ff 6%@ &f 6%   xD3332@AAp@0  pN 5wf)5 W- N 2 N 6ww w*iDe i  i % R5wr7 i7 hׯh- h h"7 h .✃4B J@4d4o4x4f4en4c|4sL4l ӕ- C r f e0 1 /bh ҋ D~'hElE f v Le0 9e h zh p&  mg g R5~  R5  R5~ w7 g g g0  gWp `e0[eӕ?f@ ggwtgw :@w .-lgw @@7 Lgwfw@gw &7 6gwf@wv wxfwwpEwVwZf@wvEw: w<fwtwpzEwwf@wXwTEwwfD@wm:Ew.wm(wfwEww  wf@wwEw wfwEw~f@wwEwXw\f@Af w,.w"(e w"ew"@l  %e7gF @&HFB@$Y r dA! fA7E  fA & 9 &fA @e&7 w  @E x g "fE@ $$ttyЋ7f@ f ,O_d }} NULL { %v }cdilsvp8Db int nterms %d; int nnonter %d; int nstate %d; char *yysterm[] { "%v", 0 }; char *yysnter[] { "%v", "%v" }; %d/%d terminals, %d/%d nonterminals %d/%d productions, %d/%d states %d S/R, %d R/R conflicts reported %d/%d working sets used memory: states,etc. %d/%d, parser %d/%d %d/%d distinct lookahead sets %d extra closures %d action entries %d action entries saved through merging %d states %d goto entries %d entries saved by goto default times(sec): %d/60 total time: %d/60 %v: %d %v: %d conflicts: %d S/R, %d R/R fatal error: , line %d int %s[] {0,%d,-1}; memory overflowy.tab.cy.output# $$error$accept int yyval 0; int *yypv; int yylval 0; yyactr(__np__){ %size not yet implemented%size must be followed by a numberbad precedence syntax, input %d>>>>VWXYVWYUVXP  . P  P & switch(__np__){ previous rule not terminatedterminal illegal on lhs of productionmissing :semicolon preceeds action case %d: break;rule not terminated before \\ } } \= must appear inside ruleillegal \= syntaxnonterminal %v illegal after \=\{ appears within a rulesyntax error, input %d&@,@4@<@VX)XUW l P   } } too many nonterminals, limit %dtoo many terminals, limit %dinvalid escape"'0\nt # define %s %d illegal /@@@@) ^&.V^FN^6>Fillegal character"%'\rtermleftbinaryrightprecsize simpleinvalid use of '\' or '%', or bad reserved wordeof before \}yyvalyypv[%d]$EOF inside commentEOF in string or character constantaction does not terminate BB"B=>@$,@bHstate %d, pre-nonterminal %v states %d and %d have equal positions state %d %i same as %d %v accepterrorshift %dreduce %d . reduce %d . error %v -> %vtoo many lookahead setsnonterminal %v not defined! %v: %l %d too many statesputitem(%i), state %d yacc error--duplicate itemout of state space%d: %v %d, %v %d, working set overflow State %d, nolook = %d flag set! %i %l yyact %d: R/R conflict ( red'ns %d and %d ) on %v %d: S/R conflict(shift %d, red'n %d) on %vyypactyyr1yyr2off = %d, k = %d action table overflow %d no space in action tableyygoyypgo%v: gotos on %v nonterminal %v %d %d cgetc: %d not open to readcgetc: error on %dcputc: %d not opencputc: writing %dERROR copen: bad file %s+w w&w w /devcrt0.oy0.oy1.oy2.oy3.oy4.o%getc.o.ferror.o/fopen.o0,12exit.o3printf.o3ffltpr.oH5putchr.oR5close.o5creat.o5fstat.o5open.o5read.o6sbrk.o>6seek.o6times.o6write.o6exit.o6nargs.o6retrn.o27rsave.o@7ssw.o`7nhsw.or7put.o7ttyn.o8savr5$ޜ_main"_tbitset$E_nolook#d8_nstate#f8_pstate$E_apstate$H_tystate$ L_stsize#h8_memsiz#j8_mem0$,O_mem#l8_amem$j_actsiz#n8_memact#p8_nprod#r8_prdptr$6_ttyn"8_fstat"5_IEHfbak$ʜ_cclose"2_close"5_exit"6ndigit$pfloat"H5pscien"H5_putchar"R5_fout$_flush"5putc"7flush"7cerror"27_end$_brk"f6_errno$mrsave"@7putw#Efcreat"7ttyn"8QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxZ..\.]ac^cal_comm`crefacrpostbdiffcfeddfindeformfgrepgmesghniceinohupjpasswdkpfelprofmroffnsaosleeppsnoqsplitrteestrttypouupostvwcwyaccrpwd# /* C compiler Copyright 1972 Bell Telephone Laboratories, Inc. */ #include "c0h.c" int isn 1; int peeksym -1; int line 1; int debug 0; int dimp 0; struct kwtab { char *kwname; int kwval; } kwtab[] { "int", INT, "char", CHAR, "float", FLOAT, "double", DOUBLE, "struct", STRUCT, "auto", AUTO, "extern", EXTERN, "static", STATIC, "register", REG, "goto", GOTO, "return", RETURN, "if", IF, "while", WHILE, "else", ELSE, "switch", SWITCH, "case", CASE, "break", BREAK, "continue", CONTIN, "do", DO, "default", DEFAULT, "for", FOR, "sizeof", SIZEOF, 0, 0, }; main(argc, argv) char *argv[]; { extern fin; int treespace[ossiz]; register char *sp, *np; register struct kwtab *ip; if(argc<4) { error("Arg count"); exit(1); } if((fin=open(argv[1],0))<0) { error("Can't find %s", argv[1]); exit(1); } if (fcreat(argv[2], ascbuf)<0 || fcreat(argv[3], binbuf)<0) { error("Can't create temp"); exit(1); } if (argc>4) proflg++; xdflg++; for (ip=kwtab; (np = ip->kwname); ip++) { for (sp = symbuf; sphclass = KEYWC; np->htype = ip->kwval; } xdflg = 0; treebase = treespace+10; putw(treebase, binbuf); while(!eof) { extdef(); blkend(); } fflush(ascbuf); fflush(binbuf); exit(nerror!=0); } struct hshtab *lookup() { int ihash; register struct hshtab *rp; register char *sp, *np; ihash = 0; for (sp=symbuf; spname)) { for (sp=symbuf; sp= &hshtab[hshsiz]) rp = hshtab; } if(++hshused >= hshsiz) { error("Symbol table overflow"); exit(1); } rp->hclass = 0; rp->htype = 0; rp->hoffset = 0; rp->dimp = 0; sp = symbuf; if (xdflg) *sp =| 0200; for (np=rp->name; sp=0) { c = peeksym; peeksym = -1; if (c==NAME) mosflg = 0; return(c); } if (peekc) { c = peekc; peekc = 0; } else if (eof) return(EOF); else c = getchar(); loop: switch(ctab[c]) { case INSERT: /* ignore newlines */ inhdr = 1; c = getchar(); goto loop; case NEWLN: if (!inhdr) line++; inhdr = 0; case SPACE: c = getchar(); goto loop; case EOF: eof++; return(0); case PLUS: return(subseq(c,PLUS,INCBEF)); case MINUS: return(subseq(c,subseq('>',MINUS,ARROW),DECBEF)); case ASSIGN: if (subseq(' ',0,1)) return(ASSIGN); c = symbol(); if (c>=PLUS && c<=EXOR) { if (peekc==0) peekc = getchar(); if (ctab[peekc] != SPACE && (c==MINUS || c==AND || c==TIMES)) { error("Warning: assignment understood"); nerror--; } return(c+30); } if (c==ASSIGN) return(EQUAL); peeksym = c; return(ASSIGN); case LESS: if (subseq(c,0,1)) return(LSHIFT); return(subseq('=',LESS,LESSEQ)); case GREAT: if (subseq(c,0,1)) return(RSHIFT); return(subseq('=',GREAT,GREATEQ)); case EXCLA: return(subseq('=',EXCLA,NEQUAL)); case DIVIDE: if (subseq('*',1,0)) return(DIVIDE); com: c = getchar(); com1: switch(c) { case '\0': eof++; error("Nonterminated comment"); return(0); case '\n': if (!inhdr) line++; inhdr = 0; goto com; case 001: /* SOH, insert marker */ inhdr++; default: goto com; case '*': c = getchar(); if (c!='/') goto com1; } c = getchar(); goto loop; case PERIOD: case DIGIT: peekc = c; if ((c=getnum(c=='0'?8:10)) == FCON) cval = isn++; return(c); case DQUOTE: return(getstr()); case SQUOTE: return(getcc()); case LETTER: sp = symbuf; if (mosflg) { *sp++ = '.'; mosflg = 0; } while(ctab[c]==LETTER || ctab[c]==DIGIT) { if (sphclass==KEYWC) { if (csym->htype==SIZEOF) return(SIZEOF); cval = csym->htype; return(KEYW); } return(NAME); case AND: return(subseq('&', AND, LOGAND)); case OR: return(subseq('|', OR, LOGOR)); case UNKN: error("Unknown character"); c = getchar(); goto loop; } return(ctab[c]); } subseq(c,a,b) { if (!peekc) peekc = getchar(); if (peekc != c) return(a); peekc = 0; return(b); } getstr() { register int c; register char *t, *d; nchstr = 1; t = ".text"; d = ".data"; printf("%s\nL%d:.byte ", (strflg?t:d), cval=isn++); while((c=mapch('"')) >= 0) { printf("0%o,", c); nchstr++; } printf("0\n.even\n%s\n", (strflg?d:t)); return(STRING); } getcc() { register int c, cc; register char *ccp; cval = 0; ccp = &cval; cc = 0; while((c=mapch('\'')) >= 0) if(cc++ < ncpw) *ccp++ = c; if(cc>ncpw) error("Long character constant"); return(CON); } mapch(ac) { register int a, c, n; static mpeek; c = ac; if (mpeek) { a = mpeek; mpeek = 0; } else a = getchar(); loop: if (a==c) return(-1); switch(a) { case '\n': case '\0': error("Nonterminated string"); peekc = a; return(-1); case '\\': switch (a=getchar()) { case 't': return('\t'); case 'n': return('\n'); case 'b': return('\b'); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': n = 0; while (n<0100 && '0'<=a && a<='7') { n =<< 3; n =+ a-'0'; a = getchar(); } mpeek = a; return(n); case 'r': return('\r'); case '\n': if (!inhdr) line++; inhdr = 0; a = getchar(); goto loop; } } return(a); } tree() { #define SEOF 200 #define SSIZE 20 int *op, opst[SSIZE], *pp, prst[SSIZE]; register int andflg, o; register struct hshtab *cs; int p, ps, os, *np; osleft = ossiz; space = treebase; op = opst; pp = prst; cp = cmst; *op = SEOF; *pp = 06; andflg = 0; advanc: switch (o=symbol()) { case NAME: cs = csym; if (cs->hclass==0 && cs->htype==0) if(nextchar()=='(') { /* set function */ cs->hclass = EXTERN; cs->htype = FUNC; } else if (initflg) cs->hclass = EXTERN; else { /* set label */ cs->htype = ARRAY; if (cs->hoffset==0) cs->hoffset = isn++; } *cp++ = block(2,NAME,cs->htype,cs->hdimp, cs->hclass,0); if (cs->hclass==EXTERN) { np = cs->name; for (o=0; o<4; o++) { pblock(*np); if (((*np++)&~0177) == 0) break; } } else pblock(cs->hoffset); goto tand; case FCON: if (!initflg) printf(".data\nL%d:0%o;0%o;0%o;0%o\n.text\n",cval,fcval); case CON: case SFCON: *cp++ = block(1,o,(o==CON?INT:DOUBLE),0,cval); goto tand; /* fake a static char array */ case STRING: *cp++ = block(3, NAME, ARRAY+CHAR,0,STATIC,0,cval); tand: if(cp>=cmst+cmsiz) { error("Expression overflow"); exit(1); } if (andflg) goto syntax; andflg = 1; goto advanc; case INCBEF: case DECBEF: if (andflg) o =+ 2; goto oponst; case COMPL: case EXCLA: case SIZEOF: if (andflg) goto syntax; goto oponst; case MINUS: if (!andflg) { if ((peeksym=symbol())==FCON) { fcval = - fcval; goto advanc; } if (peeksym==SFCON) { fcval = - fcval; cval =^ 0100000; goto advanc; } o = NEG; } andflg = 0; goto oponst; case AND: case TIMES: if (andflg) andflg = 0; else if(o==AND) o = AMPER; else o = STAR; goto oponst; case LPARN: if (andflg) { o = symbol(); if (o==RPARN) o = MCALL; else { peeksym = o; o = CALL; andflg = 0; } } goto oponst; case RBRACK: case RPARN: if (!andflg) goto syntax; goto oponst; case DOT: case ARROW: mosflg++; break; } /* binaries */ if (!andflg) goto syntax; andflg = 0; oponst: p = (opdope[o]>>9) & 077; if ((o==COMMA || o==COLON) && initflg) p = 05; opon1: ps = *pp; if (p>ps || p==ps && (opdope[o]&RASSOC)!=0) { switch (o) { case INCAFT: case DECAFT: p = 37; break; case LPARN: case LBRACK: case CALL: p = 04; } if(op>=opst+SSIZE) { error("expression overflow"); exit(1); } *++op = o; *++pp = p; goto advanc; } --pp; switch (os = *op--) { case SEOF: peeksym = o; build(0); /* flush conversions */ return(*--cp); case CALL: if (o!=RPARN) goto syntax; build(os); goto advanc; case MCALL: *cp++ = block(0,0,0,0); /* 0 arg call */ os = CALL; goto fbuild; case LPARN: if (o!=RPARN) goto syntax; goto advanc; case LBRACK: if (o!=RBRACK) goto syntax; build(LBRACK); goto advanc; } fbuild: build(os); goto opon1; syntax: error("Expression syntax"); errflush(o); return(0); } declare(askw, tkw, offset, elsize) { register int o; register int skw; skw = askw; do { offset =+ decl1(skw, tkw, offset, elsize); if (xdflg && skw!=MOS) return; } while ((o=symbol()) == COMMA); if (o==SEMI || o==RPARN && skw==ARG1) return(offset); decsyn(o); } decl1(askw, tkw, offset, elsize) { int t1, chkoff; register int type, skw; register struct hshtab *dsym; skw = askw; chkoff = 0; mosflg = skw==MOS; if ((peeksym=symbol())==SEMI || peeksym==RPARN) return(0); if ((t1=getype()) < 0) goto syntax; type = 0; do type = type<<2 | (t1 & 030); while (((t1=>>2) & 030)!=0); type =| tkw; dsym = defsym; if (!(dsym->hclass==0 || (skw==ARG && dsym->hclass==ARG1) || (skw==EXTERN && dsym->hclass==EXTERN && dsym->htype==type))) if (skw==MOS && dsym->hclass==MOS && dsym->htype==type) chkoff = 1; else { redec(); goto syntax; } dsym->htype = type; if (skw) dsym->hclass = skw; if (skw==ARG1) { if (paraml==0) paraml = dsym; else parame->hoffset = dsym; parame = dsym; } if (elsize && ((type&07)==RSTRUCT || (type&07)==STRUCT)) { dsym->lenp = dimp; chkdim(); dimtab[dimp++] = elsize; } elsize = 0; if (skw==MOS) { elsize = length(dsym); if ((offset&1)!=0 && elsize!=1) { offset++; elsize++; } if (chkoff && dsym->hoffset != offset) redec(); dsym->hoffset = offset; } if ((dsym->htype&030)==FUNC) { if (dsym->hclass!=EXTERN && dsym->hclass!=AUTO) error("Bad function"); dsym->hclass = EXTERN; } if (dsym->hclass==AUTO) { autolen =+ rlength(dsym); dsym->hoffset = -autolen; } else if (dsym->hclass==STATIC) { dsym->hoffset = isn; printf(".bss\nL%d:.=.+%d.\n.text\n", isn++, rlength(dsym)); } else if (dsym->hclass==REG) { if ((type&07)>CHAR && (type&030)==0 || (type&030)>PTR || regvar<3) error("Bad register %o", type); dsym->hoffset = --regvar; } syntax: return(elsize); } getype() { register int o, type; register struct hshtab *ds; switch(o=symbol()) { case TIMES: return(getype()<<2 | PTR); case LPARN: type = getype(); if ((o=symbol()) != RPARN) goto syntax; goto getf; case NAME: defsym = ds = csym; type = 0; ds->ssp = dimp; getf: switch(o=symbol()) { case LPARN: if (xdflg) { xdflg = 0; ds = defsym; declare(ARG1, 0, 0, 0); defsym = ds; xdflg++; } else if ((o=symbol()) != RPARN) goto syntax; type = type<<2 | FUNC; goto getf; case LBRACK: if ((o=symbol()) != RBRACK) { peeksym = o; cval = conexp(); for (o=ds->ssp&0377; oname); } {|}~intcharfloatdoublestructautoexternstaticregistergotoreturnifwhileelseswitchcasebreakcontinuedodefaultforsizeofw hW-Z   @& 7: @d  @& @& r  W- !Ԕ  de7 @e&7  | x  b  wPw L5  E5`A rWteDeȋ 6E e%  %  4 4 4  Հe Ҕww  z t !7 t_r jd7 `  Z _rL H>y. 2 $ 7 ( " _r(& v%_r2)> je&& v%_r&  v% P_r .!(%!1"  7%~!)!/!* ze_r!P<_r7T P_r& & v% ._r>?= v%_r& & v% -_r@A= v%_r="= v%_r * v% +_r  _r  7 7l  y  !/_7r!0 %F B 7J\ Y TV 2ӕ.7 ({|   7 7/,'75/& v%60| v% _ww   z7v-r@7 d@w\w XP\b8 4 7< 6h %" X v  | ww 7  ' X %  ww C _ 7 _7  y 7j? `Zy  3 0- @!0!7 te` 7    7 !ww ^@e5@e5  -_ xr |      " j j .   %(    2  e e "e5 IN @e5=  6 7z&t le d& &  e@& &  e  e -P0  _ _X ReO M_ H B7%77_X- 777x_X%& # /#$   eZd  _ R _   tE5   $uu- u-4 5.D7> y %@Ae \  e@e@H_X@5p7 y j hd5 *N _X & & & e:e4 dN   _X  _X  ww CN ff l e5`   *% !! @ ww C5  7t 7b%  _t 5_p  tAE@P@t55D]  "  ",  ",2    _p  E%E%    p 5  5 5   , rE% "" "  7` 4"   %""E%5 E%- 2@ ww  7J y tU_  % _B7< 2  f x , 7   & &   e  V%ItU <%)7 7E7!  fe~p^   % n j tU7J wBw > N w(w $e w   &.6@ F N R X^flr|Arg countCan't find %sCan't create tempSymbol table overflowWarning: assignment understoodNonterminated comment *<tNz\Unknown character .   nNnn n :b.text.data%s L%d:.byte 0%o,0 .even %s Long character constantNonterminated string& $& \.data L%d:0%o;0%o;0%o;0%o .text Expression overflow !dZ Z   Z  expression overflowde Expression syntaxBad function.bss L%d:.=.+%d. .text Bad register %o* Declaration syntax%.8s redeclared88iiI )88X88XXII88)Y999Iy ( yyI9 99( Iyy y 9 8YY((8 89()9 999)9X X 9X ))9  yy )Iiiyi(yyhhiY ((yyyYiyy(yy())Y))YxX )Y)())_cvtab _opdope _ctab _symbuf _hshused _hshtab _space _cp _cmst P_isn#_swtab _swp _contlab _brklab _retlab _deflab _nauto _autolen _peeksym#_peekc _eof _line#_treebas _debug#_defsym _funcsym _xdflg _proflg _csym _cval _fcval _nchstr _nerror _paraml _parame _strflg _osleft _mosflg _initflg _inhdr _dimtab _binbuf _ascbuf _dimp#_regvar _kwtab#L1L2L3 L4L5L6 L7&L8.L96L10@L11FL12NL13RL14XL15^L16fL17lL18rL19|L20L21L22_main"L25ZL27dL29rrsave L24_error _exit _open _fin L26_fcreat L10000L28L30*L312L32^L34:L35H_lookup"L33X_putw L37zL38_extdef _blkend _fflush L10001L10002L23rretrn L49L40L41L42L43L44L20000fL46L488L50TL51\L52f_symbol"lL74L88L10005L10006L87<L91tL89NL93zL83\L111L10012L10013L10014L10015L10016 L10017.L112nL66L67L109NL69L94L95L68L78L98L63L80 L97L20004L81 L108:L76L62L99L110bL54L55L53rL56L57L58L20006L20008_getchar hsw L64_subseq"vL70:L71L72ZL73L10003zL75L77L79L82\L90XL84bL10007lL10008L10009_getnum L96_getstr"_getcc"L100L101L10010L102L103L104L105L1064L107$L114L115L113L117\L118bL119hL122vL123|L10018L10019_printf L120_mapch"XL121L10020L10021L129L125(L126BL128PL140L10023L10024L10025L10026L10027L136L147L150L153L157L158L148L151L154L149L152L146L145L144L10029L10030L139L138L141L161L131L132L133L135xL10031L130L155L156L159_tree"L181L1860L10038DL10039NL222Z L221Z L219 L220 L223Z L224 L226\L10042pL10043zL234 L233 L230 L231 L229 L235 L236L163XL213 L209 L205 L210 L166L182L184L179|L183L194 L188 L189 L193 L192 L211 L195" L200j L199j L212 L167_nextcha L168L169L170L171L172_block L173rL174PL178_pblock L176nL180L10032L10033L20013L185 L187 L191 L20014 L197B L198d L201p L20015 L203| L207 L20016 L10035 L214 L215 L10036 L216b L10040 L217 L225< L10044 _build L162 _errflus _declare" L240 _decl1"l L10045> L237h L238> L239J L10046\ L241b _decsyn"L261L265L269L10047 L10048 L10049 L243 L242t _getype"x L244p L247 L245 L246 L248 L10050 L10051 L2498 L251& L252L L253@ L254H _redec"L255 L10052j _chkdim L256 _length L257 L258 L259 L260 L262 _rlength L20017l L264, L266p L267p L10054D L10053X L268d L10057L10058L274 L277 L273 L290L10059 L270L276 L275L289L283,L280 L281L282L284_conexp L285NL286lL287hL288L292L291L294L293fltused # /* C compiler Copyright 1972 Bell Telephone Laboratories, Inc. */ #include "c0h.c" build(op) { register int t1; int t2, t3, t; struct tnode *p3, *disarray(); register struct tnode *p1, *p2; int d, dope, leftc, cvn, pcvn; if (op==LBRACK) { build(PLUS); op = STAR; } dope = opdope[op]; if ((dope&BINARY)!=0) { p2 = chkfun(disarray(*--cp)); t2 = p2->type; } p1 = *--cp; if (op==SIZEOF) { t1 = length(p1); p1->op = CON; p1->type = INT; p1->dimp = 0; p1->value = t1; *cp++ = p1; return; } if (op!=AMPER) { p1 = disarray(p1); if (op!=CALL) p1 = chkfun(p1); } t1 = p1->type; pcvn = 0; switch (op) { /* end of expression */ case 0: *cp++ = p1; return; /* no-conversion operators */ case COMMA: case LOGAND: case LOGOR: *cp++ = block(2, op, 0, 0, p1, p2); return; case QUEST: if (p2->op!=COLON) error("Illegal conditional"); t = t2; goto nocv; case CALL: if ((t1&030) != FUNC) error("Call of non-function"); *cp++ = block(2,CALL,decref(t1),p1->dimp,p1,p2); return; case STAR: if (p1->op==AMPER || p1->op==AMPERA) { *cp++ = p1->tr1; return; } if ((t1&030) == FUNC) error("Illegal indirection"); *cp++ = block(1,STAR,decref(t1),p1->dimp,p1); return; case AMPER: if (p1->op==STAR) { p1->tr1->dimp = p1->dimp; p1->tr1->type = incref(t1); *cp++ = p1->tr1; return; } if (p1->op==NAME) { if (p1->class==AUTO) op = AMPERA; *cp++ = block(1,op,incref(t1),p1->dimp,p1); return; } error("Illegal lvalue"); break; case INCBEF: case DECBEF: case INCAFT: case DECAFT: chklval(p1); *cp++ = block(2,op,t1,p1->dimp,p1,plength(p1)); return; case ARROW: *cp++ = p1; chkw(p1); p1->type = PTR+STRUCT; build(STAR); p1 = *--cp; case DOT: if (p2->op!=NAME || p2->class!=MOS) error("Illegal structure ref"); *cp++ = p1; t = t2; if ((t&030) == ARRAY) { t = decref(t); p2->ssp++; } setype(p1, t, p2->dimp); build(AMPER); *cp++ = block(1,CON,7,0,p2->nloc); build(PLUS); if ((t2&030) != ARRAY) build(STAR); return; } if ((dope&LVALUE)!=0) chklval(p1); if ((dope&LWORD)!=0) chkw(p1); if ((dope&RWORD)!=0) chkw(p2); if ((dope&BINARY)==0) { if (!fold(op, p1, 0)) *cp++ = block(1,op,t1,p1->dimp,p1); return; } if (t2==7) { t = t1; p2->type = 0; /* no int cv for struct */ t2 = 0; goto nocv; } cvn = cvtab[11*lintyp(t1)+lintyp(t2)]; leftc = cvn&0100; t = leftc? t2:t1; if (op==ASSIGN && t1!=STRUCT && t2!=STRUCT) { t = t1; if (leftc || cvn!=3) /* int -> float */ goto nocv; } if (cvn =& 077) { if (op==COLON && t1>=PTR && t1==t2) goto nocv; if (cvn==077) { if ((dope&RELAT)==0 || t1float */ leftc = 0; cvn = 4; t = t1; goto rcvt; } else goto illcv; } p1 = convert(p1, t, cvn, plength(p2)); } else { rcvt: p2 = convert(p2, t, cvn, plength(p1)); } nocv:; } if ((dope&RELAT)!=0) { if (op>NEQUAL && (t1>=PTR || t2>=PTR)) op =+ 4; /* ptr relation */ t = 0; /* relational is integer */ } if (fold(op, p1, p2)) return; *cp++ = block(2,op,t,(p1->dimp==0? p2:p1)->dimp,p1,p2); if (pcvn) { p1 = *--cp; *cp++ = convert(p1, 0, pcvn, plength(p1->tr1)); } } convert(p, t, cvn, len) struct tnode *p; { register int n; switch(cvn) { /* int -> ptr */ case 1: n = TIMES; goto md; /* ptr -> int */ case 2: n = DIVIDE; md: return(block(2, n, t, 0, p, block(1, CON, 0, 0, len))); /* int -> double */ case 3: n = ITOF; goto di; /* double -> int */ case 4: n = FTOI; di: return(block(1, n, t, 0, p)); } error("C error-- convert"); return(p); } setype(ap, at, adimptr) struct tnode *ap; { register struct tnode *p; register t, dimptr; p = ap; t = at; dimptr = adimptr; p->type = t; if (dimptr != -1) p->dimp = dimptr; switch(p->op) { case AMPERA: case AMPER: setype(p->tr1, decref(t), dimptr); return; case STAR: setype(p->tr1, incref(t), dimptr); return; case PLUS: case MINUS: setype(p->tr1, t, dimptr); } } chkfun(ap) struct tnode *ap; { register struct tnode *p; register int t; p = ap; if (((t = p->type)&030)==FUNC) return(block(1,AMPER,incref(t),p->dimp,p)); return(p); } struct tnode *disarray(ap) struct tnode *ap; { register int t; register struct tnode *p; p = ap; /* check array & not MOS */ if (((t = p->type)&030)!=ARRAY || p->op==NAME&&p->class==MOS) return(p); p->ssp++; *cp++ = p; setype(p, decref(t), -1); build(AMPER); return(*--cp); } chkw(p) struct tnode *p; { register int t; if ((t=p->type)>CHAR && top!=NAME && p->op!=STAR) error("Lvalue required"); } fold(op, ap1, ap2) struct tnode *ap1, *ap2; { register struct tnode *p1; register int v1, v2; p1 = ap1; if (p1->op!=CON || (ap2!=0 && ap2->op!=CON)) return(0); v1 = p1->value; v2 = ap2->value; switch (op) { case PLUS: v1 =+ v2; break; case MINUS: v1 =- v2; break; case TIMES: v1 =* v2; break; case DIVIDE: v1 =/ v2; break; case MOD: v1 =% v2; break; case AND: v1 =& v2; break; case OR: v1 =| v2; break; case EXOR: v1 =^ v2; break; case NEG: v1 = - v1; break; case COMPL: v1 = ~ v1; break; case LSHIFT: v1 =<< v2; break; case RSHIFT: v1 =>> v2; break; default: return(0); } p1->value = v1; *cp++ = p1; return(1); } conexp() { register struct tnode *t; initflg++; if (t = tree()) if (t->op != CON) error("Constant required"); initflg--; return(t->value); } r 2 w W-( $@ 55  vW- 3 3 3e|_dW-#  W-d v5 @F y$:e4_d& & f e _X"r u_E% & &d e _X"#" e_dE% & &$ e_X"$ 1HeB_d",&  &f e_X 5 T5 "5  "5_n f v% _d&f e_X T &f e _Xde^ " $ B>", "eu@E%N 5f %#  &  ee ( @E%_d$ _dW-52 5 _N J&&  Wp eAu@E5 @5W-P!W- 5 _W-YEUW-!5!KW-?5!W-<( 7W-5 55 *W-)u5  5=W-5 5 ff he5W-= !W-e5 f v% E  ff he&ff e e   f&  hee ww @ 8 x*+N & &  ef& f& e 34N& f& e< @ww DCB  % x.HrrrrrHVrrrdd &  && %ww DE%& d &# ewHw DCE%",e&  & %# ww @%!N ww D!E%h E!Ee wrw n h ĝ\VRh Nff f fff e   7w w @ee@   &ww eH n  ww D##$ ww D#] W/U@@% H x $ @ 4 ,    `&e -BpC r rC@ @Px @ t t ww  #  wIllegal conditionalCall of non-functionIllegal indirectionIllegal lvalueIllegal structure ref      n@nnnIllegal conversionC error-- convertInteger operand required%d: Expression overflowLvalue requiredConstant requiredyyyyyy9yyyyyyyyyyyyyyyyyyyyyyyy  Y  iiiI yyi i_cvtab _opdope _ctab _symbuf _hshused _hshtab _space _cp _cmst P_isn _swtab _swp _contlab _brklab _retlab _deflab _nauto _autolen _peeksym _peekc _eof _line _treebas _debug _defsym _funcsym _xdflg _proflg _csym _cval _fcval _nchstr _nerror _paraml _parame _strflg _osleft _mosflg _initflg _inhdr _dimtab _binbuf _ascbuf _dimp _regvar _build"L15r L19 L23 L28 L36 L10003 L10004 L10005 L10006 L10007 L10008 L39L9L31nL20@L17L10L32nL11L29nL33L12L13L30nL24L34L51( rsave L2L3N_disarra"_chkfun"vL4_length L1dL5L6hsw _block"L20002XL14_error"L16L18_decref L20005XL10000LL21^L22rL20008XL25_incref L26L27L20011XL40_chklval"TL41"_chkw""L420L43n_fold"vL20014X_plength L20017XL10001L35L37 _setype"L45_lintyp"JL10009L10010L46L47L10011 L482L10012(L50(L52`L53LL54L55_convert"hL59L60L61L10013L10014L10015L62drretrn L73< L72L66L68L69L71L67L63L70L75L83rL78HL79HL80VL81dL82dL20020hL20023hL85L84L10018L87L86L90N L88FL92^L91L93pL94L96h _fflush _printf _putchar L95L98 L99 _pblock"&L102n L101P_exit L100PL105 L104rL103rL20024@ L107L122@ L118 L119$ L110L111L112L113L114L1214 L120, L115 L116 L117 L108L106B _conexp"F L126 _tree L124f L125f # /* C compiler Copyright 1972 Bell Telephone Laboratories, Inc. */ #include "c0h.c" extdef() { register o, width; int type, elsize, nel; char *cs; register struct hshtab *ds; if(((o=symbol())==EOF) || o==SEMI) return; type = 0; xdflg++; xxx: if (o==KEYW) { if (cval==EXTERN) { o = symbol(); goto xxx; } if ((type=cval)>STRUCT) goto syntax; /* not type */ elsize = 0; if (type==STRUCT) { elsize = strdec(&type, 0); if ((peeksym=symbol())!=KEYW) blkhed(); } } else { if (o!=NAME) goto syntax; peeksym = o; } do { defsym = 0; strflg = 1; decl1(EXTERN, type&07, 0, elsize); if ((ds=defsym)==0) return; cs = ds->name; funcsym = ds; *cs =| 0200; /* non-deletable */ printf(".globl _%.8s\n", cs); xdflg = 0; type = ds->type; if ((type&030)==FUNC && ((peeksym=symbol())==LBRACE || peeksym==KEYW)) { cfunc(cs); return; } nel = 1; while ((ds->type&030)==ARRAY) { nel = dimtab[ds->ssp&0377]; ds->type = decref(ds->type); } width = length(ds); if (ds->type==STRUCT) { nel =* width/2; width = 2; } ds->type = type; cinit(cs, type, nel, width); } while ((o=symbol())==COMMA); if (o==SEMI) return; syntax: error("External definition syntax"); errflush(o); statement(0); } cfunc(cs) char *cs; { register savdimp; strflg = 0; savdimp = dimp; printf(".text\n_%.8s:\n", cs); declist(ARG); regvar = 5; retlab = isn++; if ((peeksym = symbol()) != LBRACE) error("Compound statement required"); statement(1); printf("L%d:jmp rretrn\n", retlab); dimp = savdimp; } cinit(cs, type, nel, awidth) char *cs; { register o, ninit, width; width = awidth; if ((peeksym=symbol())==COMMA || peeksym==SEMI) { printf(".comm _%.8s,0%o\n", cs, (nel*width+1)&~01); return; } ninit = 0; printf(".data\n_%.8s=.\n", cs); if ((o=symbol())==LBRACE) { do ninit = cinit1(cs, type, width, ninit); while ((o=symbol())==COMMA); if (o!=RBRACE) peeksym = o; } else { peeksym = o; ninit = cinit1(cs, type, width, 0); } if (ninit1 && (type&030)!=ARRAY && (type&07)!=STRUCT) error("Too many initializers"); if (((nel&width)&01) != 0) printf(".even\n"); } cinit1(cs, type, width, ninit) char *cs; { float sf; register struct tnode *s; if ((peeksym=symbol())==STRING && type==ARRAY+CHAR) { peeksym = -1; if (ninit) bxdec(); printf(".text\n_%.8s=L%d\n", cs, cval); return((nchstr+1) & ~01); } if (peeksym==RBRACE) return(ninit); initflg++; s = tree(); initflg = 0; switch(width) { case 1: printf(".byte "); if (s->op != CON) bxdec(); case 2: if (s->op==CON) { printf("%d.\n", s->value); break; } rcexpr(block(1,INIT,0,0,s), regtab); break; case 4: sf = fcval; printf("0%o;0%o\n", sf); goto flt; case 8: printf("0%o;0%o;0%o;0%o\n", fcval); flt: if (s->op==FCON || s->op==SFCON) break; default: bxdec(); } return(++ninit); } bxdec() { error("Inconsistent external initialization"); } statement(d) { register o, o1, o2; int o3, o4; struct tnode *np; stmt: switch(o=symbol()) { case EOF: error("Unexpected EOF"); case SEMI: case RBRACE: return; case LBRACE: if(d) { if (proflg) { o = "jsr\tr5,mrsave;0f;%o\n.bss;0:.=.+2\n.text\n"; } else o = "jsr r5,rsave; %o\n"; printf(o, blkhed()-4); } while (!eof) { if ((o=symbol())==RBRACE) return; peeksym = o; statement(0); } error("Missing '}'"); return; case KEYW: switch(cval) { case GOTO: if (o1 = simplegoto()) branch(o1); else dogoto(); goto semi; case RETURN: doret(); goto semi; case IF: np = pexpr(); o2 = 0; if ((o1=symbol())==KEYW) switch (cval) { case GOTO: if (o2=simplegoto()) goto simpif; cbranch(np, o2=isn++, 0); dogoto(); label(o2); goto hardif; case RETURN: if (nextchar()==';') { o2 = retlab; goto simpif; } cbranch(np, o1=isn++, 0); doret(); label(o1); o2++; goto hardif; case BREAK: o2 = brklab; goto simpif; case CONTIN: o2 = contlab; simpif: chconbrk(o2); cbranch(np, o2, 1); hardif: if ((o=symbol())!=SEMI) goto syntax; if ((o1=symbol())==KEYW && cval==ELSE) goto stmt; peeksym = o1; return; } peeksym = o1; cbranch(np, o1=isn++, 0); statement(0); if ((o=symbol())==KEYW && cval==ELSE) { o2 = isn++; branch(o2); label(o1); statement(0); label(o2); return; } peeksym = o; label(o1); return; case WHILE: o1 = contlab; o2 = brklab; label(contlab = isn++); cbranch(pexpr(), brklab=isn++, 0); statement(0); branch(contlab); label(brklab); contlab = o1; brklab = o2; return; case BREAK: chconbrk(brklab); branch(brklab); goto semi; case CONTIN: chconbrk(contlab); branch(contlab); goto semi; case DO: o1 = contlab; o2 = brklab; contlab = isn++; brklab = isn++; label(o3 = isn++); statement(0); label(contlab); contlab = o1; if ((o=symbol())==KEYW && cval==WHILE) { cbranch(tree(), o3, 1); label(brklab); brklab = o2; goto semi; } goto syntax; case CASE: o1 = conexp(); if ((o=symbol())!=COLON) goto syntax; if (swp==0) { error("Case not in switch"); goto stmt; } if(swp>=swtab+swsiz) { error("Switch table overflow"); } else { swp->swlab = isn; (swp++)->swval = o1; label(isn++); } goto stmt; case SWITCH: o1 = brklab; brklab = isn++; np = pexpr(); chkw(np); rcexpr(block(1,RFORCE,0,0,np), regtab); pswitch(); brklab = o1; return; case DEFAULT: if (swp==0) error("Default not in switch"); if ((o=symbol())!=COLON) goto syntax; label(deflab = isn++); goto stmt; case FOR: o1 = contlab; o2 = brklab; contlab = isn++; brklab = isn++; if (o=forstmt()) goto syntax; label(brklab); contlab = o1; brklab = o2; return; } error("Unknown keyword"); goto syntax; case NAME: if (nextchar()==':') { peekc = 0; o1 = csym; if (o1->hclass>0) { error("Redefinition"); goto stmt; } o1->hclass = STATIC; o1->htype = ARRAY; if (o1->hoffset==0) o1->hoffset = isn++; label(o1->hoffset); if ((peeksym=symbol())==RBRACE) return; goto stmt; } } peeksym = o; rcexpr(tree(), efftab); semi: if ((o=symbol())==SEMI) return; syntax: error("Statement syntax"); errflush(o); goto stmt; } #define forsps 150 forstmt() { int l, savxpr[forsps]; int *st, *ss; register int *sp1, *sp2, o; if ((o=symbol()) != LPARN) return(o); if ((o=symbol()) != SEMI) { /* init part */ peeksym = o; rcexpr(tree(), efftab); if ((o=symbol()) != SEMI) return(o); } label(contlab); if ((o=symbol()) != SEMI) { /* test part */ peeksym = o; rcexpr(block(1,CBRANCH,tree(),brklab,0), cctab); if ((o=symbol()) != SEMI) return(o); } if ((peeksym=symbol()) == RPARN) { /* incr part */ peeksym = -1; statement(0); branch(contlab); return(0); } l = contlab; contlab = isn++; st = tree(); if ((o=symbol()) != RPARN) return(o); ss = space; if (space-treebase > forsps) { error("Expression too large"); space = &treebase[forsps]; } sp2 = savxpr; for (sp1=treebase; sp1hoffset = 0; cs = paraml; paraml = paraml->hoffset; if (cs->htype==FLOAT) cs->htype = DOUBLE; cs->hoffset = pl; cs->hclass = AUTO; if ((cs->htype&030) == ARRAY) { cs->htype =- 020; /* set ptr */ cs->ssp++; /* pop dims */ } pl =+ rlength(cs); } for (cs=hshtab; csname[0] == '\0') continue; /* check tagged structure */ if (cs->hclass>KEYWC && (cs->htype&07)==RSTRUCT) { cs->lenp = dimtab[cs->lenp&0377]->lenp; cs->htype = cs->htype&~07 | STRUCT; } if (cs->hclass == STRTAG && dimtab[cs->lenp&0377]==0) error("Undefined structure: %.8s", cs->name); if (cs->hclass == ARG) error("Not an argument: %.8s", cs->name); } osleft = ossiz; space = treebase; rcexpr(block(1, SETREG, regvar), regtab); return(autolen); } blkend() { register struct hshtab *cs; for (cs=hshtab; csname[0]) { if (cs->hclass==0) error("%.8s undefined", cs->name); if((cs->name[0]&0200)==0) { /* not top-level */ cs->name[0] = '\0'; hshused--; } } } } errflush(ao) { register o; o = ao; while(o>RBRACE) /* ; { } */ o = symbol(); peeksym = o; } declist(skwd) { int o, elsize, ndec; register offset, tkw, skw; offset = 0; loop: ndec = 0; tkw = -1; skw = skwd; elsize = 0; while ((o=symbol())==KEYW) switch (cval) { case AUTO: case STATIC: case EXTERN: case REG: if (skw) error("Conflict in storage class"); skw = cval; ndec++; if (tkw<0) continue; goto list; case STRUCT: o = cval; elsize = strdec(&o, skw==MOS); cval = o; case INT: case CHAR: case FLOAT: case DOUBLE: ndec++; if (tkw>=0) error("Type clash"); tkw = cval; if (skw==0) continue; goto list; default: goto brk1; } brk1: peeksym = o; if (ndec==0) return(offset); list: if (tkw<0) tkw = INT; if (skw==0) skw = AUTO; offset = declare(skw, tkw, offset, elsize); goto loop; } strdec(tkwp, mosf) int *tkwp; { register elsize, o; register struct hshtab *ssym; struct hshtab *ds; mosflg = 1; ssym = 0; if ((o=symbol())==NAME) { ssym = csym; if (ssym->hclass==0) { ssym->hclass = STRTAG; ssym->lenp = dimp; chkdim(); dimtab[dimp++] = 0; } if (ssym->hclass != STRTAG) redec(); mosflg = mosf; o = symbol(); } mosflg = 0; if (o != LBRACE) { if (ssym==0) { syntax: decsyn(o); return(0); } if (ssym->hclass!=STRTAG) error("Bad structure name"); if ((elsize = dimtab[ssym->lenp&0377])==0) { *tkwp = RSTRUCT; elsize = ssym; } peeksym = o; } else { ds = defsym; mosflg = 0; elsize = declist(MOS); if (elsize&01) elsize++; defsym = ds; if ((o = symbol()) != RBRACE) goto syntax; if (ssym) { if (dimtab[ssym->lenp&0377]) error("%.8s redeclared", ssym->name); dimtab[ssym->lenp&0377] = elsize; } } return(elsize); } chkdim() { if (dimp >= dimsiz) { error("Dimension/struct table overflow"); exit(1); } }  w _!_5 !*- 5%_5   @e& 5 7%   !_7t7 pjN& fE eL_e58ՀN 7 @E% 7% N JE%E 5 2 , upurfff e |% ! $   @wVw R7 LHN@   ,( $7 7%N  @j 7ww B 7%  ABpN Efz %d N %ff e z% !7h 7b ff e  ABpN W-@E% @E% @A @@5 ww  7%W-  f % Eb-@ [ 7 ~@ J x$$$$ # v#  @ * && & h e & 75&7& e ## ww  ww  7  y & _  6^ e& l f%_ 7V @p _ >  _ xhlH  _ _ _ p5 %l  e x:Lx 2  &f %  + %;z r n&f % \ NH f % .%_ %-_F_   &f % @ %-    @ _ 7 _  7  x t7p& & % @X P HD_ < 4 _(  _ 7 7 5  @  %_ - _ f & % _  %_ z| _F-h  _FTRNeH@ < _F0, (7$ 5  f& & n e & _  %i 7 _F 7 7 J J < p%:'7 fb  _F > :3 *7&%_F7 & %   _Fww 4 %_ % & %_  %& z v&g he & X%f H7D% 8 @.S(" 7 5 %A %  e,7@e7! @w@e7! f N w|w x r%  f `%  w@w <65 ,7" 5  7  @ N #   7  &    !&xwrwnw jb   T&N0 F7>,3E% ` @:"E%E 3EU3" E e0 " eJ evrp ji ^e& NwJw F!  e` 4 eww D! 7ww  5 B5 5%R M xP b b b b p    N& e^  @e& 5w6  " w w w  %    0 "  w 7   G"  E t0n7 h  5 wP L% E e E 0w w -d  w.globl _%.8s External definition syntax.text _%.8s: Compound statement requiredL%d:jmp rretrn .comm _%.8s,0%o .data _%.8s=. .=.+%d. Too many initializers.even .text _%.8s=L%d .byte %d. 0%o;0%o 0%o;0%o;0%o;0%o Inconsistent external initializationUnexpected EOFjsr r5,mrsave;0f;%o .bss;0:.=.+2 .text jsr r5,rsave; %o Missing '}'Case not in switchSwitch table overflowDefault not in switchUnknown keywordRedefinition\ h Statement syntaxExpression too largeStatement syntaxUndefined structure: %.8sNot an argument: %.8s%.8s undefinedConflict in storage classType clashBad structure name%.8s redeclaredDimension/struct table overflow ))9)(8 9) ))) )))ii  I)) H i y )  i  9  y  X  )) H   )   H  X H X H          9 9 )) ) )))iiiiiiiiii H   H H  h      Y  )(XXIii XXI ) ) Y9YYx)Y _cvtab _opdope _ctab _symbuf _hshused _hshtab _space _cp _cmst P_isn _swtab _swp _contlab _brklab _retlab _deflab _nauto _autolen _peeksym _peekc _eof _line _treebas _debug _defsym _funcsym _xdflg _proflg _csym _cval _fcval _nchstr _nerror _paraml _parame _strflg _osleft _mosflg _initflg _inhdr _dimtab _binbuf _ascbuf _dimp _regvar _extdef"L12L17$rsave _symbol L1L2$L3~L4:L5L8_strdec" _blkhed" L11_decl1 _printf L13L10000_cfunc"L14L15D_decref _length L16d_cinit"L9L10_error _errflus" _stateme"@rretrn L19@L21NL22j_declist" L20L18L25zL26L34L37L39L100012L24PL23L27L30l_cinit1"L28L29L32L33L35L36L38L43L48L52L54L57L41fL42H_bxdec".L40*L44t_tree L58$L47L50L53L56L49L51L20000L45_block _rcexpr L20002L60L59<L66&L726L74^L77pL107|L109L114L117L121L10007L10008L65\L61 L69hL78L118L123L124L62FL10009TL70L71zL73~L75L76L116L81L85L86L100hL111L105lL101L102L103L112L115H_simpleg L82_branch L84_dogoto _doret _pexpr" L87L98L90LL93xL95L96L91_cbranch _label L92_nextcha L94_chconbr L97 L10003L99Z_conexp L106L108_chkw _pswitch" L113&_forstmt" L63L120L122L134L1262 L125 L127d L128d L129 L130 L131 L20004z L132 L133( L1354 L136> L137V L138` L141L140 L139 L143 _putchar L1448 _putw L20006r L146 L142 L1570L159JL148 L149 L150 L151 _rlength L152 L153 L154~ L155B L156h L158~ _blkend" L166`L161 L162 L164 L165 L167 L163 L160 L169 L170 L168 L182pL190L172" L1732 L174 L192 L185 L186 L187 L188 L184 L177b L179b L178b L180b L181n L193z L183z L194 L195 _declare L10010 L10011 L189 L204L210L197JL1984_chkdim"L199>_redec L200L201bL202X_decsyn L196L203pL205L206L207L208L209L213L212_exit L211fltused # /* C compiler Copyright 1972 Bell Telephone Laboratories, Inc. */ #include "c0h.c" decref(at) { register t; t = at; if ((t & ~07) == 0) { error("Illegal indirection"); return(t); } return((t>>2) & ~07 | t&07); } incref(t) { return((t<<2)&~034 | (t&07) | PTR); } cbranch(tree, lbl, cond) struct tnode *tree; { rcexpr(block(1,CBRANCH,tree,lbl,cond),cctab); } rcexpr(tree, table) int table; struct tnode *tree; { register c, *sp; if (tree == 0) return; putchar('#'); c = space-treebase; sp = treebase; putw(c, binbuf); putw(tree, binbuf); putw(table, binbuf); putw(line, binbuf); while(c--) putw(*sp++, binbuf); } branch(lab) { printf("jbr\tL%d\n", lab); } label(l) { printf("L%d:", l); } plength(ap) struct tname *ap; { register t, l; register struct tname *p; p = ap; if (((t=p->ntype)&~07) == 0) /* not a reference */ return(1); p->ntype = decref(t); l = length(p); p->ntype = t; return(l); } length(acs) struct tnode *acs; { register t, n; register struct tnode *cs; cs = acs; t = cs->type; n = 1; while ((t&030) == ARRAY) { t = decref(t); n = dimtab[cs->ssp&0377]; } if ((t&~07)==FUNC) return(0); if (t>=PTR) return(2*n); switch(t&07) { case INT: return(2*n); case CHAR: return(n); case FLOAT: return(4*n); case DOUBLE: return(8*n); case STRUCT: return(n * dimtab[cs->lenp&0377]); case RSTRUCT: error("Bad structure"); return(0); } error("Compiler error (length)"); } rlength(cs) struct tnode *cs; { register int l; if (((l=length(cs))&01) != 0) l++; return(l); } simplegoto() { register struct hshtab *csp; if ((peeksym=symbol())==NAME && nextchar()==';') { csp = csym; if (csp->hclass==0 && csp->htype==0) { csp->htype = ARRAY; if (csp->hoffset==0) csp->hoffset = isn++; } if ((csp->hclass==0||csp->hclass==STATIC) && csp->htype==ARRAY) { peeksym = -1; return(csp->hoffset); } } return(0); } nextchar() { while (ctab[peekc]==SPACE) peekc = getchar(); return(peekc); } chconbrk(l) { if (l==0) error("Break/continue error"); } dogoto() { register struct tnode *np; *cp++ = tree(); build(STAR); chkw(np = *--cp); rcexpr(block(1,JUMP,0,0,np), regtab); } doret() { if (nextchar() != ';') rcexpr(block(1, RFORCE, 0, 0, tree()), regtab); branch(retlab); } putchar(c) { putc(c, ascbuf); } `dw D5  tEE@Pww @tEAE@PUww fffg e & wxw t /# n`\ T& f f $  w w N ww N ww B5  2 ^2ww BE%  E E% 6! 0E & x ttE ACp@   ww N ^5 ww  7%' P%;"     4 # -r wfw b\%~ N7JDw@w <  w(w $ e $   && & f e & ww  b%; && & n e &  ww f wzIllegal indirectionjbr L%d L%d:Bad structureCompiler error (length)Break/continue error99i9iiiY999999))99(I9999yyyyi9i99_cvtab _opdope _ctab _symbuf _hshused _hshtab _space _cp _cmst P_isn _swtab _swp _contlab _brklab _retlab _deflab _nauto _autolen _peeksym _peekc _eof _line _treebas _debug _defsym _funcsym _xdflg _proflg _csym _cval _fcval _nchstr _nerror _paraml _parame _strflg _osleft _mosflg _initflg _inhdr _dimtab _binbuf _ascbuf _dimp _regvar _decref"L3rsave L2_error L1.rretrn _incref"2_cbranch"V_block _rcexpr"L5L6_putchar"n_putw L20001L8_branch"L10_printf L9 _label"L12L11"_plength"&L14BL13Z_length"^L28L30L16pL17L18L15L19L29L22L23L24L25L26L27_rlength"L32,_simpleg"2_symbol L34_nextcha"L35vL36vL10001L37L33L39L40_getchar _chconbr"L43L42L41_dogoto"_tree _build _chkw L44*_doret".L46bL45j_putc L47# #include "c0h.c" /* * info on operators: * 01-- is binary operator * 02-- left (or only) operand must be lvalue * 04-- is relational operator * 010-- is assignment-type operator * 020-- non-float req. on left * 040-- non-float req. on right * 0100-- is commutative * 0200-- is right, not left-associative * 0400-- is leaf of tree * *0XX000-- XX is priority of operator */ int opdope[] { 000000, /* EOF */ 000000, /* ; */ 000000, /* { */ 000000, /* } */ 036000, /* [ */ 002000, /* ] */ 036000, /* ( */ 002000, /* ) */ 014201, /* : */ 007001, /* , */ 000000, /* 10 */ 000000, /* 11 */ 000000, /* 12 */ 000000, /* 13 */ 000000, /* 14 */ 000000, /* 15 */ 000000, /* 16 */ 000000, /* 17 */ 000000, /* 18 */ 000000, /* 19 */ 000400, /* name */ 000400, /* short constant */ 000400, /* string */ 000400, /* float */ 000400, /* double */ 000000, /* 25 */ 000000, /* 26 */ 000000, /* 27 */ 000000, /* 28 */ 034200, /* sizeof */ 034202, /* ++pre */ 034202, /* --pre */ 034202, /* ++post */ 034202, /* --post */ 034220, /* !un */ 034202, /* &un */ 034220, /* *un */ 034200, /* -un */ 034220, /* ~un */ 036001, /* . (structure reference) */ 030101, /* + */ 030001, /* - */ 032101, /* * */ 032001, /* / */ 032001, /* % */ 026061, /* >> */ 026061, /* << */ 020161, /* & */ 017161, /* | */ 017161, /* ^ */ 036001, /* -> */ 000000, /* int -> double */ 000000, /* double -> int */ 016001, /* && */ 015001, /* || */ 000000, /* 55 */ 000000, /* 56 */ 000000, /* 57 */ 000000, /* 58 */ 000000, /* 59 */ 022005, /* == */ 022005, /* != */ 024005, /* <= */ 024005, /* < */ 024005, /* >= */ 024005, /* > */ 024005, /*

p */ 024005, /* >=p */ 012213, /* =+ */ 012213, /* =- */ 012213, /* =* */ 012213, /* =/ */ 012213, /* =% */ 012253, /* =>> */ 012253, /* =<< */ 012253, /* =& */ 012253, /* =| */ 012253, /* =^ */ 012213, /* = */ 000000, /* 81 */ 000000, /* 82 */ 000000, /* 83 */ 000000, /* 84 */ 000000, /* 85 */ 000000, /* 86 */ 000000, /* 87 */ 000000, /* 88 */ 000000, /* 89 */ 014201, /* ? */ 000000, /* 91 */ 000000, /* 92 */ 000000, /* 93 */ 000000, /* 94 */ 000000, /* 95 */ 000000, /* 96 */ 000000, /* 97 */ 000000, /* 98 */ 000000, /* 99 */ 036001, /* call */ 036001, /* mcall */ 000000, /* goto */ 000000, /* jump cond */ 000000, /* branch cond */ 000000, /* 105 */ 000000, /* 106 */ 000000, /* 107 */ 000000, /* 108 */ 000000, /* 109 */ 000000 /* force r0 */ }; /* * conversion table: * 0100-- convert left operand * 0*0XX-- XX is conversion number, to wit: * 000: none * 001: int -> ptr * 002: ptr -> int * 003: int -> double * 004: double -> int * 077: generally illegal */ char cvtab[] { 0000, /* i : i */ 0000, /* i : c */ 0103, /* i : f */ 0103, /* i : d */ 0077, /* i : s */ 0101, /* i : *i */ 0000, /* i : *c */ 0101, /* i : *f */ 0101, /* i : *d */ 0101, /* i : *s */ 0101, /* i : ** */ 0000, /* c : i */ 0000, /* c : c */ 0103, /* c : f */ 0103, /* c : d */ 0077, /* c : s */ 0101, /* c : *i */ 0000, /* c : *c */ 0101, /* c : *f */ 0101, /* c : *d */ 0101, /* c : *s */ 0101, /* c : ** */ 0003, /* f : i */ 0003, /* f : c */ 0000, /* f : f */ 0000, /* f : d */ 0077, /* f : s */ 0077, /* f : *i */ 0077, /* f : *c */ 0077, /* f : *f */ 0077, /* f : *d */ 0077, /* f : *s */ 0077, /* f : ** */ 0003, /* d : i */ 0003, /* d : c */ 0000, /* d : f */ 0000, /* d : d */ 0077, /* d : s */ 0077, /* d : *i */ 0077, /* d : *c */ 0077, /* d : *f */ 0077, /* d : *d */ 0077, /* d : *s */ 0077, /* d : ** */ 0077, /* s : i */ 0077, /* s : c */ 0077, /* s : f */ 0077, /* s : d */ 0077, /* s : s */ 0077, /* s : *i */ 0077, /* s : *c */ 0077, /* s : *f */ 0077, /* s : *d */ 0077, /* s : *s */ 0077, /* s : ** */ 0001, /* *i : i */ 0001, /* *i : c */ 0077, /* *i : f */ 0077, /* *i : d */ 0077, /* *i : s */ 0002, /* *i : *i */ 0077, /* *i : *c */ 0077, /* *i : *f */ 0077, /* *i : *d */ 0077, /* *i : *s */ 0002, /* *i : ** */ 0000, /* *c : i */ 0000, /* *c : c */ 0077, /* *c : f */ 0077, /* *c : d */ 0077, /* *c : s */ 0077, /* *c : *i */ 0000, /* *c : *c */ 0077, /* *c : *f */ 0077, /* *c : *d */ 0077, /* *c : *s */ 0077, /* *c : ** */ 0001, /* *f : i */ 0001, /* *f : c */ 0077, /* *f : f */ 0077, /* *f : d */ 0077, /* *f : s */ 0077, /* *f : *i */ 0077, /* *f : *c */ 0002, /* *f : *f */ 0077, /* *f : *d */ 0077, /* *f : *s */ 0077, /* *f : ** */ 0001, /* *d : i */ 0001, /* *d : c */ 0077, /* *d : f */ 0077, /* *d : d */ 0077, /* *d : s */ 0077, /* *d : *i */ 0077, /* *d : *c */ 0077, /* *d : *f */ 0002, /* *d : *d */ 0077, /* *d : *s */ 0077, /* *d : ** */ 0001, /* *s : i */ 0001, /* *s : c */ 0077, /* *s : f */ 0077, /* *s : d */ 0077, /* *s : s */ 0077, /* *s : *i */ 0077, /* *s : *c */ 0077, /* *s : *f */ 0077, /* *s : *d */ 0002, /* *s : *s */ 0077, /* *s : ** */ 0001, /* ** : i */ 0001, /* ** : c */ 0077, /* ** : f */ 0077, /* ** : d */ 0077, /* ** : s */ 0002, /* ** : *i */ 0077, /* ** : *c */ 0077, /* ** : *f */ 0077, /* ** : *d */ 0077, /* ** : *s */ 0002 /* ** : ** */ }; /* * character type table */ char ctab[] { EOF, INSERT, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, SPACE, NEWLN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, UNKN, SPACE, EXCLA, DQUOTE, UNKN, UNKN, MOD, AND, SQUOTE, LPARN, RPARN, TIMES, PLUS, COMMA, MINUS, PERIOD, DIVIDE, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, COLON, SEMI, LESS, ASSIGN, GREAT, QUEST, UNKN, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LBRACK, UNKN, RBRACK, EXOR, LETTER, UNKN, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LBRACE, OR, RBRACE, COMPL, UNKN }; <<8888888888; .even .endif getdig: mov _peekc,r0 beq 1f clr _peekc br 2f 1: jsr pc,_getchar 2: sub $'0,r0 cmp r0,$9. bhi 1f inc totdig mov _cval,r1 mul base,r1 add r0,r1 mov r1,_cval tst (r5)+ rts r5 1: add $'0,r0 rts r5 .bss base: .=.+2 nfract: .=.+2 decpt: .=.+2 totdig: .=.+2 # /* C compiler, part 2 Copyright 1972 Bell Telephone Laboratories, Inc. */ #include "c1h.c" char maprel[] { EQUAL, NEQUAL, GREATEQ, GREAT, LESSEQ, LESS, GREATP, GREATQP, LESSP, LESSEQP }; char notrel[] { NEQUAL, EQUAL, GREAT, GREATEQ, LESS, LESSEQ, GREATQP, GREATP, LESSEQP, LESSP }; struct tconst czero { CON, INT, 0, 0}; struct tconst cone { CON, INT, 0, 1}; struct tconst fczero { SFCON, DOUBLE, 0, 0 }; struct table *tabtab[] { regtab, efftab, cctab, sptab, 0 }; int nreg 3; int isn 10000; int namsiz 8; int *treebase; main(argc, argv) char *argv[]; { int treespace[ossiz]; struct table *table; register *sp, c, *tree; if (argc<4) { error("Arg count"); exit(1); } if(fopen(argv[1], ascbuf)<0 || fopen(argv[2], binbuf)<0){ error("Missing temp file"); exit(1); } if (fcreat(argv[3], outbuf) < 0) { error("Can't create %s", argv[3]); exit(1); } treebase = getw(binbuf); if (treebase < treespace) { error("Tree space botch"); exit(1); } while ((c=getc(ascbuf)) > 0) { if(c=='#') { sp = treebase; c = getw(binbuf); tree = getw(binbuf); table = tabtab[getw(binbuf)]; line = getw(binbuf); while(--c >= 0) *sp++ = getw(binbuf); if (table==0) /* is switch */ pswitch(treebase, sp, tree); else { tree = optim(tree); nstack = 0; rcexpr(tree, table, 0); } } else putchar(c); } if (nfloat) printf(".globl fltused\n"); fflush(outbuf); exit(nerror!=0); } char *match(atree, table, nrleft) struct tnode *atree; struct table *table; { int op, d1, d2, t1, t2, dope; struct tnode *p2; register struct tnode *p1, *tree; register struct optab *opt; if ((tree=atree)==0) return(0); if (table==lsptab) table = sptab; op = tree->op; dope = opdope[op]; if ((dope&LEAF) == 0) p1 = tree->tr1; else p1 = tree; t1 = p1->type; d1 = dcalc(p1, nrleft); if ((dope&BINARY)!=0) { p2 = tree->tr2; t2 = p2->type; d2 = dcalc(p2, nrleft); } for (; table->op!=op; table++) if (table->op==0) return(0); for (opt = table->tabp; opt->tabdeg1!=0; opt++) { if (d1 > (opt->tabdeg1&077) || (opt->tabdeg1 >= 0100 && (p1->op != STAR))) continue; if (notcompat(p1, opt->tabtyp1)) { continue; } if ((opdope[op]&BINARY)!=0 && p2!=0) { if (d2 > (opt->tabdeg2&077) || (opt->tabdeg2 >= 0100) && (p2->op != STAR) ) continue; if (notcompat(p2,opt->tabtyp2)) continue; } return(opt); } return(0); } rcexpr(atree, atable, reg) struct tnode *atree; struct table *atable; { register r; int modf; register struct tnode *tree; register struct table *table; table = atable; if((tree=atree)==0) return(0); switch (tree->op) { case SETREG: nreg = tree->type-1; return; case CBRANCH: cbranch(tree->btree, tree->lbl, tree->cond, 0); return(0); case INIT: if (tree->tr1->op == AMPER) tree->tr1 = tree->tr1->tr1; if (tree->tr1->op!=NAME && tree->tr1->op!=CON) error("Illegal initialization"); else cexpr(tree, regtab, nreg); return(0); case EXCLA: if ((opdope[tree->tr1->op] & RELAT) != 0) { tree = tree->tr1; tree->op = notrel[tree->op - EQUAL]; } break; case RFORCE: if((r=rcexpr(tree->tr1, table, reg)) != 0) printf("mov%c r%d,r0\n", isfloat(tree->tr1), r); return(0); case COMMA: rcexpr(tree->tr1, efftab, reg); tree = tree->tr2; break; case TIMES: case DIVIDE: case ASTIMES: case ASDIV: pow2(tree); } if ((r=cexpr(tree, table, reg))>=0) { return(r); } if (table!=regtab) if((r=cexpr(tree, regtab, reg))>=0) { modf = isfloat(tree); if (table==sptab || table==lsptab) { printf("mov%c r%d,%c(sp)\n", modf, r, table==sptab? '-':0); nstack++; } if (table==cctab) { printf("tst%c r%d\n", modf, r); } return(0); } error("No match for op %d", tree->op); } cexpr(atree, table, areg) struct tnode *atree; struct table *table; { int c, r; register struct tnode *p, *p1, *tree; struct table *ctable; struct tnode *p2; char *string; int reg, reg1, rreg, flag, nargs, fflag; char *opt; tree = atree; reg = areg; p1 = tree->tr2; if ((c = tree->op)==CALL) { r = 0; nargs = 0; fflag = 0; if (tree->tr1->op!=NAME) { /* get nargs right */ nargs++; nstack++; } if(p1->op) { while (p1->op==COMMA) { r =+ comarg(p1->tr2, &fflag); p1 = p1->tr1; nargs++; } r =+ comarg(p1, &fflag); nargs++; } tree->op = CALL+1; tree->degree = r; /* save arg length */ } if ((opdope[c]&RELAT||c==LOGAND||c==LOGOR) && table!=cctab) { cbranch(tree, c=isn++, 1, reg); rcexpr(&czero, table, reg); branch(isn, 0); label(c); rcexpr(&cone, table, reg); label(isn++); return(reg); } if(c==QUEST) { if (table==cctab) return(-1); cbranch(tree->tr1, c=isn++, 0, reg); flag = nstack; rreg = rcexpr(p1->tr1, table, reg); nstack = flag; branch(r=isn++, 0); label(c); reg = rcexpr(p1->tr2, table, rreg); if (rreg!=reg) printf("mov%c r%d,r%d\n", isfloat(tree),reg,rreg); reg = rreg; label(r); goto retrn; } if (c==AMPER && tree->tr1->op==NAME && tree->tr1->class==REG) error("Illegal use of register"); reg = oddreg(tree, reg); reg1 = reg+1; if (chkleaf(tree, table, reg) >= 0) goto retrn; if ((opt=match(tree, table, nreg-reg))==0) return(-1); string = opt->tabstring; p1 = tree->tr1; p2 = 0; if (opdope[tree->op] & BINARY) p2 = tree->tr2; loop: switch(c = *string++) { case '\0': if (tree->op==CALL+1) { popstk(tree->degree); reg = 0; nstack =- nargs; } retrn: if (!isfloat(tree)) if (tree->op==DIVIDE || tree->op==ASDIV) reg--; return(reg); /* A1 */ case 'A': p = p1; goto adr; /* A2 */ case 'B': p = p2; goto adr; /* A */ case 'O': p = tree; adr: c = 0; if (*string=='\'') { c++; string++; } pname(p, c); goto loop; /* I */ case 'M': if ((c = *string)=='\'') string++; else c = 0; prins(tree->op, c); goto loop; /* B1 */ case 'C': if ((opdope[tree->op]&LEAF) != 0) p = tree; else p = p1; goto pbyte; /* BF */ case 'P': p = tree; goto pb1; /* B2 */ case 'D': p = p2; pbyte: if (p->type==CHAR) putchar('b'); pb1: if (isfloat(p)) putchar('f'); goto loop; /* BE */ case 'L': if (p1->type==CHAR || p2->type==CHAR) putchar('b'); p = tree; goto pb1; /* C1 */ case 'E': p = p1->tr1; goto const; /* C2 */ case 'F': p = p2->tr1; const: printf("0%o", p); goto loop; /* F */ case 'G': p = p1; flag = 01; goto subtre; /* S */ case 'K': p = p2; flag = 02; goto subtre; /* H */ case 'H': p = tree; flag = 04; subtre: ctable = regtab; c = *string++ - 'A'; if ((c&02)!=0) ctable = sptab; if ((c&04)!=0) if (p->op!=INCAFT && p->op!=DECAFT && match(p, efftab, nreg-reg)) ctable = efftab; else ctable = cctab; if ((c&01)!=0) { p = p->tr1; if(collcon(p) && ctable!=sptab) { if (p->tr2->op==AMPERA) flag =| 010; p = p->tr1; } } if (table==lsptab && ctable==sptab) ctable = lsptab; if (c&010) r = reg1; else if (opdope[p->op]&LEAF || p->degree < 2) r = reg; else r = areg; rreg = rcexpr(p, ctable, r); if (flag&010) printf("add r5,r%d\n", rreg); if (c&010) reg1 = rreg; else if (rreg!=reg && ctable==regtab) if (oddreg(tree, 0)==0 && (flag&04 || flag&01 && xdcalc(p2, nreg-rreg-1) <= (opt->tabdeg2&077) || flag&02 && xdcalc(p1,nreg-rreg-1) <= (opt->tabdeg1&077))) { reg = rreg; reg1 = rreg+1; } else printf("mov%c\tr%d,r%d\n", isfloat(tree), rreg, reg); goto loop; /* R */ case 'I': r = reg; if (*string=='-') { string++; r--; } goto preg; /* R1 */ case 'J': r = reg1; preg: if (r>nreg) error("Register overflow: simplify expression"); printf("r%d", r); goto loop; case '-': /* check -(sp) */ if (*string=='(') { nstack++; if (table!=lsptab) putchar('-'); goto loop; } break; case ')': /* check (sp)+ */ putchar(')'); if (*string=='+') nstack--; goto loop; case '#': p = p1->tr1; goto nmbr; case '"': p = p2->tr1; goto nmbr; case '~': p = p1; nmbr: if(collcon(p)) { switch((p = p->tr2)->op) { case CON: if (p->value) printf("%d.", p->value); break; case AMPER: pname(p->tr1, 0); break; case AMPERA: p = p->tr1; printf("%d.", p->nloc+p->offset); break; } } goto loop; /* V */ case 'V': tree->op = maprel[tree->op - EQUAL]; goto loop; /* Z */ case 'Z': printf("$0%o", p1->offset+p1->nloc); goto loop; case '^': /* for ++ --, tr2 is length */ printf("0%o", tree->tr2); goto loop; case 'T': /* "tst R" if 1st op not in cctab */ if (dcalc(p1, 5)>12 && !match(p1, cctab, 10)) printf("tst r%d\n", reg); goto loop; case '`': /* for jsr pc,*$F on compression */ if (fflag) printf("*$"); goto loop; } putchar(c); goto loop; } chkleaf(atree, table, reg) struct tnode *atree; { struct tnode lbuf; register struct tnode *tree; tree = atree; if (dcalc(tree, nreg-reg) > 12) return(-1); lbuf.op = LOAD; lbuf.type = tree->type; lbuf.degree = tree->degree; lbuf.tr1 = tree; return(cexpr(&lbuf, table, reg)); } comarg(atree, flagp) int *flagp; { register struct tnode *tree; tree = atree; if (tree->type==STRUCT) error("Illegal structure"); if (nstack || isfloat(tree)) { rcexpr(tree, sptab, 0); return(arlength(tree->type)); } (*flagp)++; rcexpr(tree, lsptab, 0); return(0); } optim(atree) struct tnode *atree; { register op, dope; int d1, d2; struct tnode *t; register struct tnode *tree; if ((tree=atree)==0) return(0); op = tree->op; if (op==0) return(tree); dope = opdope[op]; if ((dope&LEAF) != 0) return(tree); if ((dope&BINARY) == 0) return(unoptim(tree)); /* is known to be binary */ if ((dope&COMMUTE)!=0) { acomm: d1 = tree->type; tree = acommute(tree); tree->type = d1; return(tree); } tree->tr1 = optim(tree->tr1); tree->tr2 = optim(tree->tr2); if ((dope&RELAT) != 0) { if (degree(tree->tr1) < degree(tree->tr2)) { t = tree->tr1; tree->tr1 = tree->tr2; tree->tr2 = t; tree->op = maprel[op-EQUAL]; } if (tree->tr1->type==CHAR && tree->tr2->op==CON && dcalc(tree->tr1) <= 12 && tree->tr2->value <= 127 && tree->tr2->value >= 0) tree->tr2->type = CHAR; } d1 = max(degree(tree->tr1), 1); d2 = max(degree(tree->tr2), 0); switch (op) { case CALL: tree->degree = 10; break; case QUEST: case COLON: tree->degree = max(d1, d2); break; case MINUS: if (tree->tr2->op==CON) { /* const */ tree->op = PLUS; tree->tr2->value = -tree->tr2->value; goto acomm; } goto def; case DIVIDE: case ASDIV: case ASTIMES: if (ispow2(tree) == 0) { case MOD: case ASMOD: d1 =+ 2; d2 =+ 2; } case LSHIFT: case RSHIFT: if (tree->tr1->op==CON && tree->tr2->op==CON) { const(op, &tree->tr1->value, tree->tr2->value); return(tree->tr1); } def: default: tree->degree = d1==d2? ++d1: max(d1, d2); break; } return(tree); } unoptim(atree) struct tnode *atree; { register struct tnode *subtre, *tree; register int *p; double static fv; struct { int integer; }; if ((tree=atree)==0) return(0); if (tree->op==CBRANCH) { tree->btree = optim(tree->btree); return(tree); } subtre = tree->tr1 = optim(tree->tr1); /* try to reduce * & */ if (tree->op==STAR && (subtre->op==AMPER || subtre->op==AMPERA)) return(subtre->tr1); if (tree->op == ITOF && subtre->op == CON) { fv = subtre->value; p = &fv; p++; if (*p++==0 && *p++==0 && *p++==0) { subtre->type = DOUBLE; subtre->value = fv.integer; subtre->op = SFCON; return(subtre); } } if (subtre->op == CON) switch(tree->op) { case NEG: subtre->value = -subtre->value; return(subtre); case COMPL: subtre->value = ~subtre->value; return(subtre); } tree->degree = max(1, degree(subtre)); return(tree); } struct acl { int nextl; int nextn; struct tnode *nlist[20]; struct tnode *llist[21]; }; acommute(atree) { struct acl acl; int d, i, op, flt; register struct tnode *t1, **t2, *tree; struct tnode *t; acl.nextl = 0; acl.nextn = 0; tree = atree; op = tree->op; flt = isfloat(tree); insert(op, tree, &acl); acl.nextl--; if (!flt) { /* put constants together */ t2 = &acl.llist[acl.nextl]; for (i=acl.nextl;i>0&&t2[0]->op==CON&&t2[-1]->op==CON;i--) { acl.nextl--; t2--; const(op, &t2[0]->value, t2[1]->value); } } if (op==PLUS && !flt) { /* toss out "+0" */ if (acl.nextl>0 && (*t2)->op==CON && (*t2)->value==0) { acl.nextl--; t2--; } if (acl.nextl <= 0) return(*t2); /* subsume constant in "&x+c" */ if (t2[0]->op==CON && (t2[-1]->op==AMPER || t2[-1]->op==AMPERA)) { t2--; t2[0]->tr1->offset =+ t2[1]->value; acl.nextl--; } } else if (op==TIMES) { t1 = acl.llist[acl.nextl]; if (t1->op==CON && t1->value==0) return(t1); } if (op==PLUS && !flt) distrib(&acl); tree = *(t2 = &acl.llist[0]); d = max(degree(tree), 1); if (op==TIMES && !flt) d++; for (i=0; itr2 = t = *++t2; t1->degree = d = degree(t)>=d? d+1:d; t1->tr1 = tree; tree = t1; } if (tree->op==TIMES && ispow2(tree)) tree->degree = max(degree(tree->tr1), 1); return(tree); } distrib(list) struct acl *list; { /* * Find a list member of the form c1c2*x such * that c1c2 divides no other such constant, is divided by * at least one other (say in the form c1*y), and which has * fewest divisors. Reduce this pair to c1*(y+c2*x) * and iterate until no reductions occur. */ register struct tnode **p1, **p2; struct tnode *t; int ndmaj, ndmin; struct tnode **dividend, **divisor; struct tnode **maxnod, **mindiv; loop: maxnod = &list->llist[list->nextl]; ndmaj = 1000; dividend = 0; for (p1 = list->llist; p1 <= maxnod; p1++) { if ((*p1)->op!=TIMES || (*p1)->tr2->op!=CON) continue; ndmin = 0; for (p2 = list->llist; p2 <= maxnod; p2++) { if (p1==p2 || (*p2)->op!=TIMES || (*p2)->tr2->op!=CON) continue; if ((*p1)->tr2->value == (*p2)->tr2->value) { (*p2)->tr2 = (*p1)->tr1; (*p2)->op = PLUS; (*p1)->tr1 = (*p2); *p1 = optim(*p1); squash(p2, maxnod); list->nextl--; goto loop; } if (((*p2)->tr2->value % (*p1)->tr2->value) == 0) goto contmaj; if (((*p1)->tr2->value % (*p2)->tr2->value) == 0) { ndmin++; mindiv = p2; } } if (ndmin > 0 && ndmin < ndmaj) { ndmaj = ndmin; dividend = p1; divisor = mindiv; } contmaj:; } if (dividend==0) return; t = list->nlist[--list->nextn]; p1 = dividend; p2 = divisor; t->op = PLUS; t->type = (*p1)->type; t->tr1 = (*p1); t->tr2 = (*p2)->tr1; (*p1)->tr2->value =/ (*p2)->tr2->value; (*p2)->tr1 = t; t = optim(*p2); if (p1 < p2) { *p1 = t; squash(p2, maxnod); list->nextl--; goto loop; } *p2 = t; squash(p1, maxnod); list->nextl--; goto loop; } squash(p, maxp) struct tnode **p, **maxp; { register struct tnode **np; for (np = p; np < maxp; np++) *np = *(np+1); } const(op, vp, av) int *vp; { register int v; v = av; switch (op) { case PLUS: *vp =+ v; return; case TIMES: *vp =* v; return; case AND: *vp =& v; return; case OR: *vp =| v; return; case EXOR: *vp =^ v; return; case DIVIDE: case MOD: if (v==0) error("Divide check"); else if (op==DIVIDE) *vp =/ v; else *vp =% v; return; case RSHIFT: *vp =>> v; return; case LSHIFT: *vp =<< v; return; } error("C error: const"); } insert(op, atree, alist) struct acl *alist; { register d; register struct acl *list; register struct tnode *tree; int d1, i; struct tnode *t; tree = atree; list = alist; if (tree->op == op) { ins: list->nlist[list->nextn++] = tree; insert(op, tree->tr1, list); insert(op, tree->tr2, list); return; } tree = optim(tree); if (tree->op == op) goto ins; if (!isfloat(tree)) { /* c1*(x+c2) -> c1*x+c1*c2 */ if ((tree->op==TIMES||tree->op==LSHIFT) && tree->tr2->op==CON && tree->tr1->op==PLUS && tree->tr1->tr2->op==CON) { d = tree->tr2->value; if (tree->op==TIMES) tree->tr2->value =* tree->tr1->tr2->value; else tree->tr2->value = tree->tr1->tr2->value << d; tree->tr1->tr2->value = d; tree->tr1->op = tree->op; tree->op = PLUS; if (op==PLUS) goto ins; } } d = degree(tree); for (i=0; inextl; i++) { if ((d1=degree(list->llist[i]))llist[i]; list->llist[i] = tree; tree = t; d = d1; } } list->llist[list->nextl++] = tree; } putchar(c) { putc(c&0177, outbuf); } *+,-./0123456789:;<=>?@ABCDEFGHIJ# /* * C compiler */ #include "c1h.c" max(a, b) { if (a>b) return(a); return(b); } degree(at) struct tnode *at; { register struct tnode *t; if ((t=at)==0 || t->op==0) return(0); if (t->op == CON) return(-3); if (t->op == AMPER) return(-2); if (t->op == AMPERA) return(-1); if ((opdope[t->op] & LEAF) != 0) { if (t->type==CHAR) return(1); return(0); } return(t->degree); } pname(ap, flag) struct tnode *ap; { register i; register struct tnode *p; p = ap; loop: switch(p->op) { case SFCON: case CON: printf("$0%o", p->value); return; case FCON: printf("L%d", p->value); return; casename: case NAME: if (i = p->offset) printf("%d.+", i); switch(p->class) { case AUTO: printf("%d.(r5)", p->nloc); return; case EXTERN: printf("_%.8s", &(p->nloc)); return; case STRUCT: error("Illegal structure reference"); printf("$0"); return; case REG: if (i) error("Bad reg. reference"); printf("r%d", p->nloc); return; } /* presumably, it's static */ printf("L%d", p->nloc); return; case AMPER: putchar('$'); p = p->tr1; goto loop; case STAR: p = p->tr1; /* reg[const] or statchar[reg] */ if (p->op==PLUS) { if (p->tr2->op==AMPER) { pname(p->tr2->tr1, 0); printf("(r%d)", p->tr1->nloc); return; } printf("%d.(r%d)", p->tr2->value, p->tr1->nloc); return; } else if (p->op==INCAFT) { printf("(r%d)%c", p->tr1->nloc, flag?0:'+'); return; } else if (p->op==DECBEF) { printf("%c(r%d)", flag?0:'-', p->tr1->nloc); return; } else if (p->op==NAME && p->class==REG) { printf("(r%d)", p->nloc); return; } putchar('*'); goto loop; } error("pname called illegally"); } xdcalc(ap, nrleft) struct tnode *ap; { register struct tnode *p; register d; p = ap; d = dcalc(p, nrleft); if (d<20 && p->type==CHAR) { if (nrleft>=1) d = 20; else d = 24; } return(d); } dcalc(ap, nrleft) struct tnode *ap; { register struct tnode *p, *p1; if ((p=ap)==0) return(0); switch (p->op) { case NAME: case AMPER: return(12); case CON: case SFCON: return(p->value==0? 4:(p->value==1?5:8)); case FCON: return(12); case STAR: p1 = p->tr1; if (p1->op==NAME || p1->op==CON) return(12); if (p1->op==STAR) p1 = p1->tr1; if (p1->op==PLUS && p1->tr1->op==NAME && p1->tr1->class==REG && p1->tr2->op==CON) return(12); if (p1->op==PLUS && p1->tr2->op==AMPER && p1->tr1->op==NAME && p1->tr2->type==(PTR+CHAR) && p1->tr1->class==REG) return(12); if ((p1->op==INCAFT || p1->op==DECBEF) && p1->tr1->type!=(STRUCT+PTR)) p1 = p1->tr1; if (p1->op==NAME && p1->class==REG) return(12); } return(p->degree<=nrleft? 20: 24); } notcompat(ap, ast) struct tnode *ap; { register at, st; register struct tnode *p; p = ap; at = p->type; st = ast; if ((at&07)==STRUCT) at =& 077770; /* map to int */ if (st==0) /* word, byte */ return(at>1 & at<=07); if (st==1) /* word */ return(at>0 & at<=07); st =- 2; if ((at&077740) != 0) at = 020; if ((at&077770) != 0) at = at&07 | 020; if (st==2 && at==3) at = 2; if (p->op==NAME && p->class==REG && at==INT && st==CHAR) return(0); return(st != at); } prins(op, c) { register struct instab *insp; register char *ip; for (insp=instab; insp->op != 0; insp++) { if (insp->op == op) { ip = c? insp->str2: insp->str1; if (ip==0) break; printf("%s", ip); return; } } error("No match' for op %d", op); } collcon(ap) struct tnode *ap; { register op; register struct tnode *p; p = ap; if(p->op==PLUS) { op = p->tr2->op; if (op==CON || op==AMPER || op==AMPERA) return(1); } return(0); } isfloat(at) struct tnode *at; { register struct tnode *t; t = at; if ((opdope[t->op]&RELAT)!=0) t = t->tr1; if (t->type==FLOAT || t->type==DOUBLE) { nfloat = 1; return('f'); } return(0); } oddreg(t, areg) struct tnode *t; { register reg; reg = areg; if (!isfloat(t)) switch(t->op) { case DIVIDE: case MOD: case ASDIV: case ASMOD: reg++; case TIMES: case ASTIMES: return(reg|1); } return(reg); } arlength(t) { if (t>=PTR) return(2); switch(t) { case INT: case CHAR: return(2); case FLOAT: case DOUBLE: return(8); } return(1024); } pswitch(afp, alp, deflab) struct swtab *afp, *alp; { int tlab, ncase, i, j, tabs, worst, best, range; register struct swtab *swp, *fp, *lp; int poctab[swsiz]; fp = afp; lp = alp; if (fp==lp) { printf("jbr L%d\n", deflab); return; } tlab = isn++; if (sort(fp, lp)) return; ncase = lp-fp; lp--; range = lp->swval - fp->swval; /* direct switch */ if (range>0 && range <= 3*ncase) { if (fp->swval) printf("sub $0%o,r0\n", fp->swval); printf("cmp r0,$0%o\n", range); printf("jhi L%d\n", deflab); printf("asl r0\n"); printf("jmp *.+4(r0)\n"); for (i=fp->swval; i<=lp->swval; i++) { if (i==fp->swval) { printf("L%d\n", fp->swlab); fp++; } else printf("L%d\n", deflab); } goto esw; } /* simple switch */ if (ncase<8) { i = isn++; j = isn++; printf("mov $L%d,r1\n", i); printf("mov r0,L%d\n", j); printf("L%d:cmp r0,(r1)+\n", isn); printf("jne L%d\n", isn++); printf("jmp *L%d-L%d(r1)\n", j, i); printf(".data\nL%d:", i); for (; fp<=lp; fp++) printf("%o\n", fp->swval); printf("L%d:..\n", j); for (fp = afp; fp<=lp; fp++) printf("L%d\n", fp->swlab); printf("L%d\n.text\n", deflab); goto esw; } /* hash switch */ best = 077777; for (i=ncase/4; i<=ncase/2; i++) { for (j=0; jswval, i)]++; worst = 0; for (j=0; jworst) worst = poctab[j]; if (i*worst < best) { tabs = i; best = i*worst; } } printf("jsr r2,hsw; %o; L%d\n", tabs, isn); printf("jmp *L%d-L%d(r1)\n", isn+tabs+1, isn+1); printf(".data\nL%d:", isn++); for (i=0; i<=tabs; i++) printf("L%d\n", isn+i); for (i=0; iswval, tabs) == i) printf("%o\n", ldiv(0, swp->swval, tabs)); } printf("L%d:", isn++); for (i=0; iswval, tabs) == i) printf("L%d\n", swp->swlab); } printf(".text\n"); esw: printf("/esw\n"); } sort(afp, alp) struct swtab *afp, *alp; { register struct swtab *cp, *fp, *lp; int intch, t; fp = afp; lp = alp; while (fp < --lp) { intch = 0; for (cp=fp; cpswval == cp[1].swval) { error("Duplicate case (%d)", cp->swval); return(1); } if (cp->swval > cp[1].swval) { intch++; t = cp->swval; cp->swval = cp[1].swval; cp[1].swval = t; t = cp->swlab; cp->swlab = cp[1].swlab; cp[1].swlab = t; } } if (intch==0) break; } return(0); } ispow2(atree) { register int d; register struct tnode *tree; tree = atree; if (!isfloat(tree) && tree->tr2->op==CON) { d = tree->tr2->value; if (d>0 && (d&(d-1))==0) return(d); } return(0); } pow2(atree) struct tnode *atree; { register int d, i; register struct tnode *tree; tree = atree; if (d = ispow2(tree)) { for (i=0; (d=>>1)!=0; i++); tree->tr2->value = i; d = tree->op; tree->op = d==TIMES? LSHIFT: (d==DIVIDE? RSHIFT: (d==ASTIMES? ASLSH: ASRSH)); } } cbranch(atree, albl, cond, areg) struct tnode *atree; { int l1, opfix; register lbl, reg; register struct tnode *tree; struct tnode lbuf; lbl = albl; reg = areg; if ((tree=atree)==0) return; switch(tree->op) { case LOGAND: if (cond) { cbranch(tree->tr1, l1=isn++, 0, reg); cbranch(tree->tr2, lbl, 1, reg); label(l1); } else { cbranch(tree->tr1, lbl, 0, reg); cbranch(tree->tr2, lbl, 0, reg); } return; case LOGOR: if (cond) { cbranch(tree->tr1, lbl, 1, reg); cbranch(tree->tr2, lbl, 1, reg); } else { cbranch(tree->tr1, l1=isn++, 1, reg); cbranch(tree->tr2, lbl, 0, reg); label(l1); } return; case EXCLA: cbranch(tree->tr1, lbl, !cond, reg); return; case COMMA: rcexpr(tree->tr1, efftab, reg); tree = tree->tr2; break; } opfix = 0; if ((opdope[tree->op]&RELAT)==0) { lbuf.op = NEQUAL; lbuf.type = tree->type; lbuf.degree = tree->degree; lbuf.tr1 = tree; lbuf.tr2 = &czero; if (isfloat(tree)) lbuf.tr2 = &fczero; tree = &lbuf; } if (tree->tr2->op==CON && tree->tr2->value==0) opfix = 200; rcexpr(tree, cctab, reg); if (isfloat(tree)) printf("cfcc\n"); branch(lbl, tree->op+opfix, !cond); } branch(lbl, aop, c) { register op; if(op=aop) prins(op,c); else printf("jbr"); printf("\tL%d\n", lbl); } label(l) { printf("L%d:", l); } popstk(a) { switch(a) { case 0: return; case 2: printf("tst (sp)+\n"); return; case 4: printf("cmp (sp)+,(sp)+\n"); return; } printf("add $0%o,sp\n", a); } error(s, p1, p2, p3, p4, p5, p6) { register f; nerror++; fflush(outbuf); f = outbuf[0]; outbuf[0] = 1; printf("%d: ", line); printf(s, p1, p2, p3, p4, p5, p6); putchar('\n'); fflush(outbuf); outbuf[0] = f; } LMNOPQRSTUVWXYZ[\]int opdope[] { 000000, /* EOF */ 000000, /* ; */ 000000, /* { */ 000000, /* } */ 036000, /* [ */ 002000, /* ] */ 036000, /* ( */ 002000, /* ) */ 014201, /* : */ 007001, /* , */ 000000, /* 10 */ 000000, /* 11 */ 000000, /* 12 */ 000000, /* 13 */ 000000, /* 14 */ 000000, /* 15 */ 000000, /* 16 */ 000000, /* 17 */ 000000, /* 18 */ 000000, /* 19 */ 000400, /* name */ 000400, /* short constant */ 000400, /* string */ 000400, /* float */ 000400, /* double */ 000000, /* 25 */ 000000, /* 26 */ 000000, /* 27 */ 000000, /* 28 */ 000000, /* 29 */ 034202, /* ++pre */ 034202, /* --pre */ 034202, /* ++post */ 034202, /* --post */ 034220, /* !un */ 034202, /* &un */ 034220, /* *un */ 034200, /* -un */ 034220, /* ~un */ 036001, /* . (structure reference) */ 030101, /* + */ 030001, /* - */ 032101, /* * */ 032001, /* / */ 032001, /* % */ 026061, /* >> */ 026061, /* << */ 020161, /* & */ 016161, /* | */ 016161, /* ^ */ 036001, /* -> */ 000000, /* int -> double */ 000000, /* double -> int */ 000001, /* && */ 000001, /* || */ 000000, /* 55 */ 000000, /* 56 */ 000000, /* 57 */ 000000, /* 58 */ 000000, /* 59 */ 022005, /* == */ 022005, /* != */ 024005, /* <= */ 024005, /* < */ 024005, /* >= */ 024005, /* > */ 024005, /*

p */ 024005, /* >=p */ 012213, /* =+ */ 012213, /* =- */ 012213, /* =* */ 012213, /* =/ */ 012213, /* =% */ 012253, /* =>> */ 012253, /* =<< */ 012253, /* =& */ 012253, /* =| */ 012253, /* =^ */ 012213, /* = */ 000000, /* 81 */ 000000, /* 82 */ 000000, /* 83 */ 000000, /* 84 */ 000000, /* 85 */ 000000, /* 86 */ 000000, /* 87 */ 000000, /* 88 */ 000000, /* 89 */ 014201, /* ? */ 000000, /* 91 */ 000000, /* 92 */ 000000, /* 93 */ 000000, /* 94 */ 000000, /* 95 */ 000000, /* 96 */ 000000, /* 97 */ 000000, /* 98 */ 000000, /* 99 */ 036001, /* call */ 036001, /* mcall */ 000000, /* goto */ 000000, /* jump cond */ 000000, /* branch cond */ 000400, /* set nregs */ 000000, /* 106 */ 000000, /* 107 */ 000000, /* 108 */ 000000, /* 109 */ 000000 /* force r0 */ }; /* * C pass 2 header */ struct tnode { int op; int type; int degree; struct tnode *tr1, *tr2; }; struct bnode { int bop; struct tnode *btree; int lbl; int cond; }; struct tname { int nop; int ntype; int elsize; int class; int offset; int nloc; }; struct tconst { int cop; int ctype; int cdeg; int value; }; struct optab { char tabdeg1; char tabtyp1; char tabdeg2; char tabtyp2; char *tabstring; }; struct table { int tabop; struct optab *tabp; }; struct instab { int iop; char *str1; char *str2; }; struct swtab { int swlab; int swval; }; char maprel[]; char notrel[]; int nreg; int isn; int namsiz; int line; char binbuf[518]; char ascbuf[518]; char outbuf[518]; int nerror; struct table cctab[]; struct table efftab[]; struct table regtab[]; struct table sptab[]; struct table lsptab[]; struct instab instab[]; int opdope[]; int nstack; int nfloat; struct tconst czero, cone, fczero; #define swsiz 200 #define ossiz 500 /* operators */ #define EOF 0 #define SEMI 1 #define LBRACE 2 #define RBRACE 3 #define LBRACK 4 #define RBRACK 5 #define LPARN 6 #define RPARN 7 #define COLON 8 #define COMMA 9 #define KEYW 19 #define NAME 20 #define CON 21 #define STRING 22 #define FCON 23 #define SFCON 24 #define INCBEF 30 #define DECBEF 31 #define INCAFT 32 #define DECAFT 33 #define EXCLA 34 #define AMPERA 29 #define AMPER 35 #define STAR 36 #define NEG 37 #define COMPL 38 #define DOT 39 #define PLUS 40 #define MINUS 41 #define TIMES 42 #define DIVIDE 43 #define MOD 44 #define RSHIFT 45 #define LSHIFT 46 #define AND 47 #define OR 48 #define EXOR 49 #define ARROW 50 #define ITOF 51 #define FTOI 52 #define LOGAND 53 #define LOGOR 54 #define EQUAL 60 #define NEQUAL 61 #define LESSEQ 62 #define LESS 63 #define GREATEQ 64 #define GREAT 65 #define LESSP 66 #define LESSEQP 67 #define GREATP 68 #define GREATQP 69 #define ASPLUS 70 #define ASMINUS 71 #define ASTIMES 72 #define ASDIV 73 #define ASMOD 74 #define ASRSH 75 #define ASLSH 76 #define ASSAND 77 #define ASOR 78 #define ASXOR 79 #define ASSIGN 80 #define QUEST 90 #define CALL 100 #define MCALL 101 #define JUMP 102 #define CBRANCH 103 #define INIT 104 #define SETREG 105 #define LOAD 106 #define RFORCE 110 #define BRANCH 111 #define LABEL 112 /* types */ #define INT 0 #define CHAR 1 #define FLOAT 2 #define DOUBLE 3 #define STRUCT 4 #define RSTRUCT 5 #define PTR 010 #define FUNC 020 #define ARRAY 030 /* storage classes */ #define KEYWC 1 #define MOS 4 #define AUTO 5 #define EXTERN 6 #define STATIC 7 #define REG 8 #define STRTAG 9 #define ARG 10 /* Flag bits */ #define BINARY 01 #define LVALUE 02 #define RELAT 04 #define ASSGOP 010 #define LWORD 020 #define RWORD 040 #define COMMUTE 0100 #define RASSOC 0200 #define LEAF 0400 / C operator tables .globl fltused; fltused=. .globl _instab .data _instab: 40.; 1f; 3f; .text; 1:; .data 70.; 1b; 3f 41.; 2f; 4f; .text; 2:; .data 71.; 2b; 4f 30.; 3f; 1b; .text; 3:; .data 31.; 4f; 2b; .text; 4:; .data 32.; 3b; 1b 33.; 4b; 2b 60.; 0f; 1f; .text; 0:; 1:; .data 61.; 1b; 0b 62.; 2f; 5f; .text; 2:; 5:; .data 63.; 3f; 4f; .text; 3:; 4:; .data 64.; 4b; 3b 65.; 5b; 2b 66.; 6f; 9f; .text; 6:; 9:; .data 67.; 7f; 8f; .text; 7:; 8:; .data 68.; 8b; 7b 69.; 9b; 6b 260.; 0b; 1b 261.; 1b; 0b 262.; 2b; 5b 263.; 3b; 4b 264.; 4b; 3b 265.; 5b; 2b 266.; 0b; 1b 267.; 7f; 8f; .text; 7:; 8:; .data 268.; 8b; 7b 269.; 1b; 0b 0 / c code tables-- set condition codes .globl _cctab .data _cctab=. 106.; rest 28.; rest 21.; rest 22.; rest 30.; rest 31.; rest 34.; rest 35.; rest 36.; rest 37.; rest 40.; rest 41.; rest 42.; rest 43.; rest 45.; rest 46.; rest 47.; cc47 48.; rest 60.; cc60 61.; cc60 62.; cc60 63.; cc60 64.; cc60 65.; cc60 66.; cc60 67.; cc60 68.; cc60 69.; cc60 70.; rest 71.; rest 72.; rest 73.; rest 75.; rest 76.; rest 77.; rest 78.; rest 79.; rest 80.; rest 0 .text / relationals cc60: %a,z %ad,zf tstB1 A1 %n*,z %nd*,zf F* tstB1 #1(R) %n,z %nf,zf FC %aw,aw %ab,ab cmpBE A1,A2 %nw*,aw %nb*,ab F* cmpBE #1(R),A2 %n,aw %nf,ad F V cmpB2 A2,R %nw*,ew* %nb*,eb* F* S1* cmpBE #1(R),#2(R1) %nw*,e %nd*,ef F* S1 cmpB1 #1(R),R1 %n,ew* %nf,ed* F S1* V cmpB2 #2(R1),R %n,e %nf,ef F S1 cmpBF R,R1 %nw*,nw* %nb*,nb* FS* S* cmpBE *(sp)+,#2(R) %nw*,n %nd*,nf FS* S cmpB1 *(sp)+,R %n,nw* FS S* cmp (sp)+,#2(R) %n,n %nf,nf SS F V cmpBF (sp)+,R / & as in "if ((a&b) ==0)" cc47: %a,a bitBE A2,A1 %n*,a F* bitBE A2,#1(R) %n,a F bitB2 A2,R %n,e F S1 bit R1,R %n,n FS S bit (sp)+,R / set codes right rest: %n,n %nf,nf H .data .even .text " & 6 % w  5555W- @& ` 7 ? _W-@& B 7"? _ n5W- W- 5 W-%5  @_  _  :  5%1W-2Ne O w C D L P   ~&102:EDFh?  e G , f5%1J I wF_H M _V  _K A 5 eeee *12CS>wN _ %1# " _   t5b 52;  5% 5 55  5 5? 5%*e@wNf$ %0 _ .VZ6 H N  5 _ _  _ 5 ^ 5 _ j 5 n _  r N _ww 5 7  5  &W-{ 5W-} 5 W-  5  @wNw < veb  x7ww wDe   % w7 7 ׯ-  ,#7  .# hB Jdofecsl ӕ- 6 r f e0 $>C~ fWtE Ee0     `w   Ο       w7   0  ~Wp `e0[eӕ?f@ ^VwBw D#@w 8#-<w J#@7 wfww 0#7 wf !!  7  7 7 fwxwt wHwLfw`w\ w*w. r Cd$Y7nF @&HFB@$YfA7   fA & 9 &fA @e&7w@ .data 1:<.text; 0 =.+2; 0.text;.byte %o,%o;1f , ,nz1acei\0> .text \n> <HTXd p%AIY~ : BFRVP#rCSw w&w $w  int nofloat; int peekc; main(argc, argv) char **argv; { /* A1 -> A A2 B A O B1 C B2 D BE L BF P C1 E C2 F F G H H R I R1 J S K I M M N * +1 S +2 C +4 1 +8 z -> 4 c 10 a 14 e 20 n 63 * +0100 */ auto c,snlflg,nlflg,t,smode,m,ssmode; extern fin, fout; smode = nlflg = snlflg = ssmode = 0; if (argc>1) if ((fin = open(argv[1], 0)) < 0) { putchar('?\n'); return; } if (argc>2) if ((fout = creat(argv[2], 0666)) < 0) { putchar('?\n'); return; } loop: c = getc(); if (c!='\n' && c!='\t') nlflg = 0; if (ssmode!=0 && c!='%') { ssmode = 0; printf(".data\n1:<"); } switch(c) { case '\0': printf(".text; 0\n"); flush(); return; case ':': if (!smode) printf("=.+2; 0"); else putchar(':'); goto loop; case 'A': if ((c=getc())=='1' || c=='2') { putchar(c+'A'-'1'); goto loop; } putchar('O'); peekc = c; goto loop; case 'B': switch (getc()) { case '1': putchar('C'); goto loop; case '2': putchar('D'); goto loop; case 'E': putchar('L'); goto loop; case 'F': putchar('P'); goto loop; } putchar('?'); goto loop; case 'C': putchar(getc()+'E'-'1'); goto loop; case 'F': putchar('G'); goto subtre; case 'R': if ((c=getc()) == '1') putchar('J'); else { putchar('I'); peekc = c; } goto loop; case 'H': putchar('H'); goto subtre; case 'I': putchar('M'); goto loop; case 'V': putchar('V'); snlflg++; goto loop; case 'S': putchar('K'); subtre: snlflg = 1; t = 'A'; l1: switch (c=getc()) { case '*': t++; goto l1; case 'S': t =+ 2; goto l1; case 'C': t =+ 4; goto l1; case '1': t =+ 8; goto l1; case '2': t =+ 16; goto l1; } peekc = c; putchar(t); goto loop; case '#': if(getc()=='1') putchar('#'); else putchar('"'); goto loop; case '%': if (smode) printf(".text;"); loop1: switch (c=getc()) { case 'a': m = 16; t = flag(); goto pf; case ',': putchar(';'); goto loop1; case 'i': m = 12; t = flag(); goto pf; case 'z': m = 4; t = flag(); goto pf; case '1': m = 5; t = flag(); goto pf; case 'c': t = 0; m = 8; goto pf; case 'e': t = flag(); m = 20; goto pf; case 'n': t = flag(); m = 63; pf: if ((c=getc())=='*') m =+ 0100; else peekc = c; printf(".byte %o,%o", m, t); goto loop1; case '\n': printf(";1f\n"); ssmode = 1; nlflg = 1; smode = 1; goto loop; } putchar(c); goto loop1; case '\t': if (nlflg) { nlflg = 0; goto loop; } putchar('\t'); goto loop; case '\n': if (!smode) { putchar('\n'); goto loop; } if (nlflg) { nlflg = 0; printf("\\0>\n.text\n"); smode = 0; goto loop; } if (!snlflg) printf("\\n"); snlflg = 0; printf(">\n<"); nlflg = 1; goto loop; case 'X': case 'Y': case 'T': snlflg++; } putchar(c); goto loop; } getc() { auto t, ifcnt; ifcnt = 0; gc: if (peekc) { t = peekc; peekc = 0; } else t = getchar(); if (t==0) return(0); if (t=='{') { ifcnt++; t = getchar(); } if (t=='}') { t = getc(); if (--ifcnt==0) if (t=='\n') t = getc(); } if (ifcnt && nofloat) goto gc; return(t); } flag() { register c, f; f = 0; l1: switch(c=getc()) { case 'w': f = 1; goto l1; case 'i': f = 2; goto l1; case 'b': f = 3; goto l1; case 'f': f = 4; goto l1; case 'd': f = 5; goto l1; case 's': f = 6; goto l1; case 'p': f =+ 16; goto l1; } peekc = c; return(f); } / c code tables .globl _efftab .data _efftab=. 30.; ci30 31.; ci30 32.; ci30 / same as 30 33.; ci30 / same as 31 80.; ci80 70.; ci70 71.; ci70 / - like + 77.; ci77 78.; ci78 75.; ci75 76.; ci76 0 .text / ++,-- prefix, postfix ci30: %ai,n %abp,n %ab,n IB1 A1 %aip,n %adp,n %afp,n I' $^,A1 %nbp*,n %ni*,n %nb*,n F* IB1 #1(R) %nip*,n %ndp*,n %nfp*,n F* I' $^,#1(R) / = ci80: %a,z %ad,zf clrB1 A1 %n*,z %nd*,zf F* clrB1 #1(R) %a,aw %ab,a movBE A2,A1 %ab,n* %a,nw* S* movBE #2(R),A1 %a,n S movB1 R,A1 %n*,aw %nb*,a F* movBE A2,#1(R) %n*,ew* %nb*,e* F* S1* movBE #2(R1),#1(R) %n*,e F* S1 movBE R1,#1(R) %e*,nw* %eb*,n* S* F1* movBE #2(R),#1(R1) %e*,n S F1* movB1 R,#1(R1) %n*,nw* %nb*,n* FS* S* movBE #2(R),*(sp)+ %n*,n FS* S movBE R,*(sp)+ / =| i ci78: %a,a bisBE A2,A1 %a,n S bisB1 R,A1 %n*,a F* bisBE A2,#1(R) %e*,n* S* F1* bisBE #2(R),#1(R1) %e*,n S F1* bisBE R,#1(R1) %n*,e* F* S1* bisBE #2(R1),#1(R) %n*,e F* S1 bisBE R1,#1(R) %n*,n* FS* S* bisBE #2(R),*(sp)+ %n*,n FS* S bisBE R,*(sp)+ / =& i ci77: %a,c bicB1 $!C2,A1 %a,n S com R bicB1 R,A1 %n*,c F* bicB1 $!C2,#1(R) %e*,n S F1* com R bicB1 R,#1(R1) %n*,e F* S1 com R1 bicB1 R1,#1(R) %n*,n FS* S com R bicB1 R,*(sp)+ / =+ ci70: %a,1 I'B1 A1 %aw,aw I A2,A1 %aw,nw* S* I #2(R),A1 %aw,n S I R,A1 %n*,1 F* I'B1 #1(R) %ew*,nw* S* F1* I #2(R),#1(R1) %a,nw* S* movB1 A1',R1 I #2(R),R1 movB1 R1,A1 %a,n S movB1 A1',R1 I R,R1 movB1 R1,A1 %ew*,n S F1* I R,#1(R1) %nw*,n SS F* I (sp)+,#1(R) %n*,n SS F* movB1 #1(R),R1 I (sp)+,R1 movB1 R1,#1(R) / =>> ci75: %n,z %a,1 asrB1 A1 %n*,1 F* asrB1 #1(R) / =<< ci76: %n,z %a,1 aslB1 A1 %n*,1 F* aslB1 #1(R) .data .even / c code tables-- compile to register .globl _regtab .data _regtab=. 106.; cr106 30.; cr30 31.; cr30 32.; cr32 33.; cr32 34.; cr34 35.; cr35 29.; cr29 36.; cr36 37.; cr37 38.; cr38 101.; cr100 80.; cr80 40.; cr40 41.; cr40 / - like + 42.; cr42 43.; cr43 44.; cr43 45.; cr45 46.; cr46 47.; cr47 48.; cr48 49.; cr49 70.; cr70 71.; cr70 72.; cr72 73.; cr73 74.; cr74 75.; cr75 76.; cr76 77.; cr77 78.; cr78 79.; cr79 102.; cr102 51.; cr51 52.; cr52 104.; cr104 0 .text / init expression cr104: %c,n C1 %a,n %af,n A1 / goto cr102: %i,n jmp A1 %n*,n F* jmp #1(R) / call cr100: %a,n %a,nf jsr pc,`A1 %n*,n %n*,nf F* jsr pc,#1(R) %n,n %n,nf F jsr pc,(R) / addressible cr106: %z,n clr R %zf,n clrf R %a,n movB1 A1,R %ad,n movf A1,R %af,n movof A1,R /++,-- prefix cr30: %ai,n %abp,n %ab,n IB1 A1' movB1 A1,R %adp,n %afp,n %a,n I' $^,A1' mov A1,R %nbp*,n %ni*,n %nb*,n F* IB1 #1(R) movB1 #1(R),R %ndp*,n %nfp*,n %n*,n F* I' $^,#1(R) mov #1(R),R / ++,-- postfix cr32: %ai,n %abp,n %ab,n movB1 A1',R IB1 A1 %adp,n %afp,n %a,n mov A1',R I' $^,A1 %nbp*,n %nb*,n %ni*,n F* movB1 #1(R),-(sp) IB1 #1(R) movB1 (sp)+,R %ndp*,n %nfp*,n %n*,n F* mov #1(R),-(sp) I' $^,#1(R) mov (sp)+,R / ! cr34: %n,n FC beq 1f clr R br 2f 1: mov $1,R 2: / &unary cr35: %a,n %af,n mov $A1,R / & unary of auto cr29: %e,n %ef,n mov r5,R add Z,R / *unary cr36: %nbp*,n F* movb *#1(R),R %ndp*,n F* movf *#1(R),R %nfp*,n F* movof *#1(R),R %n*,n F* mov *#1(R),R %abp,n movb *A1,R %adp,n movf *A1,R %afp,n movof *A1,R %a,n mov *A1,R %nbp,n H* movb ~(R),R %ndp,n H* movf ~(R),R %nfp,n H* movof ~(R),R %n,n H* mov ~(R),R / - unary cr37: %n,n %nf,n F negBF R / ~ cr38: %n,n F com R / = cr80: %a,n %ad,nf S movB1 R,A1 %af,nf S movfo R,A1 %nd*,af F* S movf R,#1(R) %n*,a F* movB1 A2,#1(R) movB1 #1(R),R %nf*,af F* S movfo R,#1(R) %n*,e F* S1 movB1 R1,#1(R) movB1 R1,R %ed*,nf S F1* movf R,#1(R1) %ef*,nf S F1* movfo R,#1(R1) %n*,n %nd*,nf FS* S movB1 R,*(sp)+ %nf*,nf FS* S movfo R,*(sp)+ %a,nf S movfi R,R movB1 R,A1 %e*,nf S F1* movfi R,R movB1 R,#1(R1) %n*,nf FS* S movfi R,R movB1 R,*(sp)+ / ^ -- xor cr49: %n,e F S1 xor R1,R %n,n FS S xor R,(sp) mov (sp)+,R / | cr48: %n,a F bisB2 A2,R %n,e* F S1* bisB2 #2(R1),R %n,e F S1 bis R1,R %n,n FS S bis (sp)+,R / & cr47: %n,c F bic $!C2,R %n,e F S1 com R1 bic R1,R %n,n FS S com (sp) bic (sp)+,R / >> cr45: %n,z F %n,1 F asr R %n,c F ash $-C2,R %n,e F S1 neg R1 ash R1,R %n,n SS neg (sp) F ash (sp)+,R / << cr46: %n,z F %n,1 F asl R %n,aw F ash A2,R %n,ew* F S1* ash #1(R1),R %n,e F S1 ash R1,R %n,n SS F ash (sp)+,R / +, - cr40: %n,z F %n,1 F I' R %n,aw %nf,ad F IBF A2,R %n,ew* %nf,ed* F S1* IBF #2(R1),R %n,e %nf,ef F S1 IBF R1,R %n,nw* %nf,nd* SS* F IBF *(sp)+,R %n,n %nf,nf SS F IBF (sp)+,R / * -- R must be odd on integers cr42: %n,aw %nf,ad F mulBF A2,R %n,ew* %nf,ed* F S1* mulBF #2(R1),R %n,e %nf,ef F S1 mulBF R1,R %n,n %nf,nf SS F mulBF (sp)+,R / / R must be odd on integers cr43: %n,aw F T sxt R- div A2,R- %n,ew* F T sxt R- S1* div #2(R1),R- %n,e F T sxt R- S1 div R1,R- %n,n SS F T sxt R- div (sp)+,R- %nf,ad F divf A2,R %nf,ed* F S1* divf #2(R1),R %nf,ef F S1 divf R1,R %nf,nf SS F divf (sp)+,R / =* cr72: %a,aw %ad,ad movB1 A1',R mulBF A2,R movB1 R,A1 %af,nf SS movof A1',R mulf (sp)+,R movfo R,A1 %a,ew* %ad,ed* movB1 A1',R S1* mulBF #2(R1),R movB1 R,A1 %aw,n %ad,n S mulBF A1',R movBF R,A1 %a,n SS movB1 A1',R mulBF (sp)+,R movB1 R,A1 %nw*,n %nd*,nf FS* S mulBF *(sp),R movB1 R,*(sp)+ %n*,n FS* SS movB1 *2(sp),R mul (sp)+,R movB1 R,*(sp)+ %nf*,nf FS* movof *(sp),R movf R,-(sp) S mulf (sp)+,R movfo R,*(sp)+ / =/ ; R must be odd on integers cr73: %a,aw movB1 A1',R sxt R- divBF A2,R- movB1 R-,A1 %a,n SS movB1 A1',R sxt R- div (sp)+,R- movB1 R-,A1 %e*,n SS F1* movB1 #1(R1),R sxt R- div (sp)+,R- movB1 R-,#1(R1) %n*,n FS* SS movB1 *2(sp),R sxt R- div (sp)+,R- movB1 R-,*(sp)+ %ad,ad movf A1',R divf A2,R movf R,A1 %ad,ef movf A1',R S1 divf R1,R movf R,A1 %ad,nf SS movf A1',R divf (sp)+,R movf R,A1 %af,nf SS movof A1',R divf (sp)+,R movfo R,A1 %nd*,nf FS* SS movf *8(sp),R divf (sp)+,R movf R,*(sp)+ %nf*,nf FS* SS movof *8(sp),R divf (sp)+,R movfo R,*(sp)+ / =mod; R must be odd on integers cr74: %a,aw movB1 A1',R sxt R- div A2,R- movB1 R,A1 %a,n SS movB1 A1',R sxt R- div (sp)+,R- movB1 R,A1 %e*,n SS F1* movB1 #1(R1),R sxt R- div (sp)+,R- movB1 R,#1(R1) %n*,n FS* SS movB1 *2(sp),R sxt R- div (sp)+,R mov R,*(sp)+ / =| cr78: %a,a bisBE A2,A1' movB1 A1,R %a,n S bisB1 R,A1' movB1 A1,R %n*,a F* bisBE A2,#1(R) movB1 #1(R),R %e*,n* S* F1* bisBE #1(R1),#2(R) movB1 #2(R),R %e*,n S F1* bisBE R,#1(R1) movB1 #1(R1),R %n*,e* F* S1* bisBE #2(R1),#1(R) movB1 #1(R),R %n*,e F* S1 bisBE R1,#1(R) movB2 #1(R),R %n*,n* FS* S* bisBE #2(R),*(sp) movB2 *(sp)+,R %n*,n FS* S bisBE R,*(sp) mov *(sp)+,R / =^ -- =xor cr79: %aw,n S xor R,A1' mov A1,R %ab,n SS movb A1',R xor R,(sp) mov (sp)+,R movb R,A1 %n*,n FS* movB1 *(sp),-(sp) S xor R,(sp) movB1 (sp)+,R movB1 R,*(sp)+ / =& cr77: %a,c bicB1 $!C2,A1' movB2 A1,R %a,n S com R bicB1 R,A1' movB1 A1,R %e*,n S F1* com R bicB1 R,#1(R1) movB1 #1(R1),R %n*,e F* S1 com R1 bicB1 R1,#1(R) movB1 #1(R),R %n*,n FS* S com R bicB1 R,*(sp) movB1 *(sp)+,R / =>> cr75: %a,c movB1 A1',R ash $-C2,R movB1 R,A1 %a,n SS movB1 A1',R neg (sp) ash (sp)+,R movB1 R,A1 %n*,n SS F1* movB1 #1(R1),R neg (sp) ash (sp)+,R movB1 R,#1(R1) / =<< cr76: %a,aw movB1 A1',R ash A2,R movB1 R,A1 %a,n SS movB1 A1',R ash (sp)+,R movB1 R,A1 %n*,n SS F1* movB1 #1(R1),R ash (sp)+,R movB1 R,#1(R1) / =+ cr70: %aw,aw I A2,A1' mov A1,R %aw,nw* S* I #2(R),A1' mov A1,R %aw,n S I R,A1' mov A1,R %ew*,nw* S* F1* I #2(R),#1(R1) mov #1(R1),R %a,n %ad,nf SS movB1 A1',R IBF (sp)+,R movB1 R,A1 %af,nf SS movof A1,R IBF (sp)+,R movfo R,A1 %ew*,n S F1* I R,#1(R1) mov #1(R1),R %nw*,n SS F* I (sp)+,#1(R) mov #1(R),R %n*,n %nd*,nf SS F* movB1 #1(R),R1 IBF (sp)+,R1 movB1 R1,#1(R) movBF R1,R %nf*,nf SS F* movof #1(R),R1 IBF (sp)+,R1 movfo R1,#1(R) movf R1,R / int -> float cr51: %aw,n movif A1,R %nw*,n F* movif #1(R),R %n,n F movif R,R / float, double -> int cr52: %nf,n F movfi R,R .data .even .text / c code tables-- expression to -(sp) .globl _sptab .data _sptab=. 106.; cs106 30.; cs30 31.; cs30 32.; cs32 33.; cs32 35.; cs35 36.; cs36 40.; cs40 41.; cs40 47.; cs47 48.; cs48 0 .text / name cs106: %z,n %zf,n clrB1 -(sp) %aw,n movB1 A1,-(sp) / ++,-- prefix cs30: %ai,n %abp,n I A1 mov A1,-(sp) %aw,n I' $^,A1 mov A1,-(sp) %nbp*,n %ni*,n F* I #1(R) mov #1(R),-(sp) %nip*,n F* mov #1(R),-(sp) I' $^,#1(R) / ++,-- postfix cs32: %ai,n %abp,n mov A1,-(sp) I A1 %aip,n mov A1,-(sp) I' $^,A1 %nbp*,n %ni*,n F* mov #1(R),-(sp) I #1(R) %nip*,n F* mov #1(R),-(sp) I' $^,#1(R) / & unary cs35: %i,n mov $A1,-(sp) / * unary cs36: %nbp*,n F* movb *#1(R),R mov R,-(sp) %ndp*,n F* movf *#1(R),R movf R,-(sp) %nfp*,n F* movof *#1(R),R movf R,-(sp) %n*,n F* mov *#1(R),-(sp) %abp,n movb *A1,R mov R,-(sp) %adp,n movf *A1,R movf R,-(sp) %afp,n movof *A1,R movf R,-(sp) %a,n mov *A1,-(sp) %nbp,n H* movb ~(R),R mov R,-(sp) %ndp,n H* movf ~(R),R movf R,-(sp) %nfp,n H* movof ~(R),R movf R,-(sp) %n,n H* mov ~(R),-(sp) / + cs40: %n,1 FS I' (sp) %n,aw FS I A2,(sp) %n,nw* FS S* I #2(R),(sp) %n,n FS S I R,(sp) / & cs47: %n,c FS bic $!C2,(sp) %n,n FS S com R bic R,(sp) / | cs48: %n,a FS bisB2 A2,(sp) %n,n* FS S* bisB2 #2(R),(sp) %n,n FS S bis R,(sp) .data .even .text mcctab.o5b P0nnvv????TT?T?T???????.??.AK?Z?f??s????j"#$%()*+-./0<=>?@ABCDEFGHIKLMNOPtstC A GBtstC #(I) GEcmpL A,B GBcmpL #(I),B GAVcmpD B,I GBKJcmpL #(I),"(J) GBKIcmpC #(I),J GAKJVcmpD "(J),I GAKIcmpP I,J GDKBcmpL *(sp)+,"(I) GDKAcmpC *(sp)+,I GCKBcmp (sp)+,"(I) KCGAVcmpP (sp)+,I bitL B,A GBbitL B,#(I) GAbitD B,I GAKIbit J,I GCKAbit (sp)+,I HA_cctab#restcc47cc60efftab.oxZ `?????????????  T/T/CTTTTT?hyy??TT?T?':?FXT?i??T?T?+?9?K?rs{? !PLF$G$MNKhL|MC A M' $^,A GBMC #(I) GBM' $^,#(I) clrC A GBclrC #(I) movL B,A KBmovL "(I),A KAmovC I,A GBmovL B,#(I) GBKJmovL "(J),#(I) GBKImovL J,#(I) KBGJmovL "(I),#(J) KAGJmovC I,#(J) GDKBmovL "(I),*(sp)+ GDKAmovL I,*(sp)+ bisL B,A KAbisC I,A GBbisL B,#(I) KBGJbisL "(I),#(J) KAGJbisL I,#(J) GBKJbisL "(J),#(I) GBKIbisL J,#(I) GDKBbisL "(I),*(sp)+ GDKAbisL I,*(sp)+ bicC $!F,A KAcom I bicC I,A GBbicC $!F,#(I) KAGJcom I bicC I,#(J) GBKIcom J bicC J,#(I) GDKAcom I bicC I,*(sp)+ M'C A M B,A KBM "(I),A KAM I,A GBM'C #(I) KBGJM "(I),#(J) KBmovC A',J M "(I),J movC J,A KAmovC A',J M I,J movC J,A KAGJM I,#(J) KCGBM (sp)+,#(I) KCGBmovC #(I),J M (sp)+,J movC J,#(I) asrC A GBasrC #(I) aslC A GBaslC #(I) _efftab#ci30ci80Lci70$ci77ci78ci75hci76|regtab.o'L & ?@?C?C ?F?M?Y?Y?d?d??s??s????????????????????????#?#?#?K?K?K??t??????????? ???!??0?????O??]??]??g?p?p?|T?T?????+T?A?\?y????T???????? ? ?# ?0 ??C ?] ?` ?i ?Tt ? ?? ? ? ? ? ?T ?T ? ? ? ? ?? ?? ? ? ?T ?T ? ? ?? ?? ?0 ?TD ?] ??s ? ?T ? ??   ? T T ?. ?. ?D ?g ?g ? ?  ? T?A ?s   ? ? ?- ?[  ? T? ? =?QgTT?T??>?R??T??3Y?w???;K?`Tr???T?????8?k?v????jJjj !"#$"%l&ze$P(`)`*+,-.:/01FDGDHIXJKL0MNOf34hE A jmp A GBjmp #(I) jsr pc,`A GBjsr pc,#(I) GAjsr pc,(I) clr I clrf I movC A,I movf A,I movof A,I MC A' movC A,I M' $^,A' mov A,I GBMC #(I) movC #(I),I GBM' $^,#(I) mov #(I),I movC A',I MC A mov A',I M' $^,A GBmovC #(I),-(sp) MC #(I) movC (sp)+,I GBmov #(I),-(sp) M' $^,#(I) mov (sp)+,I GEbeq 1f clr I br 2f 1: mov $1,I 2: mov $A,I mov r5,I add Z,I GBmovb *#(I),I GBmovf *#(I),I GBmovof *#(I),I GBmov *#(I),I movb *A,I movf *A,I movof *A,I mov *A,I HBmovb ~(I),I HBmovf ~(I),I HBmovof ~(I),I HBmov ~(I),I GAnegP I GAcom I KAmovC I,A KAmovfo I,A GBKAmovf I,#(I) GBmovC B,#(I) movC #(I),I GBKAmovfo I,#(I) GBKImovC J,#(I) movC J,I KAGJmovf I,#(J) KAGJmovfo I,#(J) GDKAmovC I,*(sp)+ GDKAmovfo I,*(sp)+ KAmovfi I,I movC I,A KAGJmovfi I,I movC I,#(J) GDKAmovfi I,I movC I,*(sp)+ GAKIxor J,I GCKAxor I,(sp) mov (sp)+,I GAbisD B,I GAKJbisD "(J),I GAKIbis J,I GCKAbis (sp)+,I GAbic $!F,I GAKIcom J bic J,I GCKAcom (sp) bic (sp)+,I GAGAasr I GAash $-F,I GAKIneg J ash J,I KCneg (sp) GAash (sp)+,I GAGAasl I GAash B,I GAKJash #(J),I GAKIash J,I KCGAash (sp)+,I GAGAM' I GAMP B,I GAKJMP "(J),I GAKIMP J,I KDGAMP *(sp)+,I KCGAMP (sp)+,I GAmulP B,I GAKJmulP "(J),I GAKImulP J,I KCGAmulP (sp)+,I GATsxt I- div B,I- GATsxt I- KJdiv "(J),I- GATsxt I- KIdiv J,I- KCGATsxt I- div (sp)+,I- GAdivf B,I GAKJdivf "(J),I GAKIdivf J,I KCGAdivf (sp)+,I movC A',I mulP B,I movC I,A KCmovof A',I mulf (sp)+,I movfo I,A movC A',I KJmulP "(J),I movC I,A KAmulP A',I movP I,A KCmovC A',I mulP (sp)+,I movC I,A GDKAmulP *(sp),I movC I,*(sp)+ GDKCmovC *2(sp),I mul (sp)+,I movC I,*(sp)+ GDmovof *(sp),I movf I,-(sp) KAmulf (sp)+,I movfo I,*(sp)+ movC A',I sxt I- divP B,I- movC I-,A KCmovC A',I sxt I- div (sp)+,I- movC I-,A KCGJmovC #(J),I sxt I- div (sp)+,I- movC I-,#(J) GDKCmovC *2(sp),I sxt I- div (sp)+,I- movC I-,*(sp)+ movf A',I divf B,I movf I,A movf A',I KIdivf J,I movf I,A KCmovf A',I divf (sp)+,I movf I,A KCmovof A',I divf (sp)+,I movfo I,A GDKCmovf *8(sp),I divf (sp)+,I movf I,*(sp)+ GDKCmovof *8(sp),I divf (sp)+,I movfo I,*(sp)+ movC A',I sxt I- div B,I- movC I,A KCmovC A',I sxt I- div (sp)+,I- movC I,A KCGJmovC #(J),I sxt I- div (sp)+,I- movC I,#(J) GDKCmovC *2(sp),I sxt I- div (sp)+,I mov I,*(sp)+ bisL B,A' movC A,I KAbisC I,A' movC A,I GBbisL B,#(I) movC #(I),I KBGJbisL #(J),"(I) movC "(I),I KAGJbisL I,#(J) movC #(J),I GBKJbisL "(J),#(I) movC #(I),I GBKIbisL J,#(I) movD #(I),I GDKBbisL "(I),*(sp) movD *(sp)+,I GDKAbisL I,*(sp) mov *(sp)+,I KAxor I,A' mov A,I KCmovb A',I xor I,(sp) mov (sp)+,I movb I,A GDmovC *(sp),-(sp) KAxor I,(sp) movC (sp)+,I movC I,*(sp)+ bicC $!F,A' movD A,I KAcom I bicC I,A' movC A,I KAGJcom I bicC I,#(J) movC #(J),I GBKIcom J bicC J,#(I) movC #(I),I GDKAcom I bicC I,*(sp) movC *(sp)+,I movC A',I ash $-F,I movC I,A KCmovC A',I neg (sp) ash (sp)+,I movC I,A KCGJmovC #(J),I neg (sp) ash (sp)+,I movC I,#(J) movC A',I ash B,I movC I,A KCmovC A',I ash (sp)+,I movC I,A KCGJmovC #(J),I ash (sp)+,I movC I,#(J) M B,A' mov A,I KBM "(I),A' mov A,I KAM I,A' mov A,I KBGJM "(I),#(J) mov #(J),I KCmovC A',I MP (sp)+,I movC I,A KCmovof A,I MP (sp)+,I movfo I,A KAGJM I,#(J) mov #(J),I KCGBM (sp)+,#(I) mov #(I),I KCGBmovC #(I),J MP (sp)+,J movC J,#(I) movP J,I KCGBmovof #(I),J MP (sp)+,J movfo J,#(I) movf J,I movif A,I GBmovif #(I),I GAmovif I,I GAmovfi I,I _regtab#cr106Jcr30jcr32cr34cr35cr29cr36"cr37lcr38zcr100$cr80cr40`cr42cr43cr45cr46:cr47cr48cr49cr70Dcr72cr73Xcr74cr75cr760cr77cr78cr79cr102cr51cr52cr104sptab.o l???*?8?8?I?^?^?w?????? ????7?U?h????????????$?/?;??L?Z??j????j <!<#b$j()/0clrC -(sp) movC A,-(sp) M A mov A,-(sp) M' $^,A mov A,-(sp) GBM #(I) mov #(I),-(sp) GBmov #(I),-(sp) M' $^,#(I) mov A,-(sp) M A mov A,-(sp) M' $^,A GBmov #(I),-(sp) M #(I) GBmov #(I),-(sp) M' $^,#(I) mov $A,-(sp) GBmovb *#(I),I mov I,-(sp) GBmovf *#(I),I movf I,-(sp) GBmovof *#(I),I movf I,-(sp) GBmov *#(I),-(sp) movb *A,I mov I,-(sp) movf *A,I movf I,-(sp) movof *A,I movf I,-(sp) mov *A,-(sp) HBmovb ~(I),I mov I,-(sp) HBmovf ~(I),I movf I,-(sp) HBmovof ~(I),I movf I,-(sp) HBmov ~(I),-(sp) GCM' (sp) GCM B,(sp) GCKBM "(I),(sp) GCKAM I,(sp) GCbic $!F,(sp) GCKAcom I bic I,(sp) GCbisD B,(sp) GCKBbisD "(I),(sp) GCKAbis I,(sp) _sptab#cs106cs30cs32<cs35bcs36jcs40cs47cs48# #define JBR 1 #define CBR 2 #define JMP 3 #define LABEL 4 #define DLABEL 5 #define ESW 6 #define EROU 7 #define FOR 8 #define JSW 9 #define MOV 10 #define CLR 11 #define COM 12 #define INC 13 #define DEC 14 #define NEG 15 #define TST 16 #define ASR 17 #define ASL 18 #define SXT 19 #define CMP 20 #define ADD 21 #define SUB 22 #define BIT 23 #define BIC 24 #define BIS 25 #define MUL 26 #define DIV 27 #define ASH 28 #define XOR 29 #define TEXT 30 #define DATA 31 #define BSS 32 #define EVEN 33 #define MOVF 34 #define MOVOF 35 #define MOVFO 36 #define ADDF 37 #define SUBF 38 #define DIVF 39 #define MULF 40 #define CLRF 41 #define CMPF 42 #define NEGF 43 #define TSTF 44 #define CFCC 45 #define JEQ 0 #define JNE 1 #define JLE 2 #define JGE 3 #define JLT 4 #define JGT 5 #define JLO 6 #define JHI 7 #define JLOS 8 #define JHIS 9 #define BYTE 100 struct node { char op; char subop; struct node *forw; struct node *back; struct node *ref; int labno; char *code; int refc; }; struct { int combop; }; struct optab { char *opstring; int opcode; } optab[] { "jbr", JBR, "jeq", CBR | JEQ<<8, "jne", CBR | JNE<<8, "jle", CBR | JLE<<8, "jge", CBR | JGE<<8, "jlt", CBR | JLT<<8, "jgt", CBR | JGT<<8, "jlo", CBR | JLO<<8, "jhi", CBR | JHI<<8, "jlos", CBR | JLOS<<8, "jhis", CBR | JHIS<<8, "jmp", JMP, "/esw", ESW, "/for", FOR, ".globl",EROU, "mov", MOV, "clr", CLR, "com", COM, "inc", INC, "dec", DEC, "neg", NEG, "tst", TST, "asr", ASR, "asl", ASL, "sxt", SXT, "cmp", CMP, "add", ADD, "sub", SUB, "bit", BIT, "bic", BIC, "bis", BIS, "mul", MUL, "ash", ASH, "xor", XOR, ".text",TEXT, ".data",DATA, ".bss", BSS, ".even",EVEN, "movf", MOVF, "movof",MOVOF, "movfo",MOVFO, "addf", ADDF, "subf", SUBF, "divf", DIVF, "mulf", MULF, "clrf", CLRF, "cmpf", CMPF, "negf", NEGF, "tstf", TSTF, "cfcc", CFCC, 0, 0 }; char line[512]; struct node first; char *curlp; int nbrbr; int nsaddr; int redunm; int iaftbr; int njp1; int nrlab; int nxjump; int ncmot; int nrevbr; int nchange; int isn 20000; int debug; char *lasta; char *lastr; char *firstr; char revbr[] { JNE, JEQ, JGT, JLT, JGE, JLE, JHIS, JLOS, JHI, JLO }; char regs[12][20]; #define RT1 10 #define RT2 11 #define FREG 5 #define NREG 5 #define LABHS 127 #define OPHS 57 struct optab *ophash[OPHS]; struct { int int;}; struct { char lbyte; }; main(argc, argv) char **argv; { register int niter, maxiter, isend; extern end; extern fin, fout; int nflag; if (argc>1 && argv[1][0]=='+') { argc--; argv++; debug++; } if (argc>1 && argv[1][0]=='-') { argc--; argv++; nflag++; } if (argc>1) { if ((fin = open(argv[1], 0)) < 0) { printf("C2: can't find %s\n", argv[1]); exit(1); } } else fin = dup(0); if (argc>2) { if ((fout = creat(argv[2], 0666)) < 0) { fout = 1; printf("C2: can't create %s\n", argv[2]); exit(1); } } else fout = dup(1); lasta = firstr = lastr = sbrk(2); maxiter = 0; opsetup(); do { isend = input(); movedat(); niter = 0; do { refcount(); do { iterate(); clearreg(); niter++; } while (nchange); rmove(); } while (jumpsw()); output(); if (niter > maxiter) maxiter = niter; lasta = firstr; } while (isend); flush(); fout = 2; if (nflag) { printf("%d iterations\n", maxiter); printf("%d jumps to jumps\n", nbrbr); printf("%d inst. after jumps\n", iaftbr); printf("%d jumps to .+2\n", njp1); printf("%d redundant labels\n", nrlab); printf("%d cross-jumps\n", nxjump); printf("%d code motions\n", ncmot); printf("%d branches reversed\n", nrevbr); printf("%d redundant moves\n", redunm); printf("%d simplified addresses\n", nsaddr); printf("%dK core\n", ((lastr+01777)>>10)&077); flush(); } } input() { register struct node *p, *lastp; register int op; lastp = &first; while ((op = getline()) >= 0) { switch (op.op) { case LABEL: p = alloc(sizeof first); if (line[0] == 'L') { p->combop = LABEL; p->labno = getnum(line+1); p->code = 0; } else { p->combop = DLABEL; p->labno = 0; p->code = copy(line); } break; case JBR: case CBR: case JMP: case JSW: p = alloc(sizeof first); p->combop = op; if (*curlp=='L' && (p->labno = getnum(curlp+1))) p->code = 0; else { p->labno = 0; p->code = copy(curlp); } break; default: p = alloc(sizeof first); p->combop = op; p->labno = 0; p->code = copy(curlp); break; } p->forw = 0; p->back = lastp; lastp->forw = p; lastp = p; p->ref = 0; if (op==EROU) return(1); } lastp->forw = 0; return(0); } getline() { register char *lp; register c; lp = line; while (c = getchar()) { if (c==':') { *lp++ = 0; return(LABEL); } if (c=='\n') { *lp++ = 0; return(oplook()); } *lp++ = c; } return(-1); } getnum(ap) char *ap; { register char *p; register n, c; p = ap; n = 0; while ((c = *p++) >= '0' && c <= '9') n = n*10 + c - '0'; if (*--p != 0) return(0); return(n); } output() { register struct node *t; register struct optab *op; register int byte; t = &first; while (t = t->forw) switch (t->op) { case LABEL: printf("L%d:", t->labno); continue; case DLABEL: printf("%s:", t->code); continue; default: if ((byte = t->subop) == BYTE) t->subop = 0; for (op = optab; op->opstring!=0; op++) if (op->opcode == t->combop) { printf("%s", op->opstring); if (byte==BYTE) printf("b"); break; } if (t->code) printf("\t%s\n", t->code); else if (t->op==JBR || t->op==CBR) printf("\tL%d\n", t->labno); else printf("\n"); continue; case JSW: printf("L%d\n", t->labno); continue; case 0: if (t->code) printf("%s", t->code); printf("\n"); continue; } } copy(ap) char *ap; { register char *p, *np; char *onp; register n; int na; na = nargs(); p = ap; n = 0; if (*p==0) return(0); do n++; while (*p++); if (na>1) { p = (&ap)[1]; while (*p++) n++; } onp = np = alloc(n); p = ap; while (*np++ = *p++); if (na>1) { p = (&ap)[1]; np--; while (*np++ = *p++); } return(onp); } opsetup() { register struct optab *optp, **ophp; register int *p; for (optp = optab; p = optp->opstring; optp++) { ophp = &ophash[((p[0]+p[1].lbyte)&077777) % OPHS]; while (*ophp++) if (ophp > &ophash[OPHS]) ophp = ophash; *--ophp = optp; } } oplook() { register struct optab *optp; register char *lp, *op; static char tmpop[32]; struct optab **ophp; op = tmpop; for (lp = line; *lp && *lp!=' ' && *lp!='\t';) *op++ = *lp++; *op++ = 0; while (*lp=='\t' || *lp==' ') lp++; curlp = lp; ophp = &ophash[((tmpop[0].int+tmpop[2])&077777) % OPHS]; while (optp = *ophp) { op = optp->opstring; lp = tmpop; while (*lp == *op++) if (*lp++ == 0) return(optp->opcode); if (*lp++=='b' && *lp++==0 && *--op==0) return(optp->opcode + (BYTE<<8)); ophp++; if (ophp >= &ophash[OPHS]) ophp = ophash; } if (line[0]=='L') { lp = &line[1]; while (*lp) if (*lp<'0' || *lp++>'9') return(0); curlp = line; return(JSW); } curlp = line; return(0); } refcount() { register struct node *p, *lp; static struct node *labhash[LABHS]; register struct node **hp; for (hp = labhash; hp < &labhash[LABHS];) *hp++ = 0; for (p = first.forw; p!=0; p = p->forw) if (p->op==LABEL) { labhash[p->labno % LABHS] = p; p->refc = 0; } for (p = first.forw; p!=0; p = p->forw) { if (p->op==JBR || p->op==CBR || p->op==JSW) { p->ref = 0; lp = labhash[p->labno % LABHS]; if (lp && p->labno == lp->labno) { p->ref = lp; lp->refc++; continue; } for (lp=first.forw; lp; lp = lp->forw) { if (lp->op==LABEL && p->labno==lp->labno) { p->ref = lp; lp->refc++; break; } } } } for (p = first.forw; p!=0; p = p->forw) if (p->refc==0) p->refc++; } iterate() { register struct node *p, *rp; nchange = 0; for (p = first.forw; p!=0; p = p->forw) { if ((p->op==JBR||p->op==CBR||p->op==JSW) && p->ref) { rp = nonlab(p->ref); if (rp->op==JBR && rp->labno) { nbrbr++; p->labno = rp->labno; decref(p->ref); rp->ref->refc++; p->ref = rp->ref; nchange++; } } if (p->op==JBR) { while (p->forw && p->forw->op!=LABEL) { nchange++; iaftbr++; if (p->forw->ref) decref(p->forw->ref); p->forw = p->forw->forw; p->forw->back = p; } rp = p->forw; while (rp && rp->op==LABEL) { if (p->ref == rp) { p->back->forw = p->forw; p->forw->back = p->back; p = p->back; decref(rp); nchange++; njp1++; break; } rp = rp->forw; } xjump(p); p = codemove(p); } } } xjump(ap) { register int *p1, *p2, *p3; int nxj; nxj = 0; p1 = ap; if ((p2 = p1->ref) == 0) return(0); for (;;) { while ((p1 = p1->back) && p1->op==LABEL); while ((p2 = p2->back) && p2->op==LABEL); if (!equop(p1, p2)) return(nxj); p3 = alloc(sizeof first); p3->combop = LABEL; p3->labno = isn; p3->ref = 0; p3->code = 0; p3->refc = 1; p3->back = p2->back; p3->forw = p2; p2->back->forw = p3; p2->back = p3; p1->combop = JBR; p1->ref = p3; p1->labno = isn++; p1->code = 0; nxj++; nxjump++; nchange++; } } codemove(ap) struct node *ap; { register struct node *p1, *p2, *p3; p1 = ap; if (p1->op!=JBR || (p2 = p1->ref)==0) return(p1); while (p2->op == LABEL) if ((p2 = p2->back) == 0) return(p1); if (p2->op!=JBR && p2->op!=ESW && p2->op!=FOR) return(p1); p2 = p2->forw; p3 = p1->ref; while (p3) { if (p3->op==JBR || p3->op==ESW) { if (p1 == p3) return(p1); ncmot++; nchange++; if (p2->back->op==FOR) { p2->back->op = JBR; p2->back->labno = p2->labno; p2->back->ref = p2; p2->refc++; p2->back->code = 0; } p1->back->forw = p2; p1->forw->back = p3; p2->back->forw = p3->forw; p3->forw->back = p2->back; p2->back = p1->back; p3->forw = p1->forw; decref(p1->ref); return(p2); } else p3 = p3->forw; } return(p1); } rmove() { register struct node *p; register char *cp; register int r; int r1, flt; for (p=first.forw; p!=0; p = p->forw) { if (debug) { for (r=0; r<2*NREG; r++) if (regs[r][0]) printf("%d: %s\n", r, regs[r]); printf("-\n"); } flt = 0; switch (p->op) { case MOVF: case MOVFO: case MOVOF: flt = NREG; case MOV: dualop(p); if ((r = findrand(regs[RT1], flt)) >= 0) { if (r == flt+isreg(regs[RT2]) && p->forw->op!=CBR) { p->forw->back = p->back; p->back->forw = p->forw; redunm++; continue; } } repladdr(p, 0, flt); r = isreg(regs[RT1]); r1 = isreg(regs[RT2]); dest(regs[RT2], flt); if (r >= 0) if (r1 >= 0) savereg(r1+flt, regs[r+flt]); else savereg(r+flt, regs[RT2]); else if (r1 >= 0) savereg(r1+flt, regs[RT1]); source(regs[RT1]); continue; case ADDF: case SUBF: case DIVF: case MULF: flt = NREG; case ADD: case SUB: case BIC: case BIS: case MUL: case DIV: case ASH: dualop(p); repladdr(p, 0, flt); source(regs[RT1]); dest(regs[RT2], flt); if (p->op==DIV && (r = isreg(regs[RT2])>=0)) regs[r+1][0] = 0; continue; case CLRF: case NEGF: flt = NREG; case CLR: case COM: case INC: case DEC: case NEG: case ASR: case ASL: case SXT: singop(p); dest(regs[RT1], flt); continue; case TSTF: flt = NREG; case TST: singop(p); repladdr(p, 0, flt); source(regs[RT1]); continue; case CMPF: flt = NREG; case CMP: case BIT: dualop(p); source(regs[RT1]); source(regs[RT2]); repladdr(p, 1, flt); continue; case CBR: case CFCC: continue; default: clearreg(); } } } jumpsw() { register struct node *p, *p1; register t; int nj; t = 0; nj = 0; for (p=first.forw; p!=0; p = p->forw) p->refc = ++t; for (p=first.forw; p!=0; p = p1) { p1 = p->forw; if (p->op == CBR && p1->op==JBR && p->ref && p1->ref && abs(p->refc - p->ref->refc) > abs(p1->refc - p1->ref->refc)) { p->subop = revbr[p->subop]; t = p1->ref; p1->ref = p->ref; p->ref = t; t = p1->labno; p1->labno = p->labno; p->labno = t; nrevbr++; nj++; } } return(nj); } abs(x) { return(x<0? -x: x); } equop(ap1, p2) struct node *ap1, *p2; { register char *cp1, *cp2; register struct node *p1; p1 = ap1; if (p1->combop != p2->combop) return(0); if (p1->op>0 && p1->opcode; cp2 = p2->code; if (cp1==0 && cp2==0) return(1); if (cp1==0 || cp2==0) return(0); while (*cp1 == *cp2++) if (*cp1++ == 0) return(1); return(0); } decref(ap) { register struct node *p; p = ap; if (--p->refc <= 0) { nrlab++; p->back->forw = p->forw; p->forw->back = p->back; } } nonlab(ap) struct node *ap; { register struct node *p; p = ap; while (p && p->op==LABEL) p = p->forw; return(p); } alloc(an) { register int n; register char *p; n = an; n++; n =& ~01; if (lasta+n >= lastr) { if (sbrk(2000) == -1) { write(2, "Out of space\n", 14); exit(1); } lastr =+ 2000; } p = lasta; lasta =+ n; return(p); } clearreg() { register int i; for (i=0; i<2*NREG; i++) regs[i][0] = '\0'; } savereg(ai, as) char *as; { register char *p, *s; p = regs[ai]; s = as; if (source(s)) return; while (*p++ = *s) if (*s++ == ',') break; *--p = '\0'; } dest(as, flt) char *as; { register char *s; register int i; s = as; if ((i = isreg(s)) >= 0) regs[i+flt][0] = 0; while ((i = findrand(s, flt)) >= 0) regs[i][0] = 0; while (*s) { if ((*s=='(' && (*(s+1)!='r' || *(s+2)!='5')) || *s++=='*') { for (i=flt; icode; p2 = regs[RT1]; while (*p2++ = *p1++); regs[RT2][0] = 0; } dualop(ap) struct node *ap; { register char *p1, *p2; register struct node *p; p = ap; p1 = p->code; p2 = regs[RT1]; while (*p1 && *p1!=',') *p2++ = *p1++; *p2++ = 0; p2 = regs[RT2]; *p2 = 0; if (*p1++ !=',') return; while (*p2++ = *p1++); } findrand(as, flt) char *as; { register char *s; register int i; register char *p; for (i = flt; i='0' && s[1]<='4' && s[2]==0) return(s[1]-'0'); return(-1); } check() { register struct node *p, *lp; lp = &first; for (p=first.forw; p!=0; p = p->forw) { if (p->back != lp) abort(); lp = p; } } source(ap) char *ap; { register char *p1, *p2; p1 = ap; p2 = p1; if (*p1==0) return(0); while (*p2++); if (*p1=='-' && *(p1+1)=='(' || *p1=='*' && *(p1+1)=='-' && *(p1+2)=='(' || *(p2-2)=='+') { while (*p1 && *p1++!='r'); if (*p1>='0' && *p1<='4') regs[*p1 - '0'][0] = 0; return(1); } return(0); } repladdr(p, f, flt) struct node *p; { register r; int r1; register char *p1, *p2; static char rt1[50], rt2[50]; if (f) r1 = findrand(regs[RT2], flt); else r1 = -1; r = findrand(regs[RT1], flt); if (r1 >= NREG) r1 =- NREG; if (r >= NREG) r =- NREG; if (r>=0 || r1>=0) { p2 = regs[RT1]; for (p1 = rt1; *p1++ = *p2++;); if (regs[RT2][0]) { p1 = rt2; *p1++ = ','; for (p2 = regs[RT2]; *p1++ = *p2++;); } else rt2[0] = 0; if (r>=0) { rt1[0] = 'r'; rt1[1] = r + '0'; rt1[2] = 0; nsaddr++; } if (r1>=0) { rt2[1] = 'r'; rt2[2] = r1 + '0'; rt2[3] = 0; nsaddr++; } p->code = copy(rt1, rt2); } } movedat() { register struct node *p1, *p2; struct node *p3; register seg; struct node data; struct node *datp; if (first.forw == 0) return; datp = &data; for (p1 = first.forw; p1!=0; p1 = p1->forw) { if (p1->op == DATA) { p2 = p1->forw; while (p2 && p2->op!=TEXT) p2 = p2->forw; if (p2==0) break; p3 = p1->back; p1->back->forw = p2->forw; p2->forw->back = p3; p2->forw = 0; datp->forw = p1; p1->back = datp; p1 = p3; datp = p2; } } if (data.forw) { datp->forw = first.forw; first.forw->back = datp; data.forw->back = &first; first.forw = data.forw; } seg = -1; for (p1 = first.forw; p1!=0; p1 = p1->forw) { if (p1->op==TEXT|p1->op==DATA||p1->op==BSS) { if (p1->op == seg || p1->forw&&p1->forw->op==seg) { p1->back->forw = p1->forw; p1->forw->back = p1->back; p1 = p1->back; continue; } seg = p1->op; } } } cvopt $1.s $1.i rm a.out as $1.i if -r a.out rm $1.i mv a.out $1.o ar r tab.a $1.o rm $1.o Z..x.yc00.czc00.o{c01.c|c01.o}c02.c~c02.oc03.cc03.oc04.cc04.oc0h.cc0t.sc10.cc11.cc12.cc1h.cc1t.scctab.scvoptcvopt.cefftab.sregtab.ssptab.stab.ac20.ctrcstatement too long syntax error in type statement redeclaration missing ( in array declarator syntax error in dimension statement inappropriate or gratuitous array declarator syntax error in subscript bound illegal character common variable is a parameter or already in common common syntax error subroutine/blockdata/function not first statement subroutine/function syntax error block data syntax error redeclaration in external external syntax error implicit syntax error subscript on non-array incorrect subscript count subscript out of range subscript syntax error DATA syntax error DATA semantics error equivalence inconsistency equivalence syntax error separate common blocks equivalenced common block illegally extended by equivalence common inconsistency created by equivalence DATA table overflow () imbalance in expression expression syntax error illegal variable in equivalence Storage initialized twice by DATA non array/function used with subscripts/arguments goto syntax error illegal return continue, return, stop, call, end, or pause syntax error assign syntax error if syntax error I/O syntax error do or I/O iteration error do end missing illegal statement in block data multiply defined labels undefined label dimension mismatch expression syntax error end of statement in hollerith constant array too large B table overflow unrecognized statement .ZR0.% \  w ,75*w -9<*w -;w)M A@lGGpGK_Kw f#hU ,AM M M34 Nw 8%=w l&Bw px -w w w w -w lA=w ,;w $lf0^*D*subroutinefunctionblockdataexternaldimensioncommonequivalencedataformatimplicitInput file? _ &Bw wrw V !,AE w E,AS,Aw .  w w   $ (w | functionBw : logical*1logicalinteger*1integer*2integerdoublecomplexdoubleprecisioncomplexreal*8realw p w f w w w N $ (w 58,Aw E8,AU,A& w    w  & ,A  ,Aw  $ "w @\D + +  7DD3.Afw   K W/ w w F >w v BLU ,Aw n 2w d .w Z w w J5,Aw  &@0A0A0A .A.AU@,A $  (w p II I *w H e&w  w 2 ,Aw   (& ew   U,A2Aw  $  "w v (bIw d &*w   (w  w F 58,Aw U,Aw * $ (w w eA=w 6&W/0@h$+aB- Bh$ a   XMe @ ,  /ɋ w w r  A;w w 0w (w Vw Z  A#,AE .A w 0A0A2Aw #`3 .A2AeHxw `"main: w R"%n.: %n_  |AL.AF `f eC 9 &w ,Aw " rval%dp; %n_ ,AE  EÜL)w ! %c%di2 w ! stst; d%d+%d.  ew (#w 6# e>fW(Qw , Mw B ,  (Bw %W,<w  8w z W( w r%T1  @V1lV12V1T1 T1sT1T15T1 w @ , ) @w : ,w w &w ,A5E  w  T1T1f e ?=w 58,Aw  R1,AE  5,A T15@,AE2Aw !7`E R1 ,V1V15@,AT1  E R1V1B2Aw P!` T1 7E2AV1 R15@,A3-0A0Aw @lV13 2Aw U@,A30A0A@lV1w  32A&w e0A,2A22AT1 ww w L/2&=Bw @6 &w *x  $8 w sA=w (.%d: w  Bw  x w w e-Dw 2w 67w L/%w  Bw   x ww e % w  BDw  -6Dw L w w D h & x^~b\D*^*doif(endfileendassigncallcontinuereturngotopausestopreadprintwriterewindbackspaceformatdataw $w  ( w *$ F/w ,$ / $2 /e$w &  &w VE w  $w w w n gas%d goto; 2f .$/w Nt%d: &w w &w w %$w &w w w  do2w  do1w %d; o%d 2:    #e2 / &#2 /w +/r#w  goto; t%d o%d: w w ^7 "4w ifw JE  w R; 1f w jw D1: w r w 0; .%d w  $  w $w  (w (w z  &Tw n  (M w z,Aw nUmvw w w jw Bw @Uasw zw w &WtWow  (w &w ` lval; .%d  w `'w ( w 0 lval9" w v ,Aalw  alvalw .A `w ; d%dw 6,AUw w w ; %d.w w ; 5@,A0Aw %n+œ,AE w %n. w r%n_ ,Aw H œ-Aw J rval%d" w  ,Aarw  arval""w 8-Aw %d. ,A"w  rval%d; c%d "= w FGw @w /E w w ' w w w ")w w w w  e w w "w 6,Aw pw  stsp; ft+%d. e&  "$ w Xw Lw t callw w f; %n.; ft+%d.; %d.; -\Z>TR>N.A -" +"*'" w  lval; c%d w w w  stsp; ft+%d. e w w  stst; ft+%d. e& "$ w *w &w w ; .Aw |5EE w J  w : EL)w %c%d" "" ,A""w w w   EE Pngpiprdvmpsbadltleeqnegtgentanor@h$ w ?w ^ goto; .%d 3W(w  $w : agoto $w , cagoto W( <D@ )W,w Vfw  cgoto ы ɋw #w w  .%d @ , )w  0 w #w (&w >w : ɋ w 4 3 0w w v stop; %d !w   w w N paus; %d  :w N %w , retrn ɋw 4 &-. A w  58,AU,Aw w `"""*w w 0 w 5 $ (, & W(#w L/v "  $w fe "w z %s ɋw  (w z )w Z endio iowuioruiowfiorfiowp@h$ w w &w L/w (7:w r iDN=w  lval; .%d w & w  $L/W(Bw <w && ,AE .A ew  slist1; d%d 2:w 0 w j slist3 iow B w P slist2; 2bw R w T=w Vw Fw @ !,&fȕ) w 8w fw "w  w ޕ,w  "w )w w  %s  (w ) bksprewienflw  $_w w  Vw w  Mw w   w w w  8 5w |w    w b8w   w J8w w   w .Tw w  w jw l  B w 4w  "w w D w w 0  w w &w v,AE w ^*  e2  e *7 w cDNCLw 7 58,AU,Aw w ,AE    w !E8,A "e~]  w < w 9w ;w w .w w "w 6w 9 <* h6w b-5w 6.bss B6 w &ft: .=.+%d. !R1w .data w base:  0/]58,Aw ,A2AE ( % 5,A w %n. = %d.  2A w .comm %n,%d. e5,A w v%n_ = %d.  w 52A7`4w L%n_ = base+%d. w f4x$$8w .globl main w .globl %n.  0.,AEG K2AHR1D C"ew .bss .globl %n %n: .=.+%d. .text (w .data .globl %n %n: Cw Bw w w \.=.+%d. .text ew 7 Zw 1 s f'w .%d: <=w & & 2 R1 2 R1e w 3w &3R1ew .even w Jw X r i& & 2 R1ew 4w @ > \&\w 9w 9w V \0> w R19w   cw N w Bcw nR1 9D B(@9 w c%d: w %o =w 4f R1 S$   `# ׭%%.w h p%EWW 7|0HLDLwj0 7h07^07T0DLS 5& W & W- @0        5 4 & W- W+ @0 p `  `Be&    W,& w @V-1 *7,AE -.A*B `w 0 d%d: %d.  w  ..; w  %d.; ,Aw %d. efw f R17w l  &R1 V d=7 Bw L (ww f!ww & 58,Aw v,A7 0005E  5@,A-/0A-/ 2A/2Aw h 7`/ W(  w 4E8/U/ -A E7Zl2A  Ý"T2fw n   g w Z `W*  Zw  V7 fr"TCCLw 7 S" /@/-.  ׭4" e5.)׭"%W/ W, 6,w/ʋ,  wFw w w R17w w-l.#R1 `.w .=.+%d. .text w @. w .=.+%d. .text  @" w l.=.+%d. `` &w J%o  e "7 w @ w l "4,f Aɋ ɋ V%ы  -&@ A    ,AJ  - Aif w  w =@w "AR \! b  AX!p! @ w w : /,w &B . ׭ .   w ^!W A w d A ** _Unknown diagnostic/usr/fort/errorsf CL0W p C`&f@w ;@w  ;Zw  ;A@w ;ыBw <$>  e07K* F*7C* 'f@h$ w W,w  W) CLJ)" 7 W =w CL@h$x"""",#(w  w w .CL w W. Bw Z$9R0Wh1 h$+ w CL  & Rw J7 3ҕ  Uw w w $ @h$ w  WeWd W+W-w WeRRw &@h$ CL@h$   &Bw @pG  ,(et#7( Lb#e,A7 X#.$ Symbol table overflow W+W- w  ` .false..true.**/*-+.lt..le..eq..ne..gt..ge..not..and..or.(),=5,A w && a 3\XM,A58,AU,A pG ЋeCLfw  r f w e07(M @ x%J7 ' 7 = 0 p `e07'   d s ' ".7'ef D 7 'UW A Ufh r e0c r e0ce0#7 T' h5 fW = @h$h$$ N @0p `7'ѕh  7& UW A &hW Aw Jww :=-&w .,'w &( %f w )=@&  ( ) Ћ T&7N& B  8 &75& 0&% %  "(&7% w 47E    7  c     EOF on input &f&DՋ EW %w 9N s c  d0 o( nw 9 ~Cw CL n@ w 9 X@w 9@w 9 < 2  rf e0w |9AW  eaAfEL)w %c%c%dw ?irlc??gw   w  w 7$w .rDN= -Aw  Ef,AE .A&Pp  @<*w .L/wHw @L/&w L/7<w L/70=w L/ E >** Temp file? f.tmp1f.tmp2-#w 2w RfA=w FdA=5,A w CLw *  !,&E3\*,A E3*.Aabsiabsdabsaintintidintamodmodamax0amax1max0max1dmax1amin0amin1min0min1dmin1floatifixsignisigndsigndimidimsnglrealdrealaimagdimagdblecmplxdcmplxconjgdconjgexpdexpcexpdcexpalogdlogclogdclogalog10dlog10sindsincsindcsincosdcosccosdccostanhsqrtdsqrtcsqrtdcsqrtatandatanatan2datan2dmodcabsdcabs"D" @"" D" D "D"Bbb$&Hf"Df"Df"D"Df"Df""Df"D"DDb,AE w  f& .Aw   w  f@qDaRqw ( $ w  "w | %w nŜ-ADq@fA7. fA @e71@.  1 @ fA7~.  fA & 9 &fA @e&7JwF@@.f&55 .b  wX .P l.H E ` s qDD`fD @ `    D D  D&` f@Df@D@ www X&w LUw w&w w mf11.o)l0% \  w w w w_w hU   34 4w bw ZBw Rx Dw @w :w 2w .*w $lw w subroutinefunctionblockdataexternaldimensioncommonequivalencedataformatimplicitInput file? _ )X9h9yYhYIhhhh  )  H8HXhxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize pass1"fptrap getline flush perror lookup getype ssubr sfunc sbloc sextr sdime scomm sequi sdata sform simpl stype isagn ptemp funok signoff fopen fcreat lookid tfil1 tfil2 tfildiag mes2\emes2hblankchscan1stmtabsublstf12.o\0&Bw hww !E w ESw  w w  $ (w  functionBw  logical*1logicalinteger*1integer*2integerdoublecomplexdoubleprecisioncomplexreal*8real )9) symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize stype"getype"rtyptab"sfunc1 lookup getsym error sdime1 funtabhtvaltabf13.ojLw w  w w w  $ (w 58w E8U& w    w &   w l $ "w \V P L  7>3xxxxx  xsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sdime"sdime1":getsym error geti dimu f14.o1Xfw   K W/ w w >w U w  2w .w  w w 5w &@ U@ $  (w V  xxxxxxxxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize scomm"getsym sdime1 error getid lookid ncomf15.ojd  w e&w  w w   (& ew  Uw  $  "w | (nw j w `  (w T 999))9))symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize ssubr"sfunc"sbloc"sfunc1"funok#getsym error f16.o@Lw 58w Uw  $ (w w exx 8symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sextr"sequi"4getsym putc error ptemp f17.oɪ8z4w 6&W/0@+aB- B a   ~e @ ,  /ɋ w Xsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize simpl"getype chrtab error mf21.o"Xw w w w w w XI symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize pass2"signon signoff calloc salloc equiv entry f22.og" #E  w w `3 exX`nn w main: w %n.: %n_  zLF `f eC 9 &w Rw F rval%dp; %n_ E  EÜw  %c%di2 w  stst; d%d+%d.  exxxxxxx)))xx)x8))symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize calloc"entry"Pdeclimpl size getc getw xbuf code typ main`subrnfunctnblocd f23.o4|w w  e fW(Qw Mw B ,  (Bw W,<w 8w z W( w   @l2 s5 w d@ , ) @w L ,w >w 8w 05E  w  )9 xsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize equiv"getsym consub eqvtab error declimpl perror setln getln equsetf24.oƵ8Lf e w 58w E  5 5@w 7`  ,5@  h Bw V`  7B 5@3-w @l3 w U@3@lw  3&w e,2 w xxxxIxIxIxIxxxxxxxxxxxxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize salloc"eqvtab error declimpl size perror  mf31.o}w w Bw t &w x   w sw .%d: w Bw x w w e-w 2w |xw rjw f Bw ^ xwJw Fe > w 6 0w *-$w w w doif(endfileendassigncallcontinuereturngotopausestopreadprintwriterewindbackspaceformatdata x98)9)9I9Yx)9Y) )Ih(8HXhxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize pass3"ifstmt"isagn signon signoff getline lookup sasgn error perror doend sform sdata sdo sassi scall scont sretu sgoto sif spaus sstop sread sprin swrit srewi sback sendf blocks blockp code ptemp dotabp scan3fmttabtfmtlststmtabsublststmtab1sublst1sendf33.opw w  ( w * w , 2ew  &w E w  $w w w gas%d goto; 2f jw bt%d: &w Nw J&w Dw <%$w 2&w ,w $w  do2w  do1w %d; o%d 2:    e2  &2 w +w goto; t%d o%d: yiiy ) 9YIyI) 9Y 9YIIIyyyIsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sdo"dobeg"doend"getlab e2 error lvalue rvalue code convrt dou dotabp edotab dotab gen6f34.oew w 7 "4w ifw E  w ; 1f w w 1: w w ; .%d w  $  w w  (w (I Y)i)symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sif"e2 error rvalue code ifstmt iserror getsym geti genop getlab newline f35.o0w  &Tw  (M w w Umvw w w w w Uasw w w &WtWow v (w lw d lval; .%d  w J' x)i )iyYsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sasgn"sassi"rerror e2 lvalue rvalue code convrt geti getsym getlab genop newline name f36.o  w w lval9" w v alw alvalw  `w ; d%dw 6Uw w w ~; %d.w w j; 5@w V%n+œE w >%n. w 0%n_ w  œw  rval%d" w  arw arval""w 8w %d. "w rval%d; c%d "= w FGw @w /E w w ' w w w ")w w w w  e w w "w 6w pw stsp; ft+%d. ej&  "$ w Xw Lw 2 callw w $; %n.; ft+%d.; %d.; - -" +"*'" w lval; c%d w w w stsp; ft+%d. e w w ~ stst; ft+%d. ef& "$ w *w &w w ; w 5EE w   w Ew %c%d" "" ""w w w   EE PngpiprdvmpsbadltleeqnegtgentanorI9x9x9xY99xx9x99xIx9x9x9x9Yyx9999x999x99h9xsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize lvalue"rvalue"convrt"type"2funcappl"pname"error lookup code iserror genop typ newline functn size aryapplsimparyjarydopeBpbitbmaxtypoptabfapp1 f37.oT@ w ?w goto; .%d 3W(w  $w agoto $w cagoto W( <D@ )W,w Vfw cgoto ы ɋw n#w fw ` .%d @ , )w F 0 w <#w 4&w .w &H  )9symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sgoto"intexp"e2 code getsym error getlab rvalue convrt chrtab stmlistf38.o+@ ɋ w  3 0w w stop; %d !w   w w paus; %d  w %w retrn ɋw &-~ w r 58Uw \w X"""*w Hw D0 I9)I9))Y)YIXIxxiy)symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sstop"scall"spaus".sretu"Vscont"piserror"~ptemp code geti getsym error declimpl e11 funcappl f39.o:0Bw 5 $ (, & W(#w  "  $w fe "w %s ɋw  (w )w endio iowuioruiowfiorfiowp@ w Jw F&w >8w 27,w (iw  lval; .%d w & w  $W(Bw w && E  ew slist1; d%d 2:w w slist3 iow w ~ slist2; 2bw l w b=w Vw Fw R@ !,&fȕ) w 4w fw "w  w ޕ,w  "w )27<w w %s  (w ) bksprewienfl)IyY9y)xIyxxY9 ))symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sread"swrit" sprin"sback"srewi"sendf" getsym error geticon e2 lvalue rvalue iserror convrt code chrtab blocks blockp doend genop levzer dobeg intexp ptemp newline nelem getfmtiotypelistlstitmchkelbksp2rewi7enfl<f32.o;PHw  $_w w  Vw $w  Mw 6w   w Jw w  8 5w |fw    w bw   w Jw dw   w .w Hw  w w 2 B w 4w  "w w w w  w w &w E w ^* e2 e  |w xcw n7 h58Uw Vw PE    w 8!E8 "e] )x    y99IxYxxi)xx  symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize e1"e2"e11"error getsym blockp blocks declimpl conu ptemp functn funimpl blocke3$e46e5Ne5aJe6je6afe7ae7e8e8ae9e9ae10appl    !"#$%&'mf41.o7$L| w w w w w w w w w 9 Hisymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize pass4"signon flush dope formts globls constn fopen bsss tfil2 f42.oydw -w .bss  w ft: .=.+%d. !w .data w base:  ]58w E ( % 5 w r%n. = %d.   w R.comm %n,%d. e5 w .%n_ = %d.  w 7`w %n_ = base+%d. w )xxxxxxIxI symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize bsss"code size declimpl cdata dodata dattab pass2f43.oQk@Xx$$8w .globl main w .globl %n.  EG KHD C"ew .bss .globl %n %n: .=.+%d. .text (w f.data .globl %n %n: Cw BBw 6w 0w ,.=.+%d. .text e9 symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize globls"code dattab onedata error perror f44.olpw 7 w 1 s fw .%d: <w   2  2 e w 3w 3ew .even w |w x r if ^ 2 ew F4w @@ > \&\w "w w \0> 999988 8998 ))symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize formts"strout"setln getln code error perror putc xbuf f45.oV"w w  cw N w cw  D B(@ w c%d: w %o w 4f  S$   `# ׭VO.w F B6EWW 7w  777S 5)H9H  HIIYIsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize constn"evalcon"error perror code getcon setln getln xbuf negflg packconjf46.oJ(& W & W- @0        5 4 & W- W+ @0 p `  `Be&    W,& w @V-4 (7E -*B `w d%d: %d.  w ..; w %d.; w %d. e)xxxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize getcon"dope"code f47.oP$fw w  &  d7 Bw  (ww f!ww 58w 7y5E  5@-V-H 8w 27`. W(  w E8U  E7l  ÝT2fw    g w  `W*  Zw V7 fTCw 7 @x-t  ׭f e5T)׭N%W/ W, :,w/ʋ,  wFw w w w w-# w .=.+%d. .text w  w .=.+%d. .text  @" w .=.+%d. `` &w h%o  e "7 Hw D w > "4,y 99III99YYYIII  I99i IIIIIIII  )))9Y Y   )symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize cdata"dodata"onedata"fcompare"code getcon error getsym consub size geti setln getln declimpl evalcon dattab contab perror qsort negflg repfact holround dloop)*+,-./0123456789:mfx1.o'x,f Aɋ ɋ V%ы symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize lookup"fx2.oA8| &@    J -ifw  w @w R  & @ w jw f/,w \&B 8 ׭v 8 ^ w W  w  ** _Unknown diagnostic/usr/fort/errorsyhYxYYh9hYhYXhYsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize error"perror"2tput tdecml mes2mes1errfil&ich8mes3fx3.o4X@f 0W p C`&f@w @w w A@w ы9symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize geti"ptemp"&putc putw fx4.o8$ `Bw >  e07 7 'f@ w W,w  W) J)" 7 W w@xR(w D w w . w W. Bw 9R0Wh1^+ w   & Rw 7 3ҕ  Uw w w $ @ w  WeWd W+W-w WeRRw &@ @   &Bw   e7 e7 T Symbol table overflow W+W- w  ` .false..true.**/*-+.lt..le..eq..ne..gt..ge..not..and..or.(),=  )9 symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize getsym"getid"lookid"chrtab"lookup error geti holround bastabsrconstjlstchr`eosletnumperRnumst|isnumnexponovflTeovfljfx5.o T5 w & a 3\~58U  ЋexXxxxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize declimpl"getname"2fx6.o2(fw  r f w e07 symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize tput""tdecml"td fx7.oL @ xsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize signon"signoff"pass2 pass3 pass4 passtabfx8.o.5tZ7  7  0 p `e07& d s ' ".7ef D 7 UW Ufh r e0c r e0ce0#7 T h5 fW @$ N @0p `7ѕh  7 UW hW w ww :=-&w .,'w &( %f w )=@&  ( ) Ћ X7R B  8 &78 0% %  L7 w E  B < 7 6 c     EOF on input II99II(II(I()I)) symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize getline"isagn"<levzer"zerror getc chrtab getlino\err1&get1mesLemesZnlflgZfx9.oGTp&f&DՋ EW %w N s c  d0 o( nw  ~Cw  n@ w  X@w ~@w p < 2  rf e0w <AW  eaAsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize code"putc getname cstrbcchrxcdeccoctcnamRcgetfxa.oU:4fE2w %c%c%dw ?irlc??gsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize genop"newline"*code typ"2fxb.o0@w   w w 7w r yxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize geticon"getlab"getsym geti ptemp fxc.o6(w  EfE &Pp  @xxxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize size"nelem"error fxd.o.l0Xpw ww &w 7w 7w  E  88)8I)8989symsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize setln"getln"tfil2 tfildiag fopen getc getw xbuf fxe.o2@ Temp file? f.tmp1f.tmp2symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize tfildiag"tfil1"#tfil2"*mes1emes1#fxf.o&4-w 2w fw d)88symsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize sform"sdata"ptemp error fxg.olLL5 w w T  &E3\J E3Jabsiabsdabsaintintidintamodmodamax0amax1max0max1dmax1amin0amin1min0min1dmin1floatifixsignisigndsigndimidimsnglrealdrealaimagdimagdblecmplxdcmplxconjgdconjgexpdexpcexpdcexpalogdlogclogdclogalog10dlog10sindsincsindcsincosdcosccosdccostanhsqrtdsqrtcsqrtdcsqrtatandatanatan2datan2dmodcabsdcabs"D" @"" D" D "D"Bbb$&Hf"Df"Df"D"Df"Df""Df"D"DDbxxxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize funimpl"getname lookup funtabTfuntabttyptabJfxh.ol@E w  f& w   w  f@qDaRqw  $ w  "w  %w ŜDq@xxxsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint2condblcondcplxconcplxcondata ibuf obuf tbuf line eline ifno efno errp errb eerrb symtab esymtab esymp symtp namebuf enamebuf namep symbuf esymbuf ch ch1 progt holquo nxtaloc imptab nerror temp functm edata dsize consub"getsym geti error geticon fxx.oAuHsymsize@linsize namsizesmblsizeintconrealconlogconlog1conint1conint2condblcondcplxconcplxcondata$ibuf$obuf$ tbuf$ line$eline$ifno$efno$errp$ errb$"eerrb$.symtab$.esymtab$nesymp$nsymtp$pnamebuf$renamebuf$"namep$"symbuf$Eesymbuf$ch$ch1$progt$holquo$nxtaloc$imptab$nerror$Dtemp$Ffunctm$Hedata$Jdsize!dholround#dimu$eqvtab$Tconu$dou$blockp$dotabp$ dotab$ edotab$Hfunctn$Hblocks$Nnegflg$Jrepfact$Lcontab$dattab$Txbuf$N<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/ example of UNIX fortran / calling interface to machine code / this example is a function that / returns the single precision / sum of all of its single precision arguments. / for example: / f = sum(1.,2.,3.) / sets f to 6. .globl sum. / defination of entry .globl retrn / reference of return sum.: / entry point value / location of return value .+2 / pointer to execution code setf / no d/f i/l modes guaranteed mov *2(sp),r0 / arg count mov r3,r1 / r3 points to arg list tst (r1)+ / zeroth arg is old r3 clrf fr0 / start of actual function 1: addf *(r1)+,fr0 / add in each argument sob r0,1b / for each argument movf fr0,value / make returned value available jmp retrn / actual return .bss value: .=.+4 / space for return value / synopsis: / 1. save registers r3, sp / 2. arg list (pointers to values) / begins at 2(r3) / 3. entry name is name of function / followed by "." / 4. first word after entry point is / location of return value. this is / true for both functions and subroutines / 5. second word after entry point is / pointer to pdp-11 code body / 6. return is expedited by a jump to / the globl routine "retrn" Z...errorsfc1f1o.af2o.af3o.af4o.afxo.asum.s w w x@ r E  y    w@  @Ջ E 7vf  r f  e0 t f2 w*Wp3e @7EA pw0w w Black Jack  0  4w new game 7 m7  w  jvfr (7dVm`  Tw up 6N2J+ 7 :-4w (*  mm wm  w Insurance? w 7` 7` 7 7 - Y- w You have black jack! Z7`j 7`d D6-2J Jw dSplit pair? w B , - #- w 4Double down? w cm v m-$  -  w You bust w~ w Hit? w w  w You have t ( hw: Kw Dealer has D@ m0<m,8 0 w ^ = blackjack (-  w 6 = bust 7  -+ w  =  n - e w-hw Shuffle 4L$ $Z T -F  t l:-  w  p 7  r7w7      7 x w w Action $ h & w You break even w You win $ w You lose $   A23456789TJQKHSDC w5V  & 6 % w F5FC5@$ C! C-C      &  .%5N@'-zC# tC  pC lC      &  .% buw-B%@e5N ?  @eH@eHe w$ B! B-B< b = b > b & < %5>'-DB# >B  :B 6B: b ; b < b & < % &uw-@%@e5N -2> b @eH@eHe n,w@w2w 2@ p=xC NNmf  wp2w ^2@ C$P@eJ@P@B C @H0@e*@AWtA]H@ C w 2 xC5 ,CZ5,CT5, DN5,DH5,DB50,D<50,C65 ,C0w f w ^w V w Nw w w zw r5 xC,C5xC,C BC0xC `DC !7!4!10xC `DC!&!#BC0xC `DC !!!0xC `DC!!  xC5 ,CZ5,CT5, DN5,DH5,DB50,D<50,C65 ,C0w f w ^w V w Nw w w zw r5 xC,D5xC, D BC0xC `DC !7!4!10xC `DC!&!#BC0xC `DC !!!0xC `DC!! CvD,=?d xFT8Z5  w z@e7 V:w f5 w R@e 7 .:w > 0w 05) &w  !w  w w w "w w 0 w 0w #) R<w w w w w w w w w w w w w w ~ w vw nw > w 6w . w &w w  w w L5@c  @|;@ @`R &L5CcDc  T;C R  @:;C R w - @" w-w -5 -:U:5W-W-e -\; -V; @`Wp u`-2; -(; @`t5`-; "; -; ; @wN,w <,5 57-: -:-:e5p7-: -:-:eW-(-B7-|:-p:-x: -b:-j:e(- 7-L:-F:-N: -8:-@:e(@wv+w d+ d9, AT95@ ,C 3N !  +(9u r5 w-9e@e -N !5 $ w8@ w*w * H" w*886 6 C 7@8C3C2 C5 x d ~   3 CD7L8 e5^ P[e48 `Ue2(8 pOeq8C78 EV5= ;EJ57 F5E<5    7b87 b877   7@87 6877 77 77 ~7 77r7l774747b77T7 CCsC x& 2 8 : L ^ j 477 7477 7n4C3 DCw ( 6* 66 5%5 @e&6 4%N 5  5w6 w(w (w63@ R2 t6@ R2N  $ V6N N - *6/ "66 5%@e&6 4%N 5@- w5 5  $ 7 5w'w 'uu@w'w ' -5555H7 5 5e-5w~5wz5 )uw-j5eN N P05 u-w:5uew(5@w('w ' -5n25f  D 5455 4f  Hw-4% 4"eN 2  N P055 5 (u-e 4w~4@w~&w l& -t41@_D\4555 w-F4?@e 57 84/5 ,@eCt C @ rdtCE C @ rdPH@eHeu-w33H 3Nf  w3u3w-3+eN 0  Nf 0 5Hu-u u-e 43w&3@w&% VBw  w w "w w 0 w 0w w w w w tw bw P w >w , p5xCAe N Jefp5xCAe 2q5xCAe C &    %eq%CTw #@ R2  4xD11e1 @ 4 7z1 \Cj1 4%5 @ C@ C@ C@ C@ C@ C@ C@ C@ @ D@ XD@ A AC phD@@ @ C r @Bt @tPpxC wh"w V" 5 5 @ M B0 D0Ne18N $ $ @ %  $@ 5C@@ $5* $- $ $ / /AA R2>A R2w!w |! @t5@E5 r/ N N _J P/N N - 55(/ 2 xNZZ &6@ C N/ $N z. x $. N/- $N z ( $q $) $ e $p $  + $ x.( 'o $- $o $- $o $p $p $ w w   @ 5@@A5 $ww @t5A ru%q $ k $@5@HA5  $ -Ne18N $wzw hA rNea $8@t $wJw 8@   x>BZ $(- r 7 - -@e& $5%ww A r NA r  rfA r<&fNA R2eww )  ) b  ww n p, 1`VC f, )\, 7N,wLw :@, 72,  |)w(w - ,, -,j+7 +W-3@ 5@ 2e2 A rd A rd5 @ AWpd+p@ 5@@ @ C @ ^(5W->+W-.+ -(+7 +w w l(5 N  *W-  w*ww  *B*u * ` w-*-e *N N -N *5 z*  8 wZ*wV*ewB* wDw 2  G&*u * j - *0 $w-))e )N -N N 5 )  N w) ew)ww   7 |) )@ 5VC v  J  T7b) J)   N)   4)\A R2 D") @ 5VC@@5dA R2 A 7rJ&%-B&-8&W--(&W-< -(W-<-& %ww  R5 55w-~(e@e5"w`(N pA R2wH(wJw 8 7 0( 70( M 5%   ,@ H@ M'~A   -4%  ' A   A   .' 1`VC'A ~ 'A ~ A   r'  ,5f'  D57 V'A R2w@w . &5 5 ' @t@]ww '5 a h &5 1 8 e&8@t@me5ww &@ 5 @ @- wx&wvw d v%A R2 nN& N&  w-6&  .&AAA R2 *@ww 7 % % < 85ww  % 7 %@e 4   64N L4 R  64N L4N 64 AAA `4e  BBA `4e >wb C 4 EC`fC K"e  "@@ b(C C @@ b(Ce 05005000w&0, |$ &fV1 N1@J1D1w ZZ$T$, N$  N -.$-$$#$t5 $E5Pff % #N 8!7 #ww  #$-!  ! r e0 $ r Ne0 $. $ $ -# $N  j# $w^w L $  $w<w *@7,*#5 W-@@ A Am ,C @ ww 5 tW-t@ @t @aAt pCv t"5 @ev2  @ww "55 h " . @e-l"2@e - X= w-F"@e5 8"@e Z= "f  @ww  55@ 5@ 55`@ ww  55@ 5@ 55`@ ww ~ @ 5Cr!u l! t "w-T!3e@eE55 @t5N ^(&@ &C  %w A A@ r<w ww  f .#%f .#% f .#% f .#%f .#% f .#%f .#%f .#% & f .#%w@w .@ p=xC  AAm 1`Bww "55555555B  B  5 bB   B  L@e@e&@e&@e& %eN J5 * x@e@e&@e&@e& %eW--@e@e&@e& &%  5 +  5  _%55  F 5 w-je@t 5C jN N -L5Nfff2&f 'e .Nffff& 'e  Pf 6(   $B R2ue  B | w @ww  5 q= N fff %e_&W-kN fff %eYW-p  1 -W-nW-b W-r ׯpAe r}      @e=ׯ/  N ff &%ww np l5 q= W-kNff &% ,(W-r= W-nW-bW-0 W-9@e= w w A ru@t5 @5W- @55 Nf 6( Nf 6( Nf 6( Nf 6(  w8 w &   N ^(@- w w  @ @w CvD?d x()))b))(5  w z@ 7 w f5 w R@7 w > 0w 05) &w !w  w w w "w w 0 w 0w #) w w w w w w w w w w w w w w ~ w vw nw > w 6w . w &w w  w w L5@c  4@@ @`R &L5CcDc  C R  @C R w  w zw@@ 5 @w w 5 -z?-x -r @`Wp u`-N -D @`t5`-  -  @w w 5 5B- --e5- --eW-(-:-x-l-T -^-Fe(->-H-B-* -4-e(@w" w  , @5@ ,C 2N !  *u x5 w-e@e N !5 & w@ww v@@ @ 0 B-T@@ @ A 1l @B 05 5tr "@5 @ 3A ABWpduN H5 @ 5VB@ 5@ A B r5A 5r5`@ w~ C 7@^C3C2 C x8.. /.,/,/:.  3 CC7 \_ 0\ V2 PqC7 ~E> p;E 7 E x >  7 7z :  xp7 f7\ ReX 7H > F72,77|7"7 CCsC xf/r/x/z//// T7 <B7 <0C3 CCw - 7  5e-w|wx -uw-h!@e5N -N F5 u-w0uew@ww  -df 0 D 55 f   w-% "eN - b N F55 5 ^u-e wt@wtw b -j@_N2R555 Vw-<?@e5w-00u-,@eCt C @ rdtCE C @ rdPH@eHeu-wH Nf  wuw-~+eN - b Nf  5 u-u u-e *w@ww wDe   % $w7 7 ׯ-  "JP7  .HP2B J2d83o23xh3fr3e3c3s2l ӕ- C r f e0 1 /& ҋ D~'0B4B f v Le0 9e z p&  m  $~  $  $~ w7   0  vWp `e0[eӕ?f BBN<4BN  7$  7& 7 f@w  w f@)wwfw @e7 8Bwfw wf"w wfw w >Bwwf*wBJ wzf@wZ wV DBwTwXf@w> w: JBw2 w4f@w w PBwwf@7F @&HF%d. ...       **t+L,,JZ H| d,, @< Chess /usr/lib/bookkqrbnp PNBRQK a b c d e f g h q q q q k k k k r n b b n r ppnbrqkrnb%s: %d:%d%d Resign time = %d Illegal move resignfirstclockwhiteblackscoreeh? Draw by repetition White wins Black wins Stale mate /bin/mailmailchess/usr/bin/mailmailchesso-o-ooooo-oooambiguous ijklmnopqrstuvwxyz{|}~%$-  *@)@   @)@ w Type y to move first: w  2 Iw z 1111 2222 3333 4444 1234 1234 1234 1234 1 ---- ---- ---- ---- 2 ---- ---- ---- ---- 3 ---- ---- ---- ---- 4 ---- ---- ---- ----? ׭ yw .L@@f@f@f  x w You win  JZ X "w jw  D w I have a force win: "7 e w 2 W  &@  W   w  xW   #@ w o # w QED        9y # * W w  fw  @1  &@1 U &@1  U W   w LIllegal move &  w of w  e1e1e1@  &w |vxw rjhfdZ``mRmP w $Dw  w. f  w&  U%&tE7 E7E7f @@   @  A Ze 7  Ef `C  r CpDD`@ "`  "w &D D w D&`w f @  f mWp/w@Ef L  @@f@f@fxe?e CD  7 ;L@@f@f@fx @ & &w tw `  ; <     L@@f@f@fx D  +  &w ( ( + , ((.((((((((((((((w ~ &  Lffflp w ,`1 @  p eW   w  W   B   "w  2 w  w  w x/dev/ttyc/usr/bin/dds                                  `w w x@ r E  y    w@  @Ջ E 7vf  r f  e0 t f2 w*Wp3e @7EA pw0w MOO w new game PѕW TPw P TW T7 w$w bad guess TW W Y H7 7 w ? TѕW YT 0 ԆT XP TW X ` TPR l fW X^ w bulls; F w cows -4 .wF& ^w guesses ww w x@ r E  y    w@  @Ջ E 7vf  r f  e0 t f2 w*Wp3e @7EA pw0w Tic-Tac-Toe w Accumulated knowledge? w b@  72 2w 'bits' of knowledge w rw new game ~s |s@ XO@C W vW yW | W | w "? D 1 OsL ( Fsw 4L 7 L7 Js̋̕w Y w <  7 77  !|߇ (-~7ȕww hIllegal move ww NYou win w >I concede ~ www I win w  f Wqs`G~@  JsЋ  |w Draw w4J  ` ` W b @s b @B   w, @ w 0 'bits' returned bw/usr/games/ttt.kCH?b=+<2.30L,b+t+%/H>C66/C63HIAHIjH@H!0VHHBG?@IG/H?cHIH0E??>Ev/0$HHhH?EuE>?=>[EEE>EQG3?EkE+>?>G!E0! B! D! _~ -D Z! De  `" h! 77!c_ - z!  !8 e 05 W- @ `"   te:" ! _ 5! _  n! _ m   x _ 8te:"E ! `7 tU@"_ ! ~%y ! l%y__ww    te:"  a" aH ww n .%   ċ $ 7<w@w . :$ ,wp&@"@x @  &  ww   "  0 9     | Wp @`e `ww DC  at0@"  wbw P@@wNw <wLDeB  < % Jw 7 (7 ׯ-  ,$7  .$  B J,drofeZcds8l ӕ- 6 r f e0 $C~ fWtE Ee0^ T    .`w. " J Ο  J    J w7   0  Wp `e0[eӕ?f@ ww %@w %-w %@7 bwHfwVw %7 Lw2f 8"2*"  7  7* 7 f@ wf ww w wAupNNmf 0 ww  @@5-_`A 7r5 Awpu@@m5@l5um^@@- ff D% u-!2@@-ff % u-uNf d u-&@@AA Nfm 0 u Nf 0 @m5_6Nf d uww v|@ @5@ AH@ HwHf BRwf@6p74F @&HFfA7"  fA & 9 &fA @e&7w@2"7fWp3e @7E8:dD|HJb|8VX^` "$`*`NZ\XrInstructions? (y-n) You are in room %d You fell into a pit You were eaten by the wumpus Theres a bat in your room I smell a wumpus Bats nearby I feel a draft There are tunnels to %d Move or shoot (m-s) which room? You hit the wall Give list of rooms terminated by 0 You shot yourself You slew the wumpus That was your last shot Another game? (y-n) Same room setup? (y-n) w w&w w Z...bjchesscubicmootttttt.kwump. .. r0 r1 r2 r3 r4 r5 sp pc csw mov movb cmp cmpb bit bitb bic bicb bis bisb add sub br bne beq bge blt bgt ble bpl bmi bhi blos bvc bvs bhis bec bcc blo bcs bes jbr jne jeq jge jlt jgt jle jpl jmi jhi jlos jvc jvs jhis jec jcc jlo jcs jes clr clrb com comb inc incb dec decb neg negb adc adcb sbc sbcb tst tstb ror rorb rol rolb asr asrb asl aslb jmp swab jsr rts sys clc clv clz cln sec sev sez sen cfcc setf setd seti setl clrf negf absf tstf movf movif movfi movof movfo addf subf mulf divf cmpf modf movie movei ldfps stfps fr0 fr1 fr2 fr3 fr4 fr5 als alsc mpy mul div ash ashc dvd xor sxt mark sob .byte .even .if .endif .globl .text .data .bss .comm     auto break case char 4 continue default define do double 4 else extern 2 float 4 for goto if include int 4 register return static struct 3 switch while        >+D;62(!1 -:".?:H5&  * $ <6:(E    -3$ =8 K  8-  G55K.'E IF%  ) >'  $# #4 .%&O@-9'   8'10%$ 1)1&' @,'00>(-B    ,I 0,"/ *$475L 5 4'U;3 *;)G3K.S /( "-+7    K     ;,      .      %  2          1        -2            -   !          &B      7  -  8                       @  >           #           5                ;    '           1  %                      #                        ' -     %6   '                  DDmw#4*<R rrrlhhetalsisipiytotaniniciathinmlibilhfdiaaiorororararuararoarariararararoooooonentanananololieliiaiaitetrererevleDalce%edede$edduceeteaeaarzanzalzrdzelvnivievCuoninuuuquatuttatatortentatouslosisisasr$urigr#rtororherrrrcopyntonhononen$nn%ainlininomomimllllillcklllllalfalaltablbllalalalikgagiagergmgkgdgifnifereeidididuenclunc&esncerncinc%ancerncarncancalncincusicticieclacrooeli$ieoontintrinrinpinninminlinlinlin%sinrinlinnlinkinlinlinlinlinlinyhineethnehingindinbinnoutortittiseispisrisnislisuislisbisgisdissraporugurgicaairhifedsciorooalracacuselelheltaltaalvukthtchadua#uaur%gaonaiaia%ririiiiaaea$eaciaiaaaauoi#i#eivsisiisals$es$asoooaowowurpoooooo alaioaiolioio%sioionoioiooooiiiiiiteiaightomeoekeeee#aomaiaia$eaiaialeaea#eacrouhieearro#o$iizovoeomut%useost%cerit%ise%ese%asetearert%meaeropaewn$seonrmlldleleknheaheeihethshhechdgrdoundldiducncBa&aca&eca&ica&ega$uuiouiouiou$iueoueoueubesesb%pibCeCeDshDchionsinsalslishtsisgesgsdesdsasearooironrinenieninrighrighligheighhifraf$dgoaoaoaha$es%quii%osiinni(failailaililiurouar$urenaionrirnlglalfalalbllk&gahleeckeodtudeedaaability able about above absence abstract academic accept acceptable accepted accepts access accessed accessible accomplished accordance according accordingly account accuracy accurately achieve achieved achievement across act acting action actions activated activates activation active activities activity actual actually actuated adapted add added adding addition additional additions additive address addressed adequate adjacent administration adopted advance advantage advantageously affairs affect affected affects aforementioned after afternoon again against age agencies agency ago agreed agreement ahead aid air algebraic algol algorithm algorithms all allow allowed allows almost alone along already also alter altered alternate alternative alternatively alternatives although always america american among amount amplifier amplitude an analog analogous analyses analysis analyze and angle animal announced annual anode anodes another answer answered answers any anyone anything apart apparatus apparent apparently appeal appear appearance appeared appearing appears application applications applied applies apply applying approach appropriate appropriately approximate approximated approximately approximation april arbitrary are area areas argued argument arguments arise arises arithmetic around arrangement arrangements array arrays arrive arriving art article arts as aside ask asked asking aspect aspects assign assigned assignment assistance associated association assume assumed assumes assuming assumption asymmetric at atmosphere atom attack attempt attempts attention attitude attorney attractive audio august author authority automatic available average avoid aware away axes axis back background bad balance ball bandwidth bank bar base based basic basis be bear became because become becomes becoming been before began begin beginning begins behavior behind being belief believe believed bell below beneath benefit bent besides best better between beyond bill binary biometrika bit bits black block blocks blue board body book books both bottom bought bound boundaries boundary bounds box branch branches break breakdown brief bring broad broken brought brown bubble budget build building buildings built burning bus buses business busy but buy by cable calculation california call called calling calls came can cannot capabilities capability capable capacity capital card care career careful carefully carried carries carroll carry carrying case cases cathode cathodes catholic caught cause caused causes causing cell cells center centered central century certain certainly chain chairman chance chang change changed changes channel channels chapter character characteristic characteristics characters charge charged charging chart check checked chemical chief children choice choices choose chosen circle circuit circuitry circuits circumstances citizens city civil claim claims class classes classified clean clear clearly clock close closed closely closer closest closure cluster clustering clusterings clusters cm code coding coefficient coefficients coffee cold collection college color column columns combination combinations combined combining come comes coming command comment comments commerce commercial committee common communicates communication communications communist community compact companies company comparable compared comparison compensate compensation competent competition compilers compiling complement complete completed completely completion complex complexity complicated component components composite composition comprise comprises comprising computation computational computations compute computed computer computing conceived concentrated concentration concept concepts concern concerned concerning conclude conclusion conclusions condition conditional conditions conductivity conductor conductors conference confidence configuration configurations congruent connected connecting connection connections connects consequently consider considerable consideration considerations considered considering consistent consisting consists constant constants constrained constraint constraints construct constructed constructing construction contact contacts contain contained containing contains contents continue continued continues continuing continuity continuous contract contrast control controllable controlled controlling controls convenient convention conventional conventions conversely conversion convert converted converter converting cooperation coordinate coordinates core corporation correct correctly correlation correspond corresponding corresponds cosines cost costs could council count counted counter counting countries country counts couple coupled coupling course courses court cover covered create created credit crisis criterion critical crop cross crossovers cubic culture current currently curve curves cut cutoff cutting cycle cycles daily dallas damage danger dark data date day days dead deal debugging december decide decided decision decisions declared decoded decoder decoding decomposition decrease decreases decreasing deep defect defects define defined defines defining definite definition definitions degree delay delayed delays delete demand density department departures depend dependent depending depends depicted depth derived deriving descendant descendants describe described describing description design designated designed designs desirable desire desired despite destination detail detailed details detected detection detects determine determined determines determining develop developed developing development deviation deviations device devices diagonal diagram diagrams dial diameter dictates dictionary did die dielectric difference differences different differential difficult difficulties difficulty diffusion digit digital digits dimension dimensions direct directed direction directions directly director discharge discharges disclosed discloses disclosure disconnected discovered discrepancy discrete discuss discussed discussion display displays disposed dissimilarities dissimilarity distance distances distinct distinction distinguish distortions distribution divided division do document documented does doing dollars domain dominant done doped dotted double doubt down dr draw drawing drawn drew drink drive driving drop dropped due duration during dust duty dynamic each earlier early earth ease easier easily east easy economic economically economy edge edges editing editor education educational effect effective effectively effects efficiency efficient efficiently effort efforts eight either electric electrical electrode electrodes electronic electrons element elements eliminate eliminated else embedded embodiment embodiments emotional emphasis employed employees empty enable enabled enclosed encoding encountered encourage end ends energy engineering english enough enter entered entire entirely entities entitled entries envelope environment epitaxial equal equally equals equation equations equilibrium equipment equipped equivalent equivalently error errors escape especially essential essentially establish established establishing estimated et etc evaluated even evening event events ever every everybody everyone everything evidence evidenced evident evil exact exactly examine examined example examples exceeds excellent except exception exchange exclusive executed executing execution exercise exhibit exist existence existing exists exit expect expected expects expense expensive experience experiment experimental experiments experts explain explained explanation explicit explicitly exponential exposed express expressed expression extend extended extensive extent external extinguished extra extreme extremely fabricated face faces facilities fact factor factors facts faculty failed failure fair fairly faith fall falls false familiar families family far fashion fast faster favor fear feasible feature features february feed feedback feel feeling feet felt few fewer field fields fifteen fifth fig figs figure figures file filed files filled filling film filter filtering final finally financial find finding finds fine finished finite fire firm first fiscal fit fitting five fixed flexibility flip floor flop flops flow follow followed following follows food foot for force forced forces foregoing foreign forest form formal format formed former forming forms formula formulation forth fortran forward found four fourth fraction frame frames free freedom french frequencies frequency frequently fresh friend friendly from front full fully function functional functions fund fundamental funds furnish furnishes further furthermore future gain gap gas gaseous gate gates gating gave general generality generalization generalized generally generate generated generates generating generation generator geometries geometry german germany get gets getting give given gives giving glass global glow go goal goes going gone good goods government governments grant granted graph graphic great greater greatest greatly green gross ground grounded grounds group grouped grouping groups grow growing growth guaranteed guarantees guard guess guests had hair half hall hand handle handling hands happen happened hard hardly hardware has have having he head health heard heat heavily heavy held help helped hence here herein hereinafter hidden hierarchical high higher highest highly hill him himself his historical history hold holding hole home hook hope horizontal hospital hot hour hours house housing how however human hundred idea ideal ideas identical identification identified identify identity idle if illustrate illustrated illustrating illustration illustrative image immediate immediately impact implement implementation implemented implicitly implied implies imply importance important impossible improve improved improvement impurities impurity in inches include included includes including incoming incorporated increase increased increases increasing increment indeed independence independent index india indicate indicated indicates indicating indicative individual individuals industrial industry inequality influence information informed initial initialize initially initiate initiated input inputs inserted inside instability install instance instances instantaneously instead instruction instructions insurance integer integers integral integrated intellectual intended intensity intent inter interaction interactions interchange interconnected interconnection interest interested interesting interests interface interior intermediate internal international interpreted interstage interval intervals into introduced introduction invention inverse inverted inverter investigation invites involve involved involves involving ion ions is issue issued issues it items its itself james january jersey job jobs john joined jointly jr judge judged judgment judicious july jump june just justice justification justify keep keeping kennedy kept key kill kind kinds knew know knowledge known knows labeled labelled labels laboratories laboratory lack lag laid land language languages large larger largest last late later latter law laws lay layer layers layout lead leader leaders leadership leading leads learn learned learning least leave leaving led left leftmost legal length less let letter letters level levels liability liable liberal library lie lies life light like likely limit limitations limited limiting limits line linear linearly lines link links list listing lists literature little live lived load loaded loading local locally located location locations log logic logical long longer longest look looked looking looks loop loops lose loss losses lost lot low lower lowest machine machinery machines made magnetic magnitude main maintain maintained maintenance major majority make makes making man management manager manner manual manufacturer manufacturers manufacturing many mapping march margins mark marked market mask masking mass master match matched matches matching material materials mathematical mathematically matrices matrix matter matters maximum may me mean meaning meaningful means meant measure measured measurement measurements measures measuring mechanical mechanism medical meet meeting meetings member members membership memory men mentioned merely merged merging message met metal metallization method methods metric middle might miles military million mind minds minimal minimize minimizes minimizing minimum minister minor minutes missing mistakes mixture mode model models modern modes modification modifications modified modular moment money monotone monotonic monotonically month months moon moral more moreover morgan morning most motor mounted move moved moves moving much multi multidimensional multiple multiplication multiplier multipliers multistage multivariate murder murray must mutually my name named names narrow nation national nations natural naturally nature near nearer nearest nearly necessarily necessary need needed needs negative neighboring neither net network neutral never nevertheless new news next nice night nine no nobody node nodes noise non none nonlinear nor normal normalized normally north not notation note noted notes nothing notice noting novel november now nuclear number numbered numbers numeric numerical object objective objects observation observe observed obtain obtained obvious obviously occasion occupied occupy occur occurred occurrence occurrences occurring occurs october odd of off offer offered office officer officers official officials often oil old omitted on once one ones only onto open opened opening operate operated operates operating operation operations opinion opportunities opportunity opposite optimal optimization optimum options or order ordered ordering orders ordinary organization organizations organized orientation oriented origin original originally orthogonal other others otherwise ought our ourselves out outline outlined output outputs outside over overall overlap own page pain pair pairs paper paragraph parallel parameter parameters part partial particular particularly parties partitioning parts party pass passed passes passing past patent path paths patient pattern patterns pay peak people per perfect perform performance performed performing performs perhaps period periodically peripheral permanent permit permits permitted person personal personnel persons pertinent phase phases phenomena philosophy physical pick picked pickup picture piece pieces place placed places placing plan planar plane planned planning plans plant plants plausible play played playing plays please plotted plurality plus point pointed pointer points polarity police policies policy political polynomial pool poor popular population portion position positive possibility possible possibly post potential power powerful practical practice preceding precise precision predetermined predicted prepared presence present presented presents press pressure presumably pretty prevent prevents previous previously price prices primarily primary prime priming principal principle principles print printed prints prior priority privacy private probability probably problem problems proc procedure procedures process processed processes processing processor produce produced produces producing product production products professional professor program programmer programmers programming programs progress project projections projects proof propagate propagated propagating propagation proper properly properties property proportional proposal proposals proposed protect protection proved provide provided provides providing provision public publication published pulse pulses pure purely purpose purposes put puts quality quantization question questions quick quickly quiet quite radio raised random randomly range rank rapid rapidly rare rate rated rates rather ratio rational reach reached reaction read readable reader readers readily reading ready real reality realize realized realizing really rear reason reasonable reasonably reasons receive received receives receiving recent recently recognize recognized record records recover rectangular recursive recursively red reduce reduced reduces reduction refer reference references referred refers reflect refused regard regarded regarding regardless region regions register registers regression regular rejected relate related relates relating relation relations relationship relative relatively relay release released relevant reliability relief remain remainder remained remaining remains remembered remote remove removed removes repeat repeated repeatedly replaced replaces report reported reports represent representation representations representative represented representing represents request require required requirement requirements requires requiring requisite research reserved reset resetting resistance resistivity resistor resistors resolution resources respect respective respectively response responsibility responsible responsive rest restored restrict restricted result resulting results return returned returns reverse review reviewed rich right rights rise risk roads role roles room root roots rose rotation roughly round rounded route routed routine routines routing routings row rows rule rules run running runs safe said sales same sample samples sampling san satisfied satisfies satisfy save say saying says scalar scale scaled scaling scan schematically school schools science sciences scientific scope sea search second secondary seconds secret section sections security see seeing seek seeking seem seemed seems seen segment segments seldom select selected selection selectively self semiconductor send sense sensitive sensitivity sent separate separation september sequence sequences sequentially serial series serious serve served serves service serviced services serving set sets setting seven several severe shall shape share sharp sheet shift shifting shifts ship shop short shot should show showed showing shown shows side sides sign signal signals significance significant significantly similar similarly simple simpler simplest simplicity simply simultaneously since single sit site situation situations six size sizes skilled slightly slot slots slow slowly small smaller smallest snow so social society soft software solid solution solutions solved some someone something sometimes somewhat somewhere son soon sophisticated sort sought sound source sources space spaced spaces spacing spatial speaking special specific specifically specifications specified specify specifying speech speed spent spirit spite splitting spoke spot spread spring square squares stable staff stage stages stand standard standards standing stands start started starting state stated statement statements states static station stations statistical statistically status stay steady step steps still stimuli stimulus stop stopped storage store stored stores straight straightforward strange strategy stream street streets strength stress strict strong strongly structure structures struggle student students studied studies study style subject subjected subjects submitted subroutines subsequent subsequently subset subsets substantial substantially substituting substitution substrate succeeding success successful successive successively such suddenly sufficient sufficiently suggest suggested suggests suitable suitably sum summarize summary summing supervision supervisory supplied supplies supply support supporting suppose supposed sure surface surprised surrounds survey switch switched switches switching symmetric symmetry system systematic systems table tables take taken takes taking talk talked talking tapes target task tax teacher teachers teaching teachings team technical technique techniques technology teeth telephone temp temperature temporary ten tend tends term terminal terminals terminated terminating termination terms test tested testing tests texas text than that the their them themselves then theorem theoretical theory there thereby therefore thereof these they thick thickness thin thing things think thinking third thirty this those though thought three threshold through throughout thus time times timing tip tips title to today together toggled told tolerances tone too took top total touch toward towards track trade traditional traffic train training transaction transfer transformation transformations transistor transistors transition translated translation transmission transmit transmitted travel traverse treated treatment tree trees trial triangle tried triggered trip trivial trouble truck true truly try trying tube turn turned turning turns twenty twice two type types typical typically ultimate unaltered unchanged undefined under underlying understand understanding understood unequal unfortunately unidirectionality unidirectionally uniform union unique unit united units unity universe university unless unrelated unstable until unusual up update upon upper us usage use used useful useless user users uses using usual usually utility utilization utilized utilizing valid validity value values van variable variables variance variation varied variety various vary vast vector vectors verification verified version versions vertical very via view viewed vis visible vision visit vital vocational voice voids voltage voltages volume wait waiting wall walls want wanted wants war was washington water wavelength way ways we week weeks weight weighting weights well went were western what whatever when whenever where whereby wherein wherever whether which while white who whole whom whose why wide width will william willing wind wise wish with within without women word words work worked workers working works world worst worth would write writer writers writing written wrong wrote year years yes yet yield yields york you young your zero zone zones Z...aignatabcignctabsaltsuftabw2006/ copy and execute DEC loaders core = 24. prs = 177550 mov $dldr,r0 mov $[core*2048.]-300,r1 mov r1,r2 1: mov (r0)+,(r1)+ cmp r0,$end blo 1b jmp (r2) dldr: 10706 24646 10705 62705 114 5001 13716 177570 6016 103402 5016 404 241 6116 1001 10116 5000 4715 105303 1374 4715 4767 74 10402 162702 4 22702 2 1441 4767 54 61604 10401 4715 2004 105700 1753 0 751 110321 770 16703 150 105213 105713 100376 116303 2 60300 42703 177400 5302 207 12667 44 4715 10304 4715 303 50304 16707 26 4767 177752 4715 105700 1342 6204 103002 0 677 6304 114 0 . = dldr-500+744 16701 26 12702 352 5211 105711 100376 116162 2 [core*2048.]-400 5267 177756 765 prs end: / dli -- DEC format tape interpreter .globl fopen, fcreat, getc, putc, flush, mesg mov (sp)+,r5 cmp r5,$1 bne 1f jsr r5,mesg; ; .even sys exit 1: tst (sp)+ mov (sp)+,r0 jsr r5,fcreat; obuf bec 1f jsr r5,mesg; ; .even 1: mov $ppt,r0 cmp r5,$3 blt 1f mov (sp)+,r0 1: jsr r5,fopen; ibuf bec 1f jsr r5,mesg; ; .even sys exit 1: jsr pc,get tst r0 beq 1b cmp r0,$1 bne err jsr pc,get jsr pc,get mov r0,-(sp) jsr pc,get swab r0 bis r0,(sp) jsr pc,get mov r0,r1 jsr pc,get swab r0 bis r0,r1 sub $6,(sp) ble 2f cmp r1,origin beq 3f mov r1,origin jsr r5,flush; obuf mov obuf,r0 sys seek; origin: 0; 0 3: jsr pc,get jsr pc,put dec (sp) bgt 3b tst (sp)+ jsr pc,get br 1b 2: jsr r5,flush; obuf sys exit put: jsr r5,putc; obuf inc origin rts pc get: jsr r5,getc; ibuf bec 1f err: jsr r5,flush; obuf mov icount,r0 jsr pc,decml jsr r5,mesg; < Input error\n\0>; .even sys exit 1: inc icount rts pc decml: mov r0,r1 clr r0 div $10.,r0 mov r1,-(sp) tst r0 beq 1f jsr pc,decml 1: mov (sp)+,r0 add $'0,r0 mov r0,icount mov $1,r0 sys write; icount; 1 rts pc ppt: .even .bss count: .=.+2 ch: .=.+2 icount: .=.+2 ibuf: .=.+520. obuf: .=.+520. / unix DEC-tape time/mtrack track formatter nword = 256. nblock = 578. endz = 7200. ps = 177776 tcst = 177340 tccm = 177342 tcwc = 177344 tcba = 177346 tcdt = 177350 mov r5,savr5 mov sp,savsp start: mov savr5,r5 mov savsp,sp jsr pc,4(r5) .even clr r0 mov $cobtab,r1 1: jsr pc,bcomobv mov r2,(r1)+ inc r0 cmp r0,$512. bne 1b mov $buffer,r0 1: mov $-1,(r0)+ cmp r0,$buffer+nword+nword blo 1b mov savr5,r5 jsr pc,2(r5) mov $340,ps mov $tcdt,r5 mov $13,tccm jsr pc,flag / 8Kch for end zone mov $endz,r4 1: jsr r0,mtrack; 101101 dec r4 bne 1b / foreward guard mov $199.,r4 1: jsr r0,mtrack; 10101 dec r4 bne 1b / blocks mov $nblock,r3 1: jsr r0,mtrack; 10101 jsr r0,mtrack; 10110 jsr r0,mtrack; 11010 jsr r0,mtrack; 01000 jsr r0,mtrack; 01000 jsr r0,mtrack; 01000 jsr r0,mtrack; 01000 mov $nword-4,r4 2: jsr r0,mtrack; 111000 dec r4 bne 2b jsr r0,mtrack; 111011 jsr r0,mtrack; 111011 jsr r0,mtrack; 111011 jsr r0,mtrack; 111011 jsr r0,mtrack; 101001 jsr r0,mtrack; 100101 jsr r0,mtrack; 10101 dec r3 bne 1b / rear guard mov $199.,r4 1: jsr r0,mtrack; 10101 dec r4 bne 1b / rear end zone mov $endz,r4 1: jsr r0,mtrack; 10010 dec r4 bne 1b clr tccm / end of mtrack pass / go back 12 blocks mov $12.,r0 mov $4002,tccm 1: incb tccm jsr pc,flag dec r0 bne 1b / put comobv(nblock-1) in everything / up to end zone mov $nblock-1,r0 mov r0,bn jsr pc,comobv mov $17,tccm jsr pc,flag 1: movb r1,tcst mov r0,(r5) jsr pc,flag1 br 1b / reverse pass put in / foreward and reverse / block numbers mov $4017,tccm jsr pc,flag 1: mov $nword+3.,r4 2: clrb tcst clr (r5) jsr pc,flag dec r4 bne 2b clrb tcst clr (r5) mov bn,r0 jsr pc,comobv jsr pc,flag movb r1,tcst mov r0,(r5) jsr pc,flag dec bn blt check clrb tcst clr (r5) jsr pc,flag clrb tcst clr (r5) jsr pc,flag clrb tcst mov bn,(r5) jsr pc,flag clrb tcst clr (r5) jsr pc,flag clrb tcst clr (r5) jsr pc,flag br 1b / foreward pass / confirm block numbers / write all 1's in data check: clrb tcst clr (r5) jsr pc,flag1 br check clr r4 1: mov $3,tccm jsr pc,flag cmp (r5),r4 bne error1 mov $-nword,tcwc mov $buffer,tcba mov $15,tccm jsr pc,flag inc r4 cmp r4,$nblock bne 1b mov $3,tccm jsr pc,flag1 br error2 / reverse pass / confirm block numbers / read data and compare / to all 1's 1: mov $4003,tccm jsr pc,flag dec r4 cmp r4,(r5) bne error3 mov $-nword,tcwc mov $buffer,tcba mov $4005,tccm jsr pc,compare jsr pc,flag tst r4 bne 1b mov $4003,tccm jsr pc,flag1 br error4 jsr pc,compare jmp start error1: mov $1,r0 br 1f error2: mov $1,r0 br 1f error3: mov $3,r0 br 1f error4: mov $4,r0 br 1f error5: mov $5,r0 br 1f error6: mov $6,r0 br 1f error7: mov $7,r0 1: add $'0,r0 movb r0,0f mov tcst,-(sp) mov tccm,-(sp) mov $1,tccm mov savr5,r5 jsr pc,4(r5) 0: .even mov (sp)+,r1 mov (sp)+,r0 0 rts pc compare: mov r0,-(sp) mov $buffer,r0 1: cmp (r0)+,$-1 bne error5 cmp r0,$buffer+nword+nword blo 1b mov (sp)+,r0 rts pc mtrack: mov (r0)+,(r5) jsr pc,flag rts r0 flag: bit $100200,tccm beq flag blt error6 rts pc flag1: bit $100200,tccm beq flag1 bge 1f tst tcst bge error7 add $2,(sp) 1: rts pc comobv: mov r0,r4 bic $!777,r0 asl r0 mov cobtab(r0),r0 swab r0 clr r1 ror r0 rol r1 asl r0 asl r0 rol r1 swab r4 bic $177401,r4 bis cobtab(r4),r0 rts pc bcomobv: mov r0,r2 bic $!70,r2 mov r0,r3 mov $6.,r4 1: asr r3 dec r4 bne 1b bic $!7,r3 bis r3,r2 mov r0,r3 mov $6.,r4 1: asl r3 dec r4 bne 1b bic $!700,r3 bis r3,r2 com r2 bic $!777,r2 rts pc bn: .=.+2 savr5: .=.+2 savsp: .=.+2 cobtab: .=.+1024. buffer: .=.+nword+nword / list on kl-11 followon ascii file mov $ascii,r1 1: movb (r1)+,r0 beq 1f jsr pc,(r5) br 1b 1: rts pc ascii: <\0> ! "W N D=    @ #D  D ҃RR \ B ы e@W 0 , & 7    " 7 -  X e5PߋRTV`RߋR RT `Re `R7 t*p ȋ@E A Ze   ?    7? eE/ copy mag tape to disk jsr pc,rew 2: jsr pc,4(r5) <'p' for rp; 'k' for rk\n\0> .even jsr pc,2(r5) cmp r0,$'k bne 3f mov $rkblk,r0 br 1f 3: cmp r0,$'p bne 2b mov $rpblk,r0 1: mov r0,rxblk mov $'\n,r0 jsr pc,(r5) jsr pc,4(r5) .even jsr pc,numb mov r0,bno jsr pc,4(r5) .even jsr pc,numb mov r0,r1 beq 2f 1: jsr pc,rblk dec r1 bne 1b 2: jsr pc,4(r5) .even jsr pc,numb mov r0,r1 1: jsr pc,rblk jsr pc,wblk dec r1 bne 1b jsr pc,rew rts pc numb: clr r1 1: jsr pc,2(r5) cmp r0,$'\n beq 1f sub $'0,r0 cmp r0,$9 bhi 2f mul $10.,r1 add r0,r1 br 1b 1: mov r1,r0 rts pc 2: jsr pc,4(r5) .even tst (sp)+ rts pc mts = 172520 mtc = 172522 mtbrc = 172524 mtcma = 172526 rblk: bit $2,*$mts bne rblk tstb *$mtc bge rblk mov $-512.,*$mtbrc mov $buf,*$mtcma mov $60003,*$mtc 1: tstb *$mtc bge 1b tst *$mtc bge 1f jsr pc,4(r5) .even mov $-1,*$mtbrc mov $60013,*$mtc br rblk 1: rts pc rew: mov $60017,*$mtc rts pc wblk: mov bno,r0 inc bno mov r1,-(sp) mov r0,r1 clr r0 jmp *rxblk rpda = 176724 rpblk: div $10.,r0 mov r1,-(sp) mov r0,r1 clr r0 div $20.,r0 bisb r1,1(sp) mov $rpda,r1 mov (sp)+,(r1) mov r0,-(r1) br 1f rkda = 177412 rkblk: div $12.,r0 ash $4.,r0 bis r1,r0 mov $rkda,r1 mov r0,(r1) 1: mov $buf,-(r1) mov $-256.,-(r1) mov $3,-(r1) 1: tstb (r1) bge 1b tst (r1) blt 1f mov (sp)+,r1 rts pc 1: jsr pc,4(r5) .even mov (sp)+,r1 dec bno br wblk .bss buf: .=.+512. rxblk: .=.+2 bno: .=.+2 / format RK03/05 disk packs rkda = 177412 5 mov $203.*2,r4 clr r3 1: mov $rkda+2,r0 mov r3,-(r0) mov $buf,-(r0) mov $-12.*256.,-(r0) mov $6003,-(r0) 2: tstb (r0) bge 2b tst (r0) blt 1f add $20,r3 dec r4 bne 1b rts pc 1: jsr pc,4(r5) ; .even rts pc buf: .=.+2 ! "W N =    @ #D  D ҃** ^ B ы e@W 0 ,& 7    ` " ɋ -ɋ e- ɋ ?*p ȋB@E A Ze   "@    7@ eE/ tape boot program to load and transfer / to a 'tp' entry / entry is made by jsr pc,*$0 / so return can be rts pc / jsr pc,(r5) is putc / jsr pc,2(r5) is getc / jsr pc,4(r5) is mesg core = 24. .mt. = 0 .. = [core*2048.]-512. start: mov $..,sp mov $name,r4 mov sp,r1 cmp pc,r1 bhis 2f clr r0 cmp (r0),$407 bne 1f mov $20,r0 1: mov (r0)+,(r1)+ cmp r1,$end blo 1b jmp (sp) 2: jsr pc,rew mov $tvec,r5 mov $'=,r0 jsr pc,(r5) 2: mov r4,r1 1: jsr pc,2(r5) cmp r0,$'\n beq 1f cmp r0,$'@ beq 2b movb r0,(r1)+ cmp r0,$'# bne 1b sub $2,r1 cmp r1,r4 blo 2b br 1b 1: clrb (r1) cmp r1,r4 blos start mov $1,tapa mov $-6144.,wc jsr pc,taper clr r1 1: mov r1,r2 mov r4,r0 2: cmpb (r0)+,(r1) bne 2f tstb (r1)+ bne 2b br 1f 2: mov r2,r1 add $64.,r1 cmp r1,$12288. blo 1b jsr pc,rew br start 1: mov 44.(r2),tapa mov 38.(r2),r0 inc r0 clc ror r0 neg r0 mov r0,wc clr r0 1: clr (r0)+ cmp r0,sp blo 1b jsr pc,taper jsr pc,rew clr r0 cmp (r0),$407 / unix a.out? bne 2f 1: mov 20(r0),(r0)+ cmp r0,sp blo 1b 2: jsr pc,*$0 br start .if .mt. mts = 172520 mtc = 172522 mtbrc = 172524 mtcma = 172526 taper: clr mtma cmp mtapa,tapa beq 1f bhi 2f jsr pc,rrec br taper 2: jsr pc,rew br taper 1: mov wc,r1 1: jsr pc,rrec add $256.,r1 bmi 1b rts pc rrec: bit $2,*$mts bne rrec tstb *$mtc bge rrec mov $-512.,*$mtbrc mov mtma,*$mtcma mov $60003,*$mtc 1: tstb *$mtc bge 1b tst *$mtc bge 1f mov $-1,*$mtbrc mov $60013,*$mtc br rrec 1: add $512.,mtma inc mtapa rts pc rew: mov $60017,*$mtc clr mtapa rts pc .endif .if .mt.-1 tcdt = 177350 tccm = 177342 taper: mov $tcdt,r0 mov $tccm,r1 for: mov $3,(r1) / rbn for 1: tstb (r1) bge 1b tst (r1) blt rev cmp tapa,(r0) beq rd bgt for rev: mov $4003,(r1) / rbn bac 1: tstb (r1) bge 1b tst (r1) blt for mov (r0),r2 add $5,r2 cmp tapa,r2 blt rev br for rd: clr -(r0) / bus addr mov wc,-(r0) / wc mov $5,-(r0) / read 1: tstb (r1) bge 1b tst (r1) blt taper rts pc rew: mov $4003,tccm rts pc .endif tvec: br putc br getc br mesg tks = 177560 tkb = 177562 getc: mov $tks,r0 inc (r0) 1: tstb (r0) bge 1b mov tkb,r0 bic $!177,r0 cmp r0,$'A blo 1f cmp r0,$'Z bhi 1f add $40,r0 1: cmp r0,$'\r bne putc mov $'\n,r0 tps = 177564 tpb = 177566 putc: tstb tps bge putc cmp r0,$'\n bne 1f mov $'\r,r0 jsr pc,(r5) mov $'\n+200,r0 jsr pc,(r5) clr r0 jsr pc,(r5) mov $'\n,r0 rts pc 1: mov r0,tpb rts pc mesg: movb *(sp),r0 beq 1f jsr pc,(r5) inc (sp) br mesg 1: add $2,(sp) bic $1,(sp) rts pc end: tapa: .=.+2 mtapa: .=.+2 mtma: .=.+2 wc: .=.+2 name: .=.+32. / disk boot program to load and transfer / to a unix entry / entry is made by jsr pc,*$0 / so return can be rts pc core = 24. .. = [core*2048.]-512. start: mov $..,sp mov sp,r1 cmp pc,r1 bhis 2f reset clr r0 cmp (r0),$407 bne 1f mov $20,r0 1: mov (r0)+,(r1)+ cmp r1,$end blo 1b jmp (sp) 2: mov $inod,r0 1: clr (r0)+ cmp r0,sp blo 1b jsr pc,getc cmp r0,$'k bne 3f mov $rkblk,r0 br 1f 3: cmp r0,$'p bne 2b mov $rpblk,r0 1: mov r0,rxblk mov $'\n,r0 jsr pc,putc mov $names,r1 1: mov r1,r2 2: jsr pc,getc cmp r0,$'\n beq 1f cmp r0,$'/ beq 3f movb r0,(r2)+ br 2b 3: cmp r1,r2 beq 2b add $14.,r1 br 1b 1: mov $names,r1 mov $1,r0 1: clr bno jsr pc,iget tst (r1) beq 1f 2: jsr pc,rmblk br start mov $buf,r2 3: mov r1,r3 mov r2,r4 add $16.,r2 tst (r4)+ beq 5f 4: cmpb (r3)+,(r4)+ bne 5f cmp r4,r2 blo 4b mov -16.(r2),r0 add $14.,r1 br 1b 5: cmp r2,$buf+512. blo 3b br 2b 1: clr r1 1: jsr pc,rmblk br 1f mov $buf,r2 2: mov (r2)+,(r1)+ cmp r2,$buf+512. blo 2b br 1b 1: clr r0 cmp (r0),$407 bne 2f 1: mov 20(r0),(r0)+ cmp r0,sp blo 1b 2: jsr pc,*$0 br start iget: add $31.,r0 mov r0,r5 ash $-4.,r0 jsr pc,rblk bic $!17,r5 ash $5.,r5 add $buf,r5 mov $inod,r4 1: mov (r5)+,(r4)+ cmp r4,$addr+16. blo 1b rts pc rmblk: add $2,(sp) mov bno,r0 inc bno bit $LRG,mode bne 1f asl r0 mov addr(r0),r0 bne rblk 2: sub $2,(sp) rts pc 1: clr -(sp) movb r0,(sp) clrb r0 swab r0 asl r0 mov addr(r0),r0 beq 2b jsr pc,rblk mov (sp)+,r0 asl r0 mov buf(r0),r0 beq 2b rblk: mov r1,-(sp) mov r0,r1 clr r0 jmp *rxblk rpda = 176724 rpblk: div $10.,r0 mov r1,-(sp) mov r0,r1 clr r0 div $20.,r0 bisb r1,1(sp) mov $rpda,r1 mov (sp)+,(r1) br 1f rkda = 177412 rkblk: div $12.,r0 ash $4.,r0 bis r1,r0 mov $rkda+2,r1 1: mov r0,-(r1) mov $buf,-(r1) mov $-256.,-(r1) mov $5,-(r1) 1: tstb (r1) bge 1b mov (sp)+,r1 rts pc tks = 177560 tkb = 177562 getc: mov $tks,r0 inc (r0) 1: tstb (r0) bge 1b mov tkb,r0 bic $!177,r0 cmp r0,$'A blo 1f cmp r0,$'Z bhi 1f add $40,r0 1: cmp r0,$'\r bne putc mov $'\n,r0 tps = 177564 tpb = 177566 putc: tstb tps bge putc cmp r0,$'\n bne 1f mov $'\r,r0 jsr pc,putc mov $'\n+200,r0 jsr pc,putc clr r0 jsr pc,putc mov $'\n,r0 rts pc 1: mov r0,tpb rts pc end: inod = ..-1024. mode = inod addr = inod+8. buf = inod+32. bno = buf+514. rxblk = bno+2 names = rxblk+2 LRG = 10000 reset = 5 Z...dldr.sdli.sdtf.slist.smbootmcopy.srkf.stboottboot.suboot.s|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel| |010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si | |020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb| |030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us | |040 sp |041 ! |042 " |043 # |044 $ |045 % |046 & |047 ' | |050 ( |051 ) |052 * |053 + |054 , |055 - |056 . |057 / | |060 0 |061 1 |062 2 |063 3 |064 4 |065 5 |066 6 |067 7 | |070 8 |071 9 |072 : |073 ; |074 < |075 = |076 > |077 ? | |100 @ |101 A |102 B |103 C |104 D |105 E |106 F |107 G | |110 H |111 I |112 J |113 K |114 L |115 M |116 N |117 O | |120 P |121 Q |122 R |123 S |124 T |125 U |126 V |127 W | |130 X |131 Y |132 Z |133 [ |134 \ |135 ] |136 ^ |137 _ | |140 ` |141 a |142 b |143 c |144 d |145 e |146 f |147 g | |150 h |151 i |152 j |153 k |154 l |155 m |156 n |157 o | |160 p |161 q |162 r |163 s |164 t |165 u |166 v |167 w | |170 x |171 y |172 z |173 { |174 | |175 } |176 ~ |177 del| alpha A A | beta B B | gamma \ \ GAMMA G G | delta D D | DELTA W W epsilon S S | zeta Q Q | eta N N THETA T T | theta O O | lambda L L LAMBDA E E | mu M M | nu @ @ xi X X | pi J J | PI P P rho K K | sigma Y Y | SIGMA R R tau I I | phi U U | PHI F F psi V V | PSI H H | omega C C OMEGA Z Z | nabla [ [ | not _ _ partial ] ] | integral ^ ^ <[1234567890-_]^\ >qwertyuiop@ asdfghjkl;: zxcvbnm,./ <[1234567890-_]^\ > @ ;: ,./ <{!"#$%&'() =_}~| >QWERTYUIOP` ASDFGHJKL+* ZXCVBNM,.? <{ !"#$%&'() =_} ~ | >QWERTYUIOP` ASDFGHJKL+* ZXCVBNM,.? 2 1 1 1 1 1 1 1 1 1 1 012345670123456701234567012345670123456701234567012345670123456701234567 x x x x x x x x x Z...asciigreekkbdtabsstruct node ( struct node *p1; struct node *p2; char typ; char ch; ); int freesize; struct node *lookf; struct node *looks; struct node *lookend; struct node *lookstart; struct node *lookdef; struct node *lookret; struct node *lookfret; int cfail; int rfail; struct node *freelist; struct node *namelist; int lc; struct node *schar; #include "sno.h" /* * Snobol III */ int freesize; struct node *freespace &end; int *fault -1; mes(s) { sysput(strstr(s)); } init(s, t) { register struct node *a, *b; a = strstr(s); b = look(a); delete(a); b->typ = t; return(b); } main(argc, argv) char *argv[]; { extern fin, fout; register struct node *a, *b, *c; if(argc > 1) { fin = open(argv[1], 0); if(fin < 0) { mes("cannot open input"); exit(); } } fout = dup(1); lookf = init("f", 0); looks = init("s", 0); lookend = init("end", 0); lookstart = init("start", 0); lookdef = init("define", 0); lookret = init("return", 0); lookfret = init("freturn", 0); init("syspit", 3); init("syspot", 4); a = c = compile(); while (lookend->typ != 2) { a->p1 = b = compile(); a = b; } cfail = 1; a->p1 = 0; if (lookstart->typ == 2) c = lookstart->p2; while (c=execute(c)); flush(); } syspit() { extern fin; register struct node *b, *c, *d; int a; if ((a=getchar())=='\n') return(0); b = c = alloc(); while(a != '\n') { c->p1 = d = alloc(); c = d; l: c->ch = a; if(a == '\0') { if(fin) { close(fin); fin = 0; a = getchar(); goto l; } rfail = 1; break; } a = getchar(); } b->p2 = c; if(rfail) { delete(b); b = 0; } return(b); } syspot(string) struct node *string; { register struct node *a, *b, *s; s = string; if (s!=0) { a = s; b = s->p2; while(a != b) { a = a->p1; putchar(a->ch); } } putchar('\n'); } strstr(s) char s[]; { int c; register struct node *e, *f, *d; d = f = alloc(); while ((c = *s++)!='\0') { (e=alloc())->ch = c; f->p1 = e; f = e; } d->p2 = e; return(d); } class(c) { switch (c) { case ')': return(1); case '(': return(2); case '\t': case ' ': return(3); case '+': return(4); case '-': return(5); case '*': return(6); case '/': return(7); case '$': return(8); case '"': case '\'': return(9); case '=': return(10); case ',': return(11); } return(0); } alloc() { register struct node *f; register int i; extern fout; if (freelist==0) { if (--freesize < 20) { if ((i=sbrk(1200)) == -1) { flush(); write (fout, "Out of free space\n", 18); exit(); } freesize =+ 200; } return(freespace++); } f = freelist; freelist = freelist->p1; return(f); } free(pointer) struct node *pointer; { pointer->p1 = freelist; freelist = pointer; } nfree() { register int i; register struct node *a; i = freesize; a = freelist; while(a) { a = a->p1; i++; } return(i); } look(string) struct node *string; { register struct node *i, *j, *k; k = 0; i = namelist; while (i) { j = i->p1; if (equal(j->p1, string) == 0) return(j); i = (k=i)->p2; } i = alloc(); i->p2 = 0; if (k) k->p2 = i; else namelist = i; j = alloc(); i->p1 = j; j->p1 = copy(string); j->p2 = 0; j->typ = 0; return(j); } copy(string) struct node *string; { register struct node *j, *l, *m; struct node *i, *k; if (string == 0) return(0); i = l = alloc(); j = string; k = string->p2; while(j != k) { m = alloc(); m->ch = (j=j->p1)->ch; l->p1 = m; l = m; } i->p2 = l; return(i); } equal(string1, string2) struct node *string1, *string2; { register struct node *i, *j, *k; struct node *l; int n, m; if (string1==0) { if (string2==0) return(0); return(-1); } if (string2==0) return(1); i = string1; j = string1->p2; k = string2; l = string2->p2; for(;;) { m = (i=i->p1)->ch; n = (k=k->p1)->ch; if (m>n) return(1); if (mp1; q = s->p2; sign = 1; if (class(p->ch)==5) { /* minus */ sign = -1; if (p==q) return(0); p = p->p1; } loop: m = p->ch - '0'; if (m>9 | m<0) writes("bad integer string"); n = n * 10 + m; if (p==q) return(n*sign); p = p->p1; goto loop; } binstr(binary) { int n, sign; register struct node *m, *p, *q; n = binary; p = alloc(); q = alloc(); sign = 1; if (binary<0) { sign = -1; n = -binary; } p->p2 = q; loop: q->ch = n%10+'0'; n = n / 10; if (n==0) { if (sign<0) { m = alloc(); m->p1 = q; q = m; q->ch = '-'; } p->p1 = q; return(p); } m = alloc(); m->p1 = q; q = m; goto loop; } add(string1, string2) { return(binstr(strbin(string1) + strbin(string2))); } sub(string1, string2) { return(binstr(strbin(string1) - strbin(string2))); } mult(string1, string2) { return(binstr(strbin(string1) * strbin(string2))); } div(string1, string2) { return(binstr(strbin(string1) / strbin(string2))); } cat(string1, string2) struct node *string1, *string2; { register struct node *a, *b; if (string1==0) return(copy(string2)); if (string2==0) return(copy(string1)); a = copy(string1); b = copy(string2); a->p2->p1 = b->p1; a->p2 = b->p2; free(b); return(a); } dcat(a,b) struct node *a, *b; { register struct node *c; c = cat(a,b); delete(a); delete(b); return(c); } delete(string) struct node *string; { register struct node *a, *b, *c; if (string==0) return; a = string; b = string->p2; while(a != b) { c = a->p1; free(a); a = c; } free(a); } sysput(string) { syspot(string); delete(string); } dump() { dump1(namelist); } dump1(base) struct node *base; { register struct node *b, *c, *e; struct node *d; while (base) { b = base->p1; c = binstr(b->typ); d = strstr(" "); e = dcat(c, d); sysput(cat(e, b->p1)); delete(e); if (b->typ==1) { c = strstr(" "); sysput(cat(c, b->p2)); delete(c); } base = base->p2; } } writes(s) { sysput(dcat(binstr(lc),dcat(strstr("\t"),strstr(s)))); flush(); if (cfail) { dump(); flush(); exit(); } while(getc()); while (compile()); flush(); exit(); } getc() { register struct node *a; static struct node *line; static linflg; while (line==0) { line = syspit(); if(rfail) { cfail++; writes("eof on input"); } lc++; } if (linflg) { line = 0; linflg = 0; return(0); } a = line->p1; if (a==line->p2) { free(line); linflg++; } else line->p1 = a->p1; return(a); } -./0123456789#include "sno.h" compon() { register struct node *a, *b; register int c; static next; if (next == 0) schar = getc(); else next = 0; if (schar == 0) { (a=alloc())->typ = 0; return(a); } switch (class(schar->ch)) { case 1: schar->typ = 5; return(schar); case 2: schar->typ = 16; return(schar); case 3: a = schar; for(;;) { schar = getc(); if (schar == 0) { a->typ = 0; return(a); } if (class(schar->ch) != 3) break; free(schar); } next = 1; a->typ = 7; return(a); case 4: schar->typ = 8; return(schar); case 5: schar->typ = 9; return(schar); case 6: a = schar; schar = getc(); if (class(schar->ch) == 3) a->typ = 10; else a->typ = 1; next = 1; return(a); case 7: a = schar; schar = getc(); if (class(schar->ch) == 3) a->typ = 11; else a->typ = 2; next = 1; return(a); case 8: schar->typ = 12; return(schar); case 9: c = schar->ch; a = getc(); if(a == 0) goto lerr; b = schar; if(a->ch == c) { free(schar); a->typ = 15; a->p1 = 0; return(a); } b->p1 = a; for(;;) { schar = getc(); if (schar == 0) lerr: writes("illegal literal string"); if(schar->ch == c) break; a->p1 = schar; a = schar; } b->p2 = a; schar->typ = 15; schar->p1 = b; return(schar); case 10: schar->typ = 3; return(schar); case 11: schar->typ = 4; return(schar); } b = alloc(); b->p1 = a = schar; schar = getc(); while(schar!=0 & !class(schar->ch)) { a->p1 = schar; a = schar; schar = getc(); } b->p2 = a; next = 1; a = look(b); delete(b); b = alloc(); b->typ = 14; b->p1 = a; return(b); } nscomp() { register struct node *c; while((c=compon())->typ == 7) free(c); return(c); } push(stack) { register struct node *a; (a=alloc())->p2 = stack; return(a); } pop(stack) struct node *stack; { register struct node *a, *s; s = stack; if (s == 0) writes("pop"); a = s->p2; free(s); return(a); } expr(start, eof, e) struct node *e; { register struct node *stack, *list, *comp; int operand, op, space, op1; struct node *a, *b, *c; int d; list = alloc(); e->p2 = list; stack = push(0); stack->typ = eof; operand = 0; space = start; l1: if (space) { comp = space; space = 0; } else comp = compon(); l3: op = comp->typ; switch (op) { case 7: space = 1; free(comp); comp = compon(); goto l3; case 10: if (space == 0) { comp->typ = 1; goto l3; } case 11: if (space == 0) { comp->typ = 2; goto l3; } case 8: case 9: if (operand == 0) writes("no operand preceding operator"); operand = 0; goto l5; case 14: case 15: if (operand == 0) { operand = 1; goto l5; } if (space == 0) goto l7; goto l4; case 12: if (operand == 0) goto l5; if (space) goto l4; l7: writes("illegal juxtaposition of operands"); case 16: if (operand == 0) goto l5; if (space) goto l4; b = compon(); op = comp->typ = 13; if (b->typ == 5) { comp->p1 = 0; goto l10; } comp->p1 = a = alloc(); b = expr(b, 6, a); while((d=b->typ) == 4) { a->p1 = b; a = b; b = expr(0, 6, a); } if (d != 5) writes("error in function"); a->p1 = 0; l10: free(b); goto l6; l4: space = comp; op = 7; operand = 0; goto l6; } if (operand==0) writes("no operand at end of expression"); l5: space = 0; l6: op1 = stack->typ; if (op > op1) { stack = push(stack); if (op == 16) op = 6; stack->typ = op; stack->p1 = comp; goto l1; } c = stack->p1; stack = pop(stack); if (stack == 0) { list->typ = 0; return(comp); } if (op1 == 6) { if (op != 5) writes("too many ('s"); goto l1; } if (op1 == 7) c = alloc(); list->typ = op1; list->p2 = c->p1; list->p1 = c; list = c; goto l6; } match(start, m) struct node *m; { register struct node *list, *comp, *term; struct node *a; int b, bal; term = bal = 0; list = alloc(); m->p2 = list; comp = start; if (!comp) comp = compon(); goto l2; l3: list->p1 = a = alloc(); list = a; l2: switch (comp->typ) { case 7: free(comp); comp = compon(); goto l2; case 12: case 14: case 15: case 16: term = 0; comp = expr(comp, 6, list); list->typ = 1; goto l3; case 1: free(comp); comp = compon(); bal = 0; if (comp->typ == 16) { bal = 1; free(comp); comp = compon(); } a = alloc(); b = comp->typ; if (b == 2 | b == 5 | b == 10 | b == 1) a->p1 = 0; else { comp = expr(comp, 11, a); a->p1 = a->p2; } if (comp->typ != 2) { a->p2 = 0; } else { free(comp); comp = expr(0, 6, a); } if (bal) { if (comp->typ != 5) goto merr; free(comp); comp = compon(); } b = comp->typ; if (b != 1 & b != 10) goto merr; list->p2 = a; list->typ = 2; a->typ = bal; free(comp); comp = compon(); if(bal) term = 0; else term = list; goto l3; } if(term) term->typ = 3; list->typ = 0; return(comp); merr: writes("unrecognized component in match"); } compile() { register struct node *b, *comp; struct node *r, *l, *xs, *xf, *g; register int a; int m, t, as; m = l = as = xs = xf = t = 0; comp = compon(); a = comp->typ; if (a == 14) { l = comp->p1; free(comp); comp = compon(); a = comp->typ; } if (a != 7) writes("no space beginning statement"); free(comp); if (l == lookdef) goto def; comp = expr(0, 11, r=alloc()); a = comp->typ; if (a == 0) goto asmble; if (a == 2) goto xfer; if (a == 3) goto assig; m = alloc(); comp = match(comp, m); a = comp->typ; if (a == 0) goto asmble; if (a == 2) goto xfer; if (a == 3) goto assig; writes("unrecognized component in match"); assig: free(comp); comp = expr(0, 6, as=alloc()); a = comp->typ; if (a == 0) goto asmble; if (a == 2) goto xfer; writes("unrecognized component in assignment"); xfer: free(comp); comp = compon(); a = comp->typ; if (a == 16) goto xboth; if (a == 0) { if (xs!=0 | xf!=0) goto asmble; goto xerr; } if (a != 14) goto xerr; b = comp->p1; free(comp); if (b == looks) goto xsuc; if (b == lookf) goto xfail; xerr: writes("unrecognized component in goto"); xboth: free(comp); xs = alloc(); xf = alloc(); comp = expr(0, 6, xs); if (comp->typ != 5) goto xerr; xf->p2 = xs->p2; comp = compon(); if (comp->typ != 0) goto xerr; goto asmble; xsuc: if(xs) goto xerr; comp = compon(); if (comp->typ != 16) goto xerr; comp = expr(0, 6, xs=alloc()); if (comp->typ != 5) goto xerr; goto xfer; xfail: if (xf) goto xerr; comp = compon(); if (comp->typ != 16) goto xerr; comp = expr(0, 6, xf=alloc()); if (comp->typ != 5) goto xerr; goto xfer; asmble: if(l) { if (l->typ) writes("name doubly defined"); l->p2 = comp; l->typ = 2; /* type label;*/ } comp->p2 = r; if (m) { t++; r->p1 = m; r = m; } if (as) { t =+ 2; r->p1 = as; r = as; } (g=alloc())->p1 = 0; if (xs) { g->p1 = xs->p2; free(xs); } g->p2 = 0; if (xf) { g->p2 = xf->p2; free(xf); } r->p1 = g; comp->typ = t; comp->ch = lc; return(comp); def: r = nscomp(); if (r->typ != 14) goto derr; l = r->p1; if (l->typ) writes("name doubly defined"); l->typ = 5; /*type function;*/ a = r; l->p2 = a; r = nscomp(); l = r; a->p1 = l; if (r->typ == 0) goto d4; if (r->typ != 16) goto derr; d2: r = nscomp(); if (r->typ != 14) goto derr; a->p2 = r; r->typ = 0; a = r; r = nscomp(); if (r->typ == 4) { free(r); goto d2; } if (r->typ != 5) goto derr; free(r); if ((r=compon())->typ != 0) goto derr; free(r); d4: r = compile(); a->p2 = 0; l->p1 = r; l->p2 = 0; return(r); derr: writes("illegal component in define"); } ;<=>?@ABCDEFGHIJ#include "sno.h" /* * sno3 */ bextend(str, last) struct node *str, *last; { register struct node *a, *s; register int b; int c, d; s = str; if ((c = s->p1) == 0) goto bad; b = d = 0; a = s->p2; if(a == 0) { a = c; goto eb2; } eb1: if (a == last) goto bad; a = a->p1; eb2: d++; c = class(a->ch); if (c == 1) { /* rp */ if (b == 0) goto bad; b--; goto eb3; } if (c == 2) { /* lp */ b++; goto eb1; } eb3: if (b == 0) { s->p2= a; return(d); } goto eb1; bad: return(0); } ubextend(str, last) struct node *str, *last; { register struct node *a, *b, *s; s = str; a = s->p1; if(a == 0) goto bad; b = s->p2; if(b == 0) goto good; if (b == last) goto bad; a = b->p1; good: s->p2 = a; return(1); bad: return(0); } search(arg, r) struct node *arg, *r; { struct node *list, *back, *str, *etc, *next, *last, *base, *e; register struct node *a, *b, *var; int c, d; a = arg->p2; list = base = alloc(); last = next = 0; goto badv1; badvanc: a = a->p1; if (a->typ == 0) { list->p1 = 0; if (rfail == 1) { a = 0; goto fail; } list = base; if (r == 0) next = last = 0; else { next = r->p1; last = r->p2; } goto adv1; } b = alloc(); list->p1 = b; list = b; badv1: list->p2 = back = alloc(); back->p1 = last; b = a->p2; c = a->typ; list->typ = c; if (c < 2) { back->p2 = eval(b, 1); goto badvanc; } last = list; str = alloc(); etc = alloc(); back->p2 = var = alloc(); var->typ = b->typ; var->p1 = str; var->p2 = etc; e = b->p1; if (e == 0) etc->p1 = 0; else etc->p1 = eval(e, 0); e = b->p2; if (e == 0) etc->p2 = 0; else { e = eval(e, 1); etc->p2 = strbin(e); delete(e); } goto badvanc; retard: a = back->p1; if (a == 0) { rfail = 1; goto fail; } list = a; back = list->p2; var = back->p2; str = var->p1; etc = var->p2; if (etc->p2) goto retard; if (var->typ == 1) { if (bextend(str, last) == 0) goto retard; goto adv0; } if (ubextend(str, last) == 0) goto retard; adv0: a = str->p2; adv01: if (a == last) next = 0; else next = a->p1; advanc: a = list->p1; if (a == 0) { a = alloc(); if (r == 0) { a->p1 = a->p2 = 0; goto fail; } b = r->p1; a->p1 = b; if (next == 0) { a->p2 = r->p2; goto fail; } while(1) { e = b->p1; if (e == next) { a->p2 = b; goto fail; } b = e; } } list = a; adv1: back = list->p2; var = back->p2; d = list->typ; if(d < 2) { if (var == 0) goto advanc; if (next == 0) goto retard; a = next; b = var->p1; e = var->p2; while(1) { if (a->ch != b->ch) goto retard; if (b == e) goto adv01; if (a == last) goto retard; a = a->p1; b = b->p1; } } str = var->p1; etc = var->p2; str->p1 = next; str->p2 = 0; c = etc->p2; if (var->typ == 1) { d = bextend(str, last); if (d == 0) goto retard; if (c == 0) goto adv0; while(1) { c =- d; if (c == 0) goto adv0; if (c < 0) goto retard; d = bextend(str, last); if (d == 0) goto retard; } } if (c == 0) { if(d==3 & next!=0) { str->p2 = last; goto adv0; } goto advanc; } while(c--) if (ubextend(str, last) == 0) goto retard; goto adv0; fail: list = base; goto f1; fadv: free(back); b = list->p1; free(list); if (b == 0) return(a); list = b; f1: back = list->p2; var = back->p2; if (list->typ < 2) { delete(var); goto fadv; } str = var->p1; etc = var->p2; if (a != 0 & etc->p1 != 0) { if (str->p2 == 0) { free(str); str = 0; } assign(etc->p1, copy(str)); } if (str) free(str); free(etc); free(var); goto fadv; } #include "sno.h" /* * sno4 */ and(ptr) struct node *ptr; { register struct node *a, *p; p = ptr; a = p->p1; if (p->typ == 0) { switch (a->typ) { case0: case 0: a->typ = 1; case 1: goto l1; case 3: flush(); return(syspit()); case 5: a = a->p2->p1; goto l1; case 6: return(binstr(nfree())); } writes("attempt to take an illegal value"); goto case0; l1: a = copy(a->p2); } return(a); } eval(e, t) struct node *e; { struct node *list, *a2, *a3, *a4, *a3base; register struct node *a1, *stack, *op; if (rfail == 1) return(0); stack = 0; list = e; goto l1; advanc: list = list->p1; l1: op = list->typ; switch (op) { default: case 0: if (t == 1) { a1 = and(stack); goto e1; } if (stack->typ == 1) writes("attempt to store in a value"); a1 = stack->p1; e1: stack = pop(stack); if (stack) writes("phase error"); return(a1); case 12: a1 = and(stack); stack->p1 = look(a1); delete(a1); stack->typ = 0; goto advanc; case 13: if (stack->typ) writes("illegal function"); a1 = stack->p1; if (a1->typ!=5) writes("illegal function"); a1 = a1->p2; op = a1->p1; a3base = a3 = alloc(); a3->p2 = op->p2; op->p2 = 0; a1 = a1->p2; a2 = list->p2; f1: if (a1!=0 & a2!=0) goto f2; if (a1!=a2) writes("parameters do not match"); op = op->p1; goto f3; f2: a3->p1 = a4 = alloc(); a3 = a4; a3->p2 = and(a1); assign(a1->p1, eval(a2->p2, 1));/* recursive */ a1 = a1->p2; a2 = a2->p1; goto f1; f3: op = execute(op); /* recursive */ if (op) goto f3; a1 = stack->p1->p2; op = a1->p1; a3 = a3base; stack->p1 = op->p2; stack->typ = 1; op->p2 = a3->p2; f4: a4 = a3->p1; free(a3); a3 = a4; a1 = a1->p2; if (a1 == 0) goto advanc; assign(a1->p1, a3->p2); goto f4; case 11: case 10: case 9: case 8: case 7: a1 = and(stack); stack = pop(stack); a2 = and(stack); a3 = doop(op, a2, a1); delete(a1); delete(a2); stack->p1 = a3; stack->typ = 1; goto advanc; case 15: a1 = copy(list->p2); a2 = 1; goto l3; case 14: a1 = list->p2; a2 = 0; l3: stack = push(stack); stack->p1 = a1; stack->typ = a2; goto advanc; } } doop(op, arg1, arg2) { register int a1, a2; a1 = arg1; a2 = arg2; switch (op) { case 11: return(div(a1, a2)); case 10: return(mult(a1, a2)); case 8: return(add(a1, a2)); case 9: return(sub(a1, a2)); case 7: return(cat(a1, a2)); } return(0); } execute(e) struct node *e; { register struct node *r, *b, *c; struct node *m, *ca, *d, *a; r = e->p2; lc = e->ch; switch (e->typ) { case 0: /* r g */ a = r->p1; delete(eval(r->p2, 1)); goto xsuc; case 1: /* r m g */ m = r->p1; a = m->p1; b = eval(r->p2, 1); c = search(m, b); delete(b); if (c == 0) goto xfail; free(c); goto xsuc; case 2: /* r a g */ ca = r->p1; a = ca->p1; b = eval(r->p2, 0); assign(b, eval(ca->p2, 1)); goto xsuc; case 3: /* r m a g */ m = r->p1; ca = m->p1; a = ca->p1; b = eval(r->p2, 0); d = search(m, b->p2); if (d == 0) goto xfail; c = eval(ca->p2, 1); if (d->p1 == 0) { free(d); assign(b, cat(c, b->p2)); delete(c); goto xsuc; } if (d->p2 == b->p2->p2) { assign(b, c); free(d); goto xsuc; } (r=alloc())->p1 = d->p2->p1; r->p2 = b->p2->p2; assign(b, cat(c, r)); free(d); free(r); delete(c); goto xsuc; } xsuc: if (rfail) goto xfail; b = a->p1; goto xboth; xfail: rfail = 0; b = a->p2; xboth: if (b == 0) { return(e->p1); } b = eval(b, 0); if (b == lookret) return(0); if (b == lookfret) { rfail = 1; return(0); } if (b->typ!=2) writes("attempt to transfer to non-label"); return(b->p2); } assign(adr, val) struct node *adr, *val; { register struct node *a, *addr, *value; addr = adr; value = val; if (rfail == 1) { delete(value); return; } switch (addr->typ) { default: writes("attempt to make an illegal assignment"); case 0: addr->typ = 1; case 1: delete(addr->p2); addr->p2 = value; return; case 4: sysput(value); return; case 5: a = addr->p2->p1; delete(a->p2); a->p2 = value; return; } } TUVWXYZ[\Z...sno.hsno1.csno2.csno3.csno4.c# /* * acct [ -w wtmp ] [ -d ] [ -p people ] */ #define TSIZE 30 #define USIZE 200 struct { char name[8]; char tty; char fill1; float time; int fill2; } ibuf; struct ubuf { char name[8]; float utime; } ubuf[USIZE]; struct tbuf { struct ubuf *userp; float ttime; } tbuf[TSIZE]; char *wtmp; int pflag, byday; double dtime; double midnight; double lastime; double day 1440.; int pcount; char **pptr; int montab[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; char *monasc[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; main(argc, argv) char **argv; { int c, fl; register i; register char *ip; extern fin; int f; wtmp = "/usr/adm/wtmp"; while (--argc > 0 && **++argv == '-') switch(*++*argv) { case 'd': byday++; continue; case 'w': if (--argc>0) wtmp = *++argv; continue; case 'p': pflag++; continue; } pcount = argc; pptr = argv; if (fopen(wtmp, &fin) < 0) { printf("No %s\n", wtmp); return; } for(;;) { ip = &ibuf; for (i=0; i<16; i++) { if ((c=getc(&fin)) < 0) goto brk; *ip++ = c; } fl = 0; for (i=0; i<8; i++) { c = ibuf.name[i]; if ('0'<=c&&c<='9'||'a'<=c&&c<='z'||'A'<=c&&c<='Z') { if (fl) goto skip; continue; } if (c==' ' || c=='\0') { fl++; ibuf.name[i] = '\0'; } else goto skip; } loop(); skip:; } brk: ibuf.name[0] = '\0'; ibuf.tty = '~'; time(&ibuf.time); loop(); print(); } loop() { double ltod(); register i; register struct tbuf *tp; register struct ubuf *up; if (ibuf.fill1||ibuf.fill2) return; ibuf.time = ltod(&ibuf.time)/60.; if(ibuf.tty == '|') { dtime = ibuf.time; return; } if(ibuf.tty == '}') { if(dtime == 0.) return; for(tp = tbuf; tp < &tbuf[TSIZE]; tp++) tp->ttime =+ ibuf.time-dtime; dtime = 0.; return; } if (lastime>ibuf.time || lastime+(1.5*day) midnight) { upall(1); print(); newday(); for (up=ubuf; up < &ubuf[USIZE]; up++) up->utime = 0.0; } if (ibuf.tty == '~') { ibuf.name[0] = '\0'; upall(0); return; } if ((i = ibuf.tty) >= 'a') i =- 'a' - '9'; i =- '0'; if (i<0 || i>=TSIZE) i = TSIZE-1; tp = &tbuf[i]; update(tp, 0); } print() { int i; float ttime, t; ttime = 0.0; for (i=0; i0.0) ttime =+ t; if (pflag && ubuf[i].utime > 0.0) { printf("\t%-8.8s%6.2f\n", ubuf[i].name, ubuf[i].utime/60.); } } if (ttime > 0.0) { pdate(); printf("\ttotal%9.2f\n", ttime/60.); } } upall(f) { register struct tbuf *tp; for (tp=tbuf; tp < &tbuf[TSIZE]; tp++) update(tp, f); } update(tp, f) struct tbuf *tp; { int i, j; struct ubuf *up; double t, t1; if (f) t = midnight; else t = ibuf.time; if (tp->userp) { t1 = t - tp->ttime; if (t1>0.0 && t1 < 1.5*day) tp->userp->utime =+ t1; } tp->ttime = t; if (f) return; if (ibuf.name[0]=='\0') { tp->userp = 0; return; } for (up=ubuf; up < &ubuf[USIZE]; up++) { if (up->name[0] == '\0') break; for (j=0; j<8 && up->name[j]==ibuf.name[j]; j++); if (j>=8) break; } for (j=0; j<8; j++) up->name[j] = ibuf.name[j]; tp->userp = up; } among(i) { register j, k; register char *p; if (pcount==0) return(1); for (j=0; j midnight) break; yrs++; tim =+ year; } days = (midnight-tim-720.)/day; montab[1] = 28; if(yrs%4 == 0) montab[1]++; for (mons=0; montab[mons]<=days; mons++) days =- montab[mons]; mons =% 12; printf("%s %2d", monasc[mons], days+1); } _`abcdefg/ ar -- archive/library mov (sp)+,r0 sub $2,r0 ble userr tst (sp)+ mov (sp)+,r1 clr r2 1: tstb (r1) beq 1f cmpb (r1),$'v bne 2f inc r1 incb vflg br 1b 2: tst r2 bne userr movb (r1)+,r2 br 1b 1: tst r2 beq userr mov $arglst,r1 1: mov (sp)+,(r1)+ dec r0 bgt 1b clr (r1)+ mov $swlst,r1 1: cmp r2,(r1)+ beq 1f tst (r1)+ bne 1b br userr 1: jmp *(r1) swlst: 'r; comr 'u; comu 'd; comd 'x; comx 't; comt 0; 0 userr: jsr r5,diag .even putc: movb r0,ch mov $1,r0 sys write; ch; 1 rts r5 print: movb (r1)+,r0 beq 1f jsr r5,putc br print 1: rts r5 diag: mov r5,r1 jsr r5,print tst tfo beq 1f sys unlink; tfil 1: sys exit getaf: mov arglst,0f sys open; 0:..; 0 bes 1f mov r0,afi sys read; buf; 2 cmp buf,magic bne magerr tst (r5)+ 1: rts r5 magerr: mov arglst,r1 jsr r5,print jsr r5,diag < -- not in archive format\n\0> .even mktmp: sys stat; tfil; buf bes 1f incb tfil+8 cmpb tfil+8,$'z blo mktmp br tferr 1: sys signal; 2; 1 ror r0 bcs 1f sys signal; 2; done 1: sys creat; tfil; 600 bes tferr mov r0,tfo sys open; tfil; 0 bes tferr mov r0,tfi rts r5 tferr: jsr r5,diag .even getdir: mov afi,r0 sys read; dir; 16. cmp r0,$16. bne 1f jsr r5,mvname tst (r5)+ 1: rts r5 mvname: mov name,rname mov name+2,rname+2 mov name+4,rname+4 mov name+6,rname+6 rts r5 skip: mov size,r0 inc r0 bic $1,r0 mov r0,0f mov afi,r0 sys seek; 0:..; 1 rts r5 trim: mov r0,r2 1: tstb (r0) beq 1f cmpb (r0)+,$'/ beq trim br 1b 1: rts r5 match: mov $arglst+2,r1 1: mov (r1)+,r0 beq 1f cmp r0,$-1 beq 1b jsr r5,trim mov $name,r0 2: cmp r0,$name+8. beq 2f cmpb (r0),(r2)+ bne 1b tstb (r0)+ bne 2b 2: cmp (r5)+,-(r1) 1: rts r5 mvfil: mov (r1),9f mov (r1),0f sys stat; 0:..; buf bes operr sys open; 9:..; 0 bes operr mov r0,fio mov (r1),r0 mov $-1,(r1) jsr r5,trim mov $name,r0 1: cmp r0,$name+8. beq 1f movb (r2)+,(r0)+ bne 1b 1: mov buf+32.,mtim mov buf+34.,mtim+2 movb buf+7.,ouid movb buf+4.,mode mov buf+10.,size mov tfo,r0 sys write; dir; 16. mov size,r2 1: mov fio,r0 sys read; buf; 512. sub r0,r2 mov r0,0f beq 1f mov tfo,r0 sys write; buf; 0:.. br 1b 1: tst r2 bne phserr bit $1,size beq 1f mov tfo,r0 sys seek; 1; 1 1: mov fio,r0 sys close jsr r5,mvname rts r5 operr: mov 9b,r1 jsr r5,print jsr r5,diag < -- cannot open\n\0> .even phserr: mov 9b,r1 jsr r5,print jsr r5,diag < -- phase error\n\0> .even copyfl: mov tfo,r0 sys write; dir; 16. mov size,r1 mov $rname,9b 1: mov r1,0f beq 1f cmp r1,$512. blo 2f mov $512.,0f 2: mov afi,r0 sys read; buf; 0:.. sub r0,r1 mov r0,0f beq phserr mov tfo,r0 sys write; buf; 0:.. br 1b 1: bit $1,size beq 1f mov afi,r0 sys seek; 1; 1 mov tfo,r0 sys seek; 1; 1 1: rts r5 xtract: / movb mode,0f sys creat; rname; 0:666 bes noxerr mov r0,fio mov size,r1 mov $rname,9b 1: mov r1,0f beq 1f cmp r1,$512. blo 2f mov $512.,0f 2: mov afi,r0 sys read; buf; 0:.. sub r0,r1 mov r0,0f beq phserr mov fio,r0 sys write; buf; 0:.. br 1b 1: mov fio,r0 sys close bit $1,size beq 1f mov afi,r0 sys seek; 1; 1 1: mov r0,-(sp) mov r1,-(sp) mov mtim+2,r1 mov mtim,r0 / sys mdate mov (sp)+,r1 mov (sp)+,r1 rts r5 noxerr: mov $rname,r1 jsr r5,print jsr r5,diag < -- cannot create\n\0> .even table: mov $rname,r1 jsr r5,print mov $'\n,r0 jsr r5,putc rts r5 mesg: mov r1,-(sp) mov (r5)+,r0 tstb vflg beq 1f jsr r5,putc mov $' ,r0 jsr r5,putc mov $rname,r1 jsr r5,print mov $'\n,r0 jsr r5,putc 1: mov (sp)+,r1 rts r5 oldnew: sys stat; rname; buf bes 1f cmp buf+32.,mtim blo 1f bhi 2f cmp buf+34.,mtim+2 blos 1f 2: tst (r5)+ mov $rname,tname mov $tname,r1 1: rts r5 comr: jsr r5,mktmp jsr r5,getaf br copfl 1: jsr r5,getdir br copfl jsr r5,match br 2f jsr r5,mesg; 'r jsr r5,skip jsr r5,mvfil br 1b 2: jsr r5,copyfl jsr r5,mesg; 'c br 1b comu: jsr r5,mktmp jsr r5,getaf br noaf 1: jsr r5,getdir br copfl tst arglst+2 beq 2f jsr r5,match br 3f mov $-1,(r1) 2: jsr r5,oldnew br 3f jsr r5,mesg; 'r jsr r5,skip jsr r5,mvfil br 1b 3: jsr r5,copyfl jsr r5,mesg; 'c br 1b comd: jsr r5,mktmp jsr r5,getaf br noaf 1: jsr r5,getdir br 1f jsr r5,match br 2f mov $-1,(r1) jsr r5,skip jsr r5,mesg; 'd br 1b 2: jsr r5,copyfl jsr r5,mesg; 'c br 1b 1: jsr r5,nfound br copfl noaf: jsr r5,diag .even crterr: jsr r5,diag .even copfl: mov $arglst,r1 mov (r1)+,0f 1: tst (r1)+ beq 1f cmp -2(r1),$-1 beq 1b tst -(r1) jsr r5,mvfil jsr r5,mesg; 'a br 1b 1: sys signal; 2; 1 / no interrupts during copy back sys creat; 0:..; 666 bes crterr mov r0,afo sys write; magic; 2 1: mov tfi,r0 sys read; buf; 512. mov r0,0f beq done mov afo,r0 sys write; buf; 0:.. br 1b done: jsr r5,diag <\0> .even comx: jsr r5,getaf br noaf 1: jsr r5,getdir br 1f tst arglst+2 beq 3f jsr r5,match br 2f mov $-1,(r1) 3: jsr r5,xtract jsr r5,mesg; 'x br 1b 2: jsr r5,skip br 1b 1: jsr r5,nfound br done comt: jsr r5,getaf br noaf 1: jsr r5,getdir br 1f tst arglst+2 beq 2f jsr r5,match br 3f mov $-1,(r1) 2: jsr r5,table 3: jsr r5,skip br 1b 1: jsr r5,nfound br done nfound: mov $arglst+2,r2 1: mov (r2)+,r1 beq 1f cmp r1,$-1 beq 1b mov $-1,-(r2) jsr r5,print mov $notfnd,r1 jsr r5,print br 1b 1: rts r5 notfnd: < -- not found\n\0> .even tfil: .even magic: -147. .bss afi: .=.+2 afo: .=.+2 tfi: .=.+2 tfo: .=.+2 fio: .=.+2 rname: .=.+9. ch: .=.+1 vflg: .=.+1 .even tname: .=.+2 dir: name: .=.+8. mtim: .=.+4 ouid: .=.+1 mode: .=.+1 size: .=.+2 arglst: .=.+200. buf: .=.+512. ijklmnopqrst/ / copyright 1972 bell telephone laboratories inc. / / PDP-11 assembler pass 0 jmp start go: jsr pc,assem movb pof,r0 sys write; outbuf; 512. movb pof,r0 sys close movb fbfil,r0 sys close tstb errflg bne aexit jsr r5,fcreat; a.tmp3 mov r0,r1 mov symend,0f sub $usymtab,0f sys write; usymtab; 0:.. mov r1,r0 sys close sys exec; 2f; 1f jsr r5,filerr; 2f; "?\n aexit: sys unlink; a.tmp1 sys unlink; a.tmp2 sys unlink; a.tmp3 sys unlink; a.tmp4 sys exit 1: 2f a.tmp1 a.tmp2 a.tmp3 a.tmp4 unglob: 3f 0 2: fpass2: 3: <-g\0> .even filerr: mov r4,-(sp) mov (r5)+,r4 mov r4,0f clr r0 1: tstb (r4)+ beq 1f inc r0 br 1b 1: mov r0,1f mov $1,r0 sys write; 0:0; 1:0 mov r5,0f mov $1,r0 sys write; 0:0; 2 tst (r5)+ mov (sp)+,r4 rts r5 fcreat: mov r4,-(sp) mov (r5)+,r4 mov r4,0f 1: sys stat; 0:..; outbuf bec 2f mov r4,0f sys creat; 0:..; 444 bes 2f mov (sp)+,r4 rts r5 2: incb 9.(r4) cmpb 9.(r4),$'z blos 1b mov r4,0f jsr r5,filerr; 0:..; "?\n sys exit / / copyright 1972 bell telephone laboratories inc. / / a2 -- pdp-11 assembler pass 1 error: incb errflg mov r0,-(sp) mov r1,-(sp) mov (r5)+,r0 mov *curarg,0f beq 1f clr *curarg mov r0,-(sp) jsr r5,filerr; 0:0; '\n mov (sp)+,r0 1: mov r2,-(sp) mov r3,-(sp) mov line,r3 movb r0,1f mov $1f+6,r0 mov $4,r1 2: clr r2 dvd $10.,r2 add $'0,r3 movb r3,-(r0) mov r2,r3 sob r1,2b mov $1,r0 sys write; 1f; 7 mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 mov (sp)+,r0 rts r5 1: .even betwen: cmp r0,(r5)+ blt 1f cmp (r5)+,r0 blt 2f 1: tst (r5)+ 2: rts r5 putw: tst ifflg beq 1f cmp r4,$'\n bne 2f 1: mov r4,*obufp add $2,obufp cmp obufp,$outbuf+512. blo 2f mov $outbuf,obufp movb pof,r0 sys write; outbuf; 512. dec nblocks bne 2f movb pof,r0 sys close movb $'a,a.tmp4+9. jsr r5,fcreat; a.tmp4 movb r0,pof 2: rts pc / / copyright 1972 bell telephone laboratories inc. / / a3 -- pdp-11 assembler pass 1 assem: jsr pc,readop jsr pc,checkeos br ealoop tst ifflg beq 3f cmp r4,$200 blos assem cmpb (r4),$21 /if bne 2f inc ifflg 2: cmpb (r4),$22 /endif bne assem dec ifflg br assem 3: mov r4,-(sp) jsr pc,readop cmp r4,$'= beq 4f cmp r4,$': beq 1f mov r4,savop mov (sp)+,r4 jsr pc,opline br ealoop 1: mov (sp)+,r4 cmp r4,$200 bhis 1f cmp r4,$1 / digit beq 3f jsr r5,error; 'x br assem 1: bitb $37,(r4) beq 1f jsr r5,error; 'm 1: bisb dot-2,(r4) mov dot,2(r4) br assem 3: mov numval,r0 jsr pc,fbcheck movb dotrel,curfbr(r0) asl r0 movb dotrel,nxtfb mov dot,nxtfb+2 movb r0,nxtfb+1 mov dot,curfb(r0) movb fbfil,r0 sys write; nxtfb; 4 br assem 4: jsr pc,readop jsr pc,expres mov (sp)+,r1 cmp r1,$200 bhis 1f jsr r5,error; 'x br ealoop 1: cmp r1,$dotrel bne 2f bic $40,r3 cmp r3,dotrel bne 1f 2: bicb $37,(r1) bic $!37,r3 bne 2f clr r2 2: bisb r3,(r1) mov r2,2(r1) br ealoop 1: jsr r5,error; '. movb $2,dotrel ealoop: cmp r4,$'; beq assem1 cmp r4,$'\n bne 1f inc line br assem1 1: cmp r4,$'\e bne 2f tst ifflg beq 1f jsr r5,error; 'x 1: rts pc 2: jsr r5,error; 'x 2: jsr pc,checkeos br assem1 jsr pc,readop br 2b assem1: jmp assem fbcheck: cmp r0,$9. bhi 1f rts pc 1: jsr r5,error; 'f clr r0 rts pc checkeos: cmp r4,$'\n beq 1f cmp r4,$'; beq 1f cmp r4,$'\e beq 1f add $2,(sp) 1: rts pc / / copyright 1972 bell telephone laboratories inc. / / a4 -- pdp-11 assembler pass1 rname: mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov $8,r5 mov $symbol,r2 clr -(sp) 1: jsr pc,rnch add r3,(sp) movb r3,(r2)+ sob r5,1b 1: jsr pc,rnch tst r3 bne 1b mov (sp)+,r1 clr r0 div $hshsiz,r0 mov r1,r0 asl r0 add $hshtab,r0 1: cmp r0,$hshtab bhi 2f mov $2*hshsiz+hshtab,r0 2: mov $symbol,r2 mov -(r0),r4 beq 3f cmp (r2)+,(r4)+ bne 1b cmp (r2)+,(r4)+ bne 1b cmp (r2)+,(r4)+ bne 1b cmp (r2)+,(r4)+ bne 1b br 1f 3: mov symend,r4 mov r4,(r0) mov r4,-(sp) add $20,r4 cmp r4,0f blos 4f add $512.,0f sys break; 0:end 4: mov (sp)+,r4 mov (r2)+,(r4)+ mov (r2)+,(r4)+ mov (r2)+,(r4)+ mov (r2)+,(r4)+ clr (r4)+ clr (r4)+ mov r4,symend sub $4,r4 1: mov r4,-(sp) mov r4,r3 sub $8,r3 cmp r3,$usymtab blo 1f sub $usymtab,r3 clr r2 div $3,r2 mov r2,r4 add $4000,r4 / user symbol br 2f 1: sub $symtab,r3 clr r2 div $3,r2 mov r2,r4 add $1000,r4 / builtin symbol 2: jsr pc,putw mov (sp)+,r4 mov (sp)+,r3 mov (sp)+,r2 tst (sp)+ mov (sp)+,r1 rts pc rnch: jsr pc,rch movb chartab(r0),r3 ble 1f rts pc 1: movb r0,ch clr r3 rts pc number: mov r2,-(sp) mov r3,-(sp) mov r5,-(sp) clr r1 clr r5 1: jsr pc,rch jsr r5,betwen; '0; '9 br 1f sub $'0,r0 mpy $10.,r5 add r0,r5 als $3,r1 add r0,r1 br 1b 1: cmp r0,$'b beq 1f cmp r0,$'f beq 1f cmp r0,$'. bne 2f mov r5,r1 clr r0 2: movb r0,ch mov r1,r0 mov (sp)+,r5 mov (sp)+,r3 mov (sp)+,r2 rts pc 1: mov r0,r3 mov r5,r0 jsr pc,fbcheck add $141,r0 cmp r3,$'b beq 1f add $10.,r0 1: mov r0,r4 mov (sp)+,r5 mov (sp)+,r3 mov (sp)+,r2 add $2,(sp) rts pc rch: movb ch,r0 beq 1f clrb ch rts pc 1: dec inbfcnt blt 2f movb *inbfp,r0 inc inbfp bic $!177,r0 beq 1b rts pc 2: movb fin,r0 beq 3f sys read; inbuf;512. bcs 2f tst r0 beq 2f mov r0,inbfcnt mov $inbuf,inbfp br 1b 2: movb fin,r0 clrb fin sys close 3: decb nargs bgt 2f mov $'\e,r0 rts pc 2: tst ifflg beq 2f jsr r5,error; 'i jmp aexit 2: mov curarg,r0 tst (r0)+ mov (r0),0f mov r0,curarg incb fileflg sys open; 0:0; 0 bec 2f mov 0b,0f jsr r5,filerr; 0:0; jmp aexit 2: movb r0,fin mov $1,line mov r4,-(sp) mov r1,-(sp) mov $5,r4 jsr pc,putw mov *curarg,r1 2: movb (r1)+,r4 beq 2f jsr pc,putw br 2b 2: mov $-1,r4 jsr pc,putw mov (sp)+,r1 mov (sp)+,r4 br 1b / / copyright 1972 bell telephone laboratories inc. / / a5 -- pdp-11 assembler pass 1 readop: mov savop,r4 beq 1f clr savop rts pc 1: jsr pc,8f jsr pc,putw rts pc 8: jsr pc,rch mov r0,r4 movb chartab(r0),r1 bgt rdname jmp *1f-2(r1) fixor escp 8b retread dquote garb squote rdname skip rdnum retread string 1: escp: jsr pc,rch mov $esctab,r1 1: cmpb r0,(r1)+ beq 1f tstb (r1)+ bne 1b rts pc 1: movb (r1),r4 rts pc esctab: .byte '/, '/ .byte '\<, 035 .byte '>, 036 .byte '%, 037 .byte 0, 0 fixor: mov $037,r4 retread: rts pc rdname: movb r0,ch cmp r1,$'0 blo 1f cmp r1,$'9 blos rdnum 1: jmp rname rdnum: jsr pc,number br 1f rts pc squote: jsr pc,rsch br 1f dquote: jsr pc,rsch mov r0,-(sp) jsr pc,rsch swab r0 bis (sp)+,r0 1: mov r0,numval mov $1,r4 jsr pc,putw mov numval,r4 jsr pc,putw mov $1,r4 tst (sp)+ rts pc skip: jsr pc,rch mov r0,r4 cmp r0,$'\e beq 1f cmp r0,$'\n bne skip 1: rts pc garb: jsr r5,error; 'g br 8b string: mov $'<,r4 jsr pc,putw clr numval 1: jsr pc,rsch tst r1 bne 1f mov r0,r4 bis $400,r4 jsr pc,putw inc numval br 1b 1: mov $-1,r4 jsr pc,putw mov $'<,r4 tst (sp)+ rts pc rsch: jsr pc,rch cmp r0,$'\e beq 4f cmp r0,$'\n beq 4f clr r1 cmp r0,$'\\ bne 3f jsr pc,rch mov $schar,r2 1: cmpb (r2)+,r0 beq 2f tstb (r2)+ bpl 1b rts pc 2: movb (r2)+,r0 clr r1 rts pc 3: cmp r0,$'> bne 1f inc r1 1: rts pc 4: jsr r5,error; '< jmp aexit schar: .byte 'n, 012 .byte 't, 011 .byte 'e, 004 .byte '0, 000 .byte 'r, 015 .byte 'a, 006 .byte 'p, 033 .byte 0, -1 / / copyright 1972 bell telephone laboratories inc. / / a6 -- pdp-11 assembler pass 1 opline: mov r4,r0 jsr r5,betwen; 0; 200 br 1f cmp r0,$'< bne xpr jmp opl17 xpr: jsr pc,expres add $2,dot rts pc 1: movb (r4),r0 cmp r0,$24 beq xpr jsr r5,betwen; 5; 36 br xpr mov r0,-(sp) jsr pc,readop mov (sp)+,r0 asl r0 jmp *1f-12(r0) 1: opl13 / map fop freg,fdst to double opl6 opl7 opl10 opl11 opl13 / map fld/fst to double opl13 opl13 / map fop fsrc,freg to double opl15 opl16 opl17 opl20 opl21 opl22 opl23 xpr opl25 opl26 opl27 opl13 / map mul s,r to double opl31 opl32 xpr xpr opl35 opl36 / jbr opl35: mov $4,-(sp) br 1f / jeq, etc opl36: mov $6,-(sp) 1: jsr pc,expres cmp r3,dotrel bne 1f sub dot,r2 bge 1f cmp r2,$-376 blt 1f mov $2,(sp) 1: add (sp)+,dot rts pc /double opl13: opl7: jsr pc,addres op2: cmp r4,$', beq 1f jsr pc,errora rts pc 1: jsr pc,readop opl15: / single operand jsr pc,addres add $2,dot rts pc opl31: / sob jsr pc,expres cmp r4,$', beq 1f jsr pc,errora 1: jsr pc,readop /branch opl6: opl10: opl11: jsr pc,expres add $2,dot rts pc / .byte opl16: jsr pc,expres inc dot cmp r4,$', bne 1f jsr pc,readop br opl16 1: rts pc / < (.ascii) opl17: add numval,dot jsr pc,readop rts pc /.even opl20: inc dot bic $1,dot rts pc /.if opl21: jsr pc,expres tst r3 bne 1f jsr r5,error; 'U 1: tst r2 bne opl22 inc ifflg opl22: /endif rts pc /.globl opl23: cmp r4,$200 blo 1f bisb $40,(r4) jsr pc,readop cmp r4,$', bne 1f jsr pc,readop br opl23 1: rts pc opl25: opl26: opl27: mov dotrel,r1 asl r1 mov dot,savdot-4(r1) mov savdot-[2*25](r0),dot asr r0 sub $25-2,r0 mov r0,dotrel rts pc / .common opl32: cmp r4,$200 blo 1f bis $40,(r4) jsr pc,readop cmp r4,$', bne 1f jsr pc,readop jsr pc,expres rts pc 1: jsr r5,error; 'x rts pc addres: cmp r4,$'( beq alp cmp r4,$'- beq amin cmp r4,$'$ beq adoll cmp r4,$'* beq astar getx: jsr pc,expres cmp r4,$'( bne 2f jsr pc,readop jsr pc,expres jsr pc,checkreg jsr pc,checkrp add $2,dot clr r0 rts pc 2: cmp r3,$24 / register type bne 1f jsr pc,checkreg clr r0 rts pc 1: add $2,dot clr r0 rts pc alp: jsr pc,readop jsr pc,expres jsr pc,checkrp jsr pc,checkreg cmp r4,$'+ bne 1f jsr pc,readop clr r0 rts pc 1: mov $2,r0 rts pc amin: jsr pc,readop cmp r4,$'( beq 1f mov r4,savop mov $'-,r4 br getx 1: jsr pc,readop jsr pc,expres jsr pc,checkrp jsr pc,checkreg clr r0 rts pc adoll: jsr pc,readop jsr pc,expres add $2,dot clr r0 rts pc astar: jsr pc,readop cmp r0,$'* beq 1f jsr pc,addres add r0,dot rts pc 2: jsr r5,error; '* rts pc errora: jsr r5,error; 'a rts pc checkreg: cmp r2,$7 bhi 1f cmp r3,$1 beq 2f cmp r3,$4 bhi 2f 1: jsr pc,errora 2: rts pc errore: jsr r5,error; 'e rts pc checkrp: cmp r4,$') beq 1f jsr r5,error; ') rts pc 1: jsr pc,readop rts pc / / copyright 1972 bell telephone laboratories inc. / / a7 -- pdp-11 assembler pass 1 expres: mov r5,-(sp) mov $'+,-(sp) clr opfound clr r2 mov $1,r3 br 1f advanc: jsr pc,readop 1: mov r4,r0 jsr r5,betwen; 0; 177 br .+4 br 7f movb (r4),r0 mov 2(r4),r1 br oprand 7: cmp r4,$141 blo 1f cmp r4,$141+10. bhis 2f movb curfbr-141(r4),r0 asl r4 mov curfb-[2*141](r4),r2 bpl oprand jsr r5,error; 'f br oprand 2: clr r3 clr r2 br oprand 1: mov $esw1,r1 1: cmp (r1)+,r4 beq 1f tst (r1)+ bne 1b tst opfound bne 2f jsr pc,errore 2: tst (sp)+ mov (sp)+,r5 rts pc 1: jmp *(r1) esw1: '+; binop '-; binop '*; binop '/; binop '&; binop 037; binop 035; binop 036; binop '%; binop '[; brack '^; binop 1; exnum '!; binop 0; 0 binop: cmpb (sp),$'+ beq 1f jsr pc,errore 1: movb r4,(sp) br advanc exnum: mov numval,r1 mov $1,r0 br oprand brack: mov r2,-(sp) mov r3,-(sp) jsr pc,readop jsr pc,expres cmp r4,$'] beq 1f jsr r5,error; '] 1: mov r3,r0 mov r2,r1 mov (sp)+,r3 mov (sp)+,r2 oprand: inc opfound mov $exsw2,r5 1: cmp (sp),(r5)+ beq 1f tst (r5)+ bne 1b br eoprnd 1: jmp *(r5) exsw2: '+; exadd '-; exsub '*; exmul '/; exdiv 037; exor '&; exand 035;exlsh 036;exrsh '%; exmod '!; exnot '^; excmbin 0; 0 excmbin: mov r0,r3 / give left flag of right br eoprnd exrsh: neg r1 beq exlsh inc r1 clc ror r2 exlsh: jsr r5,combin; 0 als r1,r2 br eoprnd exmod: jsr r5,combin; 0 mov r1,-(sp) mov r2,r1 clr r0 dvd (sp)+,r0 mov r1,r2 br eoprnd exadd: jsr r5,combin; 0 add r1,r2 br eoprnd exsub: jsr r5,combin; 1 sub r1,r2 br eoprnd exand: jsr r5,combin; 0 com r1 bic r1,r2 br eoprnd exor: jsr r5,combin; 0 bis r1,r2 br eoprnd exmul: jsr r5,combin; 0 mpy r2,r1 mov r1,r2 br eoprnd exdiv: jsr r5,combin; 0 mov r1,-(sp) mov r2,r1 clr r0 dvd (sp)+,r0 mov r0,r2 br eoprnd exnot: jsr r5,combin; 0 com r1 add r1,r2 br eoprnd eoprnd: mov $'+,(sp) jmp advanc combin: mov r0,-(sp) bis r3,(sp) bic $!40,(sp) bic $!37,r0 bic $!37,r3 cmp r0,r3 ble 1f mov r0,-(sp) mov r3,r0 mov (sp)+,r3 1: tst r0 beq 1f tst (r5)+ beq 2f cmp r0,r3 bne 2f mov $1,r3 br 2f 1: tst (r5)+ clr r3 2: bis (sp)+,r3 rts r5 / / copyright 1972 bell telephone laboratories inc. / / a8 -- pdp-11 assembler pass 1 chartab: .byte -14,-14,-14,-14,-02,-14,-14,-14 .byte -14,-22, -2,-14,-14,-22,-14,-14 .byte -14,-14,-14,-14,-14,-14,-14,-14 .byte -14,-14,-14,-14,-14,-14,-14,-14 .byte -22,-20,-16,-14,-20,-20,-20,-12 .byte -20,-20,-20,-20,-20,-20,056,-06 .byte 060,061,062,063,064,065,066,067 .byte 070,071,-20,-02,-00,-20,-14,-14 .byte -14,101,102,103,104,105,106,107 .byte 110,111,112,113,114,115,116,117 .byte 120,121,122,123,124,125,126,127 .byte 130,131,132,-20,-24,-20,-20,137 .byte -14,141,142,143,144,145,146,147 .byte 150,151,152,153,154,155,156,157 .byte 160,161,162,163,164,165,166,167 .byte 170,171,172,-14,-26,-14,-14,-14 namedone: .byte 0 a.tmp1: a.tmp2: a.tmp3: a.tmp4: .even nblocks: 126. curfb: -1;-1;-1;-1;-1;-1;-1;-1;-1;-1 obufp: outbuf symend: usymtab .bss curfbr: .=.+10. savdot: .=.+6 bufcnt: .=.+2 hshsiz = 1000. hshtab: .=2*hshsiz+. pof: .=.+1 wordf: .=.+1 fin: .=.+1 fbfil: .=.+1 fileflg:.=.+1 errflg: .=.+1 ch: .=.+1 .even symbol: .=.+8. obufc: .=.+2 outbuf: .=.+512. line: .=.+2 inbfcnt:.=.+2 ifflg: .=.+2 inbfp: .=.+2 nargs: .=.+2 curarg: .=.+2 opfound:.=.+2 savop: .=.+2 numval: .=.+2 nxtfb: .=.+4 usymtab:.=.+36. end: .text / / copyright 1972 bell telephone laboratories inc. / / a9 -- pdp-11 assembler pass 1 eae = 0 / key to types / 0 undefined / 1 absolute / 2 text / 3 data / 4 bss / 5 flop freg,dst (movfo, = stcfd) / 6 branch / 7 jsr / 10 rts / 11 sys / 12 movf (=ldf,stf) / 13 double operand (mov) / 14 flop fsrc,freg (addf) / 15 single operand (clr) / 16 .byte / 17 string (.ascii, "<") / 20 .even / 21 .if / 22 .endif / 23 .globl / 24 register / 25 .text / 26 .data / 27 .bss / 30 mul,div, etc / 31 sob / 32 .comm / 33 estimated text / 34 estimated data / 35 jbr / 36 jeq, jne, etc symtab: / special variables <.\0\0\0\0\0\0\0>; dotrel:02; dot:000000 <..\0\0\0\0\0\0>; 01; dotdot:000000 / register ; 24;000000 ; 24;000001 ; 24;000002 ; 24;000003 ; 24;000004 ; 24;000005 ; 24;000006 ; 24;000007 .if eae /eae & switches ; 01;177570 ; 01;177300 ; 01;177302 ; 01;177304 ; 01;177306 ; 01;177310 ; 01;177311 ; 01;177312 ; 01;177314 ; 01;177316 .endif / system calls ; 01;0000001 ; 01;0000002 ; 01;0000003 ; 01;0000004 ; 01;0000005 ; 01;0000006 ; 01;0000007 ; 01;0000010 ; 01;0000011 ; 01;0000012 ; 01;0000013 ; 01;0000014 ; 01;0000015 ; 01;0000016 ; 01;0000017 ; 01;0000020 ; 01;0000021 ; 01;0000022 ; 01;0000023 ; 01;0000024 ; 01;0000025 ; 01;0000026 ; 01;0000027 ; 01;0000030 ; 01;0000031 ; 01;0000034 ; 01;0000036 ; 01;0000037 ; 01;0000040 ; 01;0000042 ; 01;0000060 / double operand ; 13;0010000 ; 13;0110000 ; 13;0020000 ; 13;0120000 ; 13;0030000 ; 13;0130000 ; 13;0040000 ; 13;0140000 ; 13;0050000 ; 13;0150000 ; 13;0060000 ; 13;0160000 / branch ; 06;0000400 ; 06;0001000 ; 06;0001400 ; 06;0002000 ; 06;0002400 ; 06;0003000 ; 06;0003400 ; 06;0100000 ; 06;0100400 ; 06;0101000 ; 06;0101400 ; 06;0102000 ; 06;0102400 ; 06;0103000 ; 06;0103000 ; 06;0103000 ; 06;0103400 ; 06;0103400 ; 06;0103400 / jump/branch type ; 35;0000400 ; 36;0001000 ; 36;0001400 ; 36;0002000 ; 36;0002400 ; 36;0003000 ; 36;0003400 ; 36;0100000 ; 36;0100400 ; 36;0101000 ; 36;0101400 ; 36;0102000 ; 36;0102400 ; 36;0103000 ; 36;0103000 ; 36;0103000 ; 36;0103400 ; 36;0103400 ; 36;0103400 / single operand ; 15;0005000 ; 15;0105000 ; 15;0005100 ; 15;0105100 ; 15;0005200 ; 15;0105200 ; 15;0005300 ; 15;0105300 ; 15;0005400 ; 15;0105400 ; 15;0005500 ; 15;0105500 ; 15;0005600 ; 15;0105600 ; 15;0005700 ; 15;0105700 ; 15;0006000 ; 15;0106000 ; 15;0006100 ; 15;0106100 ; 15;0006200 ; 15;0106200 ; 15;0006300 ; 15;0106300 ; 15;0000100 ; 15;0000300 / jsr ; 07;0004000 / rts ; 010;000200 / simple operand ; 011;104400 / flag-setting ; 01;0000241 ; 01;0000242 ; 01;0000244 ; 01;0000250 ; 01;0000261 ; 01;0000262 ; 01;0000264 ; 01;0000270 / floating point ops ; 01;170000 ; 01;170001 ; 01;170011 ; 01;170002 ; 01;170012 ; 15;170400 ; 15;170700 ; 15;170600 ; 15;170500 ; 12;172400 ; 14;177000 ; 05;175400 ; 14;177400 ; 05;176000 ; 14;172000 ; 14;173000 ; 14;171000 ; 14;174400 ; 14;173400 ; 14;171400 ; 14;176400 ; 05;175000 ; 15;170100 ; 15;170200 ; 24;000000 ; 24;000001 ; 24;000002 ; 24;000003 ; 24;000004 ; 24;000005 / 11/45 operations ; 30;072000 ; 30;073000 ; 30;070000 .if eae-1 ; 30;070000 ; 30;071000 ; 30;072000 ; 30;073000 .endif ; 30;071000 ; 07;074000 ; 15;006700 ; 11;006400 ; 31;077000 / specials <.byte\0\0\0>; 16;000000 <.even\0\0\0>; 20;000000 <.if\0\0\0\0\0>; 21;000000 <.endif\0\0>; 22;000000 <.globl\0\0>; 23;000000 <.text\0\0\0>; 25;000000 <.data\0\0\0>; 26;000000 <.bss\0\0\0\0>; 27;000000 <.comm\0\0\0>; 32;000000 ebsymtab: start: sys signal; 2; 1 ror r0 bcs 1f sys signal; 2; aexit 1: mov sp,r5 mov (r5)+,r0 cmpb *2(r5),$'- bne 1f tst (r5)+ dec r0 br 2f 1: clr unglob 2: movb r0,nargs mov r5,curarg jsr r5,fcreat; a.tmp1 movb r0,pof jsr r5,fcreat; a.tmp2 movb r0,fbfil jsr pc,setup jmp go setup: mov $symtab,r1 1: mov $symbol,r0 clr r3 mov $8,r2 mov r1,-(sp) 2: movb (r1)+,r4 add r4,r3 movb r4,(r0)+ sob r2,2b jsr pc,slot mov (sp)+,r1 mov r1,(r3) add $12.,r1 cmp r1,$ebsymtab blo 1b rts pc slot: clr r2 div $hshsiz,r2 asl r3 add $hshtab,r3 1: cmp r3,$hshtab bhi 2f mov $2*hshsiz+hshtab,r3 2: tst -(r3) bne 1b rts pc /overlay buffer inbuf = setup . =inbuf+512. / / copyright 1972 bell telephone laboratories inc. / / a21 -- pdp-11 assembler pass 2 main: sys signal; 2; 1 ror r0 bcs 1f sys signal; 2; aexit 1: jmp start / set up sizes and origins go: / read in symbol table mov $usymtab,r1 1: jsr pc,getw bvs 1f add $14,symsiz / count symbols jsr pc,getw jsr pc,getw jsr pc,getw jsr pc,getw mov r4,r0 bic $!37,r0 cmp r0,$2 /text blo 2f cmp r0,$3 /data bhi 2f add $31,r4 /mark "estimated" mov r4,(r1)+ jsr pc,getw mov r4,(r1)+ br 3f 2: clr (r1)+ clr (r1)+ jsr pc,getw 3: jsr pc,setbrk br 1b 1: / read in f-b definitions mov r1,fbbufp movb fbfil,fin clr ibufc 1: jsr pc,getw bvs 1f add $31,r4 / "estimated" mov r4,(r1)+ jsr pc,getw mov r4,(r1)+ jsr pc,setbrk br 1b 1: mov r1,endtable mov $100000,(r1)+ / set up input text file; initialize f-b table jsr pc,setup / do pass 1 mov pc,istext jsr pc,assem / prepare for pass 2 cmp outmod,$777 beq 1f jmp aexit 1: clr dot mov $2,dotrel mov $..,dotdot clr brtabp movb fin,r0 sys close jsr r5,ofile; a.tmp1 movb r0,fin clr ibufc jsr pc,setup inc passno inc bsssiz bic $1,bsssiz mov txtsiz,r1 inc r1 bic $1,r1 mov r1,txtsiz mov datsiz,r2 inc r2 bic $1,r2 mov r2,datsiz mov r1,r3 mov r3,datbase / txtsiz mov r3,savdot+2 add r2,r3 mov r3,bssbase / txtsiz+datsiz mov r3,savdot+4 asl r3 add $20,r3 mov r3,symseek / 2*txtsiz+2*datsiz+20 sub r2,r3 mov r3,drelseek / 2*txtsiz+datsiz sub r1,r3 mov r3,trelseek / txtsiz+datsiz+20 sub r2,r3 mov r3,datseek / txtsiz+20 mov $usymtab,r1 1: jsr pc,doreloc add $4,r1 cmp r1,endtable blo 1b clr r0 jsr r5,oset; txtp mov trelseek,r0 jsr r5,oset; relp mov $8.,r2 mov $txtmagic,r1 1: mov (r1)+,r0 jsr r5,putw; txtp dec r2 bne 1b jsr pc,assem /polish off text and relocation clr istext jsr r5,flush; txtp jsr r5,flush; relp / append full symbol table mov symf,r0 mov r0,fin sys seek; 0; 0; clr ibufc mov symseek,r0 jsr r5,oset; txtp mov $usymtab,r1 1: jsr pc,getw bvs 1f mov r4,r0 jsr r5,putw; txtp jsr pc,getw mov r4,r0 jsr r5,putw; txtp jsr pc,getw mov r4,r0 jsr r5,putw; txtp jsr pc,getw mov r4,r0 jsr r5,putw; txtp mov (r1)+,r0 jsr r5,putw; txtp mov (r1)+,r0 jsr r5,putw; txtp jsr pc,getw jsr pc,getw br 1b 1: jsr r5,flush; txtp aexit: mov a.tmp1,0f sys unlink; 0:.. mov a.tmp2,0f sys unlink; 0:.. mov a.tmp3,0f sys unlink; 0:.. mov a.tmp4,0f sys unlink; 0:.. sys chmod; a.out; outmod: 777 sys exit filerr: mov *(r5),r5 1: movb (r5)+,ch beq 1f mov $1,r0 sys write; ch; 1 br 1b 1: mov $1,r0 sys write; qnl; 2 br aexit doreloc: movb (r1),r0 bne 1f bisb defund,(r1) 1: bic $!37,r0 cmp r0,$5 bhis 1f cmp r0,$3 blo 1f beq 2f add bssbase,2(r1) rts pc 2: add datbase,2(r1) 1: rts pc setbrk: mov r1,-(sp) add $20,r1 cmp r1,0f blo 1f add $512.,0f sys break; 0: end 1: mov (sp)+,r1 rts pc setup: mov $curfb,r4 1: clr (r4)+ cmp r4,$curfb+40. blo 1b mov txtfil,fin clr ibufc clr r4 1: jsr pc,fbadv tstb (r4)+ cmp r4,$10. blt 1b rts pc ofile: mov *(r5),0f sys open; 0:..; 0 bes 1f tst (r5)+ rts r5 1: jmp filerr / / copyright 1972 bell telephone laboratories inc. / / a2 -- pdp-11 assembler pass 2 outw: cmp dot-2,$4 beq 9f bit $1,dot bne 1f add $2,dot tstb passno beq 8f clr -(sp) rol r3 adc (sp) asr r3 / get relative pc bit cmp r3,$40 bne 2f / external references mov $666,outmod / make nonexecutable mov xsymbol,r3 sub $usymtab,r3 asl r3 bis $4,r3 / external relocation br 3f 2: bic $40,r3 / clear any ext bits cmp r3,$5 blo 4f mov $1,r3 / make absolute 4: cmp r3,$2 blo 5f cmp r3,$4 bhi 5f tst (sp) bne 4f add dotdot,r2 br 4f 5: tst (sp) beq 4f sub dotdot,r2 4: dec r3 bpl 3f clr r3 3: asl r3 bis (sp)+,r3 mov r2,r0 jsr r5,putw; txtp add $2,*tseekp mov r3,r0 jsr r5,putw; relp add $2,*rseekp 8: rts pc 1: jsr r5,error; 'o clr r3 jsr pc,outb rts pc 9: jsr r5,error; 'x rts pc outb: cmp dot-2,$4 / test bss mode beq 9b cmp r3,$1 blos 1f jsr r5,error; 'r 1: tstb passno beq 2f mov r2,r0 jsr r5,putc; txtp bit $1,dot bne 1f clr r0 jsr r5,putw; relp add $2,*rseekp 1: inc *tseekp 2: inc dot rts pc error: mov $666,outmod / make nonexecutable mov r3,-(sp) mov r2,-(sp) mov r1,-(sp) mov r0,-(sp) mov $argb,r1 1: movb (r1),ch beq 1f clrb (r1)+ mov $1,r0 sys write; ch; 1 br 1b 1: mov (r5)+,r0 movb r0,0f mov line,r3 mov $0f+6,r0 mov $4,r1 2: clr r2 dvd $10.,r2 add $'0,r3 movb r3,-(r0) mov r2,r3 sob r1,2b mov $1,r0 sys write; 0f; 7 mov (sp)+,r0 mov (sp)+,r1 mov (sp)+,r2 mov (sp)+,r3 rts r5 0: .even betwen: cmp r0,(r5)+ blt 1f cmp (r5)+,r0 blt 2f 1: tst (r5)+ 2: rts r5 / / copyright 1972 bell telephone laboratories inc. / / a3 -- pdp-11 assembler pass 2 assem: jsr pc,readop cmp r4,$5 beq 2f cmp r4,$'< beq 2f jsr pc,checkeos br eal1 mov r4,-(sp) cmp (sp),$1 bne 1f mov $2,(sp) jsr pc,getw mov r4,numval 1: jsr pc,readop cmp r4,$'= beq 4f cmp r4,$': beq 1f mov r4,savop mov (sp)+,r4 2: jsr pc,opline dotmax: tstb passno bne eal1 movb dotrel,r0 asl r0 cmp dot,txtsiz-4(r0) blos ealoop mov dot,txtsiz-4(r0) eal1: jmp ealoop 1: mov (sp)+,r4 cmp r4,$200 bhis 1f cmp r4,$2 beq 3f jsr r5,error; 'x br assem 1: tstb passno bne 2f movb (r4),r0 bic $!37,r0 beq 5f cmp r0,$33 blt 6f cmp r0,$34 ble 5f 6: jsr r5,error; 'm 5: bic $37,(r4) bis dotrel,(r4) mov 2(r4),brdelt sub dot,brdelt mov dot,2(r4) br assem 2: cmp dot,2(r4) beq assem jsr r5,error; 'p br assem 3: mov numval,r4 jsr pc,fbadv asl r4 mov curfb(r4),r0 movb dotrel,(r0) mov 2(r0),brdelt sub dot,brdelt mov dot,2(r0) br assem 4: jsr pc,readop jsr pc,expres mov (sp)+,r1 cmp r1,$symtab /test for dot bne 1f bic $40,r3 cmp r3,dotrel / can't change relocation bne 2f cmp r3,$4 / bss bne 3f mov r2,dot br dotmax 3: sub dot,r2 bmi 2f mov r2,-(sp) 3: dec (sp) bmi 3f clr r2 mov $1,r3 jsr pc,outb br 3b 3: tst (sp)+ br dotmax 2: jsr r5,error; '. br ealoop 1: cmp r3,$40 bne 1f jsr r5,error; 'r 1: bic $37,(r1) bic $!37,r3 bne 1f clr r2 1: bisb r3,(r1) mov r2,2(r1) ealoop: cmp r4,$'\n beq 1f cmp r4,$'\e bne 9f rts pc 1: inc line 9: jmp assem checkeos: cmp r4,$'\n beq 1f cmp r4,$'; beq 1f cmp r4,$'\e beq 1f add $2,(sp) 1: rts pc fbadv: asl r4 mov nxtfb(r4),r1 mov r1,curfb(r4) bne 1f mov fbbufp,r1 br 2f 1: add $4,r1 2: cmpb 1(r1),r4 beq 1f tst (r1) bpl 1b 1: mov r1,nxtfb(r4) asr r4 rts pc / / copyright 1972 bell telephone laboratories inc. / / a4 -- pdp-11 assembler pass 2 oset: mov r2,-(sp) mov (r5)+,r1 mov r0,r2 bic $!777,r0 add r1,r0 add $6,r0 mov r0,(r1)+ / next slot mov r1,r0 add $1004,r0 mov r0,(r1)+ / buf max mov r2,(r1)+ / seek addr mov (sp)+,r2 rts r5 putw: mov (r5),0f jsr r5,putc; 0:.. swab r0 putc: mov r1,-(sp) mov r2,-(sp) mov (r5)+,r2 mov (r2)+,r1 / slot cmp r1,(r2) / buf max bhis 1f movb r0,(r1)+ mov r1,-(r2) br 2f 1: tst (r2)+ mov r0,-(sp) jsr r5,flush1 mov (sp)+,r0 movb r0,*(r2)+ inc -(r2) 2: mov (sp)+,r2 mov (sp)+,r1 rts r5 flush: mov (r5)+,r2 cmp (r2)+,(r2)+ flush1: mov (r2)+,r1 mov r1,0f / seek address mov fout,r0 sys seek; 0:..; 0 bic $!777,r1 add r2,r1 / write address mov r1,0f mov r2,r0 bis $777,-(r2) inc (r2) / new seek addr cmp -(r2),-(r2) sub (r2),r1 neg r1 mov r1,0f+2 / count mov r0,(r2) / new next slot mov fout,r0 sys write; 0:..; .. rts r5 readop: mov savop,r4 beq 1f clr savop rts pc 1: jsr pc,getw1 cmp r4,$200 blo 1f cmp r4,$4000 blo 2f add $usymtab-4000,r4 rts pc 2: add $symtab-1000,r4 1: rts pc getw: mov savop,r4 beq getw1 clr savop rts pc getw1: dec ibufc bgt 1f movb fin,r0 sys read; inbuf; 512. bes 3f asr r0 mov r0,ibufc bne 2f 3: tst istext beq 3f movb fin,r0 sys close jsr r5,ofile; a.tmp4 movb r0,fin br getw1 3: mov $4,r4 sev rts pc 2: mov $inbuf,ibufp 1: mov *ibufp,r4 add $2,ibufp rts pc / / copyright 1972 bell telephone laboratories inc. / / as25 is empty / / copyright 1972 bell telephone laboratories inc. / / a6 -- pdp-11 assembler pass 2 opline: mov r4,r0 jsr r5,betwen; 0; 177 br 2f cmp r4,$5 beq opeof cmp r4,$'< bne xpr jmp opl17 xxpr: tst (sp)+ xpr: jsr pc,expres jsr pc,outw rts pc 2: movb (r4),r0 cmp r0,$24 /reg beq xpr cmp r0,$33 /est text beq xpr cmp r0,$34 / est data beq xpr jsr r5,betwen; 5; 36 br xpr mov 2(r4),-(sp) mov r0,-(sp) jsr pc,readop mov (sp)+,r0 asl r0 mov $adrbuf,r5 clr swapf mov $-1,rlimit jmp *1f-10.(r0) 1: opl5 opl6 opl7 opl10 opl11 opl12 opl13 opl14 opl15 opl16 opl17 opl20 opl21 opl22 opl23 xxpr opl25 opl26 opl27 opl30 opl31 opl32 xxpr xxpr opl35 opl36 opeof: mov $1,line mov $20,-(sp) mov $argb,r1 1: jsr pc,getw tst r4 bmi 1f movb r4,(r1)+ dec (sp) bgt 1b tstb -(r1) br 1b 1: movb $'\n,(r1)+ clrb (r1)+ tst (sp)+ rts pc opl30: / mpy, dvd etc inc swapf mov $1000,rlimit br opl13 opl14: / flop freg,fsrc inc swapf opl5: / flop src,freg mov $400,rlimit /double opl13: jsr pc,addres op2a: mov r2,-(sp) jsr pc,readop op2b: jsr pc,addres tst swapf beq 1f mov (sp),r0 mov r2,(sp) mov r0,r2 1: swab (sp) asr (sp) asr (sp) cmp (sp),rlimit blo 1f jsr r5,error; 'x 1: bis (sp)+,r2 bis (sp)+,r2 clr r3 jsr pc,outw mov $adrbuf,r1 1: cmp r1,r5 bhis 1f mov (r1)+,r2 mov (r1)+,r3 mov (r1)+,xsymbol jsr pc,outw br 1b 1: rts pc opl15: / single operand clr -(sp) br op2b opl12: / movf mov $400,rlimit jsr pc,addres cmp r2,$4 / see if source is fregister blo 1f inc swapf br op2a 1: mov $174000,(sp) br op2a / jbr opl35: / jeq, jne, etc opl36: jsr pc,expres tstb passno bne 1f mov r2,r0 jsr pc,setbr tst r2 beq 2f cmp (sp),$br beq 2f add $2,r2 2: add r2,dot / if doesn't fit add $2,dot tst (sp)+ rts pc 1: jsr pc,getbr bcc dobranch mov (sp)+,r0 mov r2,-(sp) mov r3,-(sp) cmp r0,$br beq 2f mov $402,r2 xor r0,r2 / flip cond, add ".+6" mov $1,r3 jsr pc,outw 2: mov $1,r3 mov $jmp+37,r2 jsr pc,outw mov (sp)+,r3 mov (sp)+,r2 jsr pc,outw rts pc /sob opl31: / sob jsr pc,expres jsr pc,checkreg swab r2 asr r2 asr r2 bis r2,(sp) jsr pc,readop jsr pc,expres tstb passno beq 3f sub dot,r2 neg r2 mov r2,r0 jsr r5,betwen; -2; 175 br 2f add $4,r2 br 1f /branch opl6: jsr pc,expres tstb passno beq 3f dobranch: sub dot,r2 mov r2,r0 jsr r5,betwen; -254.; 256. br 2f 1: bit $1,r2 bne 2f cmp r3,dot-2 / same relocation as . bne 2f asr r2 dec r2 bic $177400,r2 3: bis (sp)+,r2 clr r3 jsr pc,outw rts pc 2: jsr r5,error; 'b clr r2 br 3b /jsr opl7: jsr pc,expres jsr pc,checkreg jmp op2a / rts opl10: jsr pc,expres jsr pc,checkreg br 1f / sys, emt etc opl11: jsr pc,expres cmp r2,$64. bhis 0f cmp r3,$1 ble 1f 0: jsr pc,errora 1: bis (sp)+,r2 jsr pc,outw rts pc / .byte opl16: jsr pc,expres jsr pc,outb cmp r4,$', bne 1f jsr pc,readop br opl16 1: tst (sp)+ rts pc / < (.ascii) opl17: jsr pc,getw mov $1,r3 mov r4,r2 bmi 2f bic $!377,r2 jsr pc,outb br opl17 2: jsr pc,getw rts pc /.even opl20: bit $1,dot beq 1f cmp dot-2,$4 beq 2f / bss mode clr r2 clr r3 jsr pc,outb br 1f 2: inc dot 1: tst (sp)+ rts pc opl21: /if jsr pc,expres opl22: oplret: tst (sp)+ rts pc /.globl opl23: cmp r4,$200 blo 1f bisb $40,(r4) jsr pc,readop cmp r4,$', bne 1f jsr pc,readop br opl23 1: tst (sp)+ rts pc / .text, .data, .bss opl25: opl26: opl27: mov r0,-(sp) mov dot-2,r1 asl r1 mov dot,savdot-4(r1) tstb passno beq 1f jsr r5,flush; txtp jsr r5,flush; relp mov (sp),r2 add $txtseek-[2*25],r2 mov r2,tseekp mov (r2),r0 jsr r5,oset; txtp add $trelseek-txtseek,r2 mov (r2),r0 mov r2,rseekp jsr r5,oset; relp 1: mov (sp)+,r0 mov savdot-[2*25](r0),dot asr r0 sub $25-2,r0 mov r0,dot-2 / new . relocation tst (sp)+ rts pc opl32: cmp r4,$200 blo 1f mov r4,-(sp) jsr pc,readop jsr pc,readop jsr pc,expres mov (sp)+,r0 bit $37,(r0) bne 1f bis $40,(r0) mov r2,2(r0) 1: tst (sp)+ rts pc addres: clr -(sp) 4: cmp r4,$'( beq alp cmp r4,$'- beq amin cmp r4,$'$ beq adoll cmp r4,$'* bne getx jmp astar getx: jsr pc,expres cmp r4,$'( bne 2f jsr pc,readop mov r2,(r5)+ mov r3,(r5)+ mov xsymbol,(r5)+ jsr pc,expres jsr pc,checkreg jsr pc,checkrp bis $60,r2 bis (sp)+,r2 rts pc 2: cmp r3,$24 bne 1f jsr pc,checkreg bis (sp)+,r2 rts pc 1: mov r3,-(sp) bic $40,r3 mov (sp)+,r3 bis $100000,r3 sub dot,r2 sub $4,r2 cmp r5,$adrbuf beq 1f sub $2,r2 1: mov r2,(r5)+ / index mov r3,(r5)+ / index reloc. mov xsymbol,(r5)+ / index global mov $67,r2 / address mode bis (sp)+,r2 rts pc alp: jsr pc,readop jsr pc,expres jsr pc,checkrp jsr pc,checkreg cmp r4,$'+ beq 1f tst (sp)+ beq 2f bis $70,r2 clr (r5)+ clr (r5)+ mov xsymbol,(r5)+ rts pc 2: bis $10,r2 rts pc 1: jsr pc,readop bis $20,r2 bis (sp)+,r2 rts pc amin: jsr pc,readop cmp r4,$'( beq 1f mov r4,savop mov $'-,r4 br getx 1: jsr pc,readop jsr pc,expres jsr pc,checkrp jsr pc,checkreg bis (sp)+,r2 bis $40,r2 rts pc adoll: jsr pc,readop jsr pc,expres mov r2,(r5)+ mov r3,(r5)+ mov xsymbol,(r5)+ mov (sp)+,r2 bis $27,r2 rts pc astar: tst (sp) beq 1f jsr r5,error; '* 1: mov $10,(sp) jsr pc,readop jmp 4b errora: jsr r5,error; 'a rts pc checkreg: cmp r2,$7 bhi 1f cmp r1,$1 blos 2f cmp r3,$5 blo 1f 2: rts pc 1: jsr pc,errora clr r2 clr r3 rts pc errore: jsr r5,error; 'e rts pc checkrp: cmp r4,$') beq 1f jsr r5,error; ') rts pc 1: jsr pc,readop rts pc setbr: mov brtabp,r1 cmp r1,$brlen blt 1f mov $2,r2 rts pc 1: inc brtabp clr -(sp) sub dot,r0 ble 1f sub brdelt,r0 1: jsr r5,betwen; -254.; 256. br 1f br 2f 1: mov r1,-(sp) bic $!7,(sp) mov $1,r0 ash (sp)+,r0 ash $-3,r1 bisb r0,brtab(r1) mov $2,(sp) 2: mov (sp)+,r2 rts pc getbr: mov brtabp,r1 cmp r1,$brlen blt 1f sec rts pc 1: mov r1,-(sp) bic $!7,(sp) neg (sp) inc brtabp ash $-3,r1 movb brtab(r1),r1 ash (sp)+,r1 ror r1 / 0-bit into c-bit rts pc / / copyright 1972 bell telephone laboratories inc. / / a7 -- pdp-11 assembler expres: clr xsymbol expres1: mov r5,-(sp) mov $'+,-(sp) clr r2 mov $1,r3 br 1f advanc: jsr pc,readop 1: mov r4,r0 jsr r5,betwen; 0; 177 br .+4 br 7f movb (r4),r0 tst r0 bne 1f tstb passno beq 1f jsr r5,error; 'u 1: cmp r0,$40 bne 1f mov r4,xsymbol clr r1 br oprand 1: mov 2(r4),r1 br oprand 7: cmp r4,$141 blo 1f asl r4 mov curfb-[2*141](r4),r0 mov 2(r0),r1 movb (r0),r0 br oprand 1: mov $esw1,r1 1: cmp (r1)+,r4 beq 1f tst (r1)+ bne 1b tst (sp)+ mov (sp)+,r5 rts pc 1: jmp *(r1) esw1: '+; binop '-; binop '*; binop '/; binop '&; binop 037; binop 035; binop 036; binop '%; binop '[; brack '^; binop 1; exnum 2; exnum1 '!; binop 200; 0 binop: cmpb (sp),$'+ beq 1f jsr pc,errore 1: movb r4,(sp) br advanc exnum1: mov numval,r1 br 1f exnum: jsr pc,getw mov r4,r1 1: mov $1,r0 br oprand brack: mov r2,-(sp) mov r3,-(sp) jsr pc,readop jsr pc,expres1 cmp r4,$'] beq 1f jsr r5,error; '] 1: mov r3,r0 mov r2,r1 mov (sp)+,r3 mov (sp)+,r2 oprand: mov $exsw2,r5 1: cmp (sp),(r5)+ beq 1f tst (r5)+ bne 1b br eoprnd 1: jmp *(r5) exsw2: '+; exadd '-; exsub '*; exmul '/; exdiv 037; exor '&; exand 035;exlsh 036;exrsh '%; exmod '^; excmbin '!; exnot 200; 0 excmbin: mov r0,r3 br eoprnd exrsh: neg r1 beq exlsh inc r1 clc ror r2 exlsh: jsr r5,combin; relte2 als r1,r2 br eoprnd exmod: jsr r5,combin; relte2 mov r3,r0 mov r2,r3 clr r2 dvd r1,r2 mov r3,r2 mov r0,r3 br eoprnd exadd: jsr r5,combin; reltp2 add r1,r2 br eoprnd exsub: jsr r5,combin; reltm2 sub r1,r2 br eoprnd exand: jsr r5,combin; relte2 com r1 bic r1,r2 br eoprnd exor: jsr r5,combin; relte2 bis r1,r2 br eoprnd exmul: jsr r5,combin; relte2 mpy r2,r1 mov r1,r2 br eoprnd exdiv: jsr r5,combin; relte2 mov r3,r0 mov r2,r3 clr r2 dvd r1,r2 mov r0,r3 br eoprnd exnot: jsr r5,combin; relte2 com r1 add r1,r2 br eoprnd eoprnd: mov $'+,(sp) jmp advanc combin: tstb passno bne combin1 mov r0,-(sp) bis r3,(sp) bic $!40,(sp) bic $!37,r0 bic $!37,r3 cmp r0,r3 ble 1f mov r0,-(sp) mov r3,r0 mov (sp)+,r3 1: tst r0 beq 1f cmp (r5)+,$reltm2 bne 2f cmp r0,r3 bne 2f mov $1,r3 br 2f 1: tst (r5)+ clr r3 2: bis (sp)+,r3 rts r5 combin1: mov r1,-(sp) clr maxtyp jsr pc,maprel mov r0,r1 mpy $6,r1 mov r3,r0 jsr pc,maprel add (r5)+,r0 add r1,r0 movb (r0),r3 bpl 1f cmp r3,$-1 beq 2f jsr r5,error; 'r 2: mov maxtyp,r3 1: mov (sp)+,r1 rts r5 maprel: cmp r0,$40 bne 1f mov $5,r0 rts pc 1: bic $!37,r0 cmp r0,maxtyp blos 1f mov r0,maxtyp 1: cmp r0,$5 blos 1f mov $1,r0 1: rts pc X = -2 M = -1 reltp2: .byte 0, 0, 0, 0, 0, 0 .byte 0, M, 2, 3, 4,40 .byte 0, 2, X, X, X, X .byte 0, 3, X, X, X, X .byte 0, 4, X, X, X, X .byte 0,40, X, X, X, X reltm2: .byte 0, 0, 0, 0, 0, 0 .byte 0, M, 2, 3, 4,40 .byte 0, X, 1, X, X, X .byte 0, X, X, 1, X, X .byte 0, X, X, X, 1, X .byte 0, X, X, X, X, X relte2: .byte 0, 0, 0, 0, 0, 0 .byte 0, M, X, X, X, X .byte 0, X, X, X, X, X .byte 0, X, X, X, X, X .byte 0, X, X, X, X, X .byte 0, X, X, X, X, X / / copyright 1972 bell telephone laboratories inc. / / as8 -- PDP-11 assembler pass 2 qnl: a.out: badfil: / a file which should never exist .even a.outp: a.out a.tmp1: badfil a.tmp2: badfil a.tmp3: badfil a.tmp4: badfil tseekp: txtseek rseekp: trelseek txtmagic: br .+20 txtsiz: .=.+2 datsiz: .=.+2 bsssiz: .=.+2 symsiz: .=.+2 stksiz: .=.+2 exorig: .=.+2 .=.+2 txtseek: 20 datseek:.=.+2 .=.+2 trelseek:.=.+2 drelseek:.=.+2 .=.+2 symseek:.=.+2 .bss istext: .=.+2 brlen = 1024. brtab: .=.+[brlen\/8.] brtabp: .=.+2 brdelt: .=.+2 fbbufp: .=.+2 defund: .=.+2 savdot: .=.+6 datbase:.=.+2 bssbase:.=.+2 fbfil: .=.+2 fin: .=.+2 ibufc: .=.+2 txtfil: .=.+2 symf: .=.+2 adrbuf: .=.+12. xsymbol:.=.+2 fout: .=.+2 ch: .=.+2 wordf: .=.+2 argb: .=.+22. line: .=.+2 savop: .=.+2 curfb: .=.+20. nxtfb: .=.+20. numval: .=.+2 maxtyp: .=.+2 relfil: .=.+2 ibufp: .=.+2 txtp: .=.+6+512. relp: .=.+6+512. swapf: .=.+2 rlimit: .=.+2 passno: .=.+2 endtable:.=.+2 usymtab:.=.+20. end: .text / / copyright 1972 bell telephone laboratories inc. / / as9 -- PDP-11 assembler pass 2 eae = 0 symtab: / special variables dotrel: 02; dot:000000 /. 01; dotdot:000000 /.. / register 24;000000 /r0 24;000001 /r1 24;000002 /r2 24;000003 /r3 24;000004 /r4 24;000005 /r5 24;000006 /sp 24;000007 /pc .if eae /eae & switches 01;177570 /csw 01;177300 /div 01;177302 /ac 01;177304 /mq 01;177306 /mul 01;177310 /sc 01;177311 /sr 01;177312 /nor 01;177314 /lsh 01;177316 /ash .endif / system calls 01;0000001 /exit 01;0000002 /fork 01;0000003 /read 01;0000004 /write 01;0000005 /open 01;0000006 /close 01;0000007 /wait 01;0000010 /creat 01;0000011 /link 01;0000012 /unlink 01;0000013 /exec 01;0000014 /chdir 01;0000015 /time 01;0000016 /makdir 01;0000017 /chmod 01;0000020 /chown 01;0000021 /break 01;0000022 /stat 01;0000023 /seek 01;0000024 /tell 01;0000025 /mount 01;0000026 /umount 01;0000027 /setuid 01;0000030 /getuid 01;0000031 /stime 01;0000034 /fstat 01;0000036 /mdate 01;0000037 /stty 01;0000040 /gtty 01;0000042 /nice 01;0000060 /signal / double operand 13;0010000 /mov 13;0110000 /movb 13;0020000 /cmp 13;0120000 /cmpb 13;0030000 /bit 13;0130000 /bitb 13;0040000 /bic 13;0140000 /bicb 13;0050000 /bis 13;0150000 /bisb 13;0060000 /add 13;0160000 /sub / branch 06;0000400 /br 06;0001000 /bne 06;0001400 /beq 06;0002000 /bge 06;0002400 /blt 06;0003000 /bgt 06;0003400 /ble 06;0100000 /bpl 06;0100400 /bmi 06;0101000 /bhi 06;0101400 /blos 06;0102000 /bvc 06;0102400 /bvs 06;0103000 /bhis 06;0103000 /bec 06;0103000 /bcc 06;0103400 /blo 06;0103400 /bcs 06;0103400 /bes / jump/ branch type 35;0000400 /jbr 36;0001000 /jne 36;0001400 /jeq 36;0002000 /jge 36;0002400 /jlt 36;0003000 /jgt 36;0003400 /jle 36;0100000 /jpl 36;0100400 /jmi 36;0101000 /jhi 36;0101400 /jlos 36;0102000 /jvc 36;0102400 /jvs 36;0103000 /jhis 36;0103000 /jec 36;0103000 /jcc 36;0103400 /jlo 36;0103400 /jcs 36;0103400 /jes / single operand 15;0005000 /clr 15;0105000 /clrb 15;0005100 /com 15;0105100 /comb 15;0005200 /inc 15;0105200 /incb 15;0005300 /dec 15;0105300 /decb 15;0005400 /neg 15;0105400 /negb 15;0005500 /adc 15;0105500 /adcb 15;0005600 /sbc 15;0105600 /sbcb 15;0005700 /tst 15;0105700 /tstb 15;0006000 /ror 15;0106000 /rorb 15;0006100 /rol 15;0106100 /rolb 15;0006200 /asr 15;0106200 /asrb 15;0006300 /asl 15;0106300 /aslb 15;0000100 /jmp 15;0000300 /swab / jsr 07;0004000 /jsr / rts 10;000200 /rts / simple operand 11;104400 /sys / flag-setting 01;0000241 /clc 01;0000242 /clv 01;0000244 /clz 01;0000250 /cln 01;0000261 /sec 01;0000262 /sev 01;0000264 /sez 01;0000270 /sen / floating point ops 01;170000 / cfcc 01;170001 / setf 01;170011 / setd 01;170002 / seti 01;170012 / setl 15;170400 / clrf 15;170700 / negf 15;170600 / absf 15;170500 / tstf 12;172400 / movf 14;177000 / movif 05;175400 / movfi 14;177400 / movof 05;176000 / movfo 14;172000 / addf 14;173000 / subf 14;171000 / mulf 14;174400 / divf 14;173400 / cmpf 14;171400 / modf 14;176400 / movie 05;175000 / movei 15;170100 / ldfps 15;170200 / stfps 24;000000 / fr0 24;000001 / fr1 24;000002 / fr2 24;000003 / fr3 24;000004 / fr4 24;000005 / fr5 / 11/45 operations 30;072000 /als (ash) 30;073000 /alsc (ashc) 30;070000 /mpy .if eae-1 30;070000/ mul 30;071000 / div 30;072000 / ash 30;073000 /ashc .endif 30;071000 /dvd 07;074000 /xor 15;006700 /sxt 11;006400 /mark 31;077000 /sob / specials 16;000000 /.byte 20;000000 /.even 21;000000 /.if 22;000000 /.endif 23;000000 /.globl 25;000000 /.text 26;000000 /.data 27;000000 /.bss 32;000000 /.comm start: cmp (sp),$4 bge 1f jmp aexit 1: cmp (sp)+,$6 blt 1f mov $40,defund / globalize all undefineds 1: tst (sp)+ mov (sp)+,a.tmp1 mov (sp)+,a.tmp2 mov (sp)+,a.tmp3 mov (sp)+,a.tmp4 jsr r5,ofile; a.tmp1 movb r0,txtfil jsr r5,ofile; a.tmp2 movb r0,fbfil jsr r5,ofile; a.tmp3 movb r0,symf movb r0,fin sys creat; a.out; 0 bec 1f jsr r5,filerr; a.outp 1: movb r0,fout jmp go / overlaid buffer inbuf = start . = inbuf+512. / / copyright 1972 bell telephone laboratories inc. / / bas0 -- basic .globl main .globl sin, cos, log, exp, atan, pow .globl rand, srand .globl fptrap one = 40200 main: sys signal; 4; fptrap setd sys time mov r1,r0 mov r0,randx jsr pc,srand sys signal; 2; 1 ror r0 bes 1f sys signal; 2; intrup 1: mov sp,gsp clr seeka mov $'a,r1 1: movb r1,tmpf+8 sys stat; tmpf; line bes 1f inc r1 cmp r1,$'z blos 1b br 2f 1: sys creat; tmpf; 600 bes 2f mov r0,tfo sys open; tmpf; 0 bec 1f 2: mov $3f,r0 jsr pc,print sys exit 3: ; .even 1: mov r0,tfi jsr pc,isymtab cmp (sp),$2 blt loop mov 4(sp),argname sys 0; 9f .data 9: sys open; argname: b.out; 0 .text bes 1f mov r0,fi br loop 1: mov $1f,r0 jsr pc,print br loop 1: ; .even intrup: sys signal; 2; intrup mov $'\n,r0 jsr r5,putc jsr r5,error ; .even loop: mov gsp,sp clr lineno jsr pc,rdline mov $line,r3 1: movb (r3),r0 jsr pc,digit br 1f jsr r5,atoi; nextc cmp r0,$' / bne 1f mov $lintab,r3 mov r1,r0 bgt 2f jsr pc,serror 2: cmp r0,(r3) beq 2f tst (r3) beq 2f add $6,r3 br 2b 2: cmp r3,$elintab-12. blo 2f jsr r5,error ; .even 2: mov r0,(r3)+ mov seeka,(r3)+ mov tfo,r0 sys 0; 9f .data 9: sys seek; seeka:..; 0 .text mov $line,r0 jsr pc,size inc r0 add r0,seeka mov r0,0f mov tfo,r0 sys 0; 9f .data 9: sys write; line; 0:.. .text br loop 1: mov $line,r3 jsr pc,singstat br loop nextc: movb (r3)+,r0 rts r5 size: clr -(sp) 1: tstb (r0) beq 1f inc (sp) cmpb (r0)+,$'\n bne 1b 1: mov (sp)+,r0 rts pc rdline: mov $line,0f 1: mov fi,r0 sys 0; 9f .data 9: sys read; 0:..; 1 .text bes 2f tst r0 beq 2f cmp 0b,$line+99. bhis 2f / bad check, but a check movb *0b,r0 inc 0b cmp r0,$'\n bne 1b clrb *0b rts pc 2: mov fi,r0 beq 1f sys close clr fi br 1b 1: jmp _done error: mov fi,r0 beq 1f sys close clr fi 1: mov fo,r0 cmp r0,$1 beq 1f sys close mov $1,fo 1: tst lineno beq 1f jsr pc,nextlin br 1f mov $line,r0 jsr pc,print 1: mov r5,r0 jsr pc,print jmp loop serror: dec r3 tst fi beq 1f sys close clr fi 1: mov $line,r1 1: cmp r1,r3 bne 2f mov $'_,r0 jsr r5,putc mov $10,r0 jsr r5,putc 2: movb (r1),r0 jsr r5,putc cmpb (r1)+,$'\n bne 1b jmp loop print: mov r0,0f jsr pc,size mov r0,0f+2 mov fo,r0 sys 0; 9f .data 9: sys write; 0:..; .. .text rts pc digit: cmp r0,$'0 blo 1f cmp r0,$'9 bhi 1f add $2,(sp) 1: rts pc alpha: cmp r0,$'a blo 1f cmp r0,$'z bhi 1f add $2,(sp) 1: rts pc name: mov $nameb,r1 clr (r1) clr 2(r1) 1: cmp r1,$nameb+4 bhis 2f movb r0,(r1)+ 2: movb (r3)+,r0 jsr pc,alpha br 2f br 1b 2: jsr pc,digit br 2f br 1b 2: mov $resnam,r1 1: cmp nameb,(r1) bne 2f cmp nameb+2,2(r1) bne 2f sub $resnam,r1 asr r1 add $2,(sp) rts pc 2: add $4,r1 cmp r1,$eresnam blo 1b mov $symtab,r1 1: tst (r1) beq 1f cmp nameb,(r1) bne 2f cmp nameb+2,2(r1) bne 2f rts pc 2: add $14.,r1 br 1b 1: cmp r1,$esymtab-28. blo 1f jsr r5,error ; .even 1: mov nameb,(r1) mov nameb+2,2(r1) clr 4(r1) clr 14.(r1) rts pc skip: cmp r0,$' / bne 1f movb (r3)+,r0 br skip 1: rts pc putc: tstb drflg beq 1f jsr pc,drput rts r5 1: mov r0,ch mov $1,r0 sys write; ch; 1 rts r5 nextlin: clr -(sp) mov $lintab,r1 1: tst (r1) beq 1f cmp lineno,(r1) bhi 2f mov (sp),r0 beq 3f cmp (r0),(r1) blos 2f 3: mov r1,(sp) 2: add $6,r1 br 1b 1: mov (sp)+,r1 beq 1f mov (r1)+,lineno mov (r1)+,0f mov tfi,r0 sys 0; 9f .data 9: sys seek; 0:..; 0 .text mov tfi,r0 sys read; line; 100. add $2,(sp) 1: rts pc getloc: mov $lintab,r1 1: tst (r1) beq 1f cmp r0,(r1) beq 2f add $6,r1 br 1b 1: jsr r5,error vt: .even resnam: eresnam: symtnam: esymtnam: .data fo: 1 .bss drx: .=.+8 dry: .=.+8 drfo: .=.+2 ch: .=.+1 drflg: .=.+1 randx: .=.+2 fsgn: .=.+2 gsp: .=.+2 forp: .=.+2 exprloc:.=.+2 sstack: .=.+2 sublev: .=.+2 val: .=.+2 line: .=.+100. tfi: .=.+2 fi: .=.+2 lineno: .=.+2 nameb: .=.+6 tfo: .=.+2 symtab: .=.+1000.; esymtab: space: .=.+5000.; espace: exline: .=.+1000.; eexline: lintab: .=.+1000.; elintab: stack: .=.+1000.; estack: char dayw[] { " S M Tu W Th F S" }; char *smon[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; char string[432]; main(argc, argv) char *argv[]; { register y, i, j; int m; if(argc < 2) { printf("usage: cal [month] year\n"); exit(); } if(argc == 2) goto long; /* * print out just month */ m = number(argv[1]); if(m<1 || m>12) goto badarg; y = number(argv[2]); if(y<1 || y>9999) goto badarg; printf(" %s %l\n", smon[m-1], y); printf("%s\n", dayw); cal(m, y, string, 24); for(i=0; i<6*24; i=+24) pstr(string+i, 24); exit(); /* * print out complete year */ long: y = number(argv[1]); if(y<1 || y>9999) goto badarg; printf("\n\n\n"); printf(" %l\n", y); printf("\n"); for(i=0; i<12; i=+3) { for(j=0; j<6*72; j++) string[j] = '\0'; printf(" %s", smon[i]); printf(" %s", smon[i+1]); printf(" %s\n", smon[i+2]); printf("%s %s %s\n", dayw, dayw, dayw); cal(i+1, y, string, 72); cal(i+2, y, string+23, 72); cal(i+3, y, string+46, 72); for(j=0; j<6*72; j=+72) pstr(string+j, 72); } printf("\n\n\n"); exit(); badarg: printf("Bad argument\n"); } number(str) char *str; { register n, c; register char *s; n = 0; s = str; while(c = *s++) { if(c<'0' || c>'9') return(0); n = n*10 + c-'0'; } return(n); } pstr(str, n) char *str; { register i; register char *s; s = str; i = n; while(i--) if(*s++ == '\0') s[-1] = ' '; i = n+1; while(i--) if(*--s != ' ') break; s[1] = '\0'; printf("%s\n", str); } char mon[] { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; cal(m, y, p, w) char *p; { register d, i; register char *s; s = p; d = jan1(y); mon[2] = 29; mon[9] = 30; switch((jan1(y+1)+7-d)%7) { /* * non-leap year */ case 1: mon[2] = 28; break; /* * 1752 */ default: mon[9] = 19; break; /* * leap year */ case 2: ; } for(i=1; i 9) *s = i/10+'0'; s++; *s++ = i%10+'0'; s++; if(++d == 7) { d = 0; s = p+w; p = s; } } } /* * return day of the week * of jan 1 of given year */ jan1(yr) { register y, d; /* * normal gregorian calendar * one extra day per four years */ y = yr; d = 4+y+(y+3)/4; /* * julian calendar * regular gregorian * less three days per 400 */ if(y > 1800) { d =- (y-1701)/100; d =+ (y-1601)/400; } /* * great calendar changeover instant */ if(y > 1752) d =+ 3; return(d%7); } / cat -- concatinate files mov (sp)+,r5 tst (sp)+ mov $obuf,r2 cmp r5,$1 beq 3f loop: dec r5 ble done mov (sp)+,r0 cmpb (r0),$'- bne 2f clr fin br 3f 2: mov r0,0f sys open; 0:..; 0 bes loop mov r0,fin 3: mov fin,r0 sys read; ibuf; 512. bes 3f mov r0,r4 beq 3f mov $ibuf,r3 4: movb (r3)+,r0 jsr pc,putc dec r4 bne 4b br 3b 3: mov fin,r0 beq loop sys close br loop done: sub $obuf,r2 beq 1f mov r2,0f mov $1,r0 sys write; obuf; 0:.. 1: sys exit putc: movb r0,(r2)+ cmp r2,$obuf+512. blo 1f mov $1,r0 sys write; obuf; 512. mov $obuf,r2 1: rts pc .bss ibuf: .=.+512. obuf: .=.+512. fin: .=.+2 .text ...ac.car.sas11.sas12.sas13.sas14.sas15.sas16.sas17.sas18.sas19.sas21.sas22.sas23.sas24.sas25.sas26.sas27.sas28.sas29.sbas0.sbas1.sbas2.sbas3.sbas4.sbas5.sbasx.scal.ccat.scc.c/* C command */ char *tmp0; char *tmp1; char *tmp2; char *tmp3; char *tmp4; char *tmp5; char ts[1000]; char *tsp ts; char *av[50]; char *clist[50]; char *llist[50]; int instring; int pflag; int sflag; int cflag; int oflag; int proflag; int *ibuf; int *ibuf1; int *ibuf2; int *obuf; char *lp; char *line; int lineno; int exfail; struct symtab { char name[8]; char *value; } *symtab; int symsiz 200; struct symtab *defloc; struct symtab *incloc; char *stringbuf; char *pass0 "/lib/c0"; char *pass1 "/lib/c1"; char *pref "/lib/crt0.o"; main(argc, argv) char *argv[]; { char *t; int nc, nl, i, j, c, f20, nxo; int dexit(); i = nc = nl = f20 = nxo = 0; while(++i < argc) { if(*argv[i] == '-') switch (argv[i][1]) { default: goto passa; case 'S': sflag++; cflag++; break; case 'O': oflag++; break; case 'p': proflag++; pref = "/lib/mcrt0.o"; break; case 'P': pflag++; case 'c': cflag++; break; case '2': if(argv[i][2] == '\0') pref = "/lib/crt2.o"; else { pref = "/lib/crt20.o"; f20 = 1; } break; case 't': if (argv[i][2]=='0') pass0 = "/usr/c/c0"; if (argv[i][2]=='1') pass1 = "/usr/c/c1"; break; } else { passa: t = argv[i]; if(getsuf(t)=='c') { clist[nc++] = t; t = setsuf(copy(t), 'o'); } if (nodup(llist, t)) { llist[nl++] = t; if (getsuf(t)=='o') nxo++; } } } if(nc==0) goto nocom; if (pflag==0) { tmp0 = copy("/tmp/ctm0a"); while((c=open(tmp0, 0))>=0) { close(c); tmp0[9]++; } while((creat(tmp0, 0400))<0) tmp0[9]++; } if ((signal(2, 1) & 01) == 0) signal(2, &dexit); (tmp1 = copy(tmp0))[8] = '1'; (tmp2 = copy(tmp0))[8] = '2'; (tmp3 = copy(tmp0))[8] = '3'; if (oflag) (tmp5 = copy(tmp0))[8] = '5'; if (pflag==0) (tmp4 = copy(tmp0))[8] = '4'; for (i=0; i1) printf("%s:\n", clist[i]); av[0] = "c0"; if (pflag) tmp4 = setsuf(copy(clist[i]), 'i'); av[1] = expand(clist[i]); if (pflag || exfail) continue; if (av[1] == 0) { cflag++; continue; } av[2] = tmp1; av[3] = tmp2; if (proflag) { av[4] = "-P"; av[5] = 0; } else av[4] = 0; if (callsys(pass0, av)) { cflag++; continue; } av[0] = "c1"; av[1] = tmp1; av[2] = tmp2; if (sflag) tmp3 = setsuf(copy(clist[i]), 's'); av[3] = tmp3; if (oflag) av[3] = tmp5; av[4] = 0; if(callsys(pass1, av)) { cflag++; continue; } if (oflag) { av[0] = "c2"; av[1] = tmp5; av[2] = tmp3; av[3] = 0; callsys("/lib/c2", av); unlink(tmp5); } if (sflag) continue; av[0] = "as"; av[1] = "-"; av[2] = tmp3; av[3] = 0; cunlink(tmp1); cunlink(tmp2); cunlink(tmp4); callsys("/bin/as", av); t = setsuf(clist[i], 'o'); cunlink(t); if(link("a.out", t) || cunlink("a.out")) { printf("move failed: %s\n", t); cflag++; } } nocom: if (cflag==0 && nl!=0) { i = 0; av[0] = "ld"; av[1] = "-x"; av[2] = pref; j = 3; while(ivalue = defloc->name; incloc = lookup("include", 1); incloc->value = incloc->name; stringbuf = sbf; line = ln; lineno = 0; if (fcreat(tmp4, obuf) < 0) { printf("Can't creat %s\n", tmp4); dexit(); } while(getline()) { if (ibuf==ibuf2 && pflag==0) putc(001, obuf); /*SOH: insert */ if (ln[0] != '#') for (rlp = line; c = *rlp++;) putc(c, obuf); putc('\n', obuf); } fflush(obuf); close(obuf[0]); close(ibuf1[0]); return(tmp4); } getline() { register int c, sc, state; struct symtab *np; char *namep, *filname; if (ibuf==ibuf1) lineno++; lp = line; *lp = '\0'; state = 0; if ((c=getch()) == '#') state = 1; while (c!='\n' && c!='\0') { if ('a'<=c && c<='z' || 'A'<=c && c<='Z' || c=='_') { namep = lp; sch(c); while ('a'<=(c=getch()) && c<='z' ||'A'<=c && c<='Z' ||'0'<=c && c<='9' ||c=='_') sch(c); sch('\0'); lp--; np = lookup(namep, state); if (state==1) { if (np==defloc) state = 2; else if (np==incloc) state = 3; else { error("Undefined control"); while (c!='\n' && c!='\0') c = getch(); return(c); } } else if (state==2) { np->value = stringbuf; while ((c=getch())!='\n' && c!='\0') savch(c); savch('\0'); return(1); } continue; } else if ((sc=c)=='\'' || sc=='"') { sch(sc); filname = lp; instring++; while ((c=getch())!=sc && c!='\n' && c!='\0') { sch(c); if (c=='\\') sch(getch()); } instring = 0; if (state==3) { *lp = '\0'; while ((c=getch())!='\n' && c!='\0'); if (ibuf==ibuf2) error("Nested 'include'"); if (fopen(filname, ibuf2)<0) error("Missing file %s", filname); else ibuf = ibuf2; return(c); } } sch(c); c = getch(); } sch('\0'); if (state>1) error("Control syntax"); return(c); } error(s, x) { printf("%d: ", lineno); printf(s, x); putchar('\n'); exfail++; cflag++; } sch(c) { register char *rlp; rlp = lp; if (rlp==line+194) error("Line overflow"); *rlp++ = c; if (rlp>line+195) rlp = line+195; lp = rlp; } savch(c) { *stringbuf++ = c; } getch() { static peekc; register int c; if (peekc) { c = peekc; peekc = 0; return(c); } loop: if ((c=getc1())=='/' && !instring) { if ((peekc=getc1())!='*') return('/'); peekc = 0; for(;;) { c = getc1(); cloop: switch (c) { case '\0': return('\0'); case '*': if ((c=getc1())=='/') goto loop; goto cloop; case '\n': if (ibuf==ibuf1) { putc('\n', obuf); lineno++; } continue; } } } return(c); } getc1() { register c; if ((c = getc(ibuf)) < 0 && ibuf==ibuf2) { close(ibuf2[0]); ibuf = ibuf1; putc('\n', obuf); c = getc1(); } if (c<0) return(0); return(c); } lookup(namep, enterf) char *namep; { register char *np, *snp; register struct symtab *sp; int i, c; np = namep; i = 0; while (c = *np++) i =+ c; i =% symsiz; sp = &symtab[i]; while (sp->name[0]) { snp = sp; np = namep; while (*snp++ == *np) if (*np++ == '\0' || np==namep+8) { if (!enterf) subst(namep, sp); return(sp); } if (sp++ > &symtab[symsiz]) sp = symtab; } if (enterf) { snp = namep; for (np = &sp->name[0]; np < &sp->name[8];) if (*np++ = *snp) snp++; } return(sp); } subst(np, sp) char *np; struct symtab *sp; { register char *vp; lp = np; if ((vp = sp->value) == 0) return; sch(' '); while (*vp) sch(*vp++); sch(' '); } getsuf(as) char as[]; { register int c; register char *s; register int t; s = as; c = 0; while(t = *s++) if (t=='/') c = 0; else c++; s =- 3; if (c<=14 && c>2 && *s++=='.') return(*s); return(0); } setsuf(as, ch) char as[]; { register char *s; s = as; while(*s++); s[-2] = ch; return(as); } callsys(f, v) char f[], *v[]; { int t, status; if ((t=fork())==0) { execv(f, v); printf("Can't find %s\n", f); exit(1); } else if (t == -1) { printf("Try again\n"); return(1); } while(t!=wait(&status)); if ((t=(status&0377)) != 0 && t!=14) { if (t!=2) /* interrupt */ printf("Fatal error in %s\n", f); dexit(); } return((status>>8) & 0377); } copy(as) char as[]; { register char *otsp, *s; otsp = tsp; s = as; while(*tsp++ = *s++); return(otsp); } nodup(l, os) char **l, *os; { register char *t, *s; register int c; s = os; if (getsuf(s) != 'o') return(1); while(t = *l++) { while(c = *s++) if (c != *t++) break; if (*t++ == '\0') return(0); s = os; } return(1); } cunlink(f) char *f; { if (f==0) return(0); return(unlink(f)); }     /* C debugger */ int fcore; int fsym; int symoff; char *lp; int errflg; int symlen; int symct; char symbol[8]; int symflg; int symval; char ssymbol[8]; int ssymflg; int ssymval; char line[128]; int regbuf[512]; char **uuusp; char *usize; char **uregs; char *textsize; int pc -2; int r5 -9; int dot; int tdot; int dotinc 2; int lastcom '/'; main(argc, argv) char **argv; { char *corfil, *symfil; if (argc<2) corfil = "core"; else corfil = argv[1]; if (argc<3) symfil = "a.out"; else symfil = argv[2]; if ((fcore = open(corfil, 0)) < 0) { printf("%s not found\n", corfil); return; } if ((fsym = open(symfil, 0)) < 0) { printf("%s not found\n", symfil); return; } read(fsym, regbuf, 020); if (regbuf[0]==0410) textsize = regbuf[1]; else if (regbuf[0] != 0407) { /* magic */ printf("Bad format: %s\n", symfil); return; } symoff = regbuf[1] + regbuf[2]; symlen = regbuf[4]; if (regbuf[7] != 1) symoff =<< 1; symoff =+ 020; fstat(fcore, regbuf); usize = regbuf[5]-1024; read(fcore, regbuf, 1024); uuusp = ®buf[512-6]; uregs = ®buf[512]; setexit(); loop: if (errflg) { printf("?\n"); errflg = 0; } lp = line; while ((*lp = getchar()) != '\n') if (*lp++ == '\0') return; lp = line; command(); goto loop; } command() { int adrflg, n; adrflg = expr(); if (errflg) return; n = getcnt(); if (*lp == '\n') { if (!adrflg) dot =+ dotinc; } else lastcom = *lp++; if (*lp != '\n') { errflg++; return; } if (adrflg) dot = tdot; while(n) { scommand(); if (--n) dot =+ dotinc; } } scommand() { int w, c; switch(lastcom) { case '/': printf("%o\n", cget(dot)); dotinc = 2; return; case '=': printf("%o\n", dot); return; case '\'': printc(cget(dot) & 0377); putchar('\n'); dotinc = 1; return; case '"': w = cget(dot); while(c = cget(w++)&0377) printc(c); putchar('\n'); return; case '&': vallook(cget(dot)); if (errflg) reset(); for (c=0; c<8; c++) printf("%c", ssymbol[c]); return; case '$': printtrace(); return; } } getcnt() { int t1, t2; if (*lp != ',') return(1); lp++; t1 = tdot; if (expr() == 0) { tdot = t1; return(1); } t2 = tdot; tdot = t1; return(t2); } cget(n) { int w; w = get(n); if (errflg) reset(); return(w); } printc(c) { if (c<' ' || c>'}') printf("\\%o", c); else printf("%c", c); } expr() { char tsym[10]; int i, t1, t2, donef, adrflg, lastop, b; tdot = 0; adrflg = 0; lastop = '+'; ssymval = 0; donef = 0; loop: if (*lp >= 'a' && *lp <= 'z' || *lp=='_') { i = 0; tsym[i++] = '_'; adrflg++; while(*lp>='a'&&*lp<='z' || *lp>='0'&&*lp<='9' || *lp=='_') { if (i < 8) tsym[i++] = *lp; lp++; } while (i<8) tsym[i++] = '\0'; if (symlook(tsym) == 0) { errflg++; reset(); } goto loop; } if (*lp>='0' && *lp<='9') { adrflg++; ssymval = 0; if (*lp == '0') b = 8; else b = 10; while (*lp>='0' && *lp<='9') { ssymval =* b; ssymval =+ *lp++ -'0'; } goto loop; } switch (*lp) { default: donef++; case '+': case '-': switch(lastop) { case '+': tdot =+ ssymval; goto op; case '-': tdot =- ssymval; op: if (donef) return(adrflg); else lastop = *lp++; } goto loop; case ' ': case '\t': lp++; goto loop; case '[': lp++; t1 = ssymval; t2 = tdot; if (expr() == 0) tdot = 0; ssymval = get(t1 + (tdot<<1)); if (errflg) reset(); tdot = t2; if (*lp == ']') lp++; goto loop; } } printtrace() { int tpc, tr5, narg, argp, i; tpc = uregs[pc]; tr5 = uregs[r5]; if (symlook("savr5")) if (narg = get(ssymval)) tr5 = narg; while (errflg == 0) { narg = findroutine(tpc, tr5); for (i=0; i<8; i++) printf("%c", ssymbol[i]); printf("("); if (--narg >= 0) printf("%o", get(tr5+4)); argp = tr5+4; while(--narg >= 0) printf(",%o", get(argp =+ 2)); printf(")\n"); tpc = get(tr5+2); if ((tr5 = get(tr5)) == 0) break; } } findroutine(rpc, rr5) { int callpt, inst, narg; callpt = get(rr5+2); if ((inst=get(callpt-4)) == 04737) /* jsr pc,*$... */ narg = 1; else if ((inst&~077)==04700) /* jsr pc,... */ narg = 0; else { errflg++; return(0); } vallook((inst==04767?callpt:0) + get(callpt-2)); inst = get(callpt); if (inst == 05726) /* tst (sp)+ */ return(narg+1); if (inst == 022626) /* cmp (sp)+,(sp)+ */ return(narg+2); if (inst == 062706) /* add $n,sp */ return(narg+get(callpt+2)/2); return(narg); } symlook(symstr) char *symstr; { symset(); while(symget()) { if (eqstr(symbol, symstr)) { savsym(); return(1); } } return(0); } eqstr(as1, as2) int *as1, *as2; { register int *s1, *s2, *es1; s1 = as1; s2 = as2; for (es1 = s1+4; s1 < es1; ) if (*s1++ != *s2++) return(0); return(1); } vallook(value) { symset(); while(symget()) if (symval == value && (symflg&037) == 2) { savsym('_'); return; } errflg++; } get(addr) char *addr; { int w; w = 0; if (addr < textsize) { seek(fsym, addr+020, 0); if (read(fsym, &w, 2) != 2) errflg++; return(w); } if (addr >= *uuusp) addr =+ usize; else addr =- (textsize+017777) & ~017777; seek(fcore, addr+1024, 0); if (read(fcore, &w, 2) < 2) errflg++; return(w); } symset() { symct = symlen; seek(fsym, symoff, 0); } symget() { if ((symct =- 12) < 0) return(0); return(read(fsym, symbol, 12) == 12); } savsym(skip) { int ch; char *p, *q; p = symbol; q = ssymbol; while (p1 && *argv[1] == '-') { argc--; argv++; arg = *argv; while(*arg) switch(*arg++) { case 'u': uflg++; case 'l': lflg++; continue; case 's': sflg++; continue; case 'i': dlist[ndlist++] = number(argv[1]); argc--; argv++; continue; case 'b': blist[nblist++] = number(argv[1]); argc--; argv++; continue; case 'g': great = number(argv[1]); argc--; argv++; continue; } } if (lflg) sflg = 0; fout = dup(1); argc--; argv++; fprintf("%s:\n", argv[0]); check(argv[0]); flush(); close(fout); fout = 1; if(argc > 1) execv("/bin/check", argv); } check(file) char *file; { struct inode buf[16]; register i, j; int compar(), cintr(); struct fname *dnp; fi = open(file, 0); if(fi < 0) { fprintf("cannot open %s\n", file); return; } sync(); bread(1, &sblock); if (lflg) { if(uflg) { ucnt = sbrk(sblock.s_isize*2); if(bad(ucnt)) return; } else { lfdes = creat(lfile, 0666); if ((signal(2, 1) & 01) == 0) signal(2, cintr); } dn = edn = sbrk(101*6); if(bad(dn)) return; } else { bmap = sbrk(8192); icnt = sbrk(sblock.s_isize*16); if(bad(bmap) || bad(icnt)) return; } for(i=0; ipnum == 0) { if(dnp->inum != 1) j = 1; continue; } printf("%4l", dnp->inum); if (dnp->inum == i) putchar('l'); else putchar(' '); i = dnp->inum; putchar(' '); if(lflg > 1) pstat(i, buf); pfilename(dnp, 0); if(j) { j = 0; printf("/."); } putchar('\n'); } close(lfdes); unlink(lfile); return; } sync(); bread(1, &sblock); if(sflg) { close(fi); fi = open(file, 1); if(fi < 0) { fprintf("cannot write %s\n", file); return; } sblock.s_nfree = 0; sblock.s_ninode = 0; sblock.s_flock = 0; sblock.s_ilock = 0; sblock.s_fmod = 0; free(0); for(i=sblock.s_fsize-1; i>=sblock.s_isize+2; i--) { ndup = 0; chk(i, "URK", 0); if(ndup == 0) free(i); } bwrite(1, &sblock); close(fi); sync(); return; } while(i = alloc()) { if(chk(i, "free", 0)) break; nfree++; } if(ndup) printf("%l dups in free\n", ndup); ndup = sblock.s_fsize - sblock.s_isize - 2; for(i=0; i<8192; i++) { j = bmap[i]; ndup =+ bitcnt[j&017]; ndup =+ bitcnt[(j>>4)&017]; } if(ndup) printf("%l missing\n", ndup); for(i=0; iicnt[i] & 0377; if(j!=0 && j!=0200) printf("%6l %3o\n", i+1, j); } printf("spcl %6l\n", nspcl); printf("files %6l\n", nfile); printf("large %6l\n", nlarg); printf("direc %6l\n", ndir); printf("indir %6l\n", nindir); printf("used %6l\n", nused); printf("last %6l\n", hiwat); printf("free %6l\n", nfree); close(fi); } cintr() { unlink(lfile); exit(); } compar(p1, p2) struct fname *p1, *p2; { int i; i = p1->inum - p2->inum; if(i) return(i); return(p1->pnum - p2->pnum); } pass1(ip) struct inode *ip; { int buf[256]; register i, j, df; if((ip->i_mode&IALLOC) == 0) return; if(uflg) { i = ldiv(0, ino, 8); ucnt[i] =| 1<icnt[ino-1] =+ 0100; if(ip->i_nlink) icnt->icnt[ino-1] =+ 0100 + ip->i_nlink; } if((ip->i_mode&IFCHR&IFBLK) != 0) { nspcl++; return; } df = 0; if((ip->i_mode&IFMT) == IFDIR) { df = ldiv(ip->i_size0, ip->i_size1, 16); if(lflg && !uflg) { if(--nnf<0) { nnf = 100; edn = sbrk(6*101); if(bad(edn)) lflg = 0; } edn->pnum = 0; edn->inum = ino; edn++; } ndir++; } else if (lflg) return; nfile++; if((ip->i_mode&ILARG) != 0) { nlarg++; for(i=0; i<8; i++) if(ip->i_addr[i] != 0) { nindir++; if(chk(ip->i_addr[i], "idir", 0)) continue; bread(ip->i_addr[i], buf); for(j=0; j<256; j++) if(buf[j] != 0) chk(buf[j], "ldir", df); df =- 32; } return; } for(i=0; i<8; i++) { if(ip->i_addr[i] != 0) chk(ip->i_addr[i], "sdir", df); df =- 32; } } chk(ii, s, df) char *ii; { register char *i; register n, j; int b; int buf[256]; struct { int ino; char name[14]; }; i = ii; for(j=0; j= great && i) fprintf("%l geq; i=%l(%s)\n", i, ino, s); if(ino) { nused++; if(i > hiwat) hiwat = i; } if(i=sblock.s_fsize) { fprintf("%l bad; i=%l(%s)\n", i, ino, s); return(1); } n = ldiv(0, i, 8); if (lflg==0) { j = (1<0) { bread(i, buf); for(n=0; n<256; n=+8) { if(df <= 0) break; df--; if((b=buf[n]) == 0) continue; if (lflg) if(!(buf[n].name[0]=='.' && (buf[n].name[1]=='\0' || (buf[n].name[1]=='.' && buf[n].name[2]=='\0')))) { if (--nnf<0) { nnf = 100; edn = sbrk(6*101); if(bad(edn)) lflg = 0; } edn->pnum = ino; edn->inum = buf[n]; edn->nptr = lfptr; for (j=0; j<14; j++) if(buf[n].name[j] == '\0') break; j++; if(!uflg) write(lfdes, buf[n].name, j); lfptr =+ j; edn++; } for(j=0; j16*sblock.s_isize) { fprintf("%l din; i=%l(%s)\n", i, ino, s); continue; } if (!lflg) icnt->icnt[b-1]--; } } return(0); } pfilename(dp, recur) struct fname *dp; { register struct fname *p; char name[14]; if (++recur > 10) { putchar('.'); putchar('.'); putchar('.'); } else if (dp->pnum != 1) { for (p = dn; pinum==dp->pnum && p->pnum!=0) { pfilename(p, recur); goto yes; } } putchar('?'); putchar('?'); putchar('?'); yes: putchar('/'); } seek(lfdes, dp->nptr, 0); read(lfdes, name, 14); printf("%.14s", name); } pstat(i, buf) { register n, *p; n = ldiv(0, i+31, 16); if(n != bufa) { bufa = n; bread(n, buf); } p = buf + ldivr*32; printf("%4o ", p->i_mode&07777); pdate(p->i_atime); pdate(p->i_mtime); } pdate(t) int *t; { register *p; p = localtime(t); p2dig(p[5], '/'); p2dig(p[4]+1, '/'); p2dig(p[3], ' '); p2dig(p[2], ':'); p2dig(p[1], ' '); } p2dig(n, c) { putchar(n/10 + '0'); putchar(n%10 + '0'); putchar(c); } alloc() { register b, i; int buf[256]; i = --sblock.s_nfree; if(i<0 || i>=100) { fprintf("bad freeblock\n"); return(0); } b = sblock.s_free[i]; if(b == 0) return(0); if(sblock.s_nfree <= 0) { bread(b, buf); sblock.s_nfree = buf[0]; for(i=0; i<100; i++) sblock.s_free[i] = buf[i+1]; } return(b); } bread(bno, buf) { seek(fi, bno, 3); if(read(fi, buf, 512) != 512) { fprintf("read error %d\n", bno); exit(); } } free(in) { int i; int buf[256]; if(sblock.s_nfree >= 100) { buf[0] = sblock.s_nfree; for(i=0; i<100; i++) buf[i+1] = sblock.s_free[i]; sblock.s_nfree = 0; bwrite(in, buf); } sblock.s_free[sblock.s_nfree++] = in; } bwrite(bno, buf) { seek(fi, bno, 3); if(write(fi, buf, 512) != 512) { fprintf("write error %d\n", bno); exit(); } } number(s) char *s; { int n, c; n = 0; while(c = *s++) { if(c<'0' || c>'9') continue; n = n*10+c-'0'; } return(n); } fprintf(a, b, c, d, e) { printf(a, b, c, d, e); flush(); } bad(f) { if(f == -1) { fprintf("out of memory\n"); return(1); } return(0); } trace(ii, r) { register struct fname *p; register i, j; i = ii; r++; if(r > 10) return(0); for(p=dn; pinum == i) { j = p->pnum; if(j == 0 || j == 1) return(j); if(trace(j, r) == 1) { setpn(j, 1); return(1); } } setpn(i, 0); return(0); } setpn(pn, n) { register struct fname *p; register i, j; i = pn; j = n; for(p=dn; ppnum == i) p->pnum = j; } ()*+,-./0123456789:main(argc, argv) char **argv; { register i, m; register char *c; int count; if(argc < 3) { printf("arg count\n"); exit(1); } c = argv[1]; m = 0; for(m=0; *c; c++) { if(*c < '0' || *c > '7') { printf("bad mode\n"); exit(1); } m = (m<<3) | *c - '0'; } for(i=2; i; .even 1: add $4,r5 mov (r5),r3 cmpb (r3),$'0 blt 1f cmpb (r3),$'9 bgt 1f jsr r5,cvnum; geta br do 1: mov $uids,r0 jsr r5,fopen; ubuf bec 1f jsr r5,mesg; ; .even sys exit 1: mov r3,r2 2: jsr r5,getc; ubuf bcc 3f who: jsr r5,mesg; ; .even sys exit 3: cmp r0,$': beq 3f cmpb (r2)+,r0 beq 2b 2: jsr r5,getc; ubuf bcs who cmp r0,$'\n bne 2b br 1b 3: tstb (r2) bne 2b 3: jsr r5,getc; ubuf cmpb r0,$': bne 3b jsr r5,cvnum; getc do: sub $2,r4 mov r1,0f+2 tst (r5)+ 1: mov (r5)+,0f sys chown; 0:..; 0 bec 2f mov 0b,r0 mov r0,0f clr 0f+2 3: tstb (r0)+ beq 3f inc 0f+2 br 3b 3: mov $1,r0 sys write; 0:..; .. jsr r5,mesg; ; .even 2: dec r4 bgt 1b sys exit cvnum: clr r1 1: jsr r5,*(r5); ubuf bcs 1f sub $'0,r0 cmp r0,$9. bhi 1f mpy $10.,r1 add r0,r1 br 1b 1: tst (r5)+ rts r5 geta: movb (r3)+,r0 tst (r5)+ rts r5 uids: .bss ubuf: .=.+518. / clri -- clear inode cmp (sp)+,$2 blt error beq 1f mov 4(sp),fs1 mov 4(sp),fs2 1: tst (sp)+ mov (sp)+,r0 clr r5 1: movb (r0)+,r1 beq 1f mpy $10.,r5 sub $'0,r1 cmp r1,$10. bhis error add r1,r5 br 1b 1: add $31.,r5 mov r5,r0 als $-4,r0 mov r0,0f sys open; fs1: filsys; 0 bes error mov r0,-(sp) sys seek; 0:..; 3 mov (sp),r0 sys read; buf; 512. mov (sp)+,r0 sys close mov r5,r0 als $5,r0 bic $!777,r0 add $buf,r0 mov $16.,r5 1: clr (r0)+ sob r5,1b sys open; fs2: filsys; 1 bes error mov r0,-(sp) mov 0b,0f sys seek; 0:..; 3 mov (sp)+,r0 sys write; buf; 512. bes error sys exit error: mov $1,r0 sys write; 1f; 2f-1f sys exit 1: 2: filsys: .even .bss buf: .=.+512. / cmp -- compare files cmp (sp)+,$3 beq 1f jsr r5,mesg; ; .even sys exit 1: tst (sp)+ mov (sp)+,0f sys open; 0:..; 0 bec 1f jsr r5,mesg; ; .even sys exit 1: mov r0,f1 mov (sp)+,0f sys open; 0:..; 0 bec 1f jsr r5,mesg; ; .even sys exit 1: mov r0,f2 clr r2 1: jsr r5,getw; f1 bvs eof1 mov r0,r3 jsr r5,getw; f2 bvs eof2 cmp r0,r3 beq 2f mov r0,r4 mov r2,r0 jsr pc,octal jsr r5,mesg; <: \0>; .even mov r3,r0 jsr pc,octal jsr r5,mesg; < \0>; mov r4,r0 jsr pc,octal jsr r5,mesg; <\n\0> 2: add $2,r2 br 1b eof1: jsr r5,getw; f2 bvs 1f jsr r5,mesg; ; .even sys exit 1: sys exit eof2: jsr r5,mesg; ; .even sys exit mesg: movb (r5)+,ch beq 1f mov $1,r0 sys write; ch; 1 br mesg 1: inc r5 bic $1,r5 rts r5 getw: mov (r5)+,r1 cmp 2(r1),$1 bne 1f mov *4(r1),r0 bic $!377,r0 dec 2(r1) rts r5 1: sub $2,2(r1) bge 1f mov (r1),r0 mov r1,0f add $6,0f sys read; 0:..; 512. mov r0,2(r1) bne 2f sev rts r5 2: mov r1,4(r1) add $6,4(r1) sub $2,2(r1) 1: mov *4(r1),r0 add $2,4(r1) rts r5 octal: mov r4,-(sp) mov r0,r5 mov $6,-(sp) 1: clr r4 alsc $1,r4 cmp (sp),$6 beq 2f alsc $2,r4 2: add $'0,r4 mov r4,ch mov $1,r0 sys write; ch; 1 dec (sp) bne 1b tst (sp)+ mov (sp)+,r4 rts pc .bss ch: .=.+2 f1: .=.+6; .=.+512. f2: .=.+6; .=.+512. int one; int two; int three; char *ldr[3] {"", "\t", "\t\t" }; char ib1[518]; char ib2[518]; main(argc,argv) char *argv[]; { extern fout; int l; char lb1[80],lb2[80]; if(argc > 1) { if(*argv[1] == '-') { l = 1; while(*++argv[1]) { switch(*argv[1]) { case'1': if(!one) { one = 1; ldr[1][0] = ldr[2][l--] = '\0'; } break; case '2': if(!two) { two = 1; ldr[2][l--] = '\0'; } break; case '3': three = 1; break; default: printf("Illegal flag: %c\n",*argv[1]); exit(); } } argv++; argc--; } } if(argc < 3) { printf("Argc = %d\n",argc); exit(); } if(fopen(argv[1],ib1) < 0) { printf("Can't open %s\n",argv[1]); exit(); } if(fopen(argv[2],ib2) < 0) { printf("Can't open %s\n",argv[2]); exit(); } if(rd(ib1,lb1) < 0) { if(rd(ib2,lb2) < 0) exit(); copy(ib2,lb2,2); } if(rd(ib2,lb2) < 0) copy(ib1,lb1,1); while(1) { switch(compare(lb1,lb2)) { case 0: wr(lb1,3); if(rd(ib1,lb1) < 0) { if(rd(ib2,lb2) < 0) fexit(); copy(ib2,lb2,2); } if(rd(ib2,lb2) < 0) copy(ib1,lb1,1); continue; case 1: wr(lb1,1); if(rd(ib1,lb1) < 0) copy(ib2,lb2,2); continue; case 2: wr(lb2,2); if(rd(ib2,lb2) < 0) copy(ib1,lb1,1); continue; } } } rd(file,buf) char *buf; { buf--; while((*++buf = getc(file)) >= 0) if(*buf == '\n') { *buf = '\0'; return(0); } return(-1); } wr(str,n) char *str; { switch(n) { case 1: if(one) return; break; case 2: if(two) return; break; case 3: if(three) return; } printf("%s%s\n",ldr[n-1],str); } copy(ibuf,lbuf,n) { do { wr(lbuf,n); } while(rd(ibuf,lbuf) >= 0); flush(); exit(); } compare(a,b) char *a,*b; { register char *ra,*rb; ra = --a; rb = --b; while(*++ra == *++rb) if(*ra == '\0') return(0); if(*ra < *rb) return(1); return(2); } fexit() { flush(); exit(); } /* * cp oldfile newfile */ main(argc,argv) char **argv; { int buf[256]; int fold, fnew, n, ct, tell; char *p1, *p2, *bp; int mode; tell = 0; if(argc == 4 && argv[1][0] == '-' && argv[1][1] == 't') { argc--; argv++; tell = 1; } if(argc != 3) { write(1, "Usage: cp oldfile newfile\n", 26); exit(1); } if((fold = open(argv[1], 0)) < 0) { write(1, "Cannot open old file.\n", 22); exit(1); } fstat(fold, buf); mode = buf[2]; if((fnew = creat(argv[2], mode)) < 0){ stat(argv[2], buf); if((buf[2] & 060000) == 040000) { p1 = argv[1]; p2 = argv[2]; bp = buf; while(*bp++ = *p2++); bp[-1] = '/'; p2 = bp; while(*bp = *p1++) if(*bp++ == '/') bp = p2; if((fnew = creat(buf, mode)) < 0) { write(1, "Cannot creat new file.\n", 23); exit(1); } } else { write(1, "Cannot creat new file.\n", 23); exit(1); } } while(n = read(fold, buf, 512)) { if(n < 0) { write(1, "Read error\n", 11); exit(1); } else if(write(fnew, buf, n) != n){ write(1, "Write error.\n", 13); exit(1); } ct++; } if(tell) { conf(ct, 6, buf); buf[3] = '\n'; write(1, buf, 7); } exit(0); } conf(n,width,buf) char *buf; { auto i,a; i = width; while(i--) buf[i] = ' '; buf[(a = n/10)?conf(a,--width,buf):--width] = n%10 + '0'; return(++width); } int timbuf[2]; char *cbp; char *tzname[2]; int dmsize[]; char cbuf[]; char *cbp; struct { char name[8]; char tty; char fill1; int wtime[2]; int fill2; } wtmp[2]; main(argc, argv) int argc, **argv; { register char *tzn; extern int timezone, *localtime(); int wf; if(argc > 1) { cbp = argv[1]; if(gtime()) { write(1, "bad conversion\n", 15); exit(); } /* convert to Greenwich time, on assumption of Standard time. */ dpadd(timbuf, timezone); /* Now fix up to local daylight time. */ if (localtime(timbuf)[8]) dpadd(timbuf, -1*60*60); time(wtmp[0].wtime); wtmp[0].tty = '|'; if(stime(timbuf) < 0) write(1, "no permission\n", 14); if ((wf = open("/usr/adm/wtmp", 1)) >= 0) { time(wtmp[1].wtime); wtmp[1].tty = '}'; seek(wf, 0, 2); write(wf, wtmp, 32); } } time(timbuf); cbp = cbuf; ctime(timbuf); write(1, cbuf, 20); tzn = tzname[localtime(timbuf)[8]]; if (tzn) write(1, tzn, 3); write(1, cbuf+19, 6); } gtime() { register int i; register int y, t; int d, h, m; extern int *localtime(); int nt[2]; t = gpair(); if(t<1 || t>12) goto bad; d = gpair(); if(d<1 || d>31) goto bad; h = gpair(); if(h == 24) { h = 0; d++; } m = gpair(); if(m<0 || m>59) goto bad; y = gpair(); if (y<0) { time(nt); y = localtime(nt)[5]; } if (*cbp == 'p') h =+ 12; if (h<0 || h>23) goto bad; timbuf[0] = 0; timbuf[1] = 0; y =+ 1900; for(i=1970; i100) return(-1); if(*cp == 0) return(-1); if ((d = *cp++ - '0') < 0 || d > 9) return(-1); cbp = cp; return (c+d); } / db1 -- debugger fpp = 1 eae = 0 ldfps = 170100^tst db: mov sp,r5 mov (r5)+,r4 tst (r5)+ cmp r4,$2 blt 1f mov (r5),dbfile mov (r5),odbfil mov (r5)+,namfil cmp r4,$2 beq 1f mov (r5)+,namfil 1: sys open; dbfile: core; 0 bec 9f jmp fnfnd 9: mov r0,dbfin clr dbfout sys open; odbfil:core; 1 bes 1f mov r0,dbfout 1: sys open; namfil: a.out; 0 bes 1f mov r0,r1 sys read; nambuf; 20 cmp nambuf,nobjmagic beq 2f cmp nambuf,objmagic bne 1f 2: mov nambuf+2,r0 / text add nambuf+4,r0 / data cmp nambuf+16,$1 / relocation? beq 6f asl r0 / sym origin 6: add $20,r0 mov r0,0f mov r1,r0 sys seek; 0:..; 0 mov nambuf+10,r0 / symbol size cmp r0,$maxsym blos 3f mov $maxsym,r0 3: add r0,0f sys break; 0: nambuf mov r0,0f mov r1,r0 sys read; nambuf; 0:.. add $nambuf,r0 mov r0,namsiz mov r1,r0 sys close 1: jsr r5,get; zero / test new object cmp r0,nobjmagic beq 2f cmp r0,objmagic bne 1f 2: mov $20,getoff 1: mov sp,savsp sys signal; 2; 1 ror r0 bcs 1f sys signal; 2; errexit 1: cmp r4,$2 / arg count beq 9f / not core image cmp r4,$4 / no-core image flag beq 9f mov $1024.,getoff mov dbfin,r0 sys fstat; regbuf mov regbuf+12,r0 sub $1024.,r0 mov r0,f.size mov dbfin,r0 sys seek; 0; 0 mov dbfin,r0 sys read; regbuf; 1024. mov *locfpsr,r0 bic $!200,r0 mov r0,fpsr br loop 9: loop: clr error jsr pc,readlin jsr pc,readexp tst error bne errexit mov $1,count cmpb r0,$', bne 2f movb (r4)+,r0 mov addres,-(sp) mov adrflg,-(sp) jsr pc,readexp mov addres,count mov (sp)+,adrflg mov (sp)+,addres tst error bne errexit 2: movb (r4),r0 jsr pc,command tst error beq loop errexit: sys signal; 2; errexit mov savsp,sp jsr r5,mesg; ; .even br loop fnfnd: jsr r5,mesg; ; .even ex: sys exit readlin: mov $inbuf,r4 1: mov ttyfin,r0 sys read; ch; 1 tst r0 beq ex cmpb ch,$'\n beq 1f movb ch,(r4)+ br 1b 1: clrb (r4) mov $inbuf,r4 rts pc switch: mov (r5)+,r1 2: cmp r0,(r1)+ bne 1f tst (sp)+ jmp *(r1) 1: tst (r1)+ bne 2b rts r5 readexp: mov $'+,lastop clr addres clr starmod clr taddr clr adrflg nextxp: movb (r4)+,r0 cmp r0,$'0 blt 1f cmp r0,$'9 ble numin cmp r0,$'a blt 1f cmp r0,$'z bgt 1f jmp letin 1: cmp r0,$'a-40 blt 1f cmp r0,$'z-40 ble letin 1: jsr r5,switch; expsw tstb -(r4) tst starmod beq 1f mov dot,taddr br operand 1: rts pc expsw: '+; opex '-; opex ' ; nextxp '.; letin '_; letin '^; circumf '*; star -1; 0 star: mov pc,starmod br nextxp operand: inc adrflg tst starmod beq 1f clr starmod bis bytemod,error jsr r5,get; taddr tst error bne 1f mov r0,taddr 1: cmp lastop,$'+ beq 1f sub taddr,addres br 2f 1: add taddr,addres 2: mov $'+,lastop br nextxp circumf: mov dot,taddr dec taddr tst bytemod bne operand dec taddr br operand numin: clr r1 clr r3 1: sub $'0,r0 asl r1 asl r1 asl r1 mpy $10.,r3 bis r0,r1 add r0,r3 movb (r4)+,r0 cmp r0,$'0 blo 1f cmp r0,$'9 blos 1b 1: cmp r0,$'. bne 1f mov r3,r1 inc r4 1: mov r1,taddr dec r4 br operand letin: dec r4 mov $nambuf,namstrt letin1: mov $symbol,r1 clr (r1)+ clr (r1)+ clr (r1)+ clr (r1) mov $symbol,r1 mov $8.,-(sp) br 2f 1: tstb (r4)+ cmpb (r4),$'. beq 2f cmpb (r4),$'0 blo 3f cmpb (r4),$'9 blos 2f cmpb (r4),$'A blo 3f cmpb (r4),$'Z blos 2f cmpb (r4),$'_ beq 2f cmpb (r4),$'a blo 3f cmpb (r4),$'z bhi 3f 2: dec (sp) blt 1b movb (r4),(r1)+ br 1b 3: tst (sp)+ jsr pc,lookupn tst error bne 1f cmpb (r4),$'; beq 2f 1: jmp operand 2: tstb (r4)+ mov r1,namstrt br letin1 opex: mov r0,lastop jmp nextxp command: jsr r5,switch; comsw inc error rts pc comsw: '/; slash '\\; bslash '?; quest '\0; newln '^; circumf '=; equal ':; colon '!; excla ''; squote '"; dquote '$; dolr '&; amper '%; ex '`; grave -1; 0 dolr: / mov *locps,r1 / bic $!17,r1 / asl r1 / mov traptab(r1),r1 / jsr pc,string / jsr pc,pnl mov $doltab,r5 1: mov (r5)+,r1 beq 1f jsr pc,*(r5)+ br 1b .if fpp 1: mov (r5)+,r1 beq 1f ldfps fpsr jsr pc,*(r5)+ br 1b 1: mov (r5)+,r1 jsr pc,*(r5)+ .endif 1: rts pc traptab: 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text 1f; .data; 1:; .text locps: regbuf+1776 locpc: regbuf+1774 locr0: regbuf+1772 locr1: regbuf+1766 locr2: regbuf+1750 locr3: regbuf+1752 locr4: regbuf+1754 locsp: regbuf+1764 locr5: regbuf+1756 locfpsr: regbuf+4 locfr0: regbuf+6 locfr4: regbuf+16 locfr5: regbuf+26 locfr1: regbuf+36 locfr2: regbuf+46 locfr3: regbuf+56 doltab: 1f; prgreg; locsp; .data; 1:; .text 1f; proct; locps; .data; 1:; .text 1f; prgreg; locpc; .data; 1:; .text 1f; prgreg; locr0; .data; 1:; .text 1f; prgreg; locr1; .data; 1:; .text 1f; prgreg; locr2; .data; 1:; .text 1f; prgreg; locr3; .data; 1:; .text 1f; prgreg; locr4; .data; 1:; .text 1f; prgreg; locr5; .data; 1:; .text 0 .if fpp 1f; prfreg; locfr0; .data; 1:; .text 1f; prfreg; locfr1; .data; 1:; .text 1f; prfreg; locfr2; .data; 1:; .text 1f; prfreg; locfr3; .data; 1:; .text 1f; prfreg; locfr4; .data; 1:; .text 1f; prfreg; locfr5; .data; 1:; .text 0 1f; proct; locfpsr; .data; 1:; .text .endif .data .even .text .if fpp prfreg: mov *(r5)+,r4 movf (r4),fr0 cfcc beq 1f jsr pc,string jsr pc,printf jsr pc,pnl 1: rts pc .endif prgreg: jsr pc,string mov *(r5)+,r4 mov (r4),r0 jsr pc,printo mov (r4),r0 jsr pc,lookupv tst r2 beq 1f jsr r5,mesg; < \0>; .even mov (r4),r0 jsr pc,pname 1: jsr pc,pnl rts pc proct: jsr pc,string mov *(r5)+,r4 mov (r4),r0 jsr pc,printo jsr pc,pnl rts pc string: movb (r1)+,r0 beq 1f jsr pc,putc br string 1: rts pc putc: mov r0,och mov $1,r0 sys write; och; 1 rts pc equal: jsr r5,coleq; printo rts pc amper: clr bytemod mov $2,incdot jsr r5,cycle; asymp rts pc asymp: jsr pc,pname jsr pc,pnl rts pc bslash: inc bytemod mov $1,incdot br 1f slash: clr bytemod mov $2,incdot 1: jsr r5,cycle; octp rts pc grave: clr bytemod mov $2,incdot jsr r5,cycle; decp rts pc quest: clr bytemod jsr r5,cycle; psym rts pc decp: jsr pc,printd jsr r5,mesg; <.\n\0>; .even rts pc octp: jsr pc,printo jsr pc,pnl rts pc newln: tst adrflg bne 1f add incdot,dot 1: mov nlcom,r0 jmp command excla: tst adrflg bne 1f 2: inc error rts pc 1: bit $1,dot beq 1f tst bytemod beq 2b 1: jsr r5,put; dot; addres rts pc squote: inc bytemod mov $1,incdot br 2f dquote: clr bytemod mov $2,incdot 2: jsr r5,cycle; ascp rts pc ascp: mov r0,-(sp) jsr pc,ascp1 mov (sp)+,r0 tst bytemod bne 1f swab r0 jsr pc,ascp1 1: cmp count,$1 bgt 1f jsr pc,pnl 1: rts pc ascp1: bic $!377,r0 cmp r0,$'\n beq 2f cmp r0,$011 beq 2f cmp r0,$40 blo 1f cmp r0,$177 bhis 1f 2: jsr pc,putc rts pc 1: mov r0,r1 jsr r5,mesg; <\\\0> clr r0 alsc $10.,r0 add $'0,r0 jsr pc,putc clr r0 alsc $3,r0 add $'0,r0 jsr pc,putc clr r0 alsc $3,r0 add $'0,r0 jsr pc,putc rts pc colon: jsr r5,coleq; pname rts pc coleq: jsr pc,setadr mov addres,r0 jsr pc,*(r5)+ jsr pc,pnl rts r5 cycle: mov r0,nlcom jsr pc,setadr mov addres,dot tst bytemod bne 1f bic $1,dot 1: jsr r5,get; dot tst error bne 1f tst bytemod beq 2f bic $!377,r0 2: jsr pc,*(r5) tst error bne 1f dec count ble 1f add incdot,dot br 1b 1: tst (r5)+ rts r5 setadr: tst adrflg bne 1f mov dot,addres 1: rts pc .if fpp printf: ldfps $200 / round+double mov r4,-(sp) mov r3,-(sp) movif $10.,r3 movif $1,r2 clr r4 tstf r0 cfcc beq 2f bge 1f negf r0 mov $'-,r0 jsr pc,putc 1: cmpf r3,r0 cfcc bgt 1f inc r4 divf r3,r0 br 1b 1: cmpf r2,r0 cfcc ble 2f dec r4 mulf r3,r0 br 1b 2: modf r2,r0 movfi r1,r0 add $'0,r0 jsr pc,putc mov $'.,r0 jsr pc,putc mov $8.,r3 1: modf r3,r0 movfi r1,r0 add $'0,r0 jsr pc,putc dec r3 bgt 1b mov $'E,r0 jsr pc,putc mov r4,r0 mov (sp)+,r3 mov (sp)+,r4 br printd .endif printd: mov r1,-(sp) mov r0,r1 bpl 1f neg r1 mov $'-,r0 jsr pc,putc 1: jsr pc,1f mov (sp)+,r1 rts pc 1: clr r0 dvd $10.,r0 mov r1,-(sp) mov r0,r1 beq 1f jsr pc,1b 1: mov (sp)+,r0 add $'0,r0 jsr pc,putc rts pc QRSTUVWXYZ[\]^_`a/ db2 -- debugger lookupn: cmp symbol,$'. bne 1f mov dot,taddr rts pc 1: tst error beq 1f rts pc 1: mov r2,-(sp) mov $regnames,r1 mov $ereg,r2 jsr pc,1f tst error beq 2f clr error mov namstrt,r1 mov namsiz,r2 jsr pc,1f 2: mov (sp)+,r2 rts pc 1: mov $symbol,r0 cmp (r0)+,(r1)+ bne 2f cmp (r0)+,(r1)+ bne 3f cmp (r0)+,(r1)+ bne 4f cmp (r0)+,(r1)+ bne 5f tst (r1)+ mov (r1)+,taddr rts pc 2: tst (r1)+ 3: tst (r1)+ 4: tst (r1)+ 5: cmp (r1)+,(r1)+ cmp r1,r2 blo 1b inc error clr taddr rts pc lookupv: mov r5,-(sp) mov $nambuf,r5 clr r2 mov $177777,r3 1: cmp r5,namsiz bhis 4f mov 12(r5),r1 sub r0,r1 neg r1 blt 3f cmp r1,r3 bhi 3f cmp r1,$4000 bhis 3f cmp r2,r5 bhi 3f mov r1,r3 mov r5,r2 3: add $14,r5 br 1b 4: mov (sp)+,r5 rts pc get: mov *(r5)+,r0 jsr r5,remap br 3f mov r0,0f mov dbfin,r0 sys seek; 0:0; 0 bec 1f 2: inc error rts r5 1: mov dbfin,r0 sys read; temp; 2 bes 2b tst r0 beq 2b mov temp,r0 rts r5 3: clr -(sp) movb (r0),(sp) movb 1(r0),1(sp) mov (sp)+,r0 rts r5 remap: cmp getoff,$1024. bne 1f cmp r0,*locsp blo 1f add f.size,r0 1: add getoff,r0 tst (r5)+ rts r5 2: inc error rts r5 printo: mov $obuf+6,r1 clr r2 1: inc r2 movb r0,-(r1) bicb $!7,(r1) bisb $'0,(r1) clc ror r0 asr r0 asr r0 bne 1b mov r2,0f+2 mov r1,0f mov $1,r0 sys write; 0:obuf; 6 rts pc mesg: movb (r5)+,r0 beq 1f jsr pc,putc br mesg 1: inc r5 bic $1,r5 rts r5 pnl: jsr r5,mesg; <\n\0> rts pc psp: jsr r5,mesg; < \0> rts pc pstar: jsr r5,mesg; <*\0> rts pc plp: jsr r5,mesg; <(\0> rts pc prp: jsr r5,mesg; <)\0> rts pc pb: jsr r5,mesg; rts pc pcom: jsr r5,mesg; <,\0> rts pc put: mov *(r5)+,r0 jsr r5,remap br 3f mov r0,0f mov dbfout,r0 bne 1f 2: tst (r5)+ 3: inc error rts r5 1: tst error bne 3b sys seek; 0:0; 0 bes 2b mov (r5)+,0f mov dbfout,r0 tst bytemod beq 1f mov $1,0f+2 br 2f 1: mov $2,0f+2 2: sys write; 0:0; 2 bes 3b rts r5 decodadr: mov r0,r3 mov r3,-(sp) bic $!10,(sp) bic $!7,r0 cmp r0,$7 beq pcadr 7: mov r3,r0 asr r0 asr r0 asr r0 bic $!6,r0 jmp *1f(r0) 1: simp incr decr indx simp: tst (sp) beq 1f jsr pc,plp 1: jsr pc,preg tst (sp)+ beq 9f jsr pc,prp br 9f incr: tst (sp)+ beq 1f jsr pc,pstar 1: jsr pc,plp jsr pc,preg jsr r5,mesg; <)+\0>; .even br 9f decr: tst (sp)+ beq 1f jsr pc,pstar 1: jsr r5,mesg; <-(\0>; .even jsr pc,preg jsr pc,prp br 9f indx: tst (sp)+ beq 1f jsr pc,pstar 1: jsr pc,get1 jsr pc,pname jsr pc,plp jsr pc,preg jsr pc,prp br 5f pcadr: mov r3,r0 bit $20,r3 beq 7b tst (sp)+ beq 1f jsr pc,pstar 1: bit $40,r3 bne 6f jsr r5,mesg; <$\0> jsr pc,get1 jsr pc,pname br 5f 6: jsr pc,get1 add $2,r0 add r1,r0 mov $3,r1 jsr pc,pname br 5f 9: tst (r5)+ clr r0 rts r5 5: mov $2,r0 rts r5 preg: mov r3,r0 bic $!7,r0 asl r0 mov regtab(r0),obuf mov $1,r0 sys write; obuf; 2 rts pc regtab: "r0 "r1 "r2 "r3 "r4 "r5 "sp "pc pname: mov r5,-(sp) mov r3,-(sp) mov r1,-(sp) jsr pc,lookupv tst r2 beq 5f cmp (sp),$1 bne 1f tst r3 bne 5f 1: mov r2,r1 mov $8,-(sp) mov r0,r5 1: movb (r1)+,r0 beq 1f jsr pc,putc dec (sp) bne 1b 1: tst (sp)+ cmp 12(r2),r5 beq 1f blt 2f jsr r5,mesg; <-\0> br 3f 2: jsr r5,mesg; <+\0> 3: mov r3,r0 5: jsr pc,printo 1: tst (sp)+ mov (sp)+,r3 mov (sp)+,r5 rts pc get1: mov *(r5)+,r1 add $2,r1 mov r1,temp jsr r5,get; temp rts pc / db3 -- debugger psym: mov $2,incdot jsr pc,prints jsr pc,pnl rts pc prints: mov r0,-(sp) mov $optab,r1 1: mov (sp),r0 bic (r1)+,r0 cmp (r1)+,r0 bne 2f mov (r1)+,-(sp) jsr pc,string jmp *(sp)+ 2: add $8.,r1 br 1b optab: 107777; 010000; double; 107777; 020000; double; 107777; 030000; double; 107777; 040000; double; 107777; 050000; double; 007777; 060000; double; 007777; 160000; double; 100077; 005000; single; 100077; 005100; single; 100077; 005200; single; 100077; 005300; single; 100077; 005400; single; 100077; 005500; single; 100077; 005600; single; 100077; 005700; single; 100077; 006000; single; 100077; 006100; single; 100077; 006200; single; 100077; 006300; single; 000077; 000100; single; 000077; 000300; single; 000077; 170100; singlw; 000077; 170200; singlw; 000077; 170300; singlw; 000077; 170400; singlw; 000077; 170500; singlw; 000077; 170600; singlw; 000077; 170700; singlw; 000077; 006700; singlw; 000077; 006600; singlw; 000077; 106600; singlw; 000077; 006500; singlw; 000077; 106500; singlw; 000777; 070000; muldiv; 000777; 071000; muldiv; 000777; 072000; muldiv; 000777; 073000; muldiv; 000377; 000400; branch; 000377; 001000; branch; 000377; 001400; branch; 000377; 002000; branch; 000377; 002400; branch; 000377; 003000; branch; 000377; 003400; branch; 000377; 100000; branch; 000377; 100400; branch; 000377; 101000; branch; 000377; 101400; branch; 000377; 102000; branch; 000377; 102400; branch; 000377; 103000; branch; 000377; 103400; branch; 000000; 000000; noaddr; 000000; 000001; noaddr; 000000; 000002; noaddr; 000000; 000004; noaddr; 000000; 000005; noaddr; 000377; 171000; fltrev; 000377; 171400; fltrev; 000377; 172000; fltrev; 000377; 172400; fltrev; 000377; 173000; fltrev; 000377; 173400; fltrev; 000377; 174000; fltnor; 000377; 174400; fltrev; 000377; 175000; fltnor; 000377; 175400; fltnor; 000377; 176000; fltnor; 000377; 176400; fltrev; 000377; 177000; fltrev; 000377; 177400; fltrev; 000000; 170000; noaddr; 000000; 170001; noaddr; 000000; 170002; noaddr; 000000; 170011; noaddr; 000000; 170012; noaddr; 000777; 004000; specl1; 000777; 074000; specl1; 000007; 000200; specl2; 000017; 000240; specl3; 000017; 000260; specl3; 000377; 104000; specl4; 000377; 104400; specl5; 000077; 006400; specl7; 000777; 077000; specl8; 000007; 000230; specl9; 177777; 000000; specl6; fltrev: bic $!377,(sp) muldiv: jsr pc,psp mov (sp)+,r0 asl r0 asl r0 swab r0 aslb r0 aslb r0 aslb r0 aslb r0 asr r0 asr r0 asr r0 asr r0 bic $!7707,r0 mov r0,-(sp) br fltnor1 fltnor: bic $!377,(sp) br 1f double: tst (sp) bge 1f jsr pc,pb 1: jsr pc,psp mov (sp),r0 fltnor1: als $-6,r0 jsr r5,decodadr; dot add r0,incdot add dot,r0 mov r0,temp jsr pc,pcom mov (sp)+,r0 jsr r5,decodadr; temp add r0,incdot rts pc single: tst (sp) bge singlw jsr pc,pb singlw: jsr pc,psp mov (sp)+,r0 jsr r5,decodadr; dot add r0,incdot rts pc specl8: / sob jsr pc,psp mov (sp),r3 als $-6,r3 jsr pc,preg jsr pc,pcom mov (sp)+,r0 bic $!77,r0 neg r0 br 1f branch: jsr pc,psp mov (sp)+,r0 bic $!377,r0 bit $200,r0 beq 1f bis $177400,r0 1: inc r0 asl r0 add dot,r0 jsr pc,pname rts pc noaddr: tst (sp)+ rts pc specl1: / jsr jsr pc,psp mov (sp),r3 als $-6,r3 jsr pc,preg jsr pc,pcom mov (sp)+,r0 jsr r5,decodadr; dot add r0,incdot rts pc specl2: / rts jsr pc,psp mov (sp)+,r3 jsr pc,preg rts pc specl3: / opr jsr pc,psp mov (sp)+,r2 mov $3f,r1 1: bit $17,r2 beq 1f bit $10,r2 beq 2f movb (r1),r0 jsr pc,putc 2: inc r1 asl r2 br 1b 1: rts pc 3: specl7: / mark bic $!77,(sp) br specl4 specl9: / spl bic $!7,(sp) br specl4 specl4: / emt jsr pc,psp mov (sp)+,r0 bic $!377,r0 8: jsr pc,printo rts pc specl5: / sys jsr pc,psp mov (sp)+,r2 bic $!377,r2 mov r2,r0 asl r2 asl r2 cmp r2,$esystab-systab bhis 8b mov systab(r2),r1 jsr pc,string mov systab+2(r2),-(sp) mov dot,temp1 1: dec (sp) bge 2f tst (sp)+ rts pc 2: jsr r5,mesg; <;\0> add $2,temp1 add $2,incdot jsr r5,get; temp1 jsr pc,pname br 1b systab: 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 2; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 1; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text 1f; 0; .data; 1:; .text esystab: .data .even .text specl6: / unknown jsr pc,psp mov (sp)+,r0 jsr pc,printo rts pc jklmnopqrstuv/ db4 -- debugger maxsym = 24000. core: a.out: .even zero: 0 .bss regbuf: .=.+1024. .data objmagic: 407 nobjmagic: 410 namsiz: nambuf incdot: 2 nlcom: '/ regnames: ; 1; 162000 ; 1; 161776 ; 1; 161774 ; 1; 161772 ; 1; 161770 ; 1; 161766 ; 1; 161764 ; 1; 161762 ; 1; 161760 .if fpp fregnames: ; 1; 161754 ; 1; 161750 ; 1; 161744 ; 1; 161740 ; 1; 161734 ; 1; 161730 .endif ereg: .bss starmod:.=.+2 symbol: .=.+10. getoff: .=.+2 namstrt: .=.+2 bytemod: .=.+2 savsp: .=.+2 error: .=.+2 ttyfin: .=.+2 dbfin: .=.+2 dbfout: .=.+2 ch: .=.+2 lastop: .=.+2 addres: .=.+2 taddr: .=.+2 adrflg: .=.+2 f.size: .=.+2 fpsr: .=.+2 och: .=.+2 dot: .=.+2 count: .=.+2 syscnt: .=.+2 temp: .=.+2 temp1: .=.+2 obuf: .=.+8. inbuf: .=.+128. nambuf: .=.+20 .globl getchar .globl lookchar .globl fsfile .globl seekchar .globl backspace .globl putchar .globl alterchar .globl move .globl rewind .globl create .globl zero .globl allocate .globl release .globl collect .globl w, r, a, l / cmp (sp)+,$2 blo 1f tst (sp)+ mov (sp)+,0f sys 0; 9f .data 9: sys open; 0:.=.+2; 0 .text bec 2f mov $1,r0 sys write; 4f; 5f-4f sys exit error: 4 / 4: 5: .even / 2: mov r0,source 1: sys signal; 2; 1 ror r0 bcs 1f sys signal; 2; case177 1: clr delflag mov $pdl,r5 / clr r0 jsr pc,allocate mov r1,basptr mov $10.,r0 jsr pc,putchar mov $1,r0 jsr pc,allocate mov r1,inbas mov $10.,r0 jsr pc,putchar mov $1,r0 jsr pc,allocate mov $10.,r0 jsr pc,putchar mov r1,tenptr clr r0 jsr pc,allocate mov r1,chptr clr r0 jsr pc,allocate mov r1,strptr clr r0 jsr pc,allocate mov $1,r0 jsr pc,putchar mov r1,kptr mov $1,r0 jsr pc,allocate mov $2,r0 jsr pc,putchar mov r1,sqtemp clr r0 jsr pc,allocate mov r1,divxyz loop: tst delflag bne in177 mov sp,errstack jsr pc,readc mov $casetab,r1 1: tst (r1)+ beq 2f cmp r0,(r1)+ bne 1b jmp *-4(r1) 2: jmp eh / / / case for new line (which is special for apl box) / case012: br loop / / / case q for quit / case161: cmp readptr,$readstack+2 blos 1f mov *readptr,r1 beq 2f jsr pc,release 2: sub $2,readptr mov *readptr,r1 beq 2f jsr pc,release 2: sub $2,readptr jmp loop 1: sys exit / / / case of delete character / case177: sys signal; 2; case177 mov $1,delflag mov r0,-(sp) mov 2(sp),r0 cmp -6(r0),$sys+read bne 1f sub $6,2(sp) clr delflag 1: mov (sp)+,r0 2 /rti / in177: mov $' ,ch mov $1,r0 sys write; 1f; 1 clr delflag jmp eh / .bss delflag: .=.+2 .text 1: <\n> .even / / / case digit / case060: movb r0,savec jsr pc,readin jsr pc,push br loop / / / case _ for negative numbers / case137: jsr pc,readin jsr pc,chsign jsr pc,push br loop / / / case screamer / case041: jsr pc,in041 br loop / in041: sys fork br 9f sys wait mov $1,r0 sys write; screamer; 2 rts pc 9: sys exec; 7f; 8f 4 8: 7f; 0 7: screamer: .even / / / case d for duplicate / case144: cmp r5,$pdl jeq eh clr r0 jsr pc,allocate mov -2(r5),r0 jsr pc,move jsr pc,push br loop / / / case z for stack size / case172: clr r0 jsr pc,allocate mov r5,r3 sub $pdl,r3 asr r3 2: beq 2f clr r2 dvd $100.,r2 mov r3,r0 jsr pc,putchar mov r2,r3 br 2b 2: jsr pc,push jmp loop / / / case c for flush / case143: 2: jsr pc,pop jes loop jsr pc,release br 2b / / case s for save / case163: jsr pc,readc cmp r5,$pdl bne 2f movb $'s,ch jmp eh 2: cmpb r0,$128. jhis err asl r0 mov stable(r0),r1 beq 2f jsr pc,release 2: jsr pc,pop mov r1,stable(r0) jmp loop / / / case l for load / case154: jsr pc,in154 jmp loop / in154: jsr pc,readc cmp r0,$128. jhis err asl r0 mov stable(r0),r1 beq 1f mov r1,-(sp) jsr pc,length jsr pc,allocate mov (sp)+,r0 jsr pc,move jsr pc,push rts pc 1: clr r0 jsr pc,allocate jsr pc,push rts pc / / / case - for subtract / case055: jsr pc,in055 jmp loop / in055: jsr pc,pop jes eh jsr pc,chsign jsr pc,push br in053 / / / case + for add / case053: jsr pc,in053 jmp loop / in053: mov $add3,r0 jsr pc,binop rts pc / / / case * for multiply / case052: mov $mul3,r0 jsr pc,binop tst k beq 1f jsr pc,pop mov r1,r3 mov kptr,r2 jsr pc,div3 jsr pc,push mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release 1: jmp loop / / case / for divide / case057: mov $1f,r0 jsr pc,binop mov r4,r1 jsr pc,release jmp loop 1: tst k beq 1f mov r2,-(sp) mov kptr,r2 jsr pc,mul3 mov r1,-(sp) mov r3,r1 jsr pc,release mov (sp)+,r3 mov (sp)+,r2 1: jsr pc,div3 rts pc / / / case % for remaindering / case045: mov $div3,r0 jsr pc,binop jsr pc,pop jsr pc,release mov r4,r1 jsr pc,push jmp loop / / binop: jsr pc,pop jes eh mov r1,r2 jsr pc,pop jec 1f mov r2,r1 jsr pc,push jbr eh 1: mov r1,r3 jsr pc,(r0) jsr pc,push mov r2,r1 jsr pc,release mov r3,r1 jsr pc,release rts pc / / / case i for input base / case151: jsr pc,in151 jmp loop / in151: jsr pc,pop jes eh mov r1,-(sp) mov inbas,r1 mov (sp)+,inbas jsr pc,release rts pc / .bss inbas: .=.+2 .data / / / case o for output base / case157: jsr pc,in157 jmp loop / in157: jsr pc,pop jes eh mov r1,-(sp) mov basptr,r1 jsr pc,release mov (sp),basptr / / set field widths for output / and set output digit handling routines / mov (sp),r1 mov $bigout,outdit jsr pc,length cmp r0,$1. bne 2f jsr pc,fsfile jsr pc,backspace cmp r0,$16. bhi 2f mov $hexout,outdit 2: jsr pc,length jsr pc,allocate mov (sp),r0 jsr pc,move clr (sp) jsr pc,fsfile jsr pc,backspace bpl 2f add $1.,(sp) jsr pc,chsign 2: mov r1,r2 mov $1,r0 jsr pc,allocate mov $-1,r0 jsr pc,putchar mov r1,r3 jsr pc,add3 jsr pc,length asl r0 add r0,(sp) jsr pc,fsfile jsr pc,backspace cmp r0,$9. blos 2f add $1,(sp) 2: jsr pc,release mov r2,r1 jsr pc,release mov r3,r1 jsr pc,release mov (sp)+,fw cmp outdit,$hexout bne 2f mov $1,fw 2: mov $60.,ll cmp fw,$60. blo 9f; rts pc; 9: mov $60.,r1 clr r0 dvd fw,r0 mov r0,r1 mpy fw,r1 mov r1,ll rts pc / .data fw: 1 /field width for digits ll: 60. /line length .text / / / case k for skale factor / case153: jsr pc,pop jes eh mov w(r1),r0 sub a(r1),r0 cmp r0,$1 jhi eh jsr pc,rewind jsr pc,getchar jmi eh mov r0,k mov r0,r2 jsr pc,release mov kptr,r1 jsr pc,create clr r0 2: cmp r2,$2 blo 2f jsr pc,putchar sub $2,r2 br 2b 2: mov $1,r0 cmp r2,$1 blo 2f mov $10.,r0 2: jsr pc,putchar 1: jmp loop / / / case ^ for exponentiation / case136: jsr pc,pop jes eh mov r1,r3 jsr pc,pop jes eh mov r1,r2 jsr pc,exp3 jsr pc,push mov r2,r1 jsr pc,release mov r3,r1 jsr pc,release jmp loop / / / case v for square root / case166: jsr pc,pop jes eh / / multiply argument by skale factor / mov r1,r2 mov kptr,r3 jsr pc,mul3 mov r1,r3 mov r2,r1 jsr pc,release / / check for zero or negative / mov w(r3),r2 sub a(r3),r2 tst r2 jeq sqz / / look at the top one or two digits / mov r3,r1 jsr pc,fsfile jsr pc,backspace mov r0,r4 jmi eh bit $1,r2 bne 2f mov r4,r1 mul $100.,r1 mov r1,r4 mov r3,r1 jsr pc,backspace add r0,r4 2: / / allocate space for result / inc r2 asr r2 mov r2,r0 jsr pc,allocate jsr pc,zero mov r2,r0 jsr pc,seekchar mov r1,r2 / / get high order digit of arg and square root it / mov $1,r0 2: sub r0,r4 blt 2f add $2,r0 br 2b 2: inc r0 asr r0 mov r0,r4 mov r2,r1 jsr pc,fsfile jsr pc,backspace mov r4,r0 jsr pc,alterchar mov r1,-(sp) mov r3,-(sp) / / get successive approx. from Newton / 1: mov (sp),r3 /arg mov 2(sp),r2 /approx jsr pc,div3 mov r1,r3 jsr pc,add3 mov r1,-(sp) mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release mov (sp)+,r1 mov sqtemp,r2 mov r1,r3 jsr pc,div3 mov r1,-(sp) mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release mov (sp)+,r3 mov 2(sp),r1 jsr pc,length jsr pc,allocate mov 2(sp),r0 jsr pc,move jsr pc,chsign mov r1,r2 jsr pc,add3 jsr pc,fsfile jsr pc,backspace jsr pc,release mov r2,r1 jsr pc,release tst r0 bpl 2f / / loop if new < old / mov 2(sp),r1 jsr pc,release mov r3,2(sp) br 1b / 2: mov r3,r1 jsr pc,release mov 2(sp),r1 jsr pc,push mov (sp),r1 jsr pc,release tst (sp)+ tst (sp)+ jmp loop / sqz: clr r0 jsr pc,allocate jsr pc,push mov r3,r1 jsr pc,release jmp loop .bss sqtemp: .=.+2 .text / / / case [ for subroutine definition / case133: clr -(sp) clr r0 jsr pc,allocate jsr pc,push 1: jsr pc,readc cmp r0,$'] bne 3f tst (sp) beq 1f dec (sp) br 2f 3: cmp r0,$'[ bne 2f inc (sp) 2: jsr pc,putchar br 1b / 1: tst (sp)+ jmp loop / / / case x for execute top of stack / case170: jsr pc,in170 jmp loop / in170: jsr pc,pop jes eh mov r1,-(sp) tst *readptr beq 1f mov *readptr,r1 cmp r(r1),w(r1) bne 1f jsr pc,release br 2f 1: add $2,readptr cmp readptr,$readtop bhis 1f 2: mov (sp)+,r1 mov r1,*readptr beq 2f jsr pc,rewind rts pc 2: jsr pc,readc cmp r0,$'\n beq 3f mov r0,savec 3: rts pc 1: nderr: mov $1,r0 sys write; 1f; 2f-1f sys exit 1: 2: .even / .data readptr: readstack .bss readstack: .=.+100. readtop: .text / / case ? for apl box function / case077: add $2,readptr cmp readptr,$readtop bhis nderr clr *readptr in077: mov source,-(sp) clr source jsr pc,readc cmp r0,$'! bne 1f jsr pc,in041 mov (sp)+,source br in077 1: mov r0,savec clr r0 jsr pc,allocate jsr pc,readc jsr pc,putchar 1: jsr pc,readc jsr pc,putchar cmp r0,$'\n bne 1b mov (sp)+,source mov r1,*readptr jmp loop / / / case < for conditional execution / case074: jsr pc,in055 /go subtract jsr pc,pop jsr pc,length tst r0 beq 1f jsr pc,fsfile jsr pc,backspace tst r0 bmi 1f jsr pc,release jsr pc,in154 /load from register br case170 / 1: jsr pc,release jsr pc,readc jmp loop / / / case = for conditional execution / case075: jsr pc,in055 /go subtract jsr pc,pop jsr pc,length tst r0 beq 1f /is zero jsr pc,release jsr pc,readc jmp loop 1: jsr pc,release jsr pc,in154 /load from register jmp case170 /go to execute code / / / case > for conditional execution / case076: jsr pc,in055 /go subtract jsr pc,pop jsr pc,length tst r0 beq 1f jsr pc,fsfile jsr pc,backspace tst r0 bpl 1f jsr pc,release jsr pc,in154 /load from register jmp case170 /go to execute code 1: jsr pc,release jsr pc,readc jmp loop err: 4 / eh: movb ch,1f+2 mov $1,r0 sys write; 1f; 2f-1f mov $readstack,readptr mov errstack,sp jmp loop .data 1: <( ) ?\n> 2: .even .text / / / routine to read and convert a number from the / input stream. Numbers beginnig with 0 are / converted as octal. Routine converts / up to next nonnumeric. / / readin: clr r0 jsr pc,allocate mov r1,-(sp) mov strptr,r1 jsr pc,create jsr pc,readc 1: cmpb ch,$'0 blt 1f cmpb ch,$'9 bgt 3f mov ch,r0 sub $'0,r0 4: mov chptr,r1 jsr pc,create tst r0 beq 2f jsr pc,putchar 2: mov r1,chptr mov (sp),r3 mov inbas,r2 jsr pc,mul3 mov r1,(sp) mov r3,r1 jsr pc,release mov (sp),r3 mov chptr,r2 jsr pc,add3 mov r1,(sp) mov r3,r1 jsr pc,release jsr pc,readc mov r0,ch br 1b 3: cmpb ch,$'A blt 1f cmpb ch,$'F bgt 1f mov ch,r0 sub $67,r0 br 4b 1: mov ch,savec mov (sp)+,r1 rts pc / / / routine to read another character from the input / stream. If the caller does not want the character, / it is to be placed in the cell savec. / The routine exits to the system on end of file. / Character is returned in r0. / / jsr pc,readc / movb r0,... / / readc: tst savec beq 1f movb savec,r0 clr savec rts pc 1: tst *readptr bne 1f 2: mov source,r0 sys read; ch; 1 bes eof tst r0 beq eof movb ch,r0 rts pc 1: mov r1,-(sp) mov *readptr,r1 jsr pc,getchar bes eof1 mov r0,ch mov (sp)+,r1 rts pc / eof: tst source beq 1f clr source br 2b 1: sys exit / eof1: mov *readptr,r1 beq 2f jsr pc,release 2: sub $2,readptr mov (sp)+,r1 jmp readc / / / case p for print / case160: cmp r5,$pdl jeq eh jsr pc,in160 jmp loop / / in160: mov $1,r0 sys write; sphdr; 4 br 1f / sphdr: < > .even / 1: cmp r5,$pdl bne 1f mov $1,r0 sys write; qm; 1 mov $1,r0 sys write; nl; 1 rts pc / / do the conversion / 1: mov -2(r5),r1 jsr pc,printf rts pc / / / case f for print the stack / case146: mov r5,-(sp) 1: cmp r5,$pdl beq 2f 1: jsr pc,in160 jsr pc,pop cmp r5,$pdl bne 1b 2: mov $stable-2,r0 1: tst (r0)+ cmp r0,$stable+254. bhi 1f / mov (r0),r1 beq 1b mov r0,-(sp) sub $stable,r0 asr r0 movb r0,7f+1 mov $1,r0 sys write; 7f; 8f-7f jsr pc,printf mov (sp)+,r0 br 1b 1: mov (sp)+,r5 jmp loop / .data 7: <" " > 8: .even .text / / / routine to convert to decimal and print the / top element of the stack. / / jsr pc,printf / / printf: mov r2,-(sp) mov r1,-(sp) mov r0,-(sp) clr -(sp) jsr pc,rewind 2: jsr pc,getchar bes 2f cmp r0,$143 blos 2b cmp r0,$-1 beq 2b bis $1,(sp) br 2b 2: tst (sp)+ beq 2f jsr pc,length mov r0,0f mov a(r1),3f mov $1,r0 sys 0; 9f .data 9: sys write; 3:.=.+2; 0:.=.+2 .text br prout 2: jsr pc,fsfile jsr pc,backspace bec 1f mov $1,r0 sys write; blank; 1 mov $1,r0 sys write; asczero; 1 br prout 1: jsr pc,length mov r1,-(sp) jsr pc,allocate mov (sp),r0 mov r1,(sp) jsr pc,move mov ll,count inc count jsr pc,fsfile jsr pc,backspace cmpb r0,$-1 bne 2f mov basptr,r1 jsr pc,fsfile jsr pc,backspace cmp r0,$-1 beq 2f mov (sp),r1 jsr pc,chsign mov $'-,ch jsr pc,wrchar br 1f 2: mov $' ,ch jsr pc,wrchar 1: mov strptr,r1 jsr pc,create mov basptr,r1 jsr pc,length cmp r0,$1 blo dingout bne 1f jsr pc,rewind jsr pc,getchar cmp r0,$1. beq unout cmp r0,$-1 beq dingout cmp r0,$10. beq tenout 1: mov (sp),r3 mov basptr,r2 jsr pc,div3 mov r1,r2 mov (sp),r1 jsr pc,release mov r2,(sp) mov r4,r1 jsr pc,*outdit mov (sp),r1 jsr pc,length bne 1b / mov strptr,r1 jsr pc,fsfile 1: jsr pc,backspace bes 1f mov r0,ch jsr pc,wrchar br 1b 1: mov (sp)+,r1 jsr pc,release / / cleanup, print new line and return / prout: mov $1,r0 sys write; nl; 1 mov (sp)+,r0 mov (sp)+,r1 mov (sp)+,r2 rts pc / / tenout: mov (sp),r1 jsr pc,fsfile jsr pc,backspace mov r0,r3 clr r2 dvd $10.,r2 beq 1f 3: add $60,r2 mov r2,ch jsr pc,wrchar 1: add $60,r3 mov r3,ch jsr pc,wrchar 1: jsr pc,backspace bec 2f mov (sp)+,r1 jsr pc,release br prout 2: mov r0,r3 clr r2 dvd $10.,r2 br 3b / / dingout: clr -(sp) br 1f unout: mov $1,-(sp) 1: mov strptr,r1 jsr pc,create mov $-1,r0 jsr pc,putchar mov r1,r3 1: mov 2(sp),r1 jsr pc,length beq 1f mov r1,r2 jsr pc,add3 mov r1,2(sp) mov r2,r1 jsr pc,release mov $1,r0 tst (sp) beq 2f mov $'1,ch jsr pc,wrchar br 1b 2: tst delflag jne in177 sys write; ding; 3 br 1b 1: tst (sp)+ mov (sp)+,r1 jsr pc,release br prout / ding: < > / blank: < > sp5: <\n > minus: <-> one: <1> .even .bss count: .=.+2 .text / bigout: mov r1,-(sp) /big digit mov strptr,r1 jsr pc,length add fw,r0 dec r0 mov r0,-(sp) /end of field clr -(sp) /negative mov 4(sp),r1 jsr pc,length bne 2f mov strptr,r1 mov $'0,r0 jsr pc,putchar br 1f 2: mov 4(sp),r1 /digit jsr pc,fsfile jsr pc,backspace bpl 2f mov $1,(sp) /negative jsr pc,chsign 2: mov 4(sp),r3 /digit mov r3,r1 jsr pc,length beq 1f mov tenptr,r2 jsr pc,div3 mov r1,4(sp) /digit mov r3,r1 jsr pc,release mov r4,r1 jsr pc,rewind jsr pc,getchar jsr pc,release add $'0,r0 mov strptr,r1 jsr pc,putchar br 2b 1: mov strptr,r1 jsr pc,length cmp r0,2(sp) /end of field bhis 1f mov $'0,r0 jsr pc,putchar br 1b 1: tst (sp) /negative beq 1f mov $'-,r0 mov strptr,r1 dec w(r1) jsr pc,putchar 1: mov $' ,r0 jsr pc,putchar tst (sp)+ tst (sp)+ mov (sp)+,r1 jsr pc,release rts pc / .bss tenptr: .=.+2 .text / / / hexout: mov r1,-(sp) jsr pc,rewind jsr pc,getchar add $60,r0 cmp r0,$'9 blos 2f add $'A-'9-1,r0 2: mov strptr,r1 jsr pc,putchar mov (sp)+,r1 jsr pc,release rts pc / / wrchar: tst delflag jne in177 mov $1,r0 tst count bne 7f sys write; sp5; 6 mov ll,count mov $1,r0 7: dec count sys write; ch; 1 rts pc / / / here for unimplemented stuff / junk: movb r0,1f mov $1,r0 sys write; 1f; 2f-1f jmp loop .data 1: <0 not in switch.\n> 2: .even .text / / / / routine to place one word onto the pushdown list / Error exit to system on overflow. / / push: mov r1,(r5)+ cmp r5,$pdltop bhis pdlout rts pc / pdlout: mov $1,r0 sys write; 1f; 2f-1f 4 1: 2: .even / / / routine to remove one word from the pushdown list / carry bit set on empty stack / / / jsr pc,pop / pop: cmp r5,$pdl bhi 1f clr r1 sec rts pc 1: mov -(r5),r1 clc rts pc / / / / .data outdit: hexout .bss source: .=.+2 savec: .=.+2 ch: .=.+2 .text nl: <\n> asczero: <0> qm: .even / .bss chptr: .=.+2 strptr: .=.+2 basptr: .=.+2 errstack:.=.+2 / stable: .=.+256. .text casetab: case012; 012 /nl loop; 040 /sp case041; 041 /! case045; 045 /% case052; 052 /* case053; 053 /+ case055; 055 /- junk; 056 /. case057; 057 // case060; 060 /0 case060; 061 /1 case060; 062 /2 case060; 063 /3 case060; 064 /4 case060; 065 /5 case060; 066 /6 case060; 067 /7 case060; 070 /8 case060; 071 /9 case074; 074 /< case075; 075 /= case076; 076 /> case077; 077 /? case060; 101 /A case060; 102 /B case060; 103 /C case060; 104 /D case060; 105 /E case060; 106 /F case151; 111 /I case153; 113 /K case154; 114 /L case157; 157 /O case160; 120 /P case161; 121 /Q case163; 123 /S case166; 126 /V case170; 130 /X case172; 132 /Z case133; 133 /[ case136; 136 /^ case137; 137 /_ case143; 143 /c case144; 144 /d case146; 146 /f case151; 151 /i case153; 153 /k case154; 154 /l case157; 157 /o case160; 160 /p case161; 161 /q case163; 163 /s case166; 166 /v case170; 170 /x case172; 172 /z 0;0 / .bss pdl: .=.+100. pdltop: .text z{|}~/ / / routine to add the two centennial numbers / pointed to by r2 and r3. / a pointer to the result is returned in r1 / r2 and r3 are preserved / / mov ptr1,r2 / mov ptr2,r3 / jsr pc,add3 / mov r1,... / add3: mov r0,-(sp) mov r4,-(sp) mov r5,-(sp) mov r3,-(sp) mov r2,-(sp) / / allocate a new string whose length is / the max of the two addends. / mov w(r2),r0 sub a(r2),r0 mov w(r3),r4 sub a(r3),r4 cmp r0,r4 bgt 1f mov r4,r0 1: mov r0,r4 jsr pc,allocate mov r1,-(sp) / / get everything ready / mov 2(sp),r1 jsr pc,rewind mov 4(sp),r1 jsr pc,rewind clr carry / / now add them / 2: dec r4 blt 3f mov 2(sp),r1 /r2 jsr pc,getchar mov r0,r5 mov 4(sp),r1 /r3 jsr pc,getchar add r5,r0 add carry,r0 clr carry cmp r0,$100. blt 1f sub $100.,r0 mov $1,carry 1: tstb r0 bpl 1f add $100.,r0 mov $-1,carry 1: mov (sp),r1 /r1 jsr pc,putchar br 2b / / perhaps there is an extra digit / 3: mov carry,r0 beq 2f mov (sp),r1 /r1 jsr pc,putchar / / strip leading zeros / 2: jsr pc,fsfile 2: jsr pc,backspace bes 2f beq 2b inc r(r1) 2: mov r(r1),w(r1) / / strip leading 99's / jsr pc,fsfile jsr pc,backspace cmpb r0,$-1 bne 1f 2: jsr pc,backspace bes 2f cmpb r0,$99. beq 2b jsr pc,getchar 2: mov $-1,r0 jsr pc,alterchar mov r(r1),w(r1) / / restore and return / 1: mov (sp)+,r1 mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r5 mov (sp)+,r4 mov (sp)+,r0 rts pc / .bss carry: .=.+2 .text / / / routine to change the sign of the centennial number / pointed to by r1. / negative numbers are stored in 100's complement form with / -1 as the high order digit; the second digit is not 99. / / mov ...,r1 / jsr pc,chsign / chsign: mov r1,-(sp) mov r0,-(sp) jsr pc,rewind clr chcarry / 1: jsr pc,lookchar bes 1f negb r0 sub chcarry,r0 mov $1,chcarry add $100.,r0 cmpb $100.,r0 bgt 2f sub $100.,r0 clr chcarry 2: jsr pc,alterchar br 1b / 1: clr r0 sub chcarry,r0 beq 2f jsr pc,putchar jsr pc,fsfile jsr pc,backspace jsr pc,backspace cmp r0,$99. bne 1f mov r(r1),w(r1) mov $-1,r0 jsr pc,putchar br 1f / 2: jsr pc,fsfile jsr pc,backspace bne 1f mov r(r1),w(r1) / 1: mov (sp)+,r0 mov (sp)+,r1 rts pc / .bss chcarry: .=.+2 .text / / / / / routine to multiply the two centennial numbers / pointed to by r2 and r3. / a pointer to the result is returned in r1 / r2 and r3 are preserved / / mov ptr1,r2 / mov ptr2,r3 / jsr pc,mul3 / mov r1,... / / save registers and make space for temps / mul3: mov r5,-(sp) mov r3,-(sp) /arg2 mov r2,-(sp) /arg1 mov r0,-(sp) tst -(sp) /result tst -(sp) /arg1 tst -(sp) /arg2 tst -(sp) /carry / / compute sign of result and make args positive / clr outsign mov r2,r1 jsr pc,fsfile jsr pc,backspace bmi 2f mov r2,4(sp) /arg1 br 1f 2: jsr pc,length jsr pc,allocate mov r1,4(sp) mov r2,r0 jsr pc,move jsr pc,chsign com outsign 1: mov r3,r1 jsr pc,fsfile jsr pc,backspace bmi 2f mov r3,2(sp) /arg2 br 1f 2: mov r3,r1 jsr pc,length jsr pc,allocate mov r1,2(sp) mov r3,r0 jsr pc,move jsr pc,chsign com outsign 1: / / compute the length of the result and / allocate space for it / mov w(r2),r0 sub a(r2),r0 add w(r3),r0 sub a(r3),r0 jsr pc,allocate jsr pc,zero mov r1,6(sp) /result clr offset mov 2(sp),r1 /arg2 jsr pc,rewind / / work on next digit of arg2, starting over on arg1 / 1: mov 4(sp),r1 /arg1 jsr pc,rewind mov 2(sp),r1 /arg2 jsr pc,getchar bes 3f mov r0,r2 mov 6(sp),r1 /result jsr pc,rewind add offset,r(r1) clr 0(sp) /carry / / work on next digit of arg3 / form the product of the two digits, / add to what is already there and add in old carry / to generate new dit and new carry. / 2: mov 4(sp),r1 /arg1 jsr pc,getchar bes 2f mov r0,r3 mpy r2,r3 add (sp),r3 /carry mov 6(sp),r1 /result jsr pc,lookchar add r0,r3 mov r3,r1 clr r0 dvd $100.,r0 mov r0,(sp) /carry mov r1,r0 mov 6(sp),r1 /result jsr pc,alterchar br 2b / 2: inc offset tst (sp) /carry beq 1b mov 6(sp),r1 /result jsr pc,lookchar add (sp),r0 /carry jsr pc,alterchar br 1b / 3: / / change sign of result if necessary / tst outsign bpl 1f mov 6(sp),r1 /result jsr pc,chsign / / release dregs if necessary / 1: cmp 2(sp),14(sp) beq 1f mov 2(sp),r1 jsr pc,release 1: cmp 4(sp),12(sp) beq 1f mov 4(sp),r1 jsr pc,release 1: / / restore registers and return / tst (sp)+ tst (sp)+ tst (sp)+ mov (sp)+,r1 mov (sp)+,r0 mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r5 rts pc / .bss outsign: .=.+2 offset: .=.+2 k: .=.+2 kptr: .=.+2 .text / / / / routine to divide the two centennial numbers pointed / to by r2 (the divisor) and r3 (the dividend). / A pointer to the result is returned in r1. All other / registers are preserved. If the divisor is zero, zero / is returned and the carry bit is set. / Remainder is returned in r4 and has the sign / of the dividend. / / / mov divisor,r2 / mov dividend,r3 / jsr pc,div3 / mov r1,result / mov r4,remainder / / div3: mov r5,-(sp) mov r3,-(sp) /dividend mov r2,-(sp) /divisor mov r0,-(sp) tst -(sp) /result / / allocate space for result; allocate temps if necessary / clr r0 jsr pc,allocate mov r1,0(sp) /result / / / check for divisor zero / mov 4(sp),r2 /divisor mov w(r2),r0 sub a(r2),r0 bne 1f jmp eh 1: / / compute sign of result and make arguments positive / clr divsign mov r2,r1 jsr pc,length jsr pc,allocate mov r1,divisor mov r2,r0 jsr pc,move jsr pc,fsfile jsr pc,backspace bpl 1f 2: jsr pc,chsign mov r1,divisor com divsign 1: clr remsign mov r3,r1 jsr pc,length jsr pc,allocate mov r1,dividend mov r3,r0 jsr pc,move jsr pc,fsfile jsr pc,backspace bpl 1f 2: jsr pc,chsign mov r1,dividend com divsign com remsign 1: / / / find out how many digits in the quotient result / 1: mov dividend,r2 mov divisor,r3 mov w(r2),r0 sub a(r2),r0 add a(r3),r0 sub w(r3),r0 jlo bugout mov r0,divoffset mov 0(sp),r1 /result inc r0 jsr pc,seekchar clr r0 mov dividend,r1 jsr pc,putchar / / load r5 with binary divisor for finding / trial quotient digits. If leading digit of / divisor is <10, it is scaled / clr magic mov divisor,r1 jsr pc,fsfile jsr pc,backspace mov r0,r5 cmp r5,$10. bge 2f inc magic 2: mpy $100.,r5 jsr pc,backspace add r0,r5 tst magic beq 2f mov r5,r4 mpy $100.,r4 jsr pc,backspace add r0,r5 adc r4 asl r5 rol r4 dvd $25.,r4 mov r4,r5 2: / / compute trial quotient digit / 1: mov dividend,r1 jsr pc,fsfile jsr pc,backspace bec 9f; 4; 9: mov r0,r3 mpy $100.,r3 mov r3,r2 jsr pc,backspace add r0,r2 mpy $100.,r2 jsr pc,backspace add r0,r3 adc r2 / mov r5,r0 tst magic beq 3f ashc $3,r2 3: tst divoffset beq 2f inc r0 2: dvd r0,r2 mov r2,trial / / / multiply divisor by trial digit / mov divisor,r1 jsr pc,rewind jsr pc,length inc r0 mov divxyz,r1 jsr pc,rewind clr -(sp) 2: mov divisor,r1 jsr pc,getchar bes 2f mov r0,r3 mpy trial,r3 add (sp),r3 /carry clr r2 dvd $100.,r2 mov r2,(sp) /carry mov r3,r0 mov divxyz,r1 jsr pc,alterchar br 2b 2: mov divxyz,r1 mov (sp)+,r0 jsr pc,alterchar 3: / / and subtract from dividend / jsr pc,rewind mov divoffset,r0 mov dividend,r1 jsr pc,seekchar clr -(sp) / 2: mov dividend,r1 jsr pc,lookchar bes 2f mov r0,r2 / mov divxyz,r1 jsr pc,getchar sub r0,r2 sub (sp),r2 clr (sp) mov r2,r0 bpl 3f add $100.,r0 mov $1.,(sp) 3: mov dividend,r1 jsr pc,alterchar br 2b / / put away the quotient digit / 2: mov (sp)+,divcarry mov 0(sp),r1 /result jsr pc,backspace mov trial,r0 jsr pc,alterchar jsr pc,backspace / / and go for another digit / dec divoffset bmi 1f mov dividend,r1 dec w(r1) cmp w(r1),a(r1) bge 9f; 4; 9: jmp 1b / / fix up the result / 1: tst divcarry beq 1f mov trial,r0 dec r0 jsr pc,alterchar mov dividend,r1 mov $-1,r0 jsr pc,alterchar mov divisor,r2 mov dividend,r3 jsr pc,add3 mov r1,-(sp) mov r3,r1 jsr pc,release mov (sp)+,dividend 1: mov 0(sp),r1 /result jsr pc,rewind clr divcarry 1: jsr pc,lookchar bes 1f bic $!377,r0 add divcarry,r0 clr divcarry cmp r0,$100. blt 2f sub $100.,r0 inc divcarry 2: jsr pc,alterchar br 1b / 1: tst divcarry beq 1f mov $1.,r0 jsr pc,alterchar 1: jsr pc,fsfile 1: jsr pc,backspace bes 1f bne 1f mov r(r1),w(r1) br 1b 1: / / change sign of result if necessary / tst divsign bpl 1f jsr pc,chsign 1: mov dividend,r1 jsr pc,fsfile 1: jsr pc,backspace bes 1f bne 1f mov r(r1),w(r1) br 1b 1: bugout: tst remsign bpl 1f mov dividend,r1 jsr pc,chsign / / clean up junk, restore registers, and return / 1: mov divisor,r1 jsr pc,release mov (sp)+,r1 mov (sp)+,r0 mov (sp)+,r2 mov (sp)+,r3 mov dividend,r4 mov (sp)+,r5 clc rts pc / / / / .bss divisor: .=.+2 dividend: .=.+2 divxyz: .=.+2 divoffset:.=.+2 divcarry: .=.+2 divsign: .=.+2 trial: .=.+2 remsign: .=.+2 magic: .=.+2 .text / / / / routine to exponentiate the two centennial numbers / pointed to by r2 (the base) and r3 (the exponent). / A pointer to the result is returned in r1. / / mov base,r2 / mov exp,r3 / jsr pc,exp3 / mov r1,... / / / save registers / exp3: mov r3,-(sp) /exponent mov r2,-(sp) /base mov r0,-(sp) / / 1: mov $1,r0 jsr pc,allocate mov r1,-(sp) /accumulated result mov $1,r0 jsr pc,putchar / mov r2,r1 jsr pc,length jsr pc,allocate mov r1,-(sp) /powers of the base mov r2,r0 jsr pc,move / mov r3,r1 jsr pc,length jsr pc,allocate mov r1,-(sp) /exponent mov r3,r0 jsr pc,move jsr pc,fsfile clr exptemp jsr pc,backspace bpl 1f inc exptemp jsr pc,chsign / 1: mov 0(sp),r1 jsr pc,length beq 1f mov sqtemp,r2 mov 0(sp),r3 jsr pc,div3 mov r1,0(sp) mov r3,r1 jsr pc,release mov r4,r1 jsr pc,length jsr pc,release tst r0 beq 2f / / / mov 2(sp),r2 mov 4(sp),r3 jsr pc,mul3 mov r1,4(sp) mov r3,r1 jsr pc,release 2: mov 2(sp),r3 mov r3,r1 jsr pc,length jsr pc,allocate mov r1,r2 mov r3,r0 jsr pc,move jsr pc,mul3 mov r1,2(sp) mov r3,r1 jsr pc,release mov r2,r1 jsr pc,release br 1b 1: tst exptemp beq 1f mov 10(sp),r1 jsr pc,length bne 2f jmp eh 2: cmp r0,$1 blos 2f mov 4(sp),r1 jsr pc,create br 1f 2: jsr pc,rewind jsr pc,getchar cmp r0,$1 bgt 2f mov 4(sp),r1 jsr pc,create jsr pc,putchar br 1f 2: mov 4(sp),r1 jsr pc,create 1: mov (sp)+,r1 jsr pc,release mov (sp)+,r1 jsr pc,release mov (sp)+,r1 / mov (sp)+,r0 mov (sp)+,r2 mov (sp)+,r3 rts pc / .bss exptemp: .=.+2 .text / .globl getchar .globl stats .globl lookchar .globl fsfile .globl seekchar .globl backspace .globl putchar .globl alterchar .globl move .globl rewind .globl create .globl zero .globl allocate .globl release .globl collect .globl getword, putword .globl length, position .globl w, r, a, l .globl error / testing = 0 / / / routine to return the length of a string / / mov ...,r1 / jsr pc,length / mov r0,... / length: mov w(r1),r0 sub a(r1),r0 rts pc / / / routine to return the read pointer position / / mov ...,r1 / jsr pc,position / mov r0,... / position: mov r(r1),r0 sub a(r1),r0 rts pc / / / / / routine to get a word from the string / mov ...,r1 / jsr pc,getword / mov r0,... / getword: jsr pc,getchar bes noch movb r0,nchar jsr pc,getchar bec 2f dec r(r1) br noch 2: movb r0,nchar+1 mov nchar,r0 tst r0 /tst clears c-bit rts pc / / / routine to put a word onto the string / mov ...,r1 / mov ...,r0 / jsr pc,putword / putword: jsr pc,putchar swab r0 jsr pc,putchar swab r0 rts pc / .bss nchar: .=.+2 .text / / / / routine to read next character from string / pointed to by r1; character returned in r0 / c-bit set if character not available (end of file) / r1 is preserved / / mov ...,r1 / jsr pc,getchar / movb r0,... / getchar: jsr pc,lookchar bec 2f rts pc 2: inc r(r1) tst r0 /tst clears c-bit rts pc / noch: clr r0 sec rts pc / / routine to look at next character from string / pointed to by r1; character returned in r0 / c-bit set if character not available (end of file) / r1 is preserved / / mov ...,r1 / jsr pc,lookchar / movb r0,... / lookchar: .if testing jsr pc,plausible inc stats+6. .endif cmp w(r1),r(r1) blos noch movb *r(r1),r0 clc rts pc / plausible: cmp r1,$headers bhis 9f; 4; 9: cmp r1,$headend blo 9f; 4; 9: rts pc / / / / routine to move the read pointer of a string to a / specified point. If the string is not long enough, / the string is extended / / mov position,r0 / mov ...,r1 / jsr pc,seekchar / seekchar: mov r1,-(sp) mov r0,-(sp) .if testing jsr pc,plausible inc stats+10. .endif 1: mov (sp),r0 add a(r1),r0 cmp r0,l(r1) bhi 3f mov r0,r(r1) cmp r0,w(r1) blo 1f mov r0,w(r1) br 1f 3: mov (sp),r0 jsr pc,allocate mov 2(sp),r0 jsr pc,move jsr pc,swap jsr pc,release mov 2(sp),r1 br 1b 1: mov (sp)+,r0 mov (sp)+,r1 rts pc / / / routine to move read pointer of string to end of string / / mov ...,r1 / jsr pc,fsfile / fsfile: .if testing jsr pc,plausible inc stats+10. .endif mov w(r1),r(r1) rts pc / / / routine to read a string backwards / the read pointer is decremented before reading / / mov ...,r1 / jsr pc,backspace / mov r0,... / backspace: .if testing jsr pc,plausible inc stats+6. .endif cmp a(r1),r(r1) bhis noch dec r(r1) movb *r(r1),r0 clc rts pc / / / / / routine to put a character into the string / pointed to by r1; character in r0 / r0 and r1 are preserved. / / movb ch,r0 / mov ...,r1 / jsr pc,putchar / putchar: mov r1,-(sp) mov r0,-(sp) .if testing jsr pc,plausible inc stats+8. .endif 1: cmp w(r1),l(r1) blt 3f mov w(r1),r0 inc r0 sub a(r1),r0 /W-A+1 jsr pc,allocate mov 2(sp),r0 /r1 jsr pc,move jsr pc,swap jsr pc,release mov 2(sp),r1 /r1 cmp w(r1),l(r1) blt 3f 4 / 3: movb (sp),*w(r1) inc w(r1) mov (sp)+,r0 tst (sp)+ rts pc / / swap: mov w(r1),-(sp) mov w(r0),w(r1) mov (sp),w(r0) mov r(r1),(sp) mov r(r0),r(r1) mov (sp),r(r0) mov a(r1),(sp) mov a(r0),a(r1) mov (sp),a(r0) mov l(r1),(sp) mov l(r0),l(r1) mov (sp)+,l(r0) rts pc / / / routine to alter a character in the string / pointed to by r1; character in r0 / r0 and r1 are preserved. / / movb ch,r0 / mov ...,r1 / jsr pc,alterchar / alterchar: mov r1,-(sp) mov r0,-(sp) .if testing jsr pc,preposterous inc stats+8. .endif 1: cmp r(r1),l(r1) blt 3f mov l(r1),r0 inc r0 sub a(r1),r0 /W-A+1 jsr pc,allocate mov 2(sp),r0 /r1 jsr pc,move jsr pc,swap jsr pc,release mov 2(sp),r1 /r1 cmp r(r1),l(r1) blt 3f 4 / 3: movb (sp),*r(r1) inc r(r1) cmp r(r1),w(r1) ble 1f mov r(r1),w(r1) 1: mov (sp)+,r0 tst (sp)+ rts pc / / / routine to move the contents of one string / to another. / / mov source,r0 / mov dest,r1 / jsr pc,move / / on return, r1 points to the new string and should / be saved. r0 is preserved. / move: mov r3,-(sp) mov r2,-(sp) mov r1,-(sp) mov r0,-(sp) mov w(r0),r2 sub a(r0),r2 /W-A mov l(r1),r3 sub a(r1),r3 /L-A cmp r2,r3 ble 1f mov r2,r0 jsr pc,allocate mov 2(sp),r0 /r1 jsr pc,swap jsr pc,release mov r0,r1 mov 0(sp),r0 /r0 / 1: mov a(r0),(r0) mov a(r1),(r1) 1: dec r2 blt 1f movb *(r0),*(r1) inc (r0) inc (r1) br 1b / / fix up read ptr of new string / 1: mov r(r0),r2 sub a(r0),r2 add a(r1),r2 mov r2,r(r1) / / restore and return / mov (sp)+,r0 mov (sp)+,r1 mov (sp)+,r2 mov (sp)+,r3 rts pc / / / routine to rewind read pointer of string / pointed to by r1 / / mov ...,r1 / jsr pc,rewind / rewind: .if testing jsr pc,plausible inc stats+10. .endif mov a(r1),r(r1) rts pc / / routine to rewind write pointer of string / pointed to by r1 / / mov ...,r1 / jsr pc,create / create: .if testing jsr pc,plausible inc stats+10. .endif mov a(r1),w(r1) mov a(r1),r(r1) rts pc / / / routine to zero a string / / mov ...,r1 / jsr pc,zero / zero: mov r0,-(sp) .if testing jsr pc,preposterous .endif mov a(r1),r0 1: cmp r0,l(r1) bhis 1f clrb (r0)+ br 1b 1: mov (sp)+,r0 rts pc / / / / / here to allocate a new block / / mov ...,r0 / jsr pc,allocate / mov r1,... / / requested size in bytes in r0 / pointer to header of allocated block returned in r1 / r0 is preserved / / convert to words, adjust for header, round up / to a power of two / / each block has a four-word header / W - write ptr (also used as link ptr in frlist) / R - read ptr / A - pointer to head of data / L - ptr to (end+1) of data w=0 r=2 a=4 l=6 / allocate: clr garbage mov r0,-(sp) mov r2,-(sp) tst stats bne 1f jsr pc,init 1: inc stats bne 9f; inc stats; 9: cmp r0,$strend-strbuf blo 9f; 4; 9: 1: sub $1,r0 bmi 1f jsr pc,log2 add $1,r0 1: asl r0 /bite to word mov r0,-(sp) add $2,r0 cmp r0,$frend-frlist+2 blo zzz 4 / / look on free list for block of required size / zzz: mov (sp),r0 tst frlist(r0) beq xxx / / found it, allocate and return / mov frlist(r0),r1 mov (r1),frlist(r0) mov a(r1),r0 mov r0,w(r1) /W mov r0,r(r1) /R tst (sp)+ mov (sp)+,r2 mov (sp)+,r0 rts pc / / no block of required size / look for larger block / xxx: tst frlist-2 beq www tst (r0)+ cmp r0,$frend-frlist bhis www tst frlist(r0) bne yyy br xxx / / there are no larger blocks; must garbage collect / www: jsr pc,collect tst r0 bne zzz / / out of space / mov $1,r0 sys write; 1f; 2f-1f sys exit 1: 2: .even / / split larger block into two smaller pieces and / link together as smaller blocks in the free list. / yyy: mov frlist(r0),r1 mov (r1),frlist(r0) mov hdrptr,r2 beq www mov (r2),hdrptr clr (r2) mov r2,(r1) mov r1,frlist-2(r0) mov l(r1),l(r2) mov l(r1),r0 sub a(r1),r0 asr r0 add a(r1),r0 mov r0,l(r1) mov r0,a(r2) br zzz / / / here to release a block / / mov ...,r1 / jsr pc,release / / pointer to block in r1 / release: / / discover that this is a plausible pointer / mov r0,-(sp) jsr pc,preposterous / / find free list index and link block to that entry / inc stats+2 mov frlist(r0),(r1) clr r(r1) mov r1,frlist(r0) clr r1 /self-defense mov (sp)+,r0 rts pc / / / jsr pc,collect / / coalesce free storage by rejoining paired blocks / on the free list. / zero is returned in r0 if no paired blocks were found. / collect: mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov r4,-(sp) clr useful inc stats+4. clr r0 /start with smallest blocks /r0 contains frlist index loop1: mov $frlist,r1 add r0,r1 / / try next list member at this level / loop2: mov (r1),r3 beq advance /list is empty tst *(r1) /W beq advance /only one list element / / calculate address of buddy / mov a(r3),r4 sub $strbuf,r4 bit exp2(r0),r4 beq 2f bic exp2(r0),r4 br 1f 2: bis exp2(r0),r4 1: add $strbuf,r4 / / and search for him / loop3: tst 0(r3) beq nocoal mov (r3),r2 cmp a(r2),r4 beq coal mov (r3),r3 br loop3 / / have found a pair; remove both blocks from list, / coalesce them, and put them on next higher list / coal: inc useful mov (r3),r4 mov (r4),(r3) /remove him from list mov (r1),r2 mov (r2),(r1) /remove the other one cmp a(r2),a(r4) bgt 1f mov r2,-(sp) mov r4,r2 mov (sp)+,r4 1: add exp2(r0),l(r4) clr r(r4) mov frlist+2(r0),(r4) mov r4,frlist+2(r0) mov frlist-2,(r2) mov r2,frlist-2 clr r(r2) mov $strbuf,a(r2) mov $strbuf,l(r2) br loop2 / / no buddy found, try next block on this list / nocoal: mov (r1),r1 br loop2 / / advance to next free list / advance: tst (r0)+ cmp r0,$frend-frlist blo loop1 mov useful,r0 / / do we have enough headers to continue? / tst garbage beq 1f mov $1,r0 sys write; 4f; 5f-4f sys exit / 4: 5: .even / / / restore registers and return / 1: inc garbage mov (sp)+,r4 mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 rts pc / .bss garbage: .=.+2 .text / / routine to find integer part of log2(x) / / jsr pc,log2 / / r0 = log2(r0) / log2: mov r0,-(sp) bge 9f; 4; 9: mov $15.,r0 1: rol (sp) bmi 1f sob r0,1b 1: dec r0 tst (sp)+ rts pc / 0 /Don't move me, I'm exp(-1) exp2: 1;2;4;10;20;40;100;200;400;1000;2000;4000; 10000;20000;40000;100000 / / routine to discover whether r1 points to / a plausible header - to avoid ruination. / / r1 is preserved and r0 gets a suitable index for frlist / / jsr pc,preposterous / preposterous: cmp r1,$headers bhis 9f; 4; 9: cmp r1,$headend blo 9f; 4; 9: cmp a(r1),$strbuf /A bhis 9f; 4; 9: cmp l(r1),$strend /L blos 9f; 4; 9: mov l(r1),r0 /L sub a(r1),r0 /A mov r0,-(sp) jsr pc,log2 asl r0 cmp exp2(r0),(sp) beq 9f; 4; 9: add $2,r0 cmp r0,$frend-frlist+2 blo 9f; 4; 9: sub $2,r0 mov r0,(sp) mov frlist(r0),r0 1: beq 1f cmp r0,r1 bne 9f; 4; 9: mov (r0),r0 br 1b 1: mov (sp)+,r0 rts pc / / / routine to initialize storage area, headers and / free list upon first call to allocate a block. / The entire storage area is formed into a single block. / init: mov r0,-(sp) mov r1,-(sp) / / form all the headers into a single list. / mov $headers,r0 mov r0,frlist-2 1: add $8,r0 mov r0,-8(r0) cmp r0,$headend-8 blos 1b clr -8(r0) mov $frlist,r0 1: clr (r0)+ cmp r0,$frend blo 1b / mov frlist-2,r1 mov (r1),frlist-2 clr w(r1) mov $strbuf,r0 mov r0,a(r1) mov $strend-strbuf,r0 jsr pc,log2 asl r0 cmp r0,$frend-frlist blo 9f; 4; 9: mov r1,frlist(r0) mov exp2(r0),r0 add $strbuf,r0 mov r0,l(r1) mov $frlist-2,r1 1: mov (r1),r1 tst r1 beq 1f mov $strbuf,a(r1) mov $strbuf,l(r1) br 1b 1: mov (sp)+,r1 mov (sp)+,r0 rts pc / / .bss stats: .=.+16. useful: .=.+2 hdrptr: .=.+2 /do not move me frlist: .=hdrptr+32. frend: headers:.=hdrptr+512. headend: strbuf: .=.+10000 strend: end: signal = 48. #define LCASE 01 #define UCASE 02 #define SWAB 04 #define NERR 010 #define SYNC 020 int cflag; int fflag; int skip; int count; char *string; char *ifile; char *ofile; char *ibuf; char *obuf; char *ibs 512; char *obs 512; char *bs; char *cbs; char *ibc; char *obc; char *cbc; int nifr; int nipr; int nofr; int nopr; int ntrunc; int ibf; int obf; char *op; int nspace; char etoa[] { 0000,0001,0002,0003,0234,0011,0206,0177, 0227,0215,0216,0013,0014,0015,0016,0017, 0020,0021,0022,0023,0235,0205,0010,0207, 0030,0031,0222,0217,0034,0035,0036,0037, 0200,0201,0202,0203,0204,0012,0027,0033, 0210,0211,0212,0213,0214,0005,0006,0007, 0220,0221,0026,0223,0224,0225,0226,0004, 0230,0231,0232,0233,0024,0025,0236,0032, 0040,0240,0241,0242,0243,0244,0245,0246, 0247,0250,0133,0056,0074,0050,0053,0041, 0046,0251,0252,0253,0254,0255,0256,0257, 0260,0261,0135,0044,0052,0051,0073,0136, 0055,0057,0262,0263,0264,0265,0266,0267, 0270,0271,0174,0054,0045,0137,0076,0077, 0272,0273,0274,0275,0276,0277,0300,0301, 0302,0140,0072,0043,0100,0047,0075,0042, 0303,0141,0142,0143,0144,0145,0146,0147, 0150,0151,0304,0305,0306,0307,0310,0311, 0312,0152,0153,0154,0155,0156,0157,0160, 0161,0162,0313,0314,0315,0316,0317,0320, 0321,0176,0163,0164,0165,0166,0167,0170, 0171,0172,0322,0323,0324,0325,0326,0327, 0330,0331,0332,0333,0334,0335,0336,0337, 0340,0341,0342,0343,0344,0345,0346,0347, 0173,0101,0102,0103,0104,0105,0106,0107, 0110,0111,0350,0351,0352,0353,0354,0355, 0175,0112,0113,0114,0115,0116,0117,0120, 0121,0122,0356,0357,0360,0361,0362,0363, 0134,0237,0123,0124,0125,0126,0127,0130, 0131,0132,0364,0365,0366,0367,0370,0371, 0060,0061,0062,0063,0064,0065,0066,0067, 0070,0071,0372,0373,0374,0375,0376,0377, }; char atoe[] { 0000,0001,0002,0003,0067,0055,0056,0057, 0026,0005,0045,0013,0014,0015,0016,0017, 0020,0021,0022,0023,0074,0075,0062,0046, 0030,0031,0077,0047,0034,0035,0036,0037, 0100,0117,0177,0173,0133,0154,0120,0175, 0115,0135,0134,0116,0153,0140,0113,0141, 0360,0361,0362,0363,0364,0365,0366,0367, 0370,0371,0172,0136,0114,0176,0156,0157, 0174,0301,0302,0303,0304,0305,0306,0307, 0310,0311,0321,0322,0323,0324,0325,0326, 0327,0330,0331,0342,0343,0344,0345,0346, 0347,0350,0351,0112,0340,0132,0137,0155, 0171,0201,0202,0203,0204,0205,0206,0207, 0210,0211,0221,0222,0223,0224,0225,0226, 0227,0230,0231,0242,0243,0244,0245,0246, 0247,0250,0251,0300,0152,0320,0241,0007, 0040,0041,0042,0043,0044,0025,0006,0027, 0050,0051,0052,0053,0054,0011,0012,0033, 0060,0061,0032,0063,0064,0065,0066,0010, 0070,0071,0072,0073,0004,0024,0076,0341, 0101,0102,0103,0104,0105,0106,0107,0110, 0111,0121,0122,0123,0124,0125,0126,0127, 0130,0131,0142,0143,0144,0145,0146,0147, 0150,0151,0160,0161,0162,0163,0164,0165, 0166,0167,0170,0200,0212,0213,0214,0215, 0216,0217,0220,0232,0233,0234,0235,0236, 0237,0240,0252,0253,0254,0255,0256,0257, 0260,0261,0262,0263,0264,0265,0266,0267, 0270,0271,0272,0273,0274,0275,0276,0277, 0312,0313,0314,0315,0316,0317,0332,0333, 0334,0335,0336,0337,0352,0353,0354,0355, 0356,0357,0372,0373,0374,0375,0376,0377, }; main(argc, argv) int argc; char **argv; { register (*conv)(); register char *ip; register c; int ebcdic(), ascii(), null(), cnull(), term(); int a; conv = null; for(c=1; cibuf;) *--ip = 0; ibc = read(ibf, ibuf, ibs); } if(ibc == -1) { perror("read"); if((cflag&NERR) == 0) { flsh(); term(); } ibc = 0; for(c=0; c>1) & ~1; if(cflag&SWAB && c) do { a = *ip++; ip[-1] = *ip; *ip++ = a; } while(--c); ip = ibuf; if (fflag) { obc = ibc; flsh(); ibc = 0; } goto loop; } c = 0; c =| *ip++; (*conv)(c); goto loop; } flsh() { register c; if(obc) { if(obc == obs) nofr++; else nopr++; c = write(obf, obuf, obc); if(c != obc) { perror("write"); term(); } obc = 0; } } match(s) char *s; { register char *cs; cs = string; while(*cs++ == *s) if(*s++ == '\0') goto true; if(*s != '\0') return(0); true: cs--; string = cs; return(1); } number() { register char *cs; register n; cs = string; n = 0; while(*cs >= '0' && *cs <= '9') n = n*10 + *cs++ - '0'; for(;;) switch(*cs++) { case 'k': n =* 1024; continue; case 'w': n =* 2; continue; case 'b': n =* 512; continue; case '*': case 'x': string = cs; n =* number(); case '\0': return(n); } printf("not a number: %s\n", string); exit(); } cnull(cc) { register c; c = cc; if(cflag&UCASE && c>='a' && c<='z') c =+ 'A'-'a'; if(cflag&LCASE && c>='A' && c<='Z') c =+ 'a'-'A'; null(c); } null(c) { *op = c; op++; if(++obc >= obs) { flsh(); op = obuf; } } ascii(cc) { register c; c = 0; c =| etoa[cc]; if(cbs == 0) { cnull(c); return; } if(c == ' ') { nspace++; goto out; } while(nspace > 0) { null(' '); nspace--; } cnull(c); out: if(++cbc >= cbs) { null('\n'); cbc = 0; nspace = 0; } } ebcdic(cc) { register c; c = cc; if(cflag&UCASE && c>='a' && c<='z') c =+ 'A'-'a'; if(cflag&LCASE && c>='A' && c<='Z') c =+ 'a'-'A'; c = atoe[c] & 0377; if(cbs == 0) { null(c); return; } if(cc == '\n') { while(cbc < cbs) { null(atoe[' ']); cbc++; } cbc = 0; return; } if(cbc == cbs) ntrunc++; cbc++; if(cbc <= cbs) null(c); } term() { stats(); exit(); } stats() { printf("%l+%l records in\n", nifr, nipr); printf("%l+%l records out\n", nofr, nopr); if(ntrunc) printf("%l truncated records\n", ntrunc); } putchar(c) { write(2, &c, 1); } char *dargv[] { 0, "/dev/rk2", "/dev/rp0", 0 }; struct { char *s_isize; char *s_fsize; int s_nfree; int s_free[100]; int s_ninode; int s_inode[100]; char s_flock; char s_ilock; char s_fmod; int time[2]; int pad[50]; } sblock; int fi; main(argc, argv) char **argv; { int i; if(argc <= 1) { for(argc = 1; dargv[argc]; argc++); argv = dargv; } for(i=1; i 1) printf("%s ", argv[i]); dfree(argv[i]); } } dfree(file) char *file; { int i; fi = open(file, 0); if(fi < 0) { printf("cannot open %s\n", file); return; } sync(); bread(1, &sblock); i = 0; while(alloc()) i++; printf("%l\n", i); close(fi); } alloc() { int b, i, buf[256]; i = --sblock.s_nfree; if(i<0 || i>=100) { printf("bad free count\n"); return(0); } b = sblock.s_free[i]; if(b == 0) return(0); if(b=sblock.s_fsize) { printf("bad free block (%l)\n", b); return(0); } if(sblock.s_nfree <= 0) { bread(b, buf); sblock.s_nfree = buf[0]; for(i=0; i<100; i++) sblock.s_free[i] = buf[i+1]; } return(b); } bread(bno, buf) { int n; extern errno; seek(fi, bno, 3); if((n=read(fi, buf, 512)) != 512) { printf("read error %d\n", bno); printf("count = %d; errno = %d\n", n, errno); exit(); } } #define BUFSIZ 518 int *xx; struct buf { int fdes; char junk[BUFSIZ-2]; } *buf1, *buf2; int *oldnew[2]; int ms[2] {0,0}; /*maximum serial seen en each file*/ int debug 0; int *ixold; int *ixnew; int *a0; int *b0; int *L, *R; int *J; /*index of lines in file b matched to each in file a*/ main(argc,argv) char **argv; { int i; if(argc>1&&*argv[1]=='-') { argc--; argv++; } if(argc!=3) { write(2,"arg count\n",10); exit(); } buf1 = sbrk(BUFSIZ); input(argv); a0 = oldnew[0]; b0 = oldnew[1]; i = 2*ms[1]+4; L = sbrk(i); R = buf2 = sbrk(ifdes); ms[i] = &xx[k]-oldnew[i]; } } /* check does double duty: 1. ferret out any fortuitous correspondences due to counfounding by hashing (which result in "jackpot") 2. collect random access indexes to the two files */ check(argv) char **argv; { register int i, j; int ctold, ctnew; int jackpot; char c,d; fopen(argv[1],buf1); fopen(argv[2],buf2); j = 1; ctold = ctnew = 0; ixold[0] = ixnew[0] = 0; jackpot = 0; for(i=1;i<=ms[0];i++) { if(J[i]==0) { while(getc(buf1)!='\n') ctold++; ixold[i] = ++ctold; continue; } while(jfdes); close(buf2->fdes); return(jackpot); } /* part asks inner to find the x[m][j] vector left-to-right and right-to-left, and then partitions the problem to give a maximum string. This scheme, due to hirshberg, allows one to due the dynamic programming in linear space. */ part(a,m,b,n) int a[],b[]; { int h,i1,i2,j1,j2,k,k0; int t,u; if(debug) { vprint("part a",a,a0,m,1); vprint("part b",b,b0,n,1); } while(m>0&&n>0&&a[1]==b[1]) { J[++a-a0] = ++b-b0; m--; n--; } while(m>0&&n>0&&a[m]==b[n]) J[a-a0+m--] = b-b0+n--; if(m<=0||n<=0) return; L[0] = R[0] = 0; h = m/2; inner(a,h,b,n,L,1); inner(a+m+1,m-h,b+n+1,n,R,-1); t = 0; k0 = 0; for(k=0;k<=n;k++) if((u=L[k]+R[n-k])>t) { t = u; k0 = k; } strip(a,h,b,k0,L,1,&i1,&j1); strip(a+m+1,m-h,b+n+1,n-k0,R,-1,&i2,&j2); part(a,i1,b,j1); part(a+m-i2,i2,b+n-j2,j2); } /* inner generates the last row of the matrix x[i,j] where x[i,j] shows the length of the longest common subsequence between the first i elements of vector a and the first j elements of vector b. x[i,j] is computed by the recurrence x[0,j] = x[i,0] = 0 x[i,j] = max {x[i-1,j], x[i,j-1], x[i-1,j-1]+c[i,j] where c[i,j] = 0 iff a[i]=b[j] */ inner(a,m,b,n,x,d) int a[],b[],x[]; int d; /* +1 if a and b stored forward, -1 backward */ { int aid; /* a[i*d] */ int *lbjd; /* &b[j*d] */ int i; int *y; register int xi_j_; /* x[i-1][j-1] */ register int j,t; if(debug) { vprint("inn a",a,a0,m,d); vprint("inn b",b,b0,n,d); } for(j=0;j<=n;j++) x[j] = 0; y = x; for(i=1;i<=m;i++) { x = y; xi_j_ = t = 0; aid = a[i*d]; lbjd = b; for(j=1;j<=n;j++) { if(t<*++x) t = *x; /*t=x[i][j-1] *++x=x[i-1][j]*/ if(aid== *(lbjd=+d) && xi_j_>=t) t++; xi_j_ = *x; *x = t; /* x[i][j] = t */ } } } /* strip finds the last mated pair of elements in the maximum matching of vector a and vector b, given the appropriate x vector computed by inner. it strips all elements after this mated pair, */ strip(a,m,b,n,x,d,li,lj) int a[],b[],x[]; int *li,*lj; { register int i,j,*laid; int bjd; if(debug) { vprint("strip a",a,a0,m,d); vprint("strip b",b,b0,n,d); vprint("strip x",x,x,n,1); } for(j=n;j>0&&x[j]==x[j-1];j--); bjd = b[j*d]; laid = &a[(m+1)*d]; for(i=m;i>0&&*(laid=-d)!=bjd;i--); *li = i; *lj = j; } output(argv) char **argv; { int dir; int m; int i0,i1,j0,j1; extern fout; dir = **argv=='-'; fout = dup(1); buf1->fdes = open(argv[1],0); buf2->fdes = open(argv[2],0); m = ms[0]; J[0] = 0; J[m+1] = ms[1]+1; if(dir==0) for(i0=1;i0<=m;i0=i1+1) { while(i0<=m&&J[i0]==J[i0-1]+1) i0++; j0 = J[i0-1]+1; i1 = i0-1; while(i1=1;i0=i1-1) { while(i0>=1&&J[i0]==J[i0+1]-1&&J[i0]!=0) i0--; j0 = J[i0+1]-1; i1 = i0+1; while(i1>1&&J[i1-1]==0) i1--; j1 = J[i1-1]+1; J[i1] = j1; change(i1,i0,j1,j0,dir); } flush(); } change(a,b,c,d,dir) { if(a>b&&c>d) return; range(a,b); putchar(a>b?'a':c>d?'d':'c'); if(dir==0) range(c,d); putchar('\n'); if(dir==0) { fetch(ixold,a,b,buf1,"* "); if(a<=b&&c<=d) printf("---\n"); } fetch(ixnew,c,d,buf2,dir==0?". ":""); if(dir!=0&&c<=d) printf(".\n"); } range(a,b) { if(a>b) printf("%d",b); if(a<=b) printf("%d",a); if(afdes,f[i-1],0); read(lb->fdes,lb->junk,f[i]-f[i-1]); printf(pref); for(j=0;jjunk[j]); } } vprint(s,v,v0,n,d) int *v,*v0; char *s; { int i; printf("%s\n",s); for(i=1;i<=n;i++) printf("%7o",v-v0+i*d); printf("\n"); for(i=1;i<=n;i++) printf("%7o",v[i*d]); printf("\n"); } .globl _readhash .globl getc h = 0 s = 2 .data _readhash: mov 2(sp),0f mov r5,-(sp) sub $4,sp clr h(sp) clr s(sp) 1: jsr r5,getc; 0: 0 bes 2f bic $177400,r0 cmp r0,$'\n beq 1f ashc $-16.,r0 ashc s(sp),r0 add r0,h(sp) adc h(sp) add r1,h(sp) adc h(sp) add $7,s(sp) cmp s(sp),$16. blt 1b sub $16.,s(sp) br 1b 1: clr r0 cmp h(sp),$-1 beq 1f mov h(sp),r0 1: cmp (sp)+,(sp)+ mov (sp)+,r5 rts pc 2: mov $-1,r0 br 1b / dsw - delete from tty cmp (sp)+,$2 blt 1f tst (sp)+ mov (sp)+,0f 1: sys stat; 0:dot; stbuf bes error mov stbuf+4,r0 bic $!60000,r0 cmp r0,$40000 bne error mov 0b,0f sys open; 0:..; 0 bes error mov r0,r1 1: clrb buf+17. mov r1,r0 sys read; buf; 16. bes done tst r0 beq done tst buf beq 1b mov 0b,r2 mov $obuf,r3 2: movb (r2)+,(r3)+ bne 2b mov $buf+2,r2 dec r3 cmpb -1(r3),$'/ beq 2f movb $'/,(r3)+ 2: movb (r2)+,(r3)+ bne 2b sys stat; obuf; stbuf bes error bit $60000,stbuf+4 bne 1b mov $buf+2,r2 2: tstb (r2)+ bne 2b movb $' ,-(r2) sub $buf+1,r2 mov r2,0f 2: mov $1,r0 sys write; buf+2; 0:.. clr r0 sys read; ch; 1 cmpb ch,$'\n beq 1b clr r0 sys read; ch1; 1 cmpb ch1,$'\n beq 3f 4: clr r0 sys read; ch; 1 cmpb ch,$'\n beq 2b br 4b 3: cmpb ch,$'x beq done cmpb ch,$'y bne 2b sys unlink; obuf bes error br 1b done: sys exit error: mov $1,r0 sys write; mes; 2 sys exit dot: <.\0> mes: .bss obuf: .=.+100. stbuf: .=.+40. buf: .=.+18. ch: .=.+1 ch1: .=.+1 / dusg -- summarize disk usage .globl putc, flush, _end mov $1,obuf mov (sp)+,r5 tst (sp)+ 1: dec r5 bgt 2f tstb buf1 beq 3f jsr r5,flush; obuf sys exit 3: mov $dot,r0 br 3f 2: mov (sp)+,r0 3: cmpb (r0),$'- bne 2f cmpb 1(r0),$'a bne 3f inc aflg br 1b 3: cmpb 1(r0),$'s bne 1b dec aflg br 1b 2: mov $buf1,r1 2: movb (r0)+,(r1)+ bne 2b dec r1 clr buf3+10. mov $_end,iptr mov $_end,brk sys break; _end jsr pc,tree tst aflg bpl 1b jsr r5,name br 1b tree: sys stat; buf1; buf2 bes 1f bic $!60000,buf2+4 bit $20000,buf2+4 beq 2f 1: clr r4 rts pc 2: mov $_end,r2 mov buf2+2,r3 1: cmp r2,iptr bhis 1f cmp r3,(r2)+ bne 1b clr r4 jsr r5,cname rts pc 1: cmp r2,brk blo 1f add $512.,brk sys break; brk: .. 1: mov r3,(r2)+ mov r2,iptr cmp $40000,buf2+4 beq 1f jsr pc,gsize jsr r5,cname rts pc 1: jsr pc,gsize mov r4,r3 sys open; buf1; 0 bec 1f rts pc 1: mov r0,-(sp) mov r1,-(sp) 1: mov 2(sp),r0 sys read; buf3; 16. bes 1f tst r0 beq 1f tst buf3 beq 1b cmp buf3+2,$".\0 beq 1b cmp buf3+2,$".. bne 2f tst buf3+4 beq 1b 2: mov $buf3+2,r2 mov (sp),r1 movb $'/,(r1)+ cmpb -2(r1),$'/ bne 2f dec r1 2: movb (r2)+,(r1)+ bne 2b dec r1 mov r3,-(sp) jsr pc,tree mov r4,r3 add (sp)+,r3 br 1b 1: mov (sp)+,r1 clrb (r1) mov (sp)+,r0 sys close mov r3,r4 tst aflg bmi 1f jsr r5,name 1: rts pc cname: tst aflg bgt name rts r5 name: jsr pc,pnum mov $011,r0 jsr pc,pchar mov $buf1,r2 1: movb (r2)+,r0 beq 1f jsr pc,pchar br 1b 1: mov $'\n,r0 jsr pc,pchar rts r5 gsize: mov r5,-(sp) mov buf2+10.,r5 / size movb buf2+9.,r4 add $511.,r5 adc r4 alsc $-9,r4 cmp r5,$8. blo 1f mov r5,-(sp) add $255.,r5 alsc $-8,r4 add (sp)+,r5 1: mov r5,r4 mov (sp)+,r5 rts pc pnum: mov r4,-(sp) mov r5,-(sp) mov r4,r5 jsr pc,1f mov (sp)+,r5 mov (sp)+,r4 rts pc 1: clr r4 dvd $10.,r4 mov r5,-(sp) mov r4,r5 beq 1f jsr pc,1b 1: mov (sp)+,r0 add $'0,r0 jsr pc,pchar rts pc pchar: jsr r5,putc; obuf rts pc dot: <.\0> .bss iptr: .=.+2 buf1: .=.+100. buf2: .=.+40. buf3: .=.+18. aflg: .=.+2 obuf: .=.+520. # /* * incremental dump * dump isuodh filesystem * i from date in /etc/ddate * s specify tape size in feet (feet = blocks/9) * u update /etc/ddate to current date * 0 dump from the epoch * d dump specified number of days * h dump specified number of hours */ char *dargv[] { 0, "i", "/dev/rp0", 0 }; char *dfile "/etc/ddate"; char *ofile "/dev/mt0"; struct inode { int i_mode; char i_nlink; char i_uid; char i_gid; char i_size0; char *i_size1; int i_addr[8]; int i_atime[2]; int i_mtime[2]; }; /* modes */ #define IALLOC 0100000 #define IFMT 060000 #define IFDIR 040000 #define IFCHR 020000 #define IFBLK 060000 #define ILARG 010000 struct { char *s_isize; char *s_fsize; int s_nfree; int s_free[100]; int s_ninode; int s_inode[100]; char s_flock; char s_ilock; char s_fmod; int time[2]; int pad[50]; } sblock; int *talist; int fi; int buf[256]; int dbuf[256]; int ibuf[256]; char *date[2]; char *ddate[2]; int fo; int pher; int dflg; char *tsize 15000; main(argc, argv) char **argv; { char *key; int s, i, nfil, nblk; register *tap; register struct inode *ip; time(date); if(argc == 1) { argv = dargv; for(argc = 1; dargv[argc]; argc++); } argc--; argv++; key = *argv; while(*key) switch(*key++) { default: printf("bad character in key\n"); exit(); case 'i': i = open(dfile, 0); if(i >= 0) { read(i, ddate, 4); close(i); } continue; case 's': /* tape size */ tsize = number(argv[1]) * 9; argv++; argc--; continue; case 'u': /* rewrite date */ dflg++; continue; case '0': /* dump all */ ddate[0] = ddate[1] = 0; continue; case 'd': /* dump some number of days */ i = 21600; goto sd; case 'h': /* dump some number of hours */ i = 900; goto sd; sd: ddate[0] = date[0]; ddate[1] = date[1]; s = number(argv[1])*4; argv++; argc--; while(s) { if(i > ddate[1]) ddate[0]--; ddate[1] =- i; s--; } continue; } if(argc <= 1) { printf("no file system specified\n"); exit(); } printf("%s:\n", argv[1]); fi = open(argv[1], 0); if(fi < 0) { printf("cannot open %s\n", argv[1]); exit(); } printf("incremental dump from\n"); pdate(ddate); sync(); bread(1, &sblock); talist = sbrk(size(0, sblock.s_isize*32)*512); tap = talist; nfil = 0; nblk = 0; for(i=0; ii_mode == 0) goto no; if(ip->i_nlink == 0) goto no; s = size(ip->i_size0, ip->i_size1); if(ip->i_mtime[0] < ddate[0]) goto no; if(ip->i_mtime[0] == ddate[0] && ip->i_mtime[1] < ddate[1]) goto no; nfil++; nblk =+ s; *tap = s+1; no: tap++; } } printf("%l files\n%l blocks\n", nfil, nblk); otape(); tap = buf; clrbuf(tap); *tap++ = sblock.s_isize; *tap++ = sblock.s_fsize; *tap++ = date[0]; *tap++ = date[1]; *tap++ = ddate[0]; *tap++ = ddate[1]; *tap++ = tsize; swrite(buf); i = size(0, sblock.s_isize*32); tap = talist; while(i--) { bwrite(tap); tap =+ 256; } tap = talist; for(i=0; i= 0) { write(i, date, 4); printf("date updated\n"); pdate(date); } } } pdate(d) int *d; { if(d[0] == 0 && d[1] == 0) printf("the epoch\n"); else printf(ctime(d)); } dump(ip, sz) struct inode *ip; { register *p, *q; p = dbuf; q = ip; clrbuf(p); while(q < &ip->i_mtime[2]) *p++ = *q++; swrite(dbuf); if(ip->i_mode & (IFBLK&IFCHR)) { if(sz != 0) printf("special\n"); return; } for(p = &ip->i_addr[0]; p < &ip->i_addr[8]; p++) { if(*p == 0) continue; if(ip->i_mode&ILARG) { bread(*p, ibuf); for(q = &ibuf[0]; q < &ibuf[256]; q++) { if(*q == 0) continue; if(--sz < 0) goto pe; bread(*q, dbuf); bwrite(dbuf); } } else { if(--sz < 0) goto pe; bread(*p, dbuf); bwrite(dbuf); } } if(sz) goto pe; return; pe: clrbuf(dbuf); while(--sz >= 0) bwrite(dbuf); pher++; } bread(bno, b) { seek(fi, bno, 3); if(read(fi, b, 512) != 512) { printf("read error %l\n", bno); exit(); } } clrbuf(b) int *b; { register i, *p; p = b; i = 256; while(i--) *p++ = 0; } swrite(b) int *b; { register i, s, *p; i = 255; s = 0; p = b; while(i--) s =+ *p++; *p = 031415 - s; bwrite(b); } bwrite(b) { static char *ta; if(ta++ > tsize) { printf("change tapes\n"); close(fo); while((ta = getchar()) != '\n') if(ta == 0) exit(); ta = 0; otape(); } if(write(fo, b, 512) != 512) { printf("write error\n"); exit(); } } number(s) char *s; { register n, c; n = 0; while(c = *s++) { if(c<'0' || c>'9') continue; n = n*10+c-'0'; } return(n); } size(s0, s1) { register s; extern ldivr; s = ldiv(s0&0377, s1, 512); if(ldivr) s++; return(s); } otape() { fo = open(ofile, 1); if(fo < 0) { printf("can not open %s\n", ofile); exit(); } } main(argc, argv) int argc; char *argv[]; { int i; argc--; for(i=1; i<=argc; i++) printf("%s%c", argv[i], i==argc? '\n': ' '); } / / copyright 1972 bell telephone laboratories inc. / / ed1 -- text editor signal = 48. cmpb *2(sp),$'- bne 1f inc shflg jsr r5,print; qed 1: jsr r5,inite sys signal; 1; 1 ror r0 bcs 1f sys signal; 1; cq1 / hangup 1: sys signal; 2; 1 bcs 1f sys signal; 2; error / interrupt inc intrflg 1: sys signal; 3; 1 clr filebuf clr filsav clr exprbuf mov $'\n,nl mov sp,gsp mov sp,r4 mov (r4)+,argc dec argc ble 8f tst (r4)+ 0: mov (r4)+,r3 cmpb (r3),$'- bne 1f inc nonum dec argc ble 8f br 0b 1: mov $filebuf,r1 mov $filsav,r2 1: movb (r3),(r2)+ movb (r3)+,(r1)+ bne 1b mov dol,addr2 mov $12,ch jmp cr1 8: jmp advanc 9: error: jsr r5,print; qerr sys signal; 2; error / interrupt clr r0 sys seek; 0; 2 clr pflag jsr r5,gclear mov ch,peekc 1: jsr r5,getc cmp r1,$12 bne 1b 8: advanc: mov gsp,sp tst pflag beq 1f clr pflag mov dot,addr1 mov dot,addr2 jmp cp1 1: tst gflag beq 1f tstb *gbufp bne 3f mov zero,r4 2: tst (r4)+ cmp r4,dol bhi 2f bit $1,(r4) beq 2b dec (r4) mov r4,dot mov $gbuf,gbufp br 3f 2: jsr r5,gclear 1: tst shflg beq 3f mov $1,r0 sys write; prompt; 1 3: clr adrflg jsr r5,address br command inc adrflg mov addr,addr1 adrloop: mov addr,addr2 jsr r5,switch; delimt br command delimt: ';; 1f ',; 2f 0 1: cmp addr,dol bhi 9b mov addr,dot 2: jsr r5,address br 9b mov addr2,addr1 br adrloop command: jsr r5,switch; comndt br 9b comndt: 'a; ca 'c; cc 'd; cd 'e; ce 'f; cf 'g; cg 'i; ci 'k; ck 'l; cl 'm; cm 'n; cn 'p; cp 'o; co 'q; cq 'r; cr 's; cs / 't; ct 'v; cv 'w; cw '=; ceq '!; cex '\n; cnl 0 co: jsr r5,setna jsr r5,getc cmp r1,$'\n beq 9f mov r1,r3 jsr r5,newline cmp r3,$'s bne 0f inc nonum br 1f 0: cmp r3,$'v bne 9f clr nonum 1: jmp advanc ca: jsr r5,set.d jsr r5,newline br ci2 cc: jsr r5,set.d jsr r5,newline jsr r5,delete mov addr1,addr2 br ci1 cd: jsr r5,set.d jsr r5,newline jsr r5,delete mov addr1,dot cmp dot,dol blos 8f mov dol,dot br 8f ci: jsr r5,set.d jsr r5,newline ci1: sub $2,addr2 cmp addr2,zero blo 9f ci2: mov addr2,dot 1: jsr r5,append; rdline br 1b 8: jmp advanc 9: jmp error cp: jsr r5,set.d jsr r5,newline cp1: jsr r5,nonzero 1: mov addr1,r4 jsr r5,getline jsr r5,print; linebuf add $2,addr1 cmp addr1,addr2 blos 1b mov addr2,dot br 8b cq: jsr r5,setna jsr r5,newline cq1: jsr r5,terme sys exit ce: jsr r5,setna jsr r5,getc cmp r1,$' / bne 9b mov $fout+2,r0 1: clr (r0)+ cmp r0,brk bne 1b jsr r5,terme jsr r5,inite mov $' ,peekc mov pc,eflag cr: jsr r5,set. jsr r5,filnam cr1: sys open; filebuf; 0 bes 9b mov r0,f mov addr2,dot clr filec clr count 1: jsr r5,append; rdfile br 1b cs: jsr r5,set.d jsr r5,nonzero 1: jsr r5,getc cmp r1,$' beq 1b cmp r1,$'\n beq 9b mov r1,-(sp) jsr r5,compile mov $rhsbuf,r3 1: jsr r5,getc cmp r1,$'\\ bne 2f jsr r5,getc cmp r1,$'\n beq 9b bis $200,r1 2: movb r1,(r3)+ cmp r1,$'\n beq 9b cmp r1,(sp) bne 1b clrb -(r3) jsr r5,getc cmp r1,$'g bne 1f inc gsubf br 2f 1: clr gsubf mov r1,peekc 2: jsr r5,newline mov gflag,(sp) 1: mov addr1,r4 jsr r5,execute br 4f mov pc,(sp) jsr r5,dosub tst gsubf beq 2f 3: cmpb *loc2,$'\n beq 2f jsr r5,gexecute br 2f jsr r5,dosub br 3b 2: mov $subbuf,r0 mov *addr1,-(sp) jsr r5,putline mov (sp)+,r0 jsr r5,findka beq 4f mov *dot,(r1) 4: add $2,addr1 cmp addr1,addr2 blos 1b tst (sp)+ beq 9f br 8f 8: jmp advanc 9: jmp error cw: jsr r5,set1d jsr r5,nonzero jsr r5,filnam sys creat; filebuf; 666 bes 9b mov r0,f clr count mov $fbuf,filep 1: mov addr1,r4 jsr r5,getline mov $linebuf,r0 mov r0,r1 jsr r5,size add r4,count 2: movb (r1)+,r4 movb r4,*filep inc filep cmp filep,$efbuf blo 3f mov f,r0 sys write; fbuf; efbuf-fbuf bes 9b mov $fbuf,filep 3: cmp r4,$'\n bne 2b add $2,addr1 cmp addr1,addr2 blos 1b mov filep,r0 sub $fbuf,r0 beq 1f mov r0,0f mov f,r0 sys 0; 7f .data 7: sys write; fbuf; 0:.. .text bes 9b 1: mov f,r0 sys close tst nonum bne 8b jsr r5,printn br 8b ceq: jsr r5,set1d jsr r5,newline mov addr2,count sub zero,count asr count jsr r5,printn br 8b cex: jsr r5,setna sys fork br 1f bes 9b mov r0,-(sp) sys signal; 2; 1 / ignore intr 2: sys wait bes 2f cmp r0,(sp) bne 2b 2: tst (sp)+ tst intrflg beq 3f sys signal; 2; error / reinstate intr 3: jsr r5,print; qex br 8b 1: mov fin,r0 sys close mov fout,r0 sys close sys exec; 2f; 1f sys exit 1: 2f 0 2: .even 9: jmp error cnl: jsr r5,set.d tst adrflg bne 1f cmp dot,dol bhis 9b add $2,addr2 1: mov addr2,addr1 jmp cp1 cl: jsr r5,set.d jsr r5,newline jsr r5,nonzero 1: mov addr1,r4 jsr r5,getline jsr r5,cprint add $2,addr1 cmp addr1,addr2 blos 1b mov addr2,dot jmp 8f cprint: mov $linebuf,r3 1: mov $subbuf,r4 clr count 2: inc count cmp count,$50. blos 3f movb $'\\,(r4)+ movb $'\n,(r4)+ jsr r5,print; subbuf br 1b 3: movb (r3)+,r0 cmp r0,$33 bne 3f movb (r3)+,r0 cmp r0,$'\n beq 1f movb r0,(r4)+ movb $10,(r4)+ movb $'^,(r4)+ br 2b 3: cmp r0,$'\n beq 1f mov $estab,r1 3: cmpb r0,(r1)+ beq 3f tstb (r1)+ bne 3b cmpb r0,$040 bhis 0f movb $'\\,(r4)+ jsr pc,numb add $3,count br 2b 0: movb r0,(r4)+ br 2b 3: movb (r1),(r4)+ movb $10,(r4)+ movb $'-,(r4)+ br 2b 1: movb $'\n,(r4)+ jsr r5,print; subbuf rts r5 numb: mov r2,-(sp) mov r3,-(sp) mov r0,r3 mov $3,r0 jsr pc,numb1 mov (sp)+,r3 mov (sp)+,r2 rts pc numb1: clr r2 dvd $8.,r2 mov r3,-(sp) mov r2,r3 dec r0 beq 1f jsr pc,numb1 1: add $'0,(sp) movb (sp)+,(r4)+ rts pc estab: .byte 10,'\\ .byte 11,'> .byte 15,'< .byte 16,'O .byte 17,'I .byte 00,00 8: jmp advanc 9: jmp error cg: clr -(sp) br 1f cv: mov pc,-(sp) 1: jsr r5,set1d jsr r5,nonzero tst gflag bne 9b 1: jsr r5,getc cmp r1,$' / beq 1b cmp r1,$'\n beq 9b jsr r5,compile mov addr1,-(sp) mov zero,r4 1: tst (r4)+ cmp r4,dol bhi 1f bic $1,(r4) br 1b 1: mov (sp),r4 cmp r4,addr2 bhi 1f add $2,(sp) jsr r5,execute br 2f tst 2(sp) bne 1b mov (sp),r4 inc -(r4) br 1b 2: tst 2(sp) beq 1b mov (sp),r4 inc -(r4) br 1b 1: mov $gbuf,r4 cmp (sp)+,(sp)+ clr r3 1: jsr r5,getc cmp r1,$'\n bne 2f tst r3 beq 5f tstb -(r4) br 3f 2: cmp r1,$'\\ bne 3f inc r3 br 4f 3: clr r3 4: movb r1,(r4)+ cmp r4,$egbuf bhis 9f br 1b 5: movb r1,(r4)+ clrb (r4) inc gflag 8: jmp advanc 9: jmp error cm: jsr r5,set.d jsr r5,nonzero jsr r5,address br 9b jsr r5,newline cmp addr,addr1 blo 1f cmp addr,addr2 bhi 2f br 9b 1: mov addr,r1 tst (r1)+ mov addr2,addr mov addr1,r2 mov addr2,dot sub r2,dot add r1,dot 1: cmp r2,r1 beq 8b tst -(r2) br 3f 2: mov addr1,r1 mov addr2,r2 mov addr,dot 3: mov r2,r3 tst (r3)+ mov r3,r4 tst (r4)+ mov (r3),r0 4: mov -(r3),-(r4) cmp r3,r1 bhi 4b mov r0,(r3) tst (r1)+ tst (r2)+ cmp r2,addr blo 3b br 8b gclear: clr gflag mov $gbuf,gbufp dec gbufp clrb *gbufp rts r5 ck: jsr r5,set.d jsr r5,getc cmp r1,$040 blos 9b mov r1,r3 jsr r5,newline mov r3,r1 jsr r5,findk beq 1f mov kp,r2 add $2,kp cmp kp,$ekname blo 1f mov $kname,kp 1: mov r1,(r2) mov addr2,dot mov *addr2,[kaddr-kname](r2) bic $1,[kaddr-kname](r2) br 8b cn: jsr r5,setna jsr r5,newline mov $kname,r1 mov $linebuf,r0 1: movb (r1)+,(r0)+ beq 1f tstb (r1)+ br 1b 1: movb $'\n,-(r0) jsr r5,print; linebuf br 8f cf: jsr r5,setna jsr r5,getc cmp r1,$'\n beq 1f mov r1,peekc mov pc,eflag jsr r5,filnam 1: mov $filsav,r1 1: tstb (r1)+ bne 1b movb $'\n,-(r1) jsr r5,print; filsav clrb (r1) 8: jmp advanc /ct: / jsr r5,set.d / jsr r5,nonzero / jsr r5,address / br 4f / jsr r5,newline / cmp addr,addr1 / blo 1f / cmp addr,addr2 / bhi 2f /4: / jmp 9b /1: / mov $2,gork / br 3f /2: / clr gork /3: / mov addr1,r4 / jsr r5,append; getline / add $2,addr1 / cmp addr1,addr2 / bhi 8b / add gork,addr1 / add gork,addr2 / br 3b /.bss /gork: .=.+2 /.text      / / copyright 1972 bell telephone laboratories inc. / / ed2 -- text editor address: clr minflg clr addr ad1: jsr r5,switch; addrt tst minflg bne 9f tst addr beq 1f tst (r5)+ 1: rts r5 addrt: ' ; ad1 11; ad1 '+; ad1 '/; fsrch '?; bsrch '-; amin '.; adot '$; adol '0; num0 '1; num1 '2; num1 '3; num1 '4; num1 '5; num1 '6; num1 '7; num1 '8; num1 '9; num1 ''; amark '^; up1 0 adot: jsr r5,addrel; dot br ad1 adol: jsr r5,addrel; dol br ad1 up1: mov dot,r1 cmp r1,zero beq 9f tst -(r1) mov r1,f jsr r5,addrel; f br ad1 9: jmp error fsrch: jsr r5,compile mov dot,-(sp) 1: add $2,(sp) cmp (sp),dol blos 2f mov zero,(sp) 2: cmp (sp),zero beq 2f mov (sp),r4 jsr r5,execute br 2f br 3f 2: cmp (sp),dot bne 1b br 9b bsrch: jsr r5,compile mov dot,-(sp) 1: sub $2,(sp) cmp (sp),zero bhis 2f mov dol,(sp) 2: cmp (sp),zero beq 2f mov (sp),r4 jsr r5,execute br 2f br 3f 2: cmp (sp),dot bne 1b br 9b 3: mov (sp)+,f jsr r5,addrel; f br ad1 addrel: add minflg,addr bne 9b mov *(r5)+,addr rts r5 amin: tst minflg bne 9f inc minflg jmp ad1 num0: mov $8.,-(sp) br 1f num1: mov $10.,-(sp) 1: mov r1,peekc clr r3 1: jsr r5,getc cmp r1,$'0 blt 1f cmp r1,$'9 bgt 1f mpy (sp),r3 sub $'0,r1 add r1,r3 br 1b 1: mov r1,peekc tst addr bne 1f mov zero,addr 1: asl r3 tst minflg beq 1f clr minflg neg r3 1: add r3,addr jmp ad1 9: jmp error 8: jmp advanc amark: jsr r5,getc jsr r5,findk bne 9b mov [kaddr-kname](r2),r2 mov zero,r4 1: mov (r4)+,r3 bic $1,r3 cmp r2,r3 beq 2f cmp r4,dol blos 1b br 9b 2: tst -(r4) mov r4,f jsr r5,addrel; f jmp ad1 findk: clr -(sp) mov $kname,r2 1: tst (r2) beq 2f cmp r1,(r2) beq 3f tst (r2)+ cmp r2,$ekname blos 1b clr r2 2: inc (sp) 3: tst (sp)+ rts r5 findka: mov $kaddr,r1 1: cmp (r1)+,r0 beq 2f cmp r1,$ekaddr blos 1b clr r1 rts r5 2: tst -(r1) rts r5 printn: mov r0,-(sp) mov r1,-(sp) clr r0 mov count,r1 mov $linebuf,r3 jsr r5,1f movb $'\n,(r3)+ jsr r5,print; linebuf mov (sp)+,r1 mov (sp)+,r0 rts r5 1: clr r0 dvd $10.,r0 mov r1,-(sp) mov r0,r1 beq 1f jsr r5,1b 1: add $'0,(sp) movb (sp)+,(r3)+ rts r5 set.: tst adrflg bne testa br 1f set1d: tst adrflg bne testa mov zero,r4 cmp r4,dol bhis 9b tst (r4)+ mov r4,addr1 1: mov dol,addr2 rts r5 set.d: tst adrflg bne testa mov dot,r4 mov r4,addr1 mov r4,addr2 rts r5 testa: mov addr1,r4 cmp r4,addr2 bhi 9b jsr r5,1f mov addr2,r4 jsr r5,1f rts r5 1: cmp r4,zero blo 9f cmp r4,dol bhi 9f rts r5 nonzero: cmp addr1,zero blos 9f rts r5 setna: tst adrflg bne 9f rts r5 8: jmp advanc 9: jmp error newline: jsr r5,getc cmp r1,$'p bne 1f jsr r5,getc inc pflag 1: cmp r1,$'\n bne 9b rts r5 rdline: mov $linebuf,r4 1: jsr r5,getc movb r1,(r4)+ cmp r1,$'\n beq 1f cmp r4,$elinbuf blo 1b br 9b 1: cmp linebuf,$".\n beq 8b rts r5 append: cmp dol,$ebuffer-5 bhis 9b jsr r5,*(r5)+ mov dol,r4 tst (r4)+ mov r4,dol jsr r5,setbrk mov r4,r3 tst (r3)+ clr (r3) add $2,dot 1: mov -(r4),-(r3) cmp r4,dot bhi 1b mov $linebuf,r0 jsr r5,putline rts r5 putline: mov r0,r4 mov oblkp,r2 bit $1,r2 beq 2f jsr r5,1f 2: mov dska,r1 add r2,r1 mov r1,*dot 2: movb (r4)+,r1 clr r0 jsr r5,1f cmp r1,$'\n bne 2b mov r2,oblkp rts r5 1: movb r1,obuf(r2) inc r2 bit $777,r2 bne 2f mov fout,r0 sys 0;7f .data 7: sys seek; dska: 0; 0 .text mov fout,r0 sys write; obuf; 512. bes tmperr cmp dska,$65536.-512. bhis tmperr add $512.,dska clr r2 2: rts r5 tmperr: mov $1,r0 sys write; scream; 3 br 9f scream: ; .even getline: mov r3,-(sp) mov $linebuf,r1 mov (r4),r4 bic $1,r4 mov r4,r3 bic $777,r4 1: mov $ibuf,2f+2 bic $!777,r3 cmp r4,iblk beq 4f cmp r4,dska bne 3f mov $obuf,2f+2 br 4f 3: mov r4,iblk mov fin,r0 sys 0; 7f .data 7: sys seek; iblk: -1; 0 .text mov fin,r0 sys read; ibuf; 512. 4: jmp 2f .data 2: movb ibuf(r3),r0 jmp 7f .text 7: movb r0,(r1)+ cmp r0,$'\n beq 1f inc r3 bit $777,r3 bne 4b add $512.,r4 br 1b 1: mov (sp)+,r3 rts r5 9: jmp error filnam: mov $filebuf,r4 jsr r5,getc cmp r1,$'\n beq 2f cmp r1,$' / bne 9b 1: jsr r5,getc cmp r1,$' / beq 1b cmp r1,$'\n beq 2f movb r1,(r4)+ cmp r4,$filebuf+filsiz blo 1b br 9b 2: cmp r4,$filebuf beq 4f clrb (r4) tst eflag beq 3f clr eflag 1: mov $filebuf,r3 mov $filsav,r4 2: movb (r3)+,(r4)+ bne 2b 3: tstb filsav beq 1b rts r5 4: tstb filsav beq 9b mov $filsav,r3 mov $filebuf,r4 br 2b rdfile: mov $linebuf,r4 1: jsr r5,fchar movb r1,(r4)+ cmp r1,$'\n beq 1f cmp r4,$elinbuf blo 1b br 9b 1: rts r5 fchar: dec filec blt 1f movb *filep,r1 inc filep tst r1 beq fchar rts r5 1: mov f,r0 sys read; fbuf; efbuf-fbuf bes 9b add r0,count mov r0,filec beq 1f mov $fbuf,filep br fchar 1: mov f,r0 sys close tst nonum bne 0f jsr r5,printn 0: jmp advanc delete: jsr r5,nonzero mov addr1,r3 mov dol,r0 add r3,r0 mov addr2,r4 sub r4,r0 sub $2,r0 mov r0,dol tst (r4)+ 1: mov (r4)+,(r3)+ bne 1b jsr r5,setbrk rts r5 inite: movb $'a,qetmp+8 1: sys stat; qetmp; linebuf bec 2f sys creat; qetmp; 400 bec 1f 2: incb qetmp+8 cmpb qetmp+8,$'z blos 1b br e1 1: mov r0,fout sys open; qetmp; 0 bes e1 mov r0,fin mov $buffer,r0 mov r0,zero mov r0,dol mov r0,dot jsr r5,setbrk mov $-1,iblk mov $1,oblkp clr dska mov $kname,r0 mov r0,kp 1: clr (r0)+ cmp r0,$ekname blos 1b rts r5 e1: jsr r5,print; qbadf sys exit terme: mov fin,r0 sys close mov fout,r0 sys close sys unlink; qetmp rts r5 setbrk: mov dol,-(sp) add $516.,(sp) bic $777,(sp) cmp (sp),brk beq 1f mov (sp),brk sys 0; 7f .data 7: sys break; brk:.. .text 1: tst (sp)+ rts r5 / / copyright 1972 bell telephone laboratories inc. / / ed3 -- text editor compile: mov r1,compt mov r1,prect mov $exprbuf,r3 jsr r5,switch; prect jsr r5,cop; 2 br cadv .data prect: ..; ceof1 '^; cadv1 prect1: '*; cerr 0 .text cadv1: jsr r5,switch; prect1 / ^* case cadv: jsr r5,switch; compt jsr r5,cop; 4 jsr r5,getc movb r1,(r3)+ cmp r3,$eexprbuf blo cadv br cerr .data compt: ..; ceof '\\; cesc '\n; cerr '.; cdot '*; cast '$; cdol '[; cccl 0 .text ceof: clrb (r3)+ cmp r3,$eexprbuf-1 bhis cerr movb $1,(r3)+ rts r5 ceof1: tst (r3) beq cerr rts r5 cesc: jsr r5,cop; 4 jsr r5,getc cmp r1,$'\n beq cerr movb r1,(r3)+ cmp r3,$eexprbuf blo cadv cerr: clr exprbuf jmp 9b cdot: jsr r5,cop; 8. br cadv cdol: jsr r5,getc mov r1,peekc cmp r1,compt beq 1f jsr r5,cop; 4 movb $'$,(r3)+ cmp r3,$eexprbuf blo cadv br cerr 1: jsr r5,cop; 20. br cadv cccl: jsr r5,cop; 12. jsr r5,getc cmp r1,$'^ bne 1f movb *f,r1 add $4,r1 movb r1,*f jsr r5,getc 1: cmp r1,$'\n beq cerr movb r1,(r3)+ cmp r3,$eexprbuf-1 bhis cerr jsr r5,getc cmp r1,$'] bne 1b clrb (r3)+ br cadv cast: bisb $2,*f br cadv cop: mov r3,f movb (r5)+,(r3)+ cmp r3,$eexprbuf bhis cerr tstb (r5)+ rts r5 gexecute: cmpb exprbuf,$2 beq 1f rts r5 / ^ in global substitute 1: mov $linebuf,r3 mov $subbuf,r4 1: movb (r4)+,(r3) cmpb (r3)+,$'\n bne 1b mov loc2,r4 add $linebuf-subbuf,r4 mov r4,locs br 1f execute: jsr r5,getline mov $linebuf,r4 clr locs 1: mov r4,loc1 mov $exprbuf,r3 eadv: movb (r3)+,r1 jmp *1f(r1) 1: eeof ecmf echr echrs edot edots eccl eccls enccl enccls edol eeof: mov r4,loc2 eeof1: tst (r5)+ efail: rts r5 ecmf: mov r3,-(sp) mov r4,-(sp) jsr r5,eadv br 1f mov (sp)+,loc1 tst (sp)+ br eeof1 1: mov (sp)+,r4 mov (sp)+,r3 cmpb (r4)+,$'\n bne ecmf br efail echr: cmpb (r3)+,(r4)+ beq eadv br efail echrs: movb (r3)+,r1 mov r4,-(sp) 1: cmpb (r4)+,r1 beq 1b br east edot: cmpb (r4)+,$'\n bne eadv br efail edots: mov r4,-(sp) 1: cmpb (r4)+,$'\n bne 1b br east eccl: jsr r5,cclas; 0 br efail br eadv enccl: jsr r5,cclas; 1 br efail br eadv enccls: mov pc,0f br 1f eccls: clr 0f 1: mov r4,-(sp) mov r3,-(sp) jmp 2f .data 2: jsr r5,cclas; 0:0 br 1f mov (sp),r3 br 2b 1: tst (sp)+ jmp east .text edol: cmpb (r4),$'\n beq eadv br efail east: dec r4 mov r3,-(sp) mov r4,-(sp) jsr r5,eadv br 1f cmp r4,locs bne 2f mov r4,4(sp) br 1f 2: add $6,sp br eeof1 1: mov (sp)+,r4 mov (sp)+,r3 cmp r4,(sp) bhi east tst (sp)+ br efail cclas: movb (r4)+,r1 cmp r1,$'\n beq 2f 1: cmpb r1,(r3)+ beq 1f tstb (r3) bne 1b tst (r5)+ beq 3f 2: tst (r5)+ br 3f 1: tst (r5)+ beq 2b 3: tstb (r3)+ bne 3b rts r5 8: jmp advanc 9: jmp error dosub: mov $linebuf,r1 mov $subbuf,r2 mov $rhsbuf,r3 1: cmp r1,loc1 beq 1f movb (r1)+,(r2)+ br 1b 1: movb (r3)+,r0 beq 1f cmp r0,$'& bne 3f mov r1,r4 2: cmp r4,loc2 beq 1b movb (r4)+,(r2)+ cmp r2,$esubbuf blo 2b br 9b 3: bic $200,r0 movb r0,(r2)+ cmp r2,$esubbuf blo 1b br 9b 1: mov r4,r1 mov r2,loc2 1: movb (r1)+,r0 movb r0,(r2)+ cmp r0,$'\n beq 1f cmp r2,$esubbuf blo 1b br 9b 1: mov addr1,dot rts r5 switch: jsr r5,getc mov (r5)+,r4 1: tst (r4) beq 1f cmp r1,(r4)+ beq 2f tst (r4)+ br 1b 1: mov r1,peekc rts r5 2: mov (sp)+,r5 jmp *(r4) getc: mov peekc,r1 bne 1f tst gflag beq 2f movb *gbufp,r1 beq 8b inc gbufp br 1f 2: clr r0 sys read; ch; 1 bes 2f tst r0 beq 2f mov ch,r1 beq getc 1: clr peekc rts r5 2: jmp cq1 print: mov (r5),r0 jsr r5,size mov r4,0f mov (r5)+,0f-2 mov $1,r0 sys 0; 7f .data 7: sys write; ..; 0:.. .text rts r5 size: clr r4 1: inc r4 cmpb (r0)+,$'\n bne 1b rts r5 qex: qbadf: qerr: qed: prompt: <*> .data qetmp: .even peekc: 0 eflag: 0 gbufp: gbuf-1 kp: kname .bss intrflg:.=.+2 argc: .=.+2 nonum: .=.+2 ibuf: .=.+512. obuf: .=.+512. kname: .=.+20. ekname: .=.+2 nl: .=.+2 kaddr: .=.+20. ekaddr: .=.+2 oblkp: .=.+2 zero: .=.+2 dol: .=.+2 dot: .=.+2 gsp: .=.+2 shflg: .=.+2 exprbuf:.=.+128.; eexprbuf: fin: .=.+2 fout: .=.+2 ch: .=.+2 fch: .=.+2 pflag: .=.+2 gflag: .=.+2 addr: .=.+2 addr1: .=.+2 addr2: .=.+2 gsubf: .=.+2 loc1: .=.+2 loc2: .=.+2 locs: .=.+2 adrflg: .=.+2 f: .=.+2 minflg: .=.+2 count: .=.+2 filec: .=.+2 filep: .=.+2 linebuf:.=.+512.; elinbuf: fbuf:subbuf:.=.+512.; efbuf: esubbuf: rhsbuf: .=.+256.; erhsbuf: filsiz = 64. filebuf:.=.+filsiz filsav: .=.+filsiz+2 gz: .=.+2 gbuf: .=.+100.; egbuf: buffer: ebuffer = buffer+8004. !"#$%&'()/* exit -- end runcom */ main() { seek(0, 0, 2); } /* Fortran command */ char *tmp; char ts[1000]; char *tsp ts; char *av[50]; char *clist[50]; char *llist[50]; int instring; int pflag; int cflag; int *ibuf; int *ibuf1; int *ibuf2; int *obuf; char *lp; char *line; int lineno; int exfail; struct symtab { char name[8]; char *value; } *symtab; int symsiz 200; struct symtab *defloc; struct symtab *incloc; char *stringbuf; main(argc, argv) char *argv[]; { char *t; int nc, nl, i, j, c, nxo; int dexit(); i = nc = nl = nxo = 0; while(++i < argc) { if(*argv[i] == '-') switch (argv[i][1]) { default: goto passa; case 'p': pflag++; case 'c': cflag++; break; } else { passa: t = argv[i]; if(getsuf(t)=='f') { clist[nc++] = t; t = setsuf(copy(t), 'o'); } if (nodup(llist, t)) { llist[nl++] = t; if (getsuf(t)=='o') nxo++; } } } if(nc==0) goto nocom; if ((signal(2, 1) & 01) == 0) signal(2, &dexit); for (i=0; i1) printf("%s:\n", clist[i]); tmp = 0; av[0] = "fc1"; av[1] = expand(clist[i]); if (pflag || exfail) continue; if (av[1] == 0) { cflag++; continue; } av[2] = 0; t = callsys("/usr/fort/fc1", av); if(tmp) cunlink(tmp); if(t) { cflag++; continue; } av[0] = "as"; av[1] = "-"; av[2] = "f.tmp1"; av[3] = 0; callsys("/bin/as", av); t = setsuf(clist[i], 'o'); cunlink(t); if(link("a.out", t) || cunlink("a.out")) { printf("move failed: %s\n", t); cflag++; } } nocom: if (cflag==0 && nl!=0) { i = 0; av[0] = "ld"; av[1] = "-x"; av[2] = "/lib/fr0.o"; j = 3; while(ivalue = defloc->name; incloc = lookup("include", 1); incloc->value = incloc->name; stringbuf = sbf; line = ln; lineno = 0; tmp = setsuf(copy(file), 'i'); if (fcreat(tmp, obuf) < 0) { printf("Can't creat %s\n", tmp); dexit(); } while(getline()) { if (ibuf==ibuf2) putc(001, obuf); /*SOH: insert */ if (ln[0] != '#') for (lp=line; *lp!='\0'; lp++) putc(*lp, obuf); putc('\n', obuf); } fflush(obuf); close(obuf[0]); close(ibuf1[0]); return(tmp); } getline() { int c, sc, state; struct symtab *np; char *namep, *filname; if (ibuf==ibuf1) lineno++; lp = line; *lp = '\0'; state = 0; if ((c=getch()) == '#') state = 1; while (c!='\n' && c!='\0') { if ('a'<=c && c<='z' || 'A'<=c && c<='Z' || c=='_') { namep = lp; sch(c); while ('a'<=(c=getch()) && c<='z' ||'A'<=c && c<='Z' ||'0'<=c && c<='9' ||c=='_') sch(c); sch('\0'); lp--; np = lookup(namep, state); if (state==1) { if (np==defloc) state = 2; else if (np==incloc) state = 3; else { error("Undefined control"); while (c!='\n' && c!='\0') c = getch(); return(c); } } else if (state==2) { np->value = stringbuf; while ((c=getch())!='\n' && c!='\0') savch(c); savch('\0'); return(1); } continue; } else if ((sc=c)=='\'' || sc=='"') { sch(sc); filname = lp; instring++; while ((c=getch())!=sc && c!='\n' && c!='\0') { sch(c); if (c=='\\') sch(getch()); } instring = 0; if (state==3) { *lp = '\0'; while ((c=getch())!='\n' && c!='\0'); if (ibuf==ibuf2) error("Nested 'include'"); if (fopen(filname, ibuf2)<0) error("Missing file %s", filname); else ibuf = ibuf2; return(c); } } sch(c); c = getch(); } sch('\0'); if (state>1) error("Control syntax"); return(c); } error(s, x) { printf("%d: ", lineno); printf(s, x); putchar('\n'); exfail++; cflag++; } sch(c) { if (lp==line+194) error("Line overflow"); *lp++ = c; if (lp>line+195) lp = line+195; } savch(c) { *stringbuf++ = c; } getch() { static peekc; int c; if (peekc) { c = peekc; peekc = 0; return(c); } loop: if ((c=getc1())=='/' && !instring) { if ((peekc=getc1())!='*') return('/'); peekc = 0; for(;;) { c = getc1(); cloop: switch (c) { case '\0': return('\0'); case '*': if ((c=getc1())=='/') goto loop; goto cloop; case '\n': if (ibuf==ibuf1) { putc('\n', obuf); lineno++; } continue; } } } return(c); } getc1() { int c; if ((c = getc(ibuf)) < 0 && ibuf==ibuf2) { close(ibuf2[0]); ibuf = ibuf1; putc('\n', obuf); c = getc1(); } if (c<0) return(0); return(c); } lookup(namep, enterf) char *namep; { char *np, *snp; struct symtab *sp; int i, c; np = namep; i = 0; while (c = *np++) i =+ c; i =% symsiz; sp = &symtab[i]; while (sp->name[0]) { snp = sp; np = namep; while (*snp++ == *np) if (*np++ == '\0' || np==namep+8) { if (!enterf) subst(namep, sp); return(sp); } if (sp++ > &symtab[symsiz]) sp = symtab; } if (enterf) { for (i=0; i<8; i++) if (sp->name[i] = *namep) namep++; while (*namep) namep++; } return(sp); } subst(np, sp) char *np; struct symtab *sp; { char *vp; lp = np; if ((vp = sp->value) == 0) return; sch(' '); while (*vp) sch(*vp++); sch(' '); } getsuf(s) char s[]; { int c; char t, *os; c = 0; os = s; while(t = *s++) if (t=='/') c = 0; else c++; s =- 3; if (c<=14 && c>2 && *s++=='.') return(*s); return(0); } setsuf(s, ch) char s[]; { char *os; os = s; while(*s++); s[-2] = ch; return(os); } callsys(f, v) char f[], *v[]; { int t, status; if ((t=fork())==0) { execv(f, v); printf("Can't find %s\n", f); exit(1); } else if (t == -1) { printf("Try again\n"); return(1); } while(t!=wait(&status)); if ((t=(status&0377)) != 0 && t!=14) { if (t!=2) /* interrupt */ printf("Fatal error in %s\n", f); dexit(); } return((status>>8) & 0377); } copy(s) char s[]; { char *otsp; otsp = tsp; while(*tsp++ = *s++); return(otsp); } nodup(l, s) char **l, s[]; { char *t, *os, c; if (getsuf(s) != 'o') return(1); os = s; while(t = *l++) { s = os; while(c = *s++) if (c != *t++) break; if (*t++ == '\0') return(0); } return(1); } cunlink(f) char *f; { if (f==0) return(0); return(unlink(f)); } ,-./0123456789cdb.ccheck.cchmod.cchown.sclri.scmp.scomm.ccp.cdate.cdb1.sdb2.sdb3.sdb4.sdc1.sdc2.sdc3.sdc4.sdc5.sdd.cdf.cdiff1.cdiff2.sdsw.sdu.sdump.cecho.ced1.sed2.sed3.sexit.cfc.cfed1.ssignal = 48. testing = 0 / / command interpreter for form letter editor / / / command: sys signal; 2; inter jsr pc,initl mov sp,spi loop: mov spi,sp mov $buffer,r2 clr r4 clr iflag 1: jsr pc,tfiget cmpb $' ,r0 beq 1f cmpb $'\n,r0 bne 2f clrb (r2) br 4f 2: movb r0,(r2)+ br 1b 1: clrb (r2) mov $argc,r3 3: mov $arg,r2 2: jsr pc,tfiget cmpb $' ,r0 beq 1f cmpb $'\n,r0 beq 1f movb r0,(r2)+ br 2b 1: clrb (r2)+ inc r4 1: movb -(r2),sv cmp r2,$arg blos 1f movb -(r2),-(sp) movb sv,1(sp) cmp r2,$arg bhi 1b mov sp,(r3)+ br 2f 1: clrb -(sp) movb sv,1(sp) mov sp,(r3) add $1,(r3)+ 2: cmpb r0,$'\n bne 3b 1: mov -(r3),-(sp) cmp r3,$argc bhi 1b 4: mov r4,-(sp) 3: clr r0 mov $tabl,r4 2: mov (r4)+,r1 cmp r4,$tend bhi error add $2,r0 mov $buffer,r2 1: cmpb (r1)+,(r2)+ bne 2b tstb (r1) bne 1b tstb (r2) bne 2b sub $2,r0 add $jtable,r0 clr vflag clr qflag jmp *(r0) / error: mov $1,r0 sys write; err; 2 br loop / / tabl: c1; c2; c3; c4; c5; c6; c7; c8; tend: 0 c1: c2: c3: c4: c5: c6: c7: c8: err: endt: .even jtable: list; listf; ed; remove; rename; fin; q; memck; spi: .=.+2 sv: .=.+2 / / ed: mov (sp)+,r3 ble error econ: sys stat; ftemp; buffer bec 2f sys creat; ftemp; 666 mov r0,tmpw sys open; ftemp; 0 mov r0,tmpr br 1f 2: cmpb $'z,ftemp+9. bne 2f mov $1,r0 sys write; erm; 23. jmp loop 2: incb ftemp+9. br econ 1: mov (sp),r0 jsr pc,getspq bes 3f mov r0,r4 mov r2,r1 jsr pc,rewind mov $buffer,r2 1: jsr pc,getchar bes 1f movb r0,(r2)+ br 1b 1: movb $'\n,(r2)+ jsr pc,output mov r4,r1 jsr pc,rewind 2: mov $buffer,r2 1: jsr pc,getchar bes 1f movb r0,(r2)+ cmp r2,$bufend blo 1b mov tmpw,r0 sys write; buffer; 512. br 2b 1: sub $buffer,r2 beq 4f mov r2,0f mov tmpw,r0 sys write; buffer; 0:.. 4: tst iflag beq 1f mov tmpw,r0 sys close mov tmpr,r0 sys close sys unlink; ftemp jmp loop 1: mov tmpw,r0 sys close sys fork br 5f mov r1,-(sp) sys wait sys signal; 2; inter mov (sp)+,r1 mov a(r1),w(r1) 2: mov tmpr,r0 sys read; buffer; 512. tst r0 beq 2f add $buffer,r0 mov r0,bufend mov $buffer,r2 1: movb (r2)+,r0 jsr pc,putchar cmp r2,bufend blo 1b br 2b 2: mov tmpr,r0 sys close sys unlink; ftemp tst iflag beq 1f jmp loop 1: tst qflag bgt 1f tst (sp)+ dec r3 bgt 1f jmp loop 1: jmp econ jmp loop 3: mov (sp),r2 mov $2,r0 jsr pc,allocate 1: tstb (r2) beq 1f movb (r2)+,r0 jsr pc,putchar br 1b 1: mov r1,r0 mov asmem,r1 jsr pc,putword mov $2,r0 jsr pc,allocate mov r1,r0 mov asmem,r1 jsr pc,putword mov r0,r1 br 4b 5: mov $2,r0 1: sys close inc r0 cmp r0,$10. blo 1b sys exec; edd; eda sys exit eda: edd; ftemp; 0 edd: .even ftemp: erm: .even tmpw: .=.+2 tmpr: .=.+2 / / remove a 'file' from memory / remove: mov (sp)+,r3 bgt 5f mov $1,vflag mov asmem,r1 jsr pc,rewind mov r(r1),-(sp) 4: tst iflag beq 1f jmp loop 1: jsr pc,getword bes 4f mov r0,r2 jsr pc,ask bec 1f mov r(r1),(sp) br 4b 1: jsr pc,getword br 2f 5: mov (sp),r0 jsr pc,getspq bec 2f tst qflag blt 6f mov (sp),r1 jsr pc,nothere br 3f 2: mov r0,r1 jsr pc,release mov r2,r1 jsr pc,release jsr pc,rm 3: tst vflag bne 3f tst iflag beq 1f jmp loop 1: tst qflag bgt 5b 6: tst (sp)+ dec r3 bgt 5b jmp loop 3: mov asmem,r1 mov (sp),r(r1) br 4b 4: tst (sp)+ jmp loop / / rename a 'file' / rename: mov (sp)+,r3 bne 1f jmp error 1: sub $2,r3 blt 1f 5: mov (sp),r0 jsr pc,getsp bes 4f tst (sp)+ sub $4,r(r1) mov (sp),r0 mov r2,-(sp) mov r(r1),-(sp) jsr pc,getsp bes 3f mov r2,-(sp) mov r0,r1 jsr pc,release jsr pc,rm mov (sp)+,r0 mov (sp)+,r(r1) jsr pc,alterword mov (sp)+,r1 jsr pc,release br 5f 3: mov (sp)+,r(r1) mov (sp)+,r1 jsr pc,release mov $2,r0 jsr pc,allocate mov (sp)+,r2 2: movb (r2)+,r0 beq 2f jsr pc,putchar br 2b 2: mov r1,r0 mov asmem,r1 jsr pc,alterword 5: tst iflag beq 2f jmp loop 2: tst r3 beq 2f sub $2,r3 bge 5b 1: tst (sp)+ jmp error 2: jmp loop 4: mov (sp)+,r1 jsr pc,nothere tst (sp)+ br 5b / / list contents of asmem / list: mov $buffer,r2 movb $'\n,(r2)+ jsr pc,output mov (sp)+,r3 beq 1f mov $1,vflag 5: tst iflag beq 2f jmp loop 2: mov (sp),r0 jsr pc,getspq bes 4f mov r2,r1 br 3f 1: mov asmem,r1 jsr pc,fsfile sub $2,r(r1) 2: tst iflag bne 2f jsr pc,backword bes 2f mov r0,r1 3: jsr pc,getn movb $'\n,(r2)+ jsr pc,output tst vflag bne 1f mov asmem,r1 sub $2,r(r1) br 2b 1: tst qflag bgt 5b 4: tst (sp)+ dec r3 bgt 5b 2: mov $buffer,r2 movb $'\n,(r2)+ jsr pc,output jmp loop / / list a 'file / listf: mov (sp)+,r3 bgt 4f jmp error 4: mov (sp),r0 jsr pc,getspq bes 3f mov r0,r4 mov r2,r1 jsr pc,rewind mov $buffer,r2 movb $'\n,(r2)+ 1: jsr pc,getchar bes 1f movb r0,(r2)+ cmp r2,$bufend blo 1b jsr pc,output br 1b 1: mov r4,r1 jsr pc,rewind movb $':,(r2)+ cmp r2,$bufend blo 2f jsr pc,output 2: movb $'\n,(r2)+ 1: tst iflag beq 2f jmp loop 2: cmp r2,$bufend blo 2f jsr pc,output 2: jsr pc,getchar bes 1f movb r0,(r2)+ br 1b 1: jsr pc,output 3: tst qflag bgt 4b tst (sp)+ dec r3 bgt 4b mov $buffer,r2 movb $'\n,(r2)+ jsr pc,output jmp loop / fin: jsr pc,flush jsr pc,whead 4 q: jsr pc,flush jsr pc,whead sys exit memck: mov (sp)+,r3 2: ble 2f mov (sp)+,r1 cmpb (r1),$'p bne 1f bis $1,vflag br 3f 1: cmpb (r1),$'f bne 3f bis $2,vflag 3: dec r3 br 2b 2: clr freeh mov $freeb,r2 1: clr (r2)+ cmp r2,$freen blo 1b mov $headers,r2 2: cmp l(r2),$hsz beq 6f jsr pc,ck bec 1f cmp r2,asmem beq 1f mov asmem,r1 jsr pc,rewind clr r3 4: inc r3 jsr pc,getword bes 5f cmp r0,r2 bne 4b 6: inc freeh 1: cont: add $8.,r2 cmp r2,$headend-4 blo 2b mov asmem,r1 jsr pc,rewind 4: jsr pc,getword bes 4f tst r(r0) beq 2f mov r0,r2 jsr pc,ck bes 4b 2: sub $hblk,r0 jsr r5,oct mov $1,r0 sys write; re; 24. cmp vflag,$1 beq 4b bit $1,r3 beq 2f jsr pc,getword mov r0,r1 jsr pc,release br 3f 2: jsr pc,backword add $4,r(r1) mov r0,r1 jsr pc,release 3: jsr pc,rm clr r3 br 4b 4: mov freeh,r0 jsr r5,decml mov $1,r0 sys write; frh; 14. mov $freeb,r2 mov $1,r3 6: cmp r2,$freen bhis 6f mov (r2)+,r0 beq 3f jsr r5,decml mov $1,r0 sys write; frb; 18. mov r3,r0 jsr r5,decml mov $1,r0 sys write; lf; 1. 3: asl r3 br 6b 6: mov $1,r0 sys write; lf; 1. jmp loop 5: mov r2,r0 sub $hblk,r0 jsr r5,oct mov $1,r0 sys write; un; 26. tst vflag beq 1b mov r2,r1 cmp vflag,$2 beq 3f jsr pc,rewind mov $buffer,r2 2: jsr pc,getchar bes 2f movb r0,(r2)+ cmp r2,$buffer+80. blo 2b jsr pc,output br 2b 2: movb $'\n,(r2)+ jsr pc,output mov r1,r2 cmp vflag,$1 bne 3f jmp cont 3: jsr pc,release jmp cont / interrupt: 4 / un: < header not accounted for\n> re: < part of asmem released\n> lf: <\n> frh: < free headers\n > frb: < free blocks size > endc: .even ?@ABCDEFGHIJrti = 2 .globl rm .globl ck .globl loop .globl oct .globl argc .globl arg .globl tfiget .globl asmem .globl qflag .globl vflag .globl getspq .globl q .globl ask .globl getword .globl r .globl w .globl output .globl buffer .globl bufend .globl fv .globl getsp .globl release .globl nothere .globl getn .globl getchar .globl rewind .globl iflag .globl inter / output buffer / r2 = last char in buffer + 1 / r2 returned at beginning of buffer / output: sub $buffer,r2 blos 1f mov r2,0f mov $1,r0 sys write; buffer; 0:.. mov $buffer,r2 1: rts pc / / / routine to find the string pointed to by r0 / in either memory or curly / r1 = where to look / / returns error set if string not there / returns r1 = header of string if there getsp: mov r0,-(sp) mov asmem,r1 jsr pc,rewind /memory 3: jsr pc,getword bes 1f mov r0,r1 jsr pc,rewind mov (sp),r2 2: jsr pc,getchar bes 2f tstb (r2) beq 4f cmpb r0,(r2)+ beq 2b 4: mov asmem,r1 add $2,r(r1) br 3b 2: tstb (r2) bne 4b mov r1,r2 mov asmem,r1 jsr pc,getword tst (sp)+ rts pc 1: mov (sp)+,r0 sec rts pc / / finds header of string with name same as that pointed to by r0 / taking into account ? and * getspq: mov r0,-(sp) mov asmem,r1 tst qflag bgt 1f jsr pc,rewind 1: jsr pc,getword bes 1f mov r0,r1 jsr pc,rewind mov (sp),r2 2: cmpb (r2),$'* bne 3f clr strflg mov $2,qflag inc r2 tstb (r2) beq 6f mov r2,ch 3: jsr pc,getchar bes 2f tstb (r2) bne 3f cmp $2,qflag bne 4f mov ch,r2 3: cmpb (r2),$'? bne 3f inc r2 tst qflag bne 2b mov $1,qflag br 2b 3: cmpb r0,(r2)+ bne 5f inc strflg br 2b 5: cmp $2,qflag bne 4f tst strflg bne 4f dec r2 br 2b 4: mov asmem,r1 add $2,r(r1) br 1b 2: tstb (r2) bne 4b 6: mov r1,r2 mov asmem,r1 jsr pc,getword tst (sp)+ rts pc 1: mov $-1.,qflag mov (sp)+,r0 sec rts pc / / tfiget / jsr r5,tfiget / tfiget: clr r0 sys read; ch; 1 bes 1f tst iflag beq 9f; jmp loop; 9: tst r0 beq 1f movb ch,r0 rts pc 1: jmp q / / routine to print file name and error message / r2 = next free byte in buffer / nothere: mov $buffer,r2 1: tstb (r1) beq 1f movb (r1)+,(r2)+ br 1b 1: sub $buffer,r2 mov r2,0f mov $1,r0 sys write; buffer; 0:.. mov $1,r0 sys write; err4; 16. rts pc / / / routine to put characters from string in buffer / r1 = header of string / on return r2 = next free byte in buffer / getn: mov $buffer,r2 jsr pc,rewind 1: jsr pc,getchar bes 1f movb r0,(r2)+ cmp r2,$bufend bhis 1f br 1b 1: rts pc / ask: mov r2,-(sp) mov r0,r1 jsr pc,getn movb $' ,(r2)+ jsr pc,output jsr pc,tfiget cmpb $'\n,r0 bne 1f 2: mov asmem,r1 add $2,r(r1) mov (sp)+,r2 sec rts pc 1: cmpb r0,$'y beq 4f cmpb r0,$'q beq 3f 1: tst iflag bne 2b jsr pc,tfiget cmpb $'\n,r0 bne 1b br 2b 4: tst iflag bne 2b jsr pc,tfiget cmpb $'\n,r0 bne 1b mov asmem,r1 mov (sp)+,r2 clc rts pc 3: tst iflag bne 2b jsr pc,tfiget cmpb $'\n,r0 bne 1b mov (sp)+,r2 jmp loop inter: inc iflag rti / to remove an entry from asmem - r points to name ptr / rm: mov r3,-(sp) mov asmem,r1 mov r(r1),r3 sub $4,r(r1) mov r(r1),r2 mov r2,-(sp) 1: mov r3,r(r1) jsr pc,getword bes 1f mov r(r1),r3 mov r2,r(r1) jsr pc,alterword mov r(r1),r2 br 1b 1: mov r2,w(r1) mov (sp)+,r(r1) mov (sp)+,r3 rts pc / / check that header pointed to by r2 released / ck: mov r2,-(sp) mov l(r2),r0 sub a(r2),r0 sub $hblk,r2 jsr pc,log2 asl r0 mov r0,ch mov frlist(r0),r0 1: beq 1f cmp r2,r0 beq 2f add $hblk,r0 mov (r0),r0 br 1b 2: mov ch,r0 inc freeb(r0) mov (sp)+,r2 rts pc 1: mov (sp)+,r2 sec rts pc oct: mov r1,-(sp) mov r0,r1 clr r0 div $8.,r0 mov r1,-(sp) add $'0,(sp) tst r0 beq 1f jsr r5,oct 1: movb (sp)+,ch mov $1,r0 sys write; ch; 1 mov (sp)+,r1 rts r5 decml: mov r1,-(sp) mov r0,r1 clr r0 div $10.,r0 mov r1,-(sp) add $'0,(sp) tst r0 beq 1f jsr r5,decml 1: movb (sp)+,ch mov $1,r0 sys write; ch; 1 mov (sp)+,r1 rts r5 / / iflag: 0 qflag: 0 vflag: 0 .data err4: < not in memory.\n> err1: end1: .even .bss freeh: .=.+2 freeb: .=.+32. freen: ch: .=.+2 strflg: .=.+2 buffer: .=.+512. bufend: .=.+2 argc = buffer + 20. arg = buffer + 256. fv: .=.+2 .text LMNOPQRST/* find -- find files in a pathname. Use of find is documented in /usr/man/man1/find.1 . In addition, find has a secret first arg "+" which causes each file name to be printed along with a period if the predicates succeed. */ int randlast; char *pathname; int verbose; struct anode { int (*F)(); struct anode *L, *R; } node[100]; int nn; /* number of nodes */ char *fname, *path; int now[2]; int ap, ac; char **av; struct ibuf { int idev; int inum; int iflags; char inl; char iuid; char igid; char isize0; int isize; int iaddr[8]; int iatime[2]; int imtime[2]; } statb; main(argc,argv) char *argv[]; { struct anode *exlist; int find(); time(&now); ac = argc; av = argv; ap = 2; pathname = argv[1]; if(compstr(argv[1],"+")==0) { verbose++; ap++; pathname = argv[2]; } else verbose = 0; argv[argc] = 0; if(argc<3) { printf("Insufficient args\n"); exit(9); } if(!(exlist = exp())) { /* parse and compile the arguments */ printf("Odd usage\n"); exit(9); } if(ap\n",b); exit(9); } return(mk(&user,i,s)); } else if(compstr(a,"-print")==0) { --ap; return(mk(&print,0,0)); } else if(compstr(a,"-group")==0) return(mk(&group,(i=atof(b)),s)); else if(compstr(a,"-size")==0) return(mk(&size,(i = atof(b)),s)); else if(compstr(a,"-links")==0) return(mk(&links,(i=atof(b)),s)); else if(compstr(a,"-perm")==0) { for(; *b ; ++b) { if(*b=='-') continue; i =<< 3; i = i + (*b - '0'); } return(mk(&perm,i & 03777,s)); } else if (compstr(a,"-exec")==0) { i = ap - 1; while(compstr(nxtarg(),";")!=0); return(mk(&exeq,i,0)); } else if (compstr(a,"-ok")==0) { i = ap - 1; while(compstr(nxtarg(),";")!=0); return(mk(&ok,i,0)); } err: printf("Error <%s / %s>\n",a,b); exit(9); } struct anode *mk(f,l,r) struct anode *l,*r; { /*make an expression node*/ node[nn].F = f; node[nn].L = l; node[nn].R = r; return(&(node[nn++])); } nxtarg() { /* get next arg from command line */ if(ap>ac) return(0 * ap++); return(av[ap++]); } find(exlist,fullname) /* execute predicat list with current file */ struct anode *exlist; char *fullname; { register int i; path = fullname; if(verbose) printf("%s",path); for(i=0;fullname[i];++i) if(fullname[i]=='/') fname = &fullname[i+1]; i = (*exlist->F)(exlist); if(verbose) if(i) printf(".\n"); else printf("\n"); } /* execution time functions */ and(p) struct anode *p; { return(((*p->L->F)(p->L)) && ((*p->R->F)(p->R))?1:0); } or(p) struct anode *p; { return(((*p->L->F)(p->L)) || ((*p->R->F)(p->R))?1:0); } not(p) struct anode *p; { return( !((*p->L->F)(p->L))); } glob(p) struct { int f; char *pat; } *p; { return(gmatch(fname,p->pat)); } print() { printf("%s\n",path); return(1); } mtime(p) struct { int f, t, s; } *p; { return(scomp((now[0]-statb.imtime[0])*3/4,p->t,p->s)); } atime(p) struct { int f, t, s; } *p; { return(scomp((now[0]-statb.iatime[0])*3/4,p->t,p->s)); } user(p) struct { int f, u, s; } *p; { return(scomp(statb.iuid,p->u,p->s)); } group(p) struct { int f, u; } *p; { return(p->u == statb.igid); } links(p) struct { int f, link, s; } *p; { return(scomp(statb.inl,p->link,p->s)); } size(p) struct { int f, sz, s; } *p; { register int i; i = statb.isize0 << 7; i=| (statb.isize >> 9) & 0777; return(scomp(i,p->sz,p->s)); } perm(p) struct { int f, per, s; } *p; { int i; i = (p->s=='-') ? p->per : 03777; /* '-' means only arg bits */ return((statb.iflags & i) == p->per); } exeq(p) struct { int f, com; } *p; { return(doex(p->com)); } ok(p) struct { int f, com; } *p; { char c; int yes; yes = 0; printf("!%s! for <%s>? ",av[p->com],path); if((c=getchar())=='y') yes = 1; while(c!='\n') c = getchar(); if(yes) return(doex(p->com)); return(0); } /* support functions */ scomp(a,b,s) char s; { /* funny signed compare */ if(s == '+') return(a > b); if(s == '-') return(a < (b * -1)); return(a == b); } doex(com) { int ccode; int np, i, c; char *nargv[50], *ncom, *na; ccode = np = 0; while (na=av[com++]) { if(compstr(na,";")==0) break; if(compstr(na,"{}")==0) nargv[np++] = path; else nargv[np++] = na; } nargv[np] = 0; if (np==0) return(9); if(fork()) /*parent*/ wait(&ccode); else { /*child*/ execv(nargv[0], nargv, np); i = 0; ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; while(c=nargv[0][i]) { ncom[9+i++] = c; } ncom[9+i] = '\0'; execv(ncom+4, nargv, np); execv(ncom, nargv, np); exit(9); } return(ccode ? 0:1); } char fin[518]; getunum(s) char *s; { /* find username in /etc/passwd & return num. */ int i; char str[20], *sp, c; extern float atof(); i = -1; fin[0] = open("/etc/passwd",0); while(c = getchar()) { if(c=='\n') { sp = str; while((*sp = getchar()) != ':') if(! *sp++) goto RET; *sp = '\0'; if(compstr(str,s)==0) { while((c=getchar()) != ':') if(! c) goto RET; sp = str; while((*sp = getchar()) != ':') sp++; *sp = '\0'; i = atof(str); break; } } } RET: close(fin); fin[0] = 0; return(i); } compstr(s1,s2) char s1[], s2[]; { /* compare strings: */ register char *c1, *c2; c1 = s1; c2 = s2; while(*c1 == *c2) if(*c1++ == '\0') return(0); /* s1 == s2 */ else c2++; return(*c1 > *c2 ? 1 : -1); } int descend(name,goal,func,arg) int (*func)(); char *name, goal; { int dir /* open directory */, offset /* in directory */; int dsize, top; struct { int dinode; char dname[14]; } dentry[32]; register int i, j, k; char aname[128]; if(stat(name,&statb)<0) { printf("--bad status %s\n",name); return(0); } if((statb.iflags&060000)!=040000){ /*not a directory*/ if(goal=='f'||goal=='b') /* search goal for files */ (*func)(arg,name); return(1); } else if(goal=='d' || goal=='b') /* search goal is directories */ (*func)(arg,name); top = statb.isize; for(offset=0 ; offset < top ; offset =+ 512) { /* each block */ dsize = 512<(top-offset) ? 512 : (top-offset); if((dir=open(name,0))<0) { printf("--cannot open %s\n",name); return(0); } if(offset) seek(dir,offset,0); if(read(dir,&dentry,dsize)<0) { printf("--cannot read %s\n",name); return(0); } close(dir); for(i = 0; i < (dsize>>4); ++i) { /* each dir. entry */ if(dentry[i].dinode==0||dentry[i].dname[0]=='.') continue; if (dentry[i].dinode == -1) break; for(j=0;aname[j]=name[j];++j); if(aname[j-1]!='/') aname[j++] = '/'; for(k=0; (aname[j++]=dentry[i].dname[k]) && k<13; ++k); aname[j] = '\0'; if(descend(aname,goal,func,arg)==0) printf("--%s\n",name); } } return(1); } gmatch(s, p) /* string match as in glob */ char *s, *p; { if (*s=='.' && *p!='.') return(0); return(amatch(s, p)); } amatch(s, p) char *s, *p; { register int cc, scc, k; int c, lc; scc = *s; lc = 077777; switch (c = *p) { case '[': k = 0; while (cc = *++p) { switch (cc) { case ']': if (k) return(amatch(++s, ++p)); else return(0); case '-': k =| lc <= scc & scc <= (cc=p[1]); } if (scc==(lc=cc)) k++; } return(0); case '?': caseq: if(scc) return(amatch(++s, ++p)); return(0); case '*': return(umatch(s, ++p)); case 0: return(!scc); } if (c==scc) goto caseq; return(0); } umatch(s, p) char *s, *p; { if(*p==0) return(1); while(*s) if (amatch(s++,p)) return(1); return(0); } VWXYZ[\]^_`abcdefgsignal = 48. testing = 0 / form letter generator / command sequence / form proto arg1 arg2... / where proto is letter rfo: sys signal; 2; int mov $-1,buf mov (sp)+,r2 /arg count tst (sp)+ /skip first arg sub $2,r2 bge 2f mov $default,-(sp) 2: mov (sp)+,letter 1: sys stat; otfil; buf bec 2f sys creat; otfil; 666 bec cont 2: cmpb $'z,otfil+4 beq err3 incb otfil+4 br 1b err3: mov $1,r0 sys write; mes3; 24. sys exit mes3: otfil: default: .even cont: mov r0,rfo clr rfo+2 jsr pc,initl / set up argument list / mov $arg,r3 mov $10.,r0 jsr pc,allocate mov r1,(r3)+ 1: dec r2 blt 1f mov $10.,r0 jsr pc,allocate mov r1,(r3)+ mov (sp)+,r4 2: movb (r4)+,r0 beq 1b jsr pc,putchar br 2b 1: sys time ashc $-7,r0 div $675.,r0 mov $daytab,r2 sub $1461.,r0 1: sub (r2)+,r0 bge 1b add -(r2),r0 mov r0,-(sp) mov arg,r1 mov montab-daytab(r2),r2 1: movb (r2)+,r0 beq 1f jsr pc,putchar br 1b 1: movb $' ,r0 jsr pc,putchar clr r0 mov (sp),r1 inc r1 div $10.,r0 mov r1,(sp) mov arg,r1 tst r0 beq 1f add $'0,r0 jsr pc,putchar 1: mov (sp)+,r0 add $'0,r0 jsr pc,putchar jmp loop daytab: 31.; 28.; 31.; 30.; 31.; 30.; 31.; 31.; 30.; 31.; 30.; 999. montab: m1; m2; m3; m4; m5; m6; m7; m8; m9; m10; m11; m12 m1: m2: m3: m4: m5: m6: m7: m8: m9: m10: m11: m12: buf: .=.+34. .=rfo+516. loop: mov $10.,r0 jsr pc,allocate mov r1,opointer jsr pc,allocate mov r1,ipointer jsr pc,allocate mov r1,curly mov $10.,r0 jsr pc,allocate mov r1,scr mov letter,r3 movb $'\{,r0 jsr pc,putchar 1: movb (r3)+,r0 beq 1f jsr pc,putchar br 1b 1: movb $'\},r0 jsr pc,putchar clr switch tst iflag beq 1f mov $1,tflag jmp interrupt 1: jsr pc,scan movb $'\n,r0 jsr r5,putc jsr r5,flushb mov scr,r1 jsr pc,release jsr pc,relarg mov opointer,r1 jsr pc,release mov ipointer,r1 jsr pc,release jsr pc,relcurl jsr pc,flush jsr pc,whead .if testing 4 .endif sys exit / scan / r1 = pointer to input header / r0 = pointer to output header / switch = 0 real output / not 0 output to r0 scan: mov r0,-(sp) mov r1,-(sp) 1: mov (sp),r1 jsr pc,getchar bes 5f cmpb r0,$'\\ beq 3f cmpb r0,$'\[ beq 4f cmpb r0,$'\{ beq 4f cmpb r0,$'\] beq 1f cmpb r0,$'\} beq 7f cmpb r0,$'\n bne 6f jsr pc,lookchar bes 5f movb $'\n,r0 6: tst switch beq 2f mov 2(sp),r1 jsr pc,putchar br 1b 2: jsr r5,putc br 1b 3: jsr pc,getchar br 6b / have [ or { 4: mov r(r1),-(sp) jsr pc,getchar bes 1f cmpb r0,$'0 blt 4f cmpb r0,$'9 bgt 4f jsr pc,getchar cmpb r0,$'\] beq 3f cmpb r0,$'\} beq 3f 4: mov (sp)+,r(r1) mov 2(sp),r0 jsr pc,esub mov r1,(sp) mov r0,2(sp) br 1b / have arg 3: tst switch beq 2f mov opointer,r1 mov 4(sp),r0 jsr pc,putword mov 2(sp),r1 2: mov (sp)+,r(r1) jsr pc,getchar inc r(r1) /skip ] jsr pc,earg br 1b 5: tst argf bne 1f mov ipointer,r1 jsr pc,pop bes 1f mov r0,(sp) br 1b 7: inc curlyf 1: mov (sp)+,r1 mov (sp)+,r0 rts pc / esub / r1 = pointer to input string / esub: mov r1,-(sp) tst switch beq 1f mov opointer,r1 jsr pc,putword 1: tst iflag beq 1f mov $2,tflag jmp interrupt 1: inc switch mov $10.,r0 jsr pc,allocate mov r1,r0 mov opointer,r1 jsr pc,putword mov (sp)+,r1 jsr pc,scan tst iflag beq 1f mov $3,tflag jmp interrupt 1: mov r2,-(sp) mov r1,r0 mov ipointer,r1 jsr pc,putword mov opointer,r1 jsr pc,pop bec 9f; 4; 9: mov r0,-(sp) /last output mov asmem,r1 jsr pc,getsp bes 2f 5: clr curlyf mov (sp),r1 mov r0,r2 jsr pc,release 6: mov opointer,r1 jsr pc,pop bec 4f clr switch 4: mov r2,r1 jsr pc,rewind tst (sp)+ mov (sp)+,r2 rts pc / not in memory 2: mov curly,r1 jsr pc,getsp bes 2f br 5b 2: mov (sp),r1 jsr pc,rewind mov $'\[,r0 1: jsr r5,tfoput jsr pc,getchar bec 1b mov $'\],r0 jsr r5,tfoput mov $10.,r0 jsr pc,allocate mov r1,r2 mov (sp),r0 tst curlyf beq 1f clr curlyf mov curly,r1 jsr pc,addentry br 2f 1: mov asmem,r1 jsr pc,whead jsr pc,addentry 2: mov r2,r1 jsr pc,accept br 6b / / / earg / r0 = number in ascii / earg: tst iflag beq 1f mov $4,tflag jmp interrupt 1: mov r1,-(sp) inc argf sub $'0,r0 asl r0 mov arg(r0),r1 beq 5f 4: mov (sp),r0 mov r1,(sp) mov ipointer,r1 jsr pc,putword mov opointer,r1 jsr pc,pop bec 3f clr switch 3: mov (sp)+,r1 jsr pc,rewind jsr pc,scan mov r0,-(sp) mov ipointer,r1 jsr pc,pop bec 9f; 4; 9: mov r0,r1 clr argf clr curlyf mov (sp)+,r0 rts pc 5: mov r0,-(sp) mov $'\[,r0 jsr r5,tfoput mov (sp),r0 asr r0 add $'0,r0 jsr r5,tfoput mov $'\],r0 jsr r5,tfoput mov $10.,r0 jsr pc,allocate mov (sp)+,r0 mov r1,arg(r0) jsr pc,accept br 4b rti = 2 / accept / r1 = header of where to put it / accept: mov r0,-(sp) movb $':,r0 jsr r5,tfoput movb $' ,r0 jsr r5,tfoput 2: jsr r5,tfiget cmpb r0,$'\n beq 1f jsr pc,putchar br 2b 1: jsr pc,putchar jsr r5,tfiget cmpb r0,$'\n beq 1f jsr pc,putchar br 2b 1: mov (sp)+,r0 rts pc / / / routine to get the last word from the string / r1=header addr / pop: jsr pc,fsfile jsr pc,backword bes 1f sub $2,w(r1) 1: rts pc / / / routine to add an entry to assoc mem or curly / r1 = header / r0 = header of string name / r2 = header of string / addentry: jsr pc,putword mov r2,r0 jsr pc,putword rts pc / / / routine to find the string pointed to by r0 / in either memory or curly / r1 = where to look / / returns error set if string not there / returns r1 = header of string if there / getsp: mov r0,-(sp) mov r1,-(sp) jsr pc,rewind /memory 3: mov 2(sp),r1 jsr pc,rewind /output mov (sp),r1 jsr pc,getword bes 1f mov r0,r1 mov r0,-(sp) jsr pc,rewind /string 2: mov (sp),r1 jsr pc,getchar bes 2f movb r0,r2 mov 4(sp),r1 jsr pc,getchar bes 4f cmpb r0,r2 beq 2b 4: tst (sp)+ 4: mov (sp),r1 add $2,r(r1) br 3b 2: tst (sp)+ mov 2(sp),r1 cmp r(r1),w(r1) bne 4b mov (sp)+,r1 jsr pc,getword tst (sp)+ rts pc 1: mov (sp)+,r1 mov (sp)+,r0 sec rts pc / / / tfoput / / jsr r5,tfoput / tfoput: mov r0,ch mov $1,r0 sys write; ch; 1 rts r5 / / / tfiget / / jsr r5,tfiget / tfiget: clr r0 sys read; ch; 1 bes 1f tst r0 beq 1f movb ch,r0 rts r5 1: jsr r5,flushb tst argf beq 1f mov opointer,r1 jsr pc,pop 1: mov $5,tflag jmp interrupt / / putc / jsr r5,putc / putc: mov r1,-(sp) mov r2,-(sp) mov $rfo+2,r1 mov r1,r2 add (r1),r2 movb r0,2(r2) inc (r1) cmp (r1),$512. bge 1f mov (sp)+,r2 mov (sp)+,r1 rts r5 1: mov (sp)+,r2 mov (sp)+,r1 / / / flush output buffer to output file. / flushb: mov r1,-(sp) mov r0,-(sp) mov $rfo,r1 mov (r1)+,r0 mov (r1),0f+2 beq 1f clr (r1)+ mov r1,0f sys write; 0:..;.. 1: mov (sp)+,r0 mov (sp)+,r1 rts r5 relarg: mov $arg,r2 1: mov (r2)+,r1 beq 2f jsr pc,release br 1b 2: cmp r2,$arge blt 1b rts pc / relcurl: mov curly,r1 jsr pc,rewind 1: jsr pc,getword bes 1f mov r0,r1 jsr pc,release mov curly,r1 br 1b 1: jsr pc,release rts pc / int: inc iflag rti / interrupt: jsr pc,relarg tst opointer beq 2f 1: mov opointer,r1 jsr pc,rewind 1: jsr pc,getword bes 1f mov r0,r1 jsr pc,release mov opointer,r1 br 1b 1: mov opointer,r1 jsr pc,release tst ipointer beq 2f mov ipointer,r1 jsr pc,release tst curly beq 2f jsr pc,relcurl tst scr beq 2f mov scr,r1 jsr pc,release 2: jsr pc,flush jsr pc,whead sys exit letter: .=.+2 arg: .=.+20. arge: 0 argf: .=.+2 switch: .=.+2 curly: .=.+2 curlyf: .=.+2 ch: .=.+2 opointer: .=.+2 ipointer: .=.+2 scr: .=.+2 iflag: 0 tflag: 0 end: .globl b1 .globl hblk .globl headers .globl initl .globl asmem .globl b1s .globl b1e .globl w1 .globl stats .globl lookchar .globl flush .globl fsfile .globl seekchar .globl backspace .globl alterchar .globl zero .globl getchar .globl putchar .globl copy .globl rewind .globl create .globl allocate .globl release .globl collect .globl w,r,a,l .globl getword .globl putword .globl backword .globl alterword / / / routine to read next character from string / pointer to by r1; character returned in r0 / c-bit set if character not availiable (eof) / / mov ...,r1 / jsr pc,getchar / movb r0,... / getchar: jsr pc,lookchar bes 1f inc r(r1) tst r0 /clears c-bit 1: rts pc / / / routine to read a string backwards / the read pointer is decremented before reading / / mov ...,r1 / jsr pc,backspace / mov r0,... / backspace: cmp a(r1),r(r1) bhis nochc dec r(r1) jsr pc,lookchar rts pc nochc: clr r0 sec rts pc / / / routine to put a word onto the string / / mov ...,r1 / mov ...,r0 / jsr pc,putword / putword: mov r0,-(sp) sub $hblk,r0 jsr pc,putchar swab r0 jsr pc,putchar mov (sp)+,r0 rts pc / / / routine to get a word from the string / / mov ...,r1 / jsr pc,getword / mov r0,... / getword: jsr pc,lookchar bes 1f movb r0,nchar inc r(r1) jsr pc,lookchar bes 1f movb r0,nchar+1 inc r(r1) mov nchar,r0 add $hblk,r0 1: rts pc / / / routine to alter the word pointed to by r(r1) / by replacing the word there with r0 / / mov wd,r0 / mov ...,r1 / jsr pc,alterword / alterword: mov r0,-(sp) sub $hblk,r0 jsr pc,alterchar swab r0 jsr pc,alterchar mov (sp)+,r0 rts pc / / / routine to get words backwards from string / / mov ...,r1 / jsr pc,backword / mov r0,... / backword: cmp a(r1),r(r1) bhis nochw dec r(r1) jsr pc,lookchar movb r0,nchar+1 cmp a(r1),r(r1) bhis nochw dec r(r1) jsr pc,lookchar movb r0,nchar mov nchar,r0 add $hblk,r0 rts pc / nochw: clr r0 sec rts pc / / / routine to copy the contents of one string / to another. / / mov source,r0 / mov dest,r1 / jsr pc,copy / mov r1,... / / on return, r1 points to the new string and should / be saved. r0 is preserved. / copy: inc stats+12. mov r0,-(sp) mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov w(r0),r2 sub a(r0),r2 /W-A (old) mov l(r1),r3 sub a(r1),r3 /L-A (new) cmp r2,r3 blos 1f mov r2,r0 jsr pc,allocate mov 4(sp),r0 /new jsr pc,swap jsr pc,release mov r0,r1 mov 0(sp),r0 /old 1: mov a(r1),w(r1) /rewind w pointer cmp r2,$512. blos copy1 /is a short string / jsr pc,flush jsr pc,reset / mov a(r0),-(sp) 4: mov (sp),0f mov afi,r0 sys seek;0:.. ;0 /set input pointer cmp r2,$512. blos 2f mov $512.,r3 /# output this time mov r3,0f mov r3,3f add r3,(sp) sub r3,r2 /# left to output br 1f 2: mov r2,0f mov r2,3f mov r2,r3 clr r2 1: mov afi,r0 sys read;b1;0:.. bes bad cmp r0,r3 bne bad mov afout,r0 mov (r1),0f add r3,(r1) sys seek;0:.. ;0 sys write;b1;3:.. bes bad tst r2 bgt 4b tst (sp)+ / / fix up read ptr of new string / copy2: mov 6(sp),r0 /restore r0 mov r(r0),r2 sub a(r0),r2 add a(r1),r2 mov r2,r(r1) / / restore and return / mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 mov (sp)+,r0 rts pc / bad: mov $1,r0 sys write;1f;2f-1f 4 1: 2: .even / swap: mov w(r1),-(sp) mov w(r0),w(r1) mov (sp),w(r0) mov r(r1),(sp) mov r(r0),r(r1) mov (sp),r(r0) mov a(r1),(sp) mov a(r0),a(r1) mov (sp),a(r0) mov l(r1),(sp) mov l(r0),l(r1) mov (sp)+,l(r0) rts pc / / copy a short string / copy1: mov r(r0),-(sp) mov a(r0),r(r0) mov nchar,-(sp) mov r0,r2 /old mov r1,r3 /new 1: mov r2,r1 jsr pc,getchar bes 1f mov r3,r1 jsr pc,putchar br 1b 1: mov r2,r0 mov (sp)+,nchar mov (sp)+,r(r0) mov r3,r1 br copy2 / / / / / / routine to rewind read pointer of string / pointed to by r1 / / mov ...,r1 / jsr pc,rewind / rewind: mov a(r1),r(r1) rts pc / / / routine to rewind write pointer of string / pointed to by r1 / / mov ...,r1 / jsr pc,create / create: mov a(r1),w(r1) mov a(r1),r(r1) rts pc / / / routine to zero a string / / mov ...,r1 / jsr pc,zero / zero: mov r0,-(sp) .if testing jsr pc,preposterous .endif mov a(r1),w(r1) clrb r0 1: cmp w(r1),l(r1) bhis 1f jsr pc,putchar br 1b 1: mov a(r1),w(r1) mov (sp)+,r0 rts pc / / / / routine to move the read pointer of a string to the / relative position indicated by r0. the string is / extended if necessary - there is no error return. / / mov position,r0 / mov ...,r1 / jsr pc,seekchar / seekchar: mov r1,-(sp) mov r0,-(sp) .if testing jsr pc,preposterous .endif inc stats+10. 1: mov (sp),r0 add a(r1),r0 cmp r0,l(r1) bhi 3f mov r0,r(r1) cmp r0,w(r1) blo 1f mov r0,w(r1) br 1f 3: mov (sp),r0 jsr pc,allocate mov 2(sp),r0 jsr pc,copy jsr pc,swap jsr pc,release mov 2(sp),r1 br 1b 1: mov (sp)+,r0 mov (sp)+,r1 rts pc / / / routine to move read pointer of string to end of string / / mov ...,r1 / jsr pc,fsfile / fsfile: mov r0,-(sp) .if testing jsr pc,preposterous .endif inc stats+10. mov w(r1),r(r1) mov (sp)+,r0 rts pc / / / routine to place the character in r0 at the current / position of the read pointer - the read pointer / is not moved. / / movb ch,r0 / mov ...,r1 / jsr pc,alterchar / mov r1,... / alterchar: mov r2,-(sp) mov r1,-(sp) mov r0,nchar .if testing jsr pc,preposterous .endif inc stats+8. 1: cmp r(r1),l(r1) /W,L blo 3f mov l(r1),r0 inc r0 sub a(r1),r0 /W-A+1 jsr pc,allocate mov (sp),r0 jsr pc,copy jsr pc,swap jsr pc,release mov (sp),r1 3: mov r(r1),r0 jsr pc,bufchar bec 2f jsr pc,getbuf 2: movb nchar,(r0) mov $1,w1(r2) mov nchar,r0 /to preserve r0 for user inc r(r1) cmp r(r1),w(r1) blos 3f mov r(r1),w(r1) 3: mov (sp)+,r1 mov (sp)+,r2 rts pc / / / routine to look at next character from string / pointed to by r1; character returned in r0 / c-bit set if character not available (end of file) / r1 is preserved / / mov ...,r1 / jsr pc,lookchar / movb r0,... / lookchar: mov r2,-(sp) inc stats+6. .if testing jsr pc,preposterous .endif cmp w(r1),r(r1) /W,R blos noch mov r(r1),r0 jsr pc,bufchar bec 2f jsr pc,getbuf / 2: inc flag bne 2f jsr pc,fixct br 1f 2: mov flag,u1(r2) 1: mov (sp)+,r2 movb (r0),r0 tst r0 /clears c-bit rts pc / noch: mov (sp)+,r2 clr r0 sec rts pc / / / routine to put a character into the string / pointed to by r1; character in r0 / r0 is preserved; r1 points to the string / after return and must be saved. / / movb ch,r0 / mov ...,r1 / jsr pc,putchar / mov r1,... / putchar: mov r2,-(sp) mov r1,-(sp) mov r0,nchar .if testing jsr pc,preposterous .endif inc stats+8. 1: cmp w(r1),l(r1) /W,L blo 3f mov w(r1),r0 inc r0 sub a(r1),r0 /W-A+1 jsr pc,allocate mov (sp),r0 jsr pc,copy jsr pc,swap jsr pc,release mov (sp),r1 3: mov w(r1),r0 jsr pc,bufchar bec 2f jsr pc,getbuf 2: movb nchar,(r0) mov $1,w1(r2) mov nchar,r0 /to preserve r0 for user inc w(r1) inc flag bne 2f jsr pc,fixct br 1f 2: mov flag,u1(r2) 1: mov (sp)+,r1 mov (sp)+,r2 rts pc / / / routine to flush contents of all buffers. / / jsr pc,flush / flush: mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) clr r3 1: cmp r3,$numb bhis 1f mov r3,r2 asl r2 tst w1(r2) ble 2f mov r3,r1 ashc $9.,r1 bic $777,r1 add $b1,r1 jsr pc,clean 2: inc r3 br 1b 1: mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 rts pc / / reset: mov r3,-(sp) mov r2,-(sp) clr r3 1: cmp r3,$numb bge 1f mov r3,r2 asl r2 mov $-1.,w1(r2) clr b1s(r2) clr b1e(r2) clr u1(r2) inc r3 br 1b 1: clr flag mov (sp)+,r2 mov (sp)+,r3 rts pc / / / routine to read from disc to a buffer / wcing the buffer if necessary / / mov disc addr,r0 / mov buffer addr,r2 / jsr pc,getb / / on return r0 = addr of byte in buffer / getb: mov r3,-(sp) mov r1,-(sp) mov r0,-(sp) mov r2,r3 asr r3 mov r3,r1 ashc $9.,r1 bic $777,r1 add $b1,r1 tst w1(r2) / w ble 1f jsr pc,clean 1: mov (sp),r0 bic $777,r0 /get lowest multiple of 512. mov r0,0f mov r0,b1s(r2) /set start mov afi,r0 sys seek;0:..;0 mov r1,0f sys read;0:..;512. mov b1s(r2),b1e(r2) add $512.,b1e(r2) / set end clr w1(r2) /clear w mov (sp)+,r0 sub b1s(r2),r0 add r1,r0 / set r0=byte addr in buffer mov (sp)+,r1 mov (sp)+,r3 rts pc / / / routine to wc a buffer / / mov buffer addr,r2 / mov buffer addr+6,r1 beginning of buffer / jsr pc,clean / clean: inc stats+24. mov r0,-(sp) mov b1s(r2),0f mov afout,r0 sys seek;0:..;0 mov r1,0f sys write;0:..;512. clr w1(r2) /clear w mov (sp)+,r0 rts pc / / / routine to get buffer addr of byte whose disc / addr is in r0 - also returns addr of write / flag for buffer in r2 / / mov disc addr,r0 / jsr pc,bufchar / mov (r0),r0 for read / inc (r2) for write must inc w / / c-bit set if char not in either buffer / bufchar: mov r1,-(sp) mov r3,-(sp) clr r3 1: mov r3,r2 asl r2 cmp r0,b1s(r2) blo 2f cmp r0,b1e(r2) bhis 2f sub b1s(r2),r0 mov r3,r1 ashc $9.,r1 bic $777,r1 add r1,r0 add $b1,r0 mov (sp)+,r3 mov (sp)+,r1 clc rts pc 2: inc r3 cmp r3,$numb blt 1b mov (sp)+,r3 mov (sp)+,r1 sec rts pc / / / routine to get a buffer / / mov disc addr,r0 / jsr pc,getbuf / mov (r0),r0 (for read) / inc (r2) must inc w for w / getbuf: mov r4,-(sp) mov r3,-(sp) mov $2,r3 clr r2 mov $1,r4 1: cmp r4,$numb bge 1f cmp u1(r3),u1(r2) bhis 2f mov r3,r2 2: inc r4 add $2.,r3 br 1b 1: mov r2,r3 jsr pc,getb add $stats+14.,r3 inc (r3) mov (sp)+,r3 mov (sp)+,r4 rts pc / / / this routine renumbers the time used cell u1(r2) / of the buffers when the clock overflows / fixct: mov r1,-(sp) mov r3,-(sp) mov $numb,r1 mov $numb,flag 2: mov r1,u1(r2) dec r1 bge 1f mov (sp)+,r3 mov (sp)+,r1 rts pc 1: clr r2 mov $2,r3 1: cmp r3,$numb2 bge 2b cmp u1(r3),u1(r2) blo 2f mov r3,r2 2: add $2,r3 br 1b z{|}~.globl b1 .globl log2 .globl frlist .globl stats .globl b1s .globl b1e .globl w1 / here to allocate a new block / / / mov ...,r0 / jsr pc,allocate / mov r1,... / / requested size in bytes in r0 / pointer to header of allocated block returned in r1 / r0 is preserved / / convert to words, adjust for header, round up / to a power of two / / each block has a four-word header / W - write ptr (also used as link ptr in frlist) / R - read ptr / A - pointer to head of data / L - ptr to (end+1) of data hsz=6144. datasz = 32768. numb=4. numb2=2*numb w=0 r=2 a=4 l=6 / allocate: clr garbage mov r0,-(sp) mov r2,-(sp) mov r3,-(sp) inc stats bne 9f; inc stats; 9: cmp r0,$datasz blo 9f; 4; 9: dec r0 bmi 1f jsr pc,log2 inc r0 1: asl r0 mov r0,-(sp) add $2,r0 cmp r0,$frend-frlist+2 blo zzz 4 / / look on free list for block of required size / zzz: mov (sp),r0 tst frlist(r0) beq xxx / / found it, allocate and return / mov frlist(r0),r1 add $hblk,r1 mov (r1),frlist(r0) mov a(r1),r0 mov r0,w(r1) /W mov r0,r(r1) /R tst (sp)+ mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r0 / jsr pc,whead rts pc / / no block of required size / look for larger block / xxx: tst hblk beq www tst (r0)+ cmp r0,$frend-frlist bhis www tst frlist(r0) bne yyy br xxx / / there are no larger blocks; must garbage collect / www: jsr pc,collect tst r0 bne zzz / / out of space / mov $1,r0 sys write; 1f; 2f-1f jmp interrupt 1: 2: .even / / split larger block into two smaller pieces and / link together as smaller blocks in the free list. / yyy: mov hblk,r3 /get free header block beq www /should never get this mov frlist(r0),r1 add $hblk,r1 mov w(r1),frlist(r0) mov r3,w(r1) add $hblk,r3 mov exp2-2(r0),r2 add a(r1),r2 mov w(r3),hblk mov l(r1),l(r3) mov r2,l(r1) /L mov r2,a(r3) clr w(r3) /W' mov r1,r2 sub $hblk,r2 mov r2,frlist-2(r0) br zzz / / / here to release a block / / mov ...,r1 / jsr pc,release / / pointer to block in r1 / release: / / discover that this is a plausible pointer / mov r0,-(sp) jsr pc,preposterous / / find free list index and link block to that entry / inc stats+2 mov frlist(r0),w(r1) clr r(r1) sub $hblk,r1 mov r1,frlist(r0) clr r1 /self-defense mov (sp)+,r0 rts pc / / / jsr pc,collect / / coalesce free storage by rejoining paired blocks / on the free list. / zero is returned in r0 if no paired blocks were found. / collect: mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov r4,-(sp) clr useful inc stats+4. clr r0 /start with smallest blocks /r0 contains frlist index loop1: mov $frlist,r1 add r0,r1 / / try next list member at this level / loop2: mov (r1),r3 beq advance /list is empty add $hblk,r3 tst (r3) /W beq advance /only one list element / / calculate address of buddy / mov a(r3),r4 sub $hsz,r4 mov exp2(r0),r2 xor r2,r4 1: add $hsz,r4 / / and search for him / loop3: cmp a(r3),r4 beq coal mov r3,r2 mov w(r3),r3 tst r3 beq nocoal add $hblk,r3 br loop3 / / have found a pair; remove both blocks from list, / coalesce them, and put them on next higher list / coal: mov $1,useful mov w(r3),w(r2) /remove him from list mov (r1),r2 add $hblk,r2 mov r3,r4 mov w(r2),w(r1) /remove other one cmp a(r2),a(r4) bhi 1f mov r2,-(sp) mov r4,r2 mov (sp)+,r4 1: mov hblk,(r2) clr r(r2) mov $hsz,a(r2) mov $hsz,l(r2) sub $hblk,r2 mov r2,hblk add exp2(r0),l(r4) /L clr r(r4) mov frlist+2(r0),w(r4) sub $hblk,r4 mov r4,frlist+2(r0) br loop2 / / no buddy found, try next block on this list / nocoal: mov (r1),r1 add $hblk,r1 br loop2 / / advance to next free list / advance: tst (r0)+ cmp r0,$frend-frlist blo loop1 mov useful,r0 / / do we have enough headers to continue? / tst garbage beq 1f mov $1,r0 sys write; 4f; 5f-4f 4 / 4: 5: .even / / / restore registers and return / 1: inc garbage mov (sp)+,r4 mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 rts pc / garbage:.=.+2 / / routine to find integer part of log2(x) / / jsr pc,log2 / / r0 = log2(r0) / log2: mov $15.,-(sp) tst r0 bne 1f clr (sp) br 2f 1: asl r0 bcs 2f dec (sp) br 1b 2: mov (sp)+,r0 rts pc / 0 exp2: 1;2;4;10;20;40;100;200;400;1000;2000;4000; 10000;20000;40000;100000 / / routine to discover whether r1 points to / a plausible header - to avoid ruination. / / r1 is preserved and r0 gets a suitable index for frlist / / jsr pc,preposterous / preposterous: cmp r1,$headers bhis 9f; 4; 9: cmp r1,$headend blo 9f; 4; 9: cmp a(r1),$hsz /A bhis 9f; 4; 9: cmp l(r1),$hsz+datasz /L blos 9f; 4; 9: mov l(r1),r0 /L sub a(r1),r0 /A mov r0,-(sp) jsr pc,log2 asl r0 cmp exp2(r0),(sp) beq 9f; 4; 9: add $2,r0 cmp r0,$frend-frlist+2 blo 9f; 4; 9: sub $2,r0 mov r0,(sp) mov frlist(r0),r0 1: beq 1f add $hblk,r0 cmp r0,r1 bne 9f; 4; 9: mov (r0),r0 br 1b 1: mov (sp)+,r0 rts pc / / / whead: inc stats+22. mov r0,-(sp) mov afout,r0 sys seek; 0; 0 sys write; hblk; hsz mov (sp)+,r0 rts pc / / initl: clr hblk mov r0,-(sp) mov r2,-(sp) sys open;almem; 1 /open for write bec 2f sys creat;almem; 666 bes err2 inc hblk 2: mov r0,afout sys open; almem; 0 /open for read bes err2 mov r0,afi br 1f / err2: mov $1,r0 sys write; 4f; 5f-4f 4 .data 4: 5: almem: .even .text / 1: tst hblk bgt 1f sys read; hblk; hsz /r0 already afi mov asmdisc,asmem add $hblk,asmem br 2f 1: mov $headers,r2 mov r2,r0 sub $hblk,r0 mov r0,hblk 1: add $8,r0 mov r0,(r2) add $8,r2 cmp r2,$headend-8. blo 1b clr -8(r2) mov $frlist,r0 1: clr (r0)+ cmp r0,$frend blo 1b mov hblk,r2 add $hblk,r2 mov (r2),hblk clr w(r2) mov $hsz,a(r2) mov $hsz+datasz,l(r2) mov $datasz,r0 jsr pc,log2 asl r0 cmp r0,$frend-frlist blo 9f; 4; 9: sub $hblk,r2 mov r2,frlist(r0) / / install plausible pointers to make octal dumps look nice / mov $hblk,r1 1: mov (r1),r1 tst r1 beq 1f add $hblk,r1 mov $hsz,a(r1) mov $hsz,l(r1) mov $hsz,r(r1) br 1b 1: mov afout,r0 sys write;hblk;hsz jsr pc,reset mov $4,r0 jsr pc,allocate mov r1,asmem mov r1,asmdisc sub $hblk,asmdisc 2: mov (sp)+,r2 mov (sp)+,r0 rts pc / / .bss / b1s: .=.+numb2 b1e: .=.+numb2 w1: .=.+numb2 u1: .=.+numb2 b1: .=. + [512.*numb] flag: .=.+2 stats: .=.+24. /alloc/release/collect/get/put/seek/copy useful: .=.+2 afi: .=.+2 afout: .=.+2 asmem: .=.+2 nchar: .=.+2 / / hblk: .=.+2 /must remain here - pointer to free header frlist: .=hblk+34. frend: asmdisc:.=.+2 headers: .=hblk+hsz headend: .text / getty -- get name and tty mode / for initialization / cycle through speeds and "login:" messages / summarized in itab stty = 31. gtty = 32. sys signal; 3; 1 sys signal; 2; 1 clr r0 sys gtty; name mov name+4,r0 bic $!26,r0 mov r0,flags / use xtab,cr,ucase from driver jsr r5,nextspeed 1: mov $name,r5 2: jsr r5,getc cmp r0,$'\n beq 1f cmp r0,$'\r beq 4f cmp r0,$'@ beq 1b cmp r0,$'# bne 3f cmp r5,$name blos 2b dec r5 br 2b 3: cmp r5,$name+30. bhis 2b movb r0,(r5)+ br 2b 4: bis $20,flags /cr bit mov $'\n,r0 jsr pc,putc br 2f 1: mov $'\r,r0 jsr pc,putc 2: clrb (r5)+ / determine whether terminal is upper-case only mov $name,r5 1: movb (r5)+,r0 beq 1f cmp r0,$'A blo 2f cmp r0,$'Z bhi 2f add $40,r0 / map to lc movb r0,-1(r5) br 1b 2: cmp r0,$'a blo 1b cmp r0,$'z bhi 1b bic $4,flags br 1b 1: mov fstate,r4 bis flags,4(r4) clr r0 sys 0; 9f .data 9: sys stty; fstate: .. .text go: sys exec; login; loginp sys exit getc: clr r0 sys read; ch; 1 bes done tst r0 beq done bic $!177,ch mov ch,r2 beq 1f getc1: cmp r2,$174 bhis 3f mov $1,r0 movb ch,r0 jsr pc,putc 3: mov r2,r0 rts r5 1: mov $name,(sp) jsr r5,nextspeed 2: clr r0 / flush nulls sys read; ch; 1 bes done tst r0 beq done movb ch,r2 beq 2b br getc1 done: sys exit nextspeed: mov itabp,r1 mov (r1)+,0f bne 1f mov $itab,itabp br nextspeed 1: clr r0 sys 0; 9f .data 9: sys stty; 0:.. .text bes go mov (r1)+,-(sp) mov (r1)+,fstate mov r1,itabp mov (sp)+,r1 1: movb (r1)+,r0 beq 1f jsr pc,putc br 1b 1: rts r5 putc: bic $!177,r0 movb r0,ch mov $1,r0 sys write; ch; 1 rts pc itabp: itab loginp: login name 0 itab: itn300; tnmes; tn300 itty37; ttymes; tty37 0 .data itty37: .byte 5, 5 0; 340 / any parity, raw tty37: .byte 5, 5 0; 210 / 37 parity, echo itn300: .byte 7, 7 0; 340 / any parity, raw, cr tn300: .byte 7, 7 0; 10310 / any parity, echo, no tab del ttymes: <\n\r\p:\alogin: \0> tnmes: <\n\r\p;login: \0> login: .even nl: <\n> cr: <\r> .bss flags: .=.+2 ch: .=.+2 name: .=.+32. /* global command -- glob params "*" in params matches r.e ".*" "?" in params matches r.e. "." "[...]" in params matches character class "[...a-z...]" in params matches a through z. perform command with argument list constructed as follows: if param does not contain "*", "[", or "?", use it as is if it does, find all files in current directory which match the param, sort them, and use them prepend the command name with "/bin" or "/usr/bin" as required. */ char ab[2000]; /* generated characters */ char *ava[200]; /* generated arguments */ char **av ava; char *string ab; int errno; main(argc, argv) char *argv[]; { int i, j, c; int inode, dirf, ap; int fb[8], sb[20]; char *cp, *cpo; if (argc < 3) { write(2, "Arg count\n", 10); return; } ap = 0; av++; fb[7] = 0; loop: cpo = cp = *++argv; while(c = *cp++) if (c=='*' || c=='?' || c=='[') goto compl; av[ap++] = copy(cpo); if (--argc>=2) goto loop; goto donow; compl: if(*--cp == '/') { *cp = '\0'; if((dirf=open(cp==cpo? "/" : cpo, 0))<0) goto oper; *cp++ = '/'; goto compl1; } if(cp != cpo) goto compl; if((dirf=open(".",0)) >= 0) goto compl1; oper: write(2, "No directory\n", 13); return; compl1: j = ap; l2: while (read(dirf, &inode, 2)>0) { read(dirf, fb, 14); if (inode==0) goto l2; if (match(fb, cp)) { c = *cp; *cp = '\0'; av[ap++] = cat(cpo, fb); *cp = c; } } close(dirf); i = j; while(i=2) goto loop; donow: if (ap<=1) { write(2, "No match\n", 9); return; } av[ap] = 0; strip(av); execv(av[0], av); if(errno == 7) goto toolong; i = cat("/bin/", av[0]); execv(i, av); if(errno == 7) goto toolong; i = cat("/usr", i); execv(i, av); if(errno == 2) goto per; *av = i; *--av = "/bin/sh"; execv(av[0], av); per: write(2, "Command not found\n", 18); return; toolong: write(2, "Arg list too long\n", 18); } match(s, p) char *s, *p; { if (*s=='.' && *p!='.') return(0); return(amatch(s, p)); } amatch(s, p) char *s, *p; { int c, cc, ok, lc, scc; scc = *s; lc = 077777; switch (c = *p) { case '[': ok = 0; while (cc = *++p) { switch (cc) { case ']': if (ok) return(amatch(++s, ++p)); else return(0); case '-': ok =| lc <= scc & scc <= (cc=p[1]); } if (scc==(lc=cc)) ok++; } return(0); case '?': caseq: if(scc) return(amatch(++s, ++p)); return(0); case '*': return(umatch(s, ++p)); case 0: return(!scc); } if (c==scc) goto caseq; return(0); } umatch(s, p) char *s, *p; { if(*p==0) return(1); while(*s) if (amatch(s++,p)) return(1); return(0); } compar(s1,s2) char *s1, *s2; { int c1,c2; loop: if ((c1 = *s1++)==0) return(0); if ((c2 = *s2++)==0) return(1); if (c1==c2) goto loop; return(c1>c2); } copy(s1) char *s1; { char *ts; ts = string; while(*string++ = *s1++); return(ts); } cat(s1, s2) char *s1, *s2; { char *ts; ts = string; while(*string++ = *s1++); string--; while(*string++ = *s2++); return(ts); } strip(v) char **v; { register char **p, *cp; for(p = v; cp = *p++;) while(*cp) *cp++ =& 0177; } int offset 0; main(argc, argv) char *argv[]; { extern fin; char line[64]; if (argc<2 || ttyn(0)!='x') { write(1, "goto error\n", 11); seek(0, 0, 2); return; } seek(0, 0, 0); fin = dup(0); loop: if (getlin(line)) { write(1, "label not found\n", 16); return; } if (compar(line, argv[1])) goto loop; seek(0, offset, 0); } getlin(s) char s[]; { int ch, i; i = 0; l: if ((ch=getc())=='\0') return(1); if (ch!=':') { while(ch!='\n' && ch!='\0') ch = getc(); goto l; } while ((ch=getc())==' '); while (ch!=' ' && ch!='\n' && ch!='\0') { s[i++] = ch; ch = getc(); } while(ch != '\n') ch = getc(); s[i] = '\0'; return(0); } compar(s1, s2) char s1[], s2[]; { int c, i; i = 0; l: if(s1[i] != s2[i]) return(1); if (s1[i++] == '\0') return(0); goto l; } getc() { offset++; return(getchar()); } / grep -- g/re/p / / grep [ -v ] [ -l ] [ -n ] re [ input ] ... .globl mesg, putc, flush, fcreat, _end sys signal; 2; 1 bit $1,r0 bne 1f sys signal; 2; out 1: mov (sp)+,narg mov sp,argp jsr pc,garg 1: jsr pc,garg cmpb (r5),$'- bne 1f cmpb 1(r5),$'v bne 2f inc vflg br 1b 2: cmpb 1(r5),$'c bne 2f inc lflg br 1b 2: cmpb 1(r5),$'b bne 2f inc bflg br 1b 2: cmpb 1(r5),$'n bne 2f inc nflg inc lflg br 1b 2: 1: jsr pc,compile mov $1,obuf tst narg ble loop jsr pc,iarg br loop out: inc nflg mov $2,obuf clr obuf+2 clr obuf+4 clr obuf+6 jsr pc,nline jsr pc,nline jsr pc,pfile mov line,r0 mov line+2,r1 jsr pc,decml jsr pc,nline jsr r5,flush; obuf sys exit loop: mov $lbuf,r1 mov $elbuf-1,r2 mov $'\n,r3 mov gc4,r4 mov gc5,r5 1: dec r4 bge 2f fread: mov gcf,r0 sys read; ibuf; 512. bes eloop inc blkno mov r0,r4 beq eloop mov $ibuf,r5 br 1b 2: movb (r5)+,r0 beq 1b cmp r0,r3 / nl beq 1f movb r0,(r1)+ cmp r1,r2 / elbuf blo 1b dec r1 br 1b 1: mov r5,gc5 mov r4,gc4 add $1,line+2 adc line clrb (r1)+ jsr r5,execute br 2f tst vflg bne loop br 1f 2: tst vflg beq loop 1: tst lflg beq 1f jsr pc,pfile mov line,r0 mov line+2,r1 jsr pc,decml mov $' ,r0 jsr r5,putc; obuf 1: tst bflg beq 1f jsr pc,pfile clr r0 mov blkno,r1 jsr pc,decml mov $' ,r0 jsr r5,putc; obuf 1: mov $lbuf,r1 1: movb (r1)+,r0 beq 1f jsr r5,putc; obuf br 1b 1: jsr pc,nline jsr r5,flush; obuf br loop eloop: jsr r5,flush; obuf tst narg ble 1f jsr pc,iarg br fread 1: sys exit iarg: mov r5,-(sp) mov gcf,r0 beq 1f sys close 1: jsr pc,garg mov r5,fname sys 0; 9f .data 9: sys open; fname: 0; 0 .text bec 1f mov fname,r0 jsr pc,diag mov $9f,r0 jsr pc,diag .data 9: <: cannot open\n\0> .even .text sys exit 1: mov r0,gcf tst nflg beq 1f clr line clr line+2 1: mov (sp)+,r5 rts pc garg: dec narg blt 1f mov *argp,r5 add $2,argp rts pc 1: mov $9f,r0 jsr pc,diag .data 9: .even .text sys exit compile: mov $ebuf,r3 movb (r5)+,r1 beq cerr cmp r1,$'^ beq 1f jsr r5,cop; ecmf dec r5 1: cmpb (r5),$'* beq cerr cadv: movb (r5)+,r1 beq ceof cmp r1,$'\\ beq cesc cmp r1,$'. beq cdot cmp r1,$'* beq cast cmp r1,$'$ beq cdol cmp r1,$'[ beq cccl jsr r5,cop; echr mov r1,(r3)+ br cadv ceof: jsr r5,cop; eeof cmp r3,$eebuf blos 1f mov $9f,r0 jsr pc,diag .data 9: .even .text sys exit 1: rts pc cesc: jsr r5,cop; echr movb (r5)+,r1 mov r1,(r3)+ bne cadv cerr: mov $9f,r0 jsr pc,diag .data 9: .even .text sys exit cdot: jsr r5,cop; edot br cadv cdol: tstb (r5) beq 1f jsr r5,cop; echr mov $'$,(r3)+ br cadv 1: jsr r5,cop; edol br cadv cccl: mov ctab,r0 add $32.,r0 mov r0,0f sys break; 0:.. jsr r5,cop; eccl movb (r5)+,r1 cmp r1,$'^ bne 1f mov $enccl,*f movb (r5)+,r1 1: tst r1 beq cerr jsr pc,bitc add ctab,r1 bisb r0,(r1) movb (r5)+,r1 cmp r1,$'] bne 1b mov ctab,(r3)+ mov 0b,ctab br cadv cast: mov *f,r1 mov -(r1),*f br cadv cop: mov r3,f mov (r5)+,(r3)+ rts r5 execute: mov $lbuf,r4 mov $ebuf,r3 jmp *(r3)+ eeof: tst (r5)+ efail: rts r5 ecmf: mov r3,-(sp) mov r4,-(sp) jsr r5,*(r3)+ br 1f cmp (sp)+,(sp)+ br eeof 1: mov (sp)+,r4 mov (sp)+,r3 tstb (r4)+ bne ecmf br efail echrs echr: movb (r4)+,r1 cmp r1,(r3)+ bne efail jmp *(r3)+ echrs echrs: mov (r3)+,r1 mov r4,-(sp) 1: cmpb (r4)+,r1 beq 1b br east edots edot: tstb (r4)+ beq efail jmp *(r3)+ edots edots: mov r4,-(sp) 1: tstb (r4)+ bne 1b br east eccls eccl: movb (r4)+,r1 beq efail jsr pc,bitc add (r3)+,r1 bitb r0,(r1) beq efail jmp *(r3)+ enccls enccl: movb (r4)+,r1 beq efail jsr pc,bitc add (r3)+,r1 bitb r0,(r1) bne efail jmp *(r3)+ eccls eccls: mov r4,-(sp) mov (r3)+,-(sp) 2: movb (r4)+,r1 beq 1f jsr pc,bitc add (sp),r1 bitb r0,(r1) bne 2b 1: tst (sp)+ br east enccls enccls: mov r4,-(sp) mov (r3)+,-(sp) 2: movb (r4)+,r1 beq 1f jsr pc,bitc add (sp),r1 bitb r0,(r1) beq 2b 1: tst (sp)+ br east edol: tstb (r4) bne efail jmp *(r3)+ east: dec r4 mov r3,-(sp) mov r4,-(sp) jsr r5,*(r3)+ br 1f 2: add $6,sp br eeof 1: mov (sp)+,r4 mov (sp)+,r3 cmp r4,(sp) bhi east tst (sp)+ br efail bitc: mov $1,r0 mov r1,-(sp) bic $!7,(sp) ash (sp)+,r0 ash $-3,r1 bic $!37,r1 rts pc nline: mov $'\n,r0 jsr r5,putc; obuf rts pc pfile: tst nflg beq 1f mov fname,r1 beq 1f 2: movb (r1)+,r0 beq 2f jsr r5,putc; obuf br 2b 2: mov $':,r0 jsr r5,putc; obuf 1: rts pc decml: div $10.,r0 mov r1,-(sp) mov r0,r1 beq 1f clr r0 jsr pc,decml 1: mov (sp)+,r0 add $'0,r0 jsr r5,putc; obuf rts pc diag: mov r1,-(sp) mov r0,r1 1: movb (r1)+,0f beq 1f mov $2,r0 sys write; 0f; 1 br 1b 1: mov (sp)+,r1 rts pc .data 0: 0 .text .data ctab: _end .bss narg: .=.+2 argp: .=.+2 vflg: .=.+2 lflg: .=.+2 nflg: .=.+2 bflg: .=.+2 blkno: .=.+2 line: .=.+4 f: .=.+2 ebuf: .=.+512.; eebuf: lbuf: .=.+512.; elbuf: gcf: .=.+2 gc4: .=.+2 gc5: .=.+2 ibuf: .=.+512. obuf: .=.+518. /* if command */ int ap; int ac; char **av; main(argc, argv) char *argv[]; { argv[argc] = 0; ac = argc; av = argv; ap = 1; if (argc<2) return; if (exp()) if(doex(0)) { write(1, "no command\n", 11); seek(0, 0, 2); } } char *nxtarg() { if (ap>ac) return(0*ap++); return(av[ap++]); } exp(s) { int p1; p1 = e1(); if (eq(nxtarg(), "-o")) return(p1 | exp()); ap--; return(p1); } e1() { int p1; p1 = e2(); if (eq(nxtarg(), "-a")) return (p1 & e1()); ap--; return(p1); } e2() { if (eq(nxtarg(), "!")) return(!e3()); ap--; return(e3()); } e3() { int p1, ccode; register char *a; ccode = 0; if ((a=nxtarg())==0) goto err; if(eq(a, "(")) { p1 = exp(); if(!eq(nxtarg(), ")")) goto err; return(p1); } if(eq(a, "-r")) return(tio(nxtarg(), 0)); if(eq(a, "-w")) return(tio(nxtarg(), 1)); if(eq(a, "-c")) return(tcreat(nxtarg())); if(eq(a, "{")) { /* execute a command for exit code */ if(fork()) /*parent*/ wait(&ccode); else { /*child*/ doex(1); goto err; } while((a=nxtarg()) && (!eq(a,"}"))); return(ccode? 0 : 1); } p1 = nxtarg(); if (p1==0) goto err; if(eq(p1, "=")) return(eq(a, nxtarg())); if(eq(p1, "!=")) return(!eq(a, nxtarg())); err: write(1, "if error\n", 9); exit(9); } tio(a, f) { a = open(a, f); if (a>=0) { close(a); return(1); } return(0); } tcreat(a) { return(1); } eq(a, b) char *a, *b; { register int i; i = 0; l: if(a[i] != b[i]) return(0); if(a[i++] == '\0') return(1); goto l; } doex(earg) { register int np, i, c; char *nargv[50], *ncom, *na; np = 0; while (na=nxtarg()) { if(earg && eq(na,"}")) break; nargv[np++] = na; } if(earg && (!eq(na, "}"))) return(9); nargv[np] = 0; if (np==0) return(earg); execv(nargv[0], nargv, np); i = 0; ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; while(c=nargv[0][i]) { ncom[9+i++] = c; } ncom[9+i] = '\0'; execv(ncom+4, nargv, np); execv(ncom, nargv, np); return(1); } #define tabsize 20 #define all p = &itab[0]; p < &itab[20]; p++ #define ever ;; #define ncom 1 #define single 0173030 #define reboot 0173040 char shell[] "/bin/sh"; char minus[] "-"; char runc[] "/etc/rc"; char init[] "/etc/init"; char ifile[] "/etc/ttys"; char utmp[] "/tmp/utmp"; char wtmpf[] "/usr/adm/wtmp"; char ctty[] "/dev/tty8"; char *com[ncom] { "/etc/getty", }; int fi; struct { int flag; int line; int comn; } line; struct tab { int pid; int line; int comn; } itab[tabsize]; struct { char name[8]; char tty; char fill; int time[2]; int wfill; } wtmp; main() { register i; register struct tab *p, *q; int reset(); /* * if not single user, * run shell sequence */ if(getcsw() != single) { i = fork(); if(i == 0) { execl(shell, shell, runc, 0); exit(); } while(wait() != i); close(creat(utmp, 0644)); if ((i = open(wtmpf, 1)) >= 0) { seek(i, 0, 2); wtmp.tty = '~'; time(wtmp.time); write(i, &wtmp, 16); close(i); } } /* * main loop for hangup signal * close all files and * check switches for magic values */ setexit(); signal(1, reset); for(i=0; i<10; i++) close(i); switch(getcsw()) { case single: error: termall(); i = fork(); if(i == 0) { open(ctty, 2); dup(0); execl(shell, minus, 0); exit(); } while(wait() != i); case reboot: termall(); execl(init, minus, 0); reset(); } /* * open and merge in init file */ fi = open(ifile, 0); q = &itab[0]; while(rline()) { if(line.flag == '0') continue; for(all) if(p->line==line.line || p->line==0) { if(p >= q) { i = p->pid; p->pid = q->pid; q->pid = i; p->line = q->line; p->comn = q->comn; q->line = line.line; q->comn = line.comn; q++; } break; } } close(fi); if(q == &itab[0]) goto error; for(; q < &itab[tabsize]; q++) term(q); for(all) if(p->line != 0 && p->pid == 0) dfork(p); for(ever) { i = wait(); for(all) if(p->pid == i) { rmut(p); dfork(p); } } } termall() { register struct tab *p; for(all) term(p); } term(ap) struct tab *ap; { register struct tab *p; p = ap; if(p->pid != 0) { rmut(p); kill(p->pid, 9); } p->pid = 0; p->line = 0; } rline() { static char c[4]; if(read(fi, c, 4) != 4 || c[3] != '\n') return(0); line.flag = c[0]; line.line = c[1]; line.comn = c[2] - '0'; if(line.comn<0 || line.comn>=ncom) line.comn = 0; return(1); } dfork(ap) struct tab *ap; { register i; register char *tty; register struct tab *p; p = ap; i = fork(); if(i == 0) { signal(1, 0); tty = "/dev/ttyx"; tty[8] = p->line; chown(tty, 0); chmod(tty, 0622); open(tty, 2); dup(0); execl(com[p->comn], minus, 0); exit(); } p->pid = i; } rmut(p) struct tab *p; { register i, f; static char zero[16]; f = open(utmp, 1); if(f >= 0) { i = p->line; if(i >= 'a') i =+ '0' + 10 - 'a'; seek(f, (i-'0')*16, 0); write(f, zero, 16); close(f); } f = open(wtmpf, 1); if (f >= 0) { wtmp.tty = p->line; time(wtmp.time); seek(f, 0, 2); write(f, &wtmp, 16); close(f); } } / kill process mov (sp)+,r4 tst (sp)+ loop: dec r4 ble done mov (sp)+,r5 clr r3 cmpb (r5),$'- bne 1f inc r5 clr signo 1: movb (r5)+,r0 beq 1f sub $'0,r0 cmp r0,$9 bhi error mul $10.,r3 add r0,r3 br 1b 1: tst signo bne 1f tst r3 ble error cmp r3,$12. bgt error mov r3,signo br loop 1: mov r3,r0 sys 37.; signo: 9. / kill bec loop mov r3,r0 jsr pc,decml mov $1,r0 sys write; m1; em1-m1 br loop error: mov $1,r0 sys write; m2; em2-m2 br loop done: sys exit decml: mov r0,r1 clr r0 div $10.,r0 mov r1,-(sp) tst r0 beq 1f jsr pc,decml 1: mov (sp)+,r0 add $'0,r0 mov r0,ch mov $1,r0 sys write; ch; 1 rts pc m1: <: not found\n> em1: m2: em2: .bss ch: .=.+2 / ld1 -- link editor orig: sys signal; 2; 1 ror r0 bcs 1f sys signal; 2; sintr 1: mov (sp)+,r0 dec r0 bgt 1f sys exit 1: mov r0,argc mov sp,argp 1: jsr r5,nxtarg br pass2 jsr r5,load1 br 1b pass2: sys creat; l.out; 666 bec 1f clr filnam jsr r5,mesg; outfile sys exit 1: mov r0,fout mov $symtab,r5 1: cmp r5,esymp bhis 1f cmp 10(r5),$40 / undefined? bne 2f tst 12(r5) / common? bne 2f jsr r0,issymbol; _end br 2f jsr r0,issymbol; _etext br 2f jsr r0,issymbol; _edata br 2f clr relflg / save relocation br 1f 2: add $14,r5 br 1b 1: mov txtsiz,r1 tst nflg beq 1f add $77,r1 / 0 mod 64 bic $77,r1 mov r1,txtsiz add $17777,r1 bic $17777,r1 1: mov datsiz,r2 mov r1,r3 add r2,r3 / bss origin clr r4 tst dcom bne 1f tst relflg beq 9f 1: mov $symtab,r5 1: cmp r5,esymp bhis 1f cmp 10(r5),$40 / undefined bne 2f mov 12(r5),r0 / common? beq 2f / no mov r4,12(r5) / common origin add r3,12(r5) inc r0 bic $1,r0 / even add r0,r4 / new common origin mov $47,10(r5) / temp. common type 2: add $14,r5 br 1b 1: add r4,bsssiz 9: mov $symtab,r5 1: cmp r5,esymp bhis 1f tst dcom bne 3f tst relflg beq 2f 3: cmp 10(r5),$40 / undefined bne 2f tst 12(r5) / common? bne 2f jsr r0,issymbol; _end br 3f br 4f 3: mov $44,10(r5) / bss type mov bsssiz,12(r5) / at end of bss sub r4,12(r5) / common compensation br 2f 4: jsr r0,issymbol; _etext br 3f br 4f 3: mov $42,10(r5) / text type mov txtsiz,12(r5) / at end of text 4: jsr r0,issymbol; _edata br 3f br 2f 3: mov $43,10(r5) / data type mov datsiz,12(r5) 2: cmp 10(r5),$43 blt 2f / undef, abs or text beq 3f cmp 10(r5),$47 / common bne 4f mov $44,10(r5) / set bss br 2f 4: add r2,12(r5) / bss add r4,12(r5) / common total 3: add r1,12(r5) / data 2: add $14,r5 br 1b 1: mov r1,fdatorg mov r3,fbssorg add r4,fbssorg mov symsiz,locsymsiz add esymp,symsiz sub $symtab,symsiz tst sqflg beq 1f clr symsiz 1: jsr r5,oattach; otxtp; zero add $20,oattpt jsr r5,oattach; odatp; txtsiz tst relflg / suppress relocation? bne 1f jsr r5,oattach; otrelp; datsiz jsr r5,oattach; odrelp; txtsiz 1: jsr r5,oattach; osymp; datsiz tst entptr beq 1f tst exorig beq 2f jsr r5,mesg; mulent / too many entry points 2: mov entptr,r0 mov 12(r0),exorig inc exorig / 0 entry means none 1: mov $7,-(sp) mov $magic,r1 / write magic at start tst sqflg beq 1f clr symsiz 1: mov (r1)+,r0 tst nflg beq 1f inc r0 / ro text segment 1: jsr r5,putwrd; otxtp 1: mov (r1)+,r0 jsr r5,putwrd; otxtp dec (sp) bne 1b tst (sp)+ clr txtsiz clr datsiz clr bsssiz clr *rlistp mov $rlist,rlistp 1: jsr r5,nxtarg2 br 1f jsr r5,load2 br 1b 1: jsr r5,flush; otxtp jsr r5,flush; odatp tst relflg bne 1f jsr r5,flush; otrelp jsr r5,flush; odrelp 1: mov $symtab,r1 1: cmp r1,esymp bhis 1f cmp 10(r1),$40 bne 2f tst 12(r1) / common? bne 2f mov r1,r0 clr filnam jsr r5,smesg; undmes 2: tst sqflg beq 3f add $14,r1 br 1b 3: mov $6,r2 2: mov (r1)+,r0 jsr r5,putwrd; osymp dec r2 bne 2b br 1b 1: jsr r5,flush; osymp done: sys unlink; a.out sys link; l.out; a.out bec 1f clr filnam jsr r5,mesg; movemes sys exit 1: sys unlink; l.out sys chmod; a.out; outmod: 777 sys exit sintr: sys unlink; l.out sys exit load1: mov txtsiz,txtorg mov datsiz,datorg sub ctxtsiz,datorg mov bsssiz,bssorg sub ctxtsiz,bssorg sub cdatsiz,bssorg mov $14,locsymsiz clr ndef mov r5,-(sp) mov esymp,-(sp) mov $local,r5 jsr r5,attach; txtp; csymorg 1: jsr r5,getsym bvs 1f cmp symbol+10,$40 bge 2f / external tst xtflg bne 1b add $14,locsymsiz / count locals br 1b 2: jsr r5,lookup mov (r4),r0 beq 2f / not yet in table cmp 10(r0),$40 bgt 1b / multiply defined cmp symbol+10,$42 / is text? bne 3f tst 12(r0) / is genuine common? bne 1b / yes, don't satisfy with text 3: inc ndef / remember def occurred cmp symbol+10,$40 bgt 3f dec ndef / forget def occurred cmp 12(r0),symbol+12 / extend common region? bge 1b br 3f 2: mov r4,(r5)+ jsr r5,enter cmp symbol+10,$40 ble 1b 3: jsr r5,relsym mov (r4),r0 mov symbol+10,10(r0) mov symbol+12,12(r0) br 1b 1: tst libflg / load anyway if not library beq 1f tst ndef / load library if any definitions bne 1f mov (sp)+,esymp / rip out symbols 2: cmp r5,$local / see if end of entered symbols blos 2f clr *-(r5) / rip out hash entry br 2b 1: tst (sp)+ tst entry beq 1f add txtorg,entry tst exorig beq 5f jsr r5,mesg; mulent 5: mov entry,exorig 1: add locsymsiz,symsiz / total of local symbs mov rlistp,r0 cmp r0,$rliste blo 1f jsr r5,mesg; toomany jmp done 1: mov reopened,r1 bne 1f mov *argp,r1 cmp r1,$libfil bne 1f movb wlib,r1 / library, just remember letter name 1: mov r1,(r0)+ mov libflg,(r0)+ / remember start of routine beq 3f / not library bis $1,reopened 3: mov r0,rlistp jsr r5,addin 2: mov (sp)+,r5 rts r5 load2: mov txtsiz,txtorg mov fdatorg,r0 add datsiz,r0 sub ctxtsiz,r0 mov r0,datorg mov fbssorg,r0 add bsssiz,r0 sub ctxtsiz,r0 sub cdatsiz,r0 mov r0,bssorg mov r5,-(sp) jsr r5,attach; txtp; csymorg mov $local,r5 mov $-1,-(sp) / local symbol index mov filnam,r1 2: tstb (r1)+ bne 2b 2: cmp r1,filnam blos 2f cmpb -(r1),$'/ bne 2b tstb (r1)+ 2: mov $symbol,r0 2: movb (r1)+,(r0)+ bne 3f tstb -(r1) 3: cmp r0,$symbol+8. blo 2b mov $37,symbol+10 mov txtorg,symbol+12 tst sqflg bne 1f jsr r5,wrlocsym 1: jsr r5,getsym bvs 1f jsr r5,relsym inc (sp) cmp symbol+10,$40 blo 5f jsr r5,lookup tst (r4) bne 6f jsr r5,mesg; snotfound br 1b 6: cmp symbol+10,$40 bgt 2f beq 4f 5: tst xtflg bne 1b / skip locals jsr r5,wrlocsym / write local symbol br 1b 2: mov (r4),r0 cmp 10(r0),symbol+10 bne 2f cmp 12(r0),symbol+12 beq 4f 2: jsr r5,smesg; multi 4: cmp r5,$elocal blo 3f jsr r5,mesg; locovflo jmp done 3: mov (sp),(r5)+ / save local index mov (r4),(r5)+ / save symbol location br 1b 1: mov r5,locp tst (sp)+ jsr r5,attach; txtp; ctxtorg jsr r5,attach; relp; ctrelorg mov txtsiz,relbas 1: jsr r5,txtlod br 1f tst relflg bne 2f jsr r5,putwrd; otrelp 2: mov r3,r0 jsr r5,putwrd; otxtp br 1b 1: jsr r5,attach; txtp; cdatorg jsr r5,attach; relp; cdrelorg mov datorg,r0 mov r0,relbas mov r5,locp mov (sp)+,r5 1: jsr r5,txtlod br 1f tst relflg bne 2f jsr r5,putwrd; odrelp 2: mov r3,r0 jsr r5,putwrd; odatp br 1b 1: jsr r5,addin rts r5 txtlod: jsr r5,getwrd; txtp bvs 1f tst (r5)+ mov r0,r3 jsr r5,getwrd; relp bvc 2f jsr r5,mesg; relerr sys exit 2: mov r0,r2 bic $1,r2 bic $!17,r0 cmp r0,$7 blos 3f / external symbol reference clc ror r2 asr r2 asr r2 asr r2 / get symbol number jsr r5,lookloc / get symbol cmp 10(r4),$40 bgt 2f / still undefined sub $symtab,r4 add locsymsiz,r4 mov r5,-(sp) mov r4,r5 clr r4 dvd $14,r4 als $4,r4 bis r4,r0 mov (sp)+,r5 br relrel 2: / symbol now defined add 12(r4),r3 / symbol value mov 10(r4),r2 sub $41,r2 bic $!1,r0 bne 4f tst r2 beq 5f / not relative & relocatable add dotdot,r3 br 5f 4: tst r2 bne 5f / relative & absolute sub dotdot,r3 5: asl r2 bis r2,r0 br relrel / absolute, text, data, or bss symbol 3: add *reltab(r2),r3 relrel: bit $1,r0 beq 1f sub relbas,r3 / relative relocation 1: rts r5 wrlocsym: mov $symbol,r1 mov $6,-(sp) 3: mov (r1)+,r0 jsr r5,putwrd; osymp / write out local symbol dec (sp) bne 3b tst (sp)+ rts r5 / ld2 -- link editor attach: mov (r5)+,r1 / buffer mov (r5)+,r2 / file origin, size mov (r2),0f / seek ptr mov fin,r0 sys seek; 0:..; 0 mov (r2),r0 bis $777,r0 inc r0 / start of next block add $10,r1 mov r1,-(sp) add $1000,(sp) / buf max mov r0,-(r1) / next seek ptr mov (sp),-(r1) sub (r2)+,r0 / left in buffer sub r0,(sp) / next buffer word mov (sp),-(r1) mov (sp)+,0f / buffer loc cmp (r2),r0 bge 1f mov (r2),r0 1: mov r0,0f+2 / number to read mov (r2),-(r1) / left in file jsr r5,rdchk; 0:..; .. rts r5 rdchk: mov (r5)+,0f mov (r5)+,0f+2 mov fin,r0 sys read; 0:..; .. bes 1f cmp r0,0b+2 bne 1f rts r5 1: jsr r5,mesg; premeof jmp sintr getwrd: mov (r5)+,r1 sub $2,(r1)+ / left in file bge 1f sev / end of file rts r5 1: mov (r1)+,r2 / word ptr cmp r2,(r1)+ / eob ptr bhis 1f / end of buffer mov (r2)+,r0 mov r2,-4(r1) rts r5 1: mov (r1),0f mov fin,r0 sys seek; 0:..; 0 add $1000,(r1)+ / new seek ptr mov r1,0f mov -10(r1),r0 / left in file add $2,r0 cmp r0,$1000 ble 1f mov $1000,r0 / read 1000 at most 1: mov r0,0f+2 jsr r5,rdchk; 0:..; .. mov (r1)+,r0 mov r1,-10(r1) / new next word rts r5 oattach: mov (r5)+,r1 mov (r5)+,r2 mov oattpt,r0 add (r2),r0 mov r0,oattpt mov r0,r2 bic $!777,r0 add r1,r0 add $6,r0 mov r0,(r1)+ / next slot mov r1,r0 add $1004,r0 mov r0,(r1)+ / buf max mov r2,(r1)+ / seek addr rts r5 putwrd: mov r1,-(sp) mov r2,-(sp) mov (r5)+,r2 mov (r2)+,r1 / slot cmp r1,(r2) / buf max bhis 1f mov r0,(r1)+ mov r1,-(r2) br 2f 1: tst (r2)+ mov r0,-(sp) jsr r5,flush1 mov (sp)+,*(r2)+ add $2,-(r2) 2: mov (sp)+,r2 mov (sp)+,r1 rts r5 flush: mov (r5)+,r2 cmp (r2)+,(r2)+ flush1: mov (r2)+,r1 mov r1,0f / seek address mov fout,r0 sys seek; 0:..; 0 bic $!777,r1 add r2,r1 / write address mov r1,0f mov r2,r0 bis $777,-(r2) inc (r2) / new seek addr cmp -(r2),-(r2) sub (r2),r1 neg r1 mov r1,0f+2 / count mov r0,(r2) / new next slot mov fout,r0 sys write; 0:..; .. rts r5 lookup: mov $symbol,r1 mov (r1)+,r0 add (r1)+,r0 add (r1)+,r0 add (r1)+,r0 mov r0,r1 clr r0 dvd $hshsiz,r0 mov r1,r4 asl r4 add $hshtab,r4 1: mov (r4)+,r0 beq 3f / not found mov $symbol,r1 cmp (r1)+,(r0)+ bne 2f cmp (r1)+,(r0)+ bne 2f cmp (r1)+,(r0)+ bne 2f cmp (r1)+,(r0)+ bne 2f 3: tst -(r4) rts r5 2: cmp r4,$2*hshsiz+hshtab blo 1b mov $hshtab,r4 br 1b enter: mov esymp,r0 add $14,r0 cmp r0,0f blo 1f add $500.,r0 mov r0,0f sys break; 0:symtab 1: mov esymp,r0 mov r0,(r4) mov $symbol,r1 mov $6,-(sp) 1: mov (r1)+,(r0)+ dec (sp) bne 1b mov r0,esymp tst (sp)+ rts r5 smesg: mov r1,-(sp) mov r0,-(sp) jsr pc,1f tst filnam beq 2f mov $1,r0 sys write; qsemi; 1 2: mov (sp)+,r1 mov $8.,-(sp) 3: movb (r1)+,ch beq 4f mov $1,r0 sys write; ch; 1 4: dec (sp) bne 3b tst (sp)+ mov (sp)+,r1 br 2f mesg: jsr pc,1f mov $1,r0 2: sys write; qnl; 1 rts r5 1: mov $666,outmod / make a.out nonexecutable mov r1,-(sp) mov (r5)+,r1 1: movb (r1)+,ch beq 1f mov $1,r0 sys write; ch; 1 br 1b 1: mov filnam,r1 beq 9f 1: movb (r1)+,ch beq 1f mov $1,r0 sys write; ch; 1 br 1b 1: 9: mov (sp)+,r1 rts pc getsym: mov $6,-(sp) mov $symbol,r4 1: jsr r5,getwrd; txtp bvs 2f mov r0,(r4)+ dec (sp) bne 1b tst (sp)+ rts r5 2: tst (sp)+ sev rts r5 nxtarg2: mov rlistp,r1 add $4,rlistp mov (r1)+,r0 beq 1f / end of args cmp r0,$177 / see if system library bhi 2f cmp r0,$1 / see if archive beq 3f movb r0,wlib mov $libfil,r0 2: jsr r5,aopen br nxtarg2 3: mov (r1),libflg beq 2f sub $20,(r1) mov (r1),0f mov fin,r0 sys seek; 0:..; 0 2: mov fin,r0 sys read; arcmag; 40 bes bform1 cmp r0,$20 blt bform1 mov $arcmag,r4 tst (r1)+ beq filstrt cmp r0,$40 bne bform1 br libstrt 1: rts r5 bform1: jmp bform nxtarg: add libnxt,libflg / see if library beq advarg / no mov libflg,0f mov fin,r0 sys seek; 0:..; 0 mov fin,r0 sys read; arcmag+2; 40 / get arc header, seg hdr mov $arcmag+2,r4 add $20,libflg cmp r0,$40 beq libstrt / not end of libr advarg: dec argc bge 1f rts r5 1: mov argp,r1 tst (r1)+ mov r1,argp cmpb *(r1),$'- bne opnarg jsr r5,specarg br advarg opnarg: clr libflg clr libnxt mov *argp,r0 clr reopened jsr r5,aopen br advarg mov fin,r0 sys read; arcmag; 42 / read arc header if any, file hdr bes bform mov r0,r3 mov $arcmag,r4 add r4,r3 cmp r3,$arcmag+20 blo bform cmp (r4),arcmagic bne filstrt cmp r3,$arcmag+42 blo bform tst (r4)+ mov $22,libflg libstrt: mov 16(r4),r0 / next library start inc r0 bic $1,r0 mov r0,libnxt clr 14(r4) / end of name mov r4,filnam / archive entry name add $20,r4 / point to file start filstrt: cmp (r4)+,magic / see if object file bne bform mov $ctxtorg,r1 mov libflg,r2 / text origin in file add $20,r2 / skip header mov (r4)+,r0 mov r2,(r1)+ / text origin mov r0,(r1)+ / text size add r0,r2 mov (r4)+,r0 mov r2,(r1)+ / data origin mov r0,(r1)+ / data size add r0,r2 mov (r4)+,(r1)+ / bss size mov r2,(r1)+ / text reloc origin mov ctxtsiz,(r1) / text reloc size add (r1)+,r2 mov r2,(r1)+ / data reloc origin mov cdatsiz,(r1) / data size add (r1)+,r2 mov (r4)+,r0 mov r2,(r1)+ / symbol table origin mov r0,(r1)+ / symbol table size mov (r4)+,r0 / stack size cmp r0,stksiz blo 1f mov r0,stksiz 1: mov (r4)+,entry / entry tst (r4)+ / relocation suppressed? beq 1f jsr r5,mesg; norel rts r5 1: tst (r5)+ rts r5 bform: jsr r5,mesg; format jmp sintr specarg: mov (r1),r0 movb 1(r0),r0 cmpb r0,$'u beq use cmpb r0,$'l beq libarg cmpb r0,$'x beq xtsym cmpb r0,$'e beq entarg cmpb r0,$'r beq savrel cmpb r0,$'s beq squash cmpb r0,$'n beq new cmpb r0,$'d beq sdcom rts r5 squash: inc sqflg inc xtflg rts r5 savrel: clr relflg rts r5 xtsym: inc xtflg rts r5 libarg: movb $'a,wlib mov (r1),r1 movb 2(r1),r0 beq 1f movb r0,wlib 1: mov $libfil,*argp tst (r5)+ rts r5 entarg: clr r4 jsr r5,use mov (r4),entptr rts r5 use: dec argc blt 2f add $2,argp mov *argp,r0 mov $symbol,r1 mov $8.,-(sp) 1: movb (r0)+,(r1)+ beq 1f dec (sp) bgt 1b 1: dec (sp) ble 1f clrb (r1)+ br 1b 1: tst (sp)+ mov $40,(r1)+ clr (r1)+ jsr r5,lookup tst (r4) bne 2f jsr r5,enter 2: rts r5 new: inc nflg rts r5 sdcom: inc dcom rts r5 relsym: mov symbol+10,r0 bic $!37,r0 beq 1f cmp r0,$5 bhis 1f asl r0 add *reltab-2(r0),symbol+12 1: rts r5 lookloc: mov $local,r4 1: cmp r4,locp bhis 1f cmp (r4)+,r2 beq 2f tst (r4)+ br 1b 1: jsr r5,mesg; snotfound jmp sintr 2: mov (r4),r4 rts r5 aopen: clr reopened mov r0,0f mov r0,filnam mov fin,r0 beq 1f sys close 1: sys open; 0:..; 0 bec 1f jsr r5,mesg; fnotfound rts r5 1: mov r0,fin tst (r5)+ rts r5 addin: add ctxtsiz,txtsiz add cdatsiz,datsiz add cbsssiz,bsssiz rts r5 issymbol: mov r1,-(sp) mov (r0)+,r1 cmp (r1)+,(r5) bne 1f cmp (r1)+,2(r5) bne 1f cmp (r1)+,4(r5) bne 1f cmp (r1)+,6(r5) beq 2f 1: tst (r0)+ 2: mov (sp)+,r1 rts r0 / ldx -- link editor a.out: l.out: undmes: movemes: /comconfl: / norel: toomany: multi: locovflo: relerr: premeof: outfile: fnotfound: format: snotfound: mulent: libfil: wlib: <.a\0> qnl: <\n> qsemi: <;> .even _etext: <_etext\0\0> _edata: <_edata\0\0> _end: <_end\0\0\0\0> dotdot: .. zero: 0 rlistp: rlist esymp: symtab reltab: zero txtorg datorg bssorg arcmagic: -147. magic: br .+20 txtsiz: .=.+2 datsiz: .=.+2 bsssiz: .=.+2 symsiz: .=.+2 stksiz: .=.+2 exorig: .=.+2 relflg: 1 .bss libflg: .=.+2 sqflg: .=.+2 dcom: .=.+2 nflg: .=.+2 datoffs:.=.+2 entptr: .=.+2 entry: .=.+2 xtflg: .=.+2 txtorg: .=.+2 datorg: .=.+2 bssorg: .=.+2 fdatorg: .=.+2 fbssorg: .=.+2 ctxtorg:.=.+2 ctxtsiz:.=.+2 cdatorg:.=.+2 cdatsiz:.=.+2 cbsssiz: .=.+2 ctrelorg:.=.+2 ctrelsiz:.=.+2 cdrelorg:.=.+2 cdrelsiz:.=.+2 csymorg: .=.+2 csymsiz: .=.+2 arcmag: .=.+42 argc: .=.+2 argp: .=.+2 oattpt: .=.+2 locp: .=.+2 locsymsiz:.=.+2 fout: .=.+2 fin: .=.+2 reopened:.=.+2 ndef: .=.+2 ch: .=.+2 filnam: .=.+2 relbas: .=.+2 libnxt: .=.+2 symbol: .=.+14 txtp: .=.+10+512. relp: .=.+10+512. otxtp: .=.+6+512. odatp: .=.+6+512. osymp: .=.+6+512. otrelp: .=.+6+512. odrelp: .=.+6+512. rlist: .=.+512. rliste: local: .=.+1024. elocal: hshsiz = 1000. hshtab: .=2*hshsiz+. symtab: esymtab = orig+16384.-300. # /* * ln target [ new name ] */ struct ibuf { int inum; int iflags; char inl; char iuid; int isize; int iaddr[8]; char *ictime[2]; char *imtime[2]; int fill; }; #define DIR 040000 #define FMT 060000 main(argc, argv) char **argv; { static struct ibuf statb; register char *np; if (argc<2) { write(1, "Usage: ln target [ newname ]\n", 29); exit(1); } if (argc==2) { np = argv[1]; while(*np++); while (*--np!='/' && np>argv[1]); np++; argv[2] = np; } stat(argv[1], &statb); if ((statb.iflags&FMT) == DIR) { write(1, "No directory link\n", 18); exit(1); } if (link(argv[1], argv[2])<0) { write(1, "Can't link\n", 11); exit(1); } exit(0); } # /* * login [ name ] */ struct { char name[8]; char tty; char ifill; int time[2]; int ufill; } utmp; struct { int regs[2]; int tflags; } ttyb; char *ttyx; #define ECHO 010 main(argc, argv) char **argv; { char pbuf[128]; register char *namep, *np; char pwbuf[9]; int t, sflags, f, c, uid, gid; signal(3, 1); signal(2, 1); ttyx = "/dev/ttyx"; if ((utmp.tty=ttyn(0)) == 'x') { write(1, "Sorry.\n", 7); exit(); } ttyx[8] = utmp.tty; loop: namep = utmp.name; if (argc>1) { np = argv[1]; while (namep= 0) { t = utmp.tty; if (t>='a') t =- 'a' - (10+'0'); seek(f, (t-'0')*16, 0); write(f, &utmp, 16); close(f); } if ((f = open("/usr/adm/wtmp", 1)) >= 0) { seek(f, 0, 2); write(f, &utmp, 16); close(f); } if ((f = open("/etc/motd", 0)) >= 0) { while(read(f, &t, 1) > 0) write(1, &t, 1); close(f); } if ((f = open("mailbox", 0)) >= 0) { write(1, "You have mail.\n", 15); close(f); } chown(ttyx, uid); setgid(gid); setuid(uid); if (*np == '\0') np = "/bin/sh"; execl(np, "-", 0); write(1, "No shell.\n", 9); exit(); bad: write(1, "Login incorrect.\n", 17); goto loop; } getpwentry(name, buf) char *name, *buf; { extern fin; int fi, r, c; register char *gnp, *rnp; fi = fin; r = 1; if((fin = open("/etc/passwd", 0)) < 0) goto ret; loop: gnp = name; rnp = buf; while((c=getchar()) != '\n') { if(c <= 0) goto ret; *rnp++ = c; } *rnp++ = '\0'; rnp = buf; while (*gnp++ == *rnp++); if ((*--gnp!=' ' && gnp lock: lpd: .even .bss ch: .=.+2 dfi: .=.+2 dbuf: .=.+18. print: .=.+518. proto: .=.+518. insert: .=.+518. buf: .=.+400. sleep = 35. signal = 48. /* * lpr -- on line print to Line Printer */ tfname; nact; tff; first; main(argc, argv) int argc; char *argv[]; { char *arg, *remote; int c, f, flag, cflag; flag = 0; tfname = ranname("/usr/lpd/tfxxx"); if(tfname) tff = creat(tfname, 0666); else tff = -1; if(tff < 0) { printf("Cannot create in /usr/lpd\n"); exit(); } ident(); if(argc == 1) copy(0); while(--argc) { arg = *++argv; c = *arg; if(c == '+' || c == '-') { cflag = c; if(*++arg == '\0') { flag = cflag; continue; } } else cflag = flag; if(cflag == '+') goto cf; if(*arg == '/' && cflag != '-') { card('F', arg); nact++; continue; } f = ranname("/usr/lpd/lfxxx"); if(f) { if(link(arg, f)) goto cf; card('F', f); card('U', f); nact++; goto df; } cf: f = open(arg, 0); if(f < 0) { printf("Cannot open %s\n", arg); continue; } copy(f); close(f); df: if(cflag == '-') { f = unlink(arg); if(f < 0) printf("Cannot remove %s\n", arg); } } if(nact) { f = ranname("/usr/lpd/dfxxx"); if(f) link(tfname, f); else printf("Cannot rename in /usr/lpd\n"); unlink(tfname); execl("/etc/lpd", "lpd", 0); } unlink(tfname); } copy(f) int f; { int fn, ff, i, nr, nc; static int buf[256]; fn = ranname("/usr/lpd/cfxxx"); if(fn) ff = creat(fn, 0666); else ff = -1; if(ff < 0) { printf("Cannot create in /usr/lpd\n"); return; } nc = 0; nr = 0; while((i = read(f, buf, 512)) > 0) { write(ff, buf, i); nc =+ i; if(nc >= 512) { nc =- 512; nr++; if(nr > 400) { printf("Copy file is too large\n"); break; } } } close(ff); card('F', fn); card('U', fn); nact++; } card(c, s) int c; char s[]; { char *p1, *p2; static char buf[512]; int col; p1 = buf; p2 = s; col = 0; *p1++ = c; while((c = *p2++) != '\0') { *p1++ = c; col++; } *p1++ = '\n'; write(tff, buf, col+2); } ident() { int c, i, j, n; char *b1p; static char b1[100], b2[100]; b1p = b1; if(getpw(getuid(), b1)) { b1p = "pdp::::gok:"; } j = 0; while(c = "$ ident "[j]) b2[j++] = c; i = 0; n = 5; while(--n) while(b1p[i++] != ':'); while((c = b1p[i++]) != ':') b2[j++] = c; b2[j++] = ','; i = 0; while((c = b1p[i++]) != ':') b2[j++] = c; b2[j++] = '\0'; card('L', b2); } ranname(s) char s[]; { static int buf[20]; loop: s[11] = ranc(); s[12] = ranc(); s[13] = ranc(); if(stat(s, buf)) return(s); goto loop; } ranc() { int buf[2], c; if(!first) { time(buf); srand(buf[1]); first++; } c = rand(); return(((c>>11)%10)+'0'); } # /* * list file or directory */ struct { int fdes; int nleft; char *nextc; char buff[512]; } inf; struct ibuf { int idev; int inum; int iflags; char inl; char iuid; char igid; char isize0; int isize; int iaddr[8]; char *iatime[2]; char *imtime[2]; }; struct lbuf { char lname[14]; int lnum; int lflags; char lnl; char luid; char lgid; char lsize0; int lsize; char *lmtime[2]; }; struct lbufx { char *namep; }; int aflg, dflg, lflg, sflg, tflg, uflg, iflg, fflg; int fout; int rflg 1; int flags; int uidfil -1; int tblocks; int statreq; struct lbuf *lastp &end; struct lbuf *rlastp &end; char *dotp "."; #define IFMT 060000 #define DIR 0100000 #define CHR 020000 #define BLK 040000 #define ISARG 01000 #define LARGE 010000 #define SUID 04000 #define SGID 02000 #define ROWN 0400 #define WOWN 0200 #define XOWN 0100 #define RGRP 040 #define WGRP 020 #define XGRP 010 #define ROTH 04 #define WOTH 02 #define XOTH 01 main(argc, argv) char **argv; { int i, j; extern struct lbuf end; register struct lbuf *ep, *ep1; register struct lbuf *slastp; struct lbuf lb; int compar(); fout = dup(1); if (--argc > 0 && *argv[1] == '-') { argv++; while (*++*argv) switch (**argv) { case 'a': aflg++; continue; case 's': sflg++; statreq++; continue; case 'd': dflg++; continue; case 'l': lflg++; statreq++; uidfil = open("/etc/passwd", 0); continue; case 'r': rflg = -1; continue; case 't': tflg++; statreq++; continue; case 'u': uflg++; continue; case 'i': iflg++; continue; case 'f': fflg++; continue; default: continue; } argc--; } if (fflg) { aflg++; lflg = 0; sflg = 0; tflg = 0; statreq = 0; } if (argc==0) { argc++; argv = &dotp - 1; } for (i=0; i < argc; i++) { if ((ep = gstat(*++argv, 1))==0) continue; ep->namep = *argv; ep->lflags =| ISARG; } qsort(&end, lastp - &end, 28, compar); slastp = lastp; for (ep = &end; eplflags&DIR && dflg==0 || fflg) { if (argc>1) printf("\n%s:\n", ep->namep); lastp = slastp; readdir(ep->namep); if (fflg==0) qsort(slastp, lastp - slastp, 28, compar); if (statreq) printf("total %d\n", tblocks); for (ep1=slastp; ep1lnum == -1) return; if (iflg) printf("%5d ", p->lnum); if (lflg) { pmode(p->lflags); printf("%2d ", p->lnl); if (getname(p->luid&0377, tbuf)==0) printf("%-6.6s", tbuf); else printf("%-6d", p->luid&0377); if (p->lflags & (BLK|CHR)) printf("%3d,%3d", p->lsize.dmajor&0377, p->lsize.dminor&0377); else printf("%7s", locv(p->lsize0, p->lsize)); printf(" %-12.12s ", ctime(p->lmtime)+4); } else if (sflg) printf("%4d ", nblock(p->lsize0, p->lsize)); if (p->lflags&ISARG) printf("%s\n", p->namep); else printf("%.14s\n", p->lname); } getname(uid, buf) int uid; char buf[]; { int j, c, n, i; inf.fdes = uidfil; seek(inf.fdes, 0, 0); inf.nleft = 0; do { i = 0; j = 0; n = 0; while((c=getc(&inf)) != '\n') { if (c<0) return(-1); if (c==':') { j++; c = '0'; } if (j==0) buf[i++] = c; if (j==2) n = n*10 + c - '0'; } } while (n != uid); buf[i++] = '\0'; return(0); } nblock(size0, size) char *size0, *size; { register int n; n = ldiv(size0, size, 512); if (size&0777) n++; if (n>8) n =+ (n+255)/256; return(n); } int m0[] { 3, DIR, 'd', BLK, 'b', CHR, 'c', '-'}; int m1[] { 1, ROWN, 'r', '-' }; int m2[] { 1, WOWN, 'w', '-' }; int m3[] { 2, SUID, 's', XOWN, 'x', '-' }; int m4[] { 1, RGRP, 'r', '-' }; int m5[] { 1, WGRP, 'w', '-' }; int m6[] { 2, SGID, 's', XGRP, 'x', '-' }; int m7[] { 1, ROTH, 'r', '-' }; int m8[] { 1, WOTH, 'w', '-' }; int m9[] { 1, XOTH, 'x', '-' }; int *m[] { m0, m1, m2, m3, m4, m5, m6, m7, m8, m9}; pmode(aflag) { register int **mp; flags = aflag; for (mp = &m[0]; mp < &m[10];) select(*mp++); } select(pairp) int *pairp; { register int n, *ap; ap = pairp; n = *ap++; while (--n>=0 && (flags&*ap++)==0) *ap++; putchar(*ap); } makename(dir, file) char *dir, *file; { static char dfile[100]; register char *dp, *fp; register int i; dp = dfile; fp = dir; while (*fp) *dp++ = *fp++; *dp++ = '/'; fp = file; for (i=0; i<14; i++) *dp++ = *fp++; *dp = 0; return(dfile); } readdir(dir) char *dir; { static struct { int dinode; char dname[14]; } dentry; register char *p; register int j; register struct lbuf *ep; if (fopen(dir, &inf) < 0) { printf("%s unreadable\n", dir); return; } tblocks = 0; for(;;) { p = &dentry; for (j=0; j<16; j++) *p++ = getc(&inf); if (dentry.dinode==0 || aflg==0 && dentry.dname[0]=='.') continue; if (dentry.dinode == -1) break; ep = gstat(makename(dir, dentry.dname), 0); if (ep->lnum != -1) ep->lnum = dentry.dinode; for (j=0; j<14; j++) ep->lname[j] = dentry.dname[j]; } close(inf.fdes); } gstat(file, argfl) char *file; { struct ibuf statb; register struct lbuf *rep; if (lastp+1 >= rlastp) { sbrk(512); rlastp.idev =+ 512; } rep = lastp; lastp++; rep->lflags = 0; rep->lnum = 0; if (argfl || statreq) { if (stat(file, &statb)<0) { printf("%s not found\n", file); statb.inum = -1; statb.isize0 = 0; statb.isize = 0; statb.iflags = 0; if (argfl) { lastp--; return(0); } } rep->lnum = statb.inum; statb.iflags =& ~(ISARG | DIR); if ((statb.iflags&IFMT) == 060000) { statb.iflags =& ~020000; } else if ((statb.iflags&IFMT)==040000) { statb.iflags =& ~IFMT; statb.iflags =| DIR; } rep->lflags = statb.iflags; rep->luid = statb.iuid; rep->lgid = statb.igid; rep->lnl = statb.inl; rep->lsize0 = statb.isize0; rep->lsize = statb.isize; if (rep->lflags & (BLK|CHR) && lflg) rep->lsize = statb.iaddr[0]; rep->lmtime[0] = statb.imtime[0]; rep->lmtime[1] = statb.imtime[1]; if(uflg) { rep->lmtime[0] = statb.iatime[0]; rep->lmtime[1] = statb.iatime[1]; } tblocks =+ nblock(statb.isize0, statb.isize); } return(rep); } compar(ap1, ap2) struct lbuf *ap1, *ap2; { register struct lbuf *p1, *p2; register int i; int j; struct { char *charp;}; p1 = ap1; p2 = ap2; if (dflg==0) { if ((p1->lflags&(DIR|ISARG)) == (DIR|ISARG)) { if ((p2->lflags&(DIR|ISARG)) != (DIR|ISARG)) return(1); } else { if ((p2->lflags&(DIR|ISARG)) == (DIR|ISARG)) return(-1); } } if (tflg) { i = 0; if (p2->lmtime[0] > p1->lmtime[0]) i++; else if (p2->lmtime[0] < p1->lmtime[0]) i--; else if (p2->lmtime[1] > p1->lmtime[1]) i++; else if (p2->lmtime[1] < p1->lmtime[1]) i--; return(i*rflg); } if (p1->lflags&ISARG) p1 = p1->namep; else p1 = p1->lname; if (p2->lflags&ISARG) p2 = p2->namep; else p2 = p2->lname; for (i=0; i<14; i++) if ((j = *p1.charp++ - *p2.charp++) || p1.charp[-1]==0) return(rflg*j); return(0); }        fed2.sfed3.sfind.cform1.sform2.sform3.sform4.s form5.s form6.s getty.s glob.c goto.cgrep.sif.cinit.ckill.sld1.sld2.sldx.sln.clogin.clpd.slpr.cls.ca.outl.outa.out/* mail command usage mail prints your mail mail file people sends file to people by login name mail person sends following tty input to him */ char iobuf[518]; char ubuf[16]; main(argc, argv) char *argv[]; { char *buf; static char myname[20], junk[40], number[20]; static char hisname[40], hisdir[40]; auto j, j0, k, n, mail, file, mynumber; if(argc==1 || (argc==2 && argv[1][0]=='-')) goto printm; if(fopen("/etc/passwd", iobuf) < 0) { printf("Can't open password file\n"); exit(); } if(mynumber = ttyn(0)) { if((file = open("/tmp/utmp",0)) < 0) goto otherway; while(read(file,ubuf,16)) { if(mynumber == ubuf[8]) { close(file); file = 0; while(file < 8 && ubuf[file] != ' ') { myname[file] = ubuf[file]; file++; } myname[file] = 0; goto namefound; } } } otherway: mynumber = getuid(); for(;;) { if(!(getfield(myname) && getfield(junk) && getfield(number) && getfield(junk) && getfield(junk) && getfield(junk) && getfield(junk))) { printf("Who are you?\n"); exit(); } if(atoi(number) == mynumber) break; } namefound: close(iobuf[0]); if(argc > 2) file = argv[1]; else file = 0; j0 = argc>2? 1: 0; fopen("/etc/passwd", iobuf); k = 2; for(;;) { if(!(getfield(hisname) && getfield(junk) && getfield(junk) && getfield(junk) && getfield(junk) && getfield(hisdir) && getfield(junk))) break; j = j0; while(++j < argc) if(comp(argv[j], hisname)) { send(file, myname, hisname, hisdir); argv[j][0] = 0; if(++k >= argc) exit(); } } j = j0; while(++j < argc) if(argv[j][0] != 0) { junk[0] = 0; append(argv[j], junk); send(file, myname, argv[j], junk); } exit(); printm: if((mail=open("mailbox", 0)) < 0) { printf("No mail\n"); exit(); } while(n = read(mail, iobuf, 512)) write(1, iobuf, n); if(argc != 2) { printf("Save? "); read(0, buf=iobuf, 512); } else buf = &argv[1][1]; if(buf[0] == 'y') { if(concat("mailbox","mbox",0)) printf("Old mail in `mbox'\n"); } unlink("mailbox"); exit(); } getfield(buf) char buf[]; { int j; char c; j = 0; while((c = buf[j] = getc(iobuf)) >= 0) if(c==':' || c=='\n') { buf[j] =0; return(1); } else j++; return(0); } /* send overwrites hisdir */ send(file, myname, hisname, hisdir) char hisname[], myname[], hisdir[]; { static char buf[512]; int n; for(n = 0 ; hisdir[n++];); append("/mailbox", hisdir); buf[0] = 0; append("\nFrom ",buf); append(myname,buf); append(" ",buf); time(buf+256); append(ctime(buf+256),buf); if(!concat(file,hisdir,1,buf)) printf("Can't send to `%s'\n",hisname); hisdir[n] = 0; } comp(n1, n2) char n1[], n2[]; { int i; char c; i = 0; while((c=n1[i]) == n2[i]) if(c == 0) return(1); else i++; return(0); } atoi(a) char a[]; { int i, j; i = 0; j = 0; while(a[j]) i = i*10 + a[j++] - '0'; return(i); } append(tail, head) char head[], tail[]; { int i, j; i = 0; while(head[i]) i++; j = 0; while(head[i++] = tail[j++]); } concat(fn1,fn2,flg,header) char *fn1,*fn2; int flg; char *header; { char *flname; int fn; int tmp,n; static buf[512]; flname = "/tmp/mtm\0\0"; for(flname[8] = 'a' ; flname[8] <= 'z' ; flname[8]++) if(stat(flname,buf) < 0) goto found; notmp: printf("can't creat tmp file\n"); exit(); found: if((tmp = creat(flname,0400)) < 0) goto notmp; if(!fn1) /*standard input file*/ fn = 0; else if((fn = open(fn1,0)) < 0) { close(tmp); unlink(flname); printf("can't open `%s'\n", fn1); exit(); } if(flg) { for(n = 0 ; header[n++] ;); write(tmp,header,n-1); } while(n = read(fn,buf,512)) write(tmp,buf,n); if(flg) write(tmp,"\n",1); if(fn) close(fn); if(stat(fn2,buf) >= 0) { if((fn = open(fn2,0)) < 0) { close(tmp); unlink(flname); return(0); } while(n = read(fn,buf,512)) write(tmp,buf,n); close(fn); } close(tmp); if((tmp = open(flname,0)) < 0) { unlink(flname); goto notmp; } if((fn = creat(fn2,0666)) < 0) { close(tmp); unlink(flname); return(0); } while(n = read(tmp,buf,512)) write(fn,buf,n); close(fn); close(tmp); unlink(flname); return(1); }     / mesg -- set current tty to accept or forbid messages .globl ttyn clr r0 jsr pc,ttyn movb r0,ttyno sys stat; ttyx; stbuf bes error cmp (sp)+,$1 beq flip tst (sp)+ mov (sp)+,r0 cmpb (r0),$'n beq setno br setyes flip: bit $2,stbuf+4 beq setyes setno: sys chmod; ttyx; 600 bes error br say setyes: sys chmod; ttyx; 622 bes error say: bit $2,stbuf+4 beq wasno wasyes: movb $'y,nmes+4 wasno: mov $1,r0 sys write; nmes; 6 sys exit nmes: error: mov $1,r0 sys write; 1f; 2 sys exit 1: ttyx: ttyno = .-2 .even stbuf: .=.+40. / makdir -- make a directory sys getuid mov r0,uid mov sp,r5 tst (r5)+ loop: tst (r5)+ dec (sp) bgt 1f sys exit 1: mov (r5),r0 mov $buf1,r1 mov $buf2,r2 clr r3 1: movb (r0)+,r4 beq 2f movb r4,(r1)+ movb r4,(r2)+ cmpb r4,$'/ bne 1b mov r2,r3 br 1b 2: movb $'/,(r1)+ movb $'.,(r1)+ clrb (r1) mov $dot,dir tst r3 beq 1f mov $buf2,dir clrb (r3) cmp r3,$buf2+1 beq 1f clrb -(r3) / ??? 1: tstb uid beq 2f sys stat; dir:..; stbuf / status of parent dir bes error mov stbuf+4,r0 cmpb uid,stbuf+7 bne 1f ash $-6,r0 1: ror r0 ror r0 bcc error / no write permission in parent 2: mov (r5),0f sys makdir; 0:..; 140777; 0 bes error / prob already exists mov (r5),0f sys chown; 0:..; uid:.. mov (r5),0f sys link; 0:..; buf1 bes error movb $'.,(r1)+ clrb (r1) mov dir,0f sys link; 0:..; buf1 bec loop error: mov (r5),r0 mov r0,0f clr 0f+2 1: tstb (r0)+ beq 1f inc 0f+2 br 1b 1: mov $1,r0 sys write; 0:..; .. mov $1,r0 sys write; ques; 3 br loop dot: <.\0> ques: < ?\n> .even .bss buf1: .=.+100. buf2: .=.+100. stbuf: .=.+40. # struct { char *s_isize; char *s_fsize; int s_nfree; int s_free[100]; int s_ninode; int s_inode[100]; char s_flock; char s_ilock; char s_fmod; int s_time[2]; } filsys; struct inode { int i_number; int i_mode; char i_nlink; char i_uid; char i_gid; char i_size0; char *i_size1; int i_addr[8]; int i_time[4]; }; /* modes */ #define IALLOC 0100000 #define IFMT 060000 #define IFDIR 040000 #define IFCHR 020000 #define IFBLK 060000 #define ILARG 010000 #define ISUID 04000 #define ISGID 02000 #define IREAD 0400 #define IWRITE 0200 #define IEXEC 0100 int utime[2]; int fin; int fsi; int fso; char *charp; int buf[256]; char string[50]; char *fsys; char *proto; main(argc, argv) char **argv; { int f, n; /* * open relevent files */ time(utime); if(argc != 3) { printf("arg count\n"); exit(); } fsys = argv[1]; proto = argv[2]; fso = creat(fsys, 0666); if(fso < 0) { printf("%s: cannot create\n", fsys); exit(); } fsi = open(fsys, 0); if(fsi < 0) { printf("%s: cannot open\n", fsys); exit(); } fin = open(proto, 0); if(fin < 0) { n = 0; for(f=0; proto[f]; f++) { if(proto[f]<'0' || proto[f]>'9') { printf("%s: cannot open\n", proto); exit(); } n = n*10 + proto[f]-'0'; } filsys.s_fsize = n; filsys.s_isize = ldiv(0, n, 43+ldiv(0, n, 1000)); printf("isize = %d\n", filsys.s_isize); charp = "d--777 0 0 $ "; goto f3; } /* * get name of boot load program * and read onto block 0 */ getstr(); f = open(string, 0); if(f < 0) { printf("%s: cannot open init\n", string); goto f2; } read(f, buf, 020); if(buf[0] != 0407) { printf("%s: bad format\n", string); goto f1; } n = buf[1]+buf[2]; if(n > 512) { printf("%s: too big\n", string); goto f1; } read(f, buf, n); wtfs(0, buf); f1: close(f); /* * get total disk size * and inode block size */ f2: filsys.s_fsize = getnum(); filsys.s_isize = getnum(); f3: if(filsys.s_isize > filsys.s_fsize || filsys.s_fsize-filsys.s_isize-2 < filsys.s_isize) { printf("%l/%l: bad ratio\n", filsys.s_fsize, filsys.s_isize); exit(); } free(0); for(n=filsys.s_fsize-1; n!=filsys.s_isize+1; n--) free(n); /* * initialize files */ for(n=0; n<256; n++) buf[n] = 0; for(n=0; n!=filsys.s_isize; n++) wtfs(n+2, buf); cfile(0); /* * write out super block */ for(n=0; n<256; n++) buf[n] = 0; filsys.s_time[0] = utime[0]; filsys.s_time[1] = utime[1]; wtfs(1, &filsys); } cfile(par) struct inode *par; { struct inode in; int db[256], ib[256]; int dbc, ibc; static ino; int i, f, *p1, *p2; /* * get mode, uid and gid */ getstr(); in.i_mode = IALLOC; in.i_mode =| gmode(string[0], "bcd", IFBLK, IFCHR, IFDIR); in.i_mode =| gmode(string[1], "u", ISUID); in.i_mode =| gmode(string[2], "g", ISGID); for(i=3; i<6; i++) { if(string[i]<'0' || string[i]>'7') { printf("%c/%s: bad digit\n", string[i], string); exit(); } in.i_mode =| (string[i]-'0')<<(15-3*i); } in.i_uid = getnum(); in.i_gid = getnum(); /* * general initialization prior to * switching on format */ ino++; in.i_number = ino; if(ldiv(0, ino, 16) > filsys.s_isize) { printf("too many inodes\n"); exit(); } in.i_nlink = 1; in.i_size0 = 0; in.i_size1 = 0; for(i=0; i<8; i++) in.i_addr[i] = 0; for(i=0; i<256; i++) { db[i] = 0; ib[i] = 0; } if(par == 0) { par = ∈ in.i_nlink--; } dbc = 0; ibc = 0; switch(in.i_mode&IFMT) { case 0: /* * regular file * contents is a file name */ getstr(); f = open(string, 0); if(f < 0) { printf("%s: cannot open\n", string); break; } while((i=read(f, db, 512)) > 0) { in.i_size1 =+ i; newblk(&dbc, db, &ibc, ib); } close(f); break; case IFBLK: case IFCHR: /* * special file * content is maj/min types */ in.i_addr[0] = getnum()<<8; in.i_addr[0] =| getnum(); break; case IFDIR: /* * directory * put in extra links * call recursively until * name of "$" found */ par->i_nlink++; entry(par->i_number, "..", &dbc, db, &ibc, ib); in.i_nlink++; entry(in.i_number, ".", &dbc, db, &ibc, ib); in.i_size1 = 32; for(;;) { getstr(); if(string[0]=='$' && string[1]=='\0') break; entry(ino+1, string, &dbc, db, &ibc, ib); in.i_size1 =+ 16; cfile(&in); } break; } if(dbc != 0) newblk(&dbc, db, &ibc, ib); if(ibc > 8) { in.i_mode =| ILARG; dbc = alloc(); wtfs(dbc, ib); in.i_addr[0] = dbc; } else for(i=0; i'9') { printf("%s: bad number\n", string); exit(); } n = n*10 + string[i] - '0'; } return(n); } getstr() { int i, c; loop: switch(c=getch()) { case ' ': case '\t': case '\n': goto loop; case '\0': printf("EOF\n"); exit(); case ':': while(getch() != '\n'); goto loop; } i = 0; do { string[i++] = c; c = getch(); } while(c!=' '&&c!='\t'&&c!='\n'&&c!='\0'); string[i] = '\0'; } rdfs(bno, bf) { int n; seek(fsi, bno, 3); n = read(fsi, bf, 512); if(n != 512) { printf("read error: %l\n", bno); exit(); } } wtfs(bno, bf) { int n; seek(fso, bno, 3); n = write(fso, bf, 512); if(n != 512) { printf("write error: %l\n", bno); exit(); } } alloc() { int bno, i; filsys.s_nfree--; bno = filsys.s_free[filsys.s_nfree]; filsys.s_free[filsys.s_nfree] = 0; if(bno == 0) { printf("out of free space\n"); exit(); } if(filsys.s_nfree <= 0) { rdfs(bno, buf); filsys.s_nfree = buf[0]; for(i=0; i<100; i++) filsys.s_free[i] = buf[i+1]; } return(bno); } free(bno) { int i; if(filsys.s_nfree >= 100) { buf[0] = filsys.s_nfree; for(i=0; i<100; i++) buf[i+1] = filsys.s_free[i]; wtfs(bno, buf); filsys.s_nfree = 0; } filsys.s_free[filsys.s_nfree] = bno; filsys.s_nfree++; } entry(ino, str, adbc, db, aibc, ib) char *str; int *adbc, *db, *aibc, *ib; { char *s; int i; db[*adbc] = ino; (*adbc)++; s = &db[*adbc]; for(i=0; i<14; i++) { *s++ = *str; if(*str != '\0') str++; } *adbc =+ 7; if(*adbc >= 256) newblk(adbc, db, aibc, ib); } newblk(adbc, db, aibc, ib) int *adbc, *db, *aibc, *ib; { int bno, i; bno = alloc(); wtfs(bno, db); for(i=0; i<256; i++) db[i] = 0; *adbc = 0; ib[*aibc] = bno; (*aibc)++; if(*aibc >= 256) { printf("indirect block full\n"); exit(); } } getch() { if(charp) return(*charp++); return(getchar()); }         ! " # $ % main(argc, argv) int argc; char **argv; { int m, a, b; if(argc != 5) { printf("arg count\n"); goto usage; } if(*argv[2] == 'b') m = 0160666; else if(*argv[2] == 'c') m = 0120666; else goto usage; a = number(argv[3]); if(a < 0) goto usage; b = number(argv[4]); if(b < 0) goto usage; if(mknod(argv[1], m, (a<<8)|b) < 0) perror("mknod"); exit(); usage: printf("usage: mknod name b/c major minor\n"); } number(s) char *s; { int n, c; n = 0; while(c = *s++) { if(c<'0' || c>'9') return(-1); n = n*10 + c-'0'; } return(n); } #define NMOUNT 16 #define NAMSIZ 32 struct mtab { char file[NAMSIZ]; char spec[NAMSIZ]; } mtab[NMOUNT]; main(argc, argv) char **argv; { register int ro; register struct mtab *mp; register char *np; int n, mf; mf = open("/etc/mtab", 0); read(mf, mtab, NMOUNT*2*NAMSIZ); if (argc==1) { for (mp = mtab; mp < &mtab[NMOUNT]; mp++) if (mp->file[0]) printf("%s on %s\n", mp->spec, mp->file); return; } if(argc < 3) { printf("arg count\n"); return; } ro = 0; if(argc > 3) ro++; if(mount(argv[1], argv[2], ro) < 0) { perror("mount"); return; } np = argv[1]; while(*np++) ; np--; while(*--np == '/') *np = '\0'; while(np > argv[1] && *--np != '/') ; if(*np == '/') np++; argv[1] = np; for (mp = mtab; mp < &mtab[NMOUNT]; mp++) { if (mp->file[0] == 0) { for (np = mp->spec; np < &mp->spec[NAMSIZ-1];) if ((*np++ = *argv[1]++) == 0) argv[1]--; for (np = mp->file; np < &mp->file[NAMSIZ-1];) if ((*np++ = *argv[2]++) == 0) argv[2]--; mp = &mtab[NMOUNT]; while ((--mp)->file[0] == 0); mf = creat("/etc/mtab", 0644); write(mf, mtab, (mp-mtab+1)*2*NAMSIZ); return; } } } / ms -- mini-shell mov $sbuf,r1 mov $cbuf,r2 clr r3 jsr pc,nonblank cmp r0,$'\n bne loop sys exit loop: mov r1,(r2)+ 1: movb r0,(r1)+ jsr pc,getc cmp r0,$' / beq 1f cmp r0,$'\n beq go br 1b 1: clrb (r1)+ jsr pc,nonblank cmp r0,$'\n beq go br loop go: clr (r2)+ tst r3 / to call glob bne 1f sys exec; sbuf; cbuf mov $bn,r0 mov $"/b,(r0)+ mov $"in,(r0)+ movb $'/,(r0)+ sys exec; bn; cbuf mov $usr,r0 mov $"/u,(r0)+ mov $"sr,(r0)+ sys exec; usr; cbuf br error 1: mov $gl,cbuf-2 sys exec; gl; cbuf-2 error: mov $1,r0 sys write; 1f; 2 sys exit 1: nonblank: jsr pc,getc cmp r0,$' / beq nonblank rts pc getc: clr r0 sys read; ch; 1 bes 1f tst r0 beq 1f movb ch,r0 cmp r0,$'? beq 3f cmp r0,$'* beq 3f cmp r0,$'[ bne 2f 3: inc r3 2: rts pc 1: sys exit ch: .=.+1 gl: .even .bss usr: .=.+4 / room for /usr bn: .=.+5 / room for /bin/ sbuf: .=.+1000. .even .=.+2 / slot for ptr to glob cbuf: .=.+20. /* mv [-d] file1 file2 unlink file2 link file1 file2 unlink file1 */ int stbuf[42]; struct sbuf { int dev; int inum; int imode; char nlink; char uid; char gid; char siz0; char siz1; int addr[8]; int adate[2]; int mdate[2]; }; char strbuf[70]; main(argc,argv) int argc; char *argv[]; { char **argp; char *argp1, *argp2, *argp3, *argp4; char *p, *p1, *p2; char place[100]; int i; int status; int b; argp = argv; /* check for correct number of arguments */ if(argc != 3){ write(1,"Usage: mv name1 name2\n",22); exit(); } /* is there anything to do? */ argp3 = argp[1]; argp4 = argp[2]; if(stat(argp[1], stbuf) < 0){ write(1,"Source file non-existent\n",25); exit(); } /* yes, there is a source. check whether file or directory */ if((stbuf[0].imode & 060000) == 040000){ /* The source is a directory, so we do lots of checking and messing around so as not to get into trouble. This patch of code contains administrative policies rather than system restrictions. */ if(stat(argp[2], stbuf) >= 0){ write(1,"Directory target exists.\n",25); exit(); } argp1 = argp[1]; argp2 = argp[2]; while(*argp1 == *argp2){ argp1++; if(*argp2++ == 0){ write(1,"???\n",4); exit(); } } while(*argp1)if(*argp1++ == '/'){ write(1,"Directory rename only\n",22); exit(); } while(*argp2)if(*argp2++ == '/'){ write(1,"Directory rename only\n",22); exit(); } if(*--argp1 == '.'){ write(1,"values of B will give rise to dom!\n",37); exit(); } }else{ /* the source is a file. */ setuid(getuid()); if(stat(argp4, &stbuf[2]) >= 0){ if((stbuf[2].imode & 060000) == 040000){ argp2 = strbuf; while(*argp2++ = *argp4++); argp2[-1] = '/'; argp4 = argp[1]; argp1 = argp[1]; while(*argp4) if(*argp4++ == '/') argp1 = argp4; while(*argp2++ = *argp1++); argp4 = strbuf; } if(stat(argp4, &stbuf[2]) >= 0){ if((stbuf[0]==stbuf[2]) && (stbuf[1]==stbuf[3])){ write(1,"Files are identical.\n",21); exit(); } if(getuid() == stbuf[2].uid) b = 0200; else if(getgid() == stbuf[2].gid) b = 020; else b = 02; if((stbuf[2].imode & b) == 0) { printf("%s: %o mode ", argp4, stbuf[2].imode & 07777); i = b = getchar(); while(b != '\n' && b != '\0') b = getchar(); if(i != 'y') exit(); } if(unlink(argp4) < 0){ write(1,"Cannot remove target file.\n",27); exit(); } } } } if(link(argp3, argp4) < 0){ i = fork(); if(i == -1){ write(1,"Try again.\n",11); exit(); } if(i){ while(wait(&status) != i); }else{ p = place; p1 = p; while(*p++ = *argp3++); p2 = p; while(*p++ = *argp4++); execl("/bin/cp","cp", p1, p2, 0); write(1, "no cp\n", 6); exit(1); } if((status & 0377) != 0){ write(1,"?\n", 2); exit(); } if(status != 0) exit(); } if(unlink(argp3) < 0){ write(1,"Cannot unlink source file.\n",26); exit(); } } putchar(c) { write(1, &c, 1); } getchar() { char c; if(read(0, &c, 1) != 1) return(0); return(c); } /* nice */ char *args[100]; char string[10000]; main(argc, argv) int argc; char *argv[]; { int i; char **argp, *strp, *p; if(argc < 2) { printf("arg count\n"); exit(); } argc--; argv++; argp = args; strp = string; for (i=0; i<9; i++) *strp++ = "/usr/bin/"[i]; for(i=0; i 0 && *argv[1] == '-') { argv++; while (*++*argv) switch (**argv) { case 'n': nflg++; continue; case 'c': cflg++; continue; case 'g': gflg++; continue; case 'u': uflg++; continue; case 'r': rflg = -1; continue; case 'p': pflg ++; continue; default: continue; } argc--; } if (argc==0) fi = open("a.out", 0); else fi = open(*++argv, 0); if(fi < 0) { printf("cannot open input\n"); exit(); } read(fi, buf, 020); if(buf[0]!=0407 && buf[0]!=0410) { printf("bad format\n"); exit(); } seek(fi, buf[1], 1); /* text */ seek(fi, buf[2], 1); /* data */ if(buf[7] != 1) { seek(fi, buf[1], 1); seek(fi, buf[2], 1); /* reloc */ } n = ldiv(0, buf[4], 12); if(n == 0) { printf("no name list\n"); exit(); } nlp = sbrk(12*n); read(fi, nlp, n*12); if (pflg==0) qsort(nlp, n, 12, compare); fout = dup(1); close(1); for(i=0; ityp&040)==0) goto out; if(cflg) { if(nlp->name[0] != '_') goto out; for(j=0; j<7; j++) nlp->name[j] = nlp->name[j+1]; nlp->name[7] = '\0'; } j = nlp->typ&037; if(j > 4) j = 1; if(j==0 && nlp->val) j = 5; if(uflg && j!=0) goto out; if(!uflg) { if(j==0) printf(" "); else printo(nlp->val); printf("%c ", (nlp->typ&040? "UATDBC":"uatdbc")[j]); } printf("%.8s\n", nlp); out: nlp++; } flush(); } compare(p1, p2) struct nl *p1, *p2; { int a, i; a = 0; if(nflg) { if(p1->val > p2->val) { a = 1; goto out; } if(p1->val < p2->val) { a = -1; goto out; } } for(i=0; i<8; i++) if(p1->name[i] != p2->name[i]) { if(p1->name[i] > p2->name[i]) a = 1; else a = -1; goto out; } out: return(a*rflg); } printo(v) { int i; printf("%c", v<0?'1':'0'); for(i=0; i<5; i++) { printf("%c", ((v>>12)&7)+'0'); v =<<3; } } /* nohup */ char *args[100]; char string[10000]; main(argc, argv) int argc; char *argv[]; { int i; char **argp, *strp, *p; if(argc < 2) { printf("arg count\n"); exit(); } argc--; argv++; argp = args; strp = string; for (i=0; i<9; i++) *strp++ = "/usr/bin/"[i]; for(i=0; i 1) { p = *argv; if(*p == '-') { while((i = *p++) != '\0') { switch(i) { case 'o': conv =| 001; f = 6; break; case 'd': conv =| 002; f = 5; break; case 'a': conv =| 004; f = 4; break; case 'h': conv =| 010; f = 4; break; case 'c': conv =| 020; f = 5; break; case 'b': conv =| 040; f = 7; break; } if(f > max) max = f; } argc--; argv++; } } if(!conv) { max = 6; conv = 1; } if(argc > 1) if(**argv != '+') { fi = open(*argv, 0); if(fi < 0) { printf("cannot open %s\n", *argv); goto done; } argv++; argc--; } if(argc > 1) offset(*argv); loop: f = 1; a[0] = addr[0]; a[1] = addr[1]; for(i=0; i>8); break; case 040: pre(7); putn(n&0377, 8, 3); putchar(' '); putn((n>>8)&0377, 8, 3); break; } } getw() { int b1, b2; b1 = getc(); if(b1 == -1) { eof = 1; return(0); } b2 = getc(); if(b2 == -1) b2 = 0; return(b1|(b2<<8)); } getc() { if(gidx >= gcnt) { gcnt = read(fi, gbuf, 512); if(gcnt <= 0) return(-1); gidx = 0; } if(++addr[1] >= basem) { addr[0]++; addr[1] = 0; } return(gbuf[gidx++]&0377); } putc(c) { c =& 0377; if(c>037 && c<0177 && c!='\\') { putchar(' '); putchar(c); return; } putchar('\\'); switch(c) { case '\0': putchar('0'); break; case '\n': putchar('n'); break; case '\\': putchar('\\'); break; case '\t': putchar('t'); break; default: putchar('?'); } } putn(n, b, c) { if(!c) return; putn(ldiv(0,n,b),b,c-1); if((n=lrem(0,n,b)) > 9) putchar(n-10+'a'); else putchar(n+'0'); } pre(n) { int i; for(i=n; i 0) if(p[-2] == 'b') { i--; b++; p--; } if(i > 0) if(p[-2] == '.') { i--; base = 10; basem = 1000; } a[0] = 0; for(j=0; i-j>3; j++) { d = s[j]; if(d>='0' && d<='9') a[0] = a[0]*base + d-'0'; } a[1] = 0; for(; i-j>0; j++) { d = s[j]; if(d>='0' && d<='9') a[1] = a[1]*base + d-'0'; } if(b) { i = a[0]*basem+a[1]; a[0] = 0; a[1] = 0; while(i--) { a[1] =+ 512; while(a[1] >= basem) { a[1] =- basem; a[0]++; } } } i = 0; while(a[0] > addr[0]+1) { addr[1] =+ 512; while(addr[1] >= basem) { addr[1] =- basem; addr[0]++; } i++; } seek(fi, i, 3); while(a[0]!=addr[0] || a[1]!=addr[1]) if(getc() == -1) break; } putop(n) { char *p; int i, c; p = getop(n); for(i=0; (c = *p++) != '\0'; i++) putchar(c); for(; i<4; i++) putchar(' '); } getop(n) { switch(n&0170000) { case 0000000: switch(n&0177000) { case 0004000: return("jsr"); case 0077000: return("sob"); } switch(n&0177400) { case 0000400: return("br"); case 0001000: return("bne"); case 0001400: return("beq"); case 0002000: return("bge"); case 0002400: return("blt"); case 0003000: return("bgt"); case 0003400: return("ble"); } switch(n&0177700) { case 0000100: return("jmp"); case 0000300: return("swab"); case 0005000: return("clr"); case 0005100: return("com"); case 0005200: return("inc"); case 0005300: return("dec"); case 0005400: return("neg"); case 0005500: return("adc"); case 0005600: return("sbc"); case 0005700: return("tst"); case 0006000: return("ror"); case 0006100: return("rol"); case 0006200: return("asr"); case 0006300: return("asl"); case 0006400: return("mark"); case 0006500: return("mfpi"); case 0006600: return("mtpi"); case 0006700: return("sxt"); } switch(n&0177740) { case 0000240: return("flag"); } switch(n&0177770) { case 0000200: return("rts"); case 0000230: return("spl"); } switch(n&0177777) { case 0000000: return("halt"); case 0000001: return("wait"); case 0000002: return("rti"); case 0000003: return("bpt"); case 0000004: return("iot"); case 0000005: return("rset"); case 0000006: return("rtt"); } break; case 0010000: return("mov "); case 0020000: return("cmp"); case 0030000: return("bit"); case 0040000: return("bic"); case 0050000: return("bis"); case 0060000: return("add"); case 0070000: switch(n&0177000) { case 0070000: return("mul"); case 0071000: return("div"); case 0072000: return("ash"); case 0073000: return("ashc"); case 0074000: return("xor"); } break; case 0100000: switch(n&0177400) { case 0100000: return("bpl"); case 0100400: return("bmi"); case 0101000: return("bhi"); case 0101400: return("blos"); case 0102000: return("bvc"); case 0102400: return("bvs"); case 0103000: return("bhis"); case 0103400: return("blo"); case 0104000: return("emt"); case 0104400: return("sys"); } switch(n&0177700) { case 0105000: return("clrb"); case 0105100: return("comb"); case 0105200: return("incb"); case 0105300: return("decb"); case 0105400: return("negb"); case 0105500: return("adcb"); case 0105600: return("sbcb"); case 0105700: return("tstb"); case 0106000: return("rorb"); case 0106100: return("rolb"); case 0106200: return("asrb"); case 0106300: return("aslb"); case 0106500: return("mfpd"); case 0106600: return("mfpd"); } break; case 0110000: return("movb"); case 0120000: return("cmpb"); case 0130000: return("bitb"); case 0140000: return("bicb"); case 0150000: return("bisb"); case 0160000: return("sub"); case 0170000: switch(n&01777000) { case 0:0; } break; } return("???"); } < = > ? @ A B C D E F G H I / passwd -- change user's password .globl mesg .globl crypt .globl getc .globl flush .globl fcreat .globl putc .globl fopen cmp (sp)+,$3 bge 1f jsr r5,mesg ; .even sys exit 1: tst (sp)+ mov (sp)+,uidp mov (sp)+,r0 tstb (r0) beq 1f jsr pc,crypt clrb 8(r0) 1: mov r0,cryptp mov $passwf,r0 jsr r5,fopen; ibuf bec 1f jsr r5,mesg ; .even sys exit 1: sys stat; tempf; obuf+20. bec 2f sys creat; tempf; 222 bec 1f 2: jsr r5,mesg ; .even sys exit 1: mov r0,obuf / search for uid comp: mov uidp,r1 1: jsr pc,pcop cmp r0,$': beq 1f cmpb r0,(r1)+ beq 1b 2: jsr pc,pcop cmp r0,$'\n bne 2b br comp 1: tstb (r1)+ bne 2b / skip over old password 1: jsr pc,pget cmp r0,$': bne 1b / copy in new password mov cryptp,r1 1: movb (r1)+,r0 beq 1f jsr pc,pput br 1b 1: mov $':,r0 jsr pc,pput / validate permission clr r1 1: jsr pc,pcop cmp r0,$': beq 1f mpy $10.,r1 sub $'0,r0 add r0,r1 br 1b 1: sys getuid tst r0 beq 1f cmp r0,r1 beq 1f jsr r5,mesg ; .even br done 1: inc sflg 1: jsr pc,pcop br 1b done: jsr r5,flush; obuf mov obuf,r0 sys close mov ibuf,r0 sys close tst sflg beq 1f tst dflg bne 1f inc dflg mov $tempf,r0 jsr r5,fopen; ibuf bec 2f jsr r5,mesg ; .even br 1f 2: mov $passwf,r0 jsr r5,fcreat; obuf bec 2f jsr r5,mesg ; .even br 1f 2: jsr pc,pcop br 2b 1: sys unlink; tempf sys exit pput: jsr r5,putc; obuf rts pc pget: jsr r5,getc; ibuf bes 1f rts pc 1: jsr r5,mesg ; .even br done pcop: jsr r5,getc; ibuf bes 1f jsr r5,putc; obuf rts pc 1: tst sflg bne 1f jsr r5,mesg ; .even 1: br done .data passwf: tempf: .even .bss ibuf: .=.+520. obuf: .=.+520. cryptp: .=.+2 uidp: .=.+2 sflg: .=.+2 dflg: .=.+2 / print last floating error stst = 170300^tst stst r1 cmp r1,$14 blos 1f clr r1 1: bic $1,r1 mov mesg(r1),r1 1: movb (r1)+,ch beq 1f mov $1,r0 sys write; ch; 1 br 1b 1: sys exit mesg: 1f 2f 3f 4f 5f 6f 7f 8f 1: 2: 3: 4: 5: 6: 7: 8: .even .bss ch: .=.+2 /* * print file with headings * 2+head+2+page[56]+5 */ int ncol 1; char *header; int col; int icol; int file; char *bufp; int bufs 5120; char buffer[5120]; int line; char *colp[72]; int peekc; int fpage; int page; int colw; int nspace; int width 72; int length 66; int ntflg; char *tty; int mode; struct inode { int dev; int inum; int flags; char nlink; char uid; char gid; char siz0; int size; int ptr[8]; int atime[2]; int mtime[2]; }; main(argc, argv) char **argv; { int nfdone; int onintr(); extern fout; tty = "/dev/ttyx"; fout = dup(1); close(1); if ((signal(2, 1) & 01) == 0) signal(2, onintr); fixtty(); for (nfdone=0; argc>1; argc--) { argv++; if (**argv == '-') { switch (*++*argv) { case 'h': if (argc>=2) { header = *++argv; argc--; } continue; case 't': ntflg++; continue; case 'l': length = getn(++*argv); continue; case 'w': width = getn(++*argv); continue; default: ncol = getn(*argv); continue; } } else if (**argv == '+') { fpage = getn(++*argv); } else { print(*argv); nfdone++; } } if (nfdone==0) print(0); flush(); onintr(); } onintr() { chmod(tty, mode); exit(0); } fixtty() { struct inode sbuf; extern fout; tty[8] = ttyn(fout); fstat(fout, &sbuf); mode = sbuf.flags&0777; chmod(tty, 0600); } print(fp) char *fp; { struct inode sbuf; register int sncol, sheader; register char *cbuf; extern fout; if (length <= 10) length = 66; if (width <= 0) width = 72; if (ncol>72 || ncol>width) { write(fout, "Very funny.\n", 12); exit(); } colw = width/ncol; sncol = ncol; sheader = header; if (--ncol<0) ncol = 0; if (fp) { file = open(fp, 0); if (file<0) return; fstat(file, &sbuf); } else { file = 0; time(sbuf.mtime); } if (header == 0) header = fp; cbuf = ctime(sbuf.mtime); cbuf[16] = '\0'; page = 1; icol = 0; colp[ncol] = bufp = buffer; nexbuf(); while (tgetc(ncol)) { colp[ncol]--; if (colp[ncol] < buffer) colp[ncol] = &buffer[bufs]; line = 0; if (ntflg==0) { puts("\n\n"); puts(cbuf+4); puts(" "); puts(header); puts(" Page "); putd(page); puts("\n\n\n"); } putpage(); if (ntflg==0) while(line512) n = 512; if ((n = read(file, rbufp, n)) <= 0) *rbufp = 0376; else { rbufp =+ n; if (rbufp >= &buffer[bufs]) rbufp = buffer; *rbufp = 0375; } bufp = rbufp; } tgetc(ai) { register char **p; register int c, i; i = ai; loop: c = **(p = &colp[i]) & 0377; if (c == 0375) { nexbuf(); c = **p & 0377; } if (c == 0376) return(0); (*p)++; if (*p >= &buffer[bufs]) *p = buffer; if (c==0) goto loop; return(c); } getc(i) { register int c; if (peekc) { c = peekc; peekc = 0; } else c = tgetc(i); switch (c) { case '\t': icol++; if ((icol&07) != 0) peekc = '\t'; return(' '); case '\n': icol = 0; break; case 010: case 033: icol--; break; } if (c >= ' ') icol++; return(c); } puts(as) char *as; { register int c; register char *s; if ((s=as)==0) return; while (c = *s++) put(c); } putd(an) { register int a, n; n = an; if (a = n/10) putd(a); put(n%10 + '0'); } put(ac) { register int ns, c; c = ac; switch (c) { case ' ': nspace++; col++; return; case '\n': col = 0; nspace = 0; line++; break; case 010: case 033: if (--col<0) col = 0; if (--nspace<0) nspace = 0; } while(nspace) { if (nspace>2 && col > (ns=((col-nspace)|07))) { nspace = col-ns-1; putcp('\t'); } else { nspace--; putcp(' '); } } if (c >= ' ') col++; putcp(c); } getn(ap) char *ap; { register int n, c; register char *p; p = ap; n = 0; while ((c = *p++) >= '0' && c <= '9') n = n*10 + c - '0'; return(n); } putcp(c) { if (page >= fpage) putchar(c); } P Q R S T U V W X Y /* * Print execution profile */ struct nl { char name[8]; int value; float time; int ncall[2]; }; struct nl nl[600]; struct fnl { char fname[8]; int flag; int fvalue; }; struct cnt { int cvalue; int cncall[2]; } cbuf[200]; struct inode { int idev; int inum; int flags; char nlink; char uid; char gid; char size0; int size; int ptr[8]; int ctime[2]; int mtime[2]; int fill; }; int buf[17]; int i; int j; int highpc; int lowpc; int ccnt; int pcl; int pch; int bufs; int nname; double time; double totime; double maxtime; double scale; double lastx; double lasty; struct nl *np; struct nl *npe; int aflg; int vflg; int lflg; int symoff; int symsiz; int vf; int etext; int fout; int ncount; main(argc, argv) char **argv; { char *namfil; int timcmp(), valcmp(); int nf, pf, overlap; double fnc, ltod(); struct cnt *cp; fout = dup(1); argv++; namfil = "a.out"; while (argc>1) { if (**argv == '-') { if (*++*argv == 'l') lflg++; if (**argv == 'a') aflg = 040; if(**argv == 'v') vflg++; } else namfil = *argv; argc--; argv++; } if ((nf = open(namfil, 0)) < 0) { printf("Can't find %s\n", namfil); done(); } read(nf, buf, 020); if (buf[0] != 0407 && buf[0] != 0410) { /* a.out magic */ printf("Bad format: %s\n", namfil); done(); } symsiz = buf[4]; symoff = buf[1] + buf[2]; if (buf[7] != 1) symoff =<< 1; seek(nf, symoff+020, 0); if ((pf = open("mon.out", 0)) < 0) { printf("No mon.out\n"); done(); } fstat(pf, buf); read(pf, &lowpc, 2); read(pf, &highpc, 2); read(pf, &ncount, 2); bufs = buf->size/2 - 3*(ncount+1); read(pf, cbuf, ncount*6); lowpc = (lowpc>>1) & 077777; highpc = (highpc>>1) & 077777; npe = nl; for (nname = 0; symsiz > 0; symsiz =- 12) { read(nf, buf, 12); if ((buf->flag | aflg) != 042) continue; buf->fvalue = (buf->fvalue>>1) & 077777; npe->value = buf->fvalue; for (i=0; i<8; i++) npe->name[i] = buf->fname[i]; npe++; nname++; } if (nname == 0) { printf("No symbols: %s\n", namfil); done(); } npe->value = 077777; npe++; for (cp = cbuf; cp < &cbuf[ncount]; cp++) for (np = nl; np < npe; np++) if (cp->cvalue-6 == np->value<<1) { np->ncall[0] = cp->cncall[0]; np->ncall[1] = cp->cncall[1]; break; } qsort(nl, nname, 18, &valcmp); scale = (highpc-lowpc)/(bufs+0.0); for (i = -1; read(pf, &ccnt, 2)==2; i++) { if (ccnt == 0) continue; time = ccnt; if (ccnt<0) time =+ 65536.; totime =+ time; if(time > maxtime) maxtime = time; pcl = lowpc + scale*i; pch = lowpc + scale*(i+1); for (j=0; j= nl[j+1].value) continue; overlap=(min(pch,nl[j+1].value)-max(pcl,nl[j].value)); nl[j].time =+ overlap*time/scale; } } if (totime==0.0) { printf("No time accumulated\n"); done(); } if(!vflg) goto print; vf = open("/dev/vt0", 1); if(vf < 0) { printf("Cannot open vt\n"); done(); } fout = vf; vtch(1); vtch(1); vtch(3); point(-2048., -2048.); point(-2048., 2048.); vtch(3); point(0., -2048.); point(0., 2048.); for(j=0; j<9; j++) { vtch(3); point(-2048., 2048. - j*512.); point(0., 2048. - j*512.); } lastx = 0.; lasty = 2048.; scale = 4096./(i-1); seek(pf, 6*(ncount+1), 0); while(read(pf, &ccnt, 2)==2) { time = ccnt; if(ccnt < 0) time =+ 65536.; vtch(3); point(lastx, lasty); lastx = -time*2000./maxtime; point(lastx, lasty); vtch(3); point(lastx, lasty); lasty =- scale; point(lastx, lasty); } scale = 4096./(highpc-lowpc); lastx = 50.; for(np = nl; npvalue < lowpc) continue; if(np->value >= highpc) continue; time = np->time/totime; lasty = 2048. - (np->value - lowpc)*scale; vtch(3); point(0., lasty); point(50., lasty); vtch(3); point(lastx-50., lasty); point(lastx, lasty); vtch(9); point(lastx+10., lasty+60.); vtch(1); vtch(3); for(j=0; j<8; j++) if(np->name[j] != '_') vtch(np->name[j]); vtch(0); lastx =+ 500.; if(lastx > 2000.) lastx = 50.; } done(); print: printf(" name %%time #call ms/call\n"); if (!lflg) qsort(nl, nname, 18, &timcmp); for (np = nl; nptime/totime; printf("%8.8s%6.1f", np->name, 100*time); fnc = ltod(np->ncall); if (fnc != 0.0) { printf("%6s", locv(np->ncall[0], np->ncall[1])); printf(" %7.2f\n", np->time/(fnc*.06)); } else printf("\n"); } done(); } min(a, b) { if (ab) return(a); return(b); } valcmp(p1, p2) struct nl *p1, *p2; { return(p1->value - p2->value); } timcmp(p1, p2) struct nl *p1, *p2; { float d; d = p2->time - p1->time; if (d > 0.0) return(1); if (d < 0.0) return(-1); return(0); } vtch(c) int c; { putchar(c&0377); } point(x, y) float x, y; { point1(x); point1(y); } point1(xy) float xy; { int ixy; struct { char b1; char b2;}; if(xy > 2047.) xy = 2047.; if(xy < -2048.) xy = -2048.; ixy = xy; vtch(ixy.b1); vtch(ixy.b2); } done() { flush(); exit(); } [ \ ] ^ _ ` a b c d # #include "/usr/sys/param.h" #include "/usr/sys/proc.h" #include "/usr/sys/tty.h" #include "/usr/sys/user.h" #define NDC11 10 #define NKL11 4 #define NDH11 16 struct { char name[8]; int type; char *value; } nl[5]; struct proc proc[1]; struct user u; int lflg; int kflg; int xflg; int tflg; int aflg; int mem; int swap; int stbuf[257]; char *coref; main(argc, argv) char **argv; { struct proc *p; int n, b; int i, c, mtty; char *ap; int hmem; if (argc>1) { ap = argv[1]; while (*ap) switch (*ap++) { case 'a': aflg++; break; case 't': tflg++; break; case 'x': xflg++; break; case 'l': lflg++; break; case 'k': kflg++; break; } } setup(&nl[0], "_proc"); setup(&nl[1], "_dc11"); setup(&nl[2], "_kl11"); setup(&nl[3], "_dh11"); nlist("/unix", nl); if (nl[0].type==0) { printf("No namelist\n"); return; } coref = "/dev/mem"; if(kflg) coref = "/dev/rk0"; if ((hmem = open(coref, 0)) < 0) { printf("No mem\n"); return; } mem = open(coref, 0); swap = open("/dev/rf0", 0); n = &proc[1]; b = &proc; n =- b; seek(hmem, nl[0].value, 0); mtty = ttyn(0); for (i=0; i>3); if (proc[0].p_wchan) printf("%8o", proc[0].p_wchan); else printf(" "); } prcom(); printf("\n"); } } ttyc(p) struct tty *p; { int n; struct { struct tty xdc11[]; }; n = p - nl[1].value->xdc11; if (n>=0 && nxdc11; if(n>=0 && nxdc11; if(n>=0 && n>3; laddr = (laddr&07)<<6; seek(mf, baddr, 3); seek(mf, laddr, 1); if (read(mf, stbuf, 512) != 512) return(0); for (ip = &stbuf[256]; ip > &stbuf[0];) { if (*--ip == -1) { cp = ip+1; if (*cp==0) cp++; for (cp1 = cp; cp1 < &stbuf[256]; cp1++) { c = *cp1; if (c==0) *cp1 = ' '; else if (c < ' ' || c > 0176) *cp1 = '?'; } printf(" %.32s ", cp); return(1); } } return(0); } char dot[] "."; char dotdot[] ".."; char root[] "/"; char name[512]; int file, off -1; struct statb {int devn, inum, i[18];}x; struct entry { int jnum; char name[16];}y; main() { int n; loop0: stat(dot, &x); if((file = open(dotdot,0)) < 0) prname(); loop1: if((n = read(file,&y,16)) < 16) prname(); if(y.jnum != x.inum)goto loop1; close(file); if(y.jnum == 1) ckroot(); cat(); chdir(dotdot); goto loop0; } ckroot() { int i, n; if((n = stat(y.name,&x)) < 0) prname(); i = x.devn; if((n = chdir(root)) < 0) prname(); if((file = open(root,0)) < 0) prname(); loop: if((n = read(file,&y,16)) < 16) prname(); if(y.jnum == 0) goto loop; if((n = stat(y.name,&x)) < 0) prname(); if(x.devn != i) goto loop; x.i[0] =& 060000; if(x.i[0] != 040000) goto loop; cat(); prname(); } prname() { name[off] = '\n'; write(1,name,off+1); exit(); } cat() { int i, j; i = -1; while(y.name[++i] != 0); if((off+i+2) > 511) prname(); for(j=off+1; j>=0; --j) name[j+i+1] = name[j]; off=i+off+1; name[i] = root[0]; for(--i; i>=0; --i) name[i] = y.name[i]; } # /* * restore from incremental dumps */ char *dargv[] { 0, "t", 0 }; char *ifile "/dev/mt0"; char *ofile; struct inode { int i_mode; char i_nlink; char i_uid; char i_gid; char i_size0; char *i_size1; int i_addr[8]; int i_atime[2]; int i_mtime[2]; }; /* modes */ #define IALLOC 0100000 #define IFMT 060000 #define IFDIR 040000 #define IFCHR 020000 #define IFBLK 060000 #define ILARG 010000 struct { char *s_isize; char *s_fsize; int s_nfree; int s_free[100]; int s_ninode; int s_inode[100]; char s_flock; char s_ilock; char s_fmod; int time[2]; int pad[50]; } sblock; int isize; int *talist; int fi; int buf[256]; int dbuf[256]; int cbuf[256]; char *date[2]; char *ddate[2]; int fo; int pher; char *tsize 15000; int iflg; int wflg; char file[10]; int ilist[100]; main(argc, argv) char **argv; { char *key; register *tap, *p; register struct inode *ip; int i, com, sz, *q; if(argc == 1) { argv = dargv; for(argc = 1; dargv[argc]; argc++); } argc--; argv++; key = *argv; while(*key) switch(*key++) { default: printf("bad characteer in key\n"); exit(); case 't': case 'r': case 'x': com = key[-1]; continue; case 'i': iflg++; continue; case 'w': wflg++; continue; } otape(); sread(buf, 0); tap = buf; isize = *tap++; *tap++; /* fsize */ date[0] = *tap++; date[1] = *tap++; ddate[0] = *tap++; ddate[1] = *tap++; tsize = *tap++; i = size(0, isize*32); talist = sbrk(i*512); tap = talist; while(i--) { tread(tap, 0); tap =+ 256; } switch(com) { case 't': com = 0; pdate(ddate); pdate(date); tap = talist; for(i=0; i sblock.s_isize) { printf("isize too small\n"); continue; } sread(dbuf, 0); dealoc(ip); q = dbuf; for(p = ip; p < &ip->i_mtime[2]; ) *p++ = *q++; restor(ip, sz-1); } dwrite(i+2, buf); } dwrite(1, &sblock); exit(); case 'x': tap = ilist; while(argc > 1) { *tap++ = number(argv[1]); argv++; argc--; } tap = talist; for(i=0; ii_size0 == 0 && ip->i_size1 < 512) com = ip->i_size1; write(fo, dbuf, com); if(com > ip->i_size1) ip->i_size0--; ip->i_size1 =- com; } close(fo); chmod(file, ip->i_mode); chown(file, ip->i_uid); } exit(); } } dealoc(p) struct inode *p; { register struct inode *ip; register i, j; int xbuf[256]; ip = p; if(ip->i_mode & (IFCHR&IFBLK)) return; for(i=0; i<8; i++) if(ip->i_addr[i]) { if(ip->i_mode&ILARG) { dread(ip->i_addr[i], xbuf); for(j=0; j<256; j++) if(xbuf[j]) free(xbuf[j]); } free(ip->i_addr[i]); } } restor(p, sz) struct inode *p; { register struct inode *ip; register i, j; ip = p; if(ip->i_mode & (IFCHR&IFBLK)) return; for(i=0; i<8; i++) ip->i_addr[i] = 0; if(sz <= 8) { for(i=0; ii_addr[i] = rcop(); ip->i_mode =& ~ILARG; return; } j = 0; while(sz >= 256) { for(i=0; i<256; i++) dbuf[i] = rcop(); ip->i_addr[j] = alloc(); dwrite(ip->i_addr[j++], dbuf); sz =- 256; } if(sz) { for(i=0; i<256; i++) dbuf[i] = 0; for(i=0; ii_addr[j] = alloc(); dwrite(ip->i_addr[j], dbuf); } ip->i_mode =| ILARG; } rcop() { register b; b = alloc(); tread(cbuf, 0); dwrite(b, cbuf); return(b); } pdate(d) int *d; { if(d[0] == 0 && d[1] == 0) printf("the epoch\n"); else printf(ctime(d)); } dread(bno, b) { seek(fo, bno, 3); if(read(fo, b, 512) != 512) { printf("read error %l\n", bno); exit(); } } dwrite(bno, b) { seek(fo, bno, 3); if(write(fo, b, 512) != 512) { printf("write error %l\n", bno); exit(); } } sread(b, flag) int *b; { register i, s, *p; tread(b, flag); if(flag) return; i = 256; s = 0; p = b; while(i--) s =+ *p++; if(s != 031415) { printf("checksum error\n"); exit(); } } tread(b, flag) { static char *ta; if(ta++ > tsize) { printf("change tapes\n"); close(fi); while((ta = getchar()) != '\n') if(ta == 0) exit(); ta = 0; otape(); } if(flag) seek(fi, 1, 4); else if(read(fi, b, 512) != 512) { printf("read error\n"); exit(); } } number(s) char *s; { register n, c; n = 0; while(c = *s++) { if(c<'0' || c>'9') continue; n = n*10+c-'0'; } return(n); } size(s0, s1) { register s; extern ldivr; s = ldiv(s0&0377, s1, 512); if(ldivr) s++; return(s); } otape() { fi = open(ifile, 0); if(fi < 0) { printf("can not open %s\n", ifile); exit(); } } dwait(ino) { register i; dconv(ino, file); loop: if(wflg) { printf("%s ", file); i = getchar(); if(i == 'x') exit(); if(i == '\n') return(-1); if(i != 'y') goto flush; i = getchar(); if(i != '\n') { flush: while((i=getchar()) != '\n') if(i == '\0') exit(); goto loop; } } i = creat(file, 0666); return(i); } dconv(n, p) char *p; { register i; if(i = ldiv(0, n, 10)) p = dconv(i, p); *p++ = lrem(0, n, 10) + '0'; *p = '\0'; return(p); } alloc() { register b, i; i = --sblock.s_nfree; if(i<0 || i>=100) { printf("bad freeblock\n"); exit(); } b = sblock.s_free[i]; if(b == 0) { printf("out of freelist\n"); exit(); } if(sblock.s_nfree <= 0) { dread(b, cbuf); sblock.s_nfree = cbuf[0]; for(i=0; i<100; i++) sblock.s_free[i] = cbuf[i+1]; } return(b); } free(in) { register i; if(sblock.s_nfree >= 100) { cbuf[0] = sblock.s_nfree; for(i=0; i<100; i++) cbuf[i+1] = sblock.s_free[i]; sblock.s_nfree = 0; dwrite(in, cbuf); } sblock.s_free[sblock.s_nfree++] = in; } o p q r s t u v w x y z { / rew -- rewind dec/mag tape cmp (sp)+,$2 blt 1f tst (sp)+ mov (sp)+,r0 movb (r0)+,r1 cmp r1,$'m beq rewm movb r1,tapx+8 tstb (r0) bne error 1: sys open; tapx; 0 br rew rewm: movb (r0)+,r1 beq 1f movb r1,mtx+7 tstb (r0) bne error 1: sys open; mtx; 0 rew: bes error sys read; word; 2 bes error sys exit error: mov $1,r0 sys write; 0f; 2 sys exit 0: tapx: mtx: .even .bss word: .=.+2 main(argc, argv) char *argv[]; { char *arg; int fflg, rflg; fflg = 0; rflg = 0; while(--argc > 0) { arg = *++argv; if(arg[0] == '-') { if(arg[1] == 'f') { fflg++; continue; } if(arg[1] == 'r') { rflg++; continue; } } rm(arg, fflg, rflg); } } struct stbuf { int dev; int inum; int mode; char nlink; char uid; char gid; char siz0; char siz1; int addr[8]; int adate[2]; int mdate[2]; }; rm(arg, fflg, rflg) char arg[]; { char *p; int buf[20]; int i, b; if(stat(arg, buf)) { printf("%s: non existent\n", arg); return; } if((buf->mode & 060000) == 040000) { if(rflg) { i = fork(); if(i < 0) { printf("%s: try again\n", arg); return; } if(i) { while(wait() != i); return; } if(chdir(arg)) { printf("%s: cannot chdir\n", arg); exit(); } p = 0; execl("/etc/glob", "glob", "rm", "-r", fflg? "-f": "*", fflg? "*": p, 0); printf("%s: no glob\n", arg); exit(); } printf("%s: directory\n", arg); return; } if(!fflg) { if(getuid() == buf->uid) b = 0200; else b = 2; if((buf->mode & b) == 0) { printf("%s: %o mode ", arg, buf->mode); i = b = getchar(); i = b; while(b != '\n' && b != '\0') b = getchar(); if(i != 'y') return; } } if(unlink(arg)) printf("%s: not removed\n", arg); } putchar(c) { write(1, &c, 1); } getchar() { char c; if(read(0, &c, 1) != 1) return(0); return(c); } / rmdir -- unlink directory mov (sp)+,r5 tst (sp)+ loop: dec r5 ble done mov (sp)+,r1 mov $name,r2 clr r0 1: inc r0 movb (r1)+,(r2)+ bne 1b dec r2 dec r0 mov r0,size cmp r2,$name beq error sys stat; name; stbuf bes error bic $!60000,stbuf+4 cmp $40000,stbuf+4 bne error cmpb -1(r2),$'. bne 1f cmp r2,$name+1 beq error cmpb -2(r2),$'/ beq error cmpb -2(r2),$'. bne 1f cmp r2,$name+2 beq error cmpb -3(r2),$'/ beq error 1: sys open; name; 0 bes error mov r0,r1 1: mov r1,r0 sys read; stbuf; 16. bes 1f tst r0 beq 1f tst stbuf beq 1b cmpb stbuf+2,$'. bne error1 tstb stbuf+3 beq 1b cmpb stbuf+3,$'. bne error1 tstb stbuf+4 beq 1b error1: jsr pc,prname mov r1,r0 sys close mov $1,r0 sys write; mes1; emes1-mes1 br loop 1: mov r1,r0 sys close movb $'/,(r2)+ movb $'.,(r2)+ movb $'.,(r2)+ clrb (r2) sys unlink; name clrb -(r2) sys unlink; name clrb -2(r2) sys unlink; name br loop error: jsr pc,prname mov $1,r0 sys write; mes2; emes2-mes2 br loop prname: mov $1,r0 sys write; name; size:.. rts pc done: sys exit mes1: < -- directory not empty\n> emes1: mes2: < ?\n> emes2: .even .bss name: .=.+40. stbuf: .=.+40. #define size 1000 /* interpret command time accounting */ int lflg; int cflg; int jflg; int nflg; int aflg; int rflg; int tflg; int vflg; int uflg; int thres 1; int sflg; int bflg; int fout; struct tab { char name[8]; int count; float realt; float cput; float syst; } tab[size]; struct ftab { char fname[8]; char fill1[4]; char fill2; char uid; int frealt; int fcput; int fsyst; }; float treal; float tcpu; float tsys; int junkp -1; char *sname; float ncom; main(argc, argv) char **argv; { int i, j, k; extern tcmp(), ncmp(), bcmp(); extern float sum(); float ft; init(); if (argc>1) if (argv[1][0]=='-') { argv++; argc--; for(i=1; argv[0][i]; i++) switch(argv[0][i]) { case 'b': bflg++; break; case 'l': lflg++; break; case 'c': cflg++; break; case 'j': jflg++; break; case 'n': nflg++; break; case 'a': aflg++; break; case 'r': rflg++; break; case 't': tflg++; break; case 's': sflg++; aflg++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': thres = argv[0][i]-'0'; break; case 'v': vflg++; break; case 'u': uflg++; break; } } fout = dup(1); if (argc<2) acct("/usr/adm/sh_acct"); else while (--argc) acct(*++argv); if (uflg) { flush(); return; } /* * cleanup pass * put junk together */ if (vflg) strip(); if(!aflg) for (i=0; i= 0200)) *cp = '?'; } if (uflg) { printf("%3d %.8s\n", fbuf.uid, fbuf.name); continue; } ncom =+ 1.0; i = enter(&fbuf); tab[i].count++; x = fbuf.frealt; if (x<0.) x =+ 65536.; x =* 60.; tab[i].realt =+ x; treal =+ x; x = fbuf.fcput; if (x<0.) x =+ 65536.; tab[i].cput =+ x; tcpu =+ x; x = fbuf.fsyst; if (x<0.) x =+ 65536.; tab[i].syst =+ x; tsys =+ x; } close(ff); } ncmp(p1, p2) struct tab *p1, *p2; { if(p1->count == p2->count) return(tcmp(p1, p2)); if(rflg) return(p1->count - p2->count); return(p2->count - p1->count); } bcmp(p1, p2) struct tab *p1, *p2; { float f1, f2; float sum(); f1 = sum(p1)/p1->count; f2 = sum(p2)/p2->count; if(f1 < f2) { if(rflg) return(-1); return(1); } if(f1 > f2) { if(rflg) return(1); return(-1); } return(0); } tcmp(p1, p2) struct tab *p1, *p2; { extern float sum(); float f1, f2; f1 = sum(p1); f2 = sum(p2); if(f1 < f2) { if(rflg) return(-1); return(1); } if(f1 > f2) { if(rflg) return(1); return(-1); } return(0); } float sum(p) struct tab *p; { if(p->name[0] == 0) return(0.0); return( p->cput+ p->syst); } init() { struct tab tbuf; int i, j, f; if ((f=open("/usr/adm/sht_acct", 0))<0) return; while (read(f, &tbuf, 22) == 22) { i = enter(&tbuf); ncom =+ tbuf.count; tab[i].count = tbuf.count; treal =+ tbuf.realt; tab[i].realt = tbuf.realt; tcpu =+ tbuf.cput; tab[i].cput = tbuf.cput; tsys =+ tbuf.syst; tab[i].syst = tbuf.syst; } close(f); } enter(fbuf) struct ftab *fbuf; { int i, j; i = 0; for (j=0; j<8; j++) { i = i*7 + fbuf->fname[j]; } if(i < 0) i = -i; for (i=%size; tab[i].name[0]; i = (i+1)%size) { for (j=0; j<8; j++) if (tab[i].name[j]!=fbuf->fname[j]) goto no; goto yes; no:; } for (j=0; j<8; j++) tab[i].name[j] = fbuf->fname[j]; yes: return(i); } strip() { int i, j, k, c; j = enter("**junk**"); for (i = 0; i 1) { promp = 0; close(0); f = open(v[1], 0); if(f < 0) { prs(v[1]); err(": cannot open"); } } if(**v == '-') { setintr++; signal(quit, 1); signal(intr, 1); } dolv = v+1; dolc = c-1; loop: if(promp != 0) prs(promp); peekc = getc(); main1(); goto loop; } main1() { char line[linesiz]; char *args[argsiz]; int trebuf[tresiz]; register char c, *cp; register *t; argp = args; eargp = args+argsiz-5; linep = line; elinep = line+linesiz-5; error = 0; gflg = 0; do { cp = linep; word(); } while(*cp != '\n'); treep = trebuf; if(gflg == 0) { if(error == 0) t = syntax(args, argp); if(error != 0) err("syntax error"); else execute(t); } } word() { register char c, c1; *argp++ = linep; loop: switch(c = getc()) { case ' ': case '\t': goto loop; case '\'': case '"': c1 = c; while((c=readc()) != c1) { if(c == '\n') { error++; peekc = c; return; } *linep++ = c|quote; } goto pack; case '&': case ';': case '<': case '>': case '(': case ')': case '|': case '^': case '\n': *linep++ = c; *linep++ = '\0'; return; } peekc = c; pack: for(;;) { c = getc(); if(any(c, " '\"\t;&<>()|^\n")) { peekc = c; if(any(c, "\"'")) goto loop; *linep++ = '\0'; return; } *linep++ = c; } } tree(n) int n; { register *t; t = treep; treep =+ n; return(t); } getc() { register char c; if(peekc) { c = peekc; peekc = 0; return(c); } if(argp > eargp) { argp =- 10; while((c=getc()) != '\n'); argp =+ 10; err("Too many args"); gflg++; return(c); } if(linep > elinep) { linep =- 10; while((c=getc()) != '\n'); linep =+ 10; err("Too many characters"); gflg++; return(c); } getd: if(dolp) { c = *dolp++; if(c != '\0') return(c); dolp = 0; } c = readc(); if(c == '\\') { c = readc(); if(c == '\n') return(' '); return(c|quote); } if(c == '$') { c = getc(); if(c>='0' && c<='9') { if(c-'0' < dolc) dolp = dolv[c-'0']; goto getd; } } return(c&0177); } readc() { int c; if(read(0, &c, 1) != 1) exit(); return(c&0377); } /* * syntax * empty * syn1 */ syntax(p1, p2) char **p1, **p2; { while(p1 != p2) { if(any(**p1, ";&\n")) p1++; else return(syn1(p1, p2)); } return(0); } /* * syn1 * syn2 * syn2 & syntax * syn2 ; syntax */ syn1(p1, p2) char **p1, **p2; { register char **p; register *t, *t1; int l; l = 0; for(p=p1; p!=p2; p++) switch(**p) { case '(': l++; continue; case ')': l--; if(l < 0) error++; continue; case '&': case ';': case '\n': if(l == 0) { t = tree(4); t[dtyp] = tlst; t[dlef] = syn2(p1, p); t[dflg] = 0; if(**p == '&') { t1 = t[dlef]; t1[dflg] =| fand|fint; } t[drit] = syntax(p+1, p2); return(t); } } if(l == 0) return(syn2(p1, p2)); error++; } /* * syn2 * syn3 * syn3 | syn2 */ syn2(p1, p2) char **p1, **p2; { char **p; int l, *t; l = 0; for(p=p1; p!=p2; p++) switch(**p) { case '(': l++; continue; case ')': l--; continue; case '|': case '^': if(l == 0) { t = tree(4); t[dtyp] = tfil; t[dlef] = syn3(p1, p); t[drit] = syn2(p+1, p2); t[dflg] = 0; return(t); } } return(syn3(p1, p2)); } /* * syn3 * ( syn1 ) [ < in ] [ > out ] * word word* [ < in ] [ > out ] */ syn3(p1, p2) char **p1, **p2; { register char **p; char **lp, **rp; register *t; int b[100], n, l, i, o, c, flg; flg = 0; if(**p2 == ')') flg =| fpar; lp = 0; rp = 0; i = 0; o = 0; n = 0; l = 0; for(p=p1; p!=p2; p++) switch(c = **p) { case '(': if(l == 0) { if(lp != 0) error++; lp = p+1; } l++; continue; case ')': l--; if(l == 0) rp = p; continue; case '>': p++; if(p!=p2 && **p=='>') flg =| fcat; else p--; case '<': if(l == 0) { p++; if(p == p2) { error++; p--; } if(any(**p, "<>(")) error++; if(c == '<') { if(i != 0) error++; i = *p; continue; } if(o != 0) error++; o = *p; } continue; default: if(l == 0) b[n++] = *p; } if(lp != 0) { if(n != 0) error++; t = tree(5); t[dtyp] = tpar; t[dspr] = syn1(lp, rp); goto out; } if(n == 0) error++; b[n++] = 0; t = tree(n+5); t[dtyp] = tcom; for(l=0; l= 0) { seek(i, 0, 2); goto f1; } } i = creat(t[drit], 0666); if(i < 0) { prs(t[drit]); err(": cannot create"); exit(); } f1: close(1); dup(i); close(i); } if((f&fpin) != 0) { close(0); dup(pf1[0]); close(pf1[0]); close(pf1[1]); } if((f&fpou) != 0) { close(1); dup(pf2[1]); close(pf2[0]); close(pf2[1]); } if((f&fint)!=0 && t[dlef]==0 && (f&fpin)==0) { close(0); open("/dev/null", 0); } if((f&fint) == 0 && setintr) { signal(intr, 0); signal(quit, 0); } if(t[dtyp] == tpar) { if(t1 = t[dspr]) t1[dflg] =| f&fint; execute(t1); exit(); } close(acctf); gflg = 0; scan(t, &tglob); if(gflg) { t[dspr] = "/etc/glob"; execv(t[dspr], t+dspr); prs("glob: cannot execute\n"); exit(); } scan(t, &trim); execv(t[dcom], t+dcom); cp1 = linep; cp2 = "/usr/bin/"; while(*cp1 = *cp2++) cp1++; cp2 = t[dcom]; while(*cp1++ = *cp2++); execv(linep+4, t+dcom); execv(linep, t+dcom); if(runcom()) { t[dspr] = "/bin/sh"; t[dcom] = linep; execv(t[dspr], t+dspr); } prs(t[dcom]); err(": not found"); exit(); case tfil: f = t[dflg]; pipe(pv); t1 = t[dlef]; t1[dflg] =| fpou | (f&(fpin|fint)); execute(t1, pf1, pv); t1 = t[drit]; t1[dflg] =| fpin | (f&(fpou|fint|fand)); execute(t1, pv, pf2); return; case tlst: f = t[dflg]&fint; if(t1 = t[dlef]) t1[dflg] =| f; execute(t1); if(t1 = t[drit]) t1[dflg] =| f; execute(t1); return; } } err(s) char *s; { prs(s); prs("\n"); if(promp == 0) { seek(0, 0, 2); exit(); } } prs(s) char *s; { while(*s) putc(*s++); } putc(c) { write(2, &c, 1); } prn(n) int n; { register a; if(a=ldiv(0,n,10)) prn(a); putc(lrem(0,n,10)+'0'); } any(c, s) int c; char *s; { while(*s) if(*s++ == c) return(1); return(0); } equal(s1, s2) char *s1, *s2; { while(*s1++ == *s2) if(*s2++ == '\0') return(1); return(0); } pwait(i, t) int i, *t; { register p, e; int s; if(i != 0) for(;;) { times(&timeb); time(timeb.proct); p = wait(&s); if(p == -1) break; e = s&0177; if(mesg[e] != 0) { if(p != i) { prn(p); prs(": "); } prs(mesg[e]); if(s&0200) prs(" -- Core dumped"); } if(e != 0) err(""); if(i == p) { acct(t); break; } else acct(0); } } acct(t) int *t; { if(t == 0) enacct("**gok"); else if(*t == tpar) enacct("()"); else enacct(t[dcom]); } enacct(s) char *s; { struct stime timbuf; struct { char cname[14]; int realt; int bcput; int bsyst; } tbuf; register i; register char *np; times(&timbuf); time(timbuf.proct); tbuf.realt = timbuf.proct[1] - timeb.proct[1]; tbuf.bcput = timbuf.cputim[1] - timeb.cputim[1]; tbuf.bsyst = timbuf.systim[1] - timeb.systim[1]; do { np = s; while (*s != '\0' && *s != '/') s++; } while (*s++ != '\0'); for (i=0; i<13; i++) { tbuf.cname[i] = *np; if (*np) np++; } tbuf.cname[13] = uid; seek(acctf, 0, 2); write(acctf, &tbuf, 20); } runcom() { int buf[40]; if(stat(linep, buf) < 0) return(0); if((buf[2]&060111) != 0) return(0); return(1); } /* size -- determine object size */ main(argc, argv) char **argv; { int buf[010], f, ac, sum; ac = argc; if (ac==1) { *argv = "a.out"; ac++; --argv; } while(--ac) { ++argv; if((f=open(*argv, 0))<0) { printf("%s not found\n", *argv); continue; } read(f, buf, 0020); if(buf[0]!=0410 && buf[0]!=0407) { printf("Bad format: %s\n", *argv); close(f); continue; } if (argc>2) printf("%s: ", *argv); printf("%l+%l+%l=", buf[1],buf[2],buf[3]); sum = buf[1]+buf[2]+buf[3]; printf("%l (%o)\n", sum, sum); close(f); } } main(argc, argv) char **argv; { int c, n; char *s; n = 0; if(argc < 2) { printf("arg count\n"); exit(); } s = argv[1]; while(c = *s++) { if(c<'0' || c>'9') { printf("bad character\n"); exit(); } n = n*10 + c - '0'; } sleep(n); } #define L 512 #define N 7 #define C 20 #define MEM (16*2048) int ibuf[259]; int obuf[259]; char *file; char *filep; int nfiles; int nlines; int ntext; int *lspace; char *tspace; int aflg; int dflg; int mflg; int nflg; int rflg 1; int sfield -1; int schar; int cmp(); char map[256]; int term(); char *outfil; int eargc; char **eargv; main(argc, argv) char **argv; { extern char end; register a; char *arg; eargv = argv; while (--argc > 0) { if(**++argv == '-') for(arg = *argv;;) { switch(*++arg) { case '\0': if(arg[-1] == '-') eargv[eargc++] = "-"; break; case 'a': aflg++; continue; case 'd': dflg++; continue; case 'm': mflg++; continue; case 'n': nflg++; continue; case 'o': if(--argc > 0) outfil = *++argv; continue; case 'r': rflg = -1; continue; default: sfield = number(++*argv); break; } break; } else if (**argv == '+') schar = number(++*argv); else eargv[eargc++] = *argv; } if(eargc == 0) eargv[eargc++] = "-"; for(a=0; a<128; a++) (map+128)[a] = a; if(!aflg) for(a='a'; a<='z'; a++) (map+128)[a] = (map+128)[a-'a'+'A']; (map+128)['\n'] = 0; if(rflg < 0) for(a=0; a<128; a++) (map+128)[a] = 127-(map+128)[a]; if(dflg) { for(a=0; a<'0'; a++) if(a!='\n' && a!=' ' && a!='\t') (map+128)[a] = -1; ignore('9'+1,'A'-1); ignore('Z'+1,'a'-1); ignore('z'+1,127); } ignore(-128,0); (map+128)[127] = -1; a = MEM; while(brk(a) == -1); a =- 512; brk(a =- 512); /* for recursion */ lspace = &end; a =- &end; nlines = ((a-L)>>1) & 077777; nlines =/ 5; ntext = nlines*8; tspace = lspace+nlines; file = "/usr/tmp/stmXaa"; loop: filep = file; while(*filep != 'X') filep++; for(*filep = 'a';;(*filep)++) { if(stat(file, lspace) < 0) { a = creat(file, 0600); if(a >= 0) break; } if(*filep == 'z') { if(file[1] != 't') { file = "/tmp/stmXaa"; goto loop; } mess("Cannot locate temp\n"); exit(); } } close(a); filep++; if ((signal(2, 1) & 01) == 0) signal(2, term); nfiles = eargc; if(!mflg) { ibuf[0] = -1; sort(); close(0); } for(a = mflg?0:eargc; a+N < nfiles; a=+N) { newfile(); merge(a, a+N); } if(a != nfiles) { oldfile(); merge(a, nfiles); } term(); } sort() { register char *cp; register *lp, c; int done; int i; int f; done = 0; i = 0; do { cp = tspace; lp = lspace; while(lp < lspace+nlines && cp < tspace+ntext) { *lp++ = cp; while((*cp++ = c = getc(ibuf)) != '\n') { if(c >= 0) continue; cp--; close(ibuf[0]); if(i < eargc) { if((f = setfil(i++)) == 0) ibuf[0] = 0; else if(fopen(f, ibuf) < 0) cant(f); } else break; } if(c < 0) { done++; lp--; break; } } qsort(lspace, lp-lspace, 2, cmp); if(done == 0 || nfiles != 0) newfile(); else oldfile(); while(lp > lspace) { cp = *--lp; do putc(*cp, obuf); while(*cp++ != '\n'); } fflush(obuf); close(obuf[0]); } while(done == 0); } struct merg { char l[L]; int b[259]; }; merge(a, b) { register struct merg *p; register char *cp; register i; struct { int *ip;}; int f; int j; p = lspace; j = 0; for(i=a; ib[0] = dup(0); else if(fopen(f, p->b) < 0) cant(f); ibuf[j] = p; if(!rline(p)) j++; p++; } i = j; qsort(ibuf, i, 2, cmp); if(i > 0) for(;;) { cp = ibuf[i-1]; do putc(*cp, obuf); while(*cp++ != '\n'); if(rline(ibuf[i-1])) { i--; if(i == 0) break; } cp = &ibuf[i]; while (--cp.ip > ibuf && cmp(cp.ip, cp.ip-1) < 0) { p = *cp.ip; *cp.ip = *(cp.ip-1); *(cp.ip-1) = p; } } p = lspace; for(i=a; ib[0]); p++; if(i >= eargc) close(creat(setfil(i))); } fflush(obuf); close(obuf[0]); } rline(mp) struct merg *mp; { register char *cp; register *bp, c; bp = mp->b; cp = mp->l; do { c = getc(bp); if(c < 0) return(1); *cp++ = c; } while(c != '\n'); return(0); } newfile() { if(fcreat(setfil(nfiles), obuf) < 0) { mess("Can't create temp\n"); term(); } nfiles++; } char * setfil(i) { if(i < eargc) if(eargv[i][0] == '-' && eargv[i][1] == '\0') return(0); else return(eargv[i]); i =- eargc; filep[0] = i/26 + 'a'; filep[1] = i%26 + 'a'; return(file); } oldfile() { if(outfil) { if(fcreat(outfil, obuf) < 0) { mess("Can't create output\n"); term(); } } else obuf[0] = 1; } cant(f) { mess("Can't open "); mess(f); mess("\n"); term(); } term() { register i; if(nfiles == 0) nfiles++; for(i=eargc; i= 0) { pa = skip(pa); pb = skip(pb); } if(schar) { pa = slip(pa); pb = slip(pb); } if(nflg) { pa = snip(pa, &sa); pb = snip(pb, &sb); sign = sa*(sa==sb); for(ipa = pa; digit(*ipa); ipa++); for(ipb = pb; digit(*ipb); ipb++); jpa = ipa; jpb = ipb; a = 0; if(sign) while(ipa > pa && ipb > pb) if(b = *--ipb - *--ipa) a = b; while(ipa > pa) if(*--ipa != '0') return(sign ? -sign : -sa); while(ipb > pb) if(*--ipb != '0') return(sign ? sign : sb); if(a) return(a*sign); if(*(pa=jpa) == '.') pa++; if(*(pb=jpb) == '.') pb++; while(digit(*pa) && digit(*pb)) if(a = *pb++ - *pa++) return(sign ? a*sign : sb); while(digit(*pa)) if(*pa++ != '0') return(sign ? -sign : -sa); while(digit(*pb)) if(*pb++ != '0') return(sign ? sign : sb); } loop : while((a = (map+128)[*pa]) < 0) pa++; while((b = (map+128)[*pb]) < 0) pb++; if(a == b) { if(*pa++ != '\n') { pb++; goto loop; } pa = *i; pb = *j; while(*pa == *pb) { if(*pa++ == '\n') return(0); pb++; } return((*pb - *pa) * rflg); } return(b - a); } skip(pp) char *pp; { register i; register char *p; p = pp; if(i = sfield) do { while(*p == ' ' || *p == '\t') p++; while(*p != ' ' && *p != '\t' && *p != '\n') p++; } while(--i); while(*p == ' ' || *p == '\t') p++; return(p); } slip(pp) char *pp; { register i; register char *p; p = pp; i = schar; do { if(*p != '\n') p++; } while(--i); return(p); } snip(pp,ls) char *pp; int *ls; { register char *p; register int s; p = pp; while(*p == ' ' || *p == '\t') p++; s = rflg; if(*p == '-') { s = -s; p++; } *ls = s; return(p); } number(ap) char *ap; { register int n; register char *p; p = ap; n = 0; while(digit(*p)) n = n*10 + *p++ - '0'; return(n); } digit(c) { if(c <= '9' && c >= '0') return(1); return(0); } mess(s) char *s; { while(*s) write(2, s++, 1); } ignore(a,b) { register c; for(c = a; c <= b; c++) (map+128)[c] = -1; } int count 1000; int fnumber; int ibuf[259]; int obuf[259]; char fname[100]; char *ifil; char *ofil; main(argc, argv) char *argv[]; { register i, c, f; for(i=1; i='0' && *s<='9') n = n*10 + *s-'0'; return(n); } / strip -- strip relocation and symbols mov (sp)+,argc tst (sp)+ br loop unloop: sys unlink; s.tmp loop: dec argc bgt 1f sys exit 1: mov (sp)+,r4 mov r4,0f sys open; 0:..; 0 bec 1f jsr r5,mesg; ; .even br loop 1: mov r0,fi mov $'a,r1 1: movb r1,s.tmp+8 sys stat; s.tmp; buf bec 2f sys creat; s.tmp; 400 bec 1f 2: inc r1 cmp r1,$'z blos 1b jsr r5,mesg; ; .even sys exit 1: mov r0,fo clr buf mov fi,r0 sys read; buf; 512. mov r0,r3 cmp buf,magic beq 1f cmp buf,magic1 beq 1f jsr r5,mesg; ; .even br unloop 1: mov buf+2,r2 add buf+4,r2 add $20,r2 clr buf+10 mov $1,buf+16 / no reloc bits flag 1: cmp r2,r3 bge 2f mov r2,r3 2: mov r3,0f mov fo,r0 sys write; buf; 0:.. sub r3,r2 ble 1f mov fi,r0 sys read; buf; 512. mov r0,r3 bne 1b jsr r5,mesg; ; .even 1: mov fo,r0 sys close mov fi,r0 sys close mov r4,0f sys creat; 0:..; 0 / same mode as before bec 1f jsr r5,mesg; ; .even jmp unloop 1: mov r0,fo sys open; s.tmp; 0 bec 1f jsr r5,mesg; ; .even sys exit 1: mov r0,fi 1: mov fi,r0 sys read; buf; 512. mov r0,0f beq 1f mov fo,r0 sys write; buf; 0:.. br 1b 1: mov fi,r0 sys close mov fo,r0 sys close jmp unloop mesg: movb (r5)+,ch beq 1f mov $1,r0 sys write; ch; 1 br mesg 1: inc r5 bic $1,r5 mov r4,r1 1: movb (r1)+,ch beq 1f mov $1,r0 sys write; ch; 1 br 1b 1: mov $1,r0 sys write; qnl; 1 rts r5 s.tmp: qnl: <\n> .even magic: 407 magic1: 410 .bss fi: .=.+2 fo: .=.+2 argc: .=.+2 buf: .=.+512. ch: .=.+2 ...mail.cmesg.smkdir.smkfs.cmknod.c mount.c!msh.s"mv.c#nice.c$nm.c%nohup.c&od.c'passwd.s(pfe.s)pr.c*prof.c+ps.c,pwd.c-restor.c.rew.s/rm.c0rmdir.s1sa.c2sh.c3size.c4sleep.c5sort.c6split.c7strip.s8stty.cchar *arg; int mode[3]; main(argc, argv) char *argv[]; { int i; gtty(1,mode); while(--argc > 0) { arg = *++argv; if(eq("even")) set(0200); if(eq("-even")) reset(0200); if(eq("odd")) set(0100); if(eq("-odd")) reset(0100); if(eq("raw")) set(040); if(eq("-raw") || eq("cooked")) reset(040); if(eq("-nl")) set(020); if(eq("nl")) reset(020); if(eq("echo")) set(010); if(eq("-echo")) reset(010); if(eq("lcase")) set(04); if(eq("-lcase")) reset(04); if(eq("-tabs")) set(02); if(eq("tabs")) reset(02); if(eq("-delay")) set(01); if(eq("delay")) reset(01); if(eq("tdelay")) reset(010000); if(eq("-tdelay")) set(010000); if(arg) printf("unknown mode: %s\n", arg); } stty(1,mode); } eq(string) char *string; { int i; if(!arg) return(0); i = 0; loop: if(arg[i] != string[i]) return(0); if(arg[i++] != '\0') goto loop; arg = 0; return(1); } set(b) { mode[2] =| b; } reset(b) { mode[2] =& ~b; } /* su -- become super-user */ char password[100]; char pwbuf[100]; int ttybuf[3]; main() { register char *p, *q; extern fin; if(getpw(0, pwbuf)) goto badpw; (&fin)[1] = 0; p = pwbuf; while(*p != ':') if(*p++ == '\0') goto badpw; if(*++p == ':') goto ok; gtty(0, ttybuf); ttybuf[2] =& ~010; stty(0, ttybuf); printf("password: "); q = password; while((*q = getchar()) != '\n') if(*q++ == '\0') return; *q = '\0'; ttybuf[2] =| 010; stty(0, ttybuf); printf("\n"); q = crypt(password); while(*q++ == *p++); if(*--q == '\0' && *--p == ':') goto ok; goto error; badpw: printf("bad password file\n"); ok: setuid(0); execl("/bin/sh", "-", 0); printf("cannot execute shell\n"); error: printf("sorry\n"); } / sum -- check sum file mov (sp)+,r3 tst (sp)+ loop: dec r3 bgt 1f sys exit 1: mov (sp)+,0f sys open; 0:..; 0 bec 3f mov $1,r0 sys write; 1f; 2f-1f br loop 1: 2: .even 3: mov r0,r1 clr r5 1: mov r1,r0 sys read; buf; 512. bes err tst r0 beq print inc bcnt mov $buf,r2 2: movb (r2)+,r4 add r4,r5 adc r5 sob r0,2b br 1b err: mov $1,r0 sys write; 1f; 2 print: jsr pc,decml mov $1,r0 sys write; bl; 1 mov bcnt,r5 jsr pc,decml mov $1,r0 sys write; nl; 1 mov r1,r0 sys close br loop 1: nl: <\n> bl: < > .even decml: mov r0,-(sp) mov r1,-(sp) mov r5,r1 jsr pc,1f mov (sp)+,r1 mov (sp)+,r0 rts pc 1: clr r0 dvd $10.,r0 mov r1,-(sp) mov r0,r1 beq 1f jsr pc,1b 1: mov (sp)+,ch add $'0,ch mov $1,r0 sys write; ch; 1 rts pc .bss ch: .=.+2 bcnt: .=.+2 buf: .=.+512. main() { sync(); } int open[9] { 1 }; int n 1; int t 0; char in[512]; char out[512]; main(argc,argv) char **argv; { int register r,w,p; struct { int x1[2], type, x2[15]; } buf; fstat(1,&buf); t = (buf.type&060000)==020000; while(argc-->1) { open[n++] = creat(argv[1],0666); if(stat(argv[1],&buf)>=0) if((buf.type&060000)==020000) t++; argv++; } r = w = 0; for(;;) { for(p=0;p<512;) { if(r>=w) { if(t>0&&p>0) break; w = read(0,in,512); r = 0; if(w<=0) { stash(p); return; } } out[p++] = in[r++]; } stash(p); } } stash(p) { int k; int i; int d; d = t ? 10 : p; for(i=0; i; .even mov $ltbuf,r2 jsr r5,ptime jsr r5,mesg; ; .even jsr r5,ptime jsr r5,mesg; ; .even jsr r5,ptime sys exit execarg: sys fork br newproc bec 2f jsr r5,mesg; ; .even sys exit 2: mov r0,r2 sys signal; 2; 1 2: sys wait cmp r0,r2 bne 2b bit $377,r1 beq 1f jsr r5,mesg; ; .even clr r0 sys seek; 0; 2 1: rts pc newproc: tst (sp)+ mov (sp)+,r0 tst (sp)+ mov $ibuf,r1 mov $end,r2 1: mov (sp)+,r3 mov r2,(r1)+ 2: movb (r3)+,(r2)+ bne 2b dec r0 cmp r0,$1 bgt 1b clr (r1)+ sys exec; end; ibuf mov $end-10.,r0 mov $"x/,(r0)+ mov $"us,(r0)+ mov $"r/,(r0)+ mov $"bi,(r0)+ mov $"n/,(r0)+ sys exec; end-5; ibuf sys exec; end-9.; ibuf jsr r5,mesg; ; .even clr r0 sys seek; 0; 2 sys exit printd: mov $tbuf+4,r4 jsr r5,tdiv; 10. jsr r5,tdiv; 10. jsr r5,tdiv; 10. jsr r5,tdiv; 10. 1: cmpb (r4),$'0 bne 1f movb $' ,(r4)+ cmp r4,$tbuf+3 bne 1b 1: mov $2,r0 sys write; tbuf; 4 rts pc ptime: mov (r2)+,r0 mov (r2)+,r1 div $3600.,r0 mov r0,-(sp) clr r0 div $60.,r0 mov r1,clicks mov $tbuf+9.,r4 jsr r5,tdiv; 10. jsr r5,tdiv; 6. movb $':,-(r4) mov (sp)+,r0 jsr r5,tdiv; 10. jsr r5,tdiv; 6. movb $':,-(r4) jsr r5,tdiv; 10. jsr r5,tdiv; 10. jsr r5,tdiv; 10. 1: cmpb (r4),$'0 beq 2f cmpb (r4),$': bne 1f 2: movb $' ,(r4)+ cmp r4,$tbuf+8. bne 1b 1: mov $2,r0 sys write; tbuf; 9. jsr r5,mesg; <.\0>; .even mov clicks,r1 clr r0 div $6,r0 add $'0,r0 mov r0,ch mov $2,r0 sys write; ch; 1 jsr r5,mesg; <\n\0>; .even rts r5 tdiv: mov r1,-(sp) mov r0,r1 clr r0 div (r5)+,r0 add $'0,r1 movb r1,-(r4) mov (sp)+,r1 rts r5 mesg: movb (r5)+,ch beq 2f mov $2,r0 sys write; ch; 1 br mesg 2: inc r5 bic $1,r5 rts r5 ch: .=.+1 .even .bss clicks: .=.+2 ibuf: .=.+50. tbuf: .=.+10. ltbuf: .=.+16. end: .=.+1000. / tap1 -- dec-disk lod/dmp .globl _localtime, _end namep = 0 mode = 2 uid = 4; gid = 5 size0 = 7 size1 = 8 time0 = 10. time1 = 12. tapea = 14. dirsiz = 16. mdirent = 496. mov (sp),rnarg mov (sp)+,narg mov $cmr,command incb flu tst (sp)+ cmp narg,$2 bge 1f mov $2,narg br 3f 1: mov (sp)+,r0 mov sp,parg 1: movb (r0)+,r1 beq 3f mov $swtab,r2 2: cmp r1,(r2)+ beq 2f tst (r2)+ bne 2b br useerr 2: jsr pc,*(r2)+ br 1b 3: jsr pc,optap mov $_end,r4 / string pointer jsr pc,setb jmp *command optap: tstb flm bne 2f mov $578.,tapsiz mov $192.,ndirent sys open; tc; 2 br 3f 2: mov $-1,tapsiz mov $mdirent,ndirent cmp command,$cmr beq 2f sys open; mt; 0 br 3f 2: sys open; mt; 1 3: bes 1f mov r0,fio mov ndirent,r1 ash $-3,r1 mov r1,ndentd8 mov ndirent,r1 mul $dirsiz,r1 add $dir,r1 mov r1,edir rts pc 1: jsr r5,mesg ; .even jmp done setcom: cmp command,$cmr bne useerr mov (r5)+,command rts r5 noflag: mov (r5)+,r0 beq 1f tstb (r0) beq noflag br useerr 1: rts r5 useerr: jsr r5,mesg ; .even jmp done swtab: '0; dcof '1; dcof '2; dcof '3; dcof '4; dcof '5; dcof '6; dcof '7; dcof 'c; dcc 'd; dcd 'f; dcf 'i; dci 'm; dcm 'r; dcr 't; dct 'u; dcu 'v; dcv 'w; dcw 'x; dcx 0; 0 dcof: movb r1,tcx movb r1,mtx rts pc dcc: incb flc rts pc dcf: incb flf rts pc dcd: jsr r5,setcom; cmd rts pc dci: incb fli rts pc dcm: incb flm rts pc dcu: incb flu jsr r5,setcom; cmr rts pc dcr: clrb flu jsr r5,setcom; cmr rts pc dct: jsr r5,setcom; cmt rts pc dcv: incb flv rts pc dcw: incb flw rts pc dcx: jsr r5,setcom; cmx rts pc cmd: jsr r5,noflag; flm; flc; flf; 0 cmp narg,$2 bgt 1f jmp useerr 1: jsr pc,rddir jsr r5,gettape; delete jsr pc,wrdir br check cmr: jsr r5,noflag; 0 tstb flc bne 1f tstb flm bne 1f jsr pc,rddir br 2f 1: jsr pc,clrdir 2: jsr pc,getfiles jsr pc,update br check cmt: jsr r5,noflag; flc; flf; flw; 0 jsr pc,rddir tstb flv beq 1f jsr r5,mesg < mode uid gid tapa size date time name\n\0>; .even 1: jsr r5,gettape; taboc br check1 cmx: jsr r5,noflag; flc; flf; 0 jsr pc,rddir jsr r5,gettape; xtract br done check: check1: jsr pc,usage done: jsr r5,mesg ; .even sys exit encode: mov r2,-(sp) mov r4,(r1) mov (r5)+,r2 1: movb (r2),(r4)+ jsr pc,setb tstb (r2)+ bne 1b mov (sp)+,r2 rts r5 decode: mov r2,-(sp) mov r1,-(sp) mov (r1),r1 mov (r5)+,r2 1: movb (r1)+,(r2)+ bne 1b mov (sp)+,r1 mov (sp)+,r2 rts r5 setb: mov r0,-(sp) mov r4,r0 add $513.,r0 cmp r0,sp bhis 2f bic $777,r0 cmp r0,0f beq 1f mov r0,0f sys break; 0:.. bes 2f 1: mov (sp)+,r0 rts pc 2: jsr r5,mesg ; .even jmp done / tap2 -- dec-tape lod/dmp pstr: movb (r1)+,r0 beq 1f jsr pc,putc br pstr 1: rts pc mesg: movb (r5)+,r0 beq 1f jsr pc,putc br mesg 1: inc r5 bic $1,r5 rts r5 putc: movb r0,ch mov $1,r0 sys write; ch; 1 rts pc getc: clr r0 sys read; ch; 1 movb ch,r0 rts pc clrdir: mov $dir,r1 mov ndirent,r2 1: jsr pc,clrent sob r2,1b rts pc clrent: mov r1,-(sp) add $dirsiz,(sp) 1: clr (r1)+ cmp r1,(sp) blo 1b tst (sp)+ rts pc rddir: clr sum jsr pc,clrdir clr r0 jsr pc,rseek jsr pc,tread mov tapeb+510.,r0 beq 1f tstb flm beq 1f mov r0,ndirent 1: mov $dir,r1 mov ndirent,r2 1: bit $7,r2 bne 2f jsr pc,tread mov $tapeb,r3 2: mov r1,-(sp) mov r3,-(sp) mov $32.,r0 clr -(sp) 2: add (r3)+,(sp) sob r0,2b bis (sp),sum tst (sp)+ bne 2f mov (sp),r3 tst (r3) beq 2f mov r3,0f jsr pc,9f .data 9: jsr r5,encode; 0:.. rts pc .text add $32.,r3 mov r1,-(sp) add $dirsiz,(sp) tst (r1)+ / namep 9: mov (r3)+,(r1)+ cmp r1,(sp) blo 9b tst (sp)+ 2: mov (sp)+,r3 add $64.,r3 mov (sp)+,r1 bic $100000,mode(r1) add $dirsiz,r1 sob r2,1b tst sum beq 1f jsr r5,mesg ; .even tstb fli bne 1f jmp done 1: jsr pc,bitmap rts pc wrdir: clr r0 jsr pc,wseek tstb flm bne 1f sys open; tboot; 0 bes 3f br 2f 1: sys open; mboot; 0 bes 3f 2: mov r0,r1 sys read; tapeb; 512. mov r1,r0 sys close mov ndirent,tapeb+510. 3: jsr pc,twrite mov $dir,r1 mov ndirent,r2 1: bit $7,r2 bne 2f mov $256.,r0 mov $tapeb,r3 3: clr (r3)+ sob r0,3b mov $tapeb,r3 2: mov r3,-(sp) tst (r1) beq 2f mov r3,0f jsr pc,9f .data 9: jsr r5,decode; 0:.. rts pc .text 2: add $32.,r3 mov r1,-(sp) add $dirsiz,(sp) tst (r1)+ 9: mov (r1)+,(r3)+ cmp r1,(sp) blo 9b tst (sp)+ mov (sp)+,r3 clr -(sp) mov $31.,r0 2: sub (r3)+,(sp) sob r0,2b mov (sp)+,(r3)+ dec r2 bit $7,r2 bne 1b jsr pc,twrite tst r2 bne 1b rts pc tread: mov fio,r0 sys read; tapeb; 512. bes trderr cmp r0,$512. bne trderr 1: inc rseeka rts pc trderr: jsr r5,mesg ; .even tstb fli beq 1f mov $tapeb,r0 2: clr (r0)+ cmp r0,$tapeb+512. blo 2b br 1b 1: jmp done twrite: mov fio,r0 sys write; tapeb; 512. bes twrerr cmp r0,$512. bne twrerr inc wseeka rts pc twrerr: jsr r5,mesg ; .even jmp done rseek: mov r0,rseeka mov r0,0f mov fio,r0 sys 0; 9f .data 9: sys seek; 0:..; 3 .text bes seekerr rts pc wseek: mov r0,-(sp) sub wseeka,r0 bge 1f neg r0 1: cmp r0,$25. / longest write seek ble 1f mov (sp),0f beq 2f dec 0f 2: mov fio,r0 sys 0; 9f .data 9: sys seek; 0:..; 3 .text mov fio,r0 sys read; wseeka; 1 1: mov (sp),wseeka mov (sp)+,0f mov fio,r0 sys 0; 9f .data 9: sys seek; 0:..; 3 .text bes seekerr rts pc seekerr: jsr r5,mesg ; .even jmp done verify: movb (r5)+,0f inc r5 tstb flw bne 1f tstb flv beq 2f 1: jsr pc,9f .data 9: jsr r5,mesg 0:; .even rts pc .text mov r1,-(sp) mov $name,r1 jsr pc,pstr mov (sp)+,r1 tstb flw beq 1f jsr r5,mesg < \0> jsr pc,getc cmp r0,$'x bne 3f jsr pc,getc jmp done 3: cmp r0,$'\n beq 3f cmp r0,$'y bne 4f jsr pc,getc cmp r0,$'\n beq 2f 4: jsr pc,getc cmp r0,$'\n bne 4b br 1b 1: jsr r5,mesg <\n\0> 2: tst (r5)+ 3: rts r5 getfiles: cmp narg,$2 bne 1f mov $".\0,name jsr pc,callout 1: cmp narg,$2 ble 1f dec narg mov *parg,r1 add $2,parg mov $name,r2 2: movb (r1)+,(r2)+ bne 2b jsr pc,callout br 1b 1: rts pc expand: sys open; name; 0 bes fserr mov r0,-(sp) 1: mov (sp),r0 sys read; catlb; 16. bes fserr tst r0 beq 1f tst catlb beq 1b mov $name,r0 mov $catlb+2,r1 cmpb (r1),$'. beq 1b 2: tstb (r0)+ bne 2b dec r0 mov r0,-(sp) cmpb -1(r0),$'/ beq 2f movb $'/,(r0)+ 2: movb (r1)+,(r0)+ bne 2b jsr pc,callout clrb *(sp)+ br 1b 1: mov (sp)+,r0 sys close rts pc fserr: mov $name,r1 jsr pc,pstr jsr r5,mesg < -- Cannot open file\n\0>; .even jmp done callout: sys stat; name; statb bes fserr mov statb+4,r0 bic $!60000,r0 beq 1f cmp r0,$40000 beq expand rts pc 1: mov $dir,r1 clr -(sp) 1: tst (r1) bne 3f tst (sp) bne 2f mov r1,(sp) 2: add $dirsiz,r1 cmp r1,edir blo 1b mov (sp)+,r1 bne 4f jsr r5,mesg ; .even jmp done 4: jsr r5,verify; 'a rts pc jsr r5,encode; name br 2f 3: jsr r5,decode; name1 mov $name,r2 mov $name1,r3 3: cmpb (r2)+,(r3) bne 2b tstb (r3)+ bne 3b tst (sp)+ tstb flu beq 3f cmp time0(r1),statb+32. blo 3f bhi 1f cmp time1(r1),statb+34. bhis 1f 3: jsr r5,verify; 'r rts pc 2: mov statb+4,mode(r1) bis $100000,mode(r1) movb statb+7,uid(r1) movb statb+8,gid(r1) tstb flf beq 2f clrb statb+9. clr statb+10. 2: movb statb+9.,size0(r1) mov statb+10.,size1(r1) mov statb+32.,time0(r1) mov statb+34.,time1(r1) 1: rts pc / tap3 -- dec-tape lod/dmp gettape: mov $dir,r1 clr -(sp) 1: tst (r1) beq 2f jsr r5,decode; name cmp rnarg,$2 ble 4f mov $name,r2 mov *parg,r3 3: tstb (r3) beq 3f cmpb (r2)+,(r3)+ beq 3b br 2f 3: tstb (r2) beq 4f cmpb (r2),$'/ bne 2f 4: mov r1,-(sp) jsr pc,*(r5) mov (sp)+,r1 inc (sp) 2: add $dirsiz,r1 cmp r1,edir blo 1b tst (sp)+ bne 2f cmp rnarg,$2 ble 2f mov *parg,r1 jsr pc,pstr jsr r5,mesg < not found\n\0>; .even 2: dec narg add $2,parg cmp narg,$2 bgt gettape tst (r5)+ rts r5 delete: jsr r5,verify; 'd rts pc jsr pc,clrent rts pc numb: mov r1,-(sp) mov r0,-(sp) clr r0 br 1f numbx: mov r1,-(sp) mov r0,-(sp) movb size0(r1),r0 1: mov $catlb,r2 1: mov $" ,(r2)+ cmp r2,$catlb+12. blo 1b cmp (r5),$2 bne 1f mov $"00,-2(r2) 1: mov (sp)+,r1 jsr pc,numb2 mov (r5)+,r0 sub r0,r2 mov r2,0f mov r0,0f+2 mov $1,r0 sys 0; 9f .data 9: sys write; 0:..; .. .text mov (sp)+,r1 rts r5 numb1: clr r0 numb2: div $10.,r0 mov r1,-(sp) mov r0,r1 beq 1f jsr pc,numb1 1: mov (sp)+,r0 add $'0,r0 movb r0,(r2)+ rts pc update: jsr pc,bitmap mov $dir,r1 1: tst (r1) beq 2f bit $100000,mode(r1) beq 2f tstb size0(r1) bne 9f tst size1(r1) beq 2f 9: mov ndentd8,-(sp) inc (sp) movb size0(r1),r2 mov size1(r1),r3 add $511.,r3 adc r2 ashc $-9,r2 mov r3,size 3: mov (sp),r2 mov size,r3 4: jsr pc,bitcalc inc r2 bitb (sp)+,map(r0) bne 4f sob r3,4b mov (sp)+,tapea(r1) jsr pc,setmap br 2f 4: inc (sp) br 3b 2: add $dirsiz,r1 cmp r1,edir blo 1b jsr pc,wrdir update1: mov $dir,r1 clr -(sp) mov $-1,-(sp) 1: tst (r1) beq 2f bit $100000,mode(r1) beq 2f cmp tapea(r1),(sp) bhis 2f mov tapea(r1),(sp) mov r1,2(sp) 2: add $dirsiz,r1 cmp r1,edir blo 1b tst (sp)+ mov (sp)+,r1 bne 1f rts pc 1: bic $100000,mode(r1) movb size0(r1),mss mov size1(r1),r2 bne 4f tst mss beq update1 4: jsr r5,decode; name mov tapea(r1),r0 jsr pc,wseek clr r3 sys open; name; 0 bes phserr mov r0,r3 3: tst mss bne 4f cmp r2,$512. blo 3f 4: mov r3,r0 sys read; tapeb; 512. bes phserr cmp r0,$512. bne phserr jsr pc,twrite sub $512.,r2 sbc mss br 3b 3: mov r2,0f beq 3f mov r3,r0 sys 0; 9f .data 9: sys read; tapeb; 0:.. .text bes phserr cmp r0,0b bne phserr jsr pc,twrite 3: mov r3,r0 sys read; tapeb; 512. bes phserr tst r0 bne phserr mov r3,r0 sys close 2: jmp update1 phserr: mov r1,-(sp) mov $name,r1 jsr pc,pstr jsr r5,mesg < -- Phase error\n\0>; .even mov (sp)+,r1 clr time0(r1) / time beq 2b sys close br 2b bitmap: mov $map,r0 1: clr (r0)+ cmp r0,$emap blo 1b mov $dir,r1 1: tst (r1) beq 2f bit $100000,mode(r1) bne 2f tst size1(r1) bne 3f tstb size0(r1) beq 2f 3: jsr pc,setmap 2: add $dirsiz,r1 cmp r1,edir blo 1b rts pc setmap: movb size0(r1),r2 mov size1(r1),r3 add $511.,r3 adc r2 ashc $-9.,r2 mov tapea(r1),r2 1: jsr pc,bitcalc bitb (sp),map(r0) bne maperr bisb (sp)+,map(r0) inc r2 sob r3,1b rts pc bitcalc: mov (sp),-(sp) cmp r2,tapsiz bhis maperr mov r2,r0 bic $!7,r0 mov r0,-(sp) mov $1,r0 als (sp)+,r0 mov r0,2(sp) mov r2,r0 ash $-3,r0 bic $160000,r0 rts pc maperr: jsr r5,mesg ; .even jmp done usage: jsr pc,bitmap mov $dir,r2 1: tst (r2) beq 2f inc nentr 2: add $dirsiz,r2 cmp r2,edir blo 1b mov ndentd8,r2 inc r2 mov tapsiz,r3 dec r3 sub ndentd8,r3 1: jsr pc,bitcalc bitb (sp)+,map(r0) beq 2f inc nused mov r2,lused br 3f 2: inc nfree tstb flm bne 1f 3: inc r2 sob r3,1b 1: mov nentr,r0 jsr r5,numb; 4 jsr r5,mesg < entries\n\0>; .even mov nused,r0 jsr r5,numb; 4 jsr r5,mesg < used\n\0>; .even tstb flm bne 1f mov nfree,r0 jsr r5,numb; 4 jsr r5,mesg < free\n\0>; .even 1: mov lused,r0 jsr r5,numb; 4 jsr r5,mesg < last\n\0>; .even rts pc taboc: tstb flv beq 4f mov mode(r1),r0 mov r0,-(sp) ash $-6,r0 bit $40,r0 jsr pc,pmod mov (sp),r0 ash $-3,r0 bit $200,r0 jsr pc,pmod mov (sp)+,r0 bit $1000,r0 jsr pc,pmod clr r0 bisb uid(r1),r0 jsr r5,numb; 4 clr r0 bisb gid(r1),r0 jsr r5,numb; 4 mov tapea(r1),r0 jsr r5,numb; 5 mov size1(r1),r0 jsr r5,numbx; 9. mov r1,-(sp) add $time0,(sp) jsr pc,_localtime mov r0,(sp) mov 10.(r0),r0 jsr r5,numb; 3 mov $'/,r0 jsr pc,putc mov (sp),r0 mov 8.(r0),r0 inc r0 jsr r5,numb; 2 mov $'/,r0 jsr pc,putc mov (sp),r0 mov 6(r0),r0 jsr r5,numb; 2 mov (sp),r0 mov 4(r0),r0 jsr r5,numb; 3 mov $':,r0 jsr pc,putc mov (sp)+,r0 mov 2(r0),r0 jsr r5,numb; 2 mov $' ,r0 jsr pc,putc 4: mov $name,r1 jsr pc,pstr jsr r5,mesg <\n\0> rts pc pmod: beq 1f mov $'s,-(sp) br 2f 1: bit $1,r0 beq 1f mov $'x,-(sp) br 2f 1: mov $'-,-(sp) 2: bit $2,r0 beq 1f mov $'w,-(sp) br 2f 1: mov $'-,-(sp) 2: bit $4,r0 beq 1f mov $'r,r0 br 2f 1: mov $'-,r0 2: jsr pc,putc mov (sp)+,r0 jsr pc,putc mov (sp)+,r0 jsr pc,putc rts pc xtract: movb size0(r1),mss bne 2f tst size1(r1) beq 1f 2: jsr r5,verify; 'x rts pc mov size1(r1),r3 mov tapea(r1),r0 jsr pc,rseek sys unlink; name mov mode(r1),0f sys 0; 9f .data 9: sys creat; name; 0:.. .text bes crterr mov r0,r2 2: tst mss bne 3f cmp r3,$512. blo 2f 3: jsr pc,tread mov r2,r0 sys write; tapeb; 512. bes crterr1 cmp r0,$512. bne crterr1 sub r0,r3 sbc mss br 2b 2: mov r3,0f beq 2f jsr pc,tread mov r2,r0 sys 0; 9f .data 9: sys write; tapeb; 0:.. .text bes crterr1 cmp r0,0b bne crterr1 2: mov r2,r0 sys close movb gid(r1),0f sys 0; 9f .data 9: sys chgrp; name; 0:.. .text movb uid(r1),0f sys 0; 9f .data 9: sys chown; name; 0:.. .text mov time0(r1),r0 mov r1,-(sp) mov time1(r1),r1 sys 0; 9f .data 9: sys smdate; name .text mov (sp)+,r1 1: rts pc crterr1: clr r0 mov r1,-(sp) clr r1 / sys smdate; name mov (sp)+,r1 mov r2,r0 sys close crterr: mov $name,r1 jsr pc,pstr jsr r5,mesg < -- create error\n\0>; .even rts pc / tap4 -- dec-tape lod/dmp .data tc: tcx: mt: mtx: <0\0> tboot: mboot: .even .bss dir: . = .+[mdirent*dirsiz] tapeb: map: .=.+4096. emap: ch: .=.+1 flc: .=.+1 flf: .=.+1 fli: .=.+1 flm: .=.+1 flu: .=.+1 flv: .=.+1 flw: .=.+1 .even command:.=.+2 sum: .=.+2 size: .=.+2 nentr: .=.+2 nused: .=.+2 nfree: .=.+2 lused: .=.+2 catlb: .=.+20. narg: .=.+2 rnarg: .=.+2 parg: .=.+2 fio: .=.+2 mss: .=.+2 ndirent:.=.+2 ndentd8:.=.+2 edir: .=.+2 rseeka: .=.+2 wseeka: .=.+2 tapsiz: .=.+2 name: .=.+32. name1: .=.+32. statb: .=.+40. chgrp = 0. / fake smdate = 30. int dflag 0; int sflag 0; int cflag 0; int save 0; char code[256]; char squeez[256]; char vect[256]; struct string { int last, max, rep; char *p; } string1, string2; int inbuf[259]; main(argc,argv) char **argv; { int i, j; int c, d; char *compl; extern fout; string1.last = string2.last = 0; string1.max = string2.max = 0; string1.rep = string2.rep = 0; string1.p = string2.p = ""; if(--argc>0) { argv++; if(*argv[0]=='-') { while(*++argv[0]) switch(*argv[0]) { case 'c': cflag++; continue; case 'd': dflag++; continue; case 's': sflag++; continue; } argc--; argv++; } } if(argc>0) string1.p = argv[0]; if(argc>1) string2.p = argv[1]; for(i=0; i<256; i++) code[i] = vect[i] = 0; if(cflag) { while(c = next(&string1)) vect[c&0377] = 1; j = 0; for(i=1; i<256; i++) if(vect[i]==0) vect[j++] = i; vect[j] = 0; compl = vect; } for(i=0; i<256; i++) squeez[i] = 0; for(;;){ if(cflag) c = *compl++; else c = next(&string1); if(c==0) break; d = next(&string2); if(d==0) d = c; code[c&0377] = d; squeez[d&0377] = 1; } while(d = next(&string2)) squeez[d&0377] = 1; squeez[0] = 1; for(i=0;i<256;i++) { if(code[i]==0) code[i] = i; else if(dflag) code[i] = 0; } inbuf[0] = 0; fout = dup(1); close(1); while((c=getc(inbuf)) >=0 ) { if(c == 0) continue; if(c = code[c&0377]&0377) if(!sflag || c!=save || !squeez[c&0377]) putchar(save = c); } flush(); } next(s) struct string *s; { int a, b, c, n; int base; if(--s->rep > 0) return(s->last); if(s->last < s->max) return(++s->last); if(*s->p=='[') { nextc(s); s->last = a = nextc(s); s->max = 0; switch(nextc(s)) { case '-': b = nextc(s); if(bp++!=']') goto error; s->max = b; return(a); case '*': base = (*s->p=='0')?8:10; n = 0; while((c = *s->p)>='0' && c<'0'+base) { n = base*n + c - '0'; s->p++; } if(*s->p++!=']') goto error; if(n==0) n = 1000; s->rep = n; return(a); default: error: write(1,"Bad string\n",11); exit(); } } return(nextc(s)); } nextc(s) struct string *s; { int c, i, n; c = *s->p++; if(c=='\\') { i = n = 0; while(i<3 && (c = *s->p)>='0' && c<='7') { n = n*8 + c - '0'; i++; s->p++; } if(i>0) c = n; else c = *s->p++; } if(c==0) *--s->p = 0; return(c&0377); } / tty -- get tty number .globl ttyn clr r0 jsr pc,ttyn tst r0 movb r0,nam mov $1,r0 sys write; name; 5 sys exit name: nam: .even char w2006[24]; flg 0; char realwd[26]; char *wd {&realwd[1]}; /* int etext; int rathole[1000]; */ int neng; int npr; int table[2]; int tab1[26]; int tab2[730]; char tab3[19684]; int logtab[256]; float inctab[256]; char nwd[26]; mask 0377; int tot; int wtot; char *buf[3]; file[3]; ptr[3]; char *name[4]; bsp[768]; main(argc,argv) int argc; char *argv[]; { char let,lt; auto arg,num,t,sw,i,j,k,l,m,salt,er,c; int unl(); int junk; /* monitor(&main, &etext, rathole, 1000); */ if(--argc < 1){printf("arg count\n"); exit(); } buf[0] = bsp; buf[1] = bsp + 0400; buf[2] = bsp + 01000; ptr[0] = 0; ptr[1] = 0; ptr[2] = 1; arg = 1; while(argv[arg][0] == '-') { switch(argv[arg][1]) { default: printf("Unrecognizable argument: %c\n",argv[arg][1]); exit(); case 0: case 'n': neng++; break; case '1': npr++; } arg++; if(--argc < 1) { printf("arg count\n"); exit(); } } if(!neng) { salt = open("/usr/lib/salt",0); er = read(salt,table,4); if(er != 4)err("read salt"); er = read(salt,tab1,52); if(er != 52) err("read salt"); er = read(salt,tab2,1460); if(er != 1460) err("read salt"); er = read(salt,tab3,19684); if(er != 19684)err("read salt"); close(salt); } signal(2,unl); name[0] = "/tmp/ttmpa1"; name[1] = "/tmp/ttmpa2"; name[2] = "/tmp/ttmpa3"; name[3] = "/tmp/ttmpa4"; topen: file[0] = open(name[0],1); if(file[0] > 0){ close(file[0]); j = -1; while(++j < 4)name[j][9]++; if(name[0][9] == 'z')err("creat tmp file"); goto topen; } j = 2; while(j--)file[j] = creat(name[j],0666); while(argc--){ file[2] = open(argv[arg++],0); if(file[2] < 0)err("open input file"); while((j = wdval(2)) != 0){ put(dfile(nwd[0]),nwd,j+1); k = -1; l = 0; m = 1; table[0] = incr(table[0]); while(m <= j+1){ c = 27*wd[k++] + wd[l++]; tab2[c] = incr(tab2[c]); c = 27*c + wd[m++]; tab3[c] = incr(tab3[c] & 0377); } c = 27*wd[k] + wd[l]; tab2[c] = incr(tab2[c]); } done1: close(file[2]); } /* junk = creat("junk\0",0666); write(junk,table,4+52+1460+19684); close(junk); */ j = 2; while(j--){flsh(j,0); close(file[j]); } j = 2; while(j--){ sw = fork(); if(sw == 0){execl("/bin/sort","sort","-o",name[j],name[j],0); err("sort"); } if(sw < 0)err("fork"); er = wait(); if(er != sw)err("probs"); } j = -1; while(++j < 2){ sw = fork(); if(sw == 0){execl("/bin/uniq","uniq",name[j],name[j+2]); err("uniq"); } if(sw < 0)err("fork"); er = wait(); if(er != sw)err("prob"); } file[0] = creat(name[0],0666); if(file[0] < 0)err("creat tmp"); file[1] = open("/usr/lib/w2006",0); if(file[1] < 0)err("open w2006"); ptr[1] = 1; j = -1; while((w2006[++j] = get(1)) != '\n'); lt = 1; while(++lt < 4){ file[2] = open(name[lt],0); if(file[2] < 0)err("open tmp"); ptr[2] = 1; getw: k = -1; while((wd[++k] = get(2)) != '\n')if(wd[k] == 0)goto done; scan: i = -1; l = 0; while(++i <= k){ if(wd[i] < w2006[l]){ put(0,wd,k); goto getw; } if(wd[i] > w2006[l]){ l = -1; while((w2006[++l] = get(1)) != '\n') if(w2006[l] == 0)goto fin; goto scan; } l++; } goto getw; fin: put(0,wd,k); k = -1; while((wd[++k] = get(2)) != 0){ if(wd[k] == '\n'){ put(0,wd,k); k = -1; }} done: close(file[2]); unlink(name[lt]); } flsh(0,0); close(file[1]); close(file[0]); ptr[1] = 1; file[1] = open(name[0],0); if(file[1] < 0)err("open tmp "); file[0] = creat(name[1],0666); if(file[0] < 0)err("create tmp"); while((j = wdval(1)) != 0){ wtot = 0; flg = 0; k = -1; l = 0; m = 1; while(m <= j+1){ tot = 0; c = wd[k++]*27 + wd[l++]; digram(c); digram(wd[k]*27 + wd[l]); tot =>> 1; c = c*27 + wd[m++]; trigram(c); if(tot > wtot) wtot = tot; } if(wtot < 0) wtot = 0; t = conf(wtot,3,wd); wd[3] = ' '; put(0,wd,3); put(0,nwd,j+1); } flsh(0,0); close(file[1]); close(file[0]); /* monitor(0); goto unl; */ sw = fork(); if(sw == 0){execl("/bin/sort","sort","-r","-o",name[1],name[1] ,0); err("sort"); } if(sw < 0)err("fork"); er = wait(); if(er != sw)err("prob"); sw = fork(); if(sw == 0){ if(npr) { execl("/bin/cat","cat",name[1],0); } else { execl("/bin/pr","pr","-3", "-h", "Possible typo's and spelling errors",name[1],0); err("pr"); } } if(sw < 0)err("fork"); er = wait(); if(er != sw)err("prob"); unl(); } unl() { int j; j = 2; while(j--)unlink(name[j]); exit(); } trigram(c) int c; { int t; t = logtab[tab3[c]&0377]; tot =- t; return; } digram(c) int c; { int t; t = logtab[tab2[c]]; tot =+ t; return; } dfile(c) char c; { if(c >= 'a' && c <= 'k')return(0); return(1); } err(c) char c[];{ auto j; printf("cannot %s\n",c); j = 4; while(j--)unlink(name[j]); exit(); } get(ifile) int ifile;{ static char *ibuf[10]; if(--ptr[ifile]){ return(*ibuf[ifile]++);} if(ptr[ifile] = read(file[ifile],buf[ifile],512)){ if(ptr[ifile] < 0)goto prob; ibuf[ifile] = buf[ifile]; return(*ibuf[ifile]++); } ptr[ifile] = 1; return(0); prob: ptr[ifile] = 1; printf("read error\n"); return(0); } put(ofile,s,optr) char s[]; {auto i; while(optr-- >= 0) buf[ofile][(ptr[ofile] < 512)?ptr[ofile]++:flsh(ofile,1)] = *s++; return; } flsh(ofile,i){auto error; error = write(file[ofile],buf[ofile],ptr[ofile]); if(error < 0)goto prob; ptr[ofile] = i; return(0); prob: printf("write error on t.%d\n",file); exit(); } wdval(wfile) int wfile; { static let,wflg; auto j; beg: j = -1; if(wflg == 1){wflg = 0; goto st; } while((let = get(wfile)) != '\n'){ if(let == 0)return(0); st: if(let == '%' && j != -1)goto cont; if(let == '-'){ if((let = get(wfile)) == '\n'){ while((let = get(wfile)) == '\n'); goto st; } wflg = 1; goto ret; } if(let == 047){if(j < 1)goto ret; goto cont; } if(let < 'A')goto ret; if(let <= 'Z'){ wd[++j] = let - 0100; nwd[j] = let + ' '; goto cont; } if(let < 'a' || let > 'z')goto ret; wd[++j] = let - 0140; nwd[j] = let; cont: ; } while(((let = get(wfile)) == '.') || (let == 047)){ while((let = get(wfile)) != '\n'); } wflg = 1; ret: if(j < 1)goto beg; nwd[j+1] = '\n'; wd[j+1] = 0; return(j); } conf(n,width,cbuf) char cbuf[]; { auto i,a; i = width; while(i--)cbuf[i] = ' '; cbuf[(a = n/10)?conf(a,--width,cbuf):--width] = n%10 + '0'; return(++width); } incr(gork) int gork; { float log(), exp(), pow(); int static first; int ii; if(first == 0){ inctab[0] = 1; logtab[0] = -10; for(ii=1; ii<256; ii++){ inctab[ii] = exp(-ii/30.497); logtab[ii] = log(30.*pow(1.0333,ii+0.) - 30.) + .5; } logtab[1] = -10; first = 1; } if(inctab[gork] > rand()/32768.) gork++; if(gork > 255) gork = 255; return(gork); } #define NMOUNT 16 #define NAMSIZ 32 struct mtab { char file[NAMSIZ]; char spec[NAMSIZ]; } mtab[NMOUNT]; main(argc, argv) char **argv; { register struct mtab *mp; register char *p1, *p2; int mf; mf = open("/etc/mtab", 0); read(mf, mtab, NMOUNT*2*NAMSIZ); if(argc != 2) { printf("arg count\n"); return; } if (umount(argv[1]) < 0) { perror("umount"); return; } p1 = argv[1]; while(*p1++) ; p1--; while(*--p1 == '/') *p1 = '\0'; while(p1 > argv[1] && *--p1 != '/') ; if(*p1 == '/') p1++; argv[1] = p1; for (mp = mtab; mp < &mtab[NMOUNT]; mp++) { p1 = argv[1]; p2 = &mp->spec[0]; while (*p1++ == *p2) if (*p2++ == 0) { for (p1 = mp->file; p1 < &mp->file[NAMSIZ*2];) *p1++ = 0; mp = &mtab[NMOUNT]; while ((--mp)->file[0] == 0); mf = creat("/etc/mtab", 0644); write(mf, mtab, (mp-mtab+1)*2*NAMSIZ); return; } } printf("%s not in mount table\n", argv[1]); } fields 0; letters 0; linec; mode; uniq; main(argc, argv) int argc; char *argv[]; { extern fin, fout; int f; static char b1[1000], b2[1000]; loop: if(argc > 1) { if(*argv[1] == '-') { if(argv[1][1] <= '9') fields = conv(&argv[1][1]); else mode = argv[1][1]; argc--; argv++; goto loop; } if(*argv[1] == '+') { letters = conv(&argv[1][1]); argc--; argv++; goto loop; } f = open(argv[1], 0); if(f < 0) { printf("cannot open %s\n", argv[1]); exit(); } fin = f; } else fin = dup(0); if(argc > 2) { f = creat(argv[2], 0666); if(f < 0) { printf("cannot create %s\n", argv[2]); exit(); } fout = f; } else fout = dup(1); close(0); close(1); gline(b1); l1: linec++; if(gline(b2)) { pline(b1); flush(); exit(); } if(equal(b1, b2)) goto l1; pline(b1); linec = 0; l2: linec++; if(gline(b1)) { pline(b2); flush(); exit(); } if(equal(b1, b2)) goto l2; pline(b2); linec = 0; goto l1; } gline(buf) char buf[]; { int c; while((c = getchar()) != '\n') { if(c == '\0') return(1); *buf++ = c; } *buf = 0; return(0); } pline(buf) char buf[]; { int c; switch(mode) { case 'u': if(uniq) {; uniq = 0; return; } break; case 'd': if(uniq) break; return; case 'c': printf("%4d ", linec); } uniq = 0; while((c = *buf++) != 0) putchar(c); putchar('\n'); } equal(b1, b2) char b1[], b2[]; { int c; b1 = skip(b1); b2 = skip(b2); while((c = *b1++) != 0) if(c != *b2++) return(0); if(*b2 != 0) return(0); uniq++; return(1); } char * skip(s) char *s; { int nf, nl; nf = nl = 0; while(nf++ < fields) { while(*s==' ' || *s=='\t') s++; while( !(*s==' ' || *s=='\t') ) if(*s == 0) return(s); else s++; } while(nl++ < letters) if(*s == 0) return(s); else s++; return(s); } conv(s) char *s; { int d, n; n = 0; for(;;) { d = *s++ - '0'; if(0>d || d>9) break; n = n*10 + d; } return(n); } sys fork br 1f sys exit 1: sys sync mov $30.,r0 sys sleep br 1b sleep = 35. sync = 36. #define NUL 1 #define SPC 2 #define PUN 4 #define ALP 8 #define NEW 16 int linect[2]; int alphct[2]; int punct[2]; int wordct[2]; int ctlct[2]; int roffflg 0; int codeflg 0; char *code "-lw"; char class[128] { NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL, NUL,SPC,NEW,NUL,NUL,NUL,NUL,NUL, NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL, NUL,NUL,NUL,NUL,NUL,NUL,NUL,NUL, SPC,PUN,PUN,PUN,PUN,PUN,PUN,PUN, PUN,PUN,PUN,PUN,PUN,PUN,PUN,PUN, ALP,ALP,ALP,ALP,ALP,ALP,ALP,ALP, ALP,ALP,PUN,PUN,PUN,PUN,PUN,PUN, PUN,ALP,ALP,ALP,ALP,ALP,ALP,ALP, ALP,ALP,ALP,ALP,ALP,ALP,ALP,ALP, ALP,ALP,ALP,ALP,ALP,ALP,ALP,ALP, ALP,ALP,ALP,PUN,PUN,PUN,PUN,ALP, PUN,ALP,ALP,ALP,ALP,ALP,ALP,ALP, ALP,ALP,ALP,ALP,ALP,ALP,ALP,ALP, ALP,ALP,ALP,ALP,ALP,ALP,ALP,ALP, ALP,ALP,ALP,PUN,PUN,PUN,PUN,NUL }; char buf[518]; main(argc,argv) char **argv; { int i, j; register int c; if(--argc>=1 & **++argv=='-') { /* `&' is intentional */ for(i=1;c=argv[0][i];i++) if(c=='r') roffflg = 1; else codeflg = 1; if(codeflg) code = argv[0]; argc--; argv++; } i = 0; do { if(argc<=0) buf[0] = 0; else if(fopen(argv[i],buf)<0) { printf("%s: cannot open\n", argv[i]); continue; } count(); for(j=1;code[j];j++) { switch(code[j]) { case 'l': putd(linect); break; case 'a': putd(alphct); break; case 'p': putd(punct); break; case 'w': putd(wordct); break; case 'c': putd(ctlct); break; } } printf("%s\n", argc<=0?"":argv[i]); } while(++i=0) { c =& 0177; if(newline) { if(roffflg&&(c=='.'||c=='\'')) { inc(ctlct); while(((c=getc(buf)>=0))&&c!='\n'); continue; } else { newline = 0; inc(linect); } } if(c<0) continue; c = class[c]; if(c&NUL) continue; if(c&(ALP|PUN)) { if(token==c) continue; if(token==0) inc(wordct); token = c; if(c&ALP) inc(alphct); else inc(punct); continue; } if(c&(SPC|NEW)) { token = 0; if(c&NEW) newline = 1; } } } clear(ct) int ct[2]; { ct[0] = ct[1] = 0; } inc(ct) int ct[2]; { ct[0]++; if(ct[0]==0) ct[1]++; } putd(ct) int ct[2]; { printf("%7s ",locv(ct[1],ct[0])); } /* * who */ int fout; int buf[256]; main(argc, argv) char **argv; { char *s, *cbuf; int n, fi, i; struct { char name[8]; char tty; char pad1; int time[2]; char pad2[2]; } *p; s = "/tmp/utmp"; if(argc > 1) s = argv[1]; fi = open(s, 0); if(fi < 0) { write("cannot open wtmp\n", 17); exit(); } fout = dup(1); close(1); loop: n = read(fi, buf, 512); if(n == 0) { flush(); exit(); } p = &buf; for(p = &buf; (n=-16)>=0; p++) { if(p->name[0] == '\0' && argc==1) continue; for(i=0; i<8; i++) { if(p->name[i] == '\0') p->name[i] = ' '; putchar(p->name[i]); } for(i=0; i<3; i++) putchar("tty"[i]); putchar(p->tty); cbuf = ctime(p->time); for(i=3; i<16; i++) putchar(cbuf[i]); putchar('\n'); } goto loop; } / write -- write to another user .globl ttyn cmp (sp)+,$2 beq 1f bgt 2f mov $1,r0 sys write; argm; eargm-argm sys exit 2: movb *4(sp),ltty 1: tst (sp)+ mov (sp)+,r5 sys open; utmp; 0 bec 1f mov $1,r0 sys write; film; efilm-film sys exit 1: mov r0,ufil 1: mov ufil,r0 sys read; ubuf; 16. tst r0 bne 2f jmp 8f 2: tstb ltty beq 2f cmpb ltty,8.+ubuf bne 1b 2: mov $ubuf,r3 mov r5,r4 mov $9.,r2 2: dec r2 beq 2f cmpb (r4)+,(r3)+ beq 2b tstb -1(r4) bne 1b cmpb $' ,-1(r3) bne 1b 2: movb 8.+ubuf,ttyno sys open; ttyx; 1 bes 3f sys stat; ttyx; statbuf bes 3f bit $2,statbuf+4 bne 2f 3: mov $1,r0 sys write; dnymes; ednymes-dnymes sys exit 2: mov r0,ttyf clr r0 jsr pc,ttyn mov r0,r3 mov statbuf,r4 mov ufil,r0 sys seek; 0; 0 1: mov ufil,r0 sys read; ubuf; 16. tst r0 beq unknown cmp r3,ubuf+8. bne 1b mov $ubuf,r0 mov $8.,r1 1: cmpb $' ,(r0)+ beq 1f dec r1 bne 1b 1: neg r1 add $8,r1 mov r1,0f 6: mov ttyf,r0 sys write; mesg; emesg-mesg mov ttyf,r0 sys 0; 5f .data 5: sys write; ubuf; 0:2 .text mov ttyf,r0 sys write; qnl; 4 sys signal; 2; 9f 7: clr r0 sys read; ch; 1 tst r0 beq 9f tst nlflg beq 1f cmp ch,$'! bne 1f sys fork br mshproc sys wait mov $1,r0 sys write; excl; 2 br 7b 1: clr nlflg cmp ch,$'\n bne 1f inc nlflg 1: mov ttyf,r0 sys write; ch; 1 br 7b 8: movb (r5)+,ch beq 8f mov $1,r0 sys write; ch; 1 br 8b 8: tstb ltty beq 8f mov $1,r0 sys write; ltty-1; 2 8: mov $1,r0 sys write; errmsg; eerrmsg-errmsg sys exit 9: mov ttyf,r0 sys write; endmsg; eendmsg-endmsg sys exit unknown: mov $"??,ubuf br 6b mshproc: sys exec; msh; mshp sys exit .data nlflg: 1 .text mshp: msh 0 msh: argm: eargm: film: efilm: .data < > / is ltty -1 ltty: .=.+1 .text excl: qnl: <...\n> .data ttyx: ttyno = .-2 .text utmp: endmsg: eendmsg: errmsg: < not logged in.\n> eerrmsg: mesg: <\nMessage from > emesg: dnymes: ednymes: .even .bss ttyf: .=.+2 ubuf: .=.+16. statbuf:.=.+40. ch: .=.+2 ufil: .=.+2 signal = 48. 9su.c:sum.s;sync.c<tee.c=time.s>tp1.s?tp2.s@tp3.sAtp4.sBtr.cCtty.sDtypo.cEumount.cFuniq.cGupdate.sHwc.cIwho.cJwrite.sldfps = 170100^tst stfps = 170200^tst / .globl atan .globl atan2 / / floating-point arctangent / / atan replaces the value in fr0 by its arctangent / in the range [-pi/2,pi/2]. / / atan2 places in fr0 the arctangent of fr0/fr1 / in the range [-pi,pi]. / / there are no error exits / / coefficients are #5076 from Hart & Cheney. / / atan: jsr r0,save tstf fr0 cfcc blt 1f jsr r5,satan br ret 1: negf fr0 jsr r5,satan negf fr0 br ret / atan2: jsr r0,save clr -(sp) tstf fr0 cfcc bge 1f inc (sp) negf fr0 1: tstf fr1 cfcc beq 2f bgt 1f add $2,(sp) negf fr1 1: divf fr1,fr0 jsr r5,satan br 1f 2: movf pi2,fr0 1: bit $2,(sp) beq 1f negf fr0 addf pi2,fr0 addf pi2,fr0 1: bit $1,(sp)+ beq 1f negf fr0 1: ret: ldfps (sp)+ movf (sp)+,fr3 movf (sp)+,fr2 movf (sp)+,fr1 mov (sp)+,r0 rts r5 save: movf fr1,-(sp) movf fr2,-(sp) movf fr3,-(sp) stfps -(sp) ldfps $40200 / DP, no interrupt jmp (r0) satan: cmpf sq2m1,fr0 cfcc bge arctan cmpf sq2p1,fr0 cfcc bgt 1f movf one,fr1 divf fr0,fr1 movf fr1,fr0 jsr r5,arctan negf fr0 addf pi2,fr0 rts r5 1: movf fr0,fr1 subf one,fr0 addf one,fr1 divf fr1,fr0 jsr r5,arctan addf pi4,fr0 rts r5 arctan: mov $p4p,r0 mov $4,-(sp) movf fr0,fr3 mulf fr3,fr3 movf *(r0)+,fr1 1: mulf fr3,fr1 addf *(r0)+,fr1 dec (sp) bne 1b mov $4,(sp) movf fr3,fr2 br 2f 1: mulf fr3,fr2 2: addf *(r0)+,fr2 dec (sp) bne 1b tst (sp)+ divf fr2,fr1 mulf fr1,fr0 rts r5 / p4p: p4;p3;p2;p1;p0 q3;q2;q1;p0 one: 40200;0;0;0 pi2: 40311;7732;121041;64302 pi4: 40111;7732;121041;64302 sq2p1: 40432 101171 114774 167461 sq2m1: 37724 11714 147747 74621 p4: 37442 145026 75504 15621 p3: 40725 21566 115517 50305 p2: 41443 160206 172714 25441 p1: 41632 172223 76027 56645 p0: 41462 25125 6152 126064 q3: 41170 10112 141724 64324 q2: 41573 53776 25372 71522 q1: 41670 123114 51576 75020 / one = 1.00000 00000 00000 00000 d0 / sq2p1=2.41421 35623 73095 04880 d0 / sq2m1= .41421 35623 73095 04880 d0 / pi2 = 1.57079 63267 94896 61923 d0 / p4 = .15897 40288 48230 7048 d0 / p3 = .66605 79017 00926 2658 d1 / p2 = .40969 26483 21022 5637 d2 / p1 = .77477 68771 92042 0862 d2 / p0 = .44541 34005 92906 8032 d2 / q4 = .10000 00000 00000 0000 d1 / q3 = .15503 97755 14219 8753 d2 / q2 = .62835 93051 10323 7683 d2 / q1 = .92324 80107 23009 7484 d2 / q0 = .44541 34005 92906 8044 d2 ldfps = 170100^tst stfps = 170200^tst / .globl atof .globl atoi / / atof - ascii to floating (input) conversion / uses klt's ghastly calling convention / result is returned in fr0 / / atof: stfps -(sp) ldfps $200 movf fr1,-(sp) mov r1,-(sp) mov r2,-(sp) / clr -(sp) clrf fr0 clr r2 jsr r5,*(r5) cmpb r0,$'- bne 2f inc (sp) 1: jsr r5,*(r5) 2: sub $'0,r0 cmp r0,$9. bhi 2f jsr pc,digit br 1b inc r2 br 1b 2: cmpb r0,$'.-'0 bne 2f 1: jsr r5,*(r5) sub $'0,r0 cmp r0,$9. bhi 2f jsr pc,digit dec r2 br 1b 2: cmpb r0,$'e-'0 bne 1f mov (r5),0f jsr r5,atoi; 0:.. sub $'0,r0 add r1,r2 1: movf $one,fr1 mov r2,-(sp) beq 2f bgt 1f neg r2 1: cmp r2,$38. blos 1f clrf fr0 tst (sp)+ bmi out movf $huge,fr0 br out 1: mulf $ten,fr1 sob r2,1b 2: tst (sp)+ bge 1f divf fr1,fr0 br 2f 1: mulf fr1,fr0 cfcc bvc 2f movf $huge,fr0 2: out: tst (sp)+ beq 1f negf fr0 1: add $'0,r0 mov (sp)+,r2 mov (sp)+,r1 movf (sp)+,fr1 ldfps (sp)+ tst (r5)+ rts r5 / / digit: cmpf $big,fr0 cfcc blt 1f mulf $ten,fr0 movif r0,fr1 addf fr1,fr0 rts pc 1: add $2,(sp) rts pc / / one = 40200 ten = 41040 big = 56200 huge = 77777 / atoi / ascii to integer input conversion / jsr r5,atoi; getc .globl atoi atoi: clr r1 jsr r5,*(r5) clr -(sp) cmp r0,$'- bne 2f inc (sp) 1: jsr r5,*(r5) 2: sub $'0,r0 cmp r0,$9 bhi 1f mpy $10.,r1 add r0,r1 br 1b 1: add $'0,r0 tst (sp)+ beq 1f neg r1 1: tst (r5)+ rts r5 / default comparison routine for qsort / set codes for / / cmp (r0),(r4) / .globl compare compare: mov r3,-(sp) mov r4,-(sp) 1: cmpb (r0)+,(r4)+ bne 1f dec r3 bne 1b clr r0 br 2f 1: blo 1f mov $1,r0 br 2f 1: mov $-1,r0 2: mov (sp)+,r4 mov (sp)+,r3 tst r0 rts pc / crypt -- password incoding / mov $key,r0 / jsr pc,crypt .globl crypt, word crypt: mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov r4,-(sp) mov r5,-(sp) mov r0,r1 mov $key,r0 movb $004,(r0)+ movb $034,(r0)+ 1: cmp r0,$key+64. bhis 1f movb (r1)+,(r0)+ bne 1b 1: dec r0 / / / fill out key space with clever junk / mov $key,r1 1: movb -1(r0),r2 movb (r1)+,r3 xor r3,r2 movb r2,(r0)+ cmp r0,$key+128. blo 1b / / / establish wheel codes and cage codes / mov $wheelcode,r4 mov $cagecode,r5 mov $256.,-(sp) 2: clr r2 clr (r4) mov $wheeldiv,r3 3: clr r0 mov (sp),r1 div (r3)+,r0 add r1,r2 bic $40,r2 bis shift(r2),(r4) cmp r3,$wheeldiv+6. bhis 4f bis shift+4(r2),(r5) 4: cmp r3,$wheeldiv+10. blo 3b sub $2,(sp) tst (r4)+ tst (r5)+ cmp r4,$wheelcode+256. blo 2b tst (sp)+ / .data shift: 1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000 1;2 wheeldiv: 32.; 18.; 10.; 6.; 4. .bss cagecode: .=.+256. wheelcode: .=.+256. .text / / / make the internal settings of the machine / both the lugs on the 128 cage bars and the lugs / on the 16 wheels are set from the expanded key / mov $key,r0 mov $cage,r2 mov $wheel,r3 1: movb (r0)+,r1 bic $!177,r1 asl r1 mov cagecode(r1),(r2)+ mov wheelcode(r1),(r3)+ cmp r0,$key+128. blo 1b / / / now spin the cage against the wheel to produce output. / mov $word,r4 mov $wheel+128.,r3 3: mov -(r3),r2 mov $cage,r0 clr r5 1: bit r2,(r0)+ beq 2f incb r5 2: cmp r0,$cage+256. blo 1b / / we have a piece of output from current wheel / it needs to be folded to remove lingering hopes of / inverting the function / mov r4,-(sp) clr r4 div $26.+26.+10.,r4 add $'0,r5 cmp r5,$'9 blos 1f add $'A-'9-1,r5 cmp r5,$'Z blos 1f add $'a-'Z-1,r5 1: mov (sp)+,r4 movb r5,(r4)+ cmp r4,$word+8. blo 3b / mov (sp)+,r5 mov (sp)+,r4 mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 mov $word,r0 rts pc .bss key: .=.+128. word: .=.+32. cage: .=.+256. wheel: .=.+256. # /* * This routine converts time as follows. * The epoch is 0000 Jan 1 1970 GMT. * The argument time is in seconds since then. * The localtime(t) entry returns a pointer to an array * containing * seconds (0-59) * minutes (0-59) * hours (0-23) * day of month (1-31) * month (0-11) * year-1970 * weekday (0-6, Sun is 0) * day of the year * daylight savings flag * * The routine corrects for daylight saving * time and will work in any time zone provided * "timezone" is adjusted to the difference between * Greenwich and local standard time (measured in seconds). * In places like Michigan "daylight" must * be initialized to 0 to prevent the conversion * to daylight time. * * "nixonflg,", if set to 1, will * cause daylight savings time all year around * independently of "daylight". * * The routine does not work * in Saudi Arabia which runs on Solar time. * * asctime(tvec)) * where tvec is produced by localtime * returns a ptr to a character string * that has the ascii time in the form * Thu Jan 01 00:00:00 1970n0\\ * 01234567890123456789012345 * 0 1 2 * * ctime(t) just calls localtime, then asctime. */ char cbuf[26]; int dmsize[12] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int timezone 5*60*60; int tzname[] { "EST", "EDT", }; int daylight 1; /* Allow daylight conversion */ int nixonflg 1; /* Daylight time all year around */ #define SEC 0 #define MIN 1 #define HOUR 2 #define MDAY 3 #define MON 4 #define YEAR 5 #define WDAY 6 #define YDAY 7 #define ISDAY 8 ctime(at) int *at; { return(asctime(localtime(at))); } localtime(tim) int tim[]; { register int *t, *ct, dayno; int daylbegin, daylend; int copyt[2]; t = copyt; t[0] = tim[0]; t[1] = tim[1]; dpadd(t, -timezone); ct = gmtime(t); dayno = ct[YDAY]; if (nixonflg && (ct[YEAR]>74 || ct[YEAR]==74 && (dayno > 5 || dayno==5 && ct[HOUR]>=2))) { daylight =| 1; daylbegin = -1; daylend = 367; } else { daylbegin = sunday(ct, 119); /* last Sun in Apr */ daylend = sunday(ct, 303); /* last Sun in Oct */ } if (daylight && (dayno>daylbegin || (dayno==daylbegin && ct[HOUR]>=2)) && (dayno= dysize(d1); d1++) d0 =- dysize(d1); xtime[YEAR] = d1; xtime[YDAY] = d0; /* * generate month */ if (dysize(d1)==366) dmsize[1] = 29; for(d1=0; d0 >= dmsize[d1]; d1++) d0 =- dmsize[d1]; dmsize[1] = 28; *tp++ = d0+1; *tp++ = d1; xtime[ISDAY] = 0; return(xtime); } asctime(t) int *t; { register char *cp, *ncp; register int *tp; cp = cbuf; for (ncp = "Day Mon 00 00:00:00 1900\n"; *cp++ = *ncp++;); ncp = &"SunMonTueWedThuFriSat"[3*t[6]]; cp = cbuf; *cp++ = *ncp++; *cp++ = *ncp++; *cp++ = *ncp++; cp++; tp = &t[4]; ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[(*tp)*3]; *cp++ = *ncp++; *cp++ = *ncp++; *cp++ = *ncp++; cp = numb(cp, *--tp); cp = numb(cp, *--tp+100); cp = numb(cp, *--tp+100); cp = numb(cp, *--tp+100); cp =+ 2; cp = numb(cp, t[YEAR]); return(cbuf); } dysize(y) { if((y%4) == 0) return(366); return(365); } numb(acp, n) { register char *cp; cp = acp; cp++; if (n>=10) *cp++ = (n/10)%10 + '0'; else *cp++ = ' '; *cp++ = n%10 + '0'; return(cp); } / C library -- signed dp add .globl _dpadd _dpadd: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 tst 6(r5) sxt r1 add r1,(r0)+ add 6(r5),(r0) adc -(r0) mov (sp)+,r5 rts pc ldfps = 170100^tst stfps = 170200^tst / ftoa -- basic g fp conversion .globl _ndigit .globl ecvt .globl fcvt / ecvt converts fr0 into decimal / the string of converted digits is pointed to by r0. / the number of digits are specified by _ndigit / r2 contains the decimal point / r1 contains the sign fcvt: clr eflag br 1f ecvt: mov $1,eflag 1: stfps -(sp) ldfps $200 movf fr0,-(sp) movf fr1,-(sp) mov r3,-(sp) mov $buf,r1 clr r2 clr sign tstf fr0 cfcc beq zer bgt 1f inc sign negf fr0 1: modf $one,fr0 tstf fr1 cfcc beq lss gtr: movf fr0,-(sp) movf fr1,fr0 1: mov $buftop,r3 1: modf tenth,fr0 movf fr0,fr2 movf fr1,fr0 addf $epsilon,fr2 modf $ten,fr2 movfi fr3,r0 add $'0,r0 movb r0,-(r3) inc r2 tstf fr0 cfcc bne 1b / mov $buf,r1 1: movb (r3)+,(r1)+ cmp r3,$buftop blo 1b / movf (sp)+,fr0 br pad zer: inc r2 br pad lss: dec r2 modf $ten,fr0 tstf fr1 cfcc beq lss inc r2 jsr pc,digit1 pad: jsr pc,digit br out br pad digit: cmp r1,$buftop bhis 1f add $2,(sp) modf $ten,fr0 digit1: movfi fr1,r0 add $'0,r0 movb r0,(r1)+ 1: rts pc / out: mov $buf,r0 add _ndigit,r0 tst eflag bne 1f add r2,r0 1: cmp r0,$buf blo outout movb (r0),r3 add $5,r3 movb r3,(r0) 1: cmpb (r0),$'9 ble 1f movb $'0,(r0) cmp r0,$buf blos 2f incb -(r0) br 1b 2: movb $'1,(r0) inc r2 1: outout: mov sign,r1 mov _ndigit,r0 tst eflag bne 1f add r2,r0 1: clrb buf(r0) mov $buf,r0 mov (sp)+,r3 movf (sp)+,fr1 movf (sp)+,fr0 ldfps (sp)+ rts pc epsilon = 037114 one = 40200 ten = 41040 .data tenth: 037314; 146314; 146314; 146315 _ndigit:10. .bss buf: .=.+40. buftop: sign: .=.+2 eflag: .=.+2 .text .globl exp / ldfps = 170100^tst stfps = 170200^tst ldexp = 176400^movif stexp = 175000^movfi / / exp accepts its argument and returns its result / in fr0. The carry bit is set if the result overflows. / The coefficients are #1067 from Hart & Cheney. / / movf arg,fr0 / jsr r5,exp / movf fr0,result / exp: stfps -(sp) ldfps $200 /di mode movf fr2,-(sp) movf fr1,-(sp) tstf fr0 cfcc bne 1f movf $one,fr0 /exp(0) clc br out 1: modf log2e,fr0 /exp(x) = 2^(x*log2(e)) cfcc bmi 2f movfi fr1,-(sp) /save integer part subf $half,fr0 br 3f 2: movfi fr1,-(sp) dec (sp) addf $half,fr0 3: movf fr0,fr1 / -.5 < x < +.5 mulf fr1,fr1 /arg**2 / movf P2,fr2 mulf fr1,fr2 addf P1,fr2 mulf fr1,fr2 addf P0,fr2 mulf fr2,fr0 /xP(x**2) / movf fr1,fr2 addf Q1,fr2 mulf fr1,fr2 addf Q0,fr2 /Q(x**2) / movf fr2,fr1 subf fr0,fr1 addf fr2,fr0 divf fr1,fr0 /(Q+xP)/(Q-xP) mulf sqrt2,fr0 / stexp fr0,-(sp) add (sp)+,(sp) / cmp (sp),$177 ble 2f tst (sp)+ movf big,fr0 /overflow sec br 1f 2: cmp (sp),$-177 bge 2f tst (sp)+ clrf fr0 /underflow clc br 1f 2: ldexp (sp)+,fr0 clc 1: out: movf (sp)+,fr1 movf (sp)+,fr2 ldfps (sp)+ rts r5 / / P0: 42675; 36404; 77563; 46675 P1: 41241; 116724; 114237; 60333 P2: 36675; 27102; 125560; 136652 Q0: 43210; 100661; 76072; 62453 Q1: 42151; 27450; 75350; 112503 log2e: 40270; 125073; 24534; 13761 sqrt2: 40265; 02363; 31771; 157144 half = 40000 one = 40200 / big: 77777; 177777; 177777; 177777 / / P0 = .15139 06799 05433 89158 94328 d4 / P1 = .20202 06565 12869 27227 886 d2 / P2 = .23093 34775 37502 33624 d-1 / / Q0 = .43682 11662 72755 84984 96814 d4 / Q1 = .23318 42114 27481 62379 0295 d3 / Q2 = .1 d1 / / log2e = 1.44269 50408 88963 40735 99246 / sqrt2 = 1.41421 35623 73095 04880 16887 / fakefp -- fake floating point simulator .globl fptrap fptrap: sub $2,(sp) 2 / rti / fp1 -- floating point simulator rti = 2 bpt = 3 m.ext = 200 / long mode bit m.lngi = 100 / long integer mode .globl fptrap .globl ac0, ac1, ac2, ac3 fptrap: dec reenter bge 1f 4 / reentered! 1: mov (sp)+,spc mov (sp)+,sps mov r0,sr0 sys signal; 4; fptrap mov $sr1,r0 mov r1,(r0)+ mov r2,(r0)+ mov r3,(r0)+ mov r4,(r0)+ mov r5,(r0)+ mov sp,(r0)+ sub $8,sp / room for double push mov (r0),r5 / pc clr trapins mov -(r5),r5 / trapped instruction mov r5,r4 bic $7777,r4 cmp r4,$170000 beq 1f jmp badins 1: bic $100000,fpsr / clear fp error bic $170000,r5 mov r5,r4 bit $7000,r4 bne class3 bit $700,r4 bne class2 cmp r4,$12 blos 1f jmp badins 1: asl r4 jmp *1f(r4) 1: i.cfcc / 170000 i.setf / 170001 i.seti / 170002 badins badins badins badins badins badins i.setd / 170011 i.setl / 170012 class2: cmp r5,$400 bge 1f jsr r1,fsrc; mod0rx; mod242 br 2f 1: jsr r1,fsrc; mod0f; mod24f 2: mov r3,r5 asl r4 asl r4 clrb r4 swab r4 asl r4 jsr pc,*1f(r4) jmp sret 1: badins / 1700xx i.ldfps / 1701xx i.stfps / 1702xx badins / 1703xx - stst i.clrx / 1704xx i.tstx / 1705xx i.absx / 1706xx i.negx / 1707xx class3: cmp r5,$5000 blt 1f mov r5,r2 clrb r2 cmp r2,$6400 blt 2f sub $1400,r2 2: cmp r2,$5000 bne 2f jsr r1,fsrc; mod0rx; mod242 br 3f 2: cmp r2,$5400 bne 2f jsr r1,fsrc; mod0ra; mod24i br 3f 2: jsr r1,fsrc; mod0f; mod24d br 3f 1: jsr r1,fsrc; mod0f; mod24f 3: jsr pc,freg mov r2,r5 clrb r4 swab r4 asl r4 jsr pc,*1f(r4) br sret 1: badins / 1700xx badins / 1704xx i.mulx / 1710xx i.modx / 1714xx i.addx / 1720xx i.ldx / 1724xx i.subx / 1730xx i.cmpx / 1734xx i.stx / 1740xx i.divx / 1744xx i.stexp / 1750xx i.stcxj / 1754xx i.stcxy / 1760xx i.ldexp / 1764xx i.ldcjx / 1770xx i.ldcyx / 1774xx i.cfcc: mov fpsr,r0 bic $!17,r0 mov r0,sps br ret i.setf: bic $m.ext,fpsr br ret i.setd: bis $m.ext,fpsr br ret i.seti: bic $m.lngi,fpsr br ret i.setl: bis $m.lngi,fpsr br ret badins: inc trapins br ret sret: mov $fpsr,r0 bic $17,(r0) tst (r5) bpl 1f bis $10,(r0) br ret 1: bne ret bis $4,(r0) ret: mov $sr1,r0 mov (r0)+,r1 mov (r0)+,r2 mov (r0)+,r3 mov (r0)+,r4 mov (r0)+,r5 mov (r0)+,sp mov sr0,r0 mov sps,-(sp) mov spc,-(sp) tst trapins bne 1f inc reenter rti 1: bpt freg: mov r5,r2 bic $!300,r2 asr r2 asr r2 asr r2 add $ac0,r2 rts pc fsrc: mov r5,r3 bic $!7,r3 / register asl r3 add $sr0,r3 mov r5,r0 bic $!70,r0 / mode asr r0 asr r0 jmp *1f(r0) 1: mod0 mod1 mod2 mod3 mod4 mod5 mod6 mod7 mod24f: mov $4,r0 bit $m.ext,fpsr beq 1f add $4,r0 1: rts pc mod24d: mov $8,r0 bit $m.ext,fpsr beq 1f sub $4,r0 1: rts pc mod242: mov $2,r0 rts pc mod24i: mov $2,r0 bit $m.lngi,fpsr beq 1f add $2,r0 1: rts pc mod0: jmp *(r1)+ mod0f: sub $sr0,r3 / get fp ac cmp r3,$6*2 bhis badi1 asl r3 asl r3 add $ac0,r3 tst (r1)+ rts r1 mod0ra: bit $m.lngi,fpsr bne badi1 mod0r: cmp r3,$ssp bhis badi1 mod0rx: tst (r1)+ rts r1 mod1: cmp r3,$spc beq badi1 mov (r3),r3 br check mod2: mov (r3),-(sp) jsr pc,*2(r1) cmp r3,$spc bne 1f mov $2,r0 mov *(r3),pctmp mov $pctmp,(sp) 1: add r0,(r3) mov (sp)+,r3 br check mod3: mov *(r3),-(sp) add $2,(r3) mov (sp)+,r3 br check mod4: cmp r3,$spc / test pc beq badi1 jsr pc,*2(r1) sub r0,(r3) mov (r3),r3 br check mod5: cmp r3,$spc beq badi1 sub $2,(r3) mov *(r3),r3 br check mod6: mov *spc,-(sp) add $2,spc add (r3),(sp) mov (sp)+,r3 br check mod7: jsr r1,mod6; ..; .. mov (r3),r3 br check badi1: jmp badins check: bit $1,r3 bne badi1 cmp (r1)+,(r1)+ rts r1 setab: mov $asign,r0 jsr pc,seta mov r3,r2 mov $bsign,r0 seta: clr (r0) mov (r2)+,r1 mov r1,-(sp) beq 1f blt 2f inc (r0)+ br 3f 2: dec (r0)+ 3: bic $!177,r1 bis $200,r1 br 2f 1: clr (r0)+ 2: mov r1,(r0)+ mov (r2)+,(r0)+ bit $m.ext,fpsr beq 2f mov (r2)+,(r0)+ mov (r2)+,(r0)+ br 3f 2: clr (r0)+ clr (r0)+ 3: mov (sp)+,r1 asl r1 clrb r1 swab r1 sub $200,r1 mov r1,(r0)+ / exp rts pc norm: mov $areg,r0 mov (r0)+,r1 mov r1,-(sp) mov (r0)+,r2 bis r2,(sp) mov (r0)+,r3 bis r3,(sp) mov (r0)+,r4 bis r4,(sp)+ bne 1f clr asign rts pc 1: bit $!377,r1 beq 1f clc ror r1 ror r2 ror r3 ror r4 inc (r0) br 1b 1: bit $200,r1 bne 1f asl r4 rol r3 rol r2 rol r1 dec (r0) br 1b 1: mov r4,-(r0) mov r3,-(r0) mov r2,-(r0) mov r1,-(r0) rts pc 6 7 8 9 : ; < = > / fp2 -- floating point simulation i.ldx: mov (r3)+,(r2)+ mov (r3)+,(r2)+ bit $m.ext,fpsr beq 1f mov (r3)+,(r2)+ mov (r3)+,(r2)+ rts pc 1: clr (r2)+ clr (r2)+ rts pc i.stx: mov (r2)+,(r3)+ mov (r2)+,(r3)+ bit $m.ext,fpsr beq 1f mov (r2)+,(r3)+ mov (r2)+,(r3)+ 1: rts pc i.clrx: clr (r3)+ clr (r3)+ bit $m.ext,fpsr beq 1f clr (r3)+ clr (r3)+ 1: rts pc i.negx: tst (r3) beq 1f add $100000,(r3) 1: rts pc i.absx: bic $!77777,(r3) rts pc i.tstx: rts pc i.cmpx: mov $areg,r5 tst (r2) bge 1f tst (r3) bge 1f cmp (r2),(r3) bgt 4f blt 3f 1: cmp (r2)+,(r3)+ bgt 3f blt 4f cmp (r2)+,(r3)+ bne 1f bit $m.ext,fpsr beq 2f cmp (r2)+,(r3)+ bne 1f cmp (r2)+,(r3)+ beq 2f 1: bhi 3f 4: mov $1,(r5) rts pc 3: mov $-1,(r5) rts pc 2: clr (r5) rts pc i.ldcyx: mov (r3)+,(r2)+ mov (r3)+,(r2)+ bit $m.ext,fpsr bne 1f mov (r3)+,(r2)+ mov (r3)+,(r2)+ rts pc 1: clr (r2)+ clr (r2)+ rts pc i.stcxy: mov (r2)+,(r3)+ mov (r2)+,(r3)+ bit $m.ext,fpsr bne 1f clr (r3)+ clr (r3)+ 1: rts pc i.ldcjx: mov $asign,r0 mov $1,(r0)+ mov (r3)+,(r0)+ bit $m.lngi,fpsr beq 1f mov (r3)+,(r0)+ clr (r0)+ clr (r0)+ mov $32.-8,(r0)+ jmp saret 1: clr (r0)+ clr (r0)+ clr (r0)+ mov $16.-8,(r0) jmp saret i.stcxj: mov r3,r5 mov $asign,r0 jsr pc,seta mov $areg,r0 mov (r0)+,r1 mov (r0)+,r2 mov (r0)+,r3 mov aexp,r0 1: cmp r0,$48.-8 bge 1f clc ror r1 ror r2 ror r3 inc r0 br 1b 1: bgt xoflo tst r1 bne xoflo 1: bit $m.lngi,fpsr beq 1f tst asign bge 2f neg r3 adc r2 bcs 2f neg r2 2: mov r2,(r5) mov r3,2(r5) rts pc 1: tst r2 bne xoflo tst asign bge 2f neg r3 2: mov r3,(r5) rts pc xoflo: bis $1,fpsr / set fixed overflow (carry) jmp ret i.ldexp: mov $asign,r0 jsr pc,seta mov (r3),aexp jsr pc,reta jmp sret i.stexp: mov $asign,r0 jsr pc,seta mov aexp,(r3) mov r3,r5 jmp sret i.ldfps: mov (r3),fpsr jmp ret i.stfps: mov fpsr,(r3) jmp ret / fp3 -- floating simulation i.addx: jsr pc,setab br 1f i.subx: jsr pc,setab neg bsign 1: tst bsign beq reta tst asign beq retb mov areg+8,r1 sub breg+8,r1 blt 1f beq 2f cmp r1,$56. bge reta mov $breg,r0 br 4f 1: neg r1 cmp r1,$56. bge retb mov $areg,r0 4: mov r1,-(sp) mov (r0)+,r1 mov (r0)+,r2 mov (r0)+,r3 mov (r0)+,r4 add (sp),(r0) 1: clc ror r1 ror r2 ror r3 ror r4 dec (sp) bgt 1b mov r4,-(r0) mov r3,-(r0) mov r2,-(r0) mov r1,-(r0) tst (sp)+ 2: mov $areg+8,r1 mov $breg+8,r2 mov $4,r0 cmp asign,bsign bne 4f clc 1: adc -(r1) bcs 3f add -(r2),(r1) 2: dec r0 bne 1b br 5f 3: add -(r2),(r1) sec br 2b br 5f 4: clc 1: sbc -(r1) bcs 3f sub -(r2),(r1) 2: dec r0 bne 1b br 5f 3: sub -(r2),(r1) sec br 2b saret: mov $areg,r1 5: tst (r1) bge 3f mov $areg+8,r1 mov $4,r0 clc 1: adc -(r1) bcs 2f neg (r1) 2: dec r0 bne 1b neg -(r1) 3: jsr pc,norm br reta retb: mov $bsign,r1 mov $asign,r2 mov $6,r0 1: mov (r1)+,(r2)+ dec r0 bne 1b reta: mov r5,r2 mov $asign,r0 tst (r0) beq unflo mov aexp,r1 cmp r1,$177 bgt ovflo cmp r1,$-177 blt unflo add $200,r1 swab r1 clc ror r1 tst (r0)+ bge 1f bis $100000,r1 1: bic $!177,(r0) bis (r0)+,r1 mov r1,(r2)+ mov (r0)+,(r2)+ bit $m.ext,fpsr beq 1f mov (r0)+,(r2)+ mov (r0)+,(r2)+ 1: rts pc unflo: clr (r2)+ clr (r2)+ bit $m.ext,fpsr beq 1f clr (r2)+ clr (r2)+ 1: rts pc ovflo: bis $2,fpsr / set v-bit (overflow) jmp ret i.mulx: jsr pc,i.mul br saret i.modx: jsr pc,i.mul jsr pc,norm mov $asign,r0 mov $bsign,r1 mov $6,r2 1: mov (r0)+,(r1)+ dec r2 bne 1b clr r0 / count mov $200,r1 / bit clr r2 / reg offset 1: cmp r0,aexp bge 2f / in fraction bic r1,areg(r2) br 3f 2: bic r1,breg(r2) 3: inc r0 clc ror r1 bne 1b mov $100000,r1 add $2,r2 cmp r2,$8 blt 1b jsr pc,norm jsr pc,reta cmp r5,$ac1 beq 1f cmp r5,$ac3 beq 1f bit $200,breg bne 2f clr bsign 2: add $8,r5 jsr pc,retb sub $8,r5 1: rts pc i.divx: jsr pc,setab tst bsign beq ovflo sub bexp,aexp jsr pc,xorsign mov r5,-(sp) mov $areg,r0 mov (r0),r1 clr (r0)+ mov (r0),r2 clr (r0)+ mov (r0),r3 clr (r0)+ mov (r0),r4 clr (r0)+ mov $areg,r5 mov $400,-(sp) 1: mov $breg,r0 cmp (r0)+,r1 blt 2f bgt 3f cmp (r0)+,r2 blo 2f bhi 3f cmp (r0)+,r3 blo 2f bhi 3f cmp (r0)+,r4 bhi 3f 2: mov $breg,r0 sub (r0)+,r1 clr -(sp) sub (r0)+,r2 adc (sp) clr -(sp) sub (r0)+,r3 adc (sp) sub (r0)+,r4 sbc r3 adc (sp) sub (sp)+,r2 adc (sp) sub (sp)+,r1 bis (sp),(r5) 3: asl r4 rol r3 rol r2 rol r1 clc ror (sp) bne 1b mov $100000,(sp) add $2,r5 cmp r5,$areg+8 blo 1b tst (sp)+ mov (sp)+,r5 jmp saret i.mul: jsr pc,setab add bexp,aexp dec aexp jsr pc,xorsign mov r5,-(sp) mov $breg+4,r5 bit $m.ext,fpsr beq 1f add $4,r5 1: clr r0 clr r1 clr r2 clr r3 clr r4 1: asl r0 bne 2f inc r0 tst -(r5) 2: cmp r0,$400 bne 2f cmp r5,$breg bhi 2f mov $areg,r0 mov r1,(r0)+ mov r2,(r0)+ mov r3,(r0)+ mov r4,(r0)+ mov (sp)+,r5 rts pc 2: clc ror r1 ror r2 ror r3 ror r4 bit r0,(r5) beq 1b mov r0,-(sp) mov $areg,r0 add (r0)+,r1 clr -(sp) add (r0)+,r2 adc (sp) clr -(sp) add (r0)+,r3 adc (sp) add (r0)+,r4 adc r3 adc (sp) add (sp)+,r2 adc (sp) add (sp)+,r1 mov (sp)+,r0 br 1b xorsign: cmp asign,bsign beq 1f mov $-1,asign rts pc 1: mov $1,asign rts pc / fpx -- floating point simulation reenter: 1 .bss asign: .=.+2 areg: .=.+8 aexp: .=.+2 bsign: .=.+2 breg: .=.+8 bexp: .=.+2 fpsr: .=.+2 trapins: .=.+2 ac0: .=.+8. ac1: .=.+8. ac2: .=.+8. ac3: .=.+8. ac4: .=.+8. ac5: .=.+8. sr0: .=.+2 sr1: .=.+2 .=.+2 .=.+2 .=.+2 .=.+2 ssp: .=.+2 spc: .=.+2 sps: .=.+2 pctmp: .=.+8 .globl gamma, signgam, _signgam .globl log, sin half = 040000 one = 40200 two = 40400 eight = 41000 large = 77777 ldfps = 170100^tst stfps = 170200^tst / / gamma computes the log of the abs of the gamma function. / gamma accepts its argument and returns its result / in fr0. The carry bit is set if the result is / too large to represent. / The sign of the gamma function is / returned in the globl cell signgam. / / The coefficients for expansion around zero / are #5243 from Hart & Cheney; for expansion / around infinity they are #5404. / / movf arg,fr0 / jsr r5,gamma / movf fr0,... / gamma: stfps -(sp) ldfps $200 clr signgam movf fr1,-(sp) tstf fr0 cfcc ble negative cmpf $eight,fr0 cfcc blt asymptotic jsr r5,regular / lret: jsr r5,log bec ret 4 ret: movf (sp)+,fr1 ldfps (sp)+ clc rts r5 / erret: movf $large,fr0 movf (sp)+,fr1 ldfps (sp)+ sec rts r5 / / here for positive x > 8 / the log of the gamma function is / approximated directly by the asymptotic series. / asymptotic: movf fr0,-(sp) movf fr0,fr1 jsr r5,log subf $half,fr1 mulf fr1,fr0 subf (sp),fr0 addf goobie,fr0 / movf $one,fr1 divf (sp)+,fr1 movf fr0,-(sp) movf fr1,-(sp) mulf fr1,fr1 / mov r0,-(sp) mov $p5p,r0 mov $5,-(sp) movf *(r0)+,fr0 1: mulf fr1,fr0 addf *(r0)+,fr0 dec (sp) bne 1b tst (sp)+ mov (sp)+,r0 mulf (sp)+,fr0 addf (sp)+,fr0 br ret / / here on negative / the negative gamma is computed / in terms of the pos gamma. / negative: absf fr0 movf fr0,fr1 mulf pi,fr0 jsr r5,sin negf fr0 cfcc beq erret bgt 1f inc signgam absf fr0 1: mov signgam,-(sp) mulf fr1,fr0 divf pi,fr0 jsr r5,log movf fr0,-(sp) movf fr1,fr0 jsr r5,gamma addf (sp)+,fr0 negf fr0 mov (sp)+,signgam br ret / / control comes here for arguments less than 8. / if the argument is 23 then the argument / is reduced in range by the formula / gamma(x+1) = x*gamma(x) / regular: subf $two,fr0 cfcc bge 1f addf $two,fr0 movf fr0,-(sp) addf $one,fr0 movf fr0,-(sp) addf $one,fr0 jsr r5,regular divf (sp)+,fr0 divf (sp)+,fr0 rts r5 1: cmpf $one,fr0 cfcc bgt 1f addf $one,fr0 movf fr0,-(sp) subf $two,fr0 jsr r5,1b mulf (sp)+,fr0 rts r5 1: movf fr2,-(sp) mov r0,-(sp) mov $p4p,r0 mov $6,-(sp) movf fr0,fr2 movf *(r0)+,fr0 1: mulf fr2,fr0 addf *(r0)+,fr0 dec (sp) bne 1b mov $7,(sp) movf fr2,fr1 br 2f 1: mulf fr2,fr1 2: addf *(r0)+,fr1 dec (sp) bne 1b tst (sp)+ mov (sp)+,r0 divf fr1,fr0 movf (sp)+,fr2 rts r5 / p4p: p6;p5;p4;p3;p2;p1;p0 q6;q5;q4;q3;q2;q1;q0 / p6 = -.67449 50724 59252 89918 d1 / p5 = -.50108 69375 29709 53015 d2 / p4 = -.43933 04440 60025 67613 d3 / p3 = -.20085 27401 30727 91214 d4 / p2 = -.87627 10297 85214 89560 d4 / p1 = -.20886 86178 92698 87364 d5 / p0 = -.42353 68950 97440 89647 d5 / q7 = 1.0 d0 / q6 = -.23081 55152 45801 24562 d2 / q5 = +.18949 82341 57028 01641 d3 / q4 = -.49902 85266 21439 04834 d3 / q3 = -.15286 07273 77952 20248 d4 / q2 = +.99403 07415 08277 09015 d4 / q1 = -.29803 85330 92566 49932 d4 / q0 = -.42353 68950 97440 90010 d5 p1: 143643 26671 36161 72154 p2: 143410 165327 54121 172630 p3: 142773 10340 74264 152066 p4: 142333 125113 176657 75740 p5: 141510 67515 65111 24263 p6: 140727 153242 163350 32217 p0: 144045 70660 101665 164444 q1: 143072 43052 50302 136745 q2: 43433 50472 145404 175462 q3: 142677 11556 144553 154177 q4: 142371 101646 141245 11264 q5: 42075 77614 43022 27573 q6: 141270 123404 76130 12650 q0: 144045 70660 101665 164444 p5p: s5;s4;s3;s2;s1;s0 / / s5 = -.16334 36431 d-2 / s4 = +.83645 87892 2 d-3 / s3 = -.59518 96861 197 d-3 / s2 = +.79365 05764 93454 d-3 / s1 = -.27777 77777 35865 004 d-2 / s0 = +.83333 33333 33331 01837 d-1 / goobie = 0.91893 85332 04672 74178 d0 s5: 135726 14410 15074 17706 s4: 35533 42714 111634 76770 s3: 135434 3200 171173 156141 s2: 35520 6375 12373 111437 s1: 136066 5540 132625 63540 s0: 37252 125252 125252 125047 goobie: 40153 37616 41445 172645 pi: 40511 7732 121041 64302 .bss _signgam: signgam:.=.+2 L M N O P Q R S T / getw/getc -- get words/characters from input file / fopen -- open a file for use by get(c|w) / / calling sequences -- / / mov $filename,r0 / jsr r5,fopen; ioptr / / on return ioptr buffer is set up or error bit is set if / file could not be opened. / / jsr r5,get(c|w)1; ioptr / / on return char/word is in r0; error bit is / set on error or end of file. / / ioptr is the address of a 518-byte buffer / whose layout is as follows: / / ioptr: .=.+2 / file descriptor / .=.+2 / charact+2 / pointer to next character (reset if no. chars=0) / .=.+512. / the buffer .globl getc,getw,fopen fopen: mov r1,-(sp) mov (r5)+,r1 mov r0,0f sys 0; 9f .data 9: sys open; 0:..; 0 .text bes 1f mov r0,(r1)+ clr (r1)+ mov (sp)+,r1 rts r5 1: mov $-1,(r1) mov (sp)+,r1 sec rts r5 .data getw: mov (r5),9f mov (r5)+,8f jsr r5,getc; 8:.. bec 1f rts r5 1: mov r0,-(sp) jsr r5,getc; 9:.. swab r0 bis (sp)+,r0 rts r5 .text getc: mov r1,-(sp) mov (r5)+,r1 dec 2(r1) bge 1f mov r1,r0 add $6,r0 mov r0,0f mov r0,4(r1) mov (r1),r0 sys 0; 9f .data 9: sys read; 0:..; 512. .text bes 2f tst r0 bne 3f 2: mov (sp)+,r1 sec rts r5 3: dec r0 mov r0,2(r1) 1: clr r0 bisb *4(r1),r0 inc 4(r1) mov (sp)+,r1 rts r5 / hypot -- sqrt(fr0**2 + fr1**2) -> fr0; no overflow unless / necessary. / c-bit is set on overflow .globl hypot .globl sqrt hypot: movf fr1,-(sp) absf fr0 absf fr1 cmpf fr0,fr1 cfcc bne 1f movf $one,fr0 br 3f 1: blt 2f movf fr0,-(sp) movf fr1,fr0 movf (sp)+,fr1 2: divf fr1,fr0 mulf fr0,fr0 3: addf $one,fr0 jsr r5,sqrt mulf fr1,fr0 cfcc movf (sp)+,fr1 rts r5 one = 40200 / C library-- long divide/remainder .globl _ldiv, _ldivr .globl _lrem _ldiv: mov 2(sp),r0 mov 4(sp),r1 div 6(sp),r0 mov r1,_ldivr rts pc _lrem: mov 2(sp),r0 mov 4(sp),r1 div 6(sp),r0 mov r1,r0 rts pc .bss _ldivr: .=.+2 .globl log ldfps = 170100^tst stfps = 170200^tst ldexp = 176400^movif stexp = 175000^movfi / / log accepts its argument and returns its result / in fr0. The carry bit is set if the argument is / zero or negative. / The coefficients are #2705 from Hart & Cheney. / / movf arg,fr0 / jsr r5,log / movf fr0,... / log: tstf fr0 cfcc bgt 1f movf $bigneg,fr0 /return -(big) on error sec rts r5 1: stfps -(sp) ldfps $200 /di mode movf fr2,-(sp) movf fr1,-(sp) / stexp fr0,-(sp) /scale ldexp $0,fr0 cmpf sqrt2o2,fr0 cfcc blt 1f ldexp $1,fr0 dec (sp) 1: movf fr0,fr1 /(1/2)^(1/2) < x < 2^(1/2) subf $one,fr0 addf $one,fr1 divf fr1,fr0 /z = (x-1)/(x+1) movf fr0,fr1 mulf fr0,fr1 /z^2 / movf p3,fr2 mulf fr1,fr2 addf p2,fr2 mulf fr1,fr2 addf p1,fr2 mulf fr1,fr2 addf p0,fr2 mulf fr2,fr0 /zP(z) / movf fr1,fr2 addf q2,fr2 mulf fr1,fr2 addf q1,fr2 mulf fr1,fr2 addf q0,fr2 /Q(z) / divf fr2,fr0 /zP(z)/Q(z) movif (sp)+,fr1 mulf log2,fr1 addf fr1,fr0 / movf (sp)+,fr1 movf (sp)+,fr2 ldfps (sp)+ rts r5 / / one = 40200 bigneg = 177777 / sqrt2o2: 40065; 02363; 31771; 157145 log2: 40061; 71027;173721;147572 / p0: 141300; 16201; 02154; 10216 p1: 41367;124211; 21611;114442 p2: 141032; 31773; 64222; 40261 p3: 37727;114303;110107;114145 / q0: 141100; 16201; 02154; 10216 q1: 41233;154404;136454; 22153 q2: 141016;111747; 07541; 52530 / / /p0 = -.24013 91795 59210 50986 8484 d2 /p1 = .30957 29282 15376 50062 264 d2 /p2 = -.96376 90933 68686 59324 d1 /p3 = .42108 73712 17979 7145 d0 / /q0 = -.12006 95897 79605 25471 7525 d2 /q1 = .19480 96607 00889 73051 623 d2 /q2 = -.89111 09027 93783 12337 d1 /q3 = .1 d1 / .globl mesg / usage: / jsr r5,mesg / / .even / ... / / string is output onto $1 / mesg: mov r0,-(sp) mov r5,r0 mov r5,0f 1: tstb (r5)+ bne 1b sub r5,r0 com r0 mov r0,0f+2 mov $1,r0 sys 0; 9f .data 9: sys write; 0:..; .. .text inc r5 bic $1,r5 mov (sp)+,r0 rts r5 / monitor-- create mon.out for prof / jsr r5,monitor; lowpc; highpc; buf; bufsize / / jsr r5,monexit .globl monitor .globl monexit profil = 44. monitor: mov r0,-(sp) mov r1,-(sp) mov r2,-(sp) mov (r5)+,r1 / lo pc mov (r5)+,r2 / hi pc mov (r5)+,r0 / buff mov r1,(r0)+ mov r2,(r0)+ mov r0,buff sub r1,r2 ble botch mov (r5)+,r0 / size sub $4,r0 ble botch cmp r0,r2 blt 1f mov r2,r0 1: mov r0,bufs clr r1 div r2,r0 bvc 1f mov $77777,r0 1: asl r0 mov r0,scale sys 0; 9f .data 9: sys profil; buff:.. ; bufs:..; lowpc:..; scale:.. .text mov (sp)+,r2 mov (sp)+,r1 mov (sp)+,r0 rts r5 monexit: mov r0,-(sp) sys creat; monout; 017 bes botch mov buff,0f sub $4,0f mov bufs,0f+2 add $4,0f+2 sys 0; 9f .data 9: sys write; 0:..; .. .text mov (sp)+,r0 rts r5 botch: mov $1,r0 sys write; mesg; emesg-mesg 4 mesg: emesg: monout: .even / nlist -- extract values from name list / / jsr r5,nlist; file; list / ... / / /list: ; type; value / ; type; value / ... / 0 .globl nlist nlist: mov r0,-(sp) mov r1,-(sp) mov r2,-(sp) mov (r5)+,0f mov (r5)+,r1 mov r1,r0 1: tst (r0) beq 1f add $8.,r0 clr (r0)+ clr (r0)+ / initialize to undefined br 1b 1: sys 0; 9f .data 9: sys open; 0:..; 0 .text bes done mov r0,r2 sys read; buf; 20 cmp r0,$20 bne cdone mov buf+4,count / assume older a.out mov buf+2,0f cmp buf,$405 beq 1f mov buf+8.,count / now assume newer mov buf+2,r0 / txt add buf+4,r0 / data cmp buf+16,$1 / relocation? beq 4f asl r0 / txt+data reloc 4: add $20,r0 / header mov r0,0f cmp buf,$410 beq 1f cmp buf,$407 bne cdone 1: mov r2,r0 sys 0; 9f .data 9: sys seek; 0:..; 0 .text 1: sub $12.,count blt cdone mov r2,r0 sys read; buf; 12. cmp r0,$12. bne cdone mov r1,r0 2: tst (r0) beq 1b cmp (r0),buf bne 1f cmp 2(r0),buf+2 bne 1f cmp 4(r0),buf+4 bne 1f cmp 6(r0),buf+6 bne 1f mov buf+8.,8.(r0) mov buf+10.,10.(r0) 1: add $12.,r0 br 2b cdone: mov r2,r0 sys close done: mov (sp)+,r2 mov (sp)+,r1 mov (sp)+,r0 rts r5 .bss buf: .=.+20 count: .=.+2 .globl pow, log, exp pow: / 0^0~ is 0 tstf fr0 cfcc bne 1f tstf fr1 cfcc beq bad rts r5 1: / -^i is +^i fixed sign bpl 1f movf fr1,-(sp) modf $one,fr1 cfcc bne bad1 movf (sp)+,fr1 absf fr0 jsr r5,1f bes bad movf fr1,-(sp) modf $half,fr1 cfcc beq 2f negf fr0 2: movf (sp)+,fr1 rts r5 1: jsr r5,log bes 1f mulf fr1,fr0 jsr r5,exp 1: rts r5 bad1: movf (sp)+,fr1 bad: sec rts r5 one = 40200 half = 40000 / putw/putc -- write words/characters on output file / / fcreat -- create an output file for use by put(w|c) / / calling sequences -- / / mov $filename,r0 / jsr r5,fcreat; ioptr / / on return ioptr is set up for use by put or error / bit is set if file could not be created. / / mov(b) thing,r0 / jsr r5,put(w|c)1; ioptr / / the character or word is written out. / / jsr r5,flush; ioptr / / the buffer is fled. / .globl putc, putw, flush, fcreat fcreat: mov r1,-(sp) mov (r5)+,r1 mov r0,0f sys 0; 9f .data 9: sys creat; 0:..; 666 .text bes 1f mov r0,(r1)+ 2: clr (r1)+ clr (r1)+ mov (sp)+,r1 rts r5 1: mov $-1,(r1)+ mov (sp)+,r1 sec rts r5 .data putw: mov (r5),8f mov (r5)+,9f mov r0,-(sp) jsr r5,putc; 8:.. mov (sp)+,r0 swab r0 jsr r5,putc; 9:.. rts r5 .text putc: mov r1,-(sp) mov (r5)+,r1 1: dec 2(r1) bge 1f mov r0,-(sp) jsr pc,fl mov (sp)+,r0 br 1b 1: movb r0,*4(r1) inc 4(r1) mov (sp)+,r1 rts r5 flush: mov r0,-(sp) mov r1,-(sp) mov (r5)+,r1 jsr pc,fl mov (sp)+,r1 mov (sp)+,r0 rts r5 fl: mov r1,r0 add $6,r0 mov r0,-(sp) mov r0,0f mov 4(r1),0f+2 beq 1f sub (sp),0f+2 mov (r1),r0 sys 0; 9f .data 9: sys write; 0:..; .. .text 1: mov (sp)+,4(r1) mov $512.,2(r1) rts pc / / copyright 1972 bell telephone laboratories inc. / / quicker sort / mov $base,r1 / mov $base+[n*width],r2 / mov $width,r3 / jsr pc,qsort / r0,r1,r2,r3,r4 are used .globl qsort .globl compare qsort: mov r5,-(sp) mov r4,-(sp) bit $1,r3 bne 1f bit $1,r1 bne 1f cmp r3,$2 bne 2f mov $exch1,exchange br 3f 2: mov r3,r5 clc ror r5 mov r5,width mov $exchw,exchange br 3f 1: mov $exchb,exchange 3: jsr pc,qs1 mov (sp)+,r4 mov (sp)+,r5 rts pc qs1: mov r1,r5 neg r5 add r2,r5 bgt 1f rts pc 1: clr r4 dvd r3,r4 asr r4 mpy r3,r4 mov r5,r4 add r1,r4 mov r1,-(sp) mov r2,-(sp) loop: cmp r1,r4 bhis loop1 mov r1,r0 jsr pc,compare bgt loop1 add r3,r1 br loop loop1: cmp r2,r4 blos 1f sub r3,r2 mov r2,r0 jsr pc,compare bge loop1 jsr pc,*exchange cmp r1,r4 bne loop mov r2,r4 br loop 1: cmp r1,r4 beq 1f jsr pc,*exchange mov r1,r4 br loop1 1: mov (sp)+,r2 mov r4,-(sp) mov r4,r1 add r3,r1 mov r2,r0 sub r1,r0 sub 2(sp),r4 cmp r0,r4 blo 1f mov (sp)+,r0 mov (sp)+,r4 mov r1,-(sp) mov r2,-(sp) mov r0,r2 mov r4,r1 1: jsr pc,qs1 mov (sp)+,r2 mov (sp)+,r1 br qs1 exchb: mov r1,-(sp) mov r2,-(sp) mov r3,r5 1: movb (r1),r0 movb (r2),(r1)+ movb r0,(r2)+ sob r5,1b mov (sp)+,r2 mov (sp)+,r1 rts pc exchw: mov r1,-(sp) mov r2,-(sp) mov width,r5 1: mov (r1),r0 mov (r2),(r1)+ mov r0,(r2)+ sob r5,1b mov (sp)+,r2 mov (sp)+,r1 rts pc exch1: mov (r1),r0 mov (r2),(r1) mov r0,(r2) rts pc .bss exchange: .=.+2 width: .=.+2 / random fixed point number generator .globl rand, srand srand: mov r0,ranx rts pc rand: mov r1,-(sp) mov ranx,r1 mpy $13077.,r1 add $6925.,r1 mov r1,r0 mov r0,ranx bic $100000,r0 mov (sp)+,r1 rts pc .data ranx: 1 ldfps = 170100^tst stfps = 170200^tst / .globl sin .globl cos / / floating point sin/cos / replaces the value in fr0 by its sin/cos / there are no error exits / coefficients are #3370 from Hart & Cheney / cos: absf fr0 mov $1,-(sp) br 1f sin: clr -(sp) 1: stfps -(sp) ldfps $200 movf fr1,-(sp) movf fr2,-(sp) mov r0,-(sp) / / quadrant reduction - arg = (2/J)x / -1 < arg < 1 / movf fr0,-(sp) absf fr0 modf frpi2,fr0 modf $fourth,fr1 mulf $four,fr1 movfi fr1,r0 add 34(sp),r0 movf $one,fr1 inc r0 ror r0 bcs 1f subf $one,fr0 1: ror r0 bcc 1f negf fr0 1: tstf (sp)+ cfcc bpl 1f negf fr0 1: movf fr0,fr1 mulf fr0,fr1 /arg^2 / movf p4,fr2 mulf fr1,fr2 addf p3,fr2 mulf fr1,fr2 addf p2,fr2 mulf fr1,fr2 addf p1,fr2 mulf fr1,fr2 addf p0,fr2 mulf fr2,fr0 / zP(z^2) / movf fr1,fr2 addf q3,fr2 mulf fr1,fr2 addf q2,fr2 mulf fr1,fr2 addf q1,fr2 mulf fr1,fr2 addf q0,fr2 / Q(z^2) / divf fr2,fr0 / zP(z^2)/Q(z^2) / mov (sp)+,r0 movf (sp)+,fr2 movf (sp)+,fr1 ldfps (sp)+ tst (sp)+ / clc /tst clears carry rts r5 / fourth = 37600 one = 40200 four = 40600 / frpi2: 40042;174603; 67116; 42025 / p0: 046117;031130;175220;165273 p1: 145626;154170;031651;104637 p2: 044726;162341;133224;052302 p3: 143530;056427;005061;125021 p4: 042021;174005;170441;175607 q0: 046003;163716;123445;167144 q1: 044707;047147;032436;120046 q2: 043423;156142;064161;007314 q3: 042004;123513;026637;160477 / /p0 = .13578 84097 87737 56690 92680 d8 /p1 = -.49429 08100 90284 41611 58627 d7 /p2 = .44010 30535 37526 65019 44918 d6 /p3 = -.13847 27249 98245 28730 54457 d5 /p4 = .14596 88406 66576 87222 26959 d3 /q0 = .86445 58652 92253 44299 15149 d7 /q1 = .40817 92252 34329 97493 95779 d6 /q2 = .94630 96101 53820 81805 71257 d4 /q3 = .13265 34908 78613 63589 11494 d3 /q4 = .1 d1 ldfps = 170100^tst stfps = 170200^tst / / sqrt replaces the f.p. number in fr0 by its / square root. newton's method / .globl sqrt / / sqrt: tstf fr0 cfcc bne 1f clc rts r5 /sqrt(0) 1: bgt 1f clrf fr0 sec rts r5 / sqrt(-a) 1: mov r0,-(sp) stfps -(sp) mov (sp),r0 bic $!200,r0 / retain mode ldfps r0 movf fr1,-(sp) movf fr2,-(sp) / movf fr0,fr1 movf fr0,-(sp) asr (sp) add $20100,(sp) movf (sp)+,fr0 /initial guess mov $4,r0 1: movf fr1,fr2 divf fr0,fr2 addf fr2,fr0 mulf $half,fr0 / x = (x+a/x)/2 sob r0,1b 2: movf (sp)+,fr2 movf (sp)+,fr1 ldfps (sp)+ mov (sp)+,r0 clc rts r5 / half = 40000 / switch -- switch on contents of r0 / / / calling sequence -- / / jsr r5,switch; swtab / / r0 is looked up in swtab and if found / control is returned to the corresponding place / if r0 is not found, the next inline instruction is / executed / / swtab format -- / / swtab: / val1; ret1 / val2; ret2 / ... / valn; retn / ..; 0 / .globl switch switch: mov r1,-(sp) mov (r5)+,r1 1: cmp r0,(r1)+ beq 1f tst (r1)+ bne 1b 2: mov (sp)+,r1 rts r5 1: mov (r1)+,r1 beq 2b mov r1,r5 br 2b ..K.Latan.sMatof.sNatoi.sOcompar.sPcrypt.sQctime.cRdpadd.sSecvt.sTexp.sUfakfp.sVfp1.sWfp2.sXfp3.sYfpx.sZgamma.s[get.s\hypot.s]ldiv.s^log.s_mesg.s`mon.sanlist.sbpow.scput.sdqsort.serand.sfsin.sgsqrt.shswitch.sittyn.s/ return name of current tty .globl ttyn, _ttyn _ttyn: mov 2(sp),r0 br 1f ttyn: clr r0 1: mov $'x,name tst -(sp) sys fstat; buf bes er1 mov buf+2,(sp) sys open; dev; 0 bes er1 mov r0,r1 1: mov r1,r0 sys read; buf; 16. bes er cmp r0,$16. bne er mov $buf,r0 cmp (r0)+,(sp) bne 1b cmp (r0)+,$"tt bne 1b cmpb (r0)+,$'y bne 1b tstb (r0)+ beq 1b cmpb (r0),$'\0 bne 1b movb -(r0),name er: mov r1,r0 sys close er1: tst (sp)+ movb name,r0 rts pc .data dev: .even .bss buf: .=.+40. name: .=.+2 / C library -- abort .globl _abort _abort: mov r5,-(sp) mov sp,r5 4 .globl _atan,atan,retrn,savr5 _atan: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 jsr r5,atan clr savr5 jmp retrn .globl _atan2,atan2,retrn,savr5 _atan2: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 movf 12.(r5),fr1 jsr r5,atan2 clr savr5 jmp retrn / C library -- atof / a = atof(string); / returns a floating-point number in a_ corresponding to / the ascii string______. See ATOF(III). .globl atof,_atof,a_tof,retrn,savr5 _atof: mov r5,-(sp) mov sp,r5 mov 4(r5),ptr jsr r5,atof; a_tof clr savr5 jmp retrn a_tof: movb *ptr,r0 inc ptr rts r5 .bss ptr: .=.+2 / C library -- chdir / error = chdir(string); .globl _chdir, retrn, cerror _chdir: mov r5,-(sp) mov sp,r5 mov 4(r5),0f sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys chdir; 0:.. / C library -- chmod / error = chmod(string, mode); .globl _chmod, retrn, cerror _chmod: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys chmod; 0:..; .. / C library -- chown / error = chown(string, owner); .globl _chown, retrn, cerror _chown: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys chown; 0:..; .. / C library -- close / error = close(file); .globl _close, retrn, cerror _close: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 sys close bec 1f jmp cerror 1: clr r0 jmp retrn .globl _cos,cos,retrn,savr5 _cos: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 jsr r5,cos clr savr5 jmp retrn .globl _srand, _rand, retrn .globl rand, srand _srand: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 jsr pc,srand jmp retrn _rand: mov r5,-(sp) mov sp,r5 jsr pc,rand jmp retrn / C library -- creat / file = creat(string, mode); / / file == -1 if error .globl _creat, retrn, cerror _creat: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: jmp retrn .data 9: sys creat; 0:..; .. / C runtime startoff .globl savr5 .globl _main start: setd mov sp,r0 mov (r0),-(sp) tst (r0)+ mov r0,2(sp) jsr pc,_main cmp (sp)+,(sp)+ clr r0 sys exit .bss savr5: .=.+2 / C library -- crypt / cstring = crypt(key); .globl _crypt .globl crypt, retrn, savr5 _crypt: mov r5,-(sp) mov sp,r5 mov r5,savr5 mov 4(r5),r0 jsr pc,crypt clr savr5 jmp retrn / C library -- dup / f = dup(of) / f == -1 for error dup = 41. .globl _dup, retrn, cerror _dup: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 sys dup bec 1f jmp cerror 1: jmp retrn / C interface to ecvt & fcvt .globl _ecvt, _fcvt .globl ecvt, fcvt, _ndigit .globl savr5, retrn _ecvt: jsr r5,setup jsr pc,ecvt br 1f _fcvt: jsr r5,setup jsr pc,fcvt 1: mov savr5,r5 clr savr5 mov r2,*16(r5) mov r1,*20(r5) jmp retrn setup: mov sp,savr5 movf 4(sp),fr0 mov 14(sp),_ndigit jmp (r5) int sys_nerr 30; char *sys_errlist[] { "Error 0", "Not super-user", "No such file or directory", "No such process", "Error 4", "I/O error", "No such device or address", "Arg list too long", "Exec format error", "Bad file number", "No children", "No more processes", "Not enough core", "Permission denied", "Error 14", "Block device required", "Mount device busy", "File exists", "Cross-device link", "No such device", "Not a directory", "Is a directory", "Invalid argument", "File table overflow", "Too many open files", "Not a typewriter", "Text file busy", "File too large", "No space left on device", "Illegal seek", "read-only file system", }; / C library -- execl / execl(file, arg1, arg2, ... , 0); / .globl _execl, cerror _execl: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov r5,r0 add $6,r0 mov r0,0f+2 sys 0; 9f jmp cerror .data 9: sys exec; 0:..; .. / C library -- execv / execv(file, argv); / / where argv is a vector argv[0] ... argv[x], 0 / last vector element must be 0 / .globl _execv, cerror _execv: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 sys 0; 9f jmp cerror .data 9: sys exec; 0:..; .. / C library -- exit / exit(code) / code is return in r0 to system .globl _exit _exit: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 sys exit .globl _exp,exp,retrn,savr5 _exp: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 jsr r5,exp clr savr5 jmp retrn / C library-- fake floating output .globl pfloat .globl pscien pfloat: pscien: add $8,r4 movb $'?,(r3)+ rts pc .globl _floor, _ceil .globl floor, ceil one = 40200 _floor: movf 2(sp),fr0 floor: tstf fr0 cfcc bge 1f modf $one,fr0 cfcc beq 2f subf $one,fr1 br 2f 1: modf $one,fr0 2: movf fr1,fr0 rts pc _ceil: movf 2(sp),fr0 ceil: negf fr0 jsr pc,floor negf fr0 rts pc / C library-- floating output .globl pfloat .globl pscien .globl fltused .globl _ndigit .globl ecvt .globl fcvt fltused: / force loading pfloat: tst r2 bne 1f mov $6,_ndigit 1: movf (r4)+,fr0 jsr pc,fcvt tst r1 beq 1f movb $'-,(r3)+ 1: tst r2 bgt 1f movb $'0,(r3)+ 1: mov r2,r1 ble 1f 2: movb (r0)+,(r3)+ sob r1,2b 1: mov _ndigit,r1 beq 1f movb $'.,(r3)+ 1: neg r2 ble 1f 2: dec r1 blt 1f movb $'0,(r3)+ sob r2,2b 1: tst r1 ble 2f 1: movb (r0)+,(r3)+ sob r1,1b 2: rts pc pscien: tst r2 bne 1f mov $6,_ndigit 1: movf (r4)+,fr0 jsr pc,ecvt tst r1 beq 1f movb $'-,(r3)+ 1: movb (r0)+,(r3)+ movb $'.,(r3)+ mov _ndigit,r1 ble 1f 2: movb (r0)+,(r3)+ sob r1,2b 1: movb $'e,(r3)+ dec r2 mov r2,r1 bge 1f movb $'-,(r3)+ neg r1 br 2f 1: movb $'+,(r3)+ 2: clr r0 div $10.,r0 add $'0,r0 movb r0,(r3)+ add $'0,r1 movb r1,(r3)+ rts pc .globl _fmod, retrn _fmod: mov r5,-(sp) mov sp,r5 movf 4(r5),fr0 divf 12.(r5),fr0 modf $one,fr0 mulf 12.(r5),fr1 movf 4(r5),fr0 subf fr1,fr0 jmp retrn one = 40200 / C library -- fork / pid = fork(); / / pid == 0 in child process; pid == -1 means error return .globl _fork, retrn, cerror _fork: mov r5,-(sp) mov sp,r5 sys fork br 1f bec 2f jmp cerror 1: clr r0 2: jmp retrn / C library -- fstat / error = fstat(file, statbuf); / int statbuf[17] or / char statbuf[34] / as appropriate .globl _fstat, retrn, cerror _fstat: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),0f sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys fstat; 0:.. .globl _gamma,gamma,retrn,savr5 _gamma: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 jsr r5,gamma clr savr5 jmp retrn / getw/getc -- get words/characters from input file / fopen -- open a file for use by get(c|w) indir = 0 .globl _getc, _getw, _fopen .globl cerror .comm _errno,2 _fopen: mov r5,-(sp) mov sp,r5 mov 4(r5),0f sys 0; 9f .data 9: sys open; 0:..; 0 .text bes badret mov 6(r5),r1 mov r0,(r1)+ clr (r1)+ clr r0 mov (sp)+,r5 rts pc _getw: clr _errno mov r5,-(sp) mov sp,r5 mov 4(r5),r1 jsr pc,getc1 mov r0,-(sp) jsr pc,getc1 swab r0 bis (sp)+,r0 mov (sp)+,r5 rts pc _getc: mov r5,-(sp) mov sp,r5 mov 4(r5),r1 jsr pc,getc1 mov (sp)+,r5 rts pc getc1: dec 2(r1) bge 1f mov r1,r0 add $6,r0 mov r0,0f mov r0,4(r1) mov (r1),r0 sys 0; 9f .data 9: sys read; 0:..; 512. .text bes badret tst r0 beq badret dec r0 mov r0,2(r1) 1: clr r0 bisb *4(r1),r0 inc 4(r1) rts pc badret: jmp cerror / getchar() -- get a character from input file fin .globl _getchar .comm _errno,2 .comm _fin,518. _getchar: mov r5,-(sp) mov sp,r5 dec _fin+2 bge 1f mov $_fin+6,_fin+4 mov _fin,r0 sys read; _fin+6; 512. bes badret tst r0 beq badret dec r0 mov r0,_fin+2 1: clr r0 bisb *_fin+4,r0 inc _fin+4 mov (sp)+,r5 rts pc badret: mov r0,_errno clr r0 clr _fin+2 mov (sp)+,r5 rts pc ..j.kabort.slatan.smatan2.snatof.sochdir.spchmod.sqchown.srclose.sscos.stcrand.sucreat.svcrt0.swcrypt.sxdup.syecvt.szerrlst.c{execl.s|execv.s}exit.s~exp.sffltpr.sfloor.sfltpr.sfmod.sfork.sfstat.sgamma.sgetc.sgetchr.sgetcsw.s/ C library - getcsw / csw = getcsw(); .globl _getcsw _getcsw: sys 38. rts pc / C library -- getgid / gid = getgid(); / getgid = 47. .globl _getgid, retrn _getgid: mov r5,-(sp) mov sp,r5 sys getgid bic $!377,r0 jmp retrn getpw(uid, buf) int uid; char buf[]; { auto pbuf[259]; static pwf; register n, c; register char *bp; if(pwf == 0) { fopen("/etc/passwd", pbuf); pwf = pbuf[0]; } else pbuf[0] = pwf; if(pwf < 0) return(1); seek(pwf, 0, 0); pbuf[1] = 0; pbuf[2] = 0; for (;;) { bp = buf; while((c=getc(pbuf)) != '\n') { if(c == '\0') return(1); *bp++ = c; } *bp++ = '\0'; bp = buf; n = 3; while(--n) while((c = *bp++) != ':') if(c == '\n') return(1); while((c = *bp++) != ':') { if(c<'0' || c>'9') continue; n = n*10+c-'0'; } if(n == uid) return(0); } return(1); } / C library -- getuid / uid = getuid(); / .globl _getuid, retrn _getuid: mov r5,-(sp) mov sp,r5 sys getuid bic $!377,r0 jmp retrn / C library -- gtty / error = gtty(filep, ttyvec); / filep is descriptor of open tty / ttyvec[0, 1, 2] correspond to args of gtty .globl _gtty, retrn, cerror _gtty: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),0f sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys gtty; 0:.. .globl _hmul _hmul: mov 2(sp),r0 mul 4(sp),r0 rts pc / C library-- hash switch .globl hswitch / jsr pc,hswitch; size; table; default / p0 / 0 / ... /p0: L; V / ... / 0 hswitch: mov (sp)+,r1 mov r2,-(sp) mov r3,-(sp) mov r0,r3 clr r2 div (r1)+,r2 asl r3 add (r1)+,r3 mov (r3),r3 beq 1f 2: mov (r3)+,r2 beq 1f cmp (r3)+,r0 bne 2b mov (sp)+,r3 rts r2 1: mov (sp)+,r3 mov (sp)+,r2 jmp *(r1)+ / C library -- kill .globl _kill, retrn, cerror kill = 37. indir = 0 _kill: mov r5,-(sp) mov sp,r5 mov 4(sp),r0 mov 6(sp),8f sys indir; 9f .data 9: sys kill; 8:.. .text bec 1f jmp cerror 1: clr r0 jmp retrn / C library -- link / error = link(old-file, new-file); / .globl _link, retrn, cerror _link: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys link; 0:..; .. / C library -- long output conversion .globl _locv _locv: mov r5,-(sp) mov sp,r5 mov r4,-(sp) mov r3,-(sp) mov r2,-(sp) mov $buf,r4 mov 6(r5),r3 mov 4(r5),r2 bpl 1f neg r2 neg r3 sbc r2 movb $'-,(r4)+ 1: jsr pc,1f clrb (r4)+ mov $buf,r0 mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r4 mov (sp)+,r5 rts pc 1: jsr pc,divid add $'0,r1 mov r1,-(sp) ashc $0,r2 beq 1f jsr pc,1b 1: movb (sp)+,(r4)+ rts pc divid: clr r1 mov $32.,r0 1: ashc $1,r2 rol r1 cmp r1,$10. blo 2f sub $10.,r1 inc r3 2: sob r0,1b rts pc .bss buf: .=.+12. .globl _log,log,retrn,savr5 _log: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 jsr r5,log clr savr5 jmp retrn / C library -- return floating-point from long integer .globl _ltod _ltod: mov r5,-(sp) mov sp,r5 setl movif *4(r5),fr0 seti mov (sp)+,r5 rts pc / C library -- makdir / error = makdir(string); .globl _makdir, retrn, cerror _makdir: mov r5,-(sp) mov sp,r5 mov 4(r5),0f sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys makdir; 0:.. / C runtime startoff including monitoring cbufs = 150. .globl _monitor .globl _sbrk .globl _main .globl _exit .globl _etext .comm savr5,2 start: setd mov sp,r0 mov (r0),-(sp) tst (r0)+ mov r0,2(sp) mov $_etext,r1 sub $eprol,r1 add $7,r1 ash $-3,r1 bic $!17777,r1 mov $cbufs,-(sp) add $3*[cbufs+1],r1 mov r1,-(sp) asl r1 mov r1,-(sp) jsr pc,_sbrk tst (sp)+ cmp r0,$-1 beq 9f mov r0,-(sp) add $6,r0 mov r0,countbase mov $_etext,-(sp) mov $eprol,-(sp) jsr pc,_monitor add $10.,sp jsr pc,_main cmp (sp)+,(sp)+ jsr pc,_exit 9: mov $1,r0 sys write; 8f; 9f-8f .data; 8: ; 9:.even; .text _exit: mov r5,-(sp) mov sp,r5 clr -(sp) jsr pc,_monitor tst (sp)+ mov 4(r5),r0 sys exit .globl mrsave .globl rsave .globl rretrn mrsave: mov *(r5)+,r1 bne 1f mov countbase,r1 add $6,countbase mov r5,(r1)+ mov r1,*-2(r5) 1: inc 2(r1) bne rsave inc (r1) rsave: mov r5,r0 mov sp,r5 mov r4,-(sp) mov r3,-(sp) mov r2,-(sp) sub (r0)+,sp jmp (r0) rretrn: sub $6,r5 mov r5,sp mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r4 mov (sp)+,r5 rts pc .bss countbase: .=.+2 .text eprol: / C library-- mdate .globl _mdate, retrn, cerror _mdate: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),r1 mov (r1)+,r0 mov (r1),r1 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys mdate; 0:.. / C library -- mknod / error = mknod(string, mode, major.minor); .globl _mknod, retrn, cerror mknod = 14. _mknod: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 mov 8(r5),0f+4 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys mknod; 0:..; ..; .. monitor(lowpc, highpc, buf, bufsiz, cntsiz) char *lowpc, *highpc; int *buf, bufsiz; { register char *o; static *sbuf, ssiz; if (lowpc == 0) { profil(0, 0, 0, 0); o = creat("mon.out", 0666); write(o, sbuf, ssiz<<1); close(o); return; } if (nargs() <= 4) cntsiz = 0; ssiz = bufsiz; buf[0] = lowpc; buf[1] = highpc; buf[2] = cntsiz; sbuf = buf; buf =+ 3*(cntsiz+1); bufsiz =- 3*(cntsiz+1); if (bufsiz<=0) return; o = ((highpc - lowpc)>>1) & 077777; if(bufsiz < o) o = ldiv(bufsiz, 0, o<<1); else o = 077777; profil(buf, bufsiz<<1, lowpc, o<<1); } / C library -- mount / error = mount(dev, file, flag) .globl _mount, retrn, cerror _mount: mov r5,-(sp) mov sp,r5 mov 4(sp),0f mov 6(sp),0f+2 mov 8(sp),0f+4 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys mount; 0:..; ..; .. / C library -- nargs .globl _nargs _nargs: mov 2(r5),r1 / pc of caller of caller mov r5,-(sp) mov sp,r5 clr r0 cmp -4(r1),jsrsd bne 1f mov $2,r0 1: cmp (r1),tsti bne 1f add $2,r0 br 2f 1: cmp (r1),cmpi bne 1f add $4,r0 br 2f 1: cmp (r1),addi bne 2f add 2(r1),r0 2: asr r0 mov (sp)+,r5 rts pc jsrsd: jsr pc,*$0 tsti: tst (sp)+ cmpi: cmp (sp)+,(sp)+ addi: add $0,sp / C library-- nice / error = nice(hownice) .globl _nice, retrn, cerror _nice: mov r5,-(sp) mov sp,r5 mov 4(sp),r0 sys nice bec 1f jmp cerror 1: clr r0 jmp retrn / C library -- nlist / struct { / char name[8]; / int type; / int value; / } list[]; / terminated by a null name. / nlist(file, list); .globl _nlist, savr5, nlist .data _nlist: mov r5,-(sp) mov sp,savr5 mov 4(sp),0f mov 6(sp),0f+2 jsr r5,nlist; 0:..; .. mov (sp)+,r5 rts pc / C library -- open / file = open(string, mode) / / file == -1 means error .globl _open, retrn, cerror _open: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: jmp retrn .data 9: sys open; 0:..; .. int errno; int sys_nerr; char *sys_errlist[]; perror(s) char *s; { char *c; c = "Unknown error"; if(errno < sys_nerr) c = sys_errlist[errno]; if(*s == '\0') printf("%s", c); else printf("%s: %s\n", s, c); } / pipe -- C library / pipe(f) / int f[2]; .globl _pipe, retrn, cerror pipe = 42. _pipe: mov r5,-(sp) mov sp,r5 sys pipe bec 1f jmp cerror 1: mov 4(r5),r2 mov r0,(r2)+ mov r1,(r2) clr r0 jmp retrn / C library -- pow (power) .globl _pow .globl savr5 .globl retrn .globl pow _pow: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 movf 12.(r5),fr1 jsr r5,pow clr savr5 jmp retrn / C library -- printf .globl _printf .globl _ndigit .globl pfloat .globl pscien .globl _putchar .globl rsave .globl rretrn _printf: jsr r5,rsave; 128. mov 4(r5),formp / format mov r5,r4 add $6,r4 / arglist loop: movb *formp,r0 beq 1f inc formp cmp r0,$'% beq 2f 3: mov r0,(sp) jsr pc,*$_putchar br loop 1: jmp rretrn 2: clr rjust clr _ndigit cmpb *formp,$'- bne 2f inc formp inc rjust 2: jsr r3,gnum; width clr ndfnd cmp r0,$'. bne 1f jsr r3,gnum; _ndigit 1: mov sp,r3 mov $swtab,r1 1: mov (r1)+,r2 beq 3b cmp r0,(r1)+ bne 1b jmp (r2) swtab: decimal; 'd octal; 'o hex; 'x float; 'f scien; 'e charac; 'c string; 's logical; 'l 0; 0 decimal: mov (r4)+,r1 bge 1f neg r1 movb $'-,(r3)+ br 1f logical: mov (r4)+,r1 1: jsr pc,1f br prbuf 1: clr r0 div $10.,r0 mov r1,-(sp) mov r0,r1 beq 1f jsr pc,1b 1: mov (sp)+,r0 add $'0,r0 movb r0,(r3)+ rts pc charac: movb (r4)+,(r3)+ bne 1f dec r3 1: movb (r4)+,(r3)+ bne prbuf dec r3 br prbuf string: mov _ndigit,r1 clr r3 mov (r4),r2 1: tstb (r2)+ beq 1f inc r3 sob r1,1b 1: mov (r4)+,r2 br prstr hex: mov $1f,r2 .data 1: -4; !17 .text br 2f octal: mov $1f,r2 .data 1: -3; !7 .text 2: mov (r4)+,r1 clr r0 jsr pc,1f br prbuf 1: mov r1,-(sp) ashc (r2),r0 beq 1f jsr pc,1b 1: mov (sp)+,r0 bic 2(r2),r0 add $'0,r0 cmp r0,$'9 ble 1f add $'A-'0-10.,r0 1: movb r0,(r3)+ rts pc float: mov ndfnd,r2 jsr pc,pfloat br prbuf scien: mov ndfnd,r2 jsr pc,pscien br prbuf prbuf: mov sp,r2 sub r2,r3 prstr: mov r4,-(sp) mov $' ,-(sp) mov r3,r4 neg r3 add width,r3 ble 1f tst rjust bne 1f 2: jsr pc,*$_putchar sob r3,2b 1: tst r4 beq 2f 1: movb (r2)+,(sp) jsr pc,*$_putchar sob r4,1b 2: tst r3 ble 1f mov $' ,(sp) 2: jsr pc,*$_putchar sob r3,2b 1: tst (sp)+ mov (sp)+,r4 jmp loop gnum: clr ndfnd clr r1 1: movb *formp,r0 inc formp sub $'0,r0 cmp r0,$9. bhi 1f inc ndfnd mul $10.,r1 add r0,r1 br 1b 1: add $'0,r0 mov r1,*(r3)+ rts r3 .bss width: .=.+2 formp: .=.+2 rjust: .=.+2 ndfnd: .=.+2 / profil .globl _profil .globl retrn _profil: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 mov 10(r5),0f+4 mov 12(r5),0f+6 sys 0; 9f jmp retrn .data 9: sys 44.; 0:..; ..; ..; .. / putw/putc -- write words/characters on output file .globl _putc, _putw, _fflush, _fcreat .globl cerror .comm _errno,2 _fcreat: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),r1 mov pc,(r1) / a putatively illegal file desc. sys 0; 9f .data 9: sys creat; 0:..; 666 .text bes badret mov r0,(r1)+ clr (r1)+ clr (r1)+ br goodret _putw: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),r1 mov r0,-(sp) jsr pc,putc1 mov (sp)+,r0 swab r0 jsr pc,putc1 br goodret _putc: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),r1 jsr pc,putc1 mov 4(r5),r0 br goodret putc1: dec 2(r1) blt 1f movb r0,*4(r1) inc 4(r1) rts pc 1: mov r0,-(sp) jsr pc,fl mov (sp)+,r0 br putc1 _fflush: mov r5,-(sp) mov sp,r5 mov 4(r5),r1 jsr pc,fl br goodret fl: mov r1,r0 add $6,r0 mov r0,-(sp) mov r0,0f mov 4(r1),0f+2 beq 1f sub (sp),0f+2 mov (r1),r0 sys 0; 9f .data 9: sys write; 0:..; .. .text 1: mov (sp)+,4(r1) mov $512.,2(r1) rts pc badret: jmp cerror goodret: clr _errno mov (sp)+,r5 rts pc / C library -- putchar .globl _putchar,_flush .globl _fout _putchar: mov r5,-(sp) mov sp,r5 mov _fout+4,r0 bne 1f jsr pc,fl mov _fout+4,r0 1: movb 4(r5),(r0)+ beq 1f inc _fout+4 dec _fout+2 bgt 1f jsr pc,fl 1: mov 4(r5),r0 mov (sp)+,r5 rts pc _flush: mov r5,-(sp) mov sp,r5 jsr pc,fl mov (sp)+,r5 rts pc fl: mov _fout+4,r0 beq 1f sub $_fout+6,r0 mov r0,0f mov _fout,r0 bne 2f inc r0 2: sys 0; 9f .data 9: sys write; _fout+6; 0:.. .text 1: mov $_fout+6,_fout+4 mov $512.,_fout+2 cmp _fout,$2 bhi 1f mov $1,_fout+2 1: rts pc .bss _fout: .=.+518. int (*qscmp)(); int qses; qsort(a, n, es, fc) char *a; int n, es; int (*fc)(); { qscmp = fc; qses = es; qs1(a, a+n*es); } qs1(a, l) char *a, *l; { register char *i, *j; register es; char *lp, *hp; int n, c; es = qses; start: if((n=l-a) <= es) return; n = (n/(2*es))*es; hp = lp = a+n; i = a; j = l-es; for(;;) { if(i < lp) { if((c = (*qscmp)(i, lp)) == 0) { qsexc(i, lp =- es); continue; } if(c < 0) { i =+ es; continue; } } loop: if(j > hp) { if((c = (*qscmp)(hp, j)) == 0) { qsexc(hp =+ es, j); goto loop; } if(c > 0) { if(i == lp) { qstexc(i, hp =+ es, j); i = lp =+ es; goto loop; } qsexc(i, j); j =- es; i =+ es; continue; } j =- es; goto loop; } if(i == lp) { if(lp-a >= l-hp) { qs1(hp+es, l); l = lp; } else { qs1(a, lp); a = hp+es; } goto start; } qstexc(j, lp =- es, i); j = hp =- es; } } qsexc(i, j) char *i, *j; { register char *ri, *rj, c; int n; n = qses; ri = i; rj = j; do { c = *ri; *ri++ = *rj; *rj++ = c; } while(--n); } qstexc(i, j, k) char *i, *j, *k; { register char *ri, *rj, *rk; char c; int n; n = qses; ri = i; rj = j; rk = k; do { c = *ri; *ri++ = *rk; *rk++ = *rj; *rj++ = c; } while(--n); } / C library -- read / nread = read(file, buffer, count); / / nread ==0 means eof; nread == -1 means error .globl _read, retrn, cerror _read: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),0f mov 8(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: jmp retrn .data 9: sys read; 0:..; .. / C library -- reset, setexit / reset() / will generate a "return" from / the last call to / setexit() / by restoring sp, r5 / and doing a return. / / useful for going back to the main loop / after a horrible error in a lowlevel / routine. .globl _setexit .globl _reset _setexit: mov sp,ssp mov r5,sr5 mov (sp),spc rts pc _reset: mov ssp,sp mov sr5,r5 mov spc,(sp) rts pc .bss ssp: .=.+2 sr5: .=.+2 spc: .=.+2 getgid.sgetpw.cgetuid.sgtty.shmul.shsw.skill.slink.slocv.slog.sltod.smakdir.smcrt0.smdate.smknod.smon.cmount.snargs.snice.snlist.sopen.sperror.cpipe.spow.sprintf.sprof.sputc.sputchr.sqsort.cread.sreset.sretrn.s/ C return sequence .globl retrn, cerror, _errno cerror: mov r0,_errno mov $-1,r0 retrn: mov r5,sp mov (sp)+,r5 rts pc .bss _errno: .=.+2 rin() { register n, c, f; f = 1; n = 0; loop: c = getchar(); if(c == '\0') exit(); if(c == '-') { f = -f; goto loop; } if(c>='0' && c<='9') { n = n*10+c-'0'; goto loop; } return(n*f); } / C register save and restore .globl rsave .globl mrsave .globl rretrn mrsave: tst (r5)+ rsave: mov r5,r0 mov sp,r5 mov r4,-(sp) mov r3,-(sp) mov r2,-(sp) sub (r0)+,sp jmp (r0) rretrn: sub $6,r5 mov r5,sp mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r4 mov (sp)+,r5 rts pc /old = sbrk(increment); / /sbrk gets increment more core, and returns a pointer / to the beginning of the new core area / .globl _sbrk,_end, retrn, cerror _sbrk: mov r5,-(sp) mov sp,r5 mov nd,0f add 4(r5),0f sys 0; 9f bec 1f jmp cerror 1: mov nd,r0 add 4(r5),nd jmp retrn .globl _brk / brk(value) / as described in man2. / returns 0 for ok, -1 for error. _brk: mov r5,-(sp) mov sp,r5 mov 4(r5),0f sys 0; 9f bec 1f jmp cerror 1: mov 4(r5),nd clr r0 jmp retrn .data 9: sys break; 0:.. nd: _end / C library -- seek / error = seek(file, offset, ptr); .globl _seek, retrn, cerror _seek: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),0f mov 8(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys seek; 0:..; .. / C library -- setgid / error = setgid(uid); setgid = 46. .globl _setgid, retrn, cerror _setgid: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 sys setgid bec 1f jmp cerror 1: clr r0 jmp retrn / C library -- setuid / error = setuid(uid); .globl _setuid, retrn, cerror _setuid: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 sys setuid bec 1f jmp cerror 1: clr r0 jmp retrn / C library -- signal / signal(n, 0); /* default action on signal(n) */ / signal(n, odd); /* ignore signal(n) */ / signal(n, label); /* goto label on signal(n) */ rti = 2 signal = 48. .globl _signal, retrn, cerror _signal: mov r5,-(sp) mov sp,r5 mov 4(r5),r1 mov r1,0f mov 6(r5),0f+2 beq 1f bit $1,0f+2 bne 1f mul $6.,r1 add $vect-6.,r1 cmp r1,$vect blo 2f cmp r1,$evect bhis 2f mov 0f+2,4(r1) mov r1,0f+2 1: sys 0; 9f bes 3f jmp retrn 2: mov $22.,r0 / EINVAL 3: jmp cerror 1: mov r1,-(sp) mov r2,-(sp) mov r3,-(sp) mov r4,-(sp) jsr pc,*(r0)+ mov (sp)+,r4 mov (sp)+,r3 mov (sp)+,r2 mov (sp)+,r1 mov (sp)+,r0 rti .data vect: jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. jsr r0,1b; .. evect: 9: sys signal; 0:..; .. .globl _sin,sin,retrn,savr5 _sin: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 jsr r5,sin clr savr5 jmp retrn .globl _sleep, retrn sleep = 35. _sleep: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 sys sleep jmp retrn .globl _sqrt,sqrt,retrn,savr5 _sqrt: mov r5,-(sp) mov sp,r5 mov r5,savr5 movf 4(r5),fr0 jsr r5,sqrt clr savr5 jmp retrn / C library-- simple switch .globl sswitch / jsr pc,sswitch / L; V / ... / 0; default sswitch: mov (sp)+,r1 mov r2,-(sp) 1: mov (r1)+,r2 beq 1f cmp (r1)+,r0 bne 1b rts r2 1: mov (sp)+,r2 jmp *(r1)+ / C library -- stat / error = stat(string, statbuf); / int statbuf[18] or / char statbuf[36] / as appropriate .globl _stat, retrn, cerror _stat: mov r5,-(sp) mov sp,r5 mov 4(r5),0f mov 6(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys stat; 0:..; .. .globl _stime, retrn, cerror _stime: mov r5,-(sp) mov sp,r5 mov 4(sp),r1 mov (r1)+,r0 mov (r1),r1 sys stime bec 1f jmp cerror 1: clr r0 jmp retrn / C library -- stty / error = stty(filep, ttyvec); / filep is descriptor of open tty / ttyvec[0, 1, 2] correspond to args of stty .globl _stty, retrn, cerror _stty: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),0f sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys stty; 0:.. / C library -- switch .globl bswitch bswitch: mov *(sp)+,r1 1: cmp (r1)+,r0 beq 1f tst (r1)+ bne 1b 2: mov -4(r1),pc 1: mov (r1)+,r0 beq 2b mov r0,pc .globl _sync, retrn sync = 36. _sync: mov r5,-(sp) mov sp,r5 sys sync jmp retrn / C library -- time / tvec = time(tvec); / / tvec[0], tvec[1] contain the time .globl _time, retrn _time: mov r5,-(sp) mov sp,r5 sys time mov r2,-(sp) mov 4(r5),r2 mov r0,(r2)+ mov r1,(r2)+ mov (sp)+,r2 jmp retrn / C library -- times .globl _times, retrn times = 43. _times: mov r5,-(sp) mov sp,r5 mov 4(r5),0f sys 0; 9f jmp retrn .data 9: sys times; 0:.. / C library -- umount/ .globl _umount, retrn .comm _errno,2 .data _umount: mov r5,-(sp) mov sp,r5 mov 4(sp),0f sys umount; 0:.. bes 1f clr r0 br 2f 1: mov r0,_errno mov $-1,r0 2: jmp retrn / C library -- unlink / error = unlink(string); / .globl _unlink, retrn, cerror _unlink: mov r5,-(sp) mov sp,r5 mov 4(r5),0f sys 0; 9f bec 1f jmp cerror 1: clr r0 jmp retrn .data 9: sys unlink; 0:.. / C library -- wait / pid = wait(); / or, / pid = wait(&status); / / pid == -1 if error / status indicates fate of process, if given .globl _wait, _nargs, retrn, cerror _wait: mov r5,-(sp) mov sp,r5 jsr pc,_nargs mov r0,-(sp) sys wait bec 1f tst (sp)+ jmp cerror 1: tst (sp)+ beq 2f mov r1,*4(r5) / status return 2: jmp retrn / C library -- write / nwritten = write(file, buffer, count); / / nwritten == -1 means error .globl _write, retrn, cerror _write: mov r5,-(sp) mov sp,r5 mov 4(r5),r0 mov 6(r5),0f mov 8(r5),0f+2 sys 0; 9f bec 1f jmp cerror 1: jmp retrn .data 9: sys write; 0:..; .. rin.crsave.ssbrk.sseek.ssetgid.ssetuid.ssignal.ssin.ssleep.ssqrt.sssw.sstat.sstime.sstty.sswitch.ssync.stime.stimes.sumount.sunlink.swait.swrite.s/ / copyright 1972 bell telephone laboratories inc. / / roff1 -- text formatter .globl ttyn nop = 000240 signal = 48. ibuf: /init code in ibuf+obuf cmp sp,$end bhi 1f jsr r5,string; emes1 sys exit 1: clr r0 jsr pc,mesg sys signal; 1; place sys signal; 2; place jsr pc,makebf sys open; suffil; 0 bes 1f mov r0,suff sys seek; 20; 0 bes 1f mov suff,r0 sys read; suftab; 2*26. 1: clr r0 mov (sp)+,argc dec argc bne 1f jmp place 1: tst (sp)+ mov (sp),r4 cmpb (r4)+,$'+ bne 2f jsr r5,pnum; pfrom br 3f 2: cmpb -1(r4),$'- bne 2f cmpb (r4),$'s bne 0f inc stop br 3f 0: cmpb (r4),$'h bne 0f clr slow br 3f 0: jsr r5,pnum; pto 3: dec argc bgt 1b 2: mov $nop,get1a mov $ibuf,ibufp mov $ibuf,eibuf mov sp,argp jsr pc,topbot clr r0 1: movb r0,trtab(r0) inc r0 cmp r0,$128. bne 1b jsr pc,rbreak jsr pc,istop jmp loop makebf: sys stat; bfn; stbuf bec 2f sys creat; bfn; 400 bec 1f 2: incb bfn+8 cmpb bfn+8,$'z blos makebf jmp place 1: mov r0,ibf sys write; sufbuf;128. sys open; bfn;0 mov r0,ibf1 rts pc string: mov (r5)+,r1 mov r1,r2 mov r1,0f 1: tstb (r1)+ bne 1b sub r2,r1 mov r1,1f mov $1,r0 sys write; 0:..; 1:.. rts r5 emes1: xxx: .even obuf=ibuf+512. .=ibuf+1024. loop: clr nlflg jsr pc,getchar cmpb r0,cc beq 2f movb r0,ch jsr pc,text br loop 2: jsr pc,control jsr pc,flushi br loop mesg: tst r0 bne setsame jsr pc,ttyn movb r0,ttyx+8. sys stat; ttyx; stbuf mov stbuf+4,0f mov 0f,1f bic $22,0f sys chmod; ttyx; 0:.. rts pc setsame: sys chmod; ttyx; 1:.. rts pc pnum: mov r4,ibufp mov $37777,eibuf jsr r5,number1; 0 mov r0,*(r5)+ clr ch rts r5 flushi: clr ch tst nlflg bne 1f jsr pc,getchar br flushi 1: rts pc gettchar: tst ul ble getchar tst ulstate beq 3f tst bsc bgt 1f tst ulc bgt 2f clr ulstate br 3f 1: dec bsc mov $010,r0 rts pc 2: dec ulc mov $'_,r0 rts pc 3: jsr pc,getchar cmp r0,$'0 blt 1f cmp r0,$'9 ble 2f cmp r0,$'A blt 1f cmp r0,$'Z ble 2f cmp r0,$'a blt 1f cmp r0,$'z ble 2f 1: tst ulc bgt 3f rts pc 3: mov $1,ulstate mov r0,ch br gettchar 2: inc bsc inc ulc rts pc getchar: mov ch,r0 beq 1f clr ch rts pc 1: tst nlflg beq 1f mov $'\n,r0 rts pc 1: jsr pc,get1 cmp r0,$'\\ bne 2f jsr pc,get1 jsr r5,switch; esctab br 3f 2: cmp r0,$033 /prefix bne 3f jsr pc,get1 jsr r5,switch; pfxtab 3: cmp r0,$'\n bne 3f inc nlflg clr column 3: mov r1,-(sp) jsr pc,width add r1,column mov (sp)+,r1 rts pc esctab: .byte 'd, 032 /hlf (down) .byte 'u, 035 /hlr (up) .byte 'r, 036 /flr (reverse) .byte 'x, 016 /SO (extra chars) .byte 'y, 017 /SI (normal characters) .byte 'l, 0177 /delete .byte 't, 011 /hor tab .byte 'a, 0100 /at sign .byte 'n, 043 /number sign .byte '\\, 134 /backslash .byte 0, 0 pfxtab: .byte '7, 036 /flr .byte '8, 035 /hlr .byte '9, 032 /hlf .byte '4, 030 /brs .byte '3, 031 /rrs .byte '1, 026 /set hor tabs .byte '2, 027 /clr hor tabs .byte 0,0 pfxtab1: switch: mov r1,-(sp) mov (r5)+,r1 1: cmpb (r1)+,r0 beq 1f tstb (r1)+ bne 1b cmp r1,$pfxtab ble 0f cmp r1,$pfxtab1 bgt 0f mov $037,r0 0: mov (sp)+,r1 rts r5 1: movb (r1)+,r0 mov (sp)+,r1 rts r5 get1: tst nspace ble 1f dec nspace mov tabc,r0 rts pc 1: mov r1,-(sp) 4: tst ip beq 5f jsr pc,rbf br 6f 5: tst nx bne 0f mov ibufp,r1 cmp r1,eibuf bne 3f 0: mov ifile,r0 bne 2f 1: jsr pc,nextfile 2: clr nx sys read; ibuf; 512. bes done tst r0 beq 1b mov $ibuf,r1 add r1,r0 mov r0,eibuf 3: movb (r1)+,r0 mov r1,ibufp 1: cmp r0,$011 /tab bne 6f mov (sp)+,r1 mov $tabtab,r0 inc nspace 1: tstb (r0) beq get1 cmpb column,(r0)+ bge 1b movb -(r0),nspace sub column,nspace br get1 6: get1a: br 7f tst r0 beq 4b 7: mov (sp)+,r1 rts pc nextfile: mov ifile,r0 beq 1f sys close 1: tst nx beq 2f mov $nextf,0f br 3f 2: dec argc blt done mov *argp,0f add $2,argp 3: sys open; 0:..; 0 bes done mov r0,ifile rts pc done: jsr pc,rbreak jsr pc,eject jsr pc,flush place: sys signal; 2; 1 mov $1,r0 jsr pc,mesg sys unlink; bfn sys exit rts pc putchar: cmp pn,pfrom blt 2f clr pfrom bic $!177,r0 beq 2f movb trtab(r0),r0 cmp r0,$' bne 1f inc nsp 2: rts pc 1: cmp r0,$'\n bne 1f clr nsp clr ocol br 2f 1: tst nsp beq 2f tst slow bne 4f jsr pc,dsp cmp nsp,r1 blt 4f mov $011,3f+2 cmp r1,$1 bgt 8f mov $040,3f+2 dec nsp br 9f 8: sub r1,nsp 9: mov r0,-(sp) 3: mov $011,r0 jsr pc,pchar1 mov (sp)+,r0 br 1b 4: mov r0,-(sp) mov $' ,r0 jsr pc,pchar1 mov (sp)+,r0 dec nsp bne 4b 2: cmp r0,$026 blt 2f cmp r0,$037 beq 3f bgt 2f mov r0,-(sp) jsr r5, switch; unpfx cmp (sp)+,r0 beq 2f mov r0,-(sp) mov $033,r0 /prefix jsr pc,pchar1 dec ocol mov (sp)+,r0 2: pchar1: cmp r0,$011 bne 1f jsr pc,dsp br 2f 1: jsr pc,width 2: add r1,ocol movb r0,*obufp inc obufp cmp obufp,$obuf+128. beq flush 3: rts pc dsp: clr r1 1: add $8.,r1 cmp ocol,r1 bgt 1b sub ocol,r1 bne 2f mov $8.,r1 2: rts pc unpfx: .byte 032, '9 .byte 035, '8 .byte 036, '7 .byte 031, '3 .byte 030, '4 .byte 026, '1 .byte 027, '2 .byte 0,0 flush: mov obufp,r0 sub $obuf,r0 mov r0,0f mov $1,r0 sys write; obuf; 0:0 mov $obuf,obufp rts pc control: jsr pc,getchar mov r0,-(sp) jsr pc,getchar swab r0 bis (sp),r0 mov $contab,r1 1: mov (r1)+,(sp) bic $100000,(sp) cmp r0,(sp) bne 4f mov (r1),(sp) tst -(r1) bpl 3f jsr pc,flushi cmp ilistp,$iliste bgt 5f mov ip,*ilistp add $2,ilistp mov (sp),ip br 5f 3: jmp *(sp)+ 4: cmp (r1)+,$-1 bne 1b 5: tst (sp)+ rts pc contab: ; casead ; casebp
; casebr ; casecc ; casece ; caseds ; casefi ; casein ; caseix

  • ; caseli ; casell ; casels ; casena ; casene ; casenf ; casepa ; casebl ; casepl ; casesk ; casesp ; casess ; caseta ; caseti ; casetr