IMD 1.18: 9/11/2012 10:27:04 eng rel 7.0 10-18-85 #5  *!>G :22!!:_ o(!!8>G^!:!q@'@>y>ycwcwF } (КϫҐ>8M PDOSYSLIB CPM86˟* K*ѭ? ,>íCOM$$$  SUB_͌> ͒> Ò> Ò͘~#͌ì DIR LISTmTYPEqUSERDFU GO ERA GSAVEREN GET JUMP21wy_[2-y2o(#2-z>/=/2-:۷ )1wͭAʹYݷ( 8 >1ʹ0ʹ}2o:޷u~#fo: !޶No Fil> ʹ> _t(>(ʹ ͭ~ʹ~#  _2<!-~6z>_ Y݇!oݶ2>2a{_:-(Ez/(;:=2 /!P!6#5z6(>)ʹ!E=E_>>ʹ n!F#~tw6!"Y Qͭ*[~(ʹ#ݿE= 8=_.:;<>[Y o$! ~+ H(+!~ (#0 0Wy8 88Oy! ~ (-H()08 80#OzW{_W{_}!L~ɯ2:o#>=!oݾ!ۯ2?S[( @G:(:owx2p2F. Fg#6SY:۷"(#* 6?mw?m"#6 :<2!  # ### !~ ??(SYS > D 2>2W:̢(g=`O> բ J{ ͭ | x  >  (> ʹx 0 >.ʹ A 6?# AllY=ͭP>2?2("Y(ͭ>2!6!~8 8w4!L~  8 ( > x (=Æ!5 6>P(ʎQo&X1(:2?S()SY|(+! 6< :Delete FileYŽPX:!?= (#"Y G!~(p p21͢Æ_[Ñ2͏( 2_[!ޯ‚6!>ڼ8 =Ful>VVVVV!HIDOS11fs1K!""S{2!Ry)K!K_^#V*:(*6:( w:2{*}D:5y<( < ) m :!q$O͈2>>"ö!""2!"~?(~?Ě*"9 <('ͼ(R.p͆6ͱͼ9< ͼNÝ *Fp<(p ͧ9Ý*B:öSͼ(R*(*#͑ <(  ͧ9:Ͷ*": :ö2@~ *!r#r#r<( ͉͆_y#x#{8s+p+q9*}/_|/*W}_*"}o|g">2~Bdos Err On : $Bad Sector$Select$File R/O$ Not Locked$No Locks$ SHRALLOC$ͦ!T!{!s C :  :y!4 5~y 5 6y 0 ^C@Oy  C: ͢  #C<:! C:2*N# ʊ ʊ x(:2M x(~+v       <2 !>w :!05͚ ͧ 3ͧx( #Nx:!2͚!5 #wOx~x p Cͼ!bk6+!!"J6 !" `}* +" | !" **ͼf}*rror at !1YM+++Y!:: !Y~&oZ ^#V ZZ: 4   4       (%W͉!*ì:!͉!f::#:#*":2?2}FyE*+"}*"{WM!F !}F!"{$!F !!"yE!"{!"}>2{2z2zx2:2!L6 :NG 632 ÁÌ×âÿú1Ò×Üýæ %.á1m* f( # 4~?(#< :<(͒:<( Ϳ öͺà>2>2 :!8 2: ( = !ú>22~*s :Һd͔ͼ(R͸(d͊2(O ͧDMPYy( 0*{z0BK0O: ('* :(n& ^#V͊Oͧ"Ϳ}:*)= ":O:o"x2* *1>G^"":222O2M:2N:2H!@6#>2G!1:(!+ !2!" !# >+>@+>#># :(>22!:>( >3>3>3>3>P0>Z > > >*>*>+>+!1! M CP/M 2.249f L2:2!s:w+x!"X!w8>2!:( >82w2a:!L:o(5OXg( 5OKG(5OA:o(5O4W(5O*(5O G(5Og(5O O(OO!M4>82w2T]>2~0~#!A=1>G^>2!"20"12!"%1ͺ͗͜ ͒͗͜͡ ͡͡:O!Nv˶@N`:`|:`:N:_~#fovvvvvvvvvvvvvvvv !} >öͼN"* ::(͌sO s#r:@(ͼ(͑w!>222Ϳ::== :y== 3*Ww#*"=%*:G# "=%:!8w4 ͑w : !!~ =26!2[!!~!~2~2:2: O:w:w:O <:!<=()yoxg*8}!N#FE"͆ ~*Y* *:o$*~͑6͑w* ͆.%KK$*[!~#>2% (Xϫvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvs1!@:H4 6#><4 6#4 w#>4 w##4:w !~(5 g#{Ms1'(2͗{M(O*}&q<2*|<G>@(h&~!p*(y(+>j()+(y)">͆( "(y #>͢(!#(y!@@(  y:(w y yW~#~O~G#~G~. ^z[! w! y !x(6.:<(*! q!p͸:< . (͒.:<(ö͑6}2àN! ~态O~G!~G~0* ͉!!q#p#w:!w*:O2*[MD*":2:G[!N40MD!K$:  %*"͆ :(N N#Fy(*B@#>22!q*" :(TEE >1f(!M *** HALTed at !1+Yv~O͗#N͗# ͗ ͗~`#|`}i0:8O×:w /2w *** error key to abort, to retry, or to ignore FDC buf: Cmd Dsk Trk Hd Sec Den Max .+~L xy2.+~S y( 82!2.+~!Z( ( :!p#q2!yCy2CC.+~(`i# n&!".+~( (:2!o3w+:!u:G#*|!6(6*8}KE"ͼ(<>!>!>*!" "!6 <(2* *<#DM*6# x [*s#r͆>(: #~$ =2ͱ:w>2*~=20:2~2w:*wF+F+ F*#~O#y "&''[o|g""R(:(k*[R 2([͆:Oy(/?($x ( ( N:/GyO # :2!~:w>ö͚<~͆[ ͠! N!Fwyx(>8>*w~#+w#ÿ.<2!|/!:ހo&!!!9^#V!^)ZUA/!!9^#V!^!KU\/!!!/0*du{/!#~/!!9^#V!^+#V*ͱt!!9^#V#*ͱt!9^#V!^*s!9^#V!^*s!9^#V!^* Gap Len StatusENRDYfDATApTRACENDT ID ORUNSECTPROTDENS}MADRI/O ! ~#~# (####:NG >2L R}!1;!1R(!1!1!C!L6 !1͌   *** CALL error at !1! *** INT e(O3 xHH(,xo( y(:a:NG a> x aO#}y*"{*+"}2*":2:(:k[*R :G: [!W͉:!8![:(:r:0%W*"*"*W!FFSFFSSFFFFFFFFFFFFCopyright (c) 1983 Digital Microsystems vvvvvvvvw|8v2͹!6͚~͔:@p*#!""<(!w# ! w ͧ͠2:<* ~<w( G:!     SYSLIB1 OVRESYSLIB1 OVREghijk    *<;=G=S 8 _ 9 n : } ;   '/    s COPYRIGHT (C) DIGITAL RESEARCH, 1981 01/25/82 1n1na^7͢͝$ڒ~7͝  $L!6:<2:*M! ^#VF*͉*:C V!C6!6!F6a͂LMCMD CMD(]^_LMCMD COM`aLMCMD $$$SYSLIB2 OVRgSYSLIB2 OVRlGIOSHNS 71AIoqrsuLDCPM A86,Z[\GIOSHNS 71AIGIOSHNS 71AI|}~  ?  ?  2?   h   **   *͂*M!/ ^#V77 77 &,Ý v/$f$m$_$!$$($?`>g7͝O2!7:‡>! 7:”>g!mMs!"}22L2M!6!6!S6!6w:1!6O!6͘͘!6͘͟: 8͝INSTALL COM\,-./01RANDOM A868bcdeINSTALL $$$RANDOM $$$GENDEF CMDL89:;<GENDEF COML=>?@ALDCOPY A86ZTUVWXYSB8-7-D5 CBIOS A86RCMAP816 10  CBIOS $$$CMAP816 $$$COPYDISKA86"#$%&'()COPYDISKA86 *COPYDISK$$$CMAPHNS 10 !CMAPHNS $$$SYSLIB COMBCDEFGHISYSLIB COMC wsrvt}|~ v uq{ypzx!68͝o'mo'm!d͍l͍l!ns!F6ͪ:ͦ:1G*nM͢.?)7͝*DM͝N7͝*nM͝%!nq:L!CҫX$!L6!C6:nҫ͉*͉*7  ?   LDBIOS A86JKLMNOPQLDBIOS A86RSGENDEF $$$LDBIOS $$$TBIOS A86TBIOS A860LDCOPY $$$SB8-7-D5$$$SINGLES DEFfSINGLES $$$TRACK A868TRACK $$$CMAPHNS $$$SYSLIB COMSYSLIB COMBDISKCHK COM 4DISKCHK $$$      +   i  z                 "  .  =  L   j {       TBIOS $$$SYSLIB7 OVRmnBIOS A86BIOS A86BIOS $$$SYSLIB6 OVRlGIOS16B 71ALvwxyzCOPY5 SUB{GIOS16B 71ALGIOS16B RGCLGIOS16B 71ALGENCMD COM!567GIOS816 71A|}~SYSLIB3 OVR*hijGIOS816 71A      ,   4  0  A  O  ]   y                 0$A%M%Y e ! t "  #    CPM86 {CPM86 14B{,-./0123CPM86 14C{|}~SYSLIB6 OVRqASM86 COM ASM86 COMZ NETUNLOKEXEUwxyz{NETLOCK EXEVpqrsuvTELEVID $$$CMAP16B 10 tCMAP16B $$$SYSLIB4 OVRpSYSLIB4 OVRkCOPY5 SUBoCOPY5 SUBpDOSYSLIBCOM+            *  6  B   N  ]   l     * *  ,  4     !o60*o&) N#F*o͏l!os*o&) N#F*o͏l"o:oR *o&*o:owg :o0*o&*ow!o60!o4A86H86LSTSYM!w~r+s+p+q*t~!s *t~#s *t~ *v~DM\!{~r+s+p+q*x~#DM*z~{ *x~:ow!|~q:|~ >:|~ >:|~ >>!}~q!}~!ow #>!po #!sor+s+q:qo=2qo>*roN6*ro#"ro!!uop+q:otosl#s#r*to :mo¥*to##:oO>Ov( *to N#Fxoͽxo 6*to##*voNͯ:2¯ #3(3(3*!͍lͮl+"o!"ons !oqy#w#q09B[0000LABELSVARIABLESNUMBERS!#oq:#o J!o6V:#o V!o4*#oM#!&or+s+q!'o6#6:'o<2'o!$oҐ*'o&*%o:(o2(on:(o?!0os+p+q+p+q+p+q+q**o*)oM^o&)*.o^#V"1o>1o/m*1o##:)o *)o:0o1osl**o7 *1o### 455+ 0 7 1 F 2 U 3 cTESTs PUSHSCASW REPZAAA MOVSDAAAAD/ PUSHF MOVSB[ADC$STOSE LODSWADDCMPSW/S        5   E ) U )   u    )  )     :o!:}~2o*oMT!~p+q"*~~ ^#V"~m®!!"~*~~N ~'mҨ!*~$ *~~DMd*~~#DM2~ʛ!:~!*~$ *~~6!"~Ø!*~~DM7Nå!*~"~@!!"~*~$ *~~~2~*~#"*~~ q#p:~!~p+q*~N !"~"*~ ~$m."*~$ *~:oo/m"o!}oq*}o&!~oq*~o&  o&!oq*o&!op+q*o!op+qd*o!op+q*o >w*oDMt!op+q*o!op+q*o!op+q*o!op+q*o!op+q*o *,oq#p>*1o^#V"1o>!:or+s+q+p+q+p+q+q:8o!3oo/m!o=mR7͝ *4o*3oM^o&)*6o";o*;o*oN#Fq#p*;o*os#r*o###*9oq#p*o##:3ow*3o*4o:8oosl\:8oosl*3o& +s#r>!Aor+s+p+q+q*=o*>on*oM*@o!For+s+p+q+qTOSBJA&JB DEC&JC_ LOOPNEAAM,DJE4 REPNZJAE0JBEMNJG LEA\CLCCMClCLDtANDU LOOPZAASXJGEbJLSBBINDASCLI0JNAJOJNBJP NEGINCJNCJE      )  )   ;   K ) [ )       )  )       )  ) DMd*~#DMO>!"*~DM7N*~"~!!~r+s+q*~N O!" ^#Vó"*~Mó"*~M/ó""*~ ^#V"~mˆ"*~DM!!"~*~$ *~:~w*~#"*~ q#pó"K"N"X"b"!~p+q"*~ q#p*~N H}0"*~#DM͊""*~#DMt"*~DM7 !op+q:o2o:o):o)>:o<:o<>>!op+qo'm>+:mH!or+s+p+q+q:o=2oʒ*o*o w*o#"o*o#"ok'd !op+q*o~ʽ*oN*o#"oã!op+q*o>AO:!o6>!o*o& *o> !o6**Bo*Co*oMGo)*Go*Eos#r>>!Mor+s+p+q+q*Io*Jo*Lo*on͖!Qor+s+p+q*o*NoDM*Po\!Uor+s+p+q*o*Ro*ToDM\!Zor+s+p+q+q*Vo*Wo*Yo*o͖!]or+s+q:[oo/m!o=m>*[o*\oDM*o\:[oosl+s#r>!bor+s+p+q+q*^oSClJLELAHFCBW MOVSWCALLJS.JNE&JNAE=CWDJPENlJNGVJNBE SALg5STOSWoCMPe RCL{ OR_ LOOPNZ{ SAHFCALLFLDS DIVbJNGEXJNLDJZ LES SARJNO RCR REP   # 4EQ]  i  x          ) ) N!~p+q*~N L#"*~ >w#6*~N *~#DMʹ*~#DML#*~DM7N!~p+q*~N ‰#*~/"*~DM!*~#DMͤ‰#*~DM7N!~p+q*~N $*~ DMd*~#DMͤҰ#!~q*~Mx/"!~q:,z#*~M#:F#*~M*~M,z/"!~q*~MP|/"o& *o>O!o4.!o6 > !oJ*o& *o>O!o4% !or+s+p+q*oDM͝: *oDM;!or+s+q+q:o=2oʝ*o:ow*o#"oÀ!oq:o0ҭ>>9!o/!oq:oA>>Z!o/!oq*oMͶ>*oM͞!oq:o >:o >*_o*ao!"o}2go>?!go_*go&n) ^#V"!o>!o/mX*!o^#V"eo*eo"!o6!go4:o!osl"ho:oosl"jo!lo6*!o##~!lo*o##~!loҚ>:lo=O*ho O*jo ~Ҷ>:lo=O*ho O*jo >!lo4}>*!o*os#r*!o*coq#p!o"co"o*o SHLJMPJNPbHLTNJNLEJPO'% LOCKSCAS8STCASUBIXCHGJNSZ STDbINTj RET REPEzSCASBuIDIV NOP+ ROLSHRJMPF MUL POPSTI RETF NOT5 LODSJNZk MOVk RO    ; L ] n,-- (  )  *  +   o!s!oʹ"sʹ"x#,z#P|#o͊#!o6#q#p:oW$!o6!o6 $s͊#xM#,zM#P|M#!~r+s+p+q+q*~sͲ :~2s*~DMs\!~622o:\$:\=2oOTo oͲ r xͲ u ,zͲ x P|Ͳ o]\ x]\:o >>~!o/!oq:oa3>~!o3:o 2o:o!or+s+p+q+q:o=2os*o*o b>*o#"o*o#"oF>!or+s+q:oO͞*ow:oO͞*o#w!oq:o02oO>9ҹ:o2o:o!or+s+p+q*o|*oOv*o}*o##Ov!or+s+p+q!o6 +6>!on :o^#V"o>m$`*o"co 6 6!moq!o6 6:moY :moi& :moy/(*o"o>o/mʣ*oDM?*o^#V"oÂ:oʮ(*o&!͍l!oos*o&͏lym!pos+~(:2:po=2po 6:poRCMPS? LODSB  IRETrWAITCMPSB& POPFIMUL OUT RETNJdXORSXLAT REPNEdINTOnK LOOPwJMPS:JCXZU LOOPE|!;EUd| %5F^y/Qr * 6 E  T   x               .z]\R|]\:e +%oe\  s!~6:~:~!~ͭ&$H%û%!~6:~҆&>!~҆&ͭ&O2~ ʃ&:~A 8:~2~*~MB82~!"~!6V9-:V9͞8!~6:”:!~:~~"mH{::~`:͞8:~2~*~MB82~*"~!6V9*& *~Mv!44*#""~!~6!~6^9!%s+q:$2~:%2~O! ; ^#V:~:̀9.:;.:;.:;.:;9;9;9ED INCLUDE NOT ALLOWEDILLEGAL EXPRESSION ELEMENTMISSING TYPE INFORMATION IN OPERAND(S)LABEL OUT OF RANGEMISSING SEGMENT INFORMATION IN OPERANDERROR IN CODEMACROBUILDING222303E3[3|333334'4K4h44444525Y5l552** ERROR NO: ** NEAR: " ...0/R//////          ' +e(O+!6:!+!6 :;8+: 8+A'2'+!6 :~L+!~6O+': ^+͉*P+!~q:!~:HҀ+>>!~q:ª+!~:Ÿ+͉*>: ª+>͉*Ç+ _+ % !~q*~M+!~6#:~ +!~4:~ +!~6*~M#!~q:&o&Ã&:~H&x&Ã&:~P,&,z&Ã&:~S=&P|&Ã&:~Fy&ͭ&O2~I\&!D6v&:~Dl&!D6v&!~6!~6Ã&!~6!~6%:,z21:P|22:o2*oM ʩ&!~6:~>!~&*~& ~2~!~5#4&!~6 :~!~p+qͭ&O2~*~MͶ':~A*~w*~>;9;:::::::;+-*/ +-  !q*!6*M<;!p+q* *m#M*s* 6@!r+s+q+q!6:<2!ҽ;*&*N_+Һ;͉*:!Ï;>!r+s+q+q: !~q:!7:F7!F6*~MJ6 ~~00001(101<1!~6:~<2~!~Ҫ1*~&*~*~&*~~҉1>*~&*~*~&*~ ҧ1>]1>:~»1>o2*~&!͍l!~s*~&ͬl*~"~*~&))*~"~X1O!i2 ^#V*~"~!~, ++!~p+q*~~1,*~N+*~#"~,!~6!~4 7,,+,3,: O+#7,*~M,+,!~6:SҦ,:~<2~O:Rڣ, + +Ç,ë, #!~6>!~,̀,2,!~4:R ~H,ͱ,!~q:~ -:~_!͍lym!~s:~=2~'*~~'!~6'!~6!~6*~!~q*&T :~w:O@'!4:~K'':L['$2~a'#2~:~q'!~6ò':~ !~҉'!~6 ò':~ ™'!~6ò'!~6*~M#':~ ²'!~6 :~'*~M2~:~: : H'A'2'!~q*& :~w:O:!;>!r+s+p+q*##~*##~H9:¬<>:·<>E;!p+q::H=::=**s*~ w͉*͉*>*#"YNCP/M ASM86 1.1 SOURCE: PAGEEND OF ASSEMBLY. NUMBER OF ERRORS: . USE FACTOR: CP/M 8086 ASSEMBLER VER 1.1 PARAMETER ERROR NO FILE DISK READ ERROR DISK FULL DIRECTORY FULL CANNOT CLOSE SYMBOL TABLE OVERFLOW USER BREAK. ~!~6>!~/2*~&*~*~&*~ w!~42>o2:~~sl"~*~"~!~:~=+wͭ1o2:~2~ͭ1o2152\2!~r+s+p+q+q:~2~*~"~*~"~ 2*~&D1) ^#V"~*~&0) ^#V"~~2~*~#"~ͭ12>ILLEGAL FIRST ITEMMISSING PSEUDO INSTRUCTIONILL - +,"-*~M+:~ "-, , ,!~s+p+q+p+q+p+q!~:~*~*~ Hr-*~N*~ N,*~4B-:1:F/H҈-:Lҡ-!6=:¡-!6!~6#6!~6~.-!~:!O>Z.!~::#HO>W.+~.-:(!4!~q!~6:~a(A'2O/(*M'(!~6:@:_H^(!~6+~^(*M'('!~6!6!~6:~(A'2:': Hҩ(*M'A'2Á(:'(A'2'(*M'(!~6'!6!~6(!~6!6!~6t(!~6(:=O!>!r+s+p+q*DMR;*##6* *s#r!p+q:j=*DMR;*##:w* :w* *s#r>*,=**DMR*##~2:H:H=!6*##6!6 6>!6#~=*=E;*##6**DMm OK(Y/N)? END OF PASS 1 END OF PASS 2 !q:D[8*&*8 ~f8*&68 ~!p+q*~2 *#"~2!*: w*+":!w!"q*"Mͱ#~g8:2~!~6!6:<2!8*&~ `iwö8:~/<*&~ w:͒8!6:!9*&EGAL PSEUDO INSTRUCTIONDOUBLE DEFINED VARIABLEDOUBLE DEFINED LABELUNDEFINED INSTRUCTIONGARBAGE AT END OF LINE - IGNOREDOPERAND(S) MISMATCH INSTRUCTIONILLEGAL INSTRUCTION OPERANDSMISSING INSTRUCTIONUNDEFINED ELEMENT OF EXPRESSIONILLEGAL PSEUDO OPER +.+!~6>!~+.*~& N,!~4.!~:O>Q.+~T:=_.-#--].#-:F!l.s- *Ms s!6!6:ҡ.!~6#6ͱ,!~q:.#-#-)7,*DM,N7,*~M,+,"AHALAXBHBLBPBXCHCLCS ~2~:==2~:~B")!~6#6w):~O:~QHE)!~6#6w):~HX)!~6#6w):~Dk)!~6 #6w)!~6 #6!~4!~6:~<2~O! ~0“)|):~!~O:~*!"~:~!~**~& ~2~02~O> ):~2~!~:~)!~6*~&*~ͬl*~& "~!~4è)6!6͉*!p+q$_+>>._+(>>:I>>!~HF>>>*DM-=*##~2:H:H~>>>;!9N#F >O!? ^#V!9N#F`i6!9wl6kl*s#r:>: !9wlHqkl*s#r͉*ø?͉*!9N~ Nv*M͒8*M͒8!48 ͒8 ͒8!#q>!D9͞8*"~!6*&~ :#w!4*~M)9:~i9͞8B82~!"~!6͞8:9!~6:~ʘ9͞8!6!"~B82~:9*M)9*M)99)9)9*M)9*M)9͞8!~6:-:!~:~"::~:͞ANDNESTED "IF" ILLEGAL - "IF" IGNOREDILLEGAL "IF" OPERAND - "IF" IGNOREDNO MATCHING "IF" FOR "ENDIF"SYMBOL ILLEGALLY FORWARD REFERENCED - NEGLECTEDDOUBLE DEFINED SYMBOL - TREATED AS UNDEFINEDINSTRUCTION NOT IN CODE SEGMENTFILE NAME SYNTAX ERRORNESTCXDBDDDHDIDLDSDWDXEQESGEGTIFLELTNEORRBRSRWSISPSS ANDENDEQUMODNOTORGPTRSEGSHLSHRXOR BYTECSEGDBITDSEGENDMESEGLASTLISTRELBRELWSSEGTYPEWORDDWORDEJECTENDIFMODRMSHORTTITLEIFLISTLENGTHNOLISTOFFSETSEGFIXINCLUDESIMFORMNOIFLISTNOSEGFIXPAGESIZECODEMACROPAGEWIDTH*!~6:~*!6)*!6#6*~#s#r(*p2E*!6!C6!~6!~6+6!~6 s s!6!6͏.6$!6 !9"~:~ҟ*^.!~6':~*!6:~*!~6!C6*!~6+6!6 O+!6:2*MͶ***O+*M͞*(O+:     #F-=!9N#F ?E;!9N#F`i6!9wl* s#r>!9wlHq:a?!9wl> wø?:?!9N#F*&=ß?:!9w:2~2!9N#F*=͉*ø?ø?E;ø?>>d???3(_+?:&<2&O>?E;͉*!9N#F&F)_+?E;!&5͉*[_+= ^#V!]6+6&BT!]6+6.BTQT/2]!\66BTQT2]!\6>BTTTT,T:]PT*\MQ*Z ~2\:^:\H!ar+s+q*` ^#V"i*`##~2e*` ~2f2g*` >2h:eT*i!cs+6!d6TU:fT!c6+6!d6TU͛U2d:d2b;UO!*:>O:2O!ہ5~/O͉**N:܁.O!6>O:>O!ہ4P+N>!MXO!M5*N`O6P+:LqO6P+!߁6:2݁  s:::H*MͶHҸO:A2͉݁*͉*>!TPHOIP#P*\͉*._+P͉*>!TPHPIP+!":́2}2o&"$_+QJ:́2*Ɂ~2*ǁ^#V"*ˁ^#V"JJ͊J͉*HZ GҁJ:\J*`":́2!6!"͊JHP+ 6*́&H ^*Mͮ:*́&H ^*Mͮ:*DMͽ!6!΁qI!ҁ6!"Ё!ρ6:ρJ!F6!ρ6*΁MK:F!ҁwJ*Ё"N:ҁ! 9$m+++w#6OE! 9!9$m/+w#6OE! 9!9$m+w#6OEDDDDE*E>! 9:mfE! 9q#p!9wl!9N#Fq#p!98;;E!9N#F͂E!9N#F+N#FPY<!9wll+s#rE!9N#FGD;!9N#F͂E9;; F!9DM͂E!9N#F@: @E;!6͉*!9N#FR;!9N#F`i6!9N#F͟G;@E;!9N#F́>!9#;;! 9wCA!9N#Fͻ?! 9N!6A ^#V!9wl> ”@E;!9N#F+wl^#V=@A!9N#F+wl^#V=@A!9N#F+wl>_=@A!9N#F+N#F`i^#V=@A!9N#F`iN#FNU ^#V:h2cTU:h2cTU:hO>FU!c6#~CU!d6!b6KU!c6TU UU!U:_82_:b2b:b!_!cOQ>!dҚU*iMQ:dšU*jMQ:g¦U>>i/mµU>*iDM:f@U:fU>>>*I~2kRR*kMwTR"m*m N#PP*\͉*#P'N\:߁0PP+HP*݁t$$*N!L66!߁6!ށ6:ށ<2ށ!~P*ށ& N{P>YP>*N!C6R:N:N*M!P ^#V:P3s>!P!6*3\P+QP+Q:P͉**NP 6P+QP2F!Ӂq*Ё#"Ё*ӁM!1K ^#VͮK7KL7KFL7KK%K+K,_+KK͉*!ρ6`Kͱ+XKP+`K6P+!ցq*&H ^*ցMͮ:Z GҫK:\2ԁ:ԁH:ԁHҫK>>:>!HL:Ёsl++s#r!ԁ6:ԁ<2ԁ!K*ԁ& NaKK!\6͉*#<!9wl! 9͂l+s#rE! 9!9N#FE:;;! 9wʠF!9DME!9N#F#! 9w#6!9N#F! 9N#F PY=@A@@@@@A!9N#Fͻ?(;;A!9DMͻ?!9N#F###~`iw!9wl!9N#Fq#pkl! 9N#Fq#pkl! 9~wkl>>! 9HwMA!9;!9DMͻ< B!9N#FI@!9wl>#wF!lqR*lMwT!o6#6*I~ TV*INfQ*RO!KV ^#VVQVVQVQV!s~V*sM!qlw:rҒV!r>O+lw:p>!rHV:qV*p&lQ :o2o!p5!r5+~wÒV*I~2tR*IN*tM_VR*I~2uRR"wPP:Qͱ,*N!S6*N*N:5Q!6!6!6:PQ*N^.!6!6SQ*N*N!6*N!6 @!;6!<6:<<2O>ҲQ!>6!=6:=<2=*>&hQ Qͮ:÷Q!?q:EQ*;& :?w!;4!Ap+q*@MQLwKL*`MaKLaK6wK6L*`MaK*aMaKELaKaK6wK҄L:\ʄL:] L*`MaK*aMaK*^MaK*_MaKÄL6!ԁ6>!ԁڞLaK!ԁ4‰L6ͽJͽJͽJ!ׁqI*DM*ׁ7IxI xI xI >w#6:!p+q!6#6*DMF!p+q!6#6*DMF *Y&ͬlZ "!6!6*DMF2[_+҉G:҄G͉**DM͟G!wÉG!6:!6:G!6:G!p+q4HڵG>͡H͉*+_+G͉*4HG>!:G>͡H͉*]_+H>kl>wB!9N#FI@3;);};!9wjB!9N#FB!9N#F+N#FPY2|*I>2}*I> 2~R *y&ͬlZ "!z6:}qW͒W2z:|ʁWW!zw:zҎW͏X2z:z*I~2R:}®W*I~2R* N#F!q:}W!:/#~!/HW!:*##~2W>**AMQ*I#"I*In& ͬlZ "BR*B!Gr+s+q+q!H6:H<2H!EeR*H&*F:DbRR:H R6*M N#FQ*M N#FQR"O*O "m++"Q*O xI7I*M! N ^#VN*~͈HkM!P6*WDMNm*B*~^#VhM!K6ÛM!Y6͖G҈M*WDMZmP+ÛM!P6*WDMNmP+N:PʽM!Y6͖GҽM*WDMZmP+N:PM͉*N!Y6͖G/:PHM 6P+N!6*`DM͉** > *H*##~*H* >@w*##6>!r+s+p+q::HҞH*6**s*~~HH>*6*~~HҞH>>!Ár+s+p+q*~H* >@w*~H* >wH* >w*~H* >w  ͱͮl! 9s#réC!9N#F! 9^#V͏l! 9s#réC!9N#F! 9^#V͏l! 9s#réC>!9:m>/mHoC!9N! 9l+s#réC>!9:m>/mHҜC!9N! 9l+s#réCBC)CECrC!9wl!9N#Fq#pÇB!9!9N#FwB0;};! 9wAD!9DMwB!9N#F# >2:X!|::9X:!|:H:ŒX* ^#V":|=O!X ^#V*DM?/*DM?*DM>`XjXsXX>*##~2* N#F!q* >2*{M!DY ^#V::H::UY:HUY:$m*QDMH#S6*QMQ: BS*O N#FͽR"S*S $m_S6*S "m+++DMQ: S*S N#Fͽ*I~2URR"X*X >@S*X ~2V2W!U2ER"Z*Z ~2^*Z >@PT:^2\O!:TͽHN'MMM: :;HA86ͱ+6N6P+!فp+q:NNP+vNZ GnN:\nN*؁*`s*N 6P+:MŠN 6P+NZ#GښNNN:\ʨNNN*`!ځs{N!M4*NNP+N 6P+>2ہ:/!N^.!6!܁6N!܁6:CDO+ I6P+::H6I*DMͽ!6!Ɓs+p+qZ#GoI:\oI*`"N*Ɓ&*`ͬl*ā"H 6P+!́s+p+q+p+q+p+q*M!I ^#V*":2*"I*":2*"I*" :2*"I*" :2*"IIIIIͱ+J:D!9wl!9$m+s#rC! 9!9!9N#FC2;;! 9w|E!9DMC!9N#F#<!9wlN#F! 9q#p! 9N#F#q#p! 9N!CE ^#V! 9!9$m+w#6OE! 9!9$m+w#6OE!9! 9$m/+++w#6OE!9     :H::H:* >HXXXXXXY(Y:*I"RR*I~2R:ʁY>!Y:ʓY!6øY!6#6:<2!ҸY*M W!wÛY:Y*"I:*G"I^YY>*I>:mY>*I^#V"IY !q*M5h͉*:,isj!ibj͉*!q:ei:Gi*~w*#">!:m[i!86bi*M5h^j:{i*> w*#"gO!4j ^#V!86^ji^ji^ji^ji^ji^ji^ji^ji^ji^ji^ji^ji^ji^j*fd*M5h͉*$d!865h:>!:mHJd!865h*M5h͉*:(gd!86͉*:µd*fډd!86*++"5*##"*M5h͉*:(ʲd!86͉*:>!:mHd!86*M5h͉*:)d!86͉*>/m+s#r`M`:_6f_ͤL`:)_öZ>*~^#V"G*Gi^ji^ji^ji^ji^ji^ji^jiiiiiiiiiiiiiiij jjj$j,j͉**+">w%i*+">w%i:,ʑj!86͉*%i:)ʧj!86!q*M5h!q*M5h**6\:6sl+s#r6*6#+s#r͉*::j!86͉**M:)He͉**":,(e͉*+d 5h5h!q:KeP+!86:\e!86*M!e ^#Vbebebce bceͤce/bebcebce%d+d/eelete|eeeeeee b!8e!66P+:e!6P+!86!6:__________!q\:(`ͯ\͉*\\O!` ^#V`ͤL a``ͪL a``ͰL a``ͶL a``ͶL a``ͶL a`D]ҳ`]ҭ`Mð`P+ö`P+`6P+`6P+`=`K`Y`g`w`````!q!6D] a] a*##">!6!Y6ͱ+/2:Ҋ[!6 *Y&ͬlZ "͍Gj[*##~T[6!6,̓+g[!6Ã[,_+҃[͉*:Y҃[!6!Y4[:!6+6:<2!Y[ *&ͬlZ "##~[* >[!6Ö[:[>!6:<2!Y9\ *&ͬlZHgO!Xk ^#Vͨjjkͨjjkͨjjkͨjjkͨjjkͨjjkͨjjkͨjjk!86jkkkk'k/k7k?kGkOk*MygO!k ^#Vʹjðkʹjðkʹjðkʹjðkʹjðk~kkkkk͉*:(¾k i!;4!"!<"!"6Ps9dsPs!6!"f!86k!6 lf!860l b!82f!66P+;e;e;e;e;e;e;e;e;e:}fP+!6!86:ڎf!865e:œfKl b!8!Ұf6P+!6!6ACDEMRSXBWDS!r+s+p+q+q!6*6*:;=Eg:!O! ~ ^!6:aF^: fagaO!Za ^#V6P+fa`fat^fa^faZ^fa`fa-a8a@aFaLaRa:2ua>:::HҐa>::Ha*~͈aͯ\͉**!s:{Ha>>:a>>!Q6!$6!6 " >\>*##~* N#F?H6\>[>tQͳZ҄\[}\͎[r\Zj\ͱ+g\6o\6z\6͠QÄ\Z҄\P+     :2B*\:B2*B\ͯ\:2*\N s!r+s+ title '8086 Disk I/O Drivers' ;********************************************* ;* * ;* Basic Input/Output System (BIOS) for * ;* CP/M-86 Configured for iSBC 86/12 with * ;* the iSBC 204 Floppy Disk Co!6!6:l>*\:2͉*>:Jlj:,Dl͉*0l:Sl͘hel!86!6i`N#Fog_ogi`N#FogDM!>))덑o|gҦl =”lDM!>))һl =³lYP뗖_>#Wi`/o/gi`N#Fog~ l^#V) l~ l^#**& *DM7H#g>:<2O! ~:g#g!4*4f>!q!6>!ug*&f :ng:!4Qg:!q!6>!g*&f ::Hҭg:*&f ::Hg:Bg>!4‚g::g>!6:h!6!R6B!K6!D63s!6: +b>>:Zb 5h>!:mPb!86Wb*M5hÑb:‹b*f҂b 5h*M5hÈb!86Ñb!86͉*:,ʢb!86͉*:b*fb*M5h͉*b!86b!86!q:#c*M5h:c*DMbhq:]:]*BW,ڞ]>*WDMNR!6:P¾]!6]:P]!6:]\*M6\>>:^*BW^!Kntroller * ;* * ;* (Note: this file contains both embedded * ;* tabs and blanks to minimize the list file * ;* width for printing purposes. You may wish* ;* to expand the blanks before performing *V|g}o m_{ozgO{ozgi`N#Fogo&og_{_z#Wi`N#Fog: h!6:sl#}:$h>:/h>*#}!q*#">cmSh!86!6*:w*#"!p+q*##">cm҃h!86!6**s#r*##"!"**͈h*>:mh*^#V"ðhh**h>**os#r*M9ͮh>>c>!:mc!86c*M5h͉*ac:[c*fRc:>!s+q:2:2P:/^: 2:!2Q*"R*"T:Y^*WDMNm:m^6P+s^I<\ͯ\D]ґ^]ґ^ ^F^͉*͉*ͱ+Ҥ^P+^*~͈Ҿ^͉*Z^^6\ \O!_ ^#VwN`EO`aO`L`L`L`L      ;* major editing.) * ;********************************************* ; Copyright (C) 1980,1981 ; Digital Research, Inc. ; Box 579, Pacific Grove ; California, 93950 ; ; (Permission is hereby granted to use ; or abstractmov si,0 ;then propagate mov cx,510 ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ;********************************************* ;*  byte sector jmp LISTST ;return list status jmp SECTRAN ;xlate logical->physical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O 204+8 ;8257 out mode dmac_stat equ base204+8 ;8257 in status fdc_sel equ base204+9 ;FDC select port (not used) fdc_segment equ base204+10 ;segment address register reset_204 equ base204+15 ;reset entire interface max_retries equ 10 ;max retries ory ;| | ;--------------------------------------------- ENDIF ;loader_bios csts equ 0DAh ;i8251 status port cdata equ 0D8h ; " data port IF blc_list ;--------------------------------------------- the following program in ; the implementation of CP/M, MP/M or ; CP/NET for the 8086 or 8088 Micro- ; processor) true equ -1 false equ not true ;********************************************* ;* * ; * ;* National "BLC 8538" Channel 0 for a serial* ;* 9600 baud printer - this board uses 8 Sig-* ;* netics 2651 Usarts which have on-chip baud* ;* rate generators. * ;* map byte (IOBYTE) ;********************************************* ;* * ;* INIT Entry Point, Differs for LDBIOS and * ;* BIOS, according to "Loader_Bios" value * ;* n disk i/o ;before perm error cr equ 0dh ;carriage return lf equ 0ah ;line feed cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vecto ;| | lsts equ 41h ;2651 No. 0 on BLC8538 status port ldata equ 40h ; " " " " " data port blc_reset equ 60h ;reset selected USARTS on BLC8538 ;| | ;-----* Loader_bios is true if assembling the * ;* LOADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. Blc_list is true if we * ;* have a serial printer attached to BLC8538 * ;* Bdos_int is interrupt used for earlier * ;* versions.  * ;********************************************* mov al,0FFh out blc_reset,al ;reset all usarts on 8538 mov al,4Eh out ldata+2,al ;set usart 0 in async 8 bit mode mov al,3Eh out ldata+2,al ;set usart 0 to 9600 baud mov al,37h  * ;********************************************* INIT: ;print signon message and initialize hardware mov ax,cs ;we entered with a JMPF so use mov ss,ax ; CS: as the initial value of SS:, mov ds,ax ; DS:, mov es,ax ; and ES: ;use local stacr for Individual Routines * ;* * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status---------------------------------------- ENDIF ;blc_list ;********************************************* ;* * ;* Intel iSBC 204 Disk Controller Ports * ;* * ;* * ;* * ;********************************************* loader_bios equ false blc_list equ true bdos_int equ 224 ;reserved BDOS Interrupt IF not loader_bios ;------------------ out ldata+3,al ;enable Tx/Rx, and set up RTS,DTR ;| | ;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| k during initialization mov sp,offset stkbase cld ;set forward direction IF not loader_bios ;--------------------------------------------- ;| | ; This is a BIOS for the CPM.SYS file. ; Setup all inte jmp CONIN ;return console keyboard char jmp CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on******************************************** base204 equ 0a0h ;SBC204 assigned address fdc_com equ base204+0 ;8271 FDC out command fdc_stat equ base204+0 ;8271 in status fdc_parm equ base204+1 ;8271 out parameter fdc_rslt equ base204+1 ;8271 in --------------------------- ;| | bios_code equ 2500h ccp_offset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point ;| | ;---------------------------------------------  | ;This is a BIOS for the LOADER push ds ;save data segment mov ax,0 mov ds,ax ;point to segment zero ;BDOS interrupt offset mov bdos_offset,bdos_ofst mov bdos_segment,CS ;bdos interrupt segment pop ds ;restorrrupt vectors in low ; memory to address trap push ds ;save the DS register mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4  cur sel drive jmp SELDSK ;select disk for next rd/write jmp SETTRK ;set track for next rd/write jmp SETSEC ;set sector for next rd/write jmp SETDMA ;set offset for user buff (DMA) jmp READ ;read a 128 byte sector jmp WRITE ;write a 128result fdc_rst equ base204+2 ;8271 out reset dmac_adr equ base204+4 ;8257 DMA base address out dmac_cont equ base204+5 ;8257 out control dmac_scan equ base204+6 ;8257 out scan control dmac_sadr equ base204+7 ;8257 out scan address dmac_mode equ baseENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| | bios_code equ 1200h ;start of LDBIOS ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS ent     e data segment ;| | ;--------------------------------------------- ENDIF ;loader_bios mov bx,offset signon call pmsg ;print signon message mov cl,0 ;default to dr A: on coldstart jmp ccp ;jump to coling. ;[BX] points to length, ; followed by Command byte, ; followed by length-1 parameter bytes mov last_com,BX ;save command address for retries outer_retry: ;allow some retrying mov rtry_cnt,max_retries retry: mov BX,last_com call senHome Error" jmps home ;and retry SETTRK: ;set track address given by CX mov trk,cl ;we only use 8 bits of track address ret SETSEC: ;set sector number given by cx mov sect,cl ;we only use 8 bits of sector address ret SECTRAN: ;translate p al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to caps uret: ret ; utility subroutine to print messages pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT  IF blc_list ;--------------------------------------------- ;| | call LISTST jz LISTOUT ;wait for printer not busy mov al,cl out ldata,al ;send char to TI 810 ;| d start entry of CCP WBOOT: jmp ccp+6 ;direct entry to CCP at command level IF not loader_bios ;--------------------------------------------- ;| | int_trap: cli ;block interrupts mov ax,cs mov ds,ad_com ;transmit command to i8271 ; check status poll mov BX,last_com mov al,1[bx] ;get command op code mov cx,0800h ;mask if it will be "int req" cmp al,2ch jb exec_poll ;ok if it is an interrupt type mov cx,8080h ;else we use "not command sector CX using table at [DX] mov bx,cx add bx,dx ;add sector to tran table address mov bl,[bx] ;get logical sector ret SETDMA: ;set DMA offset given by CX mov dma_adr,CX ret SETDMAB: ;set DMA segment given by CX mov dma_seg,CX ret ; ;print it inc BX jmps pmsg ;next character and loop ;********************************************* ;* * ;* Disk Input/Output Routines * ;* * ;*** | ;--------------------------------------------- ENDIF ;blc_list ret LISTST: ;poll list status IF blc_list ;--------------------------------------------- ;| | in al,lsts and al,81h ;look ax ;get our data segment mov bx,offset int_trp call pmsg hlt ;hardstop ;| | ;--------------------------------------------- ENDIF ;not loader_bios ;********************************************* ;* busy" and al,0fh cmp al,0ch ;unless there isn't mov al,0 ja exec_exit ; any result ;poll for bits in CH, exec_poll: ; toggled with bits in CL in al,fdc_stat ;read status and al,ch xor al,cl ; isolate what we want to poll jz exec_p GETSEGT: ;return address of physical memory table mov bx,offset seg_table ret ;********************************************* ;* * ;* All disk I/O parameters are setup: the * ;* Read and Write entry****************************************** SELDSK: ;select disk given by register CL mov bx,0000h cmp cl,2 ;this BIOS only supports 2 disks jnb return ;return w/ 0000 in BX if bad drive mov al, 80h cmp cl,0 jne sel1 ;drive 1 if not zero t both TxRDY and DTR cmp al,81h jnz zero_ret ;either false, printer is busy or al,255 ;both true, LPT is ready ;| | ;--------------------------------------------- ENDIF ;blc_list ret PUNCH: ;not im * ;* CP/M Character I/O Interface Routines * ;* Console is Usart (i8251a) on iSBC 86/12 * ;* at ports D8/DA * ;* * ;**********************oll ;and loop until it is done ;Operation complete, in al,fdc_rslt ; see if result code indicates error and al,1eh jz exec_exit ;no error, then exit ;some type of error occurred . . . cmp al,10h je dr_nrdy ;was it a not ready drive ?  points transfer one * ;* sector of 128 bytes to/from the current * ;* DMA address using the current disk drive * ;* * ;********************************************* READ: mov al,12h ;basic read sectormov al, 40h ;else drive is 0 sel1: mov sel_mask,al ;save drive select mask ;now, we need disk parameter address mov ch,0 mov bx,cx ;BX = word(CL) mov cl,4 shl bx,cl ;multiply drive code * 16 ;create offset from Disk Parameter Base add bx,oplemented in this configuration READER: mov al,1ah ret ;return EOF for now GETIOBF: mov al,0 ;TTY: for consistency ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and fl*********************** CONST: ;console status in al,csts and al,2 jz const_ret or al,255 ;return non-zero if RDA const_ret: ret ;Receiver Data Available CONIN: ;console input call const jz CONIN ;wait for RDA in al,cdata and a ;no, dr_rdy: ; then we just retry read or write dec rtry_cnt jnz retry ; up to 10 times ; retries do not recover from the ; hard error mov ah,0 mov bx,ax ;make error code 16 bits mov bx,errtbl[BX] call pmsg ;print appropriate message  command jmps r_w_common WRITE: mov al,0ah ;basic write sector command r_w_common: mov bx,offset io_com ;point to command string mov byte ptr 1[BX],al ;put command into string ; fall into execute and return execute: ;execute command strffset dp_base return: ret HOME: ;move selected disk to home position (Track 0) mov trk,0 ;set disk i/o to track zero mov bx,offset hom_com call execute jz return ;home drive and return if OK mov bx,offset bad_hom ;else print call pmsg ;"ags ; Routine to get and echo a console character ; and shift it to upper case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cml,7fh ;read data and remove parity bit ret CONOUT: ;console output in al,csts and al,1 ;get console status jz CONOUT ;wait for TBE mov al,cl out cdata,al ;Transmitter Buffer Empty ret ;then return data LISTOUT: ;list device output        in al,cdata ;flush usart receiver buffer call uconecho ;read upper case console character cmp al,'C' je wboot_l ;cancel cmp al,'R' je outer_retry ;retry 10 more times cmp al,'I' je z_ret ;ignore error or al,255 ;set code for permanent errS dw tpa_len ;and extends to 08000 dw 2000h ;second is 20000 - dw 2000h ;3FFFF (128k) include singles.lib ;read in disk definitions loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ (last | ;--------------------------------------------- ENDIF ;not loader_bios bad_hom db cr,lf,'Home Error',cr,lf,0 int_trp db cr,lf,'Interrupt Trap Halt',cr,lf,0 errtbl dw er0,er1,er2,er3 dw er4,er5,er6,er7 dw er8,er9,e inc BX mov al,[BX] ;get command or al,sel_mask ;merge command and drive code out fdc_com,al ;send command byte parm_loop: dec cl jz exec_exit ;no (more) parameters, return inc BX ;point to (next) parameter parm_poll: in al,fdc_stat t ;* Send_com sends a command and parameters * ;* to the i8271: BX addresses parameters. * ;* The DMA controller is also initialized * ;* if this is a read or write * ;* * ;**************or exec_exit: ret dr_nrdy: ;here to wait for drive ready call test_ready jnz retry ;if it's ready now we are done call test_ready jnz retry ;if not ready twice in row, mov bx,offset nrdymsg call pmsg ;"Drive Not Ready" nrdy01: call tesoff+0400h+15) / 16 tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section * ;* rA,erB dw erC,erD,erE,erF er0 db cr,lf,'Null Error ??',0 er1 equ er0 er2 equ er0 er3 equ er0 er4 db cr,lf,'Clock Error :',0 er5 db cr,lf,'Late DMA :',0 er6 db cr,lf,'ID CRC Error :',0 er7 db cr,lf,'Data CRC Error :',0 er8 db cr,est al,20h ;test "parameter register full" bit jnz parm_poll ;idle until parm reg not full mov al,[BX] out fdc_parm,al ;send next parameter jmps parm_loop ;go see if there are more parameters ;********************************************* ;* ******************************* send_com: in al,fdc_stat test al,80h ;insure command not busy jnz send_com ;loop until ready ;see if we have to initialize for a DMA operation mov al,1[bx] ;get command byte cmp al,12h jne write_maybe ;it_ready jz nrdy01 ;now loop until drive ready jmps retry ;then go retry without decrement zret: and al,0 ret ;return with no error code wboot_l: ;can't make it w/ a short leap jmp WBOOT ;********************************************* ;* * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 lf,'Drive Not Ready :',0 er9 db cr,lf,'Write Protect :',0 erA db cr,lf,'Trk 00 Not Found :',0 erB db cr,lf,'Write Fault :',0 erC db cr,lf,'Sector Not Found :',0 erD equ er0 erE equ er0 erF equ er0 nrdymsg equ er8 rtry_cnt db 0 ;disk  * ;* Data Areas * ;* * ;********************************************* data_offset equ offset $ dseg org data_offset ;contiguous with f not a read it could be write mov cl,40h jmps init_dma ;is a read command, go set DMA write_maybe: cmp al,0ah jne dma_exit ;leave DMA alone if not read or write mov cl,80h ;we have write, not read init_dma: ;we have a read or write operatio * ;* The i8271 requires a read status command * ;* to reset a drive-not-ready after the * ;* drive becomes ready * ;* * ;***************** END error retry counter last_com dw 0 ;address of last command string dma_adr dw 0 ;dma offset stored here dma_seg dw 0 ;dma segment stored here sel_mask db 40h ;select mask, 40h or 80h ; Various command strings for i8271 io_com db 3 ;length rdcode segment IF loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db 'CP/M-86 Version 2.2',cr,lf,0 ;| | ;-------------------n, setup DMA controller ; (CL contains proper direction bit) mov al,04h out dmac_mode,al ;enable dmac mov al,00 out dmac_cont,al ;send first byte to control port mov al,cl out dmac_cont,al ;load direction register mov ax,dma_adr ou**************************** test_ready: mov dh, 40h ;proper mask if dr 1 test sel_mask,80h jnz nrdy2 mov dh, 04h ;mask for dr 0 status bit nrdy2: mov bx,offset rds_com call send_com dr_poll: in al,fdc_stat ;get status word test al_wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command ; System Memory Segment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIO-------------------------- ENDIF ;loader_bios IF not loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db ' System Generated - 11 Jan 81',cr,lf,0 ;| t dmac_adr,al ;send low byte of DMA mov al,ah out dmac_adr,al ;send high byte mov ax,dma_seg out fdc_segment,al ;send low byte of segment address mov al,ah out fdc_segment,al ;then high segment address dma_exit: mov cl,[BX] ;get count ,80h jnz dr_poll ;wait for not command busy in al,fdc_rslt ;get "special result" test al,dh ;look at bit for this drive ret ;return status of ready ;********************************************* ;* *        title 'Customized Basic I/O System' ;********************************************* ;* * ;* This Customized BIOS adapts CP/M-86 to * ;* the following hardware configuration * ;* Processor: hlt ;hardstop ;| | ;--------------------------------------------- ENDIF ;not loader_bios ;********************************************* ;* * ;* CP/M Character Ie mov cx,510 ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ; (additional CP/M-86 initialization) ;| |  jmp SECTRAN ;xlate logical->physical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O map byte (IOBYTE) ;**************************------------ ;| | bios_code equ 1200h ;start of LDBIOS ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS entry ;| | ;------------------------ * ;* Brand: * ;* Controller: * ;* * ;* * ;* Programmer: /O Interface Routines * ;* * ;********************************************* CONST: ;console status rs 10 ;(fill-in) ret CONIN: ;console input call CONST jz CONIN ;wait for RDA rs 10 ;(fill-in;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| | ;This is a BIOS for the LOADER push ds ;save data segment mov ******************* ;* * ;* INIT Entry Point, Differs for LDBIOS and * ;* BIOS, according to "Loader_Bios" value * ;* * ;******************************************--------------------- ENDIF ;loader_bios cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vector for Individual Routines * ;*  * ;* Revisions : * ;* * ;********************************************* true equ -1 false equ not true cr equ 0dh ;carriage return lf equ 0ah ;line feed ;**********) ret CONOUT: ;console output rs 10 ;(fill-in) ret ;then return data LISTOUT: ;list device output rs 10 ;(fill-in) ret LISTST: ;poll list status rs 10 ;(fill-in) ret PUNCH: ;write punch device rs 10 ;(fill-in) ret REAax,0 mov ds,ax ;point to segment zero ;BDOS interrupt offset mov bdos_offset,bdos_ofst mov bdos_segment,CS ;bdos interrupt segment ; (additional LOADER initialization) pop ds ;restore data segment ;| |*** INIT: ;print signon message and initialize hardware mov ax,cs ;we entered with a JMPF so use mov ss,ax ;CS: as the initial value of SS:, mov ds,ax ;DS:, mov es,ax ;and ES: ;use local stack during initialization mov sp,offset stkbase cl * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status jmp CONIN ;return console keyboard char jmp *********************************** ;* * ;* Loader_bios is true if assembling the * ;* LOADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. * ;* DER: rs 10 ;(fill-in) ret GETIOBF: mov al,IOBYTE ret SETIOBF: mov IOBYTE,cl ;set iobyte ret ;iobyte not implemented pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT  ;--------------------------------------------- ENDIF ;loader_bios mov bx,offset signon call pmsg ;print signon message mov cl,0 ;default to dr A: on coldstart jmp ccp ;jump to cold start entry of CCP WBOOT: jmp ccp+6 ;direct entry to CCP d ;set forward direction IF not loader_bios ;--------------------------------------------- ;| | ; This is a BIOS for the CPM.SYS file. ; Setup all interrupt vectors in low ; memory to address trap CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on cur sel drive jmp SELDSK ;select disk for ne * ;********************************************* loader_bios equ false bdos_int equ 224 ;reserved BDOS interrupt IF not loader_bios ;--------------------------------------------- ;| | ;print it inc BX jmps pmsg ;next character and loop ;********************************************* ;* * ;* Disk Input/Output Routines * ;* * ;****at command level IF not loader_bios ;--------------------------------------------- ;| | int_trap: cli ;block interrupts mov ax,cs mov ds,ax ;get our data segment mov bx,offset int_trp call pmsg push ds ;save the DS register mov IOBYTE,0 ;clear IOBYTE mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4 mov si,0 ;then propagatxt rd/write jmp SETTRK ;set track for next rd/write jmp SETSEC ;set sector for next rd/write jmp SETDMA ;set offset for user buff (DMA) jmp READ ;read a 128 byte sector jmp WRITE ;write a 128 byte sector jmp LISTST ;return list status bios_code equ 2500h ccp_offset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;---------------------------------      ***************************************** SELDSK: ;select disk given by register CL ndisks equ 2 ;number of disks (up to 16) mov disk,cl ;save disk number mov bx,0000h ;ready for error return cmp cl,ndisks ;n beyond max disks? jnb return ;retu---------------------- ENDIF ;not loader_bios int_trp db cr,lf db 'Interrupt Trap Halt' db cr,lf ; System Memory Segment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIOS dw tpa_len ;and extends to 08000 dw 2000h ;s address to the selected sector * ;* (return 00 if successful, 01 if perm err)* ;* * ;********************************************* READ: rs 50 ;fill-in ret WRITE: rs 50 ;(fill-in) ret ;**rn if so mov ch,0 ;double(n) mov bx,cx ;bx = n mov cl,4 ;ready for *16 shl bx,cl ;n = n * 16 mov cx,offset dpbase add bx,cx ;dpbase + n * 16 return: ret ;bx = .dph HOME: ;move selected disk to home position (Track 0) mov trk,0 ;set disk @THIS IS A HEADER*# w# w# wc ͭ!8 G͙(O#:#* ͣ((O (\(6(O 8.(&0@ #?##w^#U#ͭ!R(econd is 20000 - dw 2000h ;3FFFF (128k) include singles.lib ;read in disk definitions loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ (lastoff+0400h+15) / 16 tpa_len equ 0800h - tpa_seg ******************************************* ;* * ;* Data Areas * ;* * ;********************************************* data_offset equ offi/o to track zero rs 10 ;(fill-in) ret SETTRK: ;set track address given by CX mov trk,CX ret SETSEC: ;set sector number given by cx mov sect,CX ret SECTRAN: ;translate sector CX using table at [DX] mov bx,cx add bx,dx ;add sector tdb 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section * ;* * ;*************************set $ dseg org data_offset ;contiguous with code segment IOBYTE db 0 disk db 0 ;disk number trk dw 0 ;track number sect dw 0 ;sector number dma_adr dw 0 ;DMA offset from DS dma_seg dw 0 ;DMA Base Segment IF loader_bios ;-------------------o tran table address mov bl,[bx] ;get logical sector ret SETDMA: ;set DMA offset given by CX mov dma_adr,CX ret SETDMAB: ;set DMA segment given by CX mov dma_seg,CX ret ; GETSEGT: ;return address of physical memory table mov bx,offse******************** dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 END -------------------------- ;| | signon db cr,lf,cr,lf db 'CP/M-86 Version 1.0',cr,lf,0 ;| | ;--------------------------------------------- ENDIF ;loader_bios It seg_table ret ;********************************************* ;* * ;* All disk I/O parameters are setup: * ;* DISK is disk number (SELDSK) * ;* TRK is track number (SETTRKF not loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db 'System Generated 00/00/00' db cr,lf,0 ;| | ;-----------------------) * ;* SECT is sector number (SETSEC) * ;* DMA_ADR is the DMA offset (SETDMA) * ;* DMA_SEG is the DMA segment (SETDMAB)* ;* READ reads the selected sector to the DMA* ;* address, and WRITE writes the data from * ;* the DMA       cmp al,source ; see if same as source jne not_same ; no, go see if > max mov si,offset same_message ; can't have same drive call pmsg ; so we print message jmp another ; and go try again not_same: cmp al,drive_cnt ; is dest > mao, continue jmp exit ; yes, we should exit next_1: cmp al,drive_cnt ; see if valid drive code jb save_source ; yes, go save it drive_err: mov si,offset bad_drive ; else, print call pmsg ; a bad drive message jmp another ; and tx? jnb drive_err ; go print invalid drive error mov dest,al ; save destination drive add al,'A' ; make ascii drive code mov dest_ascii,al ; save for messages mov cl,dest ; get destination drive mov dl,0 ; force first time sery to get another save_source: mov source,al ; save it as the source drive add al,'A' ; make ascii drive code mov source_ascii,al ; save for messages mov cl,source ; get source drive mov dl,0 ; force first time selection call s title 'COPYDISK 1 Feb 82' ver equ 20 ; Version 2.0 -jrp ; COPYDISK duplicates entire diskettes using all of the ; available storage as a multiple track buffer. ; This program must be built with a large extra segment ; as follows: ; ASMlection call seldsk ; select destination drive test bx,bx ; insure drive exists jz drive_err ; no, go error out mov di,ES:word ptr 10[bx] ; point to destination DPB mov si,offset disk_def ; point to source drives def mov cx,15 ; leeldsk ; select it test bx,bx ; insure the drive exists jz drive_err ; no, fatal mov si,ES:word ptr 10[bx] ; get pointer to DPB ; create local copy of disk definition push ds ! push es ; save segments pop ds ! pop es ; and exchan86 COPYDISK ; GENCMD COPYDISK EXTRA[M0200,XFF00] ; This allows COPYDISK to utilize all the left-over memory in your ; system as its buffer. cseg ; code segment start: mov si,offset signon_message call pmsg ; print signon message nextngth of a definition cld ! rep cmpsb ; compare the definitions je next_2 ; must be equal. jmp different_type ; else go print error next_2: mov dx,es:word ptr 00[bx] ; get secttran table address mov cx,0 ; logical sector zero call sge them mov di,offset disk_def ; point to local disk def table mov cx,15 ; diskdef is 15 bytes long cld ! rep movsb ; copy it push ds ! push es ; swap back pop ds ! pop es ; segment registers mov dx,es:word ptr 00[bx] ; get se_copy: ; reload local stack for retries. pushf ; save interrupt flag in stack pop bx ; put it in bx cli ; disable interrupts mov ax,ds ; get our data segment mov ss,ax ; and use as stack segment mov sp,offset stack_end ; @GTHIS IS A HEADER*# w# w# wc ͭ!8 G͙(O#:#* ͣ((O (\(6(O 8.(&0 @G #?##w^#U#ͭ!R(ectran ; find out first sector number cmp bx,base_sector ; make sure its the same je next_3 ; the same is OK, jmp different_type ; no, fatal error next_3: ; determine track capacity mov ax,spt ; get the sectors per track mov dcttran table address mov cx,0 ; logical sector zero call sectran ; find out first sector number mov base_sector,bx ; save this for track reads mov si,offset dest_message ; prompt for destination call get_drive ; get the drive code  set stack pointer push bx ; flags back into stack popf ; restore interrupt status mov si,offset source_message ; prompt for source drive call get_drive ; request drive code cmp al, cr - 'A' ; see if it was a jne next_1 ; n      l,128 ; length of a sector mul dl ; get track capacity mov track_size,ax ; save it ; determine number of tracks on diskette mov al,blm ; get block mask inc al ; plus 1 gives sectors/block mov ah,0 ; make 16 bits mov dx,0get pointer to read/write inc si ; skip leading call pmsg ; print that mov ax,trk ; get track number call pdec ; print it mov si,offset sector_message ; print ", Sector " call pmsg mov ax,sector ; get sector number (0 org) ma address and segment mov ax,base_track ; get starting track number sub ax,trk ; gives relative track of pass mov dx,0 ; make dword mul spt ; compute sector of track add ax,sector ; add in current logical sector adc dx,0 ; makemsg mov cl,13 int BDOS mov cl,0 ; reboot mov dl,0 ; CP/M-86 int BDOS different_type: mov si,offset type_error_message call pmsg jmp aborting track_block: mov message_pointer,si ; save pointer to message mov disk_functio; yes, terminate loop sub ax,nts ; lower by number of tracks per buffer inc ax ; and adjust by 1. jns not_neg ; check to make sure its positive mov ax,0 ; no, zero is floor not_neg: mov btr,ax ; save as last track for this copy pa ; make 32 bits mul dsm ; total sectors/data area add ax,spt ; force round up dec ax ; by adding SPT-1 div spt ; compute number of tracks add ax,off ; add in operating sys tracks dec ax ; number of last track mov max_tra add ax,base_sector ; correct if 1 origin call pdec ; print the sector number mov si,offset continue_message ; see if user wants to ignore call get_yn ; ask for a Y/N response jnc next_5 ; yes, continue jmp aborting ; NO, go ask for double precision add mov cx,128 ; length of a sector mul cx ; gives base offset as 32 bits mov dma_offset,ax ; gives base dma offset mov cl,12 ! shl dx,cl ; move to high nibble add dx,extra_base ; offset extra segment mov dma_segmen,ax ; save pointer to read/write mov selected_disk,cl ; save drive select code mov dl,1 ; tell bios have selected before call seldsk ; select diskette drive mov ax,base_track ; get base track number for this pass mov trk,ax ; save ass mov si,offset reading_message ; point to read message mov ax,offset read ; and proper subroutine mov cl,source ; select source diskette call track_block mov si,offset writing_message ; point to write message mov ax,offset write ; ack,ax ; save value ; compute number of tracks that will ; fit in our data segment mov ax,extra_length ; get low 16 bits of DS length mov dl,extra_length_H ; get other 8 bits mov dh,0 ; zero rest of 32 bit divisor div track_size new disks next_5: call crlf no_disk_error: pop cx ; recover sector number inc cx ; sector = sector + 1 cmp cx,spt ; see if past last sector jae next_6 ; done, exit jmp next_sector ; else, continue next_6: dec trk ; track nt,dx ; save DMA segment mov cx,dx ; put in argument register call setdmab ; pass to CBIOS mov cx,dma_offset ; get the offset again call setdma ; and pass it to BIOS also mov ax,sector ; fetch current sector number inc ax ; s loop index next_track: ; first inner loop... mov ax,trk ; get the index cmp ax,btr ; see if less than last jnl next_4 ; no, continue jmp next_track_x ; yeah, exit loop next_4: mov si,message_pointer call pmsg ; print " Track " mov ax,trk ; get the track number call pdec ; print as decimal mov si,offset space_message ; then, print some call pmsg ; spaces to blank any garbage mov cx,trk ; get desired track address call settrk ; give to bios ; adjust base track by number we copied mov base_track,ax jmps next_block next_block_x: ; here, we are done with a sucessful copy mov si,offset done_message ; print message call pmsg ; announcing success another: mov si,offset anotg because of error mov si,offset abort_message call pmsg jmp another adequite_memory: mov si,offset ready_message ; insure this is correct call get_yn ; print request jc aborting ; if NO, then get new input mov si,offset copy_mesa segment call setdmab ; point dma base address call read ; read 128 byte record push ax ; save read error in stack mov si,offset verify_buffer ; point to sector we just read les di,dword ptr dma_offset ; get pointer to one we wrote nction ; read/write/verify a sector test al,al ; check error return code jz no_disk_error ; see if we got a bad sector ; got fatal disk error mov si,offset disk_error_message call pmsg ; print disk error mov si,message_pointer ;  mov cx,0 ; start with logical sector 0 next_sector: push cx ; save current sector number mov sector,cx ; save sector number (0 org) add cx,base_sector ; correct for first sector number call setsec ; pass to cbios ; compute dher_message call getyn ; see if we want another copy jc exit ; no, go exit next_copy_v: ; convienient for short jumps jmp next_copy ; back for another disk copy exit: ; here, we are exiting mov si,offset exit_message call psage ; else tell user OK. call pmsg mov ax,max_track ; get maximum track number mov base_track,ax ; save as outer loop index next_block: mov ax,base_track ; get loop index cmp ax,0 ; see if we are outside limits jl next_block_x      mov cx,128 ; 128 byte record cld ! rep cmpsb ; compare them mov al,0 ; no error je verify_good ; so we are ok mov al,0FFh ; else, we got compare error verify_good: pop dx ; recover read error byte or al,dl ; merge into retu cr,lf,'Illegal Diskette Drive',cr,lf,0 same_message db cr,lf,'Source and Destination cannot be the same' db cr,lf,0 type_error_message db cr,lf,'Source and Destination disks must be' db cr,lf,'the same type',cr,lf,0 continue_message db cr,lof the data segment rs 1 ; not used extra_length rw 1 ; low 16 bits extra length extra_length_H rb 1 ; high 8 bits '' '' extra_base rw 1 ; base of the extra segment org 005Ch default_FCB rs 35 ; default File Control Block org 00nout: ; output character in AL to console mov dl,al mov cl,6 int BDOS ret pdec: ; print unsigned 16 bits in AX as decimal ; with zero suppresion mov cx,0 ; cx is digit counter pdec_1: ; here to divide out next digit sub dxrint message and get Y or N push si ; save message pointer call pmsg ; print the message call get_upper ; get a upper case letter pop si ; recover message pointer cmp al,'Y' ; see if response was 'Y' je get_yn_x ; yes, return w/rn code ret ; back to caller ; *********************************** ; * ; * BIOS direct entry points ; * ; *********************************** home: mov al,8 jmps bios_call seldsk: mov al,9 jmps bios_call settrk: mov al,10 f,'Ignore error (Y/N) ? ',0 sector_message db ', Sector ',0 disk_error_message db cr,lf,'Permanent Error ',0 crlf_message db cr,lf,0 exit_message db cr,lf,'COPY program exiting',cr,lf,0 ; VARIABLES source rb 1 ; source drive select co80h default_buffer rs 128 ; default record buffer org 0100h ; start of user data segment ; MESSAGES signon_message db cr,lf,'CP/M-86 Full Disk COPY Utility' db cr,lf,' Version ' db ver/10+'0', '.', (ver mod 10)+'0',cr,lf,0 ,dx ; Zero DX mov bx,10 ; constant 10 div bx ; quotient to AX, remainder to DX add dl,'0' ; make remainder ascii digit push dx ; and stick onto stack inc cx ; bump digit counter test ax,ax ; see if any quotient left jnz pdec_1  no carry cmp al,'N' ; see if was 'N' jne get_yn ; no, invalid. reprompt stc ; set carry for a NO get_yn_x: ret get_char: ; read a line from CONIN and return first char mov cl,10 ; function for line in mov dx,offset line_buff jmps bios_call setsec: mov al,11 jmps bios_call setdma: mov al,12 jmps bios_call setdmab: mov al,17 jmps bios_call read: mov al,13 jmps bios_call write: mov al,14 jmps bios_call sectran: mov al,16 jmps bios_call de dest rb 1 ; destination drive select code selected_disk rb 1 ; current drive select code trk rw 1 ; current track number sector rw 1 ; current sector number (0 origin) nts rw 1 ; number of tracks per buffer full base_track rw 1 ; starting trac source_message db cr,lf,cr,lf,'Enter Source Disk Drive (A-D) ? ',0 dest_message db cr,lf,cr,lf,' Destination Disk Drive (A-D) ? ',0 ready_message db cr,lf,cr,lf,'Copying Disk ' source_ascii rb 1 db ': to Disk ' dest_ascii rb 1 db ':',cr,lf  ; yes, continue stacking digits pdec_2: pop ax ; get a digit from the stack push cx ; save count call conout ; print it pop cx ; restore count loop pdec_2 ; and continue if more in stack ret ; done. . . ; ** DATA SEGMENT ; point at buffer int BDOS ; read the line mov al,line_buff+1 ; get input length cmp al,1 ; insure single char entered jb get_char_1 ; no, go mov al,line_buff+2 ; get the character ret get_char_1: mov al,cr ; null string,  bios_call: mov bios_function,al mov bios_CX,cx mov bios_DX,DX mov cl,50 mov dx,offset bios_function int BDOS ret ; **************************************** ; * ; * Operator interaction subroutines ; * ; ***************************k number for this pass track_size rw 1 ; size of each track in bytes btr rw 1 ; last track number of this pass dma_offset rw 1 ; current buffer offset dma_segment rw 1 ; current buffer segment base message_pointer rw 1 ; points to appropriate read/wr db 'Is this what you want to do (Y/N) ? ',0 memory_message db cr,lf,'Insufficient memory available for copy',0 abort_message db cr,lf,cr,lf,'Copy aborted',cr,lf,0 done_message db cr,lf,'Copy completed.',0 another_message db cr,lf,cr,lf,'Copy  ** dseg cr equ 0dh ; ascii carriage return lf equ 0ah ; ascii line feed drive_cnt equ 16 ; CP/M currently supports up to 16 drives BDOS equ 224 ; system call interrupt number ; CP/M-86 Page Zero code_length rw 1 ; low 16 bits return a ret crlf: ; print a mov si,offset crlf_message ; fall into pmsg pmsg: ; print message at [SI] to zero lods al ; get a character test al,al ; see if zero terminator jz pmsg_x ; yes, exit push s************* get_drive: ; print message and read drive code call pmsg ; first, print the message call get_upper ; then get an upper case letter sub al,'A' ; and normalize to 0... ret get_upper: ; get upper case console input w/ eite message disk_function rw 1 ; points to '' '' '' subroutine base_sector rw 1 ; either 0 or 1 normally max_track rw 1 ; total number of tracks on disk line_buff db 80 db 0 rb 80 bios_function rb 1 ; bios function number bios_another disk (Y/N) ? ',0 copy_message db cr,lf,'Copy started',cr,lf,0 reading_message db cr,' Reading Track ',0 writing_message db cr,' Writing Track ',0 verify_message db cr,'Verifying Track ',0 space_message db ' ',0 bad_drive dbcode length code_length_H rb 1 ; high 8 bits '' '' code_base rw 1 ; base of the code segment model_8080 rb 1 ; 8080 memory model flag data_length rw 1 ; low 16 bits data length data_length_H rb 1 ; high 8 bits '' '' data_base rw 1 ; base i ; save pointer call conout ; not done, print character pop si ; recover pointer jmp pmsg ; and loop pmsg_x: ret conin: ; get character from console into AL mov cl,6 mov dl,0FFh int BDOS test al,al jz conin ret cocho call get_char ; get console character cmp al,'a' ; see if lower case jb get_upper_x ; below, leave cmp al,'z' ; insure not > z ja get_upper_x ; not lower at all sub al,'a'-'A' ; make upper get_upper_x: ret get_yn: ; p     cx rw 1 ; first argument for BIOS call bios_dx rw 1 ; second argument for BIOS call disk_def rs 0 ; disk definition table gets copied here spt rw 1 ; 128 byte sectors per track bsh rb 1 ; block shift factor blm rb 1 ; block mask exm rb 1 ; s#r!9^#V~#!9^#V$!!9^#V;! 9s#r!+H!!9~#fo++s#r##!9~#fo+!9^#V^#V! !9 !$!9Y*!9#s!9^#V^#VY*!9s!!9!9^#VQ +! 9^#V#!H! 9^#V#+!!*! 9^#V!ͫ %s*!! 9!9^_! 9^#Von!,on!"9^#Von?,EY6P**F3"D3!!9^#V!,)¯!!,!1͌)ʯÑ*B3|*D3!ͫ *** Error: EOF while processing line %d *!!9^#V1*.l~1{:v!:g.6 T! ! > 2 !~Y(y O: g.P  This disk will install into the System Control Area of your hard disk. Do you wish to proceed with theextent mask dsm rw 1 ; disk size in blocks drm rw 1 ; directory size al0 rb 1 ; alloc 0 al1 rb 1 ; alloc 1 cks rw 1 ; checksum size off rw 1 ; directory offset rw 128 stack_end rw 0 verify_buffer rs 128 ; sector buffer for verify fun %s*! !9^#V!9^#Vr*!9^#V! 9s#r!9^#V! 9s#r! 9~#v !,! 9s! 9^X !!9~#fo#s#r+s!9^#V^! 9~#fo+s#r#| !,!P!,! P!,!PÆ ! 9^#V!9~#fo+* !,!P!,! P!,!^!B2s*!!9^#V^!B2s*! 9^#V^!B2^!+W!9^#Voc!9^#Vo*Z!! 9*!! (!! (*!*<2ͨ"@2!"B3*@2r**F3#"F3*@2!P!1i!"B3*B3|V!1!9s#r installation (Y/N) ? : $ $ Error...Command tail is not 5 characters long. $ Error...Bios is not 2.249. Check ZCPR length. $syslib <12345vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvENDction db 0 ; force out data segment end P! !9~#fo+s#rs! 9~#fo#s#rs ! 9^!9~#fo#s#r+s! 9~#fo+s#rs ?, d d   - A !,!9s! +ʪ !9^! +ʪ !9^#V^*!9!9^#V!8 *! 9^#V".!9!9^#V! DM!*.s`i!9~#fo#s#r!9^#V^! +H!9^#V^!^+E!! 9^#Vs!! 9^#Vs*B3**@2!"B3*! 9^#VY*#!"%*,)H3s#rzʿ! 9^#V*,)H3^#V͹)*,#",!ͫ *** Internal error: out of memory *! !9^#V!*! 9^#V*.#".+s!Ͱ+&*!9N#F!9^#V!!9s#r!9^#V!9s#r#+^z%+!!9s!!9s#r! !9s#r!'!9s#rn&-+ !!9s#r#+^0+ !0!9s#r#+^*+" !9~#fo##9^#Vr*!|ʉ!,!9s!9^! +B!9^! +M! 9^#V^!9~#ʆ!9~#fo+s#r!9^ͼ*!9~#fo#s#r+s *! 9~#fo+s#r#|ʶ!,!PÐ^*!9^#V͘!P! 9 *!9s#r!9^#V:*!,!Pÿ*! ! !!!ͫ ! 9! 9^#V!,J!9^#V##^#V"<2[!ͫ !"ͫ ! 9^#V!,ʀ!9^#V!^#V">2Æ!,">2!!!B2r*͠¬*<2!3ͫ M!*,)H3s#r:2o&+!H3*>2!Install Utility -- version %d.%d%s#r++^#V!9s#r#+^l !!9s#r#+^!S.#^!Ͱ+l !9^#V! Y+!9s#r- .+ #+^!*+ʽ !9~#fo##s#r++^#V!9s#r#+^ !!9s#r #+^S.#^!Ͱ+ !9^#V! Y+!9^#Vͫ !9^#V*!P! 9 !X9s#r!X9^#V*y+O!!X9^#V*n+h!!,!P!^9^#Vͫ *! 9^#V͘*! 9^#V~#! 9~#fo##s#r++^#Vͫ Þz*!!!9r*!9^#V!9s#r!9~#fo##c%c Invoke INSTALL as follows - INSTALL FILENAME Unable to open file %s *:1o&!1!1!1!1o!1!1 !1!1!1'!1od?,cdbf}iqmrsw*B3|S     !9s#r !!9s#rl+@ #+^!!9s#rZ h+Z #+^7!!9s#rÕ ! !9s#rÕ !!9s#rÕ !!9s#r!9^#V!9!9^#V!9^#V!9!9s#r!9^#V!9~#fos#rV!9~#fo##s#r++^#V!9s#rY*!!!9^#V͎*!"("4|+"!!$ ^!9~#foͰ+!$ s{]"`i!~#fo#s#r!*!9N#F!9^#V+#|ʶ"`i^! +ʠ"! !(`i#DM+^!(x"!9^#V*!9N#F!9^#V+#|"`i#DM+^!9^#V("!!9^#V!s#r!9^#V!Ͱ+&#u)!*! 9N#Fͼ#!(!!% s!*! 9^#V)))-DM!9^#V!9^#V! ^#V`i^)A.^#V**!DM!9^#Vn&&\)$~n$&!6,DM!9~#fou,!9^#VBK!9^#V!͝"!;+h!!͹)!)!!)!! (! ÷`i*/#"/+).s#r`i#DM~ʷ`i^! +¥`i^! +ʴ!`i#DM+s÷3!.*/!Can't open file for redirection: $**-s!! ^#V`is#r! s#r`i~#fo#s#r+^!Ͱ+*!,!9^#VP*! 9N#F!9^#V`i +ʊ! ͓+ʊ!͓*!9N#F! ^#V`i^#Vf,! 9^#V!Ͱ+͐! 9^#V`i~#fo#s#r+s!Ͱ+*!,DM`ic-t,9s#rn!9~#fo##s#r++^#V!9!9s#rsV?,cd o` s un x| !!9!9~#fo6,!9s#r!9^#V!9~#fo,ʑ!9^#V!9s#r!9~#í!9~#fo#s#r!9~#fo+s#r#!9~#fo,!9^#V`i*+!Þ!!9s#r!9~#9^#V*! 9N#F!#(`i!~#6#!!$ s!`i!~#fo+s#r#S#!!u,ʆ#+^!+ʃ##Æ#Y#!$ s!+ʸ#`i!~#fo#s#r!!$ s!*!"1*! 9N#F*1PY+#!! ^#V*1+^$!!(!u)!!9^#V`i6,͛+! 9s#rzo! 9^#V!9^#V`i|$!9s#rzou)! 9^#V!9~#fo6,͋+PY! 9^#V!͋+PYDM`i!9~#fot,ʻ!9^#V`i6,!9^#V`iʻu)`iu)!9^#V*! 9N#F#!!9^#V!9^#V!$ ^!͎**!DM`i , `i#DM+#! 9~#C!(Ͱ+C!G$A:$$$.SUB*!"4!*!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:*!9^#V!!9^#V;*!-!! 9s#r! 9~#fo#s#r! 9^#V! ,`i DM*! 9N#F!`i~ʃ! ^!Ͱ+R!͐! ^#+! ^!Ͱ+ʃ! ^#V%!! s*! 9N#F!"-! ^!Ͱ+ʷ!! ^!Ͱ+#! ^#V`i^#V6,! ^#V! ^Q +#!fo#s#r!9^#V~U!9^#V!9~#fo,U!9~#fo#s#r+^`i*+R!!9^#V!9~#fos#r!9~#Ç!9~#fo#s#r!9~#fo+s#r#!9~#fo,! `i*+ʾ!x`i*+!!9~#fo#s#rP !9^#V!",",! !("4+ $*4+B$!"4!!!r*!"1!*4|N$!`i"1!! ^#V"1!*! 9^#V)))-^(+!É$(+"*.!".*.$*.!4´$#4*.+".}Š$$$o&"4*.*!9!69^#V/(DM\)!9!!$ ^!9~#foͰ+!$ s{4`i!~#fo#s#r!*:0¨!}20!}20}20!0! (! !(:0o&+ʋ!}20!:I.o:0o#}20&0#s!"1:0o&DM!9~#fo,!9^#VBK!9^#V*10͎*`i*1"1`i:0o6,}20`infQ+!"4!!-DM-`iDM`i~#N!9^#V`i^#V́)N%! ^#V!9^#V!Ͱ+#!9s#r!9^#V!Ͱ+ʓnu}“!"4!!9^#V!Ͱ+ʸnu}¸!"4!! ^#Vsrnunu!aut!9^#V!9^#V!9^#Vnf*!`in+s!`is#r! s#r!!9^#V!+Z!`inͰ+s!`is#r! s#r!`i~#kG! ^#V!+ʤ!!9! ^Q +!9^#V! ^#V`is#r! ^#V! ^#V! s#r!`in+s!9^#V`i~#fo#s#r+s!Ͱ+9~2,G+V+^+6",+N+V+^!,w#yL/w#@M!,>^)|ag,Ys+=TZ!~*,+",w!,M#ƒ*,+6-0123456789ABCDEF*DM|¼!!9^#V!9^#V*!9^#V!,DM`iDMx!"(DMu)`i+%!"4!!*! 9^#V!9~#foY+DM̓&|]%!!9^#Vr**!9N#F! ^#V+))!9s#r%!9^#V̓&|%PY+%!9^#V!9~#fou,%!9^#V%!9^#V͎**! 9^#V!##~#%!!*!9N#F! #!9~#fo,M ! 9^#V(`i#DM+s!+M  *! 9^#V)))-DM!9^#V!9^#V! ^#V! ^)J.^#V**!DM!9^#Vn&&\)$~!n$&!6,DM!9~#fou, !9^#VBK!9^#V!! 9!,!Qut!! 9^#V*! 9^#V!,I! 9^#V! ,S!"4!! 9^#V)))-DM! ^#V! ^#V*! 9s#r!! s! s! s`is!Q! s#r! 9^#V*!/DM`i'DM`i0t,`i%~ø!"4!!9^#V/(!9s#r!+*!,DM`i~-`i DMc-f,*! !`is#r! s#r! s#r`i*!9N#F! ^b$}!! s#r`i! s#r!̓&!9s#rzc!! s#r!`in+s!9^#V! s#r!.:s# y*"4*k-"4m-*!!$4!!9^#V́)! ^#V!9^#V;+>!!9^#V!s!!9^#V!s!9^#V*! 9^#V!9~#fo+s#r!,!9^#VDM+`i#+s`i +y!u`i+! 9~#fo+!! 9^#V*! 9N#F1DM&! ^#VBK`iu,.&! ^#Vu,b&! ^#V`if,_&PYu,b&! ^#Vt,b&&! ^#Vsr! s#r`i"1!*!9^#V###͛+#!9s#r*1|µ&!1"1"1!1*1DM&`i! ^#VBK! ^#V`i+-'! ^#V`i^#V))PY+-'! u)!!9^#V`i6,͛+! 9s#rz{!! 9^#V!9^#V`ḯ$!9s#rz{!u)! 9^#V!9~#fo6,͋+PYDM|x!!`i! 9^#V!͋+PYDM`i!9~#fot,!!9^#V`i6,!9^#V`i!!u)`iu)!9^#V*! 9N#F#,!!!9^#V!$ ^ !"4!!9^#V!+(M)!9s#r!9^#V\)!9^#V!Ͱ+N!(!(+ʔ!9^#V!Ͱ+ʄ!(+ʑ!"4u)!÷!9^#V!Ͱ++ʷ!"4u)!!!! s#r!# s!$ s!9^#V!& s`i!9^#V!s#r!9^#V!Ͱ+#!% s!-/!͎*!:o&Ͱ+$/s!".!$/DM!"/*/,ʺ`i^! +\`i^! +d`i#DM@`i~ʺ`i^!>+ʂ!Ö`i^!<+k!`i#DM^! +µ`i^! +ʸÖ`i`i#DM~`i^! +`i^! +!`i#DM+sý#|^+Z!Ͱ+G`i~#fo+s#r!`in+s!?,D D Z*! 9N#F! ^#V`i^#Vf,! ^!Ͱ+ʓ!!`inͰ+s`i~#·G! ^#V! ^#V! ^T+|!!`in+     ^#V^#V`i~#fos#r! ^#V##^#V! s#r&`i^#V!9~#fof,'`i^#V!9~#fo+c'! ^#Vsrñ'!9^#V))PY"1*1ut! ^#V*1##s#r`i^#V!9~#fo6,*1s#r!9^#V`is#r"1!! s#r`i`i1+(!)DM+'!!`is#r!! s#r`4???????????aaaQQQQQQQQaaaaki%!1DM&(+((+*.DM*.og!9N#F#^#V F( J(;(kb6#> 6 #=Q(>6#=Z( ){(0_zWe(/…(È( : >³( A([Ҥ(@ð(a({(`w# .((ʶ((w#÷({o|g ((w#(&jz!|*( >?a-p-u-z--------Q8 Q "" 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@ @@@@ { 0:)7!9^#V*k-7)*4}|7)*k-"k-|!=!9}_|#W"4(+ o&(+ 2R.:. _(+ :R._!9Õ)!9F+N+V+^+~+ngxʳ)³)ʳ)# Þ)og!9V+^+~+ngw)#)|!9F+N+V+^+~+ngx)w)# )|!9*!9F+N+V+^+~+ng対#*#*x4*w4*# #*w|!9^#V#n~V*Q*#D*!|!9~#fon*#e*}!9^#V#N#F#nxʌ*s# Á*! 9F+N+V+^+~+ngҸ*®*}Ҹ*ʺ* +!9~a*{* o&!9~A*[* o&DM!99`i*|DM!99!+`i~# x+!97+.~#>+!K+V+|DM!>))i+ =a+}{_ʘ+|+|7g}o~+{_ʘ+)“+}{_ʘ+|g}o£+|g}o|/g}/o|g}o|g}o|++}+|+!}+|+!}| ,}|?>o&zo&|$,}|>o&|o&}/o|/g#}}o|gBK^#Vz_,#yY,###G,#xT,#~#fo}|>?o&}|>o&l install.txt$$$.sub99rr+ww+a a+ xx+      ̀8Ò22!V!zt~ <#AiHi _ A2Y Ò Y"*NFC*~2Fnf"#>)2+"#|!5:4 N`: *"~*!6#: !6#!6þ !6>!hJ*& 6 a*& :wqO͎2!4,!6!6!6: !!6+6>!/#*& *& *& !6!4Í:!6!4w:!6::]6fn^!6>! *&) >\ʻ *&) >+s#r*&) ^#V! *&  q#p *&  >\» *&) ^#V! *&  q#p!4 !"*"!"͉2: : û !6͆ 2͆ ͆ _|O*}O!p+q* !p+qͭ*DM!p+q*DM*DMͱ1!p+q*!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*"*$"*'"*-"*"* "@: X:?2:2K}K̀̓I[S*R°: ˜*|˜*)"*#"S.!5>X#*^#VzKCK͉"!># # >: Hͳ:A8B *&  q#p:MuB *&  q#p:< *& Hq:X›B *&  q#p:BB))))*&  q#p=ͱi`N#Fog_og_{ozgDM!>))H*"͆ 2 û :+ !68 :8 !6>!~օH{ !6:ւ!x *&) +s#r!4P ͕ :DH:HҸ D* +s#r͕  M*DM\: !q: ҝ> :aү:_2:qO͎2: qO͎2ý!q:0O> :0:AO>>:A ! ͌~.#  7 C7E0OÌ!@w#:_:O͆|r" gÒ :O͆DISKCHK version 1.4b $checksumming on drive $ $Error---invalid drive chosen $checksummo|g  =DM!>))! =_{ozg^#V) 4_{ozgi`N#Fogo&og_{_z#WCODE DATA EXTRASTACKX1 X2 X3 X4 8080 NZERONHEAD^\ W!q*v T8 ͱ**:w*v !_:/Ht **6*#"E *DM*DM D *}´ **N*#" ͝Ú ͭͱͭ*DM:͝ ͝*DM^\ !s+q*&4:&!6>!?*& :8>!4>!"q2څ*M2j=|*))))*& "q2N**#"=ڢ* ~!"!_ *"Ҩ f2* DM:1* 61ͺ0102821100654321 COPYRIGHT (C) 1981, DIGITAL RESEARCH [], ERROR: $, LOAD ADDRESS $DISK WRITE$DISK READ$INSUFFICIENT MEMORY TO CREATE CMD FILE $ing on currently logged in drive $ Disk suitable for use. $ BAD DISK---DO NOT USE. CheckSum is: $Error--Selected disk does not exist $DONE $Error---Disk too full to contain checksum $W!4!v"**v =4 *" :? **v #*="͉O2m :*u Z Z Hw 2!w::>!H ͆ ͆ _H))))" :=2 ͆ O *#" D *+"w ! !"÷!":!"""}2!62|:8!|6!6!"}2>!g*&) >w#6!4GE !"!"͉2:ʏ:Œãv!6͆ 2+s#r͆ ͆ _H* "">Q*"͆ 2O>:օH: ͕ à:LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $BYTES READ $RECORDS WRITTEN $H86CANNOT OPEN SOURCE$CMDNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$!9"!v!"!v"!6#6!6!"\!fmofBAD DISK---DO NOT USE. CheckSum is: $Error--Selected disk does not exist $DONE $Error---Disk too full to contain checksum $<u !6: !6+ :+ !6:ցO! :+"_ڑ >Q` !":ցO! *s#r:ր:ցo&  Hq!" ~2ͳ* ~2 ʽ *#"ã ͳ: ' =: :]: H =#:͕ !6à:DHD/H:HXD+s#r͕ !6:D/HҠ!6:*=+"TҠ*"!6v *+"*!">Q*!"*":þ E !6!r6!n:q1e\ͳ\\n:?1\͒ ; \́:\1ͭͱ:222222222222222222!q*& ͝ ͝!q> !:A O͝:0O͝!q:O͸:O͸!p+q*     `W뙠45764]U4XwXƇXum?$u2X>Xw&Xƻm,AY<s ƇXuӀ>e u e򤸀P\P >u P$P Pw897|XX<wƇ: ]UF1v uFFFF]Uv6 P@ v6 v@ ]U;P ? vk :P 0 v  ]UC ;P  P - P P P P s:PO P P <wiÊsW QP^ s:C>u3>u#> u>@u%>u >v>t;wZ>uUuvHs_㋇)sP Ρ ,>u%% u@P;w@Y syyXَэ&P +ɋUVN]0102821100654321 ƇB XuƇ:$ P]]U>H u GNHoDPw]U8r38EPvV4*^ZZt P ?P]U~tv]U4:5r9s]Ê44]U^]s]\>\uZ>[ t>[u[4P P6C Pz P61 s:P[ P6  PM u P  P) C P/ 3 P : P +> P F P P[ Ps ]Us  P ]U>wƇu9r84  o P>\ tnw PMs|8s]Xs]À>uxsP s.x;P IP6@P62MP"P8P<PXP\PvPzP]À> s P ]á+@r3 s!;P6 PR6PD AU~ v FA, FF0vc ]UFPF$P]UFPFP]UF0P! ]UFd1PF 11RF 1R]Us v ,P :^w-ȴÊ_< s#P 6>6 uʰ:P 6\ds\&s\>['u \[\9s P런r>[t2[^_È^v>\u]]ø P^[ [>\u>[$ts]뗀>\t >[$u[>s݀>[Ot>[Qu >[Hu>t[$>Bu X.  P P|+ Pp Pd 8 >\ t P+g]U1]UPFP]U P P]U Pv]Uv]UPv]UPv]UPv]U&;P >t 6P:P l PQ >t&&PP6P6 Ps>v @A&60 PAPA P6Q P6a Py>us 6r PY>\u,Pt 6)HPg 9sP ]U\:Fu]UƋ^u \:u۰]U>\ t@ 9]Usx]UsP$P]]U>u>\u>t>v&PS #.PD5P ^>Du^ :^wvȴÊ_t+袀sr@s\u>\u P\].>\u%>['u [<'t]À>[ u ! PZ]]Q]U[,0< vPv]UPv~]UPvn]UPv[]UPvK]U@v[]U9s]á@=vD>s0P\P_tƇЁ]US<u9S]UTTȢTvs 6 PHP PhHP P\P PbP PW1P P26 P'! P6 % P sP ) P < P s$P9P{:vWQP"s:Pr[PPZP:_P2QP)?PoP6|PPPPPPPPPtS]U츺Pk ]U> wƇu\@]U[APv@Y ]U[,A<v@]UPY ]U[\]]UPP8]U\. >ltlPYP>u2 P6]U졆H5t#V58VwVVu7]U45W<u:PAW< t@P>Wt@Y sI>W u P2>W u PI4uW< r<t,a<s&W_6W!661H9wl1 tj >tB >sg V PU ;r)u@s L P6 P P 1PX1 t6 T P k P6n o P 1P s P,uP> t@Y rP}LJ,Ps P 5>\ t@P>\,t@Y ss>\t P };r;vQ>usP~ Ƈ~>u ;vȀ>u +9w>uU>u     Mu]U~ u~ u $~ r>rsF]Ut PBPX>u] P]U P| Pv]U Pk]U,P`]UF0PR]U;PE]UF t[F 1 1>t@"F Disk Parameter Blocks$dpe$xlt$Translate Table$Scratch Area$dirbuf,$dpb$Dir Buff, Parm Block$csv$alv$Check, Alloc Vectors$range $equ$ diskparm$delimit$missing$numeric$duplic $Alloc $no disk$Disk $ is the same as Disk $dpb$Equivalent Parameters$als$Sament, Command Form is: GENDEF x $ Where x.DEF Holds Disk Definitions With Optional Parameters : C: Create Diskdef Comment O: Generate Offset-Relative Labels Z: Z80, 8080, or 8085 (else 8086, 8088) x.LIB is Created Upon Com @?End-File$offset $bad val$dpbase$equ$Base of Disk Parameter Blocks$dpe$xlt$Translate Table$Scratch Area$dirbuf,$dpb$Dir Buff, Parm Block$csv$alv$Check, Alloc Vectors$range $equ$ diskparm$delimit$missing$numeric$duplicPw@Y"FsFs P6F 1F]U~ v F, AFF0v]UFPF$P]UFPFP]UvhPs]UFPPPdP]UvPP'P]UvPP'P]U7sE6s] Allocation Vector Size$css$Same Checksum Vector Size$xlt$Same Translate Table$too few$Disk $ is CP/M 1.4 Double Density Compatible$65536$128 Byte Record Capacity$Kilobyte Drive Capacity$32 Byte Directory Entries$Checked Directory Entries$Records / Extentpletion. $Premature End-of-File$Length $Convert$Quote $ LIBno ".LIB" directory space$".LIB" disk full$cannot close ".LIB"$dw$db$ DISKSENDEFMACLIBDISKDEF $Alloc $no disk$Disk $ is the same as Disk $dpb$Equivalent Parameters$als$Same Allocation Vector Size$css$Same Checksum Vector Size$xlt$Same Translate Table$too few$Disk $ is CP/M 1.4 Double Density Compatible$65536$128 Byte Record Capacity$Kilobyte Driv6>5u]ð;P:5sȴW]U^?$t 7F]UvFPPPdPg]U)v]Uv]U> s;Pnv]Uq P]Ut P]Uv]Uv]Uvv]$Records / Block$Sectors / Track$Reserved Tracks$Sector Skew Factor$dpb$equ$Disk Parameter Block$Sectors Per Track$Block Shift$Block Mask$Extnt Mask$1.4 Compatible$Disk Size - 1$Directory Max$Alloc0$Alloc1$Check Size$Offset$xlt$equ$No Translate Table$Trane Capacity$32 Byte Directory Entries$Checked Directory Entries$Records / Extent$Records / Block$Sectors / Track$Reserved Tracks$Sector Skew Factor$dpb$equ$Disk Parameter Block$Sectors Per Track$Block Shift$Block Mask$Extnt Mask$1.4 Compatible$Disk Size - Error(s)$Uvv]U>\t>\u]À>\u>_;u >_ t_\]À>^v]Ê^㋇x Ê^ \>t[^w@˷_֋P:t@Y"sʈǂ>u]\^\]U[:Ft@s[]slate Table$als$equ$Allocation Vector Size$css$equ$Check Vector Size$ds$rs$Uninitialized Scratch Memory Follows:$begdat$equ$Start of Scratch Area$dirbuf$Directory Buffer$alv$als$Alloc Vector$csv$css$Check Vector$enddat$equ$End of Scratch Area$datsiz$equ$-b 1$Directory Max$Alloc0$Alloc1$Check Size$Offset$xlt$equ$No Translate Table$Translate Table$als$equ$Allocation Vector Size$css$equ$Check Vector Size$ds$rs$Uninitialized Scratch Memory Follows:$begdat$equ$Start of Scratch Area$dirbuf$Directory Buffer$alv$alegdat$Size of Scratch Area$Marks End of Module$program$No Stmt$ maclib$ macpar$ disks$ diskdef$extra $!!q> !!҈:!A 2!Ð:!02!*!MU!!q:!On:!On!!p+q*!|O͘*!}O͘!!q:!0OU!!q*!&!dͷ K*!&! ͷ ! ͷ M1!͒0102821100654321@ ? @End-File$offset $bad val$dpbase$equ$Base ofs$Alloc Vector$csv$css$Check Vector$enddat$equ$End of Scratch Area$datsiz$equ$-begdat$Size of Scratch Area$Marks End of Module$program$No Stmt$ maclib$ macpar$ disks$ diskdef$extra $ DISKDEF Table Generator, Vers 1.0 $DEF No Input File Prese@      *!&! ͷ M!!p+q:@$ң*!DM̀,U!!6:&!!p:!=O!& ~2! b#U*!M͘i*!MU!!45:U*&M:&–,U*&DMͳHU:&ң̀!!q!!:&¸ͭ>>!!p+q!!6:!<2!O*! ~2!>!!:&>:& !&2&!&6$̀V:& (!&6N#6o&̀!&p+q:&=!&6&͹*&DM̀!&:&2&:&=2&O>s U]?U!&q:&ʌ*&M͹!&:&ڧV:&Ҥ>Í*&&`& ~2':&<2&:'!'6!&6+~!&6!&6:&K:& :&H͍2 $DEF No Input File Present, Command Form is: GENDEF x $ Where x.DEF Holds Disk Definitions With Optional Parameters : C: Create Diskdef Comment O: Generate Offset-Relative Labels Z: Z80, 8080, or 8085 (else 8086, 8088!&6ͭ͞/:& ʋ7ͻ,</Ë*!M!u ^#VͭDͭM}ͭV}]2 }ͭ}<Q`l:& ʋf/c$ LIBno ".LIB" directory space$".LIB" disk full$cannot close ".LIB"$dw$db$.!͈ :͹OD!"!>!!7!= *!M!! +s#r*!*! DM͕*!DM͕*!DM͕:!u !"!à !!:!Ҋ ! "!Ð !@"!*!#M!! +s#r*!DM͕*!#M> O͕*!DM͕*!DM!͕>!,! !!6:! *!DM2͕i*!E ͭ:G$$͹>!!0!!6H:&C*&!!sH!!6:!>!!He/ͭA:<$ҁ Æ$͹S!!6:!!!* :!=_ :G$Ҳ:͹x:!=_ UHSxHUH/Sx<:!=_D HS&;L!&6;-#!&6;:&'6!&6+6;!&6:&H':&ʆ*&&& :&w <`iwO>҆:&{!&6=/!&6:&2'͍2&:&¶:&$ª!&6óX/ҳ):&:&$!&69/:&O:&QH!'6:&H!) x.LIB is Created Upon Completion. $Premature End-of-File$Length $Convert$Quote $!H$q*H$& U U!J$p+q*I$ !L$p+qe*K$DMp!O$p+q*N$2M$!Q$p+q*P$2M$!S$p+q*R$!U$p+q*T$!W$p+q*V$!Y$p+q*X$2M$![$p+\ -.! -:l(:l2!!͸!:M$B!!6!"$}2!!&6!$!+!$s{l!"$!$6:$!$ڲ*$" DM !ʞ*$"$:$<2$w!"$!$q:$ !!6:$ :!2!:$ :!<2!$$!W*$" IA MS*!DMbͧ*! Nt*! N*!!!s!!:!R!!5:!l*!& Nv*!M*!+DMͧ*!+DMͧ*!|O*!}O*!!ͷ BKͧ*!DMͧ*! A:!\S S!"!"!*!DM*!x:!=_] U:!=_a eS!!4‘z/!!6> !!R *!&! 6!!47 !!6!&6,:! H *!&!) >w#6,ͤڗ / :& :&,H*!&! w *!& ~ / :& / *!&) &!!*!&) +'6>!'!&6G:'B+:&=2&!'6G:'DB:&=2&!'6 G!'6 !"&!'6:&!':'=O!& ~2'A}:'A 2'Å:'02':'2'O:'ژ!&6*&"'*'&"&:'*')"':'2'*'*&"&!&6æ:'<2'R:&E/!&6):&q*Z$!]$p+q*\$!&p+qe*&DM̀:&:>*^&#"^&!N͠!"^&^&$!Җ*^&^$ DM \ʉ*^&^$ 6!"^&Ó*^&"^&T!"^&͠*^&^$ ~2&µ!&6:&!&p+q!&6:&=2&*&&*&~2& !&60:&<*&&*&wO>9 * :$w*$#"$!!6*$},:!<2!͹W!ͥ:M$C ͹ ͹ ͹,͹!$q:$0O͹;͹D! $r+s+q+q+p+q> $,!*$* $ͷ ! ͷ ! $s~!$>! $7!H2$: $/ ͹* $M[* $! ͷ " $Ä! $q> ! $: $ A0*!ͷ "!*!"!!"!*!+!!:!*!!ͷ >!DUg>!!7!RD!$!dgx*!*!DMr*!*!"!!!:!ڗ!!!+s#r*!+"!>!·*!#"!"!*!"!*!"!D*!  A*!!ͷ "!*!͹ >!*!#"!*!D!!H + :!6 *&! ~* /*&! 6 :!!&!/HW + :!!!!!&:!H~ + :! &$!œ !"& &$!² !"& &$! !"&  &$! !"& @&$! !"& + :!(:&'͍2&':& %M/)K:&0O> /-:&AO>/H:&AO>/-LH!"&}2&2&!&6DISKSENDEFMACLIBDISKDEFvwxyz{Ϳ:&:&H:&:&;:& Ϳ:&2&>!&*&&&&*&60!&6:&P&̀>!&P!&6:&=!&P*&&`& NU!&41!&6!&6#602&&͹:& :&H:& š :& ½ :&<ʺ ç:& :&:&a:&_2&*&M02&r:&<2&!&6+6!2 $: $02 $* $M͹!$q:$O:$O!$p+q*$|O*$}O!$p+q*$DM1h͹!$q*$&dr!$p+q*$'r!$p+q*$'r:&:&ҭ!&6:&»;͹O!$6:$<2$!&:$=O!`& N͹D!$p+q*$~$ *$NMrS*!+ /A*!!ͷ BKr3S!!r+s+p+q*!*!ͷ "!>!T*!*!"!*!"!:!!r+s+p+q*!DM*! A*!DM*! *!DMS!!r+s+p+q;͹O*!DM͈:͹O*!DMDi;͹OKDiqxA |S:G$:͹> !&:!>!,!H& + ; *!) &!; + :!´ >&ͪ >!] + ñ !"!*&"!*!+|ڱ *!) !!!+s#r*!}ҝ /!"!î !!! "!i :!>&ͪ >!!&!HH + *!&!) *&s#rͭ:&) ^#V" '~2 '*&& ~2&>! 'z ! '5:&#w>! '~=O!& * '&* ' H\ ! '5, : 'e !&4:& '͝ +s#r !&6!'q!':&#wҙ !&6: '_og_ogDM!>))덑o|g =¾ DM!>)) = _{ozg~ ^#V)&6!&q:&!&D*&&.$ 6!&4):m$€!&6>!&ڀ*&&m ~A2&y*&&.$ 6!&4Q:e ˜.e - \͒:M$̀$U>p!&6#6!&6!|6!"^&!&6>!&*&&& 6 *&&& 6 :&<*$#"$!$s+p+q*$DM*$&dr!$p+qO*$DM!!$p+q* $DM/O!#$p+q:! gOY;͹*"$DMDAA!%$p+qx*$$DMr!&$q*&$M\!*$r+s+p+q*'$DM͆*)$DMS!-$r+s+q*+$M͘*,$DMS DISKDEF Table Generator, Vers 1.0ͽ\S!!6>!!ڄ*!&! ~}*! :G$A:͹ͽ*! S*! :G$j:͹ͽ*! S!!4A SA S:G$EAHA!!6>!!*!&! 6!!4!!6:&ڑ !!4\  :!‡ *!! ~- /:0$_ i;͹O*!M\*!M\Diddd:6dÖ :! Җ O/!!!#"!:0$ i:! ;͹OW*!M\]D*!#M> _*! "!;͹O>!!7! *!DM      ^#V|g}o !_{ozgi`N#Fogo&og_{_z#WRETURN to continue --> ͐Z!! WH!!W!!W͐Z!9^#V!;!! 9DM! 9^cZ!9s`i7_O!9^!Y7_ʭ!9^!N7_O!9^!Y(_%s (Y/N)? --> ͐Z!I Is this correct ͐Z!#9^#V!c_VERIFY Verify that the Control Area is complete P - PRODUCT Product Table Add/Modify Q - QUIT Leave this program. Enter your choice --> ͐Z*_DM`i~ !!9^#V[Y `iDMû `i~ !`i͐Z*_DM`iappears corruptedfile is not an overlaycannot find it on the disk.͐Z!\;!H Exiting program normally ͐Z!;!H Leaving program due to error͐Z!G!9s#r!9^#V~!;!P;x!9^#V^!7_!;!!#9^#V!M;!!DM#`i#DM`ib_!'`A!9s! 7_!9^þ!9^`i! 9sxx!!|;xʏ!!;`i+DM`i+DMxʶ!!!;`i+DM×`i+DM͏_xfS`i(_!'`A!9s! 7_!~. !!9^#V`i[Y. `i`DM `i~= !`i͐Z!*_DM`i^z| 7_| `iDM#Q ͐Z!*_DM! ^zʾ 7_ʾ `i`DM#Ñ ͐Z! !9s#r!9^#VZ!9^#V!! 9^#V[Y !;!;!+;!e;} This program will not work on a running Master. You can run SYSLIB if you boot from a floppy. You are running this program on a network station. SYSLIB will read and write the tables from the LOCAL hard disk attached to #PYb_J!#9~#fob_J!9^!#9~#fo#s#r+s`i *BUG* call to dgets wants too many chars (%d)%c %c%c %c͐Z!"_"_!!!9Z!9^#V! 9!9s#rz!"_ [!9^#V!9~#fob_!9^#V!9~#foc_!THIS IS A HEADERy͐Z!!! 9s#r!x! 9s!! 9s!9! 9s#r! 9c !9^!9s!9^!b_t !!DMÆ !9n+s!9~ʜ !PYͩ^DM| `i_´ `i_ʺ !| ! ;! ;!T ;x`i Error - the size of your Con this station. If you intended to work on the SHARED hard disk attached to the Master, you should abort this program now.͐Z!!DM`i!;! ;x!;x!8;x͏_SYSLIB7 Sorry, you need that overlayèFImpossible ProductZSBC-3 ComputersDSC-4DMS-1280DMS-3/C "Killer Bee"DMS-86 and DMS-5086DMS-5016DMS-816PC AdapterDMS-16BDMS-808Apricot AdapterHex Adapter͐Z! !1!2!;!9ͮ~N'!;E "-!_c !_c !_c IDM!"_ [! 9^!(_.!"_ [! 98͐Z! 9 [&[!DM!"_!9^#V~`i#DM+b_! 9 [Q[[t]&[!9~#fo#s#r+^!9s#r!9^#V!(_!"_ [! 9! 9^#V)^Q[[[&[Y! 9[͐Ztrol Area is listed as %dk. SYSLIB only understands sizes of 256k or 512k for the Control Area. ͐Zʹ:G_ʇ ! 9^#V##^Ö ! 9^#V##^#DM! 9^#V###^!9^#V!^#V!9^#V^#V!%! 9͐Zʹ:G_ ! 9^#V##^ ! 9^#V## in order to run SYSLIB. Not a Separated Boot System Access Denied. ͐Z!;!;!;!;;!;!;!;!;!7 ;!9 ;!i ;!k ;! ;! ;!! 97_O!9^cZ SYSLIB MAIN MENU A - fE!A!Í!M!Í!!Í!!Í!!Í!!Í͏_AE&LVMPFQV6 SYSLIB -- version %c.%c%c Hard disk not operational.SYSLIB1SYSLIB1SYSLIB2SYSLIB4SYSLIB3SYSLIB6͐! 9^cZ! 9s! 9^!0G_>! 9^!9H_>! 9^!! 9^!AG_j! 9^!FH_j! 9^!!͐Zê!9~#fo+s#r#! 9~#fo#s#r+!9~#fo#s#r+!9^#V!c_!9^#V^!9^#V^7_!9^#V^!9^#V^͆_w!͐^#DM! 9^#V###^!9^#V!^#V!9^#V^#V!%! 9͐Z!9^#V!Q^!^!9^#V!<^!9~#fo^_͐Z! ;!! 9ʯ !9^!(_ʯ E Hit RETURN to continue, to abort: ͐Z! ;!! 9 Press ADD/REPLACE Add or replace a Control Area Directory file E - ERASE Erase a file from the Control Area Directory M - MODIFY Modify a Control Area file name L - LIST List Control Area Directory or OS Table V - Z!"/!9^#V!9^#VV#DM(_ʑ! 9^#V*/!;*/z!;Ñ!;Ñ!;Ñ!;Ñ!);Ñ͏_dNYoC`i SYSLIB: Error #%d in loading overlay %s.OVR: overlay missing or badnot enough memory to load it!overlay  Error(s)$     Z!9^#V!9^#V!9^#Vn(_͐Z!b_Lc_x!!9^#Vc_u!;2! !͆_!9^#VZ!! 9^#VBKò#b_`i^! b_!"_`i^cZ`i#DM+së Too long! Re-e!!X͐Z!9^!9^#V͓+!9^!_F)!9^#V* `7_S(!9^* `7_w(!!bͶ,!9^#V" `!9^+" `! 9^(! 9^!+;!!b!9^#Vͺ:(!!9^#V!bͺ:!!b`-(͏_(((!!9~#fos#r!9n#ss#r! 9~#fo#s#r"!9~#fos#r! 9^#V!9^#V! s#r!9^#V!9^#V! s!9^#V"be#͐Z!!R9s#r*b! 9͈Y!$! 9ͤY!! 9ͧI!T9s#r!G_#!R9~#fo#s#r+|#! $!$! 9͈Y*b! 9ͤYÄ#! !J9!X9^#V!ͩ^*_!"9~#fo(_!"9^#V! ^#V! 9s#r!"9^#V! ^!9s#r!"9^#V!"^#V!9s#r!"9^#V!$^! 9s#r@ +!9s#r!9^#V!ͩ^*_!9s#r!9^#V! ^#V!9~#fo͆_!9s#r!9^#V! ^#V!9^#V! ^! 9~#fo͆_!9s#r!9^#V!^!9~#fo;!;Åb_A)))!9~#fo~A!;Q Filename Load Addr. Entry Off. Support Files -------- ---------- ----------- ------------- %c %8lx %4x %c ͐Z*`DM!nter --> ͐Z!DM`i#DM`ib_J! 9~#fo#s#r+^!K;%c͐Z!DMa`i#DM`ib_ʢ! 9^#V^! 7_ʢ! 9~#fo#s#r+^!;\%c͐Z!;! 9^#VN!; There is already a file named in the Control Area.!c_")!!9s!9~#fo#s#r!9~#fo+s#r!9^!9^#V͓+!9^#V!c_J*!9^#V!<^DM! 9^ö)! 9^!"+;`i^!9^#VͶ,)`i^!9^#V`-)͏_))p)`i)!9~#fo͆_s#r`i^!9~#fos#r`i)!9n=M 7_$!$!H9^#V!7_.$!$!J9^#V!L9~#fo!N9~#fo*4_\$!($!J9^#V^#V}21!J9^#V"2!L9^#V!L9^#V!X9^#V=M!L9~#fo_ʬ$!2$!T9^#V K!P9^#V.ovra:͐Z*b!^9^#V!]%!9;!9!9! W!\9^!9s#r!9^#V!c_N !9^#V!G_6!!9s#rD!9^#V!9s#r!9^#V! 9!9^#V+!9^#V!%! 9!9^#V! 9! 9^#V+!9^#V!%! 9!9^#V! 9~#fos#r!9^#V!9~#fos#r! 9^#V!c_!! 9~#fo͆_s#r!9~#fo#s#r!#(b_8`i^!c_8`i^!b_8`iDM͐Z!S;!; Entry Filename Track Sect Records Load Addr Exc Off ----- -------- ----- ---- ------- --------- -------͐Z! 9^#V ! 9^#V!^#V!9^#V![8[!9^#V͐Z!|9^#V!<^!n9s#r4!!n9~#fo<^s#r!n9^#V!c_ʲ!n9^#VBKU`i#DM`i!|9~#fob_ʯ`i!n9~#fo͆_!l9s#rØ!n9^#V!l9~#fo͆_s#r!l9^#V!G_ʬ!l9^#V!v9~#foͩ^!t9~#fo!l9^#V!n9~#fo!v9~#foͩ^!t9~#fo!x9~#fo^#Vs!9^!c_5*!!9n͆_s!9~#fo#s#r*!9^!9^#V͓+!9^#V!c_l*!9^#V!?+;!9~#+!!bͶ,!9^#V" `!9^" `! 9^*! 9^!v+;!!b!9^#Vͺ:+!!9^#V!bͺ:!!b`-+͏_*#V! <^3%!|%DMJ%!%DMJ%!%DMJ%!%DMJ%!%DMJ%͏_%%#%+% %! W! HError %d loading overlay: %s $(File corrupted?)$(File not found)$(Header truncated)$(File isn't an overlay)$(Not enough memory)$͐Z!9n#s!9^#V!H_9^#V!c_2 !!9~#fo͆_s#r! 9~#fo#s#r!9^#V!9~#fo͆_s#r͐Z!9^#V*_͆_J^! 9s#r@ +! 9s#r! 9^#V!b_£ ! 9^#V! 9~#foc_ʵ ! 9^#V!K!;! 9^#V!9s#r !9~#fo#s#r!9~#fos#r!9^#V! 9~#fob_)!!! ^#V!9^#V! ^!9^#V! ^#V!4;!9 %4x %2x %4x %8lx %4x͐Z!l;!; Entry Filename OS Type Support Files Required ----- -------- ------- -------------------------------͐Z! 9^#V! !p! 9s#r!x9~#fo^#V!9s#r!z9^#V!(_X!! 9~#fo_s#r!!9~#fo_s#r!9^#V! 9~#fo_¬!v9^#V!95Z!v9^#V5Z!v9^#V!95ZP͐Z! 9~#fo+s#r! 9^#V!c_ü͐Z!:!9^#VYDM| ! ** *BUG* way = 0x%x in hd_xfer *BUG* way = 0x%x in hd_xfer *BUG* blk = %d after we've done block xfer in hd_xfer *BUG* way = 0x%x in hd_xfer͐Z!9!9^+<^)^8[!9^#V)^[@t]F[[&[!9[[],!k,;!9[8[!9^&!9^#V!&;!:`/&N'/&!"`!!}2`:bo&y&:bo&! ';!!9s#rÈ&!(!9s#rÈ&!4!9s#rÈ&͏_k&X]&?&!9~#&!9^#V!9^#V!9^!9^#V!9^!9^#V͏Z! 9~#&!"`&!"`&!"`*`|&!&! *BU!9^#V!9^#V!5Z!9^#Ve" !!!9^#V!ͩ^*_Z **BUG** bad SD entry # %d in sd_delete()͐Z! 9~#‡!! 9^#V*_͆_`J^DM̀ +`ib_¼!`ic_!!:";`i!#+! 9~#fo`s#rb_"!`!;! 9^#V^x! 9^#V^!t;Û!;Û!;Û!;Û!;Û!;Û!;Û!;Û͏_+6AL!W"b#m!;!DMð`i#DM`ib_`i)))! 9~#fo~`i)))! 9~#fo `ib_!;9^#VBK`i#DM!#b_e`i~e`i^!.7_e`i#DM+^cZ!9~#fo#s#r+so#b_ʖ! !9~#fo#s#r+sh͐Z!E;!9~#ʷ!m;!~;!9~#!;!;!DM`i#DM`ib_ ! 9^#V`i^!9^#V!,;! 9!9[[͍\8^_}2`!9[[͍\8^_}2`!9[[[8^}2` *** illegal sector requested trk = %x, sec = %x; xebec address = %06lx͐Z!9^#V!Q^,!9^#V!-;!9^#V!<^}2`!̓3!:`o&G* sector count = %d in hd_xfer *BUG* bad controller type 0x%x in hd_xfer()͐Zn'}2b&X(_j' .e5͐Z*DM!iPYDM`i^!b_ʯ'!DM`i^!_«'!X!`i^!|'!!9s'! !9s!!!2WDM!9^`iDM`i^!6_(9^#V!9^#V!`5Z!!!``ͩ^*_Z **BUG** bad OS entry # %d in os_delete()͐Z!! 9s#r!!9s#r!9^#V*_7_)#!9~#fos#r!9^#V! ^#V! 9s#r!9^#V! ^#V!9^#V! ^!9s#r!9^#V!c_#!!9~#fo͆_ë! 9^#V!?~o!;!DM(`i#DM`ib_o`i)))! 9~#fo~l`i)))! 9~#fo !;# ODD OS 0x%x CP/M 2.2 CP/M 86 HiDos CCP/M MS-DOS 2.0MS-DOS 2.xMS-DOS 3.x ͐Z@ +!9s#r!9^#V!;! 9^#V![8[!;! 9^#V!^#V!;!9~#D!DMY!PYDM`ib_D`i)))!9~#fo~D`iÌ#`i###b_b_)))!9~#fo~!#b_)))!9~#fo^!     !9^#VͿ3/1-!V-2 *BUG* in just_read length = 0x%x, not multiple of 256just_read͐Z!9^#V!Q^ʈ-!9^#V!-;!9^#V!<^}2`! ̓3!:`o&!9^#V3/1-!.2 *BUG* in just_write length = 0x%x, not multiple of 256ntroller * ;* * ;* (Note: this file contains both embedded * ;* tabs and blanks to minimize the list file * ;* width for printing purposes. You may wish* ;* to expand the blanks before performing *#+^*(_G=!9~#fo##s#r++^#V!9s#r#+^Ñ=!!9s#r#+^!a#^!_ʑ=!9^#V! ͩ^!9s#rR=.(_2>#+^!*(_=!9~#fo##s#r++^#V!9s#r#+^2>!!9s#r=#+^sØ7!9^!H_%8!*`_:(89!͐Z!DM:`o&))))):! 9s#r!9^#V))))!9^+<^! 9^#V###^! 9s! 9^#V!^#!9s! 9^t^#! s!9^! 9^J^t^! s!9^! 9^J^J^! 9s#r! 9^#V##:!!:o&>>@!``6͐Z!̓3/1T3!U32do_recal͐Z!̓3/1z3!{32q_ready͐Z! 9^}2`M017_ʭ3!3O2ó3b0͏0cmd_hard_5!9^#V#F##NPA1} 3g33}!9^#V#F##NPAjust_write͐Zͷ..!:`o&!9s#r!}2`!! `!$9ͺ:! 93/!! 9!!!(! 9! 93/!*9^!(_ʔ.!}2`!@93/!9^#V}2`!! 9!:ͺ:!:͐Z3͓/!9s{/17_.!/O2b0!}2`͏0/1/! !/; ;* major editing.) * ;********************************************* ; Copyright (C) 1980,1981 ; Digital Research, Inc. ; Box 579, Pacific Grove ; California, 93950 ; ; (Permission is hereby granted to use ; or abstracta#^!_2>!9^#V! ͩ^!9s#r=!!9s#rl(_e>#+^!!9s#r>h(_>#+^\?!!9s#rú>! !9s#rú>!!9s#rú>!!9s#r!9^#V!9!9^#V!9^#VA!9!9s#r!9^#V!9~#fos#r{?^+++! 9^#Vc_Q9!^9;!!̀;! 9^#V##^+++:`o&!9;:! 9^#V! s Mapping error in xlate_dms_cmd: (Max phys track on volume %x is %x)͐Z!!Ž_::Ɏ99!!͐Z!9;!!̀;: HDSK error; buffer =1}4g44}͐Z4/4!A4!9~#fo+s#r!9^#V!c_4!9^#V!9^!9^#V!9^i6!94!!!9~#fos#r!9n#s!c_4!!9s!9~#fo#s#r24:`4͠5͐Z*`|4!-V"`|4!55;!!DM!M0.!9^dms15_upWaiting for hard disk %c͐Z! ̓3t0!DMQ/`i#DM`i_~/! 9~#fo#s#r+^!:L//1ʌ/!/2xinit͐Z͹/£/!!20µ/!!͐Z!!9s#r/!9~#fo#s#r!9^#V!b_/3_/!/! the following program in ; the implementation of CP/M, MP/M or ; CP/NET for the 8086 or 8088 Micro- ; processor) true equ -1 false equ not true ;********************************************* ;* * ;!9~#fo##s#r++^#V!9s#rZ!9s#rÓ?!9~#fo##s#r++^#V!9!9s#rs{?͏_c-?d>o>s?u>x>F?!9!9~#fo͆_!9s#r!9^#V!9~#foc_ʶ?!9^#V!9s#r!9~#@?!9~#fo#s#r!9~#fo+s#r#!9~#foc_@!9^#V`i͏Z >Q x/: :R:!!5:!!9̈́:N:@:@:::=2:@:!}!9̈́:x:j:j:::=2:j:^#V#N#Fx2:Ax͐Z:`o&DM! 9^#V}2``i! }!9^#V#N#F#~#foDM}!9~2:o&!9~2:##~o&͐Z!1;`is!! s:`o! s!M! s:-5ͦ915!! Hard disk i/o error: can't allocate 1k buffer͐Z!!:!}2:ʋ5ͦ95!!!:_:!:͐Z!!9s!}2:`o&*`,85!!9^!b_G6!9n#s+}5!"5!":͐Z!!9s#r&0!9~#fo#s#r!9^#V!b_I03_F0!0!͐Z0!21͐Z1!A2͐Z!:_Ž0z0͐Z:`o&(_ʴ0:`o& _}2`t0!!`DM0#b_0`i#DM+^!:0͐Z3_* Loader_bios is true if assembling the * ;* LOADER BIOS, otherwise BIOS is for the * ;* CPM.SYS file. Blc_list is true if we * ;* have a serial printer attached to BLC8538 * ;* Bdos_int is interrupt used for earlier * ;* versions. (_ @!?!!9s#r-@!9~#fo#s#r!9^#V~z@!9^#V!9~#fob_z@!9~#fo#s#r+^`i͏Z(_w@!@!9^#V!9~#fos#r!9~#@ì@!9~#fo#s#r!9~#fo+s#r#!9~#foc_@! `i͏Z(_@!Ý@ A`i͏Z(_@!!;A!9s!(_(;!];;!H!9^ Hit RETURN to continue, to abort: Abnormal end at operator request͐ZØ;!9~#fo+s#r!9^#V!c_;! 9~#fo#s#r+^!;;É;%02x ͐Z!9!9^#V!!CE<͐Z! 9^#V"c!6!!9nsD6!*`5:ͦ9G6:Ɏo&@7_D6!!9ns5!9^!H_b6!}2`!9!͐Z!9^+_#!9s!9^#V*`7_¾6:`o&! 9^7_¾6:`o&:`o&7_6!9^!9^#VU7!9^}2`!9^#V"`:`o}2`!9^!9^10͐Z3_1 1͐Zt03_͐Z1 7_M1!k1O2!!:_DMt0!:`ix_stat_rcv͐Z!9^#V!1;!1;!!`̀;!1;!!6̀; Xebec controller error at %s command buffer: status buffer: ͐Z! * ;* * ;********************************************* loader_bios equ true blc_list equ true bdos_int equ 224 ;reserved BDOS Interrupt IF not loader_bios ;------------------- title '8086 Disk I/O Drivers' ;********************************************* ;* * ;* Basic Input/Output System (BIOS) for * ;* CP/M-86 Configured for iSBC 86/12 with * ;* the iSBC 204 Floppy Disk Co9!9^#V!$7!!9^#V5Z!}2`Q7!!9^#V5Z!͐Z!!9s:`u7͠5u7!!}2!9^!9^#V,8˜7!!9^!b_8!9n#s+}7!"7!":7!!9ns8ͦ98:Ɏo&@7_8!!9n̓3!!!6Ϳ3͐Z1! 9^#Vv1/1A2!E2O2!!x_err_rcv͐Z1!9s! 9^#V!2;!2;!!`̀;!9^!2;: Xebec controller fatal error in %s Command: SASI bus status: 0x%x͐Z!!:! 9^!     -------------------------- ;| | bios_code equ 2500h ccp_offset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point ;| | ;--------------------------------------------- E | ;This is a BIOS for the LOADER push ds ;save data segment mov ax,0 mov ds,ax ;point to segment zero ;BDOS interrupt offset mov bdos_offset,bdos_ofst mov bdos_segment,CS ;bdos interrupt segment pop ds ;restorerupt vectors in low ; memory to address trap push ds ;save the DS register mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4 mcur sel drive jmp SELDSK ;select disk for next rd/write jmp SETTRK ;set track for next rd/write jmp SETSEC ;set sector for next rd/write jmp SETDMA ;set offset for user buff (DMA) jmp READ ;read a 128 byte sector jmp WRITE ;write a 128 esult fdc_rst equ base204+2 ;8271 out reset dmac_adr equ base204+4 ;8257 DMA base address out dmac_cont equ base204+5 ;8257 out control dmac_scan equ base204+6 ;8257 out scan control dmac_sadr equ base204+7 ;8257 out scan address dmac_mode equ base2NDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;| | bios_code equ 1200h ;start of LDBIOS ccp_offset equ 0003h ;base of CPMLOADER bdos_ofst equ 0406h ;stripped BDOS entr data segment ;| | ;--------------------------------------------- ENDIF ;loader_bios mov bx,offset signon call pmsg ;print signon message mov cl,0 ;default to dr A: on coldstart jmp ccp ;jump to coldov si,0 ;then propagate mov cx,510 ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ;********************************************* ;* byte sector jmp LISTST ;return list status jmp SECTRAN ;xlate logical->physical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O m04+8 ;8257 out mode dmac_stat equ base204+8 ;8257 in status fdc_sel equ base204+9 ;FDC select port (not used) fdc_segment equ base204+10 ;segment address register reset_204 equ base204+15 ;reset entire interface max_retries equ 10 ;max retries ony ;| | ;--------------------------------------------- ENDIF ;loader_bios csts equ 0DAh ;i8251 status port cdata equ 0D8h ; " data port IF blc_list ;---------------------------------------------  start entry of CCP WBOOT: jmp ccp+6 ;direct entry to CCP at command level IF not loader_bios ;--------------------------------------------- ;| | int_trap: cli ;block interrupts mov ax,cs mov ds,ax * ;* National "BLC 8538" Channel 0 for a serial* ;* 9600 baud printer - this board uses 8 Sig-* ;* netics 2651 Usarts which have on-chip baud* ;* rate generators. * ;* ap byte (IOBYTE) ;********************************************* ;* * ;* INIT Entry Point, Differs for LDBIOS and * ;* BIOS, according to "Loader_Bios" value * ;*  disk i/o ;before perm error cr equ 0dh ;carriage return lf equ 0ah ;line feed cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vector ;| | lsts equ 41h ;2651 No. 0 on BLC8538 status port ldata equ 40h ; " " " " " data port blc_reset equ 60h ;reset selected USARTS on BLC8538 ;| | ;------ ;get our data segment mov bx,offset int_trp call pmsg hlt ;hardstop ;| | ;--------------------------------------------- ENDIF ;not loader_bios ;********************************************* ;*  * ;********************************************* mov al,0FFh out blc_reset,al ;reset all usarts on 8538 mov al,4Eh out ldata+2,al ;set usart 0 in async 8 bit mode mov al,3Eh out ldata+2,al ;set usart 0 to 9600 baud mov al,37h  * ;********************************************* INIT: ;print signon message and initialize hardware mov ax,cs ;we entered with a JMPF so use mov ss,ax ; CS: as the initial value of SS:, mov ds,ax ; DS:, mov es,ax ; and ES: ;use local stack for Individual Routines * ;* * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status --------------------------------------- ENDIF ;blc_list ;********************************************* ;* * ;* Intel iSBC 204 Disk Controller Ports * ;* * ;** * ;* CP/M Character I/O Interface Routines * ;* Console is Usart (i8251a) on iSBC 86/12 * ;* at ports D8/DA * ;* * ;*********************** out ldata+3,al ;enable Tx/Rx, and set up RTS,DTR ;| | ;--------------------------------------------- ENDIF ;not loader_bios IF loader_bios ;--------------------------------------------- ;|  during initialization mov sp,offset stkbase cld ;set forward direction IF not loader_bios ;--------------------------------------------- ;| | ; This is a BIOS for the CPM.SYS file. ; Setup all inter jmp CONIN ;return console keyboard char jmp CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on ******************************************* base204 equ 0a0h ;SBC204 assigned address fdc_com equ base204+0 ;8271 FDC out command fdc_stat equ base204+0 ;8271 in status fdc_parm equ base204+1 ;8271 out parameter fdc_rslt equ base204+1 ;8271 in r     ********************** CONST: ;console status in al,csts and al,2 jz const_ret or al,255 ;return non-zero if RDA const_ret: ret ;Receiver Data Available CONIN: ;console input call const jz CONIN ;wait for RDA in al,cdata and al ;no, dr_rdy: ; then we just retry read or write dec rtry_cnt jnz retry ; up to 10 times ; retries do not recover from the ; hard error mov ah,0 mov bx,ax ;make error code 16 bits mov bx,errtbl[BX] call pmsg ;print appropriate message command jmps r_w_common WRITE: mov al,0ah ;basic write sector command r_w_common: mov bx,offset io_com ;point to command string mov byte ptr 1[BX],al ;put command into string ; fall into execute and return execute: ;execute command strifset dp_base return: ret HOME: ;move selected disk to home position (Track 0) mov trk,0 ;set disk i/o to track zero mov bx,offset hom_com call execute jz return ;home drive and return if OK mov bx,offset bad_hom ;else print call pmsg ;"Hgs ; Routine to get and echo a console character ; and shift it to upper case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cmp,7fh ;read data and remove parity bit ret CONOUT: ;console output in al,csts and al,1 ;get console status jz CONOUT ;wait for TBE mov al,cl out cdata,al ;Transmitter Buffer Empty ret ;then return data LISTOUT: ;list device output  in al,cdata ;flush usart receiver buffer call uconecho ;read upper case console character cmp al,'C' je wboot_l ;cancel cmp al,'R' je outer_retry ;retry 10 more times cmp al,'I' je z_ret ;ignore error or al,255 ;set code for permanent errong. ;[BX] points to length, ; followed by Command byte, ; followed by length-1 parameter bytes mov last_com,BX ;save command address for retries outer_retry: ;allow some retrying mov rtry_cnt,max_retries retry: mov BX,last_com call sendome Error" jmps home ;and retry SETTRK: ;set track address given by CX mov trk,cl ;we only use 8 bits of track address ret SETSEC: ;set sector number given by cx mov sect,cl ;we only use 8 bits of sector address ret SECTRAN: ;translate s al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to caps uret: ret ; utility subroutine to print messages pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT  IF blc_list ;--------------------------------------------- ;| | call LISTST jz LISTOUT ;wait for printer not busy mov al,cl out ldata,al ;send char to TI 810 ;| r exec_exit: ret dr_nrdy: ;here to wait for drive ready call test_ready jnz retry ;if it's ready now we are done call test_ready jnz retry ;if not ready twice in row, mov bx,offset nrdymsg call pmsg ;"Drive Not Ready" nrdy01: call test_com ;transmit command to i8271 ; check status poll mov BX,last_com mov al,1[bx] ;get command op code mov cx,0800h ;mask if it will be "int req" cmp al,2ch jb exec_poll ;ok if it is an interrupt type mov cx,8080h ;else we use "not command bector CX using table at [DX] mov bx,cx add bx,dx ;add sector to tran table address mov bl,[bx] ;get logical sector ret SETDMA: ;set DMA offset given by CX mov dma_adr,CX ret SETDMAB: ;set DMA segment given by CX mov dma_seg,CX ret ; ;print it inc BX jmps pmsg ;next character and loop ;********************************************* ;* * ;* Disk Input/Output Routines * ;* * ;**** | ;--------------------------------------------- ENDIF ;blc_list ret LISTST: ;poll list status IF blc_list ;--------------------------------------------- ;| | in al,lsts and al,81h ;look at_ready jz nrdy01 ;now loop until drive ready jmps retry ;then go retry without decrement zret: and al,0 ret ;return with no error code wboot_l: ;can't make it w/ a short leap jmp WBOOT ;********************************************* ;* usy" and al,0fh cmp al,0ch ;unless there isn't mov al,0 ja exec_exit ; any result ;poll for bits in CH, exec_poll: ; toggled with bits in CL in al,fdc_stat ;read status and al,ch xor al,cl ; isolate what we want to poll jz exec_po GETSEGT: ;return address of physical memory table mov bx,offset seg_table ret ;********************************************* ;* * ;* All disk I/O parameters are setup: the * ;* Read and Write entry ***************************************** SELDSK: ;select disk given by register CL mov bx,0000h cmp cl,2 ;this BIOS only supports 2 disks jnb return ;return w/ 0000 in BX if bad drive mov al, 80h cmp cl,0 jne sel1 ;drive 1 if not zero m both TxRDY and DTR cmp al,81h jnz zero_ret ;either false, printer is busy or al,255 ;both true, LPT is ready ;| | ;--------------------------------------------- ENDIF ;blc_list ret PUNCH: ;not imp * ;* The i8271 requires a read status command * ;* to reset a drive-not-ready after the * ;* drive becomes ready * ;* * ;******************ll ;and loop until it is done ;Operation complete, in al,fdc_rslt ; see if result code indicates error and al,1eh jz exec_exit ;no error, then exit ;some type of error occurred . . . cmp al,10h je dr_nrdy ;was it a not ready drive ? points transfer one * ;* sector of 128 bytes to/from the current * ;* DMA address using the current disk drive * ;* * ;********************************************* READ: mov al,12h ;basic read sector ov al, 40h ;else drive is 0 sel1: mov sel_mask,al ;save drive select mask ;now, we need disk parameter address mov ch,0 mov bx,cx ;BX = word(CL) mov cl,4 shl bx,cl ;multiply drive code * 16 ;create offset from Disk Parameter Base add bx,oflemented in this configuration READER: mov al,1ah ret ;return EOF for now GETIOBF: mov al,0 ;TTY: for consistency ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and fla     *************************** test_ready: mov dh, 40h ;proper mask if dr 1 test sel_mask,80h jnz nrdy2 mov dh, 04h ;mask for dr 0 status bit nrdy2: mov bx,offset rds_com call send_com dr_poll: in al,fdc_stat ;get status word test al,wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command ; System Memory Segment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIOS------------------------- ENDIF ;loader_bios IF not loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db ' System Generated - 11 Jan 81',cr,lf,0 ;|  dmac_adr,al ;send low byte of DMA mov al,ah out dmac_adr,al ;send high byte mov ax,dma_seg out fdc_segment,al ;send low byte of segment address mov al,ah out fdc_segment,al ;then high segment address dma_exit: mov cl,[BX] ;get count 80h jnz dr_poll ;wait for not command busy in al,fdc_rslt ;get "special result" test al,dh ;look at bit for this drive ret ;return status of ready ;********************************************* ;* *  title 'LDCOPY Ver 1.1 Oct 81' vers equ 10 ; Copyright, (C) 1981 ; Digital Research, Inc. ; P.O. Box 579 ; Pacific Grove, CA 93950 ; LDCOPY is used to generate and propagate bootable CP/M-86 systems. ; It copies a CP/M-86 Loader image dw tpa_len ;and extends to 08000 dw 2000h ;second is 20000 - dw 2000h ;3FFFF (128k) include singles.lib ;read in disk definitions loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ (lasto | ;--------------------------------------------- ENDIF ;not loader_bios bad_hom db cr,lf,'Home Error',cr,lf,0 int_trp db cr,lf,'Interrupt Trap Halt',cr,lf,0 errtbl dw er0,er1,er2,er3 dw er4,er5,er6,er7 dw er8,er9,er inc BX mov al,[BX] ;get command or al,sel_mask ;merge command and drive code out fdc_com,al ;send command byte parm_loop: dec cl jz exec_exit ;no (more) parameters, return inc BX ;point to (next) parameter parm_poll: in al,fdc_stat te;* Send_com sends a command and parameters * ;* to the i8271: BX addresses parameters. * ;* The DMA controller is also initialized * ;* if this is a read or write * ;* * ;*************** (either from a disk file, or from ; the system tracks of an existing CP/M-86 system diskette) to a new ; diskette. ; The following equates will require modification for different ; diskette formats. For convienence, they are only referenced ; by aff+0400h+15) / 16 tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section * ;* A,erB dw erC,erD,erE,erF er0 db cr,lf,'Null Error ??',0 er1 equ er0 er2 equ er0 er3 equ er0 er4 db cr,lf,'Clock Error :',0 er5 db cr,lf,'Late DMA :',0 er6 db cr,lf,'ID CRC Error :',0 er7 db cr,lf,'Data CRC Error :',0 er8 db cr,lst al,20h ;test "parameter register full" bit jnz parm_poll ;idle until parm reg not full mov al,[BX] out fdc_parm,al ;send next parameter jmps parm_loop ;go see if there are more parameters ;********************************************* ;* ****************************** send_com: in al,fdc_stat test al,80h ;insure command not busy jnz send_com ;loop until ready ;see if we have to initialize for a DMA operation mov al,1[bx] ;get command byte cmp al,12h jne write_maybe ;if pair of data bytes near the end of the data segment. ; In addition, the skew table in the data area will need modification. sdspt equ 26 ; number of sectors per track sdlt equ 2 ; " of tracks for loader ; *********** * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector rw 2*(bdos_int-1) bdos_offset rw 1 bdos_segment rw 1 f,'Drive Not Ready :',0 er9 db cr,lf,'Write Protect :',0 erA db cr,lf,'Trk 00 Not Found :',0 erB db cr,lf,'Write Fault :',0 erC db cr,lf,'Sector Not Found :',0 erD equ er0 erE equ er0 erF equ er0 nrdymsg equ er8 rtry_cnt db 0 ;disk e * ;* Data Areas * ;* * ;********************************************* data_offset equ offset $ dseg org data_offset ;contiguous with c not a read it could be write mov cl,40h jmps init_dma ;is a read command, go set DMA write_maybe: cmp al,0ah jne dma_exit ;leave DMA alone if not read or write mov cl,80h ;we have write, not read init_dma: ;we have a read or write operation*************** ; * ; * global equates ; * ; ************************** bdosint equ 224 ;BDOS interrupt number false equ 0 true equ not false cr equ 0dh ;carriage return lf equ 0ah ;line feed sdndisks equ 16 ; maximum num END rror retry counter last_com dw 0 ;address of last command string dma_adr dw 0 ;dma offset stored here dma_seg dw 0 ;dma segment stored here sel_mask db 40h ;select mask, 40h or 80h ; Various command strings for i8271 io_com db 3 ;length rd_ode segment IF loader_bios ;--------------------------------------------- ;| | signon db cr,lf,cr,lf db 'CP/M-86 Version 1.1',cr,lf,0 ;| | ;--------------------, setup DMA controller ; (CL contains proper direction bit) mov al,04h out dmac_mode,al ;enable dmac mov al,00 out dmac_cont,al ;send first byte to control port mov al,cl out dmac_cont,al ;load direction register mov ax,dma_adr out     ber of drives sdsecsiz equ 128 ; size of each sector tpa equ 100h fcbaddr equ 5ch fcbname equ fcbaddr + 1 ;1st char of file name fcbtype equ fcbaddr + 9 ;file type fcbcr equ fcbaddr + 32 ;current record cseg jmp start db ' COPYRIGHT (C) cr jne reboot1 ;local jmp then to reboot, >128 ;typed a cr, ok to ignore call crlf jmp rwsec endtrk: ;end of track mov cx,spt ;sectors per track call multsec ;*secsiz mov bx,dmaddr ;base dma for this track add bx,cx k mov sector,-1 ;counts 0, 1, 2, . . . 25 ;sector incremented before read or write rwsec: ;read or write sector inc sector ;to next sector mov bx,sector ;current sector cmp bx,spt ;sectors per track jz endtrk ;read or write sectoall done if cr jz pboot ;this is normal program exit point mov ah,al ;save ascii drive letter sub al,'A' ;make it a number cmp al,ndisks jb putc call baddisk ;invalid drive name jmp putldr ;to try again putc: mov pdisk,ah ;drive letcx ;don't read to far jz don or al,al ;0 if read ok jnz badrd add dx,secsiz ;inc dma by sector size jmp rdinp don: ret badrd: ;read error encountered in input file mov dx,offset badfile call crmsg jmp reboot ; ************1981, DIGITAL RESEARCH ' rs 100h ; Emergency Patch Area (DRI) ; *********************** ; * ; * program begins here ; * ; *********************** start: mov ax,ds mov es,ax mov dx,offset signon call outmsg cmp byte ptr .fcbname,'  ;+ spt * secsiz mov dmaddr,bx ;ready for next track jmp rwtrk ;for another track endrw: ;end of read or write, return to caller ret reboot1:jmp reboot ;farther than 128 bytes ; *************************************r to or from l_5: ;current dma address mov si,offset tran add bx,bx ; double sector number mov cx,[bx+si] ;xlate to physical sector push si push cx call sec ;set up sector number pop cx pop si mov bx,[si] sub cx,bx ;tran(sector)-ter in message call sel ;select dest drive in al mov dx,offset putmsg call crmsg ;check with user for ok call getchar cmp al,cr ;user mistake if not cr, reboot jnz pboot call crlf mov rewr,1 ;set to write for getput call getput ;to p************** ; * ; * getldr: get CP/M loader from 1st N tracks ; * ; ************************** getldr: mov dx,offset askget call crmsg ;which drive is source on ? call getchar ;must get from disk - not from memory mov ah,al ;save asci' jz gl ;check for file given on command line call getfile ;read ldr from file jmp ps gl: call getldr ;read ldr from 1st 2 tracks ps: call putldr ;put ldr on " " " jmp reboot ; *************************** ; * ; * getfile: get the **** ; * ; * utility subroutines ; * ; **************************************** ; ;***** multsec: ;cx * sector size push dx ;return value in cx mov ax,secsiz mul cx mov cx,ax pop dx ret ;***** baddisk: mov dx,offset qdisk ;bad distran(0) call multsec ;cx * sector size add cx,dmaddr ;base of dma for this track ;+(tran(sector)-tran(0))*secsiz call dma ;dma address set from cx ;dma address set, clear retry count trysec: ;try tut loader back on diskette mov dx,offset done call outmsg jmp putldr ;for another put operation pboot: jmp reboot ;back to cp/m ; *********************** ; * ; * getput: get or put loader (rewr=0 for read, 1 for write) ; * disk is already i char sub al,'A' ;normalize drive number cmp al,ndisks ;valid drive? jb getc ;skip to getc if so call baddisk ;invalid drive number jmp getldr ;to try again getc: mov gdisk,ah ;ascii drive letter for message call sel ;to select the drfile specified in command tail into ram ; * ; *************************** getfile: cmp byte ptr .fcbtype,' ' jnz opn mov byte ptr .fcbtype, 'C' mov byte ptr .fcbtype + 1,'M' mov byte ptr .fcbtype + 2,'D' opn: mov dx,fcbaddr ;try to opk name call crmsg ret ; ********************** ; * ; * bdos subroutines ; * ; ********************** bdos: int bdosint ret ;function numbers in cl reset equ 0 ;warm boot coni equ 1 ;console input cono equ 2 ;console output pro read or write current sector or rewr,0 ;read or write? jz tryread ; Start of Patch 02 3/08/82 by rld as per DRI instructions mov cl,00 mov ax,track inc ax cmp ax,nlt jne normal_write mov ax,sector inc ax cmp ax,spt jne normal_writselected ; * ; *********************** getput: mov bx,offset loadp ;load point in ram for cp/m during LDCOPY mov dmaddr,bx ;clear track to 00 mov track,-1 ;start with track equal -1 rwtrk: ;read or write next track inc track ;track =ive in al call crlf mov dx,offset getmsg call outmsg ;make sure right drive call getchar cmp al,cr ;user mistake, no cr jnz gboot call crlf mov rewr,0 ;set to read for getput call getput mov dx,offset done call outmsg ret gboot:en it call open inc al ;255 becomes 00 jnz rdok ;ok to read if not 255 mov dx,offset nofile call crmsg ;file not present, error and reboot jmp reboot rdok: mov byte ptr .fcbcr,0 ;current record = 0 mov dx,offset loadp ;base of buffer str equ 9 ;print string rconb equ 10 ;read console buffer self equ 14 ;select disk openf equ 15 ;disk open setdmaf equ 26 ;where data will go dreadf equ 20 ;disk read biosf equ 50 ;bios call reboot: mov al,0 call sel call crlf moe mov cl,01 Normal_Write: ; End of Patch 02 installed rld 8/30/82 ;must be write call write jmp chkrw ;check for error returns tryread: call read chkrw: or al,al jz rwsec mov dx,offset errmsg call outmsg call getchar cmp al, track + 1 mov cx,track cmp cx,nlt ;number of loader tracks = current track ? jnz nxttrk ;end of this routine > 128 bytes jmp endrw ;end of read or write ;otherwise notdone, go to next track nxttrk: mov cx,track call trk ;to set trac jmp reboot ;back to cp/m ; ******************************* ; * ; * putldr: put CP/M loader on 1st N tracks ; * ; ******************************* putldr: mov dx,offset askput call crmsg ;what drive to put ldr call getchar cmp al,cr ; mov cx,maxsecs ;sector count rdinp: push cx push dx ;ready for dma call bdma ;bdos dma function mov dx,fcbaddr ;ready for read call dread pop dx ;recall dma address pop cx ;recall sector count cmp al,1 ;check for eof jz don dec      v cl,reset mov dl,0 ; release memory jmp bdos ;**** getchar: ;get an upper case char into al call getbuf ;use buffered console read cmp conbuf+1,0 ;just a crlf? mov al,cr jz ex mov al,conbuf+2 ;first char read cmp al,'a' ;translates constructed automatically by the ; GENCMD utility). ; CPMLDR may be read into any segment that does not ; overlap the desired system load segment as it makes ; all memory references using copies of the CS: register ; it is entered with. false for double density dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 ; (64 extra bytes reserved) ; ************************* ; * ; * variables ; * ; ************************ bds: ;bios data structure fnumn sel: ;select disk given by register a mov cl,al mov al,seldsk jmp bios ;**** trk: ;set up track mov al,settrk ;offset for settrk entry jmp bios ;gone to settrk ;**** sec: ;set up sector number mov al,setsec jmp bios ;*** to upper case if lower jb ex cmp al,'z' ja ex and al,5fh ;it is lower, make upper ex: ret ;**** getbuf: ;read console buffer mov cl,rconb mov dx,offset conbuf jmp bdos ;**** putchar: ;write character from al to console movequ 0 true equ not false cr equ 0dh lf equ 0ah lbios_offset equ 1200h ; offset of LBIOS biosoff equ 2500h ; offset of BIOS from start of CPM.SYS ; this is the entry point into CPM.SYS bootdrv equ 0 ; boot drive always zero  rb 1 ;storage for bios parameters bcx rw 1 ;the bdos bios func puts these bdx rw 1 ;in registers before jumping to bios nlt dw sdlt ;number of loader tracks spt dw sdspt ;sectors per track ndisks db sdndisks ;number of disks secsiz dw * dma: ;set dma address to value of cx mov al,setdma jmp bios ;**** read: ;perform read operation mov al,readf jmp bios ;**** write: ;perform write operaton mov al,writf jmp bios ; ************************** ; * ; * data are dl,al mov cl,cono jmp bdos ;**** crlf: ;send carriage return, line feed mov al,cr call putchar mov al,lf call putchar ret ;**** crmsg: ;print message addressed by dx til zero ;with leading crlf push dx call crlf pop dx  ; 128 bytes of CPM.SYS lbdosoff equ 406H ;location of LBDOS in LOADER bdos_int equ 224 ;lbdos interrupt number ; dummy section for interrupt vectors dseg 0 org 0 abs_zero rw 2*bdosint bdos_offset rw 1 bdos_segment rw 1 ; bdos  title 'CP/M-86 Loader' ; The CPMLDR consists of this module along with the ; LDRBDOS and LBIOS. ; CPMLDR resides on the first two tracks of a ; CP/M-86 system diskette and is brought into memory ; by the ROM bootstrap loader to load initiate CP/sdsecsiz ;sector size maxsecs dw sdlt * sdspt ;maximum sectors to read from file sdisk rb 1 ;selected disk for current operation track rw 1 ;current track rewr rb 1 ;read if 0,write if 1 sector rw 1 ;current sector dmaddr dw 0 ;current dma addas ; * ; ************************** dseg org 0100h ; skip past page zero ;messages signon db 'LDCOPY VERS ' db vers/10+'0','.',vers mod 10+'0','$' askget db 'Source Drive Name $' getmsg db 'Source On ' gdisk rs 1 ;filled in at get ;drop thru to outmsg0 ;**** outmsg: mov cl,prstr jmp bdos ;dx has string addr ;**** bdma: ;dx has address mov cl,setdmaf jmp bdos ;**** dread: ;disk read function mov cl,dreadf jmp bdos ;**** open: ;file open function mov cfunction numbers coutf equ 2 pstrf equ 9 seldsk equ 14 openf equ 15 readsf equ 20 dmaf equ 26 dmabf equ 51 ;******************************* ;* ;* CPMLDR starts here ;* ;******************************* cseg org 0 ; JMPM-86 ; It opens the file 'CPM.SYS' using the LDRBDOS and LBIOS ; and then reads it into memory. Finally, a jump to the BIOS ; initialization entry point starts CP/M-86 ; The first 128 byte record of the CPM.SYS file is a header ; with the followinress retry rb 1 ;number of tries on this sector conbuf db 30 rb 32 ;console buffer ;make stack on even address loadp rs sdsecsiz*sdspt*sdlt db 0 ; force out last data segement byte end function db ', Then Type Return$' askput db 'Destination Drive Name (Or Return To Reboot) $' putmsg db 'Destination On ' pdisk rs 1 ;filled in at put function db ', Then Type Return$' errmsg db 'Permanent Error, Type Return To Ignore$' done db 'l,openf jmp bdos ;**** bios: mov fnum,al ;bios function number mov bcx,cx mov bdx,dx mov dx,offset(bds) mov cl,biosf jmp bdos ; **************************** ; * ; * bios utilities ; * ; **************************** seldsk equ 9 F to here from boot ROM jmp LBIOS ; allow loader BIOS to ; initialize start: ; loader BIOS jumps here xor ax,ax ! mov ds,ax ; temp DS at absolute zero mov bdos_offset,lbdosoff ; to patch in interrupt table mov bdos_segment,g format: ; ty rb 1 ;seg type (not used here) ; len rw 1 ;length (not used here) ; abs dw ldrstart ;absolute segment address for LOADER ; min rw 1 ;minimum mem (not used here) ; max rw 1 ;max mem needed (not used here) ; (This header record iFunction Complete$' qdisk db 'Invalid Drive Name$' nofile db 'No Source File On Disk$' badfile db 'Source File Read Error$' ;translate table tran dw 1,3,5,7,9,11,13,15,17,19,21,23,25 dw 2,4,6,8,10,12,14,16,18,20,22,24,26 ;leave room ;wboot+24 for disk select settrk equ 10 ;wboot+27 for set track function setsec equ 11 ;wboot+30 for set sector function setdma equ 12 ;wboot+33 for set dma address readf equ 13 ;wboot+36 for read function writf equ 14 ;wboot+39 for write functio     cs ; offset and segment mov ax,cs ! mov ss,ax ; make ss, ds, es = cs mov ds,ax ! mov es,ax mov sp,offset(stack) ; set up local stack call initlbdos ;warm up lbdos and lbios call openfnc ;open CPM.SYS cmp al,255 ! jne perr ; inP,uPjPPÙ>tPfjƇjj]Uz|~$%|>wLJuxp<uAPPnt>uJt>tt4t"<uu&PPePaP$㉇J.t$>t;~te9~u@ÈPv@Y"rP>ttB~ȢP [JjP Yi.t뷀>u .t6t~<w3 ÃjUPP]UHĸpn@j\PP!P*PPPPw>uP(PePP\P\P\PF>u\P=>u-PV@]U] ; overlay preceding with DW's biosstart dw biosoff ; first word is BIOS offset ldseg rw 1 ; second is segment to put CPM.SYS fcb db 0,'CPM ','SYS',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 org (offset $+1) and 0FFFEh ; even address fe 9 ? add al,'0' ;digit jmp prn p10: add al,'A'-10 ;char a-e prn: mov dl,al ;****** putchar: mov cl,coutf jmp sys_vec ;****** initlbdos: mov cl,seldsk ! mov dx,bootdrv ; select boot disk jmp sys_vec ;****** openfnc: mov cl,opeld from header mov ldseg,ax ; save it and mov dx,ax ! call setdmab ; set DMA segment for disk IO mov dx,offset segment ! call msg ; put memory map on console mov ax,ldseg ! call phex ; print base system segment ; mov dx,0 ;offset of Ct j%1jnunuƸiPPP<P\PtmP.%P]Up@;v P Fn6p]Up@;r@"sn6pp]UP6xP6pP1x;ps u!n6xUPFP]U P P]U~ v FA, F0P]UFPF$P]UFPFP]U Pv]Uv]UkPvsP6pJ]U츃P]UPv]UPv]UPv]Uor stack rw 32 stack equ offset $ dseg org stack page1 rb 128 ; dummy section for BIOS init label org lbios_offset lbios: end enf ! mov dx,offset fcb ; fcb already initialized mov cl,openf jmp sys_vec ;******** ; setdma: ;set new dma addr in dx mov cl,dmaf jmp sys_vec ;******** ; setdmab: ; set new dma segment base from DX mov cl,dmabf jmp sys_vec ;PM in segment readit: call setdma ; set DMA offset for push dx ! call read ; next sector read cmp al,01H ! je done ; check for EOF cmp al,0 ! je prerr ; check for good write mov dx,offset rerr ! call msg ; print READ ERROR message 0=x P]U6x7:P P]U6\Ptm%]U@|@;w ]UK&&]UtHtt Ppp;|vH|]UPPZPYp]U'>'w'(t'Pv]UPPz]UPvi]UPvY]UPvI]UPv9]UPv&]UFȈF'w;!<w!'طM:(t!u؀>!t뷰]à'1]U..:Fwt.u]Ulm6l< tl]UP> u]I0s>]t> ù>0u뿀>0 sf_F]UP> t]UFN ]U>w:fu]u]UF,0< vF,A<vF,A ]Ur6s(6jwB****** ; sys_vec: int bdos_int ret ;****** ; stop: hlt ; hard stop 8086 for error jmp stop ;******************************** ;* ;* DATA AREA ;* ;******************************** nofile db cr,lf,'The File CPM.SYS Not Found On This  jmpf bios ; leap to BIOS initialization ;***************************** ;* ;* subroutines ;* ;***************************** ;****** phex: ;print 4 hex characters from ax mov cx,0404h ; 4 in both CH and CL lhex: rol ax,cl ; rotate l     u]U3>3w1s 3Ƈ5 35P3u042>0 r@"4sW211<v@"2s'015:t21Ǡ2s40뗠4s00]U>]u@P> u@Y"sp>+"!6*& ~}:<2O>/H7 !5 >}ʭ͹ o&" *&>+  ͹ =2O!  !+  q#p:< *&>+ Hq*++"@: *++" *M 5!6>!g  *&>+  >͈`  *& U*  \O:*m{:222222222222222222!q*& k k!q> !ҡ:A Okê:0Ok!q:O͆:O͆!p+q*|Oͫ*}Oͫ!p+q* !p+q{*DM!AuP0 Ylƀ>Mu(hP0 Yn0P0 Yi뗀>Xu9P0 Yp4]>+  > !+s#r *&>+  >͈`  *&>+  !N#Fq#p!4+,\͡ʇ %͈ *:7f ͹ O͜ *#" p *+"͹ *#"{!6:}3*& Nk!4?k{*#":fX* ~> !q: k> :a}:_2:?O\2:  ?O\2Ë!s+q*&`:R!6>!*& :>!4½>! q: 0O> : 0: AO> COPYRIGHT (C) 1982, DIGITAL RESEARCH [], ERROR: $, LOAD ADDRESS $DISK WRITE$DICODE DATA EXTRASTACKX1 X2 X3 X4 8080 NZERONHEADCGROUPDGROUPEGROUPSGROUP͹ _H͡))))͹ _"!<6>!<D ͹ *<&= w*+"!<4 !<6>!<ڮ c :<2<I î !6!6>!ڠ :<!O! *&= ʙ !6!4m :« ñ U >:<<_!{!Cq!D6:C!D ͹ 2*+"!D4 !" ~2́* >: A !" ?2͸S*M28 J* ))))*& " ?2* *#"ip* ~!"!͋Õ*"v͑2 ¸* DM: * 6!"Å!":!"""}2627!62|o&1͈0102821100654321 COPYRIGHT (C) 1982, DIGITAL RESEARCH [], ERROR: $, LOAD ADDRESS $DISK WRITE$DISK READ$INSUFFICIENT MEMORY TO CREATE CMD FILE $SK READ$INSUFFICIENT MEMORY TO CREATE CMD FILE $LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$RECORDS WRITTEN $ABSCANNOT OPEN SOURCE$CMDNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$~2  *#" ́: } + :FT :]: HN M y :Fd !6y :F t !6y !6 !I6>!Iھ ͸Ҡ *I&K 6 ÷ *I&K :w?O\2!I4‚ !F6!J6!H6:F !J= !H6+6>!G/#' *G&K *F""2>!&*&$) >w#6!4 !"!"! 6͹ 2H͹ ͹ _H͡":¹͹ 2*+"!6>}ʹ*+"͹ 2« 2ʨ*& :wò*M !4r: ͹ ͹ _H͡*6& ) q#p*++"!64:­͹ o&"*LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$RECORDS WRITTEN $ABSCANNOT OPEN SOURCE$CMDNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$!9"!!"!"!6#6!6!"\!;<:?Re\́\ͱ\<:      &> *G& !H6$ !G4 :H6 !J6: !F4 :JI !F6:F:]: H ́:AŽ  *F&>+  q#p :M  *F&>+  q#p:F< *F&>+ Hq :X  *F&>+  q#p M i`N#Fend of read command, all errors end-up here ; ; error: mov dx,offset errmsg call print jmp ready ; ; BDOS entry subroutine bdos: int 224 ;entry to BDOS if by INT 224 ret ; abort: ;return to CCP mov cl,0 loop ; not end, store character mov byte ptr [bx],al inc bx ;next to fill loop rloop ;decrement cx ..loop if not 0 erloop: ; end of read loop, store 00 mov byte ptr [bx],0h ; ; write the record to selected record number me it mov cl,makef mov dx,offset fcb call bdos inc al ;err 255 becomes zero jnz ready ; ; cannot create file, directory full mov dx,offset nospace call print jmp abort ;back to ccp ; 12 ;return version number openf equ 15 ;file open function closef equ 16 ;close function makef equ 22 ;make file function readr equ 33 ;read random writer equ 34 ;write random ; ; Equateog_og_{ozgDM!>))덑o|g8 =&DM!>))M =E_{ozg^#V) `_{ozgi`N#Fogo&og_{_z#WCODE DATA EXTRASTACKX1 X2 X3 X4 8080 NZERONHEADCGROUPDGROUPEGROUcall bdos ;use function 0 to end execution ; ; utility subroutines for console i/o ; getchr: ;read next console character to a mov cl,coninp call bdos ret ; putchr: ;write character from a to consoleov cl,writer mov dx,offset fcb call bdos or al,al ;error code zero? jz ready ;for another record jmps error ;message if not ; ; ; ; end of write command, process read ; ; notw: ; not a write command, rea ; loop back to "ready" after each command ; ready: ; file is ready for processing ; call readcom ;read next command mov ranrec,dx ;store input record# mov ranovf,0h ;clear high byte if set cmp al,'Q' ;quit? jnz s for non graphic characters cr equ 0dh ;carriage return lf equ 0ah ;line feed ; ; ; load SP, ready file for random access ; cseg pushf ;push flags in CCP stack pop ax ;save flags in AX cli ;disable interruPSGROUP mov cl,conout mov dl,al ;character to send call bdos ;send character ret ; crlf: ;send carriage return line feed mov al,cr ;carriage return call putchr mov al,lf ;line feed call putchrd record? cmp al,'R' jz ranread jmps error ;skip if not ; ; read random record ranread: mov cl,readr mov dx,offset fcb call bdos or al,al ;return code 00? jz readok jmps error ; ; read w notq ; ; quit processing, close file mov cl,closef mov dx,offset fcb call bdos inc al ;err 255 becomes 0 jz error ;error message, retry jmps abort ;back to ccp ; ; ; end of quit command, process write ; pts mov bx,ds ;set SS register to base of DATA group mov ss,bx ;set SS, SP with interrupts disabled mov sp,offset stack ; for 80888 push ax ;restore the flags popf ; ; CP/M-86 initial release returns the file ; system version number of  ret ; print: ;print the buffer addressed by dx until $ push dx call crlf pop dx ;new line mov cl,pstring call bdos ;print the string ret ; readcom: ;read the next commandas successful, write to console readok: call crlf ;new line mov cx,128 ;max 128 characters mov si,offset buff ;next to get wloop: lods al ;next character and al,07fh ;mask parity jnz wloop1 jmp ready ;for another command if 00 wloop1: ; notq: ; not the quit command, random write? cmp al,'W' jnz notw ; ; this is a random write, fill buffer until cr mov dx,offset datmsg call print ;data prompt mov cx,127 ;up to 127 characters mov bx,offset buff ;d2.2: check is ; shown below for illustration purposes. ; mov cl,version call bdos cmp al,20h ;version 2.0 or later? jnb versok ; bad version, message and go back mov dx,offset badver call print ; ;**************************************************** ;* * ;* Sample Random Access Program for CP/M-86 * ;* * ;******************************** line to the conbuf mov dx,offset prompt call print ;command? mov cl,rstring mov dx,offset conbuf call bdos ;read command line ; command line is present, scan it mov ax,0 ;start with 0000 mov bx,offset conlin readc: mo push cx ;save counter push si ;save next to get cmp al,' ' ;graphic? jb skipw ;skip output if not graphic call putchr ;output character skipw: pop si pop cx loop wloop ;decrement CX and check for 00 jmp ready ; ; ; estination rloop: ;read next character to buff push cx ;save loop conntrol push bx ;next destination call getchr ;character to AL pop bx ;restore destination pop cx ;restore counter cmp al,cr ;end of line? jz er jmp abort ; versok: ; correct version for random access mov cl,openf ;open default fct mov dx,offset fcb call bdos inc al ;err 255 becomes zero jnz ready ; ; cannot open file, so creat******************** ; ; BDOS Functions ; coninp equ 1 ;console input function conout equ 2 ;console output function pstring equ 9 ;print string until '$' rstring equ 10 ;read console buffer version equ !     v dl,[bx] ;next command character inc bx ;to next command position mov dh,0 ;zero high byte for add or dl,dl ;check for end of command jnz getnum ret ; not zero, numeric? getnum: sub dl,'0' cmp dl,10 ;carry if numeric jnb endrd you made a backup of your Control Area (Partition 0) Enter the name of the file to be erased (or press ESC to go back to main menu) --> Invalid input!That file is not in System Directory. You have asked to ERASE this file: This file is NEEDED by t mov cl,10 mul cl ;multipy accumulator by 10 add ax,dx ;+digit jmps readc ;for another char endrd: ; end of read, restore value in a and return value in bx mov dx,ax ;return value in DX mov al,-1[bx] cmp al,'a' ;chehese OS's: This file is NEEDED to boot these products: PRODUCT #%d (%s) ARE YOU SURE YOU WANT TO ERASE IT Removing file from System Directory. The ERASE procedure will take a few seconds. WARNING!!! DO NOT TOUCH THE COMck for lower case jnb transl ret transl: and al,5fH ;translate to upper case ret ; ; ; Template for Page 0 of Data Group ; Contains default FCB and DMA buffer ; dseg org 05ch fcb rb 33 ;default file control block ranrec rw 1 ;PUTER UNTIL THE ERASE IS COMPLETED. DO NOT INTERRUPT THIS ERASE!!! Erasing...... Erase is complete.͐Z!!9s#r*`! 9s#r!DMl`i#DM! 9~#fos#r`ib_ ! 9^#V#! 9s#r!ì#!! 9~#fos#rb_!! 9ˎ ͐Z!;!J;!;!I!I!;! ;! 9&DM*_|(!DMx8!M;I! 9^!(_Ix! 9Ͱ !9s#rzu!];! ͳ! 9 !9s#r!;!9^#V!7_!9^#V!9^#V͗!9! 9random record position ranovf rb 1 ;high order (overflow) byte buff rb 128 ;default DMA buffer ; ; string data area for console messages badver db 'sorry, you need cp/m version 2$' nospace db 'no directory space$'^#V!9^#V[Y! 9^#V^! 9~#fo#s#r+)!9~#fos#rÒU!9^#V͐Z!!9s#r*_!9s#r̀ ! 9s#r!!9s#rX!9~#fo#s#r!9^#V! 9~#fob_ !!9s#rÊ!9~#fo#s#r!9^#V!b_!!9^#V)))!9^#V!`ͩ^!9~#fDM|'!;!#PYb_')!9^#V!`ͩ^*_!9s#r!9^#V !ϒ;ُ!9! 9+DM|ʓ!ڒ;!U#PYb_ʓ)!9^#V)_^#V)! 9^#V! ;N!';!)I§!K;! 9 ![;! datmsg db 'type data: $' errmsg db 'error, try again.$' prompt db 'next command? $' ; ; ; fixed and variable data area ; conbuf db conlen ;length of console buffer consiz rs 1 ;resulting sizo!9^#V[Y!9^#V! 9~#fo#s#r+)!9~#fos#r{I!9^#V`i"! s# y """!9"*2(_U:1wˎuˎ(_|n:1wΎ*!9s#r*DM**!9^#V*u;!Γ;!;!9^#V!9^#VP !9^#Vv!!_ !_ !; This is the ERASE option. WARNING!!! ERASING IS A DANGEROUS PROCESS. IF INTERRUPTED IT COULD CORRUPT YOUR ENTIRE CONTROL AREA DIRECTORY. Do you want to continue Have disks 2 diskdef 0,1,26,6,1024,243,64,64,2 diskdef 1,0 endef e after read conlin rs 32 ;length 32 buffer conlen equ offset $ - offset consiz ; rs 31 ;16 level stack stack rb 1 db 0 ;end byte for GENCMD end "     ˎ ̢͐Z-!9s#r*_|!+;!9^#V '='!''͏_AELT 'ю ͐Z!"_!;!;!;!6;!c;!;!! 9!9s#r!c_9!9~#ʘ!Û!"_! 9^cZ PRODUCT TABLE MENU!9^#V!,^*v_ There is no room in the Control Area Directory for the new entry that this file would require.Z!9^#V!ͺ^! 9s#r!9^#V!9^#V! s#r!9~#1!9^#V! ^#V!9^#V! s#r!9^#V! ^!9^#V! sé@ !9s#r!9^#Vproduct %02x --> There is no file named %c in the Control Area Directory. I cannot accept it into the Product Table.͐Z!f;!;!!͉8^! 9s*_|r! 9^|! 9s#rz”!ʠ;!;۔! 9^#VZ! 9^!0;! 9^this:You have asked to modify this Product Table entry:The modified Product Table entry looks like this:Loader ProgramLogin ProgramOS Menu Program Would you like to see the list of possible product types Enter Product Type Number you want to add or  PRODUCT TYPE TABLE ͐Z!;!&; Product Boot Loader Login Program OS Menu ------- ----------- ------------- -------͐Z!9^#V^! ;!! 9s#r!9^#V#!9s#rã! 9~#fo#s#r! 9^#V!b_ !;!!  A - ADD/MODIFY Add or modify a Product Table entry. E - ERASE Erase an entry from the Product Table. L - LIST List the Product Table. T - TYPES Display Product Types for DMS equipment. Enter your choice (Press RETURN!,^*v_!9s#r!9~#!9^#V! ^#V!9^#V! ^#V!9^#V! ^+Ϳ]!9^#V! s#r!9^#V! ^#V!9^#V! ^+]#!9^#V! s !!9^#V! s#r!!9^#V! s!9^#V! ^#V!9^#V! ^!9~#fo+n^! 9s#r!)_^#V!j;! 9^!!9s#r!!9s#r!9^#V!;!ܡI! 9s#r!!!9^#VZ! 9^#V!!!*`! 9!_ Enter Product Type Number you want to delete. (Press RETURN to go back to the Product Memodify. (Press RETURN to go back to the Product Menu) --> The Product Type Table is full -- you cannot make any more entries. This is an unusual condition and may indiindicate a corrupted Control Area or a program bug. You have asked to add an entr9s#rؕ! 9~#fo#s#r! 9^#V!b_ !9~#fo#s#r+^!;ɕÔ %02x %c͐Z!!9s#r!Ǚ!9s#r!!9s#r!,! 9s#r!;! 9s#r!I! 9s#r!YIv!;!ɚ;!!͉8^!39s#r*_|ʧ!39^#V!c_ǖ!39^#V! to go back to Main Menu) --> ͐Z!v;!;!ё;!;!&;!e;!;!;!ʒ;!ݒ;!;! ;!;!6;!I;!\; Product Type codes for various DMS computers (Press any key to stop or r9^#V! ^!9~#fo+̓^#! 9s*Ϳ]+!9s#r! 9^#V!9~#fo^ʩ!S;!S;!S;x! There is no room in the Control Area for this file. You can make more room by deleting some files or by running EXPAND.`i"t!p s# y5"v"nu) --> There is no entry for that product type in the table. You have asked to delete this product type: If you delete this entry, machines of Product Type %02x (i.e. %s) will not be able to log in.AREare no Currently there %s machines of that y for product type %02x (%s). Is this correct Program names entered here should be eight characters or less. Press ESC to return to the Product Menu. Press RETURN to keep current choice.͐Z! 9^#V!;۔!9^#VZ!I %s Is this corb_͖!Ж!!9s{ޖ!9~v!39^#V|!9s#r!9^#V!(_!29s!29~ʆ!9s#r!(G_R!;!5;!m; !!9sÃ!39^#V)_^#V!59^#V!;!ߛI!9sá!9^#V!9^#V̀!9s!9~¬!39^#V!9s!;!estart listing) Prod. Type Models ---------- ---------------------------------------------- 1 DMS-3, 3/101, 3/102, 3/103, 3/4004, 3/4008, 3/501, 3/A25, 3/B, 3/F (Fox), 15, 5080 2 DMS-4 3 ˎ ֕͐Z!! 9s#r!!9s#r!f@! 9~#fos#r!fͻ! 9~#fos#r! 9~#c! 9^#V!;!; !p@!;!pͻ!;k!;̕!9s#r!9~#ʑ!9^#V!; !=; FOUND (%d) ERRORS IN THE TABLES. Atype in the Machine Table. ARE YOU SURE YOU WANT TO DELETE THIS ENTRY͐Z! 9"^!Zc ! 9! 9s#r!!9s#r_! 9~#fo s#r!9~#fo#s#r+!9^#V!b_Ȣ!9^! 9^#V!^! 9s(_ʕ!! 9^!b_Ȣ! 9^!(_Ȣ! 9^!crect͐Z!9^#V!9^#V!9^#V] !9~#!!9^#V!9^#V5Z!!<;̜!9^#V^!(_8!!Enter a file name (or ESC) --> ͐Z!! 9s#r!! 9s#r!9^#V!9^#V!;! !!9Z!!9!9s#rzŝ0;!29~ʁ!39^#V!9!!9^#VƜ!9U!39^#V!$9!!9^#VƜ!9U!39^#V!,9!!9^#VƜ!9U!9!9^#V̀[!^!!9s!9^#V!ͩ^*`!9s#r2!Z;!39^#V!9!9^#V#!9^#VƜ!9#!39^#V!$9 1280 4 3/C 5 86, 5086 6 5016 7 816 8 PC Adapter 9 16B A 808 B Apricot Adapter ͐Z*`! 9s#r!9s#r!! 9s#rΓ! 9~#fo#s#r+! 9~#fony key stops/restarts ERROR REPORT. THERE ARE NO ENTRY ERRORS IN THE TABLES. Found (%d) files that may not be needed. ͐Z!!9s#r*_!9s#r̀ !9s#r!! 9s#rÖ! 9~#fo#s#r!9~#fo`s#r! 9^#V!9~#fob_ʯ!!9s#r!9^#V!_Ȣ7!`i"d!` s# y٢"f"h"b!9"`*2̢(_:1wˎ.ˎ(_5':1wΎ*b!9s#r*dDM*f*h!9^#V*`. !! 9^!(_!!9^#Vs!!9^#V!9!9^#VͰ ”!! 9s#r!Ԟ;!!9s#r8!9~#fo#s#r!9^#V!b_ʄ!9^#V!9~#fo^! 7_ʄ!9^#V!9~#fo^!;)!;!;! 9~#n!9^#V Enter name of the %s for !9^#V! !9^#VƜ!9#!39^#V!,9!9^#V!!9^#VƜ!9#!9!9^#V̀)!,!!9s!9~ʆ!!9^#V!95Z!29~~!9^#V#!!!*`! 9!_ The Product Table entry which you have created looks like s#r! 9^#V!9~#fob_! 9^#V^!9~#fo7_æ! 9^#V!9~#fob_! 9^#V!͐Z!;۔!9s#r*`! 9s#r!! 9s#r~! 9~#fo#s#r+! 9~#fos#r! 9^#V~ʲ! 9^#V!9~#fob_ʲ! 9^#VZV!ٔ; #     ! 9s#r!!9s#r!9~#fo#s#r!! 9~#fos#r!9^#V!b_ʬ!9^#V)))!9~#fo~ʬ! 9^#VͰ ©!9~#fo#s#r!9^!p(_ʩ!9^#V!(_ʀ!;!;!;! 9^#V!9~#fo#s#r!9^#V1אu!9^#V These en9~#fo+s#rs! 9~#fo#s#r.! 9^!9~#fo#s#r+s! 9~#fo+s#r.͏_ V!!W_!9s{R1!9^! (_r!9^! (_~!Ͱ!!9^!(_ 1Enter Password: $ $^C$ $͐Z! 9^#V! ݐ!9^#V!9^#V͚"ߖ|!"ߖ Sorry, this program requires BIOS 2.248 or greater. Sorry, your system has an old style password table, to upgrade to the new style run the password utility PW version 1.1 or later. GetPW called with bad utility nPUTER UNTIL THE ERASE IS COMPLETED. DO NOT INTERRUPT THIS ERASE!!! Erasing...... Erase is complete.Z!!9s#r*_! 9s#r!DM`i#DM! 9~#fos#r`i^ʍ! 9^#V#! 9s#r!.#!! 9~#fos#r^ʊ!! 9ˎ ͐Z!;!R;!~;!! 9!9^cZO(_8ͨ To list the OPERATING SYSTEM TABLE type 'O'. Any other key starts list of Control Area Directory. (Any key stops or restarts listing) --> ͐Z!;<*_DM!tries in the OS table refer to non-existent files: OS Filename Missing Files ----------- -------------͐Z!9^#V!Q^(_U!;!9^#V!(_}! 9^#V! !;!9^#V!(_ʕ!;!9^#V !; ͐ZWPSWDCORE Version 1.1ac; !!9s!39^#V)T_^#V!59^#V!%S;!aI!9s#!9^#V!9^#V!9s!9~.!39^#V!9s!rS;!umber = %d Automatic Password checking in effect ͐Z*|&!!!!!%! 9!"!͐Z!!!P[YL!!SB0000͐Z!9^#V^!_! 9s!9^#V^!_!9s!!9^#Vn_s!!9^#Vn_s!9^!^#V!9^#VX‡! 9^#V^! 9~#fo#s#r+)!9~#fos#rÊד!9^#VZ!!9s#r*|_!9s#r̀ ! 9s#r!!9s#rڔ!9~#fo#s#r!9^#V! 9~#fo^ʌ!!9s#r !9~#fo#s#r!9^#V!^ʉ!!9^#V)))!9^#V!`,^!9~#fۏ#+`iDM`i~`i^!7_b_!3;Ǐ CONTROL AREA DIRECTORY %x ͐Z!;U!*_DM_`i`DM! ^!9s{ʛ!9^!7_ʛ#+!;W OPERATING SYSTEM TABLE %x !!9s#r*`!9s#r!9s#r!! 9s#r! 9~#fo#s#r!9~#fos#r! 9^#V!9~#fob_!!9s#r!9^#V#! 9s#r!!9s#rr!9~#fo#s#r!! 9~#fos#r!9^#V!b_! 9^#VͰ !9~#fo#s#r!9^!p(_!9^#V!(_!S;!29~!39^#V!9!!9^#VH!9ח!39^#V!$9!!9^#VH!9ח!39^#V!,9!!9^#VH!9ח!9!9^#Vݗ!!!9s!9^#V!,^*_!9s#rô!ܛS;!39^#V!9!9^#V#!9^#VH!9ʥ!39^#V!$9__!9^#Vn_s! 9^!__!9^#Vn_s͐Z!!!9^#V[Y2!!!9^#V[Y3! 9^#V!!9^#VW! 9^#V!!9^#V#W! 9^#V###!9^#V##W! 9^#V //////͐Z!9^#V!c_!9^#V!H_ē!o!9^#VX†!9^#V! 9~#fo#s#r+)!9~#fos#rÉ˔!9^#V`i"(!$ s# y¢"*","&!9"$*ͫ^ו:wMMͫ^:wP*&!9s#r*(DM***,!9^#V*$`i"T!P s# yϐ"V"X"R!9"P*2(_:1wˎ$ˎ(_+:1wΎ*R!9s#r*TDM*V*X!9^#V*P$&;!Q;!|;!;! 9^#V!9~#fo#s#r! 9^#V!9^#V˔!9P!9^#V These Product Table entries refer to non-existent files: Product Missing File Needed For ------- ------------ -!9^#V! !9^#VH!9ʥ!39^#V!,9!9^#V!!9^#VH!9ʥ!9!9^#V«!î!!9s!9~!!9^#V!9͸Y!29~!9^#V#!!!*_! 9!~_ The Product Table entry which you have created looks like !9~#fo+s#r!9^#V!Q^)!9^#V!<^!9^#V! ͩ^^^_͐Z!! 9!9^#V5Z!!9s!9ͪ!9!!9s#rf!9~#fo#s#r!9^#V! b_ʦ!! 9!9^#V! ͩ^[Y£!9^#VW!͐Z! 9^#V~! 9ˎ ˎ`i"!s# y؎"""!9"*2ˎ(_ :1wY-Y(_4&:1w\*!9s#r*DM**!9^#V*-͐Z*o!"ߖ*i^!0b_ʑ!;!"ߖ:o&7_ʬ!;!!9^#V!G_̏!9^ you made a backup of your Control Area (Partition 0) Enter the name of the file to be erased (or press ESC to go back to main menu) --> Invalid input!That file is not in System Directory. You have asked to ERASE this file: This file is NEEDED by t---------͐Z!9^#V!(_! 9^#V^)_^#V!9^#V^!n;!;!9^#V !9^#VZ!;m!;m!;m!;m͏_9DO. %-2d - %-22.19s No good reason (*BUG*) Boot Loader Login Program OS Methis:You have asked to modify this Product Table entry:The modified Product Table entry looks like this:Loader ProgramLogin ProgramOS Menu Program Would you like to see the list of possible product types Enter Product Type Number you want to add or ^#V^!aG_! 9^#V^!zH_! 9^#V^!!9^#Vs! 9~#fo#s#rð͐Z!Ͱ! !9^#V!9^#VZ!9^#V! 9s#r!9^#V! 9s#r! 9~#1!!W_! 9s{`! 9^!Ͱ! !Ͱ!! 9^#V!9~#fo7_! !#V!b_!9^#V!;!"ߖ*i^!1G_P!!!2W!9s#r!9^#V!^!7_P!͑;!9^#V! 9^#V!^͚"ߖ!9^#V!͚(_q!"ߖ!! 9s#r! 9~#fo+s#r#|!!9ª!"ߖ!9! 9s#r!7_hese OS's: This file is NEEDED to boot these products: PRODUCT #%d (%s) ARE YOU SURE YOU WANT TO ERASE IT Removing file from System Directory. The ERASE procedure will take a few seconds. WARNING!!! DO NOT TOUCH THE COMnu Program͐Z!`i"h!d s# y"j"l"f!9"d*2֕(_:1wˎ8ˎ(_?1:1wΎ*f!9s#r*hDM*j*l!9^#V*d8$     modify. (Press RETURN to go back to the Product Menu) --> The Product Type Table is full -- you cannot make any more entries. This is an unusual condition and may indiindicate a corrupted Control Area or a program bug. You have asked to add an entr32vÊG :t3>uW&2nuÌڻ r P6 PrF0t F0uBF;Ft86 Pm6  P_6 PQ NvFF%vFN%3vF+F3ҋ]UV6vv]UfN V N]U^u% u,G;G}5w@2G<tQ< tX]À'*>u:uX 2 úf t  ts3t "$ $U rUڻ1 r= >u3>t à"$ Ģ  똀s&ؾG3> MC$FF:u!>>u>s[S` t[Sh[^Cuڹ]t r^ 12M3һ ڋ;u uy for product type %02x (%s). Is this correct Program names entered here should be eight characters or less. Press ESC to return to the Product Menu. Press RETURN to keep current choice.Z! 9^#V!1S;]!9^#Vܔ!6I %s Is this corǦ63àstpS[ruSG [=tֻW  td .dS>u!t&uQR ZY[x3CM$ Z!! 9s#r!! 9s#r!9^#V!9^#V!)S;! !!9͜Y!!9!9s#rzGMu }pَ>ptstp<t4<s>ut's0<u G :u G 8quG 8ru]r>utlOhOap<upP<u?:u6r.qv:O u :o u:W t <u :utu&G M>v0 u3vF3vFFFvF%@FFN t v PP1  6 6 D6 D 36 D6 DDFFvVVrF%t:P $1=D:RANDOM.A86[OV] $1=D:SINGLES.DEF[OV] $1=D:TBIOS.A86[OV] $1=D:TRACK.A86[OV] . ; ; END OF COPY ; C"CY'V6h&^W>h& _P䆨t SQ=Y[` X䖨䒨 t䚨@t uta t$t$ta$3䖨$䚨 u 䚨@t愀3ttP3$<Xt2VQ Y ^Ê F t !! 9^!ͫ^i!!9^#Vs!!9^#V!9!9^#VͰ !! 9s#r!VS;!!9s#rú!9~#fo#s#r!9^#V!^!9^#V!9~#fo^! ͺ^!9^#V!9~#fo^!pS;ë!sS;!S;! 9~#!9^#V Enter name of the %s for  ûv8G uG ÉÉø6fXHH$$|$$wsYt S[Cò2VWF77 mu[_^Ã?u[Sw˷㋟[ڹ$Q0=9vGY؎<uP  6 6 D6 D6 D EFFvVV PP|  6  6 D 3RP6  RP XZ6 D  6 +D 6 D F6 D6 DPP  6 6 D6 D 6 D6 UFFFbPPPP~uJ1PtPPPPPv F uv4vVF~ ~ ,P vv]UFFFFvFPvF%uvVPPFmKPGv| tsFtt tC<u. <u.$."tàa$*`u2S@[Ê`SÀ:au[È`[2@Ê`À:a Ê&tÍnQ Ys ڹ 6&>;;-LQ8*.0DRK.OXo \w!&6ih$äMËuCCCCCseS>nڋF<r&x&؊D z󤿈󤿂P$8G uG sp/X<`u/P7r$:XutYðrf&O&OAus@r sðÁG ++6@3ñÊ%:u;u;u :uڻy t6Ʀ>P={P1oP%cPW P KLP?vyP0P$PFU:." ]U PvvFFFHFF u6 FF0 t F0 uF0u9FN t,6 P6 t2u  Á>u;s >u  >tà r%ڻG rt9 >nuڻ& ruJ  r#ny rnu Q/+>| VUP2X]^UW_]ˌȎ؎м&؎646666 6 6 >  643ڹ @5GG&FF&GG) RA lȣj %     Q3Y'uA[YZ^_}..&. ϢoP䀰悰䀀>uW>䀪QItSR䂨u䀰悰悰 >u/>4:u 4$t W\VOZ[Y_XϢu YZ+ы3Ì>#þËbôv؃' t ڋيOW_YSm!JT&ymr(3}#؎ŽعhjsuÌڻs #OPX t$#tt u >u@GTHIS IS A HEADER*# w# w# wc ͭ!8 G͙(O#:#* ͣ((O (\(6(O 8.(&0@G #?##w^#U#ͭ!R(  i/o error loc: num: cmd: typ: vol: par: trk: sec: *** waiting at location:ru uڹlhjVW‹= _^‹ٹv&CC&؎‹@HG 5G5G58@HPX`dhlptx| à>t à}SR@s uZ[ ÌڻZ[SR5s t uNiȰDZ[3ø tPt4 à$33tâڰ 2 t&̀SQR<t >uPXY^ tution is Read Only. Partition is already owned by you on another drive. Partition is owned by user named . You don't have write ownership of it. Write attempted to partition locked by user . Illegal interrupt called at 0000:0000#,5BIPW`#,5BIPW`#,5BIPW` جN 4$t>tuA>&<u6Vp$WE>t8&     +s t S[Cò2VWF77 -u[_^Ã?u[Sw˷㋟[ڹ$Q0=9vGY؎<uäMtW> GG;t CCCCC_uCCCCCses1>t ts3t "$ $w rUڻS r= >u3>tà"$ Ģ 똀s&lG u>]s[Sa`[ t[S[^Cuڹ3 r4ࣳ2MQ3ɻ 7u.ۡ&;u&;t u Y ً;u;u"MZ T ڹ3 t$ .$~S>~u!~tv&Z;s3]ËFFЉF]U3Fv% tvuF3~U>FvDFvvVV%tF%O]ËF]RETURNNETLOCK version %d.%d%c Please use the following conven.ڋF<r&M&c؊D O]WP_$fp8G uG 30 X<`u/P7r_$:fXutYðP&&O&OAyu]s@r sðÁ]yzQ3Yb's++6su@3ñmozÊrmo%q:u;u;u :uڻZ! t6oZ!>su326ÊxG :t3uq &x2(& _P䔨t SQ=Y[ X䖨䆨 ttion when you enter a lock string To lock a file, enter the file name and file type. Separate the filename from the file type with a period. To lock a partition, enter the partition name. Enter your lock string: Your lock string is too long. *** T u%y&&O &&+OI&OMB3‹&G<rÊp3È-ÈáÈ.ð8ÈcCO؎]^_`abc2 rMNڻNڻ]r-^.uÌڻ5 roZ!6su3à340S[ruSG [tֻ  0t340<t4<s>5t'tà!$* u2S[Ê SÀ:!u[È [2Ê À:! Ê&IÍ.Q6 Ys ڹ 6 >t2u Á>u;s >u  >t  MLVUP2X]^UW_]ˌȎ؎м ؎646666 6 6p x>  643ڹ 5GG&FF&GG (A ,ȣ* R9u NN$t w$t$t2 F ~FFEFEFE~iFFvD3۹%u؋uSmp!qs uT&ymr(3}؎Žعs>jsuÌڻs OPX t$tt u >uàs0<u G :u G 81uG 82u]r>5tlOhOa0<upP<u?:u62.16:O u :o u:W t <u :5t5&G M> û68G uG ÉsÉuø6&XHH0à r%ڻi  rt9$ >.uڻ 2 ruJ? r#n r.u*>u:uz 2ú ؾ3 M$FF GGGG33> t    g 3t$cOVS r5_$&:8FV^F;+~#=t^FVt^^Ff ~F%-?=}#=~)F-8yV^F 3~EUv%t"F%vF;u NF]3]U~v3]ËF@%FFPF+3'     q>t à}SR@s uZ[ ÌڻZ[SR5st uNiȰDZ[3ø t裀Pt|4 à$33tâڰ2 t&̀SQR<t >uPXY^ tu جN4$t>tuA>v&<u6Vp~vx~~$WE>t8>uA[YZ^_}..& y d000000 40 gios16b cpm86 pdriver  y p a n 9 y phase2 login86 login86 y q FtF uv~vv~~D+EtyEȻYKKyً3x CC%CCE y3artition is owned by user named . You don't have write ownership of it. Write attempted to partition locked by user . Illegal interrupt called at 0000:0000 Please reset the computer ~  u    KviKviKviKviKviKviKviread write re.ϢoP䀰愰䀀>uW>䀪QItSR䄨u䀰愰愰 >u/>v4:u4$t WZVM.tZ[Y_XϢPQW3`ëGG_YXCC1Wp^~NF uF vFVvF33SS0vFV vF3SS y ؃πvRP0CPS~F tFuv~vvzv~q3SSSSSS_9! . t.] .]ad1k spool assign who timedatehd stat net infolock unlock Sorry, no room for spooling... Print file has been spooled. 71a  3 System call made is implemented on the DMS-816 only tþn t8QV<ZYQ t-RQYZ u#so>ou omYZ+ы3Ìu>smoþË"ô6؃' tfu uڹ,(*CCsCCtڋF-0@FFދF3FF܋[~8" " " " Fuv~F uFFF F ~ v[Y3PPPPQS v5Qv~;rwNNOOv~FFGGvFFYċF-?)FF1FvF RPvv%XZFV uF t -NvFփ!+F3҉F@PvvF]UFFAFvVvVV%t]3]PSQRVWUfF]_^ZY[XÃFFvDFDFDFFUF4%]U~v3]ËF@%@%, VW‹ _^‹ٹ6&CC&؎‹PR ttgtu3u-Jt>u4> u &&MZXP&&MXϐ(     ~v~[ &nv! y2y:}!ĹR9u NN$t w$t$t2 F ~FFEFEFE~iFFvD3۹%u؋8FV^F;+~#=8u GDGD3)#### 2*#Ê)##9t!sUG;u E+GE@ܰËG;EtsE+GEEEEEE)##À>)#t#uñ$'#>)#st QD+Gu  D##!S)r 6ٷ. #<uU###jS$A##YPQ'#(#26$6$#>$$YXQ!Q$YPQ(#2$#>$>$YXñ"##ȎS"[PS\+\E+E;v[X++" "<tft')8o G( uW{ '>( u: tȢ9 1 t̠9 >0 t30'u=@t+؎%: S'[7G\'! t tqt9 L 2tVP 3. zC/5 ñ uñ ñ3 uð 9  u< sW; _Ê<u< tFC QYtC<*u?FtFø'S: 65 t^FVt^^Ff ~F%-?=}#=~)F-8yV^F 3~EUv%t"F%vF;u NF]3]U~v3]ËF@%FFPF+3Z;s3]ËFFЉYQVW*#Ȣ*#*t2ɋ_^YRW3ҵ:*#sD;rЊt _ZRW:*#sD+Gtr;sЊ߰t _ZËGSFF[UQ;r F;FrY] à*#*#+#URQ;uF;FuYQ<u"|t>D"|DtD"Q8RZY>$t1Q6Y"9DsD8\|t Ts [T t)"7T>$t5H;"wױ7="+,>###;uE# "8t ðÀ>"u "ډ"ð|t.|t\;\v+\ < tN tſ&E.&E.*. ?t.0 (, : uhCMD$$$ SUB67 t@|:t9 <w<w[9: FF<.uFC365 [ C??u ÿD (tKuÊ< uÌK5 .> u. 0 >,. 0 Q$ТX$9 .> u0 AsA+>&_9 .F]U3Fv% tvuF3~U>FvDFvvVV%tF%0]ËF]NETUNLOCK version %d.%d%c Please use the following convention when you enter a lock string to 2G)D(F+Fu +D+DF+F؉DYZ]ËGDEQRVSh/[:s Eu^ZY UVQ'#:*#s ;s F;w;FsްY^] U'#:*#s +Fu] U'#:*#s F+u\UUðTTÃ|tDD"">"u """, "<t<u"|uD< u ÃpuS5[T"ÃË%sá$##"$"$"ʱ3 ">$tuMT"p "Q?t$GOQp  =_.:;<>,DIRSUSERREN TYPEERA DIR NO FILEALL (Y/N)?FILE EXISTSMEMOR> ;t׋65 tu+: tE>( t5H ؋⹐ \ 7 < t tS[C?. t: u̻( ? u!Ê< t'C,0< suűrrruÀ? uCuûK؊': t$Ȼ9 :t: t Ȼ9 :uà9 be cleared. To unlock a file, enter the filename and file type Separate the file name from the file type with a period. To unlock a partition, enter the partition name. Enter your unlock string: Your unlock string is too long. The lock string was ] û" u%l rPX< t< t < t<t< à" uKD$t8<u:1<t2">#u $$t>#u H&"à" uQYQYQ>$tY"<t< s t<u< uÊNs P^Y@ u "$u u€YY Ў"$0"&E "8t 0D&ED|tD&&e&>"u &e& ƒv"$$"$"$#<t >#wh##$%$ڊOW[3ۊ؁%$Y NOT AVAILABLEREAD ERROR CANNOT CLOSE NON-SYSTEM FILE(S) EXIST SYSTEM FILE(S) EXIST *.$P.&'#.#PX.#.&'#XÐ$##$$>$ t  > t /.  u(? u ?CuR)uuȊȰ Es u p t bZR$PuzQYAj:e^:[V$< uXP<u $< t 5ŀ s u$XI*! COPYRIGHT (C) 1980, DIGITAL RESEARCH #":"s u n i<$tAQY""$&CSQS[Y< u< t<u t͠""Q<u t&K|<u QS"<u$<u["":sG<uK[~<u5Q?Y[SQ tC&QS[YS" t*"" "uC&QS$%#$.#>#GEE)#u >*#tsunD9GrGSyuX:*#sMHuD+9GrG-Su2u-kAu :*#suCn*#G2$ËG"""uσtlutc<uutGE&c%  ' ! !!!!!(!.!4!=!F!X!a!g!m!s!!!! WvD" $J Ȏ؏$t r$$&$>$tȎм$$$&_tUWV%#^_]%#$&$$$ω$#3$'#u`Z. u!d  tC?YtC5 >( tg'HuL. uJ>( tCetr S#[uCJ<tS[uuE. :u: PtU'765 <=t<_u5F65 u+X:  t:ň/u/'͎ñ3б QYð Q[ uCS[';20 빱:뵱 뱊бñG'tù رԺ's ñ' V#`u$G $u#~Z$$$??t??t=$$$$)"&$$J"" nl"$à##t u u:uGڋ;u3BCBCu¹هً:rهي #$6$$"U$t$ڱ2Cu ڈy2 # t 3"Ë# # t߻"o$###6"Rȋ6" #JY #T@"#*#Ë$ـ>#tًȵ#Ë# Ê"###"" ؉#Ë$ ú$#ڊ#""##<ur! s#r!!9^#V!(_CE!`in_s!`is#r! s#r!`i~#TE0F! ^#V!(_ʍE!!9! ^:P(_D!9^#V! ^#V`is#r! ^#V! ^#V! s#r!`in_s!9^#V`i~#fo#s#r+s!_͐Z!'`DM`i~F`iþà)È)û*+PX$_ ) )^u!u<uðÉ )É )ûI+û*Êt S[CòX"#À>#t$$>#`uO# t ##>'#uSꡛ$#cuL 6$$ t* : $ $t""" #t &$t&!u #tut 2"#4# #w#:#r$u t y]# #$(###t2#ڠ#ù"2CQ$Y á"$$Ë""#B" ڊs "t"*"#Ë$ Ë$";rBR+ӋZñ##sQO#"Yt :t s_È3$ $ DM`Ͷ_F!E!`is#r! s#r! s#r`i͐Z!9N#F! ^KTfF!! s#r`i! s#r!-V!9s#rzLF!! s#r!`in_s!9^#V! s#r!b,s# y°F*"ʎ*`"4F`F͐Z!!ec!5Z!:o&9~#fo#s#ruw#eArA!&`>^)|چAg,~As+=yAZ!A~*`+"`w!#`rA#¨A*`A+6-0123456789ABCDEF͐Z!'`A͐Z! 9N#FGB7_CB!؈؉C>$tÈ #>#uE> #u>6#>"3@### #Ê6""C:u###:rP$X<u>#u_Y$ uȢ#H#Q$!ڊ$PC$Ȋ$XC ۳ui ڈ ڊ*u ڊ " "$$~û$C:uû$Ë#$C$ds䠦$$QY# u&QYLр"ڊR$Y QȈYQZuR>#tQSQCS t ";r[CYϋ"Cˋ"C#""25_ecs!H")c!ecDM!"c*cb_ʣH`i^! (_EG`i^! (_MG`i#DM)G`i~ʣH`i^!>(_kG!G`i^!<(_TH!`i#DM^! (_žG`i^! (_ʡGG`i`i#DM~G`i^! (_G`i^! (_G!`i#DM+sGæG K|G!͆I H!_0B`i~#fo+s#r!`in_s!A͏_-B -B BCB͐Z! 9N#F! ^#V`i^#VͶ_C! ^!_|B!!`in_s`i~# B0F! ^#V! ^#V! ^=MH_B|B!B!`in_s!! ^#V`is#rBdos Err On : $Bad Sector$Select$File R/O$*$t#`u$"u"3ۉ""$$N{>$t ##<#u#>#t#K$#`$Iau6$6#NT =t4Ok- t IRQ)sYZ;"sBQRsZY+[Z u̻ñ R$Y[ $u kt UtPSڋ$ RZ ڊڊ/[X:tr*     + KH! 9~#,I!W_,I!0ITFA:$$$.SUB͐Z!"/!͐Z!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:͐Z!9^#V!!9^#VͧI͐Z!`!! 9s#rI! 9~#fo#s#r! 9^#V! b_Inf:I(_JI!"[]]ú]ͬ[]]ͬ[]ʺ]]"c!"c"c|"^!"c*cz^^|_}t^}z^^|_||i^/g}/o#zt^/W{/_MD!́^}y/Ox/G>))Ғ^, ڣ^}o|g=Š^=Š^DM!>))ҹ^ =±^}{_^|^|7g}o^{_^)^}{_^|g}o^`|!=!9}_|#W"ʎZ o&Z 2a:b _Z :a_!9dY!9F+N+V+^+~+ngxʂY‚YʂY# mYog!9V+^+~+ngwʠY#ÕY|!9øY!9F+N+V+^+~+ng対Y#YxYwY# Yw|!9^#V#n~YY#Y!|(_+T!"/!!!Z!"#f!*/|7T!`i"#f!! ^#V"%f!͐Z! 9^#V)))`^Z!rTZ"*b!"b*b«T*b!4T#4*b+"b}sTʻTʻTo&"/*b͐Z!9!69^#VWDM+Y!9!WDMDY`i(_U!_!$ s{O`i!~#fo#s#r!͐Z: e‘O!}2e!}2!e}2 e!e! W! !W:!eo&(_tO!}2 e!:ao: eo#}2 e&e#s!"!f: eo&DM!9~#foc_ʱO!9^#VBK!9^#V*!fe5Z`i*!f"!f`i: eo͆_}2 e`i͐Z!9N#F!P#/!!o&zo&|t_}|>o&|o&}/o|/g#}}o|gBK^#Vz_#yʩ_###×_#x¤_#~#fo}|>?o&}|>o&'-6K_hp{-f 0-r!9~#foZ# Z}!9^#V#N#F#nx3Zs# (Z! 9F+N+V+^+~+ng_ZUZ}_ZaZ +!9~atZ{tZ o&!9~AڊZ[ҊZ o&DM!99`i͏Z|DM!99!Z`i~# xZ!9Zb~#Z!ZZ|"/!!͐Z!9N#F! ^#V+))!9s#rͅU!9^#V-V|ʁUPY7_ʁU!9^#V!9~#fo_oU!9^#VwU!9^#V5Z͐Z! 9^#V!##~#ʨU!!'fDMùU! ^#VBK`i_U! ^#V_ V! ^#V`iͶ_ VPY_ V! ^#V!9~#fob_6P! 9^#VW`i#DM+s!(_6PO͐Z! 9^#V)))`DM!9^#V!9^#V! ^#V! ^)a^#V͏Z͐Z!DM!9^#Vn&&+Y$~Pn$&!͆_DM!9~#fo_P!9^#VBK!9^#VͼQPDY!!9^#V`i͆_! 9^#V͐Z! 9^#V!b_2K! 9^#V! c_w#t[!c~]#ƒ[ú]=ɯ< c!(cO~÷[ c!(cڐ[”[+µ[c!%c#[c!%c#[c!%c#_ VðU! ^#Vsr! s#r`i"+f!͐Z!9^#V###^#!9s#r*+f|_V!'f")f"+f!'f*)fDM{V`i! ^#VBK! ^#V`i7_V! ^#V`i^#V))PY(_V! ^#V^#V`i~#fos#r! ^#V##^#V! s#r{V`i^#V!9~#foͶ_sW`i^#V!9~#fo(_ W!^! 9s#rzdQ! 9^#V!9^#V`imT!9s#rzdQDY! 9^#V!9~#fo͆_^PYDM|aQ!`i! 9^#V!^PYDM`i!9~#fo_ʰQ!9^#V`i͆_!9^#V`iͼQʰQDY`iDY!9^#V͐Z! 9N#FͲSb_Q!!9^#V!$ ^!!9^#V5Z!(_LY!9s#r!9^#V+Y!9^#V!_7L!W!W(_}L!9^#V!_mL!W(_zL!"/DY!àL!9^#V!_(_ʠL!"/DY!!!! s#r!# s!$ s!9^#V!& s`i!9^#V!s#r!9^#V!_#!% s!M!9^#V!s#r!9^#:I:I:I:IJIJIJIJIKTI$aYI$a^I*acI*ahI*amI*arI*awI*a|I0aI0a6a:IM!OO :IPRR 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@ [c!%c# \c!%c#!\!c~/w#1\:%c?*c*c))O\,=G\"c"cb\: c:%c?\W! c~w+s\l\!Nyq[ć\%ć\y\n[ć\y%ć\\!c!cw#\n[\\!c!cw#\!!cw#\> !c ^#Vsr[W!9^#V))PY"+f*+fut! ^#V*+f##s#r`i^#V!9~#fo͆_*+fs#r!9^#V`is#r"+f!! s#r`i`i'f(_ʹW!XDM(_ʕW!!`is#r!! s#r`iͅU!'fDMmVZWZ*bDM*bogZWo&Z*b*+++*bDM*b!"W"/|R!!$ ^!9~#fo_!$ s{FR`i!~#fo#s#r!͐Z!9N#F!9^#V+#|ʟR`i^! (_ʉR! !W`i#DM+^!WaR!9^#V͐Z!9N#F!9^#V+#|R`i#DM+^!9^#VWÿR!9^#V͐Z! 9N#F!#V!_MRDY!͐Z! 9N#FͥS!W!!% s!͐Z! 9^#V)))`DM!9^#V!9^#V! ^#V`i^)~a^#V͏Z͐Z!DM!9^#Vn&&+Y$~Mn$&!͆_DM!9~#fo_M!9^#VBK!9^#VͰNMDY!!9^#V`i͆_@@@@ V "!" Sorry, this program requires BIOS 2.248 or greater. Sorry, your system has an old style password table, ~w#]O!c!%c#]y0]!c4=\=a]!c~w#<]O!c!%c#O]y0]&]!c!%c#j]!c!c~6#}]> !c~w#]ҭ]c!%c#¤]=‰]͘[]!͘[ʺ]!<͘[]ú]͘[]]ú]͘[]]͘[]ʺ]]ͬ[]ú]ͬ9N#F#^#V X X Xkb6#> 6 #= X>6#=)X XJX0_zW4X/TXWX : >‚X AڽX[sX@XaڽX{ҽX`w# .ʝXʶXʅXXw#ÆX{o|g ʶXXw#§X&jz!|*X >?a{ 0:X7!9^#V*`Y*ʎ}|Y*`"W`i!~#S!!$ s!`i!~#fo+s#rͲSy!9 00J:!9^#V^!9:!9s!9^#V^!9:!9s!!9^#Vn&9:s!!9^#Vn&9:s!9^!k;A:!9^#Vn&k;s!9^!k;A:!9^#Vn&k;sJ:!!!9^#V͢Zʸ!!!9^#V͢Z¹! 9^#V!!9^#Vא!  title 'Track Buffered BIOS - SBC204' ; 5 Jan 82 -jrp ; Copyright (C) 1980,1981 ; Digital Research, Inc. ; Box 579, Pacific Grove ; California, 93950 ; ; (Permission is hereby granted to use ; or abstract the following program in ; the imperating System Table͐Z!9^!A(_!9s!!9^#V!9^#VZ!9~-!;!;!;5!%;!R;!9^#V+!9^#V! 9s#rzu!9^#V^!(_y!!9^#V'! 9!9^#V!9~R! 9Ͱ ǚ! 9ͦ!IĚ!<!9^#V!1;!9^#V!!9!9^#V5Z!DM!8;!9!U;!;! !!9Z!! 9c_\!;|! 9^!(_u!!9s! 9!9s#r!9^#V^cZ! 9~#fo#s#r+s{ʶÊ! 9̀ !!9s#rzʮ!9^#V! 9s#r!9 !#9s#rz@̀ 0G_!;!;ỳ `ͩ^*_!#9s#r!9!9!)9Ì!!'9!95Z! 9^#V!|9s#r!@!>9!'9^#V!5Z!9!'9͕́!!9=M#ȐG[͍\8^9^#V!!9^#V#א! 9^#V###!9^#V##א! 9^#V //////J:!9^#V!:E!9^#V!ͩ:I!!9~#fo+s#r!9^#V!:)!9^#V!o:!9^#V! A;^s;9:J:!!9^#V!9Y!! 9s!9.!9́!! lementation of CP/M, MP/M or ; CP/NET for the 8086 or 8088 Micro- ; processor) true equ -1 false equ not true ; Track buffering equates... host_sectsiz equ 128 host_spt equ 26 host_fsn equ 1 bdos_int equ 224 bios_code equ 2500h ccp_o! 9 !;!Ϝ;!;!4I!!9^#V!X;!!!9^#VͧI! 9s#r!(_O!9^#V!};!Ø! 9Ͱ !;!ϝ;! 9N!;!! 9s#rØ!! 9s#r! 9^#V!(_! 9^#V What is the nam! 9Ͱ !!9!9! 9ͦ !!9!95Z!DM!;!DMx!9!9>5!ۘ;<!9^#V!;!9a!DM!9~#-x-!`!#9!#9^#V5Z! ;!9N!3;U!9^#V!5;!!9! 9s#r!9~#!9^#V! ^#V! 9~#fo(_!!!9s#r!!9^#V!'9!9Ԣy!9~#q!9~#9!В;q!;!;;!p;!9^#V!9^#VP !;!9^#V! 9^#V!9^#V!98!9y!9^#V!9^#V̓!9s#rzy!99s#r! 9~#fo#s#r! 9^#V! :*!!9!9^#V! A;͢Z'! 9^#Vے!J:! 9^#V~ʔ! 9^#V^!aͨ:ʂ! 9^#V^!zͩ:ʂ! 9^#V^!!9^#Vs! 9~#fo#s#r3J:!!9~#fo͍;A:!9^#V#!9~#fo͝;!9^#V <9:ffset equ 0000h bdos_ofst equ 0B06h ;BDOS entry point csts equ 0DAh ;i8251 status port cdata equ 0D8h ; " data port lsts equ 41h ;2651 No. 0 on BLC8538 status port ldata equ 40h ; " " " " " data port blc_reset equ 60h ;reset se of the file to add to the Control Area Directory? (Use the full CP/M name in form filename.ext) Enter the name of the file entry to modify. (Press RETURN to go back to main menu) --> Do you want to overwrite it That file is not in the Control Are!;I !9!#9́!W;U!9^#V!;!!9DM!DMx*!`!!9^#V!%95Zf!;!!9^#V!95Z!9^#V!!9[&[!9^#V!9^#V!s#r!_ !9~#ȗ!;̀ !9s#r!9^#V!!W!`*_! 9!!;!9!9͔!9y!Г;!!9s!9s!!9s!9s!9s!!9^#V!95Z!_ !!9~#y!;!`!%9^#V!)95Z̀ !!W!`*_! 9!_ K There is no room in the OS Table for the entry that this new OS J:!}2/J:!}2/J:!"F͉: !"!"!!!9s#r! !!9Z!!9~#fo+s#r#|ʬ!9!9!19^#V!19^R!9!9s#r!9~#ʋ!9^#V!:ʔ!9^#V!!9©!1!9!9!19^#V!19^R!9J:elected USARTS on BLC8538 ;********************************************* ;* * ;* Intel iSBC 204 Disk Controller Ports * ;* * ;********************************a but it does have an OS Table entry. This is an unusual condition. If you proceed, the new entry will replace the old one. Do you wish to proceed You have asked to read in file %s. Can't find the file (%s) to be added. There is no file in the _ *SERIOUS BUG* in modify, can't find file in sd any more This is the entry you have chosen to modify: %02x What is the new file name? (Press RETURN to keep current name of %s) (Press ESC to go back to Main Menu) --> 8 characters max! Thawould require. The new file will fit exactly on top of the old one. Erasing the old version of the file. WARNING!!! DO NOT TOUCH THE COMPUTER UNTIL THE ERASE IS COMPLETED. DO NOT INTERRUPT THIS ERASE!!! Erasing..... Erase is complete. Copying file %!!9^͵͉:!!!*Y!PART0 J:!Yphysical sector jmp SETDMAB ;set seg base for buff (DMA) jmp GETSEGT ;return offset of Mem Desc Table jmp GETIOBF ;return I/O map byte (IOBYTE) jmp SETIOBF ;set I/O map byte (IOBYTE) ;pr equ base204+8 ;8257 in status fdc_sel equ base204+9 ;FDC select port (not used) fdc_segment equ base204+10 ;segment address register reset_204 equ base204+15 ;reset entire interface max_retries equ 10 ;max retries on disk i/o ;before perm e,4 shl bx,cl ;multiply drive code * 16 add bx,offset dp_base ;create offset from Disk Parameter Base return: ret home: test wr_flag,1 ! jnz home1 ; if the buffer is clean, mov cur_disk,-1 ; insure we read the directory by invalidating ; now GETIOBF: mov al,0 ;TTY: for consistency ret ;IOBYTE not implemented SETIOBF: ret ;iobyte not implemented zero_ret: and al,0 ret ;return zero in AL and flags ; Routine to get and echo a console character ; and shift it to uppergment mov bx,offset int_trp call pmsg hlt ;hardstop ;********************************************* ;* * ;* CP/M Character I/O Interface Routines * ;* Console is Usart (i8251a) on iSBC 86/12 * int signon message and initialize hardware INIT: mov ax,cs ;we entered with a JMPF so use mov ds,ax ; CS: as the initial value of DS:, mov es,ax ; and ES: mov ss,ax ; use local stack during initialization mov sp,offset stkbase cld ;set forwarrror cr equ 0dh ;carriage return lf equ 0ah ;line feed cseg org ccpoffset ccp: org bios_code ;********************************************* ;* * ;* BIOS Jump Vector for Individual Routines * ; the track buffer home1: mov cx,0 ; home is a settrk zero settrk: mov cpm_track,cx ; save track number for next operation ret setsec: mov cpm_sec,cx ; save sector number for next operation ret setdma: mov dma_offset,cx ; save DM case uconecho: call CONIN ;get a console character push ax mov cl,al ;save and call CONOUT pop ax ;echo to console cmp al,'a' jb uret ;less than 'a' is ok cmp al,'z' ja uret ;greater than 'z' is ok sub al,'a'-'A' ;else shift to c;* at ports D8/DA * ;* * ;********************************************* CONST: ;console status in al,csts and al,2 jz const_ret or al,255 ;return non-zero if RDA const_ret:d direction push ds ;save the DS register mov ax,0 mov ds,ax mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine mov int0_offset,offset int_trap mov int0_segment,CS mov di,4 mov si,0 ;then propagate mov cx,510 * * ;********************************************* jmp INIT ;Enter from BOOT ROM or LOADER jmp WBOOT ;Arrive here from BDOS call 0 jmp CONST ;return console keyboard status jmp CONIN ;return console keA offset address ret setdmab: mov dma_segment,cx ; save DMA segment address ret sectran: mov bx,cx ; Put logical sector into dest. reg. test dx,dx ; see if table address is zero jz sectran_exit ; yeah, logical = physical add bx,dx ; eaps uret: ret ; utility subroutine to print messages pmsg: mov al,[BX] ;get next char from message test al,al jz return ;if zero return mov CL,AL call CONOUT ;print it inc BX jmps pmsg ;next character and loop ;************ ret ;Receiver Data Available CONIN: ;console input call const jz CONIN ;wait for RDA in al,cdata and al,7fh ;read data and remove parity bit ret CONOUT: ;console output in al,csts and al,1 ;get console status jz CONOUT ;wait ;trap vector to rep movs ax,ax ;all 256 interrupts ;BDOS offset to proper interrupt mov bdos_offset,bdos_ofst pop ds ;restore the DS register ; Initialize the BLC 8538 printer port mov al,0FFh out blc_reset,al ;reset all usarts on 8538 moyboard char jmp CONOUT ;write char to console device jmp LISTOUT ;write character to list device jmp PUNCH ;write character to punch device jmp READER ;return char from reader device jmp HOME ;move to trk 00 on cur sel drive jmp SELDSK ;-     lse, we need to fetch the mov bl,[BX] ; actual sector number from the table mov bh,0 ; zero high byte for good luck sectran_exit: ret GETSEGT: ;return address of physical memory table mov bx,offset seg_table ret read: call trac last_com,BX ;save command address for retries outer_retry: ;allow some retrying mov rtry_cnt,max_retries retry: mov BX,last_com call send_com ;transmit command to i8271 ; check status poll mov BX,last_com mov al,1[bx] ;get command op codealid -1. push es ; save extra segment mov cur_disk,-1 ; insure initial pre-read sub ax,ax ; make a zero mov wr_flag,al ; clear the dirty buffer flag mov di,offset sec_flags ; point to the update flag list mov bx,ds ! mov es,bx ; ESsector number if (host_fsn ne 0) sub ax,host_fsn ; correct if we start with sector one endif mov cl,7 ; log2(128) shl ax,cl ; sector times 128 gives offset mov cx,64 ! cld ; move 64 words forward ret flush_buffer: test wr_fl may leave dirty records ; in the buffer call flush_buffer ; we have a directory write, need to ; flush the buffer to insure the ; disks integrity write_return: sub ax,ax ; never return BAD SECTOR code ret track_setup: ; k_setup push es ; save the extra segment register mov si,offset track_buffer ; source segment is systems DS: add si,ax ; gives the offset into the buffer les di,dma_longword ; point ES:DI at the users sector rep movsw ; doit pop es ; r mov cx,0800h ;mask if it will be "int req" cmp al,2ch jb exec_poll ;ok if it is an interrupt type mov cx,8080h ;else we use "not command busy" and al,0fh cmp al,0ch ;unless there isn't mov al,0 ja exec_exit ; any result ;poll for bits <- DS mov cx,host_spt ! cld ; set length and direction rep stosb ; zero the sector update flags mov cur_dma_seg,ds ; get our segment address pop es ; recover extra segment ret track_READ: mov io_com,4 ; read track takes 4 byte cag,1 ; see if we have anything to write jz no_flush ; no, skip scanning for dirty sectors mov bx,host_fsn ; start at first host sector mov cx,host_spt ; for host_spt sectors... next_sect: test sec_flags-host_fsn[BX],1 ; see if this sector has common code for setting up reads and writes mov al,cpm_disk ; see if selected disk is cmp al,cur_disk ; the same as last time jne wrong_track ; no, we have wrong track mov ax,cpm_track ; see if desired track is same as cmp ax,cur_track ;estore the extra segment sub ax,ax ; make a zero return code ret write: push cx ; save the write mode from the BDOS call track_setup push ax ; save buffer offset push ds ; save the data segment push es ; save the extra segment  in CH, exec_poll: ; toggled with bits in CL in al,fdc_stat ;read status and al,ch xor al,cl ; isolate what we want to poll jz exec_poll ;and loop until it is done ;Operation complete, in al,fdc_rslt ; see if result code indicates errommand mov io_com+1,13h ; special read track command jmps r_w_common sector_WRITE: mov io_com,3 ; write sector takes 3 byte command mov io_com+1,0ah ; basic write sector command r_w_common: cmp cur_disk,1 ! jne not_first_b ; see if drive been changed jz not_updated ; no, leave it alone mov sec_flags-host_fsn[BX],0 ; zero the flag for next time push bx ; save the registers push cx mov cur_sec,bx ; save host sector number mov ax,host_sectsiz if (host_fsn ne 0) sub bx,h the track in the buffer je correct_track ; same drive and track, we don't need to read ; Desired operation is on a different track then is in our buffer, ; So it will be nessecary to read in the desired track. First, we ; must check to see if anymov bx,ds ! mov es,bx ; destination is our data segment mov di,offset track_buffer ; destination is in track buffer add di,ax ; plus appropriate offset lds si,dma_longword ; source is users DMA address rep movsw ; move that sector pop es or and al,1eh jz exec_exit ;no error, then exit ;some type of error occurred . . . cmp al,10h je dr_nrdy ;was it a not ready drive ? ;no, dr_rdy: ; then we just retry read or write push ax ; save error code call restore ; after physicB test b_first_flag,-1 ! jz not_first_b ; and first reference to B call restore ; then restore drive B mov b_first_flag,0 ; and clear flag not_first_b: mov bx,offset io_com ;point to command string mov ax,cur_sec ; put sector in mov sect,ost_fsn endif mul bx ; make track buffer offset add ax,offset track_buffer ; make direct pointer mov cur_dma_adr,ax ; save for write routine call sector_write pop cx pop bx not_updated: inc bx loop next_sect no_flush: mov wr_flag, sectors of the current buffer are dirty. wrong_track: call flush_buffer ; write any old records, if nessecary mov ax,cpm_track ; get desired track number mov cur_track,ax ; make in new track mov al,cpm_disk ; get desired disk number mov; restore the extra segment pop ds ; and the data segment registers pop ax ; recover buffer offset mov cx,host_sectsiz ; setup to divide by host sector size sub dx,dx ; extend ax to 32 bits div cx ; find out which host sector we changed ally homing this disk pop ax ; recover error code dec rtry_cnt jnz retry ; up to 10 times ; retries do not recover from the ; hard error mov ah,0 mov bx,ax ;make error code 16 bits mov bx,errtbl[BX] call pmsg ;print appropriate messagal ; iopb as 8 bits mov ax,cur_track ; same with mov trk,al ; track . . ; fall into execute and return execute: ;execute command string. ;[BX] points to length, ; followed by Command byte, ; followed by length-1 parameter bytes mov0 ; clear the dirty buffer flag ret clear_flags: ; Clear all variables associated with the track buffer, ; so next operation will have to read a track. ; This is involves clearing all write flags and setting ; the old drive code to the inv cur_disk,al ; make it current drive mov cur_dma_adr,offset track_buffer ; point dma offset at track buffer mov cur_sec,host_fsn ; starting from first sector call track_read ; load the track correct_track: mov ax,cpm_sec ; get the cp/m  mov bx,ax ; put into index [BX] mov sec_flags[BX],1 ; set the update flag for that sector mov wr_flag,1 ; also set the dirty buffer flag pop cx ; recover BDOS write code cmp cl,1 ; is this a directory update ? jne write_return ; no, we.     e in al,cdata ;flush usart receiver buffer call uconecho ;read upper case console character cmp al,'C' je wboot_l ;cancel cmp al,'R' je outer_retry ;retry 10 more times cmp al,'I' je z_ret ;ignore error or al,255 ;set code for permanent e; Track buffering variables cpm_disk rb 1 cpm_track rw 1 cpm_sec rw 1 cur_disk rb 1 cur_track rw 1 cur_sec rw 1 dma_offset rw 1 dma_segment rw 1 dma_longword equ dword ptr dma_offset bdos_wr_code rb 1 wr_flag rb 1 ; System Memory S_trp db cr,lf,'Interrupt Trap Halt',cr,lf,0 errtbl dw er0,er1,er2,er3 dw er4,er5,er6,er7 dw er8,er9,erA,erB dw erC,erD,erE,erF er0 db cr,lf,'Error Code 0 :',0 er1 db cr,lf,'Error Code 1 :',0 er2 db cr,lf,'Error Code 2 :',0 er3 db cradr out dmac_adr,al ;send low byte of DMA mov al,ah out dmac_adr,al ;send high byte mov ax,cur_dma_seg out fdc_segment,al ;send low byte of segment address mov al,ah out fdc_segment,al ;then high segment address dma_exit: mov cl,[BX]cute jz restore_exit ;home drive and return if OK mov bx,offset bad_hom ;else print call pmsg ;"Home Error" jmps restore ;and retry restore_exit: ret ;********************************************* ;* rror exec_exit: ret dr_nrdy: ;here to wait for drive ready call test_ready jnz retry ;if it's ready now we are done call test_ready jnz retry ;if not ready twice in row, mov bx,offset nrdymsg call pmsg ;"Drive Not Ready" nrdy01: call egment Table segtable db 2 ;2 segments dw tpa_seg ;1st seg starts after BIOS dw tpa_len ;and extends to 08000 dw 1000h ;second is 10000 - dw 1000h ;1FFFF (64k) ; include singles.lib ;read in disk definitions ; DISKS 2 dpbase equ $ ,lf,'Error Code 3 :',0 er4 db cr,lf,'Clock Error :',0 er5 db cr,lf,'Late DMA :',0 er6 db cr,lf,'ID CRC Error :',0 er7 db cr,lf,'Data CRC Error :',0 er8 db cr,lf,'Drive Not Ready :',0 er9 db cr,lf,'Write Protect :',0 erA db cr,lf,'Track ;get count inc BX mov al, 80h cmp cur_disk,0 jne sel1 ;drive 1 if not zero mov al, 40h ;else drive is 0 sel1: mov sel_mask,al ; save select mask or al,[BX] ;merge command and drive code out fdc_com,al ;send command byte parm_loop: dec  * ;* Send_com sends a command and parameters * ;* to the i8271: BX addresses parameters. * ;* The DMA controller is also initialized * ;* if this is a read or write * ;* * ;**********test_ready jz nrdy01 ;now loop until drive ready jmps retry ;then go retry without decrement zret: and al,0 ret ;return with no error code wboot_l: ;can't make it w/ a short leap jmp WBOOT ;********************************************* ;Base of Disk Parameter Blocks dpe0 dw xlt0,0000h ;Translate Table dw 0000h,0000h ;Scratch Area dw dirbuf,dpb0 ;Dir Buff, Parm Block dw csv0,alv0 ;Check, Alloc Vectors dpe1 dw xlt1,0000h ;Translate Table dw 0000h,0000h ;Scratch Area dw dirbuf,d 00 Not Found :',0 erB db cr,lf,'Write Fault :',0 erC db cr,lf,'Sector Not Found :',0 erD db cr,lf,'Error Code D :',0 erE db cr,lf,'Error Code E :',0 erF db cr,lf,'Error Code F :',0 nrdymsg equ er8 b_first_flag db -1 rtry_cnt db 0 cl jz parm_exit ;no (more) parameters, return inc BX ;point to (next) parameter parm_poll: in al,fdc_stat test al,20h ;test "parameter register full" bit jnz parm_poll ;idle until parm reg not full mov al,[BX] out fdc_parm,al ;send next par*********************************** send_com: in al,fdc_stat test al,80h ;insure command not busy jnz send_com ;loop until ready ;see if we have to initialize for a DMA operation mov al,1[bx] ;get command byte cmp al,13h jne write_mayb ;* * ;* The i8271 requires a read status command * ;* to reset a drive-not-ready after the * ;* drive becomes ready * ;* * ;**************pb1 ;Dir Buff, Parm Block dw csv1,alv1 ;Check, Alloc Vectors ; DISKDEF 0,1,26,6,1024,243,64,64,2 ; ; 1944: 128 Byte Record Capacity ; 243: Kilobyte Drive Capacity ; 64: 32 Byte Directory Entries ; 64: Checked Directory Entries ; ;disk error retry counter last_com dw 0 ;address of last command string cur_dma_adr dw 0 ;dma offset stored here cur_dma_seg dw 0 ;dma segment stored here sel_mask db 40h ;select mask, 40h or 80h ; Various command strings for i8271 io_com dbameter jmps parm_loop ;go see if there are more parameters parm_exit: ret ;********************************************* ;* * ;* Data Areas * ;* e ;if not a read it could be write mov cl,40h jmps init_dma ;is a read command, go set DMA write_maybe: cmp al,0ah jne dma_exit ;leave DMA alone if not read or write mov cl,80h ;we have write, not read init_dma: ;we have a read or write oper******************************* test_ready: mov dh, 40h ;proper mask if dr 1 test sel_mask,80h jnz nrdy2 mov dh, 04h ;mask for dr 0 status bit nrdy2: mov bx,offset rds_com call send_com dr_poll: in al,fdc_stat ;get status word test 128: Records / Extent ; 8: Records / Block ; 26: Sectors / Track ; 2: Reserved Tracks ; 6: Sector Skew Factor ; dpb0 equ offset $ ;Disk Parameter Block dw 26 ;Sectors Per Track db 3 ;Block Shift db 7 ;Block Mask db 0 ;Ex 3 ;length (changed to 4 to read a track) rd_wr db 0 ;read/write function code trk db 0 ;track # sect db 0 ;sector # sec_len db 26 ;transfer 26 sectors on a track read hom_com db 2,29h,0 ;home drive command rds_com db 1,2ch ;read status command  * ;********************************************* data_offset equ offset $ dseg org data_offset ;contiguous with code segment signon db cr,lf,cr,lf db ' CP/M-86, 1 Feb 82 ',cr,lf,0 bad_hom db cr,lf,'Home Error',cr,lf,0 intation, setup DMA controller ; (CL contains proper direction bit) mov al,04h out dmac_mode,al ;enable dmac mov al,00 out dmac_cont,al ;send first byte to control port mov al,cl out dmac_cont,al ;load direction register mov ax,cur_dma_ al,80h jnz dr_poll ;wait for not command busy in al,fdc_rslt ;get "special result" test al,dh ;look at bit for this drive ret ;return status of ready restore: ;move selected disk to home position (Track 0) mov bx,offset hom_com call exe/     tnt Mask dw 242 ;Disk Size - 1 dw 63 ;Directory Max db 192 ;Alloc0 db 0 ;Alloc1 dw 16 ;Check Size dw 2 ;Offset xlt0 equ offset $ ;Translate Table db 1,7,13,19 db 25,5,11,17 db 23,3,9,15 db 21,2,8,14 db 20,26,6,12 db 18,24,4,1 al,cur_disk ; the same as last time jne wrong_track ; no, we have wrong track mov ax,cpm_track ; see if desired track is same as cmp ax,cur_track ; the track in the buffer je correct_track ; same drive and track, we don't need to read ;  write: push cx ; save the write mode from the BDOS call setup push ax ; save buffer offset push ds ; save the data segment push es ; save the extra segment mov bx,ds ! mov es,bx ; destination is our data segment mov di,offset track old_disk: mov bl,cpm_disk ! mov bh,0 mov dl,4 ! shl bx,dl ; times 16 add bx,offset dpbase ; gives offset from DPBASE ret ; back to BDOS setdma: mov dma_offset,cx ; save DMA offset address ret setdma_seg: mov dma_segment,cx ; save; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * * ; * CP/M-86 Accelerator -- Track Buffering Routines * ; * * ; * This module, when installed in a CBIOS, causes * ; * CP/M-86 to perform disk input output on a * ; * tra0 db 16,22 als0 equ (243+7)/8 ;Allocation Vector Size css0 equ 16 ;Check Vector Size ; DISKDEF 1,0 ; ; Disk 1 is the same as Disk 0 ; dpb1 equ dpb0 ;Equivalent Parameters als1 equ als0 ;Same Allocation Vector Size css1 equ css0 ;SameDesired operation is on a different track then is in our buffer, ; So it will be nessecary to read in the desired track. First, we ; must check to see if any sectors of the current buffer are dirty. wrong_track: call flush_buffer ; write any old r_buffer ; destination is in track buffer add di,ax ; plus appropriate offset lds si,dma_longword ; source is users DMA address rep movsw ; move that sector pop es ; restore the extra segment pop ds ; and the data segment registers pop  DMA segment address ret home: test wr_flag,1 ! jnz home1 ; if the buffer is clean, mov cur_disk,-1 ; insure we read the directory by invalidating ; the track buffer home1: mov cx,0 ; home is a settrk zero settrk: mov cpm_track,cx ; sck by track basis, rather than sector by * ; * sector. * ; * * ; * This speeds diskette access up, often by a * ; * factor of four or more times. * ; * * ; * The actual disk sectors must be a integral * ; * multiple of 128 bytes,  Checksum Vector Size xlt1 equ xlt0 ;Same Translate Table ; ENDEF ; ; Uninitialized Scratch Memory Follows: ; dirbuf rs 128 ;Directory Buffer alv0 rs als0 ;Alloc Vector csv0 rs css0 ;Check Vector alv1 rs als1 ;Alloc Vector csv1 rs csecords, if nessecary mov ax,cpm_track ; get desired track number mov cur_track,ax ; make in new track mov al,cpm_disk ; get desired disk number mov cur_disk,al ; make it current drive mov cur_dma,offset track_buffer ; point dma offset at trax ; recover buffer offset mov cx,host_sectsiz ; setup to divide by host sector size sub dx,dx ; extend ax to 32 bits div cx ; find out which host sector we changed mov bx,ax ; put into index [BX] mov sec_flags[BX],1 ; set the update flave track number for next operation ret setsec: mov cpm_sec,cx ; save sector number for next operation ret sectran: mov bx,cx ; Put logical sector into dest. reg. test dx,dx ; see if table address is zero jz sectran_exit ; yeah, logical =but do not need to be * ; * a power of two multiple unlike the deblocking * ; * algorithms supplied with CP/M-86. * ; * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; The following three equates must be set to correspond ts1 ;Check Vector sec_flags rb host_spt track_buffer rb host_spt*host_sectsiz loc_stk rw 32 ;local stack for initialization stkbase equ offset $ lastoff equ offset $ tpa_seg equ ((lastoff+07FFh)/0400h)*40h ; round off to 1K boundaryack buffer mov cur_sec,host_fsn ; starting from first sector call track_read ; load the track correct_track: mov ax,cpm_sec ; get the cp/m sector number if (host_fsn ne 0) sub ax,host_fsn ; correct if we start with sector one endif ag for that sector mov wr_flag,1 ; also set the dirty buffer flag pop cx ; recover BDOS write code cmp cl,1 ; is this a directory update ? jne return ; no, we may leave dirty records ; in the buffer call flush_buffer ; we have a dir physical add bx,dx ; else, we need to fetch the mov bl,[BX] ; actual sector number from the table mov bh,0 ; zero high byte for good luck sectran_exit: ret read: call setup push es ; save the extra segment register mov si,offset tro the ; actual disk utilized. host_sectsiz equ 1024 ; bytes per actual (physical) disk sector host_spt equ 8 ; actual sectors per track host_fsn equ 1 ; starting sector number (only 0 or 1 allowed) init: call clear_flags ; Initialize track bu tpa_len equ 0800h - tpa_seg db 0 ;fill last address for GENCMD ;********************************************* ;* * ;* Dummy Data Section for Interrupt Vectors * ;* mov dl,7 ; log2(128) shl ax,dl ; sector times 128 gives offset mov cx,64 ! cld ; move 64 words forward ret flush_buffer: test wr_flag,1 ; see if we have anything to write jz no_flush ; no, skip scanning for dirty sectors mov bx,0 ectory write, need to ; flush the buffer to insure the ; disks integrity return: mov ax,0 ; never return BAD SECTOR code ret setup: ; common code for setting up reads and writes mov al,cpm_disk ; see if selected disk is cmpack_buffer ; source segment is systems DS: add si,ax ; gives the offset into the buffer les di,dma_longword ; point ES:DI at the users sector rep movsw ; doit pop es ; restore the extra segment sub ax,ax ; make a zero return code ret ffering . . . jmp CCP_entry seldsk: mov cpm_disk,cl ; save the selected drive test dl,1 ; check logged-in bit jnz old_disk ; not first time selected if nz ; here if CP/M is about to login to the drive being ; selected.  * ;********************************************* dseg 0 ;absolute low memory org 0 ;(interrupt vectors) int0_offset rw 1 int0_segment rw 1 ; pad to system call vector org bdos_int * 4 bdos_offset rw 1 bdos_segment rw 1 END 0      ; start at host sector 0 mov cx,host_spt ; for host_spt sectors... next_sect: test sec_flags[BX],1 ; see if this sector has been changed jz not_updated ; no, leave it alone mov sec_flags[BX],0 ; zero the flag for next time push bx ; save V1V0+V3V2+V5V4+V7V6+V9V8+V;V:longword dma_offset rw 1 dma_segment rw 1 cur_disk rb 1 cur_sec rw 1 cur_track rw 1 cur_dma rw 1 bdos_wr_code rb 1 ; 1 indicates a directory write wr_flag rb 1 ; bit 0 on indicates we have a dirty buffer sec_flags rb host_spt ; bit 0 of ethe registers push cx mov cur_sec,bx ; save host sector number mov ax,host_sectsiz mul bx ; make track buffer offset add ax,offset track_buffer ; make direct pointer mov cur_dma,ax ; save for write routine call sector_write pop cx pop2ȎVWF*77 u >)u[_^Ã?u[_^Sw˷㋟*[ع$Q0=9vGY؎<uäMË6Gt  SR+؋_ Ƙ؋t@[þ?þBڊF FFÈach byte on indicates ; corresponding host sector has been ; updated and needs writing. track_buffer rb host_sectsiz * host_spt  bx not_updated: inc bx loop next_sect no_flush: mov wr_flag,0 ; clear the dirty buffer flag ret clear_flags: ; Clear all variables associated with the track buffer, ; so next operation will have to read a track. ; This is involves cle)á*È)SػM[þQxþfqþ`jþcþr\þoUþcNþTGþ0@þW9þZ2þ]+þl$s`þi?? aring all write flags and setting ; the old drive code to the invalid -1. mov cur_disk,-1 ; insure initial pre-read sub ax,ax ; make a zero mov wr_flag,al ; clear the dirty buffer flag mov di,offset sec_flags ; point to the update flag@X)g)v)))) DMS-86 CP/M BIOS Version 1.4c F***b* i/o error loc: num: cmd: typ: vol: par: trk: sec: *** waiting at location: *** *** i/o error at  list mov bx,ds ! mov es,bx ; ES <- DS mov cx,host_spt ! cld ; set length and direction rep stosb ; zero the sector update flags ret track_read: ; read an entire track from the drive "cur_disk", ; the track "cur_track" into "track_bufflocation: command: Sorry, call not implemented. ''( Do you wish to (R)etry, (A)bort or (I)gnore ? Digital Microsystems, Inc. CP/M-86 Version 1.1 N N V++V-V,+V/V.+er". ret sector_write: ; write a physical sector to disk "cur_disk", ; track "cur_track", sector "cur_sec" from ; the buffer at DS:"cur_dma". ret dseg cpm_disk rb 1 cpm_track rw 1 cpm_sec rw 1 dma_longword rd 1 org dma_1      à4$ut>Pta4 cà$c3 3hthâڰ2 t&̀SQRm<t >uoPiXY^ tu جN!the newits What is %s Memory Load Address (0-FFFFFFFF)? (Press RETURN to keep current value of %lx) (Press ESC to go back to main menu) --> Invalid entry What iport file #%d --> ͐Z!9^#V!9^#V!9^#V͗͐Z!"/!9! [8[!9^#V4!9&[[ʹ]?!9[͐Z!"/! 9! [8[!9^#V4!9&[[ʹ]!9! [8[!9^#V4!9&[[ʹ]!!.&мNȎ䄢WVRQS>4$u|uA>V&<u6jVwcVX__+WL>tE>uA>u[YZ^_j..&.ϢiuP9^#V! ^!9~#fo+_#! 9s*-<^+!9s#r! 9^#V!9~#foc_'!+;!`;!;x! There is no room in the Control Area for this file. You can make more room by deleting some files or by running EXPAND.`i"! s# y³""s %s Entry Point Offset (0-FFFF)? (Press RETURN to keep current value of %x) (Press ESC to go back to main menu) --> Invalid entry͐Z!9!9^#V!͉&[*_|ʌ!9[~[Œ!"_!9[!9[͐Z!9^#V! ^#V! 9s#r!9^#V! ^! 9s!9[8[!9^#V4!9[ʹ]!9[͐Z!;;*/(_!C;:*/(_-!S;:*/!j; *BUG* bad fd to lseekinvalid param to lseekerrno = %d from lseek͐Z!DMâ`i#DM! 9~#fo#s#r`ib_! 9^#V^! 7_#r+^!9~#fo#s#r+sÖ!;!ϟ;!ٟ;!;!DM `i#DM`ib_ʕ!H;! !!9Z!! 9T! 9^! (_d!^;`i+DM! 9^!(_•`i)))!!9~#fo! 9 This is an OS file and may require other f愰䀀>luW>䀪QItSR䄨u䀰愰愰 k>ju/>Vj4:iu4$t WZVM.stZ[Y_XϢPQW3`ëGG_YXo!3 System call mad"!9"*2(_:1wˎˎ(_:1wΎ*!9s#r*DM**!9^#V*͐Z! 9^#V)))`~\!"/ [! 9^#V)))`^#VBK!9^#V !& ^+Y!`in_s!W!`in_sRDY!;!!9s#r!9~#fo#s#r!9^#V! ^#V! 9^#Vb_!!9^#V!9^+!9^#V!%! 9! 9n#s!c_ʁ*-<^! 9~#fo#s#rc_x! 9^#V!*;!!! 9s!9^#V#! !];!9^#V! ^#V! 9^#V#b_!9^#V! 9^#V^!#Yޤ!Î`i#DM! 9~#fo#s#r`ib_! 9^#V^! 7_!!.: ͐Z!DM! 9^#VZ`i#DM! 9~#fo#s#r#! 9^#V^cZu}ʕ! 9^#V^!.7_ʕ`ib_ʕ?ç! 9~#fo#s#r! 9^#V~˥! 9^#V^!.iles in order to work. Enter the names of any support files this OS requires. (Press ESCAPE when all file names have been entered) Support File #%d --> Enter file name or ESCAPE only! ͐Z!!"9^#V!!&9^#V5Z!DMò`i#DM`ib_ ! e is implemented on the DMS-816 only tþ\ t8QV<ZYQ t-RQYZ u#XT>Tu TRYZ+ы3ÌZ>XRTþmËô؃' tou uڹ  VW‹ _^‹9!! ^#V^[:\8[!$ ^)^F[[Q[[[&[ !"/ [͏_{!!# s!9[[][!!! s#r!$ s!"/ [!9[8^_!$ s!9[[^\8^!! s#r!9[͐Z! 9^#V)))`~¹!"/!! 9^#V!9^#V͕!!9^#V!9^#V=M7_*/!d;!!9~#fo#s#r֩! Sectors copied: *YIKES* attempt to increment to track 0x%x in add%c%02x *BUG* read != 128, errno = %d͐Z!9~#ʜ!9^#V@ !9s#r!G_ī!׫;!;!7_˥Ø! 9~#fo#s#r+^#+s{7!DM`i#DM! 9~#fo#s#r#! 9^#V^cZu}7`ib_7!u͐Z!9~#\!!9s#rg!!!9s#r!"_!9^#V!%;!9~#ʣ!9^#V![8[!S;!;!9~#!9^#V!!! 9Z!;!5;!^;!;`i)))! 9~#fo^!9s{xu4w>w u xw|&&MZXP&&MXϐ@H)))`^#VBK!9^#V!! s#r!!# s!$ s!Z[3ø teou omYZ+ы3Ìu>smoþË"ô6؃' tfu uڹ,(*3 System call made is implemented on the DMS-816 only tþn t8QV<ZYQ t-RQYZ u#so>ou omYZ+ы3Ìu>smoþË"ô6؃' tfu uڹ,(*@%, VW‹ _^‹ٹ6&CC&؎‹PR ttgtu3u-Jt>u4> u &&MZXP&&MXϐVW‹ _^‹ٹ6&CC&؎‹PR ttgtu3u-Jt>u4> u &&MZXP&&MXϐ [%A i/o error loc: num: cmd: typ: vol: par: trk: sec: *** waiting at location: *** *** i/o error at location: command: @H`$GFD 5XG5G58U U(U0U`hpxL@d XDX ~a cmaphns.10 y 0d000000 40 gioshns cpm86 pdriver  y a gioshns.71a y 0080ff80 80 y a cpm86.14b y 0680ff80 2580 y a cmap816.10 y 0d000000 40 gios816 cpm86 terminal pdriver  y a gios16b.71a y 80ff80 80 y a cmap16b.10   $ COMMON BIOS for DMS 16B Version 7.0g Signing off... Digital Microsystems, Inc.  Drive A cannot be written to. Partition is a HIDOS partition. Partition is Read Only. Partition is already owned by you on another drive. P   ~kz y d000000 40 gios16b cpm86 pdriver  y p a n 9 y phase2 login86 login86 y q zartition is owned by user named . You don't have write ownership of it. Write attempted to partition locked by user . Illegal interrupt called at 0000:0000 Please reset the computer ~  u    KviKviKviKviKviKviKviread write re>u/>v4:u4$t WZVM.tZ[Y_XϢPQW3`ëGG_YX3     ~  u    KviKviKviKviKviKviKviread write re*>u:uX 2 úf t  ts3t "$ $U rUڻ1 r= >u3>t à"$ Ģ  똀s&ؾG3> MC$FF:u!>>u>s[S` t[Sh[^Cuڹ]t r^ 12M3һ ڋ;u unot cleared. It belongs to another user. Your unlock string is too long. The lock string to be cleared was not found. The unlock string was not found but there was a network retry. Bad Transmission; result is inconclusive. Unknown unlock status = %x ad1k spool assign who timedatehd stat net infolock unlock Sorry, no room for spooling... Print file has been spooled. 70g  G ++6@3ñÊ%:u;u;u :uڻy t6Ʀ>bMZ T ڹ3> td .dS>u!t&uQR ZY[x3CM$ؗҜ<2#I9<@%, 32vÊG :t3>uW&2nuÌڻ rC"CY'V6h&^W>h& _P䆨t SQ=Y[` X䖨䒨 t䚨@t uta t$t$ta$3䖨$䚨 u 䚨@t愀3ttP3$<Xt2VQ Y ^Ê F t X ~   ~kD2[%@od( ??$@@?0123456789ABCDEF [%A i/o error loc: num: cmd: typ: vol: par: trk: sec: *** waiting at location: *** *** i/o error at location: command: Ǧ63àstpS[ruSG [=tֻW ;;-LQ8*.0DRK.OXo \w!&6ih$  $ COMMON BIOS for DMS 16B Version 7.0g Signing off... Digital Microsystems, Inc.  Drive A cannot be written to. Partition is a HIDOS partition. Partition is Read Only. Partition is already owned by you on another drive. PMu }pَ>ptstp<t4<s>ut's0<u G :u G 8quG 8ru]r>utlOhOap<upP<u?:u6r.qv:O u :o u:W t <u :utu&G M>t2u  Á>u;s >u  >tà r%ڻG rt9 >nuڻ& ruJ  r#ny rnu Q/+>| VUP2X]^UW_]ˌȎ؎м&؎646666 6 6 >  643ڹ @5GG&FF&GG) RA lȣj artition is owned by user named . You don't have write ownership of it. Write attempted to partition locked by user . Illegal interrupt called at 0000:0000 Please reset the computer 4      ûv8G uG ÉÉø6fXHH$$|$$wsYt S[Cò2VWF77 mu[_^Ã?u[Sw˷㋟[ڹ$Q0=9vGY؎<u *** *** i/o error at location: command: L S u COMMON BIOS for DMS HNS-86 and 5086 Version 7.0g Signing off... Digital Microsystems, Inc.  Drive A cannot be written to. Partition is a HIDOS partition. Parti XX ~   ~kËu1Ju t@? à 4$ut>Pt4 à$33tâڰ 2 t&̀SQR<t >uPXY^ tuäMËuCCCCCseS>nڋF<r&x&؊D z󤿈󤿂P$8G uG sp/X<`u/P7r$:XutYðrf&O&OAus@r sðÁtion is Read Only. Partition is already owned by you on another drive. Partition is owned by user named . You don't have write ownership of it. Write attempted to partition locked by user . Illegal interrupt called at 0000:0000#,5BIPW`#,5BIPW`#,5BIPW` جN 4$t>tuA>&<u6Vp$WE>t8Q3Y'uA[YZ^_}..&. ϢoP䀰悰䀀>uW>䀪QItSR䂨u䀰悰悰 >u/>4:u 4$t W\VOZ[Y_XϢu YZ+ы3Ì>#þËbôv؃' t ڋيOW_YSm!JT&ymr(3}#؎ŽعhjsuÌڻs #OPX t$#tt u >u! 9s#r!x9~#fo^#V!9s#r!z9^#V!ͫ^X!! 9~#fo̓^s#r!!9~#fo̓^s#r!9^#V! 9~#foH_¬!v9^#V!9͸Y!v9^#V͸Y!v9^#V!9͸YPZ! 9~#fo+s#r! 9^#V!^üZ!:!9^#VdYDM| !   i/o error loc: num: cmd: typ: vol: par: trk: sec: *** waiting at location:ru uڹlhjVW‹= _^‹ٹv&CC&؎‹@HG 5G5G58@HPX`dhlptx| à>t à}SR@s uZ[ ÌڻZ[SR5s t uNiȰDZ[3ø tPt|4 à$33tâڰ2 t&̀SQR<t >uPXY^ tu جNyu]s@r sðÁ]yzQ3Yb's++6su@3ñmozÊrmo%q:u;u;u :uڻZ! t6oZ!>su326ÊxG :t3uq &x2(& _P䔨t SQ=Y[ X䖨䆨 t!S;! 9^#V!͗ZͻZ!S;! 9^#V!^#V!S;!9~#D!DMY!PYDM`i^D`i)))!9~#fo~D`iÌ#`i###^^)))!9~#fo~!#^)))!9~#fo^!3....&мnȎ䄢WVRQS>4$t>tuA>v&<u6Vp~vx~~$WE>t8>uA[YZ^_}..& u%y&&O &&+OI&OMB3‹&G<rÊp3È-ÈáÈ.ð8ÈcCO؎]^_`abc2 rMNڻNڻ]r-^.uÌڻ5 roZ!6su3à340S[ruSG [uW>䀪QItSR䄨u䀰愰愰 >u/>v4:u4$t WZVM.tZ[Y_XϢPQW3`ëGG_YXQRssZYuð\ZYQRC}sZYQRAٹbs ZY‹4pqsuTQRtsZYuàpZ[SRqsVZYu t3vt vxvzx ڋيOW_pqs/Xtֻ  0t340<t4<s>5t'tà!$* u2S[Ê SÀ:!u[È [2Ê À:! Ê&IÍ.Q6 Ys ڹ 6 >t2u Á>u;s >u  >t  MLVUP2X]^UW_]ˌȎ؎м ؎646666 6 6p x>  643ڹ 5GG&FF&GG (A ,ȣ* 3 System call made is implemented on the DMS-816 only tþn t8QV<ZYQ t-RQYZ u#so>ou omYZ+ы3Ìu>smoþË"ô6؃' tfu uڹ,(*uSmp!qs uT&ymr(3}؎Žعs>jsuÌڻs OPX t$tt u >uàs0<u G :u G 81uG 82u]r>5tlOhOa0<upP<u?:u62.16:O u :o u:W t <u :5t5&G M> û68G uG ÉsÉuø6&XHH0à r%ڻi  rt9$ >.uڻ 2 ruJ? r#n r.u*>u:uz 2ú ؾ3 M$FF GGGG33> t    g 3t$cOVS r5_$&:VW‹ _^‹ٹ6&CC&؎‹PR ttgtu3u-Jt>u4> u &&MZXP&&MXϐq>t à}SR@s uZ[ ÌڻZ[SR5st uNiȰDZ[3ø t裀 GG;t CCCCC_uCCCCCses1>t ts3t "$ $w rUڻS r= >u3>tà"$ Ģ 똀s&lG u>]s[Sa`[ t[S[^Cuڹ3 r4ࣳ2MQ3ɻ 7u.ۡ&;u&;t u Y ً;u;u"MZ T ڹ3 t$ .$~S>~u!~tv&6     @H`$GFD 5XG5G58U U(U0U`hpxL@d XDX ~HLPUTX\dhplptx|8@d"Dd"Hd"Ld"Pd"Td"Xd"\d" PX ~  ~kHuYXøPVWLڋ_^3Ɋ2*û22ױ2軝'2*б*P'+IXQ'*3ɊQYNN22 P'+IXQ2*Ȋ2QdFFY22   $ COMMON BIOS for DMS 16B Version 7.0g Signing off... Digital Microsystems, Inc.  Drive A cannot be written to. Partition is a HIDOS partition. Partition is Read Only. Partition is already owned by you on another drive. P   ~kz.869;98698/8:984-80-81-83-8869;98698 /8:98<-88-89-8;-8869;98698/8:9l7t->'+6'2Q222+6'+6'Y t*Rt(QY++‹6'2Q22Y6' 2Z2332ڊ2+؃y y332ڊ2+؃y y6'c332ڊ2;x+:6'x6'artition is owned by user named . You don't have write ownership of it. Write attempted to partition locked by user . Illegal interrupt called at 0000:0000 Please reset the computer ~  u    KviKviKviKviKviKviKviread write re8D-8@-8A-8C-8969-/-9;9 99696/-9;9 9969H/-9;9 9969?/-9;9 9969Q/-9;9 9969Z/-9;9 9969-/-9;9 9read write read1k spool assign who timedatehd stat net infolock unlock Sorry, no room for spooling'6f332ڊ2;x*+:6'xPQRS3Ɋ6''D[Z6'YX!*y2*y62x:62x6':62x*'3R6''Z6':'yj±*Q2'2*PX*Љ'Y2Q'uCC'ad1k spool assign who timedatehd stat net infolock unlock Sorry, no room for spooling... Print file has been spooled. 70g  ... Print file has been spooled. 70g / @Y*XÊ Px±Q2'2*PXʀЉ'Y2Q'uKK'YـX-Ê !û'CC3Ɋ2*nPvS'+[XX2\3VÈ6226'''9!9~#fo _!9s#r!9^#V!9~#fo^9?!9^#V!9s#r!9~#ʓ?U?!9~#fo#s#r!9~#fo+s#r#!9~#fo^ʓ?!9^#V`iZͫ^ʐ?!F?!!9s#rð?!9~#fo#s#r!9^#V~?!9^#V!9~#fo^?!9~#fo#s#r+^`iZͫ^?!á?!@%, '3'Hࣛ'2'+@@'V'2>'>'P 2>'>'VG3&3@05`@ @ @  z$ (,048<@D9^#V!9~#fos#r!9~#i@/@!9~#fo#s#r!9~#fo+s#r#!9~#fo^i@! `iZͫ^f@! @Ð@`iZͫ^ʁ@!!9~#fo#s#r;!9^#V!"_"_! 9~2_G+V+^+6"_+N+V+^!_w#@y@/w#@@!_>^ [%A i/o error loc: num: cmd: typ: vol: par: trk: sec: *** waiting at location: *** *** i/o error at location: command: 7     %@1 [!6!@M%%%%%%&~&&&&%%%&'%%%%%%%%What function key do you want to program? Programming . Press ^$F13 to leave, ^$F14 to delete.BUFFER FULL efg Sr ;<=>?@ABCDGHIKL5MOPQSRN+J-TUVWXYZ[\]G7H8I9K4L5M6O1P2Q3S.R0N+J-^_`abcdefgwstuvv%%%%%%%%))))\)) )3)Z+c+)*%++)+*%%U((((D+8++%%i++@('& #(-27?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~d<ROPQKLMGHI !"#$%&,-./012  7?=?B?G?M?0 Signing off... Digital Microsystems, Inc. 816 7.0 KBYD 0.0 Parity Error  Drive A cannot be written to. Partition is a HIDOS partition. Partition is Read Only. Partition is already owned by you on another drive. Partition is ow    1!2@3#4$5%6^7&8*9(0)-_=+@qQ@wW@eE@rR@tT@yY@uU@iI@oO@pP[{]}@aA@sS@dD@fF@gG@hH@jJ@kK@lL;:'"`~\|@zZ@xX@cC@vV@bB@nN@mM,<.>/?*ned by user named . You don't have write ownership of it. Write attempted to partition locked by user . Illegal interrupt called at 0000:0000 Please reset the computer     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0. !"#$%&21/-,+ 9(( 3 45  ''3 450. !"#$%&21/-,+ )0. !"#$%&21/-,+)S++--778899445566112233..00++--8     9     :     ;     <     =     >     ?     @     A     B     C     D     E     F     G     H     I     J     K     L     ƎFb'RATr G 2N" nG>Y97J5å`Y&7B V_bTp+5D1ӠuehI W4