IMD 1.18: 18/12/2012 10:31:23  >@:JG!Nx@(+G:Qo~2D!x4> 0400 {23x4>0#3w40+0 |{ :DO:JG4>] \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ܯ2 ݇!2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "޷"͌#>?͌͘ =_.:;<> Oޅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3߯21y_͸2y2ͽ:ܷ1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x ހ ނ G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^ "*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2 Eéñû ÆåÈþ 1 go"@2J!"B!3w#O_:42J!"Ld "LT!B~8+4#64:58>22!"!"!"L!" 22:Oy2!9"1 o&)))){ͨ2{0ys#r+n&s)a*I2J<2I*@:Cgy2@>2C6 #F!@ !7x2@( K|2C}2@"I (w#w w#wy{!ͨy2xGyO y2ͨy>0>2y=2ͨ#Vy2 8B_V# 0#󖁒0o<2g7)2 2s1 2<22!6(@@V(3:e2@z2Q*"@*"B:2J:d!w2ͨ#F7** !- =: <2: =:  2e!w{!=7^#Vͨ#V:J<2!#>2K:@ͫ ̇ķ:Ky  02H~3#  .02H3w#   ?:@ͫ4+~2H04002G0ķ:B21O:A(3 ?ͻq4 > O#1( ~(V*LW(\ͻ*I|q!N3>͢( >@w21(#:QwO+~2J2I:@ͫ :@G7pw2J+6@ w#1~ 4:C:!1S:K + >P>QP(>PQP(͌Tɯ/SS>QQSS >QJ R:CS:AS:BS:SQ>P!:CP :A!FwOx?8/p= ɯ2P>n!! !-!-!-mpj,?4 @+ j[?  | ???%ͩ( % (y (yӂۃ~<(=ۀ(yӁۀ(ہSTACK STACK STACK STACK 1>NӃ>7Ӄ>R>PP P>PP ͌!"!INͻ#y0Ø 64k CP/M vers-2.2 LMSC upLAB version, rev-2.1hnf2 >82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~6' D':%A6'>:6'D'>.6'D'>-6'x&!,N'!k-x&!,N':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(Mʣ(e0Lʣ(d0Qʣ(g0Rʣ(%1¶(x#3(~AҶ(#3(#6 !)-x&!x&!%͉&!%͉&ͳ'(`&͛'͠':%)!&͉&l&͛'͠'!%60#60#60#>2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&Œ*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ *2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:e0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,:%,l&&͈'!-x&CP/M Macro assem 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB End of assembly G:%x-!%~--.-*P0*%O {-z-.*P0"%!%^4!%w..WƐ'@'Õ*>:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞*J.[XHET[[OCORPOOXsUPXQZpWOi[Hd;!7~//6- 8*\"9"9""9"9"9"9"9*f9"9:Hk/yk/6d/@k/k/~ENDMFTY&!* ,p/  0031h Use factor DATSIZYLAB version,TACK CS and Morrow controllers. 26 jan 828[;Z[;?G~ʸ0|0o0#~ʼ0:8<#^#V++P280}02s8O~ʼ0###~ʸ0#ʡ0è07#^#V|9!$1û*7I z***f/z*;&z*8&*-&&,ector 5 ; all06 equ $ ; if m26 ds 128 ;allocation vector 6 else ds 64 endif ; chk06: ds 00 ;check vector 6 endif ; dbuf: ds 1024 ;disk buffer ; enddat equ $ ;end of data area datsiz equ $-begdat ;size of data area end  nxtsct: ds 01 ; erflag: ds 01 rsflag: ds 01 readop: ds 01 wrtype: ds 01 ; ;scratch ram area for bdos use ; dirbf: ds  38 ;allocation vector 1 chk01: ds 32 ;check vector 1 endif if numflpy > 2 all02: ds 38 ;allocation vector 2 chk02: ds 32 ;check vector 2 all03: ds 38 ;allocation vector 3 chk03: ds 32 ;check vector 3 endif if hardisk ; all04: ds 128 ;allocation vector 4 chk04: ds 00 ;check vector 4 all05: ds 128 ;allocation vector 5 chk05: ds 00 ;check v 8 8j08 8# 8( 8Y 8  _5|5>e A:)2l52z5:>!+}p5::> A6[66[6[6[L66[L66[ 6[6[L6[L66[6[8DH"8)D+---MUSIC-SYSPIP COM:WS COMnWSMSGS OVRCWSOVLY1 OVR^ STAT COM) MUSIC COM"DMUSIC4 ASMl MUSIC4 COMREMOV" ASMREMOV" COMAWAVE BASCCPZ-V41PRNA2345678NOTES BASCCPZ-V41SYM9FIX SUBCCPZ ASM :;<=>?@CCPZ-V41$$$pAijkLVBMIN NOT3CCPZ-V40DOC2"UNSPOOL ASM#$%UNSPOOL DOCF&'LST COM(MUSIC4 DOCMAC COM\EMUSIC DOCa !CCPZ-V41ASM)*+,-./IMAC COM\01BOOGIE MUS$HUSTLE MUS%CHOPS MUS&MYLIFE MUS 'XFERTIMEBAS I/O-CAP ADDCCPZ-V40DOC0CALIOPE MUS (ENTER MUS)DAISY MUS*LAWRENCEMUS +MINWALZ MUS,AIR MUS-ALLEGRO MUS.AMERICA MUS/BOUREE MUS 0CHORALE MUS1IRISH MUS2MARINE MUS3PRELUDE MUS4SARABANDMUS 5WALK MUS6ARIA MUS7MAPLE MUS 8MRIVER MUS9ROLLING MUS:SMALL MUS ;STARWARSMUS <WHATI MUS=SPREAD MUS>TINSOLD MUS ?WIERD MUS@YANKEE MUS AMUSPAT DOCBFIND COMCALL CATFGHIJKLMNOPQRDISP COMSDISPLAY DOCTCPMUG 000zUVCPMUG 010fWXCPMUG 020YZ[CPMUG 030\]^CPMUG 040 _`aCPMUG 050~bcCPMUG 060fdeCPMUG 070RfgREAD ME hFEBRUARY 14 1982 COMPUTIST BOX-2250 SANTA-CLARACA-95055 UNSP30 AQM^ijUNSP30 DQC.kUSQ COMNlmI/O-CAP ASMnopSD COM q-PICONET014UNERA11 ASM,rPASSWORDASM@sDCON11 DOCstuDCON11 COMNvwUN COM"xUN DOCyFINDBD52ASM|z{|}CCPZ-V41BAK~CCPZ-V40DQCHCCPZ-V41NOTCCPZ27 HLPf(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9  :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!E ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ 2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>HHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q**M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ 2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 * "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  ÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6,,O -  COPYRIGHT (C) 1980 MicroPro International Corporation  MicroPro WordStar release 2.10  Heath H-19 terminal selected  Custom Daisy-wheel Printer   "=8f4PPY KMLpqE=E> sB@ @..Y[]{}AEIOU.:+-JP wͱ n!<>( !<% ñ !<@ !<@ !<@ !<@ O >( !<H !<~ H > B>2o3w#͞%  ͞% w#- 6> Y% ! > ONOFI%% }Y% &͞%9/& rh !I6_d&ax>2G:I6!< !<͡*F=ͺ!<͡!<á*<*2<>*<_:<<=* &7*H=#~+º:<}:<3! &͢ 2 &> '#~+}:<3~ #~U\#~U#*<͢ :<#~U  +&!vo:<}D>:<:!Z>GO o>^#~ > Gm*<:<ʌ/|: &> Gî> &+|#>Ä!".g|,-:G6G}>n):88͝2*6!!ͽx9!:8!8~68<>.&g!Bɷ (&;F>!#X |G!"X}O)|! ʧ!!~6w<§x7ʰQ! q#~w&^#V#[ J^#V+ѷJ~[ u#͢:8298͞>28!94!N98ͩ!9́́*N9*kC!P9"7:8M9k?:kʱX%}):9=!;ʞ=ʛz29!:8ͩگ[ >Bͩگ!:B;k~!L͑0ʷ:19*-9+##+!<~/͊ $͞ ~͊ $ ̓ -6#~<!Z7"X7(:7/3̀ [ <*X7~Ͳ3*7*7"7kU2O8:7/*6.'!ʏʏ͙~p>!J>O ͝2*X7~*V7~Ͳw#~<®!Z7"V7:6/!:O *-9+w*|6!2#8:ͺa> <>aJacc d d+d@BBDtdarg:a d Cca  BHf KIf 0Mf 1Nf 2Of 3Pf 4Qf 5Rf 6Sf 7Tf 8Uf 9Vf     D2w0         )       "$4& (*,.068F2       (EU)\)D20}b   -__7777w} nwWx2z7W:Go~~56   YZRCDTTVV2CCTTBT2STTTTTTTTTTCBTTTTVUUUVUUVVSSVUfVVTVVTUVVgVVUTVTVUTTTTTTSTTRRTRfTTTTSSSTTfTTTTVTVU!>6NIQYdXfjly%27?QXivYN @@@@ on () off () INTERNAL ERRORFATAL NAME OF  TO FILEMERGE-Print a file  GG!<~6!I6x!<^3f x!g2GO!<> C>~M>- ? i!<~<> ?@W w!"<2 2*<&*<"<**<> :H6*<|:<* G*<|ʮÝ @C̀ 6?!<~5^@@!<4!xt:G6>:H6/!J6!<6> ͈̈:<7*<*27Ó &͓ iª:̓ ²iē :G6͖>:G6>:&:< =!"7"7<=G:776*T=~76p#~<`"T=xG:7x* P_x20<:z<*2<ʱ*%<:-~5*<:žx ʞg> n> ڞ!B:)<~ˆ=<<*<-ʜҚ<>P Ix_&.y2<:<!~<4!<4x*<:-!a*Byę!Z7"V7"X7P  G:6Ox_:I x  yON#F ܀ څ_p+qʀ À&![ *29:IO&:H=!µ D":6#  + `c"ͬ ͞  !6 ͬ6*6>+̬,&e":6 ͬ*6-e">u͑ʊJʷ !>B:7PNR:7T:7VL$ͷ&ͯ$G*!8*!86*29G͂#͢^#͢V=BXZ++O:6Gy_f:Lm>~G. ˆ> ͦ:6xã Ҡ ʠ ʠ>^ͦ@ͦ ڬ:6 z Ԋ O ͞ !6  4*-9w# 6*/9+4:H= :I*/9B"/9*-9B5*#9͞ *I&*)98&&> -C O:] yO:u y"*6g2> Ou ͊ !6 w!!:6 *-9~G:19w2$8͞ "-9:6 !$8~ 5*-9~w219*6c"РԠ Š *** FATAL ERR F25: NOT ENUF MEMORY $ File  not found. Menus &  messages will display as @@@@ only.  WAIT  PRINT\PAUSED merge-printing\ \editing\no\file\ ڽ ׽ *** Press ESCAPE Key *** INTERRUPTED***  E*** I***   F: G! B~x7Ɂ*<:27i[ i*7|/͓ i* x:<*P="J="L=ͨ*N=k [ <ͩ "L= ͓ !J=T8Tk> > * W_ !2<{ ȯ22< :<=|g}o|*<&*<*G  +~ x 6# $%%$o>g/DMxɅo|gg}o|g^#V#~#fo# _Gzt{xɾ~~/w~͙#Á à ͩ :.,;?!0?:[A?a{ɷ @&N#w@w#6:#6 9 46.#:6 Dw# 9Sg2 [{:m|S|_ {26_|=!•sn)|Gʵ°HGxy"!8.&*w8"y88:T8o& !&!*6kc"i*%8:'8o*6}9!o!'8:Y!<=&=Q!I!:6~<=#~O `!!g2:H=!:I…!=O":6!~ £!# –!yB +~ ʩ!̓ !!m~@!!A> O !͞ 6 # ! !~!!@!:6:"":">2626'":26ͤ!@!]"͞ *6À"6"!@!ͧ*H-&"6" "/9:6!̓ ͐":H!:d"*^\:]¥"!J͹"!S͹"!X^!^!:`G{O O I"d*#9*/98*-9/o&U\*#9:IO" "*+#}!++)>2P8*6"e8ͷ $ $$&!,#T#T#c#*e8l!c"'#!~y#y#y#™# $ʌ#ʌ# ܌#*6%! ¨##Þ#!µ##-#!#45#>!))#U)#\)!̷oy^͂>IÂy <2P8+q#ͯ$:6:H͊$<2Z82Y82X82V8ͯ$ >\$y$Z$$ >!69!l2×2:U8!V8$~:6!)8!"X8"Z82V82U82O82S8!͊$2T8×2͊$!:$:$:$:GOi%:7$ ỳ x] -3$a/>/:K6,:U7,*57-(&a/-Ä.:]!W-!l ,!4~Ļ7 !L6 d!7 :26-!V.!!!S!m!ͺ-#ͺ-#ͺ-#ͺ-:`26:c2+|26ͽjd!7 :26-6"Q.:6Â*."49:II++"29"89a."69"9"!9*:6).*HL&bj ./+#"#9"-9*H-"")9"+9."'9/"%9:6*Hm-Y.|!]p.>o&))))>.go/2ʹ..>2'8:H2)8=2,8=2+8.:;9*L9>.& 8!!6~..6!n"7*\":9"<9">9*>9"@9"B9"D9"F9"H9"J9*!9"L9:H'/y'/6 /:I@'/'/~!9"7>.&!* /,/ 5!"o8"q82n8*52:8/2?8S/!"_8"X8"Z8:T8͗2!m/ͫ&>2P8!7~/++! ,3:8hO*w/د283;':7/*<9">922P8|=4/=S_/^#V,32-82.82/82V8Ϳ$>2P8]1͋0/2-8G:8(0x t0?G~t080+0#~x0:8<#^#V++P2P8͋0902.8O~x0###~t0#]0d07#^#V|N9!E$0*6[ \20[ ̩00Y8ʼ0=!ͽ!$0=!ͽp9.'>2@8\20̓ #!!ͪ)}(:8 1$i!͞%2%͞%_:%W~C%#4%###$%~.%#^#VE%&͞% I% I%!I%ړ%ʕ%0ړ% ғ%T])))_͞%ڎ%ʐ%0ڎ% o%|7͞%×%x 7 7 77?999999999999999999999999999999999999&:9*:,:.:0:2:4:6:9::<:999@:B:D:99!J&&]"ͽ&,!&2S/:[82Y8!͘$&ͽ>ͽ21q$2Z8:[82Y8ͷ!—&2V8Ϳ$a/!#8~6*X7~1!:86:8ďI!!R&i:#8&o&)%^#Vo&DIͽ:8/!7)'5:$8z *6! !ͽp!̞ z *_8|!7D'[ g227*29"c8͝':7^'b(r:8Œ':7ʆ'':7{'b(tb(v!6s(b(x)]:IO'!õ::8*08'*-8':/8(>':=82-8*29"c8͝'O×'G:IPx''*29*c8/'> (}(| (>^(@!6\#(> (( )(#*49++*c8wk?(#"c8:7](:)Z(:6!28''^#V#p(~#(s(:&!+!8“(2]8(!]8N6ͱ2q!\8FwO(:^8(:&>(2]8!)8(2]82\8/2^82^854:I=G(= (y2:6!5)ͱ2=!%8\2:8ĀZ.'[ :W8!D8wo:801:)8o:T8Y1!B8G1!D8S1o&&![ l!<31):Q8!A8\26<:8G:6O*7|!O8ʃ16:Q8!S8ᠡʓ16[ 2;'ͯ$:7!t9:7!v9:Q812S8ͽr91x/1,21.!"%8Z$:T82W8:Q81!S8~6!r9*7|!"7Z$:T82U82>2O8!7~6ȯ2O8:IP92!N9:5̓ 6"8͝22O8a/:8ďP!T8u2w:8ʅ2:+8=2w~=!B8e)!\8(ͣ2ì\ͣ2û\:8ʭ233:T8!W8w!D8w!]8w*>9"@9"B9>2?8: /!28!7 ! 7!76.!86/:28ɯ2727~#28~28#"8O3}28|28"8O3~#28~#28"8:8=>$G&{3Ē3i`)`4^#V*8 *8)))f4N!8 :86i`)`4^#V#^#V#E4~#fo)DM!"q#p#N#Fi4 ~>)(& 36464 3~>'(&#:8>,(&8 >*(&w!84>+(&# 4^#V>((&!8:8wͩ>&(&Q4!$~(&͞>>Ely'76'77 77277#77`7g77n77'7,7]7~[ :8͕^:]8͗2an):+/+)>!+Fw>2O82D8e)w)2B8 :)8Q)2C8:E8ʆ)G:+:T8•)o#}!W8w=Ң)<<)x:+;)[ ):D8=͗2aw)!W8wG:)8 )!B8e):F8B):B8!T88:B8W:C8;)_:F8!E8<~*:G8~** +:N8/<_y!E8;**qy!F8m*<2F8i,z<2D8[ !L8:8m*:E8m*z2C8{*z{*!C8*2D8*29"c8:E8O:G8G/!zp(b(||*c8 "c8&x/*!~p(y**>B(:I':B8Wi,!P8452G82N8*89"J8:L8+2M87\\,ͧ+:M82L8p,a:IO *296 #=+#7+ x G +:G8G*J8+F+N 2G8a~++++DM>2N8>.!7,### k+#~‚+  +7,~+2L8*89"J8*696+r+s k+:M8+++~wT,ø+*H8 !3, ~.,#+ ,~$,&,6.#w#w#> *H8BAINuHEvREwCOxOVy$$z7c"H8&>2M8j͑*89},#p+q&+F+N <Ú,#Vp+^qBKÚ,+V+^ ov,ڋ,˜, ,,à,!915>,!915,:7!,3H"*525!9"5=-̈́.:  ******************************************************************************************************YOU MAY NOW REPLACE THE DISKS YOU REMOVED EARLER.******8*********** FAILURE *******************ORDSTAR HAS FAILED INTHE DETERMINATION IT AS ATTEMPTING.PLEASECHECKYOUR RINTE AND SYSTEM.IF ALL ELSE FAILS RESET OUR SYSTEM AND TRY INSTALLING AAINoDTTO RERY THS OPEZ7Z7???????????!*8!S*8"8You are trying to run an uninstalled WORDSTAR.Plea*(&w!84>+(&# 4^#V>((&!8:8wͩ>&(&Q4!$~(&͞>>Ely'76'77 77277#77`7g77n77'7,7]7 COPYRIGHT(C) 1980 MICROPRO INTERNATIONAL, SAN RAFAEL, CALIFORNIA, USA. ALL RIGHTS RESERVED. WordStar 2.1 Message Texts bvC < t(1p Y#`$y$%$$%%>&l&&&&'i"%W&&bb=bsrbb((9)w)))P*Z*n****b*;+T++++b}0?~C]f\:LzR JbEbbbbbb"+#$!&b$$$K,bV,V,V,V,l,l,V,b,,b- -'-]---b.".bb.b?..b../5/@/L/k/m////(b//b0bK0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb D=create or edit a Document file H=set Help level  N=create or edit a Non-document file X=eXit to system  M=Merge-print a file P=  F=File directory+ Y=delete a file  L=change Logged disk drive O=cOpy a file  R=Run a program E=rEname a file  For maximum help (full menu display),  select Help Level 3 by typing ^JH3.  This message will clear when a key is pressed.  TO HYPHENATE, PRESS -. Before pressing -, you may  move cursor: ^S=cursor leoVe block C=Copy block Y=delete blockADDITIONAL FILES R=Read file W=Write block J=delete file & PRINTING: O=cOpy file E=rEname P=DISK & DIRECTORY: L=Log disk F=File directory+PLACE MARKERS: 0-9 = set/hide place marker 0-9  ^K PREFIX (to cancel prefix, press SPACE bar)  END EDIT/SAVE: D=Done edit X=done, eXit S=Save, reedit Q=abandon  MARK BLOCK: B=Block start K=blocK end H=Hide/display  BLOCK OPERATIONS: V=moVe block C=Copy block Y=delete block W=Write  ADDITIONAL FILES R=Read file W=Write block J=delete file  & PRINTING: O=cOpy file E=rEname file P=  DISK & DIRECTORY: L=change Logged disk F=File directory+  PLACE MARKERS: 0-9 = set/hide place marker 0-9 ^P PREFIX: Put Control Character in File V=subscript T=superscript Y=ribbon color changeS=underScore B=Boldface D=Double strike A=alternate pitch N=standard pitch X=strikeout begin/endO=non-break space F=phantPE ^KP TO CONTINUE PRINT  TO RETURN CURSOR TO POSITION BEFORE SAVE,  TYPE ^QP BEFORE TYPING ANYTHING ELSE.  TYPE 1-9 TO VARY SPEED, SPACE TO STOP *** WARNING:  WRONG VERSION OF WSMSGS.OVR --  SOME MESSAGES MAY BE INCORRECT. *** *** WARNING  SCREENS OVER 48 LINES HIGH OR 120 COLUMNS WIDE  HAVE NOT BEEN TESTED AND DEBUGGED. PROCEED WITH  CAUTION; REDUCE WIDTH IF BUGS ENCOUNTERED. *** WARNING: DISK FULL,  DELETING OLD .BAK FILE TO MAKE SPACE  (NORMALLY, THE PREVIOUS BACKUP FILE IS DELETED  ONLY AFTER EDIT IS SUCCESSFULLY COMPLETED).  CAN'T DISPLAY PAGE BREAKS IN A NON-DOCUMENT FILE *** WARNING: WORD TOO LONG TO FIT MARGINS  PUT AT FILE BEGINNING FOR CORRECT PAGE BREAK DISPLAY  Normally press RETURN only, or enter one or more of:  number=repeat count, B=search Backwards, W=whole Words only, U=ignore case, N=replace w/o asking, G=replace in entire file. HELP LEVELS  3 all menus and explanations displayed  2 main editing menu (1ft, ^D=cursor right.  If hyphenation not desired, type ^B.  CURSOR: ^A=left word ^S=left char ^D=right char ^F=right word  ^E=up line ^X=down line  SCROLL: ^Z=up line ^W=down line ^C=up screen ^R=down screen  DELETE: DEL=char left ^G=char right ^T=word right ^Y=entire line  OTHER: ^V=insert off/on ^I=tab RETURN=end para ^U=stop  ^N=insert a RETURN ^B=reform to end para ^L=find/replace again  HELP: ^J displays menu of information commands  PREFIX KEYS ^Q ^J ^K ^O ^P display menus of additional commands CURSOR: ^A=left word ^S=left char ^D=right char  ^F=right word ^E=up line ^X=down line SCROLL: ^Z=up line ^W=down ^C=up screen ^R=downDELETE: DEL=char left ^G=right ^T=word ^Y=lineOTHER: ^V=insert off/on ^I=tab RETURN=end para ^U=stop ^N=insert a RETURN ^B=reform ^L=find/replace againPREFIX KEYS ^Q ^J ^K ^O ^P display additionom space G=phantom rubout C=pause H=overprint char RETURN=overprint lineQ,W,E,R=user printer controls SPACE=cancel prefix ^P PREFIX: Put Control Character in File  V=subscript begin/end T=superscript begin/end Y=ribbon color change  S=underScore begin/end B=Boldface begin/end D=Double strike begin/end  A=alternate pitch N=standard pitch X=strikeout begin/end  O=non-break space F=phantom space G=ph. rubout (see manual)  C=pause when printing H=overprint next character RETURN=overprint next line  Q, W, E, R = user printer controls SPACE=cancel prefix ^O PREFIX: on-screen formatting commands S=line Spacing C=Center cursor line F=margins/tabs from lineL=Left margin X=margin release E=soft Entry #R=Right margin W=Word wrap  D= , ctrl dspy%I=set tab stop J=Justify! P=Page display (N=clear tab V=Var tabs" T=ruler display&G=para tab H=Hyphen-Help$ SPACE=cancel prefix ^O PREFIX: on-screen -control-char commands) suppressed  1 prefix menus (2-character commands) also suppressed  0 command explanations (including this) also suppressed  CURRENT HELP LEVEL IS  ENTER Space OR NEW HELP LEVEL (0, 1, 2, OR 3):  The LOGGED DISK (or Current Disk or Default Disk) is the  disk drive used for files except those files for which  you enter a disk drive name as part of the file name.  WordStar displays the File Directory of the Logged Disk.  THE LOGGED DISK DRIVE IS NOW  NEW LOGGED DISK DRIVE (letter, colon, RETURN)?  Use this command to create and alter program source files  and other non-documents. Word wrap defaults off;  tabbing defaults to fixed (TAB chars in file; 8-col stops);  page breaks not shown; hi bit flags not used in file.  For normal word processing uses, use the "D" command instead.  Use this command to create a new document file,  or to initiate alteration of an existing document file.  A file name is 1-8 leal menus  ^Q PREFIX (to cancel prefix, press SPACE bar) CURSOR: S=left Side E=top X=bottom D=right enD line  R=beginning file C=end file 0-9,B,K,V,P=to markerSCROLL: Z=continuous up W=continuous down DELETE TO END LINE: DEL=left Y=right FIND, REPLACE: F=Find a string A=find And substituteREPEAT NEXT COMMAND: Q=repeat until key pressed  ^Q PREFIX (to cancel prefix, press SPACE bar)  CURSOR: S=left Side screen E=top screen X=bottom D=right enD line  R=beginning file C=end file 0-9, B, K, V, P = to marker  SCROLL: Z=continuous up W=continuous down  DELETE TO END LINE: DEL=left Y=right  FIND, REPLACE: F=Find a string A=find And substitute  REPEAT NEXT COMMAND: Q=repeat until key pressed  ^K PREFIX (to cancel prefix, press SPACE bar) END EDIT/SAVE: D=Done X=done,eXit S=Save,reedit Q=abandonMARK BLOCK: B=Block start K=blocK end H=Hide/displayBLOCK OPERATIONS: V=mformatting commands  S=set line Spacing C=Center cursor line F=margins/tabs from File line  L=set Left margin X=margin release E=soft hyphen Entry#  R=set Right margin W=Word wrap  D= , print ctrl dspy%  I=set tab stop J=Justification! P=Page break display (  N=clear tab stop V=Variable tabs" T=ruler display &  G=paraGraph tab H=Hyphen-Help$ SPACE=cancel prefix  ^J PREFIX: help commands  H = display and set Help level M = Margins and tabs  F = Flags in right screen column S = Status line  I = command Index; entering text R = Ruler line  B = paragraph reform (^B command) V = moVing text  D = Dot commands, print controls P = Place markers  SPACE=cancel prefix  ^S=delete character ^Y=delete entry ^F=File directory  ^D=restore character ^R=Restore entry ^U=cancel command  TYtters/digits, a period,  and an optional 0-3 character type.  File name may be preceded by disk drive letter A-D  and colon, otherwise current logged disk is used.  WARNING: You are editing the same file as you are printing.  WordStar will not allow you to save the edited version  until the print has completed or has been abandoned.  ALLOW PRINT TO FINISH BEFORE EDITING A FILE.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMORY TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  CAN'T EDIT A FILE WHILE MERGE-PRINTING --  FINISH OR ABANDON MERGE-PRINT BEFORE EDITING  FINISHING PRINT BEFORE EXIT  (type ^U to cancel exit command) ... FINISHING PRINT OF SAME FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  FINISHING PRINT OF .BAK FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  ABANDONING UNCHANGED  ABANDON EDITED VERSION OF INVALID  NAME:    NOT FOUND  Now printing file  "Y" TO ABANDON PRINT, "N" TO RESUME, NOT FOUNDPROGRAM IS AN EMPTY FILE!?PROGRAM TOO BIG FOR  MEMORY AVAILABLE UNDER WordStar LET PRINT COMPLETE BEFORE RUNNING A PROGRAM  NOT ENOUGH MEMORY TO USE "RUN PROGRAM" COMMAND  File  Not Found --  Can't Run a program unless  is available.  FILE  ALREADY EXISTS FILE  NOT ON SAME DRIVE  TOO LITTLE MEMORY TO COPY WHILE  EDITING OR MERGE-PRINTING  FILE  EXISTS -- OVERWRITE? (Y/N): FILE  IN USE BY WordStar   P=   Press space bar after reading screen: *** Invalid Dot Command Ignored: *** File Not Found *** But found, and will use, *** Cannot change disk in drive , request ignored Insert diskette with file then press RETURN: *** No .DF before .RV: *** WARNING: Overlong data value truncated *** Invalid variable name in .RV command ignored *** WARNING: Data exhausted, null value(s) used ***** Print Directives *****  PRINT CONTROL CHARACTERS may be entered anywhere in a line  to inverscript Roll in 48ths of an inch (3)  .UJ OFF/ON "MicroJustification" off/on (default ON)  Use insure that printed column alignment exactly  matches screen, e.g. for tabular material:  Put .UJ OFF before table, put .UJ ON after table.  Space for next frame, ^U to return to editing:  SPECIAL CHARACTERS in HEADINGS (.HE) and FOOTINGS (.FO):  # prints as current page number  \ do not interpret next character as a special character  ^K do not print following spaces if on even-numbered page  PAGE NUMBER POSITIONING: If a footing text is specified (.FO  dot command), the default bottom center page number is not  printed. Use a # in heading or footing to position page  number where desired. ^K followed by spaces followed by #  may be used to produce alternating left/right page numbers.  Space for next frame, ^U to return to editing:  ***** Merge-Print Dot Commands *****  .DF filename specify Data File for . ^U TO HOLD: PRINT?  For default press RETURN for each question: START AT PAGE NUMBER (RETURN for beginning)?  STOP AFTER PAGE NUMBER (RETURN for end)?  NUMBER OF COPIES (RETURN for 1)?  DISK  OUTPUT (Y/N):  OUTPUT  NAME?  USE FORM FEEDS (Y/N):  SUPPRESS PAGE FORMATTING (Y/N):  PAUSE FOR PAPER CHANGE BETWEEN PAGES (Y/N):  Ready printer, press RETURN: WARNING: You are printing the same file as you are editing.  The last saved version will be printed, not reflecting un-  saved changes. Furthermore, WordStar will not allow you to  save the file being edited while the print is in progress.  END EDIT (^KD) BEFORE STARTING PRINT.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMORY TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  TOO LITTLE MEMORY FOR MERGE-PRINT  *** PRINT OUTPUT DISK IS FULL. PRINT PAUSED. *** THAT PLACE MARKER NOT SETBLOCKoke underlining, boldface, subscripts, pauses, etc.  They are entered by typing ^P and a letter. A directory  of most print controls is given on the ^P PREFIX MENU;  see manual for more.  DOT COMMANDS are special lines beginning with a period and  a two-letter code. They control page breaks, headings,  page numbering, page layout, etc. Dot commands are  typed in like other text.  Space bar for DOT COMMAND SUMMARY, ^U to return to editing:  ***** Dot Commands *****  PUT EACH DOT COMMAND ON SEPARATE LINE, WITH . IN COL 1  .PA new PAge  .CP n new page if less than n lines left on this page  .OP Omit Page numbers when printing, starting this page  .PN print Page Numbers, starting this page (default)  .PN n set Page Number to n, print page numbers  .PC n Page number Column (default 33 (30 if 64-col screen))  .PO n Page Offset: extra indent when printed (default 8)  .. text comment, notRV  .RV name,name,name,... Read Variable values from data file  .AV "prompt",name Ask operator for Variable value  &name& anywhere in doc't prints as variable value. variable names are letter then 0-39 letters, digits, -'s. .FI filename Insert document File  .DM message Display Message  See manual for details and additional commands. Merge-Print  is an optional feature, operational only if MERGPRIN.OVR is  on your diskette. Press any key to return to editing:  ***** STATUS LINE (top line of screen) *****  ^JS at left end of line is command now executing  A:NAME.TYP is name of file you are now editing  PAGE n is page number of cursor (disregards .PN's)  LINE n is printout line on page of cursor position  COL n is printout column on line of cursor position  INSERT ON shows if character insertion is on (^V command)  MAR REL shows if margins are released (^OX command)  decimal sho BEGINNING NOT MARKED  (OR MARKER IS UNDISPLAYED)BLOCK END NOT MARKED  (OR MARKER IS UNDISPLAYED)BLOCK END MARKER BEFORE BEGINNING MARKERBLOCK TOO LONG -  MOVE OR DELETE IN TWO SMALLER BLOCKSTHAT FILE EXISTS ON DESTINATION DISK.  DELETE EXISTING FILE FIRST,  OR USE A DIFFERENT DISKETTE.DISK FULLINVALID COPY LENGTHADDRESS IN "HOLE" (TSTADR)MEMORY FULL (MAK256)MEMORY SHORTAGE (MKSP)POINTER > 64K FROM CURSOR (PPTOAD)NOT ENOUGH MEMORY  OR YOUR OPERATING SYSTEM IS NOT  RELOCATED TO MAKE ALL RAM AVAILABLE DISKETTE DIRECTORY FULL CLOSE FAILURE -  SYSTEM FAILURE, OR YOU CHANGED DISKETTES RENAME FAILURE -  SYSTEM FAILURE, OR YOU CHANGED DISKETTES INVALID SCREEN HEIGHT OR WIDTH  MESSAGE  Can't edit a file of type .BAK or .$$$  -- rEname or cOpy before editing BAD OVLY #BAD OVERLAY FILE, OR  WRONG VERSION OVERLAY FILE Overlay file  Not Found FILE  NOT FOUND  (The seperately sold file   is required for use of Merge-print.)  printed  press space bar for next frame:  .HE text HEading used until next .HE (default blank)  .FO text FOooting (replaces page number) (blank)  .PL n Paper Length: total number of lines (default 66)  .MT n Margin at Top: # lines, top paper to text (3)  .MB n Margin at Bottom: # lines, end text to end paper (8)  # lines text on page is PL - MT - MB (defaults to 55)  .HM n Heading Margin: blank lines between head and text (2)  .FM n Footing Margin: blank lines, text to footing (2)  FOR PAGE BREAKS TO DISPLAY AS THEY WILL PRINT, USE  .PL,.MT,.MB, AND .LH (next frame) AT FILE BEGINNING ONLY.  Depress space bar for next frame:  THE FOLLOWING WORK ONLY WITH INCREMENTAL PRINTERS:  .LH n Line Height in 48ths of an inch (default 8)  .CW n Character Width in 120ths of an inch, for standard or  alternate pitch, whichever is in use (see ^P menu).  (default 12 for standard, 10 for alternate)  .SR n Subscript / Supws during decimal tabbing  LINE SPACING n shows if line spacing is not 1 (^OS command)  PRINT PAUSE shows if printer is stopped (^KP to resume)  when WAIT appears, stop typing. Press space bar:  If page break display is OFF (^OP command) or edit  was started with N command, then Status Line shows  FC=nnnn FL=nnnn in place of PAGE n LINE n .   FC=nnnn cursor position in characters (bytes) from  beginning of file  FL=nnnn cursor position in file lines from beginning  of file, including dot command lines   space bar:  ***** FLAG CHARACTERS (rightmost column of screen) *****  < line ends in "hard" carriage return, entered by user  space this line break arose from word wrap or paragraph  reform, and may moved on subsequent reform  + this line of document continues on next screen line  - next line will overprint this line  ? unrecognized or incomraph already entered, set margins  (^OL, ^OR), place cursor at paragraph beginning, type ^B. To change between justified and ragged right, or change line  spacing, set desired justification (^OJ) & line spacing  (^OS), place cursor at paragraph beginning, and type ^B.  To obtain WordStar's help in hyphenating long words, place  cursor at beginning of paragraph and type ^B.  press space bar for more:  ^B reforms lines to end of paragraph as indicated by "hard"  carriage return (< in rightmost column).  Thus, it is important not to use RETURN between lines  within a paragraph when entering text.  ^B may be used to form hanging indents, change margins in  mid-paragraph, etc. The exact rule is:  "^B starts on the cursor line, at the left margin col-  umn, or at the cursor position, whichever is farther  left, and proceeds to the next 'hard' carriage return".  press space bar:  ***** Hyphen-Help ***** ion is off.  press space bar:  ENTERING A COLUMNAR TABLE -- We Suggest:   Set a tab stop for each column of table.  Clear all other tab stops.  If not at end file, turn on insertion (^V),  or use ^N to make blank lines.  Tab (^I) after entering each table item. After last column  on a line, tabbing will move to first item on next line.  space bar:  OUTLINE FORMAT TEXT ENTRY -- We Suggest:  Set tab stops at desired indentations.  Set right margin as desired.  For each item:  Type ^OG's as required for item number indentation.  Type item number.  Type ^OG.  Type text of item, without using RETURN.  At end of item, press RETURN. Left margin resets.  Press RETURN again if blank line desired.  press space bar:  ***** RULER LINE *****   L----!----!----!----!----!----!----!----!---------R   L Left margin (set with ^OL)  R Rightplete dot command  M Merge-Print (optional feature) dot command  P page break  : this screen line is before beginning of document  . after end of document press space bar:  COMMANDS TO -- ARE --  move cursor on main and ^Q menus  scroll file up or down on main menu; also find (^QF)  delete text on main and ^Q menus; also ^KY  move or copy text on ^K menu  end edit / save file ^KD; see ^K menu  print (while editing) ^KP  set tabs and margins on ^O menu  reformat text ^B; ^JB gives info  find a string; replace ^QF; ^QA; ^L repeats last  press space bar for "entering text":  ***** ENTERING TEXT *****  To enter text at cursor position, just type the text.  Use RETURN key for paragraph end or other fixed line break;  let word wrap form lines within paragraph.  Type ^V to turn insertion off (to overtype) or back on.   ^B will occasionally stop before the end of the paragraph  and ask you whether you wish a word hyphenated.  Following the instructions that appear on the screen, move  the cursor if desired to adjust the hyphen position,  then press "-" to hyphenate, or ^B to not hyphenate.  To turn off "hyphen-help", type ^OH.  press space bar:  ***** MARGINS *****  To set left margin: Type ^OL. WordStar will asks for column.  Type desired column number 1-240 and press RETURN.  Or, to use column of cursor in file, just press ESCAPE.  To set right margin: type ^OR, proceed as above.  To set both margins to match text in a line already entered:  place cursor in that line, type ^OF.  To temporarily set left margin to next tab stop: type ^OG.  Margins apply to text subsequently entered. To remarginate  text already entered: set margins and use ^B.  press space bar after reading:  ***** LINE SPACING margin (set with ^OR)  ! regular tab stop (set with ^OI, clear with ^ON)  # decimal tab stop (set with ^OI, clear with ^ON)  - other positions between margins   press space bar after reading:  ***** PLACE MARKERS *****   Up to 10 place markers, identified by numbers (n) 0-9,  may be set in a file while the file is being edited.  To set place marker n at the cursor position: type ^Kn.  will display to indicate the marker position.  To return the cursor to place marker n: type ^Qn any  time during the same edit.  To remove the from the display: type ^Kn when the  cursor is already at the marker position.  press space bar:  ***** OTHER MARKER & RELATED COMMANDS *****   The block beginning marker, ¾, and the block end marker,  ˾, are set and moved to in a similar manner; the  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or wri  ^N may be used to create blank lines ahead of cursor,  as before inserting a paragraph.  Use ^B to realign margins after corrections.  ^JM shows info on margins, tabs, table entry, outline entry. press space bar after reading:  ***** TO MOVE A BLOCK OF TEXT *****  1. Put cursor on first character, type ^KB to mark start.  2. Put cursor after last character, type ^KK to mark end  (for end line, use start next line to include RETURN).  3. Put cursor at destination, type ^KV to move the text,  or ^KC to make a duplicate copy.  To undisplay markers afterwards, use ^KH.  ^KB and ^KK may be entered in either order, with or without  other intervening commands.  All above commands are on ^K menu. press space bar:  ***** PARAGRAPH REFORM (^B) *****  To realign margins of a paragraph after corrections, place  cursor at beginning of paragraph and type ^B.  To change margins of parag AND JUSTIFICATION *****   To set line spacing: type ^OS. WordStar will ask for line  spacing. Enter a digit 1 thru 9.  To turn justification off (for ragged right format),  or to turn justification back on: type ^OJ.  Line spacing and justification settings apply to text  subsequently entered; they may be applied to previously  entered text with the paragraph reform command (^B).  press space bar for "Tab Stops":  ***** TAB STOPS *****   To set a tab: type ^OI. WordStar will ask for column number.  Type column number and press RETURN. Or, to use cursor  column, press the ESCAPE key. To set a decimal tab stop,  type "#" before typing column number or pressing ESCAPE.  To clear a tab stop or all tab stops: type ^ON.  To tab: type ^I, or press TAB key if present. Tabbing  inserts spaces to next tab stop if insertion (^V) is on.  Tabbing advances cursor over text if inserttten to a file (^KW).   ^QP moves cursor to its position before preceding command.   ^QV moves cursor to start of last find/replace, or to  source of text for last block move or copy.  press space bar:  IF THIS DISPLAYS YOU ARE USING WRONG VERSION OF WSMSGS.OVR ext for last block move or copy.  press spaceg edited.  To set place marker n at the cursor position: type ^Kn.  will display to indicate the marker position.  To return the cursor to place marker n: type ^Qn any  time during the same edit.  To remove the from the display: type ^Kn when the  cursor is already at the marker position.  press space bar:  ***** OTHER MARKER & RELATED COMMANDS *****   The block beginning marker, ¾, and the block end marker,  ˾, are set and moved to in a similar manner; the  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or wri COPYRIGHT (C) 1980, MICROPRO INTERNATIONAL, SAN RAFAEL, CALIFORNIA, USA. ALL RIGHTS RESERVED. WordStar release 2.10 overlay file number 1. overlays for no-file commands and editing  NOSEY, AREN'T YOU?   PDý>BE>?>y>Ã>m>I>0w͓>͜>2>͓>N>{> e>@G:>:>È>W>DÈ>W>"͓>y/7>/:>><2X?>2<)@*R=>6#"R=B[>D?B *C 3C DC8@,B  @ :?@:?-C6#J? J?~<`~CO?s?H@*f<:j2<2<:{@>@>čA#*S27lqNl:\2l:lq2\3ͯ$:8§lͽ9?o$ólͽ9EoSo&lqllol8l282O8:+26:6+).m:t8m3\!2l͂lq!eÂ5m&Nm5mm!D9K*D9yLlq$!L9xMͲL6LyhL6L!"o8!L9xJ*J9͈EdKcm6LͿl:7,ͯ$i$9͑0̀ ķ&:7:7,Ám9åm9>2A7G*7|!:Œo:7uoͯ$:6m!9L$:T82V8&$\!N6m,l2l3$q$*+2*6"g8"!8*g8!L$#+w#W$~OnuncnFnncnǴcnxGxL$}!++)ͽ :a$": nկ {nnͬn.“n#ͬn ʨń7nʿn ¬nn¸n>  n~n#.:*? п́#~+:n~n@##|p çlïl2m#9IWWFIND? REPLACE WITH? OPTIONS? (? FOR INFO) *** NOT FOUND: "REPLACE\(Y/N):  ???6"2m>ôl2m>267O#$$ͽlq$!6#247yl>,ͽlq$! 7#247>)L$*6!77 >297287:47/m!ͽl!)7 #nl5mԸ':@7Hm:77g"g*97";74n&!qͬf͚mqm*;7|!l!lR&:67m*;7|ʄm+";7:=7Qm&:77LYL2͞ ̈́nr͞oڲm̈́nm͈E&͍mңm:77"gg7 :77:57+n:87$nĞnm:77:57*H9BÈE͔d:57*H9BE*29! 7cnͮI:77:7+n[ 0*F9IÈE!6r:>7Incn[ncn>+wy<<+w#y257~~nwn>  > # fn+q#:>7:77–nMÙn_M?ÈE! l"_8\2.'0n@Yʺn>N!6͂̓ 7*-9~͊ $̓ *a8!$n#!!n&ͷ́<͚@%AF#ͱ@AJ?~ O#x͍A{A> ͍A"h<"R={2j2{<AA:<@3B!%<B#|k/"6<:.<_ C*6<|*9>/ C  >͉C!#>+D:O|kjC!oC/yKʁCyOҁC#zx!a:5*=+D×C*4<*7>+kC*8)SC";<*8+DñC͉C&!aD!,!D> (D>!,>*<-,BGDͱB+D!"2A7`l͐l͟lMm3:L6:b26>.m:2626:I!چl~<26>2L6!qe >2qe!l]ʼl!l]l!:"7-!q !28 2[2h2k2}.*!9"q"L9l*:9*L9/|<2828|D!"{8>28#m)"}8*m28!B7wȷ!  >2%!:7!G6w!\~zwlq:lrmw:\~m>2s88 !l~8!l !N6\:s8ʽm6 #:lq !d6lq!6~:s8lq> (&\>m2[m2t8ͽl$uq!l:A7.m:+26:6+);):7Hn*n!:"7:6=*7!a!6Gn5!9"7277G6o>2@72=7N@o287WKo>2>7UVo>2?7> ͽ"l͂ͽ$lq$7~͗o#bk))ܓo0_ܓo"97ro!0?::77o!H9o*H9oÈE!D9o*F9IpòoKGyOxG-pp p#o+Wp#oo#Bpp #&ppWppѷ p 8pWp# 2p2p7 Mp+Wp GpGp7ɮ`p jpˆpAډpG[҄p:?7ʄpxxɮʺpʪpȮ>ʸp~͗o>Ҩp~>ɛmllll(l:lÈlÙlmTMbM7lͣ+lE%cͷMMMlͣ@l#F*+q:%8O~`oly\olol Zl~~wy\…lDM2q6͇RzfTMbM͋͝dËl:Lq*6Weڳl*6+++͈hڶl*6"62Lq!qͱf(*=8"08!:8{!Tal!a"38>2:8!"08:Q8*]q:\qlq.M2m!qg*`qTM2mm%c!qqa>2Q87ɯ2bq{͹mm6m{͹m*m7?Cmͧm{xm͹m͓mʆmͧm>2bq͹m͓msmE7:bq7͹mSʝmD m͹m-7+q͏N"`q#{ʿm&bM? ܀ ڿm7*mɾ#45mplmýlEoÏne !.; ?DELETE? RENAME? NEW NAME? COPY FROM? COPY TO ? sm lnnhmlͯ$:6!9ͽ9:60͂ͽ9q$ͷ͂0262W8ͯ$:6!~9ͽ9|!i8 W$:T82V8$ͽ9q$!6#́rnXm_́{ʂͽl1mnÀmO*+Ùmn#$$q$O*+2*6"g8"!8*g8!L$#+w#W$~mnmmy=mL$}!++)ͽ :a$":Ùma$$:Ùmկ nrn8n.n#8n 4ń7VnKn 8nVnDn>  Ln~an#.:*? п́#~+:Šn~Ҋn@##|7sm"lnʤnnhmÔn`m$lʏn!8ʼnͽP:nnͽN:nhmén!8 6á8!z6>l!l!7+o:8o!\+o!lq+o:7'o!<+o:G6! =+o# _ͽ\:'oosm&l`m(lIoʎonlonhmToͽV:q$ͷ&!ʇo#~͂copK>2l:7!G6!8wGOy*@98ͩoxm8!z6#$>$q$O*+2*6"g8"!8*g8!L$#+w#W$~[m͉momomGy=ʁmxL$}!++)ͽ :a$": ma$$: mկ mmm.§m#m ʼḿ7mm mmm>  m~m#.:*? п́#~+:n~n@##|7:q!qʛnf!qf>(&>(&ͧn!qgqRNzWqbNof!@9K*@9ͳI2!qof}nͧn}nDn!qfoq&9gʘnEÉn}n!qf!qfo7n*>9*L9/*qk> (&2NI&[ ixg"q8!B9I*H9*B9w# n"B9z̈EEn!o!qf:q>(&:q>(&:q>(&o3OmemtmÎmnJnmmmmn nânnmm9s{IQ0 ENTER space OR NEW LINE SPACING (1-9): LEFT MARGIN COLUMN NUMBERumn)? (ESCAPE for cursor col RIGHT For decimal tab stop enter "#" and decimal point column  SETJ~$zn++Ts#r+##s#ra++nT#r+s+r+saT8ɛ{1g|*"g|*"i|k|q{9o|t{y{ʃz{ʃzڃz!\!yt{!4yt{@{{>1e|*g|"*i|"!!k|l{!x|l{|{z!|{ͦ{!|{{ |{||$:||*|:||> 2]!|{ͦ{!|{yʁz {*g|>2n|{2n|x|"{:n|"{1e|!|{Áz!y"*!={l{!!i{l{!r|"q{${:|x~# t{^#V+~#ʕ{͠{Æ{!~͆{Æ{O> ì{2n|>*_y;{{N#!Ϳ{5x>4!||!||!||!|!|{{!|{ͦ{8d Hit any key to returq͠Hxg2 %uGGxg2  oG AG Gxg2  Gͭc*q#"q*q#"q:'bG*qkjG> ͧGG>ͧGGG:GG*q͙Gs#r!"q*q#"q*q&)*qg:'2Hq|bk+5\:kq*q*q:'HͼG!GG!G% HHLHTHPLiHMToHMBuHCP0HPAH͗% G> ͧG*q#"q͗% H>ͧGHGY%H͗% H*q*q#k%HHY%HH͗%g}2 qÑH! qxH!qxH!qY%HH͗%vW{͘HͰH| HO: q* !f q*q*q* q/|H`h: q/<_H Hi`"qa 2qx%I  II HJI`IH:'IJI`I3IH:qOqI*q+"q:XIJI>2q!q454%*q+"q*q+"q͙GX"q*D9/A|#O ʋI wIxMI:q1I*F9NͽL*F9qI͋Ig2OI JIIºI ͐F  *F9*H9k!F9!F9KxaͣJz{JKI>G&>28!D9jJ*q*u8k-J"u8!H9jJYJ/*w8kGJ"w8*y8kUJ"y8a*8*~/K`i)\wJ!<9#k+ڐJJͺJJ!J9kaJ++++ÓJ!:9K ͺJҫJ####K9kK++Ts#r+##s#ra++KT#r+s+rUMNF TAB AT COL CLEAR./; A for all)? i$?lͷ͂1< 2)!28~6qm6(!D7Alͳm2626<<<26===!6w!6wzo(=xm*"q|}m>m<>! n!!{!"{!#{!${!%{2!&({:'!(m!9"7El!P7oͶm_z#6n_n_n(y!5 ÁnGl!P7Áo;nͶm_{m!5Bzn)))){/w!=6+ʙn~ʈn™n{25(xgon+E!qͱf7o*eq*6/*6*cq|n[}n!qg> kF-n!qgxgoo+͈E4o:cq~m:eq=͘m(nTM*Oq"cq͎g͊7͟gͯo *cq"OqTM*Oq"eq:Oq_͎g͊͟gͯJoBo!1n#6n-]nBoÁo$L$#Gy¯ó#ʭo!¯oW#́7oó{ƒo҃o~:0#bk))BoOpl !/ COMMAND? WHAT???   NOT FOUND  Enter name of program you wish to Run,  optionally followed by appropriate arguments.  Example (shows disk space): STAT :7m!Fn to WordStar: Replace diskette with file , hit any key: *** file  still not found *** *** file  bad (too big ??!@&*) *** *** file  bad (too short) *** ***  found is bad or incompatible version *** ^C Cannot return to WordStar. Replace system disk (if removed), Hit any key to return to Operating System: WS.COM zo(ll:8:77E4>ul:7ul!7~6Cl:73 >2 <ͯ$:8]lͽ9!6ͽ9m>2 <27/2 <27:8ao<! < G6!ͯ$m>+sa!H9T86KͣKa:8GO ͣK3K (KaKdKa!n84F!8HK=O:8=GdKaK VK`*o8*F9/*D9k*q*u8klqҎK;ÛK$*u8#"u8"D9*J9ͲL»K:8WIzLK*q8*H9kڻL*w8YJkK\BL*y8YJk8L;L$*y8+"y8ͲL"J9;G+~# %L> .LaͲLͣJ6KM*}8!L9MhLͲL6L!L9L*J9́LԚLwL28"J9 kLaK&87İ[7ĩ~ʫL#œL7>>:[!87:kq76LK!D9L*D9&lqͰaK"D9 LaK6K*}8ͣJkM*{8)$$MMO>G&xJͣJk*M)|Lɯ2 qNDM*H92 q/2 q*F9NM*J98K*H92 qTMxlM~# ! q~6ʋM2 q*H9*J98xq͏N9L2Mx7*J9ɯ2 qN*H9ұM*D98>2 q*F9îMͷMxM+~ ! q~6M=2 q!D9T8xq͏NͽLͣMx7RNg>_q:~EW o g _ Wz}|{ wN*F9k*H9k>G&͚NcNqNʽN*F9ڭN*H9}o|g_P&!\öNRNN{O>G&z$O*H9*J9/#k+NYLN*H9:"7,/~k!H:m28>3!|!  !͞!J:m!~!"|~2|!=8"|ͯ$:6!lZ$:T82V8&$$a$l$ͽlL$!QpM#ḿyoңmͽlwm!y6C#6O#6M̞mͽlwmy͒n#y͒n23y4y~# myL$!+~w2Z8͑0w="w*y A,/! !5!~y/++/.!yy//!yy8!5|y8̓oo!~5|8! Dկ ˜nfon.°n#n ń7nn*n nnn>?nn> n n~o#.: пկ ofo4o.,o#4oõnRoGo 4oRo@o>  Ho~]o#*?ó#~+:~o~~o@##|7~#fo"o#/"ooooooog*os#zw+|o~w#+|›o*oF#"oxG o8 Hit`m a66m3fmm6`mٳ `16lٶt found *** *** file  bad (too big ??!@&*) *** *** file  bad (too short$q$O*+2*6"g8*g8!L$#+w#W$~Pn~ndndnGy=vnxL$}!++)ͽ :a$":na$$:nկ „nn͵n.œn#͵n ʱń7nn µnnn>  n~n#.:*? п́#~+:o~o@##|7͘$*6&!bkL$#́68qNʲEڵE*H98"H9`i-O<>G&*F9*D9/k$OͽL O*F9z7>2 q&:H!EAO~=2)8=2,8=2+8 ]`i"-q "/q͠H>28a/]P*38:kʣO::8ʣO!;8~6AP0͛_ڟO:98*78*387O2:82;8Oͫ&*y /OyªO!ax ڪO*38"58"38"78y2>8x2=8:.8!:8O2-8÷/qRNqbNñf:68P.'$:T8> l2\22T8[ ͯ$,2Z$:T82V8ɯ2T82O8:6!a$9M _M͈E_MͣOPmPZP!%ʊP ܀ %7]P!?8~6%QcTP`i+~+++°P6! ^#V{P\?Gͱ2G:)8P>Px=]MTckbN7>~\͇R/S+Q*-q~Q[|RQ] +Q \#SQ*S|RKRP͝Qq͓Q{<%cq͓Q{%cq͓Q{c[ 2Hq:6!qͱfGuQ!qg*/qDM9gĈEg26:Hq*S+QRN :%8]`i"+qRNmV:%q2&8*&q" q""q:(q2q[ :q\Z R:q=]!ER R RRNmV*Dq*"q""qQ>?2$q!@8~6/[ #R#!̓ !:28=2R>R9R7>R(!285whԁhZ|RcT\ER!+8!HoRͷZ#SKR)\͝2*SKR>ÄR:)8]2q:qW!ER! 45ʧRYTÑR=6++++!ERR! ~ʷRYT!ERRRRNVSmV#N S͆\[9TR\[W:6[:{'[þ\=[=[!!{j&!!:'8W"͞ *+98*)98 W͒\:6¹[:t[>[þ\:+ƒ[:T8!W8ʡ[:A8ʃ[2O8e)(]"> Jì\[[!t1[:'8W" [||g}oqPY!r8!pg2`iq\q\PY!r8![ \=+\͚NH\DMRNb\ԥ\g2cTԥ\K\r:EW |\|\#Nʋ\҆\i\7 †\::,8 ]ͥ\ ~q!E\:E ]!E/\W:Eq_\ \Gͱ2Oxͱ2!)8/<ͱ22qog))r DM!r [}:)3]>!6FO:28A] *_8|L]:7!s8O!\ #~ g] _]:I'}]'!N6s(,Yʡ]B(E*q#͊^b(E*q#͊^]B(E:q_*q-(͊^:$q(*_8| ^>+'p(*29*c8/e."a8:6!28'~#^>B( E:Lq1^>B($E=^>%B("E:)S^>0B((E0(`^g^+|g^xʊ^`i`^(Iz :^8:\8W(O*29:I=G:&^:+:6^_{!6z^!6w# ^^6+i,ä^> ^w#^6 i,z2]8>WDM9gaz&͈E2n8g!qf_M&2!]N͈E"g[ RN{pg{\gTg|kg!kgkF 7> GJgOͯĠ2!"qyq́hͪg>2Iq2Nq͔hohhQ\oh*Zq*6/"]q+|ch͠k:!jQ\%cjQ\9h͈E2Q8*"q*6Èh*6*"qzʑh7?{xgTM*OqzhbM͊7ʽh+sjh~w#͟gÚh͈E*Oq*6"Oq/ErkTM&q>͏N!Qq  4ih> 2Yq:Uq:Xqi!9"74i!Yq5i*Vq"Zq*q"q*q"qnjͅj Fi͕a7͊7Ti>+w#_͛iW*Oq͟g*6*Oqti#͈hҔi:Vq”i"Vq+q>͏N:Vq{jʲizj>ʽi{ͯʶi2Xqzͯ>G!Qq~p#wzͷxiO#~q#wz2\q*Oqi#"Zq!Uq4+xq>͏N=j: q͟MMw2 q&q͟MMW&j6.M2njEjͅjWͯ,j͊7+͈E:)=_&>kF> kFMj&*6"OqErkTM:Nq͚Nq#N7bMʕjʕj+͈ETMbMڹjʜjQ\µj͕aÜj+ͿjE_M͙ zjͯ+6 -:RqG:]q!gq64j!TqjwO zbg 整9TMTzWbN͆\bN:,8=,S>]! BS~wSS MS~SS_SVSMT0T1SRN:q!EmV MT!E$TzS $T $T#NR͆\ SmV#NSZ9TMTR:q!E$TåS9ToS #T#NS$TZRS͆\ T$T $T WbNMT!ET$TbN0TbS:)8 TʮU:DqU/U:%ʾU4UU@U:!6T̀ NU:%pU>^TʮU@TʮÙ UUV!ʍU;U*Dq##"DqaU> &™U>~ʯU!Gqw#: qU*Bq"Dq*@q*>q: qUɯ2 qz2%q*DqzB"&q:Gq2(q!6! qF6TOx2 qy*Dq V*Dq++"Dq͟MM/V͚NͷMEVxbV+~  2V#xbV+~ # +HV>M#1qbNz2:q>29q2=qvX.M> 2Fq!"DqU:I_*29::q`WìVTEW:Gq! qW:;qVV{=VyWO VVw# Vxg{_zWy8O:;q2^8{!6,__\:+8] àZ:+!E8\)*-q++++~a:%8!+8`Za:{!6]àZ*-q~͝2 \*Saa bMͣ+!6{:6:q=%cuc*F9++͈E>2q26a͸'P0*6ͷ2982/8;'! aNbbÔd!Iq6298-'b!Q845%brg!#45'b>Nb- ~:O8/!Iq!:8O2=8bcgG1cxGܔdlb!qJxkF ܔd!A85bhʔd2Q8_Mڲb͝ ܔd1c:6”d~ ܔdE*+q~###b~bw+w+w###rkҵb 1c!qͱf!qgM cMc#͙k!_q4 k<552hqx!Tq2iqq.MbM`kk&!Rq5_k͵:gqBk!Tq5Qk!hq5Qk!iq5Qk=<kckTMk:]q͈E!]qnk~G~w&xk>OxGkͳIrk:$/!Nq:Rq!!]q3 nlm{n!! k8l:81l>3l!9"7!@9Pn*<9"P="L="J="N="X="`="\="Z=6#"T="R= 6#"V="^="F="H="< s#r" <>s#r#:7l*@9 kl!v:"7">92>2<:G6m::l>2<=/l2<2<>m:>m:>m/2:G6! Wm:i!8i"_*]a"_a*?a"Aaw*Qa"`"`*=aw*daw*Sa"Waw+w/2_2_:2_>27:7ʀ 3 ,3%nͱ *F=3w#6*H=w#62-<:<2.<:2/<2<*"q"@q*Dq"Bq*>q!;q5'XbMVWʴW ʮW~W ʙW ¦VÐW+2 q:pW W:pWW:iWW 2FqiW:9q29q#,YʐW:iW:W:iWW,Y> ʦVTEWsW ÄW:÷W:iWbMW WW,YWW#:pW@+> O;U*DqzB"Dq5q:9q͏NwXX6Y:GqGXw#X:Fqw[ 5qRN:>ULW͚NvXW22Gq!;q4aXa o  }!;qзXz!=qد2;qz2?ͫYiW͉Y`i{=ʴY~ʴY#ͫYw#͢ÑY!Gq!6:iWlY:':(7XZ9vYLHYPLYMTYMBYHMlYFMlYPClYPOlYSRlYUJlYBPlYCWlYPAkYCPlYPNkYOPkYHEkYFOkYIGkYPFYOJYIJYLMYLSYRMYCSYDMYSVYAVYRPYDFYRVYFIY!a1q͟MM%gZM"YkZ][ Z ̠ZMT!)8Zg2RNmV *q͑ͱ2͚\h[ \×\[ͱ2[ì\]!)8\\2h[\×\][!)8[c!Mq4cF*"q+""qg*q-!c!ę!"Lq"Q8:Lq:67:q=ȷ%cͭćhYc!28~6(!A85:)=mc=cc!645ʂc͔d> kF> kFTMbMڤc›c+ J5\w#ͣ…cÈE͈EQ\xc:6!6w(Ը'͞ c[=ćRaeÝ2Ը'͞ c)\*S] c[́Rac\g?<:q%cM`F@d*+q~~wÑd_M͕aO͎d!q~y@d4 :Lq!Mq~Td5!qͱf!qg> kFͱf:qg_MͩM͓TMm`̏`%cEzf*+q:!q¨d: q Ұd~~w++++~~w>2Iq%cd:Lq!"q$"qͷMMd͙d#qÏNTed!""q[cz:60eTM*"q͈h҈EbM-e+͝-e#!"qqe͈EQ\> g:"> lb*"q͈h> kFGe*"q:"le{_ÎezʂeZe& 7 [e{teͰeZe2Lq2«e*6͈hte*6͈hZe 7ȷ{!5B~eo&" q*+q~e++++e~`e"+qDM#`_.MfÈE!")q* qU|f{bM+Bf͝#!)qq#:!q?ff+zf+͈EMGfͽfܝ2~###f6?\ͳf?\͋f!qw2a:6qRNz>q >#N>6qf6#w#w#w/}))q~wwf~~wwffͽff>(&>2 D>:ėC!%<U<@!">2<[z?*R=S>>6#"R=!&>!<455Y?D>͓>>E? /C /C `??!B T? ʉ>6#͵> ͯ> #ͯ> ¥>~ɯ!<4͵>~<`~Cú>!<~X?~62<?2k<*h<͓>>#!k<44ͪ>~>"R=͙?*f<:j<?:k2@<2A<>>">5>ɯC>!\=) K>w#"\=!\=T/zK>6#?>ͨ! <~6!Z=) ҁ> =2w>!|9"7͠K>"Z=N>͓ *`="Z="\=ɛ B:(<: !a æC:<!a:=BGCBfB!"<[:[TB͌BCB:=(=LX:Ox 3 O[:%=7=Rd*<#=B:=BzBڶB!<¯B6¶B6:<͌BÖBB!<4:=>2<͌BB~B5>1BzB!<~4:=:<!*<DPY!+<D $BC@z?:<<̉D:"!<`B H:<̔B:<:%Dy!a %C+C *C*C!?<4x!:<4:<ͳC!a:=CG]C̀C!"<[:[nCͩC]C:=(=LX:Ox 3 O[[:%=7=Rd*<#WC:?<=2?<> ;CóC:=C͗CC!<C6C6:<ͩCCD!<4:=>2<ͩCD~D5>KC͗C!<~4:=:<?8D!Ca:<Da:MC>:zB:(>><2[2<͇?*R=[>¶>6#"R=!<>͢>hC C C C?A k? ʘ>o?ʘ>C6#ͨ> ͨ>~<`~Cí>>ͦ?*f<:j!9BK/!%<2z~6# Ox@?"f2<2<:{ @ +~<.@*V=++~*<>B@>B@>@#*SO#x@{a@> @"h<"R={2j2{<MAMAMAVAC'A2<͌BB~B5>1BzB!<~4:=:<3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk Status : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V"L!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\LR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠")*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*) w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W>!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*) w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W; ;MUSIC4 ; MUSIC PLAYING PROGRAM USING STORED ;WAVEFORM AND OUTPUT TO AN 8 BIT DAC ;SEPARATE WAVEFORMS FOR EACH VOICE AT WAVE1, WAVE2 ETC. ;WAVEFORMS ARE ASSEMBLED BY A BASIC PROGRAM WHICH ;IS CALLED AWAVE. THIS PROGRAM ;OUTPUTS AN ASM FILE WHICH IS INPUT TO ASM PRODUCING ;A HEX FILE WHICH LOAD MAKES INTO A COM FILE ;TO BE USED BY MUSIC4. ;TUNES ARE PUT TOGETHER SIMILARLY BUT WITH ANOTHER ;BASIC PROGRAM CALLED NOTES. ; APORT EQU 5 ;ANALOG OUTPUT PORT INIT ORG 100H XRA A OUT 79H CMA OUT 78H MVI A,4 OUT 79H LXI SP,STACK SINON LXI H,INTRO CALL TXTYP CONTROL LXI H,PROMPT CALL TXTYP ;PUT PROMPT MSG ON CONSOLE CALL CI PUSH PSW CALL CRLF POP PSW CPI 'T' ;LOAD A TUNE FILE JZ TUNIN CPI 'W' ;LOAD A WAVE FORM JZ WAVIN CPI 'Q' ;QUIT...BACK TO CP/M JZ 0 CPI 'S' ;SET TEMPO JZ SETEM CPI 'M' ;MOVE UP OR DOWN SCALE JZ MOVE CPI 'P' ;PLAY THE TUNE JNZ SINON ;IF NOT L OR P OR Q ASK AGAIN START DB 0DDH,21H ;LD IX,TUNE DW TUNE NEXT LXI H,0 SHLD V1PT ;INITL TXTIN CALL CRLF LXI H,CONBUF+2 MOV A,M ;FIRST CHAR OF INPUT CPI '+' ;MOVE UP JZ UP CPI '-' ;MUST BE EITHER + OR - JNZ MOVER CALL DECBI ;CONVERT INCREMENT TO BINAY RAL ;TWO BYTES PER STEP, SO *2 CMA ;MOVE DOWN, SO SUBTRACT MOV B,A ;SAVE FOR LATER USE JMP MOVAL UP CALL DECBI ;SAME AS ABOVE MOV B,A ;BUT ADDED TO MOVE UP MOVAL LXI H,TUNE MOV1 INX H ;BYPASS TIME BYTE MVI C,4 ;4 NOTES EACH LINE MOV2 MOV A,M ;GET NOTE ORA A JZ OK ;REST, SO DON'T MESS WITH IT ADD B ;ADD OR SUB INCREMENT CPI 131 ;RANGE CHECK JC OK ;MAX IS 130 XRA A ;SET TO 0 (REST) OK MOV M,A ;PUT IT BACK IN TUNE INX H DCR C ;DO 4 NOTES JNZ MOV2 MOV A,M ;NEXT TIME ORA A ;SET FLAGS JNZ MOV1 ;ZERO IS END JMP CONTROL MOVER LXI H,MVRMS CALL TXTYP JMP CONTROL ;CONVERT 2 ASCII DIGITS TO BINARY ;RETURN WITH VALUE IN A DECBI INX H MOV A,M CPI '0' JC SETER CPI '9'+1 JNC SETER SUI '0' MOV B,A INX H MOV A,M CPI '0' JC FINI CPI '9'+1 JNC FINI SUI '0' MOV C,ANS A NON-ZERO ; IF KEY PRESSED AT CONSOLE CSTS PUSH H! PUSH D! PUSH B MVI C,11 CALL BDOS ORA A POP B! POP D! POP H RET ;++++++++++++++++++++++++++++++++++++++++++++++ ; ; MAKE CP/M FILE CONTROL BLOCK ; ; MAKEFCB.LIB - VERSION 0.2 - 28 OCT 77 ; ; JEFFREY W. SHOOK ; P.O. BOX 185 ; ROCKY POINT, NEW YORK 11778 ; (516) 744 7133 ; ;++++++++++++++++++++++++++++++++++++++++++++++ ; CREATE A CP/M FILE CONTROL BLOCK FROM ; A COMMAND STRING AT THE ADDRESS IN HL ; AND PLACE IT AT THE ADDRESS IN DE. RETURN ; WITH THE CARRY SET IF AN ERROR OCCURS. ; DEFINITIONS FCBSIZ: EQU 33 FNMLEN: EQU 11 ; FILE NAME LENGTH MTFCB: PUSH H ; SAVE CMD STRING PTR PUSH D ; SAVE FCB ADDRESS LXI B,FCBSIZ; CLEAR ENTIRE FCB AREA MVI A,0 ; CALL FILLB ; POP D ; FILL FILE NAME WITH SPACES PUSH D ; INX D ; LXI B,FNMLEN; MVI A,' ' ; CALL FILLB ; POP D ; RESTORE POINTERS POP H ; CALL SKIPS ; SKIP LEADING SPACES INX H ; CHECK FOR DISK CODE MOV A,M ; DCX H IALIZE POINTERS SHLD V2PT SHLD V3PT SHLD V4PT MVI H,NOTES/256 ;PAGE FOR NOTES TABLE DB 0DDH,7EH,0 ;LD A,(IX) ORA A JZ ENDTUN STA DUR DB 0DDH,23H ;INC IX DB 0DDH,7EH,0 ;LD A,(IX) MOV L,A MOV B,M INX H MOV C,M DB 0DDH,23H ;INC IX DB 0DDH,7EH,0 ;LD A,(IX) MOV L,A MOV D,M INX H MOV E,M DB 0D9H ;EXX DB 0DDH,23H ;INC IX DB 0DDH,7EH,0 ;LD A,(IX) MVI H,NOTES/256 ;PAGE FOR NOTES TABLE MOV L,A MOV B,M INX H MOV C,M DB 0DDH,23H ;INC IX DB 0DDH,7EH,0 ;LD A,(IX) MOV L,A MOV D,M INX H MOV E,M DB 0DDH,23H ;INC IX DB 0D9H ;EXX TON1 MVI A,64 STA TEMCT TON2 LHLD V1PT DAD B SHLD V1PT MOV L,H MVI H,WAVE1/256 MOV A,M LHLD V2PT DAD D SHLD V2PT MOV L,H MVI H,WAVE2/256 ;PAGE FOR 2ND VOICE ADD M DB 0D9H ;EXX FOR Z-80 DB 08H ;EX AF,AF' FOR Z-80 LHLD V3PT DAD B SHLD V3PT MOV L,H MVI H,WAVE3/256 ;PAGE FOR 3RD VOICE ADD M LHLD V4PT DAD D SHLD V4PT MOV L,H MVI H,WAVE4/256 ;PAGE FOR 4TH VOICE ADD M OUT A MOV A,B RAL MOV B,A RAL RAL ADD B ADD C RET FINI MOV A,B RET SETER LXI H,SERMS CALL TXTYP JMP CONTROL ;WAVE FORM INPUT WAVIN CALL INIR ;OPEN THE FILE LXI H,WAVE1 ;PUT IT HERE JMP FILP ;SAME AS FOR LOADING TUNE ;TUNE INPUT ROUTINE TUNIN CALL INIR ;OPEN FILE CALL GBYT ;GET FIRST BYTE FOR TEMPO STA TEMPO LXI H,TUNE FILP CALL GBYT ;GET A BYTE FROM FILE JC CONTROL MOV M,A INX H JMP FILP ;DO UNTIL EOF ;GET CHAR FROM CONSOLE CI PUSH H! PUSH D! PUSH B MVI C,1 CALL BDOS POP B! POP D! POP H RET ;OUTPUT CAR RET AND LINE FEED TO CONSOLE CRLF PUSH H LXI H,CRST CALL TXTYP POP H RET CRST DB CR,LF,'$' ;TYPE A LINE OF TEXT ON CONSOLE TXTYP PUSH H! PUSH D! PUSH B XCHG MVI C,9 CALL BDOS POP B POP D POP H RET ;INPUT A LINE OF TEXT FROM CONSOLE TXTIN PUSH H! PUSH D! PUSH B LXI D,CONBUF+65 MVI C,65 ;CLEAR BUFFER TO SPACES MVI A,' ' TXTN1 STAX D DCX D DCR C JNZ TXTN1 MVI C,10 CALL BDOS POP B! POP D!; CPI ':' ; JNZ MTFCB1 ; JUMP ON NO CODE MOV A,M ; TEST IF DISK CODE GOOD INX H ; INX H ; SBI '@' ; RC ; MAKE ERROR RETURN IF BAD CPI 'Z'+1 ; CMC ; RC ; STAX D ; STORE DISK CODE AT FCB + 0 MTFCB1: INX D ; MVI C,8 ; PROCESS FILE NAME FIELD CALL GETNAM ; MOV A,M ; TEST FOR FILE TYPE SEPARATOR INX H ; CPI '.' ; JNZ MTFCB2 ; MVI C,3 ; PROCESS FILE TYPE FIELD CALL GETNAM ; MOV A,M ; INX H ; MTFCB2: CALL TERMT ; TEST FOR CORECT TERMINATOR RET ; PROCESS NAME FIELD GETNAM: MOV A,M ; GET CHAR FROM CMD STR INX H ; CPI '?' ; ALLOW AMBIG REFERENCE CHAR JZ GETNA1 ; CPI '*' ; FILL REST WITH ? JZ GETNA2 ; CALL VALCHR ; TEST FOR ALLOWED CHAR IN NAME JC GETNA3 ; GETNA1: STAX D ; STORE CHAR IN TFCB INX D ; DCR C ; CHECK NAME SIZE JNZ GETNAM ; RET ; GETNA2: MVI A,'?' ; FILL REST OF FIELD WITH ? MVI B,0 ; JMP FILLB ; GETNA3: INX D ; MOVE FCB PTR TO END OF FIELD DCR C ; JNZ GETNA3 ; DCX H ; RET ; ; TEPORT DB 0D9H ;EXX FOR Z-80 LXI H,TEMCT DCR M ;TEMPO COUNT JNZ TON2 LXI H,DUR DCR M ;DURATION COUNT JNZ TON1 JMP NEXT ; ENDTUN CALL CSTS ;CHECK IF ANY KB ENTRY JZ AGAIN CALL CI ;GET CHAR FROM CONSOLE CPI 3 ;CONTROL C JZ 0 ;BACK TO CP/M CPI 1BH ;"ESCAPE" JZ CONTROL AGAIN LXI B,0 ;WAIT A WHILE BEFORE AG1 DCR B ;STARTING TO PLAY JNZ AG1 ;THE TUNE AGAIN DCR C JNZ AG1 JMP START ;SET TEMPO FASTER OR SLOWER ;+ IS FASTER...- IS SLOWER..ARG. IS DECIMAL 2 DIGITS SETEM LXI H,SETMS CALL TXTYP CALL TXTIN ;USE CP/M IO TO GET LINE CALL CRLF LXI H,CONBUF+2 ;FROM CONSOLE MOV A,M CPI '+' ;FASTER JZ UPTEM CPI '-' ;SLOWER JNZ SETER ;MUST EITHER + OR - CALL DECBI ;CONVERT 2 DEC TO BINARY LXI H,TEMPO ADD M MOV M,A JMP CONTROL ;DONE...ASK FOR ANOTHER UPTEM CALL DECBI ;CONVERT DECIMAL TO BINARY LXI H,TEMPO CMA ADD M MOV M,A JMP CONTROL ;FINISHED...ASK FOR NEXT ;MOVE ALL NOTES IN TUNE UP OR DOWN THE SCALE MOVE LXI H,MOVMS CALL TXTYP CAL POP H RET ;OPEN FILE OPENF LXI D,INFCB MVI C,15 ;CPM FUNCTION FOR OPEN CALL BDOS CPI 255 ;FAILED TO OPEN IF = 255 CMC RNZ LXI H,NOFMS ;FILE NOT FOUND MSG CALL TXTYP STC RET NOFMS DB 'FILE NOT FOUND',CR,LF,'$' CMDMSG DB 'TYPE COMMAND',CR,LF DB 'T - LOAD TUNE',CR,LF DB 'W - LOAD WAVEFORMS',CR,LF DB 'P - PLAY TUNE',CR,LF DB 'Q - QUIT (TO CP/M)',CR,LF,'$' ;GET A CHARACTER FROM DISK FILE GBYT PUSH H CALL DISKIN ;LIB ROUTINE TO GET BYTE POP H ; FROM DISK FILE RET ;INITIALIZE TO READ DISK FILE INIR LXI H,GREET CALL TXTYP CALL TXTIN CALL CRLF LXI H,CONBUF+2 ;+2 FOR COUNTS LXI D,INFCB ; A LA CP/M FORMAT CALL MTFCB ;LIB ROUTINE TO MAKE FCB JC INIR ;ERROR, TRY AGAIN CALL OPENF ;FCB OK, OPEN IT JC INIR ;ERROR, TRY AGAIN LXI H,INBUF+128 ;INIT. FOR DISKIN SHLD INPTR RET GREET DB 'ENTER FILE NAME ',0DH,0AH,'$' ;TEST FOR ABORT (CNTRL C) ABTST CALL CI CPI 3 RNZ ;NOPE JMP RESTRT ;RETURN TO CP/M ;CONSOLE STATUS CHECK...RETUR ST FOR VALID CHAR IN NAME FIELD ; RETURN WITH CARRY SET IF INVALID. VALCHR: CPI '*' CMC RZ CPI ',' CMC RZ CPI '.' CMC RZ CPI ' ' RC CPI '^'+1 CMC RC CPI ':' CMC RNC CPI '@' RET ; TEST FOR VALID FILENAME TERMINATOR CHAR ; RETURN WITH CARRY SET IF INVALID. TERMT: CPI ' ' RZ CPI ',' RZ CPI CR RZ CPI ';' RZ STC RET ; SKIP SPACES IN CMD STRING SKIPS: MVI A,' ' SKIPS1: CMP M RNZ INX H JMP SKIPS1 ; FILL BLOCK WITH VALUE ; ENTER WITH: ; A = VALUE FOR FILL ; DE = START OF BLOCK ; BC = LENGTH OF BLOCK CLRB: MVI A,0 FILLB: INR B DCR B JNZ FILLB1 INR C DCR C RZ FILLB1: STAX D INX D DCX B JMP FILLB ;++++++++++++++++++++++++++++++++++++++++++++++ ; ; SEQUENTIAL DISK CHARACTER INPUT ; ; DISKIN.LIB - VERSION 1.0 - 18 SEP 77 ; ; J.W. SHOOK, P.O. BOX 185, ROCKY POINT, NY 11778 ; ;++++++++++++++++++++++++++++++++++++++++++++++ ; BEFORE READING A FILE SEQUENTIALLY ; INC3 DS 2 INC4 DS 2 TEMCT DS 1 ; ;TABLE OF INCREMENTS FOR EACH NOTE. 2 BYTE ENTRIES ; ; ID NOTE FREQ INCR NOTES ORG 256*($/256+1) ;MUST BE ON PAGE BOUNDARY DB 0,0 ;0 REST 0 0 DB 0,244 ;2 C1 32.702 .95445 DB 1,3 ;4 C1# 34.647 1.0112 DB 1,18 ;6 D1 36.647 1.07135 DB 1,35 ;8 D1# 38.891 1.13505 DB 1,52 ;10 E1 41.204 1.20255 DB 1,70 ;12 F1 43.654 1.27405 DB 1,90 ;14 F1# 46.249 1.3498 DB 1,110 ;16 G1 48.999 1.43005 DB 1,132 ;18 G1# 51.915 1.5151 DB 1,155 ;20 A1 55.000 1.6070 DB 1,179 ;22 A1# 58.270 1.70065 DB 1,205 ;24 B1 61.735 1.80175 DB 1,233 ;26 C2 65.405 1.9089 DB 2,6 ;28 C2# 69.295 2.0224 DB 2,37 ;30 D2 73.415 2.1427 DB 2,69 ;32 D2# 77.783 2.2701 DB 2,104 ;34 E2 82.408 2.4051 DB 2,140 ;36 F2 87.308 2.5481 DB 2,179 ;38 F2# 92.498 2.6996 DB 2,220 ;40 G2 97.998 2.8601 DB 3,8 ;42 G2# 103.83 3.0302 DB 3,54 ;44 A2 110.00 3.2104 DB 3,103 ;46 A2# 116.54 3.4013 DB 3,154 ;48 B2 123.47 3.6035 DB 3,209 ;50 C3 130.81 3.8178 DB 4,11 ;52 C3# 138.59 4.0448 D THE FOLLOWING INITIAL CONDITIONS ; MUST BE ESTABLISHED. ; 1) A CP/M FILE CONTROL BLOCK ; CONTAINING THE FILE NAME MUST ; START AT LOCATION INFCB. ; 2) A 128 BYTE BUFFER AREA MUST ; START AT LOCATION INBUF. ; 3) THE FILE MUST BE SUCCESSFULLY ; OPENED. ; 4) THE NEXT RECORD POINTER IN ; THE FILE CONTROL BLOCK MUST BE ; SET TO ZERO. ; 5) THE WORD AT LOCATION INPTR ; MUST BE SET TO INBUF+128 TO ; MARK THE BUFFER AS EMPTY. ; 6) TO READ A FILE AGAIN, JUST SET ; NEXT RECORD TO ZERO, AND ; RESET INPTR. ; READ CHARACTER FROM FILE DISKIN: LHLD INPTR ; TEST BUFFER POINTER LXI D,-(INBUF+128) DAD D MOV A,H ORA L CZ RDREC ; IF EMPTY, READ NEXT RECORD RC ; RETURN ON BAD READ LHLD INPTR ; GET CHAR FROM BUFFER MOV A,M INX H ; MOVE BUFFER POINTER SHLD INPTR RET SETMS DB 'TYPE +OR-NN...+ FASTER...NN IN DECIMAL$' SERMS DB 'ERROR...TEMPO UNCHANGED',CR,LF,'$' MOVMS DB 'TYPE +OR-NN...+ UP SCALE...NN DECIMAL$' MVRMS DB 'ERROR...TUNE UNCHENGED',CR,LF,B 4,73 ;54 D3 146.83 4.2854 DB 4,138 ;56 D3# 155.57 4.5402 DB 4,207 ;58 E3 164.82 4.8102 DB 5,25 ;60 F3 174.62 5.0962 DB 5,102 ;62 F3# 185.00 5.3992 DB 5,184 ;64 G3 196.00 5.7203 DB 6,15 ;66 G3# 207.65 6.0604 DB 6,108 ;68 A3 220.00 6.4208 DB 6,205 ;70 A3# 233.08 6.8026 DB 7,53 ;72 B3 246.94 7.2071 DB 7,163 ;74 C4 261.62 7.6356 DB 8,23 ;76 C4# 277.18 8.0897 DB 8,146 ;78 D4 293.66 8.5707 DB 9,21 ;80 D4# 311.13 9.0804 DB 9,159 ;82 E4 329.63 9.6203 DB 10,49 ;84 F4 349.23 10.1924 DB 10,204 ;86 F4# 369.99 10.7984 DB 11,113 ;88 G4 391.99 11.4405 DB 12,13 ;90 G4# 415.30 12.1208 DB 12,215 ;92 A4 440.00 12.8416 DB 13,155 ;94 A4# 466.16 13.6052 DB 14,106 ;96 B4 493.88 14.4142 DB 15,69 ;98 C5 523.24 15.2713 DB 16,46 ;100 C5# 554.36 16.1794 DB 17,36 ;102 D5 587.32 17.1414 DB 18,41 ;104 D5# 622.26 18.1607 DB 19,62 ;106 E5 659.26 19.2406 DB 20,98 ;108 F5 698.46 20.3847 DB 21,153 ;110 F5# 739.98 21.5969 DB 22,226 ;112 G5 783.98 22.8811 DB 24,62 ;114 G5# 830.60 24.24'$' INTRO DB 'MUSIC PLAYING PROGRAM COMMANDS',CR,LF DB 'W...LOAD A WAVEFORM',CR,LF DB 'T...LOAD A TUNE',CR,LF DB 'S...SET TEMPO FASTER OR SLOWER',CR,LF DB 'M...MOVE TUNE UP OR DOWN SCALE',CR,LF DB 'P...PLAY THE TUNE',CR,LF DB 'Q...QUIT-TO CP/M',CR,LF,'$' PROMPT DB 'COMMAND?...$' ; REFILL DISK INPUT BUFFER RDREC: LXI D,INBUF ; SET DMA ADDRESS MVI C,SDMA CALL BDOS LXI D,INFCB ; READ A RECORD MVI C,READ CALL BDOS RAR ; SET CARRY ON BAD READ LXI H,INBUF ; SET POINTER TO BUFFER START SHLD INPTR RET ;DEFINE VARIABLES TEMPO EQU TON1+1 ;LOADED BY TUNIN ROUTINE RESTRT EQU 0 ;CPM REBOOT BDOS EQU 5 ;CP/M ENTRY FOR I/O READ EQU 20 ;CP/M READ NEXT RECORD FUNCTION SDMA EQU 26 ;CP/M SET DMA ADDRESS FUNCTION CR EQU 13 LF EQU 10 INBUF DS 128 ;DISK FILE INPUT BUFFER INFCB DS 33 ;FILE CONTROL BLOCK CONBUF DB 64 ;CONSOLE INPUT BUFFER DB 0 DS 64 INPTR DS 2 ;POINTER FOR DISKIN0V DS 32 STACK ; V1PT DW 0 V2PT DW 0 V3PT DW 0 V4PT DW 0 DUR DS 1 INC1 DS 2 INC2 DS 217 DB 25,175 ;116 A5 880.00 25.6831 DB 27,54 ;118 A5# 932.32 27.2103 DB 28,212 ;120 B5 987.76 28.8283 DB 30,139 ;122 C6 1046.5 30.5426 DB 32,92 ;124 C6# 1108.7 32.3588 DB 34,72 ;126 D6 1174.6 34.2828 DB 36,82 ;128 D6# 1244.5 36.3214 DB 38,123 ;130 E6 1318.5 38.4812 ORG NOTES+100H ;MUST BE ON PAGE BOUNDARY WAVE1 DS 100H ;1ST VOICE WAVE2 DS 100H ;2ND VOICE WAVE3 DS 100H ;3RD VOICE WAVE4 DS 100H ;4TH VOICE TUNE ;SCORE CODE BEGINS HERE END 100H DB 10,204 ;86 F4# 369.99 10.7984 DB 11,113 ;88 G4 391.99 11.4405 DB 12,13 ;90 G4# 415.30 12.1208 DB 12,215 ;92 A4 440.00 12.8416 DB 13,155 ;94 A4# 466.16 13.6052 DB 14,106 ;96 B4 493.88 14.4142 DB 15,69 ;98 C5 523.24 15.2713 DB 16,46 ;100 C5# 554.36 16.1794 DB 17,36 ;102 D5 587.32 17.1414 DB 18,41 ;104 D5# 622.26 18.1607 DB 19,62 ;106 E5 659.26 19.2406 DB 20,98 ;108 F5 698.46 20.3847 DB 21,153 ;110 F5# 739.98 21.5969 DB 22,226 ;112 G5 783.98 22.8811 DB 24,62 ;114 G5# 830.60 24.24 y/x>y1!!TʫWʢQSM!P ! !""""&~2#~oF#N#~oV#^#~&oF#N#~oV#^#>@2* "l&~*"l& * "l& *"l& !5!5ˆC ?!!~+-™q!wq!/w!!~+D-hq/GHqG! #~ZZw# N~K!#~0ڙ:ҙ0G#~0ڗ:җ0OxGx!̀!÷̀z2! zw#÷! $ A>   a?!7FILE NOT FOUND $TYPE COMMAND T - LOAD TUNE W - LOAD WAVEFORMS P - PLAY TUNE Q - QUIT (TO CP/M) ${!!aڀڀ!a"ENTER FILE NAME $ !>m > mc#~+:~##@[?~#.~#U~#?&*-;4 >?m 4+*?,?.? _?:?@ , ;7> #e>u  m*|*~#"TYPE +OR-NN...+ FASTER...NN IN DECIMAL$ERROR...TEMPO UNCHANGED $TYPE +OR-NN...+ UP SCALE...NN DECIMAL$ERROR...TUNE UNCHENGED $MUSIC PLAYING PROGRAM COMMANDS W...LOAD A WAVEFORM T...LOAD A TUNE S...SET TEMPO FASTER OR SLOWER M...MOVE TUNE UP OR DOWN SCALE P...PLAY THE TUNE Q...QUIT-TO CP/M $COMMAND?...$a!" UP SCALE...NN DECIMAL$ERROR...TUNE UNCHENGED $MUSIC PLAYING PROGRAM COMMANDS W...LOAD A WAVEFORM T...LOAD A TUNE S...SET TEMPO FASTER OR SLOWER M...MOVE TU@ UP OR DOWN SCALE P...PLAY THE TUNE Q...QUIT-TO CP/M $COMMAND?...$a!" UP SN DECIMAL$ERROR...#4FZn%Eh6g Ifl5  1 q jE.$)>b>6 \"H$R&{~#.~#U~#?&*-;4 >?m 4+*?,?.? _?:?@ , ;7> #e>u  m*|*~#"TYPE +OR-NN...+ FASTER...NN IN DECIMAL$ERROR...TEMPO UNCHANGED $TYPE +OR-NN...+ UP SCALE...NN DECIMAL$ERROR...  ;REMOV" A PROGRAM TO REMOVE ALL QUOTE MARKS FROM A FILE ;USED AFTER CREATING A FILE WITH EBASIC WHICH LEAVES ;THE " CHARACTERS AS AN ARTIFACT OF ITS METHOD OF WRITING ;DISK FILES. ;REFER TO THE CP/M INTERFACE GUIDE (C) DIGITAL RESEARCH ORG 100H BDOS EQU 5 ;DOS ENTRY CR EQU 13 ;ASCII CAR. RET. LF EQU 10 ;ASCII LINE FEED OPENF EQU 15 ;OPEN FILE CODE CLOSF EQU 16 ;CLOSE FILE CODE READF EQU 20 ;READ FUNCTION CODE TYPEF EQU 2 ;TYPE CHAR AT CONSOLE CONS EQU 1 ;INPUT CHAR FROM CONSOLE RESTRT EQU 0 ;CP/M REBOOT WRITF EQU 21 ;WRITE RECORD CODE DMAF EQU 26 ;SER DMA ADDRESS CODE TEXTF EQU 9 ;PRINT TEXT AT CONSOLE FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;DISK INPUT BUFFER ADDRESS ;SET UP THE STACK LXI H,0 DAD SP SHLD OLDSP LXI SP,STKTOP CALL SETUP ;OPEN FILE CALL READ LXI H,FBUFF LXI D,FBUFF SLOOP MOV A,M CPI '"' JZ OMIT STAX D INX D OMIT INX H CPI 1AH JNZ SLOOP PUSH D CALL CLOSE CALL SETUP ;OPEN FILE POP H SHLD ENDAD CALL WRITE  LHLD OLDSP SPHL JMP RESTRT ;READ FILE TO FBUFF READ LXI D,FBUFF RDLP PUSH D ;SAVE CURRENT BUFFER POSITION MVI C,DMAF ;SET ADRESS TO READ TO CALL BDOS LXI D,FCB MVI C,READF ;READ A SECTOR CALL BDOS POP H ;GET BUFFER POSITION LXI D,128 ;MOVE UP 128 DAD D ;TO GET NEW POS XCHG ;PUT IT IN DE CPI 0 ;ZERO MEANS OK JZ RDLP CPI 1 ;ONE MEANS EOF RZ DERR LXI D,DERMSG ;TELL ABOUT ERROR MVI C,TEXTF ;TYPE A LINE ON CONSOLE CALL BDOS JMP RESTRT ;BACK TO CP/M CONTROL WRITE LXI D,FBUFF WRLP PUSH D MVI C,DMAF ;SET ADDRESS FOR WRITE CALL BDOS LXI D,FCB MVI C,WRITF CALL BDOS POP H CPI 2 ;EOF JZ WREOF CPI 0 JNZ DERR LXI D,128 DAD D XCHG LHLD ENDAD MOV A,D CMP H JC WRLP MOV A,E CMP L JC WRLP WREOF RET SETUP XRA A STA FCB+32 ;SET REC TO 0 LXI D,FCB MVI C,OPENF CALL BDOS CPI 255 JZ NOFIL RET NOFIL LXI D,NOFMS MVI C,TEXTF CALL BDOS JMP RESTRT CLOSE LXI D,FCB MVI C,CLOSF CALL BDOS CPI 255 JZ DERR RET NOFMS DB 'FILE NOT FOUND',CR,LF,'$' DERMSG DB 'DISK ERROR',CR,LF,'$' OLDSP DS 2 ;OLD STACK POINTER SAVE ENDAD DS 2 ;TEMP STORE OF BUFF END ADDR DS 64 ;STACK STKTOP FBUFF ;FILE BUFFER END 100H 128 ;MOVE UP 128 DAD D ;TO GET NEW POS XCHG ;PUT IT IN DE CPI 0 ;ZERO MEANS OK JZ RDLP CPI 1 ;ONE MEANS EOF RZ DERR LXI D,DERMSG ;TELL ABOUT ERROR MVI C,TEXTF ;TYPE A LINE ON CONSOLE CALL BDOS JMP RESTRT ;BACK TO CP/M CONTROL WRITE LXI D,FBUFF WRLP PUSH D MVI C,DMAF ;SET ADDRESS FOR WRITE CALL BDOS LXI D,FCB MVI C,WRITF CALL BDOS POP H CPI 2 ;EOF JZ WREOF CPI 0 JNZ DERR LXI D,128 DAD D XCHG LHLD ENDAD MOV A,D CMP H JC WRLP MOV A,E CMP L JC WRLP WREOF RET SETUP XRA A STA FCB+32 ;SET REC TO 0 LXI D,FCB MVI C,OPENF CALL BDOS CPI 255 JZ NOFIL RET NOFIL LXI D,NOFMS MVI C,TEXTF CALL BDOS JMP RESTRT CLOSE LXI D,FCB MVI C,CLOSF CALL BDOS CPI 255 JZ DERR RET NOF !9"1͒9!~"#ͯ͒"c*\< \ʑX*zf{fɯ2|\ʤ \XFILE NOT FOUND $DISK ERROR $MUSIC4 COMREMOV" ASMREMOV" $$$ REM WRITES A FILE ON DISK FOR INPUT TO ASM REM CONTAINING DB EXPRESSIONS FOR 256 POINTS REM FOR EACH WAVEFORM OF 4 VOICES REM TO DEFINE THE WAVEFORM TABLE FOR MUSIC4 DIM POINT(256) INPUT "FILE NAME";W$ FILE W$ HT$=CHR$(9) ORG$=HT$+"ORG"+HT$+"100H" DB$=HT$+"DB"+HT$ PRINT #1; ORG$ FOR WF=1 TO 4 PRINT "WAVEFORM ";WF INPUT "PLOT (Y OR N)"; PLT$ IF PLT$<>"Y" THEN 50 INPUT "PLOT INTERVAL"; STP 50 INPUT "WAVE TYPE...S=SINE,Q=SQUARE,R=RAMP,T=SAWTOOTH";WV$ IF WV$="Q" THEN GOTO 600 IF WV$="R" THEN GOTO 630 IF WV$="T" THEN GOTO 650 INPUT "SCALING--(ADD, MULT)";ADD,MULT INPUT "FIRST (HARMONIC,COEF.,PHASE ADV.)";HAR1,CO1,PHASE1 INPUT "2ND (HARMONIC,COEF.,PHASE ADV.)";HAR2,CO2,PHASE2 INPUT "3RD (HARMONIC,COEF.,PHASE ADV.)";HAR3,CO3,PHASE3 INPUT "4TH (HARMONIC, COEF., PHASE ADV.)";HAR4,CO4, PHASE4 FOR I=0 TO 255 A=360/256*I/57.296 WAVE=CO1*SIN(HAR1*A+PHASE1)+CO2*SIN(HAR2*A+PHASE2)+CO3*SIN(HAR3*A+PHASE3) WAVE=WAVE+CO4*SIN(HAR4*A+PHASE4) POINT(I)=INT((WAVE+ADD)*MULT) IF PLT$ <> "Y" THEN 100 IF INT(I/STP)<>I/STP THEN 100 PRINT I;POINT(I);TAB(9+POINT(I));"." 100 NEXT I 110 J=0 120 LINE$=DB$ FOR I=1 TO 8 LINE$=LINE$+MID$(STR$(POINT(J)),1,2) IF I<>8 THEN LINE$=LINE$+"," J=J+1 NEXT I PRINT #1; LINE$ IF J<255 THEN 120 NEXT WF CLOSE (1) STOP 600 FOR I=0 TO 255 POINT(I)=INT(I/128)*63 GOSUB 660 NEXT I GOTO 110 630 FOR I=0 TO 255 POINT(I)=63-INT(I/4) GOSUB 660 NEXT I GOTO 110 650 FOR I=0 TO 127 POINT(I)=INT(I/2) GOSUB 660 NEXT I FOR I=128 TO 255 POINT(I)=INT((255-I)/2) GOSUB 660 NEXT I GOTO 110 660 IF PLT$<>"Y" THEN 670 IF INT(I/STP)<>I/STP THEN 670 PRINT POINT(I);TAB(POINT(I)+6);"." 670 RETURN END "4TH (HARMONIC, COEF., PHASE ADV.)";HAR4,CO4, PHASE4 FOR I=0 TO 255 A=360/256*I/57.296 WAVE=CO1*SIN(HAR1*A+PHASE1)+CO2*SIN(HAR2*A+PHASE2)+CO3*SIN(HAR3*A+PHASE3) WAVE=WAVE+CO4*SIN(HAR4*A+PHASE4) POINT(I)=INT((WAVE+ADD)*MULT) IF PLT$ <> "Y" THEN 100   CP/M Macro assembler v3.1 Page 001 CCPZ Version 4.1 TITLE 'CCPZ Version 4.1' ; ; CP/M CONSOLE COMMAND PROCESSOR (CCP) Revision 4.1 ; FOR Z80-BASED CP/M 2.X SYSTEMS ; ; ORIGINAL CCP DISASSEMBLED BY ???? ; ORIGINAL CCP DISASSEMBLED FURTHER BY RLC ; ORIGINAL CCP COMMENTED BY RLC ; CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 ; FURTHER MODIFIED BY RLC AS V2.1 ; FURTHER MODIFIED BY KBP AS V2.2 ; FURTHER MODIFIED BY RLC AS V2.4 (V2.3 skipped) ; FURTHER MODIFIED BY RLC AS V2.5 ; FURTHER MODIFIED BY RLC AS V2.6 ; FURTHUR MODIFIED BY SBB AS V2.7 ; FURTHER MODIFIED BY RLC AS V2.8 ; FURTHER MODIFIED BY RLC AS V2.9 ; FURTHER MODIFIED BY RLC AS V3.0 ; FURTHER MOD 5H DFU ; 5I JUMP ; 5J GO ; 5K COM CALLPROG ERRLOG ERRJMP ; 5L GET MEMLOAD PRNLE ; ; 0000 = FALSE EQU 0 FFFF = TRUE EQU NOT FALSE ; ; CUSTOMIZATION EQUATES ; ; The following equates may be used to customize this CCP for the user's ; system and integration technique. The following constants are provided: ; ; REL - TRUE if integration is to be done via MOVCPM ; - FALSE if integration is to be done via DDT and SYSGEN ; ; BASE - Base Address of user's CP/M system (normally 0 for DR version) ; This equate allows easy modification by non-standard CP/M (eg,H89) ; ; CCPLOC - Base Page Address of CCP; this value can be obtained bThe following gives the required offset to load the CCP into the ; CP/M SYSGEN Image through DDT (the Roffset command); Note that this ; value conforms with the standard value presented in the CP/M reference ; manuals, but it may not necessarily conform with the location of the ; CCP in YOUR CP/M system; several systems (Morrow Designs, P&T, Heath ; Org-0 to name a few) have the CCP located at a non-standard address in ; the SYSGEN Image. ; 2D80 = CCPR EQU 0980H-CCPLOC ;DDT LOAD OFFSET ;CCPR EQU 1100H-CCPLOC ;DDT LOAD OFFSET FOR MORROW DESIGNS ;CCPR EQU 0E00H-CCPLOC ;DDT LOAD OFFSET FOR APPLE SOFTCARD 56K ENDIF ; 0000 = RAS EQU FALSE ;SET TO TRUE IF CCP IS FOR A REMOTE-ACCESS SYSTEM ; ; *** Note to Apple Softcard Users *** ; ; In theiIFIED BY RLC AS V3.1 ; FURTHER MODIFIED BY RLC AS V4.0 ; SBB V4.1 11/27/81 ; ;******** Refer to CCPZ-Vxx.NOT File for Revision History ******** ; ;******** Structure Notes ******** ; ; This CCP is divided into a number of major sections. The following ; is an outline of these sections and the names of the major routines ; located therein. ; ; Section Function/Routines ; ------- ----------------- ; ; -- Opening Comments, Equates, and Macro Definitions ; ; 0 JMP Table into CCP ; ; 1 Buffers ; ; 2 CCP Starting Modules ; CCP1 CCP RESTRT RSTCCP RCCPNL ; PRNNF ; ; 3 Utilitiy running ; the BDOSLOC program on your system, or by setting the ; MSIZE and BIOSEX equates to the system memory size in ; K-bytes and the "extra" memory required by your BIOS ; in K-bytes. BIOSEX is zero if your BIOS is normal size, ; and can be negative if your BIOS is in PROM or in ; non-contiguous memory. ; ; RAS - Remote-Access System; setting this equate to TRUE disables ; certain CCP commands that are considered harmful in a Remote- ; Access environment; use under Remote-Access Systems (RBBS) for ; security purposes ; 0000 = REL EQU FALSE ;SET TO TRUE FOR MOVCPM INTEGRATION ; 0000 = BASE EQU 0 ;BASE OF CP/M SYSTEM (SET FOR STANDARD CP/M) ; IF REL CCPLOC EQU 0 ;MOVCPMr infinite (?) wisdom (???), Microsoft decided that the way to ; get a two-column directory display instead of four-column (narrow 40-col ; screen, remember) was to have their BIOS poke CCP every time it was ; loaded. Naturally, that will turn into a random poke on any non-standard ; CCP, like this one. The best way to get this CCP up on the Apple is to ; load it into CPM56.COM, at location 0E00H in the image. The BIOS code ; that pokes the CCP can also be modified at that time. The poke is done ; by "STA 0C8B2H", found at 24FEH in the CPM56 image. To eliminate the ; poke forever, change the "STA" to "LDA" by changing the contents of ; location 24FEH from 32H to 3AH. If you want a two-column display, set ; the TWOCOL switch below to a value of TRUE. ; 0000 = TWOCOL EQU FALSE ;TRUE IF TWO COL DIR INSTEAD OF FOes ; CRLF CONOUT CONIN LCOUT LSTOUT ; READF READ BDOSB PRINTC PRINT ; GETDRV DEFDMA DMASET RESET BDOSJP ; LOGIN OPENF OPEN GRBDOS CLOSE ; SEARF SEAR1 SEARN SUBKIL DELETE ; WRITE CREATE RESETUSR GETUSR SETUSR ; ; 4 CCP Utilities ; SETUD SETU0D UCASE REDBUF CNVBUF ; BREAK USRNUM ERROR SDELM ADVAN ; SBLANK ADDAH NUMBER NUMERR HEXNUM CP/M Macro assembler v3.1 Page 002 CCPZ Version 4.1 ; DIRPTR SLOGIN DLOGIN COMLOG SCANER ; CMDSER ; ; 5 CCP-Resident Commands and Functions ; 5A DIR DIRPR FILLQ ; 5B ERA ; 5C LIST ; 5D TYPE PAGER ; 5E SAVE ; 5F REN ; 5G USER ;  IMAGE ELSE ; ; If REL is FALSE, the value of CCPLOC may be set in one ; of two ways. The first way is to set MSIZE and BIOSEX ; as described above using the following three lines: CP/M Macro assembler v3.1 Page 003 CCPZ Version 4.1 ; 0040 = MSIZE EQU 64 ;SIZE OF MEM IN K-BYTES 0002 = BIOSEX EQU 2 ;EXTRA # K-BYTES IN BIOS DC00 = CCPLOC EQU 3400H+(MSIZE-20-BIOSEX)*1024 ;CCP ORIGIN ; ; The second way is to obtain the origin of your current ; CCP using BDSLOC or its equivalent, then merely set CCPLOC ; to that value as as in the following line: ; ;CCPLOC EQU 0BD00H ;FILL IN WITH BDOSLOC SUPPLIED VALUE ; ; Note that you should only use one method or the other. ; Do NOT define CCPLOC twice! ; ;  REM PROGRAM TO MAKE ASM FILES FOR CONSTRUCTUNG REM TUNE TABLE FOR TUNES TO BE PLAYED BY MUSIC3 REM PROGRAM. REM READS FROM FILE PREPARED BY ED PROGRAM. EACH LINE REM OF INPUT IS A LINE OF OUTPUT. REM LINES HAVE THE TIME AND A NOTE OR REM A REST FOR EACH OF FOUR VOICES. NOTES IN THE REM FORM C3#, D4 ETC. SEPARATED BY SPACES. REM OCTAVES FROM 1 THROUGH 6 (C1 TO C6) REM TIME IS 1 FOR WHOLE NOTE, 2 FOR HALF, 4 QUARTER,ETC. REM FILE MUST BE EDITED TO REMOVE " SIGNS BEFORE REM RUNNING ASM. ED MS"^Z^Z REMOVES ALL "S FROM REM A FILE. DIM V$(4), N1$(4), NOTE$(66) FOR I=0 TO 65 READ NOTE$(I) REM SET UP TABLE OF NOTES C1 TO C6 NEXT I DATA "R","C1","C1#","D1","D1#","E1","F1","F1#","G1" DATA "G1#","A1","A1#","B1","C2","C2#","D2","D2#","E2" DATA "F2","F2#","G2","G2#","A2","A2#","B2","C3","C3#" DATA "D3","D3#","E3","F3","F3#","G3","G3#","A3","A3#" DATA "B3","C4","C4#","D4","D4#","E4","F4","F4#","G4" DATA "G4#","A4","A4#","B4","C5","C5#","D5","D5#","E5" DATA "F5","F5#","G5","G5#","A5","A5#","B5","C6" DATA "C6#","D6","D6#","E6" HT$=CHR$(9) ORG$=HT$+"ORG"+HT$+"100H" DB$=HT$+DB$+"DB"+HT$ END$=HT$+"END"+HT$+"100H" INPUT "INPUT FILE NAME"; IF$ INPUT "OUTPUT FILE NAME"; OF$ INPUT "TEMPO"; TEM$ FILE OF$ IF END #1 THEN 10 FILE IF$ IF END #2 THEN 300 10 PRINT #1; ORG$ PRINT #1; DB$+TEM$ LINE=1 100 READ #2; ST$ PRINT LINE;":";ST$ IF LEFT$(ST$,1)="0" THEN 300 IF LEFT$(ST$,1)=";" THEN 400 LST=LEN(ST$) FOR P=1 TO LST IF MID$(ST$,P,1)=" " THEN 110 NEXT P 110 IF P=LST THEN A=P+1 ELSE A=P FOR I=1 TO A IF MID$(ST$,I,1)<"0" OR MID$(ST$,I,1)>"9" THEN 930 T$=STR$(INT(128/VAL(ST$)+.5)) IF MID$(ST$,A-1,1)="." THEN T$=STR$(VAL(T$)+.5*VAL(T$)) FOR I=1 TO 4 IF P>=LEN(ST$) THEN V$(I)="R" : GO TO 140 ST$=MID$(ST$,P+1,LEN(ST$)-P) FOR P=1 TO LEN(ST$) IF MID$(ST$,P,1)=" " THEN 120 NEXT P 120 CR1$=MID$(ST$,1,1) IF LEN(CR1$)=0 THEN V$(I)="R": GO TO 140 IF (CR1$<"A" OR CR1$>"G") AND CR1$<>"R" THEN 900 CR2$=MID$(ST$,2,1) IF (CR2$<"1" OR CR2$>"6") AND CR1$<>"R" THEN 910 IF P<4 THEN 130 IF MID$(ST$,3,1)<>"#" THEN 920 130 V$(I)=MID$(ST$,1,P-1) 140 NEXT I FOR I=1 TO 4 N$=MID$(V$(I),1,1) O$=MID$(V$(I),2,1) S$=MID$(V$(I),3,1) IF (N$<"A" OR N$>"G") AND N$<>"R" THEN 900 IF (O$<"1" OR O$>"6") AND N$<>"R" THEN 910 IF S$<>"#" AND LEN(V$(I))>2 THEN 920 FOR J=0 TO 65 IF V$(I)=NOTE$(J) THEN 200 NEXT J 200 N1$(I)=STR$(2*J) NEXT I L$=DB$+T$+","+N1$(1)+","+N1$(2)+","+N1$(3)+","+N1$(4)\ +HT$+";"+STR$(LINE) PRINT #1; L$ LINE=LINE+1 GO TO 100 300 PRINT #1; DB$+STR$(0) PRINT #1; END$ CLOSE (1) STOP 400 PRINT #1; ST$ GO TO 100 900 PRINT "VOICE";I;" NOTE ERROR" GO TO 100 910 PRINT "VOICE";I;" OCTAVE ERROR" GO TO 100 920 PRINT "VOICE";I;" SHARP ERROR" GO TO 100 930 PRINT "TIME ERROR" GO TO 100 END FOR P=1 TO LEN(ST$) IF MID$(ST$,P,1)=" " THEN 120 NEXT P 120 CR1$=MID$(ST$,1,1) IF LEN(CR1$)=0 THEN V$(I)="R": GO TO 140 IF (CR1$<"A" OR CR1$>"G") AND CR1$<>"R" THEN 900 CR2$=MID$(ST$,2,1) IF (CR2$<"1" OR CR2$>"6") AND CR1$<>"R" THEN 910 IF P<4 THE UR ; ; The following is presented as an option, but is not generally user-customiz- ; able. A basic design choice had to be made in the design of CCPZ concerning ; the execution of SUBMIT files. The original CCP had a problem in this sense ; in that it ALWAYS looked for the SUBMIT file from drive A: and the SUBMIT ; program itself (SUBMIT.COM) would place the $$$.SUB file on the currently ; logged-in drive, so when the user was logged into B: and he issued a SUBMIT ; command, the $$$.SUB was placed on B: and did not execute because the CCP ; looked for it on A: and never found it. ; ; After much debate it was decided to have CCPZ perform the same type of ; function as CCP (look for the $$$.SUB file on A:), but the problem with CP/M Macro assembler v3.1 Page 004 CCPZ Version 4.1 ; SUBMtended processing for user-program supplied ; command lines. This is for Command Level 3 of CCPZ. Under the CCPZ Version ; 4.0 philosophy, three command levels exist: ; ; (1) that command issued by the user from his console at the '>' prompt ; (2) that command issued by a $$$.SUB file at the '$' prompt ; (3) that command issued by a user program by placing the command into ; CIBUFF and setting the character count in CBUFF ; ; Setting CLEVEL3 to TRUE enables extended processing of the third level of ; CCPZ command. All the user program need do is to store the command line and ; set the character count; CCPZ will initialize the pointers properly, store ; the ending zero properly, and capitalize the command line for processing. ; Once the command line is properly stored, the user  BDOS EQU BASE+0005H ;BDOS FUNCTION CALL ENTRY PT 005C = TFCB EQU BASE+005CH ;DEFAULT FCB BUFFER 0080 = TBUFF EQU BASE+0080H ;DEFAULT DISK I/O BUFFER 0100 = TPA EQU BASE+0100H ;BASE OF TPA ; ; ; MACROS TO PROVIDE Z80 EXTENSIONS ; MACROS INCLUDE: ; $*MACRO ;FIRST TURN OFF THE EXPANSIONS ; ; JR - JUMP RELATIVE ; JRC - JUMP RELATIVE IF CARRY ; JRNC - JUMP RELATIVE IF NO CARRY ; JRZ - JUMP RELATIVE IF ZERO ; JRNZ - JUMP RELATIVE IF NO ZERO ; DJNZ - DECREMENT B AND JUMP RELATIVE IF NO ZERO ; LDIR - MOV @HL TO @DE FOR COUNT IN BC ; LXXD - LOAD DOUBLE REG DIRECT ; SXXD - STORE DOUBLE REG DIRECT ; ; CP/M Macro assembler v3.1 Page 006 CCPZ Version 4.1 ; IT.COM still exists. Hence, RGF designed SuperSUB and RLC took his ; SuperSUB and designed SUB from it; both programs are set up to allow the ; selection at assembly time of creating the $$$.SUB on the logged-in drive ; or on drive A:. ; ; A final definition of the Indirect Command File ($$$.SUB or SUBMIT ; File) is presented as follows: ; ; "An Indirect Command File is one which contains ; a series of commands exactly as they would be ; entered from a CP/M Console. The SUBMIT Command ; (or SUB Command) reads this files and transforms ; it for processing by the CCPZ (the $$$.SUB File). ; CCPZ will then execute the commands indicated ; EXACTLY as if they were typed at the Console." ; ; Hence, to permit this to happen, the $$$.executes the command line ; by reentering the CCPZ through CCPLOC [NOTE: The C register MUST contain ; a valid User/Disk Flag (see location 4) at this time.] ; FFFF = CLEVEL3 EQU TRUE ;ENABLE COMMAND LEVEL 3 PROCESSING ; ; ;*** TERMINAL AND 'TYPE' CUSTOMIZATION EQUATES ; CP/M Macro assembler v3.1 Page 005 CCPZ Version 4.1 0018 = NLINES EQU 24 ;NUMBER OF LINES ON CRT SCREEN FFFF = WIDE EQU TRUE ;TRUE IF WIDE DIR DISPLAY 007C = FENCE EQU '|' ;SEP CHAR BETWEEN DIR FILES ; FFFF = PGDFLT EQU TRUE ;SET TO FALSE TO DISABLE PAGING BY DEFAULT 0050 = PGDFLG EQU 'P' ;FOR TYPE COMMAND: PAGE OR NOT (DEP ON PGDFLT) ; THIS FLAG REVERSES THE DEFAULT EFFECT ; 000F = MAXUSR EQU 15 ;MAXIMUM USER NUMBER ACCESSABLE ; 0041 = SYSFLG EQU 'A' ;FOR DI ; @GENDD MACRO USED FOR CHECKING AND GENERATING ; 8-BIT JUMP RELATIVE DISPLACEMENTS ; @GENDD MACRO ?DD ;;USED FOR CHECKING RANGE OF 8-BIT DISPLACEMENTS IF (?DD GT 7FH) AND (?DD LT 0FF80H) DB 100H ;Displacement Range Error on Jump Relative ELSE DB ?DD ENDIF ENDM ; ; ; Z80 MACRO EXTENSIONS ; JR MACRO ?N ;;JUMP RELATIVE DB 18H @GENDD ?N-$-1 ENDM ; JRC MACRO ?N ;;JUMP RELATIVE ON CARRY DB 38H @GENDD ?N-$-1 ENDM ; JRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY DB 30H @GENDD ?N-$-1 ENDM ; JRZ MACRO ?N ;;JUMSUB file must always ; be present on a specific drive, and A: is the choice for said drive. ; With this facility engaged as such, Indirect Command Files like: ; ; DIR ; A: ; DIR ; ; can be executed, even though the currently logged-in drive is changed ; during execution. If the $$$.SUB file was present on the currently ; logged-in drive, the above series of commands would not work since the ; CCPZ would be looking for $$$.SUB on the logged-in drive, and switching ; logged-in drives without moving the $$$.SUB file as well would cause ; processing to abort. ; FFFF = SUBA EQU TRUE ; Set to TRUE to have $$$.SUB always on A: ; Set to FALSE to have $$$.SUB on the logged-in drive ; ; The following flag enables exR COMMAND: LIST $SYS AND $DIR ; 0053 = SOFLG EQU 'S' ;FOR DIR COMMAND: LIST $SYS FILES ONLY ; FFFF = SUPRES EQU TRUE ;SUPRESSES USER # REPORT FOR USER 0 ; 0000 = DEFUSR EQU 0 ;DEFAULT USER NUMBER FOR COM FILES ; 0024 = SPRMPT EQU '$' ;CCP PROMPT INDICATING SUBMIT COMMAND 003E = CPRMPT EQU '>' ;CCP PROMPT INDICATING USER COMMAND ; 0048 = NUMBASE EQU 'H' ;CHARACTER USED TO SWITCH FROM DEFAULT ; NUMBER BASE ; 0053 = SECTFLG EQU 'S' ;OPTION CHAR FOR SAVE COMMAND TO SAVE SECTORS ; ; END OF CUSTOMIZATION SECTION ; 000D = CR EQU 0DH 000A = LF EQU 0AH 0009 = TAB EQU 09H ; 0000 = WBOOT EQU BASE+0000H ;CP/M WARM BOOT ADDRESS 0004 = UDFLAG EQU BASE+0004H ;USER NUM IN HIGH NYBBLE, DISK IN LOW 0005 =  REMOV" $1.ASM ASM $1.AAZ LOAD $1 ERA $1.ASM ERA $1.HEX REN $1.MUS=$1.COM i.*|g> >کÝ!p+q*DM͡:͆ ͆:_2:`!!:*& N͆!4!6JaMUSIC4 COMREMOV" ASMREMOV" COMAWAVE BASAWAVE INT NOTES BASNOTES INT FIX $$$ P RELATIVE ON ZERO DB 28H @GENDD ?N-$-1 ENDM ; JRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO DB 20H @GENDD ?N-$-1 ENDM ; DJNZ MACRO ?N ;;DECREMENT B AND JUMP RELATIVE ON NO ZERO DB 10H @GENDD ?N-$-1 ENDM ; LDIR MACRO ;;LDIR DB 0EDH,0B0H ENDM ; LDED MACRO ?N ;;LOAD DE DIRECT DB 0EDH,05BH DW ?N ENDM ; LBCD MACRO ?N ;;LOAD BC DIRECT DB 0EDH,4BH CP/M Macro assembler v3.1 Page 007 CCPZ Version 4.1 DW ?N ENDM ; SDED MACRO ?N ;;STORE DE DIRECT DB 0EDH,53H DW ?N EC304DD JMP CCP ; Process potential default command DC03 C300DD JMP CCP1 ; Do NOT process potential default command ; ;**** Section 1 **** ; ; BUFFERS ET AL ; ; INPUT COMMAND LINE AND DEFAULT COMMAND ; ; The command line to be executed is stored here. This command line ; is generated in one of three ways: ; CP/M Macro assembler v3.1 Page 008 CCPZ Version 4.1 ; (1) by the user entering it through the BDOS READLN function at ; the du> prompt [user input from keyboard] ; (2) by the SUBMIT File Facility placing it there from a $$$.SUB ; file ; (3) by an external program or user placing the required command ; into this buffer ; ; In all cases, the command line is plaDC5B 17DC DW CIBUF ;PTR TO CURR CMD FOR ERROR REPORTING ; DC5D DS 26 ;STACK AREA DC77 = STACK EQU $ ;TOP OF STACK ; ; FILE TYPE FOR COMMAND ; COMMSG: DC77 434F4D DB 'COM' ; ; SUBMIT FILE CONTROL BLOCK ; SUBFCB: IF SUBA ;IF $$$.SUB ON A: DC7A 01 DB 1 ;DISK NAME SET TO DEFAULT TO DRIVE A: ENDIF CP/M Macro assembler v3.1 Page 009 CCPZ Version 4.1 ; IF NOT SUBA ;IF $$$.SUB ON CURRENT DRIVE DB 0 ;DISK NAME SET TO DEFAULT TO CURRENT DRIVE ENDIF ; DC7B 242424 DB '$$$' ;FILE NAME DC7E 2020202020 DB ' ' DC83 535542 DB 'SUB' ;FILE TYPE DC86 00 DB 0 ;EXTENT NUMBER DC87 00 DB 0 ;S1 SUBFS2: DC88 DS 1 ;S2 SUBNDM ; SBCD MACRO ?N ;;STORE BC DIRECT DB 0EDH,43H DW ?N ENDM ; ; END OF Z80 MACRO EXTENSIONS ; ; ;**** Section 0 **** ; DC00 ORG CCPLOC ; ; ENTRY POINTS INTO CCPZ ; ; If the CCPZ is entered at location CCPLOC (at the JMP to CCP), then ; the default command in CIBUFF will be processed. If the CCPZ is entered ; at location CCPLOC+3 (at the JMP to CCP1), then the default command in ; CIBUFF will NOT be processed. ; ; NOTE: Entry into CCPZ in this way is permitted under CCPZ Version 4.0, ; but in order for this to work, CIBUFF and CBUFF MUST be initialized properly ; AND the C register MUST contain a valid User/Disk Flag ced into the buffer starting at ; CIBUFF. This command line is terminated by the last character (NOT Carriage ; Return), and a character count of all characters in the command line ; up to and including the last character is placed into location CBUFF ; (immediately before the command line at CIBUFF). The placed command line ; is then parsed, interpreted, and the indicated command is executed. ; If CLEVEL3 is permitted, a terminating zero is placed after the command ; (otherwise the user program has to place this zero) and the CIBPTR is ; properly initialized (otherwise the user program has to init this ptr). ; If the command is placed by a user program, entering at CCPLOC is enough ; to have the command processed. Again, under CCPZ Version 4.x, it is not ; necessary to store the pointer to CIBUFF in CIBPTR; CCPZ will do tFRC: DC89 DS 1 ;RECORD COUNT DC8A DS 16 ;DISK GROUP MAP SUBFCR: DC9A DS 1 ;CURRENT RECORD NUMBER ; ; COMMAND FILE CONTROL BLOCK ; FCBDN: DC9B DS 1 ;DISK NAME FCBFN: DC9C DS 8 ;FILE NAME FCBFT: DCA4 DS 3 ;FILE TYPE DCA7 DS 1 ;EXTENT NUMBER DCA8 DS 2 ;S1 AND S2 DCAA DS 1 ;RECORD COUNT FCBDM: DCAB DS 16 ;DISK GROUP MAP FCBCR: DCBB DS 1 ;CURRENT RECORD NUMBER ; ; OTHER BUFFERS ; PAGCNT: DCBC 16 DB NLINES-2 ;LINES LEFT ON PAGE CHRCNT: DCBD 00 DB 0 ;CHAR COUNT FOR TYPE ; ; CCP BUILT-IN COMMAND TABLE ; 0004 = NCHARS EQU 4 ;NUMBER OF CHARS/COMMAND (see Location 4: the ; most significant nybble contains the User Number and the least significant ; nybble contains the Disk Number). ; ; Some user programs (such as SYNONYM3) attempt to use the default ; command facility. Under the original CCP, it was necessary to initialize ; the pointer after the reserved space for the command buffer to point to ; the first byte of the command buffer. Under Version 4.x of CCPZ, this is ; no longer the case. The CIBPTR (Command Input Buffer PoinTeR) is located ; to be compatible with such programs (provided they determine the buffer ; length from the byte at MBUFF [CCPLOC + 6]), but under Version 4.x of CCPZ ; this is no longer necessary. CCPZ Version 4.x automatically initializes ; this buffer pointer in all cases. ; ENTRY: DC00 his for ; the calling program if CLEVEL3 is made TRUE. ; ; WARNING: The command line must NOT exceed BUFLEN characters in length. ; For user programs which load this command, the value of BUFLEN can be ; obtained by examining the byte at MBUFF (CCPLOC + 6). ; 0050 = BUFLEN EQU 80 ;MAXIMUM BUFFER LENGTH MBUFF: DC06 50 DB BUFLEN ;MAXIMUM BUFFER LENGTH CBUFF: DC07 00 DB 0 ;NUMBER OF VALID CHARS IN COMMAND LINE CIBUFF: DC08 2020202020 DB ' ' ;DEFAULT (COLD BOOT) COMMAND CIBUF: DC17 00 DB 0 ;COMMAND STRING TERMINATOR DC18 2020434350 DB ' CCPZ-V4.1 of 11/27/81 ' ;FOR DUMP IDENTIFICATION DC31 DS BUFLEN-($-CIBUFF)+1 ;TOTAL IS 'BUFLEN' BYTES ; CIBPTR: DC59 08DC DW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR:  ; ; CCP COMMAND NAME TABLE ; EACH TABLE ENTRY IS COMPOSED OF THE 4-BYTE COMMAND AND 2-BYTE ADDRESS ; CMDTBL: DCBE 44495220 DB 'DIR ' DCC2 9BE0 DW DIR DCC4 4C495354 DB 'LIST' DCC8 77E1 DW LIST DCCA 54595045 DB 'TYPE' DCCE 7BE1 DW TYPE DCD0 55534552 DB 'USER' CP/M Macro assembler v3.1 Page 010 CCPZ Version 4.1 DCD4 D2E2 DW USER DCD6 44465520 DB 'DFU ' DCDA DCE2 DW DFU ; IF NOT RAS ;FOR NON-RAS DCDC 474F2020 DB 'GO ' DCE0 E9E2 DW GO DCE2 45524120 DB 'ERA ' DCE6 4CE1 DW ERA DCE8 53415645 DB 'SAVE' DCEC 14E2 DW SAVE DCEE 52454E20 DB 'REN ' DCF2 73E2 DW REN DCF4 47455420 DB 'GET ' DCF8 87E3 DW GET DCFA 4A554D50 DB 'JUMP' DCFE E4E2 DW JUMP ENDIF ; 000B = NCMNDS EQU ($-CMDTBL)/(NCHARS+2) ;  DD2B 2F CMA ;PREPARE FOR COMING 'CMA' DD2C C425DE CNZ SEAR1 DD2F 2F CMA ;0FFH IS RETURNED IF NO $$$.SUB, SO COMPLEMENT DD30 3229DD STA RNGSUB ;SET FLAG (0=NO $$$.SUB) DD33 3A07DC LDA CBUFF ;EXECUTE DEFAULT COMMAND? DD36 B7 ORA A ;0=NO JRNZ RS1 DD37+20 DD38+29 ; ; PROMPT USER AND INPUT COMMAND LINE FROM HIM ; RESTRT: DD39 3177DC LXI SP,STACK ;RESET STACK ; ; PRINT PROMPT (DU>) ; DD3C CDA9DD CALL CRLF ;PRINT PROMPT DD3F CDFBDD CALL GETDRV ;CURRENT DRIVE IS PART OF PROMPT DD42 C641 ADI 'A' ;CONVERT TO ASCII A-P DD44 CDB0DD CALL CONOUT DD47 CD4ADE CALL GETUSR ;GET USER NUMBER ; IF SUPRES ;IF SUPPRESSING USR # REPORT FOR USR 0 DD4A B7 ORA A JRZ RS000 DD4B+28 DD4C+12 ENDIF ; DD ; ; ENTRY POINT FOR RESTARTING CCP WITHOUT LOGGING IN DEFAULT DRIVE ; RCCPNL: DD8D CDE7DF CALL SCANER ;EXTRACT NEXT TOKEN FROM COMMAND LINE DD90 3A9CDC LDA FCBFN ;GET FIRST CHAR OF TOKEN DD93 D620 SUI ' ' ;ANY CHAR? DD95 21DEDF LXI H,TEMPDR DD98 B6 ORA M DD99 C2F6DE JNZ ERROR JR RESTRT DD9C+18 DD9D+9B ; ; No File Error Message ; PRNNF: DD9E CDE3DD CALL PRINTC ;NO FILE MESSAGE DDA1 4E6F204669 DB 'No Fil','e'+80H CP/M Macro assembler v3.1 Page 013 CCPZ Version 4.1 DDA8 C9 RET ; ;**** Section 3 **** ; I/O UTILITIES ; ; OUTPUT CHAR IN REG A TO CONSOLE AND DON'T CHANGE BC ; ; ; OUTPUT ; CRLF: DDA9 3E0D MVI A,CR DDAB CDB0DD ; ;**** Section 2 **** ; CCP STARTING POINTS ; ; START CCP AND DON'T PROCESS DEFAULT COMMAND STORED ; CCP1: DD00 AF XRA A ;SET NO DEFAULT COMMAND DD01 3207DC STA CBUFF ; ; START CCP AND POSSIBLY PROCESS DEFAULT COMMAND ; ; NOTE ON MODIFICATION BY RGF: BDOS RETURNS 0FFH IN ; ACCUMULATOR WHENEVER IT LOGS IN A DIRECTORY, IF ANY ; FILE NAME CONTAINS A '$' IN IT. THIS IS NOW USED AS ; A CLUE TO DETERMINE WHETHER OR NOT TO DO A SEARCH ; FOR SUBMIT FILE, IN ORDER TO ELIMINATE WASTEFUL SEARCHES. ; CCP: DD04 3177DC LXI SP,STACK ;RESET STACK DD07 C5 PUSH B DD08 79 MOV A,C ;C=USER/DISK NUMBER (SEE LOC 4) DD09 1F RAR ;EXTRACT USER NUMBER DD0A 1F RAR DD0B 1F RAR DD0C 1F 4D FE0A CPI 10 ;USER < 10? JRC RS00 DD4F+38 DD50+09 DD51 D60A SUI 10 ;SUBTRACT 10 FROM IT DD53 F5 PUSH PSW ;SAVE IT DD54 3E31 MVI A,'1' ;OUTPUT 10'S DIGIT DD56 CDB0DD CALL CONOUT DD59 F1 POP PSW RS00: DD5A C630 ADI '0' ;OUTPUT 1'S DIGIT (CONVERT TO ASCII) DD5C CDB0DD CALL CONOUT CP/M Macro assembler v3.1 Page 012 CCPZ Version 4.1 ; ; READ INPUT LINE FROM USER OR $$$.SUB ; RS000: DD5F CD6EDE CALL REDBUF ;INPUT COMMAND LINE FROM USER (OR $$$.SUB) ; ; PROCESS INPUT LINE ; RS1: ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED DD62 CDCFDE CALL CNVBUF ;CAPITALIZE COMMAND LINE, PLACE ENDING 0, ; AND SET CIBPTR VALUE ENDIF ; DD65 CDFFDD CALL DEFDMA ;SET TBUFF TO D CALL CONOUT DDAE 3E0A MVI A,LF ;FALL THRU TO CONOUT ; CONOUT: DDB0 C5 PUSH B DDB1 0E02 MVI C,02H OUTPUT: DDB3 5F MOV E,A DDB4 E5 PUSH H DDB5 CD0500 CALL BDOS DDB8 E1 POP H DDB9 C1 POP B DDBA C9 RET ; CONIN: DDBB 0E01 MVI C,01H ;GET CHAR FROM CON: WITH ECHO JR BDOSB DDBD+18 DDBE+1D ; LCOUT: DDBF F5 PUSH PSW ;OUTPUT CHAR TO CON: OR LST: DEP ON PRFLG DDC1 = PRFLG EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION DDC0 3E00 MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE PRINT FLAG DDC2 B7 ORA A ;0=TYPE JRZ LC1 DDC3+28 DDC4+06 DDC5 F1 POP PSW ;GET CHAR ; ; OUTPUT CHAR IN REG A TO LIST DEVICE ; LSTOUT: DDC6 C5 PUSH B DDC7 0E05 MVI C,05H  RAR DD0D E60F ANI 0FH DD0F 5F MOV E,A ;SET USER NUMBER DD10 CD4CDE CALL SETUSR DD13 CD06DE CALL RESET ;RESET DISK SYSTEM DD16 3229DD STA RNGSUB ;SAVE SUBMIT CLUE FROM DRIVE A: DD19 C1 POP B DD1A 79 MOV A,C ;C=USER/DISK NUMBER (SEE LOC 4) DD1B E60F ANI 0FH ;EXTRACT DEFAULT DISK DRIVE DD1D 3260DE STA TDRIVE ;SET IT CP/M Macro assembler v3.1 Page 011 CCPZ Version 4.1 JRZ NOLOG ;SKIP IF 0...ALREADY LOGGED DD20+28 DD21+03 DD22 CD0BDE CALL LOGIN ;LOG IN DEFAULT DISK ; IF NOT SUBA ;IF $$$.SUB IS ON CURRENT DRIVE STA RNGSUB ;BDOS '$' CLUE ENDIF ; NOLOG: DD25 117ADC LXI D,SUBFCB ;CHECK FOR $$$.SUB ON CURRENT DISK DD29 = RNGSUB EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION DD28 3E00 MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE RNGSUB FLAG DD2A B7 ORA A ;SET FLAGS ON CLUEMA ADDRESS DD68 CDFBDD CALL GETDRV ;GET DEFAULT DRIVE NUMBER DD6B 3260DE STA TDRIVE ;SET IT DD6E CDE7DF CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE DD71 C4F6DE CNZ ERROR ;ERROR IF COMMAND NAME CONTAINS A '?' DD74 118ADD LXI D,RSTCCP ;PUT RETURN ADDRESS OF COMMAND DD77 D5 PUSH D ;ON THE STACK DD78 3ADEDF LDA TEMPDR ;IS COMMAND OF FORM 'D:COMMAND'? DD7B B7 ORA A ;NZ=YES DD7C C2EEE2 JNZ COM ; IMMEDIATELY DD7F CD79E0 CALL CMDSER ;SCAN FOR CCP-RESIDENT COMMAND DD82 C2EEE2 JNZ COM ;NOT CCP-RESIDENT DD85 7E MOV A,M ;FOUND IT: GET LOW-ORDER PART DD86 23 INX H ;GET HIGH-ORDER PART DD87 66 MOV H,M ;STORE HIGH DD88 6F MOV L,A ;STORE LOW DD89 E9 PCHL ;EXECUTE CCP ROUTINE ; ; ENTRY POINT FOR RESTARTING CCP AND LOGGING IN DEFAULT DRIVE ; RSTCCP: DD8A CDD3DF CALL DLOGIN ;LOG IN DEFAULT DRIVE  JR OUTPUT DDC9+18 DDCA+E8 LC1: DDCB F1 POP PSW ;GET CHAR DDCC F5 PUSH PSW DDCD CDB0DD CALL CONOUT ;OUTPUT TO CON: DDD0 F1 POP PSW DDD1 FE0A CPI LF ;CHECK FOR PAGING CP/M Macro assembler v3.1 Page 014 CCPZ Version 4.1 DDD3 CAFBE1 JZ PAGER DDD6 C9 RET ; READF: DDD7 119BDC LXI D,FCBDN ;FALL THRU TO READ READ: DDDA 0E14 MVI C,14H ;FALL THRU TO BDOSB ; ; CALL BDOS AND SAVE BC ; BDOSB: DDDC C5 PUSH B DDDD CD0500 CALL BDOS DDE0 C1 POP B DDE1 B7 ORA A DDE2 C9 RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY RET ADR;START WITH ; PRINTC: DDE3 F5 PUSH PSW ;SAVE FLAGS DDE4 CDA9DD CALL CRLF ;NEW LINE DDE7 F1 POP PSW ;  JR GRBDOS DE20+18 DE21+F7 ; SEARF: DE22 119BDC LXI D,FCBDN ;SPECIFY FCB SEAR1: DE25 0E11 MVI C,11H JR GRBDOS DE27+18 DE28+F0 ; SEARN: DE29 0E12 MVI C,12H JR GRBDOS DE2B+18 DE2C+EC ; CP/M Macro assembler v3.1 Page 016 CCPZ Version 4.1 ; CHECK FOR SUBMIT FILE IN EXECUTION AND ABORT IT IF SO ; SUBKIL: DE2D 2129DD LXI H,RNGSUB ;CHECK FOR SUBMIT FILE IN EXECUTION DE30 7E MOV A,M DE31 B7 ORA A ;0=NO DE32 C8 RZ DE33 3600 MVI M,0 ;ABORT SUBMIT FILE DE35 117ADC LXI D,SUBFCB ;DELETE $$$.SUB ; DELETE: DE38 0E13 MVI C,13H JR BDOSJP ;SAVE MORE SPACE DE3A+18 DE3B+CC ; WRITE: DE3C 0E15 MVI C,15H DE3E C3DCDD JMP BDOSB ; E DE6D C9 RET ; ; INPUT NEXT COMMAND TO CCP ; This routine determines if a SUBMIT file is being processed ; and extracts the command line from it if so or from the user's console ; REDBUF: DE6E 3A29DD LDA RNGSUB ;SUBMIT FILE CURRENTLY IN EXECUTION? DE71 B7 ORA A ;0=NO JRZ RB1 ;GET LINE FROM CONSOLE IF NOT DE72+28 DE73+45 DE74 117ADC LXI D,SUBFCB ;OPEN $$$.SUB DE77 D5 PUSH D ;SAVE DE DE78 CD17DE CALL OPEN DE7B D1 POP D ;RESTORE DE JRZ RB1 ;ERASE $$$.SUB IF END OF FILE AND GET CMND DE7C+28 DE7D+3B DE7E 3A89DC LDA SUBFRC ;GET VALUE OF LAST RECORD IN FILE DE81 3D DCR A ;PT TO NEXT TO LAST RECORD DE82 329ADC STA SUBFCR ;SAVE NEW VALUE OF LAST RECORD IN $$$.SUB DE85 CDDADD CALL READ ;DE=SUBFCB JRNZ RB1 ;ABORT $$$.SUB IF ERROR IN READING LAST REC DE88+20 D PRINT: DDE8 E3 XTHL ;GET PTR TO STRING DDE9 F5 PUSH PSW ;SAVE FLAGS DDEA CDF0DD CALL PRIN1 ;PRINT STRING DDED F1 POP PSW ;GET FLAGS DDEE E3 XTHL ;RESTORE HL AND RET ADR DDEF C9 RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY HL ; PRIN1: DDF0 7E MOV A,M ;GET NEXT BYTE DDF1 CDB0DD CALL CONOUT ;PRINT CHAR DDF4 7E MOV A,M ;GET NEXT BYTE AGAIN FOR TEST DDF5 23 INX H ;PT TO NEXT BYTE DDF6 B7 ORA A ;SET FLAGS DDF7 C8 RZ ;DONE IF ZERO DDF8 F8 RM ;DONE IF MSB SET JR PRIN1 DDF9+18 DDFA+F5 ; ; BDOS FUNCTION ROUTINES ; ; ; RETURN NUMBER OF CURRENT DISK IN A ; GETDRV: DDFB 0E19 MVI C,19H JR BDOSJP DDFD+18 DDFE+09 CP/M Macro assembler v3.1 Page 015 CC CREATE: DE41 0E16 MVI C,16H JR GRBDOS DE43+18 DE44+D4 ; ; RESET USER NUMBER IF CHANGED ; RESETUSR: DE46 = TMPUSR EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION DE45 3E00 MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TMPUSR DE47 5F MOV E,A ;PLACE IN E JR SETUSR ;THEN GO SET USER DE48+18 DE49+02 GETUSR: DE4A 1EFF MVI E,0FFH ;GET CURRENT USER NUMBER SETUSR: DE4C 0E20 MVI C,20H ;SET USER NUMBER TO VALUE IN E (GET IF E=FFH) JR BDOSJP ;MORE SPACE SAVING DE4E+18 DE4F+B8 ; ; END OF BDOS FUNCTIONS ; ; ;**** Section 4 **** ; CCP UTILITIES ; ; SET USER/DISK FLAG TO CURRENT USER AND DEFAULT DISK ; SETUD: DE50 CD4ADE CAE89+2F DE8A 1107DC LXI D,CBUFF ;COPY LAST RECORD (NEXT SUBMIT CMND) TO CBUFF DE8D 218000 LXI H,TBUFF ; FROM TBUFF DE90 015000 LXI B,BUFLEN ;NUMBER OF BYTES LDIR DE93+EDB0 DE95 2188DC LXI H,SUBFS2 ;PT TO S2 OF $$$.SUB FCB DE98 3600 MVI M,0 ;SET S2 TO ZERO DE9A 23 INX H ;PT TO RECORD COUNT CP/M Macro assembler v3.1 Page 018 CCPZ Version 4.1 DE9B 35 DCR M ;DECREMENT RECORD COUNT OF $$$.SUB DE9C 117ADC LXI D,SUBFCB ;CLOSE $$$.SUB DE9F CD1EDE CALL CLOSE JRZ RB1 ;ABORT $$$.SUB IF ERROR DEA2+28 DEA3+15 DEA4 3E24 MVI A,SPRMPT ;PRINT SUBMIT PROMPT DEA6 CDB0DD CALL CONOUT DEA9 2108DC LXI H,CIBUFF ;PRINT COMMAND LINE FROM $$$.SUB DEAC CDF0DD CALL PRIN1 DEAF CDE5DE CALL BREAK ;CHECK FOR ABORT (ANY CHAR) ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED DEB2 C8 RZ ;IF (NO ABORT), RETURN TO CALLER AND RUN PZ Version 4.1 ; ; SET 80H AS DMA ADDRESS ; DEFDMA: DDFF 118000 LXI D,TBUFF ;80H=TBUFF DMASET: DE02 0E1A MVI C,1AH JR BDOSJP DE04+18 DE05+02 ; RESET: DE06 0E0D MVI C,0DH BDOSJP: DE08 C30500 JMP BDOS ; LOGIN: DE0B 5F MOV E,A DE0C 0E0E MVI C,0EH JR BDOSJP ;SAVE SOME CODE SPACE DE0E+18 DE0F+F8 ; OPENF: DE10 AF XRA A DE11 32BBDC STA FCBCR DE14 119BDC LXI D,FCBDN ;FALL THRU TO OPEN ; OPEN: DE17 0E0F MVI C,0FH ;FALL THRU TO GRBDOS ; GRBDOS: DE19 CD0500 CALL BDOS DE1C 3C INR A ;SET ZERO FLAG FOR ERROR RETURN DE1D C9 RET ; CLOSE: DE1E 0E10 MVI C,10H LL GETUSR ;GET NUMBER OF CURRENT USER DE53 87 ADD A ;PLACE IT IN HIGH NYBBLE DE54 87 ADD A DE55 87 ADD A CP/M Macro assembler v3.1 Page 017 CCPZ Version 4.1 DE56 87 ADD A DE57 2160DE LXI H,TDRIVE ;MASK IN DEFAULT DRIVE NUMBER (LOW NYBBLE) DE5A B6 ORA M ;MASK IN DE5B 320400 STA UDFLAG ;SET USER/DISK NUMBER DE5E C9 RET ; ; SET USER/DISK FLAG TO USER 0 AND DEFAULT DISK ; SETU0D: DE60 = TDRIVE EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION DE5F 3E00 MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TDRIVE DE61 320400 STA UDFLAG ;SET USER/DISK NUMBER DE64 C9 RET ; ; CONVERT CHAR IN A TO UPPER CASE ; UCASE: DE65 FE61 CPI 61H ;LOWER-CASE A DE67 D8 RC DE68 FE7B CPI 7BH ;GREATER THAN LOWER-CASE Z? DE6A D0 RNC DE6B E65F ANI 5FH ;CAPITALIZ.he CCPZ - A Z80 Version of the CP/M CCP .fo Page # Documentation on CCPZ - A Z80 Version of the CP/M CCP CCPZ is a Group Project By the CCP-GROUP: RLC, FJW, KBP, RGF, RJM, SBB CCPZ Documentation By RLC Table of Contents ----- -- -------- Introduction 2 Part A: Installation Instructions 4 CCPZ Integration Example 5 Setting the CCPZ Inline Options 8 REL, BASE, CCPLOC, RAS, SUBA, CLEVEL3 8 Customization Symbols 8 NLINES, WIDE, PGDFLT 8 PGDFLG, MAXUSR, SYSFLG, SOFLG, SUPRES, DEFUSR, SPRMPT, CPRMPT, NUMBASE, 9 SECTFLG, FENCE  correct it) th CCP-GROU definitio o a Indirec Comman Fil no applies an thi definitio i tha an sequenc o command whic ma b issue fro th consol i als vali sequenc o command fo executio fro a Indirec Command File; hence, the sequence: DIR B: DIR A: ma b issue fro eithe th consol o a Indirec Comman File an th result o th executio o thi sequenc ar th same Basically thi say tha Indirec Comman File ar upward-compatibl t th consol inpu (bu no necessaril tha th content o a Indirec Comman Fil ma b issue a th consol withou modification). command-searc hierarch i no implemente whic i execute roughl a follows: - th user' comman i checke agains th CCP- residen command an execute immediatel i matc i found -  shoul assembl thi progra fo you particula compute (chang th bas OR i yo ar runnin non- ORG- CP/M an execut it Upo execution i wil provid yo wit th bas addres o (1 th BDO an (2 th CCР fo you particula system BDOSLO ha worke correctl fo al system teste s far bu ther i alway chanc tha i ma NO wor fo som non-teste system Fo th tim being assum tha i work correctl an recor th startin bas pag addres o you CCP. Th secon questio i no answere nearl s easily I yo hav th abilit t SYSGE you system i i muc easie (commonly tha i yo d not Yo must afte assemblin th CCPڠ properly integrat i int th sysge (o disk imag o CP/M Thi ca b don b obtainin SYSGE imag o you system scannin i vi debugge suc a DD t fin th offse fo th CCP readin th ne CC i o to o th ol one an finall runnin SYSG 10 Part B: Usage Instructions and Explanation of Commands 11 The CCPZ Command Hierarchy Search 11 The CCPZ-Resident Commands 14 DIR, ERA 14 LIST, TYPE, SAVE 15 REN, USER, DFU 16 JUMP, GO, GET 17 CCPZ Error Messages 18 Part C: CCPZ Command Levels and How to Use Them 19 Documentation on CCPZ - A Z80 Version of the CP/M CCP CCP i replacemen fo th CP/ Consol Comman Processo (CCP whic i designe t ru a par o CP/͠ o Z80-base microcomputers I mos case i i upward-compatible wit th origina CP/ Versio 2. CCP. CCPZ however provide man extension t th CP/͠ CCP Include i thes extension ar th follofailin that th curren use numbe o th curren dis i scanne fo th CO file th CO fil i loade an execute i found - failin that defaul use numbe (initiall bu ca b rese wit th DF CCP-residen command o th cur ren dis i scanne fo th CO file th CO fil i loade an execute i found - finally failin that th defaul use numbe o dis A i scanne fo th CO file th CO fil i loade an execute i foun o a erro messag (COMMAND? whe COMMAN wa th user' comman name i printed Th numeri argumen fo th SAV comman ca b specifie i hexadecima s tha th use ma emplo th value presented by tools such as DDT exactly as they are given GEԠ comman whic load fil a specifie memor addres an JUM comman whic "calls th subroutin a specifie memor addres hav bee added G comman whic "calls thE agai t plac th resultan syste o disk I yo D NO hav SYSGE capability Dis Utilit progra i require t locat th CC o dis an the writ th ne CCPڠ o to o th ol one Th ne resul o thi integratio i th placemen o th ne CCP ont dis i th prope plac s tha i wil b loade wit th res o CP/͠ o col boo an execute properly. T fin th origina CCP yo typicall hav t locat i b it appearance I i probabl store contiguousl o disk so onc i i found sequentia overwrit i al tha i required Probabilit i extremel hig tha i i store contiguousl i th SYSGE image Th CC start wit tw (2 an ONL TW jum instruction followe b buffe are (possibl containin a initia comman and/o th Digita Researc copyrigh notice) Th Digita Researc manual sho th CC t resid a addres 980Ƞ i th SYSGE image bu thi ma var wit systewin features: Th TYP functio ca b mad t pag o no pag it outpu a th user' discretion LIS functio i availabl whic send it outpu t th CP/ LST Devic an doe NO page Th DI comman ha bee extende t allo th dis pla o th syste file o al files Th ER comman no print ou th name o th file i i erasing Th curren use numbe ma b include a par o th comman prompt i th use i unde numbe othe tha 0 th promp i o th for 'du> (lik 'A2> o 'B10>') and i th use i unde 0 th promp ma b 'd> o 'd0> a pe hi choice Th SUBMI facilit ha bee change i tw basi ways: - th promp change t 'du$ o 'd$ whe th SUBMI comman i printed - th $$$.SU i execute fro driv A (not tha th origina SUBMIԠ proble no exists bu th ne SUB.CO facilit subroutin a 100 (subse o th JUMР capability has also been added Thi documen provide th use o CCP wit th followin information: Part A: Installation Instructions Part B: Usage Instructions and Explanation of Commands Part C: CCPZ Command Levels and How to Use Them Part A Installation Instructions I orde t instal CCP o targe microcompute (mus b currently running CP/M 2.2), the user must know two basic things: 1) Where his CCP is currently running in memory 2 Wher hi CC i locate i th SYSGEΠ image or fo system whic don' suppor SYSGE (suc a P& CP/ 2. fo th TRS-8 Mode II) wher hi CC i locate o dis an ho t place the new CCPZ on top of it Th firs questio i answere relativel easily pro gram know a eithe BDOSLO o BDLO (fo BDOӠ Locator) i provide wit CCPZ Yom T fin thi image us DD o som othe suc debugger loa th SYSGE imag yo ca ge vi SYSGEN an examin memor startin a aroun 900 fo th tw (an ONL two jump describe above I yo fin a are wit mor tha tw jump ( grou o them) yo ar probabl lookin a th BIO an shoul g lowe fo th CCP Th CC wil probabl star o a eve pag o half-pag address (like 900H, 980H, 1100H, etc). No tha th locatio o th CC ha bee found recor thi addres fo later Yo ar no read fo th integratio o CCP int you system T d this perfor th followin step usin th informatio o th pag addres o th CCР (obtaine fro BDOSLOà an calle CCPLO withi CCPZ an th SYSGEΠ imag address of the CCP (called IMAGE for reference in this document). 1 Edi CCP an se th CCPLO equat t th valu obtaine fro above Als se an flag an value a yo desir (se th sectio o- -------- --- ------ -- !TEXTWRK.-12 0 R CCP .DOC 8 EE687 .TXT 4 CCPV24 .AQM 34 TFS .HLP 6 R EE687PRE.TXT 4 CCPV24 .ASM 50 CONTENTS.T01 6 SW1 .TXT 10 CCP .BAK 4 CONTENTS.T02 4 SW2 .TXT 2 CPM56 .COM 12 CONTENTS.T03 4 B: 30 Entries & 22 Files -- 338K Bytes Remaining File Data: 14 Files -- 154K Bytes Displayed B>bdosloc <-- Now to locate the CCP's address The Base Page Address of this system's BDOS is C5 The Base Page Address of this system's CCP is BD <-- This is it B>ddt cpm56.com <-- Now to find the CCP in the SYSGEN image DDT VERS 2.0 NEXT PC 2D00 0100 -d900,90f <-- Start looking around here 0900 31 80 E7 3E 06 3C 3C FE 1B CA 00 C2 DA 11 E7 D6 1..>.<<......... -da00,a0f 0A00 31 00 01 01 01 0C C5 CD 0F E4 21 00 BE 11 00 04 1.........!..... -db00,b0f 0B00 31 00 01 01 01 11 C5 CD 0F E4 21 00 C0 1rd CP/M has a base of 0, but some CP/M systems (such as for the TRS-80 Model I and Heath/Zenith H89/Z89) start physical RAM memory at a higher address; equate BASE to the starting RAM memory address of your system CCPLOC This is the starting address of CCPZ; set the second CCPLOC equate to the address you obtain from BDOSLOC RAS This is an equate which masks out selected CCPZ command functions for security purposes on Remote Access Systems such as Bulletin Boards; the masked out functions currently include SAVE, ERA, REN, JUMP, GO, and GET; set RAS to TRUE to mask these out or FALSE to leave them in SUBA This is an equate which determines the drive onto which CCPZ will look for an executing Indirect Command File. If the basic philosophy  "CCP Customization below) Whe satisfied end the edit session. 2 Assembl CCPڠ wit MAà (o equivalent) Thi assemble i require becaus o th MACRO used Onl th resultant HEX file is required. 3 Assumin tha yo ca us SYSGEN obtai SYSGE image of your current CP/M system and save it on disk. 4 Loa th SYSGE imag int memor wit DDԠ (o equivalent) Onc loaded verif tha th origina CC i a th IMAGŠ addres foun abov an comput th integratio offse using the DDT H command: H, Th secon numbe displaye give yo th OFFSE valu require for step 5. 5 Integrat CCP int you SYSGE imag vi DDT' an ROFFSE commands Us ICCPZ.HE (o th nam o you versio o CCPZ t loa th FC an ROFFSE (wher OFFSE wa compute i ste 4 t loa th CCPZ.HE fil int memor a th prope location Chec t se1 00 02 1.........!..... -db80,b8f 0B80 31 00 01 01 09 01 CD A8 00 21 00 D2 11 00 C2 0E 1........!...... -- Detail Left Out -- -d1100 <-- I found it at 1100H; note the 2 JMP's 1100 C3 FF BD C3 FB BD 50 10 20 20 20 20 20 20 20 20 ......P. 1110 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 ........ 1120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -- Detail Left Out -- -^ <-- Retur t CP/M kno tha CCPLO wil be BD00H and the IMAGE offset is 1100H B>e ccpv24.as {edi CCP her an plac CCPLOC=BD00H}# -- Detail Left Out -- B>mac ccpv24 $pz sz <-- Now to assemble the CCP CP/M MACRO ASSEM 2.0 C4FF <-- Note that CCP MUST end before BDOS begins! 014H USE FACTOR END OF ASSEMBLY B>ddt cpm56.com <-- Now to integrate! DDT VERS 2.0 NEXT PC 2D00 0100 -h1100,bd00 <-- Compute offset for new CCP CE00 54 of the Indirect Command File described above is to be maintained, this symbol should be set to TRUE (look on drive A: for the $$$.SUB file); if not, this symbol should be set to FALSE (look on the default drive from the $$$.SUB file). To review, the basic philosophy of the Indirect Command File is that any sequence of commands which may be issued from the console (within reason, which means NOT to erase a $$$.SUB file) may also be issued from within an Indirect Command File, and the resultant execution should be identical (same functions performed). CLEVEL3 This equate enables or disables extended Command Leve Processing I se t TRUE extended Command Level 3 Processing is enabled and the user command line is automatically capitalized, the terminatin ze tha CCP i indee properl loade b examining the SYSGEN IMAGE area. 6 Plac th ne syste o dis b runnin SYSGE an NOT loading the system from disk (use the memory image). Fo furthe clarificatio o th abov process th followin i sampl termina sessio whic outline th step taken. CCPZ Integration Example B>; Sample terminal session for integrating CCPZ B>sysgen SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP)b SOURCE ON B, THEN TYPE RETURN <-- I hit the RETURN key here FUNCTION COMPLETE / DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- and here B>save 34 cpm56.com <-- We now have a SYSGEN image of CP/M to work with B>xdir XDIR Version 2.6 User Number: 0, Double Density File Attributes: Non-System Filename.Typ Size K RS Filename.Typ Size K RS Filename.Typ Size K RS -------- --- ------ -- -------- --- ------ -00 <-- Offset is 5400H -iccpv24.hex <-- Init FCB -r5400 <-- Read in new CCP with offset NEXT PC 2D00 0000 -^C <-- Done! B>sysgen <-- Now to SYSGEN onto disk SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP) <-- Use memory image DESTINATION DRIVE NAME (OR RETURN TO REBOOT)b <-- onto B: DESTINATION ON B, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- Done for now B> Setting the CCPZ Inline Options Th followin ar th fou basi option availabl t th user under CCPZ for customization of his package. Option Name Function REL Configures CCPLOC (CCPLOC equ 0) for integration via MOVCPM rather than the DDT/SYSGEN technique outlined above; set to TRUE for MOVCPM integra- tion or FALSE for DDT/SYSGEN integration BASE Base address of your CP/M system; standar i place a th en o th buffer, and the internal CIBPTR is set correctly (see later for more information). Customization Symbols Th followin symbol ar provide fo furthe customizatio of CCPZ to a user's particular tastes and hardware facilities. Option Name Function NLINES Number of lines on the user's CRT for paging WIDE This equate is used to select a narrow or wide display under the DIR command; if WIDE is equated to TRUE, each file name is separated by two spaces, a FENCE, and two more spaces; if WIDE is equated to FALSE, each file name is separated by one space, a FENCE, and one more space PGDFLT This is the Paging Default flag for the TYPE command; if PGDFLT is set to TRUE, the TYPE command will page its output by default and the P option on the TYPE commthe CCP prompt character which indicates that a SUBMIT file is in execution; by default it is set to '$', so prompts like 'A$' appear during SUBMIT file execution CPRMPT This is the CCP prompt character which indicates that the CCP is awaiting a user console command; by default it is set to '>', so prompts like 'A>' appear during user input to the CCP NUMBAS Thi i th escap characte use b thos commands which require a DECIMAL number as an argument; placing this character after the number argument switches the base to HEXADECIMAL; for example, 'SAVE 15 MYFILE' can be expressed as 'SAVE FH MYFILE' if NUMBASE is set to 'H' (the default) SECTFLG This character constant is the suffix option for the SAVE command which specifies that sectors, as opposed to pd-i driv i used. 3 No th fil name COMMAND.CO i searche for I found i i loade int memor startin a 100 an executed If not, proceed to step 4. 4 No tha th firs searc fo COMMAND.CO͠ ha failed th CC check t se i th use i unde th curren Defaul Use Number Th Defaul Use Numbe ma b tha se b th DEFUS equat i th CC o tha se b th use vi th DF command DEFUSҠ i i effec i DF ha no bee issue sinc th las War o Col Boot an DF i i effec i i wa issue sinc th las War o Col Boot I th use i NO unde th curren Defaul Use Number CCP temporaril log hi int i an searche th directory I COMMAND.CO i found i i loade a describe abov an executed I not CCP proceed t the next step. 5 Th use i no i th Defaul Use Number an a thi point CCP check t se i th use i o dis driv and (see below) will prohibit paging; if PGDFLT is set to FALSE, the TYPE command will NOT page its output by default and the P option will enable paging PGDFLG This sets the option character in the command line for the TYPE command (the 'P' mentioned above); if the user wishes to change this option character, he need only change this equate MAXUSR This is the largest user number recognized by the USER command; if the user wishes to protect the higher user areas, he may set this symbol to the highest area normally accessable; 15 is the largest permitted value for MAXUSR SYSFLG This is the option character for the DIR command line which is used to specify that DIR search All Files (both $SYS and $DIR) for its display; the distributed default for this is 'A' SOFLG ages, are to be saved; the default value is 'S' FENCE This is the character printed to separate entries in a directory listing; it's default value is '|' N othe customizatio i necessar unles th use wishe t chang th command disable b RAS Thi ca b don b goin t th comman tabl 'CMDTBL an changin th I statemen to the user's desires. Part B Usage Instructions and Explanation of Commands Th followin instruction ar writte wit th assumptio tha th reade i quit familia wit ho t us CP/ 2. an it CCP CCP i writte a logica extensio o th CP/ 2. CC philosoph an shoul b addresse a such. The CCPZ Command Hierarchy Search Th first an mos basi thing t lear abou CCP i th orde i whic i searche fo CO fil fo executio o fil specifie b th GE command Unde thA: I not i temporaril log int A an searche th defaul use numbe o A fo COMMAND.COM I found i i loade a describe abov an executed I not CCP print th comman nam a a erro messag an return t comman inpu mode aborting the SUBMIT file if COMMAND came from it. I al case o th searc above i COMMAND.CO i found afte i i loade int memory CCP reset th use t hi origina dis driv an use number Hence th file reference by the user by default are obtained from this environment. T illustrat thi comman hierarch search conside th following examples: Example 1: DEFUSR equ 0 {default user number is 0} B10> <-- User is on Drive B:, User Number 10 B10>ASM TEST.BBZ <-- User wishes to assemble TEST.ASM in Drive B:, User 10 <-- At this point, CCPZ looks on B:/10 for ASM.COM, fails, looks on B:/0, fails, and finally looks on A This is the option character for the DIR command line which is used to specify that DIR search ONLY the $SYS files for its display; the distri- buted default for this is 'S' SUPRES Set SUPRES to TRUE to suppress printing the user number when the user is under User Number 0 or set SUPRES to FALSE to ALWAYS display the User Number with the CCP prompt; with SUPRES set to TRUE, a user on B: in user 0 sees 'B>' as the prompt, but with SUPRES set to FALSE, a user on B: in user 0 sees 'B0>' as the prompt DEFUSR This is the CCP-default user number which is searched in the command hierarchy for the COM files (distributed as 0); the DFU changes this temporarily until a Warm Boot or Cold Boot is done, at which time the search reverts to this value SPRMPT This is  CP/ 2. CCP i th specifie CO fil comman wa no foun o th curren driv i th curren use area th CC aborte wit a erro message CCPZ however continue searchin fro thi poin maximu o tw mor levels Thi comman hierarch searc wa outline abov an i describe her i furthe detail. 1 I th comman i o th for 'COMMAND an NO 'd:COMMAND' th CCP-residen comman lis i searche fo match I th matc i found th CCP-residen comman i immediatel processed I th matc i no foun o th comman i o th for 'd:COMMAND' th nex ste i taken Not tha th 'd:COMMAND for i goo fo executin comman CO͠ fil whic ha th sam nam a CCP-residen comman (suc a SAV or DIR). 2 I th comman i o th for 'd:COMMAND' dis driv 'd: i temporaril logge i fo th purpos o th comman search Otherwise th currentl logge:/0; it finds ASM.COM here and goes back to B:/10 for the file Example 2: DEFUSR equ 0 and DFU issued B10> <-- User is on Drive B:, User Number 10 B10>DFU 5 <-- User Selects User 5 as default B10>ASM TEST.BBZ <-- As above <-- At this point, CCPZ looks on B:/10 for ASM.COM, fails, look on B:/5, fails, and finally looks on A:/5; it fails here also and prints ASM? as an error message Example 3: DEFUSR equ 0 B> <-- User is on Drive B:, User Number 0 B>ASM TEST.BBZ <-- As above <-- At this point, CCPZ looks on B:/0 for ASM.COM, fails, looks on A:/0, fails, and prints error message Example 4: DEFUSR equ 0 A10> <-- User is on Drive A:, User Number 10 A10>ASM TEST.AAZ <-- As above, but file on A: <-- At this point, CCPZ looks on A:/10 for ASM.COM, fails, looks on A:/0, fails, and prints error message Another Example: Fo example i th use i loggeel whic ar execute fro withi CCPZ Th phrase <-- Displays $DIR files DIR S <-- Displays $SYS files DIR A <-- Displays both $DIR and $SYS files Customization Variables: WIDE SYSFLG SOFLG FENCE Examples: DIR *.ASM <-- All $DIR .ASM files DIR *.COM S <-- All $SYS .COM files DIR *.COM A <-- All .COM files Notes: I fil i scanne fo an n suc nam exist o disk th 'N Files messag wil appear However i fil i scanne fo an th nam exist a $SY fil an $DI file ar bein scanne for n fil nam i displaye bu th 'N Files messag doe NO appear Fo example i TEST.CO i $SY fil an 'DIҠ TEST.COM i issued n mesMYFILE.TXT <-- 15 pages saved SAVE FH MYFILE.TXT <-- 15 pages saved SAVE 10H MYFILE.TXT S <-- 16 sectors (8 pages) saved Notes: -None- Command: REN Function: To Change the name of a disk file Forms: REN = Customization Variables: RAS Examples: REN NEWFILE.TXT=OLDFILE.TXT Notes: -None- Command: USER Function: To Change the current user number Forms: USER <-- in DEC USER H <-- in HEX Customization Variables: -None- Examples: USER 15 USER FH USER 0 USER <-- Same as USER 0 Notes: -None- Command: DFU Function: To Temporarily Change the default user number for the command hierarchy search Forms: DFU <-- in DEC DFU H <-- in HEX Customization Variables: -None- Examples: DFU 15  int Driv B i Use Are 10 th Defaul Use Numbe i 0 an th followin CO file ar presen a indicate -- WM.COM on Drive A: in User 0 MBASIC.COM on Drive A: in User 0 and on Drive B: in User 0 TEST.COM on Drive B: in User 10 and Drive B: in User 0 the th followin happen whe th followin command ar issued from the console (or Indirect Command File): B10>WM TEST2.TXT \ \ \__ File to be edited \ \__ Invoke the WM.COM file (Word Master editor) \__ User is on Drive B: in User Area 10 Results: CCP searche B Use 10 B Use 0 an A Use fo WM.COM i find WM.CO i A Use 0 load it log th use back into B: User 10, and executes it. B10>MBASIC \ \__ Invoke the MBASIC.COM file (MBASIC Interpreter) \__ User is on Drive B: in User Area 10 Results: CCP searche B Use 1 an B Use fo MBASIC.COsag appears I 'DI TEXT.COM i issue an TEXT.CO doe no exis o disk th 'N Files' message is displayed. Command: ERA Function: To Erase the specified $R/W files from disk Forms: ERA <-- Erase both $DIR and $SYS files Customization Variables: WIDE FENCE Examples: ERA *.ASM <-- Erase all .ASM files ERA *.* <-- Erase all files Notes: I $R/ fil i encountered BDO erro messag wil b displaye an th procedur i stopped Th use i unsur a thi tim a t whic file hav bee erase an whic hav no an shoul check Sorr fo thi problem Th ERAS comman (t b give t SIG/ b RL i th nea future i solutio t this problem. Command: LIST Function: To Print the specified file on the CP/M LST: device Forms: LIST <-- Print the file (no paging) Customization Variables: -None- Examples: LIST TEST.TXT <-- Print  DFU FH DFU 0 DFU <-- Same as DFU 0 Notes: See above for explanation. Command: JUMP Function: To "call" the subroutine at the specified page address Forms: JUMP
<--
in HEX Customization Variables: NUMBASE RAS Examples: JUMP E000 or JUMP E000H <-- Jump to E000H JUMP <-- Jump to 000H JUMP 0 <-- Jump to 000H Notes: JUM perform subroutin "call" s th calle routin ma return to the CCPZ by either a RET or a Warm Boot. Command: GO Function: To "call" the subroutine starting at 100H Forms: GO <-- Execute reentrant at 100H Customization Variables: RAS Examples: GO *.ASM <-- Assuming XDIR is loaded, gives directory of *.ASM Notes: This command is identical in function to JUMP 100H. Command: GET Function: To load a file from disk into memory sM i find MBASIC.CO i B Use 0 s i doesn' bothe t loo o A Use 0 MBASIC.CO i the loade an execute a describe in the previous example. B10>TEST \ \__ Invoke the TEST.COM file (TEST program) \__ User is on Drive B: in User Area 10 Results: CCPڠ searche B Use 1 fo TEST.COM i find TEST.CO i B Use 0 s i doesn' bothe t loo furthe (i i had i woul hav foun TEST.CO i B Use 0) TEST.CO i then loaded and executed as described above. B10>TEST2 \ \__ Invoke the TEST2.COM file (TEST2 program) \__ User is on Drive B: in User Area 10 Results: CCP searche B Use 10 B Use 0 an A Use fo TEST2.COM i doesn' fin it s i issue th erro messag 'TEST2?', which says it couldn't find TEST2.COM. The CCPZ-Resident Commands Th followin page describ th CCPZ-Residen Commands Thes ar command locate withi CCP itsTEST.TXT on LST: Notes: I th fil ha $SY attribute i wil b foun a wel as those with $DIR attributes. Command: TYPE Function: To Print the specified file on the CP/M CON: device Forms: TYP P <-- Print the file with the paging deflt negated Customization Variables: NLINES PGDFLT PGDFLG Examples: TYPE TEST.TXT TYPE TEST.TXT P Notes: Whe th displa pause durin paging typ an cha t continue or ^C to abort. ^S also works. Command: SAVE Function: To Copy the TPA starting at 100H to disk Forms: SAVE <-- in DEC SAVE H <-- in HEX SAVE S <-- Number of sectors SAVE H S <-- Number of sectors Customization Variables: NUMBASE RAS Examples: SAVE 15 MUSIC4 is the end result of a lot of playing around. The original idea came from several articles in various magazines and one in particular in BYTE with a program for the 6502. Making this work for the Z80 makes you appreciate the 6502. Anyway, now it is all tied up with CP/M so that tunes can be called up by name from the disk, different waveforms can be loaded, and tempo and pitch altered from the console. The EBASIC program AWAVE provides the facility for making up the waveforms. After it runs, doing SUBMIT FIX FILENAME will remove the quotes from the file, assemble it to get a hex file, LOAD it to get a binary file, give it an identification of FILENAME.MUS and erase the debris. MUSIC4 can now load it using its W command. NOTES is another EBASIC program that takes as input a file created with ED which gives the time and notes for each voice and outputs a file that undergoes the SUBMIT FIX FILENAME routine and then is loaded by MUSIC4 with its T command. The input to notes is fairly straight forward. On each line the format is: TIME VOICE1 VOICE2 VOICE3 VOICE4 TIME is a number which is the reciprocal of the duration of the note. Thus 1 is a whole note, 2 a half not 4 a quarter note etc. VOICE1, VOICE2 etc. are in the form A-G1-6#. That is, a lette specifying the note of the scale, a number specifying the octave, and optionally a # to indicate sharp. No flats. B flat must be written A#. (you get used to it) The numbers in the table in MUSIC4 which set the actual pitches produced may need to be modified to get absolute pitch correct and are dependent on the system clock. Oh yes! almost forgot. MUSIC4 won't run on the 8080. It barely makes it with the Z80. ncluded are some music files so you can try it out. Sorry, no disco. Note that Ihave made use of some CP/M Users Group stuff in constructing this. What a relief to my soul to be making a contribution at last. Botter Reeves Bangkok 5 Sep 1979 ( COPYRIGHT (C) 1977 DIGITAL RESEARCH 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0i!"P0"R0"2:0v: 0$  :[0-ʬ+ʬ* :[0!_0M!f0P p  !   :O0Ĝ!":O0*V0}|<r ͪ*|Ĵ:O0_͑H *V0"Ù*V0"E V» ͪ»**»"Ù*K0"X0!0NA#~' ~p"K0*K0N"X0!0q#*w œ:0!x ͜ *V0*R0:_0̍"V02*M0r; !:r :0F: 0e%;m ">2:0b: 020 W,F:0b: 0e,ʹ:re*X0#![0~ʇww2/ͬ:2T/-"."$/2/>2.v:.ʸ!/6+͕%>20:.ʮ:.0209$<!5*}Ģ*V0":0y: 0:yv! X! ^#fkX _~ 0^ Z   2 5 8  :0‰:0=ʉG! 0ʃF#2sÖ*I0| E2V ,[ ͊m *R0"R0"P0 m E2D2V ,ʾ ͊:/ m :/ "> 2/:Į 'd ! ^#V#*0}o|g*  ":D x=D y0P 2!0^4! 0q :0Ė: 0,; Ė*I0m |}$† ͌oy Ԍ͋ 8O͖ Ăy01y 1m X:0 : 0, >C͘%:0 : 0 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*"P0Þ%z{*P0"R0*"V0 !":O0Ģ*R0̜*R0ĜG:O0xě%:/ *R0̍:xz*P0#"P0E2D20:b!^4!/wjj*R0!6zz{z4A_A?ɯ2.2*T0"V0!.8w# *V0*K0{zҤ*b0+"X0 =$**X0#Þ!.*V0".#"X0$:d0<:0<! 0~?<#ʐ: 0͡!.".^#V"V0}{##~2.*.^#V#"."V0*V0}d##~<2.G*V0##"X0:.> u!.~w>w> u:.++!+"X0:Z02Z0́ͪ'2Z0X:[0*K: ḰͪX? X́ö20Pg>ã6r>ã:[0'ƒ2[0>ã ¡:.ʔ>+2/͕%!/6 >20>20:[02́:0:Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04>20![0:0/ʦg¦´/ʦA¦:[0O<QA>HHR>22[0m:B_>fD> j!052!"0!0N#~#A҄0Æ7O!~*0!ʩң)Ú "0 x:[0 '¦́'æ:[0 :[0,;%:[0 !:[0; ,202́/>20:[02́:0G:0::0l:[0'́:[0' 20/:[0'|>20^—́:[0  <¨!~4 >¼!~5 : >20>V>O>I>B͘%!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûfD?<==:e>?; ><>; ;<=R>>>F>;>G==<==>=s;=P=*>=$?P:-?]>*<<==<;=>>y> ;::0 : 0 -Ͳ !/6+:.;?*$/*."$/?"$/:.l*.^#V{r+s5*.^#V ʓ:. r+s!06#wÚ> 209!e/~6![0~6". :0: 0,!0699*.~6 *.: 0,Ĵ".2f/*.s#r2[02e/*.#"X0$<5ͬ*$/"M00:T/2:/2[0 v>20*.".2[0v*R0m "R0͍"R0!/w >=G*R0*I0"R0"R0 m :/ }>͞ ¥͢ :O0*V0*ʿ͜">2:O0:0:O0!!4:0: 0,>"4:O0: 2\0:0=: 0 F!Fʹ%*X0"`0>2Z0*X0":0k: 0T!T:\0¦:O0¦:0=ʦ ʦ*"X0 !':[0'Tx»!Z04TT!Z05T:\0!":]0!**V0":O0*X0~ Ĵ*X06 '>#G*I0!" :0 :Z0 !0N*K0:O0Ÿ"b0+"X0yʛ 'É' Ͳ >ͮ 222:0: 0 !ͮ-:0P'!5^!/~ !~620͕%2.|z}z> u!.~w:.W=*u!.4C*V0^#V"V0ý!.5¯:20͕%!^4!/w>R͘%>V͘%>Dý>Pý>Lý>Oý>Bý>Sý>N͘%-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55N!! N#fiooo&)^#fk9BIO[ov ͌z{>ɯo>g͌"!6ů{_zW5>)D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌roz{͉͌͌}|͉͌Þ͌Þ͌ë͉͌!!o#Ã͌zg{o͌zg{o͌zg{oolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :0:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: > =;>?>P?<=?>>=<<i;m=>c==>o>v<=<;8?N!Nw#w#W!"V0!.w#w#l2N!.~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +aG=#w#wY*M0!0n& {ozg"V0!K0{#z"M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBOL TABLE OVERFLOW G*V0##~w*V0##~=*V0_###1 s#r1 ^#V1 ##"X0P wP ~O!0~z 6~=ͼ !0N#~ͼ „ Ͳ O2Ny͞ } !~5:Į ͵ !4̨!~5 G!~Ҩ4_!p!~ʮ5^!~> >2\0:0N *K0"+"X0:0 >''!:0N : 0,N :0 >  > !0N#~' ) > ''*K0"V0:\0x ʹ:\0" m }*K0"+"X0''*K0"V0>"4ͬ:2T/:[0 “ 2/-*M0"$/*X0!{#zڿ ~+"X0*M0+"M0wß #"K0*M0".:\0 N]T s#r+*V0*{_zW".:\02.R     % *I0:/ ͪ% ͬ:O0ĭ%  :.ʢ :0¢ *K0+"X0!2<20*#"" : 00Ĩ!??" 09"K0+"X0$< :0¢ : 0,? ʹ  *} :]0 :O0 :0 ͤ%:e0ĭ%:0 : 0  ͬͧ%vʹ   ͺ :0: 0 !;* _!5 ^#fkS \ h n 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 12 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 ypP͘% >U̘%>: 2 3>E͘%óf:.O*.~H:.=!4>͕%0:/#".R͆%2G:0xa{_ ʇ ʇ:0x҇_<20!/w:e/S:e/9ɯ2f/2d/2e/:0:e/ !2f/g/~#»S͉!f/~4!g/_:e/w2e/ɯ<*V0"36*"V0ɯ2!4!f/6".!f/~55!d/^4!g/~f:.:e/JGwf^l͗^{:e/&{!f/4#ww&ʞGʱ2e/xf͗ :e/&ʕ:0  ý͗&{&{ý͗  !e/~&>62/-!.6*M0"$/B".2f/*"V0͗ 2f/2e/2[020> 2͕%>20ɯ202!0~@$6^4#:[0w~$w:[00 6:[0A:[0?e@eAɷP6 o2[0:Z0ʦ:\0 :O0¦:[0':[0 !20:[0 R;/>20:Z0?:\0:O0?́;B*`0*X0++{z~  * MUSIC SYSTEM ON CP/M * * by J. A. Prest, DART * This program is based on a program from SOFTWARE TECHNOLOGY which is available on cassette from a few computer stores. The music included with the original tape is by Jon Bokelman. I have reconfigured it from its original SOL based operation to a system that is more compatable with CP/M. Additional commands have been added to allow saving and recalling programs from disk files, a character oriented EDITOR and improved error handleing routines. The music is entered with line numbers similar in format to many BASIC entry systems. After the music has been entered the score is compiled (S command) and then played (P command). The compiled score bears no resemblence to an ASCII files and can only be used by the PLAY command. For this reason the GET, WRITE and PLAY !FILENAME commands deal only with the 'human' portion on the music; the ASCII file. When a score is compiled it can be placed in memory immediately after the ASCII file or at mory, score the file immediately above it and PLAY the file. P XXXX !FILENAME Load FILENAME at XXXX, score the file immediately above it and PLAY the file. P XXXX YYYY !FILENAME Load FILENAME at XXXX, score the file at YYYY and PLAY the file. After the file has played the PLAY command alone will play it again, Sam. RUN Score the current file immediately after the ASCII portion of the file and play it. R XXXX Score the file at XXXX and play it. SCORE SCORE the current file immediately above the ASCII portion of the file. S XXXX SCORE the current file at XXXX. VERIFY VERIFY the current file. V XXXX VERIFY the file at XXXX and make it the current file. WRITE !FILENAME Verify the current file and WRITE it on the disk calling it FILENAME. W XXXX !FILENAME Verify a file at XXXX and WRITE it on the disk calling it FILENAME. Numeric values do not need leading zeros. Only the first letter of the command need be used. The FILENAME in the G, P and W commandsserted into the line and the ASCII char. cursor will move one place to the right. With the Look, Restart and Insert commands use only the first letter of the command (L, R & I). The character will not echo to the screen. When you are not in the Insert mode the SPACE and DELETE commands may be preceeded by a repeat factor of 1 to 9. CARRIGE RETURN will end the edit session and place the changes into the file. Control-X will cancel the current line, terminate a listing or take you out of the EDIT mode with no changes to the file. Control-P will flip-flop the printer on and off. Control-C will send you back to CP/M. DELETE can be either the regular DELETE character (7FH) or the BACK-ARROW (5FH). It is usually best to allow a small incriment between line numbers rather than making them consecutive. This will allow a forgotten measure to be added at a later time. ++ ERROR MESSAGES ++ Error messages are set off with plus signs. When an error occors the line in which thsome other place in memory. Once the MUSIC SYSTEM is playing a piece it can only be stopped by resetting the computer. The program can be restarted by using a MONITOR command or the front panel switches to EXECUTE 100H. The program will not initialize again and your music will not be lost. Files created by this program are given the filetype of .MUS. To become familiar with the way a file is written bring up the program, GET a file and LIST it. The following commands are valid after you see the prompt: AUTOLINE Places the command processor in an auto-line number mode. If a SPACE is typed immediately after the prompt the program will print a line number 10 higher than the last line number in the file. The data for the new line may then be entered. In this mode the prompt will change as an indicator that the mode is turned on. Typing A as a command again will turn off the AUTO mode and the prompt character will be normal again. CATALOG Print the CATALOG of files on the must be preceeded by an exclaimation point (!). The FILENAME may contain any upper case alpha or numeric characters, be up to eight (8) characters long and may not contain any spaces. The program will normally read programs from the signed-on drive or another drive may be specified by including the standard CP/M drive specification immediately after the exclaimation point and befor the FILENAME. Example: G !B:ALLEGRO When the MUSIC SYSTEM is first started it prints the following: The MUSIC SYSTEM for CP/M Ver. N.N Memory Range: MIN MAX FILE PARAMETERS * The file parameters should be the same as MIN. When a file is VERIFIED or SCORED, the parameters will be printed at the end of the command. More than one file may be stored in memory. Be sure to allow space for the file to be scored. The scored file will often be larger than the ASCII file. Files with the file type .MUS are MUSIC SYSTEM files only and cannot be edited with the CP/M editors due to a difference in file error was found is printed with a ? in place of the bad character. If the error was detected while the score is being compiled the editor will be entered automatically at the problem line. In the case of a disk error only the error message will be printed. PROGRAM VARIABLES Note Note Musical Modifier Name Value Equivalent # ACCIDENTAL SHARP W WHOLE NOTE & ACCIDENTAL FLAT H HALF NOTE % ACCIDENTAL NATURAL Q QUARTER NOTE ' SHORT ARTICULATION I EIGHTH NOTE " LONG ARTICULATION S SIXTEENTH NOTE , STACATTO T THIRTY-SECOND NOTE . DOTTED NOTE X SIXTY-FOURTH NOTE : TRIPLET $ Rest for duration of Note Value symbol. SYMBOL MODIFIER MEANING / None All characters on the rest of the line are ignored. A REMARK line. P Any letter Define beginning of part identified (A-Z) by the modifier. Any previous part is ended. If the part was previously d signed-on disk with the filetype of MUS. C !DRIVE: Print the files on specified drive. DELETE XXXX DELETE line XXXX from the current program. D XXXX YYYY DELETE lines from XXXX to YYYY. EDIT Go to EDIT mode and place the last line edited in the edit buffer. E XXXX Go to EDIT mode and place line XXXX in the edit buffer. See EDITOR instructions for more detail. GET !FILENAME GET a file called FILENAME from the disk and load it at minimum memory. G XXXX !FILENAME Load the file at XXXX. After the G command is used and the file is loaded the file will be VERIFIED automatically. LIST LIST the current file. L XXXX LIST line XXXX in the current file. L XXXX YYYY LIST lines from XXXX to YYYY in the current file. MENU Print a list of the commands. NEW Start a NEW file at the minimum memory location. N XXXX Start a NEW file at XXXX. PLAY PLAY the currently scored file. P XXXX PLAY a file scored at XXXX. P !FILENAME Load FILENAME at minimum mee structure. The files are stored with a character count byte followed by the ASCII information and terminated with a CARRIGE RETURN. The file is terminated with a HEX 01. The EDITOR To EDIT a line type E and a line number. The editor will print the entire line and then just the line number. The following commands may then be used: SPACE Moves the cursor to the right and prints one character from the line. DELETE Moves the cursor to the left one character. Look Prints the rest of the line and then the line number Restart Cancels any edits that have been made on this line and restarts the editor. X Goes to the end of the line and enters the Insert mode. Insert Enter the INSERT mode. The following commands are available: DELETE Back-up the cursor and remove one character from the line. ESCAPE or Takes you out of the INSERT mode and back to ALT MODE the editor. Any changes will be held in the edit buffer. Any printing Will be inefined, the old definition is lost. R Any letter Repeat the part named by the modifier. (A-Z) Tempo can be changed here if desired. M Any character Defines the beginning of a measure. or characters Any previous measure is ended. Modifier can be a number to help identify various measures. V Digit All of the notes following are added to (1-3) any previous notes of this measure belonging to the voice named by the modifier. 32 notes maximum. < Hex Digit All the notes following are transposed (0-F) down the number of semi-tones specified by the modifier. > Hex digit All the notes following are transposed up the number of semi-tones specified by the modifier. * None Unless otherwise indicated, all notes following are assumed to be + . (Treble cleft) @ None Unless otherwise indicated, all notes following are assumend to be - . (Bass cleft) ^ Signed HEX Transpose only those notes following (+ -) (0-F) that belonam by adding extra N specifications. Only one tempo specification can be made for a part. The front panel switches should normally be left off to allow the file to play with the tempo specified in the program. Changing the front panel switches while the file is playing will cause the tempo to be set by the switch positions. This allows experimentation with the tempo. When you find the proper tempo enter the hex value of the switch positions into the N specification of the file. There must be at least one PART and one tempo specified for the file to score properly. The following circuitry can be added to any wire-wrap board or a regular board which has some extra space. S-100 I I PIN 1K I I 28 <---/\/\/\/--O----O---I I-------> TO AMPLIFIER PINTE I I I I I \ I I .1UF I / ----- \ 10K .1UF ----- / I \ 1/4 watt 10% resistors I I 20 volt ceramic dig to the current voice up or down the number of whole steps indicatedby the modifier. K Digit Char Key signature is defined by a number (0-7) (# &) and type (SHARP or FLAT) specified in the modifier. If this symbol is omitted the key defaults to C-MAJOR. N Character Correlates the length of a note (H,Q,I,S) type in the modifier to the length of a beat. Sets tempo. = 2 Digit HEX Equates the length of a beat to (00-FF) the number of internal machine cycles specified by the modifier. MUSICAL NOTE SYMBOLS F -- E -- D -- C -- B ------------------A--- 9 ----------------8----- TREBEL 7 --------------6------- CLEFT 5 ------------4--------- 3 +3 ----------2----------- -- +2 -- 1 +1 -- 0 -- MIDDLE C -- 0 -- -1 sk capacitors --O--- I ----- --- - -0- rmally be left off to allow the file to play with the tempo specified in the program. Changing the front panel switches while the file is playing will cause the tempo to be set by the switch positions. This allows experimentation with the tempo. When you find the proper tempo enter the hex value of the switch positions into the N specification of the file. There must be at least one PART and one tempo specified for the file to score properly. The following circuitry can be added to any wire-wrap board or a regular board which has some extra space. S-100 I I PIN 1K I I 28 <---/\/\/\/--O----O---I I-------> TO AMPLIFIER PINTE I I I I I \ I I .1UF I / ----- \ 10K .1UF ----- / I \ 1/4 watt 10% resistors I I 20 volt ceramic di 1 -- -2 -- ------------2----- -3 3 ----------4------- 5 BASS --------6--------- 7 CLEFT ------8----------- 9 ----A------------- B -- C -- D -- E -- F The staff position of a note is defined by its relation to middle-C. Middle-C is always 0 and every other note is a positive or negative displacement from it. The displacement is counted 0-9 and A-F (hex numbers). The displacements A-F do not correspond to the musical values of A-F. The key of C is assumed unless otherwise specified by the program. The key may be changed within the program. The tempo is set with the N(modifier)=(00-FF) specification. Example: NQ=40 The quarter note (Q) will require 40 internal machine loops to complete. The tempo can be changed within the progrtarting at the specified page Forms: GET
<--
in HEX Customization Variables: NUMBASE RAS Examples: GET 8000 TEST.80 <-- Load TEST.80 starting at 8000H GE 10 TEST.8 o GE 100 TEST.8 <-- Loa TEST.8 starting at 100H GE TEST.8 <-- Loa TEST.8 startin a 000H Notes: GEԠ searche fo th specifie fil accordin t th sam comman hierarch searc employe b th CCP comman scanner Hence i th use i o B:/1 an th fil i o A:/ wit th curren defaul use numbe a 0 GE wil searc fro B:/1 t B:/0 to A:/0 in looking for the file. CCPZ Error Messages Th followin ar th erro message issue b CCPڠ an their meanings. Message Meaning ? Printed after a command or an argument means that such was invalid No File From DIR, this means that DIR did i a extende concep t Comman Level an whic i specificall supporte b CCP Versio 4. an beyond Thi comman leve allow transcien progra t plac comman lin int CIBUF an th characte coun int CBUF an hav thi comman lin execute b CCPZ Onc contro i transferre t CCP t execut th comman line th transcien progra whic place th comman lin lose contro an th comman i execute exactl a thoug i ha bee type b th user at his console terminal. I orde fo transcien progra t utiliz th Comman Leve facility thi progra MUS d th following: 1 Locat th CCPZ Sinc th CCP i ALWAY 2 byte i siz an locate directl unde th BDOS th transcien ca locat th CCPڠ b examinin th BDO entr pag addres a locatio an subtractin fro thi numbe ( page 2 bytes). The resulting number is the base page address of CCPZ.  bdos lhld ccp ;Get Address of CCP lda udflag ;Get User/Disk Flag mov c,a ; ... in C pchl ;Run Command Line ccp: ds 2 ;CCP Address buffer prmpt: db 'User Command? $' Enjoy using CCPZ! -- RLC  not locate any files Also from ERA with the same meaning All? Issued in response ERA *.*, asks the user is he really wants to erase all the files. Unlike under the original CP/M 2.2 CCP, single character input is required (Y or y for yes and anything else for no) with NO to end the line Full From SAVE, means that there is not enough space on disk From GET or command load by CCP, means that there is not enough space in memory File Exists From REN, means that the new file name specified already exists on disk Part C CCPZ Command Levels and How to Use Them CCPڠ Versio 4. an beyon support thre distinc comman level i it implementation Eac leve constitute differen way to issue a command for CCPZ to process. Comman Level an ar commo t al implementation o CP/͠ a 2 Stor th comman lin i CIBUF an th characte coun i CBUFF Knowin th bas pag addres o CCPZ th following information is useful in doing this: ORG CCPLOC ;Base Address of CCPZ JMP CCP ;Enter CCPZ and Execute Default Cmd JMP CCP1 ;Enter CCPZ and Don't Execute MBUFF: DB BUFLEN ;Size of CIBUFF in bytes CBUFF: DS 1 ;Number of Bytes in Command Line CIBUFF: DS BUFLEN ;Buffer for Command Line DS 1 ;Buffer for Ending 0 (set by CCPZ) CIBPTR: DS 2 ;Address of CIBUFF (set by CCPZ) 3 Obtai th User/Dis Flag Locatio contain thi number bu th use ma selec fla o hi choice Thi fla i on byt long an th high-orde nybbl ( bits contain th use numbe an th low-orde nybbl contain th dis numbe t proces th comman from Th User/Dis Fla i to n CP/Z fro CP/ Versio 1.4 Comman Leve i tha comman leve i whic th comman i issue b th use fro hi consol terminal Th promp 'd> o 'du> appear o th terminal an th use i allowe t ente th comman wit editin fro th terminal Comman Leve i tha comman leve in which the command is entered from an executing $$$.SUB file. I bot cases th comman i store i th interna CCP buffe calle CIBUF (Comman Inpu BUFFer) Unde bot Comman Level an 2 th comman i place int thi buffer th character o th comman lin ar capitalized characte coun whic indicate th numbe o character i th comman lin i store i CBUF (th byt befor CIBUFF) a endin binar i place afte th las characte i th comman line an th interna pointe CIBPT (Comman Inpu Buffe PoinTeR i se t point to CIBUFF (the first character of the command line). Comman Levebe passed to CCPZ in the C Register. 4 Whe ready transfe contro t CCP t proces th comman b JMPin t th bas addres o CCPZ Th firs JM i th JM Tabl give abov i a thi address A thi time CCP wil lo i th use an dis i th User/Dis Fla an proces the Command Level 3 Command Line. Th followin i sampl progra whic illustrate th steps outlined above: ; ; Demonstration of Command Level 3 Facility by RLC ; udflag equ 4 ;Address of User/Disk Flag bdos equ 5 ;Address of BDOS Entry Point org 100h lxi d,prmpt ;Print User Prompt mvi c,9 ;PRINT function call bdos lhld bdos+1 ;Get address of BDOS mov a,h ;High-Order Address in A sui 8 ;A=High-Order Address of CCP mov h,a ;HL=Address of CCP mvi l,0 shld ccp ;Save address in buffer lxi d,6 ;Point to command line buffer dad d ;HL points to command line buffer xchg ;DE points to command line buffer mvi c,10 ;READLN into this buffer call TITLE 'UNSPOOL Disk to device background process' ; VERSION EQU 3$0 ;Version number ; ;Author: ; Gary P. Novosielski ; ;NOTE: This source file requires MAC for assembly. ; Due to the complexity of operations performed by ; the macros which generate the relocation table, the ; assembly process will be significantly longer than ; normal for a program of this size. Be prepared for ; a long period of no disk activity on each pass before ; pressing the panic button. ; ;Revisions: (in LIFO order) ; ;3.0 81-11-12 ; New release. Relpaces 2.3. ;Version 3 ; Now continues to run during direct BIOS input. ; The device name "off" has been implemented as ; a method of cancelling an already running ; UNSPOOL. It causes a BDOS function 0 reset. ; Function 0 reset now trapped. Prompts operator ; with option to cancel. Optional tab expansion ; support at assembly time. Disk reset (login) ; occurs during simulated warm-boot. Various ; cosmetic and source revisions. ;Version 2 ; Copy BIOS taN @RLD SET ??R&NN @NXTRLD SET @NXTRLD + 1 ENDM ; ; ; Enter here from Console Command Processor (CCP) ; CCPIN ORG TPA JMP INTRO ; SIGNON: DB 'UNSPOOL',TAB,TAB,TAB DB 'Ver ' DB (VERSION/10)+'0' DB '.' DB (VERSION MOD 10)+'0' IF EXPAND DB '/T' ENDIF ;expand DB '$' ; INTRO: CPM MSG,SIGNON CALL SETUP ;initialize. LXI H,BDOS+2 ;find top of memory MOV A,M ;page address ;Form destination... SUI PAGES+1 ;...address in MOV D,A ;DE pair. MVI E,0 PUSH D ;save on stack LXI H,@BASE ;source address LXI B,SEGLEN ; MOVLOOP: ;Move (HL) to (DE) for (BC) bytes MOV A,B ORA C ;test for (BC) = 0 JZ MOVDONE DCX B ;count down MOV A,M ;move a byte STAX D INX D ;bump the pointers INX H JMP MOVLOOP ; MOVDONE: ;The segment is now moved to high memory, but not ;properly relocated. The bit table which specifies ;which addresses need to be adjusted is located ;just after the last byte of the source segment, ;so (HL) is now pointing at it. POP AD SP; return address from MOV A,M; down the stack a ways. INX H MOV H,M MOV L,A SHLD CCPRET+1; Save the CCP re-entry ; point. ; LHLD BDOS+1 SHLD GOBDOS+1; Save the BDOS entry ; point. ; LHLD CONIN+1; Save the direct call SHLD REALCON+1; to console input. SETUPDEV: LXI D,TFCB2+1 LDAX D CPI ' ' JZ SETUPFIL ; LXI H,LSTLIT MVI B,4 CALL SCOMP JZ SETUPFIL; Use default ; LXI D,TFCB2+1 LXI H,PUNLIT MVI B,4 CALL SCOMP JNZ CKSYS MVI A,@PUN STA DEVICE JMP SETUPFIL CKSYS: LXI D,TFCB2+1 LXI H,OFFLIT MVI B,4 CALL SCOMP JNZ DEVERR CPM SYS ;Request system reset SETUPFIL: LDA TFCB1 ORA A JNZ OPENIT ;The drive has been defaulted. Make it explicit ;in case the default drive is changed while the ;file is being unspooled. CPM CUR; Returns A: as 00 INR A; Open needs A: as 01 STA TFCB1 OPENIT: CPM OPN,TFCB1 INR A JNZ COPYFCB ;Error. Can't open input file. LXI H,TBUFF MOV A,M ADD L MOV L,A ADC H SUB L MOV H,A INXble so application programs will ; still have BIOS access by using word at BOOT+1. ; Preserve USER and IOBYTE values as of startup. ; ; BDOS Functions: ; @SYS SET 0 @KEY SET 1 @CON SET 2 @RDR SET 3 @PUN SET 4 @LST SET 5 @DIO SET 6 @RIO SET 7 @SIO SET 8 @MSG SET 9 @INP SET 10 @RDY SET 11 @VER SET 12 @LOG SET 13 @DSK SET 14 @OPN SET 15 @CLS SET 16 @DIR SET 17 @NXT SET 18 @DEL SET 19 @FRD SET 20 @FWR SET 21 @MAK SET 22 @REN SET 23 @CUR SET 25 @DMA SET 26 @CHG SET 30 @USR SET 32 @RRD SET 33 @RWR SET 34 @SIZ SET 35 @REC SET 36 ; ;System equates: CPMBASE EQU 0 BOOT SET CPMBASE BDOS SET BOOT+5 TFCB EQU BOOT+5CH TFCB1 EQU TFCB TFCB2 EQU TFCB+16 TBUFF EQU BOOT+80H TPA EQU BOOT+100H CTRL EQU ' '-1 ;CTRL CHAR MASK CR SET CTRL AND 'M' LF SET CTRL AND 'J' TAB SET CTRL AND 'I' FF SET CTRL AND 'L' BS SET CTRL AND 'H' EOF SET CTRL AND 'Z' FALSE EQU 0 TRUE EQU NOT FALSE ? EQU -1 NVECTS EQU 16; ;Number of BIOS vectors FCBLEN EQU 33 ;Length of input FCB ; ; AssemblD ;beginning of newly moved code. LXI B,SEGLEN;length of segment PUSH H ;save pointer to reloc info MOV H,D ;offset page address ; FIXLOOP: ;Scan through the newly moved code, and adjust any ;page addresses by adding (H) to them. The word on ;top of the stack points to the next byte of the ;relocation bit table. Each bit in the table ;corresponds to one byte in the destination code. ;A value of 1 indicates the byte is to be adjusted. ;A value of 0 indicates the byte is to be unchanged. ; ;Thus one byte of relocation information serves to ;mark 8 bytes of object code. The bits which have ;not been used yet are saved in L until all 8 ;are used. ; MOV A,B ORA C ;test if finished JZ FIXDONE DCX B ;count down MOV A,E ANI 07H ;on 8-byte boundry? JNZ NEXTBIT ; NEXTBYT: ;Get another byte of relocation bits XTHL MOV A,M INX H XTHL MOV L,A ;save in register L ; NEXTBIT MOV A,L ;remaining bits from L RAL ;next bit to CARRY MOV L,A ;save the rest JNC NEXT H MVI M,'?' INX H MVI M,'$' CPM CON,CR CPM CON,LF CPM MSG,TBUFF+1 POP H; Adjust stack RET; Exit to CCP ; COPYFCB: LXI H,TFCB1 LXI D,FCB MVI C,FCBLEN COPY1 MOV A,M STAX D INX H INX D DCR C JNZ COPY1 ; SETUPUSR: ; Save user number in effect at time of entry CPM USR,? STA ENTUSR ; SETUPIOB: ; Save IOBYTE in effect at time of entry CPM RIO STA ENTIOB ; RET ; SCOMP: LDAX D CMP M RNZ INX D INX H DCR B JNZ SCOMP RET ; DEVERR: CPM MSG,DEVERRMSG POP H; Adjust stack RET; Exit to CCP VECTERR: CPM MSG,VCTERRMSG JMP BOOT ;try re-booting. ; LSTLIT: DB 'LST ' ;Note trailing blank PUNLIT: DB 'PUN ' ;Note trailing blank OFFLIT: DB 'OFF ' ;Note trailing blank DEVERRMSG: DB CR,LF,'Invalid device.$' VCTERRMSG: DB CR,LF,'Error in system table. ' DB 'Attempting re-boot.$' PAGE ;Align location counter to next page boundry @BASE ORG ($ + 0FFH) AND 0FF00H @RLBL SET 0 ; one label for relocating ; TRAPCON ; ; The segy options EXPAND SET TRUE ;True to expand tabs IF EXPAND PHYSBS SET TRUE ;True to recognize backspace ENDIF ;The flag SAVECCP should be made true if ;the program segment should load below the CCP. ;If false the segment will load in the extreme ;top of the Transient Program Area, overlaying ;the Console Command Processor. ; SAVECCP SET TRUE ;MUST remain true for UNSPOOL OVERLAY SET FALSE ;(initially) ; Macro Definitions ; ; Perform a standard BIOS function: CPM MACRO FUNC,OPERAND IF NOT NUL OPERAND LXI D,OPERAND ENDIF ;not nul operand IF NOT NUL FUNC MVI C,@&FUNC ENDIF ;not nul func CALL BDOS ENDM ; ; Generate a label of the form ??Rnn to tag an ; address requiring relocation: RTAG MACRO LBL,VAL ??R&LBL EQU VAL ENDM ; ; Flag as a relocatable instruction ; is of the form: R MACRO INST @RLBL SET @RLBL+1 RTAG %@RLBL,%2+$-@BASE INST-@BASE ENDM ; ; During bit map construction, get the next R-tagged ; address value: NXTRLD MACRO NADR ; ;CARRY was = 1. Fix this byte. LDAX D ADD H ;(H) is the page offset STAX D ; NEXTADR INX D JMP FIXLOOP ; FIXDONE: ;Finished. Jump to the first address in the new ;segment in high memory. ; ;First adjust the stack. One garbage word was ;left by fixloop. INX SP INX SP ; ;(HL) still has the page address MOV L,A ;move zero to l PCHL ;Top-of-stack is CCP return SETUP: ;First, check environment to see if BIOS vectors ;are accessible. LDA BOOT ;Location BOOT should CPI ( JMP ) ;have a JMP instruction JNZ VECTERR LHLD BOOT+1 ;Location one points MVI C,NVECTS ;to the table of jumps ;which we move into ;the code. LXI D,BIOSV XCHG VLOOP: LDAX D CMP M ;another JMP? JNZ VECTERR INX D INX H LDAX D MOV M,A INX D INX H LDAX D MOV M,A INX H INX D DCR C JNZ VLOOP ; Save old vectors and CCP return address ;Patch up new vectors as required. LHLD BOOT+1 SHLD OLDBOOT; Save the BOOT vector ; LXI H,2; Retrieve the CCP Dment to be relocated goes here. ; Any position dependent (3-byte) instructions ; are handled by the "R" macro. ; For readability, the macro name "R" is placed in ; column 2. The preceding blank must be present to ; distinguish it from a label. ;************************************************* BDOSV: ;During operation, this location will point ;to INTERCEPT and will be jumped to by BDOS. ;It must be at the lowest location ;in the protected segment of code. R ;complete installation BIOSV: REPT NVECTS JMP ? ENDM CONSTAT EQU BIOSV +(1*3) CONIN EQU BIOSV + (2*3) LSTSTAT EQU BIOSV + (14*3) ; INTERCEPT: ;This routine intercepts all BDOS calls. MOV A,C; Get function CPI @SYS; Is it a system reset? R CPI @KEY; Is it single key input? R CPI @INP; or buffered input? R WAITING: ;Wait for actual keypress before honoring input ;request. Unspool characters in the meantime. R ORA A; See if finished. R MOV E,A MVI C,@SIO R POP D ;RESTORE CHARACTER MVI C,@LST; Default DEVICE EQU $-1; Device code patch R R ; Restore active IOBYTE MOV E,A MVI C,@SIO R R ; IF EXPAND HNDTAB: R ; Set the flag SPCOUT: MVI A,' ' R ; TABSEQ: R MVI A,7 ANA M; Check if more blanks needed R R ; Clear the flag R ENDIF ;EXPAND ENDFILE: ; An EOF has been reached on the input file. ;Mark this program as inactive, and de-install on ;the next warm boot. XRA A R ; PROCEXIT: POP D POP B POP H; Restore SP SPHL RET ; ; FILLBUFF: ;Fill the buffer from the file PUSH H INX H XCHG; Buffer address to DE MVI C,@DMA; Set DMA address R MVI E,?  by executing ;the address found in the BOOT vector at entry. ;Otherwise return to CCP without rebooting. LXI SP,CCPIN ;set up a valid stack R ORA A R ;Jump to old boot address as read from memory ;word 1 before we changed it. R MVI C,@MSG R R PCHL ; NOTYET LXI H,TBUFF R MVI C,@LOG R R MVI C,@MSG R R R R SHLD BDOS+1 R R R SHLD BOOT+1 CCPRET: JMP ?; Patched on startup ; ACTMSG: DB CR,LF DB 'Unspooling in progress.' DB '$' DONEMSG: DB CR,LF,'UNSPOOL Completed.' DB '$' CNCL?: DB CR,LF,'Do you want to cancel UNSPOOL?' DB CR,LF,'{Y|N} ?>' DB '$' CNCLMSG: DB CR,LF,'UNSPOOL Cancelled.' DB '$' OLDBOOT DW ? DMAHOLD DW TBUFF ACTIVE DB TRUE IF EXPAND TABFLAG DB FALSE LINEPOS DB 0 ENDIF ;EXPAND USRHOLD DB ? ENTUSR DBOCESS>; Note that A <> 0 R ; Honor the input request ; CKDMA CPI @DMA; If the DMA address is being ; changed, we have to know. R XCHG R XCHG ; GOBDOS JMP ?; Patched on entry ; points to "real" BDOS routine. ; TRAPCON: ; The application has done a direct BIOS call for ;console input. We can be confident that this was not ;as a result of a BDOS operation, since BDOS knows ;nothing about our local jump table. Thus we will not ;need to be concerned with the non-reentrancy of BDOS. ; R ORA A; See if active. MVI A,0; Flag BIOS-type request. R ; Unspool a while if so. REALCON: JMP ?; Patched during setup. ; PROCESS: ;The application program is now waiting for a key ;to be input. We will use this opportunity to print ;some characters to the device until a key is ;actually pressed. R ;The A register tells type ; of input request. LXI H,0 DAD SP R PUSH H; Save  MVI C,@USR R ; Get current user R ; Save it R ; Change to user at entry MOV E,A MVI C,@USR R R MVI C,@FRD; Read a sector R PUSH PSW; Save read return code R XCHG; Restore DMA address MVI C,@DMA; to old value. R R MOV E,A; Restore User number MVI C,@USR; to old value R POP PSW; Read return code POP H; Buffer pointer ORA A; How went the read? RZ; Fine STC; No good. Set CARRY for EOF RET ; CKKEY: ; Return zero flag if key not pressed ;Two types of status checking are done, depending ;on the way in which console input was requested. If ;via BDOS, a BDOS call is used. If via direct BIOS, a ;direct BIOS call is used. This distinction in made ;necessary by the one-character input buffer which ;BDOS may fill during console output. (Yes output.) ; R ; Type of input which ORA A; was requested. R R R ; Start the program. ; OVERLAY SET $ ;Bit table may start here ; Nothing past here but DS's. DS 128-$+BUFFER DS 32; LOCAL STACK AT LEAST 16 WORDS ; PLUS WHATEVER'S LEFT OVER LCLSTACK EQU ($+0FFH) AND 0FF00H ;************************************************* ;End of segment to be relocated. IF SAVECCP PAGES EQU ($-@BASE)/256+8; CCP = 8 pages. ELSE PAGES EQU ($-@BASE)/256 ENDIF ;saveccp ; IF OVERLAY NE FALSE ;cause relocation map to slide down into ;unused DS area: SEGLEN EQU OVERLAY-@BASE ORG @BASE+SEGLEN ELSE ;relocation bit map starts here: SEGLEN EQU $-@BASE ENDIF ;overlay PAGE ; Build the relocation information into a ; bit map following the code. ; @X SET 0 @BITCNTold SP PUSH B PUSH D; Save entry parameters MVI C,@RIO; Save old IOBYTE R R PROC1: R ; Check for keypress. R R ;Check device being used CPI @LST R ;If it is LST: R ORA A R ;Loop if not ready ; PROC2: IF EXPAND R ; In a tab sequence? ORA A R ENDIF ;EXPAND ; R MOV A,M ORA A R R INR A MOV M,A MOV C,A MVI B,0 DAD B; Point to the buffered char. MOV A,M CPI EOF R IF EXPAND R ; Print head position. ; CPI TAB; Is this a tab? R ; Process it. ; IF PHYSBS CPI BS; Backspace? R DCR M; Back up 1 column R PROC3: ENDIF ;PHYSBS CPI CR; End of line? R MVI M,0; Reset column count. R PROC4: CPI ' '; Other ctrl char? R ; Dont change column. PROC5: INKEY0> MVI C,@RDY; Use BDOS if non-zero R ORA A RET CKKEY0: R ; Use BIOS otherwise ORA A RET ; SYSREQ: ;The application process has requested a warm-boot ;by invoking BDOS function 0. Inquire whether the ;spool writer should be terminated. If not, treat ;as a normal warm-boot request. ; LXI SP,CCPIN; Set up a valid stack R ; If not active ORA A; then don't ask. R R R MVI C,@MSG R ; CPM KEY ;Get reply ORI 'a'-'A' ;Force lower case CPI 'n' ;Note lower case n. JZ BOOT CPI 'y' ;Note lower case y. JNZ BOOT ;Default = No ; ; Do a real BDOS function 0 which will terminate ; the spool writer. R SYSRQ9: MVI C,@MSG ;Inform the operator R ; MVI C,@SYS R ;Reset system BOOTREQ: ;The application process has requested a reboot ;by jumping to location 0. If we are no longer ;active, we will honor the request SET 0 @RLD SET ??R1 @NXTRLD SET 2 RTAG %@RLBL+1,0FFFFH ;define one more symbol ; REPT SEGLEN+8 IF @BITCNT>@RLD NXTRLD %@NXTRLD ;;next value ENDIF IF @BITCNT=@RLD @X SET @X OR 1 ;;set low bit ENDIF @BITCNT SET @BITCNT + 1 IF @BITCNT MOD 8 = 0 DB @X ;;DEFINE THE BYTE @X SET 0 ;;clear hold variable for more ELSE @X SET @X SHL 1 ;;not 8 yet. move over. ENDIF ENDM ; END CCPIN PUR2MIN NOT2PRTFJSBNOT LVBMIN NOT3CCPZ-V40DOC2"UNSPOOL ASM#$PUR2MIN MUSLVBMIN MUSMUSIC4 DOCMAC COM\EMUSIC DOCa !BREEZ MUS"PIC MUS#BOOGIE MUS$HUSTLE MUS%CHOPS MUS&MYLIFE MUS 'Q1'1'H1' 0310 PH ,0320 M21 *W7' V2Q.0'I0Q0'0' V3@Q.2'I2Q2'2' '0330 M22 *WA V2Q.0'I0H0' V3@Q.2'I2H2' /0340 M23 *H.A'QA V2Q.3'I3Q3'3' V3@Q.1'I1Q1'1' '0350 M24 *Q9878' V2H3'Q$3' V3@H1'Q$1' +0360 M25 *W7 V2Q.0'I0Q0'0' V3@Q.2'I2Q2'2' '0370 M26 *W7 V2Q.0'I0H0' V3@Q.2'I2H2' /0380 M27 *H.7'QA V2Q.1'I1Q1'1' V3@Q.1'I1Q1'1' '0390 M28 *Q9878' V2H1'Q$1' V3@H1'Q$1' +0400 M29 *W7 V2Q.3'I3Q3'3' V3@Q.2'I2Q2'2' (0410 M30 *H7'8' V2Q1'1'$1' V3@Q2'2'$2' +0420 M31 *W3 V2Q.0'I0Q0'0' V3@Q.2'I2Q2'2' '0430 M32 *Q3'135 V2H0'Q$0' V3@H2'Q$2' +0440 M33 *W7 V2Q.1'I1Q1'1' V3@Q.1'I1Q1'1' +0450 M34 *H7'8' V2Q1'1'$'1' V3@Q1'I1Q1'1' +0460 M35 *W7 V2Q.1'I1Q1'1' V3@Q.1'I1Q1'1' '0470 M36 *H.7' V2Q3'3'3'$ V3@Q1'1'1'$ 0480 PI $0490 M37 *W7 V2W5& V3@Q.6&'I6Q6'6' +0500 M38 *H7'Q9&8&' V2W5& V3@Q.6&'IDQ6'6' #0510 M39 *W7 V2W5& V3@Q.8'I8Q8'8' 0520 PJ )0530 M40 *H7Q5&6% V2H5&' V3@Q.8'I8Q8'8' *0540 M41 *H.7I9&A V2H.4' V3@Q.9&'I9Q9'9' $0550 M42 *W9& V2W0 V3@Q.9&'I9Q9'9' (0560 M43 *H9'4 V2H0'2&' V3@Q.7'I7Q7'7' +0570 M44 *Q3H.4 V2Q1&H.2&' V3@Q.7'I7Q7'7' 0580 PK RI 0590 PL (0600 M48 *Q3H.4' V2W5&' V3@Q.8I8Q8'5&' 0610 PM +0620 M49 *W7 V2Q.3'I3Q3'3' V3@Q.7'I7Q7'E' ,0630 M50 *W7' V2Q.3'I3Q3'3' V3@Q.7'I7Q7'E' 0640 PN +0650 M51 *WE V2Q.3'I3Q3'3' V3@Q.7'I7Q7'E' ,0660 M52 *WE' V2Q.3'I3Q3'3' V3@Q.7'I7Q7'E' 0670 PO RM 0680 PP RB 0690 PQ RE 0700 PR -0710 M59 *H.7'Q7 V2Q.1'I1Q1'1 V3@Q.2'I2Q2'2 0720 M60 *H.7Q$ V2H.1' V3@H.2' 0730 / END D H2'Q$2' +0440 M33 *W7 V2Q.1'I1Q1'1' V3@Q.1'I1Q1'1' +0450 M34 *H7'8' V2Q1'1'$'1' V3@Q1'I1Q1'1' +0460 M35 *W7 V2Q.1'I1Q1'1' V3@Q.1'I1Q1'1' '0470 M36 *H.7' V2Q3'3'3'$ V3@Q1'1'1'$ 0480 PI $0490 M37 *W7 V2W5& V3@Q.6&'I6Q6'6' +0500 M38 *H7'Q9&8&' V2W5& V3@Q.6&'IDQ6'6' #0510 M39 *W7 V2W5& V3@Q.8'I8Q8'8' 0520 PJ )0530 M40 *H7Q5&6% V2H5&' V3@Q.8'I8Q8'8' *0540 M41 *H.7I9&A V2H.4' V3@Q.9&'I9Q9'9' $0550 M42 *W9& V2W0 V3@Q.9&'I9Q9'9' (0560 M43 *H9'4 V2H0'2&' V3@Q.7'I7Q7'7' +0570 M44 *Q3H.4 V2Q1&H.2&' V3@Q.7'I7Q7'7' 0UNSPOOL.ASM 81-11-21 for CP/M 2.0 and up. AUTHOR: Gary P. Novosielski Rutherford, NJ (201) 935-4087 INTRODUCTION: UNSPOOL (Ver 3.0) is a program to send a standard CP/M file such as a .PRN or .ASM file to the system's list or punch device, while still allowing other system operations to take place. The file is transferred during periods when console is waiting for input. SYNTAX: UNSPOOL [d:]filename.ext [dev] or UNSPOOL dummy OFF [square brackets denote optional parameters] Where d: is an optional drive spec such as A: or B:. If not entered, the current default drive is assumed. filename.ext is the name of the CP.M file to be printed/punched dev is the symbolic name of the output device to be used. Valid devices are LST and PUN. Note that the colon (:) usually present in these names is NOT entered. If not specified, the LST: device is assumed. OFF If OFF is specified instead of a deliteral OFF, the program executes a BDOS funcion 0 (System Reset) and terminates. The file named in the command line is opened for input. If not present, the command is echoed to the console followed by a "?" and control returns to CCP. If the drive is not explicit, the current default drive number is recorded internally in case the default drive is changed while UNSPOOL is active. The current user number and IOBYTE values are checked and stored internally so that if the user number is changed, UNSPOOL will still be able to read the input file. If the device is changed (using STAT LST:=TTY: for example) unspool will continue to use the physical device in effect at the time the program was initiated. Any application programs will, however, use the new values of the user number and the new physical device assignments. If no errors were detected, the active program segment which monitors all calls to BDOS is relocated into high memory just below the CCP. This reduces the available user  While UNSPOOL makes every effort to restore the values of the DMA address, USER number, IOBYTE, and default disk drive before returning control to the program, a hardware reset may leave these values in an undetermined state if unspooling was actually taking place at the time. When function 10, Read Console Buffer is used, UNSPOOL will transfer characters only until the first key is pressed. At that time, no characters will be transferred until the input line is completed by pressing a carriage return. UNSPOOL requires that the List Status function in the BIOS was properly implemented at system installation time. UNSPOOL will not send characters to the LST: device unless it recieves a ready condition from the List Status routine. If the PUN: device is used, no status check is provided for by CP/M, so a not-ready condition on the punch may cause the system to hang up if PUN was specified on the command line. See the CP/M Alteration Guide for a discussion of the BIOS List Status routinevice name, the operator will be offered the option of cancelling UNSPOOL if it is already running. dummy Because the word OFF is the second parameter, a filespec is still needed. A dummy name of "." will suffice as a place holder. Examples: UNSPOOL TEST.PRN will send the file TEST.PRN from the current default drive to the current LST: device. UNSPOOL A:TEST.PRN LST is exactly equivalent to the above, assuming drive A is the default drive. Note that the device name has no trailing colon. UNSPOOL B:ZINGER.HEX PUN will send the file ZINGER.HEX from the B drive to the current PUN: device regardless of which drive is currently the default. Note that the device is "PUN" not "PUN:". UNSPOOL . OFF UNSPOOL *.* OFF UNSPOOL OFF OFF all cause an operator prompt: "Do you want to cancel UNSPOOL?" A single "Y" or "N" (Yes or No) is accepted from the console as a response. Any other character is assumed to mean "No". UNSPOOL OFF causprogram area by 3 K: 4 pages for the UNSPOOL supervisor segment, and 8 pages for the CCP which is commonly overwritten by user program buffers. The BOOT and BDOS jumps in low memory are modified to protect the CCP and UNSPOOL supervisor segment. Control is then returned to the console. Normal CP/M operation will then be possible. Characters will be sent from the input file to the output device whenever the console is idle. Whenever an application program or the CCP requests console input using BDOS functions 1 or 10, or a direct call into the jump table at C(BOOT + 1) + 6, the supervisor segment intercepts these requests and checks to see if the console is idle. If it is, characters are transferred from the input file to the output device until the console becomes ready, i.e. a key is actually pressed. At that time the BDOS function or BIOS call is executed normally, and control returns to the application program. If a jump to BOOT is attempted, this is also intercepted by the UNS. Although the console is polled frequently during the unspooling of the file, some of the diskette operations may take a second or two to complete, for example when a new extent is opened. Since the console is not polled during this period, high speed typing may cause one or more characters to be lost. This effect will vary depending upon the program being run, the types of input reqests (character or line) it uses, and the relative locations on disk of the spool file and any files in use by the program. As a result, heads-down typing is not reccommended while UNSPOOL is running. Some experience with UNSPOOL will teach the user when caution is required. INSTALLATION: The source file is written for assembly with the MAC assembler. The .HEX file produced is LOADed to a .COM file and executed just as any normal program. Relocation is done at execution time as described above. If the assembly option EXPAND is set to TRUE, tab characters in the input file will be expanded to spaces wes the file "OFF. " to be sent to the list device. OPERATION: Upon loading, the program checks to see that the the BIOS vector table pointed to by the word at location 0001H is valid, i.e. is a table of JMP instructions containing at least 16 entries. If an error is detected, the program will display an error message on the console and attempt to warm-boot CP/M. If found, the BIOS vector table is copied into the program segment which will remain active during unspooling so that subsequent application programs running concurrently with UNSPOOL will still have access to the BIOS. This table is modified to trap attempts to warm boot the system or perform direct console input. The address of the old BIOS vector table, the BDOS entry address, and the CCP return address (from the top of the stack on entry) are saved in memory. The "dev" parameter from the command line is checked. If not valid, an error message is typed and control returns to the CCP. If the "dev" parameter is the POOL supervisor segment. The message "Unspooling in progress" is displayed on the console, and no actual boot takes place. Control is returned to the protected copy of the CCP instead. Before returning, a disk reset is performed and the default DMA address is reset to 0080H to simulate a true warm-boot as closely as possible. If warmboot is attempted using BDOS function 0, the program will prompt the operator with the option to cancel. If the response is "Y", warmboot is performed using BDOS function 0 as requested. Otherwise the request is handled as with normal warmboot, above. When the input file is completely transferred, or a 1AH end-of-file character is detected, the supervisor becomes inactive, and passes on all previously intercepted requests immediately, without checking console status. When the next warm-boot request is detected, the supervisor removes itself from memory by executing a true warm-boot, and informs the operator with the message "UNSPOOL completed.". NOTES:ith assumed tab stops at every eighth print position. This option should be set to FALSE if the printer driver or the printer itself can properly handle the tab character. If the option PHYSBS is set to TRUE, a backspace character will cause the tab expansion algorithm to recognize backspace characters and decrement the column count when a backspace is encountered in the input file. This option should be set to FALSE if backspace characters are ignored by the printer. All other control codes except carriage return are assumed to be non- printing, and are ignored by the algorithm. If tab expansion is included, the version number in the signon message will be followed by "/T". Gary Novosielski  .HEX file produced is LOADed to a .COM file and executed just as any normal program. Relocation is done at execution time as described above. If the assembly option EXPAND is set to TRUE, tab characters in the input file will be expanded to spaces w3 q"""06DQ06DQ06DQ3*Q-1Q-1Q-1 !0110 M2 *Q333 V2*Q-1-1-1 V3@$IB 0120 PB 0125 K4& 0130 M3 *Q1Q.1I2 V2* V3@H8I8 0140 M4 *H-1I-1 V2* V3@QCQC 0150 M5 *Q0Q.0I-1 V2* V3@H9QA 0160 M6 *H0 V2* V3@HBIB 0170 M7 *Q-1Q.-1I0 V2@ V3@HAIA #0180 M8 *I-1-3Q-3-3I-1 V2@ V3@H.7 0190 M9 *Q-2-2-1 V2@ V3@HBIE 0200 M10 *H.0 V2@V3@QBA9% 0210 M11 *Q2Q.1I0 V2@ V3@H8I8 0220 M12 *H-1I-1 V2@ V3@QCQC 0230 M13 *Q00-1 V2@ V3@H9QA 0240 M14 *Q-2Q.0I0 V2@ V3@HBIB 0250 M15 *Q-1%-10 V2@ V3@HAID 0260 M16 *H1%I0-1% V2@ V3@H.A 0270 M17 *Q1%12 V2@ V3@H8QB 0280 M18 *H3I-1 V2@ V3@Q876% 0285 K3& 0290 M19 *H.4 V2@ V3@H5I8 0300 M20 *Q456 V2@ V3@H5I8 0310 M21 *H.4 V2@ V3@H5I8 0320 M22 *Q456 V2@ V3@Q543 0330 M23 *H.4 V2@ V3@H7IA 0340 M24 *Q2%34 V2@ V3@Q765% 0350 M25 *H5I3 V2@ V3@H4I7 0360 M26 *Q567 V2@ V3@H4Q4 0370 M27 *H.5 V2@ V3@H8IB 0380 M28 *Q563 V2@ V3@Q876 0385 PC 0390 M29 *H.4 V2@ V3@H5Q6 0400 M30 *H4I5 V2@ V3@H7Q!" " "9"1>2 2 222!l1: ʋ22!~1Nf> 2Unable to create output file $ô2! "2 :\ʥ=2 _" _##~2 ###~#fo" #* +#~ܹz:] :e !]>?2  w# >?2h: Qڸ ********************************************** * More than 80 files - Using format 1 screen * ********************************************** $R͹͉: Specified files:$: files occupying$*)K bytes $pDisk $: A:q$!}K blocks, Size=$* #)K,$: l: files,$ Used=$* )K, Free=$* )K$: ʴ>:¡B** #" * #" : )=~#$! " 2 \q No File(s) $7o&)))))* :\w#~#," 6! 4\} 2!:<2t#h7ڊO~q#} :<2! d :<2! 54Y: Qڠ! " : * ~ʏ\1" !\  t!\ 1:*!s#r͖!":<2t:<2m͉2:<2tPress any key to continue $͉2t $!\1:O* "*!s#r͖͉! " !"!" " 222 : ! s# y* ~A\1" !\  &!\ 1:*!s#r͡!":<2!\1:O* "*!s#r͡!" " * ~ #͙>2 * " ~ ʎ $#͙: <2 g͉* @" " W* !1* @" : <2 >2 * " " : >#+## > #: Gyȇ #o&71'HHdH H}o|gWJ {00kk> > > ! ~#x«>.›^#V*"$>kG$: x$:  rZr! "2*w#"!4_~#1ɷ|g}oDIR TITLE 'CCPZ Version 4.1' ; ; CP/M CONSOLE COMMAND PROCESSOR (CCP) Revision 4.1 ; FOR Z80-BASED CP/M 2.X SYSTEMS ; ; ORIGINAL CCP DISASSEMBLED BY ???? ; ORIGINAL CCP DISASSEMBLED FURTHER BY RLC ; ORIGINAL CCP COMMENTED BY RLC ; CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 ; FURTHER MODIFIED BY RLC AS V2.1 ; FURTHER MODIFIED BY KBP AS V2.2 ; FURTHER MODIFIED BY RLC AS V2.4 (V2.3 skipped) ; FURTHER MODIFIED BY RLC AS V2.5 ; FURTHER MODIFIED BY RLC AS V2.6 ; FURTHUR MODIFIED BY SBB AS V2.7 ; FURTHER MODIFIED BY RLC AS V2.8 ; FURTHER MODIFIED BY RLC AS V2.9 ; FURTHER MODIFIED BY RLC AS V3.0 ; FURTHER MODIFIED BY RLC AS V3.1 ; FURTHER MODIFIED BY RLC AS V4.0 ; SBB V4.1 11/27/81 ; ;******** Refer to CCPZ-Vxx.NOT File for Revision History ******** ; ;******** Structure Notes ******** ; ; This CCP is divided into a number of major sections. The following ; is an outline of these sections and the names of the major routines ; located therein. ; ; Section Function/ironment; use under Remote-Access Systems (RBBS) for ; security purposes ; REL EQU FALSE ;SET TO TRUE FOR MOVCPM INTEGRATION ; BASE EQU 0 ;BASE OF CP/M SYSTEM (SET FOR STANDARD CP/M) ; IF REL CCPLOC EQU 0 ;MOVCPM IMAGE ELSE ; ; If REL is FALSE, the value of CCPLOC may be set in one ; of two ways. The first way is to set MSIZE and BIOSEX ; as described above using the following three lines: ; MSIZE EQU 64 ;SIZE OF MEM IN K-BYTES BIOSEX EQU 2 ;EXTRA # K-BYTES IN BIOS CCPLOC EQU 3400H+(MSIZE-20-BIOSEX)*1024 ;CCP ORIGIN ; ; The second way is to obtain the origin of your current ; CCP using BDSLOC or its equivalent, then merely set CCPLOC ; to that value as as in the following line: ; ;CCPLOC EQU 0BD00H ;FILL IN WITH BDOSLOC SUPPLIED VALUE ; ; Note that you should only use one method or the other. ; Do NOT define CCPLOC twice! ; ; The following gives the required offset to load the CCP into the ; CP/M SYSGEN Image through DDT (the Roffset command); Note that this ; value conformh debate it was decided to have CCPZ perform the same type of ; function as CCP (look for the $$$.SUB file on A:), but the problem with ; SUBMIT.COM still exists. Hence, RGF designed SuperSUB and RLC took his ; SuperSUB and designed SUB from it; both programs are set up to allow the ; selection at assembly time of creating the $$$.SUB on the logged-in drive ; or on drive A:. ; ; A final definition of the Indirect Command File ($$$.SUB or SUBMIT ; File) is presented as follows: ; ; "An Indirect Command File is one which contains ; a series of commands exactly as they would be ; entered from a CP/M Console. The SUBMIT Command ; (or SUB Command) reads this files and transforms ; it for processing by the CCPZ (the $$$.SUB File). ; CCPZ will then execute the commands indicated ; EXACTLY as if they were typed at the Console." ; ; Hence, to permit this to happen, the $$$.SUB file must always ; be present on a specific drive, and A: is the choice for said drive. ; With this faciliRoutines ; ------- ----------------- ; ; -- Opening Comments, Equates, and Macro Definitions ; ; 0 JMP Table into CCP ; ; 1 Buffers ; ; 2 CCP Starting Modules ; CCP1 CCP RESTRT RSTCCP RCCPNL ; PRNNF ; ; 3 Utilities ; CRLF CONOUT CONIN LCOUT LSTOUT ; READF READ BDOSB PRINTC PRINT ; GETDRV DEFDMA DMASET RESET BDOSJP ; LOGIN OPENF OPEN GRBDOS CLOSE ; SEARF SEAR1 SEARN SUBKIL DELETE ; WRITE CREATE RESETUSR GETUSR SETUSR ; ; 4 CCP Utilities ; SETUD SETU0D UCASE REDBUF CNVBUF ; BREAK USRNUM ERROR SDELM ADVAN ; SBLANK ADDAH NUMBER NUMERR HEXNUM ; DIRPTR SLOGIN DLOGIN COMLOG SCANER ; CMDSER ; ; 5 CCP-Resident Commands and Functions ; 5A DIR DIRPR FILLQ ; 5B ERA ; 5C LIST ; 5D TYPE PAGER ; 5E SAVE ; 5F REN ; 5G USER ; 5H DFU ; 5I JUMP ; 5J GO ; 5K COM CALLPROG ERRLOG ERRJMP ; 5L GET MEMLOAD PRNLE ; ; FALSE EQU 0 TRUE EQU NOT FALSE ; ; CUSTOMIZATION EQUATES ;s with the standard value presented in the CP/M reference ; manuals, but it may not necessarily conform with the location of the ; CCP in YOUR CP/M system; several systems (Morrow Designs, P&T, Heath ; Org-0 to name a few) have the CCP located at a non-standard address in ; the SYSGEN Image. ; CCPR EQU 0980H-CCPLOC ;DDT LOAD OFFSET ;CCPR EQU 1100H-CCPLOC ;DDT LOAD OFFSET FOR MORROW DESIGNS ;CCPR EQU 0E00H-CCPLOC ;DDT LOAD OFFSET FOR APPLE SOFTCARD 56K ENDIF ; RAS EQU FALSE ;SET TO TRUE IF CCP IS FOR A REMOTE-ACCESS SYSTEM ; ; *** Note to Apple Softcard Users *** ; ; In their infinite (?) wisdom (???), Microsoft decided that the way to ; get a two-column directory display instead of four-column (narrow 40-col ; screen, remember) was to have their BIOS poke CCP every time it was ; loaded. Naturally, that will turn into a random poke on any non-standard ; CCP, like this one. The best way to get this CCP up on the Apple is to ; load it into CPM56.COM, at location 0E00H in the image. Thty engaged as such, Indirect Command Files like: ; ; DIR ; A: ; DIR ; ; can be executed, even though the currently logged-in drive is changed ; during execution. If the $$$.SUB file was present on the currently ; logged-in drive, the above series of commands would not work since the ; CCPZ would be looking for $$$.SUB on the logged-in drive, and switching ; logged-in drives without moving the $$$.SUB file as well would cause ; processing to abort. ; SUBA EQU TRUE ; Set to TRUE to have $$$.SUB always on A: ; Set to FALSE to have $$$.SUB on the logged-in drive ; ; The following flag enables extended processing for user-program supplied ; command lines. This is for Command Level 3 of CCPZ. Under the CCPZ Version ; 4.0 philosophy, three command levels exist: ; ; (1) that command issued by the user from his console at the '>' prompt ; (2) that command issued by a $$$.SUB file at the '$' prompt ; (3) that command issued by a user program by placing the command into ; CIB ; The following equates may be used to customize this CCP for the user's ; system and integration technique. The following constants are provided: ; ; REL - TRUE if integration is to be done via MOVCPM ; - FALSE if integration is to be done via DDT and SYSGEN ; ; BASE - Base Address of user's CP/M system (normally 0 for DR version) ; This equate allows easy modification by non-standard CP/M (eg,H89) ; ; CCPLOC - Base Page Address of CCP; this value can be obtained by running ; the BDOSLOC program on your system, or by setting the ; MSIZE and BIOSEX equates to the system memory size in ; K-bytes and the "extra" memory required by your BIOS ; in K-bytes. BIOSEX is zero if your BIOS is normal size, ; and can be negative if your BIOS is in PROM or in ; non-contiguous memory. ; ; RAS - Remote-Access System; setting this equate to TRUE disables ; certain CCP commands that are considered harmful in a Remote- ; Access enve BIOS code ; that pokes the CCP can also be modified at that time. The poke is done ; by "STA 0C8B2H", found at 24FEH in the CPM56 image. To eliminate the ; poke forever, change the "STA" to "LDA" by changing the contents of ; location 24FEH from 32H to 3AH. If you want a two-column display, set ; the TWOCOL switch below to a value of TRUE. ; TWOCOL EQU FALSE ;TRUE IF TWO COL DIR INSTEAD OF FOUR ; ; The following is presented as an option, but is not generally user-customiz- ; able. A basic design choice had to be made in the design of CCPZ concerning ; the execution of SUBMIT files. The original CCP had a problem in this sense ; in that it ALWAYS looked for the SUBMIT file from drive A: and the SUBMIT ; program itself (SUBMIT.COM) would place the $$$.SUB file on the currently ; logged-in drive, so when the user was logged into B: and he issued a SUBMIT ; command, the $$$.SUB was placed on B: and did not execute because the CCP ; looked for it on A: and never found it. ; ; After mucUFF and setting the character count in CBUFF ; ; Setting CLEVEL3 to TRUE enables extended processing of the third level of ; CCPZ command. All the user program need do is to store the command line and ; set the character count; CCPZ will initialize the pointers properly, store ; the ending zero properly, and capitalize the command line for processing. ; Once the command line is properly stored, the user executes the command line ; by reentering the CCPZ through CCPLOC [NOTE: The C register MUST contain ; a valid User/Disk Flag (see location 4) at this time.] ; CLEVEL3 EQU TRUE ;ENABLE COMMAND LEVEL 3 PROCESSING ; ; ;*** TERMINAL AND 'TYPE' CUSTOMIZATION EQUATES ; NLINES EQU 24 ;NUMBER OF LINES ON CRT SCREEN WIDE EQU TRUE ;TRUE IF WIDE DIR DISPLAY FENCE EQU '|' ;SEP CHAR BETWEEN DIR FILES ; PGDFLT EQU TRUE ;SET TO FALSE TO DISABLE PAGING BY DEFAULT PGDFLG EQU 'P' ;FOR TYPE COMMAND: PAGE OR NOT (DEP ON PGDFLT) ; THIS FLAG REVERSES THE DEFAULT EFFECT ; MAXUSR EQU 15 ;MAXB 10H @GENDD ?N-$-1 ENDM ; LDIR MACRO ;;LDIR DB 0EDH,0B0H ENDM ; LDED MACRO ?N ;;LOAD DE DIRECT DB 0EDH,05BH DW ?N ENDM ; LBCD MACRO ?N ;;LOAD BC DIRECT DB 0EDH,4BH DW ?N ENDM ; SDED MACRO ?N ;;STORE DE DIRECT DB 0EDH,53H DW ?N ENDM ; SBCD MACRO ?N ;;STORE BC DIRECT DB 0EDH,43H DW ?N ENDM ; ; END OF Z80 MACRO EXTENSIONS ; ; ;**** Section 0 **** ; ORG CCPLOC ; ; ENTRY POINTS INTO CCPZ ; ; If the CCPZ is entered at location CCPLOC (at the JMP to CCP), then ; the default command in CIBUFF will be processed. If the CCPZ is entered ; at location CCPLOC+3 (at the JMP to CCP1), then the default command in ; CIBUFF will NOT be processed. ; ; NOTE: Entry into CCPZ in this way is permitted under CCPZ Version 4.0, ; but in order for this to work, CIBUFF and CBUFF MUST be initialized properly ; AND the C register MUST contain a valid User/Disk Flag (see Location 4: the ; most significant nybble contains the User Number and the least significant ; ny; to have the command processed. Again, under CCPZ Version 4.x, it is not ; necessary to store the pointer to CIBUFF in CIBPTR; CCPZ will do this for ; the calling program if CLEVEL3 is made TRUE. ; ; WARNING: The command line must NOT exceed BUFLEN characters in length. ; For user programs which load this command, the value of BUFLEN can be ; obtained by examining the byte at MBUFF (CCPLOC + 6). ; BUFLEN EQU 80 ;MAXIMUM BUFFER LENGTH MBUFF: DB BUFLEN ;MAXIMUM BUFFER LENGTH CBUFF: DB 0 ;NUMBER OF VALID CHARS IN COMMAND LINE CIBUFF: DB ' ' ;DEFAULT (COLD BOOT) COMMAND CIBUF: DB 0 ;COMMAND STRING TERMINATOR DB ' CCPZ-V4.1 of 11/27/81 ' ;FOR DUMP IDENTIFICATION DS BUFLEN-($-CIBUFF)+1 ;TOTAL IS 'BUFLEN' BYTES ; CIBPTR: DW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR: DW CIBUF ;PTR TO CURR CMD FOR ERROR REPORTING ; DS 26 ;STACK AREA STACK EQU $ ;TOP OF STACK ; ; FILE TYPE FOR COMMAND ; COMMSG: DB 'COM' ; ; SUBMIT FILE CONTROL BLOCK ; SUBFCBIMUM USER NUMBER ACCESSABLE ; SYSFLG EQU 'A' ;FOR DIR COMMAND: LIST $SYS AND $DIR ; SOFLG EQU 'S' ;FOR DIR COMMAND: LIST $SYS FILES ONLY ; SUPRES EQU TRUE ;SUPRESSES USER # REPORT FOR USER 0 ; DEFUSR EQU 0 ;DEFAULT USER NUMBER FOR COM FILES ; SPRMPT EQU '$' ;CCP PROMPT INDICATING SUBMIT COMMAND CPRMPT EQU '>' ;CCP PROMPT INDICATING USER COMMAND ; NUMBASE EQU 'H' ;CHARACTER USED TO SWITCH FROM DEFAULT ; NUMBER BASE ; SECTFLG EQU 'S' ;OPTION CHAR FOR SAVE COMMAND TO SAVE SECTORS ; ; END OF CUSTOMIZATION SECTION ; CR EQU 0DH LF EQU 0AH TAB EQU 09H ; WBOOT EQU BASE+0000H ;CP/M WARM BOOT ADDRESS UDFLAG EQU BASE+0004H ;USER NUM IN HIGH NYBBLE, DISK IN LOW BDOS EQU BASE+0005H ;BDOS FUNCTION CALL ENTRY PT TFCB EQU BASE+005CH ;DEFAULT FCB BUFFER TBUFF EQU BASE+0080H ;DEFAULT DISK I/O BUFFER TPA EQU BASE+0100H ;BASE OF TPA ; ; ; MACROS TO PROVIDE Z80 EXTENSIONS ; MACROS INCLUDE: ; $*MACRO ;FIRST TURN OFF THE EXPANSIONS ; ; JR - JUMP RELATIVE ; JRC - JUMP REbble contains the Disk Number). ; ; Some user programs (such as SYNONYM3) attempt to use the default ; command facility. Under the original CCP, it was necessary to initialize ; the pointer after the reserved space for the command buffer to point to ; the first byte of the command buffer. Under Version 4.x of CCPZ, this is ; no longer the case. The CIBPTR (Command Input Buffer PoinTeR) is located ; to be compatible with such programs (provided they determine the buffer ; length from the byte at MBUFF [CCPLOC + 6]), but under Version 4.x of CCPZ ; this is no longer necessary. CCPZ Version 4.x automatically initializes ; this buffer pointer in all cases. ; ENTRY: JMP CCP ; Process potential default command JMP CCP1 ; Do NOT process potential default command ; ;**** Section 1 **** ; ; BUFFERS ET AL ; ; INPUT COMMAND LINE AND DEFAULT COMMAND ; ; The command line to be executed is stored here. This command line ; is generated in one of three ways: ; ; (1) by the user entering i: IF SUBA ;IF $$$.SUB ON A: DB 1 ;DISK NAME SET TO DEFAULT TO DRIVE A: ENDIF ; IF NOT SUBA ;IF $$$.SUB ON CURRENT DRIVE DB 0 ;DISK NAME SET TO DEFAULT TO CURRENT DRIVE ENDIF ; DB '$$$' ;FILE NAME DB ' ' DB 'SUB' ;FILE TYPE DB 0 ;EXTENT NUMBER DB 0 ;S1 SUBFS2: DS 1 ;S2 SUBFRC: DS 1 ;RECORD COUNT DS 16 ;DISK GROUP MAP SUBFCR: DS 1 ;CURRENT RECORD NUMBER ; ; COMMAND FILE CONTROL BLOCK ; FCBDN: DS 1 ;DISK NAME FCBFN: DS 8 ;FILE NAME FCBFT: DS 3 ;FILE TYPE DS 1 ;EXTENT NUMBER DS 2 ;S1 AND S2 DS 1 ;RECORD COUNT FCBDM: DS 16 ;DISK GROUP MAP FCBCR: DS 1 ;CURRENT RECORD NUMBER ; ; OTHER BUFFERS ; PAGCNT: DB NLINES-2 ;LINES LEFT ON PAGE CHRCNT: DB 0 ;CHAR COUNT FOR TYPE ; ; CCP BUILT-IN COMMAND TABLE ; NCHARS EQU 4 ;NUMBER OF CHARS/COMMAND ; ; CCP COMMAND NAME TABLE ; EACH TABLE ENTRY IS COMPOSED OF THE 4-BYTE COMMAND AND 2-BYTE ADDRESS ; CMDTBL: DB 'DIR ' DW DIR DB 'LIST' DW LIST DB 'TYPE' DW TYPE DB 'LATIVE IF CARRY ; JRNC - JUMP RELATIVE IF NO CARRY ; JRZ - JUMP RELATIVE IF ZERO ; JRNZ - JUMP RELATIVE IF NO ZERO ; DJNZ - DECREMENT B AND JUMP RELATIVE IF NO ZERO ; LDIR - MOV @HL TO @DE FOR COUNT IN BC ; LXXD - LOAD DOUBLE REG DIRECT ; SXXD - STORE DOUBLE REG DIRECT ; ; ; ; @GENDD MACRO USED FOR CHECKING AND GENERATING ; 8-BIT JUMP RELATIVE DISPLACEMENTS ; @GENDD MACRO ?DD ;;USED FOR CHECKING RANGE OF 8-BIT DISPLACEMENTS IF (?DD GT 7FH) AND (?DD LT 0FF80H) DB 100H ;Displacement Range Error on Jump Relative ELSE DB ?DD ENDIF ENDM ; ; ; Z80 MACRO EXTENSIONS ; JR MACRO ?N ;;JUMP RELATIVE DB 18H @GENDD ?N-$-1 ENDM ; JRC MACRO ?N ;;JUMP RELATIVE ON CARRY DB 38H @GENDD ?N-$-1 ENDM ; JRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY DB 30H @GENDD ?N-$-1 ENDM ; JRZ MACRO ?N ;;JUMP RELATIVE ON ZERO DB 28H @GENDD ?N-$-1 ENDM ; JRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO DB 20H @GENDD ?N-$-1 ENDM ; DJNZ MACRO ?N ;;DECREMENT B AND JUMP RELATIVE ON NO ZERO Dt through the BDOS READLN function at ; the du> prompt [user input from keyboard] ; (2) by the SUBMIT File Facility placing it there from a $$$.SUB ; file ; (3) by an external program or user placing the required command ; into this buffer ; ; In all cases, the command line is placed into the buffer starting at ; CIBUFF. This command line is terminated by the last character (NOT Carriage ; Return), and a character count of all characters in the command line ; up to and including the last character is placed into location CBUFF ; (immediately before the command line at CIBUFF). The placed command line ; is then parsed, interpreted, and the indicated command is executed. ; If CLEVEL3 is permitted, a terminating zero is placed after the command ; (otherwise the user program has to place this zero) and the CIBPTR is ; properly initialized (otherwise the user program has to init this ptr). ; If the command is placed by a user program, entering at CCPLOC is enough USER' DW USER DB 'DFU ' DW DFU ; IF NOT RAS ;FOR NON-RAS DB 'GO ' DW GO DB 'ERA ' DW ERA DB 'SAVE' DW SAVE DB 'REN ' DW REN DB 'GET ' DW GET DB 'JUMP' DW JUMP ENDIF ; NCMNDS EQU ($-CMDTBL)/(NCHARS+2) ; ; ;**** Section 2 **** ; CCP STARTING POINTS ; ; START CCP AND DON'T PROCESS DEFAULT COMMAND STORED ; CCP1: XRA A ;SET NO DEFAULT COMMAND STA CBUFF ; ; START CCP AND POSSIBLY PROCESS DEFAULT COMMAND ; ; NOTE ON MODIFICATION BY RGF: BDOS RETURNS 0FFH IN ; ACCUMULATOR WHENEVER IT LOGS IN A DIRECTORY, IF ANY ; FILE NAME CONTAINS A '$' IN IT. THIS IS NOW USED AS ; A CLUE TO DETERMINE WHETHER OR NOT TO DO A SEARCH ; FOR SUBMIT FILE, IN ORDER TO ELIMINATE WASTEFUL SEARCHES. ; CCP: LXI SP,STACK ;RESET STACK PUSH B MOV A,C ;C=USER/DISK NUMBER (SEE LOC 4) RAR ;EXTRACT USER NUMBER RAR RAR RAR ANI 0FH MOV E,A ;SET USER NUMBER CALL SETUSR CALL RESET ;RESET DISK SYSTEM STA RNGSUB ;SAVE SUBMIT CLUE FROM DRIVE A: POP B MOV A,C ;CSTORE HIGH MOV L,A ;STORE LOW PCHL ;EXECUTE CCP ROUTINE ; ; ENTRY POINT FOR RESTARTING CCP AND LOGGING IN DEFAULT DRIVE ; RSTCCP: CALL DLOGIN ;LOG IN DEFAULT DRIVE ; ; ENTRY POINT FOR RESTARTING CCP WITHOUT LOGGING IN DEFAULT DRIVE ; RCCPNL: CALL SCANER ;EXTRACT NEXT TOKEN FROM COMMAND LINE LDA FCBFN ;GET FIRST CHAR OF TOKEN SUI ' ' ;ANY CHAR? LXI H,TEMPDR ORA M JNZ ERROR JR RESTRT ; ; No File Error Message ; PRNNF: CALL PRINTC ;NO FILE MESSAGE DB 'No Fil','e'+80H RET ; ;**** Section 3 **** ; I/O UTILITIES ; ; OUTPUT CHAR IN REG A TO CONSOLE AND DON'T CHANGE BC ; ; ; OUTPUT ; CRLF: MVI A,CR CALL CONOUT MVI A,LF ;FALL THRU TO CONOUT ; CONOUT: PUSH B MVI C,02H OUTPUT: MOV E,A PUSH H CALL BDOS POP H POP B RET ; CONIN: MVI C,01H ;GET CHAR FROM CON: WITH ECHO JR BDOSB ; LCOUT: PUSH PSW ;OUTPUT CHAR TO CON: OR LST: DEP ON PRFLG PRFLG EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS FICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TMPUSR MOV E,A ;PLACE IN E JR SETUSR ;THEN GO SET USER GETUSR: MVI E,0FFH ;GET CURRENT USER NUMBER SETUSR: MVI C,20H ;SET USER NUMBER TO VALUE IN E (GET IF E=FFH) JR BDOSJP ;MORE SPACE SAVING ; ; END OF BDOS FUNCTIONS ; ; ;**** Section 4 **** ; CCP UTILITIES ; ; SET USER/DISK FLAG TO CURRENT USER AND DEFAULT DISK ; SETUD: CALL GETUSR ;GET NUMBER OF CURRENT USER ADD A ;PLACE IT IN HIGH NYBBLE ADD A ADD A ADD A LXI H,TDRIVE ;MASK IN DEFAULT DRIVE NUMBER (LOW NYBBLE) ORA M ;MASK IN STA UDFLAG ;SET USER/DISK NUMBER RET ; ; SET USER/DISK FLAG TO USER 0 AND DEFAULT DISK ; SETU0D: TDRIVE EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TDRIVE STA UDFLAG ;SET USER/DISK NUMBER RET ; ; CONVERT CHAR IN A TO UPPER CASE ; UCASE: CPI 61H ;LOWER-CASE A RC CPI 7BH ;GREATER THAN LOWER-CASE Z? RNC ANI 5FH ;CAPITALIZE RET ; ; INPUT NEXT COMMAND TO CCP ; This rout=USER/DISK NUMBER (SEE LOC 4) ANI 0FH ;EXTRACT DEFAULT DISK DRIVE STA TDRIVE ;SET IT JRZ NOLOG ;SKIP IF 0...ALREADY LOGGED CALL LOGIN ;LOG IN DEFAULT DISK ; IF NOT SUBA ;IF $$$.SUB IS ON CURRENT DRIVE STA RNGSUB ;BDOS '$' CLUE ENDIF ; NOLOG: LXI D,SUBFCB ;CHECK FOR $$$.SUB ON CURRENT DISK RNGSUB EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE RNGSUB FLAG ORA A ;SET FLAGS ON CLUE CMA ;PREPARE FOR COMING 'CMA' CNZ SEAR1 CMA ;0FFH IS RETURNED IF NO $$$.SUB, SO COMPLEMENT STA RNGSUB ;SET FLAG (0=NO $$$.SUB) LDA CBUFF ;EXECUTE DEFAULT COMMAND? ORA A ;0=NO JRNZ RS1 ; ; PROMPT USER AND INPUT COMMAND LINE FROM HIM ; RESTRT: LXI SP,STACK ;RESET STACK ; ; PRINT PROMPT (DU>) ; CALL CRLF ;PRINT PROMPT CALL GETDRV ;CURRENT DRIVE IS PART OF PROMPT ADI 'A' ;CONVERT TO ASCII A-P CALL CONOUT CALL GETUSR ;GET USER NUMBER ; IF SUPRES ;IF SUPPRESSING USR # REPORT FOR USR 0 ORA A JRZ RS000 ENDIF ; CPI 10THE PRINT FLAG ORA A ;0=TYPE JRZ LC1 POP PSW ;GET CHAR ; ; OUTPUT CHAR IN REG A TO LIST DEVICE ; LSTOUT: PUSH B MVI C,05H JR OUTPUT LC1: POP PSW ;GET CHAR PUSH PSW CALL CONOUT ;OUTPUT TO CON: POP PSW CPI LF ;CHECK FOR PAGING JZ PAGER RET ; READF: LXI D,FCBDN ;FALL THRU TO READ READ: MVI C,14H ;FALL THRU TO BDOSB ; ; CALL BDOS AND SAVE BC ; BDOSB: PUSH B CALL BDOS POP B ORA A RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY RET ADR;START WITH ; PRINTC: PUSH PSW ;SAVE FLAGS CALL CRLF ;NEW LINE POP PSW ; PRINT: XTHL ;GET PTR TO STRING PUSH PSW ;SAVE FLAGS CALL PRIN1 ;PRINT STRING POP PSW ;GET FLAGS XTHL ;RESTORE HL AND RET ADR RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY HL ; PRIN1: MOV A,M ;GET NEXT BYTE CALL CONOUT ;PRINT CHAR MOV A,M ;GET NEXT BYTE AGAIN FOR TEST INX H ;PT TO NEXT BYTE ORA A ;SET FLAGS RZ ;DONE IF ZERO RM ;DONE IF MSB SET JR PRIN1 ; ; BDOS FUNCTION ROUTINES ; ; ; RETURN ine determines if a SUBMIT file is being processed ; and extracts the command line from it if so or from the user's console ; REDBUF: LDA RNGSUB ;SUBMIT FILE CURRENTLY IN EXECUTION? ORA A ;0=NO JRZ RB1 ;GET LINE FROM CONSOLE IF NOT LXI D,SUBFCB ;OPEN $$$.SUB PUSH D ;SAVE DE CALL OPEN POP D ;RESTORE DE JRZ RB1 ;ERASE $$$.SUB IF END OF FILE AND GET CMND LDA SUBFRC ;GET VALUE OF LAST RECORD IN FILE DCR A ;PT TO NEXT TO LAST RECORD STA SUBFCR ;SAVE NEW VALUE OF LAST RECORD IN $$$.SUB CALL READ ;DE=SUBFCB JRNZ RB1 ;ABORT $$$.SUB IF ERROR IN READING LAST REC LXI D,CBUFF ;COPY LAST RECORD (NEXT SUBMIT CMND) TO CBUFF LXI H,TBUFF ; FROM TBUFF LXI B,BUFLEN ;NUMBER OF BYTES LDIR LXI H,SUBFS2 ;PT TO S2 OF $$$.SUB FCB MVI M,0 ;SET S2 TO ZERO INX H ;PT TO RECORD COUNT DCR M ;DECREMENT RECORD COUNT OF $$$.SUB LXI D,SUBFCB ;CLOSE $$$.SUB CALL CLOSE JRZ RB1 ;ABORT $$$.SUB IF ERROR MVI A,SPRMPT ;PRINT SUBMIT PROMPT CALL CONOUT LXI H,CIBUFF ;PRINT COMMAN ;USER < 10? JRC RS00 SUI 10 ;SUBTRACT 10 FROM IT PUSH PSW ;SAVE IT MVI A,'1' ;OUTPUT 10'S DIGIT CALL CONOUT POP PSW RS00: ADI '0' ;OUTPUT 1'S DIGIT (CONVERT TO ASCII) CALL CONOUT ; ; READ INPUT LINE FROM USER OR $$$.SUB ; RS000: CALL REDBUF ;INPUT COMMAND LINE FROM USER (OR $$$.SUB) ; ; PROCESS INPUT LINE ; RS1: ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED CALL CNVBUF ;CAPITALIZE COMMAND LINE, PLACE ENDING 0, ; AND SET CIBPTR VALUE ENDIF ; CALL DEFDMA ;SET TBUFF TO DMA ADDRESS CALL GETDRV ;GET DEFAULT DRIVE NUMBER STA TDRIVE ;SET IT CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE CNZ ERROR ;ERROR IF COMMAND NAME CONTAINS A '?' LXI D,RSTCCP ;PUT RETURN ADDRESS OF COMMAND PUSH D ;ON THE STACK LDA TEMPDR ;IS COMMAND OF FORM 'D:COMMAND'? ORA A ;NZ=YES JNZ COM ; IMMEDIATELY CALL CMDSER ;SCAN FOR CCP-RESIDENT COMMAND JNZ COM ;NOT CCP-RESIDENT MOV A,M ;FOUND IT: GET LOW-ORDER PART INX H ;GET HIGH-ORDER PART MOV H,M ;NUMBER OF CURRENT DISK IN A ; GETDRV: MVI C,19H JR BDOSJP ; ; SET 80H AS DMA ADDRESS ; DEFDMA: LXI D,TBUFF ;80H=TBUFF DMASET: MVI C,1AH JR BDOSJP ; RESET: MVI C,0DH BDOSJP: JMP BDOS ; LOGIN: MOV E,A MVI C,0EH JR BDOSJP ;SAVE SOME CODE SPACE ; OPENF: XRA A STA FCBCR LXI D,FCBDN ;FALL THRU TO OPEN ; OPEN: MVI C,0FH ;FALL THRU TO GRBDOS ; GRBDOS: CALL BDOS INR A ;SET ZERO FLAG FOR ERROR RETURN RET ; CLOSE: MVI C,10H JR GRBDOS ; SEARF: LXI D,FCBDN ;SPECIFY FCB SEAR1: MVI C,11H JR GRBDOS ; SEARN: MVI C,12H JR GRBDOS ; ; CHECK FOR SUBMIT FILE IN EXECUTION AND ABORT IT IF SO ; SUBKIL: LXI H,RNGSUB ;CHECK FOR SUBMIT FILE IN EXECUTION MOV A,M ORA A ;0=NO RZ MVI M,0 ;ABORT SUBMIT FILE LXI D,SUBFCB ;DELETE $$$.SUB ; DELETE: MVI C,13H JR BDOSJP ;SAVE MORE SPACE ; WRITE: MVI C,15H JMP BDOSB ; CREATE: MVI C,16H JR GRBDOS ; ; RESET USER NUMBER IF CHANGED ; RESETUSR: TMPUSR EQU $+1 ;POINTER FOR IN-THE-CODE MODID LINE FROM $$$.SUB CALL PRIN1 CALL BREAK ;CHECK FOR ABORT (ANY CHAR) ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED RZ ;IF (NO ABORT), RETURN TO CALLER AND RUN ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED JRZ CNVBUF ;IF (NO ABORT), CAPITALIZE COMMAND ENDIF ; CALL SUBKIL ;KILL $$$.SUB IF ABORT JMP RESTRT ;RESTART CCP ; ; INPUT COMMAND LINE FROM USER CONSOLE ; RB1: CALL SUBKIL ;ERASE $$$.SUB IF PRESENT CALL SETUD ;SET USER AND DISK MVI A,CPRMPT ;PRINT PROMPT CALL CONOUT MVI C,0AH ;READ COMMAND LINE FROM USER LXI D,MBUFF CALL BDOS ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED JMP SETU0D ;SET CURRENT DISK NUMBER IN LOWER PARAMS ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED CALL SETU0D ;SET CURRENT DISK NUMBER IF LOWER PARAMS ; AND FALL THRU TO CNVBUF ENDIF ; ; CAPITALIZE STRING (ENDING IN 0) IN CBUFF AND SET PTR FOR PARSING ; CNVBUF: LXI H,CBUFF ;PT TO USER'S COMMAND MOV B,M MVI B,11 ;11 CHARS MAX ; ; CHECK FOR SUFFIX FOR HEXADECIMAL NUMBER ; NUMS: MOV A,M ;GET CHARS FROM END, SEARCHING FOR SUFFIX DCX H ;BACK UP CPI ' ' ;SPACE? JRNZ NUMS1 ;CHECK FOR SUFFIX DJNZ NUMS ;COUNT DOWN JR NUM0 ;BY DEFAULT, PROCESS NUMS1: CPI NUMBASE ;CHECK AGAINST BASE SWITCH FLAG JRZ HNUM0 ; ; PROCESS DECIMAL NUMBER ; NUM0: LXI H,FCBFN ;PT TO BEGINNING OF TOKEN LXI B,1100H ;C=ACCUMULATED VALUE, B=CHAR COUNT ; (C=0, B=11) NUM1: MOV A,M ;GET CHAR CPI ' ' ;DONE IF JRZ NUM2 INX H ;PT TO NEXT CHAR SUI '0' ;CONVERT TO BINARY (ASCII 0-9 TO BINARY) CPI 10 ;ERROR IF >= 10 JRNC NUMERR MOV D,A ;DIGIT IN D MOV A,C ;NEW VALUE = OLD VALUE * 10 RLC RLC RLC ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD D ;NEW VALUE = OLD VALUE * 10 + DIGIT JRC NUMERR ;CHECK FOR RANGE ERROR MOV C,A ;SET NEW VALUE DJNZ NUM1 ;COUNT DOWN ; ; RETURN FROM NUMBER ; NUM2: MOV A,C ;GET ACCUMULATED  IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TEMPDR ORA A ;0=NO RZ DCR A ;COMPARE IT AGAINST DEFAULT LXI H,TDRIVE CMP M RET ;ABORT IF SAME ; ; EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCBDN; ; FORMAT FCBDN FCB IF TOKEN RESEMBLES FILE NAME AND TYPE (FILENAME.TYP); ; ON INPUT, CIBPTR PTS TO CHAR AT WHICH TO START SCAN; ; ON OUTPUT, CIBPTR PTS TO CHAR AT WHICH TO CONTINUE AND ZERO FLAG IS RESET ; IF '?' IS IN TOKEN ; SCANER: XRA A ;A=0 TO START AT DRIVE SPECIFICATION BYTE SCAN1: LXI H,FCBDN ;POINT TO FCBDN CALL ADDAH ;OFFSET INTO FCB PUSH H PUSH H XRA A ;SET TEMPORARY DRIVE NUMBER TO DEFAULT STA TEMPDR CALL ADVAN ;SKIP TO NON-BLANK OR END OF LINE SDED CIPTR ;SET PTR TO NON-BLANK OR END OF LINE POP H ;GET PTR TO NEXT BYTE IN FCBDN LDAX D ;END OF LINE? ORA A ;0=YES JRZ SCAN2 SBI 'A'-1 ;CONVERT POSSIBLE DRIVE SPEC TO NUMBER MOV B,A ;STORE NUMBER (A:=0, B:=1, ETC) IN B INX D ;PT TO NEXT CHAR LDAX D ;SEE IF ;CHAR COUNT IN B INR B ;ADD 1 IN CASE OF ZERO CB1: INX H ;PT TO 1ST VALID CHAR MOV A,M ;CAPITALIZE COMMAND CHAR CALL UCASE MOV M,A DJNZ CB1 ;CONTINUE TO END OF COMMAND LINE CB2: MVI M,0 ;STORE ENDING LXI H,CIBUFF ;SET COMMAND LINE PTR TO 1ST CHAR SHLD CIBPTR RET ; ; CHECK FOR ANY CHAR FROM USER CONSOLE;RET W/ZERO SET IF NONE ; BREAK: PUSH D ;SAVE DE MVI C,11 ;CSTS CHECK CALL BDOSB CNZ CONIN ;GET INPUT CHAR BRKBK: POP D RET ; ; GET THE REQUESTED USER NUMBER FROM THE COMMAND LINE AND VALIDATE IT. ; USRNUM: CALL NUMBER CPI MAXUSR+1 RC ; ; INVALID COMMAND -- PRINT IT ; ERROR: CALL CRLF ;NEW LINE LHLD CIPTR ;PT TO BEGINNING OF COMMAND LINE ERR2: MOV A,M ;GET CHAR CPI ' '+1 ;SIMPLE '?' IF OR LESS JRC ERR1 PUSH H ;SAVE PTR TO ERROR COMMAND CHAR CALL CONOUT ;PRINT COMMAND CHAR POP H ;GET PTR INX H ;PT TO NEXT JR ERR2 ;CONTINUE ERR1: CALL PRINT ;PRINT '?' DB '?'+80H CALL SUBKIL ;TERMINATE ACTIVE $$$.SUB IFVALUE RET ; ; NUMBER ERROR ROUTINE FOR SPACE CONSERVATION ; NUMERR: JMP ERROR ;USE ERROR ROUTINE - THIS IS RELATIVE PT ; ; EXTRACT HEXADECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A; ALL REGISTERS MAY BE AFFECTED ; HEXNUM: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN HNUM0: LXI H,FCBFN ;PT TO TOKEN FOR CONVERSION LXI D,0 ;DE=ACCUMULATED VALUE MVI B,11 ;B=CHAR COUNT HNUM1: MOV A,M ;GET CHAR CPI ' ' ;DONE? JRZ HNUM3 ;RETURN IF SO CPI 'H' ;DONE IF H SUFFIX JRZ HNUM3 SUI '0' ;CONVERT TO BINARY JRC NUMERR ;RETURN AND DONE IF ERROR CPI 10 ;0-9? JRC HNUM2 SUI 7 ;A-F? CPI 10H ;ERROR? JRNC NUMERR HNUM2: INX H ;PT TO NEXT CHAR MOV C,A ;DIGIT IN C MOV A,D ;GET ACCUMULATED VALUE RLC ;EXCHANGE NYBBLES RLC RLC RLC ANI 0F0H ;MASK OUT LOW NYBBLE MOV D,A MOV A,E ;SWITCH LOW-ORDER NYBBLES RLC RLC RLC RLC MOV E,A ;HIGH NYBBLE OF E=NEW HIGH OF E, ; LOW NYBBLE OF E=NEW LOW OF D ANI 0FH ;GET NEW LOW OF D  IT IS A COLON (:) CPI ':' JRZ SCAN3 ;YES, WE HAVE A DRIVE SPEC DCX D ;NO, BACK UP PTR TO FIRST NON-BLANK CHAR SCAN2: LDA TDRIVE ;SET 1ST BYTE OF FCBDN AS DEFAULT DRIVE MOV M,A JR SCAN4 SCAN3: MOV A,B ;WE HAVE A DRIVE SPEC STA TEMPDR ;SET TEMPORARY DRIVE MOV M,B ;SET 1ST BYTE OF FCBDN AS SPECIFIED DRIVE INX D ;PT TO BYTE AFTER ':' ; ; EXTRACT FILENAME FROM POSSIBLE FILENAME.TYP ; SCAN4: MVI B,8 ;MAX OF 8 CHARS IN FILE NAME SCAN5: CALL SDELM ;DONE IF DELIMITER ENCOUNTERED - FILL JRZ SCAN9 INX H ;PT TO NEXT BYTE IN FCBDN CPI '*' ;IS (DE) A WILD CARD? JRNZ SCAN6 ;CONTINUE IF NOT MVI M,'?' ;PLACE '?' IN FCBDN AND DON'T ADVANCE DE IF SO JR SCAN7 SCAN6: MOV M,A ;STORE FILENAME CHAR IN FCBDN INX D ;PT TO NEXT CHAR IN COMMAND LINE SCAN7: DJNZ SCAN5 ;DECREMENT CHAR COUNT UNTIL 8 ELAPSED SCAN8: CALL SDELM ;8 CHARS OR MORE - SKIP UNTIL DELIMITER JRZ SCAN10 ;ZERO FLAG SET IF DELIMITER FOUND INX D ;PT TO NEXT CHAR IN COMMAND LINE JR SCAN8  ANY JMP RESTRT ;RESTART CCP ; ; CHECK TO SEE IF DE PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET ; SDELM: LDAX D ORA A ;0=DELIMITER RZ CPI ' ' ;ERROR IF < JRC ERROR RZ ;=DELIMITER CPI '=' ;'='=DELIMITER RZ CPI 5FH ;UNDERSCORE=DELIMITER RZ CPI '.' ;'.'=DELIMITER RZ CPI ':' ;':'=DELIMITER RZ CPI ';' ;';'=DELIMITER RZ CPI '<' ;'<'=DELIMITER RZ CPI '>' ;'>'=DELIMITER RET ; ; ADVANCE INPUT PTR TO FIRST NON-BLANK AND FALL THROUGH TO SBLANK ; ADVAN: LDED CIBPTR ; ; SKIP STRING PTED TO BY DE (STRING ENDS IN 0) UNTIL END OF STRING ; OR NON-BLANK ENCOUNTERED (BEGINNING OF TOKEN) ; SBLANK: LDAX D ORA A RZ CPI ' ' RNZ INX D JR SBLANK ; ; ADD A TO HL (HL=HL+A) ; ADDAH: ADD L MOV L,A RNC INR H RET ; ; EXTRACT DECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A;ALL REGISTERS MAY BE AFFECTED ; NUMBER: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN LXI H,FCBFN+10 ;PT TO END OF TOKEN FOR CONVERSION ORA D ;MASK IN HIGH OF D MOV D,A ;NEW HIGH BYTE IN D MOV A,E ANI 0F0H ;MASK OUT LOW OF E ORA C ;MASK IN NEW LOW MOV E,A ;NEW LOW BYTE IN E DJNZ HNUM1 ;COUNT DOWN ; ; RETURN FROM HEXNUM ; HNUM3: XCHG ;RETURNED VALUE IN HL MOV A,L ;LOW-ORDER BYTE IN A RET ; ; PT TO DIRECTORY ENTRY IN TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C ; DIRPTR: LXI H,TBUFF ;PT TO TEMP BUFFER ADD C ;PT TO 1ST BYTE OF DIR ENTRY CALL ADDAH ;PT TO DESIRED BYTE IN DIR ENTRY MOV A,M ;GET DESIRED BYTE RET ; ; CHECK FOR SPECIFIED DRIVE AND LOG IT IN IF NOT DEFAULT ; SLOGIN: XRA A ;SET FCBDN FOR DEFAULT DRIVE STA FCBDN CALL COMLOG ;CHECK DRIVE RZ JR DLOG5 ;DO LOGIN OTHERWISE ; ; CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT ; DLOGIN: CALL COMLOG ;CHECK DRIVE RZ ;ABORT IF SAME LDA TDRIVE ;LOG IN DEFAULT DRIVE ; DLOG5: JMP LOGIN ; ; ROUTINE COMMON TO BOTH LOGIN ROUTINES; ON EXIT, Z SET MEANS ABORT ; COMLOG: TEMPDR EQU $+1 ;POINTER FOR SCAN9: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,' ' ;FILL FILENAME PART WITH DJNZ SCAN9 ; ; EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP ; SCAN10: MVI B,3 ;PREPARE TO EXTRACT TYPE CPI '.' ;IF (DE) DELIMITER IS A '.', WE HAVE A TYPE JRNZ SCAN15 ;FILL FILE TYPE BYTES WITH INX D ;PT TO CHAR IN COMMAND LINE AFTER '.' SCAN11: CALL SDELM ;CHECK FOR DELIMITER JRZ SCAN15 ;FILL REST OF TYPE IF IT IS A DELIMITER INX H ;PT TO NEXT BYTE IN FCBDN CPI '*' ;WILD? JRNZ SCAN12 ;STORE CHAR IF NOT WILD MVI M,'?' ;STORE '?' AND DON'T ADVANCE COMMAND LINE PTR JR SCAN13 SCAN12: MOV M,A ;STORE CHAR IN FCBDN INX D ;PT TO NEXT CHAR IN COMMAND LINE SCAN13: DJNZ SCAN11 ;COUNT DOWN CHARS IN FILE TYPE (3 MAX) SCAN14: CALL SDELM ;SKIP REST OF CHARS AFTER 3-CHAR TYPE TO JRZ SCAN16 ; DELIMITER INX D JR SCAN14 SCAN15: INX H ;FILL IN REST OF TYP WITH MVI M,' ' DJNZ SCAN15 ; ; FILL IN EX, S1, S2, AND RC WITH ZEROES ; SCAN16: MVI B,4 ;4 BYTES SCAN17NE CPI SYSFLG ;SYSTEM FLAG SPECIFIER? JRZ GOTSYS ;GOT SYSTEM SPECIFIER CPI SOFLG ;SYS ONLY? JRNZ DIR2 MVI B,80H ;FLAG SYS ONLY GOTSYS: INX D SDED CIBPTR CPI SOFLG ;SYS ONLY SPEC? JRZ DIR2 ;THEN LEAVE BIT SPEC UNCHAGNED POP PSW ;GET FLAG XRA A ;SET NO SYSTEM BIT EXAMINATION PUSH PSW DIR2: POP PSW ;GET FLAG DIR2A: ;DROP INTO DIRPR TO PRINT DIRECTORY ; THEN RESTART CCP ; ; DIRECTORY PRINT ROUTINE; ON ENTRY, MSB OF A IS 1 (80H) IF SYSTEM FILES EXCL ; DIRPR: MOV D,A ;STORE SYSTEM FLAG IN D MVI E,0 ;SET COLUMN COUNTER TO ZERO PUSH D ;SAVE COLUMN COUNTER (E) AND SYSTEM FLAG (D) MOV A,B ;SYS ONLY SPECIFIER STA SYSTST CALL SEARF ;SEARCH FOR SPECIFIED FILE (FIRST OCCURRANCE) CZ PRNNF ;PRINT NO FILE MSG;REG A NOT CHANGED ; ; ENTRY SELECTION LOOP; ON ENTRY, A=OFFSET FROM SEARF OR SEARN ; DIR3: JRZ DIR11 ;DONE IF ZERO FLAG SET DCR A ;ADJUST TO RETURNED VALUE RRC ;CONVERT NUMBER TO OFFSET INTO TBUFF RRC RRC ANI 60H MOV C,A ;OFFS SPECIFICATION CPI 11 ;ALL WILD (ALL FILES = 11 '?')? JRNZ ERA1 ;IF NOT, THEN DO ERASES CALL PRINTC DB 'All','?'+80H CALL CONIN ;GET REPLY CALL UCASE ;CAPITALIZE CPI 'Y' ;YES? JNZ RESTRT ;RESTART CCP IF NOT CALL CRLF ;NEW LINE ERA1: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY XRA A ;PRINT ALL FILES (EXAMINE SYSTEM BIT) MOV B,A ;NO SYS-ONLY OPT TO DIRPR CALL DIRPR ;PRINT DIRECTORY OF ERASED FILES LXI D,FCBDN ;DELETE FILE SPECIFIED CALL DELETE RET ;REENTER CCP ; ENDIF ;RAS ; ;Section 5C ;Command: LIST ;Function: Print out specified file on the LST: Device ;Forms: ; LIST Print file (NO Paging) ; LIST: MVI A,0FFH ;TURN ON PRINTER FLAG JR TYPE0 ; ;Section 5D ;Command: TYPE ;Function: Print out specified file on the CON: Device ;Forms: ; TYPE Print file ; TYPE P Print file with paging flag ; TYPE: XRA A ;TURN OFF PRINTER FLAG ; ; ENTRY POINT FOR CCP LIST FUNCTION (LIST) ; TYPE0: STA PRFLG ;SET FLAG CALL SCANER ;: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,0 DJNZ SCAN17 ; ; SCAN COMPLETE -- DE PTS TO DELIMITER BYTE AFTER TOKEN ; SDED CIBPTR ; ; SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN FILENAME.TYP ; POP H ;GET PTR TO FCBDN IN HL LXI B,11 ;SCAN FOR '?' IN FILENAME.TYP (C=11 BYTES) SCAN18: INX H ;PT TO NEXT BYTE IN FCBDN MOV A,M CPI '?' JRNZ SCAN19 INR B ;B<>0 TO INDICATE '?' ENCOUNTERED SCAN19: DCR C ;COUNT DOWN JRNZ SCAN18 MOV A,B ;A=B=NUMBER OF '?' IN FILENAME.TYP ORA A ;SET ZERO FLAG TO INDICATE ANY '?' RET ; ; CMDTBL (COMMAND TABLE) SCANNER ; ON RETURN, HL PTS TO ADDRESS OF COMMAND IF CCP-RESIDENT ; ON RETURN, ZERO FLAG SET MEANS CCP-RESIDENT COMMAND ; CMDSER: LXI H,CMDTBL ;PT TO COMMAND TABLE MVI C,NCMNDS ;SET COMMAND COUNTER CMS1: LXI D,FCBFN ;PT TO STORED COMMAND NAME MVI B,NCHARS ;NUMBER OF CHARS/COMMAND (8 MAX) CMS2: LDAX D ;COMPARE AGAINST TABLE ENTRY CMP M JRNZ CMS3 ;NO MATCH INX D ;PT TO NEXT CHAR INX H DJNZ CMS2 ;COUNT DOWET INTO TBUFF IN C (C=OFFSET TO ENTRY) MVI A,10 ;ADD 10 TO PT TO SYSTEM FILE ATTRIBUTE BIT CALL DIRPTR POP D ;GET SYSTEM BIT MASK FROM D PUSH D ANA D ;MASK FOR SYSTEM BIT SYSTST EQU $+1 ;POINTER TO IN-THE-CODE BUFFER SYSTST CPI 0 JRNZ DIR10 POP D ;GET ENTRY COUNT (= COUNTER) MOV A,E ;ADD 1 TO IT INR E PUSH D ;SAVE IT ; IF TWOCOL ANI 01H ;OUTPUT IF 2 ENTRIES PRINTED IN LINE ENDIF ; IF NOT TWOCOL ANI 03H ;OUTPUT IF 4 ENTRIES PRINTED IN LINE ENDIF ; PUSH PSW JRNZ DIR4 CALL CRLF ;NEW LINE JR DIR5 DIR4: CALL PRINT ; IF WIDE DB ' ' ;2 SPACES DB FENCE ;THEN FENCE CHAR DB ' ',' '+80H ;THEN 2 MORE SPACES ENDIF ; IF NOT WIDE DB ' ' ;SPACE DB FENCE ;THEN FENCE CHAR DB ' '+80H ;THEN SPACE ENDIF ; DIR5: MVI B,01H ;PT TO 1ST BYTE OF FILE NAME DIR6: MOV A,B ;A=OFFSET CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE NAME ANI 7FH ;MASK OUT MSB CPI ' ' ;NO FILE NAME? JRNZ DIR8 ;PRINT FILE NAME IF PRESENTEXTRACT FILENAME.TYP TOKEN JNZ ERROR ;ERROR IF ANY QUESTION MARKS CALL ADVAN ;GET PGDFLG IF IT'S THERE STA PGFLG ;SAVE IT AS A FLAG JRZ NOSLAS ;JUMP IF INPUT ENDED INX D ;PUT NEW BUF POINTER XCHG SHLD CIBPTR NOSLAS: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY CALL OPENF ;OPEN SELECTED FILE JZ TYPE4 ;ABORT IF ERROR CALL CRLF ;NEW LINE MVI A,NLINES-1 ;SET LINE COUNT STA PAGCNT LXI H,CHRCNT ;SET CHAR POSITION/COUNT MVI M,0FFH ;EMPTY LINE MVI B,0 ;SET TAB CHAR COUNTER TYPE1: LXI H,CHRCNT ;PT TO CHAR POSITION/COUNT MOV A,M ;END OF BUFFER? CPI 80H JRC TYPE2 PUSH H ;READ NEXT BLOCK CALL READF POP H JRNZ TYPE3 ;ERROR? XRA A ;RESET COUNT MOV M,A TYPE2: INR M ;INCREMENT CHAR COUNT LXI H,TBUFF ;PT TO BUFFER CALL ADDAH ;COMPUTE ADDRESS OF NEXT CHAR FROM OFFSET MOV A,M ;GET NEXT CHAR ANI 7FH ;MASK OUT MSB CPI 1AH ;END OF FILE (^Z)? RZ ;RESTART CCP IF SO ; ; OUTPUT CHAR TO CON: OR LST: DEVICE WITH TABULATION ; CPI CR ;RESET TAB CN LDAX D ;NEXT CHAR IN INPUT COMMAND MUST BE CPI ' ' JRNZ CMS4 RET ;COMMAND IS CCP-RESIDENT (ZERO FLAG SET) CMS3: INX H ;SKIP TO NEXT COMMAND TABLE ENTRY DJNZ CMS3 CMS4: INX H ;SKIP ADDRESS INX H DCR C ;DECREMENT TABLE ENTRY NUMBER JRNZ CMS1 INR C ;CLEAR ZERO FLAG RET ;COMMAND IS DISK-RESIDENT (ZERO FLAG CLEAR) ; ;**** Section 5 **** ; CCP-Resident Commands ; ; ;Section 5A ;Command: DIR ;Function: To display a directory of the files on disk ;Forms: ; DIR Displays the DIR files ; DIR S Displays the SYS files ; DIR A Display both DIR and SYS files ; DIR: MVI A,80H ;SET SYSTEM BIT EXAMINATION PUSH PSW CALL SCANER ;EXTRACT POSSIBLE D:FILENAME.TYP TOKEN CALL SLOGIN ;LOG IN DRIVE IF NECESSARY LXI H,FCBFN ;MAKE FCB WILD (ALL '?') IF NO FILENAME.TYP MOV A,M ;GET FIRST CHAR OF FILENAME.TYP CPI ' ' ;IF , ALL WILD CZ FILLQ CALL ADVAN ;LOOK AT NEXT INPUT CHAR MVI B,0 ;SYS TOKEN DEFAULT JRZ DIR2 ;JUMP; THERE ISN'T O POP PSW PUSH PSW CPI 03H JRNZ DIR7 MVI A,09H ;PT TO 1ST BYTE OF FILE TYPE CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE TYPE ANI 7FH ;MASK OUT MSB CPI ' ' ;NO FILE TYPE? JRZ DIR9 ;CONTINUE IF SO DIR7: MVI A,' ' ;OUTPUT DIR8: CALL CONOUT ;PRINT CHAR INR B ;INCR CHAR COUNT MOV A,B CPI 12 ;END OF FILENAME.TYP? JRNC DIR9 ;CONTINUE IF SO CPI 09H ;END IF FILENAME ONLY? JRNZ DIR6 ;PRINT TYP IF SO MVI A,'.' ;PRINT DOT BETWEEN FILE NAME AND TYPE CALL CONOUT JR DIR6 DIR9: POP PSW DIR10: CALL BREAK ;CHECK FOR ABORT JRNZ DIR11 CALL SEARN ;SEARCH FOR NEXT FILE JR DIR3 ;CONTINUE DIR11: POP D ;RESTORE STACK RET ; ; FILL FCB @HL WITH '?' ; FILLQ: MVI B,11 ;NUMBER OF CHARS IN FN & FT FQLP: MVI M,'?' ;STORE '?' INX H DJNZ FQLP RET ; ;Section 5B ;Command: ERA ;Function: Erase files ;Forms: ; ERA Erase Specified files and print their names ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; ERA: CALL SCANER ;PARSE FILEOUNT? JRZ TABRST CPI LF ;RESET TAB COUNT? JRZ TABRST CPI TAB ;TAB? JRZ LTAB CALL LCOUT ;OUTPUT CHAR INR B ;INCREMENT CHAR COUNT JR TYPE2L TABRST: CALL LCOUT ;OUTPUT OR MVI B,0 ;RESET TAB COUNTER JR TYPE2L LTAB: MVI A,' ' ; CALL LCOUT INR B ;INCR POS COUNT MOV A,B ANI 7 JRNZ LTAB ; ; CONTINUE PROCESSING ; TYPE2L: CALL BREAK ;CHECK FOR ABORT JRZ TYPE1 ;CONTINUE IF NO CHAR CPI 'C'-'@' ;^C? RZ ;RESTART IF SO JR TYPE1 TYPE3: DCR A ;NO ERROR? RZ ;RESTART CCP TYPE4: JMP ERRLOG ; ; PAGING ROUTINES ; PAGER COUNTS DOWN LINES AND PAUSES FOR INPUT (DIRECT) IF COUNT EXPIRES ; PAGSET SETS LINES/PAGE COUNT ; PAGER: PUSH H LXI H,PAGCNT ;COUNT DOWN DCR M JRNZ PGBAK ;JUMP IF NOT END OF PAGE MVI M,NLINES-2 ;REFILL COUNTER ; PGFLG EQU $+1 ;POINTER TO IN-THE-CODE BUFFER PGFLG MVI A,0 ;0 MAY BE CHANGED BY PGFLG EQUATE CPI PGDFLG ;PAGE DEFAULT OVERRIDE OPTION WANTED? ; IF PGDFLT ;IF PAGING IS DEFAULT JRZ PGBAKET DMA TO 0080 RET ;RESTART CCP ; ENDIF ;RAS ; ;Section 5F ;Command: REN ;Function: To change the name of an existing file ;Forms: ; REN = Perform function ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; REN: CALL SCANER ;EXTRACT FILE NAME JNZ ERROR ;ERROR IF ANY '?' IN IT LDA TEMPDR ;SAVE CURRENT DEFAULT DISK PUSH PSW CALL SLOGIN ;LOG IN SELECTED DISK CALL SEARF ;LOOK FOR SPECIFIED FILE JRZ REN0 ;CONTINUE IF NOT FOUND CALL PRINTC DB 'File Exist','s'+80H POP PSW ;CLEAR STACK RET ;RESTART CCP REN0: LXI H,FCBDN ;SAVE NEW FILE NAME LXI D,FCBDM LXI B,16 ;16 BYTES LDIR CALL ADVAN ;ADVANCE CIBPTR CPI '=' ;'=' OK JRNZ REN4 REN1: XCHG ;PT TO CHAR AFTER '=' IN HL INX H SHLD CIBPTR ;SAVE PTR TO OLD FILE NAME CALL SCANER ;EXTRACT FILENAME.TYP TOKEN JRNZ REN4 ;ERROR IF ANY '?' POP PSW ;GET OLD DEFAULT DRIVE MOV B,A ;SAVE IT LXI H,TEMPDR ;COMPARE IT AGAINST CURRENT DEFAULT DRIVE MOV A,M ;MATCH? ORA A JRZ R DCR A ;ADJUST FOR LOG IN STA TDRIVE ;SET DEFAULT DRIVE CALL SETU0D ;SET DRIVE WITH USER 0 CALL LOGIN ;LOG IN DRIVE JMP RCCPNL ;RESTART CCP COM1: LDA FCBFT ;FILE TYPE MUST BE BLANK CPI ' ' JNZ ERROR LXI H,COMMSG ;PLACE DEFAULT FILE TYPE (COM) INTO FCB LXI D,FCBFT ;COPY INTO FILE TYPE LXI B,3 ;3 BYTES LDIR LXI H,TPA ;SET EXECUTION/LOAD ADDRESS PUSH H ;SAVE FOR EXECUTION CALL MEMLOAD ;LOAD MEMORY WITH FILE SPECIFIED IN CMD LINE ;(NO RETURN IF ERROR OR TOO BIG) POP H ;GET EXECUTION ADDRESS ; ; CALLPROG IS THE ENTRY POINT FOR THE EXECUTION OF THE LOADED ; PROGRAM;ON ENTRY TO THIS ROUTINE, HL MUST CONTAIN THE EXECUTION ; ADDRESS OF THE PROGRAM (SUBROUTINE) TO EXECUTE ; CALLPROG: SHLD EXECADR ;PERFORM IN-LINE CODE MODIFICATION CALL DLOGIN ;LOG IN DEFAULT DRIVE CALL SCANER ;SEARCH COMMAND LINE FOR NEXT TOKEN LXI H,TEMPDR ;SAVE PTR TO DRIVE SPEC PUSH H MOV A,M ;SET DRIVE SPEC STA FCBDN MVI A,10H ;OFFSET FOR 2ND FILE SPEC CALL SCAN1 ;S ; PGDFLG MEANS NO PAGING, PLEASE ELSE ;IF PAGING NOT DEFAULT JRNZ PGBAK ; PGDFLG MEANS PLEASE PAGINATE ENDIF ; CALL CONIN ;GET CHAR TO CONTINUE CPI 'C'-'@' ;^C JZ RSTCCP ;RESTART CCP PGBAK: POP H ;RESTORE HL RET ; ;Section 5E ;Command: SAVE ;Function: To save the contents of the TPA onto disk as a file ;Forms: ; SAVE ; Save specified number of pages (start at 100H) ; from TPA into specified file; is in DEC ; SAVE S ; Like SAVE above, but numeric argument specifies ; number of sectors rather than pages ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; SAVE: CALL NUMBER ;EXTRACT NUMBER FROM COMMAND LINE PUSH PSW ;SAVE IT CALL SCANER ;EXTRACT FILENAME.TYPE JNZ ERROR ;MUST BE NO '?' IN IT CALL SLOGIN ;LOG IN SELECTED DISK LXI D,FCBDN ;DELETE FILE IN CASE IT ALREADY EXISTS PUSH D CALL DELETE POP D CALL CREATE ;MAKE NEW FILE JRZ SAVE3 ;ERROR? XRA A ;SET RECEN2 CMP B ;CHECK FOR DRIVE ERROR MOV M,B JRNZ REN4 REN2: MOV M,B XRA A STA FCBDN ;SET DEFAULT DRIVE LXI D,FCBDN ;RENAME FILE MVI C,17H ;BDOS RENAME FCT CALL GRBDOS RNZ REN3: CALL PRNNF ;PRINT NO FILE MSG REN4: JMP ERRLOG ; ENDIF ;RAS ; ;Section 5G ;Command: USER ;Function: Change current USER number ;Forms: ; USER Select specified user number; is in DEC ; USER: CALL USRNUM ;EXTRACT USER NUMBER FROM COMMAND LINE MOV E,A ;PLACE USER NUMBER IN E CALL SETUSR ;SET SPECIFIED USER RSTJMP: JMP RCCPNL ;RESTART CCP ; ;Section 5H ;Command: DFU ;Function: Set the Default User Number for the command/file scanner ; (MEMLOAD) ;Forms: ; DFU Select Default User Number; is in DEC ; DFU: CALL USRNUM ;GET USER NUMBER STA DFUSR ;PUT IT AWAY JR RSTJMP ;RESTART CCP (NO DEFAULT LOGIN) ; ;Section 5I ;Command: JUMP ;Function: To Call the program (subroutine) at the specified address ; without loading from disk ;FormCAN FOR IT AND LOAD IT INTO FCBDN+16 POP H ;SET UP DRIVE SPECS MOV A,M STA FCBDM XRA A STA FCBCR LXI D,TFCB ;COPY TO DEFAULT FCB LXI H,FCBDN ;FROM FCBDN LXI B,33 ;SET UP DEFAULT FCB LDIR LXI H,CIBUFF COM4: MOV A,M ;SKIP TO END OF 2ND FILE NAME ORA A ;END OF LINE? JRZ COM5 CPI ' ' ;END OF TOKEN? JRZ COM5 INX H JR COM4 ; ; LOAD COMMAND LINE INTO TBUFF ; COM5: MVI B,0 ;SET CHAR COUNT LXI D,TBUFF+1 ;PT TO CHAR POS COM6: MOV A,M ;COPY COMMAND LINE TO TBUFF STAX D ORA A ;DONE IF ZERO JRZ COM7 INR B ;INCR CHAR COUNT INX H ;PT TO NEXT INX D JR COM6 ; ; RUN LOADED TRANSIENT PROGRAM ; COM7: MOV A,B ;SAVE CHAR COUNT STA TBUFF CALL CRLF ;NEW LINE CALL DEFDMA ;SET DMA TO 0080 CALL SETUD ;SET USER/DISK ; ; EXECUTION (CALL) OF PROGRAM (SUBROUTINE) OCCURS HERE ; EXECADR EQU $+1 ;CHANGE ADDRESS FOR IN-LINE CODE MODIFICATION CALL TPA ;CALL TRANSIENT CALL DEFDMA ;SET DMA TO 0080, IN CASE ;PROG CHANGED IT ON US CALL SETU0DORD COUNT FIELD OF NEW FILE'S FCB STA FCBCR POP PSW ;GET PAGE COUNT MOV L,A ;HL=PAGE COUNT MVI H,0 PUSH H CALL ADVAN ;LOOK FOR 'S' FOR SECTOR OPTION INX D ;PT TO AFTER 'S' TOKEN POP H CPI SECTFLG JRZ SAVE0 DCX D ;NO 'S' TOKEN, SO BACK UP DAD H ;DOUBLE IT FOR HL=SECTOR (128 BYTES) COUNT SAVE0: SDED CIBPTR ;SET PTR TO BAD TOKEN OR AFTER GOOD TOKEN LXI D,TPA ;PT TO START OF SAVE AREA (TPA) SAVE1: MOV A,H ;DONE WITH SAVE? ORA L ;HL=0 IF SO JRZ SAVE2 DCX H ;COUNT DOWN ON SECTORS PUSH H ;SAVE PTR TO BLOCK TO SAVE LXI H,128 ;128 BYTES PER SECTOR DAD D ;PT TO NEXT SECTOR PUSH H ;SAVE ON STACK CALL DMASET ;SET DMA ADDRESS FOR WRITE (ADDRESS IN DE) LXI D,FCBDN ;WRITE SECTOR CALL WRITE POP D ;GET PTR TO NEXT SECTOR IN DE POP H ;GET SECTOR COUNT JRNZ SAVE3 ;WRITE ERROR? JR SAVE1 ;CONTINUE SAVE2: LXI D,FCBDN ;CLOSE SAVED FILE CALL CLOSE INR A ;ERROR? JRNZ SAVE4 SAVE3: CALL PRNLE ;PRINT 'NO SPACE' ERROR SAVE4: CALL DEFDMA ;Ss: ; JUMP Call at ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; JUMP: CALL HEXNUM ;GET LOAD ADDRESS IN HL JR CALLPROG ;PERFORM CALL ; ENDIF ;RAS ; ;Section 5J ;Command: GO ;Function: To Call the program in the TPA without loading ; loading from disk. Same as JUMP 100H, but much ; more convenient, especially when used with ; parameters for programs like STAT. Also can be ; allowed on remote-access systems with no problems. ; ;Form: ; GO ; IF NOT RAS ;ONLY IF RAS ; GO: LXI H,TPA ;Always to TPA JR CALLPROG ;Perform call ; ENDIF ;END OF GO FOR RAS ; ;Section 5K ;Command: COM file processing ;Function: To load the specified COM file from disk and execute it ;Forms: ; ; COM: LDA FCBFN ;ANY COMMAND? CPI ' ' ;' ' MEANS COMMAND WAS 'D:' TO SWITCH JRNZ COM1 ;NOT , SO MUST BE TRANSIENT OR ERROR LDA TEMPDR ;LOOK FOR DRIVE SPEC ORA A ;IF ZERO, JUST BLANK JZ RCCPNL ;SET USER 0/DISK CALL LOGIN ;LOGIN DISK JMP RESTRT ;RESTART CCP ; ;Section 5L ;Command: GET ;Function: To load the specified file from disk to the specified address ;Forms: ; GET Load the specified file at the specified page; ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; GET: CALL HEXNUM ;GET LOAD ADDRESS IN HL PUSH H ;SAVE ADDRESS CALL SCANER ;GET FILE NAME POP H ;RESTORE ADDRESS JRNZ ERRJMP ;MUST BE UNAMBIGUOUS ; ; FALL THRU TO MEMLOAD ; ENDIF ;RAS ; ; LOAD MEMORY WITH THE FILE WHOSE NAME IS SPECIFIED IN THE COMMAND LINE ; ON INPUT, HL CONTAINS STARTING ADDRESS TO LOAD ; ; EXIT BACK TO CALLER IF NO ERROR. IF COM FILE TOO BIG OR MEMORY ; FULL, EXIT TO MLERR. ; MEMLOAD: SHLD LOADADR ;SET LOAD ADDRESS CALL GETUSR ;GET CURRENT USER NUMBER STA TMPUSR ;SAVE IT FOR LATER STA TSELUSR ;TEMP USER TO SELECT ; ; MLA is a reentry point for a non-standard CP/M Modification ; This is the return point for when the .COM (or GET) file is not found the ; first time, Drive A: is selected for a second attempt. ; MLA: CALL SLOGIN ;LOG IN SPECIFIED DRIVE IF ANY CALL OPENF ;OPEN COMMAND.COM FILE JRNZ MLA1 ;FILE FOUND - LOAD IT ; ; ERROR ROUTINE TO SELECT USER 0 IF ALL ELSE FAILS ; DFUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE MVI A,DEFUSR ;GET DEFAULT USER TSELUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE CPI DEFUSR ;SAME? JRZ MLA0 ;JUMP IF SO STA TSELUSR ;ELSE PUT DOWN NEW ONE MOV E,A CALL SETUSR ;GO SET NEW USER NUMBER JR MLA ;AND TRY AGAIN ; ; ERROR ROUTINE TO SELECT DRIVE A: IF DEFAULT WAS ORIGINALLY SELECTED ; MLA0: LXI H,TEMPDR ;GET DRIVE FROM CURRENT COMMAND XRA A ;A=0 ORA M JRNZ MLERR ;ERROR IF ALREADY DISK A: MVI M,1 ;SELECT DRIVE A: JR MLA ; ; FILE FOUND -- PROCEED WITH LOAD ; MLA1: LOADADR EQU $+1 ;MEMORY LOAD ADDRESS (IN-LINE CODE MOD) LXI H,TPA ;SET START ADDRESS OF MEMORY LOAD ML2: MVI A,ENTRY/256-1 ;GET HIGH-ORDER ADR OF JUST BELOW CCP CMP H ;ARE WE GOING TO OVERWRITE THE CCP? JRC PRNLE ;ERROR IF SO PUSH H ;SAVE ADDRESS OF NEXT SECTOR XCHG ;... IN DE CALL DMASET ;SET DMA ADDRESS FOR LOAD LXI D,FCBDN ;READ NEXT SECTOR CALL READ POP H ;GET ADDRESS OF NEXT SECTOR JRNZ ML3 ;READ ERROR OR EOF? LXI D,128 ;MOVE 128 BYTES PER SECTOR DAD D ;PT TO NEXT SECTOR IN HL JR ML2 ; ML3: DCR A ;LOAD COMPLETE JZ RESETUSR ;IF ZERO, OK, GO RESET CORRECT USER ;# ON WAY OUT, ELSE FALL THROUGH TO PRNLE ; ; LOAD ERROR ; PRNLE: CALL PRINTC DB 'Ful','l'+80H ; ; TRANSIENT LOAD ERROR ; MLERR: CALL RESETUSR ;RESET CURRENT USER NUMBER ; RESET MUST BE DONE BEFORE LOGIN ERRLOG: CALL DLOGIN ;LOG IN DEFAULT DISK ERRJMP: JMP ERROR ; END 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0A!"P0"R0"2:0N£: 0$­  :[0-ʄ+ʄ* :[0!_0Mʜ!f0P p  !  :O0t!":O0*V0}|J ͂™*|Č:O07iH *V0"q*V0"E .“ ͂“**͵“"q*K0"X0!0NA#~' Vp"K0*K0N"X0!0q#*w t:0!x tí *V0*R0:_0e"V02*M0J; !:J :0: 0Ϳ=%E ">2:0:: 020 ͳ/,ͯͳ:0:: 0Ϳ=,͌:Jͯ=*X0#![0~_Ow2/̈́:2T/-"."$/2/>2.N:.ʐ!/6+͕%>20:.ʆ:.0Ù209$<!5*}z*V0":0Q: 0:QN X!^#fk0|7Vq6z 2  :0a:0=aG! 0[F# Kn*I0T E ͻ. ,3í bE *R0"R0"P0í E E D ͻ. ,ʖí b:/ ­ E :/ "> 2/:Ć:0 : 0 ͊ ͙! ": x= y0( 2!0^4! 0q :0n: 0,; n*I0E |}$^ doQ dc 8On Zy0 Q E 0:0¥ : 0,ʪ >C͘%:0 : 0 N; :0 : 0 N!N !N͌ {ozg:.͆2Z0!O0~4D!"*|"V0*"""b!/6 !/͒%:^0g>2.͡%͉*K0*T0 *M0*T0 \ e!/ʦw#Íh Use factor !/͒%*"P0Þ%z{*P0"R0*"V0 !":O0z*R0t*R0͵tG:O0xě%:/ *R0e:xR*P0#"P0E D 0::!^4!/wBB*R0!6zR{R4A_A?ɯ2.2*T0"V0!.8w# œ*V0*K0{z|*b0͵+"X0=$**X0#v!.h*V0".#"X0$:d0:0! 0~?#h: 0y!.".^#V"V0}S##~2.*.^#V#"."V0*V0}<##~<2.G*V0##"X0:.> M!.~w>w> M:.P!5^!/~ !~620͕%2.++{ z ~ ++ ! +"X0:Z02Z0͐͹+'2Z0]:[0P͐͹]D ]͐20_l>èEw>è:[0'ˆ2[0>è ¦:.ʙ>+2/͕%!/6 >20>20:[02͐:0 :Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04>20![0:0#6ʫv«¹6ʫP«:[0OAQF>MHW>22[0r:Bd>kD> o!052!"0!0N#~#A҉0Ë7O!~*0!ʮҨ)ß "0 }:[0 '«͐'ë:[0 :[0,;%:[0 !:[0; ,202͐ 4>20:[02͐:0L:0::0q:[0'͐:[0'%204:[0'>20^œ͐:[0  <­!~4%>!~5%:%>20>V>O>I>B͘%!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûf/6+:.?*$/*."$/?"$/:.D*.^#V{r+s *.^#V k:.xr+s!06#wr> 209!e/~6![0~6".~,#!0w9 ͼè9*.~¸6 *: 0,Č2f/*.s#r2[02e/*.#"X0$< ̈́*$/"M00:T/2:/2[0 N>20*.".2[0N*R0E "R0e"R0!/w >=*R0*I0"R0"R0í E :/ ™}>ҙv í }zí :O0ʠ*V0*͵ʗtå"å>2:O0:0:O0!!4:0: 0,ʰ> :O0: 2\0:0: 0 !͌*X0"`0>2Z0*X0":0C: 0,!,:\0~:O0~:0=~ ~*"X0 !':[0',x“!Z04,,!Z05,:\0!":]0ʽ!**V0":O0*X0~ Č*X06 '>#*I0!"í :0 :Z0 !0N*K0:O0w"b0+"X0ys 'a' ͊ >ʙ͆ 222:0: 0 ¹!͆ã:0:0£! :0: 0:£:|R}R> M!.~w:./=*M!.4*V0^#V"V0Õ!.5‡:20͕%!^4!/w>R͘%>V͘%>DÕ>PÕ>LÕ>OÕ>BÕ>SÕ>N͘%*͵6".~ 6-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55N!! N#fiooo&)^#fk9BIO[ov ͌z{>ɯo>g͌"!6ů{_zW5>)D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌roz{͉͌͌}|͉͌Þ͌Þ͌ë͉͌!!o#Ã͌zg{o͌zg{o͌zg{oolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :0:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: >!Nw#w#W!"V0!.w#w#l2N!.~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +aG=#w#wY*M0!0n& {ozg"V0!K0{#z"M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBOL TABLE OVERFLOW G*V0##~w*V0##~=*V0_###1 s#r1 ^#V1 ##"X0P wP ~O!0~z 6~=ͼ !0N#~ͼ „ Ͳ O2Nyv U !~5£:Ć ͍e !4̀ã£!~5£G!~Ҁ4_!p!~ʆ5^!~>ã >2\0:0& *K0"+"X0:0 >''!:0& : 0,& :0   !0N#~'  > ''*K0"V0:\0P ͌:\0 E }*K0"+"X0''*K0"V0> ̈́:2T/:[0 k 2/-*M0"$/*X0!{#zڗ ~+"X0*M0+"M0ww #"K0*M0".:\0ʵ N]T s#r+*V0*{_zW".:\02.*  *I0:/ ­ ͪ%í ̈́:O0ĭ%í  :.z :0z *K0+"X0!2<20*#"" : 00Ā!??" 09"K0+"X0$< ʭ :0z : 0, ͌í *} :]0 :O0 :0 ͤ%:e0ĭ%:0± : 0 ± ̈́ͧ%N͌í ͒í :0: 0 !;* _! ^#fk+ 4 @ F Z c r  x ͓ ͍ x n 8S Zy0 ͍ n G͓ c n ͓ ͇ ͇ n (Zy ͍ c n n Zy0 n ͇ ͻí 'd ! ^#V#*0}o|g 2 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 ypP͘% >U̘%>: 2 3>E͘%m:.O*.~H:.=!4>͕%0:/#". ͆%2G:0x:0xa{_ ʎ ʎ:0xҎ_<20!/w:e/b:e/Hɯ2f/2d/2e/:0:e/ !2f/g/~#b͐!f/~4!g/_:e/w2e/ɯ<*V0"36*"V0ɯ2!4$!f/6".!f/~<5!d/^4!g/~m:.:e/QG~mʆ^s͞^‚:e/&‚!f/4#w~&ʥGʸ2e/xm͞:e/&ʜ:0͞&ʂ&ʂ͞!e/~&>62/-!.6*M0"$/B".2f/*"V0͞2f/2e/2[020> 2͕%>20ɯ202!0~@+6^4#:[0w~$B_Bw:[00 E:[0A:[0?t@tAɷ_E ~2[0:Z0ʵ:\0¯:O0µ:[0':[0 !20:[0 W;>>20:Z0D:\0:O0D͐;G*`0*X0&À# $b${$*!:!X!!M"p"""""4#\#j# ()*+,-/ABCDEHLMDBDIDSDWEIEQGEGTIFINLELTNEORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASEGCALLCSEGDSEGELSEENDMHIGHIRPCLDAXLHLDNAMEPAGEPCHLPUSHREPTSHLDSPHLSTAXXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLEINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M x#_BH!™# 0#³# £#{ڽ#KÅ#CÅ#<: 0 JCR:0 $# $! 06 p#! 0$# # ɯ<:0O=_^$!"F!!V#fjQ̀#G$2!!!^#Vo&)O~#F##xGyѯ:ͯ*!%^Ww*%{.|.}..{].!%~#.T..> ͯ*> ͯ* *!%~(*# +:%> (*2%*b0}!,~ 7+(*#*+*> (**b0~N+(*#B+> (*> (*> (*}2%!%+O(*:/ :O0:%y*:%!O0¥+:e0!]0+~ ,:/ ,!/~ +:f0 ,:/++:_0 ,+:/# ,:/ ,:_0=+!/~ +!0s!%~!%+4:0!/,G~i+#x=,> i+> i+20!/>x6 #=),G!/~ pͺ'*&}O,>(*?,`&%͏':^0+;,!&6S#6Y#6M#w!&w:%2%!"&ͺ'+2%`&%͢'ͧ';,:%,:%-.*P0"%-.*>&},>ͯ*ö,:%,l&&͏'!-x&CP/M Macro assembler v3.1 Pa0000000000000000000@@@@@@@@@@@@@@@@AA AAQQQ"Q'Q,Q1Q6a *> *\ ?W)$W)w#•&!\60 ڸ&>GO#w º&>O # &6 &6L#6I#6B#w2|r&\|'>2]0!"%![0~2%wG&!,x&>82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~=' K':%A='>:='K'>.='K'>-='x&!-U'!-x&!-U':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ W)!%w#w#w#w#w#w#>2^02_0:m$(!~#$3(~(# :(%Aʰ(Pʰ(Sʰ(Hʰ(Lʰ(*{(+{(-½(^0~Sʪ(Mʪ(e0Lʪ(d0Qʪ(g0Rʪ(%1½(x#:(~Aҽ(#:(#6 !E-x&!x&!%\:f  (͕&(͐&!%͐&ͺ')`&͢'ͧ':%)!&͐&l&͢'ͧ'!%60#60#60#>2f0!"&:O0+!"%2%2%2%Z&%|'!.-x&z{:]0ʼ)*%`)‘)!"%r&\£)*%#"%+~*:.2]0ʼ)r&\!-U'*%`) *Z&!"%*%B&%))***6# *G&*%*%#"%~!X-x&G:%Q*>*x*Q*xL*'O*S**&*&w#"&!`)`&!"&*&%~ʟ*B&¦*z*G&z*!o-x&,͹**>&*@&w#">&!`)l&!">&*@&&z*_!%~ (*2%*b0}!,~ 7+(*#*+*> (**b0~N+(*#B+> (*> (*> (*}2%!%+O(*:/ :O0:%y*:%!O0¥+:e0!]0+~ ,:/ ,!/~ +:f0 ,:/++:_0 ,+:/# ,:/ ,:_0=+!/~ +!0s!%~!%+4:0!/,G~i+#x=,> i+> i+20!/>x6 #=),G!/~ pͺ'*&}O,>(*?,`&%͏':^0+;,!&6S#6Y#6M#w!&w:%2%!"&ͺ'+2%`&%͢'ͧ';,:%,:%-.*P0"%-.*>&},>ͯ*ö,:%,l&&͏'!-x&CP/M Macro assembler v3.1 Pa ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED JRZ CNVBUF ;IF (NO ABORT), CAPITALIZE COMMAND ENDIF ; DEB3 CD2DDE CALL SUBKIL ;KILL $$$.SUB IF ABORT DEB6 C339DD JMP RESTRT ;RESTART CCP ; ; INPUT COMMAND LINE FROM USER CONSOLE ; RB1: DEB9 CD2DDE CALL SUBKIL ;ERASE $$$.SUB IF PRESENT DEBC CD50DE CALL SETUD ;SET USER AND DISK DEBF 3E3E MVI A,CPRMPT ;PRINT PROMPT DEC1 CDB0DD CALL CONOUT DEC4 0E0A MVI C,0AH ;READ COMMAND LINE FROM USER DEC6 1106DC LXI D,MBUFF DEC9 CD0500 CALL BDOS ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED DECC C35FDE JMP SETU0D ;SET CURRENT DISK NUMBER IN LOWER PARAMS ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED CALL SPT TO NEXT JR ERR2 ;CONTINUE DF07+18 DF08+F3 ERR1: DF09 CDE8DD CALL PRINT ;PRINT '?' DF0C BF DB '?'+80H DF0D CD2DDE CALL SUBKIL ;TERMINATE ACTIVE $$$.SUB IF ANY DF10 C339DD JMP RESTRT ;RESTART CCP ; ; CHECK TO SEE IF DE PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET ; SDELM: DF13 1A LDAX D DF14 B7 ORA A ;0=DELIMITER DF15 C8 RZ DF16 FE20 CPI ' ' ;ERROR IF < CP/M Macro assembler v3.1 Page 020 CCPZ Version 4.1 JRC ERROR DF18+38 DF19+DC DF1A C8 RZ ;=DELIMITER DF1B FE3D CPI '=' ;'='=DELIMITER DF1D C8 RZ DF1E FE5F CPI 5FH ;UNDERSCORE=DELIMITER DF20 C8 RZ DF21 FE2E CPI '.' ;'.'=DELIMITER DF23 C8 RZ DF24 FE3A CPI ':' ;':'=DELIMITER DF26 C8 RZ DF27 FE3B CPI ';' ;';'=DELIMITER DF29 C8 RZ DF2A FE3C  NUM0: DF58 219CDC LXI H,FCBFN ;PT TO BEGINNING OF TOKEN DF5B 010011 LXI B,1100H ;C=ACCUMULATED VALUE, B=CHAR COUNT ; (C=0, B=11) NUM1: DF5E 7E MOV A,M ;GET CHAR DF5F FE20 CPI ' ' ;DONE IF JRZ NUM2 DF61+28 DF62+18 DF63 23 INX H ;PT TO NEXT CHAR DF64 D630 SUI '0' ;CONVERT TO BINARY (ASCII 0-9 TO BINARY) DF66 FE0A CPI 10 ;ERROR IF >= 10 JRNC NUMERR DF68+30 DF69+13 DF6A 57 MOV D,A ;DIGIT IN D DF6B 79 MOV A,C ;NEW VALUE = OLD VALUE * 10 DF6C 07 RLC DF6D 07 RLC DF6E 07 RLC DF6F 81 ADD C ;CHECK FOR RANGE ERROR JRC NUMERR DF70+38 DF71+0B DF72 81 ADD C ;CHECK FOR RANGE ERROR JRC NUMERR DF73+38 DF74+08 DF75 82 ADD D ;NEW VALUE = OLD VALUE * 10 + DIGIT JRC NUMERR ;CHECK FOR RANGE ERROR DF76+38 CP/M Macro assembler v3.1 ETU0D ;SET CURRENT DISK NUMBER IF LOWER PARAMS ; AND FALL THRU TO CNVBUF ENDIF ; ; CAPITALIZE STRING (ENDING IN 0) IN CBUFF AND SET PTR FOR PARSING ; CNVBUF: DECF 2107DC LXI H,CBUFF ;PT TO USER'S COMMAND DED2 46 MOV B,M ;CHAR COUNT IN B DED3 04 INR B ;ADD 1 IN CASE OF ZERO CB1: DED4 23 INX H ;PT TO 1ST VALID CHAR DED5 7E MOV A,M ;CAPITALIZE COMMAND CHAR DED6 CD65DE CALL UCASE DED9 77 MOV M,A DJNZ CB1 ;CONTINUE TO END OF COMMAND LINE DEDA+10 CP/M Macro assembler v3.1 Page 019 CCPZ Version 4.1 DEDB+F8 CB2: DEDC 3600 MVI M,0 ;STORE ENDING DEDE 2108DC LXI H,CIBUFF ;SET COMMAND LINE PTR TO 1ST CHAR DEE1 2259DC SHLD CIBPTR DEE4 C9 RET ; ; CHECK FOR ANY CHAR FROM USER CONSOLE;RET W/ZERO SET IF NONE CPI '<' ;'<'=DELIMITER DF2C C8 RZ DF2D FE3E CPI '>' ;'>'=DELIMITER DF2F C9 RET ; ; ADVANCE INPUT PTR TO FIRST NON-BLANK AND FALL THROUGH TO SBLANK ; ADVAN: LDED CIBPTR DF30+ED5B DF32+59DC ; ; SKIP STRING PTED TO BY DE (STRING ENDS IN 0) UNTIL END OF STRING ; OR NON-BLANK ENCOUNTERED (BEGINNING OF TOKEN) ; SBLANK: DF34 1A LDAX D DF35 B7 ORA A DF36 C8 RZ DF37 FE20 CPI ' ' DF39 C0 RNZ DF3A 13 INX D JR SBLANK DF3B+18 DF3C+F7 ; ; ADD A TO HL (HL=HL+A) ; ADDAH: DF3D 85 ADD L DF3E 6F MOV L,A DF3F D0 RNC DF40 24 INR H DF41 C9 RET ; ; EXTRACT DECIMAL NUMBER FROM COMMAND LINE  Page 022 CCPZ Version 4.1 DF77+05 DF78 4F MOV C,A ;SET NEW VALUE DJNZ NUM1 ;COUNT DOWN DF79+10 DF7A+E3 ; ; RETURN FROM NUMBER ; NUM2: DF7B 79 MOV A,C ;GET ACCUMULATED VALUE DF7C C9 RET ; ; NUMBER ERROR ROUTINE FOR SPACE CONSERVATION ; NUMERR: DF7D C3F6DE JMP ERROR ;USE ERROR ROUTINE - THIS IS RELATIVE PT ; ; EXTRACT HEXADECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A; ALL REGISTERS MAY BE AFFECTED ; HEXNUM: DF80 CDE7DF CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN HNUM0: DF83 219CDC LXI H,FCBFN ;PT TO TOKEN FOR CONVERSION DF86 110000 LXI D,0 ;DE=ACCUMULATED VALUE DF89 060B MVI B,11 ;B=CHAR COUNT HNUM1: DF8B 7E MOV A,M ;GET CHAR DF8C FE20 ; BREAK: DEE5 D5 PUSH D ;SAVE DE DEE6 0E0B MVI C,11 ;CSTS CHECK DEE8 CDDCDD CALL BDOSB DEEB C4BBDD CNZ CONIN ;GET INPUT CHAR BRKBK: DEEE D1 POP D DEEF C9 RET ; ; GET THE REQUESTED USER NUMBER FROM THE COMMAND LINE AND VALIDATE IT. ; USRNUM: DEF0 CD42DF CALL NUMBER DEF3 FE10 CPI MAXUSR+1 DEF5 D8 RC ; ; INVALID COMMAND -- PRINT IT ; ERROR: DEF6 CDA9DD CALL CRLF ;NEW LINE DEF9 2A5BDC LHLD CIPTR ;PT TO BEGINNING OF COMMAND LINE ERR2: DEFC 7E MOV A,M ;GET CHAR DEFD FE21 CPI ' '+1 ;SIMPLE '?' IF OR LESS JRC ERR1 DEFF+38 DF00+08 DF01 E5 PUSH H ;SAVE PTR TO ERROR COMMAND CHAR DF02 CDB0DD CALL CONOUT ;PRINT COMMAND CHAR DF05 E1 POP H ;GET PTR DF06 23 INX H ; ; RETURN WITH VALUE IN REG A;ALL REGISTERS MAY BE AFFECTED ; NUMBER: DF42 CDE7DF CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN DF45 21A6DC LXI H,FCBFN+10 ;PT TO END OF TOKEN FOR CONVERSION DF48 060B MVI B,11 ;11 CHARS MAX CP/M Macro assembler v3.1 Page 021 CCPZ Version 4.1 ; ; CHECK FOR SUFFIX FOR HEXADECIMAL NUMBER ; NUMS: DF4A 7E MOV A,M ;GET CHARS FROM END, SEARCHING FOR SUFFIX DF4B 2B DCX H ;BACK UP DF4C FE20 CPI ' ' ;SPACE? JRNZ NUMS1 ;CHECK FOR SUFFIX DF4E+20 DF4F+04 DJNZ NUMS ;COUNT DOWN DF50+10 DF51+F8 JR NUM0 ;BY DEFAULT, PROCESS DF52+18 DF53+04 NUMS1: DF54 FE48 CPI NUMBASE ;CHECK AGAINST BASE SWITCH FLAG JRZ HNUM0 DF56+28 DF57+2B ; ; PROCESS DECIMAL NUMBER ;  CPI ' ' ;DONE? JRZ HNUM3 ;RETURN IF SO DF8E+28 DF8F+2D DF90 FE48 CPI 'H' ;DONE IF H SUFFIX JRZ HNUM3 DF92+28 DF93+29 DF94 D630 SUI '0' ;CONVERT TO BINARY JRC NUMERR ;RETURN AND DONE IF ERROR DF96+38 DF97+E5 DF98 FE0A CPI 10 ;0-9? JRC HNUM2 DF9A+38 DF9B+06 DF9C D607 SUI 7 ;A-F? DF9E FE10 CPI 10H ;ERROR? JRNC NUMERR DFA0+30 DFA1+DB HNUM2: DFA2 23 INX H ;PT TO NEXT CHAR DFA3 4F MOV C,A ;DIGIT IN C DFA4 7A MOV A,D ;GET ACCUMULATED VALUE DFA5 07 RLC ;EXCHANGE NYBBLES DFA6 07 RLC DFA7 07 RLC CP/M Macro assembler v3.1 Page 023 CCPZ Version 4.1 DFA8 07 RLC DFA9 E6F0 ANI 0F0H ;MASK OUT LOW NYBBLE DFAB 57 MOV D,A DFAC 7B MOV A,E ;SWITCH LOW-ORDER NYBBLES DFAD 07 RLC DFAE 07 RLC DFAF 07 RLC DFB0 07 N DFDD 3E00 MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TEMPDR DFDF B7 ORA A ;0=NO DFE0 C8 RZ DFE1 3D DCR A ;COMPARE IT AGAINST DEFAULT DFE2 2160DE LXI H,TDRIVE DFE5 BE CMP M DFE6 C9 RET ;ABORT IF SAME ; ; EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCBDN; ; FORMAT FCBDN FCB IF TOKEN RESEMBLES FILE NAME AND TYPE (FILENAME.TYP); ; ON INPUT, CIBPTR PTS TO CHAR AT WHICH TO START SCAN; ; ON OUTPUT, CIBPTR PTS TO CHAR AT WHICH TO CONTINUE AND ZERO FLAG IS RESET ; IF '?' IS IN TOKEN ; SCANER: DFE7 AF XRA A ;A=0 TO START AT DRIVE SPECIFICATION BYTE SCAN1: DFE8 219BDC LXI H,FCBDN ;POINT TO FCBDN DFEB CD3DDF CALL ADDAH ;OFFSET INTO FCB DFEE E5 PUSH H DFEF E5 PUSH H DFF0 AF XRA A ;SET TEMPORARY DRIVE NUMBER TO DEFAULT DFF1 32DEDF S028+10 E029+EE SCAN8: E02A CD13DF CALL SDELM ;8 CHARS OR MORE - SKIP UNTIL DELIMITER JRZ SCAN10 ;ZERO FLAG SET IF DELIMITER FOUND E02D+28 E02E+08 E02F 13 INX D ;PT TO NEXT CHAR IN COMMAND LINE JR SCAN8 E030+18 E031+F8 SCAN9: E032 23 INX H ;PT TO NEXT BYTE IN FCBDN E033 3620 MVI M,' ' ;FILL FILENAME PART WITH DJNZ SCAN9 E035+10 E036+FB ; ; EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP ; SCAN10: E037 0603 MVI B,3 ;PREPARE TO EXTRACT TYPE E039 FE2E CPI '.' ;IF (DE) DELIMITER IS A '.', WE HAVE A TYPE JRNZ SCAN15 ;FILL FILE TYPE BYTES WITH E03B+20 E03C+1B E03D 13 INX D ;PT TO CHAR IN COMMAND LINE AFTER '.' SCAN11: E03E CD13DF CALL SDELM ;CHECK FOR DELIMITER JRZ SCAN15 ;FILL REST OF TYPE IF IT IS A DELIMITER RLC DFB1 5F MOV E,A ;HIGH NYBBLE OF E=NEW HIGH OF E, ; LOW NYBBLE OF E=NEW LOW OF D DFB2 E60F ANI 0FH ;GET NEW LOW OF D DFB4 B2 ORA D ;MASK IN HIGH OF D DFB5 57 MOV D,A ;NEW HIGH BYTE IN D DFB6 7B MOV A,E DFB7 E6F0 ANI 0F0H ;MASK OUT LOW OF E DFB9 B1 ORA C ;MASK IN NEW LOW DFBA 5F MOV E,A ;NEW LOW BYTE IN E DJNZ HNUM1 ;COUNT DOWN DFBB+10 DFBC+CE ; ; RETURN FROM HEXNUM ; HNUM3: DFBD EB XCHG ;RETURNED VALUE IN HL DFBE 7D MOV A,L ;LOW-ORDER BYTE IN A DFBF C9 RET ; ; PT TO DIRECTORY ENTRY IN TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C ; DIRPTR: DFC0 218000 LXI H,TBUFF ;PT TO TEMP BUFFER DFC3 81 ADD C ;PT TO 1ST BYTE OF DIR ENTRY DFC4 CD3DDF CALL ADDAH ;PT TO DESIRED BYTE IN DIR ENTRY DFC7 7E TA TEMPDR DFF4 CD30DF CALL ADVAN ;SKIP TO NON-BLANK OR END OF LINE SDED CIPTR ;SET PTR TO NON-BLANK OR END OF LINE DFF7+ED53 DFF9+5BDC DFFB E1 POP H ;GET PTR TO NEXT BYTE IN FCBDN DFFC 1A LDAX D ;END OF LINE? DFFD B7 ORA A ;0=YES JRZ SCAN2 DFFE+28 DFFF+0A E000 DE40 SBI 'A'-1 ;CONVERT POSSIBLE DRIVE SPEC TO NUMBER E002 47 MOV B,A ;STORE NUMBER (A:=0, B:=1, ETC) IN B E003 13 INX D ;PT TO NEXT CHAR E004 1A LDAX D ;SEE IF IT IS A COLON (:) E005 FE3A CPI ':' JRZ SCAN3 ;YES, WE HAVE A DRIVE SPEC E007+28 E008+07 E009 1B DCX D ;NO, BACK UP PTR TO FIRST NON-BLANK CHAR SCAN2: E00A 3A60DE LDA TDRIVE ;SET 1ST BYTE OF FCBDN AS DEFAULT DRIVE E00D 77 MOV M,A JR SCAN4 E00E+18 E00F+06 SCAN3: E010 78 MOV A,B ;WE HAVE A DRIVE SPEC E011 32DEDF STA TEMPDR ;SET TEMPORARY DRIV CP/M Macro assembler v3.1 Page 026 CCPZ Version 4.1 E041+28 E042+15 E043 23 INX H ;PT TO NEXT BYTE IN FCBDN E044 FE2A CPI '*' ;WILD? JRNZ SCAN12 ;STORE CHAR IF NOT WILD E046+20 E047+04 E048 363F MVI M,'?' ;STORE '?' AND DON'T ADVANCE COMMAND LINE PTR JR SCAN13 E04A+18 E04B+02 SCAN12: E04C 77 MOV M,A ;STORE CHAR IN FCBDN E04D 13 INX D ;PT TO NEXT CHAR IN COMMAND LINE SCAN13: DJNZ SCAN11 ;COUNT DOWN CHARS IN FILE TYPE (3 MAX) E04E+10 E04F+EE SCAN14: E050 CD13DF CALL SDELM ;SKIP REST OF CHARS AFTER 3-CHAR TYPE TO JRZ SCAN16 ; DELIMITER E053+28 E054+08 E055 13 INX D JR SCAN14 E056+18 E057+F8 SCAN15: E058 23 INX H ;FILL IN REST OF TYP WITH E059 3620 MVI M,' ' DJNZ SCAN15 E05B+10 E05C+FB ;  MOV A,M ;GET DESIRED BYTE DFC8 C9 RET ; ; CHECK FOR SPECIFIED DRIVE AND LOG IT IN IF NOT DEFAULT ; SLOGIN: DFC9 AF XRA A ;SET FCBDN FOR DEFAULT DRIVE DFCA 329BDC STA FCBDN DFCD CDDDDF CALL COMLOG ;CHECK DRIVE DFD0 C8 RZ JR DLOG5 ;DO LOGIN OTHERWISE DFD1+18 DFD2+07 ; ; CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT ; DLOGIN: DFD3 CDDDDF CALL COMLOG ;CHECK DRIVE DFD6 C8 RZ ;ABORT IF SAME DFD7 3A60DE LDA TDRIVE ;LOG IN DEFAULT DRIVE ; DFDA C30BDE DLOG5: JMP LOGIN CP/M Macro assembler v3.1 Page 024 CCPZ Version 4.1 ; ; ROUTINE COMMON TO BOTH LOGIN ROUTINES; ON EXIT, Z SET MEANS ABORT ; COMLOG: DFDE = TEMPDR EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATIOE CP/M Macro assembler v3.1 Page 025 CCPZ Version 4.1 E014 70 MOV M,B ;SET 1ST BYTE OF FCBDN AS SPECIFIED DRIVE E015 13 INX D ;PT TO BYTE AFTER ':' ; ; EXTRACT FILENAME FROM POSSIBLE FILENAME.TYP ; SCAN4: E016 0608 MVI B,8 ;MAX OF 8 CHARS IN FILE NAME SCAN5: E018 CD13DF CALL SDELM ;DONE IF DELIMITER ENCOUNTERED - FILL JRZ SCAN9 E01B+28 E01C+15 E01D 23 INX H ;PT TO NEXT BYTE IN FCBDN E01E FE2A CPI '*' ;IS (DE) A WILD CARD? JRNZ SCAN6 ;CONTINUE IF NOT E020+20 E021+04 E022 363F MVI M,'?' ;PLACE '?' IN FCBDN AND DON'T ADVANCE DE IF SO JR SCAN7 E024+18 E025+02 SCAN6: E026 77 MOV M,A ;STORE FILENAME CHAR IN FCBDN E027 13 INX D ;PT TO NEXT CHAR IN COMMAND LINE SCAN7: DJNZ SCAN5 ;DECREMENT CHAR COUNT UNTIL 8 ELAPSED E ; FILL IN EX, S1, S2, AND RC WITH ZEROES ; SCAN16: E05D 0604 MVI B,4 ;4 BYTES SCAN17: E05F 23 INX H ;PT TO NEXT BYTE IN FCBDN E060 3600 MVI M,0 DJNZ SCAN17 E062+10 E063+FB ; ; SCAN COMPLETE -- DE PTS TO DELIMITER BYTE AFTER TOKEN ; SDED CIBPTR E064+ED53 E066+59DC ; ; SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN FILENAME.TYP ; E068 E1 POP H ;GET PTR TO FCBDN IN HL E069 010B00 LXI B,11 ;SCAN FOR '?' IN FILENAME.TYP (C=11 BYTES) SCAN18: CP/M Macro assembler v3.1 Page 027 CCPZ Version 4.1 E06C 23 INX H ;PT TO NEXT BYTE IN FCBDN E06D 7E MOV A,M E06E FE3F CPI '?' JRNZ SCAN19 E070+20 E071+01 E072 04 INR B ;B<>0 TO INDICATE '?' ENCOUNTERED SCAN19: E073 0D DCR C  ; DIR S Displays the SYS files ; DIR A Display both DIR and SYS files ; DIR: E09B 3E80 MVI A,80H ;SET SYSTEM BIT EXAMINATION E09D F5 PUSH PSW E09E CDE7DF CALL SCANER ;EXTRACT POSSIBLE D:FILENAME.TYP TOKEN E0A1 CDC9DF CALL SLOGIN ;LOG IN DRIVE IF NECESSARY E0A4 219CDC LXI H,FCBFN ;MAKE FCB WILD (ALL '?') IF NO FILENAME.TYP E0A7 7E MOV A,M ;GET FIRST CHAR OF FILENAME.TYP E0A8 FE20 CPI ' ' ;IF , ALL WILD E0AA CC44E1 CZ FILLQ E0AD CD30DF CALL ADVAN ;LOOK AT NEXT INPUT CHAR E0B0 0600 MVI B,0 ;SYS TOKEN DEFAULT JRZ DIR2 ;JUMP; THERE ISN'T ONE E0B2+28 E0B3+16 E0B4 FE41 CPI SYSFLG ;SYSTEM FLAG SPECIFIER? JRZ GOTSYS ;GOT SYSTEM SPECIFIER E0B6+28 E0B7+06 E0B8 FE53 CPI SOFLG ;SYS ONLY? JRNZ DIR2 E0BA+20 E0BB+0E E0BC 0680 MVI B,80H ;FLAG SYS ONLY GOTSYSE0F0 1C INR E E0F1 D5 PUSH D ;SAVE IT ; IF TWOCOL ANI 01H ;OUTPUT IF 2 ENTRIES PRINTED IN LINE ENDIF ; IF NOT TWOCOL E0F2 E603 ANI 03H ;OUTPUT IF 4 ENTRIES PRINTED IN LINE ENDIF ; E0F4 F5 PUSH PSW JRNZ DIR4 E0F5+20 E0F6+05 E0F7 CDA9DD CALL CRLF ;NEW LINE JR DIR5 E0FA+18 E0FB+08 DIR4: E0FC CDE8DD CALL PRINT ; CP/M Macro assembler v3.1 Page 030 CCPZ Version 4.1 IF WIDE E0FF 2020 DB ' ' ;2 SPACES E101 7C DB FENCE ;THEN FENCE CHAR E102 20A0 DB ' ',' '+80H ;THEN 2 MORE SPACES ENDIF ; IF NOT WIDE DB ' ' ;SPACE DB FENCE ;THEN FENCE CHAR DB ' '+80H ;THEN SPACE ;COUNT DOWN JRNZ SCAN18 E074+20 E075+F6 E076 78 MOV A,B ;A=B=NUMBER OF '?' IN FILENAME.TYP E077 B7 ORA A ;SET ZERO FLAG TO INDICATE ANY '?' E078 C9 RET ; ; CMDTBL (COMMAND TABLE) SCANNER ; ON RETURN, HL PTS TO ADDRESS OF COMMAND IF CCP-RESIDENT ; ON RETURN, ZERO FLAG SET MEANS CCP-RESIDENT COMMAND ; CMDSER: E079 21BEDC LXI H,CMDTBL ;PT TO COMMAND TABLE E07C 0E0B MVI C,NCMNDS ;SET COMMAND COUNTER CMS1: E07E 119CDC LXI D,FCBFN ;PT TO STORED COMMAND NAME E081 0604 MVI B,NCHARS ;NUMBER OF CHARS/COMMAND (8 MAX) CMS2: E083 1A LDAX D ;COMPARE AGAINST TABLE ENTRY E084 BE CMP M JRNZ CMS3 ;NO MATCH E085+20 E086+0A E087 13 INX D ;PT TO NEXT CHAR E088 23 INX H DJNZ CMS2 ;COUNT DOWN E089+10 E08A+F8 E08B 1A : E0BE 13 INX D SDED CIBPTR E0BF+ED53 E0C1+59DC E0C3 FE53 CPI SOFLG ;SYS ONLY SPEC? JRZ DIR2 ;THEN LEAVE BIT SPEC UNCHAGNED E0C5+28 E0C6+03 E0C7 F1 POP PSW ;GET FLAG E0C8 AF XRA A ;SET NO SYSTEM BIT EXAMINATION E0C9 F5 PUSH PSW DIR2: E0CA F1 POP PSW ;GET FLAG DIR2A: ;DROP INTO DIRPR TO PRINT DIRECTORY ; THEN RESTART CCP ; ; DIRECTORY PRINT ROUTINE; ON ENTRY, MSB OF A IS 1 (80H) IF SYSTEM FILES EXCL CP/M Macro assembler v3.1 Page 029 CCPZ Version 4.1 ; DIRPR: E0CB 57 MOV D,A ;STORE SYSTEM FLAG IN D E0CC 1E00 MVI E,0 ;SET COLUMN COUNTER TO ZERO E0CE D5 PUSH D ;SAVE COLUMN COUNTER (E) AND SYSTEM FLAG (D) E0CF 78 MOV A,B ;SYS ONLY SPECIFIER E0D0 32EBE0 STA SYSTST E0D3 CD22DE CALL SEARF ;SEARCH FOR SPECIFIED  ENDIF ; DIR5: E104 0601 MVI B,01H ;PT TO 1ST BYTE OF FILE NAME DIR6: E106 78 MOV A,B ;A=OFFSET E107 CDC0DF CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE NAME E10A E67F ANI 7FH ;MASK OUT MSB E10C FE20 CPI ' ' ;NO FILE NAME? JRNZ DIR8 ;PRINT FILE NAME IF PRESENT E10E+20 E10F+13 E110 F1 POP PSW E111 F5 PUSH PSW E112 FE03 CPI 03H JRNZ DIR7 E114+20 E115+0B E116 3E09 MVI A,09H ;PT TO 1ST BYTE OF FILE TYPE E118 CDC0DF CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE TYPE E11B E67F ANI 7FH ;MASK OUT MSB E11D FE20 CPI ' ' ;NO FILE TYPE? JRZ DIR9 ;CONTINUE IF SO E11F+28 E120+16 DIR7: E121 3E20 MVI A,' ' ;OUTPUT DIR8: E123 CDB0DD CALL CONOUT ;PRINT CHAR E126 04 INR B ;INCR CHAR COUNT E127 78 MOV A,B E128 FE0C CPI 12 ;ELDAX D ;NEXT CHAR IN INPUT COMMAND MUST BE E08C FE20 CPI ' ' JRNZ CMS4 E08E+20 E08F+04 E090 C9 RET ;COMMAND IS CCP-RESIDENT (ZERO FLAG SET) CMS3: E091 23 INX H ;SKIP TO NEXT COMMAND TABLE ENTRY DJNZ CMS3 E092+10 E093+FD CMS4: E094 23 INX H ;SKIP ADDRESS E095 23 INX H E096 0D DCR C ;DECREMENT TABLE ENTRY NUMBER JRNZ CMS1 E097+20 E098+E5 E099 0C INR C ;CLEAR ZERO FLAG CP/M Macro assembler v3.1 Page 028 CCPZ Version 4.1 E09A C9 RET ;COMMAND IS DISK-RESIDENT (ZERO FLAG CLEAR) ; ;**** Section 5 **** ; CCP-Resident Commands ; ; ;Section 5A ;Command: DIR ;Function: To display a directory of the files on disk ;Forms: ; DIR Displays the DIR files FILE (FIRST OCCURRANCE) E0D6 CC9EDD CZ PRNNF ;PRINT NO FILE MSG;REG A NOT CHANGED ; ; ENTRY SELECTION LOOP; ON ENTRY, A=OFFSET FROM SEARF OR SEARN ; DIR3: JRZ DIR11 ;DONE IF ZERO FLAG SET E0D9+28 E0DA+67 E0DB 3D DCR A ;ADJUST TO RETURNED VALUE E0DC 0F RRC ;CONVERT NUMBER TO OFFSET INTO TBUFF E0DD 0F RRC E0DE 0F RRC E0DF E660 ANI 60H E0E1 4F MOV C,A ;OFFSET INTO TBUFF IN C (C=OFFSET TO ENTRY) E0E2 3E0A MVI A,10 ;ADD 10 TO PT TO SYSTEM FILE ATTRIBUTE BIT E0E4 CDC0DF CALL DIRPTR E0E7 D1 POP D ;GET SYSTEM BIT MASK FROM D E0E8 D5 PUSH D E0E9 A2 ANA D ;MASK FOR SYSTEM BIT E0EB = SYSTST EQU $+1 ;POINTER TO IN-THE-CODE BUFFER SYSTST E0EA FE00 CPI 0 JRNZ DIR10 E0EC+20 E0ED+4A E0EE D1 POP D ;GET ENTRY COUNT (= COUNTER) E0EF 7B MOV A,E ;ADD 1 TO IT ND OF FILENAME.TYP? JRNC DIR9 ;CONTINUE IF SO E12A+30 E12B+0B E12C FE09 CPI 09H ;END IF FILENAME ONLY? JRNZ DIR6 ;PRINT TYP IF SO E12E+20 E12F+D6 E130 3E2E MVI A,'.' ;PRINT DOT BETWEEN FILE NAME AND TYPE E132 CDB0DD CALL CONOUT JR DIR6 E135+18 E136+CF DIR9: E137 F1 POP PSW CP/M Macro assembler v3.1 Page 031 CCPZ Version 4.1 DIR10: E138 CDE5DE CALL BREAK ;CHECK FOR ABORT JRNZ DIR11 E13B+20 E13C+05 E13D CD29DE CALL SEARN ;SEARCH FOR NEXT FILE JR DIR3 ;CONTINUE E140+18 E141+97 DIR11: E142 D1 POP D ;RESTORE STACK E143 C9 RET ; ; FILL FCB @HL WITH '?' ; FILLQ: E144 060B MVI B,11 ;NUMBER OF CHARS IN FN & FT FQLP: E146 363F MVI M,'?' ;STORE '?' E148 23 INX H  XRA A ;TURN OFF PRINTER FLAG ; ; ENTRY POINT FOR CCP LIST FUNCTION (LIST) ; TYPE0: E17C 32C1DD STA PRFLG ;SET FLAG E17F CDE7DF CALL SCANER ;EXTRACT FILENAME.TYP TOKEN E182 C2F6DE JNZ ERROR ;ERROR IF ANY QUESTION MARKS E185 CD30DF CALL ADVAN ;GET PGDFLG IF IT'S THERE E188 3205E2 STA PGFLG ;SAVE IT AS A FLAG JRZ NOSLAS ;JUMP IF INPUT ENDED E18B+28 E18C+05 E18D 13 INX D ;PUT NEW BUF POINTER E18E EB XCHG E18F 2259DC SHLD CIBPTR NOSLAS: E192 CDC9DF CALL SLOGIN ;LOG IN SELECTED DISK IF ANY E195 CD10DE CALL OPENF ;OPEN SELECTED FILE E198 CAF8E1 JZ TYPE4 ;ABORT IF ERROR E19B CDA9DD CALL CRLF ;NEW LINE E19E 3E17 MVI A,NLINES-1 ;SET LINE COUNT E1A0 32BCDC STA PAGCNT E1A3 21BDDC LXI H,CHRCNT ;SET CHAR POSITION/COUNT E1A6 36FF MVI M,0FFH ;EMPTY LINE E1A8 0600 MVI B,0 ;SET TAB CHAR CO@' ;^C? E1F3 C8 RZ ;RESTART IF SO JR TYPE1 E1F4+18 E1F5+B4 TYPE3: E1F6 3D DCR A ;NO ERROR? E1F7 C8 RZ ;RESTART CCP TYPE4: E1F8 C3E9E3 JMP ERRLOG ; ; PAGING ROUTINES ; PAGER COUNTS DOWN LINES AND PAUSES FOR INPUT (DIRECT) IF COUNT EXPIRES ; PAGSET SETS LINES/PAGE COUNT ; PAGER: E1FB E5 PUSH H E1FC 21BCDC LXI H,PAGCNT ;COUNT DOWN E1FF 35 DCR M JRNZ PGBAK ;JUMP IF NOT END OF PAGE E200+20 E201+10 E202 3616 MVI M,NLINES-2 ;REFILL COUNTER ; E205 = PGFLG EQU $+1 ;POINTER TO IN-THE-CODE BUFFER PGFLG E204 3E00 MVI A,0 ;0 MAY BE CHANGED BY PGFLG EQUATE E206 FE50 CPI PGDFLG ;PAGE DEFAULT OVERRIDE OPTION WANTED? ; IF PGDFLT ;IF PAGING IS DEFAULT JRZ PGBAK ; PGDFLG  DJNZ FQLP E149+10 E14A+FB E14B C9 RET ; ;Section 5B ;Command: ERA ;Function: Erase files ;Forms: ; ERA Erase Specified files and print their names ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; ERA: E14C CDE7DF CALL SCANER ;PARSE FILE SPECIFICATION E14F FE0B CPI 11 ;ALL WILD (ALL FILES = 11 '?')? JRNZ ERA1 ;IF NOT, THEN DO ERASES E151+20 E152+15 E153 CDE3DD CALL PRINTC E156 416C6CBF DB 'All','?'+80H E15A CDBBDD CALL CONIN ;GET REPLY E15D CD65DE CALL UCASE ;CAPITALIZE E160 FE59 CPI 'Y' ;YES? E162 C239DD JNZ RESTRT ;RESTART CCP IF NOT E165 CDA9DD CALL CRLF ;NEW LINE ERA1: E168 CDC9DF CALL SLOGIN ;LOG IN SELECTED DISK IF ANY E16B AF XRA A ;PRINT ALL FILES (EXAMINE SYSTEM BIT) E16C 47 MOV B,A UNTER TYPE1: E1AA 21BDDC LXI H,CHRCNT ;PT TO CHAR POSITION/COUNT E1AD 7E MOV A,M ;END OF BUFFER? E1AE FE80 CPI 80H JRC TYPE2 E1B0+38 E1B1+09 E1B2 E5 PUSH H ;READ NEXT BLOCK E1B3 CDD7DD CALL READF CP/M Macro assembler v3.1 Page 033 CCPZ Version 4.1 E1B6 E1 POP H JRNZ TYPE3 ;ERROR? E1B7+20 E1B8+3D E1B9 AF XRA A ;RESET COUNT E1BA 77 MOV M,A TYPE2: E1BB 34 INR M ;INCREMENT CHAR COUNT E1BC 218000 LXI H,TBUFF ;PT TO BUFFER E1BF CD3DDF CALL ADDAH ;COMPUTE ADDRESS OF NEXT CHAR FROM OFFSET E1C2 7E MOV A,M ;GET NEXT CHAR E1C3 E67F ANI 7FH ;MASK OUT MSB E1C5 FE1A CPI 1AH ;END OF FILE (^Z)? E1C7 C8 RZ ;RESTART CCP IF SO ; ; OUTPUT CHAR TO CON: OR LST: DEVICE WITH TABULATION ; E1C8 FE0D CPI CR ;RESET TAB COUNT? JRZ TABRST E1CMEANS NO PAGING, PLEASE E208+28 E209+08 ELSE ;IF PAGING NOT DEFAULT JRNZ PGBAK ; PGDFLG MEANS PLEASE PAGINATE ENDIF ; E20A CDBBDD CALL CONIN ;GET CHAR TO CONTINUE E20D FE03 CPI 'C'-'@' ;^C E20F CA8ADD JZ RSTCCP ;RESTART CCP PGBAK: E212 E1 POP H ;RESTORE HL E213 C9 RET ; ;Section 5E ;Command: SAVE ;Function: To save the contents of the TPA onto disk as a file ;Forms: ; SAVE ; Save specified number of pages (start at 100H) ; from TPA into specified file; is in DEC ; SAVE S ; Like SAVE above, but numeric argument specifies ; number of sectors rather than pages ; CP/M Macr ;NO SYS-ONLY OPT TO DIRPR E16D CDCBE0 CALL DIRPR ;PRINT DIRECTORY OF ERASED FILES E170 119BDC LXI D,FCBDN ;DELETE FILE SPECIFIED E173 CD38DE CALL DELETE E176 C9 RET ;REENTER CCP ; ENDIF ;RAS CP/M Macro assembler v3.1 Page 032 CCPZ Version 4.1 ; ;Section 5C ;Command: LIST ;Function: Print out specified file on the LST: Device ;Forms: ; LIST Print file (NO Paging) ; LIST: E177 3EFF MVI A,0FFH ;TURN ON PRINTER FLAG JR TYPE0 E179+18 E17A+01 ; ;Section 5D ;Command: TYPE ;Function: Print out specified file on the CON: Device ;Forms: ; TYPE Print file ; TYPE P Print file with paging flag ; TYPE: E17B AF A+28 E1CB+0E E1CC FE0A CPI LF ;RESET TAB COUNT? JRZ TABRST E1CE+28 E1CF+0A E1D0 FE09 CPI TAB ;TAB? JRZ LTAB E1D2+28 E1D3+0D E1D4 CDBFDD CALL LCOUT ;OUTPUT CHAR E1D7 04 INR B ;INCREMENT CHAR COUNT JR TYPE2L E1D8+18 E1D9+12 TABRST: E1DA CDBFDD CALL LCOUT ;OUTPUT OR E1DD 0600 MVI B,0 ;RESET TAB COUNTER JR TYPE2L E1DF+18 E1E0+0B LTAB: E1E1 3E20 MVI A,' ' ; E1E3 CDBFDD CALL LCOUT E1E6 04 INR B ;INCR POS COUNT E1E7 78 MOV A,B E1E8 E607 ANI 7 JRNZ LTAB E1EA+20 E1EB+F5 ; ; CONTINUE PROCESSING ; TYPE2L: E1EC CDE5DE CALL BREAK ;CHECK FOR ABORT JRZ TYPE1 ;CONTINUE IF NO CHAR E1EF+28 CP/M Macro assembler v3.1 Page 034 CCPZ Version 4.1 E1F0+B9 E1F1 FE03 CPI 'C'-'o assembler v3.1 Page 035 CCPZ Version 4.1 IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; SAVE: E214 CD42DF CALL NUMBER ;EXTRACT NUMBER FROM COMMAND LINE E217 F5 PUSH PSW ;SAVE IT E218 CDE7DF CALL SCANER ;EXTRACT FILENAME.TYPE E21B C2F6DE JNZ ERROR ;MUST BE NO '?' IN IT E21E CDC9DF CALL SLOGIN ;LOG IN SELECTED DISK E221 119BDC LXI D,FCBDN ;DELETE FILE IN CASE IT ALREADY EXISTS E224 D5 PUSH D E225 CD38DE CALL DELETE E228 D1 POP D E229 CD41DE CALL CREATE ;MAKE NEW FILE JRZ SAVE3 ;ERROR? E22C+28 E22D+3E E22E AF XRA A ;SET RECORD COUNT FIELD OF NEW FILE'S FCB E22F 32BBDC STA FCBCR E232 F1 POP PSW ;GET PAGE COUNT E233 6F MOV L,A ;HL=PAGE COUNT E234 2600 MVI H,0 E236 E5 PUSH H E237 CD30DF CALL ADVAN ;LOOK FOR 'S' FOR SECTOR OPTION E23A 13 INX D ;PT TO AFTER 'S' TOKEN E23B E1 POP H ROR IF ANY '?' IN IT E279 3ADEDF LDA TEMPDR ;SAVE CURRENT DEFAULT DISK E27C F5 PUSH PSW E27D CDC9DF CALL SLOGIN ;LOG IN SELECTED DISK E280 CD22DE CALL SEARF ;LOOK FOR SPECIFIED FILE JRZ REN0 ;CONTINUE IF NOT FOUND E283+28 E284+10 E285 CDE3DD CALL PRINTC E288 46696C6520 DB 'File Exist','s'+80H E293 F1 POP PSW ;CLEAR STACK E294 C9 RET ;RESTART CCP REN0: E295 219BDC LXI H,FCBDN ;SAVE NEW FILE NAME E298 11ABDC LXI D,FCBDM E29B 011000 LXI B,16 ;16 BYTES LDIR E29E+EDB0 E2A0 CD30DF CALL ADVAN ;ADVANCE CIBPTR E2A3 FE3D CPI '=' ;'=' OK JRNZ REN4 E2A5+20 E2A6+28 REN1: E2A7 EB XCHG ;PT TO CHAR AFTER '=' IN HL E2A8 23 INX H E2A9 2259DC SHLD CIBPTR ;SAVE PTR TO OLD FILE NAME E2AC CDE7DF CALL SCANER ;EXTRACT FILENAME.TYP TOKEN JRNZ REN4 ;ERROR IF ANY '?' CP/M Macro assemble ;Function: To Call the program (subroutine) at the specified address ; without loading from disk ;Forms: ; JUMP Call at ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; JUMP: E2E4 CD80DF CALL HEXNUM ;GET LOAD ADDRESS IN HL JR CALLPROG ;PERFORM CALL E2E7+18 E2E8+3B ; ENDIF ;RAS ; ;Section 5J ;Command: GO ;Function: To Call the program in the TPA without loading ; loading from disk. Same as JUMP 100H, but much ; more convenient, especially when used with ; parameters for programs like STAT. Also can be ; allowed on remote-access systems with no problems. ; ;Form: ; GO ; IF NOT RAS ;ONLY IF RAS ; E2E9 210001 GO: LXI H,TPA ;Always to TPA JR CALLPROG ;Perform call E2EC+18 E2ED+36 ; ENDIF ;END OF GO FOR RAS ; ;Section 5K ;Command: COM file processing ;Function: To load the specified COM file from disk and execute it ;Forms: ; ; COM: E2EE 3A9CDC LDA FCBFN ;ANY COMMAND? E2F1 FE20 CPI ' ' ;' ' MEANS COMMAND WAS 'D:' TO SWITCH JRNZ COM1 ;NOT , SO MUST BE TRANSIENT OR ERROR E2F3+20 E2F4+14 E2F5 3ADEDF LDA TEMPDR ;LOOK FOR DRIVE SPEC E2F8 B7 ORA A ;IF ZERO, JUST BLANK E2F9 CA8DDD JZ RCCPNL E2FC 3D DCR A ;ADJUST FOR LOG IN E2FD 3260DE STA TDRIVE ;SET DEFAULT DRIVE E300 CD5FDE CALL SETU0D ;SET DRIVE WITH USER 0 CP JRNZ SAVE3 ;WRITE ERROR? E25F+20 E260+0B JR SAVE1 ;CONTINUE CP/M Macro assembler v3.1 Page 036 CCPZ Version 4.1 E261+18 E262+E6 SAVE2: E263 119BDC LXI D,FCBDN ;CLOSE SAVED FILE E266 CD1EDE CALL CLOSE E269 3C INR A ;ERROR? JRNZ SAVE4 E26A+20 E26B+03 SAVE3: E26C CDDFE3 CALL PRNLE ;PRINT 'NO SPACE' ERROR SAVE4: E26F CDFFDD CALL DEFDMA ;SET DMA TO 0080 E272 C9 RET ;RESTART CCP ; ENDIF ;RAS ; ;Section 5F ;Command: REN ;Function: To change the name of an existing file ;Forms: ; REN = Perform function ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; REN: E273 CDE7DF CALL SCANER ;EXTRACT FILE NAME E276 C2F6DE JNZ ERROR ;ER ;Forms: ; USER Select specified user number; is in DEC ; USER: E2D2 CDF0DE CALL USRNUM ;EXTRACT USER NUMBER FROM COMMAND LINE E2D5 5F MOV E,A ;PLACE USER NUMBER IN E E2D6 CD4CDE CALL SETUSR ;SET SPECIFIED USER RSTJMP: E2D9 C38DDD JMP RCCPNL ;RESTART CCP ; ;Section 5H ;Command: DFU ;Function: Set the Default User Number for the command/file scanner ; (MEMLOAD) ;Forms: ; DFU Select Default User Number; is in DEC ; DFU: E2DC CDF0DE CALL USRNUM ;GET USER NUMBER E2DF 32A6E3 STA DFUSR ;PUT IT AWAY JR RSTJMP ;RESTART CCP (NO DEFAULT LOGIN) E2E2+18 E2E3+F5 CP/M Macro assembler v3.1 Page 038 CCPZ Version 4.1 ; ;Section 5I ;Command: JUMP /M Macro assembler v3.1 Page 039 CCPZ Version 4.1 E303 CD0BDE CALL LOGIN ;LOG IN DRIVE E306 C38DDD JMP RCCPNL ;RESTART CCP COM1: E309 3AA4DC LDA FCBFT ;FILE TYPE MUST BE BLANK E30C FE20 CPI ' ' E30E C2F6DE JNZ ERROR E311 2177DC LXI H,COMMSG ;PLACE DEFAULT FILE TYPE (COM) INTO FCB E314 11A4DC LXI D,FCBFT ;COPY INTO FILE TYPE E317 010300 LXI B,3 ;3 BYTES LDIR E31A+EDB0 E31C 210001 LXI H,TPA ;SET EXECUTION/LOAD ADDRESS E31F E5 PUSH H ;SAVE FOR EXECUTION E320 CD91E3 CALL MEMLOAD ;LOAD MEMORY WITH FILE SPECIFIED IN CMD LINE ;(NO RETURN IF ERROR OR TOO BIG) E323 E1 POP H ;GET EXECUTION ADDRESS ; ; CALLPROG IS THE ENTRY POINT FOR THE EXECUTION OF THE LOADED ; PROGRAM;ON ENTRY TO THIS ROUTINE, HL MUST CONTAIN THE EXECUTION ; ADDRESS OF THE PROGRAM (SUBROUTINE) TO EXECUTE ; L SETUD ;SET USER/DISK ; ; EXECUTION (CALL) OF PROGRAM (SUBROUTINE) OCCURS HERE ; E379 = EXECADR EQU $+1 ;CHANGE ADDRESS FOR IN-LINE CODE MODIFICATION E378 CD0001 CALL TPA ;CALL TRANSIENT E37B CDFFDD CALL DEFDMA ;SET DMA TO 0080, IN CASE ;PROG CHANGED IT ON US E37E CD5FDE CALL SETU0D ;SET USER 0/DISK E381 CD0BDE CALL LOGIN ;LOGIN DISK E384 C339DD JMP RESTRT ;RESTART CCP ; ;Section 5L ;Command: GET ;Function: To load the specified file from disk to the specified address ;Forms: ; GET Load the specified file at the specified page; ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; GET: E387 CD80DF CALL HEXNUM ;GET LOAD ADDRESS IN HL E38A E5 PUSH H ;SAVE ADDRESS EALLY SELECTED ; MLA0: E3B4 21DEDF LXI H,TEMPDR ;GET DRIVE FROM CURRENT COMMAND E3B7 AF XRA A ;A=0 E3B8 B6 ORA M JRNZ MLERR ;ERROR IF ALREADY DISK A: E3B9+20 E3BA+2B E3BB 3601 MVI M,1 ;SELECT DRIVE A: JR MLA E3BD+18 CP/M Macro assembler v3.1 Page 042 CCPZ Version 4.1 E3BE+DE ; ; FILE FOUND -- PROCEED WITH LOAD ; MLA1: E3C0 = LOADADR EQU $+1 ;MEMORY LOAD ADDRESS (IN-LINE CODE MOD) E3BF 210001 LXI H,TPA ;SET START ADDRESS OF MEMORY LOAD ML2: E3C2 3EDB MVI A,ENTRY/256-1 ;GET HIGH-ORDER ADR OF JUST BELOW CCP E3C4 BC CMP H ;ARE WE GOING TO OVERWRITE THE CCP? JRC PRNLE ;ERROR IF SO E3C5+38 E3C6+18 E3C7 E5 PUSH H ;SAVE ADDRESS OF NEXT SECTOR E3C8 EB XCHG ;... IN DE E3C9 CD02DE CALL DMASET ;SET DMA ADDRESS FOR LOAD E3CC 119BDC  CALLPROG: E324 2279E3 SHLD EXECADR ;PERFORM IN-LINE CODE MODIFICATION E327 CDD3DF CALL DLOGIN ;LOG IN DEFAULT DRIVE E32A CDE7DF CALL SCANER ;SEARCH COMMAND LINE FOR NEXT TOKEN E32D 21DEDF LXI H,TEMPDR ;SAVE PTR TO DRIVE SPEC E330 E5 PUSH H E331 7E MOV A,M ;SET DRIVE SPEC E332 329BDC STA FCBDN E335 3E10 MVI A,10H ;OFFSET FOR 2ND FILE SPEC E337 CDE8DF CALL SCAN1 ;SCAN FOR IT AND LOAD IT INTO FCBDN+16 E33A E1 POP H ;SET UP DRIVE SPECS E33B 7E MOV A,M E33C 32ABDC STA FCBDM E33F AF XRA A E340 32BBDC STA FCBCR E343 115C00 LXI D,TFCB ;COPY TO DEFAULT FCB E346 219BDC LXI H,FCBDN ;FROM FCBDN E349 012100 LXI B,33 ;SET UP DEFAULT FCB LDIR E34C+EDB0 E34E 2108DC LXI H,CIBUFF COM4: E351 7E MOV A,M ;SKIP TO END OF 2ND FILE NAME E352 B7 ORA A ;END OF LINE? JRZ COM5 E353+28 E354+07 E355 FE20 38B CDE7DF CALL SCANER ;GET FILE NAME E38E E1 POP H ;RESTORE ADDRESS JRNZ ERRJMP ;MUST BE UNAMBIGUOUS E38F+20 E390+5B CP/M Macro assembler v3.1 Page 041 CCPZ Version 4.1 ; ; FALL THRU TO MEMLOAD ; ENDIF ;RAS ; ; LOAD MEMORY WITH THE FILE WHOSE NAME IS SPECIFIED IN THE COMMAND LINE ; ON INPUT, HL CONTAINS STARTING ADDRESS TO LOAD ; ; EXIT BACK TO CALLER IF NO ERROR. IF COM FILE TOO BIG OR MEMORY ; FULL, EXIT TO MLERR. ; MEMLOAD: E391 22C0E3 SHLD LOADADR ;SET LOAD ADDRESS E394 CD4ADE CALL GETUSR ;GET CURRENT USER NUMBER E397 3246DE STA TMPUSR ;SAVE IT FOR LATER E39A 32A8E3 STA TSELUSR ;TEMP USER TO SELECT ; ; MLA is a reentry point for a non-standard CP/M Modification ; This is the LXI D,FCBDN ;READ NEXT SECTOR E3CF CDDADD CALL READ E3D2 E1 POP H ;GET ADDRESS OF NEXT SECTOR JRNZ ML3 ;READ ERROR OR EOF? E3D3+20 E3D4+06 E3D5 118000 LXI D,128 ;MOVE 128 BYTES PER SECTOR E3D8 19 DAD D ;PT TO NEXT SECTOR IN HL JR ML2 E3D9+18 E3DA+E7 ; ML3: E3DB 3D DCR A ;LOAD COMPLETE E3DC CA45DE JZ RESETUSR ;IF ZERO, OK, GO RESET CORRECT USER ;# ON WAY OUT, ELSE FALL THROUGH TO PRNLE ; ; LOAD ERROR ; PRNLE: E3DF CDE3DD CALL PRINTC E3E2 46756CEC DB 'Ful','l'+80H ; ; TRANSIENT LOAD ERROR ; MLERR: E3E6 CD45DE CALL RESETUSR ;RESET CURRENT USER NUMBER ; RESET MUST BE DONE BEFORE LOGIN ERRLOG: E3E9 CDD3DF CALL DLOGIN ;LOG IN DEFAULT DISK ERRJMP: ECPI ' ' ;END OF TOKEN? JRZ COM5 E357+28 E358+03 E359 23 INX H JR COM4 E35A+18 E35B+F5 CP/M Macro assembler v3.1 Page 040 CCPZ Version 4.1 ; ; LOAD COMMAND LINE INTO TBUFF ; COM5: E35C 0600 MVI B,0 ;SET CHAR COUNT E35E 118100 LXI D,TBUFF+1 ;PT TO CHAR POS COM6: E361 7E MOV A,M ;COPY COMMAND LINE TO TBUFF E362 12 STAX D E363 B7 ORA A ;DONE IF ZERO JRZ COM7 E364+28 E365+05 E366 04 INR B ;INCR CHAR COUNT E367 23 INX H ;PT TO NEXT E368 13 INX D JR COM6 E369+18 E36A+F6 ; ; RUN LOADED TRANSIENT PROGRAM ; COM7: E36B 78 MOV A,B ;SAVE CHAR COUNT E36C 328000 STA TBUFF E36F CDA9DD CALL CRLF ;NEW LINE E372 CDFFDD CALL DEFDMA ;SET DMA TO 0080 E375 CD50DE CAL return point for when the .COM (or GET) file is not found the ; first time, Drive A: is selected for a second attempt. ; MLA: E39D CDC9DF CALL SLOGIN ;LOG IN SPECIFIED DRIVE IF ANY E3A0 CD10DE CALL OPENF ;OPEN COMMAND.COM FILE JRNZ MLA1 ;FILE FOUND - LOAD IT E3A3+20 E3A4+1A ; ; ERROR ROUTINE TO SELECT USER 0 IF ALL ELSE FAILS ; E3A6 = DFUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE E3A5 3E00 MVI A,DEFUSR ;GET DEFAULT USER E3A8 = TSELUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE E3A7 FE00 CPI DEFUSR ;SAME? JRZ MLA0 ;JUMP IF SO E3A9+28 E3AA+09 E3AB 32A8E3 STA TSELUSR ;ELSE PUT DOWN NEW ONE E3AE 5F MOV E,A E3AF CD4CDE CALL SETUSR ;GO SET NEW USER NUMBER JR MLA ;AND TRY AGAIN E3B2+18 E3B3+E9 ; ; ERROR ROUTINE TO SELECT DRIVE A: IF DEFAULT WAS ORIGIN3EC C3F6DE JMP ERROR ; E3EF END  JRNZ ML3 ;READ ERROR OR EOF? E3D3+20 E3D4+06 E3D5 118000 LXI D,128 ;MOVE 128 BYTES PER SECTOR E3D8 19 DAD D ;PT TO NEXT SECTOR IN HL JR ML2 E3D9+18 E3DA+E7 ; ML3: E3DB 3D DCR A ;LOAD COMPLETE E3DC CA45DE JZ RESETUSR ;IF ZERO, OK, GO RESET CORRECT USER ;# ON WAY OUT, ELSE FALL THROUGH TO PRNLE ; ; LOAD ERROR ; PRNLE: E3DF CDE3DD CALL PRINTC E3E2 46756CEC DB 'Ful','l'+80H ; ; TRANSIENT LOAD ERROR ; MLERR: E3E6 CD45DE CALL RESETUSR ;RESET CURRENT USER NUMBER ; RESET MUST BE DONE BEFORE LOGIN ERRLOG: E3E9 CDD3DF CALL DLOGIN ;LOG IN DEFAULT DISK ERRJMP: EA$D 00290 M24 *I.BS6I.8S9I.9S6Q8 V2@Q$3$5 V3@QA$AA# 0300 PK RI 0310 PL )0320 M28 *IB,$QBAA% V2@Q$10+1 V3@IA$Q98 50330 M29 *I.$S2I.4#S6I.9S6I.4S2 V2@Q$3#$5 V3@QC$A#$ *0340 M30 *I.$S2I.5S7Q97 V2@Q$2$2 V3@Q9$C *0350 M31 *I6'I.6$Q5I1 V2@H2Q$6 V3@QCC&HD (0360 M32 *I.$S4I.6S8QB V2@Q$H3 V3@QADA 0370 PM RI 0380 PN RJ 0390 PO RI 0395 PP RL 0397 PQ q@@@@e@@e@@I$-3-1&4$46&B V2@H8&8& V3@HAD &0130 M8 *I$46&B1-2-1&4 V2@W8& V3@HAD 0135 PE $0140 M9 *QB"B"B"IB"B V2@W1& V3@WE# &0150 M10 *IB8968Q9I4 V2@Q$3$3 V3@HDA )0160 M11 *I456&45Q6%I4 V2@H5Q$3 V3@HC&D 0165 PF +0170 M12 *I64Q5Q.4IB V2@Q36Q.3 V3@QD'DQ.A 0180 PG RE 0185 PH %0190 M16 *I64Q54 V2@Q343 V3@QD'D'AD 0200 PI .0210 M17 *I.$S3I.8S3I5Q7#I3 V2@Q$6$6 V3@Q9$D 10220 M18 *I.7S3I.5S6I.6S1I.5S1 V2@Q$6$6 V3@Q9$D -0230 M19 *I.$S6I.BS6I8Q9I8 V2@Q$3$3 V3@QA$D 0240 PJ 00250 M20 *I.BS6I.8S9I.9S6Q8 V2@Q$3$5 V3@QA$AA# -0260 M21 *I.$S8I.AS5I7Q9I8 V2@Q$6$6 V3@Q9$D .0270 M22 *I.AS5I.7S9I.9S7Q9 V2@Q$6$3 V3@Q9$D -0280 M23 *I.$S6I.BS6I8Q9I6 V2@Q$3$3 V3@QDF3D ADDAH DF30 ADVAN 0000 BASE 0005 BDOS DDDC BDOSB DE08 BDOSJP 0002 BIOSEX DEE5 BREAK DEEE BRKBK 0050 BUFLEN E324 CALLPROG DED4 CB1 DEDC CB2 DC07 CBUFF DD00 CCP1 DC00 CCPLOC 2D80 CCPR DD04 CCP DCBD CHRCNT DC59 CIBPTR DC08 CIBUFF DC17 CIBUF DC5B CIPTR FFFF CLEVEL3 DE1E CLOSE E079 CMDSER DCBE CMDTBL E07E CMS1 E083 CMS2 E091 CMS3 E094 CMS4 DECF CNVBUF E309 COM1 E351 COM4 E35C COM5 E361 COM6 E36B COM7 DFDD COMLOG DC77 COMMSG E2EE COM DDBB CONIN DDB0 CONOUT 003E CPRMPT 000D CR DE41 CREATE DDA9 CRLF DDFF DEFDMA 0000 DEFUSR DE38 DELETE E2DC DFU E3A6 DFUSR E09B DIR E138 DIR10 E142 DIR11 E0CA DIR2 E0CB DIR2A E0D9 DIR3 E0FC DIR4 E104 DIR5 E106 DIR6 E121 DIR7 E123 DIR8 E137 DIR9 E0CB DIRPR DFC0 DIRPTR DFDA DLOG5 DFD3 DLOGIN DE02 DMASET DC00 ENTRY E14C ERA E168 ERA1 DF09 ERR1 DEFC ERR2 E3EC ERRJMP E3E9 ERRLOG DEF6 ERROR E379 EXECADR 0000 FALSE DCBB FCBCR DCAB FCBDM DC9B FCBDN DC9C FCBFN DCA4 FCBFT 007C FENCE E144 FILLQ E146 FQLP E387 GET DDFB GETDRV DE4A GETUSR E2E9 GO E0BE GOTSYS DE19 GRBDOS DF80 HEXNUM DF83 HNUM0 DF8B HNUM1 DFA2 HNUM2 DFBD HNUM3 E2E4 JUMP DDCB LC1 DDBF LCOUT 000A LF E177 LIST E3C0 LOADADR DE0B LOGIN DDC6 LSTOUT E1E1 LTAB 000F MAXUSR DC06 MBUFF E391 MEMLOAD E3C2 ML2 E3DB ML3 E39D MLA E3B4 MLA0 E3BF MLA1 E3E6 MLERR 0040 MSIZE 0004 NCHARS 000B NCMNDS 0018 NLINES DD25 NOLOG E192 NOSLAS DF58 NUM0 DF5E NUM1 DF7B NUM2 0048 NUMBASE DF42 NUMBER DF7D NUMERR DF4A NUMS DF54 NUMS1 DE10 OPENF DE17 OPEN DDB3 OUTPUT DCBC PAGCNT E1FB PAGER E212 PGBAK 0050 PGDFLG FFFF PGDFLT E205 PGFLG DDC1 PRFLG DDF0 PRIN1 DDE3 PRINTC DDE8 PRINT E3DF PRNLE DD9E PRNNF 0000 RAS DEB9 RB1 DD8D RCCPNL DDD7 READF DDDA READ DE6E REDBUF 0000 REL E273 REN E295 REN0 E2A7 REN1 E2BE REN2 E2CC REN3 E2CF REN4 DE06 RESET DE45 RESETUSR DD39 RESTRT DD29 RNGSUB DD5F RS000 DD5A RS00 DD62 RS1 DD8A RSTCCP E2D9 RSTJMP E214 SAVE E242 SAVE0 E249 SAVE1 E263 SAVE2 E26C SAVE3 E26F SAVE4 DF34 SBLANK DFE8 SCAN1 E037 SCAN10 E03E SCAN11 E04C SCAN12 E04E SCAN13 E050 SCAN14 E058 SCAN15 E05D SCAN16 E05F SCAN17 E06C SCAN18 E073 SCAN19 E00A SCAN2 E010 SCAN3 E016 SCAN4 E018 SCAN5 E026 SCAN6 E028 SCAN7 E02A SCAN8 E032 SCAN9 DFE7 SCANER DF13 SDELM DE25 SEAR1 DE22 SEARF DE29 SEARN 0053 SECTFLG DE5F SETU0D DE50 SETUD DE4C SETUSR DFC9 SLOGIN 0053 SOFLG 0024 SPRMPT DC77 STACK FFFF SUBA DC7A SUBFCB DC9A SUBFCR DC89 SUBFRC DC88 SUBFS2 DE2D SUBKIL FFFF SUPRES 0041 SYSFLG E0EB SYSTST 0009 TAB E1DA TABRST 0080 TBUFF DE60 TDRIVE DFDE TEMPDR 005C TFCB DE46 TMPUSR 0100 TPA FFFF TRUE E3A8 TSELUSR 0000 TWOCOL E17B TYPE E17C TYPE0 E1AA TYPE1 E1BB TYPE2 E1EC TYPE2L E1F6 TYPE3 E1F8 TYPE4 DE65 UCASE 0004 UDFLAG E2D2 USER DEF0 USRNUM 0000 WBOOT FFFF WIDE DE3C WRITE 0000 REL E273 REN E295 REN0 E2A7 REN1 E2BE REN2 E2CC REN3 E2CF REN4 DE06 RESET DE45 RESETUSR DD39 RESTRT DD29 RNGSUB DD5F RS000 DD5A RS00 DD62 RS1 DD8A RSTCCP E2D9 RSTJMP E214 SAVE E242 SAVE0 E249 SAVE1 E263 SAVE2 E26C SAVE3 E26F SAVE4 DF34 SBLANK DFE8 SCAN1 E037 SCAN10 E03E SCAN11 E04C SCAN12 E04E SCAN13 E050 SCAN14 E058 SCAN15 E05D SCAN16 E05F SCAN17 E06C SCAN18 E073 SCAN19 title 'ccpz version 4.1' ; ;cp/m console command processor (ccp) revision 4.1 ;for z80-based cp/m 2.x systems ; ;******** refer to ccpz-vxx. not file for revision history ******** ; ; ******** structure notes ******** ; ; this ccp is divided into a number of major sections. the following ; is an outline of these sections and the names of the major routines ; located therein. ; ; section function/routines ; ------- ----------------- ; ; -- opening comments, equates, and macro definitions ; ; 0 jmp table into ccp ; ; 1 buffers ; ; 2 ccp starting modules ; ccp1 ccp restrt rstccp rccpnl ; prnnf ; ; 3 utilities ; crlf conout conin lcout lstout ; readf read bdosb printc print ; getdrv defdma dmaset reset bdosjp ; login openf open grbdos close ; searf sear1 searn subkil delete ; write create resetusr getusr setusr ; ; 4 ccp utilities ; setud setu0d ucase redbuf cnvbuf ; break usrnum error sdelm advan ; sblank addah number numerr hexnum ; dirptcploc equ 0bd00h ;fill in with bdosloc supplied value ; ; note that you should only use one method or the other. ; do not define ccploc twice! ; ; the following gives the required offset to load the ccp into the ; cp/m sysgen image through ddt (the roffset command); note that this ; value conforms with the standard value presented in the cp/m reference ; manuals, but it may not necessarily conform with the location of the ; ccp in your cp/m system; several systems (morrow designs, p&t, heath ; org-0 to name a few) have the ccp located at a non-standard address in ; the sysgen image. ; ccpr equ 0980h-ccploc ;ddt load offset endif ; ras equ false ;set to true if ccp is for a remote-access system ; ; ;***note to apple softcard users*** ; ; in their infinite (?) wisdom (???), microsoft decided that the way to ; get a two-column directory display instead of four-column (narrow 40-col ; screen, remember) was to have their bios poke ccp every time it was ; loaded. naturally, that wil console." ; ; hence, to permit this to happen, the $$$.sub file must always ; be present on a specific drive, and a: is the choice for said drive. ; with this facility engaged as such, indirect command files like: ; ; dir ; a: ; dir ; ; can be executed, even though the currently logged-in drive is changed ; during execution. if the $$$.sub file was present on the currently ; logged-in drive, the above series of commands would not work since the ; ccpz would be looking for $$$.sub on the logged-in drive, and switching ; logged-in drives without moving the $$$.sub file as well would cause ; processing to abort. ; suba equ true ;set to true to have $$$.sub always on a: ;set to false to have $$$.sub on the logged-in drive ; ; the following flag enables extended processing for user-program supplied ; command lines. this is for command level 3 of ccpz. under the ccpz version ; 4.0 philosophy, three command levels exist: ; ; (1) that command issued by the user from his console ar slogin dlogin comlog scaner ; cmdser ; ; 5 ccp-resident commands and functions ; 5a dir dirpr fillq ; 5b era ; 5c list ; 5d type pager ; 5e save ; 5f ren ; 5g user ; 5h dfu ; 5i jump ; 5j go ; 5k com callprog errlog errjmp ; 5l get memload prnle ; ; false equ 0 true equ not false ; ; ; customization equates ; ; the following equates may be used to customize this ccp for the user's ; system and integration technique. the following constants are provided: ; ; rel - true if integration is to be done via movcpm ; - false if integration is to be done via ddt and sysgen ; ; base - base address of user's cp/m system (normally 0 for dr version) ; this equate allows easy modification by non-standard cp/m (eg,h89) ; ; ccploc - base page address of ccp; this value can be obtained by running ; the bdosloc program on your system, or by setting the ; msize and biosex equates to the system memory size in ; k-bytes and the "extra" memory required by your bios l turn into a random poke on any non-standard ; ccp, like this one. the best way to get this ccp up on the apple is to ; load it into cpm56. com, at location 0e00h in the image. the bios code ; that pokes the ccp can also be modified at that time. the poke is done ; by "sta 0c8b2h", found at 24feh in the cpm56 image. to eliminate the ; poke forever, change the "sta" to "lda" by changing the contents of ; location 24feh from 32h to 3ah. if you want a two-column display, set ; the twocol switch below to a value of true. ; twocol equ false ;true if two col dir instead of four ; ; the following is presented as an option, but is not generally user-customiz- ; able. a basic design choice had to be made in the design of ccpz concerning ; the execution of submit files. the original ccp had a problem in this sense ; in that it always looked for the submit file from drive a: and the submit ; program itself (submit.com) would place the $$$.sub file on the currently ; logged-in drive, so when tht the '>' prompt ; (2) that command issued by a $$$.sub file at the '$' prompt ; (3) that command issued by a user program by placing the command into ; cibuff and setting the character count in cbuff ; ; setting clevel3 to true enables extended processing of the third level of ; ccpz command. all the user program need do is to store the command line and ; set the character count; ccpz will initialize the pointers properly, store ; the ending zero properly, and capitalize the command line for processing. ; once the command line is properly stored, the user executes the command line ; by reentering the ccpz through ccploc [note: the c register must contain ; a valid user/disk flag (see location 4) at this time.] ; clevel3 equ true ;enable command level 3 processing ; ; ; *** terminal and 'type' customization equates ; nlines equ 24 ;number of lines on crt screen wide equ true ;true if wide dir display fence equ '|' ;sep char between dir files ; pgdflt equ true ;set to false t; in k-bytes. biosex is zero if your bios is normal size, ; and can be negative if your bios is in prom or in ; non-contiguous memory. ; ; ras - remote-access system; setting this equate to true disables ; certain ccp commands that are considered harmful in a remote- ; access environment; use under remote-access systems (rbbs) for ; security purposes ; rel equ false ;set to true for movcpm integration ; base equ 0 ;base of cp/m system (set for standard cp/m) ; if rel ccploc equ 0 ;movcpm image else ; ; if rel is false, the value of ccploc may be set in one ; of two ways. the first way is to set msize and biosex ; as described above using the following three lines: ; msize equ 64 ;size of mem in k-bytes biosex equ 2 ;extra # k-bytes in bios ccploc equ 3400h+(msize-20-biosex)*1024 ;ccp origin ; ; the second way is to obtain the origin of your current ; ccp using bdsloc or its equivalent, then merely set ccploc ; to that value as as in the following line: ; ;ce user was logged into b: and he issued a submit ; command, the $$$.sub was placed on b: and did not execute because the ccp ; looked for it on a: and never found it. ; ; after much debate it was decided to have ccpz perform the same type of ; function as ccp (look for the $$$.sub file on a:), but the problem with ; submit.com still exists. hence, rgf designed supersub and rlc took his ; supersub and designed sub from it; both programs are set up to allow the ; selection at assembly time of creating the $$$.sub on the logged-in drive ; or on drive a:. ; ; a final definition of the indirect command file ($$$.sub or submit ; file) is presented as follows: ; ; "an indirect command file is one which contains ; a series of commands exactly as they would be ; entered from a cp/m console. the submit command ; (or sub command) reads this files and transforms ; it for processing by the ccpz (the $$$.sub file). ; ccpz will then execute the commands indicated ; exactly as if they were typed at theo disable paging by default pgdflg equ 'P' ;for type command: page or not (dep on pgdflt) ;this flag reverses the default effect ; maxusr equ 15 ;maximum user number accessable ; sysflg equ 'A' ;for dir command: list $sys and $dir soflg equ 'S' ;for dir command: list $sys files only supres equ true ;supresses user # report for user 0 defusr equ 0 ;default user number for com files sprmpt equ '$' ;ccp prompt indicating submit command cprmpt equ '>' ;ccp prompt indicating user command numbase equ 'H' ;character used to switch from default ;number base sectflg equ 'S' ;option char for save command to save sectors ; ; end of customization section ; cr equ 0dh lf equ 0ah tab equ 09h ; wboot equ base+0000h ;cp/m warm boot address udflag equ base+0004h ;user num in high nybble, disk in low bdos equ base+0005h ;bdos function call entry pt tfcb equ base+005ch ;default fcb buffer tbuff equ base+0080h ;default disk i/o buffer tpa equ base+0100h ;base o; into this buffer ; ; in all cases, the command line is placed into the buffer starting at ; cibuff. this command line is terminated by the last character (not carriage ; return), and a character count of all characters in the command line ; up to and including the last character is placed into location cbuff ; (immediately before the command line at cibuff). the placed command line ; is then parsed, interpreted, and the indicated command is executed. ; if clevel3 is permitted, a terminating zero is placed after the command ; (otherwise the user program has to place this zero) and the cibptr is ; properly initialized (otherwise the user program has to init this ptr). ; if the command is placed by a user program, entering at ccploc is enough ; to have the command processed. again, under ccpz version 4.x, it is not ; necessary to store the pointer to cibuff in cibptr; ccpz will do this for ; the calling program if clevel3 is made true. ; ; warning: the command line must not exceed buflen cocess default command stored ; ccp1: xra a ;set no default command sta cbuff ; ; start ccp and possibly process default command ; ; note on modification by rgf: bdos returns 0ffh in ; accumulator whenever it logs in a directory, if any ; file name contains a '$' in it.this is now used as ; a clue to determine whether or not to do a search ; for submit file, in order to eliminate wasteful searches. ; ccp: lxi sp,stack ;reset stack push b mov a,c ;c=user/disk number (see loc 4) rar ;extract user number rar rar rar ani 0fh mov e,a ;set user number call setusr call reset ;reset disk system sta rngsub ;save submit clue from drive a: pop b mov a,c ;c=user/disk number (see loc 4) ani 0fh ;extract default disk drive sta tdrive ;set it jrz nolog ;skip if 0...already logged call login ;log in default disk ; if not suba ;if $$$.sub is on current drive sta rngsub ;bdos '$' clue endif ; nolog: lxi d,subfcb ;check for $$$.sub on f tpa ; ; ; macros to provide z80 extensions ; maclib z80 $*macro ;first turn off the expansions ; ; end of z80 macro extensions ; ; ; ; **** section 0 **** ; org ccploc ; ;entry points into ccpz ; ;if the ccpz is entered at location ccploc (at the jmp to ccp), then ; the default command in cibuff will be processed. if the ccpz is entered ; at location ccploc+3 (at the jmp to ccp1), then the default command in ; cibuff will not be processed. ; ;note: entry into ccpz in this way is permitted under ccpz version 4.0, ; but in order for this to work, cibuff and cbuff must be initialized properly ; and the c register must contain a valid user/disk flag (see location 4: the ; most significant nybble contains the user number and the least significant ; nybble contains the disk number). ; ;some user programs (such as synonym3) attempt to use the default ; command facility. under the original ccp, it was necessary to initialize ; the pointer after the reserved space for the coharacters in length. ; for user programs which load this command, the value of buflen can be ; obtained by examining the byte at mbuff (ccploc + 6). ; buflen equ 80 ;maximum buffer length mbuff db buflen ;maximum buffer length cbuff db 0 ;number of valid chars in command line cibuff db ' ' ;default (cold boot) command cibuf db 0 ;command string terminator db 'ccpz-v4.1' ;for dump identification ds buflen-($-cibuff)+1 ;total is 'buflen' bytes ; cibptr dw cibuff ;pointer to command input buffer ciptr dw cibuf ;ptr to curr cmd for error reporting ; ds 26 ;stack area stack equ $ ;top of stack ; ; file type for command ; commsg db 'COM' ; ; submit file control block ; subfcb equ $ if suba ;if $$$.sub on a: db 1 ;disk name set to default to drive a: else db 0 ;disk name set to default to current drive endif ; db '$$$' ;file name db ' ' db 'SUB' ;file type db 0 ;extent number db 0 ;s1 subfs2 ds 1 ;s2 subfrc ds 1 ;recordcurrent disk ; rngsub equ $+1 ;pointer for in-the-code modification mvi a,0 ;2nd byte (immediate arg) is the rngsub flag ora a ;set flags on clue cma ;prepare for coming 'cma' cnz sear1 cma ;0ffh is returned if no $$$.sub, so complement sta rngsub ;set flag (0=no $$$.sub) lda cbuff ;execute default command? ora a ;0=no jrnz rs1 ; ; prompt user and input command line from him ; restrt: lxi sp,stack ;reset stack ; ; print prompt (du>) ; call crlf ;print prompt call getdrv ;current drive is part of prompt adi 'A' ;convert to ascii a-p call conout call getusr ;get user number ; if supres ;if suppressing usr # report for usr 0 ora a jrz rs000 endif ; cpi 10 ;user < 10? jrc rs00 sui 10 ;subtract 10 from it push psw ;save it mvi a,'1' ;output 10's digit call conout pop psw ; rs00: adi '0' ;output 1's digit (convert to ascii) call conout ; ; read input line from user or $$$.sub ; rs000: call redbuf ;mmand buffer to point to ; the first byte of the command buffer. under version 4.x of ccpz, this is ; no longer the case. the cibptr (command input buffer pointer) is located ; to be compatible with such programs (provided they determine the buffer ; length from the byte at mbuff [ccploc + 6]), but under version 4.x of ccpz ; this is no longer necessary. ccpz version 4.x automatically initializes ; this buffer pointer in all cases. ; entry: jmp ccp ;process potential default command jmp ccp1 ;do not process potential default command ; ; ; ; **** section 1 **** ; ; buffers et al ; ; input command line and default command ; ; the command line to be executed is stored here. this command line ; is generated in one of three ways: ; ; (1) by the user entering it through the bdos readln function at ; the du> prompt [user input from keyboard] ; (2) by the submit file facility placing it there from a $$$.sub ; file ; (3) by an external program or user placing the required command  count ds 16 ;disk group map subfcr ds 1 ;current record number ; ; command file control block ; fcbdn ds 1 ;disk name fcbfn ds 8 ;file name fcbft ds 3 ;file type ds 1 ;extent number ds 2 ;s1 and s2 ds 1 ;record count fcbdm ds 16 ;disk group map fcbcr ds 1 ;current record number ; ; other buffers ; pagcnt db nlines-2 ;lines left on page chrcnt db 0 ;char count for type ; ; ccp built-in command table ; nchars equ 4 ;number of chars/command ; ; ccp command name table ; each table entry is composed of the 4-byte command and 2-byte address ; cmdtbl db 'DIR ' dw dir db 'LIST' dw list db 'TYPE' dw type db 'USER' dw user db 'DFU ' dw dfu ; if not ras ;for non-ras db 'GO ' dw go db 'ERA ' dw era db 'SAVE' dw save db 'REN ' dw ren db 'GET ' dw get db 'JUMP' dw jump endif ; ncmnds equ ($-cmdtbl)/(nchars+2) ; ; ; ; **** section 2 **** ; ccp starting points ; ; start ccp and don't pr input command line from user (or $$$.sub) ; ; process input line ; rs1 equ $ ; if clevel3 ;if third command level is permitted call cnvbuf ;capitalize command line, place ending 0, ;and set cibptr value endif ; call defdma ;set tbuff to dma address call getdrv ;get default drive number sta tdrive ;set it call scaner ;parse command name from command line cnz error ;error if command name contains a '?' lxi d,rstccp ;put return address of command push d ;on the stack lda tempdr ;is command of form 'd:command'? ora a ;nz=yes jnz com ;immediately call cmdser ;scan for ccp-resident command jnz com ;not ccp-resident mov a,m ;found it: get low-order part inx h ;get high-order part mov h,m ;store high mov l,a ;store low pchl ;execute ccp routine ; ; entry point for restarting ccp and logging in default drive ; rstccp: call dlogin ;log in default drive ; ; entry point for restarting ccp without logging in default drive  bdosjp: jmp bdos ; login: mov e,a mvi c,0eh jr bdosjp ;save some code space ; openf: xra a sta fcbcr lxi d,fcbdn ;fall thru to open ; open: mvi c,0fh ;fall thru to grbdos ; grbdos: call bdos inr a ;set zero flag for error return ret ; close: mvi c,10h jr grbdos ; searf: lxi d,fcbdn ;specify fcb ; sear1: mvi c,11h jr grbdos ; searn: mvi c,12h jr grbdos ; ; check for submit file in execution and abort it if so ; subkil: lxi h,rngsub ;check for submit file in execution mov a,m ora a ;0=no rz mvi m,0 ;abort submit file lxi d,subfcb ;delete $$$.sub ; delete: mvi c,13h jr bdosjp ;save more space ; write: mvi c,15h jmp bdosb ; create: mvi c,16h jr grbdos ; ; reset user number if changed ; resetusr equ $ ; tmpusr equ $+1 ;pointer for in-the-code modification mvi a,0 ;2nd byte (immediate arg) is tmpusr mov e,a ;place in e jr setusr ;then go set user getusr: mvi e,0ffh ;get current user number ; ommand level is permitted rz ;if (no abort), return to caller and run else ;if third command level is not permitted jrz cnvbuf ;if (no abort), capitalize command endif ; call subkil ;kill $$$.sub if abort jmp restrt ;restart ccp ; ; input command line from user console ; rb1: call subkil ;erase $$$.sub if present call setud ;set user and disk mvi a,cprmpt ;print prompt call conout mvi c,0ah ;read command line from user lxi d,mbuff call bdos ; if clevel3 ;if third command level is permitted jmp setu0d ;set current disk number in lower params else ;if third command level is not permitted call setu0d ;set current disk number if lower params ;and fall thru to cnvbuf endif ; ; capitalize string (ending in 0) in cbuff and set ptr for parsing ; cnvbuf: lxi h,cbuff ;pt to user's command mov b,m ;char count in b inr b ;add 1 in case of zero ; cb1: inx h ;pt to 1st valid char mov a,m ;capitalize command char; rccpnl: call scaner ;extract next token from command line lda fcbfn ;get first char of token sui ' ' ;any char? lxi h,tempdr ora m jnz error jr restrt ; ; no file error message ; prnnf: call printc ;no file message db 'No fil','e'+80h ret ; ; ; ; **** section 3 **** ; i/o utilities ; ; output char in reg a to console and don't change bc ; ; output ; crlf: mvi a,cr call conout mvi a,lf ;fall thru to conout ; conout: push b mvi c,02h ; output: mov e,a push h call bdos pop h pop b ret ; conin: mvi c,01h ;get char from con: with echo jr bdosb ; lcout: push psw ;output char to con: or lst: dep on prflg ; prflg equ $+1 ;pointer for in-the-code modification mvi a,0 ;2nd byte (immediate arg) is the print flag ora a ;0=type jrz lc1 pop psw ;get char ; ; output char in reg a to list device ; lstout: push b mvi c,05h jr output ; lc1: pop psw ;get char push psw call conout ;output tsetusr: mvi c,20h ;set user number to value in e (get if e=ffh) jr bdosjp ;more space saving ; ; end of bdos functions ; ; ; ; **** section 4 **** ; ccp utilities ; ; set user/disk flag to current user and default disk ; setud: call getusr ;get number of current user add a ;place it in high nybble add a add a add a lxi h,tdrive ;mask in default drive number (low nybble) ora m ;mask in sta udflag ;set user/disk number ret ; ; set user/disk flag to user 0 and default disk ; setu0d equ $ ; tdrive equ $+1 ;pointer for in-the-code modification mvi a,0 ;2nd byte (immediate arg) is tdrive sta udflag ;set user/disk number ret ; ; convert char in a to upper case ; ucase: cpi 61h ;lower-case a rc cpi 7bh ;greater than lower-case z? rnc ani 5fh ;capitalize ret ; ; input next command to ccp ; this routine determines if a submit file is being processed ; and extracts the command line from it if so or from the user's console ;  call ucase mov m,a djnz cb1 ;continue to end of command line ; cb2: mvi m,0 ;store ending lxi h,cibuff ;set command line ptr to 1st char shld cibptr ret ; ; check for any char from user console;ret w/zero set if none ; break: push d ;save de mvi c,11 ;csts check call bdosb cnz conin ;get input char ; brkbk: pop d ret ; ; get the requested user number from the command line and validate it. ; usrnum: call number cpi maxusr+1 rc ; ; invalid command -- print it ; error: call crlf ;new line lhld ciptr ;pt to beginning of command line ; err2: mov a,m ;get char cpi ' '+1 ;simple '?' if or less jrc err1 push h ;save ptr to error command char call conout ;print command char pop h ;get ptr inx h ;pt to next jr err2 ;continue ; err1: call print ;print '?' db '?'+80h call subkil ;terminate active $$$.sub if any jmp restrt ;restart ccp ; ; check to see if de pts to delimiter; if so, ret w/zero flo con: pop psw cpi lf ;check for paging jz pager ret ; readf: lxi d,fcbdn ;fall thru to read ; read: mvi c,14h ;fall thru to bdosb ; ; call bdos and save bc ; bdosb: push b call bdos pop b ora a ret ; ; print string (ending in 0) pted to by ret adr;start with ; printc: push psw ;save flags call crlf ;new line pop psw ; print: xthl ;get ptr to string push psw ;save flags call prin1 ;print string pop psw ;get flags xthl ;restore hl and ret adr ret ; ; print string (ending in 0) pted to by hl ; prin1: mov a,m ;get next byte call conout ;print char mov a,m ;get next byte again for test inx h ;pt to next byte ora a ;set flags rz ;done if zero rm ;done if msb set jr prin1 ; ; bdos function routines ; ; return number of current disk in a ; getdrv: mvi c,19h jr bdosjp ; ; set 80h as dma address ; defdma: lxi d,tbuff ;80h=tbuff ; dmaset: mvi c,1ah jr bdosjp ; reset: mvi c,0dh ;redbuf: lda rngsub ;submit file currently in execution? ora a ;0=no jrz rb1 ;get line from console if not lxi d,subfcb ;open $$$.sub push d ;save de call open pop d ;restore de jrz rb1 ;erase $$$.sub if end of file and get cmnd lda subfrc ;get value of last record in file dcr a ;pt to next to last record sta subfcr ;save new value of last record in $$$.sub call read ;de=subfcb jrnz rb1 ;abort $$$.sub if error in reading last rec lxi d,cbuff ;copy last record (next submit cmnd) to cbuff lxi h,tbuff ;from tbuff lxi b,buflen ;number of bytes ldir lxi h,subfs2 ;pt to s2 of $$$.sub fcb mvi m,0 ;set s2 to zero inx h ;pt to record count dcr m ;decrement record count of $$$.sub lxi d,subfcb ;close $$$.sub call close jrz rb1 ;abort $$$.sub if error mvi a,sprmpt ;print submit prompt call conout lxi h,cibuff ;print command line from $$$.sub call prin1 call break ;check for abort (any char) ; if clevel3 ;if third c ag set ; sdelm: ldax d ora a ;0=delimiter rz cpi ' ' ;error if < jrc error rz ;=delimiter cpi '=' ;'='=delimiter rz cpi 5fh ;underscore=delimiter rz cpi '.' ;'.'=delimiter rz cpi ':' ;':'=delimiter rz cpi ';' ;';'=delimiter rz cpi '<' ;'<'=delimiter rz cpi '>' ;'>'=delimiter ret ; ; advance input ptr to first non-blank and fall through to sblank ; advan: lded cibptr ; ; skip string pted to by de (string ends in 0) until end of string ; or non-blank encountered (beginning of token) ; sblank: ldax d ora a rz cpi ' ' rnz inx d jr sblank ; ; add a to hl (hl=hl+a) ; addah: add l mov l,a rnc inr h ret ; ; extract decimal number from command line ; return with value in reg a;all registers may be affected ; number: call scaner ;parse number and place in fcbfn lxi h,fcbfn+10 ;pt to end of token for conversion mvi b,11 ;11 chars max ; ; check for suffix for hexadecimal number ;  high of d mov d,a ;new high byte in d mov a,e ani 0f0h ;mask out low of e ora c ;mask in new low mov e,a ;new low byte in e djnz hnum1 ;count down ; ; return from hexnum ; hnum3: xchg ;returned value in hl mov a,l ;low-order byte in a ret ; ; pt to directory entry in tbuff whose offset is specified by a and c ; dirptr: lxi h,tbuff ;pt to temp buffer add c ;pt to 1st byte of dir entry call addah ;pt to desired byte in dir entry mov a,m ;get desired byte ret ; ; check for specified drive and log it in if not default ; slogin: xra a ;set fcbdn for default drive sta fcbdn call comlog ;check drive rz jr dlog5 ;do login otherwise ; ; check for specified drive and log in default drive if specified<>default ; dlogin: call comlog ;check drive rz ;abort if same lda tdrive ;log in default drive ; dlog5: jmp login ; ; routine common to both login routines; on exit, z set means abort ; comlog equ $ ; tempdr equ $+1 ;pinx d ;pt to next char in command line jr scan8 ; scan9: inx h ;pt to next byte in fcbdn mvi m,' ' ;fill filename part with djnz scan9 ; ; extract file type from possible filename.typ ; scan10: mvi b,3 ;prepare to extract type cpi '.' ;if (de) delimiter is a '.', we have a type jrnz scan15 ;fill file type bytes with inx d ;pt to char in command line after '.' ; scan11: call sdelm ;check for delimiter jrz scan15 ;fill rest of type if it is a delimiter inx h ;pt to next byte in fcbdn cpi '*' ;wild? jrnz scan12 ;store char if not wild mvi m,'?' ;store '?' and don't advance command line ptr jr scan13 ; scan12: mov m,a ;store char in fcbdn inx d ;pt to next char in command line ; scan13: djnz scan11 ;count down chars in file type (3 max) ; scan14: call sdelm ;skip rest of chars after 3-char type to jrz scan16 ;delimiter inx d jr scan14 ; scan15: inx h ;fill in rest of typ with mvi m,' ' djnz scan15 ; ;  nums: mov a,m ;get chars from end, searching for suffix dcx h ;back up cpi ' ' ;space? jrnz nums1 ;check for suffix djnz nums ;count down jr num0 ;by default, process ; nums1: cpi numbase ;check against base switch flag jrz hnum0 ; ; process decimal number ; num0: lxi h,fcbfn ;pt to beginning of token lxi b,1100h ;c=accumulated value, b=char count ; (c=0, b=11) ; num1: mov a,m ;get char cpi ' ' ;done if jrz num2 inx h ;pt to next char sui '0' ;convert to binary (ascii 0-9 to binary) cpi 10 ;error if >= 10 jrnc numerr mov d,a ;digit in d mov a,c ;new value = old value * 10 rlc rlc rlc add c ;check for range error jrc numerr add c ;check for range error jrc numerr add d ;new value = old value * 10 + digit jrc numerr ;check for range error mov c,a ;set new value djnz num1 ;count down ; ; return from number ; num2: mov a,c ;get accumulated value ret ; ; number error routine for spointer for in-the-code modification mvi a,0 ;2nd byte (immediate arg) is tempdr ora a ;0=no rz dcr a ;compare it against default lxi h,tdrive cmp m ret ;abort if same ; ; extract token from command line and place it into fcbdn; ; format fcbdn fcb if token resembles file name and type (filename.typ); ; on input, cibptr pts to char at which to start scan; ; on output, cibptr pts to char at which to continue and zero flag is reset ; if '?' is in token ; scaner: xra a ;a=0 to start at drive specification byte ; scan1: lxi h,fcbdn ;point to fcbdn call addah ;offset into fcb push h push h xra a ;set temporary drive number to default sta tempdr call advan ;skip to non-blank or end of line sded ciptr ;set ptr to non-blank or end of line pop h ;get ptr to next byte in fcbdn ldax d ;end of line? ora a ;0=yes jrz scan2 sbi 'A'-1 ;convert possible drive spec to number mov b,a ;store number (a:=0, b:=1, etc) in b inx d ;pt to next fill in ex, s1, s2, and rc with zeroes ; scan16: mvi b,4 ;4 bytes ; scan17: inx h ;pt to next byte in fcbdn mvi m,0 djnz scan17 ; ; scan complete -- de pts to delimiter byte after token ; sded cibptr ; ; set zero flag to indicate presence of '?' in filename.typ ; pop h ;get ptr to fcbdn in hl lxi b,11 ;scan for '?' in filename.typ (c=11 bytes) ; scan18: inx h ;pt to next byte in fcbdn mov a,m cpi '?' jrnz scan19 inr b ;b<>0 to indicate '?' encountered ; scan19: dcr c ;count down jrnz scan18 mov a,b ;a=b=number of '?' in filename.typ ora a ;set zero flag to indicate any '?' ret ; ; cmdtbl (command table) scanner ; on return, hl pts to address of command if ccp-resident ; on return, zero flag set means ccp-resident command ; cmdser: lxi h,cmdtbl ;pt to command table mvi c,ncmnds ;set command counter ; cms1: lxi d,fcbfn ;pt to stored command name mvi b,nchars ;number of chars/command (8 max) ; cms2: ldax d ;compare against tabace conservation ; numerr: jmp error ;use error routine - this is relative pt ; ; extract hexadecimal number from command line ; return with value in reg a; all registers may be affected ; hexnum: call scaner ;parse number and place in fcbfn ; hnum0: lxi h,fcbfn ;pt to token for conversion lxi d,0 ;de=accumulated value mvi b,11 ;b=char count ; hnum1: mov a,m ;get char cpi ' ' ;done? jrz hnum3 ;return if so cpi 'H' ;done if h suffix jrz hnum3 sui '0' ;convert to binary jrc numerr ;return and done if error cpi 10 ;0-9? jrc hnum2 sui 7 ;a-f? cpi 10h ;error? jrnc numerr ; hnum2: inx h ;pt to next char mov c,a ;digit in c mov a,d ;get accumulated value rlc ;exchange nybbles rlc rlc rlc ani 0f0h ;mask out low nybble mov d,a mov a,e ;switch low-order nybbles rlc rlc rlc rlc mov e,a ;high nybble of e=new high of e, ;low nybble of e=new low of d ani 0fh ;get new low of d ora d ;mask inchar ldax d ;see if it is a colon (:) cpi ':' jrz scan3 ;yes, we have a drive spec dcx d ;no, back up ptr to first non-blank char ; scan2: lda tdrive ;set 1st byte of fcbdn as default drive mov m,a jr scan4 ; scan3: mov a,b ;we have a drive spec sta tempdr ;set temporary drive mov m,b ;set 1st byte of fcbdn as specified drive inx d ;pt to byte after ':' ; ; extract filename from possible filename.typ ; scan4: mvi b,8 ;max of 8 chars in file name ; scan5: call sdelm ;done if delimiter encountered - fill jrz scan9 inx h ;pt to next byte in fcbdn cpi '*' ;is (de) a wild card? jrnz scan6 ;continue if not mvi m,'?' ;place '?' in fcbdn and don't advance de if so jr scan7 ; scan6: mov m,a ;store filename char in fcbdn inx d ;pt to next char in command line ; scan7: djnz scan5 ;decrement char count until 8 elapsed ; scan8: call sdelm ;8 chars or more - skip until delimiter jrz scan10 ;zero flag set if delimiter found !le entry cmp m jrnz cms3 ;no match inx d ;pt to next char inx h djnz cms2 ;count down ldax d ;next char in input command must be cpi ' ' jrnz cms4 ret ;command is ccp-resident (zero flag set) ; cms3: inx h ;skip to next command table entry djnz cms3 ; cms4: inx h ;skip address inx h dcr c ;decrement table entry number jrnz cms1 inr c ;clear zero flag ret ;command is disk-resident (zero flag clear) ; ; ; ; **** section 5 **** ; ccp-resident commands ; ; ; ;section 5a ;command: dir ;function: to display a directory of the files on disk ;forms: ; dir displays the dir files ; dir s displays the sys files ; dir a display both dir and sys files ; dir: mvi a,80h ;set system bit examination push psw call scaner ;extract possible d:filename.typ token call slogin ;log in drive if necessary lxi h,fcbfn ;make fcb wild (all '?') if no filename.typ mov a,m ;get first char of filename.typ cpi ' '  ;a=offset call dirptr ;hl now pts to 1st byte of file name ani 7fh ;mask out msb cpi ' ' ;no file name? jrnz dir8 ;print file name if present pop psw push psw cpi 03h jrnz dir7 mvi a,09h ;pt to 1st byte of file type call dirptr ;hl now pts to 1st byte of file type ani 7fh ;mask out msb cpi ' ' ;no file type? jrz dir9 ;continue if so ; dir7: mvi a,' ' ;output ; dir8: call conout ;print char inr b ;incr char count mov a,b cpi 12 ;end of filename.typ? jrnc dir9 ;continue if so cpi 09h ;end if filename only? jrnz dir6 ;print typ if so mvi a,'.' ;print dot between file name and type call conout jr dir6 ; dir9: pop psw ; dir10: call break ;check for abort jrnz dir11 call searn ;search for next file jr dir3 ;continue ; dir11: pop d ;restore stack ret ; ; fill fcb @hl with '?' ; fillq: mvi b,11 ;number of chars in fn & ft ; fqlp: mvi m,'?' ;store '?' inx h djnz fqlp ret ; ; ; fer call addah ;compute address of next char from offset mov a,m ;get next char ani 7fh ;mask out msb cpi 1ah ;end of file (^z)? rz ;restart ccp if so ; ; output char to con: or lst: device with tabulation ; cpi cr ;reset tab count? jrz tabrst cpi lf ;reset tab count? jrz tabrst cpi tab ;tab? jrz ltab call lcout ;output char inr b ;increment char count jr type2l ; tabrst: call lcout ;output or mvi b,0 ;reset tab counter jr type2l ; ltab: mvi a,' ' ; call lcout inr b ;incr pos count mov a,b ani 7 jrnz ltab ; ; continue processing ; type2l: call break ;check for abort jrz type1 ;continue if no char cpi 'C'-'@' ;^c? rz ;restart if so jr type1 ; type3: dcr a ;no error? rz ;restart ccp ; type4: jmp errlog ; ; paging routines ; pager counts down lines and pauses for input (direct) if count expires ; pagset sets lines/page count ; pager: push h lxi h,pagcnt ;count down dc ;if , all wild cz fillq call advan ;look at next input char mvi b,0 ;sys token default jrz dir2 ;jump; there isn't one cpi sysflg ;system flag specifier? jrz gotsys ;got system specifier cpi soflg ;sys only? jrnz dir2 mvi b,80h ;flag sys only ; gotsys: inx d sded cibptr cpi soflg ;sys only spec? jrz dir2 ;then leave bit spec unchagned pop psw ;get flag xra a ;set no system bit examination push psw ; dir2: pop psw ;get flag ; dir2a: ;drop into dirpr to print directory ; then restart ccp ; ; directory print routine; on entry, msb of a is 1 (80h) if system files excl ; dirpr: mov d,a ;store system flag in d mvi e,0 ;set column counter to zero push d ;save column counter (e) and system flag (d) mov a,b ;sys only specifier sta systst call searf ;search for specified file (first occurrance) cz prnnf ;print no file msg;reg a not changed ; ; entry selection loop; on entry, a=offset from searf or searn ; di ;section 5b ;command: era ;function: erase files ;forms: ; era erase specified files and print their names ; if not ras ;not for remote-access system ; era: call scaner ;parse file specification cpi 11 ;all wild (all files = 11 '?')? jrnz era1 ;if not, then do erases call printc db 'All','?'+80h call conin ;get reply call ucase ;capitalize cpi 'Y' ;yes? jnz restrt ;restart ccp if not call crlf ;new line ; era1: call slogin ;log in selected disk if any xra a ;print all files (examine system bit) mov b,a ;no sys-only opt to dirpr call dirpr ;print directory of erased files lxi d,fcbdn ;delete file specified call delete ret ;reenter ccp ; endif ; ; ; ;section 5c ;command: list ;function: print out specified file on the lst: device ;forms: ; list print file (no paging) ; list: mvi a,0ffh ;turn on printer flag jr type0 ; ; ; ;section 5d ;command: type ;function: print out specified file on the con: devicr m jrnz pgbak ;jump if not end of page mvi m,nlines-2 ;refill counter ; pgflg equ $+1 ;pointer to in-the-code buffer pgflg mvi a,0 ;0 may be changed by pgflg equate cpi pgdflg ;page default override option wanted? ; if pgdflt ;if paging is default jrz pgbak ;pgdflg means no paging, please else ;if paging not default jrnz pgbak ;pgdflg means please paginate endif ; call conin ;get char to continue cpi 'C'-'@' ;^c jz rstccp ;restart ccp ; pgbak: pop h ;restore hl ret ; ; ; ;section 5e ;command: save ;function: to save the contents of the tpa onto disk as a file ;forms: ; save ; save specified number of pages (start at 100h) ; from tpa into specified file; is in dec ; save s ; like save above, but numeric argument specifies ; number of sectors rather than pages ; if not ras ;not for remote-access system ; save: call number ;extract number from command line r3: jrz dir11 ;done if zero flag set dcr a ;adjust to returned value rrc ;convert number to offset into tbuff rrc rrc ani 60h mov c,a ;offset into tbuff in c (c=offset to entry) mvi a,10 ;add 10 to pt to system file attribute bit call dirptr pop d ;get system bit mask from d push d ana d ;mask for system bit ; systst equ $+1 ;pointer to in-the-code buffer systst cpi 0 jrnz dir10 pop d ;get entry count (= counter) mov a,e ;add 1 to it inr e push d ;save it ; if twocol ani 01h ;output if 2 entries printed in line else ani 03h ;output if 4 entries printed in line endif ; push psw jrnz dir4 call crlf ;new line jr dir5 ; dir4: call print ; if wide db ' ' ;2 spaces db fence ;then fence char db ' ',' '+80h ;then 2 more spaces else db ' ' ;space db fence ;then fence char db ' '+80h ;then space endif ; dir5: mvi b,01h ;pt to 1st byte of file name ; dir6: mov a,be ;forms: ; type print file ; type p print file with paging flag ; type: xra a ;turn off printer flag ; ; entry point for ccp list function (list) ; type0: sta prflg ;set flag call scaner ;extract filename.typ token jnz error ;error if any question marks call advan ;get pgdflg if it's there sta pgflg ;save it as a flag jrz noslas ;jump if input ended inx d ;put new buf pointer xchg shld cibptr ; noslas: call slogin ;log in selected disk if any call openf ;open selected file jz type4 ;abort if error call crlf ;new line mvi a,nlines-1 ;set line count sta pagcnt lxi h,chrcnt ;set char position/count mvi m,0ffh ;empty line mvi b,0 ;set tab char counter ; type1: lxi h,chrcnt ;pt to char position/count mov a,m ;end of buffer? cpi 80h jrc type2 push h ;read next block call readf pop h jrnz type3 ;error? xra a ;reset count mov m,a ; type2: inr m ;increment char count lxi h,tbuff ;pt to buf! push psw ;save it call scaner ;extract filename.type jnz error ;must be no '?' in it call slogin ;log in selected disk lxi d,fcbdn ;delete file in case it already exists push d call delete pop d call create ;make new file jrz save3 ;error? xra a ;set record count field of new file's fcb sta fcbcr pop psw ;get page count mov l,a ;hl=page count mvi h,0 push h call advan ;look for 's' for sector option inx d ;pt to after 's' token pop h cpi sectflg jrz save0 dcx d ;no 's' token, so back up dad h ;double it for hl=sector (128 bytes) count ; save0: sded cibptr ;set ptr to bad token or after good token lxi d,tpa ;pt to start of save area (tpa) ; save1: mov a,h ;done with save? ora l ;hl=0 if so jrz save2 dcx h ;count down on sectors push h ;save ptr to block to save lxi h,128 ;128 bytes per sector dad d ;pt to next sector push h ;save on stack call dmaset ;set dma address for write (address ilt user number for the command/file scanner (memload) ;forms: ; dfu select default user number; is in dec ; dfu: call usrnum ;get user number sta dfusr ;put it away jr rstjmp ;restart ccp (no default login) ; ; ; ;section 5i ;command: jump ;function: to call the program (subroutine) at the specified address ; without loading from disk ;forms: ; jump call at ; is in hex ; if not ras ;not for remote-access system ; jump: call hexnum ;get load address in hl jr callprog ;perform call ; endif ; ; ; ;section 5j ;command: go ;function: to call the program in the tpa without loading ; loading from disk. same as jump 100h, but much ; more convenient, especially when used with ; parameters for programs like stat. also can be ; allowed on remote-access systems with no problems. ; ;form: ; go ; if not ras ;only if ras ; go: lxi h,tpa ;always to tpa jr callprog ;perform call ; endif ; ; ;  run loaded transient program ; com7: mov a,b ;save char count sta tbuff call crlf ;new line call defdma ;set dma to 0080 call setud ;set user/disk ; ; execution (call) of program (subroutine) occurs here ; execadr equ $+1 ;change address for in-line code modification call tpa ;call transient call defdma ;set dma to 0080, in case ;prog changed it on us call setu0d ;set user 0/disk call login ;login disk jmp restrt ;restart ccp ; ; ; ;section 5l ;command: get ;function: to load the specified file from disk to the specified address ;forms: ; get load the specified file at the specified page; ; is in hex ; if not ras ;not for remote-access system ; get: call hexnum ;get load address in hl push h ;save address call scaner ;get file name pop h ;restore address jrnz errjmp ;must be unambiguous ; ; fall thru to memload ; endif ; ; load memory with the file whose name is specified in the command line ; on inn de) lxi d,fcbdn ;write sector call write pop d ;get ptr to next sector in de pop h ;get sector count jrnz save3 ;write error? jr save1 ;continue ; save2: lxi d,fcbdn ;close saved file call close inr a ;error? jrnz save4 ; save3: call prnle ;print 'no space' error ; save4: call defdma ;set dma to 0080 ret ;restart ccp ; endif ; ; ; ;section 5f ;command: ren ;function: to change the name of an existing file ;forms: ; ren = perform function ; if not ras ;not for remote-access system ; ren: call scaner ;extract file name jnz error ;error if any '?' in it lda tempdr ;save current default disk push psw call slogin ;log in selected disk call searf ;look for specified file jrz ren0 ;continue if not found call printc db 'File exist','s'+80h pop psw ;clear stack ret ;restart ccp ; ren0: lxi h,fcbdn ;save new file name lxi d,fcbdm lxi b,16 ;16 bytes ldir call advan ;advance ci ;section 5k ;command: com file processing ;function: to load the specified com file from disk and execute it ;forms: ; ; com: lda fcbfn ;any command? cpi ' ' ;' ' means command was 'd:' to switch jrnz com1 ;not , so must be transient or error lda tempdr ;look for drive spec ora a ;if zero, just blank jz rccpnl dcr a ;adjust for log in sta tdrive ;set default drive call setu0d ;set drive with user 0 call login ;log in drive jmp rccpnl ;restart ccp ; com1: lda fcbft ;file type must be blank cpi ' ' jnz error lxi h,commsg ;place default file type (com) into fcb lxi d,fcbft ;copy into file type lxi b,3 ;3 bytes ldir lxi h,tpa ;set execution/load address push h ;save for execution call memload ;load memory with file specified in cmd line ;(no return if error or too big) pop h ;get execution address ; ; callprog is the entry point for the execution of the loaded ; program;on entry to this routine, hl must put, hl contains starting address to load ; ; exit back to caller if no error.if com file too big or memory ; full, exit to mlerr. ; memload: shld loadadr ;set load address call getusr ;get current user number sta tmpusr ;save it for later sta tselusr ;temp user to select ; ; mla is a reentry point for a non-standard cp/m modification ; this is the return point for when the .com (or get) file is not found the ; first time, drive a: is selected for a second attempt. ; mla: call slogin ;log in specified drive if any call openf ;open command.com file jrnz mla1 ;file found - load it ; ; error routine to select user 0 if all else fails ; dfusr equ $+1 ;mark in-the-code variable mvi a,defusr ;get default user ; tselusr equ $+1 ;mark in-the-code variable cpi defusr ;same? jrz mla0 ;jump if so sta tselusr ;else put down new one mov e,a call setusr ;go set new user number jr mla ;and try again ; ; error routine to select drive a: if default was orbptr cpi '=' ;'=' ok jrnz ren4 ; ren1: xchg ;pt to char after '=' in hl inx h shld cibptr ;save ptr to old file name call scaner ;extract filename.typ token jrnz ren4 ;error if any '?' pop psw ;get old default drive mov b,a ;save it lxi h,tempdr ;compare it against current default drive mov a,m ;match? ora a jrz ren2 cmp b ;check for drive error mov m,b jrnz ren4 ; ren2: mov m,b xra a sta fcbdn ;set default drive lxi d,fcbdn ;rename file mvi c,17h ;bdos rename fct call grbdos rnz ; ren3: call prnnf ;print no file msg ; ren4: jmp errlog ; endif ; ; ; ;section 5g ;command: user ;function: change current user number ;forms: ; user select specified user number; is in dec ; user: call usrnum ;extract user number from command line mov e,a ;place user number in e call setusr ;set specified user ; rstjmp: jmp rccpnl ;restart ccp ; ; ; ;section 5h ;command: dfu ;function: set the defaucontain the execution ; address of the program (subroutine) to execute ; callprog: shld execadr ;perform in-line code modification call dlogin ;log in default drive call scaner ;search command line for next token lxi h,tempdr ;save ptr to drive spec push h mov a,m ;set drive spec sta fcbdn mvi a,10h ;offset for 2nd file spec call scan1 ;scan for it and load it into fcbdn+16 pop h ;set up drive specs mov a,m sta fcbdm xra a sta fcbcr lxi d,tfcb ;copy to default fcb lxi h,fcbdn ;from fcbdn lxi b,33 ;set up default fcb ldir lxi h,cibuff ; com4: mov a,m ;skip to end of 2nd file name ora a ;end of line? jrz com5 cpi ' ' ;end of token? jrz com5 inx h jr com4 ; ; load command line into tbuff ; com5: mvi b,0 ;set char count lxi d,tbuff+1 ;pt to char pos ; com6: mov a,m ;copy command line to tbuff stax d ora a ;done if zero jrz com7 inr b ;incr char count inx h ;pt to next inx d jr com6 ; ;"iginally selected ; mla0: lxi h,tempdr ;get drive from current command xra a ;a=0 ora m jrnz mlerr ;error if already disk a: mvi m,1 ;select drive a: jr mla ; ; file found -- proceed with load ; mla1 equ $ ; loadadr equ $+1 ;memory load address (in-line code mod) lxi h,tpa ;set start address of memory load ; ml2: mvi a,entry/256-1 ;get high-order adr of just below ccp cmp h ;are we going to overwrite the ccp? jrc prnle ;error if so push h ;save address of next sector xchg ;... in de call dmaset ;set dma address for load lxi d,fcbdn ;read next sector call read pop h ;get address of next sector jrnz ml3 ;read error or eof? lxi d,128 ;move 128 bytes per sector dad d ;pt to next sector in hl jr ml2 ; ml3: dcr a ;load complete jz resetusr ;if zero, ok, go reset correct user ;# on way out, else fall through to prnle ; ; load error ; prnle: call printc db 'Ful','l'+80h ; ; transient load error ; mlerr: call PE FROM POSSIBLE FILENAME.TYP ; SCAN10: MVI B,3 ;PREPARE TO EXTRACT TYPE CPI '.' ;IF (DE) DELIMITER IS A '.', WE HAVE CAN8 SCAN9: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,' ' ;FILL FILENAME PART WITH DJNZ SCAN9 ; ; EXTRACT FILE TY MORE - SKIP UNTIL DELIMITER JRZ SCAN10 ;ZERO FLAG SET IF DELIMITER FOUND INX D ;PT TO NEXT CHAR IN COMMAND LINE JR S;PT TO NEXT CHAR IN COMMAND LINE SCAN7: DJNZ SCAN5 ;DECREMENT CHAR COUNT UNTIL 8 ELAPSED SCAN8: CALL SDELM ;8 CHARS ORI M,'?' ;PLACE '?' IN FCBDN AND DON'T ADVANCE DE IF SO JR SCAN7 SCAN6: MOV M,A ;STORE FILENAME CHAR IN FCBDN INX D P> FILL JRZ SCAN9 INX H ;PT TO NEXT BYTE IN FCBDN CPI '*' ;IS (DE) A WILD CARD? JRNZ SCAN6 ;CONTINUE IF NOT MVIBLE FILENAME.TYP ; SCAN4: MVI B,8 ;MAX OF 8 CHARS IN FILE NAME SCAN5: CALL SDELM ;DONE IF DELIMITER ENCOUNTERED - = 10 JRNC NUMERR MOV D,A ;DIGIT IN D MOV A,C ;NEW VALUE = OLD VALUE * 10 RLC RLC RLC ADD C ;CHECPI ' ' ;DONE IF JRZ NUM2 INX H ;PT TO NEXT CHAR SUI '0' ;CONVERT TO BINARY (ASCII 0-9 TO BINARY) CPI 10 ;EPT TO BEGINNING OF TOKEN LXI B,1100H ;C=ACCUMULATED VALUE, B=CHAR COUNT ; (C=0, B=11) NUM1: MOV A,M ;GET CHAR ELIMITER BYTE AFTER TOKEN ; SDED CIBPTR ; ; SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN FILENAME.TYP ; POP H ;GET PT: MVI B,4 ;4 BYTES SCAN17: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,0 DJNZ SCAN17 ; ; SCAN COMPLETE -- DE PTS TO D15: INX H ;FILL IN REST OF TYP WITH MVI M,' ' DJNZ SCAN15 ; ; FILL IN EX, S1, S2, AND RC WITH ZEROES ; SCAN16(3 MAX) SCAN14: CALL SDELM ;SKIP REST OF CHARS AFTER 3-CHAR TYPE TO JRZ SCAN16 ; DELIMITER INX D JR SCAN14 SCANOV M,A ;STORE CHAR IN FCBDN INX D ;PT TO NEXT CHAR IN COMMAND LINE SCAN13: DJNZ SCAN11 ;COUNT DOWN CHARS IN FILE TYPE ? JRNZ SCAN12 ;STORE CHAR IF NOT WILD MVI M,'?' ;STORE '?' AND DON'T ADVANCE COMMAND LINE PTR JR SCAN13 SCAN12: MCHECK FOR DELIMITER JRZ SCAN15 ;FILL REST OF TYPE IF IT IS A DELIMITER INX H ;PT TO NEXT BYTE IN FCBDN CPI '*' ;WILDA TYPE JRNZ SCAN15 ;FILL FILE TYPE BYTES WITH INX D ;PT TO CHAR IN COMMAND LINE AFTER '.' SCAN11: CALL SDELM ;RT IF SAME ; ; EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCBDN; ; FORMAT FCBDN FCB IF TOKEN RESEMBLES FILE NAME ANDYTE (IMMEDIATE ARG) IS TEMPDR ORA A ;0=NO RZ DCR A ;COMPARE IT AGAINST DEFAULT LXI H,TDRIVE CMP M RET ;ABOOGIN ROUTINES; ON EXIT, Z SET MEANS ABORT ; COMLOG: TEMPDR EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BOG ;CHECK DRIVE RZ ;ABORT IF SAME LDA TDRIVE ;LOG IN DEFAULT DRIVE ; DLOG5: JMP LOGIN ; ; ROUTINE COMMON TO BOTH LOG5 ;DO LOGIN OTHERWISE ; ; CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT ; DLOGIN: CALL COMLIT IN IF NOT DEFAULT ; SLOGIN: XRA A ;SET FCBDN FOR DEFAULT DRIVE STA FCBDN CALL COMLOG ;CHECK DRIVE RZ JR DLRY CALL ADDAH ;PT TO DESIRED BYTE IN DIR ENTRY MOV A,M ;GET DESIRED BYTE RET ; ; CHECK FOR SPECIFIED DRIVE AND LOG N TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C ; DIRPTR: LXI H,TBUFF ;PT TO TEMP BUFFER ADD C ;PT TO 1ST BYTE OF DIR ENT" TITLE 'CCPZ Version 4.1' ; ; CP/M CONSOLE COMMAND PROCESSOR (CCP) Revision 4.1 ; FOR Z80-BASED CP/M 2.X SYSTEMS ; ; ORIGINAL CCP DISASSEMBLED BY ???? ; ORIGINAL CCP DISASSEMBLED FURTHER BY RLC ; ORIGINAL CCP COMMENTED BY RLC ; CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 ; FURTHER MODIFIED BY RLC AS V2.1 ; FURTHER MODIFIED BY KBP AS V2.2 ; FURTHER MODIFIED BY RLC AS V2.4 (V2.3 skipped) ; FURTHER MODIFIED BY RLC AS V2.5 ; FURTHER MODIFIED BY RLC AS V2.6 ; FURTHUR MODIFIED BY SBB AS V2.7 ; FURTHER MODIFIED BY RLC AS V2.8 ; FURTHER MODIFIED BY RLC AS V2.9 ; FURTHER MODIFIED BY RLC AS V3.0 ; FURTHER MODIFIED BY RLC AS V3.1 ; FURTHER MODIFIED BY RLC AS V4.0 ; SBB V4.1 11/27/81 ; ;******** Refer to CCPZ-Vxx.NOT File for Revision History ******** ; ;******** Structure Notes ******** ; ; This CCP is divided into a number of major sections. The following ; is an outline of these sections and the names of the major routines ; located therein. ; ; Section Function/ironment; use under Remote-Access Systems (RBBS) for ; security purposes ; REL EQU FALSE ;SET TO TRUE FOR MOVCPM INTEGRATION ; BASE EQU 0 ;BASE OF CP/M SYSTEM (SET FOR STANDARD CP/M) ; IF REL CCPLOC EQU 0 ;MOVCPM IMAGE ELSE ; ; If REL is FALSE, the value of CCPLOC may be set in one ; of two ways. The first way is to set MSIZE and BIOSEX ; as described above using the following three lines: ; MSIZE EQU 64 ;SIZE OF MEM IN K-BYTES BIOSEX EQU 2 ;EXTRA # K-BYTES IN BIOS CCPLOC EQU 3400H+(MSIZE-20-BIOSEX)*1024 ;CCP ORIGIN ; ; The second way is to obtain the origin of your current ; CCP using BDSLOC or its equivalent, then merely set CCPLOC ; to that value as as in the following line: ; ;CCPLOC EQU 0BD00H ;FILL IN WITH BDOSLOC SUPPLIED VALUE ; ; Note that you should only use one method or the other. ; Do NOT define CCPLOC twice! ; ; The following gives the required offset to load the CCP into the ; CP/M SYSGEN Image through DDT (the Roffset command); Note that this ; value conformh debate it was decided to have CCPZ perform the same type of ; function as CCP (look for the $$$.SUB file on A:), but the problem with ; SUBMIT.COM still exists. Hence, RGF designed SuperSUB and RLC took his ; SuperSUB and designed SUB from it; both programs are set up to allow the ; selection at assembly time of creating the $$$.SUB on the logged-in drive ; or on drive A:. ; ; A final definition of the Indirect Command File ($$$.SUB or SUBMIT ; File) is presented as follows: ; ; "An Indirect Command File is one which contains ; a series of commands exactly as they would be ; entered from a CP/M Console. The SUBMIT Command ; (or SUB Command) reads this files and transforms ; it for processing by the CCPZ (the $$$.SUB File). ; CCPZ will then execute the commands indicated ; EXACTLY as if they were typed at the Console." ; ; Hence, to permit this to happen, the $$$.SUB file must always ; be present on a specific drive, and A: is the choice for said drive. ; With this faciliRoutines ; ------- ----------------- ; ; -- Opening Comments, Equates, and Macro Definitions ; ; 0 JMP Table into CCP ; ; 1 Buffers ; ; 2 CCP Starting Modules ; CCP1 CCP RESTRT RSTCCP RCCPNL ; PRNNF ; ; 3 Utilities ; CRLF CONOUT CONIN LCOUT LSTOUT ; READF READ BDOSB PRINTC PRINT ; GETDRV DEFDMA DMASET RESET BDOSJP ; LOGIN OPENF OPEN GRBDOS CLOSE ; SEARF SEAR1 SEARN SUBKIL DELETE ; WRITE CREATE RESETUSR GETUSR SETUSR ; ; 4 CCP Utilities ; SETUD SETU0D UCASE REDBUF CNVBUF ; BREAK USRNUM ERROR SDELM ADVAN ; SBLANK ADDAH NUMBER NUMERR HEXNUM ; DIRPTR SLOGIN DLOGIN COMLOG SCANER ; CMDSER ; ; 5 CCP-Resident Commands and Functions ; 5A DIR DIRPR FILLQ ; 5B ERA ; 5C LIST ; 5D TYPE PAGER ; 5E SAVE ; 5F REN ; 5G USER ; 5H DFU ; 5I JUMP ; 5J GO ; 5K COM CALLPROG ERRLOG ERRJMP ; 5L GET MEMLOAD PRNLE ; ; FALSE EQU 0 TRUE EQU NOT FALSE ; ; CUSTOMIZATION EQUATES ;s with the standard value presented in the CP/M reference ; manuals, but it may not necessarily conform with the location of the ; CCP in YOUR CP/M system; several systems (Morrow Designs, P&T, Heath ; Org-0 to name a few) have the CCP located at a non-standard address in ; the SYSGEN Image. ; CCPR EQU 0980H-CCPLOC ;DDT LOAD OFFSET ;CCPR EQU 1100H-CCPLOC ;DDT LOAD OFFSET FOR MORROW DESIGNS ;CCPR EQU 0E00H-CCPLOC ;DDT LOAD OFFSET FOR APPLE SOFTCARD 56K ENDIF ; RAS EQU FALSE ;SET TO TRUE IF CCP IS FOR A REMOTE-ACCESS SYSTEM ; ; *** Note to Apple Softcard Users *** ; ; In their infinite (?) wisdom (???), Microsoft decided that the way to ; get a two-column directory display instead of four-column (narrow 40-col ; screen, remember) was to have their BIOS poke CCP every time it was ; loaded. Naturally, that will turn into a random poke on any non-standard ; CCP, like this one. The best way to get this CCP up on the Apple is to ; load it into CPM56.COM, at location 0E00H in the image. Thty engaged as such, Indirect Command Files like: ; ; DIR ; A: ; DIR ; ; can be executed, even though the currently logged-in drive is changed ; during execution. If the $$$.SUB file was present on the currently ; logged-in drive, the above series of commands would not work since the ; CCPZ would be looking for $$$.SUB on the logged-in drive, and switching ; logged-in drives without moving the $$$.SUB file as well would cause ; processing to abort. ; SUBA EQU TRUE ; Set to TRUE to have $$$.SUB always on A: ; Set to FALSE to have $$$.SUB on the logged-in drive ; ; The following flag enables extended processing for user-program supplied ; command lines. This is for Command Level 3 of CCPZ. Under the CCPZ Version ; 4.0 philosophy, three command levels exist: ; ; (1) that command issued by the user from his console at the '>' prompt ; (2) that command issued by a $$$.SUB file at the '$' prompt ; (3) that command issued by a user program by placing the command into ; CIB ; The following equates may be used to customize this CCP for the user's ; system and integration technique. The following constants are provided: ; ; REL - TRUE if integration is to be done via MOVCPM ; - FALSE if integration is to be done via DDT and SYSGEN ; ; BASE - Base Address of user's CP/M system (normally 0 for DR version) ; This equate allows easy modification by non-standard CP/M (eg,H89) ; ; CCPLOC - Base Page Address of CCP; this value can be obtained by running ; the BDOSLOC program on your system, or by setting the ; MSIZE and BIOSEX equates to the system memory size in ; K-bytes and the "extra" memory required by your BIOS ; in K-bytes. BIOSEX is zero if your BIOS is normal size, ; and can be negative if your BIOS is in PROM or in ; non-contiguous memory. ; ; RAS - Remote-Access System; setting this equate to TRUE disables ; certain CCP commands that are considered harmful in a Remote- ; Access enve BIOS code ; that pokes the CCP can also be modified at that time. The poke is done ; by "STA 0C8B2H", found at 24FEH in the CPM56 image. To eliminate the ; poke forever, change the "STA" to "LDA" by changing the contents of ; location 24FEH from 32H to 3AH. If you want a two-column display, set ; the TWOCOL switch below to a value of TRUE. ; TWOCOL EQU FALSE ;TRUE IF TWO COL DIR INSTEAD OF FOUR ; ; The following is presented as an option, but is not generally user-customiz- ; able. A basic design choice had to be made in the design of CCPZ concerning ; the execution of SUBMIT files. The original CCP had a problem in this sense ; in that it ALWAYS looked for the SUBMIT file from drive A: and the SUBMIT ; program itself (SUBMIT.COM) would place the $$$.SUB file on the currently ; logged-in drive, so when the user was logged into B: and he issued a SUBMIT ; command, the $$$.SUB was placed on B: and did not execute because the CCP ; looked for it on A: and never found it. ; ; After muc# Documentation for MUSPAT.HEX Written by: Tom Digate Version 1.0 - Dec., 1979 MUSPAT.HEX is a file that is to be used with Software Technology Music System and SOL-20 machines. It adds the ability to SAVE and GET programs from files on a CP/M disk as well as still being able to go to SOLOS to read and save files from tape. To install the HEX file you must boot up your CP/M system and then RESTART to SOLOS. Then using the SOLOS GET command, load MUSIC from tape like this: GET MUSIC/1 100 After the tape is read in, EXEC 0 and your CP/M system should warm boot. Now save 18 pages using the CP/M SAVE command. You now have a copy of the MUSIC program on the disk which needs to be modified with the HEX file. To do this, type DDT MUSIC.COM IMUSIC.HEX R -^C A>SAVE 18 MUSIC.COM The installation is now complete. To run, just type MUSIC and hit return. The title will list the additional commands that have been added to MUSIC. R Returns to SOLOS RS Will ask for name and then save file on disk RG Will ask for name and then get file from disk RC Will warm boot back to CP/M The filename is entered like SOLOS tape file names. Example: RG Enter name of Song? CHORA/2 This will get a file called CHORA from drive B:. Once a drive has been specified, it will be a default drive on future disk accesses for reads or writes. On startup, the default is always drive B:. MUSIC does an INIT command on BDOS before printing the title block at startup so that you can change disks on drive B:. Note-This file will only work for systems that use SOLOS or CUTER at C000H and have RAM at C800H for storage of the file header block. The file format is as follows: The first 16 bytes are an exact duplicate of the SOLOS Header block used for TAPE storage. Then the rest of the file is a byte for byte copy of what is in the file (Just like SOLOS block file). The last sector is filled with 1AH for end of file detection. A disk error will print a message on the console. All Console I/O is done using SOLOS and does not call CP/M. I hope that you find this program as useful as I have and that you enjoy using your new MUSIC System! Regards, Tom Digate lled CHORA from drive B:. Once a drive has been specified, it will be a default drive on future disk accesses for reads or writes. On startup, the default is always drive B:. MUSIC does an INIT command on BDOS before printing the title block at startup so that you can change disks on drive B:. Note-This file will only work for systems that use SOLOS or CUTER at C000H and have RAM at C800H for storage of the file header block. The file format is as follows: The first 16 bytes are an exact duplicate of the SOLOS Header block used for TAPE storage. Then the rest of the file is a byte for byte copy of what is in the file (Just like SOLOS block file). The last sector is filled with 1AH for end of file detection. A disk error will print a message#FIND.COM 03/18/80 $ !9"1:] C++NO FILE NAME++$Oo&6#~ʜ R#ͮ\<̓ 0gͮ!]ͮ!e͇ͮ----> FILE XXXXXXXX.XXX !" !j~0 c|cN# GyaJ{J_ #~ *~#|U͇ !~_~# p^#~ˆ++BAD STRING++$~# x®^#V#N#Fx#~G#~#fo>}ƀo|g+~+w+++ù#~g}o|g~ +p+q2h2|:n>2!\ ͮ:\2!\ ͮ\â!\ ͮ\!\ ͮ\<7=Ɓo& ͮ] ͮ2h#fo> ++ABORT++$ *\ PRN HEX555555FF5BFF55AA555555FF59FF0D :100D3A0057AA55771281124D0D771400004D0D7781 :100D4A00140000C36D0DC37F0DC3850DC3C40DC34D :100D5A00270EC37D0EC3CA0EC3450F4D55533A28FD :100D6A0011C900CD6710CDBD0F0E0DCD0500CDD533 :100D7A000FCD7810C9CDBD0FC30000CD3E10CDBD3B :100D8A000FCD9710CD0710CD2310CD6210CD3110A5 :100D9A00AF77CDF80FD50E0FCD05003CD1C2BC0DF3 :100DAA000E16CD05003CC2BC0DCDD50FCD7810AFC7 :100DBA0037C9CDD50FCD7810AFC9CD3E10CDBD0FF7 :100DCA00CD0710CD231036FFB7FAB30D23AF322A61 :100DDA00117E3600B7F2E50DFCFE0D3A2A11A7C2C4 :100DEA00B30DCDF80FCD07100E10CD05003CCAB3D8 :100DFA000DC3BC0DCD3110B7C8F5CD1410F16F2657 :100E0A000019FE80CA180E361A233CC30C0ECD07F1 :100E1A0010CDF80F0E15CD0500322A11C9CD3E109E :100E2A00CD2310FA770E237E3CCA770E3601CD31D8 :100E3A0010CCF910DA6C0EE5CD1410E13E8096352F :100E4A006F2600197EFE0AC2570EC3380E322911C8 :100E5A00CD78103A2911FE00CA6F0EFE1ACA6F0E1B :100E6A00B7C9CD78101100003E003D37C9CD7810C2 :100E7A00AF37C9CD3E10CD2310FA770E237EFE017F :100E8A00CA770E36FF2125113A281116005F193E3E :1000000000078 :101277001A111C111E112011FFFF650D670D1A11A0 :041287007714FFFFDA :0000000000 3A281116005FEB :10103A00197EB7C9CD67103DE6013C000000322891 :10104A001178322911AFD3FAEB2129113A281187E5 :10105A004F060009732372C9AF772377C9222F116C :10106A00213411732B722B712B702A2F11C9213144 :10107A001146234E2356235E2A2F11C9E521291131 :10108A003A2811875F1600195E2356E1C9CDF80F79 :10109A00D5EB01210070230DC29F10E1CD680D77B9 :1010AA00CD861006081AB7CABE1013237705C2AF39 :1010BA0010C3C7103E2013237705C2BE1023116543 :1010CA000D1A7723131A7723131A772313C9E5D531 :1010DA00CDBD0FCD0710CDF80F0E15CD0500322A64 :1010EA0011CDD50FD1E1AF773A2A11B7C837C9E583 :1010FA00D5CDBD0FCD0710CDF80F0E14CD0500329A :10110A002A11CDD50FD1E136803A2A11B7C837C98D :10111A00351156117711F711FF00FF000000010089 :10112A0000C715C7150000000000000000000000FD :10113A0000000000000000000000000000000000A5 :10114A000000000000000000000000000000000095 :10115A000000000000000000000000000000000085 :0D116A000000000000000000CD630AD121771219110000010080 :100A5C0001CD630AC36E0A78B1C81A7723130BC38E :100A6C00630A2193072201003EC33200002A4B0D7A :100A7C00EB215F0D1922720B21620D1922C70B217C :100A8C00500D1922CB0A21D50B228C0121BB0A2235 :0E0A9C00B90021000022B0072100C0C30000F5 :080AAF0000CD00000000000072 :100ABA00403A9407FE53CAE90AFE47CAE90AFE43C6 :100ACA00CA500DC304C0456E746572204E616D65CF :100ADA00206F6620536F6E67202E2E2E200D002168 :100AEA00CF0ACD040221AA0A06053E00772305C2D1 :100AFA00F40A21AA0A0606CDF701CA010BFE7FCA2B :100B0A00260BFE2FCA380BFE0DCA230B77CDE50143 :100B1A002305C2010BAF32AF0AC3590BF578FE06A3 :100B2A00CA340B2B043E5FCDE501F1C3010BCDE5C1 :100B3A0001CDF701CA3B0BD63032BA0AC630CDE531 :100B4A00013ABA0AE6030FDA560B3E4032BA0ACD28 :100B5A000B023A9407FE47CA670BC3A10B2ADC07AC :100B6A00EB21AA0A3ABA0ACD5F0DF52ADC07193633 :100B7A0001F121880BD29601CD0402C3000052650F :100B8A006164204572726F720D0057726974652034 :100B9A004572726F720D0021DC073ADE079632B198 :100BAA000A233ADF079E32B20A2AB10A2322B10A7D :100BBA002ADC0722B30A3AB00E9A0080BECCD810DA770E34E5211C1119195E00 :100EAA002356EBD11A5F16001D193A291177FE0D48 :100EBA00C2C50E3E0A322911C38F0ECD7810AFC9B2 :100ECA00072FE6013CCD530DD8CD2310233601213F :100EDA001CC81E10CD130FDA370F77231DC2DE0E82 :100EEA00CD7810EB7CB5C2F60E2A25C8EB2A23C8AA :100EFA00EBCD130FDA370F77231B7AB3C2FB0ECD74 :100F0A003C0FE52A23C8EBE1C9E5D5CD3110CCF970 :100F1A0010DA330FE5CD1410E13E8096356F2600C6 :100F2A00197E322911D1E1B7C9D1E137C9CD3C0FB8 :100F3A0037C9CD78103A2811C3560D072FE6013C60 :100F4A00CD530DD8CD23102336FFCD78101E104E69 :100F5A00CD880FDAB80F231DC2590FCD78101107AB :100F6A0000195E2356234E2346C5E14ECD880FDA7B :100F7A00B80F231B7AB3C2750FCD3C0FB7C9E5D59D :100F8A0079322911CD31103E80BECCD810DAB40F97 :100F9A0034E5211C1119195E2356EBD11A5F16008C :100FAA001D193A291177B7D1E1C9D1E137C9CD3C29 :100FBA000F37C9217712110000010001CDED0F2171 :100FCA000000117713010001C3ED0F2177131100FF :100FDA0000010001CDED0F2100001177120100017F :100FEA00C3ED0F78B1C81A7723130BC3ED0F21187D :100FFA00113A2811875F1600195E2356C9CA0A21AA0ACD620D210F :100BCA00940BD20000CD0402C300002A06002B2B8E :100BDA0011D5F81922450DEB2A410DEBAF935F3E73 :100BEA00009A5719224B0D2A3F0DE54E2346232220 :100BFA003F0D78A1FEFFCA0F0C2A4B0D09EBE173DA :100C0A002372C3F10BE1218112223F0D2A410DEB20 :100C1A002A430DCDD40CDAE50C2A3F0D7E23666FEC :100C2A00CDDA0CDA5C0CCDA50CFE03CA3E0CCD86DF :100C3A000CC31A0CCD860CD52B562B5ECD960CD236 :100C4A00580C2A4B0D19EB2A450D2B722B73D1C365 :100C5A001A0C3E01CD860C2A430DCDD40CDAE50CD4 :100C6A002A3F0D23237E23666FCDD40CD25C0C2A37 :100C7A003F0D23232323223F0DC31A0C2A450D4778 :100C8A001A77132305C28A0C22450DC92A470DCDAE :100C9A00DA0CD02A490DCDD40C3FC9211D0D1AFEFC :100CAA003FDAB60CFEC2DAD10C212D0D47E60FCD84 :100CBA00E00C780F0F0F0FE603477E05FACE0C0FF4 :100CCA000FC3C50CE603C93E01C97CBAC07DBBC9C6 :100CDA00CDD40CC037C9856FD024C92A3D0D4E2307 :100CEA004623223D0D78A1FEFFC2F70CC9C5D1CD1E :100CFA00960CD2040D2A4B0D19EBEB5E2356E5CD6B :100D0A00960CE1D2E50CE52A4B0D19EBE1722B7337 :100D1A00C3E50C55FFF5555555AA555555F5555585 :100D2A0055AA5D5CD47 :10100A0014100E1ACD0500D1C1C93A2811875F16EE :10101A0000211C11195E2356C92120113A28118773 :10102A005F1600197EB7C92125113A281116005FEB :10103A00197EB7C9CD67103DE6013C000000322891 :10104A001178322911AFD3FAEB2129113A281187E5 :10105A004F060009732372C9AF772377C9222F116C :10106A00213411732B722B712B702A2F11C9213144 :10107A001146234E2356235E2A2F11C9E521291131 :10108A003A2811875F1600195E2356E1C9CDF80F79 :10109A00D5EB01210070230DC29F10E1CD680D77B9 :1010AA00CD861006081AB7CABE1013237705C2AF39 :1010BA0010C3C7103E2013237705C2BE1023116543 :1010CA000D1A7723131A7723131A772313C9E5D531 :1010DA00CDBD0FCD0710CDF80F0E15CD0500322A64 :1010EA0011CDD50FD1E1AF773A2A11B7C837C9E583 :1010FA00D5CDBD0FCD0710CDF80F0E14CD0500329A :10110A002A11CDD50FD1E136803A2A11B7C837C98D :10111A00351156117711F711FF00FF000000010089 :10112A0000C715C7150000000000000000000000FD :10113A0000000000000000000000000000000000A5 :10114A000000000000000000000000000000000095 :10115A000000000000000000000000000000000085 :0D116A000000000000000000$ß͓1!!"#>*I:B=2*"!"ù Bayw  j>h: ‰> _I>H#>+>I>_I͔* (|ͳ|ͷ}ͳ}ͷ>  0͓!s#~:C!""! $ >*͉2: 2 !! ͊͊! ͊Ó: /2 :ƀ2!\6 i!OAiEiw#  62|͓\<=! ʛ=–#~I z> I> I!J͉ ¿͓*|"DM͔0 !G ͊!~I~#!f!Z 1:0O͊!T] ~# ,y@2C! ͊ I I> Z xIkf!p  xG  ‰{@ —xIx{xbk#~+w x#õ!ͻ""\<\*C "= I F   !0 :<A<E<Gx2\ ~0U# H !] 62|*ͻ~=ʆ, ~# tÿ \<ʨ! ͊fY\\12 }2|2!͉͊!((͓!!!k !> NS A NON-ZERO ; IF KEY PRESSED AT CONSOLE CSTS PUSH H! PUSH D! PUSH B MVI C,11 CALL BDOS ORA A POP B! POP D! POP H RET ;++++++++++++++++++++++++++++++++++++++++++++++ ; ; MAKE CP/M FILE CONTROL BLOCK ; ; MAKEFCB.LIB - VERSION 0.2 - 28 OCT 77 ; ; JEFFREY W. SHOOK ; P.O. BOX 185 ; ROCKY POINT, NEW YORK 11778 ; (516) 744 7133 ; ;++++++++++++++++++++++++++++++++++++++++++++++ ; CREATE A CP/M FILE CONTROL BLOCK FROM ; A COMMAND STRING AT THE ADDRESS IN HL ; AND PLACE IT AT THE ADDRESS IN DE. RETURN ; WITH THE CARRY SET IF AN ERROR OCCURS. ; DEFINITIONS FCBSIZ: EQU 33 FNMLEN: EQU 11 ; FILE NAME LENGTH MTFCB: PUSH H ; SAVE CMD STRING PTR PUSH D ; SAVE FCB ADDRESS LXI B,FCBSIZ; CLEAR ENTIRE FCB AREA MVI A,0 ; CALL FILLB ; POP D ; FILL FILE NAME WITH SPACES PUSH D ; INX D ; LXI B,FNMLEN; MVI A,' ' ; CALL FILLB ; POP D ; RESTORE POINTERS POP H ; CALL SKIPS ; SKIP LEADING SPACES INX H ; CHECK FOR DISK CODE MOV A,M ; DCX H \w# ȗ2DM͔0ͭ*|_*|DM͔_\  FDM͔kͭ*͝`i"*:, "6ͬbk~, ͝*͵"}o|ڭ~, ×=<DM+"͔*DM͵yx͉!ͻ"6!"*ͻ"#~=, ~ ÿ "((|5}5> I> G0O>a a;;_z>:O/2O/I#~ †> I> I|¥}Ýx´y+wì}|ڨ }|Ҩ *|! "R >¨ ))))o###~#fo>2*">2 *#ͻ"">pk ">! k d*!i=; "" H 1Y!c!/ | !F! s ڑG!p:!, ^#V:w#Np'",#r+s +~w>+55<##w#~O6p! s GR G*DM!$"B""`i>, *~*#~*+~ZW*:͈"*:͈"*:͈" d`i"ɗ2!$"z"z">B6#=|+6p#2揇Ҧ/<!!} , #~+2 >p: !, ~o:3 ! , ~>6* THE MUSIC SYSTEM FOR CP/M VER. 1.9 * MEMORY RANGE: (C) 1979 J.A.PREST}͉ ÉŸ|}!w s#r :[_!~![4\ͤ2[õ7U>?  mͤ!o"k> KEY MUST BE 0-7TIME SIGNATURE INVALIDPART OR REPEAT ERROR A-Z * MUSIC SYSTEM FACILITIES * A -- AUTO LINE NUMBER ON-OFF C (!DRIVE:) -- CATALOG DEFAULT DRIVE OR A: ETC. D XXXX (YYYY) -- DELETE LINES FROM XXXX TO YYYY E (XXXX) -- EDIT SAME LINE OR XXXX G (XXXX) !FILENAME -- GET FILE AND LOAD AT XXXX L (XXXX) (YYYY) -- LIST LINES FROM XXXX TO YYYY M -- TYPE THE MENU N (XXXX) -- START A NEW FILE AT XXXX P (XXXX) -- PLAY FILE AT XXXX R (XXXX) -- COMPOSITE SCORE-PLAY COMMAND S (XXXX) -- SCORE FILE. STORE AT XXXX V (XXXX) -- VERIFY FILE AT (XXXX) W (XXXX) !FILENAME -- WRITE FILE CURRENT OR XXXX (XXXX) AND (YYYY) ARE OPTIONAL PARAMETERS * "b "g "L "R*+""++"d>12 }2|2!͉͊!((͓!!!k !> ; CPI ':' ; JNZ MTFCB1 ; JUMP ON NO CODE MOV A,M ; TEST IF DISK CODE GOOD INX H ; INX H ; SBI '@' ; RC ; MAKE ERROR RETURN IF BAD CPI 'Z'+1 ; CMC ; RC ; STAX D ; STORE DISK CODE AT FCB + 0 MTFCB1: INX D ; MVI C,8 ; PROCESS FILE NAME FIELD CALL GETNAM ; MOV A,M ; TEST FOR FILE TYPE SEPARATOR INX H ; CPI '.' ; JNZ MTFCB2 ; MVI C,3 ; PROCESS FILE TYPE FIELD CALL GETNAM ; MOV A,M ; INX H ; MTFCB2: CALL TERMT ; TEST FOR CORECT TERMINATOR RET ; PROCESS NAME FIELD GETNAM: MOV A,M ; GET CHAR FROM CMD STR INX H ; CPI '?' ; ALLOW AMBIG REFERENCE CHAR JZ GETNA1 ; CPI '*' ; FILL REST WITH ? JZ GETNA2 ; CALL VALCHR ; TEST FOR ALLOWED CHAR IN NAME JC GETNA3 ; GETNA1: STAX D ; STORE CHAR IN TFCB INX D ; DCR C ; CHECK NAME SIZE JNZ GETNAM ; RET ; GETNA2: MVI A,'?' ; FILL REST OF FIELD WITH ? MVI B,0 ; JMP FILLB ; GETNA3: INX D ; MOVE FCB PTR TO END OF FIELD DCR C ; JNZ GETNA3 ; DCX H ; RET ; ; TE44>2O = 2:!, xw/k YR G!o #w &!v  !, qy O /<Ö O 2Y|  2 *ÿ }2 *###wG?O?< 1 DM "*yx* s#r ^#V#N#F*s#r#q#pz.A..*o$6#"1 *"2 *Y0ڔ :h Aڔ GҔ 06#=k ##s ~! s !w.” ~w:~Ÿ w!ʱ ʹ â >2*ͻ">=^#V#z N#F# !9"y2/ `.> *m "5 }h 24 >$ <2I >, <2A >$' <29 !9>2` #> F+ F N+N V#=2 7 5 >=0  *   !#$&()+-/02yrke`ZUQLHD@<9630-+(&$" +-# %&@H`IQ0S TWXA8CJDEGLMNP RSVWj$* / < = > @ KK M4 N P R V ^ ! IIxLRXkZ !} MUS ????????MUS ++ ++ BAD EDIT TRY AGAIN ++ FILE EXISTS! TYPE Y TO ERASE ++ ERROR IN WRITING FILE ++ FILE SAVED C POP H RET ;OPEN FILE OPENF LXI D,INFCB MVI C,15 ;CPM FUNCTION FOR OPEN CALL BDOS CPI 255 ;FAILED TO OPEN IF = 255 CMC RNZ LXI H,NOFMS ;FILE NOT FOUND MSG CALL TXTYP STC RET NOFMS DB 'FILE NOT FOUND',CR,LF,'$' CMDMSG DB 'TYPE COMMAND',CR,LF DB 'T - LOAD TUNE',CR,LF DB 'W - LOAD WAVEFORMS',CR,LF DB 'P - PLAY TUNE',CR,LF DB 'Q - QUIT (TO CP/M)',CR,LF,'$' ;GET A CHARACTER FROM DISK FILE GBYT PUSH H CALL DISKIN ;LIB ROUTINE TO GET BYTE POP H ; FROM DISK FILE RET ;INITIALIZE TO READ DISK FILE INIR LXI H,GREET CALL TXTYP CALL TXTIN CALL CRLF LXI H,CONBUF+2 ;+2 FOR COUNTS LXI D,INFCB ; A LA CP/M FORMAT CALL MTFCB ;LIB ROUTINE TO MAKE FCB JC INIR ;ERROR, TRY AGAIN CALL OPENF ;FCB OK, OPEN IT JC INIR ;ERROR, TRY AGAIN LXI H,INBUF+128 ;INIT. FOR DISKIN SHLD INPTR RET GREET DB 'ENTER FILE NAME ',0DH,0AH,'$' ;TEST FOR ABORT (CNTRL C) ABTST CALL CI CPI 3 RNZ ;NOPE JMP RESTRT ;RETURN TO CP/M ;CONSOLE STATUS CHECK...RETUR$&À# $b${$*!:!X!!M"p"""""4#\#j# ()*+,-/ABCDEHLMDBDIDSDWEIEQGEGTIFINLELTNEORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASEGCALLCSEGDSEGELSEENDMHIGHIRPCLDAXLHLDNAMEPAGEPCHLPUSHREPTSHLDSPHLSTAXXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLEINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M x#_BH!™# 0#³# £#{ڽ#KÅ#CÅ#<: 0 JCR:0 $# $! 06 p#! 0$# # ɯ<:0O=_^$!"F!!V#fjQ̀#G$2!!!^#Vo&)O~#F##xGyѯ:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞*ws*2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:e0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,+,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT N0000000000000000000@@@@@@@@@@@@@@@@AA AAQQQ"Q'Q,Q1Q6a *\ ?=)$=)w#Ž&!\60 ڱ&>GO#w ³&>O # &6 &6L#6I#6B#w2|r&\u'>2]0!"%![0~2%wG&!,x&>82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~6' D':%A6'>:6'D'>.6'D'>-6'x&!,N'!k-x&!,N':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(Mʣ(e0Lʣ(d0Qʣ(g0Rʣ(%1¶(x#3(~AҶ(#3(#6 !)-x&!x&!%͉&!%͉&ͳ'(`&͛'͠':%)!&͉&l&͛'B 4,73 ;54 D3 146.83 4.2854 DB 4,138 ;56 D3# 155.57 4.5402 DB 4,207 ;58 E3 164.82 4.8102 DB 5,25 ;60 F3 174.62 5.0962 DB 5,102 ;62 F3# 185.00 5.3992 DB 5,184 ;64 G3 196.00 5.7203 DB 6,15 ;66 G3# 207.65 6.0604 DB 6,108 ;68 A3 220.00 6.4208 DB 6,205 ;70 A3# 233.08 6.8026 DB 7,53 ;72 B3 246.94 7.2071 DB 7,163 ;74 C4 261.62 7.6356 DB 8,23 ;76 C4# 277.18 8.0897 DB 8,146 ;78 D4 293.66 8.5707 DB 9,21 ;80 D4# 311.13 9.0804 DB 9,159 ;82 E4 329.63 9.6203 DB 10,49 ;84 F4 349.23 10.1924 DB 10,204 ;86 F4# 369.99 10.7984 DB 11,113 ;88 G4 391.99 11.4405 DB 12,13 ;90 G4# 415.30 12.1208 DB 12,215 ;92 A4 440.00 12.8416 DB 13,155 ;94 A4# 466.16 13.6052 DB 14,106 ;96 B4 493.88 14.4142 DB 15,69 ;98 C5 523.24 15.2713 DB 16,46 ;100 C5# 554.36 16.1794 DB 17,36 ;102 D5 587.32 17.1414 DB 18,41 ;104 D5# 622.26 18.1607 DB 19,62 ;106 E5 659.26 19.2406 DB 20,98 ;108 F5 698.46 20.3847 DB 21,153 ;110 F5# 739.98 21.5969 DB 22,226 ;112 G5 783.98 22.8811 DB 24,62 ;114 G5# 830.60 24.24͠'!%60#60#60#>2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&Œ*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ *2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:e0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,+,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT N17 DB 25,175 ;116 A5 880.00 25.6831 DB 27,54 ;118 A5# 932.32 27.2103 DB 28,212 ;120 B5 987.76 28.8283 DB 30,139 ;122 C6 1046.5 30.5426 DB 32,92 ;124 C6# 1108.7 32.3588 DB 34,72 ;126 D6 1174.6 34.2828 DB 36,82 ;128 D6# 1244.5 36.3214 DB 38,123 ;130 E6 1318.5 38.4812 ORG NOTES+100H ;MUST BE ON PAGE BOUNDARY WAVE1 DS 100H ;1ST VOICE WAVE2 DS 100H ;2ND VOICE WAVE3 DS 100H ;3RD VOICE WAVE4 DS 100H ;4TH VOICE TUNE ;SCORE CODE BEGINS HERE END 100H uuuDB 10,204 ;86 F4# 369.99 10.7984 DB 11,113 ;88 G4 391.99 11.4405 DB 12,13 ;90 G4# 415.30 12.1208 DB 12,215 ;92 A4 440.00 12.8416 DB 13,155 ;94 A4# 466.16 13.6052 DB 14,106 ;96 B4 493.88 14.4142 DB 15,69 ;98 C5 523.24 15.2713 DB 16,46 ;100 C5# 554.36 16.1794 DB 17,36 ;102 D5 587.32 17.1414 DB 18,41 ;104 D5# 622.26 18.1607 DB 19,62 ;106 E5 659.26 19.2406 DB 20,98 ;108 F5 698.46 20.3847 DB 21,153 ;110 F5# 739.98 21.5969 DB 22,226 ;112 G5 783.98 22.8811 DB 24,62 ;114 G5# 830.60 24.24%1.01 3k -CATALOG.001 Contents of CP/M Users Group Volume 1 1.02 3k VOLUME1.DOC Comments on certain Volume 1 programs 1.1 8k ASSIGN.ASM I/O byte asign. Use with VBIOS31 1.2 2k CASDSK.ASM Cassette to disk transfer 1.3 9k COPY.ASM Copy system, data or whole diskette 1.4 8k COPY.COM As ASM, used to copy this disk 1.5 9k COPYX.ASM As copy, uses internal scratch 1.6 4k DIABLO.ASM Romable Hytype/Qume driver 1.7 8k DISASSM1.ASM Christensen disassembler DDJ Feb 77 1.8 4k DISASSM2.ASM Intel library disassembler 1.9 9k DISKTEST.ASM Search for soft and hard disk errors 1.10 2k DSKCAS.ASM Diskette to casette transfer 1.11 1k ED3.ASM Patches for 'R' bug in CP/M ED.COM 1.12 7k EXAM.ASM Sector viewer for VDM. See DISK1.DOC 1.13 1k FILES.COM Display disk directory records of files 1.14 1k GETVEC.LIB Routine to create BIOS primitive jump 1.15 4k HYS13.ASM Diablo driver for 3P+S in Z80 1.16 5k HYS15.ASM Diablo driver for 3P+S in 8080 1.17 7k ICOPY.ASM Copy a file from ISIS diskette 1.18 6me program 3.15 4k CRAPS.BAS Basic-E game program 3.16 1k EUCLID.BAS Basic-E game program 3.17 1k FIB.BAS Basic-E game program 3.18 1k FIT.BAS Basic-E game program 3.19 4k FORMAT.BAS Basic-E game program 3.20 1k FORMAT.FMI Instructions for FORMAT.BAS in 3.21 5k HANG.BAS Basic-E game program 3.22 5k HELLO.BAS Basic-E game program 3.23 7k KENO.BAS Basic-E game program 3.24 5k LANDER.BAS Basic-E game program 3.25 8k LANES.BAS Basic-E game program 3.26 7k LEM.BAS Basic-E game program 3.27 3k LOAN.BAS Basic-E game program 3.28 2k LOVE.BAS Basic-E graphic 3.29 2k PLOT2.BAS Basic-E game program 3.30 4k POET.BAS Basic-E game program 3.31 6k README.FMI Another format source with notes 3.32 5k S/TREK.BAS Basic-E game program 3.33 4k STARS.BAS Basic-E game program 3.34 27k STARTREK.BAS Basic-E game program 3.35 7k STORY.BAS Basic-E game program 3.36 4k STRIKE9.BAS Basic-E game program 3.37 7k TREKINST Instructions for STARTREK.BAS 3.38 7k TTT.BAS Basic-E game program 35.19 12k RUN2-3.COM Basic-E interpreter 5.20 12k RUNK2-0.COM Basic-E interpreter 5.21 4k SLOT.ASC Microsoft Basic program 5.22 2k SORT.ASC Microsoft Basic program 5.23 7k STARTREK.ASC Microsoft Basic program 5.24 14k SUPTRK3.ASC Microsoft Basic program 5.25 6.01 2k -CATALOG.006 Contents of CP/M Users Group Volume 6 6.02 1k EDVDM.DOC ED.COM patch - change #lines in P cmd 6.03 4k EXPLAIN.DOC Comments on certain programs 6.04 19k MAILLIST.DOC Documentaion on CACHE maillist pgrms 6.1 6k BLOAD.ASM Tarbell tape MITS Basic CSAVE to ASCII 6.2 34k CCOS1.ASM CACHE casette operating system 6.3 2k CKSUM.ASM Checksums CP/M files 6.4 5k COMPARE.ASM Compares two CP/M files 6.5 15k CUTTER.ASM Seems to be VDM to casette program 6.6 3k IDUMP.ASM Interpreted file dump 6.7 9k MAINT.BAS Maillist module 6.8 13k MODEM.ASM Program to send and receive files 6.9 6.10 1k PREFMT.BAS Maillist module 6.11 3k PURGE.ASM Diskette directory purge 6.12 1k QUICKIE.BAS Maillist modulek IDIR.ASM Lists ISIS directory to console 1.19 7k LIOS.ASM CP/M I/O subroutines. See PRINT 1.20 10k LTG.ASM Create MITS self loading cassette tape 1.21 6k MAZE.ASM Intel maze program 1.22 4k MEMTEST.ASM Intel RAM test 1.23 7k PRINT.ASM Mod of PRNT to permit conditional 1.24 5k PRNT.ASM Print files with pagination & page # 1.25 10k RELOC.ASM CP/M relocation program 1.26 7k RTE.ASM Intel Real-Time Executive 1.27 4k SEDIT.ASM Symbol table editor of DISASSM1 1.28 16k SPACE.ASM Game 1.29 8k SPAT.ASM Re-write of EXAM to allow writing. 1.30 3k TRAIN.ASM VDM graphic 1.31 4k TREAD.ASM Tape reader to disk transfer 1.32 17k VBIOS31.ASM bios for 32k of memory with VDM 1.33 3k VBOOT31.ASM Cold boot for VBIOS31 1.34 1k XSTAT.COM Similar to STAT. Reports # of files and 2.01 1k -CATALOG.002 Contents of CP/M Users Group Volume 2 2.1 84k LLLBASIC.ASM LLL Basic interpreter source 2.2 38k LLLBASIC.COM Simple patched COM for CP/M 2.3 2k LLLBASIC.DOC Notes on LLL Basic 2.4 61k LLLFP.ASM Floati.39 9k WUMPUS.BAS Basic-E game program 4.01 2k -CATALOG.004 Contents of CP/M Users Group Volume 4 4.02 2k VOLUME4.DOC Comments on programs 4.1 16k ACT.DOC Actor manual 4.2 11k ACT31.COM Latest Actor interpreter 4.3 11k ACT31UC.COM Latest upper-case Actor interpreter 4.4 2k AMAZE Actor program 4.5 1k AMUSE Actor program 4.6 16k CALENDAR.COM Obj of CALENDAR.FOR and NUMBER.MAC 4.7 4k CALENDAR.FOR Fortran main and sub-programs 4.8 6k FDL Actor program - careful with this! 4.9 2k HAIKU Actor program 4.10 3k IOEXAMP Actor program 4.11 11k L81.COM ML80 module - see .DOC 4.12 11k L82.COM ML80 module - see .DOC 4.13 5k L83.COM ML80 module - see .DOC 4.14 10k M81.COM ML80 module - see .DOC 4.15 20k MAZE.COM Object of MAZE.FOR and RND.FOR 4.16 5k MAZE.FOR Source of MAZE.COM main 4.17 1k ML.SUB SUBMIT file to run ML80 source 4.18 1k MLCOPY.SUB SUBMIT file to xfer ML80 group via PIP 4.19 2k NUMBER.MAC Calendar title generator 4.20 1k RND.FOR Sub-program of MAZE 4.21 1k WD 6.13 8k REPORT.BAS Maillist module 6.14 6k SIZE.ASM Gives size of CP/M file 6.15 5k SLOAD.ASM Loader module of CCOS1 6.16 7k SORT.ASM Maillist module 6.17 4k TISQ.ASM Times Square (newscaster) chrs to VDM 6.18 5k TLOAD.ASM Tarbell loader for TSAVE'd files 6.19 2k TMAP.ASM Map of tape with TSAVE'd files 6.20 5k TSAVE.ASM CP/M file to Tarbell tape with checksum 6.21 7.01 1k -CATALOG.007 Contents of CP/M Users Group Volume 7 7.02 1k VOLUME7.DOC Comments 7.1 6k PILOT Loaded MDS object 7.2 66k PILOT.ASM PILOT source 7.3 135k PILOT.LST MDS assembler listing w/ xref tables 7.4 6k PILOT.OBJ Relocatable MDS object 8.01 4k -CATALOG.008 Contents of CP/M Users Croup Volume 8 8.1 1k ALLOC.COM Graphic display of disk usage 8.2 6k BANNER.ASM Puts large letters to LST: or PUN: 8.3 7k BINLOAD1.ASM Read disk data from absolute sectors 8.4 2k BIOSGO.LIB Places dummy BIOS where needed (#1.14) 8.5 2k BPNF.ASM Pgrm to punch standard BPNF PROM tape 8.6 2k BSPAT16B.ASM Patchng-point package for LLL Basic 2.5 2K LLLMON.ASM Monitor to test LLL in LLL BASIC.COM 2.6 2k STARTREK.DOC Comments on STARTREK.TBI 2.7 6k STARTREK.TBI Tiny Basic loadable Startrek 2.8 3k TINYBAS.COM Wang Palo Alto TB w/disk save & load 2.9 13k TINYBAS.DOC Full instructions for TINYBAS 3.01 3k -CATALOG.003 Contents of CP/M Users Group Volume 3 3.02 8k VOLUME3A.DOC Comments on some programs 3.03 3k VOLUME3B.DOC Comments on other programs 3.1 2k ACE.BAS Basic-E game program 3.2 4k AMAZE.BAS Basic-E game program 3.3 2k ANIMAL.BAS Basic-E game program 3.4 2k BAGELS.BAS Basic-E game program 3.5 6k BAGELS2.BAS Basic-E game program 3.6 7k BIOPRINT.BAS Basic-E game program 3.7 11k BLKFRI.BAS Basic-E game program 3.8 10k BLKFRI2.BAS Basic-E game program 3.9 6k CANNONS.BAS Basic-E game program 3.10 3k CHASE.BAS Basic-E game program 3.11 2k CHOMP.BAS Basic-E game program 3.12 1k COMBINE.BAS Basic-E game program 3.13 1k CORE.BAS Basic-E game program 3.14 1k CORETEST.BAS Basic-E gaIR.COM Object of WDIR.M80 (try it!!) 4.22 3k WDIR.M80 ML80 source for WDIR.COM 4.23 1k XDIR.COM Object of XDIR.M80 (try it!!) 4.24 4k XDIR.M80 ML80 source for XDIR.COM 4.25 2k Z-LCTOUC.ACT Converts std Actor to ACTUC char set 5.01 2k -CATALOG.005 Contents of CP/M Users Group Volume 5 5.02 1k VOLUME5.DOC Comments on programs 5.1 8k 21.ASC Microsoft Basic program 5.2 12k BAS2-0.COM Basic-E compiler 5.3 12k BAS2-1.COM Basic-E compiler 5.4 5.5 5k BIO-FF.ASC Microsoft Basic program 5.6 4k BIORYTH.ASC Microsoft Basic program 5.7 10k BLKFRI2.ASC Microsoft Basic program 5.8 5.9 2k DECISION.ASC Microsoft Basic program 5.10 5.11 6k EDTEXT.ASC Microsoft Basic program 5.12 2k FORMAT.ASC Microsoft Basic program 5.13 5.14 16k OTHELLO.BAS Basic-E game program 5.15 5k OTHELLO.DOC instructions for OTHELLO.BAS 5.16 2k RADIX.ASC Microsoft Basic program 5.17 1k RECOVERY.ASC Microsoft Basic program 5.18 12k RUN2-2.COM Basic-E interpreter % to permit (ctl-H) to echo 8.7 4k BYTEMOV.ASM Bytesaver PROM burning program 8.8 2k DDTPATCH.ASM Patch corrects assembler errors in DDT 8.9 9k DISKDUP.ASM This is another disk copying program. 8.10 2k DISKIN.LIB Reads single characters from disk files 8.11 7k DISKTES1.ASM General disktest (see #1.9) 8.12 1k DIVIDE1.LIB Routine to divide 2 byte by 1 byte 8.13 17k DSKDIR.ASM Gives # of records, extents, etc. 8.14 8k FMAP.ASM Reads records, clusters, makes file 8.15 4k FORMAT1.ASM Formatter for Tarbell controller 8.16 2k GO.ASM say "GO FF00" and as if by magic.... 8.17 2k INNUM1.LIB Variable radix number input routine. 8.18 9k MAC4.ASM Patches: TDL Macros assembler 8.19 3k MAKEFCB.LIB Routine to create FCB's 8.20 1k MPY8.LIB Two byte by one byte multiply 8.21 2k OUTNUM1.LIB Output a two byte number in any radix 8.22 2k PBURN.ASM Bytesaver prom burner (see #8.7) 8.23 10k PRINT2.ASM Revision of #1.24 for Diablo 8.24 1k RECSEC.LIB Translate CP/M record (group-cluster) 8.25 nic src of PILOT interpreter 13.01 2k -CATALOG.013 Contents of CP/M Users Group Volume 13 13.1 7k 15/PUZ.ASC Microsoft Basic game 13.2 7k 1500.ASC Microsoft Basic game 13.3 2k 23MATCH.BAS Basic-E/CBASIC game 13.4 3k BAGELS.BAS Basic-E/CBASIC game 13.5 4k BIORYME.ASC Microsoft Basic game 13.6 6k BLACKJAC.BAS Basic-E/CBASIC game 13.7 1k BULLSEYE.BAS Basic-E/CBASIC game 13.8 6k CHECKERS.BAS Basic-E/CBASIC game 13.9 2k CHIEF.BAS Basic-E/CBASIC game 13.10 2k CONVERT.BAS Basic-E/CBASIC game 13.11 7k DICE.BAS Basic-E/CBASIC game 13.12 7k KINGDOM.BAS Basic-E/CBASIC game 13.13 13.14 15k NFL.BAS Basic-E/CBASIC game 13.15 4k ROCKET.BAS Basic-E/CBASIC game 13.16 1k RUSSIAN.BAS Basic-E/CBASIC game 13.17 16k SWARMS.BAS Basic-E/CBASIC game 13.18 16k SWARMS2.ASC Microsoft Basic game 13.19 2k TRAP.BAS Basic-E/CBASIC game 13.20 6k WUMPAS.BAS Basic-E/CBASIC game 13.21 23k ZOSO.2 Long winded review of diskette 14.01 2k -CATALOG.014 Contents of CP/M Users Group Volume 14 14OS.ASM Sol Operating System from ACCESS 15.23 2k TARGET.ASM Sol VDM Game by george W. Rompot 15.24 6k TLOAD.ASM Re-write of 6.18 - documented 15.25 5k TSAVE.ASM Re-write of 6.20 - documented 16.01 2k -CATALOG.016 Contents of CP/M Users Group Volume 16 16.02 7k VOLUME16.DOC Comments on certain programs 16.1 9k ASMX.COM Assembler which recognizes Z-80 ops 16.2 12k COPYDSK.ASM Disk copy program. See VOLUME16.DOC 16.3 13k COPYDSK.MAC As 16.2 for TDL assembler 16.4 7k CPMUTIL.ASM CP/M subroutines useful generally 16.5 3k EDIT.COM Intel-like editor. Faster than ED.COM 16.6 8k EDUCATOR.ASM 8080 instruction set tutor from Byte 16.7 57k FOCAL.ASM Focal language interpreter. 16.8 8k MACASM.COM Macro assembler. See VOLUME16.DOC 16.9 2k MOVDOWN.ASM Load file operating below 100H 16.10 2k SEEK.ASM Set disk track from front panel 16.11 9k SPAT1.ASM Re-write of 1.29 to generalize console 16.12 2k TASMIO.DOC Patch: TDL tape assembler to CP/M 16.13 3k TASMIO.HEX See TASMIO.DOC 16.14 18k TASMI4k SYMPRT.ASM Print symbol table fm Basic-E compiler 8.26 2k WYLECON2.LIB Routine to translate Wyle keyboard 8.27 20k XREF.ASM Create X-ref table from Intel assembler 8.28 6k XSTAT2.ASM Source of #1.34 plus guessed routines 9.01 1k -CATALOG.009 Contents of CP/M Users Group Volume 9 9.1 2k COPCON.ASC G/L program 9.2 2k COPRAN.ASC G/L program 9.3 3k GETPUT.ASC G/L program 9.4 7k GL1.ASC G/L program 9.5 16k GL2.ASC G/L program 9.6 4k GL3.ASC G/L program 9.7 4k GL4.ASC G/L program 9.8 6k GL5.ASC G/L program 9.9 7k GL6.ASC G/L program 9.10 13k GL7.ASC G/L program 9.11 3k GLMENU.ASC G/L program 9.12 7k SORTGL.ASC G/L program 10.01 1k -CATALOG.010 Contents of CP/M Users Group Volume 10 10.02 4k LLLBASIC.DOC Comments on programs in Volume 10 10.1 85k LLLBASIC.ASM See LLLBASIC.DOC 10.2 7k LLLBASIC.COM Total assembled package 10.3 61k LLLFP.ASM See LLLBASIC.DOC 10.4 5k LLLMON.ASM See LLLBASIC.DOC 10.5 1k TEST.FIL LLLBASIC test program. 11.01 1k -CATALOG.011 Contents of .1 5k ARTICLE Text for SECTEST below 14.2 6k BCD-DRVR Convert ASCII to IBM 2470 14.3 5k DLDHI.ASM High portion of DLOAD - See DOC 14.4 5k DLOAD.ASM MITS 3.2 8k Basic to CP/M w CSAVE/CLOAD 14.5 4k DLOAD.DOC Implementation notes for DLOAD 14.6 3k DUMP.COM Running version of DUMP below 14.7 23k DUMP.MAC Fantastic disk viewer program. 14.8 5k LIST32.ASM Recover ascii from internal MITS form 14.9 2k MOVE.ASM A PIP to xfer files without ^Z problem 14.10 3k PUT.ASM Load a file at any memory address 14.11 10k REL1.ASM Instructive version of RELOC/CPM pgrm 14.12 9k REL256.COM Reloc for integer k-100h system 14.13 9k REL512.COM Reloc for integer k-200h system 14.14 9k REL768.COM Reloc for integer k-300h system 14.15 3k RELHOW.DOC Notes for relocating CP/M Version 1.3 14.16 10k SECTEST.BAS Pgrm to test context comprehension 14.17 1k SECTEST.DOC Bob tells how to use it 14.18 7k SEDY.ASM Disk peeking program. 14.19 2k SEDY.COM Compilation, as 14.18 written for TDL 15.01 2k -CATALOG.01O.MAC See TASMIO.DOC 16.15 3k TEST1A.ASM Successful test for Z80ASM 16.17 16.16 1k TEST2.ASM Unsuccessful test for Z80ASM 16.17 16.17 9k Z80ASM.COM Zilog mnemonic assembler. Runs on 8080 16.18 4k Z80DOC.DOC DOC for 16.17 16.19 28k Z80MAIN.ASM See 16.17 16.20 4k Z80OPCDS.ASM See 16.17 16.21 11k Z80SUBS.ASM See 16.17 17.01 1k -CATALOG.017 Contents of CP/M Users Group Volume 17 17.02 3k VOLUME17.DOC Comments on certain programs 17.1 13k 3DTICTAC.ASM Game not yet patched to CP/M 17.2 50k CROROS.ASM Cromemco Resident Operating System 17.3 16k DENVBAS.ASM Denver Tiny Basic from Dr. Dobbs 17.4 6k DISASM.COM Revision of Intel disassembler 17.5 6k DISPLAY.ASM Part of space game. See VOLUME17.DOC 17.6 6k FUNCTION.ASM Part of space game. See VOLUME17.DOC 17.7 14k MINOL.ASM Corrected version of a Tiny Basic 17.8 2k NUMS.ASM Part of space game. See VOLUME17.DOC 17.9 25k PROCCALC.ASM Pro Tech desk calculator package. 17.10 19k SPACE.ASM Part of space game. See VOLUME17.DOC 17.11 7k Z80-OPS.ACP/M Users Group Volume 11 11.02 2k VOLUME11.DOC Comments on contents 11.1 76k BASIC/5.ASM Processor Tech 5k Diskified Basic 11.2 8k BASIC/5.COM 5k Basic in 8k (sign of the times) 11.3 7k BASIC/5.DOC CP/M implementation explained 11.4 6k STARTREK.TBI Was also #2.7 see VOLUME11.DOC 11.5 1k TINICOPY.SUB Someone uses the SUBMIT program?? 11.6 62k TINIDISK.ASM Source of Tinidisk 11.7 3k TINIDISK.COM Was also #2.8 11.8 13k TINIDISK.DOC Was also #2.9 12.01 1k -CATALOG.012 Contents of CP/M Users Group Volume 12 12.1 1k GOLDI.PLT Source program for ZPILOT 12.2 2k HIPILOT.PLT Source program for ZPILOT 12.3 67k PILOT.ASM Patched version of #7.2 12.4 5k PILOT.COM See PILOT.DOC 12.5 2k PILOT.DOC Description of CP/M implementation 12.6 1k PILOT.TST Source program for PILOT. 12.7 5k PMON.ASM CP/M interface used in PILOT.COM 12.8 1k WIERD WIERD.PLT re-coded for PILOT.COM 12.9 1k WIERD.PLT Source program for ZPILOT 12.10 1k ZPILOT.COM Object of ZPILOT.Z80 12.11 7k ZPILOT.Z80 Zilog mnemo5 Contents of CP/M Users Group Volume 15 15.1 2k ALLOC.ASM Source of 8.1 with improvements 15.2 2k BEASTIE.ASM Sol VDM game from Dr. Dobbs 15.3 8k CHASE.ASM Sol VDM game from Dr. Dobbs 15.4 6k DUMP.ASM Kernl utility. See 15.7 15.5 3k INIT.ASM Kernl initiation routine. See 15.7 15.6 3k INIT2.ASM Kernl initiation routine. See 15.7 15.7 57K KERNl.ASM kernel of Real-Time Interactive 15.8 8k MDGCBIOS.ASM BIOS written in TDL for Tarbell 15.9 2k MDGSBOOT.ASM Boot for 15.5 15.10 25k OTHELLO.COM Running object from 15.11 15.11 12k OTHELLO.FOR Fortran source of board game 15.12 16k PRINT3.ASM Revised 8.23 for command line control 15.13 1k PROC1.ASM p/o Kernl (#15.7) 15.14 1k PROC2.ASM p/o Kernl (#15.7) 15.15 2k PROC3.ASM p/o Kernl (#15.7) 15.16 1k PROC4.ASM p/o Kernl (#15.7) 15.17 2k PROC5.ASM p/o Kernl (#15.7) 15.18 1k PROC6.ASM p/o Kernl (#15.7) 15.19 2k PROC7.ASM p/o Kernl (#15.7) 15.20 1k PROC8.ASM p/o Kernl (#15.7) 15.21 4k ROMP.ASM Tarbell tape loader and saver 15.22 46k SOL&SM Z-80 mnemonics recognized by ASMX 16.1 18.01 1k -CATALOG.018 Contents of CP/M Users Group Volume 18 18.02 1k VOLUME18.DOC Comments on certain programs 18.1 40k CASUAL.ASM Casual language from Dr. Dobbs Dec 76 18.2 39k FLTARITH.ASM Section 1 of Intel 8008 math routines 18.3 18k FPCONV.ASM section 2 of Intel 8008 math routines 18.4 39k MATH.ASM Yale math routines 18.5 2k MATH.DOC Comments on MATH.ASM 18.4 18.6 24k MILMON80.ASM Stand-alone monitor editor assembler 18.7 46k PROCSELF.ASM Software Package #1. No CP/M I/O yet 19.01 2k -CATALOG.019 Contents of CP/M Users Group Volume 19 19.02 6k VOLUME19.DOC Comments on volume contents 19.1 17k ADE.ASM Absolute disk editor. See VOLUME19.DOC 19.2 6k COPY.ASM Disk copy program. See VOLUME19.DOC 19.3 9k CPM.DOC Imsai's description of CP/M 19.4 21k LINK.ASM Remote computer control via D C Hayes 19.5 17k LINK73.ASM Earlier version of 19.4 for std modem 19.6 60k RM80.ASM Resident PROM monitor. See VOLUME19.DOC 19.7 8k RM80.DOC Comments on RM8ft Basic game 21.21 21k STRTRK/2.ASC Microsoft Basic game 21.22 20k STRTRK/3.ASC Microsoft Basic game 21.23 1k TACOS.ASC Microsoft Basic game 21.24 5k TAXMAN.ASC Microsoft Basic game 21.25 16k TRADE.ASC Microsoft Basic game 21.26 2k TRAP.ASC Microsoft Basic game 21.27 4k W/SEARCH.ASC Microsoft Basic game 21.28 3k WARI.ASC Microsoft Basic game 21.29 7k WUMP.ASC Microsoft Basic game 22.01 2k -CATALOG.022 Contents of CP/M Users Group Vol 22 22.01 5k ZOSO.22 Description and Application Notes 22.1 48k BIGTREK.ASC 22.3 trimmed for TDL disk basic 2.2 39k BIGTREK.BAS Compact version of 22.1 for faster load 22.3 54k STARTREK.TXT Starting point of BIGTREK. 22.4 21k STRTRK/2.ASC A second appearence of program 21.21 22.5 5k TREKINFO.DOC Rules & features of STARTREK & BIGTREK 22.6 42k TREKMOD.ASC BIGTREK trimmed for Microsoft Basic 23A.01 3k CATALOG.023 Contents of CP/M Users Group Vol 23 23A.02 2k VOLUME23A.DOC Comments on this volume 23A.03 3k STOICCPM.DOC Comments on CP/M STOIC. 23A.1 MODEM.ASM Intelligent terminal program from CACHE 25.12 3k MODEM.DOC Documentation for 25.11 25.13 26k CBIOS24.ASM Bios for Tarbell disk controller. 25.14 2k SBOOT24.ASM Boot for Tarbell disk controller. 25.15 26k FBIOS24.ASM Bios for dual Persci disk controller. 25.16 2k FBOOT24.ASM Boot for dual Persci disk controller. 25.17 9k COPY.ASM Users' Group 1.3 modified for Tarbell 25.18 9k FORMAT.ASM Disk initialize program for Tarbell 25.19 3k TARBELL.DOC Notes on 25.13 through 25.18. 25.20 3k NOTES.VAN CP/M operation & undocumented features 25.21 5k CAT.ASM Master Disk Catalog System program. 25.22 8k UCAT.ASM Master Disk Catalog System program. 25.23 5k QCAT.ASM Master Disk Catalog System program. 25.24 7k CATALOG.DOC Documentation for Master Catalog System 25.25 13k STOIC.COM CP/M STOIC constructed per VOLUME23.DOC 25.26 7k BOOT.ASM STOIC bootstrap in 8080 assembler. 25.27 2k BOOT.DOC Boot documentation. 25.28 6k LOAD.DOC Information on loading STOIC 25.29 1k STATPCH.ASM Dev0 19.6 19.8 4k SAP.ASM Sorts and packs directory. 19.9 8k SCOPY.ASM Single drive diskette copy pgrm 19.10 16k TREAD.ASM RM80 tape backup utility with 19.11 19.11 10k TSAVE.ASM RM80 tape save utility with 19.10 19.12 9k XFER.ASM File copy pgrm for single disk system 20.01 2k -CATALOG.020 Contents of CP/M Users Group Volume 20 20.01 12k ZOSO.20 Our talented and modest reviewer ... 20.1 8k BLACKJAC.BAS Basic-E/CBASIC game 20.2 8k CIVILW.BAS Basic-E/CBASIC game 20.3 9k FOOTBALL.BAS Basic-E/CBASIC game 20.4 7k GOLF.BAS Basic-E/CBASIC game 20.5 3k GUNNER.BAS Basic-E/CBASIC game 20.6 7k LUNAR1.BAS Basic-E/CBASIC game 20.7 9k PINUP.PIC Picture 20.8 18k PINUP1.PIC Picture 20.9 9k POKER.BAS Basic-E/CBASIC game 20.10 4k SNOOPY.PIC Picture 20.11 27k STARTREK.BAS Basic-E/CBASIC game 20.12 57k STMASTER.BAS Basic-E/CBASIC game 20.13 1k STMASTER.DOC See ZOSO.20 20.14 33k STRTRK/1.BAS Basic-E/CBASIC game 20.15 7k TREKINST See ZOSO.20 20.16 7k TWEETY.PIC Picture 21.01 3k -CATALOG.021 13k ASSEMBLE.DOC STOIC 8080 assembler 23A.2 8k DICT.DOC STOIC dictionary definitions 23A.3 8k EDIT.DOC STOIC display editor doc 23A.4 9k FILES.DOC STOIC file system doc 23A.5 5k FLOATPNT.DOC Floating point doc 23A.6 2k INTRRUPT.DOC Interrupt handler doc 23A.7 38k KERNEL.ASM STOIC kernel with CP/M words in 8080 23A.8 24k KERNEL.DOC STOIC kernel doc 23A.9 46k STOIC.DOC STOIC concepts and structure 23A.10 23k STOICBAS.STC Basic definitions 23A.11 4k STOICD/A.STC Graphics for D/A hardware 23A.12 9k STOICEDT.STC Editor 23A.13 3k STOICFFT.STC Fast Fourier Transform 23A.14 8k STOICFLE.STC File system 23A.15 11k STOICFLT.STC Floating point package 23A.16 5k STOICINT.STC 4 byte integer addition 23A.17 3k STOICITP.STC Interrupt package 23A.18 3k STOICMIS.STC Miscellaneous words 23A.19 2k STOICSIN.STC Integer sine and cosine 23A.20 2k STOICSRT.STC Sort routine 24.01 2k -CATALOG.024 Contents of CP/M Users Group Vol 24 24.02 3k VOLUME24.DOC Comments on programs in Volume 24 24.1 19k ice name patches for STAT 25.30 3k TTYDRV.MAC TTY drivers from Microsoft Fortran 26.01 2k -CATALOG.026 Contents of CP/M Users Group Volume 26 26.02 32k ZOSO26.DOC Our reviewer's comments on vol 26 & 27 26.1 4k BACCRRT.ASC Microsoft Basic game. See ZOSO26.DOC 26.2 14k BASEBALL.ASC Microsoft Basic game 26.3 7k BIOCAL.ASC Biorhythm program. See ZOSO26.DOC. 26.4 6k BIRTHDAY.ASC Gives day of week for any date 26.5 8k BLACKJCK.ASC Microsoft Basic game. See ZOSO26.DOC 26.6 10k BUDGET.ASC Budget program. See ZOSO26.DOC 26.7 3k CHASE.ASC Microsoft Basic game 26.8 12k CHESS.ASC Microsoft Basic game 26.9 9k CIVILWAR.ASC Microsoft Basic game 26.10 6k CLIMATES.ASC Microsoft Basic game 26.11 6k CLOUD-9.ASC Microsoft Basic game 26.12 5k CRAPS.ASC Microsoft Basic game 26.13 7k CRAZY-8.ASC Microsoft Basic game 26.14 1k GALAXY.ASC Microsoft Basic game 26.15 2k GALAXY2.ASC Microsoft Basic game 26.16 8k SQUARE.ASC Microsoft Basic game 26.17 16k SWARMS.ASC Microsoft Basic game 26.18 8k WEA Contents of CP/M Users Group Volume 21 21.02 19k ZOSO21.DOC Unadulterated reviewer comments 21.03 20k ZOSO21.TOP Above for TDL text output processor 21.04 --- TDL.HYP Unsolicited Testimonial 21.1 3k ACYDUCY.ASC Microsoft Basic game 21.2 3k APOLLO.ASC Microsoft Basic game 21.3 3k BANNER.ASC Microsoft Basic game 21.4 4k BIO.ASC Microsoft Basic game 21.5 10k BLKFRI3.ASC Microsoft Basic game 21.6 6k BLKJK.ASC Microsoft Basic game 21.7 3k CHASE.ASC Microsoft Basic game 21.8 12k CHESS.ASC Microsoft Basic game 21.9 1k DIAMONDS.ASC Microsoft Basic game 21.10 4k ENTE.ASC Microsoft Basic game 21.11 6k ENTEP.ASC Microsoft Basic game 21.12 6k FURS.ASC Microsoft Basic game 21.13 6k HORSE.ASC Microsoft Basic game 21.14 8k KING.ASC Microsoft Basic game 21.15 3k LANDER.ASC Microsoft Basic game 21.16 2k MANDALA.ASC Microsoft Basic game 21.17 4k MAZE.ASC Microsoft Basic game 21.18 3k ROCKET.ASC Microsoft Basic game 21.19 3k RUSSIAN.ASC Microsoft Basic game 21.20 4k SNOOPY.ASC MicrosoDUMP.ASM Revision of 14.7 24.2 3k DUMP.COM Assembly of 24.1 24.3 3k MAC40.LIB Macro library to X-assemble 4004/4040 24.4 17k MACRO.LIB Extensive macro library 24.5 3k OPCODE.LIB Extended register operation macro lib 24.6 32k RATFOR.COM Translate from ratfor to Fortran 24.7 5k TAPELIB.COM Object of 24.9 24.8 12k TAPELIB.DOC Description of 24.9 24.9 37k TAPELIB.MAC Transfer files from disk to tape 24.10 11k XDIR.ASM Directory program giving 3-wide display 24.11 2k XDIR.COM Object of 24.10 25.01 3k -CATALOG.025 Contents of CP/M Users Group Vol 25 25.02 1k VOLUME25.DOC Comments on Volume 25 contents 25.1 2k 88-MODEM.DOC Notes on 25.2 below 25.2 32k 88-MODEM.ASM Intelligent terminal pgrm for the IDS88 25.3 3k BKSPACE.DOC Backspace handling in CP/M and Basic 25.4 4k FRAGMENT.DOC Memory mapped video board paging info 25.5 5k LETTER.ASM Personalized Form letter generator. 25.9 9k DCHAYES.ASM Program in DCHAYES modem manual. 25.10 7k DCHDIAG.ASM Diagnostic for DCHAYES modem. 25.11 13k&THER.ASC Microsoft Basic game 26.19 5k WORD-PLZ.ASC Microsoft Basic game 26.20 12k OTHELLO.FOR Fortran version of Othello on vol 15. 26.21 22k OTHELLO.COM Executable 26.20 26.22 1k CHAIN.ASC Copy from console to XXX.SUB file. 26.23 2k EDITM.FOR Fortran IV program. Writes M80 PRN file 27.01 2k CATALOG.027 Contents of CP/M Users Group Volume 27 27.02 32k ZOSO27.DOC Our reviewer's comments on vol 26 & 27 27.1 6k ANTONYMS.ASC Microsoft Basic game 27.2 4k DISSAMBR.ASC Disassembler 27.3 8k DOTS.ASC Microsoft Basic game 27.4 3k DRAGRACE.ASC Microsoft Basic game 27.5 8k FOOTBALL.ASC Microsoft Basic game 27.6 10k GOLF.ASC Microsoft Basic game 27.7 2k GREEKRTS.ASC Microsoft Basic game 27.8 6k HANGMN-1.ASC Microsoft Basic game 27.9 6k HANGMN-2.ASC Microsoft Basic game 27.10 6k HANGMN-3.ASC Microsoft Basic game 27.11 3k HIDESEEK.ASC Microsoft Basic game 27.12 5k IQUEEN.ASC Microsoft Basic game 27.13 2k MASTERMD.ASC Microsoft Basic game 27.14 5k MAZE.ASC Microsoft Basic game 27.15 7Algolm program 28.34 1k WFILE.OUT Algolm program output 28.35 1k WINPUT.INP Demo input file for READWORD. 28.36 1k RFILE.INP Demo input file for RWINT. 28.37 1k BLK.INP Demo input file 28.38 1k FILE1.INP Demo input file 28.39 1k FILE2.INP Demo input file 28.40 4k ADM3.MOD Mods for ADM3 29.01 3k -CATALOG.029 Contents of CP/M Users Group Volume 29 29.02 3k VOLUME29.DOC Comments on programs on Volume 29 29.1 25k TTT.ASM 3-d tic tac toe game 29.2 9k CHASE.ASM VDM/SOL game. 15.3 with CP/M I/O. 29.3 3k TARGET.ASM VDM/SOL game. 29.4 8k DEFLECT.ASM VDM game 29.5 8k MUSIC.ASM Music program 29.6 2k MUSICP.COM Music program for "Sounds of Silence" 29.7 12k PIRANHA.ASM VDM game 29.8 19k ROBIN.ASM Uses Poly VTI. See VOLUME29.DOC. 29.9 3k ROBOT.ASM VDM game 29.10 2k ALLOC.ASM Disk allocation display. See Doc 29.11 24k EDIT.ASM Disassembly of 16.5. See VOLUME29.DOC. 29.12 5k SAP.ASM Sorts and packs directory. Improved 29.13 3k NOTATE.ASM Adds comments to ASM source. 29.14 Chapter 15 31.17 3k TBASIC.A Appendix A 31.18 3k TBASIC.B1 Appendix B page 1 31.19 3k TBASIC.B2 Appendix B page 2 31.20 3k TBASIC.C Appendix C 31.21 2k TBASIC.D1 Appendix D page 1 31.22 2k TBASIC.D2 Appendix D page 2 31.23 3k TBASIC.E Appendix E 31.24 1k TBASIC.H Appendix H 31.25 3k TBASIC.I Appendix I 31.26 2k TBASIC.J Appendix J 31.27 1k TBASIC.K Appendix K 31.28 3k TBASIC.IND Index 31.29 3k TBASIC.AD Product description 31.30 3k TBASIC.CPM Special instructions 31.31 21k TBASIC.COM Executable module 31.32 43k TBASICA4.ASM Source module 31.33 55k TBASICA5.ASM Source module 31.34 26k TBASICA6.ASM Source module 32.01 1k -CATALOG.032 Contents of CP/M Users Group Volume 32 32.1 1k READ.ME Note from Tarbell Electronics 32.2 10k RTMASM.COM Multi input file assembler 32.3 3k RTMASM.DOC Instructions for assembling 32.4 26k TBASICA1.ASM Source module 32.5 47k TBASICA2.ASM Source module 32.6 53k TBASICA3.ASM Source module 32.7 19k TBASICIO.ASM Source module 33.0 2k -CATALOk MEMBRAIN.ASC Microsoft Basic game 27.16 2k NIM.ASC Microsoft Basic game 27.17 7k ROULETTE.ASC Microsoft Basic game 27.18 9k SHOP.ASC Microsoft Basic game 27.19 4k SNOOPY.ASC Generates Snoopy picture 27.20 7k STARTREK.ASC Microsoft Basic game 27.21 8k SYNONYMS.ASC Microsoft Basic game 27.22 11k BLUFF.INT Microsoft Basic game 27.23 12k RUN.COM Run program to execute BLUFF.INT. 27.24 46k MEGATREK.ASC 22.1 trimmed to run in 63k system 27.25 1k MEGATREK.DOC Note on Megatrek 28.01 3k -CATALOG.028 Contents of CP/M Users Group Volume 28 28.1 6k DATABASE.DOC Documentation for database system 28.2 6k DBENTRY.BAS D.B. system file load utility 28.3 7k DBQUERY.BAS D.B. system query and update module 28.4 7k DBSETUP.BAS D.B. system file initialization module 28.5 1k INV. File definition for inventory data base 28.6 1k INV.IND Sample part # index for inventory file 28.7 23k MAILLIST.DOC Updated Doc for CACHE mailing list 28.8 11k MAINT.BAS Updated maillist. Handles more fields 28.9 1k SYMSTACK.LIB Assembler time push/pop LIB for MAC. 29.15 2k NCOMPARE.LIB Corrected version of D/R distribution 29.16 11k SEQIO.LIB Corrected version of D/R distribution 29.17 1k WHENS.LIB Modification of D/R version 29.18 1k DOWHILES.LIB Modification of D/R version 29.19 2k SELECTS.LIB Modification of D/R version 29.20 1k IGADD.MAC Subroutine callable from Fortran-80 29.21 1k MON1.MAC Subroutine callable from Fortran-80 29.22 1k MON2.MAC Subroutine callable from Fortran-80 29.23 2k UNLOAD.ASM Converts COM file to HEX. Use MAC. 29.24 14k FPCONV.SRC Basic-E Floating Point conversion pkg 29.25 2k FPDATA.SRC Equate tables for FPCONV 29.26 8k FPINT.SRC Interface Interpreter and F.P. pkg 29.27 29k FPPKG.SRC Interpreter 29.28 13k TRAN.SRC Transcendental Function package 29.29 5k MOVE.ASM 1 disk move program. Assemble with MAC. 29.30 6k MOVENMAC.ASM MOVE.ASM w/macros expanded for assembly 29.31 5k TIMESQ.ASM Sign generator for VDM. 29.32 3k WSYSGEN.ASM SYSGEN a stack of disks easilG.033 Contents of CP/M Users Group Volume 33 33.1 8k -SAR.DOC Descriptions of the SAR programs 33.2 1k ADDPOD.BAS Calculates probability of detection 33.3 18k BITCASP.BAS RJCASP to use Summagraphics Bitpad 33.4 22k CAESAR.BAS Flight log keeper 33.5 2k CAESAR.BQ Caesar briefing questionaire 33.6 2k CAESAR.DQ Caesar debriefing questionaire 33.7 4k CAESAR.MQ Caesar mission questionaire 33.8 4k CAPSERCH.BAS Game to teach fundamentals of SAR 33.9 20k CASPGAME.BAS Demonstrator for BITCASP 33.10 14k CASPPLUS.BAS Expanded version of RJCASP 33.11 7k DFELT.BAS Re-write of N-ELT1 33.12 3k ELTPOD.BAS Calc electronic discovery probabilities 33.13 10k N-ELT1.ASC Microsoft Basic version - see 33.15 33.14 10k N-ELT1.BAS CBasic version - see 33.15 33.15 6k N-ELT1.DOC R.D.F. to localize radio beacon 33.16 2k OPT.BAS Tests probability of visual detection 33.17 3k RJCASP.BAS Allocation of search resource 33.18 9k SERCHGME.BAS 33.8 re-written as structured program 33.19 3k VISPOD.BAS Calc visual 11k REPORT.BAS Improved maillist report program. 28.10 14k ALGOLM.COM Algolm compiler by Lt. M. Moranville 28.11 14k RUNALG.COM Algolm INT file interpreter 28.12 9k ALGINTRO.TXT Algolm introduction 28.13 3k ALGSTART.TXT Algolm run instructions 28.14 2k COMERR.TXT Algolm compile errors documentation 28.15 2k RUNERR.TXT Algolm run time errors documentation 28.16 25k USRMAN.TXT Algolm User Manual 28.17 3k ARRAY.ALG Algolm program 28.18 1k BOOLINT.ALG Algolm program 28.19 1k CASETEST.ALG Algolm program 28.20 1k CASETWO.ALG Algolm program 28.21 1k FLYTEST.ALG Algolm program 28.22 1k GOTOTEST.ALG Algolm program 28.23 1k HANOI.ALG Algolm program 28.24 2k LUNAR.ALG Algolm program 28.25 2k PERM.ALG Algolm program 28.26 2k READWORD.ALG Algolm program 28.27 1k RWINT.ALG Algolm program 28.28 1k SIISTR.ALG Algolm program 28.29 2k SORT.ALG Algolm program 28.30 1k STRING.ALG Algolm program 28.31 1k STRTST.ALG Algolm program 28.32 1k BLKTEST.ALG Algolm program 28.33 1k ONEND2.ALG y. 29.33 1k VDM.DOC Modified to page 16 lines instead of 24 30.01 1k -CATALOG.030 Contents of CP/M Users Group Volume 30 30.1 2k BASCOM.LIT Literal equates 30.2 39k BASIC.PLM V1.4 Basic-E compiler modified for CP/M 30.3 14k BASPAR.PLM Parser module 30.4 54k BASSYN.PLM Symbol table and code generator module 30.5 12k BASIC.COM Executable compile module 30.6 66k RUN.PLM Run module 30.7 12k RUN.COM Executable run module 30.8 17k BUILD.PLM Invoked when RUN called 31.01 2k -CATALOG.031 Contents of CP/M Users Group Volume 31 31.1 2k TBASIC.TOC Table of Contents 31.2 3k TBASIC.1 Chapter 1 31.3 2k TBASIC.2 Chapter 2 31.4 3k TBASIC.3 Chapter 3 31.5 3k TBASIC.4 Chapter 4 31.6 3k TBASIC.5 Chapter 5 31.7 3k TBASIC.6 Chapter 6 31.8 4k TBASIC.7 Chapter 7 31.9 3k TBASIC.8 Chapter 8 31.10 2k TBASIC.9 Chapter 9 31.11 3k TBASIC.10 Chapter 10 31.12 3k TBASIC.11 Chapter 11 31.13 2k TBASIC.12 Chapter 12 31.14 2k TBASIC.13 Chapter 13 31.15 2k TBASIC.14 Chapter 14 31.16 2k TBASIC.15 'discovery probabilities -CATALOG.034 CONTENTS OF CP/M VOL. 34 34.1 1k ABSTRACT.034 Quick look at SAM76 34.2 8k ASTRO.FNT Astrological signs for graphics 34.3# 1k BONUS.DOC Function documentation 34.4# 1k BOOK.DOC How to order SAM76 manual 34.5# 1k COPY.COM * Disk copy program 34.6# 1k CPMSETL.COM Part of SAM76 setup procedure 34.7 3k DEMO.SAM Some interesting demo programs 34.8 1k DIRFIX.SAM Disk directory routines 34.9 19k EXTF.ASM Various routines w/clock driver 34.10 1k EXTF.DOC Various routines w/clock driver 34.11# 1k FRIEND.DOC oops!! Something not on disk! 34.12# 2k G.SAM Sets up SAM for load-and-go 34.13 1k HOOH.SAM Hex to octal to hex 34.14# 1k IDUMP.COM Interpreted file dump (**) 34.15# 13k ILRAW.COM Raw copy of SAM76. 34.16 10k INFO.SAM Creates following .DOC files 34.17# 1k INFO1.DOC <> ?? 34.18# 1k INFO2.DOC Misc. DOC 34.19# 2k INFO3.DOC Misc. DOC 34.20# 1k INFO4.DOC <> ?? 34.21 2k INFO5.DOC Misc. DOC 34.22# 1k KSAP.COM * Sort and pack ditual' base routines 35.26 3k FELIXV1.CAT Author's original volume cat. 35.27 2k GETF.ASM FELIX source code 35.28 2k GETW.ASM FELIX source code 35.29 2k HEXOUT.ASM FELIX source code 35.30 2k LOADBACK.COM Utility to load backgrounds 35.31 2k LOADOB.COM Utility for getting objects from disk 35.32 5k LOADPROG.ASM Utility for getting pgrms from disk 35.33 1k LOADPROG.COM Object of above 35.34 2k MUSTANG.FAS Cowboy jumps on a horse as it rides by 35.35 6k MUSTANG&.FEX Executable cowboy story 35.36 15k NUMBER.ASM FELIX source code 35.37 3k OBJECT.ASM FELIX source code 35.38 1k OBJNULL.ASM FELIX source code 35.39 1k PAINT.FAS Source code for a simple painter 35.40 1k PAINT.FEX PAINTER for use with your own objects 35.41 2k PAINT.PRN PAINT.FAS listing 35.42 6k PAINT&.FEX Painter for use with its own objects 35.43 4k PAINTER.FEX Painter using 'Theta' (added A/D in) 35.44 6k PAINTER&.FEX Painter with Theta and its own objects 35.45 11k PARM.ASM FELIX source code 35.46 3k PATH.ASMcil to CP/M file 36.25 2k PEN-CPM.DOC Convert Electric Pencil to CP/M file 36.26 24k POW.ASM Source for text processor 36.27 5k POWCMDS.POW POW documentation 36.28 2k POWTEXT.POW More POW doc. 36.29 6k SCRAMBLE.ASM File encode/decode 36.30 2k SCRAMBLE.DOC Doc on above 36.31 17k TED.COM CP/M text editor with help features 36.32 23k TED.DOC CP/M text editor with help features 36.33 10k TOP.AZM TDL Text output processor patches 36.34 5k TOP.PRN TDL Text output processor patches 36.35 3k TOP.TOP TDL Text output processor patches 36.36 22k XREF.ASM Cross references .ASM files 37.01 4k -CATALOG.037 CONTENTS OF CP/M VOL. 37 37.02 6k ABSTRACT.037 Abstract of disk contents 37.1 3k AREA.BAS Metric conversion in CBASIC 37.2 2k AREA.INT Metric conversion in CBASIC 37.3 3k CHAIN.BAS Menu program for arithmetic drills 37.4 2k CHAIN.INT Menu program for arithmetic drills 37.5 1k COMMON1.TXT Part of arith. drill progs. 37.6 1k COMPILE.SUB Compiles arith. drill progs 37.7 3k CPUPARTSrectory 34.23 3k LABEL.SAM Demo prog. 34.24 1k LOOP.SAM Demo prog. 34.25 1k MOVE2.SAM Demo prog. 34.26 1k MULT.SAM Multiplies long decimal #'s 34.27 5k NEWS.SAM Random news story generator. 34.28 10k P1UR.FNT Used with graphics 34.29 15k PLOT.ASM For graphics on Poly/TRS-80 34.30 1k PLOT.DOC For graphics on Poly/TRS-80 34.31 7k PRINT.SAM Print SAM files 34.32# 3k READ-ME.DOC One user's experiences. 34.33# 2k S.DOC Doc on creating S.COM 34.34 1k SIZE.SAM Demo 34.35 1k SIZLST.SAM Demo 34.36 4k SLED.SAM Demo 34.37# 4k THREED.SAM Demo 34.38 7k UPD051.TXT ??? 34.39 7k UPD052.TXT ??? 34.40 1k VERIFY.SAM Demo 34.41# 6k VOLSAM.DOC Volume documentation 34.42# 3k X$UTIL.SAM Demo 34.43# 4k XD.COM * directory lister 34.44# 1k XDIR.COM * directory lister 34.45# 1k XM.COM * directory lister 35.01 4k -CATALOG.035 Contents of CP/M VOL. 35 35.02 2k ABSTRACT.035 Abstract of di7k contents 35.1 2k BEE.FAS Source code; A bee & a bird cartoon 35.2 10k BEE#.FEX Executable bee s FELIX source code 35.47 3k POSIT.ASM FELIX source code 35.48 3k PUTF.ASM FELIX source code 35.49 3k PUTW.ASM FELIX source code 35.50 1k RESCALE.ASM FELIX source code 35.51 5k ROTATE.ASM FELIX source code 35.52 1k SAPD.COM ???? 35.53 2k SAVEBACK.COM Utility for saving backgrounds to disk 35.54 2k SAVEOB.COM Utility for saving objects to disk 35.55 5k SHOWSWAP.ASM FELIX source code 35.56 4k SINCOS.OBJ A SIN-COS table+ some routines 35.57 1k SPIN.ASM FELIX source code 35.58 1k TABLE.ASM FELIX source code 35.59 2k TRACE.ASM FELIX source code 35.60 1k TRACE.COM Pseudo-machine interpreter with trace 35.61 2k XTRA.ASM FELIX source code 36.01 2k -CATALOG.036 Contents of CP/M Users Group Volume 36 36.02 6k ABSTRACT.036 Abstract on some files 36.1 7k COMBINE.ASM Combine .ASM files & delete comments 36.2 1k COMBINE.COM Combine .ASM files & delete comments 36.3 4k CPM-PEN.ASM Convert CP/M to electric pencil files 36.4 1k CPM-PEN.COM Convert CP/M to electric pencil files 36.5 8.BAS Data table for MANPARTS 37.8 41k CRAPS.BAS Very complete program 37.9 1k CRAPS.DOC Very complete program 37.10 19k CRAPS.INT Very complete program 37.11 3k DEC1.BAS Arithmetic drill 37.12 2k DEC1.INT Arithmetic drill 37.13 2k DEC2.BAS Arithmetic drill 37.14 2k DEC2.INT Arithmetic drill 37.15 3k DEC3.BAS Arithmetic drill 37.16 2k DEC3.INT Arithmetic drill 37.17 3k DEC4.BAS Arithmetic drill 37.18 3k DEC4.INT Arithmetic drill 37.19 3k DEC5.BAS Arithmetic drill 37.20 3k DEC5.INT Arithmetic drill 37.21 3k DEC6.BAS Arithmetic drill 37.22 3k DEC6.INT Arithmetic drill 37.23 3k DECIMAL.BAS Arithmetic drill 37.24 2k DECIMAL.INT Arithmetic drill 37.25 2k DISK.PRN More doc on CRAPS 37.26 3k DISTANCE.BAS Metric conversions drill 37.27 3k DISTANCE.INT Metric conversions drill 37.28 5k FORMULA.BAS Drill formulas, volume, etc 37.29 4k FORMULA.INT Drill formulas, volume, etc. 37.30 3k FRAC1.BAS Arithmetic drill 37.31 2k FRAC1.INT Arithmetic drill 37.32 3k FRAC2.BAS Arithmetory 35.3 5k CHECKOU&.FEX Executable checkout. 35.4 4k CHECKOUT.FAS Felix pseudo-machine diagnostic program 35.5 8k CLEAR.ASM Start of FELIX source code 35.6 1k CREATE.ASM FELIX source code 35.7 1k DISPONOF.ASM FELIX source code 35.8 1k DISTEST.FAS Demo of distance operator 35.9 5k DISTest&.FEX Executable Distance Test 35.10 11k DISTPLUS.ASM FELIX source code 35.11 14k DOODLE.ASM FELIX source code 35.12 1k DOODLE.COM Object Drawing Utility 35.13 3k DSKRD.ASM FELIX source code 35.14 1k EXEC.COM Pseudo-Machine Interpreter 35.15 2k EXEC.OBJ The 'actual' pseudo-machine 35.16 9k EXECPLUS.ASM FELIX source code 35.17 2k EXECSAFE.ASM FELIX source code 35.18 10k FANCY#.FEX #35.42 with a pretty init. background 35.19 9k FASM.COM Pseudo-Code Assembler 35.20 1k FCBMOV.ASM FELIX source code 35.21 1k FCBNEW.ASM FELIX source code 35.22 5k FELIX.ASM FELIX source code 35.23 1k FELIX.COM Initial Setup Routine 35.24 7k FELIX.DOC Some details about the system 35.25 3k FELIX.OBJ The 'ack FIND.ASM Find ASCII string in 1 or more files 36.6 1k FIND.COM Find ASCII string in 1 or more files 36.7 1k FIND.DOC Find ASCII string in 1 or more files 36.8 11k L82.COM ML80 Component 36.9 1k LINES.COM Count lines in an ASCII file 36.10 1k LINES.DOC Count lines in an ASCII file 36.11 6k LINKASM.COM ASM.COM with feature to link files 36.12 5k LINKASM.DOC ASM.COM with feature to link files 36.13 1k LIST.COM List files with starting line number 36.14 1k LIST.DOC List files with starting line number 36.15 10k M81.COM ML80 Component 36.16 11k MAC6.AZM I/O drivers for TDL macro assembler 36.17 2k MAC6.COM I/O drivers for TDL macro assembler 36.18 4k MAC6.DOC I/O drivers for TDL macro assembler 36.19 8k MBMBOT.ASC Memory bank boot & mgmt 36.20 3k MFACCESS.LIB Subroutine to setup multiple files 36.21 2k ML80.DOC DOC on ML80 components 36.22 9k ML80.REF Reference material on ML80 36.23 3k PEN-CPM.ASM Convert Electric Pencil to CP/M file 36.24 1k PEN-CPM.COM Convert Electric Pen'tic drill 37.33 2k FRAC2.INT Arithmetic drill 37.34 3k FRAC3.BAS Arithmetic drill 37.35 2k FRAC3.INT Arithmetic drill 37.37 3k FRAC4.BAS Arithmetic drill 37.37 2k FRAC4.INT Arithmetic drill 37.38 4k FRACTION.BAS Arithmetic drill 37.39 3k FRACTION.INT Arithmetic drill 37.40 1k GRADE.BAS Arith drill grading program 37.41 1k HEADER.BAS %Include for drill progs. 37.42 4k INTEGER.BAS Arithmetic drill 37.43 3k INTEGER.INT Arithmetic drill 37.44 13k JRNL.BAS Accounting program 37.45 9k JRNL.INT Accounting program 37.46 1k MANPARTS.BAS Manufactured parts program 37.47 3k NEWFRAC2.BAS Arithmetic Drill program 37.48 1k PARTS.BAS Parts list generator 37.49 2k PASSWORD.BAS Change BASIC keywords 37.50 3k PERCENT.BAS Arithmetic drill program 37.51 2k PERCENT.INT Arithmetic drill program 37.52 3k VOLUME.BAS Arithmetic drill program 37.53 2k VOLUME.INT Arithmetic drill program 37.54 3k WEIGHT.BAS Arithmetic drill program 37.55 2k WEIGHT.INT Arithmetic drill program 37.56 3k WHOL.14 3k CHORALE.MUS Source music score 39.15 1k DAISY.MUS Source music score 39.16 1k ENTER.MUS Source music (Partial) 39.17 1k FIX.SUB To remove (") from music 39.18 3k HUSTLE.MUS Source music score 39.19 1k IRISH.MUS Source music score 39.20 2k LAWRENCE.MUS Source music score (Arabia) 39.21 3k LVBMIN.MUS Source music score 39.22 7k LVBMIN.NOT Compiled score 39.23 2k MAPLE.MUS Source music score 39.24 1k MARINE.MUS Source music score 39.25 3k MINWALZ.MUS Source music (L-uuuv it) 39.26 1k MRIVER.MUS Source music score 39.27 5k MUSIC.COM Executable code 39.28 13k MUSIC.DOC Doc incl how to put on your micro 39.29 14k MUSIC4.ASM The music driver program 39.30 2k MUSIC4.COM COM of above 39.31 2k MUSIC4.DOC Doc on MUSIC4 39.32 3k MUSPAT.DOC DOC on following: 39.33 7k MUSPAT.HEX HEX patch file 39.34 2k MYLIFE.MUS Source music score 39.35 3k NOTES.BAS Tune constructing program 39.36 2k NOTES.INT Tune constructing program 39.37 1k PIC.MUS Source music score 39.38 3k PREdalone & p/o catalog sys 40.26 9k HEXDUMP.ASM Binary to Hex (RequiresTDL asm) 40.27 1k MAST.CAT Sample master catalog 40.28 40k MODEM4.ASM File xfer, PMMI/Hayes,serial 40.29 7k MODEM4.DOC File xfer, PMMI/Hayes/serial 40.30 3k NSBOOT.ASM Boot for National Semi 8221 40.31 12k NSCBIOS.ASM CBIOS for National Semi 8221 40.32 3k PBOOT.ASM Pascal boot loader for Tarbell 40.33 5k PGEN.ASM Boot mods for 512 long sectors 40.34 17k PMMIBYE3.ASM Dial in remote console prog. 40.35 7k SPASCAL.DOC Sam Singer's PASCAL mods 40.36 2k UCAT.COM Update catalog program 40.37 3k VDMSAVE.ASM Write VDM lines to a file -CATALOG.041 Contents of CP/M Volume 41 ABSTRACT.041 Abstracts on some files 41.1 12k BMAINT.BAS Ham maillist maint. BASIC/E 41.2 12k BREPORT.BAS Ham Maillist report 41.3 26k CHESS.COM Cromemco Z-80 Fortran Chess 41.4 2k CHESS.DOC Doc on Chess program 41.5 24k CHESS.FOR Source in FORTRAN 41.6 2k CODE.BAS Simple Morse code receiver 41.7 3k HAMPROGS.DOC Doc on BMAINT, BREPORT, RTTY, etE.BAS Arithmetic drill program 37.57 2k WHOLE.INT Arithmetic dril program 38.01 2k -CATALOG.038 Contents of CP/M Users Group Volume 38 38.02 5k ABSTRACT.038 Abstracts on some of the files. 38.1 5k VBOOT.ASM Tarbell Boot for full sized system 38.2 28k BVIOS.ASM Compact BIOS for Tarbell system 38.3 56k DFOCO.ASM Tarbell DD format and copy 38.6 1k DMSPATCH.ASM FAST for Digital Micro Sytems drives 38.7 1k DSCUSPAT.ASM FAST patch for Discus 2D 38.8 20k FAST.ASM Speed up transients via 38.9 2k FAST.COM Track & dir. buffering. 38.10 3k FASTNSTL.DOC FAST installation DOC 38.11 18k FMAN.PRN FAST operations manual 38.12 18k MACRO.LIB Used by DFOCO 38.13 1k MICROPAT.ASM FAST patch for Micropolis 38.14 15k PACKUP.ASM Part of FAST 38.15 4k REL.ASM Relocation utility source 38.16 2k REL.UTL Relocation utility 38.17 2k RELCPM.DOC DOC on relocation programs 38.18 1k RELCPM.SUB SUBMIT file for relocations 38.19 1k RELED.SUB SUBMIT file for relocations 38.20 2k RELHDR.ASM Handler for REL.ULUDE.MUS Source music score 39.39 1k PUR2MIN.MUS Source music score 39.40 3k PUR2MIN.NOT Compiled score 39.41 3k REMOV".ASM Remove (") from a file 39.42 1k REMOV".COM Remove (") from a file 39.43 1k ROLLING.MUS Source music score 39.44 2k SARABAND.MUS Source music score 39.45 2k SMALL.MUS Source music score 39.46 3k SPREAD.MUS Source music (Interesting) 39.47 2k STARWARS.MUS Source music score 39.48 2k TINSOLD.MUS Source music (a start...) 39.49 2k WALK.MUS Source music (Terriffikk) 39.50 1k WAVES.MUS Source music score 39.51 3k WHATI.MUS Source music score 39.52 3k WIERD.MUS Source music score 39.53 2k YANKEE.MUS Source music score (good!) 40.01 2k -CATALOG.040 Contents of CP/M Users Group Volume 40 40.02 8k ABSTRACT.040 Abstract on some of the files. 40.1 1k /.COM Quickie submit; Example: 40.2 1k /.DOC / ASM FOO.BBZ;LOAD B:FOO 40.3 1k ALLOC.COM Prints bit map of disk usage 40.4 1k ALLOC.DOC Prints bit map of disk usage 40.5 37k BOOTER.ASM Pascal boot for Tarbell c 41.8 2k LABELS.BAS Print return labels 41.9 6k MOONLOC.DOC Doc for Ham Radio Moon location pgrms 41.10 3k MOONLOC1.BAS Moon Bounce program - Ham radio 41.11 3k MOONLOC2.BAS Moon Bounce program - Ham radio 41.12 7k MOONLOC3.BAS Moon Bounce program - Ham radio 41.13 5k MOONLOC5.BAS Moon Bounce program - Ham radio 41.14 8k MORSE.ASM Morse send/receive program - Ham radio 41.15 7k PONG.ASM (3) PONG for the VDM (re-release #6.9) 41.16 8k PRACTICE.ASM Morse code teacher - Ham radio 41.17 2k RANDTEX.BAS Generate text for 41.16 - Ham radio 41.18 2k RESIZE.DOC Part of ham radio maillist system 41.19 5k RESIZE2.BAS Part of ham radio maillist system 41.20 5k RESIZE3.BAS Part of ham radio maillist system 41.21 26k RTTY.ASM RTTY send/receive program - Ham radio 41.22 12k SSPLIB.FOR Curve fit/simultaneous equation solver 41.23 10k TEACH.ASM Morse Code teaching program - Ham radio 41.24 9k TTY.ASM Baudot-coded ASCII to ASCII - Ham radio 41.25 5k TTYR.ASM Variation of #41.24 - Ham radio 4TL 38.21 3k RSPEED.ASM Determine how fast your disk reads 38.22 1k RSPEED.COM Determine how fast your disk reads 38.23 1k SKEW2PAT.ASM Skew table patch for FAST 38.24 1k SKEW3PAT.ASM Skew table patch for FAST 38.25 2k SMAN.PRN Speed operations manual 38.26 5k SPEED.COM CCP replacement with full trk blocking 38.27 3k UTL.LIB Macro library for reloc. 39.01 4k -CATALOG.039 Contents OF CP/M Users Group Volume 39 39.02 3k ABSTRACT.039 Abstracts on some of the files 39.1 2k 2PRTFJSB.MUS Source music score, BACH 39.2 4k 2PRTFJSB.NOT "Compiled" score 39.3 4k AIR.MUS Source music score 39.4 1k ALLEGRO.MUS Source music score 39.5 1k AMERICA.MUS Source music score 39.6 3k ARIA.MUS Source music score 39.7 2k AWAVE.BAS Wave form generator 39.8 2k AWAVE.INT Wave form generator 39.9 1k BOOGIE.MUS Source music (diddling) 39.10 2k BOUREE.MUS Source music score 39.11 1k BREEZ.MUS Source music score 39.12 2k CALIOPE.MUS Source music (Super!) 39.13 1k CHOPS.MUS Source music score 39& Delta 40.6 1k CAT.COM Part of master cataloging sys. 40.7 1k CAT2.COM Part of master cataloging sys. 40.8 5k CATALOG.DOC Doc on master cataloging system 40.9 1k CK-FIX.COM File checksum program 40.10 1k CK-FIX.DOC File checksum program 40.11 4k COMPARE.ASM See if two files match exactly 40.12 2k COMPARE.COM See if two files match exactly 40.13 8k CV.ASM Split screen VDM 2 file compare 40.14 1k CV.COM Split screen VDM 2 file compare 40.15 1k CV.DOC Split screen VDM 2 file compare 40.16 1k D.COM Shows file differences between sessions 40.17 1k D.DOC Shows file differences between sessions 40.18 14k DI.ASM Directory listing program 40.19 2k DI.COM Directory listing program 40.20 26k DU.ASM Disk utility: scan, patch, etc. 40.21 4k DU.COM Disk utility: scan, patch, etc. 40.22 1k DU.DOC Disk utility: scan, patch, etc. 40.23 1k EJECT.ASM "EJECT n" pages on CPM list dev 40.24 1k FMAP.COM File map - standalone & p.o catalog sys 40.25 1k FMAP.DOC File map - stan(1.26 5k TTYR1.ASM Variation of #41.24 - Ham radio 41.27 5k TTYX.ASM Xmit ASCII via conversion - Ham radio -CATALOG.042 Contents of CP/M Volume 42 ABSTRACT.042 Abstracts on some of the files 42.1 9k BIDI.ASM Bidirectional Diablo driver 42.2 3k CLKROM.ASM Compu-time (R) routines 42.3 1k CT*@.COM SWTPC CT82 initializer 42.4 6k CT82.Z80 TDL Z-80 source for SWTPC CT82 init 42.5 44k DIS.ASM TDL Z-80 Disassembler 42.6 5k DIS.DOC Doc for TDL Z-80 disassembler 42.7 3k HOW2BS.DOC Put backspace into your BIOS 42.8 2k INIT.TEL ZTEL-CT82 routines 42.9 17k LIFE8.ASM LIFE for VDM 42.10 3k LIFE8.COM LIFE for VDM 42.11 2k LIFE8.DOC LIFE for VDM 42.12 27k MNEMONIC.ASM Memory test(see MNEMONIC in dictionary) 42.13 7k MBIOS.ASM BIOS for TEI CP/M 42.14 4k PTSRCNVT.ASM Proc Tech ALS-8 to CP/M file convert 42.15 2k PTSRCNVT.COM Proc Tech ALS-8 to CP/M file convert 42.16 2k PTSRCNVT.DOC Proc Tech ALS-8 to CP/M file convert 42.17 13k QUOTES.PRN Words of wit and wisdom 42.18 6k RESOURCE.COM rne A/P-A/R Accounting 43.31 2k FILEINIT.BAS Osborne A/P-A/R Accounting 43.32 1k G/L-INFO.BAS Osborne A/P-A/R Accounting 43.33 2k GENINFO.BAS Osborne A/P-A/R Accounting 43.34 1k READCUST.BAS Osborne A/P-A/R Accounting 43.35 1k READINV.BAS Osborne A/P-A/R Accounting 43.36 1k READVEND.BAS Osborne A/P-A/R Accounting 43.37 5k SUBS1.BAS Osborne A/P-A/R Accounting 43.38 1k WRITCUST.BAS Osborne A/P-A/R Accounting 43.39 2k WRITEINV.BAS Osborne A/P-A/R Accounting 43.40 1k WRITEVND.BAS Osborne A/P-A/R Accounting CATALOG.44 CONTENTS OF CP/M VOL. 44 44.1 3k ABSTRACT.044 Comments on contents of volume 44.2 2k ACCTFILE.BAS Part of Osborne General Ledger 44.3 5k ANNTOT1.BAS Part of Cunningham Ledger 44.4 3k ANNTOT1.INT Part of Cunningham Ledger 44.5 1k BINSERCH.BAS Part of Osborne General Ledger 44.6 12k BUDGET1.BAS Part of Cunningham Budget 44.7 2k BUDGET1.DOC Part of Cunningham Budget 44.8 6k BUDGET1.INT Part of Cunningham Budget 44.9 5k BUDGETCH.BAS Part of Cunningham Budget 44.10oll Accounting 45.7 3k P/R030.BAS Osborne Payroll Accounting 45.8 2k P/R040.BAS Osborne Payroll Accounting 45.9 10k P/R050.BAS Osborne Payroll Accounting 45.10 4k P/R06A.BAS Osborne Payroll Accounting 45.11 8k P/R06B.BAS Osborne Payroll Accounting 45.12 4k P/R070.BAS Osborne Payroll Accounting 45.13 2k P/R080.BAS Osborne Payroll Accounting 45.14 8k P/R090.BAS Osborne Payroll Accounting 45.15 9k P/R100.BAS Osborne Payroll Accounting 45.16 8k P/R110.BAS Osborne Payroll Accounting 45.17 3k P/R120.BAS Osborne Payroll Accounting 45.18 4k P/R130.BAS Osborne Payroll Accounting 45.19 6k P/R140.BAS Osborne Payroll Accounting 45.20 3k P/R150.BAS Osborne Payroll Accounting 45.21 2k P/R160.BAS Osborne Payroll Accounting 45.22 3k P/R170.BAS Osborne Payroll Accounting 45.23 8k P/R180.BAS Osborne Payroll Accounting 45.24 4k P/R190.BAS Osborne Payroll Accounting 45.25 7k P/R200.BAS Osborne Payroll Accounting 45.26 9k P/R210.BAS Osborne Payroll Accounting 45.27 6k P/R220.BAS Osborne PaConversational disassembler 42.19 26k RESOURCE.DOC Doc on conversational disassembler 42.20 5k START.ASM Compucolor 8001 initializer 42.21 1k START.COM Compucolor 8001 initializer 42.22 2k T.ASM Print time on your console 42.23 1k T.COM Print time on your console 42.24 3k TIME.ASM Compu-time (R) routine 42.25 2k TIME.BAS Time display in MBASIC 42.26 5k TIMESET.BAS Time set/read in MBASIC 42.27 25k XT.ASM List to printer with time/date stamp 42.28 2k XT.COM List to printer with time/date stamp 42.29 1k XYZZY.COM [[Type it and see]] CATALOG.43 CONTENTS OF CP/M VOL. 43 43.1 1k A/P-INFO.BAS Osborne A/P-A/R Accounting 43.2 1k A/P000.BAS Osborne A/P-A/R Accounting 43.3 13k A/P010.BAS Osborne A/P-A/R Accounting 43.4 4k A/P02A.BAS Osborne A/P-A/R Accounting 43.5 6k A/P02B.BAS Osborne A/P-A/R Accounting 43.6 12k A/P030.BAS Osborne A/P-A/R Accounting 43.7 11k A/P040.BAS Osborne A/P-A/R Accounting 43.8 6k A/P050.BAS Osborne A/P-A/R Accounting 43.9 7k A/P060.BAS Osborne A/P-A/R A 2k BUDGETCH.INT Part of Cunningham Budget 44.11 1k CBAS.SUB SUBMIT for compiling Osborne programs 44.12 10k CRTFM.BAS CRT File Maintenance Utility for G/L 44.13 4k CRTFM.INT CRT File maint Utility for G/L 44.14 2k CURSOR.BAS Part of Osborne General Ledger. 44.15 2k EXP1980.TOT Data file from Cunningham Budget. 44.16 1k EXPENS80.JAN Data file from Cunningham Budget. 44.17 1k FILEINIT.BAS Utility for Osborne General Ledger. 44.18 1k FILEINIT.INT Utility for Osborne G/L 44.19 2k G/L.DOC Comments on Osborne General Ledger. 44.20 2k G/L-INFO.BAS Part of Osborne General Ledger. 44.21 1k G/L000.BAS Osborne G/L Accounting 44.22 2k G/L000.INT Osborne G/L Accounting 44.23 6k G/L010.BAS Osborne G/L Accounting 44.24 4k G/L010.INT Osborne G/L Accounting 44.25 6k G/L020.BAS Osborne G/L Accounting 44.26 2k G/L020.INT Osborne G/L Accounting 44.27 6k G/L030.BAS Osborne G/L Accounting 44.28 5k G/L030.INT Osborne G/L Accounting 44.29 9k G/L040.BAS Osborne G/L Accounting 44.30 6k G/L040.yroll Accounting 45.28 5k P/R230.BAS Osborne Payroll Accounting 45.29 9k P/R240.BAS Osborne Payroll Accounting 45.30 3k P/R250.BAS Osborne Payroll Accounting 45.31 3k P/R260.BAS Osborne Payroll Accounting 45.32 6k P/R270.BAS Osborne Payroll Accounting 45.33 15k P/R280.BAS Osborne Payroll Accounting 45.34 4k P/R290.BAS Osborne Payroll Accounting 45.35 10k P/R291.BAS Osborne Payroll Accounting 45.36 11k P/R300.BAS Osborne Payroll Accounting 45.37 5k P/R310.BAS Osborne Payroll Accounting 45.38 3k P/R320.BAS Osborne Payroll Accounting 45.39 7k P/R321.BAS Osborne Payroll Accounting 45.40 6k P/R330.BAS Osborne Payroll Accounting 45.41 3k P/R340.BAS Osborne Payroll Accounting 2k -CATALOG.046 CONTENTS OF CP/M VOL. 46 46.1 11k ABSTRACT.046 Volume abstracts 46.2 11k CPM-FDOS.ASM CPM to ICOM FDOS II transfer 46.3 17k CPMLABEL.BAS Make CPMUG disk labels 46.4 18k <> (Was MBASIC compile of CPMLABEL.BAS) 46.5 5k CPMLABEL.DOC Make CPMUG disk labels 46.6 8k CRCK3.ASM Full 16 bit CRccounting 43.10 11k A/P070.BAS Osborne A/P-A/R Accounting 43.11 2k A/P080.BAS Osborne A/P-A/R Accounting 43.12 11k A/P090.BAS Osborne A/P-A/R Accounting 43.13 5k A/P110.BAS Osborne A/P-A/R Accounting 43.14 10k A/P120.BAS Osborne A/P-A/R Accounting 43.15 2k A/R-INFO.BAS Osborne A/P-A/R Accounting 43.16 1k A/R-INV.BAS Osborne A/P-A/R Accounting 43.17 12k A/R010.BAS Osborne A/P-A/R Accounting 43.18 5k A/R020.BAS Osborne A/P-A/R Accounting 43.19 4k A/R03A.BAS Osborne A/P-A/R Accounting 43.20 12k A/R03B.BAS Osborne A/P-A/R Accounting 43.21 9k A/R040.BAS Osborne A/P-A/R Accounting 43.22 11k A/R050.BAS Osborne A/P-A/R Accounting 43.23 2k A/R060.BAS Osborne A/P-A/R Accounting 43.24 9k A/R070.BAS Osborne A/P-A/R Accounting 43.25 5k A/R080.BAS Osborne A/P-A/R Accounting 43.26 2k A/RTAX.BAS Osborne A/P-A/R Accounting 43.27 1k ABSTRACT.043 Abstracts of A/P-A/R Programs. 43.28 1k BINSEARC.BAS Part of A/P-A/R Package. 43.29 10k CRTFM.BAS Osborne A/P-A/R Accounting 43.30 2k CURSOR.BAS OsboINT Osborne G/L Accounting 44.31 12k G/L050.BAS Osborne G/L Accounting 44.32 6k G/L050.INT Osborne G/L Accounting 44.33 5k G/L070.BAS Osborne G/L Accounting 44.34 4k G/L070.INT Osborne G/L Accounting 44.35 8k G/L080.BAS Osborne G/L Accounting 44.36 5k G/L080.INT Osborne G/L Accounting 44.37 1k GENINFO.BAS Osborne G/L Accounting 44.38 7k LEDGER1.BAS Cunningham Ledger 44.39 2k LEDGER1.DOC Cunningham Ledger 44.40 3k LEDGER1.INT Cunningham Ledger 44.41 2k POSTFILE.BAS Part of Osborne General Ledger 44.42 3k ROBO.BAS Cunningham Math Game 44.43 1k ROBO.DOC Cunningham Math game 44.44 2k ROBO.INT Cunningham Math game 44.45 5k SUBS1.BAS Part of Osborne General Ledger 44.46 0k TCGWOZ.TXT Collected Great Works of Zoso 45.1 1k -CATALOG.045 CONTENTS OF CP/M VOL. 45 45.2 2k ABSTRACT.045 Abstract of CP/M Vol. 45 45.3 1k P/R.SUB SUBMIT file for CBAS2 Payroll package 45.4 2k P/R000.BAS Menu Program for P/R 45.5 5k P/R010.BAS Osborne Payroll Accounting 45.6 13k P/R020.BAS Osborne Payr(C of a file 46.7 1k CRCK3.COM Full 16 bit CRC of a file 46.8 16k DU-8/12.ASM Disk dump/patch, for many controllers 46.9 29k DU-V61.ASM Later version of CPMUG 40.20 (1D only) 46.10 2k DU/MAP.DOC Doc. on CP/M directory format 46.11 6k FDOS-CPM.ASM ICOM FDOS II to CP/M transfer 46.12 10k MDIR8/17.ASM Fancy directory list program, 46.13 1k MDIR8/17.COM CP/M 1.4 (or 2.X, all users) 46.14 6k MLIST3.ASM Type multiple files with disk buffering 46.15 20k PLINK823.ASM Send/Rcv to memory via modem 46.16 22k PMMIBYE5.ASM Remote console program (#40.34) 46.17 3k PMMIBYE5.DOC Remote console program (#40.34) 46.18 2k PTSRCNVT.COM Convert Proc Tech to CP/M ASM 46.19 2k PTSRCNVT.DOC Convert Proc Tech to CP/M ASM 46.20 7k RETDL.COM Disassembler to TDL mnemonics 46.21 13k SURVEY3.ASM Maps system memory/port usage 46.22 1k SURVEY3.COM Maps system memory/port usage 46.23 20k XD-7/4.ASM Fancy directory list program 46.24 2k XD-7/4.COM Fancy directory list program CATALOG.47 CONTENTS OF CP/M VOL. 47 uter opponent 48.25 2k TABIFY.C Turn multiple spaces into CP/M tabs 48.26 6k TABIFY.COM Turn miltiple spaces into CP/M tabs 48.27 7k TTT.C Tic-Tac-Toe that tests for best move 48.28 6k TTT.COM Tic-Tac-Toe that tests for best move 48.29 3k VOLUME48.DOC Leor's own comments -CATALOG.049 CONTENTS OF CP/M VOL. 49 49.1 4k 4FDCBIOS.DOC Run CP/M 2.0+ on CDOS system 49.2 2k 4FDCBIOS.HEX Run CP/M 2.0+ on CDOS system 49.3 13k 4FDCBIOS.Z80 Run CP/M 2.0+ on CDOS system 49.4 1k 4FDCBOOT.HEX Run CP/M 2.0+ on CDOS system 49.5 2k 4FDCBOOT.Z80 Run CP/M 2.0+ on CDOS system 49.6 11k ABSTRACT.049 Abstracts of the files on this disk 49.7 1k ASMDEF.RAT Used by LCAT, part of RATFOR. 49.8 6k ASTRO.FOR FORTRAN Astronomy program. 49.9 10k CDOS.DOC Comments on CDOS features. 49.10 2k CDOSCOPY.COM Disk copy pgrm for CDOS systems 49.11 2k CDOSCOPY.DOC Disk copy pgrm for CDOS systems 49.12 4k CDOSCOPY.HEX Disk copy pgrm for CDOS systems 49.13 26k CDOSCOPY.PRN Disk copy pgrm for CDOS systems 49.14 12k Ce to compile a Pascal program 50.11 7k PFET.COM P-code to 8080 translator 50.12 11k PFET.PAS P-code to 8080 translator 50.13 1k PHONE.C Phone number to word translator 50.14 1k PLAYDATA Sample data for PLAYKAL.PAS below 50.15 13k PLAYKAL.PAS Pascal game of Kalah 50.16 2k POPS.DOC P-codes used by the compiler 50.17 1k POWTWO.PAS Print negative powers of two 50.18 16k PPC.COM Pascal to p-code compiler 50.19 10k PPC.DOC Users manual for Pascal compiler 50.20 26k PPC.PAS Source of Pascal compiler 50.21 2k PSTACK.DOC Doc on the run time p-machine stack 50.22 3k REGEN.DOC How to modify and compile the compiler -50.23 11k RTP.ASM Source for the run time package 50.24 2k RTP.COM Object of run time package 50.25 5k SPEED.COM Disk buffering to gain speed 50.26 5k SPEED2.COM Disk buffering for 2.x systems 50.27 1k STIRLING.PAS Print powers of two Stirling numbers 50.28 4k TESTER.PAS Tests functionality of Pascal compiler 50.29 1k VALIDATE.SUB File to test your compiler CATALOG.05 47.1 7k ABSTRACT.047 Abstracts and reviews. 47.2 10k BMAP7/11.ASM Bit Map program. 47.3 22k COPYFAST.ASM Revision of Tarbell's COPY.ASM 47.4 2k COPYFAST.COM Revision of Tarbell's COPY.ASM 47.5 18k CYBER.ASM Bob Van Valzah's Modem program 47.6 22k DIAL6/23.ASM Modem program with autodial for PMMI 47.7 2k DIAL6/23.DOC Modem program with autodial for PMMI 47.8 8k DIRS9/8.ASM Sorted directory program. 47.9 3k FLIP3.ASM Flips Answer/Originate mode w/BYE.COM 47.10 14k MODEM.LIB Maclib library for MODEM7. 47.11 43k MODEM7.ASM Ward's "universal" modem pgrm 47.12 8k MODEM7.COM Ward's "universal" modem pgrm 47.13 16k MODEM7.DOC Ward's "universal" modem pgrm 47.14 3k MODEM7.SET Instructions for patching COM file 47.15 13k PROM.ASM Promburner program for the SSM PB1. 47.16 7k UCOPY.ASM Bob Van Valzah's version of COPY 6k ABSTRACT.048 Abstracts of the programs 48.1 17k BDS-C.DOC BDS-C users manual (*) 48.2 7k BDSCIO.H The standard library 48.3 8k BUGS.C Makes things crawl on your screen <DOSCOPY.Z80 Disk copy pgrm for CDOS systems 49.15 1k CONSTS.RAT Definitions of RATFOR constants 49.16 1k F77.DOC FORTRAN 77 Documentation. 49.17 1k F77DEF.RAT FORTRAN 77 Functions. 49.18 2k F77LIB.FOR Definitions of intrinsic FORTRAN 77 49.19 3k FILTER.Z80 Emulate CDOS under standard CP/M 49.20 1k FILTER.HEX Emulate CDOS under standard CP/M 49.21 6k FILTER2.Z80 Modified version of FILTER #49.19 49.22 1k FILTER2.HEX Modified version of FILTER #49.19 49.23 2k INDEX.Z80 RATFOR Subroutine. 49.24 1k INDEXT.FOR Test for INDEX.Z80. 49.25 1k IOER.Z80 Used by LCAT (RATFOR). 49.26 1k LCAT.DOC Concatenate Microsoft .REL files 49.27 3k LCAT.RAT Concatenate Microsoft .REL files 49.28 2k MINV.DOC Matrix Inversion Determinant Calculator 49.29 3k MINV.FOR Calculator, FORTRAN source code 49.30 3k MINV.RAT Calculator, RATFOR source code. 49.31 2k RATCOMNS.RAT Used by RATFOR. 49.32 3k RATFOR.DOC Documentation of RATFOR. 49.33 40k RATFOR.FOR FORTRAN source code for RATFOR. 49.34 25k RATFOR.1 CONTENTS OF CP/M VOL. 51 51.1 2k ABSTRACT.051 Overview of volume 51.2 16k ALX.S2M Assembly Language Extension macros 51.3 3k ALX-.DOC Doc on ALX 51.4 3k ALXTEST.ALX Sample macros to test ALX 51.5 4k CIO.ALX Console I/O routines in ALX 51.6 2k CRCK.COM Keith Petersen pgrm to CRC check files 51.7 1k CRCKLIST.CRC Contains the CRCs for all files on disk 51.8 2k DEMO.S2M Interactive STAGE2 demo macros. 51.9 17k DISKIO2.SRC Disk I/O for STAGE2 processor 110 6k DISKIO2-.DOC DOC on STAGE2 Disk I/O 51.11 5k FLD1.DAT Sample data for FLUB test 51.12 4k FLD2.DAT Sample data for FLUB test 51.13 13k FLT1.FLB Sample program for FLUB test 51.14 11k FLT2.FLB Sample program for FLUB test 51.15 1k FLUB$.SUB Submit file for FLT1, FLT2, STG2. 51.16 4k FLUB8080.S2M Macros to turn FLUB into 8080 asm 51.17 3k HELP.DOC First-timer's "to do" list. 51.18 2k IMPL.DOC Notes on implementing STAGE2 51.19 2k INTERACT.S2M Another macro demo 51.20 22k INTRO.DOC Sufficient info to "read" STAGE2 macros 51H> 48.4 11k BUGS.COM Makes things crawl on your screen 48.5 9k HLIFE.C H19/H89 version of LIFE.C #48.9 48.6 8k HLIFE.COM H19/H89 version of LIFE.C #48.9 48.7 13k HSTONE.C "Awari" game program - 48.8 12k HSTONE.COM "Awari" game program - 48.9 9k LIFE.C Good implementation of Conway's LIFE 48.10 8k LIFE.COM Good implementation of Conway's LIFE 48.11 5k MM.C Mastermind interesting guessing game 48.12 7k MM.COM Mastermind interesting guessing game 48.13 11k OTHELLO.C Game program 48.14 12k OTHELLO.COM Game program 48.15 7k PPONG.C "Polish Pong" bounce the ball 48.16 7k PPONG.COM "Polish Pong" bounce the ball 48.17 8k PRESSUP.C Game program 48.18 8k PRESSUP.COM Game program 48.19 1k R2.MAP Map for rally game 48.20 10k RALLY.C Road rally arcade game 48.21 10k RALLY.COM .COM of 48.20 but hard-coded I/O needed 48.22 2k RALLY.MAP Another map for 48.21 48.23 10k STONE.C "Awari" game with computer opponent 48.24 9k STONE.COM "Awari" game with compRAT RATFOR source code for RATFOR. 49.35 17k RATFOR.REL Microsoft REL file w/o library routines 49.36 1k READLB.Z80 Subroutine for SCOPY (RATFOR). 49.37 1k RFG.CMD CDOS equivelent of a submit file (^=$) 49.38 1k SCOPY.DOC Direct Disk I/O (RATFOR). 49.39 2k SCOPY.FOR Direct Disk I/O FORTRAN source code. 49.40 1k SORTI.DOC Quicksort program (RATFOR). 49.41 2k SORTI.FOR Quicksort FORTRAN Source code. 49.42 3k SORTI.RAT Quicksort RATFOR Source code. 49.43 1k TRNSLT.Z80 Used by RATFOR. 50.01 2k COMPARE.COM File compare utility #40.12 50.02 2k CPMDIR.C V7 UNIX C pgrm to print CP/M directory 50.03 3k DISK.DOC Original Vol 50 doc file 50.04 2k EQ.PAS Prints "eight queens problem" solutions 50.05 5k FROMCPM.C V7 UNIX C program to read a CP/M file 50.06 1k FWD.PAS Illustrates fwd procedure declarations 50.07 15k HW5.PAS Builds an optimal binary search tree 50.08 1k HW5DATA Sample data for HW5.PAS 50.09 6k PASYNTAX.DOC Syntax graphs for Pascal compiler 50.10 1k PC.SUB Submit fil).22 1k IOOP$.SUB Submit for macro pass + asm of above 51.21 16k IOOP.SRC I/O processor 8080 source 51.23 1k MEMORY.INP Another macro demo 51.24 2k ST2T.DAT STAGE2 file 51.25 12k STAGE2.COM The executable macro processor itself 51.26 48k STG2.FLB Source for STAGE2 in FLUB code 51.27 5k STG2MATH.ASM STAGE2 support routines 51.28 5k STG2SUP.ASM STAGE2 file 51.29 8k TERM.ALX Sample 8080 terminal pgrm w/ALX macros 51.30 3k TERMSUP.ASM Subroutines for TERM.ALX 51.31 2k USE.DOC How to execute STAGE2 51.32 6k VDB.ALX ALX TDL video driver -a "state machine" 51.33 5k VOLUME51.DOC Dick Curtiss' excellent documentation -CATALOG.052 CONTENTS OF CP/M VOL. 52. ABSTRACT.052 Abstracts of files on this disk CRCK.COM CRC program (see abstracts) 52.1 12k BATCH.1 SIL80 source for BATCH 52.2 10k BATCH.3 SIL80 source for BATCH 52.3 2k BATCH.COM Batch (limited capability file) 52.4 1k BATCH.CTL Control table for batch 52.5 5k BATCH.HEX Batch hex file 52.6 35k BATCH.RM Batch Reference Manua3.30 2k SAVEADV.CRL BDS-C Adventure game 53.31 14k TURN.C BDS-C Adventure game 53.32 10k TURN.CRL BDS-C Adventure game 53.33 13k VERB.C BDS-C Adventure game 53.34 8k VERB.CRL BDS-C Adventure game -CATALOG.054 Contents of CP/M Users Group Volume 54 ABSTRACT.054 Abstracts of programs CRCK.COM CRC filecheck program CRCKLIST.054 List of CRC's of files 54.1 3k 1CHECK.BAS Solitaire checker puzzle 54.2 2k ALFABET2.BAS Interactive alphabetizing, expanded 54.3 1k ALFABET1.BAS Original bugged version of 52.2 54.4 2k ARITH.BAS Add & subtract for elememtary students 54.5 4k BIOCAL.BAS Biorythmic calendar (Bugs) 54.6 8k BLKJAC.BAS Blackjack (21) game 54.7 3k BOMBER.BAS WW2 Bomber game 54.8 2k BOUNCE.BAS Plots a bouncing ball 54.9 7k BUG.BAS 'Draw Bugs faster than your computer' 54.10 2k BULCOW.BAS Buggy program, number guessing game 54.11 7k BUNNY.BAS Draws a 'bunny' on your CRT 54.12 3k BUZZWD.BAS Selects a list of 'buzzwords' 54.13 4k CHASE.BAS High Voltage survival game 5 ?k TVPLOT.BAS Produces various funny TV plots 54.54 ?k TYPING.BAS Typing drill with a random generator 54.55 ?k WEKDAY.BAS ?? 54.56 ?k WISHES.BAS Wish poem writing program for children 55.01 1k -CATALOG.055 Contents of CP/M Users Group Volume 55 55.02 2k ABSTRACT.055 Notes on ADVENTURE 55.1 39k AD.COM Original Adventure game 55.2 63k ADVENTUR.MSG Original Adventure game 55.3 2k ATAB.DAT Original Adventure game 55.4 4k COMMON.DAT Original Adventure game 55.5 1k KTAB.DAT Original Adventure game 55.6 1k LTEXT.DAT Original Adventure game 55.7 1k RTEXT.DAT Original Adventure game 55.8 1k STEXT.DAT Original Adventure game 55.9 5k TRAVEL.DAT Original Adventure game 56.01 1k -CATALOG.056 Contents of CP/M Users Group Volume 56 56.02 3k ABSTRACT.056 Implementation notes 56.1 28k ADINIT.COM Adventure source code 56.2 13k ADVENSUB.FOR Adventure source code 56.3 5k ADVENT.FOR Adventure source code 56.4 74k ADVENTUR.DAT Adventure source code 56.5 29k ADVINIT3.FOR Adventure source codl (.DOC) 52.7 21k BATCH.SYM Batch Symbol Table 52.8 2k CPYFST35.ABS Chuck's comments on Copyfast 52.9 26k CPYFST35.ASM Source code for COPYFAST 52.10 28k CPYFST35.DOC Documentation for COPYFAST 52.11 2k CPYFST3F.COM Fast copy program for fast disks 52.12 2k CPYFST3M.COM Fast copy program for medium disks 52.13 2k CPYFST3S.COM Fast copy program for slow disks 52.14 1k CRCKLIST.CRC CRC list of programs on this disk 52.15 2k EXAMPLE.BAT Sample BATCH file 52.16 23k VARBATCH.1 SIL80 source for VARBATCH 52.17 10k VARBATCH.3 SIL80 source for VARBATCH 52.18 3k VARBATCH.COM Object of VARBATCH 52.19 1k VARBATCH.CTL Control table of VARBATCH 52.20 7k VARBATCH.HEX Hex file of VARBATCH 52.21 29k VARBATCH.SYM Symbol table of VARBATCH -CATALOG.053 CONTENTS OF CP/M VOL. 053 53.1 1k ADVCOMP.SUB BDS-C Adventure game 53.2 5k ADVENT.C BDS-C Adventure game 53.3 10k ADVENT.COM BDS-C Adventure game 53.4 5k ADVENT.CRL BDS-C Adventure game 53.5 6k ADVENT.H BDS-C Adventure game 53.6 18k ADVENT1.DA4.14 6k CHASE2.BAS Construct & maneuver in a maze 54.15 3k CHOMP.BAS Eat pieces of a cookie, last loses 54.16 3k CRAPS.BAS Standard Nevada table rules 54.17 5k CUBE.BAS Get through the cube and win a bet 54.18 3k DEFUSE.BAS Find and defuse the bomb before... 54.19 1k DIAMND.BAS Fills screen with diamonds 54.20 3k DRAW.BAS Buggy program -- see abstract 54.21 2k DRINKS.BAS 'How to mix drinks', see abstract 54.22 3k FISHING.BAS A mini-adventure game 54.23 9k FOOTBL.BAS Standard rules, except no penalties 54.24 2k FRACT.BAS Fraction mathematics 54.25 1k GRAFIT.BAS Some kind of student plotting program 54.26 2k GUNNER.BAS Fire a field artillery weapon, bugs 54.27 6k HOCKEY.BAS For hockey fans 54.28 4k HORSES.BAS Place your bets on the horse races 54.29 ?k INTEREST.BAS Simple and compound interest calculator 54.30 ?k KING.BAS Your chance to be the boss! 54.31 ?k LITQZ.BAS CAI Childrens Literature Quiz 54.32 ?k MATH.BAS Math test or quiz? 54.33 ?k MUGWMP.BAS Find 4 mugwmps hidie 56.6 47k ADVMAIN.FOR Adventure source code 56.7 5k INSUB.FOR Adventure source code 56.8 5k MAINSB.FOR Adventure source code 57.01 1k -CATALOG.057 Contents of CP/M Users Group volume 57 57.02 1k ABSTRACT.011 Notes on expanded ADVENTURE 57.1 36k ADV.COM Expanded Adventure game 57.2 105k ADVT.DAT Expanded Adventure game 57.3 31k ADVI.DAT Expanded Adventure game 57.4 4k ADVI.PTR Expanded Adventure game 57.5 15k ADVT.PTR Expanded Adventure game 58.01 2k -CATALOG.058 Contents of CP/M Users Group volume 58 58.1 60k 3740UTIL.ASM Copy CP/M to and from 3740 format 58.2 8k 3740UTIL.DOC Copy CP/M to and from 3740 format 58.3 2k BDOS-PAT.ASM Make USER 0 (CP/M 2.X) public 58.4 7k BMAP7/11.ASM Print allocation map 58.5 1k CCPPATCH.ASM Make drive A: default for .COM files 58.6 4k CHANGE.ASM ALS-8 to CP/M converter (Dr. Dobbs) 58.7 8k CRCK3.ASM CRC check on a file 58.8 5k DIRFIX.ASM CP/M 2.2 -> 1.4 directory compatibility 58.9 9k DIRSIO/1.ASM Sorted DIR with SYS and MP/M options 58.10 T BDS-C Adventure game 53.7 7k ADVENT2.DAT BDS-C Adventure game 53.8 7k ADVENT3.DAT BDS-C Adventure game 53.9 4k ADVENT4.DAT BDS-C Adventure game 53.10 6k ADVENT5.DAT BDS-C Adventure game 53.11 18k ADVENT6.DAT BDS-C Adventure game 53.12 1k ADVLINK.SUB BDS-C Adventure game 53.13 2k CATALOG.DOC BDS-C Adventure game 53.14 7k DATABASE.C BDS-C Adventure game 53.15 5k DATABASE.CRL BDS-C Adventure game 53.16 1k EADVENT.C BDS-C Adventure game 53.17 24k EADVENT.COM BDS-C Adventure game 53.18 1k EADVENT.CRL BDS-C Adventure game 53.19 3k ENGLISH.C BDS-C Adventure game 53.20 2k ENGLISH.CRL BDS-C Adventure game 53.21 3k ENVIRON.DOC BDS-C Adventure game 53.22 4k ITVERB.C BDS-C Adventure game 53.23 3k ITVERB.CRL BDS-C Adventure game 53.24 1k MKADVENT.SUB BDS-C Adventure game 53.25 1k MKEADVEN.SUB BDS-C Adventure game 53.26 1k MKSAVEAD.SUB BDS-C Adventure game 53.27 1k READ.ME BDS-C Adventure game 53.28 1k SAVEADV.C BDS-C Adventure game 53.29 7k SAVEADV.COM BDS-C Adventure game 5ng in a 10 x 10 grid 54.34 ?k PICTUR.BAS ?? 54.35 ?k POET.BAS Produces verse from random phrases 54.36 ?k POKER.BAS Play poker with the computer 54.37 ?k PRIME.BAS Prints prime numbers from 1 to 10,000 54.38 ?k QUBIC.BAS 3D Tic tac toe on a 4X4 cube 54.39 ?k REVRSE.BAS Reverse a number list?? 54.40 ?k ROCKET.BAS A lunar lander with a bad fuel gauge 54.41 ?k ROCKT1.BAS Lunar lander, graphs your descent 54.42 ?k SNOOPY.BAS SNOOPY picture with your name under it 54.43 ?k SPORTS.BAS CAI w/multiple choice sports questions 54.44 ?k STARS.BAS Number Guessing Game by Bob Albrecht 54.45 ?k STOCK.BAS Stock Market simulation program 54.46 ?k TAKEAWAY.BAS Multi-player game 54.47 ?k TDRILL.BAS Typing drill using data lists 54.48 ?k TENNIS.BAS CAI drill on tennis (ala SPORTS.BAS) 54.49 ?k TEXT.BAS Information pgrm about these programs 54.50 ?k TICTAC.BAS Expanded TTT game on a 9 X 9 grid 54.51 ?k TRAP.BAS Guess the mystery number game 54.52 ?k TTTOE.BAS Standard Tic tac toe game 54.53)1k DOWHILES.LIB Used by 58.1 58.11 16k DU-8/12.ASM Update of CPM USER GROUP 40.20 58.12 8k DUPUSR2.ASM Create duplicate directory w/new user # 58.13 4k EQUATES.LIB Used by 58.1 58.14 2k FILPRINT.ASM Turn .TXT into .COM 58.15 27k FINDBD37.ASM Updated program to lock out bad blocks 58.16 9k FMAP6/12.ASM Update of CP/M User Group 40.24 58.17 16k MACROS.LIB Used by 58.1 58.18 2k NCOMPARE.LIB Used by 58.1 58.19 1k PG0EQU.ASM Part of 58.9 DIRSIO/1.ASM 58.20 2k SELECTS.LIB Used by 58.1 58.21 1k SURVEY.COM List disk, memory use, and other parts 58.22 13k SURVEY3.ASM List disk, memory use, and other parts 58.23 1k SYMSTACK.LIB Used by 58.1 58.24 1k WHENS.LIB Used by 58.1 58.25 8k XDIR6/28.ASM Sorted directory with sizes 59.01 1k -CATALOG.059 Contents of CP/M Users Group Volume 59 59.1 14k CPUDIAG.ASM CPU Test Diagnostics for 8080 and 8085 59.2 2K CPUDIAG.DOC CPU Test Diagnostics for 8080 and 8085 59.3 12k MEMDIAG.DOC Memory Diagnostics 59.4 34k MEMDIAG.ASM Memory Diagnostics 59.5 73k OVE6/12.ASM Single drive copy program 61.19 8k RELDUMP.ASM Dump Microsoft .REL files 61.20 1k SAP-FIX.DOC Patches for CP/M User Group vol. 19.8 61.21 5k TEXCLEAN.ASM Clear bit 7 of a text file 61.22 2k TPA3.ASM Computes size of tpa 61.23 3k Z80EXT.LIB Extra Z80 opcodes 62.001 2k -CATALOG.062 Contents of CP/M Users Group volume 62 62.01 1k BOOT.ASM Sample BOOT for PASCAL 62.02 3k BOOTER.DOC PASCAL documentation for CP/M 62.03 7k TEST.ASM Scan & load 8080/Z80 Pascal interpreter 62.04 8k PAS2CPM.ASM Format conversion 62.05 7k PASCAL.ASM Initialization of PASCAL system 62.06 17k PASCAL.COM PASCAL system 62.07 1k PASCAL.DOC PASCAL system 62.08 12k PASTOCPM Format conversion 62.09 1k PBOOT.ASM Utilities to initialize PASCAL system 62.10 4k PGEN.ASM PASCAL system utility 62.11 1k PGEN.COM PASCAL system utility 62.12 6k PINIT.ASM PASCAL system utility 62.13 2k READ.ME PASCAL startup documentation 62.14 5k CHAT13.ASM 2-way communications with remote caller 62.15 24k DCHBYE57.ASp volume 64 64.01 6k LANES.BAS Microsoft Basic game 64.02 17k JOURNAL.BAS Microsoft Basic game 64.03 2k GAMMONB.BAS Microsoft Basic game 64.04 3k BLACKBOX.BAS Microsoft Basic game 64.05 1k BOGGLE.BAS Microsoft Basic game 64.06 11k GAMMON.H19 Microsoft Basic game for Heath terminal 64.07 8k NIM1.H19 Microsoft Basic game for Heath terminal 64.08 5k OTHELLO.H19 Microsoft Basic game for Heath terminal 64.09 12k STARWAR2.H19 Microsoft Basic game for Heath terminal 64.10 17k ALS8CPM.ASM Convert Proc Tech asm files to CP/M 64.11 1k DIV16B.ASM 16 bit division by 8 bit divisor 64.12 5k DSIM.LIB CDOS calls for CP/M 64.13 22k NSCPM48.ASM Run North Star Basic under CP/M 64.14 8k NSCPM48.DOC Run North Star Basic under CP/M 64.15 1k RETURN48.COM Run North Star Basic under CP/M 64.16 33k REZ.ASM RESOURCE resurrected with .ASM 64.17 7k REZ.COM A nifty 8080 disassembler 64.18 26k REZ.DOC Modified for Z80 TDL op codes 64.19 36k REZ.Z80 Modified for Zilog op codes 65.01 2k -CATALOG.3712DIAG.ASM iCOM SD Controller Diagnostic 59.6 93k 3812DIAG.ASM iCOM DD Controller diagnostic 59.7 2k 3X12DIAG.DOC iCOM Disk Controller Diagnostics 59.8 4k CP/M-NET.MSG Proposed Networking of User Groups 60.01 1k -CATALOG.060 Contents of CP/M Users Group Volume 60 60.02 2k ABSTRACT.060 Describes each module in 6502 Simulator 60.1 11k ZILASM.COM 6502 Simulator module 60.2 5k ZX65.COM 6502 Simulator module 60.3 98k ZX65RPRN 6502 Simulator module 60.4 39k ZX65R.ZSM 6502 Simulator module 60.5 15k ZXART.DOC 6502 Simulator module 60.6 9k ZXHINTS.DOC 6502 Simulator module 60.7 23k ZXLDRPRN 6502 Simulator module 60.8 7k ZXLDR.ZSM 6502 Simulator module 60.9 1k ZXTAB1.DOC 6502 Simulator module 60.10 1k ZXTAB2.DOC 6502 Simulator module 60.11 1k ZXTAB3.DOC 6502 Simulator module 60.12 1k ZXTAB4.DOC 6502 Simulator module 60.13 2k CONCOD.LIB Control codes for 6502 Zapple 60.14 1k ZAPMON.MOS Zapple Monitor for 6502 60.15 5k ZAPMON.HEX Zapple Monitor for 6502 60.16 11k ZAP3.INS Zapple modulM Remote console DCHBYE55 upgrade (#61.1) 62.16 46k MODEM5A.ASM Auto-dial/re-dial w/DC Hayes & PMMI 62.17 21k PLNK10162.ASM Upgrade #19.4, #61.6 w/more modem types 62.18 4k NEWBAUD.ASM Switch BAUD rate on a remote PMMI modem 62.19 20k RBBS22.ASC Update of RBBS #61.10 62.20 6k RBBS22.DOC Update of RBBS #61.10 62.21 9k RBSUTL22.ASC Update of RBBS #61.10 62.22 8k MBOOT3.ASM Compacted MODEM for RECV only usage 62.23 24k XMODEM38.ASM Update #61.8 - remote CP/M to CP/M xfer 63.001 2k -CATALOG.063 Contents of CP/M Users Group volume 63 63.01 2k AUTOX.ASM Forces a CP/M command from a user level 63.02 10k CPYFIL15.ASM Copy files > 512K thru PIP utility 63.03 11k CRCK10/6.ASM Upgrade of CRCK3 in CPMUG 58.7 63.04 9k DIRS1015.ASM Sorted directory from DIRS10/1 #58.9 63.05 3k DISPLAY.COM Similar to D/R ED.COM for display only 63.06 3k DISPLAY.DOC Similar to ED.COM for display only 63.07 3k DISPLAYP.ASM Similar to ED.COM for display only 63.08 18k DU-10/26.ASM Update of disk utility in CPMUG 58.9065 Contents of CP/M Users Group volume 65 65.02 4k -CUGFORM.LIB Submittal form 65.03 2k -SIGFORM.LIB Submittal form 65.1 28k MITSCNVT.ASM MITS to CP/M file conversion 65.2 7k MITSCNVT.COM MITS to CP/M file conversion 65.3 3k MITSCNVT.CPM MITS to CP/M file conversion 65.4 7k MITSCNVT.DOC MITS to CP/M file conversion 65.5 8k MITSCNVT.HEX MITS to CP/M file conversion 65.6 2k ABORTSUB.COM HELP file system 65.7 13k HELP.ASM HELP file system 65.8 37k SYSLIB.HLP HELP file system 65.9 9k SYSLIB.REL HELP file system 65.10 2k HELP.COM HELP file system 65.11 1k MASM.SUB HELP file system 65.12 2k PHELP.COM HELP file system 65.13 6k PHELP.MAC HELP file system 65.14 4k HELP.DOC HELP file system 65.15 18k SD-2/6.ASM Updated SUPER DIRECTORY display 65.16 2k SD.COM Updated SUPER DIRECTORY display 65.17 6k ENTAB.ASM Space suppression program 65.18 1k ENTAB.COM Space suppression program 65.19 2k UTIL.FOR FORTRAN array handling subroutine 65.20 2k LOOPBAK1.BAS PMMI loop back test 65.21e for 6502 60.17 3k ZAP5.INS Zapple module for 6502 60.18 3k ZAP1.INS Zapple module for 6502 61.01 2k -CATALOG.061 Contents of CP/M Users Group volume 61 61.1 23k DCHBYE55.ASM Remote console for DC Hayes modem 61.2 3k FLIP-8/8.ASM Switch remote console to originate mode 61.3 5k TAG.ASM Set F1 bit 61.4 9k MLIST34.ASM Type command w/16k buffer 61.5 45k MODEM926.ASM Update of CP/M Users Group 40.28 61.6 21k PLINK925.ASM Update of CP/M User Group 19.4 61.7 2k USER-8/8.ASM Replaces CP/M USER cmd on remote CPU 61.8 20k XMODEM32.ASM DC Hayes support 61.9 4k PURGE.ASC Requires MBasic 61.10 20k RIBBS.ASC Requires MBasic 61.11 7k MIC-XFER.ASM Xfer < > Micropolis 1.4 & 8" systems 61.12 7k MIC-XFER.DOC Data transfer documentation 61.13 3k XFER5-8.ASM Transfer files between 5" and 8" 61.14 3k XFER8-5.ASM Transfer files between 5" and 8" 61.15 5k V2FORMAT.ASM Versafloppy system 61.16 9k MENU.ASM Creates menu of all .COM and .BAS files 61.17 5k MEM-MAP.ASM Use to map RAM/ROM 61.18 8k M 63.09 10k FIND3/18.ASM Multiple file search routine 63.10 29k FINDBD38.ASM Update FINDBD37 #58.15 bad disk utility 63.11 1k LISTGRPS.ASC List track and sector for each group 63.12 10k MDIR8/17.ASM Alpha/Numeric master directory by users 63.13 17k MFT45.ASM Dr. Dobbs one drive multi-file transfer 63.14 7k MIC-XFER.ASM Micropolis and regular CP/M file xfer 63.15 5k MIC-XFER.DOC Micropolis and regular CP/M file xfer 63.16 9k NFMAP.ASM Sorted dir w/option of writing file 63.17 14k NLIST.ASM Lists disk file on LST: device 63.18 17k SD-12/15.ASM Sorted directory with sizes 63.19 10k SECTOR.ASM Sector disk maintenance program 63.20 2k SHOWGRP.ASC Print track and sector addr of groups 63.21 2k TERMTEST.ASM Terminal diagnostic program 63.22 3k USERLST.ASM Display current user in CP/M prompt 63.23 8k VLIST11.ASM Variable speed TYPE routine 63.24 4k WHICH.ASM Displays present CP/M release level 63.25 8k MIKEBIOS.ASM Flash Writer I/O driver 64.001 1k -CATALOG.064 Contents of CP/M Users Grou* 40k FORTH11.ASM FIG-FORTH version 1.1 65.22 23k FORTH11.COM FIG-FORTH version 1.1 65.23 4k FORTH11.DOC FIG-FORTH version 1.1 66.01 2k -CATALOG.066 Contents of CP/M Users Group Volume 66 66.1 2k HELP.COM HELP file system describing 66.2 7k HELP.HLP HELP system - HELP file system 66.3 31k CPM.HLP HELP system - CP/M 1.4 66.4 37k CPM2.HLP HELP system - CP/M 2.2 66.5 4k ASM.HLP HELP system - CP/M 1.4 ASM (assembler) 66.6 4k ASM2.HLP HELP system - CP/M 2.2 ASM (assembler) 66.7 8k MAC.HLP HELP system - CP/M MAC(macro assembler) 66.8 21k MBASIC.HLP HELP system - Microsoft BASIC 66.9 14k CBASIC.HLP HELP system - CBasic 66.10 12k EBASIC.HLP HELP system - Basic-E 66.11 22k CBASIC2.HLP HELP system - CBasic-2 66.12 8k MASM.HLP HELP system - MACRO-80 (M80) 66.13 13k ALGOLM.HLP HELP system - ALGOL-M 66.14 17k C.HLP HELP system - BDS 'C' 66.15 7k FORTRAN.HLP HELP system - Microsoft Fortran 66.16 10k PASCAL.HLP HELP system - PASCAL/MT 67.01 2k -CATALOG.067 Contents of CP/M Users Group Volund abstracts of CPMUG volumes 67.34 4k CATALOG.034 Catalogs and abstracts of CPMUG volumes 67.35 5k CATALOG.035 Catalogs and abstracts of CPMUG volumes 67.36 8k CATALOG.036 Catalogs and abstracts of CPMUG volumes 67.37 6k CATALOG.037 Catalogs and abstracts of CPMUG volumes 67.38 7k CATALOG.038 Catalogs and abstracts of CPMUG volumes 67.39 6k CATALOG.039 Catalogs and abstracts of CPMUG volumes 67.40 11k CATALOG.040 Catalogs and abstracts of CPMUG volumes 67.41 9k CATALOG.041 Catalogs and abstracts of CPMUG volumes 67.42 8k CATALOG.042 Catalogs and abstracts of CPMUG volumes 67.43 2k SIGMLOG.001 Catalogs and abstracts on SIG/M Volumes 67.44 4k SIGMLOG.002 Catalogs and abstracts on SIG/M Volumes 67.45 1k SIGMLOG.003 Catalogs and abstracts on SIG/M Volumes 68.01 2k -CATALOG.068 Contents of CP/M Users Group Volume 68 68.1 39k BYE67.ASM Remote console program for PMMI - modem 68.2 12k BYE67.DOC Remote console program for PMMI - modem 68.3 12k MLIST42.ASM Multiple file list utility 68.4 gion and state area code search 70.8 7k AREACODE.COM Region and state area code search 70.9 9k BANZAI.ASM Copyright notice protect 70.10 6k CAT2.ASM Master catalog system for CP/M 2.X 70.11 7k FMAP3.ASM Master catalog system for CP/M 2.X 70.12 8k UCAT2.ASM Master catalog system for CP/M 2.X 70.13 6k CHAT15.ASM Chat with local remote CP/M operator 70.14 1k CHAT15.COM Chat with local remote CP/M operator 70.15 3k DISPLAYP.ASM Display facilities of ED.COM 70.16 2k DISPLAY.COM Display facilities of ED.COM 70.17 3k DISPLAY.DOC Display facilities of ED.COM 70.18 7k FILE-EXT.ASM Display disk directory with hex data 70.19 1k FILE-EXT.COM Display disk directory with hex data 70.20 8k FILE-XT2.ASM FILE-EXT.ASM w/ CP/M 2.X compatibility 70.21 1k FILE-XT2.COM FILE-EXT.ASM w/ CP/M 2.X compatibility 70.22 7k LOOK.ASM Search for 1-9 byte sequence in memory 70.23 1k LOOK.COM Search for 1-9 byte sequence in memory 70.24 7k MACTIME.ASM Patch for real time clock in MAC.COM 70.25 7k ASMTIME.ASme 67 67.01 6k CATALOG.001 Catalogs and abstracts of CPMUG volumes 67.02 1k CATALOG.002 Catalogs and abstracts of CPMUG volumes 67.3 13k CATALOG.003 Catalogs and abstracts of CPMUG volumes 67.4 4k CATALOG.004 Catalogs and abstracts of CPMUG volumes 67.5 3k CATALOG.005 Catalogs and abstracts of CPMUG volumes 67.6 2k CATALOG.006 Catalogs and abstracts of CPMUG volumes 67.7 2k CATALOG.007 Catalogs and abstracts of CPMUG volumes 67.8 4k CATALOG.008 Catalogs and abstracts of CPMUG volumes 67.9 2k CATALOG.009 Catalogs and abstracts of CPMUG volumes 67.10 1k CATALOG.010 Catalogs and abstracts of CPMUG volumes 67.11 2k CATALOG.011 Catalogs and abstracts of CPMUG volumes 67.12 1k CATALOG.012 Catalogs and abstracts of CPMUG volumes 67.13 12k CATALOG.013 Catalogs and abstracts of CPMUG volumes 67.14 3k CATALOG.014 Catalogs and abstracts of CPMUG volumes 67.15 2k CATALOG.015 Catalogs and abstracts of CPMUG volumes 67.16 8k CATALOG.016 Catalogs and abstracts of CPMUG volumes 67.17 4k CATALO 6k DU-V75.OBJ Disk utility system 68.5 5k DU-V75.DOC Disk utility system 68.6 40k DU-V75.ASM Disk utility system 68.7 33k FINDBD42.ASM Creates file of badspots 68.8 36k APLMODEM.ASM Apple ][ CP/M file xfer w/ Micromodem 2 68.9 7k COMAND.LIB Console string processor 68.10 7k COMBINE.ASM Merges multiple files 68.11 8k FILE-XT2.ASM System disk utility display 68.12 28k MNEMON21.ASM Multi-pass CP/M memory tester 69.01 2k -CATALOG.017 Contents of CP/M Users Group Volume 69 69.02 1k -CATALOG.ACK Acknowledgement file 69.1 2k SCRAMBLE.DOC Encode a CP/M file - crypt 69.2 6k SCRAMBLE.ASM Encode a CP/M file - crypt 69.3 2k SORTV.DOC Variable length records sort program 69.4 13k SORTV-12.ASM Variable length records sort program 69.5 6k TAG2.ASM Set/reset display the "no copy" flag 69.6 3k MNEXEC.COM MicroNet executive 69.7 4k MNOVRLAY.ASM Overlay for MicroNet executive 69.8 4k WHICH/1.ASM Returns size and version of CP/M 69.9 8k STATUS.ASM Present systems information under 2.2 69.10 5kM Patch for real time clock in ASM.COM 70.26 6k STATTIME.ASM Patch for real time clock in STAT.COM 70.27 6k SAP.ASM Updated directory sort for CP/M 2.X 70.28 1k SAP.COM Updated directory sort for CP/M 2.X 70.29 13k XLOOK.ASM Disk/examine/modify utility 71.01 2k -CATALOG.071 Contents of CP/M volume 71 71.02 1k -CATALOG.ACK Acknowledgement file 71.03 3k ABSTRACT.071 Vol 71 Comments file 71.04 2k CRCKFILE.071 CRC of volume 71 71.1 5k AUTOBOOT.ASM Autoboot on CP/M cold start 71.2 1k AUTOBOOT.COM Autoboot on CP/M cold start 71.3 11k LINEARP.PAS Simplex Algorithm - Pascal 71.4 21k LINEARP.COM Simplex Algorithm - Pascal 71.5 1k VARIANT.PAS Demo for variant records 71.6 5k VARIANT.COM Demo for variant records 71.7 2k REVERSE.PAS Demo for linked lists 71.8 6k REVERSE.COM Demo for linked lists 71.9 9k EDITFILE.PAS Adapted from S-100 Microsystems 71.10 13k EDITFILE.COM Adapted from S-100 Microsystems 71.11 4k RT.PAS Demo program for non-text files 71.12 8k RT.COM Demo program for G.017 Catalogs and abstracts of CPMUG volumes 67.18 2k CATALOG.018 Catalogs and abstracts of CPMUG volumes 67.19 7k CATALOG.019 Catalogs and abstracts of CPMUG volumes 67.20 1k CATALOG.020 Catalogs and abstracts of CPMUG volumes 67.21 16k CATALOG.021 Catalogs and abstracts of CPMUG volumes 67.22 5k CATALOG.022 Catalogs and abstracts of CPMUG volumes 67.23 5k CATALOG.023 Catalogs and abstracts of CPMUG volumes 67.24 5k CATALOG.024 Catalogs and abstracts of CPMUG volumes 67.25 10k CATALOG.025 Catalogs and abstracts of CPMUG volumes 67.26 18k CATALOG.026 Catalogs and abstracts of CPMUG volumes 67.27 2k CATALOG.027 Catalogs and abstracts of CPMUG volumes 67.28 3k CATALOG.028 Catalogs and abstracts of CPMUG volumes 67.29 3k CATALOG.029 Catalogs and abstracts of CPMUG volumes 67.30 1k CATALOG.030 Catalogs and abstracts of CPMUG volumes 67.31 2k CATALOG.031 Catalogs and abstracts of CPMUG volumes 67.32 1k CATALOG.032 Catalogs and abstracts of CPMUG volumes 67.33 2k CATALOG.033 Catalogs a NEWQCAT.ASM Quick catalog routine 69.11 7k WORM8/8.ASM Memory test 69.12 21k TFX12/18.ASM CP/M to CP/M file transfer utility 69.13 29k XMODEM41.ASM Remote CP/M to CP/M file transfer 69.14 3k MOVPATCH.ASM Modifies MOVCPM for remote access 69.15 48k 21BIOS.ASM New BIOS for CP/M 2.0 69.16 3k 21BIOS.DOC New BIOS for CP/M 2.0 69.17 4k 21BOOT.ASM New BIOS for CP/M 2.0 69.18 18k MACRO.LIB New BIOS for CP/M 2.0 69.19 9k NPGEN.ASM New BIOS for CP/M 2.0 69.20 4k SPCLMAC.LIB New BIOS for CP/M 2.0 69.21 13k XDIR.ASM Updated CP/M directory display 69.22 2k XDIR.COM Updated CP/M directory display 70.01 2k -CATALOG.070 Contents of CP/M Users Group Volume 70 70.02 1k -CATALOG.ACK Volume 70 Acknowledgement file 70.1 18k 2411DUMP.ASM ICOM microfloppy utility 70.2 3k 2411DUMP.COM ICOM microfloppy utility 70.3 17k MFMACRO.LIB ICOM microfloppy utility 70.4 21k 3812DUMP.ASM ICOM floppy utility 70.5 4k 3812DUMP.COM ICOM floppy utility 70.6 18k DDMACRO.LIB ICOM floppy utility 70.7 14k AREACODE.ASM Re*non-text files 71.13 6k STARS.PAS Game - Pascal 71.14 7k STARS.COM Game - Pascal 71.15 1k ADDN.PAS Simple demo to add two numbers 71.16 6k ADDN.COM Simple demo to add two numbers 71.17 13k ZMNEMONS.DOC Programming aid 71.18 1k TRIAN.PAS Demo on FOR loops 71.19 4k TRIAN.COM Demo on FOR loops - Pascal 71.20 6k CONCHAR.PAS Utility for command line input 71.21 5k SCAN2X.PAS File READ evaluation 71.22 8k SCAN2X.COM File READ evaluation - Pascal 71.23 14k STRDEMO.PAS Demo on string functions 71.24 4k STRLIB.DOC Part of STRDEMO.PAS 71.25 3k LONG.PAS Demo to string words together 71.26 7k LONG.COM Demo to string words together - Pascal 71.27 8k MAKEREL.DOC Convert REL. files from function blks 71.28 7k LIOS.ASM Novice utility 71.29 1k CONVERT.PAS Convert gas in liters 71.30 6k CONVERT.COM Convert gas in liters 71.31 11k COMPARE.!!! Compare source code files from UCSD 71.32 23k DUMP.ASM Expanded CP/M DUMP program 71.33 2k LSTR.PAS Generates a line of various length 72.01 2k -CA.17 10k NAD.COM Permuted keyword index program 73.18 6k TDIABLO.MAC Driver for Diablo w/Teletek FDC-1 73.19 1k TDIABLO.COM Driver for Diablo w/Teletek FDC-1 73.20 5k DIABLO.Z80 Driver for Diablo w/SD Systems S100 73.21 1k DIABLO.COM Driver for Diablo w/SD Systems S100 73.22 2k RANDOM.PAS Fibonacci random number generator 73.23 1k RANDOM.REL Fibonacci RNG 73.24 4k RANDOM.SRC Fibonacci RNG 73.25 1k REBOOT.COM Rebooting desired file 73.26 12k STRLIB.LIB Pascal Z library 73.27 12k WUMPUS.PAS Wumpus game in Pascal Z 73.28 15k WUMPUS.COM Wumpus game in Pascal Z 73.29 4k WUMPUS.DOC Wumpus game in Pascal Z 73.30 1k CAVE0 Wumpus game in Pascal Z 73.31 1k CAVE1 Wumpus game in Pascal Z 73.32 1k CAVE2 Wumpus game in Pascal Z 73.33 1k CAVE4 Wumpus game in Pascal Z 73.34 1k CAVE5 Wumpus game in Pascal Z 73.35 6k ENTRY.PAS Creating SRC files 73.36 9k ENTRY.COM Creating SRC files 73.37 6k ENTRY.DOC Creating SRC files 73.38 2k PEEK.PAS Peek and poke in Pascal Z 73.39 1k POWERI.PA Recipe program - Pascal 74.32 1k RECIPE.MST Recipe program - Pascal 74.33 1k RCPDAT.YYY ??? 74.34 8k FCLOSE.COM Three ways to close a file - Pascal 74.35 4k FCLOSE.PAS Three ways to close a file - Pascal 75.01 2k -CATALOG.075 Contents of CP/M Users Group volume 75 75.02 2k -CRCFILE.075 CRC of volume 75 75.05 2k ABSTRACT.075 Comments on volume 75 75.1 3k EXPO.PAS Demo on the use of exponents 75.2 7k EXPO.COM Demo on the use of exponents 75.3 9k COMPARE.DOC UCSD program Compare documentation 75.4 11k DISASMB.DOC Disassembler in MicroSoft Basic V 5.1 75.4a 1k 8085.LST Microsoft Basic 5.1 Disassembler 75.4b 1k 8085.TAB Microsoft Basic 5.1 Disassembler 75.4c 13k DISASMB.BAS Microsoft Basic 5.1 Disassembler 75.4d 1k INTEL.LST Microsoft Basic 5.1 Disassembler 75.4e 1k INTEL.TAB Microsoft Basic 5.1 Disassembler 75.4f 3k LST8085.BAS Microsoft Basic 5.1 Disassembler 75.4g 3k LSTINTEL.BAS Microsoft Basic 5.1 Disassembler 75.4h 4k LSTTDL.BAS Microsoft Basic 5.1 Disassembler 75.4i TALOG.072 Contents of CP/M Users Group volume 72 72.02 2k ABSTRACT.072 Comments on PCE System Monitor 72.03 1k -CRCFILE.072 CRC of Volume 72 72.1 103k SYSMON.DOC Complete Manual of System Monitor 72.2 2k SYSMONA.Z80 Central subsystem module 72.3 11k ASPM1.Z80 Command subsystem, module one 72.4 12k ASPM2.Z80 Command subsystem, module two 72.5 3k VECTOR.Z80 Intel I/O standard vector subsystem 72.6 14k CONSOL.Z80 Console subsystem 72.7 5k DISK.Z80 Floppy disk subsystem for CPM & monitor 72.8 8k CASS.Z80 Cassette subsystem 72.9 1k BMGEN.Z80 Bit map generator 72.10 1k BMGEN.COM Bit map generator 72.11 10k LOADER.Z80 Static loader for system 72.12 3k LOADER.COM Static loader for system 72.13 16k SYS.COM Sys Monitor boot-up program 72.14 14k ONE.HEX Used with bringing up bit map 72.15 14k ZERO.HEX Used with bringing up bit map 72.16 1k COPYTT.Z80 Sample command similiar to a COM file 72.17 1k COPYTT.SMC Sample command sililar to a COM file 73.01 2k -CATALOG.073 Contents of CP/S Demo program on powers of numbers 73.40 7k POWERI.COM Demo program on powers of numbers 73.41 2k POWERI.REL Demo program on powers of numbers 73.42 7k RDR.PAS Alpha-numeric number conversion program 73.43 29k DU.Z80 Updated disk utility using Z80 code 73.44 4k DU.COM Updated disk utility using Z80 code 73.45 1k DU.DOC Updated disk utility using Z80 code 74.01 2k -CATALOG.074 Contents of CP/M Users Group volume 74 74.02 2k -CRCFILE.074 CRC of Volume 74 74.05 4k ABSTRACT.074 Comments on volume 74 74.1 2k CFIO.LIB Program to open files 74.2 10k CONCORD.COM Program that builds an alphabetical 74.3 11k CONCORD.PAS Listing of distinct words 74.4 2k COSINE.PAS Cosine program - Pascal 74.5 2k COSINE.REL Cosine program - Pascal 74.6 6k COSINE.SRC Cosine program - Pascal 74.7 8k GEN5.COM Demo on accessing CP/M files 74.8 5k GEN5.PAS Demo on accessing CP/M files 74.9 10k GRAPH1.COM Presents a function in graphic form 74.10 1k GRAPH1.PAS Presents a function in graphic form 74.1 3k LSTZILOG.BAS Microsoft Basic 5.1 Disassembler 75.4j 7k TAB8085.BAS Microsoft Basic 5.1 Disassembler 75.4k 6k TABINTEL.BAS Microsoft Basic 5.1 Disassembler 75.4l 11k TABTDL.BAS Microsoft Basic 5.1 Disassembler 75.4m 11k TABZILOG.BAS Microsoft Basic 5.1 Disassembler 75.4n 1k TDL.LST Microsoft Basic 5.1 Disassembler 75.4o 3k TDL.TAB Microsoft Basic 5.1 Disassembler 75.4p 6k XREF.BAS Microsoft Basic 5.1 Disassembler 75.4q 1k XREF.SUB Microsoft Basic 5.1 Disassembler 75.4r 1k ZILOG.LST Microsoft Basic 5.1 Disassembler 75.4s 3k ZILOG.TAB Microsoft Basic 5.1 Disassembler 75.5 7k DATE.DOC Dates routines 75.5a 1k BRKDATE.LIB Dates routine 75.5b 2k DASTRLON.LIB Dates routine 75.5c 2k DASTRLON.LIB Dates routine 75.5d 2k DASTRSH.LIB Dates routine 75.5e 7k DATE.PAS Dates routine 75.5f 2k DATEFUNC.LIB Dates routine 75.5g 2k MAKEDATE.LIB Dates routine 75.5h 1k PROMPT.LIB Dates routine 75.5i 2k RMAKEDA.LIB Dates routine 75.6 2k MISC.DOC Miscellaneous routines 75.6a 1k CAPCHAR.M Users Group volume 73 73.02 2k -CRCFILE.073 CRC of Volume 73 73.03 4k ABSTRACT.073 Comments on volume 73 73.1 10k AUTHOR.PAS General purpose "keyword in text" 73.2 11k AUTHOR.COM General purpose "keyword in text" 73.2a 1k ADDRESS General purpose "keyword in text" 73.2b 1k BYTE.MAG General purpose "keyword in text" 73.2c 1k S100.MAG General purpose "keyword in text" 73.3 12k CALC.PAS Calculator mode program 73.4 16k CALC.COM Calculator mode program 73.5 2k CPLOT.PAS Simple banner program 73.6 5k CPLOT.COM Simple banner program 73.7 1k DELAY.PAS General Pascal Z utility 73.8 1k DELAY.REL General Pascal Z utility 73.9 1k DELAY.SRC General Pascal Z utility 73.10 1k INPORT.REL General Pascal Z utility 73.11 1k INPORT.SRC General Pascal Z utility 73.12 1k OUTPORT.REL General Pascal Z utility 73.13 1k OUTPORT.SRC General Pascal Z utility 73.14 1k KEYIN.REL General Pascal Z utility 73.15 1k KEYIN.SRC General Pascal Z utility 73.16 10k NAD.PAS Permuted keyword index program 731 6k ISORTV1.COM Insertion sort with linked list 74.12 4k ISORTV1.PAS Insertion sort with linked list 74.13 8k LINENOS.COM Keep track of text lines 74.14 4k LINENOS.PAS Keep track of text lines 74.15 6k POINT.COM Demo on the use of pointers 74.16 2k POINT.PAS Demo on the use of pointers 74.17 4k RANDOM.MAC "Professional" random number generator 74.18 1k RANDOM.PAS Simple random number generator 74.19 5k SINCOS.SRC Sine/Cosine utility 74.20 1k SINCOS.REL Sine/Cosine utility 74.21 5k STRLIB.DOC Ray Penley's latest updated string lib. 74.22 13k STRLIB.LIB String library - Pascal 74.23 9k TRIG4.COM Demo - Builds a short Trig chart 74.24 2k TRIG4.PAS Demo - Builds a short Trig chart 74.25 13k XREFG2.COM A binary tree type cross-ref generator 74.26 18k XREFG2.PAS A binary tree type cross-ref generator 74.27 8k ZPTEX.COM Very simple text formatter 74.28 8k ZPTEX.PAS Very simple text formatter 74.29 5k LESSON4 ??? 74.30 12k RECIPE.COM Recipe program - Pascal 74.31 17k RECIPE.PAS+LIB Misc routines - Pascal 75.6b 1k CAPSTR.LIB Misc routines - Pascal 75.6c 1k DEPAD.LIB Misc routines - Pascal 75.6d 1k GETINT.LIB Misc routines - Pascal 75.6e 1k PADSTR.LIB Misc routines - Pascal 75.6f 1k STRVAL.LIB Misc routines - Pascal 75.7a 4k HANOI.COM Demonstrating recursive procedures 75.7b 2k HANOI.PAS Demo - recursive procedures 75.8a 44k DIS.ASM TDL Disassembler - see ABSTRACT.075 75.8b 5k DIS.DOC TDL Disassembler 75.9a 9k CONFER.COM Conference scheduler 75.9b 6k CONFER.PAS Conference scheduler STARWARSMUS <WHATI MUS=SPREAD MUS>TINSOLD MUS ?WIERD MUS@YANKEE MUS AMUSPAT DOCBFIND COMCALL $$$FGHIJKLMNOPQ HEX+!Display Ver.1.0, Oct.,30,1980$1Y.!\ -,_͗:[NL *zDM͇g:t mgYÅBy4E҅ !w6!":t- !w6͟:t02xO> *x&"͟:t02xO> *)))*) *x& "͟ú:tL*wM*PM:tP7>P+*/"*wM*P4*z"~"M:tDJ*DM͕MSgYLYv !\q*\& !]q*]& !_p+q*^ !ap+q*` 2[!cp+q*b 2[!ep+q*d !gp+q*f !ip+q*h 2[!kp+q*j 2[!mp+q*l  !nq*n& !pp+q*o  g g!rp+q*q A!s6!Y"z"~"*z"!6!6*"|!+p+q:sO**",|S!".![6>.P:[H*,DM1*,",*.+".ð:[!s6*,"1:s/,H+s#r*,~/*,#",*,+",*,~ I*,+",6*,"!2r+s+q:0›>1P~CHҘ*~~ Ž*1+"1*~#"~`*1#"1>1Pz~CH*~~ *1+"1*~+"~âz~C*~#"~*~"!46~Cf*~~23 Z:3 '*3Mg!44P:4O>26!56:6!5P g!44#48*~#"~*~#"~ g*"8"~!76>!7ڈ!74u*~"*8"~!;p+q>:P¼~C"@*~">+*z"<>:P!"B>BP*<~ *B+"B*<#"<S !"B!":*:+":<C"@*<">*@*>DM*z +|9z>C#s#r>~Cn@~C+s#rt*z"~*~"@C+s#r@C+s#r*DM͇*u& ~2tO>Zһ:t2t:u<2u*g͇ g:2v!t6 !u6͟!Dq!D:t:vHDM!>))덑o|g) =DM!>))> =6i`N#Fogo&ogn@~C+s#rt*z"~*~"@C+s#r@C+s#r*DM͇*u& ~ File not found$ Illegal command$, Display, Ver.1.0 as of October 30, 1980 DISPLAY.COM allows displaying an ASCII file on a 24 line terminal, with commands similar to Digital Research's ED.COM (but without any of the editing facilities). Using DISPLAY.COM For example: DISPLAY FILENAME.TXT ,will envoke the display program and load the entire secondary entry (FILENAME.TXT) into memory, for subsequent display of the first 23 lines of that file. Various commands can then be issued from the terminal keyboard which will manipulate the display of the file. The commands shown below with a preceding "n" indicates that an optional unsigned integer value can be specified to envoke "n" iterations of the command. When a command is preceded by a "-" sign, the command will cause display of the file in a direction towards the start of the file. Unsigned integer values are assumed to be positive values (i.e., "+") and therefore "+" need not be specified. Also, the buffer pointer will stop display at the top or bottom of the file if too large a value of "n" is specified. Command: Operation performed: ======= =================== B Move pointer to beginning of file and display page. -nP Move pointer minus n pages and display page. nP Move pointer plus n pages and display page. 0P Move pointer to beginning of buffer and display page. -nL Move pointer minus n lines and display page. nL Move pointer plus n lines and display page. nD Discard n pages, refill buffer and display the current page. 0D Discard all data up to the current pointer, refill buffer and display the first page. E Exit DISPLAY and return to CP/M. ^C Control-C, exit DISPLAY and return to CP/M. Carriage return, move pointer to next page and display  -------------------------------------------------------------- Best regards, Kelly Smith, MP/M-Net (tm) Sysop 805-527-9321 (Modem, 300 Baud) === =================== B Move pointer to beginning of file and display page. -nP Move pointer minus n pages and display page. nP Move pointer plus n pages and display page. 0P Move pointer to beginning of buffer and display page. -nL Move pointer minus n lines and display page. nL Move pointer plus n lines and display page. nD Discard n pages, refill buffer and display the current page. 0D Discard all data up to the current pointer, refill buffer and display the first page. E Exit DISPLAY and return to CP/M. ^C Control-C, exit DISPLAY and return to CP/M. Carriage return, move pointer to next page and display ,#001 CP/M Users Group Volume 1 Description: Various CP/M Utility Programs NUMBER SIZE NAME COMMENTS 1.01 3k -CATALOG.001 Contents of CP/M Users Group Volume 1 1.02 3k VOLUME1.DOC Comments on certain Volume 1 programs 1.1 8k ASSIGN.ASM I/O byte asign. Use with VBIOS31 1.2 2k CASDSK.ASM Cassette to disk transfer 1.3 9k COPY.ASM Copy system, data or whole diskette from drive A to B. 1.4 8k COPY.COM As ASM, used to copy this disk 1.5 9k COPYX.ASM As copy, uses internal scratch instead of area at 40h 1.6 4k DIABLO.ASM Romable Hytype/Qume driver 1.7 8k DISASSM1.ASM Christensen disassembler as per Dr. Dobb's of Feb 1977. See SEDIT below 1.8 4k DISASSM2.ASM Intel library disassembler 1.9 9k DISKTEST.ASM Program to search for soft and hard sector errors in disk I/O. Destroys files on diskette and only runs in 16k systems 1.10 2k DSKCAS.ASM Diskette to casette transfer 1.11 1k ED3.ASM Patches for 'R' bug in CP/M ED.COM 1.12 7k EXAM.ASM Simple patched COM for CP/M (not economical, but instructive) 2.3 2k LLLBASIC.DOC Notes on LLL Basic 2.4 61k LLLFP.ASM Floating-point package for LLL Basic 2.5 2K LLLMON.ASM kluge monitor to test LLL in LLL BASIC.COM 2.6 2k STARTREK.DOC Comments on STARTREK.TBI 2.7 6k STARTREK.TBI Tiny Basic loadable Startrek 2.8 3k TINYBAS.COM Sherry version of Wang Palo Alto Tiny Basic, with disk save and load of programs for CP/M 2.9 13k TINYBAS.DOC Full instructions for TINYBAS #003 CP/M Users Group Volume 3 Description: Various Basic-E Games and Programs NUMBER SIZE NAME COMMENTS 3.01 3k -CATALOG.003 Contents of CP/M Users Group Volume 3 3.02 8k VOLUME3A.DOC Comments on some programs 3.03 3k VOLUME3B.DOC Comments on other programs 3.1 2k ACE.BAS Basic-E program. See DOC's 3.2 4k AMAZE.BAS Basic-E program. See DOC's 3.3 2k ANIMAL.BAS Basic-E program. See DOC's 3.4 2k BAGELS.BAS Basic-E program. See DOC's 3.5 6k BAGELS2.BAS Basic-E program. See DOC's 3.preter 4.4 2k AMAZE Actor program 4.5 1k AMUSE Actor program 4.6 16k CALENDAR.COM Object of CALENDAR.FOR and NUMBER.MAC. Creates disk file called calendar - try it!! 4.7 4k CALENDAR.FOR Fortran main and sub-programs 4.8 6k FDL Actor program - careful with this as it cleans out input files 4.9 2k HAIKU Actor program 4.10 3k IOEXAMP Actor program 4.11 11k L81.COM ML80 module - see .DOC 4.12 11k L82.COM ML80 module - see .DOC 4.13 5k L83.COM ML80 module - see .DOC 4.14 10k M81.COM ML80 module - see .DOC 4.15 20k MAZE.COM Object of MAZE.FOR and RND.FOR creates a maze on console. try it!!! 4.16 5k MAZE.FOR Source of MAZE.COM main 4.17 1k ML.SUB SUBMIT.COM command file to run ML80 source through each module and clean up afterwards 4.18 1k MLCOPY.SUB SUBMIT.COM command file to transfer ML80 group via PIP.COM 4.19 2k NUMBER.MAC Calendar title generator written in source code for Fortran-80 assembler. (note suffector viewer for VDM. See DISK1.DOC 1.13 1k FILES.COM Gives display of directory record numbers assigned to each file. Offers to delete faulty directory entries. 1.14 1k GETVEC.LIB Routine to create BIOS primitive jump table. Big improvement on arg's in COPY. Tom Kirk says a Z80 can do it in 4 instructions!! 1.15 4k HYS13.ASM Diablo driver for 3P+S in Z80 1.16 5k HYS15.ASM Diablo driver for 3P+S in 8080 1.17 7k ICOPY.ASM Copy a file from ISIS diskette on B to CP/M diskette on A. Use IDIR first to identify filenames 1.18 6k IDIR.ASM Lists to console directory of ISIS diskette in B. 1.19 7k LIOS.ASM CP/M I/O subroutines. See PRINT for application 1.20 10k LTG.ASM 1.21 6k MAZE.ASM Intel maze program 1.22 4k MEMTEST.ASM Intel RAM test 1.23 7k PRINT.ASM Mod of PRNT to permit conditional assembly for CON:/LST: and for hardware or none 1.24 5k PRNT.ASM Transient to print files with pagination and page numb6 7k BIOPRINT.BAS Basic-E program. See DOC's 3.7 11k BLKFRI.BAS Basic-E program. See DOC's 3.8 10k BLKFRI2.BAS Basic-E program. See DOC's 3.9 6k CANNONS.BAS Basic-E program. See DOC's 3.10 3k CHASE.BAS Basic-E program. See DOC's 3.11 2k CHOMP.BAS Basic-E program. See DOC's 3.12 1k COMBINE.BAS Basic-E program. See DOC's 3.13 1k CORE.BAS Basic-E program. See DOC's 3.14 1k CORETEST.BAS Basic-E program. See DOC's 3.15 4k CRAPS.BAS Basic-E program. See DOC's 3.16 1k EUCLID.BAS Basic-E program. See DOC's 3.17 1k FIB.BAS Basic-E program. See DOC's 3.18 1k FIT.BAS Basic-E program. See DOC's 3.19 4k FORMAT.BAS Basic-E program. See DOC's 3.20 1k FORMAT.FMI Instructions for FORMAT.BAS in format code 3.21 5k HANG.BAS Basic-E program. See DOC's 3.22 5k HELLO.BAS Basic-E program. See DOC's 3.23 7k KENO.BAS Basic-E program. See DOC's 3.24 5k LANDER.BAS Basic-E program. See DOC's 3.25 8k LANES.BAS Basic-E program. See DOC's 3.26 7k LEM.BAS Basic-E program. See DOC's 3.27 3k ix MAC does not connote that macros are supported. Assembler is called M80.COM - not to be confused with ML80 macro processor M81.COM!!!!!) 4.20 1k RND.FOR Sub-program of MAZE 4.21 1k WDIR.COM Object of WDIR.M80 (try it!!) 4.22 3k WDIR.M80 ML80 source for WDIR.COM 4.23 1k XDIR.COM Object of XDIR.M80 (try it!!) 4.24 4k XDIR.M80 ML80 source for XDIR.COM 4.25 2k Z-LCTOUC.ACT Actor program to convert std Actor programs to ACTUC character set (Z-name due to last minute add.) #005 CP/M Users Group Volume 5 Description: - Basic-E Compilers and Interpreters - Basic-E Programs, continued from volume 3 - Microsoft Basic programs NUMBER SIZE NAME COMMENTS 5.01 2k -CATALOG.005 Contents of CP/M Users Group Volume 5 5.02 1k VOLUME5.DOC Comments on programs 5.1 8k 21.ASC Microsoft Basic program 5.2 12k BAS2-0.COM Basic-E compiler 5.3 12k BAS2-1.COM Basic-E compiler 5.4 5.5 5k BIO-FF.ASC Microsoft Basic program 5.6 4k BIers 1.25 10k RELOC.ASM CP/M relocation program 1.26 7k RTE.ASM Intel Real-Time Executive 1.27 4k SEDIT.ASM Symbol table editor of DISASSM1 1.28 16k SPACE.ASM Game 1.29 8k SPAT.ASM Re-write of EXAM to allow writing. See Vol 3 FORMAT.BAS and README.FMI 1.30 3k TRAIN.ASM VDM graphic 1.31 4k TREAD.ASM Tape reader to disk transfer 1.32 17k VBIOS31.ASM bios for 32k of memory with VDM 1.33 3k VBOOT31.ASM Cold boot for VBIOS31 1.34 1k XSTAT.COM Similar to STAT. Reports # of files and null files. Known bug is that it reports null extents to non-null files Don't delete a file based on this!!! #002 CP/M Users Group Volume 2 Description: - Lawrence Livermore Basic - Disk Tiny Basic Note: Improved implementations of LLL Basic and Disk Tiny Basic are present on Volumes 10 and 11 respectively NUMBER SIZE NAME COMMENTS 2.01 1k -CATALOG.002 Contents of CP/M Users Group Volume 2 2.1 84k LLLBASIC.ASM LLL Basic interpreter source 2.2 38k LLLBASIC.COM SLOAN.BAS Basic-E program. See DOC's 3.28 2k LOVE.BAS Basic-E graphic 3.29 2k PLOT2.BAS Basic-E program. See DOC's 3.30 4k POET.BAS Basic-E program. See DOC's 3.31 6k README.FMI Another format source with notes on the author, on ML80 and on SPAT 3.32 5k S/TREK.BAS Basic-E program. See DOC's 3.33 4k STARS.BAS Basic-E program. See DOC's 3.34 27k STARTREK.BAS Basic-E program. See DOC's 3.35 7k STORY.BAS Basic-E program. See DOC's 3.36 4k STRIKE9.BAS Basic-E program. See DOC's 3.37 7k TREKINST Instructions for STARTREK.BAS 3.38 7k TTT.BAS Basic-E program. See DOC's 3.39 9k WUMPUS.BAS Basic-E program. See DOC's #004 CP/M Users Group Volume 4 Description: Actor, ML80 and Examples of Fortran-80 Code NUMBER SIZE NAME COMMENTS 4.01 2k -CATALOG.004 Contents of CP/M Users Group Volume 4 4.02 2k VOLUME4.DOC Comments on programs 4.1 16k ACT.DOC Actor manual 4.2 11k ACT31.COM Latest Actor interpreter 4.3 11k ACT31UC.COM Latest upper-case character set Actor inter-ORYTH.ASC Microsoft Basic program 5.7 10k BLKFRI2.ASC Microsoft Basic program 5.8 5.9 2k DECISION.ASC Microsoft Basic program 5.10 5.11 6k EDTEXT.ASC Microsoft Basic program 5.12 2k FORMAT.ASC Microsoft Basic program 5.13 5.14 16k OTHELLO.BAS Basic-E program 5.15 5k OTHELLO.DOC instructions for OTHELLO.BAS 5.16 2k RADIX.ASC Microsoft Basic program 5.17 1k RECOVERY.ASC Microsoft Basic program 5.18 12k RUN2-2.COM Basic-E interpreter 5.19 12k RUN2-3.COM Basic-E interpreter 5.20 12k RUNK2-0.COM Basic-E interpreter 5.21 4k SLOT.ASC Microsoft Basic program 5.22 2k SORT.ASC Microsoft Basic program 5.23 7k STARTREK.ASC Microsoft Basic program 5.24 14k SUPTRK3.ASC Microsoft Basic program 5.25 #006 CP/M Users Group Volume 6 Description: - Chicago Area Computer Hobbiest Exchange (CACHE) software NUMBER SIZE NAME COMMENTS 6.01 2k -CATALOG.006 Contents of CP/M Users Group Volume 6 6.02 1k EDVDM.DOC ED.COM patch to changeee for a full one. A patched version plus source has been promised] 8.2 6k BANNER.ASM Puts large letters to LST: or PUN: Useful to identify listing printouts 8.3 7k BINLOAD1.ASM Program to read disk data from absolute sector addresses to memory 8.4 2k BIOSGO.LIB Pretty version of #1.14. Puts a dummy BIOS jump table where a program needs it 8.5 2k BPNF.ASM Program to punch standard BPNF PROM tape for area in memory 8.6 2k BSPAT16B.ASM Patch to permit i.e. (ctl-H) to echo as a backspace and act as a rub out for CP/M Version 1.3 8.7 4k BYTEMOV.ASM Bytesaver PROM burning program 8.8 2k DDTPATCH.ASM Patch to correct assembler errors in DDT. This one is different - it works!! 8.9 9k DISKDUP.ASM This is another disk copying program. These all seem hardware sensitive so good luck with this one 8.10 2k DISKIN.LIB Routine to read single characters from disk files 8.11 7k DISKTES1.ASM Re-written version of #1.9 for genas page 32A of Interface Age magazine, Volume 2, Issue 10, dated September 1977. The system was described in a series of three articles in the issues of September through November. In the final issue, full typed listings were given for the twelve programs plus two others, "CHART" and "GENPRO", neither of which were on the "Floppy ROM". The versions here are in full ASCII. The language is MITS 12k Disk Basic Ver. 4.0. In certain cases, the comment preambles were removed from the heads of the files, to permit loading in the system used to recover the code. NUMBER SIZE NAME COMMENTS 9.01 1k -CATALOG.009 Contents of CP/M Users Group Volume 9 9.1 2k COPCON.ASC See magazine references above 9.2 2k COPRAN.ASC See magazine references above 9.3 3k GETPUT.ASC See magazine references above 9.4 7k GL1.ASC See magazine references above 9.5 16k GL2.ASC See magazine references above 9.6 4k GL3.ASC See magazine references above 9.7 4k GL4.ASC See magazine references above  lines of P command. See EXPLAIN.DOC 6.03 4k EXPLAIN.DOC Comments on certain programs 6.04 19k MAILLIST.DOC Documentaion on CACHE maillist programs 6.1 6k BLOAD.ASM Tarbell tape MITS 3.1 Basic CSAVE to ASCII 6.2 34k CCOS1.ASM CACHE casette operating system 6.3 2k CKSUM.ASM Checksums CP/M files 6.4 5k COMPARE.ASM Compares two CP/M files 6.5 15k CUTTER.ASM Seems to be VDM to casette program, but documentation still awaited 6.6 3k IDUMP.ASM Interpreted file dump 6.7 9k MAINT.BAS Maillist module 6.8 13k MODEM.ASM Program to send and receive files and control remote computers via modem 6.9 6.10 1k PREFMT.BAS Maillist module 6.11 3k PURGE.ASM Diskette directory purge 6.12 1k QUICKIE.BAS Maillist module 6.13 8k REPORT.BAS Maillist module 6.14 6k SIZE.ASM Gives size of CP/M file 6.15 5k SLOAD.ASM Loader module of CCOS1 6.16 7k SORT.ASM Maillist module 6.17 4k TISQ.ASM Times Square (newscaster) letters to VDM 6.18 5k TLOADerality of system sizes 8.12 1k DIVIDE1.LIB Routine to divide 2 byte quantity by one byte divisor with remainder 8.13 17k DSKDIR.ASM Sends to console full size (decimal), number of records and extents of files. Accepts general commands "DSKDIR n:*.typ" etc. 8.14 8k FMAP.ASM Sends to console quantity and record number of groups (clusters?) on logged-in disk. bug- it ignores groups after first extent. Also creates disk file of file names if desired 8.15 4k FORMAT1.ASM Diskette formatter for Tarbell controller, or one using same controller chip 8.16 2k GO.ASM say "GO FF00" and as if by magic.... useful if no front panel available. 8.17 2k INNUM1.LIB Variable radix number input routine. Needs MPY8.LIB below and a character input routine 8.18 9k MAC4.ASM Patches to put TDL Macro assembler up as disk assembler through CP/M 8.19 3k MAKEFCB.LIB Routine to create FCB's 8.20 1k MPY8.LIB Two byte by one byte multiply 8.21  9.8 6k GL5.ASC See magazine references above 9.9 7k GL6.ASC See magazine references above 9.10 13k GL7.ASC See magazine references above 9.11 3k GLMENU.ASC See magazine references above 9.12 7k SORTGL.ASC See magazine references above ve programs plus two others, "CHART" and "GENPRO", neither of which were on the "Floppy ROM". The versions here are in full ASCII. The language is MITS 12k Disk Basic Ver. 4.0. In certain cases, the comment preambles were removed from the heads of the files, to permit loading in the system used to recover the code. NUMBER SIZE NAME COMMENTS 9.01 1k -CATALOG.009 Contents of CP/M Users Group Volume 9 9.1 2k COPCON.ASC See magazine references above 9.2 2k COPRAN.ASC See magazine references above 9.3 3k GETPUT.ASC See magazine references above 9.4 7k GL1.ASC See magazine references above 9.5 16k GL2.ASC See magazine references above 9.6 4k GL3.ASC See magazine references above 9.7 4k GL4.ASC See magazine references above .ASM Tarbell loader for TSAVE'd files 6.19 2k TMAP.ASM Map of tape with TSAVE'd files 6.20 5k TSAVE.ASM CP/M file to Tarbell tape with checksum 6.21 #007 CP/M Users Group Volume 7 Description: Pilot - Programmed Inquiry, Learning and Teaching Note: An improved implementation of this version and a new Z-80 simpler PILOT are now offered in Volume 12 NUMBER SIZE NAME COMMENTS 7.01 1k -CATALOG.007 Contents of CP/M Users Group Volume 7 7.02 1k VOLUME7.DOC Comments 7.1 6k PILOT Loaded MDS object 7.2 66k PILOT.ASM PILOT source 7.3 135k PILOT.LST MDS assembler listing with x-reference tables 7.4 6k PILOT.OBJ Relocatable MDS object #008 CP/M Users Group Volume 8 Description: Various CP/M Utility Programs NUMBER SIZE NAME COMMENTS 8.01 4k -CATALOG.008 Contents of CP/M Users Croup Volume 8 8.1 1k ALLOC.COM Graphic display of disk usage [minor bug is that the 32 by 8 matrix shows 2k used for an empty disk and 13k fr2k OUTNUM1.LIB Output a two byte number in any chosen radix 8.22 2k PBURN.ASM Bytesaver prom burner. 8.7 above has better user interface for prompts and error handling 8.23 10k PRINT2.ASM Revision of #1.24 to include Diablo driver and high speed travel between printed characters 8.24 1k RECSEC.LIB Routine to translate CP/M record (group-cluster) number to diskette sector address 8.25 4k SYMPRT.ASM Program to print the symbol table remaining in memory after running Basic-E compiler V2.0 8.26 2k WYLECON2.LIB Routine to translate Wyle keyboard output to upper/lower case ASCII 8.27 20k XREF.ASM Program to create full cross-reference table from Intel assembler source. (only generates the table, does not do the assembly) 8.28 6k XSTAT2.ASM Source of #1.34 plus some guessed subroutines. #009 CP/M Users Group Volume 9 Description: - General Ledger Program by Bud Shamburger These twelve programs were published in machine readable form -#010 CP/M Users Group Volume 10 Description: - Lawrence Livermore Basic Interfaced to CP/M with disk load of programs These programs replace the versions issued on CP/M Users' Group Volume 2 NUMBER SIZE NAME COMMENTS 10.01 1k -CATALOG.010 Contents of CP/M Users Group Volume 10 4k LLLBASIC.DOC Comments on programs in Volume 10 10.1 85k LLLBASIC.ASM See LLLBASIC.DOC 10.2 7k LLLBASIC.COM Total assembled package 10.3 61k LLLFP.ASM See LLLBASIC.DOC 10.4 5k LLLMON.ASM See LLLBASIC.DOC 10.5 1k TEST.FIL Test program. To run type "LLLBASIC TEST.FIL" and after "READY" prompt, type "PTAPE" then you may "LIST" or "RUN" #011 CP/M Users Group Volume 11 Description: - Disk Tinibasic - Disk Processor Technology Basic/5 NUMBER SIZE NAME COMMENTS 11.01 1k -CATALOG.011 Contents of CP/M Users Group Volume 11 11.02 2k VOLUME11.DOC Comments on contents 11.1 76k BASIC/5.ASM Processor Tech 5k Diskified Basic 11.2 8k BASIC/5.COM 5k Basic in 8k (sign ofMATCH.BAS Program in Basic-E/CBASIC 13.4 3k BAGELS.BAS Program in Basic-E/CBASIC 13.5 4k BIORYME.ASC Program in Microsoft Basic 13.6 6k BLACKJAC.BAS Program in Basic-E/CBASIC 13.7 1k BULLSEYE.BAS Program in Basic-E/CBASIC 13.8 6k CHECKERS.BAS Program in Basic-E/CBASIC 13.9 2k CHIEF.BAS Program in Basic-E/CBASIC 13.10 2k CONVERT.BAS Program in Basic-E/CBASIC 13.11 7k DICE.BAS Program in Basic-E/CBASIC 13.12 7k KINGDOM.BAS Program in Basic-E/CBASIC 13.13 13.14 15k NFL.BAS Program in Basic-E/CBASIC 13.15 4k ROCKET.BAS Program in Basic-E/CBASIC 13.16 1k RUSSIAN.BAS Program in Basic-E/CBASIC 13.17 16k SWARMS.BAS Program in Basic-E/CBASIC 13.18 16k SWARMS2.ASC Program in Microsoft Basic 13.19 2k TRAP.BAS Program in Basic-E/CBASIC 13.20 6k WUMPAS.BAS Program in Basic-E/CBASIC 13.21 23k ZOSO.2 When the review is about twice as long as any of the programs, I guess the reviewer has something on her/his mind. #014 CP/M Users Group Volume 14 Desclls how to use it 14.18 7k SEDY.ASM Disk peeking program. 14.19 2k SEDY.COM Compilation, as 14.18 written for TDL assembler (8080 ok) #015 CP/M Users Group Volume 15 Description: Utilities and non-Basic Games NUMBER SIZE NAME COMMENTS 15.01 2k -CATALOG.015 Contents of CP/M Users Group Volume 15 15.1 2k ALLOC.ASM Source of 8.1 with improvements to allow "ALLOC B:" and give display of only the usable portion of diskette 15.2 2k BEASTIE.ASM Sol VDM game from Dr. Dobbs 15.3 8k CHASE.ASM Sol VDM game from Dr. Dobbs 15.4 6k DUMP.ASM Kernl utility. See 15.7 15.5 3k INIT.ASM Kernl initiation routine. See 15.7 15.6 3k INIT2.ASM Kernl initiation routine. See 15.7 15.7 57K KERNl.ASM kernel of Real-Time Interactive Multi-purpose Operating System from Dr. Dobbs 2:8 Of Sept 1977. original per the MDS implementation described 15.8 8k MDGCBIOS.ASM BIOS written in TDL assembler for Tarbell controller 15.9 2k MDGSBOOT.ASM Boot for 15.5 15.10 the times) 11.3 7k BASIC/5.DOC CP/M implementation and other major extensions explained 11.4 6k STARTREK.TBI Was also #2.7 see VOLUME11.DOC 11.5 1k TINICOPY.SUB Someone uses the SUBMIT program?? 11.6 62k TINIDISK.ASM Source of Tinidisk 11.7 3k TINIDISK.COM Was also #2.8 11.8 13k TINIDISK.DOC Was also #2.9 #012 CP/M Users Group Volume 12 Description: Pilot Interpreters Patched for CP/M NUMBER SIZE NAME COMMENTS 12.01 1k -CATALOG.012 Contents of CP/M Users Group Volume 12 12.1 1k GOLDI.PLT Source program for ZPILOT 12.2 2k HIPILOT.PLT Source program for ZPILOT 12.3 67k PILOT.ASM Patched version of #7.2 See PILOT.DOC 12.4 5k PILOT.COM See PILOT.DOC 12.5 2k PILOT.DOC Description of CP/M implementation of PILOT 12.6 1k PILOT.TST Source program for PILOT. Type "PILOT PILOT.TST" to run 12.7 5k PMON.ASM CP/M interface used in PILOT.COM 12.8 1k WIERD WIERD.PLT re-coded for the PILOT.COM syntax for comparison purposes only. [wondeription: Various CP/M Utilities NUMBER SIZE NAME COMMENTS 14.01 2k -CATALOG.014 Contents of CP/M Users Group Volume 14 14.1 5k ARTICLE Text for SECTEST below (did you know that the West German garment industry grosses $30 BN?) 14.2 6k BCD-DRVR Driver to convert ASCII to that funny reverse BCD used by IBM 2740 terminals 14.3 5k DLDHI.ASM High portion of DLOAD - See DOC 14.4 5k DLOAD.ASM Patches to put MITS 3.2 8k Basic up on CP/M with CSAVE/CLOAD to disk 14.5 4k DLOAD.DOC Implementation notes for DLOAD and comments on MOVE, LIST32 and the use of MITS 8k Basic Vers 3.2 after patching 14.6 3k DUMP.COM Running version of DUMP below, supplied as DUMP.ASM coded for TDL assembler (8080 ok) 14.7 23k DUMP.MAC Fantastic disk viewer program. Can address files, CP/M groups or sectors directly, uses standard console output, and displays in ddt DUMP form with HEX and ASCII simultaneously. 14.8 5k LIST32.ASM program to recover as 25k OTHELLO.COM Running object from 15.11 15.11 12k OTHELLO.FOR Fortran source of board game 15.12 16k PRINT3.ASM Further re-write of 8.23 to permit command line control of titles, pagination and print pitch 15.13 1k PROC1.ASM Procedure to operate under Kernl. See 15.7 15.14 1k PROC2.ASM Procedure to operate under Kernl. See 15.7 15.15 2k PROC3.ASM Procedure to operate under Kernl. See 15.7 15.16 1k PROC4.ASM Procedure to operate under Kernl. See 15.7 15.17 2k PROC5.ASM Procedure to operate under Kernl. See 15.7 15.18 1k PROC6.ASM Procedure to operate under Kernl. See 15.7 15.19 2k PROC7.ASM Procedure to operate under Kernl. See 15.7 15.20 1k PROC8.ASM Procedure to operate under Kernl. See 15.7 15.21 4k ROMP.ASM Tarbell tape loader and saver 15.22 46k SOLOS.ASM Sol Operating System published in ACCESS. commented and includes noted patch to use as cp/m console 15.23 2k TARGET.ASM Sol VDM Game by george W. Rompot from MITS newsletter 15.24 6k TLOAD.ASM Re-wr who can't spell strawberries??] 12.9 1k WIERD.PLT Source program for ZPILOT 12.10 1k ZPILOT.COM Object of ZPILOT.Z80 12.11 7k ZPILOT.Z80 Zilog mnemonic source of a PILOT interpreter. No DOC!! #013 CP/M Users Group Volume 13 Description: - Basic-E Programs - CBASIC Programs - Microsoft Basic Programs A very mixed bunch. Zoso laments about the quality in his Christmas play, complete with Greek chorus. This diskette is a must for anyone who must have a copy of everything. Unfortunately a few jewels here may be missed because of the company it keeps in this volume. The *.ASC are microsoft, the *.BAS will (sometimes) compile on Basic-E/CBASIC. Many are compatible. All can be switched with syntactical synchronization (who said that??) (my lips didn't move). NUMBER SIZE NAME COMMENTS 13.01 2k -CATALOG.013 Contents of CP/M Users Group Volume 13 13.1 7k 15/PUZ.ASC Program in Microsoft Basic 13.2 7k 1500.ASC Program in Microsoft Basic 13.3 2k 23cii file from internal storage MITS 3.2 form - See DLOAD.DOC 14.9 2k MOVE.ASM A PIP to transfer files without the problem of 's in files with non-COM type names, such as Basic-E/CBASIC INT files - See DLOAD.DOC 14.10 3k PUT.ASM Used to load a file at any memory address, and optionally start to run it. Useful for poking odd drivers and monitors into memory for those with no front panel. 14.11 10k REL1.ASM Instructive re-construction of RELOC/CPM program See RELHOW.DOC. Note that relocation table is not included. 14.12 9k REL256.COM Reloc for integer k-100h system 14.13 9k REL512.COM Reloc for integer k-200h system 14.14 9k REL768.COM Reloc for integer k-300h system 14.15 3k RELHOW.DOC Implementation notes for relocating CP/M Version 1.3 at 100H increments instead of 400H as supplied 14.16 10k SECTEST.BAS CBASIC program for testing context comprehension and recall. Uses the article file #14.1 14.17 1k SECTEST.DOC Bob te.rite of 6.18 with documented enhancements 15.25 5k TSAVE.ASM Re-write of 6.20 with documented enhancements #016 CP/M Users Group Volume 16 Description: - Assemblers - Other Utilities - FOCAL NUMBER SIZE NAME COMMENTS 16.01 2k -CATALOG.016 Contents of CP/M Users Group Volume 16 16.02 7k VOLUME16.DOC Comments on certain programs 16.1 9k ASMX.COM Assembler which recognizes Z-80 ops See VOLUME16.DOC [careful: with correct syntax (ASMX filename.aaa) this does work. With faulty syntax the program takes revenge on the disk directory.] runs ok on 8080 16.2 12k COPYDSK.ASM Disk copy program. See VOLUME16.DOC 16.3 13k COPYDSK.MAC As 16.2 for TDL assembler 16.4 7k CPMUTIL.ASM CP/M subroutines useful generally and employed as part of Z80ASM 16.17 16.5 3k EDIT.COM Intel-like editor. Does L F B and -B much faster than ED.COM. See VOLUME16.DOC 16.6 8k EDUCATOR.ASM 8080 instruction set tutor from Byte of July 1976 e 18 18.02 1k VOLUME18.DOC Comments on certain programs 18.1 40k CASUAL.ASM Casual language from Dr. Dobbs 1:10 of December 1976, re-written in Intel mnemonics. No CP/M I/O yet 18.2 39k FLTARITH.ASM Section 1 of Intel 8008 math routines re-written for 8080. Can stand alone or run with FPCONV 18.3 18.3 18k FPCONV.ASM section 2 of Intel 8008 math routines re-written for 8080. Acts as binary to decimal interface to FLTARITH 18.2 18.4 39k MATH.ASM Yale math routines 18.5 2k MATH.DOC Comments on MATH.ASM 18.4 18.6 24k MILMON80.ASM Stand-alone monitor editor assembler See VOLUME18.DOC 18.7 46k PROCSELF.ASM Software Package #1. No CP/M I/O yet #019 CP/M Users Group Volume 19 Description: Various Utilities NUMBER SIZE NAME COMMENTS 19.01 2k -CATALOG.019 Contents of CP/M Users Group Volume 19 19.02 6k VOLUME19.DOC Comments on volume contents 19.1 17k ADE.ASM Absolute disk editor. See VOLUME19.DOC 19.2 6k COPY.ASM Disk copy program. See 16.7 57k FOCAL.ASM Focal language interpreter. See VOLUME16.DOC 16.8 8k MACASM.COM Macro assembler. See VOLUME16.DOC 16.9 2k MOVDOWN.ASM Program to load file which operates below 100H 16.10 2k SEEK.ASM Set disk track from front panel during alignment 16.11 9k SPAT1.ASM Re-write of 1.29 to generalize console from original VDM dependancy 16.12 2k TASMIO.DOC Doc for TASMIO patch to put TDL tape assembler up on CP/M 16.13 3k TASMIO.HEX See TASMIO.DOC 16.14 18k TASMIO.MAC See TASMIO.DOC 16.15 3k TEST1A.ASM Successful test for Z80ASM 16.17 16.16 1k TEST2.ASM Unsuccessful test for Z80ASM 16.17 16.17 9k Z80ASM.COM Zilog mnemonic assembler. Runs on 8080. See Z80DOC.DOC 16.18 16.18 4k Z80DOC.DOC DOC for 16.17 16.19 28k Z80MAIN.ASM See 16.17 16.20 4k Z80OPCDS.ASM See 16.17 16.21 11k Z80SUBS.ASM See 16.17 #017 CP/M Users Group Volume 17 Description: - Utilities - Denver Tiny Basic - Non-Basic Games NUMBER SIZE NAME COMMENTS 17.01 1k -CATALVOLUME19.DOC 19.3 9k CPM.DOC Imsai's description of CP/M 19.4 21k LINK.ASM Remote computer control via D C Hayes modem board. See VOLUME19.DOC 19.5 17k LINK73.ASM Earlier version of 19.4 for standard modem 19.6 60k RM80.ASM Resident PROM monitor. See VOLUME19.DOC and RM80.DOC 19.7 19.7 8k RM80.DOC Comments on RM80 19.6 19.8 4k SAP.ASM Sorts and packs directory. See VOLUME19.DOC and XFER 19.12 19.9 8k SCOPY.ASM Diskette copy program for single disk system See VOLUME19.DOC 19.10 16k TREAD.ASM RM80 tape backup utility with 19.11 19.11 10k TSAVE.ASM RM80 tape save utility with 19.10 19.12 9k XFER.ASM File copy program for single disk system See VOLUME19.DOC and SAP 19.8 tilities NUMBER SIZE NAME COMMENTS 19.01 2k -CATALOG.019 Contents of CP/M Users Group Volume 19 19.02 6k VOLUME19.DOC Comments on volume contents 19.1 17k ADE.ASM Absolute disk editor. See VOLUME19.DOC 19.2 6k COPY.ASM Disk copy program. See OG.017 Contents of CP/M Users Group Volume 17 17.02 3k VOLUME17.DOC Comments on certain programs 17.1 13k 3DTICTAC.ASM Game not yet patched to CP/M 17.2 50k CROROS.ASM Cromemco Resident Operating System See VOLUME17.DOC 17.3 16k DENVBAS.ASM Denver Tiny Basic from Dr. Dobbs no CP/M I/O yet 17.4 6k DISASM.COM Revision of Intel disassembler See VOLUME17.DOC 17.5 6k DISPLAY.ASM Part of space game. See VOLUME17.DOC 17.6 6k FUNCTION.ASM Part of space game. See VOLUME17.DOC 17.7 14k MINOL.ASM Corrected version of a Tiny Basic from Dr. Dobbs 17.8 2k NUMS.ASM Part of space game. See VOLUME17.DOC 17.9 25k PROCCALC.ASM Pro Tech desk calculator package. See VOLUME17.DOC 17.10 19k SPACE.ASM Part of space game. See VOLUME17.DOC 17.11 7k Z80-OPS.ASM Z-80 mnemonics recognized by ASMX 16.1 #018 CP/M Users Group Volume 18 Description: - CASUAL - Math Routines - Monitors NUMBER SIZE NAME COMMENTS 18.01 1k -CATALOG.018 Contents of CP/M Users Group Volum.#020 CP/M Users Group Volume 20 Description: - Basic-E / CBASIC Programs - Pictures NUMBER SIZE NAME COMMENTS 20.01 2k -CATALOG.020 Contents of CP/M Users Group Volume 20 20.01 12k ZOSO.20 Our talented and modest reviewer pays tribute to a worthwhile set of submissions 20.1 8k BLACKJAC.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.2 8k CIVILW.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.3 9k FOOTBALL.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.4 7k GOLF.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.5 3k GUNNER.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.6 7k LUNAR1.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.7 9k PINUP.PIC Picture 20.8 18k PINUP1.PIC Picture 20.9 9k POKER.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.10 4k SNOOPY.PIC Picture 20.11 27k STARTREK.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.12 57k STMASTER.BAS Program in Basic-E/CBASIC. See ZOSO.20 20.13 1k STMASTER.DOC See ZOSO.20 20.14 33k STRTRK/1.BAS Program in Basic-E/CBASIC. See ZO. See DOC/TOP 21.27 4k W/SEARCH.ASC Program in Microsoft Basic. See DOC/TOP 21.28 3k WARI.ASC Program in Microsoft Basic. See DOC/TOP 21.29 7k WUMP.ASC Program in Microsoft Basic. See DOC/TOP #022 CP/M Users Group Volume 22 Description: MONSTEROUS STARTREK GAMES Well documented games for members with lots of memory and lots of time. NUMBER SIZE NAME COMMENTS 22.01 2k -CATALOG.022 Contents of CP/M Users Group Vol 22 22.01 5k ZOSO.22 Description and Application Notes on the programs by Zoso & Edison Dogge 22.1 48k BIGTREK.ASC 22.3 trimmed to load under TDL disk basic with 64k memory 22.2 39k BIGTREK.BAS Compacted version of 22.1 for much faster load 22.3 54k STARTREK.TXT Starting point of BIGTREK. purported to work with 8k basic. Unfortunately larger interpreters leave insufficient memory for program. Contains the author credits. 22.4 21k STRTRK/2.ASC A second appearence of program 21.21 which Zoso included for improvement hints for s 23A.7 38k KERNEL.ASM STOIC kernel with CP/M words in 8080 assembler 23A.8 24k KERNEL.DOC STOIC kernel doc 23A.9 46k STOIC.DOC Overview of STOIC concepts and structure 23A.10 23k STOICBAS.STC Basic definitions 23A.11 4k STOICD/A.STC Graphics for D/A hardware 23A.12 9k STOICEDT.STC Editor 23A.13 3k STOICFFT.STC Fast Fourier Transform 23A.14 8k STOICFLE.STC File system 23A.15 11k STOICFLT.STC Floating point package 23A.16 5k STOICINT.STC 4 byte integer addition 23A.17 3k STOICITP.STC Interrupt package 23A.18 3k STOICMIS.STC Miscellaneous words 23A.19 2k STOICSIN.STC Integer sine and cosine 23A.20 2k STOICSRT.STC Sort routine Overflow available as Volume 23B. This material is not essential for CP/M use, and will be available on a regular volume at some future date. (Volume 23B consists of: BOOT.ASM, BOOT.DOC, LOAD.DOC, STOIC.COM and are also available on Volume 25.) #024 CP/M Users Group Volume 24 Description: CP/M Utilities, Macro Libraries and Ratfor NUMBESO.20 20.15 7k TREKINST See ZOSO.20 20.16 7k TWEETY.PIC Picture #021 CP/M Users Group Volume 21 Description: MICROSOFT BASIC PROGRAMS NUMBER SIZE NAME COMMENTS 21.01 3k -CATALOG.021 Contents of CP/M Users Group Volume 21 21.02 19k ZOSO21.DOC Uncharacteristic for Zoso. He likes some of these programs. 21.03 20k ZOSO21.TOP Same again but with formatting for TDL text output processor. 21.04 --- TDL.HYP Unsolicited Testimonial 21.1 3k ACYDUCY.ASC Program in Microsoft Basic. See DOC/TOP 21.2 3k APOLLO.ASC Program in Microsoft Basic. See DOC/TOP 21.3 3k BANNER.ASC Program in Microsoft Basic. See DOC/TOP 21.4 4k BIO.ASC Program in Microsoft Basic. See DOC/TOP 21.5 10k BLKFRI3.ASC Program in Microsoft Basic. See DOC/TOP 21.6 6k BLKJK.ASC Program in Microsoft Basic. See DOC/TOP 21.7 3k CHASE.ASC Program in Microsoft Basic. See DOC/TOP 21.8 12k CHESS.ASC Program in Microsoft Basic. See DOC/TOP 21.9 1k DIAMONDS.ASC Program in Microsoft Basic. See DOC/TOP 21.10 erious trekkies who don't have Volume 21 22.5 5k TREKINFO.DOC Detailed rules and features of STARTREK.TXT and BIGTREK 22.6 42k TREKMOD.ASC BIGTREK trimmed some more and able to load with Microsoft Disk Basic #023 CP/M Users Group Volume 23A Description: STOIC (Stack Oriented Interactive Compiler) Stoic has the capabilities of a compiler, editor, assembler, debugger, loader and operating system. It appears to be conceptually similar to Forth in the use of an extensible vocabulary of words, with the ability to "forget" definitions and re-define or create new words in terms of previously learned words. The first two modules, the bootstrap and kernel, were written in assembler mnemonics. Thereafter the modules were written in STOIC words. This package is a stand-alone system and does not require a resident FDOS, such as CP/M or ISIS. The material has been significantly re-arranged and revised since the catalogs were first published. In particular the kerneR SIZE NAME COMMENTS 24.01 2k -CATALOG.024 Contents of CP/M Users Group Vol 24 24.02 3k VOLUME24.DOC Comments on certain programs in Volume 24 24.1 19k DUMP.ASM Revision of 14.7 to incorporate many enhancements, and assemble with digital research macro assembler, using 24.4 24.2 3k DUMP.COM Assembly of 24.1 24.3 3k MAC40.LIB Library of macros to cross-assemble 4004/4040 code using digital research macro assembler 24.4 17k MACRO.LIB Extensive macro library for use with Digital Research macro assembler 24.5 3k OPCODE.LIB Extended register operation macro library for Digital Research macro assembler 24.6 32k RATFOR.COM Pre-processor to translate from the structured language ratfor, described in software tools, to standard Fortran. Type "RATFOR filename", to create FILENAME.FOR from FILENAME.RAT 24.7 5k TAPELIB.COM Object of 24.9 24.8 12k TAPELIB.DOC Description of 24.9 24.9 37k TAPELIB.MAC Pip-like program to transfer files from 4k ENTE.ASC Program in Microsoft Basic. See DOC/TOP 21.11 6k ENTEP.ASC Program in Microsoft Basic. See DOC/TOP 21.12 6k FURS.ASC Program in Microsoft Basic. See DOC/TOP 21.13 6k HORSE.ASC Program in Microsoft Basic. See DOC/TOP 21.14 8k KING.ASC Program in Microsoft Basic. See DOC/TOP 21.15 3k LANDER.ASC Program in Microsoft Basic. See DOC/TOP 21.16 2k MANDALA.ASC Program in Microsoft Basic. See DOC/TOP 21.17 4k MAZE.ASC Program in Microsoft Basic. See DOC/TOP 21.18 3k ROCKET.ASC Program in Microsoft Basic. See DOC/TOP 21.19 3k RUSSIAN.ASC Program in Microsoft Basic. See DOC/TOP 21.20 4k SNOOPY.ASC Program in Microsoft Basic. See DOC/TOP 21.21 21k STRTRK/2.ASC Program in Microsoft Basic. See DOC/TOP 21.22 20k STRTRK/3.ASC Program in Microsoft Basic. See DOC/TOP 21.23 1k TACOS.ASC Program in Microsoft Basic. See DOC/TOP 21.24 5k TAXMAN.ASC Program in Microsoft Basic. See DOC/TOP 21.25 16k TRADE.ASC Program in Microsoft Basic. See DOC/TOP 21.26 2k TRAP.ASC Program in Microsoft Basicl now incorporates word definitions which permit direct operation through CP/M. STOICCPM.DOC explains the procedure for bringing the system up. It was necessary to leave certain files off because of lack of space, and these can be obtained as volume 23B. The overflow volumes will also be added to a future regular volume, and were selected as the least necessary for a CP/M user. Files of type .STC are written in STOIC and can be loaded as described in the VOLUME23.DOC NUMBER SIZE NAME COMMENTS 23A.01 3k CATALOG.023 Contents of CP/M Users Group Vol 23 23A.02 2k VOLUME23A.DOC Comments on this volume, additional to STOICCOM.DOC 23A.03 3k STOICCPM.DOC Comments on CP/M STOIC. Read together with the VOLUME23A.DOC 23A.1 13k ASSEMBLE.DOC STOIC 8080 assembler 23A.2 8k DICT.DOC STOIC dictionary definitions 23A.3 8k EDIT.DOC STOIC display editor doc 23A.4 9k FILES.DOC STOIC file system doc 23A.5 5k FLOATPNT.DOC Floating point doc 23A.6 2k INTRRUPT.DOC Interrupt handler doc/CP/M disk to Tarbell tape. Permits viewing on console (if your hardware is fast enough) written in TDL macro assembler 24.10 11k XDIR.ASM Directory program giving neat 3-wide display, sorted and with files sized in k's and reporting correct number of files and remaining disk space. Uses Digital Research macro assembler and macro library 24.4 24.11 2k XDIR.COM Object of 24.10 #025 CP/M Users Group Volume 25 Description: Various Assembler Utilities NUMBER SIZE NAME COMMENTS 25.01 3k -CATALOG.025 Contents of CP/M Users Group Vol 25 25.02 1k VOLUME25.DOC Comments on Volume 25 contents 25.1 2k 88-MODEM.DOC Notes on 25.2 below 25.2 32k 88-MODEM.ASM Intelligent terminal program for the IDS 88 modem board. See Dr. Dobb's Vol 3, Issue 6, Jun-Jul 1978. 25.3 3k BKSPACE.DOC Notes on backspace handling in CP/M and Microsoft Basic. 25.4 4k FRAGMENT.DOC Paging and screen copy code for memory mapped video board. 25.5 5k LET Gives day of week for any date 26.5 8k BLACKJCK.ASC Microsoft Basic game. See ZOSO26.DOC for note on CRT dependent code. 26.6 10k BUDGET.ASC Budget program. See ZOSO26.DOC 26.7 3k CHASE.ASC Microsoft Basic game 26.8 12k CHESS.ASC Microsoft Basic game 26.9 9k CIVILWAR.ASC Microsoft Basic game 26.10 6k CLIMATES.ASC Microsoft Basic game 26.11 6k CLOUD-9.ASC Microsoft Basic game 26.12 5k CRAPS.ASC Microsoft Basic game 26.13 7k CRAZY-8.ASC Microsoft Basic game. See ZOSO26.DOC for note on CRT dependent code. 26.14 1k GALAXY.ASC Microsoft Basic game 26.15 2k GALAXY2.ASC Microsoft Basic game 26.16 8k SQUARE.ASC Microsoft Basic game 26.17 16k SWARMS.ASC Microsoft Basic game 26.18 8k WEATHER.ASC Microsoft Basic game 26.19 5k WORD-PLZ.ASC Microsoft Basic game 26.20 12k OTHELLO.FOR Fortran version of Othello on vol 15. See ZOSO26.DOC 26.21 22k OTHELLO.COM Executable 26.20 26.22 1k CHAIN.ASC Program to copy from console to XXX.SUB file. 26.23 2k EDITM.FOR Fortran ry data base 28.6 1k INV.IND Sample part # index for inventory file 28.7 23k MAILLIST.DOC Updated documentation for CACHE mailing list system 28.8 11k MAINT.BAS Updated maillist program. Handles more data fields in file. 28.9 11k REPORT.BAS Improved maillist report program. 28.10 14k ALGOLM.COM Algolm compiler by Lt. Mark S. Moranville-Naval Postgraduate School. See proceedings of Second West Coast Faire, March 1978 28.11 14k RUNALG.COM Algolm INT file interpreter 28.12 9k ALGINTRO.TXT Algolm introduction 28.13 3k ALGSTART.TXT Algolm run instructions 28.14 2k COMERR.TXT Algolm compile errors documentation 28.15 2k RUNERR.TXT Algolm run time errors documentation 28.16 25k USRMAN.TXT Algolm User Manual 28.17 3k ARRAY.ALG Sample Algolm program 28.18 1k BOOLINT.ALG Sample Algolm program 28.19 1k CASETEST.ALG Sample Algolm program 28.20 1k CASETWO.ALG Sample Algolm program 28.21 1k FLYTEST.ALG Sample Algolm program 28.22 1k GOTOTEST.ALG Sample AlgolTER.ASM Personalized Form letter generator. For mac assembler. Output in Digital Research TEX format. 25.9 9k DCHAYES.ASM Program in DCHAYES modem manual. 25.10 7k DCHDIAG.ASM Diagnostic for DCHAYES modem. 25.11 13k MODEM.ASM Intelligent terminal program for CACHE computer network. 25.12 3k MODEM.DOC Documentation for 25.11 25.13 26k CBIOS24.ASM Bios for Tarbell disk controller. See TARBELL.DOC 25.14 2k SBOOT24.ASM Boot for Tarbell disk controller. See TARBELL.DOC 25.15 26k FBIOS24.ASM Bios for dual Persci disk controller. see TARBELL.DOC 25.16 2k FBOOT24.ASM Boot for dual Persci disk controller. see TARBELL.DOC 25.17 9k COPY.ASM Users' Group 1.3 modified for Tarbell controller. 25.18 9k FORMAT.ASM Disk initialize program for Tarbell controller. 25.19 3k TARBELL.DOC Notes on 25.13 through 25.18. 25.20 3k NOTES.VAN Notes on CP/M operation and undocumented features. 25.21 5k CAT.ASM Master Disk Catalog System program. IV program. Writes M80 PRN file to LST device. #027 CP/M Users Group Volume 27 Description: Microsoft Basic games NUMBER SIZE NAME COMMENTS 27.01 2k CATALOG.027 Contents of CP/M Users Group Volume 27 27.02 32k ZOSO27.DOC Our reviewer's comments on vol 26 and 27 27.1 6k ANTONYMS.ASC Microsoft Basic game 27.2 4k DISSAMBR.ASC Disassembler. See ZOSO27.DOC 27.3 8k DOTS.ASC Microsoft Basic game 27.4 3k DRAGRACE.ASC Microsoft Basic game 27.5 8k FOOTBALL.ASC Microsoft Basic game 27.6 10k GOLF.ASC Microsoft Basic game 27.7 2k GREEKRTS.ASC Microsoft Basic game 27.8 6k HANGMN-1.ASC Microsoft Basic game 27.9 6k HANGMN-2.ASC Microsoft Basic game 27.10 6k HANGMN-3.ASC Microsoft Basic game 27.11 3k HIDESEEK.ASC Microsoft Basic game 27.12 5k IQUEEN.ASC Microsoft Basic game 27.13 2k MASTERMD.ASC Microsoft Basic game 27.14 5k MAZE.ASC Microsoft Basic game 27.15 7k MEMBRAIN.ASC Microsoft Basic game 27.16 2k NIM.ASC Microsoft Basic game 27.17 7k ROULETTE.ASC Microsofm program 28.23 1k HANOI.ALG Sample Algolm program 28.24 2k LUNAR.ALG Sample Algolm program 28.25 2k PERM.ALG Sample Algolm program 28.26 2k READWORD.ALG Sample Algolm program 28.27 1k RWINT.ALG Sample Algolm program 28.28 1k SIISTR.ALG Sample Algolm program 28.29 2k SORT.ALG Sample Algolm program 28.30 1k STRING.ALG Sample Algolm program 28.31 1k STRTST.ALG Sample Algolm program 28.32 1k BLKTEST.ALG Sample Algolm program 28.33 1k ONEND2.ALG Sample Algolm program 28.34 1k WFILE.OUT Sample Algolm program output 28.35 1k WINPUT.INP Demo input file for READWORD. 28.36 1k RFILE.INP Demo input file for RWINT. 28.37 1k BLK.INP Demo input file 28.38 1k FILE1.INP Demo input file 28.39 1k FILE2.INP Demo input file 28.40 4k ADM3.MOD Mods for ADM3 #029 CP/M Users Group Volume 29 Description: * Assembler Utilities * Assembly Games * Basic-E Floating Point Source, Version 1.4 (see Volume 30 for remainder of Basic-E source) NUMBER SIZE NAME COMMENTS 225.22 8k UCAT.ASM Master Disk Catalog System program. 25.23 5k QCAT.ASM Master Disk Catalog System program. 25.24 7k CATALOG.DOC Documentation for Master Catalog System. 25.25 13k STOIC.COM CP/M STOIC constructed as described in VOLUME23.DOC. 25.26 7k BOOT.ASM STOIC bootstrap in 8080 assembler. 25.27 2k BOOT.DOC Boot documentation. 25.28 6k LOAD.DOC Information on loading STOIC as a stand-alone system. 25.29 1k STATPCH.ASM Device name patches for STAT 25.30 3k TTYDRV.MAC TTY drivers from Microsoft Fortran #026 CP/M Users Group Volume 26 Description: Microsoft Basic and Fortran games and utilities NUMBER SIZE NAME COMMENTS 26.01 2k -CATALOG.026 Contents of CP/M Users Group Volume 26 26.02 32k ZOSO26.DOC Our reviewer's comments on vol 26 and 27 26.1 4k BACCRRT.ASC Microsoft Basic game. See ZOSO26.DOC for note on CRT dependent code. 26.2 14k BASEBALL.ASC Microsoft Basic game 26.3 7k BIOCAL.ASC Biorhythm program. See ZOSO26.DOC. 26.4 6k BIRTHDAY.ASCt Basic game 27.18 9k SHOP.ASC Microsoft Basic game 27.19 4k SNOOPY.ASC Generates Snoopy picture 27.20 7k STARTREK.ASC Microsoft Basic game 27.21 8k SYNONYMS.ASC Microsoft Basic game 27.22 11k BLUFF.INT Microsoft Basic game 27.23 12k RUN.COM Run program to execute BLUFF.INT. See ZOSO27.DOC 27.24 46k MEGATREK.ASC 22.1 trimmed to run under Microsoft Basic version 4.5 in a 63k CP/M system 27.25 1k MEGATREK.DOC Note on Megatrek #028 CP/M Users Group Volume 28 Description: * Basic-E Utilities and Games w/ Data Base System * Algol-like Language * CACHE Maillist program update NUMBER SIZE NAME COMMENTS 28.01 3k -CATALOG.028 Contents of CP/M Users Group Volume 28 28.1 6k DATABASE.DOC Documentation for initial modules of database system. 28.2 6k DBENTRY.BAS D.B. system file load utility 28.3 7k DBQUERY.BAS D.B. system query and update module 28.4 7k DBSETUP.BAS D.B. system file initialization module 28.5 1k INV. Sample file definition for invento/9.01 3k -CATALOG.029 Contents of CP/M Users Group Volume 29 29.02 3k VOLUME29.DOC Comments on programs on Volume 29 29.1 25k TTT.ASM 3-d tic tac toe game 29.2 9k CHASE.ASM VDM/SOL game. 15.3 with CP/M I/O. See VOLUME29.DOC. 29.3 3k TARGET.ASM VDM/SOL game. 29.4 8k DEFLECT.ASM VDM game 29.5 8k MUSIC.ASM Music program 29.6 2k MUSICP.COM Music program with table for "Sounds of Silence" 29.7 12k PIRANHA.ASM VDM game 29.8 19k ROBIN.ASM Uses Poly VTI. See VOLUME29.DOC. 29.9 3k ROBOT.ASM VDM game 29.10 2k ALLOC.ASM Disk allocation display. See VOLUME29.DOC. 29.11 24k EDIT.ASM Disassembly of 16.5. See VOLUME29.DOC. 29.12 5k SAP.ASM Sorts and packs directory. Improved version of 19.8. See VOLUME29.DOC. 29.13 3k NOTATE.ASM Adds comments to ASM source. Assemble using MAC. See VOLUME29.DOC. 29.14 1k SYMSTACK.LIB Assembler time push/pop LIB for MAC. See VOLUME29.DOC. 29.15 2k NCOMPARE.LIB Corrected versions of Digital Research distribution. See VOLUME29.DOC. 29.16 11k SEQIO.LIB Corrected version of Digital Research distribution. See VOLUME29.DOC. 29.17 1k WHENS.LIB Modification of Digital Research versions to allow infinite nesting. See VOLUME29.DOC. 29.18 1k DOWHILES.LIB Modification of Digital Research versions to allow infinite nesting. See VOLUME29.DOC. 29.19 2k SELECTS.LIB Modification of Digital Research versions to allow infinite nesting. See VOLUME29.DOC. 29.20 1k IGADD.MAC Subroutine callable from Fortran-80 29.21 1k MON1.MAC Subroutine callable from Fortran-80 29.22 1k MON2.MAC Subroutine callable from Fortran-80 29.23 2k UNLOAD.ASM Converts COM file to HEX. Assemble using MAC. See VOLUME29.DOC. 29.24 14k FPCONV.SRC CP/M Basic-E Floating Point conversion package 29.25 2k FPDATA.SRC Equate tables for FPCONV 29.26 8k FPINT.SRC Interface between Interpreter and Floating Point package 29.27 29k FPPKG.SRC Interpreter 29.28 13k TRAN.SRC Transcendental Function package  29.29 5k MOVE.ASM 1 disk move program. Assemble using MAC. 29.30 6k MOVENMAC.ASM MOVE.ASM with macros expanded for assembly using ASM. 29.31 5k TIMESQ.ASM Sign generator for VDM. 29.32 3k WSYSGEN.ASM Program to SYSGEN a stack of disks easily. 29.33 1k VDM.DOC Modified to page 16 lines instead of 24. fication of Digital Research versions to allow infinite nesting. See VOLUME29.DOC. 29.20 1k IGADD.MAC Subroutine callable from Fortran-80 29.21 1k MON1.MAC Subroutine callable from Fortran-80 29.22 1k MON2.MAC Subroutine callable from Fortran-80 29.23 2k UNLOAD.ASM Converts COM file to HEX. Assemble using MAC. See VOLUME29.DOC. 29.24 14k FPCONV.SRC CP/M Basic-E Floating Point conversion package 29.25 2k FPDATA.SRC Equate tables for FPCONV 29.26 8k FPINT.SRC Interface between Interpreter and Floating Point package 29.27 29k FPPKG.SRC Interpreter 29.28 13k TRAN.SRC Transcendental Function package 0#030 CP/M Users Group Volume 30 CP/M Basic-E Version 1.4 PLM Source (obtain Volume 29 also for complete set) NUMBER SIZE NAME COMMENTS 30.01 1k -CATALOG.030 Contents of CP/M Users Group Volume 30 30.1 2k BASCOM.LIT Literal equates 30.2 39k BASIC.PLM Version 1.4 Basic-E compiler modified for CP/M 30.3 14k BASPAR.PLM Parser module 30.4 54k BASSYN.PLM Symbol table and code generator module 30.5 12k BASIC.COM Executable compile module 30.6 66k RUN.PLM Run module 30.7 12k RUN.COM Executable run module 30.8 17k BUILD.PLM Invoked when RUN called to build internal tables from INT file #031 CP/M Users Group Volume 31 Description: Tarbell Basic Manual and Assembler Source (obtain Volume 32 also for complete package) NUMBER SIZE NAME COMMENTS 31.01 2k -CATALOG.031 Contents of CP/M Users Group Volume 31 31.1 2k TBASIC.TOC Table of Contents 31.2 3k TBASIC.1 Chapter 1 31.3 2k TBASIC.2 Chapter 2 31.4 3k TBASIC.3 Chapter 3 31.5 3k TBASIC.4 Chapter 4 3esar mission questionaire 33.8 4k CAPSERCH.BAS Game to teach fundamentals of SAR 33.9 20k CASPGAME.BAS Demonstrator for BITCASP 33.10 14k CASPPLUS.BAS Expanded version of RJCASP 33.11 7k DFELT.BAS Re-write of N-ELT1 33.12 3k ELTPOD.BAS Calculates electronic discovery probabilities 33.13 10k N-ELT1.ASC Microsoft Basic version - see 33.15 33.14 10k N-ELT1.BAS CBasic version - see 33.15 33.15 6k N-ELT1.DOC Radio direction finding to localize radio beacon 33.16 2k OPT.BAS Tests probability of visual detection 33.17 3k RJCASP.BAS Allocation of search resource 33.18 9k SERCHGME.BAS 33.8 re-written as structured program 33.19 3k VISPOD.BAS Calculates visual discovery probabilities #034 CPM USERS GROUP VOLUME 34 - (T-1) SAM76. An interesting macro / text processing language. Also contains (*) some utilities that the author found useful, and which were therefore left on the disk. "SAM76 The First Language Manual" is available, $15 postpaid, from: SAM76 Inc. Box 257 RR1 r 34.45# 1K XM.COM * directory lister (seems like an old copy of "FMAP") 2k ~.COM Utility to generate CRCs 1k ~.OLD File of CRCs for this diskette COMPUTIST NOTE: This volume (originally T-1) varies considerably from the CPM U.G. diskette Volume #34. Files marked with an # are not on this diskette, while the following files are not in the directory: 1k FILES.DOC 8k NOT060.TXT 7k NOT061.TXT 7k NOT062.TXT 8k NOT063.TXT 2k NOT064.TXT 13k SAM.COM 15k SAM76.COM 1k SAM76.DOC 7k UPD03.TXT 7k UPD031.TXT 8k UPD04.TXT 5k UPD041.TXT 4k UPD042.TXT 3k UTIL$.SAM #035 CPM USERS GROUP VOLUME 35 - (T-2) FELIX - GRAPHICS ANIMATION SYSTEM - with pseudo assembler, etc. NUMBER SIZE NAME COMMENTS 35.01 4k -CATALOG.035 Contents of CP/M VOL. 35 35.02 2k ABSTRACT.035 Abstract of disk contents 35.1 2k BEE.FAS Source code; A bee & a bird cartoon 35.2 10k BEE#.FEX Executable bee story, with background and objects. 35.3 5k CHECKOU&.FEX Ex1.6 3k TBASIC.5 Chapter 5 31.7 3k TBASIC.6 Chapter 6 31.8 4k TBASIC.7 Chapter 7 31.9 3k TBASIC.8 Chapter 8 31.10 2k TBASIC.9 Chapter 9 31.11 3k TBASIC.10 Chapter 10 31.12 3k TBASIC.11 Chapter 11 31.13 2k TBASIC.12 Chapter 12 31.14 2k TBASIC.13 Chapter 13 31.15 2k TBASIC.14 Chapter 14 31.16 2k TBASIC.15 Chapter 15 31.17 3k TBASIC.A Appendix A 31.18 3k TBASIC.B1 Appendix B page 1 31.19 3k TBASIC.B2 Appendix B page 2 31.20 3k TBASIC.C Appendix C 31.21 2k TBASIC.D1 Appendix D page 1 31.22 2k TBASIC.D2 Appendix D page 2 31.23 3k TBASIC.E Appendix E 31.24 1k TBASIC.H Appendix H 31.25 3k TBASIC.I Appendix I 31.26 2k TBASIC.J Appendix J 31.27 1k TBASIC.K Appendix K 31.28 3k TBASIC.IND Index 31.29 3k TBASIC.AD Product description 31.30 3k TBASIC.CPM Special instructions 31.31 21k TBASIC.COM Executable module 31.32 43k TBASICA4.ASM Source module 31.33 55k TBASICA5.ASM Source module 31.34 26k TBASICA6.ASM Source module #032 CP/M Users Group Volume 32 Descript Pennington, N. J., 08534 See Dr. Dobbs Journal #26 (Volume 3, Issue 1) for a look at SAM76, but consider the above book as the "real" reference. NUMBER SIZE NAME COMMENTS -CATALOG.034 CONTENTS OF CP/M VOL. 34 34.1 1K ABSTRACT.034 Quick look at SAM76 34.2 8K ASTRO.FNT Astrological signs for graphics 34.3# 1K BONUS.DOC Function documentation 34.4# 1K BOOK.DOC How to order SAM76 manual 34.5# 1K COPY.COM * Disk copy program 34.6# 1K CPMSETL.COM Part of SAM76 setup procedure 34.7 3K DEMO.SAM Some interesting demo programs 34.8 1K DIRFIX.SAM Disk directory routines 34.9 19K EXTF.ASM Various routines, including 34.10 1K EXTF.DOC ..a clock driver. 34.11# 1K FRIEND.DOC oops!! Applies to something not supplied on disk: a vers of SAM76 that runs at 8000H 34.12# 2K G.SAM Sets up SAM for load-and-go 34.13 1K HOOH.SAM Hex to octal to hex 34.14# 1K IDUMP.COM Interpreted file dump (**) 34.15# 13K ILRAW.COM Raw copy of SAM76. See READ-ME.DOC and S.DOC 34.16 10K INFO.SAM Crecutable checkout. 35.4 4k CHECKOUT.FAS Felix pseudo-machine diagnostic program 35.5 8k CLEAR.ASM Start of FELIX source code 35.6 1k CREATE.ASM FELIX source code 35.7 1k DISPONOF.ASM FELIX source code 35.8 1k DISTEST.FAS Demo of distance operator, joystick rescaling. 35.9 5k DISTest&.FEX Executable Distance Test 35.10 11k DISTPLUS.ASM FELIX source code 35.11 14k DOODLE.ASM FELIX source code 35.12 1k DOODLE.COM Object Drawing Utility 35.13 3k DSKRD.ASM FELIX source code 35.14 1k EXEC.COM Pseudo-Machine Interpreter 35.15 2k EXEC.OBJ The 'actual' pseudo-machine (loaded by EXEC.COM,TRACE.COM) 35.16 9k EXECPLUS.ASM FELIX source code 35.17 2k EXECSAFE.ASM FELIX source code 35.18 10k FANCY#.FEX #35.42 with a pretty init. background 35.19 9k FASM.COM Pseudo-Code Assembler 35.20 1k FCBMOV.ASM FELIX source code 35.21 1k FCBNEW.ASM FELIX source code 35.22 5k FELIX.ASM FELIX source code 35.23 1k FELIX.COM Initial Setup Routine 35.24 7k FELIX.DOC Some details about the syion: Tarbell Basic Assembler Source (obtain Vol 31 also for complete set) NUMBER SIZE NAME COMMENTS 32.01 1k -CATALOG.032 Contents of CP/M Users Group Volume 32 32.1 1k READ.ME Note from Tarbell Electronics 32.2 10k RTMASM.COM Multi input file assembler 32.3 3k RTMASM.DOC Instructions for assembling 32.4 26k TBASICA1.ASM Source module 32.5 47k TBASICA2.ASM Source module 32.6 53k TBASICA3.ASM Source module 32.7 19k TBASICIO.ASM Source module #033 CPM USERS GROUP VOLUME 33 DESCRIPTION: Search and Rescue programs from R.A. Gregoire NUMBER SIZE NAME COMMENTS 33.0 2k -CATALOG.033 Contents of CP/M Users Group Volume 33 33.1 8k -SAR.DOC Detailed descriptions of the SAR programs 33.2 1k ADDPOD.BAS Calculates joint probability of detection 33.3 18k BITCASP.BAS Enhanced RJCASP to use Summagraphics Bitpad 33.4 22k CAESAR.BAS Flight log keeper 33.5 2k CAESAR.BQ Caesar briefing questionaire 33.6 2k CAESAR.DQ Caesar debriefing questionaire 33.7 4k CAESAR.MQ Caeates following .DOC files 34.17# 1K INFO1.DOC <> ?? 34.18# 1K INFO2.DOC Misc. DOC 34.19# 2K INFO3.DOC Misc. DOC 34.20# 1K INFO4.DOC <> ?? 34.21 2K INFO5.DOC Misc. DOC 34.22# 1K KSAP.COM * Sort and pack directory 34.23 3K LABEL.SAM Demo prog. 34.24 1K LOOP.SAM Demo prog. 34.25 1K MOVE2.SAM Demo prog. 34.26 1K MULT.SAM Multiplies long decimal #'s 34.27 5K NEWS.SAM Random news story generator. 34.28 10K P1UR.FNT Used with graphics 34.29 15K PLOT.ASM For graphics on Poly/TRS-80 34.30 1K PLOT.DOC ..type board, or plotter. 34.31 7K PRINT.SAM Print SAM files 34.32# 3K READ-ME.DOC One user's experiences. 34.33# 2K S.DOC Doc on creating S.COM 34.34 1K SIZE.SAM Demo 34.35 1K SIZLST.SAM Demo 34.36 4K SLED.SAM Demo 34.37# 4K THREED.SAM Demo 34.38 7K UPD051.TXT ??? 34.39 7K UPD052.TXT ??? 34.40 1K VERIFY.SAM Demo 34.41# 6K VOLSAM.DOC Volume documentation ("extended abstract") 34.42# 3K X$UTIL.SAM Demo 34.43# 4K XD.COM * directory lister 34.44# 1K XDIR.COM * directory liste0stem 35.25 3k FELIX.OBJ The 'actual' base routines (loaded by FELIX.COM) 35.26 3k FELIXV1.CAT Author's original volume cat. 35.27 2k GETF.ASM FELIX source code 35.28 2k GETW.ASM FELIX source code 35.29 2k HEXOUT.ASM FELIX source code 35.30 2k LOADBACK.COM Utility for getting backgrounds from disk. 35.31 2k LOADOB.COM Utility for getting objects from disk 35.32 5k LOADPROG.ASM Utility for getting (parts of) programs from disk. 35.33 1k LOADPROG.COM Object of above 35.34 2k MUSTANG.FAS Cowboy jumps on a horse as it rides by 35.35 6k MUSTANG&.FEX Executable cowboy story 35.36 15k NUMBER.ASM FELIX source code 35.37 3k OBJECT.ASM FELIX source code 35.38 1k OBJNULL.ASM FELIX source code 35.39 1k PAINT.FAS Source code for a simple painter (Needs joysticks.) 35.40 1k PAINT.FEX PAINTER for use with your own objects 35.41 2k PAINT.PRN PAINT.FAS listing 35.42 6k PAINT&.FEX Painter for use with its own objects 35.43 4k PAINTER.FEX Painter using 'Theta' (added AASM) 36.21 2k ML80.DOC DOC on ML80 components 36.22 9k ML80.REF Reference material on ML80 36.23 3k PEN-CPM.ASM Electric Pencil to CP/M file.. 36.24 1k PEN-CPM.COM ..conversion program 36.25 2k PEN-CPM.DOC .. 36.26 24k POW.ASM Source for text processor 36.27 5k POWCMDS.POW POW documentation 36.28 2k POWTEXT.POW More POW doc. 36.29 6k SCRAMBLE.ASM File encode/decode 36.30 2k SCRAMBLE.DOC Doc on above 36.31 17k TED.COM Nice CP/M text editor, with.. 36.32 23k TED.DOC ..built in help features. 36.33 10k TOP.AZM TDL Text output processor.. 36.34 5k TOP.PRN ..patches 36.35 3k TOP.TOP .. 36.36 22k XREF.ASM Cross references .ASM files #037 CP/M Users Group Volume 37 (T-4) Description: CBASIC2 programs: (1) Comprehensive arithmetic teaching programs; (2) CRAPS program; (3) some accounting programs; (4) parts list program (5) Basic interpreter keyword changer (not CBASIC) NUMBER SIZE NAME COMMENTS 37.01 4k -CATALOG.037 CONTENTS OF CP/M VOL. 37 37rill program 37.51 2k PERCENT.INT .. 37.52 3k VOLUME.BAS (1) Arithmetic drill program 37.53 2k VOLUME.INT .. 37.54 3k WEIGHT.BAS (1) Arithmetic drill program 37.55 2k WEIGHT.INT .. 37.56 3k WHOLE.BAS (1) Arithmetic drill program 37.57 2k WHOLE.INT .. #038 CP/M Users Group Volume 38 (T-5) Description: (1) CP/M Speed Up Utilities (and BIOS Auto-reloc) (2) Tarbell Controller Utilities NUMBER SIZE NAME COMMENTS 38.01 2k -CATALOG.038 Contents of CP/M Users Group Volume 38 38.02 5k ABSTRACT.038 Abstracts on some of the files. 38.1 5k BVBOOT.ASM (1) Boot for full sized Tarbell SYS running BVIOS 38.2 28k BVIOS.ASM (1) Compact BIOS allowing Tarbell systems to not be 1k smaller 38.3 56k DFOCO.ASM (2) Double density format and 38.4 8k DFOCO.COM copy option for Tarbell 38.5 20k DFOCO.DOC and Delta disk controllers 38.6 1k DMSPATCH.ASM (1) Fast patch for Digital Micro Systems drives 38.7 1k DSCUSPAT.AS/D in) 35.44 6k PAINTER&.FEX Painter with Theta and its own objects 35.45 11k PARM.ASM FELIX source code 35.46 3k PATH.ASM FELIX source code 35.47 3k POSIT.ASM FELIX source code 35.48 3k PUTF.ASM FELIX source code 35.49 3k PUTW.ASM FELIX source code 35.50 1k RESCALE.ASM FELIX source code 35.51 5k ROTATE.ASM FELIX source code 35.52 1k SAPD.COM ???? 35.53 2k SAVEBACK.COM Utility for saving backgrounds to disk 35.54 2k SAVEOB.COM Utility for saving objects to disk 35.55 5k SHOWSWAP.ASM FELIX source code 35.56 4k SINCOS.OBJ A SIN-COS table, plus some routines (loaded by FELIX.COM) 35.57 1k SPIN.ASM FELIX source code 35.58 1k TABLE.ASM FELIX source code 35.59 2k TRACE.ASM FELIX source code 35.60 1k TRACE.COM Pseudo-machine interpreter with trace 35.61 2k XTRA.ASM FELIX source code #036 CP/M Users Group Volume 36 (T-3) Description: - Assemblers - Editors - Text Processor Related Programs - Memory Bank Boot and Manager - Misc. Utilities - Drivers for TDL.02 6k ABSTRACT.037 Abstract of disk contents 37.1 3k AREA.BAS (1) Metric conversion in CBASIC 37.2 2k AREA.INT .. 37.3 3k CHAIN.BAS (1) Menu program for arithmetic drills 37.4 2k CHAIN.INT .. 37.5 1k COMMON1.TXT (1) Part of arith. drill progs. 37.6 1k COMPILE.SUB (1) Compiles arith. drill progs 37.7 3k CPUPARTS.BAS (4) Data table for MANPARTS 37.8 41k CRAPS.BAS (2) Very complete program 37.9 1k CRAPS.DOC .. 37.10 19k CRAPS.INT .. 37.11 3k DEC1.BAS (1) Arithmetic drill 37.12 2k DEC1.INT .. 37.13 2k DEC2.BAS (1) Arithmetic drill 37.14 2k DEC2.INT .. 37.15 3k DEC3.BAS (1) Arithmetic drill 37.16 2k DEC3.INT .. 37.17 3k DEC4.BAS (1) Arithmetic drill 37.18 3k DEC4.INT .. 37.19 3k DEC5.BAS (1) Arithmetic drill 37.20 3k DEC5.INT .. 37.21 3k DEC6.BAS (1) Arithmetic drill 37.22 3k DEC6.INT .. 37.23 3k DECIMAL.BAS (1) Arithmetic drill 37.24 2k DECIMAL.INT .. 37.25 2k DISK.PRN (2) More doc on CRAPS 37.26 3k DISTANCE.BAS (1) MeM (1) FAST patch for Discus 2D 38.8 20k FAST.ASM (1) Speed up transients via 38.9 2k FAST.COM (1) Track & dir. buffering. 38.10 3k FASTNSTL.DOC (1) FAST installation DOC 38.11 18k FMAN.PRN (1) FAST operations manual 38.12 18k MACRO.LIB (2) Used by DFOCO 38.13 1k MICROPAT.ASM (1) FAST patch for Micropolis 38.14 15k PACKUP.ASM (1) Part of FAST 38.15 4k REL.ASM (1) Relocation utility source 38.16 2k REL.UTL (1) Relocation utility 38.17 2k RELCPM.DOC (1) DOC on relocation programs 38.18 1k RELCPM.SUB (1) SUBMIT file for relocations 38.19 1k RELED.SUB (1) SUBMIT file for relocations 38.20 2k RELHDR.ASM (1) Handler for REL.UTL 38.21 3k RSPEED.ASM (1) Routine to determine how 38.22 1k RSPEED.COM FAST your disk reads, to set up SPEED, FAST 38.23 1k SKEW2PAT.ASM (1) Skew table patch for FAST 38.24 1k SKEW3PAT.ASM (1) Skew table patch for FAST 38.25 2k SMAN.PRN (1) Speed operations manual addendum to FMAN.PRN 38.26 5k SPEED.COM (1) CCP replacement with  software NUMBER SIZE NAME COMMENTS 36.01 2k -CATALOG.036 Contents of CP/M Users Group Volume 36 36.02 6k ABSTRACT.036 Abstract on some files 36.1 7k COMBINE.ASM Combine multiple .asm files.. 36.2 1k COMBINE.COM ..and delete comments 36.3 4k CPM-PEN.ASM Convert CP/M to electric.. 36.4 1k CPM-PEN.COM ..pencil files 36.5 8k FIND.ASM Find ASCII string in 1 or.. 36.6 1k FIND.COM ..more files 36.7 1k FIND.DOC DOC on above 36.8 11k L82.COM ML80 Component 36.9 1k LINES.COM Count lines in an ASCII file 36.10 1k LINES.DOC DOC of above 36.11 6k LINKASM.COM ASM.COM with feature to link.. 36.12 5k LINKASM.DOC ..files together at assembly 36.13 1k LIST.COM List files with starting.. 36.14 1k LIST.DOC ..line number 36.15 10k M81.COM ML80 Component 36.16 11k MAC6.AZM I/O drivers for TDL.. 36.17 2k MAC6.COM ..macro assembler 36.18 4k MAC6.DOC .. 36.19 8k MBMBOT.ASC Memory bank boot & mgmt 36.20 3k MFACCESS.LIB Subroutine to setup for multiple files (ex: *.tric conversions drill 37.27 3k DISTANCE.INT .. 37.28 5k FORMULA.BAS (1) Drill formulas, volume, etc 37.29 4k FORMULA.INT .. 37.30 3k FRAC1.BAS (1) Arithmetic drill 37.31 2k FRAC1.INT .. 37.32 3k FRAC2.BAS (1) Arithmetic drill 37.33 2k FRAC2.INT .. 37.34 3k FRAC3.BAS (1) Arithmetic drill 37.35 2k FRAC3.INT .. 37.37 3k FRAC4.BAS (1) Arithmetic drill 37.37 2k FRAC4.INT .. 37.38 4k FRACTION.BAS (1) Arithmetic drill 37.39 3k FRACTION.INT .. 37.40 1k GRADE.BAS (1) Arith drill grading program 37.41 1k HEADER.BAS (1) %Include for drill progs. 37.42 4k INTEGER.BAS (1) Arithmetic drill 37.43 3k INTEGER.INT .. 37.44 13k JRNL.BAS (3) Accounting program 37.45 9k JRNL.INT .. 37.46 1k MANPARTS.BAS (4) Manufactured parts program 37.47 3k NEWFRAC2.BAS (1) Arithmetic Drill program 37.48 1k PARTS.BAS (4) Parts list generator 37.49 2k PASSWORD.BAS (5) Change BASIC keywords to protect your programs 37.50 3k PERCENT.BAS (1) Arithmetic d1 full track blocking etc. 38.27 3k UTL.LIB (1) Macro library for reloc. #039 CP/M Users Group Volume 39 (T-6) Description: Music Programs (1) Plays 3 part harmony thru the 8080 Interrupt enable line! (Some .MUS might be incomplete - but lotsa fun here) (2) Plays 4(?) part harmony thru 8 bit DAC, uses BASIC to "compile" the parts. (3) Patches for Software Technology Music, for SOL+CP/M ----> Look out, both (1) and (2) use filetype .MUS, so watch the (1) and (2) to see which a particular .MUS is for. NUMBER SIZE NAME COMMENTS 39.01 4k -CATALOG.039 Contents OF CP/M Users Group Volume 39 39.02 3k ABSTRACT.039 Abstracts on some of the files 39.1 2k 2PRTFJSB.MUS (2) Source music score, BACH 2 part invention 39.2 4k 2PRTFJSB.NOT (2) "Compiled" score 39.3 4k AIR.MUS (1) Source music score 39.4 1k ALLEGRO.MUS (1) Source music score 39.5 1k AMERICA.MUS (1) Source music score 39.6 3k ARIA.MUS (1) Source music score 39.7 2k AWAVE.BAS 50 1k WAVES.MUS (2) Source music score 39.51 3k WHATI.MUS (1) Source music score 39.52 3k WIERD.MUS (1) Source music score 39.53 2k YANKEE.MUS (1) Source music score (good!) LIFE.MUS (1) Source music score 39.35 3k NOTES.BAS (2) Tune constructing program 39.36 2k NOTES.INT (2) INT of above 39.37 1k PIC.MUS (1) Source music score 39.38 3k PRELUDE.MUS (1) Source music score 39.39 1k PUR2MIN.MUS (2) Source music score 39.40 3k PUR2MIN.NOT (2) Compiled score 39.41 3k REMOV".ASM (2) Remove (") from a file 39.42 1k REMOV".COM (2) COM of above 39.43 1k ROLLING.MUS (1) Source music score 39.44 2k SARABAND.MUS (1) Source music score 39.45 2k SMALL.MUS (1) Source music score 39.46 3k SPREAD.MUS (1) Source music (Interesting, obscure, New Orleans jazz) 39.47 2k STARWARS.MUS (1) Source music score 39.48 2k TINSOLD.MUS (1) Source music (a start...) 39.49 2k WALK.MUS (1) Source music (Terriffikk) 39.(2) Wave form generator 39.8 2k AWAVE.INT (2) INT of above 39.9 1k BOOGIE.MUS (1) Source music (diddling) 39.10 2k BOUREE.MUS (1) Source music score 39.11 1k BREEZ.MUS (1) Source music score 39.12 2k CALIOPE.MUS (1) Source music (Super!) 39.13 1k CHOPS.MUS (1) Source music score 39.14 3k CHORALE.MUS (1) Source music score 39.15 1k DAISY.MUS (1) Source music score 39.16 1k ENTER.MUS (1) Source music (Partial) 39.17 1k FIX.SUB (2) To remove (") from music BASIC "compiled" output. 39.18 3k HUSTLE.MUS (1) Source music score 39.19 1k IRISH.MUS (1) Source music score 39.20 2k LAWRENCE.MUS (1) Source music score (Arabia) 39.21 3k LVBMIN.MUS (2) Source music score 39.22 7k LVBMIN.NOT (2) Compiled score 39.23 2k MAPLE.MUS (1) Source music score 39.24 1k MARINE.MUS (1) Source music score 39.25 3k MINWALZ.MUS (1) Source music (L-uuuv it) 39.26 1k MRIVER.MUS (1) Source music score 39.27 5k MUSIC.COM (1) Executable code 39.28 13k MUSIC.DOC (1) Doc incl how to put  hardware on your micro 39.29 14k MUSIC4.ASM (2) The music driver program 39.30 2k MUSIC4.COM (2) COM of above 39.31 2k MUSIC4.DOC (2) Doc on MUSIC4 39.32 3k MUSPAT.DOC (3) DOC on following: 39.33 7k MUSPAT.HEX (3) HEX patch file 39.34 2k MYLIFE.MUS (1) Source music score 39.35 3k NOTES.BAS (2) Tune constructing program 39.36 2k NOTES.INT (2) INT of above 39.37 1k PIC.MUS (1) Source music score 39.38 3k PRELUDE.MUS (1) Source music score 39.39 1k PUR2MIN.MUS (2) Source music score 39.40 3k PUR2MIN.NOT (2) Compiled score 39.41 3k REMOV".ASM (2) Remove (") from a file 39.42 1k REMOV".COM (2) COM of above 39.43 1k ROLLING.MUS (1) Source music score 39.44 2k SARABAND.MUS (1) Source music score 39.45 2k SMALL.MUS (1) Source music score 39.46 3k SPREAD.MUS (1) Source music (Interesting, obscure, New Orleans jazz) 39.47 2k STARWARS.MUS (1) Source music score 39.48 2k TINSOLD.MUS (1) Source music (a start...) 39.49 2k WALK.MUS (1) Source music (Terriffikk) 39.1#040 CP/M Users Group Volume 40 (T-7) Description: - Various Utilities - Disk Cataloging System - Modem Programs NUMBER SIZE NAME COMMENTS 40.01 2k -CATALOG.040 Contents of CP/M Users Group Volume 40 40.02 8k ABSTRACT.040 Abstract on some of the files. 40.1 1k /.COM Quickie submit; Example: 40.2 1k /.DOC / ASM FOO.BBZ;LOAD B:FOO 40.3 1k ALLOC.COM Prints bit map of disk usage 40.4 1k ALLOC.DOC (update of prev 1.3 only one) 40.5 37k BOOTER.ASM Pascal boot for Tarbell & Delta 40.6 1k CAT.COM Part of master cataloging sys. 40.7 1k CAT2.COM Part of master cataloging sys. 40.8 5k CATALOG.DOC Doc on master cataloging system 40.9 1k CK-FIX.COM File checksum program 40.10 1k CK-FIX.DOC .. 40.11 4k COMPARE.ASM See if two files match exactly (Uses MAC and MAC's SEQIO) 40.12 2k COMPARE.COM COM of above 'cause many macros 40.13 8k CV.ASM Split screen VDM 2 file compare 40.14 1k CV.COM (requires MAC for assembly) 40.15 1k CV.DOC .. 40.16 1k D.COM Shows(3) PONG for the VDM (re-release of CP/M U.G. #6.9) 41.16 8k PRACTICE.ASM (1) Morse code teacher 41.17 2k RANDTEX.BAS (1) Generate text for 41.16 41.18 2k RESIZE.DOC (1) Part of ham maillist system 41.19 5k RESIZE2.BAS (1) Part of ham maillist system 41.20 5k RESIZE3.BAS (1) Part of ham maillist system 41.21 26k RTTY.ASM (1) RTTY send/receive program 41.22 12k SSPLIB.FOR (4) Curve fitter/simultaneous linear equation solver 41.23 10k TEACH.ASM (1) Morse Code teaching program 41.24 9k TTY.ASM (1) Baudot-coded ASCII to ASCII 41.25 5k TTYR.ASM (1) Variation of #41.24 41.26 5k TTYR1.ASM (1) Variation of #41.24 41.27 5k TTYX.ASM (1) Xmit ASCII via conversion to Baudot-coded ASCII COMPUTIST NOTE: Diskette T-8 originally contained programs: LIFE8.ASM, LIFE8.COM, and LIFE8.DOC which are now on CPM U.G. Volume #42. #042 CP/M USERS GROUP VOLUME 42 DESCRIPTION: (1) Disassemblers (2) Diablo Driver (3) Clock Routines ... and much more 43.9 7k A/P060.BAS " 43.10 11k A/P070.BAS " 43.11 2k A/P080.BAS " 43.12 11k A/P090.BAS " 43.13 5k A/P110.BAS " 43.14 10k A/P120.BAS " 43.15 2k A/R-INFO.BAS " 43.16 1k A/R-INV.BAS " 43.17 12k A/R010.BAS " 43.18 5k A/R020.BAS " 43.19 4k A/R03A.BAS " 43.20 12k A/R03B.BAS " 43.21 9k A/R040.BAS " 43.22 11k A/R050.BAS " 43.23 2k A/R060.BAS " 43.24 9k A/R070.BAS " 43.25 5k A/R080.BAS " 43.26 2k A/RTAX.BAS " 43.27 1k ABSTRACT.043 Abstracts of A/P-A/R Programs. 43.28 1k BINSEARC.BAS Part of A/P-A/R Package. 43.29 10k CRTFM.BAS " 43.30 2k CURSOR.BAS " 43.31 2k FILEINIT.BAS " 43.32 1k G/L-INFO.BAS " 43.33 2k GENINFO.BAS " 43.34 1k READCUST.BAS " 43.35 1k READINV.BAS " 43.36 1k READVEND.BAS " 43.37 5k SUBS1.BAS " 43.38 1k WRITCUST.BAS " 43.39 2k WRITEINV.BAS " 43.40 1k WRITEVND.BAS " #044 CP/M USERS GROUP VOLUME 44 DESCRIPTION: CBASIC2 PROGRAMS: Osborne/McGraw-Hill General Ledger Programs. From Pat Cunningham: Budget, Ledger Programs and ROBO  what files are different 40.17 1k D.DOC on a disk from some prev time 40.18 14k DI.ASM Directory listing program. (req's MACRO.LIB from disk 38) 40.19 2k DI.COM .. 40.20 26k DU.ASM Disk utility: scan, patch, etc. 40.21 4k DU.COM .. 40.22 1k DU.DOC .. 40.23 1k EJECT.ASM "EJECT n" pages on CPM list dev 40.24 1k FMAP.COM File map (standalone, and part 40.25 1k FMAP.DOC of cataloging system) 40.26 9k HEXDUMP.ASM Binary to Hex (RequiresTDL asm) 40.27 1k MAST.CAT Sample master catalog 40.28 40k MODEM4.ASM Checksummed blocked file xfer 40.29 7k MODEM4.DOC PMMI/Hayes/serial 40.30 3k NSBOOT.ASM Boot for National Semi 8221 40.31 12k NSCBIOS.ASM CBIOS for National Semi 8221 40.32 3k PBOOT.ASM Pascal boot loader for Tarbell 40.33 5k PGEN.ASM Boot mods for 512 long sectors 40.34 17k PMMIBYE3.ASM Dial in remote console prog. 40.35 7k SPASCAL.DOC Sam Singer's PASCAL mods 40.36 2k UCAT.COM Update catalog program 40.37 3k VDMSAVE.ASM Write VDM lines to a file #041  NUMBER SIZE NAME COMMENTS -CATALOG.042 Contents of CP/M Volume 42 ABSTRACT.042 Abstracts on some of the files 42.1 9k BIDI.ASM (2) Bidirectional Diablo driver 42.2 3k CLKROM.ASM (3) Compu-time (R) routines 42.3 1k CT*@.COM SWTPC CT82 initializer 42.4 6k CT82.Z80 TDL Z-80 source for above 42.5 44k DIS.ASM (1) TDL Z-80 Disassembler 42.6 5k DIS.DOC (1) Doc for above 42.7 3k HOW2BS.DOC Put backspace into your BIOS 42.8 2k INIT.TEL ZTEL-CT82 routines 42.9 17k LIFE8.ASM Fast, comprehensive life .. 42.10 3k LIFE8.COM ..program for the VDM 42.11 2k LIFE8.DOC Doc on above 42.12 27k MNEMONIC.ASM Memory test (look up MNEMONIC in your dictionary) 42.13 7k MBIOS.ASM BIOS for TEI CP/M 42.14 4k PTSRCNVT.ASM Proc. Tech. Pkg. 1 of ALS-8 .. 42.15 2k PTSRCNVT.COM ..to CP/M file conversion .. 42.16 2k PTSRCNVT.DOC ..program 42.17 13k QUOTES.PRN Words of wit and wisdom related to computers 42.18 6k RESOURCE.COM (1) Conversational disassembler 42.19 26k RESOURCE.DOC (1Math Game. NUMBER SIZE NAME COMMENTS CATALOG.44 CONTENTS OF CP/M VOL. 44 44.1 3k ABSTRACT.044 Comments on contents of volume. 44.2 2k ACCTFILE.BAS Part of Osborne General Ledger. 44.3 5k ANNTOT1.BAS Part of Cunningham Ledger. 44.4 3k ANNTOT1.INT INT of above file. 44.5 1k BINSERCH.BAS Part of Osborne General Ledger. 44.6 12k BUDGET1.BAS Part of Cunningham Budget. 44.7 2k BUDGET1.DOC DOC of above file. 44.8 6k BUDGET1.INT INT of above file. 44.9 5k BUDGETCH.BAS Part of Cunningham Budget. 44.10 2k BUDGETCH.INT INT of above file. 44.11 1k CBAS.SUB SUBMIT file for compiling the Osborne programs. 44.12 10k CRTFM.BAS CRT File Maintenance Utility for Osborne General Ledger. 44.13 4k CRTFM.INT INT of above file. 44.14 2k CURSOR.BAS Part of Osborne General Ledger. 44.15 2k EXP1980.TOT Data file from Cunningham Budget. 44.16 1k EXPENS80.JAN Data file from Cunningham Budget. 44.17 1k FILEINIT.BAS Utility for Osborne General Ledger. 44.18 1k FILEINIT.INT INT of above f CP/M USERS GROUP VOLUME 41 - (formerly T-8) DESCRIPTION: (1) Ham radio programs (2) Chess program (3) VDM Pong program (4) Fortran least squares curve fitting program NUMBER SIZE NAME COMMENTS -CATALOG.041 Contents of CP/M Volume 41 ABSTRACT.041 Abstracts on some files 41.1 12k BMAINT.BAS (1) Ham maillist maint. BASIC/E 41.2 12k BREPORT.BAS (1) Ham Maillist report 41.3 26k CHESS.COM (2) Cromemco Z-80 Fortran Chess 41.4 2k CHESS.DOC (2) Doc on Chess program 41.5 24k CHESS.FOR (2) Source in FORTRAN 41.6 2k CODE.BAS (1) Simple Morse code receiver 41.7 3k HAMPROGS.DOC (1) Doc on BMAINT, BREPORT, RTTY, etc. 41.8 2k LABELS.BAS (1) Print return labels 41.9 6k MOONLOC.DOC (1) Doc on 41.10-41.13 which 41.10 3k MOONLOC1.BAS are various versions of 41.11 3k MOONLOC2.BAS programs to locate the 41.12 7k MOONLOC3.BAS moon's positon to do 41.13 5k MOONLOC5.BAS moon bounce 41.14 8k MORSE.ASM (1) Morse send/receive program 41.15 7k PONG.ASM ) Doc on above 42.20 5k START.ASM Compucolor 8001 initializer 42.21 1k START.COM COM of above 42.22 2k T.ASM (3) Print time on 42.23 1k T.COM ..your console 42.24 3k TIME.ASM (3) Compu-time (R) routine 42.25 2k TIME.BAS (3) Time display in MBASIC 42.26 5k TIMESET.BAS (3) Time set/read in MBASIC 42.27 25k XT.ASM (3) List to printer with .. 42.28 2k XT.COM ..time/date stamp 42.29 1k XYZZY.COM [[Type it and see]] (If you don't know "Adventure", you won't understand) COMPUTIST NOTE: The following file is not presently on the diskette: 42.29 XYZZY.COM #043 CP/M USERS GROUP VOLUME 43 DESCRIPTION: OSBORNE CBASIC2 ACCOUNTS PAYABLE AND ACCOUNTS RECEIVABLE BUSINESS SOFTWARE PROGRAMS. NUMBER SIZE NAME COMMENTS CATALOG.43 CONTENTS OF CP/M VOL. 43 43.1 1k A/P-INFO.BAS Part of A/P-A/R Package. 43.2 1k A/P000.BAS " 43.3 13k A/P010.BAS " 43.4 4k A/P02A.BAS " 43.5 6k A/P02B.BAS " 43.6 12k A/P030.BAS " 43.7 11k A/P040.BAS " 43.8 6k A/P050.BAS " 2ile. 44.19 2k G/L.DOC Comments on Osborne General Ledger. 44.20 2k G/L-INFO.BAS Part of Osborne General Ledger. 44.21 1k G/L000.BAS " 44.22 2k G/L000.INT " 44.23 6k G/L010.BAS " 44.24 4k G/L010.INT " 44.25 6k G/L020.BAS " 44.26 2k G/L020.INT " 44.27 6k G/L030.BAS " 44.28 5k G/L030.INT " 44.29 9k G/L040.BAS " 44.30 6k G/L040.INT " 44.31 12k G/L050.BAS " 44.32 6k G/L050.INT " 44.33 5k G/L070.BAS " 44.34 4k G/L070.INT " 44.35 8k G/L080.BAS " 44.36 5k G/L080.INT " 44.37 1k GENINFO.BAS " 44.38 7k LEDGER1.BAS Cunningham Ledger. 44.39 2k LEDGER1.DOC DOC of above file. 44.40 3k LEDGER1.INT INT of above file. 44.41 2k POSTFILE.BAS Part of Osborne General Ledger. 44.42 3k ROBO.BAS Cunningham Math Game. 44.43 1k ROBO.DOC DOC of above file. 44.44 2k ROBO.INT INT of above file. 44.45 5k SUBS1.BAS Part of Osborne General Ledger. 44.46 0k TCGWOZ.TXT Collected Great Works of Zoso. #045 CP/M USERS GROUP VOLUME 45 DESCRIPTION: Osborne/McGraw-Hill6.7 1k CRCK3.COM COM of above 46.8 16k DU-8/12.ASM Disk dump/patch, supports many controllers. 46.9 29k DU-V61.ASM Later version of CPMUG 40.20, single density only 46.10 2k DU/MAP.DOC Doc. on CP/M directory format 46.11 6k FDOS-CPM.ASM ICOM FDOS II to CP/M transfer 46.12 10k MDIR8/17.ASM Fancy directory list program, 46.13 1k MDIR8/17.COM CP/M 1.4 (or 2.X, all users) 46.14 6k MLIST3.ASM Type multiple files with lots of disk buffering 46.15 20k PLINK823.ASM Send/Rcv to memory via modem 46.16 22k PMMIBYE5.ASM Remote console program, 46.17 3k PMMIBYE5.DOC update of 40.34 46.18 2k PTSRCNVT.COM Convert Proc. Tech to CP/M ASM 46.19 2k PTSRCNVT.DOC DOC on above 46.20 7k RETDL.COM Disassembler to TDL mnemonics, modification of 42.18 46.21 13k SURVEY3.ASM Maps system memory/port usage as well as disk stat. 46.22 1k SURVEY3.COM COM of above 46.23 20k XD-7/4.ASM Fancy directory list program 46.24 2k XD-7/4.COM COM of above U-G-FORM.LIB CPMUG submission form E.C H19/H89 version of 48.9 48.6 8k HLIFE.COM " " ".10 48.7 13k HSTONE.C "Awari" game program - 48.8 12k HSTONE.COM " " 48.9 9k LIFE.C Good implementation of Conway's 48.10 8k LIFE.COM LIFE algorithm 48.11 5k MM.C Mastermind interesting guessing 48.12 7k MM.COM game. Try it and see 48.13 11k OTHELLO.C Game program 48.14 12k OTHELLO.COM " 48.15 7k PPONG.C "Polish Pong" bounce the 48.16 7k PPONG.COM ball off "/" and "\" 48.17 8k PRESSUP.C Game program 48.18 8k PRESSUP.COM " " 48.19 1k R2.MAP map for rally game 48.20 10k RALLY.C road rally arcade game 48.21 10k RALLY.COM .COM of 48.20, but... ========= ---> Caution!! Hard-coded I/O req'd 48.22 2k RALLY.MAP another map for 48.21 48.23 10k STONE.C "Awari" game with "very smart 48.24 9k STONE.COM computer" opponent 48.25 2k TABIFY.C Turn multiple spaces into 48.26 6k TABIFY.COM proper CP/M tabs 48.27 7k TTT.C Tic-Tac-Toe that "exhaustively" 48.28 6k TTT.COM tests for best  Payroll with Cost Accounting NUMBER SIZE NAME COMMENTS 45.1 1k -CATALOG.045 CONTENTS OF CP/M VOL. 45 45.2 2k ABSTRACT.045 Abstract of CP/M Vol. 45 45.3 1k P/R.SUB SUBMIT file for CBAS2 compilation. 45.4 2k P/R000.BAS Menu Program for P/R. 45.5 5k P/R010.BAS Part of P/R. 45.6 13k P/R020.BAS Part of P/R. 45.7 3k P/R030.BAS Part of P/R. 45.8 2k P/R040.BAS Part of P/R. 45.9 10k P/R050.BAS Part of P/R. 45.10 4k P/R06A.BAS Part of P/R. 45.11 8k P/R06B.BAS Part of P/R. 45.12 4k P/R070.BAS Part of P/R. 45.13 2k P/R080.BAS Part of P/R. 45.14 8k P/R090.BAS Part of P/R. 45.15 9k P/R100.BAS Part of P/R. 45.16 8k P/R110.BAS Part of P/R. 45.17 3k P/R120.BAS Part of P/R. 45.18 4k P/R130.BAS Part of P/R. 45.19 6k P/R140.BAS Part of P/R. 45.20 3k P/R150.BAS Part of P/R. 45.21 2k P/R160.BAS Part of P/R. 45.22 3k P/R170.BAS Part of P/R. 45.23 8k P/R180.BAS Part of P/R. 45.24 4k P/R190.BAS Part of P/R. 45.25 7k P/R200.BAS Part of P/R. 45.26 9k P/R210.BAS Part of P #047 CP/M USERS GROUP VOLUME 47 DESCRIPTION: CP/M Utility Disk. * NUMBER SIZE NAME COMMENTS CATALOG.47 CONTENTS OF CP/M VOL. 47 47.1 7k ABSTRACT.047 Abstracts and reviews. 47.2 10k BMAP7/11.ASM Bit Map program. 47.3 22k COPYFAST.ASM Revision of Tarbell's COPY.ASM. 47.4 2k COPYFAST.COM COM of above. 47.5 18k CYBER.ASM Bob Van Valzah's Modem program with buffering to Diablo Hytype. 47.6 22k DIAL6/23.ASM Modem program with autodial for PMMI. 47.7 2k DIAL6/23.DOC DOC of above. 47.8 8k DIRS9/8.ASM Sorted directory program. 47.9 3k FLIP3.ASM Flips Answer/Originate mode under BYE.COM. 47.10 14k MODEM.LIB Maclib library for MODEM7. 47.11 43k MODEM7.ASM Latest and greatest revision of Ward's "universal" MODEM.ASM. 47.12 8k MODEM7.COM COM of above. 47.13 16k MODEM7.DOC DOC of above. 47.14 3k MODEM7.SET Instructions for patching COM file if you don't have MAC*. 47.15 13k PROM.ASM Promburner program for the SSM PB1. 47.16 7k UCOPY.ASM Bob Van Valzah's version of move 48.29 3k VOLUME48.DOC Leor's own comments (*) The original was 22K, but "TABIFY" deleted 5K of spaces!! #049 CP/M USERS GROUP VOLUME 49 DESCRIPTION: FORTRAN, RATIONAL FORTRAN PROGRAMS. CDOS ROUTINES FOR CP/M. NUMBER SIZE NAME COMMENTS -CATALOG.049 CONTENTS OF CP/M VOL. 49 49.1 4k 4FDCBIOS.DOC Files for running CP/M 2.0+ 49.2 2k 4FDCBIOS.HEX 49.3 13k 4FDCBIOS.Z80 on CDOS systems using this 49.4 1k 4FDCBOOT.HEX 49.5 2k 4FDCBOOT.Z80 BIOS and BOOT. 49.6 11k ABSTRACT.049 Abstracts of the files on this disk. 49.7 1k ASMDEF.RAT Used by LCAT, part of RATFOR. 49.8 6k ASTRO.FOR FORTRAN Astronomy program. 49.9 10k CDOS.DOC Comments on CDOS features. 49.10 2k CDOSCOPY.COM Full disk copy program 49.11 2k CDOSCOPY.DOC for CDOS systems, 49.12 4k CDOSCOPY.HEX single or double 49.13 26k CDOSCOPY.PRN density, and single 49.14 12k CDOSCOPY.Z80 or double sided. 49.15 1k CONSTS.RAT Definitions of some frequently used constants (RATFOR). 49.16 1k F77.D/R. 45.27 6k P/R220.BAS Part of P/R. 45.28 5k P/R230.BAS Part of P/R. 45.29 9k P/R240.BAS Part of P/R. 45.30 3k P/R250.BAS Part of P/R. 45.31 3k P/R260.BAS Part of P/R. 45.32 6k P/R270.BAS Part of P/R. 45.33 15k P/R280.BAS Part of P/R. 45.34 4k P/R290.BAS Part of P/R. 45.35 10k P/R291.BAS Part of P/R. 45.36 11k P/R300.BAS Part of P/R. 45.37 5k P/R310.BAS Part of P/R. 45.38 3k P/R320.BAS Part of P/R. 45.39 7k P/R321.BAS Part of P/R. 45.40 6k P/R330.BAS Part of P/R. 45.41 3k P/R340.BAS Part of P/R. #046 CP/M USERS GROUP VOLUME 46 11/03/80 DESCRIPTION: CP/M utilities. NUMBER SIZE NAME COMMENTS 2k -CATALOG.046 CONTENTS OF CP/M VOL. 46 46.1 11k ABSTRACT.046 Volume abstracts 46.2 11k CPM-FDOS.ASM CPM to ICOM FDOS II transfer 46.3 17k CPMLABEL.BAS Make CPMUG disk labels 46.4 18k <> (Was MBASIC compile of above, deleted due to licensing of output generated by compiler) 46.5 5k CPMLABEL.DOC DOC on above 46.6 8k CRCK3.ASM Full 16 bit CRC a file 4the Tarbell COPY program. * MAC and CP/M are trademarks of Digital Research, Pacific Grove, CA. #048 CP/M USERS GROUP VOLUME 48 National CP/M Users Group (CP/M is a trademark of Digital Research, Inc) DESCRIPTION: The BDS C Sampler Disk November 29, 1980 Compiled by Leor Zolman, BD Software - Manual for BDS-C to give you a "flavor" of the compiler - Good programming examples in C - Interesting games to play - Good use of H19-H89 (Programs with are H19-H89 only) Most files are included in .COM form to allow you to execute them without having BDS-C. Be careful of RALLY.COM as it needs to do hard-coded I/O to detect console OUT status. NUMBER SIZE NAME COMMENTS 3k -CATALOG.048 CONTENTS OF CP/M VOL. 48 6k ABSTRACT.048 Abstracts of the programs 48.1 17k BDS-C.DOC BDS-C users manual (*) 48.2 7k BDSCIO.H The standard library used to compile the programs 48.3 8k BUGS.C makes things crawl 48.4 11k BUGS.COM around on your screen 48.5 9k HLIF2OC FORTRAN 77 Documentation. 49.17 1k F77DEF.RAT FORTRAN 77 Functions. 49.18 2k F77LIB.FOR Definitions of some intrinsic FORTRAN 77 functions. 49.19 3k FILTER.Z80 Source code for emulating CDOS 49.20 1k FILTER.HEX calls under standard CP/M. 49.21 6k FILTER2.Z80 Modified version of FILTER 49.22 1k FILTER2.HEX (above) 49.23 2k INDEX.Z80 RATFOR Subroutine. 49.24 1k INDEXT.FOR Test for INDEX.Z80. 49.25 1k IOER.Z80 Used by LCAT (RATFOR). 49.26 1k LCAT.DOC Used to concatenate Microsoft 49.27 3k LCAT.RAT .REL files. 49.28 2k MINV.DOC Matrix Inversion Determinant 49.29 3k MINV.FOR Calculator, FORTRAN and 49.30 3k MINV.RAT RATFOR source code. 49.31 2k RATCOMNS.RAT Used by RATFOR. 49.32 3k RATFOR.DOC Documentation of RATFOR. 49.33 40k RATFOR.FOR FORTRAN source code for RATFOR. 49.34 25k RATFOR.RAT RATFOR source code for RATFOR. 49.35 17k RATFOR.REL Microsoft .REL file, does not include library routines. 49.36 1k READLB.Z80 Subroutine for SCOPY (RATFOR). 49.37 1k RFG.CMD CDOS equivelent of a submit file. (^=$). 49.38 1k SCOPY.DOC Direct Disk I/O (RATFOR). 49.39 2k SCOPY.FOR FORTRAN source code. 49.40 1k SORTI.DOC Quicksort program (RATFOR). 49.41 2k SORTI.FOR FORTRAN Source code. 49.42 3k SORTI.RAT RATFOR Source code. 49.43 1k TRNSLT.Z80 Used by RATFOR. NOTE: Most of the FORTRAN files on this disk will run on Z-80 processors only, some will run only with Cromemco CDOS. Check the abstracts and .DOC files for more details. ft 49.27 3k LCAT.RAT .REL files. 49.28 2k MINV.DOC Matrix Inversion Determinant 49.29 3k MINV.FOR Calculator, FORTRAN and 49.30 3k MINV.RAT RATFOR source code. 49.31 2k RATCOMNS.RAT Used by RATFOR. 49.32 3k RATFOR.DOC Documentation of RATFOR. 49.33 40k RATFOR.FOR FORTRAN source code for RATFOR. 49.34 25k RATFOR.RAT RATFOR source code for RATFOR. 49.35 17k RATFOR.REL Microsoft .REL file, does not include library routines. 49.36 1k READLB.Z80 Subroutine for SCOPY (RATFOR). 49.37 3#050 CP/M USERS GROUP VOLUME 50 DESCRIPTION: C, PASCAL, AND UTILITY PROGRAMS W/SPEED 2.X 50.01 2k COMPARE.COM file compare utility from previous CP/M UG disk; an absolute must for self compiler writers 50.02 2k CPMDIR.C V7 UNIX C program to print a CP/M directory on stdout 50.03 3k DISK.DOC original doc file 50.04 2k EQ.PAS prints all solutions to the "eight queens problem" 50.05 5k FROMCPM.C V7 UNIX C program to read a CP/M filt to standard output 50.06 1k FWD.PAS Pascal program illustrating forward procedure declarations 50.07 15k HW5.PAS builds an optimal binary search tree and decodes a message 50.08 1k HW5DATA sample data for above 50.09 6k PASYNTAX.DOC syntax graphs for this Pascal compiler 50.10 1k PC.SUB submit file to compile a Pascal program 50.11 7k PFET.COM object code of the p-code to 8080 translator 50.12 11k PFET.PAS source of above 50.13 1k PHONE.C C program to print words you can spell withhandling NUMBER SIZE NAME COMMENTS CATALOG.051 CONTENTS OF CP/M VOL. 51 51.1 2k ABSTRACT.051 Overview of volume 51.2 16k ALX.S2M Assembly Language Extension macros 51.3 3k ALX-.DOC Doc on above 51.4 3k ALXTEST.ALX Sample macros to test above, including ALXTEST.ALX errors to be detected. 51.5 4k CIO.ALX Console I/O routines in ALX 51.6 2k CRCK.COM Keith Petersen's program to CRC check files 51.7 1k CRCKLIST.CRC Contains the CRCs for all files on this disk. (except itself) 51.8 2k DEMO.S2M Interactive STAGE2 demo macros. 51.9 17k DISKIO2.SRC (*) disk I/O for STAGE2 processor 51.10 6k DISKIO2-.DOC (*) DOC on above 51.11 5k FLD1.DAT (*) Sample data for FLUB test 51.12 4k FLD2.DAT (*) " 51.13 13k FLT1.FLB (*) Sample program for FLUB test 51.14 11k FLT2.FLB (*) " 51.15 1k FLUB$.SUB (*) Submit file for FLT1, FLT2, STG2. 51.16 4k FLUB8080.S2M (*) Macros to turn FLUB into 8080 asm 51.17 3k HELP.DOC First-timer's "to do" list. 51.18 2k IMPL.DOC (*) Notes on implemk CPYFST3S.COM Object of above, slow disks. 52.14 1k CRCKLIST.CRC CRC list of programs on this disk. 52.15 2k EXAMPLE.BAT Sample BATCH file. 52.16 23k VARBATCH.1 SIL80 source for VARBATCH. (BATCH with variables). 52.17 10k VARBATCH.3 SIL80 source for VARBATCH. 52.18 3k VARBATCH.COM Object of above. 52.19 1k VARBATCH.CTL Control table of above. 52.20 7k VARBATCH.HEX Hex file of above. 52.21 29k VARBATCH.SYM Symbol table of above. VARBATCH is documented in BATCH.RM (Reference Manual). COPYFAST is documented in the .ASM files. #053 CP/M Users Group Library VOLUME 053 C/O Lifelines 1651 Third Ave. New York, N.Y. 10028 DESCRIPTION: BDS-C Users group "original" Adventure disk. This is the "original" Crowther/Woods adventure, converted into BDS-C by Jay R. Jaeger, and updated for V 1.43 by L.C Calhoun. We thank Robert Ward, and the BDS-C Users group for this entire volume contribution. The group may be contacted via: BDS C Users Group Robert Ward, Coordinator De your phone number 50.14 1k PLAYDATA sample data for PLAYKAL.PAS below 50.15 13k PLAYKAL.PAS Pascal program to determine best moves in game of Kalah 50.16 2k POPS.DOC documentation on the p-codes used by the compiler 50.17 1k POWTWO.PAS Pascal program to print negative powers of two 50.18 16k PPC.COM obj code of Pascal to p-code compiler 50.19 10k PPC.DOC users manual for Pascal compiler 50.20 26k PPC.PAS source of Pascal compiler 50.21 2k PSTACK.DOC documentation on the run time p-machine stack 50.22 3k REGEN.DOC notes on how to modify and compile the compiler 50.23 11k RTP.ASM source for the run time package 50.24 2k RTP.COM object of above 50.25 5k SPEED.COM makes your system go faster by disk buffering 50.26 5k SPEED2.COM above for 2.x systems 50.27 1k STIRLING.PAS Pascal program to print a table of Stirling numbers 50.28 4k TESTER.PAS tests functionality of Pascal compiler 50.29 1k VALIDATE.SUB submit file to make sure you henting STAGE2 51.19 2k INTERACT.S2M Another macro demo. 51.20 22k INTRO.DOC Sufficient info to "read" STAGE2 macros, and with diligence, write them. 51.22 1k IOOP$.SUB (*) submit file for macro pass + asm of above 51.21 16k IOOP.SRC (*) I/O processor 8080 source 51.23 1k MEMORY.INP Another macro demo. 51.24 2k ST2T.DAT (*) 51.25 12k STAGE2.COM The executable macro processor itself. 51.26 48k STG2.FLB (*) Source for STAGE2 in FLUB code 51.27 5k STG2MATH.ASM (*) STAGE2 support routines 51.28 5k STG2SUP.ASM (*) " 51.29 8k TERM.ALX Sample 8080 terminal program w/ALX macros. 51.30 3k TERMSUP.ASM Subroutines for TERM.ALX 51.31 2k USE.DOC How to execute STAGE2. 51.32 6k VDB.ALX TDL video driver in ALX, a "state machine". 51.33 5k VOLUME51.DOC Dick Curtiss' own excellent documentation. (*) Files are necessary only to change STAGE2. NOTE: Included on this volume for the first time, is a file of CRC's for each file. Thus people concerned that a copy when wrong somewhere, cadicated Micro Systems, Inc, 409 E Kansas Yates Center, Kansas, 66783 Membership: $10 NUMBER SIZE NAME COMMENTS -CATALOG.053 CONTENTS OF CP/M VOL. 053 53.1 1k ADVCOMP.SUB These files are 53.2 5k ADVENT.C fully explained 53.3 10k ADVENT.COM in "-CATALOG.053", 53.4 5k ADVENT.CRL and appear here 53.5 6k ADVENT.H merely to get 53.6 18k ADVENT1.DAT "official numbers". 53.7 7k ADVENT2.DAT 53.8 7k ADVENT3.DAT 53.9 4k ADVENT4.DAT 53.10 6k ADVENT5.DAT 53.11 18k ADVENT6.DAT 53.12 1k ADVLINK.SUB 53.13 2k CATALOG.DOC 53.14 7k DATABASE.C 53.15 5k DATABASE.CRL 53.16 1k EADVENT.C 53.17 24k EADVENT.COM 53.18 1k EADVENT.CRL 53.19 3k ENGLISH.C 53.20 2k ENGLISH.CRL 53.21 3k ENVIRON.DOC 53.22 4k ITVERB.C 53.23 3k ITVERB.CRL 53.24 1k MKADVENT.SUB 53.25 1k MKEADVEN.SUB 53.26 1k MKSAVEAD.SUB 53.27 1k READ.ME 53.28 1k SAVEADV.C 53.29 7k SAVEADV.COM 53.30 2k SAVEADV.CRL 53.31 14k TURN.C 53.32 10k TURN.CRL 53.33 13k VERB.C 53.34 8k VERB.CRL CRCK.ave a "fertile" compiler #051 VOLUME 51 National CP/M Users Group DESCRIPTION: STAGE2 MACRO PROCESSOR By: Dick Curtiss 843 NW 54th Seattle, WA 98107 <> STAGE2 is a macro programming language, documented sufficiently on this disk to effectively use it. Examples given include a library of extensions for assembler programming, (ALX) including WHILE, REPEAT, IF, BRANCH (a CASE statement), etc. STAGE2 is a general-purpose text-replacement processor, not limited to programming language applications. Those interested in transporting it to other machines, or in studying its background and implementation will want to purchase: "Software Tools for Non-Numeric Applications" by: Wm. M. Waite from: Prentice Hall, Inc. Rt. 59 at Brook Hill Dr. P.O. Box 505 West Nyack, NY 10994 for: $24.95 + 1.00 tax + 1.85 Postage/n check the CRC of the file, and compare it to the one stored in CRCKLIST.CRC. Thanks to Keith Petersen for this excellent program. #052 CP/M USERS' GROUP LIBRARY: VOLUME 52 DESCRIPTION: 1. COPYFAST Version 3.5 by Chuck Weingart 2. BATCH/VARBATCH by Daniel Ross NUMBER SIZE NAME COMMENTS -CATALOG.052 CONTENTS OF CP/M VOL. 52. ABSTRACT.052 Abstracts of files on this disk. CRCK.COM CRC program (see abstracts). 52.1 12k BATCH.1 SIL80 source for BATCH. 52.2 10k BATCH.3 SIL80 source for BATCH. 52.3 2k BATCH.COM Object file of above. 52.4 1k BATCH.CTL Control table for batch. 52.5 5k BATCH.HEX Hex file of above code. 52.6 35k BATCH.RM Batch Reference Manual (.DOC). 52.7 21k BATCH.SYM Batch Symbol Table. 52.8 2k CPYFST35.ABS Chuck's comments on Copyfast. 52.9 26k CPYFST35.ASM Source code for COPYFAST. 52.10 28k CPYFST35.DOC Documentation for COPYFAST. 52.11 2k CPYFST3F.COM Object of above, fast disks. 52.12 2k CPYFST3M.COM Object of above, medium disks. 52.13 23COM Program to check CRC of each file. CRCKLIST.CRC List of CRC's for all files. If you suspect your copy of this disk is bad, run CRCK *.* and compare the CRC's against the ones in CRCLIST.CRC. If you want to create a new file, use CRCK *.* F but be aware it will overwrite CRCKLIST.CRC which should probably have been renamed to something else. #054 CP/M Users Group Volume 54 Description: - Games in Xitan Disk Basic - CAI Programs in Xitan Disk Basic Many programs contributed by Wm. P. Ruf of Kansas; reviewed by Jim Kennedy of CACHE, who corrected and/or commented on the programs. Some will run under MBASIC, while others will require some or extensive modification. VOLUME SIZE TITLE COMMENTS -CATALOG.054 Contents of CP/M Users Group Volume 54 ABSTRACT.054 Abstracts of programs CRCK.COM CRC filecheck program CRCKLIST.054 List of CRC's of files 54.1 3k 1CHECK.BAS Solitaire checker puzzle 54.2 2k ALFABET2.BAS Interactive alphabetizing, expanded 54.3 1r lander, graphs your descent 54.42 ?k SNOOPY.BAS SNOOPY picture with your name under it 54.43 ?k SPORTS.BAS CAI w/multiple choice sports questions 54.44 ?k STARS.BAS Number Guessing Game by Bob Albrecht 54.45 ?k STOCK.BAS Stock Market simulation program 54.46 ?k TAKEAWAY.BAS Multi-player game 54.47 ?k TDRILL.BAS Typing drill using data lists 54.48 ?k TENNIS.BAS CAI drill on tennis (ala SPORTS.BAS) 54.49 ?k TEXT.BAS Information pgrm about these programs 54.50 ?k TICTAC.BAS Expanded TTT game on a 9 X 9 grid 54.51 ?k TRAP.BAS Guess the mystery number game 54.52 ?k TTTOE.BAS Standard Tic tac toe game 54.53 ?k TVPLOT.BAS Produces various funny TV plots 54.54 ?k TYPING.BAS Typing drill with a random generator 54.55 ?k WEKDAY.BAS ?? 54.56 ?k WISHES.BAS Wish poem writing program for children #055 CP/M Users Group Volume 55 (SIG/M Users Group Volume 1) Description: - Original ADVENTURE Run time implemented for CP/M NUMBER SIZE NAME COMMENTS 55.01 1k -CATALOG.055 C4k CHANGE.ASM ALS-8 to CP/M converter (Dr. Dobbs) 58.7 8k CRCK3.ASM CRC check on a file 58.8 5k DIRFIX.ASM Rids attribute bits for 1.4 compatibility 58.9 9k DIRSIO/1.ASM Sorted DIR with SYS and MP/M options 58.10 1k DOWHILES.LIB Used by 58.1 58.11 16k DU-8/12.ASM Update of CPM USER GROUP 40.20 58.12 8k DUPUSR2.ASM Create duplicate directory entries w/new user # 58.13 4k EQUATES.LIB Used by 58.1 58.14 2k FILPRINT.ASM Turn .TXT into .COM 58.15 27k FINDBD37.ASM Update of INTERFACE prgm to lock out bad blocks 58.16 9k FMAP6/12.ASM Update of CP/M User Group 40.24 58.17 16k MACROS.LIB Used by 58.1 58.18 2k NCOMPARE.LIB Used by 58.1 58.19 1k PG0EQU.ASM Part of 58.9 DIRSIO/1.ASM 58.20 2k SELECTS.LIB Used by 58.1 58.21 1k SURVEY.COM List disk, memory use, and other parts 58.22 13k SURVEY3.ASM List disk, memory use, and other parts 58.23 1k SYMSTACK.LIB Used by 58.1 58.24 1k WHENS.LIB Used by 58.1 58.25 8k XDIR6/28.ASM Sorted directory with sizes #059 CP/M Users Group Volume 59 k ALFABET1.BAS Original bugged version of 52.2 54.4 2k ARITH.BAS Add & subtract for elememtary students 54.5 4k BIOCAL.BAS Biorythmic calendar (Bugs) 54.6 8k BLKJAC.BAS Blackjack (21) game 54.7 3k BOMBER.BAS WW2 Bomber game 54.8 2k BOUNCE.BAS Plots a bouncing ball 54.9 7k BUG.BAS 'Draw Bugs faster than your computer' 54.10 2k BULCOW.BAS Buggy program, number guessing game 54.11 7k BUNNY.BAS Draws a 'bunny' on your CRT 54.12 3k BUZZWD.BAS Selects a list of 'buzzwords' 54.13 4k CHASE.BAS High Voltage survival game 54.14 6k CHASE2.BAS Construct & maneuver in a maze 54.15 3k CHOMP.BAS Eat pieces of a cookie, last piece loses (NIM?) 54.16 3k CRAPS.BAS Standard Nevada table rules 54.17 5k CUBE.BAS Get through the cube and win a bet 54.18 3k DEFUSE.BAS Find and defuse the bomb before... 54.19 1k DIAMND.BAS Fills screen with diamond shapes that spell DEC 54.20 3k DRAW.BAS Buggy program -- see abstract 54.21 2k DRINKS.BAS 'How to mix drinks', see abstract 54.22 3k Fontents of CP/M Users Group Volume 55 55.02 2k ABSTRACT.055 Notes on ADVENTURE 55.03 2k UGFORM.LIB Submittal form 55.04 2k SIG/M.LIB Submittal form 55.1 39k AD.COM 55.2 63k ADVENTUR.MSG 55.3 2k ATAB.DAT 55.4 4k COMMON.DAT 55.5 1k KTAB.DAT 55.6 1k LTEXT.DAT 55.7 1k RTEXT.DAT 55.8 1k STEXT.DAT 55.9 5k TRAVEL.DAT #056 CP/M Users Group Volume 56 (SIG/M Users Group Volume 2) Description: - Original ADVENTURE Source Code implemented for CP/M NUMBER SIZE NAME COMMENTS 56.01 1k -CATALOG.056 Contents of CP/M Users Group Volume 56 56.02 3k ABSTRACT.056 Implementation notes 56.03 2k UGFORM.LIB Submittal form 56.04 2k SIG/M.LIB Submittal form 56.1 28k ADINIT.COM 56.2 13k ADVENSUB.FOR 56.3 5k ADVENT.FOR 56.4 74k ADVENTUR.DAT 56.5 29k ADVINIT3.FOR 56.6 47k ADVMAIN.FOR 56.7 5k INSUB.FOR 56.8 5k MAINSB.FOR #057 CP/M Users Group Volume 57 (SIG/M Users Group volume 11) (supercedes SIG/M volume 3) Description: Expanded ADVENTURE 8080/Z80 version s(SIG/M volume 5) Description: - 8080/8085 Test Diagnostics - Memory Diagnostics - iCOM Controller Diagnostics NUMBER SIZE NAME COMMENTS 59.01 1k -CATALOG.059 Contents of CP/M Users Group Volume 59 59.02 4k UGFORM.LIB Submittal form 59.03 2k SIG/M.LIB Submittal form 59.1 14k CPUDIAG.ASM CPU Test Diagnostics for 8080 and 8085 59.2 2k CPUDIAG.DOC CPU Test Diagnostics for 8080 and 8085 59.3 12k MEMDIAG.DOC Memory Diagnostics 59.4 34k MEMDIAG.ASM Memory Diagnostics 59.5 73k 3712DIAG.ASM iCOM Single Density Controller Diagnostic 59.6 93k 3812DIAG.ASM iCOM Double Density Controller diagnostic 59.7 2k 3X12DIAG.DOC iCOM Disk Controller Diagnostics 59.8 4k CP/M-NET.MSG Proposed Networking of User Groups sk, memory use, and other parts 58.22 13k SURVEY3.ASM List disk, memory use, and other parts 58.23 1k SYMSTACK.LIB Used by 58.1 58.24 1k WHENS.LIB Used by 58.1 58.25 8k XDIR6/28.ASM Sorted directory with sizes #059 CP/M Users Group Volume 59 ISHING.BAS Catch fish in a lake, avoid hazards, a mini-adventure game 54.23 9k FOOTBL.BAS Standard rules, except no penalties 54.24 2k FRACT.BAS Fraction mathematics 54.25 1k GRAFIT.BAS Some kind of student plotting program 54.26 2k GUNNER.BAS Fire a field artillery weapon, bugs 54.27 6k HOCKEY.BAS For hockey fans 54.28 4k HORSES.BAS Place your bets on the horse races 54.29 ?k INTEREST.BAS Simple and compound interest calculator 54.30 ?k KING.BAS Your chance to be the boss! 54.31 ?k LITQZ.BAS CAI Childrens Literature Quiz 54.32 ?k MATH.BAS Math test or quiz? 54.33 ?k MUGWMP.BAS Find 4 mugwmps hiding in a 10 x 10 grid 54.34 ?k PICTUR.BAS ?? 54.35 ?k POET.BAS Produces verse from random phrases 54.36 ?k POKER.BAS Play poker with the computer 54.37 ?k PRIME.BAS Prints prime numbers from 1 to 10,000 54.38 ?k QUBIC.BAS 3D Tic tac toe on a 4X4 cube 54.39 ?k REVRSE.BAS Reverse a number list?? 54.40 ?k ROCKET.BAS A lunar lander with a bad fuel gauge 54.41 ?k ROCKT1.BAS Lunaupercedes SIG/M volume 3. This version will sense the type of processor (Z80 or 8080) and take advantage of Z80 instruction set if available. NUMBER SIZE NAME COMMENTS 57.01 1k -CATALOG.057 Contents of CP/M Users Group volume 57 57.02 1k ABSTRACT.011 Notes on expanded ADVENTURE 57.03 2k UGFORM.LIB Submittal form 57.04 2k SIG/M.LIB Submittal form 57.1 36k ADV.COM 57.2 105k ADVT.DAT 57.3 31k ADVI.DAT 57.4 4k ADVI.PTR 57.5 15k ADVT.PTR #058 CP/M Users Group Volume 58 (SIG/M Volume 4) Description: - Miscellaneous CP/M Utilities NUMBER SIZE NAME CONTENTS 58.01 2k -CATALOG.058 Contents of CP/M Users Group volume 58 58.02 2k UGFORM.LIB Submittal form 58.03 2k SIG/M.LIB Submittal form 58.1 60k 3740UTIL.ASM Copy CP/M to and from 3740 format 58.2 8k 3740UTIL.DOC Copy CP/M to and from 3740 format 58.3 2k BDOS-PAT.ASM Make USER 0 (CP/M 2.X) public 58.4 7k BMAP7/11.ASM Print allocation map 58.5 1k CCPPATCH.ASM Make drive A: default for .COM files 58.6 4#060 CP/M Users Group Volume 60 (SIG/M volume 6) Description: - 6502 Simulator (refer to Dr. Dobbs 8/80) - 6502 Zapple Monitor NUMBER SIZE NAME CONTENTS 60.01 1k -CATALOG.060 Contents of CP/M Users Group Volume 60 60.02 2k ABSTRACT.060 Description of each module in the 6502 Simulator 60.1 11k ZILASM.COM 6502 Simulator 60.2 5k ZX65.COM 60.3 98k ZX65R.PRN 60.4 39k ZX65R.ZSM 60.5 15k ZXART.DOC 60.6 9k ZXHINTS.DOC 60.7 23k ZXLDR.PRN 60.8 7k ZXLDR.ZSM 60.9 1k ZXTAB1.DOC 60.10 1k ZXTAB2.DOC 60.11 1k ZXTAB3.DOC 60.12 1k ZXTAB4.DOC 60.13 2k CONCOD.LIB Control codes for 6502 Zapple 60.14 1k ZAPMON.MOS Zapple Monitor for 6502 60.15 5k ZAPMON.HEX 60.16 11k ZAP3.INS 60.17 3k ZAP5.INS 60.18 3k ZAP1.INS #061 CP/M Users Group Volume 61 (SIG/M volume 7) Description: - Bulletin Board Related Software - File Transfer Utilities - CP/M Utilities NUMBER SIZE TITLE COMMENTS 61.01 2k -CATALOG.061 Contents of CP/M Users Group volume 61 61.02 42.13 2k READ.ME PASCAL startup documentation Communications related programs 62.14 5k CHAT13.ASM 2-way communications with remote caller 62.15 24k DCHBYE57.ASM Upgrade of remote console DCHBYE55 on volume 61.1 62.16 46k MODEM5A.ASM Auto-dial and auto re-dial capability on DC Hayes and PMMI modem boards 62.17 21k PLNK10162.ASM Upgrade of PLNK925 on volume 61.6 and CPMUG 19.4 with more modem types 62.18 4k NEWBAUD.ASM Switch BAUD rate on a remote PMMI to readjust modem speed 62.19 20k RBBS22.ASC Update of RBBS in CPMUG 61.10 62.20 6k RBBS22.DOC 62.21 9k RBSUTL22.ASC 62.22 8k MBOOT3.ASM Compacted version of MODEM for RECV only usage 62.23 24k XMODEM38.ASM Update of CPMUG 61.8 - remote CP/M to CP/M transfer #063 CP/M Users Group Volume 63 (SIG/M volume 9) Description: - Utilities CAT # SIZE TITLE REMARKS 63.001 2k -CATALOG.063 Contents of CP/M Users Group volume 63 63.002 4k -CUGFORM.LIB Submittal form 63.003 2k -SIGFORM.LINB.BAS 64.04 3k BLACKBOX.BAS 64.05 1k BOGGLE.BAS Games adapted for Heath terminal 64.06 11k GAMMON.H19 64.07 8k NIM1.H19 64.08 5k OTHELLO.H19 64.09 12k STARWAR2.H19 64.10 17k ALS8CPM.ASM Converts Processor Tech assembler files to CP/M format 64.11 1k DIV16B.ASM 16 bit division by 8 bit divisor 64.12 5k DSIM.LIB CDOS calls for CP/M 64.13 22k NSCPM48.ASM Patches to run North Star Basic under CP/M 64.14 8k NSCPM48.DOC 64.15 1k RETURN48.COM 64.16 33k REZ.ASM RESOURCE resurrected with .ASM 64.17 7k REZ.COM A nifty 8080 disassembler 64.18 26k REZ.DOC Modified for Z80 TDL op codes 64.19 36k REZ.Z80 Modified for Zilog op codes #065 CP/M Users Group Volume 65 (SIG/M volume 13) Description: - MITS to CP/M file conversion system - Help file system - Related system support programs - FIG-FORTH 1.1 system CAT # SIZE TITLE REMARKS 65.01 2k -CATALOG.065 Contents of CP/M Users Group volume 65 65.02 4k -CUGFORM.LIB Submittal form 65.03 k -CUGFORM.LIB Submittal form 61.03 2k -SIG/M.LIB Submittal form Bulletin Board Related Software 61.1 23k DCHBYE55.ASM Remote console for DC Hayes modem 61.2 3k FLIP-8/8.ASM Switch remote console to originate mode 61.3 5k TAG.ASM Set F1 bit 61.4 9k MLIST34.ASM Type command w/16k buffer 61.5 45k MODEM926.ASM Update of CP/M Users Group 40.28 61.6 21k PLINK925.ASM Update of CP/M User Group 19.4 61.7 2k USER-8/8.ASM Replaces CP/M USER cmd on remote CPU 61.8 20k XMODEM32.ASM DC Hayes support 61.9 4k PURGE.ASC Requires MBasic 61.10 20k RIBBS.ASC Requires MBasic File Transfer Utilities 61.11 7k MIC-XFER.ASM Data transfer between Micropolis CP/M 1.4 and 8" systems 61.12 7k MIC-XFER.DOC Data transfer documentation 61.13 3k XFER5-8.ASM Transfer files between 5" and 8" 61.14 3k XFER8-5.ASM Transfer files between 5" and 8" 61.15 5k V2FORMAT.ASM Versafloppy system CP/M Utilities 61.16 9k MENU.ASM Creates menu of all .COM and .BAS files 61.17 5k MEM-MAP.ASM Use to mapB Submittal form 63.01 2k AUTOX.ASM Forces a CP/M command from a user level 63.02 10k CPYFIL15.ASM Copy large files greater than 512K through PIP utility 63.03 11k CRCK10/6.ASM Upgrade of CRCK3 in CPMUG 58.7 63.04 9k DIRS1015.ASM Sorted directory from DIRS10/1 in CPMUG 58.9 63.05 3k DISPLAY.COM Similar to Digital Research/ED.COM using display commands only 63.06 3k DISPLAY.DOC 63.07 3k DISPLAYP.ASM 63.08 18k DU-10/26.ASM Update of disk utility in CPMUG 58.9 63.09 10k FIND3/18.ASM Multiple file search routine 63.10 29k FINDBD38.ASM Update to FINDBD37 for locating bad blocks of disk space in CPMUG 58.14 63.11 1k LISTGRPS.ASC List track and sector assignment for each group 63.12 10k MDIR8/17.ASM Master directory by users in alphabetic sequence 63.13 17k MFT45.ASM Dr. Dobbs single drive multi-file transfer program 63.14 7k MIC-XFER.ASM Micropolis and regular CP/M file transfer 63.15 5k MIC-XFER.DOC 63.16 9k NFMAP.ASM Sorted direc 2k -SIGFORM.LIB Submittal form 65.1 28k MITSCNVT.ASM MITS to CP/M file conversion 65.2 7k MITSCNVT.COM / 65.3 3k MITSCNVT.CPM / 65.4 7k MITSCNVT.DOC / 65.5 8k MITSCNVT.HEX / 65.6 2k ABORTSUB.COM HELP file system 65.7 13k HELP.ASM / 65.8 37k SYSLIB.HLP / 65.9 9k SYSLIB.REL / 65.10 2k HELP.COM / 65.11 1k MASM.SUB / 65.12 2k PHELP.COM / 65.13 6k PHELP.MAC / 65.14 4k HELP.DOC / 65.15 18k SD-2/6.ASM Updated SUPER DIRECTORY display 65.16 2k SD.COM / 65.17 6k ENTAB.ASM Space suppression program 65.18 1k ENTAB.COM / 65.19 2k UTIL.FOR FORTRAN array handling subroutine 65.20 2k LOOPBAK1.BAS PMMI loop back test 65.21 40k FORTH11.ASM FIG-FORTH version 1.1 65.22 23k FORTH11.COM / 65.23 4k FORTH11.DOC / #066 CP/M Users Group Volume 66 (SIG/M volume 14) Description: - HELP file system on major system level software CAT # SIZE TITLE REMARKS 66.01 2k -CATALOG.066 Contents of CP/M Users Group Volume 66 66.02 4k -CU RAM/ROM 61.18 8k MOVE6/12.ASM Single drive copy program 61.19 8k RELDUMP.ASM Dump Microsoft .REL files 61.20 1k SAP-FIX.DOC Patches for CP/M User Group vol. 19.8 61.21 5k TEXCLEAN.ASM Clear bit 7 of a text file 61.22 2k TPA3.ASM Computes size of tpa 61.23 3k Z80EXT.LIB Extra Z80 opcodes #062 CP/M Users Group Volume 62 (SIG/M volume 8) Description: - PASCAL related programs - Communications related programs CAT # SIZE TITLE REMARKS 62.001 2k -CATALOG.062 Contents of CP/M Users Group volume 62 PASCAL related programs 62.01 1k BOOT.ASM Sample BOOT for PASCAL 62.02 3k BOOTER.DOC PASCAL documentation for CP/M 62.03 7k TEST.ASM Scan and load 8080/Z80 Pascal interpreter 62.04 8k PAS2CPM.ASM Format conversion 62.05 7k PASCAL.ASM Initialization of PASCAL system 62.06 17k PASCAL.COM 62.07 1k PASCAL.DOC 62.08 12k PASTOCPM Format conversion 62.09 1k PBOOT.ASM Utilities to initialize PASCAL system 62.10 4k PGEN.ASM 62.11 1k PGEN.COM 62.12 6k PINIT.ASM 6tory with option of writing file of names 63.17 14k NLIST.ASM Lists disk file on LST: device 63.18 17k SD-12/15.ASM Sorted directory with sizes 63.19 10k SECTOR.ASM Sector disk maintenance program 63.20 2k SHOWGRP.ASC Print track and sector addresses of groups 63.21 2k TERMTEST.ASM Terminal diagnostic program 63.22 3k USERLST.ASM Patch for displaying current user level within CP/M prompt 63.23 8k VLIST11.ASM Variable speed TYPE routine 63.24 4k WHICH.ASM Displays present CP/M release level 63.25 8k MIKEBIOS.ASM Flash Writer I/O driver #064 CP/M Users Group Volume 64 (SIG/M volume 10) Description: - Games - Disassembler - North Star Basic patch for CP/M - CDOS Simulator - Other Utilities CAT # SIZE TITLE REMARKS 64.001 1k -CATALOG.064 Contents of CP/M Users Group volume 64 64.002 4k -CUGFORM.LIB Submittal form 64.003 2k -SIGFORM.LIB Submittal form Games using MicroSoft Basic 64.01 6k LANES.BAS 64.02 17k JOURNAL.BAS 64.03 2k GAMMO4GFORM.LIB Submittal form 66.03 2k -SIGFORM.LIB Submittal form 66.1 2k HELP.COM HELP file system describing 66.2 7k HELP.HLP HELP file system 66.3 31k CPM.HLP CP/M 1.4 66.4 37k CPM2.HLP CP/M 2.2 66.5 4k ASM.HLP CP/M 1.4 ASM (assembler) 66.6 4k ASM2.HLP CP/M 2.2 ASM (assembler) 66.7 8k MAC.HLP CP/M MAC (macro assembler) 66.8 21k MBASIC.HLP Microsoft BASIC 66.9 14k CBASIC.HLP CBasic 66.10 12k EBASIC.HLP Basic-E 66.11 22k CBASIC2.HLP CBasic-2 66.12 8k MASM.HLP MACRO-80 (M80) 66.13 13k ALGOLM.HLP ALGOL-M 66.14 17k C.HLP BDS 'C' 66.15 7k FORTRAN.HLP Microsoft Fortran 66.16 10k PASCAL.HLP PASCAL/MT #067 CP/M Users Group Volume 67 (SIG/M volume 15) Description: - Documentation Catalog of CP/M UG Volumes 1-42 - Documentation Catalog of SIG/M Volumes 1-3 (as published by the NYACC) Thi volum contain th variou *.DOC ABSTRACT.* READ.ME et file a containe i th CP/ U an SIG/͠ volumes Thi wa compileDisk utility system 68.5 5k DU-V75.DOC / 68.6 40k DU-V75.ASM / 68.7 33k FINDBD42.ASM Creates file of badspots 68.8 36k APLMODEM.ASM CP/M file transfer for Apple 2 using DC Hayes Micromodem 2 68.9 7k COMAND.LIB Console string processor 68.10 7k COMBINE.ASM Merges multiple files 68.11 8k FILE-XT2.ASM System disk utility display 68.12 28k MNEMON21.ASM Multi-pass CP/M memory tester #069 CP/M Users Group Volume 69 (SIG/M volume 17) Description: - Miscellaneous CP/M Utilities CAT # SIZE TITLE REMARKS 69.01 2k -CATALOG.017 Contents of CP/M Users Group Volume 69 69.02 1k -CATALOG.ACK Acknowledgement file 69.03 4k -CUGFORM.LIB Submittal form 69.04 2k -SIGFORM.LIB Submittal form 69.1 2k SCRAMBLE.DOC Command used to encode a CP/M file 69.2 6k SCRAMBLE.ASM / 69.3 2k SORTV.DOC Sort program for variable length records 69.4 13k SORTV-12.ASM / 69.5 6k TAG2.ASM Set/reset display the "no copy" flag 69.6 3k MNEXEC.COM MicroNet executive 69.7 4k MNOVRLAY.ASM Overla an publishe b th NYAC t facilitat read referenc o publi domai softwar fo th micro-hobbiests SIG/ 15 i th correspondin cros referenc t thi release. CATALOG.nnn refers to a CP/M UG release volume nnn SIGMLOG.nnn refers to a SIG/M release volume nnn CAT # SIZE TITLE REMARKS 67.01 2k -CATALOG.067 Contents of CP/M Users Group Volume 67 67.02 4k -CUGFORM.LIB Submittal form 67.03 2k -SIGFORM.LIB Submittal form 67.01 6k CATALOG.001 Catalogs and abstracts of CP/M volumes 67.02 1k CATALOG.002 67.3 13k CATALOG.003 67.4 4k CATALOG.004 67.5 3k CATALOG.005 67.6 2k CATALOG.006 67.7 2k CATALOG.007 67.8 4k CATALOG.008 67.9 2k CATALOG.009 67.10 1k CATALOG.010 67.11 2k CATALOG.011 67.12 1k CATALOG.012 67.13 12k CATALOG.013 67.14 3k CATALOG.014 67.15 2k CATALOG.015 67.16 8k CATALOG.016 67.17 4k CATALOG.017 67.18 2k CATALOG.018 67.19 7k CATALOG.019 67.20 1k CATALOG.020 67.21 16k CATALOG.021 67.22 5k CATALOG.022 67.23 5k CAy for MicroNet executive 69.8 4k WHICH/1.ASM Returns size and version of CP/M 69.9 8k STATUS.ASM Present various systems information under 2.2 69.10 5k NEWQCAT.ASM Quick catalog routine 69.11 7k WORM8/8.ASM Memory test 69.12 21k TFX12/18.ASM CP/M to CP/M file transfer utility 69.13 29k XMODEM41.ASM Remote CP/M to CP/M file transfer 69.14 3k MOVPATCH.ASM Modifies MOVCPM for remote access 69.15 48k 21BIOS.ASM New BIOS for CP/M 2.0 69.16 3k 21BIOS.DOC / 69.17 4k 21BOOT.ASM / 69.18 18k MACRO.LIB / 69.19 9k NPGEN.ASM / 69.20 4k SPCLMAC.LIB / 69.21 13k XDIR.ASM Updated CP/M directory display 69.22 2k XDIR.COM /  encode a CP/M file 69.2 6k SCRAMBLE.ASM / 69.3 2k SORTV.DOC Sort program for variable length records 69.4 13k SORTV-12.ASM / 69.5 6k TAG2.ASM Set/reset display the "no copy" flag 69.6 3k MNEXEC.COM MicroNet executive 69.7 4k MNOVRLAY.ASM OverlaTALOG.023 67.24 5k CATALOG.024 67.25 10k CATALOG.025 67.26 18k CATALOG.026 67.27 2k CATALOG.027 67.28 3k CATALOG.028 67.29 3k CATALOG.029 67.30 1k CATALOG.030 67.31 2k CATALOG.031 67.32 1k CATALOG.032 67.33 2k CATALOG.033 67.34 4k CATALOG.034 67.35 5k CATALOG.035 67.36 8k CATALOG.036 67.37 6k CATALOG.037 67.38 7k CATALOG.038 67.39 6k CATALOG.039 67.40 11k CATALOG.040 67.41 9k CATALOG.041 67.42 8k CATALOG.042 67.43 2k SIGMLOG.001 Catalogs and abstracts on SIG/M Volumes 67.44 4k SIGMLOG.002 67.45 1k SIGMLOG.003 #068 CP/M Users Group Volume 68 (SIG/M volume 16) Description: - Modem Utilities - Multiple file list Utility - Disk Utilities CAT # SIZE TITLE REMARKS 68.01 2k -CATALOG.068 Contents of CP/M Users Group Volume 68 68.02 4k -CUGFORM.LIB Submittal form 68.03 2k -SIGFORM.LIB Submittal form 68.1 39k BYE67.ASM Remote console program for PMMI 68.2 12k BYE67.DOC / 68.3 12k MLIST42.ASM Multiple file list utility 68.4 6k DU-V75.OBJ 5#070 CP/M Users Group Volume 70 (SIG/M volume 18) Description: - ICOM Floppy Utilities - Master Catalog System for CP/M 2.X - Real Time Clock patches to ASM/MAC/STAT - Other CP/M Utilities CAT # SIZE TITLE REMARKS 70.01 2k -CATALOG.070 Contents of CP/M Users Group Volume 70 70.02 1k -CATALOG.ACK Volume 70 Acknowledgement file 70.03 4k -CUGFORM.LIB Submittal form 70.04 2k -SIGFORM.LIB Submittal form 70.1 18k 2411DUMP.ASM ICOM microfloppy utility 70.2 3k 2411DUMP.COM / 70.3 17k MFMACRO.LIB / 70.4 21k 3812DUMP.ASM ICOM floppy utility 70.5 4k 3812DUMP.COM / 70.6 18k DDMACRO.LIB / 70.7 14k AREACODE.ASM Region and state area code search 70.8 7k AREACODE.COM / 70.9 9k BANZAI.ASM Copyright notice protect 70.10 6k CAT2.ASM Master catalog system for CP/M 2.X 70.11 7k FMAP3.ASM / 70.12 8k UCAT2.ASM / 70.13 6k CHAT15.ASM Chat with local remote CP/M operator 70.14 1k CHAT15.COM / 70.15 3k DISPLAYP.ASM Display facilities of ED.COM 70.16 2k DISPLAY.COM / 70.17  LONG.COM / 71.27 8k MAKEREL.DOC Convert REL. files from function blks 71.28 7k LIOS.ASM Novice utility 71.29 1k CONVERT.PAS Convert gas in liters 71.30 6k CONVERT.COM / 71.31 11k COMPARE.!!! Compare source code files from UCSD 71.32 23k DUMP.ASM Expanded CP/M DUMP program 71.33 2k LSTR.PAS Generates a line of various length #072 CP/M Users Group Volume 72 (SIG/M volume 20) (Pascal Z volume 2) Description: - PCE System Monitor (original materials from Pascal Z User Group volume 2) CAT # SIZE TITLE COMMENTS 72.01 2k -CATALOG.072 Contents of CP/M Users Group volume 72 72.02 2k ABSTRACT.072 Comments on PCE System Monitor 72.03 1k -CRCFILE.072 CRC of Volume 72 72.04 4k -CUGFORM.LIB Submittal form 72.05 2k -SIGFORM.LIB Submittal form 72.1 103k SYSMON.DOC Complete Manual of System Monitor 72.2 2k SYSMONA.Z80 Central subsystem module. 72.3 11k ASPM1.Z80 Command subsystem, module one 72.4 12k ASPM2.Z80 Command subsystem, module two 72.5 3ing desired file 73.26 12k STRLIB.LIB Pascal Z library 73.27 12k WUMPUS.PAS Wumpus game in Pascal Z 73.28 15k WUMPUS.COM / 73.29 4k WUMPUS.DOC / 73.30 1k CAVE0 / 73.31 1k CAVE1 / 73.32 1k CAVE2 / 73.33 1k CAVE4 / 73.34 1k CAVE5 / 73.35 6k ENTRY.PAS Creating SRC files 73.36 9k ENTRY.COM / 73.37 6k ENTRY.DOC / 73.38 2k PEEK.PAS Peek and poke in Pascal Z 73.39 1k POWERI.PAS Demo program on powers of numbers 73.40 7k POWERI.COM / 73.41 2k POWERI.REL / 73.42 7k RDR.PAS An alpha-numeric numbers conversion program 73.43 29k DU.Z80 Updated disk utility using Z80 code 73.44 4k DU.COM / 73.45 1k DU.DOC / #074 CP/M Users Group Volume 74 (SIG/M volume 22) (Pascal Z volume 4) Description: - Miscellaneous Pascal Z Utilities CAT # SIZE TITLE COMMENTS 74.01 2k -CATALOG.074 Contents of CP/M Users Group volume 74 74.02 2k -CRCFILE.074 CRC of Volume 74 74.03 4k -CUGFORM.LIB Submittal form 74.04 2k -SIGFORM.LIB Submittal form 74.053k DISPLAY.DOC / 70.18 7k FILE-EXT.ASM Display disk directory including hex data 70.19 1k FILE-EXT.COM / 70.20 8k FILE-XT2.ASM Same as FILE-EXT.ASM w/ 2.X compatibility 70.21 1k FILE-XT2.COM / 70.22 7k LOOK.ASM Searches for 1-9 byte sequence in memory 70.23 1k LOOK.COM / 70.24 7k MACTIME.ASM Patch for real time clock in MAC.COM 70.25 7k ASMTIME.ASM Patch for real time clock in ASM.COM 70.26 6k STATTIME.ASM Patch for real time clock in STAT.COM 70.27 6k SAP.ASM Updated directory sort for CP/M 2.X 70.28 1k SAP.COM / 70.29 13k XLOOK.ASM Disk/examine/modify utility #071 CP/M Users Group Volume 71 (SIG/M volume 19) (Pascal Z volume 1) Description: - Miscellaneous Pascal Z Programs (original materials from Pascal Z User Group volume 1) CAT # SIZE TITLE REMARKS 71.01 2k -CATALOG.071 Contents of CP/M volume 71 71.02 1k -CATALOG.ACK Acknowledgement file 71.03 3k ABSTRACT.071 Vol 71 Comments file 71.04 2k CRCKFILE.071 CRC of volume 71 71.05 4k -CUGFORM.LIB Suk VECTOR.Z80 Intel I/O standard vector subsystem 72.6 14k CONSOL.Z80 Console subsystem 72.7 5k DISK.Z80 Floppy disk subsystem, it ties CPM to the monitor so that both operate as an integrated whole 72.8 8k CASS.Z80 Cassette subsystem, controls the Dajen/ Teletek UCRI, includes Zapple compatile (RI) & (PO) 72.9 1k BMGEN.Z80 Bit map generator 72.10 1k BMGEN.COM / 72.11 10k LOADER.Z80 Static loader for system 72.12 3k LOADER.COM / 72.13 16k SYS.COM Sys Monitor boot-up program 72.14 14k ONE.HEX Used with bringing up bit map 72.15 14k ZERO.HEX Used with bringing up bit map 72.16 1k COPYTT.Z80 Sample command, similiar to a COM file, this one is a Disk subsystem test utility 72.17 1k COPYTT.SMC / #073 CP/M Users Group Volume 73 (SIG/M volume 21) (Pascal Z volume 3) Description: - Miscellaneous Pascal Z Utilities (original materials from Pascal Z User Group volume 3) CAT # SIZE TITLE COMMENTS 73.01 2k -CATALOG.073 Contents of CP/M  4k ABSTRACT.074 Comments on volume 74 74.1 2k CFIO.LIB Program to open files 74.2 10k CONCORD.COM Program that builds an alphabetical 74.3 11k CONCORD.PAS Listing of distinct words 74.4 2k COSINE.PAS Cosine program 74.5 2k COSINE.REL / 74.6 6k COSINE.SRC / 74.7 8k GEN5.COM Demo on accessing CP/M files 74.8 5k GEN5.PAS / 74.9 10k GRAPH1.COM Demo on creating a graphic representation 74.10 1k GRAPH1.PAS of a function. 74.11 6k ISORTV1.COM Insertion sort with linked list 74.12 4k ISORTV1.PAS / 74.13 8k LINENOS.COM Keep track of text lines 74.14 4k LINENOS.PAS / 74.15 6k POINT.COM Demo on the use of pointers 74.16 2k POINT.PAS / 74.17 4k RANDOM.MAC "Professional" random number generator 74.18 1k RANDOM.PAS Simple random number generator 74.19 5k SINCOS.SRC Sine/cosine utility 74.20 1k SINCOS.REL / 74.21 5k STRLIB.DOC Ray Penley's latest updated string lib. 74.22 13k STRLIB.LIB / 74.23 9k TRIG4.COM Simple Demo program that builds a 74.24 2k TRIG4.PAS short Trbmittal form 71.06 2k -SIGFORM.LIB Submittal form 71.1 5k AUTOBOOT.ASM Autoboot on CP/M cold start 71.2 1k AUTOBOOT.COM / 71.3 11k LINEARP.PAS Simplex algorithm to minimize 71.4 21k LINEARP.COM a cost function to constraints 71.5 1k VARIANT.PAS Demo for variant records 71.6 5k VARIANT.COM / 71.7 2k REVERSE.PAS Demo for linked lists 71.8 6k REVERSE.COM / 71.9 9k EDITFILE.PAS Adapted from S-100 Microsystems 71.10 13k EDITFILE.COM / 71.11 4k RT.PAS Demo program for non-text files 71.12 8k RT.COM / 71.13 6k STARS.PAS Game 71.14 7k STARS.COM / 71.15 1k ADDN.PAS Simple demo to add two numbers 71.16 6k ADDN.COM / 71.17 13k ZMNEMONS.DOC Programming aid 71.18 1k TRIAN.PAS Demo on FOR loops 71.19 4k TRIAN.COM / 71.20 6k CONCHAR.PAS Utility for command line input 71.21 5k SCAN2X.PAS File READ evaluation 71.22 8k SCAN2X.COM / 71.23 14k STRDEMO.PAS Demo on string functions 71.24 4k STRLIB.DOC Part of STRDEMO.PAS 71.25 3k LONG.PAS Demo to string words together 71.26 7kUsers Group volume 73 73.02 2k -CRCFILE.073 CRC of Volume 73 73.03 4k ABSTRACT.073 Comments on volume 73 73.1 10k AUTHOR.PAS General purpose "keyword in text" 73.2 11k AUTHOR.COM / 73.2a 1k ADDRESS / 73.2b 1k BYTE.MAG / 73.2c 1k S100.MAG / 73.3 12k CALC.PAS Calculator mode program 73.4 16k CALC.COM / 73.5 2k CPLOT.PAS Simple banner program 73.6 5k CPLOT.COM / 73.7 1k DELAY.PAS General Pascal Z utilities 73.8 1k DELAY.REL / 73.9 1k DELAY.SRC / 73.10 1k INPORT.REL / 73.11 1k INPORT.SRC / 73.12 1k OUTPORT.REL / 73.13 1k OUTPORT.SRC / 73.14 1k KEYIN.REL / 73.15 1k KEYIN.SRC / 73.16 10k NAD.PAS Permuted keyword index program 73.17 10k NAD.COM / 73.18 6k TDIABLO.MAC Driver for Diablo w/Teletek FDC-1 73.19 1k TDIABLO.COM / 73.20 5k DIABLO.Z80 Driver for Diablo w/SD Systems S100 73.21 1k DIABLO.COM / 73.22 2k RANDOM.PAS Fibonacci random number generator 73.23 1k RANDOM.REL / 73.24 4k RANDOM.SRC / 73.25 1k REBOOT.COM Reboot5ig chart 74.25 13k XREFG2.COM A binary tree type cross-ref generator 74.26 18k XREFG2.PAS / 74.27 8k ZPTEX.COM Very simple text formatter 74.28 8k ZPTEX.PAS / 74.29 5k LESSON4 74.30 12k RECIPE.COM Recipe program 74.31 17k RECIPE.PAS / 74.32 1k RECIPE.MST / 74.33 1k RCPDAT.YYY 74.34 8k FCLOSE.COM Three different ways to close a file 74.35 4k FCLOSE.PAS in Pascal Z. #075 CP/M Users Group Volume 75 (SIG/M volume 23) (Pascal Z volume 5) Description: - MBASIC Disassembler - Date Routines - Miscellaneous Utilities VOL # SIZE TITLE COMMENTS 75.01 2k -CATALOG.075 Contents of CP/M Users Group volume 75 75.02 2k -CRCFILE.075 CRC of volume 75 75.03 4k -CUGFORM.LIB Submittal form 75.04 2k -SIGFORM.LIB Submittal form 75.05 2k ABSTRACT.075 Comments on volume 75 75.1 3k EXPO.PAS Demo on the use of exponents 75.2 7k EXPO.COM / 75.3 9k COMPARE.DOC UCSD program Compare documentation 75.4 11k DISASMB.DOC Disassembler in MicroSoft Basic Version 5.1 75.4a 1k 8085.LST / 75.4b 1k 8085.TAB / 75.4c 13k DISASMB.BAS / 75.4d 1k INTEL.LST / 75.4e 1k INTEL.TAB / 75.4f 3k LST8085.BAS / 75.4g 3k LSTINTEL.BAS / 75.4h 4k LSTTDL.BAS / 75.4i 3k LSTZILOG.BAS / 75.4j 7k TAB8085.BAS / 75.4k 6k TABINTEL.BAS / 75.4l 11k TABTDL.BAS / 75.4m 11k TABZILOG.BAS / 75.4n 1k TDL.LST / 75.4o 3k TDL.TAB / 75.4p 6k XREF.BAS / 75.4q 1k XREF.SUB / 75.4r 1k ZILOG.LST / 75.4s 3k ZILOG.TAB / 75.5 7k DATE.DOC Dates routines 75.5a 1k BRKDATE.LIB / 75.5b 2k DASTRLON.LIB / 75.5c 2k DASTRLON.LIB / 75.5d 2k DASTRSH.LIB / 75.5e 7k DATE.PAS / 75.5f 2k DATEFUNC.LIB / 75.5g 2k MAKEDATE.LIB / 75.5h 1k PROMPT.LIB / 75.5i 2k RMAKEDA.LIB / 75.6 2k MISC.DOC Miscellaneous routines 75.6a 1k CAPCHAR.LIB / 75.6b 1k CAPSTR.LIB / 75.6c 1k DEPAD.LIB / 75.6d 1k GETINT.LIB / 75.6e 1k PADSTR.LIB / 75.6f 1k STRVAL.LIB / 75.7a 4k HANOI.COM Demonstrating recursive procedures 75.7b 2k HANOI.PAS / 75.8a 44k DIS.ASM TDL Disassembler - see ABSTRACT.075 75.8b 5k DIS.DOC / 75.9a 9k CONFER.COM Conference scheduler 75.9b 6k CONFER.PAS /  7k TAB8085.BAS / 75.4k 6k TABINTEL.BAS / 75.4l 11k TABTDL.BAS / 75.4m 11k TABZILOG.BAS / 75.4n 1k TDL.LST / 75.4o 3k TDL.TAB / 75.4p 6k XREF.BAS / 75.4q 1k XREF.SUB / 75.4r 1k ZILOG.LST / 75.4s 3k ZILOG.TAB / 75.5 7k DATE.DOC Dates routines 75.5a 1k BRKDATE.LIB / 75.5b 2k DASTRLON.LIB / 75.5c 2k DASTRLON.LIB / 75.5d 2k DASTRSH.LIB / 75.5e 7k DATE.PAS / 75.5f 2k DATEFUNC.LIB / 75.5g 2k MAKEDATE.LIB / 75.5h 1k PROMPT.LIB / 75.5i 2k RMAKEDA.LIB / 75.6 2k MISC.DOC Miscellaneous routines 75.6a 1k CAPCHAR.LIB / 75.6b 1k CAPSTR.LIB / 75.6c 1k DEPAD.LIB / 75.6d 1k GETINT.LIB / 75.6e 1k PADSTR.LIB / 75.6f 1k STRVAL.LIB / 75.6 THE COMPUTIST MASTER CATALOG DISKETTE This diskette is a compilation of all diskette directories issued or announced by the CP/M Users' Group as of January 1982. The following files reside on this diskette: FIND.COM ----------> CPMUG #63.09 used to skan the concatinated file. ALL. --------------> Concatinated file of all directory listings. DISPLAY.COM -------> CPMUG #63.05 to review the CPMUG files DISPLAY.DOC -------> CPMUG #63.06 How to use DISPLAY.COM CPMUG.000 ---------> Catalog pages for CPMUG volumes 001 thru 009 CPMUG.010 ---------> Catalog pages for CPMUG volumes 010 thru 019 CPMUG.020 ---------> ... volumes 020 - 029 CPMUG.030 ---------> ... volumes 030 - 039 CPMUG.040 ---------> ... volumes 040 - 049 CPMUG.050 ---------> ... volumes 050 - 059 CPMUG.060 ---------> ... volumes 060 - 069 CPMUG.070 ---------> ... volumes 070 - 075 READ.ME -----------> This document A. FORMAT OF DIRECTORIES The directories, as presented by CPMUG, vary considera 26, 1981 ume 62), or use just "." and get a display of all entries (it will compare to the periods in the volume # and in the FILENAME. If you would like to terminate the search early, a control-C will immediately return you to the command level of CP/M. FINAL NOTES: The information compiled in this diskette has been gathered from various sources, including but not limited to the CPMUG, CACHE, SIG/M, Pascal-Z UG, and the BDS-C UG. In addition various people have been instrumental in helping me compile the information: Tony Dowden Doug McKee Dave Jaffe Larry Platzek Bruce Kendall and the S-100 Club of San Jose Of course, all errors, inaccuracies, and strange creations are the direct or indirect result of one person, me. I hope this diskette will assist you in accumulating a pool of useful and educational material. Donn Fisher Januarybly from excellent to horrible. In order to standardize, I have settled on the original format. This consists of the following four fields: VOLUME/FILE # FILE SIZE TITLE COMMENTS: In particular, I have taken care to assure that all fields in all the directories are aligned. This provides consistancy in the display when you skan the concatinated file. B. THE CONCATINATED FILE "ALL" The file "ALL" is a concatination of all 75 CPM Users' Group volume directories - about 96k bytes worth. In addition to stringing them all together, I removed all extraneous verbage -- leaving only the 2600+ lines (one per program title). To locate a particular file, just type: FIND ALL string (where string is the pattern to find) The FIND utility will skan the ALL file, looking for any line containing the 'string'. It will print all file lines which have the embedded string. In addition to searching for particular file names, you may search for modem, doc, pas, bas, game, or radio (to find ham radio related programs). To display one particular volume, use the string 62. (for volume 62), or use just "." and get a display of all entries (it will compare to the periods in the volume # and in the FILENAME. If you would like to terminate the search early, a control-C will immediately return you to the command level of CP/M. FINAL NOTES: The information compiled in this diskette has been gathered from various sources, including but not limited to the CPMUG, CACHE, SIG/M, Pascal-Z UG, and the BDS-C UG. In addition various people have been instrumental in helping me compile the information: Tony Dowden Doug McKee Dave Jaffe Larry Platzek Bruce Kendall and the S-100 Club of San Jose Of course, all errors, inaccuracies, and strange creations are the direct or indirect result of one person, me. I hope this diskette will assist you in accumulating a pool of useful and educational material. Donn Fisher January6UFF and setting the character count in CBUFF ; ; Setting CLEVEL3 to TRUE enables extended processing of the third level of ; CCPZ command. All the user program need do is to store the command line and ; set the character count; CCPZ will initialize the pointers properly, store ; the ending zero properly, and capitalize the command line for processing. ; Once the command line is properly stored, the user executes the command line ; by reentering the CCPZ through CCPLOC [NOTE: The C register MUST contain ; a valid User/Disk Flag (see location 4) at this time.] ; CLEVEL3 EQU TRUE ;ENABLE COMMAND LEVEL 3 PROCESSING ; ; ;*** TERMINAL AND 'TYPE' CUSTOMIZATION EQUATES ; NLINES EQU 24 ;NUMBER OF LINES ON CRT SCREEN WIDE EQU TRUE ;TRUE IF WIDE DIR DISPLAY FENCE EQU '|' ;SEP CHAR BETWEEN DIR FILES ; PGDFLT EQU TRUE ;SET TO FALSE TO DISABLE PAGING BY DEFAULT PGDFLG EQU 'P' ;FOR TYPE COMMAND: PAGE OR NOT (DEP ON PGDFLT) ; THIS FLAG REVERSES THE DEFAULT EFFECT ; MAXUSR EQU 15 ;MAXB 10H @GENDD ?N-$-1 ENDM ; LDIR MACRO ;;LDIR DB 0EDH,0B0H ENDM ; LDED MACRO ?N ;;LOAD DE DIRECT DB 0EDH,05BH DW ?N ENDM ; LBCD MACRO ?N ;;LOAD BC DIRECT DB 0EDH,4BH DW ?N ENDM ; SDED MACRO ?N ;;STORE DE DIRECT DB 0EDH,53H DW ?N ENDM ; SBCD MACRO ?N ;;STORE BC DIRECT DB 0EDH,43H DW ?N ENDM ; ; END OF Z80 MACRO EXTENSIONS ; ; ;**** Section 0 **** ; ORG CCPLOC ; ; ENTRY POINTS INTO CCPZ ; ; If the CCPZ is entered at location CCPLOC (at the JMP to CCP), then ; the default command in CIBUFF will be processed. If the CCPZ is entered ; at location CCPLOC+3 (at the JMP to CCP1), then the default command in ; CIBUFF will NOT be processed. ; ; NOTE: Entry into CCPZ in this way is permitted under CCPZ Version 4.0, ; but in order for this to work, CIBUFF and CBUFF MUST be initialized properly ; AND the C register MUST contain a valid User/Disk Flag (see Location 4: the ; most significant nybble contains the User Number and the least significant ; ny; to have the command processed. Again, under CCPZ Version 4.x, it is not ; necessary to store the pointer to CIBUFF in CIBPTR; CCPZ will do this for ; the calling program if CLEVEL3 is made TRUE. ; ; WARNING: The command line must NOT exceed BUFLEN characters in length. ; For user programs which load this command, the value of BUFLEN can be ; obtained by examining the byte at MBUFF (CCPLOC + 6). ; BUFLEN EQU 80 ;MAXIMUM BUFFER LENGTH MBUFF: DB BUFLEN ;MAXIMUM BUFFER LENGTH CBUFF: DB 0 ;NUMBER OF VALID CHARS IN COMMAND LINE CIBUFF: DB ' ' ;DEFAULT (COLD BOOT) COMMAND CIBUF: DB 0 ;COMMAND STRING TERMINATOR DB ' CCPZ-V4.1 of 11/27/81 ' ;FOR DUMP IDENTIFICATION DS BUFLEN-($-CIBUFF)+1 ;TOTAL IS 'BUFLEN' BYTES ; CIBPTR: DW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR: DW CIBUF ;PTR TO CURR CMD FOR ERROR REPORTING ; DS 26 ;STACK AREA STACK EQU $ ;TOP OF STACK ; ; FILE TYPE FOR COMMAND ; COMMSG: DB 'COM' ; ; SUBMIT FILE CONTROL BLOCK ; SUBFCBIMUM USER NUMBER ACCESSABLE ; SYSFLG EQU 'A' ;FOR DIR COMMAND: LIST $SYS AND $DIR ; SOFLG EQU 'S' ;FOR DIR COMMAND: LIST $SYS FILES ONLY ; SUPRES EQU TRUE ;SUPRESSES USER # REPORT FOR USER 0 ; DEFUSR EQU 0 ;DEFAULT USER NUMBER FOR COM FILES ; SPRMPT EQU '$' ;CCP PROMPT INDICATING SUBMIT COMMAND CPRMPT EQU '>' ;CCP PROMPT INDICATING USER COMMAND ; NUMBASE EQU 'H' ;CHARACTER USED TO SWITCH FROM DEFAULT ; NUMBER BASE ; SECTFLG EQU 'S' ;OPTION CHAR FOR SAVE COMMAND TO SAVE SECTORS ; ; END OF CUSTOMIZATION SECTION ; CR EQU 0DH LF EQU 0AH TAB EQU 09H ; WBOOT EQU BASE+0000H ;CP/M WARM BOOT ADDRESS UDFLAG EQU BASE+0004H ;USER NUM IN HIGH NYBBLE, DISK IN LOW BDOS EQU BASE+0005H ;BDOS FUNCTION CALL ENTRY PT TFCB EQU BASE+005CH ;DEFAULT FCB BUFFER TBUFF EQU BASE+0080H ;DEFAULT DISK I/O BUFFER TPA EQU BASE+0100H ;BASE OF TPA ; ; ; MACROS TO PROVIDE Z80 EXTENSIONS ; MACROS INCLUDE: ; $*MACRO ;FIRST TURN OFF THE EXPANSIONS ; ; JR - JUMP RELATIVE ; JRC - JUMP REbble contains the Disk Number). ; ; Some user programs (such as SYNONYM3) attempt to use the default ; command facility. Under the original CCP, it was necessary to initialize ; the pointer after the reserved space for the command buffer to point to ; the first byte of the command buffer. Under Version 4.x of CCPZ, this is ; no longer the case. The CIBPTR (Command Input Buffer PoinTeR) is located ; to be compatible with such programs (provided they determine the buffer ; length from the byte at MBUFF [CCPLOC + 6]), but under Version 4.x of CCPZ ; this is no longer necessary. CCPZ Version 4.x automatically initializes ; this buffer pointer in all cases. ; ENTRY: JMP CCP ; Process potential default command JMP CCP1 ; Do NOT process potential default command ; ;**** Section 1 **** ; ; BUFFERS ET AL ; ; INPUT COMMAND LINE AND DEFAULT COMMAND ; ; The command line to be executed is stored here. This command line ; is generated in one of three ways: ; ; (1) by the user entering i: IF SUBA ;IF $$$.SUB ON A: DB 1 ;DISK NAME SET TO DEFAULT TO DRIVE A: ENDIF ; IF NOT SUBA ;IF $$$.SUB ON CURRENT DRIVE DB 0 ;DISK NAME SET TO DEFAULT TO CURRENT DRIVE ENDIF ; DB '$$$' ;FILE NAME DB ' ' DB 'SUB' ;FILE TYPE DB 0 ;EXTENT NUMBER DB 0 ;S1 SUBFS2: DS 1 ;S2 SUBFRC: DS 1 ;RECORD COUNT DS 16 ;DISK GROUP MAP SUBFCR: DS 1 ;CURRENT RECORD NUMBER ; ; COMMAND FILE CONTROL BLOCK ; FCBDN: DS 1 ;DISK NAME FCBFN: DS 8 ;FILE NAME FCBFT: DS 3 ;FILE TYPE DS 1 ;EXTENT NUMBER DS 2 ;S1 AND S2 DS 1 ;RECORD COUNT FCBDM: DS 16 ;DISK GROUP MAP FCBCR: DS 1 ;CURRENT RECORD NUMBER ; ; OTHER BUFFERS ; PAGCNT: DB NLINES-2 ;LINES LEFT ON PAGE CHRCNT: DB 0 ;CHAR COUNT FOR TYPE ; ; CCP BUILT-IN COMMAND TABLE ; NCHARS EQU 4 ;NUMBER OF CHARS/COMMAND ; ; CCP COMMAND NAME TABLE ; EACH TABLE ENTRY IS COMPOSED OF THE 4-BYTE COMMAND AND 2-BYTE ADDRESS ; CMDTBL: DB 'DIR ' DW DIR DB 'LIST' DW LIST DB 'TYPE' DW TYPE DB 'LATIVE IF CARRY ; JRNC - JUMP RELATIVE IF NO CARRY ; JRZ - JUMP RELATIVE IF ZERO ; JRNZ - JUMP RELATIVE IF NO ZERO ; DJNZ - DECREMENT B AND JUMP RELATIVE IF NO ZERO ; LDIR - MOV @HL TO @DE FOR COUNT IN BC ; LXXD - LOAD DOUBLE REG DIRECT ; SXXD - STORE DOUBLE REG DIRECT ; ; ; ; @GENDD MACRO USED FOR CHECKING AND GENERATING ; 8-BIT JUMP RELATIVE DISPLACEMENTS ; @GENDD MACRO ?DD ;;USED FOR CHECKING RANGE OF 8-BIT DISPLACEMENTS IF (?DD GT 7FH) AND (?DD LT 0FF80H) DB 100H ;Displacement Range Error on Jump Relative ELSE DB ?DD ENDIF ENDM ; ; ; Z80 MACRO EXTENSIONS ; JR MACRO ?N ;;JUMP RELATIVE DB 18H @GENDD ?N-$-1 ENDM ; JRC MACRO ?N ;;JUMP RELATIVE ON CARRY DB 38H @GENDD ?N-$-1 ENDM ; JRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY DB 30H @GENDD ?N-$-1 ENDM ; JRZ MACRO ?N ;;JUMP RELATIVE ON ZERO DB 28H @GENDD ?N-$-1 ENDM ; JRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO DB 20H @GENDD ?N-$-1 ENDM ; DJNZ MACRO ?N ;;DECREMENT B AND JUMP RELATIVE ON NO ZERO Dt through the BDOS READLN function at ; the du> prompt [user input from keyboard] ; (2) by the SUBMIT File Facility placing it there from a $$$.SUB ; file ; (3) by an external program or user placing the required command ; into this buffer ; ; In all cases, the command line is placed into the buffer starting at ; CIBUFF. This command line is terminated by the last character (NOT Carriage ; Return), and a character count of all characters in the command line ; up to and including the last character is placed into location CBUFF ; (immediately before the command line at CIBUFF). The placed command line ; is then parsed, interpreted, and the indicated command is executed. ; If CLEVEL3 is permitted, a terminating zero is placed after the command ; (otherwise the user program has to place this zero) and the CIBPTR is ; properly initialized (otherwise the user program has to init this ptr). ; If the command is placed by a user program, entering at CCPLOC is enough 7USER' DW USER DB 'DFU ' DW DFU ; IF NOT RAS ;FOR NON-RAS DB 'GO ' DW GO DB 'ERA ' DW ERA DB 'SAVE' DW SAVE DB 'REN ' DW REN DB 'GET ' DW GET DB 'JUMP' DW JUMP ENDIF ; NCMNDS EQU ($-CMDTBL)/(NCHARS+2) ; ; ;**** Section 2 **** ; CCP STARTING POINTS ; ; START CCP AND DON'T PROCESS DEFAULT COMMAND STORED ; CCP1: XRA A ;SET NO DEFAULT COMMAND STA CBUFF ; ; START CCP AND POSSIBLY PROCESS DEFAULT COMMAND ; ; NOTE ON MODIFICATION BY RGF: BDOS RETURNS 0FFH IN ; ACCUMULATOR WHENEVER IT LOGS IN A DIRECTORY, IF ANY ; FILE NAME CONTAINS A '$' IN IT. THIS IS NOW USED AS ; A CLUE TO DETERMINE WHETHER OR NOT TO DO A SEARCH ; FOR SUBMIT FILE, IN ORDER TO ELIMINATE WASTEFUL SEARCHES. ; CCP: LXI SP,STACK ;RESET STACK PUSH B MOV A,C ;C=USER/DISK NUMBER (SEE LOC 4) RAR ;EXTRACT USER NUMBER RAR RAR RAR ANI 0FH MOV E,A ;SET USER NUMBER CALL SETUSR CALL RESET ;RESET DISK SYSTEM STA RNGSUB ;SAVE SUBMIT CLUE FROM DRIVE A: POP B MOV A,C ;CSTORE HIGH MOV L,A ;STORE LOW PCHL ;EXECUTE CCP ROUTINE ; ; ENTRY POINT FOR RESTARTING CCP AND LOGGING IN DEFAULT DRIVE ; RSTCCP: CALL DLOGIN ;LOG IN DEFAULT DRIVE ; ; ENTRY POINT FOR RESTARTING CCP WITHOUT LOGGING IN DEFAULT DRIVE ; RCCPNL: CALL SCANER ;EXTRACT NEXT TOKEN FROM COMMAND LINE LDA FCBFN ;GET FIRST CHAR OF TOKEN SUI ' ' ;ANY CHAR? LXI H,TEMPDR ORA M JNZ ERROR JR RESTRT ; ; No File Error Message ; PRNNF: CALL PRINTC ;NO FILE MESSAGE DB 'No Fil','e'+80H RET ; ;**** Section 3 **** ; I/O UTILITIES ; ; OUTPUT CHAR IN REG A TO CONSOLE AND DON'T CHANGE BC ; ; ; OUTPUT ; CRLF: MVI A,CR CALL CONOUT MVI A,LF ;FALL THRU TO CONOUT ; CONOUT: PUSH B MVI C,02H OUTPUT: MOV E,A PUSH H CALL BDOS POP H POP B RET ; CONIN: MVI C,01H ;GET CHAR FROM CON: WITH ECHO JR BDOSB ; LCOUT: PUSH PSW ;OUTPUT CHAR TO CON: OR LST: DEP ON PRFLG PRFLG EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS FICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TMPUSR MOV E,A ;PLACE IN E JR SETUSR ;THEN GO SET USER GETUSR: MVI E,0FFH ;GET CURRENT USER NUMBER SETUSR: MVI C,20H ;SET USER NUMBER TO VALUE IN E (GET IF E=FFH) JR BDOSJP ;MORE SPACE SAVING ; ; END OF BDOS FUNCTIONS ; ; ;**** Section 4 **** ; CCP UTILITIES ; ; SET USER/DISK FLAG TO CURRENT USER AND DEFAULT DISK ; SETUD: CALL GETUSR ;GET NUMBER OF CURRENT USER ADD A ;PLACE IT IN HIGH NYBBLE ADD A ADD A ADD A LXI H,TDRIVE ;MASK IN DEFAULT DRIVE NUMBER (LOW NYBBLE) ORA M ;MASK IN STA UDFLAG ;SET USER/DISK NUMBER RET ; ; SET USER/DISK FLAG TO USER 0 AND DEFAULT DISK ; SETU0D: TDRIVE EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TDRIVE STA UDFLAG ;SET USER/DISK NUMBER RET ; ; CONVERT CHAR IN A TO UPPER CASE ; UCASE: CPI 61H ;LOWER-CASE A RC CPI 7BH ;GREATER THAN LOWER-CASE Z? RNC ANI 5FH ;CAPITALIZE RET ; ; INPUT NEXT COMMAND TO CCP ; This rout=USER/DISK NUMBER (SEE LOC 4) ANI 0FH ;EXTRACT DEFAULT DISK DRIVE STA TDRIVE ;SET IT JRZ NOLOG ;SKIP IF 0...ALREADY LOGGED CALL LOGIN ;LOG IN DEFAULT DISK ; IF NOT SUBA ;IF $$$.SUB IS ON CURRENT DRIVE STA RNGSUB ;BDOS '$' CLUE ENDIF ; NOLOG: LXI D,SUBFCB ;CHECK FOR $$$.SUB ON CURRENT DISK RNGSUB EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE RNGSUB FLAG ORA A ;SET FLAGS ON CLUE CMA ;PREPARE FOR COMING 'CMA' CNZ SEAR1 CMA ;0FFH IS RETURNED IF NO $$$.SUB, SO COMPLEMENT STA RNGSUB ;SET FLAG (0=NO $$$.SUB) LDA CBUFF ;EXECUTE DEFAULT COMMAND? ORA A ;0=NO JRNZ RS1 ; ; PROMPT USER AND INPUT COMMAND LINE FROM HIM ; RESTRT: LXI SP,STACK ;RESET STACK ; ; PRINT PROMPT (DU>) ; CALL CRLF ;PRINT PROMPT CALL GETDRV ;CURRENT DRIVE IS PART OF PROMPT ADI 'A' ;CONVERT TO ASCII A-P CALL CONOUT CALL GETUSR ;GET USER NUMBER ; IF SUPRES ;IF SUPPRESSING USR # REPORT FOR USR 0 ORA A JRZ RS000 ENDIF ; CPI 10THE PRINT FLAG ORA A ;0=TYPE JRZ LC1 POP PSW ;GET CHAR ; ; OUTPUT CHAR IN REG A TO LIST DEVICE ; LSTOUT: PUSH B MVI C,05H JR OUTPUT LC1: POP PSW ;GET CHAR PUSH PSW CALL CONOUT ;OUTPUT TO CON: POP PSW CPI LF ;CHECK FOR PAGING JZ PAGER RET ; READF: LXI D,FCBDN ;FALL THRU TO READ READ: MVI C,14H ;FALL THRU TO BDOSB ; ; CALL BDOS AND SAVE BC ; BDOSB: PUSH B CALL BDOS POP B ORA A RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY RET ADR;START WITH ; PRINTC: PUSH PSW ;SAVE FLAGS CALL CRLF ;NEW LINE POP PSW ; PRINT: XTHL ;GET PTR TO STRING PUSH PSW ;SAVE FLAGS CALL PRIN1 ;PRINT STRING POP PSW ;GET FLAGS XTHL ;RESTORE HL AND RET ADR RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY HL ; PRIN1: MOV A,M ;GET NEXT BYTE CALL CONOUT ;PRINT CHAR MOV A,M ;GET NEXT BYTE AGAIN FOR TEST INX H ;PT TO NEXT BYTE ORA A ;SET FLAGS RZ ;DONE IF ZERO RM ;DONE IF MSB SET JR PRIN1 ; ; BDOS FUNCTION ROUTINES ; ; ; RETURN ine determines if a SUBMIT file is being processed ; and extracts the command line from it if so or from the user's console ; REDBUF: LDA RNGSUB ;SUBMIT FILE CURRENTLY IN EXECUTION? ORA A ;0=NO JRZ RB1 ;GET LINE FROM CONSOLE IF NOT LXI D,SUBFCB ;OPEN $$$.SUB PUSH D ;SAVE DE CALL OPEN POP D ;RESTORE DE JRZ RB1 ;ERASE $$$.SUB IF END OF FILE AND GET CMND LDA SUBFRC ;GET VALUE OF LAST RECORD IN FILE DCR A ;PT TO NEXT TO LAST RECORD STA SUBFCR ;SAVE NEW VALUE OF LAST RECORD IN $$$.SUB CALL READ ;DE=SUBFCB JRNZ RB1 ;ABORT $$$.SUB IF ERROR IN READING LAST REC LXI D,CBUFF ;COPY LAST RECORD (NEXT SUBMIT CMND) TO CBUFF LXI H,TBUFF ; FROM TBUFF LXI B,BUFLEN ;NUMBER OF BYTES LDIR LXI H,SUBFS2 ;PT TO S2 OF $$$.SUB FCB MVI M,0 ;SET S2 TO ZERO INX H ;PT TO RECORD COUNT DCR M ;DECREMENT RECORD COUNT OF $$$.SUB LXI D,SUBFCB ;CLOSE $$$.SUB CALL CLOSE JRZ RB1 ;ABORT $$$.SUB IF ERROR MVI A,SPRMPT ;PRINT SUBMIT PROMPT CALL CONOUT LXI H,CIBUFF ;PRINT COMMAN ;USER < 10? JRC RS00 SUI 10 ;SUBTRACT 10 FROM IT PUSH PSW ;SAVE IT MVI A,'1' ;OUTPUT 10'S DIGIT CALL CONOUT POP PSW RS00: ADI '0' ;OUTPUT 1'S DIGIT (CONVERT TO ASCII) CALL CONOUT ; ; READ INPUT LINE FROM USER OR $$$.SUB ; RS000: CALL REDBUF ;INPUT COMMAND LINE FROM USER (OR $$$.SUB) ; ; PROCESS INPUT LINE ; RS1: ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED CALL CNVBUF ;CAPITALIZE COMMAND LINE, PLACE ENDING 0, ; AND SET CIBPTR VALUE ENDIF ; CALL DEFDMA ;SET TBUFF TO DMA ADDRESS CALL GETDRV ;GET DEFAULT DRIVE NUMBER STA TDRIVE ;SET IT CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE CNZ ERROR ;ERROR IF COMMAND NAME CONTAINS A '?' LXI D,RSTCCP ;PUT RETURN ADDRESS OF COMMAND PUSH D ;ON THE STACK LDA TEMPDR ;IS COMMAND OF FORM 'D:COMMAND'? ORA A ;NZ=YES JNZ COM ; IMMEDIATELY CALL CMDSER ;SCAN FOR CCP-RESIDENT COMMAND JNZ COM ;NOT CCP-RESIDENT MOV A,M ;FOUND IT: GET LOW-ORDER PART INX H ;GET HIGH-ORDER PART MOV H,M ;NUMBER OF CURRENT DISK IN A ; GETDRV: MVI C,19H JR BDOSJP ; ; SET 80H AS DMA ADDRESS ; DEFDMA: LXI D,TBUFF ;80H=TBUFF DMASET: MVI C,1AH JR BDOSJP ; RESET: MVI C,0DH BDOSJP: JMP BDOS ; LOGIN: MOV E,A MVI C,0EH JR BDOSJP ;SAVE SOME CODE SPACE ; OPENF: XRA A STA FCBCR LXI D,FCBDN ;FALL THRU TO OPEN ; OPEN: MVI C,0FH ;FALL THRU TO GRBDOS ; GRBDOS: CALL BDOS INR A ;SET ZERO FLAG FOR ERROR RETURN RET ; CLOSE: MVI C,10H JR GRBDOS ; SEARF: LXI D,FCBDN ;SPECIFY FCB SEAR1: MVI C,11H JR GRBDOS ; SEARN: MVI C,12H JR GRBDOS ; ; CHECK FOR SUBMIT FILE IN EXECUTION AND ABORT IT IF SO ; SUBKIL: LXI H,RNGSUB ;CHECK FOR SUBMIT FILE IN EXECUTION MOV A,M ORA A ;0=NO RZ MVI M,0 ;ABORT SUBMIT FILE LXI D,SUBFCB ;DELETE $$$.SUB ; DELETE: MVI C,13H JR BDOSJP ;SAVE MORE SPACE ; WRITE: MVI C,15H JMP BDOSB ; CREATE: MVI C,16H JR GRBDOS ; ; RESET USER NUMBER IF CHANGED ; RESETUSR: TMPUSR EQU $+1 ;POINTER FOR IN-THE-CODE MODI7D LINE FROM $$$.SUB CALL PRIN1 CALL BREAK ;CHECK FOR ABORT (ANY CHAR) ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED RZ ;IF (NO ABORT), RETURN TO CALLER AND RUN ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED JRZ CNVBUF ;IF (NO ABORT), CAPITALIZE COMMAND ENDIF ; CALL SUBKIL ;KILL $$$.SUB IF ABORT JMP RESTRT ;RESTART CCP ; ; INPUT COMMAND LINE FROM USER CONSOLE ; RB1: CALL SUBKIL ;ERASE $$$.SUB IF PRESENT CALL SETUD ;SET USER AND DISK MVI A,CPRMPT ;PRINT PROMPT CALL CONOUT MVI C,0AH ;READ COMMAND LINE FROM USER LXI D,MBUFF CALL BDOS ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED JMP SETU0D ;SET CURRENT DISK NUMBER IN LOWER PARAMS ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED CALL SETU0D ;SET CURRENT DISK NUMBER IF LOWER PARAMS ; AND FALL THRU TO CNVBUF ENDIF ; ; CAPITALIZE STRING (ENDING IN 0) IN CBUFF AND SET PTR FOR PARSING ; CNVBUF: LXI H,CBUFF ;PT TO USER'S COMMAND MOV B,M MVI B,11 ;11 CHARS MAX ; ; CHECK FOR SUFFIX FOR HEXADECIMAL NUMBER ; NUMS: MOV A,M ;GET CHARS FROM END, SEARCHING FOR SUFFIX DCX H ;BACK UP CPI ' ' ;SPACE? JRNZ NUMS1 ;CHECK FOR SUFFIX DJNZ NUMS ;COUNT DOWN JR NUM0 ;BY DEFAULT, PROCESS NUMS1: CPI NUMBASE ;CHECK AGAINST BASE SWITCH FLAG JRZ HNUM0 ; ; PROCESS DECIMAL NUMBER ; NUM0: LXI H,FCBFN ;PT TO BEGINNING OF TOKEN LXI B,1100H ;C=ACCUMULATED VALUE, B=CHAR COUNT ; (C=0, B=11) NUM1: MOV A,M ;GET CHAR CPI ' ' ;DONE IF JRZ NUM2 INX H ;PT TO NEXT CHAR SUI '0' ;CONVERT TO BINARY (ASCII 0-9 TO BINARY) CPI 10 ;ERROR IF >= 10 JRNC NUMERR MOV D,A ;DIGIT IN D MOV A,C ;NEW VALUE = OLD VALUE * 10 RLC RLC RLC ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD D ;NEW VALUE = OLD VALUE * 10 + DIGIT JRC NUMERR ;CHECK FOR RANGE ERROR MOV C,A ;SET NEW VALUE DJNZ NUM1 ;COUNT DOWN ; ; RETURN FROM NUMBER ; NUM2: MOV A,C ;GET ACCUMULATED  ;CHAR COUNT IN B INR B ;ADD 1 IN CASE OF ZERO CB1: INX H ;PT TO 1ST VALID CHAR MOV A,M ;CAPITALIZE COMMAND CHAR CALL UCASE MOV M,A DJNZ CB1 ;CONTINUE TO END OF COMMAND LINE CB2: MVI M,0 ;STORE ENDING LXI H,CIBUFF ;SET COMMAND LINE PTR TO 1ST CHAR SHLD CIBPTR RET ; ; CHECK FOR ANY CHAR FROM USER CONSOLE;RET W/ZERO SET IF NONE ; BREAK: PUSH D ;SAVE DE MVI C,11 ;CSTS CHECK CALL BDOSB CNZ CONIN ;GET INPUT CHAR BRKBK: POP D RET ; ; GET THE REQUESTED USER NUMBER FROM THE COMMAND LINE AND VALIDATE IT. ; USRNUM: CALL NUMBER CPI MAXUSR+1 RC ; ; INVALID COMMAND -- PRINT IT ; ERROR: CALL CRLF ;NEW LINE LHLD CIPTR ;PT TO BEGINNING OF COMMAND LINE ERR2: MOV A,M ;GET CHAR CPI ' '+1 ;SIMPLE '?' IF OR LESS JRC ERR1 PUSH H ;SAVE PTR TO ERROR COMMAND CHAR CALL CONOUT ;PRINT COMMAND CHAR POP H ;GET PTR INX H ;PT TO NEXT JR ERR2 ;CONTINUE ERR1: CALL PRINT ;PRINT '?' DB '?'+80H CALL SUBKIL ;TERMINATE ACTIVE $$$.SUB IFVALUE RET ; ; NUMBER ERROR ROUTINE FOR SPACE CONSERVATION ; NUMERR: JMP ERROR ;USE ERROR ROUTINE - THIS IS RELATIVE PT ; ; EXTRACT HEXADECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A; ALL REGISTERS MAY BE AFFECTED ; HEXNUM: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN HNUM0: LXI H,FCBFN ;PT TO TOKEN FOR CONVERSION LXI D,0 ;DE=ACCUMULATED VALUE MVI B,11 ;B=CHAR COUNT HNUM1: MOV A,M ;GET CHAR CPI ' ' ;DONE? JRZ HNUM3 ;RETURN IF SO CPI 'H' ;DONE IF H SUFFIX JRZ HNUM3 SUI '0' ;CONVERT TO BINARY JRC NUMERR ;RETURN AND DONE IF ERROR CPI 10 ;0-9? JRC HNUM2 SUI 7 ;A-F? CPI 10H ;ERROR? JRNC NUMERR HNUM2: INX H ;PT TO NEXT CHAR MOV C,A ;DIGIT IN C MOV A,D ;GET ACCUMULATED VALUE RLC ;EXCHANGE NYBBLES RLC RLC RLC ANI 0F0H ;MASK OUT LOW NYBBLE MOV D,A MOV A,E ;SWITCH LOW-ORDER NYBBLES RLC RLC RLC RLC MOV E,A ;HIGH NYBBLE OF E=NEW HIGH OF E, ; LOW NYBBLE OF E=NEW LOW OF D ANI 0FH ;GET NEW LOW OF D  ANY JMP RESTRT ;RESTART CCP ; ; CHECK TO SEE IF DE PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET ; SDELM: LDAX D ORA A ;0=DELIMITER RZ CPI ' ' ;ERROR IF < JRC ERROR RZ ;=DELIMITER CPI '=' ;'='=DELIMITER RZ CPI 5FH ;UNDERSCORE=DELIMITER RZ CPI '.' ;'.'=DELIMITER RZ CPI ':' ;':'=DELIMITER RZ CPI ';' ;';'=DELIMITER RZ CPI '<' ;'<'=DELIMITER RZ CPI '>' ;'>'=DELIMITER RET ; ; ADVANCE INPUT PTR TO FIRST NON-BLANK AND FALL THROUGH TO SBLANK ; ADVAN: LDED CIBPTR ; ; SKIP STRING PTED TO BY DE (STRING ENDS IN 0) UNTIL END OF STRING ; OR NON-BLANK ENCOUNTERED (BEGINNING OF TOKEN) ; SBLANK: LDAX D ORA A RZ CPI ' ' RNZ INX D JR SBLANK ; ; ADD A TO HL (HL=HL+A) ; ADDAH: ADD L MOV L,A RNC INR H RET ; ; EXTRACT DECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A;ALL REGISTERS MAY BE AFFECTED ; NUMBER: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN LXI H,FCBFN+10 ;PT TO END OF TOKEN FOR CONVERSION ORA D ;MASK IN HIGH OF D MOV D,A ;NEW HIGH BYTE IN D MOV A,E ANI 0F0H ;MASK OUT LOW OF E ORA C ;MASK IN NEW LOW MOV E,A ;NEW LOW BYTE IN E DJNZ HNUM1 ;COUNT DOWN ; ; RETURN FROM HEXNUM ; HNUM3: XCHG ;RETURNED VALUE IN HL MOV A,L ;LOW-ORDER BYTE IN A RET ; ; PT TO DIRECTORY ENTRY IN TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C ; DIRPTR: LXI H,TBUFF ;PT TO TEMP BUFFER ADD C ;PT TO 1ST BYTE OF DIR ENTRY CALL ADDAH ;PT TO DESIRED BYTE IN DIR ENTRY MOV A,M ;GET DESIRED BYTE RET ; ; CHECK FOR SPECIFIED DRIVE AND LOG IT IN IF NOT DEFAULT ; SLOGIN: XRA A ;SET FCBDN FOR DEFAULT DRIVE STA FCBDN CALL COMLOG ;CHECK DRIVE RZ JR DLOG5 ;DO LOGIN OTHERWISE ; ; CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT ; DLOGIN: CALL COMLOG ;CHECK DRIVE RZ ;ABORT IF SAME LDA TDRIVE ;LOG IN DEFAULT DRIVE ; DLOG5: JMP LOGIN ; ; ROUTINE COMMON TO BOTH LOGIN ROUTINES; ON EXIT, Z SET MEANS ABORT ; COMLOG: TEMPDR EQU $+1 ;POINTER FOR8*K͞+)'25'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77`i ! s#r! ~#fo|- ! ~#foG !- ~#fo!w! 1!"1!"1!  w#w!  ~#fo! ~#foҹ !  ~#fo))1`i s#r!  ~#fo))1##`i s#r!  ^#Vr+s[ *05|v! `i ! s#rzk!' ~#fo*05k! ~#fo|g}o! s! n& (! n&~\! n} E H S SVh!' ^#Vr+s\! 6.! n& ! 1! !  #|¡! !! `i ! s#rz*1! ~#fo"1! ! ~#fo #|! !! á! ~#fo*1! !! ! ! `i !)9Can't open %s %s is not a squeezed file %s -> %s: %s has invalid decode tree size Can't create %s Write error in %s ERROR - checksum error in %s ##!9DM*)}! )`is{ ! )`is,!`is{,`in};!e`in} ]`i6 *)}]! !`in&e!9Ão#s#`!9DM{2){2){2)! ~#fo͐ ~#fo)")! 6#6`i6#6͐͐ ~#foҀ*)}À! ~#fo͐)~#fon}< |ʳ!!9#$!9DM͐|3͐+++|J!͐##^#Vr+szt͐^#Vr+sn&!͐͐~#fo`is#r!ڱ͐##^#Vr+s͐##͐?+s#r͐͐s#r͐^#Vr+sn&!9!9DM͐`is#r͐n}(! ^#Vr+s! ^#Vr+s͐ns! ^#Vr+sn}(͐W!9fn%!9DM͐͐cs#rz!͐͐s#r͐##6#6͐~#foÙ#ß%!9DM͐+|! n&ͻ͐++|! n&!;͐+++|!! n&!;͐++++|Y! n} F! !;! n&!;͐##^#Vr+szʊ͐^#Vr+s! ns&!͐͐~#foʴ!͐##6#6͐͐s#r͐^#Vr+s! ns&ß%&X&!9DM͐!9͐##~#fo5!9͐##~#fo`is#r͐͐͐~#fo͐ʂ!9͐+?`is#r͐##~#fo|!͐͐͐͐##~#fo͐s#r͐~#fo͐s#r!!!a{   `OE!y6$ -7rBo&))T])))!y!>15:<15>{15Y/e56!'":}15Y/!:&1515\0!:</"͞) :<@"ͧ*͞)Z!:<>L">15͞)>15>@2G>)15ç"#(l'ͷ**͞)!2"ͫ'-L3#ͷ&"x0e5G)͍'ͫ'ͷ**͞)b)~F9#^#V##!2)))U~,L3G~`2<2<#~2<~?>T#=2<#^#V#^#V#"<^#V"<:<~#*<!:<@ʏ#"<*<#w"<*<~ʫ#¶#,L3;+"<*<+"21>:21>21`i6#6`i~#fo! ~#foC! ~#fo`i~#fo)~#foͪ`i^#Vr+s! ~#fo! !ͧ!2 !ͧ`iw#w`i~#fo͡! s#rz! 6 #6`i~#fo! ! ~#fos{ `i~#fo! 6`i^#Vr+st! n}! ͪ! n}aͭ!9+>+i! ~#fo͐)~#fo#n}*F! )! ~#fo͐)~#fo#q#|v! ~#fo͐)~#fo#!!tw>2)!! ~#fo͐)~#foz|°*)&|g}o}2)!)4! ~#fo͐)~#fo#")! ~#fo͐)~#fo#n}! ~#fo͐)!s#r! ~#fo͐)")+*)&|g}o}2)! ~#fo͐)~#fo#n}V!!tw! ~#fo͐)~#fo#}!-! ~#fo͐)~#fo#̀#|¼! ~#fo͐)~#fo#!!tw!)4*)}@͐! s#r͐͐ ~#fo!! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+s͐ ^#Vr+s`i^#Vr+s*)++")f͐ ͐s#r! ~#fo͐ ~#fo)w#wt! ^#Vr+s`i^#Vr+s!9Can't open %s | ! ~#fo##n} !"05! ~#fo! A ! ~#fon}21Å  ! ~#fo! !; Å ! ~#fo`is#r`i~#fon}x `i~#fon}*R `i~#fon}?l ! ~#fo! !; Å `i^#Vr+s, ! ~#foD !9 BAD COUNT %s Output drive =%s ERROR - Ignoring %s Can't accept ambiguous name %s ovõAÙÈ`øB!9DM`i!- ~#fo #|I !- ~#fo!A! 8!' w#w!"1 `i vʇ !- ~#fo!P! 1`i ! s#r"5! s#r! ~#fo`i s! ^#Vr+sn}  ! 6!1! !"5! ! !- ~#fo!k g}o| ! ͥ|,!ͥ+++|,͢! n} D! !ͥ! n&!ͥFile output error; disk full? !"5!c"5Î$!9DM*5Ҳ*5+"5* 5! ~#fo͋`is#r!`i~#fo" 5* 5#|!0u"5* 5! ~#fo͋"5| !*5++"5* 5!9*!9DM`iw#w*5#"5ғ! ~#fo'"5#|d!!"5`i~#fo))1*5|g}o)~#fo`is#r`i~#fo))1*5"5|g}o)~#fo`is#r`i~#fo|8`i~#fo#`is#r`i~#fo!`i~#fo`is#r`i~#fo!9q!!y9DM! `i͐`i>!9M!!9DM`iw#w! 6#6͐ n! s{ ʀ! n} Ž! ^#Vr+sd! n}-­! 6#6! ^#Vr+s! ^#Vr+sn! sJ|͐ ?! nѯg`is#rí͐͐?!9 "9"!9DM! n& |ͣ=! n& |ͣJh"!y9DM! `iD`iG!9uô$!9DM͐!͐rs#rz!͐##w#w͐~#foû!9DM͐͸`is#rz͐͸! s#rz͐?͐8 ! n}3!! ^#Vr+s!3!! ^#Vr+s6 !I!! ^#Vr+s`ins_!! ^#Vr+s`ins@͐6!9w!ø!9DM! ^#Vr+sn`is{!`in} ­!͐! t!͐`in&t!#|!!!!!!!9!9DM! n&0ͯ"! n&9ͯ!9DM! n&Aͯ5"! n&Zͯ!9DM! n&aͯd"! n&zͯn"Ù!9DM͐n}ʘ"! ^#Vr+sn&k"v"à"Ú"!9DM͐͐ "͐^#Vr+s͐ "͐0"͐7s!&;#͐ ͐͐ ͉͐͝"`is͐ ͐͐ )͐͝"`in&#&;#!9J#!!9DM`iw#w͐~#fon&G#}ʗ#͐ ?͐^#Vr+snѯg`is#rX#͐Þ#!9í#9"!9DM! n&ͪ#|#! n&#! n&7:O*o`  !\&!7*!4$&*!D$&4$!, !\&!TELk7u$&#7*^#V#z}$+V+^+ˆ$*l$!$!o$r$Broken pipe 7,2q*&:q):$=$=r:qo&7:)~:,"s!"u*|N%**sS%! ~N%6*u*+"*"*u#"u%w%#ô$7*q%\!*t%7:)~:,"s!"u*|*u&*~#%"*s*u&#"u*+"%7*|DM**R&6&><*&~# x*& > +L'#~:'##.'a{ !p'!*w#b':**y'*!ѷ! , FNxg>Goy'$!7*!4$&*!D$&4$!, !\&!TELk7u$&#7*^#V#z}$+V+^+ˆ$*l$!$!o$r$Broken pipe 7,2q*&:q):$=$=r:qo&7:)9; I/O-CAP.ASM Version 1.0 as of September 13, 1981 ; ; By: Kelly Smith, CP/M-Net ; ; Version 1.0: Initial release by Kelly Smith ; ; Note: Please append any changes to I/O-CAP with a ; 'Version Log' and change comments (your name would be nice ; too) top-down from the initial Version 1.0 release. ; ; Running I/O-CAP (the first time) will relocate the ; CONIN, and CONOUT jump vectors to high memory and then ALL ; subsequent input or output (depending on conditional ; assembly switches) will be buffered (16 sectors) for ; eventual output to disk with a filename and type called ; USER.LOG. This file will then be updated as long as I/O-CAP ; is active in the system. Note: I/O-CAP may be made ; inactive by just type I/O-CAP again, to toggle it off (or ; on). ; ; I/O-CAP requires an unusually LARGE amount of ; relocation memory, because it must buffer the entire CP/M ; system  Used in conjunction with BYE on a remote CP/M ; system, you can finally figure-out how that 'twit' clobbers ; your system from 3000 miles away...and NOT fill a room full ; of paper by logging all input to your printer. Note: Run ; I/O-CAP first, then BYE.COM to 'grab' the vectors set-up by ; the I/O-CAP program.The capture of incoming data will appear ; to be transparent to the user, with a slight pause when it ; updates the USER.LOG file...but this only happens every 2048 ; character entrys, so it should generally go un-noticed. ; ; - Using I/O-CAP - ; ; Examine the various conditional assembly switches and ; set TRUE or FALSE depending on your requirements with your ; editor (ED.COM). Then assemble with ASM.COM (or MAC.COM), ; load it to creat a .COM file and then run. The conditional ; assembly switches allow the following options: ; ; (1) DEBUG - I/O-CAP runs at 8000 Hex...about right for ; most small applications pue equ -1 ; define TRUE false equ not true; define FALSE debug equ true ; define DEBUG quiet equ false ; define QUIET (ring BELL, if not true) errdisp equ true ; define ERRDISP (display errors, if true) quit equ true ; define QUIT (EOF, if Control-Z found) syslog equ false ; define SYSLOG (make USER.LOG a $SYS file) ; ; >>> Note: only one of the following two assembly switches may be true <<< ; input equ false ; define INPUT (I/O-CAP console input) output equ true ; define OUTPUT (I/O-CAP console output) ; if DEBUG dest equ 08000h ; running location of code endif ; DEBUG if not DEBUG dest equ 0c800h ; running location of code endif ; DEBUG ; ; BDOS entry point and function codes ; base equ 0 ; <<-- set to offset of CP/M for your ; system, standard systems are 0, some ; 'alternate' systems are 4200H ; bdos equ base+5 resdsk equ 13 ; reset disk system offc equ 15 ; open file cffc equ 16 ; close file dffc equ 19 ; delete file rrfc equ 20 ; read record wrfc equ 21 ;image to high memory to save and restore all CCP and ; BDOS pointers as it captures each 16 sector block of console ; input or output...crude, but the ONLY other wait to do this ; would be to 'hot-patch' the CCP and BDOS 'on-the-fly' and ; that get's just a bit gruesome from a UNIVERSAL ; applications standpoint...It's much easier to just SYSGEN a ; smaller CP/M system than your actual maximum available ; memory, and then have I/O-CAP relocate itself above your ; BIOS. If anyone has a better way to do this WITHOUT this ; relocation crap, I would be eager to see it...I just got ; frustrated with trying to figure out what CP/M was doing ; internally to pursue it further...local stacks, pointers, ; etc.,...ARGH...so I took the easy way out. ; ; Thanks to Mike Karas for discovering the BDOS CALL ; contention problems when the BDOS stack was not saved and ; restored when saving the console buffer to disk. ; ; rograms that use memory from 100 to ; 7FFF Hex in a 56K CP/M system. If FALSE, I/O-CAP runs above ; a 48K CP/M system (C800 Hex), with no restrictions on ; applications programs. ; ; (2) QUIET - If FALSE, rings the console bell just before it ; writes 2048 bytes of captured console INPUT or OUTPUT. ; ; (3) ERRDISP - If TRUE, I/O-CAP will display an 'OOPS...' ; message on the console if the disk or directory is full. ; ; (4) INPUT - If TRUE, only console keyboard INPUT is ; captured. Note: OUTPUT must be FALSE if INPUT is TRUE. ; ; (5) OUTPUT - If TRUE, both console keyboard INPUT and ; OUTPUT will be captured...uses 'gobs' of disk storage if you ; let I/O-CAP run for any length of time. Note: INPUT must be ; FALSE if OUTPUT is TRUE. ; ; (6) QUIT - If TRUE, when a Control-Z and Carriage Return are ; entered at the console keyboard, I/O-CAP will append the ; USER.LOG file with a physical end-of-file (i.e., no further ; data will be dis write record mffc equ 22 ; make file sdma equ 26 ; set dma address ; ; secondary FCB field definitions ; fn equ 1 ; file name field (rel) ft equ 9 ; file type field (rel) ex equ 12 ; file extent field (rel) frc equ 15 ; file record count (rel) nr equ 32 ; next record field (rel) ; ; ASCII control characters ; cr equ 0dh ; carriage return lf equ 0ah ; line feed bel equ 07h ; bell signal ; ; This program runs up in high ram. It gets there, by being ; moved there when 'I/O-CAP' is typed. Change the following ; equate to an area in your high memory where this program may ; patch itself in. Approximate memory requirements: 2k bytes ; or more, depending upon the options selected. a marker has ; been placed at the end to deliberately print an error ; message during assembly in order to determine the actual ; ending address of the program. The error message will not ; affect the assembly. make sure you have memory available up ; to the address shown.  - Applications - ; ; (1) Don't have a printer, and want 'Hard Copy' of a user ; dialog with the system? Use I/O-CAP to creat it as a disk ; file...for instance, when making patches into 'uncertain' ; areas of the system with DDT (or SID, or whatever) you can ; keep a running history on disk of the patches AND their ; effects. ; ; (2) Need to show example of console dialog for an article ; or book and you don't want to 'hand type' it in? Use I/O-CAP ; to creat the examples for you, and edit the dialog to suit ; your needs. ; ; (3) Need to know all the events in 'history form' leading ; to some bizarre system blow-up? Use I/O-CAP to record that ; history for you (but only if the blow-up is recoverable by ; NOT COLD BOOTING the system). ; ; (4) Want to (secretly) monitor the activities of other ; users of the system? Use I/O-CAP to record user console ; input, and check in from time-to-time to look at the system ; activity.played in USER.LOG although it may be ; physically appended to it)...Note: You must type I/O-CAP ; to CLOSE the current USER.LOG, and reset the disk to normal ; R/W status. Failure to do so will result in a R/O BDOS ; Error on any subsequent attempt to write to the disk by ; means other than I/O-CAP. ; ; (7) SYSLOG - If TRUE, creates USER.LOG as a $SYS (invisible ; to directory) file, so that 'secrecy' is maintained when ; capturing user input...be sure and rename USER.LOG to your ; 'private' name, or replace the TYPE command with MLIST.COM. ; ; Please send any changes, 'bug' reports, suggestions, ; comments, gripes or bitches to the CP/M-Net system, (805) ; 527-9321...have fun with this program. It's in the public ; domain, but NOT TO BE USED for COMMERCIAL BENEFIT. ; ; Best regards, ; ; Kelly Smith, CP/M-Net ; ; ; ; define TRUE/FALSE assembly parameters ; tr9; org base+100h ; ; Move 'I/O-CAP' program up to high ram and jump to it ; lxi h,0 ; save old stack pointer dad sp shld oldstk lxi sp,stack; make a new stack pointer lxi h,tbuf ; set pointer to tbuf shld ptr lxi h,0 ; set size = 0 shld size lhld base+1 ; get BIOS pointer lxi d,5 ; add bias to console status address dad d mov d,m ; save in [d] lhld newjtbl+1 ; see if vector addresses active mov a,h ; been patched by previous execution? cmp d jz unpatch ; un-patch, if so lxi b,pend-start+1 ; number of bytes to move lxi h,dest+pend-start+1 ; end of moved code lxi d,source+pend-start ; end of source code ; mvlp ldax d ; get byte dcx h ; bump pointers mov m,a ; new home dcx d dcx b ; bump byte count mov a,b ; check if zero ora c jnz mvlp ; if not, do some more pchl ; do it, to it... ; source equ $ ; boundary memory marker ; offset equ dest-source ; relocation amount ; ; The following code gets moved to high ram located at "dest", ; where it is ass character to 'old' BIOS vector call conout jmp msgout ; display next character in message string ; ; This area is used for vectoring calls to the user's CBIOS, ; but saving the registers first in case they are destroyed. ; constat equ $+offset push b push d push h call vcstat pop h pop d pop b ret ; conin equ $+offset push b push d push h call vcin pop h pop d pop b ret ; conout equ $+offset push b push d push h call vcout pop h pop d pop b ret ; ; This is the jump table which is copied on top of the one ; pointed to by location 1 in CP/M ; newjtbl equ $+offset jmp constat ; console status test if INPUT jmp capture ; console input I/O-CAP routine endif ; INPUT if OUTPUT jmp conin ; console input routine endif ; OUTPUT if INPUT jmp conout ; console output routine endif ; INPUT if OUTPUT jmp capture ; console I/O-CAP output routine endif ; OUTPUT ; capture equ $+offset push h push d push ; lda fcb+frc ; get record count sta fcb+nr ; make next record lhld size ; [de] = tbuf size xchg lxi h,dbuf ; top of stack points to dbuf push h lxi h,tbuf ; [hl] points to tbuf ; wtb1: equ $+offset mvi c,128 ; disk buffer size ; wtb2: equ $+offset mov a,m ; fetch next byte of tbuf inx h xthl mov m,a ; store in dbuf inx h xthl dcx d ; size = size - 1 mov a,d ; exit loop if size = 0 ora e jz wtb3 dcr c ; loop until dbuf full jnz wtb2 call setdma ; set dma to dbuf call write ; write full dbuf to disk push psw ; save possible error code lda fcb+frc ; get record count sta fcb+nr ; make next record pop psw ; get possible error code ora a ; check CP/M return code jz nextbuf if ERRDISP lxi h,dskful; oops...disk is full call msgout endif ; ERRDISP jmp base ; nextbuf equ $+offset ; xthl ; top of stack points to dbuf lxi h,dbuf xthl jmp wtb1 ; loop until end of tbuf ; wtb3: equ $+offset pop h ; [hl] points to current place in executed. C A U T I O N : if modifying anything ; in this program from here on: ALL labels must be of the form: ; ; label equ $+offset ; ; ...in order that the relocation to high ram work ; successfully. Forgetting to specify '$+offset' will cause ; the program to jmp into whatever is currently in low memory, ; with unpredictable results. Be careful.... ; start equ $+offset ; ; patch in the new jump table (saving the old) ; patch equ $+offset call tbladdr ; calc [hl] = CP/M jmp table lxi d,vcstat ; point to save location call move ; move it ; ; now move new jump table to CP/M ; call tbladdr ; calc [hl] = CP/M's jmp table xchg ; move to de lxi h,newjtbl ; point to new call move ; move it lxi h,active$message call msgout lhld oldstk ; get old CP/M stack pointer sphl ret ; unpatch equ $+offset call reset ; reset disk in case it's R/O lxi h,inactive$message call msgout call tbladdr ; [hl] = CP/M's jmp table xchg ; move to de b lxi h,0 ; save old stack pointer dad sp shld oldstk lxi sp,stack; make a new stack pointer if INPUT call vcin ; get console input mov c,a ; save in [c] for 'save' push psw ; and save on the stack endif ; INPUT call save ; save characters in buffer if INPUT pop psw ; get console input of the stack endif ; INPUT lhld oldstk ; get old CP/M stack pointer sphl pop b pop d pop h if OUTPUT jmp vcout endif ; OUTPUT if INPUT ret endif ; INPUT ; save: equ $+offset lhld size ; size = size + 1 inx h shld size lhld ptr mov m,c inx h if INPUT mov a,c cpi cr ; carriage return? jnz notcr mvi m,lf ; yes, so add line feed because CP/M does not inx h ; bump pointer, for next time thru endif ; INPUT notcr equ $+offset; make label for next instruction... if QUIT mov a,c cpi 'Z'-40h ; control-Z? jz wtb ; write buffer, if so endif ; QUIT shld ptr lxi d,endmark ; get 'endmark' for buffer top address mov a,d cdbuf ; wtb4: equ $+offset mvi m,'Z'-40h ; store eof code inx h dcr c ; loop thru rest if dbuf jnz wtb4 call setdma ; set dma to dbuf call write ; write last sector to disk push psw ; save possible error code lda fcb+frc ; get record count sta fcb+nr ; make next record pop psw ; get possible error code ora a ; check CP/M return code jz closeup if ERRDISP lxi h,dskful; oops...disk is full call msgout endif ; ERRDISP jmp base ; closeup equ $+offset ; call close ; clean up act and go home lxi h,tbuf ; clear text buffer shld ptr lxi h,0 shld size wtb5: equ $+offset lhld base+6 ; get warm boot address for next bias to CCP lxi d,0fffah; make bias to CCP dad d ; add bias to [hl] lxi b,1600h ; make quantity to move lxi d,cpmbuf; buffer all of CP/M system xchg ; swap call movecpm ; move it... ret ; ; reset - reset disk ; reset: equ $+offset push h push d push b mvi c,resdsk call bdos pop b pop d pop h ret ; ; open - open lxi h,vcstat ; get saved table call move ; move orig back lhld oldstk ; get old CP/M stack pointer sphl ret ; ; calculate [hl] = CP/M's jump table, [b] = length ; tbladdr equ $+offset lhld base+1 ; get BIOS pointer inx h ; ..skip inx h ; ..to inx h ; ..console status mvi b,9 ; move console jump vectors ret ; ; move [hl] to [de], length in [b] ; move equ $+offset mov a,m ; get a byte stax d ; put at new home inx d ; bump pointers inx h dcr b ; decrement byte count jnz move ; if more, do it ret ; if not, return ; ; move [hl] to [de], length in [bc] ; movecpm equ $+offset mov a,m ; get a byte stax d ; put at new home inx d ; bump pointers inx h dcx b ; decrement byte count mov a,b ora c jnz movecpm ; if more, do it ret ; if not, return ; msgout equ $+offset mov a,m ; get character from message string ora a ; all of string displayed? rz ; return, if so inx h ; no, bump pointer for next character mov c,a ; pmp h ; getting near the end of buffer yet? rnz ; if not, just return mov a,e ; very near the top now, final address loaded? cmp l rnz ; if not, just return if not QUIET mvi c,bel ; warn user that we need to write to disk call conout endif ; QUIET ; ; wtb - write text buffer to disk ; wtb: equ $+offset lhld base+6 ; get warm boot address for next bias to CCP lxi d,0fffah; make bias to CCP dad d ; add bias to [hl] lxi b,1600h ; make quantity to move lxi d,cpmbuf; buffer all of CP/M system call movecpm ; move it... call reset ; reset disk in case it's R/O call open ; attempt to open USER.LOG inr a ; check CP/M return code jnz makeok ; USER.LOG already exist? ; nolog: equ $+offset ; call make ; make new file inr a ; check CP/M return code jnz makeok if ERRDISP lxi h,dirful; oops...can't make file, return to CP/M call msgout endif ; ERRDISP jmp base ; ; USER.LOG exists, so set the FCB entry for next append to file ; makeok: equ $+offset : disk file ; open: equ $+offset push h push d push b lxi d,fcb mvi c,offc call bdos pop b pop d pop h ret ; ; read - read record from disk file ; read: equ $+offset push h push d push b lxi d,fcb mvi c,rrfc call bdos pop b pop d pop h ret ; ; close - close disk file ; close: equ $+offset push h push d push b lxi d,fcb mvi c,cffc call bdos pop b pop d pop h ret ; ; delt - delete disk file ; delt: equ $+offset push h push d push b lxi d,fcb mvi c,dffc call bdos pop b pop d pop h ret ; ; write - write record to disk ; write: equ $+offset push h push d push b lxi d,fcb mvi c,wrfc call bdos pop b pop d pop h ret ; ; make - make new disk file ; make: equ $+offset push h push d push b lxi d,fcb mvi c,mffc call bdos pop b pop d pop h ret ; ; setdma - set dma address for disk file ; setdma: equ $+offset push h push d push b lxi d,dbuf mvi c,sdma call bdos pop b pop d pop h ret ; if ERRDISP dskful: equ $+offset db cr,lf,bel,'OOPS...disk is full!',0 ; dirful: equ $+offset db cr,lf,bel,'OOPS...directory is full!',0 endif ; ERRDISP ; active$message equ $+offset db ' (Active)',0 ; inactive$message equ $+offset db ' (Inactive)',0 ; fcb equ $+offset db 0 ; default drive specifier if SYSLOG db 'USER L','O'+80h,'G' endif ; SYSLOG if not SYSLOG db 'USER LOG' endif ; SYSLOG db 0,0,0,0,0,0,0,0,0,0 ; pend equ $+offset; end of relocated code ; ; data area ; ds 128 ; 64 level stack stack equ $+offset;local stack ; ptr: equ $+offset ds 2 ; text buffer pointer ; size: equ $+offset ds 2 ; text buffer size ; ; Save the CP/M jump table here ; vcstat equ $+offset ds 3 ; vcin equ $+offset ds 3 ; vcout equ $+offset ds 3 ; oldstk equ $+offset ds 2 ; storage for old CP/M stack pointer ; cpmbuf equ $+offset ds 1600h ; storage CP/M system image ; dbuf equ $+offset ds 128 ; secondary disk buffer address ; tbuf: equ $+offset ds 16*128 ; I/O-CAP storage for 16 sectors (2048 bytes) ; endmark equ $+offset;! ignore error - this marks end of program ; end ,0 ; inactive$message equ $+offset db ' (Inactive)',0 ; fcb equ $+offset db 0 ; default drive specifier if SYSLOG db 'USER L','O'+80h,'G' endif ; SYSLOG if not SYSLOG db 'USER LOG' endif ; SYSLOG db 0,0,0,0,0,0,0,0,0,0 ; pend equ $+offset; end of relocated code ; ; data area ; ds 128 ; 64 level stack stack equ $+offset;local stack ; ptr: equ $+offset ds 2 ; text buffer pointer ; size: equ $+offset ds 2 ; text buffer size ; ; Save the CP/M jump table here ; vcstat equ $+offset ds 3 ; vcin equ $+offset ds 3 ; vcout equ $+offset ds 3 ; oldstk equ $+offset ds 2 ; storage for old CP/M stack pointer ; cpmbuf equ $+offset ds 1600h ; storage CP/M system image ; dbuf equ $+offset ds 128 ;:!9""1":m2$2%2 "(}a 2%:)a/ :% O>1:% 0C >2!\~r<2\@2!]~ ‰ 6?#‚>?2h:\=_2\:(##~2#~2##^#V"#^#V"*.;^#~2#~2#^""#)+""*{zҫ\ ͎E**y**{ozgEE**#{z*!+"!""*+}ʝ ʁ*> b##"*+"k*^#V#" >  ^#~))))!o&:/o*"*#" >k*+}P" k2*&&&>002(x0J:*>0:2*2 *  *  *#ڑW+}ʢzŒÈi`:ʱ)=¬   : Total of $k in $ files with $k space remaining.$>:> _~# *. ͜:<3C 2> >  (Strike any key to continue)$^#V#N#F_ #wl)) ) Nq#Nq)) ) N#F^#V_ #   2{*"\ ͎E**y**{ozgEE**#{z*!+"!""*+}ʝ ʁ*> b##"*+"k*^#V#" >  ^#~))))!o&:/o*"*#" >k*+}P" k2*&&&>002(x0J:*>0:2*2 *  *  *#ڑW+}ʢzŒÈi`:ʱ)=¬   : Total of $k in $ files with $k space remaining.$>:> _;; Program to recover Erased file ; ; From Interface Age December 1981 pg 98+ ; ; I didn't type in ALL the comments, so be sure to read the article ; and the printed program listing in the magazine ; ; ; Proper credit given to original author: ; ; Gene Cotton ; ; All I did was to type this in from the magazine ; Hopefully without added any typing errors ; ; HBR Version 1.0 as of 11/17/81 ; ; Henry B. Rothberg ; 4 Laticrete Park North ; Bethany, Ct 06525 ; ; VERSION 1.1 AS OF 11/19/81 ; ; ADDED CONDITIONAL EQUATES FOR CP/M 1.4 AND 2.2 ; AS WELL AS EQUATES FOR STANDARD CP/M AND MICROPOLIS ; CP/M (DIFFETHRENT SECTOR SKEW TABLES) ; ; BRUCE E. BLAKESLEE ; 906 CRESTWOOD ROAD - WEST ; WESTFIELD, N.J. 07090 ; ; FALSE EQU 0 ;BASIC DEFINITIONS TRUE EQU NOT FALSE ; CPM1 EQU FALSE CPM2 EQU TRUE ; STNDRD EQU FALSE MICROP EQU TRUE ; ; BOOT EQU 0 ;CP/M warm boot BDOS EQU 5 FCB EQU BOOT+5CH ; ORG 100H JMP STACK ; IF CPM1 BLN DB 42 ;CP/M 1.4 ENDIF ; IF CPM2 BLN ECKS THE CURRENT 4 DIR ENTRIES ; ; CHKENT XRA A STA REWRT MVI B,4 LXI H,80H CKLUP MOV A,M CPI 0E5H JNZ CKINC PUSH H CALL COMPAR POP H JNZ CKINC MVI M,0 MVI A,0FH STA REWRT LDA FIXCNT INR A STA FIXCNT CKINC LXI D,32 DAD D DCR B JNZ CKLUP LDA REWRT ORA A JZ CKDONE ; ; WRITE THE DIRECTORY SECTOR BACK TO THE DISK ; LDA TRACK MOV C,A MVI B,0 CALL SETTRK LDA SECTOR MOV C,A CALL TRANSLT MVI B,0 CALL SETSEC CALL WRITE ORA A JNZ ERRWRT CKDONE LDA DIRMAX DCR A STA DIRMAX LDA SECTOR INR A STA SECTOR RET ; ; COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT ; COMPAR INX H LXI D,FCB+1 XCHG MVI C,11 CMPR1 LDAX D ANI 7FH CMP M RNZ INX D INX H DCR C JNZ CMPR1 RET ; ; GENERAL PURPOSE MOVE ROUTINE ; MOVE MOV A,M STAX D INX D INX H DCR B JNZ MOVE RET ; ; SHIFT REGS HL RIGHT 2 BITS ; SHFTHL2 CALL SHFTHL SHFTHL XRA A MOV A,H RAR MOV H,A MOV A,L RAR MOV L,A RET ; ; GENERAL PUDB 48 ;CP/M 2.2 ENDIF ; HMSG DB 13,10,'Unerase Version 1.1 (11/19/81) (CP/M Version $' MSG22 DB '2.2)',13,10,'$' MSG14 DB '1.4)',13,10,'$' ; ORG 200H ;Good place to start program ; STACK LXI SP,STACK ;Set stack pointer CALL HELLO CALL PCHECK CALL TRYFIX CALL BYE JMP BOOT ; ; Say who we are ; HELLO LXI D,HMSG CALL PRINT RET ; ; Check for valid parimeters and say which cp/m version ; PCHECK CALL FCBCHK CALL CPMCHK RET ; ; Look thru directory ; TRYFIX CALL NXTSECT RZ CALL CHKENT JMP TRYFIX ; ; Sign off & reset system ; BYE MVI C,13 CALL BDOS LDA FIXCNT ORA A JZ NOFIND LXI D,BMSG CALL PRINT RET ; NOFIND LXI D,NFMSG CALL PRINT RET ; ; Make sure a legal filename is spec'd ; FCBCHK LDA FCB ORA A JNZ FCBCK1 MVI C,25 CALL BDOS INR A ; FCBCK1 DCR A STA FCB LDA FCB+1 CPI ' ' RNC ; ; IF NO FILE NAME IS SPEC'D, ABORT WITH NOTICE ; LXI D,NOFMSG CALL PRINT JMP BOOT ; ; CHECK FOR CP/M VERSION AND SET RPOSE PRINT ROUTINE ; PRINT MVI C,9 JMP BDOS ; ; SPEC'D ILLEGAL DISK, SO ABORT ; ILDISK LXI D,ILMSG CALL PRINT JMP BOOT ; ; ERROR DURING DISK WRITE ; ERRWRT LXI D,WMSG CALL PRINT JMP BOOT ; ; TRANSLATE REG C FROM LOGICAL TO PHYSICAL SECTOR # ; TRANSLT LHLD DPH XCHG CALL SECTRAN MOV C,L RET ; ; THIS IS WORKING COPY OF BIOS TABLE ; ; ; WBOOT DS 3 CONST DS 3 CONIN DS 3 CONOUT DS 3 LIST DS 3 PUNCH DS 3 READER DS 3 HOME DS 3 SELDSK DS 3 SETTRK DS 3 SETSEC DS 3 SETDMA DS 3 READ DS 3 WRITE DS 3 LISTST DS 3 SECTRAN JMP STRAN ; ; ; ; ; RETURNS PHYSICAL SECTOR # ; STRAN MVI B,0 XCHG DAD B MOV L,M RET ; ; ADDRESS OF TRANSLATE TABLE ; DPH DW XLT0 DS 14 ; ; THIS IS STANDARD TRANSLATE TABLE ; IF STNDRD XLT0 DB 1,7,13,19,25,5,11,17,23,3,9,15,21 DB 2,8,14,20,26,6,12,18,24,4,10,16,22 ENDIF ; ; SECTOR TRANSLATE TABLE FOR MICROPOLIS ; MOD II ; IF MICROP XLT0 DB 1,2,11,12,21,22,31,32 DB 9,10,19,20,29,30,7,8 DB 17,18,27,28,5,6,15THINGS ; CPMCHK LXI D,80H MVI C,26 CALL BDOS MVI C,12 CALL BDOS CPI 20H MVI A,42 LXI D,MSG14 CNC CPM22 STA BLN CALL PRINT CALL GETBIOS ; ; SELECT DISK AND SETUP DISK PARAM HEADER ; LDA FCB MOV C,A MVI B,0 CALL SELDSK MOV A,H ORA L JZ ILDISK LDA BLN CPI 48 RC MOV E,M INX H MOV D,M XCHG SHLD DPH RET ; ; IF CP/M 2.2 DETERMINE # OF DIRECTORY ENTRIES ALSO ; CPM22 MVI C,31 CALL BDOS LXI D,7 DAD D MOV E,M INX H MOV D,M XCHG INX H CALL SHFTHL2 MOV A,L STA DIRMAX LXI H,5 DAD D MOV A,M STA TRACK MVI A,48 LXI D,MSG22 RET ; ; GET BIOS JUMPS VECTORS FOR EASY REFERENCE ; GETBIOS LHLD BOOT+1 LXI D,WBOOT LDA BLN MOV B,A CALL MOVE RET ; ; READ NEXT SECTOR (GROUP OF FOUR DIRECTORY ENTRIES) ; RETURNS WITH ZERO FLAG SET IF NO MORE ; NXTSECT LDA DIRMAX ORA A RZ LDA TRACK MOV C,A MVI B,0 CALL SETTRK LDA SECTOR MOV C,A CALL TRANSLT MVI B,0 CALL SETSEC CALL READ ANI 1 XRI 1 RET ; ; CH,16 DB 25,26,3,4,13,14,23,24 ENDIF ; ; WORKING STORAGE FOLLOWS ; DIRMAX DB 16 ; TRACK DB 2 ; SECTOR DB 0 ; FIXCNT DB 0 ; REWRT DB 0 ; WMSG DB 10,13,'Error occured during disk Write - ABORT$' ; ILMSG DB 10,13,'Specified an illegal disk drive - ABORT$' ; BMSG DB 10,13,'Recovered - Please DOUBLE CHECK before using$' ; NOFMSG DB 10,13,'No File Name specified - ABORT$' ; NFMSG DB 10,13,'File NOT found$' ; END 100H TDMA DS 3 READ DS 3 WRITE DS 3 LISTST DS 3 SECTRAN JMP STRAN ; ; ; ; ; RETURNS PHYSICAL SECTOR # ; STRAN MVI B,0 XCHG DAD B MOV L,M RET ; ; ADDRESS OF TRANSLATE TABLE ; DPH DW XLT0 DS 14 ; ; THIS IS STANDARD TRANSLATE TABLE ; IF STNDRD XLT0 DB 1,7,13,19,25,5,11,17,23,3,9,15,21 DB 2,8,14,20,26,6,12,18,24,4,10,16,22 ENDIF ; ; SECTOR TRANSLATE TABLE FOR MICROPOLIS ; MOD II ; IF MICROP XLT0 DB 1,2,11,12,21,22,31,32 DB 9,10,19,20,29,30,7,8 DB 17,18,27,28,5,6,15;; title 'PASSWORD.ASM' ; page 60 ; ; ; PASSWORD.ASM Version 1.0 ; By Bo McCormick 8/6/81 ; ; This is a program that adds password protection ; to programs. Format: ; ; PASSWORD name_of_file ; ; Then answer the prompt with the password to be ; applied to the program: ; ; Password : enter password here ; ; If everything goes well, the program will be saved to disk. ; If not, a message is printed and control is passed ; to the CCP. ; ; The good part of this is, when you type in the program ; program name next time, instead of running the program ; right away, the program asks you for the password. If you ; reply with something other than the original password, the ; program doesn't run, and it returns to the ccp. ; ; ;EQUATES mesout: equ 9 ;BDOS functions incon: equ 10 open: equ 15 close: equ 16 delete: equ 19 read: equ 20 write: equ 21 setdma: equ 26 ; cr equ 0dh ;ascii values lf equ 0ah eos equ '$' ; boot equ 0 ;0 for standard CP/M ;4200H for ALT. CP/n call bdos ;print it lxi d,defbuf ;point to default buffer mvi a,8 ;tell CP/M max chars stax d ;put it there mvi c,incon ;READ LINE command call bdos ;do it lxi h,defbuf+1 ;point to length lxi d,password-offset ;point to storage lda defbuf+1 ;get length ana a ;set flags jz gpasag ;if 0 then ask again inr a ;plus 1 for length byte mov b,a ;put length in B mploop mov a,m ;get char stax d ;save it inx h ;increment pointer inx d ; " " dcr b ;decrement length jnz mploop ;if not zero, then next char xra a ;zero a sta fcb+12 ;zero bytes in FCB sta fcb+14 sta fcb+32 mvi c,open ;OPEN file command lxi d,fcb ;point to FCB call bdos ;open the file lxi d,n$start ;point to new program start ; push d w$loop1 pop d ;get DMA push d ;put it back on stack mvi c,setdma ;SET DMA command call bdos ;tell CP/M lxi d,fcb ;point to FCB mvi c,write ;WRITE SECTOR command call bdos ;do it pop h ;get DMA address from stack lxi d,xi d,newbuf+1 ;point to user's input mov b,m ;get length ; c$lp equ $+offset ldax d ;get char cmp m ;are they the same? jnz boot ;if not, restart inx h ;point to next characters inx d ; " " " " dcr b ;decrement length jnz c$lp ;if not done, then loop ; ; Now we move a segment of code to a part of the default ; buffer. This segment moves the actual program down to the ; TPA ; lxi h,n$mv ;point to code lxi d,defbuf+20h ;point to new postion mvi b,n$m$len ;length ; move equ $+offset mov a,m ;get byte stax d ;save it inx d ;point to next addresses inx h ; " " " " dcr b ;decrement length jnz move ;if not done, loop jmp defbuf+20h ;go to segment ; n$mv equ $+offset ;segment that gets moved lhld old$stack ;get stack pointer push h ;save it on stack lxi h,buffer ;get start of actual program mov a,h ;We have to compute the length cma ;and because X-Y equals mov d,a ;X + Two's complent(Y), we have mov a,l ;to find tM; bdos equ boot+5 fcb equ boot+5ch defbuf equ boot+80h tpa equ boot+100h stack equ tpa ; org tpa ; ; start: lxi h,0 ;save stack pointer dad sp ;put stack in hl shld old$stack-offset ;save it lxi sp,stack ;get new stack ; ; stack saved so program can return to CCP without ; intervening warm start. ; lda fcb+9 ;get first char of extension cpi ' ' ;if ' ' then change to .COM jz no$type cpi 'C' ;If there is an extension, jnz not$right ;make sure it's .COM lda fcb+10 ;check second letter cpi 'O' jnz not$right lda fcb+11 cpi 'M' ;last letter jz is$com ;if it is a COM, then cont. not$right: call end$mes ;it's not a com file, so tell ; db cr,lf,'Must be a command (.COM) file' db cr,lf,eos ; end$mes: pop d ;get address of message mvi c,mesout ;PRINT STRING command call bdos ;print error message ; finish: lhld old$stack-offset ;get old stack sphl ;put it in HL ret ;return to CP/M ; no$type mvi a,'C' ;if there was space, change sta80h ;length of sector dad d ;HL has new DMA push h ;put it on stack mov a,h ;this is to get 2's complement cma ;of address. We are subtracting mov d,a ;the current address from the mov a,l ;high address. If the high byte cma ;<1 , we are done mov e,a ; inx d ;Now 2's comp. of address in DE lhld end$prog-offset ;get ending address dad d ;Subtract (add 2's comp) mov a,h ;get high byte inr a ;is it FF (-1)? ana a ;set flags jnz w$loop1 ;if not, write another sector ; mvi c,close ;That's it. Close the file lxi d,fcb ;point to FCB call bdos ;do it jmp finish ;goto finish ; ; n$start: offset equ 100h-n$start ; ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; %% WARNING - %% ; %% From now on, all labels are in %% ; %% the form: %% ; %% LABEL EQU $+OFFSET %% ; %% This is to allow the program to run at100H he 2's comp. of the cma ;first address mov e,a ; inx d ;Y is in DE lhld end$prog ;get last address dad d ;subtract (add 2's comp) mov b,h ;put length in BC mov c,l ; " " " " lxi d,tpa ;point to TPA lxi h,buffer ;point to first address n$m$lp equ defbuf+20h+$+offset-n$mv mov a,m ;get byte stax d ;save byte inx h ;increment address inx d ; " " dcx b ;decrement length mov a,b ;check for zero left ora c ;Are we done? jnz n$m$lp ;if not, loop some more pop h ;get stack from stack sphl ;put stack in SP jmp tpa ;run program ; n$m$len equ $+offset-n$mv ;length of segment ; ; password equ $+offset ;password storage db 0,' ' ; newbuf equ $+offset ;Users input buffer db 10H,0,' ' ; old$stack equ $+offset ;place for stack ds 2 ; end$prog equ $+offset ;place for address ds 2 ; buffer equ $+offset ;where actual program goes end  fcb+9 ;to COM mvi a,'O' sta fcb+10 mvi a,'M' sta fcb+11 ; is$com mvi a,0 ;zero record count sta fcb+32 mvi c,open ;OPEN file command lxi d,fcb ;load address of FCB in DE call bdos ;Open file inr a ;successful? jnz open$ok ;if so, then continue call end$mes ;if not, then tell ; db cr,lf,'Cannot open file',cr,lf,eos ; open$ok lxi d,buffer-offset ;point to where program goes r$loop: mvi c,setdma ;SET DMA command push d ;save it call bdos ;and tell CP/M lxi d,fcb ;point to FCB mvi c,read ;READ sector command call bdos ;do it pop d ;get DMA address back ana a ;EOF? jnz done$read ;if so, then ask for password lxi h,80h ;length of sector dad d ;bump DMA xchg ;put new address in DE jmp r$loop ;and read some more ; done$read: xchg ;dma ==> hl shld end$prog-offset ;save last address gpasag call get$pas ;print password message ; pas$mes db 'Password: ',eos ; get$pas pop d ;get address of message mvi c,mesout ;PRINT STRING functio%% ; %% when it is saved by the earlier portion. %% ; %% ALL new labels added MUST be in the form %% ; %% LABEL EQU $+OFFSET for this program to work %% ; %% properly. %% ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ;This is portion of the program is placed at the beginning ;of the program to be PASSWORDed. When it is executed, it will ;ask for a password. If the password is incorrect, the program ;warm starts. If the password is correct, the program is moved ;to the TPA and executed. ; lxi h,0 ;save stack pointer dad sp ;stack is in HL shld old$stack ;save it lxi sp,stack ;get new stack call ot$pw ;print password message ; db cr,lf,'Password :' db eos ; ot$pw equ $+offset pop d ;get address of message mvi c,mesout ;PRINT STRING command call bdos ;print it lxi d,newbuf ;point to input buffer mvi c,incon ;READ LINE command call bdos ;read it ; lxi h,password ;point to actual password l< DCON DOCUMENTATION ================== ver 1.1 updated 08/27/81 by "R" --"Who was that Masked Man?" --"Didn't he write Sex & the Single Guy?" --"Naw, he was one of the President's Men". -------------------------- Version 1.1 update: Several bugs have been repaired in version 1.1, along with the addition of a couple of new features, and some minor changes in display formatting. 1) An index register initialization error has been corrected. Under certain circumstances, this caused a random write into (usually) low memory when the program was first loaded. 2) A bug in the expression analyzer has been corrected. This caused an error whenever a quoted character was used within an expression. For example, the command: H'A' under 1.0 would cause an error message. The 'A' will now be inter- preted as its correct hex value. 3) An error in the relocation logic caused DCON to relocate itself 2K lower in  with these debuggers with a few exceptions, detailed under "Upgraded Features". DCON's extended features include a more powerful expression evaluator, a "search" facility with wildcards, a "verify" command, Z80 instructions, settable display modes, I/O port access, CP/M2 "USER" support, and more powerful use of previously available facilites. Note that DCON is NOT public domain! Much of the code is proprietary to Digital Research. Hence, DCON should only be distributed to LEGAL owners of SID and ZSID. B) Upgraded Features ==================== The following features of SID and ZSID have been extended/changed: 1) The "/" symbolic operator (for "qualified symbols") has been changed to "%" in order to accomodate the use of "/" as the division operator in mathematical expressions. 2) The "D" command format retains the structure of that used with SID (16 bytes of hex dump followed by 16 ascii characters). ZSID's rather clumsy "ascii-under-the-hex" format has been C) Expression evaluator ======================= The expression evaluator has been significantly upgraded to allow new operations: 1) The multiplication ("*") and division ("/") operators are now allowed in any expression. Their precedence is one level higher than addition and subtraction. 2) The precedence of operations may be changed by using parentheses. For example, 2*3+4 will evaluate to 10, whereas 2*(3+4) will result in 14. 3) The indirect-word operator "@" has been extended to include the entire expression to the right of the op- erator; this operator formerly had effect only on sym- bols. For example, if location 5 contains a jump to 0DC06H, the command "D6" will display memory from loc. 6 onward, where "D@6" will display starting at DC06H. 4) The indirect-byte operator has been similarly extended. 5) The radix may be specified ahead of a numeric constant using the "^" operator. For example, "^H40" can be used tomemory than necessary. This has been corrected, resulting in an additional 2K of memory space for debugging programs. 4) A CPU ID test is made before the program begins relocating. If it is determined that the CPU is not a Z80, an error message is printed, and control returns to CP/M. 5) A new load option has been added to enable the user to specify the execution address of DCON. This is done by appending a specifier option of the form ":=
" to the command line (this must be the last item on the command line). If
is omitted, DCON will relocate to just below the CCP. Examples: A>DCON :=5000 ;relocate DCON to 5000, no other args A>DCON MYPROG := ;load MYPROG, reloc to just under CCP A>DCON FOO.COM FOO.SYM :=7D00 ;load FOO.COM and FOO.SYM, ;reloc DCON to 7D00H In no case will ":=" be interpreted as a file to load. Also,
must be be on a page boundary, or the message: ++ Reloc Ignore eliminated. 3) The assembler/disassembler module is compatible with neither (see next section). 4) A bug that existed in ZSID through at least version 1.4 has been corrected. Specifically, this bug caused improper operation when tracing relative jumps (sign bit of the argument byte was improperly added to the program counter). 5) The stack-reference operator has been changed from the circumflex character ("^") to the dollar sign ("$") in order to accomodate the input radix specifier. (The stack operator was an undocumented feature of SID 1.4 -- see under "Expression Evaluator") 6) The "List Symbols" command ("H" with no arguments) now places four symbols on a line. 7) The "M" (move memory) command has been extended to allow over- lapping areas of memory to be moved. 8) The "S" command will now "back up"; if you enter a "-" character (must be on the line by itself), the "S" pointer will be decremented and the previous location specify hexadecimal 40, "^D40" will spec- ify decimal 40, and "^B0101" specifies binary 0101 (dec- imal 5). Note that the "#" prefix is retained as a decimal specifer. Also, if no modifier is present, hex is assumed. 6) The stack may be referenced within an expression with the "$" symbol, which will retrieve stack items one level deep for each occurence of the symbol. For example, sup- pose the stack contains the following: 0D30H, 7206H, 6903H. Then "D$" will display starting at 0D30H, "G$$+1" will transfer control to location 7207H, and "H$$$" will display 6903H. This was an undocumented feature of SID version 1.4 (the symbol was "^"). D) New Commands =============== The following new commands have been added: 1) QUERY ("Q"): this is used to "query" I/O ports. The formats are: a. QIp - query inport port p, where p is any expression evaluating to 255 or less. b. QI - query the last input port accessed with the "QI" d ++ will be printed, and DCON will load as if no relocation had been specified. DCON will acknowledge the relocation by printing a "*" char- acter in the sign-on after its name. NOTE: DCON is not designed to operate above the TPA. Un- predictable operation may result if DCON is loaded outside the TPA. -------------------------- Documentation for version 1.0: DCON is a new debugger for the CP/M series of operating systems. This document is an attempt to explain DCON's operation, and differences that exist between it and SID and ZSID (DCON's mother and father, respectively). For proper understanding of this document, you'll need a copy of the SID User's Manual; this document explains only the added features and commands. A) Overview =========== DCON is a direct descendent of SID and ZSID, two debuggers for the 8080/Z80 family, from Digital Research. DCON's powers are a superset of those debuggers. It's command set retains upward compatibility will be opened. B) Z80 operation ================ The debugger has been upgraded to allow interpretation of Z80 opcodes. The format used for the assembler/disassembler module is that used by the TDL/XITAN/CDL/PASM series of assemblers, with one change:the index regesters are referenced by "[+offset]" rather than the "offset()" used by these assemblers. For example, loading reg. B from index register "X" offset by 6 would be "MOV B,[IX+06]" rather than "MOV B,6(X)", as it would be with the TDL series assemblers. Note that the leading zero in the offset constant is required. All Z80 instructions are understood by the trace commands, "T" and "U". Further, the Z80 registers are displayed in a two-line format, with the 8080 subset on the first line. This is similar to ZSID's display, except that the second line (Z80-specific registers only) can be disabled under command control (see under "New Commands"). I may someday add a ZILOG format assembler/disassembler module. < command. DCON's response is "pp=vv", where "pp" is the port number referenced. This is to remind you of the last port number accessed. Note that if no port has been previously accessed, port #0 is assumed. c. QOp,v - send the value "v" out to port # p 2) VERIFY ("V"): used to compare memory blocks. The format is Vs,e,d where s is the source address, e is the end of the source block, and d is the destination block to be compared to the source. If the two blocks match exactly, DCON will simply return to command level. Otherwise a list of the diffences will be printed. 3) SEARCH ("Y"): used to search for a string of up to 16 bytes/chars. The formats used are: YBs,e - set "s" as the search lower boundary, and "e" as the upper. Only this area will be searched. These value are initially set to include the entire TPA. Y - specifies the string to search for. This can be a quoted string, as "currently) two "extended" commands, prefixed by the letter "E". a. USER ("EU"): changes/queries the CP/M 2.x user number. (not available under CPM 1.4 and 1.3). The format is EUn where n is the DECIMAL CONSTANT to set the user number to. If n is omitted, the current user number will be displayed. b. MODE ("EM"): there are (currently) two display modes supported - register display and trace display. The register display is normally two lines of registers, with the 8080 subset on the first line, the Z80 primes and index registers on the second line, followed by the PC and disassembled instruction. The command "EMR" can be used to toggle between this format and an abbreviated format consisting of only the 8080 register subset and the PC with disassembled instruction. Trace mode refers to WHEN the registers are displayed during tracing. The default condition for tracing is 1) display the registers lease address all comments to "BUG-DCON" on the Clearinghouse system (I'm not the Sysop there, but I do check in there frequently). Include this name in both the "TO" field and the "SUBJECT" field, so I can find it easily. "R" 08/18/81 . Include this name in both the "TO" field and the "SUBJECT" field, so I can find it easily. "R" 08/18/81eless) options to commands existed under SID and ZSID version 1.4, and have been retained in DCON for no particular reason. 1) -L removes the assembler/disassembler module from the program. This is not reflected in the location at BDOS+1. This also happens whenever the assembler/disassembler module is overlaid with a user program. 2) -D suppresses the ascii portion of "D" lines. F) Commants, Suggestion, Bug Fixes ====-============================= Comments and suggestions from remote CP/M operators and other SID/ZSID users/owners are welcomed. I must, however, maintain my anonymity. Therefore, pYfoobar". It can also be made up of an expression list; for example, YC3,04,02,'B',#213,^B010101101. Strings and expr- essions can be intermixed. The "?" character can be used to specify a wild-card (matches anything). Note that lower-to-upper case translation is suppressed within quoted strings. YW - as above, except expressions are interp- reted as word values (quoted strings are still considered bytes. Y - Find next occurence of previous search string. In general, Y will find the first occurence of the search string, and display the matched string for a length of 16 bytes using the format of the "D" command. To find subsequent occurences, use more "Y" commands without arguments. When no reply is given, the search area contains no more occurences of the string. A subsequent "Y" will reset the search parameters to the beginning of the search area (i.e., the search will start over) 2) trace the instruction 3) print *PC 4) return to DCON command level The disadvantage of this is that you can never see the instruction that's about to be traced without using the "L" (list) command. By using the command, "EMT", you can toggle between this "normal" mode, and a mode where the following sequence occurs: 1) trace the instruction 2) print *PC 3) display updated registers. 4) return to DCON command level In this way, you always see the instruction that's about to be executed, rather than one that has already been executed. "EM" without arguments displays the current modes. Note also that these modes may be set up as defaults by patching the byte at location 204H as follows: X X X X X X X X 7 6 5 4 3 2 1 0 \ / | | \ / | | unused | .--> 0= full reg display bits | 1= 8080 subset only | .----> 0= display before tracing . The special forms "-Y" and "-Y" will suppress printing of the ascii equivalent of the found search string. The search string is not modified by the "YB" form. Some examples should illustrate the power of the search command: -- Y300,.TOPMEM sets search area to start at 300H and end at the value of the symbol .TOPMEM. -- YCD,?,?,"ZOT",CD,?,?,C3 will search for any call instruction (CD) followed by the string "ZOT", followed by another call instruction, followed by a jump instruction. -- YW.IFMAP,CD03,.GETCH,"bop",0FD3 will search for the WORDS .IFMAP, hex CD03, symbol .GETCH, string "bop", hex 0FD3. -- YDB,?,E6,?,C2 will search for an input routine of the form IN , ANI , jump not-zero. 4) NEXT (N): the N command allows convenient re-display of the loaded program/symbol parameters, "NEXT PC END". 5) VERSION (Z): displays the DCON version number 6) Extended commands: there are ( 1= display after tracing then re-saving the program (length is 39 CP/M pages, so use SAVE 39 DCON.COM In practice, I've found that the new trace mode takes some getting used to, but after my initial "break-in" period, I never use the old mode. E) Miscellaneous Notes ====================== A couple of undocumented (and relatively useless) options to commands existed under SID and ZSID version 1.4, and have been retained in DCON for no particular reason. 1) -L removes the assembler/disassembler module from the program. This is not reflected in the location at BDOS+1. This also happens whenever the assembler/disassembler module is overlaid with a user program. 2) -D suppresses the ascii portion of "D" lines. F) Commants, Suggestion, Bug Fixes ====-============================= Comments and suggestions from remote CP/M operators and other SID/ZSID users/owners are welcomed. I must, however, maintain my anonymity. Therefore, p=!!8080 CPU?${ͅ; DCON Debugger$| }*|(=g.x( ~#bx( { ~#o}o0.!5!~# ~: #~= #~(~#('08' 80))))o">*20{(  ++ Reloc Ignored ++$ Ý=,y $ 1"! 6 # 5! w # 1A' KByQ180ɾ# * { #z +++ : 1>H2  ~@̿ #  —A #2 HXY": [! x1y! ~14: ]1: 1̈́: ]G: ]G: +-1x1>--x /<2>"! ͏1 y9191=: H1: H1m: HĄX>(5>ÿ* " : 1! x1yc͏Q! 6>!>* w#" /_~ X.X%! 6! 56>!w! ͏ªyƛc irڑ<ʢڱڵ<<(1ER[o{!!Z!Q* yoxg |1}ր!ͿQͿx@cGOc͸ͿZ7G91 <8 b=ÚGLyiұ_! ^#Vz  H  aE)p"M.Uñů2[\6 >2 ! ""!Rұ : (k =±" Rұ(" =( "=±> 2 ڱʱ= =  ! !"#!(8" =( =± * }o[#!" .7 * " ~>:: (^#V#~͓8 ~#͓8} " : * ͆* } | * ͓ + ±{z͞ |±ʹ }2 .2 " " DM! 6(8"!=( l =(YPl ! ~(+#^#V: (*!{ z " ~62 #w6 1!1!*!*!! ~4(#~#F# x ~#s#r#w> =(#=±.~ᯕo>g~ .F>#z { 8<(>'{>' .*!6##V+^+N+y 5 .6~ 4~+(7 >: - ( 5* ~#" 007> >  6 ~: U >.^+~ : U .]>:|}0 0>.* }o|%)*/=@+- , 0 ñ^#V# 8 |{0*!Nyұ* * ͞( ( +  ͡(#^#V" " ~/o>g++" s#r#! 4- + [ ͡+ ͞ - ͞RS *(/ͷ( a)±.@ a^#V= a^'  ڱ' ͡'±S_$ *!^#V#$(^ H(D(7B(Xv#(-͡(mn,-( -(&I͡(YͿ))))o͡ ͡(=͡085 01)DM)) O ͡(͡080 {_zWñ|(}!)0 z l&A}g R0O ! 6# A,>2 dQ AdQ AdQ ± ʱ! 6W6!XN~!t!~] ʃ{_^!!͆^#Vxҷxѷ>-~/~>=/>'~!!!!~͕~.͝#x ÿ Z1cUyi<O cGͽO͵ycC×@O͵øcBG͵Lbi!͵O! vGy(×L¤: 1> : J ͬ C ͬͿyÝR1͏** {zX~#"  : >o&) N>[ ' +-/< ]: H%>X>YyO ~@' # - z8LO! ~ #~ - - L SP' * ! 0 * h!9" :2 !!"<<2 * ! X! ~(5X͌2 W!}p  pppv@jzOʂqme!zL! :W@!z8!6!L6* +" +V'W@!R=!V=ʽ=ʱz!p!5vL!Z6!n!Jz8!:Lrz2 WvvFjzpz Sz4==ʵz"\!ʋz:z!:z!v* #~v~!R!:n!CSJRSzʬ==ʵ!z=( 86n:nF!n!:L?!!:L!:Lz!5W_n!±BDM}|8 y_xW  ( T( R±>>!2!w.!v:2!(!!:2!(!All regs displayed 8080 regs only Pre-trace display Post-trace display :&!ʱ (w!Rڱ!o& 6 User=!(:%!!>.!.0 Version !ex#y#* !}|@" !: !@ڱ!=: ( ± ! !|±"!! ~(#~#V z :!w  :!ʱ! ~ :!w#s#r  ñ! ~(: (6.~#^#VF !(=±"!!l !~# :]?X ʱ>HXE3*!y\6 |w# Jʱ: W_O { x!(i`"!<w# J±ͿͿGтWx!@8: k >ULT3! !\~# 2|:] ʘ!)X <ʱʘ!8_*! (  8*+ ( (!ڱw{ұ*#^#Vr+s+6@ұ*"s#s#r f!*!*"! .O(,I±=±2"! :"!>=Ox±Oy |±}*!" !6z!o:2! !uR^ èW#~O+" *!~~H#͓ڨʏ^#Vy6‰zS_Fè~*!~¨#^+F*!~G¿xk@xvkx80kx645>=*!~*!%x*!*!: kU kUkx9*!~kk*!~9k4kk#^xdCZMEIABDHSPXY!" 2 "!+"!!91!!91!! *!~: 2 ! ~#^#V#~ R! ~6=G#^#V#~x7#"!!< N#Fʹ 7͔* >7 : ! ~ʙ#~#V*!™z™~=g=2 ~w~: ~u .<!*!F  C7=¸u *!g : * MD* : 7 .R!" ͔2 >**!R" E*!" :2!(. PASS ! ~* +" |8w=2 ~!/ ~##NAZ: * w2 ~CʞE¤ç*!F#;! s!^#V b`=GG8§ç:< := ^#V#^#*!^#V>éçxë& 5 !N 5! 5  _W! :z 0 ?* !9" ͌" * " * 0 83  Ɛ':' '/7?v (08"*2:DEFGMOVW^_goSI@DLI@DPCI@SPI@XTI@DAD@OTDRINDRCCDRLDDROTIRINIRCCIRLDIROUTDIND CCD LDD OUTIINI CCI LDI RLD RRD LDARIM2 LDAIIM1 STARRETISTAIIM0 RETNNEG DSBCDADCINP OUTPSBCDLBCDSDEDLDEDSHLDLHLDSSPDLSPDRLCRRRCRRALRRARRSLARSRARSLLRSRLRBIT RES SET POP PUSHRST LXI INX DAD DCX STAXLDAXMVI INR DCR ADD ADC SUB SBB ANA XRA ORA CMP MOV CALLJMP LDA STA LHLDSHLDJRC JRNCJRZ JRNZJMPRDJNZCPI ORI XRI ANI SBI IN SUI OUT ACI ADI EI SPHLDI XCHGPCHLXTHLEXX RET HLT CMC STC CMA DAA RAR RAL RRC EXAFRLC NOP *"NZZ NCC POPEP M B C D E H L M A B D @ SP PSW DB 6 > ßüE7göa~.ñ" ! *"< !6 "!""!2 2 2 2 !" " "!" !"'!1!!++"!1!" *R")!s:22!:2%! 6 2&!R>28! "9:] (!%1!! ! 76 .>#ͼ (! 6- 5A.!3* !~*!~*+~. SYMBOLS NEXT PC END =±.~: k^#V~~ͼ (U. : >."  (w#- : >- +: (+=±: (s#r#±}w#: (#O>>2 !" #(8 }ʱ=( =±" " 2 :2!( u .͞ ʹ B E#7/ YY.~~ #   G ‰x'± cx/!ozd( !d K D.͝ͼ = +x0)| }0]gA>Ag} ñ | E~!!!!p ͆s#r O B!!3!?(N"(edO(: (Z(y (,( ( (21!ñ>21!(h"/!s(: (("( (_  ("("(s#h(±ѷRڱ")!"'!s.*'!~*)!~:1!*+!K-!:3!sK/!:1!G(4! h#"-!"+!+" !"#! | |7 ?+!!'!:[(_!~(![4\6 2[7.>?   6 ! " > > 4 6_6 ~#a_!=8_ç*!§ú+~  : ?*!###çUçU>é{`/<_R~_!ʞʞ"ʞ{pʡ{5ʡ¤á>é><7* |! N*!!>#> : ! &>  =_~/w/w{ & = YP"!pCE" *!##F+N+~~ /o>g{y zy <33Z @ HI@B@HBH!I $$ I!@I !BBA$"B!B$I$ID$ $ $$!$DA$HHD$$@H  A@I @H!$$HD$HHHHBB!HAI$H "!$I$$!DB@"$HH"$BI$I$HI$IHI$ @$I$I$@A$$I$! HI $ BUUUUUU!  DI! $@ B$HH" D@ $$"@@ @@D !$ ""@@ $$D I HI!HDH$ H @IBD" $D$ B "I"$@I D@$BBI$$D@I@ IHBHBI HI !I$A! " I@" A@!"HHA $@@ " D"A D! ! @@H@BBBB@BI $$@H@" !"" BH $I I$IH$ @B$$H$  D! $!D$$I$I$$"A$$I I@!BBIUUUURI! B$ "H@!D@ADAI$ $ $$!$DA$HHD$$@H  A@I @H!$$HD$HHHHBB!HAI$H "!$I$$!DB@"$HH"$BI$I$HI$IHI$ @$I$I$@A$$I$! HI>$ ***** Hi there! ***** The purpose of this program is to enable the UN-protecting of Microsoft Basic programs. It is hoped that the users of this program bear in mind that the authors' intent in the distri- bution of UN.COM is that it be used for the recovery of their own progams. Certain unscrupulous souls will undoubtedly try to 'rip off' commercial software if they can reasonably do so, and programs such as this can certainly be used for such ends. In spite of the such possible abuses, UN is being released, for the following reasons: 1 - Programs such as this have been on the market for almost one year (as of 06/81) from several sources. Presumably, you honest folk are the last to hear about or obtain such things. Outlaw powerful programs and only the Outlaws... (Ugh, I didn't really say that, did I? Oh well...) 2 - The release of Bascom, version 5.3, appears to signal the end of the nefarious royalty requiremen#:^O?  ! ! ! >#+ww#|4 :]D9*l : l ! &~l !*+%%0j!>3 &>w#" ##" "3 gl"3 3Hs:]Ws*_>Us>Os:71 =27  !  >127x $ $  E± :]Hs*_>Ps>LLs  :]Ns*2T=2: t==j|(*h>2sÇ! &~: !§:!§:(!§::sʸ!!!! p#>!!9.%%%%+ * * s#r!>w> #y-c |f02Es1#{åXr2F NiIu5Њvj$s=k얖xh4XB<QU5OoiBpLHfO5珥~2䆤œPr4ZKA 1Is Br hoO! iQ^~>APp0ӽ=SDzF_)1aH~*B:Tz? r螄 'IVX >AUᵧV,ض>E9JP }qgGtKSUk >,t6gU7j6˱ }__>027:]?‰!!This UN.COM given to CPM/UG July 16, 1981 - b.n. - $!2 *^#V" > !  (w#!+)t, as the run time package is now being sold seperately, and doesn't have to be linked with the compiled (read 'protected') programs. ( And for the lowest possible end user cost, don't forget about the reliable and speedy Fortran and BDS C compilers) 3 - It's nice to demonstrate that low cost doesn't imply lower performance. UN.COM has several advantages over the higher priced spreads. A - It works with all versions of MBASIC 5.x tested to date. B - Once invoked, it remains permanently active, until the user deactivates UN, or until the next cold boot. (You don't have to load MBASIC 20 times in order to examine 20 protected programs.) C - Large programs which barely fit in memory can be debugged without the awkwardness of saving the program, and then having to reload both the interpreter and the program. This is possible because UN modifies only the system, and occupies no TPA space. "##" *( *( ~d#{u $  E± :]Hs*_>Ps>LLs  :]Ns*2T=2: t==j|(*h>2sÇ! &~: !§:!§:(!§::sʸ!!!! p#>!!9.%%%%+ * * s#r!>w> #y-c |f02Es1#{åXr2F NiIu5Њvj$s=k얖xh4XB<QU5OoiBpLHfO5珥~2䆤œPr4ZKA 1Is Br hoO! iQ^~>APp0ӽ=SDzF_)1aH~*B:Tz? r螄 'IVX >AUᵧV,ض>E9JP }qgGtKSUk >,t6gU7j6˱ }__>027:]?‰!!This UN.COM given to CPM/UG July 16, 1981 - b.n. - $!2 *^#V" > !  (w#!+)(Type 'PRINT FRE(I)' to see if several thousand bytes of program space have been lost.) D - The licensing terms are modest. The end user agrees that HE/SHE will make no more than 600 copies for their own personal use, and that no limit is placed on the number of copies distributed elsewhere. E - If because of your systems' peculiarities UN.COM doesn't work, you haven't lost much... And now for the rules of the game... To invoke UN.COM, type 'UN DO' To deactivate UN.COM, type 'UN NO' To UN-protect a program, first get it into memory with the 'LOAD' command, and then type ^U (control-U). The program is now unprotected and may be listed or saved. UN.COM now performs more extensive error checking and works under both CP/M and CDOS. $  Honk if you %!$#*& ZOSO. Bye - B.R.N. 07/12/81 > 5.0 - Multiple file lister CTL-S pauses, CTL-X skips to next file, CTL-C aborts --> LISTING FILE: UN .DOC The documentation for UN.COM can be read by entering TYPE UN.COM on your system after you have renamed UN.OBJ A very niffty program by Bill Norris for UNprotecting Microsoft Basic programs. It is hoped that users of UN will only use it UNprotect or recover their own programs and not 'rip off' commerical software. DONE A1>ar (as of 06/81) from several sources. UNSP30 DQC.kUSQ COMNlmI/O-CAP ASMnopSD COM q-PICONET014UNERA11 ASM,rPASSWORDASM@sDCON11 DOCstuDCON11 COMNvwUN COM"xUN $$$?; FINDBAD.ASM ver. 5.2 ; (revised 04/10/81) ; ;FINDBAD will find all bad blocks on a disk and build a file ;named [UNUSED].BAD to allocate them, thus "locking out" the ;bad blocks so CP/M will not use them. ; ;Originally written by Gene Cotton, published in "Interface ;Age", September 1980 issue, page 80. ; ;See notes below concerning 'TEST' conditional assembly option, ;SYSTST and BADUSR directives. ; ;******************************************************** ;* * ;* NOTE * ;* * ;* This program has been re-written to allow it to * ;* work with (hopefully) all CP/M 2.x systems, and * ;* most 1.4 CP/M systems. It has been tested on sev- * ;* eral different disk systems, including Northstar, * ;* Micropolis, DJ2D, and Keith Petersen's 10 MByte * ;* hard disk system. I have tested it personally on * ;* my "modified" Northstar, under several different * ;* formats (including >16K per extent), and have ob- * ;* no difficulties. * ;* If you havre you have ;the latest version first. After adding your changes, please ;modem a copy of the new file to "TECHNICAL CBBS" in Dearborn, ;Michigan - phone 313-846-6127 (110, 300, 450 or 600 baud). ;Use the filename FINDBAD.NEW. (KBP) ; ;Modifications/updates: (in reverse order to minimize reading time) ; ;04/10/81 Changed extent DB from -1 to 0FFH so program can be ; assembled by ASM. Added BADUSR info to instructions ; for altering with DDT. (KBP) ; ;04/09/81 Changed sign-on message, added control-c abort test, ; added '*' to console once each track (RGF) ; ;04/07/81 Re-wrote to add the following features: ; 1) "universal" operation ; 2) DDT-changeable "SYSTRK" boolean (see above) ; 3) Report to console when bad blocks are detected ; 4) Changed the method of printing the number of ; bad blocks found (at end of run)...the old ; method used too much code, and was too cum- ; bersome. ; 5) Made several cosmetic changes ; ; Ron Fowler ; Westland, Mich ; ;0 checked. (KBP) ; ;08/30/80 Added conditional assembly for Micromation ; double-density format. (Charles H. Strom) ; ;08/27/80 Fix missing conditional assembly in FINDB routine. ; Put version number in sign-on message. (KBP) ; ;08/26/80 Modified by Keith Petersen, W8SDZ, to: ; (1) Add conditional assembly for 1k/2k groups ; (2) Add conditional assembly for standard drives ; and Micropolis MOD II ; (3) Make compatible with CP/M-2.x ; (4) Remove unneeded code to check for drive name ; (CP/M does it for you and returns it in the FCB) ; (5) Changed to open additional extents as needed for ; overflow, instead of additional files ; (6) Add conditional assembly for system tracks check ; (some double-density disks have single-density ; system tracks which cannot be read by this program) ; (7) Increased stack area (some systems use more than ; others). ; ;08/06/80 Added comments and crunched some code. ; KELLY SMITH. 805-527-9321 (Modem,e have difficulties getting this pro- * ;* gram to run, AND if you are using CP/M 2.x, AND * ;* if you know your CBIOS to be bug-free, leave * ;* me a message on the CBBS mentioned below ... I am * ;* interested in making this program as "universal" * ;* as possible. * ;* I can't help with any version of CP/M 1.4, other * ;* than "standard" versions (whatever that means), * ;* because there are just too many heavily modified * ;* versions available. * ;* One possible problem you may find is with the * ;* system tracks of your diskettes...if they are of * ;* a different density than the data tracks, then * ;* see the note regarding the "SYSTST" equate. * ;* * ;* Ron Fowler * ;* Westland, Mich * ;* 7 April, 1981 * ;* * ;******************************************************** ; ;SYSTST and BADUSR options: ; Many double-density disk systems have single-density system ;tracks. If this is true with your system, you can change the ;3/23/81 Set equates to standard drive and not double-sided. (KBP) ; ;03/01/81 Corrected error for a Horizon with double sided drive. ; This uses 32k extents, which code did not take into account. ; (Bob Clyne) ; ;02/05/81 Merged 2/2/81 and 1/24/81 changes, which were done ; independently by Clyne and Mack. (KBP) ; ;02/02/81 Added equates for North Star Horizon - 5.25" drives, ; double density, single and double sided. (Bob Clyne) ; ;01/24/81 Added equates for Jade DD disk controller ; (Pete H. Mack) ; ;01/19/81 Added equates for Icom Microfloppy 5.25" drives. ; (Eddie Currie) ; ;01/05/81 Added equates for Heath H-17 5.25" drives. ; (Ben Goldfarb) ; ;12/08/80 Added equates for National Multiplex D3S/D4S ; double-density board in various formats. ; (David Fiedler) ; ;09/22/80 Added equates for Morrow Disk Jockey 2D/SS, 256, ; 512 and 1024-byte sector options. Fix 'S2' update ; flag for larger max number of extents. Cleaned up ; file. (Ben Bronson and KBP) ; 300 Baud) ; 805-527-0518 (Verbal) ; ; ; Using the Program ; ; Before using this program to "reclaim" a diskette, it is ;recommended that the diskette be reformatted. If this is not ;possible, at least assure yourself that any existing files ;on the diskette do not contain unreadable sectors. If you ;have changed disks since the last warm-boot, you must warm- ;boot again before running this program. ; ; To use the program, insert both the disk containing the ;program FINDBAD.COM and the diskette to be checked into the ;disk drives. It is possible that the diskette containing the ;program is the one to be checked. Assume that the program is ;on drive "A" and the suspected bad disk is on drive "B". In ;response to the CP/M prompt "A>", type in FINDBAD B:. This ;will load the file FINDBAD.COM from drive "A" and test the ;diskette on drive "B" for unreadable sectors. The only ;allowable parameter after the program name is a drive ;specification (of the form " program to skip the system tracks, without re-assembling it. ;To do this, set the byte at 103H to a 0 if you don't want the ;system tracks tested, otherwise leave it 0. This is also ;necessary if you have a "blocked" disk system; that is, when ;the same physical disk is seperated into logical disks by use ;of the SYSTRK word in the disk parameter block. ; If you are a CP/M 2.x user, you may assign the user number ;where [UNUSED.BAD] will be created by changing the byte at ;104H to the desired user number. If you want it in the ;default user, then leave it 0FFH. CP/M 1.4 users can ignore ;this byte altogether. ; ;Note that these changes can be done with DDT as follows: ; ; A>DDT FINDBAD.COM ; -S103 ; 103 01 0 ;DON'T TEST SYSTEM TRACKS ; 104 FF F ;PUT [UNUSED.BAD] IN USER 15 ; 105 31 . ;DONE WITH CHANGES ; -^C ; A>SAVE XX FINDBAD.COM ; ;---------------------------------------------------------------- ;NOTE: If you want to update this program, make su ;09/14/80 Corrected DGROUP equate for MMDBL. Added new routine ; to correct for IMDOS group allocation. Corrected ; error in instructions for using TEST routine. ; (CHS) (AJ) (KBP) - (a group effort) ; ;09/08/80 Fixed several errors in Al Jewer's mods. Changed ; return to CP/M to warm boot so bitmap in memory will ; be properly updated. Added conditional assembly for ; testing program. (KBP) ; ;09/02/80 Added IMDOS double-density equates & modified for ; more then 256 blocks per disk. (Al Jewer) ; ;09/01/80 Changed equates so that parameters are automatically ; set for each disk system conditional assembly (KBP) ; ;08/31/80 Add conditional assembly for Digital Microsystems FDC3 ; controller board in double-density format and fix to ; do 256 blocks in one register. (Thomas V. Churbuck) ; ;08/31/80 Correct MAXB equate - MAXB must include the directory ; blocks as well as the data blocks. Fix to make sure ; any [UNUSED].BAD file is erased before data area is ;?N:") for up to four (A to D) ;disk drives. If no drive is specified, the currently logged ;in drive is assumed to contain the diskette to check. ; ; The program first checks the CP/M System tracks (0 and 1), ;and any errors here prohibit the disk from being used on ;drive "A", since all "warm boots" occur using the system ;tracks from the "A" drive. ; ; The program next checks the first two data blocks (groups ;to some of us) containing the directory of the diskette. If ;errors occur here, the program terminates and control ;returns to CP/M (no other data blocks are checked since ;errors in the directory render the disk useless). ; ; Finally, all the remaining data blocks are checked. Any ;sectors which are unreadable cause the data block which ;contains them to be stored temporarily as a "bad block". At ;the end of this phase, the message "XX bad blocks found" is ;displayed (where XX is replaced by the number of bad blocks, ;or "No" if no read errors occur; ; 75 (tracks/disk) x (3.25 blocks/track) = 243.75 blocks/disk ; ;CP/M cannot access a fractional block, so we round down (to 243 ;blocks in our example). Now multiplying total blocks by ;sectors/block results in total sectors as should be reported ;when TEST is set TRUE and a good disk is read. For our example, ;this value is 1944 sectors. ; ;Finally, note that if SYSTEM is set TRUE, the sectors present ;on the first two tracks must be added in as well. In the ;previous example, this results in 1944 + 52 = 1996 sectors ;reported by the TEST conditional. ; ;Run the program on a KNOWN-GOOD disk. It should report that it ;has read the correct number of sectors. The test conditional ;assembly should then be set FALSE and the program re-assembled. ;The test routines cannot be left in because this program does ;not read all the sectors in a block that is found to be bad and ;thus will report an inaccurate number of sectors read. ; ; ;Define TRUE and FALSE BDOS ; PMSG2: LXI D,ENDMSG ;REST OF EXIT MESSAGE ; PMSG: MVI C,9 CALL BDOS ; IF TEST MVI A,TAB ;GET A TAB CALL TYPE ;PRINT IT LHLD SECCNT ;GET NUMBER OF SECTORS READ CALL DECOUT ;PRINT IT LXI D,SECMSG ;POINT TO MESSAGE MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL BDOS ;PRINT IT ENDIF ;TEST JMP BASE ;EXIT TO CP/M WARM BOOT ; ;Get actual address of BIOS routines ; SETUP: LHLD BASE+1 ;GET BASE ADDRESS OF BIOS VECTORS ; ;WARNING...Program modification takes place here...do not change. ; LXI D,24 ;OFFSET TO "SETDSK" DAD D SHLD SETDSK+1 ;FIX OUR CALL ADDRESS LXI D,3 ;OFFSET TO "SETTRK" DAD D SHLD SETTRK+1 ;FIX OUR CALL ADDRESS LXI D,3 ;OFFSET TO "SETSEC" DAD D SHLD SETSEC+1 ;FIX OUR CALL ADDRESS LXI D,6 ;OFFSET TO "DREAD" DAD D SHLD DREAD+1 ;FIX OUR CALL ADDRESS LXI D,9 ;OFFSET TO CP/M 2.x SECTRAN DAD D SHLD SECTRN+1 ;FIX OUR CALL ADDRESS MVI C,12 ;GET VERSION FUNCTION CALL BDOS MOV A,H ;SAVE AS FLAG ORA L STA VER2FL JNZ GDRIV ;SKIP ). If bad blocks occur, the ;filname [UNUSED].BAD is created, the list of "bad blocks" is ;placed in the allocation map of the directory entry for ;[UNUSED].BAD, and the file is closed. Note, that when the ;number of "bad blocks" exceeds 16, the program will open ;additional extents as required to hold the overflow. I ;suggest that if the diskette has more than 32 "bad blocks", ;perhaps it should be sent to the "big disk drive in the sky" ;for the rest it deserves. ; ; The nifty part of all this is that if any "bad blocks" do ;occur, they are allocated to [UNUSED].BAD and no longer will ;be available to CP/M for future allocation...bad sectors are ;logically locked out on the diskette! ; ; ; Using the TEST conditional assembly ; ;A conditional assembly has been added to allow testing this ;program to make sure it is reading all sectors on your disk ;that are accessible to CP/M. The program reads the disk on a ;block by block basis, so it is necessary ; FALSE EQU 0 TRUE EQU NOT FALSE ; ;****************************************************************** ; ;Conditional assembly switch for testing this program ;(for initial testing phase only - see remarks above) ; TEST EQU FALSE ;TRUE FOR TESTING ONLY ; ;****************************************************************** ; ;System equates ; BASE EQU 0 ;STANDARD CP/M BASE ADDRESS (4200H FOR ALTCPM) BDOS EQU BASE+5 ;CP/M WARM BOOT ENTRY FCB EQU BASE+5CH;CP/M DEFAULT FCB LOCATION ; ;Define ASCII characters used ; CR EQU 0DH ;CARRIAGE RETURN CHARACTER LF EQU 0AH ;LINE FEED CHARACTER TAB EQU 09H ;TAB CHARACTER ; DPBOFF EQU 3AH ;CP/M 1.4 OFFSET TO DPB WITHIN BDOS TRNOFF EQU 15 ;CP/M 1.4 OFFSET TO SECTOR XLATE ROUTINE ; ; ORG BASE+100H ; JMP START ;JMP AROUND OPTION BYTES ; ;If you want the system tracks tested, then ;put a 1 here, otherwise 0. ; SYSTST: DB 0 ;0 IF NO SYS TRACKS, OTHERWISE 1 ; ;If you are a CP/M 2.x user, change this byte ;to the user number you want [UNUSE1.4 STUFF IF IS 2.x LXI D,TRNOFF ;CP/M 1.4 OFFSET TO SECTRAN LHLD BDOS+1 ;SET UP JUMP TO 1.4 SECTRAN MVI L,0 DAD D SHLD SECTRN+1 ; ;Check for drive specification ; GDRIV: LDA FCB ;GET DRIVE NAME MOV C,A ORA A ;ZERO? JNZ GD2 ;IF NOT,THEN GO SPECIFY DRIVE MVI C,25 ;GET LOGGED-IN DRIVE CALL BDOS INR A ;MAKE 1-RELATIVE MOV C,A ; GD2: LDA VER2FL ;IF CP/M VERSION 2.x ORA A JNZ GD3 ; SELDSK WILL RETURN SEL ERR ; ;Is CP/M 1.4, which doesn't return a select ;error, so we have to do it here ; MOV A,C CPI 4+1 ;CHECK FOR HIGHEST DRIVE NUMBER JNC SELERR ;SELECT ERROR ; GD3: DCR C ;BACK OFF FOR CP/M PUSH B ;SAVE DISK SELECTION MOV E,C ;ALIGN FOR BDOS MVI C,14 ;SELECT DISK FUNCTION CALL BDOS POP B ;GET BACK DISK NUMBER ; ;EXPLANATION: WHY WE DO THE SAME THING TWICE ; ; You might notice that we are ; doing the disk selection twice, ; once by a bdos call and once by ; direct BIOS call. The reason for this: ; ; The BIOS call is necessary in order to ; get the  to first determine the ;number of blocks present. To start, we must know the number of ;sectors/block (8 sectors/block for standard IBM single density ;format). If this value is not known, it can easily be ;determined by saving one page in a test file and interrogating ;using the STAT command: ; ; A>SAVE 1 TEST.SIZ ; A>STAT TEST.SIZ ; ;For standard single-density STAT will report this file as being ;1k. The file size reported (in bytes) is the size of a block. ;This value divided by 128 bytes/sector (the standard CP/M ;sector size) will give sectors/block. For our IBM single ;density example, we have: ; ; (1024 bytes/block) / (128 bytes/sector) = 8 sectors/block. ; ;We can now calculate blocks/track (assuming we know the number ;sectors/track). In our example: ; ; (26 sectors/track) / (8 sectors/block) = 3.25 blocks/track ; ;Now armed with the total number of data tracks (75 in our IBM ;single density example), we get total blocks accessible: D].BAD to ;reside in. If you want it in the default ;user, then leave it 0FFH. CP/M 1.4 users ;can ignore this byte altogether. ; BADUSR: DB 0FFH ;USER # WHERE [UNUSED.BAD] GOES ;0FFH = DEFAULT USER ; START: LXI SP,NEWSTK ;MAKE NEW STACK CALL START2 ;GO PRINT SIGNON DB CR,LF,'FINDBAD - ver 5.2' DB CR,LF,'Bad sector lockout ' DB 'program',CR,LF DB 'Universal version',CR,LF DB CR,LF,'Type CTL-C to abort',CR,LF,'$' ; START2: POP D ;GET MSG ADRS MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL BDOS ;PRINT SIGN-ON MSG CALL SETUP ;SET BIOS ENTRY, AND CHECK DRIVE CALL ZMEM ;ZERO ALL AVAILABLE MEMORY CALL FINDB ;ESTABLISH ALL BAD BLOCKS JZ NOBAD ;SAY NO BAD BLOCKS, IF SO CALL SETDM ;FIX DM BYTES IN FCB ; NOBAD: CALL CRLF MVI A,TAB CALL TYPE LXI D,NOMSG ;POINT FIRST TO 'NO' LHLD BADBKS ;PICK UP # BAD BLOCKS MOV A,H ;CHECK FOR ZERO ORA L JZ PMSG1 ;JUMP IF NONE CALL DECOUT ;OOPS..HAD SOME BAD ONES, REPORT JMP PMSG2 ; PMSG1: MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL@necessary pointer back from CP/M ; (2.x) to find the sector translate table. ; The BDOS call is necessary to keep CP/M ; in step with the BIOS...we may later ; have to creadt a [UNUSED].BAD file, and ; CP/M must know which drive we are using. ; (RGF) ; SETDSK: CALL $-$ ;DIRECT BIOS VEC FILLED IN AT INIT LDA VER2FL ORA A JZ DOLOG ;JUMP IF CP/M 1.4 MOV A,H ORA L ;CHECK FOR 2.x JZ SELERR ;JUMP IF SELECT ERROR MOV E,M ;GET SECTOR TABLE PNTR INX H MOV D,M INX H XCHG SHLD SECTBL ;STORE IT AWAY LXI H,8 ;OFFSET TO DPB POINTER DAD D MOV A,M ;PICK UP DPB POINTER INX H ; TO USE MOV H,M ; AS PARAMETER MOV L,A ; TO LOGIT ; DOLOG: CALL LOGIT ;LOG IN DRIVE, GET DISK PARMS CALL GETDIR ;CALCULATE DIRECTORY INFORMATION ; ;Now set the required user number ; LDA VER2FL ORA A RZ ;NO USERS IN CP/M 1.4 LDA BADUSR ;GET THE USER NUMBER CPI 0FFH ;IF IT IS 0FFH, THEN RETURN RZ MVI C,32 ;GET/SET USER CODE CALL BDOS RET ; ;Look for bad blocks ; FINDB: LTO TRACK/SECTOR IN H&L REGS. LDA BLM INR A ;NUMBER OF SECTORS/BLOCK MOV D,A ; IN D REG ; READBA: PUSH D CALL READS ;READ SKEWED SECTOR POP D RNZ ;ERROR IF NOT ZERO... DCR D ;DEBUMP SECTOR/BLOCK JNZ READBA ;DO NEXT, IF NOT FINISHED RET ;RETURN FROM "READBA" ; ;Convert block number to track and skewed sector number ; CNVRTB: PUSH B ;SAVE CURRENT GROUP MOV H,B ;NEED IT IN HL MOV L,C ; FOR EASY SHIFTING LDA BSH ;DPB VALUE THAT TELLS HOW TO ; SHIFT: DAD H ; SHIFT GROUP NUMBER TO GET DCR A ; DISK-DATA-AREA RELATIVE JNZ SHIFT ; SECTOR NUMBER XCHG ;REL SECTOR # INTO DE LHLD SPT ;SECTORS PER TRACK FROM DPB CALL NEG ;FASTER TO DAD THAN CALL SUBDE XCHG LXI B,0 ;INITIALIZE QUOTIENT ; ;Divide by number of sectors ; quotient = track ; mod = sector ; DIVLP: INX B ;DIRTY DIVISION DAD D JC DIVLP DCX B ;FIXUP LAST XCHG LHLD SPT DAD D INX H SHLD SECTOR ;NOW HAVE LOGICAL SECTOR LHLD SYSTRK ;BUT BEFORE WE HAVE TRACK #, DAD B ; WE HAVE TO ADD SYS  ; ;Sector translation vector ; SECTRN: JMP $-$ ;FILLED IN AT INIT ; ;Put bad block in bad block list ; SETBD: PUSH B CALL SETBD1 DB 'Bad block: $' ; SETBD1: POP D ;RETRIEVE ARG MVI C,9 ;PRINT STRING CALL BDOS POP B ;GET BACK BLOCK NUMBER MOV A,B CALL HEXO ;PRINT IN HEX MOV A,C CALL HEXO CALL CRLF LHLD DMCNT ;GET NUMBER OF SECTORS LDA BLM ;GET BLOCK SHIFT VALUE INR A ;MAKES SECTOR/GROUP VALUE MOV E,A ;WE WANT 16 BITS MVI D,0 DAD D ;BUMP BY NUMBER IN THIS BLOCK SHLD DMCNT ;UPDATE NUMBER OF SECTORS LHLD BADBKS ;INCREMENT NUMBER OF BAD BLOCKS INX H SHLD BADBKS LHLD DMPTR ;GET POINTER INTO DM MOV M,C ;...AND PUT BAD BLOCK NUMBER INX H ;BUMP TO NEXT AVAILABLE EXTENT LDA DSM+1 ;CHECK IF 8 OR 16 BIT BLOCK SIZE ORA A JZ SMGRP ;JUMP IF 8 BIT BLOCKS MOV M,B ;ELSE STORE HI BYTE OF BLOCK # INX H ;AND BUMP POINTER ; SMGRP: SHLD DMPTR ;SAVE DM POINTER, FOR NEXT TIME THROUGH HERE RET ;RETURN FROM "SETBD" ; ;Eliminate any previous [UNUSED].BAD entries ;DA SYSTST ORA A JZ DODIR ;JUMP IF NO SYS TRACKS TO BE TESTED CALL CHKSYS ;CHECK FOR BAD BLOCKS ON TRACK 0 AND 1 ; DODIR: CALL CHKDIR ;CHECK FOR BAD BLOCKS IN DIRECTORY CALL TELL1 DB CR,LF,'Testing data area...',CR,LF,'$' ; TELL1: POP D MVI C,9 ;BDOS PRINT STRING FUNCTION CALL BDOS CALL ERAB ;ERASE ANY [UNUSED].BAD FILE LHLD DIRBKS ;START AT FIRST DATA BLOCK MOV B,H ;PUT INTO BC MOV C,L ; FINDBA: CALL READB ;READ THE BLOCK CNZ SETBD ;IF BAD, ADD BLOCK TO LIST INX B ;BUMP TO NEXT BLOCK LHLD DSM MOV D,B ;SET UP FOR (MAXGRP - CURGRP) MOV E,C CALL SUBDE ;DO SUBTRACT: (MAXGRP - CURGRP) JNC FINDBA ;UNTIL CURGRP>MAXGRP CALL CRLF LHLD DMCNT ;GET NUMBER OF BAD SECTORS MOV A,H ORA L ;SET ZERO FLAG, IF NO BAD BLOCKS RET ;RETURN FROM "FINDB" ; ;Check system tracks, notify user if bad, but continue ; CHKSYS: CALL CHSY1 ;PRINT MESSAGE DB CR,LF,'Testing system tracks...',CR,LF,'$' ; CHSY1: POP D MVI C,9 ;PRINT STRING FUNCTION CALL BDOS LXI H,0 ;SET TRACK 0, STRACK OFFSET SHLD TRACK POP B ;THIS WAS OUR GROUP NUMBER RET ; ;READS reads a logical sector (if it can) ;and returns zero flag set if no error. ; READS: PUSH B ;SAVE THE GROUP NUMBER CALL LTOP ;CONVERT LOGICAL TO PHYSICAL LDA VER2FL ;NOW CHECK VERSION ORA A JZ NOTCP2 ;SKIP THIS STUFF IF CP/M 1.4 LHLD PHYSEC ;GET PHYSICAL SECTOR MOV B,H ;INTO BC MOV C,L ; SETSEC: CALL $-$ ;ADDRS FILLED IN AT INIT ; ;QUICK NOTE OF EXPLANATION: This code appears ;as if we skipped the SETSEC routine for 1.4 ;CP/M users. That's not true; in CP/M 1.4, the ;call within the LTOP routine to SECTRAN ac- ;tually does the set sector, so no need to do ;it twice. (RGF) ; NOTCP2: LHLD TRACK ;NOW SET THE TRACK MOV B,H ;CP/M WANTS IT IN BC MOV C,L ; SETTRK: CALL $-$ ;ADDRS FILLED IN AT INIT ; ;Now do the sector read ; DREAD: CALL $-$ ;ADDRS FILLED IN AT INIT ORA A ;SET FLAGS PUSH PSW ;SAVE ERROR FLAG ; IF TEST LHLD SECCNT ;GET SECTOR COUNT INX H ;ADD ONE SHLD SECCNT ;SAVE NEW  ERAB: LXI D,BFCB ;POINT TO BAD FCB MVI C,19 ;BDOS DELETE FILE FUNCTION CALL BDOS RET ; ;Create [UNUSED].BAD file entry ; OPENB: LXI D,BFCB ;POINT TO BAD FCB MVI C,22 ;BDOS MAKE FILE FUNCTION CALL BDOS CPI 0FFH ;CHECK FOR OPEN ERROR RNZ ;RETURN FROM "OPENB", IF NO ERROR JMP ERROR7 ;BAIL OUT...CAN'T CREATE [UNUSED].BAD ; CLOSEB: XRA A LDA BFCB+14 ;GET CP/M 2.x 'S2' BYTE ANI 1FH ;ZERO UPDATE FLAGS STA BFCB+14 ;RESTORE IT TO OUR FCB (WON'T HURT 1.4) LXI D,BFCB ;FCB FOR [UNUSED].BAD MVI C,16 ;BDOS CLOSE FILE FUNCTION CALL BDOS RET ;RETURN FROM "CLOSEB" ; ;Move bad area DM to BFCB ; SETDM: LXI H,DM ;GET DM SHLD DMPTR ;SAVE AS NEW POINTER LDA EXM ;GET THE EXTENT SHIFT FACTOR MVI C,0 ;INIT BIT COUNT CALL COLECT ;GET SHIFT VALUE LXI H,128 ;STARTING EXTENT SIZE MOV A,C ;FIRST SEE IF ANY SHIFTS TO DO ORA A JZ NOSHFT ;JUMP IF NONE ; ESHFT: DAD H ;SHIFT DCR A ;BUMP JNZ ESHFT ;LOOP ; NOSHFT: PUSH H ;SAVE THIS, IT IS RECORDS PER EXTENT LDA BSH ;GET BLOCK ECTOR 1 SHLD TRACK INX H SHLD SECTOR ; CHKSY1: CALL READS ;READ A SECTOR JNZ SYSERR ;NOTIFY, IF BAD BLOCKS HERE LHLD SYSTRK ;SET UP (TRACK-SYSTRK) XCHG LHLD TRACK CALL SUBDE ;DO THE SUBTRACT JC CHKSY1 ;LOOP WHILE TRACK < SYSTRK RET ;RETURN FROM "CHKSYS" ; SYSERR: LXI D,ERMSG5 ;SAY NO GO, AND BAIL OUT MVI C,9 ;BDOS PRINT BUFFER FUNCTION CALL BDOS RET ;RETURN FROM "SYSERR" ; ;Check for bad blocks in directory area ; CHKDIR: CALL CHKD1 DB CR,LF,'Testing directory area...',CR,LF,'$' ; CHKD1: POP D MVI C,9 ;BDOS PRINT STRING FUNCTION CALL BDOS LXI B,0 ;START AT BLOCK 0 ; CHKDI1: CALL READB ;READ A BLOCK JNZ ERROR6 ;IF BAD, INDICATE ERROR IN DIRECTORY AREA INX B ;BUMP FOR NEXT BLOCK LHLD DIRBKS ;SET UP (CURGRP - DIRBKS) DCX H ;MAKE 0-RELATIVE MOV D,B MOV E,C CALL SUBDE ;DO THE SUBTRACT JNC CHKDI1 ;LOOP UNTIL CURGRP > DIRGRP RET ;RETURN FROM "CHKDIR" ; ;Read all sectors in block, and return zero flag set if none bad ; READB: CALL CNVRTB ;CONVERT COUNT ENDIF ; LHLD SECTOR ;GET LOGICAL SECTOR # INX H ;WE WANT TO INCREMENT TO NEXT XCHG ;BUT FIRST...CHECK OVERFLOW LHLD SPT ; BY DOING (SECPERTRK-SECTOR) CALL SUBDE ;DO THE SUBTRACTION XCHG JNC NOOVF ;JUMP IF NOT SECTOR>SECPERTRK ; ;Sector overflow...bump track number, reset sector ; LHLD TRACK INX H SHLD TRACK MVI A,'*' ;TELL CONSOLE ANOTHER TRACK DONE CALL TYPE CALL STOP ;SEE IF CONSOLE WANTS TO QUIT LXI H,1 ;NEW SECTOR NUMBER ON NEXT TRACK ; NOOVF: SHLD SECTOR ;PUT SECTOR AWAY POP PSW ;GET BACK ERROR FLAGS POP B ;RESTORE GROUP NUMBER RET ; ;Convert logical sector # to physical ; LTOP: LHLD SECTBL ;SET UP PARAMETERS XCHG ; FOR CALL TO SECTRAN LHLD SECTOR MOV B,H MOV C,L DCX B ;ALWAYS CALL SECTRAN W/ZERO-REL SEC # ; SECT1: CALL SECTRN ;DO THE SECTOR TRANSLATION LDA SPT+1 ;CHECK IF BIG TRACKS ORA A ;SET FLAGS (TRACKS > 256 SECTORS) JNZ LTOP1 ;NO SO SKIP MOV H,A ;ZERO OUT UPPER 8 BITS ; LTOP1: SHLD PHYSEC ;PUT AWAY PHYSICAL SECTOR RET @SHIFT MOV B,A ; BSHFT: CALL ROTRHL ;SHIFT RIGHT DCR B JNZ BSHFT ;TO GET BLOCKS PER EXTENT MOV A,L ;IT'S IN L (CAN'T BE >16) STA BLKEXT ;SETDME WILL NEED THIS LATER POP H ;GET BACK REC/EXT ; SET1: XCHG ;NOW HAVE REC/EXTENT IN DE LHLD DMCNT ;COUNT OF BAD SECTORS ; SETDMO: PUSH H ;SET FLAGS ON (DMCNT-BADCNT) CALL SUBDE ;HAVE TO SUBTRACT FIRST MOV B,H ;SAVE RESULT IN BC MOV C,L POP H ;THIS POP MAKES IT COMPARE ONLY JC SETDME ;JUMP IF LESS THAN 1 EXTENT WORTH MOV A,B ORA C ;TEST IF SUBTRACT WAS 0 JZ EVENEX ;EXTENT IS EXACTLY FILLED (SPL CASE) MOV H,B ;RESTORE RESULT TO HL MOV L,C PUSH H ;SAVE TOTAL PUSH D ;AND SECTORS/EXTENT XCHG CALL SETDME ;PUT AWAY ONE EXTENT XCHG SHLD DMPTR ;PUT BACK NEW DM POINTER POP D ;GET BACK SECTORS/EXTENT POP H ;AND COUNT OF BAD SECTORS JMP SETDMO ;AND LOOP ; ;Handle the special case of a file that ends on an extent ;boundary. CP/M requires that such a file have a succeeding ;empty extent in order for the BDOS to properly a LXI B,-10 LXI D,-1 ; DECOU2: DAD B INX D JC DECOU2 LXI B,10 DAD B XCHG MOV A,H ORA L CNZ DECOUT MOV A,E ADI '0' CALL TYPE POP H POP D POP B RET ; ;Carriage-return/line-feed to console ; CRLF: MVI A,CR CALL TYPE MVI A,LF ;FALL INTO 'TYPE' ; TYPE: PUSH B PUSH D PUSH H MOV E,A ;CHARACTER TO E FOR CP/M MVI C,2 ;PRINT CONSOLE FUNCTION CALL BDOS ;PRINT CHARACTER POP H POP D POP B RET ; ;Subroutine to test console for control-c abort ; STOP: LHLD 1 ;FIND BIOS IN MEMORY MVI L,6 ;OFFSET TO CONSOLE STATUS CALL GOHL ;THANKS TO BRUCE RATOFF FOR THIS TRICK ORA A ;TEST FLAGS ON ZERO RZ ;RETURN IF NO CHAR LHLD 1 ;NOW FIND CONSOLE INPUT MVI L,9 ;OFFSET FOR CONIN CALL GOHL CPI 'C'-40H ;IS IT CONTROL-C? RNZ ;RETURN IF NOT LXI D,ABORTM ;EXIT WITH MESSAGE MVI C,9 ;PRINT MESSAGE FUNCTION CALL BDOS ;SAY GOODBYE JMP 0 ;THEN LEAVE ; ABORTM: DB CR,LF DB 'Test aborted by control-C' DB CR,LF,'$' ; ;A thing to allow a call to @HL ; G MOV A,M INX H STA BLM MOV E,M INX H XCHG SHLD DSM XCHG MOV E,M INX H XCHG SHLD AL0 XCHG MOV E,M XCHG SHLD SYSTRK RET ; ;-------------------------------------------------- ;The disk parameter block ;is moved here from CP/M ; DPB EQU $ ;DISK PARAMETER BLOCK (COPY) ; SPT: DS 2 ;SECTORS PER TRACK BSH: DS 1 ;BLOCK SHIFT BLM: DS 1 ;BLOCK MASK EXM: DS 1 ;EXTENT MASK DSM: DS 2 ;MAXIMUM BLOCK NUMBER DRM: DS 2 ;MAXIMUM DIRECTORY BLOCK NUMBER AL0: DS 1 ;DIRECTORY ALLOCATION VECTOR AL1: DS 1 ;DIRECTORY ALLOCATION VECTOR CKS: DS 2 ;CHECKED DIRECTORY ENTRIES SYSTRK: DS 2 ;SYSTEM TRACKS ; ;End of disk parameter block ; DPBLEN EQU $-DPB ;LENGTH OF DISK PARM BLOCK ; ;-------------------------------------------------- BLKEXT: DB 0 ;BLOCKS PER EXTENT DIRBKS: DW 0 ;CALCULATED # OF DIR BLOCKS VER2FL: DB 0 ;VERSION 2.X FLAG ; BFCB: DB 0,'[UNUSED]BAD',0,0,0,0 FCBDM: DS 17 ; NOMSG: DB 'No$' ENDMSG: DB ' bad blocks found',CR,LF,'$' ; BADBKS: DW 0 ;COUNT OF BAD BLOCKS ccess the file. ; EVENEX: XCHG ;FIRST SET EXTENT W/BAD BLOCKS CALL SETDME XCHG SHLD DMPTR LXI H,0 ;NOW SET ONE WITH NO DATA BLOCKS ; ;Fill in an extent's worth of bad sectors/block numbers. ;Also fill in the extent number in the FCB. ; SETDME: PUSH H ;SAVE RECORD COUNT LDA EXTNUM ;UPDATE EXTENT BYTE INR A STA EXTNUM ;SAVE FOR LATER STA BFCB+12 ; AND PUT IN FCB CALL OPENB ;OPEN THIS EXTENT POP H ;RETRIEVE REC COUNT ; ;Divide record count by 128 to get the number ;of logical extents to put in the EX field ; MVI B,0 ;INIT QUOTIENT LXI D,-128 ;-DIVISOR MOV A,H ;TEST FOR SPL CASE ORA L ; OF NO RECORDS JZ SKIP ; DIVLOP: DAD D ;SUBTRACT INR B ;BUMP QUOTIENT JC DIVLOP LXI D,128 ;FIX UP OVERSHOOT DAD D DCR B MOV A,H ;TEST FOR WRAPAROUND ORA L JNZ SKIP MVI L,80H ;RECORD LENGTH DCR B ; SKIP: LDA EXTNUM ;NOW FIX UP EXTENT NUM ADD B STA EXTNUM STA BFCB+12 MOV A,L ;MOD IS RECORD COUNT STA BFCB+15 ;THAT GOES IN RC BYTE ; MOVDM: LDA BLKEXT ;GET BLOHL: PCHL ; ;Zero all of memory to hold DM values ; ZMEM: LHLD BDOS+1 ;GET TOP-OF-MEM POINTER LXI D,DM ;STARTING POINT CALL SUBDE ;GET NUMBER OF BYTES MOV B,H MOV C,L XCHG ;BEGIN IN HL, COUNT IN BC ; ZLOOP: MVI M,0 ;ZERO A BYTE INX H ;POINT PAST DCX B ;COUNT DOWN MOV A,B ORA C JNZ ZLOOP RET ; ;Subtract DE from HL ; SUBDE: MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A RET ; ;Negate HL ; NEG: MOV A,L CMA MOV L,A MOV A,H CMA MOV H,A INX H RET ; ;Move from (HL) to (DE) ;Count in BC ; MOVE: MOV A,M STAX D INX H INX D DCR B JNZ MOVE RET ; ;Print byte in accumulator in hex ; HEXO: PUSH PSW ;SAVE FOR SECOND HALF RRC ;MOVE INTO POSITION RRC RRC RRC CALL NYBBLE ;PRINT MS NYBBLE POP PSW ; NYBBLE: ANI 0FH ;LO NYBBLE ONLY ADI 90H DAA ACI 40H DAA JMP TYPE ;PRINT IN HEX ; ;Subroutine to determine the number ;of groups reserved for the directory ; GETDIR: MVI C,0 ;INIT BIT COUNT LDA AL0 ;READ DIR GRP BITS CALL SECTOR: DW 0 ;CURRENT SECTOR NUMBER TRACK: DW 0 ;CURRENT TRACK NUMBER PHYSEC: DW 0 ;CURRENT PHYSICAL SECTOR NUMBER SECTBL: DW 0 ;SECTOR SKEW TABLE POINTER ; EXTNUM: DB 0FFH ;USED FOR UPDATING EXTENT NUMBER DMCNT: DW 0 ;NUMBER OF BAD SECTORS DMPTR: DW DM ;POINTER TO NEXT BLOCK ID ; SECMSG: DB ' total sectors read',CR,LF,'$' ; SECCNT: DW 0 ;NUMBER OF SECTORS READ ; DS 64 ;ROOM FOR 32 LEVEL STACK NEWSTK EQU $ ;OUR STACK DM EQU $ ;BAD BLOCK ALLOCATION MAP ; END ON VECTOR AL1: DS 1 ;DIRECTORY ALLOCATION VECTOR CKS: DS 2 ;CHECKED DIRECTORY ENTRIES SYSTRK: DS 2 ;SYSTEM TRACKS ; ;End of disk parameter block ; DPBLEN EQU $-DPB ;LENGTH OF DISK PARM BLOCK ; ;-------------------------------------------------- BLKEXT: DB 0 ;BLOCKS PER EXTENT DIRBKS: DW 0 ;CALCULATED # OF DIR BLOCKS VER2FL: DB 0 ;VERSION 2.X FLAG ; BFCB: DB 0,'[UNUSED]BAD',0,0,0,0 FCBDM: DS 17 ; NOMSG: DB 'No$' ENDMSG: DB ' bad blocks found',CR,LF,'$' ; BADBKS: DW 0 ;COUNT OF BAD BLOCKS OCKS PER EXTENT MOV B,A ;INTO B ; SETD1: LHLD DMPTR ;POINT TO BAD ALLOCATION MAP XCHG LXI H,BFCB+16 ;DISK ALLOC MAP IN FCB ; SETDML: LDAX D MOV M,A INX H INX D ; ;Now see if 16 bit groups...if so, ;we have to move another byte ; LDA DSM+1 ;THIS TELLS US ORA A JZ BUMP1 ;IF ZERO, THEN NOT LDAX D ;IS 16 BITS, SO DO ANOTHER MOV M,A INX H INX D ; BUMP1: DCR B ;COUNT DOWN JNZ SETDML PUSH D CALL CLOSEB ;CLOSE THIS EXTENT POP D RET ; ;Error messages ; SELERR: LXI D,SELEMS ;SAY NO GO, AND BAIL OUT JMP PMSG ; SELEMS: DB CR,LF,'Drive specifier out of range$' ; ERMSG5: DB CR,LF,'+++ Warning...System tracks' DB ' bad +++',CR,LF,CR,LF,'$' ; ERROR6: LXI D,ERMSG6 ;OOPS...CLOBBERED DIRECTORY JMP PMSG ; ERMSG6: DB CR,LF,'Bad directory area, try reformatting$' ; ERROR7: LXI D,ERMSG7 ;SAY NO GO, AND BAIL OUT JMP PMSG ; ERMSG7: DB CR,LF,'Can''t create [UNUSED].BAD$' ; ; ;==== SUBROUTINES ==== ; ;Decimal output routine ; DECOUT: PUSH B PUSH D PUSH H  COLECT ;COLLECT COUNT OF DIR GRPS.. LDA AL1 ;..IN REGISTER C CALL COLECT MOV L,C MVI H,0 ;BC NOW HAS A DEFAULT START GRP # SHLD DIRBKS ;SAVE FOR LATER RET ; ;Collect the number of '1' bits in A as a count in C ; COLECT: MVI B,8 ; COLOP: RAL JNC COSKIP INR C ; COSKIP: DCR B JNZ COLOP RET ; ;Shift HL right one place ; ROTRHL: ORA A ;CLEAR CARRY MOV A,H ;GET HI BYTE RAR ;SHIFT RIGHT MOV H,A ;PUT BACK MOV A,L ;GET LO RAR ;SHIFT WITH CARRY MOV L,A ;PUT BACK RET ; ;Routine to fill in disk parameters ; LOGIT: LDA VER2FL ORA A ;IF NOT CP/M 2.x THEN JZ LOG14 ; DO IT AS 1.4 LXI D,DPB ; THEN MOVE TO LOCAL MVI B,DPBLEN ; WORKSPACE CALL MOVE RET ; LOG14: LHLD BDOS+1 ;FIRST FIND 1.4 BDOS MVI L,0 LXI D,DPBOFF ;THEN OFFSET TO 1.4'S DPB DAD D MVI D,0 ;SO 8 BIT PARMS WILL BE 16 MOV E,M ;NOW MOVE PARMS INX H ; DOWN FROM BDOS DISK PARM BLOCK XCHG ; TO OURS SHLD SPT XCHG MOV E,M INX H XCHG SHLD DRM XCHG MOV A,M INX H STA BSH A TITLE 'CCPZ Version 4.1' ; ; CP/M CONSOLE COMMAND PROCESSOR (CCP) Revision 4.1 ; FOR Z80-BASED CP/M 2.X SYSTEMS ; ; ORIGINAL CCP DISASSEMBLED BY ???? ; ORIGINAL CCP DISASSEMBLED FURTHER BY RLC ; ORIGINAL CCP COMMENTED BY RLC ; CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 ; FURTHER MODIFIED BY RLC AS V2.1 ; FURTHER MODIFIED BY KBP AS V2.2 ; FURTHER MODIFIED BY RLC AS V2.4 (V2.3 skipped) ; FURTHER MODIFIED BY RLC AS V2.5 ; FURTHER MODIFIED BY RLC AS V2.6 ; FURTHUR MODIFIED BY SBB AS V2.7 ; FURTHER MODIFIED BY RLC AS V2.8 ; FURTHER MODIFIED BY RLC AS V2.9 ; FURTHER MODIFIED BY RLC AS V3.0 ; FURTHER MODIFIED BY RLC AS V3.1 ; FURTHER MODIFIED BY RLC AS V4.0 ; SBB V4.1 11/27/81 ; ;******** Refer to CCPZ-Vxx.NOT File for Revision History ******** ; ;******** Structure Notes ******** ; ; This CCP is divided into a number of major sections. The following ; is an outline of these sections and the names of the major routines ; located therein. ; ; Section Function/ironment; use under Remote-Access Systems (RBBS) for ; security purposes ; REL EQU FALSE ;SET TO TRUE FOR MOVCPM INTEGRATION ; BASE EQU 0 ;BASE OF CP/M SYSTEM (SET FOR STANDARD CP/M) ; IF REL CCPLOC EQU 0 ;MOVCPM IMAGE ELSE ; ; If REL is FALSE, the value of CCPLOC may be set in one ; of two ways. The first way is to set MSIZE and BIOSEX ; as described above using the following three lines: ; MSIZE EQU 64 ;SIZE OF MEM IN K-BYTES BIOSEX EQU 2 ;EXTRA # K-BYTES IN BIOS CCPLOC EQU 3400H+(MSIZE-20-BIOSEX)*1024 ;CCP ORIGIN ; ; The second way is to obtain the origin of your current ; CCP using BDSLOC or its equivalent, then merely set CCPLOC ; to that value as as in the following line: ; ;CCPLOC EQU 0BD00H ;FILL IN WITH BDOSLOC SUPPLIED VALUE ; ; Note that you should only use one method or the other. ; Do NOT define CCPLOC twice! ; ; The following gives the required offset to load the CCP into the ; CP/M SYSGEN Image through DDT (the Roffset command); Note that this ; value conformh debate it was decided to have CCPZ perform the same type of ; function as CCP (look for the $$$.SUB file on A:), but the problem with ; SUBMIT.COM still exists. Hence, RGF designed SuperSUB and RLC took his ; SuperSUB and designed SUB from it; both programs are set up to allow the ; selection at assembly time of creating the $$$.SUB on the logged-in drive ; or on drive A:. ; ; A final definition of the Indirect Command File ($$$.SUB or SUBMIT ; File) is presented as follows: ; ; "An Indirect Command File is one which contains ; a series of commands exactly as they would be ; entered from a CP/M Console. The SUBMIT Command ; (or SUB Command) reads this files and transforms ; it for processing by the CCPZ (the $$$.SUB File). ; CCPZ will then execute the commands indicated ; EXACTLY as if they were typed at the Console." ; ; Hence, to permit this to happen, the $$$.SUB file must always ; be present on a specific drive, and A: is the choice for said drive. ; With this faciliRoutines ; ------- ----------------- ; ; -- Opening Comments, Equates, and Macro Definitions ; ; 0 JMP Table into CCP ; ; 1 Buffers ; ; 2 CCP Starting Modules ; CCP1 CCP RESTRT RSTCCP RCCPNL ; PRNNF ; ; 3 Utilities ; CRLF CONOUT CONIN LCOUT LSTOUT ; READF READ BDOSB PRINTC PRINT ; GETDRV DEFDMA DMASET RESET BDOSJP ; LOGIN OPENF OPEN GRBDOS CLOSE ; SEARF SEAR1 SEARN SUBKIL DELETE ; WRITE CREATE RESETUSR GETUSR SETUSR ; ; 4 CCP Utilities ; SETUD SETU0D UCASE REDBUF CNVBUF ; BREAK USRNUM ERROR SDELM ADVAN ; SBLANK ADDAH NUMBER NUMERR HEXNUM ; DIRPTR SLOGIN DLOGIN COMLOG SCANER ; CMDSER ; ; 5 CCP-Resident Commands and Functions ; 5A DIR DIRPR FILLQ ; 5B ERA ; 5C LIST ; 5D TYPE PAGER ; 5E SAVE ; 5F REN ; 5G USER ; 5H DFU ; 5I JUMP ; 5J GO ; 5K COM CALLPROG ERRLOG ERRJMP ; 5L GET MEMLOAD PRNLE ; ; FALSE EQU 0 TRUE EQU NOT FALSE ; ; CUSTOMIZATION EQUATES ;s with the standard value presented in the CP/M reference ; manuals, but it may not necessarily conform with the location of the ; CCP in YOUR CP/M system; several systems (Morrow Designs, P&T, Heath ; Org-0 to name a few) have the CCP located at a non-standard address in ; the SYSGEN Image. ; CCPR EQU 0980H-CCPLOC ;DDT LOAD OFFSET ;CCPR EQU 1100H-CCPLOC ;DDT LOAD OFFSET FOR MORROW DESIGNS ;CCPR EQU 0E00H-CCPLOC ;DDT LOAD OFFSET FOR APPLE SOFTCARD 56K ENDIF ; RAS EQU FALSE ;SET TO TRUE IF CCP IS FOR A REMOTE-ACCESS SYSTEM ; ; *** Note to Apple Softcard Users *** ; ; In their infinite (?) wisdom (???), Microsoft decided that the way to ; get a two-column directory display instead of four-column (narrow 40-col ; screen, remember) was to have their BIOS poke CCP every time it was ; loaded. Naturally, that will turn into a random poke on any non-standard ; CCP, like this one. The best way to get this CCP up on the Apple is to ; load it into CPM56.COM, at location 0E00H in the image. Thty engaged as such, Indirect Command Files like: ; ; DIR ; A: ; DIR ; ; can be executed, even though the currently logged-in drive is changed ; during execution. If the $$$.SUB file was present on the currently ; logged-in drive, the above series of commands would not work since the ; CCPZ would be looking for $$$.SUB on the logged-in drive, and switching ; logged-in drives without moving the $$$.SUB file as well would cause ; processing to abort. ; SUBA EQU TRUE ; Set to TRUE to have $$$.SUB always on A: ; Set to FALSE to have $$$.SUB on the logged-in drive ; ; The following flag enables extended processing for user-program supplied ; command lines. This is for Command Level 3 of CCPZ. Under the CCPZ Version ; 4.0 philosophy, three command levels exist: ; ; (1) that command issued by the user from his console at the '>' prompt ; (2) that command issued by a $$$.SUB file at the '$' prompt ; (3) that command issued by a user program by placing the command into ; CIB ; The following equates may be used to customize this CCP for the user's ; system and integration technique. The following constants are provided: ; ; REL - TRUE if integration is to be done via MOVCPM ; - FALSE if integration is to be done via DDT and SYSGEN ; ; BASE - Base Address of user's CP/M system (normally 0 for DR version) ; This equate allows easy modification by non-standard CP/M (eg,H89) ; ; CCPLOC - Base Page Address of CCP; this value can be obtained by running ; the BDOSLOC program on your system, or by setting the ; MSIZE and BIOSEX equates to the system memory size in ; K-bytes and the "extra" memory required by your BIOS ; in K-bytes. BIOSEX is zero if your BIOS is normal size, ; and can be negative if your BIOS is in PROM or in ; non-contiguous memory. ; ; RAS - Remote-Access System; setting this equate to TRUE disables ; certain CCP commands that are considered harmful in a Remote- ; Access enve BIOS code ; that pokes the CCP can also be modified at that time. The poke is done ; by "STA 0C8B2H", found at 24FEH in the CPM56 image. To eliminate the ; poke forever, change the "STA" to "LDA" by changing the contents of ; location 24FEH from 32H to 3AH. If you want a two-column display, set ; the TWOCOL switch below to a value of TRUE. ; TWOCOL EQU FALSE ;TRUE IF TWO COL DIR INSTEAD OF FOUR ; ; The following is presented as an option, but is not generally user-customiz- ; able. A basic design choice had to be made in the design of CCPZ concerning ; the execution of SUBMIT files. The original CCP had a problem in this sense ; in that it ALWAYS looked for the SUBMIT file from drive A: and the SUBMIT ; program itself (SUBMIT.COM) would place the $$$.SUB file on the currently ; logged-in drive, so when the user was logged into B: and he issued a SUBMIT ; command, the $$$.SUB was placed on B: and did not execute because the CCP ; looked for it on A: and never found it. ; ; After mucAUFF and setting the character count in CBUFF ; ; Setting CLEVEL3 to TRUE enables extended processing of the third level of ; CCPZ command. All the user program need do is to store the command line and ; set the character count; CCPZ will initialize the pointers properly, store ; the ending zero properly, and capitalize the command line for processing. ; Once the command line is properly stored, the user executes the command line ; by reentering the CCPZ through CCPLOC [NOTE: The C register MUST contain ; a valid User/Disk Flag (see location 4) at this time.] ; CLEVEL3 EQU TRUE ;ENABLE COMMAND LEVEL 3 PROCESSING ; ; ;*** TERMINAL AND 'TYPE' CUSTOMIZATION EQUATES ; NLINES EQU 24 ;NUMBER OF LINES ON CRT SCREEN WIDE EQU TRUE ;TRUE IF WIDE DIR DISPLAY FENCE EQU '|' ;SEP CHAR BETWEEN DIR FILES ; PGDFLT EQU TRUE ;SET TO FALSE TO DISABLE PAGING BY DEFAULT PGDFLG EQU 'P' ;FOR TYPE COMMAND: PAGE OR NOT (DEP ON PGDFLT) ; THIS FLAG REVERSES THE DEFAULT EFFECT ; MAXUSR EQU 15 ;MAXB 10H @GENDD ?N-$-1 ENDM ; LDIR MACRO ;;LDIR DB 0EDH,0B0H ENDM ; LDED MACRO ?N ;;LOAD DE DIRECT DB 0EDH,05BH DW ?N ENDM ; LBCD MACRO ?N ;;LOAD BC DIRECT DB 0EDH,4BH DW ?N ENDM ; SDED MACRO ?N ;;STORE DE DIRECT DB 0EDH,53H DW ?N ENDM ; SBCD MACRO ?N ;;STORE BC DIRECT DB 0EDH,43H DW ?N ENDM ; ; END OF Z80 MACRO EXTENSIONS ; ; ;**** Section 0 **** ; ORG CCPLOC ; ; ENTRY POINTS INTO CCPZ ; ; If the CCPZ is entered at location CCPLOC (at the JMP to CCP), then ; the default command in CIBUFF will be processed. If the CCPZ is entered ; at location CCPLOC+3 (at the JMP to CCP1), then the default command in ; CIBUFF will NOT be processed. ; ; NOTE: Entry into CCPZ in this way is permitted under CCPZ Version 4.0, ; but in order for this to work, CIBUFF and CBUFF MUST be initialized properly ; AND the C register MUST contain a valid User/Disk Flag (see Location 4: the ; most significant nybble contains the User Number and the least significant ; ny; to have the command processed. Again, under CCPZ Version 4.x, it is not ; necessary to store the pointer to CIBUFF in CIBPTR; CCPZ will do this for ; the calling program if CLEVEL3 is made TRUE. ; ; WARNING: The command line must NOT exceed BUFLEN characters in length. ; For user programs which load this command, the value of BUFLEN can be ; obtained by examining the byte at MBUFF (CCPLOC + 6). ; BUFLEN EQU 80 ;MAXIMUM BUFFER LENGTH MBUFF: DB BUFLEN ;MAXIMUM BUFFER LENGTH CBUFF: DB 0 ;NUMBER OF VALID CHARS IN COMMAND LINE CIBUFF: DB ' ' ;DEFAULT (COLD BOOT) COMMAND CIBUF: DB 0 ;COMMAND STRING TERMINATOR DB ' CCPZ-V4.1 of 11/27/81 ' ;FOR DUMP IDENTIFICATION DS BUFLEN-($-CIBUFF)+1 ;TOTAL IS 'BUFLEN' BYTES ; CIBPTR: DW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR: DW CIBUF ;PTR TO CURR CMD FOR ERROR REPORTING ; DS 26 ;STACK AREA STACK EQU $ ;TOP OF STACK ; ; FILE TYPE FOR COMMAND ; COMMSG: DB 'COM' ; ; SUBMIT FILE CONTROL BLOCK ; SUBFCBIMUM USER NUMBER ACCESSABLE ; SYSFLG EQU 'A' ;FOR DIR COMMAND: LIST $SYS AND $DIR ; SOFLG EQU 'S' ;FOR DIR COMMAND: LIST $SYS FILES ONLY ; SUPRES EQU TRUE ;SUPRESSES USER # REPORT FOR USER 0 ; DEFUSR EQU 0 ;DEFAULT USER NUMBER FOR COM FILES ; SPRMPT EQU '$' ;CCP PROMPT INDICATING SUBMIT COMMAND CPRMPT EQU '>' ;CCP PROMPT INDICATING USER COMMAND ; NUMBASE EQU 'H' ;CHARACTER USED TO SWITCH FROM DEFAULT ; NUMBER BASE ; SECTFLG EQU 'S' ;OPTION CHAR FOR SAVE COMMAND TO SAVE SECTORS ; ; END OF CUSTOMIZATION SECTION ; CR EQU 0DH LF EQU 0AH TAB EQU 09H ; WBOOT EQU BASE+0000H ;CP/M WARM BOOT ADDRESS UDFLAG EQU BASE+0004H ;USER NUM IN HIGH NYBBLE, DISK IN LOW BDOS EQU BASE+0005H ;BDOS FUNCTION CALL ENTRY PT TFCB EQU BASE+005CH ;DEFAULT FCB BUFFER TBUFF EQU BASE+0080H ;DEFAULT DISK I/O BUFFER TPA EQU BASE+0100H ;BASE OF TPA ; ; ; MACROS TO PROVIDE Z80 EXTENSIONS ; MACROS INCLUDE: ; $-MACRO ;FIRST TURN OFF THE EXPANSIONS ; ; JR - JUMP RELATIVE ; JRC - JUMP REbble contains the Disk Number). ; ; Some user programs (such as SYNONYM3) attempt to use the default ; command facility. Under the original CCP, it was necessary to initialize ; the pointer after the reserved space for the command buffer to point to ; the first byte of the command buffer. Under Version 4.x of CCPZ, this is ; no longer the case. The CIBPTR (Command Input Buffer PoinTeR) is located ; to be compatible with such programs (provided they determine the buffer ; length from the byte at MBUFF [CCPLOC + 6]), but under Version 4.x of CCPZ ; this is no longer necessary. CCPZ Version 4.x automatically initializes ; this buffer pointer in all cases. ; ENTRY: JMP CCP ; Process potential default command JMP CCP1 ; Do NOT process potential default command ; ;**** Section 1 **** ; ; BUFFERS ET AL ; ; INPUT COMMAND LINE AND DEFAULT COMMAND ; ; The command line to be executed is stored here. This command line ; is generated in one of three ways: ; ; (1) by the user entering i: IF SUBA ;IF $$$.SUB ON A: DB 1 ;DISK NAME SET TO DEFAULT TO DRIVE A: ENDIF ; IF NOT SUBA ;IF $$$.SUB ON CURRENT DRIVE DB 0 ;DISK NAME SET TO DEFAULT TO CURRENT DRIVE ENDIF ; DB '$$$' ;FILE NAME DB ' ' DB 'SUB' ;FILE TYPE DB 0 ;EXTENT NUMBER DB 0 ;S1 SUBFS2: DS 1 ;S2 SUBFRC: DS 1 ;RECORD COUNT DS 16 ;DISK GROUP MAP SUBFCR: DS 1 ;CURRENT RECORD NUMBER ; ; COMMAND FILE CONTROL BLOCK ; FCBDN: DS 1 ;DISK NAME FCBFN: DS 8 ;FILE NAME FCBFT: DS 3 ;FILE TYPE DS 1 ;EXTENT NUMBER DS 2 ;S1 AND S2 DS 1 ;RECORD COUNT FCBDM: DS 16 ;DISK GROUP MAP FCBCR: DS 1 ;CURRENT RECORD NUMBER ; ; OTHER BUFFERS ; PAGCNT: DB NLINES-2 ;LINES LEFT ON PAGE CHRCNT: DB 0 ;CHAR COUNT FOR TYPE ; ; CCP BUILT-IN COMMAND TABLE ; NCHARS EQU 4 ;NUMBER OF CHARS/COMMAND ; ; CCP COMMAND NAME TABLE ; EACH TABLE ENTRY IS COMPOSED OF THE 4-BYTE COMMAND AND 2-BYTE ADDRESS ; CMDTBL: DB 'DIR ' DW DIR DB 'LIST' DW LIST DB 'TYPE' DW TYPE DB 'LATIVE IF CARRY ; JRNC - JUMP RELATIVE IF NO CARRY ; JRZ - JUMP RELATIVE IF ZERO ; JRNZ - JUMP RELATIVE IF NO ZERO ; DJNZ - DECREMENT B AND JUMP RELATIVE IF NO ZERO ; LDIR - MOV @HL TO @DE FOR COUNT IN BC ; LXXD - LOAD DOUBLE REG DIRECT ; SXXD - STORE DOUBLE REG DIRECT ; ; ; ; @GENDD MACRO USED FOR CHECKING AND GENERATING ; 8-BIT JUMP RELATIVE DISPLACEMENTS ; @GENDD MACRO ?DD ;;USED FOR CHECKING RANGE OF 8-BIT DISPLACEMENTS IF (?DD GT 7FH) AND (?DD LT 0FF80H) DB 100H ;Displacement Range Error on Jump Relative ELSE DB ?DD ENDIF ENDM ; ; ; Z80 MACRO EXTENSIONS ; JR MACRO ?N ;;JUMP RELATIVE DB 18H @GENDD ?N-$-1 ENDM ; JRC MACRO ?N ;;JUMP RELATIVE ON CARRY DB 38H @GENDD ?N-$-1 ENDM ; JRNC MACRO ?N ;;JUMP RELATIVE ON NO CARRY DB 30H @GENDD ?N-$-1 ENDM ; JRZ MACRO ?N ;;JUMP RELATIVE ON ZERO DB 28H @GENDD ?N-$-1 ENDM ; JRNZ MACRO ?N ;;JUMP RELATIVE ON NO ZERO DB 20H @GENDD ?N-$-1 ENDM ; DJNZ MACRO ?N ;;DECREMENT B AND JUMP RELATIVE ON NO ZERO Dt through the BDOS READLN function at ; the du> prompt [user input from keyboard] ; (2) by the SUBMIT File Facility placing it there from a $$$.SUB ; file ; (3) by an external program or user placing the required command ; into this buffer ; ; In all cases, the command line is placed into the buffer starting at ; CIBUFF. This command line is terminated by the last character (NOT Carriage ; Return), and a character count of all characters in the command line ; up to and including the last character is placed into location CBUFF ; (immediately before the command line at CIBUFF). The placed command line ; is then parsed, interpreted, and the indicated command is executed. ; If CLEVEL3 is permitted, a terminating zero is placed after the command ; (otherwise the user program has to place this zero) and the CIBPTR is ; properly initialized (otherwise the user program has to init this ptr). ; If the command is placed by a user program, entering at CCPLOC is enough BUSER' DW USER DB 'DFU ' DW DFU ; IF NOT RAS ;FOR NON-RAS DB 'GO ' DW GO DB 'ERA ' DW ERA DB 'SAVE' DW SAVE DB 'REN ' DW REN DB 'GET ' DW GET DB 'JUMP' DW JUMP ENDIF ; NCMNDS EQU ($-CMDTBL)/(NCHARS+2) ; ; ;**** Section 2 **** ; CCP STARTING POINTS ; ; START CCP AND DON'T PROCESS DEFAULT COMMAND STORED ; CCP1: XRA A ;SET NO DEFAULT COMMAND STA CBUFF ; ; START CCP AND POSSIBLY PROCESS DEFAULT COMMAND ; ; NOTE ON MODIFICATION BY RGF: BDOS RETURNS 0FFH IN ; ACCUMULATOR WHENEVER IT LOGS IN A DIRECTORY, IF ANY ; FILE NAME CONTAINS A '$' IN IT. THIS IS NOW USED AS ; A CLUE TO DETERMINE WHETHER OR NOT TO DO A SEARCH ; FOR SUBMIT FILE, IN ORDER TO ELIMINATE WASTEFUL SEARCHES. ; CCP: LXI SP,STACK ;RESET STACK PUSH B MOV A,C ;C=USER/DISK NUMBER (SEE LOC 4) RAR ;EXTRACT USER NUMBER RAR RAR RAR ANI 0FH MOV E,A ;SET USER NUMBER CALL SETUSR CALL RESET ;RESET DISK SYSTEM STA RNGSUB ;SAVE SUBMIT CLUE FROM DRIVE A: POP B MOV A,C ;CSTORE HIGH MOV L,A ;STORE LOW PCHL ;EXECUTE CCP ROUTINE ; ; ENTRY POINT FOR RESTARTING CCP AND LOGGING IN DEFAULT DRIVE ; RSTCCP: CALL DLOGIN ;LOG IN DEFAULT DRIVE ; ; ENTRY POINT FOR RESTARTING CCP WITHOUT LOGGING IN DEFAULT DRIVE ; RCCPNL: CALL SCANER ;EXTRACT NEXT TOKEN FROM COMMAND LINE LDA FCBFN ;GET FIRST CHAR OF TOKEN SUI ' ' ;ANY CHAR? LXI H,TEMPDR ORA M JNZ ERROR JR RESTRT ; ; No File Error Message ; PRNNF: CALL PRINTC ;NO FILE MESSAGE DB 'No Fil','e'+80H RET ; ;**** Section 3 **** ; I/O UTILITIES ; ; OUTPUT CHAR IN REG A TO CONSOLE AND DON'T CHANGE BC ; ; ; OUTPUT ; CRLF: MVI A,CR CALL CONOUT MVI A,LF ;FALL THRU TO CONOUT ; CONOUT: PUSH B MVI C,02H OUTPUT: MOV E,A PUSH H CALL BDOS POP H POP B RET ; CONIN: MVI C,01H ;GET CHAR FROM CON: WITH ECHO JR BDOSB ; LCOUT: PUSH PSW ;OUTPUT CHAR TO CON: OR LST: DEP ON PRFLG PRFLG EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS FICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TMPUSR MOV E,A ;PLACE IN E JR SETUSR ;THEN GO SET USER GETUSR: MVI E,0FFH ;GET CURRENT USER NUMBER SETUSR: MVI C,20H ;SET USER NUMBER TO VALUE IN E (GET IF E=FFH) JR BDOSJP ;MORE SPACE SAVING ; ; END OF BDOS FUNCTIONS ; ; ;**** Section 4 **** ; CCP UTILITIES ; ; SET USER/DISK FLAG TO CURRENT USER AND DEFAULT DISK ; SETUD: CALL GETUSR ;GET NUMBER OF CURRENT USER ADD A ;PLACE IT IN HIGH NYBBLE ADD A ADD A ADD A LXI H,TDRIVE ;MASK IN DEFAULT DRIVE NUMBER (LOW NYBBLE) ORA M ;MASK IN STA UDFLAG ;SET USER/DISK NUMBER RET ; ; SET USER/DISK FLAG TO USER 0 AND DEFAULT DISK ; SETU0D: TDRIVE EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TDRIVE STA UDFLAG ;SET USER/DISK NUMBER RET ; ; CONVERT CHAR IN A TO UPPER CASE ; UCASE: CPI 61H ;LOWER-CASE A RC CPI 7BH ;GREATER THAN LOWER-CASE Z? RNC ANI 5FH ;CAPITALIZE RET ; ; INPUT NEXT COMMAND TO CCP ; This rout=USER/DISK NUMBER (SEE LOC 4) ANI 0FH ;EXTRACT DEFAULT DISK DRIVE STA TDRIVE ;SET IT JRZ NOLOG ;SKIP IF 0...ALREADY LOGGED CALL LOGIN ;LOG IN DEFAULT DISK ; IF NOT SUBA ;IF $$$.SUB IS ON CURRENT DRIVE STA RNGSUB ;BDOS '$' CLUE ENDIF ; NOLOG: LXI D,SUBFCB ;CHECK FOR $$$.SUB ON CURRENT DISK RNGSUB EQU $+1 ;POINTER FOR IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS THE RNGSUB FLAG ORA A ;SET FLAGS ON CLUE CMA ;PREPARE FOR COMING 'CMA' CNZ SEAR1 CMA ;0FFH IS RETURNED IF NO $$$.SUB, SO COMPLEMENT STA RNGSUB ;SET FLAG (0=NO $$$.SUB) LDA CBUFF ;EXECUTE DEFAULT COMMAND? ORA A ;0=NO JRNZ RS1 ; ; PROMPT USER AND INPUT COMMAND LINE FROM HIM ; RESTRT: LXI SP,STACK ;RESET STACK ; ; PRINT PROMPT (DU>) ; CALL CRLF ;PRINT PROMPT CALL GETDRV ;CURRENT DRIVE IS PART OF PROMPT ADI 'A' ;CONVERT TO ASCII A-P CALL CONOUT CALL GETUSR ;GET USER NUMBER ; IF SUPRES ;IF SUPPRESSING USR # REPORT FOR USR 0 ORA A JRZ RS000 ENDIF ; CPI 10THE PRINT FLAG ORA A ;0=TYPE JRZ LC1 POP PSW ;GET CHAR ; ; OUTPUT CHAR IN REG A TO LIST DEVICE ; LSTOUT: PUSH B MVI C,05H JR OUTPUT LC1: POP PSW ;GET CHAR PUSH PSW CALL CONOUT ;OUTPUT TO CON: POP PSW CPI LF ;CHECK FOR PAGING JZ PAGER RET ; READF: LXI D,FCBDN ;FALL THRU TO READ READ: MVI C,14H ;FALL THRU TO BDOSB ; ; CALL BDOS AND SAVE BC ; BDOSB: PUSH B CALL BDOS POP B ORA A RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY RET ADR;START WITH ; PRINTC: PUSH PSW ;SAVE FLAGS CALL CRLF ;NEW LINE POP PSW ; PRINT: XTHL ;GET PTR TO STRING PUSH PSW ;SAVE FLAGS CALL PRIN1 ;PRINT STRING POP PSW ;GET FLAGS XTHL ;RESTORE HL AND RET ADR RET ; ; PRINT STRING (ENDING IN 0) PTED TO BY HL ; PRIN1: MOV A,M ;GET NEXT BYTE CALL CONOUT ;PRINT CHAR MOV A,M ;GET NEXT BYTE AGAIN FOR TEST INX H ;PT TO NEXT BYTE ORA A ;SET FLAGS RZ ;DONE IF ZERO RM ;DONE IF MSB SET JR PRIN1 ; ; BDOS FUNCTION ROUTINES ; ; ; RETURN ine determines if a SUBMIT file is being processed ; and extracts the command line from it if so or from the user's console ; REDBUF: LDA RNGSUB ;SUBMIT FILE CURRENTLY IN EXECUTION? ORA A ;0=NO JRZ RB1 ;GET LINE FROM CONSOLE IF NOT LXI D,SUBFCB ;OPEN $$$.SUB PUSH D ;SAVE DE CALL OPEN POP D ;RESTORE DE JRZ RB1 ;ERASE $$$.SUB IF END OF FILE AND GET CMND LDA SUBFRC ;GET VALUE OF LAST RECORD IN FILE DCR A ;PT TO NEXT TO LAST RECORD STA SUBFCR ;SAVE NEW VALUE OF LAST RECORD IN $$$.SUB CALL READ ;DE=SUBFCB JRNZ RB1 ;ABORT $$$.SUB IF ERROR IN READING LAST REC LXI D,CBUFF ;COPY LAST RECORD (NEXT SUBMIT CMND) TO CBUFF LXI H,TBUFF ; FROM TBUFF LXI B,BUFLEN ;NUMBER OF BYTES LDIR LXI H,SUBFS2 ;PT TO S2 OF $$$.SUB FCB MVI M,0 ;SET S2 TO ZERO INX H ;PT TO RECORD COUNT DCR M ;DECREMENT RECORD COUNT OF $$$.SUB LXI D,SUBFCB ;CLOSE $$$.SUB CALL CLOSE JRZ RB1 ;ABORT $$$.SUB IF ERROR MVI A,SPRMPT ;PRINT SUBMIT PROMPT CALL CONOUT LXI H,CIBUFF ;PRINT COMMAN ;USER < 10? JRC RS00 SUI 10 ;SUBTRACT 10 FROM IT PUSH PSW ;SAVE IT MVI A,'1' ;OUTPUT 10'S DIGIT CALL CONOUT POP PSW RS00: ADI '0' ;OUTPUT 1'S DIGIT (CONVERT TO ASCII) CALL CONOUT ; ; READ INPUT LINE FROM USER OR $$$.SUB ; RS000: CALL REDBUF ;INPUT COMMAND LINE FROM USER (OR $$$.SUB) ; ; PROCESS INPUT LINE ; RS1: ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED CALL CNVBUF ;CAPITALIZE COMMAND LINE, PLACE ENDING 0, ; AND SET CIBPTR VALUE ENDIF ; CALL DEFDMA ;SET TBUFF TO DMA ADDRESS CALL GETDRV ;GET DEFAULT DRIVE NUMBER STA TDRIVE ;SET IT CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE CNZ ERROR ;ERROR IF COMMAND NAME CONTAINS A '?' LXI D,RSTCCP ;PUT RETURN ADDRESS OF COMMAND PUSH D ;ON THE STACK LDA TEMPDR ;IS COMMAND OF FORM 'D:COMMAND'? ORA A ;NZ=YES JNZ COM ; IMMEDIATELY CALL CMDSER ;SCAN FOR CCP-RESIDENT COMMAND JNZ COM ;NOT CCP-RESIDENT MOV A,M ;FOUND IT: GET LOW-ORDER PART INX H ;GET HIGH-ORDER PART MOV H,M ;NUMBER OF CURRENT DISK IN A ; GETDRV: MVI C,19H JR BDOSJP ; ; SET 80H AS DMA ADDRESS ; DEFDMA: LXI D,TBUFF ;80H=TBUFF DMASET: MVI C,1AH JR BDOSJP ; RESET: MVI C,0DH BDOSJP: JMP BDOS ; LOGIN: MOV E,A MVI C,0EH JR BDOSJP ;SAVE SOME CODE SPACE ; OPENF: XRA A STA FCBCR LXI D,FCBDN ;FALL THRU TO OPEN ; OPEN: MVI C,0FH ;FALL THRU TO GRBDOS ; GRBDOS: CALL BDOS INR A ;SET ZERO FLAG FOR ERROR RETURN RET ; CLOSE: MVI C,10H JR GRBDOS ; SEARF: LXI D,FCBDN ;SPECIFY FCB SEAR1: MVI C,11H JR GRBDOS ; SEARN: MVI C,12H JR GRBDOS ; ; CHECK FOR SUBMIT FILE IN EXECUTION AND ABORT IT IF SO ; SUBKIL: LXI H,RNGSUB ;CHECK FOR SUBMIT FILE IN EXECUTION MOV A,M ORA A ;0=NO RZ MVI M,0 ;ABORT SUBMIT FILE LXI D,SUBFCB ;DELETE $$$.SUB ; DELETE: MVI C,13H JR BDOSJP ;SAVE MORE SPACE ; WRITE: MVI C,15H JMP BDOSB ; CREATE: MVI C,16H JR GRBDOS ; ; RESET USER NUMBER IF CHANGED ; RESETUSR: TMPUSR EQU $+1 ;POINTER FOR IN-THE-CODE MODIBD LINE FROM $$$.SUB CALL PRIN1 CALL BREAK ;CHECK FOR ABORT (ANY CHAR) ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED RZ ;IF (NO ABORT), RETURN TO CALLER AND RUN ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED JRZ CNVBUF ;IF (NO ABORT), CAPITALIZE COMMAND ENDIF ; CALL SUBKIL ;KILL $$$.SUB IF ABORT JMP RESTRT ;RESTART CCP ; ; INPUT COMMAND LINE FROM USER CONSOLE ; RB1: CALL SUBKIL ;ERASE $$$.SUB IF PRESENT CALL SETUD ;SET USER AND DISK MVI A,CPRMPT ;PRINT PROMPT CALL CONOUT MVI C,0AH ;READ COMMAND LINE FROM USER LXI D,MBUFF CALL BDOS ; IF CLEVEL3 ;IF THIRD COMMAND LEVEL IS PERMITTED JMP SETU0D ;SET CURRENT DISK NUMBER IN LOWER PARAMS ENDIF ; IF NOT CLEVEL3 ;IF THIRD COMMAND LEVEL IS NOT PERMITTED CALL SETU0D ;SET CURRENT DISK NUMBER IF LOWER PARAMS ; AND FALL THRU TO CNVBUF ENDIF ; ; CAPITALIZE STRING (ENDING IN 0) IN CBUFF AND SET PTR FOR PARSING ; CNVBUF: LXI H,CBUFF ;PT TO USER'S COMMAND MOV B,M MVI B,11 ;11 CHARS MAX ; ; CHECK FOR SUFFIX FOR HEXADECIMAL NUMBER ; NUMS: MOV A,M ;GET CHARS FROM END, SEARCHING FOR SUFFIX DCX H ;BACK UP CPI ' ' ;SPACE? JRNZ NUMS1 ;CHECK FOR SUFFIX DJNZ NUMS ;COUNT DOWN JR NUM0 ;BY DEFAULT, PROCESS NUMS1: CPI NUMBASE ;CHECK AGAINST BASE SWITCH FLAG JRZ HNUM0 ; ; PROCESS DECIMAL NUMBER ; NUM0: LXI H,FCBFN ;PT TO BEGINNING OF TOKEN LXI B,1100H ;C=ACCUMULATED VALUE, B=CHAR COUNT ; (C=0, B=11) NUM1: MOV A,M ;GET CHAR CPI ' ' ;DONE IF JRZ NUM2 INX H ;PT TO NEXT CHAR SUI '0' ;CONVERT TO BINARY (ASCII 0-9 TO BINARY) CPI 10 ;ERROR IF >= 10 JRNC NUMERR MOV D,A ;DIGIT IN D MOV A,C ;NEW VALUE = OLD VALUE * 10 RLC RLC RLC ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD C ;CHECK FOR RANGE ERROR JRC NUMERR ADD D ;NEW VALUE = OLD VALUE * 10 + DIGIT JRC NUMERR ;CHECK FOR RANGE ERROR MOV C,A ;SET NEW VALUE DJNZ NUM1 ;COUNT DOWN ; ; RETURN FROM NUMBER ; NUM2: MOV A,C ;GET ACCUMULATED  IN-THE-CODE MODIFICATION MVI A,0 ;2ND BYTE (IMMEDIATE ARG) IS TEMPDR ORA A ;0=NO RZ DCR A ;COMPARE IT AGAINST DEFAULT LXI H,TDRIVE CMP M RET ;ABORT IF SAME ; ; EXTRACT TOKEN FROM COMMAND LINE AND PLACE IT INTO FCBDN; ; FORMAT FCBDN FCB IF TOKEN RESEMBLES FILE NAME AND TYPE (FILENAME.TYP); ; ON INPUT, CIBPTR PTS TO CHAR AT WHICH TO START SCAN; ; ON OUTPUT, CIBPTR PTS TO CHAR AT WHICH TO CONTINUE AND ZERO FLAG IS RESET ; IF '?' IS IN TOKEN ; SCANER: XRA A ;A=0 TO START AT DRIVE SPECIFICATION BYTE SCAN1: LXI H,FCBDN ;POINT TO FCBDN CALL ADDAH ;OFFSET INTO FCB PUSH H PUSH H XRA A ;SET TEMPORARY DRIVE NUMBER TO DEFAULT STA TEMPDR CALL ADVAN ;SKIP TO NON-BLANK OR END OF LINE SDED CIPTR ;SET PTR TO NON-BLANK OR END OF LINE POP H ;GET PTR TO NEXT BYTE IN FCBDN LDAX D ;END OF LINE? ORA A ;0=YES JRZ SCAN2 SBI 'A'-1 ;CONVERT POSSIBLE DRIVE SPEC TO NUMBER MOV B,A ;STORE NUMBER (A:=0, B:=1, ETC) IN B INX D ;PT TO NEXT CHAR LDAX D ;SEE IF ;CHAR COUNT IN B INR B ;ADD 1 IN CASE OF ZERO CB1: INX H ;PT TO 1ST VALID CHAR MOV A,M ;CAPITALIZE COMMAND CHAR CALL UCASE MOV M,A DJNZ CB1 ;CONTINUE TO END OF COMMAND LINE CB2: MVI M,0 ;STORE ENDING LXI H,CIBUFF ;SET COMMAND LINE PTR TO 1ST CHAR SHLD CIBPTR RET ; ; CHECK FOR ANY CHAR FROM USER CONSOLE;RET W/ZERO SET IF NONE ; BREAK: PUSH D ;SAVE DE MVI C,11 ;CSTS CHECK CALL BDOSB CNZ CONIN ;GET INPUT CHAR BRKBK: POP D RET ; ; GET THE REQUESTED USER NUMBER FROM THE COMMAND LINE AND VALIDATE IT. ; USRNUM: CALL NUMBER CPI MAXUSR+1 RC ; ; INVALID COMMAND -- PRINT IT ; ERROR: CALL CRLF ;NEW LINE LHLD CIPTR ;PT TO BEGINNING OF COMMAND LINE ERR2: MOV A,M ;GET CHAR CPI ' '+1 ;SIMPLE '?' IF OR LESS JRC ERR1 PUSH H ;SAVE PTR TO ERROR COMMAND CHAR CALL CONOUT ;PRINT COMMAND CHAR POP H ;GET PTR INX H ;PT TO NEXT JR ERR2 ;CONTINUE ERR1: CALL PRINT ;PRINT '?' DB '?'+80H CALL SUBKIL ;TERMINATE ACTIVE $$$.SUB IFVALUE RET ; ; NUMBER ERROR ROUTINE FOR SPACE CONSERVATION ; NUMERR: JMP ERROR ;USE ERROR ROUTINE - THIS IS RELATIVE PT ; ; EXTRACT HEXADECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A; ALL REGISTERS MAY BE AFFECTED ; HEXNUM: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN HNUM0: LXI H,FCBFN ;PT TO TOKEN FOR CONVERSION LXI D,0 ;DE=ACCUMULATED VALUE MVI B,11 ;B=CHAR COUNT HNUM1: MOV A,M ;GET CHAR CPI ' ' ;DONE? JRZ HNUM3 ;RETURN IF SO CPI 'H' ;DONE IF H SUFFIX JRZ HNUM3 SUI '0' ;CONVERT TO BINARY JRC NUMERR ;RETURN AND DONE IF ERROR CPI 10 ;0-9? JRC HNUM2 SUI 7 ;A-F? CPI 10H ;ERROR? JRNC NUMERR HNUM2: INX H ;PT TO NEXT CHAR MOV C,A ;DIGIT IN C MOV A,D ;GET ACCUMULATED VALUE RLC ;EXCHANGE NYBBLES RLC RLC RLC ANI 0F0H ;MASK OUT LOW NYBBLE MOV D,A MOV A,E ;SWITCH LOW-ORDER NYBBLES RLC RLC RLC RLC MOV E,A ;HIGH NYBBLE OF E=NEW HIGH OF E, ; LOW NYBBLE OF E=NEW LOW OF D ANI 0FH ;GET NEW LOW OF D  IT IS A COLON (:) CPI ':' JRZ SCAN3 ;YES, WE HAVE A DRIVE SPEC DCX D ;NO, BACK UP PTR TO FIRST NON-BLANK CHAR SCAN2: LDA TDRIVE ;SET 1ST BYTE OF FCBDN AS DEFAULT DRIVE MOV M,A JR SCAN4 SCAN3: MOV A,B ;WE HAVE A DRIVE SPEC STA TEMPDR ;SET TEMPORARY DRIVE MOV M,B ;SET 1ST BYTE OF FCBDN AS SPECIFIED DRIVE INX D ;PT TO BYTE AFTER ':' ; ; EXTRACT FILENAME FROM POSSIBLE FILENAME.TYP ; SCAN4: MVI B,8 ;MAX OF 8 CHARS IN FILE NAME SCAN5: CALL SDELM ;DONE IF DELIMITER ENCOUNTERED - FILL JRZ SCAN9 INX H ;PT TO NEXT BYTE IN FCBDN CPI '*' ;IS (DE) A WILD CARD? JRNZ SCAN6 ;CONTINUE IF NOT MVI M,'?' ;PLACE '?' IN FCBDN AND DON'T ADVANCE DE IF SO JR SCAN7 SCAN6: MOV M,A ;STORE FILENAME CHAR IN FCBDN INX D ;PT TO NEXT CHAR IN COMMAND LINE SCAN7: DJNZ SCAN5 ;DECREMENT CHAR COUNT UNTIL 8 ELAPSED SCAN8: CALL SDELM ;8 CHARS OR MORE - SKIP UNTIL DELIMITER JRZ SCAN10 ;ZERO FLAG SET IF DELIMITER FOUND INX D ;PT TO NEXT CHAR IN COMMAND LINE JR SCAN8  ANY JMP RESTRT ;RESTART CCP ; ; CHECK TO SEE IF DE PTS TO DELIMITER; IF SO, RET W/ZERO FLAG SET ; SDELM: LDAX D ORA A ;0=DELIMITER RZ CPI ' ' ;ERROR IF < JRC ERROR RZ ;=DELIMITER CPI '=' ;'='=DELIMITER RZ CPI 5FH ;UNDERSCORE=DELIMITER RZ CPI '.' ;'.'=DELIMITER RZ CPI ':' ;':'=DELIMITER RZ CPI ';' ;';'=DELIMITER RZ CPI '<' ;'<'=DELIMITER RZ CPI '>' ;'>'=DELIMITER RET ; ; ADVANCE INPUT PTR TO FIRST NON-BLANK AND FALL THROUGH TO SBLANK ; ADVAN: LDED CIBPTR ; ; SKIP STRING PTED TO BY DE (STRING ENDS IN 0) UNTIL END OF STRING ; OR NON-BLANK ENCOUNTERED (BEGINNING OF TOKEN) ; SBLANK: LDAX D ORA A RZ CPI ' ' RNZ INX D JR SBLANK ; ; ADD A TO HL (HL=HL+A) ; ADDAH: ADD L MOV L,A RNC INR H RET ; ; EXTRACT DECIMAL NUMBER FROM COMMAND LINE ; RETURN WITH VALUE IN REG A;ALL REGISTERS MAY BE AFFECTED ; NUMBER: CALL SCANER ;PARSE NUMBER AND PLACE IN FCBFN LXI H,FCBFN+10 ;PT TO END OF TOKEN FOR CONVERSION ORA D ;MASK IN HIGH OF D MOV D,A ;NEW HIGH BYTE IN D MOV A,E ANI 0F0H ;MASK OUT LOW OF E ORA C ;MASK IN NEW LOW MOV E,A ;NEW LOW BYTE IN E DJNZ HNUM1 ;COUNT DOWN ; ; RETURN FROM HEXNUM ; HNUM3: XCHG ;RETURNED VALUE IN HL MOV A,L ;LOW-ORDER BYTE IN A RET ; ; PT TO DIRECTORY ENTRY IN TBUFF WHOSE OFFSET IS SPECIFIED BY A AND C ; DIRPTR: LXI H,TBUFF ;PT TO TEMP BUFFER ADD C ;PT TO 1ST BYTE OF DIR ENTRY CALL ADDAH ;PT TO DESIRED BYTE IN DIR ENTRY MOV A,M ;GET DESIRED BYTE RET ; ; CHECK FOR SPECIFIED DRIVE AND LOG IT IN IF NOT DEFAULT ; SLOGIN: XRA A ;SET FCBDN FOR DEFAULT DRIVE STA FCBDN CALL COMLOG ;CHECK DRIVE RZ JR DLOG5 ;DO LOGIN OTHERWISE ; ; CHECK FOR SPECIFIED DRIVE AND LOG IN DEFAULT DRIVE IF SPECIFIED<>DEFAULT ; DLOGIN: CALL COMLOG ;CHECK DRIVE RZ ;ABORT IF SAME LDA TDRIVE ;LOG IN DEFAULT DRIVE ; DLOG5: JMP LOGIN ; ; ROUTINE COMMON TO BOTH LOGIN ROUTINES; ON EXIT, Z SET MEANS ABORT ; COMLOG: TEMPDR EQU $+1 ;POINTER FORC SCAN9: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,' ' ;FILL FILENAME PART WITH DJNZ SCAN9 ; ; EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP ; SCAN10: MVI B,3 ;PREPARE TO EXTRACT TYPE CPI '.' ;IF (DE) DELIMITER IS A '.', WE HAVE A TYPE JRNZ SCAN15 ;FILL FILE TYPE BYTES WITH INX D ;PT TO CHAR IN COMMAND LINE AFTER '.' SCAN11: CALL SDELM ;CHECK FOR DELIMITER JRZ SCAN15 ;FILL REST OF TYPE IF IT IS A DELIMITER INX H ;PT TO NEXT BYTE IN FCBDN CPI '*' ;WILD? JRNZ SCAN12 ;STORE CHAR IF NOT WILD MVI M,'?' ;STORE '?' AND DON'T ADVANCE COMMAND LINE PTR JR SCAN13 SCAN12: MOV M,A ;STORE CHAR IN FCBDN INX D ;PT TO NEXT CHAR IN COMMAND LINE SCAN13: DJNZ SCAN11 ;COUNT DOWN CHARS IN FILE TYPE (3 MAX) SCAN14: CALL SDELM ;SKIP REST OF CHARS AFTER 3-CHAR TYPE TO JRZ SCAN16 ; DELIMITER INX D JR SCAN14 SCAN15: INX H ;FILL IN REST OF TYP WITH MVI M,' ' DJNZ SCAN15 ; ; FILL IN EX, S1, S2, AND RC WITH ZEROES ; SCAN16: MVI B,4 ;4 BYTES SCAN17NE CPI SYSFLG ;SYSTEM FLAG SPECIFIER? JRZ GOTSYS ;GOT SYSTEM SPECIFIER CPI SOFLG ;SYS ONLY? JRNZ DIR2 MVI B,80H ;FLAG SYS ONLY GOTSYS: INX D SDED CIBPTR CPI SOFLG ;SYS ONLY SPEC? JRZ DIR2 ;THEN LEAVE BIT SPEC UNCHAGNED POP PSW ;GET FLAG XRA A ;SET NO SYSTEM BIT EXAMINATION PUSH PSW DIR2: POP PSW ;GET FLAG DIR2A: ;DROP INTO DIRPR TO PRINT DIRECTORY ; THEN RESTART CCP ; ; DIRECTORY PRINT ROUTINE; ON ENTRY, MSB OF A IS 1 (80H) IF SYSTEM FILES EXCL ; DIRPR: MOV D,A ;STORE SYSTEM FLAG IN D MVI E,0 ;SET COLUMN COUNTER TO ZERO PUSH D ;SAVE COLUMN COUNTER (E) AND SYSTEM FLAG (D) MOV A,B ;SYS ONLY SPECIFIER STA SYSTST CALL SEARF ;SEARCH FOR SPECIFIED FILE (FIRST OCCURRANCE) CZ PRNNF ;PRINT NO FILE MSG;REG A NOT CHANGED ; ; ENTRY SELECTION LOOP; ON ENTRY, A=OFFSET FROM SEARF OR SEARN ; DIR3: JRZ DIR11 ;DONE IF ZERO FLAG SET DCR A ;ADJUST TO RETURNED VALUE RRC ;CONVERT NUMBER TO OFFSET INTO TBUFF RRC RRC ANI 60H MOV C,A ;OFFS SPECIFICATION CPI 11 ;ALL WILD (ALL FILES = 11 '?')? JRNZ ERA1 ;IF NOT, THEN DO ERASES CALL PRINTC DB 'All','?'+80H CALL CONIN ;GET REPLY CALL UCASE ;CAPITALIZE CPI 'Y' ;YES? JNZ RESTRT ;RESTART CCP IF NOT CALL CRLF ;NEW LINE ERA1: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY XRA A ;PRINT ALL FILES (EXAMINE SYSTEM BIT) MOV B,A ;NO SYS-ONLY OPT TO DIRPR CALL DIRPR ;PRINT DIRECTORY OF ERASED FILES LXI D,FCBDN ;DELETE FILE SPECIFIED CALL DELETE RET ;REENTER CCP ; ENDIF ;RAS ; ;Section 5C ;Command: LIST ;Function: Print out specified file on the LST: Device ;Forms: ; LIST Print file (NO Paging) ; LIST: MVI A,0FFH ;TURN ON PRINTER FLAG JR TYPE0 ; ;Section 5D ;Command: TYPE ;Function: Print out specified file on the CON: Device ;Forms: ; TYPE Print file ; TYPE P Print file with paging flag ; TYPE: XRA A ;TURN OFF PRINTER FLAG ; ; ENTRY POINT FOR CCP LIST FUNCTION (LIST) ; TYPE0: STA PRFLG ;SET FLAG CALL SCANER ;: INX H ;PT TO NEXT BYTE IN FCBDN MVI M,0 DJNZ SCAN17 ; ; SCAN COMPLETE -- DE PTS TO DELIMITER BYTE AFTER TOKEN ; SDED CIBPTR ; ; SET ZERO FLAG TO INDICATE PRESENCE OF '?' IN FILENAME.TYP ; POP H ;GET PTR TO FCBDN IN HL LXI B,11 ;SCAN FOR '?' IN FILENAME.TYP (C=11 BYTES) SCAN18: INX H ;PT TO NEXT BYTE IN FCBDN MOV A,M CPI '?' JRNZ SCAN19 INR B ;B<>0 TO INDICATE '?' ENCOUNTERED SCAN19: DCR C ;COUNT DOWN JRNZ SCAN18 MOV A,B ;A=B=NUMBER OF '?' IN FILENAME.TYP ORA A ;SET ZERO FLAG TO INDICATE ANY '?' RET ; ; CMDTBL (COMMAND TABLE) SCANNER ; ON RETURN, HL PTS TO ADDRESS OF COMMAND IF CCP-RESIDENT ; ON RETURN, ZERO FLAG SET MEANS CCP-RESIDENT COMMAND ; CMDSER: LXI H,CMDTBL ;PT TO COMMAND TABLE MVI C,NCMNDS ;SET COMMAND COUNTER CMS1: LXI D,FCBFN ;PT TO STORED COMMAND NAME MVI B,NCHARS ;NUMBER OF CHARS/COMMAND (8 MAX) CMS2: LDAX D ;COMPARE AGAINST TABLE ENTRY CMP M JRNZ CMS3 ;NO MATCH INX D ;PT TO NEXT CHAR INX H DJNZ CMS2 ;COUNT DOWET INTO TBUFF IN C (C=OFFSET TO ENTRY) MVI A,10 ;ADD 10 TO PT TO SYSTEM FILE ATTRIBUTE BIT CALL DIRPTR POP D ;GET SYSTEM BIT MASK FROM D PUSH D ANA D ;MASK FOR SYSTEM BIT SYSTST EQU $+1 ;POINTER TO IN-THE-CODE BUFFER SYSTST CPI 0 JRNZ DIR10 POP D ;GET ENTRY COUNT (= COUNTER) MOV A,E ;ADD 1 TO IT INR E PUSH D ;SAVE IT ; IF TWOCOL ANI 01H ;OUTPUT IF 2 ENTRIES PRINTED IN LINE ENDIF ; IF NOT TWOCOL ANI 03H ;OUTPUT IF 4 ENTRIES PRINTED IN LINE ENDIF ; PUSH PSW JRNZ DIR4 CALL CRLF ;NEW LINE JR DIR5 DIR4: CALL PRINT ; IF WIDE DB ' ' ;2 SPACES DB FENCE ;THEN FENCE CHAR DB ' ',' '+80H ;THEN 2 MORE SPACES ENDIF ; IF NOT WIDE DB ' ' ;SPACE DB FENCE ;THEN FENCE CHAR DB ' '+80H ;THEN SPACE ENDIF ; DIR5: MVI B,01H ;PT TO 1ST BYTE OF FILE NAME DIR6: MOV A,B ;A=OFFSET CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE NAME ANI 7FH ;MASK OUT MSB CPI ' ' ;NO FILE NAME? JRNZ DIR8 ;PRINT FILE NAME IF PRESENTEXTRACT FILENAME.TYP TOKEN JNZ ERROR ;ERROR IF ANY QUESTION MARKS CALL ADVAN ;GET PGDFLG IF IT'S THERE STA PGFLG ;SAVE IT AS A FLAG JRZ NOSLAS ;JUMP IF INPUT ENDED INX D ;PUT NEW BUF POINTER XCHG SHLD CIBPTR NOSLAS: CALL SLOGIN ;LOG IN SELECTED DISK IF ANY CALL OPENF ;OPEN SELECTED FILE JZ TYPE4 ;ABORT IF ERROR CALL CRLF ;NEW LINE MVI A,NLINES-1 ;SET LINE COUNT STA PAGCNT LXI H,CHRCNT ;SET CHAR POSITION/COUNT MVI M,0FFH ;EMPTY LINE MVI B,0 ;SET TAB CHAR COUNTER TYPE1: LXI H,CHRCNT ;PT TO CHAR POSITION/COUNT MOV A,M ;END OF BUFFER? CPI 80H JRC TYPE2 PUSH H ;READ NEXT BLOCK CALL READF POP H JRNZ TYPE3 ;ERROR? XRA A ;RESET COUNT MOV M,A TYPE2: INR M ;INCREMENT CHAR COUNT LXI H,TBUFF ;PT TO BUFFER CALL ADDAH ;COMPUTE ADDRESS OF NEXT CHAR FROM OFFSET MOV A,M ;GET NEXT CHAR ANI 7FH ;MASK OUT MSB CPI 1AH ;END OF FILE (^Z)? RZ ;RESTART CCP IF SO ; ; OUTPUT CHAR TO CON: OR LST: DEVICE WITH TABULATION ; CPI CR ;RESET TAB CN LDAX D ;NEXT CHAR IN INPUT COMMAND MUST BE CPI ' ' JRNZ CMS4 RET ;COMMAND IS CCP-RESIDENT (ZERO FLAG SET) CMS3: INX H ;SKIP TO NEXT COMMAND TABLE ENTRY DJNZ CMS3 CMS4: INX H ;SKIP ADDRESS INX H DCR C ;DECREMENT TABLE ENTRY NUMBER JRNZ CMS1 INR C ;CLEAR ZERO FLAG RET ;COMMAND IS DISK-RESIDENT (ZERO FLAG CLEAR) ; ;**** Section 5 **** ; CCP-Resident Commands ; ; ;Section 5A ;Command: DIR ;Function: To display a directory of the files on disk ;Forms: ; DIR Displays the DIR files ; DIR S Displays the SYS files ; DIR A Display both DIR and SYS files ; DIR: MVI A,80H ;SET SYSTEM BIT EXAMINATION PUSH PSW CALL SCANER ;EXTRACT POSSIBLE D:FILENAME.TYP TOKEN CALL SLOGIN ;LOG IN DRIVE IF NECESSARY LXI H,FCBFN ;MAKE FCB WILD (ALL '?') IF NO FILENAME.TYP MOV A,M ;GET FIRST CHAR OF FILENAME.TYP CPI ' ' ;IF , ALL WILD CZ FILLQ CALL ADVAN ;LOOK AT NEXT INPUT CHAR MVI B,0 ;SYS TOKEN DEFAULT JRZ DIR2 ;JUMP; THERE ISN'T O POP PSW PUSH PSW CPI 03H JRNZ DIR7 MVI A,09H ;PT TO 1ST BYTE OF FILE TYPE CALL DIRPTR ;HL NOW PTS TO 1ST BYTE OF FILE TYPE ANI 7FH ;MASK OUT MSB CPI ' ' ;NO FILE TYPE? JRZ DIR9 ;CONTINUE IF SO DIR7: MVI A,' ' ;OUTPUT DIR8: CALL CONOUT ;PRINT CHAR INR B ;INCR CHAR COUNT MOV A,B CPI 12 ;END OF FILENAME.TYP? JRNC DIR9 ;CONTINUE IF SO CPI 09H ;END IF FILENAME ONLY? JRNZ DIR6 ;PRINT TYP IF SO MVI A,'.' ;PRINT DOT BETWEEN FILE NAME AND TYPE CALL CONOUT JR DIR6 DIR9: POP PSW DIR10: CALL BREAK ;CHECK FOR ABORT JRNZ DIR11 CALL SEARN ;SEARCH FOR NEXT FILE JR DIR3 ;CONTINUE DIR11: POP D ;RESTORE STACK RET ; ; FILL FCB @HL WITH '?' ; FILLQ: MVI B,11 ;NUMBER OF CHARS IN FN & FT FQLP: MVI M,'?' ;STORE '?' INX H DJNZ FQLP RET ; ;Section 5B ;Command: ERA ;Function: Erase files ;Forms: ; ERA Erase Specified files and print their names ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; ERA: CALL SCANER ;PARSE FILECOUNT? JRZ TABRST CPI LF ;RESET TAB COUNT? JRZ TABRST CPI TAB ;TAB? JRZ LTAB CALL LCOUT ;OUTPUT CHAR INR B ;INCREMENT CHAR COUNT JR TYPE2L TABRST: CALL LCOUT ;OUTPUT OR MVI B,0 ;RESET TAB COUNTER JR TYPE2L LTAB: MVI A,' ' ; CALL LCOUT INR B ;INCR POS COUNT MOV A,B ANI 7 JRNZ LTAB ; ; CONTINUE PROCESSING ; TYPE2L: CALL BREAK ;CHECK FOR ABORT JRZ TYPE1 ;CONTINUE IF NO CHAR CPI 'C'-'@' ;^C? RZ ;RESTART IF SO JR TYPE1 TYPE3: DCR A ;NO ERROR? RZ ;RESTART CCP TYPE4: JMP ERRLOG ; ; PAGING ROUTINES ; PAGER COUNTS DOWN LINES AND PAUSES FOR INPUT (DIRECT) IF COUNT EXPIRES ; PAGSET SETS LINES/PAGE COUNT ; PAGER: PUSH H LXI H,PAGCNT ;COUNT DOWN DCR M JRNZ PGBAK ;JUMP IF NOT END OF PAGE MVI M,NLINES-2 ;REFILL COUNTER ; PGFLG EQU $+1 ;POINTER TO IN-THE-CODE BUFFER PGFLG MVI A,0 ;0 MAY BE CHANGED BY PGFLG EQUATE CPI PGDFLG ;PAGE DEFAULT OVERRIDE OPTION WANTED? ; IF PGDFLT ;IF PAGING IS DEFAULT JRZ PGBAKET DMA TO 0080 RET ;RESTART CCP ; ENDIF ;RAS ; ;Section 5F ;Command: REN ;Function: To change the name of an existing file ;Forms: ; REN = Perform function ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; REN: CALL SCANER ;EXTRACT FILE NAME JNZ ERROR ;ERROR IF ANY '?' IN IT LDA TEMPDR ;SAVE CURRENT DEFAULT DISK PUSH PSW CALL SLOGIN ;LOG IN SELECTED DISK CALL SEARF ;LOOK FOR SPECIFIED FILE JRZ REN0 ;CONTINUE IF NOT FOUND CALL PRINTC DB 'File Exist','s'+80H POP PSW ;CLEAR STACK RET ;RESTART CCP REN0: LXI H,FCBDN ;SAVE NEW FILE NAME LXI D,FCBDM LXI B,16 ;16 BYTES LDIR CALL ADVAN ;ADVANCE CIBPTR CPI '=' ;'=' OK JRNZ REN4 REN1: XCHG ;PT TO CHAR AFTER '=' IN HL INX H SHLD CIBPTR ;SAVE PTR TO OLD FILE NAME CALL SCANER ;EXTRACT FILENAME.TYP TOKEN JRNZ REN4 ;ERROR IF ANY '?' POP PSW ;GET OLD DEFAULT DRIVE MOV B,A ;SAVE IT LXI H,TEMPDR ;COMPARE IT AGAINST CURRENT DEFAULT DRIVE MOV A,M ;MATCH? ORA A JRZ R DCR A ;ADJUST FOR LOG IN STA TDRIVE ;SET DEFAULT DRIVE CALL SETU0D ;SET DRIVE WITH USER 0 CALL LOGIN ;LOG IN DRIVE JMP RCCPNL ;RESTART CCP COM1: LDA FCBFT ;FILE TYPE MUST BE BLANK CPI ' ' JNZ ERROR LXI H,COMMSG ;PLACE DEFAULT FILE TYPE (COM) INTO FCB LXI D,FCBFT ;COPY INTO FILE TYPE LXI B,3 ;3 BYTES LDIR LXI H,TPA ;SET EXECUTION/LOAD ADDRESS PUSH H ;SAVE FOR EXECUTION CALL MEMLOAD ;LOAD MEMORY WITH FILE SPECIFIED IN CMD LINE ;(NO RETURN IF ERROR OR TOO BIG) POP H ;GET EXECUTION ADDRESS ; ; CALLPROG IS THE ENTRY POINT FOR THE EXECUTION OF THE LOADED ; PROGRAM;ON ENTRY TO THIS ROUTINE, HL MUST CONTAIN THE EXECUTION ; ADDRESS OF THE PROGRAM (SUBROUTINE) TO EXECUTE ; CALLPROG: SHLD EXECADR ;PERFORM IN-LINE CODE MODIFICATION CALL DLOGIN ;LOG IN DEFAULT DRIVE CALL SCANER ;SEARCH COMMAND LINE FOR NEXT TOKEN LXI H,TEMPDR ;SAVE PTR TO DRIVE SPEC PUSH H MOV A,M ;SET DRIVE SPEC STA FCBDN MVI A,10H ;OFFSET FOR 2ND FILE SPEC CALL SCAN1 ;S ; PGDFLG MEANS NO PAGING, PLEASE ELSE ;IF PAGING NOT DEFAULT JRNZ PGBAK ; PGDFLG MEANS PLEASE PAGINATE ENDIF ; CALL CONIN ;GET CHAR TO CONTINUE CPI 'C'-'@' ;^C JZ RSTCCP ;RESTART CCP PGBAK: POP H ;RESTORE HL RET ; ;Section 5E ;Command: SAVE ;Function: To save the contents of the TPA onto disk as a file ;Forms: ; SAVE ; Save specified number of pages (start at 100H) ; from TPA into specified file; is in DEC ; SAVE S ; Like SAVE above, but numeric argument specifies ; number of sectors rather than pages ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; SAVE: CALL NUMBER ;EXTRACT NUMBER FROM COMMAND LINE PUSH PSW ;SAVE IT CALL SCANER ;EXTRACT FILENAME.TYPE JNZ ERROR ;MUST BE NO '?' IN IT CALL SLOGIN ;LOG IN SELECTED DISK LXI D,FCBDN ;DELETE FILE IN CASE IT ALREADY EXISTS PUSH D CALL DELETE POP D CALL CREATE ;MAKE NEW FILE JRZ SAVE3 ;ERROR? XRA A ;SET RECEN2 CMP B ;CHECK FOR DRIVE ERROR MOV M,B JRNZ REN4 REN2: MOV M,B XRA A STA FCBDN ;SET DEFAULT DRIVE LXI D,FCBDN ;RENAME FILE MVI C,17H ;BDOS RENAME FCT CALL GRBDOS RNZ REN3: CALL PRNNF ;PRINT NO FILE MSG REN4: JMP ERRLOG ; ENDIF ;RAS ; ;Section 5G ;Command: USER ;Function: Change current USER number ;Forms: ; USER Select specified user number; is in DEC ; USER: CALL USRNUM ;EXTRACT USER NUMBER FROM COMMAND LINE MOV E,A ;PLACE USER NUMBER IN E CALL SETUSR ;SET SPECIFIED USER RSTJMP: JMP RCCPNL ;RESTART CCP ; ;Section 5H ;Command: DFU ;Function: Set the Default User Number for the command/file scanner ; (MEMLOAD) ;Forms: ; DFU Select Default User Number; is in DEC ; DFU: CALL USRNUM ;GET USER NUMBER STA DFUSR ;PUT IT AWAY JR RSTJMP ;RESTART CCP (NO DEFAULT LOGIN) ; ;Section 5I ;Command: JUMP ;Function: To Call the program (subroutine) at the specified address ; without loading from disk ;FormCAN FOR IT AND LOAD IT INTO FCBDN+16 POP H ;SET UP DRIVE SPECS MOV A,M STA FCBDM XRA A STA FCBCR LXI D,TFCB ;COPY TO DEFAULT FCB LXI H,FCBDN ;FROM FCBDN LXI B,33 ;SET UP DEFAULT FCB LDIR LXI H,CIBUFF COM4: MOV A,M ;SKIP TO END OF 2ND FILE NAME ORA A ;END OF LINE? JRZ COM5 CPI ' ' ;END OF TOKEN? JRZ COM5 INX H JR COM4 ; ; LOAD COMMAND LINE INTO TBUFF ; COM5: MVI B,0 ;SET CHAR COUNT LXI D,TBUFF+1 ;PT TO CHAR POS COM6: MOV A,M ;COPY COMMAND LINE TO TBUFF STAX D ORA A ;DONE IF ZERO JRZ COM7 INR B ;INCR CHAR COUNT INX H ;PT TO NEXT INX D JR COM6 ; ; RUN LOADED TRANSIENT PROGRAM ; COM7: MOV A,B ;SAVE CHAR COUNT STA TBUFF CALL CRLF ;NEW LINE CALL DEFDMA ;SET DMA TO 0080 CALL SETUD ;SET USER/DISK ; ; EXECUTION (CALL) OF PROGRAM (SUBROUTINE) OCCURS HERE ; EXECADR EQU $+1 ;CHANGE ADDRESS FOR IN-LINE CODE MODIFICATION CALL TPA ;CALL TRANSIENT CALL DEFDMA ;SET DMA TO 0080, IN CASE ;PROG CHANGED IT ON US CALL SETU0DORD COUNT FIELD OF NEW FILE'S FCB STA FCBCR POP PSW ;GET PAGE COUNT MOV L,A ;HL=PAGE COUNT MVI H,0 PUSH H CALL ADVAN ;LOOK FOR 'S' FOR SECTOR OPTION INX D ;PT TO AFTER 'S' TOKEN POP H CPI SECTFLG JRZ SAVE0 DCX D ;NO 'S' TOKEN, SO BACK UP DAD H ;DOUBLE IT FOR HL=SECTOR (128 BYTES) COUNT SAVE0: SDED CIBPTR ;SET PTR TO BAD TOKEN OR AFTER GOOD TOKEN LXI D,TPA ;PT TO START OF SAVE AREA (TPA) SAVE1: MOV A,H ;DONE WITH SAVE? ORA L ;HL=0 IF SO JRZ SAVE2 DCX H ;COUNT DOWN ON SECTORS PUSH H ;SAVE PTR TO BLOCK TO SAVE LXI H,128 ;128 BYTES PER SECTOR DAD D ;PT TO NEXT SECTOR PUSH H ;SAVE ON STACK CALL DMASET ;SET DMA ADDRESS FOR WRITE (ADDRESS IN DE) LXI D,FCBDN ;WRITE SECTOR CALL WRITE POP D ;GET PTR TO NEXT SECTOR IN DE POP H ;GET SECTOR COUNT JRNZ SAVE3 ;WRITE ERROR? JR SAVE1 ;CONTINUE SAVE2: LXI D,FCBDN ;CLOSE SAVED FILE CALL CLOSE INR A ;ERROR? JRNZ SAVE4 SAVE3: CALL PRNLE ;PRINT 'NO SPACE' ERROR SAVE4: CALL DEFDMA ;Ss: ; JUMP Call at ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; JUMP: CALL HEXNUM ;GET LOAD ADDRESS IN HL JR CALLPROG ;PERFORM CALL ; ENDIF ;RAS ; ;Section 5J ;Command: GO ;Function: To Call the program in the TPA without loading ; loading from disk. Same as JUMP 100H, but much ; more convenient, especially when used with ; parameters for programs like STAT. Also can be ; allowed on remote-access systems with no problems. ; ;Form: ; GO ; IF NOT RAS ;ONLY IF RAS ; GO: LXI H,TPA ;Always to TPA JR CALLPROG ;Perform call ; ENDIF ;END OF GO FOR RAS ; ;Section 5K ;Command: COM file processing ;Function: To load the specified COM file from disk and execute it ;Forms: ; ; COM: LDA FCBFN ;ANY COMMAND? CPI ' ' ;' ' MEANS COMMAND WAS 'D:' TO SWITCH JRNZ COM1 ;NOT , SO MUST BE TRANSIENT OR ERROR LDA TEMPDR ;LOOK FOR DRIVE SPEC ORA A ;IF ZERO, JUST BLANK JZ RCCPNLD ;SET USER 0/DISK CALL LOGIN ;LOGIN DISK JMP RESTRT ;RESTART CCP ; ;Section 5L ;Command: GET ;Function: To load the specified file from disk to the specified address ;Forms: ; GET Load the specified file at the specified page; ; is in HEX ; IF NOT RAS ;NOT FOR REMOTE-ACCESS SYSTEM ; GET: CALL HEXNUM ;GET LOAD ADDRESS IN HL PUSH H ;SAVE ADDRESS CALL SCANER ;GET FILE NAME POP H ;RESTORE ADDRESS JRNZ ERRJMP ;MUST BE UNAMBIGUOUS ; ; FALL THRU TO MEMLOAD ; ENDIF ;RAS ; ; LOAD MEMORY WITH THE FILE WHOSE NAME IS SPECIFIED IN THE COMMAND LINE ; ON INPUT, HL CONTAINS STARTING ADDRESS TO LOAD ; ; EXIT BACK TO CALLER IF NO ERROR. IF COM FILE TOO BIG OR MEMORY ; FULL, EXIT TO MLERR. ; MEMLOAD: SHLD LOADADR ;SET LOAD ADDRESS CALL GETUSR ;GET CURRENT USER NUMBER STA TMPUSR ;SAVE IT FOR LATER STA TSELUSR ;TEMP USER TO SELECT ; ; MLA is a reentry point for a non-standard CP/M Modification ; This is the return point for when the .COM (or GET) file is not found the ; first time, Drive A: is selected for a second attempt. ; MLA: CALL SLOGIN ;LOG IN SPECIFIED DRIVE IF ANY CALL OPENF ;OPEN COMMAND.COM FILE JRNZ MLA1 ;FILE FOUND - LOAD IT ; ; ERROR ROUTINE TO SELECT USER 0 IF ALL ELSE FAILS ; DFUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE MVI A,DEFUSR ;GET DEFAULT USER TSELUSR EQU $+1 ;MARK IN-THE-CODE VARIABLE CPI DEFUSR ;SAME? JRZ MLA0 ;JUMP IF SO STA TSELUSR ;ELSE PUT DOWN NEW ONE MOV E,A CALL SETUSR ;GO SET NEW USER NUMBER JR MLA ;AND TRY AGAIN ; ; ERROR ROUTINE TO SELECT DRIVE A: IF DEFAULT WAS ORIGINALLY SELECTED ; MLA0: LXI H,TEMPDR ;GET DRIVE FROM CURRENT COMMAND XRA A ;A=0 ORA M JRNZ MLERR ;ERROR IF ALREADY DISK A: MVI M,1 ;SELECT DRIVE A: JR MLA ; ; FILE FOUND -- PROCEED WITH LOAD ; MLA1: LOADADR EQU $+1 ;MEMORY LOAD ADDRESS (IN-LINE CODE MOD) LXI H,TPA ;SET START ADDRESS OF MEMORY LOAD ML2: MVI A,ENTRY/256-1 ;GET HIGH-ORDER ADR OF JUST BELOW CCP CMP H ;ARE WE GOING TO OVERWRITE THE CCP? JRC PRNLE ;ERROR IF SO PUSH H ;SAVE ADDRESS OF NEXT SECTOR XCHG ;... IN DE CALL DMASET ;SET DMA ADDRESS FOR LOAD LXI D,FCBDN ;READ NEXT SECTOR CALL READ POP H ;GET ADDRESS OF NEXT SECTOR JRNZ ML3 ;READ ERROR OR EOF? LXI D,128 ;MOVE 128 BYTES PER SECTOR DAD D ;PT TO NEXT SECTOR IN HL JR ML2 ; ML3: DCR A ;LOAD COMPLETE JZ RESETUSR ;IF ZERO, OK, GO RESET CORRECT USER ;# ON WAY OUT, ELSE FALL THROUGH TO PRNLE ; ; LOAD ERROR ; PRNLE: CALL PRINTC DB 'Ful','l'+80H ; ; TRANSIENT LOAD ERROR ; MLERR: CALL RESETUSR ;RESET CURRENT USER NUMBER ; RESET MUST BE DONE BEFORE LOGIN ERRLOG: CALL DLOGIN ;LOG IN DEFAULT DISK ERRJMP: JMP ERROR ; END E A: JR MLA ; ; FILE FOUND -- PROCEED WITH LOAD ; MLA1: LOADADR EQU $+1 ;MEMORY LOAD ADDRESS (IN-LINE CODE MOD) LXI H,TPA ;SET START ADDRESS OF MEMORY LOAD ML2: MVI A,ENTRY/256-1 ;GET HIGH-ORDER ADR OF JUST BELOW CCP CMP H ;ARE WE GOING TODvACCPZ-V40.DOC   "!$#%'&()*,+-_./0o21346587:9<;>=?@A BCEDGFHIJrKL M NOPQSRUTVWYXZ[]\S^_`aQbcdfehigjklmnpoqrstvuxw2y%{z|}~+/OEVX 1D<,-M:97>u*0N]AL'&64=G^K;8HB8s騩0҇xd8(}q-APvvt&#}q%ܡQSaqP8Rwv"C|3faG㠤&1{.O,u2:6Rj.-2nw{8&#}[ 5a=j'/\En縒ЌFװnw{18 TqvD+s=ݽ޳qt*4aΥ=.(o&')*#<2|h"=C5)ix3ҋioG&?ތ"tnPۙ׵COnK.N =PwU)ORT]@ukm'gƋV%}PɧqPbB|,Lad>2L.Dzk>SA92f>2fwcLG z]~ w{^rv#[PwU)ORTvd2S(_Ϸ9qkg9,W##W|kKkL.6;_ ۾Ѫ 5|8FW_}hڙcYL?^nv{|,ߠe|,L23,ETzDve5ah>SO&q7Dz*\#?]W‘ɯ~ !ɟ-9/ 3 t_T C {<7pDz( p|v] _4GH'h>z|2۽),B-EveP(_47 B-|*8W\^]7V!=BY&H=WRuaFg72bBJha·&H,3ulp|q,3Q7g /pljUev N^㯤&H_I#Tw{+ r:qt#ԏr3}T],~%(osMص)A>J~#B#RG/~;Ic:^#$=Jw3>ф]$!}{s6 /f\~ yo4&pdP804Z D5!O#? \# Uh&8{To>嵽.埥zHudPyW#G׍UHt_Q-2<$qe"בOFkבɏޔw18!ihF fg(Ϯ@8l6Wd<#N Z\-FkLgimNanTT)C:2G/,ag]˷B 㠻)#AƻFOTfQ I͈8ܔtUIin )pZ,}HV0EUWFG#?>+#qdfN*[M5|Za$nw{6"/N;|- (ۜ+bPk$>N%/,v֪KSJy(7F勚OL6',忙5[p&CH|0v{/$}H̸_76zxˏ"N876ze C|sM8(}.)|nznw{ϺG^$0k (e*% [.] ʑOs?z}02ηW8:̑ݘ#<)f˻Xejo7[\~uc-dr"sz7fq!A`|HHEa|#n٦"B>:H>HVGfKqٌiJIH=iiPsc'Ho/{aJO)uWh-yamԷ9[Ro:m4zssԛV){ԞZ'6 nmR[{fKnQf+ή4z'ns\=4WRE#4Fw{oDz{{6qtx,LirN{2}JB e)\{!meK-ν6nEȳJ=4ؒzCusf"jHlmIN2]{IJzko=Ao3̷)znw{18 >|>2SxuӮ~qXY=g\n#6]*m 'Hqtx9w~tTC<2}8v=8{(뢉tqPL~cYf OCU>J(8η fcJƗQIgt(NJ'Bӯ (L>BHA鑞 #8v{qt[UuS[oZ(̴5Up:2qPz8HJ;?!ȴ׵HO#|qtXDN%: rE?#xQ2CHAz ηǾO$|iXx570nw{ϒoYiryO98>&t_e xX(?|-R8(=49M ?S{6| ugg\Dz8U3kQS#g׍*~7|:2Fp:-|P>/Bugɟe[[mXO#HXIG&?E Lη@:fVH%/ere޳"SAF>7»O!76Z)ToAymK rGjHzaHo:m6hq. ,7»OGCL#\Ltqt!peryL%=_+8>S]U&vkBN^m| j÷B3NX(? W@o6kեGA)>|? BwR>KGEfG&8-wۇ?|Hj i|u>$/bd\j#{ }7 BCU@/*Zu92Lh#ǽ)/JSηirmɳxgah0Fs\Ϯη5JuqEtdjC[Sf#\M.:LcϷ⠼E~IZQu!/A92B򖟵|dt oWqRx>5)p0#_qDYP Cço8Hn9f\j>RZFơ4HNӭy*BN^+ηCt#?9R٠շ^Q@::+(|"2R#^o~H4i+"*V]$8[oF_M[LCB#_۫P3bPBu2r|oA|>3Hk>8!A{o:m6hqL\~*>|Wԅ5)A{ C-BR^\g4GG&bUV#AFgOqoA-LGR3η"uk?%Ht76)qz|dVÙHk{E8߆P+|ۍ|"D^1ӼU#qCBftkލj|qV$N Z=_4h}u yG&?id_+j657~J٠8lfߍBWCN¯zdEa*Ynw{q}Po)|M"ad#pȵV޲<2|+薇©ΥG5 # r>vpdr/oq:Dn5~~% D魵swv#7f4WF8! DHqn7"*ԴۦfV鴶ވhMV:mkN=]ln}%n<&Vdmn7{!VϳNoĭ["ZYVϝh:'ήl<򴲭{[Z]dW6{NZzgu[je[=n~%sK$)C |ޟT~:"e)K{<:2~Uʡp?J9')*RlfoIG#/~DEN74nF#6$[~<:"U)*QX/s͋Ay0ѹrm޳L.$nlpyq9U38dUY%oWg{=zɑf,}R$‘ C_0~P0̹WfG&oč.e)p(o G/92yMs(\j.Cn94P>I:"BHM f;iD*VEtdr-$nHϷ̡\S>hqP`k؛*B3J hN:cYf _N.Fd~g ʇ*BQ MR֜oFk^Dz eyQ>k|::P*zyA|H|M\~z>epqPk5FFyьό+)9|e):t*LSRG)^Vv{72w{i+[vkP\RL~>RA(B0cYf oסS3LwXudu>udPxH|MimƬϮk- l/G6I_I!IDz(O#o4$K";.>i4Zn͑M\> 5aќx,LC'k^(?I|::l/#0Yrv{ϒoDzJN 85l͡4"{X.PWηPG _Ⱥ5j=zɑaXs | 'J:2|%|kB|,La3k5Qe&jԿL ޣ\A[DJCi.=\M7M->Y<4-ODלof͌<n4TF>Q>2qܛPG_5ۤ-Awˏ8udG(?哒~G*?zG-$T#<#f&G#4㠻 Bmly(L>+|Judt }_ߍjીLJ8(=#|.G oF_MN=,EH#? !A޷iϮ[s6#ջOלo N3SB:78ݚWFGBïݚPH|  BSH|M75P>>ޏl!ϷA3PEvk@(&@:^q < AvkCfW*yg8+N 8RE|7{x\gtoB-[H#T(/(_\s/O?jbH8!A[~fo!|>eg ʑɧp-:M.|>T> \ɒ|eryg巴4/3+#ǽ9RhP$ahη\t?چCƑo:m6hqL/#—nӬ) (|m ygη"@ydP8,S*F:R^\C-Bݘ#ϷM-)>|f\76zx $.ìyi$}rdq.f |>ȼ KPkn8ܔە^ۇ/B |f|U@_lfWކ_ SGt!{m.?Yּ $#y)ʆ.z7VrqPL>qL.ǽ*toFq58 #3OA)f'JS(og.:pb4*P\t?*PꮮѨ@+d =Ǟ##ߍ|"^G&?Ew]nD,v#&DzF>QL3 ֺ,o̪NFk k{E]o6Xf~cV}p 04ZxdP_+Ұ>o-<ˠw1 yƁ|,%)<2}M2[-{:i9nѢG]JB.FR\HiN ?SxFwb4zj\~rjZ:ħ&z9F7:sW׷zi+MVhTjFF9q}4룮>?1{#Ghݕu [IXFQqэhԸ>}QG]XǴGr\>裍Jںsܭ$,*/6~Ը>}QGc9?}#G5ǍmݕE%^94 yToxd5ז["xWhTzdF's;ذ5}L׿A{L7A4ѻF(F7Qo}EO EnE(F7Qo}GF>}4h轶/ruum}4hGF>}4hGF>=94 yToxdx"H蛌#޾r'iD&qlB{AF~+ۜQzWhTnwQ[#Fp_C =?Sn8ȳ-莴"'8;M/v?nܻ`}_&DzRqmmNyN~#Bt{n=&>&60 fszkQK6sn[=ol7xvviHrrK$qHB3Q]b4ZtZ[7"Dwr>6EF0WhTF=Dx,}CaƌUuCnO#Ve)t uH=g-Ei.zڟf/Wn̵J}~>Sx\_̵ :wp:ޣH9<͖u"t4=WO3Qw{~$}\>[R)He}\w{΂ h<{mfC=2}p ! OSq^0G: v{>2S( >؀Γ=Wxvؒ:2}i{X¯B׽?zc8?S{>HY,3wQU_n=U`P| ! yx_4[RGLul=2SUlfߟB=`G8?SxdGaB],vBvyk3ˠ*#ӏ>H43G5td|,Lnw0G: e) d_4!npSPxfA#{9fFLTÏԵ?g3 Ƞ^#'nw{6ybs^YPLM#Ԋ')|GLOle)tLW5_ʴf{ LRge*8ޣqdzB?Χauyb*͡=2}7P+fD 6;_/mnw{Yis6 ~FzΦ98̑i+[Dz}I gzjx}Al?l49=zN}:wQ.Xi3E0.hCh裆U~92=gueP0s6QaLO[z>ep;HU9;UxkbMeDPaonoszh yˇP{ -Ki[n8d\}Gˏ^|,LUyo"S Uy#1[nJ 7<η~Ր޳Ԑ=#G&_N~onoszhx3CUə.C:ߊO!oy »1C R}e58 BIk4چ>SG ]JoF+jv{=-l#/W&P^6F7#-f|+N4-L.ǽy4wR8R|udC~ rdr7F|KSqĪKQ yg|H'V_J2׼($*5[dryZktk$Dqd7#W%U)wG&ηXB։M(CU5'zfi^T8k|[dYIwp>(GCqEI^WgPmG&txtoU){6BG&osM4ߑNJy㠻G]LݚwCX8 |;S|ir`4amNoFz(B@*m7fC>MLZ}Ԑ_4qt}3rհp:"']}nwnYi?U)ӈ!T~G:*=RT-2(H[>>g;)^U>:2~Uʡjcp$v@Ki[n T43^ui*N#ݯJ9&)*UӘ⠔79=4BM^+.?T 1C m57Pgqɟ)p]tqm܊F/{=j-|S^Q@G`-|%~=حH^4zϥqK$ғ>_dXwr>6Ez\V2{\["9m$unDUH3VM!T'm:m6hNkv$nŭӶVnַZYVϳoa%H3nĪ_tLjfWz8ٕ͞ӶVnַZYVϳjmlnf9rK$ 72wKk5+=f7{!VϳNoĭݮ{f O+-̮p+=miݺͭoĭg7̒=DrHzqnDn#=.TDH#qWRIGvL./薟F>2)/ .0RmB7|*L>Uy^_q, DC<̝Lv>HzO9H=g[-{mDF8ȳEy6k$d/sHB3F=z7ޤo&25G6ӑifVQs _w{~A8TЫqnы>Քg /P'25 tEG_q|Wg-]i325ahVAGf8L_q$g.ôZ?ޣoymnw{Yy6{mfC=2}i3 !>*}|qٌ8L?hoG'ޣXAllƻ=g[潶YP?5~Aξ~8p,3#T/oMTitf{E]꫟ !}cLVAGL|i:2_9y * {j5_c[Ė#}#W57܈}ߌR/U@&1j*9<͖#F!ݯj}UooFsFk[2zd8JB_j g{Uətd|,L&g92}{"tZ">jY%+us6PA=zԥ?4еOfa.xGRU9;¢G:MnM 82G6;_w{Κ`^YPLXM3sTU9;Zw{7+ًu>H^l;=zC}U<7xߌ87iv{> $čEVsa8k3ˠ8Kifj gB>Qn#xd8$_<Ne){*NqaĆR}3>wDw{!'b~_yHU!}<#qp笇ir=,¡pd/?grj5G6{XU9H|0yZ+^_4ClO=2}򗢚O#M 3G/ΪDZ{[shxe#0׵sw*M]V3GkFkaCuvjxC4[{U8P`û@U~dw{Κ8cA}Φ9y>RřPL_}Q}.{M,3_e׾ #9Sv{~֏~T )*i8^馡#Ӈ*Nޣw͆=g뭞uYPLifj7Px4ЀJ8L.e)pMsBQ^/Zʟ)pT8RDz(/#T,Go7WӃxs{C{>hr@nw{q%z>>z>MyCǛۜ!ތP8oJ)Px7fCB/ [>hU,\ޯJ)TηÀ!>4&')!jʕiFE5r oG8?~qBˑA&70#-sR+AXgfyir[>B8nB^Υin[k?Nln]#8W5ORTs#k4HNj#fM)ubU)ktшfɉUW2Y.Nm5Nsv{podJX5{9xdPPqtn '#}#Sk04 ]=ۍ~odJJ]U^4NG:'SzTw{ϊzNson^88s'Lы^NwݶΥe:u3vш["99ԏt7FԉU{nF#։^ɉU͛iĪ|և*NnF#r϶YƆ{\sK$psH#Rwc8]9M7.Nnn 'ҥ8R)iv]1ԏtNtip8gj3HXinSgLWcNvswzj2ZkܺF?nDsK$'V5N3Ȕ:y<ۍf^98t%sȠ? 8NGFainm*{IHdJJ]Uo a3u umKӻZ5D/)G>ф]!n79tZRomq:lJ} ZYA4-bkq|ɑi?92SuG/ QGLB0,3_Nj 5,7=ޣ~pBPȠ/ѽwxG"GzhMɼ8̑č)YAq@#ھGʆ߅/q|lE7{7hrdzIG&_SבɻG_EQg L դ=^fU0Fsw{EU}7Qa $Lvnw{ ~űa7ۗnw{1䋣*$KqtO#o8(}L)c'8qtxir8+jL44zqVnwG=s{\)Gi笇gռf| iHGV0O!$nw{ϙ+ֽek$D=UxNs|ޣ8L;I( Cf롾;nw{=T2<+#Px\kfi-|**T-RLB<2XCi54?ˠ|f(Gלo#ՑDz8b'aMn832~ʼnh"oqޯjևZh%v N:T9H3ow3M>cYf nw{Y&G׍UHts FD*#Z02η&<2*Px$>|q.|Pو~GF,?S| Xx? _5S7ޯkQSA鑾9Ϸqܛt>[l]E3 ֪«3nwޣYcYf /L7uvL"o_F%8+#$=Ri2>'= G&o r*\L oFz:\j#ʩ_N>־ -.e)$/b rdH߈ oyU|}A 7#|,L ]~ |d7F7qE&}c4W|ɏ|A |PgFy5fP/Z*Ϸqt[UuS[> !ZxirE3"82(? N\ G-R_w]%/,,3@49[ʯBcIYng  8S#2.R*N=J^+#cYf  L8LoonoszhL=\o6֐<2|%F+H,3A% :M4P^ϷĜJ\pq)-L.A &R|,LP8²h[֪!y:2\4H#e)pBDaf5-L~ҵWTj9Ӊ&($oExq%CHps2Nj/E5win?jf {\sK$pS}~s2w{ϑ["9 J=ߍ~s2F/sNsonK]U޳NG:'SzT℮J}} ՘ahSm夁L[k4sgKSU)»!j4nrƔ-*=24ߑNJyr(<G&_]7V!}VN F~hD,RD \"n;M7?iC:yt78͕on 9tbUg ?n5>̀~#Nj=l%ě4nC:k3pod^C:ytEucl _eQ\^]7V!-e),F>BXLTGw1WRFs|j= apF4W^Z;678͕on_Nb{\PM(!_ZtU͡~ 72ĪVÚ{6497SXr6~7sbUxqPiĄxsϷ@),|{\ fo4ĪGy_CkjHzq Sʑ8rSX(yoop+1!ތP82x7fG |j 5ptdQ7~KSnwm5uϙί$DLm5xs"tzV3B3LZtYAPkC:cCu)BSsK$񗢚).n969tZ񗢚Mqܾ"sK$񗢚UscCu)S7-_j>Wqد8|"t:,vZ3w{ϱi94wZ;~5s:Jm+<-BqK$w):4=&Nt}E:9nҼ?Z_i5*NWxZ79rK$wu8L ߟBd_5s%=#dpmE?χP\Nw>R3w{qsn_LO}1}ta~űaәfӚ{[n[kfV=-WxZY2䡭Y系5s%=#dmR3w{ϑlmXռ_j"sDrnbU)xHs$6[[&V5񗢚-Xռ_j"mW >F:i`;(I%mKӚ{fk܋{#6[[#ں&D\lm=۞Z3w{Q3JvtфaB|GZ~t^4#A鑞 #?2S<ꦽߥ M62Si2|,LCP|*A|TG'G5 ّf,}RaD~P0#:uBQ|E5 )P\ޯJ)Ϯ8R]*XWo5D|T@e)pu‘M,3ީ~U9;2}>eP hxь3]j#$č)a縒Q8PYG&?2SPxa4p82PM㠻ۢ/Jy>NW6d|X_I} OLR^(X[uӮPޥ)FDz8fCBȠP苢mΦ9)|:2X ɟF~>5=lR?η r!O‘ORTGl!cYf $08d< ] _lGElB"iּpw3@)R#JzΦ9*qd,3wL-$Tf*F0we)IEQ)HY̡݊#? q<^ 2s6Q͇xd|,L;HJsDz(ϣnq]B <)>Hx,Lv.|;Ss_e 8^5~? j5㠻(g o>RH^YcYf S7jԏf&f͌H~7s|KX ɇTW6dG&?g|tHHxNƟ)peM. ,3wVs5qtH^)#LUTc4pz=R]j|d,3ARhf9h"of͌*\@~7s G&?2S$ݨZ(f^~@yd62U͡~ 72ĪVÚ{6:MδP~1U)]X^V3K7{<ʋ6jf fo4<*Q@z82ލ؋A^[ ͐<:.p6Og[,!ތƜX(Y?jf fwc~Vs5~v hlm_Z;6鳭f!ܾE6z s&-wĪP?itbUsynw{qKa=Aw_ui)OJk9*Q81'V|m5voRphM I![RHZ}-|5fP/ZۆV3ۈZJ}A^g{=waj!϶FxsvҲLA-jcYf nw{1躱 nj@Q>2|JBT>2SX2ricYf F>Q_d8{]2|Vs5p͈ી 2A33=>SܾJ9R}.E/oEi.i.E^N梟}5Gҷ a$nwe)^[n䜮;!ܾ Ԛ{+S//B' LI3^\\ZX(Bu{E&oCU~:NUzucYf 3O['vO9HvF:i`;(I%mKӚ{u]זN{miGw{ϑNn͹g=mn{j=ǦgqakLa$nwnwx,La$nwa?;?2}fI?9Sahݮs$<7' >8R#["97' .ncX@0Li=ٺlmk\s$|+90'|+9sK$'_Vs&p$nq<9{dsiq<9۞Z3w{ϑLvoW#N/#$Ϯ|W#Ϯe9Eߤ82}~dj>~;8162S]S0R|v]E3|8 B~]Q]f`>8R#k\n䭵7 LwF6+#40s4wZ;~5slq=.-S@y֡3Pjڀܴ>9!qn{j=,|,LBM颟rdwFvcYf 3ߠr2x7fy:hCEa_q$#kD)ݮslʞFkxn_L-FkxHr~_q, DtYfcq{lsiv.Nkn96he~sl%ז["9Ϙ᳭f~AHOQϙsl6>jf -.g[,6["9ϘS<Z}u̱[Y8 Hg3jƱהG&oϠ>NjH#vW2*8(~4347ChfG.G&Dz8~.|q7Chf&6|Huduc0sg]OL~MH|d8pF.-dg D <9vkP)G&-L>jHqF>Q.L.Aw\$G&yׄfMgtF>FFywT_D3sD.E3"82( =ۈ8|d,3AW6dG&?gr͇H!|A\_'/2 /*?gW8:-L>ߊ*$!,aC_UCz8 jnwnw{~sAׂ6fsh8pqAjA)|k>i*NK{dn8kSP+qg O!Vsu7msA\iZPq}^lGo3qMksz)юZX@sW6њmyZ=ዢ<2SxH{=g EQaJ!$wQ_l=xe#ʼּѽ8ahq}.CnYj2#OjӠ6?'8W\> '|'|*\SMΠ ȕ2(on-#(F)pddP)S{]p勀52|$ R82X *婽XH8!#Ϸ!ƖORTʑ}3r#e)pьL>Nدw8VM oyUzy:<η5)i|Oskbp4.B'8EimQ!-_.[>Q]N~|((׵sw{l%ě ~N#"tv@(m5xs۹¡V_CN\~:M%/^V|m9%ě=Lg[g f*#!T'oCu]Nk/Z>fvX̷8]S0RoY9ےE^4cynׇYjn98bxq%̬@vh+[)`M͋imW >F:i`; uVOmk\slmq8Ns^rK$oYN4/Bu[[7q[fV캋im@/ؖt~:P| h[7hw5fPhS(_Ϸ!~75P~kPxkH^Y&߯J9$oA<"T_e Φj̪*\t˧A:xeϙN0fA92(oFӅ+L~kcYf Rory!iFyzsH_\-;drGhdS/_G#HuE}3.662Syfv~FA L_^N?ґ4 r0K=Gfܾ"޳Ƀ^N"ncX@0Li=GIH*mk\sYifm5{H4V3K:Hif3w3Pkn9*L|6 ~N#@G-Bg~Fկ F[D4PQ+amRE@pAh"oWgqjX‹<}3rsDz8iWKL;科eGϮFp?k8Atd[*j= ӌa;TE< H8{zߌ\km>ekNv#Ց/*Z8:$/,/ݛC|2{,v& #g琎 GXqt| ]Aqdx#OjӠ6ݤfZ [dx,LyMSx,Ly )aperyqtXD<Nu.N~ _e (]W4P|cIpVn4]Fh&H,3Q7Ng`w+h~(vSV#ۺV' !XHAun w[ Gmmi+FkAlд?8 nwva[hvm6ꛥm $m Lj$8ahqm vRݶ yt04Z!苢mچRl+(8 q<2S苢ݶ g6l+H x>e$}E5m6g¶mZHXXwE_ms)h[A[-p}QT۶캶pmǺm jxNC|w۶ g[?)l+UtT'_pm6m9;ǻmY׶-?=2SxHy?mX6j+(無Z_EQnfcf۰ض!yNدwF; ; CCPZ Version 4.1 ; ;**** Revision History **** ; ; MODS BY SBB 11/27/81 V4.1: ; 1) Local version 3.2 merged with RLC version 4.0 by adding ; cosmetic changes, and the following noted changes from ; version 3.1. Local version changes from 3.1 to 3.2 match ; RLC changes from RLC 3.1 to RLC 4.0, and were not merged. ; 2) MEMLOAD restored, fixed up exit conditions instead -- either ; everything is well, in which case returned to caller via ; RESETUSR, or error occurred, in which case no return, exit ; to MLERR (formerly COM8). This looks a lot cleaner, and ; yields up a few more bytes of space. ; 3) Added TWOCOL assembly switch to give two-column printout ; on DIR instead of four if true. This replaces the Apple ; Softcard CP/M BIOS runtime patch of CCP to do the same thing. ; They actually patched a hard CCP location on every warm boot, ; instead of patching the image before writing to disk! ; ; MODS BY RLC 11/8/81 V4.0: ; 1) Moved CIBPTR to byte aff the ; other single-byte memory buffers were merged into the code ; itself, resulting in a two-byte savings on each buffer, but ; violating the software engineering principals of keeping the ; data and code separate. All in-code modifications are clearly ; marked in the comments. ; ; MODS BY RLC 09/30/81: ; 1) FIRST BYTE OF SUBFIL CHANGED FROM 0 TO 1 TO FORCE $$$.SUB ; TO BE ON DRIVE A: (PHILOSOPHY CHANGE); THE OLD SUBMIT PROBLEM ; IS RESTORED BY THIS, BUT THE NEW SUB.COM FACILITY (CCP.COM?) ; SHOULD CORRECT IT BY ALWAYS CREATING THE FILE ON A: ; ; MODS BY RLC 08/16/81: ; 1) INTERNAL PRINT FUNCTION CHANGED TO TERMINATE STRINGS ON CHAR ; WITH MSB SET AS WELL AS STRING ENDING IN 0; THIS PERMITS ALL ; MESSAGES PRINTED BY CALLS OF THE FORM ; CALL PRINTC ; DB 'Message',0 ; TO ALSO BE PRINTED BY CALLS OF THE FORM ; CALL PRINTC ; DB 'Messag','e'+80H ; NET RESULT WAS THAT ONE BYTE IS SAVED ON EACH MESSAGE ; 2) SOME ERRORS IN EXISTING INTERNAL DOCUMENTD, ITS SUPPLIED ; VALUE IS EASILY INSERTED INSTEAD. ; ; MODS BY RLC 07/29/81: ; 1) CODE COMPRESSION MADE BY FJW AND MENTIONED IN HIS MESSAGE ; OF THIS DATE INCORPORATED ; 2) HEXNUM (HEXADECIMAL NUMBER INPUT ROUTINE) EXTENDED TO ALLOW ; 16-BIT VALUES; GET AND JUMP CORRESPONDINGLY MODIFIED, AS WELL ; AS DEC NUMBER ROUTINE FOR HEX ESCAPE ; 3) DEFAULT HEX VALUE IS NOW ZERO (NOT 1 AS BEFORE) ; 4) ADDITIONAL PARSE CHECKING IN USER ROUTINE REMOVED; USER WITHOUT ; AN ARGUMENT NOW DROPS THE USER INTO USER NUMBER 0 ; ; MODS BY RLC 07/27/81: ; 1) ESCAPE FROM DEC TO HEX INSTALLED AND ESCAPE FROM HEX TO ; DEC REMOVED; THIS REFERS TO THE '#' CHAR WHICH IS USED TO ; CHANGE NUMBER BASES; Change as per group discussion ; 2) SAVE CHANGED TO DEFAULT TO DEC AS NUMBER ARGUMENT; ORIGINAL ; FORM OF SAVE COMMAND EFFECTIVELY RESTORED; Change as per group ; discussion ; ; MODS BY RLC 07/20/81: ; 1) RADICAL RESTRUCTURING AND ADDITIONAL DOCUMENTATION ; 2) REMOVED MOST SYSTEM-RELATIVE ter CIBUFF (reserved space for CIBUFF was ; changed to BUFLEN+1); CIBPTR is now in same relative position as ; it was in the original CCP, but, since the buffer length is ; different, CIBPTR is not in the exact position as in the original ; CCP ; 2) Added features for and equate for Command Level 3 (CLEVEL3); this ; command level explicitly supports the introduction of a command ; to the CCP from a transcient program; to do so, just fill CIBUFF ; with the command, place the character count in CBUFF, place the ; User/Disk Flag (see Location 4) in Register C, and JMP to CCPLOC; ; see the DOC file for detailed explanation and sample program; ; Command Levels are: ; 1 -- User Input from Console ; 2 -- Command Line Input from $$$.SUB File ; 3 -- Command Line Input from Transcient Program ; ; MODS BY RLC 10/20/81: ; 1) Error in MLOAD corrected. During the conversion to V3.0, an ; error was introduced in the command-search hierarchy implementation ; in whicATION (TRUE FROM ; PREVIOUS VERSIONS BUT NOT NOW) CORRECTED ; 3) DOCUMENTATION ADDED BEFORE CCPR EQUATE TO EXPLAIN WHAT IT IS ; AND HOW IT MAY BE CHANGED TO MATCH A PARTICULAR USER'S CP/M ; 4) THE TOKEN EVALUATOR FOR DEC-TO-HEX CONVERSION CHANGED SO THAT ; THE FORM OF A HEX NUMBER IS NOW xxxxH AS OPPOSED TO #xxxx ; 5) THE SAVE COMMAND NOW HAS AN S OPTION WHICH INDICATES THAT THE ; NUMERIC ARGUMENT IS THE NUMBER OF SECTORS RATHER THAN PAGES: ; Ex -- ; SAVE 10H TEST <-- SAVE 10H PAGES INTO TEST ; SAVE 10H TEST S <-- SAVE 10H SECTORS INTO TEST ; 6) THE 'Read Error' MESSAGE IS REMOVED; CONSIDERED REDUNDANT ; 7) GO MADE INTO A NON-RAS COMMAND; I MAINTAIN THAT GO SHOULD NOT BE ; EXECUTABLE FROM A RAS FOR PROTECTION OF THE SYSTEM, BUT ALLOWED ; GO TO EXIST BECAUSE OF REQUESTS FROM OTHER MEMBERS OF THE GROUP; ; RAS'S ARE PROTECTED BY THIS STEP SINCE A USER WHO HAS GARBAGE IN ; THE TPA OR A NON-ENTRANT PROGRAM CANNOT ACCIDENTLY OR PURPOSELY ; EXECUTE SAID GARBAGE AND CRCONDITIONALS AND ADDED ; SIMPLE VALUE-EQUATE FOR CCPLOC (This came from a group ; discussion and creation of the BDOSLOC program by RLC ; which supplies the required value to the user.) ; 3) CODE OPTIMIZATION AND SIZE REDUCTION IN SEVERAL PLACES ; 4) RESTRUCTURING OF CCP-RESIDENT COMMAND SCANNING PROCEDURE ; AND COMMAND TABLE (TABLE ENTRIES ARE NOW OF FORM 'NAME',ADR) ; 5) ADDED 'JUMP' COMMAND OF THE FORM: ; JUMP or JUMP ; THIS COMMAND ALLOWS THE USER TO "CALL" THE LOADED PROGRAM ; AT THE SPECIFIED PAGE (256 BYTES/PAGE) NUMBER OR, IF PAGE NUMBER ; IS NOT SPECIFIED, THE PROGRAM AT 100H IS CALLED. THE DEFAULT ; PARAMETERS IN THE COMMAND LINE ARE LOADED INTO THE SYSTEM ; PARAMETER BLOCKS IN LOW MEMORY (TFCB, TBUFF, ETC) AS FOR ANY ; OTHER COMMAND SO THAT THE COMMAND LINE IS PARSED AND PASSED ; TO THE PROGRAM. A SUBROUTINE CALL IS MADE, SO THE MEMORY- ; RESIDENT PROGRAM MAY RETURN TO CP/M VIA A SIMPLE RET INSTRUCTION. ; THE ONLY RESTRICTION h the TSELUSR was not being reset properly. ; 2) Stack area was discovered to be inadequate through the various ; revisions. Stack was expanded, and is now believed to be of ; sufficient size to handle full utilization of the stack. ; ; MODS BY RLC 10/12/81: ; 1) Error in MEMLOAD corrected. The default User Number was ; being reset before the read of the file into memory and after ; the open of the file were done; this resulted in the ability ; to load only files less than 16K in size from User Numbers ; other than 0 and some other strange side effects. This was ; corrected by having MEMLOAD call MLOAD (the old MEMLOAD) as ; a subroutine and then resetting the Default User Number after ; the return. COM8 was also changed to accommodate the additional ; entry on the stack. ; 2) Radical restructuring of the buffers. The IORESL buffer was ; found to be unnecessary (it was used in previous versions and ; not referenced in the current version). Also, most oASH THE SYSTEM; ; GO IS REDUNDANT WITH JUMP 100H ; ; MODS BY SBB 08/01/81: ; 1) MINOR ADDITIONAL CODE OPTIMIZATIONS TO GAIN A BIT MORE SPACE. ; 2) ADDED "GO" COMMAND FOR COMPATIBILITY WITH MANY OTHER CCP'S. ; SAME AS "JUMP 0100", BUT IS NOT A "RAS" COMMAND (NO REASON ; IT SHOULD BE). ; 3) PUT "RESETUSER" CALL MADE JUST AFTER "CALLPROG" BACK INTO ; "MEMLOAD" WHERE IT BELONGS TO PREVENT FUNNY USER NUMBER ; CHANGING AFTER CALLED PROGRAM RETURNS. "MEMLOAD" WAS THE ; REASON FOR "RESETUSER" ANYWAY. ; 4) RESET DEFAULT DMA BUFFER WITH "DEFDMA" RIGHT AFTER CALLED ; PROGRAM RETURNS. THIS IS THE REASON PROGRAMS LIKE "STAT" ; WILL MESS UP A "SUBMIT" RUN. FIX THIS IN ANY OTHER CCP ; YOU RUN INTO. ; 5) DEFINED "FENCE" EQUATE TO ALLOW SEPARATION CHAR IN DIR ; TO BE SET TO TASTE (":" OR "|" ARE TYPICAL). ; 6) PUT IN SYSTEM SIZE (MSIZE) AND EXTRA BIOS SIZE (BIOSEX) ; EQUATES FOR CCPLOC CALCULATION, IN CASE USER KNOWS THOSE ; AND DOESN'T HAVE BDOSLOC. IF BDOSLOC IS AROUNGTO THIS COMMAND IS THAT A JUMP 0 WILL BE ; INTERPRETED AS A JUMP 1. ; 6) REDUCED THE SIZE OF THE COMMAND LINE BUFFER TO 80 CHARS ; (SEE THE BUFLEN EQUATE TO CHANGE THIS) ; 7) HEXADECIMAL NUMBER INPUT ROUTINE ADDED AND DECIMAL NUMBER ROUTINE ; CHANGED TO ALLOW FOR ALTERNATE (HEX) BASE; HEX ROUTINE NOW ; RECOGNIZES THE 'NUMBASE' CHARACTER (SEE CUSTOMIZING EQUATES) AS ; A FLAG TO USE THE OTHER BASE ROUTINE. FOR INSTANCE, TO SPECIFY ; SAVE F (DEFAULT NUMBER BASE IS HEX), THE USER MAY ISSUE ; EITHER OF THE FOLLOWING COMMANDS [NUMBASE="#"]: ; SAVE F or SAVE #15 ; THE ESCAPE CHAR [#] MAY BE CHANGED BY ALTERING THE NUMBASE EQUATE. ; 8) 'SAVE' AND 'JUMP' COMMANDS CHANGED TO USE HEXADECIMAL ARGUMENT ; BY DEFAULT ; 9) ADDED 'GET' COMMAND WHICH LOADS A FILE AT A SPECIFIED PAGE ; ADDRESS. FORM OF THIS COMMAND IS: ; GET ; 10) REMOVED CLS COMMAND (as per discussion) ; 11) ADDED RAS (REMOTE ACCESS SYSTEM) EQUATE WHICH REMOVES FUNCTIONSOSE WHO ARE FAMILIAR WITH ; MODIFYING MOVCPM, THIS CAN BE USED IN CONJUNCTION ; WITH GENMOD.COM (PROVIDED BY DIGITAL RESEARCH ; IN THEIR MPM PACKAGE) TO INTEGRATE THIS CCP ; DIRECTLY INTO YOUR MOVCPM PROGRAM. ; 5) CHANGED THE FORM OF THE @ OPTION TO THE 'DIR' ; COMMAND, TO ALLOW AMBIGUOUS FILENAMES. TO SEE ; COMBINED $SYS AND $DIR FILES, TYPE ; DIR @. ; EG, ; DIR *.ASM @ ; OR ; DIR *.COM @ ; THE PRICE FOR THIS LUXURY IS THAT YOU NOW HAVE TO ; TO USE THE *.* SPECIFIER WHEN VIEWING ALL FILES: ; DIR *.* @. ; INSTEAD OF THE FORMER ; DIR @. ; NOTE THAT THE ACTUAL CHARACTER USED TO SPECIFY $SYS ; FILES IS NOW DEFINED IN AN EQUATE, FOR EASY CHANGING. ; THIS IS INTENDED FOR REMOTE CPM SYSTEMS, WHERE YOU ; DON'T ALWAYS WANT THE CALLER TO SEE $SYS FILES. NOTE ; THAT YOU CAN EFFECTIVELY DISABLE THE $SYS OPTION BY ; DEFINING THE SYS SPECIFIER AS A LOWER-CASE LETTER. ; 6) ADDED A NEW OPTION TO THE DIR COMMAND: ; DIR , such as A0> and A15> ; G. Z80-code is used throughout to reduce the size of the CCP ; ; TYPICALLY NOT DESIRED UNDER A REMOTE-ACCESS SYSTEM LIKE AN RBBS; ; FUNCTIONS REMOVED ARE: ; SAVE, ERA, REN, JUMP, GET ; ; MODS BY KBP 07/02/81: ; 1) ADDED WIDE EQUATE AND ROUTINE FOR WIDER DIR DISPLAY. ; 2) CHANGED COMMAND BUFFER TO TERMINATE STRING WITH 0. ; 3) ADDED CONDITIONALS FOR MINI AND HARD DISK. CHANGED ; CCPLOC CALCULATION TO ALLOW FOR SEVERAL SYSTEM LENGTHS. ; 4) ADDED EQUATE FOR DEFAULT USER NUMBER SO IT COULD BE ; OTHER THAN 0 (nice for hiding COM files in high user ; numbers made inaccessible on remote CP/M systems). ; ; THE FOLLOWING MODS MADE BY RLC 06/30/81: ; 1) ERROR IN CCPLOC FOR NON-REL OPTION CORRECTED ; 2) PROVISION OF 'BASE' CONSTANT ADDED FOR NON-ORG-0 CP/M SYSTEMS ; 3) MORE USER FLAGS ADDED: ; SPRMPT - ALLOWS USER TO EASILY CHANGE SUBMIT PROMPT ; (i.e., A$ is default) ; CPRMPT - ALLOWS USER TO EASILY CHANGE COMMAND PROMPT ; (i.e., A> is default) ; PGDFLG - ALLOWS USER TO SET TYPE COMMAND PAGING FLAG ; 4) CHANGED OPTIONS TO DIR, ERA, > $ ; WILL DISPLAY ONLY $SYS FILES. CAN BE ; AN AMBIGUOUS FILE NAME. THE "$" SPECIFIER CAN BE ; CHANGED BY MODIFYING AN EQUATE. ; 7) CHANGED COMMENT FLAG FROM '*' TO ';' THROUGHOUT ; TO SIMPLIFY ADAPTATION FOR OTHER ASSEMBLERS. ; 8) ADDED TRUE/FALSE IN PLACE OF 0/1 FOR CONDITIONALS TO ; IMPROVE READABILITY ; 9) ADD CONDITIONAL 'SUPRES'. WHEN SET TRUE, USER NUMBER ; REPORTING IS SUPPRESSED FOR USER 0 ONLY, ALL OTHER ; USER NUMBERS ARE UNCHANGED. ; 10) ADDED ADDITIONAL Z80 CODE AND ASSOC. MACROS TO INCREASE ; USABLE CODE SPACE ; 11) ADDED "DFU" COMMAND, WHICH CAN BE USED TO DYNAMICALLY ; CHANGE THE USER NUMBER THAT IS SEARCHED WHEN A .COM ; FILE INVOCATION FAILS IN THE CURRENT USER AREA. NOTE ; THAT THIS REVERTS BACK TO ITS NORMAL VALUE OF USER 0 ; EACH WARM BOOT. ; 12) BREAK ROUTINE DIDN'T BREAK RELIABLY BECAUSE I/O WAS ; THRU FUNCTION 6. THE PROBLEM IS CAUSED BY THE FACT ; THAT BDOS TESTS STATUS WHENEVER IT SENDS A CH and give room to implement the additional functions ; H. The input line buffer has been reduced in size to 100 bytes ; I. The ERA Command displays the names of the files it is to ; erase ; J. The DIR Command has an additional special form of "DIR @" ; which displays all files (both non-system and system), ; while "DIR" displays just the non-system files ; K. The Directory Display no longer displays the disk name at ; the beginning of each line and it now includes a '.' between ; the file name and file type (FILENAME.TYP) ; L. The SUBMIT File Facility now expects the $$$.SUB file to be ; on the currently logged-in disk (as opposed to always A:) ; M. The Command Line Prompt is now '$' if the command comes from ; a $$$.SUB file and '>' if the command comes from the user; ; also, the '>' is not printed until all preprocessing is ; completed ; N. The TYPE and LIST Commands mask the MSB of each byte, so that ; files created by editors such as EDIT80 are "printable" ETC (HUMAN ENGINEERING): ; DIR A - Both $DIR and $SYS ; DIR S - Just $SYS ; 5) MADE MINOR CODE COMPRESSION ENHANCEMENTS (FOR SPACE) ; ; THE FOLLOWING MODS MADE BY RGF 06/29/81: ; 1) CCP NOW USES THE BDOS INDICATOR TO DETERMINE IF ; A POSSIBLE SUBMIT FILE EXISTS ON THE DISK. THIS ; ELIMINATES WASTED TIME SEARCHING FOR A NON-EXIST- ; ANT SUBMIT FILE AFTER EVERY ^C ; 2) ADDED A CONDITIONAL "PGDFLT". IT WORKS THIS WAY: ; IF YOU SET PGDFLT TRUE (TO A 1), THEN YOU ; RETAIN RLC'S PAGING FEATURE WITH THE TYPE ; COMMAND. YOU CAN THEN OVERRIDE IT BY TYPING ; "TYPE /", TO SMOOTHLY VIEW THE ; FILE. ; IF YOU SET PGDFLT FALSE (TO A 0), THEN PAG- ; ING IS ONLY DONE WITH THE "/' OPTION, AND ; IS SMOOTH NORMALLY. ; 3) ADDED CLEAR SCREEN DEFINITION BYTES TO SIMPLIFY ; CARRYING THE CCP TO DIFFERENT TERMINALS. THESE ; ARE DEFINED IN EQUATES AS CLS1 AND CLS2. ALSO ; CHANGED THE CLS ROUTINE TO CONSERVE A LITTLE ; SPACE ; 4) ADDED REL EQUATE -FOR THARACTER ; TO THE SCREEN, AND ACTUALLY INPUTS THE CHARACTER IF ; STATUS IS TRUE. IF THE CHAR IS NOT A CONTROL-S, BDOS ; BUFFERS IT UNTIL THE NEXT INPUT CALL, WHICH IS BY- ; PASSED BY USING FUNCTION 6. ; ; 29 JUNE, 1981 (RGF) ; ; RLC'S NOTES: ; ;**** CUSTOMIZATION PROCEDURE ***** ; To customize this CCP for CP/M, do the following: ; 1. Run SYSGEN and obtain a sysgen image of CP/M ; 2. Issue "SAVE 44 CPM.COM" to save sysgen image on disk ; 3. Assemble this CCP (with Mods); MAC or M80 MUST be used ; because of MACROs ; 4. If end address exceeds C500H, CCP is too big; correct ; 5. Load sysgen image with "DDT CPM.COM" ; 6. Init FCB with ICCP22.HEX (from assembly) ; 7. Read in CCP with offset 5400 ("R5400") ; CCP starts at address 1100H in sysgen image ; 8. Save sysgen image (if desired) with ^C and ; "SAVE 44 NEWCPM.COM" ; 9. Place system on disk with "SYSGEN" ; ;**** NON-STANDARD FEATURES ;**** ; The non-standard features incorporated into this CCP G ; ;**** End of Revision History **** ; CPMUG 050~bcCPMUG 060fdeCPMUG 070RfgREAD ME hFEBRUARY 14 1982 COMPUTIST BOX-2250 SANTA-CLARACA-95055 UNSP30 AQM^ijUNSP30 DQC.kUSQ COMNlmI/O-CAP ASMnopSD COM q-PICONET014UNERA11 ASM,rPASSWORDASM@sDCON11 DOCstuDCON11 COMNvwUN COM"xUN DOCyFINDBD52ASM|z{|}CCPZ-V41ASM~CCPZ-V40DQCHCCPZ-V41$$$HSummary of the New Features of CCPZ The CCPZ Command Hierarchy Search CCPZ-Resident Command DIR CCPZ-Resident Command ERA CCPZ-Resident Command LIST CCPZ-Resident Command TYPE CCPZ-Resident Command SAVE CCPZ-Resident Command REN CCPZ-Resident Command USER CCPZ-Resident Command DFU CCPZ-Resident Command JUMP CCPZ-Resident Command GET CCPZ Error Messages :Summary of the New Features of CCPZ CCP i basicall rewrit o th CP/ CC whic i design- e t ru a par o CP/ o Z80-base microcomputers I mos case i i upward-compatabl wit th origina CP/ Versio 2. CCP. CCPZ however provide man extension t th CP/͠ CCP Amon thes are: Th TYP functio ca b mad t pag o no pag it outpu a th user' discretion LIS functio i availabl whic send it outpu t th CP/ LST Devic an doe NO page Th DI comman ha bee extende t allo th dis- pla o th syste file o al fil GE command Unde th CP/ 2. CCP i th specifie CO fil comman wa no foun o th curren driv i th curren use area th CC aborte wit a erro message CCPZ however continue searchin fro thi poin maximu o tw mor levels Thi comman hierarch searc wa outline abov an i describe her i furthe detail. 1 I th comman i o th for 'COMMAND an NO 'd:COMMAND' th CCP-residen comman lis i searche fo match I th matc i found th CCP-residen comman i immediatel processed I th matc i no foun o th comman i o th for 'd:COMMAND' th nex ste i taken Not tha th 'd:COMMAND for i goo fo executin comman CO͠ fil whic ha th sam nam a CCP-residen comman (suc a SAV or DIR). 2 I th comman i o th for 'd:COMMAND' dis driv 'd: i temporaril logge i fo th purpos o th comman search Othefails, and finally looks on A:/0; it finds ASM.COM here and goes back to B:/10 for the file Example 2: DEFUSR equ 0 and DFU issued B10> <-- User is on Drive B:, User Number 10 B10>DFU 5 <-- User Selects User 5 as default B10>ASM TEST.BBZ <-- As above <-- At this point, CCPZ looks on B:/10 for ASM.COM, fails, look on B:/5, fails, and finally looks on A:/5; it fails here also and prints ASM? as an error message Example 3: DEFUSR equ 0 B> <-- User is on Drive B:, User Number 0 B>ASM TEST.BBZ <-- As above <-- At this point, CCPZ looks on B:/0 for ASM.COM, fails, looks on A:/0, fails, and prints error message Example 4: DEFUSR equ 0 A10> <-- User is on Drive A:, User Number 10 A10>ASM TEST.AAZ <-- As above, but file on A: <-- At this point, CCPZ looks on A:/10 for ASM.COM, fails, looks on A:/0, fails, and prints error message :CCPZ-Resident Command DIR Coes Th ER comman no print ou th name o th file i i erasing Th curren use numbe ma b include a par o th comman prompt i th use i unde numbe othe tha 0 th promp i o th for 'du> (lik 'A2> o 'B10>') and i th use i unde 0 th promp ma b 'd> o 'd0> a pe hi choice Th SUBMI facilit ha bee change i tw basi ways: - th promp change t 'du$ o 'd$ whe th SUBMI comman i printed - th $$$.SU i execute fro th currentl log- ged-i dis (NO jus fro A:) command-searc hierarch i no implemente whic i execute roughl a follows: - th user' comman i checke agains th CCP- residen command an execute immediatel i matc i found - failin that th curren use numbe o th curren dis i scanne fo th CO file th CO fil i loade an exrwise th currentl logged-i driv i used. 3 No th fil name COMMAND.CO i searche for I found i i loade int memor startin a 100 an executed If not, proceed to step 4. 4 No tha th firs searc fo COMMAND.CO͠ ha failed th CC check t se i th use i unde th curren Defaul Use Number Th Defaul Use Numbe ma b tha se b th DEFUS equat i th CC o tha se b th use vi th DF command DEFUSҠ i i effec i DF ha no bee issue sinc th las War o Col Boot an DF i i effec i i wa issue sinc th las War o Col Boot I th use i NO unde th curren Defaul Use Number CCP temporaril log hi int i an searche th directory I COMMAND.CO i found i i loade a describe abov an executed I not CCP proceed t the next step. 5 Th use i no i th Defaul Use Number an a thi point CCP check t se i mmand: DIR Function: To Display a listing of the names of the files on disk Forms: DIR <-- Displays $DIR files DIR S <-- Displays $SYS files DIR A <-- Displays both $DIR and $SYS files Examples: DIR *.ASM <-- All $DIR .ASM files DIR *.COM S <-- All $SYS .COM files DIR *.COM A <-- All .COM files Notes: I fil i scanne fo an n suc nam exist o disk th 'N Files messag wil appear However i fil i scanne fo an th nam exist a $SY fil an $DI file ar bein scanne for n fil nam i displaye bu th 'N Files messag doe NO appear Fo example i TEST.CO i $SY fil an 'DIҠ TEST.COM i issued n messag appears I 'DI TEXT.COM i issue an TEXT.CO doe no exis o disk th 'N Files' message is displayed. :CCPZ-Resident Command ERA Command: ERA Function: To Erase the specified $R/W files from disk Formsecute i found - failin that defaul use numbe (initiall bu ca b rese wit th DF CCP-residen command o th cur- ren dis i scanne fo th CO file th CO fil i loade an execute i found - finally failin that th defaul use numbe o dis A i scanne fo th CO file th CO fil i loade an execute i foun o a erro messag (COMMAND? whe COMMAN wa th user' comman name i printed Th numeri argumen fo th SAV CCP-residen com- man (vi th numbe o 256-byt page t save ca b inpu i HE rathe tha decimal GEԠ comman whic load fil a specifie memor addres an JUM comman whic "calls th subroutin a specifie memor addres hav bee added :The CCPZ Command Hierarchy Search Th first an mos basi thing t lear abou CCP i th orde i whic i searche fo CO fil fo executio o fil specifie b thth use i o dis driv A: I not i temporaril log int A an searche th defaul use numbe o A fo COMMAND.COM I found i i loade a describe abov an executed I not CCP print th comman nam a a erro messag an return t comman inpu mode aborting the SUBMIT file if COMMAND came from it. I al case o th searc above i COMMAND.CO i found afte i i loade int memory CCP reset th use t hi origina dis driv an use number Hence th file reference by the user by default are obtained from this environment. T illustrat thi comman hierarch search conside th following examples: Example 1: DEFUSR equ 0 {default user number is 0} B10> <-- User is on Drive B:, User Number 10 B10>ASM TEST.BBZ <-- User wishes to assemble TEST.ASM in Drive B:, User 10 <-- At this point, CCPZ looks on B:/10 for ASM.COM, fails, looks on B:/0, H: ERA <-- Erase both $DIR and $SYS files Examples: ERA *.ASM <-- Erase all .ASM files ERA *.* <-- Erase all files Notes: I $R/ fil i encountered BDO erro messag wil b displaye an th procedur i stopped Th use i unsur a thi tim a t whic file hav bee erase an whic hav no an shoul check Sorr fo thi problem Th ERAS comman (t b give t SIG/ b RL i th nea future i solutio t this problem. :CCPZ-Resident Command LIST Command: LIST Function: To Print the specified file on the CP/M LST: device Forms: LIST <-- Print the file (no paging) Examples: LIST TEST.TXT <-- Print TEST.TXT on LST: Notes: I th fil ha $SY attribute i wil b foun a wel as those with $DIR attributes. :CCPZ-Resident Command TYPE Command: TYPE Function: To Print the specified file on the CP/M CON: device Forms: TYP <--
in HEX Examples: GET 8000 TEST.80 <-- Load TEST.80 starting at 8000H GET 100 TEST.80 <-- Load TEST.80 starting at 100H GET 0 TEST.80 <-- Load TEST.80 starting at 000H Notes: GEԠ searche fo th specifie fil accordin t th sam comman hierarch searc employe b th CCP comman scanner Hence i th use i o B:/1 an th fil i o A:/ wit th curren defaul use numbe a 0 GE wil searc fro B:/1 t B:/0 to A:/0 in looking for the file. :CCPZ Error Messages Th followin ar th erro message issue b CCPڠ an their meanings. Message Meaning ? Printed after a command or an argument means that such was invalid No File From DIR, this means that DIR did not locate any file Prin th fil wit th pagin deflt TYPE <-- Print the file with the paging deflt negated Examples: TYPE TEST.TXT TYPE TEST.TXT P Notes: Whe th displa pause durin paging typ an cha t continue or ^C to abort. ^S also works. :CCPZ-Resident Command SAVE Command: SAVE Function: To Copy the TPA starting at 100H to disk Forms: SAVE <-- in DEC SAVE # <-- in HEX Examples: SAVE #F MYFILE.TXT <-- 15 pages saved SAVE 15 MYFILE.TXT <-- 15 pages saved Notes: -None- :CCPZ-Resident Command REN Command: REN Function: To Change the name of a disk file Forms: REN = Examples: REN NEWFILE.TXT=OLDFILE.TXT Notes: -None- :CCPZ-Resident Command USER Command: USER Function: To Change the current user number Forms: USER <-- in DEs Also from ERA with the same meaning All? Issued in response ERA *.*, asks the user is he really wants to erase all the files. Unlike under the original CP/M 2.2 CCP, single character input is required (Y or y for yes and anything else for no) with NO to end the line Read Err Error in reading a file by TYPE or LIST Message Meaning No Space From SAVE, means that there is not enough space on disk From GET or command load by CCP, means that there is not enough space in memory File Exists From REN, means that the new file name specified already exists on disk  followin ar th erro message issue b CCPڠ an their meanings. Message Meaning ? Printed after a command or an argument means that such was invalid No File From DIR, this means that DIR did not locate any fileC USER # <-- in HEX Examples: USER 15 USER #F USER 0 USER <-- Same as USER 0 Notes: -None- :CCPZ-Resident Command DFU Command: DFU Function: To Temporarily Change the default user number for the command hierarchy search Forms: DFU <-- in DEC DFU # <-- in HEX Examples: DFU 15 DFU 0 DFU #F DFU <-- Same as DFU 0 Notes: -None- :CCPZ-Resident Command JUMP Command: JUMP Function: To "call" the subroutine at the specified page address Forms: JUMP
<--
in HEX Examples: JUMP E000 <-- Jump to E000H JUMP 100 <-- Jump to 100H JUMP 0 <-- Jump to 000H JUMP <-- Same as JUMP 0 Notes: JUM perform subroutin "call" s th calle routin ma return to the CCPZ by either a RET I10 REM File Transfer Time Program for RCPM's, by Kelly Smith 20 REM 30 REM This program may be used by a RCPM user to determine 40 REM the total time in minutes to transfer files to or from 50 REM a RCPM system. Time is rounded down to the nearest 60 REM minute, but detailed information may be obtained by 70 REM removing the 'REM's in the following code. This program 80 REM is compatible with Microsoft BASIC, and will compile to 90 REM a 11 kilobyte (Gag!) file utilizing BASCOM. 100 REM 110 PRINT:INPUT "What is the Baud Rate (60 to 1200)";B 120 IF B<>60 AND B<>110 AND B<>300 AND B<>450 THEN GOTO 140 130 GOTO 180 140 IF B<>600 AND B<>710 AND B<>1200 THEN GOTO 160 150 GOTO 180 160 PRINT:PRINT"+++ Invalid Baud Rate +++":PRINT 170 PRINT"Must be 60, 110, 300, 450, 600, 710, or 1200 Baud!":GOTO 110 180 INPUT "What is the File Size in kilobytes";S 190 IF S<1 THEN GOTO 180 200 S=S*1024:T=S/(B/10):TM=T/60 210 REM PRINT:PRINT"Total number of characters in this file is";S 220 REM PRINT"This file will take";T;"seconds" 230 REM PRINT"Which equals";TM;"minutes" 240 PRINT:PRINT"Transfer time will be approximately"; 250 T=INT(TM):IF T>1 THEN PRINT T "minutes" ELSE PRINT" 1 minute""  nearest 60 REM minute, but detailed information may be obtained by 70 REM removing the 'REM's in the following code. This program 80 REM is compatible with Microsoft BASIC, and will compile to 90 REM a 11 kilobyte (Gag!) file utilizing BASCOM. 100 REM 110 PRINT:INPUT "What is the Baud Rate (60 to 1200)";B 120 IF B<>60 AND B<>110 AND B<>300 AND B<>450 THEN GOTO 140 130 GOTO 180 140 IF B<>600 AND B<>710 AND B<>1200 THEN GOTO 160 150 GOTO 180 160 PRINT:PRINT"+++ Invalid Baud Rate +++":PRINT 170 PRINT"Must be 60, 110, 300, 450, 600, 710, or 1200 Baud!":GOTO 110 180 INPUT "What is the File Size in kilobytes";S 190 IF S<1 THEN GOTO 180 200 S=S*1024:T=S/(B/10):TM=T/60 210 REM PRINT:PRINT"Total number of characters in this file is";S 220 REI; I/O-CAP.ASM Version 1.0 as of September 16, 1981 ; ; By: Kelly Smith, CP/M-Net ; ; Note: At the request of Dave Hardy and Ron Fowler, the ; name of this program has been changed from CAPTURE.ASM to ; I/O-CAP.ASM so as to not be confused with Dave and Ron's ; (hopefully successful) commercial effort...This IS NOT Dave ; and Ron's program, but was independently developed ; (unwittingly) for my own use. Interesting to note that this ; is the SECOND TIME that Dave and I (independently) hit on ; the same idea...great minds (O.K., O.K, so mine is just so- ; so...) think in similar ways? Anyway, I strongly encourage ; you to buy Dave and Ron's version, which sounds SUPER from ; what Dave told me...O.K., Dave...since you got the ; commercial pitch...when do I get my copy? ; J.he CCPZ - A Z80 Version of the CP/M CCP .fo Page # Documentation on CCPZ - A Z80 Version of the CP/M CCP CCPZ is a Group Project By the CCP-GROUP: RLC, FJW, KBP, RGF, RJM, SBB CCPZ Documentation By RLC Table of Contents ----- -- -------- Introduction 2 Part A: Installation Instructions 4 CCPZ Integration Example 5 Setting the CCPZ Inline Options 8 REL, BASE, CCPLOC, RAS, SUBA, CLEVEL3 8 Customization Symbols 8 NLINES, WIDE, PGDFLT 8 PGDFLG, MAXUSR, SYSFLG, SOFLG, SUPRES, DEFUSR, SPRMPT, CPRMPT, NUMBASE, 9 SECTFLG, FENCE  correct it) th CCP-GROU definitio o a Indirec Comman Fil no applies an thi definitio i tha an sequenc o command whic ma b issue fro th consol i als vali sequenc o command fo executio fro a Indirec Command File; hence, the sequence: DIR B: DIR A: ma b issue fro eithe th consol o a Indirec Comman File an th result o th executio o thi sequenc ar th same Basically thi say tha Indirec Comman File ar upward-compatibl t th consol inpu (bu no necessaril tha th content o a Indirec Comman Fil ma b issue a th consol withou modification). command-searc hierarch i no implemente whic i execute roughl a follows: - th user' comman i checke agains th CCP- residen command an execute immediatel i matc i found -  10 Part B: Usage Instructions and Explanation of Commands 11 The CCPZ Command Hierarchy Search 11 The CCPZ-Resident Commands 14 DIR, ERA 14 LIST, TYPE, SAVE 15 REN, USER, DFU 16 JUMP, GO, GET 17 CCPZ Error Messages 18 Part C: CCPZ Command Levels and How to Use Them 19 Documentation on CCPZ - A Z80 Version of the CP/M CCP CCP i replacemen fo th CP/ Consol Comman Processo (CCP whic i designe t ru a par o CP/͠ o Z80-base microcomputers I mos case i i upward-compatible wit th origina CP/ Versio 2. CCP. CCPZ however provide man extension t th CP/͠ CCP Include i thes extension ar th follofailin that th curren use numbe o th curren dis i scanne fo th CO file th CO fil i loade an execute i found - failin that defaul use numbe (initiall bu ca b rese wit th DF CCP-residen command o th cur ren dis i scanne fo th CO file th CO fil i loade an execute i found - finally failin that th defaul use numbe o dis A i scanne fo th CO file th CO fil i loade an execute i foun o a erro messag (COMMAND? whe COMMAN wa th user' comman name i printed Th numeri argumen fo th SAV comman ca b specifie i hexadecima s tha th use ma emplo th value presented by tools such as DDT exactly as they are given GEԠ comman whic load fil a specifie memor addres an JUM comman whic "calls th subroutin a specifie memor addres hav bee added G comman whic "calls thwin features: Th TYP functio ca b mad t pag o no pag it outpu a th user' discretion LIS functio i availabl whic send it outpu t th CP/ LST Devic an doe NO page Th DI comman ha bee extende t allo th dis pla o th syste file o al files Th ER comman no print ou th name o th file i i erasing Th curren use numbe ma b include a par o th comman prompt i th use i unde numbe othe tha 0 th promp i o th for 'du> (lik 'A2> o 'B10>') and i th use i unde 0 th promp ma b 'd> o 'd0> a pe hi choice Th SUBMI facilit ha bee change i tw basi ways: - th promp change t 'du$ o 'd$ whe th SUBMI comman i printed - th $$$.SU i execute fro driv A (not tha th origina SUBMIԠ proble no exists bu th ne SUB.CO facilit subroutin a 100 (subse o th JUMР capability has also been added Thi documen provide th use o CCP wit th followin information: Part A: Installation Instructions Part B: Usage Instructions and Explanation of Commands Part C: CCPZ Command Levels and How to Use Them Part A Installation Instructions I orde t instal CCP o targe microcompute (mus b currently running CP/M 2.2), the user must know two basic things: 1) Where his CCP is currently running in memory 2 Wher hi CC i locate i th SYSGEΠ image or fo system whic don' suppor SYSGE (suc a P& CP/ 2. fo th TRS-8 Mode II) wher hi CC i locate o dis an ho t place the new CCPZ on top of it Th firs questio i answere relativel easily pro gram know a eithe BDOSLO o BDLO (fo BDOӠ Locator) i provide wit CCPZ YoJKKLL