IMD 1.17: 10/06/2011 8:14:35 single density cp/ with mbasic -- not a boot diskette - 1 of 2  >&2P!"Q2S:ʑ!@"~ʭqʭ4#¡zi5û#Q)#^)% \VXV COPYRIGHT (C) 1979, DIGITAL RESEARCH S_͌S> ͒S> ÒS> ÒS͘S~#͌SìS _2Z<S2ZZSSSSZSSZSSS T!Z2:Z2a{_:ZʖT:Z>ĽSZSʖT:Z=2ZZS–TS!BW!Z6#5ZSʖT:ZĽS!SͬSTʧTTÂVTT S)T!SF#xʺT~0TwëTw!S"S !Z~6ͽSZS:ZýS(V![V#T͘S*S~ "U"U͌S#U>?͌S͘STÂV U=_.:;<> OUo$>!ZYU2Z*SOU"SʉU@G:ʐU:ZwÖUx2Zp0UʹU#*©U6?ëUw˜U0UUïU#6 ¹U.U0UU#*U6?UwU0UUU#6 U#6U"S #~? V VxDIR ERA TYPESAVEREN USER"!VyZOV#>͌S9TTT2Z^U U:Z¥Y.V!V_~#fowWX]XXYYY!v"S!SVçSREAD ERRORVçSNO FILE^U:Z U!Z ~ 3W#0 UWx Ux U U UG W~ U# 3Wx~#BW!YU~ɯ2Z:Z=!ZýS:Z=!Z:ZýS^UTW!Z~ W 6?#ˆWSVX:Z`O> KWX{W͘STA͒S>:͒SW͢S>:͒S͢SxKW WW> KW X> ͒Sx X W͢SWTXSØWÆZ^U BXRXͧS9T!S5‚V#~Y‚V#"STWZS`U~2Z2Z\!Z!BW!S~>Z >Z#0Z~OZ#CZx2͘STT1Z)TͽSÂVfW UzZͧSÆZBAD LOADCOMfW^U:Z !Z UÂV$$$ SUB"[[[[["C^{2h!"E^9"^1A^2h2h!thy)K!G[_^#V*C^i]\]ii]]]]\]~ggEgggggggggggh hh,`hh&h-hAhGhMhgSh^^h![[![ô[![ô[![[Bdos Err On : $Bad Sector$Select$File R/O$\:B^A2[[\\!^~6 i[\O͐\  :^E\i iB\ i2^>: ^b\#\ i: ^iy! ^4 5~yy\5 6y\Ґ\^H\@Oy H\ H\: ^–\ͬ\ i i#H\\: ^! ^ H\ù\ H\ H\ $O͐\\: ^2 ^*C^N#[ ] ]]x\: ^2 ^p]&]x\~+é]7]\2 ^\H]! ^>w\_]: ^! ^\5ͤ\N]k]ͱ\\¦]ͱ\xʊ]#N\x]: ^\! ^2 ^ͤ\! ^5™]\#wO\~x½]\p H\\^i^y<]<i iiʑh i^:^!qMD\# \2E^>^! [^#V w#P^:B^Oi|^#V#"h##"h##"h##"h!hO^*h!hO^*h|!h6ʝ^6>i*hw#w*hw#w'iû^*i! [J^*h_"h"h!hN#F*h^#V*h~#foyx^*h{_zW+^*h_yx_#^*hDMi*hs#r*hs#ryOxG*h0iMD!i!hN:h E_G>O:h \_S_*C^ :hq_n& ^#V>_O^_"h*h}:h*h)=_"h:hO:ho"h*C^ *C^!ͮ_~2h~2hͦ_:h2hͮ_:h_O:hw:hw |g}o_*h# _ )`:B^O!`yoxg*h:B^O_}!hN#F `"h*h#*hs#r^` ~![J^`! [J^*h:ho$*C^~i`6i`w*h*h{#z`r+s{ozg*h*h͕`_*h*h ``,`w͜``͸^``Ͳ^!h`!hN#F$i*h*hO^!h~#a:A^a#~$a=2E^ka͌`a:h^:h/GyO>2h!hq*C^"h`͡^a`ʔb*hJb`Ҕb^`:hOyʃb?|bx |b sb-b|bNb-b# Sb:h2E^!h~Яw`>^T` b`D`^`6ka`-bäbPYyb 5ab*h{zbBK5abbڋc>*C^w~#+w#w+ɯ2E^2h2h`i`b`^` *C^ :hc~cwc~dc͔c͔cd#d # c dw ~>2hc!E^5T`*C^!h"C^b`"C^!w# Fd! w͌`bx`2h͢c`*C^ ~<wʃdG:h!hʎdìd 4~ʶdb`¬d:h<ʶd$d`ʶdïdZcͻ_^^x`>2h>2hͻ_:h!hddZd2h:E^dw_̈́_d͊_^Ͳ^_^>2h>2hT`*C^G`ͻ_:h^w_̈́_ne>_2h;eO ^_DM;b}He>^"h*C^ :h:hded`sleO s#r:E^͊_:h==»ey==»e*hWw#e`*h"h^͸^*h:hG#še"h`^͸^:h!hew4!i`wf:hf_Zd!E^~e=2h6_2h*C^!!~~#~O~G#n,-.‹f! w! yGf!xf͢c.:E^<ʄf! q!pQc:E^<f. ʄf$d.:E^<ʄf^i`6}2E^x`fdfeN! ~态O>G~G!~G} b*C^!r#r#r` g^`ͥf_y#x#{gs+p+q-bf*C^ ͥf!!q#p#w*h:B^O_Y^G^}*hMD `"hãa:h!B^w!g>2h*C^~=2hug:B^2h~2hwEg:A^*C^w>"^!"h"h2B^!"h`!gr`QgQcQgâc~?gͦ_~?r`Qgb`*h"C^Qg-b`Qg͜bbQgüdQgdr`Qg$dQgcb*h)h:B^^"h`*h)h*h)hQg;cb*h"E^:h;h:A^^2A^QgÓfQgÜfQgf*C^}/_|/*hW}_*h"h}o|g"h:hʑh*C^6:hʑhw:h2hEg*^*E^}DQg>2hfeÙvÚjiçiài j i iýjjjñj÷jkkjjöj qfrm  PMMMM((((yOöiiMʪiHiM ʹiyHiM>:FiO:FiO:FiO:FiOiii59iAiNiij jyHiM *KiN:MiGM:jH2MiGxAj>!ͷj>22!i"!["2vu2Xl2ru:j!iuj!i^#V2j&.(mDjvÚj`i"ku`i"9l:Xlj2vu`i"nu:mug.(my2mu?k{ka.(m|?k2ks#r#q#~ MOVCPM COMjWXYZ[\]^_`ASM COM@ BAD COMBAD COMR !"#$%&'(FORMT# ASMPFORMT# COM FORMATHDASMFORMATHDASMcs >:G|g"! *xB {5~#o}o>$*½# K:m ! ~‹#c* DM! xʋ BAD DOC%)*+,-NOTESHD DOCy./0123BAUD DOC3DDT COM&45678HYTYPE ASMHYTYPE ASM~HYTYPE DOCHYTYPE PRLw#zÈL!Uͦ*)"[660#60 4~:ڬ+4#60ì!"ÈxG *w# x*  Invalid memory sizDEBLOCK ASMP9:;<=>?@ABDISKDEF LIB1CDEFGHIDUMP ASM!JKLMNDUMP COMOINSTALL COM:INSTALL $$$e$ Synchronization error$ Constructing 00K CP/M 2.2$ Ready for "sysgen" or "save 00 cpm00.com" $ED COM4PQRSTUVFORMATDJCOMWXYZFORMATDJASMghijklmnopqrstuvFORMATDJASMw(Copyright (C) Digital Research, 19801] w?w! [[0 n))) O <|n}n.g))Ë!$ʇ~/FORMATHDCOM%xyz{|FORMATMWCOM}~FORMATMWCOMQFORMATMWDOCw/wz|g*"|=??͌͘ =_.:;<> Oo$>!Y2*O"ʉ@\X COPYRIGHT (C) 1979, DIGITAL RESEARCH  >&2P!"Q2S:ʑ!@"~ʭqʭ4#¡z5û#)# )% ~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" _͌> ͒> Ò> Ò͘~#͌ì _2<2 á 4êü /L9ASMPRN ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ#~?  xDIR ERA TYPESAVEREN USER"!yO#< Ty#O 321y_͸2y2ͽ: !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:HEX w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ(1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: #  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6y!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ :! G~#x=2> > ! >x6 #='G! ~ p( O*}O>4?:7w:#ĸ*"!͸* }w>ͪg( ʆ1 !)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1 Y :7ʗ8 z !<ͼ CP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCE :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 w  FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY G:7xʘ!#~ʄl͸Ä**!O {zʊRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*Ͱ>2lyPLnR>UX:l̅2l͓OʊQ>ÖH >2 2 û: B­>ôD> ¸!52 !"!N#~#A07O! ~*!) " z'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂ͸*"!!#^4!$wͯͯWƐ'@'ê>:ͪ!#^Ww*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪ?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP{zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~*>E2C!" """ :ʼ:*1 |R|ͦ0FIL: R:  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ)sn55)=â|g}o=î--#zg{ozg{ozg{@2 0 0:x0_<2! wI2 2> 2 >2ɯ22 !~@_6^4#: w~$w: 0 q M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!*_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACM  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#HoÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#: A: A͋q: a{_2  2 - !ɯ2I:  ;*:  ͭͷ ͭ͋#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8CCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAX vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 ![w#w#b!"!F#v2[=ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅ>9q>9: '!2 >9 7:! 6 >2>2: 2 Qͭ:Ğ! :lj<͖<j<|<: !~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fk :|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSx2bv1:2b2nd:nd1!MDæa:nd2­!MDæa:nd3½! MDæa:nd4!)MDæa:nd5;;BADSPOTS ͟a!! !N#F=æa͟a͏æa͟ap!ywx#w"͋ͮ!~#foͥa*fde:S Ù Your choice: All done. 5) Quit To clear  :Dd:Ed#/!~#fo !l~#fo) ~#fo"Dd*Nd"Ld*8dMD) )*Nd :Ld:Md!~#fo !l~#fo) *Ld#### | #‹!R{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"irectory Error reading directory ͟a!j9!j*jd ~#~!t!j~#fo ~#~!rw#w!pw#w!p!@d  #!r~#foS 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ix!~#fo6! !!~#fo#;B!~#fo ~w!~#fo ~wæaError writing directory Error reading directory ͟a!n9!out the old bad map. 4) Clearbad bad sectors out of circulation. To create special CP/M files to take 3) Fixbad N#F*Ld}o|g"Ld5%s: File contained bad sectors, probably corrupt ͟a!2b!N#F#'!2b!æa͟a!N#FvE* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0*Bd !tN#F!x!$y! $æa!p~w#~wf!!x}|!!  !~#fo~OGyxH8!H ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñn*jd ~#~!!n~#fo ~#~!w#w!w#w!!@d  #!~#fo*Bd !N#F!p!$y!^$ To manually add to the bad map. 2) Putbad To read the existing bad map on a drive. 1) Getbad ͟a!!!!N#F!ͣLæa͟a!~#foMD) *fd ~OGi`!~#foMD) *fd ~OG}o|g"|d!|d~#j *|dMDæa!~#foMD) *fd #:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >Nr~w#~w+!j~#fo  #ڳ!rw#w!t~w#~wó!~ w#~w! !od!N#FͧC :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>S !w#w!~w#~w ! !N#F!N#F;B!~#fo*Bd !N#F!p!$y!E$æaError writing d |dMDæa͟a!~#foMD) *fd ~2~d!~#foMD) *fd #~2d!~#foMD) *fd ##~2d!~#foMD) *fd !~#foMD) *fd!~րws!wyº! $ú͟a!N#F!!N#F!N#F[0æa͟a!!N#F!!L)æa͟a!!N#~#~!~#fo 2d2d~2d#~2d!d2i2i:d2i:d2i!ic`!d!dLa!d2i2i:d2i:d2i!i_*Ld####:dw:d#w*Ld!:fdw:gd#w!~#fo~OGy&xn!~#fo##~OG!~#fo#~OG!~#fo~OG!!~w#~w!y!L!22d!d~#ʟ *d| *d#"d 26d27d*fd"hd*hd~OGy¼ x *6d#"6d*hd###"hdì *d)"dà *fd! ! *6dm=!*6d͏8d~#Q*i####"iY! *iN#F!2b"d*dCi`"d*i~#fo"d*dvEi`"d*i##"i!~#ʢ!:d:d#!!! ~!~#foMD) *fd #!~#foMD) *fd #~!~#foMD) *fd ##!~#foMD) *fd ##~!~#foMD) *fd :~d#F!N#F!)æa7sulͪa!9!~#fo"i! ~#fo"i!>w#w*i"d*d~}*d~%}*d#"dX*d#"iG!d!~#fo  #ڴ !~#fo *Ld####  # *Ld####!d  #{*hd##~OG*hd#~OG*hd~OG! ! ô !Nd:Lbv1:2bæa!!F!2b,ywx#w!~#!7!2b!4En!N#F!#͠3!:fdw:gd#w!~#fo~OGyxK!i`"Nd!Nd~# $*Nd"Ld*fd"hd*6dMD) *fd :hd:idZ :1b *hd##~ *hd#5*hd#~w *Ld!NdyOx#G!͑\"8d#*Nd"Ld2N#F!~#foͥa!~w#~wc!d>#*d*d!N#F!~#foͥa!~#s!:d:d#s!!!N#F!~#fow!~#foMD) *fd #:dw!~#foMD) *fd ##:dwæaPress RETURN to continue.͟a!9!9 !v1*2e}0} !;;æa:i:i#Ҷ*d!iyOx#G*i!N#F!~#foͥa*d*d#"d~a*d~-!w#w*d#"d*d~0!60!6 !wdŠ:Md#ʩ*Ld *Ld#### ¦ #ʴ *Ld}o|g"Ldô *d#"dÅ !!*d!]}!*d}og}2d2d:d:~#fo##~OG!~#fo#~OG!~#fo~OG!!N#F! 9!~w#~w!N#F.æaSector Byte: Head: Track: Bd2d*8dMD) )*Nd :Ld:Md*Nde:! æa*hd###"hd *hd##~OG*hd#~OG*hd~OGͱ!:i2d:i2d:i2d:i2d*Ld!da!~w#~w%5u %5u %5u track head sector : can't write writeenter a file name, otherwise press If youBad sector fixing done No free directory entries left Bad sector in CP/M directory (%u, %u, %u)͟a!9!*jd ~#~!#w*d~0F*d>9F!*d~OG!~#foMD)) )  }|*d#"d!w#w*d~.­!>w#w*d#"d*d~0*d>9!d"*8dMD) )*Nd :Ld:Md4!~s!6s*d)! *Ld####~#~!!d *Ld}o|g"Ld*d#"d!~OG>>ad map full Must be specified in the vitals file Only for Morrow M10, M20, M26 drives Bad knows how to accept byte offsetsi]!i2i2i:d2i:d2i!i_##~#~*Ld##!di]!i2i2i:d2i:d2i!i;_:Cd2i2i:Cd2i:Bd2i!i͍]#'d like a copy of that in a file, %5u %5u %5u track head sector No bad sectors ͟a!9*fd~OGyx!æa!~#fo~#fo"d!!~#fo##~OG! \"d*d!͑\"d2d2d!~#fo ~2d2d*d))))))))"d!~#fo ~OG:d2d:d*d~OG!~#foMD)) )  }|*d#"di!w#w>2d2d*d~OG!za2d2d! *i##N#F+++N#F!2b"d*dCi`"d!  Unknown or unspecified drive type M26M20M10 > 2) Accept byte numbers 1) Accept sector numbers How to accept "d!|?i`"^d!*d%i`"d!|?i`"`d!*d%i`"d!|?i`"bd*d~*d#"de*d6Â*d&i`"dd!0M10read͟a!9!*jd ~#~!!*-b,ywx#w!~#*-b$;;!N#F!!,2!N#F!!,2i~2i+~2i!i!dc`~2d#~2d#~2d#~2d!d!N#F*`dI]2i2iy2ix2i!i͍]!d!#~2i2i~2i+~2i!i͍]!d*bd!!!c̓&i`"d:d :d*`d#!!Z̓&i`"d:d:d*hd6#!æa*hd:dw*hd#:dw*hd##:dw:db4:d2gd#w!w#w!!Jd  #U *Hd!~#fo *Fd!N#F!$yʕ !$Õ !:fdw:gd#w!*fd*2/b>20b>21b*dd**dd!(yd>2/b{*dd!~(y~>20bæa*d!~#fo ~#fo}0P!d!~#fo N#F!~#foN#F!P!;;æa!͹%y!"d*d~ʂ*d~ *d~ ͑\2i2iy2ix2i!ic`!di]æaSelect error trying to access that drive! CP/M logical drive (a, b, etc.) ͟a!9!d:d2d*d*d͑\"d!d~#ʹ:d2d:d2d*hd##~OG*hd#~OG*hd~OG!!v1!~2d:dA!d>Z:dOfo~OGy x ò !~ƀw#~w!~w#~w !*s2d[!~2>b2d:db*dd*:/bʉ!;"d!."d!-d!z(y{>21b{Error reading badmap ͟a!9!*jd ~#~!*:d!+*jdN#F!!0+i`"Bd!*Xd*V!"d!*d%i`"d!|?i`"Pd!*d%i`"d!|?i`"Rd!*d%i`"d!|?i`"Td!*d%i`"d!"!v1!~2d:dA?#!d>Z?#:dOG!a MD! MDF#:dOGy2d:dOG=(y":dOGi` ":d!!! i`"G!a MD! MDÙ:dOGy2d:dy!*hd###"hd*`d "d!`d:d:d#*`d "d:/b:0b)*dMD) ) *d!͑map written Error writing badmap ͟a!9!:fdw:gd#w!w#w!!Jd  #҉!*Hd!~#fo *Fd!N#F!$yʔ!! :0bʧ!;"d!."d!):1b!0"d!PF"d!%!!!!!æa*dMD) *fd d*Tdͱ!:iw:i#w:i#w:i#w!!~#fo~#~!i]!i!2i2i~2i#~2i!i_##~2Fd#~2Gd!i]!i!|?i`"Vd!*d%i`"d!|?i`"Xd!*d%i`"d!|?i`"Zd!*d%i`"d!|?i`"\d!*d%i`>d!*:d!+i`"jd*jd ~#fo"ld!*>d!+!*>d! !jd~##*jd ~#fo N#F!\"@dæa!""\ "d*d!ͬ\i`"d*hd##*d#}4*d! ͬ\i`"d!d*d ~2d2dspt = %u, dsm = %u Drive type not found M26M2!$Ô!! æa!~ƀw#~w!~w#~w@!͟a!~w#~w2d2d:^d2d:_d2d!d2i2i:`d2i:ad2i!ic`!#~2i2:hd:id&!:hd2hd:id2id*\d!!u̓&i`"d:dJ:d*^d!!l̓&i`"d:dq:d:db¦*d2i2i~2i#~2i!i;_:Cd2i2i:Cd2i:Bd2i!i͍]##~2Hd#~2Id*Zd*bdI]"z +!~OG!Awx#w!~a#~(!>p>#(é(æa͟a!N#F!N#Fv1æa͟a!9!~#fo~)!!~#~!!~#~! ~w#~w*i ~#fo}O/*i ~#fo|R/*i N#F}8*i ~w#~wR/a*i w#w*i ~w#~wO/ͪa!~#fo"i!u ͟a!9!N#F!v1*2e}0ʬ&;;!͹%y&æa!|?i`"d!:d:d#&!N#F!n&Ë&!:d:d#a!N#F!N#F*d_.*dMDæa͟a2d2d>2d:ds-:dOG!I]2e ~#fo}{-:dOG!I],e "d{-*dMDæa:d!!!'+ywx#wü$!!!!*+ywx#w!~#foMDæaOut of memory ͟a!$$æa: can't access ͟a!!$ MD! MD+!~OGyY+x%+æa*jd ~#fo"d*d ~#fo"d2d2d!!!=2d2d!@d:d:d#+*d*Bd *d~#fo~5)æaæa!~w#~w!~w#~w(!~#fo!~#fo )!~w#~w(Map cleared Last chance before OBLI~#fo"i! ~#fo"i!~#fo"d2d2d!i:d:d#$02d2d!i:d:d#60*d*i ~w#~w+0*iN#F*i~w#~w~OGyO'!~#fo !Y&Ë&*dMDæaͪa!~#fo"i!~#fo"i>2d:dr'*i :dOG ~OGyOG'y2d:d «'>2d:d'*2d3-<.r-a-wV.ͪa!~#fo"i!~#fo"i*i~OG!-za!!*iSi`"d*dMDa!!*iTi`"d:d.:d!N#F!4Eæa͟a!~#fo~S%!~#fo> C%!~#fo~S%!~w#~w%!~#fo> %!~#fo~%!N#F!~w#!!$yʰ+!n*$ð+æa*d#"db+*d#"d*d:d:d#ڦ+2d2d*d#"dæ+!9^#V#N#F#~#fo*+++{+0,OTERATING the bad map. OK (Y/N) ? ͟a!9!i)!v1!~a)!>z)!~OG!A MD! MD)!~OGyY)x*æaG 0*iT4yw*i ~#fo}0J060*dMDa*d#"dæ/*i ~#fo}0,0$0*d#"d*d#"dü/ͪa!~#fo"i!~#fo"i! ~#fo"i!i :dOG ~OGyOG'y2d:d ''*i*i#"i:dw:d2dA'*i6a:d'*i*i#"i6.*i*i#"i:dw:d2dw'͟.!!*iSi`"d!!d##N#F+++N#F*dE-!!*iTi`"d-!"d-ͪa!9!~#fo"i!~#fo"i!~w!N#F!~w#~w~S%!~#fo6!~#foMDæa͟a!~#fo~%!~#fo> %!~#fo~%æaæa!~w#~wüGMDͪa!~#fo"i!~#fo"i$-i`"d!d~#8,a*i*i͖-i`"d:dW,:d`,a*i*d*d_.*dMDaͪa!*fd6#!!\)æaͪa!~#fo"i*i~k**i*i~aV**i>zV**i~OG!A MD! MD^**i~OGyw*i#"i!*aError writing dire~#fo"d2e2e!i:e:e# 1*i ~#fo} 12e2e!i:e:e#1*i ~#fo} 1*i ~w#~w+-1*iN#F*i~w#~wa!~A#~3(!>Z>#3(!N#F!a MD! MD:(!N#Fæa͟a!!~A#~w(!>Z>#w(!N#F!a MD! MD~(!N#Fy~#fo"i*i :iw:i#w*i w#w*i w#w*i *i~r..ywx#waͪa!~#fo"i*i! 6*i N#F{R*i%͟a!!N#FvEY9ywx#w!~#2&$!!N#F!N#F͛B!~#foMDæaMaximum value is %u Minimum value is %~#fo"i!~#fo"i!~#fo"i*i*i͖-i`"d:d½,:d,a*i.*i*d*i_.*iMDa͟a$-i`"d!d~#-  *d~E1*eMDa*e#"eÑ0*e#"e*d#"dø0*i*d~OGyOG 6*d~ 1*i ~#fo}@o|g}1*i! 61ͪa!~#f ~#7*i ~#fo}7*i*i ! e*i ~#fo }| w #w}7!*i N#FͩExD8*i #~wD8*i*i !5#~5*i ~w5*e#"eþ4*i *i ~#fo#MDx2i2ix2iy2i!i͍]*iN#F*i~w#~w~OGyOGa*i ~ w*i]0e yOx#Gi`"-f!-f~#ʜ<:,fOG!I]2e ~#fo}ʜ<:,fOG!I]0e ~#ʜ<*-f:,fOG!I]0e N#F:,fOG!I]*Be}@o|g}ʝ3! w>#w*$e####e:*"e"$e9ͪa!~#fo"i!i~#:a:o"i*i"i:.e2.e:/e2/e1*,e*,e#",e~OGyOGÿ1!,eT4i`"i:i1:i1:i 1:i1*i*i#"i:iwÊ1*i6:i!͏8ywx#w+~#~ i`~#18*i ~w}7*i ~w#~w}7!!e##N#F+++N#F*i N#FExz8*i ~@wa͟a w#waͪa!~#fo"i!~#fo"i*i ~#fo}H6*i ~#fo} P6*iMDa*i ~#e6*ij7*i~#fo*i yOx#Gi`"4e N#FͣLÜ<*iQa:,f2,f;ͪa!~#fo"i!~#fo"i!~#fo"i!i~#<*i*i <aa:i2i:i2i*iiw4a*i*i}og 6:i )4:i¹3*i ~#fo}@o|g}ʹ3*i! 6ù3ͪa!~#fo"i*i ~#fo}ʄ4*i ~#fo}i2i:i2i9i`"*e!i:*e:+e# ;**e##:i:i# ;*i~#fo))*i **e##y:x#L;*i**e##~#fo  #*i **e##~#fo 2:i$2!i:i2:i#$2)2*iMDaͪa!~#fo"i!~#fo"i!~#fo"i!:iw:i#w:i2i:i2i!i>#2!!N#Fe:æaͪa!~#fo"i!~#fo"i*i*iI]i`"i*iY9i`"i*i"i!i~#8a*i:i2i:i2i}9*i*i#"ie!e~#6*e*i N#F*i N#FͣL!eyµ6x#6*i ~ wa*i :e2i2i:e2i:e2i!i͍]*i*i ~#~#"i*i#"i<ͪa!~#fo"i!~#fo!~#fo "i!~#fo"i!i:i:i#`=*i*i#"i:iw>=!~#foMDaͪa!~#fo"i!~0ʊ4a*i ~#Ÿ4*ij7*i ~#fo}@o|g} 52e2e:e:e 5*e!I]2e ~#fo}@o|g}ʖ5*e!I],e !##~#~`;**e##:*e:+e#=;!i:*e:+e#ڷ:**e##:i:i#ڷ:**e##~#fo"*e×:*i **e##~#~**e~#fo))**e !iy};x#§;*i ~w#~w+2*iN#F*i~w#~w~OGyOGþ2*iT4ywx#w+~2#~2!N#F!~w#~w!~ _2!~#fo668*iMDa͟a!"e~#-9!e" e* e""e2e2e*"eMDæaͪa!~#fo"i*i !͑\#MDaͪa!~#fo"i*i59i`"(e9i`"&e*&e#*i *i ~#fo}!7$7ywx#w:i77:ib7*iN#F*i~w#~w:iw*i ~w#~w*iMDaͪa!9!~#fo"i*i#fo"i!~#fo"i!/f"f*fw#w*f##*i }|!/f:f:f=*f*f##  #=:f2f:f2fñ=a*f~#fo "f*f##~#fo" 6Ö5*i *i ~#fo}(5+5*i N#F*i N#F Gywx#w*i*i ~#~*i ~w#~w+5*i ~…**e*i  #**e##*i ~#~õ;**e##:iw:i#w**e""eaͪa!~#fo"i>2,f:,f<:,fOG!I],e ~#fo:,fOG!I!~3#~,3!!i #3 #,313*iMDaͪa!~#fo"i!e2>e:?e2?es3**f#"f! *f*f*iͥax>*f#"f>! *f*f*iͥa*f*fyOx#G*f##~#fo!fyOx#G}2f!f~###ʶD*i!f##N#F+++N#F*iC*i "i!i]!i:i2i2i:i2i:i2i!iʹ_>02i2i2i2i!i͍]##~2f#"i*i*i#"i~_Baͪa!~#fo"i!"i*i~#B*i~#fo"i*i~B*i*i#"i*i~*i#"iB*i6*iMDa*i##"iðB~#fo"f!~#fo"f!~#fo "f!~#fo#i]!i>2i2i2i2i!iͻ]##~2f!~#fo ~#ʸI!f~# K!N#FͧU:f ~@#~@*f~0@*f#~aھ@*f#>zھ@*f#~OG! MD@*f#~OGyX@x@*f##"f!f:f:f# A*f~a A*f>z A*f~OPGDH͟a!9!N#F̓Ti`"f!~#6G!f~#?:f!f>9E:f'2f*i*i#"i:fw*i!yOx#Gaͪa!"i*i~#sE*iN#FvE*iN#F!N#FͣL*i##"i>Eaͪa!~#fͪa!~#fo"i!~#fo"i!~#fo"i:i\C*i>o>g"i:i\C*i>o>g"i*i*i#"i6-*i*i͑\"f!f~#ʍC*i*f*i:fBJ:fBJ!"f*f! *f!! yʯJ K2f2f!"f*f"f!f~#J!f:fI:f#3K!~#fo#2i2i:f2i:G! MDA*f~OGy2f!f:f2A:fLA*f#"fA:f0xA!f>9xA!~#fo!~#foN#F! N#FI]:fOG  }|A:faډAy2f*f ~OG!Fzaæa!N#F!N#F*fHæaæa!f:f:f#H! y2f:fG:fOGyGx HH*f*f#2f:f2f>!f:f:f#>! *f*f*iͥa>*f####*f#}|*f *f##~#~*f##*f }|*f####"fñ=͟ao"i*i~ʖE*i#"iÄE*i!yOx#Ga͟a!!f##N#F+++N#F!N#FExEæaæaFqF6FF͟a!N#F̓TiC*i "i*i*iͬ\0 }2f!f>9ҲC:f'2f*i*i#"i:fw*i!yOx#Gaͪa! ~#fo"i!~#fo"i:iCD*i>o>gf2i!i͍]2f2f!N#FͧU!z! *f!! yPKJ!z! *f!! y K!:fOG}o|g"f!f:f:f#!f>zҚA:fA A!f>Z A!~#fo!~#foN#F! N#FI]:fOG  }|*f#"f@!f~#B!~#fo!~#fo~#fo>o>g}|"f:fwG:f GG*f!yOx#GæaH!6!! ! ! !"f!~OG!yx#sH!~OGzH!N#Fy2f:! !!!N#Fͬ?!~#foMDæa͟a2f2f!~#fow#w! ~#~?! >$>#?æa! > >#@! ~#fo/ }2`"f!f~#Fæa*f ~D&Fæa! ~#foMD!Eza!~2f#~2f#~2f#~2f*f#:fw:f#w:f#w:f#w!~#foMDæa*f#i]!i"i!#~CD!!i]!ia~#~#~#~*i*i#"i6-!i]!i:i2i2i:i2i:i2i!iv_~2f#~2f#~2f#~ҋJ*fMDÐJ*fMDi`"f*f!z:fOG *f[*f*f "f!f:f2f:f#2f!~#fo#2i2i:f2i:f2i!i͍]>2fgI!~*f!yOx#G!~#~(B!N#F8B*f!yOx#Gæaͪa!~#fo"i!~#fo"i!~#fo"i*i:i2i:i2i}ʘB*i*ifʞH*f~OGy–HxH>2f!f:f:f#H:fH*f*f#"f6 H*f*f#"f*f*f#"f~:f2f~Hæa͟a!z9.R!f@! ~#fo6 }2f!~#fo"f!~#fo!~#fo "f*f~ I@*f~ S@*f#"f7@*f~-f@>2f2f*f~-x@*f~+@*f#"f!!͍]~2f#~2f#~2f#~2fMF*f Sx2i2ix2iy2i!i!͍]~2f#~2f#~2f#~2fMFæaJGJGG,HCGTGLG  #fo#2i2i:f2i:f2i!i͍]*f!yOx#Gæa*f~2f:fOGyJKxfKJ!z:fOG "f>2f3K*f#"f*f#"f:f I:fæa!y"f>2f!~#fo#2i2i:f2i:f2i!i͍]!f~#jP*f*f#"f6 !f~#jPyP*f!yOx#Gæa͟a!w#w!~*f "f!f:f2f:f#2f!~#fo#2i2i:f2i:f2i!i͍]>2fçN!:fOG}o|g"f!f:f:f#O*fMDO*fMDi`"f*f`##~*f# !f!+`##~æa͟a!fywx#w!i~#~VV!~#fo ~kV!i~#~{Væa!~,w#~w6V!~M>2fM!~#foMDæaæa!f:f:f#һM*f~OG!Lza*f!yOx#Gæa!:fM:f#M*f ~ M! :fOG *2i2i2i!i!~#fo" MD 2i2i2i2i!i!ͼ_&a!~#fo# MD 2i2i2i2i!i!ͼ_&a>2i2i>2i>2i!ic`I*f*f#"f:fw:f2f:f2fI͟a!9!:fw:f#w!*f!~#fo }|!:w:#w!!}|!w>#w!!#~#R!N#F{R!~w#~wQ! æa͟a! yHR2f2fæa*f#"f:f:fxR! ymRxxR! æa͟a!*f!z:fOG [*f!" y}Oæa!f~#yP!f:f:f#jPyP*f*f#"f6 *f*f#"f:fw.P!f:f:f#O!f:f#foMDæaRDR:PTP:CON:LST:͟a!9!~#V!~#fo~V!~#Væa!N#F͌Zi`"f:f :fVæa!"f!~#fo"f*f#"f~OG:fOG ÞMIP .P.P.P WP͟a!9!~#fo"f!~#fo"f!~#fo "f!~#fo#i]!i>2i2æa͟a!#~T!~#~Tæa!N#F!,I]f "f*f ~Tæa*fMDæa͟a!~#T!~T#~T!>w#w#fyOx#G!yx#Læa!!  #mL!!  #mL!!  #mL!~#fo"f!~#foMDæaæaLLLN#F̓Ti`"f!f~#žRæa*f ~DR*f~R*f ! i`"f:fR!f>>#R*f 6!~#foMDæa!>w>#w:f#ҎPÑPi`"f!f~#ʥP*f"f*f!y:fOG yOxGi`"f!N#FͧU:fր:fQ!! *f!! y;Q!!f*f~SW*f~w*f*f~a7W*f>z7W*f~OG! MD?W*f~OGyw*f#"f*f#"fW*f6!!}|:ftW:f«W!~#fo#i2i2i!iͻ]##~2f!~#fo ~#N!f~#Q!N#FͧU:fր:fGO:fGO!"f*f! *f!" y}Oæa!y:Vi`"f!f~#Uæa*f!N#F͜Vy1Uæa*f ~DcU*f ! xcU*f 6æa*f!~*f#w#w#w#w*fMTML{MPMCLDMM MM͟a.R!~#L!N#F̓Ti`"f!f~#Læa*f~OG!sLza*f ~OG!Lzaæa!N#FR͟a!~#*S!~S#~*S!>w#w#Vi`"f!f~#ASæa*f!N#F͜Vy]Sæa*f ~D—S*f ! *f!Z;Q!"f!y! *f!" yʃQæa*f!y:fOG !:fOG [!! *f!" yʃQ##~:«W!V!N#Fx[y X>L2f2fpX!~#fo 6D!~#fo "f*f6!~#fo#~:šX!~#fo~2f2f:fA:fX!f>PfOG "f!"f*f:f2f:f2f}Q*f*f#"f~2f:fOG!!Nza!z! *f!! yO!!!zZO*f !~#~*ff}o|g!,͑\MDæa͟a!~#fo#~2f#~2f#~2f#~2f!~#fo "f*f! !f!+`##~*f" !f!+!N#F*f5Næa>2f!~#fo"f!~#fo!~#fo "f*f ~#ʞM!f:f:f#һM*f*f#"f~OG:fOG JM>2f ! xSæa*f 6!N#F!N#F!N#FTæa͟a!N#F!# ySxS!fi]æa!~#fo! MD 2i  >#XX!V!N#Fx[y-X>C2f2fpX!V!N#Fx[yPX>P2f2fpX!V!N#Fx[yʆX>T2f2f!~#fo :fw94#^!9!9a#~#~+++~#~#~^#>#>+++>#~#~#~ #~{^>#># >#O>G! 9q#pa! 9N#F[! 9q#pa! 9N#F[! 9q#pa!9~\/<\aO!9~#fo) \=]!9~\/<\aO!w#~wZæa͟a!!~#~!~#fo~Z!~w#~wãZ!~#fo!yOx#Gæa͟a!N#F!~w#~w}[!N#F!9a!9~#fo##w>#w>+++w>#w!9N#F!9~#fo  # # #a!9N#F!9~#fo ## # +++ #a~#†aæa!~#fo 6æa*f#"f2f2f:f:f8Y!~#fo~X!~#fo~.YXæa*f*f }!~w#~wÚX*f*f#"͇^!9MD!9~#foͯ^! 9MD!9~#foͯ^^!9N#F!9^Ô^͇^!9MD!9~#foͯ^! 9MD!9~#foͯ^^!9N#F!9^Ô^͇^! 9M9~#fo||g}o ]=]!9~&]/<\aO!9~#fo|g}o 2]MD!9q#pa!! 9~+ʂ]~h]! 9N#F ! 9~w#~w! 9~w+~w~w#~w!~Zæa͟a!N#F!~w#~w}k[!N#F!~w#~w!N#F!~w#~w~[!~#foMDæa͟a!~#~#foy#šax#›a+++~#fo##za!9!9*i*i*ii`!"i"i"i!9N#F###q#p+++q!9N#F#q#pV2.1: f6 *f#"fèX*f*f#"f!N#F!~w#~w~Y!~#fo~cY!~#fo~.cY!~w#~w8Y!~#fo~.~Y!~w#~w2D!9~#fo#͝^!9MD!9~#fo#͝^^!9N#Fkb9^Ô^͇^{_!9~_/<`aO!9~#fo##~w#~w+++~w#~w _a!9~`/<O]!9q#pa!9N#F!9~#fo ## # +++ #a!9N#F!9~#fo  # # #a~#~#~#~#~#~#~#~BADSPOTS #fo!~#fo ʵ[æa!~w#~w!~w#~w{[!~#fo~˜[æa!9~w#~w#~w#~w+MD!9 _ #[{ !9copyright (c) 1979 by Whitesmiths, Ltd.2f2f:f:fY!~#fo~Y*f*f#"f6 Z*f *f *f *f 6~ w~æa*f*f#"f!N#F!~w#~_aO!9~#fo##+~~w+~w###~w+~w `a!9~;`/<_aO!9~#fo##+~w+~w###~w+~w I`a!9~#foN#F#N#F! 9~#foN#!9MD!9~#~#~#~ !9~w#~w#~w#~w#~w#~w#~w#~w!9MD! 9  # # ##^!9MD! 9  # # #!     4[! 9~\+w>#w! 9N#Fx0\O>G[@\O>G! 9q#pa! 9~b\+w>#w! 9N#Fxv\O>G[҆\w~*f#"fÅY͟a!N#F!~w#~w}ʉZ!~#fo!~#fo~AiZ!~#fo>ZiZ!~#fo~OG! MDvZ!~#fo~OGyw!~F#N#F!!9~+++`~һ`!9MD!9  # # #!9~w#~w#~w#~w!9~w+~w+~w+~wÌ`!9N#F!9~#~}|!   to physical drive units. When a drive is specified in a command the drive type is determined by examining the file "vit and format of this map.) "bad" is a menu style utility program for dealing with this map and prohibiting CP/M fileals.bad" on the currently logged drive. If the drive type can not be determined then an error is reported. Ea systems from accessing the bad locations. There are basically three seperate functions performed by "bad": 1) rech line in the vitals file consists of fields describing the type of drive and where the bad map information may be locatedad and display the bad map contents, 2) add sectors to the bad map 3) read the bad map and write CP/M directory entrieiCNAME bad -- bad spot utility program SYNOPSIS bad DESCRIPTION The hard disk format program "formathd" has. The first line of the vitals file is reserved for titling information. The fields are: cpmspt - The numbes to allocate the bad spots to a CP/M file. All three bad functions work on CP/M logical drives, as opposed CC an option to test the disk, leaving a map of any bad spots for future reference. (See formathd for the exact location r of CP/M sectors per CP/M track cpmdsm - The disk size maximum (see DPH and DPB) mapcyl - The cylinder where the bad map one of your files contains a bad spot. The proper way to proceed in this case is to save as much of the file as possible  have no more sectors to enter. The updated bad map is then written back on to the disk. fix Reads a bad map from the. Suppliers of Cpm should arrange for more informative error messages. It is impossible to patch a bad spot which li get Reads the bad map and displays the contents on the console. The format of the output is: track head sector .pes, there are two ways to proceed. The most time consuming is to back up the disk, run the formathd program, run fixblives maphed - The head where the bad map lives mapsec - The sector where the bad map lives maplen - The number of physby copying into another file, then erase the original file, then press ^C to ensure the integrity of the in memery CP specified drive and creates CP/M directory entries which effectively allocate the bad spot on the disk to the new file. Tes in the area of a CP/M directory. The only possible way of dealing with this problem is to have the CP/M CBIOS handl.. for each entry in the bad map. You are asked if you'd like copy of the bad sectors list in a file. If you enter aad, and then restore the disk. Alternatively, if you know the hard disk track, head, and sector number of the new bad spot,ical sectors the bad map occupies ncyls - The number of physical cylinders on the drive nheds - The number of physi/M disk allocation bit-map. The hard disk is shipped from the factory with any necessary badspot files already ihe file is hidden form the user by placing it in user 15 and making it a system file with write protection. No attempt e the bad sector sparing. If a bad spot is already allocated to a file there an error message to that effect is issu file name, a file is produces containing this list. If you simply press return, no file is produced. put You are pr you can run putbad to add the new bad spot to the map and then run fixbad. BUGS It is very difficult to discovercal heads on the drive nsecs - The number of physical sectors on the drive secsize- The physical sector size name - nstalled. (Shugart and Memorex do not guarantee freedom from bad spots, although they do guarantee a certain maximum, and ashould be made to read or write the file. All such created files are given the name "BADSPOTS". You will be notified if ed. This means that the bad spot is still a potential hazard. The best way around this problem is to fix drives with nompted for track, head, sector triplets in the form: track # head # sector # ... until you answer that you the track, head, and sector number of a bad spot when Cpm's only error message is "Bdos error on drive e: bad sector"A short english description of the drive Following are more detailed descriptions of the sub-functions of the bad program. n error-free track 0.) So ordinarily, the hard disk user will not need these programs. If a new bad spot develo o other files.  singl an double-side drives User wit double-side drive mus us double-side diskette i orde t tak advant writ diskette formatte i IB 374 singl densit forma an IB syste 3 doubl densit format Thi compatib relocate CP/ progra i create usin th command: A>movcpm xx (wher x i th syste siz o fo a Versio 2.2 Cbio revisio E. wit whic user accustome t singl densit CP/ o inc drive ma no b famili loader i i th fil ABOOT&.ASM Th tw files BIOS.CO an CBIOS.COM ar example o dis an termina I/Ϡ routineag o th built-i double-side features I single-side diskette ar use i double-side drive th single-silit wit IB diskette i onl i th formattin information no i th fil structure Thi mean tha th Dis Jocuto-sizing th relocate CP/ wil begi executing However th relocate CP/ i highl unstable I particular i ar I addition som explanatio i require fo certai utilit com mand provide b Morro Designs Thes specia supplie b Digita Research. MOVCPM Th MOVCPM.CO featur o CP/ ca b use t directl relocat th "col bide parameter o th CBIOӠ wil tak precedence Likewise i double-side diskett i inserte an th syste ke 2D/ o Dis Jocke DM ca rea IB diskettes bu specia softwar i neede t rea IB files N chang i nec war boo occurs th syste ma no re-boo properly Thi i no bu i th MOVCPM.CO program bu rathe  feature an utilitie ar discusse below. CBIOS Th CBIO supplie wit CP/ Versio 2. ha som uniqu featureoot loader th CBIO an CP/M I modification ar don t an o th above th MOVCPM.CO progra wil relocat al i warm-boote the th double-side feature wil b switche on Eg ms seek an extende storage Th CBIO ressar withi th CBIO t allo user t rea and/o writ an o th IB standar secto sizes Th CBIO als support functio o th origina an relocate CP/M's I i recommende tha th followin procedur b use instea ([RET  whic allo user t easil us flopp diskette o differen densitie and/o secto sizes Th CBIO wil rea an bu th modifie portion correctly Follo th procedure o th nex pag i an o th abov section ar modified I Notes on CP/M Ver. 2.2 with Cbios rev.E.3. Ther ar severa feature o Morro Design versio o CP/equire approximatel 5 o memory Th sourc fo th CBIO i i th fil CBIOS&.ASM an th sourc fo th COL boo mean pres th RETUR key): A>movcpm xx *[RET] A>sysgen[RET] cold boot the system. This will insure thprogra tha inquire th secto siz - 128 256 512 o 102 byte - t b formatted an th driv - A B C o - whe densit controlle ca n longe fi o th firs tw track i formatte i singl density Thi mean tha yo ca o 1 inc har disks o FORMATMW.CO͠ ( 1/ inc har disks shoul b used. CAUTION! Us cautio wit th har disea o tim o th densit o diskette Jus inser th diskette th res i take car of Car mus b taken  driv wil alway b th firs flopp dis drive. Formatting a Diskette - FORMATDJ Th comman fil FORMATDJ.CO forat the newly relocated CP/M is stable. Fo user wit th har dis systems th MOVCPM.CO͠ progra relocate th CBIOr th initializatio wil tak place Th driv specifie reflect th flopp drive only nothin else Formattin drivnl boo u wit diskett tha ha bee formatte wit 102 byt doubl densit sectors. F forma programs The eras th dat o th har dis an i ca no b recovered I yo hav t forma th disk thihowever whe removin o replacin diskett whic ha alread bee accesse b CP/M dis rese operatio shoul mat an initialize bot 1/ an inc diskette fo th DJDM flopp dis controller. Thi progra i menu-drive a an BOO fo th har dis version not fo th flopp version. Assigning Density User familia wit th Lifeboat format th firs flopp connecte t th Dis Jocke 2D Formattin diskett wil automaticall writ secto ormatting a Diskette - FORMT# Th comman fil FORMT#.CO wil format o initialize flopp diskett i an IB standan abou wha i o th har dis befor proceeding. Reconfiguring a System T reconfigur th CP/ syste fb don eithe b performin war boot o b makin BDO cal t rese th dis syste (se th CP/ interfac guide)n i therefor sel explanatory Simply enter A>FORMATDJ[RET] and follow the instructions. Formatting /Morro Design 2 CP/ Ver 1.4 wh ar accustome t usin th DENSITY.CO͠ program wil appreciat th abilit header fo th selecte secto size Agai not tha i you floppie hav bee adde t you syste vi th INSr forma fo user wit Dis Jocke 2D/ flopp dis controller Typin A>FORMT#[RET] execute o you particula hardware yo nee th MA assemble (no include wit syste software t assembl th CBIOS&.AS . A thes ne feature hav bee added th siz o th Cbio ha grow t th poin wher th versio fo th doublthe Hard Disk - FORMATHD and FORMATMW I栠 i i desire t forma th har disk th progra FORMATHD.CO͠ ( ano th curren program t automaticall determin diskett density Ther i n nee t infor CP/ Versio 2. ahTAL program o i the ar drive C: D o above the th CP/ driv number hav nothin t d wit FORMT an tha =COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃T HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB AN@* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z z `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =«!ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷa. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f fi.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oA XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= M!EO=!9 Ÿ!6q!2qC J R q!z z=naO $q$,! f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEË DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.ÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘âê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qy ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ C–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#  2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRE_!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 z8O!B N#N ¾SP.* |} !9":q!" 2͐ f "]=f =« *]}o"_  *]" 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"28 ;CP/M sects/host buff cpmspt equ hstblk * hstspt ;CP/M sectors/track secmsk equ hstblk-1 ;sector mask smask hstblk ;compZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_f ;; @y is not 1, shift right one position @y set @y shr 1 @x set @x + 1 endm endm ; ;*********************************q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ;***************************************************** ;* * ;* Sector D$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!Iute sector mask secshf equ @x ;log2(hstblk) ; ;***************************************************** ;* )*)þ))>+><7"9.Yͯ * M^2U******************** ;* * ;* CP/M to host disk constants ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6eblocking Algorithms for CP/M 2.0 * ;* * ;*******************************$I$I$UUU$$A$  * ;* BDOS constants on entry to write * ;*  :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI  * ;* * ;***************************************************** blksiz equï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~********************** ; ; utility macro to compute sector mask smask macro hblk ;; compute log2(hblk), return @x as result  * ;***************************************************** wrall equ 0 ;write to allocated wrdir equ 1 ;write D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I  2048 ;CP/M allocation size hstsiz equ 512 ;host disk sector size hstspt equ 20 ;host disk sectors/trk hstblk equ hstsiz/1x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁt ;; (2 ** @x = hblk on return) @y set hblk @x set 0 ;; count right shifts of @y until = 1 rept 8 if @y = 1 exitm endi to directory wrual equ 2 ;write to unallocated ; ;***************************************************** ;* **************************************** read: ;read the selected CP/M sector xra a sta unacnt mvi a,1 sta readop ;rctor given by register c mov a,c sta seksec ;sector to seek ret ; setdma: ;set dma address given by BC mov h,b mf not ; ; more unallocated records remain dcr a ;unacnt = unacnt-1 sta unacnt lda sekdsk ;same disk? lxi h,unadsk home: ;home the selected disk home: lda hstwrt ;check for pending write ora a jnz homed sta hstact ;clear host activeccumulator sta readop ;not a read operation mov a,c ;write type in c sta wrtype cpi wrual ;write unallocated? jnz c * ;* The BDOS entry points given below show the * ;* code which is relevant to deblocead operation sta rsflag ;must read data mvi a,wrual sta wrtype ;treat as unalloc jmp rwoper ;to perform the read ; ov l,c shld dmaadr ret ; sectran: ;translate sector number BC mov h,b mov l,c ret ; ;***************************cmp m ;sekdsk = unadsk? jnz alloc ;skip if not ; ; disks are the same lxi h,unatrk call sektrkcmp ;sektrk = unatrk?  flag homed: ret ; seldsk: ;select disk mov a,c ;selected disk number sta sekdsk ;seek disk number mov l,a ;diskhkuna ;check for unalloc ; ; write to unallocated, set parameters mvi a,blksiz/128 ;next unalloc recs sta unacnt lda seking only. * ;* * ;*****************************************************  ;***************************************************** ;* * ;* The WRITE en************************** ;* * ;* The READ entry point takes the place of jnz alloc ;skip if not ; ; tracks are the same lda seksec ;same sector? lxi h,unasec cmp m ;seksec = unasec? jnz al number to HL mvi h,0 rept 4 ;multiply by 16 dad h endm lxi d,dpbase ;base of parm block dad d ;hl=.dpb(curdsk) kdsk ;disk to seek sta unadsk ;unadsk = sekdsk lhld sektrk shld unatrk ;unatrk = sectrk lda seksec sta unasec ;una; ; DISKDEF macro, or hand coded tables go here dpbase equ $ ;disk param block base ; boot: wboot: ;enter here on systemtry point takes the place of * ;* the previous BIOS defintion for WRITE. * ;*  * ;* the previous BIOS defintion for READ. * ;* * ;*************loc ;skip if not ; ; match, move to next sector for future ref inr m ;unasec = unasec+1 mov a,m ;end of track? cpi cpret ; settrk: ;set track given by registers BC mov h,b mov l,c shld sektrk ;track to seek ret ; setsec: ;set sesec = seksec ; chkuna: ;check for write to unallocated sector lda unacnt ;any unalloc remain? ora a jz alloc ;skip i boot to initialize xra a ;0 to accumulator sta hstact ;host buffer inactive sta unacnt ;clear unalloc count ret ;  * ;***************************************************** write: ;write the selected CP/M sector xra a ;0 to a mspt ;count CP/M sectors jc noovf ;skip if no overflow ; ; overflow to next track mvi m,0 ;unasec = 0 lhld unatrk itdsk lhld sektrk shld hsttrk lda sekhst sta hstsec lda rsflag ;need to read? ora a cnz readhst ;yes, if 1 xra ve, same as seek buffer? lda sekdsk lxi h,hstdsk ;same disk? cmp m ;sekdsk = hstdsk? jnz nomatch ; ; same disk, same  ;buffer written call writehst lda erflag ret ; ;***************************************************** ;*  * ;***************************************************** rwoper: ;enter here to per direction mvi a,1 sta hstwrt ;hstwrt = 1 xchg ;source/dest swap ; rwmove: ;C initially 128, DE is source, HL is denx h shld unatrk ;unatrk = unatrk+1 ; noovf: ;match found, mark as unnecessary read xra a ;0 to accumulator sta rsfla ;0 to accum sta hstwrt ;no pending write ; match: ;copy data to or from buffer lda seksec ;mask buffer number anitrack? lxi h,hsttrk call sektrkcmp ;sektrk = hsttrk? jnz nomatch ; ; same disk, same track, same buffer? lda sekhst  * ;* Utility subroutine for 16-bit compare * ;* form the read/write xra a ;zero to accum sta erflag ;no errors (yet) lda seksec ;compute host sector rept secshf orst ldax d ;source character inx d mov m,a ;to dest inx h dcr c ;loop 128 times jnz rwmove ; ; data has been movag ;rsflag = 0 jmp rwoper ;to perform the write ; alloc: ;not an unallocated record, requires pre-read xra a ;0 to ac secmsk ;least signif bits mov l,a ;ready to shift mvi h,0 ;double count rept 7 ;shift left 7 dad h endm ; hl haslxi h,hstsec ;sekhst = hstsec? cmp m jz match ;skip if match ; nomatch: ;proper disk, but not correct sector lda hstw * ;***************************************************** sektrkcmp: ;HL = .unatrk or .hsttrk, compare with a a ;carry = 0 rar ;shift right endm sta sekhst ;host sector to seek ; ; active host sector? lxi h,hstact ;host aced to/from host buffer lda wrtype ;write type cpi wrdir ;to directory? lda erflag ;in case of errors rnz ;no furthecum sta unacnt ;unacnt = 0 inr a ;1 to accum sta rsflag ;rsflag = 1 ; ;********************************************** relative host buffer address lxi d,hstbuf dad d ;hl = host address xchg ;now in DE lhld dmaadr ;get/put CP/M data rt ;host written? ora a cnz writehst ;clear host buff ; filhst: ;may have to fill the host buffer lda sekdsk sta hssektrk xchg lxi h,sektrk ldax d ;low byte compare cmp m ;same? rnz ;return if not ; low bytes equal, test high 1stive flag mov a,m mvi m,1 ;always becomes 1 ora a ;was it already? jz filhst ;fill host if not ; ; host buffer actir processing ; ; clear host buffer for directory write ora a ;errors? rnz ;skip if so xra a ;0 to accum sta hstwrt******* ;* * ;* Common code for READ and WRITE follows * ;*  mvi c,128 ;length of move lda readop ;which way? ora a jnz rwmove ;skip if read ; ; write operation, mark and switch  inx d inx h ldax d cmp m ;sets flags ret ; ;***************************************************** ;* iz ;host buffer ; ;***************************************************** ;* isk number hsttrk: ds 2 ;host track number hstsec: ds 1 ;host sector number ; sekhst: ds 1 ;seek shr secshf hstact: ds 1ew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (w = host track #, ;hstsec = host sect #. read "hstsiz" bytes ;into hstbuf and return error flag in erflag. ret ; ;*******def parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logi * ;* WRITEHST performs the physical write to * ;* the host disk, READHST reads the p * ;* The ENDEF macro invocation goes here * ;* * ;****************** ;host active flag hstwrt: ds 1 ;host written flag ; unacnt: ds 1 ;unalloc rec cnt unadsk: ds 1 ;last unalloc disk unatord) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of ********************************************** ;* * ;* Unitialized RAM data cal disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,...,hysical * ;* disk. * ;* * ;*********************************************************************** end rk: ds 2 ;last unalloc track unasec: ds 1 ;last unalloc sector ; erflag: ds 1 ;error reporting rsflag: ds 1 ;read sectortracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defiareas * ;* * ;***************************************************** ;n-1) ; ; each parameter-list-i takes the form ; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] ; where ; dn is the disk number 0***************** writehst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. write "hstsiz" bytes ;fr; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ;  flag readop: ds 1 ;1 if read operation wrtype: ds 1 ;write operation type dmaadr: ds 2 ;last dma address hstbuf: ds hstsnes disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is de sekdsk: ds 1 ;seek disk number sektrk: ds 2 ;seek track number seksec: ds 1 ;seek sector number ; hstdsk: ds 1 ;host d,1,...,n-1 ; fsc is the first sector number (usually 0 or 1) ; lsc is the last sector number on a track ; skf is optional "skom hstbuf and return error flag in erflag. ;return erflag non-zero if error ret ; readhst: ;hstdsk = host disk #, hsttrk; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; disk fined by ; disks 4 ; diskdef 0,1,26,6,1024,243,64,64,2 ; dsk set 0 ; rept 3 ; dsk set dsk+1 ; diskdef %dsk,0 ; endm nts for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn eqmacro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;;  > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; 00h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc veclls with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not fou ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the biou als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table produces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variablnow generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries petors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter blnd yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkvas, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is  else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocate for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif r block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again ocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro dl set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a largeion vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate tgcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set stateme ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks eln dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks) disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,00he block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fi se dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb  fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lTYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous element%blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buREADF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHs nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxr 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate tablffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm eIC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NAtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOXe, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; generanddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; ME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FC nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;te the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn  BRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ;FCB MVI C,TYPEF MOV E,A CALL BDOS POP B! POP D! POP H; RESTORED RET ; CRLF: MVI A,CR CALL PCHAR MVI A,LF CALL PCO NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C, HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALL ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH C LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK ARHAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMTHAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB M LINE POSITION JC FINIS ;CARRY SET BY GNB IF END FILE MOV B,A ; PRINT HEX VALUES ; CHECK FOR LINE FOLD MOV A,L ANI 0FHARRY SET FOR EOF STC RET ; G0: ;READ THE BYTE AT BUFF+REG A MOV E,A ;LS BYTE OF BUFFER INDEX MVI D,0 ;DOUBLE PRECISIONEA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FIP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRC; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,BVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR, ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARA INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI HLE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR  RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE RKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;CTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;T,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; JMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ;ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0   ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END  ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FI)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"9m++s#r!9+s#r9";9;"^*mM 6*m+"o!o#s#r!6!f6!6:] :m H}- :\LE PRESENT ON DISK$!Y , <    *$A!6 # T!w $r# *`: 0 ! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+"2d‘ 2dÝ:d=2d!\6:l2e±:d2eø:e=2eEU !M6 !""*o"$!h61m!6#1m!6?1m!6>1m!f6*A*! ~ ʰxkb))))_y‘BK{ͅ*!66!"80*{#z+++ #!!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6   *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2d COPYRIGHT (C) 1979, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE IT$NEW FILE$** FILE IS READ/ONLY **$"SYSTEM" LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t !9"1W͜Q>2!͢QG}DrYQ|͏}͏#> ex͏#r* _> e> eû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ FFILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mM"m +!8s~!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q*- ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: ͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:":*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎:7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x :f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O"&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- ! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6!e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : 6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O!N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2": ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :!=e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!*r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q* N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{.+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!! (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F”*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"` *22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&oHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! =qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO*$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:! “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~g_{_z#W H = LIB6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"ADCOMf^: ! Â$$$ SUBe2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6 *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!X$$$$$$$LIBڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq""C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E ,:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧ"&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6 *FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "P &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q!7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"&   O͐  : E  B 2 >: b # : y! 4 5~yy 5 6yS:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK52*C ~=2u:B 2~2wE:A *C w>"O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ *2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==» Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  *C ^ O T  *C ~w D  -'   -@ ͦ ~^ *C  O x ! N!Fwy"**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈ !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q* yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #Nxʋ>ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# # NÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ ):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6"*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *#  2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎ: :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# :ʑw:2E* *E }DQ>2 ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w* i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{ 2E > ! ^#V w#P :B O|^#V#"##"##"##"!ì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  > Ù#Úçà   ýñ÷ö f  PMMMM(ʈ:SxS>P>P*&!:!T     %&'()*+, -£#:v"£#:w"£#x"ͮ Rw# x´o&))))~#O '+sj!2@n"~#fo"p"͸ڱ*=#ʮ~<ʴ:m"w#ͮÖ"!ñ BAD MAP OVERFLOW! !='y2R>2g"2<*k"|O|g+|g}_9ͮ! 'BO s#r!N:f"#*f"&)T]))Q6#6f#66#6|!} !;!""(((yOöMʪHM ʹyHM>:FO:FO:FO:FO. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;͆<2 $$" 7`i#2jy2͚~<]R>P!+|h?P J͆:}"  l2jy2!Q~¬!5+"R"##"Z""W"####"_"!Q"<"  =„!ɯOy2c":d"怱2d"yO:d"!y2e"!P6"#:e"w###D!:d"O!Q~o#|g"p"!m"s"##͸:k"=o&)))))))=#!>Hͫ:r"ͫ>2X>=>>> 2g2r"K2X .$*x"|.!P6#6#6!D!:@ʎ#)#) :.!.!2: @ʾ!y#ھ!W>"O>2þ!2 O!59AN yHM *KN:MGM:H2MGxA>!ͷ>22!"!"2v"2X2r":!u!^#V?@)*+,-./0?4 < @+ 4 h@x1R>P͚6Pȯå͚^q{?ڢ/<åGͥRR©þ`i"PʾRy2y2>  dدQ/SS>QJدQ*O#>O#>O#>>!> !Pb"w#)"+D!:T?>&2P"Q2SwL"ɡ%$.$*z"DM.$=#.$.$>7>xq.$qWm"!s"ͮ:<:R:g"**h"z{!m":j"=* ~2 y!: !  ! ! n&2 S!?: O! >w2 !"p"+"n"2<͸?:#!"n"͸?n >!n >O! ~?ʂ ####ͮ::ʎ:O1>2&.(DvÚ`i"k"`i"9:X2v"`i"n":m"g.(y2m"?{a.(|?2s#r#q#~@W@,!!.!;!""͞!P6Y#6#6!xD!:d@==#!ͮ#)|# )#=# SSSw#Sw#Sw#Sw#dدQ*~S#~S#~S#~S#'>QJ>7ȯPGJ>PP7Q7P 7>Qͥ R:S͚~SG'"''G'"v(v(PPzO?(?(Q?(?"h":m"2j">2g"ɯ2g":=>2g2r":s"g|;Oogy/#{_~#foy!=':s"O*zn{n*t""x"*v""z"y£#:t"£#:u"r #~2 _: O! s#~#foͶ  s#rͶ !: """"""""  !"hy2  2(:m"2|"a.(2^#V#N:m"_!P!:|"O:26:m"g. (|ʱ^#V#"2f"!9 ~#fo~ n&! ʼ/g2f"S!?!"p"#"n"2<͸?! ! G'"-*=*G'"S*c*G')W)G')) Morrow Designs 48K CP/M 2.2 E3 AB: DJDMA 8", CD: DJDMA 5 1/4"$$ " H J I!$ H@D @@ !B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I ld number jp nz,ptrkdn ;Skip if done inc c ;Bump offset inc de ; current pointer inc hl ; old pointer d; Print a track #, do fancy backspacing, ect. ; ptrack: ld (ptrk),hl ;Save ASCII pointer ld a,(ctrack) ;Load current track, EF: HDCA Fujitsu M10 122F2m"2!":E2='!>' ͮ6#5$!=#DI##$!'$_^#VUURA$ !DI @@H B $@"IHBB B@D @ @@@ DD@$ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$ec b ; counter jp nz,ptrkcp ;Compare next digit ret ;Numbers were the same ptrkdn: push hl ;Save pointer to fir$@B B HH II$@DI  push af ld hl,(ptrk) ;Place to deposite track # call decim3 ;Figure track # pop af inc a ;Bump to next track l$*G>KzI{H>KIM>LNMHH`0 >K*I|I}H>K>LHI(($ABI$@ $!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! st dirty digit ptrklp: ld (hl),a ;Copy dirty string over inc de ld a,(de) inc hl dec b jp nz,ptrklp ld hl,bsmess ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$d (ctrack),a ld bc,300h ;b = fore count, b = back count ld hl,(ptrk) ;Pointer to current track # ld de,otrack ;Pointeret to status byte ld (hl),a ;Clear halt status out (0efh),a ;Start controller waitc: or (hl) ;Wait for halt complete $I$I$ @APB @@@@@ I"H$H@D H H@@I$! $HD AD$B@A HB"A"D  ;Back space add hl,bc ;Offset neccesary amount call putm pop hl ;Retreive string pointer call putm ;And print l$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @ to old track # ex de,hl ;Set pointers the way we want them ptrkcp: ld a,(de) ;Get a digit cp (hl) ;Compare against o jp z,waitc dec hl ;Back up to command status dec hl ld a,(hl) ;Load status cp 40h ;Comper to Ok status ret ;  d c,6 ld e,0ffh call 5 ret ; ; Put 'a' in (hl) in ASCII decimal form with leading spaces ; decim3: ld c,"0" ;Initialmat for the string ; follows: ; ; db "initial prompt string" ; db 0 ;Null terminator ; db 2 ;Number of 'reply valuess ; were typed then return to start. ; getcc: call getc ;Get code jp m,start ;Restart if ESC or DEL ret ;Return renter gtchk: push bc ;Save reply count push hl ;Save string pointer gtwait: ld c,direct ;Direct console I/O ld e,255 urrent byte of message or a ;Test for end of message ret z ;Return at end of message push hl ;Save the character poin a 3 if an 'a', 'A', or acr is typed ; and a 5 if a 'd' or 'D' is typed. The routine prints a CRLF ; before the initial promize 'leader' flag ld d,100 ;Hundreds call decfig ld d,10 ;Tens call decfig decim1: ld c,0 ;Force leading 0 ld d' ; db "a", "A", acr ;A list of characters to be ; ; with the coresponding reply ; ; 'value.' ; db 83h ;Thegular status ; ; This routine prints a prompt and then accepts an input character. ; This input character is compared to a 'r ;We want input! call bdos or a ;Test for no character typed jp z,gtwait ;Wait for a character pop hl pop bc cp 3nter call putc ;Output the character pop hl ;Recover the character pointer inc hl ;Advance the character pointer jpt string and a CRLF after the reply ; string. If an ESC or DEL is typed then a code of 80h will be ; returned and the minus ,1 ;Ones jp decfig decfig: ld e,"0"-1 declop: inc e sub d jp nc,declop add a,d push af ld a,e cp c ;Handle reply value. Parity must ; ; be set. ; db "Reply echo string for a, A, or acr." ; db 0 ;Null terminator ; db "deply list'. If the ; character is found then an associated 'reply string' is echoed ; and a value associated with that charac ;Check for control C jp z,0 ; exit to CP/M cp aesc ;Escape and delete get special coverage jp z,gtspec cp adelp putm ;Go get the next character ; ; Print a character to the terminal ; putc: push af push bc push de push hl ldflag will be set. ; getc: push hl ld hl,crlf ;Print an initial CRLF call putm pop hl call putm ;Print prompt inc leading space (sometimes) jp nz,decok ld e," " ;Load space jp decokk decok: ld c," " decokk: ld (hl),e ;Save digit ", "D" ;A list of characters to be ; ; with the coresponding reply ; ; 'value.' ; db 85h ;The reply value. Pter is returned. ; ; The routine is called with a pointer to a string in hl and ; returns a value in (a) and (zero). The for jp z,gtspec ld b,a ;Save user reply gtscan: inc hl ;Bump to reply string ld a,(hl) ;Load reply character or a  e,a ld c,wcon call bdos pop hl pop de pop bc pop af ret ; ; Call getc. Parse ESC and DEL codes. If these code hl ;Bump to number of valid replies ld c,(hl) ld a,c ld (valid),a ;Save reply count ld (string),hl ;Save string poi inc hl ;Bump to next position pop af ret ; ; Print a null terminated text to the terminal ; putm: ld a,(hl) ;Get carity must ; ; be set. ; db "Reply echo string for d or D." ; db 0 ;Null terminator ; ; This structure will retur! ;Test for end of reply string jp m,gtflsh ;Not in this reply list, flush string cp b ;Compare to user reply jp nz,gtsca db 0 ;Status port byte db 0 ;Completion status db 25h db 0 sacmd: db 023h ;Set DMA address dw buffer db 0 s byte lsdcmd: db 0a1h ;Write controller memory for single dw single db 0 dw nsform-single dw 1030h db 25h db 0 "Select: Carriage_Return - Exit to CP/M",acr,alf db " I - 8"" disk (IBM 3740 compatable)",acr,alf db " N - 5.25"" disk (alize string pointer jp gtchk ;User guessed wrong, let us try again gtspec: ld a,80h ;Special flag or a ;Zap flags  nstype: db 90h db 0a0h db 0c0h db 0 db 0f0h db 0d0h db 0e0h tsize: db 26*256/100h ;Number of pages per track dn ;No match, continue scan gtdone: inc hl ;Look for reply value ld a,(hl) or a jp p,gtdone push af ;Save value i db 25h db 0 rtcmd: db 029h ;Read track command db 0 ;Track # db 0 ;Side # db 0 ;Drive # dw sectab ;Sacto dotcmd: db 0a2h ;Execute controller routine command dw 1030h ;Format a track address db 0 ;Execute command status CP/M-North_Star compatable)",acr,alf dw crlfs db "Select size of media (Carriage_Return, I, or N): " db 0 db 3 db "i",ret page slcmd: db 02eh ;Set/get logical drive settings db 0 ;Logical to set db 0 ;Logical drives returned db 25hb 15*512/100h db 8*1024/100h sptabl: db 27 ;26 sectors per track (256 bytes) db 16 ;15 sectors per track (512 bytes) nc hl ;Bump to response message call putm ld hl,crlf ;Print a trailing CRLF call putm pop af ;Restore reply value r table db 0 db 0 ;Status db 25h db 0 nscmlm: db 0a1h ;Load controller memory dw nsform db 0 dw ecode-nsfor db 25h ;Halt command db 0 ;Status byte atcmd: db 0a2h dw sdadvt ;Advance the track value address db 0 db 25h  "I", 80h db "IBM 3740 format" db 0 db "n", "N", 81h db "CP/M - North_Star format" db 0 db alf, acr, 82h db "Retur db 0 lddcmd: db 0a1h ;Write controller memory command dw double ;Main memory address pointer db 0 dw single-doub db 9 ;8 sectors per track (1024 bytes) page qfmess: dw crlfs db "DJDMA Format Program (Rev 3.3 - 30_Mar_83)", acr, alf  and 7fh ;Clear parity bit ret gtflsh: inc hl ;Look for and of message (null) ld a,(hl) or a jp nz,gtflsh dec c m dw 1030h db 25h db 0 nscmex: db 0a2h ;Execute controller memory dw 1030h db 0 db 25h db 0 nscmat: db 0a2 db 0 sscmd: db 022h ;Sense drive status db 0 ;Drive # db 0 ;Drive characteristic byte db 0 ;Sector size byte ning to CP/M" db 0 drmess: db "Select a drive ( 0, 1, 2, or 3 ): " db 0 db 4 db "0", acr, 80h db "Preparing to formle ;Byte count dw 1030h ;Controller memory address pointer db 25h ;Controller halt command db 0 ;Halt command statu db " Type ESC or DEL to restart selections", acr, alf db " The option listed first is the default", acr, alf dw crlfs db ;Bump reply count jp nz,gtscan ;Continue scan ld a,(valid) ;Reinitialize reply count ld c,a ld hl,(string) ;Reinitih ;Advance track command (internal) dw advtrk db 0 db 25h db 0 nstrak: db 35 ;Track count table db 40 db 80 " at drive 0" db 0 db "1", 81h db "Preparing to format drive 1" db 0 db "2", 82h db "Preparing to format drive 2" db program, or (C)ycle: " db 0 db 2 db "r", "R", 80h db "Restarting program" db 0 db "c", "C", acr, 81h db "Cycling"acr, alf db " D - double sided media.", acr, alf db " " db 0 db 2 db "s", "S", acr, 80h db " Single sided media srack (bytes) verval: db 0 ;Byte to verify with nside: db 0 ;Number of sides flag ntrack: db 0 ;Number of tracks on currb 0 slmess: db "Select the sector length ( 2=1024, 1=512, 0=256 ): " db 0 db 3 db "0", 80h db "256 byte sectors" db ;Back terminal 3 spaces db 0 otrack: db " 0" ;Old ASCII track number db 0 vdmess: dw crlfs, crlfs db "Verify do 0 db "3", 83h db "Preparing to format drive 3" db 0 dnmess: db "Select: D - double density", acr, alf db " S - singl db 0 wdmes5: dw crlfs, crlfs db "Insert a write enabled diskette in 5 1/4 inch drive " wdriv5: db "0." db 0 wdmes8elected." db 0 db "d", "D", 81h db " Double sided media selected." db 0 nrmess: db "Drive not ready - (R)estart prent drive ctrack: db 0 ;Current track number ptrk: dw 0 ;Pointer to ASCII track # retryh: db 0 ;Retry counter, hard  0 db "1", 81h db "512 byte sectors" db 0 db "2", acr, 82h db "1024 byte sectors" db 0 nsmess: db "Select: C - CPne." dw crlfs db 0 vemess: dw crlfs, crlfs db "Fatal verify error, probable bad diskette." dw crlfs db 0 vsmess:e density", acr, alf db " " db 0 db 2 db "d", "D", acr, 81h db " Double density selected." db 0 db "s", "S", 80: dw crlfs, crlfs db "Insert a write enabled diskette in 8 inch drive " wdriv8: db "0." db 0 wdmess: db "Close the driveogram, or (C)ycle: " db 0 db 2 db "r", "R", 80h db "Restarting program" db 0 db "c", "C", acr, 81h db "Cycling" retrys: db 0 ;Retry counter, soft valid: db 0 ;Temp save for number of valid replies string: dw 0 ;Temp pointer to parse/M compatibility or",acr, alf db " N - North star compatibility", acr, alf db " " db 0 db 2 db "n", "N", 80h db "  dw crlfs, crlfs db "Sector verify error" dw crlfs db 0 crlf: dw crlfs db 0 page drive: db 0 ;# of drive being fh db " Single density selected." db 0 ntmess: db "Select the number of tracks ( 0=35, 1=40, 2=80 ): " db 0 db 3  door and then press " db 0 db 1 db alf, acr, 80h db 0 ftmess: dw crlfs db "Formatting track:" ftrack: dbdb 0 femess: dw crlfs db "Drive has become 'not ready' during formatting" db 0 wpmess: db "Write protected - (R)estart trees sectab: db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;Sector status table db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 0,  North Star format." db 0 db "c", "C", acr, 81h db " CP/M format." db 0 simess: db "Select: S - single sided or", ormatted densty: db 0 ;Density flag for current drive nspt: db 0 ;Number of sectors per track trksiz: dw 0 ;Size of a tdb "0", acr, 80h db "35 track drive" db 0 db "1", 81h db "40 track drive" db 0 db "2", 82h db "80 track drive" d " 0" ;ASCII track number db 0 vtmess: dw crlfs db "Verifying track: " vtrack: db " 0" db 0 bsmess: db 8, 8, 8 # 0, 0, 0, 0 page ; ; The following routines are the actual formatting routines. ; These routines are loaded into controller ormal write/no crc ld (de),a ;Initialize control port ld a,0 precmp equ $-1 ;Write precompensation & controller start lc a,a ;Push carry bit throughout accumulator or 0feh ;Low current bit now set and (iy+2) ;Merge with drive pattern or 2d (hl),0 ;Write the track number dtrck equ $-1 ld (hl),0 ;Write the side dside equ $-1 ld (hl),1 ;Write the sector numb0 ;Reset index counter ld a,(dtrck) ;Get the new track value cp (iy+1) ;Compare with current track push af ;Save the tra ld b,32h ;Postamble length ddlbl5: ld (hl),4eh djnz ddlbl5 ;Write the postamble dmloop: ld b,0ch ;Zero preamble lengRAM at 1030h ; and executed as needed. Currently there are 3 routines: ; ; IBM 8 inch single density. ; IBM 8 inch double dd (4006h),a ;Start the controller ddlbl3: ld (hl),4eh djnz ddlbl3 ;Write the preamble ld b,0ch ;Zero preamble length ddl ;Select side 0 ld (iy+2),a ;Restore drive pattern or 0ch ;Turn off step command ld (4005h),a ;Update the drive registerer dsect equ $-1 ld (hl),1 ;Sector length code dlcode equ $-1 ld a,0a1h ;Mode to write crc bytes ld (de),a ;Change mock call nz,seek ;Move the head(s) if needed ld hl,diskd ;Pointer to disk shift register ld de,contrl ;Pointer to control th ddlbl6: ld (hl),0 djnz ddlbl6 ;Write the preamble ld a,81h ;16 bit write mode w/crc ld (de),a ;Change mode ld (hlensity. ; North Star 5 1/4 inch multi desity. ; ; ; IBM 8 inch single density formatter routine ; double equ $ .phase bl4: ld (hl),0 djnz ddlbl4 ;Write the zero preamble ld a,80h ;Control byte for 16 bit write ld (de),a ;Change mode ld ld b,50h ;Preamble length ddlbl1: ld a,(status) and index ;Look for index pulse jr nz,ddlbl1 ;Wait for no index pulse de ld (hl),a ld (hl),a ;Write the crc bytes ld a,90h ;Reset crc generator ld (de),a ;Change mode ld b,16h ;4e postport pop af ;Recover the tack cp 2bh ;Compare with track 43 ld a,4 ;No write precompensation jr c,loadpc ;Carry => tr),44h ;First half of a1 ld (hl),89h ;Second half of a1 ld (hl),44h ;Second a1 ld (hl),89h ld (hl),44h ;Third a1 ld a,91030h ddfmt: ld hl,status bit 7,(hl) ;Check that the drive is ready nrexit: ld a,82h ;Drive not ready error code ret z  (hl),52h ;First half of c2 ld (hl),24h ;Second half of c2 ld (hl),52h ;Another c2 ld (hl),24h ld (hl),52h ;The third c2present ddlbl2: ld a,(status) and index jr z,ddlbl2 ;Wait for leading edge of new indes pulse ld a,90h ;Control byte - namble length ddlbl7: ld (hl),4eh djnz ddlbl7 ;Write the postamble ld b,0ch ;Data field preamble ddlbl8: ld (hl),0 djnzack is less than 43 ld a,14h ;Write precompensation bit set loadpc: ld (precmp),a ;Setup the write precompensation byte sb1h ;8 bit write mode w/crc ld (de),a ;Change mode ld (hl),89h ;Finish sync bytes ld (hl),0feh ;Sector header id byte l;Error exit bit 6,(hl) ;Test for write protected ld a,90h ;Write protected error code ret nz ;Error exit ld (ix+0bh), ld a,90h ;Control byte 8 bit write ld (de),a ;Change mode ld (hl),24h ;Finish the sync bytes ld (hl),0fch ;Index mark$  ddlbl8 ;Write the preamble ld a,81h ;16 bit write w/crc ld (de),a ;Change mode ld (hl),44h ;First half of a1 ld (hl)ld (4005h),a ;Update the command register ld (hl),4eh ;First preamble byte jp ddlbl3 ;Format the other side ddlblc: ld (hl ld a,(dside) xor b ;Conditionally switch the side byte ld (dside),a ;Update the side byte ld (hl),4eh ;Second fill byt not ready code ret z ;Error exit bit 6,(hl) ;Write protect bit ld a,90h ;Write protect error code ret nz ld (ix+0bte the crc bytes ld (hl),a ld a,90h ;Turn off the crc generator ld (de),a ;Change mode ld a,(dsect) ;Get the sector nuroper drive number call sdrive ;Select the new drive ret nz ;Return if wrong value ld a,(iy+2) ;Get the drive pattern ,89h ;Second half of a1 ld (hl),44h ;Second a1 ld (hl),89h ld (hl),44h ;Third a1 ld a,91h ;8 bit write w/crc ld (de),),4eh ;Trailing fill byte ld (hl),4eh ;Trailing fill byte ld (hl),4eh ;Trailing fill byte xor a ld (de),a ;Turn off thee ld b,4fh ;Preamble length less one ex Af,Af' ;Save the double sided status dlblb: ld (hl),4eh ;Write a fill byte ld ah),0 ;Reset the index counter ld a,(strck) ;Get the new track cp (iy+1) ;Compare with current track call nz,seek ;Do tramber inc a cp 1bh ;Test for last sector +1 dlast equ $-1 ld (hl),4eh ;First byte of postamble jr nz,$+4 ;Zero => all or 0fh ;Side 0 and no step command ld (4005h),a ;Update drive control register ld hl,0 ;Delay for the head load sdwait: da ;Change mode ld (hl),89h ;Finish the 3 sync bytes ld (hl),0fbh ;Data header id byte ld b,40h ;Sector length divided by write gate ld a,6 ld (4006h),a ;Turn off the controller ld a,40h ;Status code ret ddadvt: ld a,(dtrck) ;Get the curre,(status) and index ;Wait for the index pulse jr z,dlblb ex Af,Af' ;Recover the double sided status jr z,ddlblc ;Zero ck seek if necessary ld hl,diskd ;Controller data register ld de,contrl ;Control register ld b,28h ;Preamble length sdlbsectors written ld a,1 ld (dsect),a ;Update the sector number ld b,35h ;Postamble length less one ddlbla: ld (hl),4eh ec hl ld a,h or l jr nz,sdwait ld (ix+0bh),a ;Reset the index counter sdtrk0: call home ;Calibrate the head(s) bit 5 four dsize equ $-1 ddlbl9: ld (hl),0e5h ;Empty sector data byte ld (hl),0e5h ld (hl),0e5h ld (hl),0e5h ;Write four fillnt track value inc a ;Increment ld (dtrck),a ;Restore the new value ret ;Return with current track value .dephase p=> track write is done ld a,(iy+2) ;Drive pattern or 0ch ;Turn off the step command and 0fdh ;Change read/write heads l1: ld a,(status) and index jr nz,sdlbl1 ;Wait for no index pulse sdlbl2: ld a,(status) and index jr z,sdlbl2 ;Wait fodjnz ddlbla ;Write the postamble jr nz,dmloop ld (hl),4eh ;First fill byte ld b,0 ;Double sided bit test ddsbit equ $-1,(hl) ;Test for track zero jr z,snrext sdrdy: ld hl,status bit 7,(hl) ;Test for the drive ready snrext: ld a,82h ;Drive bytes djnz ddlbl9 ;Test for data field write done ld a,0a1h ;Crc control byte ld (de),a ;Change mode ld (hl),a ;Wriage ; ; IBM 8 inch double density formatter routine ; single equ $ .phase 1030h sdfmt: ld a,0 ;Second byte filled with p% r leading edge of new index pulse ld a,90h ;Clear the crc register & turn on write gate ld (de),a ;Change modes ld a,44h (de),a ;Change modes ld (hl),0f5h ;First half of fb ld a,91h ;8 bit write ld (de),a ;Change modes ld (hl),6fh ;Seconect equ $-1 ld (hl),0 ;Write the sector length code ld a,0a1h ld (de),a ;Change modes ld (hl),a ld (hl),a ;Write th;Recover the double sided status jr z,sdlblc ;Zero => single sided ld a,(iy+2) ;Get the drive pattern or 0ch ;Turn off thloop: ld a,80h ;16 bit write mode ld (de),a ;Change modes ld b,0ch ;Sector header preamble length sdlbl6: ld (hl),0aah ;ffh djnz sdlbla ;Write the postamble jr nz,smloop ;Test for more sectors to format ld (hl),0ffh ;First fill byte ld b,0 ;Single density & start bit ld (4006h),a ;Start the controller sdlbl3: ld (hl),0ffh djnz sdlbl3 ;Write the preamble ldd half of fb ld b,80h ;Sector data field length sdlbl9: ld (hl),0e5h djnz sdlbl9 ;Write the data field ld a,0a1h ld (e crc bytes ld a,90h ;Reset the crc ld (de),a ;Change modes ld b,0bh ;Sector header postamble length sdlbl7: ld (hl),0e step command and 0fdh ;Turn on head one ld (4005h),a ;Update drive control register ld (hl),0ffh ;Write first preamble Half a zero cell djnz sdlbl6 ;Write the preamble ld a,81h ;Enable crc & 16 bit write ld (de),a ;Change modes ld (hl), ;Side bit sdsbit equ $-1 ld a,(sside) ;Get the current side xor b ;Conditionally switch side bits ld (sside),a ;Update a,80h ;16 bit write mode ld (de),a ;Change modes ld b,0ch ;Zero preamble length sdlbl4: ld (hl),0aah ;Half a zero cell de),a ;Change modes ld (hl),a ld (hl),a ;Write the crc bytes ld a,90h ;Reset the crc ld (de),a ;Change modes ld a,ffh djnz sdlbl7 ;Write the postamble ld a,80h ;16 bit write mode ld (de),a ;Change modes ld b,0ch ;Data field preambbyte jp sdlbl3 ;Go format the other side sdlblc: ld (hl),0ffh ;Trailing byte xor a ld (de),a ;Turn off write gate ld 0f5h ;First half of fe ld a,91h ;Enable crc & 8 bit write ld (de),a ;Change modes ld (hl),7eh ;Second half of fe ld (h the side byte ld (hl),0ffh ;Write second fill byte ld b,19h ;Preamble length less one ex Af,Af' ;Save the double sided  djnz sdlbl4 ;Write the zero preamble ld (hl),0f7h ;First half of fc ld a,90h ;8 bit write mode ld (de),a ;Change mode(ssect) ;Get the current sector inc a ;Advance cp 1bh ;Compare with 27 ld (hl),0ffh ;First postamble byte jr nz,$+4 ;le length sdlbl8: ld (hl),0aah ;Half a zero cell djnz sdlbl8 ;Write the preamble ld a,81h ;Enable crc & 16 bit write lda,6 ld (4006h),a ;Turn off the controller ld a,40h ;Status code ret sdadvt: ld a,(strck) ;Get the current track inc a l),0 ;Write the track strck equ $-1 lD (hl),0 ;Write the side byte sside equ $-1 ld (hl),1 ;Write the sector number ssstatus sdlblb: ld (hl),0ffh ;Write a fill byte ld a,(status) and index jr z,sdlblb ;Wait for the index hole ex Af,Af' s ld (hl),7ah ;Second half of fc ld b,1ah ;Postamble length sdlbl5: ld (hl),0ffh djnz sdlbl5 ;Write the postamble smZero => all sectors written ld a,1 ld (ssect),a ;Update the sector ld b,1ah ;Postamble length less one sdlbla: ld (hl),0&  ;Advance track value ld (strck),a ;Update the track value ret ;Return with track value .dephase page ; ; North Star (contrl),a ;Turn off the controller (& write gate) push bc ;Delay 1 m.s. ld b,200d dssllp: ld a,a djnz dssllp pop bl ex (sp),hl ld (hl),d xor d rlca ex Af,Af' ld a,e ld (cpdata),a ex Af,Af' ex (sp),hl ex (sp),hl ld (hl),e11h ld a,0 den1 equ $-1 rra ld a,64h jr nc,cstart ld a,18h strack equ $-1 rra add a,5 cp (iy+1) sbc a,a an multi desity formatter routine ; nsform equ $ .phase 1030h nsfmt: ld a,0 call sdrive ret nz ld (ix+0bh),0 ld a,(iyc ld a,(nsdsid) xor 0 dflag equ $-1 ld (nsdsid),a jr z,ftdone ld a,(iy+2) or 0eh and 0fdh ld (4004h),a jp e xor e rlca d2loop: ex (sp),hl ex (sp),hl ld (hl),e xor e rlca ex (sp),hl ex (sp),hl ld (hl),e xor e rlcad 10h or 24h ld b,20h cstart: ld (4006h),a zerow: ld (hl),0 ex (sp),hl ex (sp),hl djnz zerow ld a,(den1) or a +2) or 0eh ld (4004h),a call hsync nsexit: ld a,82h ret z track0: call home bit 5,(hl) jr z,nsexit entry: ld (intry ftdone: ld (contrl),a ;Turn off write gate ld a,40h ret advtrk: ld a,(track) ;Get the current track inc a ;Advance djnz d2loop ex (sp),hl ex (sp),hl ld (hl),a ld a,(den1) or a ld b,11h jr z,$+4 ld b,20h iloop: ex (sp),hl 1^  C~D.F@L% ̈́͐͢>2:`} YcNDRcQ>2::uY1 w jr z,lasts ld (hl),0fbh ex (sp),hl ex (sp),hl lasts: ld (hl),0fbh ld b,5ch ld e,20h data equ $-1 ld d,20h cpdatx+0bh),0 ld a,(track) cp (iy+1) call nz,seek ld a,(4003h) and 40h ld a,90h ret nz ld (ix+0ah),80h wsect0: call  track value ld (track),a ;Update the track value ret ;Return with track value track: 0 nsdsid: 0 .dephase ecode equ ex (sp),hl ld (hl),e ld a,(status) and index jr z,iloop inc c ld a,0ah cp c jr nz,zerow ld c,0 ld a,0 ld1  1ڄ8҄02 1ڢ5Ң12 AڿDҿA2>2>2ɯ25 Fa equ $-1 xor a d1loop: ex (sp),hl ex (sp),hl ld (hl),e xor e rlca djnz d1loop ld b,51h den2 equ $-1 ex (sp),hhsync jr z,nsexit xor a cp (ix+0ah) jr nz,wsect0 ld a,90h ld (contrl),a ld hl,diskd ld c,0 ld (ix+9),c ld b,$ ;End of code marker, stack follows ds 30h ;Room for the stack buffer equ $ ;Track read buffer end ' M>2 1 ͋44:344 1_͋!`U:!dU!g~2#~2@zb\ 2 H:=2A!^#V#{ʀ͠Î2  222<2͋>>2O ͋>>222=2û2<22<2͋>>2*6#:w#O:w#:w#6:2:ʬ>2>2͋>ʾ>2͡ n!<͋> >2͡ n!<2222ot halted.$ Write fault on drive.$.$ $ Waiting for drive to become ready, could take as long as 2 minutes.$ Testing sector h<<͋!ʏ–>2:F B :F 8 :F J I % @ *@ 1 *:w#:w#:w#6">2  %  :& > :' a{    |}o&PX O |L >0_ | Dk>2::2R>P!P ( P +|° ° 1 !@PGP#P"P 1 >P>P>P0P2<<2>22O 2222͋>, >2O >2<2<2͋>I >22 o :O:2| :O:2| :=2R G:y2XP0 @PGP͢ k͐ rY1 ͢k͐RY1  !""͋>k>222:2Oeaders, will take about 30 minutes. $ Formatting the entire physical disk, will take about 4 minutes.$ Formatting a logical dR:>2%  !""2<2͡ :>?>2>22Y o !͋>^>u :wn<҈ i: Y% Discus M26 and M10 Hard Disk Format Program Rev. 2.2$ Enter Physical Drive Number to be Tested or Formated (1 - 1 !"6# xPXP"P͋@:*+|#+PMCn !""2>22Y :p/G:x2ڐ /QPʚ >QSSSSG:[ :F | xF  2>2:> 2͋ $ D !% >Q>SSSS“͡ P 1 :͋:::͋:nO ¯rive, will take about 1.5 minutes.$Sector Error, Track $, Sector $, Head $, Error count $ All Finished, Returning to CP/M.$ Wa :w bn>QPʠPQ>QSS:GS,S,S,S, •! ME1̀ 4, RETURN to exit): $ Enter Logical Drive Number to be Formated (1 - 3, RETURN to exit): $ Enter Amount of Formatting Desired2R!>u o !͋ ʣ>Q~#S ©>QPʵ£!͋ >QP>QSSSw# P 1 !͋w++>Q~S# >QP            !͋ h 6#6# xh 2~͋ Ÿ%:G:Ÿ!4͋>!:w!͋>2>4A:# :?% xGy:RR h > 2nt to abort ? (Yes or No): $ Testing sector data field, will take about 12-14 Hours. $ Error Writing Sector Map to Track Zero%1 —: :<2͋!2ؐ<2=>Q~S# CC>QPSP7Q7P7?>Q!~S#w: H = Format Headers Only (Data Remains Intact). D = Erase Data Field Also. Function: $ Drive is not ready.$ Controller nT5#! ˆE͡ g̀%g} !͋ R^#V#{!@ % m% # ++} !Vw#/ Ž <Œ <… !~G:2/2R?o&^#Vr+s:~ :>2~ >2~///=Z*e~OG! MD*e~OGyw*e#"e:e2eé*e6â!- !~w#~w !!~#foN#F*yʺ!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#Fas the Drive Been Preformated ? (Y or N, RETURN to Exit): $$ Press RETURN to return to CP/M: $st O~w#~wÔ!N#F!~w#~w}ʮ!T!~#foN#F*y!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@! Implemented.$ Select The Drive Type: A = Discus M26, 26 Megabyte Drive. B = Discus M10, 10 Megabyte Drive. C = Discus M2!e"e*e*e##"eywx#w!"e*e~F*e~r*e> ғ*e~rÓ*ew#w!e*ee}o|g!MZ2DÇS*e~ʤ*e**͓2D!9N#F#^#V#~#fo"jUkb"hUi`"fUOGtm603tm602tandonm10st412st506m5seagateq2040quantumhd561/2hd561/1ol$y/:e/!e>@>#7/! !~w#~w !!~#foN#F*yG!~# !~w#~w!~w#~w! !e~#foN#F$yV:eV!e>>#^V !e~#? ͗ ? !?!~#foN#F*yn!~# !~w#~w!~w#~0, 20 Megabyte Drive. Drive type (RETURN to Exit): $ Select drive type: F = Fujitsu 2301 M = Memorex 101 Type (RETURN to e##"e:ew:e#wä*e*e#"e6)*e> !*e~!*e#"eä{nosofttestverifyBad sector size.size) !~#foN#Fͮ@!~#foN#F$*eMD!tR! !~w#~w !!~#foN#F*y!~w#~w>2e2e 2e2*tiP!= *piP!; áS̀S!"f> 2 f2 f>28W*! f~#:8WÇSÇS*f:f2f: f2 f}: f}!!~#fo*e *e͒M}| ͋S!~#fo"ti!["pi!]:pi:qi *pi*ti}og}*pi *ti!2N}og}*pi####7W!6W"ti*ti6*ti~OG!eyx#>2 f> 2ri2si:ri2ri:si2si!ri~#ʙͫy®!{!N#FP!s!N#FP!i*e¥ 2e2e*e####~OGi` "eñ *e"e*e"eͭ !["0W! *f"f!f:f:f## *fͬ*fͪ *e"f!f:e:e#2 *o}2/W>23W*e ~24W*e ~25W*e!KM }26W>27WͫyL!(2D!"-W>27Wͫyj!(2D2-W2.W*e ~24W>27e!~w#~w >2e2eÂ>2e2eÂ>2e2eÂ>2e2eÂ! Â!!~#foN#F*y !~w#~w>2e22 f: f2 fDrive not ready.Can't read drive status.Controller does not respond.͋S>P2ti2ui*ti*ti#"ti,WyOGyw*ti*t"piþ áS͋S!["ti!]:ti:ui8 *ti!~*ti####"ti áS Head: error. Track: Format timeout.͋S!~#fo"ti!~#fo"pi!ti~OGP!gáSáS: fOGy¨xu:8WOGy½xʙ:8W2 f.: f:!ri~#:!]"pi!]*e :pi:qiu*pi~OG!f !*f*fe *f#"f !e~#< ÇS*f#"f ! !]"0W>22W*f"f!f:f:f# *fͬ*e"f!f:e:e#Wͫy”!(2D2LW2MWÇSSeek timeout ͋S>P2ti2ui:LW:MW!:LW:MW#áS:e2/W>27W!!LW  #"*e !!~#foN#F*y9 !~w#~w>2e2e ͪ ͑"ÇSUsage: formatmw drive-type [arguments] Morrow Designs i#"ti!,W!]N}og}*ti*ti#"ti6:e2,W2-W2.W>22W*e}23W*e ~24W*e ~25W*e!KM }26W>27W!,W"9~#fo"ri:e2,W2-W2.W*pi}/o|/g}og))!eyOx#Gy@Oy2/W*e :ti:ui# :/W2/W*e :ti:ui# :/W2/W!W*e ~OGyx#|*pi]}o|g*ti~OG!N#F!N#F|! !riyOx#G! *ti~OG!N#F!N#F: fOG! 9*ti4 *pi# !*f*f͓*f#"fr ÇS*f#"fU ̀S!9!w#w!!e  # !~#fo))[ *e#}!~w#~wý !!we}o}2,W*LW!yOx#Gi`"-WA:e2,W!~#fo!LWyOx#Gi`"-W>28WͫyY!(2D!~#fo"LWáS sector: head: VerifHDDMA format/test program. Version 1.7 ̀S!p !H 2DÇS ̀S!N#F! !2DÇSChecking format. FormattW>2;Wͫy!9 >27Wͫy+!  :8WOGy?! áS̀S!!,W!27WͫyP!U :8WOGy_xháS:8WOGi`)xW N#F!E "pi FATAL! Count: Sector: Head: error. Track: Verify: ̀S!!~#fo)xW N#F!!N#FP!#w~#~!!e  #Y !~#fo))[ ~OG:e:e\ !!~#fo#*e͒M}| ÇS!~#fo))[ !N#F!~w#~wy timeout: track: ͋S:e2,W2-W2.W!~#fo}/o|/g}og))!eyOx#Gy2/W!~#fo}og}23W!N#F!2N}og}24W!~25W>2ing. ̀S=*e ~#fo *e( !W*e ~OG KM"eV:eM :ej 2f2f*e##~#fo "fv *e"f*e"f:eƒ :ÇSLoad constants timeout in home. Can't recalibrate drive. Load constants timeout in home. ̀S*e}o}2,W2-W2.W>22W*e}<* !N#FP!! N#FP! ~ .#~k!! N#FP!! N#F!N#F!N#F&â!!N#FE!fÐ*e"f*e"f:e:e¿2f2f*e####~OGi` "f*e"f*e"f!!N#FP!!N#F͇!!ÇS̀S!9!!~#fo|g!'i`! 6!ÇS̀S!9!~#fo~ ! y !!! yw!~)))W ~#fo!~#fo)))W yOx#Gywx#w+~#= !~#foMDÇS!~#fo)))W ~#fo!~#fo)))W yOx#GÇS̀S!9!!~#foP!`áSáS*ti4:fOGy¨xʒ! !riyOx#G! *ti~OG!N#F!N#F:fOGA! 9Ò:8WOGyxʙ:8W2W !~#~*f)))W !~#~*f)))W ! ~#~*[#"[ÇS*f#"fMÇS HardSoft%+ 5i %+ 4i %+ 6i %p Track Hea! N#F!N#F!N#F&!ÇS Byte: Sector: Head: Data compare: Track: ̀S!!N#FP!!]"0W>22W!]"ti!]*e :ti:ui;*ti*ti#"ti!~*f"f!f:f:f#*fͬ*f"f!f:f:f#*f*f͌*f#"+2D+ÇS!~#fo~ a! ! a!~ ! y5!! yXx 2D !~#fo~OG! !~w)))W ~#~!!~#fo)))W ~#~!!~#fo)))W ~#~!!~#fo)))W ~#~!~#fo)))W !~#fo)))W ~f' FATAL! Count: Sector: Head: error. Track: Write: ̀S!9!~#fo)xW N#F!)!N#FP!!!d Sector Type No bad sectors detected. Bad sector report: ̀S!(![~#!(ÇS!k !*[*!v(!N#FP!!N#FP!! N#FP!!!N#F!N#F!N#F&ÇS sector: head: Verify timeof^!e~#áS*f#"fA!!N#FP!!]"0W>22W*f"f!f:f:f#*fͬ*f"f!f:f:f#!N#F*#~wTesting disc. ̀S!!w#w!~#fo)NW #~!N#F!~#fo)NW N#F !~w#~wîÇS Reading - pa#~!~#fo)))W !~#fo)))W ~#~!~#fo)))W !~#fo)))W ~#~!~#fo)))W !~#fo)))W ~#~!~#fo)N#FP!! N#FP! ~ «#~!! N#FP!! N#F!N#F!N#F&!!N#FE!w#w!![  #!~#fo)))W ~1#~<!XMDA!SMD!~#fo)))W N#F!~#fo)))W N#F!~#fo)))W N#F!]ut: track: ͋S:e2,W2-W2.W!~#fo}/o|/g}og))!eyOx#Gy2/W!~#fo}og}23W!N#F!2N}og}24W!~25W>27W!6W"tf*f͓*f#"fáS*f#"f̀S! ~7#~F!e~#FÇS2f2f![:f:f#*f)))W ! u #D*f)))ss: data: Writing - pass: ͋S=*e ~#fo *e( !W*e ~OG KM"eV:eg:e„2f2f*e##~#fo "))W !~#~!~#fo)))W !~#~!~#fo)))W !~#~!~#fo)))W !~#~ÇSCan't write bad sector map! N#F!N#F!N#F&!ÇS̀S!!UHÇS̀S!!THÇS̀S!9! !N#F!'i`! 6!(! 9!~w#~w!Q(ÇS̀S!!~#fo)))W ~#fo!~#fo)))W yOx#Gywx#w+~#!~#foMDÇS!!~#foi*ti6*ti~OG!eyx#>2f> 2ri2si:ri2ri:si2si!ri~#ʙͫy!t!N#FP!l!N#FP!b*ti~OGW ! ‘ #D*f)))W ! ­ #D*f)))W !   #N*f)))W ! ~#~N*f)))W !~#~*f)))+ .Timeout on writing bad sector map.Too many bad sectors. Assigning alternates for the first %i sectors. No room for a bad maN#FM*ri'*ri "ri*ri*pi!N#FM0 }*ri>9(*ri~'w*ri!tiyOx#GáS̀S!!N#F!&f!i:,ÇS͋S! }|'*ri!~#ʪ&!N#F>O>Gñ&!N#Fywx#w!pi~#ʹ'*ti~A&*ti>Z&*ti~OG! MD&*ti~OGyl&x¹'*ti#"tiù'*i`"ri!w#w*ri~.6-! !*ri R+i`"ri*ri~aZ-*ri~hZ-*ri~oZ-*ri~u…-!*ri*ri#"ri~!~hŽ->2pi2 >#$:/W2/W*e >#$:/W2/W!]"0W>22W>23W>24W>25W>26W>27Wͫy$!" :8WOGy$x$!! ÇS͋S~#fo"ti!~#fo"pi*pi~>+*ti*ti#"ti*pi*pi#"pi +áS*ti~L+O+áS͋S!~#fo"ti!~#fo"pi!~#fo"ri*ti~nʈ+*p on this drive.̀S*e##>#"*e####>"!l" !]"f!e:f:f"*f*f#"f6ý"*e####~OG*e͐N*e)yOxGi`~#fo"ti!!  #)áS!~#fo "pi!~#fo"ri!ri:pi:qi#)*pi#"pi!ri:pi:qi#)*ti !N#F*pi*ti~#fo͆Sti~aY'*ti>zk'Y'!!N#F! N#F͐N!~#fo }|:pi2pi:qi2qi*ti#"tiV&*ti~Aڊ&*ti>Zڊ&!*ti~Aڒ'*ti>Zqi-!6n-!~o¥->2pi2qi-!~u¼-> 2pi2qi-!"pi*ri~x-!w#w\.*ri~b¨.!! N#F! ~w#~w~#~!~#fo"ti!~#fo"pi!~#fo"ri!w#w!:tiw:ui#w!w#w!pi~#[%*ti> Ғ%*ti~Ғ%!pi~#ʬ%*ti~-3&!>w#w*ti#"ti:ti~N¹+*ti#"ti*pi*riN#F*ri~w#~w~#fo}|*tiMDáS*piw#w*ti~0ڱ+*ti>9ڱ+*pi*ti~OG*pi~#foMD)) )  }|*ti#"ti "$f![:$f:%f#(#*$f"[*[!%"(2 f2!f![: f:!f#V$* f)))] * f)))W ~#fo}og}* f)))] * f)))W N#F!]N>H))!:piš):qi#=**ti !N#F*pi*ti ~#fo͆S=*:ri2ri:si2si!ri:pi:qi# **ti !N#F*ri*ti~#fo'*ti~OG! MDÙ'*ti~OG! }|!!   #'Ê&*ti!yOx#GáS͋S!~#fo"ti*ti"ri!#~(!>#(!~#fo>!! N#F! ~w#~w~#~!~#\.!!!  #O.!N#FV.!N#Fywx#w!~#p2!!  #p2!!pi2pi:qi2qiì%:pi2pi:qi2qi*ti#"ti@%! ~º%#~V&:pi:qiV&*ti~0V&*ti ~A&*ti >Z&*ti ~OG! MD +͋S!9!~#fo"ti*ti"ri*ri~B,*ri~%B,*ri#"ri,*ri "ti,!ri:ti:ui#{,*ri!tiyOx#G*ti!N#F!~#fo͆S*ri*}og}* f)))W N#F*e͐N* f)))W ~#fo #""f* f)))] *"f}og}* f)))] *"f!2N}og}* f)))] 6* f)))Sx)!ri:pi:qi#9)*ti *ri*pi*ti ~#fo͆S9)*pi!yOx#G!~#fo!piyOx#G}|**ti*pi !N#Fo>g"pi*ri*ri#"ri6-&(!~#fo"pi!~#>(!> w#wc(!#~c(!!~#fo>o>g}|!:pi:qi#ڛ(!N#F*pi!!N#F!~#fo͆S!~w#~wf.*ri~p&/!! N#F! ~w#~w~#~!!N#Fͮ@ywx#w!~#\.!!!&*ti ~OGyx&xV&*ti##"ti:pi2pi:qi2qiV&*ti~+¬%*ti#"ti:pi2pi:qi2qiì%!pi~#ʊ&*ti~0&*ti>9&!*ti~OG!ri#"ri~,áS!>w#w!6 *ri~-,!w#w!*ri#"ri*ri~*ri#"ri,*ri~+,!*ri#"ri*ri~*ri#"ri! !*riR+] 6*e)#* f #""f* f)))] *"f}og}* f)))] *"f!2N}og}* f#" f/#!ͬ:e2,W2-W2.W*e}o}@o}2/W*e(*ti!N#F*pi (**ti!N#F*pi (*ti*pi !N#F(áS̀S!!~#fo !(ÇS͋S!,   #/!N#F/!N#Fywx#w\.*ri~l›/!~a0!! ~#fo~#~#~#~!>w#w!~w#~w+n0!!~#fo5*ti*ti#"ti6-!!~#fo>o>g}|þ5*ti*ti#"ti6+!^i>># 6*ti*ti#"ti!N#F!dKM0 }!N#F!d͒`i,O!`iKAL*ti*ti#"ti6-!!~#fo!~#fo }|!>>#3!>w#w!!~#fo#! >+F+N=3!?2hi!hiN##~*pi>9 :*pi~'w*pi!tiyOx#GáSwrite error in putlwrite error in putlbad putl call͋S!~#fo"ti!~#fo1*ri~c1!!~!>w#wB2!:riw:si#w!>w#w\.:qi1 2!!N#F!2N}!!~!>w#wB2*ri~yw!~w#~wù7!#~X8!ti>#X8*ri*ri#"ri60!~w#~w:ti2ti:ui2ui8!ti>#8*ri*ri#"ri*pi!yOxG !##~!!=Q`/*ri~f¢0!!}|!!N#F!!yOx#G! ~#fo >+F+N=/!d6!9ywx#w! Mywx#w+*ti*ti#"ti!N#F! KM0 }*ti*ti#"ti!N#F! ͒M0 }*ti!yOx#GáS͋S!9!~#fo"ti!~#fo"=! 9ywx#w!!N#F!~#fo#!?~w#~w2pi2qi!:pi:qi#4!:pi:qi#ҏ4*ti*ti#"ti!*pi ~*pi#"pi!"pi!ti~#œ:!![: áS!~#fo"ri!ri>#:;!*ti *ti ~#fo }|!ri>#;*ti ~#~;!N#F!~c2!~w#w 2!~w#~w!*pi!N#F!%#2!yxҜ8*pi*pi#"pi~OGß80yw:ti2ti:ui2uiX8*ri!yOx#GáS͋S!~#fo"ti*ti"pi!#~+9! >#+9!!! ~#fo }|\.!!}|!*pi! ~#fo##N#F+++N#F!8ywx#w! ! ~#fo####}|\.!!}|!ri!#~6*ri*ri#"ri6-!!`i,O!`iKAL!"pi!!! >+F+N=6*pi?=! 9ywx#w!!~#fo*ti ~w#~w=4!:pi:qi#4*ti*ti#"ti60*pi#"pi!~w#~wÏ4!~#/5*ti*ti#"ti6.2ri2si!:ri:si#R5!:pi:qi#w#~w*pi*pi#"pi~:ri2ri:si2si*ti ~w#~w:*ti ~K;#~ <*ti ~# <*ti ~#fo*ti ~ <*ti N#N#F!N#F!N#F!~#fo͆S!~#5,!!  #5,!!!N#F!~#fo͆S!~w#~wí2͋S!~#fo"ti!`i w#wh9! #~h9! ! ~#fo>o>g}|!! #~~+~ >w#w! ! ~#fo####}|\.*ri~d#1!!}|!!>>#00!N#F!! ~#fo >+F+N=0!X3!}|!>>#7!>w#w!!N#F!!?~w#~w!!  #7!~#fo!yOx#G*pi "pi!!~#~R5*ti*ti#"ti!*pi ~*pi#"pi*ri#"ri4*ti*ti#"ti6e!~#z5!w#wz5!:ri:si#/5*ti*ti#"ti60*ri#"riR5!#~F*ti *tiN#F͹B*ti y¨;x##:!*ti *tiN#F͹By;x;!!G: ç:*ti~#fo"pi!~#fo"ri!ri~#K3*ti*ti#"ti*pi*pi#"pi~:ri2ri:si2si3!~#foMDáS͋S!9!~#fo"ti!#~3!!!#~9!!O9! N#F!`i02ji2ki2ii9ywx#w! ! ~#fo }|\.*ri~cG1*ri~sG1*ri~iG1!~ʥ1!!}|!! N#F! ~w#~w~#~!~a!>#7*ri*ri#"ri60!ti>#8*ri*ri#"ri6.8!>#7*ri*ri#"ri*pi!yOxGyx7*pi*pi#"pi~OG80-  w#wç:!~#foMDáS*ti w#w <͋S!~#fo"ti*ti"ri!#~y#yo>g}|*ri*ri#"ri6-!~#f 5B*ti~OGyʬB*pi! ~ʬB*pi" ~#fo6*ti~wA ͋S!N#FCi`"ri!ri~#BáS*ri~OGyC!N#F!N#F*ripi 60:pi2pi:qi2qio@*ti*pi 4X@áS͋S!~#fo"ti*ti"pi*pi~@*pi#"pi@*pi!tiyOx#GáSAAAA͋S!~#fi! *ti~w{G*ti ~OG! *pi* ! *pi! i`"ri!! !ri~#jGáS*ti~w*ti~wFáL*ti*ti#"ti!~#fo0 }*ri#"ri>!`i,O!`i!&iJ!iH>*^i "ri!ri>#>!*ri)))i `i,O!`i!Gyw*pi" *pi* *ri }|!~#JE!*pi( AE #JEáS!*ti{Fx{E!N#F!N#F*tíGxEáo}o|g"pi!~#¤ w#wo>g}|!:pi:qi#=!N#F*pi!N#FM*ri%<*ri "r@áS!~#fo"ti!>#RC*ti"pi!>#eC*ti~ eC*ti#"ti!~w#~w%C*ti!yOx#GáS*ti!piyOx#G*pi*ri@o"ti!~#fo"ri!>#IA! y\A! y;Ax\A!2D\A*ri!yOx#GáS*ti ~zA*ti ~OG!@tR*tiS͋S!~#fo"ti*ti ~#fo"ri!N#F!2N"pi*ri ~OG:piG:qiG*ti~OGy hH*ti ~OG! *ti~OGyH*riJAL!iH?!!AL!*ri N:pi2pi:qi2qiÊ?!!iH>!!`i,O!`i!&icIAL*pi#"pi>:ri2ri:S*pi ~OG*pi ~OGyOG}|EñEi`"ri!*pi( E #E*riMDáS*pi( !~#~!ri~# F!*pi* i*ri*pi!N#FM0 }*ri>9,=*ri~'w*ri!tiyOx#GáS͋S!9!~#fo"ti2pi2qi!#~=!!`i,O!`iKAL!*ti!piyOx#G}›C|ʤCáS!>#C!!B*ri@yCxCáS*ti#"ti!~w#~wC͋S!~#fo"ti:ui ~#fo"pi!*ti͎DyžAxBáS*ri~OG! !~w#~w*ri#"riA*ri~OG! øA*ri~OG! øA!~#foM! xHáS*ti~w*ri :piw*ri! xaH!~#aH*ri! xaH*ti~wáS*ti~ w*ri !~#fo}og}si2siâ=:ri2ri:si2si>!:ri:si#?*ti*ti#"ti60*ri#"riÝ?*piMDáS͋S!~#fo"ti!#~R@!!  #R@*ti!HáS*ti ~OG! *pi* ! *pi! i`"ri!! *riMD!DtRáS!*pi* ͇HáSáS͋S!~#>!!iH>*^i "ri!ri>#>?!*ri)))i Hw?!!`i,O!`i*ri)))i cIAL*pi!*ri ND!2h:ti:ui#D*ti))h ~$DáS*ti))h MDáS̀S!.h~#]D!fD:.hLD:/h]D*.h͆Si`".h5D*0h͆S]D͋S*.h"ti!~#fo".h*tiMDDáS!>#B*pi! ~ʅB*pi" N#F*pi" ~w#~w*ri*ri#"ri~*pi$ >2`i2ai>2ci>2bi!`iN!~w#~w*pi!áS͋S!~#fo"ti!~#fo"pi:pi2pi:qi2qiH*ti6*ti#"tiàHáS&}!!9͆S! 9~#foN#FxHO>G!9~#fo^#Vz~#fo ~5R@!~#fo "pi:qiX@*ti*pi ~9š@*ti*pi 60:pi2pi:qi2qi@áS:qiR@*ti61!~#fo"pi!pi>#@*ti*~#fo"ti*ti ~#fo"pi*ti~OGyF!*pi( N#F*tíGyFxGáS!~#{G*ti~OGy{G*ti ~OG! *p "piw?2ri2si!:ri:si#ҝ?!~#ʝ?!!`i,O!`i!&iJAL!!L!!`i,O!`i!hi!N#F#RKASaF[FrF͋S!~#fo"ti*ti ~#fo"pi!*pi$ `iWxƀGzƀWyox"I'I>XI>XI! 9N#F!9~#fo# AI ##]I +]ICIчU"II!9!9!6!N#F!~w#~w#~w#~w#~w!9MD! 9  # # #nO!9MD! 9  # # #!94nO!9!9*U#~#~+++~#~#~OO>G! 9q#p*U! 9~M+w>#w! 9N#FxMO>GMMO>G! 9q#p*U! 9N#FM! 9q#p*U! 9N#FM9~w#~wS! ~4Ti`+ #~wT!9~w#~w T LTi`7#~w@TS!9~dTi`+#w[TâTwTi`>#wmT>w! !9 #K!#~w ’K!5YK!N#F!ʹS!~K!~#K~w! N#F !#~K*U!9~#fo~#K~ƀwʹS! N#F !#~R*UQq#px#w#wQQq#p#w#wQQ w #w #w #wQQ w #w #w #wQ~#€R#~#foͤTy­I! N#F > J!~I!>#w¾I!4!q#p! N#F I!4 !ͤTyJy!#>#>+++>#~#~#~ #~{P>#># >#O!9MD!9~#foO! 9MD!9~#foOKO!9N#F!9! 9q#p*U!9~N/w+~w} Ui`!9!9!N#F ! #wL!~ƀw! N#F!͙R*U!9N#F!9~#fo~#~WL*UMD!9!9!N#F!y#”Rx#•R+++~#fo##tR!9!9!N#F!ͤTyzS!q#p! N#F!ͤTyR!N#FdS!yOx#GSy4S+~w#~wOx#Gyƀ+wx#w !#w J!69!#~w )J!MD! +IJ>JjJ!MD!  #[J!4! +~w qJ!5"-POO!9MD!9~#foO! 9MD!9~#foOKO!9N#F!9-POO! 9MD!9~#fo#O!9MD!9~#fo#OKO!9N#Fkb9PO yNMD!9q#p*U!! 9~+N~үN! 9N#F ! 9~w#~w! 9~w+~wÖN!9q#p*U!9N#F!9~#fo ## # +++ #>#wUJ!9N#F###q#p+++q!9N#F#q#pV2.1: copyright (c) 1979 by Whitesmiths, Ltd.` (ͤTyLy֨OxGL!~#+~wŸLy•LLyL!#~w¾L ñL! cLN#F!~#~*UcLN#F!~+~ +~+~ !SO>G! ~#+~wS&Sw y3SS!MD!  #wBS!N#F!ʹS!MD ! ~#fo+ #wqS*UJ!N#F!ʹS!~ʫJ!~#ʫJ~w! N#F !#~ºJ*U!9!9! N#F!6 Jƀ4 !ͤTyK!OP!9~Q/#w! 9N#FxwMO>GM҇M!9!9*ti*ri*pii`!"pi"ri"ti!9N#F! ~Si`+ >#wSS+SSâT! ~ T# +~wS!q#p!N#F!ͤTy0K! N#F &%'KK!~O#~Gyր+wx#w! #w LK>8!w! ~#+~w bK!~K!MD! Q/<Q*UO!9~#fo##+~w+~w###~w+~w ”Q*U!9~#fo##w>#w>+++w>#wMD!9!9!N#F!>w#w#w##w#w!!/ (2(2(2(2(2(((~@(v@(n@(f(`(X@(U@(O@(I2(E2(>(8(2(U @rcXG1$ +@0 re nam tha describe th driv bein formatted Possibl drive-type an argument follow: DRIVE-TYPE COMPANY lUfD 1K SECTORS  "cmi", "m16", "cm5619" Computer Memories Inc. 16,524 "seagate", "m5", "st506" Seagate Technology. 5, 4h 508 "st412", "m10" 11,016 Optional arguments: drive # Specif ᠠ physica driv (0-3 t b  FORMATMW Program Th FORMATM progra formats verifie an test har dis drive tha ar connect@ BCG@M [u+pformatted Defaul i driv 0. head # Specif physica hea t b formatted B e t Morro Design Har Dis DM controller. Usage: formatmw drive-type [arguments] wher drive-typ i requi1 default al th head ar formatte an tested I yo wan t chec ou on hea sted Consul wit th manufacturer' specification fo lega cylinde values. An combinatio o optar require t forma thei disk wit 51 byt sectors. skew #Specif th skewi DSIDE EQU 10Q UNLOADB EQU 17Q WTCMD EQU 364Q SICMD EQU 131Q IMMIRQ EQU 320Q UNLOADA EQU 30Q RESTOR EQU 11Q INDEX EQU 20Qgram t ge sho a margina sectors Thi fla ma als b use whe th th drive ***************************************************************** * * * Disk format program for Disk Jockey 2D controllonly includ thi argument Consul th manufacturer' manua fo th allowabl hea iona argument ca b combine fo variou affects Commo comman usage includes: A>formatmw m5 formats drin facto t b堠 used Defaul i 3 ske facto o i suggeste for Microni TRKZRO EQU 4 intrqa equ 1 intrqb equ 4 lhsdenb equ 90dh lhddenb equ 80ch lhsdena equ 111h lhddena equ 10h acr equ 0dh ba spo ma overflows Eg Entrie wil no be "wasted" on soft errors. size # Specif ther. * * 11/16/79 * * * ***************************************************************** title '*** Format numbers. nosoft Whe thi fla i specifie the sof error tha occur durin ve 0 for a CP/M environment. A>formatmw m16 drive 2 size 512 skew 6 formats drive 2 for a UNIX environment. x. test Invok dis tes routine Thi routin write variou pattern o th dis an thealf equ 0ah START lxi sp,stack LHLD ORIGIN+7 ;adjust INX H ; the MOV A,M ; calling LXI H,STDVSL+1 ; routines  secto size Lega value ar 128 256 512 1024 an 204 bytes Defaul i Program for CP/M Ver. 2.0 ***' org 100h revnum equ 52 ;Revision # times 10 bdos equ 5 ;CP/M entry point wboot equ 0 formattin o testin wil b reporte bu no adde t th ba spo ma bein buil verifie them. track # Specif particula cylinde t b formatte an te LXI D,4 ; for MOV M,A ; different XRI 3 ; versions DAD D ; of the MOV M,A ; disk DAD D ; jockey 102 bytes Note User o th Morro Design multi-use operatin system Micronix  origin equ 0F800H DISKIO EQU ORIGIN+3f8h DATREG EQU DISKIO+7 DRVSEL EQU DISKIO+1 CSTALL EQU DISKIO+3 CMDREG EQU DISKIO+4 t Thi fla i use primarill durin driv evaluatio an allow CP/͠ tes pro2 MOV M,A ; controller LXI d,SMESSG ;print the CALL pbuff ; sign on message CROK LXI d,DMESSG ;echo the CR and CALL pe message CALL SENDMP ;send error message call unload JMP SENDI ;back for more input dorest MVI M,RESTOR wrstrs mov  ani 3fh STA SELECT ;save for TRACK routine call stdvsl call model lxi b,lhsdena jz prep lxi b,lhsdenb prep mov abufx mvi c,10 call bdos lda inbufx+1 ana a mvi a,acr rz lda inbuf cpi 'a' rc cpi 'z'+1 rnc sui 40q ret ASCII bias jp sizchk sizerr lxi d,bmessg call pbuff jmp fmtsiz sizchk cpi 4 jnc sizerr sta newsize SENDI LXI d stbits FINDIX CALL INDEXP MVI H,1 TKSTEP mvi a,'*' call pchar LXI D,CMDREG MVI A,SICMD STAX D WSICMS LDAX D RAR buff ; print drive select CALL rbuff ;wait for response CPI 'N' ; new parameter JZ CROK ; request STA LETTER a,m rar jnc wrstrs wrstrd MOV A,M rar jc wrstrd MOV A,M ANI TRKZRO JZ NOTRDY LXI B,SDLIST LXI H,DLIST CAL,b call stbits mov a,c call stbits lxi h,cmdreg mvi m,immirq mvi a,40h wirqd dcr a jnz wirqd mov a,m rar jc pchar push h push b push d push psw mov e,a mvi c,2 call bdos pop psw pop d pop b pop h ret inbufx ,IMESSG ;send out the LXI h,JMESSG ; diskette insert CALL SENDMP ; message GETIN2 CALL rbuff ;wait for response C JNC WSICMS WSICMD LDAX D RAR JC WSICMD CALL TRACK MOV H,D INR H MVI A,77 CMP H JNZ TKSTEP call unload lxi;save for exit SUI 'A' ;test for good JP NOTLOW ; drive select INPUTB LXI d,BMESSG ;print the bad CALL pbuff ; inpL OVLAY LXI B,L128 LXI H,SLIST CALL OVLAY mvi a,'*' call pchar CALL INDEXP MVI H,0 CALL TRACK LXI D,TABLE ld notrdy ral ral jc notrdy lxi d,wmessg ral jc notrdyx LXI D,0 call gtindx IXLOOP call gtstat ani index xra db 10,0 inbuf db 0,0,0,0,0,0,0,0,0,0 STDVSL STA DISKIO+1 RET STBITS STA DISKIO+2 RET GTSTAT LDA DISKIO+2 RET PI 'N' ;test for new JZ CROK ; parameter request PROCED lxi d,acralf call pbuff LDA DRVNO ;get the drive no MO d,fmessg call pbuff call rbuff cpi 'F' jz crok jmp wboot SENDMP PUSH h ;save second half CALL pbuff ;send firsut message JMP CROK ; and wait for input NOTLOW CPI 4 ;test for drive JP INPUTB ; select too large STA DRVNO ;sa newsize add a jz findix mov l,a mvi h,0 DAD D MOV C,M INX H MOV B,M LXI H,SLIST CALL OVLAY LXI B,DDLIST b JNZ dorest DCX D MOV A,D ORA E JNZ IXLOOP NOTRDY LXI d,RMESSG ;not ready message notrdyx xchg LXI d,AMESSG ;drivmodel lda diskio-4 cpi (ret) ret unload call model mvi a,unloada jz stbits mvi a,unloadb jmp stbits gtindx calV C,A MVI A,177Q ;drive select bits QLOOP RLC ;rotate select bits DCR C ; to proper drive JP QLOOP ; position t half LDA LETTER ;print the CALL pchar ; letter POP d ;send the second pbuff mvi c,9 jmp bdos rbuff lxi d,inave drive no. fmtsiz lxi d,denmsg ;Select the sector size call pbuff call rbuff cpi 'N' jz CROK sui '1' ;Strip off LXI H,DLIST CALL OVLAY call model lxi b,lhddena jz loadd lxi b,lhddenb loadd mov a,b call stbits mov a,c call3 l model mvi b,0 rz mvi b,index ret INDEXP call gtindx windxh call gtstat ANI INDEX xra b JZ windxh windxl calark DCR C ; zero leader JNZ WTL8 ; field OVLD9 MVI M,0F5H ;special double MVI M,0F5H ; density clock MVI M,0F5H ;leader JNZ WTL5 ; field OVLD6 MVI M,0F5H ;special double MVI M,0F5H ; density clock MVI M,0F5H ; and data mark WTLver pointer MVI D,0 OVLAY1 INX H ;increment pointer MOV E,M ;get offset XTHL ;exchange pointers DAD D ;add the offset ters WTL1 MOV M,B ;index mark DCR C ; preamble JNZ WTL1 ; field LXI B,0CH ;data & count OVLD2 EQU $-2 WTL2 MOV M,B VI M,0F7H ;crc data bytes MVI A,27 ;last sector + 1 OVLS6 EQU $-1 LXI B,4E36H ;count & data OVLS7 EQU $-2 WTL14 MOV M,B ;l gtstat ani index xra b jnz windxl ret indxw call gtindx jmp windxl TABLE DW L128 DW L256 DW L512 DW L1024  and data mark WTL9 MVI M,0FBH ;data mark LXI B,0e540H ;data & count OVLS2 EQU $-2 WTL10 MOV M,B ;write first DCR C ; 6 MVI M,0FEH ;sector mark MOV M,D ;track number MVI M,0 ;side number SIDENO EQU $-1 MOV M,E ;sector number MVI M,1 ;sec PUSH PSW ;save length count LDAX B ;get replacement data MOV M,A ;do the replacement INX B ;next replacement data POP ;index mark DCR C ; zero leader JNZ WTL2 ; field OVLD3 MVI M,0F6H ;special double MVI M,0F6H ; density clock MVI data DCR C ; postamble JNZ WTL14 ; field CMP E ;last sector test JNZ SLOOP WTL15 MOV M,B ;fill data DCR C ; to  TRACK lda select call stdvsl XRA A STA SIDENO CALL WTRACK call gtstat ANI DSIDE RNZ INR A STA SIDENO LDA  quarter of JNZ WTL10 ; sector data MVI C,40H ;count OVLS3 EQU $-1 WTL11 MOV M,B ;write second DCR C ; quarter of tor length OVLS1 EQU $-1 MVI M,0F7H ;crc data bytes INR E ;increment sector LXI B,4E16H ;data & count OVLD7 EQU $-2 WTLPSW ;recover length count DCR A ;decrement XTHL ;exchange pointers JNZ OVLAY1 POP H ;adjust stack RET * The lists M,0F6H ; and data mark WTL3 MVI M,0FCH ;index mark LXI B,4E32H ;data & count OVLD4 EQU $-2 WTL4 MOV M,B ;sector mark DCindex hole JNZ WTL15 WTL16 MOV M,B ;fill data DCR C ; to index hole JNZ WTL16 WTL17 MOV M,B ;fill data DCR C ; to SELECT ANI 357Q call stdvsl WIL call indxw XCHG WTRACK LXI D,DATREG ;1791 data reg MVI L,1 ;initialize sector reg JNZ WTL11 ; sector data MVI C,40H ;count OVLS4 EQU $-1 WTL12 MOV M,B ;write third DCR C ; quarter of JNZ WTL12 ; s7 MOV M,B ;sector mark DCR C ; postamble JNZ WTL7 ; field LXI B,0CH ;data & count OVLD8 EQU $-2 WTL8 MOV M,B ;data mbelow represents the distances * between successive locations of the WTRACK * routine that are to be overlaid in order * thatR C ; preamble JNZ WTL4 ; field SLOOP LXI B,0CH ;data & count OVLD5 EQU $-2 WTL5 MOV M,B ;sector mark DCR C ; zero index hole JNZ WTL17 RET OVLAY MOV A,M ;length of list PUSH H ;save list ptr LXI H,WTRACK ;overlay area XTHL ; reco LXI B,4e50H ;data & count OVLD1 EQU $-2 MVI A,WTCMD ;issue a write STA CMDREG ; track command XCHG ;adjust the regisector data MVI C,40H ;count OVLS5 EQU $-1 WTL13 MOV M,B ;write fourth DCR C ; quarter of JNZ WTL13 ; sector data M4  the same routine will serve to format * different sized and density diskette * sector formats DLIST DB 18 ;length of list  'Disk Jockey 2D Disk Format program' db ' Revision ' db '0'+revnum/10,'.','0'+(revnum mod 10) db acr,alf db 'Type "^C" DW 4E36H * Overlay data for double density * 15 sectors/track 512 byte sectors L512 DB 2 DW 0e580H DB 80H DB 80H *!>*ͮ& :kJo&N#F!!B xy&>*ͮ>YZ_b$>MOg͎͓F WTL6 DW 0FF0BH DB 6 JMP WTL9 * Overlay data for double density * formatted diskettes DDLIST DW 4E50H DB 0CH MVy.' db acr,alf db ' 4) 1024 Byte Double Density.' db acr,alf db 'Sector Size: $' acralf db acr,alf,'$' letter  DB OVLD1-WTRACK DB 1 DB OVLD2-OVLD1-1 DB OVLD3-OVLD2 DB 1 DB 1 DB OVLD4-OVLD3-2 DB 1 DB OVLD5-OVLD4-1 DB OVLto return to CP/M, "N" to restart.$' IMESSG db acr,alf db 'Insert a Write Enabled Diskette in Drive $' JMESSG db acr,alfDB 80H DB 16 DW 4E6AH * Overlay data for double density * 8 sectors/track 1024 byte sectors L1024 DB 3 DW 0e500H ͎:hͮ  :> :a{ _ 22::>>I M,0F6H DB 36H DW 4E32H DB 0CH MVI M,0F5H DB 36H DW 4E16H DB 0CH MVI M,0F5H DB 36H * Overlay data for singdb 0 drvno db 0 select db 0 newsize db 0 ds 50 stack equ $ end D6-OVLD5 DB 1 DB 1 DB OVLD7-OVLD6-2 DB 1 DB OVLD8-OVLD7-1 DB OVLD9-OVLD8 DB 1 DB 1 SLIST DB 9 ;list length  db 'Close the Drive Door and then Press RETURN: $' FMESSG db acr,alf db 'Function Complete.' db acr,alf db 'Type REDB 0 DB 0 DB 0 DB 9 DW 4E74H AMESSG db acr,alf db 'Drive $' RMESSG db ' Is Not Ready.$' WMESSG db ' Is Write Pr*3<E:j2u8<2u:j.PN>2p F p N66662Np ^ p f6666r6s66Nple density * 26 sectors/track 128 byte sectors L128 DB 0 DW 0e520H DB 20H DB 20H DB 20H DB 27 DW 0FF1BH * Ove1*#~!www͎͎͓N2hA:{͎12i͎͓N1^{͎BU2k !8͓̓Ne͎:iDB OVLS1-WTRACK DB OVLS2-OVLS1 DB 1 DB OVLS3-OVLS2-1 DB OVLS4-OVLS3 DB OVLS5-OVLS4 DB OVLS6-OVLS5 DB OVLS7-OVLS6 TURN to return to CP/M, or F to Format another: $' denmsg db acr,alf db 'Select a sector size:' db acr,alf db ' 1) otected.$' BMESSG db acr,alf db 'Improper Response.$' DMESSG db acr,alf db 'Select Drive (A,B,C,or D): $' SMESSG db  p ‡6666@p —@p ž@p ¥@p ¬6>6Np ¸cp p p ~!8#^ w=  @rlay data for double density * 26 sectors/track 256 byte sectors L256 DB 1 DW 0e540H DB 40H DB 40H DB 40H DB 27 O> ?2jʜ xy!6>@=«~fzWN̓f6 ~~~! DB 1 * Overlay data for single density * formatted diskettes SDLIST DW 0FF28H DB 6 JMP WTL3 DW 0FF1AH DB 6 JMP128 Byte Single density.' db acr,alf db ' 2) 256 Byte Double density.' db acr,alf db ' 3) 512 Byte Double Densit5  (Yq ÒPN 662N 66N 66 @@@@6N倀jN tN Drive $ Is Not Ready.$ Is Write Protected.$ Impconsists of * ; the three bytes identifying the track, head, and sector that * ; was bad. * ; * ; Written By Borite enable cpuclk equ 0bh ;Cpu clock mask wreset equ 0bh ;Write fault reset mask scenbl equ 5 dskclk equ 7 ;Disk drive cqu 20 ;Maximum error count tkzero equ 1 ;Track zero flag bit opdone equ 2 ;Operation complete flag bit complt equ 4 ;Comproper Response.$ Select Drive (A,B,C,or D): $Disk Jockey 2D Disk Format program Revision 5.2 Type "^C" to return to CP/M, "N" bby Dale Gifford. * ; 5/18/81 * ; * ;**************************************************************** tit;**************************************************************** ; * ; Formathd formats the Discus M26 or the Discus Mlock mask secm26 equ 32 ;Sector count for m26 secm10 equ 21 ;Sector count for m10 trkm26 equ 202 ;Tracks on an M26 trkm10lete flag bit tmout equ 8 ;Time out flag bit wfault equ 10h ;Write fault flag bit drvrdy equ 20h ;Drive ready flag bit into restart.$ Insert a Write Enabled Diskette in Drive $ Close the Drive Door and then Press RETURN: $ Function Complete. Typle '*** Format Program for Discus M26 & M10 under CP/M 2.2 ***' revnum equ 22 ;Revision number x.x hdorg equ 050h ;Hard di10 hard disk * ; drive. It write sector header information on the entire disk * ; surface. When the formatting has been comple equ 244 ;Tracks on an M10 hedm26 equ 8 ;Heads on an M26 hedm10 equ 4 ;Heads on an M10 hedm20 equ 8 ;Heads on an M20 wprdex equ 40h ;Index hole flag bit halt equ 80h ;Halt flag bit cstrt equ 3 ;Command start drvmsk equ 3 ;Drive bit mask pste RETURN to return to CP/M, or F to Format another: $ Select a sector size: 1) 128 Byte Single density. 2) 256 Bytesk origin status equ hdorg ;Status register cntrol equ hdorg ;Control register data equ hdorg+3 ;Data register functn equted, a map is * ; created on track 0, head 1, last two sectors of all the * ; encountered bad sectors. Each entry of the map ot equ 80h ;Write protect flag bit mdir equ 0f7h ;Direction mask nstep equ 0fbh ;Negative step mask null equ 0fch ;Null cep equ 4 ;Positive step bit hdrlen equ 4 ;Header length in bytes seclen equ 512 ;Sector length in bytes wenabl equ 0fh ;W Double density. 3) 512 Byte Double Density. 4) 1024 Byte Double Density. Sector Size: $ $ hdorg+2 ;Function register comnd equ hdorg+1 ;Command register result equ hdorg+1 ;Result register retry equ 2 retries e6 ommand idbuff equ 0 ;Initialize data buffer command isbuff equ 8 ;Initialize sector buffer command rsect equ 1 ;Read sectouff cpi acr jz wboot cpi 'A' jc gettyp cpi 'C'+1 jnc gettyp sui 'A' sta disktyp cpi 1 mvi a,hedm10 sta heamap skiphd mvi a,2 sta phase lda much ani 2 cnz datamap ;Make the bad sector map lda much ani 4 cnz seeks lxi ep makes sure the drive is up and running. * ; * ;**************************************************************** * org tpa start lxi sp,stack ;Initialize the stack lxi d,prompt call pbuff askall lxi d,funcmsg call pbuff cal jz trksok lda heads cpi hedm20 lxi h,trksm10 jnz trksok lxi h,trksm20 trksok dad d mov a,m sta frsttrk inx h r command rhedr equ 3 ;Read header command wsect equ 5 ;Write sector command whedr equ 7 ;Write header command tpa equ ds jz gtype mvi a,hedm20 sta heads ret gtype xra a sta sdelay lxi d,dtype call pbuff call rbuff cpi acr jd,donmsg jmp exit continu lxi d,notyet jmp exit howmuch lxi d,muchmsg call pbuff call rbuff cpi acr jz wboot  prep lda drive ;Select the drive ori null ;Nop sta dfnreg out functn mvi a,scenbl out cntrol mvi c,239 lxi h,0 l rbuff cpi acr jz wboot cpi 'C' jz continu cpi 'D' jz doall cpi 'F' jz fmtonly cpi 'L' jz logical jmp ask mov a,m sta lasttrk ret trksm26 db 0,64,127,203 trksm10 db 0,122,244 trksm20 db 0,98,195,244 headata lxi d,hdmsg 100h ;CP/M transient program area tbuff equ 80h wboot equ 0 ;CP/M warm boot location bdos equ 5 ;BDOS entry point acr equz wboot cpi 'F' rz cpi 'M' jnz gtype mvi a,1 sta sdelay ret getlog lxi d,lognum call pbuff call rbuff cpi cpi '1' jc howmuch cpi '7'+1 jnc howmuch sui '0' sta much ret getphy lxi d,phnum call pbuff call rbuff cpi in status ani drvrdy jz measure lxi d,rdywait call pbuff tdelay in status ani drvrdy jz measure dcx h mov a,hall doall call howmuch call getphy call prep mvi a,1 sta phase lda much ani 1 jnz dohead preask lxi d,prefmt call pbuff xra a sta nodata call rbuff cpi acr jz wboot cpi 'H' rz cpi 'D' jnz headata mvi a,1 sta nodata  0dh ;Carriage return alf equ 0ah ;Line feed atab equ 9 ;Tab ;********************************************************** acr jz wboot cpi '1' jc getlog push psw call phytyp mvi b,'3'+1 jz cmptrk1 lda heads cpi hedm20 mvi b,'2'+1 acr jz wboot cpi '1' jc getphy cpi '4'+1 jnc getphy sui '1' sta drive gettyp lxi d,drvtyp call pbuff call rb ora l jnz tdelay dcr c jnz tdelay lxi d,rdymsg jmp exit ;******************************************************* call pbuff call rbuff jz wboot cpi 'Y' jz skiphd cpi 'N' jnz preask call preform jmp skiphd dohead call head ret phytyp lda disktyp ana a ret ;**************************************************************** ; * ; Pr****** ; * ; Main code begins here. * ; * ;*************************************************************** jnz cmptrk1 mvi b,'3'+1 cmptrk1 pop psw cmp b jnc getlog sui '1' mov e,a mvi d,0 call phytyp lxi h,trksm26 7 ********* ; * ; Measure measures the time in machine cycles for one * ; revolution of the disk. * ; * ;ses the counter created by measure to wait for 20ms. * ; * ;************************************************************************************ ; * ; Trkzro moves the disk heads to track 0. * ; * ;*****************************t comnd wrout mov a,m inx h out data dcr c jnz wrout mvi a,whedr out comnd wrwait in status ani opdone jz wrwa;Save the counter in status ;Test status ani halt ;Test for halted lxi d,hltmsg jz exit mvi a,wenabl ;Write enable t******************************************* headmap lxi d,headmsg call pbuff call trkzro lxi h,0 shld buffer shld b**************************************************************** measure lxi h,0 ;Initialize the counter to 0 mvi c,index ***** delay call phytyp cpi 2 rz ;If its an M20 it will do the settle delay cpi 1 jnz dodel lda sdelay ora a*********************************** trkzro in status ;Check for already at track 0 ani tkzero rz hloop lxi b,101h ;Comit dcr b jnz wrtloop lxi h,hedbuf2 call phytyp mvi b,secm26 jz rdloop mvi b,secm10 rdloop mvi a,rhedr out comndhe drive out cntrol mvi a,dskclk out cntrol ;Change to Clock from drive mvi a,wenabl out cntrol ;Finish write enableuffer+2 xra a sta head newhed mvi a,1 sta hedbuf1 sta sflg call zers lda head rlc rlc rlc rlc ani 70h c ;Index flag initialized in status ana c ;Get state of the index line now mov b,a ;Save state in B waitm1 in status ;G rz dodel lhld settle deloop dcx h mov a,h ora l inx h dcx h in status ;Waste a little extra time to get 33 ms mand to mhead call mhead ;Move the head cwait in status ani complt ;Wait for seek complete jz cwait in status ani t rdwait in status ani opdone jz rdwait mvi a,isbuff out comnd mvi c,hdrlen in data in data rdin in data mov m, toggle call delay ;Wait 20 ms in status ani wfault ;Check for write fault lxi d,wfmsg jz exit lxi h,mapbeg shldma ani 0fch mov b,a lda drive add b sta dfnreg out functn hedtst lxi h,hedbuf1 mvi a,1 call initfld call paniet state now ana c ;Mask off the index bit cmp b ;Same state ? jz waitm1 ;Wait for toggle waitm2 inx h ;Increment coujmp $+3 jnz deloop ret ;**************************************************************** ; * ; Headmap scans seckzero ;At track 0 yet ? jnz hloop ;**************************************************************** ; * ; Delay ua inx h dcr c jnz rdin dcr b jnz rdloop in status ani wfault ;Check for write fault lxi d,wfmsg jz exit lxi mappnt lxi b,400h noers mvi m,0ffh inx h dcx b mov a,b ora c jnz noers ;***************************************c call indx lxi h,hedbuf1 call phytyp mvi b,secm26 jz wrtloop mvi b,secm10 wrtloop mvi c,hdrlen mvi a,isbuff ounter in status ;Wait for another toggle ana c ;Strip off index cmp b ;Has it toggled yet ? jnz waitm2 shld settle tor headers, locating bad ones. Each bad * ; header is entered into the bad sector map. * ; * ;*********************8  h,hedbuf1 lxi d,hedbuf2 call phytyp mvi b,secm26*hdrlen jz comp mvi b,secm10*hdrlen comp ldax d cmp m cnz ichede***************************** ; * ; Datamap locates bad sector data fields. * ; * ;*************************h call putdc lxi d,acralf call pbuff pop h push h lxi d,2 call hlcde lhld mappnt lxi d,-mapbeg dad d lxi da in data lda buffer+2 mov b,a pop h push h in data xra b cmp m cnz secerr inr l in data cmp m cnz seclcde lxi d,softmsg jnc phs lxi d,hardmsg phs call pbuff lxi d,errmsg call pbuff pop h push h dcx h dcx h lx,a mvi c,retries wagan push b push h call preprw pop h push h call wdata jnc wok pop h pop b dcr c jnz war inx h inx d dcr b jnz comp lxi h,hedbuf1 call newpat jnz hedtst call zrolok call makbuf0 call cformat ca*************************************** datamap lxi d,datmsg call pbuff call trkzro lxi h,0 shld buffer shld buffer,seclen*2-3 call hlcde lxi d,fullmsg jnc exit lhld mappnt lda buffer+1 mov m,a inx h lda head mov m,a inx h err inr l cmpdat in data cmp m cnz secerr inr l in data cmp m cnz secerr inr l jnz cmpdat pop h pop b rdi d,-errors dad d mov a,l rar ani 1fh inr a inr a push psw call phytyp mvi b,secm26+1 jz maxsec mvi b,secmgan push b push h lda buffer+2 ora a ral sui 4 call incerr wok pop h pop b lda buffer+2 xra m mov m,a cll inchead jnz newhed call update call inctrk rz jmp newhed icheder push h push d lxi d,-hedbuf1 dad d mov +2 xra a sta head inr a sta buffer+2 nxthed call makbuf0 lda buffer+1 ana a mvi a,0 jnz zkey mvi a,80h zkey  lda badsec mov m,a inx h mvi m,0ffh shld mappnt mvi a,1 sta errflg wassft pop d pop h pop b goodsec dcr b ok call skew jnz rddlp lxi h,datbuf1 call newpat jnz samhed call zrolok call inchead jnz nxthed call update ca10+1 maxsec pop psw cmp b jnz nowrp mvi a,1 nowrp sta badsec lda buffer+1 call putadc lxi d,hedmsg call pbuff all skew jnz wrdlp rddlp mvi c,retries rdagan push b push h call preprw mvi a,rsect out comnd rddwat in status ana,l ani 0fch rar call incerr pop d pop h ret zrolok lxi h,errors call phytyp mvi b,secm26 jz zrolook mvi sta buffer+3 mvi a,1 sta datbuf1 sta sflg call zers samhed call panic lxi h,datbuf1 push h call phytyp mvi a,sejnz zrolook lda errflg ana a mvi a,0 sta errflg lxi d,acralf jnz pbuff ret ;***********************************ll inctrk rz jmp nxthed rderr call secerr pop h pop b dcr c jnz rdagan jmp rdok secerr push h lda buffer+2lda head call putadc lxi d,secmsg call pbuff lda badsec call putadc lxi d,rtymsg call pbuff pop h xthl push i opdone jz rddwat in status ani tmout jnz rderr in result ani retry jnz rderr mvi a,idbuff out comnd in datb,secm10 zrolook mov e,m inx h mov d,m inx h mov a,e ora d jz goodsec push b push d push h lxi h,1 call hclen/(secm26*hdrlen) jz goinit mvi a,seclen/(secm10*hdrlen) goinit call initfld pop h wrdlp lda buffer+2 xra m mov m9  ora a ral sui 4 call incerr pop h ret skew lda buffer+2 inr a sta buffer+2 push psw call phytyp mvi b,s ani complt jz seekwt jmp delay fail lxi d,failmsg jmp pbuff ;***************************************************26 mvi a,1 upm26 sta head mvi a,80h sta buffer+3 call phytyp mvi a,secm26-1 jz updt1 mvi a,secm10-1 updt1 sta b b,0 call seek lxi d,acralf call pbuff mvi a,idbuff out comnd mvi b,seclen/4 mvi a,0e5h file5 out data out  data inx h dcr b jnz whed ret ;**************************************************************** ; * ; Updat header formatting on * ; the entire disk. * ; * ;***************************************************************secm26+1 jz skewsec mvi b,secm10+1 skewsec pop psw cmp b rc sub b inr a sta buffer+2 dcr a ret wdata mvi a************* ; * ; Indx waits until the index hole just passes by. * ; * ;**********************************uffer+2 call seek call makbuf0 call preprw lxi h,mapbeg call wdata cc fail call phytyp mvi a,secm26 jz updt2 data out data out data dcr b jnz file5 mainl call makbuf0 call cformat in status ani wfault ;Check for write fe writes the bad sector map onto the drive. * ; * ;**************************************************************** * fmtonly call getphy call headata call prep call preform lxi d,donmsg jmp exit preform lxi d,formmsg call pbu,idbuff out comnd lxi b,seclen wdat mov a,m out data inx h dcr c jnz wdat dcr b jnz wdat wsame mvi a,wsect o****************************** indx mvi c,index in status ana c mov b,a indxwt in status ana c cmp b jz indxwt  mvi a,secm10 updt2 sta buffer+2 call makbuf0 call preprw lxi h,mapbeg+seclen call wdata cc fail pop psw sta buffault lxi d,wfmsg jz exit fmttrk lda nodata ana a push h jz fmtskp pop h call phytyp jz fmm26 lda buffer cpi update lhld mappnt mvi m,0ffh inx h lda buffer+1 mov m,a inx h mvi b,1 mov c,a push b lda tsttyp mov m,a ff lxi h,0 ;Zero the header information shld buffer shld buffer+2 call phytyp mvi a,trkm26 jz setlst mvi a,trkm10ut comnd wdwait in status ani opdone jz wdwait in status ani tmout stc rnz in result ani retry stc rnz in ret logical call getphy call getlog call headata call prep lxi d,logmsg call pbuff call form lxi d,donmsg jmer+2 xra a sta head sta buffer sta buffer+3 pop b mvi b,0 mov a,c sta buffer+1 seek call mhead seekwt in statu 1 jnz fmtdat jmp fmmon fmm26 lda buffer ana a jnz fmtdat fmmon lda buffer+1 ana a jnz fmtdat push h call phytinx h lda phase mov m,a inx h mvi m,0ffh lda buffer+2 push psw xra a sta buffer+1 lda disktyp ana a jz upm setlst sta lasttrk xra a sta frsttrk form call trkzro xra a sta head lda frsttrk sta buffer+1 mov c,a mvi status ani wfault stc rz cmc ret preprw mvi a,isbuff out comnd lxi h,buffer mvi b,hdrlen whed mov a,m outp exit ;**************************************************************** ; * ; Format routine does the actual sector: yp mvi b,secm26-1 jz cmp1x mvi b,secm10-1 cmp1x lda buffer+2 cmp b jc fmtskp jz fmtskp pop h fmtdat push h calirection bit ral ral mov b,a mov a,c ana a rz lda dfnreg ;Get current function register ani mdir ;Mask off the ana a rnz lxi d,astrk ;Print an astrisk call pbuff lda buffer+1 ani 3fh rnz lxi d,acralf jmp pbuff ;*******m26-1 jz sekdec mvi a,trkm10-1 sekdec sta first sta last xra a sta dltafst dcr a sta dltalst jmp seekcom see this head cmphed sub m rnz mov m,a ret ;**************************************************************** ; *  sta sekcnt sklopa lda sekcnt dcr a sta sekcnt rz call pdot lxi h,seektbl sklopb mov e,m inx h mov d,m inx h l preprw pop h push h call wsame fmtskp call skew pop h jnz fmttrk call inchead jnz mainl call inctrk lda buf direction bit ora b ;Put in the direction bit mhloop ani nstep ;Mask off the step bit out functn ;Output the step bit l********************************************************* ; * ; Mhead moves the disk head the desired # of steps. Bit 0kjrk xra a sta first inr a sta dltalst sta dltafst inr a sta last call phytyp mvi a,trkm26-3 jz sekjrka mvi  ; Inctrk increments the track, and then steps the heads out one.* ; * ;*********************************************** mov a,e ora d jz sklopa push h xchg call dopchl pop h jmp sklopb dopchl pchl seektbl dw seekinc dw seekdfer+1 mov b,a lda lasttrk cmp b jnz mainl ret ;**************************************************************** ; ow ori pstep ;Change the step bit high out functn ;Output the step bit high dcr c ;Update the # of steps to go jnz mh of * ; register B determines the directios, 1=out, 0=in. Register C * ; determins the # of tracks to step. * ; * a,trkm10-3 sekjrka sta reps sta last inr a inr a sta first mvi a,-1 sta dltalst sta dltafst jmp doseek seekm***************** inctrk lxi h,buffer+1 ;Track # call phytyp mvi a,trkm26 jz cmptrk mvi a,trkm10 cmptrk inr m ;Increc dw seekjrk dw seekfly dw seekmax dw 0 seekinc xra a sta first sta last sta dltafst inr a sta dltalst se * ; Inchead increments the head. * ; * ;**************************************************************** loop ret ;**************************************************************** ; * ; Seeks does track seek tests. ;**************************************************************** mhead mov a,b ;Test direction ani 1 ral ;Move into dax xra a sta first sta dltafst sta dltalst sta reps call phytyp mvi a,trkm26-1 jz sekmax mvi a,trkm10-1 sekmax ement the track # cmp m ;All done ? rz call pdot nocr lxi b,1 ;Move out call seek ori 1 ret pdot lda quiet ekcom call phytyp mvi a,trkm26-1 jz sekcom mvi a,trkm10-1 sekcom sta reps jmp doseek seekdec call phytyp mvi a,trk inchead lxi h,head ;Increment the head number inr m call phytyp mvi a,hedm26 jz cmphed lda heads ;Test if done with* ; * ;**************************************************************** seeks lxi d,seekmsg call pbuff mvi a,10 ; sta last jmp doseek seekfly mvi a,-1 sta dltafst inr a sta first inr a sta dltafst call phytyp mvi a,trkm26-1fer the contents of the buffer to out data ; the controller inx h ;Bump pointer to next byte dcr c ;Update the counter************************* cformat mvi a,1 ;Initialize the sector count sta buffer+2 lda buffer+1 ana a mvi a,80h j;Add in the head # sta buffer add b ani 7 ;Strip off the drive # rlc rlc rlc ;Head # in to four significant bits e jz sekwait mvi a,isbuff out comnd in data in data in data in data mov b,a lda buffer+1 cmp b rz push bvi m,0 inx h dcx b mov a,b ora c jnz zersx ret initfld sta cnt mov a,m push psw call phytyp mvi b,secm26  jz sekfly mvi a,trkm10-1 sekfly sta last sta reps doseek call sek00 dosek call panic lda first mov c,a lda dlt jnz ldloop mvi a,whedr ;Write header command out comnd ;Issue the write header command bwait in status ;Wait for the z putkey xra a putkey sta buffer+3 call indx call phytyp mvi b,secm26 lxi d,skewm26 jz floop mvi b,secm10 lxi d rlc cma ;Head # is negative logic ani 0fch ;Strip off the drive bits add m ;Add in this drive sta dfnreg ;Save th lxi d,sekmsg1 call pbuff lda buffer+1 call putadc lxi d,sekmsg2 call pbuff pop b mov a,b call putadc lxi d, jz iniflx mvi b,secm10 iniflx pop psw inilp push psw push h lxi h,cnt mov d,m pop h inilop mvi c,hdrlen iniloop afst add c sta first call seekit lda last mov c,a lda dltalst add c sta last call seekit lda reps dcr a write to complete ani opdone jz bwait dcr b ;Test for sector count equal to 0 jnz floop ret skewm26 db 22,12,2,23,,skewm10 floop lxi h,buffer+2 incsec ldax d mov m,a inx d dcx h ;Adjust the pointer to the sector header dcx h mvi e function register out functn ;Output the function ret incerr ani 3fh mov l,a mvi h,0 lxi d,errors dad d mov sekmsg3 call pbuff sek00 call trkzro xra a sta buffer+1 ret ;*******************************************************mov m,a inx h cma dcr c jnz iniloop inr a dcr d jnz inilop pop psw inr a dcr b jnz inilp ret makbuf0 sta reps jnz dosek ret seekit mov b,a lda buffer+1 sub b push psw mov a,b sta buffer+1 pop psw mvi b,0 jc13,3,24,14,4,25,15,5,26,16,6 db 27,17,7,28,18,8,29,19,9,30,20,10,31,21,11,32,1 skewm10 db 8,15,2,9,16,3,10,17,4,11 db 18,a,isbuff ;Initialize the controller pointer out comnd ;Give the command mvi c,hdrlen ;Header length ldloop mov a,m ;Transe,m inx h mov d,m inx d mov m,d dcx h mov m,e ret newpat lda tsttyp ana a mov a,m jz long short lda sflg********* ; * ; Cformat formats one track on the current head. * ; * ;***************************************lxi h,drive ;Get drive # mov a,m rlc rlc ;Move to left four bits rlc rlc mov b,a ;Save drive # in B lda head  movin mvi b,1 cma inr a movin cma inr a mov c,a call seek mvi a,rhedr out comnd sekwait in status ani opdon5,12,19,6,13,20,7,14,21,1 zers lxi h,errors call phytyp lxi b,secm26 jz zersx lxi b,secm10 zersx mvi m,0 inx h m<  ana a mvi a,0 sta sflg mov a,m jnz shortx mvi a,1 sta sflg mov a,m cma ral cma shortx cma dcr a long *** ; * ; Putdc prints the ascii decimal equivalent of the number in HL * ; * ;*******************************nt length bufdat ds 10 ;Storage or read in data ;**************************************************************** ; Hard Disk Format Program Rev. ' db revnum/10+'0' db '.' db (revnum mod 10)+'0' db '$' phnum db acr,alf db 'Enter Phmand. * ; * ;**************************************************************** rbuff lxi d,bufmax ;Beginning of bufes the * ; fact and asks for an abort. * ; * ;**************************************************************** inr a mov m,a ana a ret ;**************************************************************** ; * ; Pbuff is the C********************************* putdc lxi b,-10 phl push d mov d,b mov e,b phllp dad b inx d jc phllp xthl xc * ; Exit prints a message on the CP/M console then does a warm * ; boot. * ; * ;*****************************ysical Drive Number to be Tested or Formated ' db '(1 - 4, RETURN to exit): $' lognum db acr,alf db 'Enter Logical Drive fer mvi c,10 ;Read console command call bdos ;Read and fill the buffer lda buflen ;Check for zero length ana a ;if zpanic mvi c,11 call bdos ani 1 rz lxi d,panmsg call pbuff mvi c,1 call bdos call rbuff cpi 'Y' jz wboot lxP/M print buffer command. * ; * ;**************************************************************** pbuff lda quiet hg mov a,h ora l cnz phl pop h mvi a,'0' add l sub c pchar push h push b push d push psw mov e,a mvi *********************************** exit call pbuff lxi d,insmsg call pbuff call rbuff jmp wboot hlcde mov a,h cNumber to be Formated ' db '(1 - 3, RETURN to exit): $' hdmsg db acr,alf db 'Enter Amount of Formatting Desired:' db acero the return with acr in A mvi a,acr rz lda bufdat ;Otherwise return with the character cpi 'a' ;Fold to upper case i d,acralf jmp pbuff ;**************************************************************** ; * ; Messages output by th ana a jz pbuffx push d lxi d,nulls call pbuffx pop d pbuffx mvi c,9 ;Print buffer command jmp bdos ;Go and entec,2 call bdos pop psw pop d pop b pop h ret ;**************************************************************** ; mp d rnz mov a,l cmp e ret putadc mov l,a mvi h,0 ;*************************************************************r,alf,atab db 'H = Format Headers Only (Data Remains Intact).' db acr,alf,atab db 'D = Erase Data Field Also.' db acr,al rc cpi 'z'+1 rnc sui 20h ;Perform the mapping to upper case ret bufmax db 10 ;Maximum length buflen db 0 ;Curree program. * ; * ;**************************************************************** prompt db 'Discus M26 and M10 r the BDOS ;**************************************************************** ; * ; Rbuff is the CP/M read buffer com * ; Panic checks if a character has been hit on the console. * ; If a character has been pressed, then panic acknowledg= f db 'Function: $' rdymsg db acr,alf db 'Drive is not ready.$' hltmsg db acr,alf db 'Controller not halted.$' wfmdb 'D = Run a Diagnostic Test.' db acr,alf db 'Function (RETURN to Exit): $' notyet db acr,alf db 'Not Yet Implemented. will take about 15 minutes.' db acr,alf,'$' sekmsg1 db acr,alf db 'Seek error, Looking For Track $' sekmsg2 db ', Foundurn to CP/M: $' ;**************************************************************** ; * ; Dynamic data locations. rrmsg db 'Sector Error, Track $' secmsg db ', Sector $' hedmsg db ', Head $' rtymsg db ', Error count $' donmsg db acr,alfgnostic Do You Want to Run: ' db acr,alf,atab db '1 = Sector Header Field Test Only.' db acr,alf,atab db '2 = Sector Datsg db acr,alf db 'Write fault on drive.$' astrk db '.$' hardmsg equ $ softmsg equ $ acralf db acr,alf,'$' rdywait d$' drvtyp db acr,alf db 'Select The Drive Type:' db acr,alf,atab db 'A = Discus M26, 26 Megabyte Drive.' db acr,alf,a Track $' sekmsg3 db '.',acr,alf,'$' unknown db acr,alf db 'Unknown Command.$' bdrvmsg db acr,alf db 'Bad Drive Numbe* ; * ;**************************************************************** quiet db 0 sdelay db 0 much db 0 sekcnt d db 'All Finished, Returning to CP/M.$' panmsg db acr,alf db 'Want to abort ? (Yes or No): $' datmsg db acr,alf db 'a Field Test Only.' db acr,alf,atab db '4 = Seek Mechanism Test Only.' db acr,alf db 'Choose the Diagnostic by Adding tob acr,alf db 'Waiting for drive to become ready, could take ' db 'as long as 2 minutes.$' headmsg db acr,alf db 'Testintab db 'B = Discus M10, 10 Megabyte Drive.' db acr,alf,atab db 'C = Discus M20, 20 Megabyte Drive.' db acr,alf db 'Drir.$' funcmsg db acr,alf db 'Choose The Desired Function:' db acr,alf,atab db 'L = Format a Logical Drive.' db acr,alfb 0 first db 0 last db 0 dltafst db 0 dltalst db 0 reps db 0 disktyp db 0 heads db 0 nodata db 0 frsttrk db 0 lasttrk Testing sector data field, will take about 12-14 Hours.' db acr,alf,'$' failmsg db acr,alf db 'Error Writing Sector Map tgether the ' db 'Desired Options.' db acr,alf db 'Options (RETURN to Exit): $' prefmt db acr,alf db 'Has the Drive Beg sector headers, will take about 30 minutes.' db acr,alf,'$' formmsg db acr,alf db 'Formatting the entire physical disk,ve type (RETURN to Exit): $' dtype db acr, alf db 'Select drive type:' db acr, alf, atab db 'F = Fujitsu 2301' db acr,atab db 'F = Format an Entire Physical Drive.' db acr,alf,atab db 'C = Continue An Interupted Test.' db acr,alf,atab db 0 settle dw 0 ;20ms time constant buffer ds hdrlen head db 0 dfnreg db 0fch errflg db 0 cnt db 0 badsec db 0 mappnt o Track Zero.$' fullmsg db acr,alf db 'Bad Sector Map Overflow.$' seekmsg db acr,alf db 'Testing Track Seek Mechanism,en Preformated ? (Y or N, RETURN to Exit): $' nulls db 0,0,0,0,0,0,0,0,0,0,'$' insmsg db acr,alf db 'Press RETURN to ret ' db 'will take about 4 minutes.$' logmsg db acr,alf db 'Formatting a logical drive, will take about 1.5 minutes.$' e, alf, atab db 'M = Memorex 101' db acr, alf db 'Type (RETURN to Exit): $' muchmsg db acr,alf db 'How Much of the Dia> dw 0 ;Pointer into map table drive db 0ffh ;If this location is NOT 0ffh then ; NO prompting will occur sflg db 0 tst*************** * * * The folowing equates will define the Decision I mother * * board I/O or the Multi I/O environmen * * Date Author Description * * * * 6 21 82 Marc Reversed the sense of the console flag * * 4 2 82ut bits ribbon equ 01h ;End of ribbon paper equ 02h ;Paper out cover equ 04h ;Cover open pfrdy equ 08h ;Paper feed reaer data buffer dlab equ 80h ;Divisor latch access bit thre equ 20h ;Status line THRE bit cts equ 10h ;Clear to send dsr etyp db 1 phase db 0 hedbuf1 ds secm26*hdrlen hedbuf2 ds secm10*hdrlen ds 100h-($ mod 100h) datbuf1 ds seclen mapbeg ds sets. * * * ***************************************************************** mbase equ 48h ;Base address of Multi  Marc Console install flag * * 4 2 82 Marc Automatic determination of hardware * * 3 31 82 Marc Initial coding * *dy crrdy equ 10h ;Carriage ready pwrdy equ 20h ;Print wheel ready check equ 40h ;Printer check (error) ready equ 80h ;Prqu 20h ;Data set ready dr equ 1 ;Line status DR bit wls0 equ 1 ;Word length select bit 0 wls1 equ 2 ;Word length select bclen*2 errors ds secm26*2 ds 30 stack equ $ end I/O or Decision I grpsel equ mbase+7 ;Group select port dll equ mbase ;Divisor (lsb) dlm equ mbase+1 ;Divisor (msb) ier e * ***************************************************************** congrp equ 1 ;Serial console port (1 = p1, 2 = inter ready ; Define daisy 0 status input bits for Diablo HyType II driver crstrd equ 1020h ;Carriage ready pfstrd equ 8it 1 for 8 bit word stb equ 4 ;Stop bit count - 2 stop bits ; Define multi I/O ports addresses for group zero gzero equ qu mbase+1 ;Interupt enable register clk equ mbase+2 ;WB14 printer select port lcr equ mbase+3 ;Line control register mcr p2, 3 = p3) lstgrp equ 3 ;Serial printer port (1 = p1, 2 = p2, 3 = p3) **************************************************10h ;Paper feed ready pwstrd equ 2040h ;Print wheel ready ; Define daisy 0 output bits d9 equ 01h ;Data bit 9 d10 eq***************************************************************** * * * Installable printer and console drivers. * *0 daisy0 equ mbase ;Daisy input ports daisy1 equ mbase+1 sensesw equ mbase+1 ;Sense switches ; Define daisy 0 status inpequ mbase+4 lsr equ mbase+5 ;Line status register msr equ mbase+6 rbr equ mbase ;Read data buffer thr equ mbase ;Tranmitt? u 02h ;Data bit 10 d11 equ 04h ;Data bit 11 d12 equ 08h ;Data bit 12 pfstb equ 10h ;Paper feed strobe crstb equ 20h ; avt equ 'K'-64 ;Vertical tab aff equ 'L'-64 ;Form Feed acr equ 'M'-64 ;Carriage return xon equ 'Q'-64 ;Xon character xoo line feed. ***************************************************************** * * * The following are internal driv************************************************************** * * * The following word defines the default baud rate fO denable equ 20h ;Driver enable on Multi I/O ; Define special constants for the HyTyp II driver cperi equ 10 ;Default  jmp wboot ;Warm boot entry point oconst: jmp const ;Console status routine oconin: jmp conin ;Console input oconout:jmp cCarriage strobe pwstb equ 40h ;Print wheel strobe rest equ 80h ;Printer restore (Ribbon lift on Multi I/O) ; Define clockff equ 'S'-64 ;Xoff character aesc equ 1bh ;Escape character ars equ 1eh ;RS character aus equ 1fh ;US character asp equer equates. Most are misc. * * constants. * * * ****************************************************************or the * * console device. * * * * The following is a list of possible baud rates and the * * value needed for tto 10 characters per inch lperi equ 6 ;Default lines per inch hinc equ 120 ;Horizontal increments per inch vinc equ 48 ;Veonout ;Console output olist: jmp list ;List device output jmp $ ;Punch device output jmp $ ;Reader device input jmp $ select bits rlift equ 40h ;Ribbon lift pselect equ 80h ;Select (Not used by Diablo) ; Define Modem Control Register bi ' ' ;Space adel equ 7fh ;Delete ***************************************************************** * * * The jump* cpmbuf equ 80h ;CPM buffer (command flag buffer) anul equ 0 ;Null aetx equ 'C'-64 ;ETX character aack equ 'F'-64 ;he defcon word. * * * * Baud rate defcon Baud rate defcon * * 50 2304 2000 58 * * 75 1536 rtical increments per inch numtabs equ 160 ;Number of horizontal tabs maxchrs equ 1024 ;Maximum number of printer characters ;Home drive jmp $ ;Select disk jmp $ ;Set track jmp $ ;Set sector jmp $ ;Set DMA address jmp $ ;Read the disk ts dtrenb equ 1 ;DTR enable rtsenb equ 2 ;RTS enable ; Define group select bits (base + 7) s0 equ 01h ;Group number table below must remain in the same order, the * * routines may be changed, but the function executed must be * * the same. ACK character abel equ 'G'-64 ;Bell abs equ 'H'-64 ;Back Space aht equ 'I'-64 ;Horizontal tab alf equ 'J'-64 ;Line feed  2400 48 * * 110 1047 3600 32 * * 134.5 857 4800 24 * * 150 768 7200 16 * * 300 384 9600 to queue maxrgt equ 1584 ;Maximum carriage position dfrmln equ 110 ;Forms length times 10 autolf equ 0 ;Default to no Aut jmp $ ;Write the disk olistst:jmp listst ;List device status jmp $ ;Sector translation jmp $ ;SINGLE.COM hookup *** (0-3) s1 equ 02h smask equ 03h bank equ 04h enint equ 08h ;Enable interrupts restor equ 10h ;Printer restore on Multi I/ * * * ***************************************************************** jmp $ ;Cold boot entry point owboot:@  12 * * 600 192 19200 6 * * 1200 96 38400 3 * * 1800 64 56000 2 * * * ********* * * * ***************************************************************** mother: db 0 wboot: jmp start ;Warm bo the group bits themselves in * * the group byte. * * * ********************************************************ialize console and list devices call linit jmp owboot ;Do regular warm boot setup: mov a,m ;Test for end of table oraodify the same bit in the group byte * * provided. Example: * * * * ;Select console group * * lda group ;s a one-time-only warm boot routine. It checks * * for the presence of a flag characters and, if present, * * installs the c******************************************************** defcon: dw 12 ;Default console baud rate ***********************ot write through dw owboot ;Warm boot after initialization list: jmp olist ;List output dw otlst listst: jmp olists********* group: db 0 ;Group byte ***************************************************************** * * * The ne a rz inx h ;Bump to start of pointer mov d,h ;Make 'from' pointer mov e,l inx d inx d ldax d ;Move low byte ofGet group byte * * ori congrp ;Select the console port * * out grpsel ;Select the group * * * * ;Modify a bitonsole driver. Users who do not intend to * * use a Multio as console should type a flag argument '-'. * * * ************************************************* * * * The next byte is to make sure that the group select byte * * on the Mt ;List status dw stlst db 0 ;End of table marker cninit: jmp noop ;Console initialization dw cinit const: jmpxt byte is a motherboard flag. It is a has a non- * * zero value if a motherboard is present and is zero for a * * Multio. T pointer mov m,a inx d inx h ldax d ;Move high byte of pointer mov m,a inx h ;Bump to next table entry inx h i in the group byte * * lda group ;Get group byte * * ori bank ;Set the bank bit * * sta group ;Save new group setting ********************************************************** start: lxi h,wboot ;Set up list device pointers call setup ldult I/O or Decsion I stays consistant throughout * * the driver. Only the group bits themselves (bits 0 and 1) * * should be  oconst ;Console status dw cstty conin: jmp oconin ;Console input dw citty conout: jmp oconout ;Console output dwhis flag is used primarily by the parallel * * drivers since the parallel port assignments differ for * * the two boards. nx h jmp setup noop: ret ***************************************************************** * * * Multi I/O or D* * ori group2 ;Select second serial port * * out grpsel ;Select the desired group * * * * Note: You should not seta cpmbuf ;Test for flag ora a lxi h,cninit cz setup ;If the flag is reset then set up more routines call cninit ;Initchanged as you output to the group port. If * * you modify one of the other bits (such a driver-enable) * * then you should m cotty db 0 ;End of table marker ***************************************************************** * * * This iA ecision I console driver * * * ***************************************************************** *****************er ani 7fh ;Strip parity ret ***************************************************************** * * * Output a cth, the tinit routine driver is below the * * cboot routine. * * * ************************************************** * * * This routine does all of the character decoding, escape * * sequences forward, backward, etc. The list of eis found just below the regular Cbios jump table. The * * standard divisor table is given below. * * * * Sense switdy. * * * ***************************************************************** cstty: call selcon ;Select console ************************************************ * * * This driver on cold boot will inspect bits 1-3 of the sense * *haracter to serial port. * * * ***************************************************************** cotty: call selc******************* ***************************************************************** * * * Read a character from thscape * * sequences, and special characters recognized is: * * * * adel ignored * * anul ignored * * aacch: 123 (0 = off, 1 = on) * * 000 = 110 * * 001 = 300 * * 010 = 1200 * * 011 = 2400 * * 100 = 4800 in lsr ;Read status register ani dr rz ;No charactter ready mvi a,0ffh ;Character ready ret ******************* switches. If the value found is in the range 0-6 then the * * console baud rate will be taken from the rate table. * * Otheon ;Select console conout1:in lsr ;Read status ani thre ;Wait till transmitter buffer empty jz conout1 mov a,c ;Chae serial port. * * * ***************************************************************** citty: call selcon ;Selectk ignored (when received) * * abel ignored * * aff form feed * * aetx etx/ack handshake * * aht horizontal t * * 101 = 9600 * * 110 = 19200 * * defcon = 9600 * * * *********************************************************************************** * * * Diablo 1620 simulator for the Diablo Hytype II. * * * **rwise the current divisor latch value will be checked. * * If the divisor seems to be ok then no action will be taken * * as fracter is in (c) out thr ;Output to transmitter buffer ret ************************************************************* console group conin1: in lsr ;Read status register ani dr ;Wait till character ready jz conin1 in rbr ;Read charactab * * alf line feed * * asp space * * abs backspace * * acr carriage return * * aesc 0 ignored * **************************** ***************************************************************** * * * Due to its leng*************************************************************** *************************************************************ar as the baud rate setting goes. If the divisor is not * * ok then the baud rate will be set from the DEFCON word * * which **** * * * Return serial port status. Returns zero if character is not * * ready to be read. Else returns 255 if reaB  * aesc 1 set tab stop at current print position * * aesc 2 clear all tab stops * * aesc 3 graphics mode on * * aesc 4er function address inx h jmp lookup gother: inx h ;Bump over character mov a,m ;Get low byte of function address inx lxi h,level2 ;Two character escape sequence lda escflg ***************************************************************** printing db '8' dw clrhtab ;Clear horizontal tab db '9' dw setlmar ;Set left margin db '0' dw func1 ;No operatio******* otlst: lda group ;Set printer initialized flag ori denable sta group mov a,c ;Get the character to print anb aff dw doaff ;Form feed db aetx dw doaetx db aht dw doaht ;horizontal tab db alf dw doalf ;Line feed db asp graphics mode off * * aesc 5 forward print * * aesc 6 backward print * * aesc 8 clear tab stop * * aesc 9 s h mov h,m ;Get high byte of function address mov l,a ;Form Address of function pchl ;Execute it ****************** * * * Lookup scans the table pointed at by HL looking for a match * * of the character in register A. * * n level 1 db 'A' dw func1 db 'B' dw func1 db 'a' dw func1 db 'b' dw func1 db 'D' dw neghlf ;Negative half li 7fh ;Strip off parity rz cpi adel ;Ignore delete rz mov c,a ;Save character lda escflg lxi h,level0 ;Level zero dw doasp ;Space db abs dw doabs ;Back space db acr dw doacr ;Carriage return db 0 dw dochar ;Any other characet left margin * * aesc A ignored * * aesc B ignored * * aesc D negative half line feed * * aesc U half lin*********************************************** * * * Each of the following tables contains entries of the form: * * 1* ***************************************************************** lookup: dcr m ;Test if end of table inr m jz gotherine feed db 'U' dw poshlf ;Half line feed db alf dw neglf ;Negative line feed db aht dw settwo ;Two character esc characters ana a mov a,c ;Scan for char in A jz lookup ;Look up activity for this character lda escflg lxi h,level1ter level1: db '1' dw sethtab ;Set horizontal tab db '2' dw clrall ;Clear all horizontal tabs db '3' dw setgrp ;e feed * * aesc alf negative line feed * * aesc aht c absolute horizontal tab * * aesc avt c absolute vertical tab * byte character to match * * 2 bytes of address to execute * * terminated by a first byte of 0. * * * ****** ;Execute the default function cmp m ;Otherwise test for a match jz gother inx h ;Bump over character inx h ;Bump ovape sequence db avt dw settwo db ars dw settwo db aus dw settwo db 0 dw func1 level2: db aht dw abshtab ;A ;Single character escape sequences cpi aesc mov a,c ;Scan for char in A jz lookup ;Execute single level escape sequenceGraphics mode db '4' dw clrgrp ;Clear graphics mode db '5' dw clrdir ;Forward printing db '6' dw setdir ;Backward * aesc ars c set vmi * * aesc aus c set hmi * * * ********************************************************************************************************************* level0: db aesc dw doaesc ;Beginning of an escape sequence dC bsolute horizontal tab db avt dw absvtab ;Absolute vertical tab db ars dw setvmi db aus dw sethmi db 0 dw func2move if in graphics mode jnz spdir lhld hmi jmp spdir clrall equ $ ;Clear all horizontal tabs lxi h,tabstp ;Beginnin doabs: call sphmi ;Space increment call neghl ;Negative to start with jmp spdir ;Adjust backwards doacr: xra a staGet vmi for full line feed divid2: mov a,h ;High byte ora a ;Clear the carry rar mov h,a mov a,l rar mov l,a re mode rnz lhld vmi ;Get vertical motion index ret neglf: call lfvmi ;Get line feed vmi call neghl call adjvp jmp func1 setdir: mvi a,a ;Set backward printing mode sta dirflg jmp func1 setlmar:lhld hpos ;Get current position x ***************************************************************** * * * The following routines execute escape sequeg of tab stop array mvi d,tablen ;Size of tab array (bytes) notblp: mvi m,80h ;Reset tabs (reset to 0 later) kludge equ $-1 dirflg ;Forward printing sta grhflg ;No graphics mode lhld hpos ;Get current offset xchg lhld lmar ;Get left margint abshtab:mov e,c ;Absolute horizontal tab mvi d,0 dcx d ;Form 16 bit tab column call newdlh jmp func2 newdlh: lp func1 doasp: call sphmi ;Get space horizontal motion spdir: lda dirflg ;Forward or backwards ? ana a cnz neghl ;Negchg lhld dlhpos ;Get offset dad d shld lmar jmp func1 setvmi: mov l,c ;Set the motion index mvi h,0 dcx h shlnces, etc. * * * ***************************************************************** settwo: doaesc: mov a,c ;Get t ;Used on first reset (warmboot) inx h ;Next tab stop dcr d ;Update repeat count jnz notblp ;Continue zeroing func2 e call hlmde shld dlhpos ;Don't move yet though mvi a,autolf ;In Auto line feed mode ? ana a jnz doalf ;Do line feed hld hmi call hltde ;Multiply by hmi xchg lhld hpos ;And subtract current horizontal position xchg call hlmde shld ate HL adjhp: xchg ;Adjust Horizontal position lhld dlhpos ;Get current adjustment dad d ;Update it shld dlhpos ;Andd vmi jmp func2 sethmi: mov l,c mvi h,0 dcx h shld hmi jmp func2 poshlf: call hlfvmi ;Half line feed vmi callhe escape character sta escflg func0: ret doaetx: ret doalf: call lfvmi ;Get line feed vmi adjvp: xchg lhld dlvpos qu $ func1: xra a ;Clear escape sequence flag sta escflg ret setgrp: mvi a,1 ;Set graphics mode on sta grhflg jmp also ret dochar: mov l,c mvi h,0 call wheel ;Print the character in register C lda grhflg ana a lxi h,0 ;Don't dlhpos ret absvtab:mov e,c ;Absolute vertical tab mvi d,0 dcx d lhld vmi call hltde ;Multiply by vmi xchg lhl save ret sphmi: lda grhflg ;In graphics mode ? ana a lxi h,2 ;Only 1/60 if in graphics mode rnz lhld hmi ret  adjvp jmp func1 neghlf: call hlfvmi ;Negative half line feed call neghl call adjvp jmp func1 hlfvmi: lhld vmi ; ;Get vertical motion displacement dad d shld dlvpos ret lfvmi: lda grhflg ana a lxi h,1 ;Only 1/48 if in graphicsfunc1 clrgrp: xra a ;Turn graphics mode off sta grhflg jmp func1 clrdir: xra a ;Forward print mode sta dirflg jmD d vpos ;And subtract the current vertical position xchg call hlmde shld dlvpos jmp func2 sethtab:call tabcol ;Set have this result lhld vpos ;Get logical vertical position xchg lhld dlvpos dad d pop d push d ;Get copy of forms lempare position with number of tabs jnc tofar ;Past last tab push h ;Save col pointer call mtabp ;Generate tab pointer ******************************************** * * * Divide the number in HL by the number in DE. Return the * * quotierange (1-8) lxi d,tabstp ;Tab array dad d ;Make array pointer xra a stc mtab0: rar dcr c ;Bump bit counter jnz mtd returns. * * * ***************************************************************** hlmde: xchg call neghl xchgorizontal tab ora m ;OR in tab stop mov m,a ; and save jmp func1 tabcol: lhld hpos ;Compute address of current changth call hldde ;HL mod DE xchg pop d xchg call hlmde xchg lhld dlvpos dad d shld dlvpos jmp papr ****** ana m ;Check out tab stop pop h ;Restore col pointer jz tablop ;Loop if stop not set xchg jmp newdlh ;Set new col pnt in HL and the remainder in DE. * * * ***************************************************************** hldde: mab0 ret clrhtab:call tabcol ;Clear horizontal tab cma ana m ;Mask out tab stop mov m,a jmp func1 doaht: lhld h dad d ret ***************************************************************** * * * Hlcde compares HL with DE. Onracter col xchg lhld dlhpos dad d ;Get logical position xchg lhld hmi ;And divide by hmi to get character column x*********************************************************** * * * Neghl forms the twos complement of HL. * * osition and return tofar: lhld hpos ;Go all the way to the right xchg lxi h,maxrgt call hlmde shld dlhpos ret doaov a,d ;Start by negating DE and cma ; moving the left operand to BC mov b,a mov a,e cma mov c,a inx b mvi a,16pos ;Compute address of current character col xchg lhld dlhpos dad d ;Get logical position xchg lhld hmi ;And divid return the Z flag is set if * * they are equal, the Carry flag is set if HL is less than DE. * * * ******************chg call hldde mtabp: ;Make a tab pointer ;HL -> Tab column desired (1-160) ;HL <- address of tab stop ; A <- bit mas* ***************************************************************** neghl: mov a,h cma mov h,a mov a,l cma mov l,aff: lxi h,dfrmln ;Multiply forms length by 48 lxi d,48 call hltde lxi d,10 call hldde ;And divide it by 10 push h ;S ;Repeat count in reg A lxi d,0 ;Initial remainder is zero div3: dcr a ;Test if done rm ;All done ? dad h ;Shift rie by hmi to get character column xchg call hldde tablop: lxi d,numtabs inx h ;Start with next position call hlcde ;Co*********************************************** hlcde: mov a,h cmp d rnz mov a,l cmp e ret *********************k for tab stop lxi d,8 ;Number of stops per byte call hldde ;HL/DE -> HL, HL mod DE -> DE mov c,e ;Save inr c ;Make  inx h ret ***************************************************************** * * * Hlmde subtracts DE from HL anE ght operand to the left xchg push psw ;Save carry dad h ;Shift left operand to the left pop psw jnc div1 ;Does it f mov a,c ori d12 mov c,a nohhlf: call divid2 mov a,h ani d9+d10 ora c mov h,a lxi d,crstrd jmp cmnd papr: ftok: lhld hpos xchg lhld dlhpos dad d lxi d,maxrgt call hlcde jc rgtok lhld hpos ;Otherwise move only to maxrightput low bits mov a,h out daisy0 ;Output high bits xra e ;Slap strobe bits in out daisy0 mov a,h ;And drop strobes  dad d ret ***************************************************************** * * * The routines below actually intsition lxi h,0 shld dlvpos ;Reset vertical motion pop h lxi d,pfstrd ;Paper feed strobe jmp cmnd wheel: push h cit ? inx h div1: push h dad b jnc div2 xchg inx h xthl pop h jmp div3 div2: pop h xchg jmp div3 *******lhld dlvpos ;Check for any paper motion mov a,h ora l rz ;No motion mov a,h ana a mvi c,0 jp posv call neghl t xchg lxi h,maxrgt call hlmde shld dlhpos rgtok: lhld hpos ;Update the horizontal position xchg lhld dlhpos dadback down out daisy0 ret cmndmt: pop psw ;Toggle lines on a Multio ani 0ffh-rest ;Keep ribbon up on a Multio mov h,aerface to the printer, * * causing paper feed, carriage, and print wheel motion. * * * *****************************all carrg ;Position the carriage first call papr pop h lxi d,pwstrd cmnd: call selg0 ;Select group 0 cmnd0: in dai********************************************************** * * * Multiply the contents of HL by the contents of DE. *  mvi c,d11 posv: mov a,h ani d9+d10 ora c mov h,a push h ;Save paper motion lhld vpos xchg lhld dlvpos ;Get lo d shld hpos lhld dlhpos ;check if required motion is to the left mov a,h ana a mvi c,0 jp posh call neghl mvi  mov a,l out daisy0 ;Output low bits mov a,h out daisy1 ;Output high bits xra e ;Slap strobe bits in out daisy1 ************************************ carrg: lhld dlhpos ;Check for any accumulated motion mov a,h ora l rz lhld hpossy0 ana d jz cmnd0 mov a,l ;Negate low data bits cma mov l,a mov a,h ani d9+d10+d11+d12 ;Mask in data bits only  * * ***************************************************************** hltde: mov c,l mov b,h lxi h,0 mult: mov gical position dad d push h ;Save for now lxi h,dfrmln ;Get default form length lxi d,48 call hltde ;Multiply by 48 c,d11 posh: xchg lxi h,0 shld dlhpos ;Reset the horizontal increment xchg mov a,l ani 1 jz nohhlf ;No half spaces mov a,h ;And drop strobes back down out daisy1 ret ***************************************************************** * ;Check for too much motion xchg lhld dlhpos dad d mov a,h ana a jp lftok lhld hpos call neghl shld dlhpos l cma push psw lda mother ora a jz cmndmt pop psw ;Toggle lines on a motherboard mov h,a mov a,l out daisy1 ;Oua,b ora c rz mov a,b ora a rar mov b,a mov a,c rar mov c,a cc dadde xchg dad h xchg jmp mult dadde: lxi d,10 call hldde ;Divide by 10 pop d xchg call hldde ;Compute HL mod DE xchg shld vpos ;Save new vertical poF  * * New list device status routine. Returns 0ffh if the printer * * can except another character, otherwise it returns * ***************************************************************** cinit: call selcon ;Select console mvi a,dtrenb+rttabs/8+1 ;Tab stops bit array tablen equ numtabs/8+1 ;Length of tabs array *************************************************01 dw 6 ;19200 110 ***************************************************************** * * * The following is a liizontal motion index. Set by linit ; and escape sequences. vmi: dw 0 ;Vertical motion index. Set by linit ; and escaselect console pop psw jz valid ;Do default rate lxi h,btab ;Pointer to baud rate table add a ;Table of words so  0. * * * ***************************************************************** stlst: lda group ;Check printer initiasenb ;Enable DTR and RTS outputs to terminal out mcr in rbr ;Clear reciever buffers in rbr xra a out lsr ;Clear stat**************** * * * Console and list device initialization routines follow. * * * *************************st of valid baud rates. The current * * baud rate is checked on cold boot. If it is not in the * * vtab table then the baud pe sequences. vpos: dw 0 ;Vertical position. Set by platen motion dlvpos: dw 0 ;Delta vpos. Set by platen motion hpos: dw 0double mov e,a ;Make a 16 bit number into (de) mvi d,0 dad d ;Get a pointer into baud rate table mov e,m ;Get lower blized flag ani denable rz ;0 = printer not initialized call selg0 ;Select group 0 lxi d,pwstrd in daisy0 ana d us out ier ;Set no interrupts call selg0 ;Select group 0 in sensesw ;Get sense switches xri 0ffh ;Test for multio **************************************** ***************************************************************** * * * Terrate will be set from the defcon * * word found below the Cbios jump table. If the user * * happens to have a weird baud rat ;Horizontal position. Set by carriage motion dlhpos: dw 0 ;Delta hpos. Set by carriage motion lmar: dw 0 ;Left margin diryte of word inx h ;Point to high byte of word mov d,m ;Get upper byte. (de) now has divisor jmp setit ;Set baud rate. mvi a,0 rz cma ret ***************************************************************** * * * Dynamic data locatiboard sta mother ;Save motherboard flag jz valid ;Skip switch checkout for multio's xri 0ffh ani 0e0h ;Mask in upper minal initilization routine. This routine reads the sense * * switch on the WB-14 and sets the speed accordingly. * * e that is not in this * * table or is looking for a way to save space then entries * * can be added or deleted from the tableflg: db 0 ;Direction flag grhflg: db 0 ;Graphics mode flag escflg: db 0 ;Escape sequence in progress flag tabstp: ds num btab: dw 1047 ;110 Baud 000 dw 384 ;300 001 dw 96 ;1200 010 dw 48 ;2400 011 dw 24 ;4800 100 dw 12 ;9600 1ons used by the simulator. * * * ***************************************************************** hmi: dw 0 ;Horthree bits rlc rlc rlc ;Move into lower 3 bits cpi 7 ;check for sense = 7 push psw ;Save value call selcon ;Re-G . * * * ***************************************************************** vtab: dw 2304 ;50 baud dw 1536 ;75 blo HyType printer. * * * ***************************************************************** linit: call selg0 ;S dcx h vskip: inx h ;Skip to next entry inx h dcr c ;Bump entry counter jnz vloop nvalid: lhld defcon ;Get default k hydone: lxi h,hinc/cperi shld hmi ;Save hmi = 120/(characters per inch) lxi h,vinc/lperi shld vmi ;Save vmi = 48/* * ***************************************************************** valid: mvi a,dlab+wls0+wls1+stb out lcr ;Accata buffers lda group ori denable out grpsel ;Re-enable the drivers mvi a,0ffh-rest ;Lift ribbon out daisy1 jmp hyd dw 1047 ;110 dw 857 ;134.5 dw 768 ;150 dw 384 ;300 dw 192 ;600 dw 96 ;1200 dw 64 ;1800 dw 58 ;2000 dw 4elect group 0 in sensesw ;Get sense switches xri 0ffh ;Test for multio board sta mother ;Save motherboard flag jnz mbaud rate xchg setit: mvi a,dlab+wls1+wls0+stb ;Enable divisor access latch out lcr ;Set the baud rate in (de) mov a,d(lines per inch) lxi h,0 ;Other variables default to zero shld vpos shld dlvpos shld hpos shld dlhpos shld lmar ess divisor latch in dll ;Get lower divisor value mov e,a in dlm ;Get upper divisor value mov d,a mvi a,wls1+wls0+stone ;Mother board initialization mthrin: mvi a,pselect+rlift ;Set select line active, rlift not active out clk mvi a,08 ;2400 dw 32 ;3600 dw 24 ;4800 dw 16 ;7200 dw 12 ;9600 dw 6 ;19200 svtab equ ($-vtab)/2 ;Length of the vtab thrin ;Initialize a Multio lda group ;Get group byte ani 0ffh-(denable+restor) ;Clear driver enable + restore sta gr out dlm ;Set upper divisor mov a,e out dll ;Set lower divisor mvi a,wls1+wls0+stb out lcr done: xra a ;Clear st call clrall ;Clear the TAB array xra a sta kludge ;Reset TAB clear byte sta dirflg sta grhflg ret selg0: lb out lcr lxi h,vtab ;Valid baud rate table mvi c,svtab ;Length of the baud rate table vloop: mov a,e cmp m ;Check lffh out daisy0 mvi a,0ffh-rest ;Strobe restore bit low out daisy0 mvi a,10 ;Wait about 50uS dloop: dcr a jnz dloop table ***************************************************************** * * * Valid checks if the divisor latch is aoup ori denable+restor ;Enable output drivers and pull restore down out grpsel mvi c,10 ;Hold restore line down for 50uS atus register out lsr ret ***************************************************************** * * * Initialize Diada group ;Select group zero out grpsel ret selcon: lda group ;Select console group ori congrp out grpsel ret sow byte jnz vskip ;First byte is bad inx h mov a,d cmp m ;Check high byte jz done ;Baud rate is OK... Do cleanup  mvi a,0ffh ;Raise restore back up out daisy0 xra a out daisy1 ;Clear data buffers mvi a,pselect ;Lift ribbon out cl reasonable value. * * If the value seems off then it will get the default baud * * rate from defcon and jump to setit. *  delop: dcr c jnz delop ani 0ffh-(denable+restor) ;Clear driver enable + restore out grpsel xra a out daisy0 ;Clear dH ellst: lda group ;Select printer group ori lstgrp out grpsel ret db 0 ;Ensure generation of a complete hex file fo th WB14- an MULTIO- systems. DESCRIPTION Thi progra automaticall determine th hardwar (Wunder busk WB1 excep th CP/ consol i devic othe tha por o th Wunderbuss. yTyp I paralle printe driver 6/21/82 MK. sio interface car o th Wunderbus I/ motherboard Thi drive i designe t ru unde fou conf instal packag diskette. hytype.as Instal drive sourc code install.co Relocatabl BIO modul installerend  o Mult/I controller bein used Th "- fla force th remova o th consol driver User wh hav purchase  MULTIO-Thi configuratio i lik MULTI excep th CP/ consol i devic othe tha por o tigurations Thes configuration are: WB14Thi configuratio i use o th Wunderbus I/O  install.do Documentatio fo INSTALL.COM makeprl.co Relocatabl modul generator makeprl.do Documentatioth Mult/IϠ o Wunderbus board fo us a paralle printe boar shoul us thi "- fla option Th "h Mult/IO. Th INSTAL̠ comman line neede fo eac o thes system are: board o th Morro Design Decisio ɠ desk-to system. MULTIOThi configuratio i use o th fil fo MAKEPRL.COM makeprl.su SUBMIԠ fil堠 fo creatin砠 variou󠠠 pr configurations C000 argumen give i dependen o th user' system Consul th INSTALL.DOà fil o you installatio man INSTALL HYTYPE.PRL C000 fo WB1 an MULTI system and INSTALL - HYTYPE.PRL C000  Mult/I board o th Morro Design Decisio rac moun systems. WB14-Thi configuratio i liprl.do Documentatio abou PR files These install drivers are provided: length hytype.pr 60 HDESCRIPTION Thi i th Diabl HyTyp I instal package I contain on integrate drive fo th Mult/I reviua fo de scriptio o thi parameter. FILES Th followin i lis o th file foun i th printe I H>/M ʟyH>LHHMII29!_^#VA`0  Y("͐w***55K 7 ®͐/w***5#/͠^*!0("!n0] 5es. List of Equates - CBIOS&.ASM maxhd equ 0 ;Set to number of HDCA3 hard disk drives maxmw equ 1 ;Set w#w###xMʐHM ʟyHM>:8 28yO:!y:!y!Q:54####~#fo` ean ABOOT&.AS files. Man parameter o th Cbio ca b modifie b changin th valu o certai ke variable`@:0  >KH_IW>K!{7#zO+## +*6>KzI{H>KMI29‡:8280O nOH:8 O**5(*"|/g}/o# |}z/G{/O>=))L# X#AAMD!xxGyOu)b*|*to number of HDDMA hard disks maxfd equ 0 ;Set to number of 2D/B floppies maxdm equ 2 ;Set to number of DJ DMA floppies 8" ma  f  123456 890ABabD=U4 ~ ` ``` T p *y2r*":!*r whic ar use durin th assembly Fo example th labe MSIZ i use t adjus th memor siz o th reconf>Iä>J>H>H> =•>HI>J! "!"!"""""222:8O:8O:8O$I$I$ RRHI*|* "**0/ڱ*!0("**"*| !"}yOL|g <*|| |xmf equ 2 ;Set to number of DJ DMA floppies 5 1/4" hdorder equ 0 ;Set the order of logical drives ELSE 0 mworder equ 1 ;  i͝: *":!*͝ Í22**(">fi&1:!*Í!6#2>22igure CP/M Th followin lis o equate wer pulle ou o th Cbio t giv yo a ide o th option availabl!$B I$I$I$I$IID$$ $ "BH@I$$DI!" " !  AI$@@$ @!@g**!n0] 55"!"<w@ H?}/o|/:9cg}I|HH|Hg}H|II|I:8 @ if not included fdorder equ 0 dmorder equ 2 mforder equ 3 ;HDC3 controller disk drives. Set only 1 M26 equ 0 ;Shugart SA2>2**"i&+"i&+"IiI i*|g}oY^*]*("Y*]* i th CBIOS&.AS͠ file Refe t th CBIOS&.AS fil i yo wan t se ful explanatio fo som o thes equat:OTY?!$'*D03 _-tÌ !:x:!JxJS~#T] @  !@AH J 4000 M20 equ 0 ;Fujitsu M2302B M10F equ 0 ;Fujitsu M2301B M10M equ 0 ;Memorex ;HDDMA controller disk drives. Set only 1enter A>SAV 5 MOVCPM.COM[RET] to sav th reconfigured MOVCP program, and A>MOVCP x *[REbios' length Th followin procedur wil perfor thi modification. Enter A>DD MOVCPM.COM[RETin memory) Answe b pressin th RETUR key (A thi poin th sourc fo th ne syste i i RA memory no.AS file hav bee edite an re- assembled th followin procedur ma b use t incorporat th ne driver int CP/M: ntinu b entering -IBIOS&.HEX[RET] then -R(value of OFFSET)[RET] wit th OF cm5619 equ 0 ;CMI CM-5619 st412 equ 1 ;Seagate ST-412 st506 equ 0 ;Seagate ST-506 Mak cop o th .AS files the edT] wher x i th MSIZ valu tha yo assemble th CBIOS&.AS fil with, then A>SAV 4 CPMxx.COM[] -S103[RET] Locatio 10 contain th BIOSLΠ valu fo th MOVCP program. Enter  o th dis wher yo wan it). The return: Destination drive name (or to warm boot) Enter Enter A>TYP ABOOT&.PRN[RET] watc fo th labe "OFFSET i th listing an recor it value. EnFSE valu obtaine fro th firs ste i thi procedure. Finally enter -^C (control C) t i th CBIOS&.AS fil fo you desire syste configuration Thi involve changin th number followin th eq porRET] wit x a above. Again enter DDT, this time with the new CP/M system file: A>DD CPMxx.COM[RE 0103 15 xx[RET] 0104 43 .[RET] wher x i th firs tw digit o BIOSL an pres RETURN  th destinatio driv - throug P B carefu abou whic drive (har dis o floppy ar drive A B etc a ter A>TYP CBIOS&.PRN[RET] watc fo th labe "OFFSETC i th listing an recor it value. I th retur t CP/M fro DD. Now enter A>SAV 4 CPMxx.COM[RET] wit x a above, and then tio o th fil t reflec th numbe o drives thei orde withi th system th driv type etc Us th followinT] The value of xx is as above. Enter -HEX[RET] then -R(value of OFFSETC)[RET]Fo instance fo BIOSL o 180, typ in 18[RET]. then enter -G0[RET] to exi DDT. Next thi ste destroy th origina CP/͠ o th destinatio drive. To complete this process, press the RETURNBIOSLΠ equat wa modified the w mus modif th MOVCPM.CO͠ progra t creat CP/ syste tha matche th ne CA>SYSGEN[RET] SYSGEN returns Morrow Designs SYSGEN version 4.1 Source drive name (or if  a guidelin fo assemblin th files: A>MAC CBIOS&[RET] A>MAC ABOOT&[RET] Onc th CBIOS&.AS an ABOOT& Us th OFFSET valu obtaine fro th secon ste i thi procedure B sur t omi th parenthesis CoK  key twice: Destination on (drive):, type to warm boot) Function complete Destinatth lengt o th fil t b transferred fai numbe o request t plac th "A o "B diskett int Driv wil ap begi operatio i singl mod (th "S argumen i fo Start) Th progra wil respon tha SINGL ha bee installwithou an chang bein made a wil typin SINGL S i alread i singl mode. REGEN Th REGEN.CO comman regenperate b interceptin CP/ call t dis driv selec routines Rathe tha selectin NE drive SINGL prompt th u use whil i singl mode Ther ar tw exceptions however Th FORMT#.CO program becaus i make direc call ion drive name (or to warm boot) Rese th syste an d "col boot. Th syste heade displays yopea unti th cop i completed A entir syste dis coul als b backe u thi way Firs on woul forma th ed an retur t CP/M An operatio tha involve changin drive wil no resul i promp t plac th "A o "B dierate CP/ singl densit diskette whic hav bee formatte i suc wa tha i i incompatibl wit th norma opse t plac a "A o "B diskett int Driv A I othe words SINGLŠ turn Driv int logica dua driv syst Dis Jocke 2D/ firmware wil no functio properl i singl mode an MOVCPM.CO͠ becaus o memor relocur new system size now. SINGLE COMMAND Th progra SINGLE.CO i o interes mainl t thos user wh hav onl destinatio disk Next th command: A>PIP A:=B:*.*[RET] woul begi th copy Thi proces wil tak skett int Driv A I ou example th "B diskett woul b th on wit th fil whic w wis t cop ont th systeratio o th 179 controlle chi (IMSA diskette i particula hav thi problem) Thi progra wil b o interestem Th user however mus kee trac o whic diskett ha bee designate th "A diskett an whic th "B disketatio problems. T exi singl mode type: A>SINGLE E[RET] Thi wil retur th use t th stand singl driv syste an D 2D/  controller It purpos i t allo thes user t cop CP/͠ file betwee diman man swap bu wil d th job Th numbe o diskett swap depend o th amoun o memor whic PI ha t usee diskette One coul no type: A>PIP A:DEST.FILE=B:SOURCE.FILE[V] [RET] Dependin upo  t thos user wit th Morro Design Dis Jocke 2D/ Controlle only I i no intende fo us wit th Dis Jockte A a example t cop fil fro driv t driv A giv th command: A>SINGLE S[RET] tar CP/ syste (Th "E argumen i fo End) Typin SINGL E whe no i singl mod wil repor a erro an retur skettes User wit dua driv system ca perfor suc copie faste an mor convenientl simpl b usin PIP. SINGLŠ o an o th amoun o dat t b transferred. I general an CP/ comman whic ca b use i regula mod ca bL e DM controller. Th REGEΠ progra i designe t b use wit diskette whic hav bee formatte incorrectl - no as an initial drive specification, i.e., -c specifies that the newly installed BIOS should respond to drive controller BOOTHD.CO coul b programme int PRO s tha yo coul boo directl ont th har disk withou t ha bee regenerated Th origina diskett i bot th sourc an destinatio diskette an mus therefor b wri 48K CP/M (assuming that you have memory above 48K), execute INSTALL -C M26.prl C000 Here, M26.prl i wit diskette tha hav bee partiall destroyed A exampl o diskett tha coul b use wit th REGE progra is C. The CP/M system must be standard: its BIOS must begin with the jump table as defined in the "CP/M 2.0 Alterhavin t bothe wit th floppies. BOOTMW Th progra BOOTMW.CO͠ contain boo stra loade fo th HDC/DM ht enabled. Th fina resul shoul b singl densit diskett tha i readabl bot o th machin tha origins the "skeletal BIOS" (provided with INSTALL) containing the 14 inch hard disk drivers, and C000 (hex for 48K) is on tha th Dis Jocke 1Ġ boar ca read bu th Dis Jocke 2D/ canno (th DJ1Ġ doe no utiliz th 179 contration Guide", and it must store the address of this table at location 1 in memory. A "skeletal" BIOS module ar dis controller. Th Morro Design MPZ8 CP car ha bot BOOTHĠ an BOOTM encode i it PROM Refe t thall produce i a wel a o th Dis Jocke 2/B controller. Simpl typin REGEΠ wil invok thi program I ha olle chip) Essentially th REGE progra read complet trac o dat an forma informatio int memory filterbegins with the same jump table, but may leave some of the required functions unimplemented. The corresponding jum MPZ8 manua fo th prope switc settings. enoug prompt t explai it use. BOOTHD Th progra BOOTHD.CO contain boo stra loade fo th HDC har dis ou th formatting re- format th trac an the re-write th data Thi proces i repeate unti th whol disketp vectors are left as jump-to-selfs. EXAMPLES To install the 14 inch hard disk (M26) as drives C, D, and E in a