IMD 1.16: 29/05/2007 18:23:35 FOGCPM.054 6/86 --FOGCPM054APPEND COMAPPEND DOCAPPEND ASMSPLIT COM\ SPLIT DOCMAKBATCHCOMMAKBATCHDOCLASM COM,LASM DOC' !"LSWEEP13COM}#$%&'()*+,-./012LSWEEP DOCJ3456789:;<SCRMBL21COM=SCRAMBLEMSG>?@ASCRMBL21ASM9BCDEFGHISCRMBL COMJSCRMBL DOCKLMSCRMBL MACNOPQBDOSLOC COMRBDOSLOC ASM STEZCPR COMVUVWXYZ[\]^_EZINST HLP`abcdefghijklmnoEZINST HLPpqrstuvwxyz{|}~EZINST HLP-06-00 86 -CPM054 DOCGUARD COMTSYS215 COM<WIZ COM>PATCHCPMHLP1PATCHCPMASM2This is the disk name. !9"V1V~# !\$ O ͵ ͠ ͖ 8{ Ăy0 2X *K*M}|گ!"M*K{zҡ*I$!›*E#"E*M"Mf*M"K!"M*I*K}>*M#"Mɯ202D!"K"M$<  NO INP FILE$$$!l > !\$ O ͵ ͠ ͖ 8XĂõ*:*<}|ڞ!"<*:{zҐ*8!Š*4#"4*<"<U*<":!"<*8*:}>*<#"<ɯ223!":"<<%>2X!"<<%  NO DIR SPACE: OUTP$!":*<}+"<*4}+"4î*:*<}|ڞ!"<*:{zҐ*8"r*4#"4*<"<= ~ DISK FULL: OUTP$!"<*8*<#"<#A¹ GRG (*<}":>(<   CANNOT CLOSE OUTP$*Vî*:*<}|ڞ!"<*:{zҐ*8APPEND.ASM This is a simple program which is sometimes useful. It copies a to the END of . If file2 does not exist a simple copy operation is performed. It also does a fixup on a problem sometimes seen, multiple carriage returns are reduced to one. Unfortunately it needs MAC so if you don't have it get the COM file for APPEND if you can. Jack Riley (303) 499-9169 RCPM. Useage: APPEND file1 file2 ; APPEND.ASM ; This is a simple program which is sometimes useful. It copies ; a to the END of . If file2 does not exist a simple ; copy operation is performed. It also does a fixup on a problem ; sometimes seen, multiple carriage returns are reduced to one. ; Unfortunately it needs MAC so if you don't have it get the COM ; file for APPEND if you can. ; Jack Riley (303) 499-9169 RCPM. ; Useage: APPEND file1 file2 maclib seqio22 BSIZE EQU 4096 org 100h LXI H,0 DAD SP SHLD STACK LXI SP,STACK file infile,inp,,1,,BSIZE file append,outp,,2,,BSIZE xra a mov b,a loop: get inp cpi eof jz quit cmp b mov b,a jnz cont cpi 0dh jz loop ; don't duplicate any carriage returns cont: put outp jmp loop quit: finis outp EXIT LHLD STACK SPHL RET DS 50 ;STACK STACK DW 0 buffers EQU $ end =ͥ!! 9~#fo+s#r!x!"9~#fo##s#r^#VBK^!-Y`i#DM-$x! 9~#fo#s#r!"9~#fo++s#r! 9~#fo+s#r!!H!$9~#fo##s#r^#V"D.|!"9^#V^#V!Jl!-"D.! 9~#fo+s#r! !"9~#fo##s#r^#V!,.*%!,.DM`i#DM+`i~0`i^!.0`i^!.E!`is!,.!9*%!9!,.*%!Y!,.͕%!@.!,.͕%![!,.".|!,.!]l!î#+*D.!!9DM|1*. æ*.ͭ :B.o&z :B.o&#}2B.+E!a}2B.:A.o&z2:A.o&#}2A.+E!a}2A.:B.o&#}2B.+Srcannot open %s.wcannot open %sͥ! 9^#V!!-!1%s |g}o|/g}/o^#V#DM!99`iͤ|z2k*I:k*}b}}|!}|!}|}|?>o&zo&|0}|>o&|o&z2k*I:k*||T/g}/o#zb/W{/_bDM!>2j*))u#}o|gҍ :j*=2j*m}:j*=2j*m}DM!>))Ҭ =¤}}/o|/g#}||g}o{_|m|7g}o{_)}}o|gN#F# N#F#z{##^#VBK^#VzC#y=###+#x8#~#fo}|>?o&}|>o&{_|g}om|g}o~# x‚!9l*~#!|7ͥ!-"r*!9!9^#V!ͥ! 9^#V"r*!9!9^#V!ͥ*r*!9^#V> ͥ!-DM`i~D`i DM".JA! !9^#V#^!+!9^#V^<|v!y!!9^#V! s!ʚ!O|ʫ!î!!9^#V! s!!O|!!!9^#V! s!!!͏&ͼ&! ^C"!9O!"F.!#rhwa2!! s!! s#r!`is#r! s#r! s#r`iͥ! 9^#VBK!-tʺ ʺ`i#DM+sË!`is`i! 9~#fo!! 9^#Vͥ! 9^#V!9~#fo+s#r!D!9^#VtDMD`i#+s`i D!u`ik! 9~#fok!! 9^#Vͥ! 9N#F ͔å`i~#fo+s#r!À# ͥ! 9N#F`i~!-`i#DM+^> !!-! > ͥ! 9N#F`i~: !9^#V`i#DM+^> 7 ! !ͥ! 9N#F!9^#V!PY͔DM`i ʁ !  ʁ ! ͥ! 9^#V DM¾ ! 9^#V  !PYͥ! 9N#F! ^#V`i^#VJʖ ! ^!͔ !!`in&͔s`i~#, ͓ ! ^#V! ^#V! ^5~ |e !h !`in&s!! ^#V`is#r! s#r`i~#fo#s#r+^!͔ͥ!-!9^#V ͥ! 9N#F!9^#V  !!9^#V`ie  !`iͥ!9N#F! ^#V`i^#VJK ! 9^#V!͔L ! 9^#V`i~#fo#s#r+s!͔ͥ!!9^#VL ͥ!-DM`i".Xʬ `i DMͭ Ì ͥ!9N#F!!9s#r`i~: ! ^!͔ !L !9s#r! ^&!9~#fos#r! ^!͔: **.! ^#Vs#r! ^#V"*.!! s!9^#Vͥ! 9N#F! ^!͔ʶ ! ^#V`i^#V! ^#V! ^qʶ !`in&s!!9^#V! !`in&͔s!`is#r! s#r!`i~# ͓ ! ^#V!9 !!9! ^q !9^#V! ^#V`is#r! ^#V! ^#V! s#r!`in&s!9^#V`i~#fo#s#r+s!͔ͥ!9N#F! ^#V!ʾ `i! s#r**.| **.!9s#r**.^#V"*.! ^#V)!9s#rz!! s#rï !`in&s!9^#V! s#rͥ*v*|D!"*"t*"v**v*DM! 9^#V*v*"v*PYXi`i"v*!*v**t*Yʨ*v**t*͔! 9s#r"*`! 9^#V*t*"t*`iͥ! 9^#V"x*!9!9^#V!!*x*sͥ! 9^#V*x*#"x*+s!͔ͥ!N9N#F!P9^#V#+^z %!!9s!!D9s#r! !B9s#r!!@9s#rn&-ʃ!!D9s#r#+^0ʚ!0!B9s#r!!>9s#r#+^!09!>9^#V! ͜!>9s#rå.D!!@9s#r#+^!0D9D!@9^#V! ͜!@9s#rlʄ#+^!:9!T9~#fos#r͖&ͩ&#dʶ!:9!T9~#fo##s#r++^#V*ͩ&#efg!9!T9~#fos#r!*!*#!:9!T9~#fo##s#r++^#V)ͩ&!9!!>9͖&ͼ&o!9!49s#r!:9͖&́&)ʢ!9! !>9͖&&ͼ& !9!49s#r!-!69~#fo+s#rs!9! !>9͖&ͼ& !9!49s#r!9! !>9͖&ͼ&o!9!49s#r!9!!>9͖&ͼ&o!9!49s#r!:9͖&*!49s#rO%!89s#r eH!K!!B9^#V!b!j!B9^#V!9! 9!*!*!*!9! 9!49s#rO%!89s#r!!@9s#r !:9͖&*!9!69s#rs#o)dOuxse6f6c!9!49~#fo!89s#r!89^#V!@9~#fo/!@9^#V!89s#r!D9~#j!>9~#fo+s#r#!89~#foj!B9^#V`iͤ9!!69s#rÇ!69~#fo#s#r!49^#V~!69^#V!@9~#fo!49~#fo#s#r+^`iͤx!D9~#!>9~#fo+s#r#!89~#fo! `iͤ `iͤͥ!9N#F!9^#V`i*ͼ&!9͖&&|(*z*^+s! 9`i*&͖&B(ͩ&'#ͥ!9N#F!9^#V! 9͖&́&)%! 9͖&*͔! 9!9͖&́&'́&~'ͩ&`i*ͼ&!9͖&&|(*)z*^+s! 9`i*&͖&B(ͩ&!9͖&ͼ& !9*'D͍X͍*l*DM*n*o&͍vo&͍*l**+++*n*DM*p*!9N#F#^#Vkb6#> 6 #=¡>6#=ª : > A[@a{`w# .w#{o|g w#!!|a{ ͥ!!!*͵$!:o&͔*s! "*!*DM!"G+*G+`i^! Ž`i^! ʖ`i#DMr`i^z`i^!>ʷ!`i^!<ʪ!`i#DM^! `i^! `i`i#DM~*`i^! `i^! '!`i#DM+s*&|I!ͣW!ʧ! !*%!͕%!/!͕%!O%!!q! 1`i*G+#"G++)*s#r`i#DM~`i^! `i^! !`i#DM+sþe!**G+1Can't open file for redirection: ͥ͂ ! 9~#K!O$DA:$$$.SUBͥ!"F.!ͥ!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:ͥ!9^#V!!9^#Vͥ!T.!!9s#r!9~#fo#s#r!9^#V! nfY!!"F.!!.DM1`iDM`i~#R!9^#V`i^#V$R)! ^#V!9^#V!͔#!9s#r!9^#V!͔ʙn&u|™!"F.!!9^#V!͔n&u|!"F.!! ^#Vsrn&un&u!,ut!9^#V!9^#V!9^#Vnfͤ! 9!!!9^#Vͥ! 9^#V!K! 9^#V! U!"F.!! 9^#V)))T.DM! ^#V! ^#Vͤ! 9s#r!! s! s! s`is!Y! s#r! 9^#Vͥ!I+DM`i&DM`iy,X!% ^zù!"F.!!9^#V͎!"F.!!9^#V!͔!U!U^!9^#V!͔Q!U[!"F.!~!9^#V!͔~!"F.!!!! s#r!# s!$ s`i!9^#V!s#r!9^#V!͔#!% s!͔! !9^#V!s#r!!9^#V!s#r!ͥ!!9^#V!%s!ͥ! 9N#F!U!!% s!ͥ!ͥ! 9^#V!Z! 9^#V! d!"F.!! 9^#V)))T.DM!9^#V!9^#V! ^#V`i^)y,^#Vͤͥ!DM!9^#V$~n$&!DM!9~#foY!9^#VBK!9^#Vͺ!!9^#V`ie!9s#rzh!9^#V!9^#V`iͶ#!9s#rzh!9^#V!9~#foPY!9^#V!PYDM`i!9~#foXʱ!9^#V`i!9^#V`iͺʱ`i!9^#Vͥ! 9N#F!!U!!U"F.|!!9^#V!$ ^!!9^#V͵$!$ ^!9~#fo͔!$ sz=`i!~#fo#s#r!ͥ:,o&|!}2,!}2,}2,!,! U! !U:,o&ʗ!}2,!! :,o&#}2,,#s! :,o&#}2,,#s!"-:,o&DM!9~#fo!9^#VBK*-,!9^#V͵$`i*-"-`i:,o&}2,`iͥ!9N#F!:#!9~#fom! 9^#VU`i#DM+s!m3ͥ! 9^#V!–! 9^#V! ʠ!"F.!! 9^#V)))T.DM!9^#V!9^#V! ^#V! ^)-^#Vͤͥ!DM!9^#V$~A n$&!DM!9~#foY) !9^#VBK!9^#V A !!9^#V`ie!9s#rzʦ !9^#V!9^#V`i;#!9s#rzʦ !9^#V!9~#foPY!9^#V!PYDM`i!9~#foX !9^#V`i!9^#V`i `i!9^#Vͥ! 9N#F!!U!!U"F.3!*F.N!!"F.!!!$Z!*F.|Z!!!9^#V!9^#V!$ ^!͵$!"U"F.|ʒ!!!$ ^!9~#fo͔!$ sz!`i!~#fo#s#r!ͥ!9N#F!!#!9~#fo?"`i#DM+^!9s#r!9^#V! '"! !9^#VU!9^#V!9^#VU!ͥ! 9^#V!"! 9^#V! "! 9^#V)))W.^z"!"F.͏&! 9^#V)))Z.^#VBK!9^#V.#!U"!"F.͏&!#U!!$ s!9!! ^#V)́&'ͼ&!$ ^*&R'&͖&R'ͩ&A#!"F.͏&#""# #!!# s!9͖&́&)|#!!! s#r!$ s!"F.͏&!9͖&*͔!$ s!9͖&́&'*!! s#r!9͖&͍!#͍"*n*!"n**l*#*l*!4##4*p*+"p*}#o&"F.*p*ͥ!9!29^#V͎!9!Uͥ! 9N#F!`i^!-[$`i#DM!n$`i^!+n$`i#DM!`i^C&ʠ$ ͜`i#DM+^t$|ʱ$ʹô$! 9F+N+V+^+~+ngx$w# $!9^#V#N#F#nx$s# $!9^#V#~#fox%%%# %!$%!}!}!9^#V#~#foxL%~L%# ;%!9~#fod%#[%}!9^#V#^#V#N#F%!9^#V#^#V#N#F;%!9^#V#~#foxL%~ʶ%# ç%;%!9^#V#n~%%#%!|!9^#V#n%#%x% +~%%!9~ )& )& )&>&!9~A>&[>&!}!9~a>&{)&!!9~0>&:>&)&!9~af&{f& o&!9~A|&[|& o&!*(.Ú&!*&.w#w#w#w*&.~#~#~#~"-*&.V+^+V+^*-"-*(.s#r#s#r*-*(.*&."(."&.*&.>w#&*&.~)# 'ý)=ɯ<*&.*(.###;''?''''+A'*&.*(.#]'*&.*(.#s'*&.*(.#ˆ'*&.*(.#'*&.*(.#²'*&.~/w#'*(.~?G*&.^#V#~#fo))'#'DM*&.s#r#q#p*(.~?W*&.###~(~w+( (7~w+"((~#3(O&*&.-0(y2-*(.-0(:-2-ͯ(-*&.w#k(:-&*&.-0(y2-*(.-0(ͯ(-*&.w#ž(:-&!-w#µ(> 2-!-~w#(O-!-#(y(!-4!-5(!-5()!-~w#)O-!-#)y((-!-#1)*(.-~#D)*&.-~#T)!-w#b)> 2-!-~w#s)Ҟ)-!-#‡)Ҟ)’)!-5m)*&.-w#­)!')!!'ʽ)!outputdevice/file] DESCRIPTION SPLIT reads file and writes it in n-line pieces (default 1000), as many as necessary, onto a set of output files. The name of the first output file is name with .AAA appended, and so on lexicographically. If no output name is given, x is default. EXAMPLE OF USE: Example 1: split -150 b:filename a:newname This command will split FILENAME (found on drive B:) into new files of 150 lines long, will name them NEWNAME.AAA, NEWNAME.AAB, etc, and will output them to drive a:. FILENAME will remain unchanged on drive b:. Example 2: split filename This command will split FILENAME (found on the default into new files of 1000 lines long, will name them X.AAA, X.AAB, etc, and will output them  to the default device. AUTHOR Gertjan Vinkesteyn BUGS The current version will correctly split files as desired, but it does not know when to stop creating new file names. It may continue creating new names until it runs out of directory space and hangs the system due to the compiler's bug listed below. So there will be a number of extra filenames generated with nothing in them. If you fully specify everything, as in example 1, you will get the best results. But when fully specifying, be sure to specify a new file name. Otherwise you will get a blank filename followed by .aaa, .aab, etc. (instead of x.aaa, x.aab, etc.), The operating system cannot access a blank filename! Due to a bug in the compiler, if there is not enough room on the disk to store your output files, the system will hang. 1 gͪ2<ͪ:-:<@2Dͪ2Eͪ92=:<2E:=2F!Gͪ RRw#ADDD M! A"?ͪ!#à#ͪ ʾwÜa{_>w>$#w> #w> #w*?p}D*?"?Dz {!>2D D  $ COM MAKBATCH - A program to create a batch run file Copyright 1985 Castle Oaks Computer Services Enter the name (and drive letter) of the file to be created (Do not enter extension, COM is assumed) $ Enter the desired command lines below (Enter ! alone to terminate input) $ Requested file has been written to disk$! ͷ y͓Gþ!ͷ ͓Q!ͷ1MAKBATCH --> TO CALL UP THIS PROGRAM, YOU TYPE THIS IN. Makbatch responds with all ( items below: (MAKBATCH - A program to create a batch run file ( (Copyright 1985 ( (Castle Oaks Computer Services ( (Enter the name (and drive letter) of the file to be created ( ((Do not enter extension, COM is assumed) MJS --> YOU WRITE IN NAME OF COMMAND FILE WITHOUT ".COM" ***** Note added by Paul Foote - 10/10/85: Use at least two  character file names -- single char. names make the program create a .COM file which does not run (at least on my Xerox 820-II system). (Enter the desired command lines below ((Enter ! alone to terminate input) COLDBOOT --> YOU WRITE IN THE NAME OF THE COMMAND THAT YOU WANT NOBEEP ON A SEPARATE LINE AS YOU SEE HERE SMARTKEY & THEN HIT RETURN. WS ! --> THIS IS THE COMMAND CODE FOR QUITTING. ( Requested file has been written to disk When you use D.COM or NSWP to look at what you have done, you will find MJS.COM. Test it out. Run MJS (or whatever name you gave the file. The above command file made by MAKBATCH coldboots the computer in case you have a different file of SMARTKEY booted. It then boots NOBEEP so that WS is quieter. Then it loads SMARTKEY and finally WS (Wordstar). So four programs have been loaded by MJS.COM. You could even call this M.COM and do all this with one key stroke. That saves about 27 key strokes. It is fun to watch the computer do all the work.st on my Xerox 820-II system). (Enter the desired command lines below ((Enter ! alone to terminate input) COLDBOOT --> YOU WRITE IN THE NAME OF THE COMMAND THAT YOU WANT NOBEEP ON A SEPARATE LINE AS YOU SEE HERE SMARTKEY & THEN HIT RETURN. WS ! --> THIS IS THE COMMAND CODE FOR QUITTING. ( Requested file has been written to disk When you use D.COM or NSWP to look at what you have done, you will find MJS.COM. Test it out. Run MJS (or whatever name you gave the file. The above command file made by MAKBATCH coldboots the computer in case you have a different file of SMARTKEY booted. It then boots NOBEEP so that WS is quieter. Then it loads SMARTKEY and finally WS (Wordstar). So four programs have been loaded by MJS.COM. You could even call this M.COM and do all this with one key stroke.1MÚLINKASM AS OF 7/06/81 RESEARCH SIDXREF1D00 $10 !~=W!xe ~M4M4z~#o}o҃.ASMg> >ک!PRNq*DM͡:͆ ͆2:`!HEX!:*&!w_#~ A:~J~# > J\ ?!w#J0> J> J! ! !6 ::::! :l2:] !2!d222!!̓͌fk:ʢ!͓fkâ!"22|-!I z{**|!" !Msw# dMҖ6# xM*#"~ ̑!` G:ʽx¶JýͿ*!M'w#"!*͌!"!M'~~#  !w  *!M+w#"!*͓!"!M+_O͟: :yJ:!ʁG~W#x=r2> W> W!>x6 #=“G!~ p̓ʻ*}ʻ>͟ë::p*f"n*}>̓͌U:͓U:=2!22͌fk!"! C͜A Wx[H!O4gy͍Z:c:d~O#~zʅ+}|#͓T]͓##x G###* |~_##N#~y~͵#½> ͵> ͵##~#foß> õ*}>͌͟UƐ'@'õSYMBOLS ! No source file present No directory space Source file name error Source file read error Output file write error Cannot close files End of assembly G:x!p~*f*nO {z*f"n!p^4!qwWƐ'@'>:!p^Ww*n{|}{N!q~#E> > 0 ʅ ʅ:x҅_<2!w͞2_2> 2^l>2ɯ2 2`! ~@ڴ6z ^4#:_w~$w:_0 :_A:_A:_a{_2_a2_: !ɯ2͞:_ P;=*I:^ IV= V#a>Õl>Õ:_'}2_>Õ “:el!6 >2>2:_2^Ħ:!_:ͿʘØ^ Ϳʘ˜:_OQ>H>2`2_ :^B > D>  ! 52`!"! N#~#A. 00 7O!`t ~*!S M )D " " :_ z '˜'Ø>VÀ >OÀ ͛!M3w#w# !"l! F#¤ 2 G*l##~w*l##~<*l}͟ ! ~ 6! ^!M3^#fk"l ͼ !  G#*l### # *l^#V ! ^*c"l*{zo "c*l! N!M3 N#Fr+sq#p ] >G=#w#wa #w#w!x åSymbol table overflow G*l##~w*l##~ͼ *l_###ͭ s#rͭ ^#V  4   z ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRICALLLDAXLHLDLINKPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP M x _BH!¿ !# { Kë Cë <:!JCR: 0  0 !#6  !"( #  ɯ<: O=_} ! F! V#fjQͦ h ! ^#Vo&)~#F xGyѯ<*}|̈́ ":N!̈́ ! ~ڷ ͚6~44O! s#r! ~ 6͚^4! w! p! ~ ͚!55N! N#fi o&)^#fk z<{͚>ɯo>g"!6ů{_zW5>)D*OxGy !?[DM!xGyOڗØ)È̓è Jè Jè 0ʨ )=÷0ʨ |g}o=è B Bè #zg{oè zg{oè zg{oè ::! ;,!ɯ2 2 =2 !"ar! ~]5_! ~ E: Ě: * "a: ”:ž: ̚Ԛ!!^#=ʚVÆ©*Æ3 F; O: ̚>2 y#: _! ~! s! ~ y ! ~=w_! ~ ͚ >2 Ôyʔ3P͛ Ã͠ >Ư : ̚2 ͨ ?>E͛ɯ2e͊ ͇! 2p!""f"h"::!*ªͲ3 <  :eĉ͠ ͕*}ď*l"::!:PX!O^#fkg!$ Gͼ:˜: =ʘG!!ʒF#Âç.*a|ăEͫ3,jêͼXJ*h"h"fêͼJEDͫ3,êͼX: ªJ: "> 2::! J!!: qG> qOw#= O6 #E:_q O p# =O!} l++ERROR IN LINK OPERAND++ Ͳ*hJ"hͼ[!6="hêͼJ: ª}ڪ::!>B̛3 xJ͕êJ: ª"h"fͼXêͲ͠ ď>͎ JͲͻ !"ê͕ê!_!d^#fk*u͐͊*u*k8ʪoy0'͊*kG͐`'k͐̈́*̈́*k(oy'͊*`'k'koy0'k'̈́*ͼͫê:ă:!,; ă.*aJ|y}Vy`8Okoy0VJ&:¢:!,ʧ>C͛ͼ::! ;ͼ::! !!>S͛{ozg!e~4ʩX!6 ! *c*j**j\M[!O]w#DH use factor ! *"f!x#~ l å input lines read :e> !~~0 60+Û*f"h*"l Ͳ!":e͠ ď͎ *hͻ ͠ ̉ *h*ĉG:exͲ: *h[:xH*f#"fED0:0!^4!w88*h!6zH{H4>R͛>V͛>DØ>PØ>LØ>N͕͛êJ: ª"h"fͼXêͲ͠ ď>͎ JͲͻ !"ê͕ê!_!d^#fk*u͐͊*u*k8ʪoy0'͊*kG͐`'k͐̈́*̈́*k(oy'͊*`'k'koy0'k'̈́*ͼͫê:ă:!,; ă.*aJ|y}Vy`8Okoy0VJ&:¢:!,ʧ>C͛ͼ::! ;ͼ::! !!>S͛{o ***************************************************************** * * * 10/01/81 * * * * LASM is an update of LINKASM, with the minor change that * * it prints the name of each linked file before it is opened. * * This helps track progress, and helps find misspelled names. * * * * -Ward Christensen * * * ***************************************************************** LINKASM.COM 01/07/80 by Ward Christensen OVERVIEW: LINKASM is based on CP/M assembler 1.0, and is compatible with 1.0, 1.3, and 1.4 assemblers. (2.0? Dunno.) ---------------- LINKASM is a rewrite of CP/M 1.0 ASM.COM, incorporating: * A new pseudo-op code, LINK. * Smaller .COM file size (6K vs 8K). * Faster execution via larger ASM, HEX, and PRN buffers * Corrections to properly handle lower case DB values. * Prints the number of source lines read * Produces a symbol table for use under SID The LINK pseudo-op allows a file to "chain" to the next .ASM file, thereby allowing very large source files to be processed without having to PIP them together. RESTRICTIONS: All the linked .ASM files must be on the same disk. Nested IFs are not handled (ASM.COM didn't either) Note that you can use IF to conditionally link to the next module: IF CLOCK LINK CLOCKRTN ENDIF ; IF NOT CLOCK LINK OTHERRTN ENDIF For example, if CLOCK is true, then LINK CLOCKRTN (i.e. CLOCKRTN.ASM) will take place, and the assembler will never see the ENDIF. This is not a problem as the next encountered IF will be handled properly. ---------------- USAGE: LINKASM is totally compatible with ASM.COM, and you may therefore replace ASM. Its performance will be slightly better than ASM.COM, and it takes less space on disk (6K vs 8K). Execute it just like ASM.COM, i.e. LINKASM name.p1p2p3 where: p1 is the .ASM file disk (A, B, ...) p2 is the .HEX file disk (A, B, ... or Z for none) p3 is the .PRN file disk (A, B, ... or Z for none, or X for the console) The default is the logged in disk for all 3. If you wish to write a symbol table file, follow the command line with the disk to be written to (A, B, ...) then a colon. For example, to assemble FOO from the A: disk, put the .HEX on the A: disk, send the .SYM file to B:, and the listing to the console: LINKASM FOO.AAX B: To assemble it doing everything on the A: disk (assuming A: is the logged in disk): LINKASM FOO A: The ":" must be specified after the .SYM disk. The .SYM file is "partially" sorted, i.e. all Axxxx then all Bxxxx etc. SID fully scans the symbol table anyway, so sorting it is not necessary, so I did this quick sort hack just to make it eaiser for YOU to find a symbol. ---------------- The LINK pseudo ops take a single operand: the name of an .ASM file to be processed next. For example: ---------------- A:TEST1.ASM: ORG 100H LXI H,MSG MVI C,9 CALL BDOS RET LINK TEST2 ---------------- A:TEST2.ASM: MSG DB 'Linked' BDOS EQU 5 ---------------- Then assemble it: A>LINKASM TEST1.AZX LINKASM AS OF 7/13/79 0100 ORG 100H 0100 210901 LXI H,MSG 0103 0E09 MVI C,9 0105 CD0500 CALL BDOS 0108 C9 RET LINK TEST2 0109 4C696E6B65MSG DB 'Linked' 0005 = BDOS EQU 5 010F 000H use factor 8 input lines read End of assembly ---------------- I will make one apology for LINKASM - I neglected to put in an error message saying the name of the missing file, if you should accidentally LINK to a non-existant file. It just says the source file is not present. If necessary, you can find the name which was being searched for. It's in memory at 186H. If you have a PROM monitor, you can examine it. If not, do the following BEFORE executing any more COM programs following the LINKASM: SAVE 1 BADNAME.COM Save 100-1ff to disk DDT BADNAME.COM Bring in under DDT (or SID) D186,190 Dump the name ^C Reboot (some people use G0) ERA BADNAME.COM ERA the temporary file. Sorry for that hack, but I thought it better to put LINKASM in the CP/M UG with that problem, rather than holding it back "trying to make it perfect". ---------------- I have not encountered any problems using LINKASM as my main assembler for about the last 6 months. Among other things, I use it to assemble CBBS.ASM which, with its 14 or so LINKed files, is over 6000 lines. It takes about 5 1/2 minutes, as I recall (HEX and SYM, no PRN). Ward Christensen nt. If necessary, you can find the name which was being searched for. It's in memory at 186H. If you have a PROM monitor,  8 ;b͸{J?J?w{ÖüH!K]jU 2͵ ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2hZZk:h|/g}/o#|/g}/o#:h<2hqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2hZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! P!9~#A!9"w**w"j!z*"d!"f!Y"H>2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`"d!"f!!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5.ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p6)))Y~0̿7G~`2@2@#~2@~?>&=2@#^#V#^#V#"@^#V"@:@ '*{@!:@@'"@*@#w"@*@~9'D'/Ϳ7͈?+"@*@+"@!6D"@6!^D"@*@~*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'|E'}X27*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@p';(ͯ''͋(!"@"K@2@<2@2@2@ͥ)()(*¾(2@2@(S*(#)2@2@)l*ç)<;00?;   Á!9DM! ! ͻ#| ! ;! ! !: !I !!!R ! |I !n *:$6͐|Ҳ ! ! ! ! ! !* !I !x ! !  ! ^#Vr+sz ! ^#Vr+s~#fo|  *! õ Wildexp overflow LSWEEP Derived from: LDIR & LTYPE Joe Vogler 84-22-01 Ver:%d.%02d %s %s %s Requires CP/M 2.0 or better Correct syntax is: LSWEEP []... where , , etc. are unambiguous library names. Filetype .LBR is assumed if not specified. Ambiguous names are allowed. ----->Avoid using wildcards in the extension. ----->If using wildcards, always use .LBR In either case, user/drive prefixes are OK. e.g. 'A>LSWEEP 4/D:*.LBR' is ok. %s not found on disk.  0!H  !U  !p  !  !  !  COMMANDS: ? - Displays this menu. E - Extracts (and unsqueezes) a member. V - Views a (viewable) file. X - Exits this program. Any other input skips to the next member & P; î#Z#1]1S;0ø&!9DMk:$}Y M #|Y *!% *:$6͐ |„ ! ͐ #|ʒ ͐!> ͐* !.͐ #| !T* !* *s#rz*!Y # !M>$M<$!k ! Can't close library: %s Bad library name: %s.LBR Library: %s has %d entries, %d free: ß0ÿ1A! æ c!9DM!; 6!, 6#6͐,|ʰ*@$*@Ds#r!0 s#r!2 s#rM<$M>$!( s#r!( ^#Vr+szڥ*@D^#V! r+sn}—!M@D`ḯM@D~#fo͉*1s#r*1~#foM@D~#fo)|ʆ!É!s#rM1`i͐2#*!͇M@D ~#fo!4 s#rM@D~#fo!6 s#r͐*͍͊!: s!: n}?EVXxÆ͐J!: n&!͇!: n&`i͓>qA>\>aM>>Y>+G*3!: n&͐6͐4`i*͖>–>ʥ>a¢>ʮ!; 6*3!: n&͐6͐4`i*͙#|!; 6J*3!: n&͐6͐4`i*͙#|(!; 6J`i!.͜!͇!; 6J*@D^#V{ _zWr+s!2 ^#Vr+s!( ^#Vr+sÉ!, w#wåÉÉ!2 ^#Vr+sâ!0 ^#Vr+s!͇ö!2 ^#Vr+sÿ!>9 %s * %2d. %-12s %3dk > %c Can't type %s files. çc!9DM͐ |v!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|p!͐|v!è͐!.`is#rzʢ͐##n}Q¢!qè!aè!9.com.cqm.crl.frm.fqm.dbf.dqf.ndx.nqx.cql.lbr.lqr.obj.oqj.arc.aqc.rel.rql;S;0ëj!0]1(1û; <[2Ï34A!P;!Z9DM! w#w! w#w!͐! s#rzƒ͐!!ì͐>V“>ʢ>EŸ>ʶ+͐!<!! #|! 6#6!W͐! ! ͐!  ##|! 6#6W! !<!(!ì<!͐͐&͐>E`>o>Vl>#T! w#w͐͐!`i͐)+|ʭ!6!ì! w#w͐|͐`in! s#rz͐͐,! ^#Vr+sõ! ^#Vr+sw![͐/͐2W! w#w͐͐I!`i͐)+|a!c!ì! w#w͐|;͐`in! s#rz;͐|ʧ͐##|³! 6#6W! ~#fo|g}os#r!͐|-! ^#Vr+s!-5> >>>"! ^#Vr+s-W! w#w-! ^#Vr+si! ^#Vr+s+!WW͐|“͐#|y!Á!͐/͐2͐8*:$6͐ì!9Cannot open %s Viewing file--> %s To Drive? (CR for default) ** BAD DRIVE PREFIX ** Extracting file--> %s Invalid mode!Error reading this entry - aborting Done. Error reading this entry - aborting %c ** ABORTED ** , Done. S;0û;s&$ëj!0]11Á$[2A!P;Ï34!E9DM! w#w! w#w! w#w!͐ͩ! s#r͐#|-͐!ͬ!* w#w*6c#6!͐͐ͯ! `i͐Ͳ|ʀ! 6c#6É! `i͐Ͳ! s#r! ! s#r͐! `i͐͵s! ^#Vr+sn}§͐>V>>E>|! !ͬ͸! ͬ! ͻ#|3!.;! 6#6É! ! ͐! #|k!Gͬ! 6#6É! !\ͬ! `i͐Ͳ! s#r͐|ڰ͐|! !rͬÉ*6#6*6#6! w#w͐͐S͐))*! `i͐Ͳs#r͐))*##! `i͐Ͳs#r! ^#Vr+s! w#w! `i͐! s#rzʉ͐|‰͐|g}o|ͣʤ!ç!! s#r͐>E¿>>V>Ã͐͐Æ͐|͐##|! 6#6É! ~#fo|g}os#r!ͬ͐|€! ^#Vr+s!|ڀ> U>d>a>ru! ^#Vr+sÀÉ! w#wÀÆÆ[͐*:$6͐|͐#|½!ͬ!ͬ͐͐͐!9Cannot open %s Viewing file--> %s To Drive? (Return for default) ** BAD DRIVE PREFIX ** Can't create file! Extracting file--> %sInvalid %s decode tree size %c ** ABORTED ** , Done. ñ0!ͮ!!ͮCtrl-X to cancel, SPACE advances 1 line, CR advances %d lines 00<;!9DM͐ ͐͐͐ !F For help, type LDIR alone.!9DM͐n}ʠ! n! ^#Vr+sn}! ^#Vr+sk!í45!9DM͐`is#r͐n}J͐n&ͪ͐ n&<͐`is#r͐ ! s#r͐n} ͐P`i^#Vr+sn&ͪ! ^#Vr+sn&9<! ^#Vr+sÿ!P!9!9DM`i6 #6`i^#Vr+sz͐n͐ nѯgW! s#rzʩ͐ n}?ʩ͐! ^#Vr+s! ^#Vr+sh!!9!9DM! w#w`i6#6͐| ! ~#fo͐n&|g}os`i^#Vr+s`i6#6͐|Ҏ ͐ |V ! ~#fo͐n} V Î ! ~#fo! ^#Vr+s! ~#fo͐ns`i^#Vr+s' ! ~#fo n} ʻ ! ~#fo! ^#Vr+s6.`i6 #6͐| !! ~#fo͐n} !! ~#fo! ^#Vr+s! ~#fo͐ns`i^#Vr+s ! ~#fo͐6͐8!!9G!õ!>">!>">!>U">!>">">H#>">H#H#!Q#͐ n&|R"͐ n&|R"͐ #n}:R"!Q#U"K#͐ n&|"͐ n&|"͐ #n}/"͐ ##n&|"͐ ##n&|"͐ ###n}:"!Q#"K#͐ n&+|E#͐ #n&|E#͐ #n&|E#͐ ##n}/E#͐ ###n&|E#͐ ###n&|E#͐ ####n}:E#!Q#H#K#K#!Q#!9!9DM`iw#w͐n}ʟ#! ^#Vr+sn! n}“#͐å#`i^#Vr+sh#!å#!9!9DM! ^#Vr+sn`is{#`in}*#`in}?#!#ö#!#!9# !$#run out of memory $ $s#r*@$*@Ds#rM@Dn} (M>$| (*>$^#Vr+s*@D^#V! r+s'M&*:$6!9 no directorytoo many directory entriesa bad directoryt(n5!9DM͐q(|ړ(!͐n}(! ^#Vr+sn}*(?(.(/((!Ó(!(1!f9DM͐`i(! s#r! s#r͐ `in}N)͐`in} @)! ~#fo! ^#Vr+s͐`ins! ^#Vr+s(! ~#fo͐6b)!9q)ÿ1!9DM͐n}ʥ)͐͐n&n)s! ^#Vr+sy))?; =.;=Ü-n51#/!9DM!ͪ)!n s͐{~#fo! s#r͐y~#fo! s#r`i6#6!l w#w!ͭ)! s#rz#*!Ï-!o 6#6͐o͐x,! ~#fo͐o)~#fon}!·*͐o+|…*! ~#fo͐)!-s#r! ^#Vr+s!l ^#Vr+s)!D ! ~#fo͐o)~#fo#s#rj,! ~#fo͐o)~#foͰ)| +! ~#fo`i^#Vr+s)! ~#fo͐o)~#fos#rj,! ~#fo͐o)~#fo! ͳ)!. !B s#r! ~#fo͐o)~#fo#n!/ s{:’+! ~#fo͐o)~#fon!. s!0 !B s#r!. n&!ͪ)!- 6! !- n}ʭ+!ð+!ͪ)!, s!, n}+Y,!- 6!, n& ?͐BͶ)! ~#fo͐)!. ͹)#ͭ)s#rz,!Ï-͐8|0,!Ï-!. ! ~#fo`i^#Vr+s)~#foͼ)Ø+!n n&!ͪ)!o ^#Vr+s,*!o w#w͐o͐lm-!q 6#6͐q͐_-!n n&! ~#fo͐q)~#fo͐o)!D ~#foͿ)|Q-͐q`i^#Vr+s,Q-͐q!s s#r͐s͐N-! ~#fo͐s)! ~#fo͐s#)~#fos#r!s ^#Vr+s-é,!q ^#Vr+sÙ,!o ^#Vr+sÀ,͐y͐s#r͐{͐s#r!Ï-!u9*.*!9DM! w#w`i6#6͐|.! ~#fo͐n} -.! ~#fo! ^#Vr+s! ~#fo͐n&|g}os`i^#Vr+só-! ~#fo n} I.! ~#fo! ^#Vr+s6.`i6 #6͐|ҹ.! ~#fo͐n} v.ù.! ~#fo! ^#Vr+s! ~#fo͐n&|g}os`i^#Vr+sP.! ~#fo͐6͐.!9!9DM! ^#Vr+sn`is{/`in}* /`in}?/!/.!/!9!9DM! ~#fo#n}:ʅ/! ~#fo#n}:‚/! ~#fon&! n&|/! ~#fo##s#rÂ/!÷0/! ~#fo#n}:/! ~#fon&! n&/! ~#fo##s#r/!÷0! ^#Vr+sn`is{ʞ0`in}?0! ^#Vr+sn`is{0`in}.0/0!÷0Û0`in}*w0͐n`is{L0! ^#Vr+s`in}.I0L0$0͐n`is{t0! ^#Vr+s`in}.q0t0L0Û0`in! ^#Vr+sn}•0/Û0!÷0/͐n}±0!÷0÷0!÷0!90[=!9DM͐n}0! ^#Vr+sn&000[=ë5!9DM*0! 0!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{M1'1͐T1!9!9DM͐`is#r͐n}ʇ1! ^#Vr+so1! ^#Vr+s͐ns! ^#Vr+sn}‡1͐ö1!91ä9!9DM! n&1|1! n&1! n&&1Ê=!9DM͐͐1s#rz$2!͐͐s#r͐##6#6͐6͐~#fog2[=?;=!9DM͐3͐>Š2>ʱ2>–2>ʿ2>¢2>2>®2>23! n&^2! n&!a2! n&!a2! n} 2! !a2! n&!a2͐##^#Vr+s|o3! ͐͐~#fod2|N3!͐##6#6͐͐s#r͐^#Vr+s! ns&Û3=À>û;!9DM͐ڴ3!4͐n&|g}o|3!4͐##~#fo|3!4͐##~#fo `is#r͐͐͐~#fo͒3͐94!4͐+?`is#r͐##~#fo|4!͕͐͐͐3͐##~#fo͐s#r͐~#fo͐s#r!!͐~#fo͘34͐##6#6͐͐s#r!4!95Ï3P;!9DM͐5!͐4͐~#fo4:59!9DM! n&75|a5! n& h5! n&&!9DM`iw#w! ^#Vr+sn}ʛ5`i^#Vr+s|5͐â5!9ú5:ê::ÿ1!Y9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʕ9`in}%f9! ! s#r! 6#6! s! s! s͐n}-J6! ^#Vr+s! 4͐n}0Z6! 4͐n&ͱ5}w6! ʹ5z6!! s#r! ^#Vr+sn`is{.6! ʹ5! s#r! 4! ^#Vr+sn`is`in&ͷ5}D6U/7X87OA7Cʇ7Sʸ71979͐~#fo|/7! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 G7! 6G7! 6! ~#fo! n&! ^#Vr+s~#fo! ͮ5ѯgs#r08! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s08! n}7! 6#6! ^#Vr+s~#fo! s#r͐n}08͐|08! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s7͐6! ! s#r! n}ž8! ^#Vr+s!|ڞ8͐͐! n}{8!0~8! !8!9~#fo#|›8!Û9L8͐n}8͐͐! ^#Vr+sn&!8!9~#fo#|8!Û9Þ8! n}.9! ^#Vr+s!|.9͐͐! !9!9~#fo#|+9!Û98c9!Û9͐͐`in&!T9!9~#fo#|c9!Û9Ò9͐͐`in&!9!9~#fo#|’9!Û95!Û9!9!9DM! n&|ͯ9! n&|ͩ!9DM! n&|ͯ9! n&|ͩ::!9DM͐͐ V:͐^#Vr+s͐C:͐0K:͐7s!&á:͐ ͐͐ ͉͐:`is͐ ͐͐ )͐:`in&#&á:!9!9DM! n&|ͯ:! n&|ͩ:ê:!9DM`iw#w͐~#fon&:},;͐ ?͐^#Vr+snѯg`is#r:͐3;!9 7:PO*R#7,b;> 2h*P/:q2> ʲ;:h):Rʞ;=ʞ;=> ²;:qw#w#w:ho&552?;>7:P,>;2?!^#V*R:T<=;<*P;;*R!s#r7:P)V>گ2?<<2?7*+++:PG_*RDM! _ ~= Ó=#?S;7*P͍=:q2\5¾=> 2?!*P͐=7:P)"XV>z>z> z>z2:P,"j!"l*T|(>*j!^#V*X#^#V >r+s*l5*R"R*j"*lP>2?#>#"l*T+"T*j! N#Fp+qx=##6>2? >2?7*T|DM*R*Pگ>><>~# x£> ><>~+ x¿>|} ,>>2?)~2#"j!!~#fo#^#Vp+q*j~#fo?s#r5 !\/:q25!> 2?+;:h):Rʞ;=ʞ;=> ²;:qw#w#w:ho&552?;>7:P,>;2?!^#V*R:T<=;<*P;;*R!s#r7:P)V>گ2?<<2?7*+++:PG_*RDM! lsweep [ ..... ] Example: A> lsweep justone A> lsweep onesy twosy threesy A> lsweep b:this c:that another d:last You can name as many Libraries as you can fit on the command line. You can specify Libraries on different drives. You must specify at least one Library. The program will 'process' the Library names in the order specified. When you are done with one, it continues on to the next, or exits after the last one.You can also use wildcards. This was not the case with v1.0. The wildcards are expanded by the program. You'll get lots of non- library names if you forget to use '.LBR' when using wildcards. For each Library, he program builds a list of member names & file sizes and displays one after another, as you hit the RETURN key (or any key not set up as a command key). There are only three command keys: ? - Displays HELP menu V - Views the 'current' member E - Extracts the 'current' member X - eXits the current Library and proceeds to the next one or quits, if there are no more. When viewing a file, the program pauses every 16 lines. The number was chosen to suit me, since I like to read in paragraphs and paragraphs don't end on 22-line boundaries. When the display pauses, you can continue a line at a time by pressing the space key. You can advance another 16 lines by pressing any other key, except for Control-X. That selection will abort the View and return you to the menu. When you return, the current member is the same one you just viewed. I did this because you cannot yet go backwards through the menu. Extraction can be directed to any drive. The program asks for a drive. This is one of the two 'opportunities' you have to abort the program with a Control-C. Hit return for the default drive. You will have to remember which drive is the default. Extraction ALWAYS creates an UNSQUEEZED version of the member. Future modifications will include a COPY command which will allow you to decide whether to unsqueeze. If the member was not squeezed, the member is copied verbatim. Also, the program doesn't respect files with the same names as those it wants to create. Again, future mods may include verification before deleting a file. When a file is EXTRACTED, the entire contents of the original are sent to the external file. I have done some testing and have found that the files make by LSWEEP have the same CRC's as the source members (See LIMITATIONS). LIMITATIONS =========== Thats just about it. Now for the things that the program should do but does not yet. 1. The files created are not verified (e.g. using CRC). I have done a bit of testing and found that the CRC's of the files LSWEEP creates are the same as the originals. The soundness of your system will most probably determine how reliable LSWEEP is in this respect. 2. No tagging of members. 3. No going backwards through the menu. If you overshoot, you have to continue around the ring. 4. You cannot direct file output to other user areas. This is probably the next thing I will do. 5. It would be nice if the program allowed you to 'log' onto another Library, instead of proceeding through the command line arguments. This is my second todo. 6. LSWEEP offers absolutely no way to modify the Library itself. This 'feature' was given conciously. I see no reason to attempt to rewrite LU. 7. The unsqueeze routines are written in C. If the new assembler unsqueeze code had been used, the program would run much faster and the code size would be reduced several Kbytes. I make no apologies for the above 'deficiencies'. The program is much better than nothing. If you reeeealy want something else, modify it. You might let me know what your intentions are; no sense in two people working on the same improvement. HOW TO MODIFY ============= The source for LSWEEP10 includes these files: LSWP1.C LSWP1I.C LSWP1H.C The main file, LSWP1, has #include directives to pull in the others. After modifying, recompile only the file that you changed. If you modify the header file LSWP1H.C, then you need to recompile LSWP1.C and LSWP1H.C. To recompile the programs: A> CC lswp1 A> CC lswp1i The link step is done this way: A> CLINK lswp1 lswp1i [-n] The '-n' option causes the COM file to exit without a warm boot. BACKGROUND ========== This program was inspired by the recent infusion of new Public Domain programs which function like WASH and SWEEP. I use LBR files extensively. Every time I used SWEEP, or its look-alikes, I would imagine that I had a program that would work the same way on Libraries. It is somewhat inconvenient to deal with Libraries. Consider just how much trouble it is to extract a Library member that is squeezed. First, the member must be extracted with LU. Then, it must be unsqueezed. Now, there are three versions of the member on your system: the Library member, a squeezed (external) file and an ASCII file. What a pain! Since I had modified the original C language version of LDIR (1), I felt comfortable enough to do it myself. The first step was to modify the C language version of LTYPE so that it created a disk file instead of dumping the text to the screen. I almost stopped there. It looked pretty nice having a program that would EXTRACT a squeezed Library member and UNsqueeze it at the same time. After some thought, I came back to the basic problem: my new program was another batch program. If anything went wrong, I would have to run the program again. So the reasonable thing to do was to combine LDIR and LTYPE to form a program that would: 1. Build a list of members for the user. 2. Use the entries in the list as pointers to members. 3. Type squeezed and unsqueezed files on the screen. 4. Extract those members, unsqueezing if necessary. The main function is a slightly modified version of the LDIR main. The real changes are in DIRLIST. Fortunately, READDIR was already setup to create a memory image of the Library's directory. It was only necessary to change some of the call argument names to correspond to LDIR and to keep track of what the user had asked the program to do. QCAT and ACAT were modified to allow directing output to disk or screen. The SWITCH done for each character is probable slowing down the program, but I doubt that the effect is severe. NOTES ----- (1) - See CATLBR.LBR on Rio Lobo RCP/M, Kingwood, TX (713)358-7104. FILE: LSWEEP13.TXT DATE: JANUARY 22, 1984 FROM: JOE VOGLER RE: UPDATE LSWEEP10.DOC CHANGES WITH THE 1.3 VERSION OF LSWEEP: 1. DISK BUFFERING IS 8K INSTEAD OF 1K. 2. CAN ONLY HANDLE LIBRARIES WITH 256 OR FEWER MEMBERS. 3. WILDCARDS ALLOWED ON COMMAND LINE. NON-LIBRARY FILE NAMES NOT FILTERED!!! ALWAYS USE '.LBR' IN YOUR WILDCARDS. CAN USE USER/DRIVE DESIGNATIONS, EG 'LSWEEP 5/D:*.LBR'. 4. EXTRACTION TO ANOTHER USER/DRIVE ALLOWED. SAME RULES AS 3. 5. FIXED BAD BUG THAT KEPT PROGRAM FROM PROPERLY EXTRACTING FILES >32K IN SIZE. 6. OTHER MINOR BUG FIXES.  AS 3. 5. FIXED BAD BUG THAT KEPT PROGRAM FROM PROPERLY EXTRACTING FILES >32K IN SIZE. 6. OTHERogram to do. QCAT and ACAT were modified to allow directing output to disk or screen. The SWITCH done for each character is probable slowing down the program, but I doubt that the effect is severe. NOTES ----- (1) - See CATLBR.LBR on Rio Lobo RCP/M, Kingwood, TX (713)358-7104. FILE: LSWEEP13.TXT DATE: JANUARY 22, 1984 FROM: JOE VOGLER RE: UPDATE LSWEEP10.DOC CHANGES WITH THE 1.3 VERSION OF LSWEEP: 1. DISK BUFFERING IS 8K INSTEAD OF 1K. 2. CAN ONLY HANDLE LIBRARIES WITH 256 OR FEWER MEMBERS. 3. WILDCARDS ALLOWED ON COMMAND LINE. NON-LIBRARY FILE NAMES NOT FILTERED!!! ALWAYS USE '.LBR' IN YOUR WILDCARDS. CAN USE USER/DRIVE DESIGNATIONS, EG 'LSWEEP 5/D:*.LBR'. 4. EXTRACTION TO ANOTHER USER/DRIVE !9"1+SCRAMBLE.COM as of 12/30/82 $ :t Wx++ PASSWORD NOT 8 BYTES ++$!mm!#h\<–x++NO SUCH FILE++$ڨ0=͚Ö\<~x++ CLOSE ERROR - FILE LEFT IN UNKNOWN CONDITION ++$\7x++ READ ERROR - FILE MAY BE DESTROYED ++$!w,3:|=2|:h=2h\<”x++ RE-OPENING EXTENT FAILED ++ FILE IS CLOBBERED $>2|:j2j\x++ WRITE ERROR - FILE CLOBBERED ++$!w >f f2Rx++ NO CHARACTER MAY APPEAR MORE THAN TWICE IN THE PASSWORD. '' DOES IN YOURS ++$=~# xm * SCRAMBL.MSǠ consist o SCRAMBLE.DO plu th initia comment section of SCRAMBLE.ASM (Version 2.1). J.E. CROWELL SCRAMBLE.DOC: SCRAMBLE is a command used to encode a CP/M file. The format of the command is: SCRAMBLE filename.type password where "password" is an 8 character password made of characters perissible in a file name (i.e. no ".", etc). To obtain a good "initial seed" for the scrambling process, no character in the password may appear more than twice. The requested file is scrambled, and re-written in place. To un-scramble the file, the IDENTICAL command is issued, i.e. SCRAMBLE filename.type password. This is because SCRAMBLE does an "exclusive-or" type modification to the file, and doing two identical exclusive-or's to data result in the same data being retuned. I feel a scrambled file is quite secure. Given that a file was scrambled and the password forgotten, I know of no way to determine what the original file was. Even a file which is all binary-0's, is sufficiently scrambled to defy finding out what the password or original data was. ...But I assume no responsibility for the "security" of files scrambled with SCRAMBLE as I am not a "student of cryptology". Note also, that if an attempt is made to unscramble a scrambled file, using the WRONG password, then the file is technically "double scrambled" and SCRAMBLE would then have to be executed TWICE, once with the original password, and once with the erroniously-used password. Because of the exclusive or-ing process, either password may be used either time. 03/11/79 Ward Christensen SCRAMBLE.ASM: 03/11/79 Ward Christensen ; SCRAMBLE.ASM ver 2.1 ; ;SCRAMBLE is a program to scramble CP/M files using an 8 byte ;password. ; ;03/14/79 Originally written by Ward Christensen ; ;07/13/81 Moved stack init to beginning so default stack not ; used. Added fix to write routine for proper ; operation under CP/M 2.x. Expanded Macros so program ; may be assembled with ASM. By Keith Petersen, W8SDZ ; ;12/30/82 Removed loop called MIXUP and MVI H,0 just before ; it. Comment was "Scramble awhile to mix up the ; seed". Loop occurred before the password was moved ; into location, so loop had no effect on "seed". ; Added CALL ERXIT in FINISH. If an error had ; occurred program would have crashed on the error ; message itself. Added more comments around pseudo- ; random number generator to better understand the ; coding. By Bob Hageman ; MONTH EQU 12 ;LAST.. DAY EQU 30 ;..MODIFICATION.. YEAR EQU 82 ;..DATE ; ;Scrambling is done in place, i.e. the file is modified on top ;of itself. The same password used to scramble the file is ;used to unscramble it, using the exact same command. This is ;because the scrambling code is exclusive-ORed with the data ;file, and two same exclusive ORs result in the original value ;being returned. ; ;Command format: ; ; SCRAMBLE filename.type PASSWORD ; ;Where PASSWORD is any 8 character string which ;is allowable as a file name (i.e. no '.', etc). ; ed MIXUP and MVI H,0 just before ; it. Comment was "Scramble awhile to mix up the ; seed". Loop occurred before the password was moved ; into location, so loop had no effect on "seed". ; Added CALL ERXIT in FINISH. If an error had ; occurred program would have crashed on the error ; message itself. Added more comments around pseudo- ; random number generator to better understand the ; coding. By Bob Hageman ; MONTH EQU 12 ;LAST.. DAY EQU 30 ;..MODIFICATION.. YEAR EQU 82 ;..DATE ; ;Scrambling is done in place, i.e. the file is modified on top ;of itself. The same password used to scramble the file is ;used to unscramble it, using the exact same command. This is ;because the scrambling code is exclusive-ORed with the data ;file, and two same exclusive ORs result in the original value ;being returned. ; ;Command format: ; ; SCRAMBLE filename; SCRAMBLE.ASM ver 2.1 ; ;SCRAMBLE is a program to scramble CP/M files using an 8 byte ;password. ; ;03/14/79 Originally written by Ward Christensen ; ;07/13/81 Moved stack init to beginning so default stack not ; used. Added fix to write routine for proper ; operation under CP/M 2.x. Expanded Macros so program ; may be assembled with ASM. By Keith Petersen, W8SDZ ; ;12/30/82 Removed loop called MIXUP and MVI H,0 just before ; it. Comment was "Scramble awhile to mix up the ; seed". Loop occurred before the password was moved ; into location, so loop had no effect on "seed". ; Added CALL ERXIT in FINISH. If an error had ; occurred program would have crashed on the error ; message itself. Added more comments around pseudo- ; random number generator to better understand the ; coding. By Bob Hageman ; MONTH EQU 12 ;LAST.. DAY EQU 30 ;..MODIFICATION.. YEAR EQU 82 ;..DATE ; ;Scrambling is done in place, i.e. the file is modified on top ;of itself. The same password used to scramble the file is ;used to unscramble it, using the exact same command. This is ;because the scrambling code is exclusive-ORed with the data ;file, and two same exclusive ORs result in the original value ;being returned. ; ;Command format: ; ; SCRAMBLE filename.type PASSWORD ; ;Where PASSWORD is any 8 character string which ;is allowable as a file name (i.e. no '.', etc). ; ORG 100H ; ;Init local stack LXI H,0 DAD SP SHLD STACK LXI SP,STACK ; ;Print sign-on message CALL START DB 'SCRAMBLE.COM as of ' DB '0'+MONTH/10 DB '0'+MONTH MOD 10,'/' DB '0'+DAY/10 DB '0'+DAY MOD 10,'/' DB '0'+YEAR/10 DB '0'+YEAR MOD 10 DB 0DH,0AH,'$' ; START POP D ;GET ID MVI C,PRINT CALL BDOS ;PRINT ID ; ;Start of program execution ; ;See that the password is 8 characters LDA FCB2+8 CPI ' ' JNZ PWIS8 CALL ERXIT DB '++ PASSWORD NOT 8 BYTES ++$' ; ;Save the password ; PWIS8 LXI H,FCB2+1 ;POINT TO PASSWORD LXI D,PASSWD ;OUR PASSWORD AREA LXI B,8 ;8 CHARS CALL MOVER ;MOVE IT ; ;Password is 8 bytes, now make sure no character ;is repeated more than 2 times LXI H,PASSWD MVI B,8 ;8 CHARS TO TEST ; DUPTEST CALL CKDUP ;ABORTS IF 3 = CHARS INX H ;TO NEXT CHAR DCR B JNZ DUPTEST ; ;See that the input file exists PUSH B PUSH D PUSH H MVI C,OPEN LXI D,FCB CALL BDOS POP H POP D POP B INR A ;OK? JNZ SCRAMLP ;YES, SCRAMBLE IT CALL ERXIT DB '++NO SUCH FILE++$' ; ;Read the file, scramble a sector, re-write it. ; SCRAMLP CALL RDSECT ;READ A SECTOR JC FINISH ;EXIT LOOP IF EOF CALL SCRAMBL ;SCRAMBLE IT CALL BACKUP ;RE-POSITION FOR WRITE CALL WRSECT ;RE-WRITE THE SECTOR JMP SCRAMLP ;LOOP UNTIL EOF ; ;All done - on a "normal" CP/M system we wouldn't have to do ;anything because we re-wrote in place. However, for systems ;which use sector deblocking we must explicitly close the file ;in order to flush the memory-resident disk buffers. ; FINISH PUSH B PUSH D PUSH H MVI C,CLOSE LXI D,FCB CALL BDOS POP H POP D POP B INR A ;THIS BETTER WORK.. JNZ EXIT CALL ERXIT DB '++ CLOSE ERROR - FILE LEFT IN ' DB 'UNKNOWN CONDITION ++$' ; ;Sector read routine ; RDSECT PUSH B PUSH D PUSH H MVI C,READ LXI D,FCB CALL BDOS POP H POP D POP B ORA A RZ ;ALL OK ; ;Read error or EOF ; CPI 1 ;EOF? STC ;CARRY SHOWS EOF RZ ;RET, CARRY SET CALL ERXIT DB '++ READ ERROR - FILE MAY BE ' DB 'DESTROYED ++$' ; ;Scramble the sector ; SCRAMBL LXI H,80H ;POINT TO SECTOR ; SCRLP CALL PSEURAN ;GET PSEUDO RANDOM # XRA M ;SCRAMBLE MOV M,A INR L ;MORE IN SECTOR? JNZ SCRLP RET ; ;Backup the file pointer for the re-write ; BACKUP LDA FCBRNO ;GET SECTOR # DCR A ;BACK UP STA FCBRNO RP ;RETURN IF OK ; ;We backed up into previous extent, will have to re-open it ;(this only works for 16k extent size systems). ; LDA FCBEXT ;GET EXTENT DCR A ;BACK UP 1 STA FCBEXT PUSH B PUSH D PUSH H MVI C,OPEN ;RE-OPEN LXI D,FCB CALL BDOS POP H POP D POP B INR A JNZ OPEN2OK CALL ERXIT DB '++ RE-OPENING EXTENT FAILED',0DH,0AH DB '++ FILE IS CLOBBERED $' ; OPEN2OK MVI A,7FH ;GET HI SECTOR STA FCBRNO RET ; ;Write back the sector ; WRSECT LDA FCB+14 ANI 1FH ;RESET S2 FLAG FOR CP/M 2.x STA FCB+14 PUSH B PUSH D PUSH H MVI C,WRITE LXI D,FCB CALL BDOS POP H POP D POP B ORA A RZ CALL ERXIT DB '++ WRITE ERROR - FILE CLOBBERED ++$' ; ;Get a Pseudo-Random 8 bit number using the password as a seed ; ; For speed, this routine does no register ; PUSHes and POPs, however HL aren't used. ; PSEURAN MVI C,4 ;GRAB EVERY 4TH PSEU. # ; ; The following is done four times for each character in the ;file being scrambled. After four password shifts a value is ;returned in A to the calling routine. ; PSEULP0 MVI B,8 ;SHIFT THRU 8 BYTES LXI D,PASSWD ORA A ;CLEAR INITIAL CARRY ; ; PSEULP1 shifts the 8 byte sequence of the password one bit to ;the right filling the left most bit with 0 (for the first of ;the four passes, after that bit may receive 0 or 1 from carry) ;and ending with the right most bit moved to the carry. ; PSEULP1 LDAX D ;GET A CHAR RAR ;SHIFT STAX D ;Put shifted char back in place INX D ;Point to next char DCR B ;Count down JNZ PSEULP1 ;Exclusive-OR the last few bits into the first one DCX D ;BACK UP TO LAST RAR ;Shift the 8th byte twice more thru RAR ; itself and the carry XCHG XRA M ;Mix treble shifted 8th byte in A with ; the single shifted 8th byte in M RRC ;SHIFT LO BIT INTO HI discarding the ; carry bit (4th shift of 8th byte) ANI 80H ;ISOLATE SINGLE BIT, A will contain ; either 80H or 00H LXI H,PASSWD ;GET FIRST BYTE ORA M ;'OR' IN THE BIT MOV M,A ;MOVE IT BACK, whatever is in A when ; C=0 will be the value to be XORed ; with the next byte in the current ; sector. This value changes for each ; and every byte of the file. XCHG ;RESTORE HL DCR C JNZ PSEULP0 ;LOOP IF MORE PASSES RET ; ;Routine to check for duplicate chars in password ; CKDUP MVI C,3 ;DUP CHAR COUNTER LXI D,PASSWD MVI A,8 ;CHAR COUNT ; CKDLP PUSH PSW ;SAVE COUNT LDAX D ;GET CHAR CMP M ;DUP? JNZ CKNDUP DCR C ;COUNT DUPS JNZ CKNDUP STA DUPCHAR ;SAVE FOR PRINT CALL ERXIT DB '++ NO CHARACTER MAY APPEAR MORE ' DB 'THAN TWICE IN THE PASSWORD. ',0DH,0AH DB '''' DUPCHAR DB $-$,''' DOES IN YOURS ++$' ; CKNDUP INX D POP PSW ;GET COUNT DCR A JNZ CKDLP RET ;OK, NOT 3 DUP ; ;Move subroutines ; MOVER MOV A,M STAX D INX H INX D DCX B MOV A,B ORA C JNZ MOVER RET ; ;Exit with error message ; MSGEXIT EQU $ ;EXIT W/"INFORMATIONAL" MSG ERXIT POP D ;GET MSG MVI C,PRINT CALL BDOS ; ;Exit, restoring stack and return ; EXIT LHLD STACK SPHL RET ;TO CCP ; PASSWD DS 8 ;PASSWORD KEPT HERE DS 40H ;STACK AREA STACK DS 2 ; ;BDOS equates ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 CONST EQU 11 OPEN EQU 15 CLOSE EQU 16 SRCHF EQU 17 SRCHN EQU 18 ERASE EQU 19 READ EQU 20 WRITE EQU 21 MAKE EQU 22 REN EQU 23 STDMA EQU 26 BDOS EQU 5 FCB EQU 5CH FCB2 EQU 6CH FCBEXT EQU FCB+12 FCBRNO EQU FCB+32 ; END DAX D ;GET CHAR CMP M ;DUP? JNZ CKNDUP DCR C ;COUNT DUPS JNZ CKNDUP STA DUPCHAR ;SAVE FOR PRINT CALL ERXIT DB '++ NO CHARACTER MAY APPEAR MORE ' DB 'THAN TWICE IN THE PASSWORD. ',0DH,0AH DB '''' DUPCHAR DB $-$,''' DOES IN YOURS ++$' ; CKNDUP INX D POP PSW ;GET COUNT DCR A JNZ CKDLP RET ;OK, NOT 3 DUP ; ;Move subroutines ; MOVER MOV A,M STAX D INX H INX D DCX B MOV A,B ORA C JNZ MOVER RET ; ;Exit with error message ; MSGEXIT EQU $ ;EXIT W/"INFORMATIONAL" MSG ERXIT POP D ;GET MSG MVI C,PRINT CALL BDOS ; ;Exit, restoring stack and return ; EXIT LHLD STACK SPHL RET ;TO CCP ; PASSWD DS 8 ;PASSWORD KEPT HERE DS 40H ;STACK AREA STACK DS 2 ; ;BDOS equates ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 CONST EQU 11 OPEN EQU 15 CLOSE EQU 16 SRCHF EQU 17 SRCHN EQU 18 ERASE EQU 19 READ EQU 20 WRITE EQU 21 MAKE EQU 221 > !t %PASSWORD <8$ "24PASSWORD >2$.mm(,.m\< ?$Sh]`\ B!#~hw w, !|5.j~w\(ERROR$ \<( SCRAMBLE/Jun83. $h]`\ BLASM COM,LASM DOC' !"LSWEEP13COM}#$%&'()*+,-./012LSWEEP DOCJ3456789:;<SCRMBL21COM=SCRAMBLEMSG>?@ASCRMBL21ASM9BCDEFGHISCRMBL $$$ <<<<<<< Update for SCRMBL21.COM to SCRMBL.COM >>>>>>> Th subjeco scramble fil i deal wit nearl totall b th forme entr i th librar unde FOG/UTL.019 Her w hav simplifie th algorith fo user t b abl t progra i wh d no hav experienc i maths belo i a ful explanatio jusoth scrambl operations As th SCRAMBL2 fil contain man BDOӠ functions an complicate fil handlin routines thes hav bee edite fo spee an byt savin t produce fil tha i shorte b 2/3rd tha thoriginal Whicwil wor fo standar CP/ 2. an CP/ computers includin th Osborn an Executive, but not for older 8080 CPU machines. The production of a random number. Th algorith use i th original Th cod differ onl b fe insertion o Z8 t sav bytes thi fil wil therefor unscrambl file scramble b it predecessor Reference usin *1-7 belo ar t b foun in the SCRMBL.MAC source file. The algorithm is defined as follows; LET PASSWD = 8 BYTE NUMBER. LET LB = LAST BYTE OF PASSWD. LET FB = FIRST BYTE OF PASSWD. ALGORITHM: FOR I = 1 TO 4 *1. PASSWD = PASSWD/2 *2. A = LB/4 + [LB(MOD 4)*64] *3. A = A.XOR.LB *4. A = A(MOD 2) *5. A = A * 128 *6. A = A.OR.FB *7. FB = A THIS IS A NEW VALUE WHICH REPLACES THE PREVIOUS FIRST BYTE OF PASSWD. NEXT I A = RANDOM NUMBER THIS NUMBER IS THEN USED TO SCRAMBLE THE CURRENT BYTE FROM THE FILE. Operatio o thi fil i eas an follow th sam CP/ comman heade a the previous file SCRAMBL21.COM; A>SCRMBL B:DIDLSPYZ.TYP PASSWORD Not th comman tai ha th require filenam fo scramblin an afte it filetypspacethe the passwordthi i a eigh characte woroyou choice but not more than 2 repeated characters. SCRMBL.COM written by: R.PREECE and D.AMOS. 68a FINDLAY AVENUE, ROSEVILLE, N.S.W. AUSTRALIA. 2069. Members of a Sydney based software group for better assembly files.  = PASSWD/2 *2. A = LB/4 + [LB(MOD 4)*64] *3. A = A.XOR.LB *4. A = A(MOD 2) *5. A = A * 128 *6. A = A.OR.FB *7. FB = A THIS IS A NEW VALUE WHICH REPLACES THE PREVIOUS FIRST BYTE OF PASSWD. NEXT I A = RANDOM NUMBER THIS NUMBER IS THEN USED TO SCRAMBLE THE CURRENT BYTE FROM THE FILE. Operatio o thi fil i eas an follow th sam CP/ comman heade a the previous file SCRAMBL21.COM; A>SCRMBL B:DIDLSPYZ.TYP PASSWORD Not th comman tai ha th require filenam fo scramblin an afte it filetypspacethe the passwordthi i a eigh characte woroyou choice but not more than 2 repeated characters. SCR; ;THIS CP/M FILE SCRMBL.COM UPDATES THE SCRAMBLE21.COM FILE OF FOG UTL.019. ; ;USER CHANGEABLE STACK TO ANY MEMORY ADDRESS. STACK EQU 0B700H ; ;PASSWORD STORED @0200H. PASSWD EQU 0200H ; ;1ST PAGE ADDRESSES. BDOS EQU 05H FCB EQU 5CH ; ;BDOS SWITCHES !!!!! PRINTS EQU 09H OPENF EQU 0FH CLOSE EQU 10H READF EQU 14H WRITE EQU 15H ; ;CONTROL CHARACTERS. NUL EQU 00H LF EQU 0AH CR EQU 0DH ; .Z80 ;MICROSOFTS MACRO80 SWITCH FOR Z80 COMPILING. ASEG ;RELOCATABLE SWITCH. ORG 0100H START: LD SP,STACK ;USER CHANGEABLE STACK! ; ;PRINT THE INITIAL SCREEN STRING. LD DE,STRTST LD C,PRINTS ;BDOS9. CALL BDOS ; ;IS THE PASSWORD LESS THAN 8 DIGITS. LD A,' ' LD HL,FCB+24 CP (HL) ;JUMP TO PW8 IF O.K. JR NZ,PW8 ;PRINT THE WARNING 'PASSWORD LESS THAN 8 CHARACTERS'. CALL SENDM DB 'PASSWORD <8$' ; PWDUP2: DEC C JR NZ,PWDUP1 ;LOAD THE FAULTY LETTER TO THE WARNING STRING. LD (PWDUPST+9),A ;THE PASSWORD HAS MORE THAN 2 LETTERS THE SAME, SEE SCRAMBLE21.DOC NOTES. CALL SENDM PWDUPST:DB 'PASSWORD >2$' ; ;TEST THE PASSWORD 8*8 OR UNTIL ERROR. PW8: LD B,08H LD L,FCB+17 PWDUP: PUSH BC LD BC,0803H LD DE,FCB+17 PWDUP0: LD A,(DE) CP (HL) ;MORE THAN 2 LETTERS THE SAME IN THE PASSWORD. JR Z,PWDUP2 PWDUP1: INC E ;RE-DO LOOP FOR 8 TESTS PER CHARACTER. DJNZ PWDUP0 INC L POP BC ;RE-DO LOOP FOR ALL 8 CHARACTERS. DJNZ PWDUP ; ;LOAD THE PASSWORD TO THE T.P.A. LD L,FCB+17 LD DE,PASSWD LD C,08H LDIR ; ;OPEN THE SPECIFIED FILENAME FILE. LD C,OPENF ;BDOS15. LD DE,FCB CALL BDOS INC A ;IF A=NON-ZERO JUMP TO THE SCRAMBLE S/R. JR NZ,SCRMBL ;IF A=NUL PRINT THE FAULTY FILENAME. LD DE,243FH LD (FCB+12),DE LD DE,FCB+1 JR SENDM0 ; ;THE SCRAMBLE SUB ROUTINE, LOADS THE FILE RECORD BY RECORD INTO THE DMA, ;WHERE IT IS PROCESSED FOR THE SCRAMBLE. SCRMBL: LD C,READF ;BDOS20. LD DE,FCB CALL BDOS OR A JR NZ,FIN LD DE,080H ;THE DMA ADDRESS @0800H. ; ;__________________________________________________________________ ; FOR THE * NOTES BELOW REFER TO SCRMBL.DOC. ; ;RANDOM NUMBER GENERATOR USING PASSWORD AS SEED. ;ONLY EVERY 4TH RANDOM NUMBER IS USED TO SCRAMBLE. SCRLP: LD C,04H PSEULP0:LD B,08H ;LENGTH OF PASSWORD. LD HL,PASSWD-1 ;PASSWORD ADDRESS-1. OR A ;ZERO THE CARRY FLAG. ; ;*1. 8 BYTE ROTATE OF PASSWORD. ;I.E. PASSWORD=PASSWORD/2. PSEULP1:INC HL RR (HL) DJNZ PSEULP1 LD A,(HL) ;GET THE LAST BYTE. ; ;*2. ROTATE RIGHT WITH CARRY. RRA RRA ; ;*3. XOR IT WITH THE ORIGINAL LAST BYTE. XOR (HL) ; ;*4 AND *5. ROTATE RIGHT CIRCULARLY AND GET BIT 7. RRCA AND 080H LD L,B ;LOAD HL REGISTER WITH PASSWORD=@0200H. ; ;*6. OR A WITH THE FIRST BYTE. OR (HL) ; ;*7. REPLACE FIRST BYTE OF PASSWORD WITH A. LD (HL),A DEC C JR NZ,PSEULP0 EX DE,HL ;LOAD THE DMA CURRENT BYTE ADDRESS TO HL. XOR (HL) ;SCRAMBLE THE BYTE WITH XOR. LD (HL),A ;LOAD THE BYTE IN A INTO THE DMA. INC L ;INCREMENT TO THE NEXT FILE BYTE. EX DE,HL ;SAVE CURRENT BYTE POSITION IN DE. JR NZ,SCRLP ;------------------------------------------------------------------ ;DECREMENT THE CURRENT RECORD BY 1. LD HL,FCB+32 DEC (HL) LD L,6AH LD A,(HL) ;AND THE TOTAL RECORD COUNT FOR THIS EXTENT WITH 1FH. AND 1FH ;SEND THE ADJUSTED BYTE TO 006AH. LD (HL),A LD C,WRITE ;BDOS21. LD DE,FCB CALL BDOS OR A ;IF A=NUL JUMP TO SCRMBL FOR THE NEXT RECORD. JR Z,SCRMBL ; ERROR: CALL SENDM DB 'ERROR$' ; ;AT THE LAST RECORD TEST FOR ERRORS. FIN: CP 01H JR NZ,ERROR ;IF THE FILE HAS CHANGED SIZE CLOSE THE FILE. LD C,CLOSE LD DE,FCB CALL BDOS INC A ;IF A=NUL JUMP TO ERROR. JR Z,ERROR ND: JP NUL ; ;SEND STRING TO THE SCREEN ROUTINE. SENDM: POP DE SENDM0: LD C,PRINTS ;BDOS9. CALL BDOS JR ND ; ;INITIAL STRING. STRTST: DB 'SCRAMBLE/Jun83.',CR,LF,'$' ; END START  LD (HL),A ;LOAD THE BYTE IN A INTO THE DMA. INC L ;INCREMENT TO THE NEXT FILE BYTE. EX DE,HL ;SAVE CURRENT BYTE POSITIO͗The Base Page Address of this system's BDOS is :}͗ The Base Page Address of this system's CCP is :}͗ ͆ Ғ0æ7æ~#ʤͦØ_LASM COM,LASM DOC' !"LSWEEP13COM}#$%&'()*+,-./012LSWEEP DOCJ3456789:;<SCRMBL21COM=SCRAMBLEMSG>?@ASCRMBL21ASM9BCDEFGHISCRMBL COMJSCRMBL DOCKLMSCRMBL MACNOPQBDOSLOC $$$* PROGRAM NAME: BDOS Locator * AUTHOR: RICHARD CONN * VERSION: 1.0 * DATE: 3 July 81 * PREVIOUS VERSIONS: -None- VERS EQU 10 ; VERSION NUMBER CPM$BASE EQU 0 ; BASE ADDRESS OF CP/M SYSTEM * * BDOS Locator simply functions to print out the base page address * of the user's CP/M BDOS and the base page address of the user's CP/M CCP. * BDOS EQU CPM$BASE+5 ; ADDRESS OF BDOS ENTRY CR EQU 0DH LF EQU 0AH ORG CPM$BASE+100H CALL PRINT DB 'The Base Page Address of this system''s BDOS is ',0 LDA BDOS+2 ; GET PAGE ADDRESS CALL HEX$OUT ; PRINT AS 2 HEX CHARS CALL PRINT DB CR,LF,'The Base Page Address of this system''s CCP is ',0 LDA BDOS+2 ; GET BDOS ADDRESS SUI 8 ; 800H LESS CALL HEX$OUT ; PRINT AS 2 HEX CHARS CALL PRINT DB CR,LF,0 RET * PRINT VALUE IN REG A AS 2 HEX CHARS HEX$OUT: PUSH PSW ; SAVE VALUE RLC ; SHIFT NYBBLES RLC RLC RLC CALL HEX1 ; PRINT HIGH NYBBLE POP PSW ; GET VALUE AND PRINT LOW NYBBLE * PRINT LOW NYBBLE OF REG A AS 1 HEX CHAR HEX1: ANI 0FH ; MASK OUT HIGH CPI 10 ; 0-9? JNC HEX1A ADI '0' ; CONVERT 0-9 TO '0'-'9' JMP COUT HEX1A: ADI 'A'-10 ; CONVERT 10-15 TO 'A'-'F' JMP COUT * PRINT STRING ENDING IN 0 PTED TO BY RET ADR PRINT: XTHL ; SAVE HL AND GET RET ADR PRINT1: MOV A,M ; GET BYTE INX H ; PT TO NEXT ORA A ; DONE? JZ PRINT2 CALL COUT ; PRINT IT JMP PRINT1 PRINT2: XTHL ; RESTORE RET ADR AND HL RET * PRINT CHAR IN REG A ON CONSOLE COUT: PUSH H ; SAVE REGS PUSH D PUSH B MOV E,A MVI C,2 ; CONSOLE OUTPUT CALL BDOS POP B ; RESTORE REGS POP D POP H RET END ess of this system''s CCP is ',0 LDA BDOS+2 ; GET BDOS ADDRESS SUI 8 ; 800H LESS CALL HEX$OUT ; PRINT AS 2 HEX CHARS CALL PRINT DB CR,LF,0 RET * PRINT VALUE IN REG A AS 2 HEX CHARS HEX$OUT: PUSH PSW ; SAVE VALUE RLC ; SHIFT NYBBLES RLC RLC RLC CALL HEX1 ; PRINT HIGH NYBBLE POP PSW ; GET VALUE AND PRINT LOW NYBBLE * PRINT LOW NYBBLE OF REG A ASÄ$$ password$@NAMES DIRZCPR2 w_#~ ʸ A:4ɀ MSW:CP-MIG ?ʻ w# !EZCPR#1.09 84-06-26!+(0͙ƣ:6:6PYZ2PFX8.CC #1.04 84-06-25'SC80.CC #5.15 84-05-13~o}g^#V}s#r!͍&}o|g}o|g}o|g{z{z{z{̅!-{̅!,z>{z?!-z>{zñ>{>_||g}oɯo_)&) {BKW_GyO-)"BK>){_zWU{zUW#{_==||u|u6u+|/g}/o{ozgN N#~# A~# yOďy™# ʮ#ʸɯ#+#Ⱦ N #NGͲ7~# A! G~p# %SCPM.CC #5.06 84-03-27*!͍&! !! !!! ! !!!!!͂Z} +++ $wCCABEND: Attempting System Restart.$͂Z͐ASCENV0.CC #1.17 84-06-22* !͍&*!9*.!!9"##*}$o{{ڍ<2"*{ {*\{>0{z͸CCBROKE: Program or system is damaged.$1͸CCMEMRY: Not enough memory to work in.$!͍!{`i+6+r+s!*~# xJ S_z$Wz4Ns#Fr#xˆ**}o#{ DM!$!cg!Rc!ol͓"!!n&!\!l!^#V#N#F+++yx*y^#V#½#x¼ͫ¼u!99ҍ>!27!t9::ÍRSXDEF.CC #1.00 84-05-13"RELMV.CC #1.03 84-06-13 SNAP version^#V{K#^#V{K#^#V^#V`iMr+sr{K!N N! Ï s p8 pN ͣñ^#V+}DM͞}DM^#V+ !9DMͩ** +#Y- Y RELOCATED CODE BLOCK Y data segment Y instruction segment m STRLIB.CL #2.08 84-04-10s#w#ww###n&n&##n&#^Wng# 5^W#^wyO~#^+#4#q#r> y   ##ů++ 5ů^WBK7 L ͼ!-##d !-!9I!ͥ|ʨ !9I!- !9!9IuT!9I!ͥ| !9I!9I! [up !9I! [up h !9I! ͥ|- !9I!9I!0 h !9I!9I! [p !9I! [!0 !9!T!9IB| !9IB!0͸!9IB!9ͷt| !9!9!9IT! !0}! 9IBT!9I!9Iͥ| !u!9I#T+w !9Ik ( LOGLIB.CL #2.09 84-04-09:$!   $ T]6${6" * #}* +" ͭ ͠ } $! i! i!l͠ Ân þ!1 ͈|# #w  w ͭ Xͷ - w è }Modified $!w !9IB|Z !.i!9Is !g'Z& e OUTNUM.CL #1.03 84-04-08!9I!9IB!t!9I!t!k'͂ i!9I!͟ !9I͟ !9I!t!9I͎|!9I!u !9I; !u!t|9s!9I!ͥ|k!-i!9!9IuTs!+i!|'s !9I  {ҡ6͏!0$"}0$!9I!ͥ|!-i!9!9IuT!9I͈c SNAP1.CL #1.01 84-04-16 with SNAP ON ͭ Y ͮw jPDGREE.CL #1.04 84-04-08  >.ʇ# ¡Ì^#V!6  6! *ͼ͂!9ͭ !9!H͊ !' !Q9Iͻ!' !Q9I͛ s ͷ !O9I͐ͮ!'s !M9!9ͭ !9!H͊ ! !O9I͑͛ s !K9͌͐|!' ͌ ͭ ͷ ͈͌ͮ!'s !ͭ h ENVLIB.CL #1.07 84-06-22!ͺ>!K_G_?#+ Y/ +!ͺD{"!#:@o[!&DM>þ7#^#V^#VÈ!͎ʭ}U oj+++͐ð*+++*!9*!9*|}D g$ RSXENV.CL #1.08 84-05-135!͎} ++++͐:7!  ~< ^#Vn!͖ͅ. ##^#V N#F!^#V͈# n`CCPENV.CL #1.09 84-06-23:! 9*͂""*}!o"!**!9"!"COMA!# >þ H~##_^#V{҂#Q!H+|g{`k{*{Y!͎*~#fo{ҏʾ} +++͐!ͺ:·*"">2+r+s">2*~#Þ|#Y!,|*{!ͅf. ~<ʜ ^#V͂ ^#V͂UNLOCK.CL #1.03 84-04-28ͼÞ!9I+T#|d!9!FTD|5!9I+T#|2!9S!tT|/!9Ia!9I+T#|aJ|^P!t5!!i! i!i!T{ڳ\ !n&!9!9!xT!9!<͊ !|-!9!G9IT|!9I+T#!͙|,!u!C9!9Iͣ!͙|ʗD|PSj!*i!9!9I !9͢ !9ͫ ͙|ʔ!!C9!9!9IͣT!͙|j!9 !9I!͙|!9͢ |j!9 !9I!͙|-*!u!C9!9͛ !9͢ !ͤt!C9ɣ[CLKENV.CL #1.00 84-04-12:`ž*p> YWHEEL.CL #1.01 84-06-23:`ž*p,!͙|i!~ Þ!9ͩT|!9IB!!9ͩT| !9I!9I},!͙|Ji N#F!9͵T!!9IɋlLOKCHK.CL #1.02 84-06-22x|ʫ!9! xTÿ!9! !(T!9!T!9I+T#| ͭ !'1 !9!9I;T| ͨ !9I!9L!͎T!L!9I͎|P!' !'|`à!'s !9͉T!ͥ|ʠ!9I|ʘ!&( à!T( !9IjXCHAIN.CL #1.01 84-04-11,-:<*##T]}i,!͙| !}+V+^}#w#w+r+s!9!9!͊ !9I !9ͳ !;͙|t!9!͊ !9T|!9IB|!9IB!;͎!9͢ !͎t|!9!; !9!9I |5!9͢ ͫ ͤ|!!9!9͛ ,!͙|5!9͢ |FI|`%}O[!ͤ|ʄ!9͛ /!!9ɮLODCCP.CL #1.00 84-06-11 SNAP version,}|x!*!9{}##N#Fͨ{*} fN + f~/T] ͏F#,͸CHAINING TO NEW CCP FAILS$~w#~w#*Yo = active CCP to be replaced by the new one.o = base location for the new, resident CCP.*9CY bytes needed, with 2048 allowed.͸NEW CCP EXCEEDS MAXIMUM ALLOWED.$*EZCPR1.CL #1.09 84-06-26G%} CP/M is a registered trademark of Digital Research. EZCPR Copyright 1984, Dennis E. Hamilton. PR1.CL #1.09 84-06-26G%}O# "WIZ "SAVE#Iͮ#͖"#ͻ#-"̀ 2"O1G%͎ͥ"s1G%ͫØͣ!͇#š#!e$ k#!$n!$P{ :$ +V+^#•:$ N!9$V#^#zo#!$N#Fz B{ K#q#p OGyOʹ#2E"!"͕!yoĥ#xg2""=è#>  gf! ͕!$:%w5q#p*N$q!"c*$"$!$N#F͵ ##$#! þ# #͒ *+>??2  #  ͒ #͒ ͦ !~AؒG#0__~ؒ ЃO#$!#͕!!!~ y x! q;!#!2  !+k!:f! .m!Ϳ : #Õ!*c\q!lq!#f+͋ ԯ ! !͋ ԯ !"c>ͥH""͏ ԙ Ԁ ͏ ;̋ !2"!̀ ͨ"">ͱ#M͸#!NN #pD"7"7 !$ <2E">D"7"!%~=4"2%̀ +% e#5+w]#ͨ">Ͳ#ͻ#2"͚">2"͕x@ͱ# ">1ͱ#0ñ#2">!+$"͚"#ͻ#""!|2#>w">W2V>"}#*c !!Ϳ o# k#7  #c#y<=]#K#K#<##$#0 e#$#<͍"r# ̈́"͏ !Ϳ jͱ##x#*$*$|>U>͍""à#e !!! !! _! ! !!!!!!!+++ $Bad $ !? $ EZCPR #1.09 84-06-26 $A0:$$$.SUBCMDRUN COM  @$$ UI 84-06-26 $A0:$$$.SUBCMDRUN COM  @$$#2<2U!>2!*7${K9$!Ïc-G%*:!z%}2!$:U!چ%|2U!:U%!G!(!( !9I#T+B|ʻ%&!9IB!/͙!9IB!-͙f!9IB!?͙f|&!9I#T!!9I͢%|:&!9I͢%!(a !!9I#T+B|[&!Ã&!9I!(a !9I!(a f!(s !(!(!(E ͔%͜&|ʸ&͜>&|&&&ͨ h%ͻ!( !)s ͭ !>)s ͨ !u)s ͨ !)s ͭ !)s ͨ !*s ͭ !S*s ͭ !*s ͭ !*s ͭ !+s ͭ !9+s ͭ !t+s > $0123456789ABCDEF0xProgram , -levelENVCHEK: Incompatible environment assumptions.-point pedigree:WIZCHEK: You can't do that here.passwordHazardous area -- Let's have a password:LOKCHEK: Nothing ventured, nothing lost, aye?LOKCHEK: If at first you don't succeed, punt?User Command InterfaceCP-MIG edition by Dennis E. Hamilton# ON UP .EZCPR#1.09 84-06-26UNABLE TO ESTABLISH NEW CCP HERE.a>EZCPR -# presents the EZCPR pedigree in order to check on the version installed by this program.a>EZCPR -? and unrecognizable options evoke this summary.a>EZCPR ON installs a copy of the EZCPR command interface in place of any existing CCP. If there is already a resident CCP when EZCPR ON occurs,the current CCP is over-written by the new one. If thereis no CCP, EZCPR creates one just below the TPA ceiling. The new CCP is removed by the next CP/M restart unless aguarding RSX is kept BELOW it until removal is wanted. WIZ privileges are normally required for EZCPR ON, withpasswords and other options as installed by GENINS.ardous area -- Let's have a password:LOKCHEK: Nothing ventured, nothing lost, aye?LOKCHEK: If at first you don't succeed, punt?User Command InterfaceCP-MIG edition by Dennis E. Hamilton# ON UP .EZCPR#1.09 84-06-26UNABLE TO ESTABLISH NEW CCP HER EZCPR Installation Guide PROGRAMS NEEDED FOR EZCPR OPERATION MSW Utilities Used with EZCPR Replacements for Built-In CP/M Commands Use of ZCPR2 Utilities with EZCPR BASIC EZCPR INSTALLATION Configuration Check EZCPR Initiation GUARD Protection WIZ Control of Privileged Operations STANDARD OPERATING PRACTICES Using the CMDRUN Feature EZCPR Configuration Options Error Recovery SUBMIT Procedures :EZINST 1.00 EZCPR INSTALLATION GUIDE dh: 84-06-28 ======================== This guide provides technical information for installers of EZCPR, a replacement for the standard CP/M* Console Command Processor (CCP). EZINST.HLP explains the first-time installation of EZCPR and also provides reference material of use during trouble-shooting, re-installation, and election of custom configuration options. EZINST.HLP 1.00 is based on specific details of EZCPR #1.09. Although the general concepts will apply for other versions, variations in detail should be expected. Copyright 1984, Dennis E. Hamilton This guide may be freely reproduced for private use so long as all notices of authorship and copyright are preserved. All other rights are reserved. Send enquiries to The MSW Company, P.O. Box 229, Penfield NY 14526-0229. * CP/M is a trademark of Digital Research, Inc. : PROGRAMS NEEDED FOR BASIC EZCPR OPERATION ========================================= EZCPR will usually operate by itself, "right out of the box." This can be used for trial demonstration and limited exploration, but is insufficient for permanent installation and heavy usage. To make a complete basic installation of EZCPR, the following programs should be obtained and used: * MSW utilities EZCPR.COM (the "installer" of EZCPR), SYSTEM.COM, GUARD.COM, and WIZ.COM. * Favorite utilities to be operated in place of the no-longer built-in operations DIR, TYPE, REN, and ERA. (SAVE is the only built-in CP/M operation retained in EZCPR. USER is accomplished another way.) * ZCPR2-specific utilities configured for non-ZCPR2 operation in order to also be used under EZCPR. * Versions of utilities and applications that can operate in the pres- ence of User-Interface Guardian protection. (Some programs which add appendages to the CP/M BDOS are hostile to presence of other ones.) : MSW UTILITIES USED WITH EZCPR ----------------------------- For complete, basic operation of EZCPR, the following programs are required: SYSTEM.COM #2.14 or later: EZCPR #1.09 is implemented to the same level of automatic configuration as SYSTEM #2.15. GUARD.COM #1.04 or later: Earlier versions of GUARD.COM will not operate in the presence of EZCPR. WIZ.COM #1.03 or later: Earlier versions of WIZ.COM have the same problems as early GUARD.COM versions. EZCPR.COM #1.09 or later: This is the program used to "turn on" EZCPR as the system User-Interface Command Processor. Generally, MSW utility versions dated since 84-06-21 are always preferable under EZCPR. To verify the version of any MSW-convention program, use the command form a>program -# OR a>program -? : REPLACEMENTS FOR BUILT-IN CP/M COMMANDS --------------------------------------- The standard CP/M CCP implements a small number of services directly in the command processor. EZCPR preserves only SAVE, the one operation that cannot be easily obtained with a CP/M transient ".COMmand" program. The following operations have no built-in counterpart with EZCPR: * DIR for showing the presence of files in a particular directory * TYPE for presenting the content of text files on the CP/M CON: * ERA for removing files from a disk directory * REN for changing the name of a disk file If you require any of these operations while your CP/M system is under EZCPR control, you will need programs that provide such functions in the form that you prefer. Depending on requirements for operational security, you can also omit or protect selected operations, such as ERA and REN, which can be dangerous when used incorrectly. (EZCPR's SAVE operation is disabled using WIZ.) [next: How to install new "built-ins".] Installing Built-In Operation Replacements ------------------------------------------ The easiest way to install counterparts to built-in operations is to copy substitute .COM programs onto disk A under user 0 (disk A0: in EZCPR/ZCPR2 parlance). Disk A0: is "home base" for EZCPR operations -- the basic version will always look in A0: for programs that can't be found elsewhere. This means that you only need one mounted copy of each opera- tion program, since it can be found on A0: when not present on the disk which is currently "logged-in," whether D0: or P15:. In the past, introduction of custom counterparts to built-in opera- tions required use of different names (such as XDIR, TYPEL, RENAME, and ERZ). You now have the option to use the original built-in names for the substitutions, making your system easier to use by operators accustomed to the basic CP/M facilities. Of course, you can still substitute versions that show off your computer's capabilities, too. As you become more accustomed to the configuration capabilities of EZCPR, you can experiment with making different built-ins available to different operators, or as part of different applications, with or without added security checks. [next: Typical Built-In Selections] Typical Built-In Operation Substitutions ---------------------------------------- On the first system to use EZCPR, Orcan Conclave RCP/M #0, the following substitutions are installed on A0: for local operation: * DIR.COM is SD #2.4 as configured by John Stetson for use of the Heathkit H19 terminal's VT52-compatible display features. * TYPE.COM is TYPEL #2.3, a program developed by Sigi Kluger and designed to directly display text files, SQueezed files, and either kind of file from within a .LBR file collection. * ERA and REN are omitted. Instead, two utilities are used in their place: Richard Conn's VFILER and Durant Software's SimpliFile, both configured for H19. (Simplifile is used to maintain a descriptive catalog on the disk.) Other popular substitutions include SWEEP, DISK7, and the ZCPR2 "extended" commands for ERASE and RENAME. There is ample variety in both public-domain and proprietary form. Many substitutes use advanced equipment features to great advantage, also. And built-in operations of packages like WordStar and MDM7 still operate. : USE OF ZCPR2 UTILITIES WITH EZCPR --------------------------------- Being based on the highly-popular ZCPR2 System of Richard Conn, EZCPR supports similar concepts and facilities. But EZCPR does not require any modifications to the underlying CP/M system: You don't have to install EZCPR, you can simply turn it on. In addition, EZCPR operates on most CP/M 2.2 systems, whether equipped with 8080A, Z80, 8085, or Z800 processors. EZCPR is also designed to provide consistent operation under CP/M 1.4, CP/M 3.0 (CP/M+), and some configurations of MP/M and CP/M-86 as well. To achieve this flexibility, ZCPR2 installation practices are aban- doned. ZCPR2 features are supported, BUT NOT THE SAME WAY. In particular, * The multiple-command buffer (of 128+ bytes) is internal to EZCPR. * EZCPR keeps an internal WIZ flag in preference to external WHEEL byte. * An 8-entry disk-search path is carried internal to EZCPR itself. * A 16-entry directory-name table is also kept resident in EZCPR. * Input-Output redirection is a special case of MSW RSX Portal usage. [next: Impact on ZCPR2 Utilities] Impact on ZCPR2 Utilities ------------------------- Certain features of the ZCPR2 System are supported by setup of dedi- cated data areas at locations where their content is preserved from one application to the next, from one CP/M restart (warm boot) to the next. It is allocation and initialization of these areas that requires special CP/M modifications for full ZCPR2 operation on most systems. If you have ZCPR2 fully installed on your system, your ZCPR2 utilities will already be configured to locate the custom data areas. BUT EZCPR WILL NEITHER NOTICE NOR USE THEM. And, although EZCPR has equivalent system data areas within its own storage locations, ZCPR2 UTILITIES CANNOT LOCATE OR USE THEM. [WARNING: Do NOT attempt to locate the equivalent areas within a loaded copy of EZCPR and install the addresses of those locations in your ZCPR2 utilities. There are format incompatibilities, and the locations tend to move around within EZCPR. In addition, EZCPR does not have to load in the same place every time it is initiated.] [next: Making ZCPR2 Utilities Work] Making ZCPR2 Utilities Work --------------------------- The smoothest way to operate ZCPR2 utilities in an EZCPR regime, WHETHER OR NOT ZCPR2 IS ALSO INSTALLED, is by eliminating those configuration options which depend on the use of ZCPR2-external data. Using the ZCPR2 GENINS program, review the features of the desired utility and make sure that the following features are not used or are disabled in the utility: * EXTERNAL SEARCH PATH: Set not available (set internal path instead) * EXTERNAL COMMAND BUFFER: Set not available (address of 0000H) * DEFAULT CHARACTER: "$" should always be used in path lists * RESIDENT DIRECTORY-NAME TABLE: Set address to 0000H and try to keep ZCPR2 use under 16 entries for future EZCPR compatibility. * Any other feature (such as WHEEL byte address) which requires a fixed address in the system. Also check whether a Z80 is required. As a compromise, you can implement some of these dedicated locations for sharing between ZCPR2 utilities, but without EZCPR participation. [next: Bridging the Gap from EZCPR to ZCPR2] Bridging the Gap from EZCPR to ZCPR2 ------------------------------------ As can be seen, not all ZCPR2 options are supported the same way by EZCPR, so those who have already installed ZCPR2 may prefer to use EZCPR just for special occasions. New users are encouraged to install EZCPR first as a way of quickly gaining experience with the basic procedures, switching to ZCPR2 (or ZCPR3) only after deciding on those configuration details which make the labors of permanent installation worthwhile. EZCPR can still be used after ZCPR2 is installed, providing additional operating flexibility when needed. In addition, the autoconfiguration capabilities of SYSTEM, GUARD, WIZ, and other MSW-convention utilities can be adopted in upgrades to ZCPR2 utilities. Such all-purpose utilities first check for the presence of EZCPR and use those facilities in that case. If it is confirmed that ZCPR2 is operating instead, then ZCPR2 parameters are honored. With care, it is possible to develop utilities which operate indifferently under both ZCPR2 and EZCPR, automatically adjusting without any operational discontinuity whatsoever. [See the EZCPR technical guide for more information on inter- faces and techniques available to utilities.] : BASIC EZCPR INSTALLATION ======================== If you simply place EZCPR.COM on a disk and perform the operation a>EZCPR UP EZCPR will attempt to load itself and operate in place of the CCP, if any, that is already active. An EZCPR initiated in this way, if able to load, will persist in the system until the next CP/M Restart (Warm Boot). At that time, standard CCP (or ZCPR1 or ZCPR2) operation is restored as part of the reloading/cleanup of CP/M. But the full capability of EZCPR and allied MSW-convention utilities is not tapped until EZCPR is "locked in" the system by use of GUARD. Following GUARD protection of EZCPR (and any other dynamic CP/M extensions that are used), special privileges can be turned off and on using WIZ. Although independent of EZCPR, the MSW SYSTEM utility is indispensable for reviewing your current CP/M configuration. EZCPR and other utilities will see your configuration exactly the same way that SYSTEM does. Use SYSTEM for a report of how your configuration is arranged at the moment. : SYSTEM CONFIGURATION CHECK -------------------------- To operate SYSTEM #2.15 (also distributed under the name SYS215), place it on your system disk, rename it as necessary and try the simple operation a>SYSTEM -? The utility should identify itself and provide a short summary of its usage options. If, instead, you encounter a CCBROKE error message, it is possible that the program is damaged. Obtain a replacement for the program and try again. If you encounter a CCMEMRY failure, CCBROKE persists when the program works fine on other computers, or SYSTEM obviously misbehaves in other ways, DO NOT ATTEMPT TO OPERATE EZCPR. SYSTEM is the advance scout for MSW-convention utilities. It does not interfere in any way with normal system operation. In addition, SYSTEM is designed to balk rather than proceed in uncertain or dangerous settings. [next: A Good SYSTEM Report] A Good SYSTEM Report -------------------- If SYSTEM -? operates without difficulty, it is safe to try normal operation of the program. Operate SYSTEM without any command options: A>system SYSTEM> Heath/Zenith H89/Z90 Computer Configuration Z80 Processor CP/M 2.2.03 Operating System S/N 196-3-0-34029 E600 BIOS .03 base location D800 BDOS 2.2 base location D000 CCP base location Single-Segment Memory Model D000 current TPA ceiling CFF8 Stack Point 1DFC Heap Point 0100 TPA base location 52992-byte TPA capacity 45564-byte free zone [next: What to Look for from SYSTEM] What to Look for from SYSTEM ---------------------------- The amount of detail that SYSTEM reports varies for each CP/M instal- lation. It is unimportant whether SYSTEM can describe every detail of your configuration. IT IS IMPORTANT THAT SYSTEM REPORT THE TRUTH, whether or not all of the truth. That is, nothing in the SYSTEM report should contradict sure knowledge that you have about your computer system. For purposes of EZCPR operation, the most important information is about the available Console Command Processor: . . . D800 BDOS 2.2 base location  ===> D000 CCP base location Single-Segment Memory Model . . . If SYSTEM reports a base location for CCP (ZCPR1, ZCPR2, or EZCPR), EZCPR.COM will use that same location for loading of a fresh copy of EZCPR. (If CCP is non-resident instead, as with CP/M 3.0, EZCPR loads just below the TPA ceiling.) [next: When EZCPR Can't Load] When EZCPR Can't Load --------------------- Whenever SYSTEM reports "CCP Not Located", the presumption is that there is probably a CCP present in the system, but it can't be found by the techniques incorporated in SYSTEM.COM. There are usually two possibilities: * The SYSTEM program was itself not called from the command level, so it is unable to satisfactorily locate the CCP in charge of operation. This can happen, for example, if you were to un SYSTEM from  WordStar or any other package that retains control of the system while operating external programs and overlays. (Reaching SYSTEM by chaining or from a SUBMIT file is all right, since the CCP is respon- sible for actual loading and operation of the program in those cases.) * Because of a non-standard appendage to CP/M, whether BYE, DDT, or other special-purpose attachment, SYSTEM is unable to locate the true BDOS base location. This has interfered with SYSTEM's attempt to confirm the presence of a CCP in front of BDOS or any BDOS RSX. In the absence of positively-confirmed CCP status, EZCPR won't load. : EZCPR INITIATION ---------------- When a CCP is positively confirmed to be either present or non- resident, according to SYSTEM, EZCPR.COM can load a new EZCPR copy. Use an EZCPR UP command: A>ezcpr up EZCPR> #1.09 84-06-26 User Command Interface CP-MIG edition by Dennis E. Hamilton D000 = active CCP to be replaced by the new one. 2048 bytes needed, with 2048 allowed. D000-D7FF RELOCATED CODE BLOCK D65E-D7FD data segment D11E-D65B instruction segment D002-D11B data segment EZCPR #1.09 84-06-26 A0> [next: The EZCPR Signature] The EZCPR Signature ------------------- You can always tell that EZCPR or ZCPR is present by appearance of user numbers in the CP/M command-input prompt. ("A0>" is EZCPR's home-base prompt for operator input. Form "A0<" is used when showing command lines taken from an active SUBMIT file.) In addition, every EZCPR version identifies itself when asked for version information via built-in command "#": A0># EZCPR #1.09 84-06-26 A0>B3: __ You don't have to stay on A0, of course. B3>15: __move up to user 15; # __ Who'd you say you were? EZCPR #1.09 84-06-26 B15> [more ...] And it is always a good idea to confirm presence of EZCPR with SYSTEM: B15>system SYSTEM> Heath/Zenith H89/Z90 Computer Configuration Z80 Processor CP/M 2.2.03 Operating System S/N 196-3-0-34029 E600 BIOS .03 base location D800 BDOS 2.2 base location ====> D000 EZCPR base location Single-Segment Memory Model D000 Current TPA ceiling CFF8 Stack Point 1DFC Heap Point 0100 TPA base location 52992-byte TPA capacity 45564-byte free zone B15> [NOTE: With CP/M 1.4 you are confined to operation under user number 0, but all other features of EZCPR are fully available.] : GUARD PROTECTION OF EZCPR ------------------------- When any CCP, including EZCPR, is riding at the Current TPA ceiling, it is vulnerable to over-writing by applications and to reloading from disk on the next CP/M restart (either warm or cold boot). For example, under unmodified CP/M 2.2: B15>^C B> and CP/M's attention is still at user level 15, although it is not so indicated. B>user 0 B>a: A>ezcpr up will restore a fresh copy of EZCPR in this case. The MSW-convention program GUARD is designed specifically to provide a barrier above which the CCP is protected from erasure and reloading. [more] A0>guard up GUARD> #1.04 84-06-23 USER-ENVIRONMENT PROTECTION CP-MIG edition by Dennis E. Hamilton  User Interface is via EZCPR at D000. There is no protection. PREPARING ENVIRONMENT PROTECTOR: D000 = active CCP to be kept above the RSX. CFF4 = SP preserved to insure a way out. 226 bytes are needed for the RSX itself. CF12-CFF3 RELOCATED CODE BLOCK CFDD-CFF1 data segment CF3B-CFDA instruction segment CF20-CF38 data segment CF14-CF1D instruction segment D806 = the new second RSX. CF18 = the new first RSX. [more ...] The accomplishment of GUARD is easily confirmed with SYSTEM. The significant results involve configuration of memory and the resulting size of TPA: A0>system SYSTEM> . . . D800 BDOS 2.2 base location D000 EZCPR base location ===> CF18 Guardian RSX entry  ===> Environment protected via CF18 Single-Segment Memory Model CF18 current TPA ceiling . . . ===> 52760-byte TPA capacity 45332-byte free zone The presence of environment protectors is so significant for operation that SYSTEM singles out the location of the particular protector. The most significant result is that CP/M restart no longer involves reloading of the CCP. Continuity of EZCPR operation is secured. [more ...] With a Guardian overseeing the retention of EZCPR, A0>^C A0> will reset the system, but CP/M is not reloaded. (Side benefit: When GUARD is UP, the disk in drive A must have a valid directory, but it does not need a copy of the CP/M system. You can limit the contents of drive A to just those programs needed for your application.) Guardian RSX provide other information as part of their operation: A0>guard check GUARD> #1.04 84-06-23 USER-ENVIRONMENT PROTECTION CP-MIG edition by Dennis E. Hamilton User Interface is via EZCPR at D000. Protection is via Guardian RSX at CF18. 1 restart has occured since guard raised. 504 BDOS service requests. A0: is the interface's base directory. : WIZ CONTROL OF PRIVILEGED OPERATIONS ------------------------------------ Even though EZCPR is up, and under GUARD protection, it is possible to replace the current copy by performing another EZCPR UP operation. In addition, GUARD protection is dropped simply by using the GUARD DROP option. (This is what you do, short of rebooting, in order to restart CP/M completely.) In order to insure the system against accidental removal of protec- tion, the WIZ utility can be used to remove authorization of all operations that can change your operating-software configuration: A0>wiz out WIZ> Modified #1.03 84-06-23 WIZARD STATUS CP-MIG edition by Dennis E. Hamilton ** The WIZ is OUT ** A0> __ WIZ shows as a "Modified" version because a password A0> __ has been added by GENINS for WIZ IN authentification. [more ...] Once WIZ is OUT, all programs that require WIZ privileges in order to perform major configuration adjustments will refuse to comply: A0>guard drop GUARD> #1.04 84-06-23 USER-ENVIRONMENT PROTECTION CP-MIG edition by Dennis E. Hamilton +++ WIZCHEK: WIZ authority needed to try that. +++ CCABEND: Attempting System Restart. A0> Similarly, EZCPR will not replace an operating EZCPR when WIZ is OUT: A0>ezcpr up  EZCPR> #1.09 84-06-26 User Command Interface CP-MIG edition by Dennis E. Hamilton +++ WIZCHEK: You can't do that here. +++ CCABEND: Attempting System Restart. A0> b1: [more ...] There is an intimate connection between EZCPR and the privilege authorization capabilities of the WIZ utility. (In fact, there is a rudi- mentary, build-in WIZ operation that EZCPR uses to notice when WIZ is being requested. If the program is not found, EZCPR sets WIZ OUT on its own.) EZCPR monitors WIZ status so the one remaining built-in operation, SAVE, can be controlled. When WIZ is OUT, EZCPR will FORGET that SAVE is built-in, treating SAVE commands just like any other program request: B1>save 0 c3: __ trying to create an empty blank-name file on C3: +++ SAVE !? A0> illustrating the response of EZCPR to an unrecognizable command (no program found). With WIZ IN, the SAVE request would be handled the same as for CP/M 2.2, except that a destination user can be specified along with a destination drive. (And if the SAVE were successful, EZCPR attention would remain in B1: instead of dropping back to A0: in response to the error condition.) : STANDARD OPERATING PRACTICES ============================ When operated without modification, EZCPR automatically sets up with the following arrangement: * Maximum Drive Specifiable: "D" under CP/M 1.4, "P" in all other cases * Maximum User Specifiable: 0 under CP/M 1.4, 31 in all other cases (User numbers above 15 may not be used for the default base however.) * WIZ authority is required for EZCPR UP, but no password is needed. * Initial disk search path: $$ -> A0 (any specified or default base is searched first, then A0: is checked if the program is still not found.) * Initial (latent) command line: "#" * Initial directory-name table: no entries * Initial WIZ status: IN : USING THE CMDRUN FEATURE ------------------------ When searching for the program to be executed, each location on the active search path is examined for a program of the specified name. For example, with search path $$ -> A0 and command B7>D:HELP A31:EZCPR EZCPR first attempts to use D7:HELP.COM. If examination of D7: is unsuccessful, the next check will be for A0:HELP.COM. When that fails, the request is aborted and EZCPR bails-out to A0: B7>D:HELP A31:EZCPR +++ D:HELP !? A0> That description is literally true when there is no program CMDRUN.COM anywhere on the search path. When there is a CMDRUN.COM program anywhere along the path, THAT PROGRAM PREVENTS CONTINUATION OF SEARCH PAST THAT POINT. The CMDRUN.COM program will be executed instead. [more ...] The actual rule for CMDRUN usage is to the effect that EZCPR makes two command-program searches at the same time, one for B7>D:HELP A31:EZCPR and also B7>D:CMDRUN D:HELP A31:EZCPR The request that is satisfied first will be used, and command search fails only if neither program is found. (Ties are always won by the non- CMDRUN original form.) This rule is quite different than the ones available under ZCPR2. However, you can get equivalent operation by only placing CMDRUN programs at the ends of your search paths, not at any mid- or starting-point disks. This EZCPR CMDRUN rule supports placement of barriers to program "visibility" along the search path. Having ONLY a CMDRUN at A0 can also be used to force expanded error recovery following a bail-out. Typically, programs such as MBASIC, SUBMIT, HELP, and .LBR LRUNZ are installed as CMDRUN processors. (EZCPR also makes it possible for such a program to determine what it was named and the disk it was found on.) : EZCPR CONFIGURATION OPTIONS --------------------------- The program EZCPR.COM can have its basic configuration options changed by using the ZCPR2 GENINS program. Of those options which are available for selection in accordance with the GENINS structure, only the following have any effect: * Internal Path Data, if provided, will be used to set the initial path in EZCPR * Max Disk and Max User values can be used to restrict the explicit specification of disk locations in command-line file references * The Privileged User Password can be used to require a password, IN ADDITION TO WIZ authority, before EZCPR UP will operate. * Any non-null WHEEL Byte Location will be consulted to determine if WIZ is IN when EZCPR is not already operating. This lets WHEEL be used to prevent unauthorized replacement of ZCPR2 by EZCPR. [next: Internal Path Processing] Internal Path Processing ------------------------ If no Internal Path is specified in the GENINS parameters, the default path of $$ -> A0 will be used. If an Internal Path is present, it will be incorporated in the EZCPR Disk Search Path whenever EZCPR is loaded from this copy of the program. Even though there are other restrictions placed on the drive letters and user numbers which can be used, those restrictions DO NOT APPLY TO THE INTERNAL SEARCH PATH. That is, the search path can lead to directories that operators are not allowed to specify directly. The above special capability, along with the CMDRUN rule, can be used to obtain quite flexible location of programs on behalf of particular applications. In addition, the EZCPR search procedure works the same whether or not a disk directory is explicitly named in the command or not. The base directory (used as $$) is either the one specified or, if none is given, is the directory currently logged as the CP/M default. Resolution of disk search-path locations proceeds from that point. [next: Limiting the Available Disks] Limiting Available Disks ------------------------ Every time that EZCPR is initiated, it sets its internal limitations on Max Disk and Max User based on the version of CP/M that is running. (Recall that CP/M 1.4 systems are restricted to disks A-D and user 0.) You can further restrict the explicit specification of disks by providing even smaller values in the GENINS Max Disk and Max User values. The only reason to lower the Max User value is to provide secure directories that can only be reached by search path and special programs. It can also be valuable to lower the Max Disk value to include only those logical drives actually present on your system. This will help prevent BDOS Select Error reports and can be especially helpful when operating an RCP/M system. Note that the limitation on Max Disk and Max User does not apply to search paths and it is possible for a program to log EZCPR onto a directory that can't be specifically named in a command line! The Max values apply to the conversion of ALL file references parsed by EZCPR, though. : ERROR RECOVERY -------------- EZCPR is designed to support automatic and unattended operation of CP/M systems. It is important, in such settings, to have failures always take the system into a predictable state so that recovery measures can operate in a reliable way. For EZCPR, any failure which requires conclusion that assumptions about the state of the system no longer hold will also cause SYSTEM BAIL OUT. Bail out consists of the following steps: * The disk system is reset. * If there is an A0:$$$.SUB file, it is erased. * Any commands stacked in the multiple-command buffer are discarded. * The base default disk is set to A0, and operation continues from A0>. [next: Errors Which Force Bail Out] Errors Which Force Bail Out --------------------------- EZCPR keeps track of when it is running and when it is idle. EZCPR is idle only when * EZCPR has just been loaded and not done anything yet * EZCPR is waiting for input from the operator CON: interface * A transient program has been successfully loaded and control transferred to it. EZCPR remains idle until the transient requests bail out or EZCPR regains control through CP/M reset or application- program return. In all other cases, EZCPR is considered to be running. When EZCPR is running, bail out is provoked by * Any disk error in the attempted processing of an active SUBMIT file. * Any error in the form of file-reference expressions actually used by EZCPR. (References passed to applications are not taken so seriously.) * Any CP/M restart of an already-running EZCPR (e.g., disk error) * Failure to find and successfully load the requested program * Failure to successfully record a file during authorized SAVE operation * Any input at CON: noticed before starting the current command : SUBMIT PROCEDURES ----------------- EZCPR has special rules that apply to the design and operation of SUBMIT procedures: * Any time that EZCPR performs a disk reset and an A0:$$$.SUB file is present, that file immediately becomes the source of further command lines. (It must be in standard SUBMIT output format.) * Until A0:$$$.SUB is consumed, or there is an intervening bailout, additional command lines are always taken from the .SUB file, REGARDLESS OF WHERE THE DEFAULT LOGGED DISK MIGHT BE. That is, A0 is used for active submit commands even when the base disk is not A0: * When no A0:$$$.SUB is active, EZCPR will not notice the creation of a new one until the next disk reset. (This is usually taken care of by the SUBMIT processor's exit via CP/M reset request.) * Remember that command lines in SUBMIT procedures may not exceed 125 characters, and there may not be more than 128 lines in a $$$.SUB. : : : EZINST.HLP 1.00 created by Dennis E. Hamilton on 1984 June 28. important, in such ation of SUBMIT procedures: * Any time that EZCPR performs a disk reset and an A0:$$$.SUB file is present, that file immediately becomes the source of further command lines. (It must be in standard SUBMIT output format.) Ä$$ password$@NAMES DIRZCPR2 w_#~ ʸ A:4ɀ MSW:CP-MIG ?ʻ w# !GUARD#1.04 84-06-23!*T]:6:6PYZ2PFX8.CC #1.03 84-05-13'SC80.CC #5.15 84-05-13~o}g^#V}s#r!}o|g}o|g}o|g{z{z{z{̅!-{̅!,z>{z?!-z>{zñ>{>_||g}oɯo_)&) {BKW_GyO-)"BK>){_zWU{zUW#{_==||u|u6u+|/g}/o{ozgN N#~# A~# yOďy™# ʮ#ʸɯ#+#Ⱦ N #NGͲ7~# A! G~p# %SCPM.CC #5.06 84-03-27*!! !! !!! ! !!!!!͂Z} +++ $wCCABEND: Attempting System Restart.$͂Z͐ASCENV0.CC #1.17 84-06-22* !*!9*.!!9"##*}$o{{ڍ<2"*{ {*\{>0{z͸CCBROKE: Program or system is damaged.$1͸CCMEMRY: Not enough memory to work in.$!͍!{`i+6+r+s!*~# xJ S_z$Wz4Ns#Fr#xˆ**}o#{ DM!$!cg!Rc!ol͓"!!n&!\!l!^#V#N#F+++yx*y^#V#½#x¼ͫ¼u!99ҍ>!27!t9::ÍRSXDEF.CC #1.00 84-05-13"STRLIB.CL #2.08 84-04-10s#w#ww###n&n&##n&#^Wng#ʉ5^W#^wyO~#^+#4#q#r> ͘y ³͘##ů+5ů^WBKͼ!-##!-!9I!ͥ|]!9I!-͑!9!9IuT!9I!ͥ|ʯ!9I!9I! [u%!9I! [u% !9I! ͥ|!9I!9I!0͑ !9I!9I! [%!9I! [!0͑!9!T!9IB| !9IB!0͸!9IB!9ͷt|ʟ !9!9!9IT! !0}! 9IBT!9I!9Iͥ| !u!9I#T+, !9I  LOGLIB.CL #2.09 84-04-09:$!͘$͇ T]6${6"S *S #}*S +"S b U } $! i! i!lU Â# þ! ͈| #, l , b Xl - , ] }Modified $!, !9IB| !.i!9I( !g#Z  OUTNUM.CL #1.03 84-04-08!9I!9IB!t!9I!t!k#7 i!9I!T !9IT !9I!t!9I͎| !9I!u͔ !9Is !u!t| ( !9I!ͥ| !-i!9!9IuT( !+i!|#( !9I͔  {V 6D !0$"` }0$!9I!ͥ|ʒ !-i!9!9IuT!9I=   OUTBIG.CL #1.00 84-04-23^#V#N#FxD `i 8>= V ɟ  SNAP1.CL #1.01 84-04-16 with SNAP ON͔ b Z c ,  k PDGREE.CL #1.04 84-04-08ͱ>.ʈ # ¢ Í ^#V!6 6!þ*ͼ͂ !9b !9!H?!#;!Q9Iͼ !#;!Q9I P( l !O9I͐c !#( !M9!9b !9!H?! ͑!O9I͒ P( !K9͌͐|!#͎ ͌ b l ͌ͯ = !#( ! b i  ENVLIB.CL #1.07 84-06-22!ͺ>!L_G_@#+ Z/ +!ͺD{"!#:@o\!&DM>þ7#^#V^#VÈ!͏ʮ}U oj+++͑ñ*+++*!9*!9*|}D g$ RSXENV.CL #1.08 84-05-136!͏} ,+++͑;7"  ~< ^#Vo!͗ͅ/ ##^#V N#F!^#V͈# n`CCPENV.CL #1.09 84-06-23:! 9*͂""*}"o"!**!9"!"COMB!# >þ I~##_^#V{҂#R!I+|g{`k{*{Z!͏*~#fo{Ґʿ} +++͑!ͺ:¸*"">2+r+s">2*~#Þ|$Z!-|*{!ͅg/ ~<ʝ ^#V͂ ^#V͂UNLOCK.CL #1.03 84-04-28ͼÞ!9I+T#|e!9!FTD|6!9I+T#|3!9S!tT|0!9Ib!9I+T#|bJ|_P!t6!!i! i!i!T{ڴ\ !n&!9!9!xT!9!<?!|.!9!G9IT|!9I+T#!͙|-!u!C9!9Iͤ!͙|ʘD|QTk!*i!9!9I͑!9W!9`͙|ʕ!!C9!9!9IͤT!͙|k!9~!9I!͙|!9W|k!9~!9I!͙|.+!u!C9!9P!9W!ͤt!C9ɤ\CLKENV.CL #1.00 84-04-12:`ž*p> ZWHEEL.CL #1.01 84-06-23:`ž*p-!͙|j!~ Þ!9ͪT|!9IB!!9ͪT|!!9I!9I}-!͙|Kj N#F!9ͶT!!9IɌmLOKCHK.CL #1.02 84-06-22y|ʬ!9! yT!9! !(T!9!T!9I+T#| b !# !9!9IͿT| ] !9I!9M!͎T!M!9I͎|Q!#͎ !#|aá!#( !9͊T!ͥ|ʡ!9I|ʙ!&$͎ á!T$͎ !9IkRELMV.CC #1.02 84-04-17 SNAP version^#V{#^#V{#^#V^#V`ir+s{!8N N!   ͫ2@^#V+}^DM͞}DM^#V+ !9DM8+ +  ͦ+ #Z -͕Z RELOCATED CODE BLOCK͕Z data segment͕Z instruction segmentLODRSX.CL #1.04 84-04-28 SNAP version-}|Ľ>J=}}4>.2m^7$!9}.+ e!͏ s#r*i ̓" #s#r#6#6+ +  Z ʹ = active CCP to be kept above the RSX.ʹ = SP preserved to insure a way out.ʹ = active loader in control of RSX.+ : D Z bytes are needed for the RSX itself.ʹ = the new second RSX.ʹ = the new first RSX.DRPRSX.CL #1.00 84-04-20 ͏ ͏^#VÏ!$!$͖ !9I#T+B|a!9IB!/͙!9IB!-͙f!9IB!?͙f|a!9I#T!!9I|ʍ!9I!$!!9I#T+B|ʪ!9I!$!9I!$f!9I!$f!9I!$f!9I!$f!9I!$f|5!!9I!$!9I!$f|h!!9I!$!9I!%f!9I!%f!9I!%f!9I!%f!9I!%f!!!%( !#%!)%!/% ͜e| ͑͜"*|3< ] !"*!"/**!ͥ|!9M!͎T!M!9I͎|ʕ!9%͎ !d%|ʥ!m%( ͊!ͥ|!%͎ !9Iu |!%( #!%( ͔ !%( b u **| !%( **͔ ] u **F#= !&( **F#!͙|b!&( j!&( !#&( b u !**S#"*7 |ʯ**!)!T!@&( ÷**; !M&( b u **\#!!Ai**\#!t= !e&( Q |. =|# !&( =͔ + !&( Q =|I !&( =͔ Q !&( ] **!ͤ|j **!ͥ|ʰ **|ʪ **(#|ʢ **3#!'( ê !'( ] =| !L'( | !m'( b ͂!&!'( ] !'( b !(( ] !0(( b !l(( ] !(( b !(( ] ! )( b !_)( b !)( b !)( b !*( b !M*( b !*( b !*( "!"R""G""!"f"!!͏!!"͏%""!!ɡ""!( b !!!*"#"":"O:"O*R"""!91""!"!Z"> 8"<9"B"{2"_B"{2"*"{zX"!R"{z!"4#]"f"y"!!>2b"G~p# |"!MSW:Guardian"͂!   Ͳ  Ͳ"*Inactive Non-Resident CCPZCPR1ZCPR2EZCPR*^#V{ " &-#!", *Ù û ^#V M#> $0123456789ABCDEF0xProgram , -levelENVCHEK: Incompatible environment assumptions.-point pedigree:WIZCHEK: You can't do that here.passwordHazardous area -- Let's have a password:LOKCHEK: Nothing ventured, nothing lost, aye?LOKCHEK: If at first you don't succeed, punt?USER-ENVIRONMENT PROTECTIONCP-MIG edition by Dennis E. Hamilton# UP ON CREATE IN RAISE ESTABLIS CHECK STATUS DOWN OFF DESTROY REMOVE OUT DROP .GUARD#1.04 84-06-23WIZCHEK: WIZ authority needed to try that.passwordEnter the Guardian password:LOKCHEK: Guardian control denied.User Interface is via at No resident User-Interface locatedProtection is via Guardian RSX at restart hass have occured since guard raised.A great many BDOS service requests.: is the interface's base directoryProtection is by other guardian at There is no protectionProtection is by the loader at There is nothing to protectThe Guardian has been dropped.Guardian can't drop -- not the youngest RSX.Protection is already in effect.PREPARING ENVIRONMENT PROTECTOR:Cannot establish a Guardian under these conditions.a>GUARD UP initiate Guardian protection over the currenta>GUARD ON environment and user interface.a>GUARD DOWN drop Guardian protection, allowing any usera>GUARD OFF interface (CCP) to be removed or replaced.a>GUARD CHECK report on any Guardian currently serving asa>GUARD STATUS protector of the user interface environment. When GUARD is UP, a special Guardian RSX is used to suppressremoval and reloading of the currently-active user-interface(CCP) module. This means that program exit and CP/M restartalways restore the current user interface, preserving accesscontext, all RSX, and any security restrictions. Because Guardian operation can disturb system integrity, WIZprivileges are required for alteration of GUARD state. GENINScan be used to add PASSWORD checks as well. usThe Guardian has been dropped.Guardian can't drop -- not the youngest RSX.Protection is already in effect.PREPARING ENVIRONMENT PROTECTOR:Cannot establish a Guardian under these conditions.a>GUARD UP initiate Guardian protection over the currenta>GUARD ON environment and user interface.a>GUARD DOWN drop Guardian protection, allowing any usera>GUARD OFF interface (CCP) to be removed or replaced.a>GUARD CHECK report on any Guardian currently serving asa>GUARD STATUS protector of Ä$$ password$@NAMES DIRZCPR2 w_#~ ʸ A:4ɀ  MSW:CP-MIG ?ʻ w# !SYSTEM#2.15 84-06-22!C(:6:6PYZ2PFX.CC #1.13 84-05-13&SC80.CC #5.15 84-05-13~o}g^#V }s#r !}o|g}o|g}o|g{z{z{z{̄!-{̄!,z>{z?!-z>{zð>{>_||g}oɯo_)&)zBKW_GyO,)!BK>){_zWT{zTW#{_=<||t|t5t+|/g}/o{ozgN N#~# ŽA~# yOĎy˜# ʭ#ʷɯ#+#Ⱦ N #NGͱ7~# A! G~p# $SCPM.CC #5.06 84-03-27*!! !! !!! ! !!!!!́Y| +++ $vCCABEND: Attempting System Restart.$́Y͏@RSXDEF.CC #1.00 84-05-13SCENV0.CC #1.17 84-06-22* !*!9.*.!!9"##*}Bozzګ<2"*z z*zz>NzzͷCCBROKE: Program or system is damaged.$1ͷCCMEMRY: Not enough memory to work in.$!͌!z`i+6+r+s!*~%# x $J S_z$Wz4Ns#Fr#x‡**}o#z DM!1B!6g!1p6!o1ʊ6͒"!!n&!\!l!^#V#N#F+++yx*y^#V##xt!99ҫ>!2 7!t9:«:ë!CPBIOS.CC #1.00 84-04-03@HZBIOS.CC #1.02 84-04-26>_X2BIOS.CC #1.01 84-06-11]~STRLIB.CL #2.08 84-04-10s#w#ww###n&n&##n&#^Wng#5^W#^wyO~#^+#4#q#r> y  ##ů+<5ů^WBKH]ͻ!-##u!-!9H!ͤ|ʹ!9H!-!9!9HtS!9H!ͤ| !9H!9H! Zt́!9H! Zt ́y !9H! ͤ|> !9H!9H!0y !9H!9H! Ź!9H! Z!0!9!S!9HA|- !9HA!0ͷ!9HA!9Ͷs| !9!9!9HS! !0|! 9HAS!9H!9Hͤ| !t!9H#S+È !9H|9 LOGLIB.CL #2.09 84-04-09:B!   B T]6$z6" * #|* +" ; ͱ | $! h! h!kͱ Á ý!B ͦ|4 #͈ ͈ ; X - ͈ ù |Modified $!͈ !9HA|k !.h!9Ḧ́ !>Y7 v OUTNUM.CL #1.03 84-04-08!9H!9HA!s!9H!s!B͓ h!9H!Ͱ !9HͰ !9H!s!9H͍|' !9H!t !9H !t!s|J Ä !9H!ͤ|| !-h!9!9HtSÄ !+h!S̈́ !9H  zҲ 5͠ !0$" |0$!9H!ͤ| !-h!9!9HtS!9H͙ t  PDGREE.CL #1.04 84-04-08  >. # 4  ^#V!6 6!*́ !9; !9!H͛!V!Q9HN !_!Q9Hk ͬ̈́ !O9HͮͿ !b̈́ !M9!9; !9!H͛! !O9H$ ͬ̈́ !K9ͪͮ|m!i ͪ͟ ; ͪA ͙ !̈́ !y ; ENVLIB.CL #1.07 84-06-22!>!_G_#+ / +!Cz"!#:@o!&DM>þ7#^#V ^#VÇ!!@}U oj+++#C*+++*!9*!9*||C g$ɜCCPENV.CL #1.08 84-05-01:! 9*́""*}o"!**!9"!"COM!# >þ ~##_^#Vzҁ#!+|gz`kz*z!!*~#fozCr} +++#u!ͷ:k*>2*~#Ý͠|ʽ!|͠*z!̈́m ~<6͠ ^#V́Z ^#V́ɑ?RSXENV.CL #1.08 84-05-13t!!\} j+++#y7`  ~< ^#Ví!̈́m ##^#V N#F!^#V͇# n`=BIOSNV.CL #1.08 84-06-11}##xlXerox k CP/M vers 2.2C ###!l!!͘!"͘s|* Kf*0 >9<9 `9<###9!!=|O͎r| }#=:-!9HA!/͘!9HA!-͘e!9HA!?͘e|a!9H#Si!9H!9H#S+A|ʇ!Þ!9H !r!9H#S+A|ʼ!!9H!r!͘!! !!!V ͺj| Xͺ͟|#{ͷ!B 7+W͹ Z|i+Z !̈́ r|f B"=|ʊ+= !̈́ "͠|ʣ+͠ æ2!ͣ|ʼ"!m|2!̈́  2!*̈́ +a !F̈́ +e ![̈́ n|++j !ḧ́ +ͪ !ẗ́ "2aͪ|͙ !ÿ́ n|w2n͙ !̈́ ; +!̈́ ; +!̈́ +!̈́ ; +!Ö́ +!̈́ ; +!̈́ +! ̈́ +!Ḯ +!̈́ ͹ >|Heath/Zenith $H8 H89/Z90 H/Z-100 Xerox 820-II # |N$!͈ !̈́ ͣMicro8080A 8085 Z80 Z800  SoftChip Processor ͻ|!^͈ Z$~#^#V!ʈ !È Version CP/M MP/M    !͈ B!̈́ ͭ!͙ !̈́ !s͙ r|ʫr!ͣ|e!̈́ !̈́ r!͘|ʅ!̈́ !9S|ʫ!9H!A͙ !9S|ʓ!̈́ !!9H#S͓ ͙ !̈́ !!9H#S͓ ͙ !̈́ !!9H#S͓ !!!9H#S͓ ͙ !̈́ !!9H#S͓ !!!9H#S͓ ͙ + !È special RSX entry!9!9!9H͕S!9!9!S͛!9H+S#|~!9HA!s!͘!9HA!s! ͤe|W!9H#S+{!9!9H#S+A!s!9! ͘|ʠ!9~!9ͬ̈́ !̈́ ! 9CCP Not LocatedNon-Resident CCPZCPR1ZCPR2EZCPR*^#Vz!'-!È !̈́ ; +!̈́ > $0123456789ABCDEF0xProgram , -levelENVCHEK: Incompatible environment assumptions.-point pedigree:# Configuration AnalyzerCP-MIG edition by Dennis E. HamiltonSYSTEM#2.15 84-06-22 BIOS BDOS Environment protected via Single-Segment Memory Model current TPA ceiling Stack Point Heap Point TPA-byte TPA capacity-byte free zonea>SYSTEM -? and invalid parameters provoke this summary.a>SYSTEM -# identifies the program and reports its pedigree, installation status, and support level.a>SYSTEM with no parameters produces a report of the system's current configuration characteristics. Beside providing useful information about your config!uration,SYSTEM also demonstrates which features of the system can bedetected and exploited by any MSW automatic-configuration toolsof the same vintage.Computer Configuration Operating System.C.0 S/N --- RSX entry base location H ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8O BIOS BDOS Environment protected via Single-Segment Memory Model current TPA ceiling Stack Point Heap Point TPA-byte TPA capacity-byte free zonea>SYSTEM -? and invalid parameters provoke this summary.a>SYSTEM -# identifies the program and reports its pedigree, installation status, and support level.a>SYSTEM with no parameters produces a report of the system's current configuration characteristics. Beside providing useful information about your configÄ$$ password$@NAMES DIRZCPR2 w_#~ ʸ A:4ɀ  MSW:CP-MIG ?ʻ w# !WIZ#1.03 84-06-23!L Ԭ:6:6PYZ2PFX8.CC #1.03 84-05-13'SC80.CC #5.15 84-05-13~o}g^#V}s#r!}o|g}o|g}o|g{z{z{z{̅!-{̅!,z>{z?!-z>{zñ>{>_||g}oɯo_)&) {BKW_GyO-)"BK>){_zWU{zUW#{_==||u|u6u+|/g}/o{ozgN N#~# A~# yOďy™# ʮ#ʸɯ#+#Ⱦ N #NGͲ7~# A! G~p# %SCPM.CC #5.06 84-03-27*!! !! !!! ! !!!!!͂Z} +++ $wCCABEND: Attempting System Restart.$͂Z͐ASCENV0.CC #1.17 84-06-22* !*!9*.!!9"##*}$o{{ڍ<2"*{ {*\{>0{z͸CCBROKE: Program or system is damaged.$1͸CCMEMRY: Not enough memory to work in.$!͍!{`i+6+r+s!*~# xJ S_z$Wz4Ns#Fr#xˆ**}o#{ DM!$!cg!Rc!ol͓"!!n&!\!l!^#V#N#F+++yx*y^#V#½#x¼ͫ¼u!99ҍ>!27!t9::ÍRSXDEF.CC #1.00 84-05-13"STRLIB.CL #2.08 84-04-10s#w#ww###n&n&##n&#^Wng#ʉ5^W#^wyO~#^+#4#q#r> ͘y ³͘##ů+5ů^WBKͼ!-##!-!9I!ͥ|]!9I!-͑!9!9IuT!9I!ͥ|ʯ!9I!9I! [u%!9I! [u% !9I! ͥ|!9I!9I!0͑ !9I!9I! [%!9I! [!0͑!9!T!9IB| !9IB!0͸!9IB!9ͷt|ʟ !9!9!9IT! !0}! 9IBT!9I!9Iͥ| !u!9I#T+, !9I  LOGLIB.CL #2.09 84-04-09:$!͘$͇ T]6${6"S *S #}*S +"S b U } $! i! i!lU Â# þ! ͈| #, l , b Xl - , ] }Modified $!, !9IB| !.i!9I( !Z  OUTNUM.CL #1.03 84-04-08!9I!9IB!t!9I!t!7 i!9I!T !9IT !9I!t!9I͎| !9I!u͔ !9Is !u!t| ( !9I!ͥ| !-i!9!9IuT( !+i! ( !9I͔  {V 6D !0$"` }0$!9I!ͥ|ʒ !-i!9!9IuT!9I=   PDGREE.CL #1.04 84-04-08ͱ>.ʾ # ^#V!6 6!þ*ͼ͂% !9b !9!H?! ;!Q9I !;!Q9I P( l !O9I͐c !( !M9!9b !9!H?! ͑!O9I P( !K9͌͐|!͎ ͌C b l ͌ = !N( !  b ɟ BENVLIB.CL #1.07 84-06-22!ͺ>!_G_v#+ / +!ͺD{"!#:@o͒!&DM>þ7#^#V^#VÈ!}U oj+++*+++*!9*!9*|}D g$@7RSXENV.CL #1.08 84-05-13l!T} b+++q7X  ~< ^#Vå!ͅe ##^#V N#F!^#V͈# n`5CCPENV.CL #1.09 84-06-23:! 9*͂""*}Xo"!**!9"!"COMx!# >þ ~##_^#V{҂#͈!+|g{`k{*{͐!"*~#fo{} +++!ͺ::*>21*~#Þ#|@͐!I|#*{!̓ͅe ~<ʹ# ^#V͂ ^#V͂UNLOCK.CL #1.03 84-04-28ͼÞ!9I+T#|ʁ!9!FTD|R!9I+T#|O!9S!tT|L!9I~!9I+T#|~J|{P!tR!!i! i!i!T{\ !n&!9!9!xT!9!<?!|J!9!G9IT|9!9I+T#!͙|I!u!C9!9I!͙|ʴD|mp͇!*i!9!9I͑!9W!9`͙|ʱ!!C9!9!9IT!͙|͇!9~6!9I!͙|!9W|͇!9~6!9I!͙|3J6G!u!C9!9P!9W!ͤt!C9xCLKENV.CL #1.00 84-04-12:`ž*p> vWHEEL.CL #1.01 84-06-23:`ž*pI!͙|#͠!~ Þ!9T|!9IB!!9T|=!9I!9I}I!͙|g#͠ N#F!9T!!9IɨLOKCHK.CL #1.02 84-06-22͕|!9! ͕T!9! !(T!9!T!9I+T#|&b !_ !9!9IT|#&] !9I!9i!͎T!i!9I͎|m!`͎ !|}ý!( !9ͦT!ͥ|ʽ!9I|ʵ!͎ ý!͎ !9I!!͖ !9I#T+B|E!9IB!/͙!9IB!-͙f!9IB!?͙f|E!9I#T!!9I|q!9I!B!!9I#T+B|ʎ!9I!E!9I!If|!!9I!M!9I!Rf!!W![!a :͜I| !9͜uT|;!Dg] !9I!ͤ|ʜ!k|hÜ!t( b !( b ͦ!ͥ|ʖ!͎ ÜD!9I!ͤ|I|!9I!͎ u u u !5( !9I!ͤ!͙t| !D( |!K( '!N( !R( !9I!ͤ!͙t|a] u !V( ] !( ] !( b !( ] !=( b !z( ] !( b !( b !( b !D( b !( b !( b !( b !$( > $0123456789ABCDEF0xProgram , -levelENVCHEK: Incompatible environment assumptions.-point pedigree:WIZCHEK: You can't do that here.passwordHazardous area -- Let's have a password:LOKCHEK: Nothing ventured, nothing lost, aye?LOKCHEK: If at first you don't succeed, punt?WIZARD STATUSCP-MIG edition by Dennis E. Hamilton# IN ON OUT OFF WIZ#1.03 84-06-23passwordThe WIZ is rather busy these days, but perhaps you mightget some attention with a well-chosen magic word or two:WIZCHEK: ... and perhaps not.The WIZ says it's unsafe down here in the gloom.** The WIZ is STILL INOUT **** You think maybe no EZCPR or WHEEL security installed? **a>WIZ and invalid parameters provoke this description.a>WIZ IN enable WIZ privileges, provided that any necessarya>WIZ ON authentification is also supplied.a>WIZ OUT drop WIZ privileges, the usual default action asa>WIZ OFF well. To place a WHEEL byte under control of WIZ, GENINS is used totell the program what ZCPR2 WHEEL byte location to use. GENINS is also used to impose password verification on WIZ INrequests. Otherwise, WIZ IN can be selected by anyone able toaccess and operate the program. Whether WIZ privileges actually give the operator any specialcapabilities will depend on the user-interface (CCP) softwareand utility programs available for use.R{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"ot.The WIZ says it's unsafe down here in the gloom.** The WIZ is STILL INOUT **** You think maybe no EZCPR or WHEEL security installed? **a>WIZ and invalid parameters provoke this description.a>WIZ IN enable WIZ privileges, provided that Introduction to PATCHCPM. Why you might want to PATCHCPM. How to use. How to modify. Features and limitations. : Introduction to PATCHCPM. This utility enables you to easily PATCHCPM. It is simply a collection of available patches put together in one program. It was purposely written in 8080 code and is easily modified. Feel free to add any other patches you have come across - if you do then how about sharing them with me? Jim Dreher 1937 Armory Road Barstow, CA 92311 Barstow RCP/M -- (619) 256-3914 : Why you might want to PATCHCPM. I see a lot of people are switching to ZCPR2, but I have decided NOT to go that route on my ROBIN. Don't get me wrong, I agree that ZCPR2 has some really nice features, but # the ROBIN simply doesn't have that much disk space to manage (only 169k per disk). I believe that ZCPR2 is better suited for a large disk system such as a 5 or 10Mb Winni (or maybe even a double-density 8 inch). That way you would have enough room to make the USER areas work to your advantage -- very similar to the heiarchial structure of UNIX or VMS. Consider an alternative system that I currently use. This works GREAT on a system with four drives -- I don't know if it would be all that great on a system with only two drives. Everybody and their grandmother has written better utilities than the CCP "built-in" ones, but are a little awkward to use. How many times can you type XDIR or ERAQ without looking at the keyboard and not make a mistake? My utility called PATCHCPM solves this problem. Using PATCHCPM here's what I've done: 1. Using a patch by Lewis Moseley, my DELETE key now works the same as my BACK SPACE key. (Hooka!) 2. Using another patch from an unknown hacker, I've designated my drive A to be my "system drive". If I'm logged into a disk other than A and call for a program that's not on that disk, CP/M will automatically go and get it from drive A. The next patch indicates how useful this is. 3. Using patches that I thought up (I don't know if I'm the first, but I haven't seen them documented anywhere else yet), I disabled the "built-in" DIR, ERA, and TYPE commands. Now when I type in DIR instead of doing the directory, CP/M looks for a file called DIR.COM. Then I RENamed the following: SD.COM became DIR.COM, ERAQ.COM became ERA.COM, and TYPE17.COM became (you guessed it!) TYPE.COM. Reference #2 above, now I can get a directory from any disk in any drive and the DIR.COM only has to be on the disk in drive A! I use the patch that makes drive A the system drive and I find it very useful and more importantly practical to use (on a ROBIN with four drives). On my "system disk" are all of the programs that I frequently use and can be invoked while logged into any drive. The best example is my new DIR command -- I ran PATCHCPM to enable drive A as the "system drive", disabled the "built-in" DIR command, then I did "PIP A:DIR.COM=B:SD.COM[V]". Now I can get a comprehensive directory while logged into any disk and only the system disk needs to have the DIR.COM file! (SD.COM is Super Directory - VERY NICE!). There are many other worthy replacements avaliable for the "built-in" CCP commands. I also use TYPE17.COM renamed to TYPE.COM and ERAQ.COM renamed to (you guessed it!) ERA.COM. CP/M Copyright,TM Digital Research ZCPR2 written by Richard Conn ROBIN is Digital Equipment Corporation's VT180. SD.COM written by David Boruff. Unix TM Bell Labs VMS TM Digital Equipment Corporation. ERAQ.COM written by ? TYPE17.COM writen by Dave Rand. XDIR written by ? : How to use. 1. d>PATCHCPM 2. PATCHCPM asks "Need help (Y/N)?" 3. Answer 'Y' for details. : How to modify. PATCH.ASM should be adequately self-documented to aid you in making any modifications. Keep in mind that it was purposely written in 8080 code and please read the help section "Features and Limitations." Please let me know if you come up with some other useful patches. : Features and limitations. 1. This program cannot load past 08FFH or it will overwrite the memory image of the CP/M system you are patching - if necessary then remove some of the less useful patches to include yours. 2. If you answer 'N' to a question it will NOT restore the CCP to it's original state. If you wish to remove the patch(s) then start with a "fresh" CP/M system. 3. Note that if you disable one of the built-in commands you must have a .COM file of that name on the disk for that command to work. For example you may want to disable the built-in "DIR" command and put "SD.COM" renamed to "DIR.COM" on the disk. 4. This program was purposely written in 8080 code so that all can use.$ is program cannot load past 08FFH or it will overwrite the memory image of the CP/M system you are patching - if necessary then remove some of the less useful patches to include yours. 2. If you answer 'N' to a question it will NOT restore the CCP to it's original state. If you wish to remove the patch(s) then start with a "fresh" CP/M system. 3. Note that if you disable one of the built-in commands you must have a .COM file of that name on the disk for that command to work. For example you may want to disable the built-in "DIR" command and put "SD.COM" renamed to "DIR.COM" on the disk. 4. This program was purposely written in 8080 code so that all can use.; ; PROGRAM PATCHCPM ; 12-22-83 JOD ; ; PURPOSELY WRITTEN IN 8080 CODE SO ALL CAN USE ; ; FEEL FREE TO ADD ANY OTHER PATCHES YOU HAVE COME ACROSS - IF ; YOU DO THEN HOW ABOUT SHARING THEM WITH ME? THANKS. ; ; JIM DREHER ; 1937 ARMORY ROAD ; BARSTOW, CA ; 92311 ; ; ********** PATCHCPM LIMITATIONS ********** ; ; 1. THIS PROGRAM CANNOT LOAD PAST 08FFH OR IT WILL OVERWRITE ; THE MEMORY IMAGE OF THE CCP YOU ARE PATCHING - IF NECESSARY ; REMOVE SOME OF THE LESS USEFUL PATCHES TO INCLUDE YOURS ; ; 2. IF YOU ANSWER 'N' TO A QUESTION IT WILL NOT RESTORE THE CCP ; TO IT'S ORIGINAL STATE. IF YOU WISH TO REMOVE THE PATCH THEN ; START WITH A "FRESH" CP/M SYSTEM. ; ; 3. NOTE THAT IF YOU DISABLE ONE OF THE BUILT-IN COMMANDS YOU MUST ; HAVE A .COM FILE OF THAT NAME ON THE DISK FOR THAT COMMAND TO ; WORK. FOR EXAMPLE YOU MAY WANT TO DISABLE THE BUILT-IN "DIR" ; COMMAND AND PUT "SD.COM" RENAMED TO "DIR.COM" ON THE DISK. ; ; *** CHANGE MEMSIZE AND BASE TO MEET YOUR SYSTEM REQUIREMENTS *** MEMSIZE EQU 64 ; CP/M SYSTEM SIZE IN K BYTES BASE EQU 0 ; START OF RAM ON YOUR SYSTEM BIAS EQU (MEMSIZE-20)*1024 CCP EQU 3400H + BIAS + BASE ; START OF CCP TPABOOT EQU 0900H ; WHERE SYSGEN PUTS BOOT IN THE TPA TPACCP EQU 0980H ; AND THE CCP... TPABDOS EQU 1180H ; AND THE BDOS... TPABIOS EQU 1F80H ; AND THE BIOS CTRLC EQU 3 LF EQU 10 CR EQU 13 CTLZ EQU 26 ESC EQU 27 BEL EQU 7 ORG 0100H START: CALL ILPRT DB CR,LF,LF DB 'PATCHCPM 22-DEC-83 JOD' DB CR,LF DB 0 ;..... CALL ILPRT DB CR,LF,LF DB 'Need help (Y/N)? ' DB 0 CALL GETANS ; SKIP IF HELP NOT NEEDED JZ ONE ; 1234567890123456789012345678901234567890 HELP: CALL ILPRT DB CR,LF,LF DB 'PATCHCPM is a collection of useful patches' DB ' for CP/M 2.X systems. To use:' DB CR,LF,LF DB '1. Run SYSGEN to get your CP/M system into memory' DB CR,LF DB '2. Run PATCHCPM and select the desired patches.' DB CR,LF DB '3. When PATCHCPM finishes it prints ' DB '"Ready for SYSGEN or SAVE 34 CPMXX.PAT"' DB CR,LF DB '4. Save your patches with SYSGEN or SAVE.' DB CR,LF,LF DB 'Continue with PATCHCPM (Y/N)? ' DB 0 CALL GETANS ; WARM START IF NOT READY JZ 0000H ;..... ONE: CALL ILPRT DB CR,LF,LF DB '* Do you want DELETE to work like BACK SPACE (Y/N)? ' DB 0 CALL GETANS ; IF NO THEN SKIP JZ TWO ; THANKS TO LEWIS MOSELEY LXI H,TPACCP + 0A1BH ; HL = ADDRESS TO PATCH LXI D,PAT1 ; DE = ADDRESS OF NEW CODE MVI B,3 ; B = NUMBER OF BYTES TO MOVE CALL MOVE ; MAKE THE PATCH ;..... TWO: CALL ILPRT DB CR,LF,LF DB 'If desired, the next patch causes drive A to' DB ' become the "system drive".' DB CR,LF DB 'It will force the CCP to look on Drive A when' DB ' you are logged into a drive' DB CR,LF DB 'other than A and call for a .COM file that does not' DB ' exist on that drive.' DB CR,LF,LF DB '* Do you want drive A to be the "system drive" (Y/N)? ' DB 0 CALL GETANS ; SKIP IF ANSWER IS NO ; THANKS TO ???? LXI H,TPACCP + 06DBH ; SAME AS ABOVE LXI D,PAT2 MVI B,3 CALL MOVE LXI H,TPACCP + 07F2H LXI D,PAT2A MVI B,14 CALL MOVE ;..... THREE: CALL ILPRT DB CR,LF,LF DB '* Disable CCP built-in DIR (Y/N)? ' DB 0 CALL GETANS ; SKIP IF NO JZ THREEA LXI H,TPACCP + 0310H LXI D,PAT3 MVI B,4 CALL MOVE ;..... THREEA: CALL ILPRT DB CR,LF,LF DB '* Disable CCP built-in ERA (Y/N)? ' DB 0 CALL GETANS ; SKIP IF NO JZ THREEB LXI H,TPACCP + 0314H LXI D,PAT3 MVI B,4 CALL MOVE ;..... THREEB: CALL ILPRT DB CR,LF,LF DB '* Disable CCP built-in TYPE (Y/N)? ' DB 0 CALL GETANS ; SKIP IF NO JZ THREEC LXI H,TPACCP + 0318H LXI D,PAT3 MVI B,4 CALL MOVE ;..... THREEC: CALL ILPRT DB CR,LF,LF DB '* Disable CCP built-in SAVE (Y/N)? ' DB 0 CALL GETANS ; SKIP IF NO JZ THREED LXI H,TPACCP + 031CH LXI D,PAT3 MVI B,4 CALL MOVE ;..... THREED: CALL ILPRT DB CR,LF,LF DB '* Disable CCP built-in REN (Y/N)? ' DB 0% CALL GETANS ; SKIP IF NO JZ THREEE LXI H,TPACCP + 0320H LXI D,PAT3 MVI B,4 CALL MOVE ;..... THREEE: CALL ILPRT DB CR,LF,LF DB '* Disable CCP built-in USER (Y/N)? ' DB 0 CALL GETANS ; SKIP IF NO JZ FOUR LXI H,TPACCP + 0324H LXI D,PAT3 MVI B,4 CALL MOVE ;..... FOUR: NOP ; PATCH NUMBER FOUR GOES HERE NOP NOP NOP ;..... DONE: CALL ILPRT DB CR,LF,LF DB 'Ready for SYSGEN or SAVE 34 CPMXX.PAT' DB CR,LF DB 0 JMP 0 ; WARM START ; ; SUBROUTINE MOVE ; ; FUNCTION: MOVE A BLOCK OF MEMORY ; ; ENTRY: HL = SOURCE ADDRESS ; DE = DESTINATION ADDRESS ; B = NUMBER OF BYTES TO MOVE ; ; EXIT: N/A ; MOVE: LDAX D ; GET BYTE MOV M,A ; MOVE IT INX H ; ADVANCE POINTERS INX D DCR B ; DONE? JNZ MOVE ; NO - KEEP GOING RET ; YES- DONE ; ; SUBROUTINE GETANS ; ; FUNCTION: GETS AN INPUT FROM THE CONSOLE, CHECKS FOR 'Y' ; OR 'N' ONLY. DOES A WARM START IF CTRL-C ENTERED. ; ; ENTRY: N/A ; ; EXIT: Z FLAG IS SET IF ANSWER IS 'N' ; Z FLAG IS CLEAR IF ANSWER IS 'Y' GETANS: MVI C,1 ; BDOS CONSOLE INPUT CALL 5 ; GET ANSWER CPI CTRLC ; WANT TO QUIT? JZ 0 ; YES- WARM START CPI 'Y' JZ GA1 CPI 'N' JZ GA1 CALL ILPRT DB BEL,CR,LF DB 'Please answer Y or N : ' DB 0 JMP GETANS GA1: SUI 'N' ; SET Z FLAG ACCORDINGLY RET ; ; VANILLA FLAVORED ILPRT ROUTINE ; ILPRT: POP H ; GET ADDRESS OF CHARACTER MOV A,M ; GET CHARACTER INX H ; POINT TO NEXT CHARACTER ORA A ; NULL? JZ ILPRT$DONE ; YES- EXIT MOV E,A ; GET CHAR IN E PUSH H ; SAVE POINTER MVI C,2 ; BDOS CONSOLE OUTPUT CALL 5 ; SEND IT JMP ILPRT ; DO ANOTHER CHARACTER ILPRT$DONE: PCHL ; RETURN TO CALLING PROGRAM ; ; STORAGE FOR PATCHES ; PAT1: JMP CCP + 0A07H ; JUMP TO THE BACK SPACE ROUTINE (AFTER ; DELETE IS ENTERED) PAT2: JZ CCP + 07F2H PAT2A: LXI H,CCP + 07F0H ORA M ; ACCUM WAS 0 ON ENTRY, SO THIS FETCHES DRIVE JNZ CCP + 076BH ; COMMAND HAS EXPLICIT DRIVE ... GIVE ERROR INR M ; FORCE EXPLICIT REFERENCE TO DRIVE A LXI D,CCP + 07D6H ; WE NEED TO SETUP DE TO RE-ENTER CCP JMP CCP + 06CDH ; PAT3: DB 0,0,0,0 ; WHOOPIE ENDDAT: END ; *** MUST BE < 0900H ***  DB 'Please answer Y or N : ' DB 0 JMP GETANS GA1: SUI 'N' ; SET Z FLAG ACCORDINGLY RET ; ; VANILLA FLAVORED ILPRT ROUTINE ; ILPRT: POP H ; GET ADDRESS OF CHARACTER MOV A,M ; GET CHARACTER INX H ; POINT TO NEXT CHARACTER ORA A ; NULL? JZ ILPRT$DONE ; YES- EXIT MOV E,A ; GET CHAR IN E PUSH H ; SAVE POINTER MVI C,2 ; BDOS CONSOLE OUTPUT CALL 5 ; SEND IT JMP ILPRT ; DO ANOTHER CHARACTER ILPRT$DONE: PCHL ; RETURN TO CALLING PROGRAM ; ; STORAGE FOR PATCHES ; PAT1: JMP CCP + 0A07H ; JUMP TO THE BACK SPACE ROUTINE (AFTER ; DELETE IS ENTERED) PAT2: JZ CCP + 07F2H PAT2A: LXI H,CCP + 07F0H ORA M ; ACCUM WAS 0 ON ENTRY, SO THIS FETCHES DRIVE JNZ CCP + 076BH ; COMMAND HAS EXPLICIT DRIVE ... GIVE ER This is the release date of the disk. APPEND DOC APPEND ASM SPLIT COM .SPLIT DOC MAKBATCHCOM MAKBATCHDOC LASM COM LASM DOC LSWEEP13COM #>LSWEEP DOC 3%SCRMBL21COM =SCRAMBLEMSG > SCRMBL21ASM BSCRMBL COM JLSWEEP13.COM 8A FE 16000 125 LSWEEP .DOC 35 8E 9472 74 SCRMBL21.COM 57 BE 768 6 SCRAMBLE.MSG F9 BD 3200 25 SCRMBL21.ASM E9 BF 7296 57 SCRMBL .COM 19 1F 256 2 SCRMBL .DOC 1D 3E 2304 18 SCRMBL .MAC 2E D6 3968 31 BDOSLOC .COM 49 7D 256 2 BDOSLOC .ASM 57 A3 1664 13 EZCPR .COM 73 1F 11008 86 EZINST .HLP CD 12 36608 286 GUARD  Fog Library Disk FOG-CPM.054 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Utilities for most CP/M computers. Filename Description -06-00 .86 This is the release date of the disk. &-CPM054 .DOC This is the description of the disk contents. APPEND .COM 183F 1K [Append file 1 of 3] Add a file to the end of another. MAC source included. APPEND .DOC CF3B 1K [Append file 2 of 3] APPEND .ASM 6316 1K [Append file 3 of 3] SPLIT .COM 56D7 12K [Split file 1 of 2] Split a large file into smaller chunks. SPLIT .DOC A70D 2K [Split file 2 of 2] MAKBATCH.COM A233 1K [Make batch file 1 of 2] Make a batch run .com file without SUBMIT. MAKBATCH.DOC FDA1 3K [Make batch file 2 of 2] LASM .COM BE32 6K [Linking Assembler 1 of 2] This assembler can replace ASM.COM LASM .DOC E0E9 5K [Linking Assembler 2 of 2] LSWEEP .COM 8AFE 16K ver. 1.3 [Library Sweep 1 of 2] "Sweep" utility for .LBR files. Extract, view, etc. members. LSWEEP .DOC 358E 10K ver. 1.3 [Library Sweep 2 of 2] SCRMBL21.COM 57BE 1K ver. 2.1 [Scramble 1 of 6] Encrypts and decrypts files with user supplied passwords. Be very careful not to forget your password because no one has ever recovered an encrypted file without the correct password and each new password adds a new layer of encryption to the file. Two versions included here (one with ASseMbler source; one with M80 source). SCRAMBLE.MSG F9BD 4K ver. 2.1 [Scramble 2 of 6] SCRMBL21.ASM E9BF 8K ver. 2.1 [Scramble 3 of 6] SCRMBL .COM 191F 1K ver. 2.1 [Scramble 4 of 6] SCRMBL .DOC 1D3E 3K ver. 2.1 [Scramble 5 of 6] SCRMBL .MAC 2ED6 4K ver. 2.1 [Scramble 6 of 6] BDOSLOC .COM 497D 1K [BDOS location 1 of 2] Prints base page addresses for BDOS and CCP. Very handy when you need to locate addresses for ZCPR integration, etc. BDOSLOC .ASM 57A3 2K [BDOS location 2 of 2] EZCPR .COM 731F 11K [Easy ZCPR 1 of 5] A utility to make setting up of ZCPR functions much easier. EZINST .HLP CD12 36K [Easy ZCPR 2 of 5] GUARD .COM 26A6 11K [Easy ZCPR 3 of 5] SYS215 .COM 6F3B 8K [Easy ZCPR 4 of 5] WIZ .COM 28FD 8K [Easy ZCPR 5 of 5] PATCHCPM.HLP 5256 7K [Patch CP/M 1 of 2] A predecessor to ZCPR which makes various automatic changes to standard CCP. PATCHCPM.ASM 791B 7K [Patch CP/M 2 of 2]  [Scramble 3 of 6] SCRMBL .COM 191F 1K ver. 2.1 [Scramble 4 of 6] SCRMBL .DOC 1D3E 3K ver. 2.1 [Scramble 5 of 6] SCRMBL .MAC 2ED6 4K ver. 2.1 [Scramble 6 of 6] BDOSLOC .COM 497D 1K [BDOS location 1 of 2] Prints base page addresses for BDOS and CCP. Very handy when you need to locate addresses for ZCPR integration, etc. BDOSLOC .ASM 57A3 2K [BDOS location 2 of 2] EZCPR .COM 731F '