7\XLDCPM3 MASMENUCOPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<د2? ه!߶2:2a{_:߷ʖ:߷>Ľʖ:=2–!B!6#5ʖ:*{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# ADCOMf^: !߶ Â$$$ SUB"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6y:ʑw:2E**E}DQ>2Ó5ELV_hqx|ÀÄÈÌÓÚÞâ$ͷtE(tͷtͷtͷtͷttt t!t"t#ͪt$ͪt%t&t'z2t!("R!"T:C*R|+"R|*T"R!"Tt4t012P2Q2<:P(2Q+2:P+:<:Q+:P+_ 1!"3"5)>22!"!"!~~jwO1!VsV1!Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ڷ"͌#>?͌͘ =_.:;<> Oڅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3ۯ21y_͸2y2ͽ:طS:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!{V  :g|KxGs1%VKW{MLLLh  1234567890-=`qwy[]a;'\zm,./eiou!@#$%^&*()_+1͘A͌>><92^ :߷¥.!_~#fow]ݭގޥ!v"!çREAD ERRORçNO FILE^:߷ ! ~ 3#0 Wx x ڀ ڂ G ~ # 3x~#B!Y~ɯ2:߷=!߾ý:߷=!߾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄO*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*~QWY{}A:"|ZM<>?EIOU16T!336&*D+2:$2(Iu1 ## #### ###^^nfut ### ݯw4!Y~ʆ͌†t=ʆf ^ T ݯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Y޸psp2mÆÆf ͧÆFILE EXISTS _: É: :߷ʉ=2)ͽÉ T!@k!B}|q=qf^!~2>`~2߯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6~QWY{}A:"|ZM<>?EIOU16T!336&*D+2:$2(Iu1 ## #### ###^^nfut ###i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2Ó5ELV_hqx|ÀÄÈÌÓÚÞâ$ͷtE(tͷtͷtͷtͷttt t!t"t#ͪt$ͪt%t&t'z2t!("R!"T:C*R|+"R|*T"R!"Tt4t012P2Q2<:P(2Q+2:P+:<:Q+:P+_ 1!"3"5)>22!"!"!~~jwO1!VsV1!{V  :g|KxGs1%VKW{MLLLh  1234567890-=`qwy[]a;'\zm,./eiou!@#$%^&*()_+LDCPM3 COMCPM3 SYSCPM3 SYSHCCP COMMODE COM !DRIVES COM"SUBMIT COM*#$%COPYSYS COM&'DEVICE COM:()*+RMAC COMj,-./012TYPE COM34PUT COM75678SHOW COMB9:;<=MAC COM\>?@ABCHELP COM8DEFGPIP COMDHIJKLSERIAL ASMNDOS3 ASMNDOS3 ASMOCRT ASM     CRT ASMTYPECR ASM RSXRM ASMTR ASM5NTPDATE ASM(KEYBD ASM#SNIOS3 ASMEND ASMNETSTAT ASM LPTBL ASM!MBIOS3KPASM"#$%&'()MBIOS3KPASMV*+,-./RENAME COMMNED COMIOPQRSDIR COMrTUVWXYZ[SET COMS\]^_`aDUMP COMbLINK COM{cdefghijTR COM kGENCPM COMlmnopqrsGENCPM COM(tuvSETDEF COM wxHEXCOM COM ySAVE COMzLIB COM8{|}~PATCH COMXREF COMySID COM>SNIOS0 ASM0WIN3KP ASM`123456GETDP3KPASM?789:FDC3KP ASM;<=>?@ABFDC3KP ASM"CDEDRIVES ASMFGMODE ASMHIJKLMNOMODE ASM$PQRMBIOS SUBSGENCPM DATTUGET COM3INITDIR COMINITDIR COMzGENCOM COMtERASE COMDATE COMTYPECR COMRSXRM COMNDOS3 COMNTPDATE COMNETSTAT COMCPNETSTSCOMTPA COMMAIL COM@DSKRESETCOMLOGOFF COMLOGIN COMNETWORK COMLOCAL COMBNKBDOS3SPRjHELP HLPRESBDOS3SPRBNKBIOS3SPRkHELP HLPHELP HLPHELP HLPHELP HLP0LDCPM3 ASM*CENTR ASM SCB ASMMYKEYPADASM PUTSYS ASM˿Unknown ROM version! $LDCPM3 vers 3.100e - Got ROM id . $23!!23!"# error: File not found: CPM3.SYS $ error: Read failure: CPM3.SYS $ڣ3͗@YsY̓Y׬Yͅ:߫Asү:@ү@ү$̓—>2—͇ͱ* «>2͙wBp+ү:w͚AP{ 2W>O2ø}R*):r"ök*w)*c)-}ͤ14!"&p!&ʀ!&ʡ &  Y! :W!":ʑW*"*J@:F:N:O:G*+:W:G*+:Wͻ*|g %} !~#2~#.~#0~#1#!"J>U2F:!V:( !S !P:2Nx2O"L/!"J:2N>2.!\"J>32F>2N2O:!S !P!t"J>2N>22F>2O!V*d^#V*L|CPM3 SYSTCopyright (C) 1982, Digital Research BNKBIOS3 SPR F700 0900 BNKBIOS3 SPR BA00 2600 RESBDOS3 SPR F100 0600 BNKBDOS3 SPR 8C00 2E00 60K TPA $$$$$W8IXZsk|x>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQKK{<<ʽ! ~6 69BK! OS$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282:\(:q@(y2q:qܷy(/[]i:qO:\ܱx>@2q*]:[_W2[Rͻ:Z8_<2Z*]PzW"]K_B0 :O滱CRT !Y w#*A"Z*D"]*F"_>:Yܷœy y[]iu:[2Ͷ:%OHqqX1>  .H - >>:Ӱ082c>A `2%5!6#6 :Oyʶ:%gx0XDol(ˠ @t( 5 . %- og}:c0|! 57 @>y$A{CM^#V#zy8#0#!nodev nodev nodev nodev nodev nodev nodev nodev MsC1C!4!~#|~(5 #~#fo~ +6####>*}D0000000000000000001R*SmwrX8#;@E\aÜPÒ/×ï) L×_o@ WzdG::{_>8(2j{_*_BKPY|W]Sk[ڷ >2i:jܷ[k͞2a(:hܷ:a[k͐:i/7:B*_PB|g"_(*ҫD*_/P|W] |g! = DM@*]T]:[O>PO |gͻ:[o&ë>2h>2h:d _:f V*]K_ܷB0!B|gK] |GM! |GM*_0|g!P|gͻ*]PB|g:[O!PB*]:[_R|W]*]ͻ!PR0#!R|`G}iO@^*]PPYDM|W]*_ |gGMR0!R DM*]ͻ*_0|W]!P:Z *_PR|g(9J[l}  @U' Z37X Z100 EPSON ASSOC FMT8 FMT9 FMT10 FMT11 FMT12 FMT13 FMT14 Q1q_#~pW~# ~(<#~#恻 6~p 0#^#V#N#F## O>w#O>pw!r#######~ !r=KAYPRO UNUSED MMS Z37 handler v3.100e$ 4 (4(4 ]ðñô7YKAYPRO Parallel Printer v3.100c$23! YN#F#~    $I$I$I$H@HUUUUR$D@@URI I!$@!IBHD    ;@P P (?(?DF ?  (   ;@(@   @ $ [?  (   @(@!" ~y/!62&/ > ͼbC { 7ɯO& { % 7ɷO*q >_#>W2*N#~/ I({ 2"222s1:O!O F#N#fi!ƻ:W/G:lO*#(_!5_~ Ҧ: ӷ¦͞ æЀ ˀ˩yq+Oxp>2Ͷ8h(˩H(ˀˀH ˩>2*o##"D8:<: ӷ >2!ƻD*Ã1Oj$|Ãà à ÃBB#zW|gx|y}>xzy{>++ xEͻ:Zܷ[]!P 0DO |gDMR|g[_x|y}>xzy{> xxFx|y}>axzy{>_P|g"_ V*_P|g"_ V*_|g!Pxx|y}>xzy{>#zW|ge:aLD (> ʻ (ʫʰ L Kd>2Y:\ (6*_P|gT] |gͻ!P*zîܙrܻKAYPRO Keyboard handler v3.100e$4laÉ}KAYPRO Z80-SIO2*s{Yvvvv v8>:2f>Q{ɀ/OLOR`'|KAYPRO CRT driver v3.100g$PXPXPX::G:O 毰>2:Q!f~6De:?>(>25:Q*s QG!XRyW~KAYPRO Floppy Disk Controller 3.100e$(NyN++ >yx+8 xɯLPT >(y@@$R_$_$UEM xO_P!! +~~0_W~@G+~悳_##N >yAyQNˑV~ 0=yl(NxN yxy~0_W~@G+~悳_##N >yAyQʮְ!wgNO ~ɯ(y>DCE DTE MODxzWy{>> $xzy{><ܯ+| ɯ2[2Z*_KEYBD !~º*qqpn f *~ *~~G?ڴ q#p>2a! 658Ͷ8H:c0 *F#N(((: FN66~ .` !V( *~~  pqÿ~_( O(G(*ov:ӷ!""*~"s222!>2 >2U~º>22!~wU( ~wúϯ*~#<(:!ӷʿ~wú*~:R2:Q((1 m!ˮˎˆ#ˮ!#*o##"ӯ2~ą~ :ӷ+"}{_}o>2~77ø~7"9:OG#Q{ozg# ""!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ=2(*f*(}DɯQ"(>QKQKQ>Q"%Q!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!͐c!|g!Y6 yREhAG2a6 :aBbCʼy2f6 y2d:a=*l s6 y2g6y2} 2f:\2\!M:f G( P_:d PO2[{2Z [_V >yxOA Q A YDzWD:\͐D~w~w~w~w`> y:\2\>@2q*Z"b:\ 2\!\y0(=(=(=(=(=(=(!=(0~w~w~w~w ~w*b| 2dV:Zȷ=2Z*]PR:[ܷ :Zܷ(=2Z>P=2[[]>O2[*]O:[O[]<2[W!\y0(=(=(=(=(=(%=(0=(4 COMA2üBżKAYPRO Winchester Disk Interface 3.100e$De?S[úx2(:((?:A2( KAYPRO CP/M 3.101b (c) 1985 DRI and DRM $ No CCP$CCP $> | (***$> ( | G({.x:A( s.1._>#Wo>g2AG>Y!! ^#VA**$J>| **9(>M***:gܺ:m܂W 0:n܃_:gܺ:m܂W:n܃_M:\  :Zܑ0DGP! )!P[]:[OGBK:\2\[]! (!>2h>2h[fʹSf2o[dʹSd2pW:o_:fW:gܺ>8>2m:d_:eܻ>8>2n:oO:pܹDM!8(.:eܻ:n܃_ 0:m܂W|A Q A Yͨqͨ_!|g{ _z W0Dyx~!O N#fi{*mֿȿ:?O!~O/ͩq!>!;!:wK:D=2>22ɯ~v7*qq#p N#fi*B"*s#r#6 "CCCs:A2i`z n&+c 2*"*"*o~ ###v(:8:jO! [qs#r!:jO! ^#VSq*o~ #>(#~(>MOG#n( !C[q! N#F ! F?2^#V+ɷ*oy2j!_ ~(k2kOC͗8a2l"m^#V#N#F:lo& "o@ AO :lO "q8)2>͓ !o#~>T}! 6**#K"G*~ xr͐-xą@˩7(͚Sʀw: :<RHͥ:>~c!o#~E^#V)G#~#~!~ b k##N#F#^#V#~#fo~o2{2g*wޟʪҢÞ+}*#}o|g:O*s#r#w!~w/~@w//Hͥ*>=)_g:0"ök*w)*c)-}ͤÀk*s":;:r2͚Μù͚Μ©͚}/_|/*W}_*c"}o|g"c>2{ʿ:@3 }( }8o<:@U [} xʻ}ӄ|Ӆ:Ӄ>ӂ> 2?i(H:?Ӈͱ(>ۇG 8_(4>02?i(%:?ӇGƯӄӅ<ӂ>Ӄ> ӇͱG.ۀ x !ۀ *"*" :>:@U>*o~<<_!~#fo"į*o#F:ӆ͡>Ӂ*!_~2# 2>:P2@!:@U!"":ӆ|:w:ʴ>2d:#Ϸ>29෯2~2#!   )xð*}*}"*x"xm*^#V* s#r**s#r*:﴾Y4Y̓**~#ng* s#r ^#V랚a##)0"xx!"""XC*~<ζ*":!::9*"x"*"g*3:= :Oi :=H:Gi a6:G/O**W :T=ܽ A~$# w++~'w0#~'w+ GOxGd0d 0 !!!!! 2{Ͷ2:ͨW:ͨB(0 O= 0 :ͨ88O:ͨG ??OUD(0y xy(DGy<2߽> >$ !>g"::2޽:2ݽ:2ܽ*m>2ѽx 7R0x >2ѽ7ZxNd8dͶ2xͶ2!н{Oz8 YW#x 8xͶ2ώ A$w#Y$  :!彾ܐ:ܽ2:ݽ2:޽2>2ѽ:ͨG:x(dNG2ѽ!m :ͨO :ͨ=(Gнo—>2—͇ͱ* «>2͙wBp+ү:w͚AP{ 2W>O2ø}R*):r͚Μc2ZT͐-ڣ3͗@YsY̓Y׬Yͅ:߫Asү:@ү@ү$͚̓A؜=:<~?¯kî?~?ʾZT͐ڮ*>o"͒"!Þ:Oݠ"Ý}6͚ ~2Asv@NN~v$̓W+vw̚v$̓rrͅ:r߫>2+A@2ҍ aʚ~µ6*:X)!:T>qkֵ!:6>X*{Q:_2{2Ē"͂"X~<µ#cdfg!"()*N!r)!N!)z<*)"!":X*:w:w#:w*2*}D2!"*"!@)!@)!@)!~((#### y p#q#s#ro ͏v ʍ !O:2B ͏|>2z͏<2͏@,͏z͏|2y2fÇ|f*u|Ç:yG8!)>2 Gy ҳs#r#<GyOx!  N#fiOf”ïfźM  ɺ*"*}"*"*"*"!x:|1!|G^º>">"!}">">"!E"> $> >$>O#>#>J!!}#>!}!}!^#V#zǺ~##ںO+~#!r!Z2!"ög:2T͐-:ʹ>2<2ڣ!w: >2*6ݠݣO~<w:*)@ u:G*g`~!x_<_@*oy<:/G?~##~? 6K@?F6##N6⬯2p##q:#*~w>2*p@! ~*"v@*w# ) 6#̬͙N#FxT]## #~ ȷ  *4# ' 4! *~^ ^33G# Pv:dv6 yB!%$)3-1Q5`9o=A̓¡>2ͱԬ߫?~¾¾ʳƳ>w͙=2͜:wÚ~̓ʑpá!6NwͧBpͧȸÚgsr͐-͜ěͤS)_ͤ̓~?w͐s-?F͜pN͆p# Þ͐*6!¿?~p*6 >2ͱݬԬ߫ͷw*oq͋"@6ȸ͚Xͤ͋͗wO~<: g~w#w#6##)͋@ * g~?G++ ɯ%ۄ ۅ1( >Ӆ>1ӄ>pӇ>ӆ&ۇw}&ۇ/}  ^&ۇ_ } ͱ(ۇG ɯ<&} ˏ&`ۇ( } =2>ہ( w͡ ͡(>Ӈͱ(ۇG կ2>:ӆz9bڗ>2#×:#<ֵ2#*!""++"29Cw*{}<^#Vz!c!>c! Jw*q~69!͐=‡*":*}®:=::<>2*i^#V+ d!K*}@*)): K:) O "!w [O?WGzO:VxGyOGxwq*}}寯2̓*~wć"̀!~$6:03i"!~6*>=)Q!QX@˩ >2 ˩!!q#p#w2wW*_3ҫ-!s:!xQ*ozg**|g͸*u* Ɲ ѝR>22Zw*q>ww:c *#*is#r*:!:):O!*c:Oͫ}@2æ ~á*g:o$*~K6?~wKw**i{#zir+s{O:w:Ғ4~:w?r##rp# ä |g}oì*g #G ¾1*q:*w***> r 2":O:G2!w*~zWw+ !z?#~*!* *G!O~2~m͗O~t>2?:2Ó*"r*r"ÿ<:g:!͐*f}D! ~6t!rͷ֏O(^ƏƏƏ  :Function = File = !,$"h!9"f! ͉:2t™:!=Hgo:O*;*͂:A2=/::0! dگ61#d ڸïp#:w#6 !6:6 *#!)6.#)͂ O(BDOS > wM  2*7w#6?#7 .,:;[]=<>|!?]45#Ra{i_p# l s sɡ( ȸˆʀHÈ2xą ):@ΣO~#w͚ʀô̓b_++V@* )͗Os++r~Gw#* #~$%+@*9>  #>? ;*~ w-xąH"0 *ĊHEʀ@~›:6¦w͚̋ȸÇPY*{zBKNyʺ Nú2: *~w *" ݠ2>ʄ@~k:(s~*9~Ês~Ԭ~ͅ<9ʌ^:—~x ):*:ŕŕ>*(+"(w++2+2+ɑpؑ!" >2+2*jx.#NzW::!2W!5=^x^z:m:*;#wO:͂^2¢ů͠Ĕ:!ڽ*(~ݒג5WèՔؑjגM2ͨxΔ*(+w"(j͐ !%"(^-:*$P:<\:W:2xM s:<9>2:*9x~+q’x2:*:<œ. ʩ.ʩAܙrr##sܙ<}rcN! ~态O>G~G!~G~o>_yG~.|°! w:ck[!x?[! ~ʤ͆[͗PPvqO-á=.:<ʰ! Vq##~_@wڴͶ:WMںʛ>úͶ >TJ:!ʷ͞x!Ǩw4 ϨPWިPܙÂՙÂ*!!~~#~O~#FsO s#r:(„y==„*!^W*y^#Vx7=2wͼկw#KWK*"J T͞*:["g͝DM*0MD"!*MD$:Oë!N: «G>O: ›ù*ě :ڛn` ~#foͤ2Ơ"}:O*"!s#r#p*kN#F*m^#V#F*:O}|y9*+"*}|yP#9**DM"*ks#r*ms#r#pyox*kw#w*mw#w#w>2'å2*OͶyڲò<*Ͳ:0!::ò2*>*ͫ"4#4#4)7 #  w#*J|^#V#"i##"k##"m###"o#"q##"!s )*s!)*|!6~67 l ls:¬MAGrx~:2Ô##~*$*">2̀2kºʺ**iҺ@:O~2~WW:2Ôyʛ?ʔx ʔ |̷ǡÔN:r:/GyOOA +¬ ¢y2:x¹o&:W>OͫE:ڟ?N/*"y2ͦ>2 ݠRXޟDM*w6# x *ow**ws#r̀*i6#6*}"j@*|<ď>!8>8> t>nͦv8 ~*own*&~2+o#"&!+6Mœ:W:2x ͺ*(+"(w  :ܓ>2*2:*(:+w"(ͺ:G::+̜2 5*(~o#"(Mš*(~`Uoj*(~#"(Ñ!*~6s!+6:+‚xoڊ{2Ó#w:2.+:.2-!%"(2*!—"&!*~4:2-Ԃ:Gͳͨ^2+>2:2*N#G2 2GH)+6:2,:!- ͐:,!͐+*(~L#Bxz:*:*(~ʓO+SX:ڜq:ʺ!ʵ>2ܙͤ2ѧO ̛DM͸}ާ>r""2:2* :::29:>:>*ڈ>F6:_/G:ʧ:ڨ|OͤG:_Ơ̛zW{¦|:*}|BKN¦ zyG:!vq:vՙvMڂ?Ͷ >T͓Â!">Â:G:O:h=27ryy/W!:lrrorFile Exists? in Filenameòò>2a.":2:<:55;:2ɯ22{_zW{_zW )7CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword ET] KKͦޟ*w"wͦ"w@ :ßNɟ N#Fy؟*}|h#ð*ͫ# 6*q@!"@**#":&2͒:È0:+Òy<_W`iͫDM*w ~bNpwޟDM*we ^#V#~2>â9͆>!"*y³*X*ÿ͂"*g*K!~<:wb##>w#wě> r!~#xʝʝw>ɯw̩z:»!>wɯ:=zxzz::G:=/ͽx:Āy!4 šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^!=:<>w##~2 4~?ɥ̓¹:<ɥɥüޣAX2rK:w++~=wv4͗O5:2X!"*>o+"v *!b"ݠ": r#~?w#>r# L=J Lv wȸbܙ?~O ͆ڥ†wŒ~è# # x ͗w ٤ڤ٤ڤw@ ~wb͐Úݞ!x>w~6:6~#+w#w+~;wɯ2KOFq-yl?Npg:ʓ~)"!z<~rs^#V#N#FxN:oʲ̀õ(# Þry< <<%zrͷr6r9rMDÌ:o!6!h: ʚnt2 r62>rz<* $No File$ required$ERASE $ (Y/N)? $ Press RETURN to Continue $ (User 0)$NON-SYSTEM FILE(S) EXIST$: $$$ SUB5~y 5 6y(^͐@O:=7:͐y ͐:I ͐:=e: zz#͐͂:! ͐ G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz::G:=/ͽx:Āy!4 šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^! tpi media in 96 tpi drive (R/O) $ Tracks per Inch - 48 tpi media in 192 tpi drive (R/O) $ Tracks per Inch - 96 tpi media in 192 tpi drive (R/O) $ $ Format Type - $ Step Rate - $00 milliseconds $ Drive - A: ( ) $PRESENT Configuration is: $NEW Configuration is: $Invalid command line or command line arguments. $The requested format is invalid for the specified drive. The complete configuration must be supplied $A: does not exist. $The driver module for A: is incompatible wlf   ͫR  L͞L I *  *  A }_Yl !ͮ ͒6 \&đ %* "l ͍  ûȷ45: w ? A I N   SUBMIT COM ! ͮ ! 6 #"l  !cͿ  O!:r :ͦ ͍ !~B I !pͰ ^#VCOM SUB PRL y!cͰ  î !" * %.2P#ͮ !g 4*l +"l ͷ 2 "Qx2Sl "Tx2V!q ~ :p ͆ .ڶ2* og$2| .w#w#w#w#f  d  ###v$L '4  ##F 5N #nQ+n#K l l l#nc# l] l  ##~ ~(!S _^#V"    : ¡   V#^}:8 ^#:~ *a_~2x W* OͿ"k 2m >J>>J+~$>*k :m _"r !"t !n !n :x  "y 2{ 2| :{ ž"y d~#$ʂʂ z>2{ Þ:| Gʞx2| +~#"y z\[y :{ :~ <=ʹ#î%*k  ^#VN#fi    Y  '  {LOADER y; !91""|0!~ʞz=_: _* ""*og*%|}D S#N#F:ʒ#4ʝ^#V{‚:¿*.~w*DM!&_*.& >k s#rr+6.""1*D`.45. F.~. ^#Vx>`. s#rz 6#N#fi%$g1:=<@v_}v=p{_3;{<g"T=X3*j ~P#~R#~L{gbk#N#Fk$&Zcx {~#o}o1!ith MODE. $ inoperative. $Drive is specified but not linked - ERROR IN SYSTEM- $ 6122030 3 61015   D ;! : .44 #4"l ~[* 2 a7 {7 w!Y #! *l "l " ~ U #D ]T!̷ 6*%.w#w!} 6 r 6 #w.6#6 #t#6.wo*.s#r.rͧ ̧ m . ^#V45+ w#w.f.5\A "l " l |F# !( |.~ .w#w~?w; ; ! ~#49 w#~$ A  < > _I  ! 6 ! ~#Ͱ 6 m   _  ! 6=  { *.pѯ:r x , \<=!Ͱ =ɯ2 \s 2 ! D ;! : .44 #4"l ~[* 2 a7 {7 w!Y #! *l "l " ~ U #D ]T!̷ 6*%.w#w!} 6 r 6 #w.6#6 #t#6.wo*.s#r.rͧ ̧ m . ^#V45+ w#w.f.5\A "l " l |F# !( |   The MODE utility is called in one of the following ways: MODE Outputs HELP information MODE d: Displays the present drive status to the user MODE d:arg1,arg2,arg3 Updates the present status and displays it. Valid arguments are: DS or SS = double or single sided QT, DT, ST = quad (192 tpi), double (96 tpi), single (48 tpi), or QTD, QTS, DTS = half track modes e.g. DTS is 48 tpi media in a 96 tpi driv;!"Ï:= w*wWx ~#&*.~s*"ѷ\ Cannot load Program 221282 COPYR '82 DRI <bHA$@DH   A@!" $$@X X X S 1-! j 1".~2.~2 :Xck*kͮ  b < .~=>$.w.6#w.6#w.61.~  .~~w@.p T~º>+~.~~! yͮ Ë.~~w2g !PROFm MODE v3.106 $Requires CP/M 3.1 or MP/M $GETDP.REL not linked into system ${  { 4s 1   }0X|*•#^#V"e [_Rd»  *:} ~̓ͧ~͑!~#"v O 6*v  +"v ~#a{? 7>2} *v AQ2 2 2 2 AG:x2~  `+}yʴ¬#ʌ |~ʛ,ʛ ¬: y02 W rDSQGTxG~S(D(x 2 W>SG! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_ !( : x. +"l ! ͮ   ͮ ~!G8 * ~;#1 կA *l ~:g #I ѯ*l  *l ~0څ :҅ q X x<Ü AX QX X ~@#~:k #^ *jT~# ® wy#ù ! 4 : !Ͱ ~@*h~ yw y/w*hw*h~I E> ͦ > æ % 0  < : ~ȹͦ #* A !g ~6*  * >? A *l " ~0: :: q "l x~0 xG#Gs : &͘ ͤ &ͦ %˜ >  Ʌo$>?· !  > # ͮ x> # ~ Enter User #:e. DD or SD = double or single density S6, S30, etc. = step rate in milliseconds MMS, Z37, Z37X etc. (media formats); the X implies extended format. $Drive A: has a fixed configuration which cannot be determined by MODE. $5.25 inch floppy $8 inch floppy $ Controller - $ Sides - 1 $ Sides - 2 $Recording Density - Single $Recording Density - Double $ Tracks per Inch - 48 $ Tracks per Inch - 96 $ Tracks per Inch - 192 $ Tracks per Inch - 48ILE.S !+2 !  +~d {   O! w+w+: =w! 5 c ʋ  :p  m>> ͧ  N Ĩ –.~+w.~2  9 : ! ~##~ !7 : !Կ : x*l " !ZXچ! 6  zz: 6 : %2p  ͆ : =̀ 2r  DIR TYPE ERASE RENAME DIRSYS USER u"Q}:\=p:r Aæ R ÂN ͙ʸ} !M 545 x ]  ̵ 6 : oG! ~怹>2M  xf>:ͦ ͤ ͍ ͤ f ¹2 TDSx2 Wx2 W~0:0G~S,S S0:0OxGx2 z,k W+jz k+j2} >: ʟ0!<=()tu: ʵ/ݶw: /ݶw: ( (': ( (: I~!c *8#,xݶw}!n >Kr [t #=^[r ~#n *e Ϳ:x  ʤ G!00 }0°> o"  :}     *r ~##~      ##n DRIVES v3.103 $: = ($ Must have CP/M 3$ Csn1n  }0/|* #^#V.d^#V#N#FC:S<*<>~#*:^#V#z~G#N ^#V!>.s#r#-û!>~Hp>Aẅ́~͎>)w>O 2> w )#^#V#{(̈́p{n###>> w> _ dͥ ͥ͹yOҧo@¹z 0w}*|&el\P"=*|5.*& 6!6͝*& ~( 2*& 6e!"!\" "\p.e.:\2O>:2\*& ~ ~H~ H.!4͝*& ~2!6>!`\̓[>!6:<2=O! ~2 ½:<2O>9ҽ!60+~9ҽ!60+~9ҽ!60+~9ҽ!60+4:͓ͪ!"!6:= !6!6#6D2: 151282 COPYR '82 DRI gggggggggggggggggggggggggggggg"D! BH!H@ $!!$"A! D$DHH$B!"  @A  guration is: $NEW Configuration is: $Invalid command line or command line arguments. $The requested format is invalid for the specified drive. The complete configuration must be supplied $A: does not exist. $The driver module for A: is incompatible wASUB 1xCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321Invalid file name $Error On Line $Enter Password: $ERROR: No 'SUB' File Found$CP/M 3 SUBMIT Version 3.0 $Enter File to SUBMIT: SYSIN SUB_ogDM!>))덑o|gQ =?i`N#Fogo&og_{_z#W00001 : $SYSIN $$$$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$  H% : " :#$ͪ:;!6+~<;!6:$¨D2$X*M å:02O> p<ͪå!6͝:ʔ!5K ҎÄ͝xK ҥ*M Ô" :^D2:^^ :@: O :`:@O :`O " :!:/H     " *M : 2    *++" *& ~2 :Ht !4>>!""\ !6>!ڷ :+ ~° !4‘ * DM*"À * DM!" }2 ͣ2$SUBDisk Write Error$Random Read $.$Invalid ASCII Character$Parameter Error$ERROR: Directory Full$Requires CP/M 3.0 $11G"*}0|HҤbP2IK 1">d*++"~"!\. v!q*&!p+q* !s+p+q*:w#6* *#"N#Fy !p+q*!p+q*2 !p+q*!p+q*!p+q*!p+q*!!p+q*2 !p+q*!q*-!q:2!61!sFGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!=F#fh!:~!«!>w~:!5*.~w:; :~!9"1A#u.t.~@w :&/3͖!~6 :~wucy! ʎB d{<ʑ  '*2.2+6.w  :  ͪõ!q!r- "w * :w:C w *#" "*#~22_! 8!0!s*&:0!s!6ͳ:  sͳ:  L!`i^#V#~#fo yo w G: xAo o a{ ì COPYSYS v3.102 (c) 1983 Magnolia Microsystems$ Get System from what Drive (RETURN to quit) ? $ Getting System from file "d:filename.typ"...$ Insert disk in Drive @: and push RETURN (^C aborts) $ Put System to what Drive (RETURN to quit) ? $ PERMANENT ERROR reading drive @:$ PERMANENT ERROR writing drive @:, Disk will not be bootable.$read from$written to$ System Successfully $ drive @:$ Can't COPYSYS to destination drives's media format$ INVALID DRIVE for current system$ Source File+q:2!6*&"1!p+q*<!s+p+q+p+q:=2d** w*#"*#"=  !s+q+p+q:=2ʩ*:w*#"Ì!p+qe*DM!\.\s!q:a:{: :O2:eel !6>!ڜ2 K*&l :w: T:_:…:r:=2O!l 6 3:•!4**& ~ ~ H!4Ýl :S*Q*Sl.l\P"*}=22*2$*.6#6*.~w#~=~#4Ʌo$͖O̓!54  !F6#ȷxO҃>^̓@_: N#͖§>  *.>wÔ#wt~xڔp> ̓ 8>""SYSIN SUB hhhhhhhhhhhhhhWARNING: PROGRAM INPUT IGNORED $_o     `i~< #~2#~2#~2*| W \!\~R 2 .n~ >2 6!.t~: +  >2 6!N#F#*" ^q#Vp" N#F##"^q#Vp" 4! 7o |  ! 6   \\ ? >_ 1m :~# yo ɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $"" INCOMPLETE$ System is too Large for Drive @:$ Must run under CP/M 2 or 3$ 'S' option and command line mode changes not allowed together$ Bad command line option$ Wrong boot loader for destination drive$ Wrong boot loader for physical drive number specified$ Wrong version boot loader-COPYSYS can not reconfigure for destination drive $ No Directory Space$ Disk Full$ Verify-Read Error$ Verify Error$ File renaming error$ Boot loader has been reconfigured to $sd$dd$ss$ds$st$dt$ "d:fil1bCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321NAMES~VALUES~HELP~CON:~CONIN:~CONOUT:~LST:~AUX:~AUXIN:~AUXOUT:~CONSOLE~KEYBOARD~PRINTER~AUXILIARY~AXI:~AXO: &+07?GPXbgkXON~NOXON~NULL~50 ~75 ~110~134~150~300~600~1200~1800~2400~3600~4800~7200~9600~19200 #'+/49>CHMRWCOLUMNS~LINES~PAGESIZE[]=, NONE 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200"$*&("*&(INPUT $OUTPUT $SOOH!I4:H2H'SH!I4:H2H>XH!I4:IR H!I4> XX:e2J(r!J6(*J&!͈!Ls+6!J6*K&))) ~  *KM? H*KMq H*KMX!K4+~!L Å!J4Ê!Qp+q:e2c(!c6(:c _!͈!es!c6>!c/*P)"P*c&S w!c4 !c6*c&))) ~X:cQX!c44:c2f!R6!d6+6>!c*c&S ~:f!cҝX%X !R6*cM? H!d4:e!d6 DX!c4k:b!R6OX:RTX `X"Ͱ.l~2D<: ! :[2[>2\:[_:D!ݖ@ ݾ! Ð :[OT W:r :r :[r !Ô !!~ ʎ ###y nf:[p_~2:\!ݖڼ ݾ ! Ð :\2! a{__> > !w  # ~$ # > Û > Û > Û > Û >Û !"=*?^ Fx!S kbS K :A] o&͡ 2:<2;::O :;O *=MD :<ʒ ) Õ $ *=[B"=z !;4~t 6!:4k :<$ 7:[G!["G*.[GR}|o>g"I! :Y#s#r1!q:22!q!6*& > >*& :R :!4, !r+s+p+q+p+q͐ !#6 *~ *~2#* M# 2!'6:· :'ڪ ú * M# 2Õ v :24 :22&*~2$!'6*~2# *~ P *N! ** =2%!&D !'6!6:&!A :': !4# G *64 *:$w:}{+s#r͐ :z *}#"} !6:#2(O* ~2*&*: !(4*:(w*&*: ¿ *(&*~2Ñ *6*}~2 ̀ :2!!6*}#~2 !!4N* :ename.typ" not Found$ "d:filename.typ" Copied Sucessfully to drive d:$-C:lf@2Zx:m x2Z:\ʁ@2Y:] ʓ>2Y7ɯ!:O>[![͕VS 9͕ V_+OD T SVD 1͕OD T SN_ONd͕VC OE OS ͕ʭ! Ð !N0V:V0G͕ʌ0V:V0OxGx2\O~#,](7!0 1n!  } ڣ! 0! @ң  ]͕:Y–>C2e>O2f>M2g!\!gFT-BAUD$SERIAL $XON-XOFF $Error at the '^'; $Error at end of line; $Invalid number$End of line expected$Invalid delimiter$Invalid option$Baud rate can not be set for this device$Invalid physical device$Physical device does not have input capability$Physical device does not have output capability$Physical device does not have input/output capability$A NULL device can not be assigned to CONIN$Ambiguous assignments to a NULL device are not allowed$Physical Devices: $I=Input,O=Output,S=Serial,X=Xon-Xoff $ "gxX*gDM$Ͱ"gX*gDM&Ͱ"gX*gDM(Ͱ"gX*gDM*Ͱ"gX*gDM !jp+q>!Ҁ>m !k6:=!kڹ*k&*i*k&m w!k4!k6*k&))) ~ !l6>!l *l&m *k&))) *l& !l4:k!k4>>þ>!sq*s&)))  ~2u!  ~2v!6!6::HHUZ :… :’ :°:u*s&)))  w::u*s&)))  w>!2:2:u2t2t *s&)))!  ͜:M@2!6$#6$#6$#͜:L@22Kiy*G"E*I[E!"E§+| *I| *G"E$[E!"E‚+| n*G"E!‹*En‘# "E+| :Ke ! !& +6$+6$+6$2%ʗ!:L2D! !! !_ Ð (!u!!!6T]ɯ/2K[IRÔ !.CCP COMCPM3 SYS??????????? !'6$ *!&*: $ !'6!4N*} ~2 *&*}~2 * M# 2:>!H} !4N*} ~2 * M# 2L :2}{#+s#r*}N# 2!« *}#"}Ð !)q:)a :){ :) :) H H!-s+q+p+q:-=2- **:,w**#"* !.q!76*b"3"5:e( !e6(*d&*e&͈!1s*d&͊!2s:.:.Ha *}+"}p :}++s#r !/6:1!/ږ *3"5*eMS !/4x *2MS :7ҭ Xó /X:e?Ҿ *.M!1 ^#VFXG UXG jXG |XG XG X \<"!\! Ð !"|\#*}Bne*KB )L!ne>A2M! Ð "}!\!*}#"} xq:Yº!5 ʐ ʐ AQ2MO!G=ͤ  Ý:Y!  2A2<0 !b *[R)|2A:Z4! ʐ ʐ AJQJ2LO!O{ =ͤ P *?^ Fx!mkbme:AO|}ҍ!  ! Ð ) ͞ I ͦ $ :Z´!  !<60 !l :Z ! Ý!" ^#V#zy~#= A $ Bad Logical Device Assignment; $Physical Device Does Not Exist$ $File$Null Device$Current Assignments: $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $LST: = $Console width set to $ columns Console page set to $ lines $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $CONIN: = $CONOUT: = $AUXIN: = $AUXOUT: = $LST: = $Physical Device: $Baud Rate: $Characteristics: $PARALLEL$Requires CP/M 3.0$Device Reassignment Not Supported$Enter new assignment or hit RETURN $1b1b͏}0͏|  :w.x*g -*s&" "wE.x*g -=S!{s+p+q>!{_ !"|!~6:{!~ڵ*y~0*y>9Hҏ !|ͧ*y~0_"|*y#"y:~<2~j>!| *|}!q*&!d͈!s^!dͲ:!s^! ͈!sn&ͫ:!s>!":0OH>!>#H?:0OH:0OH!6!6::HhZ :… ::ʝ hZ :}+DM*I=2*:: hZ :}+DM* =F#fh!:~!«!>w~:!5*.~w:; :~!9"1A#u.t.~@w :&/3͖!~6 :~wucy! ʎB d{<ʑ  '*2.2+6.w G XG XG +XG aXG XG    ( !8q!06:8!0{ *3NH*3#"3!04\ !06:8!0ں *5}§ !76^Hì  H*5#"5!04ƒ !;s+p+q!"<!;>w *;M!<+s#r*<9+s#r!>q!"@}2?>!?3*?&m ~,*@DM*?; "@!?4*>M*@!Bq!C6>!Cp*B&))) *C& NH!C4H!Dq*D&)))  ~2FO>ҕ!F6!E6>!E*F&Ͳ *E& NH!E4š!Gq!I6*G&)))  ~2H2HIH!I4:H2H~#   ~#    :[O W! :[g(!! >, :[w(!! :[>, :[o(!! !=ʇ ) ]T%>ͤ T ã ÿ Ú __*. C S " 2  2*?:D a :D2Na f„#v nʄ:[OWv- ˧^8 ˯V(˿+nN ˷2[*.p~#fo~( :[ 2[###~„^„V„:[OW~pG+~(:[2[!"B*?~#NG!ʼ )ô "B <:= O> Ϳ y2D| ^#fk"?_"?*HX "g:>gH|!"}Z :: H:H|b>g–X͘2e͘2f.x*gDM -²A/;SX }h2i !~6 *i& 6~A/!l6:i!l5*l&~ Nͬ *l&~ w:l<2l :i2dbv!q*&! p+q* ! s+p+q* : w#6*  * #" N#Fy ! q: 2!61!q:2!61!s+q:2!6*&"1!r+s+q:2!6*I=2*S͘2e͘2f X:e!g:"O!C ^#VXUU$XUU/XUU:XUUEXU "+.7:*MͰ"*DM :2::Hқ*MS:::H:H: HI : !6!6R"A*5"%5!4NA#~ͫ% p"5*5N"%5!4q#͢%w 3:4(x *#5:,5o"#5V%2*5Ô; !:V :4:4{%͉"">2!:4:424*o,kÊo:4:4{,ʊ:k*%5#!(5~́ w23@:2(4y""3"323>2v3 :u3L!P46+(0>24:u3:v3"U24͋$͇%ͩ$!5*}*#5":4:4: =X!^#fk:Vj&AW y ~   8 ; C :4:4=s#r+".*."5:u32'5!5~4P!"*|"#5>%*5%"".o!P46 !L4*>2(>2v3͖>2(>2v3͖NB:O* 0:+5ʘ0*5*!5S*5*!5S\gr!P4w#þH USE FACTOR !M4** "5A1z{*5~2*"#5v#!":5(%! 5%n25%%%>%n2G:5x:L4 o:x_*5#"5:5ʽ*5|ʉIB0>%%O%O: 5%*55%ý:5ʽ: 5O*5*5ESS͎2O=>O͎2N=#y{~ ~$ # > Û > Û > Û > Û >Û !"=*?^ Fx!S kbS K :A] o&͡ 2:<2;::O :;O *=MD :<ʒ ) Õ $ *=[B"=z !;4~t 6!:4k :<$ 7:[G!["G*.[GR}|o>g"I! :Y- :)5%͉}*5" +"%5ͫ%ͫ%*5"#5>@:2(4:(5 H 23y"*5"3*%5! {#zt ~+"%5*5+"5wT #"5*5"3:)5ʑ N]T s#r+*#5* {_zW"3:)52v3 > > >2 5n2"5 %: 5*#5* 5"#5*55%"#5:5KBn2: 5O0!*", ++ *5:K4 0@:5Ĩ/ú>2) :u3ʭ :4­ *5+"%5[%2!<24*$#"$""*:40!??"4͋$"5+"%5͇%ͩ$+:4­ :4,J "*} :*5 :5%:4 +:25Ĩ/:4 :4  @UZ :O! ~2:J:- G:"= G*M!6#6>!p*&m 6:<2R:/:}+DMn2:— *&m 6:±*M#::H:*}~HH!6:*}~,H*}#"}:/UZ p::Hd*&)))  >\" $ a ::Hҩ*&)))  >¡& ( æ :":&H*&)))  > *M *&)))  >G!4F#I ,*5͘EIr,o͉n2"5~2 r,Yo :K4 ͉:K4 " : 52> 2K4::4M:4 Mg %U!P46+:v3Ϳ$ý*3*3"3Ϳ$"3½:v3*3^#V{ʽr+s*3^#V ʽ-:v3:r+s!46#w4> 24͋$í!94~6!(5~6"3~,_#!4w͋$ÏV *3o6͋$*3~6 Þ*3:4,"3~ š62:4*3s#r2(5294*3#"%5͇%ͩ$@*3"5":(42:32(5Ģ >24*3"32(5 ͉r!Q4wM#* 5* 5 "#5" 5͎21͎2=HÎ2Î20:G!^4!K4wOOn2!6z_{_4A_A?*!5"#5*#5*5{z*/5+"%5**+"%5% V%=͇%͢%*%5#þ!v3ʲ:(O! ^#V4@B%GFB>%%O0*#5##~<##ò*#5"|3#"%5͇%:15^:4^!4~?^#ʲ:4͆!~3"z3^#V"#5}ʝ##~2v32w322(!~38w# ͖!~3"z3>2y3*z3^#V#"z3"#5*#5} 1. Put the diskette to be formatted into the indicated diskette drive. 2. When prompted, press RETURN.Format One Sided This option will format a double-density, single-sideddiskette. CAUTION!!! Formatting will erase all informationon the diskette To format a diskette: 1. Put the diskette to be formatted into the indicated diskette drive. 2. When prompted, press RETURN.Format One Track This option will format a single track on either adouble-sided or single-sided diskette. S+ >2):4„ ͣ#v#: :5$:)%k %G I k :)%:)c %k %+:4„ :4, " :4 :4/ :4 :5 $*#5^#V*S"s#r*5*#5s#r+"5 |#v#*#5" 5:4 :4/ !"5:5> %AB,#*#5 :4:4 !;*M_!Q^#fkox Iͻ8ʗy0IͻGͰͻHIͻ(yIͰͻͻy0  *M !q*&)))  ~2*&)))  ~2 PX*M? cX*Mq vX!6>!:2¸*&ͫ DMX !6>!ڵ H:<2:X !6>! H:<2:<2m!p+q::H!6$!6*DMn2:< :J*M:\*M#a !6!6:€!"b"}Ï!"}+"b+~2dZ ::H:H!6!6::H:}+DMS@:>=n2*5~2%! 5%~2͉:K4 v }>v S M:5p*#5*gu>%"u> %2 :5O%:4©:5[%! 4:4©:4,ʀ>:5: O%% 2)5:4:4 !*%5"-5>2'5*%5"&:4:4(:)5N:5N:4=N N*&"%52)ͫ%:(5ī%x;c!'54!'55:)5ž!":*5ʍ!5%Ù*5%*#5":5*%5~ *%56 ͫ%<͉:K4 "5~2o M%(>@%>#*55%!".!/ʩ##~<2x3G*#5###"%5:w37> ͺ!w3~w7>w> ͺ:w3Pd!5^!K4~ B!~624(02w3%!>%|_}_> ͺ!w3~w:x3ʜ=͢%ͺ!w34È*#5^#V"#5!y35:24(0!^4!K4w>R0>V0>D>P>L>O>B>S>N0!u~ڇK6N4!E s#r!U :mw* 5!] s#r!t~ ڹ6K^4!1w!;p!u~K!5N!E ~#fo!U ~2n!] ^#V"pè COPYRIGHT (C) 1980 DIGITAL RESEARCH @: 5@%15252'5h+U"!""*"5j"2u3>2v3*5"3-ͩ-:5Z!""$"5"5"5"5"5" " 522>2 5:4 b:4$M:(5-C+C*M:(5!,5M[!35PMp%M(ʡͣ#v#ƒ$:5}% }!"&:5ʦ>%*#5}| V AX*|:5(#$*#5"A*#5"&#v#% RØV AR*&*ͻIH'd ! ^#V#*"0}o|gF 9"":!`x=`y0l2!!4^4!4q/:4:4,; *5͉: 5ª|}$ªo͕Ͱ8Oͻy0H͕H͉: 5në:4:4,>C0:4M:4  ;C:4#:4 ! #! #{ozgBB**}j!]~ } #ymy>2(>2v3͖*5|EB"#5>%0,# ^#VÕJB*50MB*50!".*5} "#5^#V"5*.:S @:7:/4 @sS!p+q*~ *~ Hk*#"G*~w>>_ogDM!>))덑o|gҡ =^#V))) DM!>)) =¹_og^#V) _{ozgo&og_{_z#W5",:4M:'5M*,~#T :5T !4N*5*,s#r+"%5yP  ͫ%> ͫ%%g >v % 222:4¦ :4 – ì !ʬ ¦ À :4:4€ ( :4 :4:€ :4€ (€ € x !4À  :€ :>S %2 !~5€ :%j B !4À € !~5€ úG!~4_!p!~5^!~>À >2)5:4 *5" +"%5:4ڥ >ͫ%ͫ%[%:4 :4, V :4  + !4N#~ͫ% > ͫ%ͫ%*5"#5:)5K2oo&) ^#fkN]ivKzV{K>ɯo>g"!6ů{_zW5>)D*OxGғ !?uDM!xGyOڱò)â͝ddJ)=J|g}o=2o2o*p"rOxKxGyKxGy0KG*p*r}|K\\z{W¢Ü}|ڜâWʜllyWœâ!!#Qzg{ozg{ozg{ol&:oO:n2m*p" 52n2ox:4SYMBOL TABLE OVERFLOW *#5###w*#5###~,#*#5_####&%s#r&%^#V&%##"%5F%wF%~#!4~l%6~=ͫ%ͫ%!4N#~ͫ% y%͢%͢%2P"I!LTM>!GT:(5=M!GE2(5"4!44>24!(5:4ruͳ u͇:(5D(OʓQ˜>ßH©>2T2(5:SD(B¹>D> !452T!"4!4N#~#A07O!T/!~*4! ) "4 :(5 5!'':(5 :(5,;%:(5 !:(5; ,J242Z$ l ` / ‰ >24#!:(52S:4; ¡ :4/!:Z/!)!:4 :(5'#!R:(5'z 24É :(5' >24#!^ :(5 #! #!;!)!<!!Z~4z -25L-15Q-8*1,-x#ñ,~A,-#ñ,#6 !1*!*!E**e !N*+-!j**%,r-6* ,,:=*ʂ-:>*…-2:?*ʨ-!***ѯ2:*29* ,,!3*60#60#60#>235!"*:5ͨ/-!"f*2Q*2e**E*+!1*z{:*5G.*B*-.!"B**\..*B*#"B*+~¤.:u32*5G.*\!F2+*f*-•.*!"f**h*ʹ*E*€.a.Ò.Ҫ.ʒ.6# ‹.͹**h**f*#"f*~!2*G:=*..xx/.x.1,..****w#"*!-*!"***:4 ;!,ɯ2t2u2 52o=20!"5" 52m{!t~Q5_!1~9:uK:K4 *E"5:U2 5*]" 5*v"#5:K4 $:4§:4KK!4^#=ʣV²*4(—ҌV :4:4V !!*/O:0K>20y_j:t:_!;~:!ts!1~y_!t~X=w_!1~[Kdͪ>20$y$zU0!%2m*#5"v:mP>U0%4XXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLECOMMONINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M a{xʑ(_BH!f(4D(#ƒ( p({ڍ(KR(CR(<:4 JCR:4(ʿ((!46 4(!4(# ( ɯ<:4O=_.)!D'F!%V#fjQM():H!6$!6*DMn2:< :J*M:\*M#a !6!6:€!"b"}Ï!"}+"b+~2dZ ::H:H!6!6::H:}+DMS@:#!>!!Z~#!5z #!:Z#!G )!Rz >24>VG!>OG!>IG!>BG!0!P!w#w#["!"#5!U3w#w#p"!u3~#4^!v3~w!3ͷ"!3ͷ"!3ͷ"!3~w!3ͷ"!4~w!(4~wN#Fp+q!u3~#^!v3"!3#!3#!3#!3"!3#!4"!(4"5j*!*-/~5/ʹ*9//͹*!2*1L/****w#"*!-*!"****/_!5*~ ͳ.27**/5}!1~ /ͳ.#/> ͳ.>#ͳ.ͅ/> ͳ.*/5~/ͳ.#/> ͳ.> ͳ.> ó.}26*!7*è/Oͳ.:K4 :5:=*yx/:8*!5I0:25!*5—0~0:K4 0!K4~ —0:350:P4+—0:,50ʗ0:Q4#0:L4 0:,5=ʗ0!K4~ ʇ0!4s!7*~!6*Ԩ/4:4!K4ʺ0G~ 0#x=ë0> 0> 024!K4>x6 #=0G!K4~ p%,**}0>ͳ.0*j*+:+5>%:m!>2m*202m!" 5/:0Kx*#5DM*5" 5}|^#V<>E0:u3ʛ*3~Œ:v3ʁ!\4>A!(0":3]#"3,ž"3Þ-2\  :4x_<24!K4w:94͜:94ɯ2:4284]294:4:94K)2:4;4~#!͜,!:4~*4!;4_:94w]294ɯ<*#5"W͉#4#*W"#5ɯ2[![4Y5!!:46"3!:4~q5!84^4!;4~â:u3:94†G³]âʻ^¨^·:94&·!:44#wó&G294xâG:94&:4G/G&ʷ/&ʷG/G!94~&2%!%^#Vo&)O~#F͔(ͨ(xGyѯ*ÿ*:?*ÿ*:@*ÿ*~x/~# *> x/\ ~wN#Fq#p>B0!4"%*%F# #2P"*#5##~G=#w#6#w]$*5!4n& {ozg"#5!5{#z$"5f$*5!4N#yʦ$ ~Ù$f$!U3"Q"/$:P"%*5!3{#z"#5%_!U3*#5~#~&%~#$"5ÿ$&%!%*A1ʨ/0!s*6S#6Y#6M#w!*w:>*2=*!"*%,ʨ/26**j*կ ,,0:?*1::*Z1ͬ2L1͎2**}1}w1>B/a1}|Gd/:?*ʓ1**+![2*CP/M RMAC ASSEM 1.1 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UNBALANCED MACRO LIB END OF ASSEMBLY : 5O!5 ~#fo: 5O!5 s#r:?*yʟ2š2ͬ2Ž2G:9*29*!:*4>6:9*L/29*2%#333/3 3333#332E3 3 >623y"!v36*5"3$"32:4*W"#5GJ2:42942(524> 2S(0>24ɯ242T!4~@`65!^4#:(5O:4yD(w~$w:(50 |:(5D(A:(5?ʱ@ʱD(Aɷ͙| ;!Cͻ2(5:'5:)5:5:(5ͫ%:(5 !J24:(5 ʞ;{>24:'5ʋ:)5.:5‹;Ž*-5*%5++{Iz]~ T++]!]+?"%5:'52'5hͫ%2'5ä:(5*—:S —ʤË ¤24͙ʳ>|ʾ>:(5'2(5> :u3>+2P4(0!K46 >24>24:(52SR:?-$-w#+!\64 #+>GO#w %+>O # <+6 2+6L#6I#6B#w2|*\+>2*5!"B*!(5~2A*w͹*!1*>826*27*!"/5*"5!5"h*"*"*#"5"!5\, _#~ͨ+ ¶+:;*Aͨ+>:ͨ+Ͷ+>.ͨ+Ͷ+>-ͨ+*!1+!32*!1+:=* D,> D,:D*6,_!D* W,6 4ɯ2D*2*522521528*:\ -2;*2@*O:\ʋ,=Ì,y!<*w#w#w#w#>2+52,5:m$>-!~#$ª,~>-# ʱ,<*A-P-S-R-L-*,+,-,-+5~S-M1 ÊCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 Press RETURN to Continue $ ERROR: Not typed: $Password: $No File$ BDOS Bad Sector$ Invalid Drive$Currently Opened$Password Error$ERROR: $Invalid or missing delimiter(s) $Try 'PAGE' or 'NO PAGE' $Requires CP/M 3.0$Enter file: $ $ERROR: Invalid file name. $1 1 u" * }0* |HҴJ>O/4\>(N2 i>!6 * & 6! 6: z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!7 !~q!v6:~!vD *yN*y#"y!v4% ͵ !v6:~!vڃ *{.͸p !}6^u  *{#"{!v4L ͵ !p+q*DM772͵ :y:YH 7!q:a :{ : :.O 2:͵ ͵ 7@ !6>!څ 2 4 *&@ :w: = :H  :n :[  :=2O!@ 6  :~ !4 7:8 7ã 7:8´ 7ú 7!p+q0 ͵ &7*~ *~@O:!6> !,: ͫXlͷ: 2  ͇" = > ͑ %* M=* } ͷ! 6! 6: / ͧH ! 6>! * & ~2 — ! 6:  ~Ү 52 : : ͅ* M%! 4w [ =ͷ\26 =:6 :6 o&"7 E"9 G"; I"= "? "A "C .*7 DM -J :\2 ͅX ͑:%ͅXͷ*9 E)*; G)*= I)*? )*A )*C )!; \e .*; \ - 26 * ~ * ~ H * #" !*.DM͉:0 :0 H:0 H8)= :0:0H:0 H:2 r)0Z:0—0Zÿ:0¿!86#6#6!,6+60Z:00Z:0*.DM͉:0:0H:0 H) v!Hq*H&!Jp+q*I !Ms+p+q*K:Mw#6*K *K#"KN#Fy  !Op+q*N!Qp+q*P!Sp+q*R!Tq*T&-!Uq:U24!5641!Ws+q:V24!56*W&"641!Yp+q ~a** & ~}** & ~ * & w: <2 ! 6+6!" !\"  "  O gl>,v! 6> W ʹ * ~‘ù* ~[ʟ* #" * ~N* #" * ~O* ~ H* #" ! 6 * ~P! 6* #" * ~]* ~H$ù* ~A0×* #" * ~]* ~HTù* ~G`×* #" * ~]* ~H҄ù* ~Eʐ×* #" * ~]* ~Hҹ: : /2 : ==2 : ! 6! 6\O2 : ɀ3PUT 1$CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321WARNING: $OUTPUT~TO~FILE~CONSOLE~CONOUT:~AUXILIARY~AUXOUT:~END~CON:~AUX:~LIST~LST:~PRINTER~INPUT )15:?DIQVNOT~ECHO~RAW~FI.*&*~ %*&*N!4 ,">͵r*++"~[+"r7͆ *DMͻ -͇ Ͱ@͠:@ ʍ:b2b\͐"*}*|27H͇ \̀"*}*|2 : ͵ Ͱ\̀"Ͱ:@ :b2b\͐"Ͱ͆ \ͻ 8̈́:2 :2HF ,">͞u+"g7*DMͻ ͵ F͆ :8‰z7Ï7:2:2 H҈!60Z:0!60Z:0:0H :0`i^#V#~#fo:  y  wO G:L xAڠ Ҡ a{3 _à  F F : i`N#Fogo&og_{_z#W*X<m![p+q*Zm!\q!]6*]& >>*]& :\R:]!]4,!cr+s+p+q+p+q:2 t͙ !j6 *b~*b~2j*gM#22!n6:2 :nڳ*gM#22Þ :d21= :d212m*b~2k!n6*b~2j *b~Y *bN! *`*` =2l!mM !n6!e6:m!eJ :nC !e4, P *b6= *b:kw:1.r+s#r͙ :2ʃ *.#".È !26:j2oO*` ~2f*f&*^: !o4*b:ow*f&*^:g *o&*`~2fÚ *b6*.~2g͉ :f2h!d6*.#~2g!h . \ - v! q* &! p+q*  ! s+p+q* : w#6*  * #" N#Fy  ! p+q* ! p+q* ! p+q* ! p+q* ! q* &-! p+q* ! q: 2 ! 6 1! q: 2 ! 6 1! r+s+q: 2 ! 6* #s#r 1m % %!% s+q+p+q:% =2% ʍ*" :$ w*" #"" p52& aڧ:& {ҧ:& :& XX>l c!' 6>!' 6͎2( *' &l :( w:( 6:( ÷:(LTERED~SYSTEM~PROGRAM $[]=, ./;Error at the '^': $Error at end of line: $Invalid option or modifier$End of line expected$Invalid file specification$Invalid command$Invalid delimiter$File is Read Only$ (Y/N)? $PUT aborted$Enter Password: $Putting $list$console$ input to $ output to $file: $ Do you want another file$File already exists; Delete it$PUT completed for $printer$console$Requires CP/M 3.0$CP/M 3 PUT Version 3.0 $Put console output to a file$ Enter file: $1$1$n}0n|H :!96!96:01:,!:61!:6:0M:H!:6M!:6:0i:d!;6i!;6:0…:Ҁ!;6Å!;6Ø!p+q*"<!\"><7"ͭ¼*<". .@l ->͵-*#".*~[ ͘-!p+q*~ *~ H'*#"*~3>>!`i^#V#~#fot2XywÉG:†xA- !"!76!6!6!66*dM  *dM !6:8!*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`4N*^ :3 !n6- *h&*^:g- !n6!d4N*. ~2g*d&*.~2g*gM#22:2> !2H҆ !d4N*. ~2g*gM#22U :d21.r#+s#r*.N#22!)´ *.#".Ù   !ss+q+p+q:s=2s *p:rw*p#"p !tq!}6*'"y"{2%:%( !%6(*)&*%&!ws*)&́!xs:ts :t:tH\ *.+".s :ts :1.͵++s#r͵ !u6:w!uڙ *y"{*%M !u4{ *xM :}Ұ *7ö =7:%A ͵ *tM! ^#VT7 o7 7 7 7  $:' ÷:' =2' O!l 6 :( /!' 4~2( !) q:) R>:) c>:) t>:) ‚>:) >!+ p+q** ~ʯ** >@O%:%!, 6> !, :, .%*, &** >2- *- M%!, 4´!. q>:. >:. 1>!0 p+q*/ ~ ~ H?*/ #"/ */ ~K>>!2 p+q!3 6#6:3 ҁ*1 ~?s!4 6!3 4*1 #"1 ]:4 : : <2 ! >52  %: ·: ! 6! 6lͷ: 2 ! 6 ͇" * }= * |2 % 7/ң777G2*͵ !6 **& 6/[!&6:*!&ڋ*&& N *&& w:&<2&`!"':*2)".͉!&6*&& ~ :&<2&è!"'+~2)*&& ".!06!260Z:0:0H:0 Hғ!860Z:090Z:0N0Z:0a*.DM͉Ð:0:0H:0 Hҋ)Ð :0 :0 H:0 H@!86#6!,6+60Z:00Z:00Z:02*333333.;;33,;;#w2#6 *O O p.:;=,/[]<>a{m_ ʀ ʀt`i~•2F2G#~2H#~2I#~2N*| !\~=w4_P 12O'"&###~2M:G 9!!<1>27>2"> 2#!H:FH!I1>27>t2">2#2H*&.~@!"J<V<W^#V###*#*~~*&.~‡>28í.h"5~ʗ>286!:"o".~>286!N#F*#*#",^q#Vp"*#N#F*#"3^q#Vp"14!&L1 \\1}CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 Copyright (c) 1982, Digital Research 10/27/82Show 3.1ERROR: INPUT: OPTION: DRIVE: Unrecognized Option.Unrecognized drive.Requires CP/M 3 or higher.No directory label exists on drive Unrecognized input.A:0B:0C:0D:0E:0F:0G:0H:0I:0J:0K:0L:0M:0N:0O:0P:SPACE0DIRECTORY0DRIVES0LABEL0USERS0PAGE0NOPAGE !$'*-/#(.[]=, :;<>%\|"()/#!@&+-*?*!*!͆:!=2!O!8! s*!*!͆"!*!! ͆"!!!6#6:!=2!}*!&8! ~0O~:!:!Hz,~A!!q*!&8! ~¤:!Ҥ:!ʤ*!M!!6!!r+s+p+q!!6#6>!!0*!&*!*!&*!~!!#N*! w*!&*!^! ͆!!s#N*! ^! ͆*!&*!q:!<2!!!p+q8!<?!<*!N#F*!##~2!!!6>!!ڙ:!҇*!&w!) N#F?!ͱ:!2!:!<2!d8!?!ͱ9!!p+q*!##~2!*!##~*!##w*!*!q#p*!#:!*!#w!!p+q*!#* ##N͹ hhhhhhhhhhhhhh PUT ERROR: FILE ERASED $ PUT>$ 151282 COPYR '82 DRI ggggggggggggggggggggggggggggggggBD$H$$I! D $DA HH$@ H!@D! A ((:4 : : <2 ! >52  %: ·: ! 6! 6lͷ: 2 ! 6 ͇" * }= * |2 % O: O! q* M:ͦ! q* &! ͆K* &! ͆M! q* M& /ͦ: e : s ! 6: <2 O* ~2 : ” \ Æ : 0 ! s+q! 6͆ ͕ ڶ ͕  : : : H2  : 0! w \ ö ! : #~! H : ! s+q+q͆ ! : 4 \ * M* ͞ ! s+q: 2 : * &) >;H{ : =: ! q* &! ͆))))* &͈ } ͞ =2 : 2! !!6 * & ~2!/*! 2 /cN 2 : !!: :8«X !86>_ 1/:~# y1p   %co %c WARNING: Cannot redirect from BIOS $ ERROR: Auxiliary device redirection not implemented $ ERROR: Insufficient Memory $ ERROR: You cannot PUT INPUT to a file when using GET or SUBMIT. $z K   %coSYSOUT $$$_ogDM!>))덑o|gҘ =†_{ozgi`N#Fogo&og;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$?????????????Directory Passwds Stamp StampLabel Reqd Update Label Created Label Updated------------ ------- ------ ------ -------------- --------------Press RETURN to continue.: Drive Characteristics128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords / Directory EntryRecords / BlockSectors / TrackReserved TracksBytes / Physical Record, Space: * *!##* ##NH*!##w*!* ##N*!q#p: AO !!r+s+p+q*!/!a*!q#p*!ڒ*!*!q#p*!N#F*!q#pc!!q!"!"!!!6!"!* !:!*!DM2!:!/!!H*!"!ҫ*!!"! i8*!##6* N#F*!q#p,ͦE* N#F^ * ^#V))DMy* ~* N!!+s#r*!DM  1:ck Format: Disk Format is UnreadablePlease put in a disk. I)nquire again when readyManufacturer MenuOther A - IOther J - Z!R     ͝ 5(?D "͐2 :ø/|TI(? *| 0! ͐|TgDGĀ     9DM`#w͐#~#fo"*x-?  #rá0`i~#fo* s#r*(?H9DM+`is#rH * &) : N_!mͥq* & NC * M* C _* #q#p͞ O * w:; O * w* ~¬ : :  :; 2!* 6 :; O * w!!s+q:!!!! 6N!m"!:  !n"!!  ! +s#r! 4 ! 6 >! P : =2 2 ! !6* &) : !m! M  * ~2!*  ~2!*  ~2!* #^#V" +!͆! !s ! !6: >;! HҮ ! !6 * &) : !m ! s+4* ~ : !O! DMͽ ͦ* MK * MK * M~4PUT :ʜ4Y:O>52:[y<jbj%j:!F#fh!~}#0 ͑*!& ~ :!<2!*!& " 2 h2 !!6>!!Y*!& 6:!<2!;6f!$ 6(2! 6D~!% 6ͱ!!6>!!*!& ~2 ʺ*!& N*!Mz:!<2!†v! q* & ! p+q* ~* N* #" !!p+q*!##6*!*!s#r!!p+q!'"!!!6>!ʚ*!*!͆{2!*!*!͆"!*!! ͆"!>!!!+~Hҗ!!6:!0O5>0 ҹ" ͓DM$* Mqͦ1k!!p+q 8R*!}OW͛: : 2!"!S"!!!6>!ʈ*!}g: /X!!:!U*!DMg*!M*!DM!!+s#r!!+s#r#~!X *X g 8)*V g !!6>!! *!&& 6*!&6 ) >w͐~#fi^#V{_zWr|R     *s "?B !9D     xT(^ D Û1!9 6yT ?Ds#r͐*9DM͐~#zT$?D 22͐##~#fo o:!͐$?D !9DM*! fo`is#ryT  ?D1!9!9o*z&  ͦ*!M *!M * ~& *!M! !p+q!" !* !"  " * ~~He Q ! 6 Þ * ~~Hқ ! 6* ~2 ͢ * &* " !Þ !-!p+q!!6.*,!DM! -¶ !' !.!6> !.! *.!& ! N:.!<2.! \* ##N!ͥ"/!!1!q:1!2 Oͅ !3!p+q!2!* >2!y#M͹!7!s+q+p+q:7!=27!f*4!:6!w*4!#"4!I!!s+p+q+p+q>!*!*!͆!!s*!*!͆"!*!! ͆"!>!º:!:!!!6:!0Ov!!p+q!'"!!!6>!8w *_!"!6:; :<**s#r**s#r*6*6  ~#Ʌo$*.~ " 11_!G:!:[:{  *._D:g #Fʀ#^p:  ^#V#N#Fx^# ÜDV___K* SYSOUT $$$    :$ e! 4~<<+~He  MC]! 6  ! p+q * DM }! q* &:~ҝ:}¦:}`O! : ½2}Õ! p+q* ~?2~* 2}͕2}͕! p+q* !Z 6Z 1!Z 6,Z 1!Z 6]Z 1|"  ! q* &.! q* &e! p+qi* DM! q: <2 O* : w! p+q* ~$* : <2 O* w* #" ! q: 0Oͦ! q:#6:!<2!!"X 5!"!:}:}2!*!& ~2!:!!*!& "!*!##"!*!#"!:!2!:!2!O!& 6>!!Ґ*!* ~Ҥ*!~*!&6 ) N#F*!&6 ) q#p*X #"X %* & 6>!X * N#F`i"X * N#FPY*X *!"V 8QhOg 8`* & ~/\!!6>!!ڐ*!&& ~҆*!&g:!<2!a 8o!!6>!!*!&& ~*!&6 ) N#Fg:!<2!¡͘* & ~/͘!!qD´*n&CM´*n&!͗N(+ô*|4+!`i+DM#| ,n&CM͢M]+#,n&OM—+n&CM—+n&(M—+n&CMʡ+#4+n&!9~#fo##s#r++s#r#+^!CM͢M+`i+DMþ+####PYͧNDMM,!DM4+!/!!!!B!`9^#V!!͌!2!!5!!!!!9^#Vs#r!"("(!9!9s#ræ,!9~#fo##s#r!9^#V^#V!ͲM-!9^#V^#V͌5!9^#V##^#V!͢M,!,!B!9^#V^#V*(:0!4 :0& : 0::0!xI !4̨ e ::̮>͞ } !~5:Į ͵ !4̨!~5 G!~Ҩ4_!p!~ʮ5^!~> >2\0:0N *K0"+"X0:0 >''!:0N : 0,N :0 >  > !0N#~' ) > ''*K0"V0:\0x ʹ:\0" m }*K0"+"X0''*K0"V0>"4ͬ:2T/:[0 “ 2/-*M0"$/*X0!{#zڿ ~+"X0*M0+"M0wß #"K0*M0".:\0 N]T s#r+*V0*{_zW".:\02.R  * &ͥ^ : =O 6-͑iE!: :>!: G>Zʹ2!_Þ:!=2 * & : w* &ͥ^ *V& 6!: ʝ* +" ͑iE! 6* Ny2 !* &ͥ^ *V& 6! 6!: ;2 -: K-!: !!: !L! 6* #" !: K* Ny2 !K?͑iEi`N#Fog_og_ogDM!>))덑o|gҟ =DM!>))Ҵ =¬~ º~ ^#V) ^#V|g}o _{ozgO{ozgi`N#Fo:0F: 0e%;m ">2:0b: 020 W,F:0b: 0e,ʹ:re*X0#![0~ʇww2/ͬ:2T/-"."$/2/>2.v:.ʸ!/6+͕%>20:.ʮ:.0209$<!5*}Ģ*V0":0y: 0:yv! X! ^#fkX _~ 0^ Z   2 5 8  :0‰:0=ʉG! 0ʃF#2sÖ*I0| E2V ,[ ͊m *R0"R0"P0 m E2D2V ,ʾ ͊:/ m :/ "> 2/:Į>!! :}0:}`O! ~ * * Ḿ2!>!!/:}o&"!~i8 Eiji:!@@†Ìi B:% /:!րHҽ:!@@:!:! *! DM͟ *! DM͟ >͑: AO !!6> !!x:! ].*!&*!>O:!<2!G!!q!!6*!& :•>*!& :!©:!:!<2!Â!!r+s+p+q)!!6?:!:!2!*!My2 !!6: ]:!/ *!MM-!9^#V^#V"(Ö,!f9~)-!/5!d9^!CMK-*(͓MK-! "(u-!Ì-!Ì-!Ì-!Ì-NQ-Z-c-l--! 9^#V!9~#foͧN"(*(Mʹ-*(*("(!f9~-!!! *(#"(!/!! t/!"(.*(#"(*(EKN"(~t/!"(*(^!CM*(###^#VyM"(!"(L.*(#"(*(*(Mʁ.*(*(/^"(*(M~.*("(E.!d9^*(^!CM͢M-*(^!CM͢M-*(/^*(0^ͧN*(͢M-*(*(͢M-*(| /!!!    % *I0:/ ͪ% ͬ:O0ĭ%  :.ʢ :0¢ *K0+"X0!2<20*#"" : 00Ĩ!??" 09"K0+"X0$< :0¢ : 0,? ʹ  *} :]0 :O0 :0 ͤ%:e0ĭ%:0 : 0  ͬͧ%vʹ   ͺ :0: 0 !;* _!5 ^#fkS \ h n 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1go&og_{_z#W:0 : 0 -Ͳ !/6+:.;?*$/*."$/?"$/:.l*.^#V{r+s5*.^#V ʓ:. r+s!06#wÚ> 209!e/~6![0~6".~,#!0w9 9*.~6 *: 0,Ĵ2f/*.s#r2[02e/*.#"X0$<5ͬ*$/"M00:T/2:/2[0 v>20*.".2[0v*R0m "R0͍"R0!/w >=G*R0*I0"R0"R0 m :/ }>͞ ¥͢ :O0*V0*ʿ͜">2:O0:0:O0!!4:0: 0,y2 ?:!2 ͩ:!:!2 : 2!:!2!!!6:!2!?:!Jñ*!& *!*!&*!=2!!!:!£!!6!!6:!!!ڠ]:!/Җ6:!<2!~æ6!!6ͩ>:!2!:  l+s#r): * #" :2 :!:!2!*!&*!~2!*!&*!:9:!<2!:!2!*!&*!:!(*!&*!~2!!!6* ~2!:!2!!!6* #~2!:!<2!*!&*!:}!!6Ó*!&*!:!ʓ!!6:!<2!*!&* ~2!*!&* ~2!*!My2 : : H: H: H:!<2!*!&**(#"(!/!*(#"(+ *(^! ͢Me/*(^! ͢Me/*(^)_^#V5! !B*(#^#V5-*(|Ž/!!! !}2#!. . .Kaypro Drivetecs#rzYÖY͐VN!9Switch to Buffer : Create new buffer?-NAME.ME!DM!"! !`! !Zh|ZZ!`~e!`ͮ`is#rz&Z![eZ͐*o8ZY͐*oMZJ*Z͐)))))u~#fo8|xZ!5!u|xTMA DMMʻ0!{|%M0!!!!!B! 35!S5 'd ! ^#V#*0}o|g*  ":D x=D y0P 2!0^4! 0q :0Ė: 0,; Ė*I0m |}$† ͌oy Ԍ͋ 8O͖ Ăy01y 1m X:0 : 0, >C͘%:0 : 0 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*"P0Þ%z{*P0"R0*"V0 !":O  F!M!T![!b!i!p!9"111*:ʦy !5:ʺ.~½x:2! x!a{ [_ :  :*1o:*1[:{*/4^4@_!~#s4aĜ2!5_Ĝ!~+w*.+6.>"4:O0: 2\0:0=: 0 F!Fʹ%*X0"`0>2Z0*X0":0k: 0T!T:\0¦:O0¦:0=ʦ ʦ*"X0 !':[0'Tx»!Z04TT!Z05T:\0!":]0!**V0":O0*X0~ Ĵ*X06 '>#G*I0!" :0 :Z0 !0N*K0:O0Ÿ"b0+"X0yʛ 'É' Ͳ >ͮ 222:0: 0 !ͮ-:0 ~2!*!My2 :!2 :  l#+s#r* Ny2 !D* #" ):  +"!!!6: !!y*!N*!#"!:!<2!W!!q*!&ͥ^ *V& ~ʞ*!&ͥ^ *U& ~ʾ1*!&ͥ^ *T& ~*!&ͥ^ *W& ~#*!&ͥ^ *S& ~: :: 2 * & : w* #" * Ny2 : ZÔ!: q!: qÔ* &ͥ^ *V& 6* #" >* &ͥ^ *V& ~* &ͥ^ *V& 6ʹ2 !X: !$ 6!Y: !$ 6( COPYRIGHT (C) 1977 DIGITAL RESEARCH 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0i!"P0"R0"2:0v: 0$  :[0-ʬ+ʬ* :[0!_0M!f0P p  !   :O0Ĝ!":O0*V0}|<r ͪ*|Ĵ:O0_͑H *V0"Ù*V0"E V» ͪ»**»"Ù*K0"X0!0NA#~' ~p"K0*K0N"X0!0q#*w œ:0!x ͜ *V0*R0:_0̍"V02*M0r; !:r 0Ģ*R0̜*R0ĜG:O0xě%:/ *R0̍:xz*P0#"P0E2D20:b!^4!/wjj*R0!6zz{z4A_A?ɯ2.2*T0"V0!.8w# *V0*K0{zҤ*b0+"X0 =$**X0#Þ!.*V0".#"X0$:d0<:0<! 0~?<#ʐ: 0͡!.".^#V"V0}{##~2.*.^#V#"."V0*V0}d##~<2.G*V0##"X0:.> u!.~w>w> u:. =;>?>P?<=?>>=<<i;m=>c==>o>v<=<;8?N!Nw#w#W!"V0!.w#w#l2N!.~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +a *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:e0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT N*"V0ɯ2!4!f/6".!f/~55!d/^4!g/~f:.:e/JGwf^l͗^{:e/&{!f/4#ww&ʞGʱ2e/xf͗ :e/&ʕ:0  ý͗&{&{ý͗  !e/~&>62/-!.6*M0"$/B".2f/*"V0͗ 2f/2e/2[020> 2͕%>20ɯ202!0~@$6^4#:[0w~$w:[00 6:[0A:[0?e@eAɷP6 o2[0:Z0ʦ:\0 :O0¦:[0':[0 !20:[0 R;/>20:Z0?:\0:O0?́;B*`0*X0++{z~ 0000000000000000000@@@@@@@@@@@@@@@@AA AAQQQ"Q'Q,Q1Q6a *\ ?=)$=)w#Ž&!\60 ڱ&>GO#w ³&>O # &6 &6L#6I#6B#w2|r&\u'>2]0!"%![0~2%wG&!,x&>P'!5^!/~ !~620͕%2.|z}z> u!.~w:.W=*u!.4C*V0^#V"V0ý!.5¯:20͕%!^4!/w>R͘%>V͘%>Dý>Pý>Lý>Oý>Bý>Sý>N͘%*6".~ 6-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55N!! N#fiooo&)^#fk9BIO[ov ͌z{>ɯo>g͌"!6ů{_zW5>!0^*K0"V0*M0{z"K0!N"O1#w#w*V0!NN*O N#Fr+sq#p0U>G=#w#wY*M0!0n& {ozg"V0!K0{#z"M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBOL TABLE OVERFLOW G*V0##~w*V0##~=*V0_###1 s#r1 ^#V1 ##"X0P wP ~O!0~z 6~=ͼ !0N#~ͼ „ Ͳ O2Ny:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞*ws++!+"X0:Z02Z0́ͪ'2Z0X:[0*K: ḰͪX? X́ö20Pg>ã6r>ã:[0'ƒ2[0>ã ¡:.ʔ>+2/͕%!/6 >20>20:[02́:0:Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04>20![0:0/ʦg¦´/ʦA¦:[0O<QA>HHR>22[0m:B_>fD> j!052!"0!0N#~#A҄0Æ7O!~*0!ʩң)Ú "0 x:[0 '¦́'æ:[0 :[0,;%:[0 !:[0; ,82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~6' D':%A6'>:6'D'>.6'D'>-6'x&!,N'!k-x&!,N':% '> ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(Mʣ(e0Lʣ(d0Qʣ(g0Rʣ(%1¶(x#3(~AҶ(#3(#6 !)-x&!x&!%͉&!%͉&ͳ'(`&͛'͠':%)!&͉&l&͛')D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌roz{͉͌͌}|͉͌Þ͌Þ͌ë͉͌!!o#Ã͌zg{o͌zg{o͌zg{oolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :0:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: >&À# $b${$*!:!X!!M"p"""""4#\#j# ()*+,-/ABCDEHLMDBDIDSDWEIEQGEGTIFINLELTNEORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASEGCALLCSEGDSEGELSEENDMHIGHIRPCLDAXLHLDNAMEPAGEPCHLPUSHREPTSHLDSPHLSTAXXCHGXTHLENDIFEXITMEXTRNLOCALMACROSTKLNTITLEINPAGEMACLIBPUBLIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"#~(4*f"8_!E"f8`!Z>v ͵`g!"f~)<=(!q !Z~<\~ w!*f"x_!E"f_!"f8`N xݦ ݶݶ0ݮ G~(ˠxy>6͵`~(=ݾ%8`F~( ~  xN x G~~(90~ݦ ݶ0ݮ N yq~( ~ y>͵`( NR_ð_~>N xݦ ݶ0ݮ G~(ˠxyr`!0+} ~N xݦݾ~/Gxݶy!"kl*ks#rk*ks#r2z 2v! 0+} >Ha͐aw. ( _ ^N~0202́/>20:[02́:0G:0::0l:[0'́:[0' 20/:[0'|>20^—́:[0  <¨!~4 >¼!~5 : >20>V>O>I>B͘%!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûfD?<==:e>?; ><>; ;<=R>>>F>;>G==<==>=s;=P=*>=$?P:-?]>*<<==<;=>>y> ;:͠'!%60#60#60#>2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&Œ*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ 2 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 ypP͘% >U̘%>: 2 3>E͘%óf:.O*.~H:.=!4>͕%0:/#". ͆%2G:0xa{_ ʇ ʇ:0x҇_<20!/w:e/S:e/9ɯ2f/2d/2e/:0:e/ !2f/g/~#»S͉!f/~4!g/_:e/w2e/ɯ<*V0"36<& #*)&# PP%27&#(&#  $ %*%"$  NZZ NCC POPEP M x#_BH!™# 0#³# £#{ڽ#KÅ#CÅ#<: 0 JCR:0 $# $! 06 p#! 0$# # ɯ<:0O=_^$!"F!!V#fjQ̀#G$2!!!^#Vo&)O~#F##xGyѯ`*& ~{H*& ~ *)))) *& w*& *)))) *& w*M! 2:<2i:E/\5*))))  }u*))))  #~u*))))  N#F *))))  q#p*))))  :w*#"*!p>ͭ:<2>+s#r>:E/H\2vN*"*! *))))  !o6 !o6!p6 :p<2pí:o!qq:q<2q>!qR \H !q6R !E6!q6:q!sp+q!t6:@/!C *r~<*rwO:/ X*r6*r~ž x*rwÉ X*r~½ \*rwE *r~ !t6*r6  H *r6 H:tͼ"u*u"w!{6!"y:{/>!wH҇ >y)))) DM%\O \o&"yN*y)))) ~$e !{6:{/҄ >w+s#r*y"y %>w:{/HҶ \o&"yN!|6:! !|6:!| *|& ~ *|& 6 *|& ~, *:)<2):/:)2!6>!)n&͏x ~ H*)&͏x ~[Hb!6!6n*#"!6x*#"ñ:Ҫ*))))  :Ң*#"ç!6ñ*#"ù!6z:**#"**))))  DM}u*))))  #DM~u!6*))))  ~2D*))))  ~2):!q!6!::E/Hҙ,V 2E:E/Җ!6:!{X:<2a*&͏x DMX:<27 H*)M.:E/ҷ,V 2E:E/\\2DN!6:/:E/H\Hing file HELP.HLP.$Closing file HELP.DAT.$Closing file HELP.HLP.$HELP.HLP created $ Extracting data....$HELP HLPUnable to find file HELP.HLP.$HELP DATUnable to Make HELP.DAT.$Writing file HELP.DAT.$Unable to Close HELP.HLP.$Unable to Close HELP.DAT.$Extraction complete HELP.DAT created $ Topics available:$ ENTER .subtopic FOR INFORMATION ON THE FOLLOWING SUBTOPICS:$ $ $ $Reading file HELP.HLP.$ HELP> $Requires CP/M Version 3$,HELP HLP HELP UTILITY V1.1 At "HELP>" enter topicu*"*M! 2þâ%:<2 u͑lF2F͑\2NfuF2!"*+!*))))  :d*))))  q#p*"҇!":=!6!ͣ DM%)2͑F2F͑\2N*"|u\2!E6:E/!"*":E/>!HҴ!ͣ DM%\ʝ!E6ñ>+s#r*#"d!"*+!!ͣ DM%2͑\2>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*|& 6 :|<2| !|6!:|*|& ~ HA :|<2| *|& ~.d :)2}*|& 6 i !}6:}2|> !|ڛ *|&͏x u:|<2|o :}2|!~6!6#6*~& ~:/H! *~& ~  !6*~& ~ *~& ~[H*~& ~H: :| HHҥ *~& >`*~& ~{Hp *~& ~ *|&͏x *& HqÔ *~& *|&͏x *& w:~<2~:<2 :|<2|> !|! !6 *~& ~[ :|=o&͏x ~ :|=2|*|&͏x 6:D=2:<2O>/:/H*& ~29!E6!6:/:E/H:*& ~/HHҗ:<2*M! 2*& :=O! w>:§!6ò*& 6$:E/:/H: :@/H,V 2E*MH>!X!6 !D6!E6u,V 2Xh*& 6!,6ͷ 2::?/H_1X:_ogDM!>))덑o|g҉ =wDM!>))Ҟ =–^#V) §_{ozgi`N#Fogo&og_{_z#W {,subtopic}... EXAMPLE: HELP> DIR BUILT-IN $? HELP Topic:$Not found$No HELP.HLP file on the default drive.$1?1?!E6!,6͈"-*-|*-}0HҷN1=2/1<_! p{201!C6!C6ͷ 2j:A+::BJ: \u\͡2 :?/;1X:j\!)6X!,62j:j&!)61x͛zdʛ͚=x͛˜!)6,V 2E H:E/ ,V 2E:E/ IX,V 2E H*jM.,V 2E H,V 2E HPXN*"ҺP\02NC*NBXUX \ku\͡oxN FuF͑F\2N%!6\2:/H:Y$!6è!E6:!E6F2ͼ":E/ҽ!"*":E/>!H]!ͣ DM%\F!E6Z>+s#r*#" !"*+!ں!ͣ DM%FʭF2F͑\2N*"c\NFF͑NX!"}22:)1"CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321͈͋> (12/06/82) CP/M 3 PIP VERS 3.0 DISK READ$DISK WRITE$VERIFY$INVALID DESTINATION$INVALID SOURCE$USER ABORTED$BAD PARAMETER$INVALID USER NUMBER$INVALID FORMAT$HEX RECORD CHECKSUM$FILE NOT FOUND$START NOT FOUND$QUIT NOT FOUND$INVALID HEX DIGIT$CLOSE FILE$UNEX[:~<2~:|<2|!6 :~<2~î !?6#6#6#6>!|'!6: '*&͏x ~[*&͏ ~C !A6:|==2|*&͏ ~E¤ !B6:|==2|*&͏ ~N !@6:|==2|*&͏ ~L !?6#6:|==2|*&͏ ~ :|==2|:|=2|!6 :<2= :|&X!6>!` *&)))) >u:<26!6>#w#6ͼ"*" \Ju\͡WN!E6:E/\H"!6:ր:E/H*& ~!E6*& ~/!6:E/* $,V 2E H!)6:E/2j\\2D:ZNEv!Kq*K&!Mp+q*L !Op+q*N !Pq*P& !Rp+q*Q!Tp+q *S 6 *S 6*S!Vp+q*U!Xp+q*W!Zp+q*Y!\p+q *[ 6 *[ 6*[!^p+q*]!!`p+q*_!bp+q*a$!er+s+qX*dDMXX:ctE!jr+s+p+q+q*f*gDM*i -’!nr+s+p+q!o6#6:p *p&*k~ H *p&*k*p&*m  *p&*k*p&*m <2: ,:)!"#**"!"1!6*"!":/G*)))) ~$^!6D*))))  :!:/Ұ!6,V 2:›0XáCX,V 2X**0&p>ͭ,V 2 H!6> !*& 6 :<2!6$ *)))) DMuX*#"=*))))  ~!=!6*#"=:],V 2X%!6#6!6#6!":/:/HҼ*)))) ~$ʴ*))))  :)<{*)&͏x *)))) ͛2:q *)))) *)&͏x uPECTED END OF HEX FILE$INVALID SEPARATOR$NO DIRECTORY SPACE$INVALID FORMAT WITH SPARCE FILE$MAKE FILE$OPEN FILE$PRINTER BUSY$CAN'T DELETE TEMP FILE$ *5<P_lz)<\fp}NO DIRECTORY SPACE$NO DATA BLOCK$CAN'T CLOSE CURRENT EXTENT$SEEK TO UNWRITTEN EXTENT$RANDOM RECORD OUT OF RANGE$RECORDS DON'T MATCH$RECORD LOCKED$INVALID FILENAME$FCB CHECKSUM$2FTe$NONRECOVERABLE$R/O DISK$R/O FILE$INVALID DISK SELECT$INCOMPATIBLE MODE$INVALID PASSWORD$ALREADY EXISTS$LIMIT EXCEEDED$'"X#";"!@*"!a#=X#";"!"Z#!Z#"}O *X#*"DM:"2W#"Ϳ :{#:{#n" :a#҇*x#&"*X#"X#!W#:":"րHҦ!"6" n /2k#:a#/!c#" "j !h#6!i#6*X#*"6*Z#*X#"X#![$q:[$ !"4>!$:$!":$1*[$&*S#M! ^#V*[$M̈́ø*[$&ø*[$&ø*[$&ø"_#;"ڄ *_#$ :[$w*_##"_#øg*[$&øAKYgu!\$q:\$ *\$M:$*\$M:"2]$!$:]$!$:]$2]$!]*p#Mc %:p#[ !#5.*|$ 6 ñ:q#1!$6#6> !$ڰ!$6:$<2$O>/:$!$O!J *$&*|$ H~G:$¡.*|$ :$w[œ !#5:$2$!$49:p#[¼ _ :q#!q#6+~. 2p#Oc  :q# :p#* Ͳ ͒ !q#6+~;= 2p#Oc = :q#$ *q#&$ *|$:p#w!q#4 :p#[H !#5.*|$ 6 *|$ 6å!$q!$6> !$ڏ *$&> :$ˆ >!$4l >:q#<2q#O*|$ :p#w:p#?± !d#6!$q!p#6?!$:q# ͒ û 2p#:p# :p#]H!:p#A2$O>!:p# :\# :E$2\#_,0!J$s+p+q+p+q:J$=2J$^ *F$*H$ w*F$#"F$*H$#"H$7  !z#6:h#~ ͡ "j !h#6:g#Ҕ ͙ "j "͢ !}#6!"6l!K$q_ *K$&) N#Fͺ!N$r+s+q:{#2Q$:x#2R$_ :L$:Q$H !R$6 :R$2R$*L$& N! N#F> !L$~H:Q$H> !Q$/H^  ͨ:Q$=O!r N#F!R$6:R$ {  ͨ*R$&) N#Ft>M$H" *M$~A=Oͨ:ͨ!P$6> !P$ *P$&*M$>2O$ :P$ .ͨ*O$Mͨ!P$4¢ ͺ:Q$:Q$H:Q$H:#( "0 :&#!r#2&#:'##2'#:(##2(#:)##2)#:-#2-#:.##2.#:/##2/#:0#20#%#V :$}͡ :"2"!"6"V :b#ڦ!$""K"!>1"""""$@""!>1"""""$ """_#;" !"X#:$/>X#H"H@>X#H"""!r$6>!r$@:r$"!*"~9:r$"!"X#!r$4:e#!f#2a#!i#6!b#6!l#6+6!s$6>!s$ڶ*s$&$ ~ʯ*s$&$ ~‘!a#6ï*s$&$ ~¯:e#!f#2b#!a#6!s$4b~:f#W:a#:i#:c#!i#*X#"_#:j#*X#"_# *_#"X#:eT     =.:;,<> _[]OUTPRNLSTAXOAUXCONAXIINPNULEOFERROR: $ - $$$$DESTINATION IS R/O, DELETE (Y/N)? $**NOT DELETED**$COPYING -$ (Y/N)? $REQUIRES CP/M 3$CP/M 3 PIP VERSION 3.0$:"Q}#( :}#2m#}1͖-m:m#8ͺk 2#2$M 2"!\#6!z#6:z#b:m#2}#!$6+6+6!o#6!"6!"_#"X#}2d#2g#2h#2c#2z#!n#6!e#6#6!j#6!"6:m#ҹ*ͨͺ!#6:}#͑ ͖%#:d#%# :p#=:p#_HH $:$w>!]$!]$5 :\$ (!"6!^$q:^$!$wF ͹O:^$0O͹!_$q:_$O):_$O)!`$6:$2$:$'2$:$'2$:$'2$*$MP*$MP*$MP:$¿:͹ ͹ ͹!a$q:$:a$ :n#9:a$ :a$H9:$2b$(:b$!b$6<:"<2"!b$(!"6 ͹>!$4k!n#6:a$ F!"6*a$M͹:a$ Z!n#6!c$q:c$a/>z!c$/H~:c$_2c$:c$!d$q:d$A/>Z!d$/Hҥ:d$ 2d$:d$!f$6*"M!N ^#Vͥ `"]#;" :e#/!b#!"X#]#@" !2p#!ͥ !:p#S:p#QHX!:#<2$2p#:p# HO!1!2p#Ü!2p#02$O> r!!$6Ü!2p#02$O> ڜ!*$&!*$& !$sr!*$&$ :$w:$!>!$ҿ!ͥ -*|$ :$w 2p#_og_{ozg_og^#V))) _{ozg^#V) "^#V|g}o "_{ozgO{ozgi`N#Fogo&ogQ$H :d#2z#D :R$>!R$~ HH> HD :d#2z#ͥ  m m ͥ !V#:"{ >!V#:"© !U#:"Ғ >!U#:"© !T#:"ҩ >>͙ %#-"( x"( :+#2+#%#! :{#2y# %#j :x# %# "͢ :{#:x#H!" " :{#L:x#D" L" !#6!g#6͡ :"2""! :{#u!h#6:$/:"HҊ!{#6:{#¯:x#§" ï" :"2r#:"2s#:"2t#:"2u#:"2v#:"2w#" 2{#"T#( !"6#6#6#k#!i# RG: $!$$5Ͱ5*p#M$:j#!c#G*_#"X#:e#QO͡ "  "ͩ 2{#n Hґ*""#:"2#!i#6:{#°*"#"">'"­!"4:{#*"!"">'"!"4" f:z#!"t$"x$͡ !h6\ !"v$:{#t$v$;"H6*v$#"v$͔ :{#]>x$H"R\ : $\ͺ*v$#"t$:{#_!#&#( &#"( f#!1#6!"6:/#/!$#: $>x$H"!{#6:{#Y:{#NH':$͟O[2{#!{#6":S# N:"H ͵!S#6:d#<"$\( K"#&#( Az:S#:" H҃͵!"6&#,"( Az>!S#Ҕͥ z:S#ʡ!e#6:j#z!f#6:p#,:p# Hͥ :p#,2j#!c#w:S#!$6:$!$6:$!$6:"> !"H!d#"ͥ :"/!f#6:" T!f#6>'!f#Q!f#4<g:" dgA2:j#w"á:m#2}#b! $p+q*$}2{#|2x#!!$q:!$_ ͨ ͨ!#$p+q*"$ !%$p+qͺ*$$DM!|#6|#  !'*_#"X#*]#*"~2e$*]##"]#`5!f$62e$`2e$`̀2e$`"5E:f$ҕ:$Ҁ:o#<2o#2f$Ë:e$ 2f$:f$ҕN :$Ҥ:e$2e$:$ҳ*e$M[: $*e$M͂:e$>!":"=2"> >>!"!"5+N!~# ~2g$!"4ͩ2g$ >>!$;*$Mk8:$2"!$6:"<2"!"6g>!$c*$Mk\!$6!"6> :g$g:g$!h$q:"!h$wO!~# ~2i$—*h$&~# :g$w>!g$:i$¨!"4í!"6>2p#:$X#]#;"!i#:p#!o$62j$:j$::j$:o$" 6!"]#:g#ͬ !_#!"Y$>'")!"W$͙ :k#!l#we *W$$ DM" b" k" :a#Ҁ!@"Z# Ë!"Z# W$Y$;">'"W$Y$;"!@*"!a#W$Y$;""Z#!Z#"}O *W$$ DM" :{#" *Z#*W$"W$Ë:$ң !"W$ Y$W$;"ҝ"ͩ 2V$*##"#>'"G!#4!U$6:U$ր!V$ҁ*U$& :U$W$!$ 2V$!U$4L*W$"W$:V$ښ" "Ϳ " *W$$ W$_#;"+s#r{_$( N :a#!@"Z# !"Z# ͡ *X#"]#X#";">Y*x$#"x$!g#6:{#Y! $#Aͺ!z$6> !z$e*z$&%# ~2{$ ^:z$ W.ͨ*{$Mͨ!z$4/:$p>͡ !"6?" :{#ʲ:{#_!# "( :"ڬ>͔ ~>!":R#!":%#HH :#<2#!}#> *#&~# N[2p# :p# H !}$p+q.*|$ 6 !p#6 #6:q#,T:q# A!p#6N:q#$N!p#6 ͒ )$*|$ 6,*|$ 6:"<*|$w*|$ :#w!~$6>!~$ڗ*~$&$ 6!~$4|!"6#6#6!q#6*p#Mc :q#ھ:p#*Ͳ ͒ 2p#ê:p#:¿:q#(*|$#~A<*|$wO>$p+q*&$!)$p+q$*($ DM!+$p+q**$DM **$DM̈́:{#**$ ~Hi **$!{#6!x#6!-$p+q*,$DM̈́!/$p+q*.$DM̈́DM̈́!1$p+q*0$DM *0$DM̈́!3$p+q*2$DM̈́!5$p+q*4$DM̈́!7$p+q$*6$ ~ *6$ >w! *6$ >w$*6$ DM*6$DM̈́!9$p+q*8$DM *8$DM̈́!;$p+q*:$DM̈́ !<$q!<$:$ʐ :<$2$_ *#Mt *R#Mt *"Mt !>$p+q*=$!DM̈́:{#!@$p+q*?$"DM̈́:{#!B$p+q*A$#!D$p+q*C$$!E$q!E$*j$M2j$2j$2l$:j$2k$2j$!l$w:l$D!o$6I!o$6: $!o$x:j$::j$Hu2j$T:*k$M*j$M:l$2m$"p$2n$:l$ʲ!l$52k$Ý" 2j$:j$0O> :j$0:j$AO>" :j$A 2j$OH!m$wO`i"">!$@ ͥ >!$N ͥ *_#}bO2 ͙ "j :{#" :y#:.#:$:{#Y:{#NH{͟O[2{#Ø:{#Yͺ"͢ ͺ:.#2.#:/#2/#%#V %#͢ %#,/[]<>a{ _È  . . " _og_{ozgi`N#Fog_{_z#W$ڗ*~$&$ 6!~$4|!"6#6#6!q#6*p#Mc :q#ھ:p#*Ͳ ͒ 2p#ê:p#:¿:q#(*|$#~A<*|$wO> ͎ð :%T ð :%U6 :%2}#ð :%V… f %%!DMt/͟ *K"DMt  :%2~#} !#6 !#6ð :% ± :%: %HҮ ͑ð :%Hҭ :%A !%6*%"%*K""%ͅ   !%6ͅê :%F M \ ê :%J¤ Mx: %2 %xҡ \: %=2%:%<2%! %f *%&$ ~2%-E *%"%* %M* %~ ! %: %%!"%!%6ͅ*%DM͘4 ê :%M: %H !%6>%! L:%<2%O!%$ Hqy :%2 %!%6*%#! r+s+q: 2 ! 6* #s#r 1 ' '! s+q+p+q: =2 ^* : w* #" A! q: y7: 7: ¥7: ³7: 7: 7: 7: 7! p+q! 6> ! -: .'* &* >O'! 4! p+q.* * DM -E ͳ* DMͣ" * }‹* |2 : ҇* M_: >! q: aڨ: {Ҩ: : )#7  4! 6>! CO͎2 * & : w: )C: I"!^ ͵ #I"!++s#r!#ͧ!+s#r!"#*#ͺ!"L#*I"% 6*I"+"K"ͫ!"M":] sr ͡ !#6\Mڀs:#Ҷ\S:h2y#!h6*"%|¶12!%¶!!%6!#6!+#:\:t#/H+#͍͋!%6 !"%*K""%!#6à1I"! %6#@1I"! %6?@1I"! %6>@1I"! %6F!"$%@! %6F!"$%1I"!w#6 * %M͟  :% :% H| Ã*%M͟ >$%!ʝ*$%DM !"$% 1I"!{#6! %6!z#6͂ ! %6E: $2%E͑  sð H͑  !s#6#~:+#2%:\2+#:%2\221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>s#rê :%Nf Mc * %` ͭ/ @̀ !%6!"%͇ͅ!%6K"%!]   ê :%S¶ Mxҳ \: %2%%!DM͘! %:%Ұ *%&$ ~2%!%4-Ï t ê :%W ê :%Xu P"m2 %!#6 !u#6P"^:#  r `!u# ͓B !u#6 r"P"!"6#6!~"6!"6r":#B 5*%"%%%!o *%% N*%"%K >ê :%ZŸ ҏ ;  @Ҝ Ï ê :%ʪ ð ív!&%q:w# *&%&!'%q:'% !#4:'%  õ: ): õ: =2 O! 6 : 9: <2 h2 ! 6+6> ! ڠ* & ~?–* &* ~?ʑ77Ö! 6: <2 R: ! p+q* : w!! 6> !! *! & ~?*! &* *! &*  w:! <2! ¶ͳ z2# _:# M :# o&"$ E"& G"( I"* ", ". "0 *$ DMͤ*$ DM.2" Ÿ* DMN 47O͎Yœ* DM͓*$ DM.2" ß:" ½*$ DMN ͬ*$ DM.2" :" *$ DMN )* DM='*$ DMͳ*& E*( G#+#3\+#!t#6ð :%I`!#: $: %H2z#i!#6!"%}2%*%+% ~ fiW?:%<:%:%H:%H:%­ ͋:% :#!# :%^> :#2#O> w:#!#?!w#6!#6!w#6:#2#!#&:#2#:#2#:#!#< ,V*%+% ~ P !%6:%ƒ> *%% ~2%O͟ !%6:% *%+% ~ HҬ ͟ - *%Mo ^w:%@Ow:% :z#/H- : % :% !#4 :% :1 üCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321 ERROR: Not renamed, $ ERROR: Drive read only.$Invalid wildcard.$ERROR: No such file to rename.$ Disk I/O.$Currently Opened.$Bad password.$file already exists$Enter password: $, delete (Y/N)?$ERROR: Invalid File. $Requires CP/M 3.0$Enter New Name: $ ERROR: Incorrect file specification. $Enter Old Name: $1 1 q"6 *6 }0*6 |H\7!" !\" " ͫ HHͯ :!^w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*!#6*'%M :#    !#55!(%q:(% :#O>H2)%yQ !(%6 !*%6:)%!*%n *(%M !*%4V !+%q:+% ~ >:+% :+% H:+% H!,%q*,%Mo ڻ ^+ :,%@2,%*,%M+  ͟  ͟ !.%p+q*-% !0%p+q */%DM !2%p+q *1%DM !4%p+q*3% !6%p+q*5%:! %6O!"$%@!8%p+q*7%!:%p+q*9%2#!<%p+q*;%2#!>%p+q*=%!@%p+q*?%!B%p+q*A%!#6# >>!D%p+q*C%!F%p+q*E%!K%r+s+p+q+** I*, *. *0 !(  Y D .*(  -< ͊2# !3 p+q7*2 DM '*" M_7D7* #" ! "  " .  -¢ !5 p+q*4 ~ *4 ~ H *4 #"4 ñ *4 ~ >>!`i^#V#~#fo"  yˆ w7 G:4 xAڈ ҈ !#w-:% :% /!%6  w4!%6!#6pi:%O- !#6:~#!z#] ð O͸ u\Kð :%RRP"m2 %Ғ!v#6:v#: %ڬ P"r"!\"6!p"6#6P"!v#6Y2%-!v#6P"Kð Q͸ +#ͺ:t#/!s# #+#3+#ͺsð :%-&͂ !%6:%#7ͻ͂ t!T!:%:Q!%6L=!t:%:t͂ !=!:%t*%#"%Ҁ!%6:%B¡!%>w!"%*K""%ͅð :%C²Ͳͅð :%DͲ͋ð :%K͋ð :%L͑ð :%P !%6w  " B ̈́ ùn7(G29 >!9 E7!6 *9 & ": )7*: DM(G29 )*: 6 *: #": *: 6=:9 : 2 #+s#r*: 6 !" !\" "  " B ʹ̈́  N o :\: ! :\o * ~2 J  . v! q* &! p+q*  ! s+p+q* : w*  * #" ~  ! p+q* ! p+q* ! p+q* ! p+q* ! q* &-! q: 2 ! 6 1! q: 2 ! 6 11I"CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543218/82Invalid Filename$DIRECTORY FULL$DISK FULL$Creating Password$File not found$File not available$  ,.;=:<>_[]*? ERROR - $Password ? $Cannot Edit Wildcard Filename$Enter Output file: $FILE IS READ/ONLY$NEW FILE$-(Y/N)?$Insufficient memory$Enter Input file: $Output File Exists, Erase It$ BREAK "$" AT $END OF LINE$1I"1I"̈́""%*"%}0!#6%!"I" ͫ!+!#s͠!#s#r!q:G%=2G%+*H%*J% w*H%#"H%*J%#"J%!M%p+q###*L%gR !O%p+q*N%f!P%q*P%&-:u#Ҁ#^͵  !R%p+q*Q%DM s+#K͍:#ҹ#!T%p+qͬ*S%DM^!V%p+q*U%DMͺͬ*U%DM͑!X%p+q*W%DMͺͬ*W%2#!\%s+q+p+q:\%=2\%2*Y%:[%w*Y%#"Y%!`%r+s+p+q *]%*_%DM"͹!a%6:#!a%ڵ*N#*#DM\q2#ʤ>!#ґ͟*N#*#6:#2a%î*N#"N#!a%4`͹!"N#:s#>#N#!X*N#*#~2b%*N##"N#:b%:t#):s#ͻ:s#)2%)*%M%%!=*%% :%w:% VL2%:% :z#/HH/Wҥ:% ”!%6 ͦ!%6 :%Ÿͦx* %&$ :%w: %<2 %d!%s+q*%"%!%6:%/%K"!H8*%#"%"%:%2%*%&$ *%% !%:%2%/H5!%4*%#"%:%I*%+"%ͅ:%! %6x: %2 %* %l!%p+q*%DMM2%: %ڍ! %6O@ *% ~ :#/Hҷ *%#*%#~ *%##:%*#$*!$DM!z#6:%!"#$*%"%*w8M)*h8"8!"j8h8͐2v8!f86>h8́6:n8HҌ!\6?\$28!"8:8n*8#"8428V*8DMl!*8) !͏6Ҍ!f86!g86!"j8:v8*v88*j885>`6:n8:f8/!g8H !g86!86:u8$-h8͐2v8×*8"h8:Q9/:q8/HBY0uv o&!x8q*x8& !y8q:y82z8!{86z81m!~8q:~80/>9!~8/H!8r+s+q+p+q*8>w#6!"8}28:8!8!8:8O*8 N~>*8!8:8O*8 ~0_*8%65+s!|%6!#6.͹)> !|% Ó͡. :%;v*z% !|%6.͹d>!|%[Ó͡.H*z%DM#Þ>!}%҅Ó:~%ڏÓ:~% ! %6>:|%<2|%O*z% :%w!~%6!}%6>!}%*}%& :%> !}%  >!}%4¾>:#' ͡! $6!{#6 +#M9!t#6:,# 6,#]E+#\#4#:q"wRP"qr>!q"6:q"<2q"=O! NP!h6!j6!|6:#ҩcͬ\;"#:#c*#}|Hͽ ͬ\;"#*#}|H7Ö! 6: <2 R: ! p+q* : w!! 6> !! *! & ~?*! &* *! &*  w:! <2! ¶ͳ z2# _:# M :# o&"$ E"& G"( I"* ", ". "0 *$ DMͤ*$ DM.2" Ÿ* DMN 47O͎Yœ* DM͓*$ DM.2" ß:" ½*$ DMN ͬ*$ DM.2" :" *$ DMN )* DM='*$ DMͳ*& E*( G)!R#+##R#3R#ͺ:#)>>!P#ͧ!!d%s{@*P#!e%s!"P#!c%6:d%!c%*P#*L#DM+#́ʵ]>P#!ʦ*P#:e%ͷ!*P#*L#DM*L#*P#:e%ͷ!"P#$*P#"P#!c%4S!"P#!f%q#P#!,*P#*L#:f%w*P##"P#!g%q:#,Q:~"2":"2"r"́'$$!#6*#&" :g%w!#4:#2h%>!h%Y!h%4Dr"K!i%6 :i%=2i%ʐ*i%&r" *i%&P" ʍ>e>:"2~"r":"2"Qr"q:"2"!#6>!#*#&" ~!#4¾*P#},:s#\*%"%*%+% ~2% %:#" ,*#$#"#$*%"%%%!v:% Z*#$#"#$ͭZ*%% ~2%O͟ *%"%2*!%&"%*%"%*%"%̀w͑:%2%!%6w:%2%K"%!>%!H͇!%6>!%ͭ@>!!%4!%6!"%ͻ, M"%!& )  !%6 -!%6 -:#>%!H] @!|#6*%M͌2%*%MP2%:%/!}#+w!|#6L2%^ !%q!%:%:#H: %H!%q*%M͑  *%M V ; Oͤ2% :%N à:%Y > >#r!86+s#r!84¸>!8s+p+q:87*8>:6+s#rN*8*8M!J6>6+s#r!8p+q!86:8!85>`6HҌ!8P6+s#r#4Z:8!8p+q*8N#FO28O>Ҭ>!"8>!8*8M!8F6+s#r*88͚6s#r:88y6:8H; :8,*8#~A!t86#*8#~D*8##~IH;!76#*8#~D*8##~AHe!n86!s86#*8#~Ew!76#*8#~F­*8##~F”!r86ê*8##~U§!n86êA #*8#~G:8*8##~028*8##~0o&6*8 ~0_!8s:8/>!8/͍*#}2#:t#C:e&;͍C:fC:d>!#6C!x#6:#f:t#X͍!s#6M #+#3!7#6+#:#…͟:y#ʞ:y#27#ͬ+#,!7#6!K#6*#"N#!"P#!"!$!"%>%!!"%*%+"%>>!"#$:%*%#"%*%"%!"%+"%$*%"%*K""%!"%!%6:%Ҭ%%!2%*%v!"%% ~ He*%"%0*%+"%>ͷ!2%:%ڕ!%6%%!+s#ré*#$+"#$:%ҩ*%"%):%*%"%*%+"%*%#"%*%#"%*!$#"!$*!$+"!$*%#"%*%#"%*%+"%% ~)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V"K+#K:#͟:x#+:5#25#ͬ+#:t#G\]#l3\+#]#;#3+#!k%p+q*j%*j%DM!l%q: %ʄ*l%M͟ !m%q:m%a/>z!m%/H!n%q*n%M͌ҹ:n%_:n%  # !o%6>!o%I Oͤ2p% *o%&# :p%w:p% I:p%:p%7:o%$:o%=2o%O!# 6 :p%Bs!o%4ͭ2p%!q%q:q%a!q%6:|#p*q%Mͤ:q%!s%p+q!'"v%!u%6>v%!*r%*v%~!{2t%*r%̀!"r%PY! ~!"v%:t%!u%!u%6:t%0O͟  ͟ Å!y%p+q:~#*x%DMt:͟  ͟ ::%02O"O> /!"%!))덑o|gҗ! =…!^#V) ¡!^#V|g}o «!_{ozgi`N#Fogo&og H !=! LIBX$$$$$$$LIBH*8h8A #*8#~M,!q86#*8#~N{*8 ~XK!76x*8 ~P`!76x*8 ~Su!u86xA #*8#~R*8##~OHҠ!76#*8#~R*8##~WH!76#*8#~S*8##~Y!76 *8##~I!n86 *8##~O!u86 A #*8#~X !76#A 8͓8 *8#~L|8͓:8 v*8#*8Mo8͖p>o8́6gA 8͓sA yA 8 *8#~Ur 8͓:8:7 HҧA :88y6Ho *8#~A*8##~LH!"h8f :8 :8H *%+"%!%q:%Y%%!V:%S*%% ~2% E*%% :%wÄ%%!҄:%ҁ*%% *% wYͅ!%p+q%%!ʱÞ:%*%"%%%!!"%%%!"%*%"%%I"!%!*K""%*%*%"%%%! OQ2%3*%% :%w:% M!%q:}#d*%MP:%K"%!x*%% ~2%O:% –hͻ%K"!M"!ڼÿhÝ!%6!"%*%"%͚ͅh%%!!%616O CP/M Version 3.0Copyright 1998, Caldera, Inc. 101198654321ERROR: Illegal Option or Modifier. $File Spec Limit is $ERROR: Illegal Global/Local Drive Spec Mixing. $Requires CP/M 3 $ERROR: Options not grouped together. $ERROR: Illegal command tail. $No File $1616|27}27:70:7H҂Y0uÅl92w88͟8͓,T27!868y6:8:8Y0u:8@K #Y0uä/ !l8͐2w8z# ͟ *͟ *!$DM: %&*%& ~I:%<2%O! ~> >! %ҡͭ_! %:%ڍ>%!ʈ*%+"%>ͷ!ˆ!%6:%<2%=O!%$ NP:z#Ұ; OP:{#!{#6:#!~#K"%!*͟ ͡! $6 ͟ !#6!#: $2{#* $&# 6 : $<2 $=O!# NP:#B*Oͤ2%LLOͤ2%!{%p+q!~%6! %6!#6.:% ʏ:%ʏ *z%*z%#  :% ž.Ð͹y!|%6͹>!|%ҽÓ͡.ê:%::|%Ó*z%#~A<*z%wO>Ó*z%#6 .:%.)X$$$$$$$LIB$$$BAKc :8 *8#~0289 *8#~0o&6*8##~0_!8s:8/>!8/H] *8h8` A f A 8͓ç8 *8#~D*8##~R~IHH5 8͓:8¬ A :88y6H2 *8#~A*8##~LH !"l8Bl85+s#r) *8#~A/>P/H& *8#~A_l8) A 8͓ì 8 A !86Y0u:7  . *8# *7&%67  ,y -u  *7&%67  ~  ~ H  *7&%67  6  *7&%67  6*8~  *7&%67 6 *8~= *7& ͂͡:8%*8q#p *8 6>283>;:8M  *8MI0:8Z͖3:8!9w͂!9~,~ H҂3!9~]:8(:8,H:8)Hҵ23:8͖33!9~=3>3:8  *8MI0:8 *8q#p *8 6>*8 :8wO>!>28/6>:8H  *8MI0:8):8Hv:8l͖͂!85H:8[…͂:8 :8,H:8(HҼ:8(µ!84͂:8$  *8MI0:8 *8 6*8q#p>:8(!84͂ --------------$ Access $ Create $ Press RETURN to Continue $Sys$Dir$RO$RW$Arcv $ $Read $Write $Delete$None $ $Directory For Drive $ User $: $k$ERROR: Illegal Format Value. $ERROR: Date and Time Stamping Inactive. $Total Bytes = $ Total Records = $ Files Found = $ Total 1k Blocks = $ Used/Max Dir Entries For Drive $No File $w&2X9:X9—&w&2X9Æ&:X9¢&u:7&*o8+:Y9j6&2%Y0*d9#"d9̀&!Y96o0!Y94*8 ^#VZ9ͳ/*8 ]9/ *8 ^#V`RH:8_H:8$H:8!8/H@*8Mͧ͂!84*8Mj*8MRH:8_H:8$Hx͂!84@*8 6*8 :8w:8!8q*8Mj*8MRH:8*H:8?H:8_H:8$H!8q:8!8w*8M͎!8:8Hp:8*c:828*8&"8͂*8M͎&!84͂!8:8;*8!8s>!86!8:8+X?ͧ!84@*8!8sj*8Mͧ͂>!86> !8ڔ*8&*86 !84x:8::8A/>P!8/H:8Aͧ*8Mj:8$H:8_H:8*H:8!86!86>!8k&:8!8w k*8&*8n&"8:8X*8& *8~896+s#r>8́6h!84>!8 *8 Ͳ1<_*8&%6*8 >Ͳ1Hj6ͳ/ *8 *9&*8&%65*8 >Ͳ1HPYj6+s#r*8 *9&*8&%65+s#rY08y6"8!86>!8C *8&9) >w#6!84# *"81!86!"8"8!\6?\$28!"8~!| !86Á !86:8 :8o&"8:8ҷ *8&6a "8*8~ *8#"8*8~  *8 ~28 ͩ i Y0=428Á %67 Hq!74( Y0 d0o08͓:7!7B !76#6:7!7U !76+6:7!7p :n8m !n86x !76+6:7«  *7&%67  6 *7&%67 6!76>l8́6 !86:7=!8  *8&%67 ~  *8&%67 :w8w *8&%67 ^l8!84¼ S !86:7=!8S  *8&%67 ~:w8HL Y0u!84 >h8́6i K_h8>0!7Ң :r8ڢ o8y6¢ To&"o8>o8́6Ң !"o8 state8, char = $ state7, char = $ state6, char = $ state5, nxtchar = $ state4, char = $*8 :8wO>>N28'2>:8@I!86͂6  *8MI0:8U͖:8)`>:8(s!84͂:8[‚͂N28Ґ2>!8p+q*8"8##^#V"8*8 ^#V"8!86!86͂!86 *8 6*8 6*8 ~*8*͏6*28o*8͏628o*8͏6(28o*8͏6>28o*8͏6T͡28o*8͏6j͖28o!86:8*8 6*8##͏6ʞ*8##:85+s#r!8p+q*8"8*8##N#F *8##N#F*8##q#p*8*q#p Scanning Directory... $Out of Memory $No9ͳ/*8#DMz0i0*8 N#F'0kI0i0*8 DMD1i0 *8 ~T'N%Y0Z'R%Y0i0 *8 ~s'V%Y0y'Y%Y0i0:t8ڢ' *8 ~ҙ'\%Y0ß'b%Y0( *8 ~ҷ'AI0ú'i0*8#~'1I0'i0*8##~'2I0'i0*8 ~'3I0'i0*8 ~(4I0(i0*8 >͌6(i0*8 ^#V"8 >L(h%Y0Â(*8 >@d(o%Y0Â(*8 > |(v%Y0Â(}%Y0i0*8 ~*8 ~HҴ(*8 DM̈́5ú(%Y0i0i0*8~*8#~H(*8DM̈́5:r8( I0(:f9(ͣ&%?H*8~>$>:8.K͂*8M͎K!86K>*8 6 *8 6@>!8q*8MRp>*8MR*8 :8/H:8Hҭ*8Mͧ͂*8 4p:8H:8DH:8BH*8 ~!8*8Mͧ͂*8 4>*8 6 >!8q:8\>͂:8\:8H*8 ~ HR*8Mͧ͂*8 4:8\:8Hp͂R:8\{>*8 6͂>:828sҚ>:8=28͂!86ͧ   ^>>:8,:8)H:8H*8 6>!:"8:y6!Y0u Sort Stack Overflow $Not Enough Memory for Sort $ Sorting Directory... $!9p+q*9))))*9)) *9) *9 *8 !9r+s+p+q!96> !9!*9&*9>29*9&*9>2 9H!! 9:9!94¤!>!9r+s+p+q!N96* 9"9*9"9:N9 #*N9&))9 ^#V" 9  ^#V"9!N959 9t6#* 9"9*9"9*9* 9T6)* 9N#Fl!"899t6O#*9)* 9N#Fl!"8*8DM*8͕!Ҭ"*9#"9*9)* 9N#Fl!"8À"*9)* 9N#Fl!"8*8DM*8͕!"*9+"9*9)* 9N#Fl!"8þ"99t6L#*9)* 9^ state3, char = $ state2, char = $ state1, char = $ startstate, char = $!8p+q!86*8&*8~ ~ H| !84W :8!8q:8[:8]H:8(H:8)H:8=H:8,H:8H >>!8p+q!86*8#DML 28O>)*8~!8*8&*8~!8'*8&*8~" *8& *8~"*8~!8*8&*8>H~?Hҟ>!84b>*8>28!v8:f8>!"8*88*h885>`6>>h8́6:8H:g8H*8j8!86:7=!8ڜ *8&%67 ~:w8Hҕ *8&%67  ~l:7/ *8# *8&%67  Nҕ:7/!84:7!86!86> !8*8&*8>!8w!84ª:v8!8wwO!9 "8O!9 ^#V"8!86>8́6Y0:w8AOI0:I0:7 -)%Y0*v8& 0ͣ&!"d9!f96!h9p+q*R9*c9&5>`6ž)*d9*o85>`6!V9͏6H҈)ͣ&(ͣ&Ë)ͣ&*d9#"d9:w8AOI0á)i0%Y0*g9DMz0=*R9#"R9*V9#"V9!k9s+q+q:i9ր!j9)>:i9ր!k9)>>!m9p+q*l9 N*7M*7) *l9 N*7M*7)H!\6?!c96\$2n9:n9ʬ*:n9o&"8> *8 ~HͲ1ᖟ/Hң*ͩң**8#DM)ң**8#DM<)42n9?*!s96:8#+*q9#"q9*q9)* 9N#Fl!"8*8:v88q9t6H +*q9#"q9*q9)* 9͊*8 >w>>ͧ O>K*8 >w*8 > H*8 6 >>:8,:8)H:8H~*8 6>͊ғ*8 >w>>:8ҩ*8q#p>*8 6*8##q#p>:8  *8MI0:8͖:8](͂:8,:8(H:8)H2:8!͖G:8 :8,HG͂:8a  *8MI0:8m͖:8 :8,Hҏ͂͡Þ:8)ž͂>:8ҷ  *8MI0:8*8q#p *8 6>28K>:8  *8MI0:8(#V"9*9)* 9*9)* 9N#Fq#p*9)* 9*9s#r*9#"9>!9͌6L#*9+"9b" 99t699t6c6ҩ#99t6Ҡ#!N94n&))9 *9s#r*N9&))  *9s#r*9"9#9 9t6#!N94n&))9 * 9s#r*N9&))  *9s#r*9" 9."":N9#!Y0$!86*8" 9>8́6$ 98t6T6!8͏68$5!Y0!"O9*8+!O9͏6k$*O9)* 9*O9s#r*O9"O9>$R!Y0*8+!!86 Name Bytes Recs Attributes $------------ ------ ------ ------------$ Prot Update $ ------ -------------- , - *8&*86\!86!84Ý*8&*8DML 28O>*8&*86 *8& *8"8>!8Җ:8=O*8 Ǹ :8!8O*8 Ǹ HҖ*8+"8*8~<:8!8=Oo:8!8O*8 DM*8, -*8&*8~"!86!84.:8=O*8 ~ :8=O*8 6!8p+q!86*8&*8~Q*8&*8~a/>z/HJ*8&*8~ w!84!8q:80/>9!8/H!8q:8A/>Z!8/H:8<28O*8 ~28*8& *8~28!8q*8 ͏6:8<28O*8 :8w!8q!86*8Mj/:8$H:8*8Mj*8M:8/HV*8*8> *8#*8#NH>!86S*8 "8*8 ^#V"8>8́6e>>*8~!&͠&*8#DMl!"88̈́6ґ>88t6Ҡ>*8"8"8*8#"8. *8#*8#, -*8>*8w *8 >w#6*8 w#6*8 w#6*8 w*8 w#6*8 w#6*8*8s#r:8Ҭ*8>©*8~!ʩ *8 Ͳ1ڦ*8 8y6c6o> 8y6+s#r. *8*8DM,Ò -Ž*8 *8s#rý*8>ʺý>. *8#*8#, - *8 *8 ~w!86!861>`6N#Fl!"8*8q9t6 +*o9"8Y+*8"8*8:v8o98t6HY+*8"8-+:n8l+!c96q+!c96o98t6+*8 >͌6!7>́6!7H*8#DM)H+&*8#DM<)*8 N#F'0%Y0ͭ*q+!c96!"V9o98t6,*8 >͌6!7>́6!7H*8#DM)H,*R9*c9&5>`6,*d9*o85>`6,:7>V9́6Hҵ,ͣ&(ͣ&$Y0i0$Y0ͣ&$Y0i0$Y0ͣ&*d9"d9*V9#"V9ÿ,ͣ&*d9#"d9,ͣ&*d9#"d9,i0'*R9#"R9&=ͭ*+!c96!"V9o98t6 LIBX$$$$$$$LIBreate and access time stamps.Cannot set both sys and dir.Cannot set RO and RW.No options specified.Page and nopage option selected. Nopage in effect.Cannot set local options for file.Protection modifier is only ON/OFF for drives.Password protection is not supported in NON-BANKED SYS.Requires CP/M 3 or higher.ACCESS0ARCHIVE0CREATE0DEFAULT0DIR0F10F22/A2!9q*9M2-A2!9s+q:929:9*9& 2) >;́6HQ3:9=:9*9! 5!9s*95"9:9!9q*9&! 5))))*9&5 }!9s+q:9!9!96N!m"9:93!n"999t6399t6+s#r!94í3!96 >!9#4:9=294!96*9& 2) :95!9͏6 43*9 ~29*9 ~29*9 ~29*9#^#V"9+!5!9sͨ3!96:9>;!9͌6Hҁ4!963*9& 2) :959̈́6!9s+4*9~4:9O!%2 DMX2 A2 T4*9M3*9M3*9M25 T 5*9M2*9M2*ɀ"#DIRLBL 1!M CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321!`i^#V#~#foͽ{¡y#wG:xA##͌6!7>́6!7H*8#DM)H-*d9*o85>`6¸-:7>V9́6HҸ-ͣ&(ͣ&$Y0$Y0:8@ʏ-%Y0Õ-!%Y0ͣ&$Y0$Y0ͣ&*d9"d9*V9#"V9ͣ&*d9#"d9'(*R9#"R9=&ͭ*,!"d9"R9"Z9}2\9o&"]92_9o&"`92b98y6"8*8 "o9!"q9ͭ*>!n8,.%Y0u*n8M!. ^#V,*.Z+.:s8ҝ.:8:8@:8 H:8HH!8ґ.,Ú.%Y0uø.:8!8ҵ.,ø.+.<.B.H.:n8>!R9͌6H~/*d9o8̈́6!r8. I0 I0/ͣ&`i51ͣ1O3Ͷ1!9ͣ11"!9/5*%<#͹P#͹*DM*o&͹n#o&͹**+++*DM*!9N#F#^#Vkb6#> 6 #=™#>6#=¢# : ># A$[#@#a${$`w# .# $#$w##{o|g  $$w##!!|a{ !9^#V*3#!9}|A$*3#"3#|!!M:>ŒN@Nw#2@.ʷN!ڷNw#N2@.ʾN!ҥNþN6 #·N:@.Nw0F30F40NAME0PASSWORD0PROTECT0RO0RW0SYS0UPDATE0PAGE0NOPAGE"%(+.3%\|"()/#!@&+-*??Directory Passwds Stamp Stamp Stamp Label Reqd Create Access Update -------------- ------- ------- ------- ------- Press RETURN to continue. ?Password ? Disk I/ODrive Invalid Drive.Wrong Password? in filespec.?ONOFFsystem (SYS)directory (DIR), Drive Default password = Password = Label for drive Protection9M25*9M2*9M2*9M2 A2*9MͰ2*9MͰ2*9~A5*9M͕2!9p+q!"9*9"9 "9*9~~HҀ5$4!96͢4Ã5u!9p+q!96.*9DM9,ã5 -Ÿ59B5!96> !95*9& 9 NI0!94²5i`N#Fog_og_ogDM!>))덑o|g6 =6^#V))) DM!>))46 =,6_og^#V) J6^#V|g}o T6_{ozgO{ozgi`N#Fogo&og_{_z#Wi`N#FogLͽ{33yy#q#p#w!!{s#*>6?)@w){#{s333333.;;33,;;#wD{_#6 sO O ڹ.:;=,/[]<>a{Ҷ_#  ý Copyright (c) 1982 Digital Research File not found or no directory spaceInvalid file name.Directory Label attribute set Read Only (RO)Read Write (RW), set to ERROR: READWRITEDELETENONE on off LABEL @ @Option requires a file referenceOption only forͣ&%Y0Z9D1kI0&Y0 ]9D1$&Y0*R905&Y0`9D1J&Y0:w8AOI0:I0i0*80/I01#0>R9́6£/:q8ҝ/ͣ&(m&Y0=ò/!Q96:r8ڲ/ͣ&!w9r+s+p+q*t9^#V"x9*t9v95s#r!x9͏6/*t9##4!}9r+s+p+q*|9^#V*z9DMͳ/*|9##*z9##~`iw!9p+q*~9##~29*~9##~w*~9P6+s#r*~9#:9w!9q*9&!9p+q*9  I0 I0 I0!9p+q!96>!9ڦ0*9&*9>OI0!94…0 I0!96> !90*9&*9>OI0!94°0!9s+p+q+p+q>9́6C1*9*95!9s*9#!!!$͓/!:o&$s!&"F$!$DM!"%*%J&`i^! k%`i^! s%`i#DMO%`i^z&`i^!>ʔ%!è%`i^!<ʇ&!`i#DM^! %`i^! %è%`i`i#DM~&`i^! %`i^! &!`i#DM+s&%3*|&&!Ͱ(4&!(ʄ&!&!0!s0! '!s0!-0!!J,! '&`i*%#"%+)F$s#r`i#DM~&`i^! &`i^! &!`i#DM+s&Û&B%!F$*%'Can't open file for re = or protection not enabled for disk.Modifier: Option: FILE: 1!1!1 ""*"}2W#|2X#̀ 2"!"6:W#0w n ͎ 2!ͽ l 2"*U#& ~ œ !U#4Æ *U#& ""*U#& ~[ *"#""B!:" o ! !!6 S :" *"""B Q͟ 9 :"!"" g͟ !!6= :"1 !!6= :"= !!6]B |M !"6 :"k *"""!"6o P &͟ v!!q*!& y !!p+q*!~ʯ *!Ny *!#"!Õ   y  y ͹ :! !"4~<<+~H ͹ ͹ 0 ͏ Ͱ  \ drives.Assign passwords to input files.Assign a password to this file.Directory needs to be re-formatted for time/date stamps. Please see INITDIR.Protection not enabled for disk.Unrecognized option.There are no modifiers for this option.Modifier missing or unrecognizable.Not a valid modifier for this option.This option needs a modifier.Only first 8 characters of default password used.Only first 11 characters of label name used.Only first 8 characters of password used.Cannot have both c5"9PY! 5"9>`6!9#~H21i0@1!96:90OI00!9r+s+p+q*9##~~1*9##N*9DM0*9N#F'0ñ1!969:9́6ڢ1i0*9&6!9sÃ1*9N#F'0!9q*9&*9~!9q*9&*9*9& *9N`iJ6n&"9Ͳ1<o&"9;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$!9q:9<29O*9 :9w!9p+q*9~$ʆ2*9:9<29O*9 w*9#"9^2!9q:90OA2!9q:9O͇2:9O͇2!9q*9M͕2:A2!9q*9&!d5!9s*9&! 5K͇2*9&! 5M͇2!9q*9Mdirection: ! 9~#('!,'m/<#A:$$$.SUB!"9!!DBUFS_0V#Q.7Q@$#rCONDEVV#4Q.8nQ@$Q!BDOSOUT_wWSQ.9@$!BDOSIN_R#sQ.@$!FILEDEV_X#Q.11@$B!DEVTABL_~Y#Q.12@$XCHANTAB_Z#Q.13@$))FLRR_Z#Q.14@$PDISP_#R.15R@$bNULLO_#con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:!9^#V!!9^#V(!!!9s#r)!9~#fo#s2!:! !"6͹ ͹ !!p+q *!DM͏  !!q*!&!!p+q*!!!p+q*! !!q*!&-!!p+q"u *!"!!!p+q"u *!d!!q*!&e!!p+q"u *!f!!p+q"u *!g!!q*!&) ^#V%!!p+q*!! #q: #2"!"6"1!#r+s+q:#2"!"6*##s#r"1!"6#6"1x >"9!® *"DM͏ ö *"DM͏ J ͏  "̀"##1! ͑ >#9!*#~[ !"6 *2":A#2"}>:A#2"2K#:H#2I#!L#6:H#2G#:H#Dß*H#& *?#*H#&*?#=2J#!K#–!L#6!B#6:K#!B#ړ=:L#ڌ0!B#4uÙ0}>:""!+s#r:"*"#"":2":I#:G#2M#O*?# ~2C#*C#&*=#:s!M#4~2H#*C#&*=#:D#*M#&*?#~2C#!H#6*"~2D#:C#2E#!A#6*"#~2D#!E#4N*=# :tW!L#6m*E#&*=#:D#m!L#6!A#4N*" ~2D#*A#&*"~2D#*D#M{2":":"H:"H:"H!A#4N*" ~2D#*D#M{2"Õ:A#2""!#+s#r*"N{2"!DD  $$HD@" @@ $B $$H$H$HH$$! HD$D$D@AD HD$!A" o&og_{_z#Wi`N#Fog:-#"!# *! DMK!-#4*"*!#DM*"K!0#s+q+q:"G:"Z!"6͟*.#&" ~z *! :/#wÆ *! :0#w:"ͥ:"21#¤!"6:1#´!"6@:1#!"6 !"6 " :":"2"!:"͟:"21#O>͟ 4*!  !3#s+q:"0:"C!"6͟*2#&" ~b*3#&*!>wp*3#&*!>w!"6 ͏ !"6 "͏   F  U *! >µ͏ û͏  *! >@@25#*! >͏ ͏ :5#͏ ͏  DIRLBL yd'* !9"1>"#2#:Og}**Ip2~w2i#1#":R#~] !"6*##"#!"6*#!#s+q+p+q:#=2#J*#:#w*##"#-!#s+p+q+p+q:#=2#ʁ*#*# w*##"#*##"#Z: 2#aڛ:#{қ:# :#!#p+qx *#DM͏ M  " !#6>!#?͂2 # *#&" : #w: # ?: #ý: #-:#ý:#=2#O!" 6 : #8 !#4Ͱ 2 #:"AOy :y F!!#6> !!#ڋ:!# s.y *!#&*!>Oy !!#4]x *"|2"#x F͉ :"#¸Y ͏ :"#b ͏ M͏ :"#M͏ :"#i ͏ :"#x ͏ :"# *"#"":""9!+"O#!N#6:"!N#A*O#Ny *O##"O#!N#4"!"6!"6!"6:"Z!:"e!:"p:ͳ2"„"!:":"#H!:":"=o&)))A ~ھ+:"=o&)))A  ~ lNͳ2"4:"=o&)))A *"& ~=*"""!"6#6!Q#6:"=*"N{2"*"#""!Q#4!:"X*"N{2"*"#""!Q#5>:"=Œ*""":Q#2"O>҉e͟!"6:"= ¶*""":Q#2"O> ҳ!"6 ͟*""":Q#2"O>͟!"6:":"=o&)))A ~HF:"=O!"*! > ͏ ͏  *! ~1 v ͏ :"K͏ Ô:"@@^͏ Ô:" q͏ Ô:"/: " HҎ͏ Ô͏ :"Ҥm͏ v!6#q*"|. :6#͘, ͷ:" :6#*!DMͧ "" :6#*!DM "" ! ""*"|.͌:6#(, +͘>>*!DMͧ ""*"}t*"|kͥX*"|h͌͘t͘͟*"}ʘ *! *! ~ژ͘*!DM ""*"}*"|ͥ*"|͌, J͈͟>!"(:"(:"(Ͷ :O~!ʫ:<2Ž:"2"x2*# O:ļ:<:G>O*# :<t tIw!/>!/>!*6 #:_#:*Y" Y" Y" >*Y"#####Y"##Y"Y"Yz2*Kg"ɯ22!"*DM6:O* 2~ ~ †:<~:2>2:<** "_?:<2>!/:<}:2* ~b W6 y2> # vwm>2>! ͏ !##q&"u  S 2##!$#q:$#>:$#o&&""!:\w!"6!"6&"u *#EZ *#GZ *#IZ *#Z * #Z * #Z "*#DMKc 2%#¡>*%#M>!'#q=͏ :'# ͏  ͏ p͏  Z ͏  ͏  ͏  ZM͏ W͏ ]͏  y  Z!Ay Z/1y Z=2y ZK3y ZY4y !(#q*(#&*!~q>>:"ڒ:"ڒ&"u \S O!)#q:)# ¨ͅ 2*#ò*"M 2*#:*#  F͉ p͏ :)# M͏ W͏ ]͏ :"*"M 2+#!"6 6>!":"=:"=O!" HqQ͟X͟X͟O!͟OG͟X/  ^:  Q:"s ":"ҁ":"ҏ":"ҝ":"ҫ":"ҵ͝:"ҿ?:"͇:":"!":"!":"͟͟ P:"):"!"64@4:"P:"F!"6@44:"!"t:"h͟͟ Ø:"҅ "Ø:"Ҙ!"6 ":"ҩ 4:"!";͟  :":"!"6  " ͓ :" :" !"6  ":" :" ͟"*͘͟!"6:"?:"?:"2":"2!! ""*"}Š*"|}ͥj*"|z͌͘Ê͟  :"¦:!2!!2 o&""͘2:!:!=2"*"MC ͽ !7#6> !7#*7#&\ ~?>!7#4>ͭ! \K!"K:] :e HY!"6&"u \S 28#O!\"!͘͟ *8#M^!"6!:#s+q*9#&)))A *:#& ~!;#q!<#6*<#&u :s—>*<#&u :;#«:<#!<#4Ä!@#r+s+p+q!G#6:H#:H#2G#*D#M{2"!L#6:"=:L# *D#M{/ N *~O²+—">2>!/*:< "~G # p *~w#  : *8*:*8yO:O*}O= ~ w#P^#V#ɷ{ozg |g}oh:<͉̉O<OBKBK$'-*!*^#V">!+#Ia:,#o&&""! >w*! ~ F*! ~F!"6[!\"!]K!"6&"u S 2,#:,#ʗ:,#`O!&" ~ Žc 2,#p U͉ ͉ :"!"6*! !K!"6+6! ""}*"|͌͘͟:!2"!"6:" ͟" *"*""K"j  ! "6"͏ :"b:"Tͥ͟:"2"p *! >w " :"‰!"6!"6*"*" "K:"ҥ:"Ҹ͟!"6*!#  >!"3!-#6:"=!-#"*-#&*"~.*"*!#DM*-#K  ͓EB "#GB "#IB "#B "#B " #B " #2"O ! "K!T#p+q*S#""""!!"" ""*"DMS :"Ҙ ͟!!6C  !͏ >"9!ʬ !"6ñ !"6!\K9 :"!:"  e͗ :" ͙ :" 1:" ͗ :"!!"6!?!!"6 _ogi`N#Fogo&og<͞8-*<&^<) ^#V"d:M*<&^<) q#p!<4*9&))9  *`:s#r*A:)8"p9*9&))9 q#p:9<29O>D:9=29D:9ڗ*9&))9 ^#V"p9  ^#V"`:*`:DM!96#~ͬ . ":\ -:+: .+: -:9":5*.:~=ͬ :9('*.:~(*.:~)H^*.:~,NDͬ :9['(:9vC()!o96>5!B".:ͬ . ":\ -ˆ*.:~=Ÿͬ ï.+: -§:9ҹ'*.:~*.:~(H*.:~,Dͬ :9'ù:w92y9:9F:9DMͪͮDMͪDMͪͺ"u:![<4!"i:"k:"m:"o:*d:##6*d: 6*d:^#V!`=p+q*d:*_=s#r*d: >!a=q*d: :a=w*d:##>?!b=q*d:##:b=w*d:##~*d:##>w*d:##~*d:##>w*d: ~!c=q*d: >:c=Hẅ́d:8++"\<*\<^#V!e=p+q̈́d:8++"\<*\<*d=s#r*d: ^#V!g=p+q*d: *f=s#r*d: ~!h=q*d: >:h=Hw!k=s+p+q!^=6:k==2k=ʱ*i=:^=2^=*i=#"i=Ñ:^=2^=!n=s+p+qͽ"d:`:d:͞8͹h!n=*l=*d: DM*n=>*>:DM9͏5*:@ ~ !92(< !92)<7 :)<ր2) >!:*!^:6+":^:$t 8'> *0< ~L*0< DMB5*0< 6*0w#6!4.Ï_ Ҧ0Ï7Ï͜Ü\2|::Iͺ>2 :2f>2>û>!6 #=!~a1{1 w##:Ƃ2*6 2fl:<2!G\:>2 *|ͫ}*ͫ>:Ï:> ͏> Ï> Ï:_:<2>2ͺ >Ï*}o|(C(͆7:9):o9:o9H4!"p9>:o929*p9"95*.:~(*.:~ʐn*.:~)p̀^*.:~*.:~(HҍDO:9ʛD*Ͳ!6~̈́6*& 6:[],()?$! : @: <_2 <: !#<ڲ*#<& :<«>!#<4>*.:#".:*.:N2<&õ͵:< ͵!<6 !%<6+6:%< :%<  !̈́d:8+s#r!r=s+q+p+q*o=DM*q=̈́*^=&^<) ^#V"d:>d:ͫ8ʆh!q=}*o=*d: DM*q=>*}U!r=}>M"d:<>!|=r+s+q+q+q+p+q+q+p+q:u=2}=:z=Һ!}=44*`:"d:*}=& "`:q:ͮ896<*s=DM*u=̈́*^=&^<) N#FU*^=&^<) *d:s#r*}=M͍*v=DM>*y=M*u=Ms*x=Mf*u=*d: *s=DM -B:z=Y*{=DM*d: ~#k!{96 MODULE TOP $UNDEFINED START SYMBOL: $YY???? $$$XX???? $$$RQST$ UNDEFINED SYMBOLS: $ABSOLUTE $CODE SIZE $DATA SIZE $COMMON SIZE $UçCOPYRIGHT (C) 1980 DIGITAL RESEARCH ? OVL LINKING $ $ 1L9M9!96w:o9!9D:!""!""!"9*9^#V"9"q::u9 ͥ6**=;"`:"b:q:b:͞8.96`:q:͞8"9|!96wj1:9R,v!w#6*0<##N#F*.< ~O`i~8p8!6Ͷ8ikS*0< DMv5*0< DMd5*0< *0<##N#Fq#pä*0<##q#p*u:#^#V*u: ^#V*u: ^#V*u:~*u:~*u:>*u:~*u: ^#V*w: ^#V!8:=<Hw!>:><Hw!?:?<Hw!@:@<Hw!B͔8>ͥG<*!""ͮͷ͇*"͛~ͫ#*}#"%"*̀*}K|K*ͺ-m121=2#\:}mͺ2>o:  /\ͺ 1gn~ͻ͙D.:ܰg+":>2 CP/M 3 DUMP - Version 3.0$ ERROR: File Not Found $ Enter Password: $ Password Error$ ERROR: No Records Exist$ Press RETURN to continue $,<6͸ !\6͊ !!%<6͊> :%<5 !͸ ͵" :<:„ :\:%<Hb !:]A<2\O>v !*%<&\ 6 ô !%<6:<.° ͵͊ڰ :%< ڧ !͸ ͵Ô ! :%<<2% :<02<> : :>!"&<͵͊6 - *&<))))*<& "&<0 D͵ *&<:/͵: W :ZD͵:ڎ : !=8:=0OͲC:= AOͲ!=q:=O:=O!=p+q!=̈́8MD>=08MD:;!t;!;!;:u;2\. ] -Ÿ\ͩ6!t;6!;6!;6!;6!=6+6>!=*=&f;) ^#V"= *= ~ *= DMv5 *= 6!=6:=<2=:=7::2\. ] -)\ͩ6*p9###H:ͮ8!D:U!\:6*p9###F:ͮ8!C:r!\:6*p9###X:ͮ8҉!\:6:R:>S:ͫ8:U:H:C:/HҼ!\:6!\:6:E:!C:!\:6!\:6:C:*F:"::\:*p9###":;*; ";*+":*"::,*;*;":3*.:#":*+":*":**:":*+" ;*" ;**:";*+"9;*";;**;"=;!]:6>!]:ڤ*]:&f;) N#F͋41!]:4:u92:2:2;2E;2u;2;2;2;!D:6+6!E:6!"p9!"m9}2o9!z962v92x92w9!t96X!"y:"{:"}:":":":":":":":":":":":":":"i:"k:"m:"o:}2:!:6#6#6*9"q:2C:2D:2E:2R:!"X:o&"Z:|!"s:!"p;";";";":":";"7;*+":*+":*+" ;*+"9;!":":";"?;!":":";"A;:9*b::9=o&))9  ^#V!!<4*<&^<) 8'*u:"w:*E<#"E<ͺ"u:>͔8$>ͥG<ͮ8!TJ<ͫ8:P<Hr:Q<ҁ!U<6 Æ!U<6:U<q:ͫ8+s#r!`:͹8ң96:T<Һ*JE<ͫ8*P<&i:) N#F,DM,*LE<ͫ8F*P<&i:) *q:s#rN*q:DMͷ!V<6>!V<ڷ!"Y<*V<&i:) ^#V"u:>u:ͫ8ʝͺ"W<*Y![<,*[<&i:) ^#V"u:*[<&<) N#F.>u:ͫ8%Okͥ:Ý :!Q: D*Q:&J: :!=ڞ*=&y:) >Ͷ8Ҕͥ:=<2=v!":::2=!=6:=#w:==2= *=&:) *=&: N!: ͠8*=&: ~2=*=& :=w:=2=:=<2=õ*=&: :=w::<2:*b:"d:`:d:͞8q͜/!9H`2UO!: 8DM>ͪ̈́d:8+s#r&!]:6>!]:7*]:&f;) N#F͋4:*]:&<) N#F.B2=:="="=:=O>"=n2=ð-*]:&i:) ^#V"u:>u:ͫ8 '*+>M%('͕".>:^:('*.>DM*,>^%:+>&7','!0:6&H'='!0:6!"1:"7::!:'*:͗8"1:"7:. 9\ -u')29!hʦ':92h\͕6¦'\=45)2|29!:6*7:"1:!"9"9^ :_:/2^::!:!_:' ',':e (.e -'e>*2!:\d5I'}/B(}͉ͽ"d:`:d:͞8)͹(:v92\!0>6>!0>گ(h!0>҈(*0>&\ 6 å(:0>=O! *d:*0>&\ w:0><20>g(!!:6.e -¼(\W5/(!!:6.e -(\d5*d:"1>!_:6I'*1>"d:̈́ N#F*t>?8*]>~   +5{>.+55OͲ5w66ͩ6́5;6<566́5͕6<>́5͕6<>645͜6<H66! w #ˆ5>Ö5>2,6""6"$6yo`"&6!"*6͋6-66*&6|6 "&6*"6MD6*$6DM:,65ͷ6g666Ͱ66**6|6U6*$645*"6""6**6#"*6ú56**6ABORTED$NO SPACE$NO FILE: $CANNOT CLOSE$DISK READ ERROR: $DISK WRITE ERROR$YYYP   YP6YPYPYPYPYPYP Ͳ ò!>6#6͐6">*>|$7>*>DM*>h!ͮ"!>2>:>>!>ͫ8HA!ͱ!">G!*!>">*>DM*>MC:>e!*]:M͋!*>*>*]:*>*>5:=Ҭ!ͱ!"!>>͔8ž!*!>">!>6í!!:]:2%>*>M^ *>DM4*>#DM4O`i~8p8"#>*%>M^ *#>*b:"d:`:d:͞8%"*d: ~#"*d: 6̈́d:8+s#r!!{96:*:MH"H"!^:6:*:Mi"2"g:͜2f:o"=6*:::: -y"::29:*::ͺ/Ҵ":*:͉:*:M"!:͹8"/Ͳͯ/Ͳ Ͳ=6#:*:*:*:\8_* DMe - /:w9#/:w92\\B5:9 A/. ~9\ -9/!"5:}28>27>*ͥ.:x9Z^/. \": -f/.en* -v/:x9ʌ/:x92\\B5!"5:}2R>ͽ"d:`:d:͞8(0͹/H02DMv0 q*!Q>6h!Q>/:Q>=O! *d:Nq*:Q><2Q>/:R><2R>0 q* q*0 q*̈́d:8+s#râ/ q* q*ͥ.!S>q> !S>O0:S>0Oq*Z0:S> AOq*!T>q:T>O60:T>O60!V>p+q*U>|O[0*U>}O[0*9>!=8"W>*W>!=8!Y>s:h0:Y>2h\͕60\>645*W>!=8!|s2*9͗8"9>. \~9 -0:9 1-2=ͥ"=ͮ"=!"=nͺ"u::]:<2]:w!=r+s+p+q*=}*=_DM͘4*=#*=|_͘4!=p+q*="d:2:=2=:=O>Ґ*=DM^"=ã*=&:) =8"=:=O>:=O>==͞8UO!: ͹8"=*=*="=*=DM*=8*d: ~*d: :!z9/H!"=ͽ"d:`:d:͞8HҴ>=08>͔8S6!~=6U`/wUp/>=08 \8 M`͹ҖÞ2DM_   *=#"=̈́d:8+s#r >!=Ͷ86!=6>#w#62~=ͽ"d:`:d:͞8N/=:=d:8+s#rI(.: -)!:6!:6^ ͽ"d:`:d:͞8)/)*{:DM>fy ^%y !":y y *d:"4>#*4>"d:!3>6>!3>)h!3>ڶ):3>=O! *d:Ny û) y :3><23>Œ)*:"::)͸*9"q:̈́d:8+s#r5)!0:4~ (*6*1:#"1:*7:{z*!"1:/ *1:!>~26>xG:6>26>G )x{_ P*#B*>ɯ`iq#zV*COMPRLRSPSPROVLSYM!;>q*5:> :;>w*5:#"5:!3:͹8ڦ*>*3:DM\͔5!"5:!<>q:8>!<>28>:7><27>*!7>6*8>Mq*!8>6!=>q*=>Mq**A:#"A:!?>p+q*>>}O**>>|O*:9ͫ8"|>##*|> ~!7!>6D7*>|?7!>66"|>D7!>6:>Y7!~>6#6#6Å7*|>~2~>*|> ~2>:>z7:>2>*|> ~2>!>6>!>ڰ7*>&v> ~/*>&: w!>4‹7:72"g:^ *:"|> *g:":*9My *9My *9My *~>My *>My *>My *|>":i`N#Fog_og_{ozg_ogDM!>))덑o|gV8 =D8DM!>))k8 =c8_{ozg^#V) ~8^#V|g}o ˆ8_{ozgi`N#Fogo&og_{_z#W*:͉*:*:"::*:M/I#:*:͉*d:DM :*:Mҟ#{#=ͯ6Ü#*:&:) :8DM>*:Mf#:*:*:&:) :8*:͉*]:&y:) N#F*]:*:DM5!=6#!=6*:":*:M^ :]:$$*g:*:":C$*]:&:) :8*]:&y:) q#p:]:P$!=6*]:&y:) N#F *:":>!:Ͷ8::HҲ$:R:Ҕ$=6ò$*:&:) :8"S:::2U:!R:6:0:$)$ò$!&>6>!&>%%*&>&:) *&>&:) 8*&>&:) q#p*&>&*9>"9>\d5͍0C\͏5!Z>s*9>!=8C "9*9*|9s#r͍0C*Z>&\8DM\͔5:j2j\v5:9ҁ1*|9)8"|9:y9ZŠ1a9ҟ10ñ1g9ұ10!_>q.*[> :_>w*[> ~!`>q*[> :`>w*[> *[> ^#VN#FR* *[> 6*[>^#V!=8"b>?8!a>s1!a>P2*[> DMv5*a>M1*[> DM͕6P2*[> DML5*b>!=8MͲ1*[>  *[> ͞8ҍ2*[>  *[> N#Fq#p *[> ~ڮ2*[> DMB5 *[> 61*[> N#F*[> *[> N#F͔51!e>p+q*[> N#F*d>?8^8*[>q#p*[>!=6>=08>͔8'6!~=6w*=#"=>&8)))M`̈́d:8+s#r>!=Ͷ8\66!=q!=:~=v d!=6h!=ڤ:==O! *d:N:=<2=|:E:J:*Q:M2"V:!"V:|!=6:Q:!=:==O!J: NͲ:=<2=6D:R:*U:&:) S:8"V:D>!{:Ͷ81*:"V:DX:ͣ8D*X:"V:Z:X:͞8mX:Z:͞8#DM*X:v6*:DM*:6*:DM*:6*:DM*:6`:s:͞89ͮ8*9|=ͫ8:+:o9+h,*p9"A::\:,+**V:DM**X:":!@>6::=!@>q+*@>&: N!: p9͞8j+*@>&: N͍+!@>47+:o9:o9HҌ+ -!C>q:C>¢+*X:"D>ó+*C>&:) ^#V"D>D>A:͞8+96D>A:͞8+*+*C>&f;) N#F͋4*C>&y:) >Ͷ8,:C>,*X:DM',,',|9A:͞8&,*A:"|9!G>p+q*F>"H>*C>&y:) F>8+!H>͹8g,*H>DM4O**H>"H>3,::=O!: N!: !y: 8*p9͗8"A>**A>DM**:o9,***p9DM*,*m9DM****:r9,*:DM*,*!J>6>!J> - LINK 1.31 $01/04/83?MEMRY$MEMRYX MEMORY OVERFLOW, USE [A] SWITCH$INSUFFICIENT MEMORY$OVERLAPPING SEGMENTS$ XXABS $$$XXPROG $$$y:) q#p*&>&:) >w#6:&><2&>$s:q:͞87%*q:"s::G%͸*9"q:^ :_:/2^::{9]%!!)>s+p+q:)>ˆ%*g:*'>"'>:f:҅%!)>6Ý%*)>&:) '>8+s#r*]:&y:) N#F*]:%*'>DM*)>M͋%*]:&y:) N#F*'>*)>*]:5y y !*>q:*> &>!*>&:*>#&+"ÿ&:*>1&p"ÿ&:*>?&k$ÿ&:^:ҿ&:*>=O!& ^#VI"ÿ&ÿ&͈"ÿ&>ÿ&͵"ÿ&#ÿ&T#ÿ&#ÿ&#ÿ&$ÿ&$ÿ&Q$ÿ&d$ÿ&W&]&`&f&o&u&{&&&&&&&!+>6)&)2->:^:&*->My (')2,>')2+>:+>*[> 8+*[>##q#p*[>*[> N#F^#V?8*[> s#r *[> N#F`i"h>*[> N#F `i"j>*h>"f>j>f>͞8ڐ3*f>+*[> ^#V\8DM2_2*f>"f>\3*[> ^#V*j>\8DM2*[>  *[> ͞8Ҿ31*[> N#F*[> *[> N#F͏5!n>s+p+q*[>l>͠84 *[> ~4_2*l>DM2ͦ3Ê4*[>##l>͞8Ҋ4 *[> ~34_2*l>DM2:n>j4*[>  *[> N#FPY͹8d463g4ͦ3Ê4*[>  *[> ͞8҇41Ê4ͦ3!p>p+q*o>"[>!s>s+p+q*q>DM3*[> ^#V"]>*[> N#F*q>?8*]>:s>w *[> 6!u>p+q*t>DM3*[> ^#V"]>*[> Ͳ(Ͳ*=DM_-Ͳ*=*=+DM_)Ͳl*|9DM_68f ͥOr:t9Z^E.:n~:x9ZyU/?OVLAY?OVLA0RELIRLIRLREL))O`i~8p8>!:!>6::!>:>=O!: NͲ!>4½)2:͕":)2::: !:6!>6::!>. ):>=O!: Hq!>4 *h&\8*|& "9>*7:DM\͏5*9+"9!>q:>2]:*]:&f;) N#F͋4!>q:]:!f:Ҏ *]:&y:) N#F*>͘4:]: Z:y:͞8Ҽ *y:"Z:X:y:͞8 *y:"X:*]:&y:) N#F+q#p!>s+p+q::2>O!: :8">*!J>4,*p9"A::\:(-ͦ-ͦ-ͦ-!L>6::=!L>|-*L>&: ~2K>u-*K>&:) A:͠8e-ͦ-J-:r-.u--!L>4--*p9*A>A:ͮ8ҕ-ͦ-|-:7>ʥ-ͦ-Õ-!O>q*O>Mͧ**A:#"A:M>A:͞8-ͦ-ù-ͦ-*K>&i:) ^#V"u:>u:ͫ8.ͥ*K>&:) 8"M>͹-ͺ"u:-*K>&<) N#F.*0< ~R.*0< DMd5*0< *0<##N#Fq#p].*0<##q#p2P>:P>ʤ.*K>&:) 8"M>"9:P>O>Ҙ."9͹-2P>c.>5:08>͔8ʾ.q*å.>*5:DM\͔5\v5:w9Z.. \": -.:e /.*o9&XXDATA $$$XXCOMM $$$::;7;YYABS $$$YYPROG $$$YYDATA $$$YYCOMM $$$n;;;;1TdCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543210123456789ABCDEF ERROR: $Reading file: $Writing file: $Directory full$Reading file: $Writing file: $Invalid drive.$) ? $) ? $) ? $Bad character, re-enter $ $ Disk read error: $File cannot fit into GENCPM buffer: $Unable to open: $BDOS3 BIOS3 Setting up directory hash tables: $ Enable hashing for drive $: $Unable to allocate space for hash table.$ S+SFQ  ~H*V&+SFQ  VzSHV:V2V*V&+SFQ  ^#V"V:V<2V:V!$V6!U6ͬ#Q$!H> U͇Sʔ* U|2Uß*U|2U!U:.Q2T*U|!UO:/Q2T*U|O:T2TUTI:-Q/!$V>O:T2T* U|O:T!$V2T:T=2T* U|O:T2TҮ:-Qқ*nV*U*V |!UO:/Q2T*U|O:T2T2Uͬ:U/Ҙ!!V6>!!Vژ*!V&$SQ  6:!V<2!Vsà!U6:V/ҫ*:U2T:T2TTͩ:-Q*T&+SDM*U*T&+SDM*U:-Q/ͦF :p> ::p8:o8> ͽ> ͽz2o:pY>ͽ:RM:RO>2q :pʅ:q2k!Q~wK'!'[Ks:U:U=2U*V~#"V:R:R=2R*Sw#"SK`!"S>2RZ>2!"V>2UK o&6$  cc K||:tʒ    ~?#7Invalid: $Error reading input$Error writing output$No file found for input$Error creatin+q *T 6 *T 6*T!Tp+q*T!Tp+q*T!Tp+q*T] ͧ!Tp+q*T} ͧ!Tp+q*T ͧ *T 6!Tp+q*T!Tp+q*T! ͧ!Tp+q*T" ͧ!Up+q*T$!Vr+s+p+q+q:V *V*VDM*V -- !Vs+p+q:VJ *V*VM!VLS!Vq:V e > :Va/>z!V/H҄ :V_2V:V!Vq:V/>!V/HҦ >ͧ>!Vp+q(7*V~ Y7 N7NTe:T *TMV Y*Vw!Vq:INDEX ERROR$MULTIPLE DEFINITION: $MAIN MODULE ERROR$FIRST COMMON NOT LARGEST$COMMON ERROR$UNRECOGNIZED ITEM $o&og_{_z#Wi`N#Fogetting up Allocation vector for drive $ Setting up Checksum vector for drive $ *** Bank 1 and Common are not included *** *** in the memory segment table. *** $Number of memory segments $ CP/M 3 Base,size,bank ($) $ Enter memory segment table: $ Base,size,bank $Zero length segment not allowed.$Bank one not allowed.$ ERROR: Memory conflict - segment trimmed. $Memory conflict - cannot trim segment.$ ERROR: Memory conflict - segment trimmed. $ ERROR: Memory conflict - segment trimmed. &:U2!V!""V*!VM"V͟:!V2U! U6Û*U|!U2!V* U|!Uo&)##""V*T&+SDM*!V*!VM"V͟:!V2 U:U2!V!""V>T͇S+s#r*!VM"V͟:!V2U* U|!$V2T:T2T U(T(TͩC*$V&+ST͊S+s#r* U|!$V2!V:-Q/ *T&+SDM*!V"*T&+SDM*!V*!VM"V͟:!V!Uw:-QҢ!T6:T2TULTLTͩ*U|2!V*U|!Uo&)*"V""V*T&+SDM*!V*!VM"V͟:!V! Uw:,Q/Ҳ:V2V *V&U  :T2T*T&! S!0*V& U q*T&! S0*V&g temp$Error renaming temp$ Usage: TR A:{outfile}=B:infile[U|C]$Copying -$ $ MEMORY OVERFLOW, USE [A] SWITCH$INSUFFICIENT MEMORY$OVERLAPPING SEGMENTS$ XXABS $$$XXPROG $$$VO! N7:VO! N7!Vp+q 7*V|O *V}O H7!Vq*V&+SDM$ !Vp+q!V6!V60!'"V>V͇S† *VM7 !V6>!V VVzSڽ !V6:V<2VVVzS+s#rÔ :V *VM7!V60*V! S"V:V<2V‹ !Vs+q(7:V  #7*V&DMZ  *VM N!Vs+p+q+p+q :T: ͜*V6:V<2VO!T NV 2V  :V,u *V#"V*V6!V6 :V#… !V6  :V02V:V> !VHҽ >!VҸ :V2Vý !V6!V:V *V^*V&+S*V& *Vq !V6*V6ͧ *$ CP/M 3 Sys $ Memseg No. $ Bank $ Accept new memory segment table entries $Default entries are shown in (parens). Default base is Hex, precede entry with # for decimal $ Use GENCPM.DAT for defaults $Create a new GENCPM.DAT file $Display Load Map at Cold Boot $Number of console columns $Number of lines in console page $Backspace echoes erased character $Rubout echoes erased character $Initial default drive ($:) ? $Top page of memory $Bank switched memory $Common memory base page $Long error messages !U q:V 2V*T&+S"!U$-U RUW !T6#6#6:.Q2U:/Q2UTqT TyT Uͧ pT !T6Uͧ pT pT :;Rһ!;R6:%V2.Q:4Q/24QTT TT L!U6N!Vr+s+p+q*V6 *V#6 *V|O! *V## w*V|O! *V w*V}O! *V w*V}O! *V w!T:TO`iPSW "V*V :0Qw*V :2Qw*V :1Qw.*V :3Qw*V :4QwX*V   :+Q/ҼW*V >*V w:@*V wW*V >*V w^*V :/Qw!)X"V*V6? ͜*VDMN*V~  (7*VN !V6>!Vn *V#"V:V:-Q/HX *V6d ,7*VN :V<2V, *V++"VNÊ *VN*V !V6!V6Te!Vr+s+q:-Q/Ү >!V6#q#p!V6:5Q!Vڳ*V&+SFQ  VzSک:VM*V&+SFQ  ~*V&+SFQ  VzSHJ:V2V*V&+SFQ  ^#V"Vé*V&+SFQ  ~*V&+SFQ  VzSHҩ:V2V*V&+SFQ  ^#V"V:V<2V¿ :V:VH`!V6:5Q!V`*V&+SFQ  VzS/*V&y1Io&6"u!'"wu|1~=1#"u!"wu|1~[1#~UC12p#~]1#~1!͛:( (! :( 1!'͛1͹:( 1!"r2ty_!#*r 6$#"r:t<2tCA !:tK   !( ͹ =ƒ223!'K!T6$#6$#6$y2#KKT2o$Double allocation vectors $Accept new system definition $ CP/M 3.0 System Generation Copyright (C) 1982, Digital Research $ BNKBIOS3 SPR$BIOS3 SPR$BNKBIOS3 SPR$BDOS3 SPR$RESBDOS3 SPR$BNKBDOS3 SPR$ 64K TPA Copyright (C) 1982, Digital Research *** CP/M 3.0 SYSTEM GENERATION DONE ***$!Tq:UM*T&!Tp+q:Ud*T !Tp+q*T#6:UҀ:Tڀ*T *T#N! *T6 7 7!Tr+s+q+q!U6N*TDMN:TTN͜:T.:T/!U!]6 !m6 !TpVN#F!W "V*V"V*V͕S(!$V6-!$V6*VSD*VWR!"&V!V6&VS!V6>!Vڷ*V&)*&V>͒Sʭ*V&)*&VWR"(V*(V ͕Sʭ!V6:V<2Vf:-Q/!V!$V6!$V6V>X W*V"V*V~>>!Vs+p+q+p+q%N*VDMN 7*VDM$  7*VME :,QҨ *V&U *VDM :V 2V*V&U DM*V:V2V*V&U *V&+S:V2V*V&U ) :V2V!Vp+q*V"TͣN,ͧ*VDM !Vr+s+p+q*V^#V"T*V##^#V"T*V ^#V"TPS"U:DR2TN-Qʹ ͜:-Q/2T:-Q[#:ER2T/Q ͜:FR2TN+Qʹ ͜x#:R2T͜N!W#*W&U 6:W<2W#!W6>!W $*W&U 6$:W<2W#!V6*V&U  !V6TqT TyT Wͧ pT^ pT^ WS#ZS"U!W6>!Wڋ$*W&,V) >w#6:W<2Wh$!"LV:]A$!U6#6!W6>!W$*W&=R 6:W<2W¦$$!U6#6:mD$!U6!T6 Available space in 256 WAO7(N1: W1!W6! W6:Wʨ1:WƋO!=R ~2T(N:WAO7)N*W&$SQ  DMʹ ͜*W&$SQ  ~ґ1*W&$SQ  6è1*W&$SQ  6! W6S2:WKO!=R ~2T)N:WAO76)*W&$SQ  DM  *W&$SQ  >w: WS2! W6*W&$SQ  ~S29)ͧZ)N:WAO7)*W&$SQ  DM  2*W&$SQ  ~$3: WҌ2! W6*W&$SQ  :Ww 3:WkO!=R ~2T)N*W&$SQ  ~AO7)NTe:T 3*TMV A2 W* WM͈ 2Ü2* WMF2Ü2*W&$SQV&NV) nVR+s#r*(V ͕S—'N:VAO7:7!V6**V >R!S*V&pV) s#r*V&) VR+s#r **V R*V&pV) CS **V q#p:V<2Vk:Vҫ͜:T2FQ!T:/Q2GQ!"IQ!HQ6!V6ON:GR2T 5Q N*FQM ,7*GQM ,7*HQM N:V/҈!N!V6:5Q!V !V6:V/ :V =O!=R ~2T*V&+SFQ DM *V&+SFQ  N`iPS*V&+SFQ  q#p*V&+SFQ  ~ͧ *V&+SFQ  ~7ͧ *V&+SFQ ~2V*V&$SQ HW|S ~H6+*W&$SQ ^#V"HW!W4**W&))lW *HWs#r*W&))  >w#6!W6>!W+*W&$SQ HW|S>͇SH+*W&))lW  *W6 DS+s#r*W&$SQ  6!W4h+!W4*!W6>!W7,*W&+SFQ  *W&W) N#Fq#p*W&+SFQ  *W&7W w!W4+:-QF,!fW6K,!fW6 !W6:W4:fW=2iW!"gW"dW}2 W! W6*T&PS*LViS"bW:-Qڞ,nVbWzS*ViS"bW!W6>!W,*W&W) *W&+SKQ  N#Fq#p*W&$SQ  6!W4£,!W6! W6#6!W6n&*V#DMT  *VDMT *TZSU͊S@?ͧ*T+ZS}<2V!V6!V:V҆*V&+SW "TDMͧ *VDM> :V<2VS*TDMO W*T"T!Vr+s+q:VGTqT TyT *Vn}2T*V#~2TpT WTS}pS}TR+s#r*V&)+!Vs+6:V!V4>T͇S+s#rBKͧ pT^ :V<2VpT *VT :-Q/k)Tw T z!LT"V!U"V͙!T"V!U"V͙!(T"V! U"V͙*V#DMT  *VDMT *VDMeͧWͧ *VDM> *V*Ws#r*V##*Ws#r*Vbyte pages: $TPA =$, Bank 0 =$, Other banks =$Unable to allocate Dir deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Drive specified has not been defined. $0FFFFH is an invalid value in the DPH directory BCB address field.$ Setting up Blocking/Deblocking buffers: $ The physical record size is$: $ *** Directory buffer required *** *** and allocated for drive $: *** $ Overlay Directory buffer for dr  : Ww͜*W&$SQ  :Wwn3:U!W]3:W+O!=R ~2T)N*W&$SQ  DMʹ ͜*WMTCn3 4! W6*W6 dWDS+s#r!W4>JWR>fS:WHҿ3!JWVS+s#r!W4Ì3!JWVS+s#rç-!W4n&))lW  ^#V"JW-!T6!W6:W 4bB)NWʹ ͜P,!"PW}2Wo&"TW2W>!Wu5*W&$SQ  ~n5*W&$SQ  ~ >Hһ4:-Q|4!W4á4*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW*W&$SQ  ~ >Hn5:-Q/5!W4*W&$SQ *V&+SFQ  N "V*V|*V}O:/QH҆MN!V:/Q*V&+SFQ  Hq!V:/QO`iPS*V&+SFQ  q#p *V}2V!V6!V6!V:V# *V&+SFQ ~2V*V&+SFQ  :V2V*V&+SFQ  *V&+SFQ  !V:V/+~!V/H+ |ͧ!V6 :V!V+~!VHc N*V&+SFQ :Vw!V6 :V!V+~!VH N!V:V*V&+SFQ  Hq!V:VO`iPS*V&+SFQ  q#p!V6:V<2V×1:V<2V"͜!V6:5Q!Vo!:V!))lW  ^#V"JW*W&))lW >͒S:WH3:WE-1&N!W6]&N*W&))lW N#F$ {&N!W6>JWR>fS:WHҚ-!JWVS+s#r!W4g-!JWVS+s#r:W3*W&)*&VWR"(V WR"*V >RZS"^W **V ͕S-!W6-!W6*(V ͕Sc0bB*W&$SQ  >w:-Q.: Wd.! W6*W&$SQ  6&N:WAO7&N.:W{O!=R ~2T&N:WAO7'N*W&$SQ  DMʹ ͜*W&$SQ  ~.*W&$SQ  6.*W&$SQ  6t/:W;O!=R ~2T'N:WAO7 *Ws#r*VDM> !V6&VS(>!V6>!V*V&)*&V>͒S*V&)*&VWR"(V *(V## *(V ͕S*(V ͕SH*(V ͕SH*(V ͕SH*(V ͕SH!V6:V<2V-:V!V6!V6!V6>!V*V&)*&VWR"(V*V&)*&V>͒S*(V S?!V6*(V ͕S:V/c!V6N:VO!=R ~2T *(V WR"*V**V N#F`i))"VN:VAO7N*V&6Q DMʹ ͜*V&6Q ~/*(V q#p:-Q/!V6*V&,V) *Vs#r*V*Live $: $ Number of directory buffers for drive $: $Minumum number of buffers is 1. $ Number of directory buffers for drive $: $ *** Maximum number of directory buffers *** *** for the current drive is$. *** *** Number of directory buffers reduced *** *** accordingly. *** $ Share buffer(s) with which drive ($:) ? $ *** Data buffer required and *** *** allocated for drive $: *** $ Overlay Data buffer for drive ~,5*W&$SQ !^N#F-S*TW"TWT5*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW!W4#4*fW&*PW+S*W&) "RW:-Q9W*U"jW*RW*U*TW *LV *V *nV |O:.QO:T2UO:T2T:T2T:T2T|2U!T2.QW"T*T&PS*U "ZW*RW "VW*T"`W*`WW !T͕SC6*`WW 6*`W#"`W6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH9!W6>JWR>fS:WHҶ6!JWVS+s#r!W4Ã6!JWVS+s#r:W8*W&)*&VWR"(V*W&$SQ  >«7*W&$SN!N:V=O *V&+SFQ NE *V&+SFQ  NE :-Qb!N*V&+SFQ  N ͜:V<2V !T6!V6%NVʹ ͜PNT2V!TT TT N!V6Vʹ ͜:V!FT !!U6+6!W6͌!:W/җ#:R2T͜N;Rʹ :=R2T͜͜N,Qʹ ͜͜:>R2T:2Q<22Q  2Q :2Q=22Q:?R2T:1Q<21Q' 1Q :1Q=21Q:@R2THN3Qʹ ͜:AR2TkN4Qʹ ͜͜:BR2TN:0QAO7NTe:T"*TMV A2W*WM͈ /"Þ":W20Q͜͜:CR2T.Q *.Q&>'*W&$SQ  DM  : Wt/! W6*W&$SQ  ~t/A'ͧb'N:WAO7'*W&$SQ  DM  &/*W&$SQ  ~^W͇Sҹ/'N*^WDM$ 'N*W&$SQ  *^Ws*W&$SQ  ~R0:W[O!=R ~2TM(N*W&$SQ  ~AO7(NTe:TL0*TMV A2 W* WM͈ *0/* WMF80/*W&$SQ  : Ww͜c0*WMTCc0 4*(V ͕Sn3!W6*W&$SQ >͒S°0*(V q#p*W&$SQ  6n3bB*W&$SQ  >w:-Qګ1: W1:W1! W6!W6*W&$SQ  6(N:V"LV*V͛ 2V'ͧ*V&+SFQ  *(V w*V&+SFQ N`iPS*V&+SFQ  N`iPS*V&+SFQ  ͕S *(V q#p*V&+SFQ  VzS*V&+SFQ  q#p:V<2V:-Q/!V!$V6:T<<2T:T<<2T!V6>!V8*V&NV) >w#6*V&pV) >w#6:V<2V:!Vڡ*V&)*&V>͒Sʗ*V&)*&VWR"(V *(V WR"*V*(V ͕SN:VAO7:7!V6**V ^#V!S*V&+S*V&NV) q#p* $: $ Number of data buffers for drive $: $Minumum number of buffers is 1. $ Number of data buffers for drive $: $ Share buffer(s) with which drive ($:) ? $ Allocate buffers outside of Common $ Accept new buffer definitions $!W6>!W**W&)*&V>͒S**W&)*&VWR"(V ͕S*(V ͕SHҸ* *(V WR"*V**V ^6 *W&$SQ q#p*W&$SQ  6*(V ͕S*%ͧ!W4*!W6>!W+!"HW}2W>!W=+*W&Q  ~h7*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rë7*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r*W&$SQ  >£8*W&$SQ  ~48*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rã8*(V"LW*W&$SQ  >o&)*&VWR"(V!Q  >ʂ8*(V ^#V"NWÐ8*(V ^#V"NW*LW"(V *NWs#r!W4>JWR>fS:WH8!JWVS+s#r!W4ç8!JWVS+s#r6!W4n&))lW  ^#V"*W&+SFQ  2W!FQ  ~:W!WHFE:W2W:W2W!W4D*W&+SFQ  S+s#ryE!fW:iW2iW*W&$SQ  ~ڼEWbWzS+s#rYS:/QpSҹEd%ͧ>E*W͛ 2WE%ͧ>E*W&+SFQ  WzS+s#r!W4D>!Wq*W6 dWR>fS'F>%ͧ>ERROR: $ at line $Missing parameter variable$Equals (=) delimiter missing$Invalid drive ignored$Invalid character$Invalid parameter variable$!"WWͧ !W6!W6:W GG:WG͈K2W:WFIGDM!>))덑o|gS =S^#V))) DM!>)):S =2S_og^#V) PS^#V|g}o ZS_{ozgO{ozgi`N#Fogo&og_{_z#WBNKBIOS3SPRRESBDOS3SPRBNKBDOS3SPRCPM3 SYSGENCPM DAT . $s#r!W46>:fWjW͇S+s#r! >w#6:fWjWR+s#r*W&$SQ  >1A*W&$SQ  ~¤?*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r1A*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W A*W&$SQ  ~ҩ@*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p*W&+SFQ   *jW w*W&+SFQ  *W&$SQ |S+s#r@*jW6 *jW *VWs#r*W&$SQ VWR+s#r *jW 6:fWZWR+s#r *jW s#r:fWjWRW 6 'N*W&W 6='N*W&W 6  *W&+S P  !^*W&+SR"W:WmM'N*W~A*W&W wM:WʞM'N*W~ҐM*W&W 6YÛM*W&W 6NM*WNbN:WM'N*W&W 6,*W#"W*WNbN'N*W&W 6,*W#"W*WNbN'N*W&W 6 'N*W&W 6 !W4PL!W4'L>!W NT^ T :W]NT^ !W6>!WUN*W&W 6!W4:N!W6aN!W4!Wq'N:WO! *W&W w'N:WO! *W&W wO*TDM}oN*T†O]!O> 2 PW:TgxʀO { O: PO*T!JW\6!W6>!Wc9*W&,V) >͒S\9*W&)*&VWR"(V *VWs#r*W&,V) VWR+s#r!W4 9!W6>!W9*W&)*&VWR"(V*W&NV) >͒Sʽ9*(V *VWs#r*W&NV) VWR+s#r*W&pV) >͒S9*(V *VWs#r*W&pV) VWR+s#r!W4h9aB!W6>!W::*W&W) *W&+SFQ  N#Fq#p!W4:*V*RW*nV "RW> U͇SUzSH҇:*TW*U|O:.QO:T2Uá:*TW* U|O:.QO:T2U!U:T2T:T2T:T2T:.Q2.Q* U}pS} URU͊S"`W> U͇SUzSHB;*RWF GF!Wr+s+q:U2W!U65FN*WDMN>FN*WDMZ :WCG.͜:W2U:WoG!W6TlG!W6sG!W4MG*W&W ~2W:W :W H:W HG:W ·G*W#"WMG*W&W ~2WÄG:Wa/>z!W/HG:W_2W:WG!W6:W!W6:W/:W/HI!W6>!W/H*W&W 6 !W4HtG2W!W6:W:W=H:W H:W/H~H*W&W :WwtG2W!W4:H:W=:W H:W/HҧHtG2W~H:W I:W=>!WHH!W6 I:W=HHF GH:WHcF G:W :W/H+s#r!W4?:fWjW͇S+s#r! >w#6:fWjWR+s#r!W4>JWR>fS:WHhA!JWVS+s#r!W45A!JWVS+s#ru=!W4n&))lW  ^#V"JW=!W6>!WA*W&7W *W&+SFQ  w!W4˜A!W6>!WaB*W&)*&VWR"(V*W&NV) >͒S"B*(V *ZWs#r*W&NV) ZWR+s#r*W&pV) >͒SZB*(V *ZWs#r*W&pV) ZWR+s#r!W4A!"W"W!W6:5Q!WB*W&+SFQ  ~¶B*W&+SFQ  VS*W"WB*W&+SFQ  VS*W"W!W4pB$N%N!bWVSDM$ :-QMC%O†O~#o}o|O<O:TzO<.O:TƜzO<8O:TzO:TzO:TotOzO:TgN!|!|PRTMSG ,QPAGWID 2QPAGLEN 1QBACKSPC 3QRUBOUT 4QBOOTDRV 0QMEMTOP .QBNKSWT -QCOMBAS /QLERROR  +QNUMSEGS  5QMEMSEG00 KQHASHDRVA6QALTBNKSA +QNDIRRECA ;QNDTARECA KQODIRDRVA [QODTADRVA kQOVLYDIRA |O:/Q2T*U}pS}URW"\W*T&PS"XW*T&PS*U "VWÇ;*RW*`W|O:/Q2TW*U"\WO`iPS*`W "XW*T&PS* U "VW*RW*\W"T*U|O:T2T*W&)*\W"jW*XW"ZWWTS"U*T"`W*`WW !T͕S;*`WW 6*`W#"`W;!W6!W6!W6:5Q!WS<*W&+SFQ  2W!FQ  ~:W!WHL<:W2W:W2W!W4;:T2FQ!T:/Q2GQ:W<*W&+SFQ  O:T<*W&+SFQ  N`iPS!͕S"`W!FQ :T w*W&+SFQ  N`iPS*`WiS!q#p!W6n&)) ItG2WHGtG2W!W6!T:W:W H:W/H[I*W&T :Ww!W4~`i+wtG2WI:W :W/HxItG2W[I!W6#6>!W҇K *W&+S P  ^#V"W! P  ~2WJ:WI:WA2WI:W0/>9!W/HI:W02WI:WA 2W *W&+S P  ^*W&+S*W"W*W&T ~?[J *W&+S P  :WO!=R 6!U6!W4!T5>!T҇K:WʧJ*W&T ~A/>P/HҜJ*W&T ~A*WwäJF GÇK:WJ*W&T ~Y*WwÇK!W6*W6!W6:T=!WڇK:W!WO!T ~2W, K*W#"W6N*WDM$ :U C$%N*WDM$ >W͇S>W͇SHHC!W6MC!W6͜͜!Ws+q*W&$SQ ^#V"W:-QڋC:fWWRbW͊S+s#rF!iW55:W®D*W&$SQ  ~2W!W6:W!WګD!fW:iWYD!iW6*gW#"gW!W6!W6!W6:5Q!W7D*W&+SFQ  2W!FQ  ~:W!WH0D:W2W:W2W!W4C*W&+SFQ  S+s#rcD!fW:iW2iW*W͛ 2W…D4%ͧ>äD*W&+SFQ  WzS+s#r!W4±CF*W&$SQ  ~2W!W6:W!WF!fW:iWoE!iW6*gW#"gW!W6!W6!W6:5Q!WME{QOVLYDTAA QCRDATAF ;RDBLALV ͒S:WHғA!W6>JWR>fS:WHh=!JWVS+s#r!W45=!JWVS+s#r:WxA*W&)*&VWR"(V*W&$SQ  >0?*W&$SQ  ~>*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r0?*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W ?*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p *jW 6*W&+SFQ  *W&$SQ |S+s#r:fWZWR+s#r *jW s#r:fWjWR+!W6ÀK:W#K!W6 ÀK:W02W:W> !WHQK>!WLK:W2WQK!W6!W:WxK*W^*W&+S*W& sÀKF G!W4J!W6!W6:W:W/HK!W6:W *W&+S P *W& *W&W HK!W4éK:WK!W6K!W4ÒK:WL>:WWͧ T. T~ !W6!W6>!WN!W6#n& +S P  ~2W!W6:W:W/H N!W6>!WڞL'N *W&+S P *W& *W&W w!W4gL:W°L!W6L:WL:WA*W&W wL:W L:W0*W&W wL:WA *W&W w'N*W&1CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321TEMPORARY~ORDER~PAGE~DISPLAY~NO~COM~SUB~NOPAGE~NODISPLAY~ON~OFF  $(/9>_ogDM!>))덑o|g =o&og~y#q#p#w!!#*©6?”ëw”Î333333.;;33,;;#wʯ#6 O O $.:;=,/[]<>a{!_Î 4 4(!~> L5*~#"a_:f7ñ8 ʱ0vñ@7ñ҇0ÒGڐ7ñ7o:O& ʦ))))ÛzW{_f: CP/M 3 SAVE - Version 3.0$ Enter file (type RETURN to exit): $ Delete $ Beginning hex address $ Ending hex address $ $ ERROR: Bad close.$ ERROR: No directory spNͯ*#"!4͛!6:!R *? !6^ͯD  ͯ*#"!4 ͛L2M2N2O2P2,22:2:2:W ͛Ϳ!6*& ~:HW :1Oͯ*M! ^#V1Ϳ 4Ϳ 7Ϳ :Ϳ =Ϳ*& ~8 RͿM *& >@Oͯ:ͯ͛!4ø :Ҙ ͛ZͿ*M! ^#VrͿØ vͿØ ͿØ w : ͛Ϳ>!Ҷ !6: Ϳ :@Oͯ:ͯ: ͛Ϳ: Ϳ Ϳ:ification$Must be ON or OFF$Drive Search Path: $st$nd$rd$th$ Drive - $Default$Search Order - $COM$COM, SUB$SUB, COM$Temporary Drive - $Default$Console Page Mode - $On$Off$Program Name Display - $Off$On$Requires CP/M 3.0$11}0|H$ͿͲ9V !6*& ~ T!4>!6#6#6#6#6!"+~2*& "*& ~[”*#" â' :¢ V v!q*&!p+q*  !q:2!61!s+q:2!6ÀCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH251082654321!9"k1G \!m!w# š!v6H#6E#6X!e6C#6O#6M<<&:g.".g"?S:2n!`w #4o"c*e{ozg"hj:]@*c"\y!5C*^N{zb+"^*^*`*h"!j4&"h"y:b<5*kG!gwxS0  ace.$ ERROR: No disk space.$@$ $H I$I!$HI"$$"$ I ! A  !B B@@ $ABH$!"D$"B!`w #4o"c*e{ozg"hj:]@*c"\y!5C*^N{zb+"^*^*`*h"!j4&"h"y:b<5*kG!gwxS0  # ͛Ϳ: Ϳ# Ϳ͛!6!6!6!6>!V *& 6!4; !6:: H I>!Ҏ ͦ:› ͦ!6>! *& :=¿ ͦ!4  :=*& w!4[ !6>! :L*& ^O!4 :: Hұ!6!6I*M! ^#Vͦî!6:] ͦI:w ͦ:=_Pî!6!6#6:ʞ ͦ*~ ~ Hҿ *#"Þ *~( !6*#"I::H ͦ:ɀSAVE SAVE y<1!~ʋ;:* ͩ".~>2`*.h~`>26!*#~2#~2r+s-* *&"1!q!6*& ->*& :A:!4!r+s+p+q+p+q!6*~ʯ*~2*M2!6:¦:ڙé*M2Äùe:2#:22*~2!6*~2*~?*N! ** =2!3!6!6:!0:)!46*6#*:w:+s#r:i*#"n!6:2O* ~2*&*:ʿ!4*:w*&*:®*&*~2À*6*~2o:2!6*#~2!4N* :!6**cN,*cN{zҽ{,*c*e{ozg ~*c#"c> :[ >  X N*c>:> !:q#G*eDM*h ERROR: $DISK READ$LOAD ADDRESS LESS THAN 100$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $INVALID HEX DIGIT$CHECKSUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECÞCOPYRIGHT (C) 1980 DIGITAL RESEARCH RELIRLFATAL ERROR$l$l1 ͺ!"!6͓*~=:!ͣ !6:/::!ͣ !6:!!/ͣ < ͧv! s+p+q> ͍"̀ځ*>! q** DM* 1q>> ͍+s#r=>!r+s+q+q+p+q> ͍"!6> !*&*6!4¦:! *w* * * DM -* *s#r*" !6:2: :/H!0 ͦ: !҇ I::Hj ͦ:2:!҇ ͦ2:¢ :2ê :2:½ :2 :2*: : ͦ *#" : ͦ*~]~H!6 î!6!6:WI: W: R!6Wͦ*,*-î!6!6:¨I: ʨ: £!6èͦ2::2:2*îI::Hͦ1!~ʀ#_6|ʉ#6?#6 #6$\<8Y‰\>!|w\:V"8: V "**Ͳ\h}}€!*:2\<T}Q**#s#r>2:Ÿ*.h6 1>2::>2}2|2!"  !!\( yŽw=G::xAڎҎ !Hl!4N* ~2*M2;:2#+s#r*N2!š*#" ͯ ͯ!q!6*""2:(!6(*&*&!s*&!s::H*+":++s#r͛!6:!D*"*M!4&*M:[Ϳa2Ϳ:Al͛*M! ^#VIͿiͿ{ͿͿͿͿͿͿ Ϳ|͛!q!6:! *ORDS WRITTEN $CANNOT OPEN SOURCE FILE$DIRECTORY FULL$CANNOT CLOSE FILE$HEXCOM VERS: 3.00 $>!Ҏ ͦ:› ͦ!6>! *& :=¿ ͦ!4  :=*& w!4[ !6>! :L*& ^O!4 :: Hұ!6!6I*M! ^#Vͦî!6:] ͦI:w ͦ:=_Pî!6!6#6:ʞ ͦ*~ ~ Hҿ *#"Þ *~( !6*#"I::H ͦ:̀*":*. Tu -". u -2:~ l:\.~ -Ql.~ -dup. du -zT!"u*M: *M: !6>}!: :<2¨#u{u>!͘,T>͍)*DMTT"*%DMu{̀+s#r;'*DMu{̀N*"'ͅ>v":2T2u:ҙu͟!6>!ڙ: :<2:ҦT͟:!/Ҵ:͍ >>l͍ >!͘:/H*!*" !6)!\""!o)ͣ !6!6ʹͼi**& w:<2cͣ ʹ7*~-w!6*~)…!6:ғͣ !6*"*~)*:º!6***̈́:*:!6!6lͼͣ Þ!6*~>ʤ*#"}!6*:3ͣ *~=X!6*#"}:X!"}**Ҁ* *}s#r*>wÑ**}̈́ͼҡͣ ʹ*~]*~D!6*~I!6*~M!6*~P!6ͣ ʹè) >>l!C9 < ,*3&+) ^#V*3M  ,!iq*# :iw*#"!͛o #*DMu{!"*!*"D*!s*D!s*D!s!6*!*"D*!s*D!s*D!s!6*M: *M: *M: O`iN928 "92;!j6:;!jU :j=O!< Hq!j40 *8M*9 !k6:;!kڇ :k=O!< N,!k4g  ,!lq*' :lw*#"!͛ '*DMT{*!*"!"!ns+q: ͪ :n!O> !>O:n2nogDM!>))덑o|g = DM!>))4 =,_{ozg~ D^#V) N~ U^#V|g}o `_{ozgO{ozgi`N#Fogo&og_{_z#WLIB 1.1 $REL $$$IRL $$$INDEX ERROR$NO MODULE: $SYNTAX E'*DMT{T:lͪ : >>l?: &#*DMu{:2:2u͉Tp*>@O>*>@*w*~!s+q*&%*& *&%*2& "*DMT*+"*DM3T"!p+q!\#s>!s:+&:2̀&ͣ :22ͧ!s+q+q*M*͍"̀̀Hm*DM̀%*& "!6|*#:w*##:w* :w!6!6\2!:!H÷:!!6l+6**͍!6\!q!6!6*"ʹ!""!o8ͣ >͍J!"ͼҍ*~(c͆Ç*~_[],()!q: > :a/>z!/H:_2:!p+q*^#V"*##^#V"!6 !6+6:W: Q!6l<*6+: m+_Ax!!6Aڙ:ڐ!l+}::*~:Hھ!*#~A<*wO>!*&*6 '!6:.+A: PATCH VERSION3.0 PATCH.COM COPYRIGHT 1982, DIGITAL RESEARCH151282654321:o2! *m" -< |#}0#:] <>2   : : :3! ]~. a{ ##e~ a{ ##~ 2m#~2n*m" : aB{B @2\! :\Ҥ!e~ #Z!CO"e>M2g>2 zÖ: *e}C|O:gM>2 *e}P|R:gL>2 \2 |: @: ,?<2 L*>2 ó!>2 O!mT!w& 8 !w:o2% & *M͍ !6!6:n!2oK :m!o>O!mC!pq*pM !rp+q*q}OY *q|OY *8M *9DMg *;M !s6:;!sھ :s=O!< NY !s4ž !t6:;!t :t=O!< N: !t4 : 2u: :* *uMi  ,*3&+) N#F+q#p!C6:? *uMY !vq "w:R:ҕ *vM*w *3&+) N#F+q#p*3&+) >>l2C:Ҵ *vM *wDMg !yq:y/:yH >!y# :y::RROR$APDCentry symbol $select common block $program name $request $error 4 $define common size $chain external $define entry point $error 8 $external + offset $define data size $set program counter $chain address $define program size $end program $end file$FTiw(5ABORTED$DISK READ ERROR$DISK WRITE ERROR$CANNOT CLOSE$DIRECTORY FULL$NO FILE: $* ^#V""!3"$"!o2ͣ :< J.< -B3!6#6!6*#s#r!6\wl!6!6!6\ʒÇ.  -›!&6:!&:&=O! N,:&<2&©**pH*#N*##* ^N0Jͭ1 Gͤͣ  <_1D**M*0G!'q:w**M0*"!6}!6:'҄Çͭ1Ҙ**͇H* >͘ҿ:'/**M*0} <_1K!6!l+: !*&*\:<2O* N2!6> !i*& :b>!4F>:<2O* :w:!4~ʶ 6*#"*{zڶ!"ͧ*!~2xG:2G:p ˆx!4~ 6*#"*{z!"*!~2xG:2G x{_ C#5>ɯ$!p+q!6> !ڌ*&*~ x*&*N,:….,!4Q!r+s+p+q*DMG*DMFEͣ !s+p+q+p+q+p+qWͣ !">͍+s#r!oM*DM`:$*D6 =++w: #<: +=6 ?>!6 #=D!~a_{_ w#Q: Ƃ2 * 6 : ʝʯ>2 '0: =„>2 '0:S ʂ>2 '0: =±! 3 #:! ]* } 1]:]>2 >2 A: N* | :02# }0 _'_:# 2$ !]}02$ * " * " ? <͍ <ͭ* |́* }́* |́* }́2 >:" '2" {2 z2 : 2 ܻ: WÈ* |}* |}: _:$ d:$ G* |}* |}2 :::y8*;< -*:;2:@:<!C6*y&>) N#FG>!ykb :y/:yH҅V :y ¦:823*3&+) *9s#r:y!"+"-"/"1!36<::y<@ Gb :!:y<b :I:y/ *yM :y#~ >!y/͐ :yI:I 7:[:y[Ϳ o >á2zO>Ҏ*zM@:zá2z*zM͵:z,=>)-,),>,=*#"!|p+q*{~**{ >*{#"{>ʹ*~>~,H#6#6:  . - 12(:( T}L :2:2!:y :2̀y ͣ :22!""*"!6!6: *")*"*K: *: !6#6l: *)"ï !6l+6!6͔ :  G. - !"!\"!"*^#V" $!^q> !^] :^0O,h :^ AO,!_q:_OD :_OD !ap+q>`Mi !`\Mi !cp+q*bDMG!ep+q!d\+J<!hr+s+q*f&4 N,*gDM͵ DM̈́  ,*3&+M͐O>!>͍ ͣ !9*DM͠O>9ͣ *"*#"`!r+s+p+q+p+q***DMͮ*!r+s+p+q+p+q***DMͮ!p+q*DMp!6 > !*&*6!4²*DMͰͣ !p+q * 6 * 6*DM̀*͍!p+q*DM+ͣ !q*& , ,!p+q*  !p+q*!p+q*!p+q*! p+q*! p+q* ! p+q* !p+q`*!p+q*_{ozg_ {2 x < <͍ C?C C >2% % :' YPyPtz\ V xw <͍ <:$ ڶҏکÜ:$ 2) >:$ 2) >:$ 2) >:$ =2) >2* ! :* O "+ !9 :) O F*+ ~w x <͍: > > 2}!"~"\ʽtS \ _" 2 ~ B* : #=I" 2 ^C* : #=b<* }B* | B!]>I.C!e>I<:\̹@B:C<: 0B C:" 2( :" 00B:( 0B C: 9!0*L-#"L-!0A !/*!/>X!/>Xt!D,KLG!.,>y:O/!N/f:N/2O/2N/!/>X!.,!,@!D,KL(,tî!N/4!,/>c!0!0!0n !N-~#!0̓ ã!0ͬ!D,/,>c!0~U!9"0:#Z!#6!#"/r*/>$Gt!##>Gt!#0,>Gt!#6!#6!#"0!0T!F-6!"#!D,6!06:0}͐3>!D,ͧd*0!F-6!#6*##"#*# |.!"0}20!0>!#*0"0!0U!#"0!0+!#*06*0 "0!04í!"#:+3:,31!Q3:-3ogͯ3>Gt*+3O"+3M!Q3:-3ogͯ3>Gt!3A !/3*!/3>S!L3:-3ogͯ>t*%3*)3))^#V")3ø͟!.34*3~!.3!t:-3ogͯ}!;3w!;3~w*93:;3=_L3t*93!3>_!3^#V"<:F4!F46*<KLG!H<>y+!E46ð!E46!4"$Gt!'4I<>Gt!*46!>46z"!4*<@*<"r2<:E4:<>2<>2<*Ó*1~og |c !1>ߦw !1~?t !16_ !1~@‚ !16`Y2 ~# ˆ *_2^#V"e2*c2^#V"g2!"2*[2^#V"2*2*2W *]2*2ͯ"2!2 :2 *e2*2)))~# *g2^#V#*e2*2)))s#rc *e2*2)))^#V"2*g2*2))~#K *g2*2))^#V"2% *g2^#V#*g2*2))s#r*g2^#V#r+s*a2^#V*g2^#VW !i272>!c!2ͷ~*2+|´ *Y2^#VO"2þ *Y2^#V"2*2*g2++*g2^#V))s#r*g2*g2^#V))w#w*2#"2ô 2~# :<!e>b  9O9$9p<!>b9f<:] ͍ͣ9<!m>I#   <9ͣ< <9͍9<:\@B:C|zʒt< <1Q ̓ͮUtͳr CP/M 3 PATCH - Version 3.0$ ERROR: $PATCH requires CP/M 3$Invalid file type: .$Serial number mismatch$No file: $False password: $Invalid patch number: $Drive $ is R/O$ on $Illegal drive: $ Enter File: $ Enter Password: $ Do you want to indicate that pat+.!+6:# :# :#.~!#*#~20:0 20:0Q~:0Þ:K-z"/!0Ur"/*/ 3,>Gt!0#!D,6,> c!0ͷ~Ͳ"0~# ¦*0^#V"0*0^#V"0͕!1"1!216>261251:!12:1::1!51!!1:51og~271:21!216{:71!61281*0:61o:81OLG!1>c:81og>og}281*0:81ogW"0*0:81og####"0*0*0W*00>c*0";1!;1ͷ~>291!1n&}2=1:=1!91*1:91og"1*1~og |*1>ߦw*1~?*16_*1~@*16`!914å:Gt!^<<xy;!<8!<5!<͛#E!<͛!<5:22%^}2<:!4*<@*<"!4*<@*<"2<*t!<͆!<4!<͆ *26*2LG!X2>yC *2"3*3#~>!3w:3og2~C :2 !26*e2^#V#"3!3"323!3> *3++| !"3Ñ *3>og"3*3:3og)2s#r!34d !" 3*e2^#V" 323*2"3!3"3* 3* 3W_!34:3og)2^#V" 3*e2*3)))^#V"3*2*3j/*3+" 3* 3* 3"3!36\*3*2jY*3#" 3* 3* 3W"3!36\Û :3o* 3"3u* 3"3*e2*3)))^#V"3*2*3jʛ*26*3*2s#r3 ~# ±*3^#V"#3*!3^#V"%3! ÷>2.3*3~ʟ*34*3~og"3!3A !/3*ch $ Valid file types: COM or PRL$ Valid patch numbers: 1-32$ Current patches for $ WARNING: Patches greater than $ exist for $ has been installed$ already exists for $ Patch $None$ for $ Patch installed$ Patch not installed$ $ $: $ COMPRL151282 @!p+q*! p+q*! p+q* ! p+q* !p+q`*!p+q*_{ozg_*0++*0)"1*11>_*0^#V"31*0^#V#r+s*1*0*0^#V)))s#r*0:61_L*0*0^#V)))>t*0*0^#V)))w#w!31#`*0*31)))^#V1j`*0*0^#V)))"1*1!1>Gt*0*31)))"1*1*1>Gt*31+"31*0*31)))^#V1j!31#T*1"1*0*31)))"1*1*1>Gt*31+"31*11>Gt:71%^}2C1:C1!A1$ *0:A1_LG!>1>t!0>1xy!0>1xy !B14:A1!!1:B1o^#V^#V  $ "/  Later CP/M or MP/M Version Required$*#=**#={ozgY|g}o!\!l!ÍÝ3>Ý!*3>K* !*   >    !"#$%(^#V^#Vi!v"/!Q/+>c!K-6*/K>XG!+>yC!Q/+>c!+Q/>r–!}o|g}ʖ!#"/!/–!/ʖ!/+>c!/ͷ~g"B,U"G-!,,> c!o0ͷX:F-!,,> c!q0ͷ~*G-w#w:F-X!s0͡!F-6*G-*G-^#V#)))"I-*B,*G-^#V))W+"B,*B,>og"@,:F-f!,,> c!y0ͷ~!{0!+Q/>r2K-*I-w#w2P/>2O/2N/!/(,>t!"N-:F-X!D,LG!),>y :#!#6!Q/D,>_:O/!N/:N/2O/2N/!P/4!}0!/3>XG!3>y.!/3>X3t!/3>XG!3>y[!/3>X3t*3!3>}23:3ʐ!/3>S*3:3<_Lt*3"3!3ö*33>_*3"3!3!;3"93!3*3>!t!<3"53!L33>Gt!Q33>Gt!"'32.3*'3*#3^#VW*'3#"'3*#3*'3)))^#V!<3>p!")3*)3 |*53+*)3"73*73~ ]Æ*73~_n*736?|*73~`|*736@*)3#")38*#3*'3)))!M3>Gt*#3*'3)))^#V")32-3!)3~#ʖ:-3 ͟!<33>t!M33>t2-3!-34*%3++*)3))^#V"凟gw!0>1xy :B12!1!A14ì*00>c*0"D1!D1ͷ~^#V"F1*F1^#V> ͍!H1 *!H1> XÓ1~# s !9"2!1"1!16*1w#w*1ng | *1KLG!1>yº !1**1~ogQ1~og)1^#V*1^#V#r+sH !11>c !1*>22*1~ogQ1~Y !11xyK !24H :2K !1!1> !1* *1*1^#Vͯ1>_ *1~ogQ1~ !1*{ !1*!11xy !1*é !1**1~ogQ1~ !1* *2:1F3O3*# 72gl*<"?'w#-!9~sG~#s4! 9~.Y+60e0e6 #M+r>o&9y>o&90w+Š6./G! >0 >-3T])) 0# +333>: >?I!oͤͤ>=I^#V|A}8.))ä#F>A> #\~ >.~ =M^#V# File: Traceback: ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!]#~8  " Condition Stack Overflow$4Ox!< w#s#r#s#r!9!^# s#r!]#N!< +++++q #{Š #zʏ ++~q ++!]#5!~# ž Ú !]#N!< +++++¹ #~# +{ #z ++~ù #^#V=!L#~9!5:L#_!M#^  FG1"z*QS cE5T @iO>`G>0 <  DM0 > Ew#E~#X~#W #Ý!9Oo>gy~#o>gxGGtwF#"WObk++~+ y~#/w!/x"yʞ" >O6# x" h"=ɯ ~#fo++"!=~#"*!="²""""  Insufficient Memory$ Invalid I/O List E///,,D,B,G-,Q/D,D,L-,D,D,N-P-L-N-P-G-@,I-P/O/Q/G-I-D,000//D,symbol table overflow ' invalid SYM file format ) )  ) z|ODM|O)Ox>~!>)< D=M)6ɯo>g{ozg!dÄlmnpr Conversion2!Ä*%=|^#V"%=###^#V#N#Fxʿ #~ò*%=|^#V#N#F!9yx"%=:L# !9!#{z#  !!9:]#O!^# {#z!]#5#}OD*#=~r##~#fo9!NÄVWXZ\ Free Space Exhausted##^#V#{_zW;{_zW>4z˜{##^#V# ##s#rs#r#s#r+++~sw#r####}*#=}|5*{z5+F+N+V+5^{;{z;}|;{nd of Execution$#dd(Copyright (c) 1980 Digital Research V1.3MXList SYM { *$'symbol table reference overflow 22i2i`~sw#r##q#p i`N#F#^#V~;q4#p+i`##s#rA"]" FREE Request Out-of-Range$ Free Space Overwrite$GKҜMbkÜiFhNhN#Fh^#V"#y2#xүi&ͩ x>!J#{#z*#*# xyxM_!^#VͤG>(Iỳ>)I|*<|6<ͤͶò">,IG> _O! O! O!0:IIWWG|e}e ڐdԒ ͒ڝÔxWN #~Iæ!wͤ*=!9{_z{ G>#I*=>=^#V#qd$PlPRINTER busy XREF 1.3 no SYM file no PRN file CP/M PRNXRFABORTED. V́ + 1@+>O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB ANA XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= SUBäìYJ~Í5"*"!"!""2222!" "c"v""!1t!++"t">28!"9  ͤL:8>.^+~+:8*>:|}^ >.*f}o|/+- , 0 Ô^#V#*NyҔ** n +ñ q#^#V""~/o>g++Û!.ʔ@͔^#V= ͔^'D! ڔ'?!q'”S_&#hqf0 Ҕ)DM)) O I^*r^#V#^q̀))))oqh"s#r#!4-®+»*+ þ-y_xWþ!IXN!p~ yÙCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282CP/M 3 SID - Version 3.0$1 !~=W!x ~#ôbx {~#o}o.ÃO$ y͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷͥ͝”þ \̀\̀ GтWx!͓B :>ULT͆!6\~# S 2|:] !7<ʔ\ !t   _*\ ʣ \ w Ø *+\ !ڔw{Ҕè *#^#Vr+s+6͓Ҕ*"s#s#rt ! *v*",!*L*L*vL*+L,o=”͍L:X^#VL\~J ʯ.y:,>."Ž! ;w#́=”͍:ʨs#r#;”}w#:;#;>>2o!"#͍}ʔ==”͍""2mNl :lXRF.XRF make error  '.XRF close error .XRF write error <<<_<<b#J ,!6-X5AڔҔ_!o^#V - G  + Q  1ͳҔ~½:,=”͍" ,~ڔʔ͍=͍=͍!,o͍ "c=͍=”)*c)!"f,*f*c"h ,*cL>::ʗ^#V#L cxZy y~ #*f ڵ™y ¶"c:,*hT*f , ,T:e,>!D_^!x^#Vx1>-~~>=G!q~L!9#x sYYͳғ*v" !6û+"f*v~#cڻʷ^#Vû~*v~Gx5@xv5 x805 x6 45>=*t~*t$5x*l$*n:585"CZMEIABDHSP!"2"t+"v!91t*v~:t2l!~ʐ#^#V#~ ƒ!~6ʳ=G#^#V#~xâ#"v!N#FN*>7l :|!~9#~#V*v9z9~= y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# ʔ!\>2|!"*"~:8”*"*"*͠ڔ!"\zn<ʔ*ͯ~# _\V”*#"͠:W\J!*L!,:2:2>2::>2 N, !9# Ô ”J~,=”͍xA|”}ҔgA>;Ag};,;Q|”}!qw,s#r,:[|_!~ʐ![4Ð\ͤŽ2[g>>?,!e>Cw#>Ow#>Mw!u>Sw#>Yw#>Mw., * ͽw#  ͽ  * ?r# {z*=ҏکÜ:$ 2) >:$ 2) >:$ 2) >:$ =2) >2* ! :* O "+ !9 :) O F*+ ~w x <͍: > > 2}!"~"\ʽtS \ _" 2 ~ B* : #=I" 2 ^C* : #=b<* }B* | B!]>I.C!e>I<:\̹@B:C<: 0B C:" 2( :" 00B:( 0B C: 92e,:ʔ%:e  ͟:u ' ͮ!I Y|”,,}5 2l~2m͍͍"n͍"pDMs !l6ʏ } "v=ʏ =ʏ YP !~ #^#V:l *v{ z "r~62t #w6 ” 1l*v*t!~4 #~#F# x ~#s#r#w>~ʽ ͍=; =”͍Lᯕo>gL,>#!u^#V#0}o|ge X x| y0ʃ GÏ yÏ  G| Q z,{ ,<,>'{>',*##V+^+N+y,L ~+ , :”%,ͳ=2wͲ:l <!*vNl  |Ͳd=Xl *v5Nl :l|*pMD*n:m7l !"N2>**vͳҟ" *t"c, PASS !~*+"|w=2~ !~##Z:t*rw2t*vF#!s! ^#V&N&N,`r<¦Gæ::^#V#2*r^#V<[>èæxjê8_æ*t2¦,:?*v###æG>è><7*|!N*v!>#> :!>=_~/w/wz8O!B N#N ¾SP.* |} !9":q!"2!""!Ow #w 0q!\6 ͤ!"~”͍͍͍!6W6!6# ,œ>2ß͓ͣ ͓ͣ ͓ͣ ”ʔ   :@w# G6#. 6# x!a_!~> 55*~#"ů2[\ͤͤͤͤͤͤ!ex#y#*}|͓"*}|":!͓> _ͤ~# 07> >~ ͍" = ͍"=”" > 2,Y,!|G }G , w#. ~ڔ ͍!=:r ”͍| !| !|”"!~ʩ #~#V§ z§ :w, ‰ :ʔ!~ :w#s#r, ¾ Ô!~ : 6 ~#^#V ,:ʔ!\6#>  w# ' >w# 1 6~!I =”*"!l6~# T :]?2 7ʔ!">HXE͆*ʾ \ͤ2 w# ™ ͥ͝* ҆ !""Ô\ʔ:¾ W$ _$ $ O { x! i`"v2 $ $ w# $ {G=YP"*##F+N+~a/o>g{\z\<33=>!y$ڇ *y$&>'d !y$4d SYMBOLS NEXT MSZE PC END 6!z$q!h#6?! h record(s) written. h#H!:#A{$O !:h# !2h#!@ !:h#S:h#QHP!:#<2|$2h#:h# HG!)!2h#Ô!2h#02|$O> j!!|$6Ô!2h#02w$O> @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$:ø!4 ø*6 *:w:+s#ri :S*#"X!6:2O* ~2*&*:9ʩ!4*:w*&*:˜*&*~2j*6*~2Y:2!6*#~2!4N* :!6*&*:!6!4N* ~2*&*~2*M2:> !HV !4N* ~2*M2% :2#+s#r*N2!E„ *#"i   !s+q+p+q:=2ʺ *:w*#"Ý !q!6*""͐2:( !6(*&*&!s*&!5< W@w.tEy!h g ={  ͩ* . +6.w   *ͩ2*.6#6*.~w#~=~# Ʌo$x(\!54  !F6ȷx(\>^\@_: N#x€ʹ> ʹ ʹŸ*.>wm#wM~xµmp> \ 8>""SYSIN SUB UX:~NOT~ECHO~FILTERED~SYSTEM~PROGRAM #).6=GNRW\`enu|[]=, ./;Error at the '^': $Error at end of line: $Invalid option or modifier$End of line expected$Invalid file specification$Invalid command$Invalid delimiter$File not found$Enter Password: $file: $SUBMIT of $GET from $ stopped$console$GET from $ stopped$console$Requires CP/M 3.0$CP/M 3 GET Version 3.0 $Get console input from a file $Enter file: $11N}0N|HG+\Yr'2ͅ !6 *&::!6!6$ͻ ͅ !p+q*~ ~ HR*#"1*~^>>!`i^#V#~#fo͟]ƒywôG:±xAa{Ҙ_ ʫ ʫß`i~#~2#~2#~2*| \!\~! x 2 *&l :w:  : Ò : : Ò :=2O!l 6 ë :hhhhhhhhhhhhhh 151282 COPYR '82 DRI gggggggggggggggggggggggggggggg"D! BH!!$@ !HA@  H!@  @BP!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$ 6+!6:!D*& NZ *& w!4!":2"ͱ!6*& ~ w!4a!"+~2*& "!6!6%*: : H:HI%*:%*:%*:!6*DMͱF: : H:HÀ Fͻ : T :: H: Hғ: †̀ Ó%*:¨%*:½%*:*DMͱ:: H: H̀ ͻ v!#V".~w ͙<<^#V#*~~*.~S>2.n~`>26!.t~:s}>26!N#F#*"^q#Vp"N#F##"^q#Vp"4!7 !6ë7 \\m>_ 1:~# yɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $""SYSIN SUB_og_ogDM!>))덑o|g =_@@$"$"@  D@@"DH $I!"DH$BB$"H@ $!D$$I$I$$"A$$I  D UUTH@@!@H@ !$   !4¢ W2!p+q*~A *~@O:!6> !ڄ : \ .*&*~ } *&*>O!4F ">ʰ *++"~Ұ "lp̀\`"̀*} *|2 : ͆ ͅ lp\`" *"ͻ ͐0 ͅ \ ͯ!p+q!6+6>!W *M[ :O[ !47 :!q*&*>*& z !6: ʍ ͻ "> "*DM) ҽ  *DM ͅ Í #: ͻ "q*&!p+q* !s+p+q*:w#6* *#"N#Fy  !p+q*!p+q*!q*&-!q:2!61!s+q:2!6*&"1m!p+q*m!p+q*<!q!6*&: >*&: :":!4!r+s+p+q+p+q: Di !6ͯ*~ʙ*~2*M2!6::ڃÓ*M2nãͯO:2 :22*~2!6*~2ͯ*~)*N! ** =2!!6!6:!og_{ozgi`N#Fogo&og~FGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!F#fh!:~!«!>w~:!5*.~w:; :~!9"1W:.~ !GET 1âCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321SYSIN $$$Getting console input from $INPUT~FROM~FILE~STATUS~CONDITIONAL~FALSE~TRUE~CONSOLE~CONIN:~AUXILIARY~AUXIN:~END~CON:~A>7*DM) 7"+*DM 6ͅ ">[?p͐0hͅ *DM !q"!+s#r:ʨ:=+s#r*DM!p+q*"!\"b"ͻ >ͅ *#"*~[ͻ :: H'%*:„:?ͻ %*:\yÁ:lyÁ:|yÁͻ $!6:£!6%*::Һ!6ÿ!6$::!6!6$::!6!6$ *w#:wog)))))og^|n !w55r !w5*y+"y*w+"w:w *w | *w#*w^|± *w#"y!yͨ!yͨ*w*w<"w:w=2w:w !w4Ó ^#V"y>2y:zw2y:yog:yog< *~w:yog`;~c *~w:yog`;~*w*y~og))))) >2y:yog | *w*y~og))))):yog*~w:yog`;:yogx͛:ʳ !y4W *~w:yog`;6c*zw+"zw:y!y4 >I*xw"w!yL! V" {*7C^#V* {^#V<&!S͊=* {^#V͍6!Pw>l779`^#V""{!${"&{!"${*"{~*&{w*${ruq!U͊=Û͇!({;!GG({x͛:ʙ>ɯB^#V^͞#V ͪͪ"  Later CP/M or MP/M Version Required$*}**}{ozg|g}o!\!l!*:3>:͞!L*3>͞K* !*ͤ͞ ͤ  >  ͤͤͤͤͤͤͤͤͤ͞<"w*7C^#V*w<*w<"w*w>og;#"w*w*w*w>og^<"w*7C^#V*w<!xE><0;!x*w>og;#"w*w*w*w>og^<"w*w*w^+++*w>og^}2w!Hg"w*w"w!HW"w*w*w<*!xͨ*w*w<"w*w+"w*w+*7C^#V<|z*w"w*w"xw!xD:w2w!x͂ :ww!xD!x͂ aÀ!xͨ!|w# À}!"w*7C^#V*w<|!xD*w"x2x:w2x:xog:xog*w#"w:Vzog*w<|!mz͜:Wzog*w<|!qz͜!*w+"w:Rz!uz!yzÙ}z~# %*w*z~og)))))*}z^#V*z~og)))))> GA;*w#"w*z4*z~og*w<|˜*z~og#>og^}*zwz~# ¡*z"z!zͨ*w*w"w*z6*w#"w%z~# *z~2z:w2z:zog:zog<\**w#"w*w"w:yog#"w*xw*w< :y<2y:w2y:yog:yog*w+"ͲͲͤͲͲ Ͳ͞ Ͳͤ!Ͳͤ"Ͳͤ#Ͳͤ$ͻͤ%ͻͤ(ͤ1^#V#^#V́"> ́"> > ́">́{2> ́"́">́"> 2!2`iPY*}~##~#fo##^#V#{_z/!T]W{_z<KB ^#V^#V)F<*}!9{ozg| #~wþ)~!F7:F!xp*w :xog)))))>w!F6*w:xog)))))~!Fe!HG:xog)))))6*w#"w!x4!xͨÚ!w6!"w"w"zw"|w!w6*w`~!F­!w6*7C^#V*w<2x:w2x:xog:xogog;#"w z^#V:zog)))))6>2z:zog |U*z^#V:zog))))):zog6!z4!z4*w+"w*z~og+"w*z"z*z"z!z͜2z:w2z:zog:zog<*z^#V:zog)))))6>2z:zog |*z^#V:zog))))):zog6!z4ý!z4Ë*w*w<$*z"z!zͨ*w*w"wA!z͵"Hw͖!z͛"twåz~# I*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!zͤʤ!G͊= z~# ­*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!z!zͩÃ"zw"|z !aF6c#6FCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321A͑"w*w}1ҫ!wE><0;!w!w6!w6!w"'x!%xy2w:w!)x"w*w~2w*w~og |2w:w !+x!/x!F:w_>͉:G!w>A;2wRf%!DB$![D>6;!!D;!!w>;!!-E> ;!@%*}!w;@!7Ewx͛:!8Ewx͛:"w*w:wog<,;!3x!rx*7C~og#))+"w*w#"w!HG"w*y4nS^#V"y*7C~og*w *y~og)))))~og<*y"y!y 2y:y:wog#>og^"w*w<:wog"w*~w:yog`;*w*w)))))*w `;>GA;*~w:yog`;~*w+*w)))))*w `;w!w6P^#V"yR;%!-DB$!E>;!*y;!!E>;!@RL%>B'@(^#V"yR%>B'*y;%!-E> ;%@%*!w;@!7Ewx͛:!8Ewx͛:>m2y:w2y:yog:yogog^|*w:))o |O#"9C[4BZ!9SJ~#$:> $J&9}x2LCy j2MC"){AE$:RC+-/x2LCy2MC"){Aͯ:LC!MCP& G7!9~#$&*){7<$2;C2PC2SC<2KC!9 V+iv-v>2PC#ҏ… ʉ ,v.¦#Ҧ,×eʰE+-# GA;*w *x~og)))))~*~w*zw`;w*w*x~og)))))*~w*zw`;>GA; *|w#"|w "x*x | !x/F><,;!x!8yC"~w*x)>og;"vw :w R9 %>B'!E>;%@!<,;!:ySx !w6!w6!{yD><,0;!yySu !w6{ ͔( ^#V"y*y^#V"y:y *w*y)))))~2w*w*y)))))*w:wog)))))> GA;:w!F :w *w:wog)))))6 :w ![͊=m^#V"z!z*zr::z52z9!z5!z͛"tw!z͵"Hw*Hw|f!zF><0;!z*Hw^#V"Jw*Hw ^#V"7C*7C^#V*7C~og#;͍6!Lw>͓7*7C###"{!{A#͍6!Pw>͓7!Tw"z*7C ~gj"z*7C~!z W#:>2z:zog |l*z++:zog)w#w*z!zF:|e*7C^#V |H:z=*z+:zogwe:zog+*z++:zog)s#r!z4×^#V"{*{>l7!Lw>l785"{!{^#V"{*{>l7>5!Lw>l78>55*7C ^#V^#V"{*{>l7>5!Pw>l78>55>^#wbj"w!txDͺ(xx~# RE%!E>;%!F>;%@Ra%>B'!F>;%@*xx~2|x!F"w*w+:|xog!Gx͛:*w+:|xog*wx͛:R%!(DB$*w+:|xog>;!@!|x4nR%>B'@÷}x~# R%>B'!G> ;%@@%*=*w+*}x~og;@*w+*}x~og>;!9E>;!SE>;ͥ*w+*}x~og;*w+*}x~og#G>GA;*w+*}x~ogF>k}*xwÑ ̀*zw"w*w+"w*w+"w:w*w"w:w2w*w*w*w>og^yog)))))6+:F*w:yog)))))w>2y:yog |e*w:yog))))):yog6!y40!y4^#V"y!F6*w*y~og)))))"y!z"y>2z:zog |*y+:zog~g.*w *y~og)))))~g.`|!z:zogw!z4á*yGx͛:R-%>B'!G> ;%@RI%>B'!2G>;%@c%*`! z;@! z>;!9E>;!SE>;ͥ! z;>2z>2z:zog |! z:z_>͉:*y+:zog>͛:!zF><0;!z!z5!z4Ò!"w"w"w2Rz2Vz2:KC,y2OC ~#z0 0!SC_w!KC~I4_!;Cs<<2NCG:OC<2KC=<:;C<ͯ‡:;Cʇ!OC5!RC4<:MCG:LCʕ!PCP>2QC$!LC5¡:MC!OC<_!;C>w w>+!NC~5>. G:QCx0:NC> !PC~ 5!NC4!KC5-2QCx!KC^4{# # !;C~0>0"+{*9C~2/{:PCA Ϳ"A <:/{20{>Vͬ"!0{S 5~/o :SC‰ >9ͬ"ʉ >*ͬ"w  y *:0{!9q#=€ Ï">21{<22{23{ 2.{:2{_:/{"*9C~2-{:-{9 :1{ :1{21{͟" :3{=O:1{##:3{O:.{#͖"Õ Z *A!O:1{!y =.:;<>[]y *"3, -(-,$-,1J- o&))))\xH  g-#w g--"-*(3#ʖ-AҖ-G-,:ʛ- 6à-p4-+4--#,-#*½-6?-w-¬-,---#6 -..- 4-.,.#*-6?.w--,.-.#6 .%#6.*(3##^ ~?1.# *.xCON CON RDR PUN LST M!L. ~"-$.-,1ҕ.\|.l.$.!~ .-!9.,°. ʾ.-#Ý.x=GÚ.->ɯ*(3+.^#V.#{#z.6#6. r+s!}F#~~#//); ;=;);ɯo>g{ozg!<Ú=<<GO~9O9~q+d5!96#=w5O!9Fx7yҮ5! 9~WwzO+›55_ /!9~#=557"n}>6*n}"p}56*p}"p}56*p}G!9!xb6 ]6+/6$%21{:1{)!:.{0)!:3{O:-{*#!> #;!:1{21{:3{O:.{#͖"Õ :-{͟"!:-{"†!:-{"o!:3{O:-{##͖"Û :-{21{:3{O> #͖"Û :1{!:.{0¢!:3{O> #!:3{=O:-{##:3{O:.{#:1{21{!:3{O:.{#͖"Õ :-{V":1{":1{21{͟"":3{=O:1{##:1{ "<21{͚"Û :3{O:-{"H":1{3":-{B="?":1{*?"> #͖"Û :3{O:-{CV"D:PCi"> # #Æ":-{C}"# >R#Æ"# >B#͖"͖"Û :0{*+{!3{4!2{4S+-$G:/{Ox*9C## ¶"<>Sͬ">+ͬ">-ͬ">Cͬ">Dͬ":/,.B!2{N*9C# Ⱦ"G:2{*/!}6P  eA eA!}^r+s6 #6 !}4^N*(3|Z/}=G/.V/R.R/O>~f/f/>ͨ/N*(3|’/YR.=/y‹/eAÎ/>~ʞ/=ʞ/>ͨ/q2-3*(3/"*3./{..**3*(3#:-3O/.#s#r/../.è/.r+s{0!'34**3+>|0+}o͵,Ϳ,~2&3Ϳ,""3,:&3.1[.a0G:&3.1*$3p[04#63,:&3|00*3++"3Å0}+ʉ00}|23"3,0"31F<|.1##"(36*$3s#rv-š2{ ʚ2*(3:&3w060*3"3<1:&3š20<ʚ2!Q={zQ=}|Q={+=+=i`~sw#r##q#p i`N#F#^#V~Q=q4#p+i`##s#rW=Bs=B FREE Request Out-of-Range$ Free Space Overwrite$GKҲ=Mbkò=?F~?N~?N#F~?^#V"Cy2Cx=i&Ϳ@==x=>=!C{#z*aC*cC@xyx >c>_!?^#Vͺ>]>>(_>y͖>>)_>|@>R>'?|L>R>ͺ>>B>,_>]>> _eA eA eA0:_>_>m>m>]>|{>}{> ڦ>dԨ> ͨ>ڳ>ê>xm>N #~_>ü>!?ͺ>*}!9{_z>{> ?>]>>#_>*}>*|*| r:*| nb5)*| !|>=;O)!|>;*|:!|;*|~#{)*|^#V)))|{)*|6P#6*|~#µ)*|^#V))|)*|6#6õ)*|6<#6*|6#6*|6#6*|6#6*| 6*|^#V}4}2|*|^#V} *!|44*|^#V}"*>2|*|^#V}M**|~#M**|6#6*|"|*|"|*|"|!|(0*|^#V|Š**|"|!"|!|͚=^#V^#VOA:Cڨ*!*͚=2CO!C·*6ü* +~#w!C s#r!C4A**C** I/O Stack Overflow!9"|!|*+!?'w#6-!9~R7&7~#R77! 9~.87+60D70D76 #,7+r>o&9y>o&90w+i76.7w#Ì7 O~#¢7Gxڵ77 9> 79#7!9!97>?'w#7!9͛8! 9͛89! y@88!9o>g~18Gx8f848!9!w# L898!9!9!'#s8!9^{w{W#‡8~W8~+¶8ê87>?'w# þ88!9~#88!99#8>_:/{O x*9C# Ⱦ#!i#9w$G:PC8#x+-L#SF#x+L#-SI#>+>-> F$ h#x=b#G#O# #:kCx#ډ#!ZCxO#ډ#$O#'O# £#O#> $Õ# µ#x¯#>$O# ##O#x#>O#='#$x!XC#$#:iC#$:XC> $#>29{!7{K':iC+$!XC+$> 3$> 3$3$26{!4{'!:{Ú=ê$$^$^#Vʃ$a$ͪ$F$#F|$#N|$#^#r+s#^#V++r+s~F$5F$$5^$q#pF$O$4~ $_$s#r#s#r#q!$Ú=$$C$$ Format Overflow*C-&C![{"3*(3(3w# 1*(3~#3*(3 B>3*$3w#w3͵,,34/Ϳ,q3͵,,3Ϳ,Nm/3*(3~" 4#4#4͵,,3~Œ11K43.>13͵,,3~.>13*(3~ʹ1>31P43*(3!*~!/2,3*(3|1(^#V,,{z1z]22'3z(2:,324/q#2Nm/#2*(3|]2*~]2=!'3Z2:,3ͨ/W2S2w:2^1>͵,,3|}3~> 3<3͵,,3|”2*$3w=3*(3$B*$3^#V6+6++<3͵,,3>3"N#F#~Ϳ,q#p#w>3͵,,3>3*~,!2=2>!*=^#V#͇>??>: "?>?_>!?ͺ>ͺ>>=_>^#V|W?}N?.))@ú>#F>A?> #r?~ >.?~ ?=c?^#V# File: Traceback:???????@ ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!C~N@3@B Condition Stack Overflow$4Ox!t} w#s#r#s#r!9!C s#r!CN!t} +++++‡@#{ @#zʥ@++~Ç@++!C5!~# ´@ð@!CN!t} +++++@#~#@+{@#z@++~@#^#V=!C~9$>'+%~T]O ++~+>x^#V"|*|6͌+;,T+!C"}!" }!}͚=M,]+^,2}:}+,ͩ+:|> b€+,Æ+ͩ++>,;,+V,+D,+Ì+V,+:}+^,+,^,++D,+M,+,,é+!`C6M,+V,+D, ,:|!`Cw,+g,2|*|~!,:|*|#*|~ogw*|4:|:| :|,:| ?:|':`C‡,!TC"}! }81,! }6Ò,:`C2 }!`C6: } ڡ,*XC#"XC: } ±,!XC6#6: }"3" 3*3^#V#"3^#VͿ,,"$3,"(3|,|~Ϳ,,ya-A/?'w#•9'w#¦97>?'w##´9^{w{W#9!9Ú=9999!9MD^#V# + w9ȇ :):Wf.0:r~#fo0:s#r!>O @:)8:|W}_ W:|}o|gG:yx/Wy/_{zW{_e:yw# r:~#É:~#W #ÿ:F#"r}x;:*r}!9G_>WObk++:~+:y.%O:Cy+%!9G'%~#'%%y.%O:C=%Æ%͹%F%{N%*iC|w%j& *iC*XC<#<> %> %͹%> %{=>'%!9ʨ%=~#'¡%{>'%%Ì%{=>'%{>b%*XC++|2{!{'ɯ%>%>2|" |" |`i" |!9"|!{%[| ~# %*[|~n&*[|~C&!U|>;G3!!!C(!C"i|!g|͋*k&!U|>;G3!R.!!C(!C"m|!k|͋*À&*]|"o|!o|͋*!q|(*a|^#V!aCs#r*c|^#V!cCs#r*_|^#V:|*qC:|G&!u|('*_|^#V}*qC}G&!w|(':C '*_|^#V}*qC}(3" s#r#w=3* 3 }!m}6 4>2l}*i}!4#4#4~#N#F#y#x#:l}*i}!!:k}ʈ3]3G3:m}~G~#~O?3#~3! p! y! q<33.3~3#!!3! 6?<04= _!x$4*4FN4wxG>O>G!$q#p#6R4"f}"i}2h}x2k}.32l}>3!h}~54m3ʘ4=4:k}4*i}<˜4G34*f}:k}O*i}:m}´4y O4:k}G3*f}w# 4N3:l}4*i}!]343*f}"f}g4:l}/g.>OA5:C_!C^#V"CTC.~# !A*qC)))))C )| 6A*TC|}*D"XC:C*CTCw# \A*D{ vA zA!#"DìACopyright (c) 1980 Digital Research, v1.3 !"}"}"}2C2C*} A"}q#p##}o"}*}o|ABB+w+w+r+s4w#w#s#r<2}++*}s#r"}*}#"}*}DM!}x~¾B#~+¾B+F+Nq#p*}+"}ʹBҼB=oB!+~O~#~G!/x—ByʴB >O6# ŽB ~B=ɯ ~#fo++-B!}~#B*}$BBCBC  Insufficient Memory$ Invalid I/O List End of Execution$(CdSYSINSYSPRINT    30INITDIR WILL ACTIVATE TIME STAMPS FOR SPECIFIED DRIVE.1Do you want to re-format the directory on drive: Do you want the existing time stamps cleared0Do you want to recover time/date directory space (Y/N)? YyABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzEnd of PASS 1. ERROR: INITDIR TERMINATED. Requires CP/M 3.0 or higher. Directory already re-formatted.Not enough room in directory. Wrong password.No time stamps present. Not enough available memory. Disk is READ ONLY. Cannot find last XFCB. 3Cannot re-format the directory with RSXs in memory. Unrecognized drive.Cannot select drive.! ABCDEFGHIJKLMNOPDRIVE: Enter Drive: :Directory is password protected.Password, please. >x6?)@w){#{s333333.;;33,;;#wD{_#6 sO O ڹ.:;=,/[]<>a{Ҷ_#  ý Copyright (c) 1982, Digital Research 11/02/82{Jw6{9{B{C{CD{F{ Invalid Format Item{| | | || Stream/Record Sequen/Direct Input/Output Keyed Access P< $coni|m|TCI|||-|;|Y|Z||| ||||| ||||||||.dat||||||| @ @NULL0LOADER0SCB []=, :;<>%\|"()/#!@&+-*? COMHEXRSX1###~ERROR: FILE: File not found.No directory space.Invalid file name.First submitted file must be a COM file.Duplicate input RSX...Duplicate RSX in header. Replacing old by new.Invalid RSX type.No more RSX files to be used.Error on copy.There are not enough available RSX slots.Disk read.Disk write.Total file size exceeds 64K.COM file found and NULL option.No header or RSXs to strip.|| }} }}FGET :<***.n6.t6 LL!p:~y !6 <ʊ~"x!F#fh!:~!«!>w~:!5*.~w:; :~!9"1W:.~ !w'xFwwww5xwwwxwwwwwwwwGwwwxxwxxwwxInvalid FCB.Media change occurred.Disk I/O error.Invalid drive error.Invalid SCB offsetMissing right parenthesis.Missing SCB value.Missing left parenthesis.Unrecognized option.No modifier for this option.OPTION: This file was not used.GENCOM completed.Requires CP/M 3 or higher.1n$1n$" %* %|<Ó* %}0HÓ::$]Ç:$jZÇ:$wÇ:$҄ZÇer ͺv!n$q*n$& ͤ!p$p+q*o$~*o$Nͤ*o$#"o$  ͤ ͤ&9 :)w!)6!)6!)6%͛2$!"$$*$*$"$!<4:$GT*<$#ã!!<ڸ*<&: 6!<4!\"<$w#s#r!n"<$w#s#r.:[ -!<6>!:H!<6::=!!$ҹ! !O:) ":$!!$6!:%!%!!$6!!$6:)"!$6.;) -!2":$"!$62":%!%,"!$62" :"!$6:$/^"%ͦ%ͻ2$*(~2%%S!*3<&ͮ#% "(*3<&') q#p!4<6> !4<ڱ"!*3<&ͮ#% *4<& 6:4<<24<…" *$&$ :3 !6<#*5<&*7<*6<&*( +ͱ :;" rͺ :;2 !%6? :;? !%6:$H :$Q :$ˆ :;} rͺ;+ͱ È aͧ !%6:$‘ :$š :$£ *$#";*;Ny 2$ *$DM*;i *:&: w*$##"$ *$;i *:&: w*;"$!:4*$Ny 2$\Q *$#"$*$Ny 2$:$1*$#"$*$Ny 2$!L:$IY!M:$YwQ *$#"$*$Ny 2$!N*$#"$9*$0͸ *$#";*;Ny 2$!L:$£!M:$°6*$0͸ F*;0͸ *$DM*;i *:&v: w*$##"$2*$;i *:&v: w* w:%<<2%<!)" (!$6!,<6:$!,<*,<&$ 6!-<6:$!-<ں*-<&') ^#V"(!.<6>!.<ڑ*.<& * (*.<& *(ʇð:.<<2.!$:$_!)" (!,<6:$!,<r:,<<2,<* (#^#V"0<:$5~ *( 6x*(DM͋2$!0<#"$%͛2$*$DMi*0<"$/>>!)" (* ( ~2$ʃ҃* ( :$* ( w*("(* ( >Ҭf %͛2$:$~!"$$!"$$#*$"$*(DM1͞%U̓!)"!r$p+q*q$DMͺ !t$p+q*s$!v$p+q*u$!x$p+q*w$!}$p+q*|$"y$*y$}2$|2{$!~$q*~$&,2$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$q*$&-!;6:$!; *;&') N#F:2$!;4%:2$%ͻ2$!;6>!;S*;&/% 6!;48!/%6 !;6#6:; *;&*(~ HҞ*;&*(*;&/% w!;4#4`*;&/% 6.!;6 :; *;&*(~ H!;4#N*( *;&/% w!;4î!;p+q3r*;D ( w*<&') ^#V"(!<6>!!%(z:$/H!"$$#͞%U!$6̓!"<6:"<#ڀ*"<&( 6:"<<2"<_!"<6:$!"<ک*"<&$) >w#6:"<<2"<…!(" (* (:Ow:%/* ( :Ow* ( 6* ( :$w!"$:%:O2)x* (DMw:5<<25<:6<<26<"!: !6:5<<25<:6<<26<:#>i`N#Fog_ogDM!>))덑o|gҨ# =–#DM!>))ҽ# =µ#^#V) #^#V|g}o #O{ozgi`N#Fogo&og_{_z#W;#"$Q !;p+q*;DM*O>0*;"( !;p+q*;DM:O>R*;"( !;p+q*;DMJ2$>!$y*;"( *( >Š*(DMͻO>ҟ*("(!;p+q*$"%*;"%*$"'%̀"$$#*'"( !;q!;6>!;*;&)))=% *;& *;& w!;4!;6 >!;F:;2;*;&; 6*;& 6!;4!;6> !;ڍ:;2;*;&% *;&; w*;&*(*;& w!;4K;ͫ2$>!$ҥ*'"(!;p+q!;6 >!!;*;&*;6!;4±!$#_"*(DM͠*$~[h*( ~25<>!5<!6<6!4<6:5<=!4<*6<&*(*3<&)))=% *4<& w:6<<26<:4<<24<†*3<&% :5*;&1 :;© :;!;4 !;r+s+p+q+p+q !;6. *;~ *;~2;*;My 2$!;6:$ L :;  *;My 2$ ! . :;2$͌ :;2$2;*;~2;!;6*;~2;. *;~L ç *;N! *;*; =2;!;› !;6!;6:;!;ژ L :;ڑ 6 !;4z Þ 6 *;6͌ *;:;w:$$͂#+s#r :$ *$#"$ :L2$:;2;O*; ~2;*;&*;:/( !;4*%͛2$>!$!%"( ):%/i:$R%͛2$*("(!"$$fx%͛2$!"$o!"$*$*$"$/!##"$*$DM*#w#6!)" (%͛2$* (##"*<**̓#+s#r!<5&*<$T :{$]*(DMZ!#:Q! <#:Q2<* !<ړ*<&* (6!<4w* (" (!<6*<&') ^#V"(x*(DM͋2$!)"<*<*<&$) N#Fq#px*(DM͋2$:)!)6*<R#/:%/>!%**(DM*O>S:%/P o:%o*( >o :% :$<2$23<!*3<&ͮ#% *3<&') q#p!4<6:$=!4< !5<6> !5<:3<=o&!ͮ#% *5<& !*3<&ͮ#% *5<& w:5<<25<³:3<=23<:4<<24<£R"*'"(X">!$҉!!$6!3<6:$!3< !*3<&') ^#V"(X#/b 'Ͳ"!*3<&% >x *3!$Ҙ Ͳ"!:3<<24<:$!4<!*4<&') ^#V"'!6<6>!6< *6<&*(*6<&*' :6<<26<¿ Ͳ":4<<24<;:;w*;&*;:; *;&*;~2; *;6*$~2; :;2;!;6*$#~2;!;4N*; :0f !;6| *;&*;:;| !;6!;4N*$ ~2;*;&*$~2;*;My 2$:$:$H:$H:$H !;4N*$ ~2;*;My 2$ä :;2$$͂##+s#r*$Ny 2$!L *$#"$ :$$#+";!;6:$!;P *;Nͤ*;#";!;41 !;p+qr*;DMͺ!;r+s+p+q*;DM͗ *;DM͗ *;~w*;*;~!;p+q*;>9Ұ *;~7w÷ *;~0w!;r+s+q+q*;:;~!;H IQ !;60!$6!;6*$#"$; w!$:&<*<-*$**<"*<*$DMi*&<&9) *'<&) N#Fq#p!(<6>!(<ڋ*&<&)))9 *(<& *'<&)))9 *(<& w:(<<2(!(!%< *%<& * (*$<&)))9 *%<& Sb4 ڑ!16fb(r2:<<2}wb!6 *}& 6!u6:}!uڑ*u& ~aڊ*u& ~}Ҋ*u& ~ w!u4U!"+!\"-+5 "{{͔zb>{͜*{~ *{#"{*{#"HR :\Oy<2\2y.3l -:1/Ҁ!u6:u<2uO!\ ~??(> !uҀ:2/Ҁb@2x:xy:xYH/} .l\ -ˆͫlͻ2z:zµb:z6:z`O! "/E";G"=I"?"A"C"E:1Ҷ*/:y³:\A=OI:I I!v6> !vW:v ?.I*v&*/NI:v<2v)b@2x I I:xƒb:xy:xYHҳ. */#DM] -¨ . */#DM] -  ͫ*;E*=G*?I*A*C*E!=lͪ-.*=l -%2zõv!q*&!p+q* !s+p+q*:w#6* *#"N#Fy  !p+q*! p+q*!"p+q*! -!'q:'2#!$6#1!*r+s+q:(2#!$6*)#s#r#1m!Nq!O6*O& X>*O& :Nl:O!O4F!Ur+s+p+q+p+qͪ !\6*T~*T~2\*YM=2L!`6:L :`*YM=2LïÐ:V2KN :V2K2_*T~2]!`6*T~2\*T~j*TN! *R*R =2^!_^!`6!W6:_!W[ :`T!W4=a*T6N *T:]w:KH͂+s#rͪ :Lʔ*H#"HÙ!L6:\2aO*R ~2X*X&*P:!a4*T:aw*X&*P:Y*a&*R~2Xë*T6*H~2Y͚:X2Z1CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321PASSWORD0CONFIRM []=,  *** Aborted by ^C ***$ Disk I/O $ Drive $Read Only$Currently Opened$Password Error$Password: $ $Not erased, $ ERROR: Missing Delimiter or$ Unrecognized Option $Near: $Requires CP/M 3.0 $Enter filename: $ $ERROR: Invalid file name $Confirm delete all user files (Y/N)?$No File $ (Y/N)? $ *** Aborted by ^C ***$11͢}0͢|H!V6*H#~2Y!Z4N*P :M( !`6> *Z&*P:Y> !`6!V4N*H ~2Y*V&*H~2Y*YM=2L:L>!LHҗ !V4N*H ~2Y*YM=2Lf :V2KH͂#+s#r*HN=2L! *H#"Hê ͙ b I I!es+q+p+q:e=2e *b:dw*b#"b !fq I:f) b:f7 b:f:fHU b:fc b:fq b:fҁ !hp+q:2Қ *g >w3ͫ*g:\w*gDM"i*g >w*i} *i|2k:kH *kM :k>Y2la :l{\ 1*a M*b s!d s+q:c 2e :c *d &) >;ͱ HP:e =:e *f ! g !h s*f i "f :h !i q*i &! g ))))*i &i }Wcs2l - =2j :j 2q !p 6*j & ~2p -*p 2k ×WLs2k / =2j :j 2q "!p 6/*j & ~2p :p !k </c2l × s=2j :j 2q n!p 6{*j & ~2p /*p 2k /c2l :l Nҧ:l d2l :k !q :l H*j &) :l N_!m͆ _ *k & N͚ *l M*j1, ð CP/M Version 3.0Copyright 1998, Caldera, Inc. 101198654321;Zx0NSun$Mon$Tue$Wed$Thu$Fri$Sat$::Enter today's date ($YY-MM-DD): $DD/MM/YY): $MM/DD/YY): $Enter the time (HH:MM:SS): $Press any key to set time $Strike key to set time$ERROR: Requires CP/M3.$ERROR: Illegal time/date specification.$1, 1, " * }! /* |! H1" 1X" :]C9:]C6 :l :lb3 !m6>!mڗ 2n D *m&3 :nw:n O × :nZ  :n€ :mm  :m=2mO!3 6 , :n !m4# ͙2n!oq:1 :\A=OI:I I!v6> !v :v .I*v&*/NI!v4 bb*oM \͂ 2wQ :w$ *wM B :wB *wM͞ \͂ 2w:wQ *wM͞ !L6!J6:L:LH:LH Jt:J b.bLb:KH͜+"p!r6:K!r *pNI*p#"p!r4¹ :J !26:J !16\ !t _*N #q#psOr*N w:;Or*N w*N ~g :\ :[ :;2 *N 6} :;Or*N w!s s+q:r !s !l 6N!m"t :l « !n"t t f ͤ ڸ t f ͤ +s#r!l 4Õ !j 6 >!j :j =2j  !w 6*j &) :w [ !f Ϳ  *N ~2m *N  ~2n *N  ~2o *N #^#V"f +!g !v s͐ !w 6:l >;!f ͼ Hi !w 6 *j &) :w [ f ʹ !k s+4!{ 6:v O! DḾ j*l &!dg *{ &!{ s*l &i !l sW *j M*k M*{ M*l M4 W *k Mi* DM  ͼ :3o&" !]6:] Gͼ :]SLWiÀWzÀ.7  ,Ð -Œ5 *>!6 . 7 ,ó -¯! "N  "P !R 6*P ~2\ ͕.*  , -L .7 *, -5 *>!6 y. 7 ,& -"! "N  "P !R 6*P ~2\  L+o&" .* ## ,m -iF2L. ,Ï -‹! 6 O LNo&" .*  , -¿e2LCLmLC1, LCv >2\2 š c No File $MORE:$ $ Ϳ  *N ~2m *N  ~2n *N  ~2o *N #^#V"f +!g !v s͐ !w 6:l >;!f ͼ Hi !w 6 *j &) :w [ f ʹ !k s+4!{ 6:v O! DḾ j*l &!dg *{ &!{ s*l &i !l sW *j M*k M*{ M*l M4 W *k Mp+q*s~ ~ H% *s#"s *s~1 >>!`i^#V#~#for0V y wÇ G:„ xA  a{k_  ~ ~r_ogi`N#Fogo&og_{_z#W*j M*{ M*l M4 *{ M*l M *j M *k M j*m M*n M*o M;!} p+q!"~ *| "N  "P *N ~ !R 6͊ û *N ~~HҸ !R 6*P ~2\ ͕ *R &*P "~ û ! 62.* DM , -  O  ! 6>!  * &  N ! 4 ! r+s+p+q+q! 6: =! W * &* * &*  P >! 4' >_ogDM!>))덑o|gҀ =n DM!>))ҕ = O{ozgi`N#Fogo&og_{_z#W <q]š c No File $MORE:$ $ :( 1!'͛1͹:( 1!"r2ty_!#*r 6$#"r:t<2tCA !:tK   !( ͹ =ƒ223!'K!T6$#6$#6$y2#KKT2o!, q*, &!. p+q*-  !0 p+q*/     !1 6 #61 1!S q:R <2R O*P :S w!U p+q*T ~$ʯ*T :R <2R O*P w*T #"T Ç!V q:V 0Oj!W q:W OͰ:W OͰ!X q*X M;:j!Y q*Y &! g KͰ*Y &! g MͰ!Z q*Z M/j![ q*[ M-j:\ ::R H!\ 6:R <2R O*P ~2\ :\ i1[:\ 0 !^ s+q!_ 6[jڋj:_ ʟ:_ :_ H2_ Ҹ:\ 0!_ w1Ë!] :_ #~!_ H:_ !b s+q+q[!` :00 \͂ 2wQ :w$ *wM B :wB *wM͞ \͂ 2w:wQ *wM͞ !L6!J6:L:LH:LH Jt:J b.bLb:KH͜+"p!r6:K!r *pNI*p#"p!r4¹ :J !26:J !16\ !tڼ#yʔʕ+üN+~@w~2_*~?p *#"m:c2_:_%*2c*#w#"!h"V+~2+~=& J ! P !* P ! Ͱ}2K !O)s a }2ڄ *$Init err$ ! ">2  ¼!e"2!g"1 "`D  :*`.~*`.~*`.~**`.s#r*`.:w*`.~*`.~#foNDOS3 Started. $NDOS3 Ending. $y22e ; < 2 !48ii:0 ' 0x[[0 C))))o? <Xa_Ɛ'@'^#V#Nx{y!myƒ#RҙR x'Gy!y¦!4 ++~#foR}ҨDx//xO ~#O:~#O:~O;Zx0N<[y1O "}!N#~ U# Gi!4e Y}2 1"*>ʘBCï8Ea*X! !j  Time was set to: $Error retrià Gy2c!g"*^#Vxʯ zW{_¥ {_:_O*)* q#"7!g"  *^#V#N#Fy!N ~&!W ^w#4% % x ~w~wQ  6<b!W  *`.n&}2 2 }2*~2c#*:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!} CP/NET Status ============= $Requester ID = $ Network Status Byte = $ Device status: $ Drive $ = Drive $ on Network Server ID = $ Console Device = $Console #$ List Device = $List #$ All LOCAL$ CP/NET has not been loaded.$!9"10|(<"$(*#NM4(6OMM(22:Җo&)##*~ʏ:B!4`(:AO!:!i(~AO!:!s(#~OM!43"* ~:B!4((~as(#~OM$* ~:B!4((~as(y ##ڗ##~‚ s1O~#fo":" !f6#"GW ^&! !0 W_z!^#V!gm 7  Y Y f m u ?@BHH HH <>>FFN   $' */44/77JDDHH;O<>@ABCDE2@b!b6#####*O>G }++sb <% = 3.0.$:O yx2 `i:OF x>`i:O xk F x>:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!}8!* >w: O y xw2U :* G2* x!* `i:+ w: OF x>`i: O x/ F x>: OyxB"I !@ BB$$ UUUUUTUUE@@ H @I$$@ $I$IH"$$D"I HHB"!$@$ $"IH"@$H@   $BI$I"$$A@!"  DD A H!D@DD!$I$H#~OM:((*YPY  DE ! !yayaH!Ɛ'@'O!:2c*DM 2*DM% 2>J kb~#q ~# ^#V! # U ! ">2!}#22*͵ #~#ʫ~«=2:2###>$# ¹!4:+ Gx 07*Ów#"  * *:!3_O2*2c* q#"52 " " :!ڬ*! ^#V#~2 " ì:¸: =2 ʸ!g"*  " :!ڬ*! 4¬#4¬#4!q* * :!: * *! s#r#w>!2e!g"g: _gry 2c**:8s*ry <:%O 22c!gs#r#":&k=!:g2<!7!!, ~ҼɀT NDOS3 NDOS3 COPYRIGHT (C) 1980-82, DIGITAL RESEARCH NDOS Err $, Func $HH@ @HI"@ š c No File $MORE:$ $021000032A9903234ECD4D03013401CD2803CD8C :1002200036034FCD4D03014D01CD2803AF32970367 :100230003298033A9803FE10D296026F26002923C3 :1002400023EB2A9903197EE680CA8F02E53A9703C9 :10025000B7C4420321970334016001CD28033A98C3 :1002600003C6414FCD21030E3ACD21030! 6! 6> ! 9 $ : 2 9 * & *>w > /L >: ! q.#k -\ : 2 : ҃ : 02kÍ : A 2k: 2 : Ҩ : 02lò : A 2l! 6j ! 6* Mj2 : !0" j2 > 7H4 * +" > > 1   : ! q: a/>z! /HY : : *&  !6 .$ -† ! 6#6::° *M8 A<2! 6* &  ~.: H!: H * &  N8 * &  w: <6>!cs* h> ^*#*c& *^*c& *NP X.^j*h*h"h:c<2c*##NP ʇ.Íj!"h*~2j!c6>!c* h> *c& *NP .j*h*h"h:c<2c¥ï2d2c:c^ ! :b!g6 2c!gҿ:cʼ*##:d[ü!"h!f6:f!gҼ* h> ʧ*f& *:d§!g6:f<2f*h*h"hf.:g 2c:c:c2j*dMP j.!g6 2 : <2 ð : <2 ! 6: !: H_ * &  N8 * &  w: <2 : <2  T ! 6!62 W ! >~o*&  * &  -¶ *&  6:<2 : <~O! *&   - : <<2 T :=o&  6:=o&   6~ ~ : K ! 6: ~:==o&  * & ~HҠ : <2 d : ~ :==o&  6:==o&   : w7 ! 6:=o&  * & ~ R ʹÿ4*~2j*dMP 1j.ï!d6!g6:dF:bZ 2cf*~2c!d6:cv!d6C:cC!e6!"":eC:b§*#~2fð*##~2f:c2j*fMP :ͷ/O!  ^#V!e6+6!g6,*fMN,,*fMN,*",,7!e6@jÌA:g/aI  Þ:bž!c6> !cڞ*c& *>*c& *w:c<2cnïʹï7Òv*& ! qI I ! 5* & ) ^#V  !67 CP/NET 1.2 Status ================= $Requester ID = $ Network Status Byte = $ Disk device status: $ Drive $ = Drive $ on Network Server ID = $ = LOCAL$Console Device = $Console #$ on Network Server ID = $LOCAL$List Device = $List #$ on Network Server ID = $LOCAL$ CP/NET 1.2 has not been loaded.$1?!9"g!g.>5ʐͰ"p,Ͱ*p#N <ͰO UͰ!n6>!nmͰ:nAO͠:͠*n&) *pn}2ovͰ:oAO͠:͠Ͱ*n&) *p#~O Ͱ!n4 : <2 :=o&  6:=o&   : w Q Z ! q: <2 O>}Ҿ ! 6*&  6:<2O> Ҿ :=o&  6:=o&   6~>:  !6N!6! 6  ! 6!: }* &  ~7*&  6*&   : wc* &  *&  * & w: <2 * M[ 2 z *&  * & 6 * M[ 2 ª*&  * & 6 * M[ 2  !6P  !6:<#w**|?  W{'_z 'J|g>?%'%,.Ja SƐ'@'_K TPA $ # U ! ">2!} :* & ~=:02 * & ~! HI* & ~=: =! p+q* ~=A_:! 6>! ږ* & * ^! 4p.! 6>! * & * ^! 4£I ! p+qv * DMNʹ! p+q * DMNʹ! p+q * DMNʹ! 6! 6#6#6 ! 6> ! O: 2 5* & *>! 2 ˜! 6* & *~2 * &G"*~2 : ր: ֠H* & *: * & *>@w* & *>! : <2 A: < Ͱ"*p n}2o@Ͱ:oOͰ"*p #~O FͰͰ$*p n}2oʇͰ:oOͰ$*p #~O Í ͰÖͰ͛v*g!iq*i&!kp+q*j  DE ͠ ͠!lq> !l:lA O͠ :l0O͠!mq:mO:mOH͠_{ozg_{ozg # U ! ">2!}1bMAIL Version 1.2COPYRIGHT 1982, DIGITAL RESEARCH080282654321 Waiting for File$ Enter message: $ Must Run Under MP/M or CP/NET. $No More Messages$1b1b- 2  |2b*bM! ^#V ʹÊ "*^#V"*"*~2 .*DM -]! "dÊE"Ê'v!6#6O! ^#V2c:c½^  :b“!d6:dҐ 2c:c!d6Í:cʍ:c2j!"h!c -:b*#~2(*##~2!6j#Aj!6! 6: ҥ*&  ~l! 6*&  j"ʔj*#":<2Kj¸j! q>9! /~0/H: 0: A/>F! /H: A >!6! 6  *M!k ^#Vs*M8 O͹2 s*M8 O͹2 e: *M8 O͹H2 ss%(9h: :  ! q: ҧ: 0_ö: A_!6! 6j#j*jj>*": Input Filename: $ Enter Subject: >$ Destination ID: $ ILLEGAL DESTINATION $ Mail From Node #$ Subject: $ $RE: SERVER MAIL DRIVE NOT NETWORKED $ ERROR OPENING FILE $ ERROR READING FILE $ ERROR WRITING FILE $$$$ >$ Mail Program Main Menu Select one of the following: ҉*&  j!€*#"*&  ~i! 6*"*"jfj}:<2O> }jÆj:ʗjI * :O͋:O͋= ! 6:=! * &  ^: <2 I !6:<2*&  ~b! 6>}! _*&  * & ^: <2 )*&   ~! 6*&   ~=! *&  * & ^: <2 €>:b*#~2 *##~2 * MP j! 1 - Broadcast 2 - Send Mail 3 - Receive Mail 4 - Exit From Program$ Select source of message: 1 - File 2 - Console Input$ Select response: 1 - Stop Receiving Mail 2 - Answer Message 3 - Delete Message From Mail File 4 - Answer Message, Then Delete 5 - Re-Examine Last Message 6 - Get Next Message$f6*"*:j"0j*#"jMj! q! 6>x! ڐ! >yO!  ! >}O!  w: <2 W:2O>~Ҥ!6~.N -¬ :2 : 2* MP .j.$j -.s -!6!6!6!6!v6!x65jHj2 v:sjsjH: j‘j¤.z -¬jj!g6:c2j*dMP j.i`N#Fog@ *** Reset Failed *** $ @ @1!6:Y!"å:<2O:ڥ*& ~A/>P/HҢ*& ~AO!  +s#rY*DMͺµv!p+q*% i`N#Fog!91 |g!~XO#~ - X[m# m~]X0 Km{__2A)) =_{ozgi`N#Fogo&ogxxMAIL TEX !91 |ʂ!~sOG#~ 0 "p[J~[J# :p# ʈ~]p0 c҈xGGJx@<“ËË ÜE~wPASSWORDCP/Net is not loaded.$Illegal LOGIN command.$LOGIN failed.$ Function = File = !,$-"h!9"f! ͉:2(t™:! =Hgo:O*;*Ó*"r*r"ÿ<:g:!͐*f}D! ~6t!r ͷO(^  : šn!6@G:x: P:<: P n6 t6! ^6 t6u:)<͠^! G:Ҏ>xʝʝw>ɯw̩z:»!>wɯ:=zxzz: :G:=/ͽx:Āy!4 ILST:CON: CP/Net is not loaded.$ Illegal parameter specification.$1!9"!cͺ>'l"!6u!O! ^#V͏2: =ʡ0u͏2 *&) *" K* #w: ƀ* w$ͨ$* " 2!K* #w:!ƀ* w$ͨ"* " 2!K* #w:!ƀ* w$- S>1#S>v*!q*&!p+q*  E*& ~ ‹!4u!6:*& ~2O>Ҷ*M û >!/~:H~[H~]H~=H*& 6!ILST:CON: CP/Net is not loaded.$ Illegal parameter specification.$1!9"!|>͓"!6 !͇O! ^#VXO! *>w#6$* >w#6"* >w#6 1#v*!q*&!p+q*  E*& ~ 6!4 !6:*& ~2O>a*Mf >!/~,H~:H~*H~.H~>H~<H~=H*& 6!4;!4!q*& :w!4!s+p+q!6!66:!5~y 5 6y(^@O:=7:y :I :=e:  zz#͂:!  r  ! O(Ì*( ~2* *}ʷ!#¶!""÷:_:*( #wxH! )6"& :!  x2 GH)+6:2, :!-  :, !+*( ~L#Bxz:* : *( ~ʓOڊ{2Ó#w:2. +:. 2- !% "( 2* ! "& !* ~4:2- Ԃ: Gͳͨ^2+ >2:2 *N#G2  4Ð!4!q*&  :w!4!s+p+q!6!66:!ڌ!q!6>!z*&**&  q!6!4+4I:҅:!43>: :ʚ0: A2O>Ҭ0u:!q:A/>F!/H:A :02 ::0A2: 0:  : [H>:  : [HG* Mͳ2: 2 :0: [a:  ^0>u: ]o>: ]* Mͳ:]¤* Mͳo&))))* Mͳ_}0u: =¶u_{ozg^#V|g}o _{ozg."y2;!"(:2(=2(:=;!~;4#.{2(!" "9"2!;(y3]K!o\b!,_^#V* !J ^#V̀:#!"(COPYRIGHT (C) 1982, DIGITAL RESEARCH 151282/(  + 1 7 = }!!!!"""""# ####$$U!q!6>!C*&**& :!6!4+4:N:!4>::c:A2O>u:_{ozg^#V|g}o ‡_{ozg :+ ̜2 5*( ~o#"( M š*( ~`Uoj*( ~#"( Ñ!* ~6s!+ 6:+ ‚xoͳ*& ~2+ o#"& !+ 6M : W:2 x ͺ*( +"( w  : >2* 2 :*( : +w"( ͺ:G:  !% "( ^-:* $P:<\: W:2 xM s:<9>2 :* 9x~+q ’x2 :* ͂^2 ¢ů͠: !ڽ*( ~5WèjM 2 ͨx*( +w"( j$$#$-$A$J$S$@Y$u u J$u u }$$$$$*%P%$%&'('d'''(('({ A g X J v !)$*^#V#^#Vw# ll l ls:¬MA wM  2*7w#6?#7 .,:;[]=<>|!?]45#Ra{i_p# l s s͂:(A2= / ::0! dگ61#d ڸïp#:w#6 !6:6 *#!)6.#)͂ O(BDOS >2+ 2* jx. #NzW:  : !2 W! 5= ^x^ z: m :* ;#wO: 9ʌ ^:— ~x  ) :* :   >*( +"( w++2+ 2+ p!" r y< < <% zr ͷr 6r 9r MDÌ:o !6!h : ʚnt2 r 62 >r z<*)$"!z<~r s^#V#N#FxN:oʲ ̀õ (# Þ ~Gw#* #~$%+@*9> # #>? ;*~ w-xąH"(0 *(#ĊH( ,ˆʀHÈ2(xą ):(@O~#w͚ʀô̓-b_++V@* )͗Os++r!x>w~6:(6~#+w#w+~;wɯ2 K,OFq-yl?Npg&:(ʓ~†wŒ~è# # x ͗w w@ ~wb͐Úw:- %:(<%R$Hͥ:(>(~c!o#~E%^#V)$G#~#~!%~ b%% k%%##N#F#^#V#~#fo~o!o#~>T}! 6**#K" G*~ xr ͐-xą@7(͚S!ʀq&&͋"&@6,͚%Xͤ͋&͗wO~<:( g&~w#w#6##)͋&@ * g&~?G++N͆p# Þ&͐*6!¿&?~p*6 &>2ͱ ! ! ͷ w*o).:(O!*c(:(Oͫ}@2æ  ~á *g(:(o$*~K6?~wKw**i({#zir+s{ozg*(*(|g͸*u(*(  R>22Z$w*q(>ww:(c( *(#*i(s#r*:(!(:G~#<*q(#~!;(!(!(!~6k!"2(*q(N1q*{(]*{([*y(}<^#V(t6 ^#V}e ^#V#~2(>â9͆>!"(*y(³*(X)*ÿ͂"*g(*K! ~<:wb##>w#w> r !~#<̀!~$6:03i"!~6*.>=)Q!(QX<k*{(}<^#V{!~! _*o(~s̓  2@ !()#w*~"!!(Fw̓ :(w̚":>#2(̓ *~wć"#Fx T]## #~ ȷ   *4 # '  4 !( *~^ ^ 33G# P v :dv 6 y #*~w>2 *p@! ~*"v@*w# ) 6# ͙   !N!"*>o+"v- *!b("": r#~?w#>r# L=J! Lv w,b ?~O ͆=: <>w##~2( 4~?̓-¹:(<üAX2(r K:(w++~=wv 4͗O5:(2(X:(!(v q: v v Mڂ?Ͷ >T͓Â!"(>(Â:(G:(O:(h=2(7ryy/W!(:(lڈ>F6:(_/G:(ʧ:(ڨ|OͤG:(_OzW{|:(*(}|BKN zyG(w'ͧ B pͧ ,Úgsr ͐-ͤ͜!S')_'ͤ̓ ~?w͐s-?F͜p!'̓ ¡'>2ͱ ?~¾'¾''''>w'͙ =2(͜!:(wÚ~̓ ʑ'pá'!(6NN!(r )!(N !)z<*)$"!" :X(*:(w:(w#:(w*2* }D#cdfg!"()*!"@*(*#":&2(͒:È0:+Òy<_W`iͫDM*w( ~bNpwDM*w(T] KKͦ*w("w(ͦ"w(@ :(N N#Fy*(}|h#ð*(ͫ# 6*q(@-RXDM*w(6# x *o(w*(*w(s#r̀*i(6#6*}("(j-@*(|<ď+>!8>8> t>nͦv8 ~*o(wn:(r :(/GyOOA +¬ ¢y2(:(x¹o&:(W>OͫE:(ڟ?N/*"(y2ͦ+>2( )@ u :G*g(`~!x_<_@!*o(y<:(/G?~##~? 6!K@?F6##N6 2 p##q:r !Z$2!"ög:(2T͐-:ʹ!>2<2(!!(w: >2(*6!O~2(+A@2! ͚A=: <%~?¯"k"?~?ʾ"ZT͐"*>o"͒"!:O"(Ý"}-6͚CP/M Error On : Disk I/OInvalid DriveRead/Only FileRead/Only DiskPassword ErrorFile Exists? in Filenameò ò >2(a." :(2:<:5(5(;(:(2ɯ2(2{_zW{_zW ) 74#4#4)7( #  w#*J|^#V#"i(##"k(##"m(###"o(#"q(##"(!s( )*s(!()*(|!(6~67*k(w#w*m(w#w#w>2('å2(*OͶyڲ ò <*.Ͳ:0!(:(:(ò 2*(>*ͫ"(:(2(9:(>#:(>#*+S!X:(ڜq: ʺ!((ʵ>2( ͤ2(O DM͸}>r "("(2(:(2(* :(:(FsO s#r:(„y==„*(!(^W*y(^#Vx+7=2(wͼկw#KWK*("(J T͞*(:(["(Ͷ:(WMںʛ>(úͶ >TJ:(!(ʷ͞x!(w4 PWP  Â*!!~~#~O~#{(X)^#V!"(:(<)!~<<)^#V*(<)"("(x+)!(*(>X)*{()Q*:(_2({2(Ē*"(͂"X*~<)ҍ) -)a*ʚ)~)6*(:(X*)!(:(T>q*k)!(:()-6>)Gr x~:(2(Ô##~*$*">2>2: *(~w *" 2(>ʄ@~k:((s~*9~Ês~ ~ͅ<Eʀ@~›:(6!¦w͚̋,ÇPY*({zBKNyʺ Nú2—#͇ͱ * «#>2(͙ wB p'+!#:(w͚AP{" 2! W>O2 ø }-R*.)$:(r "ök*w()$*c()$-}-ͤÀk*s(" :(;$:r 2͚ù͚͚}/_|/*.W}_*c(".}o|g"c(>2({2{2g*w(ʪ$Ң$Þ$+}$*(#}o|g:(O *s#r#w!~w/~@w//Hͥ*.>=)%_g:0%!(s#r#p*k(N#F*m(^#V#F*(:(O}|y9*( +"*( }|yP#9*( *(DM"(*k(s#r*m(s#r#pyoxg͝DM*(0MD"(!*MD$:(Oë!(N:( «G>O:( ù* :(n` ~#foͤ2(O"(}:(O*( "(2("(:(O:(G2(!(w*~zWw+ !z?#~*!* *G!O~2(~m͗O~t>2(?:(2(O:(w:Ғ4~:(w?r##rp# ä |g}oì*g( #G ¾1*q(:(*w***> r G~.|°! w:ck[!x?[! ~ʤ͆[͗PPv qO-á=.: <ʰ! Vq##~_@w: <œ. ʩ.ʩA r r##s <}r cN! ~态O>G~G!~G~o>_yW#x#W{s+p+q7r#r#r>@ >2  !!q#p#w2(wW*._3ҫ -!(s:(!(xQ*q(~wɯ2(2(ù*~2(~w#~2(~wZ!""2(=2*~2(=2(2(k:*wX/ 6X*ð**(}+*(}+"(*(x+"(x+m+*(^#V*( s#r*(*(s#r*(:(Y+4Y+̓+*(*(~#ng+*( s#r ^#V|:(w:(ʴ+>2d,:+#++>29+2~2#! , , ,)x,) ,O +"!w [,O?WGzO:(V,xGyOG,xwq*}(}2*i(^#V+ d,!(K*}(@+*)):( K:(GET UOPTIONS 9EXAMPLES [HELP .HEXCOM INITDIR bLIB nOPTIONS MODIFIERS nEXAMPLES {LINK ROPTIONS 3EXAMPLES ZLOCAL "YLOGIN %ALOGOFF +7MAC .7EXAMPLES 3OPTIONS 3HMODE >NETSTAT F]NETWORK IRNTPDATE O#PATCH QHPIP (COPY) T.EXAMPLES [!OPTIONS bPUT kOPTIONS q8EXAMPLES zRENAME $EXAMPLES aracters to the right. CTRL-M same as carriage return. CTRL-P echoes console output to the list device. CTRL-Q restarts screen scrolling after a CTRL-S. CTRL-R retypes the characters to the left of the cursor on a new line; updates the command line buffer. CTRL-S stops screen scrolling. CTRL-U updates the command line buffer to contain the characters to the left of the cursor; deletes current l$D$ $I"B IIBB"$B@DH"$$ IH $$ !I"AD B!B  BI$A$"@$I$!!""@H! $!@I$  () type parens to enclose a range of options within an option list. RW Read-Write attribute - opposite of RO RO Read-Only attribute - opposite of RW SYS System attribute - opposite of DIR DIR Directory attribute - opposite of SYS ... preceding element can be repeated as many times as desired. * wildcard: replaces all or part of a filename and/or filetype. ? wildcard: replaces any single character in the same position of a filename and/or filetype. ///1cntrڗ>2#-×:#-<)2#-*(!""++"(29-C-%w*{(}<^#Vz!(c-!>c-! J-w*q(~69!͐9bBI$"" HB@ UUUUUUUUUUUUUUUUUAPDA$! @I !@D@BDI@!B$ @$I$$ "@$$@@HHBD"D$H D@!IB@ A"B HBIB$$ "$ D$!"D$H$D$I@D BD" H$BHHBDHB"H!"RMAC aOPTIONS =EXAMPLE GRSXRM fSAVE LEXAMPLE pSET ZLABEL 1EXAMPLES <PASSWORDS 4MODES uATTRIBUTES xEXAMPLES pDEFAULT +TIME-STAMPS WOPTIONS EXAMPLES 0DRIVES SETDEF EXAMPLES ?SHOW )EXAMPLES BSID TCOMMANDS 4EXAMPLES 7UTILITIES GSUBMIT SUBFILE qEXECUTE \PROFILE.SUB \TPA {TR ine. CTRL-W recalls previous command line if current line is empty; otherwise moves cursor to end of line. CTRL-J,-M,-R,-U and RETURN update the command line buffer for recall with CTRL-W. Banked system only. CTRL-X deletes all characters to the left of the cursor. ///1COPYSYS Syntax: COPYSYS Explanation: COPYSYS copies the CP/M 3 system from a CP/M 3 system diskette to another diskette. The new diskette must havelchars Control Character Function CTRL-A moves cursor one character to the left. Banked system only. CTRL-B moves cursor from beginning to end of command line and back without affecting command. Banked system only. CTRL-C stops executing program when entered at the system prompt or after CTRL-S. CTRL-E forces a physical carriage return without sending command to CP/M 3. CTRL-F !!$$HH !"BB$HHDA! "D"H $B!$!AI!$ $ H  H A$I! I" $$BD"$H "AHD @ I  B"$$H @@@@" BHB  !I$ @ $@$"$AI$$IBI$I H@@I!$DA $ $@$ !$!!" !$I@I $@ $ @!H"BI"HI DIHA DD$HH $  B D$ "I$I$H$ I !  $I$I$I $@HD$TYPE "EXAMPLES &!USER (#EXAMPLES *4XREF +o$ $ $ ///1commands CP/M 3 Command Format: A>COMMAND {command tail} A CP/M 3 command line is composed of a command, an optional command tail, and a carriage return. The command is the name or filename of a program to be executed. The optional command tail can consist of a drive specification, one or more file specifications, a the same format as the original system diskette. Example: A>COPYSYS ///1CPNET CP/NET on CP/M 3 CP/NET on CP/M 3 uses an RSX that combines the functions of the NDOS and SNIOS from CP/NET on CP/M 2.2. It also provides support for more functions, particularly those available to CP/M 3 programs. The RSX may be removed, allowing dynamic switching between CP/NET (with reduced TPA) and normal operation. CP/NET on CP/M 3 doeCOMMANDS CONVENTIONS 3CNTRLCHARS COPYSYS &VCPNET (eEXTENSIONS ,@NDOS3 35CPNETSTS 6 DATE =YEXAMPLES ?(DEVICE A/OPTIONS FyEXAMPLES LDIR VIBUILT-IN YKEXAMPLES ]WITHOPTIONS eOPTIONS hsEXAMPLES y_DRIVES DSKRESET DUMP UED COMMANDS {EXAMPLES /ERASE 1OPTION 4EXAMPLES 0FILESPEC MGENCOM )OPTIONS \EXAMPLES @ moves cursor one character to the right. Banked system only. CTRL-G deletes character at current cursor position if in the middle of a line. Banked system only. CTRL-I same as the TAB key. CTRL-H delete character to the left of cursor. CTRL-J moves cursor to the left of the command line and sends command to CP/M 3. Line feed, has same effect as carriage return. CTRL-K deletes character at cursor and all ch@!$"A$A DBIDB  @$$DD""I $BHI$IB !@"BD BBD "@B @$ $BI I B$@" ! "H !$B I$D@! !$ @H!$$D"@A@ DHII  D@@ $ DHI"D$ @ $""@ B! @@D $$A$ $D "@I $A$$I!HI$ BA$ $DH $I$I"HI$I!$DB$"B I$$I$ !I$@DBB$@D@"I A!$ @  @  "$ $I$I$ B!$@ I @I$ HBDH$ A$H!nd some options or parameters. ///2conventions COMMAND CONVENTIONS The following special symbols define command syntax. {} surrounds an optional item. | separates alternative items in a command line. indicates a carriage return. ^ indicates the Control Key. n substitute a number for n. s substitute a string (group) of characters for s. o substitute an option or option list for o. [] type square brackets to enclose an option list. s not (currently) support networked console. ///2EXTENSIONS EXTENSIONS TO NDOS FOR CP/M 3 The following BDOS 3 functions are now supported on networked drives: 17 - SEARCH FIRST (enhancement) 18 - SEARCH NEXT (enhancement) 46 - GET DISK FREE SPACE 48 - FLUSH BUFFERS 98 - FREE BLOCKS 99 - TRUNCATE FILE 101 - GET DIR LAEL BYTE 102 - READ FILE DATE/PASSWORD MODE 105 - GET TIME AND DATE SEARCH functions were enhndicates no protocol and the computer sends data to the device whether or not the device is ready to receive it. baud-rate is the speed of the device. The system accepts the following baud rates: 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200 ///2Example}!,"**NK6 :+OK2$^#V#N#FxNp:$p:Gjxj Y# A>QFQx>QGQx3ڰbڼqҼo5p5"""*!yb! ~G*!NKկ2!*$K*"x!*!@$@hK\K:K ~#~ w*NK*NK^#V#N#F!",!."*K6*}ʴ}<ʴ.}o|g "($Kt>=2(*f*(}DɯQ"(>QKQKQ>Q"%Qe L: = LOCAL Drive M: = LOCAL Drive N: = LOCAL Drive O: = LOCAL Drive P: = Drive F: on Network Server ID = 00H Console Device = LOCAL List Device = LOCAL ///1DATE Syntax: DATE {CONTINUOUS} DATE {time-specification} DATE SET Explanation: The DATE command lets you display and set the date and time of day. ///2Examples A>DATE Displays the current date and time. A>DATE C DisplDIR DIRS DIR with Options DIR and DIRS are built-in utilities. DIR with Options is a transient utility and must be loaded into memory from the disk. ///2Built-in Syntax: DIR {d:} DIR {filespec} DIRS {d:} DIRS {filespec} Explanation: The DIR and DIRS Built-in commands display the names of files cataloged in the directory of an on-line disk. DIR lists the names of files in the current useranced to return a full sector of directory entries in the case of searching with the drive set to '?', as is done by DIR.COM with the [FULL] option. This allows retrieval of SFCB data from the last directory entry of each block (which is not otherwise returned). GET TIME AND DATE does not require networked disks and is not used by NDOS3, but may be used by other programs such as NTPDATE. ///2NDOS3 Syntax: NDOS3 The NDOS3 command is a simple loader fs A>DEVICE Displays the physical devices and current assignments of the logical devices in the system. A>DEVICE NAMES Lists the physical devices with a summary of the device characteristics. A>DEVICE VALUES Displays the current logical device assignments. A>DEVICE CRT Displays the attributes of the physical device CRT. A>DEVICE CON Displays the assignment of the logical device CON: A>DEVICE CO!2*%DM**ѵ+)) H~#+}#<:<ʲ<77:<ʢ2~77ø~7"9:OG#Q{ozg# ""BBays the date and time continuously. A>DATE 08/14/82 10:30:0 Sets the date and time. A>DATE SET Prompts for date and time entries. ///1DEVICE Syntax: DEVICE { NAMES | VALUES | physical-dev | logical-dev} DEVICE logical-dev=physical-dev {option} {,physical-dev {option},...} DEVICE logical-dev = NULL DEVICE physical-dev {option} DEVICE CONSOLE [ PAGE | COLUMNS = columns | LIN number that have the Directory (DIR) attribute. DIR accepts the * and ? wildcards in the file specification. ///3Examples A>DIR Displays all files in user 0 on drive A that have the Directory attribute. A>DIR B: Displays all DIR files in user 0 on drive B. 2A>DIR C:ZIPPY.DAT Displays the name ZIPPY.DAT if the file is in user 2 on drive C. 4A>DIR *.BAS Displays all DIR files with filetype BAS in user 4 onor the NDOS3 RSX. It loads NDOS3 regardless of whether it is already loaded. Once loaded and resident, NDOS3 implements CP/NET - all calls to BDOS function 12 GET VERSION return H with bit 02H set to indicate CP/NET is active. ///1CPNETSTS Syntax: CPNETSTS Explanation: The CPNETSTS command displays the requester configuration table. The requester configuration table indicates the status of each logical device that is either local or assignedNOUT:=LPT,CRT Assigns the system console output (CONOUT:) to the printer (LPT) and the screen (CRT). A>DEVICE AUXIN:=CRT2 [XON,9600] Assigns the auxiliary logical input device (AUXIN:) to the physical device CRT using protocol XON/XOFF and sets the transmission rate for the device at 9600. A>DEVICE LST:=NULL Disconnects the list output logical device (LST:). A>DEVICE LPT [XON,9600] Sets the XON/XOFF Ãà à ÃÃ1j$|@ "H$UUT$$ $I D$BA@! B$$A IA $!"  @$@$BI!!@""$DA  $I$@!ES = lines] Explanation: DEVICE displays current logical device assignments and physical device names. DEVICE assigns logical devices to peripheral devices attached to the computer. DEVICE also sets the communications protocol and speed of a peripheral device, and displays or sets the current console screen size. ///2Options [ XON | NOXON | baud-rate ] XON refers to the XON/XOFF communications protocol. NOXON i$Nwy!"(9"f1f! Ҕ2! ~#foCOPYRIGHT (C) 1982, DIGITAL RESEARCH 151282KK{<<ʽ<K : >! ~6 69BK! OS to a specific server on the network. Example: A>NETSTAT CP/NET 1.2 Status ================= Requester ID = 02H Network Status Byte = 10H Disk device status: Drive A: = LOCAL Drive B: = LOCAL Drive C: = LOCAL Drive D: = LOCAL Drive E: = LOCAL Drive F: = LOCAL Drive G: = LOCAL Drive H: = LOCAL Drive I: = LOCAL Drive J: = LOCAL Drive K: = LOCAL Drivprotocol for the physical device LPT and sets the transmission speed at 9600. A>DEVICE CONSOLE [PAGE] Displays the current console page width in columns and length in lines. A>DEVICE CONSOLE [COLUMNS=40 LINES=16] Sets the screen size to 40 columns and 16 lines. ///1DIR The DIR command displays the names of files and the characteristics associated with the files. The DIR command has three distinct references: ." *SmwrX8# ;@E\aÜPÒ/×ï ) L×_o@>*}D0000000000000000001R y2j!_ ~(k2kOC͗8a2l"m^#V#N#F:lo& "o@ AO :lO "q 8)2>͓ : 8:jO! [qs#r!:jO! ^#VSq*o~ #>(#~(>MOG#n( !C[q! N#F ! F ?2^#V+ɷ*o~v7*qq#p N#fi* B" * s#r#6 " CCCs:A2i`z n&+c 2*"*"*o~ ###v(~!O N#fi{*m:?O!~O/ͩq!>!;!:wK:D=2>22ɯ Z37X Z100 EPSON ASSOC FMT8 FMT9 FMT10 FMT11 FMT12 FMT13 FMT14 ,Q,1,q--(-9-J-[-l-}------ - - . .@U'.W8.I.XZ.sk.|.&ۇ_ } ͱ(ۇG ɯ<&} ˏ&`ۇ( } =2>ہ( w͡ ͡(>Ӈͱ(ۇG կ2>:ӆz%ۄ ۅ1( >Ӆ>1ӄ>pӇ>ӆ&ۇw}&ۇ/}   ^ MsC1C!4!~#|~(5 #~#fo~ +6#### @>y$A{CM^#V#zy8#0#!nodev nodev nodev nodev nodev nodev nodev nodev >Y!! ^#VA**$J>| **9(>M***$> | (***$> ( | G({.x:A( s.1._>#Wo>g2AGB!%$)3-1Q5`9o=A:R2:Q((1 m!ˮˎˆ#ˮ!#*o##""2"~ą~ :":"!""*~"s222!">2 ">2"U~º>2"2!"~wU( ~wú*~#<(:!"ʿ~wú*~FN66~ .` !V( *~~  pqÿ~_( O(G(*ovº*qqpn f *~ *~~G?ڴ q#p>2"a! "65 8Ͷ!8H!!!!!:c0 *"F#N(((: 1!|G^ >">"!}">">"!E"> $> >$>O#>#>J!!}#>!}!}!^#V#z ~##ں O+~#! Gy ҳ s#r#<GyOx!  N#fiOf ” ï f M  *"*}"*"*"*"!x:|O:2B ͏| >2z͏< 2͏@,͏z͏|2y2f Ç| f *u|Ç:yG8!)>22!"*"!@)!@)!@)!~((#### y p#q#s#ro ͏v ʍ  !?S [úx2(:((?:A2( KAYPRO CP/M 3.101b (c) 1985 DRI and DRM $ No CCP$CCP COMA2üBKAYPRO Winchester Disk Interface 3.100e$DeDe:?>(>25:Q*s QG!XRyW~KAYPRO Floppy Disk Controller 3.100e$PXPXPX::G:O 毰>2:Q!f~6ˀ˩yq+Oxp>2Ͷ!8h(˩H(ˀˀH ˩>2"*o##""D 8:<: " >2! D*"n(#n( 82c@ *"#~! 2c[sR:c : " :" <>(_!"5_~ Ҧ: "¦͞! !æ  { 2"222"s1:"O!O F#N#fi! :W/G:lO*"# ͼ bC { 7ɯO& { % 7ɷO*q >_#>W2"*"N#~/ I(  A$w#Y$  : ! ܐ : 2: 2: 2>2 : ͨ G: x(dNG2 !m : ͨ O : ͨ =(G o>g"::2 :2 :2 *m>2 x 7R0x >2 7ZxNd8dͶ 2 xͶ 2 ! {Oz8 YW#x 8xͶ 2 2 {Ͷ 2 : ͨ W: ͨ B(0 O= 0 : ͨ 88O: ͨ G ??OU D(0y xy(DGy<2 > >$ !  A~$# w++~'w0#~'w+ GOxGd0d 0 !!!!! 2*s{Yvvvv v8>:2f>Q{ɀ/"O"L"O"R"`'"|KAYPRO CRT driver v3.100g$z++î+++r+KAYPRO Keyboard handler v3.100e$4,l,a,É,},+KAYPRO Z80-SIO handler v3.100e$ 4 (4(4 ]ð,,ñ,,ô,7,YKAYPRO Parallel Printer v3.100c$23! YN#F#~_#~pW~# ~(<#~#恻 6~p 0#^#V#N#F## O>w#O>pw!r#######~ !r=KAYPRO UNUSED MMS Z37 !_~2# 2>:P2@!:@U!"":ӆ͡GӄӅ<ӂ>Ӄ> ӇͱG.ۀ x !ۀ *"*" :>:@U>*o~<<_!~#fo"*o#F:ӆ͡>Ӂ*:@3 }( }8o<:@U [} xʻ}ӄ|Ӆ:Ӄ>ӂ> 2?i(H:?Ӈͱ(>ۇG 8_(4>02?i(%:?ӇA `2%"5 !"6#6 ":Oyʶ!:%"gx0XDol(ˠ! @t(! 5! .! %- o!g}:c0|!" 57!"#57~ 0͞!>2"Ͷ!!:%"OH!q!q!X1>  .H! - !>>:"082c>:O滱CRT !Y+ w#*A"Z+*D"]+*F"_+>:Y+œ$y" %y[]+i$u$:[+@2q+*]+:[+_W2[+Rͻ":Z+8_#<2Z+*]+PzW"]+K_+B0  %P !$ @$AUBI*BI* $ @ "DHI$I$HHHD@@H$$A@ "I$  H$@@"A "I"$ @@B@ BA"! $  I$D@ ! H T*y d. EXCLUDE displays files that DO NOT MATCH the files specified in the command line. FF sends an initial form feed to the printer device if the printer has been activated by CTRL-P. FULL shows the name, size, number of 128-byte records, and attributes of the files. If there is a directory label on the drive, DIR shows the password protection mode and the time stamps. If h+:a+͐):i+/$[k+͞) #:h+( :j+/G:i+:i+G:j+[k+e):h+( :j+G:i+:j+/G:i+zWq)zWq)̓) >yx|)A Q A Yͨ)q)ͨ)_)!"|g{ _z W0D2h+>2h+[f+ʹ)Sf+2o+[d+ʹ)Sd+2p+W:o+_):f+W:g+>8>2m+:d+_:e+>8>2n+:o+O:p+DM!8(.):e+:n+_ 0:m+W):g+:m+W 0:n+_):g+:m+W:n+_*M:\+  :Z+0DGP!* )!P[]+:[+OGBK+:\+2\+[]+! (! drive A. B3>DIR X*.C?D Displays all DIR files in user 3 on drive B whose filename begins with the letter X, and whose three character filetype contains the first character C and last character D. A>DIRS Displays all files for user 0 on drive A that have the system (SYS) attribute. A>DIRS *.COM Displays all SYS files with filetype COM on drive A in user 0. A command (.COM) file in user 0 with the system V$:Z+ȷ=2Z+*]+PR:[+ :Z+(=2Z+>P=2[+[]+>O2[+*]+O:[+O"[]+<2[+W%!\+y0(=(=(=(=(=(%=(0=(4~w~w~w~w`> y:\+2\+>@2q+*Z+"b+:\+ 2\+!\+y0(=(=(=(=(=(=(!=(0~w~w~w~w ~w*b+| 2d+} 2f+$:\+2\+!M:f+ G( P_:d+ PO2[+{2Z+ [_+"V$ >yxO$A Q A YD$zWD$:\+͐$D$͐$c$!|g!Y+6 yR&Eh'AG2a+6 :a+Bb#Cʼ#y2f+6 y2d+:a+=$*l( s(6 y2g+6y2 $A$HH $@@@@UU@I$@D $$!$H  H!I$B@  @ HB HI$$ H   $@@ @ A"$ @HDH@HH there is no directory label, DIR displays two file entries on a line, omitting the password and time stamp columns. The display is alphabetically sorted. (See SET for a description of file attributes, directory labels, passwords and protection modes.) LENGTH=n displays n lines of printer output before inserting a table heading. n is a number between 5 and 65536. MESSAGE displays the names of+xzWy{>+> $+xzy{><++| ɯ2[+2Z+*_+"KEYBD !~~0_W~@G+~悳_##N >yAyQ+ʮ+ְ!wgNO ~ɯ+(y>DCE DTE MODEM xO_P!+! ,+~~0_W~@G+~悳_##N >yAyQNˑV~ 0=yl,(Nx,N yxy͉,(Ny,N++ >yx+8 xɯLPT >,(y@@$R_$_$U attribute can be accessed from any user number on that drive, and from any drive in the search chain (see SETDEF). ///2withOptions Syntax: DIR {d:} [options] DIR {filespec} {filespec} ... [options] Explanation: The DIR command with options is an enhanced version of the DIR built-in command and displays your files in a variety of ways. DIR can search for files on any or all drives, for any or all user numbers. One or twe+:a+L*D *(> ʻ" "(ʫ*ʰ**# L# #K+d">2Y+:\+ (6*_+P|gT] |gͻ%!P**_+P|g"_+ V$*_+P|g"_+ V$*_+|g!P*x%x|y}>%xzy{>#zW|g&x|y}>&xzy{> x%&xF&x|y}>a&xzy{>#zW|g&x|y}>&xzy{>++ xE&&ͻ":Z+'[]+!P* 0DO |gDMR|g[_"D"AB@ H@ B ! HB!B@@@  A"ID!  B@ B@  $D!B  !@@ H $DD"$ HB$B @@H !@* drives and user numbers DIR is searching. NOSORT displays files in the order it finds them on the disk. RO displays only the files that have the Read-Only attribute. RW displays only the files that are set to Read-Write. SIZE displays the filename and size in kilobytes (1024 bytes). SYS displays only the files that have the SYS attribute. USER=ALL displays all files in all user numbers f $ [?  (   @(@?  (   ;@(@   @   ;@P P (?(?DF     $I$I$I$H@HUUUUR$D@@URI I!$@!IBHD o letters is sufficient to identify an option. You need not type the right hand square bracket. ///3Options Option Function ATT displays the file attributes. DATE displays date and time stamps of files. DIR displays only files that have the DIR attribute. DRIVE=ALL displays files on all on-line drives. DRIVE=(A,B,C,...,P) displays files on the drives specified. DRIVE=d displays files on the drive specified b+R0#!R|`G}iO@&^%*]+P"PYDM|W]*_+ |gGMR0!R DM*]+ͻ%*_+0|W]!P*:Z+ (*_+PR|g V$*]+K_+B0!B|gK]+ |GM! |GM*_+0|g!P|gͻ%*]+PB|g:[+O!PB**]+:[+_R|W]*]+ͻ%!PB**_+PB|g"_+"(*ҫ*D*_+/P|W] |g! = DM@&*]+T]:[+O>PO |gͻ%:[+o&*ë*>2h+>2h+:d+ _:f+ WzdG::{_>8(2j+{_*_+BKPY|W]Sk+[)( >2i+:j+)[k+͞)2a+(:h+:a+[k+͐):i+/7:or the default or specified drive. USER=n displays the files in the user number specified by n. USER=(0,1,...,15) displays files under the user numbers specified. ///3Examples A>DIR C: [FULL] Displays full set of characteristics for all files in user 0 on drive C. A>DIR C: [DATE] Lists the files on drive C and their dates. A>DIR D: [RW,SYS] Displays all files in user 0 on drive D with Read-Write string O return to original file nP, -nP move CP 23 lines forward and display 23 lines at console Q abandon new file, return to CP/M-86 R{^Z} read X$$$$$$$.LIB file into buffer Rfilespec{^Z} read filespec into buffer Sdelete string^Zinsert string substitute string nT, -nT, 0T type n lines U, -U upper-case translation V, -V line numbering on/off 0V display free buffer spacelename.typ;password If you do not include a drive specifier, CP/M 3 automatically uses the default drive. Some CP/M 3 commands accept wildcard (* and ?) characters in the filename and/or filetype parts of the command tail. A wildcard in the command line can in one command reference many matching files on the default or specified user number and drive. (See Commands). ///1GENCOM Syntax: GENCOM {COM-filespec} {RSX-filespec} ... xplanation: DUMP displays the contents of a file in hexadecimal and ASCII format. Example: A>DUMP ABC.TEX ///1ed Format: ED input-filespec {d:|output-filespec} Explanation: Character file editor. To redirect or rename the new version of the file specify the destination drive or destination filespec. ///2commands ED Command Summary Command Action nA append n lines from original file B>ERA A:MY*.* [CONFIRM] Each file on drive A with a filename that begins with MY is displayed with a question mark for confirmation. Type Y to erase the file displayed, N to keep the file. A>ERA B:*.* Confirm (Y/N)?Y All files on drive B are removed from the disk. ///1filespec FILESPEC FORMAT CP/M 3 identifies every file by its unique file specification, which can consist of four parts: the drive specificati and System attributes. 3A>DIR [USER=ALL, DRIVE=ALL] Displays all the files in all user numbers (0-15) in all on- line drives. B6>DIR [exclude] *.DAT Lists all the files on drive B in user 6 that do not have a filetype of .DAT. 3B>DIR [SIZE] *.PLI *.COM *.ASM Displays all the files of type PLI, COM, and ASM in user 3 on drive B in size display format. A>DIR [drive=all user=all] TESTFILE.BOB DIR displays the filename nW write n lines to new file 0W write until buffer is half empty nX write or append n lines to X$$$$$$$.LIB nXfilespec{^Z} write n lines to filespec; append if previous xcommand applied to same file 0x{^Z} delete file X$$$$$$$.LIB 0xfilespec{^Z} delete filespec nZ wait n seconds Note: CP points to the current character being referenced in the edit buffer. Use {^Z} to separate multiple command {[LOADER | NULL | SCB=(offset,value)]} Explanation: The GENCOM command creates a special COM file with attached RSX files. The GENCOM command can also restore a previously GENCOMed file to the original COM file without the header and RSX's. GENCOM can also attach header records to COM files. ///2Options LOADER sets a flag to keep the program loader active. NULL indicates that only RSX files are specified. GENCOM creates a to memory buffer 0A append file until buffer is one half full #A append file until buffer is full (or end of file) B, -B move CP to the beginning (B) or bottom (-B) of buffer nC, -nC move CP n characters forward (C) or back (-C) through buffer nD, -nD delete n characters before (-D) or from (D) the CP E save new file and return to CP/M-86 Fstring{^Z} find character string H save new file, reedit,on, the filename, the filetype and the password. The term "filespec" indicates any valid combination of the four parts of a file specification, all separated by their appropriate delimiters. A colon must follow a drive letter. A period must precede a filetype. A semicolon must precede a password. The symbols and rules for the parts of a file specification follow: d: drivespec optional single alpha character (A-P) filename TESTFILE.BOB if it is found on any drive in any user number. A>DIR [size,rw] D: DIR lists each Read-Write file that resides on Drive D, with its size in kilobytes. Note that D: is equivalent to D:*.*. ///1DRIVES Syntax: DRIVES Explanation: The DRIVES Command displays the logical-physical drive table in the BIOS. Example: A>DRIVES DRIVES v3.103 A: = (50) KAYPRO Winchester Disk Interface 3.100d s on the same line. ///2Examples A>ED TEST.DAT A>ED TEST.DAT B: A>ED TEST.DAT TEST2.DAT A>ED TEST.DAT B:TEST2.DAT ///1erase Syntax: ERASE {filespec} {[CONFIRM]} Explanation: The ERASE command removes one or more files from the directory of a disk. Wildcard characters are accepted in the filespec. Directory and data space are automatically reclaimed for later use by another file. The ERASE com dummy COM file for the RSX files. The output COM filename is taken from the filename of the first RSX-filespec. SCB=(offset,value) sets the System Control Block from the program by using the hex values specified by (offset,value). ///2Examples A>GENCOM MYPROG PROG1 PROG2 Generates a new COM file MYPROG.COM with attached RSX's PROG1 and PROG2. A>GENCOM PROG1 PROG2 [NULL] Creates a COM file use new file as original file I enter insert mode Istring{^Z} insert string at CP Jsearch_str^Zins_str^Zdel_to_str juxtapose strings nK, -nK delete (kill) n lines from the CP nL, -nL, 0L move CP n lines nMcommands execute commands n times n, -n move CP n lines and display that line n: move to line n :ncommand execute command through line n Nstring{^Z} extended find filename 1-8 letters and/or numbers typ filetype optional 0-3 letters and/or numbers password password optional 0-8 letters and/or numbers Valid combinations of the elements of a CP/M 3 file specification are: filename d:filename filename.typ d:filename.typ filename;password d:filename;password filename.typ;password d:fi B: = (51) KAYPRO Winchester Disk Interface 3.100d C: = (33) KAYPRO Floppy Disk Controller 3.100d ///1DSKRESET Syntax: DSKRESET {drive(s)} Explanation: The DSKRESET command functions exactly like the PRL that executes under MP/M II. DSKRESET resets the specified drive, so a disk can be changed. drive(s) is a comma-separated list of the drive names to be reset. Example: A>DSKRESET P: ///1DUMP Syntax: DUMP filespec Emand can be abbreviated to ERA. ///2Option [CONFIRM] option informs the system to prompt for verification before erasing each file that matches the filespec. CONFIRM can be abbreviated to C. ///2Examples A>ERASE X.PAS Removes the file X.PAS from the disk in drive A. A>ERA *.PRN Confirm (Y/N)?Y All files with the filetype PRN are removed from the disk in drive A. PROG1.COM with RSX's PROG1 and PROG2. A>GENCOM MYPROG GENCOM takes MYPROG.COM, strips off the header and deletes all attached RSX's to restore it to its original COM format. A>GENCOM MYPROG PROG1 PROG2 GENCOM looks at the already-GENCOMed file MYPROG.COM to see if PROG1.RSX and PROG2.RSX are already attached RSX files in the module. If either one is already attached, GENCOM replaces it with the new RSX module. OtExplanation: HELP displays a list of topics and provides summarized information for CP/M 3 commands. HELP topic displays information about that topic. HELP topic subtopic displays information about that subtopic. One or two letters is enough to identify the topics. After HELP displays information for your topic, it displays the special prompt HELP> on your screen, followed by a list of subtopics. - Enter ? to display list of main topics. ackets enclose the modules to be deleted or replaced. Parentheses enclose the modules to be selected. LIB Modifiers Delete Replace If module name and filename are the same this shorthand can be used: Select (modFIRST-modLAST,mod1,mod2,...,modN) ///2Examples d in the command line. GET takes system and program input from the file until the file is exhausted or until GET reads a GET console command from the file. ///2Examples A>GET FILE XINPUT A>MYPROG Tells the system to activate the GET utility. Since SYSTEM is not specified, the system reads the next input line from the console and executes MYPROG. If MYPROG program requires console input, it is taken fec{modifier} ... } Explanation: A library is a file that contains a collection of object modules. Use the LIB utility to create libraries, and to append, replace, select or delete modules from an existing library. Use LIB to obtain information about the contents of library files. LIB creates and maintains library files that contain object modules in Microsoft REL file format. These modules are produced by Digital Research's relocatable macro-assembler program, RMACherwise, GENCOM appends the specified RSX files to the COM file. ///1GET Syntax: GET {CONSOLE INPUT FROM} FILE filespec{[{ECHO|NO ECHO} | SYSTEM]} GET {CONSOLE INPUT FROM} CONSOLE Explanation: GET directs the system to take console input from a file for the next system command or user program entered at the console. Console input is taken from a file until the program terminates. If the file is exhausted before program input is termina - Enter a period and subtopic name to access subtopics. - Enter a period to redisplay what you just read. - Press the RETURN key to return to the CP/M 3 system prompt. - [NOPAGE] option disables the 24 lines per page console display. - Press any key to exit a display and return to the HELP> prompt. Examples: A>HELP A>HELP DATE A>HELP DIR OPTIONS A>HELP>.OPTIONS HELP>SET HELP>SET PASSWORD HELP>.PASSWORD HELP>. A>LIB TEST4[P] Displays all modules and publics in TEST4.REL. A>LIB TEST5[P]=FILE1,FILE2 Creates TEST5.REL from FILE1.REL and FILE2.REL and displays all modules and publics in TEST5.REL. A>LIB TEST=TEST1(MOD1,MOD4),TEST2(C1-C4,C6) Creates a library file TEST.REL from modules in two source files. TEST1.REL contributes MOD1 and MOD4. LIB extracts modules C1, C4, and all the modules located between them, as well as module C6 rom the file XINPUT. When MYPROG terminates, the system reverts back to the console for console input. A>GET FILE XIN2 [SYSTEM] Immediately directs the system to get subsequent console input from file XIN2 because it includes the SYSTEM option. The system reverts back to the console for console input when it reaches the end of file in XIN2. Or XIN2 may redirect the system back to the console if it co, or any other language translator that pruduces modules in Microsoft REL file format. You can use LINK-80 to link the object modules contained in a library to other object files. LINK-80 automatically selects from the library only those modules needed by the program being linked, and then forms an executable file with a filetype of COM. ///2Options I The INDEX option creates an indexed library file of type .IRL. LINK-80 searches fastted, the program looks for subsequent input from the console. If the program terminates before exhausting all its input, the system reverts back to the console for console input. With the SYSTEM option, the system immediately goes to the specified file for console input. The system reverts to the console for input when it reaches the end of file. Re-direct the system to the console for console input with the GET CONSOLE INPUT FROM CONSOLE command HELP> ///1HEXCOM Syntax: HEXCOM filename Explanation: The HEXCOM Command generates a command file (filetype .COM) from a .HEX input file. It names the output file with the same filename as the input file but with filetype .COM. HEXCOM always looks for a file with filetype .HEX. Example: A>HEXCOM B:PROGRAM Generates a command file PROGRAM.COM from the input hex file PROGRAM.HEX. ///1INITDIR Syntax: INITDIRfrom TEST2.REL. A>LIB FILE2=FILE3 Creates FILE2.REL from FILE3.REL, omitting MODA which is a module in FILE3.REL. A>LIB FILE6=FILE5 Creates FILE6.REL from FILE5.REL, FILEB.REL replaces MODA. A>LIB FILE6=FILE5 Module THISNAME is in FILE5.REL. When LIB creates FILE6.REL from FILE5.REL the file THISNAME.REL replaces the similarly named module THISNAME. A>LIB FILE1[I]=B:FILE2(PLOTS,FIND,Sntains a GET CONSOLE command. A>GET CONSOLE Tells the system to get console input from the console. This command may be used in a file (previously specified in a GET FILE command), which is already being read by the system for console input. It is used to re-direct the console input back to the console before the end-of-file is reached. ///1HELP Syntax: HELP {topic} {subtopic1 ... subtopic8} {[NOPAGE|LIST]} er on indexed libraries than on non-indexed libraries. M The MODULE option displays module names. P The PUBLICS option displays module names and the public variables for the new library file. D The DUMP option displays the contents of object modules in ASCII form. ///2Modifiers Use modifiers in the command line to instruct LIB to delete, replace, or select modules in a library file. Angle br as a command line in the input file. ///2Options ECHO specifies that input is echoed to the console. This is the default option. NO ECHO specifies that file input is not echoed to the console. The program output and the system prompts are not affected by this option and are still echoed to the console. SYSTEM specifies that all system input is immediately taken from the disk file specifie {d:} Explanation: The INITDIR Command initializes a disk directory to allow date and time stamping of files on that disk. INITDIR can also recover time/date directory space. Example: A>INITDIR C: INITDIR WILL ACTIVATE TIME-STAMPS FOR SPECIFIED DRIVE. Do you want to re-format the directory on C: (Y/N)?Y ///1LIB Syntax: LIB filespec{[I|M|P|D]} LIB filespec{[I|M|P]}=filespec{modifier} {,filespEARCH-DISPLAY) Creates FILE1.IRL on drive A from the selected modules PLOTS, FIND, and modules SEARCH through the module DISPLAY, in FILE2.REL on drive B. ///1LINK Syntax: LINK d:{filespec,{[options]}=}filespec{[options]}{,...} Explanation: LINK combines relocatable object modules such as those produced by RMAC and PL/I-80 into a .COM file ready for execution. Relocatable files can contain external referenNK-80 on drive A uses as input MYFILE.REL on drive B and produces the executable machine code file MYFILE.COM on drive B. The [NR] option specifies no symbol table file. A>LINK m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3, resolves their external references, and produces the executable machine code file m1.COM. A>LINK m=m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3 and prodrive for .PRN file (A-O, X, P, Z) S destination drive for .SYM file Assembly Options That Modify Contents Of Output File +L lists input lines read from macrollibrary .LIB files -L suppresses listing (default) +M lists all macro lines as they are processed during assembly -M suppresses all macro lines as they are read during assembly *M lists only hex generated by macro expansions +Q lists all LOCAL symbols in the symbol list -Q suppresses allble file for execution under MP/M in relocatable segment OR Output .RSP resident system process file for execution under MP/M OS Output .SPR system page relocatable file for execution under MP/M Phhhh Program origin; changes default program origin address to hhhh. Default is 0100H. Q Lists symbolsF command allows a requester to log off from a specified server. Once a requester has logged off, the server cannot be accessed again until you issue a LOGIN command. [mstrID] is an optional two-digit server processor ID; the default is [00]. Example: A>LOGOFF [02] ///1mac Syntax: MAC filename {$options} Explanation: MAC, the CP/M 3 macro assembler, reads assembly language statements from a file of type .ASM, assembles the statementces and publics. Relocatable files can reference modules in library files. LINK searches the library files and includes the referenced modules in the output file. See the CP/M 3 Programmer's Utilities Guide for a complete description of LINK- 80. ///2Options Use LINK option switches to control execution parameters. Link options follow the file specifications and are enclosed within square brackets. Multiple switches are separatedduces the executable machine code file m.COM. A>LINK MYFILE,FILE5[s] The [s] option tells LINK-80 to search FILE5 as a library. LINK-80 combines MYFILE.REL with the referenced subroutines contained in FILE5.REL on the default drive A and produces MYFILE.COM on drive A. ///1LOCAL Syntax: LOCAL local-dev Explanation: The LOCAL command enables a requester to reassign selected I/O back to local from the network. LOCAL symbols in the symbol list (default) +S appends symbol file to print file -S suppresses creation of symbol file +1 produces a pass 1 listing for macro debugging in .PRN file -1 suppress listing on pass 1 (default) ///1MODE Syntax: MODE {d:{args}} Explanation: The MODE Command allows showing/configuring of the BIOS operating parameters on a disk drive. args is a comma-separate list of arguments. Valid arguments are: DS with leading question mark S Search preceding file as a library $Cd Destination of console messages d can be X (console), Y (printer), or Z (zero output). Default is X. $Id Source of intermediate files; d is disk drive A-P. Default is current drive. $Ld Source of library files; d is disk drive A-P. Default s, and produces three output files with the input filename and filetypes of .HEX, .PRN, and .SYM. Filename.HEX contains INTEL hexadecimal format object code. Filename.PRN contains an annotated source listing that you can print or examine at the console. Filename.SYM contains a sorted list of symbols defined in the program. ///2Examples A>MAC SAMPLE A>MAC SAMPLE $PB AA HB SX ///2options Use options to direct the input and output of MAC. by commas. LINK-80 Options A Additional memory; reduces buffer space and writes temporary data to disk B BIOS link in banked CP/M 3 system. 1. Aligns data segment on page boundary. 2. Puts length of code segment in header. 3. Defaults to .SPR filetype. Dhhhh Data origin; sets memory origin for commoThe LOCAL command updates the requester configuration table. local-dev is the specification of a local device such as LST:, A:,... CON:. Example: A>LOCAL P: ///1LOGIN Syntax: LOGIN {password}{[mstrID]} Explanation: The LOGIN command allows a requester to log in to a specified server. A requester must log in before any resources on the server can be accessed. Once a requester has logged in, it is not necessary to log in again even thoor SS = double or single sided QT, DT, ST = quad (192 tpi), double (96 tpi), single (48 tpi), or QTD, QTS, DTS = half track modes e.g. DTS is 48 tpi media in a 96 tpi drive. DD or SD = double or single density S6, S30, etc. = step rate in milliseconds MMS, Z37, Z37X etc. (media formats); the X implies extended format. If no drive (or arguments) is specified, a brief help is shown. Example: A>MODE C: is current drive. $Od Destination of of object file; d can be Z or disk drive A-P. Default is to same drive as first file in the LINK-80 command. $Sd Destination of symbol file; d can be Y or Z or disk drive A-P. Default is to same drive as first file in LINK-80 command. ///2Examples A>LINK b:MYFILE[NR] LI Use a letter with the option to indicate the source and destination drives, and console, printer, or zero output. Valid drive names are A thru O. X, P and Z specify console, printer, and zero output, respectively. Assembly Options That Direct Input/Output A source drive for .ASM file (A-O) H destination drive for .HEX file (A-O, Z) L source drive for macrolibrary .LIB files called by the MACLIB statement. P destination n and data area Gn Go; set start address to label n Lhhhh Load; change default load address of module to hhhh. Default 0100H Mhhhh Memory size; Define free memory requirements for MP/M modules. NL No listing of symbol table at console NR No symbol table file OC Output .COM command file. Default OP Output .PRL page relocataugh the requester might power down and then power up again. A requester can only be logged off a server by an explicit LOGOFF command issued from the requester. password is an optional 8 ASCII-character password; the default password is PASSWORD. [mstrID] is an optional two-digit server processor ID; the default is [00]. Not all servers require login. Example: A>LOGIN mypasswd[02] ///1LOGOFF Syntax: LOGOFF {[mstrID]} Explanation: The LOGOF MODE v3.106 PRESENT Configuration is: Drive - C: (33) 5.25 inch floppy Controller - KAYPRO Floppy Disk Controller 3.100d Recording Density - Double Sides - 2 Tracks per Inch - 48 Step Rate - 6 milliseconds Format Type - KAYPRO ///1NETSTAT Syntax: NETSTAT Explanation: The NETSTAT command is a terse version of CPNETSTS. It only shows networked devices. Example: t[g1]=oldraft.txt COPY, RENAME AND GET FROM USER 1 A>PIP newdraft.txt=oldraft.txt[g1] COPY TO/FROM LOGICAL DEVICES A>PIP b:funfile.sue=con: A>PIP lst:=con: A>PIP lst:=b:draft.txt[t8] A>PIP prn:=b:draft.txt ///2options PIP OPTIONS A Archive. Copy only files that have been changed since the last copy. C Confirm. PIP prompts for confirmation before each file copy. Dn Delete any characters past column n. E Echo of program MYPROG to file XOUT. The output is not echoed to the printer. A>PUT PRINTER OUTPUT TO FILE XOUT2 [ECHO,SYSTEM] Directs all printer output to file XOUT2 as well as to the printer (with ECHO option), and the PUT is in effect until you enter a PUT PRINTER OUTPUT TO PRINTER command. A>PUT CONSOLE OUTPUT TO CONSOLE Directs console output back to the console. A>PUT PRINTER OUTPUT TO PRINTER Directs printer output bafile with patch number 2. ///1PIP (copy) Syntax: DESTINATION SOURCE PIP d:{Gn} | filespec{[Gn]} = filespec{[o]},... | d:{[o]} Explanation: The file copy program PIP copies files, combines files, and transfers files between disks, printers, consoles, or other devices attached to your computer. The first filespec is the destination. The second filespec is the source. Use two or more source filespecs separated by commas toll subsequent console/printer output to the specified file. This option terminates when you enter the PUT CONSOLE or PUT PRINTER command. ///2Options [ {ECHO | NO ECHO} {FILTER | NO FILTER} | {SYSTEM} ] ECHO specifies that output is echoed to the console. This is the default option when you direct console output to a file. NO ECHO specifies that file output is not echoed to the consol A>NETSTAT CP/NET Status ============= Requester ID = 02H Network Status Byte = 10H Device status: Drive P: = Drive F: on Network Server ID = 00H ///1NETWORK Syntax: NETWORK local-dev=server-dev{[srvrID]} Explanation: The NETWORK command enables a requester to assign selected I/O to the network. The NETWORK command updates the requester Configuration table. local-dev is the specification of a local device transfer to console. F Filter form-feeds from source data. Gn Get from or go to user n. H Test for valid Hex format. I Ignore :00 Hex data records and test for valid Hex format. K Kill display of filespecs on console. L Translate upper case to lower case. N Number output lines O Object file transfer, ^Z ignored. Pn Set page length to n. (default n=60) Qs^Z Quit copying from source at string s. R Read files that have been set to SYStem. Ss^Z Stck to the printer. ///1RENAME Syntax: RENAME {new-filespec=old-filespec} Explanation: RENAME lets you change the name of a file in the directory of a disk. To change several filenames in one command use the * or ? wildcards in the file specifications. The RENAME command can be abbreviated REN. REN prompts you for input. ///2Examples A>RENAME NEWFILE.BAS=OLDFILE.BAS The file OLDFILE.BAS changes to NEWFILE.BAS on drive A. A>RENAME T combine two or more files into one file. [o] is any combination of the available options. The [Gn] option in the destination filespec tells PIP to copy your file to that user number. PIP with no command tail displays an * prompt and awaits your series of commands, entered and processed one line at a time. The source or destination can be any CP/M 3 logical device. ///2Examples COPY A FILE FROM ONE DISK TO ANOTHER A>PIP b:=a:draft.txt A>PIP b:drafte. NO ECHO is the default for the PUT PRINTER command. FILTER specifies filtering of control characters, which means that control characters are translated to printable characters. For example, an ESCape character is translated to ^[. NO FILTER means that PUT does not translate control characters. This is the default option. SYSTEM specifies that system output as well such as A:, B: ... P:, CON: or LST:. server-dev is the specification of a server device such as A:, B: ... P: in the case of a disk device, or 0, 1 ... 15 in the case of CON: or LST:. A missing server-dev defaults to 0 in the case of CON: or LST:. [srvrID] is an optional two-digit hexadecimal server processor ID. The default is [00]. Example: A>NETWORK P:=F: ///1NTPDATE Syntax: NTPDATE {server} Explanation: The NTPDATE Command sets theart copying from the source at the string s. Tn Expand tabs to n spaces. U Translate lower case to upper case. V Verify that data has been written correctly. W Write over Read Only files without console query. Z Zero the parity bit. All options except C,G,K,O,R,V and W force an ASCII file transfer, character by character, terminated by a ^Z. ///1PUT Syntax: PUT CONSOLE {OUTPUT TO} FILE filespec {option} | CONSOLE PUT PRINTER {OUTPUT TO}he system prompts for the filespecs: Enter New Name:X.PRN Enter Old Name:Y.PRN Y .PRN=X .PRN A> File X.PRN is renamed to Y.PRN on drive A. B>REN A:PRINTS.NEW = PRINCE.NEW The file PRINCE.NEW on drive A changes to PRINTS.NEW on drive A. A>RENAME S*.TEX=A*.TEX The above command renames all the files matching A*.TEX to files with filenames S*.TEX. A>REN B:NEWLIST=B:OLDLIST .txt = a: B3>PIP myfile.dat=A:[G9] A9>PIP B:[G3]=myfile.dat COPY A FILE AND RENAME IT A5>PIP newdraft.txt=oldraft.txt C8>PIP b:newdraft.txt=a:oldraft.txt COPY MULTIPLE FILES A>PIP b:=draft.* A>PIP b:=*.* B>PIP b:=c:.*.* C>PIP b:=*.txt[g5] C>PIP a:=*.com[wr] B>PIP a:[g3]=c:*.* COMBINE MULTIPLE FILES A>PIP b:new.dat=file1.dat,file2.dat COPY, RENAME AND PLACE IN USER 1 A>pip newdraft.tx as program output is written to the file specified by filespec. Output is written to the file until a subsequent PUT CONSOLE command redirects console output back to the console. ///2Examples A>PUT CONSOLE OUTPUT TO FILE XOUT [ECHO] Directs console output to file XOUT with the output echoed to the console. A>PUT PRINTER OUTPUT TO FILE XOUT A>MYPROG Directs the printer output local time to that of the specified server. Default server is 00. Server ID is specified in hexadecimal. Example: A>NTPDATE 2 Time was set to: 04/16/16 18:34:12 ///1PATCH Syntax: PATCH filename{.typ} {n} Explanation: The PATCH command displays or installs patch number n to the CP/M 3 system or command files. The patch number n must be between 1 and 32 inclusive. Example: A>PATCH SHOW 2 Patches the SHOW.COM system FILE filespec {option} | PRINTER PUT CONSOLE {OUTPUT TO} CONSOLE PUT PRINTER {OUTPUT TO} PRINTER Explanation: PUT puts console or printer output to a file for the next command entered at the console, until the program terminates. Then console output reverts to the console. Printer output is directed to a file until the program terminates. Then printer output is put back to the printer. PUT with the SYSTEM option directs a The file OLDLIST changes to NEWLIST on drive B. Since the second drive specifier, B: is implied by the first one, it is unnecessary in this example. The command line above has the same effect as the following: A>REN B:NEWLIST=OLDLIST or A>REN NEWLIST=B:OLDLIST ///1RMAC Syntax: RMAC filespec {$Rd | $Sd | $Pd} Explanation: RMAC, a relocatable macro assembler, assembles .ASM files of into .REL fRD=password] SET [PASSWORD= ///3Examples A>SET [NAME=DISK100] Labels the disk on the default drive as DISK100. A>SET [PASSWORD=SECRET] Assigns SECRET to the disk label. A>SET [PASSWORD= Nullifies the existing password. ///2Passwords SET [PROTECT=ON] SET [PROTECT=OFF] SET filespec [PASSWORD=password] SET filespec [PROTECT=READ] SET filespec [PROTECT=WRITE] SET filesp [CREATE=ON] turns on CREATE time stamps on the disk in the default or specified drive. To record the creation time of a file, the CREATE option must be turned on before the file is created. [ACCESS=ON] turns on ACCESS time stamps on the disk in the default or specified drive. ACCESS and CREATE options are mutually exclusive; only one can be in effect at a time. eads a file into memory. Your program exits to the SAVE utility which prompts you for a filespec to which it copies the contents of memory, and the beginning and ending address of the memory to be SAVEd. ///2Example A>SAVE Activates the SAVE utility. Now enter the name of the program which loads a file into memory. A>SID dump.com Next, execute the program. #g0 When the program exits, SAVE intercepts the return to the system andurns on or off the user-definable file attribute F1. F2=ON|OFF turns on or off the user-definable file attribute F2. F3=ON|OFF turns on or off the user-definable file attribute F3. F4=ON|OFF turns on or off the user-definable file attribute F4. ///3Examples SET [PROTECT=ON] Turns on password protection for all the files on the disk. You must turn on password protection befiles that you can link to create .COM files. ///2options RMAC options specify the destination of the output files. Replace d with the destination drive letter for the output files. Option d=output option R- drive for REL file (A-O, Z) S- drive for SYM file (A-O, X, P, Z) P- drive for PRN file (A-O, X, P, Z) A-O specifies drive A-O. X means output to the console. P means ouec [PROTECT=DELETE] SET filespec [PROTECT=NONE] SET filespec [attribute-options] ///3Modes Password Protection Modes Mode Protection READ The password is required for reading, copying writing, deleting or renaming the file. WRITE The password is required for writing, deleting or renaming the file. You do not need a password to read the file. If you turn on the ACCESS time stamp on a disk that previously had CREATE time stamp, the CREATE time stamp is automatically turned off. [UPDATE=ON] turns on UPDATE time stamps on the disk in the default or specified drive. UPDATE time stamps record the time the file was last modified. ///3Examples A>SET [ACCESS=ON] A>SET [CREATE=ON,UPDATE=ON] ///2 prompts the user for the filespec and the bounds of memory to be SAVEd. SAVE Ver 3.0 Enter file (type RETURN to exit):dump2.com If file DUMP2.COM exists already, the system asks: Delete dump2.com? Y Then the system asks for the bounds of memory to be saved: Beginning hex address: 100 Ending hex address: 400 The contents of memory from 100H (Hexadecimal) to 400H is copied to file DUMP2.COM. ///1SET Syntax: SET [optionore you can assign passwords to files. SET [PROTECT=OFF] Disables password protection for the files on your disk. A>SET MYFILE.TEX [PASSWORD=MYFIL] MYFIL is the password assigned to file MYFILE.TEX. B>SET *.TEX [PASSWORD=SECRET, PROTECT=WRITE] Assigns the password SECRET to all the TEX files on drive B. Each TEX file is given a WRITE protect mode to prevent unauthorized editing. A>SET MYFILE.TEX [RO SYS] Sets MYFILE.TEtput to the printer. Z means zero output. ///2Example A>RMAC TEST $PX SB RB Assembles the file TEST.ASM from drive A, sends the listing file (TEST.PRN) to the console, puts the symbol file (TEST.SYM) on drive B and puts the relocatable object file (TEST.REL) on drive B. ///1RSXRM Syntax: RSXRM name Explanation: The RSXRM Command instructs a cooperating RSX to schedule itself for removal. The target RDELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a password password exists, this modifier can be used to delete the password. ///2Attributes RO sets the file attribute to Read-Only. RW sets the file attribute to Read-Write. SYS Drives Syntax: SET {d:} [RO] SET {d:} [RW] Example: A>SET B: [RO] Sets drive B to Read-Only. ///1SETDEF Syntax: SETDEF { d: {,d: {,d: {,d:}}}} {[ TEMPORARY = d: ] | [ ORDER = (typ {,typ}) ]} SETDEF [DISPLAY | NO DISPLAY] SETDEF [PAGE | NOPAGE] Explanation: SETDEF allows the user to display or define up to four drives for the program search order, the s] SET d: [options] SET filespec [options] Explanation: SET initiates password protection and time stamping of files. It also sets the file and drive attributes Read-Write, Read-Only, DIR and SYS. It lets you label a disk and password protect the label. To enable time stamping of files, you must first run INITDIR to format the disk directory. ///2Label Syntax: SET {d:} [NAME=labelname.typ] SET [PASSWOX to Read-Only and SYStem. ///2Default A>SET [DEFAULT=dd] Instructs the system to use dd as a password if you do not enter a password for a password-protected file. ///2Time-Stamps Syntax: SET [CREATE=ON] SET [ACCESS=ON] SET [UPDATE=ON] Explanation: The above SET commands allow you to keep a record of the time and date of file creation and update, or of the last access and update of your files. ///3Options SX must intercept and understand BDOS function 60 with an RSX PB FUNC of 113 and PARAMETER1 pointing to an 8-character blank-padded string representing the name of the RSX to remove. If an RSX is loaded multiple times, only the first instance will remove itself. Example: A>RSXRM NDOS3 ///1SAVE Syntax: SAVE Explanation: SAVE copies the contents of memory to a file. To use SAVE, first issue the SAVE command, then run your program which r sets the file attribute to SYS. DIR sets the file attribute to DIR. ARCHIVE=OFF means that the file has not been backed up (archived). ARCHIVE=ON means that the file has been backed up (archived). The Archive attribute can be turned on by SET or by PIP when copying a group of files with the PIP [A] option. SHOW and DIR display the Archive option. F1=ON|OFF tdrive for temporary files, and the file type search order. The SETDEF definitions affect only the loading of programs and/or execution of SUBMIT (SUB) files. SETDEF turns on/off the system Display and Console Page modes. When on, the system displays the location and name of programs loaded or SUBmit files executed, and stops after displaying one full console screen of information. ///2Examples A>SETDEF Displays current SETDEF parameters. {,sym-filespec} for execution E*sym-filespec (Load) Load a symbol table file Fs,f,d (Fill) Fill memory with constant value s is the start address f is the finish address d is an eight-bit data item G{p}{,a{,b}} (Go) Begin Execution p is a start address mine) Examine/alter CPU state. f is flag bit C,Z,M,E or I. r is register A,B,D,H,S or P. ///2Examples A>SID CP/M 3 loads SID from drive A into memory. SID displays the # prompt when it is ready to accept commands. A>B:SID SAMPLE.HEX CP/M 3 loads SID and the program file SAMPLE.HEX into memory from drive B. ///2Utilities SID utilities, HIST.UTL and TRACE.UTL are special number of files assigned to them. A>SHOW C:[DIR] Displays the number of free directory entries on drive C. A>SHOW [DRIVE] Displays the drive characteristics of drive A. ///1SID Syntax: SID {pgm-filespec} {,sym-filespec} Explanation: The SID symbolic debugger allows you to monitor and test programs developed for the 8080 microprocessor. SID supports real-time breakpoints, fully monitored execution, symbolic disassembly 16 bit word T{n{,c}} (Trace) Trace Program Execution n is the number of program steps c is the utility entry address. T{W}{n{,c}} (Trace) Trace Without Call W instructs SID not to trace subroutines n is the number of program steps c is the utility entry ad A>SETDEF [TEMPORARY=C:] Sets disk drive C as the drive to be used for temporary files. A>SETDEF C:,* Tells the system to search for a program on drive C, then, if not found, search for it on the default drive. A>SETDEF [ORDER=(SUB,COM)] Instructs the system to search for a SUB file to execute. If no SUB file is found, search for a COM file. A>SETDEF [DISPLAY] Turns on the system display mode. Henceforth, the system a is a temporary breakpoint H (Hex) Displays all symbols with addresses in Hex H.a Displays hex, decimal, and ASCII values of a where a is a symbolic expression Ha,b Computes hex sum and difference of a and b where a and b are symbolicprograms that operate with SID to provide additional debugging facilities. The mechanisms for system initialization, data collection, and data display are described in the CP/M SID User's Guide. The HIST utility creates a histogram (bar graph) showing the relative frequency of execution of code within selected program segments of the test program. The HIST utility allows you to monitor those sections of code that execute most frequently. , assembly, and memory display and fill functions. SID can dynamically load SID utility programs to provide traceback and histogram facilities. ///2Commands Command Meaning As (Assemble) Enter assembly language statements s is the start address Cs{b{,d}} (Call) Call to memory location from SID s is the called dress U{W}{n{,c}} (Untrace) Monitor Execution without Trace n is the number of program steps c is the utility entry address W instructs SID not to trace subroutines V (Value) Display the value of the next available location in memory (NEXT), the next l displays the name and location of programs loaded or submit files executed. A>SETDEF [NO DISPLAY] Turns off the system Display mode. ///1SHOW Syntax: SHOW {d:}{[SPACE |LABEL |USERS |DIR |DRIVE]} Explanation: The SHOW command displays the following disk drive information: Access mode and the amount of free disk space Disk label Current user number and Number of files for each user number on the disk Number of free directory expressions Icommand tail (Input) Input CCP command line L{s}{,f} (List) List 8080 mnemonic instructions s is the start address f is the finish address Ms,h,d (Move) Move Memory Block s is the start address h is the high address of the block d is the destination start The TRACE utility obtains a backtrace of the instructions that led to a particular breakpoint address in a program under test. You can collect the addresses of up to 256 instructions between pass points in U or T modes. ///1SUBMIT Syntax: SUBMIT {filespec} {argument} ... {argument} Explanation: The SUBMIT command lets you execute a group (batch) of commands from a SUBmit file (a file with filetype of SUB). ///2Subfile The SUB faddress b is the value of the BC register pair d is the value of the DE register pair D{W}{s}{,f} (Display) Display memory in hex and ASCII W is a 16-bit word format s is the start address f is the finish address Epgm-filespec (Load) Load program and symbol tableocation after the largest file read in (MSZE), the current value of the Program counter (PC), and the address of the end of available memory (END) Wfilespec,s,f (Write) Write the contents of a contiguous block of memory to filespec. f is finish address X{f}{r} (Exaentries for the disk Drive characteristics ///2Examples A>SHOW A>SHOW [SPACE] Instructs the system to display access mode and amount of space left on logged-in drives. A>SHOW B: Show access mode for drive B and amount of space left on drive B. A>SHOW B:[LABEL] Displays label information for drive B. A>SHOW [USERS] Displays the current user number and all the users on drive A and the correspondingaddress P{p{,c}} (Pass) Pass point set, reset, and display p is a permanent breakpoint address c is initial value of pass counter Rfilespec{,d} (Read) Read Code/Symbols d is an offset to each address S{W}s (Set) Set Memory Values s is address where value is sent W isile can contain the following types of lines: Any valid CP/M 3 command Any valid CP/M 3 command with SUBMIT parameters ($0-$9) Any data input line Any program input line with parameters ($0 to $9) The command line cannot exceed 135 characters. The following lines illustrate the variety of lines which may be entered in a SUB file: DIR DIR *.BAK MAC $1 $$$4 PIP LST:=$1.PRN[T$2 $3 $5] DIR *.ASM PIP XREF {d:} filename {$P} Explanation: XREF provides a cross-reference summary of variable usage in a program. XREF requires the .PRN and .SYM files produced by MAC or RMAC for input to the program. The SYM and PRN files must have the same filename as the filename in the XREF command tail. XREF outputs a file of type .XRF. Examples: A>XREF b:MYPROG A>XREF b:MYPROG $P (WD1002 RESET) ani 00001100b lxi h,lpdwin1 ; floppy, win [,win] jrnz romZZ$ff ; win, [win,] floppy lxi h,lpdwin0 ; win, [win,] floppy lda 0fff6h ; drive C (floppy) romZZ$ff: rrc rrc ani 00000011b xri 00000011b ; 0=error, 1=ST, 2=QT sta fpytyp mov a,b sta fpysel romZZ$1: shld lptbl jmp gotrom rom17: ; 81-326, version 1.7R lxi h,0f800h shld romcrt lda 0f881h ; 02 = QT, 01 = ST sta fpytyp mvi a,'2' ; correct? jr romXX$0 ; floppy-only rom19: ; 81-302c, 81-277, 8from the file. Neither source nor destination drive is required to be networked, although that would be the normal case. The source filespec cannot be ambiguous if a destination filespec in given. Example: A>TR C:=P:*.ASM[C] ///1TYPE Syntax: TYPE {filespec {[ PAGE | NOPAGE ]}} Explanation: The TYPE command displays the contents of an ASCII character file on your screen. [PAGE] Causes the console listing to be displayed in p romcrt lxi d,00040h lxi b,16 ldir lda romid stax d ; 0050h: ROM identifer char inx d lda fpytyp stax d ; 0051h: floppy drive type (all same) inx d lda fpysel stax d ; 0052h: floppy drive select mask ; ***** lda reslen mov b,a ;B=reslen mvi c,0 lhld resend dcx h lda topres mov d,a mvi e,0 dcx d lddr lda bnklen ora a jz nobnk0 mov b,a mvi c,0 lhld bnkend dcx h lda topbnk mov d,a mvi e,0 dcx d lddr nobnk0: ; Before running OS, patch logi SUBMIT A>SUBMIT SUBA A>SUBMIT AA ZZ SZ A>SUBMIT B:START DIR E: ///2PROFILE.SUB Everytime you power up or reset your computer, CP/M 3 looks for a special SUBmit file named PROFILE.SUB to execute. If it does not exist, CP/M 3 resumevers equ '0e' ; March 18, 2017 19:52 drm "LDCPM3.ASM" maclib Z80 cpm equ 0 bdos equ 5 tbuff equ 80h msgout equ 9 reset equ 13 openf equ 15 read equ 20 sdma equ 26 lf equ 10 cr equ 13 org 100h LOADER: lxi sp,stack ; ROM 81-292 uses 0fd74h ; U-ROM 81-478 uses 0fe9ah ; ROM 81-302 uses 0fd5ch ; ROM 81-326 uses 0f800h ; Identify ROM by... ; we can't map ROM in, we are in low memory. ; can't call ROM, either. ; U-ROM places '2.01' in 0fff8h... ; 81-292 places copyout in 0fde1-188, version series 1.9 lxi h,0fd5ch shld romcrt mvi a,'3' sta romid ; All floppies are ST... mvi a,1 sta fpytyp sta fpysel ; get floppy/win determinination ; 0f700h: cur dsk type, 0=win, (ff) floppy ; 0f701h: drive A type... ; 0f702h: cur SPT? lda 0f701h ora a lxi h,lpdwin1 ; floppy, win [,win] jrnz romZZ$1 lxi h,lpdwin0 ; win, [win,] floppy jr romZZ$1 romXX: ; 81-292a, no visible version - floppy-only lxi h,0fd74h shld romcrt ; All floppies are ST... mvi a,aged mode; i.e., stop automatically after listing n lines of text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from drive B on your screen twenty cal-physical drive table. call setlpd ; lhld cstart pchl loadf: ;ORA A ;DE = top address (max+1) ;MOV D,A ;MVI E,0 MOV A,H RAL MOV H,A read0: XCHG LXI B,-128 DAD B XCHG PUSH D PUSH H CALL dmaset CALL readfile POP H POP D DCR H JNZ read0 RET dmaset: MVI C,sdma CALL bdos RET readfile: MVI C,read LXI D,cpm3$sys CALL bdos ORA A LXI D,rderr RZ errmsg: MVI C,msgout CALL bdos jmp cpm chkuni: lxi h,0fff8h mov a,m inx h cs normal operation. If the PROFILE.SUB file exists, the system executes the commands in the file. This file is convenient to use if you regularly execute a set of commands before you do your regular session on the computer. ///1TPA Syntax: TPA Explanation: The TPA Command displays the amount of memory available for TPA. The amount of memory is a direct translation of the current BDOS entry page, including any active RSXs. This can be used to d5h (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) ; 81-302 places copyout in 0f919h (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) ; 81-326 places copyout in 0f822h (DB 14 CB BF D3 14 ED B0 DB 14 CB FF D3 14 C9) call chkuni jz rom20 lxi h,0f822h call chksig jz rom17 lxi h,0f919h call chksig jz rom19 lxi h,0fde5h call chksig jz romXX lxi d,badrom mvi c,msgout call bdos jmp cpm gotrom: lxi d,rommsg mvi c,msgout call bdos mvi c,reset call bdos MVI C,openf LXI D,1 sta fpytyp mvi a,'2' romXX$0: sta romid mvi a,3 sta fpysel lxi h,lpdfpy ; floppy only jr romZZ$1 setlpd: ; locate lptbl... update it lhld cstart ; assume this is BIOS base lxi d,100 ; offset to logical-physical drive table dad d mov e,m inx h mov d,m lhld lptbl mov a,h ora l rz lxi b,3 ; TODO: allow more drives? ldir ret cpm3$sys: DB 0,'CPM3 SYS',0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0 topres: db 0 reslen: db 0 topbnk: db 0 bnklfour lines at a time. ///1USER Syntax: USER {number} Explanation: The USER command sets the current user number. The disk directory can be divided into distinct groups according to a "User Number." User numbers range from 0 through 15. ///2Examples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: pi '2' rnz mov a,m inx h cpi '.' rnz mov a,m inx h cpi '0' rnz mov a,m inx h cpi '1' ret ; HL = prospective location chksig: lxi d,signature mvi b,siglen chk0: ldax d cmp m rnz inx h inx d djnz chk0 xra a ret rom20: lxi h,0fe9ah shld romcrt mvi a,'U' sta romid mvi b,3 ; start out assuming floppy-only lda 0fff7h cpi 0ffh ; floppy-only lxi h,lpdfpy ; floppy only lda 0fff4h ; drive A jrz romZZ$ff mvi b,1 ; floppy/win, must not touch DS2 etermine if RSXs are resident, by comparing the TPA to the value seen immediately after boot. Example: A>TPA 57.25K TPA ///1TR Syntax: TR d:{filespec}=filespec[C|U] Explanation: The TR Command copies one or more files and translates line endings between Unix and CP/M conventions. The option C causes every line feed character to be prefixed with a carriage return, unless already present. The U option removes all carriage returns cpm3$sys CALL bdos CPI 255 LXI D,nofile JZ errmsg LXI D,tbuff CALL dmaset CALL readfile LXI H,tbuff LXI D,topres lxi b,6 ldir CALL readfile MVI C,msgout LXI D,tbuff CALL bdos LDA reslen MOV d,A ; LDA topres mvi e,0 lxi h,buffer dad d shld resend xchg call loadf LDA bnklen ORA A JZ nobnk MOV d,A ; LDA topbnk mvi e,0 lhld resend dad d shld bnkend xchg CALL loadf nobnk: di ; ***** this should be part of COLD BOOT in CPM3LDRK lhlden: db 0 cstart: dw 0 resend: dw 0 bnkend: dw 0 ; This code is located in high RAM for certain ROM versions signature: in 014h res 7,a out 014h ldir in 014h setb 7,a out 014h ret siglen equ $-signature badrom: db 7,'Unknown ROM version!',cr,lf,'$' rommsg: db 'LDCPM3 vers 3.10' dw vers db ' - Got ROM id ' romid: db '.',cr,lf,'$' romcrt: dw 0 lptbl: dw 0 fpytyp: db 0 ; 1=ST, 2=QT, else error (no floppy?) fpysel: db 0 ; available floppy select bits, 01 or 03... lpdwin0; System Control Block definitions public @civec,@covec,@aivec,@aovec,@lovec public @mxtpa,@ermde,@date,@hour,@min,@sec scb equ 0fb9ch @civec equ scb+22h @covec equ scb+24h @aivec equ scb+26h @aovec equ scb+28h @lovec equ scb+2ah @ermde equ scb+4bh @date equ scb+58h @hour equ scb+5ah @min equ scb+5bh @sec equ scb+5ch @mxtpa equ scb+62h end sctl equ 014h ;status/ctrl bits extrn @ctbl,@vect cseg ;common memory, other parts in banked. dw thread db dev0,ndev jmp init jmp nullst jmp nullin jmp outst jmp output dw strcnt dw tblcnt dw modcnt strcnt: db 'KAYPRO ',0,'Parallel Printer ',0,'v3.10' dw vers db '$' modcnt: db 00000000b,00000000b,10000000b,port thread equ $ dseg ;banked memory. tblcnt: ;initial value only, copied by BIOS to its table. db 'LPT ',00000010b,0 ;Output, no baud, no protocal init: ret nullin: mvi a,1ah ret output: outp0: call outst jrz outp0 ; wait for not busy mov a,c out port maclib z80 numeric equ 1 ; Numeric Keypad codes standard equ 0 ; 81-292a ROM codes ; else: return raw code from keyboard ; TODO: use commandline options to select keypad codes org 0100h lxi sp,stack ; TODO: check for CP/M 3? mvi c,201 ; keyboard device call search jc nokbd ; double check sanity ora a jnz nokbd ; TODO: more sanity checks? ; HL -> jmp init lxi d,5*3+4 dada d mov e,m inx h mov d,m ; DE = modes table lxi h,4 dad d ; HL = keycnv xchg l: db 50,51,33 lpdwin1: db 33,50,51 lpdfpy: db 33,34,35 nofile: DB cr,lf,'error: File not found: CPM3.SYS',cr,lf,'$' rderr: DB cr,lf,'error: Read failure: CPM3.SYS',cr,lf,'$' ds 64 stack: ds 0 buffer: ds 0 end xamples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: XREF {d:} filename {$P} Explan; PUTSYS for WD1002 with ST412, CP/M 2.2u and "Universal" ROM series 2.0 ; DO NOT USE for older ROM! (maybe it will work...) ; TODO: check ROM and abort... bdos equ 5 ; BDOS functions msgout equ 9 org 00100h start: mvi c,msgout lxi d,signon call bdos lda sysimg cpi 018h ; JR opcode jnz error lda sysimg+1 cpi 0feh ; "JR $" operand jnz error lhld nrec lxi d,003ch ora a dsbc d jnc error call setcks lhld nrec lxi d,3 dad d srlr h rarr l srlr h rarr l ; ; send data di in sysctl ani 10110111b out sysctl ori 00001000b out sysctl ei ret outst: in sysctl xri 01000000b ani 01000000b rz nullst: ori true ret ; return true if ready end  mov e,m inx h mov d,m lhld lptbl mov a,h ora l rz lxi b,3 ; TODO: allow more drives? ldir ret cpm3$sys: DB 0,'CPM3 SYS',0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0 topres: db 0 reslen: db 0 topbnk: db 0 bnklxi h,keypad lxi b,kplen ldir jmp cpm search: lhld cpm+1 lxi d,31*3 dad d pchl bs eq 8 lf equ 10 vt equ 11 ff equ 12 cr equ 13 keypad: if numeric ; Number Pad conversion db 0, '0', '.', 0, 0 db '1', '2', '3', cr, 0 db '4', '5', '6', ',', 0 db 0, '7', '8', '9', '-' db 0, vt, lf, bs, ff else if standard ; As returned by ROM 81-292a db 0, 084h, 091h, 0, 0 db 085h, 086h, 087h, 090h, 0 db 088h, 089h, 08ah /4 128->512 blocks inx h ; +1 for boot params sector shld nsec call home lxi h,0 xra a shld track sta sector lxi h,sysimg mvi a,0 trk0: shld bufptr sta sector push psw call write lda nsec dcr a sta nsec jrz done lhld bufptr lxi d,512 dad d pop psw inr a jr trk0 ; finish track done: ret setcks: lxi h,sysimg lxi d,0 lxi b,510 setck0: mov a,e add m mov e,a mod a,d aci 0 mov d,a inx h dcx b mov a,b ora c jrnz setck0 xchg shld c, 08fh, 0 db 0, 08bh, 08ch, 08dh, 08eh db 0, 080h, 081h, 082h, 083h else ; "neutral" - same as raw code from keyboard db 0, 0b1h, 0b2h, 0, 0 db 0c0h, 0c1h, 0c2h, 0c3h, 0 db 0d0h, 0d1h, 0d2h, 0d3h, 0 db 0, 0e1h, 0e2h, 0e3h, 0e4h db 0, 0f1h, 0f2h, 0f3h, 0f4h endif endif kplen equ $-keypad ds 64 stack: ds 0 end vers equ '0c' ; December 21, 1985 15:57 drm "CENTR.ASM" ;******************************************************** ; Centronics Printer module for the KAYPRO * ; Copyright (C) 1985 Douglas Miller * ;******************************************************** maclib Z80 false equ 0 true equ not false dev0 equ 206 ndev equ 1 port equ 018h ;parallel printer port sysctl equ 014h ;status/ctrl bits extrn @ctbl,@vect cseg ;common memory, other parts in banked. dw thread db dev0,ndevksum ret write: call setlba call wrsec rz mvi c,msgout lxi d,l016dh ; write fault call bdos die: jmp die l016dh: db 13,10,'DISK WRITE FAULT',13,10,'$' setlba: lda track mvi c,a call setcyl lda sector mvi c,a call setsec ret home: call setsdh mvi a,011h ; RESTORE out 087h call getbsy xra a out 084h out 085h mvi a,070h ; SEEK out 087h getbsy: in 087h bit 7,a jrnz getbsy ret setcyl: lhld track ; track srlr h rarr l mvi a,l out 0er dte equ sio1+0 ;terminal equip. modem equ sio2+1 ;modem cseg ;common memory, other parts in banked. dw thread db dbase+dev0,ndev jmp intsio jmp instsio jmp inputsio jmp outstsio jmp outputsio dw strsio dw tblsio dw modsio strsio: db 'KAYPRO ',0,'Z80-SIO handler ',0,'v3.10' dw vers db '$' ; 7=DTR, 6=, 5=CTS, 4=sync 3=DCD : 2=, 1=RTS, 0= modsio: db 00100000b,10100010b,00110100b,dce db 00101000b,10101010b,00110100b,dte db 00101000b,10101010b,00110100b,modem thre; NETWORK DISK OPERATING SYSTEM FOR CP/NET on CP/M Plus v3 ; ; 1982.12.31. exact date unknown ; 2016.05.20. adapted for RSX on CP/M Plus ; Dropped support for remote console/list, due to BIOS intercept issues. ; BIOS intercept is a problem because of the transient nature of RSXs. ; Could add back support for "well-behaved" LIST OUTPUT users, ; provided BIOS intercept is not required. ; ;TITLE NETWORK DISK OPERATING SYSTEM FOR CP/NET SLAVE maclib z80 extrn NTWKIN, NTWKST, CNFTBL, SNDMSG, RCVMS ; return with zero ori true ret outputsio: mov a,c push psw outp0: call outstsio jrz outp0 ; wait for TxEmpty, HL->port pop psw mov c,m outp a ; send data ret outstsio: call vector os0: mov c,m dcx h dcx h inr c inr c mvi a,00010000b ;reset ext/status change outp a inp a xra m dcx h ; ana m ; [ZR] = ready ani 00111000b jrnz nrdy inp a ani 04h ; test xmit holding register empty rz ; ori true ret ; return true if ready nrdy: xra a84h mvi a,h out 085h ret setsec: mvi a,c out 083h ; sector ret setsdh: in 014h ani 11111101b ; RESET ori 000h out 014h lda track ; head (track LSB) ani 001h ori 0a8h out 086h ; SDH ret wrsec: call setsdh in 084h out 084h lxi b,0080h ; '00' for 256, '80' for data port lhld bufptr mvi a,030h ; WRITE out 087h otir otir call getbsy ani 001h ret signon: db 13,10,'PUTSYS VER 2.0u',13,10,'$' track: dw 0 sector: dw 0 bufptr: dw 0 nsec: dw 0 ad equ $ dseg ;banked memory. tblsio: ;initial values only, copied by BIOS to its table. db 'DCE ',00001111b,14 ;I/O, soft-baud, no protocal, 9600 db 'DTE ',00001111b,14 ;I/O, soft-baud, no protocal, 9600 db 'MODEM ',00001011b,6 ;I/O, hard-baud, no protocal, 300 ; all serial vector: mov a,b ;device number sui dev0 add a add a ;*4 mov c,a add a ;*8 mov e,a mvi b,0 mov d,b lxi h,tblsio+6 dad d xchg lxi h,modsio+3 dad b ret intsio: call vector dcxG, NTWKBT, CFGTBL ; ; ; EQUATIONS OF DATA ; LF EQU 0AH ;LINE FEED CR EQU 0DH ;CARRIAGE RETURN EOF EQU 1AH ;CTRL-Z IS END OF FILE LEOF EQU 0ffh ;-1 is logical end of file ; TOP equ 0000h CDISK equ 0004h BDOS equ 0005h SYSDMA equ 0080h TPA equ 0100h SCTLNG equ 128 ;ONE SECTOR LENGTH ; ; EQUATIONS OF DOS FUNCTION ; CCNDIN EQU 3 ;CONSOLE INPUT WITH DEVICE CODE CCNDOT EQU 4 ;CONSOLE OUTPUT WITH DEVICE CODE CBUFPR EQU 9 ;BUFFER PRINT CRDBUF EQU 10 ;READ BUFFER CCONST EQU 11 ;GET CONSOLE S ret ;speed$table: ; DTE,DCE ;0 db 00h ;no baud rate ;1 db 0 ;50 ;2 db 1 ;75 ;3 db 2 ;110 ;4 db 3 ;134.5 ;5 db 4 ;150 ;6 db 5 ;300 ;7 db 6 ;600 ;8 db 7 ;1200 ;9 db 8 ;1800 ;10 db 10 ;2400 ;11 db 11 ;3600 ;12 db 12 ;4800 ;13 db 13 ;7200 ;14 db 14 ;9600 ;15 db 15 ;19200 end  org 0900h ; This is where MOVCPM, SYSGEN, etc. ; leave the system image. sysimg: ds 2 ; "JR $" ccp: ds 2 entry: ds 2 nrec: ds 2 ds 502 ; cksum: ds 2 ; end of 512-byte sector ; rest of system image follows... end c,201 ; keyboard device call search jc nokbd ; double check sanity ora a jnz nokbd ; TODO: more sanity checks? ; HL -> jmp init lxi d,5*3+4 dada d mov e,m inx h mov d,m ; DE = modes table lxi h,4 dad d ; HL = keycnv xchg l h is1: bit 7,m rnz push d mov a,m ani 00110000b ; bits per char rlc ; -bb----- mov e,a ; Tx image setb 3,e ; Tx Enable rlc ; bb------ ori 00000001b ; Rx Enable mov d,a ; Rx image mov a,m ani 00001111b ori 01000000b ; 16x clock mov b,a ; WR4 image dcx h mov a,m ; ani 10000010b ; DTR, RTS ora e mov e,a ; Tx control, with RTS/DTR inx h inx h mov c,m inr c inr c mvi a,4 outp a outp b ; WR4 inr a outp a outp e ; WR5 mvi a,3 outp a outp d TATUS CGETVR EQU 12 ;GET VERSION NUMBER CRSDSK EQU 13 ;RESET DISK COPEN EQU 15 ;OPEN FILE CCLOSE EQU 16 ;CLOSE FILE CSRFST EQU 17 ;SEARCH FIRST CSRNXT EQU 18 ;SEARCH NEXT DIRECTORY CREAD EQU 20 ;READ SEQ CWRITE EQU 21 ;WRITE SEQ CSTDMA EQU 26 ;SET DMA ADDRESS CGTALL EQU 27 ;get alloc vector addr CGTDPB EQU 31 ;get DPB addr CSTUSC EQU 32 ;SET USER CODE CRREAD EQU 33 ;READ SEQ CRWRIT EQU 34 ;WRITE SEQ CRSDSN EQU 37 ;RESET DISK BY DISK VERCTOR CFRSP equ 46 ; get disk free space scbf equ 49 ; gvers equ '0e' ; December 23, 1985 21:38 drm "SERIAL.ASM" ;******************************************************** ; Z80-SIO I/O module for CP/M plus on the KAYPRO * ; Copyright (C) 1985 Douglas Miller * ;******************************************************** maclib Z80 false equ 0 true equ not false dbase equ 200 ;base for all char I/O devices dev0 equ 002 ;first device, rel. to base ndev equ 3 sio1 equ 004h ;z80-sio/0 sio2 equ 00ch ;another sio dce equ sio2+0 ;auxiliary print; WR3 ; init baud rate mov c,m res 2,c ; baud rate port pop h bit 2,m ; soft baud? rz mov a,m ; 0; 1,2,3..15 ora a rz cpi 10 ; 1,2,3..15 jrnc is0 dcr a ; 0,1,2,3,4,5,6,7,8,10,11,12,13,14,15 is0: outp a ret inputsio: inp0: call instsio jrz inp0 ; wait for character ready mov c,m inp a ; get data ani 7Fh ; mask parity ret instsio: call vector ins0: mov c,m inr c inr c xra a outp a inp a ; read from status port ani 1 ; isolate RxRdy rz et/set SCB CBIOS equ 50 ; direct BIOS call COVLY equ 59 ; load overlay CRSX equ 60 ; call RSX function CDEFPW EQU 106 ;set default password CLSBLK equ 112 ; List Block - does not fit in table... CBMAX EQU 50 ;MAX OF BDOS FUNCTION - CXMIN.. collapsed here CXMIN EQU 98 ;extended bdos functions base - collapse into CBMAX ; CNMIN EQU 64 ;MIN OF NDOS FUNCTION CLOGIN EQU 64 ;LOGIN CLOGOF EQU 65 ;LOGOFF CNMAX EQU 72 ;MAX OF NDOS FUNCTION ; ; SLAVE CONFIGRATION TABLE ; ; -1 NETWORK STATUS ; 0 SCR,LF,'$' CSTDN: DB 'NDOS3 Ending.',CR,LF,'$' ;wbmsg: DB 'NDOS3 Warm-boot.',CR,LF,'$' NDOSE: mov a,c ; must save REAL function code! sta FUNCOD sta MSGFUN ora a jz WARMST cpi COVLY jz LDOVLY ; LOAD OVERLAY (RSX SCRUB) - indication of warm boot cpi CRSX jz CALRSX ; used to unload CP/Net cpi CBIOS jz next ; DIRECT BIOS CALL - might need to trap for LIST OUT lxi h,FUNTBS NDOSE1: mov a,c sub m jc next inx h cmp m inx h jc NDOSE2 inx h inx h mov a,m ora a jUNTB2 db 0b4h ; fnwcf equ $-FUNTB2 db 0b6h ; fstcp equ $-FUNTB2 ; ***** DUPLICATE of fstpw ***** db 094h ; fsvcf equ $-FUNTB2 db 03eh, 018h, 0a4h ; fgtdl equ $-FUNTB2 db 046h, 098h ; fdkms equ $-FUNTB2 db 046h, 002h, 018h, 0a4h ; flst1 equ $-FUNTB2 db 0a8h flstbk equ $-FUNTB2 db 0ach ; table of message handlers? per BDOS func? ; -1 = ERROR, 0 = PASSTHRU, else index into FUNTB2 FUNTB1: db 0 ; 0 - db 0 ; 1 - db 0 ; 2 - db 0 ; 3 - db 0 ; 4 - db flst1 ; 5 - db 0 USTACK: dw 0 FUNCOD: db 0 PARAMT: dw 0 RETCOD: db 0 MCRPNT: dw 0 LSTUNT: db 0 F5SETF: db 0 FNTMPF: db 0 ORGBIO: dw 0 HEXMSG: db 0,0,'$' CLDERR: db 'Init err$' COLDSE: ; BC and DE are pushed... lxi d,CLDERR mvi c,CBUFPR call next lxi h,next shld start+1 ; only until remove takes place... mvi a,0ffh sta remove pop b pop d jmp next ; pass to BDOS and hope for the best... ; Not a true cold start - we are in context of a valid BDOS call... COLDST: push d push b call4h 0b4h dw NWCFTB ; 54 036h 0b6h dw SDMSGU ; 56 038h 0b8h dw RVMSGU ; 58 03ah 0bah dw LOGIN ; 60 03ch 0bch dw LOGOFF ; 62 03eh 0beh dw STSF ; 64 040h 0c0h dw STSN ; 66 042h 0c2h dw 0 ; 68 044h 0c4h - to be removed dw CKSTDP ; 046h 0c6h dw CHKMSC ; 048h 0c8h ; hi bit is "end" signal, else keep executing routines in list... ; byte & 07fh is index into FUNTB3, routine to call. FUNTB2: db 080h ; - never called fgtvr equ $-FUNTB2 db 0aeh ; frssy equ $-FUNTB2 db 0b2h ; frsvLAVE PROCESSOR ID ; 1-32 A - P DISK DEVICE CODE ; 33-34 CONSOLE DEVICE ; 35-36 LIST DEVICE ; 37 LIST BUFFER COUNTER ; 38-42 MESSAGE HEADER FOR LIST OUT ; 43 LISTER DEVICE NUMBER ; 44-171 LIST OUT DATA BUFFER ; ; EACH DEVICE DATA USED 2 BYTES ; IN 1-36 ; 1B:BIT 7 H ON NETWORK ; BIT 6 H SET UP IN DISK ; BIT 0-3 DEVICE NUMBER IN MASTER ; 2B:MASTER ID ; ; BIAS TO DATA IN CONFIGRATION TABLE ; BSRID equ 1 ;client ID BSDSKS equ 2 ;first byte in disk table BSDSKE equ 33 ;last byte in disk table nz NDOSE1 jmp next NDOSE2: sspd USTACK lxi sp,STACK mov c,a ; modified func code! mov a,m inx h mov h,m mov l,a ; HL = func table push h xchg shld PARAMT call DMAADD shld DMAADR ; cache DMA address for this call... lxi h,MSGSIZ mvi m,0 ; assume 1-byte payload inx h shld MCRPNT ; MSGDAT xra a mov b,a mov d,a pop h ; specific func table in HL dad b mov e,m ; don't need HL anymore sub e ; assumes A=0 jz tnextp ; code 0 = not handled by CP/Net NDOSE4: lxi ; 6 - db 0 ; 7 - db 0 ; 8 - db 0 ; 9 - db 0 ; 10 - db 0 ; 11 - db fgtvr ; 12 - GET VERSION db frssy ; 13 - RESET DISK SYSTEM db fsldk ; 14 - SELECT DISK db fopfi ; 15 - OPEN FILE db fopfi ; 16 - CLOSE FILE db fsrfs ; 17 - SEARCH FIRST db fsrnx ; 18 - SEARCH NEXT db fdlfi ; 19 - DELETE FILE db frdsq ; 20 - READ SEQUENTIAL db fwrsq ; 21 - WRITE SEQUENTIAL db fopfi ; 22 - MAKE FILE db frefi ; 23 - RENAME FILE db flgvc ; 24 - GET LOGIN VECTOR db 0 ; 25 - GET CURRENT DISK NTWKIN ora a jnz COLDSE lxi h,NDOSE shld start+1 xra a ; sta remove ; is the required? lxi h,MSGDAT shld MCRPNT ; Apparently, it is passe to use BDOS calls for certain things... lxi d,scbadd mvi c,scbf call next shld scbadr lxi d,CSTUP mvi c,CBUFPR call next pop b pop d jmp next scbadd: db 03ah, 0 BDERMD: lhld scbadr mvi l,scbase+4bh mov a,m ret SYSMSC: lhld scbadr mvi l,scbase+4ah mov a,m ret CURUSR: lhld scbadr mvi l,scbase+44h mov a,m rc equ $-FUNTB2 db 096h ; fsldk equ $-FUNTB2 db 0aah ; fopfi equ $-FUNTB2 db 008h, 00eh, 018h, 09ah ; fdlfi equ $-FUNTB2 db 006h, 098h ; fsrfs equ $-FUNTB2 db 040h, 018h, 0a0h ; fsrnx equ $-FUNTB2 db 042h, 018h, 0a0h ; frdsq equ $-FUNTB2 db 048h, 006h, 018h, 01ch, 0a2h ; READ SEQ fwrsq equ $-FUNTB2 db 048h, 008h, 010h, 018h, 09ch ; WRITE SEQ frefi equ $-FUNTB2 db 008h, 00ah, 002h, 098h ; flgvc equ $-FUNTB2 db 0a6h ; fgtal equ $-FUNTB2 db 012h, 002h, 018h, 0a4h ; fwrpr BSCONS EQU 34 ;BIAS TO CONSOLE DATA BSLIST EQU 36 ;BIAS TO LISTER DATA FCBRR0 equ 33 ; offset of RR0 field in FCB (not FCB in MSG) scbase equ 09ch ; base address of SCB within page org 0 ; RSX Prefix serial: db 0,0,0,0,0,0 start: jmp COLDST next: jmp 0 prev: dw 0 remove: db 0 ; 0ffh for remove nonbank: db 0 rsxnam: db 'NDOS3 ' loader: db 0,0,0 db 'COPYRIGHT (C) 1980-82, DIGITAL RESEARCH ' db 0,0,0,0,0,0 NDERRM: db CR,LF,'NDOS Err $' NDERR2: db ', Func $' BDOSE: dw 0 h,NDENDR push h lxi h,FUNTB2 dad d push h NDOSE5: pop b ldax b mov d,a ani 07fh ; strip off EOP bit mov e,a mov a,d mvi d,0 lxi h,FUNTB3 dad d mov e,m inx h mov d,m inx b ral jc NDOSE6 push b lxi h,NDOSE5 push h NDOSE6: xchg pchl FUNTB3: dw 0 ; 0 000h 080h - never called dw SNDHDR ; 2 002h 082h dw RCVPAR ; 4 004h 084h dw SNDFCB ; 6 006h 086h dw CKSFCB ; 8 008h 088h dw RENTMP ; 10 00ah 08ah dw WTDTC2 ; 12 00ch 08ch dw WTDTC8 ; 14 00eh 08eh db 0 ; 26 - SET DMA ADDR db fgtal ; 27 - GET ALLOC ADDR db fwrpr ; 28 - WRITE PROTECT DISK db flgvc ; 29 - GET R/O VECTOR db fstfi ; 30 - SET FILE ATTR db fgtal ; 31 - GET DPB ADDR db 0 ; 32 - GET/SET USER CODE db frdrr ; 33 - READ RANDOM db fwrrr ; 34 - WRITE RANDOM db fgtsz ; 35 - GET FILE SIZE db fgtsz ; 36 - SET RAND RECORD db frsvc ; 37 - RESET DRIVE db frsvc ; 38 - ACCESS DRIVE db frsvc ; 39 - FREE DRIVE db fwrrr ; 40 - WRITE RAND ZERO FILL db 0 ; 41 - TEST & WRITE RECORDet ; Some sneaky programs, like ERASE.COM, use the "saved search address" from the SCB. ; so we must put the address there if the BDOS does not (i.e. networked drive). SETSRA: lhld PARAMT xchg lhld scbadr mvi l,scbase+47h mov m,e inx h mov m,d ret SETDSK: lhld scbadr mvi l,scbase+3eh lda PARAMT mov m,a ret CURDSK: lhld scbadr mvi l,scbase+3eh mov a,m ret DMAADD: lhld scbadr mvi l,scbase+3ch mov a,m inx h mov h,m mov l,a ret CSTUP: DB 'NDOS3 Started.',equ $-FUNTB2 db 012h, 002h, 098h ; fstfi equ $-FUNTB2 db 006h, 018h, 09ch ; frdrr equ $-FUNTB2 db 048h, 006h, 018h, 01eh, 0a2h ; READ RAND fwrrr equ $-FUNTB2 db 048h, 008h, 010h, 018h, 09eh ; WRITE RAND [ZEROFIL] fgtsz equ $-FUNTB2 db 006h, 018h, 09eh ; flkrc equ $-FUNTB2 db 008h, 00ch, 018h, 09eh ; fstpw equ $-FUNTB2 db 094h ; flgin equ $-FUNTB2 db 03ch, 098h ; flgof equ $-FUNTB2 db 03eh, 098h ; fsdnw equ $-FUNTB2 db 0b8h ; frvnw equ $-FUNTB2 db 0bah ; fnwst equ $-FCURSID: db 0 scbadr: dw 0 MSGTOP: db 0 MSGID: db 0 db 0 ; We assume network hw/sw sets this. MSGFUN: db 0 MSGSIZ: db 0 MSGDAT: ds 256 db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h db 0c7h,0c7h,0c7h,0c7h,0c7h,0c7h STACK: ds 0 dw WTDTCP ; 16 010h 090h dw CKSTDK ; 18 012h 092h dw BCSTFN ; 20 014h 094h dw BCSTVC ; 22 016h 096h dw RCVEC ; 24 018h 098h dw GTFCB ; 26 01ah 09ah dw GTFCCR ; 28 01ch 09ch dw GTFCRR ; 30 01eh 09eh dw GTDIRE ; 32 020h 0a0h dw GTOSCT ; 34 022h 0a2h dw GTMISC ; 36 024h 0a4h dw GTLOGV ; 38 026h 0a6h dw LIST1 ; 40 028h 0a8h dw SELDSK ; 42 02ah 0aah dw LSTBLK ; 44 02ch 0ach dw GETVER ; 46 02eh 0aeh dw 0 ; 48 030h 0b0h - to be removed dw RESET ; 50 032h 0b2h dw NWSTAT ; 52 03 db flkrc ; 42 - LOCK RECORD db flkrc ; 43 - UNLOCK RECORD db 0 ; 44 - SET MULTISECTOR COUNT db 0 ; 45 - SET BDOS ERR MODE db fdkms ; 46 - GET DISK FREE SPACE db 0 ; 47 - CHAIN TO PROGRAM (***? can't chain to remote program) db fstcp ; 48 - FLUSH BUFFERS db 0 ; 49 - GET/SET SCB ; 50..63 - handled by special case NFTB1 equ $-FUNTB1 ; if any are passed to server, must preserve FUNCOD as real code FUNTBX: db fstcp ; 98 - FREE BLOCKS db fopfi ; 99 - TRUNCATE FILE db 0 ; 100 - SET Da CFGTBL+BSRID ; client (slave) ID mov b,a call HEXDIG dcx d mov a,b rar rar rar rar call HEXDIG inx d inx d xchg ret HEXDIG: ani 00fh cpi 10 jnc HEXDG1 adi '0' stax d ret HEXDG1: adi 'A'-10 stax d ret RENTMP: lhld MCRPNT lxi d,-19 dad d jmp SUBTMP MCPYTS: ldax d mov m,a inx h inx d dcr b jnz MCPYTS shld MCRPNT ret WTDTC2: mvi b,2 jmp WTDTCS WTDTC8: mvi b,8 jmp WTDTCS WTDTCP: mvi b,SCTLNG WTDTCS: lhld DMAADR pop d dcr a jz BCSTV1 lda MSGDAT sta RETCOD inr a jz RSTALL jmp BCSTV1 BCSTV3: call RCVEC pop d jmp BCSTV1 ; Returns vector of all disks for given server, ; each call skips servers already reported. FORALL: lxi h,CFGTBL+BSDSKS push d lxi d,0 lxi b,010ffh FORAL1: mov a,m ral jnc FORAL6 ; local ral jc FORAL6 ; "already did" flag inx h mov a,c cpi 0ffh jz FORAL2 cmp m jz FORAL3 dcx h jmp FORAL6 FORAL2: mov c,m FORAL3: dcx h mov a,m ori 0mov b,h ret RCVPAR: lxi b,MSGTOP call RVMSGE lxi h,MSGDAT shld MCRPNT ret tnextp: ; abandon call to real BDOS lhld USTACK sphl TBDOSP: lhld PARAMT xchg lda FUNCOD mov c,a jmp next CKFCBD: lhld PARAMT mov a,m dcr a jp CKFCB1 call CURDSK CKFCB1: mov e,a mvi d,0 call CHKDSK cpi 0ffh rnz call TBDOSP jmp NDEND CHKDSK: lxi h,CFGTBL+BSDSKS dad d dad d mov a,m ral jc CHKDS1 ; remote disk mvi a,0ffh ret CHKDS1: rar ani 00fh ; remotePARAMT ; FCB lxi b,FCBRR0 dad b mov m,e inx h mov m,d inx h mov m,a ; If the program's next op is random read/write, then we are ; finished now. But, if the next op is sequential then ; we must set the file position back to where it started. ; Use READ RAND to set file position. Response is ignored. mvi a,CRREAD sta MSGFUN lxi h,MSGDAT shld MCRPNT call SNDFCB call RCVPAR ; ignore data/error returned by CRREAD CKMSC3: lda CURMSC ; if error ended us early, need num sec cIR LABEL ****support?**** db fgtdl ; 101 - GET DIR LABEL BYTE db fgtdl ; 102 - READ FILE DATE-PWD MODE db 0 ; 103 - WRITE FILE XFCB ****support?**** db 0 ; 104 - SET DATE & TIME db 0 ; 105 - GET DATE & TIME - can't support here, use SEND NW MESG db fstpw ; 106 - SET DEF PASSWORD db 0 ; 107 - GET SERIAL NUMBER db 0 ; 108 - GET/SET PGM RET CODE db 0 ; 109 - GET/SET CONS MODE db 0 ; 110 - GET/SET OUT DELIM db 0 ; 111 - PRINT BLOCK db flstbk ; 112 - LIST BLOCK NFTBX equ $-FUNTBX ; Cxchg lhld MCRPNT call MCPYTS jmp SNDHDR CKSTDP: lda PARAMT jmp STDSK0 CKSTDK: call CURDSK STDSK0: mov e,a mvi d,000h call CHKDSK cpi 0ffh jnz STDSK1 call TBDOSP jmp NDEND STDSK1: sta MSGID lhld MCRPNT dcr c mov m,c inx h shld MCRPNT ret ; Handle multi-sector count CHKMSC: call CKFCBD ; does not return if disk is local ; From here on, we know the disk is remote call SYSMSC cpi 1 ; skip multi-sector handling if count == 1 rz ; returns to NDOSE5, 40h ; mark this one done... mov m,a xthl call RHLR0 jnc FORAL7 xthl mov a,m ani 00fh inr a push h lxi h,1 FORAL4: dcr a jz FORAL5 dad h jmp FORAL4 FORAL5: mov a,e ora l mov e,a mov a,d ora h mov d,a pop h jmp FORAL8 FORAL6: xthl call RHLR0 jnc FORAL7 mov a,h ori 080h mov h,a FORAL7: xthl FORAL8: inx h inx h dcr b jnz FORAL1 pop h ret RHLR0: ora a mov a,h rar mov h,a mov a,l rar mov l,a ret ; Reset from FORALL R server disk number inr a mov c,a inx h mov a,m ; remote server node ID sta MSGID ret SNDFCB: call CKSFCB jmp SNDHDR CKSFCB: call CKFCBD ; check FCB disk for local/remote (local does not return) STFCB: call CURUSR lhld MCRPNT mov m,a ; put USR in msg buf inx h mov m,c ; put DSK in msg buf inx h xchg lhld PARAMT inx h xchg mvi b,35 call MCPYTS ; copy FCB to msg buf xra a sta FNTMPF sta F5SETF lhld MCRPNT lxi d,-35 dad d ; point to start of FCB namompleted. mov e,a ; save where SYSMSC won't destroy it call SYSMSC sub e mov h,a ret ; NDENDR BCSTFN: ; broadcast func (set default password, set compat attrs) lxi d,0 call FORALL mov a,c inr c jz RSTALL ; no (more) servers, reset and return sta MSGID lhld PARAMT xchg lhld MCRPNT lda FUNCOD cpi CDEFPW-CBMAX ; a.k.a. 106 - set def password jz BCST1 ; fn 70 - set compat attr mov m,e jmp BCST2 BCST1: mvi b,8 call MCPYTS BCST2: call SNDHDR call RCVPAR jmP/Net functions, not known to BDOS FUNTBN: db flgin ; 64 - LOGIN db flgof ; 65 - LOGOFF db fsdnw ; 66 - SEND NW MESG db frvnw ; 67 - RECV NW MESG db fnwst ; 68 - GET NW STATUS db fnwcf ; 69 - GET NW CFG db fstcp ; 70 - SET COMP ATTR db fsvcf ; 71 - GET SERVER CFG NFTBN equ $-FUNTBN FUNTBS: db 0,NFTB1 dw FUNTB1 db CNMIN,NFTBN dw FUNTBN db CXMIN,NFTBX dw FUNTBX dw 0 SNDHDR: lxi h,MSGTOP mvi m,0 ; FMT = CP/Net inx h ; DID (server ID) already set inx h ; SID, ougoto next opcode. sta CURMSC pop h ; NDOSE5 ret addr shld MSCRET pop h ; FUNTB2 pointer (past CHKMSC) shld MSCTBP lda FUNCOD cpi CRREAD jc CKMSC2 ; save rand rec position lhld PARAMT ; FCB lxi b,FCBRR0 dad b mov e,m inx h mov d,m inx h mov a,m sta SAVRR+2 xchg shld SAVRR jmp CKMSC2 CKMSC0: lda RETCOD ora a jnz CKMSC1 lda CURMSC dcr a sta CURMSC jz CKMSC1 lxi h,MSGDAT shld MCRPNT lhld DMAADR lxi b,128 dad b shld DMAADR lda FUNCOD cpi CRSTALL: lxi h,CFGTBL+BSDSKS mvi b,16 RSTAL1: mov a,m ani 08fh ; clear FORALL iterator flag(s) mov m,a inx h inx h dcr b jnz RSTAL1 ret STSF: ; setup Search First mvi a,0ffh sta CURSID ; assume local lhld PARAMT mov a,m cpi '?' jnz STSF1 call CKSTDK mvi c,'?'+080h ; "drive" code with CP/M3 flag call STFCB jmp STSF2 STSF1: lhld MCRPNT inx h shld MCRPNT call CKSFCB ; if remote, set FCB in msg STSF2: lda MSGID sta CURSID call SETSRA jmp SNDHDR STSNe in msg buf SUBTMP: call CKDOL ; substitute $NN for $$$ at start of name mvi b,0 dad b ; skip rest of 3 chars inx h mov a,m ani 080h ; check f5' attr - partial close/delete XFCBs only inx h jz SUBTM1 mov a,m ani 080h ; check f6' attr - assign passwd/set byte count jnz SUBTM1 dcr a sta F5SETF SUBTM1: lda FNTMPF add a sta FNTMPF inx h inx h inx h CKDOL: mvi c,3 mvi a,'$' CKDOL1: cmp m rnz inx h dcr c jnz CKDOL1 xchg lxi h,FNTMPF inr m dcx d ldp BCSTFN BCSTVC: ; broadcast "drive vector" funcs to all servers lhld PARAMT xchg BCSTV1: call FORALL push h mov a,c inr c jnz BCSTV2 ; some remote drives to do call RSTALL pop d lda FUNCOD cpi CRSDSN ; reset drive rnz ; only reset drive is passed to local mov c,a call next sta RETCOD ret BCSTV2: sta MSGID lxi h,MSGDAT mov m,e inx h mov m,d inx h shld MCRPNT call SNDHDR lda FUNCOD sui 38 ; access drive jz BCSTV3 push psw call RCVPAR pop psw r node ID, will be set by SNIOS inx h inx h inx h xchg ; DE = MSGDAT lhld MCRPNT xra a ; negate DE sub e mov c,a mvi a,0 sbb d mov b,a dad b ; HL -= DE mov a,l ora h jz SNDHD1 ; size set already dcx h xchg dcx h mov m,e ; SIZ = length - 1 SNDHD1: lxi b,MSGTOP SDMSGE: call SNDMSG inr a rnz jmp NERROR RVMSGE: call RCVMSG inr a rnz NERROR: lxi h,-1 mov a,h jmp NDEND NDENDR: lda RETCOD NDEND: xchg lhld USTACK sphl xchg mov l,a READ jc CKMSC2 ; advance random record number... lhld PARAMT ; FCB lxi b,FCBRR0 dad b inr m jnz CKMSC2 inx h inr m jnz CKMSC2 inx h inr m CKMSC2: lxi h,CKMSC0 push h lhld MSCTBP push h lhld MSCRET pchl ; jmp NDOSE5 - do next opcode. Returns to CKMSC0 when done. ; done with multi-sec read/write, restore everything. CKMSC1: ; could be EOF, or some physical error lda FUNCOD cpi CRREAD jc CKMSC3 ; restore file position... lda SAVRR+2 lhld SAVRR xchg lhld : ; setup Search Next lda CURSID cpi 0ffh ; was Search First a local op? jnz STSN1 call TBDOSP jmp NDEND STSN1: sta MSGID call CURUSR lhld MCRPNT inx h mov m,a inx h shld MCRPNT jmp SNDHDR RCVEC: call RCVPAR lxi h,MSGDAT+1 shld MCRPNT mov d,m ; D = ext err code dcx h mov a,m sta RETCOD dcx h mov a,m ; SIZ dcr a mvi h,0 ; ensure H=0 to avoid confusion with extended errors rnz ; not extended error - skip rest call BDERMD inr a jnz NDERR xchg jmp local drive num ; A = net cfg byte, bit-7 = remote, bit-0:3 = remote drive num ; Returns DE bit-0 = drive's status DRVSTS: push d push b push h ral jc DRVST1 ; drive is local push b call TBDOSP pop b dcr b xchg jmp DRVST2 DRVST1: ; drive is remote rar ani 00fh mov b,a ; remote drive number mov a,c ; server ID sta MSGID lxi h,MSGDAT shld MCRPNT push b call SNDHDR call RCVPAR pop b lhld MCRPNT mov e,m inx h mov d,m DRVST2: ; DE = vector of active d ldax d cmp m jnz rsxf1 inx d inx h dcr b jnz rsxf0 rsxf1: pop d jnz next lxi d,CSTDN mvi c,CBUFPR call next lxi h,next shld start+1 ; only until remove takes place... mvi a,0ffh sta remove lxi h,0 mov a,l ret end ll vector ins0: mov c,m inr c inr c xra a outp a inp a ; read from status port ani 1 ; isolate RxRdy rz calls ; actually fill the DMA buffer with the directory sector. ; DIR.COM depends on this for getting timestamps. lda MSGSIZ ora a ; 00 = 1 byte, dir code only, DMA buf implied rz ; NDENDR will return dir code to user cpi 32+4 ; anything 1 < x < 128 really, pick a number (expect 32). jnc STOSC0 ; assume 128 bytes, copy all to DMA buffer. ; single DIRENT returned, copy to correct location. xchg lhld DMAADR lda RETCOD inr a lxi b,32 GTDIR1: dcr a jz GTDIR2 dad b jmp GTDIR1 i h,CFGTBL+BSLIST+9 jmp lstbk1 GETVER: lhld scbadr mvi l,scbase+05h mov l,m mvi h,002h mov a,l sta RETCOD ret NWSTAT: call NTWKST sta RETCOD ret NWCFTB: call CNFTBL mov a,l sta RETCOD ret LOGIN: lhld PARAMT mov a,m sta MSGID inx h xchg lhld MCRPNT mvi b,8 call MCPYTS jmp SNDHDR LOGOFF: lda PARAMT sta MSGID jmp SNDHDR SDMSGU: lhld PARAMT mov b,h mov c,l call SNDMSG sta RETCOD ret RVMSGU: lhld PARAMT mov b,h mov c,l NDENDR NDERR: push d lxi d,NDERRM call PRMSG pop psw ; A = (D), ext err code push psw ; Fix bug in NDOS.ASM call HEXOUT lxi d,NDERR2 call PRMSG lda FUNCOD call HEXOUT call BDERMD pop h ; H = ext err code cpi 0feh jz NDENDR jmp TOP ; abort program HEXOUT: lxi d,HEXMSG+1 ; do low nibble first push psw call HEXDIG pop psw rar rar rar rar dcx d ; back to hi nibble call HEXDIG PRMSG: mvi c,CBUFPR jmp next GTFCB: lda F5SETF inr a jnz GTFCCR Grives mov a,b ora a jz DRVST4 DRVST3: ; get drive 'B' bit to LSB mov a,d rar mov d,a mov a,e rar mov e,a dcr b jnz DRVST3 DRVST4: mvi d,000h mov a,e ani 001h mov e,a pop h dad d pop b pop d ret SELDSK: lda PARAMT mvi d,000h mov e,a call CHKDSK cpi 0ffh ; local disk jz TBDOSP ; let BDOS handle call SETDSK lhld MCRPNT dcr c mov m,c inx h shld MCRPNT call SNDHDR jmp RCVEC RESET: ; anything to do? BDOS will be called... but BDOS does novers equ '0g' ; January 20, 1986 11:06 drm "CRT.ASM" ;******************************************************** ; CRT module for the KAYPRO * ; Copyright (C) 1985 Douglas Miller * ;******************************************************** maclib Z80 false equ 0 true equ not false external equ false ;actual driver in EPROM? dev0 equ 200 ndev equ 1 sysctl equ 014h ;status/ctrl bits if not external line25n equ 00100000b crtadr equ 1ch vidctl equ crtadr crtreg equ 1dh vidd GTDIR2: mov b,c call MCPYFS ret GTOSCT: lda RETCOD ora a rnz lxi h,MSGDAT+37 STOSC0: xchg lhld DMAADR mvi b,SCTLNG call MCPYFS mvi h,0 ; ensure H=0 to avoid confusion with extended errors ret GTMISC: lhld MCRPNT dcx h ; drop error byte lda FUNCOD cpi CGTALL ; get alloc addr jz GTMSC3 ; for alloc vec, just leave in message buffer xchg cpi CFRSP ; get disk free space jz GTMSC4 cpi CGTDPB ; get DPB addr jnz GTMSC1 ; fn 31 - get DPB lxi h,CURDPB push h call RCVMSG sta RETCOD ret LDERR: mvi a,-1 pop h ret SAVDMA: dw 0 SAVRR: db 0,0,0 MSCRET: dw 0 MSCTBP: dw 0 CURMSC: db 0 DMAADR: dw 0 CURDPB: ds 15 CURSCF: ds 23 ; this is used to do warm boot initialization, since most ; programs do not call BDOS Function 0 but instead just ; JMP 0. The CCP then makes this call, either upon startup ; and/or immediately prior to running a program. ; Perportedly, the CPP calls this with DE=NULL in order ; to scrub RSXs on warm boot. LDOVLY:TFCRR: mvi b,35 ; FCB+CR+RR (-drive) jmp GTFC1 GTFCCR: mvi b,32 ; FCB+CR, not RR GTFC1: call RSTMP ; un-do temp file subst lhld MCRPNT inx h xchg lhld PARAMT inx h call MCPYFS mvi h,0 ; ensure H=0 to avoid confusion with extended errors ret MCPYFS: ldax d mov m,a inx d inx h dcr b jnz MCPYFS xchg shld MCRPNT ret RSTMP: ; restore TMP filename lda FNTMPF rar rar jnc RSTMP1 lhld MCRPNT inx h inx h mvi m,'$' inx h mvi m,'$' RSTMP1: ral rt call 0005 (us)? lxi h,MSGDAT shld MCRPNT ; A: cannot be remote... jmp next LIST1: lxi d,PARAMT lxi b,1 jmp lstbk2 LSTBLK: lhld PARAMT mov e,m inx h mov d,m ; address of data inx h mov c,m inx h mov b,m ; length mov a,c ora b rz lstbk2: lxix CFGTBL+BSLIST bitx 7,+0 jz tnextp lxi h,CFGTBL+BSLIST+9 push d ldx e,+7 mvi d,0 dad d pop d lstbk0: ldax d inx d mov m,a inx h inrx +7 ; dirty == not-zero jm lstbk3 ; send data cpi 0ffh ; stop at equ 1fh sio1 equ 4 keyb equ sio1+1 ; CRTC register addresses curst equ 10 curen equ 11 startH equ 12 startL equ 13 cursrH equ 14 cursrL equ 15 ramioH equ 18 ramioL equ 19 nulla equ 31 ctrlD equ 4 bell equ 7 bs equ 8 lf equ 10 ctrlK equ 11 ff equ 12 cr equ 13 ctrlW equ 23 ctrlX equ 24 ctrlZ equ 26 esc equ 27 rs equ 30 endif extrn @ctbl,@vect cseg ;common memory, other parts in banked. dw thread db dev0,ndev jmp init jmp nullst jmp nullin jmp nullst mvi b,16 ; should be 15 for CP/M 2.2, 17 for CP/M 3 jmp GTMSC2 GTMSC4: lxi h,0 push h lhld DMAADR mvi b,3 jmp GTMSC2 GTMSC1: ; fn 71 - get server config lxi h,CURSCF push h mvi b,23 GTMSC2: call MCPYFS pop h GTMSC3: mov a,l sta RETCOD ret GTLOGV: lxi d,CFGTBL+BSDSKE lxi h,0 mvi b,16 GTLGV1: ldax d dcx d mov c,a ldax d dcx d dad h call DRVSTS dcr b jnz GTLGV1 mov a,l sta RETCOD ret ; Get a drive's status (i.e. GET LOGIN VECTOR) ; B = WARMST: push d push b call NTWKBT ; TODO: any other re-init? reset some context? ; lxi d,wbmsg ; mvi c,CBUFPR ; call next pop b pop d jmp next ; An example of how to process BDOS Func 60 RSX Func 113 ; and remove one's self. CALRSX: mov l,e mov h,d mov a,m inx h cpi 113 ; Check for RSX Func 113 jnz next mov a,m inx h cpi 1 ; Check param count to be sure jnz next push d mov e,m inx h mov d,m lxi h,rsxnam mvi b,8 rsxf0: ; Compare paramter to our name nc lhld MCRPNT lxi d,10 dad d mvi m,'$' inx h mvi m,'$' ret GTDIRE: lda RETCOD inr a mvi h,0 ; ensure H=0 to avoid confusion with extended errors rz lhld MCRPNT ; Special case for CP/M3 full search, although really ; any SEARCH that wants to be fully compatible with CP/M ; neuances - specifically that the DMA buffer contains the ; full directory sector after a search. ; ; CP/Net breaks SEARCH funcs 17/18 by only returning ; one DIRENT at a time, while the local BDOS at 0ffh? or need to continue if more? jz lstbk3 ; this will continue if more chars exist... lstbk1: dcx b mov a,b ora c jnz lstbk0 ret lstbk3: ; must send buffer ldx a,+0 ani 0fh stx a,+8 ; SIZ already len-1, incl LST unit ldx a,+1 ; LST server stx a,+4 ; DID push d push b pushix lxi b,CFGTBL+BSLIST+3 ; MSG buffer call SNDMSG popix pushix mvix 0,+7 ; clear dirty flag, setup for next char inr a jz NERROR lxi b,MSGTOP call RVMSGE popix pop b pop d lx jmp output dw strcrt dw tblcrt dw modcrt strcrt: db 'KAYPRO ',0,'CRT driver ',0,'v3.10' dw vers db '$' modcrt: db 00000000b,00000000b,10000000b,0 thread equ $ dseg ;banked memory. tblcrt: ;initial value only, copied by BIOS to its table. db 'CRT ',00000010b,0 ;Output, no baud, no protocal init: if not external LXI H,escflg MVI B,12 XRA A L06E0 MOV M,A INX H DJNZ L06E0 lhld 0041h ;gifts from the loader... shld line lhld 0044h ; shld curpos lhld 0046MOV M,A RET L0914 MOV A,M ANI 11110111b MOV M,A RET ;Cursor off L0919 MVI C,00100000b JR L08C1 L091D MOV A,M ANI 11101111b MOV M,A RET ;restore cursor pos L0922 LHLD LFD7D MOV A,H ADI ' ' STA LFD7F MOV A,L ADI ' ' STA LFD81 JMP L093D L0934 LDA attrib ANI 11011111b STA attrib RET ;direct cursor control L093D LXI H,0 MOV C,L LDA LFD81 SUI ' ' RC MOV B,A JRZ L0953 CPI 25 RNC LXI D,80 L0950 DAD D DJNZ L0950 L0953 MOV E,A LDA LFD7F MVI A,nulla OUT crtadr L0B4D IN vidctl ORA A JP L0B4D IN viddat EXAF MOV A,B OUT crtadr MOV A,D ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat POP B DCX B MOV A,B ORA C JNZ L0AF5 JMP L0BFF L0B75 MOV A,B ANI 00000111b ORA C RZ L0B7A PUSH B L0B7B IN vidctl ORA A JP L0B7B LXI B,ramioL + (ramioH shl 8) MOV A,B OUT crtadr MOV A,H ANI 00000111b OUT crtreg MOV A,C OUT crtadr MOV831 LDA line CPI 24 RZ ORA A RZ DCR A STA line LHLD curpos LXI D,80 DSBC D XCHG JR L0815 L0848 LDA column ORA A JRNZ L085D LDA line ORA A RZ CPI 24 JRZ L0868 DCR A STA line MVI A,80 L085D DCR A STA column LDED curpos DCX D JR L0815 L0868 MVI A,79 STA column LHLD curpos LXI D,79 DAD D XCHG JR L0815 L0877 LDA column CPI 79 JNC L07F7 LDED curpos INX D INR A STA column JR L0815 L088A JMP L0A8C ;set modes L088D LXI H,att CPI bell JRZ L0A3F CPI ctrlX JZ L06A1 CPI ctrlW JZ L06A6 CPI ctrlZ JZ L06F8 CPI bs JZ L0848 CPI ff JZ L0877 CPI ctrlK JZ L0831 CPI rs JZ L075F CPI esc JNZ L078F MVI A,1 STA escflg RET L0A8C LDA attrib ANI 00100000b JRZ L0AC9 L0A93 LHLD starta LXI D,1920 LXI B,80 DAD D MOV A,H ANI 00000111b MOV H,A MOV D,H MOV E,L DAD B MOV A,H ANI 00000111b MOV H,A XCHG PUSH H CALL L0AF0 POP D LXI H,80 CALL L0711 LHLD starta LXI D,80 h ; shld starta endif ret nullin: mvi a,1ah ret nullst: ori true ret ; return true if ready if external output: di in sysctl ani 10111111b ori 10000000b out sysctl call 0045h in sysctl ani 00111111b out sysctl ei ret else ;internal CRT driver code: ;CTR controlling code output: LDA escflg ORA A JNZ L09CB ;ESC codes MOV A,C ORA A RZ ;ignore nulls JM L07AE ;Block graphics CPI ' ' JC L0A44 ;CTRL codes ;Displayable char L078F MOV A,C LD SUI ' ' RC CPI 80 RNC MOV C,A STA column MOV A,E STA line DAD B LDED starta DAD D XCHG JMP L0815 L096F LXI B,crtadr + (ramioH shl 8) CALL L0981 DCR C MVI A,nulla OUTP A L097A INP A ORA A JP L097A RET L0981 OUTP B INR C OUTP D DCR C INR B OUTP B INR C OUTP E RET L0992 CALL L096F IN viddat RET L0998 PUSH PSW MOV A,D ANI 7 MOV D,A CALL L096F POP PSW OUT viddat RET L09A4 LDA attrib L09A7 PUSH H PUSH PSW CALL L09BF C A,L OUT crtreg MVI A,nulla OUT crtadr L0B96 IN vidctl ORA A JP L0B96 IN viddat EXAF MOV A,B OUT crtadr MOV A,D ANI 00000111b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat INX D INX H MOV A,D ANI 00000111b MOV D,A MOV A,H ANI 00000111b MOV H,A L0BBE IN vidctl ORA A JP L0BBE MOV A,B OUT crtadr MOV A,H ORI 8 OUT crtreg MOV A,C OUT crtadr MOV A,L OUT crtreg MVI A,nulla OUT crtadr L0BD6rib MOV A,C SUI '0' JRZ L08AB DCR A JRZ L08B0 DCR A JRZ L08B5 DCR A JRZ L08BA DCR A JRZ L08BF DCR A JRZ L08C9 DCR A JRZ L08D7 DCR A JRZ L08DE RET ;Rev Vid L08AB MOV A,M ORI 00000001b MOV M,A RET L08B0 MOV A,M ORI 00000010b MOV M,A RET L08B5 MOV A,M ORI 00000100b MOV M,A RET L08BA MOV A,M ORI 00001000b MOV M,A RET ;Cursor on L08BF MVI C,01100000b ; L08C1 MVI A,curst OUT crtadr MOV A,C OUT viddat RET ;Vid Mode L08C9 LDADAD D MOV A,H ANI 00000111b MOV H,A SHLD starta XCHG LXI B,crtadr + (startH shl 8) JMP L0981 L0AC9 LHLD starta LXI D,80 DAD D MOV A,H ANI 00000111b MOV H,A SHLD starta XCHG LXI B,crtadr + (startH shl 8) CALL L0981 LHLD starta LXI D,1920 DAD D MOV A,H ANI 00000111b MOV H,A XCHG LXI H,80 JMP L0711 L0AF0 MOV A,B ANI 00000111b ORA C RZ L0AF5 PUSH B L0AF6 IN vidctl ORA A JP L0AF6 LXI B,ramioL + (ramioH shl 8) MOV A,B OUT crtadr MOV A,H ED curpos CALL L0998 CALL L09A4 ;advance cursor L079A LDA column INR A CPI 80 JNC L07F7 ;wrap STA column LDED curpos INX D JMP L0815 ;Block graphics codes L07AE LDA attrib ANI 00010000b JRZ L078F ;normal char LDA LFD8C ANI 01000000b JRZ L07C3 MOV A,C ANI 00000001b STA LFD8C RET L07C3 LDA LFD8C ORA A MOV A,C JRZ L07CB CMA L07CB ORI 10000000b LDED curpos CALL L0998 LDA LFD8C MOV C,A LDA attrib ORA C CALL L09A7 MVI A,01000000b STA LFD8C ALL L096F POP PSW OUT viddat XCHG POP H RET PUSH H CALL L09BF CALL L0992 XCHG POP H RET L09BF LXI H,0801h DAD D MOV A,H ANI 7 ORI 8 MOV H,A XCHG RET ;ESC sequences L09CB LXI H,escflg MVI M,0 CPI 1 JRNZ L09ED MOV A,C ANI 01111111b CPI 'R' JZ L0C06 CPI 'E' JZ L0C9D CPI 'A' RZ CPI 'G' RZ STA LFD7C MVI M,2 RET ;more than 1 in sequence L09ED CPI 2 JRNZ L0A05 LDA LFD7C CPI 'B' JZ L088D CPI 'C' JZ L08E7 MOV A,C STA LFD81 IN vidctl ORA A JP L0BD6 IN viddat EXAF MOV A,B OUT crtadr MOV A,D ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat POP B DCX H DCX H DCX D DCX D DCX B MOV A,B ORA C JNZ L0B7A L0BFF IN vidctl ORA A JP L0BFF RET L0C06 CALL L07E6 LDA line ORA A JZ L0C4F LDED curpos LXI H,80 CPI 23 JNC L0711 CPI 11 JRNC L0C64 XCHG LXI B,79 DAD B MOV A,H ANI 00000111b MOV H,A MOV B, attrib ORI 00010000b STA attrib MVI A,01000000b STA LFD8C RET L08D7 LHLD line SHLD LFD7D RET L08DE LDA attrib ORI 00100000b STA attrib RET ;reset mode L08E7 LXI H,attrib MOV A,C SUI '0' JRZ L0905 DCR A JRZ L090A DCR A JRZ L090F DCR A JRZ L0914 DCR A JRZ L0919 DCR A JRZ L091D DCR A JRZ L0922 DCR A JRZ L0934 RET L0905 MOV A,M ANI 11111110b MOV M,A RET L090A MOV A,M ANI 11111101b MOV M,A RET L090F MOV A,M ANI 11111011b OUT crtreg MOV A,C OUT crtadr MOV A,L OUT crtreg MVI A,nulla OUT crtadr L0B0F IN vidctl ORA A JP L0B0F IN viddat EXAF MOV A,B OUT crtadr MOV A,D OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr EXAF OUT viddat INX D INX H MOV A,D ANI 00000111b MOV D,A MOV A,H ANI 00000111b MOV H,A L0B35 IN vidctl ORA A JP L0B35 MOV A,B OUT crtadr MOV A,H ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,L OUT crtreg JR L079A ;advance cursor pos L07E6 LHLD curpos LDA column MOV E,A XRA A MOV D,A STA column DSBC D XCHG JR L0815 ;wrap to next line L07F7 CALL L07E6 ; L07FA LDA line CPI 23 JRC L0809 L0801 CPI 24 RZ CALL L088A JR L080D L0809 INR A STA line L080D LHLD curpos LXI D,80 DAD D XCHG L0815 MOV A,D ANI 00000111b MOV D,A XCHG SHLD curpos LBCD starta DSBC B JRNC L0829 LXI D,2048 DAD D L0829 DAD B XCHG LXI B,crtadr + (cursrH shl 8) JMP L0981 L0 MVI M,3 RET ;more than 2 in sequence L0A05 CPI 3 JRNZ L0A22 MOV A,C STA LFD7F LDA LFD7C CPI '=' JZ L093D CPI '*' JZ L0DA1 CPI ' ' JZ L0DA8 MVI M,4 RET ;more than 3 L0A22 CPI 4 JRNZ L0A2D MOV A,C STA LFD82 MVI M,5 RET ;5 sequential char L0A2D MOV A,C STA LFD80 LDA LFD7C CPI 'L' JZ L0F41 CPI 'D' JZ L0F48 RET L0A3F in keyb+2 ani 00000100b jrz L0A3F mvi a,ctrlD out keyb ret ;CTRL codes L0A44 CPI cr JZ L07E6 CPI lf JZ L07FA H MOV C,L DSBC D MOV A,H ANI 00000111b MOV H,A PUSH H LDED starta DSBC D JRNC L0C5D LXI H,2048 ORA A DSBC D POP D DAD D MOV A,H ANI 00000111b MOV H,B MOV B,A MOV A,L MOV L,C MOV C,A XCHG L0C4B INX B CALL L0B75 L0C4F CALL L0A93 LHLD curpos LXI D,80 DAD D XCHG JMP L0815 L0C5D MOV D,B MOV E,C MOV B,H MOV C,L POP H JR L0C4B L0C64 DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L LHLD starta LXI B,1920 DAD B MOV A,H ANI 0000011 RET L0E78 LDA LFD83 ORA A JRZ L0E88 LDA LFD85 MOV B,A LDA LFD84 ORA B JR L0E6E L0E88 LDA LFD85 CMA MOV B,A LDA LFD84 ANA B JR L0E6E L0E93 MOV A,D ANI 00000111b MOV D,A L0E97 CALL L0EA9 IN viddat RET L0E9D PUSH PSW MOV A,D ANI 00000111b MOV D,A CALL L0EA9 POP PSW OUT viddat RET L0EA9 LXI B,crtadr + (ramioH shl 8) CALL L0EBB DCR C MVI A,nulla OUTP A L0EB4 INP A ORA A JP L0EB4 RET L0EBB OUTP B INR C OUTP D DCR C INR B OUFD7C db 0 LFD7D dw 0 LFD7F db 0 LFD80 db 0 LFD81 db 0 LFD82 db 0 LFD83 db 0 LFD84 db 0 LFD85 db 0 LFD86 dw 0 LFD88 db 0 LFD89 db 0 LFD8A db 0 LFD8B db 0 LFD8C db 0 endif end rams do not call BDOS Function 0 but instead just ; JMP 0. The CCP then makes this call, either upon startup ; and/or immediately prior to running a program. ; Perportedly, the CPP calls this with DE=NULL in order ; to scrub RSXs on warm boot. LDOVLY: LXI H,0 L0D72 DAD B DCR A JRNZ L0D72 MOV B,H MOV C,L POP H CALL L0B75 L0D7C LHLD curpos MOV D,H MOV E,L LDA column MOV C,A MVI A,80 SUB C MOV C,A MVI B,0 DAD B MOV A,H ANI 00000111b MOV H,A XCHG CALL L0AF0 LDA column MOV L,A MVI H,0 ORA A CNZ L0711 JMP L06A1 L0DA1 MVI A,0 STA LFD83 JR L0DAD L0DA8 MVI A,-1 STA LFD83 L0DAD LDA LFD7F SUI ' ' MOV E,A LDA LFD81 SUI ' ' MOV D,A L0DB9 MOV A,D CPI 100 RNC ANI 0011b MOV B,A srl MOV D,A JR L0FA6 L0FBD CALL L0F37 LDA LFD82 CMP D RZ LDA LFD88 ADD D MOV D,A DAD B JRNC L0FBD LDA LFD89 ADD E MOV E,A JR L0FBD L0FD4 CALL L0F37 LDA LFD82 CMP D RZ LDA LFD88 ADD D MOV D,A LDA LFD89 ADD E MOV E,A JR L0FD4 L06A1 CALL L06CA JR L0711 L06A6 MVI C,23 LDA attrib ANI line25n JRNZ L06B0 INR C L06B0 LDA line SUB C JRNC L06A1 NEG MOV B,A LXI D,80 LXI H,0 L06BF DAD D DJNZ L06BF PUSH H CALL L06CA POP B DAD B J1b MOV H,A MOV B,A MOV C,L DSBC D JRNC L0C82 LXI H,2048 ORA A DSBC D DAD B L0C82 MOV B,H MOV C,L LHLD curpos XCHG CALL L0AF0 LHLD starta LXI D,1840 DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L LXI H,80 JMP L0711 L0C9D LDA line CPI 12 JNC L0D4E LHLD starta LXI D,80 ORA A DSBC D MOV A,H ANI 00000111b MOV H,A XCHG LXI B,crtadr + (startH shl 8) CALL L0981 LHLD curpos LBCD starta ORA A DSBC B JRNC L0CD4 LXI H,2048 ORA A DSBC BTP B INR C OUTP E RET L0ECB PUSH H PUSH PSW CALL L0EE3 CALL L0EA9 POP PSW OUT viddat XCHG POP H RET L0ED9 PUSH H CALL L0EE3 CALL L0E97 XCHG POP H RET L0EE3 LXI H,L0801 DAD D MOV A,H ANI 00000111b ORI 00001000b MOV H,A XCHG RET L0EF1 MOV A,E SUI ' ' MOV E,A MOV A,D SUI ' ' MOV D,A SUB E RZ JRNC L0EFF NEG L0EFF INR A RET L0F01 LXI H,0 MOV A,D ORA A RZ MOV A,E ORA A RZ INX H CMP D JRC L0F10 MOV A,D MOV D,E r d srlr d MOV A,E CPI 160 RNC RRC MOV E,A MVI A,1 JRC L0DD1 ADD A L0DD1 INR B DCR B JRZ L0DDA L0DD5 ADD A ADD A djnz L0DD5 L0DDA STA LFD85 MOV A,E ANI 01111111b MOV E,A LHLD starta MOV B,D MOV C,E LXI D,80 INR B JR L0DED L0DEC DAD D L0DED DJNZ L0DEC MVI D,0 MOV E,C DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L SDED LFD86 CALL L0E93 ORA A JM L0E08 CPI ' ' RNZ MVI A,128 L0E08 STA LFD84 LDA LFD85 ORA A JP L0E4A LDED LFD86 R L0711 L06CA LXI H,80 LDED curpos LDA column MOV C,A XRA A MOV B,A DSBC B RET L06F8 CALL L075F LDA attrib ;reset attributes ANI 11110000b STA attrib ; ; clear rest of screen LDED curpos LXI H,80*25 ANI line25n ;test 25th line JRZ L0711 LXI H,80*24 L0711 LXI B,ramioL + (ramioH shl 8) ; L0714 IN vidctl ;wait for ??? ORA A ; JP L0714 ; MOV A,B OUT crtadr MOV A,D ANI 00000111b MOV D,A OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,n MOV A,H ANI 00000111b MOV H,A LBCD curpos DAD B L0CD4 MOV A,H ANI 00000111b MOV B,A MOV C,L LXI H,128 DAD B MOV A,H ANI 00000111b MOV B,A MOV C,L LHLD starta LXI D,1840 DAD D MOV A,H ANI 00000111b MOV H,A XCHG LXI H,80 DAD D MOV A,H ANI 00000111b MOV H,A CALL L0AF0 LHLD curpos LXI B,80 ORA A DSBC B MOV A,H ANI 00000111b MOV H,A XCHG LDA column MOV C,A MVI B,0 LXI H,80 DSBC B PUSH D PUSH H CALL L0711 POP B PUSH B LHL0F10 MVI E,0 L0F12 MOV B,H MOV C,L ADD A JRNC L0F18 INR E L0F18 DAD B JRC L0F2F SUB D JRNC L0F2C PUSH PSW MOV A,E ORA A JRZ L0F28 POP PSW MVI E,0 JR L0F2C L0F28 POP PSW ADD D JR L0F12 L0F2C INX H JR L0F12 L0F2F SUB D JRNC L0F35 MOV A,E ORA A RZ L0F35 INX H RET L0F37 PUSH H PUSH D PUSH B CALL L0DB9 POP B POP D POP H RET L0F41 MVI A,0 STA LFD83 JR L0F4F L0F48 MVI A,-1 STA LFD83 JR L0F4F L0F4F LDED LFD81 CALL L0EF1 SCALL L0ED9 STA LFD7C ANI 00000001b JRZ L0E37 LDA LFD83 ORA A RZ LDA LFD7C ANI 11111110b LDED LFD86 CALL L0ECB LDA LFD84 CMA JR L0E6E L0E37 LDA LFD83 ORA A RNZ LDA LFD7C ORI 00000001b CALL L0ECB LDA LFD84 CMA JR L0E6E L0E4A LDED LFD86 CALL L0ED9 ANI 00000001b JRNZ L0E78 LDA LFD83 ORA A JRZ L0E66 LDA LFD85 CMA MOV B,A LDA LFD84 ANA B JR L0E6E L0E66 LDA LFD84 MOV B,A LDA LFD85 ORA B L0E6E ORI 10000000b LDED LFD86 CALL L0E9D ulla OUT crtadr L072D IN vidctl ORA A JP L072D MVI A,' ' OUT viddat INX D L0738 IN vidctl ORA A JP L0738 MOV A,B OUT crtadr MOV A,D ORI 00001000b OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,nulla OUT crtadr L0750 IN vidctl ORA A JP L0750 XRA A OUT viddat DCX H MOV A,H ORA L JRNZ L0714 RET L075F XRA A STA column STA line LHLD starta XCHG JMP L0815 escflg db 0 line db 0 column db 0 attrib db 0 curpos dw 0 starta dw 0 LLD curpos LDA column MOV E,A MVI D,0 ORA A DSBC D MOV A,H ANI 00000111b MOV D,A MOV E,L LHLD curpos CALL L0AF0 POP B LXI H,80 ORA A DSBC B CNZ L0711 LHLD starta LXI B,80 ORA A DSBC B MOV A,H ANI 00000111b MOV H,A SHLD starta POP D JMP L0815 L0D4E SUI 22 JRZ L0D7C JNC L06A1 NEG PUSH PSW LHLD starta LXI D,1839 LXI B,80 DAD D MOV A,H ANI 00000111b MOV D,A MOV E,L DAD B MOV A,H ANI 00000111b MOV H,A XCHG POP PSW PUSH H DED LFD81 STA LFD8A LDED LFD7F CALL L0EF1 SDED LFD7F STA LFD8B MOV D,A LDA LFD8A MOV E,A CALL L0F01 LDA LFD81 MOV D,A LDA LFD82 CMP D MVI A,-1 JRC L0F81 MVI A,1 L0F81 STA LFD88 LDA LFD7F MOV E,A LDA LFD80 CMP E MVI A,-1 JRC L0F92 MVI A,1 L0F92 STA LFD89 LDA LFD8A MOV C,A LDA LFD8B CMP C MOV B,H MOV C,L LXI H,0 JRC L0FBD JRZ L0FD4 L0FA6 CALL L0F37 LDA LFD80 CMP E RZ LDA LFD89 ADD E MOV E,A DAD B JRNC L0FA6 LDA LFD88 ADD D org 0100h mvi a,23 sta lcount lxi d,005ch mvi c,0fh call 0005h inr a jz error lxi d,0080h mvi c,01ah call 0005h rdloop: lxi d,005ch mvi c,014h call 0005h ora a jnz done lxi h,0080h mvi d,080h outloop: mov a,m inx h cpi 01ah jz done push h push d cpi 00ah jnz notlf mvi e,00dh mvi c,002h call 0005h mvi e,00ah mvi c,02h call 0005h lda lcount dcr a sta lcount cz more jmp waslf notlf: mov e,a mvi c,002h call 0005h waslf: pop d+32 lxi d,tmpfile mvi c,DELETE call BDOS lxi d,tmpfile mvi c,MAKE call BDOS cpi 0ffh jz mkerr sta sawcr call infill call outinit chrloop: call getchr cpi EOF jz ineof mvi d,0 cpi CR jnz notcr lda conv ora a jnz chrloop ; to-unix: drop all CR inr d mvi a,CR notcr: cpi LF jnz notlf lda conv ora a jnz crlfok ; to-unix: do not add back CR lda sawcr ora a jnz crlfok mvi a,CR call putchr mvi d,0 crlfok: mvi a,LF notlf: push d call putchr ; This program can be used to remove an RSX that is persistent. ; The RSX must trap function 60 (CALL RSX) and honor sub function 113. ; The RSXPB is defined as: ; ; rsxpb: db 113 ; function code ; db 1 ; num params ; db name ; param: name of RSX to remove ; ; name: db 'TOREMOVE' ; must be 8 chars, blank padded ; ; This program expects the CCP to format the single commandline ; parameter into the default FCB, which will produce an 8-char ; (actually, 11) blank padded field. ; ; Usage: RSXRM 1 ldir lda outfile+1 cpi ' ' jz parerr noblank: lxi h,outfile call chkafn jnc parerr call trfile ; errors abort, do not return here jmp WBOOT multcp: lda outfile+1 cpi ' ' jnz parerr ; make list of matching files, then ; translate each one... lxi h,flist shld flptr xra a sta flcnt lxi d,inbuf mvi c,SETDMA call BDOS lxi d,infile mvi c,SERFST call BDOS cpi 0ffh jz inofile serloop: rlc rlc rlc rlc rlc ; * 32 mov e,a mvi d,0 lxi h,inbuf pop h dcr d jnz outloop jmp rdloop done0: pop h ; discard return addr done: lxi d,005ch mvi c,010h call 0005h ret error: lxi d,errmsg mvi c,09h call 0005h ret more: mvi a,23 sta lcount lxi d,moremsg mvi c,09h call 0005h mvi c,01h call 0005h cpi 0003h; Ctrl C jnz clearmsg pop h ; ret addr pop h ; saved DE pop h ; saved HL lxi d,crlf mvi c,09h call 0005h jmp done clearmsg: lxi d,clrmsg mvi c,09h call 0005h ret lcount: db 23 e; Translate text file between CP/M and Unix line-ends maclib z80 WBOOT equ 0000h BDOS equ 0005h CMDLINE equ 0080h CR equ 13 LF equ 10 EOF equ 26 CONOUT equ 2 PRINT equ 9 OPEN equ 15 CLOSE equ 16 SERFST equ 17 SERNXT equ 18 DELETE equ 19 READ equ 20 WRITE equ 21 MAKE equ 22 RENAME equ 23 SETDMA equ 26 SETATR equ 30 PARSE equ 152 BUFLEN equ 128 org 0100h jmp start infile: ds 36 outfile: ds 36 tmpfile: ds 36 sawcr: db 0 conv: db 0 bytcnt: db 0 flptr: dw 0 flcnt:pop d mov a,d sta sawcr jmp chrloop ineof: lda conv ora a jnz done0 ; Unix file, set byte count instead... ineof0: mvi a,EOF call putchr ; fill buffer and force flush... lda outcnt ora a ; zero means next putchr will flush... jnz ineof0 done0: lda outcnt mov c,a mvi a,BUFLEN sub c sta bytcnt ; 0..128 call outflush ; flushes full 128 byte record done: ; close all and rename tmpfile... call closeall lda conv ora a jz iscpm lda bytcnt sta tmpfile+32 lxi ; Example: RSXRM RSXTEST ; ; A compatible RSX must accept BDOS Function 60 RSX Function 113, ; compare it's name to the parameter, and if matching then set ; it's own REMOVE flag. ; ; See RSXTEST.ASM for an example, in the RSXFUN routine. ; org 100h start: lxi d,rsxpb mvi c,60 call 5 jmp 0 rsxpb: db 113 db 1 dw 005dh end  call 0005h lda lcount dcr a sta lcount cz more jmp waslf notlf: mov e,a mvi c,002h call 0005h waslf: pop ddad d inx h xchg lhld flptr xchg lxi b,11 ldir xchg mvi m,'$' inx h shld flptr lda flcnt inr a sta flcnt lxi d,0 mvi c,SERNXT call BDOS cpi 0ffh jnz serloop ; got list of 'flcnt' files at 'flist' ; There must be at least one if we get here... lxi d,cpying mvi c,PRINT call BDOS lxi h,flist lda flcnt floop: push psw push h lxi d,fprefx mvi c,PRINT call BDOS pop d push d mvi c,PRINT call BDOS pop h push h lxi d,infile+1 lxi b,11 ldirrmsg: db 'No File' crlf: db 13, 10, '$' moremsg: db 'MORE:$' clrmsg: db 13, ' ',13,'$' end ib ;reset attributes ANI 11110000b STA attrib ; ; clear rest of screen LDED curpos LXI H,80*25 ANI line25n ;test 25th line JRZ L0711 LXI H,80*24 L0711 LXI B,ramioL + (ramioH shl 8) ; L0714 IN vidctl ;wait for ??? ORA A ; JP L0714 ; MOV A,B OUT crtadr MOV A,D ANI 00000111b MOV D,A OUT crtreg MOV A,C OUT crtadr MOV A,E OUT crtreg MVI A,n db 0 pfcb: dw 0 ; text to parse dw 0 ; output FCB ; TODO: support things like A:=B:*.asm[u] start: lxi sp,stack lxi d,CMDLINE ldax d inx d ora a jz help mov l,a mvi h,0 dad d mvi m,0 ; ensure NUL terminated xchg shld pfcb lxi h,outfile shld pfcb+2 lxi d,pfcb mvi c,PARSE call BDOS mov a,h ana l cpi 0ffh jz parerr mov a,m ; HL point to next, unparsed, char cpi '=' jnz parerr inx h shld pfcb lxi h,infile shld pfcb+2 lxi d,pfcb mvi c,PARSE h,tmpfile+6 mov a,m ori 80h mov m,a lxi d,tmpfile mvi c,SETATR call BDOS ; trim file back to exact byte count ; check error? aborting doesn't help iscpm: lxi d,outfile mvi c,DELETE call BDOS ; check error? do anything different? lxi h,outfile lxi d,tmpfile+16 lxi b,16 ldir lxi d,tmpfile mvi c,RENAME call BDOS cpi 0ffh jz renerr ret getchr: lda incnt ora a cz infill lda incnt dcr a sta incnt lhld inptr mov a,m inx h shld inptr ret putchrr lxi h,infile+1 lxi d,outfile+1 lxi b,11 ldir call trfile pop h pop psw lxi b,12 dad b dcr a jnz floop jmp WBOOT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Translate file infile => outfile trfile: xra a sta infile+12 sta outfile+12 lxi h,outfile lxi d,tmpfile lxi b,16 ldir lxi h,tmpfile+9 mvi m,'$' inx h mvi m,'$' inx h mvi m,'$' ; FCBs all setup. lxi d,infile mvi c,OPEN call BDOS cpi 0ffh jz inofile xra a sta infilecall BDOS mov a,h ana l cpi 0ffh jz parerr mov a,m ; HL point to next, unparsed, char cpi '[' jnz parerr ; make this optional, default is no conversion? inx h mov a,m ani 0dfh ; toupper cpi 'U' jz convok cpi 'C' jnz parerr convok: ani 010h ; 0=to-cp/m, ~0=to-unix sta conv inx h mov a,m cpi ']' jnz parerr inx h mov a,m ora a jnz parerr lxi h,infile call chkafn jnc multcp lda outfile+1 cpi ' ' jnz noblank lxi d,outfile+1 lxi h,infile+1 lxi b,1: push psw lda outcnt ora a cz outflush lda outcnt dcr a sta outcnt pop psw lhld outptr mov m,a inx h shld outptr ret outflush: lxi d,outbuf mvi c,SETDMA call BDOS lxi d,tmpfile mvi c,WRITE call BDOS ora a jnz outerr outinit: lxi h,outbuf shld outptr mvi a,BUFLEN sta outcnt ret infill: lxi d,inbuf mvi c,SETDMA call BDOS lxi d,infile mvi c,READ call BDOS ora a jz inok cpi 1 jnz inerr mvi a,EOF ; should never happen for text file; ntpdate program for Kaypro CP/M 3 maclib z80 BDOS equ 0005h CMDLN equ 0080h ; BDOS functions CONOUT equ 2 PRINT equ 9 GETVER equ 12 SGSCB equ 49 ; CP/NET NDOS functions NSEND equ 66 NRECV equ 67 org 0100h jmp start ioport: db 038h vers: dw 0 scbadr: dw 0 gettime: db 0, 0, 2, 105, 0, 0 gottime: db 1, 2, 0, 105, 4, 0, 0, 0, 0, 0 ; just prediction of what will be received scbpb: db 03ah ; offset of SCB address (reserved area) db 0 ; get word, (SCB address) dw 0 ; ll netinit lxi b, gettime call sendmsg ora a jnz error lxi b, gottime call receivemsg ora a jnz error settime: lhld scbadr lxi d,058h ; date/time dad d xchg lxi h,gottime+5 lxi b,5 ; length of date/time di ldir ei lxi d,done mvi c,PRINT call BDOS lxi h,gottime+5 call prdate ret error: lxi d,errmsg mvi c,PRINT call BDOS ret badvers: lxi d,vermsg mvi c,PRINT call BDOS ret done: db 'Time was set to: $' errmsg: db 7,'Error retrieving nu $+64 outbuf equ stack inbuf equ outbuf+BUFLEN flist equ inbuf+BUFLEN end he parameter, and if matching then set ; it's own REMOVE flag. ; ; See RSXTEST.ASM for an example, in the RSXFUN routine. ; org 100h start: lxi d,rsxpb mvi c,60 call 5 jmp 0 rsxpb: db 113 db 1 dw 005dh end  call 0005h lda lcount dcr a sta lcount cz more jmp waslf notlf: mov e,a mvi c,002h call 0005h waslf: pop d,m inx h mov h,m mov l,a ; DE = days in year, HL = ytd[month] ora a dsbc d mov a,l ; potential remainder (neg) pop d pop h jnc prdat4 prdat5: ; B = month, 0-11; A = -dom neg push psw inr b mov a,b call decout mvi e,'/' mvi c,CONOUT call BDOS pop psw call decout mvi e,'/' mvi c,CONOUT call BDOS pop b mov a,b ; already BCD call hexout mvi e,' ' mvi c,CONOUT call BDOS pop h ; -> BCD hours mov a,m inx h push h call hexout mvi e,':' mvi c,s, but handle anyway sta inbuf inok: lxi h,inbuf shld inptr mvi a,BUFLEN sta incnt ret closeall: lxi d,tmpfile mvi c,CLOSE call BDOS lxi d,infile mvi c,CLOSE call BDOS ret parerr: lxi d,perrm mvi c,PRINT call BDOS lxi d,CMDLINE ldax d inx d mov l,a mvi h,0 dad d mvi m,'$' mvi c,PRINT call BDOS help: lxi d,usage mvi c,PRINT call BDOS jmp WBOOT mkerr: ; infile open, partial cleanup lxi d,merrm jmp abort inerr: ; both files open lxi assume < 100 decout: mvi b,'0' decot0: sui 10 jc decot1 inr b jmp decot0 decot1: adi 10 adi '0' push psw mov a,b call prout pop psw jmp prout ; Keeps number in HL - caller must preserve/init ; Returns CY for invalid hexnum: sui '0' rc cpi 9+1 jnc hexnm1 hexnm2: dad h dad h dad h dad h ora l mov l,a ret hexnm1: sui 'A'-'9' rc cpi 5+1 cmc rc adi 10 jmp hexnm2 hexout: push psw rrc rrc rrc rrc call hexdig pop psw hexdig: cetwork time.$' vermsg: db 7,'This program requires BDOS >= 3.0.$' ; These are only used if CP/Net is not running. netinit: lda ioport mov c,a inr c outp a inp a sta gettime+2 ret ; Send Message on Network sendmsg: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a mvi b,5 ; length of header outir ldx b,4 ; msg siz field (-1) inr b ; might be 0, but that means 256 outir inr c ; status port inp a ; ani 02h ; cmd CONOUT call BDOS pop h ; -> BCD minutes mov a,m inx h push h call hexout mvi e,':' mvi c,CONOUT call BDOS pop h ; -> BCD seconds mov a,m jmp hexout ; J F M A M J J A S O N D month0: dw 0, 31, 59, 90,120,151,181,212,243,273,304,334 month1: dw 0, 31, 60, 91,121,152,182,213,244,274,305,335 start: mvi c,GETVER call BDOS shld vers mov a,l cpi 30 jc badvers lxi h,CMDLN mov c,m inx h sid1: mov a,m cpi ' ' jnz sid0 inx h dcr c jd,ierrm jmp abort outerr: ; both files open lxi d,oerrm abort: push d call closeall lxi d,tmpfile mvi c,DELETE call BDOS pop d jmp errmsg renerr: ; files are all closed, no cleanup lxi d,rerrm jmp errmsg inofile: ; files not open yet, no cleanup lxi d,nerrm errmsg: push d lda flcnt ora a jz nocrlf mvi e,CR mvi c,CONOUT call BDOS mvi e,LF mvi c,CONOUT call BDOS nocrlf: pop d mvi c,PRINT call BDOS jmp WBOOT ; Check for '?' (ambiguous file nameall tohex prout: mov e,a mvi c,CONOUT jmp BDOS tohex: ani 0fh adi 90h daa aci 40h daa ret ; HL = CP/M Date-time field, w/o seconds ; Print date and time to console. prdate: mov e,m inx h mov d,m inx h push h ; compute year mvi c,78 ; base year, epoch, binary mvi b,078h ; year, BCD ; special-case date=0... mov a,e ora d jnz prdat0 inx d prdat0: lxi h,365 mov a,c ani 03h ; Not strictly true, but works until year 2100... jnz prdat1 inx h prdat1: poverrun rz mvi a,0ffh ret ; Receive Message from Network receivemsg: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a inr c ; status port rcvwait: inp a ani 01h ; data ready jz rcvwait dcr c mvi b,5 ; header length inir ldx b,4 ; msg siz inr b inir inr c inp a ani 04h ; rsp overrun rz mvi a,0ffh ret end nz sid1 jmp start1 ; no params, use defaults sid0: ; scan hex number as server ID xchg lxi h,0 sid2: ldax d inx d call hexnum jc sid3 dcr c jnz sid2 sid3: mov a,l sta gettime+1 start1: ; TODO: handle MP/M... lxi d,scbpb mvi c,SGSCB call BDOS shld scbadr lhld vers mvi a,2 ; bit for CP/Net ana h jz nocpnet lxi d,gettime mvi c,NSEND call BDOS ora a jnz error lxi d,gottime mvi c,NRECV call BDOS ora a jnz error jmp settime nocpnet: ca) in FCB HL ; Return CY set if unambiguous chkafn: mvi b,13 qchk: mov a,m cpi '?' rz inx h dcr b jnz qchk stc ret perrm: db 'Invalid: $' ierrm: db 'Error reading input$' oerrm: db 'Error writing output$' nerrm: db 'No file found for input$' merrm: db 'Error creating temp$' rerrm: db 'Error renaming temp$' usage: db CR,LF,'Usage: TR A:{outfile}=B:infile[U|C]$' cpying: db 'Copying -$' fprefx: db CR,LF,' $' outcnt: db 0 outptr: dw 0 incnt: db 0 inptr: dw 0 stack eqush h ora a dsbc d pop h jnc prdat2 ; done computing year... xchg ora a dsbc d xchg inr c mov a,b adi 1 daa mov b,a jmp prdat0 prdat2: ; DE = days within year 'C' push b ; save (2-digit) year, B = BCD, C = binary (until 2155) lxi h,month0+24 mov a,c ani 03h jnz prdat3 lxi h,month1+24 prdat3: ; compute month, DE = days in year,HL = mon-yr-days table adj for leap mvi b,12 prdat4: dcx h dcx h dcr b jm prdat5 ; should never happen... push h push d mov abufsiz endif thread equ $ dseg ;banked memory. tblkey: ;initial values only, copied by BIOS to its table. if int db 'IKEYBD',00001011b,6 ;I/O, hard-baud, no protocal, 300 else ;serial db 'KEYBD ',00001011b,6 ;I/O, hard-baud, no protocal, 300 endif ;serial intkey: if int call is1 lxi h,interupt shld sio1vec+4 lxi h,spclRx shld sio1vec+6 xra a sta keypt0 sta keypt1 mvi a,1 out keyb+2 mvi a,00011100b ;int on receive character, sts eff vect. ; SNIOS for fictitious CPNetDevice ; maclib z80 public NTWKIN, NTWKST, CNFTBL, SNDMSG, RCVMSG, NTWKER, NTWKBT, CFGTBL cseg ; Slave Configuration Table CFGTBL: ds 1 ; network status byte ds 1 ; slave processor ID number ds 2 ; A: Disk device +2 ds 2 ; B: " ds 2 ; C: " ds 2 ; D: " ds 2 ; E: " ds 2 ; F: " ds 2 ; G: " ds 2 ; H: " ds 2 ; I: " ds 2 ; J: " ds 2 ; K: " ds 2 ; L: " ds 2 ; M: " ds 2 ; N: " ds 2 ; O: " ds 2 ; P: " ds 2 ; console dey jmp outstkey jmp outputkey dw strkey dw tblkey dw modkey strkey: db 'KAYPRO ',0,'Keyboard handler ',0,'v3.10' dw vers db '$' modkey: db 00000000b,10000010b,00110100b,keyb ;primary conversion table for cursor and numberpad keys ; --0-- --1-- --2-- --3-- --4-- keycnv: db 0,ctrlP,ctrlU, 0, 0 ; B db ctrlV,ctrlW,ctrlY,ctrlQ, 0 ; C db ctrlR,ctrlO,ctrlF,ctrlB, 0 ; D db 0,ctrlA,ctrlN,ctrlG,ctrlT ; E db 0,ctrlE,ctrlX,ctrlS,ctrlD ; F ; ; * 0 . * * out keyb+2 ret endif is1: lxi h,modkey+2 bit 7,m rnz mov a,m ani 00110000b ; --bb---- bits per char rlc ; -bb----- mov e,a ; Tx image setb 3,e ; Tx Enable rlc ; bb------ ori 00000001b ; Rx Enable mov d,a ; Rx image mov a,m ani 00001111b ori 01000000b ; 16x clock mov b,a ; WR4 image dcx h mov a,m ; ani 10000010b ; DTR, RTS ora e mov e,a ; Tx control, with RTS/DTR inx h inx h mov c,m inr c inr c mvi a,4 outp a outp b ; WR4 inr a outp a ouevice +34 ds 2 ; list device: +36... ds 1 ; buffer index +2 db 0 ; FMT +3 db 0 ; DID +4 db 0ffh ; SID (CP/NOS must still initialize) db 5 ; FNC +6 db 0 ; SIZ +7 ds 1 ; MSG(0) List number +8 ds 128 ; MSG(1) ... MSG(128) +9... ioport: db 038h ; possibly configured here... ; Network Status Byte Equates ; active equ 0001$0000b ; slave logged in on network rcverr equ 0000$0010b ; error in received message senderr equ 0000$0001b ; unable to send message ; Utility e = enter ; 1 2 3 e * u = up arrow ; 4 5 6 , * d = down ; * 7 8 9 - l = left ; * u d l r r = right ; if int index: lxi d,keybd mov a,e add m mov e,a push psw mov a,m inr a ani bufmsk mov m,a pop psw rnc inr d ret spclRx: sspd ustk lxi sp,istk push psw mvi a,00110000b ;error reset out keyb+2 pop psw lspd ustk ei reti interupt: sspd ustk lxi sp,istk push psw push b push d push h xra a out keyb+2 in keyb+2 bvers equ '0e' ; December 23, 1985 21:40 drm "KEYBD.ASM" ;******************************************************** ; KEYBOARD module for CP/M plus on the KAYPRO * ; Copyright (C) 1985 Douglas Miller * ;******************************************************** maclib Z80 false equ 0 true equ not false dbase equ 200 ;base for all char I/O devices dev0 equ 001 ;first device, rel. to base ndev equ 1 int equ false ;Keyboard input via interupts? bufsiz equ 16 ;use only 2,4,8,16,32,64,128,2tp e ; WR5 mvi a,3 outp a outp d ; WR3 ret inputkey: inp1: call instkey jz inp1 if int lxi h,keypt1 call index ldax d else in keyb ; get data endif ora a rp sui 0B0H lxi h,keycnv ; first loc. is not used mov m,a xra a rrd mov c,m add c add c add c add c add c mov c,a mvi b,0 dad b mov a,m ret instkey: if int lxi h,keypt0 lda keypt1 sub m else xra a out keyb+2 in keyb+2 ; read from status port ani 1 ; isolate RxRdy Procedures ; ; Network Initialization NTWKIN: lxix CFGTBL mvi a,active stx a,+0 ; network status byte lda ioport mov c,a inr c ; status port xra a outp a dcr c inp a stx a,+1 ; our slave (client) ID xra a sta CFGTBL+36+7 ret ; Network Status NTWKST: lda CFGTBL+0 mov b,a ani not (rcverr+senderr) sta CFGTBL+0 mov a,b ret ; Return Configuration Table Address ; Still need this for BDOS func 69 CNFTBL: lxi h,CFGTBL ret ; Send Message on Network SNDMSG: it 7,a jnz break rrc jnc exit lxi h,keypt0 lda keypt1 dcr a ani bufmsk cmp m push psw call index in keyb ani 01111111b stax d pop psw jnz exit gobl: mov a,m dcr a ani bufmsk mov m,a exit: pop h pop d pop b pop psw lspd ustk ei reti break: mvi a,00010000b ;reset ext/status (& break) out keyb+2 in keyb xra a sta keybd sta keypt1 inr a sta keypt0 jmp exit ustk: dw 0 dw 0,0,0,0,0,0,0,0 istk: ds 0 keypt0: db 0 keypt1: db 0 keybd: ds 56. bufmsk equ bufsiz-1 sio1 equ 004h ;z80-sio/0 keyb equ sio1+1 ;CONSOLE keyboard ctrlA equ 1 ctrlB equ 2 ctrlD equ 4 ctrlE equ 5 ctrlF equ 6 ctrlG equ 7 lf equ 10 cr equ 13 ctrlN equ 14 ctrlO equ 15 ctrlP equ 16 ctrlQ equ 17 ctrlR equ 18 ctrlS equ 19 ctrlT equ 20 ctrlU equ 21 ctrlV equ 22 ctrlW equ 23 ctrlX equ 24 ctrlY equ 25 cls equ 26 extrn sio1vec cseg ;common memory, other parts in banked. dw thread db dbase+dev0,ndev jmp intkey jmp instkey jmp inputk endif rz ; return with zero ori true ret outputkey: outp0: call outstkey jrz outp0 ; wait for TxEmpty, HL->port mov a,c out keyb ; send data ret outstkey: mvi a,00010000b ;reset ext/status change out keyb+2 in keyb+2 ani 00000100b ; test xmit holding register empty rz ; ori true ret ; return true if ready end  badvers: lxi d,vermsg mvi c,PRINT call BDOS ret done: db 'Time was set to: $' errmsg: db 7,'Error retrieving n ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda CFGTBL+1 stx a,+2 ; Set Slave ID in header lda ioport mov c,a mvi b,5 ; length of header outir ldx b,+4 ; msg siz field (-1) inr b ; might be 0, but that means 256 outir inr c ; status port inp a ; ani 02h ; cmd overrun rz mvi a,0ffh ret ; Receive Message from Network RCVMSG: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a inr c ; lxi b,l01hhh call msgout jmp exit nocpnt: lxi b,l0212h ; CP/NET has not been loaded call msgout exit: lhld usrstk sphl ret chrout: mov e,c mvi c,002h call 00005h ret msgout: mov d,b mov e,c mvi c,009h call 00005h ret getver: mvi c,12 call 00005h ret getsts: mvi c,044h call 00005h ret getcfg: mvi c,045h call 00005h ret crlf: mvi c,13 call chrout mvi c,10 call chrout ret hexout: push b mov a,c rrc rrc rrc rrc cnc trycon ; Done with drives A-P... mov l,a mvi h,0 dad h ; *2 - 2 bytes per drive inx h inx h ; +2 - 2 bytes before drives xchg lhld nettbl dad d mov a,m ani 080h jz locdrv ; drive is local... push h lda count ora a cnz crlf lxi h,count inr m lxi b,l016dh ; Drive... call msgout lda curdrv adi 'A' mov c,a call chrout mvi c,':' call chrout lxi b,l0176h ; = Drive... i.e. REMOTE call msgout pop h push h mov a,m ani 00fh ; remote drive number astatus port rcvwait: inp a ani 01h ; data ready jz rcvwait dcr c ; data port mvi b,5 ; header length inir ; Could compare SLVID with "LDX r,1" and ignore messages. ; But this "hardware" is point-to-point (connection oriented) ; so the only messages we see are intended for us. ldx b,+4 ; msg siz inr b inir inr c ; status port inp a ani 04h ; rsp overrun rz mvi a,0ffh NTWKER: ret NTWKBT: ; NETWORK WARM START lda ioport mov c,a xra a ; Future hardware might expectall hexdig pop b mov a,c call hexdig mvi c,'H' call chrout ret hexdig: ani 0fh adi 90h daa aci 40h daa mov c,a jmp chrout ds 40 stack: ds 0 usrstk: dw 0 count: db 0 curdrv: db 0 nettbl: dw 0 end ; Thread terminator for CP/M 3 I/O modules. cseg ;common memory dw 0 ;terminate thread end ader lda ioport mov c,a mvi b,5 ; length of header outir ldx b,+4 ; msg siz field (-1) inr b ; might be 0, but that means 256 outir inr c ; status port inp a ; ani 02h ; cmd overrun rz mvi a,0ffh ret ; Receive Message from Network RCVMSG: ; BC = message addr mov h,b mov l,c ; HL = message address push h popix lda ioport mov c,a inr c ; di 'A' mov c,a call chrout mvi c,':' call chrout lxi b,l0180h ; on server... call msgout pop h inx h mov a,m ; server ID mov c,a call hexout locdrv: ; Drive is LOCAL... lxi h,curdrv inr m jmp drvlup trycon: lxi b,00022h lhld nettbl dad b mov a,m ani 080h jz trylst push h lda count ora a cnz crlf lxi h,count inr m lxi b,l01a2h ; Console Device = ... call msgout lxi b,l01b4h ; Console # call msgout pop h push h mov a,m call hexdig lxi data outp a inp a ; this is our Slave ID, but we already have it ret end --- mov e,a ; Tx image setb 3,e ; Tx Enable rlc ; bb------ ori 00000001b ; Rx Enable mov d,a ; Rx image mov a,m ani 00001111b ori 01000000b ; 16x clock mov b,a ; WR4 image dcx h mov a,m ; ani 10000010b ; DTR, RTS ora e mov e,a ; Tx control, with RTS/DTR inx h inx h mov c,m inr c inr c mvi a,4 outp a outp b ; WR4 inr a outp a ou; A version of CPNETSTS that minimizes output org 00100h jmp start l0103h: db 13,10,'CP/NET Status' db 13,10,'=============' db 13,10,'$' l012ch: db 'Requester ID = $' l013ch: db 13,10,'Network Status Byte = $' l0155h: db 13,10,'Device status:' db 13,10,'$' l016dh: db ' Drive $' l0176h: db ' = Drive $' l0180h: db ' on Network Server ID = $' l01a2h: db ' Console Device = $' l01b4h: db 'Console #$' l01ddh: db ' List Device = $' l01ech: db 'List #$' l01hhh: db ' All LOCAL$' l02 b,l0180h ; on Network Server ID = call msgout pop h inx h mov a,m mov c,a call hexout trylst: lxi b,00024h lhld nettbl dad b mov a,m ani 080h jz done push h lda count ora a cnz crlf lxi h,count inr m lxi b,l01ddh ; List Device = call msgout lxi b,l01ech ; List # call msgout pop h push h mov a,m call hexdig lxi b,l0180h ; on Network Server ID = call msgout pop h inx h mov a,m mov c,a call hexout done: lda count ora a jnz exit 12h: db 13,10,'CP/NET has not been loaded.$' start: lxi h,0 dad sp shld usrstk lxi sp,stack call getver mov a,h ani 02h jz nocpnt lxi b,l0103h ; Intro call msgout call getcfg shld nettbl lxi b,l012ch ; Req ID (client ID) call msgout lhld nettbl inx h mov c,m call hexout lxi b,l013ch ; Net Sts Byte call msgout call getsts mov c,a call hexout lxi b,l0155h ; Disk device status: call msgout xra a sta count sta curdrv drvlup: lda curdrv cpi 16 j public @lptbl cseg @lptbl: db 50, 51, 33,255 db 255,255,255,255 db 255,255,255,255 db 255,255,255,255 end lhld nettbl dad b mov a,m ani 080h jz done push h lda count ora a cnz crlf lxi h,count inr m lxi b,l01ddh ; List Device = call msgout lxi b,l01ech ; List # call msgout pop h push h mov a,m call hexdig lxi b,l0180h ; on Network Server ID = call msgout pop h inx h mov a,m mov c,a call hexout done: lda count ora a jnz exit m control (and floppy disk control bits) ********************************************************* ** SIO's ********************************************************* sio1datA equ sio1+0 sio1ctlA equ sio1datA+2 sio1datB equ sio1+1 sio1ctlB equ sio1datB+2 sio2datA equ sio2+0 sio2ctlA equ sio2datA+2 sio2datB equ sio2+1 sio2ctlB equ sio2datB+2 ********************************************************* ** PIO ********************************************************* pioAdat equ pio+0 pioAcc: dw 1000000000000000b iaivec: dw 0000000000000000b iaovec: dw 0000000000000000b ilovec: dw 0000001000000000b goccp: mvi a,1 ;select bank 1 (where CCP is) call bnksel jmp ccp ; then exit to ccp bdose: lhld @mxtpa call icall xra a call bnksel mov a,l mov b,h ret @@ set ($-BIOS$0) if (@@ and 0fh) ne 0 ds 16-(@@ and 0fh) endif ;put vectors on req. boundary, xxxxx000x for SIOs ; and xxxxxxx0 for PIO. @vect: sio1vec: dw nullsio ; chB TxE dw nullsio ; Ext/Sts dw nvers equ '1b' ; March 11, 2017 21:34 drm "MBIOS3KP.ASM" ;**************************************************************** ; Main BIOS module for CP/M 3 (CP/M plus) on the KAYPRO computer* ; Copyright (c) 1985 Douglas Miller * ;**************************************************************** maclib Z80 true equ -1 false equ not true bnksiz equ 56 ;size of banks, in "K". Either 48 or 56. compag equ bnksiz*4 ; C0 or E0, for MMU common page select bnktop equ compag shl 8 ;C000 or E000 jmp read ; read physical block(s) jmp write ; write physical block(s) jmp listst ; return list device status jmp sectrn ; translate logical to physical sector jmp conost ; return console output status jmp auxist ; return aux input status jmp auxost ; return aux output status ?dvtbl: jmp devtbl ; return address of device def table jmp cinit ; change baud rate of device ?drtbl: jmp getdrv ; return address of disk drive table jmp multio ; set multiple record count for disk I/O jmp tl equ pioAdat+2 pioBdat equ pio+1 pioBctl equ pioBdat+2 ********************************************************* ** RTC (MM58167 Real-Time Clock) ********************************************************* RTCDTA equ RTC RTCADR equ pioAdat RTCSEC equ 2 RTCMIN equ 3 RTCHRS equ 4 RTCDAY equ 5 RTCDAT equ 6 RTCMON equ 7 lastmon equ 10 ;month last accessed (used to detect year change) rtcyrs equ 8 ;years (decade) rtcent equ 9 ;century clrcnt equ 18 rtcsts equ 20 rtcis equ 16 ;interupt sullsio ; RxA dw nullsio ; Spcl dw nullsio ; chA TxE dw nullsio ; Ext/Sts dw nullsio ; RxA dw nullsio ; Spcl sio2vec: dw nullsio ; chB TxE dw nullsio ; Ext/Sts dw nullsio ; RxA dw nullsio ; Spcl dw nullsio ; chA TxE dw nullsio ; Ext/Sts dw nullsio ; RxA dw nullsio ; Spcl piovec: dw nullpio ;ch A dw nullpio ;ch B @v set @vect-BIOS$0 @@ set $-BIOS$0 if (@v shr 8) ne (@@ shr 8) ds 'Vect X page bound' endif wboot: lxi sp,staccr equ 13 lf equ 10 bell equ 7 cpm equ 0 bdos equ 5 ccp equ 0100h ; Console Command Processor gets loaded into the TPA ; SCB registers extrn @covec,@civec,@aovec,@aivec,@lovec,@ermde extrn @mxtpa,@sec,@min,@hour,@date extrn @lptbl ; External routines extrn ?getdp,?serdp ; Variables for use by other modules public @adrv,@pdrv,@rdrv,@side,@trk,@sect,@login public @dma,@dbnk,@cnt,@scrbf,@dtacb,@dircb public @dstat,@cmode,@dph,@rcnfg public @ctbl,@cbnk,bnkdos,resdos,wbtrap pflush ; flush BIOS maintained disk caching movev: jmp move ; block move memory to memory jmp timex ; Signal Time and Date operation ?bnksl: jmp bnksel ; select bank for code execution and default DMA ?stbnk: jmp setbnk ; select different bank for disk I/O DMA operations. jmp xmove ; set source and destination banks for one operation jmp search ; reserved for OEM: search for module. jmp 0 ; reserved for future expansion jmp 0 ; reserved for future expansion @dstat: ds 1 dw @lptbl ;ltatus rtcic equ 17 ;interupt control hbnk equ 2 ;bank to use for Hash tables. hstart equ 100h ;reserve page 0 for interupt vectors, etc. hsize equ (bnktop-hstart)/16 ;allocate space equally to each drive. ;-------- Start of Code-producing source ----------- cseg ; GENCPM puts CSEG stuff in common memory BIOS$0 equ $ bnkdos equ bios$0+0fc00h ;dummy values, reloc "Fxxx", GENCPM will resdos equ bios$0+0fd00h ; substitiute real values. jmp boot ; initial entry on cold start jmp wboot ; k xra a call bnksel jmp wboot1 ds 64 stack equ $ ds 32 iostk equ $ iostkp: dw $-$ nullsio: nullpio: ei reti ds 16 ;8 levels of stack intstk: ds 0 istk: dw 0 tick: sspd istk lxi sp,intstk push psw push h push b lxi h,@sec inr m lxi h,tictbl mvi b,numtic to4: mov a,m inx h cpi true jz to3 mov a,m ora a jrz to5 dcr m jrnz to3 push b push d push h inx h mov a,m inx h mov h,m mov l,a call icall pop h pop d pop b mov a,m ublic @vect,sio1vec,sio2vec,piovec ; Routines for use by other modules public ?timot public ?dvtbl,?drtbl public ?bnksl,?stbnk public ?halloc ********************************************************* ** I/O port base addresses ********************************************************* sio1 equ 004h ;z80-sio/0 sio2 equ 00ch ; " pio equ 020h ;modem and rtc functions rtc equ 024h ;real-time clock fdc equ 010h ;floppy disk controller mmu equ 03fh ;memory management sysctl equ 014h ;systeogical/physical drive table dw thread ;module thread dw ?serdp ;test mode validity, HL=memory address of ?serdp @adrv: ds 1 ; currently selected disk drive @pdrv: ds 1 ; physical drive number @rdrv: ds 1 ; module relative disk drive number curmdl: ds 2 ; currently selected Disk I/O module address @cmode: ds 2 @dph: ds 2 @dma: dw 0 wbtrap: dw 0 tmpdrv: db 0 defsrc: db 0,0ffh,0ffh,0ffh srctyp: db 000$00$000b ;only bits 3,4 are used (others ignored) icivec: dw 0100000000000000b icovereentry on program exit, warm start jmp const ; return console input status jmp conin ; return console input character jmp conout ; send console output character jmp list ; send list output character jmp auxout ; send auxilliary output character jmp auxin ; return auxilliary input character jmp home ; set disks to logical home jmp seldsk ; select disk drive, return disk parameter info jmp settrk ; set disk track jmp setsec ; set disk sector jmp setdma ; set disk I/O memory address ora a jrnz to3 to5: dcx h mvi m,true inx h to3: inx h inx h inx h djnz to4 too3: mvi c,rtcadr inp b ;save existing rtcadr mvi a,rtcis ;clear rtc INT flag outp a ; in rtcdta ; outp b ;restore rtcadr pop b pop h pop psw lspd istk ei reti ;resets PIO interupt ; SEARCH for a module by device #. ; entry: C = device # (0-249) ; exit: [CY] = not found ; else HL=module address ("init" entry) ; A=device number (relative to module's #0) ; search: xu0 call bnksel ;preserves BC. lspd iostkp xu0: mov a,b ora a ret swtosys: pop d ;routine return address lda @cbnk ora a jrz sw0 sspd iostkp lxi sp,iostk push psw xra a call bnksel pop psw sw0: push psw push d ret indjmp1: push h push d push b call indjmp pop b pop d pop h ret indjmp: xchg add m ;a=0,3,6,9,12,... mov e,a mvi a,0 inx h adc m mov d,a xchg pchl ;indirect call addjmp: add l ;a=0,3,6,9,... mov l,a mvi a,0 adc ,m mov l,c ;HL=chrtbl add a add a add a ;num.dev * 8 = number of bytes in module's table. mov c,a ;B=0 still ldir ;copy modules chrtbl into system table. in2: pop h jmp in0 in4: sub c ;compute number of devices that will fit. jnz in3 ;continue with initialization of tables jmp in2 notchr: ;HL point to init entry push d call icall ;"call" (HL) pop h jmp in0 clrpio: call twice twice: reti init$done: ;all Disk I/O modules are initialized. mvi c,11 in5: push b camov a,h ! ora a ; see if any more selected devices jrnz cis$next xra a ; all selected were not ready, return false ret conin: lhld @civec jr in$scan0 auxin: lhld @aivec in$scan0: call swtosys in$scan: push h call ist$scan ;see if there is a character ready pop h ora a jrz in$scan ;wait untill one is ready. mvi a,6 call indjmp ;get character jr xitusr conout: lhld @covec ; fetch console output bit vector jr out$scan0 auxout: lhld @aovec ; fetch aux output b111b ;bit 6 only out pioActl lxi h,tick shld piovec+0 mvi a,rtcis out rtcadr in rtcdta mvi a,rtcic out rtcadr mvi a,00000100b ;enable INT on 1-second interval out rtcdta ; mvi a,01$001111b ;input mode out pioBctl mvi a,0000$0111b ;no interupts out pioBctl mvi a,01001010b out pioBdat lxi h,piovec+2 mov a,l out pioBctl ; mvi a,2 out sio1ctlB out sio2ctlB lxi h,sio1vec mov a,l out sio1ctlB lxi h,sio2vec mov a,l out sio2ctlB ei ; Initialize all module lxi d,thread ;C=device number snext: xchg mov e,m inx h mov d,m inx h mov a,d ora e sui 1 ;produce [CY] if DE=0000 rc ;return if device not found, DE=0000 mov a,c sub m jrc snext inx h cmp m jrnc snext inx h ;point to "init" vector ora a ;set [NC] condition ret devtbl: lxi h,@ctbl ret @ctbl: db 'nodev ',0,0 ;character table, filled at cold-start. db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodev ',0,0 db 'nodeh mov h,a icall: pchl ;indirect call bnksel: sta @cbnk ; remember current bank push b mov b,a add a add a ora b ori compag out mmu pop b ret timex: ;time get/set. sded savede call swtosys ;destroys DE push h call gett pop h lded savede jmp xitusr savede: ds 2 xmove: mov a,b ;WR bnk add a add a ora c ;RD bnk ori compag sta xmbnk ret xmbnk: ds 1 move: lda xmbnk ora a jrz xxm0 out mmu xxm0: xchg ldir xchg ora a ;test xmbnk agaill cinit pop b dcr c jp in5 lhld icovec shld @covec ;set console I/O lhld icivec shld @civec ; lhld ilovec shld @lovec ;set list output device lhld iaovec shld @aovec ;set auxiliary I/O device lhld iaivec shld @aivec ; lxi h,defsrc lxi d,@ermde+1 ;location of default search chain in SCB lxi b,5 ldir lda srctyp ani 000$11$000b mov c,a lda @civec-10 ;location of search type flags in CCP section ani 111$00$111b ora c sta @civec-10 lxi d,signon mvi c,9 calit vector jr out$scan0 list: lhld @lovec ; fetch list output bit vector out$scan0: call swtosys out$scan: lxi d,cdtbl mvi b,0 co$next: slar h ; shift out next bit mvi a,12 cc indjmp1 inx d inx d inr b mov a,h ! ora a ; see if any devices left jrnz co$next ; and go find them... jr xitusr conost: lhld @covec ; get console output bit vector jr ost$scan0 auxost: lhld @aovec ; get aux output bit vector jr ost$scan0 listst: lhld @lovec ; get list output bit vs and build tables. lxi h,thread ;thread our way through the modules, in0: mov e,m ;initializing as we go. inx h mov d,m ;next module, or "0000" if we're past the end. inx h mov a,d ora e jz init$done mov a,m ;device base number inx h inx h ;thread+4 = init entry (JMP) sui 200 ;if Char I/O module, build entry(s) in tables. jc notchr push d ;save NEXT module address mov c,a mvi b,0 dcx h mov a,m ;number of devices inx h xchg ;DE=init entry point lxi h,cdtbl dad b v ',0,0 db 0 ;table terminator cdtbl: rept 8 ;character device table, filled at cold-start. dw cnull endm cnull: jmp null ;init jmp nulli ;input status jmp nulli ;input jmp nulli ;output status jmp null ;output nulli: mvi a,1ah ;E.O.F. character, also [NZ] to be always ready. ora a ;sets [NZ] condition. null: ret cinit: mvi b,0 ;C=device number (0-11) bit 3,c ;devices 8-11? rnz ;cannot init those mvi b,0 ;C=device number (0-7) slar c ;*2 for table index lxi h,cdtbl n lda @cbnk cnz bnksel xra a sta xmbnk ret @cbnk: db 0 ; bank for processor operations signon: db 13,10,7,'KAYPRO CP/M 3.10' dw vers db ' (c) 1985 DRI and DRM',13,10,'$' ccp$msg db 13,10,7,'No CCP$' ccprecs db 0 ccp$com db 1,'CCP COM',0,0,0,0 ds 16 fcb$nr db 0,0,0,0 tictbl: db true,0 dw $-$ db true,0 dw $-$ numtic equ ($-tictbl)/4 ;must be at end of all "cseg" code. thread equ $ dseg ; this part can be banked @login: ds 2 ;position is assumed by special bdose ; was there enough RAM? call set$jumps ;setup system jumps and put in all banks ; fetch CCP for first time, system will put it in bank 1. mvi a,0feh ;don't try warm boot on error... sta @ermde ; lxi d,ccp$com mvi c,15 ;open file call bdose inr a jz noccp xra a sta fcb$nr lxi d,ccp mvi c,26 ;set DMA address call bdose mvi e,64 ;read upto 64 records (8K) mvi c,44 ;set multi-sector count call bdose lxi d,ccp$com mvi c,20 ;read record(s) call bdose mov a,h ;H=nector ost$scan0: call swtosys ost$scan: lxi d,cdtbl mvi b,0 ;B = device number cos$next: slar h ; check next bit mvi a,9 ; [NZ] will assume device ready (in case no call made) cc indjmp1 ; check status for this device ora a ; see if device ready jrz xitusr ; if any not ready, return false inx d inx d inr b mov a,h ! ora a ; see if any more selected devices jrnz cos$next ori true ; if all selected were ready, return true ; jr xitusr xitusr: mov b,a pop psw ora a jrz dad b mov b,a mov a,c in1: cpi 12 jnc in4 ;if device # overflows, adjust next step. mov m,e ; inx h ; mov m,d ; inx h ; inr a djnz in1 dcx d ldax d ;number of devices in3: mov b,a mov a,c ;DE=module address, C=device base add a ; *2 add a ; *4 add a ; *8 mov c,a mov a,b ;number of devices mvi b,0 lxi h,@ctbl dad b xchg ;DE=@ctbl indexed by device base mvi c,17+1 ;B=0 still, point to CHRTBL vector dad b ;point to chrtbl location mov c,m inx h mov h dad b mov e,m inx h mov d,m mov b,c xchg pchl ;jump to modules "init" with B=device # const: lhld @civec ; get console input bit vector jr ist$scan0 auxist: lhld @aivec ; get aux input bit vector ist$scan0: call swtosys lxi d,xitusr push d ist$scan: lxi d,cdtbl mvi b,0 cis$next: slar h ; check next bit jnc is0 mvi a,3 ; assume device not ready call indjmp1 ; check status for this device ora a ! rnz ; if any ready, return true is0: inx d inx d inr b l BNKBDOS3.SPR... ; must be first item in DSEG. hlast: dw hstart hleft: dw bnktop-hstart boot: lxi sp,stack lxi h,@vect mov a,h stai im2 ; Verify that we have banked RAM... ; init PIO,RTC and tick interupt call clrpio ;reset any PIO interupts pending mvi a,11$001111b ;bit control mode out pioActl mvi a,11000000b ;7,6 inputs out pioActl lxi h,piovec+0 ;bit-0 of vector must be 0 mov a,l out pioActl mvi a,1011$0111b ;EI, OR, HI, mask follows out pioActl ; mvi a,10111umber of records actually read sta ccprecs xra a ;back to sta @ermde ;default mode for user lxi b,0001h ; save CCP in bank 0 for warm boots. call xmovccp ;NOTE: this restricts banked OS size. jmp goccp ; (allowing 8K for "CCP" and reserving page 0) wboot1: call set$jumps ; initialize page zero, selects bank 0 lxi b,0100h call xmovccp lhld wbtrap ; allow I/O modules to partake in the warm$boot. mov a,h ; ora l ; cnz icall ; jmp goccp xmovccp: call xmove lda ccprecs mov b29 sta mondays+1 ;February=29 stc ti8: dadc d ;normalize @date (we subtracted one too many) dcr b mov a,b adi 78 ;adjust year to 1900 mvi b,19 ;century cpi 100 jrc ti8@0 inr b sui 100 ti8@0: call binbcd sta timeyrs mov a,b call binbcd sta timecnt xchg ;remainder into DE mvi b,1 ;start taking out months. lxi h,mondays ti9: mov a,e sub m mov c,a mov a,d sbi 0 jrc ti10 mov e,c mov d,a inx h inr b mov a,b cpi 13 jrc ti9 ti10: mov a,b call binbcd jrnz selerr lda @rcnfg ora a cnz setup$dph jrc selerr lda @adrv add a mov c,a mvi b,0 lxi h,@dtbl dad b lded @dph mov m,e ;set current DPH in @dtbl inx h mov m,d jr selcom ;DE=dph selerr: lxi h,0 ret notlgi: lda @adrv add a mov c,a mvi b,0 lxi h,@dtbl dad b mov e,m ;get current DPH from @dtbl inx h mov d,m ;DE=dph sded @dph selcom: lhld @cmode lxi b,0 ; bit 7,m ;Tracks-per-side not valid for Hard disks. jrnz selxit inx h ; ; bit 1,m ;unless ;assumes 1 year elapsed lda timesec sta @sec lda timemin sta @min lda timehrs sta @hour mvi a,28 sta mondays+1 ;set February=28 lda timeyrs call bcdbin mov b,a lda timecnt sui 19h mov a,b jrz ti1@0 adi 100 ;adjust for century ti1@0: sui 78 ;years since 1978 (base year) mov b,a ; inr a ;adjustment for leap year calc. mov c,a ; srlr c ; srlr c ;divide by 4 = number of leap years (exclusive) ani 11b cpi 11b ;is this year a leap year? jrnz ti2 mvi a,29 sta m mov a,b ani 11110000b rrc mov b,a rrc rrc add b add c ret binbcd: sui 100 jrnc binbcd adi 100 mvi c,0 bb0: sui 10 inr c jrnc bb0 adi 10 dcr c slar c slar c slar c slar c ora c ret mondays: db 31,28,31,30,31,30,31,31,30,31,30,31 time: timesec: db 0 timemin: db 0 timehrs: db 0 timeday: db 0 timedat: db 0 timemon: db 0 db 0 ;thousandths of seconds, 4 bits only timeyrs: db 0 timecnt: db 0 lstmnth: db 0 numrtc equ $-time getdrv: lxi h,@dtbl !,a mvi c,0 srlr b rarr c ;BC=number of bytes in CCP lxi h,ccp lxi d,ccp jmp move set$jumps: mvi a,(JMP) sta cpm ! sta bdos ; set up jumps in page zero lxi h,BIOS$0+3 ! shld cpm+1 ; BIOS warm start entry lhld @mxtpa ! shld bdos+1 ; BDOS system call entry lxi b,0100h ;source bank 0, dest bank 1 call xmove lxi h,0 lxi d,0 lxi b,64 call move lxi b,0200h ;source bank 0, dest bank 2 call xmove lxi h,0 lxi d,0 lxi b,64 call move lxi b,0300h ;source bank 0, dest bank sta timemon sta lstmnth ;also set last accessed month mov a,e ;left-over must be date of month call binbcd sta timedat ; set day-of-week using Zeller's congruence: lda timeyrs ;E=([2.6m-.2]+K+D+[D/4]+[C/4]-2C) mod 7 call bcdbin ;0=sunday mov d,a lda timemon call bcdbin mov b,d sui 2 jrz ti11 jrnc ti12 ti11: adi 12 dcr b ti12: mov c,a add a add c ;*3 add a add a ;*12 add c ;*13 dcr a mvi c,0 ti13: inr c sui 5 jrnc ti13 dcr c lda timedat push b calits Z17... ; ; jrz sc0 ; ; mvi b,4 ;then side 1 has 4 less tracks (8 on DT) sc0: mvi a,40 ;assume 5" ST inx h bit 7,m ;check 5" drive jrz sc1 mvi a,77 ;8" drives have 77 tracks sc1: mov c,a ;set side 0 tracks sub b mov b,a inx h ;fix for HT bug bit 5,m ;check for DT jrz selxit slar b ;multiply # of tracks by 2 if DT slar c ; selxit: sbcd @tps lded @dph lxi h,+12 dad d ;point to DPB entry mov c,m inx h mov b,m push b ;save DPB ldax b ;sectors-per-track, byte value ondays+1 ;set february=29 ti2: lxi h,0 lxi d,365 ti3: dad d ;find number of days since 1978 djnz ti3 dad b ;(B=0) add in 1 day for each leap year lda timedat call bcdbin mov c,a mvi b,0 dad b ;add in days of this month lda timemon call bcdbin dcr a ;if January, nothing left to add. jrz ti4 mov b,a lxi d,mondays ;add in days of each month upto this. ti5: ldax d inx d add l mov l,a mvi a,0 adc h mov h,a djnz ti5 ti4: shld @date lda @sec ret sett: lda @hour ret @dtbl: dw dnull,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dnull: dw 0,0,0,0,0,0,0,0,0,@dircb,@dtacb,0 db 0 seldsk: mov a,c ! sta @adrv ; save drive select code lxi h,@lptbl mvi b,0 ! dad b ; create index from drive code mov a,m cpi 255 jrz selerr sta @pdrv mov c,a mov b,e ;save login flag thru "search" routine call search jrc selerr sta @rdrv shld curmdl push b ;save login bit lxi d,14 dad d ;point to dphtbl mov e,m ;DE=dphtbl inx h mov d,m inx h mov c, 3 call xmove lxi h,0 lxi d,0 lxi b,64 jmp move ?timot: ; (B)=I.D. (C)=count, (DE)=routine address push d to1: mvi e,numtic lxi h,tictbl di to0: mov a,m cpi true jrz to2 cmp b jrz to2 inx h inx h inx h inx h dcr e jrnz to0 ei mov a,c ;don't wait if all it wants is to clear a possible ora a ;existing entry, since none exists for that module. jrnz to1 ;-- maybe we should "ei hlt" and then jump -- pop d ret to2: pop d mov m,b inx h mov m,c inx l bcdbin pop b add c ;[2.6m-.2]+K add b ;+D srlr b srlr b ; [D/4] add b ;+[D/4] mov c,a lda timecnt ;century call bcdbin mov b,a slar b ; 2*C srlr a ;; srlr a ; [C/4] add c ;+[C/4] sub b ;-2*C mov c,a jp ti14 neg ti14: mvi b,0 ti15: inr b sui 7 jrz ti16 jrnc ti15 bit 7,c jrnz ti16 dcr b ti16: mov a,b add a add b ;*3 add a add b ;*7 bit 7,c jrz ti17 neg ti17: mov b,a mov a,c sub b inr a sta timeday mvi a,clrcnt ; out rtcadr ; mv lxi h,+15 dad b mov b,m ;psh inr b gh2: dcr b jz gh3 srlr a jr gh2 gh3: sta @pspt ;physical sectors per track xchg ;put DPH in (HL) for BDOS mov e,m inx h mov d,m ;DE=sectrn dcx h pop b ;BC=dpb ret setup$dph: ora a ;reset [CY] lhld @cmode ;HL=modes bit 7,m ;check for hard-disk drive (modes not standard) rnz call ?getdp stc rnz lhld @dph ;restore dph mov m,c ;set XLAT table inx h mov m,b lxi b,12-1 dad b ;point to dpb mov c,m ;get DPB addr inx h sta timehrs lda @min sta timemin lda @sec sta timesec lhld @date lxi d,365 mvi a,28 sta mondays+1 ;set february=28 mvi b,0 ;start counting years since 1978 ti6: mov a,b ; check for leap year ani 11b ;every 4 years, xri 10b ;starting with 1980 jrnz ti7 stc ;one extra day for leap years ti7: dsbc d ;does this year fit in @date? inr b ;count a year. jrnc ti6 ;yes, keep taking out more days (by years) mov a,b ;is this year a leap year? ani 11b xri 10b jrnz ti8 mvi a,m ;BC=modtbl inx h mov b,m lda @rdrv add a add a add a ;*8 mov l,a mvi h,0 dad b ;select mode bytes shld @cmode ;set current mode pointer pop b ;get login bit back. bit 0,b ;test for initial select. jrnz notlgi xchg ;DE=modes mov c,a mvi b,0 dad b ;+*8 dad b ;+*16 dad b ;+*24 lda @rdrv mov c,a dad b ;+*1 = +*25 shld @dph call setup$dph jrc selerr xra a sta @rcnfg mvi a,3 call calmod ;call module's "login" routine. ora a ;see if an error occured. h mov m,e inx h mov m,d ei ret noccp: lxi d,ccp$msg errx: mvi c,9 call bdose di ! hlt gett: inr c ;test for "FF" jz sett ;FF=set time ti0: lxi d,rtcsts+(numrtc shl 8) lxi h,time lxi b,rtcadr+(rtcsec shl 8) ti1: outp b ;select reg inr b in rtcdta mov m,a inx h outp e ;select status reg in rtcdta ora a jrnz ti0 dcr d jrnz ti1 lda timemon ;if last accessed month is greater lxi h,lstmnth ;than current month, the year must be cmp m ;changed. cc setyear$1i a,00000011b ;reset fractional seconds out rtcdta ;we now have one second to set time mvi d,numrtc lxi h,time lxi b,rtcadr+(rtcsec shl 8) ti18: outp b ;select reg inr b mov a,m out rtcdta inx h dcr d jrnz ti18 ret setyear$1: mov m,a ;set last-month dcx h dcx h mov a,m adi 1 daa mov m,a jrnc sy0 inx h mov a,m adi 1 daa mov m,a dcx h sy0: mvi d,3 ;3 registers to update lxi b,rtcadr+(rtcyrs shl 8) jr ti18 bcdbin: mov b,a ani 00001111b mov c,a mov h,m ;(HL=dpb) mov l,c xchg lxi b,17 ldir ora a ;reset [CY] ret ; Allocate space from hash pool. ; Does nothing if space exhausted (caller must init for "no hash") ; BC = size of hash, DE = &DPH.HASH ; Preserves BC, A ?halloc: lhld hleft ora a dsbc b rc ; no space shld hleft lhld hlast xchg mov m,e inx h mov m,d inx h mvi m,hbnk xchg dad b shld hlast ret home: lxi b,0 ; same as set track zero settrk: sbcd trk ret setsec: sbcd sect ret set 014h ;winchester disk control bits dev0 equ 50 ; first drive in system ndev equ 2 ; # of drives is system ; ********************************************************* ; * * ; * D a t a D e f i n i t i o n s * ; * * ; ********************************************************* ; windta equ 80h ;1002 data port winpcmp equ 81ha @cnt ! ret flush: xra a ! ret ; return with no error @side: ds 1 ; current side of media (floppy only) @trk: ds 2 ; current track number @sect: ds 2 ; current sector number @cnt: db 0 ; record count for multisector transfer @dbnk: db 0 ; bank for disk DMA operations @pspt: ds 1 @tps: ds 2 @rcnfg: ds 1 trk: ds 2 sect: ds 2 @dtacb: dw dtacb1 @dircb: dw dircb1 dircb1: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2100h ;directly after CCP image (max 8K CCP) db 0 dw dircb2 dircb2: dma: sbcd @dma lda @cbnk ; default DMA bank is current bank setbnk: sta @dbnk ret sectrn: mov l,c ! mov h,b mov a,d ! ora e ! rz xchg ! dad b ! mov l,m ! mvi h,0 dcx h ;sectors numbered 0 - (n-1) ret read: mvi e,6 ;read entry is +6 jmp rw$common ; use common code write: mvi e,9 ;write entry is +9 rw$common: ;do any track/sector/side conversion... xra a sta @side lhld trk shld @trk lhld sect shld @sect lhld @cmode bit 7,m ;floppy or hard-disk? jrnz rw0 inx h ;1002 precomp port winerr equ 81h ;1002 error port winsc equ 82h ;1002 sector count port winsec equ 83h ;1002 sector number port winlsb equ 84h ;1002 lsb of cylinder port winmsb equ 85h ;1002 msb of cylinder port winsdh equ 86h ;1002 size/drive/head port winstat equ 87h ;1002 status port wincmd equ 87h ;1002 command port ; rstcmd equ 10h ;1002 restore command seekcmd equ 70h ;1002 seek command rdcmd equ 20h ;1002 read command wrcmd equ db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2500h db 0 dw dircb3 dircb3: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2900h db 0 dw dircb4 dircb4: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,2d00h ;dir buffers: 2100-3100 db 0 dw 0000 ;end of DIR buffers dtacb1: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3100h db 0 dw dtacb2 dtacb2: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3500h db 0 dw dtacb3 dtacb3: db 0ffh ;drive db 0,0,0,0,0 dw 0,0,3900h db 0 dw dtacb4 dtacb4: db 0ffh ;drive db inx h inx h bit 6,m ;DS jrz rw0 mov a,m ani 01110b ;DSALG lxi h,dstbl mov c,a mvi b,0 dad b mov c,m inx h mov h,m mov l,c call icall rw0: mov a,e calmod: lhld curmdl jmp addjmp ; leap to driver ;; 0 1 2 3 4 5 6 7 dstbl: dw wrap,alt1,cont1,cont2,alt2,dsret,dsret,dsret cont2: lda @pspt ;as done by Gnat srlr a ;SPT must be EVEN mov c,a lxi h,@sect mov a,m sub c ;don't change the sector number on side 1 rc mov c,a ;save for cont1 jr sid; SNIOS Prefix (jump table) for CP/NET 1.2 on CP/M 2.2 maclib z80 extrn NTWKIN, NTWKST, CNFTBL, SNDMSG, RCVMSG, NTWKER, NTWKBT cseg ; Jump vector for SNIOS entry points jmp NTWKIN ; network initialization jmp NTWKST ; network status jmp CNFTBL ; return config table addr jmp SNDMSG ; send message on network jmp RCVMSG ; receive message from network jmp NTWKER ; network error jmp NTWKBT ; network warm boot end  30h ;1002 write command ; wincfg equ 10100000b ;ecc and sector size bits nosel equ 10111000b ;winchester de-select ; TODO: abstract all this to allow other drive types ; ST412 drive parameters (as used by Kaypro): ncyl equ 306 ; total number of cylinders lcyl equ ncyl-1 ; last cylinder number pcmpcyl equ ncyl/2 ;starting precomp cylinder number nhed equ 4 nsec equ 17 zsec equ 512 fsec equ zsec/128 ;--------- Start of Code-producing Source -------------- cseg ;put only0,0,0,0,0 dw 0,0,3d00h ;data buffers: 3100-4100 db 0 dw 0000 ;end of data buffers @scrbf dw 4100h ;scratch buffer 4100-4500 ; Max. system space: 4500h to "bnktop", 38K if 8K common. end vers equ '0e' ; March 12, 2017 16:15 drm "WIN3KP.ASM" ;********************************************************* ; Winchester Disk I/O module for CP/M 3.1 on KAYPRO ; Copyright (c) 2017 Douglas Miller ;********************************************************* MACLIB Z80 extrn @dph,@rdrv,@side,@trk,@sect,@dma,@dbnk,@dstat extrn @dtacb,@dircb,@scrbf,@rcnfg,@cmode extrn ?bnksl,?timot,?getdp extrn ?halloc extrn @lptbl false equ 0 true equ not false ; Ports and Constants sysctl eque1 cont1: call cont2 rc mov m,c ret ;side1 already set alt1: lxi h,@trk rarr m mvi a,0 ral jr sside alt2: call alt1 ;Kaypro ora a ;side 0? rz ;yes, done. lxi h,@sect ;for KAYPRO, sectors on side 1 lda @pspt ;are numbered PSPT+1 to PSPT*2. add m ; mov m,a ret wrap: lbcd @tps ;B=tracks on side 1, C=tracks on side 0 lda @trk ;(for all except Z17, B=C) cmp c rc neg add c add b dcr a sta @trk side1: mvi a,1 sside: sta @side dsret: ret multio: st whats necessary in common memory... dw thread db dev0,ndev jmp init$win jmp login$win jmp read$win jmp write$win dw string dw dphtbl,modtbl string: DB 'KAYPRO ',0,'Winchester Disk Interface ',0,'3.10' dw vers db '$' winlun equ 00001000b ; Kaypro convention winpt0 equ 00000000b winpt1 equ 00000010b winpt2 equ 00000100b winpt3 equ 00000110b ; Both partitions use cyls 0-305, but different heads. ; head = (PTN << 1) + (track & 1) ; track >>= 1 modtbl: ; -PTN cfg-byte-templa in windta dcr b jrnz initw1 lhld d0dsm shld dpb0+5 lhld d1dsm shld dpb1+5 ret login$win: lda offline ora a rnz ; This should prevent read/write from ; ever being called ; TODO: check init flag (per LUN, not partition) ; and call winrest (anything else?). ; Could always select LUN and test READY. lda romid cpi 'U' mvi a,0 rnz lhld @cmode mov a,m ani 00000011b ; ptn add a add a ; 4 bytes per drive inr a inr a ; +2 for cyl offset mov e,a mvi d,0 lxi sy call timer ;else count down jrnz winrest11 ; disable: xra a dcr a sta offline ; disable drive... ret ;and return that status to caller winrest3: in winerr ;check for diagnostic errors cpi 1 ;if error jrz winrest31 ;ignore "diagnostic only" errrors ; ana a ;believe all others jrnz disable ;abort if an error shown winrest31: call winpsel ; call winrdy ;ready wait jrnz winrest32 call winrdy ;wait for device ready (again?) jrz drptn: dw 0 ; cyl offset of current partition ; driver init. DRM+1 is fixed at 1024 init$win: lxi h,@lptbl mvi c,16 initw3: mov a,m sui dev0 cpi ndev jc initw2 inx h dcr c jnz initw3 ret ; no HDD drives in system, do nothing. ; alternatively, could check for existence of hardware. ; for example, AND inputs from ports 80-87 and if 0FFH ; then ahrdware does not exist. initw2: ; if we allow dynamic addition of drives (changes to lptbl), ; then this needs to be triggered in loom here on... call win$rw ; xfer from common memory... xra a ret write$win: mvi a,wrcmd sta cmdbuf call setup$win jrz error ; timeout on READY lda cmdbuf out wincmd lxi d,0 mvi h,3 write1: in winstat bit 3,a ; DRQ jrnz write2 call timer jrnz write1 ; timeout - no failure here? we'll get error from winbusy? write2: call win$rw ; xfer from common memory... call winbusy jrz error in winstat bit 0,a ; ERROR jrnz error xra a ret error: ; possible retry.te ---not-used-------- DB 10000000b,wincfg+winlun+winpt0,00000000B,00000000B db 11111111b,11111111b,11111111b,11111111b DB 10000001b,wincfg+winlun+winpt1,00000000B,00000000B db 11111111b,11111111b,11111111b,11111111b ; currently, both (all) partitions are identical, ; due to head-slice algorithm for partitioning. ; But, Universal ROM pulls DSM from partition info on disk, ; So each could be different... Also, ROM version selects OFF... dpb0: dw nsec*fsec ; SPT db 5,01fh,1 ; BSH,Bh,partns dad d mov a,m inx h mov h,m mov l,a shld curptn ; cyl offset of current partition xra a ret setup$win: lhld @cmode inx h mov b,m ; SDH template eSSDDHH- lda @trk ani 1 ora b ; eSSDDHHH out winsdh call winrdy rz ; timeout mvi a,pcmpcyl out winpcmp ; This is horrible, but since 302C ROM does it ; we also must to keep compatible on disk: ; if (trk > 7) trk += 4; ; else if (trk >= 4) trk += (trk - 4); ; For universal ROM: ; if (trk > 1 || ptisable ;abort if timed out (twice) ; winrest32: mvi a,rstcmd ;issue the restore command out wincmd ; call winbusy ;wait for not busy jrz disable ;abort if timed out ; in winstat ;get device status ; bit 0,a ;if there was an error jrnz disable ;abort winrest6: xra a sta offline ret ;return that status to caller ; winpsel: ; ; WD 1002 physical select routine ; ; for now, assume "drive 0" has valid LUN ; lda modtbl+1 ; fully-formed SDH byte from "drive gin$win by an init flag. lxi b,1024*4 lxi d,d0h-2 call ?halloc lxi d,d1h-2 call ?halloc xra a sta offline lda 0050h ; gift from loader: ROM id sta romid ; TODO: move to login code, for each LUN... call winrest ; TODO: Universal ROM uses track xlat (spares) table... ; For virtual hardware it should not matter. ; But, partition info is also stored there. Need that now. lda romid cpi 'U' rnz ; done if not Universal ROM lxi h,2 ; new OFF shld dpb0+13 shld dpb1+13 lda mo.. ; possible recovery - step, restore, etc. xra a inr a ret ; ; WD 1002 interface routines. ; ; Written by: T. Hayes ; ; These routines provide the physical interface between the system ; and the WD 1002 winchester controller. ; winrest: ; ; Reset and restore the winchester disk ; ; On entry: ; B contains the configuration byte of the drive to be accessed ; ; On exit: ; A and B contain the configuration bytSM,EXM dw 1125,1023 ; DSM,DRM db 0ffh,000h ; ALV0 dw 08000h,4 ; CKS,OFF db 2,003h ; PSH, PSM dpb1: dw nsec*fsec ; SPT db 5,01fh,1 ; BSH,BSM,EXM dw 1125,1023 ; DSM,DRM db 0ffh,000h ; ALV0 dw 08000h,4 ; CKS,OFF db 2,003h ; PSH, PSM ; Controller is already done by now win$rw: lda cmdbuf ani 010h mvi a,0b2h ; inir jrz nread mvi a,0b3h ; outir nread: sta here+1 lda @dbnk call ?bnksl lhld @dma lxi b,windta mvi e,2 here: inir dcr e jrnz here xra a call ?bnksn > 0) trk += 12; ; All: ; putHd((trk & 1) | (ptn << 1)); ; putCyl(trk >> 1); lhld @trk lda romid cpi '3' jrnz setup2 mov a,l ani 11111000b ora h jrz setup1 lxi d,4 dad d jr setup2 setup1: mov a,l cpi 4 jrc setup2 sui 4 add l ; CARRY not possible mov l,a setup2: srlr h rarr l ; from here on, use cyl lda romid cpi 'U' jrnz setup3 ; probably wrong, but should not have WD1002 ; B is still eSSDDHH- from above lded curptn ; cyl offset dad d mov a,0" ; out winsdh ;and issue the select ret ;return to caller timer: ; ; General down counter routine ; ; On entry: ; HDE are a 24 bit counter ; On exit: ; The counter will have been decremented ; zero is set if the counter is done ; zero is reset if the counter is not at 000000h ; ; Typical timings are 25 t states in the loop with an additional ; overhead of 29 t states in the calling routine. Tdtbl+1 ; spares must be on "drive 0" out winsdh call winrdy jz disable xra a out winlsb out winmsb ; Cyl 0 inr a out winsc ; 1 sector mvi a,nsec-1 out winsec ; last sector on track mvi a,rdcmd out wincmd call winbusy jz disable ; TODO: checksum verification... ; surgically read partition info from buffer... lxi b,ptnoff initw0: in windta dcx b mov a,b ora c jrnz initw0 mvi b,partnz mvi c,windta lxi h,partns inir mvi b,ptnend ; rest of sector initw1: e altered as follows: ; Bits 2 and 3 will be set if the drive is off line ; or reset if the controller is ready ; ; in sysctl ;first issue a controller reset setb 1,a out sysctl push psw ; mvi h,1 ;hold reset for > 50 ms lxi d,0 winrest1: call timer jrnz winrest1 pop psw ; res 1,a ;select controller (MR off) out sysctl ; mvi h,3 lxi d,6000h winrest11: in winstat ;Check busy bit 7,a ; jrz winrest3 ;go on if not bul ret offline db 0 ; fatal error prevents use cmdbuf db 0 romid db 0 thread equ $ dseg ; HASH/HBANK is set by main bios... dphtbl: dw 0,0,0,0,0,0,dpb0,0,alv0,@dircb,@dtacb,0ffffh d0h: db 0 ; HBANK dw 0,0,0,0,0,0,dpb1,0,alv1,@dircb,@dtacb,0ffffh d1h: db 0 ; HBANK alv0: ds 512 ; really only need about 283 alv1: ds 512 ; ptnoff equ 302 ; offset in sector of ptn tbl partns: d0dsm: dw 0 d0cyl: dw 0 d1dsm: dw 0 d1cyl: dw 0 partnz equ $-partns ptnend equ zsec-ptnoff-partnz cul ora h ; cyl 0 is special case jrnz setup4 mov a,b ani 00000110b jz setup3 ; partition 0 no xlat setup4: lxi d,6 dad d setup3: mov a,l out winlsb mov a,h out winmsb lda @sect out winsec mvi a,1 out winsc ora a ret read$win: mvi a,rdcmd sta cmdbuf call setup$win jrz error ; timeout on READY lda cmdbuf out wincmd call winbusy jrz error ; timeout on BUSY in winstat bit 0,a jrnz error ; ERROR set bit 3,a jrz error ; no DRQ ; no more errors frhis assumes ; that the calling routine is using a call xxx and jr nz,xxxx. ; This gives a time of 13.5 usec for each iteration of the loop. ; Times when de goes 0 will be marginally longer but should not ; be significant. ; dcx d mov a,d ora e rnz dcr h ret ; TODO: make use of this somehow... winoff: ; ; If the 1002 is not at 305, seek track ; 305 then select physical unit 3. It is assumed that ; the host buffer has been flushed. ; in wine. inx h mov b,m inx h MOV A,M ; get first mode byte ani srm0 ; mask FIRST BYTE MOV E,A INX H ; and point to the second MOV A,M ani srm1 ; mask SECOND BYTE MOV D,A pop h ; table lookup... NXDPB: MOV A,M ; format origin code. inx h ana c ;compare it: if the format requested matches jrnz got1 ;(if the bit is set in both DPB and requested mov a,m ; mode ([NZ] condition) then we have a match.) ana b ;check for possible extend format origin jrz nxd1 ;... gdt dw z376,0 DB 00000000b,00001000B,00000000B,10110001B ; z37,dd,ss,dt dw z377,0 DB 00000000b,00010000B,00000000B,10110001B ; z37x,dd,ss,dt dw z378,0 DB 00000000b,00001000B,00000000B,11100011B ; z37,sd,ds,dt dw z379,0 DB 00000000b,00001000B,00000000B,11110011B ; z37,dd,ds,dt dw z37a,0 DB 00000000b,00010000B,00000000B,11110011B ; z37x,dd,ds,dt dw z37b,0 DB 00000000b,00100000B,00000000B,10010001B ; z100,dd,ss,st dw z100a,0 DB 00000000b,00100000B,00000000B,11010011B ; z100,dde (bytes) * exd = Extra Directory entries reserved * [flg]= optional flag to intentionally produce incorrect EXM * (used to maintain compatability with previous formats) * calcdpb macro ?spt0,?spb0,?dsm0,?drm0,?off0,?pss0,?exd0,?flg ?bsm set ?spb0-1 ?exm set ?bsm shr 3 if ?dsm0 gt 256 ?exm set ?exm shr 1 endif if not NUL ?flg ?exm set ?exm shr 1 endif ?cks set ?drm0/4 ?exs set ?exd0/4 ?bsh set 0 ?@ set ?spb0 rept 8 ?@ set ?@ shr 1 if ?@ eq 0 exitm endif ?bsh set ?bshrmats must have a entry here ; strtbl db 'KAYPRO ' ;bit 0 - must be 8 characters wide db 'UNUSED ' ;bit 1 db 'MMS ' ; 2 db 'Z37 ' ; 3 db 'Z37X ' ; 4 db 'Z100 ' ; 5 db 'EPSON ' ; 6 db 'ASSOC ' ; 7 db 'FMT8 ' ; 8 db 'FMT9 ' ; 9 db 'FMT10 ' ; 10 db 'FMT11 ' ; 11 db 'FMT12 ' ; 12 db 'FMT13 ' ; 13 db 'FMT14 ' ; 14 ; ;---------------------------------------------------------------------- ; ; ;---------------lsb ;see if the drive is at 305 already cpi high lcyl jrnz winoff1 in winmsb cpi low lcyl jrz winoff2 winoff1: ; mvi a,high lcyl out winmsb mvi a,low lcyl out winlsb ; mvi a,seekcmd ;now issue a seek to that cylinder out wincmd ; ret ;return to caller winoff2: mvi a,nosel ;now deselect the drive out winsdh ; ret ;and return to caller winrdy: ; ; Wait for device ready ; mvi h,5 lxi d,0 winrdy1: in winstat ;check for ready bit 6,a rnot1: inx h MOV A,M ; get first byte INX H ani srm0 ;mask it also CMP E ;compare to target mode jrnz NXD3 MOV A,M ; and the second ani srm1 ;mask it CMP D ;compare it jrnz NXD3 inx h mov e,m ;pick up DPB inx h mov d,m inx h mov c,m ;pick up XLAT also inx h mov b,m xchg ;DE=table pointer, HL=DPB xthl ;put DPB on stack, get HL=requested mode inx h inx h ;point past "format origin" push b ;put XLAT on stack. xchg lxi b,-5 dad b ;point back to table's mod,ds,st dw z100b,0 DB 00000000b,00100000B,00000000B,10110001B ; z100,dd,ss,dt dw z100c,0 DB 00000000b,00100000B,00000000B,11110011B ; z100,dd,ds,dt dw z100d,0 DB 00000000b,01000000B,00000000B,01010101B ; 5" EPSON,dd,ds,st dw epson,0 DB 00000000b,10000000B,00000000B,01010111B ; 5" GNAT,dd,ds,st dw gnat,0 DB 00000000b,00000001B,00000000B,00011000B ; 5" KAYPRO dd,ss,st dw kaypro0,0 DB 00000000b,00000001B,00000000B,01011000B ; 5" KAYPRO dd,ds,st dw kaypro1,0 DB 00000000b,00000001b+1 endm ?al0 set 0 rept (?cks+?exs+?bsm)/?spb0 ?al0 set (?al0 shr 1) or 10000000$00000000b endm ?al1 set low ?al0 ?al0 set high ?al0 ?psh set 0 ?psm set 0 ?@ set high ?pss0 rept 8 if ?@ eq 0 exitm endif ?psh set ?psh+1 ?psm set (?psm shl 1) or 1 ?@ set ?@ shr 1 endm dw ?spt0 db ?bsh,?bsm,?exm dw ?dsm0-1,?drm0-1 db ?al0,?al1 dw ?cks,?off0 db ?psh,?psm endm ; Entry: HL = points to Mode bytes ; Exit: A = error code (0 if DPs found) ; DE = points to DPB ------------------------------------------------------- ; ; SRM0: equ 10000001B ; SRM1: equ 01110000B ;SEARCH MODES MASKS XSM0: equ 00000000B ; XSM1: equ 10001111B ;EXCESS MODES MASKS PTRTBL: DB 00000000b,00000100B,00000000B,00010001B ; 5" mms,dd,ss,st dw mms0,0 DB 00000000b,00000100B,00000000B,01010001B ; 5" mms,dd,ds,st dw mms1,0 DB 00000000b,00000100B,00000000B,00110001B ; 5" mms,dd,ss,dt dw mms2,0 DB 00000000b,00000100B,00000000B,01110001B ; 5" mms,dd,ds,dz ;return if it is ; call timer ;else count down rz ;return if timed out jr winrdy1 ;else try again ; ; winbusy: ; ; Wait for device not busy ; mvi h,7 ;set up dead man counter lxi d,0 winbusy1: in winstat ;get status cma bit 7,a ;if not busy rnz ;return call timer ;else count down rz ;and return if timed out jr winbusy1 ; end es xchg ; ldax d ;get "excess" mode bits. ani xsm0 ;mask in bits to give caller. mov c,a mvi a,(not xsm0) and 0ffh ana m ;clear callers bits prior to setting again ora c ;complete callers mode bytes mov m,a inx h inx d ldax d ;get "excess" mode bits. ani xsm1 ;mask in bits to give caller. mov c,a mvi a,(not xsm1) and 0ffh ana m ;clear callers bits prior to setting again ora c ;complete callers mode bytes mov m,a pop b ;restore XLAT pop d ;restore DPB lxi h,st,00000001b,01110011b ; 5" KAYPRO qd,ds,qt dw kaypro3,kpqtx DB 11111111B ;FLAG FOR END OF TABLE $*MACRO dseg ;DPBs and SECTRN tables in banked mem MMS0: calcdpb 36,16, 83, 96,3,512,0 MMS1: calcdpb 36,16,173, 96,3,512,0 MMS2: calcdpb 36,32, 86,128,3,512,0 MMS3: calcdpb 36,32,176,128,3,512,0 Z370: calcdpb 20, 8, 92, 64,3,256,0 Z371: calcdpb 32, 8,152,128,2,256,0 Z372: calcdpb 40, 8,186,128,2,1024,0 Z373: calcdpb 20, 8,188,128,3,256,0 Z374: calcdpb 32,16,156,256,2,256,0,@; BC = points to sector translation table (or BC=0) ; HL = offset from ?serdp to beginning of format string table ; Uses 2 levels of stack. ; public ?getdp,?serdp cseg ;for now we'll put it all in common memory. ?serdp: ;user has to tell us where we are. lxi b,PTRTBL-?serdp ;HL=memory address of "?serdp" dad b ;DE=mode bytes xchg jr gd1 ?GETDP: lxi d,ptrtbl gd1: PUSH H ; save mode byte pointer push d ;save parameter table address mov c,m ;no need to mask format origin codt dw mms3,0 DB 00000000b,00001000B,00000000B,10000001B ; z37,sd,ss,st dw z370,0 DB 00000000b,00001000B,00000000B,10010001B ; z37,dd,ss,st dw z371,0 DB 00000000b,00010000B,00000000B,10010001B ; z37x,dd,ss,st dw z372,0 DB 00000000b,00001000B,00000000B,11000011B ; z37,sd,ds,st dw z373,0 DB 00000000b,00001000B,00000000B,11010011B ; z37,dd,ds,st dw z374,0 DB 00000000b,00010000B,00000000B,11010011B ; z37x,dd,ds,st dw z375,0 DB 00000000b,00001000B,00000000B,10100001B ; z37,sd,ss,; December 21, 1985 10:46 drm "GETDP3KP.ASM" maclib Z80 ; $-MACRO @ equ -1 ; CP/M 3.0 system routine to select a DPB and sector translation table ; given the mode bytes (4) **************************************************** * label: calcdpb spt,spb,bpd,dpd,nst,pss,exd[,flg] * * spt = Sectors per Track * spb = Sectors per allocation Block * bpd = allocation Blocks per Disk (max (DS)) * dpd = Directory entries per Disk * nst = Number of System Tracks * pss = Physical Sector Sizrtbl-?serdp ; load address of string table XRA A ; and clear the accumulator RET ; as this is the successful return NXD1: INX H NXD2: INX H nxd3: inx h inx h inx h inx h inx h MOV A,M CPI 11111111B jrnz NXDPB ; loop if more entries in table POP H ; restore mode byte pointer lxi h,strtbl-?serdp ; load address of string table xra a ! dcr a ; return [NZ] if DPs not found. RET ; as this is the error return ; ; (10-256 byte) ; Format string name table - all fo Z375: calcdpb 40,16,195,256,2,1024,0,@ Z376: calcdpb 20, 8,192, 64,3,256,0 Z377: calcdpb 32,16,156,128,2,256,0 Z378: calcdpb 40,16,195,128,2,1024,0 Z379: calcdpb 20,16,196,128,3,256,0 Z37A: calcdpb 32,16,316,256,2,256,0 Z37B: calcdpb 40,16,395,256,2,1024,0 Z100a: calcdpb 32, 8,152,128,2,512,0 ;; 5" disks Z100b: calcdpb 32,16,156,256,2,512,0,@ Z100c: calcdpb 32,16,156,128,2,512,0 Z100d: calcdpb 32,16,316,256,2,512,0 epson: calcdpb 80,16,190,128,2,512,0 gnat: calcdpb 80 ; or OUTI jnz rd4 rd3: hlt rd32: INI ; or OUTI jnz rd3 rd2: hlt rd22: INI ; or OUTI jnz rd2 rd1: hlt rd12: INI ; or OUTI jnz rd1 ei hlt rd0: in fdcstat rrc jrc rd0 rlc ana d push psw mvi a,11010000b ;reset 1797 to TYPE$I status out fdccomd ; in fdcstat ; lda savNMI sta 0066h mvi a,0 call ?bnksl pop psw lspd savSTK ret thread equ $ ;must be last statement in "cseg" dseg ;put most everything in banked memory... dphtbl: dw 0,0,0,0,0,0,dpb0,csv0,alvFLG ORA A ; MODE BEEN CHANGED ? jz physel7 ; NO KEEPING OLD MODE BYTES ldx a,+1 xri 00010000b ; return mode bytes to former state stx a,+1 jmp physel6 ; jmp to error ; ; EXTRACT MODE INFORMATION FROM LABEL ; physel2: lhld @scrbf lxi d,LABHTH dad d ; HL POINTS TO HEATH EXTENSION IN LABEL ldx b,-1 ; keep old format ldx c,-2 mvix 0,-1 mvix 0,-2 mov a,m ani 111$00000b cpi 001$00000b ; z100 formats jrnz nf1 setx 5,-1; ; set mode byte jr setmode nf1: cpi 011$00EXTENSION" IN SECTOR 0 MODE2S EQU 00000001H ; DOUBLE SIDED LABDPB EQU 0DH ; START OF DPB IN SECTOR 0 LABVER EQU 00 ; LABEL VERSION NUMBER DPEH37 EQU 60H ; I.D. ;--------- Start of Code-producing Source -------------- cseg ;put only whats necessary in common memory... dw thread db dev0,ndev jmp init jmp login jmp read$fdc jmp write$fdc dw string dw dphtbl,modtbl string: DB 'KAYPRO ',0,'Floppy Disk Controller ',0,'3.10' dw vers db '$' modtbl: DB 00000000b,0000000e IX lixd @cmode inxix inxix sixd cmode ;save cmode+2 for faster access to modes xra a sta selerr ; NO SELECT ERROR (YET) bitx 7,+1 ; SHOULD WE READ TRACK 0 SECTOR 0 ? cnz physel bitx 7,+0 ; IS IT A 5.25" DISK ? jrnz login1 lda selerr ora a ; was there a select error cz physel3 ; CHECK FOR HALF TRACK: must update DPB. login1: popix lda selerr ;return error code, error during configuration. ora a ret physel: lxi h,0 ; shld @trk ; TRACK 0 shld @sect ; SECTOR ,16,169,128,1,512,0,@ kaypro0: calcdpb 40,8,195,64,1,512,64 kaypro1: calcdpb 40,16,197,64,1,512,64 ;drop support for expanded-directory format - risky anyway. ;kaypro2: calcdpb 40,16,197,128,1,512,0 kaypro3: calcdpb 68,16,1351,1024,2,512,0 ; ; NOTE: skew tables are for physical sector numbers. ; kpqtx: db 1,6,11,16,4,9,14,2,7,12,17,5,10,15,3,8,13 end , seek track ; 305 then select physical unit 3. It is assumed that ; the host buffer has been flushed. ; in win0,@dircb,@dtacb,0ffffh d0h: db 0 ;(hash buffer bank number) dw 0,0,0,0,0,0,dpb1,csv1,alv1,@dircb,@dtacb,0ffffh d1h: db 0 dw 0,0,0,0,0,0,dpb2,csv2,alv2,@dircb,@dtacb,0ffffh d2h: db 0 csv0: ds (1024)/4 ;max dir entries: 1024 csv1: ds (1024)/4 csv2: ds (1024)/4 alv0: ds (1351)/4 ;max dsk blocks: 1351 alv1: ds (1351)/4 alv2: ds (1351)/4 ; Max DRM+1 is 1024 (getdp3kp.asm) init: ; TODO: detect Kaypro 10 (only one floppy) and do not init all 3. lda 0052h ; gift from loader: select ma000b ; z37 jrnz nf2 bit 2,m ; check for extended density jrz gf1 setx 4,-1 ; z37x jr setmode gf1: liyd @scrbf ; get cpm sectors per physical sector ldy a,+labhth+2 cpi 4 ; see if 512 byte sectors - if so set to z100 jrnz gf0 ; this is in here because the Z100 puts the setx 5,-1 ; device type code in the label on 5" jr setmode gf0: setx 3,-1 ; z37 jr setmode ;; currently no 8" support in this module nf2: ; cpi 100$00000b ; z47 ; jrnz nf3 ; bit 2,m ; check for extended dens1b,01010000B,01011000B ; drive 33 kaypro,DS,ST,5" db 10000000b,00000000b,11110010b,00000000b DB 00000000b,00000001b,01010000B,01011000B ; drive 34 kaypro,DS,ST,5" db 10000000b,00000000b,11110010b,00000000b DB 00000000b,00000001b,01010000B,01011000B ; drive 35 kaypro,DS,ST,5" db 10000000b,00000000b,11110010b,00000000b motor$off: db 0 ;must be directly after MODTBL selmsk: db 0 ; motoff: lda motor$off cpi true rz lda selmsk mov b,a ; all drives are the same, any mode will0 lhld @scrbf ;use BIOS scratch buffer to read Z37 label. shld @dma ;we must also make sure that bank 0 is selected. xra a sta @dbnk ;set disk bank=0 (the bank we're in now) sta @side ;side=0 STA MODFLG ; RESET CHANGED MODE FLAG mvi a,true ; flag a select operation sta selop MVI A,5 ; 5 RETRYS FOR A SELECT OPERATION STA RETRYS CALL READ ; TRY READING LABEL AT DENSITY ; CURRENTLY INDICATED IN TABLES JZ PHYSEL1 ; BR IF SUCCESSFUL bitx 7,+0 jnz physel6 ; if 8" error out vers equ '0e' ; March 18, 2017 17:04 drm "FDC3KP.ASM" ;********************************************************* ; Floppy Disk I/O module for CP/M 3.1 on KAYPRO ; Copyright (c) 1986 Douglas Miller ;********************************************************* MACLIB Z80 extrn @dph,@rdrv,@side,@trk,@sect,@dma,@dbnk,@dstat extrn @dtacb,@dircb,@scrbf,@rcnfg,@cmode extrn ?bnksl,?timot,?getdp extrn ?halloc false equ 0 true equ not false ; Ports and Constants fdc equ 010h ;floppy disk consk sta selmsk lda 0051h ; gift from loader: drive(s) type cpi 1 ; ST (or at least not QT) jrz initST cpi 2 ; QT jrz initQT ; else error, just leave as-is init0: ; use max hash size ever needed, even if QT drives not installed. ; Even if we have 5 drives (2 win, 3 flpy) we still won't ; consume all the hash space (~55K). It is not fatal if we try ; to allocate more hash than available, just sub-optimal for those ; drives that fail. lxi b,1024*4 ; safe value - the max ever used lxity ; jrz gf2 ; setx 6,-1 ; z47x ; jr setmode ;gf2: setx 5,-1 ; jr setmode nf3: ; cpi 110$00000b ; z67 ; jrz f1 ; keep old mode if device type not valid stx b,-1 stx c,-2 jmp physel7 ;f1: setx 7,-1 ; z67 setmode: mov a,m ; get flag byte bit 3,a ; track density bit jrz gs0 setx 5,+0 ; set drive and media to dt setx 5,+1 jr gs2 gs0: resx 5,+0 resx 5,+1 gs2: bit 1,a ; density bit jrz gs1 setx 4,+1 jr gs3 gs1: resx 4,+1 gs3: bit 0,a ; sides bit jrz gs4 se do? lda modtbl+2 bit 1,a ; QT drive? in sysctl jrnz motoff0 ani 10101111b ; motor off motoff0: ora b ; select off out sysctl mvi a,true sta motor$off ret dpb0: ds 17 ;disks may have labels. dpb1: ds 17 ; dpb2: ds 17 ; savNMI: ds 1 savSTK: ds 2 ds 8 rwSTK: ds 0 type$II$ext: lda @dbnk call ?bnksl lxi h,0066h mov a,m mvi m,(RET) sta savNMI lhld @dma mov a,e mov e,c mvi c,fdcdata di out fdccomd ret ;jump to appropriate routine rd4: hlt rd42: INI MVI A,5 ; RESET RETRYS TO 5 STA RETRYS STA MODFLG ; SET CHANGED MODE FLAG ; IX=mode bytes ldx a,+1 ; TRY OTHER DENSITY XRI 00010000b stx a,+1 CALL READ ; TRY TO READ LABEL jrz physel1 ldx a,+1 xri 00010000b ; return mode bytes to former state stx a,+1 jmp physel6 ; jmp to error PHYSEL1:XRA A ; ZERO ACCUM. MVI B,LABLEN ; GET LENGTH OF LABEL lhld @scrbf LXI d,LABEL dad d CHKLAB1:ADD M INX H DJNZ CHKLAB1 INR A JRZ PHYSEL2 ; BR IF CORRECT CHECKSUM LDA MODtroller sysctl equ 014h ;floppy disk control bits ********************************************************* ** FDC (WD1793-02 Floppy Disk Controller) ********************************************************* FDCSTAT equ FDC+0 FDCCOMD equ FDC+0 FDCTRK equ FDC+1 FDCSEC equ FDC+2 FDCDATA equ FDC+3 dev0 equ 33 ; first drive in system ndev equ 3 ; # of drives is system LABLEN EQU 19H ; LENGTH OF Z37 DISK LABEL LABEL EQU 04H ; POSITION OF LABEL IN SECTOR 0 LABHTH EQU 05H ; START OF "HEATH i d,d0h-2 call ?halloc lxi d,d1h-2 call ?halloc lxi d,d2h-2 call ?halloc ; IN fdcstat ; CLEAR WD-1793 from power-on (or whatever) push psw jmp setmot ; set timeout in case no more activity ; RET initST: lxi h,modtbl+2 mvi b,3 ist0: res 5,m res 1,m res 0,m inx h res 5,m lxi d,7 dad d djnz ist0 jr init0 initQT: lxi h,modtbl+2 mvi b,3 iqt0: setb 5,m setb 1,m setb 0,m inx h setb 5,m lxi d,7 dad d djnz iqt0 jr init0 login: pushix ;savtx 6,+1 jr gs6 gs4: resx 6,+1 gs6: lhld @cmode call ?getdp ; setup mode bytes jnz physel6 ; error if format doesnt exists liyd @dph ; set dpb addr in dph sty c,+0 ; store XLAT address in DPH sty b,+1 ldy l,+12 ; get DPB address in DPH ldy h,+13 xchg lhld @scrbf lxi b,labdpb dad b lxi b,15 ldir ; move dpb xchg ; hl points to psh byte (15) liyd @scrbf ldy a,+labhth+2 mov b,a ; save CP/M sectors per physical sector mvi c,0 pshlp srlr a ; rolate LSB into hers use sectors 1-n OUT fdcsec ; give to controller RETRY: PUSH d ; save registers CALL TYPE$II$COM ; execute disk transfer routine. STA @dstat ; save status of transfer XRA A ; CLEAR CARRY FOR DSBC lded @dma DSBC D ; HL NOW CONTAINS # OF BYTES TRANSFERRED LDA @dstat ; check for successful transfer ANI 11111111B ; WP is 0 for any read command. JRNZ IOERR ; RETRY IF ERROR LDA SELOP ; IS THIS A SELECT OPERATION ? ORA A jrnz POPRET ; THEN DON'T CHECK SECTOR SIv. fb1: call find$NE lxi d,IP$count fb2: in fdcstat ani 00000010b jrnz got$IP dcx d mov a,e ora d jrnz fb2 djnz fb1 stc fb3: ei ret IP$count equ 17250 ; 200mS +10%, timed to "fb2" loop got$IP: xra a ei ret find$NE: in fdcstat ani 00000010b mov c,a mvi h,4 ;wait even longer... (3.67 sec) fb00: lxi d,0 ;wait a long time for any edge fb01: in fdcstat ani 00000010b cmp c jrnz got$edge dcx d mov a,e ora d jrnz fb01 dcr h jrnz fb00 pop d ;discar phy4s0 phy4s22: res 0,b jr phy4s0 phy4s3: ; use drive settings if possible... ; NOTE: this case would not normally exist on a Kaypro. ; must be at least a DT drive, non-QT media, so force that setb 5,b ;make drive "DT" res 0,b ;make media non-QT bit 1,b ;test drive "QT" jrnz phy4s4 res 5,c ;make media "ST" in DT drive jr phy4s0 phy4s4: ; QT drive, so media must be DT... setb 5,c ;make media "DT" in QT drive jr phy4s0 setup$rw: MVI A,21 ; 21 RETRYS FOR A READ/WRITE OPERBYTE 2 inr a ; 1,2,3,4 cma ; 111111xx ana d ; 2,1,0,3 but avoid win reset bit bit 4,m ;single density ? jrnz se1 ori 00100000b ;select single density data rate. se1: dcx h ; point to mode byte 1 bit 1,m ; QT drive? jrz se2 bit 0,m ; QT media? jrnz se3 ; motor "off" - low speed - for QT se2: ori 00010000b ;motor on, also (QT drive = high speed) se3: mov e,a di in sysctl ; ; TODO: if motor bit changes for QT drive, must de-select briefly ani 10001111b ; DDEN, clear MOT[cy] jc psh1 inr c jr pshlp psh1 mov m,c ; set PSH byte inx h ; mode pointer to PSM dcr b mov m,b ; put in dpb JR PHYSEL7 PHYSEL6:MVI A,1 STA SELERR ; FLAG A SELECT ERROR PHYSEL7: call done ; setup motor turn-off lxi h,selop mvi m,false ; SELECT OPERATION IS OVER ret physel3: CALL SELECT JRC PHYSEL6 ; ERROR IF NOT READY CALL HOME ;RESTORE HEAD TO TRACK 0 JRC PHYSEL6 MVI B,01001000B ;STEP IN, NO UPDATE CALL TYPE$I CALL TYPE$I CALL TYPE$I CALL TYPE$I ZE LDA BLCODE ; CHECK IF CORRECT NUMBER OF BYTES TRANSFERRED CPI 3 JRNZ NOTED ; BLCODE=3 => 1024 BYTE SECTOR EXPECTED INR A ; INCREMENT BECAUSE (H) FOR 1024 IS 4 NOTED: CMP H ; COMPARE TO EXPECTED SIZE POPRET: POP d mvi a,0 ;signal "no error" to BDOS. jrz done ; RETURN IF CORRECT JR TRYAGN ; RETRY IF INCORRECT IOERR: POP B JM ERROR ; ERROR IF NO READY SIGNAL TRYAGN: LXI H,RETRYS ; decrement retry count DCR M JZ ERROR ; NO MORE RETRIES MOV A,M CPI 10 JNC RETRY ; Lrd address from "fb1" loop stc ei ret got$edge ora a rz mov c,a ;if not NE, go find another jr fb00 ACCESS$R: lhld @dph lxi d,12 dad d mvi a,15 ;PSH add m mov e,a inx h mvi a,0 adc m mov d,a ldax d sta blcode ;get physical sector size lhld cmode mov c,m ; mode byte 2 inx h mov a,m ; mode byte 3 cma ; get "NOT MDT... ana c ; ... AND DDT" ani 00100000b ; flag is in bit 5 bit 1,c ; drive QT? jrz accr0 ; no... bit 0,c ; must be 0? jrnz accrATION STA RETRYS lhld @cmode inx h inx h shld cmode ret read$fdc: call setup$rw READ: CALL ACCESS$R ; START DRIVE AND STEP TO PROPER TRACK JRC ERROR lxi d,10011111$10001000B ; status mask + read command JR TYPE$II error: xra a ; [NZ] to indicate error inr a done: push psw lda selop ora a jrnz retrn mvi a,false ;motor off false sta motor$off setmot: lxi d,motoff mvi c,15 ;15 seconds mvi b,dev0 ;I.D. call ?timot retrn: pop psw ret write$fdc: call setOR ana b ; strip select bit(s) ora e ; out sysctl ; ei MOV A,M ANI 00001100B ; setup steprate bits for seek-restore commands rrc rrc STA STEPRA ; RATE FOR SUBSEQUENT SEEK/RESTORE LXI H,LOGDSK ; save position (track) of current drive MOV E,M ; in 'trks' array addressed by contents of MOV M,C ; location 'logdsk'. MVI B,0 MOV D,B LXI H,TRKS DAD D IN fdctrk MOV M,A ; SAVE CURRENT TRACK # LXI H,TRKS ; identify position (track) of requested drive DAD B ; from 'trks';STEP IN FOUR TIMES call read$addr ; READ ADDRESS lda @dstat ANI 00011000B SHL 1 ;check for FDC error. JRNZ PHYSEL6 lhld cmode mov b,m inx h mov c,m in fdcsec ;track number, from read-addr CPI 4 JRZ phy4s2 ; drive matches media... CPI 2 JRZ phy4s3 ; media has half the tracks of drive CPI 1 JRNZ PHYSEL6 ; media has 1/4 tracks as drive... ; must be ST media in QT drive... setb 1,b ;make drive "QT" setb 5,b ;make drive "DT" also res 0,b ;make media non-QT res 5,c ;makeESS THAN TEN RETRYS LEFT => STEP HEAD LDA SELOP ORA A jnz RETRY ; DO NOT STEP HEAD IF SELECT OPERATION PUSH d ; SAVE REGISTERS CALL STEPIN ; STEP IN COMMAND CALL SEEK ; SEEK WILL REPOSITION HEAD POP d JMP RETRY ; TRY AGAIN rtbl: db 128 ;128 bytes dw rd1 db 0 ;256 bytes dw rd1 db 0 ;512 bytes dw rd2 db 0 ;1024 bytes dw rd4 type$II$com: ;command in E mov a,e ani 00100000b ; 1 if write rlc! rlc! rlc ; 0000000w ori 0a2h ;A2/A3 for INI/OUTI sta rd12+1 sta rd0 ; ori 01100000b ; set both just in case accr0: sta htflag ; half track flag CALL SELECT rc SEEK: LXI H,SEKERR ; initialize seek error counters MVI M,4 ; 4 ERRORS ON SEEK IS FATAL INX H MVI M,10 ; RESTORE once, then 9 errors are fatal call setside lda @trk mov c,a RETRS: MOV A,C ; get track number back ORA A ; FORCES "RESTORE" IF "seek to track 0" jz HOME ;RESTORE HEAD TO TRACK 0 lda htflag mov h,a ; get half-track flag in h IN fdctrk ;CURRENT HEAD POSITION, Sup$rw WRITE: LHLD CMODE ; CHECK FOR HALF TRACK R/O bit 5,m ;see if drive is DT. jrz ht0 inx h bit 5,m ;see if media is not DT. jrz ERROR ; R/O ERROR ht0: CALL ACCESS$R ; ACCESS DRIVE FOR WRITE JRC ERROR in fdcstat sta @dstat ; save DISK STATUS BYTE ani 01000000b ; WRITE PROTECT BIT jrnz ERROR ; WRITE PROTECT ERROR lxi d,11111111$10101000B ; status mask + write command TYPE$II: lhld cmode inx h mov a,m ani 1 ;sector offset lxi h,@sect ; GET SECTOR NUMBER add m ;ot array addressed by new 'logdsk'. MOV A,M OUT fdctrk ; set track number mov a,c sub e ;same drive as last time? sui 1 ! sbb a ;.true. if same drive cma di lxi h,motor$off ;if diff. drive, must check ready. ora m ;if same but motor off, must check ready. mvi m,true ;this prevents the motor from being turned off sta mtflg ; test drive for ready. cma ! ora a ;[NC] jrnz fb3 ;[NZ] if motor still on. ; mvi a,11010000b out fdccomd in fdcstat mvi b,10 ;must be ready within 10 re disk "ST" and reconfigure phy4s0: ; update mode bytes, check for changes... mov a,c xra m mov m,c dcx h mov c,a mov a,b xra m mov m,b ora c ; NZ if either byte changed... jz PHYSEL4 mvi a,0ffh sta @rcnfg ;set "re-configure" flag so BIOS will get new DPB/XLAT PHYSEL4: CALL HOME JRC PHYSEL6 JR PHYSEL7 phy4s2: ; drive tpi matches media, but force media modes bit 5,b jrz phy4s20 setb 5,c jr phy4s21 phy4s20: res 5,c phy4s21: bit 1,b jrz phy4s22 setb 0,b j22+1 sta rd32+1 sta rd42+1 call setside sspd savSTK ; lxi sp,rwSTK ; lda blcode mov c,a add a ; *2 add c ; *3 lxi h,rtbl mov c,a mvi b,0 dad b mov b,m inx h mov c,m inx h mov h,m mov l,c push h jmp type$II$ext SELECT: mvi c,0 mvi b,dev0 call ?timot ;clear any pending "motor off" lda selmsk mov d,a cma mov b,a LDA @rdrv ; get the RELATIVE drive number MOV C,A ; relative drive number in (C) (rel. to driv0) lhld cmode INX H ; POINT TO MODE UB C ;SEE HOW FAR WE WANT TO GO. RZ ;IF ZERO TRACKS TO STEP, WERE FINISHED MVI B,01111000B ;ASSUME STEP-OUT + UPDATE + HEADLOAD JRNC STOUT ;ASSUMPTION WAS CORRECT... MVI B,01011000B ;ELSE MUST BE STEP-IN NEG ;AND NUMBER OF TRACKS WOULD BE NEGATIVE STOUT: MOV L,A ;COUNTER FOR STEPING SEEK5: BIT 5,H ; CHECK FOR 48 TPI DISK IN 96 TPI DRIVE JRZ NOTHT RES 4,B ;SELECT NO-UPDATE CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR bit 6,h ; added busy. RAL STA @dstat ;SAVE TYPE II (III) STATUS FOR ERROR DETECTION. MVI A,11010000B ;TERMINATE COMMAND (RESET STATUS TO TYPE 1) OUT fdccomd IN fdcdata ; in fdcstat ; rlc ret setside: lda @side xri 00000001b ; active low output rlc ! rlc mov c,a di in sysctl ani 10111011b ; clear old side bit ora c ; add new side bit out sysctl ei ret STEPRA DB 0 ; STEP RATE CODE RETRYS DB 0 SEKERR DB 0,0 ; SEEK,RESTORE ERROR COUNTS CMODE DW 0 ; POINTER TO MODE BYTE LO0: mvi l,100 ;lptbl mov e,m inx h mov d,m inx h mov c,m ;thread inx h mov b,m sbcd thread sded lptbl lhld lptbl lxi d,lpsetup mvi b,16 su0: mov a,m stax d inx h inx d inx d inx d djnz su0 lhld thread su2: mov e,m inx h mov d,m inx h mov a,d ora e jz su1 push d mov a,m ;first device cpi 200 jnc su3 ;disk I/O only, no character I/O. mov b,a inx h mov c,m ;number of devices lxi d,12+1 ; dad d ;point to string address mov e,m inx h ; STEP IN WITHOUT UPDATE CNZ TYPE$I ; STEP A SECOND TIME (W/O UPDATE) FOR HALF-TRK bit 6,c ; QT CNZ TYPE$I ; STEP A THIRD TIME (W/O UPDATE) FOR QUARTER-TRK bit 6,c ; QT CNZ TYPE$I ; STEP A FOURTH TIME (W/O UPDATE) FOR QUARTER-TRK MVI B,01011000B ; STEP IN AND UPDATE TRACK REGISTER JR TYPE$I HOME: ;POSITION HEAD AT TRACK ZERO... mvi a,11010000b ;force TYPE$I status out fdccomd in fdcstat ANI 00000100B ;TEST TRACK ZERO SENSOR, JRNZ @TRK0 ;SKIP ROUTINE IF WE'RE ALREADY AT TRACbit for QT JRZ NOTQT CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR NOTQT: SETB 4,B ;SELECT UPDATE TO TRACK-REG notht: CALL TYPE$I ;STEP HEAD ANI 00000100B SHL 1 ;DID THIS STEP PUT US AT TRACK 0 ? JRNZ TRK0ERR DCR L JRNZ SEEK5 IN fdcsec ;SAVE CURRENT SECTOR NUMBER MOV L,A CALL READ$ADDR ; GET ACTUAL TRACK UNDER HEAD (IN SECTOR REG) in fdcseGDSK DB 2 ; CURRENT DRIVE SELECTED BY THIS MODULE BLCODE DB 0 SELERR: DB 0 SELOP: DB false MODFLG: DB 0 TRKS: DB 255,255,0 htflag: db 0 mtflg: db 0 END ,32, 86,128,3,512,0 MMS3: calcdpb 36,32,176,128,3,512,0 Z370: calcdpb 20, 8, 92, 64,3,256,0 Z371: calcdpb 32, 8,152,128,2,256,0 Z372: calcdpb 40, 8,186,128,2,1024,0 Z373: calcdpb 20, 8,188,128,3,256,0 Z374: calcdpb 32,16,156,256,2,256,0,@mov d,m lxi h,lpsetup xchg push h mvi l,16 su6: ldax d ;physical drive number of logical drive. inx d sub b cmp c ;in range? jnc su4 ; xthl xchg mov m,e ;put string address in setup table inx h mov m,d inx h xchg xthl su5: dcr l jnz su6 pop h ;discard jmp su3 su4: inx d inx d jmp su5 su3: pop h jmp su2 su1: lxi h,lpsetup ;now print out list of drives mvi b,16 su9: mov a,m cpi 255 ;drive not available jz nxtone call crlf mvi a,16 sub b ;K 0. IN fdctrk ;DOES THE SYSTEM THINK WE'RE AT TRACK 0 ?? ORA A JRNZ HOME1 ;IF IT DOESN'T, ITS PROBEBLY ALRIGHT TO GIVE "RESTORE" MVI L,6 ;(6 TRKS) ;ELSE WE COULD BE IN "NEGATIVE TRACKS" SO... MVI B,01001000B ;WE MUST STEP-IN A FEW TRACKS, LOOKING FOR THE HOME0: CALL TYPE$I ;TRACK ZERO SIGNAL. ANI 00000100B SHL 1 ;"SHL 1" BECAUSE TYPE$I DOES AN "RLC" JRNZ @TRK0 DCR L JRNZ HOME0 HOME1: MVI B,00001000B ;RESTORE COMMAND, WITH HEADLOAD CALL TYPE$I XRI 00000100B SHL 1 ;TEST TRACK-0 SIGNvers equ '3 ' ; March 12, 2017 16:32 drm "DRIVES.ASM" maclib Z80 ; Program to display logical/physical drive relationships for CP/M 3 ; also to work on MP/M-II on 77500 cpm equ 0 conout equ 2 msgout equ 9 retver equ 12 cr equ 13 lf equ 10 org 0100h base: jmp start bdos equ base-100h+5 signon: db cr,lf,'DRIVES v3.10' dw vers db cr,lf,'$' str0: db ': = ($' verr: db cr,lf,'Must have CP/M 3$' vererr: lxi d,verr mvi c,msgout call bdos jmp xit thread: dw 0 lptbc ;GET TRACK NUMBER FROM MEDIA MOV H,A MOV A,L OUT fdcsec ;RESTORE SECTOR NUMBER LDA @dstat ;GET TRUE ERROR STATUS OF READ-ADDRESS RLC RC ;DRIVE NOT READY ANI 00011000B SHL 1 ; CRC ERROR + REC-NOT-FOUND MOV A,H ; ACTUAL TRACK FROM READ-ADDRESS LXI H,SEKERR ;POINT TO ERROR COUNTERS JRNZ RESTR0 CMP C ; (C) MUST STILL BE VALID DEST. TRACK RZ ;NO ERRORS RTS00: DCR M ; SHOULD WE KEEP TRYING ? STC RZ ;NO, WE'VE TRYED TOO MUCH OUT fdctrk ; re-define head position accordingmake 0,1,2,3,4... for A,B,C,... adi 'A' call chrout lxi d,str0 call strout mov a,m ;physical drive number call decout mvi a,')' call chrout mvi a,3+1+1 sub c ; mov c,a dcr c jz su7 su8: mvi a,' ' call chrout dcr c jnz su8 su7: inx h mov e,m inx h mov d,m inx h mov a,e ora d jrz su10 call strout su10: djnz su9 call crlf xit: lspd savstk ret nxtone: inx h inx h inx h jmp su10 ds 32 stack: ds 0 savstk: ds 2 crlf: mvi a,cr call chroAL RAR RAR RAR RAR ;[CY] = 1 IF NOT AT TRACK 0 @TRK0: MVI A,0 OUT fdctrk ;MAKE SURE EVERYONE KNOWS WERE AT TRACK 0 RET ; READ$ADDR: mvi a,11000100B ; READ-ADDRESS COMMAND WITH SETTLE DELAY jr PUT$I TYPE$I: LDA STEPRA ; STEP-RATE BITS ORA B ; MERGE COMMAND PUT$I: OUT fdccomd ; SEND command TO CONTROLLER WB: IN fdcstat ; WAIT FOR BUSY SIGNAL RAR ; TO COME UP JRNC WB WNB: IN fdcstat ; poll controller for function-complete RAR ; Busy? JRC WNB ; wait until not l: dw 0 lpsetup: db 0,0,0 ;physical drive number, string address for drive A: db 0,0,0 ; drive B: db 0,0,0 ; C: db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 db 0,0,0 ; P: start: sspd savstk lxi sp,stack lxi d,signon mvi c,msgout call bdos mvi c,retver call bdos mov a,l sui 30h cpi 16 jnc vererr mov a,h lhld cpm+1 cpi 1 ;MP/M? jrnz st0 inx h mov e,m inx h mov d,m xchg stly JR RETRS ; RETRY SEEK TRK0ERR: XRA A LXI H,SEKERR JR RTS00 RESTR0: INX H ; RESTORE ERROR COUNT DCR M STC RZ ; If count 0, return with Carry set. MOV A,M CPI 9 JRNC RESTR1 ; RESTORE ONLY FIRST TIME CALL STEPIN ; OTHERWISE STEP HEAD IN 1 TRACK JR RETRS RESTR1: ; RESTORE HEAD TO TRACK 0 MVI A,00000011B STA STEPRA ; RETRY WITH MAXIMUM STEP RATE CALL HOME jmp RETRS ; RETRY SEEK STEPIN: lda htflag mov c,a ora a ; CHECK HALF TRACK modes MVI B,01001000But mvi a,lf chrout: push b push d push h mov e,a mvi c,conout call bdos pop h pop d pop b ret strout: push b push h mvi c,msgout call bdos pop h pop b ret decout: push b push h lxi b,0 ;for leading zero deletion, output count mvi e,100 call divout mvi e,10 call divout call dv1 ;always display one's digit. pop h mov a,c pop b mov c,a ;number of characters outputed in C ret divout: mvi d,0 dv0: inr d sub e jnc dv0 add e dcr d mov l,a b,?serdp-3 ; Check if GETDP is linked in dad b call hlihl lded sysadr xra a ; clear A and [cy] mov e,a dsbc d jz nogetdp CALL SPCHK ; scan command line for first JNZ HADARG ; non space character. LXI D,HELP ; help text MVI C,TYPE CALL BDOS JMP DONE ; this is all, let's leave HADARG: CALL INCMD ; evaluate the command line JNZ ENDERR ; bad command line if non-zero LDA NEWARG ; get the data flag ORA A ; zero if data was entered JNZ OUTMOD ; if none, output the modeENS CPI 'S' JNZ BADCMD MOV A,B ; get the SIDE argument STA SIDE JMP MORE DENS: MOV A,B ; get the DENSITY argument STA DENSITY JMP MORE STEP: MOV A,M ; get next argument CPI '0' ; must be numeric JC BADCMD CPI '9'+1 JNC SPROC CALL CHAR SUI '0' ; make it numeric MOV B,A ; and save it MOV A,M ; it must be a number, a comma, or null ORA A JZ SOK CPI ',' JZ SOK CPI ' ' JZ SOK CPI '0' JC BADCMD CPI '9'+1 JNC BADCMD CALL CHAR SUI '0' ; numeric, mach equ 90 lptbl equ 100 ; OFFSET TO lptbl TABLE vector from WBOOT thread equ 102 ; module thread starting vector ?serdp equ 104 stroff equ 12 ; string address offset from init rout of mod ; ; SYSTEM (BDOS) CALLS ; CONIN EQU 1 ; CONSOLE INPUT conout equ 2 ; console out CONIO EQU 6 ; DIRECT CONSOLE I/O TYPE EQU 9 ; CONSOLE STRING PRINT RDCON EQU 10 ; READ CONSOLE BUFFER GETCON EQU 11 ; GET CONSOLE STATUS getver equ 12 ; get CP/M version number DSKRES EQU 13 ; DISK RESET LOGIN EQU MOV A,B ; get drive STA NDRIVE ; save for later NXARG: CALL CHAR RNC CPI ' ' JZ NXARG DCX H NXOPT: push h ; get address of format strg tbl in de call serdp xchg pop h MVI C,0 ; c = format bit number counter CONFIG: mvi b,8 ; length of entry in format string table PUSH H mov a,c CPI 15 ; if c = 15 then end of table JZ NOTCNF ;NMEMONIC NOT FOUND ldax d FIG0: CMP M JNZ FIG1 INX H INX D dcr b jz fig5 LDAX D CPI ' ' JNZ FIG0 fig5: MOV A,M ORA A JZ FIG2 ;remainder in L, temp. bit 0,b ;leading zero? jnz dv1 mov a,d ora a jz dv2 dv1: setb 0,b inr c adi '0' call chrout dv2: mov a,l ret end leading zero? jnz dv1 mov a,d ora a jz dv2 dv1: setb 0,b inr c adi '0' call ch BITS ORA B ; MERGE COMMAND PUT$I: OUT fdccomd ; SEND command TO CONTROLLER WB: IN fdcstat ; WAIT FOR BUSY SIGNAL RAR ; TO COME UP JRNC WB WNB: IN fdcstat ; poll controller for function-complete RAR ; Busy? JRC WNB ; wait until not data CALL GETMOD ; get the mode byte CPI 0FFH ; check for error JZ NODRV CPI 0FEH ; check for wrong release JZ WRONG MOV A,M ANI 80H ; CHECK MODE BYTE DISABLE BIT JNZ FIXED CALL UPMODE ; update the mode byte CALL RESET ; reset the drive OUTMOD: CALL GETMOD CPI 0FFH ; check for drive not available JZ NODRV CPI 0FEH ; check for wrong release JZ WRONG MOV A,M ANI 80H ; CHECK NODE BYTE DISABLE BIT JNZ FIXED CALL MPRINT ; and print the new mode values JMP DONE ;ke it binary MOV C,A ; and save it MOV A,B ; get first number ADD A ADD A ADD B ADD A ; TIMES 10 ADD C ; plus second number MOV B,A ; expected in B SOK: MOV A,B ; get step rate STA STEPRT ; and save it MORE: CALL CHAR ; get next character JNC FINISH CPI ',' ; continue if a comma JZ NXOPT0 CPI ' ' ; or a space JZ MORE DCX H JMP NXOPT NXOPT0: CALL CHAR JNC FINISH CPI ' ' JZ NXOPT0 DCX H JMP NXOPT FINISH: XRA A STA NEWARG RET BADCMD: MVI A,1 OR24 ; RETURN LOGIN VECTOR CURDSK EQU 25 ; GET CURRENT DISK SETDMA EQU 26 ; SET DMA ADDRESS RESDRV EQU 37 ; RESET DRIVE FUNCTION org 0100h base: JMP START BDOS EQU base-100h+5 ; STANDARD CP/M ENTRY FCB EQU base-100h+5CH ; INPUT FILE CONTROL BLOCK DMA EQU base-100h+80H ; INPUT DMA ADDRESS TPA EQU base ; CP/M PROGRAM AREA sysadr: dw 0 SIGNON: DB cr,LF,'MODE v3.10' dw vers DB CR,LF,LF,'$' errver: db bell,'Requires CP/M 3.1 or MP/M',cr,lf,'$' nodper: db bell,'GETDP.REL not linked CPI ',' JZ FIG2 CPI ' ' JNZ FIG1 FIG2: POP D ;DISCARD OLD BUFFER POINTER LDA CNFIG ORA A ;IS THIS THE SECOND ENTRY OF THIS TYPE? JNZ BADCMD ;ERROR IF IT IS. MOV A,C ADI '0' STA CNFIG JMP MORE FIG1: INX D ;go to end of format string table djnz FIG1 FIG3: POP H ;restore parameter address INR C ; JMP CONFIG NOTCNF: POP H ;WE KNOW THERE MUST BE AT LEAST ONE CHARACTER CALL CHAR ; get a character for the loop CPI 'D' ; check for 'D' command JZ DPROC CPI 'S' JZ STEP ; and we're done SPCHK: LXI H,DMA ; number of characters input MOV A,M ORA A RZ ; no characters available INX H SHLD CMDPTR MOV C,A MVI B,0 DAD B MVI M,0 ;terminate command tail with a null LHLD CMDPTR MORSP: CALL CHAR CPI ' ' ; and check for spaces JZ MORSP DCX H SHLD CMDPTR ORA A ;[ZR] if a null (end of string) RET ; zero if no arguments CHAR: MOV A,M ;returns [CY] if not end of string ORA A RZ ;END OF BUFFER INX H CPI 'a' RC CPI 'z'+1 CMC RC SA A ; set the zero flag RET ; update the present mode value ; UPMODE: push h popix LDA CNFIG ; see if configuration was specified ORA A JZ BIT1 sui '0' ;make it binary 0,1,2... lxi h,00000000$00000001b inr a gc1: dcr a jrz gc0 dad h jr gc1 GC0: stx H,+0 stx L,+1 BIT1: LDA SIDE ; see if side was specified ORA A JZ BIT3 resx 6,+3 ; clear the side bit CMA ANI 1 ; mask the lsb RRC RRC ; to bit 6 orax +3 ; into the mode byte stx a,+3 ; and update into system',cr,lf,'$' vererr: lspd oldsp lxi d,errver errout: mvi c,type jmp bdos nogetdp: lspd oldsp lxi d,nodper jr errout START: SSPD OLDSP ; save old stack pointer LXI SP,STACK ; for a fast reboot LXI D,SIGNON ; signon message MVI C,TYPE ; string output function CALL BDOS mvi c,getver call bdos mov a,l cpi 30h jc vererr ;can't run 2.F or earlier. mov a,h lhld cpm+1 cpi 1 ;MP/M - jnz st0 inx h mov e,m inx h mov d,m xchg st0: shld sysadr lxiSTEPRATE OR "SINGLE XXX" CPI 'Q' JNZ BADCMD HPROC: MOV B,A CALL CHAR JNC BADCMD CPI 'T' JNZ BADCMD trk: mov a,b ani 0fh mov b,a MOV A,M ; peek next argument cpi 'S' jrz trk0 cpi 'D' jrz trk1 MOV A,B jr trk1 ; already validated... trk0: call char jnz badcmd ani 0fh rlc rlc rlc rlc ora b trk1: sta track jmp more SPROC: MVI A,'S' DPROC: MOV B,A ; save SINGLE or DOUBLE CALL CHAR ; get the character JNC BADCMD CPI 'T' JZ TRK CPI 'D' JZ DVERS EQU '6 ' ; March 17, 2017 18:58 drm "MODE.ASM" ; for both CP/M plus and MP/M-II (77500) ; ST = drive and media Single Track ; DT = drive and media Double Track ; QT = drive and media Quad Track ; DTS = drive Double Track, media Single Track ; QTS = drive Quad Track, media Single Track ; QTD = drive Quad Track, media Double Track MACLIB Z80 $-MACRO CPM EQU 0 ; JUMP TO BIOS CR EQU 0DH ; CARRIAGE RETURN LF EQU 0AH ; LINE FEED ESC EQU 1BH ; EXCAPE bell equ 7 ; bell searUI 'a'-'A' STC RET ; PARSES input command line ; INCMD: MVI A,1 STA NEWARG ; initialize argument flag to none LHLD CMDPTR ; pointer to first non-blank character CALL CHAR ; get it JNC BADCMD CPI 'A' ; check range of A-P JC BADCMD CPI 'P'+1 JNC BADCMD STA NODRMS ; setup error messages etc. STA DSKLT STA DIFD STA WRGD SUI 'A' ; make a drive number (0-15) MOV B,A ; and save in B CALL CHAR ; get a character JNC BADCMD CPI ':' ; which must be a ':' JNZ BADCMDthe byte BIT3: LDA DENSITY ; see if density was specified ORA A JZ BIT4 resx 4,+3 ; clear density bit CMA ANI 1 RRC RRC rrc rrc ; to bit 4 orax +3 ; mask the bit stx a,+3 ; and save it in memory BIT4: LDA TRACK ORA A JZ BIT5 resx 5,+3 ; reset everything, then set as needed resx 1,+2 resx 0,+2 RESX 5,+2 ani 0fh cpi 'D' and 0fh ; 04 jrz sdt cpi 'S' and 0fh ; 03 jrz BIT5 ; cpi 'Q' and 0fh ; 01 ; jrz sqt ; QT - quad track setx 0,+2 ; media QT assumed nx h inx h INX H ; point to byte 2 BIT 4,M JZ SD ; single density if zero LXI D,DDMSG ; double density drive message JMP DD SD: LXI D,SDMSG ; single density drive message DD: MVI C,TYPE CALL BDOS POP H PUSH H inx h inx h inx h BIT 6,M ; check the side bit JZ SS ; single sided if zero LXI D,DSMSG ; double sided drive message JMP DDS SS: LXI D,SSMSG ; single sided drive message DDS: MVI C,TYPE CALL BDOS POP H PUSH H ; get mode address again inx h inx h mber ; HL=modtbl LHLD MODULE ; START OF MODULE LXI D,16 DAD D ; POINTER TO MODE TABLE CALL HLIHL ; MODE TABLE LDA RELDSK add a add a add a ; *8 mov e,a mvi d,0 dad d GOTADR: SHLD MODPTR ; save the mode byte pointer XCHG LXI H,4 ; +4 to mask DAD D SHLD MSKPTR ; save the mode byte mask pointer LXI H,MINFO ; internal storage buffer XCHG ; from HL to DE for LDIR LXI B,4 ; 4 bytes LDIR ; to store the mode byte internally LXI H,MINFO ; restore pointer L's well, let's actually update STAX D ; the mode byte INX H INX D DJNZ UPONE RET ; and return serdp LXI D,MINFO ; MODE BYTE POINTER TO DE LHLD sysadr ; call serdp LXI B,?SERDP-3 DAD B ; POINTER TO SERDP CALL ADDRESS CALL HLIHL ; GET CALL ADDRESS push h CALL ICALL ; CALL "GETDP" TO FIND A DPB FOR THIS MODE pop d ; add start of serdp to hl to get start of dad d ; format string table ret ; output the mode data to the CRT ; A pointer to the mode data is passed in: mov e,m ; got format string - now print 8 characters push h push b ; hl = string start mvi c,conout call bdos pop b pop h inx h djnz fmt3 call crlf ret ; this function puts the mode byte at MINFO and ; returns a pointer to it in the HL. It also places ; pointers to the actual mode byte and mask in ; MODPTR and MSKPTR and the drive number in DRVNUM ; GETMOD: LDA NDRIVE ; get logical drive number LHLD sysadr ; address of BIOS LXI D,lptbl-3 ; offset to POINTER TO mixer tablsetx 1,+2 ; drive QT SDT: setx 5,+3 ; media DT (or QT) assumed setx 5,+2 ; drive DT ; DT/QT might have lesser media... lda track rlc rlc rlc rlc ani 00fh jrz BIT5 ; media same, done resx 0,+2 ; at least we know can't be QT media cpi 'D' and 0fh ; 04 jrz BIT5 resx 5,+3 ; make ST media BIT5: LDA STEPRT ; get the requested step rate ORA A ; see if user specified one JZ BIT6 bitx 7,+2 ; size, 5.25 or 8 LXI H,STEPTB LXI D,4 ; table is 4 bytes long JZ FIVE DAD D ; bit 0,m ; if QT media, assume drive same jrnz t192 bit 1,m ; not QT media, check drive jrnz t192k INX H bit 5,m ; bit set if 96 tpi media JNZ T96 ; media is ST, drive NOT QT dcx h bit 5,m ;check for drive "DT" inx h jz t48 LXI D,HALFTK ; half track message JMP HTRK T48: LXI D,T48MSG ; 48 tpi message JMP HTRK T96: LXI D,T96MSG ; 96 tpi message JMP HTRK t192k: inx h bit 5,m ; bit set if 96 tpi media (QT drive) JNZ T192h lxi d,HAF2TK ; 48tpi media in QT drive JMP HTRK DA DRVNUM RET ; ; This subroutine searches for the driver text string specified ; by the accumulator. Strings are numbered 0-N. ; on entry: ; DE = pointer to driver ; A = desired string ; On exit: ; DE = pointer to desired string or first character ; past the last string (null in later releases) ; A = error code 0 = found, 0FFH = not found ; GETSTR: PUSH PSW ; save requested field LXI d,12 ; point to string vector DAD D ; to start of strings CALL HLIHL SHLD STRADR ; initi the HL ; MPRINT: LDA DRVNUM ; get physical drive number LXI B,0 ; tens counter in C and ones in B MORTEN: INR C SUI 10 JZ GOTNUM JP MORTEN DCR C ADI 10 MOV B,A GOTNUM: LXI H,3030H ; numeric offset to ASCII DAD B MOV A,L ; tens digit CPI '0' ; check for zero JNZ NOZE MVI A,' ' ; if so, replace with a space NOZE: MOV L,A SHLD DSKNM LXI D,TTLE1 LDA NEWARG ; was configuration changed ORA A ; zero if not changed JZ TYPNC LXI D,TTLE0 TYPNC: MVI C,TYPE CALL Be DAD D CALL HLIHL ; MIXER TABLE MOV E,A ; use logical drive number as offset MVI D,0 ; into logical/physical table DAD D MOV A,M ; get physical drive number STA DRVNUM ; and save it away CPI 0FFH RZ ; return if no drive installed DROK: LXI B,search-3 ; address of search routine LHLD sysadr DAD B MOV C,A ; SEARCH REQUIRES DRIVE NUMBER IN REG. C call icall ;call module-search with A=physical drive number jc syserr shld module STA RELDSK ; ; CHECK IF DRIVER IS RECEadd offset FIVE: MVI B,0 ; initial step rate NXRT: CMP M ; compare request with table JC GSRT ; memory is greater, this is it INX H INR B DCR E JNZ NXRT MVI B,3 ; in case of overflow GSRT: MOV A,B ; step rate mask resx 2,+2 resx 3,+2 ; clear bits rlc rlc orax +2 ; and update mode value stx a,+2 BIT6: call serdp ORA A JNZ NOCHG ; error if non-zero (NO DPB FOUND) ; ; mode bytes updated by "?serdp" ; LXI H,MINFO ; NEW MODE BYTE POINTER PUSH H MVI A,4 ; numbt192h: lxi d,HAF3TK ; 96tpi media in QT drive JMP HTRK T192: LXI D,T192MSG ; 192 tpi message HTRK: MVI C,TYPE CALL BDOS POP H ; get pointer again PUSH H INX H ; point to second byte inx h MOV A,M ; and get it ANI 00001100b ; bits for step rate bit 7,m jrz sr00 setb 4,a sr00: LXI H,STRTBL ; step rate table rrc ; MOV E,A MVI D,0 ; 16 bit value for offset DAD D MOV E,M ; first byte of step rate INX H MOV D,M ; and the second XCHG SHLD STRATE ; save text in mal text pointer XRA A STA GETERR ; clear error flag STA FLDNUM ; set field number 0 NXTFLD: LDA GETERR ; check error flag ORA A JNZ GETXIT ; error if non zero SHLD STRADR ; start of search string MVI B,100 ; search 100 characters GETCHR: MOV A,M INX H ; point past separator CPI '$' ; field terminator JZ CHKEND ; DOLLAR SIGN OR NULL ORA A JZ CHKEND CPI ' ' JC SETERR DJNZ GETCHR SETERR: MVI A,0FFH STA GETERR ; set error flag JMP GETXIT CHKEND: LDA FLDNUM MOV DOS LXI D,DRSTR ; drive letter and number message MVI C,TYPE CALL BDOS LHLD MODPTR ; pointer to system mode byte PUSH H ; save the mode pointer BIT 7,M ; check validity JNZ DONE ; non-zero if hard disk inx h inx h BIT 7,M ; size, 0=5" and 1=8" LXI D,INCH5 JZ PRINCH LXI D,INCH8 PRINCH: MVI C,TYPE CALL BDOS LXI D,CTRMSG MVI C,TYPE CALL BDOS CALL GETTXT ; get text string pointer in DE MVI C,TYPE CALL BDOS call crlf POP H PUSH H ; get mode address again iNT RELEASE (HAS MODE BYTES) ; DO THIS BY CHECKING FOR MULTIPLE STRINGS ; MVI A,1 ; more than one string in this release PUSH H ; SAVE MODULE ADDRESS CALL GETSTR POP H ; RESTORE MODULE ADDRESS ORA A ; and see if there are 2 strings mvi a,0feh rnz MVI A,30 ; a ridiculous string number CALL GETSTR ; DE points to null (we hope) XCHG ; make it HL DCX H ; POINT TO TERMINATOR MOV A,M CPI '$' ; IS IT A DOLLAR SIGN ? mvi a,0feh rnz ; additional check ; A=relative drive nuer of bytes to check LBCD MODPTR ; OLD mode byte pointer LDED MSKPTR ; mode byte mask pointer ANOTHR: PUSH PSW ; save the counter LDAX B ; get old mode byte XRA M ; set bit for values changed XCHG ANA M ; check for changed bytes XCHG JNZ NOCHG ; error if non zero INX D INX B INX H ; point to the next byte POP PSW ; get counter DCR A ; and decrement it JNZ ANOTHR POP H ; restore pointer MVI B,4 LDED MODPTR ; actual mode byte pointer UPONE: MOV A,M ; if allessage LXI D,STRMSG ; step rate message MVI C,TYPE CALL BDOS LXI D,STRATE LDA STRATE CPI ' ' ; skip a character if a space JNZ NSPC INX D NSPC: MVI C,TYPE CALL BDOS lxi d,fmtstr mvi c,type call bdos POP H ; get pointer to format origin bytes mov d,m ; load bytes in de inx h mov e,m push d call serdp ; get start of format string table in hl pop d lxi b,8 xra a fmt1: srlr d rarr e ;shift and wait for a carry... jrc fmt2 dad b jr fmt1 fmt2: mvi b,8 fmt3B,A POP PSW ; get requested field PUSH PSW CMP B ; is this one correct JZ GETXIT ; found if zero INR B ; increment field number MOV A,B STA FLDNUM DCX H MOV A,M ; GET FIELD TERMINATOR INX H SHLD STRADR ; SET NEW STRING ADDRESS ORA A ; IS TERMINATOR A NULL ? JNZ SETERR ; IF NOT IT'S A '$' AND WE'VE HIT END OF STRING JMP NXTFLD ; BEFORE FINDING FIELD GETXIT: LDED STRADR ; string address POP PSW ; clean up stack LDA GETERR ; error flag RET ; THIS SUBROUTINE REn 96 tpi drive (R/O)',CR,LF,'$' HAF2TK: DB ' Tracks per Inch - 48 tpi media in 192 tpi drive (R/O)',CR,LF,'$' HAF3TK: DB ' Tracks per Inch - 96 tpi media in 192 tpi drive (R/O)',CR,LF,'$' crlfmsg DB CR,LF,'$' fmtstr: DB ' Format Type - $' STRMSG: DB ' Step Rate - $' STRATE: DB '00 milliseconds',CR,LF,'$' DRSTR: DB ' Drive - ' DSKLT: DB 'A: (' DSKNM: DB ' ) $' TTLE0: DB 'PRESENT Configuration is:',CR,LF,'$' TTLE1: DB 'NEW Configuration is:',CR,LF,'$' BADMSG: DB 'Invaliret ; data storage ; HELP: DB 'The MODE utility is called in one of the following ways:' DB CR,LF,LF,' MODE',CR,LF DB 'Outputs HELP information',CR,LF,LF DB ' MODE d:',CR,LF DB 'Displays the present drive status to the user',CR,LF,LF HALFHL: DB ' MODE d:arg1,arg2,arg3',CR,LF DB 'Updates the present status and displays it. Valid' DB ' arguments are:',CR,LF,LF DB ' DS or SS = double or single sided',CR,LF DB ' QT, DT, ST = quad (192 tpi), double (96 tpiSETS THE DRIVE that got THE NEW MODE BYTE ; RESET: LDA NDRIVE ; get drive number INR A ; start with 1-16 LXI D,1 ; 1 for drive A: LRST: DCR A ; decrement drive number JZ REST ; if zero, then DE is setup SLAR E ; shift left with zero fill RALR D ; shift left with carry JMP LRST ; keep shifting REST: MVI C,RESDRV ; BDOS reset drive function CALL BDOS RET ICALL: PCHL ; ; THIS FUNCTION RETURNS A TEXT STRING TO BE OUTPUT ; GETTXT: lhld module ; get module address lxi d,d command line or command line arguments.',CR,LF,'$' CHGMSG: DB 'The requested format is invalid for the specified drive.' DB CR,LF,'The complete configuration must be supplied',CR,LF,'$' NODRMS: DB 'A: does not exist.',CR,LF,'$' WRGMSG: DB 'The driver module for ' WRGD: DB 'A: is incompatible with MODE.',CR,LF,'$' DB ' inoperative.',CR,LF,'$' SERMSG: DB 'Drive is specified but not linked - ERROR IN SYSTEM-' DB CR,LF,'$' STRTBL: DB ' 6122030 3 61015' ; possible step rates, 2 bytes each STEPTB),',CR,LF db ' single (48 tpi), or',CR,LF DB ' QTD, QTS, DTS = half track modes',CR,LF DB ' e.g. DTS is 48 tpi media in a 96 tpi drive.',CR,LF DB ' DD or SD = double or single density',CR,LF DB ' S6, S30, etc. = step rate in milliseconds',CR,LF DB ' MMS, Z37, Z37X etc. (media formats); the X implies' DB ' extended format.',CR,LF,LF,'$' DIFFER: DB 'Drive ' DIFD: DB 'A: has a fixed configuration which cannot ' DB 'be determined by stroff ; address text string offset dad d mov e,m ; move to de inx h mov d,m ret ; ; LOAD HL INDIRECT THROUGH HL ; HLIHL: MOV C,M INX H MOV H,M MOV L,C RET ; ; specified drive does not exist ; NODRV: LXI D,NODRMS ; drive not sysgened message JMP ERXIT ; ; FDC driver is the wrong release level ; WRONG: LXI D,WRGMSG JMP ERXIT ; ; drive is in logical/physical table but has not been ; linked in. system error. ; SYSERR: LXI D,SERMSG ; drive not LINKed message JMP ERX: DB 7,13,21,31,4,7,11,16 MODULE: DW 0 RELDSK: DB 0 MINFO: DB 0,0,0,0 MODPTR: DW 0 MSKPTR: DW 0 CMDPTR: DW 0 DRVNUM: DB 0 STRADR: DW 0 GETERR: DB 0 FLDNUM: DB 0 NEWARG: DB 0 NDRIVE: DB 0 ; 0 to 15 CNFIG: DB 0 ; MMS=0, MMSD=1,Z17=2 (ALL + '0') TRACK: DB 0 ; D or S or Q nibble, with optional D or S nibble SIDE: DB 0 ; D or S DENSITY: DB 0 ; D or S STEPRT: DB 0 ; binary number OLDSP: DW 0 DS 32 STACK: DS 0 END MODE.',CR,LF,'$' INCH5: DB '5.25 inch floppy',CR,LF,'$' INCH8: DB '8 inch floppy',CR,LF,'$' CTRMSG: DB ' Controller - $' SSMSG: DB ' Sides - 1',CR,LF,'$' DSMSG: DB ' Sides - 2',CR,LF,'$' SDMSG: DB 'Recording Density - Single',CR,LF,'$' DDMSG: DB 'Recording Density - Double',CR,LF,'$' T48MSG: DB ' Tracks per Inch - 48',CR,LF,'$' T96MSG: DB ' Tracks per Inch - 96',CR,LF,'$' T192MSG: DB ' Tracks per Inch - 192',CR,LF,'$' HALFTK: DB ' Tracks per Inch - 48 tpi media iLINK BNKBIOS3=MBIOS3KP,WIN3KP,FDC3KP,CRT,KEYBD,SERIAL,CENTR,END,LPTBL,GETDP3KP,SCB[B,OS,$$SZ] racks per Inch - 96 tpi media in 192 tpi drive (R/O)',CR,LF,'$' crlfmsg DB CR,LF,'$' fmtstr: DB ' Format Type - $' STRMSG: DB ' Step Rate - $' STRATE: DB '00 milliseconds',CR,LF,'$' DRSTR: DB ' Drive - ' DSKLT: DB 'A: (' DSKNM: DB ' ) $' TTLE0: DB 'PRESENT Configuration is:',CR,LF,'$' TTLE1: DB 'NEW Configuration is:',CR,LF,'$' BADMSG: DB 'InvaliIT ; ; driver is not FDC or Z37 ; FIXED: LXI D,DIFFER ; not FDC or Z37 driver JMP ERXIT ; ; this is the error for changing an invalid item ; NOCHG: LXI D,CHGMSG ; cannot change a parameter message MVI C,TYPE CALL BDOS LXI D,HALFHL JMP ERXIT ; ; Bad command line error ; ENDERR: LXI D,BADMSG ; bad command line message ERXIT: MVI C,TYPE ; error exit CALL BDOS DONE: LSPD OLDSP ; normal exit RET ; restore original stack pointer crlf lxi d,crlfmsg mvi c,type call bdos PRTMSG = Y PAGWID = 4F PAGLEN = 17 BACKSPC = N RUBOUT = Y BOOTDRV = A MEMTOP = FF BNKSWT = Y COMBAS = E0 LERROR = Y NUMSEGS = 03 MEMSEG00 = 00,80,00 MEMSEG01 = 00,C0,02 MEMSEG02 = 00,C0,03 MEMSEG03 = 00,C0,04 MEMSEG04 = 00,C0,05 MEMSEG05 = 00,C0,06 MEMSEG06 = 00,C0,07 MEMSEG07 = 00,C0,08 MEMSEG08 = 00,C0,09 MEMSEG09 = 00,C0,0A MEMSEG0A = 00,C0,0B MEMSEG0B = 00,C0,0C MEMSEG0C = 00,C0,0D MEMSEG0D = 00,C0,0E MEMSEG0E = 00,C0,0F MEMSEG0F = 00,C0,10 HASHDRVA = Y HAS= Y OVLYDIRN = Y OVLYDIRO = Y OVLYDIRP = Y OVLYDTAA = Y OVLYDTAB = Y OVLYDTAC = Y OVLYDTAD = Y OVLYDTAE = Y OVLYDTAF = Y OVLYDTAG = Y OVLYDTAH = Y OVLYDTAI = Y OVLYDTAJ = Y OVLYDTAK = Y OVLYDTAL = Y OVLYDTAM = Y OVLYDTAN = Y OVLYDTAO = Y OVLYDTAP = Y CRDATAF = N DBLALV = Y HDRVB = Y HASHDRVC = Y HASHDRVD = Y HASHDRVE = Y HASHDRVF = Y HASHDRVG = Y HASHDRVH = Y HASHDRVI = Y HASHDRVJ = Y HASHDRVK = Y HASHDRVL = Y HASHDRVM = Y HASHDRVN = Y HASHDRVO = Y HASHDRVP = Y ALTBNKSA = N ALTBNKSB = N ALTBNKSC = N ALTBNKSD = N ALTBNKSE = N ALTBNKSF = N ALTBNKSG = N ALTBNKSH = N ALTBNKSI = N ALTBNKSJ = N ALTBNKSK = N ALTBNKSL = N ALTBNKSM = N ALTBNKSN = N ALTBNKSO = N ALTBNKSP = N NDIRRECA = 01 NDIRRECB = 01 NDIRRECC = 01 NDIRRECD = 01 NDIRRECE = 01 NDIRRECF = 01 NDIRRECG = 01 NDIRRECH = 01 NDIRRECI = 01 NDIRRECJ = 01 NDIRRECK = 01 NDIRRECL = 01 NDIRRECM = 01 NDIRRECN = 01 NDIRRECO = 01 NDIRRECP = 01 NDTARECA = 01 NDTARECB = 01 NDTARECC = 01 NDTARECD = 01 NDTARECE = 01 NDTARECF = 01 NDTARECG = 01 NDTARECH = 01 NDTARECI = 01 NDTARECJ = 01 NDTARECK = 01 NDTARECL = 01 NDTARECM = 01 NDTARECN = 01 NDTARECO = 01 NDTARECP = 01 ODIRDRVA = A ODIRDRVB = A ODIRDRVC = A ODIRDRVD = A ODIRDRVE = A ODIRDRVF = A ODIRDRVG = A ODIRDRVH = A ODIRDRVI = A ODIRDRVJ = A ODIRDRVK = A ODIRDRVL = A ODIRDRVM = A ODIRDRVN = A ODIRDRVO = A ODIRDRVP = A ODTADRVA = A ODTADRVB = A ODTADRVC = A ODTADRVD = A ODTADRVE = A ODTADRVF = A ODTADRVG = A ODTADRVH = A ODTADRVI = A ODTADRVJ = A ODTADRVK = A ODTADRVL = A ODTADRVM = A ODTADRVN = A ODTADRVO = A ODTADRVP = A OVLYDIRA = Y OVLYDIRB = Y OVLYDIRC = Y OVLYDIRD = Y OVLYDIRE = Y OVLYDIRF = Y OVLYDIRG = Y OVLYDIRH = Y OVLYDIRI = Y OVLYDIRJ = Y OVLYDIRK = Y OVLYDIRL = Y OVLYDIRM 5m512z17p2s160t2d1i5l0h