IMD 1.16: 1/06/2007 9:56:27 FOGCPM.164 --FOGCPM164BIOS2RSXAQM< BIOS2RSXRSX BIOSFIX COM BIOSFIX MACCCP101 NOT CCP105 MQC !CCP105 MQC"#$%&'()*+,-./01CCP105 MQC23456789:;<=>?@ACCP105 MQC.BCDEFG-03-00 87 -CPM164 DOCCD310 DOC+HIJKLMCD311 AQMvNOPQRSTUVWXYZ[\CPM2 COM]^_`CPM2 DOC abCPM2DEL COMcCPM3SCB DOCGdefghijklSAPP12 AQMUmnopqrstuvwSAPP12 COMxyzSAPP12 DOC){|}~SID11 RSXSIDRSX11DOC STAT30 ASM&STAT30 COMSTAT30 DOCSYN ASM_SYN COMSYN DOC-WRITECCPCOMWRITECCPDOCWRITECCPMQC$This is the disk name. EWEYE[E]E_Fa$FcDFedFgFiFkFmFoGq$GsDGudGwGyG{G}G$HDHdHHHHHI$IDIdIIIIIJ$JDJdJJJJJK$KDKdKKKKKL$LDLdLDŽLɤLLLM$MDMdM٤MMMN$NDNdNNNNNOO/PEPP P P@QR/R#ER%eR')R+R-R/S1%S3ES5eS7S9S;S=S?TA%TCETEeTGTIKTTOQ%USEUUevBIOS2RSX.ASMR  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQo;H_^?ޞOw/>ї3oHzyW>ҟN)gZC<zyx$-t^Ļ-z px d!'JB+-I)cIK U,9=#Yixɱ07n@'5cI9g.eFI´< O_wzx{~zWʍR-ĉd0} -.oP,I=3B28'oDIuN'wĖč8'z_$R BV/?Q0H*d?D?gdq# ~{{n9 әXJ2U"LMR,$Äd0u9#!M\J*GK]%:s

mmZJyZC;T*|b3S*Sa w46g.|A[p߶T <3Ӗ]e ڂwh ~ܯݻ]NotĖ̔z\7ػ d9YJQB%%ݽF!Β +Y`Zpd9?Q*XٹS OUh$DJB SQKw\pV܁J' -1wiݻC% nӊwKrVܽ;rmZq`!rM+l>rmZqi;ܦwpVܽmZqi;ܦwpVܽ;䤢rM+U*ӱBڑi:X.h z׏g:sG?o=\v{WxxW[b YV=^=S))BkWR;3u&DIיTL;4:x [ *@$#)`RP!IC Xb;P6O+J`0R`e-41q>ڲaKA;t$*$YN^?ޞl!ْYCvfNot; 1_[kȄr&){|HhiQPIYh^I"MtĖ!O< SsK-;L NAh!wHZ@#)%>$㕖Y@B/?;g,1'C>$i΋JY 6O+YkU!a\5K,q.yn9c U3SwHLiO_ЙXRϬ۳whK =<}lJe^^-1x];P3msb2O ׄҙX[wXbǟJi$ X$W,a+wXָbՓwȇq_^PivO_FgbX[bǟ.a+R`^=SIńW4;qŪ'pV>P[Owջ?[hQޝ$뒢 *~=j&wpV>P6O+IooUu].h @׏g%>^܁J?ScR/h'܁JT8x8v)1pn wү~GIwջ_ʼn%ލ8)P;V.-#B1; *yZiIt`0b* @e6t IwP1 TZm@Xtfb"@"YαSsbP%@"ISsbP%wջg`}z,Kե7(v03$Xߩ$ү~xƸ.AGnP%!xW9c<$dXAh#,<=}I))ͻ-ZC<dPlB,ʑd0YkUY)nU~=mV[2 U*^?ޞw[2{W\pVcn(E“wE.M+NKT:YhQ'pVz,*@̤b2wM+=TJ=)upVz,qREcfx۴␓ P)'x۴`!T@ϩ3YYmZq P5>Δ:wM+F4Ԓ4ؚwM+s n e3w! wpV(r*)gB]biɀJBm2z۴"5R`kd%pVB*B&#.1x۴␓ P)'R1;ܦ]rH&)wϜ {`&vo~E[ x 6w2LhJ!4+Swʹ~ϰk**ܨtf*p*T K|*) S#Boϟ^tN^?ޞiK yZ8xn9㰤@O_wR;L !w{@%]C;L N@# YkU)nt&$d0h;8zMJjgC6!k-wȇq}|*mSHm]Z 5403:6>Z Jq.!w:yCG#7u*YkU)n;L N@N%I{R9`xT@5"$N:&4!wva vfZr;Hd{|HhR6e!wvaTR;3ISL:&YC>$k[P)̡зO"k-w,U*ӯhܔd0Y Jq#Le]ŷOD_臇;}+JJ)QBsiTblU,Ozyx5cI޵u\kNJ$ V4XCS=Azx*K O.4 PۧW/@MTw]♅dUMv6xFvR<-H"wagt6wջf&.13wASBh6FO,Uْ\$e:1%H:4uˤ%*pxHJv-&Sʱɔd0!M$aVQ*d0~=Djd0I$@'5cIYd0~NbKfj)pDE)P<*$Xlby >X&Sʙ,$b9zWg!L-NY( snmVw]T ,s(%J~;03uŻ]3 )w<-)r`gص{ܽC`zW'F23wF~!.1}.]! DRP!.1Ph.s&hɱUa td%Ǿ MwH%Jn -T s^49v ch\;fPޛ@%ey噕a.t*)$IH r݄w͠K؁JwbIؽCn]{\L{Wc]a.֋<\,IK b0PR!Iiɱ?zgXαtO+Jzbba.֋x {;C¸ŚޡO+&t\N?z[ 9viQr3(v :{>Jʻ~Ks1 ;n3,؁JF%w͠+w :SޡO+&4Swϰc*VJ(! 43D*|RwvC>$TōtЧPIK ?ЏQbCG;pү~e6dJ\~Ay*AGnPޗy0Cź2o.̴e;z)a;LTRZm@%;`0ɔ֞~R*@-L˼m(mTx {;C¸;*ML-N?z>í|FI!7.a0CEŽJj;b%N&}x P*ML˼mG :Twӊ;>c2û]Iay8PV~1; *hwm) r3(Mwb*MwGnP%AGn*vAy*A0Twtv*F)5C |F`kC`A0TNAJ%ʥrSHU&>.#7ɬp 2o!7C`kq*FNDigC 43tO+[9A0TNAJy8PVܼá#J#MF˼mޅ|A>$,Ǘ_J˓08λRPiɱ43{N;L NAh!wHZ@#)%>$㕖YzV>#'CnSJIV}Mx*Iw~|HTjwav*}-bPí|Z,:$L-Ji`0b* @%D˼m-gB*t Iy8xLJ$fe;z][ҝ[{ z/Ý^?ޞI"m)gSA0ISL]bxzPxn9#~JR*I/Ý^?ޞtN@hK yZ8xn9㰤@HK AavŻ]ŷ;B~ z/Ý^?ޞI"BXػu@e {ށJ"am.]R,TiÒz|Hס*)wy8xa遏@e6dVT;L>MF\X;t%E9@o_~NeA`@Ne s]_~*)Rv%Beޡ[8,)*PIYۗi{]SHEhbU;2Я~Gs9?xW[ä x]'CxFNau`xn9cx5!wM+0ѻ]EKSiwջM1]b]l!ْTb#6w{x*xL2;yZ8xK/hR-;yZ8x+ 1uˤ%*pz7T4#PiOejIw*pnH/h:4u$Ne ~AS<[&.1Pw;/hG|Fx-rSއMTVZǓnP.4#Pi3ӖP9)J˼m+Gne;zW"4#Pi.s&HK "Ś4#Pi.sԒTi\L~ASb9NTi\L_@Xαr;} 1uˤ%R*ꝮrAS<:rV$!\/@C6!k-wN4#Piɱ#mBݪウx*ISL:&Yqز/hG^cTݲ/hGCgR]`kq)J6 l$]8mَ4#PiOe llGNAV)J)LR,$O+{&.hR6jXջ.MTR(FoUT.h 6J[ *$ib|e;^IY(њwށK;!wva ?aBIOS2.21 BIOS ver 2.21 ACTIVE :>ʓ2>ͱ*"<-~# !"!Hy ¡!" *<"2(2'!":22 :(2(2'2)22i`"èè!$'*-3Ä{ÉÕEÁy22> Ϳ|^#V"1! ^#V"u~20###~23 ~24!ki`":i`y2 >27<2927y29»:3<2):2*:2+: 2-:)=2):!*:!+: !-4~!0*+#"+2-262)<2625:4G: !,#)2&".!'~6a:!!Z:!"Z:&!$~:(:2!*"":&2$:6ķ2(*:*.:7’>2(~# •:9³:5³2(:5> Ϳ25>Ϳ25:$o&"*1">Ϳ}2%"> Ϳ*""> Ϳ!"> Ϳ>2>Ϳ~N$# A  B@$$I$I"B@HHI$D$I"$$@"HD$HI$D $BD$A$"BHIB }00!͙BIOSFIX requires CP/M Plus 1.~, +͙Banked version of CP/M Plus required .h>!w͙SCB BIOS jump table now fixed ~#_:s 1.~, +͙Banked version of CP/M Plus required .h>!w͙SCB BIOSBUDGET CAL  CURRENCYCAL  DIFEQ CAL  FNMAX CAL  FNPLOT CAL  FNZPM CAL  GROWTH CAL  iGSA15A20CAL  # .z80 ;For CP/M Plus Banked version only. ; ;A short patch program to fix the System Control Block BIOS jump ;vectors. This will cause all BIOS Warm boot, console I/O, and ;List output routines to be entered with bank 1 (TPA bank) in ;context. It will then be safe to implement RSXs that modify ;the BIOS jump vector to live below common base. BIOSFIX should ;be executed after a cold boot, but not within a submit file because ;CP/Ms GET RSX (which is attached to submit) modifies these same ;vectors, then restores them to their original values on completion. ;So you will have to remember to run BIOSFIX by hand at each cold ;boot. Refer to CPM3SCB.DOC for details of the SCB BIOS jump vectors. ;This short code sequence could also be implemented in an RSX that ;modifies the BIOS vectors. ; ;Jim Lopushinsky ;June 25, 1986 ;Meadowlark RCP/M 403-435-6579 ; ;To assemble and link: ; M80 =BIOSFIX ; L80 BIOSFIX,BIOSFIX/N/E bdos equ 5 main: ld c,12 call bdos ;get cpm version ld a,l  cp 30h jr nc,cpm3_ok call ilprt db 'BIOSFIX requires CP/M Plus',13,10,0 rst 0 cpm3_ok: ld de,scbpb ld c,49 call bdos ;get SCB address ld l,0f9h ;point to common memory base ld a,(hl) inc l or (hl) ;is it zero? jr nz,bank_ok call ilprt db 'Banked version of CP/M Plus required',13,10,0 rst 0 bank_ok: ld de,6 ;distance between vectors ld l,68h ;offset to WBOOT vector ld b,5 ;5 vectors ld a,21h ;just a LD HL, inst set_loop: ld (hl),a ;modify the JP to LD HL, add hl,de ;on to next vector djnz set_loop ;loop for all vectors call ilprt db 'SCB BIOS jump table now fixed',13,10,0 rst 0 ilprt: pop hl ld a,(hl) inc hl push hl or a ret z ld e,a ld c,2 call bdos jr ilprt scbpb: db 3ah ;location of SCB address db 0 ;get operation end main  INSTALL NOTES FOR CCP+ After using CCP101+, and finally getting it installed, I've created this file in order to save others the time it took me to figure it all out. To install CCP+ on your system, perform the following steps: 1) Recompile CCP101.ASM with MAC; rename the result from CCP101.HEX to CCP.HEX. Place MAKECCP.SUB, LOADER.PRL, CCP.HEX, SUBMIT and SID on the same disk. Type: SUBMIT MAKECCP This will create CCP.COM on the disk. Place this file and WRITECCP.COM on a _copy_ of a bootable system disk. Run WRITECCP to install CCP.COM on your system tracks. Modify the ROOT.DIR file to set up your named directory entries. You may have a maximum of 64 drive/user area partitions defined. To enable the named directories after bootup, type: SETDIR (note: ROOT.DIR must be in the default drive/user) DIRNAME ON Note: This CCP replacement eliminates all resident commands, such as ERA, TYPE, REN etc. Use ERASE.COM, RENAME.COM, DIR.COM, and TYPE.COM on your original distribution disks to replace these. You may want to use some of the excellent public-domain utilities, such as SD (instead of DIR.COM) and TYPEL (instead of TYPE), as I did for my system. This should get you started, but be sure to read ALL the doc files in this collection for more information before you attempt this mod. Jim Switz 15 Sept 85 vцCCP105.MACo  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQoRSTUVWXYZ[\]^_`abcdefghijklmnApt֣(;Y}"‰ʎ,WLrXޮ/a=DX(5J>ʎ,W :]ޮrZԂJ>ʎ0ىrk3yՅ 8<'6xtq8gO|^SI(9iƤ]f‹Apl"zhKApxN[mxtk8xav1*{L?zO k<Ԃ"+VvhMI .=& {O k<W@y u"*2xoeZGWX;iwueQXi]ה#CǤae8!T+,M*ȣ3W˶kt1R׫zhV˓ yH;IH;I+n<{#8\N_Ζ e>mD-qczDXXi%8D&op&{$.'ApxN[m)8{'|K*1E\-O֛3靤ŝ"WD/=,wPj[_ kXhE8%'YRc)f]DV尼]X+]J3^p("3 aELd'ʩStIʎ0*{Lɩa5𜔷{8{Nca8-)& [Aε`ٓC]$:EHFS5 <+lDQ+zIHw/t6"QCH:;iA]aE ThuIp9F[8:9]$|k$#))x9?nh!iId:Z[#Mp~!iI'Id:Z[#z|AǟsIH =I4t-q9{FB2Rbgf9{pvzZ[#Iy$#))z1v;&=7;Τf-$%ջw]sl|7ݜ߱ܯgv0b >oFׯ>wc%x  ;pr*I0WnaA}?)Ĩ1 aI'AJ0>5[{fvaɧyC%;"`(m $jaI$FПzI =I0~|tl3^y;05V-v-h5IBk\p9{V9%y8jӧ2S*`@& J`h'PN'Q{ WĨ1 vmŮBJp(ٸ\^BXik$JW{RhbB ;&Vs-X0L~A@~'/& Jhe,Rlg‚$ {O M_LH  dr%X0l宙;&+ Z`h6[{|I, +]ׯ>vV;ŝ0R$QjLK^(W;ngK_F[IԘX+PޓBR`{(w 1aYń};ΖW`k_;vŒ$ʎ0g{RhbBJ0K8a(5^aTлc f{(wI< FÃf-/}QPj$QjLK^(W`M_LH visv~>-PvN=a{I/1 ޷0{{%yxlOE$F\$?"N Cka whbB +d]¡z=aV0L~Xw>IJ\aN0l宙;&+-xJOĨ1 val~B(5.gMV|N0Ӷ'B[a+c.R %8`1Zi-!6%3N~:E)  S5 VKxT^:% [!b( <-󣋳OõV‚$:|IJ@GgC;^z] Vz\d f >?8$cO6󣋳OA0€6o>?8$X0xplٸr8L^=J[`Hr`.%D‚$J[j>!V@ɝ6!E~ur k.!7Cv)$j/xyr"g^J` m-Ht&rw'X0 c' 7GgC9m[D"+$m' vl ,HbaM/ ls0sDŽV$%y VRc{C;۝`(m ]Jh})vW^0 @T;$)PN aA kzI^0Ӷk%BN kzI^GW`ln|#iBւ`lnC9m[Z` m-H`(m v9:Sa"#1*{L`logr}{ '/&`ke<'|Gg >ǣOAZ+k'/&Vh%Z/IiD .>  d1ke<,K V ɝbI ).콺'9]} +gׯw;J+VQZqaNT0<(x2Vh4F(KNѸ0Z_'w*mVv$1ZEYju.FE vta$hVM/j>%0al`hZFu HDŽd EZ.H VZˤu}%iۂZ.HItHu*hVM/j:d`h6ܫv$1J=&P`;owynHuQ0<(Xh2i] u  RcI ).Pi-$C;I̽Rd$`(W;]A rڶ5@SlK\^x)a(; + 6:Ze+0mn× ɝT`tQKkU 9;sPN.g \cB]UQsxD0mgA00+Ũ{zD̺(!az;&[xtN0<(x->I+yl2Sx'iDuQ81YCX%l,$`(m M{uQ8C9m[()@ȉ‰?'a_ ,KMĬ™Ur PN/rq=@(;wh"f]DL֐paNPj=f]DL֐ xؗÕ` mr%X0\kN0[{Skc%J+LEǤ;Ū7YZm [Aε`"l}?[+J[5[{} VbI )L3:'Vr}!EW] 8ѻcB+ 2V,WJxlI^bIb$N.t$"fk_ ,HbIb$R~{kE$F\$nAXHuu#] rڶ0+d=BX*/J*̺(!7 ,IʠXA[Ѳf#E`r8/VRcEL iB9;,|V=&5et&b'̺(!0m'w>sHքU^T`(Wp7axOعcBM$Ok(X0 r%X0<(Xh7W#VXD&y2R0ۦFԘuQ8<vi;$ '-@F=&˃`/a;owaC^bjQcB_S '-@Xik$JMd\A`l ,Hbe89&2 `g/jFe ޓBRkʶC;m*‚$F(KNѸŨ{N0에Ãѹ/j-1i) 5 c3oC;m*ȸ RceW*STZIJk`(m Jk $$#թ`xP1: M`"tʸ 5rXޮVpߥ4QC0mQAI}Gpr* 󣋳ǃ`p& `(awD 'ГĭKRzA0d'ľrXޮt&Z  <@@[ﻔ&J`.%$s'}尼]c'LD'%,D[@@%w)M`@& O%X0<0.O6{BEWb#VztI) Jhe,R.5ۂ AXĂ )t1*^0D%i^ Z0ɂ .$/ Ϫ  ^6i6O6<ǣ!E<} .FR XP1!%y iÃ4QG<.Ξ 5BT~,ŏ9]= Z'xtqT0<:uASt g ƨ1=)`xSL@0ZbY [Aε`Apx0'Eh+=&5e {O M_LH5uQ81YCa|+Po†J+l" Bk<z_^EAcB_S&2 PNC;]Pv Pq`6U@5Ƭ™'%\;0%8e[{/j'5e[Y`l{O%O Wޓ$[{u%N%8{RhbB ™'%N%[Pkk$JY3$\;0%8e[1Vh$6*JpAsQc쭏J0Kp`;owu/1*{Lh f]D`h6\*Ov$1p&bI a, ^+宙BcBC{RhbBJ0[{YkI, )^zwaF~'/&Ϧl\^ vi=?idvIVJx^00 qJeZQcB_S a cTP;PNfc;% cTj9@PV1*{L`[.]30sDŽVb^0[{v0#e¨15LDEWƲ\-Ǎ`P$ OXpV˓[+EFbTaw6 OCv)M!Nfv{ )G'I] ak_{#J[#Qjl"yZJ7I$iB\M#@8h%^/f /V`XXK2h+4 's'X0 r val<@5Ƭ™A` X+} ;&l"yZfI0&2 FXD$R.5ۂ AXĂ )t1*^0 TG1vCv)AE :wLxOXDaAńGP&Y0(`^EWmFKto`{$ H"Z[#QjfI0<`tde . 8FS5+05 ,p{kX~\xT0wΚ Ap.Jt%RHM*OVpVU<-<ǣ!EהwI;}cT~2xtqT` mX+-x HyyޓBRh+5e[Y`lq$1*{Lu$P6SH``+ȹ,V9J0sDŽM$Ok¬#  dr%X0͙`/a 6%VZaIbTÃf 0{ K_h+,E0% #@Xik$J'YG f;; '%N% #@|RcT0Ha)@%fI0<(Xh |m'l+KQ`\  9C;˓#鲜|6n5wɷ;fsL89w`l0{$^)2$N%L4>^bTC;9WĨ1+< ms(5֊H}lvГSCmл0*{L%OVhIJ\  )$7[ONAXDONuUyLĬ{#!<ǣ!ERT; X%Sp8x[xGgOC)JnFcT~2xtqT` mX+',85JĨ1'rs֠kʶUIzQjs<|st%N%¡/jTPW') d$&2 aJ viSBvh Nv6y ;&-fV lK=&$#) 0Q%L0+AZ[_ H+LD]tD .ٲ—V$+nH0<(x l5EHĨ1 rspQvQcB^)2wÃfߔa—Vh+EFbN0Vcy% | WĨ1 a,.>^bdV-×\6jy9/jSCeg=FeIz)o`h㮙U/1*{Lkhx^a<fov6C fPvI0ngs-``+0ZBε`]J;wt ʎVZxS ^0ӶٯI;BJIE-Qj5ae  <[aY rڶ_v0ZԨk2(;&,D[\   /&wEB]A}'V[KeGjC @zI a,aB(5fI0L0‚$fI0KFPkk$JQc¬# A{Ru$PEUD}Qń,E0m'ebaAs'/&~ S`=Z/I鏂A&תGF[a"#z|IJ %Lv6C ;&y -@E %)/R~5''/&Pj|IJ  %\  ٥|G(auN}$?zPNf'a*%DQdPvMޓ³`@@J`(m ո>?iGS)%J&#l" 2V,WC;I̽Rd$ )^zwAZ^)2{O M_LH Me;5 `XW0o"/"y %@E %)/ZU 81i]c=&œ9)B[aeɠI=)<W6黣+0% #@5ޓBRh 0m'Vѳ`h㮙;&=)4}1!yy ' L\C1*{Lu$œ9)B[aeɠI̽Rd$ +H] ~ (R+Bّ'گPP^h9.Ξ  )֓Sv$CГSC]U$:1Ys<8{*R'5]1'rUr SL@0ZbYɷ.Ξ  X0Z[#Qj=)4}1!%X0 r 5[O; Ia%V-VÃOC_h+'1") UZ`hp^z L?w=)4}1!VC0i`H\ׯw; Ia%` &A+{O M_LH ak_=v1XiV 6Z~I^  dBY vi@X'/& [s YmO,'툛ϫq&8|^`ܔK x~o [)Z%apZx#X0k a`5lwgw{H=AX+]JI  dr%Xpx"r|vՈ'˃ r||^Wa,{l#C;m6WH+iM-LaNBEKB2RQ`v|^jmDiMh P6OSJ(5C c  }LXD(Ok,X0 s-Xpx‚$a)F(KNSZ D)rJ0I_UH'}U ٥d,@$Qvp!LW!E`.%D"ѡ, Z `ɿÉIJT+y%j]CCmv ] u;` `P$`.%hZIœRS^ʚhEX;e)Ng]W}C$0uQ] H&A&~ )kv?N0q!EpͶK;LU'r Y0XK ÃME}$8~ K5D `Ik*veGډr *&=4QW!ER-p1I,B"C9: .FR RcAńzDEY(Rj] k2tI0vi'Rm*O^=}k"A{V5\be)E`M. mv ] )Bl]I,Df!;PHcBmKCU%K  [s RO2M@$ DaAń*rQ` mX+`6 $"y/X0 r vmaXy a v] q$ 'nAh 00-yڐ`hhl-Qj:E]$ka;&tN` X+!EئK;&LEt1*^0WGIDq&P6O?pr*ɣXc mr|,¥>&M;Z5x3`hΖBcB'1c֊=uQ;i'6Yy*K |* xr} 'V #@PV],l9ׂC;ml | a?É[Zs'`+4ZbY kѯnaA'Q{8OX  dr%X0/a*f*ffIk;| %}#< `h7S0ow< -@XCEW3tQWwd] [au;üwHʠQXiIHJ0<5Œ$&}SI::`x_T0lq^Ҩʓl9Z |LC;^:z`hWGOf*&Vfk_=}:Aؐ;g V-ÃOOֳqK_h+̝I  B,e'|Gg \ׯs Vu$L~9]} :Png%RZ}`xP`^6|zFԠhYGE$|GgC~I$¬#a''`MMDRJ9]}  ˦OOֳqFE$>ǣOɷpJu ,c) T${e0H`k_=qz6n"?~i9kJn!X0e,/I%wUo/+DC_(5&").D0iMV 89 +]O0=@PdiJ+֊<<9%`]Jn!X0eBg"NN)ww'$8v|ē5igAvSΧ+Y}%f ~ޑ9(8v|ē5i _ vyYeKzF0Oa| [p3L<ʎŨ{Q0@XLVj#i$j/mS^zPkk$JBv`l ,Hb"`8Y0oB(5f]DRY ma: v jmDLD]aELD/5  ԽDIII$`\wKN Z`.%(zK+,WHג`BB0dl'~ʎ FHR%쬗ZbAs OԵڸNQPD]U89Ej| d  `ε` ms;VC =D2=&kHpXzoGI0%L(5J )^zwD q#XpfoWx^pp8I; q}~ҎWP6gUuVu;JiR'`c՛,6 Z`h[F=&:`@@-,WCIUɫ#F=&:`@&J`hG ay #@5ryy ykKR%VR,lFK̹,R.5G]j"Z[#QjkIF aۥ]s&%"lk5$Rmv͙`@& -,Wv6C)V9 `hf5_jmDvk`(m q3\NŒ$ʎpX;﵊XYJQ0+FگP l(Xd+ׯOeGHJi$i$jr/ eGX&K Z`hW~v 'VXH(5$ɺ H+N.!)`xP~MJAxmFKSoKHJi% ,Hbݝz]BRJ+:`/a*h&%)ݠݩ%$ ~k]kV`xP~-/j-њclyU maAv vC}pKJiknuM+h'X0 r val*(ZHFe $X0PlFK,˕`"DjDUyB(5fI` mX+ATNJ*jhّB]{+;4t^(Xpx0'Eh+4ZyUDRJ HTa aݝz]BRJ+t&bh hY+0Յ_rGAV 0MTDž_rÃMd`)BpdW-xBHJiy$X0 r :ELDE^:%,W%OVhIJ\  K8,D[ . 8I uM}O`I+0%AH`֑R@],l9ׂC;ٖavaAsQc,(yB%J`H\ߙ  dr%X0ngscBEW$K <DYw-̆|Ip9E\0+AZ*2u$p.3H`֑JnꚌ`XW0%0wa9n [Aε` JY#PhbB Z+az;&R0, r aJbg;$Bk:La\-tt]#P+k$vvѡI"گ`zy )]J0LU@^'' Gc'Da: 0mnnB昔Dq:+ONC s 8VHB` mr%XpxN.!)[ cWaprk`  x~;&]_ lV0ngs8`lΪIx{VvHӂl rڶp= ~R0+-yYcRƾIavCzGESGmC_h+ڐ`h]3{")p.a `^B}35VZaa*bAA}9\GmC;v0Iܡ%ʎP+a*be)Ep.a `^B}\GmC9m[*UA`_{L֐`XVs-Xpj`h6(ɺ'^viUZy nF0<(x`hZFu,ͶpQ0C ecb f[ޫ``8Y0oC 币u)y%Ͷvkw\ rڶY`6JkY;C;06^(&wv']_ viƝ`(W;`X;C  ^4F+e-N% `8Y0oC|0/AkF+e}%X0 v&  QZ˨C;:`(W;`]6 ۝`h:]3,ޫ+p.a vi-uN0 c N0+۝`XX5y '`hjL 2VrX;jy+X~!VK%xb]ŕ`ܬZE9z57_o 2V,W'.8m0gLDEWV-K'{ª7YZmaϮC9m[D QvUoaFGNʎV-r. 87t=`{rnO``+ȹ,iB+`"fk_=†Zr*2u$Bͳ`8Yɺ'h='&}SIh=$|Z0Wq!/' d] q/’d "4ZHה{I(; 2VpwuF`VhQId]^z y T${e0HXiFg/Iip.ak_=N0<(x c{r N*L'z|IJ7(;2`8Yׯ|aC^bgNN%ar $+{B(55^z[Ⱥ(8zO+T${e0HL4Zb(뤍`,xۓ+p.K1)la%)}o+L@(˕`]]3o!1Q+̺(',85JYcRƾIavЙ|V)k1p& כr>]^ vi; sJ0Ӷ>;O!ksLJ5)Γ`h]3u/J|'X0 r r7'Ĭ™-$Q0ӶM9;./!xwLh"f]D֊<)X0e,N%[0km$%KDf]DLG`Y7| HpD֨I5VZpۓա^ vylWaI̺(bTЮ^ v9%KDf]DLG7 (2h+ڐ`(Wp7ģp(hfoWvV0+6%VZt̝S( q x vuhoɺy }QcÃЮ H``+ȹ,8\<ApcG1p&5!bV5 t85 !݂Ppk%e#|4. g"JBNZmHAp9;./C;ش`hawd]0aZ[#=J%)t$t+vi@@ nzN ls1a l 81wNaC9m[x\ B . g"&k7 2w(5ٔÓoD\mQPNR:EWIRH9I`XW0o"/"̝SXkk$)گ`zX%a9n@ a$uNpjC;v3N.uNpjVvh!wNaF0oa^ ,H5 7`aI1nAXi&bEL ms:h"f]DN*O&sS'V9[1NI>Y3]Jpr|r=Yxqor3~J0K5ʎ< u HR^0L0‚$zݫL;C;v)@{`$/C yVH9I``Y7—VhDNZmC;vaaIurХt+xr)xߌ+_ &0p&~ __4BҺJ+,"lCXKtDf]Dp.a v5S05>%t$#,m v5g9U/Z%:&[!5Gg@HW.4yGgO`H"5΅jmDq9{ kfI1;h%Z(RInDf!;x )ZDŽV5Rc\&GgO`h)@5Ɖ`(m q3(;q9{-V #@P1)t1*uY35$Rj~uH]G]kY35 )kӣnO~ GgO`Hv'.Ξ:`MHS'Rl.Ξ:"l#;&4t-D̺(!t1*GgO`&C$Su&bELptq v~hkF3wLuQ8Ũ{BC-H0<r#]S%Eׯ>w #wa eG8qv  K*V^0,Ǎ`΅W!Nf=ޔr++еĬ™.Ξ:L@(˕`r~>.7j5.FAm9Wag ra9nPa.%n (5uM $F`\ .wAp(cK~=`lO֣ }\W`p4 mr|V¥>&UIz,z `hN0KģQx쒍0/q=/}Qh%̺(- @p&bt&Jz+0maA ]K̝S\ @Ĩ%n/vz_F[aKaz/VޯJ0lWa[3wLhkm$%@8zSIB`hj9{I0ngsF1a$/C9m[?Kp +ģw89N.`hf5_jmDvk`h(3ptSIB`(m c  }L(;yUDk:La_0E^jE8`l ,Hb*b"nWx^^= vyۜky+x}ۖ-|}v$KI^b^( {"&2 ١5x _ht6/j^(m]ެ/; hZT`xyr%v‚$VVysJ0+ 7zkV#%[XI`8Y0o¤/j5``9?YBҺHMxMޯٕ`Xœr>o|ay|j,dr=YrvX>  xwL8~ S$C;vw DNr}{Rd]0 v0)@ȉB1R$1*{Ld]0Z[#Qjl"4 PNfoOVv QD.ZIrΣ3x0o< ,HTQa_0E^jE8au;0 vC :i۫8!to"[ae'PJ0L$1wN r7W7ģu`ES|=@5 NAXid" . g"&kH0|QCok}QI$C֣pÏዂ uF0+G+ѡt((xѐY'mɺy \|Z[#I ~ܷ5uVXhEP I Nڠ+ݛVv`e'`XW0AZ`x_ |D/Ii]3Ur 4{O }MY0XaB(5Fe ]=C]3Ur 4DŽ ]=C jmD0HA0f:/; h%Xkk$)lSJ0KFPkk$JQc¬# vi@XD+v69@P;PNVl_WaNVXk$FeGI)5uQ81YC`6yyAXD+Z[#I vi; #̝S׷|,^ r7g7alF̂0weoַ\ @X)Q9 ;ElR0Ӷ0!ksLJxI )'8u*V #@PV(V9 `h6aI)bI )_ X#E K\<((XhP5.وޓBRkʶQL`‚$ʎń`8Y0.>^`h㮙;&aI )5eEAvX>?D\ht&b(aTה OAprG+I" x߬o/C @=&T,sGN0|QP6z(~-qe 3 Q _f\ݯjaԊpv6a ' RcTהC; ,HbTה~ S K¨1) / /q=v5 eg=Z6DŽ,vhDŽsJ0nl\| a5S0sDŽQcB_S '-@XhǤ0*{L;o+0mv$е9%\ Vì6[5FڄY'mҽd]¼ f  (R+a,l9ׂCv)A9;QCFeGI|~tqx,D[A(˕`Ej:۔v056Қy¬™,l9ׂ`h6( ,H}Gpr* >?8{<k28`=ZG IxNnPvdhn0w>?8{<HMB(5f]D=)Ϗ.`l w{ ޓ.%}O 󣋳ǃ`(W;poeg *g>?8{<ecͱK6BP${er=I-!󣋳ǃ`8Y0oB(5f]D@Gg0mxaA wQcϏ.d].>^“o]=C{+;kP9A0D%x[Gg@<-󣋳ǃ`P$a]E찜.IN|~tqx,ؚcl L\=Z[#Qj<1.وQc{RX`.%RZY# PCε")X_ a#>oqV|? 4Yp|>+W`6Yy8Lg‚$y/f$zݫLʓ C3$FuUyl#NN%y }Lh+P+œ4o=i%f'kSgAX^ L`H&͙`H*P&Y0D%"fۥ`&C")Xpxr|? q??zsm= esf$DŽTaZ ?C;N0l `ڔaIWPWXcBkp*^%^:d`8Y0oɺa '`xPp>  kœٸf?OxlYyyJ0xWOw;I§fk_=}")XpxOPt 6dٸ \WA^z E>5[{n'IL@(˕`g7#N7??$d:YpaÕ`hvVٸ 8+Xkk$)6IuUy`l ,H'r.ApX-O,M{.8.`h6g\0ӶrnC;9C ~ kœҥkAW!Eͻ3P$j/XpaJ03SLp|vu`l ,Hb ܜ1)Ng Jk: q%@P${eV{B̂C3`ͨY`XXAA[% 3  cB+C;9ZQXI:t`L¿> 0}/`L)@ף3pha_ (R+BRd]¼HRa: 0mň`"#1څLCw a"Qv;lX+ImB0<('eGzBgJ`\ .OApX-O^*[c픕\QG+hlCg".;? eSW/jN3wm-;C){+;N-Hb  /r)F[X8;~5]Wd]0I_u2aɺ LƬ{#I vis7\vH&P: ^*k kS$gvɺy &}QtjAkm$%_4j+}QЊPj̺"گ`E^jE(;$V #@Z[#IyPN. P: ^*k(5zݫLX8;to`h60KeM_LH _N7 I a{C;r_sk"+N-Hʚ`(W;=H&~ '-@EF  /r9]ja.مA/]  (`8YpKeM_LH v9;?kDf!;0mv$K̝S+4t-KeB0npD&G`]6j Eh݅O~fٻN<Je)xoe)VIiD778qDO~eGAVI)0M@mXx<&6+.wt'عc£ߢJOU6f;fq!8Mg=vKNu}NJRMojbB VZaELoxie/6 :u(;¬™7 J {L0Y/QW(8jEV. gGg"ʎBRBpoJBEYńE<{Bp"U_}G+GE.5 䛢Uģ+HgG&%f]D4}1!%8oV0k#5eGuQ8 |Sxv}G09/1p&Qh="J-8oVzHsY3Qp'h=Nz0^juMVW7Y355)\ňSIfPQ*^U^,¬txa"#1p& )=J 6=efmƣ. g" Ϊ 6YQvY3'TiE(8o[b'8'ʎKJB]COYj֣Cӧ=aIpx"ʎL|BvKNqke]DN`D/MGXD1yar^3̺(!!8S|uQ8%k vΣ+ɩ$5 TfDthIR5Nj*I eGFKopr*BpI}?^RĬ™BV"NNQv(Zn;2dPvtנȠGC;gcRj6%ֽDkFvKN%mxoe#Ԇ7Q|vKN/WNJR gRY@]景]&t&YF*0wN,IyAptcg5cv)Q{+;th>BKI. g"Z#ˡ=Y8髊⦳56%;Ņ+㽕ʎpW){;I:Z1k#HkPvdP앹 n%-<zHaIJ\m[aY?n {L8髊{Bu!x,/"3'Au_LH0p&z;VX?na,/G )*ZE`g'}Uɋ`f'/rhO#pf_ e"ZRSUEJp{~>;y1-˱r,g'/FĀpW޾$l,7 ?na;?ܞN^?^a@OYjYFOf#[ @[c1.j'$vKN1wN 6p_oN$e$$-);+/r8|\ƨ{*Zgg~9p{~>._-rvbĀyBEYH/G[n]ň1*uV٣`f|%Xp[ELDf!;w<_1tJzq7\ 5rhO.HbEL,d'%)Bv dv E^<7R0ٖC{`5 @@_L" /CF0(R/8*Rh=DNQD)y!E5z)N"%RInɋh޾$]JP9@2Sh%J/Ii/XeGFO7jn":zl[^&BkI_UK5 te#5Rp Rf~2LE쬗Z⤯*RP"f]D4}1!*ZgG :^YIh%JV  )krvoV$s#LK̺(7M_LH  )vYٮq%ZHurIT ȓDOVt&")V-| Z+p$KRZ0vav{5*$/Y E[a;r8ȓDRJ+[,Xp[ᶲgs ozÿ,RDRS^z|ukmDK̝S.KR!Epv.H9$%K Nf٦OPB];VϤ)k;\GPyg#FB_\\lG1wN_ovw5H=em")%)"f;ow$J]J'lSΧKh=Z;VϤ)k;\> e3m]S }qq!XpSL:V#JVQ,R.5r!`KTo<yH^**ZX/I !R,ֽDEYƣQhKT^ )$7˱!`./ ue`H*5ʎ0TYקK"&kDʎPQ*>;d !ERS^z|R"/QWuQ81YC!E,r8F!^`.%(/rNZ$. g"&k DOV["H0vav{5zVjsuM"V-C `JVU%5J%'B)wwg+!d'%4}A揂l 5 6GW ]xJu^xya ClFOV"fۥ@I4t-1wN,I Rr\)? 6GOn0i}NkseIJ0n@@ojkRoP*qRl 5 'R-XpIBR(5Nq4 u;@@ km$RE^>ճ™,YCo.Cv)t?xROh=}06K"$nN-f]D4}1!Hh=u0Y/q'X0.r8AI̺(hbB +T$*Zg!E )kH0~ `v)IhL(|F H@,q{:ŬMj#)@:I?{3tol r ?[/a3 {+;k^juI7qۗQ0<(|\hI)0:I0q!EpͻOKON*ZE4}1!V{I'K c9%@R.FEޣPvNUDky+Rl YFPvNU ZIb7h=zt]PQ*~  f>ۼxJAńZTU=t.(| h`]  Ks"gKx-'r s1YCCХ $:$z )¶ړk_ҘuQ81YCuodD4}BIIB+ [hM|#X0]jrykmD -H09hMIBӧL*qj#K Vzz9 Rrٞ 7OI)A`H\s$R|\.]xmݡ%VJXY%&:7,j6 P'X|yw%Xp'߲OQQ*ih3RvFQQ*>; C  HRxoe#K+{iAEY.)rkmR`A0e_G0i18iA"C0r,g'/FKB]U )ZFf]  y\d 6R#B*ZgG X0Ժ.\ĉwXkk$)yLWϲ. gd !R,NbPj{V! `&;i#̺(!/Xp'!ۼANеDmH0< +ݛV VtoNp'߲OQvNbPjTώ`CeGVjV]R)I)c#:QvoyBf]d Z[#)89y{!` u;@@ (uY31YCo]CK^b{p2w,%kYѫJ0D%F;'0H+T!E,r8II y/RInc9;y1B]Do_ e`H*5ʎ0TOe]"/QWBmF2uV&kH`u ] FB"/QWuQ85F0e_GHeG!'|Ċd(c ٥PN76Ik$a`Aɣwh"EHQ^=ݤ:JBPk`JgWSTώPjELP,R.5r `.׽ʄF )Bړv#yiV"Lr3;y1C{}I!E `(;¬Skᡆl i|^0{HV$Ig'6!R @ZѳHYQAFbJפK`Hr^.rve"fIJ|9:: )k&$1p& )`MК #Qj4t-1p& )LwOF}`H&X$C  `ֽ(5(kń`H\.H!pІ]J+C 6R-K c9%@@kjk\h\Z[#IԨ(kCmv$qr* D]DEY(СSzAf>AS Fmn$FNQvړ`&CݠXkk$J#LЍ u;dfI t wDŽskm$VS& 5 uQ8ń`5,a +? RܬC;]t. FN1 5 uQ8ń`.%X-7KF!`-5e ٥No!`.`u ] IFB^jeK )BnZmv)= kRr^keDzYRrٞt&bEHʎ0YC5L2@IԽ¬{#Iy|'j6GGGFC. g"&kzթ`< =pJu^cFbYʎ^juI7q dEY3M_LHxA`H\]p #̺(hbBJ0XkD+3=}`HrvPĉw[ᶲgsꙮ"X+k$jЙFK onvwC/WG; U^T cELD/5 kWGL;P+Q0<(| ) zQ&kzթ`5\:iQ0<(xgRݠ1a쬗Z ^YI8髊z锴fNU%Xp';@'Y35gW(R.5g$KRZ0rhOTIbELd G g_l[OV['ÿ,RlaaA}?^ZmJn!Gf]DL:R(l{`tM zX+{4Z.S[8%/Xp.>9I;w/PW X0]jˡ=Yώ `(5V}JuQ81YC8髊`.%(/%@RVx;!Eav{k"A@ ,8x8\NŨ{s5 !RS^z|v^⤯*R7]Gka ٥07 '#C"I0Fg"fVjGgh%~⥕`vA`.%(`.%.j VHtX+]R03D$(;I_UzLE!E@7YZmń RI KIcpB8!h%E]J0r %Éw(5F\$ԓ`HԔC{!`(5Ǭ™ )k]H d@Z[#Qjs`.%p1v.>9Ixߑ"||V;/Ϭ Z _҂!Evi8Ta^*k(Xpn c(:E;;;!ERS^z|vH. g"&k'}UBpRr^R$;"tav{ c{|B0h ($1;NdR wh̝3 )`etS-5A`xl'~BZcYPD[&;Oh%; }?^ZmÓo-56S5)'] NxOxoSºɷ ;=VFjagBp{ 6G gWY35FcF:kISZy]Jד=@@Oe$Μ,!EDHͲ/3 VٍG"qCv)!p9IcŨ{p8 %)-R<] KRd+K)PvA0F0Y/:x^C9\IM_LHa++ =MOFZCv)!\OMN"%RDD 'E})K0H|R6$RDDc.H$jFazҚ},!'Q{$I,9EOYjQ`eJ`H!R3?/kmD'^juz<[8kC9:.H$j/& +sޚ`.%DI `NV6Q#d`xa6 "O)yPjT>IC ϭLD]9IY/:&BmPvo6 F.C ${e ϓ[ lܠC|q6nVXD{YC,xJ0]jvU&ҵ$6XD7+H0yyxuv] u׮gC0@]Do_ %W`H*XcB+CmIAI=)4}1!%\ @MOLZY#$`Hp;AvKN7ozBń`H5[{]vpA%5V6FeI0yy5ֽDk pA$Crk|IJ㛬`e)Eʎ<,`xl"tAWZ(JBxIHAg"Z֣/(8!eG(1*{L!Wz3^Cv)~5' d,P0( "+VvHKkXDk2Cw@hHI,=l"Dń`H"5pwW^ڔH$]Jp=̊$l"" `oy*` `P$ k2+B+%E."][/`$+)Ur Y3y!" Jnq6nVXD5ys#%E."][/ ޯd )"fk_.H&¨1 a;?/Ahx^CGXkk$>^bD  )$7zPWx^v^q R]nDN%"Dj `(5έZbeyy )BnΪ `e$jYG ٥ד=@@]AV6` @@Oh#V6ҵ`P$ KRIJ6"][/ n3>9Ih襲fNvqbS :Q ] alЙkmf*I eGhbB Z/wD2Etrw!`x"ztE(;Bk^\"OqBd0w( V$&r^Co" e3)%)t&Dm)ʎC@yn@0F]R`.%n9&%QjXԩ`kt ԽDs_IK!EIc +O7W  n'D.Ft(f !R%P]} '. ^6R0adY )/W#B0-F/5 (K nl#"fI0 +С|!Rl#‚$jّB/5sJ0dܖ wG{E5)Γ`5Lʚ} d@ut5"Z[#Iy ]KT,N0<(xٔ5ӾF)Nе9$%yRX%\^f+u ,Id :4Yd  A0tc(y= eG|s˒ZKR!AQvRgs˒` $e݅`!ॎhYI/JnC ${e{*|^*kXkk$E'8pKeB0Gm)ʎKeY":ѡSz&I8IT,.C\^ts%w wDŽFBKeCm@I̽Rd$zY`"`H&h.%FjԽDf!;̺7`&C$F(;B/5U^brY u;.^eB/5 B6Q05Dj0$}GPvY3ƣSBI]J0y; tO~t `K5NZmHRh85t `KWKekm$HVpy9+"fۥ@IW0wN,I 4}J(I8GeS^)<Ɯk"l#LEFF'6 ]I d/.pe^Z[#Iy ]K̝S YF]1wN,I 5 (;'1Hkˡ=Y0bb ELdC5&mÃܔCyFBc茖)̝S.KRɷT75Zy㑮Di ZQd( ./r pA>%"l#)= k$5NZmKeB0Ժ.\ĉwXkk$)#yiVSIuo`H]5}$FDf!;H C [C*rNw5t .Hb,I '. !RszR+% @DOYjQ0<(xٔj|}hّ ٥eF0]jq pAkm$Rcg'}U u; )BrhO#@I5Jd]X™ u;`.%˲\7K v"J/+C.H^\ @'{[إCk`u ]93wA\^kz*`P$ɷ    7x ܔ zs#x^W Of3͍\]D&puͬxie/6hJ&4g R5f~2엟ol\^Aj7x# R5a6ܟd/?~mGO Od-X0sY/:,Xpxrͦƙ XpUr+ `u͙yy`a< < %\ &*@jg >9&ʓ+HΚ_^NMs֜5g͙`H#'`+,˕`qyv9px~zRxz#Xi-a?ira" By entering the program name followed by a directory name, CD+ will check to see if a valid directory name is given. If not, an error message is generated, and a list (as described in (1)) is displayed for user information. If a valid directory name is given, the user is moved to that directory and the program chain command is executed (default is "SD", Super Directory program, but can be altered, see USER CUSTOMIZATION). 3) "CD+ :" By entering the program name followed by a directory named TERMINATED BY A COLON, CD+ will act as in (2), with the exception that the chain command is NOT executed. 4) "CD+ ?" By entering the program name followed by a single question mark, the directory list (as described in (1)) is displayed for user information. USER CUSTOMIZATION: There are several bytes of user customization that are available. These can changed either at assembly time, or by DDTing (SIDing, etc.) the COMfile: NAMES: (org 012EH) : range 1 - 255 : default = 5 This variable states the number of names to be displayed per line. No dynamic error checking of this value is done, so refrain from setting to a bad value (like 0). BLANKS: (org 012FH) : range 1 - 255 : default = 2 This variable states the number of blanks to insert between directory names on the same line. Again, no error checking is done, so be nice. PWTAG: (org 0130H) : range " " - "~" : deault = "*" This variable is the ASCII value of the character which is prefixed to a directory name to show that it is password protected. If you prefer to have have password protected directories remain hidden, set to the blank character (" "). If this is done, the USAGE MESSAGE no longer refers to the password tag character. Again, no error checking is done, so please refrain from setting to a non-printable character. CLRFLG: (org 0131H) : range 0(FALSE) or 1(TRUE) : default = 0(FALSE) This flag states whether or not to clear the screen before the USAGE MESSAGE is displayed. Note: any non-zero value is considered to be a TRUE. CLRSCN: (org 0132H) : range 8 ASCII characters : default = 0(NUL) This is the string that will clear the user's terminal screen. It can be up to eight characters, but MUST be NUL (binary 0) terminated. CHNCMD: (org 0139H) : range 80 ASCII characters : default = "SD",NUL This is the string that will be the command which is chained to upon program termination. The string MUST be NUL (binary 0) terminated. A NUL in the first character location effectively removes the chain command. Stuart Rose, Mississauga CP/M Plus RCP/M Misssissauge, Ontario Canada. (416)-624-4935 v;CD+11.ASMd  ! #"$&%')(+*,.-/1023465789;:<=>?@ABCDoEFHGIJKLMNPORQSTUuVWXYZ[\_]^acb`N'ΜILe/[sZSN9ۊ8c=\oN18)9#$5#"!U??lfWl,GٛümOWp&A_]VpY~$i^o0U93%/oO#e}YFLed^k޳;设5Mķ)SNoHUk:}żjyzw&o'^]gz}^!gK?O4?ka{7nKW67vzC:DntމoS3=Oқh8S>MاW4ϴ\eKWv2L]wgJ^7z$)yOnn5"XjONoP-9FkR-l> i6֗l&$ޜbyqRrFIzs9eES*y#L_#n:SliO9i:;Aoޜs'm[i)_#"!U??D15zsڶ;KW6_ui-O[ŋS#SzCũ 攼R}wg^̞`ý>?eUiD!yviuW{*ϯ zm+zO_)U,I7ЛӭQl}^(g:˗>eUi^pHzs9um+zOvzC ޾iMuTᲬ>7r~ZSCoNoyi]6_~[g7poO_7Tgb7 ֛_o7כm+?Ӹ=x&Mu_֏۽ޜjy6x&dzRZJ7כi^W_4%/i>ZFp3ȃ`U'Ӻmnzs[g7poO_7Tgb7 xo7PKW6rq{7כSvAo0Ve֙} }34􊾢7eO"Qi۲NOwv?ޝd^ݦrgiӗdЛ䕼Ҷ/h`94í3#Ĩ몿筟MA촮Ca+wfk3tUO_4OқS*ӗl=M촮:m̪L.[yg[?joN_z*]ӧ/m_|{'/m_|{R}/ՙJ^W>j9qÝٸG8;7#N/e|uUO_4O"]כӲ˳٧/m_ɼ6;٧P+nh1L47lzzsʧ?*ym+zO#i^jٖ7ܧ/m_ɼp_oNw=O.g7U 3D]['i7f?$ޜgζJ^_4ŶTM׋m:S۬jMռ)ugV7VmvRlE"Tg$~yWzTE{yڶ=R!R wU]oJ+F{ss(:DJ^o03%jr?jy*y#/koNΛ* % zɗSrxɿMRVύr|]lU~9lt'R bZlR=zijʗKmO99KmO뭳D*Һ*o*r>7nUzɗzs%|RU<\l+lF#HtA׋T/>w95\J3m{sbLo0峃JMwvS=(_`먱"OЛSr4yjN x*z洀9M; AN7$9VTLظu2cKo7790[o18j΀ӲlS>9۽1`TCp]fFI>([@AF5D4x?$zgy0!G#i#eS?}g A8>dQN#=R9[W{20!H4YG?ӈ㑎Pv:V껫 HuD#88Hf?۽ͳv{gyQ qБ&GpqFʇ9 Mp"AF5qcNLpzcFɼ,g,pZv:~lƌyٱgyNR?۽Q#¨gy–bS >_e??۽i F5<#4Era>o[޲4F5(8GE>Y}Zv{n߷ަ /jQ&'EE=BS@sO;Էto@l,G-&=$`TC28)*jA:x9߷{Mj,qjQ&'EE4w"mA7ۜ!8Fq}iD0YjJu _osr̒Q EpҶ4`e/՗T·i F5DԜ8FqiN x*mJU Ϝt4blti4BnyiDDaD&F5XNHgxӴZ7'20!p:D:S] 84pZv{ʿ`{ \xe'\z42/H8D!$GIL_ʗ9-)'8 _18с(00Mdzsrbyij)i@( 2.-Lq|9pᙳחl=k5Um`2rT3g[%z$/o:Sh1L8bz.ӻ3{;AW9=3Fp pr~=g ʰDo{WiMaf8>69*y{-L8>6zO_lF:(ɗD;jqc# pe?QN7Zo؈|Oͭ[4CF~ܝnn޲)m_Qӳs)n+άY:@?DNRLo0w]mywI4?YfpaH,3'o/\T­®zsby8) Ü6쟤7洀T ]WFqP StWvSDI{p(N,DSD|Dрӿz۬r  z:@? ^| =K68bP7 /N *xqjʇTQAEo8) QWtxqjʇuhzi4B/VeUiv2Ͻ7pcȐ348ղX?~prRR}Uiz7Zoab_0S53VKW6_{i03q: ٩zOӚRR}"ްN$fJijpZJO eپ=Mk A&uEt0a̞eUi2r&8]W{ KD')&N}iӴTްN$DfJdI E5l~7,eAp_٦lsA ii{']z-!g"Ne'_L5[o " X磜8N3{ʧrg*yqO{7_t8]['c`3AoAo*?Bg֛ D2,$p}7Bo[>\5٧zO '%a8^k:fz/a}{sbҳ8 a 8IijKu&// QO%筟T{o:8ߙI8t[oĽ7pC49I2ջ9ÜNZ-Iώ# '-{HA~RZ^o:bҳi{']zmN@'h8 a 8L}ʧ?۽_N~ݟ`!Cf'-_b'vZOiu \ǐ!ă78/Lq pUmKW6_Yo#/kzT+{o: y>F'-_t8['>SlY8p_(nN}es \Mβy 83!e'-! Z;(EKI nN\.KXu.`2p!8NJs(#N3Lo0MU9[ŜO#-eq (47V7/ۊ%DZ;ߙ2̔DÉ:D:ó7QL$L'-aJ0 8ղAR>{ZogyD&pl_/[}zjakwO`TgzS>٧;7֛ͭ DaD< rכJ^k7 |TNKI޶|,kONJ!LL4fT3g[%϶+'z09=8BsNV?=Mk7KBz12 3=M>\5Rpʅz.ӻ3{sݦzO \0es:4+]CoXB? 8K1-%g7 Ch8srmKW6_!ްief:ӚSzslӬhwLo0޶nD\oS&;cHX$pZJO(eY}H։G)3ª@*4+Δ+,)2e y۽a.X<" 8)= ,zcy8 a 8NzSyiMzCN\.rj)>۽! D\x. lr+쪿 \,qഖ(U>7&a1NtBT+L|vo'%az8?3L_4879:: Eᢥl#pLl,G7ŜO#Szm?T%! u stNN,[o8)IǟA'-俜筟-wWvoHuBǧ+[rʅpRR}{ DB0g'T7U۽! D\x. -%g7p ip:moYKX?tZoi9=30=DN}7ᦪ_o8) Üΐf r!}U_tu 2mE]Ӽ3 ]W4^pZ)5}z3DipIW6_l˧ &nQa.h1L4z4p R7|9q϶Üw X{×rgiӗd0CTo2K<8+H / 0Czːix8c,L_4ɿu)Aez\o:#`p6q!emmzɿO ~Vq88O^^LzsoH^/UӲS}^o0}O5TͭF"ҧeNzOnK~Y/_\e7[gqR(_nTigްN$Qӿݪ4%7aaLpX"jyziT`ZSf)z DaD< [oqz 3]LjD&pLHgxӴZ7p pzӻ3{ÿ$DN_ƽ7cķ7w]AcZ;7RpʅpRR}{oN\v_l[q0ftUilP<0Lpް~Dap{o:K6LZ '%!rP<0 \oXf:%耓L5luX?d<r(\TiKX_oHut?2t7L c ~ȰL3pTgzE=MjMq ?: E_aWl;fT+,0:z.7pcszqp  \2ĜpepRC䇢zD۽$0Vmޞ=MjMՔ_7wAijf u.cf)zs9v _{s9!y0KR5ӺjfOW.`|T'^nt)ޜ^L'{/b٧zOS0S"͉?^j:{á7'vz`ʧ?ʭNRlR'/{vߧ/m_A~JoNY&Z)z.DTiJ^IZ٧W53eS$mޜW-OR+ZJOm Ao0yvӴ&HzsEf:%耓ӶY϶ KޢfyNz.S~3 Z+ 8?6#H􆓒0=DN}7_oa"O%5ǽ7}7pCYoKo 9fNRL5lNJ!LL83V7 ygrgF32t\'%az8[o>ސo7pc0SNJpmӴZް 9fNKIV=M0Rpʅz.ӻ3{II=d)jura>oަf:N3{ҶWR@pʅpRR}{C dSɫӸc&g3prЬwUi_Tb{Z]'oͽ7pC49aߖޝ)p peB1w N8sQh)>۽!Ս9 E?ju%voQ)®KXUaJai{']z-0qŔFd=]Uc \GŌN g9If{S\oehZ8NJĉL4;rgi:{Coar 3+ʧn=ް~wifO&?۽_Ti/{vٟ-wW6UaJAcS-T' E>[oSr  D=]-{vٟ?۽! D\x. -%g7}NV?={o:lY};ey8!p.KsۼƦ/m_ɼ=kDl\o)-LDZifOS+L2++tItJ>!p DaD< =7{m7|Cpߧ|O{{! \x.ZZ?;?}gK')z:8=yKTi) 8w)=ݪ{{afz:@?d)ifOM5}ۼ _zOS罽ސS.<-?-{vٟޝ 8mlS>mTiZJvoafwRR}}o8) 3%2pᙳ?}g\Sڜ D=]{.Nƽ7z cjYL^ c N8m9(EKI N 8sQh)>۽7F\x. /a}{W=6OɻKmc\o7쐼v _&vZWy]46{WzӴ&4"_|odoxLZc̞izO ]WLdVV鼓LV| 0C։!LxN3{]o4?}otO=M%zt_)ްhifOR?{Zob NdJO^oǸްN$fJijpSzSiM~6{w?D}Tyo7,eAp_٦|ӴTzII=d)'qS Ϝm?^ȳ[<&mNc"̞izO?}g7w NiӲߔKw_wf,0)4+o=Mpߝ@p(_i"=O?{?۽,L wQlyKzCN\.ZJvoHu)EKI ߿1 8sWU 1cttɳ2y~zް!p.KN몿T[U3g[N(WtJ>)_`4ɿޜF˖/$6eYY13qZ§9JU`o DT.rכ8EiDq]*+T6։! pJ5tt_zII=d)'qju=MjMYdVq|Cp:$L%ˇ7|( E_aW%vogYYOɻK^017כS/rwtse?AO9M/U;ʨw{ܡ7l>ӈTԭU#ͭ6R)8zgbuLޞJMכmN8C & s 2gAwɇ۔ޑW,_oa>a ӝTӳxzi轁4C 082aN^oޜސִWRJꚪi٩>TDjzE9ӲS}/Z^o0TM]W]+o;W+2*$&v3MYޜr3#FJxqP q]uoJщH Aǔa 8WT_o 0S U7'Sq YoAlSJ0g4peSz4C t)Eo0-%g7pLi %h p:moYKX?tZo̎ZN pP򪅭7pW}ozs9W_/śחOIijuUu)U?v?>Io`v>%耓ӶY϶ KD\o8) C++pCambtw '%a~3Iʗzrp pExް66m%lް,7l{zs9-?}g[ T_V#7/mH&5mOʗݛ$ݟR]wPxq%/϶}CXFbe۽9ID*[ eٶO#n7eپ͕#FcDZ~pb6Ka zxL_ vo p?}g7K52++O-jdVV8^|$b28cfߖu 1pb/[7?}g7K3Je9N_zۺFo>{o:yN|[zÿ$0d^vlӗ>޶n 0{o:yN|[zR1Z;hfOo0P<0Ӭ`۔/[r7aNΐYpZ§7?۽9ް66m%lް,7l{zs9eKR5Ӻj jzTOTgZJ>_tB ֛_/zd8 a 8-ӕ;ՙ^L%! 8Y&dv3aC'- Kv8ղA~(lw N8sQ/a}{׹ƒNKTmݛ);$]—UOo0`bmW.z2gqi8bJ¶z# xsqb[4Rt$Nxyo`2 +7zAN%[o,30clSY?wIZJ϶fż֛-LxvT­/m_|{y `m S-,0p?1d9=Tb$0,%8m9E.x6Ltw '%a~3Iʗzrɀ CPM2 1(|(*R0 - 2,<,] Common base is above CPM2 RSX. Not loaded.$FBL. o0 AppCPM2 y<(_!45(#45(4!"y 8 !v6#6 {2w8 S| #|+::wO͑:c*t %:(*d"[#s#r!6+6+6>2= :*"d`x*d#s#r!*C".!H3!`K!lW >2!"1 "]: 1 !$  >2s >2v20|y2v2c^#VSf p**p0&N#F>k Ch*t"jSt=2c^#VSl!fx8 Ï; @ E BJ ~#O! [CPM2 RSX active]CxCzC|s *x|(:mE2:lk Ei`8= : " s 1 f>f{ s Zs ]s i>2y22~s Kxx(:l (3Kz6K|9:>i:O:~?<*:v f*KxB [Kz*B P:>f!:(G[|:~ (:>fK3K69?:v2KxC3KzC69<@@ "!@H H  @H$$I  "I $$  A"$D "I "$D@ Jim Lopushinsky March 22, 1984 CPM2 is a CP/M Plus system utility that allows execution of CP/M 2.2 programs which directly access the BIOS disk system. This is the first CP/M Plus utility that I wrote (about 1 year ago). Its purpose is to allow execution of things like UNERA, FINDBAD, NCAT, DU, SORTDIR, and other CP/M 2.2 utilities that would blow up the CP/M Plus system. CPM2 has an attached RSX that is relocated just below the Loader. It intercepts all BDOS and direct BIOS calls, and performs sector deblocking for CP/M 2.2 programs. BDOS function 12 returns 22, so any CP/M + programs that check the version number will not run. In a banked system, the RSX must load into common memory, so there must be enough common memory below the BDOS base (about 3k) to hold both the CP/M loader RSX and the CPM2 RSX. Physical sectors of up to 1k are deblocked. On each disk select, the allocation vector is copied to common memory (maximum size = 512 bytes), so that CP/M 2.2 programs that calculate disk space work. This version requires a Z80 processor. To delete the CPM2 RSX, use CPM2DEL. Enjoy!! Direct any comments to the SYSOP at the Meadowlark RCPM (403) 484-5981 @ 300/1200 baud. <p" Jim Lopushinsky June 24, 1986 Here is a complete description of the fields in the CP/M 3.1 System Control Block, as far as I can determine. The undocumented fields were discovered while dissambling the CCP, Resident BDOS, and Banked BDOS. Digital Research documents the SCB as 100 decimal bytes, but in fact it is 152 or 98 hex bytes long. The SCB occupies the last 152 bytes of the resident portion of the BDOS (just before the BIOS). It begins at xx68h, where xx is the last page in the BDOS; therefore, offset 62h-63h (top of TPA address) is at xxFEh, just before JMP BOOT bios entry. The address of the SCB can also be determined as follows: LXI D,SCBPB MVI C,49 CALL BDOS ;page address of SCB in reg H | | SCBPB: DB 3AH ;this is where SCB address is DB 0 ;get operation To access a field in the SCB, use the above code sequence, then load register L with the field offset as determined from the table below. HL then contains the address of the field. To accomodate RSXs that modify the BIOS character I/O jump vectors (GET and PUT RSXs), a second jump vector for WBOOT, CONST, CONIN, CONOUT, and LIST are included in the SCB. Only the banked BDOS uses these vectors. Each entry consists of 2 3-byte entries which are normally jumps. An RSX can change the first JMP to an LXI H,addr, where addr is the redirected address of the particular routine in bank 1. The second JMP always points to a Resident BDOS bank switch routine which switches to bank 1, calls the routine as loaded in HL, and on return, switches back to bank 0 and returns to the banked BDOS. The banked BDOS always calls these 5 BIOS routines via the SCB jump table. This feature can be used by BYE RSXs for safely redirecting console I/O in RCP/M  systems. OFFSET TYPE Description 68H inst. Warm boot jump vector for the banked BDOS. Normally a jump to the BIOS WBOOT vector, but can be changed to LXI H,wboot-addr to redirect Warm boots to a routine in bank 1. 6BH inst. Jump instruction to resident BDOS bank switch routine for redirected WBOOT. 6EH inst. Console status jump vector for the banked BDOS. Normally a jump to the BIOS CONST vector, but can be changed to LXI H,const-addr to redirect console status to a routine in bank 1. 71H inst. Jump instruction to resident BDOS bank switch routine for redirected CONST. 74H inst. Console input jump vector for the banked BDOS. Normally a jump to the BIOS CONIN vector, but can be changed to LXI H,conin-addr to redirect console input to a routine in bank 1. 77H inst. Jump instruction to resident BDOS bank switch routine for redirected CONIN. 7AH inst. Console output jump vector for the banked BDOS. Normally a jump to the BIOS CONOUT vector, but can be changed to LXI H,conout-addr to redirect console output to a routine in bank 1. 7DH inst. Jump instruction to resident BDOS bank switch routine for redirected CONOUT. 80H inst. List output jump vector for the banked BDOS. Normally a jump to the BIOS LIST vector, but can be changed to LXI H,list-addr to redirect list output to a routine in bank 1. 83H inst. Jump instruction to resident BDOS bank switch routine for redirected LIST. 86H-8FH Unknown. 90H word Bit mapped vector of drives with open files. 92H word Bit mapped vector of drives accessed. 94H-97H Unknown. 98H word BDOS entry point address. 9AH-A0H Used by directory hashing routines. Use Unknown. A1H byte CP/M version. Contains 31H. A2H-A5H 4 bytes for user use. CCP+ as written by me uses offsets A4H and A5H as follows: A4H byte Bit mapped: 0-4 Submit user number+1. 0 = use current user. 5 reserved. 6 $$$.SUB needs to be erased by the CCP. 7 Directory name display flag. 1 = on. A5H byte Bit mapped: 0-4 Load function user number+1. 0= current user. 5 reserved. 6 PRL file load 7 Library member load. A6H-AAH Unknown. ABH byte Submit file drive. ACH word Program return code. AEH byte Base page of RSX containing the 2nd of multiple commands (next to be executed). AFH byte CCP drive. B0H byte CCP user number. B1H word If non-zero, address of 2nd of multiple commands. B3H byte Bit mapped CCP flags: 0 Submit flag 1 RSX flag 2-5 Unknown 6 Set CCP drive/user to current drive/user. 7 Chain flag. Next command is taken from default DMA buffer (80H). B4H byte Bit mapped CCP flags: 0-1 Display command source drive/user. 2 Unknown 3-4 File type search order: 00 .COM only 01 .COM, then .SUB 10 .SUB, then .COM 11 .PRL, then .COM 5 Reset disk system 6 Reset page mode to default 7 CCP is executing (used by ^W recall) B5H byte Bit mapped CCP flags: 0 Unknown 1 Cold start flag (0=cold) 2-7 Unknown B6H byte Console width B7H byte Current console column position B8H byte Console page length B9H Unknown BAH word If non-zero, address of redirected console input characters. BCH word If non-zero, address of next line of redirected console input characters. BEH word Bit mapped console input physical devices. C0H word Bit mapped console output physical devices. C2H word Bit mapped auxiliary input physical devices. C4H word Bit mapped auxiliary output physical devices. C6H word Bit mapped list output physical devices. C8H byte Console page mode (0 = page pause). C9H byte Default page mode. CAH byte Ctrl-H mode (backspace). CBH byte Rub/Del mode. CCH-CEH Used by console routines. Use unknown. CFH word Console mode. D1H word Address of 128 byte buffer in common memory. This buffer is used only during BDOS function calls by the system, so it can be used freely between BDOS calls as a scratch buffer. Also used by the BIOS during warm boot. D3H byte Ouput delimiter. D4H byte List echo flag (non-zero = echo console output). D5H byte Scroll flag (used by console routines). D6H word Address of System Control Block. D8H word Current DMA address. DAH byte Current drive. DBH word Current FCB address (in common memory). DDH byte FCB error flag. DEH byte Same drive flag. DFH byte Current BDOS function number. E0H byte Current user number. E1H word Last directory slot number accessed (first = 0) E3H word Address of FCB for function 18 (search next). E5H byte Function 17, 18 search type (0 = ? in drive code, 0FH = normal search). E6H byte Multi-sector count. E7H byte BDOS error mode. E8H 4 bytes Drive search chain. ECH byte Temporary file drive. EDH byte Error drive. EEH-EFH Unknown. F0H byte Drive door open flag. F1-F2H Unknown. F3H byte Bit mapped BDOS flags: 0-5 Unknown. 6 Single allocation vectors. 7 Expanded error messages. F4H word Date (days since Jan 0, 1978). F6H byte Hour (BCD). F7H byte Minute (BCD). F8H byte Second (BCD). F9H word Common memory base address (non-banked = 0). FBH inst. Error message jump instruction to a routine in the banked BDOS. FEH word Current top of TPA (points to entry in lowest RSX). If anyone has information on any of the "Unknown" fields, please let me know. Jim Lopushinsky Meadowlark RCP/M+ 403-435-6579 (300/1200 baud) vSAPP12.ASMY ! "#$&%'(*)+,-./0123465879:;<=>?@ABCDFEGHIoJLKMNOPQRSTUVXWi5 +?bǼBs\q',TaO\䇟 N r'oegiߋC~wsˈ Vĉ ,\oeCз< >tV ? }?ctȟ{!p/dV pF ϟ',n7+d'o8v >xqĉ+mg剉}-\lu<c. @;>xl =G] ݉ۻ D;F <{ ;Wz/dBq<=lpD\&NVP+û?n /=jt`DuޢdY.PoHIPBoAl|G hGʫ/Lɑo{7uDTrg-/KIV KIi][$!6ERzK")J-|M6ԉPj4i>ƣL\&NV;_П8''+p^ 91bNPnJijt=l?q?+a!NZX7 dYndzO { ;>yۍgl~a;q"R nv!vyc2^`'=4t'R nbǵ_/U'ER~+mm'JU3MĮ^dim?Ow B=,\c ĉJUpS촀wxnǎ yof|S]o'$_-NgG缳(uĉزz`vNؠY:bchj`VMNYt}>;Ibߺ'b+UM!R,oNk Nز0t塟 wk\ ݉-7 ݥuZyc1t'k!NĖYV; W: [(^~vc?6|=Zht!N 8yG([͡0g'b+N<ώoxv u_EM.xn! la\FW(q"NY|iYq',_П8o-ҡނfb?go'tCh#vk\%N/ߒ%FVzAĮ^dD /-ҡނp1Q N_[$C m?ԉBN ]vmO$5x^N]Y8zزoVls$n֓~z1$iKՉ?V 9#v{Ӿ0lFI*Ii0zϪCn~❤w䅍|,'3$q߂زzݟWu}mUˆgL-'-+@6i'opys oݓ6x.Ow֓Ėx͟gs e=titō'Ru"q"V[Jn+vZ}O7"%F%il1]]N>9g~Mx-UܧqC?F") il<Į^dd-Nc3nz~^;Z^N qێ+{Cӎ!DߢdzRّ#+{X[$߰]N[.Ǻ}|~=.oifq! l!D3}|RBrXAvZɋ(uĖaNDqa#^UY>Ll۟Q6]Gl=Il _bIbm}>tm$q߂JU3Mvty/xՋ,~WVV'ĉزz}X}! l'6 Y#$~/gbBA+o")J-yijHl|G5='?o{7ub7)zX'q}IPBoam˳'}|Gb?qgO\5?&onR NĉWЖ' mb;{?{m|T5o&-' mqĮظNIWhKl~?Vu{T5$.eBk'owGbBAq+-YCO7u;m:q"nWVPz![$/vIE{n^5[jF7Ntlsvv^'qxBՅ'&b7n|aĉ6 - 6Blv{Nr\ftS {Fͧ(z/[yV ; ;c8HE~i ;<{<'$vhm3ǝAp/YUY>bHJ_,x',X_ bߺ'b+Ui'c]ssO<|yۺ';tQEsl?ˎ-#܏vi}V:`?_O??»gs.1!Go+y|V;JZ,H"NްߪX,H"vVޟNc^'͟C<^f%* qs( +Y`~,90 B+7uN3GM[Dlws(a"N͡HJ-rS <+jbߺ'b/Cyq+ T6~;- kcO?_nl 2$C;mu\c<}NA<;dbCzDIi|ǂV_U9A&6TAnWVVw 3G$+ĉ8̛?ϊCyl~;n%w̷xS'NiAO8[N;$v{"$B;NlY=ֺ֓@%6'OvZԋͣزz]tq[) +YbT7&6г|'6'CzJU3)F<[j 2lj ߉~ gbߺ'bߺ1q[JU3݉]-/J^^x;'!soUtĆ*w;-͟g*˧+OlYOiG͟ClX8hg=Nl~S-1[jVnJU3݉ T7&v{"v ߉ۺVNEn~â-'Ў[jFحT5"RՌnحT5 7Dl9Ilߢ#6FؘMWzZE Fl9Ilߢv1 $oQ!RՌnݒJU!b+U膉wOV"$oQMJ^DT2TA-x~ ?vy U';-ŝ/O+YN[zZ֓-j0b @l9Il [jF7Il|@l&bݘMqX @l9Ilߢ!bCdLlYONbIbkb @&W_a8'b%zn U'Nja%IbnXi'y\oHlYoBlv{Nrr!RՌnzٰcxrY~ $~Q#jGBanz!6[MuOVM!v xnzP8B[DlbPH o#uOvZ}QKՉ#7[jVnظ{1'5~Q>[Vn/ظ{"R >^#q[DlZ}GD qd9INE #v{"vĖƯB[Dz; =[$ Ć*ȓV^<n ja~8'zaO{"6F1žDlYofbc q"Ni8yr.xnn~߰c<@DJ-JQNY}r<@b+Ui'o99';=i3jY:b׋IZ(i?vyĮ^ddEӳߟr[(i8mor1bCzd l{+T'v;db+U i9A>qZ6bm5nJ OnR z ;my诇8'x=g'!NoU,z7c,#RՌn_[jnJU3Ib%R,oدP'DX(YjF7iWUsjG^bb+U򆈭T5Dl}[jnدP'Dy98mEX{8,k7GA[2!VzA%cm+]G_^\2!%aZ-kk] G~d=B[FJ#ZE⒱oQPX{X_/k'x0W8c^"PQ2!d #Kd #JXFR2!ƯR2!FRd #FV2ֆd=BX2!T2ֆiϲnfp7}&R2ֆiϲnfp?qĉ8_П3jG{X5v0Wz>"\q>Ym0`s<{9ggcy)O%Vi{+kB'x'{+ AزaJo˓O\@b7)vڦeĉVVJy{b vZ]|"}@xv{ ]> ([Nglē|@xvIn>=itنϲnfp?nTX~ϡۧvsߏm?xU58t骮y kws+-YjN|v'ܡI[jnwbBAӾg7x|m'NX8%+#._ Ӿgo8q;FvZtiΠ E3?C vj|"Dv<l1.ow{g9qU'bK,;-Usx作; kdEz!.v~?x?>[bdYnڰgz}غ@~"qC?߹k?ĖYVm?[_TĖYV-i%NE%KEӢl  ;bW/2ӆϡ[@b7FRVVظ}p^93uE Ȳ`HlY=ݞFb dN+1E{gn9nzFRVV# PnȊVc9s-MHʪjаc?[bdY[CO/BKVi?#p/k?w'r~፤Z; ;<3kN3jVM!n*H2[b'roאb7UUkjаc'>)$x~랈'Eh_/69"#biӝ 7}&VU W7K!"^$vZ/i!NHʪ-"#;{:mC>'B=,JYx% Dp n7U]?6|uC0۝ oTHI==  dm@W(qZC>g>˺!N_xX8Ť[$vڰГ^\~Խ&R ni>}z:-{Xi;x6K +ĉ8m|;Am79޶;AmVu};>}z:-{Xi;>y[Ie/.?v'$NĖmi Wu}}z:-{XiDl`vZU=pDbN{{KՉ;􋈭BȇdUǵ_/U'ER~+m'/VЪHW(q"N+p'U]ssX[ :'NiGqU.q;;3'bYn,k\q_/U' P%c;dž`79nTH,+ڒ6N+!NRu"q"tucXf>˺!Ru"m,kiϲnfpsKՉē.ЖavZ賬_/U''bZhK0;G܆ϲnfp?kqEXf-e6|uC0۝ xjv8q >yC?a'ē.ߢd|~}'}mm~`[-҆}ܝn<w,9eĮ^%j-\ !?7Չ/&.W") _GbIbWi ^Nܡ{Kl`0;>;>}z:-{Xi;>y[Ie/.?v'$NĖmi Wu}2%> |7^#V"! ~#fo: >2~>2  Read, $: (Pre-sorted) Write, >2*" !"* #"! " [*0 * #" !S: , &8 3* " *+"| !" + Read error + 7+ Write error + 7"DM* )D}2 !"Ϳ~(6#6#6#[ *#8ɯ2Sort, *#"! "! "*"} *#}o|g"!""- x """~G # x >0<>2Fwx# x *|/W}/_*0#"**{ozg"*#""*}|ڻ**!"Ϳ ~08! 02#~$ #~$ #:w+6$+6$+6$*#* #8))))) ~#_|g}o}o|g """~G # x 2!2!i`>2 <2 Ø2 y2  : <2 : 2 : 2 : 2 : (5=2 : ! (: ": ! 4~!8 * #" 2 2 2 <2 2 :G: !( 0)2 " ! ~6(": ! : ! : ! ($: K: 2 * " : 2 : ?2 * * : >2 :  : 2 K: W> 2 W>2 * "#> : o&"#*"%>}2 "#> !"#> >2">ɯ2 <2 2 :G: !( 0)2 " ! ~6(": ! : ! : ! ($: K: 2 * " : 2 : ?2 * * : >2 :  : 2 K: W> 2 W>2 * "#> : o&"#*"%>}2 "#> !"#> >2">ɯ2 <2 2 :G: !( 0)2 " ! ~6(": ! : ! : ! ($: K: 2 * " : 2 : ?2 * * : >2 :  : 2 K: W> 2 W>2 * "#> : o&"#*"%>}2 "#> !"#> >2">ɯ2 <2 2 :G: !( 0)2 " ! ~6(": ! : ! : ! ($: K: 2 * " : 2 : ?2 * * : >2 :  : 2 K: W> 2 W>2 * "#> : o&"#*"%>}2 "#> !"#> >2">ɯ2 <2 2 :G: !( 0)2 " ! ~6(": ! : ! : ! ($: K: 2 * " : 2 : ?2 * * : >2 :  : 2 K: W> 2 W>2 * "#> : o&"#*"%>}2 "#> !"#> >2">ɯ2 <2 2Documentation for SAPP v 1.2 Sort & Pack Directory for CP/M Plus 10/23/85 This program works with CP/M 3.x and may also work for MP/M, although it has not been tested on the latter. It will NOT work for CP/M 1.4 or 2.x. This version for CP/M Plus is a collage of the routines from SAP44.ASM which was for CP/M 1.4 and 2.x and from CPM22E.ASM, a CP/M 2.2 Bios emulator RSX for CP/M 3.x. Many thanks to those people who worked on the code for those programs. Some labels were changed, some routines moved for clarity, some compacting of the two sets of code was done including utilization of Z80 code in SAP routines to keep the program size down, etc. This utility reads the disk directory tracks, sorts the entries alphabetically and then rewrites them them back to the disk. All unused or erased areas on the directory tracks are reformatted with continuous 'E5' characters. This completely removes previous file names from the directory which have been deactivated. Files of zero length, with the exception of files beginning with "-", may be also be deleted. This is an assembly-time option, supportting disk labeling for the catalog program MCAT. Normally, zero length files are not deleted. Sorting the directory in this manner offers many advantages. Some of them are: 1) Allows standard 'DIR' to show an alphabetized listing. 2) Eliminates potential problems with "UNERASE" programs, (eg, U3-102 for CP/M Plus), by removing programs with a similar name that have been previously deactivated. 3) Speeds up access via 'SD' and other special programs. 4) Assists on working directly on the disk with 'DU', etc. 5) Removes files from the disk directory that somebody else could recover. (The data is still out there somewhere, but its old location is no longer in the directory). TO USE: A>SAPP B: B: in this case indicate the desired disk to be sorted and repacked. If a disk is not specified, then the logged on drive will be sorted. If your system utilizes a search path for files, then with SAPP set as a system file, you could also use the following format to sort and pack the the B drive. B>SAPP to sort the B drive if your system uses a search path. CONDITIONS FOR USE AND ODDITIES: Very few user selectable options are available. Set them as appropriate for your system and make the change in SETUP if desired. On my CP/M Plus system, a Morrow MD-11, the hard disk has the capacity of 2048 directory entries. This is a value of 07FFH for the DRM value. Because of this directory capability, and available memory, I am unable to sort and pack the entire directory because the buffer in SAPP would exceed available memory. As a solution to this, I stuff an arbitrary smaller value into the DRM value in the SETUP routine only when doing the hard disk. With normally about 400-500 active entries, there may be so many more that were erased, so to sort less than the maximum is no problem for me. If your disks have a capacity less than 2048 entries, or if you have more memory available, then you can remark out that re-stuffing of the DRM. See my suggestions below, too. To calculate the maximum space needed for the SAPP buffer, divide the (DRM value +1) by 4 and multiply by 128 (bytes). The result is the total number of bytes used by the buffer in SAPP. Another oddity for the Morrow is that for each unused directory entry on the hard disk, such as when newly formatted, the RC (record count) byte is set to 00H, with the other 31 bytes being E5's. This is one of the user options. Set it to 0E5H if your system doesn't do this. For floppies on the Morrow MD-11, it has all E5's. I don't know how the Morrow would like all E5's for empty entries on its hard disk so I will stay with their "norm". This program should be usable on other CP/M Plus systems, but you will have to do the final testing. I suggest using a floppy drive for such tests. (I trashed my hard disk twice before I decided to use the floppy for further tests.) The source should be assembled with MAC and Z80.LIB must be available else you may have to include your own macros. SUGGESTIONS: To eliminate the problems associated with directory capacity and available RAM, it would be nice if this program would read the directory to a file (on an alternative, user selectable, drive), sort that file, and then write the sorted file back to the appropriate directory, and then allow the sorted file to either be deleted, or to remain for future use and reference when using utilities such as DU. I am not that energetic, nor do I think I am capable to writing the added code from scratch to do this. Just give me pieces of this and that routine and I shall stick them together, or let me do some minor changes or improvements..... I am still trying to learn. This version is just a start, and at present it suits my needs. Hopefully others may be able to improve upon it, and if so, please dump the upgraded versions back onto CompuServe, if possible. In the public domain.... George F. Reding [72436,45] 6,45] SIDRSX11y SJ *J#~2I#~%?V!ʭ>?8> #[J > #A:IA!6!Mq 'R|(Ͷ5 6> # x F> #SAO :IAA<2I A:IAO!M[FM!I!L65 N(Z43~#"(=F(,(N ·ON(yF(x2I~2(# x($5(#  x(:w=ѯ:w|}> 80:88%0 8 87ɷ!"#!#,(o#o+7[#>a{_0:Я_ 㯆#8@!@I DA B"!H SIDRSX.DOC ---------- Documentation for SID.RSX v1.1 E. Meyer - 06/86 SID.RSX is an extension that adds to the usefulness of the CP/M Plus debugger program, SID. It is attached to your copy of SID.COM using the GENCOM utility, as follows: A>gencom sid.com sid.rsx Once this has been done, SID will continue to operate as usual, except that there are now new commands available, features I have sorely missed in the past: you can search through memory for a string of bytes, and you can change a string of bytes all at once. Both commands accept any mixture of hex and ASCII data. The new commands ("?" and "!") use characters not previously recognized by SID as commands, and are typed in at the SID prompt ("#") just like the built-in ones. In the event of a syntax error, they will return the usual cryptic error message ("?").  STRING FORMAT The "string" arguments for these commands can be an arbitrary sequence of hex and/or ASCII data. ASCII data is case sensitive, and must be enclosed in double quotes ("), except that no closing quote is needed if no hex data follows. To include a quote (") you must specify it as hex 22. Hex data (digits 0-F) may be upper or lower case, one or two digits. Commas (,) to separate bytes are optional; when omitted, each pair of digits will be treated as a byte. Examples: "String" OR "String 8D,0A OR 8d0a OR 8dA OR 8d,a String input that violates this format (about the only way to do this is to use invalid hex digits) will cause an error. 1. STRING SEARCH - "?" This command finds a string of bytes in memory. Examples: #?21,6,0 find bytes 21,06,00 hex #?"DIGITAL find ASCII string "DIGITAL" #?"Error"0d0a find string "Error" followed by hex 0D,0A  In each case, if any occurrences are found in memory, the starting addresses will be displayed in hex. (If not found at all, nothing will display.) Example: #?"DIGITAL 0160 E908 F35E F72E # SID.RSX is smart enough not to report its own copy of the search string as a match every time. But one peculiarity remains... for a pure ASCII search (no hex bytes) there will always be a match found, in the string buffer in SID itself (and/or the BDOS) used by the BDOS 10 call that got the command from the console. (On my system, I always get a match at E908 and F72E, as shown above.) 2. STRING CHANGE - "!" This command changes a string of bytes in memory. You must specify a starting address (1-4 hex digits), then a comma (,), then the string of new values. Example: #!2a7c,":"1a Change two bytes at 2A7C to 3A,1A Nothing displays if the command is successful. Example: #d8b0,8bf 08B0: 00 00 00 00 00 00 00 00 .......... #!8b0,22"Hi"22 #d8b0,8bf 08B0: 22 48 69 22 00 00 00 00 "Hi"...... # Not only does this give you a way of entering ASCII strings directly; it is also faster than using the SID "S" command to enter a sequence of hex bytes. NOTES: Don't attach the RSX to SID more than once (which GENCOM will let you do); multiple copies waste memory. Keep a backup of plain SID.COM somewhere. Otherwise, if you ever need to remove SID.RSX from SID, you can do it as follows: A>SID SID.COM CP/M 3 SID Version 3.0 NEXT MSIZE PC END 2400 2400 0100 ???? ;(NEXT is 2080 if no RSX) #m200,2400,100 ;get rid of the RSX header #wsid.com,100,207f ;chop off the RSX at end #g0 --- Eric Meyer, 427 N. Washington, Bloomington IN 47401 --- 07f ;chop off the RSX at end #g0 --- Eric Meyer, ;--------------------------------------------------- ; ; STAT30 RSX PROGRAM, Ver. 1 ; Written by David Krasner ; and Martin Murray ; April 1984 ; ; System Solutions ; P.O. Box 35972 ; Dallas, Texas 75235 ; ; (214) 351-6117 ; ; Released to the Public Domain on 4/9/84 ;--------------------------------------------------- ; --- BDOS Function Equates --- curdsk equ 25 ;get default disk getadd equ 31 ;get DPB address getalo equ 27 ;get the Allocation Vector getfre equ 46 ;get number of free sectors scbf equ 49 ;get the SCB sdmaf equ 26 ;set DMA ;--------------------------------------------------- ; --- RSX prefix --- serial: db 0,0,0,0,0,0 ;cpm compatable start: jmp test ;start of program next: db jmp ;jump instruction to next dw 0 ; module in line (BDOS?) prev: dw 0 ;previous module remove: db 0 ;remove flag = remain bank: db 0 ;bank flag = both types rsxnm: db 'STAT30 ' ;rsx name (8 chars.) loader: db 0 ;loader flag = normal rsx db 0,0 ;reserved area ;--------------------------------------------------- ;program test for interception test: mov a,c ;put function in C cpi getalo ;is it function 27? jnz next ;no--pass to next in line ; --- Mainline --- ;save user's stack lxi h,0 ;save user's dad sp ; stack address shld savstk ; and set up lxi sp,stak ; RSX's stack ;save user's dma lxi h,scbpb+1 ;point to SET in scbpb mvi m,0 ;set for get operation dcx h ;point to OFFSET in scbpb mvi m,3ch ;offset for current DMA xchg ;put scbpb addr. in DE mvi c,scbf ;function 49 call next ;get current dma from BDOS shld savdma ;save user's dma address lxi d,dma ;RSX's dma set push d ;save dma for later use mvi c,sdmaf ; via function 26 call next ;set RSX's dma (BDOS) ;get the required parameters from the DPB mvi c,getadd ;function 31 call next ;get DPB address from BDOS inx h ;point to BSH inx h mov a,m ;get BSH sta bsh ;save it inx h ;point to DSM inx h inx h mov e,m ;move DSM into DE inx h mov d,m xchg ;now into HL shld dsm ;save it ;get the number of free sectors mvi c,curdsk ;get default drive call next ;BDOS function 25 mov e,a ;put in E mvi c,getfre ;get disk free space call next ;BDOS function 46 pop h ;get back dma address ; (dma contains the amount ; of free space in sectors) ;calculate free blocks mov e,m ;get LSB into E inx h mov d,m ;get MSB into D inx h mov a,m ;get HSB into A push psw ; and save it xchg ;free sectors to HL call blocker ;number of blocks xchg ;save block count in DE pop psw ;get HSB back mov b,a ;put it in B loop: mov a,b ;put HSB into A ora a ;is it zero? jz create ;yes--jump dcr b ;decrement HSB lxi h,8000h ;10000h records for every ; count here, so do it call blocker ; twice and make it blocks xchg dad d ;add to previous block dad d ; count as true value xchg jmp loop create: lhld dsm ;get DSM and increment inx h ; to a physical value lxi b,alv ;point to ALV with BC nxtbyt: push b ;save ALV pointer mvi c,8 ;set bit counter nxtbit: mov b,a ;save A mov a,e ;is the free block ora d ; count zero? stc ;set C flag jz notfree ;jump--free block zero cmc ;reset C flag dcx d ;decrement free block count notfree: mov a,b ;restore A ral ;rotate it with carry dcx h ;decrement DSM count mov b,a ;save ALV byte mov a,l ;is the DSM ora h ; count zero? mov a,b ;restore ALV byte jz fill ;jump--DSM zero dcr c ;decrement bit counter jnz nxtbit ;continue bit making pop b ;get ALV pointer stax b ;save ALV byte inx b ;increment ALV pointer jmp nxtbyt ;continue byte making fill: dcr c ;decrement bit counter jz exit ;finish creating A.L. table ral ;move the significant bits jmp fill ;continue ; --- Exit to User Program --- exit: pop b ;restore ALV pointer stax b ;save ALV byte lhld savdma ;get user's dma address xchg ; back and restore it mvi c,sdmaf ; via function 26 call next lhld savstk ;get user's stack address sphl ; back and restore it lxi h,alv ;point to ALV address ret ; --- Support Routines --- blocker: lda bsh ;load bsh as counter hlrotr: push psw ;save counter sub a ;clear C flag mov a,h ;load MSB rar ;rotate it mov h,a ;put it back mov a,l ;load LSB rar ;rotate it with carry mov l,a ;put it back pop psw ;get counter back dcr a ;decrement it rz ;return if done jmp hlrotr ; else continue ; --- Data Area --- bsh: db 0 ;block shift factor dsm: dw 0 ;disk size maximum savdma: dw 0 ;user's DMA address savstk: dw 0 ;user's stack address ds 10 ;5 level stack for RSX stak: ;common data area for work and allocation block scbpb: dma: alv: ds 256 y of the "Unknown" fields, please let me know. Jim Lopushinsky Meadowlark RCP/M+ 403-435-6579 (300/1200 baud) ROMN48 FONk 7ROMN54 FONpX nvROMN60 FONQk eROMN72 FONK @ɀSTAT30  STAT30 now present Copyright 1984 by System Solutions P.O. Box 35972, Dallas, Texas 75235 $STAT30 y !9"1!6+6<1 "  ##~2###^#V" _. ^#V#~Gxʆ!s*#G{7ʙ?x+G}xʭ Í ʵí* *!:|g}o=$AB"A"  DOCUMENTATION FOR STAT30, Ver. 1 by David Krasner and Martin Murray (as of 4/9/84) STAT30 is an RSX (Resident System eXtension) designed for banked memory systems running CP/M Plus. Its purpose is to correct the problem many CP/M 2.2 and earlier version programs have when running under CP/M Plus -- incorrect free space remaining reports. This problem is caused by the fact that when a function call 27 is made to the BDOS, requesting the address of the allocation vector, the BDOS returns pointing to an address in Bank 0 (the first bank) of memory, a bank that is essentially inaccessible to programs running in the TPA. The 2.2 program continues to run, thinking it is actually analyzing the true ALV, and produces erroneous results (153k free on a disk that you know only has 2k free!). Once loaded, STAT30 remains in memory until a system reset. It intercepts each call to the BDOS from the calling program, and determines if the call is a request for the address of the allocation vector (27). If not, it passes the command on to the BDOS (or the next RSX). Otherwise, it makes a call to the BDOS asking for the number of free sectors remaining on the default disk (function call 46). Finally, it creates a section of memory designed just like CP/M's allocation vector, indicating the proper number of used and free blocks. It then returns to the calling program pointing to this fake allocation vector. Please note: if your program needs to know the exact location of the free/used blocks, this RSX will only confuse it. But then, that program probably cannot be run on a banked CP/M Plus system, anyway. Most programs tested have responded very favorably to this RSX and have produced accurate results. However, a list of programs that DO NOT benefit from the help that STAT30 provides is below: NCAT.COM  If anyone else picks up this documentation and program, please add any other programs known to not work with STAT30 to the list above. Hmmn...perhaps even a list of programs that it DOES work with would be in order... If you would like more information, please contact: David Krasner or Martin Murray Write: SYSTEM SOLUTIONS P. O. Box 35972 Dallas, Tx. 75235 or Call: (214) 351-6117  P. O. Box 35972 Dallas, Tx. 75235 or ROMNF10 FON  ROMNF11 FONz !ROMNF12 FONC $ROMNF14 FON-E |2ROMNFB6 FONEf {ROMNFB7 FONh ROMNFB8 FONj ROMNFB9 FONl ROMNFB10FONEQ A ROMNFB11FONNS >#ROMNFB12FONdU  &ROMNFB14FONX p4; SYNonym Create a synonym for a command line ; REQUIRES CPM PLUS OPERATING SYSTEM. ; THIS VERSION IS OSBORNE EXEC SPECIFIC. ; ; Copyright 1986 by Gordon Wilk ; 6707 Springpark Ave ; Los Angeles CA 90056 ; Released for private non-commercial uses without fee ; ; USAGE: SYN ; NEW COMMAND: enter the name by which the command ; is to be called. Do not add .COM ; TO MEAN (command line) ; > enter the command line which is to be executed ; ; the command line may, optionally, include parameters ; in the form &n where n may be a single digit 1-9. ; Parm 0 is the cammand name, really.. ; ; EXAMPLE SYN ; NEW COMMAND: cc ; TO MEAN (command line) ; * > c &1!rmac &1!link &1,&2,clibrary ; The new command CC FOO BAR will compile the C program ; called FOO, assemble it and link it to BAR and the C ; library. ; ; The command line syntax differs from that of SUBMIT ; 1. The < marker for program input is not supported. ; 2. The parameter marker is & not $  ; && works the same way $$ does in SUBMIT ; The & marker may be changed by reassemblng ; ; If the command exists it may be modified using the CPM+ line ; editing facilities. ; ; EXAMPLE OF MODIFICATION ; SYN ; NEW COMMAND cc ; ; This command exists. Modify it? Y ; ; <-- --> DEL Del/BS BOL/EOL DONE ; ^A ^F ^G ^H ^B ; ; OLD command to edit ; * > c &1!rmac &1!link &1,&2,clibrary ; ; The CPM3 editing controls will be displayed along with the old ; command line. the cursor will be placed at the end of the line ; which may be changed. If you answer anything other then "Y" to ; the "Modify?" question SYN will ask for another command name. ; ; If the command named is not a SYN file you will be told and the ; program will request another name. ; ; Nine parameters of up to 14 characters each are allowable ; identfied as &1 &2 ... &9. ; Parameters entered in SYN may contain argument calls. ; The "meaning" comman d line may be up to 128 characters long ; ; Parm 0 is the name of the new command as an 8 character ; blank padded string ; ; * THESE LINES WILL CAUSE HARMLESS ERROR MESSAGES WHEN ; ASSMEBLED WITH MAC ; ;------------------------------------------------------ ; VERSION ; 0.1 Original version ; 1.00 First release version ; 2.00 FOG release 9/86 ; ;================================================================ ; EQUATES ;================================================================ ; ; BDOS LOCATIONS BOOT EQU 00 ;warmboot BDOS EQU 05 ;BDOS call MEMTOP EQU BDOS+1 ;top of memory ; ; ASCII CONTROLS LF EQU 0Ah CR EQU 0Dh TAB EQU 09 BELL EQU 07 ; ; MEMORY LOCATIONS FCB EQU 05CH ;adr of default fcb fcbEX EQU FCB+0CH fcbCR EQU FCB+32 DBUFF EQU 080H ;adr of default dma bufMX EQU DBUFF bufNC EQU DBUFF+1 bufDAT EQU DBUFF+2 ; ; BDOS CALLS OPEN EQU 15 CLOSE EQU 16 READ EQU 20 WRITE EQU 21 MAKE EQU 22 CHAIN EQU 47 PARSE EQU 152 ; ; *** THE NEXT ITEM IS SPECIFIC TO THE OSBORNE EXEC *** MltIO EQU 0F8E6h ;SCB multi-sector count ; ; ARGUMENT MARK CHARACTER ARGMARK EQU '&' ;May be changed ;================================================================ ; MACROS ;================================================================ ; ;Print the $ terminated string at MSG PRINT MACRO MSG LXI D,MSG CALL PSTR ENDM ; ;Get a string of length LENGTH from the console to BUFFR REPLY MACRO BUFFR,LENGTH LXI H,BUFFR MVI M,LENGTH XCHG CALL GETS ENDM ; ;BDOS file calls FILE MACRO FUNC,PNTR IF NOT NUL PNTR LXI D,PNTR ENDIF MVI C,FUNC CALL BDOS ENDM ; ;Set for multi-sector read/write SECTORS MACRO NUMBER MVI A,NUMBER STA MLTIO ;;SCB.Multi-sector count ENDM ; ;Move LENGTH bytes from SRC to DEST BLKMOVE MACRO SRC,DEST,LENGTH LXI H,SRC LXI D,DEST LXI B,LENGTH DB 0EDH,0B0H ;z80 LDIR ENDM ; DJNZ MACRO JUMPTO DB 10H,JUMPTO-$-1 ;z80 DJNZ ENDM ;================================================================  ; MAIN ;================================================================ ORG 100H LHLD MEMTOP ;Stack at top of memory DCX H SPHL ; Ask for new command name and get a reply. ; Add '.COM' to the name in the dma buffer. ; START: PRINT ASK$NEW ;What is new command? REPLY DBUFF,8 ; into 80H JZ BOOT ;IF no entry, just quit ;ELSE move LXI B,5 ; 5 chars XCHG ; to 1st byte after name LXI H,QCOM ; from ".COM " DB 0EDH,0B0H ;z80 LDIR ; File name is in dma buffer. Check to see if it exists. ; If it does, ask to modify or start over. ; FILE PARSE,PFCB ;Parse into FCB BLKMOVE FCB+1,PARMS,8 ;and place in parm0 FILE OPEN,FCB ;See if it exists INR A ;IF it does JNZ FILEX ; ask about modification ;ELSE new command PRINT ASK$COM ;What command ? REPLY COMmx,128 ; into buffer space of new program JZ BOOT ;IF none abort FILE MAKE,FCB ;ELSE create and JMP DO$WR ; write the new file ;---------------------------------------------------------------- FILEX: ;MODIFY FILE ; The command file exists. ; Ask whether to modify, if not, go get another name. ; PRINT ASK$MOD ; Modify it? CALL YESNO ;IF reply=NO JNZ START ; ask for new name ; ELSE read old file CALL RD$COM ;get command and SUB A ;Set cr to first STA fcbCR ; record for re-write ; ; Show the old line and accept edit to COMLIN PRINT SHO$OLD ;OLD command to modify msg LXI D,COMmx CALL GETEDIT ;Edit it ;; jmp do$wr fall through to DO$WR ;----------------------------------------------------------------- ; Now write 4 logical sectors, 512 bytes, into the new file. ; This includes both the new program and data area. ; DO$WR: PRINT CRLF LXI D,NEWPRO ;Set buffer to new program area CALL SETBUFF SECTORS 4 ;write FILE WRITE,FCB ; 4 secs FILE CLOSE,FCB ; close JMP BOOT ; and quit ;================================================================ ; SUBROUTINES ;================================================================ ;Read an existing file and verify that it was created by SYN RD$COM: LXI D,NEWPRO ;Overlay the NEWPRO code CALL SETBUFF ; with the file read SECTORS 4 ;4 sector FILE READ,FCB ; read ; Parm0 must be filename ; Check the first char only LDA PARMS ;char 1 of parm0 LXI H,FCB+1 ;->char 1 of filename CMP M RZ ;IF match OK return PRINT NOT$SYN ;ELSE not a SYN file BLKMOVE QSYN,DBUFF,4 ; restart program MVI C,CHAIN ; from scratch jmp BDOS ; by chaining ;---------------------------------------------------------------- ;GETEDIT edits string @(DE) ;GETS gets string to (DE) ;RETURN: DE = A = LENGTH and flags set ; HL-> EOS null termination ; GETEDIT: PUSH D ;save buffer adr CALL SETBUFF ;set DMA adr there MOV D,A ;set DE=0 for edit MOV E,A JMP GETS$2 ; GETS: PUSH D ;save buffer adr GETS$2: MVI C,10 ;get string (DE) CALL BDOS POP H ;HL->buffer INX H ;HL->count MOV A,M ;A = LENGTH MOV E,A ; MVI D,0 ;DE=length DAD D ;HL->last c!har in string INX H ;HL->EOS MOV M,D ;NULL terminate ORA A ; and set flags RET ;---------------------------------------------------------------- ;Return with Z flag set if reply = Y ; unset if not YESNO: LXI D,YNBUFF ; Line input MVI C,10 CALL BDOS LDA YNBUFF+2 ANI 05Fh ;upper case CPI 'Y' RET YNBUFF: DB 1,0,0,0 ;---------------------------------------------------------------- ; The routines below return directly from BDOS; saves a byte ;---------------------------------------------------------------- ;Console display string PSTR: MVI C,09 ;display string pointed jmp BDOS ;to by DE ;---------------------------------------------------------------- ;Set buffer address SETBUFF: MVI C,26 ;Set DMA buffer jmp BDOS ; to (DE) ;================================================================ ; DATA for SYN ;================================================================ ASK$NEW: DB CR,LF,LF,'NEW COMMAND: $' SHO$OLD: DB CR,LF,LF,27,41 ;Terminal control: DIM DB TAB,'<-- --> DEL Del/BS BOL/EOL DONE',CR,LF DB TAB,'^A ^F ^G ^H ^B ' DB 27,40 ;Terminal control: BRIGHT DB CR,LF,LF,'OLD command to edit' CRLF: DB CR,LF,'$' ASK$COM: DB CR,LF,'TO MEAN (command line)',CR,LF,'>$' ASK$MOD: DB CR,LF,'This command exists. Modify it? (Y/N): $' NOT$SYN: DB LF,LF,'** Not a SYNonym file **',BELL,'$' QCOM: DB '.COM',0 QSYN: DB 'SYN',0 PFCB: ;Parse control block DW DBUFF+2 ;Name starts at 2nd byte DW FCB ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;============================================================= ; This is the NEW FILE to be created ;============================================================= ; Move the command line data from COMLIN to the ; default dma buffer and chain to it. ; OFFSET adjusts addresses to their runtime locations ; because MAC does not have .phase/.dephase ; NEWPRO EQU $ OFFSET EQU $-100H LHLD MEMTOP ;set up stack DCX H SPHL ; CALL GETARG ;Get args into parm list ;Move the command LXI H,COMLIN-OFFSET ; from LXI D,DBUFF ; to CALL MOVE ;Do it STAX D ;Terminate with 0 MVI C,CHAIN ;CHAIN to program JMP BDOS ;====================================================== ; SUBROUTINES ;====================================================== ;GETARG moves arguments from the command line to the ; appropriate PARM slots. ; GETARG EQU $-OFFSET LXI D,DBUFF+1 ;Source LXI H,PARMS-OFFSET+16 ;Destination step over parm0 LXI B,16 ;Parm increment FNDARG EQU $-OFFSET ;Find an argument LDAX D INX D CPI ' ' ;IF a space JZ FNDARG ; keep looking RC ;ELSE IF < space; quit ;ELSE we have found an arg PUSH H ;Save adr of parm slot ARGLOOP EQU $-OFFSET ;Move chars until end of argument MOV M,A ;move char to parms INX H ;increment destination LDAX D ;Get next char INX D ;Increment source CPI ' '+1 ;IF > space (more to copy) JNC ARGLOOP ; loop POP H ;ELSE restore HL->parm slot  ORA A ;IF null RZ ; quit DAD B ;ELSE HL = HL+16 next slot JMP FNDARG ; loop ;---------------------------------------------------------------- ;MOVE is a recursive macro processor ; HL-> source string ; DE-> destination in the command line buffer ; Characters are moved (HL) to (DE). If an ARGMARK is encountered ; HL is saved, the address of the stored argument placed in HL and ; MOVE is called recursively to move from the stored argument ;Stops at a NULL byte in source. ;Return: A=0 DE->EOS. ; MOVE EQU $-OFFSET MOV A,M ;A = char INX H ;point to next char ORA A ;IF 0 then end of string RZ ; so return CPI ARGMARK ;ELSE IF not an argument marker JNZ MOVE2 ; move the character MOV A,M ;ELSE get next char INX H ; and pt to one after that CPI '0' ;IF < '0' not an arg number JC MOVE2 ; move it CPI '9'+1 ;OR IF > '9' not an arg number JNC MOVE2 ; move it ;ELSE it is an ASCII digit SUI '0' ; ASCII to binary ; A=Argument number which multiplied by 16 is list index. ; Save HL and replace it with the argument address. ADD A ADD A ADD A ADD A ; X16 for length of arg PUSH H ;Save adr of next char MVI B,0 MOV C,A ;BC = adr list offset LXI H,PARMS-OFFSET ;HL = base of arg list DAD B ;HL = adr in arg list CALL MOVE ;Move RECURSIVEly from arg list POP H ;Restore source adr JMP MOVE ;and start over ; MOVE2 EQU $-OFFSET STAX D ;Move to destination INX D ;Point to next chr in dest JMP MOVE ;Loop for next char ;=============================================================== ; DATA for NEWPRO ;=============================================================== PARMS: DS 10*16 ;parameter space COMmx: DB 128 ;max chars accepted COMnc: DB 0 ;nr of chars entered COMLIN: DS 128 ;command line buffer END 100H ace COMmx: DB 128 ;max chars accepted COMnc: DB 0 ;nr of charCPM3SCB DOC d#SAPP12 AQM m*SAPP12 COM x SAPP12 DOC {"*+!6!!]e\<\!6\{͟2|>2\\>2\:e!]!/W_ #~_#r :_Y  NEW COMMAND: $ ) <-- --> DEL Del/BS BOL/EOL DONE ^A ^F ^G ^H ^B ( OLD command to edit $ TO MEAN (command line) >$ This command exists. Modify it? (Y/N): $ ** Not a SYNonym file **$.COMSYN\*+! 9/!x w#!) ~#&c~#0c:c0O!h 999CPM3SCB DOC d#SAPP12 AQM m*SAPP12 COM x SAPP12 DOC {..Documentation for SYN.COM SYNonym A COMMAND LINE BUILDER Gordon Wilk 6707 Springpark Ave Los Angeles CA 90056 (213) 645-6419 SYN.COM allows the user to define a command line (a string of up to 128 characters to be executed by the Console Command Processor) and name the line. SYN.COM then builds a COM file which when called form the CPM > prompt will cause the system to execute the defined command line. It is inspired by a CPM 2.2 public domain program called SYNONYM and ZCPR's ALIAS facility. The SYNONYM program did not provide SUBMIT-like arguments and ALIAS, of course is available only on a ZCPR system. CPM+ with its multiple command line facility makes this sort of program even more useful than it was in CPM 2.2. SYN.COM differs from Larry Steeger's EX.COM in 3 important respects. (1) It runs on the Osborne Exec (EX.COM seems to work only with CPM2.2). (2) SYN can only handle one line per cammand file (though SYNonyms may be nested). (3) SYNonym files are called directly; no processor like SUB.COM or EX.COM is needed when the command is executed. * * * A COMMAND LINE is what you type in at the ">" prompt. In CPM+ it may cantain multiple commands seperated by "!". Because it may be up to 128 characters, contain unmemorable options and multiple commands, you may wish there was a way to write such a command line once and be able to call it with a simple name whenever needed. SYN provides that facility. When you execute SYN.COM (by typing SYN at the ">" prompt) it will first ask for a "NEW COMMAND". This is the short (8 or less character) name you wish to use in the future to call (execute) your long command line. The name my be any valid CPM filename with an optional drive prefix. If you omit the drive prefix, SYN.COM will look for the commaand file, and later create it, on the default drive. The name must not include the .COM suffix. If no COM file by this name is found, the program will then ask for "Meaning (command line)" and display a ">" prompt. At this point you type in your long command line. When you press , the COM file will be created and you will be returned to the system. You may then execute the command line by typing the short SYNonym name. If a COM file by the specified name already exists, the program will say so and ask if you want to edit it. If you reply "N", you will be asked for another name. If you answer "Y" to signify your desire to edit the command, it will be displayed with the cursor after the last character. You have the full CPM+ line edit commands at your disposal. The key controls are displayed in case you don't remember them. If you have given the name of a non-SYNonym file, the program will so inform you when it tries to read the file. The long command line may contain parameters in the manner of a SUBMIT file. There is a difference: I have used "&" rather than "$" as the argument marker. The dollar sign is too frequently used as a marker by MAC, RMAC, etc. If you want to use the "$", change the equate in the ASM file and reassemble. There may be up to 9 parameters indicated as &1 - &9. Parameter 0 is the new command name. Each parameter may be up to 14 chars long. With this change, the rules for SUB file syntax may be followed. SYNonyms may be nested. That is, a SYNonym command line may contain other SYNonyms. This can partailly substitute for the fact that only 128 characters may be used in a single SYNonym. Arg- uments are passed to the nested SYNonyms based on position: SYNynym Meaning TEST Do1 &1 ! Do2 &2 Do1 Dir &1 Do2 Dir &1 "TEST A: B:" will execute "Dir A:" followed by "Dir B:". "B:" is the second argument of TEST but is passed to the first argument of "Do2". CONTROL C (^C), a null name, or null meaning will abort entry or editing. SOME USES Multiple command lines with many parameters are often converted to SUBMIT files; but they rarely run over 126 cha#racters: C &1 -m ! RMAC &1 $PZSZ ! LINK &1,STDLIB $SZ ! ERA &1.REL will compile, assemble and link a file without creating extra files. It could have been named "CC" nd then used by typing "CC FOOBAR" to compile, assemble and link program FOOBAR. Some CPM commands have many options which are hard to remember: A command named "PRINT" could be defined to execute PIP LST:=&1[FZT8P80] for printing files at 8 lines per inch. You might prefer the MSDOS syntax to CPM's. Define "COPY" as PIP &2=&1 . Assuming you have a program called SETKEY, the line SETKEY WS ! WS ! SETKEY CPM will call WS with the appropriate keysetting and return to the CPM setting on exit. Obviously EXECST files can be created with SYN. COMPARISON WITH SUBMIT FACILITY SYN much faster. Its speed is due both to its small size and the fact that it makes fewer disk accesses per command. SYN is a self contained file builder and line editor. To use SUBMIT, you must first use an editor to write the SUB file. SYN takes only 1k of disk space and is only needed when creating SYNonyms. The created SYNonyms are stand-alone files, each only 1k in size. SUBMIT.COM is 6k and must be available whenever a SUB file is called. SYN is less wordy and leaves a cleaner screen. SYN is limited to a single 128 character line. SUB files are virtually unlimited in size. The ability to nest SYNonyms is a partial substitute for a multi-line processor. SUB files can, with the "<" character, provide input into a program, SYNonyms cannot. titute for a multi-line processor. SUB files can, with the "<" character, provide input into a BIOSFIX MAC CCP101 NOT CCP105 MQC CD310 DOC HCD311 AQM N;CPM2 COM ] CPM2 DOC aCPM2DEL COM cCPM3SCB DOC d#SAPP12 AQM m*SAPP12 COM x SAPP12 DOC {1TP!<!H!u!>O7H2F:2G >G"z<2{2xJ!G>]PüS!M[<[!(= H9n]HMH:92 P WRITECCP will write CCP.COM to drive A, track1, sector 1 $ System tracks aok $. $ Error reading $ Unable to open $ Error writing system tracks $ Error: cpmldr.com is too long $ CCP COMReservedReservedBIOSFIX MAC CCP101 NOT CCP105 MQC CD310 DOC HCD311 AQM N;CPM2 COM ] CPM2 DOC aCPM2DEL COM cCPM3SCB DOC d#SAPP12 AQM m*SAPP12 COM x SAPP12 DOC { The WRITECCP program takes the CCP.COM file created by CCP+, and writes it to the system tracks of any boot disk. To use, have WRITECCP.COM and CCP.COM on the disk to be modified, and type: WRITECCP Simple as that. WRITECCP was created by George Peace (sysop of FOG system #10). I've added this short note by way of explanation. Jim Switz 15 Sept. 85 Note: CCP+ and WRITECCP are designed only for CP/M 3 systems; I've used it on my Osborne Executive, and it seems to work just fine. CP+ and WRITECCP are designed only for CP/M 3 systems; I've used it on my Osborne EBIOSFIX MAC CCP101 NOT CCP105 MQC CD310 DOC HCD311 AQM N;CPM2 COM ] CPM2 DOC aCPM2DEL COM cCPM3SCB DOC d#SAPP12 AQM m*SAPP12 COM x SAPP12 DOC {vWRITECCP.MACN  !"#$%&'()*+,-./0123456789:;<o=>?@ABCDEFGHIJKLM KՕcc _{pu:uo)VnHQJj21BTqT_BMjMw ^_@SNшbԊޕO ? nc\bfVpU 0v&Q:0 .\<݄N3 CӍ- 40vM ta ]xwcK:0 m.$@a]fa%tf r4 iA(fg߅u tav=iA81f!t‹tYXXH4ÇR4{zƖ$|$4mhKрkgw7$Qo4R4G!Ꮳi/-E1%G!aa`Mb@#", ÒUhì!y42 =+5Z* CO.'h:#aH8h8 a> bQaSLտ whXj1jFG`$}R1 /EhHS  w< {A]1z!yxX8EapQ}Y y WMIA}", /^6:)ˆ HܝR4$ K=0)KрkwKЁN3,ECzNXXx 3$yphp0F)x$ax`nv%ܡ'aW#):ܢ3#ʦMїpnʦ.)\1n@`. ~n!P6uXq!fLJ(ܠ'̡)1bQ = 7Gp Y(,|p C24uN |>btu",+zg##apda cJ赒0$xC eS Cp{z 1z!yhx$@aDž0!47t' ) C'hx$Cs1_BN4\Zm$ ', Ƀ:yy)%0$yҍ*@Cݨuµ$SkR3Ds°: 0XtV1zenTnTS', 2Z ?al:ՄOJͰ4\qO(m< 6Kh al0\MX<2?FhЏNrL AXOӃuZ k^!yȓ!ǔ`:walꄅa Q0uìs5atO<4Fk&cCS=4yADˊ^+:$ ËIuU V;2aa!4_{$ /iQа:aaP @-K (z,UX4)J(RVErN]>9wt1#$CU\kQ8. 9c8 @X=Ɣk%a%zݨ!y4Fu GhXB pk\ԙCAGR̄1Rj}tn0&D͊֘VoS,+%Y ~oxpW6x7 O×>]_E?Yt:t}G|֍ga OCj\)F_6t:_`>hh.0h8bx* ~!whhw MTN3s-1@DhMqyCHX8, ~az?_ ?0 0 0 0 0 0 0 0 0 0 0 0 ¥+1?zŪz$^0@_)!@)M:\@^>atjE.O | x(1HK= ;i0Xtbŀ| [  > @Op{/(?f^\̗4C ?N3Op{ eS;p4Cinw@/Op{/(4Cin}:(in|فN3?}:(>C@bpfini@y}ڇ{@y:(^8PޟN3> r t!Pwa@:(Op{/,Z t!PǼʸ ɻ@4C| 0oceEsse 9o(v]Xg(fᡓ# JAxe 4 as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Disk 2 of 2. CCP105+. Also on the disk are some stand-alone utilities for CPM+. Filename Description -03-00 .87 This is the release date of the disk. -CPM164 .DOC This is the description of the disk contents. BIOS2RSX.AQM D212 8K ver. 1.05+ [CCP 48 of 62] BIOS2RSX.RSX E983 2K ver. 1.05+ [CCP 49 of 62] BIOSFIX .COM 0637 1K ver. 1.05+ [CCP 50 of 62] BIOSFIX .MAC E04A 2K ver. 1.05+ [CCP 51 of 62] CCP101 .NOT 1D57 2K ver. 1.05+ [CCP 52 of 62] CCP105 .MQC 25E7 54K ver. 1.05+ [CCP 53 of 62] CD310 .DOC 251A 6K ver. 1.05+ [CCP 54 of 62] CD311 .AQM F251 15K ver. 1.05+ [CCP 55 of 62] CPM2 .COM 9E55 4K ver. 1.05+ [CCP 56 of 62] CPM2 .DOC 5B78 2K ver. 1.05+ [CCP 57 of 62] CPM2DEL .COM 6923 1K ver. 1.05+ [CCP 58 of 62] CPM3SCB .DOC 975C 9K ver. 1.05+ [CCP 59 of 62] WRITECCP.COM C5E0 1K ver. 1.05+ [CCP 60 of 62] WRITECCP.DOC 3AA5 1K ver. 1.05+ [CCP 61 of 62] WRITECCP.MQC 4E9D 5K ver. 1.05+ [CCP 62 of 62] SID11 .RSX 06A8 1K ver. 1.1 [SID RSX 1 of 2] Add a memory string search to SID. SIDRSX11.DOC 24E3 4K ver. 1.1  [SID RSX 2 of 2] STAT30 .COM 3531 1K ver. 3.0 [STAT 1 of 3] Helps correct free space remaining which was incorrectly reported by some older CPM 2.2 programs. STAT30 .DOC F263 3K ver. 3.0 [STAT 2 of 3] STAT30 .ASM A7CB 5K ver. 3.0 [STAT 3 of 3] SYN .COM DE40 1K [SYN 1 of 3] A command line SUBMIT-like program that works with CPM+. (It is similar to EX in some ways.) Will also work on CPM 2.2 systems. SYN .DOC 9891 6K [SYN 2 of 3] SYN .ASM 9935 12K [SYN 3 of 3] SAPP12 .COM 0101 3K ver. 1.2 [SORT & PACK 1 of 3] This sorts and packs a CPM+ directory SAPP12 .DOC 328B 6K ver. 1.2 [SORT & PACK 2 of 3] SAPP12 .AQM 4DED 11K ver. 1.2 [SORT & PACK 3 of 3]  [SYN 1 of 3] A command line SUBMIT-like program that works with CPM+. (It is similar to EX in some ways.) Will also work on CPM 2.2 syst&'