IMD 1.18: 22/01/1996 6:09:48 micro cornucopia kaypro user group disk 9 zcpr     EX14 COMD COM TREK COM TREK COMV !"#$INSTALL SUB%9-DISK DOC&'()ALIENS COMp*+,-./01234567ALIENS DOC89:FIX DOC;FIX COM<=>?@ABCDEFGHIJKFIX COMeLMNOPQRSTUVWXFIND ASM2ͤ*?*}_|W!x< ~#/bkxp :/<2/Z~#2.:.2.lA+";#:o&6 !S0> 2*h:!"2>2!"4*2#"2:  G*4H'6 #6 #"4òe!='2|\<%!]&6.#e&6$z*4!"4\%*46"6}|q2&2'2(28!"2*;"9"= „2u| > 2O:&yʯ;A^$2) O:8yuNu͒:; ?|$%.ʘ#ʓ<ʪ>SSED2 COMQwxyz{|}~SNOOPY TXTPASSWORDASM@PASSWORDCOMCRC COMCRCKLISTCRCEX14 DOC/EX14 SUB!EX14 TSTEX14 ASMEX14 ASMGZCPR DOC*ZCPR HEX*ù>ù>ù>ù> > 2)u!A0> 2*h> ~!)w¹O:(yʹ:&yʹ#!):8=28ʏ jw:8ʉ> > ~> ~>ù>!(£w>ù>2)!&u2&2'ù>2)!'u2'2&ù*6}|ʉw+*###>E#>X#>Oͤ*$:6+6} %. 6+6X+6E+:w+:w+6*'ͤͤͤͤ*,ͪ fͤ ͤͤ zͤ|`ڣ{G @;:?$.#<>G@G$^|1Y:Y12+!U _^#V{   w+#~!A:+P_^#V{P w#&*2#"2!)6!86kb"0"9 :(:&:8<28", ʜ os#r#:*b ʜ ‰o>  ~ µ> #_ê!ͤ@ͤ*2*0~# 6 ~#_   |{0_~#'_x{ w#0SUB error line # $ (Ex Already Present)$ Text buffer empty$ Input/EX Buffer Overlap$ No parameter or default parameter$ Parameter$ File filename.typ$ not there$ Control character$ Too manC 4Ø:!4:!5(  ! I3= : [= t:\a:\=_: :] t ?]\ : ҃! 6?Î : 2   ]Q  ?\\ : DM, Q ! "= *3 ##)*= "; */ &# "! *3 #"#  !! "% >!1 . 2' \: 2 : ʩ: ƀo&"* ~ʛ*# +"# ** DMY қ** DM  *; q#p* " . ** #DM*; -e**  *; w* #" )*= *; s#r*; "; : 2 !S 6!"V * "n >!S d*S &T ) ^#V"K O!l ^#V"M :S =2S M K  a*K "G **( * " 3*1 #" " " *5 " > # R : B * +" ! +s#r( ! 6: " * ~2 * #" * +" > ʶ : 2 Ғ * +" : <2 O>ҳ ! 6* #" * ~2 p ̓: AOK = * Ͱ= * ͷ= * Ͱ= *# ͷ= * Ͱ= . g S -A >>!  ~?l W >#^ : /!:' —  ʑ #‹  W ʢ #™ i`N#FogDM!>))덑o|g =¼ DM!>)) = ^#V) ^#V|g}o y arguments - $EX 1.4 11-22-82$ $ppppppppppppppppppppppppppppppppI"""~+"21*|g."*" *! 1*~*"*"#^#V!_:O*AâÐu!9"!ͥ͢ʽ½ͥ*#w">*:2́a OC[[ 2> O:y½ͨÚ*"222Úͥ͢ʽ 7ͨOM "I *K  )*= ^#V"O I G  *G )*= N#F*O ? J*G #"G (*I )*= ^#V*O DM? m*I +"I JI G  *G )*= ^#V"Q *I )*= *G )*= N#Fq#p*I )*= *Q s#r*G #"G *I +"I K I  G M   !M G  :S <2S O!T *G s#r*S &l ) *M s#r*I "M ^I K  X:S <2S O!T *K s#r*S &l ) *I s#r*G "K û!" "    #* #" )*= * #" )*= N#Fq#p   * )*= * ) *= ^#VN#F? H * #" )*= ^#V";  *; ^#V" * )*=  Hit Space: KK : k Used: /k Not used: k *% DMf : remain on 1 !9" ! J> # ->! . *ͪe> # < * v K  K  K !B r+s+p+qA ?  p*A *? :]$Ž l]Q !]6 !E 6!C 6 :C *C &l ~2D U¼:E 2 :D S:E 2:D F:E 2:D V:E 2:D P:E 2 :D N2E ! _{ozgO{ozgi`N#Fogo&og_{_z#W OK = Y -S {-_ ! s+p+q*  ͼ 2 <2 : ! ڗ  K ! 4Á ! 6: =! ڻ * & NK ! 4œ >3  03} Z; { ) # u u!Kw!Ww2*"x: :y2è*~+"*#"**{z­og"!m*å1!J!m*! (~#:!0:A[a{2:~$#Oͨ!A!!u >>>Ex Aborted<<< $ (Ex Active)$ (Ex Completed) >$ßâåèBDOS>   "IH! !B"$$HB!$BD$$$$H"D $$I """~+"21*|^#V"; *;  ͪ  *; q#pÝn* " ! p+q* )*= ^#V"; ! 6> ! i* &*; >OK : <2 E:/ *; ^#V*% DMf kK : *; Nf E*; ~ڻWK þE *; ~SK E = ! 6:! ':/ : = !: = : <2 * " !" >! .  * *&͵ "( * *&͵ > j*( #"( *DM*( V"( !" (   K!" }2 : <2 O:* * * "    >! = * DM** +" *( * " Ø* #" *&  À,*}o|g"*>(~B}|;$!"|!|"~͟*"*}|I$"6# xJ$* ">:Zs|ʂ$ u+t$*`s%)##~>ҝ$> x#s#r w+*>2 $#w+>3x#s#rw+x#xDM"$$s#r#$! %>2|#%x#$#~#%#~+%~+x x#s#rw+ɯ2h%x_Ox#9w#w+x`%+r+s=W%w>#w+#~7^#V•%| }| !gC"!? Ͷ!xC)))!|C)xs#r*#"**z|S }| ͉Cy3!Ñ !z *͹CA @3@3|g}o*k͹CA$@3|g}o@3|g}o|´ v *k͹CA$C)))*͹CA C)x^#V|v !.BIA8<Au3ͧC897Am3!`͗?Aq3ͧC<9mB!`͗?A3ͧCH9`@}3H 6>!-< !` *)s#r*#"*|p )N *k#"k*k|ڊ )j *#"*|ڡ )d *a|ڰ A@}3V@< !-B !-B !-B͈@ V̓@<'* ) 6>!YCk*k)))*)^#V! s#r͉CW36>!YC!YC>ͺ!r2<6>!22<6>! 2ͺ<*[ͱ!1ͺ!1ͺ!1ͺ<@04!`<6>!"3<6>!"3<6>!31<6>!0<6>!"3<6>!0<6>!K0<6>!/<6>!/<6>!e/<6>!J/<6>!"3<6>!/<6>!.<6>!f.<6>!F.<6>!!.ͺ<!͎[oBͥ!6>!ͺ<!"a͉Cc3͉Cg3*P|گ)?go*P|)go|g}o*R|)?go|g}o*R|)go|g}o||õ͉C|39ͧC͉C3*)^#V͹CwC AM3AA3ͱ@N͉C3*)^#V͹CwC AM3AA37ACs#r6>!,ͺ< A|e3AI3ͧC6>!CT! #Bͺ!p,ͺ<*ͱ: &2>2 : "& ͖Fʚ&3&{F: |&!GͭK& H!W&GØ&*xk&BH̓Gw&H!FG!433!3B!YCBz*)^#V͹C`A ͘A3wC&^#V͹C`A$͘A3A!`?C"(9mBA3!`͗?C"*97A3!`͗?ͧC,͉C0,a$**͹CͧC4͉C83a**SDd( ͹CͧC<͉C@<͉CD3͉CH3͉CL3!"*a**"P!"*a**"R!ͺ!*k)))*)x^#V#!#Bͺ!-ͺ<*B %CUg6>!"3<*#"*|ڼ )9 6>!<|6>!-ͺ!-ͺ!z-ͺ<*Pͱ!j-ͺ!`-ͺ!L-ͺ!;-ͺ<*[<è 6>!.-ͺ<!͎[B!+-@!'-@!-͔4!ͤ?|)go!ͤ?|)?go|g}o|…!?mCͧC6>!<@ *R)))*P)^#V͹C7A3ͧCr!r͗?C"a*a͹CrAr7A3!`͗?ͧCc*R)))*P)^#V͹CwC7A}3!`͗?7A3fAͧCg!ÿ !è *kSD *)s#r*k#"k*k|ڸ )ڌ *#"*| )چ ! ! *k)))*)xs#r*k#"k*k| ) *#"*| ) !$C)))! C)xs#r*a"v!é Ͷ!xC)))!|C)xs#r!|C*)"s#r!xC*&s#r!LC*8s#r*#"**vz| }|K !cC"! Ͷ!xC)))!|C)xs#r*#"**zͧC$R@ ͧC @$ͧC$*#"**z|8}|:*͹CͧC *͹CͧC$6@ 3b͉C 31@ 3r͉C 36@$3͉C$31@$3͉C$3!$C)))! C)xs#r^ *P͹CwC AAwC Ar=3AA93!`͗?ͧC,@3'@3 !C"P!"P!"P*R͹CwC AAwC A=3AA93!`͗?ͧC,@3e'@3n!C"Rt!"Rt!"R!"*a**͹CͧC !"*a**͹CͧC$Î*)ҵ6>!V,<|6>!YCͺB*)s#r*#"*|&)!"*a**͹CͧC !"*a**͹CͧC$T!2B͉CW3!"[!!í9mBͧC]!"a6@]3*a#"a6@]3*a#"a6@]3*a#"a6@]3*a#"a6@]3*a#"a6@]3*a#"a6@]3*a#"a6@]3*a#"a6@]3*a#"a*[*a"[͉Cc39[@38͉Cc3@WcͧCW!"*a**͹CͧCg*aSDd͹CwC Ac3AAgC*k)))*)s#r*k)))*SD=2ͲB*k#"k*k|ڽ)s*#"*|)m*["m~@W&!"*a**"!"*a**"3CB ^ .{/;!!!y! -\<:!<͒@|'@3 6@i3 !,\<:!!,< *a|ڟʟV̓@<'!͉C]3*)^#V#)͉C3*)^#V#͹C7ACs#r*#"*|)ڥ9V@Y397AU3A3!`͗?ͧC|9V@Q3!|C)^#V͹CwC97AM3fAAy3Cs#r6>!,ͺ< A|e3AI3ͧC6>!CT! #Bͺ!<*P#"*P+͉CL3͉CP3͉CT3*R#"*R+*|G)go*|X)?go|g}o|*k|u)go*k|چ)?go|g}o|*k)))*)^#V͹C*R*k}o|g))P͜C*k#"k*k*z|}|:6>!&,ͺ!<*#"**z|'}|^ *)A6>!,!+ͺ!+ͺ<*)^#Vͱ@L%3CYC>ͲB*k#"k*k*z|' }|*#"**z|C }|*R)))*P)^#VC ͹CͧCL*R)))*P)^#VCd͹C`ALͧCP*R)))*P)^#V͹C`AL`APͧCT*R)))*PSD= AT3A%3CYC AP}3A%3CYC>@L%3CY)))"^#V*)xs#r*aSDd͹CwC Ac3AAgC*R)))*P)s#r!.@m6>!C*!*ͺ<*)^#Vͱ!+ͺ!YCͺ!)<6>!)ͺ<*[ͱ!|)<6>!e)ͺ!*)<6>!)ͺ<!͎[oB )!o%?#͹C7AQ3!`͗?A3CBz56>!YCͺ!(<6>!(nly a limited number, and they must be aimed accurately. For aiming,HG%on Klingons is cumulative. Photon torpodoes do not use energy, but thereO%ship's energy, but they destroy any klingon within range. The effect of PhasorsI%Klingons are destroyed by Phasors and Photon torpodoes. Phasors drain theA0&to the width of one quadrant. For direction, use the chart below.Lt&is determined by the warp factor - a factor of 1 corresponding approximatelyI&To move around the Universe, use the warp engines. The amountͺ<&^#V<6>!+ͺ!r+!Y+!,+ͺ<@rͧCr@ͧC@rQ3!`͗?C"@Q3!`͗?C"*|=)p*|M)p*|])p*|m)s6>*ͱ!+<*a+"a*[+"[*[|!*)"^#V*}o|C>ͲBG 6>!ͺ!U'<6>! '<6>!"3<6>!&<6>!q&<6>!-&<6>!"3<6>!%<6>!%<6>!D%<6>!$<6>!$<6>!$<6>!L$<6>!8$<! "6>!YCͺ!$@!9ͧC]!6>!ͺ<"6>!"3<^ 6>!#<6>!#<6>!"3<6>!#<6>!`#<6>!4#<6>!#<6>!"<6>!"<6>!"<6>!l"ͺ<5o"9 - COMMAND SUMMARY&"6 - PROGRESSIVE GALAXY DISPLAY 7*"5 - DAMAGE CONTROL REPORT 6 | 8)"4 - PHOTON TORPODOES / <*m͹CwCIA,0wCIAu3<A8=A7A-3A7Am3!`͗?ͧC A3!`͗?CB #/,@)3s!(B|!(B6>!|(ͺ*mͱ!YCͺ!'*ͱ*k)))*SD=ͺ!"3<*#"*|)e^ *)H *P#"*P+/ *R#"*R+ *|)g of movementF'Within each quadrant there are 64 sectors, identified in the same way.AX'by its row and column number, 1 to 8, starting from the top left.F'The Universe is divided into 64 quadrants. Each quadrant is referenced' !' 1 2 3 4 5 6 7 8 (PROGRESSIVE GALAXY SCAN'(ADMIRAL1(CAPTAIN ;(COMMANDER G(LIEUTENANTT(ENSIGN]( YEARS. RATING= o( KLINGONS IN (YOU HAVE BEEN PROMOTED TO (COMMANDER IN CHIEF(BOOT(THE FEDERATION HAS BEEN SAVED3(THE LAST KLINGON BATTLE CRUISER HAS BEEN*&^#V*}o|2*#"*|/)*)8s#r×*)))*)x^#V|y6>!+<@gy3ͧCg×6>!"3<6>!*<@cy3ͧCc*)))*)xs#r*aSDd͹CwC Ac3AAgC*R)))*P)s#r6>!*ͧC A53A13!`ͻ?JDͧC*)B6>!*<|6>!"3<͉C36>!YCͺ!CT! #Bͺ<*)^#V<@e3ͧC*#"*|گ)j^ 6>!o*ͺ<*)^#Vͱ.uɀI}~0 @L~@z@;L}uPzTHQfff)\ #}u{ #zQsH HH[[[[ BASLIB #900354 5.1 - OWNED BY MICROSOFT, 1979 <44#V#!DM*"D*G##"Dy5>2 424*^#V" 4##^#V"4!s5"p56#6P>2w5>2v5>2u5 4Í44Í4Ä4_p9yUڨ4! S6C#6O#6MS!\>! _KXtR\<[!9%.4>= _.44ot42h2|!" F/The long range scanner and the progressive galaxy display return theirM/can be made immediately.Kh/expected to take, but getting to a home base will usually mean that repairsG/is damaged the damage control report will indicate how long repairs areK0you may have to cope with space storms and wayward meteorites. If the ship KN0perils of space can never be eliminated, and apart from the deadly KlingonsH0Although you have been supplied with the best of materials and men, the L0you may be promoted, but /9<9(98/9<90](99}_|W!>9_~#fo>H at address|͓>}͓>f9> ]> ]!9"55*55)9|*?5*A5ʻ9))9) )9 9 9"A5"?5K!"`i]û9!͊9>!96\>p\g[>Ï\"\!\6\x>6\#.î\o g7%\*c!\#\##\*c##n&\!c \#7~4\4o&~#fo>5^^#VzG]G]ѧG]+^#Vc! o gB6]$>-&]%G]_6+6V]##͚\>2Ï\<{\&p]&GN#"9!9"9"9y2*+STAR DESTROYED+***KLINGON DESTROYED***/+TORPEDO TRACK @+TORPEDO COURSE (0*1-8.9)=\+ALL TORPEDOES EXPENDED u+SPACE CRUD BLOCKING PHOTON TUBES + ENERGY LEFT= +ENERGY DRAIN=+KLINGON HIT AT SECTOR +NUMBER OF UNITS TO FIRE=++PHASORS LOCKED ON TARGET. ENERGY AVAILABLE= ,PHASORS OUT!),:-,#1,,!5,LONG RANGE SENSOR SCAN. QUADRANT Y,LONG RANGE SENSORS OUT!s,A THINGY BLOCKS YOU AT SECTOR , REPAIRS INITIATED. ,***TRUCE, , DAMAGED ***,***SPACE STORM, ,WARP DRIVE OUT, MAX SPEED=.2,WARP FAC\ѷ!>+ *OUT OF MEMORY* $dW> ʹ[W*c*c"c"c*c|W͵V*c|W͵V!c^#V#z!9"=5**ʑ5!6#}‘5|‘56!C56#z¤5*|5> 66#s#r#=º5>275>2:5>2952<5"?5!4"J5+4ñGH STO85f9*J5.. . .........͡F*X5|5:U5j6*S5|j6i8* s#r* {w#6"V5*=5*S5>2U5f9HError -!6~<ʐ6=ʐ6#~#6|6# H5Syntax Error in DATRETURN without GOSU Type MismatcOut of DatIllegal Function CalFloating Overfif you fail punishment will be swift and merciless.I61Your mission is to carry out your orders as detailed above. If successful 1 STARDATE.1SOLAR YEARS TO COMPLETE YOUR MISSION, IE UNTIL1 FOR REFUELING AND REARMING. 1HOME BASE 1 YOU HAVE1S11BATTLE CRUISERS."2 MUST DESTROY THE KLINGON FORCE OF=52 RID THE GALAXY OF THE DEADLY KLINGON MENACE. TO DO THIS YOU=u2 AS COMMANDER OF THE SPACESHIP ENTERPRISE, YOUR MISSION IS TO2ORDERS : STARDATE=2***J2WARP ENGINESS.R. SENSORSL.R. SENSORSPHASOR CNTRL9*H5|;*`5!;"X5A~#*9^~;ʠ;9;`J<;gJ"9b;n;͋H*`*`*`*`{;I*`{;tH*`*`*9^ʓ;~#"9,;;~;!"X5~,"«;#"~ʿ;ʿ;# ®;;";#"9x"; ;+~ ;y͆F{;H?Redo from Start *9͡F!<\<*9:9O;*9+~+@<2<2< +w 4-KLINGONS LEFT=O-PHOTON TORPEDOES=c-ENERGY=m-SECTOR=w- - }-QUADRANT= -CONDITION= -REMAINING -STARDATE=- - ---G-FSHORT RANGE SENSORS OUT !-YELLOW-RED-GREEN"-OUT OF PARTS : NO REPAIRS POSSIBLE.DOCKED"$.Hit any key for more instructions.I.third is the number of stars.Ji.Klingons in the quadrant, the second is the number of home bases, and the K.data in the form of a three digit number. The first digit is the number ofloInteger OverfloOut of Memor Subscript Out of Rang Division By ZerOut of String SpacString Formula Too CompleRESUME without Erro2Field Overflo3Internal Erro4Bad File Numbe5File Not Foun6Bad File Mod7File Already Ope9Disk I/O Erro:File Already Exist=Disk Ful>Input Past En?Bad Record Numbe@Bad File NamCToo Many FileUnprintable Erro!9N#F*~#~Қ8~+ʠ8~#~ښ8+^#V###x8###x8|ʬ8~#fo!8H Internal Error - No Line Number Ñ4*~#H9H at linei88f9>  =H~# =x2?H:k5¿=͏=>=1LwF<=~:=d]#.=1L~:= d]#A=>2?H:k5¿=F#~#fox͏==͆=}=~#d]q=͆=×F͏=>"d]G:o5x͏= ^*p5+~<ʻ==ʻ=###~»=*f5 ^!:=*l5*p5~==/<=====:k5> d]͏=>,d]W*p5#^ ">>+=> ^z{4>{_&>!s5"p5!"H52k5L>!n5~6#w~!l>́>Nc>z9i& 6 G~#ʑ>#ƒ>++͜>0:ڧ>]f4!>>ʾ>p4w>͆F6p9#F>>͗F͗F~#~#fo _p9d- String Space Corrup#N#F*Dyx\G*Dyx\G++`i+V+^_F##6+6+~6  >@++*D"Ds#r+ͯE*D#~_#~WҊGz96r+s##6"D###!D~#foʮG_žG<*D"D*D}o|g6@#s#r#6"D*G*G"D}w>#w##_G++6+6DDik~]#=G H~]# Hs#r*#"*|&)!"*a**ͽ͑QgH*`}/o|/g#"`|͘H)igH!`~wɯ2`͑QHCd͘H*`͘H)i͑QH#d>>=J~y4#ÝHy46H!!`ûH>!!``2H# H!!`Ýb!!`͢I5`>>H>|}+!XJåajIͰi+6!`!C54 ~_#6p9 7C~6#~#fon&͗Fp9zSC}#F~PCs#FCz96|6p9!9>͆FCd^#͡^`ͼ^^#V#^#V#ͼ^`ͼ^^#V#`ͼ^)ip9^C!`ͼ^p9C!9Hghòd^#V#p9Dp9Dp9z,D|,D|Iipi^#VCͬ^:`2`:`2`^#V#cD͕iGNʗDyʗD#~#fo~#fo D#ʖD †D yʠDy<.ڪD)ʪD)͗F͗FDDDDDDDDD)D DDDDD_!D4D5*"``i"`#~+VM--M0OxGVM#~M`xEKMy L>2H[M|LCML"``i"`_I#WdO:HMÓMMҗMP60tI*P+~0ʦM.tIM͑Q>"w#6+M6-/</ M:#p#w#6!H#zYNNOzOP{H=OjLNp#6!H#:@H~ N*N+'NwQ-+$0QN#wQQN++wGNNQN6%NuNQHN1L+6%5IlN͙IdON_xOO*POPM_y]KN_KN{_xNOONOyPOOGO*PN*@H=OPN͂HѯOɯ2`ͯE*D#V#NX!"`i.?x6ű9? y<2$?F~ڃ?ڃ?#~#foy_O #~#foxʇ?w?#f?Ç?!$?4 c?2$?͗F͗F*$?&jh~6#^#V++͗Fo&p9ep9udp9~<6#F~#~#fo _6+wQgJ͋H͗F×F>!>!>!>!>!>^#V#!`H^>B@>B@>B@>B@>B@>^#V#^#V#$^>l@>l@>l@>l@>l@>^#V#!`$^>Ô@>Ô@>Ô@>Ô@>Ô@>^#V#!9$^>ý@>ý@>ý@>ý@>ý@>9!`$^>@>@>@>@>@>kD@~#fo##ͬ^^#V>c2`!TJýg!PJåa!!`åa~_#~W#~OjKg!QHgh=Iɇ<o&͘H)i*`*`mI"``i"`!`^#V#N#F#!TJIhjx{j!`6ͽiwg>EkkæI:?HGw#¦IIûI!!`I`͑Q`͑QI*`||<͑Q*`I͵I!QͯIH{HI/I:`2`:`nR|I:`JJ$J|/g}/o8J!nR:`AJ|I"`>2?H5Iaj7J L}oH͕HYR>2H`h8J~&ʬQ-ʏJ+ʏJ+wQrK.KeʡJEJwQlʹJLʹJqʹJQJ:?HJ>J~%)K#8K!9KdJDJ@KwQ͢QwQKJ_{_D"D~#N#F#?EE _Eyx$E E+++6@#yw#xw+++6###!D~6PEeEDͯE*D#~#~Dz9 6!*D"D~#^#V#ڬEE_rE|—ErE++~_w#~Ww#rEeE*DDM~#^#V# FEøE+zF+{F##{z~#q#p_ʸEyExEDMøE~#EøEYP+++"D6@###{_zW+r+sɷSF*D|6Fz96^#V+"DD#s#r+++r+s##!ZF_F*G{z*G?uF}|~# {FyG#Fx _`FGaG*G*G_F͚GFGaG###çFFH during G.C. Ñ4FH Ñ4H Internal Error ͙I7dOy]KOzWO_K#O1O/< P/>͸HSP>͸Hp#=JP!`\IÆP/I>|I_IgQ?PjI/{_#zW#yO++ҚPI#_Ip#ڌP>PmQ>PN#F#*`/}o|gP"`p#=PPw#p9Hg@^#͡^Aͬ^^#V#p9Ih&A^#͡^,Aͬ^^#V#p9ͪgOA^#͡^{A^#V#^UAͬ^^#V#p9eÇA^#͡^óA^#V#^ÍAͬ^^#V#p9ͽgÿA^#͡^A^#V#^A|p96BK+BPY|6p9BK B o_Az6p9z3B 9B_?Bo _ W}͆F͗FDMͬ^:`fB2`#6:`yB2`#6p9`FԼB~##++G> _+V+^+ʯB+r+saGp9͂B~#^#VÆFB>2B| C+})N#C~#fo :BB!9"=5OK_KJFH͑Q!DIAJ͑Q J@KÏJ#DIIJ@K#JtHċH͑QvII=͑Q IHDGL  1_cƤ~@zZrN vH Tʚ;@B''d #~: wQ wQ wQ0?<=:?HҞQ7-++wQ4ROʽQHʽQ+QQ8JH#QQz9 6M!QQ}0?)))صoQM!RR}4R0? &R? ))))صoRa{ I͑Q:`:`)I:H2H2Hz9 6z96e3 za3* )҉!, *a|ڟʟV <'!X ]3*)^#V#)ͦ3*)^#V#  s#r*#"*|[F[! w!% V6 [zwO[[F[! ~!A[! ^#V! s#rDM>[8[[}hX[q[[`i"H5!["Q5î[^Uz9!> 6p9|6,ʨ[-:N5[*O5!p4"Q5{#Ff$%[![*Q5÷[|}!"H5>6>4>?>=>:>7>5>2>3>@>C>z9o& 6!"H5!9"9%\:[<6\H?6\p\]j\:-]>\2-]P\5\1]+d\~1]x\+1]x\1].]!92-]{\\]O<\:-]ʑ\>\1]2-]y\4]7 "] \ µ\6\\4]6\\6\1]> 1]>]\\>#d\\6.]!9F]x\ x\x<>#w#w#w~WU& p# WKX _p9yUtRS<[p9!S6# XËWp9yU2S!SX! SXtRS[O!uR  ~#1]yW~ W>.1] W:s5 W:t5W> 1]1].]S´W~*6?# X"%S>2N5!^["O5:L5<2L5*J5")S!_X"J5"'Sp9KV*\5|]X##nͩSLX.ͤS*)S[<[=_!\5~#foʌX##{ʢX++xX*\5ͫX"\5q#p#s#4#5++###DM !^5~#foX+V+^##*'S{zڰXBK^#V+"^5! DMX*'S DMpGs#r# 6# xX$a!`>cc2`:`Mckx/F+N+=la!!`Àa!`>q#p#=ƒa!`åa"O_wafaRa*O_Xdʸj:`ʸj!'`N#F͡hcqaGcdx aaMc!`caj0 TeB׳]h!I.k Laj#d)bLad!!`åaU>!`q#~++w+qDbkDNn"~`35zr1{r1h!IXdkyO2'`ãbXdk:`/aҵb/O #~goPY!$ ůwMU[Sѯ[<\!" ^#Vr+sp9}KX}hXS PYS!S`i>,T!$ ~kSMUYp9}hX[!#S! ~+ngp9}hX[! n&*H5~[ZDM$~hS4N#V pPTzw w+s#r#6#6DM! {zVʤTtRw<¢T<\!! {w:[¹TU!! ~tR!& ThST[~# T*H5~#[% ~U+~#5]yq#1] x\> 1]\]] x\{\:[<.]w1f9]>^1]@1].]~ U]> 1]1]#F]p4C*p5 {]#~+ d]~=]*p5!s5"p5d]"p5> d]> d]> ̀4> ̀4*b]/^ Gg^C^~#foE^##S^ Gg^c^q^>~^~+~?~‰^+#Җ^+ ^&)))^#V#!`ͼ^ͼ^w#w#w#w#v<͹>`^>`^ ~#=^!^#~  !\5T]~#fo[x Yy Y~#~+*^5"^5s#rɚ^ **'S|OY! s#r#wYY2!)Y)#Y))Z Z#=Y}_}la)\Z#x\"5Y! "7Y!& "9Y!}o|g[NZbk:;YʔZ[cZͱZDM*9Y*7YZ"7YPYͰZ}o|g*5Y#"5Y1ZͱZDM*7Y*9YZ"7YPYyZ2[*5Y! ~#fo[s#rZ:[Z!Z!# WT~# xZDMQ[!`4#c4/b+6!!``# cɯ# *c*cMc/!`Oyw#EcG:`vc!`Vwz# [cxNcøj!`͉cncxb!`wҸjb~w# ‹cLaj#dêcLad!!`ÝbLaj#dcLad/a!!`Íby2'`!`V_~q+cqcNsY+cc W~w+dd!`d)i#dj!`w#)dk:d}odCdòdodͰi!`F#^#V#NØjͲd}!`~#]dG++Ny k`[djdx>@G2`>ixgKg!HeIhi=ˆdGjU>!`j>ddU>jej!`6ͽig>Ek|~i>dakj!eHgeO ~+~UUT7>*H5T]" N#F+q#p###6 1UMU=FU>w+w!%T7?*H5$ 6#67~[#^#fk_ږUN#~:ʚU++@[y@[[S #U~.UU7ðU#±U2S͗Fz [[> UU> UUp9yUtRS<[!RS> _yU:S!R\S<[R*%S~[#N#F++͗F OʄVIʄVR[*'S|„V!"'S}_hX—VY{hX[zyU ?Y"H5#S> _66MU~V<\Vz͋!|͑!)!,=!͈!(!(*mͭͫ;,0  6#)`Xd(`d`kOi`! k!`y#a`+T`k? kLaj#dÂ`Lad/a!!`Xd`:`k:(`/!`N#FͰi+6  jxeU>"~Shihixͭg!Leͪg8e!HeͪgCf!LeHgCf!Pe gd&X4#]IjreCf!CfQYhڇe!e͌ig 8hڲe!ei!eHg͌i!egg!e g!eͪgCf!eHg׳]b5~P$L~yI jCfhCfkjQfkYfi!fhh|j-f!Cf>fiͽfOh`f>O!`~+>wkQYjlik:`җfhڏfihƁʗf͌iͰg!fgJShQYjkjÇj|Yt&wz^Pc|u~r1jfU>>2`!fgiog)iNg }}{(qnk:`:`7|/G}/O!>,k +k7>{_zW}o|g="k|g}oTkCZQGk o-yOzW{_xGWk>|}+!XJåajIͰi+6!`>c2`!TJýg!PJåa!!`åa~_#~W#~OjKg!QHgh=Iɇ<o&͘H)i*`*`mI"``i"`!`^#V#N#F#!TJ---------------------------------------- Contributed by Randal Dickinson, US ARMY ENGIN DIV EUR ATTEN: EUDDP-S APO NY 09757 FIND.*------- This routine searches the disk for a string of uppercase characters. (Sorry, all you characters have to be uppercase or you'll be ignored.) Anyone with a few hours to kill might futz this one so it doesn't look down its nose at lower case etc. -------------------------------------------------z ijOhgOhi~#j=xLhjNg(g;iKgjk:`j^g/<͌ikͰigEk!`g~_#~W#~OҘj#4ʇj.[kØjG~_#~W#~Oxii;iígjk>ONg;igjlikȯG͡h"`y2`Fo̓i͌i!D*`:`Og`4ʇjh%hg.*`:`Ozg%hg.*`:` hx<=Ek|Ԫj{>2`i/O_yW!`~/woG}_}W}Oij||DM!>))ҫi =£i!`~7w?##wy7O*`*`"`"`ajSX!jʸjJS\E!`Ҹj/jGjejSXNjNjch|cj{_zW}o|gOj"_"_x!_~w#sjljjjU>J!`qx!`jF#~怩Oj 4Ëjgo"`"`js#r#q#pjjjj"``i"`*`*`DM^#V#N#F#xy IT and XSUB. Many handy enhancements and it keeps the .SUB file in RAM for faster execution. The documentation is excellent. It is used on this disk to install ZCPR on your computer. ----------------------------------------------------------------------------- Contributed by Joe Kish FIX.* ------- A fantastic disk utility that allows you do nearly anything on a disk. Read the documentation first and then try it out. It is much easier to use than DU. -------------------------------------  it. Especially exciting on 5MHz modified KayPros. ----------------------------------------------------------------------------- Contributed by Jeff Richards TREK -------- You finally get a chance to command the Starship Enterprise. Phasors, photon torpedoes, warp drive, in fact, just about every thing but Jim Shatner. ----------------------------------------------------------------------------- From Micro Cornucopia et al ZCPR -------- Once you modify your system disk with this, you'll nev#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77 \1++| \E|, \G|, / = õ'!9DM`iw#w! ~#fo͐n}ʃ ! ~#fo͐n&: `i^#Vr+sK !9á v00'7 c(Ê*-w#w*Gw#w*Mw#w! *Q͏ ! *͏ !3 *͏ ! *7͏ !s *b͒ !z *q͒ ! *͒ ! *͒ ! *͒ ! *͒ ! *͒ ! *͒ ! *͒ ͕ *͘ *1w#w͛ \1| ͞ ý *-w#w*/6#6*96#60,0,0,0,0,0,0er go back to "straight" CP/M. This Z80 CCP replacement will look on drive A for a COM file when you are logged in on drive B and page during TYPE etc. Installation instructions in ZCPR.DOC DIF2 SSED DIF/SSED.DOC ----- With these you can update someone elses copy of a program by simply creating a file of the updates (using DIF2) and sending only the differences. He would then incorporate the differences (using SSED2) into his file. Saves on modem time. -----------------------!a{   `OE!y6$ -7rBo&))T])))!yV5:=b#:=#:$=2#v+:<"(">6͋5:&=͋5#*&=|"M1Ϳ5#>6͋5:&=͋5>#͋5>6͋5:'=͋5#*&="<(#>͋5:&=͋5>s͋5>@2=#R1Ϳ5#(,#:==2=)(@#>s͋5#͘(Y#X1:>͋5:&=͋5c1Ϳ5#f1Ϳ52=#(—#>͋5:&=͋5>{͋5c1Ϳ5#(#:$=µ#>}͋5c1Ú#:$=;-͘(#>&͋5͋5f2Ú#:$=$v+è":*K͞+88?'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0------------------------------------------------------ To verify all the files on this disk, type CRC ----------------------------------------------------------------------------- =$,v+2#:$=>$$>͋5v+>͋5>@2$=2#*="<1Ϳ5:=2="<|s$}d$[2Ϳ5z$g$[3Ϳ5>G>)͋5$#͞*D)͏,Ͷ,v++4ʱ$êG0ñ!9DM*Ow#w͐ ! ~#fo##~#fon&͡|ͤ! ~#fo##~#fon&*Os#rͧ7 47!:!R!!Usage: aliens is the level of difficulty from 0 to 9 level 0 is the easiest and is the default 77Ì ÊÑ5Ø "Æ&!ʹͷͺͽ\1++++|  ,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0rookieearthlingspace cadetyeomanlieutenantcommandercaptainadmiralmaster assassin ++17 =,à7 !! \O!Q* * \-!\* * \1>H>ʇ>T>ʒ>`>ʝ>l>ʨ>x>ʳ>„>ʾ!i ! ! ! !! !O !F! \1\/!|* *~#foM9n\3))*W##~#fo#M;n\3))*W##~#fo###M;n\3\O\3 ?`is#r\1+|ʧ͐\M`is#r͐ڻ`i6#6*-~#fo͐s#rM;M9#!k\1!m\3))*W##~#fo\3))*W~#fo!*9w#w\3))*Ww#w*E^#Vr+sY*3^#Vr+s*3w#w\3\IRM9\3))*=~#foAM;\3))*=##~#foAM;M9!oM;M L E A L I E N W E A S E L S ! K L I N K E R T H E B L A C K H O L E ! Bases: %d ÖÓ---\1+|M5\OH*76#6M5*76#6͍|͐*aska&|g}o>z>>,>>c*>>/6>>xB> >.N> > Z>(>f>A>r>A>q~>A>Š>A>1–>G>2¢>b>3®>}>4º>ʘ>5>ʳ>6>\1+|*76#6\1+|*\C))*=w#w\C))*=##~#foM5N\C))*=##~#foM5N\1҅M5M38!>*/^#Vr+s!F!8\/!~ *A*;*-~#fos#rD\/|G!JM5!8! ;*56H#6M2**56#6\1NM5!8!>i \C))*=~#foڴ\C))*=~#foҴ\C))*=~#fok*\C))*=##~#fo)~#fo|ʴ\C))*=##~#fo\C))*=~#f *E67#6\O *7s#r\7\9F\9*7s#r\O*Is#r\I s*I6 #6\O*Ks#r*5w#w\5ڕ!\7\5? *3w#w\3 ڄ\3\5|g}o\5? ! \5 ?\3))*W\7\5?s#r\5 ?\3))*W##\3?s#r*3^#Vr+s*5^#Vr+sÕ*A66#6*;w#w*=w#w*?w#w*36#6*56H#6 '*56#6*7w#w*9#!q*9w#w*G^#Vr+s\3))*=w#wY*3^#Vr+sÊM9$M9$M9k*M;)~#fo|$M;M9\1++|!M9k*M;)w#w!sM9M;M9#!u*9w#wYMi|M9+|M;MgMi*3s#rM;\3\3!!w\3!!*iw#w*-~#foMes#rM;!!*9w#wY*9^#V76#6\1+|*7w#wM9|>*96#6͓\1|S*16#6\1|n*16#6\1|ʉ*16#6\1|ʤ*16#6\1|ʿ*16#6\1|*16#6+7 /=,!9DMM9>>.>>.>+>väM;!!bM;!!cM;!!dYM5###*;s#rM;!!eM;M9!gM;M9#!i*3w#w\37\3))*Wo+8! ;\C))*=##~#fo\C))*=~#fo8! ;\C))*=~#fok*\C))*=##~#fo)w#w\C))*=w#w*G^#Vr+si \C))*=##~#fo\C))*=~#fo+8! ;\C))*=~#fo0 *G^#Vr+s\C))*=w#wa \C))*=##~#fo\C))*=~#fo8! ;*C^#Vr+s\ Bases: %d *ç à7+17 !9DM`i6P#6Mi|/!͛ *3s#r!`,!\30!*i6#6*g6#6 !9w#w\1.M5M3 ! *3w#w\3\In\3))*=w#w*3^#Vr+s9*Cw#w*Gw#w*3w#w\3B!\3 *5w#w\5P1\3k*\5)\3k*Q\5)~#fos#rz! ! *5^#Vr+sù*3^#Vr+sÏ*iw#wLevel:%2d Score: %-5d B L O O D B A T H W E C O M E I N P E A C E ! T H E A L I E N S S T R I K E B A C K !I N V I S I Br+szVM;!!M;!!*-~#fo\O#s#rY!9||   Ú+=,M7|§*5~#foM7s#rM5*56#6*7w#w M5H *56H#6*7w#w\13M5M3͔!͗P+7 =,1/+07à7*Cw#w\C\Iz \G|w\C))*=~#fo|“i \C))*=^#Vr+s\C))*=~#foQ\C))*=##~#fo\C))*=~#fo+8!| ;  *i6#6͐*gs#r*e6Z#6!Mg!͞ \1j!Me!"*͡ *ͤ *e^#Vr+s*g~#foMis#rMg*3s#r͐!\3!MgMi!͞ ! "ͤ *iw#w!9 <=%d=> $"/+0+=,\A#*As#r!7ڗ"\E|J"*=w#w\;|ʌ"\?*?s#r*=6#6*;w#w*Aw#w\A))*W~#fo*3s#r!""%"\3"*-~#fos#r""\?|#\A))*ike back" <4> to play "Invisible Alien Weasels" <5> to play "Klinker" <6> to play "The Black Hole" to quit +7 *++7 !9DMw*&*͐w(ѯgsw+&*͐w)ѯgs*+C,7 !9DM\1w,͐|w,͐w,! 6#6͐>‡,>,>“,>,>Ÿ,>->«,> ->·,>->,>!->,>,->,>7->,>B-]-!_-@,]-!e-@,]-s!o'*͏&*͒&! ! ͌&\O!'*͏&*͒&!2͕&Congratulations %s - you have won at level %dNow let's see how good you are at level %dû'7!9DM͐!͸'*3w#w\3 a(\3*\3*ns\3*n}-(\3**s\3*n}P(\3*+s*3^#Vr+s'o(++7 f(!!i(!(l(!$)l(!Z)l(!)l(!)l(!)l(!*l(!>*l(!n*l(!*l(!*l(! +l(!H+l(!t+l(!+l(Attent!91Ñ1!9DM! ͐ 1-15!9DM͐~#fon}I1!È1͐~#fo*1`is#r͐~#fon}ʁ1͐^#Vr+sn},ʁ1\1͐È1!9à15G0j66!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{4`in}%4! ! s#r! 6#6! s! s! s͐n}-02! ^#Vr+s! 4͐n}0@2! 4͐n&͗1}]2! ͚1`2!! s#r! ^#Vr+sn`is{.¨2! ͚1! s#r! 4! ^#Vr+sn`is`in&͝1}D2U3X3O"3Ch3Sʙ34͐~#fo|3! ^#Vr+s6-͐͐~#foW##^#Vr+s,#\A))*W##^#Vr+s\A))*W##~#fo*5s#rzʁ#\5\MK\O?ڍ#*;6#6\5\3"\=|#!!"\A))*W^#Vr+s*3s#r\5\3"\5\3|g}o\A?!"\A))*W~#fo$\A))*W~#fo$\A))*W##~#fo*5s#r*36#6\3$\5\3|$\A))*W~#fok*\A))*W##~#fo\3)w#w*3^#Vr+s{$\1+| %!k-@,]-!q-@,]-!w-@,]-!}-@,]-!-@,]-!-@,]-\1R-]-!-@,]- OXO XOX \o/ /o\ "M" wMw xx|xx #Ù-7!͖-|ʾ-!͖-*,s!!w,&-+=,7 747!9DM\1ں.\1`is#r*16#6*3w#w\3ڪ.!\3-*5w#w\5Pҙ.\3k*\5)~#fo+|€.!-È.!/-*5^#Vr+sB.*3^#Vr+s.͐*1s#r\1ھ/\1`is#r*16#6*3w#w\37Ҧ/\3))*ion: Alien invasion in progress! Type: <,> to move the laser base left as above, for lefties <.> to halt the laser base for lefties to move the laser base right for lefties to fire a laser beam <1> to play "Bloodbath" <2> to play "We come in peace" <3> to play "The Aliens strs#r! ^#Vr+s! 6 (3! 6(3! 6! ~#fo! n&! ^#Vr+s~#fo! ͔1ѯgs#r4! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s4! n}¬3! 6#6! ^#Vr+s~#fo! s#r͐n}4͐|4! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s3͐6! ! s#r! n}h4! ^#Vr+s!h4! ^#Vr+s! n}_4!0b4! s-4͐! ^#Vr+sns{ʑ4! ^#Vr+sh4! n}4! ^#Vr+s!4! ^#Vr+s6 Û44! ^#Vr+s`ins4! ^#Vr+s`ins1͐6!9\1++| %\A*3s#r\3|]%\3))*W~#fo|E%*3~#fos#r!%\A))*W##~#foM5\Kڄ&\A))*W##~#foM5###\K҄&\A))*W~#foڄ&*3w#w\3\I҄&\3))*=~#fo|s&\3))*=\A))*W~#fos#r\3))*=##\A))*W##~#fo##s#r*G^#Vr+sÄ&*3^#Vr+s%Ø&++17 7͉&! ! ͌&\O&*&\Ok*b!['*͏&*͒&*O^#Vr+W~#fo|ʕ/\3))*W##~#fo\3))*W~#fo-\3))*W##~#fo\3))*W~#fo|g}o\3?-*3^#Vr+s.͐*1s#r!2-!!-* --!9 /+17 !!/\-!&0*/*/%d 40+ñ!!.010!9DM! n&0ͯr0! n&9ͯ|0'1!9DM! y0`is#r!ʷ0! ^#Vr+s͐s#rÄ0!9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{00͐0  5G0!9DM`iw#w! 6#6͐ n! s{ 95! n} G5! ^#Vr+s5! n}-f5! 6#6! ^#Vr+s! ^#Vr+sn! s5|ʧ5͐ ?! nѯg`is#rf5͐͐?÷5!955!9DM͐͐ 6͐^#Vr+s͐ 6͐0 6͐7s!&a6͐ ͐͐ ͉͐5`is͐ ͐͐ )͐5`in&#&a6!9p6G0!9DM`iw#w͐~#fon&m6}ʽ6͐ ?͐^#Vr+snѯg`is#r~6͐6!967!9DM! n&6|6! n&6! n& CURSOR ON, CURSOR OFF AND CLEAR SCREEN STRINGS If your terminal allows turning the cursor on and off and allows the clear screen function, these strings should be patched as with the cursor addressing string. Don't forget to terminate the string with a null(zero). If your terminal does not support one or more of these functions, these strings should be set to nulls. Starting Location String 3827H CURSOR ON 3831H CURSOR OFF 3for each string. CURSOR POSITIONING STRING This string starts at location 381DH, must be null terminated, and allows for up to ten bytes including the null. At the position in this string that the row position is to be located, put an FF hex. At the position in the string that the column is to be located, put an FE hex. This allows for the row and column to be located anywhere in the cursor positioning string and in any order. EXAMPLE: (For a Heath/Zenith Z-19) FIX.DOC Fix is a super routine which gives you a lot of direct control over your disks. You can, for instance recover a file you have erased. And, you can specifically create files that cannot be accessed from the keyboard or that cannot be display on the screen. To use the Fix help command (good documentation), just type HELP(COMMAND NAME) For instance; HELP(RECOVER ERASED FILES) or HELP(DIRECTORY) and so on; HELP, by itself display the list of commands. Enjoy !9DM! n&aͯ07! n&zͯ  |F7""|7 ! ###R7""  Wait a few seconds, and type a CR: $*>Hʮ777*|g}o"zg{o"|g #+|7'z7 777*+++:G_*DM!8o&=y5x5   Ú+=,M7|§*5~#foM7s#rM5*56#6*7w#w M5H *83BH CLEAR SCREEN Use DDT to load the ALIENS11.COM and patch the new strings. A>DDT ALIENS.COM Use the S command to change the required locations. -^C A>SAVE 56 ALIENS.COM This should complete the customization of ALIENS. Enjoy. Don Wilkes, K4ZYP  1B ;Escape character 59 ;'y' FF ;Position for row FE ;Position for column 00 ;string terminator For many terminals the row and column values require a bias to be added to them in the cursor positioning string. These values are located at 3845H and 3846H respectively. EXAMPLE: Location Value 3845H 20 ;Add 32 to row value 3846H 20 ;Add 32 to column valuethis great program.  DOCUMENTATION FILE FOR ALIENS VERSION 1.1 ALIENS11.COM is a patchable version of the original ALIENS game written in BDS C which can be used on most systems with a 24 X 80 terminal. This version does its console I/O thru calls to BIOS instead of thru direct port I/O and therefore can be used with most ported and memory mapped consoles. There are four strings and two other locations that must be patched for a particular configuration. Up to ten bytes are reserved   P-5F#Nah1!*]]!Z*!f*### >T]goM#"R* }CJw#Ò^o&ͭ}]To&|G(o>gz(_>W!9!T]&){ݖOzݞ#YW3333 *t!-:sog&ʦ *tͩ":sog[d >2!4:s!` *p!* B æ *tͩ":sog[R}2s>2!4:s!ʦ *p:og Å *tͩ}2s>2!4:s! :s!og[t~2*p:og ø "n"p}2r}2s>02 }2"*/ :og:= *:ogF ,PRINTF called with invalid formy :  }2B"C*CV^:BwrsK*N_W">og*[K>og*[vog*[K:og*[K"E*Eͩ"G*Gʺ> *E͉"I}2K*I͛2c:c!->-2h>+2h:c!+2i:c!-!i*I͛2c:c!02j:c!9!j8>og>2d:c!02k:c!9!k2l:c!A2m:c!F!m!lʟ:c:dog[Lw:d2d*I͛2c=:c!Hʺ>2K*I͛ :c!O>2K*I͛ :dogR[L~!D ! }2K:dog** **2!T]goR *́"*#"*́[[ʍ*s!!**[~og **;!T]goR 2*D*́"*#"*́[[*[~2:! 2L:!!L:og*M!T]goR *Uâ"!"%GDsMK!ͥ"#DMJP *![%R0 *!#"!!*#GDsMJPSP | } >2'2'OD^#VS(:' 0* n&[(!YD| } >^#VS("*MGJP**"*ȯo>g^o&ͭ{]To&ͭbkFOxy'Ez(!{C%FOxy?Ez(!{C<n2}2>22͛x|2}2z2{2͛gh>!!ҺOx!Gy!!!«:G:nR(.n((0$R(n8R n8R>n(8R( nR s#r_zO_Ty_!c{ozg??zO_0"y_!c0[zW{_>ݦw>ݦw")"'*)V^*'fnV^էR(0at string" " "B * R(*  *D s*D " *B ͩ" *B fn" * R #*B * tu* R * * *B ͉%([ o* +" > 2A *B ͉% [ o* ++" 08Q(:002 *B ͉2A *B ͉G>2 xa8 "> D(&N("O("X("H(U({C(9S([! > >>G: OH* *> :A ͩ 6 1*> :  }2 L* : oM*  *> * *B ͩ" I *> >2@ T: (_ͭ [ :A ͩ  *> T0:@ o [ Y:!͝2*R}2d:dogR}2e>og"f>2d!d4:e!dʌ :dog[L~2c:c!9d :cogAR }2cs :cog0R}2c*f:K_Ẃ:c_W"f# :h!-ʥ *fT]goR"f*f"n"p}2r}2s> 2> 2*ts*n2:r! ! >-2*nT]goR"n *n *t!0*n& :r!M *n}o|g}2*nT"n :r!x *n}o|g}2*nT"n :r!ʣ *n}o|g}2*nT"n *n:r_W}2*n:r_Wͭ"n:!  :Aog R}2 :02*t:og :!-MGJS***,0 >2%*>u6!:% ! p/(!hp/( !hphysical = %d  }ʹ~2~2~2nf">(>2nf"*~62~722n8&"n5&"BK80)xz2P{2Q"!":P2P:Q2Q,*&* DM:Qg:PN*)"*)H#" <)TKB7B0 =_|}/o|/g#͆ ͌~˿͘~#(_͠~#OF#|u  R{0} (>- x( 8G͆͘ y2ts1D͠DM"%*)V^*%tu"*V^~""*fnV^R8*""*fnV^R8 *"*V^~rs"s>2 :O**V^T]!fn_tu d++++##++++"*!ututq#p##q#p"*fnV^R>>2"*fnV^RDM*^# x %s %s  %c&.- 4%s =%s F O%cW.""*ͭ"*">og"*>og"*#"*R[*s!!** **!T]goR *́"*#"*́[Q*s!!**[~og ** !T]goR **́"*#"*́[*[~2:! 2:!!:og*!T]goR *$f*+*"ß**s!!  S:( =Gćy{!>2"!C\>?2hx͠A2|?????????????2!"\͠*#"`ƀo&"xE͠yb"yb *D8 xb[D8x8  x(x0}M܇yD8yXxX~w*&[sTR{(#":r2222:!_!0:(͆ {ͮ:!w:_WogR"*[G*Í*P"">2>2!**W>2!4!:_W:og)["*"*6!*e2:!.*6**m2:!#:og":!#>2>2v:!">_WogR"::!#:>_WogR"*}2:! 2:![!i: 2:"">2*6!2*e2:og>2:! !2*e2:og>2:! ê!-*e2:og>2:! #!2#@_:N :T(L :!4:DA!4: (:{ >:2:9`A!4:2!6> !ͳ7!B~͵A#OA!6! P~ wA+fAÇA!{ ~͵A#{A> ͵A> ͵A!FOxDGy£A> ͵A!{ P> w#«A:N(T(:( ml@O:y ͣA!"fn"!{ "*+"RiB*~#"W???? .B70B0*w#z GB7IB0w#"! 8AA!{ "AA!FN~YC# x y :•BAJC(>72JC!wJC!w!FN !###JCw# x͆k USED Files/Bytes: *&ͯ͆/*ͯ͆k [032381]ɯ2f"!0*[D:(<~24XwSw*#[ *:( ~#( ( #:Sywb ~͘#X~S^*"ͯ͆k`o*>20 x :=2 >2~2#:2*,&444xGyOzW{_ #q#!Du!DsO X~o&)))Dw *:t7#?(7#)[0*0͠ʓ4*0!)[0???????????! w#w#w#wSGbk 6 fnV^RDM[G#~:+ ͝!a:_À=![b:~}2f:"g:*͠ʞ=!:f:*:w*"7;:*7;[k:w*k:["i:*g:!!)[i:*"*͠=!*R"*"5;*k:[5;"i:!)[i:"*5;[k:~2*5;[k:~*͠O>!}*R"5; >ͪ>29;\<*[ʁ>! :9;!-͝ʟ>*[T]goR"[ =2:;::;!+͝>!+@>::;!-͝>!-@*e2:og>2:!->2Ã>2:">![w>![w"""*s*ͩʁ**ͩ&*͉2 : !(2 : !,! 2 : !)! *: ogÁ" ""* ͩa*>og"*#"![a*)["*"*6*͉!.I*6**6 * *L"*ʗ*)["*"**ʫ*.*ʿ*UBIOS SELECT DRIVE BLOCK DIRECTORYDISK PAR y :N!V^*R!"G@ͣA:L(&T("!fn"!{ >ͳ7> 2  { :(O!@"k*"ml*O:yʟC! ~"|ml*#vC> |ml> |mlͣA*>u6*8¶C~ʧCCC!FOxLGy§CW"!{ "*>u6h6z#D*~02 V^">! ͳ74D! " !>Dh6A*çCUNDEFINED>2̈́k!lj:N(WͨkW!lj!">2:N(Z>2!">rH> ~G>*ͣG!"!"!{ "!E.(>7>Qw> ~_@## ~.( ( a8{0 #  ![G#~a8{0 # ɠ]5*[T0:0!-͝M5*0T]goR"0*0*0*024:0 5! Unknown Command" Too abbreviatedʣ5*"0>&![0w*"0*0!)[0*!)[0*"*"*My commands are: 0%I don't know anything about that.WPlease be more specific."I"K"M}2O"P*Is:O!-#ʱ*:Oog:*Iͪ!G*R*IW*R*KL"**)[M"!*.ÍG>>>+2:;::;";;>og*;;[K>og*;;[K**;;[K>og*;;[K"=;"?;*=;*?;[K>og*?;[K>og*?;[K*=;#͠ʇ?>og*?;[K×?>og*?;[K**[K>og*[K>og*[K>og*[K>og*[K͍9"A;>og*A;[K>og*A;[K:og*A;[K**A;[K*:_W"*"*A;*"*>2W:(2k** ʏ@ T@w!4#"*!{ R >7*"*":(#*#"::G**@> @> @*#"!4>͎6~@  -U͸FͣA!"͖BA!fn*8(!fn">͋7!fn"N!fnRDD!~D͠C:N( T(̈́kG:N(5>~G>!ͣG:(=F>~G:( :|ml|̈́kͨkͮkWͨk*!8 !Q"> !\ͳ7!\ @*"> !iͳ7!g@$INIT O:Nȯ=FyFOyO=FO:N>=Fy/=Fy=F}F|F(!ZF!zF:''o>g::62.*&"ˇˏ˗˟˧ ˯˷˿2:=(2>2:|ml>fn}*IU|*##IU*on, and the number of tracks reserved for the operating system. For 2.2 systems, the extent mask and number of checked directory entries are also displayed. 3ERASED FILE DIRECTORY Same is DIRECTORY command, but the files displayed are files that have been erased. These files may be recovered using the RECOVER ERASED FILE command. p4#FINISHED Return to CP/M. 4 FIX BAD SPOTS Fix does two things: (1) Displays the track, sector, block and file (if any) th will happen is the drive will get selected. CP/M will not know that you have selected a new drive, so don't be surprised if DIRECTORY doesn't give correct answers. [track,sector] is optional. If present, track sector will be read. Display of bad file names is automatically turned off by this command. Examples: BIO sel(B), b s(c,3,21), etc. 0BLOCK(block number) Gives the file name in which the block occurs. Examples: block(15 9qMARK BAD SPOT(track,sector) Adds the block corresponding to track and sector in BADSPOT.!!! file. If bad spot file doesn't exist, one is created. This command is used when there is a known bad spot on the disk that for some reason the VERIFY command doesn't find. Examples: MARK BAD(45,6), mark(23,23), m b s(3,16, etc. v:RECOVER ERASED FILE(filename) This function attempts to recover the erased file given by . A check is made to see ####"~0(;~((~E~E>>fnF*##"(> 7~ ~ EE >nfF*ut>Fݓ+ G:NxO>=F=F=FyO=FG:NxO=Fy=F}F|F+~ (#x x,( FIX version 1.7 as of 3 Sep 81 */,1,Breaking out of setmap.N, nY,~0(~k,(Running under CP/M version %h.%h ,~GͣG2>,Parameters for drive %c: ,Sectors per track: %d-%d ,Number of trat contains the bad spot and asks if it should attempt to fix it (by reading the sector, writing the sector, and reading it again). (2) Asks if the user wishes to place the bad block a bad spot file. The user may try to fix a sector as many times as he likes (through yes or no questions). *** IMPORTANT *** The VERIFY command must be called before FIX is called. VERIFY puts all the badspots in an array that is in turn used by FIX. To get back to the main program witho), bl(243, b(10, etc. 1DIRECTORY Gives a sorted directory listing of the currently selected drive. This routine will NOT work properly with disks that have more than 512 directory entries. 1DISK PARAMETERS Displays the disk parameters of the currently selected disk. For 1.4 systems, the following parameters are displayed: sectors/track, block shift factor, block mask, number of blocks, capacity of disk, number of directory entries, directory block allocatiif any of the erased file's blocks have been re-allocated. Re-allocation of a block means that a piece of the file has been destroyed. The file will be recovered anyway. Examples: RECOVER(D.COM), recov(fix.spl, recov(junk.???), etc. ;PRESET DRIVE(drive) This function resets the disk system and selects drive . This enables you to change disks without having to reboot. A typical use for this routine would be if you were verifying a bunch of disks and fixing alacks: %d -Storage capacity: %dk )-Directory entries: %d F-Block shift factor: %d d-Block mask: %d z-+Directory allocation blocks: %s (%hH) -!Operating system tracks: %d -Extent mask: %d -#Checked directory entries: %d .BIOS SELECT DRIVE(drive,[track,sector]) Selects drive directly through the BIOS. The reason for having this function is so you can select a disk with a bad directory. If you use this routine to select the disk, all thatut going through all the badspots, the user can must hit the Escape key (ESC) followed by a carriage return when the computer asks 'Try to fix it?' 7`HELP(command) Displays all commands or one command in detail. For instance, typing 'help' would give you a list of all the commands. Typing 'help(list)' would give you a brief description of what the command 'list' does. As with the rest of the commands, HELP can can be abbreviated (e.g. he, hel, he(di, h(fix), etc.)   l the errors on them. Examples: reset drive(b), r d(p), reset(A, etc. O=SELECT DRIVE(drive) This selects the disk drive to which all subsequent disk accesses will take place on this drive. The default drive is whichever drive is logged in when this program is run. Examples: s d(b), sel(c, s(a, etc. X>TRACK AND SECTOR(track,sector) Displays the file name of the file containing the track and sector . Examples: t a s(12,23), t(76,5, t a(3k: 2 FOO.BAR: Track: 2, Sector: 6, Block: 2 FOO.BAR: Track: 2, Sector: 18, Block: 2 FOO.BAR: Track: 2, Sector: 24, Block: 2 FOO.BAR: Track: 2, Sector: 4, Block: 2 FOO.BAR: Track: 2, Sector: 10, Block: 2 Hitting the Escape key (ESC) at any time will abort. Examples: w i f(hi.ho), w i(d.com, w i(badspot.!!!, etc. lH.0113n4479t:;M=V>?ADEW!Hd͜H*Put new diskette in drive %c:, type CRBi!*X)HUnable to select drive."Xdd_:W!ensity, FIX thinks that ALL the tracks are double density. The current track is always displayed on the screen. If an error is found, it displays the track, sector, and block in which the error occurred, and the file name (if any) in which the error exists. These are stored in an array that is later used by FIX BAD SPOTS. Hitting the Escape key (ESC) at any time will abort. Examples: ver(0,76), verify(45,55, v(34,34, v, verify, etc. DWHAT FILES(track,track) This coMBADSPOT.!!!MTrack: %d, Sector: %d, 0M Block: %d?M File: %S is BAD. YM is BAD.gMTry to fix it? |MFailed to fix. Try again? M Sector fixed.MAdd to bad spot file? MBADSPOT.!!!MBADSPOT.!!!M\\\ Out of directory space.NUnable to close BADSPOT.!!!:N"Track %d, sector %d (block %d)^N now in BADSPOT.!!!NN%s: Track:%d, Sector:%d, NBlock: %d (%hH) N%s: Track:%d, Sec4,15, etc. ? TURN OFF/ON DISPLAY OF BAD FILENAME(switch) This function is here so that you can control whether or not FIX will display the name of a bad file when it encounters a bad sector while doing either VERIFY or FIX BAD SPOTS. When the directory of the disk you're checking has a bad sector in it, you should turn the display off, otherwise, leave it on. is either 'off' or 'on' (upper or lower case). The default is ON. Examples: T O D(OFF), T O(off͝20X*X)[YUI"Need argument of 'OFF' or 'ON'J&Can't find %s as an erased file. mmand displays the names of all the files that have data between the two tracks specified. Hitting the Escape key (ESC) at an time will abort. Examples: what f(10,11), w f(3,76, w files(5,5), etc. EWHERE IS FILE(filename) Displays all the track, sector, and block numbers that occupies. For instance, if the file FOO.BAR occupies all of block 2, the following might appear: FOO.BAR: Track: 2, Sector: 20, Block: 2 FOO.BAR: Track: 2, Sector: 26, Bloctor:%d, OBlock: %d (%hH) %OBlock %d not in a file. DO%s contains block %d hO$No file at track %d, sector %d O %s is at track %d, sector %dO (block %d) OOO7 ### Error. Start track greater than final track.&P, ### Error. No files on system tracks.TP????????.???iP%s is on track: %d P%s is on track: %d P%s is on track: %d P%s is on track: %d *+!}2+͆T*+s*y " *, t off/on(ON, t o(on, etc. AVERIFY(initial track,final track) This routine reads every track between the initial track and the final track. If neither the initial track nor the final track are specified, all the data from the directory track to the last track is verified. Unless explicitly asked for, VERIFY will not attempt to read the system tracks (tracks 0 and 1 usually). This is because track 0 is usually single density and if the rest of the disk is double d K Track:%3d K' ### ERROR: Track: %d, Sector: %dHK Block: %d (%hH) aKError not in a filezKOccurs in file: %S K No bad spots detected.K %d bad blockK detected.Ks detected.KBADSPOT.!!!K\\\ Out of directory space.LBADSPOT.!!!.LBADSPOT.!!!?LBADSPOT.!!!QLBADSPOT.!!!bL&No more directory space available.LBADSPOT.!!!L&No more directory space available.LLLNo errors found.   " !P!>*7 * *+v*p "),*),#"),*r [),ʆQ*p "+,*+,[p Rͥ[),&vQ*+,"+,[!sQ*/,=Q*+,*),)[##Q>\og"-,![-,~!DʽQ*] [p ́*#_*L,"S,!u"U,!u*'!&ʟS!!2"W,![W,~oǵ"Y,![W,~og[Y,"] ![W,~2_ ![W,~2` :` oǵ"b ![W,~2a ![W,~oǵ"[,![W,~og[[,"d ![W,~oǵ"],![W,~og[],"f ! [W,~oǵ"_,! [W,~og[_,"h ! [W,~oǵ"a,! [W,~og[a,"j !"I>og"I*I#"I>og[IF[*I[I~og[IC[!}2I[â[:I!! jog"I>og"I*I#"I>og[Iʢ[*I)[I[Iʟ[!}2In[:I!ʼ[*I!22IZ:I![>\>2I*d [*IR"I[*IR"I*+*I͍W!}"I!!2"I*Iͭ"I*I}2I!}2I>og"I*I#"I:Iog[Iq\:I!Q2IK\*I[I~2I:I!I!#ʕ\!}Ø\>"I*I"I*d s]![I~oǵ[b ͭ"I![I~oǵ[b &\*I"I>og"I2+:+ogAR}2+:+ogog0W*H>2+Q>og"-!*+ͩ&ʂW*+͉! *+"H! *+"H*H*H*H"H/"H"H*Hs>2H>og"H*H#"H> og[H3X*H[H~! X*H W:H!W*H!.>2H*H*H[H~og0X:H!0X>2H*H!.íW"H*H͉2H:H!a2H:H!z!HoX:Hog R}2H:H"H"H*H_"I*H_"I*Hͩ" I*Hͩ" I* I[ I&ʵX>*Hͩ"I!}2 I*Hͩ"I: Iog2I*I&!IY*H4X2I*H4Xͥ*#!* *J^^og"J`"J*+ͩLa*l ")!*n R"+!Áa! *+")!*+ͩsa*)!"+!Áa! *+"+!*)!"J>og"-!>2K*J[+!2K:K!!Kc*J* K!T]goR *r [p R!*J"K*K&2K:K!!Kʥc[!#ʛc*K*J*K!T]goR *K*JY"K*K*K*FK!T]goR :+ogʉb*K}Z!sb*_KÉb*+*xK!T]goR *-!b*K*-!)["*J*-!)[/!*K*-!)[!*-!"-!Pc!}2K>og"J*J#"J*-!R[Jc*J)["[[W,~oǵ"c,! [W,~og[c,"l >!_ !2e,*d R:e,_Ẃ[] ͭ[l "n *d ʁS:a 2f,>!f,͛ogR"t ÜS:a 2g,>!g,͛ogR"t WT*4"W,![W,~og"] ![W,~og"f ![W,~2_ ![W,~2` :` oǵ"b ![W,~og"d ![W,~oǵ"h ![W,~og"l >!_ !2h,*d R:h,_Ẃ[] ͭ[l "n !ͥ"p *p |T*] R"r ÂT*] "r Q>og"-!!!22+!! 2"'!ʻT>og"'!*'!*'!ͭ*i,!T]goR {Q*+s!T8V",:+*I#"I*I[Ip]![I[I~og \ogm]![I[I~og![I[I~og*I!T]goR ]]^![I~oǵ[b ͭ"I![I~oǵ[b &ʻ]*I"I>og"I*I#"I*I[I]^![I)[I \ogZ^![I)[I![I)[I* J!T]goR ![I)[I}ZogS^*+Z^*8J]"kJ*%![f 2qJ:+!!qJ_*%!_*!!"!!*] R"rJ*!![rJ^*#!"#!>og"!!*!!ͥ*#!* !#_*!!*#!*tJ!T]goR !2I:I!I"Y>2 IX*I*H͏*I*H͏: I"I*+ͩOY*I*:I*+sX2KI*CI*+sX2LI:KIog2MI:LIog!MIʕY>2+ýY*NI*+sXogʶY!}2+ýY*VI"zI*zI)[#"|I*|I[p Rͥ"~I"I*I;Y"I*~I[l R[] ́[IR"I>!_ !2I*I:I_Wͭ"I>!_ !og[Í[] ͭ[l "I!:_ _W0[Í[] Y"I!!2*I*I>?! [Iw>2I*+s*I!22I:Iog&2I:I!!Iʿ[*d I[:I!! jogK c>2Kb:KogPc*K*-!)["*J*-!)[/!*K*-!)[!*-!"-!*K;Y[r jc!"KØc*K;Y"K*r [p R*K[p R*J"Kâc!}2Ka*J"J[!c!}2KÔa[*-!c*Kd*-!*K!T]goR *-! d*Kd*K*y *K*y !2ogʞd> og"K*K#"K>og[Ked>*K[y w?d*y !2ogʆd*K/>![y w>og"w f>2v *y *L>! [y w*y !2og&d:v 2v *y *,L:v ! [y wûd*y *=LAog*,!T]goR *r *p *,!T]goR *n *,!T]goR *b ͭ[d ́* -!T]goR *f *'-!T]goR :_ og*D-!T]goR :` og*b-!T]goR *,s!!*,*h ͩ *h *,*x-!T]goR *l *-!T]goR *'!&7V:a og*-!T]goR *j *-!T]goR ".*jH* *+"H*++_2H:Hog*H!T]goR *Hͪ:HogAR}2H:Hog͡V!VͳV"H!! 2"H*+͉_2+:+ogAR}2+:+og!2{Q>og"-!"H*+͉_}*%! ́[ "mJ>og"oJ!}2+:+og2J*oJ !Jʐ_*oJ[kJ~!?#ʃ_*oJ[kJ~2J*oJ[mJ~2J:J!J"ʃ_>2+*oJ"oJ)_*%!"%!![mJ~og2J![mJ~og!J_!"%!d^:+og_>2+*%!R}_!}"J>og"%!>_WogR"!!*l "#!>2+*J^^"J*J*+!![Js>?! [Jw*J_og"J*Jʇ`*+*J!T]goR *J ́"J* [J͘\>*J[ w*!!ͥ*#!* *J^^og"J*J& a*J ́"J* [J͘\>*J[ w*!!  :v ! [y w*y !2>og"w *d e*w [ ~!#2NL*w [t !NL`e*w "w 0e*w [ ~!#e:v 2v >og"w *y *OL:v ! [y w> og"K*K#"K>og[Ke>*K[y wåe*y !2oge*`L/>![y wf*w )[ &2L*w [t !L-f*w "w e*w )[ &2L*w [t !Lf:v 2v >og"w *y *L:v ! [y w> og"K*K#"K>og[Kʪf>*K[y wÄf*y !2ogf*L/>![y w"L>og"w >2v >2L*-!g*L*+*O!T]goR *dO*O!T]goR "O! *+"O! *+"O*O[Oeo*O*O[l zo*$P*O[l ʢo*f ͭY*OY"Oðo*p *OY"O*p *OY"O*O/Z[O&o*OR"Oo*O"O!!2*O*RP>?! [Ow*+s*O!22O>2O*d q:Oog&2dP:O!!dPʽq:O!! jog" >og"O*O#"O>og[Oʬq*O[ ~og[O2eP*O[ ~og[O!eP2fP:O!!fPʩq* R"O*+*O͍W*O[ ~og/Z"O*O*+*gP!T]goR *\N"uN*N" * " *N*+>2v :` og"N>2N*N!2og&2N:N!!NCn>og"yN![N~og"N*d l*yN[ ~!#2N*yN!N2N:N!!Nl*+*N͍W*yN[ ~og"N*N/Z"N*NTZ"{N>og"wN*wN[N2N*N!N2N:N!!Nl[!>l!}2N*{N*N*+*N!T]goR *N*N*N!T]goR *{N;Y"}N*}N"}N*}NY"{N*{N*NY[N&ʹl*p "{N*N"N*wN"wN*NR"Nk*yN"yNÖk*n*yN)[ &2N*yN!; ;FIND.ASM ; ;06/23/79 BY WARD CHRISTENSEN ; ;USED TO DO A CHARACTER STRING SEARCH ;OF ONE OR MORE FILES. ONLY SIMPLE STRINGS ;MAY BE SEARCHED FOR: ONES WHICH CAN APPEAR ;AS A FILE NAME. ; ;COMMAND FORMAT: ; ; FIND FILENAME STRING ; ;FILENAME MAY BE AMBIGUOUS, I.E. *.ASM OR ; CBBS*.ASM ; CR EQU 0DH LF EQU 0AH EOF EQU 1AH TAB EQU 9 ; MF SET 0 ;SHOW MOVE NOT REQUESTED CF SET 0 ;SHOW COMP NOT REQUESTED ; ;(FROM EQU8.LIB...) ;DEFINE SOME MACROS TO MAKE THINGS EASIER ; ;DEFINE DATA>og"L*L#"L*-!R[L j*L)["}Zoggg!}2L*M*+sXogdg jlg>2L*L)[!*L)[/!*M!T]goR *L)["*.M!T]goR :Logg*+*=M!T]goR g*WM*eM*Ls*Lͪ*L+_2L:L!h:L!Yʑh*L)[!*L)[/!Y!2L:+og͡V:+og!2:L!ʄh*zM*Ls*Lͪ*L+_2LÎh*M jh*M*Ls*Lͪ*L+_2L:L!Y j:L!hd!}2L:Log i*M*+sX! i*L*+!T]goR *O[ ~ogTZ"O*O;Y"O>!_ !og[OR"O*OY"O*O*OY"P*O[ ~2P*P:P_W&ʖq*O*+*P!T]goR [!ʩq!}2Oup*O!22O1pCs:Oog&2P:O!!PCs:O!! jog" >og"O*O#"O>og[O2s*O)[ [O2P*O)[ [O!P2P:O!!P/s* R"O*+*O͍W*O)[ /Z"O*O*+*P!T]goR *O)[ TZ"O*O;Y"O>!_ !og[OR"O*OY"O*O*OY"P*O)[ "P*P[P&s*N2N:N!!N*n*+*N͍W*yN)[ "N*N/Z"N*NTZ"{N>og"wN*wN[N2N*N!N2N:N!!Nn[!ʉm!}2N*{N*N*+*N!T]goR *N*N*O!T]goR *{N;Y"}N*}N"}N*}NY"{N*{N*NY[N&n*p "{N*N"N*wN"wN*NR"NIm*yN"yNl:v 2v :v ! [NwLk"O! *+"!O*!O}Z!ʁn*!O*#O!T]goR Ûn*!O*+*BO!T]goR "^O! *+"`O! *+"bO*bO*`OY"dO*dO}Z!n*bO*`O*fO!T]goR -o*bO*`O MOVE MACRO: MOVE from,to,length ; from may be addr, or quoted string ; MOVE MACRO ?F,?T,?L IF NOT NUL ?F IRPC ?C,?F ?Q SET '&?C&?C' ;;TEST FOR QUOTE EXITM ENDM IF ?Q EQ '''' LOCAL ?B,?Z CALL ?Z ?B DB ?F ?Z POP H ;GET FROM LXI B,?Z-?B ;GET LEN ELSE LXI H,?F ENDIF ENDIF IF NOT NUL ?T LXI D,?T ENDIF IF NOT NUL ?L LXI B,?L ENDIF CALL MOVER MF SET -1 ;;SHOW EXPANSION ENDM ;COMPARE MACRO COMP MACRO ?F,?T,?L IF NOT NUL ?F IRPC ?C,?F ?Q SET '&?C&?C' ;;TEST FOR *L!2*d 1i*L)["*w [ sEi*L)["*w )[ *w "w *w [t  j!![y s>![y w*y !2*y *M> og"L*L#"L>og[Lʽi>*L[y w×i>og"w :v 2v :v ! [y w*y !2ogi*M/>![y wg:Log`j:` og[w ́![y s>![y w*y !2og`j*N"0N! *+"2N! *+"4N*4N*2NY"6Nd*d ʱj*6N*w [ sþj*6N*w )[ ![y ~!` ![y w>![y w*y !2*6N*4N*2N*8NO*+*P!T]goR [!/s!}2Or*O!22OqR"O*OY"O*O*OY"P*O)[ "P*P[P&s*  QUOTE EXITM ENDM IF ?Q EQ '''' LOCAL ?B,?Z CALL ?Z ?B DB ?F ?Z POP H ;GET FROM LXI B,?Z-?B ;GET LEN ELSE LXI H,?F ENDIF ENDIF IF NOT NUL ?T LXI D,?T ENDIF IF NOT NUL ?L LXI B,?L ENDIF IF NOT NUL ?I LOCAL ?B,?Z CALL ?Z ?B DB ?I ?Z POP D ;GET TO LXI B,?Z-?B ENDIF CALL COMPR CF SET -1 ;;SHOW EXPANSION ENDM ; ;DEFINE CP/M MACRO - CPM FNC,PARM ; CPM MACRO ?F,?P PUSH B PUSH D PUSH H IF NOT NUL ?F MVI C,?F ENDIF IF NOT NUL ?P LXI D,?P ENDIF B ADDRESS ; RDBYTE MOV E,M INX H MOV D,M ;GET BUFFER ADDR INX H MOV C,M INX H MOV B,M ;BC = BYTES LEFT MOV A,B ;GET COUNT ORA C JNZ RDBNORD ;NO READ ; INX H ;TO BUFFER SIZE MOV A,M ;GET COUNT ADD A ;MULTIPLY BY 2 MOV B,A ;SECTOR COUNT IN B INX H ;TO FCB PUSH H ;SAVE FCB POINTER MOV A,M ;GET.. INX H ;..FCB.. MOV H,M ;..ADDR.. MOV L,A ;..TO HL ; RDBLP MVI A,1AH ;GET EOF CHAR STAX D ;SAVE IN CASE EOF PUSH D ;SAVE DMA ADDR PUSH H ;SAVE FCB ADDR CPM STDMA ;SET DATCHED CMP M INX H JZ NEXTC POP H ;RESTORE ADDR INX H MOV A,M CPI CR JNZ NEXTST JMP NEXTLN ; ;GOT MATCH, PRINT IT ; MATCHED POP H ;KILL STACKED ADDR CALL ILPRT LINENO DB ' ',TAB,0 ; LXI H,LINE MATCHLP MOV A,M MOV E,A CPM WRCON MOV A,M INX H CPI LF JNZ MATCHLP JMP NEXTLN ; ;INLINE PRINT - CALL ILPRT FOLLOWED BY MSG, ;WHICH ENDS IN A: 0 ; ILPRT XTHL ;GET MSG ADDR, SAVE HL ILPLP MOV E,M CPM WRCON INX H MOV A,M ORA A ;END? JNZ ILPLP XTHL RET ; OWS PROCESSING ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK. THIS ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH ;TIME IT IS CALLED. THIS COMMAND WOULD BE USED ;IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE, ;ETC IN WHICH YOU WANT TO PROCESS SINGLE OR ;MULTIPLE FILES. ; ;JUST CALL "MFNAME" (Multiple File NAME) AND THE FCB ;WILL BE SET UP WITH THE NEXT NAME, READY TO ;DO NORMAL PROCESSING (OPEN, READ, ETC.) ; ;CARRY IS SET IF NO MORE NAMES CAN BE FOUND ; ; ;------------------------------------ CALL BDOS POP H POP D POP B ENDM ; ORG 100H CALL START DB 'FIND.COM ' DB '06/23/79' DB 0DH,0AH,'$' START POP D ;GET ID MVI C,PRINT CALL BDOS ;PRINT ID ; ;INIT LOCAL STACK ; LXI H,0 DAD SP SHLD STACK LXI SP,STACK ; ;START OF PROGRAM EXECUTION ; MOVE FCB2+1,STRING,8 NEXTFL CALL MFNAME ;GET NEXT JC EXIT CPM OPEN,FCB INR A JZ EXIT MOVE ' 0',LINENO MOVE FCB+1,FNAME,8 MOVE FCB+9,FNAME+9,3 CALL ILPRT DB '----> FILE ' FNAME DB 'XXXXXXXX.XXX' DB CR,LF,MA ADDR POP D ;GET FCB CPM READ ORA A POP H ;HL=DMA, DE=FCB JNZ RDBRET ;GOT EOF MOV A,L ADI 80H ;TO NEXT BUFF MOV L,A MOV A,H ACI 0 MOV H,A XCHG ;DMA TO DE, FCB TO HL DCR B ;MORE SECTORS? JNZ RDBLP ;YES, MORE RDBRET POP H ;GET FCB POINTER DCX H ;TO LENGTH MOV A,M ;GET LENGTH DCX H ;TO COUNT MOV M,A ;SET PAGE COUNT DCX H ;TO LO COUNT DCX H ;TO HI FCB DCX H ;TO EFCB START JMP RDBYTE ;LOOP THRU AGAIN ; RDBNORD INX H ;TO LENGTH MOV A,M ;GET LENGTH (PAGES) XCHG ;FOLLOWING FROM 'EQU8.LIB'----> ; ;MOVE, COMPARE SUBROUTINES ; IF MF ;MACRO EXPANSION FLAG SET? ; MOVER MOV A,M STAX D INX H INX D DCX B MOV A,B ORA C JNZ MOVER RET ENDIF ; IF CF ;MACRO EXPANSION FLAG SET? COMPR LDAX D CMP M RNZ INX D INX H DCX B MOV A,B ORA C JNZ COMPR RET ENDIF ; ; FROM EQU8.LIB: AS OF 05/06/79 ; ;RDBYTE, HL POINTS TO EXTENDED FCB: ; ; 2 BYTE BUFFER ADDR ; 2 BYTE "BYTES LEFT" (INIT TO 0) ; 1 BYTE BUFFER SIZE (IN PAGES) ; 2 BYTE FC------------ ; ; MULTI-FILE ACCESS SUBROUTINE ; ;THE ROUTINE IS COMMENTED IN PSEUDO CODE, ;EACH PSEUDO CODE STATEMENT IS IN <<...>> ; MFNAME: ;<> CPM STDMA,80H XRA A ! STA FCBEXT ! STA FCBRNO ;<> LDA MFFLG1 ! ORA A ! JNZ MFN01 ; <> MVI A,1 ! STA MFFLG1 ; <> MOVE FCB,MFREQ,12 ;SAVE ORIG REQ LDA FCB ! STA MFCUR ;SAVE DISK IN CURR FCB ; <> MOVE MFREQ,FCB,12 CPM SRCHF,FCB ;<> 0 LXI H,0 SHLD EFCBCT ;ZERO COUNT ; ;BUMP ASCII LINE # ; NEXTLN LXI H,LINENO+3 NEXTADD MOV A,M ;GET DIGIT ORI '0' ;MAKE ASCII INR A MOV M,A CPI '9'+1 ;CARRY? JNZ NEXTNC MVI M,'0' DCX H JMP NEXTADD ; NEXTNC LXI H,LINE NEXTLC PUSH H LXI H,EFCB CALL RDBYTE POP H MOV M,A INX H CPI EOF JZ NEXTFL ;NEXT FILE CPI LF JNZ NEXTLC ; ;READ IN A LINE, NOW SCAN FOR THE STRING ; LXI H,LINE NEXTST LXI D,STRING PUSH H NEXTC LDAX D INX D CPI ' ' ;END OF STRING? JZ M ;BUFF TO HL ADD H MOV H,A ;HL = END OF BUFF MOV A,L SUB C MOV L,A MOV A,H SBB B MOV H,A ;HL = DATA POINTER MOV A,M ;GET BYTE XCHG ;EFCB BACK TO HL CPI 1AH ;EOF? RZ ;YES, LEAVE POINTERS DCX B ;DECR COUNT DCX H ;BACK TO "BYTES LEFT" MOV M,B DCX H MOV M,C ;STORE BACK COUNT RET ; ;SAMPLE EFCB: ; ;EFCB DW BUFF ;BUFFER ADDR ; DW 0 ;BYTES LEFT ; DB 20 ;BUFFER SIZE (IN PAGES) ; DW FCB ;FCB ADDRESS ; ; MUST BE ASSEMBLED BY "MAC" ; ;MULTI-FILE ACCESS SUBROUTINE. ALL   JMP MFN02 MFN01: ; <> MOVE MFCUR,FCB,12 CPM SRCHF,FCB ; <> MOVE MFREQ,FCB,12 CPM SRCHN,FCB ;<> MFN02: ;<> INR A ! STC ! RZ ;<> DCR A ! ANI 3 ! ADD A ADD A ! ADD A ! ADD A ! ADD A ADI 81H ! MOV L,A ! MVI H,0 PUSH H ;SAVE NAME POINTER MOVE ,MFCUR+1,11 ;<> POP H ! MOVE ,FCB+1,11 ;<> XRA A ! STA FCBEXT ;<> RET ; ;MULTI-FILE ACCESS WORK AR\<7=Ɓo&C N] N2h#fo>~# xN *6\w+++##  Reducing the Swelling of the Phone Bill with DIF and SSED November 17, 1981 Chuck Forsberg Computer Development Inc Beaverton OR Lately (if not sooner) it has become obvious that there must be a better and cheaper way to distribute software updates to changing programs than to transmit all of the new files in their totality, even though only a few lines in each have been changed. For some years the Unix differential file print program diff(1) (the (1) refEA ; MFFLG1 DB 0 ;1ST TIME SW MFREQ DS 12 ;REQ NAME MFCUR DS 12 ;CURR NAME ;------------------------------------------------ ; ;MOVE SUBROUTINE ; 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 ; EFCB DW BUFF ;BUFFER ADDR EFCBCT DW 0 ;BYTES LEFT DB 20 ;BUFFER  -----FIND.COM----- by Ward Christensen OVERVIEW: Finds ASCII, upper case character strings in a file. May take a generic file name, thus may search all .ASM files on a disk. Also very useful for finding things in MAST.CAT - for example if you have multiple VDM routines: VDMSCROL.ASM, PRINTVDM.ASM, etc you could FIND MAST.CAT VDM to see them all. USAGE: find b:*.asm alpha will find all occurrences of ALPHA in all .ASM files on B:. Used with LIST.COM which takes a starting line nuFIND.COM 06/23/79 $ !9"1!mkN͈_\<_R 0N!]N!eN----> FILE XXXXXXXX.XXX !"f!~0g}ƀo|g9+~+w+++##~g}o|g~ +p+q2h2|:5>25!\6 N:\2B!6\ N\ !B\ N\!6\ Ners to the section of the Unix Programmers Manual in which it is described) has had a -e flag which provides a set of ed commands suitable for transforming the first file to the second. With these tools, only an update file need be transmit- ted, provided, of course, that both the sender and the receiver had copies of the same antecdent file. I have written a "new" diff called dif.c which manages to operate in the primitive CP/M environment. The editing commands ouSIZE (IN PAGES) DW FCB ;FCB ADDRESS STRING DS 8 ;WHAT TO SEARCH FOR DB ' ' ;END OF STRING DS 40H ;STACK AREA STACK DS 2 LINE DS 128 BUFF EQU $ ;DISK READ BUFER ; ;BDOS/CBIOS EQUATES (VERSION 8) ; RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 RDCONBF EQU 10 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 mber, you can: 1) use find to find a particular part of the code, then 2) use LIST specifying a starting line number just before the part of the code you wanted to see. DEPENDENCIES: Note that FIND is a quickie program - it gets the label to search for from the second FCB so you can't put some special characters in the ASCII string. I.E. find b:*.asm in.to would find IN (since .to would be put as the filetype).   tput in response to the -e option refrence sequential lines in the source files, so they (the commands) can be executed by a stream editor. (The Unix diff(1) creates difference files with non-forward-sequential commands.) To generate a difference file, the command is dif -e oldfile newfile >file.dif The >file.dif redirects the standard output to the file. A + may be susbtituted for > if simultaneous console output is desired. The receiver thure dif and ssed are exactly where you say they are, or else pipes will be broken.) Restriction: Since the BDS Standard I/O library and the Directed I/O package are somewhat confused about translation between CP/M's cr/lf terminated lines and **nixs' \n terminated lines, dif was written to strip cr's from the input in order that only one cr appear on the output. As a result, lines terminated by cr/lf, lf, and lf/cr all come out the same! This would munge files where lf Dif Versions 1.10 and later place hash indices of the RETAINED lines of the antecedent file in the difference output. This allows ssed 1.10 or later to verify correctness of the antecedent file. The new .dif files are compatible with the old ssed, but, alas, not with Unix ed or sed. The array sizes in dif.c may have to be shrunk somewhat to run on a 48k system. For testing, give dif -e filea fileb |ssed filea >filec dif fileb filec *K͞+@O:'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/oen invokes: ssed oldfile newfile Which will result in newfile being created identical to the oroginal newfile. Well, not precisely identical, but identical up to and including the EOF (^Z) character. The dribble after that may change, so CRCK may say they are different. To check, compare the two files with dif. Unix folks with 14 character file names and modification times stored by the filesystem have little trouble keep/cr has a special meaning (MBASIC continuation lines) or where embedded cr's are used (RTTY art). Unix is a trademark of WECO, CP/M of Digital Research.  (fileb and filec should be identical) It ought to work if you said dif -e filea fileb |ssed filea |dif fileb and it does, with version 2.0. Version 2.0 of dif.c adds a -u flag which will unsqueeze filea before comparing it to fileb. Thus you can say sq filea dif -eu filea.qqq fileb |ssed filea |dif fileb Or you can say dif -eu filea.qqq fileb |ssed -u filea.qqq |dif fileb to test dif and ssed. (Be s#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77ing the files synchronized. (If the antecedent files are different, there's no telling what the output file will look like!). For us poor CP/M folks (verrry) patiently awaiting something like Unix to appear magically on out desktops, I propose that the revision or revision date of the antecedent file be placed in the new file adjacent to the new revision or date, preferably on the same line. This way the user may easily verify that he has the correct antecedent.   !a{   `OE!y6$ -7rBo&))T])))!y:=b#:=#:$=2#v+:<"(">6͋5:&=͋5#*&=|"M1Ϳ5#>6͋5:&=͋5>#͋5>6͋5:'=͋5#*&="<(#>͋5:&=͋5>s͋5>@2=#R1Ϳ5#(,#:==2=)(@#>s͋5#͘(Y#X1:>͋5:&=͋5c1Ϳ5#f1Ϳ52=#(—#>͋5:&=͋5>{͋5c1Ϳ5#(#:$=µ#>}͋5c1Ú#:$=;-͘(#>&͋5͋5f2Ú#:$=$v+è":=!0!"yP!"{P`iw#w`i~#fo! ~#fot`i~#fo))yP*5P*s#r`i~#fo))yP##*5P*s#r`i^#Vr+s!9%s Not Squeezed (%s -> %s) %s has invalid decode tree size ,"1+î(n++!9DM! n&);P! s#r! n&)jP~#fo"nP! n&)GP~#fo"rP*rP"rP! n})*MP,*KP"tP*tP"vP! ~#fo~#fo"pP*pP|}! ~#fo"pP*pP! ~#fo "pP*`P}ʼ*pP*vP*tP*rP! ~#fo~#fo! n&!!!!9! n&hPn}E!I!*pP! ~#fo~#fo! ~#fo~#fo! 4ü !"fP!"MP"KP!OP!Ϳ*CP"KP!WP!Ϳ*EP"MP*KP###~#foͣ*MP###~#fo|g}o| *MP*KP|ʌ  *dP*KP~#fo"dP*bP}ʵ *KP!$ *KP"KP*MP"MP9 *aP} *dP!* *_P} !3 !Ͱ* !H !Ͱ*9P|* *9P*9P!d !Ͱ!9dif.c 2.00 (dif 2.0) 11-17-81Usage: dif [-dev] filea {fileb,outfile] -d display lines that match -e generate Editor script -u Unsqueeze filea -v Verbose Can't open %sCan't open %sSp=%x î( ,.û]6!9DM>2_P*`P}U*MP###~#fo*KP###~#fo!L! ! s! sT`is#r`i^#Vr+s*KP"Ts#r`i^#Vr+s*MP"Ts#r! 6#6! 6#6! 6! n}W! n}! n}W! n}k! ~#fo! s#r! ^#Vr+szk`i~#fo*T s#rz! 6k`i^#Vr+s~#fo"T! ^#Vr+s!L! 6*T###~#foh! 6k! n}! ~#fo! s#r! ^#Vr+sz`i~#fo*T s#rz·! 6`i^#Vr+s~#fo"T! ^#Vr+s!! 6*T###~#fo! 6$,v+2#:$=>$$>͋5v+>͋5>@2$=2#*="<1Ϳ5:=2="<|s$}d$[2Ϳ5z$g$[3Ϳ5>G>)͋5$#͞*D)͏,Ͷ,v++4ʱ$̓)c"s Æ v(Ù î(]6(&!û+)ú)`6&!9DM!"9P! ~#fo! s#r! ~#fo! s#r! ^#Vr+szP! ^#Vr+s~#fon}>=! ~#fo~#fon}+M! ~#fo~#fo#"9P! ~#fo! ͡{2`P{2bP{2cP{2aP{2_P*"jP*"lP! ^#Vr+sz6 ! ^#Vr+s~#fo! s#rn}-6 ! ^#Vr+sn}3 ! ~#fon&ͪ>d> >e> >u> >v~#fo! ~#fo~#fo! n&!e!!9!! ~#fo*pP*rPҋ! n&)CP~#fo"pP*`P}ʀ*pP!!*tP|‹ç*pP*tPڿ*pP*vPڿ*`P}ʼ!!*pP`is#r`i~#fo##! ns`i~#fo"pP>2xP!xP5n}*pP#"pP+*nP!!9~#fos{++  *`P}W! ~#fo~#fo! n&!!! n&hP6`i~#fo6#6`i~#fo`i~#fos#r`i~#fo###6#6!`i~#fo! ~#fo`i~#fos#r! ~#fo^#Vr+s*pP+"pP! ~#fo~#fo!!*pP6*ptandard Inputbottom[%d]=%x top=%x %s$a %u . Files are different No differences encountered '%s' Unlinked y )*5Pv Ì )*7P͉ ß l!9DM*}T *}T+"}T*T͜ `is#r! `i~#fo"T*T#| !0u"}T*T͜ "}T| !*}T++"}T*T!96%*î(]6)!9DM$'*5P*vo*?P!}!-!0*5P*! ! s#r! ~#fo*5P3s! ^#Vr+sn}ƒ! *?P!!-*5P*! s#r! ~#fo|! ~#fo *?P!!-Å*`P}A! n&! n&! n&! ~#fo!a! *`P& ! w#w! ~#fo! ~#fo ! ~#fo)T~#fo~#fo! ~#fo)T~#fo###~#fo! ~#fo)T~#fo~#fo! ~#fo)T~#fo##n&! ~#fo)T~#fo! ~#fo!! !9! ^#Vr+sW*!! ~#fo!T! ~#fo|;C! ~#fo! ~#fos#rñ*MP###~#fo*KP###~#fo!! *`P};! w#w! ~#fo! ~#fo;! ~#fo)T~#fo! ~#fo)T~#fo###~#fo! ~#fo)T~#fo~#fo! ~#fo)T~#fo##n& >& - !bP40 !aP40 *"jP!cP40 !`P40 X öÅ! ~#foX ! ~#foҮ !6 !Ͱ!T !Ͱ! !Ͱ! !Ͱ! !Ͱ! !Ͱ!ͳ!)H! ~#fo~#fo"?PͶ#| ! ~#fo~#fo! !Ͱ!ͳ )H"5P! ~#fo++|\ !/L! ~#fo##~#fo"APͶ#|R ! ~#fo##~#fo! !Ͱ!ͳY /L"7Ph *"lP! "AP*cP}y *"jPͼ!"=P";P"dP{2iP{2hPd"CP"pP"TP"GP"EP"\P"IP*`P} `i6`in& `in&)GP~#fo`in&)CP~#fo`in&! !Ͱ`iP`i~#fo! s#rzK`i~#fo!! ~#fo`i~#fo;s#rU`i~#fow#w`i~#fo###! ~#fo~#fos#r! ~#fo`i~#fos#r*`P&*pP! ~#fo`i~#fo~#fo`i~#fo! ~#fo~#fo! n&!!!9!`i~#fo`i~#fo! s#r! ~#fow#w*pP#"pPE!9File %d line %d q=%x qq=%x qqq=%x p=%x Getline called after E-O-F %d %3d fp=%x hash=%04x next=%x p=%x Wrapped: p=%x Buffer Filled EOF on file %d at line %d **EOF** Line %d is too long %d %3d gp=%x hash=%04x len=%3d   ! ~#fo)T~#fo! ~#fo!! !9! ^#Vr+sÌ!! 9Difference at %d:%d Dodiff Quantity=%d k't=%d w'a=%d w'b=%d HTBL %3d:addr=%x f=%d h=%4x l=%3d nxt=%x Can't find match at a:line %d b:line %d HTBL %d:addr=%x f=%d h=%4x l=%3d %.30s û!9DM! ~#fo~#fo|<! ~#fo~#fo! ~#fo! ~#fo##n& ! ~#fo~#for)!"T*yT#"yT*5Po"{T#|Ÿ!!"yT*T))yP*{T|g}o)~#fo"T*T))yP*{T"{T|g}o)~#fo"T*T|y*T#|ʾ#+7$>K$Ö%! ~#fo͐)~#fo#n}0#f$* ! ~#fo͐)~#fo#f"#|€#! ~#fo͐)~#fo#!%!i"l"*6!%! ~#fo͐)~#foo"|»#*n&|g}os$*##4! ~#fo͐)~#fo#*###s#r! ~#fo͐)~#fo#n}4$! ~#fo͐)!%s#r! ~#fo͐)*s#rK$*#n&|g}os! ~#fo͐)~#fo#n}v$!%!i"l"! ~#fo͐)~#fo#r"*! ~#fo͐)~#fo#u"#|$! ~#fo͐)~#fo#!%!i"l"*#4w}m%͐! s#r͐#r*`P}0! ~#fo! ~#fo*fP!!!! ~#fo|*fP*KP###~#fo!!! ~#fo+|ʯ!,! ~#fo‰!$ï*fP*KP###~#fo! ~#fo+!!*fP! ~#fo"fP! ~#fo|~ ! ~#fo|*KP###~#fo *dP*MP###~#fo+!! *dP!!! ~#fo###~#fo! ~#fob ! ~#fo! ~#fo! s#r !!*fP! ~#fo"fPË *dP!!p!*?P*KP###~#fo!!*KP! s#r! ~#fo###~#fo! ~#fo ! ~#fo!"! ~#fo! s#rò *(s#rz)!͐##w#w͐~#fo!9DM`iw#w! ~#fo͐n! ~#fo͐n}…)! ~#fo`i^#Vr+sn}‚)!ñ)9)! ~#fo͐n! ~#fo͐nѯgWñ)!9)0Á-!y9DM! `iͽ)`i)!9)&7v7!9DM͐| *)*͐+++|"*!)*͐##^#Vr+szL*͐^#Vr+sn&*!͐͐~#fo)`is#r!ډ*͐##^#Vr+s*͐##͐?+s#r͐͐s#r͐^#Vr+sn&*!9*)!9DM͐*`is#rz"+͐*"T*T!*T!"}T!c"yT!9DM! ~#fo~#fo~#fo! ~#fo~#fo~#foc!! ~#fo~#fo~#fo! ~#fo~#fo~#foҐ!! ~#fo~#fo##n! ~#fo~#fo##nѯgW+)î(n+ú)Ï'Á-!9DM! s#r! s#r! ~#fo)T! s#rT! s#r! ~#fo! ~#foG! ~#fo~#fo##n}:8! ~#fo##! s#r! ~#fo! ~#fo8! ~#fo~#fo##n}{)! ~#fo~#fo~#fo! ~#fo~#fo~#foʦ)! ~#fo~#fo###~#fo! ~#fo! ~#fo~#fo###~#fo! ~#fo)! ~#fo~#fo~ ~#foG%! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+s$͐ ^#Vr+s`i^#Vr+s*^#Vr+sÓ%͐ ͐s#r! ~#fo͐ ~#fo)w#wá%! ^#Vr+s`i^#Vr+s"!9Can't open %s <8~# x«8 ><8~+ x8|}8):7:,*8:*9 n}3! 6#6! ^#Vr+s~#fo! s#r͐n}u3͐|u3! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s+3͐6! ! s#r! n}3! ^#Vr+s!3! ^#Vr+s! n}3!03! sÑ3͐! ^#Vr+sns{3! ^#Vr+s3! n}&4! ^#Vr+s!&4! ^#Vr+s6 3<4! ^#Vr+s`insR4! ^#Vr+s`ins31͐6!9!9DM! ^#Vr+szʱ4͐n`is! ^#Vr+s͐ ns! ^#Vr+s`insl4!94ú4!9DM͐͐ 5͐^#Vr+s͐ 4͐05͐*K͞+@k)_Q'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o! ns&!͐͐~#foE.8/!͐##6#6͐͐s#r͐^#Vr+s! ns&Å/ 8È88!9DM͐Ҡ/!ý0͐##~#fo¹/!ý0͐##~#fo`is#r͐͐͐~#fo|/͐0!ý0͐+?`is#r͐##~#fo|ʖ0!͐͐͐/͐##~#fo͐s#r͐~#fo͐s#r!!͐~#fo͂/ý0͐##6#6͐͐s#r!ý0!9!9DM! n&Aͯ0! n&Zͯ1ú4d5Ó}|2q 29(9:qw#9! {w7*!9& 6C#6O#6Ms9*|‰9!\&Û9!\&*|›9!!l&!~#fo9> +9#~¸9##ì9a{ !p9!*w#9:**9*!ѷ! , FNxg>GoyM:$7s!&[5͐ ͐͐ ͉͐ͽ4`is͐ ͐͐ )͐ͽ4`in&#&[5!9!9DM! n&0ͯڏ5! n&9ͯÙ5d5!9DM`iw#w͐~#fon&͖5}5͐ ?͐^#Vr+snѯg`is#rç5͐5!95.6!9DM! n&5|#6! n&(6! n&!9DM! n&aͯY6! n&zͯ  !\&!7*!6&*!6&6!, !\&!TELk76D9î(]67*^#V#z6+V+^+6*#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:7755!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{U4`in}%?4! ! s#r! 6#6! s! s! s͐n}-”1! ^#Vr+s! 4͐n}0¤1! 4͐n&0}1! 01!! s#r! ^#Vr+sn`is{. 2! 0! s#r! 4! ^#Vr+sn`is`in&1}D82Ut2X}2Oʆ2C2S2)4͐~#fo|t2! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 Ì2! 6Ì2! 6! ~#fo! n&! ^#Vr+s~#fo! 0ѯgs#ru3! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+su3!  !a{   `OE!y6$ -7rBo&))T])))!y:=b#:=#:$=2#v+:<"(">6͋5:&=͋5#*&=|"M1Ϳ5#>6͋5:&=͋5>#͋5>6͋5:'=͋5#*&="<(#>͋5:&=͋5>s͋5>@2=#R1Ϳ5#(,#:==2=)(@#>s͋5#͘(Y#X1:>͋5:&=͋5c1Ϳ5#f1Ϳ52=#(—#>͋5:&=͋5>{͋5c1Ϳ5#(#:$=µ#>}͋5c1Ú#:$=;-͘(#>&͋5͋5f2Ú#:$=$v+è":=sop1=%d op2=%d cmd=0%o linno=%d cmdcrc=%u =ëty%!9DM*SM!L1`is#rzz>2RM*OM}w!!4!L7#|!!4!:*3L#"3L`i^#Vr+s!*2RMEOF on old file Uë÷ty%*J!LF||!!L>2QM*L}.•*L& ڕ!LO#|¸!!L!R*3L#"3LVUnexpected EOF on stdin Write Error!"]Q*UQ#"UQnsqueeze infile -v Verbose Can't open %sAt line %d: Can't back up to %d CRC error on Antecedent File %u should be %u '%s' is not the correct Antecedent Illegal command %sDifference file garbled or not made by dif -e Ssed finished */L !9DM*YQ- *YQ+"YQ*[QÀ À  `is#r!^ ͐"[Q*[Q#|U !0u"YQ*[QÀ À  "YQ|r !À À *YQ++"YQ*[QÀ !9Þ Ùâty%!9DM͌ ͏ */L͒ v *1L! !͕ !͘ */L͒ ! ! s#r͐*/L͛ s! ^#n&|g}os! ~#fo͐)~#fo#n}<!!/2! ~#fo͐)~#fo#8*! ~#fo͐)~#fo#;#|¦! ~#fo͐)~#fo#!!/2*#4w}3͐! s#r͐͐ ~#fo ! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+s͐ ^#Vr+s`i^#Vr+s*^#Vr+sY͐ ͐s#r! ~#fo͐ ~#fo)w#wg! ^#Vr+s`i^#Vr+sË!9Can't open %s $$>͋5v+>͋5>@2$=2#*="<1Ϳ5:=2="<|s$}d$[2Ϳ5z$g$[3Ϳ5>G>)͋5$#͞*D)͏,Ͷ,v++4ʱ$̓)) <ty%ë É +C!9DM͐! ͡*"SM{2PM{2OM! ^#Vr+szl! ^#Vr+s~#fo`is#rn}-l`i^#Vr+sn}i͐n&ͧ>uF>U>vR>\c!PM4f!OM4fv͐+|! !ͪ! !ͪ! !ͪ! !ͪ! !ͪ! !ͪ!ͭ!)H! ~#fo~#fo"1LͰ#| *1L! !ͪ!E*/L"WQ#|!!"UQ*]Q))UM*WQ|g}o)~#fo"]Qn*]Q))UM*WQ"WQ|g}o)~#fo"]Q*]Q|*]Q#"]Q*]Q’!Õ*]Q!"YQ!c"UQ!9DM͐! s#r͐ !!9~#fo`is#r> > >>>>> >H_!b! ^#Vr+s͐s! ^#Vr+s6͐͐b! ^#Vr+s͐s_ÿ!9q,!9DM`iw#w*MMn}.–*MM#"MM*3L*MMn}$­*MM#"MM!}*MMn&n|͐ ?*MM#"MM+n&`is#rí͐!97*N#"*#Vr+sn} */L͒ ! s#r͐|4 ͐N *1L! !͕ !͘ !"UM!"WM`iw#w͐͐Ү ͐))UM*/L͒ s#r͐))UM##*/L͒ s#r`i^#Vr+s` !9%s Not Squeezed %s has invalid decode tree size të÷k<:>29L*OM}$!":L*3L!! *QM}>* !?L |X*OM}S!! !?L"MM "7L"5L*MMn},*MM#"MM "7L*MM#"MM+n& }2>L*MM#"MM+n} ²>29L*MM ":L*OM}*:L*3L*>L&*7L*5L!?L!! !9!%d:EOF on stdin %w&|g}o|!w}ʇ*!**!!w}ʇ\!s#r\w#w\\tempin.$$$tempin.$$$tempout.$$$L}aS >i2>L*5L#"5L*3L*5L{ *5L*3L!, !ͪ; *3L*5Lҗ *RM}— ͼ{ *9L} *:L*L}i *7L+"7L#*3L *RM} Ϳ *>L}c *>L}i P *>L}dP !?L! !ͪ! !ͪ!ͭ6 *RM}a ͼS ! !ͪ!ͭ!9ssed.c 2.0 11-4-81 Usage: ssed [-v] infile [outfile] Editing commands on stdin Edited output on stdout -u U|)yo|g}o"*+"|*>ëty%[|%!9DM*##s*#s*s! ~#fo͐ ~#fo)*s#r! 6#6`i6#6͐͐ ~#fosw}ʫs! ~#fo͐)~#fon}<|ʄ+>\! ~#fo͐)~#fo#n},* ! ~#fo͐)~#fo#,#|F! ~#fo͐)~#fo#!|!/2*6!! ~#fo͐)~#fo5|*n&|g}osë*##4! ~#fo͐)~#fo#*###s#r! ~#fo͐)~#fo#n}! ~#fo͐)!s#r! ~#fo͐)*s#r*  !a! n&!aFile output error; disk full? B!9DM! n&?|i! n& n! n&}, Û#!y9DM! `iw͐`izâ!9ñN&!9DM͐!͐ͮs#rz!͐##w#w͐~#fo÷;&Ò&!9DM͐|͐+++|+!͐##^#Vr+szU͐^#Vr+sn&!͐͐~#fo`is#r!ڒ͐##^#Vr+s͐##͐?+s#r͐͐s#r͐^#Vr+sn&!9!9DM͐`is#rz+"͐! ^#Vr+sns{,#! ^#Vr+s#! n}]#! ^#Vr+s!]#! ^#Vr+s6 6#s#! ^#Vr+s`insÉ#! ^#Vr+s`insj ͐6!9á#s!9DM! ^#Vr+sn`is{#`in} #͐! ͞#͐`in&͞##|#!#é#!#!9 $$!9DM͐͐ [$͐^#Vr+s͐ H$͐0P$͐7s!&æ$͐ ͐͐ ͉͐$`is͐ ͐͐ )͐$`in&#&æ$!9õ$,!9DM`iw#w͐~#fon&Ͳ$}%͐ ?͐^#Vr+snѯg`is#r`is#r͐͐͐~#foͳ͐=!͐+?`is#r͐##~#fo|!͐͐͐Ͷ͐##~#fo͐s#r͐~#fo͐s#r!!͐~#fo͹͐##6#6͐͐s#r!!9!9DM! n&Aͯ( ! n&Zͯ; $,ï$%!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʌ#`in}%v#! ! s#r! 6#6! s! s! s͐n}- ! ^#Vr+s! 4͐n}0 ! 4͐n&2 } ! 5 !! (:**)*!ѷ! , FNxg>Goyi)$#͐! s#rz+͐?͐1!1!9@,!9DM`iw#w! 6#6͐ n! s{ s! n} ! ^#Vr+sW! n}- ! 6#6! ^#Vr+s! ^#Vr+sn! s=|͐ ?! nѯg`is#rà͐͐?!9U!9DM͐n}*! ^#Vr+sn&!9DM! n&0ͯW! n&9ͯ!9DM`iw#w! ~#fo͐n! ~#fo͐n}µ! ~#fo`i^#Vr+sn}²!i! ~#fo͐n! ~#fo͐nѯgW!9'!9DM͐͐$͐ %!9%J%!9DM! n&%|?%! n&D%! n&!9DM! n&aͯu%! n&zͯ  !\&!7*!%&*!%&%!, !\&!TELk7%`(ty%7*^#V#z&+V+^+&*%!-&!%%Broken pipe 7:O*o`7,2q*&:q):ʊ&=ʊ&=r:qo&7:)~:,"s!"u*|&**s&! ~&6*u*+"*"*us#r! ^#Vr+sn`is{.C!! 5 ! s#r! 4! ^#Vr+sn`is`in&8 }Do!Uʫ!Xʴ!Oʽ!C"S4"`#͐~#fo|!! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 !! 6!! 6! ~#fo! n&! ^#Vr+s~#fo! / ѯgs#rì"! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+sì"! n}G"! 6#6! ^#Vr+s~#fo! s#r͐n}ʬ"͐|ʬ"! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sb"͐6! ! s#r! n}#! ^#Vr+s!#! ^#Vr+s! n}"!0"! ss#rz!͐͐s#r͐##6#6͐~#foH9'!9DM͐b!͐~#foEU;&<'!9DM͐+|Ÿ! n&v͐++|½! n&!y͐+++|! n&!y͐++++|! n} ! !y! n&!y͐##^#Vr+szE͐^#Vr+s! ns&!͐͐~#fo|o!͐##6#6͐͐s#r͐^#Vr+s! ns&ü<'ä''!9DM͐!͐##~#fo!͐##~#fo#"uô&'|%N&7* '\!*'#7:)~:,"s!"u*|*uʢ'*~#y'"*s*u¢'#"u*+"f'7*|DM**''><'~# x' ><'~+ x'|}'E)7:,*':*(}|2q N(D(:qw?(! {w7*!9& 6C#6O#6M(*|¥(!\&÷(!\&*|·(!!l&!~#fo(> +(#~(##(a{ !p)!*w#  1 - - XXXX X XX X *** X XXXXX X ***** X XXX XX XXXX ******* XXX XXXX XX XX X ****** XXXXXXXXX XX XXX XX X **** X X** X X XX XX X X***X X //XXXX X XXXX X // X  XX *- *XX X X * *X* X X X * *X * X X X * * X** X XXXX X * * X** XX X X * ** X** X XX X * ** X* XXX X X * ** XX XXXX XXX * * * XXXX X M; bdos equ boot+5 fcb equ boot+5ch defbuf equ boot+80h tpa equ boot+100h stack equ tpa ; org tpa ; ; start: lxi h,0 ;save stack pointer dad sp ;put stack in hl shld old$stack-offset ;save it lxi sp,stack ;get new stack ; ; stack saved so program can return to CCP without ; intervening warm start. ; lda fcb+9 ;get first char of extension cpi ' ' ;if ' ' then change to .COM jz no$type cpi 'C' ;If there is an extension, jnz not$right ;make sure it's .COM lda fcb+10 ;ch XX X // X XXXXXXXXXXXXXXXXXX/ X XXX// X X X X X X X X X X X X X X X X X XX X X X X X XXX XX X XXX X X X X X X X X X XX X XXXX X X XXXXXXXX\ XX XX X XX ; title 'PASSWORD.ASM' ; page 60 ; ; ; PASSWORD.ASM Version 1.0 ; By Bo McCormick 8/6/81 ; ; This is a program that adds password protection ; to programs. Format: ; ; PASSWORD name_of_file ; ; Then answer the prompt with the password to be ; applied to the program: ; ; Password : enter password here ; ; If everything goes well, the program will be saved to disk. ; If not, a message is printed and control is passed ; to the CCP. ; ; The good part of this is, when you type in tX * * * X X X =======******* * * X X XXXXXXXX\ * * * /XXXXX XXXXXXXX\ ) =====********** * X ) \ ) ====* * X \ \ )XXXXX =========********** XXXXXXXXXXXXXXXXXXXXXX eck second letter cpi 'O' jnz not$right lda fcb+11 cpi 'M' ;last letter jz is$com ;if it is a COM, then cont. not$right: call end$mes ;it's not a com file, so tell ; db cr,lf,'Must be a command (.COM) file' db cr,lf,eos ; end$mes: pop d ;get address of message mvi c,mesout ;PRINT STRING command call bdos ;print error message ; finish: lhld old$stack-offset ;get old stack sphl ;put it in HL ret ;return to CP/M ; no$type mvi a,'C' ;if there was space, change sta XX X X X XX XX XXXX XXXXXX/ X XXXX XXX XX*** X X XXXXXXXXXXXXX * * X X *---* X X X *-* * XXX X X *- * XXX X *- *X XXX *- *X X XXX *- *X X he program ; program name next time, instead of running the program ; right away, the program asks you for the password. If you ; reply with something other than the original password, the ; program doesn't run, and it returns to the ccp. ; ; ;EQUATES mesout: equ 9 ;BDOS functions incon: equ 10 open: equ 15 close: equ 16 delete: equ 19 read: equ 20 write: equ 21 setdma: equ 26 ; cr equ 0dh ;ascii values lf equ 0ah eos equ '$' ; boot equ 0 ;0 for standard CP/M ;4200H for ALT. CP/   fcb+9 ;to COM mvi a,'O' sta fcb+10 mvi a,'M' sta fcb+11 ; is$com mvi a,0 ;zero record count sta fcb+32 mvi c,open ;OPEN file command lxi d,fcb ;load address of FCB in DE call bdos ;Open file inr a ;successful? jnz open$ok ;if so, then continue call end$mes ;if not, then tell ; db cr,lf,'Cannot open file',cr,lf,eos ; open$ok lxi d,buffer-offset ;point to where program goes r$loop: mvi c,setdma ;SET DMA command push d ;save it call bdos ;and tell CP/M lxi d,fcb tor ; mvi c,close ;That's it. Close the file lxi d,fcb ;point to FCB call bdos ;do it jmp finish ;goto finish ; ; n$start: offset equ 100h-n$start ; ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; %% WARNING - %% ; %% From now on, all labels are in %% ; %% the form: %% ; %% LABEL EQU $+OFFSET %% ; %% This is to allow the program to run at100H length jnz mploop ;if not zero, then next char xra a ;zero a sta fcb+12 ;zero bytes in FCB sta fcb+14 sta fcb+32 mvi c,open ;OPEN file command lxi d,fcb ;point to FCB call bdos ;open the file lxi d,n$start ;point to new program start ; push d w$loop1 pop d ;get DMA push d ;put it back on stack mvi c,setdma ;SET DMA command call bdos ;tell CP/M lxi d,fcb ;point to FCB mvi c,write ;WRITE SECTOR command call bdos ;do it pop h ;get DMA address from stack lxi d,xi d,newbuf+1 ;point to user's input mov b,m ;get length ; c$lp equ $+offset ldax d ;get char cmp m ;are they the same? jnz boot ;if not, restart inx h ;point to next characters inx d ; " " " " dcr b ;decrement length jnz c$lp ;if not done, then loop ; ; Now we move a segment of code to a part of the default ; buffer. This segment moves the actual program down to the ; TPA ; lxi h,n$mv ;point to code lxi d,defbuf+20h ;point to new postion mvi b,n$m$len ;leng;point to FCB mvi c,read ;READ sector command call bdos ;do it pop d ;get DMA address back ana a ;EOF? jnz done$read ;if so, then ask for password lxi h,80h ;length of sector dad d ;bump DMA xchg ;put new address in DE jmp r$loop ;and read some more ; done$read: xchg ;dma ==> hl shld end$prog-offset ;save last address gpasag call get$pas ;print password message ; pas$mes db 'Password: ',eos ; get$pas pop d ;get address of message mvi c,mesout ;PRINT STRING functio%% ; %% when it is saved by the earlier portion. %% ; %% ALL new labels added MUST be in the form %% ; %% LABEL EQU $+OFFSET for this program to work %% ; %% properly. %% ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; ;This is portion of the program is placed at the beginning ;of the program to be PASSWORDed. When it is executed, it will ;ask for a password. If the password is incorrect, the program ;warm starts. If the passwo80h ;length of sector dad d ;HL has new DMA push h ;put it on stack mov a,h ;this is to get 2's complement cma ;of address. We are subtracting mov d,a ;the current address from the mov a,l ;high address. If the high byte cma ;<1 , we are done mov e,a ; inx d ;Now 2's comp. of address in DE lhld end$prog-offset ;get ending address dad d ;Subtract (add 2's comp) mov a,h ;get high byte inr a ;is it FF (-1)? ana a ;set flags jnz w$loop1 ;if not, write another secth ; move equ $+offset mov a,m ;get byte stax d ;save it inx d ;point to next addresses inx h ; " " " " dcr b ;decrement length jnz move ;if not done, loop jmp defbuf+20h ;go to segment ; n$mv equ $+offset ;segment that gets moved lhld old$stack ;get stack pointer push h ;save it on stack lxi h,buffer ;get start of actual program mov a,h ;We have to compute the length cma ;and because X-Y equals mov d,a ;X + Two's complent(Y), we have mov a,l ;to find tn call bdos ;print it lxi d,defbuf ;point to default buffer mvi a,8 ;tell CP/M max chars stax d ;put it there mvi c,incon ;READ LINE command call bdos ;do it lxi h,defbuf+1 ;point to length lxi d,password-offset ;point to storage lda defbuf+1 ;get length ana a ;set flags jz gpasag ;if 0 then ask again inr a ;plus 1 for length byte mov b,a ;put length in B mploop mov a,m ;get char stax d ;save it inx h ;increment pointer inx d ; " " dcr b ;decrement rd is correct, the program is moved ;to the TPA and executed. ; lxi h,0 ;save stack pointer dad sp ;stack is in HL shld old$stack ;save it lxi sp,stack ;get new stack call ot$pw ;print password message ; db cr,lf,'Password :' db eos ; ot$pw equ $+offset pop d ;get address of message mvi c,mesout ;PRINT STRING command call bdos ;print it lxi d,newbuf ;point to input buffer mvi c,incon ;READ LINE command call bdos ;read it ; lxi h,password ;point to actual password l  he 2's comp. of the cma ;first address mov e,a ; inx d ;Y is in DE lhld end$prog ;get last address dad d ;subtract (add 2's comp) mov b,h ;put length in BC mov c,l ; " " " " lxi d,tpa ;point to TPA lxi h,buffer ;point to first address n$m$lp equ defbuf+20h+$+offset-n$mv mov a,m ;get byte stax d ;save byte inx h ;increment address inx d ; " " dcx b ;decrement length mov a,b ;check for zero left ora c ;Are we done? jnz n$m$lp ;if not, loop sth file - ! ~T #M M 2 2 2 2 ! >2 3o: : @ ***No CRC Files found***$> ʉ ʉw#: <2 P6: .6@ Can not parse string ! ~ʽT #ñM ! > 6 #6^#6! ~T #! 4M #x] #e w~ T #>2 @ - s M@ File not found ! 4 >2 o: G: „: G: „@ *Match* 2 ! 4@ <-- is, was --> : ) > T : ) M 2 ! 4<2 ~# @ Not a space between CRC values<2 G-CATALOG???RROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2|: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2h2|2   ~$#~# x  : F} *}= ">͇1 ].”#””͡”››tK››͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›, › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~#CRC.COM 5.0 6/18/82CRCKFILE???!9" 1 M @ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :] O@ ++Searching for CRCKLIST file++@ Now searching for "CRCKFILE" file++ !  1 .) F!  ͡]͸! ͔0CRCKLIST???CRCKFILE???!9" M à*,*.}|ډ!".*,{z{** u*.".G*.",!".***,}>*.#".ɯ22)! ",". <  NO FILECRC FILE$!   >. @ Checking wi match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ * d͔  ͔ 0T  Җ Wyʩ 0T 0ztiil!9"1:e WC':fO':gMfL Must be a command (.COM) file $ *>C2e>O2f>M2g>2|\<L Cannot open file $\ѧ­!Ò"ͿPassword: $ > !:ʱ2 s : ~# ++FILE NOT FOUND++$: F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  w# !]͐ DONE$!e S!]Q !eZ @ --> FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ E   --> FILE: EX14 .COM CRC = 02 E3 --> FILE: D .COM CRC = 66 48 --> FILE: TREK .COM CRC = DB 75 --> FILE: INSTALL .SUB CRC = 5F B1 --> FILE: 9-DISK .DOC CRC = EA 5E --> FILE: ALIENS .COM CRC = 40 35 --> FILE: ALIENS .DOC CRC = E6 FA --> FILE: FIX .DOC CRC = 0C C9 --> FILE: FIX .COM CRC = DE 4A --> FILE: FIND .ASM CRC = 8B 50 --> FILE: FIND .COM CRC = 93 41 --> FILE: FIND .DOC CRC = 64 2F --> FILE: DIF/SSED.DOC CRC = D7 AF --> FILE: DIF2 teeger [70315,1120] on CompuServe [note: The changes from file EXFIX.DOC have been incorporated into EX12.*] EX is a nifty and fast way of executing .SUB files, (uses ram as the SUB file buffer rather than spreading it out on disk). EX also allows batch entry of a series of commands which it stores in memory for subsequent continuous execution. EX relocates itself and its buffer to high memory just below CCP and adjusts the CP/M BDOS entry to protect itself. - Resolution: See next problem resolution. Problem: Unpredictable results when executing MBASIC under EX. Reason: MBASIC (and others) were not subtracting 6 from the BDOS+1 address when determining available memory. Resolution: EX now refreshes the storage in the 6 bytes below the BDOS+1 address during any warmboot request. The enhancements added with EX 1.2 are: ^: EX runtime re-execution function ^? EX runtime wait for carriage return `Xsub Already Presend `:' for each command line to be executed. A carriage return entered by itself terminates the prompting and starts execution of the command lines that have been entered. 2. EX14 cr This form will cause EX to load the into memory and perform substitution the same as SUBMIT, with the addition of the `^$' support for missing parameters. After all parameters have been substituted the text from the file is exe .COM CRC = 6D 0D --> FILE: SSED2 .COM CRC = D8 D7 --> FILE: SNOOPY .TXT CRC = 15 BF --> FILE: PASSWORD.ASM CRC = E3 4B --> FILE: PASSWORD.COM CRC = 5A 48 --> FILE: CRC .COM CRC = B2 07 --> FILE: EX14 .DOC CRC = 9B 8F --> FILE: EX14 .SUB CRC = 14 EF --> FILE: EX14 .TST CRC = A3 A9 --> FILE: EX14 .ASM CRC = 3D 9A --> FILE: ZCPR .DOC CRC = BD F6 --> FILE: ZCPR .HEX CRC = 33 17-Stan Hanson 05/24/82 EX replaces the functions of both SUBMIT.COM and XSUB.COM from Digital Research, Inc. --Larry Steeger 08/06/82 The files used to assemble EX14.ASM using EX14.SUB are: ED.COM EX14.ASM EX14.SUB MAC.COM RELS.UTL (or REL.UTL see note in EX14.SUB) SID.COM SUBMIT.COM and XSUB.COM (or a previous version of EX.COM may be used) [note: REL.UTL is available on CP/MUG Volume #38] [note: RELS.UTL is availt' logic Input/EX buffer overlap detection EX runtime recursion prevention (Ex Already Present) EX runtime prompt mode character logic The enhancements added with EX 1.1 are: ;; EX only comment support ^. Print suppression toggle ^<..^> Immediate print function ^# EX message suppression toggle ^| Carriage return/line feed function ^$ Default parameters' support Logic to prevent ZCPR re-entrance to EX.COM (EX.COM is not reentrant) --Larry Scuted as if was entered from the console. EX14.COM may be terminated during execution by entering control-C from the console. EX14.COM submit file conventions are: [note: unless otherwise stated, the `<.......>' sequences are used only to indicate character strings that must be replaced with the values described.] ^ generates the corresponding control character. Lowercase letters a thru z are conver EX 1.4 - 11/20/82 Thanks to Joe Cutler, Stan Hanson, and Ron Fowler for EX.* and the information used to create this version. This file and the source for EX14 are based upon the previous EX*.* files. EX 1.4 is a maintenance update to EX 1.2 and EX 1.3 (never released). Problem: BASCOM would not execute under EX. Reason: BASCOM is doing system integrity checks using the BDOS+1 address. EX was not preserving the required information so that BASCOM would execute. able on CP/MIG XA1 ACCESS database] The files used to test EX14.COM are: EX14.COM EX14.TST (must be renamed to .SUB before executing test) XSUB.COM The files used to execute EX14.COM are: EX14.COM SUB.COM (used to generate simple *.SUB files) [note: Any good CP/M editor may be used to create *.SUB files] (cr is carriage return) EX14.COM may be invoked two ways: 1. EX14 cr This form will cause EX to prompt with a line number an  ted to uppercase. $<1 thru 9> generates parameter <1 thru 9> substitution the same as SUBMIT, unless `^$' is being used as described below. ^$ will generate a list of parameters that will be used in the $<1 thru 9> parameter substitution if the user does not provide any parameters or only some of the parameters on the EX command line. ;; generates an EX only comment (the ;; and the remainder of the c MAC EX14 ; ; 5. RENAME STEP 4 FILES ; REN EX140.HEX=EX14.HEX REN EX140.SYM=EX14.SYM REN EX140.PRN=EX14.PRN ; ; 6. CHANGE EX14.LIB FOR ASSEMBLY OF ORG 100H RELOCATED CODE SEGMENT ; ED EX14.LIB #A #K IBASE EQU FALSE ;SUPPRESS EX14 INITIATOR CODE (ENABLE RELOCATED CODE) IREL EQU 0100H ;SET RELOCATED CODE SEGMENT TO ORG 0+100H E ; ; 7. ASSEMBLE ONLY ORG 100H RELOCATED CODE SEGMENT ; MAC EX14 $$PZ SZ ; ; 8. RENAME STEP 7 FILE ; REN EX141.HEX=EX14.HEX ; ; 9. CHANGE EX14.LIB FOR ASSEMBLY e console. Control-C will terminate EX at this point also. $$ generates the $ (dollar-sign). $^ generates the ^ (caret or up-arrow). $| generates the | (broken vertical bar). EX14.COM(.BIN or .OBJ) was generated from EX14.ASM using EX14.SUB and the files mentioned above. --Larry Steeger 11/20/82 BIN or .OBJ) was generated from EX14.ASM using is the symbol for the length of the storage required ; for the relocation table bit map to be created by ; RELS.UTL ; ; RELOCL is the symbol for the DW in EX14.COM that will contain ; the length of the Relocated Code Segment ; ; ; A. SID is invoked and the .SYM files for the ORG 0 Relocated Code ; Segment and the Initiator Code Segment are loaded. ; ; B. The DW at symbol RELOCL is updated with the value of DRVERL ; from the ORG 0 Relocated Code Segment. ; ; C. urrent line are not moved to the EX command buffer.). | generates a Carriage Return. ^| generates a Carriage Return and Line Feed. |,cr,lf,1AH(EOF) will eliminate all characters from the last | thru this sequence. ^. toggles print suppression for characters from SUBMIT file. (Example: DIR ^.*.COM^. will execute DIR *.COM but only DIR will be echoed to the console.) ^< forces immediate display of the characters following it until ^> is encountered.OF EX INITIATOR CODE ONLY ; ED EX14.LIB #A #K IBASE EQU TRUE ;ENABLE EX14 INITIATOR CODE GENERATION (SUPPRESS RELOCATED CODE) IREL EQU 0 ;RESET RELOCATED CODE SEGMENT TO ORG 0 E ; ; 10. ASSEMBLE EX INITIATOR CODE ONLY ; MAC EX14 ; ; 11. USE SID AND RELS.UTL TO CREATE EX14.COM ; ; [note: If only REL.UTL is available, comment out the lines ; starting with IEX14.COM below and change the line ; SID RELS.UTL to SID REL.UTL and a SAVE 10 EX14.COM ; must be added at the end of thi; ; EX 1.4 INSTALLATION .SUB FILE 11-20-82 ; ; 1. ERASE ANY FILES FROM PREVIOUS .SUB EXECUTIONS ; ERA EX14?.HEX Y ERA EX14?.SYM Y ERA EX14?.PRN Y ; ; 2. USE CPM 2.2 XSUB (not required if using previous version of EX) ; XSUB ; ; 3. CREATE EX14.LIB FOR ASSEMBLY OF ORG 0 RELOCATED CODE SEGMENT ; ED EX14.LIB #A #K IBASE EQU FALSE ;SUPPRESS EX14 INITIATOR CODE (ENABLE RELOCATED CODE) IREL EQU 0 ;SET RELOCATED CODE SEGMENT TO ORG 0 E ; ; 4. ASSEMBLE ONLY ORG 0 RELOCATED CODE SEGMENT ; Memory for the two copies of the Relocated Code Segment ; (ORG 0 and ORG 100H) and the relocation table bit map is zeroed. ; ; D. The ORG 0 Relocated Code Segment is loaded starting at ; location BEGREL. ; ; E. The ORG 100H Relocated Code Segment is loaded after the ; segment loaded in step C plus the length of the relocation ; table bit map. ; ; F. RELS.UTL routine SETADRS sets the starting addresses of ; the two Relocated Code Segments for creation of the relocation ;  ^ control support, $<1 thru 9> parameter substitution, and $ escape support continues during this display mode. (Example: ^<^[ETest EX 1.4^|^> will generate the sequence to clear the screen on the H/Z19 terminal and display `Test EX 1.4' at the upper-lefthand corner of the screen and the cursor will be on the next line.) ^: causes EX to re-execute the .SUB file from the beginning. ^? causes EX to wait for a carriage return response from ths file.] ; ; EX14.HEX contains EX Initiator Code ; EX14.SYM contains symbols for SID for EX Initiator Code ; ; EX140.HEX contains EX ORG 0 Relocated Code Segment ; EX140.SYM contains symbols for SID for EX ORG 0 Relocated Code ; ; EX141.HEX contains EX ORG 100H Relocated Code Segment ; ; BEGREL is the symbol for the start of the Relocated Code ; Segment in EX14.COM ; ; DRVERL is the symbol for the length of the Relocated Code ; Segment ; ; DRVL8    table bit map. ; ; G. RELS.UTL routine SETLEN sets the length of the Relocated ; Code Segment and builds the relocation table bit map. ; ; *H. RELS.UTL routine SAVE saves the EX Initiator Code Segment, ; the ORG 0 Relocated Code Segment, and the relocation table ; bit map created by RELS.UTL. ; ; * [note: not used if only REL.UTL is available] ; ; I. CP/M is returned to by G0. ; ; **J. SAVE 10 EX14.COM saves the EX Initiator Code Segment, ; the ORG 0 RelocatedT SUPPRESS ; DIR ^.XXX^. ; ; TEST PRINT SUPPRESS WITH EX COMMENT ; DIR ^.YYY ;; EX COMMENT^. ; ; TEST PRINT SUPPRESS WITH IMMEDIATE PRINT MODE ; DIR ^.ZZZ ^^. ; ; ; TEST CARRIAGE RETURN(3) ; ||| ; ; TEST $$ ; $^$|$$ ; ; TEST $^$$ DEFAULT PARAMETERS ; ^$ DF1 DF2 DF3 DF4 DF5 DF6 DF7 DF8 DF9 ; PARAMETERS=$9 $8 $7 $6 $5 $4 $3 $2 $1 ; ; TEST LOOP TEST ; ^: LT PARAMETERS ; ^$ DF1 DF2 DF3 DF4 DF5 DF6 DF7 DF8 DF9 ; PARAMETERS=$9 $8 $7 $6 $5 $4 $3 $2 $1 ; ;  '^<...^>' immediate display support, ; '^#' EX message suppression function, ; '^$' default parameter support, ; and '^|' cr,lf generation function [Larry Steeger] ; ; 1.0 08-03-82 corrected $^ error and ^ error [Larry Steeger] ; ; ? 06-19-82 added missing TRUE and FALSE equates [Ron Fowler] ; ; ? 05-17-82 corrected last cold boot no active message ; DATE EQU 1122H ;SET UP DATE YEAR EQU 82H ;SET UP YEAR MARK EQU 1 ;SET MARK VERS EQU 4 ;SET V Code Segment, and the relocation table ; bit map created by REL.UTL. ; ; ** [note: used ONLY if REL.UTL is used] ; SID RELS.UTL IEX14.HEX EX140.SYM R I* EX14.SYM R SW.RELOCL .DRVERL . F.BEGREL .BEGREL+.DRVERL+.DRVL8+.DRVERL 0 IEX140.HEX R.BEGREL IEX141.HEX R.BEGREL+.DRVERL+.DRVL8-100 C.SETADRS .BEGREL .BEGREL+.DRVERL+.DRVL8 C.SETLEN .DRVERL .BEGREL+.DRVERL IEX14.COM C.SAVE 100 .BEGREL+.DRVERL+.DRVL8 G0 ;SAVE 10 EX14.COM (only if using REL.UTL) ; ; EX14.COM is now ready for ex; ; EX14.ASM - An enhanced version of EXEC and EX. ; ; START 05-09-82 ; ; DATE 11-20-82 *LAST MAJOR CHANGE ; ; HISTORY: ; ; 1.4 11-20-82 fix for 1.3 modification to put CP/M serial # on ; a page boundary and refresh it on warm starts. ; (Some programs are not subtracting 6 from the ; BDOS+1 location when calculating high memory, ; MBASIC is one of these) ; ; 1.3 11-07-82 fix for software that expects CP/M serial # below ; BDOS ; ; EX14.TST - TEST EX FUNCTIONS ; ; ; TEST RECURSION PREVENTION ; EX14 ; ; TEST XSUB PRESENT ; XSUB ; ; TEST IMMEDIATE MODE ; ^ ; ; TEST $^? WAIT FOR CARRIAGE RETURN ; ^ ; ; SET EX MESSAGE SUPPRESS ; ^# ; ; TEST EX MESSAGE SUPPRESS BY WARMSTART ; ^C ; ; RESET EX MESSAGE SUPPRESS ; ^# ; ; TEST RESET EX MESSAGE SUPPRESS BY WARMSTART ; ^C ; ; TEST EX COMMENT ; DIR X.X ;; EX COMMENT ; ; TEST PRINERSION ; ; EX14.COM IS AN ENHANCEMENT OF EXEC.COM AND EX.COM ; ; OPTIONS: ; ; EX cr ; ; EX cr ; ; ^ WILL GIVE CONTROL CHARACTER ; ; | WILL BE CR ; ; ^| WILL BE CR,LF ; ; ^: WILL CAUSE EX TO RE-EXECUTE THE .SUB FILE FROM THE BEGINNING ; ; ^? WILL CAUSE EX TO WAIT FOR A CARRIAGE RETURN ; (^C WILL ABORT EX AT THIS POINT ALSO) ; ; ^$ WILL CAUSE THE REST OF THE LINE TO BE TREATED AS A ; SET OF DEFAULT PARAMETERS SEPARATED BY BLANKS TO BE ; USecution. ; .SAVE 100 .BEGREL+.DRVERL+.DRVL8 G0 ;SAVE 10 EX14.COM (only if using REL.UTL) ; ; EX14.COM is now ready for exJMP address. ; ; 1.2.1 09-16-82 fix for MBASIC execution under EX 1.2 . ; ; 1.2 08-11-82 added '^:' EX runtime re-execute logic function, ; '^?' EX runtime wait for carriage return, ; logic to prevent input/EX buffer overlap, ; logic to insure (Xsub Already Present), ; logic to prevent EX runtime recursion loop, ; and prompt character logic [Larry Steeger] ; ; 1.1 08-06-82 added ';;' EX comment's support, ; '^.' print suppression function, ;!  ED IF THE USER HAS NOT PROVIDED ONE ON EX'S COMMAND LINE. ; ; ^# WILL TOGGLE PRINT SUPPRESSION OF EX MESSAGES ; ; ^. WILL START PRINT SUPPRESSION OF ALL CHARACTERS ; FROM .SUB FILE UNTIL A SUBSEQUENT ^. IS ENCOUNTERED ; ; ;; WILL INDICATE THAT THE ;; AND ALL CHARACTERS FOLLOWING IT ; UNTIL A LF IS ENCOUNTERED ARE NOT INCLUDED IN EX'S ; TEXT BUFFER ; (I.E. AN EX ONLY COMMENT) ; ; ^< WILL START IMMEDIATE DISPLAY OF CHARACTERS FROM ; THE .SUB FILE UNTIL ^> IS ENCOUNTERED OFFBIT ;NO XTHL ;YES, GET BIT MAP MOV A,M ;GET NEXT BYTE INX H ;INCREMENT BIT MAP POINTER XTHL ;SAVE FOR LATER STA BITMAP ;KEEP BIT OFFSET OFFBIT: LDA BITMAP RAL ;TEST FOR OFFSET STA BITMAP ;SAVE NEW BYTE JNC NOFSET ;NO DCX D ;GET BACK TO LSB LDAX D ADD L STAX D INX D ;MSB LDAX D ;YES ADC H ;ADD IN OFFSET STAX D ;PUT IN MOVED PLACE NOFSET: INX D ;INCREMENT MOVED POINTER JMP OFFLUP ;CONTINUE WITH RELOCATE ; GOTO: POP D ;RESTORE STACK DCX H ;RELOCATE PROGRAM-1 PUSH MACLIB EX14 ; $-PRINT IF BASE $+PRINT ; ; START OF EX INITIATOR CODE SEGMENT ; ORG 100H ; START: LXI H,0 DAD SP SHLD CCPSTK ;CCP STACK PTR LXI SP,BEGREL ;USER STACK AREA MVI A,0C9H ; (8080 RET) STA START ;PREVENT RE-ENTRANCE BY ZCPR LXI D,SIGNON;LOGO CALL PRINT CALL EXACTV ;CHECK FOR RECURSION LHLD RELOCL ;GET RELOC PROGRAM LENGTH PUSH H POP B PUSH B ;SAVE LENGTH FOR FUTURE USE LHLD BDOS+1 ;GET BASE LXI D,-806H ;GET BEFORE CCP DAD D MOV A,L ;SUBTRACT RELOC LENGKS XCHG CALL MOVE ;MOVE TO INPUT BUFFER XCHG MVI M,CR INX H MVI M,LF INX H SHLD INBUF JMP GETLIN ; OPENSB: LXI D,DFCB+9 LXI H,SUBNAM;MOVE 'SUB' TO DFCB FILE TYPE MVI B,3 CALL MOVE XRA A STA DFCB+32 LXI D,DFCB MVI C,15 ;OPEN FILE CALL BDOS INR A JNZ READTX LXI H,NOSBF2 LXI D,DFCB+1 MVI B,8 ;NAME LENGTH CALL MOVEFN ;MOVE FILE NAME MVI B,3 ;TYPE LENGTH MVI M,'.' INX H LXI D,DFCB+9;FILE TYPE POINTER CALL MOVEFN ;MOVE FILE TYPE MVI M,'$' ;END TERMINATER; (I.E. DISPLAY ONLY .SUB INPUT) ; ; $<1-9> WILL REPLACE PARAMETER<1-9> IN TEXT FROM THE COMMAND LINE ; ; $$ WILL GIVE $ ; ; $^ WILL GIVE ^ ; ; $| WILL GIVE | ; ; |,cr,lf,1ah will eat last from | to end of buffer ; ; ^C FROM CONSOLE WILL ABORT EX ; FALSE EQU 0 TRUE EQU NOT FALSE ; DAY0 SET (DATE AND 0FH)+'0' DAY1 SET ((LOW DATE) SHR 4)+'0' MONTH0 SET ((HIGH DATE)AND 0FH)+'0' MONTH1 SET (DATE SHR 12)+'0' ; YEAR0 SET (YEAR AND 0FH)+'0' YEAR1 SET (YEAR SHR 4)+'0' ; MARK0 SET  H ;SAVE TO USE IN RELOCATED PROGRAM SHLD OUTBUF INX H ;GET TO BEGINNING OF RELOCATED PROGRAM PUSH H LXI D,DBUFF+1 ;TERMINATE COMMAND LINE WITH CR PUSH D LDA DBUFF MOV L,A MVI H,0 DAD D MVI M,CR LXI H,PRMDMY;START AT DUMMY PARAMETER FOR .SUB FILE SPEC PUSH H LXI B,PRMPNL+2 XRA A CALL FILL ;CLEAR PTR AREA POP H POP D MVI A,(PRMPNL/2)+1 STA PRMMAX ;HIGHEST PARAMETER # + 1 for .SUB SPEC CALL PARMS ;BUILD POINTERS FOR COMMAND LINE PARMS LDA DBUFF ;SEE IF .SUB FILE PRESETH SUB C MOV E,A MOV A,H SBB B MOV D,A PUSH D ;SAVE NEW TOP/START TO MOVE TO LXI H,BEGREL;START OF MOVE OMOVE: MOV A,B ORA C JZ MOVEND DCX B MOV A,M STAX D INX D INX H JMP OMOVE ; MOVEND: POP D ;GET START OF MOVED PROGRAM POP B ;LENGTH OF MOVE PROGRAM PUSH H ;START OF BIT MAP MOV H,D ;MSB OFFSET MOV L,E ;LSB OFFSET OFFLUP: MOV A,B ;TEST LENGTH ORA C ;IF 0 JZ GOTO ;JUMP TO RELOCATED PROGRAM DCX B ;DECREMENT COUNT LDA COUNT INR A STA COUNT ANI 07H JNZ  JMP NOSUB ; READTX: LHLD INBUF XCHG LXI H,80H ;GET SECTOR OFFSET DAD D SHLD INBUF MVI C,26 ;SET DMA ADDRESS CALL BDOS LXI D,DFCB MVI C,20 ;READ SEQUENTIAL CALL BDOS ORA A JZ READTX ;READ COMPLETE .SUB FILE LHLD INBUF ;MAKE SURE BUFFER'S TERMINATED LXI D,-80H ;GET BACK TO END DAD D ENDSTR: MVI M,1AH ;EOF CHARACTER SHLD ENDBUF ;EOB ADDRESS MOV A,L SUI LOW BEGREL+1;SEE IF BUFFER'S EMPTY MOV A,H SBI HIGH BEGREL JC BUFLOW XRA A STA IMFLG1 STA IMFLG2 STA PRTFLMARK+'0' VERS0 SET VERS+'0' ; BELL EQU 7 CR EQU 0DH LF EQU 0AH ; PSUP EQU 80H ;^. PRINT SUPPRESS FLAG IMON EQU 81H ;^< IMMEDIATE MODE START IMOFF EQU 82H ;^> IMMEDIATE MODE STOP MSUP EQU 83H ;^# EX MESSAGE SUPPRESS FLAG CRWAIT EQU 84H ;^? EX RUNTIME WAIT FOR CR FLAG REXEC EQU 85H ;^: EX RUNTIME RE-EXECUTE FLAG ;JMPMON EQU 0FEH ;^; EX JMP TO SYSTEM MONITOR ; WARM EQU 0 BDISK EQU 4 BDOS EQU 5 DFCB EQU 5CH DBUFF EQU 80H ; ; NOTE: EX14.LIB IS CREATED BY THE EX14.SUB GENERATION PROCESS ;NT ORA A JNZ OPENSB ;OPEN SUB FILE LXI H,0 SHLD LINES ;START LINE COUNTER MVI A,7FH ;GET BUFFER LENGTH STA DBUFF-1 LXI H,BEGREL;SET UP OUTPUT BUFFER SHLD INBUF GETLIN: CALL CRLF LHLD LINES INX H SHLD LINES CALL DECOUT ;PRINT LINE # MVI E,':' ;GET PROMPT CALL OUTCHR MVI E,' ' CALL OUTCHR LXI D,DBUFF-1 MVI C,10 ;READ CONSOLE BUFFER CALL BDOS LXI D,DBUFF LDAX D ;GET LENGTH MOV B,A INX D LHLD INBUF ;GET INPUT POINTER ORA A ;SEE IF END JZ ENDSTR ;THATS ALL FOL"  G STA OUTCNT LXI H,1 SHLD LINES LHLD OUTBUF SHLD OUTLNE SHLD BUFSTR LXI D,BEGREL MOVSTR: LDAX D INX D ANI 7FH ;MAKE SURE NO PARITY CPI LF JNZ MOVST0 MOVSTX: CALL INCR JMP MOVSTR ; MOVST0: CPI 1AH JZ SETUP CPI '|' ;CARRIAGE RETURN JNZ MOVST1 ;NOPE PUSH D ;SAVE OLD POINTER INX D INX D LDAX D ;GET PRESENT LOCATION+3 POP D ;GET OLD POINTER CPI 1AH ;END OF BUFFER JZ SETUP ;THATS ALL SHE WROTE MVI A,CR CALL INCR ;INCREMENT LINES FOR ERRORS JMP MOVST4 ; MOVSTM,A LDA OUTCNT ORA A ;ANY CHAR. ON THIS LINE? JZ EXCOM2 ;NO...SKIP CR EXCOM1: POP H ;YES..FORCE CR MVI A,CR CALL CHRSTR MVI A,LF JMP MOVSTX ;CONTINUE ; EXCOM2: POP H MVI A,LF JMP MOVSTX ;CONTINUE ; EXCOMX: POP H JMP SETUP ; MSGSUP: MVI A,MSUP ;CONVERT '^#' TO MESSAGE SUPPRESS FLAG JMP MOVST3 ; PRTSUP: MVI A,PSUP ;CONVERT '^.' TO PRINT SUPPRESS FLAG PUSH H LXI H,PRTFLG CMP M ;ALREADY ON? JNZ PRTSST ;NO...SET FLAG XRA A ;YES..CLEAR FLAG PRTSST: MOV M,A ;SET/RESET FLAGI A,REXEC ;CONVERT '^:' TO RE-EXECUTE FLAG JMP MOVST3 ; ;JMPMN: MVI A,JMPMON ;CONVERT '^;' TO JMP TO MONITOR FLAG ; JMP MOVST3 ; GCRW: MVI A,CRWAIT;CONVERT '^?' TO CRWAIT FLAG JMP MOVST3 ; GCRLF: MVI A,CR ;GENERATE CR & LF CALL CHRSTR MVI A,LF CALL CHRSTR STA LCHR JMP MOVSTR ; PRMDEF: PUSH H LXI H,PRMDFP PUSH H LXI B,PRMDFL XRA A CALL FILL ;CLEAR PTR TABLE POP H MVI A,PRMDFL/2 STA PRMMAX ;HIGHEST PARAMETER # CALL PARMS ;BUILD DEFAULT PARAMETERS PTRS POP H INXUP: MVI M,0FFH ;SETUP END OF DATA DCX H MVI M,0FFH MOV A,L ;SETUP EX RECURSION ID, XSUB PRESENT, AND CP/M S/N CPI 11 ;12 BYTES ON THIS PAGE? JNC SETUP1 ;YES..OK DCR H ;NO...DROP DOWN 1 PAGE SETUP1: MVI L,11 ;FORCE PAGE BOUNDARY FOR CP/M S/N MVI M,0FFH ;SETUP EX RESURSION ID DCX H MVI M,'X' DCX H MVI M,'E' DCX H LDA BDOS+2 ;SET UP BDOS JUMP TO PROTECT DATA MOV M,A DCX H LDA BDOS+1 MOV M,A DCX H MVI M,JMP PUSH H LXI D,-6 DAD D ;PTR TO PSEUDO CP/M SERIAL # PUSH H 1: MOV C,A LDA IMFLG1 CPI IMON ;IMMEDIATE MODE ON ? MOV A,C JZ MOVST2 ;YES..SKIP EX COMMENT PROCESSING CPI ';' JZ EXCOMM ;PROCESS POSSIBLE EX COMMENT MOVST2: CPI '^' JZ MOVST5 ;CONVERT CONTROL CHARACTERS CPI '$' CZ GTPARM ;SUBSTITUTE COMMAND PARAMETER OR CONTROL CHAR. MOVST3: STA LCHR CPI CR ;=CR? JNZ MOVST4 MOV C,A LDA OUTCNT ORA A ;ANY CHAR? MOV A,C JZ MOVSTR ;NO..USE INPUT CR ONLY IF OTHER NON-CONTROL ; CHARACTERS IN CURRENT LINE MOVST4: CALL CHRSTR ;ADD TO BUFF POP H MVI A,PSUP JMP MOVST3 ; IMPRTY: MVI A,IMON ;CONVERT '^<' TO IMMEDIATE MODE START STA LCHR PUSH H LXI H,IMFLG1 CMP M ;ALREADY ON? POP H JZ MOVSTR ;YES.. STA IMFLG1 STA IMFLG2 JMP MOVST3 ;NO... ; IMPRTN: MVI A,IMOFF ;CONVERT '^>' TO IMMEDIATE MODE STOP STA LCHR PUSH H LXI H,IMFLG2 CMP M ;ALREADY OFF? POP H JZ MOVSTR ;YES.. STA IMFLG2 STA IMFLG1 JMP MOVST3 ;NO... ; CHRSTR: PUSH PSW ;CHECK FOR INPUT/EX BUFFER OVERLAP PUSH D PUSH H LHLD ENDBUF XCHG  D ;SKIP CR MVI A,LF JMP MOVSTX ;CONTINUE AT EOL ; EXCOMM: PUSH H LXI H,LCHR CMP M ; DOUBLE ;? MOV M,A POP H JNZ MOVST3 ;NO...CONTINUE MOV C,A LDA PRTFLG CPI PSUP MOV A,C JZ MOVST3 ;PRINT SUPPRESS LDA IMFLG1 CPI IMON MOV A,C JZ MOVST3 ;IMMEDIATE MODE INX H ;YES..IGNORE PREVIOUS ; PUSH H LXI H,LCHR LDA OUTCNT DCR A ;DROP 1 CHAR. STA OUTCNT EXCOML: LDAX D ;IGNORE CHARACTERS UNTIL EOF OR LF INX D CPI 1AH ;EOF JZ EXCOMX CPI LF ;LINE FEED JNZ EXCOML MOV  LHLD BDOS+1 DAD D ;PTR TO REAL CP/M SERIAL # POP D MVI B,6 CALL MOVE ;SETUP CP/M SERIAL # POP H XTHL ;GET JUMP ADDRESS/SAVE TOP OF MEMORY ; ; (SP) TOP OF MEMORY ADDRESS ; (SP+2) START OF BUFFER ADDRESS ; PCHL ;GOTO IT ; ; ERROR EXITS ; GETERR: LXI D,CMDER ;CONTROL CHARACTER INVALID CALL PRINT JMP LINE ;PRINT LINE # AND LINE AND EXIT ; NODEFP: LXI D,NOPRM ;UNKNOWN PARAMETER CALL PRINT JMP LINE ;PRINT LINE # AND LINE AND EXIT ; PRMERR: LXI D,PMERR CALL PRINT JMP LINE ER CALL CNTINC ;INCREMENT COUNT JMP MOVSTR ; MOVST5: CALL GETCMD ;VALIDATE CONTROL CHARACTERS CPI ':' JZ REXC ;RE-EXECUTE ; CPI ';' ; JZ JMPMN ;JMP TO MONITOR CPI '?' JZ GCRW ;CR WAIT CPI '|' JZ GCRLF ;CR,LF GENERATION CPI '$' JZ PRMDEF ;DEFAULT PARAMETERS' LINE CPI '.' JZ PRTSUP ;PRINT SUPPRESS TOGGLE CPI '#' JZ MSGSUP ;MESSAGE SUPPRESS TOGGLE CPI '<' JZ IMPRTY ;IMMEDIATE MODE START CPI '>' JZ IMPRTN ;IMMEDIATE MODE STOP JMP MOVST3 ;OTHER CONTROL CODES ; REXC: MV POP H MOV A,L CMP E JNZ CHRSTX ;LSB<> MOV A,H CMP D JZ OVERL ;MSB=, OVERLAP WILL OCCUR/ABORT EX ; CHRSTX: POP D ;ADD CHAR. TO EX'S BUFFER POP PSW MOV M,A DCX H RET ; EXACTV: LHLD BDOS+1 ;CHECK FOR EX RECURSION INX H INX H INX H ;SKIP 1ST JUMP MVI A,'E' CMP M RNZ ;NOT 'E' INX H MVI A,'X' CMP M RNZ ;NOT 'X' INX H MVI A,0FFH CMP M RNZ ;NOT 0FFH LXI D,EXACT CALL PRINT ;EX ALREADY PRESENT CCPRET: LHLD CCPSTK SPHL LDA 4 RET ;RETURN TO CCP ; SET#  ;PRINT LINE # AND LINE AND EXIT ; PRMTOO: LXI D,TOOARG;TOO MANY PARAMETER ARGUMENTS CALL PRINT LHLD ERRLNE CALL EPRT ;PRINT PARAMETER LINE JMP CCPRET ; BUFLOW: LXI D,BUFMTY;TEXT BUFFER EMPTY CALL PRINT JMP CCPRET ; NOSUB: LXI D,NOSBF1;.SUB FILE NOT FOUND CALL PRINT LXI D,NOTHER CALL PRINT JMP CCPRET ; OVERL: LXI D,OVERLP;INPUT/EX BUFFER OVERLAP CALL PRINT JMP LINE ; ; SUBROUTINES ; ; CONTROL CODES 0-1FH ; WITH SUPPORT FOR $ . # < > ; GETCMD: LDAX D ;GET NEXT CHARACTER DE? RZ ;YES.. LDA OUTCNT INR A STA OUTCNT RET ; PARMS: MVI B,0 ;CLEAR PARAMETER COUNTER XCHG SHLD ERRLNE ;SAVE IN CASE OF ERROR XCHG ; PARMSL: LDAX D ;IGNORE LEADING SPACES INX D CPI CR JZ ENDLNE CPI ' ' JZ PARMSL DCX D MOV M,E INX H MOV M,D INX H INX D INR B ;COUNT+1 LDA PRMMAX CMP B JC PRMTOO ;TOO MANY ARGUMENTS ; ENDPRM: LDAX D ;GET TO END OF PARAMETER INX D CPI CR JZ ENDLNE CPI ' ' JNZ ENDPRM XRA A DCX D STAX D ;TERMINATE PARAMETER I MOVPRM: LDAX D ;MOVE PARAMETER TO BUFFER INX D ORA A JZ ENDPAR MOV M,A DCX H JMP MOVPRM ; ENDPAR: POP D INX H MOV A,M RET ; NOPARM: PUSH H LXI H,PRMDFP;TRY DEFAULT PARAMETERS LDA PRMNUM CPI PRMDFL-1 JNC NODEFP ;> HIGHEST # MOV E,A MVI D,0 DAD D MOV E,M ;GET PARAMETER POINTER INX H MOV D,M POP H MOV A,E ORA D JZ NODEFP ;NO PARAMETER PRESENT JMP MOVPRM ;MOVE PARAMETER TO BUFFER ; MOVEFN: LDAX D CPI ' ' ;SEE IF SPACE RZ MOV M,A INX D ;INCREMENT PODECIMAL LINE NUMBER PUSH D PUSH B LXI B,-10 ;RADIX FOR CONVERSION LXI D,-1 ;THIS BECOMES NO DIVIDED BY RADIX DX: DAD B ;SUBTRACT 10 INX D JC DX LXI B,10 DAD B ;ADD RADIX BACK IN ONCE XCHG MOV A,H ORA L ;TEST FOR ZERO CNZ DECOUT ;RECURSIVE CALL MOV A,E ADI '0' ;CONVERT FROM BCD TO HEX MOV E,A ;TO E FOR OUTPUT MVI C,2 CALL BDOS POP B ;RESTORE REGISTERS POP D POP H RET ; MOVE: MOV A,M ;MOVE STRING AT (HL) TO (DE) FOR LENGTH IN B INX H STAX D INX D DCR B JN INX D ;INCREMENT POINTER CPI '|' RZ ;CR,LF GENERATION CPI 'a'-1 ;LOWERCASE? JC GETUPR ;NOPE CPI 'z'+1 ;a-z? JNC GETERR ;NOPE sui 'a'-'A' ;GET TO UPPERCASE GETUPR: CPI '@' ;0-1FH CONTROL CODE? JNC GETCC ; CPI ';' ; RZ ;JMP TO MONITOR CPI ':' RZ ;RE-EXECUTE CPI '?' RZ ;CR WAIT CPI '$' RZ ;DEFAULT PARAMETERS' LINE CPI '.' RZ ;PRINT SUPPRESS TOGGLE CPI '#' RZ ;MESSAGE SUPPRESS TOGGLE CPI '<' RZ ;IMMEDIATE MODE START CPI '>' RZ ;IMMEDIATE MODE STOP JMP NX D JMP PARMSL ;IGNORE SPACES BETWEEN PARAMETERS ENDLNE: XRA A DCX D STAX D ;TERMINATE LAST PARAMETER INX D MVI A,CR STAX D RET ; PRINT: MVI C,9 ;PRINT STRING AT (DE) CALL BDOS RET ; EPRT: MOV A,M ;PRINT PARAMETER LINE AT (HL) CPI CR RZ CPI 0 JNZ EPRT1 MVI A,' ' EPRT1: INX H PUSH H MOV E,A MVI C,2 CALL BDOS POP H JMP EPRT ; CRLF: LXI D,CRLFS ;PRINT CR/LF CALL PRINT RET ; LINE: LXI D,LINEM ;PRINT LINE # AND LINE IN ERROR AND EXIT CALL PRINT LHLD LINEINTERS INX H DCR B JNZ MOVEFN RET ; INCR: PUSH H ;SAVE OUTPUT POINTER LHLD LINES INX H ;INCREMENT LINE COUNTER SHLD LINES LXI H,LCHR ;CLEAR LAST CHARACTER MVI M,0 LXI H,OUTCNT;CLEAR CHARACTER COUNT MVI M,0 MOV L,E ;DE=HL MOV H,D SHLD BEGLIN POP H SHLD OUTLNE ;SAVE NEW OUTPUT LINE RET ; CNTINC: CPI ' ' ;CONTROL CHARACTER? RC ;YES.. ANI 80H ;SPECIAL CONTROL? RNZ ;YES.. LDA PRTFLG CPI PSUP ;PRINT SUPPRESS FLAG? RZ ;YES.. LDA IMFLG1 CPI IMON ;IMMEDIATE MOZ MOVE RET ; FILL: PUSH D ; FILL STORAGE AT (HL) WITH CHARACTER IN A MOV E,A ; FOR LENGTH IN BC MOV A,B ORA C MOV A,E POP D RZ DCX B MOV M,A INX H JMP FILL ; ; WORKING STORAGE AREA ; SUBNAM: DB 'SUB' LINEM: DB ' error line # $' EXACT: DB CR,LF,'(Ex Already Present)$' BUFMTY DB CR,LF,'Text buffer empty$' OVERLP: DB CR,LF,'Input/EX Buffer Overlap$' NOPRM: DB CR,LF,'No parameter or default parameter$' PMERR: DB CR,LF,'Parameter$' NOSBF1: DB CR,LF,'File ' NOSBF2: DB 'filenameGETERR GETCC: SUI 40H ;GET CONTROL CODE RNC JMP GETERR ; GTPARM: LDAX D INX D CPI '$' RZ CPI '^' ;UP ARROW RZ CPI '|' ;CARRIAGE RETURN RZ CPI '1' JC PRMERR CPI '9'+1 JNC PRMERR SUI '1' ;GET ACTUAL # (ZERO RELATIVE) ADD A ;DOUBLE FOR OFFSET STA PRMNUM PUSH D PUSH H LXI H,PRMPNT CPI PRMPNL-1 JNC NOPARM ;> HIGHEST # MOV E,A MVI D,0 DAD D MOV E,M ;GET PARAMETER POINTER INX H MOV D,M POP H MOV A,E ORA D JZ NOPARM ;NO PARAMETER PRESENT, TRY DEFAULTSS CALL DECOUT ;PRINT LINE # CALL CRLF LHLD BEGLIN PUSH H ;SAVE BEGGING POINTER FINDCR: MOV A,M INX H CPI 1AH ;END OF BUFFER JZ FOUND CPI CR JNZ FINDCR FOUND: MVI M,0 ;END OF STRING POP H ;START OF STRING CALL PRNTHL ;PRINT BAD LINE JMP CCPRET ;THATS ALL FOLKS ; PRNTHL: MOV A,M ;PRINT LINE AT (HL) INX H ORA A RZ MOV E,A PUSH H ;SAVE POINTER CALL OUTCHR POP H ;GET POINTER BACK JMP PRNTHL ; OUTCHR: MVI C,2 ;PRINT CHARACTER IN E JMP BDOS ; DECOUT: PUSH H ;PRINT $  .typ$' NOTHER: DB ' not there$' CMDER: DB CR,LF,'Control character$' TOOARG: DB CR,LF,'Too many arguments - $' SIGNON: DB 'EX ',MARK0,'.',VERS0 DB ' ',MONTH1,MONTH0,'-',DAY1,DAY0,'-',YEAR1,YEAR0,'$' CRLFS: DB CR,LF,'$' ; CCPSTK: DW 0 ;CCP STACK PTR IMFLG1: DB 0 ;=IMON ENCOUNTERED IMFLG2: DB 0 ;=IMOFF ENCOUNTERED PRTFLG: DB 0 ;=PSUP ON LCHR: DB 0 ;LAST CHARACTER READ PRMMAX: DB 0 ;HIGHEST PARAMETER # PRMNUM: DB 0 ;CURRENT $<1-9> NUMBER * 2 (ZERO RELATIVE) ERRLNE: DW 0 BITMAP: DB 0 ;PRESENT CALL BDOS LXI H,STARTM;TELL USER WE'RE STILL HERE CALL PMSG LDA BDISK MOV C,A LHLD CCPJMP PCHL ;GOTO CONSOLE PROCESSOR ; ; JMP TABLE TO OVERLAY BIOS ; LOCJMP: JMP NWARM ;WARM JMP BCONST ;CONST JMP NCONIN ;CONIN JMP NCONOT ;CONOT ; ; CONSOLE INPUT INTERCEPT ROUTINE ; NCONIN: LXI H,0 DAD SP ;SAVE RETURN STACK LEVEL SHLD CONSTK LXI H,MEMTOP;SET USER STACK NCONNL: CALL BCONST ;GET CONSOLE STATUS ORA A JZ GETBUF ;GET CHARACTER FROM BUFFER CALL BCONIN ;GET CHARACTER HLD REVBUF SHLD SAVBUF MOV A,M CPI MSUP ;1ST CHAR=MESSAGE SUPPRESS? JNZ EX1 ;NO... DCX H ;YES..SKIP CHARACTER SHLD REVBUF STA MSUPFL ;SET INITIAL FLAG EX1: LXI SP,MEMTOP LHLD BDOS+1 ;GET WARM JUMP FOR STANDARD CCP MOV A,H SUI 8 MOV H,A MVI L,3 ;SET UP FOR WARM CCP JUMP SHLD CCPJMP LHLD WARM+1 SHLD WARMPT LXI D,BSWARM MVI B,12 CALL MOVE ;MOVE BIOS JUMPS LHLD WARMPT XCHG LXI H,LOCJMP MVI B,12 CALL MOVE ;MOVE NEW BIOS JUMPS TO BIOS AREA ; ; EX RUNTIME BIOS INTERECHO TO CONSOLE JMP NCONNL ;...LOOP UNTIL IMOFF ; REXECR: LHLD SAVBUF ;START AT TOP OF BUFFER AGAIN SHLD REVBUF XRA A STA IMFLG ;RESET ALL FLAGS STA PSUPFL STA MSUPFL JMP NCONNL ;...LOOP UNTIL ^C ; CRWRTN: CALL BCONST ;WAIT FOR CHAR. JZ CRWRTN CALL BCONIN CPI 'C'-40H JZ EXABRT ;=^C CPI CR JZ CRWRTX ;=CR MVI C,BELL CALL BCONOT ;<>CR JMP CRWRTN ; CRWRTX: MOV C,A ;ECHO CR/LF CALL NCONOT MVI C,LF CALL NCONOT JMP GETBUF ; PSUPCK: LXI H,PSUPFL CMP M JNZ PSUPST ; OFFSET BIT'S COUNT: DB 0FFH ;PRESENT OFFSET BIT COUNT BEGLIN: DW BEGREL ;BEGINNING OF OLD LINE POINTER LINES: DW 1 INBUF: DW BEGREL ENDBUF: DW 0 ;END OF INPUT BUFFER OUTCNT: DB 0 OUTLNE: DW 0 OUTBUF: DW 0 BUFSTR: DW 0 RELOCL: DW 0 ;LENGTH OF RELOC PROGRAM(FILLED IN BY SID) PRMDFP: ;DEFAULT PARAMETER PTRS REPT 9 DW 0 ENDM PRMDFL EQU $-PRMDFP PRMDMY: DW 0 ;DUMMY PARAMETER FOR .SUB FILE SPEC. PRMPNT: ;COMMAND LINE PARAMETER PTRS REPT 9 DW 0 ENDM PRMPNL EQU $-PRMPNT PATCH: ;PACPI 'C'-40H ;SEE IF TERMINATE CHARACTER JZ EXABRT CPI 'S'-40H ;13H JNZ NCONEX CALL BCONIN ;WAIT FOR NEXT CHARACTER ANI 7FH LHLD REVBUF INX H MOV M,A SHLD REVBUF MVI A,'S'-40H;13H NCONEX: LHLD CONSTK ;RESTORE CALLER'S STACK SPHL RET ; GETBUF: LDA PSUPFL ;SET PRINT SUPPRESS FLAG FOR NCONOT STA OUTFLG CALL GETCHR ;GET NEXT CHARACTER ; CPI JMPMON ;JMP TO MONITOR? ; JZ JPMON ;YES..DO IT CPI REXEC ;RE-EXECUTE? JZ REXECR ;YES..RESET BUFFER PTR CPI CRWAIT ;CR WAIT? JZ CRWRTNCEPT ROUTINES ; NWARM: LXI SP,MEMTOP LHLD REVBUF ;SEE IF WE'RE AT BUFFERS END MOV A,M CPI 0FFH ;TEST IT JZ WARMR ;REAL WARM START RETURN LHLD WARMPT SHLD WARM+1 LHLD MEMTOP SHLD BDOS+1 PUSH H ;RESTORE CP/M S/N LXI D,-6 ; DAD D ;HL=BDOS+0 XTHL ;(SP)=PSEUDO BDOS+0/HL=PSEUDO BDOS+6 INX H ;+1 MOV E,M ;GET BDOS+6 INX H ; MOV D,M ; XCHG ;HL=BDOS+6 LXI D,-6 ; DAD D ;HL=BDOS+0 POP D ;DE=PSEUDO BDOS+0 MVI B,6 ;LENGTH OF S/N CALL MOVE ; LXI D,DBUFF MVI C,26 ;SET DMASET FLAGS IF NOT EQUAL XRA A ;ELSE RESET FLAGS PSUPST: MOV M,A ;SET/RESET SAVED FLAG JMP GETBUF ;AND GET NEXT CHARACTER(SETS EXEC FLAG) ; MSUPCK: LXI H,MSUPFL CMP M JNZ MSUPST ;SET FLAGS IF NOT EQUAL XRA A ;ELSE RESET FLAG MSUPST: MOV M,A ;SET/RESET FLAG JMP GETBUF ;AND GET NEXT CHARACTER ; IMFLGS: STA IMFLG ;SET/RESET IMMEDIATE MODE FLAG JMP GETBUF ;GET NEXT CHARACTER ; ;JPMON: DI ;DISABLE INTERRUPTS ; LHLD BDOS+1 ;SAVE BDOS JMP LOCATION ; SHLD BDOSVE ; ; XRA A ;STOP H3TCH AREA REPT 32 DB 'p' ENDM REPT 30 DW 0 ENDM ; ; INSURE 8 BYTE BOUNDARY FOR REL.UTL(RELS.UTL) ; ?PLOC SET $ IF (?PLOC MOD 8) GT 0 ?PLOC SET (?PLOC AND 0FFF8H)+8 ;GET NEXT 8 BYTE BOUNDARY ORG ?PLOC ENDIF ; BEGREL: DS 0 ;RELOC PROGRAM STARTS HERE (ALSO USED AS BUFFER) ; ENDIF ; ; END OF EX INITIATOR CODE SEGMENT ; $-PRINT IF NOT BASE $+PRINT ; ; START OF EX RELOCATED CODE SEGMENT ; ORG REL ; EX: POP H ;GET TOP OF MEMORY SHLD MEMTOP POP H ;GET START OF BUFFER S ;YES..WAIT FOR CR CPI MSUP ;MESSAGE SUPPRESS FLAG? JZ MSUPCK ;YES..TOGGLE FLAG CPI PSUP ;PRINT SUPPRESS ? JZ PSUPCK ;YES..TOGGLE FLAG CPI IMON ;IMMEDIATE MODE START ? JZ IMFLGS ;YES..SET FLAG CPI IMOFF ;IMMEDIATE MODE STOP? JZ IMFLGS ;YES..RESET FLAG CPI CR ;CR? JNZ GETEXT ;NO...EXIT XRA A STA OUTFLG ;YES..RESET PRINT SUPPRESSION MVI A,CR GETEXT: MOV C,A LDA IMFLG CPI IMON ;IMMEDIATE MODE ? MOV A,C JNZ NCONEX ;NO...RETURN TO CALLER WITH CHAR CALL BCONOT ;YES..IMMEDIATE %  7 DRIVES ; OUT 078H ; ; LDA 0DH ;GET H88.CTL PORT VALUE ; ANI 0CCH ;MASK 4MHZ, ORG-0, 2MS CLOCK, AND SINGLE-STEP OFF ; OUT 0F2H ; JMP 0 ;JMP TO MTR90 ; ; CONSOLE OUTPUT INTERCEPT ROUTINE ; NCONOT: LDA OUTFLG ;PRINT SUPPRESSION? ORA A RNZ ;YES...IGNORE ECHO MOV A,C STA PMCHR JMP BCONOT ; GETCHR: LHLD REVBUF MOV A,M DCX H SHLD REVBUF CPI 0FFH ;EOB? RNZ ;NO...RETURN LHLD REVBUF INX H ;POINT TO EOB SHLD REVBUF CALL MOVBAK ;MOVE JUMPS BACK LHLD MEMTOP ;SEE$ ; PMCHR: DB 0 PSUPFL: DB 0 OUTFLG: DB 0 IMFLG: DB 0 MSUPFL: DB 0 CONSTK: DW 0 ; DB 'BDOS>' ;BDOSVE: DW 0 ; ?PLEN SET $ IF (?PLEN MOD 8) GT 0 ?PLEN SET (?PLEN AND 0FFF8H)+8;GET NEXT BOUNDARY ENDIF ; DRVERL EQU ?PLEN ; DRVL8 EQU DRVERL/8 ;LENGTH OF RELOCATION BIT MAP ORG DRVERL ; ENDIF ; ; END OF EX RELOCATED CODE SEGMENT ; END  ; DRVL8 EQU DRVEX: STA DONEC RET ; PMSG: LDA MSUPFL ;PRINT MESSAGE AT (HL) CPI MSUP ;MESSAGES SUPPRESSED? RZ ;YES..EXIT PUSH H PMSGL: POP H MOV A,M CPI '$' ;EOM? RZ ;YES..EXIT INX H PUSH H MOV C,A CALL BCONOT JMP PMSGL ; F121: LXI H,BSWARM ; INSURE ONLY BIOS 1.1.2 LXI D,NWARM ; CALLS FROM NOW ON 1.1.2 MVI B,3 ; FOR PROGRAMS 1.1.2 CALL MOVE ; THAT MAY HAVE 1.1.2 LXI H,BCONIN ; COPIED OUR 1.1.2 LXI D,NCONIN ; ADDRESSES AS 1.1.2 MVI B,3 ; IF THEY WERE 1.1.2 CALL  filename with a P. TYPE ZCPR.DOC will page TYPE ZCPR.DOC P will not page LIST------------------------------------------------------------------------- This is an added function that comes with ZCPR. LIST will send the specified file to the LST: device without paging. This is intended to be easier to use than PIP LST:= etc. and not as uncaring as ^P. LIST ZCPR.DOC sends ZCPR.DOC to the LST: device ERA------------------------------------------------------------------------ IF BDOS+1=MEMTOP XCHG LHLD BDOS+1 MOV A,E SUB L MOV A,D SBB H JNZ EXEND ;DON'T REPLACE BDOS JUMP INX D ;GET TO BDOS JUMP LDAX D MOV L,A ;LSB INX D LDAX D MOV H,A SHLD BDOS+1 EXEND: CALL PMCHRS LXI H,DONEM ;TELL USER WE'RE DONE CALL PMSG LHLD CONSTK ;GET OLD STACK SPHL JMP BCONIN ; ; ^C ABORT EXIT ; EXABRT: LXI SP,MEMTOP ;^C ABORTS EX LXI H,ABORTD CALL PMSG JMP WARMX ; WARMR: CALL PMCHRS LXI H,DONEM ;END MESSAGE CALL PMSG ; WARMX: CALL MOVBAK ;MOVE JU ZCPR I USERS GUIDE ZCPR is a Z80 replacement for CP/M's CCP. This guide explains the differences and provides an introduction to the commands and utilities available in a ZCPR environment. TYPE------------------------------------------------------------------------- Under the old system, when the CCP received a TYPE command, it went merrily along writing to the screen as quickly as the video section would allow. On a KayPro running 2.5 MHz the display can be easily MOVE ; IN THE BIOS. 1.1.2 LXI H,BCONOT ; (MBASIC DOES THIS) 1.1.2 LXI D,NCONOT ; 1.1.2 MVI B,3 ; 1.1.2 CALL MOVE ; 1.1.2 RET ; 1.1.2 ; ; WORKING STORAGE AREA ; ABORTD: DB CR,LF,'>>>Ex Aborted<<<',CR,LF,'$' STARTM: DB CR,LF,'(Ex Active)$' DONEM: DB CR,LF,'(Ex Completed)',CR,LF DONEC: DB '>$' ; REPT 10 DW 0 ENDM MEMTOP: DW 0 REVBUF: DW 0 SAVBUF: DW 0 CCPJMP: DW 0 WARMPT: DW 0 ; ; ORIGINAL BIOS JMP TABLE ; BSWARM: JMP $ BCONST: JMP $ BCONIN: JMP $ BCONOT: JMP -- ERA has been improved when erasing files with ambiguous file names. ERA under ZCPR lists each file to the screen as it is erased. SAVE------------------------------------------------------------------------- With the CCP, whenever DDT was used to modify a file the SAVE command needed to have a decimal file size. This was unfortunate since DDT provides hex file size information. SAVE under ZCPR will allow the size to be either decimal or hex. In addition, SAVE will also accept the size to be MPS BACK JMP WARM ; ; SUBROUTINES ; MOVBAK: LHLD WARMPT ;MOVE OLD JUMP TABLE BACK TO BIOS XCHG LXI H,BSWARM MVI B,12 CALL MOVE CALL F121 ;CALL 1.2.1 FIX FOR MBASIC 1.1.2 RET ; MOVE: MOV A,M ;MOVE STRING FROM (HL) TO (DE) FOR LENGTH IN B INX H STAX D INX D DCR B JNZ MOVE RET ; PMCHRS: LDA PMCHR ;SET PROMPT CHAR ONLY IF SPECIAL CHARACTER CPI ' '+1 RC CPI '0' JC PMCHRX CPI '9'+1 RC CPI 'A' JC PMCHRX CPI 'Z'+1 RC CPI 'a' JC PMCHRX CPI 'z'+1 RC PMCHR controlled with ^S. My KayPro is now running 5 MHz and the text on the screen is often scrolling to fast to stop where I want with ^S. ZCPR automatically "pages" (i.e. displays a screen-full of text) and then politely waits for any character from the console before displaying the next page. When using this command, entering a regular character may have the undesirable effect of printing that character. I usually use the up- cursor key since it is not printable. To disable paging merely follow the&  expressed in sectors. SAVE 16 A.COM saves 16 pages SAVE 10H A.COM saves 16 pages SAVE 16 B.COM S saves 16 sectors SAVE 10H B.COM S saves 16 sectors Also, if SAVE sees a file in the directory with the same name as the file it is SAVEing it will prompt the user "Delete File?". The user may answer "Y" and the original file will be over-written or "N" and the SAVE attempt will be aborted. REN----------------------------------------------------------is disk. The other files come with the KayPro. Put the disk in drive A. The system tracks will be modified on the disk you install from (must be drive A). To install ZCPR, simply type: EX14 INSTALL Your computer will become quite active. Do not enter anything from the keyboard until EX14 says that it is finished. You may then hit the reset button and enjoy ZCPR. Once installed, ZCPR may be moved to other disks using SYSGEN. If you are interested in the source code and the full n of the program at 1000H The address must be in hex. GO--------------------------------------------------------------------------- This command is similar to jump but it does not allow an address specification. GO will simply begin execution of whatever program resides at 100H (the beginning of the TPA). GO is functionally equivalent to JUMP 100. INSTALLING ZCPR-------------------------------------------------------------- To install ZCPR on your sys:10E40000C305E5C301E55000202020202020202066 :08E41000202020202020200024 :04E4590008E417E4D8 :10E47700434F4D01242424202020202053554200BF :01E487000094 :10E4BC001600004449522084E84C4953545DE954F9 :10E4CC0059504561E955534552C0EA44465520CA56 :10E4DC00EA474F2020D7EA4552412035E9534156AF :10E4EC0045FAE952454E207CEA4745542081EB4AD7 :10E4FC00554D50D2EAAF3207E43177E4C5791F1F8E :10E50C001F1FE60F5FCD48E6CD0BE6322AE5C17939 :10E51C00E60F325CE62803CD10E6117AE43E00B734 :10E52C002FC42AE62F322AE53A07E4B7202931779---------------- This file renaming program is also improved by ZCPR. Like SAVE it will prompt the user if the new name requested is already present in the directory. DIR-------------------------------------------------------------------------- Under ZCPR, DIR can be made to show only non-system files, system files or both. DIR *.ASM will show non-system .ASM files DIR *.ASM S will show system .ASM files DIR *.ASM A will show all .ASM files Exclusive ZCPR ZCPR manual on disk write to: Micro Cornucopia P.O. Box 223 Bend, OR 97709 and we will send it to you for the regular price of our user disks ($12.00). ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: tem disk, you need a disk with system tracks and the following files. *EX14.COM This program handles the submit file *INSTALL.SUB This is the submit file MOVCPM.COM To generate a CPM image file DDT.COM To overlay the CCP with ZCPR SYSGEN.COM To place the new system on your disk *ZCPR.HEX The ZCPR replacement The disk you use can not be Read Only and must have at least 10K available for saving your CPM image (CPM64.COM). The files marked with a * are on thF :10E53C00E4CDAAE5CD00E6C641CDB1E5CD46E6B7C2 :10E54C002812FE0A3809D60AF53E31CDB1E5F1C6DE :10E55C0030CDB1E5CD6AE6CDCBE6CD04E6CD00E617 :10E56C00325CE6CDE3E7C4F2E6118BE5D53ADAE7A7 :10E57C00B7C2DCEACD62E8C2DCEA7E23666FE9CD85 :10E58C00CFE7CDE3E73A9CE4D62021DAE7B6C2F236 :10E59C00E6189BCDE8E54E6F2046696CE5C93E0D4B :10E5AC00CDB1E53E0AC50E025FE5CD0500E1C1C95E :10E5BC000E01CDE1E5C361E6F53E00B72806F1C5D5 :10E5CC000E0518E4F1F5CDB1E5F1FE0ACAE1E9C991 :10E5DC00119BE40E14C5CD0500C1B7C9F5CDAAE554 :10E5EC00F1E3FCommands GET
ufn ----------------------------------------------------------- This command allows the user to load a file from disk into memory at a specific address, regardless of what may be at that memory location. GET 1000 A.COM will load A.COM at 1000H The address must be in hex. JUMP
-------------------------------------------------------------- This command will "call" a routine at the memory location specified. JUMP 1000 will begin executio'  5CDF5E5F1E3C97ECDB1E57E23B7D9 :10E5FC00C8F818F50E1918091180000E1A18020E19 :10E60C000DC305005F0E0E18F8AF32BBE4119BE48E :10E61C000E0FCD05003CC90E1018F7119BE40E111E :10E62C0018F00E1218EC212AE57EB7C83600117AC4 :10E63C00E40E1318CC3E005F18021EFF0E2018C10A :10E64C00CD46E687878787215CE6B6320400C93E53 :10E65C0000320400C9FE61D8FE7BD0E65FC93A2ABD :10E66C00E5B72845117AE4D5CD1CE6D1283B3A898B :10E67C00E43D329AE4CDDFE5202F1107E421800040 :10E68C00015000EDB02188E436002335117AE4CD39 :10E69C0023E628153E24CDB1E5210815E6CADEE9CDAAE53E1732BCE421BDE4BA :10E98C0036FF060021BDE47EFE803809E5CDDCE5CE :10E99C00E1203DAF7734218000CD39E77EE67FFE64 :10E9AC001AC8FE0D280EFE0A280AFE09280DCDC431 :10E9BC00E5041812CDC4E50600180B3E20CDC4E5C5 :10E9CC000478E60720F5CDE1E628B9FE03C818B4B3 :10E9DC003DC8C37BEBE521BCE435201036163E0068 :10E9EC00FE502808CDBCE5FE03CA8BE5E1C9CD3E3F :10E9FC00E76F2600E5CD4DEA0E16CD1EE6E1283A6E :10EA0C00AF32BBE4CD2CE713FE5328021B29ED5388 :10EA1C0059E41100017CB528182BE521800019E57B :10EA2C00CD07E6119BE40E15CD33E80603FE2E200613CDF7 :10E81C0033E81803CD54E8060423360010FBED53FF :10E82C0059E43ABEE4B7C9CD0FE7281C23FE2A20D1 :10E83C0007363FCD5AE818077713FE3FCC5AE8103D :10E84C00E6CD0FE7C81318F923362010FBC93ABEE2 :10E85C00E43C32BEE4C921BFE40E0B119CE4060477 :10E86C001ABE200A132310F81AFE202004C9231004 :10E87C00FD23230D20E50CC93E80F5CDE3E7CDC586 :10E88C00E7219CE47EFE20CC2DE9CD2CE706002868 :10E89C0016FE412806FE53200E068013ED5359E454 :10E8AC00FE532803F1AFF5F1571E00D57832D4E8AA :10E8BC00CD27E6CC9FE528673D0F0F0FE660EBCDC5E7CD15E6201B3E00FE0003 :10EBAC00280932ABEB5FCD48E618E921DAE7AFB6BE :10EBBC00C277EB360118DD2100013EE3BC3816E5C7 :10EBCC00EBCD07E6119BE4CDDFE5E12006118000DB :10EBDC001918E73DC8CDE8E546756CEC3E01B7C9A0 :0000000000 E4CDF5E5CDE2 :10E6AC00E1E6C8CD32E6C33AE5CD32E6CD4CE63EE6 :10E6BC003ECDB1E50E0A1106E4CD0500C35BE621A3 :10E6CC0007E44604237ECD61E67710F83600210876 :10E6DC00E42259E4C9D50E0BCDE1E5C4BCE5D1C9A2 :10E6EC00CD3EE7FE10D8CDAAE52A5BE47EFE2138AC :10E6FC0008E5CDB1E5E12318F3CDEDE5BFCD32E66C :10E70C00C33AE51AB7C8FE2038DCC8FE3DC8FE5F28 :10E71C00C8FE2EC8FE3AC8FE3BC8FE3CC8FE3EC929 :10E72C00ED5B59E41AB7C8FE20C01318F7856FD0FB :10E73C0024C9CDE3E721A6E4060B7E2BFE202004A2 :10E74C0010F81804FE48282B219CE40100117EFED1 :10DE1E5D1E1200B18E5 :10EA3C00E4119BE4CD23E63C2003CDE1EBCD04E6D1 :10EA4C00C9CDE3E7C2F2E6CDC5E7CD27E6119BE4DD :10EA5C00C8D5CDE8E544656C6574652046696C6580 :10EA6C00BFCDBCE5D1FE59C28BE5D5CD3DE6D1C9B4 :10EA7C00CD4DEA3ADAE7F5219BE411ABE401100045 :10EA8C00EDB0CD2CE7FE3D2028EB232259E4CDE35D :10EA9C00E7201EF14721DAE77EB72804B870201171 :10EAAC0070AF329BE4119BE40E17CD1EE6C0CD9FD8 :10EABC00E5C37BEBCDECE65FCD48E6C38EE5CDEC54 :10EACC00E632A9EB18F5CD7CE7183C21000118378C :10EADC003A9CE4FE2020143ADAE7B7CA8EE53D32C04F3E56 :10E8CC000ACDBCE7D1D5A2FE00204AD17B1CD5E6EF :10E8DC0003F52005CDAAE51808CDEDE520207C2018 :10E8EC00A0060178CDBCE7E67FFE202013F1F5FEF3 :10E8FC0003200B3E09CDBCE7E67FFE2028163E2008 :10E90C00CDB1E50478FE0C300BFE0920D63E2ECDA1 :10E91C00B1E518CFF1CDE1E62005CD2EE61897D163 :10E92C00C9060B363F2310FBC9CDE3E7FE0B2012C3 :10E93C00CDE8E5416C6CBFCDBCE5FE59C23AE5CDE6 :10E94C00AAE5CDC5E7AF47CDB4E8119BE4CD3DE6D4 :10E95C00C93EFF1801AF32C6E5CDE3E7C2F2E6CD02 :10E96C002CE732EBE9280513EB2259E4CDC5E7CDB2 :10E97C00E75C0020281823D630FE0A301357790707078173 :10E76C00380B8138088238054F10E379C9C3F2E6BB :10E77C00CDE3E7219CE4110000060B7EFE20282D42 :10E78C00FE482829D63038E5FE0A3806D607FE1092 :10E79C0030DB234F7A07070707E6F0577B0707079D :10E7AC00075FE60FB2577BE6F0B15F10CEEB7DC989 :10E7BC0021800081CD39E77EC9AF329BE4CDD9E70A :10E7CC00C81807CDD9E7C83A5CE6C310E63E00B7D7 :10E7DC00C83D215CE6BEC9219BE4AF32DAE7CD2C03 :10E7EC00E7ED535BE41AB7280ADE4047131AFE3AEA :10E7FC0028071B3A5CE67718067832DAE77013AF15 :10E80C0032BEE40608C :10EAEC005CE6CD5BE6CD10E6C38EE53AA4E4FE20F1 :10EAFC00C2F2E62177E411A4E4010300EDB0210099 :10EB0C0001E5CD8BEBE1C02269EBCDCFE7CDE3E79F :10EB1C0021DAE7E57E329BE421ABE4CDE6E7E17E4A :10EB2C0032ABE4AF32BBE4115C00219BE401210069 :10EB3C00EDB02108E47EB72807FE2028032318F542 :10EB4C0006001181007E12B7280504231318F678ED :10EB5C00328000CDAAE5CD04E6CD4CE6CD0001CD4A :10EB6C0004E6CD5BE6CD10E6C33AE5E1CD41E6CD5A :10EB7C00CFE7C3F2E6CD7CE7E5CDE3E7E120F3CDCB :10EB8C0094EBF5CD41E6F1C922C4EBCD46E6324219 :10EB9C00E632AB