kHb_v^&9&H&] 4(5&+oDA*H&: H n crnTtKl, IO44~lY^&9&2d'K .Wh|W WH J09&WW4WcWgFe,'Co6'aJBW{bA jfj fo0. V26PEfe3 /cz\bSbcGD $&-Q&[i5&- ,0~2}r|6v 0I l {lz' /I- 0I$~  /yQ2!-b(LzQ-&aH&- ,0~ H,& 0I l j0kbcC(/RP2a b(gzR{OnZU$nya>!(/u/eb)&RZ9R8ftI4DMQY& ,BV~|~ <(r)r*r+r|M \ |M }s%l|@;M( IO{ig; { /z'0'y|xw2GvGuGtG! C,}0!HJ&NG0 sB`chYchbch[chcob?bbtcYJM{MM4c0I@@^r|&qkc YS$o pO zJ3@p48"p^boblic(/P.c,iy lI2z/o"cT@J ncTJ n4"d43N(:z7+b(j{bc(c)c*c+jk+d\ ,0 li~rik2p"#[idfhb&- ,0Jb"(ctn nplii:Y ~}2 Mz|@?P*xRw' ,(X{(/"(z(/$f>Wj}t~~b c%*+(/.+|i|)tq5d/b)oRbl!l (=zsbz2bk he92bH{ y"(Qzx(/wX>|)2`J&c bbb j!.(/Wb)d *.w$755w'pv|9sZ6fgCqoT*z\c>@e,c4h$x#Z ~g}I | &FH{K zGy|&IPk'F (2z)n |IC  l)'!J l|[p;6" l|~ihlyx~9_w{ v<b(F{TFnu &t & .@`s& 7 7 7r qF.n GFb9c . ykkpS}&6$#Uu@fw+/8'#9.38"s<.:8+/=+-="(=419059/7<%$9RSDTUDVWDXYDZDDDDDQDRSDTUDVWDXYDZE?WCGwKOwSWwI@@V@M4V @A1V@PV@I@@FI@@F@I@@I@@F/Z01ff=t4f[f>3p@e3}Dbclv(wDs~"n'?*WH (o ."jBn"l->b-8p-?." "z-' JB!fVb {~}'7!>y2vob `y ?x /w /(ovC2(u{t(/_.(kzsrR\)bhTz]XJ ]fs#6\#+^\B^Tz(m2(hzm"d!)b`]y\\&Rm$v04je ` B t w`g.SdJ?1 REM MONOPOLY GAME BY DAVID BARKER, SOUTHEASTERN STATE COLLEGE, DURANT, OK 2 REM SLIGHT PROGRAM MODIFICATIONS BY DAVID AHL, DIGITAL 3 REMARKABLY TRANSLATED TO OS8 BASIC BY KAY R. FISHER ...DEC 4 M(1)=1500\M(2)=1500\I(1)=0\I(2)=0\DIM A$(26,21),B$(26,21),H(40) 5 DIM O$(21),G$(40,21),P$(21),L(40),P(40),R(40),C$(10,39),Z$(10,38),M$(20,60) 6 P$="HOW MANY HOUSES AT $"\O$=" EACH DO YOU WANT ON" 7 DEF FNR(H,I,Z,R)=(H(I(Z))*R(I(Z))*10) 8 FOR I=1 TO 40\L(I)=0\H(I)=0\NEXT I 9 FOR I=1 TO 8\U(I)=0\NEXT I 10 FILE #1:"RKB0:MONPLY.B1" 11 FOR I=1 TO 40\INPUT #1:G$(I)\NEXT I 12 FOR I=1 TO 20\INPUT #1:M$(I)\NEXT I 13 FOR I=1 TO 10\INPUT #1:C$(I)\NEXT I 14 FOR I=1 TO 10\INPUT #1:Z$(I)\NEXT I 15 PRINT M$(1)\PRINT\PRINT\PRINT"**RULES**"\PRINT M$(2) 16 PRINT M$(3)\PRINT M$(4)\PRINT M$(5)\CLOSE #1 17 FOR I=1 TO 40\READ P(I),R(I)\NEXT I 18 DATA 60,2,0,0,60,4,0,0,200,25,100,6,0,0,100,6,120,8,0,0 19 DATA 140,10,150,35,140,10,160,12,200,25,180,14,0,0 20 DATA 180,14,200,16,0,0,220,18,0,0,220,18,240,20,200,25 21 DATA 260,22,260,22,150,35,280,24,0,0,300,26,300,26,0,0 22 DATA 320,28,200,25,0,0,350,35,0,0,400,50,0,0 23 RESTORE 24 DIM V$(21) 25 DIM P$(20) 26 DIM N$(2,8) 30 PRINT"WHO IS PLAYER #1";\INPUT N$(1) 40 PRINT"WHO IS PLAYER #2";\INPUT N$(2) 100 PRINT\PRINT "**";N$(1);"'S TURN**********"\F=0 102 Z=1\GOSUB 1000 103 GOSUB 2000 115 IF D<>D1 GOTO 117\F=F+1\IF F=>3 GOTO 117\PRINTM$(9)\GOTO 102 117 IF F<>3 GOTO 200\PRINT M$(10)\I(Z)=10\M(Z)=M(Z)-50 200 PRINT\PRINT"**";N$(2);"'S TURN**********"\F=0 202 Z=2\GOSUB 1000 203 GOSUB 2000 215 IF D<>D1 GOTO 217\F=F+1\IF F>=3 GOTO 217\PRINTM$(9)\GOTO202 217 IF F<>3GOTO225\PRINT M$(10)\I(Z)=10\M(Z)=M(Z)-50 225 PRINT M$(11);\INPUT F$\IF F$="QUIT" THEN 30000\GOTO 100 999 REM DICE ROLL 1000 PRINT M$(6);\INPUT F$\RANDOMIZE\X=RND(0)\Y=RND(0) 1004 D=INT(X*6+1)\D1=INT(Y*6+1) 1015 PRINT "YOU ROLLED A";D;"AND A";D1\I(Z)=I(Z)+(D+D1) 1016 IF I(Z)=<40GOTO1017\I(Z)=I(Z)-40\M(Z)=M(Z)+200 1017 RETURN 1999 REM PLACEMENT 2000 PRINT"YOU ARE ON ";G$(I(Z)) 2001 REM COM CHEST 2002 IF I(Z)=2 THEN 4100\IFI(Z)=17THEN4100\IFI(Z)=33THEN4100 2003 REM INC TAX 2004 IFI(Z)<>4THEN2006\M(Z)=M(Z)-200\RETURN 2005 REM CHANCE 2006 IFI(Z)=7THEN4400\IFI(Z)=22THEN4400\IFI(Z)=36THEN4400 2007 REM VISIT IN JAIL OR FREE PARKING 2008 IFI(Z)=10THEN2014\IFI(Z)=20THEN2014 2009 REM JAIL 2010 IFI(Z)<>30THEN2011\M(Z)=M(Z)-50\I(Z)=10\RETURN 2011 IFI(Z)<>38THEN2012\M(Z)=M(Z)-75\RETURN\REM LUX TAX 2012 IFI(Z)<>40THEN2018\M(Z)=M(Z)+200\I(Z)=0\RETURN\REM GO 2014 RETURN 2018 IFL(I(Z))<>Z THEN 2019\PRINT M$(12)\GOTO 3100 2019 IFH(I(Z))<>0GOTO2020\IFL(I(Z))=<0GOTO2020\IFL(I(Z))<>ZTHEN2125 2020 IFH(I(Z))=<0GOTO2022\IFL(I(Z))=<0GOTO2022\IFL(I(Z))<>ZTHEN2100 2022 PRINT M$(7);P(I(Z));"DOLLARS" 2024 PRINT M$(8);\INPUT F$\ IF F$<>"BUY" THEN 3100 2026 M(Z)=M(Z)-P(I(Z))\PRINT "YOU NOW HAVE";M(Z);"DOLLARS" 2027 L(I(Z))=Z\GOTO 3100 2100 IF Z<>1 THEN 2101\M(Z)=M(Z)-FNR(H,I,Z,R)\M(2)=M(2)+FNR(H,I,Z,R) 2101 PRINT "YOU OWE";FNR(H,I,Z,R);"DOLLARS RENT"\RETURN 2102 IF Z<>2 THEN 2103\M(Z)=M(Z)-FNR(H,I,Z,R)\M(1)=M(1)+FNR(H,I,Z,R) 2103 PRINT "YOU OWE";FNR(H,I,Z,R);"DOLLARS RENT"\RETURN 2125 IFZ<>1 THEN 2126\M(Z)=M(Z)-R(I(Z))\M(2)=M(2)+R(I(Z)) 2126 PRINT "YOU OWE";R(I(Z));"DOLLARS RENT"\RETURN 2127 IF Z<>2 THEN 2128\M(Z)=M(Z)-R(I(Z))\M(1)=M(1)+R(I(Z)) 2128 PRINT "YOU OWE";R(I(Z));"DOLLARS RENT"\RETURN 3100 PRINT M$(13)\PRINTM$(14);\INPUTF$\IFF$="SELL"THEN3102 3101 GOTO 3105 3102 GOSUB 3150 3105 PRINTM$(19);\INPUTH$\IFH$="HOUSE"THEN3200\RETURN 3150 PRINTM$(15);\INPUTF$\IFF$<>"LIST"THEN3152\GOSUB3170 3152 PRINTM$(17);\INPUTV$\PRINT"HOW MUCH DO YOU WANT FOR IT";\INPUTV 3154 FOR I=1 TO 39 3156 IF V$<>G$(I)THEN3158\IFL(I)<>0THEN3158\PRINTM$(16)\RETURN 3158 IFV$<>G$(I)THEN3160\IFL(I)<>1THEN3160\M(1)=M(1)+V 3159 M(2)=M(2)-V\L(I)=2\GOTO 3165 3160 IF V$<>G$(I)THEN3162\IFL(I)<>2THEN3162\M(2)=M(2)+V 3161 M(1)=M(1)-V\L(I)=1\GOTO 3165 3162 NEXT I 3165 PRINT M$(18);\INPUT F$\IFF$="YES"THEN 3152\RETURN 3170 C=0\D=0 3171 FOR I=1 TO 39 3172 IFL(I)<>1THEN 3174\C=C+1\A$(C)=G$(I) 3174 IFL(I)<>2 THEN 3175\D=D+1\B$(D)=G$(I) 3175 NEXT I 3176 PRINT N$(1);"'S PROPERTY" 3177 FOR I=1 TO C\PRINT A$(I)\NEXT I 3178 PRINT N$(2);"'S PROPERTY" 3180 FOR I=1 TO D\PRINT B$(I)\NEXT I 3182 RETURN 3200 IFL(1)<>ZTHEN3202\IFL(3)<>ZTHEN3202\PRINTP$;"50";O$ 3201 PRINT G$(1);" ";G$(3);\INPUT U\GOSUB 3250 3202 IFL(6)<>ZGOTO3204\IFL(8)<>ZGOTO3204\IFL(9)<>ZGOTO3204 3203 PRINTP$;"50";O$\PRINTG$(6);" ";G$(8);" ";G$(9);\INPUTU\GOSUB3254 3204 IFL(11)<>ZGOTO3206\IFL(13)<>ZGOTO3206\IFL(14)<>ZGOTO3206 3205PRINTP$;"100";O$\PRINTG$(11);" ";G$(13);" ";G$(14);\INPUTU\GOSUB3258 3206 IFL(16)<>ZGOTO3208\IFL(18)<>ZGOTO3208\IFL(19)<>ZGOTO3208 3207PRINTP$;"100";O$\PRINTG$(16);" ";G$(18);" ";G$(19);\INPUTU\GOSUB3262 3208IFL(21)<>ZGOTO3210\IFL(23)<>ZGOTO3210\IFL(24)<>ZGOTO3210 3209PRINTP$;"150";O$\PRINTG$(21);" ";G$(23);" ";G$(24);\INPUTU\GOSUB3266 3210IFL(26)<>ZGOTO3212\IFL(27)<>ZGOTO3212\IFL(29)<>ZGOTO3212 3211PRINTP$;"150";O$\PRINTG$(26);" ";G$(27);" ";G$(29);\INPUTU\GOSUB3270 3212IFL(31)<>ZGOTO3214\IFL(32)<>ZGOTO3214\IFL(34)<>ZGOTO3214 3213PRINTP$;"200";O$\PRINTG$(31);" ";G$(32);" ";G$(34);\INPUTU\GOSUB3274 3214IFL(37)<>ZGOTO3220\IFL(39)<>ZGOTO3220\PRINTP$;"200";O$ 3215PRINTG$(37);" ";G$(39);\INPUTU\GOSUB3278 3220 RETURN 3250U(1)=U(1)+U\M(Z)=M(Z)-(U*100)\IFM(Z)=>0THEN3252\PRINTM$(20) 3251 M(Z)=M(Z)+(U*100)\U(1)=U(1)-U\RETURN 3252 H(1)=U(1)\H(3)=U(1)\RETURN 3254U(2)=U(2)+U\M(Z)=M(Z)-(U*150)\IFM(Z)=>0THEN3256\PRINTM$(20) 3255 M(Z)=M(Z)+(U*150)\U(2)=U(2)-U\RETURN 3256 H(6)=U(2)\H(8)=U(2)\H(9)=U(2)\RETURN 3258U(3)=U(3)+U\M(Z)=M(Z)-(U*150)\IFM(Z)=>0THEN3260\PRINTM$(20) 3259 M(Z)=M(Z)+(U*150)\U(3)=U(3)-U\RETURN 3260 H(11)=U(3)\H(13)=U(3)\H(14)=U(3)\RETURN 3262U(4)=U(4)+U\M(Z)=M(Z)-(U*300)\IFM(Z)=>0THEN3264\PRINTM$(20) 3263 M(Z)=M(Z)+(U*300)\U(4)=U(4)-U\RETURN 3264 H(16)=U(4)\H(18)=U(4)\H(19)=U(4)\RETURN 3266U(5)=U(5)+U\M(Z)=M(Z)-(U*450)\IFM(Z)=>0THEN3268\PRINTM$(20) 3267 M(Z)=M(Z)+(U*450)\U(5)=U(5)-U\RETURN 3268 H(21)=U(5)\H(23)=U(5)\H(24)=U(5)\RETURN 3270U(6)=U(6)+U\M(Z)=M(Z)-(U*450)\IFM(Z)=>0THEN3272\PRINTM$(20) 3271M(Z)=M(Z)+(U*450)\U(6)=U(6)-U\RETURN 3272 H(26)=U(6)\H(27)=U(6)\H(29)=U(6)\RETURN 3274U(7)=U(7)+U\M(Z)=M(Z)-(U*600)\IFM(Z)=>0THEN3276\PRINTM$(20) 3275 M(Z)=M(Z)+(U*600)\U(7)=U(7)-U\RETURN 3276 H(31)=U(7)\H(32)=U(7)\H(34)=U(7)\RETURN 3278U(8)=U(8)+U\M(Z)=M(Z)-(U*400)\IFM(Z)=>0THEN3280\PRINTM$(20) 3279 M(Z)=M(Z)+(U*400)\U(8)=U(8)-U\RETURN 3280 H(37)=U(8)\H(39)=U(8)\RETURN 3900 REM COMMUNITY CHEST 4100 RANDOMIZE\L=RND(0) 4102 IF L>.1 THEN 4104\PRINTZ$(1)\M(Z)=M(Z)+100\RETURN 4104 IF L>.2 THEN 4106\PRINTZ$(2)\M(Z)=M(Z)+100\RETURN 4106 IF L>.3 THEN 4108\PRINTZ$(3)\M(Z)=M(Z)+20\RETURN 4108 IF L>.4 THEN 4110\PRINTZ$(4)\M(Z)=M(Z)-50\RETURN 4110 IF L>.5 THEN 4112\PRINTZ$(5)\M(Z)=M(Z)+100\RETURN 4112 IF L>.6 THEN 4114\PRINTZ$(6)\M(Z)=M(Z)+200\I(Z)=0\RETURN 4114 IF L>.7 THEN 4116\PRINTZ$(7)\M(Z)=M(Z)-100\RETURN 4116 IF L>.8 THEN 4118\PRINTZ$(8)\M(Z)=M(Z)-50\I(Z)=10\RETURN 4118 IF L>.9 THEN 4120\PRINTZ$(9)\M(Z)=M(Z)-50\RETURN 4120 PRINT Z$(10)\M(Z)=M(Z)+200\RETURN 4300 REM CHANCE 4400 RANDOMIZE\L=RND(0) 4402 IF L>.1 THEN 4404\PRINTC$(1)\M(Z)=M(Z)-15\RETURN 4404 IF L>.2 THEN 4406\PRINTC$(2)\I(Z)=24\GOSUB 2000 4405 RETURN 4406 IF L>.3 THEN 4408\PRINTC$(3)\I(Z)=I(Z)-3\GOSUB 2000 4407 RETURN 4408 IF L>.4 THEN 4410\PRINTC$(4)\I(Z)=0\M(Z)=M(Z)+200\RETURN 4410 IF L>.5 THEN 4412\PRINTC$(5)\M(Z)=M(Z)+50\RETURN 4412 IF L>.6 THEN 4414\PRINTC$(6)\I(Z)=5\M(Z)=M(Z)+200\GOSUB2000 4413 RETURN 4414 IF L>.7 THEN 4416\PRINTC$(7)\I(Z)=10\M(Z)=M(Z)-50\RETURN 4416 IF L>.8 THEN 4418\PRINTC$(8)\M(Z)=M(Z)+150\RETURN 4418 IF L>.9 THEN 4420\PRINTC$(9)\I(Z)=39\GOSUB 2000 4419 RETURN 4420 PRINTC$(10)\I(Z)=11\GOSUB 2000 4421 RETURN 30000 C=0\D=0 30002 FOR I=1 TO 39 30004 IF L(I)<>1 THEN 30006\C=C+1\A$(C)=G$(I) 30006 IF L(I)<>2 THEN 30007\D=D+1\B$(D)=G$(I) 30007 NEXT I\PRINT \PRINT 30008 PRINT N$(1);" OWNED THE FOLLOWING PROPERTY" 30009 FOR I=1 TO C\PRINTA$(I)\NEXT I 30010 PRINT "AND HAD";M(1);"DOLLARS AT THE END OF THE GAME" 30011 PRINT N$(2);" OWNED THE FOLLOWING PROPERTY" 30012 FOR I=1 TO D\PRINT B$(I)\NEXT I 30013 PRINT "AND HAD";M(2);"DOLLARS AT THE END OF THE GAME" 30020 END |d@"=&=*=.{/<""8+ ?+8+ *%8??|??<>?>s` pWs v.p?zf?v~R `|B);)2f&& &6&~&}&|t*;|;j .~&~&%/X?i82$>Z\+&],&8$'%B|(/{)z&A@PzBiH"(?zDHIz ?BR*k)Z.` ~{}@)|/"@KTG{X.>Z.(J){z" <)E2BiZy"(/zx /2w"@E$jE ?GU9A=ZJjve&EHP.@Ez;HK9WBzeX*D=qP:u;*DEHP9X.`Ftb@$2 /Gs2@G<r^ 2(/e\2q@)]@)e0   P@E@+ _nIdLA.@A)a&MA7(X.Ni /JKWAz7~~&N ~0('z@r AzXn!.7aBt'KITG{ @/774@.}/7;9 HLqNHqz>|H/qR)RiaRiw@){7@azFy@)db@X$bt%'B6Zi!.7(/G;9H; \t Z8h-7k[XI)F.n\Xi)\"!WgWXI)!.WWtY&ffK\X~.KiX)zL)D. )z,z$0 )DH[$1)*XX"HZ~Q)M)"Z"!2fWW4\VipOyx_28(|R82tI."|KTG:OrL{oqv'`+D. b fal2 Ub! l !tn,= )&&L+h` +zNQQQ1M+&"\1b!b&~iO x_.;)H &1"}&8Xr2d9B^9b|9r{Fz@)2@)0&1 .1b!1f1^*RIbyRRi l'" wPJX` X~$ '% 'B 0bKiC+zEHP xk88 0OuO 6 <| 1D"@X$b22t%2'BbZiGV9!-(}KyTG{W)G\2xn+\b!\f- -6-B))&~"8}i|9 l.UUt9U'8{rl88tG'U&9;&|-v5.Hzry@)Z.`(hzJxw/"@KTG{W Fuu0U@Q`[p6ODx &H?5~"FA=_-?)v"I@)@)GD9=9%z;FH}2F>!U)(?2I&2(z:<)Ih|I&! 2Ki]`zE 2 /VK)FYzP.H;y3{b@I3(/Iz2@3I?9v>)pj)y"@@G;H:Av=m`Xbd4fb98hbc6bbCcb(/zf~ &fd& Ca l ?(d$#F9&K/zcb&9& d.f}"4Ohc G'86b ~bb& bb6r9~b l <ftG,0a.OCOOO62|6&6I&edO;9TK f<{z({y /fx7f-?,;0pat}px[ \F\bD\b]\&F.b`5)3U).U)NU)R~b\& C@+z}, <b|[|6K{&z\"y"xb l(?I!.\$(DzD8Jw!l\2t{!*v&u6*~/@)[ "  DMM R)RiRiRib }2J n l|0 @z#Dz!b PzBS)S)T{{z2&;SR RR)Rik,?>XH/yV9hO)r}_xGWy\.xpfOtw XGj xj|3uf R@/;9~^Ti}^r\Oix_2 /P98FX.`H/Z> +.">h}@8(.6B.H/>9\@/C$@[. ' X~.-Z99| F{b@9jE SP).@/L;9HLz}@)V+3^k<yx@G @R7hkJv@ut7@ It 8R3e`?L&m&l6n6>)d b bcocpob~o[ .zZo`(%zJmnOH.[ Fzmp2@OZ.(5J)llC/@)X.`oH/I".H/I[" ' {np27;)T;60d b b c. c/.b~OT9}Pyof}7*Vn|b{iI+< >zyx"@G!psv>wB 2@ z~H/ } KUB |2@{bzKUY]]bDzb:dy&\Yi9^&y_&]D.]\b\f_,J] "]d'O)~NX. Uz&8'9BxFk8rgH;)D;}wH/v"`X f!,c&,`k.[ OZ>.(]J)yx"/@)O:B D  C  C@  ! I}WQ `  "\FOnx2\FOpx0 "b8 D~;!&8(|!K~0) 2)@F@[0(){X@a@@s@>A@)@$@){@Pdb(LzPzSC ShSC ;SC0dn & & H?P[ gz /}|" @9S2{@)S1 SPeoK efz(0r r0_A\]f^_f dbeBi9Y#p~i]Ba^bb_bc}i}|}abpbc|i" 1zB.{ /-$U) (/B9Cz# Bz:BiB)y :(/D"!oUx\&w r!b@Rz!fvT*ub:tb b(kzHfhz `6 a6 b6 c6:W s"V " ryK^7 :H*# uROk+o$ ~;@l}|0,@&} <o>"=t=UWbj8pj?]k" fz j'lNJ lb BK] .|q_')W>nbBfe_8D I ~C}@ Qx|& {C(Oz#DHo ,#y"zcx4 lP <Pt' C(6z-n Iw -. G%J lrp?:" l| lvpwF2vFr&Gbut{|ps&r&&CJ n qiq9DWp"ono!eQ+M 4E` `X{hzFm=V^8p$p\``&]&^&y&]^f_~iH.bfkxyJ`\& ](^r(_r(5zZ]b .z^(/_ /H{} \\&&\&0|G&ff@nGq>G0~GG&=J70~ `!.\`&y&].abHXz{7(kf.}iyRJ`\&]&^&_hH0@cb__&bb^^&ab]]&k0V@_ h?YcbDDnD.c*]H]f^.^_b_f\ K 0_D._^b^f].]k ($u ~r Uy$0K^--4\}b|bPh-F>nPxL#t7JBI/(/-;9S-K{2-{C I/" ]zCP/(/]U)Pz2y\PPK-@b{- /xw"@X--&b7`0_2,Xpqp?p" \]pSX\Yi.]Bi" zXbBi"~(/Z(oUdA9\F.n]Xi]"]XiB^&]}"(Dz|&(?B]" ?z^2 @z6{&$0JD^;*FCJ n ziFz9FhBzz+](,](yx)wx)F0]fn]bFn]]bv` mzz(?ou"za]+`-]0@ `pXr8rN|\@bu`6pdx]knVA-UPJ*#L^SS5u]%gPuEoU_mS_uVqQ_r"oZ?AA>m-},r8n1mlo/(~p.2l_N{|r?qyO^q{mOr|?;{y_9r?n7{r~/n?,{not/nz}p-p=Mp]mp}p-p=Mp]mp}4;,R7:;2<C7O:t:1.s2;(,D91,1gt91-+>lt720+,q0.7 ,!q<73q(zp$0__4nnc@_tHBy_n3n(Oc_+v |B$ o O <~<}( ,| {z2 l(?y&6J]@Jk &j & XN tGi" g MJ[Bh[rgf{&;IY!LY+P$O 3Xo`~&@m_]Pp\=]FZ Az@$z~0( zH n^f!,^.`!&\Cf\'8\r] /!"\^t , ^b''b!}g 'b 6z|{'zy'xw'vu'ts'rrrr\Zn]Oir}_qp[ob [c[(OH 7f[cYYbf[[4 tRO)xPE cZ^bfjnpO PDxox[xPcS?#C8$A $e$8@@@@H.@/H@>~?|NtO}t ^t_}pLntot~t|ttI@VMVD AVVI@FI@FI@I@FI@OZ[ PW==~|t@`>-19 ??->"=88?0>5,&BfCb!~b(z}F 'b z|&(?{- z-' ,yx0w,(vsu /(t",Xnfs^^c&4rDrbF{kX =P( O4P8 OP V~^q'^.ppso4{l40P[[b`PdP-6PBB.o./6L-#.w//--t.[JPK@0WQ"AX$}o xxprcJ#OoI!Ef,!.F,d~&}-& C.cH|r/.b@O0- ,{#6z?-(/yx2 l-6#6C.lw/&0 .D.b &/v"H5f4Yh, ' /!. 0{1fDf1F.1f1.u Tt#(Vzst)DHJD05q.,,&4b!+b++b`Y{BCfrq0!lJ&Nk^4J00`0HspqUbX$,!.G b!. !b!.!"b~!."#b~!.#}i bD b,,&,.,bgw J |C/{cO-(/Iz" l-6/6061626.6.D..," l0 '1 '2 '*""DDn,,&,&!D.!,",,b#bDDn,,&,& CrxcO-(/wz2qh-6.636v0 qK!qz/"tuUrusXT!3"Hb//cD/c &3.x/f/@.,,&_z,~"_z,. G} 3!. ,r 3b!)j| G/&J.{'z,2b)b(y{@,b,oZ,"~/Z,",b xb l(?y-6P6PV&-& -C-c G -DSF*CBfwvB6Cwiv[%2"_l",!&JL jA)o04i)3}&^JCuQdr"qX$x "(/0"b l-6(?~ .c(~r/f/5&4lZ-`(z.})"/&.5&|}){, zy .r /r t"J#(/yx2b l(?~./c(wr./b54f.B|H.}{, 'z .!. /r t#D7y+<ev)u ^]Bhtb n`J`Jr`8`BbqCqponoJmlH/kj"o` @`?p kDO[@EO`Xc^cpYA%q6f$b!7f-&&~' )y"@@TKJcXc ^l4' ?K&"?%bA)b@?c?@G@AD ("(ipH )?&&@&??4@@t%J~'}'|v?J*~@?>f{A&>/85"??&4b>H.>?b?f@.@Ad1?"4@b5*kC'iOz)|y~xr}*r(~{X(i@@} w0=fJXlhpoBkvb=Xb kGkD[0( H l-?,; v H4sq{~2} ||<{ z y<--b oP-"ox-rHow"v |uY#_`$>um! %Z~"}b cUt W"en-|ba-/, /""{..!.H-b-.bWrXb@zr-S yu@WdY" xrYr wrz'y >yvymXuYrtlrsrrqb c VtKv)p|?vyo>@{|`fd& ?C kG?DkbJ|?iMTnabn@xb@8[J-~b.-cJ n }i-}9-.D|"{z{ A 4`>~/@)[-"  DMM R)RiRiRib }2J n l|0 @z#Dz!b PzBS)S)T{{z2&;SR RR)Rik,?>XH/yV9hO)r}_xGWy\.xpfOtw XGj xj k`{v.z&~ & Gw L} (?& l|{ l|. |IH( #. G L|  zCyGx8><@nD`VI@FI@FI@I@Fw`H oL0]Pp\_ nG~@2o(ipa4)p KD~}0|,({sz /cb"(GxU#&hC9lhG6h'GBhht ,V#b{~#y'yx7KwIH/G__t`D;v"uvrtswr0 qIta2(xpu'ot'u0Uvn^m^6jO} PDd @]qL>WQm"?xxqp) 0sPmx8CL0 y(p Ir:2=@ 1(`}k"{`DhiZM2`.5MO  .; Ua@.1`hi G1z{`$h) G2z{`$}h@iMOB`h&m0L)(Zm0LisW4lnwLMq&`hi G zq{*`h@)G_ r*{`!nN@/1)`-! qu>in,2S^rShrG~38 MEq*`-! rqin,;`d}; `=@{`Qn?N@2P`hi G3zA{*`h@)G_4B*@#Z! }l;M`F&Bh *mt,i(Jhiq0=il'nM@12`"B hh@irK6kJ2*m0,ilZn{\MOr`"B hh@irKqkJ2*m1,)FJBhhi r7@A5`"B hh@irK1kJ2*m0,)FZBhhi qv>k! 4m*yiMl..?@S R`*Bhhi pi:11;M r` ,l`,l?@+"`(*10,0jJ h+p0Lim*C+1i*t2+l.];`S`%zkM3r %{`=?<@T2`$=+3{`BB hhA)q;1iZ43;;`D}QTZ i*I(h-pSL nD12 Ms(`$}3K{ C O@Mq0`1n?L@+32`$}3K; C O@Mq0`1n?L@;3<`$}3K{ C CR`1nL@K3F`$}3K; S BLq!`1n?L@[3P`$}3K{ S O@Mq0`1n?M@k3Z`$}4K{ C YDBq3`1n?L@{3 `4}4K; C YDBq3`1n?L@ 4`4}4K{ C YDBq3`1nL@4`4}5K{ C A15`1n?L@+4(`4}6K{ C ICC1C`1n?L@;42`4}8K{ C NBqS`1n?L@F4 3`OMq0`1?@cQC `1OMr `?@\4 3`OMs0`1?@cg(C `1 0R `?@r42 3`Lq!`1?@c}NTPnDM- D `1IC41;`?@84 C`IC2C`1?@cCD `1IC43;`?@L4( C`N.MOR2D`.@CbL;0> nGN42 RRC;`.5\M?}@95`HL'8Hqo=qX`.b YQ MI4Mr`n5MOM4|MM.( %Y MIMO`!n3LMM8q oq]`.( %Y MIMO`!n2LMM`.b YQ MI4) 0 mx8CL0 y 5"k,(2,lShT S  AAE,8aMd 5^"2,82,l- 3CLVE`TKGb@a0 5"kD":k0"KD  NSRI"d M?V  XPE1 AHRAMN5N`$CN`!NT$T@O#,aM|q2 b` W3N`!UDR`!`T$ 6-0]2HDC(RI:3!@5 `4A GM?MUtR`!`T$ 6-0]2HDC(RI:3!) 0=mx8CL0 yNqT.!M $ }lJ(C yk*iTN"" Mr %*,l*; =l,{ { U*?@T2 %(kl*9*Ai @#f# *X z lD.50 {`D}k"@C(# *X z lD.50 {`D}kf@C `  `G4`I5 8 CT`AXRT %`M?4 `S1 AHL. 8N`1S((R QS`N?@E0``T $S((Ca QS`SLU.Q O`AS`bX EM s `F8U 4U5TXVCnMY `A``PN `QCASO" O6`HPOE4 N0 `I?@ 3M0`* `S((W8M?[@+3`*(`SBLM SUnCM1sMcMt`T"(oHih[oi`n,x1K31;1?>@)4 `pHGT"IIN ; T (`E B@ ;UYRM}s %l TL",aX"H0mQ$AT:?@CI "@C%# hY1ljbR`N!E!G20 @CP`*Is:0l<.3L20;@Cz 2`R_1I(-SA`.-q1K34;1<@X3*`(i2I(hpGm(i`*n3M14;{`DRO+(CiS.h)C/h)BN *@#+ XO8N` I-X TXAN NR AECRCPb!k"b7G1h4?<@ 3 %h1l ( RE`FCDM"a!8@4 U` 5%G RTRSQ "8Mhr `A5X(`3RA 5<E3n H`QIQ %T(T ?@c5)0`}Bk{, lXr"APC 8"";,:("G14 ?@C`  M8 Q$ @ C3 ON(XUzHCL0-0m@#@`  TH#z8qo>qM_.0 XSHCL0T !TR`n,{@CM s`H@SR$MMCLT "TR`Qn,H{z18y w<  TR  8CT0O:#13 M t?bb 'X;`=T2Z3{J 'X T U 8L# NbaMpc`!n?M@?= 1sLbn JMP XFIX1 OUTLF, ISZ XFIX /LINE FEED ISZ I XFIX /INCREASE LINE COUNT JMP OUTLF1 /NOT END OF PAGE TAD (-66 /RESET LINE COUN DCA I XFIX /FOR NEXT PAGE JMP OUTLF1 /TYPE LINE FEED OUS) 0YPmx8CL0 y@1`S_hiLSh4)GN21 ?@C\ Q`ESht)SKhiLMq`$ZSO+j m*i27Mr?$@21`2 *m(&)w*0l,E!8@3` O 1 D`"IMN@MIu` MI4FRP`SNA RQU?4@"2! }l ;`0M zA {`$}kD(i`M'u aep0K;`PM F8PEzHS hpI~(m)1H3,"-TT@S %b3,1F!b8RE`F8DAM:8p K!8@1 O3 TNHRC:p l0aG80 @Cw`aANb',NI(hNp Eid80 lnL98K0 @2` M1X`nc.(`EW 3C!S ^A8q;)M_ ! XGS Eb3>,FC!{8`*hiL`.,s4K12;1<@0` r+q3+,.L3MO^ ! bX RNETENA:p l3aO3 TNHRC:p l1aMAA aXLH UTCBz!HaM_@ XSHCL0T !TR`n!QM's `};L qY0,<WN`AdP3`NBP,X+{<`q .4L"`7,?@a1` T4z18q oqmM:u `4TT@Cz18q oqmM:uL>1UMMq.4"K`,x? 5 8CT0O:#MAND G DCA CGOQ CCHK /SEE IF M,NG JMP CGOB /NO PUSHJ CHRD+2 /DELETE M,N CGOA, TAD I CGOQ /NUMBER OF CHARS IN Q-REG PUSHJ UPPN /MOVE TEXT BUFFER UP QSUM /COMPUTE Q-REG POSI) 0N@mx8CL0 y=BXK?@#`FpS~ qM.q`XokZ m*iMO<`*Js:0l=n5L30;?@SF`=B+{,`n2MOfA`WCSouSn=BM;{`TX+Sh=PqT.,aaaM{q#`=?l@j0`@b{`r+x0+lnLq1K3<@-1$ =l,{ A F3P,X,:(;`h)2ShXhz()2 *iS+MqM!M+t`WpOM*qMMyp'`GSO()&2M_`R_1;`*-":,!kaM.B vY0 =B:,B!K:,!kB:,B!;MTt %G:,G!K:,lbHS"E6k,X@3`*(-  CGSA E@'1 =l,{ RA#`FP,X,:(;`()RSh}WTh(#)q+j(%)M/j`  M82U`n.2`EW# :CS aA8q)=Mr` T4z18q oqmMt STCLT "TR`Qn!H{@M? `4TT@?CHCL0T !TR`n!{H#z8ww;A@8q;)M_()RMMMpAggT gAR fb fTTTTTTKe=T@TTTTT` Hf@3L ?;eq35&3r1#$9333333eSSd2 &O) 0TPmx8CL0 y13 ln\u4K1M?g`  D M'G4MN2`A5EgMDr` O HA y\pX` aI Q1ITN O?@3( `LMNTHO.3 `SC`S` L`U`TDNQX`S5`@c`OPT5R8`I0 M  4C ITO".M?`  TH#z8qo>qM_ 3`D@?8#z8qo>qM_ 4C ITO".M?`1ntLMM`@S`OPT5) 0[mx8CL0 yqM_{Mq` SRRM W`4O`eX`` CF8A 8W?3@=1`HRQ`VRO 8`ACN N8U ;WUNG OReM]q`3L 1C `%O`eNWR(ETTO# Q@1 `GClC SS`NWRA`IE 8PN ORXT`SL.Mq `*(U8N `6 N@ p\RSRRO?@33 `* US RX SS N`1HLR8O.1MSq `*(`4VN TTR NS A1HRO 3D`0HSR?;@w1`*(U8HOC QHNQUTPL5TO R1A EN2p?[@z1M `(*oi FT2(oHi`Jn,LnlNn?L@$2 bO`QTV`NUH1ATn,H@: XSHCL0T !TR`.,{@C=( M^rZ`=uNShr0~;`D=p, SNr0SNsShq0|;`D}{-`}D@Cd!`=A?@Cx!`FFUs(i\FU#(4\{ !qo10<@c! ;`}C; pTN!a S EVR!, TR@,QM1r`}{2 pT!hl (R ,Q;`=+D{`"2p-Py:2I>(Q r3+MCr`= AZr{: bX* $GE*!(M^r`};4 pT!hPLTPO #S(!b8`QIN@C|#!`}C{ pTN" RS"aI(-ZrJ5T>"ER TTDM(1 n?@C21`}C{ pTN! E" S#U3WV@4<1`}C{ ApTN!l HLA`NB"K@O 1 ;`}F 8*(Ciq*{ U N S ?@g3`}{6 pTh"8SR8RR{;`} @y3 .{\` _I(in,\n?N@3(`*Ss:93;6D>46 T!hUYY OT4?@!-1 pThYq;!G>33 M*s2 .{]`n@C3<1 n{h48 MBsF`}k{`D}mDj{d`}@?@C\P1`bXLI(in,\n{N`}DQI>(kinL@SkZ1`}@k{` DmjF{`D}? @w3 %bHLA`EEMt ` SOI(hinM,nN{`BS+t2+47;D4h6G>41 Mt`$}mD{`D} @74` b`AS8RS 3`O`eIHT@F4#` b N IUE Md(B`*w2+I(hm).5]I(h r+mm$i.M5D^46 G4h3M?m-B .{`Q.\@42 !{`T}{0 pTh 8Cn!HMt< !{ Q.?M@$4A`"q+*-DinM{ A{`T};4 p h"8O n!G4h3M?*FB .?@CFPB ; XU8V`8NB F SPE !a!ShpMPZB qo4p=@cd B`}Dm AZr{: ;`}F{`=*!@czB ;`}A;`BT"(o@)CKru:3S>SCM?R`}DmkA; !;`d} !Z(0,S*o/$p+LiSNFT($o0L@#7(R`}D 1*,$(i:{`"C+r0+{`D=-{CM=u<`!.5LMJu 5a R 1: 8?@[ S ; XTXU8V`N3;?@y5 5S`; ; U `3 TRO 1 T$Nn!!RM u `D} 5ZB hAN) iq*Mu EVLT5O!#a!aG99 M?u Ea: p"KO`e%E 4MT3D`4M`!I 3TRA   O 4!!8MCuZD@0 `TqoFT"( AG:qo* G1),{ %h{?$@?4 `4?3:EPW>MMMRu`.,{H#z8yw;R@ S CTON8U ;WUNG`OReM/u`3L 1C `%O`eNWR(ETTO# Q@Q5 `GClC SS`NWRA`IE 8PN ORXT`SL.Mju `*(U8N `6 N@ p\RSRRO?@3 P`* US RX SS N`1HL) 0U0mx8CL0 yWTH qR~M|p`2-! -( mlAiJ,. @C!`r@Am|qG24 Mpq`sFOQ(EqJkrD),Sh}AZorD@#{ `z"HlqM_c0 XSHCL0T !TR`.;@4` NT(S UR1L N3 ?[@0 `4ARM?MSu PR8L #N8 5?.<,{ 1@3(M(0`   C) 0{$ mx8CL0 y"O2T"%+llB ShNT9 T H"%;,lP!!G1h3M?Q `*qi<13 { U R1 EK`M8R8(N5lH$R`Ya!HG1h3M?K `  A1`P9RAMI 8NUGS`O DH ypM    ?@u2` GT"LUPBE3RD NS          Mu ` T4z18q oqM             MJr` I 5`O/2YA1,H"(DTA 8        Mx `A3R I SP```FcEn (         MrM8MM 1A              Mur`                  Mr`                  ?@ 8 1ALL; C?3D [-3 ) 0=mx8CL0 y31 MMt `"D+i*nu\52;MQt?$@a4`"*m(!)uj2l=nl\n5\Mqt`$h)Dz{`$}{,`}Bk,@u4?$@|4`$};,?@C C =l{@`}FT*iM/C?@C# C =l;B`}FT10-{`$}aTZi*M't?4@54 A=ll{`}aTZi*M9t?D@0 T@4 `4#NM?M s`N.MOR2D`.@CbhiS/{`4I J}I$Mq2`IvOSm3ISN}q;D3hShhiN{r ?@.1<`ISOhi"Sh}3qD.3D6MAF`O vS{mI4Sh}5 {* { ?@X1P`ISOhi"Sh}O4 {*`CNhsiS. IqM?\Z?@Cd_ { ;?@Cj ` CNM`S&hJmi,N*iE',nL{`D N?m{,`n?@Cb1?@C `}@?@C( }l*C;`D}kS J@#,2`-*i51T>!L b{@C7 `AhOtqj:+3MBq`4 hIqKj+# M?M`SDi"Sht@U1(`4SJip?Mcq2`2V#iR67;D2h{?D@2F 5e, Sls lS8l (laM{ aXaRMr`2KqkkST j*3L6I>(K qk-S Jj),36KT"h@4<+` *sk=S JNj*)2Hn{M`-*ku,Sh$+)#2`*37KT"h@TF+` *uk=S JNN*j),2n ;`b-k"uSZh+B+)32r*nwMT"h@\M+`}Bp;L?@CP X?@+`n8 K_D",@]Z`*Bhm NA)l:n{\ ; aXN`b!{8@Cb @t  =l;C {X },pMD2hnL@?2` SRRMRS(T "`QEUH `2BCn3M^r`O`eR`I 5`AEUHT " TU`4IF C`DNM?} `N`Fn 8`QB2T `EE 8(SS ?@3`NT $EU NC ` E ;IU C NS P@=3 `4RS` A`65 @  TF8A R1 8 $ \3 `GC`CS(O 1 N`B3R C`DN A NM_} 0`IRQ A3L(O`e S HRQ`Vi U@AS P@3 `O1 8 IU 8`3X I T`$O5`RC`U` OFlM_ @`CN`!N8W8U8E5 E`MVS1  TCgHETTO.#MPsF`VS DT_4" Vl1@NP`*BhOp;O5i`J18;{ Q3MOt 2`TD[Sz " l8WR1 ,hOMO`bND+Sz " l(WR1 ,hI!KD6hM)t`*(TXS` S((S` 1( 5)H %O`eAS`O5MIt`* ( 1C H`E`I EN(8`NCP`H%R`O`eO5@j4`*(TXWR1 ``QEU 1J 1`!M8 H UV@@`* EU SBWR(`NCG`*O`eO5@)4`SRRMSMSQ`HA S N0 ST8K R .M rM(`  TH#z8ww;@C`  `2CM C`ArNILh?T0`  TH#z8ww; H TN`!A0 NS nlnL7Mo8=CL0T !TRISS JMS DISMISS /KICK MONITOR OUT ON ERROR ERR TX=. /TEMPORARY DISMISS, 0 /KICK USR OUT OF CORE (SOMETIMES) IOF NOP CIF 10 JMS I USR 11 TAD X7700 /RESET MONITOR POINTER DI)J0*G@mx8CL0 yp ``O`eAS5" ?@3q`b`CdLN`TR ,hS!k@x 4@C(`*-5M"`(Ds}Jw?M@w1`$(6M}1,@S  1X&2 RET:!XMq`3*mh&)`J.,L.vL22;M$q 2&3 R1ET@:!M4`*1m*hil`.,l.L52K3M?T 1X&3 RET:!XMvp `2*mh&i`J.tL21;,.LtMO Xb{" 8 qb{1l* = ,h)"K sbo3:l(@h1$@<1 !pFNq3S> }h&iY @CP`*- 3k*s}JwL@m0`"-! i5(3S>1 }1,{ Q}, 5S^ }w,?@S 2 ` WR1 MT"( ,3bP D I3 ,XL![ EC"8 ,3@n#`}Cm{<`*m*v)L61 60;,.]@CT#`}C7M_~  }l{C`N@FUs((Ti{ `(Diq0M_`hFirO0MO&<`hFipOSh2}*;`DhilpM @6! `V`O`eN$ U`QA UN`4Ee" ?@3H$ `*-0MT0`  S(RAML #RP N `em 1E3O# Q1A UN8 `0C?@C`QA UN8 #SE FUTO S2 ,ME IE 8R1DM3q ``QGC`CN L`OV`UDF`&T`$N$ QQA UN ;P`N'gMVq `N O`eI STRTHR F8(UT@O #IC`T `NM/~ `O Dn F(U8S#` UDF`&`QQA NS 5`G4`I5 M?# `SUECT 8MM,UTO U3TH` D Ui$ T`FCM\s` Z%nM/D rA"h%URDUTO,8NMS`*-k!S1*8r>30>k!S0*5r<1) pMYr`$}AS *;{`"B h*DisK0uj3R>M{r`$}{,?@Cm & wq.{,AT2Z)^@w2`dwFOU(5iRNMp $@`2 `T=?E@;3`*(DU`FC`SBA 3AT HT``Q3X?@)0Mt`(o(iFKT($oi `n,11K2<@&3` (ndM,qMy0`  TH#z8qo>qM_0`*  LP 8`E`I EN8`CHCR $I S`E.Q(REiMO-0`* NL3 ``QID NSUH1 HL 0TTD :GS@3`*(3 EC 8`E`TPT "HCR $I S`E.Q(REiMOd`OR 15SnS H5N`! E`dF(U8N  XT5 M;p` *** %T$ 6-0]2HDC`$TNL QIT **?*@I3 U` 5%G RTRSQ 8SHCL0  !TR`.;@@3 `4C?C`3 RXG5 !TRS STCLT "TR`Q.;HMO**M/?#N(WR1mFCTN1TTO"8@4Z %4)j0;B mx8CL0 yM/r2`i 31 I(hx-\C`jn{L`xDF qh,L,CFk!S1*12<,CF@# !`*i25I>(p 0XKi25S>=S0+l) F !hlL7k0j@M2<`$},@1`xFOU(5iTN"`NTRz,HM!A`xDFUs(i\T!h 5"k?@SX`xDFUs(i\T!haQMaq`1FT($ G5/,Soj G1),{`$FX(1h1piJMrq<`1FT($ G5/,oj G1),{`$FX(1h1piJMhr `$xFO h,Fu;kSi,F !hlLujk0SjiMOkB`xDF qh,LXjjqEm0iFZ hlFXj$q[kiMp bN TQA NS `NbRS8 "aM3. @C `e.3\"2XU8R1D(UT@O#,qI(hqp Eid12 13;@cS `  RP UUN1MqM_i `  * * *TR C -e02\CB`ENBLQI A***?@#` 0` UDF`&`QQA NSRML S0UECFI(C) kP`Md@ XU8`3 RXG5 !TRS STCLT "TR`Q.,H{@M? `4RP?#`3 RXG5 !TRS STCLT "TR`Q.,H{M?zR A  TC MT( `CNA?4?SfT2\ ]JNN[) 0zmx8CL0 yqM_n`  * * *TR C -e02\CB`ENBLQI A***?@#qMq` SRRME``@IIC R0H``@$NG3D?@91`PRBG4HU3 8(DPED`4`QC UTO #F?8@^1``SCLMU`OC ST $PCA UC T#,$ N(C,XM/ `X `SE (FRNEE8 . O`AP E4 U@  ` RN  TB`HEL`!NQ DG4`O04.M?= `* EHF!C`S8 S0n( E9) Mbq `*(ISECE# ``QAN1TD%`FI8 `0 E1A?@3 `* M` RNE ``Q`FC8M TAD` @S(LAE.A( 1X@#3 `* 8TEN `E`NL`E `QNT"A #E`FC&? @[2`*(RO  `SS((N`1OP5C8 ihN3`OP3XCc )? @z2`*(`AOF IN S(R(SSS`N0``D6hMPq `4}Sq&30@sF($`}@Sq2ku2K0{G n@CV2$`}@Sq3k01K0{W n@Cc<$`}@Sq2ku2[pG@s2F`D}Sq&30<1p>{ qnl@2K`D}Sq&2u=25<@sP`}@Sq3k02Kp{G n@C C`EE?p0Lim*C+1i*t2+l.];`S`%zkM3r %{`=?<@T2`$=+3{`BB hA)q;1iZ43;;`D}QTZ i*I(h-p8!  = <*$6$,#$$- , ;= / :4$'9* 9'8'9$$47> $4 .= 7 6999$:6> *+,>(*+/5'8#$$*$ 4$/ >(*$$#$4* >() 0Omx8CL0 y(min\u3[5{=`=D;`An\@!2 `$} 6Z$(k:iSNFT($*QN) q*@72`$}{@`=E; n;M (hi5t1+42;41;MRr`$} 3Z$(m:iIN(-C*i.-;`BC*qt:2M?n"`=A 3*(Cmi,I(h-ZDi*.5\I(h+-i.M5MO2`*BhiF Bh)t3l=.,\.u\Ms#`$}k@{`=+P; n;M (hi5qt:44;2M?!(2`2*Xt:7=@F3-`"6h+kkit 5{=`*CC*qt:5{=`6*h+0+)t5+{`RD*Dq+t5+@S^22`}Dkk{`=+P+; n;`R*i.-u4[7M?}72`6*hm0it 1I>(mmi .{\`6*h-0)t1I>(--i.\@3<`$}m@{`=-P; n;M`*m*i.M54[1M?A2`hCiq_G4h7=@33F`$}k@k{`=E++; n;M`hCiq_MFsK`$}k@{`=+P; n;M}*@CQP2`hCq+j+-)qMUsU?$@g3 `$=;L`=B; Es0; A.{L @z3 `$=+D{`B7H+qn,{`B2-,)pL1M? B`q@FUs(i\T!ha{ qq{T!hMt %U#8MB`q@Frhj@@4`"-"p)Lnt\I(hp-l uj1;=`*-p,)nMtIN(p-JFu1+?@SEB ?@R4`"*in-lnM65K3M?_B ;`hC)m_;`Anq\Mwt`"*in-qSN }q+ShHqzD9hG5h1<@4 `4=ZT($Jqk0mJi6JFT"(J-0,)qK0J@-4`4= a(Z-i\v{:`Fh-u*)m10,rp-Sh}*p+Lu?L@I4 1so01K09K0SNF h,F10}sk;`DCYomp ShF qh,LkiF U(5uiNT"hY r`?%bM#f?@C)(f`FXmp3SN}CukShF qh,LkiT"IS?H@-6-?d@W62`d=;T .;`DXom2Sh}Cq;<`=FS0+lCk!T1Zy{Z ?XSh _?x@[6MM`A GSMMSTCLT "TR`Qn;HCTE55K|tHa&-  39>6/6v "> - 9 >* <*9 &>* %*9 '>* $*9 #>- ;- 7  3;98= 1> 1.1%.>4v?664pm SK @ sp *?@`@?`tP + `00U=0D$_>U&U|{d!.Lu@][IT*d ]E{Fv1]BgdCtzu!yq?@A]BC]DE]FG]HI]JK]QB$";&SB#K@f4H4C Fn(b@#z 3b 9z &" Gh  '"%%`11x|OKR!<.K 31%`K "F>&@Ei>1EBi?6G04A bD b"G? ~&D!lU"srtnyOpqr rb ub l < tgn)oj2fX 2%|/$v&%fu0sE0s{{4< (zq& % !P)KM3"$"P$4r@JaM'Kl?@ `H(h#{V"DBS sJ> z ^^Y6IA.Wo:A.V9(/Y &YX9 DYz98"`NyNY!9!.:K{Piltj6uk6wY6Y@_{NHo"4tk90ay'u'5P zk3 /T4"bF &  cG c"b`"bNy( c( zyb`ybzQ)@b'n((&'D.)(b"f@'b))&(b (&@)b &(bFnGG&4@ J nfbInGa I!Kk@K{wg5L ?JKu0L$$"`Ny$r&$"csGbb b c gJK|?rs?MLY]fs]@%b(+{0H/+*; X%`0Kkf3_i9"(K{@b(Vz9(/WI"AWiov"chYiab Wz9ZJOKY9@Fb(Nz(n%KkEJcF Vz9\JK0"H.f:COd="bHovQ"fc+:vf2;f&vm?1\K9r(K{:A.W(zX o!oIbVpYX bbH/N9K+H'J nIIb=I ksJ>PnsK{1(Gb'"b"f(/=@.1.('d5""0kw(NyD0`./NO3Kk 77B!abHNy 7'V>1T.fKkKP,J)nJ){g{ su0 oto0%H`yv0\j{q;(/KX>9Ib i 9t K+I/G9An:V)b+-(/'."(z98"@$z+X)9JN,+b))e9!.:K{ob(K{!{cK`/kIAWio9Yi bFH/>?" J)9?JK8?!xhKo(/Wu"Jovbpb {c H?g(/K4]k)K)6hKuJ))hJK0pr_dVH p|rKkr(/w)K(3=2e$ /2"d2%=02%'$(/%$";& ~$l%3D % ~$k'D /5E#d=2Db Df2,&E3E-J'b;'&-*E ~D>kr(WrBt#!vc(XzFFD(oFF4F1?iFFdF0 iifz U)u]dvcv rFn bv Fnvf ]{;C~iAUvJc NysJ> zNKvo4 vsSJoN9Kg1S v6r / CKi 2zB(#?"++bA(/c";fdvv7ChCJ bJ n(f/{h9Qzgji$%&KS9K:h Nr ^za-"(Tygj`"r T{+a&Tv6I &9&(/K:4vv";v&v:c G9OK94qK+hg) j$U%U&U&0)11C) /"1r{*2`ky1-2($z1+81J+((K{oU_8p bA(/+h9N{r(/>g)j  e+ R)+?s:(Od)Mj(utXBe8Jj(tux!>u`>y?[e(Bd9cy3`zcc{yB[o@Tes9(js2Tj8tvss{st?] j|+] }$"` z%H/8_)%2@z`"'fX#f$!.#bX#f'.'d%"#%&' &"b({]z; %"&_"(4z;<;z`\<6,]q]t%?&4Ii\G%B(y{@Sz?(/|?2(uz]w{ w%" w{\w%?&}]w\)w{)<]yw%"(x{\tzq]te_)K 7wO($r!n(&r Dz$&f%3k$&$]i}o))]z\)}r))pz])}t)]zn2o/nzo,n}r5]z$&aozn)83*_/p y|R;]@f U_"@ ~W/"!\g0(/ \c@S{FtjYP)FrJf^cP_@T{!Ui0(/d.hlhzl >>0b ofh(>Oo$l#!0b`>x.b 6zdE'`/Vdh+\(dn>'bH!~&%f@^i&h(](&%>$*h(-(/bd8d b !o%b(&b)`imf`mmf"aimbm`im._XJ _fhoA>+ve0/oLR~d d{d0h _/b ofoO6d(*t hhc0$p I ~@l*$f&`%EfR *EDHO]}\L^J} *I!ZMMD zE@dC @+bF(/R0 #F.#D.M(*#@$!!nEa.Hq~ EfGb@Ed@+O =],m ;HyR; @ P#g+r(/]s" ^z@gh+f"@KbMoRRKFpb* pz+q"(hzg`?U~ y" ttt0_ h?m $9I +]ULm $9&)&"&6$a.'$&'%b"(b%"b(l &''%'#*;(KRV;C dN#(b@2zB#)D.)(b(f!%b@?zA#'b(]%_i!@/\@.&On%&b&f$N%M*%^kbe;M$F(&v%_i&a.&o Lj- tc Cb{zb G{uJmKs>2s{{m |9$$&e"f%(/$#h()&#"&eb%%b@o!&#D{9 >$$&"/@}'&) /,!&#)2)f6z@"b&"&%be.e"b"f!f'+J#)6"/G@.&.")bdAa.&nQD;m R 9!$b$(ba(fe&!~bIjR& %("{~"&u%"%f%("%v&b&f"mJe]<(t?sm|m W9(B(z%(/$"a'b`z!h:'$oh~:8  (bn(.()b)f"f'N J0!D.!&b&f%.%/k  %bn%.%&b&f!f$N =J:@>}0mOWfO&, DA0lo &a.&n%a.%]k)a)f(ba(ff0@"b!!&)b&&&(b%%&oa;H""'6H"n(Hh")60%(/&(/!(/aZ.% /&" H\*!k/@m!'$)b&(b%!d!Km .!6$!'=%!=x&!'.L.0!=K=v GBEEl= <"HH2A!.%@n(%"Xz% n!! @%b[b;p$b$ i$&C(MA30k$g;NN_KNsJ>hyKk9K*8 @BxDk+RtvfyH*,Q@.?,++bR+&"(z+("(,z'(/F+"eg)>jkrp<}*? v!>t(?;"Ris7zkP&+e)tv7f4~ 4J. <`U07g"HNy7 6 7b7 b[U>[|[xMK{u$u%u&KI4sHovvKBMD"" K{`.B/ <""`&bz%*`.'/$""`#bK{;&K0w4 #s;0Fn`1t 1t1@0N>PP]8 File UTILity program WORD-TYPE COMMANDS: the highest octal digit of the 5-digit address), so a maximum of 4096 words can be specified by each group. As with the 'DUMP' command, the output from the 'LIST' command is sent to the 'LDEV'. For more information see the last paragraph of the 'DUMP' command, the 'SET' command and the miscellaneous information section. MODIFY ------ The 'MODIFY' command allows a string of locations on the device to be changed in the easiest way. This is done by specifying the format of the input and letting the program do the work of storing the data properly. This command has the following forms: MODIFY [] MODIFY MO 200.0-17,35-43 M M 32745-32777 MODIFY MO PA 12342-12360 M M AS 367.7261-7275 where the has exactly the same format as for the 'LIST' command and the options are shown below. If the is not specified (as with the first form), the program will pick the one of the formats below which corresponds to the current setting of the 'FORMAT' option. The corresponding formats are shown below. 'MODIFY' format 'FORMAT' setting and 'MODIFY' action. ASCII ASCII--one character of input is stored in A each word to be modified. PACKED PACKED--two characters of input are packed as P trimmed 6-bit characters, padded with trailing 00's. Control characters (those with codes less than 240 octal) are packed as a 6-bit 77 (flag) and the low-order 6-bits of the character. Note that this means that "@" is packed as a terminator (00) and that "?" is not unique. OS OS--three characters of input are packed into two words to be modified. When using this format, the start address must be even and the end address must be odd!!! March 1977 Page 21 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: COS COS--a space (240 octal) is subtracted from C each character and then it is packed as 6-bit bytes. Control characters are handled as with 'PACKED' format. NUMERIC SIGNED & UNSIGNED decimal, BCD, OCTAL, BYTE, N PDP, FPP and DIRECTORY formats--the input is a string of numeric items which are stored one per 12 bit word. See the section on numeric items. Note that bcd, byte, directory and "symbolic" are not included, that decimal or octal input are determined by the "CTRL"-"D" and "CTRL"-"K" switches and that signed num- bers must be input enclosed in parentheses. E.G. 17,(-10), ^D200, (-^K312),40, (-^D35*129) For each location or group of locations specified by the , the program will prompt for the input by printing the start location in the same format as described under the output format options above. NOTE of caution The program always modifies exactly the number of words specified by each item in the ! If you input extra characters for the character formats or extra numeric items for the numeric format, they will be ignored. If you input not enough characters or items, the rest of the words to be modified will be set to the 'FILLER' value (see the 'SET' command). The program will not output any message if either of these things take place!! This does, however, make it possible to fill from 1 to 16 blocks on a device with zero or some other value by specifying all the words to be filled in 'NUMERIC' format and then responding to the prompt with a single "(F)" (the value of the 'FILLER') and "RETURN". Input to the program is always terminated by a carriage- return ("RETURN"). It is therefore not possible to insert a carriage-return into a word using this command. All of the editing keys are available for use during input, therefore the "CTRL"-"C", "CTRL"-"R", "CTRL"-"P", "CTRL"-"U" and "RUBOUT" characters cannot be entered using this command either. For all of the character input formats, spaces and tabs in the input string are packed as they are seen. For numeric input, spaces are ignored and the numeric items must be separated by commas. March 1977 Page 22 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: The command can always be aborted by "CTRL"-"P" if you change your mind before the "RETURN" key is pressed. March 1977 Page 23 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: Search limits: -------------- There are two search commands in the program, the 'WORD' search and the 'STRING' search. They both search from a lower to an upper limit. The limits are either the 'LOWER' and 'UPPER' limits set by the 'SET' command (the default) or the limits set up by the "'FROM' " (which overrides the 'LOWER' limit) and/or "'TO' " (which overrides the 'UPPER' limit) clauses which can optionally follow the command word. Leaving out the block parts of either of the two temporary limits will cause the program to use the block part of the corresponding default limit set by the 'SET' command. When in a mapped ('SAVE' or 'LOAD') access mode, searching through nonexistent locations or overlays will never produce a match. Whenever a match is found, the program outputs the location where the match occurred, followed by the word or string that matched. NOTE on searching through overlays It is not possible to search through more than one overlay per search command. To do so would require different and separate handling of the "block" and "address" parts of the limits when in the mapped modes including the resetting of the "address" part. The result is that in the mapped modes the "block" parts are used to set the overlay to be searched (lower limit only) and only the "address" parts are used in the determination of the number of words to be searched. WORD (search) ------------- The 'WORD' search command is used to search for a word or words which, masked by the 'MASK' (which is set by the 'SET' command), will match the search word (also masked). This command has five options and therefore has the forms: WORD [UNEQ] [ABS] [MEM] [FROM ] [TO ] WORD WO 217 W W (S) WORD UNEQUAL W UN 0 WO U WO U (C&377) WORD ABSOLUTE WO AB 7402 W A W A 7000 WORD MEMREF WOR MEM 41 March 1977 Page 24 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: WO M WO M 40 WORD FROM WO FR 213.0 2317 W F W F 1.35 (S) WORD TO W TO 213.345 1111 W T WORD T 6257.377 7777 ... and any combination and order of the above options... where is the bit pattern being searched for, 'UNEQUAL' means that all words which are not equal to under the mask do match, the temporary limits clause is as described above, 'ABSOLUTE' means that the location where the match occurred is to be output as an absolute block number and displacement rather than as a relative location, and 'MEMREF' means that only words whose high-order octal digit is 0 thru 5 (i.e. the PDP-8 memory reference op-codes) are allowed to match, independent of the setting of the 'MASK'. When you want to search for those words which reference a specific location, 'SET' the 'MASK' to 377 (octal) and then use the 'MEMREF' option. This will exclude all operate (op-code 7) and IOT (op-code 6) "instructions" from the output and can make it considerably easier to find the desired information (e.g. you will not output the location of every "CIA", 7041 octal, when you are looking for references to location 41 octal). NOTE on modifier priority 'UNEQUAL' has a higher priority than 'MEMREF', so first each word is tested under the mask for equal/'UNEQUAL' and if the specified condition is true, then the word is tested for the 'MEMREF' condition. STRING (search) --------------- The 'STRING' search command is used to search for a string of numbers (bit patterns) under an optional string mask. This command has four options and therefore has the forms: STRING [MASK] [ABS] [FROM ] [TO ] STRING ST 4557,0,0 STRING MASKED ST MA 4577,0,1203 ST M ST M 5566,0 STRING ABSOLUTE ST AB 'PI,'P@ ST A ST A "A,"B STRING FROM STR FR 100 1,4000,2 STR F ST F 123.4567 (S),(-S) STRING TO STR T 7577 'ER,'RO,'R@ March 1977 Page 25 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: ST F T ST F 1.0 T 7.0 'FO,'TP ... and any combination and order of the above options... where the is simply a string of numeric items separated by commas, 'MASKED' specifies that the search is to be done under the string mask, 'ABSOLUTE' is as for the 'WORD' search, and the temporary limits clause is as described above. When the string mask is used, each item of the is masked by a separate mask word from the string mask. If the string mask is shorter than the search string, it is used in a circular fashion (the first word follows the last) as many times as necessary to mask all of the items of the search string. If the string mask is longer than the search string, the extra words are not used. This feature allows for very complex searches to be done. For example: Suppose it is desired to find all calls to a certain subroutine in a file and also see their arguments. This could be done as follows: FILE FUTIL --look up file to be searched FUTIL.SV 6070-6120^P --you stop typeout SE MODE SAVE --set access mode to mapped SMASK (-1),0,0 --set mask for 2 arguments per call ST M 4547,0,0 --search for 4547 and 2 dummies The output will give the address of the subroutine call (which requires an exact match due to the mask of 7777) and the contents of the two following words (which can be anything, since they are masked by 0). Using the mask specified above, a search could be made for an exact match, 2 "don't care words" and another exact match by simply specifying a search string with 4 arguments. The first item of the string mask will be used to mask both the first and the last items of the search string. This command can be particularly useful when trying to find certain kinds of references in programs for which no CREF listing (or perhaps no listing at all) is available. SMASK ----- The 'SMASK' command is used to set up the string mask. It has the following form: SMASK SM (-1),0,0,7000,0 March 1977 Page 26 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: where the is the same as for the 'STRING' search command above. The current contents of the string mask may be examined by the 'SHOW' command. March 1977 Page 27 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: SET --- The 'SET' command is used to set up various switches and variables within the program. It has many options, each of which is the name of the switch or variable and is always followed by a word or number describing how it is to be set. The command has the following two forms: SET SE OU PDP ERR LONG MODE SAV S S LO 100.0 UP 123.377 LDEV LP where the options are as follows: OUTPUT OCTAL Set the output mode for the single- OUTPUT O character commands. Initialized to O PDP 'OCTAL'. O P OUT FPP O F ERROR SHORT Set the mode for error message output. E S The 'SHOW' 'ERRORS' command will out- E LONG put all error messages and codes for ERROR L 'SHORT' mode. Initialized to 'LONG'. Set to 'SHORT' by chaining with "/E" or with write locked system device. FORMAT Set output format. The formats have been described previously. Initial- ized to 'PACKED' ascii. OFFSET Set the offset to the low 12 bits of . Initialized to 0. FILLER Set the filler to the low 12 bits of . Initialized to 0. LOWER Set the lower search limit. Init1al- ized to 0.200 UPPER Set the upper search limit. Initial- ized to 0.17577 DEVICE Set up the OS/8 device for access. The handler is fetched at this time. Initialized to "SYS" (device 01). Do not include ":" in . is an assigned or per- manent OS/8 mass storage device name. LDEV TTY Set up the device for 'DUMP', 'LIST' March 1977 Page 28 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: LDEV LPT & 'SHOW ERR' commands. Initialized to 'TTY'. 'LDEV LPT' will fetch the "LPT" handler for your system. MODE NORMAL Set up the device access mode. MODE N These have been described MODE SAVE previously. Initialized to 'NORMAL'. MODE S set to 'SAVE' by chaining with "/S", MO LOAD to 'LOAD' by chaining with "/L" MO L and to 'OFFSET' by "/O=oooo". MO OFFSET MO O MASK Set the 'WORD' search mask to the low M 12 bits of . Initialized to 7777. As many options as desired may be specified on one command line, separated by spaces. In the event of an error, none of the options past the point where the error occurred will have been set. If you have any question, use the 'SHOW' command. SHOW ---- The 'SHOW' command is used to output information on the current setting of all of the program switches and variables set by the 'SET' command and other information. The program outputs either words or numbers to best describe the current settings. As with the 'SET' command, as many of the options for this command as desired may be specified on a single command line, separated by spaces. This command has the form: SHOW SH BL CCB LOW UP ODT REL ABS where the are as follows: BLOCK Output in octal the start block number B of the last file specified by the last 'FILE' command. CCB Output the core control block of the last C file specified by the 'FILE' command. If the file is not a 'SAVE' file, an error will occur. The start address of the file is output as a 5-digit octal number, the job status word (JSW) is output in octal, and the core segments are output as 5-digit octal addresses. When LINK files with overlays become available, the overlay information will be output as with March 1977 Page 29 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: the 'HEADER' (next). HEADER Output the header block information for H the last file specified by the last 'FILE' command. If the file is not a 'LOAD' file, an error will occur. The start add- ress is output as a 5-digit octal number, followed by the next free address as a 5- digit octal number, the loader version number in octal and a message if Extended Precision is required. Then, for each level, a line is output with the number of overlays, the 5-digit start address, the relative start block and the length of the overlays for this level. ABSOLUTE Output the absolute location of the last A word accessed on the device in format (a 4 digit octal block number, a "." and a 5-digit octal address). RELATIVE Output the relative location (what you R specified) of the last word accessed on the device in format. ODT Output the relative location of the last word accessed by one of the special-char- acter commands in format. LOWER Output the search lower limit in format. UPPER Output the search upper limit in format. FILLER Output the value of the filler in octal. MASK Output the 'WORD' search mask in octal. M SMASK Output the current contents of the 'STRING' search mask as a string of octal numbers. OFFSET Output the value of the offset in octal. MODE Output the name of the current setting of the device access mode switch ('NORMAL', 'SAVE', 'LOAD' or 'OFFSET'). DEVICE Output the OS/8 device name and number. OUTPUT Output the name of the current single- O character (ODT) command 'OUTPUT' mode (OCTAL, PDP or FPP). March 1977 Page 30 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: FORMAT Output the name of the current format. F VERSION Output the current version number of FUTIL. ERRORS Output a complete list of all error codes E and their corresponding messages. Note: This list is output to the 'LDEV' (list device) so that it can be output using the "LPT" handler for your system. Note that Version number is also output with errors. March 1977 Page 31 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: FILE ---- The 'FILE' command is used to locate files on the OS/8 device and to set up the start block of a file for the mapped access modes, 'SHOW' 'CCB', etc. This command has the forms: FILE FI FUTIL PIP.SV F F FORTRN MICRO.LD where the is a string of one or more OS/8 file names, separated by spaces. The program assumes extensions of ".SV", ".LD" and null (in this order) when looking up the file. This can lead to a substantial amount of time when a large directory is searched three time for a file that does not exist. Specifying an extension will cause only one lookup attempt to be made. A null extension, if desired, may be specified by making the "." the last character of the file name. The program does one (or more) separate lookup(s) for each file name specified and outputs either ssss-eeee oooo (dddd) b.lll mm/dd/yr or ssss-eeee oooo (dddd) b.lll or LOOKUP FAILED where "ssss" is the start block of the file in octal, "eeee" is the last block of the file in octal, "oooo" is the length of the file in octal, "dddd" is the length of the file in decimal, "b.lll" is the block (segment) and location within that block of the first word of the file entry (the first two characters of the name) in the directory, and "mm/dd/yr" is the file date. If the directory does not contain the extra word required for the date or the date word of the file is 0, the second form with no date will be output rather than the first form. The "LOOKUP FAILED" message means either that the file name was not found on the device or that the device is a write-only device. The actual lookup operation is performed by the OS/8 USR, which is swapped as needed (see section on program execution). Since the USR keeps track of the current device once the first 'FILE' command is given, it will have the wrong directory in memory if the medium (tape or disk) is changed on the physical device. This can be solved one of two ways: 1) Use the 'REWIND' command to rewind the device being removed and reset the directory segment in the USR. 2) Do a 'SHOW ERRORS' and abort the output when the message output begins. This will have swapped out the USR. If messages are not available, use 1) or 3). March 1977 Page 32 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: 3) Use EXIT or "CTRL"-"C" to return to OS/8 and then directly restart FUTIL with the 'START' command. This will have swapped out both error messages and USR from memory. Any of these methods should be followed by a 'SET' command to reset the 'DEVICE' (and the rest of the I/O switches in the program). The last file name specified that did not have a LOOKUP FAIL will be the file used in the mapped access modes, 'SHOW' 'CCB', etc. The program is initialized with no known file, so attempting to access any location in a mapped access mode or attempting to 'SHOW' 'CCB' or 'SHOW' 'HEADER' without giving a valid 'FILE' command will cause an error. WRITE ----- The 'WRITE' command is used to force the program to write out the block currently in memory. It has the form: WRITE [] where the optional overrides the default number of the block that was read to specify where the current block is to be written. This obviously dangerous operation does allow a limited amount of copying in a special situation, e.g. allowing a directory to be backed up by moving a copy to the end of the device (see the examples section) or copying a single block from one device to another by changing the 'DEVICE' and then doing a 'WRITE' (with or without an argument). Again, as stated in the section on accessing the device, caution must be used because attempting to write beyond the end of a device may not be checked by the handler. SCAN ---- The 'SCAN' command is used to do a rapid scan for read errors on the current 'DEVICE'. It has the form: SCAN SC 0-6257 where the is of the same form as for the 'DUMP' command. Each block is simply read. If an error occurs, it is reported as: March 1977 Page 33 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: oooo BAD BLOCK where "oooo" is the block number in octal, and the scan continues. This is the only FUTIL command that will continue on a read error. Should the current block have been changed, and any other blocks be included in the scan, an implicit write will be attempted by FUTIL. An error on this implicit write will be reported and then the command will be aborted. This is the only time that this command will attempt a write. The command can then be repeated if it is desired and it will execute (only one implicit write attempt is ever made by FUTIL). NOTE on block number display The OS/8 "actual" block number for the block to be read is stored (for display) in the computer MQ register (if present). The value is stored before checking if the current block needs to be written. It is particularly useful for following the progress of this command. REWIND ------ The 'REWIND' command is used to move a tape back to block 1 and to reset the USR directory segment. It has the form: REWIND and must be terminated by the "RETURN" key. It causes a read of block 1 of the device and resets the directory segment key word in the USR (if in memory). Any subsequent 'FILE' command will cause the directory to be read. EXIT ---- The 'EXIT' command provides a method of return to OS/8 besides "CTRL"-"C". It has the form: EXIT and the rest of the line is ignored. March 1977 Page 34 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: EVAL ---- The 'EVAL' command is used to evaluate a parenthesized expression of signed double-precision integers. It has the forms: EVAL EV S*^D4096+D E E B*400+L where the follows the normal rules for arithmetic expressions. Legal operators, in their order of precedence are: ( evaluate inner expression / signed division * signed multiplication - subtraction + addition & logical product ("and") ! logical sum ("or") ) expression end Besides 24 bit numeric input (which can be octal, decimal or mixed octal and decimal under the control of the "CTRL"-"D" and "CTRL"-"K" switches and ascii and packed ascii using """ and "'"), the following "variables" may be used: C current contents (of location "L"). L current location (15 bit, same value as is output by the 'SHOW' 'RELATIVE' command). B current block number (as for "L"). F contents of 'FILLER'. S contents of the console switch register. R the remainder of the last division or the high product of the last multiplication. 24 bits, the sign may not be correct. D contents of OS/8 Monitor "date" word. Overflow on addition, subtraction and multiplication are ignored, but trying to divide by 0 will cause an error. If no errors occur, the program evaluates the expression and types out the results in the form: "= oooooooo (sddddddd)" March 1977 Page 35 FUTIL - OS/8 File UTILity program WORD-TYPE COMMANDS: where "oooooooo" is the double precision result in octal and "sddddddd" is the signed double precision result in decimal (the sign is either "-" or " "). March 1977 Page 36 FUTIL - OS/8 File UTILity program ADDITIONAL EXAMPLES: These examples are to help provide an overview of the use of the program and to stimulate the thoughts of the user. They are not as well commented as the two examples on pages 1 and 2 because the desire is to show concepts of what can be done with the program rather than the mechanics of the operations. Should questions arise on the mechanics, it is suggested that those two examples and the discussions of the commands in question be reviewed. 1) While doing a "/S" transfer with PIP, it gives a read error in your file "SOURCE.PA". Attempting to read it with EDIT causes it to type "?0^C" and return to the Monitor. Find out what is wrong as follows: .R FUTIL FI SOURCE.PA --look up the file SOURCE.PA 0243-0351 0107 (0071) 2.005 08/30/72 SE MASK 0 LO 243.0 UP 351.377 --set up mask & limits W UNE 0 --search the file ?ee AT 08 FATAL READ ERROR --here is the problem [Note: "ee" may change with version, so is left out.] SH ABS --find out where it is ABS. LOC = 0271.00000 WR --attempt to clear error DU OS (B+L/400) --it worked, now dump it 0271.00000: ....^P --change your mind MOD NU 271.0-377 --zero the block to be sure 0271.00000: 0 -- of its state W UN FR 272.0 0 --check the rest of the file ^C --ok, now go fix the source This sequence can also be carried out using the SCAN command as follows: .FUT SOURCE.PA --use CCL to call & lookup SOURCE.PA 0243-0351 0107 (0071) 2.005 08/30/72 SCAN 243-351 --scan the area 0271 BAD BLOCK --here is the problem! 271.0/ ?ee AT 07 FATAL READ ERROR --get block with trouble March 1977 Page 37 FUTIL - OS/8 File UTILity program ADDITIONAL EXAMPLES: WR --attempt to clear error DU OS (B+L/400) --it worked, now dump it 0271.00000: ....^P --change your mind MOD NU 271.0-377 --zero the block to be sure 0271.00000: 0 -- of its state WR --write out the block ^C --ok, now go fix the source If the error had been of some type other than a clearable error, the 'WR' command might also have failed. It might not be possible to fix the "SOURCE" file in this case. In either case, the data in the failing block may not be correct and may have to be corrected with the editor. NOTE on access The second 'WORD' search command will cause the block which has just been zeroed by the 'MODIFY' command to be written out. See the section on accessing the device for more information. 2) After using build to change your system, find out the device number for "DTA1": .R FUTIL SE DEV DTA1 --fetch the device handler SHOW DE DEVICE = DTA1 (06) --number is decimal 3) By accident you zero a DECtape directory which contains the only copy of a file you need. You have the PIP "/E" listing of the directory but only want to re-build it enough to get the wanted file. The name of the file is "LOST.FI": .R FUTIL SE DEV DTA1 --it was here EV ^D5+14+11+10+16+13+8+5 --lengths of all preceding = 00000122 ( 0000082) -- files EV ^D730-^K61-^D82-25 --rest of DECtape room = 00001076 ( 0000574) March 1977 Page 38 FUTIL - OS/8 File UTILity program ADDITIONAL EXAMPLES: 1.0/ 7777 (-3) --now 3 files 4/ 7777 --1 extra word per entry 0001.00005\ 0000 'DU --set up a "DUMMY" file 0001.00006\ 7556 'MM -- over the old 0001.00007\ 1752 'Y@ 0001.00010\ 3451 0 --a null extension 0001.00011\ 6234 (D) --put in today's date 0001.00012\ 4235 (-^D82) --length 0001.00013\ 5761 'LO --the desired file 0001.00014\ 3341 'ST 0001.00015\ 2371 0 0001.00016\ 1107 'FI --the extension 0001.00017\ 1366 (D) 0001.00020\ 3015 (-^D25) --its length 0001.00021\ 3415 0 --an to end it 0001.00022\ 2713 (-^D574) --the rest of the tape WRITE --now write it out ^C -- & exit to use it The "LINE-FEED" key was used to advance through the words. The above example is exactly the same as hand calculating the required length of the "DUMMY" file and then doing the following sequence using PIP: .R PIP *DTA1:DUMMY flag. Therefore the next access to the block causes the block to be re-read without attempting to write it out. Following the second error, as much as possible of the block will have been read into memory and can now be examined for non-zero values (assuming that the data itself was not all zeros!). If the read terminated before the end of the block, there should be an obvious separation between the zero and non-zero values. 9) Your system has a line printer which can output 132 characters per line and 68 lines per page and you would like to change PAL8 and CREF to make use of this to use less paper. Allowing two lines at the bottom of the page, the lines per page should be set to 66 (call this "nl"). Three changes need to be made to PAL8 to change the global number of lines per page (nl), the number of items per column of the symbol table (-nl+1) and the number of symbols per page (3*[nl-1]). One change needs to be made to CREF to change the number of lines per page (nl) and three changes need to be made to change the number of items per line of cross references. Since CREF uses 10 characters for the symbol name and 6 characters per line number, 19 references can comfortably fit on one line (19*6+10 = 124). The following changes to these two processors will increase the number of lines per page and the number of items per line in the cross-reference outputs and then update the dates of the two processors in the directory: .FUT PAL8/S -- * * SEE NOTE BELOW * * PAL8.SV 0200-0217 0020 (0016) 1.057 04/03/76 1104/ 0070 ^D66 --global lines per page 1256/ 7711 (-^D65) --symbol table column size 1273/ 0245 (3*^D65) --symbols per page FILE CREF -- * * SEE NOTE BELOW * * CREF.SV 0220-0234 0015 (0013) 1.065 01/18/74 2564/ 7704 (-^D66) --lines per page as above March 1977 Page 42 FUTIL - OS/8 File UTILity program ADDITIONAL EXAMPLES: 2017/ 1102 1366> TAD 2166 --change instructions here 2132/ 1102 1366> TAD 2166 -- and here to get new 2166/ 0077 (-^D19) -- references per line SET MODE NORM --reset access mode 1.(57+4)/ 2036 (D) --change dates of PAL8 (65+4)/ 624 (D) -- and CREF. WRITE --output the last changes Location 2166 was not used previous to this patch. Note that the first reference to the word in CREF will cause the last block that was modified in PAL8 to be written out. Similarly, the first reference to the directory will cause the last block that was modified in CREF to be written out. NOTE on versions of PAL8 and CREF These patches were empirically determined and applied to PAL8 V9H and CREF V3C. They have been applied to some other versions of both processors and may be correct for all versions of PAL8 V9 and CREF V3. USE THESE WITH CAUTION! These patches were determined by Dennis McGhie for use with his program called VLIST, which uses PLOT mode on a Versatec printer/plotter to output optionally higher density characters and to implement lower case characters for printers without that option. This example is provided partly to document these changes for others who might find them useful. Dennis was not able to decode the code used in the PAL8 symbol table output routine well enough to be able to allow for more columns in the symbol table output. I would be glad to update this example to include this information if is possible. March 1977 Page 43 FUTIL - OS/8 File UTILity program MISCELLANEOUS INFORMATION: Assembling, loading & CREFing the program: ------------------------------------------ Five files are provided with the release of FUTIL, the core image, source, writeup and help files of FUTIL and the source file for the patches to CCL to add the FUTIL command. This last source file (named FUTCCL.PA) contains the documentation for its implementation. Remember that after patching CCL.SV the command "R CCL" must be given to update the Monitor command tables with the new command. Assemble and load the program as follows: .R PAL8 *FUTIL,FUTIL] where only the first character is required (but any others specified must be correct), the optional device defaults to DSK if a file name is included but otherwise is SYS, the optional file name will cause a 'FILE' command to be performed as the last setup operation (in which case the extension will default to all three normal defaults), the optional "/E" sets the 'ERROR' mode to 'SHORT' (to remove the need to swap the USR) and the optional specification can be one of the following-- March 1977 Page 44 FUTIL - OS/8 File UTILity program MISCELLANEOUS INFORMATION: /L Set the mode to 'LOAD' and set the default extension to use only ".LD". /O=oooo Set the mode to 'OFFSET' and set the 'OFFSET' to "oooo". /S Set the mode to 'SAVE' and set the default extension to use only ".SV". The error messages are swapped with the USR, but not in the normal manner, allowing write locked startup with the loss of the message text. When the program starts execution, it writes the messages onto the system device in the same area used by the USR in swapping. Once this has been done, the USR or error messages need only be read into memory, as needed. In the case where it is not possible to write on the system device, i.e. it is write locked, the messages are discarded, 'SHORT' mode is set permanently and execution continues without a hitch. Similarly, should an error occur when reading the messages, 'SHORT' mode is set permanently and an error is given to warn that this has happened (with no message, of course!). The program uses almost all of the available memory in an 8K PDP-8. It is allocated as follows: 00000-06240 program proper 06240-06577 buffer for arguments 06400-06577 -- once only code for chaining -- 06600-07177 LPT: handler area, 2 pages 07277-07577 device handler area, 2 pages 10000-11777 usr area & error messages (swapped) 12000-12177 ccb/header input and test 12200-15240 text strings, lists 15240-16177+ string mask, command buffers, p.d.l. 16400-16777 LPT: buffer, 2 pages 17000-17177 CCB buffer, 1 page 17200-17577 I/O buffer, 2 pages The buffer for arguments in field 0 is defined long enough to store 45 numeric string items. The string mask buffer, in field 1, is 66 words long, and the command buffer, also in field 1, is 140 characters long. These lengths were chosen in anticipation of input from console devices with up to 132 characters per line. No checking of any kind is done to protect against overflow of any of these buffers under the assumption that these buffers are large enough for any reasonable input to this program, however, the arrangement of the buffers is set up in such a way that the most valuable data is the farthest distance from a variable buffer. The push-down-list (p.d.l.) buffer uses the area in field 1 from the end of the command buffer (approximately location 15540) to the beginning of the LPT: buffer (location 16400). This should March 1977 Page 45 FUTIL - OS/8 File UTILity program MISCELLANEOUS INFORMATION: provide ample room for any expression able to fit on one line. Again, no checking to prevent overflow is done. List device output: ------------------- The list device output for the 'DUMP', 'LIST' and 'SHOW' 'ERRORS' commands has been implemented for the single purpose of speeding up the output from these commands for immediate viewing. As a result, a very simplified approach has been taken which was not designed for general file-type output. As a result of this approach, the output buffer is dumped to the line-printer handler at the end of every line of output. The characters in the buffer are stored one per word and the buffer is padded with 0's before the handler is called (so the handler should ignore nulls!). The block number in the handler call is set to 7777 (octal) and is never changed, for the specific purpose of disallowing output to a mass storage device through a Monitor "ASSIGN" command. [Note: since 0 is not a legal device length, no device can have more than 4095 blocks and there is no block 7777 under OS/8! However BE WARNED (!!!!!!!) that most handlers have no bad block number protection built in!] Implementation notes: --------------------- This program, in its current state, reflects about 10 years of on and off development. Although a few of the commands have changed and many new features have been added (requiring at least 2 global re-structurings), the general philosophy remains the same--a command driven debugging tool with two major command types and as many features to aid debugging as could be crammed into the available space. FUTIL is largely a table driven processor, using the "sort-and-branch" table idea to perform one- and two-character table lookups. Since compute speed is generally not important, this method is used even when simply checking characters for validity because it reduces the amount of code in field 0 (at the expense of space in field 1, which is not full). Some of the execution routines make use of the "sort-and-branch" routine pointers to index into a third table of some sort. This, for example, allows a single small routine of about 25 words to handle all 13 of the special characters (ODT commands) which replace the current contents of the open location with an optional new value and then output the current contents in a specified format. The program proper is in field 0 with some space for handlers and a single temporary buffer. All of the lists for the March 1977 Page 46 FUTIL - OS/8 File UTILity program MISCELLANEOUS INFORMATION: "sort-and-branch" routine, text for output, instruction mnemonics and error messages are in field 1 with a small amount of code. The major buffers are also in field 1. The command input routine collects characters from the console device through a subroutine which handles case conversion, rubouts, line re-echo and line erase. They are then checked for the set of terminator characters (all of the ODT-like command characters fall into this class) and if not terminators, they are stored directly into the line buffer. Due the fact that most of these terminator characters may also be arithmetic operators, depending of their context (inside or outside of parentheses, on a line that does or does not begin with a "word"), the context of each candidate terminator must be checked by doing a scan of the line buffer to determine if the first character in the buffer is alphabetic (a "word") and, if not, whether the character is inside of a parenthesized expression or is a quoted character. If any of these conditions are true, the character is not a terminator so it is also put into the line buffer and input continues. If none are true, the line buffer is terminated with a carriage return (removing all of the special case checking that would be needed later) and the terminator character is acted upon (because it is really a command character). The program is designed in a fairly modular fashion, with a hierarchy of actions. At the top level is the command input routine (described above). Immediately beneath this routine are the special-character (ODT) command execution routines, followed by the word command execution routines. These routines are not at two different levels due to the logic of the routines themselves but rather due to the fact that the addresses used by the ODT commands are passed to the level of the word commands but not the other way (note the 'SHOW' commands 'ODT' and 'REL'). This is due to the fact that ODT is required to allow a return to the last location opened by an ODT command by simply entering a "/". These call numerous support subroutines to fetch arguments (including evaluation of expressions), get a word, etc. All commands (except for 'SCAN') then call the mapping routine to do whatever address translation is required and it then calls the I/O manager which pages the device as necessary. 'SCAN' never does mapping and so calls the I/O manager directly. Other exceptions are the'FILE', 'SET' and 'SHOW' commands, which are not directly related to device access but are required to make the program useable. These commands, by their very nature, require a significant amount of code that is not able to made common with the routines which are related to device access. The hierarchy described above is maintained fairly strictly throughout the program and has allowed many new features to be added with sometimes trivial amounts of code. For example, when overlay support was added, only the 'SET' and 'SHOW' commands and the mapper needed to be changed and then the part of the address was just re-defined as and none of the command routines or support subroutines knew that anything had changed. Adding the COS formatting March 1977 Page 47 FUTIL - OS/8 File UTILity program MISCELLANEOUS INFORMATION: required adding 1 or 2 words to each of 6 format tables in field 1 and then adding new packing and unpacking routines in field 0. Adding the SCAN command required the addition of 1 word each to 2 lists, 5 words of initialization code, a new subroutine and the separation of the device access routine into two levels (mapping and I/O manager). Again, in both of these cases none of the rest of the program was changed. March 1977 Page 48 FUTIL - OS/8 File UTILity program COMMAND SUMMARY: SINGLE-CHARACTER commands: ([] = optional ) []/ + - [] with # $ : % & < = > ? @ [ \ ] $ ("ALT-MODE") "RETURN" ; "LINE-FEED" ! ^ _ WORD-TYPE commands: (And modifiers, many of which are optional) ASCII PACKED OS COS UNSIGNED SIGNED BCD BYTE OCTAL PDP FPP DIR DUMP [] ([]s above) LIST [] ([]s above) MODIFY [] ([]s below) ASCII PACKED OS COS NUMERIC WORD UNEQUAL ABSOLUTE MEMREF FROM TO STRING MASKED ABSOLUTE FROM TO SMASK e.g. 1,34,0,7700,0,(-1),377 SET