IMD 1.17: 10/06/2011 9:41:34 48k cp/m version 2.2 cbios revision e.4 #902 movcpm; ab: dj/dma 8, cd: dj/dma 5, e:hdc/dma m5 movcpm5; a: hdc/dma m5 bc: dj/dma 8, de: dj/dma 5 movcpm10; ab: hdc/dma m10 cd: dj/dma 8, ef: dj/dma 5 movcpm16; ab: hdc/dma m16 cd: dj/dma 8, ef: dj/dma 5 multio (9600) console multio 9600 cts list multio (centronics) punch  >&2P!"Q2S:ʑ!@"~ʭqʭ4#¡z5û#)#)% \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<Ò2͙˒ÒÒÒ͙ߒÒ !2:2a{_:ʖ:>Ľ˒ʖ:=2̙–!B!6#5ڒʖ:Ľ!ͬ“ʧݓÂݓ )!F#xʺ~0wëw!" !~6ͽ:ý(!ϕ#͘*~ ""͌#>?͌͘ݓ =_.:;<> Oo$>!͙Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*ٔ6?۔wȔ0ߔ#6 #6" #~?  xDIR ERA TYPESAVEREN USER"ſ!yΙO#< Ty#O 321y_͸2y2ͽ:1͘ГA͌>>͌9ؓГ2^ :¥.!_~#fow]!v"!ߕçREAD ERRORçNO FILE^: !Ι ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2͙:=!ý:=!:ý^T!Ι~  6?#ˆ:`O> K{̖͘ГA͒>:͒Ԗ͢>:͒͢xK > K > ͒x  ٖٖ͢“ØÆ^ BRͧ9!5‚#~Y‚#"T͙<ÆALL (Y/N)?^ TВʧ͘!6!~ڇ w4!Y~ʆ͌“†t=ʆٕf ^ T͙ 2o&)|+!͙ؓԗ͙ڒ<ͧՓÆNO SPACE^ :Ty!͙ݙB*O=?_s#"^sG!~Ypsp2͙m͙ÆÆf ͧFILE EXISTS _:Ι É:Ι Ę:ʉ=2)ͽÉ֙ T!@Вk!͙ؓ}|q=qf^!~2͙>`~2ݙ2\!͙!B!~> >#0~O#Cx2͘Փ1)ͽÂf zͧÆBAD LOADCOMf^:Ι ! Â$$$ SUB"ſ"C{2֧!"E9"1A22ާ!ty)K!G_^#V*CȜΜԜ~EȦצ ,&-AGMS!ʚ!՚ô!ô!ܚBdos Err On : $Bad Sector$Select$File R/O$ɛ:BA2ƚӛӛ!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #Hɛ: !  Hù H H $O͐ӛ: 2 *CN# x: 2 p&x~+é7ɛ2 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMDӛ#2E>! ^#V w#P:BO|^#V#"##"##"##"Ч!O*!O*Ƨ|!ݧ6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*ΧDM*s#r*s#ryOxG*Ч0MD!!çN:㧷 EG>O: \S*C :ݧqn& ^#V>O^"*}:ç*)=":ħO:㧡o"*C *C!ͮ~2~2ͦ:ŧ2ͮ:էޞO:㧁w:w |g}o*# ):BO!yoxg*:BO}!N#F "*ȧ#*s#r^ ~!J! J*:駅o$*C~i6iw**{#zr+s{ozg**̧͕** ğ,w͜͸ڟͲ!!N#F$**O!~#Ҡ:A#~$=2Ek͌:ԧ:ŧ/GyO>2ԧ!اq*C"٧͡ʔ*٧JҔ^:اOyʃ?|x | s-|N-# S:2E!ԧ~Яw>T D^6kƟ-äPYyѡ 5*Ƨ{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ݧ~ۢw~͔͔# # ͢ w ~>2ҧ!E5T*C!"C"C!w# F! w͌x2ҧ͢*C ~<wʃG:ŧ!ҧʎì 4~ʶ¬:ӧ<ʶ$ʶïZͻx>2է>2ӧͻ:!᧾Z2:Eẅ́͊ѝͲҞ>2է>2ӧT*CGͻ:ẅ́n>2ק;O ^DM;}H>"*C :ݧ:קddslO s#r:E͊:է==»y==»*Ww#*"ѝ͸*:ħG#š"ڟѝ͸:!᧾Ҥw4!iw:էҞZ!E~=26Ҟ2է*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:֧!Bw!>2ާ*C~=2֧u:B2ߧ~2wE:A*Cw>"!""2B!"ڟ!rQQQâ~?¦ͦ~?rQ*٧"CQ-Q͜QüQrQ$Q*):B"ڟ*)*)Q;*"E:֧;:A2AQÓQÜQҥ*C}/_|/*W}_*"}o|g":ާʑ*C6:৷ʑw:ߧ2֧E**E}DQ>2էҶ9]EQ}ֵÿ ÁÇÍÓÛÈÌ1>2&.Pv9͍>22!"!"222:!ʁ!^#Vͥ2*|O|g+ĩ|g}oö#|g"!#ө$:=o&))))))) !>:>2>=>͍:g.͍!:ʄ:e:**z{{{!:{={*":2>2ɯ2:=>2Ǫ͚>> 2Ǫ͚͵2 .*DM.*!DM. ..>7>x¤.ä2:g|Oogy#{_~#foy'w# x~#O ,!:O::#O:2!o&))))6:g. |ʩ^#V#"~#fo"$*+ ʦ~<ʬ:w#Î"+!,é! :O*+zث{ث*"*"!y #: #: #: #: # ü BAD MAP OVERFLOW! PMMMM((((*&)T]))C(DϭU!"͌½:*@½ !#)#) # %:ֱ=:=/¿>ÿ:iO!~9ܮ####̮#:ֱ2ֱ͂w#~#fo' s#r':ֱ>:Y尯2!ֱ~c~~y#>EO>2~yO>2:ֱ ͏͏:!w^n~~   !"#$%&'( !"#$%&'(.^ڽ .n#S.~l.O?(?(Q?(?(^ (0!P6%#6~ذz˰7%!͕22͂~2ֱ͓#6%y2y2`i"> >!2! ͌7?>@!D~U5+"ű##"ͱ"ʱ####"ұ!ı͕  =-!͌7:o:$!ױ*&͕++~@>&2P"Q2Swʥ.(%"%#%%7t     %&'()*+, -. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>?@)*+,-./0?4 < @+ 4 h@x1@W@LڴM{ ty2$9:{9͓9͘$:o&))))2͊y2>{ Ì>{$!6#6ͳδ6#6Ϳ$!δ^#V+q#pi`"z{!"`i"y= 2y2 *P" :R2 T!"P2R"@2B*!:{>2@*@ڙڙ:2/O:2:2!6U~7z½7:_!`i#|/g}/o#޴|}.4 W]EHhQyHsM>sM >O͈}yHͲM *N:èGMʫH2èGx»O>ʵʿHͲM>ֵIyI>H>HyH>I>IOH >aIs%g%=!o_^#VA*>KzI{H>KIM>LNMHH:O:O`0 Ͳ>K*|I}H>K>LHI:OIʷ>H>J>H>H: 2O>H:O:O12222!|2":2 ! 6 }!,P Morrow Designs 48K CP/M 2.2 E4 AB: DJ/DMA 8", CD: DJ/DMA 5 1/4", E: HDC/DMA M5 $@B B HH II$@DI MOVCPM COMjDU COM. FORMATHDCOM% HDBOOT COM#HT9 COMDDT COM&HT9 COMt !"#$INTEST COM%M10BOOT COM&'M16BOOT COM()ED COM4*+,-M5BOOT COM.6PIP COM:/012STAT COM)345RT3@MULTCOMl89:;<=>SYSGEN COM 7HT9 COM?@ABCDZ[HT9 COMt\]^_`abcMBASIC COM>ABCDMOVCPM5 COMjEFGHIJKMOVCPM10COMjLMNOPQRMOVCPM16COMjSTUVWXYCBIOS B Z[\]^_`aCBIOS B bcdefghiCBIOS B jklmnopqCBIOS B rstuvwxyCBIOS B z{|}~CBIOS B CBIOS B CBIOS B CBIOS B CBIOS B >&2P!"Q2S:ʑ!@"~ʭqʭ4#¡z5û#)# )% \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!BOOTMW ASMABOOTMW COM FORMATMWCOMFORMATMWCOMQFORMATMWDOCDOWN COMCHECK COMEBAUD COM!BAUD DOCHYTYPE DOCHYTYPE PRLHYTYPE ASMHYTYPE ASM~SWAP COM SW902 000 SW902 010 SW902 016 SW902 005 CBIOS A 7FDJ COMFDJ COM1ABOOT A ABOOT B ABOOT B >INSTALL COM:INSTALL DOC MAKEPRL COMMAKEPRL COM?  MAKEPRL DOC  PRL DOC PILOT COMPILOT COMq(Copyright (C) Digital Research, 19801] w?w! [[0 n))) O <|n}n.g))Ë!$ʇ~/w/wz|g*"|=?:G|g"! *xB {5~#o}o>$*½# K:m ! ~‹#c* DM! xʋ w#zÈL!Uͦ*)"[660#60 4~:ڬ+4#60ì!"ÈxG *w# x*  Invalid memory size$ Synchronization error$ Constructing 00K CP/M 2.2$ Ready for "sysgen" or "save 00 cpm00.com" $#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER"ſ!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧRAMCHK1 COM, E4 DOC!"#$%&'(E4 DOC)*'ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB"ſ"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N# 2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2 !"#$%&'(.)^+ ,.)n#,S,.)~l,,.),,O?(?(Q?(?(^ (0!P6%#6~z7%!͕22͂~2͓#6%y2y2`i"> >!2! ͌7?>@!D~U5+"##""####"!͕  =-!͌7:o:$!*&͕++~@>&2P"Q2Swʥ.(%"%#%% 7 t      %&'()*+, -. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>?@)*+,-./0?4 < @+ 4 h@x1@W@L!"M!{!!! ""t"y"!2"$"9:"{!9͓!9͘!$#:"o&))))2"͊!y2">{" Ì!>{"$"!#6#6ͳ""6#6Ϳ!$"!!"^#V+q#pi`"#z{"!  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#2&.Pv9͍>22!"!"2#22#:!ʁ!^#Vͥ2*#|O|g+|g}oö#|g"#!###$:#=o&))))))) $!>:#>2>=>͍:#g.͍#!#:ʄ:e:#**#z{{{!#:#{={*"#:#2#>2#ɯ2#:=>2͚>> 2͚͵2 .*#DM.*!#DM. $..>7>x¤.ä2#:#g|Oogy#{_~#foy'w# x~#O ,!:O:#:##O:2!o&))))6:#g. |ʩ^#V#"#~#fo"#$*+ $ʦ~<ʬ:#w#Î"+!,é! (:#O*+z{*#"#*#"!#y #:# #:# #:# #:# #""`i""y=" 2"y2" "*P" #:R2 #T!""P2R"@2B*#!":"{">2#@*#@"ڙ""ڙ":"2#/O:"2":"2#!#6U~7z½"7:"_!"`i#|/g}/o#"|}".)4#,, W]#E#Hh#Q#yHs#M>s#M >O͈#}#yHͲ#M *N:GMʫ#H2Gx»#O>#ʿ#HͲ#M>##I#yI>H>HyH>I>IOH >a$Is#%$g$%$=$!o$_^#VA$*>KzI{H>KIM>LNMHH:O:O`0 Ͳ#>K*|I}H>K>LHI:OIʷ$>H>J>H>H: 2O>H:O:O1222#2!|2":2 (!( 6 $}$!%,P Morrow Designs 48K CP/M 2.2 E4 AB: DJ/DMA 8", CD: DJ/DMA 5 1/4", E: HDC/DMA M5 $@B B HH II$@DI "**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈNÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  ># ü BAD MAP OVERFLOW! (PMMMM((((*&)T]))C(DU!"͌½:*@½ $!#)# ) # $ %:=:=/¿>ÿ:i$O!~9#####:2͂w#~#fo' s#r':>:Y2!~c~~y#>EO>2~yO>2: ͏͏:!w^n~~   !"#$%&'(ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I$!$DH(*B"B!A$ BB@$$!"$$HIHB@@H " @$! $I!$DDDD@@UUI$@I $HH@$HD ((()UUQ !$IDH! BA  B$HTTTT$$D!  B H  UUQ$BI@!$@@! $B( ! x: : ͙ {:BK >-*#}R|wFʂzk{E ͊: ͊Ϳ* , |~> œ>(~ , #>., ~ ~> >)6 ++FREE++ :2ʿ>:, ~# ~ *#"!~~N_#~N:BW#eC *+"|"!:!!>2:ʚ!26 ++NO "<" SAVE COMMAND ISSUED ~#ɯ2F!W6 a 4G~{:G*}b( 2*`*Hg !~#":͙ {z!F~~Ҥ ҫ ʫ ʫ ʫ~ î,}( *`*Hz6 ++EOF++ Ϳa :R26 ++Can't dump, no sector read. 26 Use G command following F, or R or S following T ~;] fyZ BK y;y#Z `i} , , :A~ }, }, {ʱ#}‘F:H1 ~ ~>.{#}1 ͿF{|Ϳ{|ctors # print disk parameters for curr drive. =xxx search for ASCII xxx from curr sector. Caution: upper/lower case matters. Use for hex: To find "IN 0" use: =<0> or "(tab)H,0(CR)(LF)" use: =<9>H,0 < save current sector into mem. buff. > restore saved sector ? give help A[ff,tt] ASCII dump (Type any char. to continue) C Change: CHaddr,byte,byte... (hex) or CAaddr,data... (Ascii) Allowed for imbedded hex. or CHfrom-thru,byte e.g. ch0-7f,e5 or CAfrom-thru,byte D[ff,tt] Dump (hex+ASCII) Fn.t Find file Gnn CP/M Allocation Group nn H[ff,tt] hex dump L Log in drive Lx Log in drive x M[nn] Map [from group nn] (Type any char. to continue) N New disk P Toggle printer switch Q Quiet mode (no msgs) R Read current sector Snn Sector nn Tnn Track nn Unn Set User nn for Find command (CP/M-2 only) V[nn] View [nn] ASCII sectors  @A $@P   @H @!@ @BA $~;  W T( SD Gʼ  *ڤH>2a z*`2g W ****+:G}2:GŒ "*2:2-« o&" ͙ *ڤ"2 H`2W bk:)= :o* ** #>2\y y \D2|~.ʡ ʢ ;ʢ #y ~ ;#.#> ¢ ~ ; ͙ z( z *`*Ha ~ ; ͙ z*+| *| *"* +"*"z *#*Q *#*J "!"] **ډ 6 G=*DM >:: >,6 T=* 6 , S=* 6 , PS=* Ϳ~#Z #- Z #BK ,H. A~ ; ~   "#y * ~ ;#~ ;,- "͙ { yZ *. ~ ;:y 26 ++Can't read - not positioned Position by: Track then Sector, or Group >< >>: x y   W Write current sector X Exit program Z[nn] Sleep [nn tenths] /[nn] Repeat [nn (decimal) times] (Type any char. to continue) Cancel a function with C or Ctl-C. Suspend output with S or Ctl-S. Separate commands with ";". Example: g0 +;d;z#20;/ would step in, dump, sleep 2 sec, and repeat until control-c typed. All "nn" usage except "/", "T", and "S" are HEX. Use #nn for decimal. See DU.DOC for complete examples. y#x}/o|/g#ɷ|g}o  }o|gBKx-!: T]x: 0:OÅ*.:^#"^#"~#2~#2^#"^#"^"!~:w* ""wDU.COM ver 7.5 1/23/81*." |2*""""<"D""\""""S:p"Å*.""6 DISK UTILITY ver 7.5 Universal Version Type ? for help Type X to exit ]!~GW##> !W2 >2212>2!"F:˜ ~ ;#2+ʫ - =ʃ#?uACʸ DF G HLfMNʨPQʹRl S T UViW XZ/ʿ26 ?26 +++ Out of memory +++ 6 Disk Information: Tracks: *# 6 Sec/trk: * 6 Grpsize: : x1F$POÁl~ ;#AOy2:ʥ|^#V#"!~#fo=*H`*|2g *"!"*#DMBK:=*H*` 0   | {0> >*F~N Q #~7 #͙ zo {o ƀ_ɯ26 ++BAD DISPLACEMENT (NOT 0-7F) ~# ~ ;,->#0: AG0))))oâ #~ ;,-#0:0bk)))o|g 6 :!WOʲ Ubbʚ| w#K+>*w> !Wɯʲ+yv~͇͇}  $6 Ϳ!W~ #ä>^>U > > `_O > :4   :y >2, ,:<2:8*ڤ"BK*"*`iҀ:š+Ú* :g:š&i"DMɯ26 ++not within tracks 0-* 6 ++ >226 ++READ failed, sector may be invalid++ :O26 ++CANNOT WRITE UNLESS READ ISSUED s26 ++WRITE failed++ 6 Operands in brackets [...] are optional Numeric values: 'n' are decimal, 'x' hex +[n] step in [n] sectors; -[n] step out [n] se1^  C~D.F@L% ̈́͐͢>2:`} YcNDRcQ>2::uY1 w1  1ڄ8҄02 1ڢ5Ң12 AڿDҿA2>2>2ɯ25 FM>2 1 ͋44:344 1_͋!`U:!dU!g~2#~2@zb\ 2 HDk>2::2R>P!P ( P +|° ° 1 !@PGP#P"P 1 >P>P>P0P 1 !"6# xPXP"P͋@:*+|#+PMCn !""2>22Y :p/G:2R!>u o !͋ ʣ>Q~#S ©>QPʵ£!͋ >QP>QSSSw# P 1 !͋T5#! ˆE͡ g̀%g} !͋ R^#V#{!@ % m% # ++}<<͋!ʏ–>2:F B :F 8 :F J I % @ *@ 1 *:w#:w#:w#6">2ot halted.$ Write fault on drive.$.$ $ Waiting for drive to become ready, could take as long as 2 minutes.$ Testing sector headers, will take about 30 minutes. $ Formatting the entire physical disk, will take about 4 minutes.$ Formatting a logical drive, will take about 1.5 minutes.$Sector Error, Track $, Sector $, Head $, Error count $ All Finished, Returning to CP/M.$ Want to abort ? (Yes or No): $ Testing sector data field, will take about 12-14 Hours. $ Error Writing Sector Map to Track Zero.$ Bad Sector Map Overflow.$ Testing Track Seek Mechanism, will take about 15 minutes. $ Seek error, Looking For Track $, Found Track $. $ Unknown Command.$ Bad Drive Number.$ Choose The Desired Function: L = Format a Logical Drive. F = Format an Entire Physical Drive. C = Continue An Interupted Test. D = Run a Diagnostic Test. Function (RETURN to Exit): $ Not Yet Implemented.$ Select The Drive Type: A = Discus M26, 26 Megabyte Drive. B = Discus M10, 10 Megabyte Drive. C = Discus M21   22 !~#fo))):2: 2 !~#ʍ*}o!R*!R*}o!R!~w#~wD !! © #¯ !::#!~#fo!yOx#G!!*!yOx#G!!!~#fo"!Pi`}@og">22!~#J!Py@OG!yDx#`+ :2:2"!Py@OG!yyx#M` !~#–Ùi`"!N#F͔!~#fo))))}/o|/g}og!R!!Q!N#F!S!N#F!S!N#F!S*!S!!Q!!Q!Py3!PyU !Qyi !S!S22::ҹ! N#F! ~w#~w!Syw*#"À Read error !N#F!N#Fy !S !N#F*##N#F*####N#F͋ "!N#F*##N#F*####N#F͋ *####N#F #"!N#F*##N#F*####N#F͋ *####N#F "> 22!~#!N#F***̓y  :2:2âR:>2%  !""2<2͡ :>?>2>22Y o !͋>^>u :wn<҈ i: :w bn>QPʠPQ>QSS:GS,S,S,S, •! ME1̀%1 —: :<2͋!2ؐ<2=>Q~S# CC>QPSP7Q7P7?>Q!~S#w*6#:w#O:w#:w#6:2:ʬ>2>2͋>ʾ>2͡ n!<͋> >2͡ n!<2222y2XP0 @PGP͢ k͐ rY1 ͢k͐RY1  !""͋>k>222:2O% >Q>SSSS“͡ P 1 :͋:::͋:nO ¯Ÿ%:G:Ÿ!4͋>!:w!͋>2>4A:# :?% xGy:RR h > 2:=2A!^#V#{ʀ͠Î2  222<2͋>>2O ͋>>222=2û2<22<2͋>>20, 20 Megabyte Drive. Drive type (RETURN to Exit): $ Select drive type: F = Fujitsu 2301 M = Memorex 101 Type (RETURN to Exit): $ How Much of the Diagnostic Do You Want to Run: 1 = Sector Header Field Test Only. 2 = Sector Data Field Test Only. 4 = Seek Mechanism Test Only. Choose the Diagnostic by Adding together the Desired Options. Options (RETURN to Exit): $ Has the Drive Been Preformated ? (Y or N, RETURN to Exit): $$ Press RETURN to return to CP/M: $st OEntering Loading !* N#Fy*!"!4*N#FyH:4OGyWxz*@"*@ "*8*: "Ú2>22>2* ~#fo"* ! X #"!S!"!~#**N#Fy!!A!S* :2:2*##":2ü !!O!My 1!N#F!H !~#fo~|!~#fo~ ! ! !~#fo~OG!!~w#~wV !~ #~!N#F! ͡!N#F! 0 ! &!!9 OG&}!2<<2>22O 2222͋>, >2O >2<2<2͋>I >22 o :O:2| :O:2| :=2R G:x2ڐ /QPʚ >QSSSSG:[ :F | xF  2>2:> 2͋ $ D !w++>Q~S# >QP            !͋ h 6#6# xh 2~͋ ʄ !Vw#/ Ž <Œ <… !~G:2/2R?o&^#Vr+s:~ :>2~ >2~///= :' a{    |}o&PX O |L >0_ |  Y% Discus M26 and M10 Hard Disk Format Program Rev. 2.2$ Enter Physical Drive Number to be Tested or Formated (1 - 4, RETURN to exit): $ Enter Logical Drive Number to be Formated (1 - 3, RETURN to exit): $ Enter Amount of Formatting Desired: H = Format Headers Only (Data Remains Intact). D = Erase Data Field Also. Function: $ Drive is not ready.$ Controller n!9 !9~w#~w#~w#~w+MD!9 _ # { !94 ! 9~^ +w>#w! 9N#Fxr O>G ҂ O>G! 9q#p ! 9~ +w>#w! 9N#Fx O>G O>G! 9q#p ! 9N#F ! 9q#p ! 9N#F ! 9q#p !9~ /<= O!9~#fo) %  !9~= /< O!9~#fo||g}o I  !9~h /< O!9~#fo|g}o t MD!9q#p !! 9~+ ~Ҫ ! 9N#F ! 9~w#~w! 9~w+~wÑ !9q#p !9!9N#F###q#p+++q!9N#F#q#pCan't read drive Drive can't step Drive not ready Checking drive Micronix loader for the HDCA !J S!: S2 >}2 ! ># !!R!!P!PyOGy x !!P!!P!!P!y !"  ! ~#+ !) S : 2 : 2 Ä !Py| !!!2 >}2 ! >#+ !Py“ : 2 : 2 O ! ~#œ ! S !" O 22! "!:: !!Zy  ! S *}o|g"é h  7  of bad map is: ')('+',16X,'Track number of first alternate sector is: ')('+',16X,'Head number of first alternate sector is: ')('+',16X,'Sector number of first alternate sector is: ')('+',16X,'Track number of second alternate sector is: ')('+',16X,'Head number of second alternate sector is: ')('+',16X,'Sector number of second alternate sector is: ')('+',11X,'The bad map has the following parameters: ')('+',16X,9(I3,', '),' O.K. (y=yes) ')('+',16X,'1 - 128')(' ',16X,'2 - 256')(' ',16X,'3 - 512')(' ',16X,'4 - 1024')(' ',16X,'5 - 2048')(' ',11X,'Please select one of the above ')(I5)(' ',6X,'Enter the number of trials: ')(' ',6X,'Type Y to start test')"!,jbTj!,jbTj!"*+++}=2µ!,jb!(>aTj!,gb!(>bTj:Y2:y!/2!,jbTj;!,jbTj]!,jbTj|!,jbTj!,jbTj!,jbTj !,jbTjF !,gb!(>bTj:=Ɓ2:=?!/2 :/2!,jbTjF !,gb*!ͭa"*!(>aTj!,jbTjF !,gb*! !k!* N#Fy*  Files: !/ S!"!::t *N#Fkyw *##~.ˆ w *}o|g"H :2*~#fo"/*##S!- Sw File not found File to boot: No bootable files : ! S: */k ! S^!"!::O! *##yZ*N#FkyZ ! S *}o|g" !~#!/!~#fo !X ##y!~#fo }og)))))/ "*~#foo|pg}|  !~#fo!~#fo  !~w#~w!~w#~w!~#fo~ !My4!HyOG XXX   ! "21y21*2 }o|g>>ړ:1 ʓ:1 £!SS*26 :1¿! :2¹:3g:1!USa!ZS:222:323g:1:1:1OG!*2*2#"2:1wgg+Ý8!y"=>2=!~#fo#2@2@:=2('0Drive',I2)mÜx!E͐ !"=*=}=2G!"?*?}=2G*?)"H*=! ͭa*H"J!*Js#r*?#"?×*=#"=y!"*+++}=2G!C!og"A*#"Q!"**E{ozg}=2G!"*+++}=2G9!Aa!Lp!Aa!Pp!Gog>og{ozg}/2G/Z!jb!>aTjC!og>og{ozg}/2G !͚ og>og{ozg}/2G !͒+/2G !UL!gT*#"N͈Q!"=*=}=2G*=! ͭa"H"J*H~#fo*Js#r*H"T*H~#fo*Ts#r*H"V!*Vs#r*H"X!*Xs#r*=#"=B*#"*i` 22 8 +A 0yµ.Ý8*= ~D.*= !ͭa"*!(>aTj#!,jbTjF !,gb*!ͭa"*!(>aTja!,jbTjF !,gb*!ͭa"*!(>aTj!,jbTjF !,gb*!ͭa"*!(>aTj!,jbTjF !,gb*!ͭa"*!(>aTj !,jbTjF !,gb*!ͭa"*!(>aTjB!,jbTju!,jb!"*)"*!ͭa*"*!(>a*#>>:Tj!,gb!(>bTj:Y2:y!/2¯ !,jbTjF !,gb*!ͭaI"*!(>aTj!,jbTjF !,gb*!ͭaK"*!(>aTj!,jbTjF !,gb*!ͭaM"*!(>aTj !,jbTjF !,gb*!ͭaO"*!(>aTjI !,jbTjF !,gb*!ͭaQ"*!(>aTj !,jbTjF !,gb*!ͭaS"*!(>aTj !,jbTj!"F !,gb*)"*!ͭa*O"*!(>aTj*)"*!ͭa*O~#fo#}2 !,jbTjF !,gb*)"*!ͭa*Q"*!(>aTj& !,jbTjF !,gb*)"*!ͭa*S"*!(>aTj#*)"*!ͭa*"Q x.*= 6Ý8*=!~*=#w#w#w#w*= !~#~*==}o|g!,6MDÝ8͖8!~#fo#~2=#~2=#~2=#~2=!~#fo "=*=! !=!q7##~*=" !(' HDC/DMA Controller Production Test (14_Feb_83)')(' ')('+',6X,'Is drive',I2,' to be tested? (y=yes) ')(A1)('+',16X,'1 - m5s Seagate ST506')(' ',16X,'2 - m10s Seagate ST412')(' ',16X,'3 - m16c CMI CM5619')(' ',16X,'4 - m32q CMI CM5640')(' ',16X,'5 - m34q Quantum Q2040')(' ',16X,'6 - Not listed')(' ',16X,'The number of cylinders is: ')('+',16X,'The number of heads is: ')('+',16X,'Write pre-compenstating should start on cylinder: ')('+',16X,'Low current should start on cylinder: ')('+',16X,'The normal step rate (100us increments) is: ')('+',16X,'The recalibration step rate (100us increments) is: ')('+',16X,'The head settle time (100us increments) is: ')('+',11X,'The drive has the following parameters:')(' ',16X,7(I3,', '),' O.K. (y=yes) ')('+',16X,'Track number of bad map is: ')('+',16X,'Head number of bad map is: ')('+',16X,'Sector number"!*s#r*S"!*s#r!")"*!ͭa*O"!*s#r_ !,jbTj !,jb!"*)"*!ͭa*G"*!(>a*#> >eTj!,gb!(>bTj:Y2:y!/2¬è!"*}=2A*)"*!ͭa*":og!ͭa*~#fo*s#r*#"!"*}=2¨*)"*!ͭa*G":og!ͭa*_~#fo*s#r*#"G !,jbTj !,jbTj !,jbTj !,jbTj !,jbTj !,jbTjF !,gb!(>bTj:=Ɓ2:=?!/2¨!"*}=2*)"*!ͭa*":og!ͭa*~#fo*s#r*#",ë*!ͭa"!*s#r*#"ñ J !,jbTjF !,gb*!(>aTj6[q !,jbTj!,gb!(>bTj:Y2:y!/2i` >@>@>@>@>@(' ',11X,'Drive not ready: status (in hex) = ')(' ',11X,'Failed to find track 0: status (in hex) = ')"9";*9~#fo!ͭa~#fo}2:2*t"H:,ʶF!}F"f2!6(eA>=ͮh!b6 !b6yAT:+!WG1GRG:+@G@G͂6WG:+@OC͝WG>}G!h" V*T*"]:2e:2 :2*"t+^ *"*; ]G!h""*#">G :+==G:CG>G>}G>G>G>G>$H>GG:%4H:%4H!j4x#H~#HH]lPͤ]o4HG:%4HxO4HG*#"9XxG9X BH*****>[H>!g~#*r+sxG$H$HIllegal Statement NumbeStatement Unrecognizable or MisspelleIllegal Statement CompletioIllegal DO NestinIllegal Data ConstanMissing NamIllegal Procedure NamInvalid DATA Constant or Repeat FactoIncorrect Number of DATA ConstantIncorrect Integer ConstanInvalid Statement NumbeNot a Variable NamIllegal Logical Form OperatoData Pool Overflow; Out of MemorLiteral String is too largInvalid Data List Element in I/Unbalanced DO NesIdenti^`^`\h^`\h(' Beginning: Seek Test')"X !!jbTj!"^!"`*X~#fo!ͭa"j ~#fo"h*j ~#fo+"\*\}2l !!\!hͪ\m \RR:*RZQ͖Pͤ]͜T͋hR]:S!NToͅhSSZQ͖P*]~P]͋hS]:kS!aToͅhkSeSZQ͖P:eeSͤ]*]:%YS PeS: P0P͋h1S>2*|ʉS]>%ͦ]9P!nTo*|ʢS]>?ͦ]9P!To2* ͱW:fS:cS*hTͱWͱW*Y|9XS Program Unit Length Bytes Data Area Length Bytes Subroutines Referenced: Variables: COMMON Length Labels: Warning(s) Issued Fatal Error(s) Detected :e=*]0P<2**tT͖PT>+ͦ]O"*#|+* ; ~2G~2+~O2 ~82~2e+V+^"]+V+^+"tA !w+Uy=U*]" +~20+V+^"]l+h&l+h&(' Beginning: Data Test')"`&y+! -jbTj!"h&*h&++}/2n+-*`&~#fo!ͭa~#fo+"d&*d&}2n+D,*`&~#fo!ͭa~#fo+"l+*l+}2n+:,o+d&*`&1-/2n+0,2X&*l++"l+,*d&+"d&+*`&~#fo!ͭa"s+*s+!j&;*`&~#fo!ͭa~#fo"j+*j+}=/2n+,*j+)h&~#fo"d&*`&~#fo!ͭa~#fo+"l+*l+}2n+,u+d&*`&./2n+,2X&*l++"l+ú,*j++"j+|,*h&#/2D21!">!"@E*;*9K\*;~#fo}/2DO!ͭ21*;~#fo|g}o}2D!ͭ21y!jbTj*;͗\:1*9~#fo!ͭa"I"K*I"M*I"O*I"Q*I"S*K"Y*M"[*O"]*Q"_*S"aU*;*9[*;~#fo}2D#!ͭ21c*;*9s\*;~#fo}2DX!ͭ21g*;*9K\*;~#fo}/2DŠ!ͭ21*;~#fo|g}o}2D!ͭ21!jbTj*;͗\:1*;~#fo|g}o}2D !ͭ21y!jbTj*;͗\:1*9~#fo!ͭa"I"K*I"M*I"O*I"Q*I"S*K"o*M"q*O"s*Q"u*S"wk*;*9[*;~#fo}2DŸ!ͭ21>21 "*~#fo!ͭa"*ͪ\*~#fo!ͭa"~#fo"*~#fo+"*}2§*~#fo!ͭa~#fo+"*}2!"**{ozg}/2“* "2*#"]*+"E*+"""!"!|^!p*c_!͏`_"*+"*}=/2*X "/2l !2P*\+"\ *X~#fo!ͭa~#fo+++"\*\}2l ›!q \*XO$/2l k!2P*\##"\y \*XO$/2l !2P*\+++"\=!>2Pal Item in Type DeclaratioPremature End (' ',11X,'Write error on Head',I2,', Track',I3,', Sector',I3)"!"!>!!q#!#ͭog"!*!"!*!"!*!"!!!*!̈́[*!}/2!f">2!*!DM*!*!͸Jog>og{ozg}/2!">2!*!}2!*!}!!/2!"!*!/2!"2!#!#ͭog>og{ozg}/2!*"!!#jb*!"!*!"!!*!!#>aTj*!DM*!*!J2!!!#ͭog>og{ozg}!!/2!‚#2!Ç#>2!:!  ty List for Unformatted WRITNon-Integer Expressio(' ',11X,'Verify error on Head',I2,', Track',I3,', Sector',I3)(' ',11X,'Read error on Head',I2,', Track',I3,', Sector',I3)"#"#>!#qG&!C&ͭog"#*#"#*#"#*#"###*#S[*#}/2#$#*#*#\:#/2#$>2#!"#*#DM*#*#͸Jog>og{ozg}/2#%>2"h&ç+>2X&!c͞%*::+V͂6"-"-"->!-q*-DM*-*-."&-*-~#fo!ͭa"*-&-**-ͪ\*-~#fo!ͭa~#fo"(-!""-*"-*(-{ozg}/2,--*-"----*-*- "/2,--2-*"-#""-Ï->2-ɜg-XA>WyW>WC?H---"-"->!-q*-DM*-*-."-*-~#fo!ͭa"-~#fo"-*-~#fo"-!"-*-*-{ozg}/2-£.*-"..*-*-O$/2-™.2-*-#"-Y.>2-##reÇX *ue_m_m_m_m_m_m_m_m".".`i".*.~#fo|g}o*.~#fo*.~#fo|g}o}2.og).~#fo".!Xx2cͱWTO* *; * "" ͨqO!cy:W! D !͞w#EYͨr> iY; ʃY+; Y 2bE: TÚY*:02>2Z!""+"5*! s#r!p s#r!k s#r͞%: =Z:C%Z*!p s#r͋%*! s#r:+Z-3Z2s,*+!k s#ry!EZͧhY\:CTjUګ[*"!"*!k N#F͘W*"!p N#F͘Ws#r! ^#V*; Z#"7*5! ^#V"5>2C͑\#|Z+"7<*)++*~#fo*{ozg}/22<*+"*}/2o*)++*"**s#r*#"**~#fo{ozg}=/2B:e‡C*#"i>!nH>""*~#fo}/2!"2E*~#fo}/2_*! ͭa""~#fo#*s#r* "* ~#fo#*s#r*#"}2X>2\2E*~#fo}/2*! ͭa" "~#fo#*s#r* "* ~#fo#*s#r* ~#fo}2>22E*! ͭa" "~#fo#*s#r* "* ~#fo#*s#r* ~#fo}2E>2*ͻX:E**; ҾE>>G:L$H>ͩ?E>G*i ͚X2L^7:f*!MF!$$">22 2Z>2e*"]+^>ͩ?!c>2 2Z>ͩ?*d|T:%DF:*"]+^T:c\FͨeFTü%:SuF*h"yA>G*:eʑFʑFͨ}>2 +^>͗^*"]!e6+^:!l"fͥ*"*]"*e": #*#}2#*#}!#/2#J%#*#/2#J%2#G&!K&ͭog>og{ozg}/2#n$:#og>og{ozg}/2#%#!O&jb*#"#*#"##*#!?&>aTj%$!O&jb*#"#*#"##*#!?&>aTj*#DM*#*#J2##!S&ͭog>og{ozg}!#/2#6&2#;&>2#:#  'ͦ]*O>"&PtP>N#F# UP<33JPO=hPhPyCP7yOBPO> ͦ]>(ͦ]9P>)æ]ͤ]:*P**]*TIQ*]d|>+P>-ͦ]WOT: >/̦]=Q>[ͦ]:O/_!Q~O> ͦ]# P~O>]ͦ]9Q!~:6Q#~ͦ]+~ͦ]:G+~O+QIQ>/̦]>L̦]:O!~ͦ]+ PQ:XH]pQͤ]ZQ0jQ *ͱW*!h; ʑQͨ:fʧQ*|lRͨlR*d|¶Q:Q:cQeFQXE͝2ͅhlR R=&R:*]| :QͱW:% R]lPͤ]*:X>2go"]+^͋hQ=MR<2:e8!:Gw#@Rͨ:e*]|:hRñW]!So*~P!To*~P!ToͅhڷR±R:eʱR*]|ʱRZQ͖PR͋hғR]!>To2ͅhR>2C͑\y!Z!h N#F*͘W"dZT*|[:e:[*#"7*5#|'[*"5/[>2C͑\T2ZÌ[*"**]">*2>2>2 :e*tZ2e=r[*"t"]+^Z2Z*5#|ʦ[>2C*"7:2͑\*5"2C:0[*"5*t#"7>2C͑\*o#"7>2C͑\*l"7>2C͑\*5*"5*r#"7>2C͑\#|\+"7>2C͑\*m#"7>2C͑\*j"7>2C͑\*5*"5*p#"7>2C͑\"7>2C͑\T*#"7>2C͑\*k͘W#"7>2C͑\T[!"* *5; ڪ\ͼ\2*7; ͼ\2T=\:>ȯ:222s8>)ͮhT W!#6*[#"[!> 2 :]ͨ]^<] ] ] ]C]*[9Pͤ]C]^C]> 2w M] Ħ]z]#^<] Ħ]l]T] 6] 6] •]> w#xP„]6]w ]\2P> :²]]:%]]:%<]#0:X> ͦ]> æ]#>O6]> à]!X ^4~]5> 4ë1 ^6] ]]:z'^)4i42z92!N:*w:eG:! +w+*]r+s+*tr+s+w+ d^:|^<|^>2: * r+s*]++r+sGo*f; x^!N~¸^4E͞X*"z!xw ^5A*fͨ*"dA#9TSX:f2*"]!e6+^ g2#9:"9g*g|9gA"]22go"gSX22"!":Ugͨdg2sg:22!"fgTETNTDT/> ͗^vQ\:2T)g(g,g/d=“gdͻ\:, ͥ:=g: }F> ͗^:2\ TdØgdͻ:<h͞G:Ihxh>2s:C>*ʘgg>2S>:Nj`>2b2cͥNh2 >2e+^*"hͭXͱWX:Sh!~6 2 *T*:/O "* ; ?T>,îh>(!ͨ~ͨ:o&: jU:0/!j^#V#<- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #f; ~!bj`*d|_:x _:"_:_ͨ7*f; ,_:",_*f!"fA"fͳGTH:xڥ_:bҚ_ͅhW_Q_*]ͱW͋h?_ͅh}_w_w_**t; _ ͋hZ_NA*h|ʚ_:Sš_T>2 +^:x²_YH*zT:x2b*g|ʥ_:"¥_A*g"]2go"gSXå_:ew_*"!"2**]d| ` `"ͻhd:+`*d|3`3`>2"Ϳ_**"*">2e*]*d"]+^ͿL`w_ͨ> xd22*"*++++~_!N* "*; `*++++"͂d_*"x z`„`*"**; „`*"c:C!a Ca:2 aSdc(dc:CCa:1Ca d21:CCa*####>w*5|a55c**; ʩ`:Cbcfa c:C=ibڛbaʦb=aaʬb:1ʛa:C_!~2C:1!22C:1a!C>w=a* *5; a21æb!1:2waSda*7* db~ bb!O =COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#  ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_F~waSd:2:1 d*5"7>2C21a*####~wa:C2z*"x2|:=6c:vc:1(d@dd!|4*####"*++++; \cc:C!zc*x":|occfa2|Oc* *5*7; ډc>6c; 6c&c͂dx2Cy2*~212##^#V* "5; T=:<2*####"͖c"*5"7:2:122:2Öc*5"7> 2Cc*5*##s#rc*####~wd*5*#####:w#s#r*7":2:221*5*7"5"7!Fwp!FwpG*>রw*>G#N!X~**ʹd*ͳd*ͳd*ͳd*s#r#*v*t; *"vTͱWT*:1G:Cw#:w*s#r}o|g\>*| ʴf".*",!*/~ +e`e# eN#~#^#V"f Ye!* T<=ne#He͗^*f*; eͨe x>~e2*""ñW"`"\* "^öe*\*^* d++++*#; e++~´e+~µe###* d"^ѯ*` Y*#s#r"**d; A: fͨf*d|ʴf*"h; ڴf V*d*; PfDM'f:[fͨA:"ʆf*g|ʆf"]22go"gSX22"x“f͚6!f`i"͔dͨg!9*; ͨ!"d! 6JggR%:ez8O!B N#N ¾SP.* |} !9":q!"28!"9:] !í 1 )*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ !BADMAP SAV:Y2CGEGGG(' ',6X,'Bad Map Open ERROR')(' ',11X,'Cannot read the Bad Map from the disk')(' ',11X,'Bad Map has overflowed')"4G*4G~#fo"#/!ͭa~#fo}/2MGG2,G*#/!ͭa"NG~#fo"%/*NG~#fo!aa"'/*#/!ͭa"PGI~#fo"CG*PGK~#fo"EG*PGM~#fo"GGRGAG!#/S[*AG}2MG¢HYG!IjbTjvG!IjbTj!AGͻX2,G*#/0 }2bTj!i!"IG*IG}=2MGI*IG"NG*/"PbTj2!"Q*Q+++}=2Q`Q*Q!ͭa~#fo}2QVQ!Q͡R*Q#"QQɷ('0Error Report on trial:',I7)(' ')eQ!Qjb!Q>aTj!"bQ*bQ+++}=2dQQ*bQ!ͭa~#fo}2dQQ!bQgT*bQ#"bQåQQ!QjbTj~#fo('0Drive',I2,' has the following characteristics')(' ',6X,I4,' tracks')(' ',6X,I4,' heads')(' ',6X,I4,' bytes per track')(' ',6X,I4,' sectors per track')"RR!uSjb*R!qS>aTj:R!uSjb*R~#fo!ͭa"R*R!qS>aTjOR!uSjb*R~#fo!ͭa"R*R!qS>aTjcR!uSjb*R~#fo!ͭa"R*R!qS>aTjR!uSjb*R~#fo!ͭa"R*R!qS>aTj2l 2P*(' ',6X,'Drive',I2,' PASSED')(' ',6X,'Drive',I2,' WARINING')(' ',6X,'Drive',I2,' FAILED')(' ',11X,'Soft Errors:',I7,' This pass',I7,' Last pass',I7,' Total')(' ',11X,'Hard Errors:',I7,' This pass',I7,' Last pass',I7,' Total')"zS*zS~#fo! ͭa"|S "~S*|S ~#fo}2S*~S~#fo}!S/2STS!gVjb*zS!cV>aTjbV*zS~#fo! ͭa"|S "~S*|S ~#fo}2S*G*NG*?~*PGw*IG#"IGH!")/*)/*'/{ozg}=2MG’I*)/)"NG)/~#fo"CG*NG+/~#fo"KG}2MG*CG}!MG/2XG…I>2,G*)/")/IYG!IjbTjG!IjbTj2,G*s#r*S"!*s#r(' ',11X,'The bad map has been filled')"I"I`i"I*IDM*I*I͸J/2I•J*)/*'/{ozg}=/2I[JI!JjbTj2I*)/)"I)/"I*I~#fo*Is#r*I+/"I*I*Is#r*)/")/>2I}=2*)""J"J`i"J*%/*J~#foͭa#*J~#fo"I!"J*J*)/{ozg}/2JqK*J)"J)/~#fo"J*J+/~#fo"J*I{ozg}2J*J*J~#fo{ozg}!J/2JdK>2J*J"JJ2J!!yK{K}K(' ',6X,'Bad Map Close ERROR')(' ',11X,'All of the alternate sectors have been used')(' ',11X,'The bad map sector is in the bad sector list')(' ',11X,'Unable to write the bad map back onto disk')*)/+}=/2K N*#/!ͭa"KO~#fo"yK*KQ~#fo"{K*KS~#fo"}K!"K!"K*K*)/{ozg}/2K N*K)"K-/"K*yK*Ks#r*%/*{Kͭa#*}K"K*K//"K*K~S~#fo}!S/2S’US!gVjb*zS!cV>aTjS!gVjb*zS~#fo! ͭa"|S"~S*~S!cV>a*|S"S*S!cV>a*|S "S*S!cV>aTjbVS!gVjb*zS!cV>aTjS!gVjb*zS~#fo! ͭa"|S"~S*~S!cV>a*|S"S*S!cV>a*|S "S*S!cV>aTj#T!gVjb*zS~#fo! ͭa"|S "~S*~S!cV>a*|S"S*S!cV>a*|S "S*S!cV>aTj(' ',14X,' Normal completion - no errors')(' ',14X,' Controller failed to respond before time out occured')(' ',14X,' Drive not ready')(' ',14X,' Sector header not found')(' ',14X,' Data not found (no data preamble')(' ',14X,' Data overrun (chanel error)')(' ',14X,' Data CRC error')(' ',14X,' Write fault')(' ',14X,' Sector header CRC error')(' ',14X,' Illegal command')(' ',6X,'Recalibration Error (after Sense Status Command)')(' ',6X,'Recalibration Error (after Load Constants Command)')(' ',6X,'Recalibration Error (cannot locate track 0)')(' ',14X,' Unrecognizable error code =',I5)"lV*lV~#fo|g}o*lVs#r}/2nVX-[*lV~#fo}*Ks#r*}K#"}K*%/{ozg}=/2KM*{K#"{K*#/!ͭa"K*{K*K~#fo{ozg}2KM*K###"K)"K*#/!ͭa*KO~#fo#}/2K´MK!NjbTjK!NjbTjsO*K)"K*#/!ͭa*K"KO~#fo"yK*KQ~#fo"{K*KS~#fo"}KM!"}K*K"KëL!"K*K}=2KKN*K"K*?"K*K*/~*Kw*K#"KN*#/!ͭa"KI~#fo"yK*KK~#fo"{K*KM~#fo"}K}KyK!{K͸J!`/2K´NK!NjbTjK!NjbTjKwK!#/̈́[*wK}2KNK!NjbTjL!NjbTj!wKͻXsO21!NO(' ',11X,'The Bad Map contains',I4,' bad sector(s)')(' ',15X,'Head',I5,', Track',I5,', Sector',I5)*)/!aa"O}=/2 O\PO!aPjbO!]P>aTj!"O*O*)/{ozg}=2 O\P*O))/~#fo"N*O#"O))/~#fo"O*O###"O*O}2 O*N}! O/2 O"P\P*O+" O*%/aa"O%/! O|_"OEO!aPjb OO!]P>aTjïO('0Error Report on trial:',I7)(' ')iP! Qjb!Q>aTj!"fP*fP+++}=2hPP*fP!ͭa~#fo}2hPP!fP͡R!fPgT*fP#"fPéPP! Qj /2nVYoV!2[jbTj-[*lV~#fo}/2nV?YV!2[jbTj-[*lV~#fo+}/2nVgYV!2[jbTj-[*lV~#fo}/2nV’YV!2[jbTj-[*lV~#fo}/2nV½YW!2[jbTj-[*lV~#fo}/2nVYGW!2[jbTj-[*lV~#fo}/2nVZoW!2[jbTj-[*lV~#fo}/2nV>ZW!2[jbTj-[*lV~#fo}/2nViZW!2[jbTj-[*lV~#fo`}/2nV”ZW!2[jbTj-[*lV~#foO}/2nV¿ZW!2[jbTj-[*lV~#foN}/2nVZX!2[jbTj-[*lV~#foM}/2nV[ZX!2[jbTj-[X!2[jb*lV!.[>aTj!K^"P>2R!"m^TzL[>]&]!+?"O^*_^~2R^#~2S^*a^~2T^*c^~2U^>2V^͏]>]&]!+?"O^*_^~2R^#~2S^*a^~2T^*c^~2U^>2V^͏]>]&]!+?"O^>2V^͏]>]&]!+?"O^*c^~2R^*e^~2S^*g^~2T^*i^~2U^>2V^͏]> ]!"m^*i^~2o^#~2p^*k^~2q^#~2r^&]*c^~2S^*e^~2T^*g^~2U^>2V^:N^02N^͏]>]&]!"L^>2V^͏]>]&]>2V^͏]>]!"m^&]>2V^͏]>]*[^~^>]*[^#~^+~^>]*[^N#F8*]^^#V!+?{w#zw# x\>]*[^N#F8*]^^#V!+?{\#z\# x\*_^6*x2zxd:Lze2z͎j:Lz1e0j!z5Be<e:zBeBeij2eE:zMeDj:z!Lz2zbe+ie-/<2zj:z_! mq{0Gj}0Gj:3zghn:zG!z:Lzwexd2z:z2z:ze2z!zw͎j:z/e*1z"/z!"1zij!z4e*/z"1zije:3zghn:zd!z/2-z j@f*+z*!zDM*Jzf+|Uf"Jz"+zNm*+z*!zFj*+z#"+z*Jz+"Jz|#yfNm*yDM!-z5ʽf*y+}|f*y ~2Qz`i"y>óf> óf͖ff !-z4f: zI+g:3z=f==f=ff:zfw!9zgwg#g:Mz=n:3z%gͰo͍o=n>2y:3z22Mz2z! mq}0o!z4{;h!y:zG2z2z21zs#_h!y"z͎jV+^7h͎iÅhf …h>00ږh:Җh02Qz>ɯ2z2z2z͎i-´h>2Mzùh+¼h͎i=n*y+"y!-z4Ui:Qz.h>2z2zUi:QzfEhDh͎i+i-p-q%qq-q"Yz`i"[z*Yz*[zDM^#V#N#F#xyÈq ҇q7>{_zW}o|g=~q|g}oڰqCZQãq o-yOzW{_xGóq`iN#F#q#p#=q2y"Bz"Dz`i"y2y:yr!Bz_r:y*yr_~#fo:y<2yW:y,r~#fo"}K!"}K*K"K!"K*K}=2K*zFORTDAT;utttrtw|twww!.r:Sz_~ͬr:Sz_!Ar^#V!8r:Sz_~!Ur:Sz_^#Vr!!*'zr! p# rw#r:Sz ҋr͓rs@trz)s^#V͓rwAs͓ru͓rwrs#r#6:x{zG{Or! ~ʔs! 6*nr͓r {s! p<’sht! q*nr!9}|ڏr!Ar:SzO s#r!rr+s!$"nr6#prrsy0wx0#w> #w#trr>w:Sz t s Gͻrr*xt|t}t"lr"xr͟ry Ot*'z|CtOtht7<ʇr͓r@|t͓rO@ztyur͟r͓r6!.r~{2Sz|t:p t0r*y*y&tw#t#v7r*y>2yv? _^6"[^"]^]`i"_^==!_^q*[^~2K^2N^*a^~W:N^2N^*_^^#V*m^"s^7?R0 !K^*s^7?R"L^*s^"m^*o^7?R8!N^*s^*q^7?R0!N^>2W^U:W^]z]]Қ]:W^]z]]î]UL*]^w>#w ^ r]*7^e^͈Q^f^Q^p^͌P7?-^-^0:8^<^_@K^Jq!{^^!u^q!{^Ȇw!^O ͏`:z^<2z^! _O ͨ_!Yz^#V#N#F#{YOO6+F6!y^4~֫^w Ϳo!u^pw+w+wù^5Jʙ9v" GSљ e͘w>hFhiuh!Yzq>X_0_w-qm_qT_!]z6ag>͡q|Ԗa!>*_ak~#foAaq_a_4qpz||aaa!\z~+>w4qSaë_%q4q:\z qҾ_/<ͤa4qag͡q!Yz_~_#~W#~O}p#4lp.ͷq}pG~_#~W#~OܐaÿoSa `%q4q>Oî_G`> 2gz!PA"hz!US"jz!E "lzX`*iy6 ̀y*iy6 Txnz~#N`!gz ~qy#]`G`> 2gz!ST"hz!OP"jz! "lzX`xSaÒ`%qq4q`y+F+F+Fw`h|`gy`:YzO|g}oxG-|·`}²`ÿoElaOñ`!\z~Gx`ƀʜpwaw+ɷ i>2y͎iy2z*y+"y!-z4uh>iOx 3iw> Gi:yxHi/<2zG!z~wf{h:25zfi=n!5z~i>T>Fw> #w#w#w>23z24zÄc> i> i>O}2SzO!p:Szww=_^#V ^#Vj'j*%z|3jw*#z|3jw*a!_z5zw#Bj!5z_z@j:Rz!ywk:=z>i!z5zj:/z*j!1z50j*zF#"zj!z~!Mz!z2/zʬjj2z/j:Mz-j!z5j.jijõjw j!/z5jìj*y*y{zj#"y*y+p!-z5kw:.z:JzNml!?z~4kw *1z"@z*Jz"FzNm!"-z*+z*!z:=zek~'Vkfw#Ck#~'Ik"+zNm~'|kGj*+z#"+z#ek*+z#"+z#~'kkNm:?z=k!Pz4!"+zl2?zNm*Fz+"Fz|Nm*@z"+z!?z4Nm!y6:=zk:zk*yzk*y6 "yo:y2y2y:=zl*z"yĒl!"yNm!Pz~lw+l*y+"y|+l:Pzk*Jz|Nm+"Jz:z2z2Mz2z2ygo"5z"7z"9z";z:z!-zw:=zol4*Hz:4zG:3z*y5z„l9z~#„l"ykl:zi*z"yɯ2ygo"5z*+z*!z~# ʱl-ly ñl"+z2QzG0l l*5zT])))_æl*5z|l#x:ymo>r2kr:y:yuw>́u*y~u#=u> u͓rw:kr7r2y2kŕu͑uvuu*y&*yw"y vu}Juw:kr?ɷ͓rʏuͻr6ͻr̬u5!Ar/Ɓ_#>W͟rv2kr>w7ͻrv4!Ar_#>W͓ru>uͻr6ͬro&v6# w~+v1> v> w~0> v w=#~v*y*yz~ w#v:yvʊv> w5w2yv:yv*zv> w> w*xv|w}w"zv"x_>2yvwIwxwFwFwDwDwDww2ỳy Mw*y&*yw"y }Mww:y*y=> qy~+ʯw1šw> qyïw> qy~ ʯw0¯w> qy#~#qy=ñw **** at address ** w!w&x~"~w>#O!Qx ~qy#~qy:x<2xx#x!w&x0x#xx!w~qy#&x|=x}=x> qyFxƐ':'qyIDF0MPIRFWITEXDOMLDZLGSQIBTLOBDEISBEINOVCNGLGSSNA2IODTBIRCEFFNDFUNOM??o2x2x!x"x*+ 2x!x!!""xx!x*x> qy> qyP *lV~#fo}/2nVlpÝpqx{q!]z6awg%az$a >͡q|ԏp{>2\zͿo/))a =»a![z~7w?##wy7O*Yz*[z"[z"Yz!b!b!b!b!"3zqq~#fo"zq"y*z"y:Rz?bc%b+l%b>2=z2>z<2zÀb>2=zob2=z2=z2>z2z~#fo"Sz!gz"y~#+Žb!"!z!9##"a:>z²bgo"#z"%z")z"'zb!#z>q*#z~#bgo"#z*%z~#bgo"%z*'z~#fo"'z*)z~#fob")z2?z2Pz2Rz2Lz2.z2zgo"+z"yͧp*!z|&c͠l*+z"@z(kw2y2y2y2y<2Rz:=z>iTo͖fWc Pc> 9mwCc:z/9m=ªc:5zGj9mñc!5z_zw# c:=zc*yDM*y"Xz*y *yd`i"y"y*yDM*z"Xz*y*y d`i"yc:4z*Xz+}|_d:=zHd*Xz"y>i*yd>i*y"Xz*ydw#=d*y+"y|d<ڀd>G!y60#`o!z4:2z:3zghn:zG:Lzeg"5z|x!oqfkcgideed:4zG*y5z:3zRn9zw#Rn"y*Jz|Nml!2Mz>wènͰo:8zn͍o>2Mz7Dqo!y~wnn`oìnn!Uz5z@j`oҬn!5zUz@j!z4/G m!5z~#n¨n¨n2y!5zw#o!z4>i*Jz*y"y*zDMyxNmw *y"yNm j*Jz+"Jz|?oNm:4zG:z2z!y>w!z5 m:j mþc!5z~/G#~/‰o wqy:xykyyy:xynyy_y!~#fo!~#fo > !~w#~w!~w#~w !~#fo~! !MyT !HyOG XXX  !~ "Q y2*~ }o|g>>ڳ : ʳ : !s _*6: !~ : : Ç : !u _Á !z _:2:2Ç : : :OG-**#":wÇ 2GQD1Drive not ready Micronix loader for the HD-DMA !_>P2] 2^ *] I ywx#w*] ##w#w!!T!I "V >2X !? "Y 2J 2K *Y ####~2Q *Y  ~2R >2S :L 02L !;>2I >2L !;:U OGy! _!"J :I 2I !;2[ 2\ Read error retry Block out of range *Y  !  #J!_*Y  ~#fo"i !N#F*i S"g *Y ###~2k 2l *Y ~#fo"e !N#F*i "_ *g *k "a *g *k S"c *_ *e |g}o "_ !e :_ :` #!e :_ 2_ :` #2` >2I !_ :[ :\ #*_ ![ yOx#Gi`"J 0*[ !_ yOx#Gi`"J :I 2I *_ "[ *a }/o|/g}og))}2L !~#fo"M *_ "P :a 2R :c 2S > 2m 2n !m ~#ʎ!;yʜ!_2J 2K !_:m 2m :n 2n r!~2T >2U !!U:U :U OGyxEntering Loading !o *y  N#F#y2!o "o !*o N#F#yP:OGy_x†*"w * "q **  "u æ2w >2x 2q >2r *y  ~#fo"u *u  ! ͭ#"s ! _!o "o !s ~#*q *o N#F#y  !!A!_>O>8J>J>8J>?L>M> M1 >M'J> L. >O*w :s 2s :t 2t *o ##"o :r 2r !!O!My =!N#F!H!~#fo~ʈ!~#fo~ ‹! -Ë!~#fo~OG-!~w#~wb!~ #~!N#F! ͭ!N#F! S0 -!9!9~s/O#~r/Gx@#^#V!>!=5))), 33=!!9s#r!9^#V!9~s/O#~r/Gxʚ#^#V!>{=ʎ))҃, v33={!9s#r!9^#V!9~s#r#^#VOzW{_ r+s)<&!!9OG&}!!9:#W!͋!o *y  N#F#yJ Files: !O_!o "{ !o :{ :| Ҕ*{ N#F͋yʗ*{ ##~.¨×*{ }o|g"{ h:} 2} *{ ~#fo"*{ ##_!M_×File not found File to boot: No bootable files :} !_:} )*͋!_~ !o "{ !o :{ :| o!~ *{ ## yz*{ N#F͋yz!_)*{ }o|g"{ :!~#! !~#fo !ͭ###y!~#fo }og))))) "y *y ~#foo|pg}| 1Drive not ready Micronix loader for the HD-DMA ͗!_>P2 2 *  ywx#w* ##w#w!!T! " >2 ! " 2 2 * ####~2 *  ~2 >2 : 02 !;>2 >2 !;: OGy! _!" : 2 !;2 2 ÞRead error retry Block out of range ͗*  !  #J!_Þ*  ~#fo"$ !N#F*$ "" * ###~2& 2' * ~#fo" !N#F*$ " *" *& " *" *& " * * |g}o " ! : : #! : 2 : #2 >2 ! : : #* ! yOx#Gi`" 0* ! yOx#Gi`" : 2 * " * }/o|/g}og))}2 !~#fo" * " : 2 : 2 > 2( 2) !( ~#ʎ!;yʜÞ!_Þ2 2 !_:( 2( :) 2) r͗!~2 >2 !!U: : OGyxÞÞEntering Loading ͗!* *4  N#F#y2!* "* !M** N#F#yP:MOGy_x†*Y"2 *Y ", *Q*S  "0 æ22 >23 2, >2- *4  ~#fo"0 *0  ! d#". ! _!* "* !. ~#*, ** N#F#y  !!A!_"&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2"+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ - ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq:f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q*r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q*!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q**2 ͝Þ:. 2. :/ 2/ ** ##"* :- 2- ͗!!O!My =!N#F!HÞ͗!~#fo~ʈ!~#fo~ ‹! -ËÞ!~#fo~OG-!~w#~wb͗!~ #~!N#F! ͭ!N#F! 0 -Þ&!!9͝OG&}!!9͝!9~w#~w#~w#~w+MD!9 _ # { !94 ! 9~j+w>#w! 9N#Fx~O>GҎO>G! 9q#pú! 9~+w>#w! 9N#FxO>GO>G! 9q#pú! 9N#F! 9q#pú! 9N#F! 9q#pú!9~%/1m!f6 *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2dû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+":7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x !e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : =e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`:*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- : ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!* !9 *6 ##ͼ y5 *6 N#FF y5 Þ!_*6 }o|g"6 ͗!~#ʶ !H !~#fo !d###yʶ !~#fo }og)))))H "4 *4 ~#foo|pg}­ |¶ ÞÞ͗!~#fo!~#fo Þ!~w#~w!~w#~wÿ !~#fo~ Þ͗!My !HyOGÞ XXX  ͗!9 "K y2J*K9 }o|g>>n :J n :J ~ !. _*K6Þ:Jš !9 :K” :L­ B :J !0 _< !5 _:K2K:L2LB :J :J :JOG-*K*K#"K:JwB 2yf!!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t -? >!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :! (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F”͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:" 6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: ڦ> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O! N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{.*22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~ *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!"&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6 (INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.8$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 !7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"&*$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:! e2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! 6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq1Drive not ready Micronix loader for the HD-DMA ͏!W>P2 2 *  ywx#w* ##w#w!!T! " >2 ! " 2 2 * ####~2 *  ~2 >2 !Ͷ>2 >2 !Ͷ: OGy! W!" : 2 !Ͷ2 2 ÖRead error retry Block out of range ͏*  !  #B!WÖ*  ~#fo" !N#F* " * ###~2 2 * ~#fo" !N#F* " * * " * * " * * |g}o " ! : : #! : 2 : #2 >2 ! : : # * ! yOx#Gi`" (* ! yOx#Gi`" : 2 * " * }/o|/g}og))}2 !~#fo" * " : 2 : 2 > 2 2! ! ~#ʆ!ͶyʔÖ!WÖ2 2 !W: 2 :! 2! j͏!~2 >2 !!U: : OGyxÖÖEntering Loading ͏!" *,  N#Fy*!" "" !E*" N#FyH:EOGyWx~*Q"* *Q "$ *I*K  "( Þ2* >2+ 2$ >2% *,  ~#fo"( *(  ! \#"& !W!" "" !& ~#*$ *" N#Fy!!A!W** ͕221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>HHͯ :!^w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q**FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "PҘ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&og_{_z#W H = LIBX$$$$$$$LIB:& 2& :' 2' *" ##"" :% 2% ͏!!O!My 5!N#F!HÖ͏!~#fo~ʀ!~#fo~ ƒ! %ÃÖ!~#fo~OG%!~w#~wZ͏!~ #~!N#F! ͥ!N#F! 0 %Ö&!!9͕OG&}!!9͕!9~w#~w#~w#~w+MD!9 _ #{ !94! 9~b+w>#w! 9N#FxvO>G҆O>G! 9q#pò! 9~+w>#w! 9N#FxO>GO>G! 9q#pò! 9N#F! 9q#pò! 9N#F! 9q#pò!9~/ !" *,  N#FyÖ Files: ͏!W!" ". !" :. :/ G*. N#F> yJ*. ##~.[JÖ*. }o|g". :0 20 *. ~#fo"@*. ##W!WJFile not found File to boot: No bootable files ͏:0 !W:0 *@> Ö!W1 !" ". !" :. :/ " !1 *!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ 2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 * "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !q  *& !6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  ÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !r+s+p+q*~$7*>*>H&>*#"*#"> 2:^R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&63 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk Status : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(& :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!E ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::^Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ 2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*L!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\LR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"*M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz!b~26!~6<+wé>!`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨>!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐CCOPYRIGHT (C) 1978, DIGITAL RESEARCH   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP~# |o&)))))))a{__> ͞> Þͤ~͞#ó*`z:O!$'*!ͳ6|3 ^#V"`#2_+?~(?>2_>(2)>2(w ~#f>P2)>2(rzbzw>2)bzrͿ:_ʝ::2\ ! ">2!4:(BN>2:)!4!^!*FNyͅ*DM:ʼ!ͳ͐ͤ ʼ!6"@!":_?!">62)!:(=?bͿè1!Iͳ:] ʡ\ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V". ##ʹ y- *. N#F> y- Ö!W*. }o|g". ͏!~#ʮ !@ !~#fo !\##yʮ !~#fo }og)))))@ ", *, ~#foo|pg}¥ |® ÖÖ͏!~#fo!~#fo Ö!~w#~w!~w#~w÷ !~#fo~ Ö͏!My !HyOGÖ XXX  ͏!1 "C y2B*C1 }o|g>>f :B f :B v !& W*C6Ö:B’ !1 :CŒ :D¥ : :B !( W4 !- W:C2C:D2D: :B :B :BOG%*C*C#"C:Bw: (DreturnPermanent error, Type return to ignoreFunction completeInvalid drive (Use A through P)No such fileSource file incompleteCan not generate systems on 5 1/4 diskettes that are formatted in single density.o warm boot)Destination on 6, then type returnPermanent error, Type return to ignoreFunction completeInvalid drive (Use A through PNo such fileSourc?)*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*) w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W01^52c5>! 3~ͣ3#!0͵0ͱ001>&A.A"d5|ͣ3}ͣ3:c5> (<ͣ3!k1>11!k1>21!2>31:d5 ! 3>-1!Q2>41!j3>51>6ͣ322!1͘3͵0ͱ0͘3*d5,>[,0$*0!b1!\U!4~0( 2^5$$$$ |*0(4(Fx/w~(Aq~G g+Ý8!y"=>2=!~#fo#2@2@:=2('0Drive',I2)mÜx!E͐ !"=*=}=2G!"?*?}=2G*?)"H*=! ͭa*H"J!*Js#r*?#"?×*=#"=y!"*+++}=2G!C!og"A*#"Q!"**E{ozg}=2G!"*+++}=2G9!Aa!Lp!Aa!Pp!Gog>og{ozg}/2G/Z!jb!>aTjC!og>og{ozg}/2G !͚ og>og{ozg}/2G !͒+/2G !UL!gT*#"N͈Q!"=*=}=2G*=! ͭa"H"J*H~#fo*Js#r*H"T*H~#fo*Ts#r*H"V!*Vs#r*H"X!*Xs#r*=#"=B*#"*i` 22 8 +A 0yµ.Ý8*= ~D.*= ! qp-(Pݶw2^52c5ͣ3͵0ͱ0:^5͘3!H1͵0͘3! ͘32^5 ~>M(>?ͣ3|<> ͣ3T]v1͈1q,q,q,q,x1$~1,Š1$T1662* !"_5!2 2:_5 :`5N1O*_5#"_5zg.R++:)R+>0!u1͵0!"2͵0!1͵0ͱ0(1y/W~1+r:-~1,,~1-~1q,+2$"2L:d5_!yg͏2w͖2͏2w͟2 ͏21͖2͏21͟2 #{Ƈ_}W|g}o͖2+y=T3`i~, !3 z zWi1, !3 z i~, !3z zWi1, !3z @' RAMTST VERSION DD1 {S( !4_~V3S!Y3116~6FM3"a5v1!3͵0*a5͈1*:b5v1> ͣ3> ͣ3O6#"Q"H͝121 6?r@6?*Q~ :#"Q2!t6[6 J6 @ x.*= 6Ý8*=!~*=#w#w#w#w*= !~#~*==}o|g!,6MDÝ8͖8!~#fo#~2=#~2=#~2=#~2=!~#fo "=*=! !=!q7##~*=" !(' HDC/DMA Controller Production Test (14_Feb_83)')(' ')('+',6X,'Is drive',I2,' to be tested? (y=yes) ')(A1)('+',16X,'1 - m5s Seagate ST506')(' ',16X,'2 - m10s Seagate ST412')(' ',16X,'3 - m16c CMI CM5619')(' ',16X,'4 - m32q CMI CM5640')(' ',16X,'5 - m34q Quantum Q2040')(' ',16X,'6 - Not listed')(' ',16X,'The number of cylinders is: ')('+',16X,'The number of heads is: ')('+',16X,'Write pre-compenstating should start on cylinder: ')('+',16X,'Low current should start on cylinder: ')('+',16X,'The normal step rate (100us increments) is: ')('+',16X,'The recalibration step rate (100us increments) is: ')('+',16X,'The head settle time (100us increments) is: ')('+',11X,'The drive has the following parameters:')(' ',16X,7(I3,', '),' O.K. (y=yes) ')('+',16X,'Track number of bad map is: ')('+',16X,'Head number of bad map is: ')('+',16X,'Sector number>OM 6yH of bad map is: ')('+',16X,'Track number of first alternate sector is: ')('+',16X,'Head number of first alternate sector is: ')('+',16X,'Sector number of first alternate sector is: ')('+',16X,'Track number of second alternate sector is: ')('+',16X,'Head number of second alternate sector is: ')('+',16X,'Sector number of second alternate sector is: ')('+',11X,'The bad map has the following parameters: ')('+',16X,9(I3,', '),' O.K. (y=yes) ')('+',16X,'1 - 128')(' ',16X,'2 - 256')(' ',16X,'3 - 512')(' ',16X,'4 - 1024')(' ',16X,'5 - 2048')(' ',11X,'Please select one of the above ')(I5)(' ',6X,'Enter the number of trials: ')(' ',6X,'Type Y to start test')"!,jbTj!,jbTj!"*+++}=2µ!,jb!(>aTj!,gb!(>bTj:Y2:y!/2!,jbTj;!,jbTj]!,jbTj|!,jbTj!,jbTj!,jbTj !,jbTjF !,gb!(>bTj:=Ɓ2:=?!/2 :/2!,jbTjF !,gb*!ͭa"*!(>aTj!,jbTjF !,gb*!/2D21!">!"@E*;*9K\*;~#fo}/2DO!ͭ21*;~#fo|g}o}2D!ͭ21y!jbTj*;͗\:1*9~#fo!ͭa"I"K*I"M*I"O*I"Q*I"S*K"Y*M"[*O"]*Q"_*S"aU*;*9[*;~#fo}2D#!ͭ21c*;*9s\*;~#fo}2DX!ͭ21g*;*9K\*;~#fo}/2DŠ!ͭ21*;~#fo|g}o}2D!ͭ21!jbTj*;͗\:1*;~#fo|g}o}2D !ͭ21y!jbTj*;͗\:1*9~#fo!ͭa"I"K*I"M*I"O*I"Q*I"S*K"o*M"q*O"s*Q"u*S"wk*;*9[*;~#fo}2DŸ!ͭ21>21 "*~#fo!ͭa"*ͪ\*~#fo!ͭa"~#fo"*~#fo+"*}2§*~#fo!ͭa~#fo+"*}2!"**{ozg}/2“* "2*#"]*+"E*+"""!"!|^!p*c_!͏`_"*+"*}=/2*X "/2l !2P*\+"\ *X~#fo!ͭa~#fo+++"\*\}2l ›!q \*XO$/2l k!2P*\##"\y \*XO$/2l !2P*\+++"\=!>2Pal Item in Type DeclaratioPremature End (' ',11X,'Write error on Head',I2,', Track',I3,', Sector',I3)"!"!>!!q#!#ͭog"!*!"!*!"!*!"!!!*!̈́[*!}/2!f">2!*!DM*!*!͸Jog>og{ozg}/2!">2!*!}2!*!}!!/2!"!*!/2!"2!#!#ͭog>og{ozg}/2!*"!!#jb*!"!*!"!!*!!#>aTj*!DM*!*!J2!!!#ͭog>og{ozg}!!/2!‚#2!Ç#>2!:!  ty List for Unformatted WRITNon-Integer Expressio(' ',11X,'Verify error on Head',I2,', Track',I3,', Sector',I3)(' ',11X,'Read error on Head',I2,', Track',I3,', Sector',I3)"#"#>!#qG&!C&ͭog"#*#"#*#"#*#"###*#S[*#}/2#$#*#*#\:#/2#$>2#!"#*#DM*#*#͸Jog>og{ozg}/2#%>2ͭa"*!(>aTj#!,jbTjF !,gb*!ͭa"*!(>aTja!,jbTjF !,gb*!ͭa"*!(>aTj!,jbTjF !,gb*!ͭa"*!(>aTj!,jbTjF !,gb*!ͭa"*!(>aTj !,jbTjF !,gb*!ͭa"*!(>aTjB!,jbTju!,jb!"*)"*!ͭa*"*!(>a*#>>:Tj!,gb!(>bTj:Y2:y!/2¯ !,jbTjF !,gb*!ͭaI"*!(>aTj!,jbTjF !,gb*!ͭaK"*!(>aTj!,jbTjF !,gb*!ͭaM"*!(>aTj !,jbTjF !,gb*!ͭaO"*!(>aTjI !,jbTjF !,gb*!ͭaQ"*!(>aTj !,jbTjF !,gb*!ͭaS"*!(>aTj !,jbTj!"F !,gb*)"*!ͭa*O"*!(>aTj*)"*!ͭa*O~#fo#}2 !,jbTjF !,gb*)"*!ͭa*Q"*!(>aTj& !,jbTjF !,gb*)"*!ͭa*S"*!(>aTj#*)"*!ͭa*"Q<*)++*~#fo*{ozg}/22<*+"*}/2o*)++*"**s#r*#"**~#fo{ozg}=/2B:e‡C*#"i>!nH>""*~#fo}/2!"2E*~#fo}/2_*! ͭa""~#fo#*s#r* "* ~#fo#*s#r*#"}2X>2\2E*~#fo}/2*! ͭa" "~#fo#*s#r* "* ~#fo#*s#r* ~#fo}2>22E*! ͭa" "~#fo#*s#r* "* ~#fo#*s#r* ~#fo}2E>2*ͻX:E**; ҾE>>G:L$H>ͩ?E>G*i ͚X2L^7:f*!MF!$$">22 2Z>2e*"]+^>ͩ?!c>2 2Z>ͩ?*d|T:%DF:*"]+^T:c\FͨeFTü%:SuF*h"yA>G*:eʑFʑFͨ}>2 +^>͗^*"]!e6+^:!l"fͥ*"*]"*e": #*#}2#*#}!#/2#J%#*#/2#J%2#G&!K&ͭog>og{ozg}/2#n$:#og>og{ozg}/2#%#!O&jb*#"#*#"##*#!?&>aTj%$!O&jb*#"#*#"##*#!?&>aTj*#DM*#*#J2##!S&ͭog>og{ozg}!#/2#6&2#;&>2#:#  'ͦ]*O>"&PtP>N#F# UP<33JPO=hPhPyCP7yOBPO> ͦ]>(ͦ]9P>)æ]ͤ]:*P**]*TIQ*]d|>+P>-ͦ]WOT: >/̦]=Q>[ͦ]:O/_!Q~O> ͦ]# P~O>]ͦ]9Q!~:6Q#~ͦ]+~ͦ]:G+~O+QIQ>/̦]>L̦]:O!~ͦ]+ PQ:XH]pQͤ]ZQ0jQ *ͱW*!h; ʑQͨ:fʧQ*|lRͨlR*d|¶Q:Q:cQeFQXE͝2ͅhlR R=&R:*]| :QͱW:% R]lPͤ]*:X>2go"]+^͋hQ=MR<2:e8!:Gw#@Rͨ:e*]|:hRñW]!So*~P!To*~P!ToͅhڷR±R:eʱR*]|ʱRZQ͖PR͋hғR]!>To2ͅhR"!*s#r*S"!*s#r!")"*!ͭa*O"!*s#r_ !,jbTj !,jb!"*)"*!ͭa*G"*!(>a*#> >eTj!,gb!(>bTj:Y2:y!/2¬è!"*}=2A*)"*!ͭa*":og!ͭa*~#fo*s#r*#"!"*}=2¨*)"*!ͭa*G":og!ͭa*_~#fo*s#r*#"G !,jbTj !,jbTj !,jbTj !,jbTj !,jbTj !,jbTjF !,gb!(>bTj:=Ɓ2:=?!/2¨!"*}=2*)"*!ͭa*":og!ͭa*~#fo*s#r*#",ë*!ͭa"!*s#r*#"ñ J !,jbTjF !,gb*!(>aTj6[q !,jbTj!,gb!(>bTj:Y2:y!/2i` >@>@>@>@>@(' ',11X,'Drive not ready: status (in hex) = ')(' ',11X,'Failed to find track 0: status (in hex) = ')"9";*9~#fo!ͭa~#fo}2:2*t"H:,ʶF!}F"f2!6(eA>=ͮh!b6 !b6yAT:+!WG1GRG:+@G@G͂6WG:+@OC͝WG>}G!h" V*T*"]:2e:2 :2*"t+^ *"*; ]G!h""*#">G :+==G:CG>G>}G>G>G>G>$H>GG:%4H:%4H!j4x#H~#HH]lPͤ]o4HG:%4HxO4HG*#"9XxG9X BH*****>[H>!g~#*r+sxG$H$HIllegal Statement NumbeStatement Unrecognizable or MisspelleIllegal Statement CompletioIllegal DO NestinIllegal Data ConstanMissing NamIllegal Procedure NamInvalid DATA Constant or Repeat FactoIncorrect Number of DATA ConstantIncorrect Integer ConstanInvalid Statement NumbeNot a Variable NamIllegal Logical Form OperatoData Pool Overflow; Out of MemorLiteral String is too largInvalid Data List Element in I/Unbalanced DO NesIdenti^`^`\h^`\h(' Beginning: Seek Test')"X !!jbTj!"^!"`*X~#fo!ͭa"j ~#fo"h*j ~#fo+"\*\}2l !!\!hͪ\m \RR:*RZQ͖Pͤ]͜T͋hR]:S!NToͅhSSZQ͖P*]~P]͋hS]:kS!aToͅhkSeSZQ͖P:eeSͤ]*]:%YS PeS: P0P͋h1S>2*|ʉS]>%ͦ]9P!nTo*|ʢS]>?ͦ]9P!To2* ͱW:fS:cS*hTͱWͱW*Y|9XS Program Unit Length Bytes Data Area Length Bytes Subroutines Referenced: Variables: COMMON Length Labels: Warning(s) Issued Fatal Error(s) Detected :e=*]0P<2**tT͖PT>+ͦ]O"*#|+* ; ~2G~2+~O2 ~82~2e+V+^"]+V+^+"tA !w+Uy=U*]" +~20+V+^"]l+h&l+h&(' Beginning: Data Test')"`&y+! -jbTj!"h&*h&++}/2n+-*`&~#fo!ͭa~#fo+"d&*d&}2n+D,*`&~#fo!ͭa~#fo+"l+*l+}2n+:,o+d&*`&1-/2n+0,2X&*l++"l+,*d&+"d&+*`&~#fo!ͭa"s+*s+!j&;*`&~#fo!ͭa~#fo"j+*j+}=/2n+,*j+)h&~#fo"d&*`&~#fo!ͭa~#fo+"l+*l+}2n+,u+d&*`&./2n+,2X&*l++"l+ú,*j++"j+|,*h&#'ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB"ſ"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N# "h&ç+>2X&!c͞%*::+V͂6"-"-"->!-q*-DM*-*-."&-*-~#fo!ͭa"*-&-**-ͪ\*-~#fo!ͭa~#fo"(-!""-*"-*(-{ozg}/2,--*-"----*-*- "/2,--2-*"-#""-Ï->2-ɜg-XA>WyW>WC?H---"-"->!-q*-DM*-*-."-*-~#fo!ͭa"-~#fo"-*-~#fo"-!"-*-*-{ozg}/2-£.*-"..*-*-O$/2-™.2-*-#"-Y.>2-##reÇX *ue_m_m_m_m_m_m_m_m".".`i".*.~#fo|g}o*.~#fo*.~#fo|g}o}2.og).~#fo".!Xx2cͱWTO* *; * "" ͨqO!cy:W! D !͞w#EYͨr> iY; ʃY+; Y 2bE: TÚY*:02>2Z!""+"5*! s#r!p s#r!k s#r͞%: =Z:C%Z*!p s#r͋%*! s#r:+Z-3Z2s,*+!k s#ry!EZͧhY\:CTjUګ[*"!"*!k N#F͘W*"!p N#F͘Ws#r! ^#V*; Z#"7*5! ^#V"5>2C͑\#|Z+"71!~# x  y2!"%8 K ͯ>H"s:=j 2y2/2 l>2sT!"P2RͯH>2ͯ‘!"ͯ!"""!6UC~7zº7\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:G|g"! *xB {5~#o}o>$*½# K:m ! ~‹#c* DM! xʋ w#zÈL!Uͦ*)"[660#60 4~:ڬ+4#60ì!"ÈxG *w# x*  Invalid memory size$ Synchronization error$ Constructing 00K CP/M 2.2$ Ready for "sysgen" or "save 00 cpm00.com" $#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER"ſ!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ"**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈNÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  ># ü BAD MAP OVERFLOW! 'PMMMM((((*S&)T]))CbU:i:/R>R͙:R$̯̯O!+~9o####_#:i2iw#~#foͺ s#rͺ:i>:SYx2!i~~ʐ~ʐy#ڐ>EO>2Ð~ʐyOҐ>2Ð:iʕ Õ"á"æ:!Rw!!1A   !"#$%&'( !"#$%&'()++) ,<,)U,,)!,,O?ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I$!$DH(*B"B!A$ BB@$$!"$$HIHB@@H " @$! $I!$DDDD@@UUB I$"$I !H$EEEE*!$$I D"" "B@H"A@$BHDI""" **** $A$D  ! @@*$$ I!$D @ !B2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2(?(Q?(?(^ (0!P6%#6~kz^7͸!=(2S2E~2i͓#6͸y2Qy2R`i"M> è>!2P!L 7?>@!D~5+"X##"`"]####"e!W(  =!D7:Fo:H$!Gj*S&(++~@>&2P"Q2Sw8.(%"%#%%z      %&'()*+, -. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>?@)*+,-./0?4 < @+ 4 h@x1@W@ "6!d!!!!!]"b"!d!́!ͨ!2"2"!#""(!%!!<2"$$$$""(!! ]" *!72" "9:"d!9|!9́! #:"o&))))2"s!y2">d" u!>d" "!"6#6͜"ͷ"6#6ͨ! "!!ͷ"^#V+q#pi`""zd"!""`i""y=" 2"y  HDABH D@ @  D$H   !II @û$9F#.#:#f#ÿ#è# ÁÇÍÓÛq#Ì1>2&.Pv9͍>22!"!"2#22#:!ʁ!^#Vͥ2*"|O|g+|g}oö#|g"#!"##$:"=o&)))))))#!>:#>2>=>͍:"g.͍"!#:ʄ:e:"**"z{{{!":"{={*"":"2">2"ɯ2":=>2͚>> 2͚͵2 .*#DM.* #DM.#..>7>x¤.ä2#:#g|Oogy#{_~#foy'w# x~#O ,!:O:": #O:2!o&))))6:"g. |ʩ^#V#""~#fo"#$*+#ʦ~<ʬ:"w#Î"+!,é!':#O*+z{*#"#*#" #y #:# #:# #:# #:# #2" "*P"":R2"T!""P2R"@2B*"!":"d">2"@*"@"ڂ""ڂ":"2"/O:"2":"2"!"6U~7z¦"7:"_!"`i#|/g}/o#"|}")#,, WF#.#HQ#:#yH\#M>\#M >Oq#f#yH͛#M *N:GMʔ#H2Gx¤#O>ͳ#ʨ#H͛#M>#ʿ#I#yI>H>HyH>I>IOH >J$I\#$P$$&$!X$_^#V*$*>KzI{H>KIM>LNMHH:O:O`0 ͛#>K*|I}H>K>LHI:OIʠ$>H>J>H>H: 2O>H:O:O1222"2!|2":2'!' 6#f$!$,P Morrow Designs 48K CP/M 2.2 E4 A: HDC/DMA M5, BC: DJ/DMA 8", DE: DJ/DMA 5 1/4" $@B B HH II$@DI (Copyright (C) Digital Research, 19801] w?w! [[0 n))) O <|n}n.g))Ë!$ʇ~/w/wz|g*"|=?:G|g"! *xB {5~#o}o>$*½# K:m ! ~‹#c* DM! xʋ w#zÈL!Uͦ*)"[660#60 4~:ڬ+4#60ì!"ÈxG *w# x*  Invalid memory size$ Synchronization error$ Constructing 00K CP/M 2.2$ Ready for "sysgen" or "save 00 cpm00.com" $#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER"ſ!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ"**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈNÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >'ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB"ſ"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N# 2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>21!~# x  y2!"%8 K ͯ>H"s:=j 2y2/2 l>2sT!"P2RͯH>2ͯ‘!"ͯ!"""!6UC~7zº7\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#2&.Pv9͍>22!"!"2 #22#:!ʁ!^#Vͥ2*"|O|g+|g}oö#|g"#!###$:"=o&)))))))$!>:#>2>=>͍:#g.͍#!#:ʄ:e:"**"z{{{!#:"{={*"":#2">2"ɯ2":=>2͚>> 2͚͵2 .* #DM.*#DM.$..>7>x¤.ä2#:#g|Oogy#{_~#foy'w# x~#O ,!:O:#:#O:2!o&))))6:#g. |ʩ^#V#"#~#fo"#$*+$ʦ~<ʬ:#w#Î"+!,é!(:#O*+z{*#" #* #"#y #:# #: # #: # #: # #2"y2" "*P"":R2"T!""P2R"@2B*"!":"h">2"@*""چ""چ":"2"/O:"2":"2"!"6U~7zª"7:"_!"`i#|/g}/o#"|}";)1# - -;)A# . .  j#R#Hu#^#yH̀#M>̀#M >O͕#ʊ#yHͿ#M *N:GMʸ#H2Gx#O>##HͿ#M> $#I#yI>H>HyH>I>IOH >n$Ì#2$t$2$J$!|$_^#VN$*>KzI{H>KIM>LNMHH:O:O`0 Ϳ#>K*|I}H>K>LHI:OI$>H>J>H>H: 2O>H:O:O1222#2!|2":2(!( 6$͊$!%,P Morrow Designs 48K CP/M 2.2 E4 AB: HDC/DMA M10, CD: DJ/DMA 8", EF: DJ/DMA 5 1/4" $@B B HH II$@DI (Copyright (C) Digital Research, 19801] w?w! [[0 n))) O <|n}n.g))Ë!$ʇ~/w/wz|g*"|=?:G|g"! *xB {5~#o}o>$*½# K:m ! ~‹#c* DM! xʋ w#zÈL!Uͦ*)"[660#60 4~:ڬ+4#60ì!"ÈxG *w# x*  Invalid memory size$ Synchronization error$ Constructing 00K CP/M 2.2$ Ready for "sysgen" or "save 00 cpm00.com" $ # ü BAD MAP OVERFLOW! (PMMMM((((*W&)T]))GfU:m:/V>V͝:v$̳̳O!/~9s####c#:m2mw#~#fo; s#r;:m>:WY|2!m~~ʔ~ʔy#ڔ>EO>2Ô~ʔyOҔ>2Ô:mʙ Ù&å&ê:!Vw%%5E   !"#$%&'( !"#$%&'(;)+,;)0,`,;)y,,;)%,,O?ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I$!$DH(*B"B!A$ BB@$$!"$$HIHB@@H " @$! $I!$DDDD@@@UUT!"A"I !$H@PPPRBH $ !$B!""@ "$$$AA$I$""""H"H!BA@@@"ATAI ! A $H$B $ !I"A'(?(Q?(?(^ (0!P6%#6~ozb7ͼ!A,2W2I~2m͗#6ͼy2Uy2V`i"Q> ì>!2T!P #7?>@!H~5+"\##"d"a####"i![,  =!H#7:Jo:L$!Kn*W&,++~@>&2P"Q2Sw<.(%"%#%%~      %&'()*+, -. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>?@)*+,-./0?4 < @+ 4 h@x1@W@ ":!h!!!!!a"f"!h!ͅ!ͬ!2"2"!$"",!&!!<2"$$$$"",!! a" .!72""9:"h!9̀!9ͅ!#:"o&))))2"w!y2">h" y!>h""!"6#6͠"ͻ"6#6ͬ!"!!ͻ"^#V+q#pi`""zh"!""`i""y=" "@DD!I **  @@@!H@ D"I$1!~# x  y2!"%8 K ͯ>H"s:=j 2y2/2 l>2sT!"P2RͯH>2ͯ‘!"ͯ!"""!6UC~7zº7\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#2&.Pv9͍>22!"!"2 #22#:!ʁ!^#Vͥ2*"|O|g+|g}oö#|g"#!###$:"=o&)))))))$!>:#>2>=>͍:#g.͍#!#:ʄ:e:"**"z{{{!#:"{={*"":#2">2"ɯ2":=>2͚>> 2͚͵2 .* #DM.*#DM.$..>7>x¤.ä2#:#g|Oogy#{_~#foy'w# x~#O ,!:O:#:#O:2!o&))))6:#g. |ʩ^#V#"#~#fo"#$*+$ʦ~<ʬ:#w#Î"+!,é!(:#O*+z{*#" #* #"#y #:# #: # #: # #: # ##͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER"ſ!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ"**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈNÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  > # ü BAD MAP OVERFLOW! (PMMMM((((*W&)T]))GfU:m:/V>V͝:v$̳̳O!/~9s####c#:m2mw#~#fo; s#r;:m>:WY|2!m~~ʔ~ʔy#ڔ>EO>2Ô~ʔyOҔ>2Ô:mʙ Ù&å&ê:!Vw%%5E   !"#$%&'( !"#$%&'(;)+,;)0,`,;)y,,;)%,,O?ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB"ſ"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N# 2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2(?(Q?(?(^ (0!P6%#6~ozb7ͼ!A,2W2I~2m͗#6ͼy2Uy2V`i"Q> ì>!2T!P #7?>@!H~5+"\##"d"a####"i![,  =!H#7:Jo:L$!Kn*W&,++~@>&2P"Q2Sw<.(%"%#%%~      %&'()*+, -. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>?@)*+,-./0?4 < @+ 4 h@x1@W@ ":!h!!!!!a"f"!h!ͅ!ͬ!2"2"!$"",!&!!<2"$$$$"",!! a" .!72""9:"h!9̀!9ͅ!#:"o&))))2"w!y2">h" y!>h""!"6#6͠"ͻ"6#6ͬ!"!!ͻ"^#V+q#pi`""zh"!""`i""y=" "@DD!I **  @@@!H@ D"I$F~waSd:2:1 d*5"7>2C21a*####~wa:C2z*"x2|:=6c:vc:1(d@dd!|4*####"*++++; \cc:C!zc*x":|occfa2|Oc* *5*7; ډc>6c; 6c&c͂dx2Cy2*~212##^#V* "5; T=:<2*####"͖c"*5"7:2:122:2Öc*5"7> 2Cc*5*##s#rc*####~wd*5*#####:w#s#r*7":2:221*5*7"5"7!Fwp!FwpG*>রw*>G#N!X~**ʹd*ͳd*ͳd*ͳd*s#r#*v*t; *"vTͱWT*:1G:Cw#:w*s#r}o|g\>*| ʴf".*",!*/~ +e`e# eN#~#^#V"f Ye!* T<=ne#He͗^*f*; eͨe x>~e2*""ñW"`"\* "^öe*\*^* d++++*#; e++~´e+~µe###* d"^ѯ*` Y*#s#r"**d; A: fͨf*d|ʴf*"h; ڴf V*d*; PfDM'f:[fͨA:"ʆf*g|ʆf"]22go"gSX22"x“f͚6!f`i"͔dͨg!9*; ͨ!"d! 6JggR%:e2"y2" "*P"":R2"T!""P2R"@2B*"!":"h">2"@*""چ""چ":"2"/O:"2":"2"!"6U~7zª"7:"_!"`i#|/g}/o#"|}";)1# - -;)A# . .j#R#Hu#^#yH̀#M>̀#M >O͕#ʊ#yHͿ#M *N:GMʸ#H2Gx#O>##HͿ#M> $#I#yI>H>HyH>I>IOH >n$Ì#2$t$2$J$!|$_^#VN$*>KzI{H>KIM>LNMHH:O:O`0 Ϳ#>K*|I}H>K>LHI:OI$>H>J>H>H: 2O>H:O:O1222#2!|2":2(!( 6$͊$!%,P Morrow Designs 48K CP/M 2.2 E4 AB: HDC/DMA M16, CD: DJ/DMA 8", EF: DJ/DMA 5 1/4" $@B B HH II$@DI >2C͑\y!Z!h N#F*͘W"dZT*|[:e:[*#"7*5#|'[*"5/[>2C͑\T2ZÌ[*"**]">*2>2>2 :e*tZ2e=r[*"t"]+^Z2Z*5#|ʦ[>2C*"7:2͑\*5"2C:0[*"5*t#"7>2C͑\*o#"7>2C͑\*l"7>2C͑\*5*"5*r#"7>2C͑\#|\+"7>2C͑\*m#"7>2C͑\*j"7>2C͑\*5*"5*p#"7>2C͑\"7>2C͑\T*#"7>2C͑\*k͘W#"7>2C͑\T[!"* *5; ڪ\ͼ\2*7; ͼ\2T=\:>ȯ:222s8>)ͮhT W!#6*[#"[!> 2 :]ͨ]^<] ] ] ]C]*[9Pͤ]C]^C]> 2w M] Ħ]z]#^<] Ħ]l]T] 6] 6] •]> w#xP„]6]w ]\2P> :²]]:%]]:%<]#0:X> ͦ]> æ]#>O6]> à]!X ^4~]5> 4ë1 ^6] ]]:z'^)4i42z92!N:*w:eG:! +w+*]r+s+*tr+s+w+ d^:|^<|^>2: * r+s*]++r+sGo*f; x^!N~¸^4E͞X*"z!xw ^5A*fͨ*"dA#9TSX:f2*"]!e6+^ g2#9:"9g*g|9gA"]22go"gSX22"!":Ugͨdg2sg:22!"fgTETNTDT/> ͗^vQ\:2T)g(g,g/d=“gdͻ\:, ͥ:=g: }F> ͗^:2\ TdØgdͻ:<h͞G:Ihxh>2s:C>*ʘgg>2S>:Nj`>2b2cͥNh2 >2e+^*"hͭXͱWX:Sh!~6 2 *T*:/O "* ; ?T>,îh>(!ͨ~ͨ:o&: jU:0/!j^#V#<2 +^:x²_YH*zT:x2b*g|ʥ_:"¥_A*g"]2go"gSXå_:ew_*"!"2**]d| ` `"ͻhd:+`*d|3`3`>2"Ϳ_**"*">2e*]*d"]+^ͿL`w_ͨ> xd22*"*++++~_!N* "*; `*++++"͂d_*"x z`„`*"**; „`*"c:C!a Ca:2 aSdc(dc:CCa:1Ca d21:CCa*####>w*5|a55c**; ʩ`:Cbcfa c:C=ibڛbaʦb=aaʬb:1ʛa:C_!~2C:1!22C:1a!C>w=a* *5; a21æb!1:2waSda*7* db~ bb!O *Ks#r*}K#"}K*%/{ozg}=/2KM*{K#"{K*#/!ͭa"K*{K*K~#fo{ozg}2KM*K###"K)"K*#/!ͭa*KO~#fo#}/2K´MK!NjbTjK!NjbTjsO*K)"K*#/!ͭa*K"KO~#fo"yK*KQ~#fo"{K*KS~#fo"}KM!"}K*K"KëL!"K*K}=2KKN*K"K*?"K*K*/~*Kw*K#"KN*#/!ͭa"KI~#fo"yK*KK~#fo"{K*KM~#fo"}K}KyK!{K͸J!`/2K´NK!NjbTjK!NjbTjKwK!#/̈́[*wK}2KNK!NjbTjL!NjbTj!wKͻXsO21!NO(' ',11X,'The Bad Map contains',I4,' bad sector(s)')(' ',15X,'Head',I5,', Track',I5,', Sector',I5)*)/!aa"O}=/2 O\PO!aPjbO!]P>aTj!"O*O*)/{ozg}=2 O\P*O))/~#fo"N*O#"O))/~#fo"O*O###"O*O}2 O*N}! O/2 O"P\P*O+" O*%/aa"O%/! O|_"OEO!aPjb OO!]P>aTjïO('0Error Report on trial:',I7)(' ')iP! Qjb!Q>aTj!"fP*fP+++}=2hPP*fP!ͭa~#fo}2hPP!fP͡R!fPgT*fP#"fPéPP! Qj/2nVYoV!2[jbTj-[*lV~#fo}/2nV?YV!2[jbTj-[*lV~#fo+}/2nVgYV!2[jbTj-[*lV~#fo}/2nV’YV!2[jbTj-[*lV~#fo}/2nV½YW!2[jbTj-[*lV~#fo}/2nVYGW!2[jbTj-[*lV~#fo}/2nVZoW!2[jbTj-[*lV~#fo}/2nV>ZW!2[jbTj-[*lV~#fo}/2nViZW!2[jbTj-[*lV~#fo`}/2nV”ZW!2[jbTj-[*lV~#foO}/2nV¿ZW!2[jbTj-[*lV~#foN}/2nVZX!2[jbTj-[*lV~#foM}/2nV[ZX!2[jbTj-[X!2[jb*lV!.[>aTj!K^"P>2R!"m^TzL[>]&]!+?"O^*_^~2R^#~2S^*a^~2T^*c^~2U^>2V^͏]>]&]!+?"O^*_^~2R^#~2S^*a^~2T^*c^~2U^>2V^͏]>]&]!+?"O^>2V^͏]>]&]!+?"O^*c^~2R^*e^~2S^*g^~2T^*i^~2U^>2V^͏]> ]!"m^*i^~2o^#~2p^*k^~2q^#~2r^&]*c^~2S^*e^~2T^*g^~2U^>2V^:N^02N^͏]>]&]!"L^>2V^͏]>]&]>2V^͏]>]!"m^&]>2V^͏]>]*[^~^>]*[^#~^+~^>]*[^N#F8*]^^#V!+?{w#zw# x\>]*[^N#F8*]^^#V!+?{\#z\# x\*_^6*!BADMAP SAV:Y2CGEGGG(' ',6X,'Bad Map Open ERROR')(' ',11X,'Cannot read the Bad Map from the disk')(' ',11X,'Bad Map has overflowed')"4G*4G~#fo"#/!ͭa~#fo}/2MGG2,G*#/!ͭa"NG~#fo"%/*NG~#fo!aa"'/*#/!ͭa"PGI~#fo"CG*PGK~#fo"EG*PGM~#fo"GGRGAG!#/S[*AG}2MG¢HYG!IjbTjvG!IjbTj!AGͻX2,G*#/0 }2bTj!i!"IG*IG}=2MGI*IG"NG*/"PbTj2!"Q*Q+++}=2Q`Q*Q!ͭa~#fo}2QVQ!Q͡R*Q#"QQɷ('0Error Report on trial:',I7)(' ')eQ!Qjb!Q>aTj!"bQ*bQ+++}=2dQQ*bQ!ͭa~#fo}2dQQ!bQgT*bQ#"bQåQQ!QjbTj~#fo('0Drive',I2,' has the following characteristics')(' ',6X,I4,' tracks')(' ',6X,I4,' heads')(' ',6X,I4,' bytes per track')(' ',6X,I4,' sectors per track')"RR!uSjb*R!qS>aTj:R!uSjb*R~#fo!ͭa"R*R!qS>aTjOR!uSjb*R~#fo!ͭa"R*R!qS>aTjcR!uSjb*R~#fo!ͭa"R*R!qS>aTjR!uSjb*R~#fo!ͭa"R*R!qS>aTj2l 2P*(' ',6X,'Drive',I2,' PASSED')(' ',6X,'Drive',I2,' WARINING')(' ',6X,'Drive',I2,' FAILED')(' ',11X,'Soft Errors:',I7,' This pass',I7,' Last pass',I7,' Total')(' ',11X,'Hard Errors:',I7,' This pass',I7,' Last pass',I7,' Total')"zS*zS~#fo! ͭa"|S "~S*|S ~#fo}2S*~S~#fo}!S/2STS!gVjb*zS!cV>aTjbV*zS~#fo! ͭa"|S "~S*|S ~#fo}2S*_^6"[^"]^]`i"_^==!_^q*[^~2K^2N^*a^~W:N^2N^*_^^#V*m^"s^7?R0 !K^*s^7?R"L^*s^"m^*o^7?R8!N^*s^*q^7?R0!N^>2W^U:W^]z]]Қ]:W^]z]]î]UL*]^w>#w ^ r]*7^e^͈Q^f^Q^p^͌P7?-^-^0:8^<^_@K^Jq!{^^!u^q!{^Ȇw!^O ͏`:z^<2z^! _O ͨ_!Yz^#V#N#F#{YOO6+F6!y^4~֫^w Ϳo!u^pw+w+wù^5Jʙ9v" GSљ e͘w>hFhiuh!Yzq>X_0_w-qm_qT_!]z6ag>͡q|Ԗa!>*_ak~#foAaq_a_4qpz||aaa!\z~+>w4qSaë_%q4q:\z qҾ_/<ͤa4qag͡q!Yz_~_#~W#~O}p#4lp.ͷq}pG~_#~W#~OܐaÿoSa `%q4q>Oî_G`> 2gz!PA"hz!US"jz!E "lzX`*iy6 ̀y*iy6 Txnz~#N`!gz ~qy#]`G`> 2gz!ST"hz!OP"jz! "lzX`xSaÒ`%qq4q`y+F+F+Fw`h|`gy`:YzO|g}oxG-|·`}²`ÿoElaOñ`!\z~Gx`ƀʜpwaw+ɷG*NG*?~*PGw*IG#"IGH!")/*)/*'/{ozg}=2MG’I*)/)"NG)/~#fo"CG*NG+/~#fo"KG}2MG*CG}!MG/2XG…I>2,G*)/")/IYG!IjbTjG!IjbTj2,G*s#r*S"!*s#r(' ',11X,'The bad map has been filled')"I"I`i"I*IDM*I*I͸J/2I•J*)/*'/{ozg}=/2I[JI!JjbTj2I*)/)"I)/"I*I~#fo*Is#r*I+/"I*I*Is#r*)/")/>2I}=2*)""J"J`i"J*%/*J~#foͭa#*J~#fo"I!"J*J*)/{ozg}/2JqK*J)"J)/~#fo"J*J+/~#fo"J*I{ozg}2J*J*J~#fo{ozg}!J/2JdK>2J*J"JJ2J!!yK{K}K(' ',6X,'Bad Map Close ERROR')(' ',11X,'All of the alternate sectors have been used')(' ',11X,'The bad map sector is in the bad sector list')(' ',11X,'Unable to write the bad map back onto disk')*)/+}=/2K N*#/!ͭa"KO~#fo"yK*KQ~#fo"{K*KS~#fo"}K!"K!"K*K*)/{ozg}/2K N*K)"K-/"K*yK*Ks#r*%/*{Kͭa#*}K"K*K//"K*K~S~#fo}!S/2S’US!gVjb*zS!cV>aTjS!gVjb*zS~#fo! ͭa"|S"~S*~S!cV>a*|S"S*S!cV>a*|S "S*S!cV>aTjbVS!gVjb*zS!cV>aTjS!gVjb*zS~#fo! ͭa"|S"~S*~S!cV>a*|S"S*S!cV>a*|S "S*S!cV>aTj#T!gVjb*zS~#fo! ͭa"|S "~S*~S!cV>a*|S"S*S!cV>a*|S "S*S!cV>aTj(' ',14X,' Normal completion - no errors')(' ',14X,' Controller failed to respond before time out occured')(' ',14X,' Drive not ready')(' ',14X,' Sector header not found')(' ',14X,' Data not found (no data preamble')(' ',14X,' Data overrun (chanel error)')(' ',14X,' Data CRC error')(' ',14X,' Write fault')(' ',14X,' Sector header CRC error')(' ',14X,' Illegal command')(' ',6X,'Recalibration Error (after Sense Status Command)')(' ',6X,'Recalibration Error (after Load Constants Command)')(' ',6X,'Recalibration Error (cannot locate track 0)')(' ',14X,' Unrecognizable error code =',I5)"lV*lV~#fo|g}o*lVs#r}/2nVX-[*lV~#fo}lpÝpqx{q!]z6awg%az$a >͡q|ԏp{>2\zͿo/))a =»a![z~7w?##wy7O*Yz*[z"[z"Yz!b!b!b!b!"3zqq~#fo"zq"y*z"y:Rz?bc%b+l%b>2=z2>z<2zÀb>2=zob2=z2=z2>z2z~#fo"Sz!gz"y~#+Žb!"!z!9##"a:>z²bgo"#z"%z")z"'zb!#z>q*#z~#bgo"#z*%z~#bgo"%z*'z~#fo"'z*)z~#fob")z2?z2Pz2Rz2Lz2.z2zgo"+z"yͧp*!z|&c͠l*+z"@z(kw2y2y2y2y<2Rz:=z>iTo͖fWc Pc> 9mwCc:z/9m=ªc:5zGj9mñc!5z_zw# c:=zc*yDM*y"Xz*y *yd`i"y"y*yDM*z"Xz*y*y d`i"yc:4z*Xz+}|_d:=zHd*Xz"y>i*yd>i*y"Xz*ydw#=d*y+"y|d<ڀd>G!y60#`o!z4:2z:3zghn:zG:Lzeg"5z|x!oqfkcgideed:4zG*y5z:3zRn9zw#Rn"y*Jz|Nml!2Mz>wènͰo:8zn͍o>2Mz7Dqo!y~wnn`oìnn!Uz5z@j`oҬn!5zUz@j!z4/G m!5z~#n¨n¨n2y!5zw#o!z4>i*Jz*y"y*zDMyxNmw *y"yNm j*Jz+"Jz|?oNm:4zG:z2z!y>w!z5 m:j mþc!5z~/G#~/‰o wqy:xykyyy:xynyy_y w> w*xv|w}w"zv"x_>2yvwIwxwFwFwDwDwDww2ỳy Mw*y&*yw"y }Mww:y*y=> qy~+ʯw1šw> qyïw> qy~ ʯw0¯w> qy#~#qy=ñw **** at address ** w!w&x~"~w>#O!Qx ~qy#~qy:x<2xx#x!w&x0x#xx!w~qy#&x|=x}=x> qyFxƐ':'qyIDF0MPIRFWITEXDOMLDZLGSQIBTLOBDEISBEINOVCNGLGSSNA2IODTBIRCEFFNDFUNOM??o2x2x!x"x*+ 2x!x!!""xx!x*x> qy> qyP *lV~#fo}/2nVx2zxd:Lze2z͎j:Lz1e0j!z5Be<e:zBeBeij2eE:zMeDj:z!Lz2zbe+ie-/<2zj:z_! mq{0Gj}0Gj:3zghn:zG!z:Lzwexd2z:z2z:ze2z!zw͎j:z/e*1z"/z!"1zij!z4e*/z"1zije:3zghn:zd!z/2-z j@f*+z*!zDM*Jzf+|Uf"Jz"+zNm*+z*!zFj*+z#"+z*Jz+"Jz|#yfNm*yDM!-z5ʽf*y+}|f*y ~2Qz`i"y>óf> óf͖ff !-z4f: zI+g:3z=f==f=ff:zfw!9zgwg#g:Mz=n:3z%gͰo͍o=n>2y:3z22Mz2z! mq}0o!z4{;h!y:zG2z2z21zs#_h!y"z͎jV+^7h͎iÅhf …h>00ږh:Җh02Qz>ɯ2z2z2z͎i-´h>2Mzùh+¼h͎i=n*y+"y!-z4Ui:Qz.h>2z2zUi:QzfEhDh͎i+i-p-q%qq-q"Yz`i"[z*Yz*[zDM^#V#N#F#xyÈq ҇q7>{_zW}o|g=~q|g}oڰqCZQãq o-yOzW{_xGóq`iN#F#q#p#=q2y"Bz"Dz`i"y2y:yr!Bz_r:y*yr_~#fo:y<2yW:y,r~#fo"}K!"}K*K"K!"K*K}=2K*zFORTDAT;utttrtw|twww!.r:Sz_~ͬr:Sz_!Ar^#V!8r:Sz_~!Ur:Sz_^#Vr!!*'zr! p# rw#r:Sz ҋr͓rs@trz)s^#V͓rwAs͓ru͓rwrs#r#6:x{zG{Or! ~ʔs! 6*nr͓r {s! p<’sht! q*nr!9}|ڏr!Ar:SzO s#r!rr+s!$"nr6#prrsy0wx0#w> #w#trr>w:Sz t s Gͻrr*xt|t}t"lr"xr͟ry Ot*'z|CtOtht7<ʇr͓r@|t͓rO@ztyur͟r͓r6!.r~{2Sz|t:p t0r*y*y&tw#t#v7r*y>2yv? e bit mov h,a dcx h ;Temporary adjustment divloop:dcr b ;Update repeat count jz divdone ora a mov a,h rar mov h,a mov a,l rar ;Divide the CP/M sector # by the size mov l,a ; of the physical sectors jmp divloop divdone:inx h mov a,h ora c ;Restore the side bit mov h,a shld truesec ;Save the physical sector number lxi h,cpmdrv ;Pointer to desired drive,track, and sector lxi d,bufdrv ;Pointer to buffer drive,track, and sector mvi b,6 ;Count loop dtslop: dcr b ;Test if done with compare jz move ;Yes, match. Go move the data ldax d ;Get a byte to compare cmp m ;Test for match inx h ;Bump pointers to next data item inx d jz dtslop ;Match, continue testing ;If Drive, track, and sector don't match, flush the buffer if ;necessary and then refill. call fill ;Fill the buffer with correct physical sector rc ;No good, return with error indication ;Move has been modified to cause either a transfer into or out ;the buffer. move: lda cpm i>2y͎iy2z*y+"y!-z4uh>iOx 3iw> Gi:yxHi/<2zG!z~wf{h:25zfi=n!5z~i>T>Fw> #w#w#w>23z24zÄc> i> i>O}2SzO!p:Szww=_^#V ^#Vj'j*%z|3jw*#z|3jw*a!_z5zw#Bj!5z_z@j:Rz!ywk:=z>i!z5zj:/z*j!1z50j*zF#"zj!z~!Mz!z2/zʬjj2z/j:Mz-j!z5j.jijõjw j!/z5jìj*y*y{zj#"y*y+p!-z5kw:.z:JzNml!?z~4kw *1z"@z*Jz"FzNm!"-z*+z*!z:=zek~'Vkfw#Ck#~'Ik"+zNm~'|kGj*+z#"+z#ek*+z#"+z#~'kkNm:?z=k!Pz4!"+zl2?zNm*Fz+"Fz|Nm*@z"+z!?z4Nm!y6:=zk:zk*yzk*y6 "yo:y2y2y:=zl*z"yĒl!"yNm!Pz~lw+l*y+"y|+l:Pzk*Jz|Nm+"Jz:z2z2Mz2z2ygo"5z"7z"9z";z:z!-zw:=zol4*Hz:4zG:3z*y5z„l9z~#„l"ykl:zi*z"yɯ2ygo"5z*+z*!z~# ʱl-ly ñl"+z2QzG0l l*5zT])))_æl*5z|l#x:ymo>r2kr:y:yuw>́u*y~u#=u> u͓rw:kr7r2y2kŕu͑uvuu*y&*yw"y vu}Juw:kr?ɷ͓rʏuͻr6ͻr̬u5!Ar/Ɓ_#>W͟rv2kr>w7ͻrv4!Ar_#>W͓ru>uͻr6ͬro&v6# w~+v1> v> w~0> v w=#~v*y*yz~ w#v:yvʊv> w5w2yv:yv*zv> w> w*xv|w}w"zv"x_>2yvwIwxwFwFwDwDwDww2ỳy Mw*y&*yw"y }Mww:y*y=> qy~+ʯw1šw> qyïw> qy~ ʯw0¯w> qy#~#qy=ñw **** at address ** w!w&x~"~w>#O!Qx ~qy#~qy:x<2xx#x!w&x0x#xx!w~qy#&x|=x}=x> qyFxƐ':'qyIDF0MPIRFWITEXDOMLDZLGSQIBTLOBDEISBEINOVCNGLGSSNA2IODTBIRCEFFNDFUNOM??o2x2x!x"x*+ 2x!x!!""xx!x*x> qy> qyP *lV~#fo}/2nVsec ;Get the CP/M sector to transfer dcr a ;Adjust to proper sector in buffer ani 0 ;Strip off high ordered bits secpsec equ $-1 ;The 0 is modified to represent the # of ; CP/M sectors per physical sectors mov l,a ;Put into HL mvi h,0 dad h ;Form offset into buffer dad h dad h dad h dad h dad h dad h lxi d,buffer ;Starting address of buffer dad d ;Form beginning address of sectgr to transfer xchg ;DE = address in buffer lxi h,0 ;Get DMA address, the 0 is modified t/ cpmdma equ $-2 ; contain the DMA address mvi a,0 ;The zero gets modified to contain rdwr equ $-1 ; a zero if a read, or a 1 if write ana a ;Test which kind of operation jnz into ;Transfer data into the buffer outof: call mov128 lda error ;Get the buffer error flag ret into: xchg ; call mov128 ;Move the data, HL = destination mvi a,1 ; DE = source sta bufwrtn ;Set buffer written into flag mvi a,0 ;Check for directory write writtyp equ $-1 dcr a ;Test for a dn ;Do a directory write ;We are now doing an unallocated write lhld cblock ;Save current block number shld oblock lda cpmdrv ;Save drive that this block belongs to sta unadrv mvi a,1 ;Set unallocated write flag sta unaloc ; and we do nothing about the write ret ;(carry cleared by last ora) awritin:xra a ;Clear unallocated writting mode sta unaloc else ;Do standard unallocated test sui 2 ;Test for an unallocated write rz ;(carry will be cleared if zero result) endif fwritin:lda secsiz ;Check for 128 byte sectors dcr a ;(doesn't affect the carry flag) rz ;No deblocking (carry cleared by last ora) fread: mvi a,d$read sta rwop call prep ;Read the physical sector the buffer ret ;(carry and accm set by prep) ;Flush the Disk Buffer ;--------------------- ; Flush writes the contents of the buffer out to the disk if ; it has ever been written into. If there are any errors then ; the carry is returned set else it is cleared. ; flush: mvi acalled with the drive in (h) and the ; routine number (see description above) in (l). It passes ; along the (bc) and (de) registers unaltered. Jumpbuf is ; a call to jumper with the drive number from bufdrv. ; ;Entry Point_1 jumpbuf:lda bufdrv ;Dispatch with bufdrv for drive mov h,a ;Entry Point_2 jumper: push d push b push h mov a,h ;Logical drive into (a) lxi d,dsttab ;Drive specification pointer table jumpl: mov c,a ;Save logical in (c) ldax d mov l,a inx d ldax d mov h,a ;Get a DST pointer in (hl) inx d mov a,c ;Logical in (a) sub m ;Subtract from first entry in DST jnc jumpl ;Keep scanning table till correct driver found inx h ;Bump (hl) to point to start of dispatch table pop d ;Real (hl) -> (de) mov a,e ;Move offset number into (a) rlc ;Each entry is 2 bytes mov e,a ;Make an offset mvi d,0 dad d ;(hl) = **Routine mov a,m ;Pick up address of handler for selected inx h ; function mov h,m mov l,a ;(hl) = *routine mov a,cirectory write (a=1=dir) mvi a,0 rnz ; if not dir then exit (a=0=no-error) call flush ;Flush the buffer if this is a dir oper ret ;(Accm is setup by the routine PREP) ;Perform Sector Translation (SECTRAN) ;==================================== ;Sectran translates a logical sector number into a physical ; sector number. ; sectran:lda cpmdrv ;Get the Drive Number mov h,a ;Drive in (h) mvi l,d$stran call jumper ;See device level sector translation routines ret page ;Begin CBIOS Disk Routine Utilities ;================================== ; These are general purpose routines that are used by by one or more ; of the preceeding CBIOS Disk Routines and/or the Lo_Level drivers. ; ;Fill the Buffer with a new Sector ;--------------------------------- ; Fill fills the buffer with a new sector from the disk. If ; were no errors then the carry is returned cleared else it is ; set. ; fill: call flush ;Flush buffer first rc ;(carry is set if there were any errors) lxi d,,0 ;The 0 is modified to reflect if bufwrtn equ $-1 ; the buffer has been written into ora a ;Test if written into rz ;Not written, all done (or clears the carry) mvi a,d$write sta rwop call prep ;Do the physical write ret ;(carry and accm set by prep) ;Prepare the Disk for Reading and/or Writing ;------------------------------------------- ; 1) This is actually the place where disks are read/written (contrary ; to the name of this routine) ; 2) Prep prepares to read/write the disk. Retries are attempted. ; If there are any errors then the carry is returned ; set and the location ERROR is set to 0FFh, else the carry is ; returned cleared ERROR is reset to zero. ; prep: call alt ;Check for alternate sectors di ;Reset interrupts xra a ;Reset buffer written flag sta bufwrtn mvi b,retries ;Maximum number of retries to attempt retrylp:push b ;Save the retry count mvi l,d$sel2 ;Select drive call jumpbuf lhld alttrk ;Track number -> (hl) mov ;Logical in (a) pop b ;Restore saved registers pop d pchl ;Move Data ;--------- ; 1) The entry point mov128 forces 128 bytes of data to be moved ; from source to destination. ; 2) The second entry point (movbyt) can move upto 65K of data. ; 3) The Source pointer is passed in the DE register pair. ; 4) The Destination pointer is passed in the HL register pair. ; ;Entry Point_1 mov128: lxi b,128 ;Length of transfer ;Entry Point_2 movbyt: xra a ;Check if host processor is a Z80 adi 3 jpo z80mov ;Yes, Its a Z80 so use block move m8080: ldax d ;Get a byte of source mov m,a ;Move it inx d ;Bump pointers inx h dcx b ;Update counter mov a,b ;Test for end ora c jnz m8080 ret z80mov: xchg ;Source in (hl), Destination in (de) dw 0b0edh ;ldir xchg ret ;Print a Message ;--------------- ;Utility routine to output the message pointed at by (hl) ;terminated with a null. ; message:mov a,m ;Get a character of the message inx h ;Bump text pointcpmdrv ;Update the drive, track, and sector lxi h,bufdrv lxi b,5 ;Number of bytes to move call movbyt ;Copy the data lda rdwr ;Test read write flag ora a jz fread ;Skip write type check if reading lda writtyp ;0 = alloc, 1 = dir, 2 = unalloc if nostand ne 0 ;Do non standard (but quick and dirty) check ora a ;(clears the carry) jnz fnaloc ;Skip if not an allocated write lda unaloc ;Check unallocated write in progress flag ora a ;(clears the carry flag) jz fwritin ;We are doing an allocated write lhld cblock ;Get current block address xchg lhld oblock ; and old block address mov a,d ;Compare old versus new cmp h jnz awritin ;Different, clear unallocated writting mode mov a,e cmp l jnz awritin lxi h,cpmdrv ;Test for different drive lda unadrv cmp m ;(reset the carry on equal) jnz awritin ;Drive is different, clear unallocated mode ret ;Unallocated write (return with carry=clear) fnaloc: dcr a ;(doesn't affect carry) jz awriti b,h mov c,l mvi l,d$strk call jumpbuf lhld altsec ;Sector -> (hl) mov b,h mov c,l mvi l,d$ssec call jumpbuf lxi b,buffer ;Set the DMA address mvi l,d$sdma call jumpbuf mvi l,0 ;Get operation address offset (8 or 9) rwop equ $-1 ;(set by FREAD [read=8] and FLUSH [write=9]) call jumpbuf ;Read or write to the disk pop b ;Restore the retry counter mvi a,0 ;No error exit status jnc prpret ;Return NO ERROR (accm=0, carry=clear) dcr b ;Update the retry counter stc ;Assume retry count expired mvi a,0ffh ;Error return jz prpret ;Return ERROR (accm=ff, carry=set) mov a,b cpi retries/2 jnz retrylp ;Try again push b ;Save retry count mvi l,d$home ;Home drive after (retries/2) errors call jumpbuf pop b jmp retrylp ;Try again prpret: sta error ;save the error flag ret ;Access a lo-level driver subroutine ;----------------------------------- ; Jumpbuf, jumper are used to dispatch to a low level device ; subroutine. Jumper is er ora a ;Test for end rz ;Return if done push h ;Save pointer to text mov c,a ;Output character in C call cout ;Output the character pop h ;Restore the pointer jmp message ;Continue until null reached ;Drive select error return ;------------------------- ; 1) This routine sets the HL pair to zero (the sel-drive error ; return condition) and updates the value of CDISK. Notice that ; this routine is called from both the high level select routine ; (SETDRV) and from the lo-level routines as well (e.g. MFLDR1 ; in the DJDMA drivers). To stop infinite select error loops by the ; CCP, cdisk is modified if it specifies the disk in error. ; zret: lxi h,0 ;Seldrv error exit lda cdisk ani 15 ;isolate 'ccp' curr disk (strip user num) mov c,a lda cpmdrv ;get curr selected drive cmp c rnz ;exit if not 'ccp' select error lda lastdrv ;Get last valid selected drive mov c,a lda cdisk ;Pick up user/drive ani 0f0h ;Save user number ora c ;Put together with old vaverflow lda cpmdrv ;Put drive in table mov m,a inx h lxi b,8 call movbyt ;Move the rest of information into the table jmp badl bade: shld badptr ;Restore new bad map pointer badret: pop d pop b ret overflo:lxi h,omes call message jmp badret ;Check for alternate sectors in bad sector table ;----------------------------------------------- ; 1) This routine is only called by PREP. ; 2) If an alternate sector is found replace alttrk and altsec with ; new sector number else pass along unaltered. ; alt: lxi h,badmap ;Address of bad map -> (hl) lda bufdrv ;Pick up drive number currently working on mov c,a ;Move drive into (c) for speed in search all: xchg lhld badptr ;Get bad map pointer xchg ; -> (de) mov a,d ;Check if at end of bad map table cmp h jnz alt2 ;Still more mov a,e cmp l jnz alt2 ;Still more lhld buftrk ;No alternate sector so use selected sector shld alttrk lhld bufsec shld altsec ret alt2: push h ;Save current bad maead equ 8 ;Read a physical sector d$write equ 9 ;Write a physical sector d$bad equ 10 ;Return pointer to bad sector info ;Disk System DPB Generation Macros ;--------------------------------- ; The following are the macros used in generating the DPH, DPB and ; allocation tables. ; dpbgen macro nam,log,dspt,dbsh,dblm,dexm,ddsm,ddrm,dal0,dal1,dcks,doff,ssiz dpb&nam&log equ $ dw dspt db dbsh db dblm db dexm dw ddsm dw ddrm db dal0 db dal1 dw dcks dw doff db ssiz endm dphgen macro nam,log,dpb1,dpb2 dph&nam&log equ $ dw 0 dw 0,0,0 dw dirbuf dw &dpb1&dpb2 dw csv&nam&log dw alv&nam&log endm alloc macro nam,log,al,cs csv&nam&log: ds cs alv&nam&log: ds al endm page if (maxdm ne 0) or (maxmf ne 0) ;DJDMA present? ;************************************************************** ;Begin the DJDMA Driver (DDRV1) ;****************************** ; ;Step Rate tables ;================ ; 1) The followin tabl ar driv parameter fo drive connecte t ; lid drive sta cdisk ;set new default disk for 'ccp' ret ;No bad Map ;---------- ; This routine is used by the lo-level drivers to indicate that ; the selected device has no bad map. ; nobad: lxi h,0 ;Used by device drives to indicate no bad ret ; sector map ;Return DPH pointer ;------------------ ; Enter with (de) with DPH base address and (a) with logical ; drive number. Returns with DPH address in (hl). ; retdph: mov l,a ;Move logical drive into (l) mvi h,0 dad h ;Multiply by 16 (size of DPH) dad h dad h dad h dad d ;(hl) = pointer to DPH ret page ;CBIOS Bad Map Routines (only for HDDMA) ;======================================= ; ;null routines if no HDDMA ;------------------------- ; if maxmw eq 0 ;if no HDDMA ; getbad: ret ;no bad map to read from disk ; alt: lhld buftrk ;No alternate sector so use selected sector shld alttrk lhld bufsec shld altsec ret ; else ;have a HDDMA ;Check if a device has a bad map ;---------------------p entry address mov a,c ;Move drive into (a) cmp m ;Check if drive in table matches jnz altmis ;Does not match skip this entry inx h ;Point to LSB of alternate track lda buftrk ;Pick up LSB of buffer track cmp m jnz altmis inx h ;Point to MSB alternate track lda buftrk+1 ;Pick up MSB of buffer track cmp m jnz altmis inx h ;Point to LSB of alternate sector lda bufsec ;Pick up LSB of buffer sector cmp m jnz altmis inx h ;Point to MSB of alternate sector lda bufsec+1 ;Pick up MSB of buffer sector cmp m jnz altmis ;Found an alternate sector inx h ;Point to real info on the alternate sector lxi d,alttrk xchg ;MOVLOP (de) = source, (hl) = dest push b lxi b,4 call movbyt ;Move alternate sector info in correct place pop b pop h ret altmis: pop h ;Current alternate did not match lxi d,9 ;Bump pointer by the length of an entry dad d jmp all ;Loop for more ;Bad Map Routines Data Areas ;--------------------------- ; omes: db 0dh, 0ah, th DJDM flopp dis controller Ther i on entr fo eac o ; th th eigh driv tha th controlle ca address Th firs ; fou entrie ar fo th 8 drive an th las fou ar fo th ; 5.25 drives User wit fas steppin 8 drive (SA850/1 o ; slo 5.25 drive (SA400 shoul adjus thi tabl fo optima ; devic performace. ; 2) Each table entry contains four fixed length fields. The fields ; are defined as follows: ; ; tracks This byte contains the number of tracks on the ; drive. Most 8" drives have 77 tracks and ; most 5.25" drives have 35 or 40 tracks. ; ; config This a a flag byte that indicates as to whether ; or not this drive has been configured. Set to ; 0 to force reconfiguration. ; ; step This word contains the stepping rate constant. ; The DJDMA's delay routines tick 34.1 times per ; millisecond. Thus the step constant would be the ; drive manufactors recomended stepping delay times ; 34.1. Example. Shugart ---------- ; 1) This routine is only called by SETDRV ; 2) If the device has a bad sector map then append bad entries to end ; of badmap table. ; 3) This routine is only required for HDDMA. ; getbad: mvi m,1 ;Set drive initilized push b push d lda cpmdrv ;Pick up current drive mov h,a ;Call drive routine to return a pointer to mvi l,d$bad ;the track and sector of the bad map call jumper mov a,h ;If routine returns 0 then the device has ora l ; no bad sector map jz badret mov e,m ;Pick up track number of bad sector map -> (de) inx h mov d,m inx h xchg shld cpmtrk xchg mov a,m ;Pick up sector number of of bad sector map inx h mov h,m mov l,a shld truesec call fill ;Read in bad sector map into the buffer rc lhld badptr ;Pick up bad map pointer lxi d,buffer ;Start at beginning of buffer badl: ldax d ;Pick up an entry from the buffer ora a jz bade ;All done mov a,m ;Pick up entry from bad map table inr a jz overflo ;Bad map o 'BAD MAP OVERFLOW!', 0dh, 0ah, 0 badptr: dw badmap ;Pointer to next available bad map entry endif ;end of Bad Map Routines page ;CBIOS Disk Routines Data Area ;============================= ; ;DPH save area ;------------- ; 1) Each entry is 4 bytes long: ; 0 - LSB of DPH address ; 1 - MSB of DPH address ; 2 - Sector size code (1=128, 2=256, 3=512, 4=1024) ; 3 - Bad map has been initilized (0 = Uninitilized) ; dphtab: rept maxlog*4 db 0 endm page ;************************** ;Begin Disk Driver Routines ;************************** ; ;General Equates and Macros ;========================== ; ;Disk System Dispatch Table Offsets ;---------------------------------- ; The following are offset numbers of Device Specification Tables. ; d$wboot equ 0 ;Warm boot d$stran equ 1 ;Sector translation d$sel1 equ 2 ;Drive select, Return DPH d$sel2 equ 3 ;Drive select d$home equ 4 ;Home drive d$strk equ 5 ;Set track d$ssec equ 6 ;Set sector d$sdma equ 7 ;Set DMA address d$rSA 850's step at 3 ; milliseond intervals. The step constant would be ; 3 * 43.1 or 102. ; ; rfu The next two words are reserved for future use. ; They must be zero. ; ; settle This word is similar to the previously defined ; step word. This specifies the head settle timing ; after the heads have been stepped. Example, ; Shugart's SA 850 head settle time is 15 ; milliseconds. The settle constant would be 15 * ; 34.1 or 512. ; ; 3) An assembler macro (DCONF) has been provided to assist in ; generating the dparam table. This macros parameters are the ; number of tracks, the step rate in milliseconds, and the head ; settle time in milliseconds. For example: ; ; ;Shugart SA 850 ; dconf 77, 3, 15 ;77 tracks, 3 ms step, 15 ms settle ; ; ;Shugart SA 400 ; dconf 35, 40, 10 ;35 tracks, 40 ms step, 10 ms settle ; ; 4) Note: Caution should be used when defining the drive parameters. ; Incorrect definations may damage the floppy disk drive. Morrow ; equ 2Ch ;Enable/disable serial input trksiz equ 2Dh ;Set number of tracks dmsetl equ 2Eh ;Set logical drives readm equ 0A0h ;Read from controller memory writem equ 0A1h ;Write to controller memory ;Define stepping rate equates ;---------------------------- ; dmfste equ 3*341/10 ;SA851 stepping rate constant dmfset equ 15*341/10 ;SA851 settling rate constant ;Define Internal status byte fields ;---------------------------------- ; dms$t0 equ 01000000b ;Track 0 status mask (1 = on trk 0) dms$dd equ 00100000b ;Double density mask (1 = double) dms$wr equ 00010000b ;Double sided track wrap (1 = wrap) dms$ds equ 00001000b ;Double sided status mask (1 = double) dms$hs equ 00000100b ;Hard sectored status mask (1 = hard) dms$ss equ 00000011b ;Sector size code mask ... ;... 0 = 128, 1 = 256, 2 = 512, 3 = 1024 ;Define North Star status byte fields ;------------------------------------ ; dmn$d eq 10000000 ;Doubl densit mask dmn$ds equ 01000000b ;Double sided mask dmn$2x e: lxi h,dmwchn ;Warm boot command channel lxi d,dmwoff call dmcmd ;Execute the channel jnz dmwbad ;Retry lda dmwst0 ;Get track read status lhld dmwst1 ;Track ones status in L ora l cpi 40h jnz dmwbad ;Loop on 'terrible' errors like no disk lxi b,300h ;Move .75 Kbytes of sector 3 lxi d,buffer ;Sector 3 is in our buffer lxi h,ccp+1300h ; and this is where we want it to go call movbyt xra a ret dmwchn: db dmsdma ;Set track 0 DMA address dw ccp-512 ;First track DMA address - boot loader db 0 db rdtrck ;Read track command db 0 ;Track 0 db 0 ;Side 0 db 0 ;Drive 0 dw dmwmap ;Sector load/status map db 0 dmwst0: db 0 ;Track read status db dmsdma dw ccp+dmcod8 ;DMA address for track 1 db 0 db rdtrck db 1 ;Track 1 db 0 ;Side 0 db 0 ;Drive 0 dw dmwmap+26 ;Load map right after track 0 map db 0 dmwst1: db 0 ;Track read status db dmsdma dw buffer ;Sector 3 gets loaded in system buffer db 0 db dmrsec db  Designs takes no responsibility for damage that occures through ; the misuse of this macro. ; dconf macro tracks, step, settle db tracks ;Number of tracks db 0 ;Reset the calibrated flag dw step*341/10 ;Step time dw 0 ;Reserved for future use, must be zero dw 0 ;Reserved for future use, must be zero dw settle*341/10 ;Head settle time endm dmarap: db 0, 10*8 ;Revision 0, length 80 bytes dparam equ $ ;Drive parameter table ; ;Define 8" drive parameters ;-------------------------- ; 1) Use SA800 parameters: 77 tracks, 8 ms step, 8 ms settle ; dconf 77, 8, 8 ;Drive 0 dconf 77, 8, 8 ;Drive 1 dconf 77, 8, 8 ;Drive 2 dconf 77, 8, 8 ;Drive 3 ; ;Define 5.25" drive parameters ;----------------------------- ; 1) Use Tandon parameters: 40 tracks, 5 ms step, 15 ms settle ; 2) Note: Drive 1 is set up for a 20ms step rate and a 25ms head ; settling time so that it will operate properly with our ; soft-sectored drives. ; if mfslow dconf 40, 20, 20 ;Drivqu 00100000b ;CP/M version 2.x mask dmn$ok equ 00010000b ;Validation mask dmn$40 equ 00001000b ;40/80 track mask dmn$dt equ 00000100b ;Double track density mask dmn$xx equ 00000011b ;RFU mask ;Common Subroutines ;------------------ ; Return a pointer to the current drives drive parameter entry ;------------------------------------------------------------- ; dmdpar: lhld dmdriv ;Get the current drive number mvi h,0 ;Drive number is a byte dad h ;Ten bytes per parameter table entry mov d,h mov e,l dad h dad h dad d lxi d,dparam ;Parameter table address dad d ret page if maxdm ne 0 ;Start 8" drive's unique code section ;==================================================================== ;Devic Specificatio Tabl fo DJDMA controlle wit " drives ;============================================================== ; dmdst: db maxdm ;Number of logical drives dw dmwarm ;Warm boot dw dmtran ;Sector translation dw dmldr1 ;Select drive 1 dw dmldr1 ;Track 1 db 3 ;Side 0, sector 3 db 0 ;Drive 0 db 0 ;Read status db dmhalt ;Controller halt command db 0 dmwoff equ $-dmwchn-1 ;Halt offset for the command channel dmwmap: dw -1, -1, 0, 0, 0, 0, 0 ;Do not load the boot loader dw 0, 0, 0, 0, 0, 0 dw 0, -1, -1, -1 ;First 2 sectors on track 2 endif ;end of 8" DJDMA warm boot ;DJDMA 8" sector translation ;--------------------------- ; dmtran: inx b ;Ajust sectors to start at 1 lda dmpsta ;Test for double sided drives ani dms$ds jz dmtrn0 ;Skip if single sided lda dmcspt ;Get SPT/2 sub c ;Test for side one sectors jnc dmtrn0 ;Skip sector adjustment if on side zero cma ;'Knock off' first sides sectors inr a mov c,a mvi b,80h ;Set side one flag dmtrn0: mov l,c ;Make an index to the SECTRAN table mvi h,0 dad d mov l,m ;Load the translated sector mov h,b ;Set the side bit ret ;DJDM 8 driv selec 1 ;----------------------- ; 1) Determin th secto siz an the 0 dconf 40, 20, 20 ;Drive 1 dconf 40, 20, 20 ;Drive 2 dconf 40, 20, 20 ;Drive 3 else dconf 40, 5, 15 ;Drive 0 dconf 40, 5, 15 ;Drive 1 dconf 40, 5, 15 ;Drive 2 dconf 40, 5, 15 ;Drive 3 endif page ;DJDMA equates ;============= ; ;Define DJDMA i/o ports and default channel address ;-------------------------------------------------- ; dmchan equ 50h ;Default channel address dmkick equ 0efh ;Kick I/O port address serin equ 03eh ;Address of serial input data ;Define the channel commands ;--------------------------- ; dmrsec equ 20h ;Read sector command dmwsec equ 21h ;Write a sector command dmstac equ 22h ;Get drive status dmsdma equ 23h ;Set DMA address intrqc equ 24h ;Set Interrupt request dmhalt equ 25h ;Halt command bracha equ 26h ;Channel branch setcha equ 27h ;Set channel address dmserr equ 28h ;Set CRC retry count rdtrck equ 29h ;Read track command wrtrck equ 2Ah ;Write track command serout equ 2Bh ;Serial character ouput senabl 2 ;Select drive 2 dw dmhome ;Home drive dw dmseek ;Seek to specified track dw dmsec ;Set sector dw dmdma ;Set DMA address dw dmread ;Read a sector dw dmwrit ;Write a sector dw nobad ;No bad sector map if dmorder ne 1 ;no warm boot possible ;DJDMA 8" warm boot dummy ;------------------------ ; 1) If 8" DJDMA is not drive A (i.e. dmorder not equal 1) then ; it is not possible to warm boot from 8". So routine not needed. ; dmwarm: ret ;return if called else ;DJDM 8 war boo loader ;------------------------- ; 1) Thi loade load fro th star o th CC (trac secto 5 ; t th en o th BDO (trac sector 3) Onl 76 (3/4k byte ; o trac secto i rea i since th war boo routin i ; no allowe t loa an th CBIO code. ; 2) Secto i rea int th dis buffe an copie int it prope ; restin place. ; dmcod8 equ 22*128 ;Amount of code on track 0 to load dmwarm: call dmsel2 ;Select drive 0 dmwbad numbe o side o th drive ; 2) Retur correc DPH. ; dmldr1: call dmsel2 ;Do logical select call dminit ;Test for a controller jc zret ;Skip if no controller present call dmstat ;Accm:= Djdma_returned_Drive_Status jc zret ;Skip on status check error push psw ani dms$t0 ;Check for track 0 jz dmldr0 ;Skip if not on track 0 (status valid) pop psw ;Clean stack lxi h,1 ;read sector 1 ... shld truesec inx h ;... of track 2 shld cpmtrk ;because track 1 always single density xra a sta rdwr ;force read to get valid drive status call fill ;flush buffer and read jc zret ;exit with error if error call dmdpar ;Get the drive parameter address inx h mvi m,0 ;Decalibrate the drive call dmparm call dmstat ;Accm:= Djdma_returned_Drive_Status jc zret ;If (error eq true) goto error_return push psw dmldr0: pop psw ;Get drive status sta dmpsta ;Set the physical status mode call dmsptr ;Save status in status table mov m,astant inx h mvi m,(high dmfset) call dmparm ;Set drive parameters for the SA850 ret ;DJDMA 8" driver variables ;------------------------- ; dmcspt: db 0 ;CPM sectors per track / 2 ; 8" Disk parameter headers ;-------------------------- ; dphdm0: dw 0 ;translation table address dw 0 dw 0 dw 0 dw dirbuf ;directory buffer dw 0 ;pointer to disk parameter block dw csvdm0 ;scratch pad area for checking changed disks dw alvdm0 ;scratch pad for allocation information dphdm1: dw 0 ;translation table address dw 0 dw 0 dw 0 dw dirbuf ;directory buffer dw 0 ;pointer to disk parameter block dw csvdm1 ;scratch pad area for checking changed disks dw alvdm1 ;scratch pad for allocation information dphdm2: dw 0 ;translation table address dw 0 dw 0 dw 0 dw dirbuf ;directory buffer dw 0 ;pointer to disk parameter block dw csvdm2 ;scratch pad area for checking changed disks dw alvdm2 ;scratch pad for allocation information dphdm3: dw 0 ;tranc+10 ;Load map right after track 0 map db 0 db 0 ;Track read status db dmhalt db 0 mfwlen equ $-mfwchn-1 ;Channel length mfwsec: dw 0ffh, 0, 0, 0, 0 ;Do not load boot loader dw 0, -1, -1, -1, -1 ;first two sectors loaded endif ;DJDMA 5.25" warm boot routine ;DJDMA 5.25" sector translation ;------------------------------ ; mftran: lda dmpsta ;Test for soft sectored media ani dms$hs lxi h,mfxlt1 ;Soft sectored SECTRAN table jz mftrn lda dmpsta ;Test disk density ani dms$dd lxi h,mfxltd ;Double density SECTRAN table jnz mftrn lxi h,mfxlts ;Single density SECTRAN table mftrn: dad b mov l,m ;Load physical sector number mvi h,0 ret ;DJDM 5.25 firs tim select ;----------------------------- ; 1) Thi routin inpecte th disk. I th dis i har sectore ; th th Nort Sta configuratio byt i rea fro trac , ; secto byt 5c I th medi i soft sectore th th ; Morro Design Micr Decisio forma i assumed. ; mfld ani dms$ss ;Mask in sector size bits rlc ;Make a word index push psw ;Used to select a DPB mov e,a mvi d,0 lxi h,xlts ;Table of XLT table pointers dad d push h ;Save pointer to proper XLT call dmgdph ;Get a pointer to the drives DPH pop d ;Copy XLT pointer from table to DPH lxi b,2 call movbyt lxi d,8 ;Offset to DPB pointer dad d push h lda dmpsta ;Test for a double sided drive ani dms$ds lxi d,dpb128s ;Base for single sided DPB's jz dmsok call dmfstp ;Set controller to fast steping mode lxi d,dpb128d ;Base of double sided DPB's dmsok: xchg po ;Restor DPH pointe to DPB pop psw ;Offset to correct DPB (sector size) rlc ;Times 4 rlc ; 8 rlc ; 16 bytes per DPB mov c,a ;Offset to the correct DPB mvi b,0 dad b xchg ;Load the DPB pointer in the DPH mov m,e inx h mov m,d lxi h,15 ;Offset to the sector size code dad d mov c,m dmgdph: lda dmdriv ;Get the DPH pointer lxi d,dphdmslation table address dw 0 dw 0 dw 0 dw dirbuf ;directory buffer dw 0 ;pointer to disk parameter block dw csvdm3 ;scratch pad area for checking changed disks dw alvdm3 ;scratch pad for allocation information endif ;End of 8" drive's unique code page if maxmf ne 0 ;Start of 5" drive's unique code section ;======================================================================= ;Drive specification table for DJDMA 5.25" drives ;================================================ ; mfdst: db maxmf ;Number of logical drives dw mfwarm ;Warm boot dw mftran ;Sector translation dw mfldr1 ;Select drive 1 dw mfsel2 ;Select drive 2 dw dmhome ;Home drive dw mfseek ;Seek to specified track dw mfssec ;Set sector dw dmdma ;Set DMA address dw mfread ;Read a sector dw mfwrit ;Write a sector dw nobad ;No bad sector map if mforder ne 1 ;no warm boot possible ;DJDMA 5.25" warm boot dummy ;--------------------------- ; 1) If 5.25" DJDMA is not r1: call mfsel2 ;Do logical drive select call dminit ;Test for a controller jc zret call dmstat ;Get the drive status byte jc zret ;Error exit if status not good sta dmpsta call dmsptr ;Save in the status table mov m,a ani dms$hs ;Test for hard sectored drives jnz mfld0 ;Skip to hard sectored logger call mfrds1 ;get sector 1 of track 0 lxi h,buffer+80h+25 ;longitudinal parity check the data mvi b,25 ;number of bytes to check xra a ;init long parity mov e,a ;0-check byte mfckl: dcx h ;next byte to check xra m ;get long parity mov d,a ;save parity ora e ;catch any 1 bits in 0-check byte mov e,a ;save 0-check mov a,d ;get parity again dcr b jnz mfckl ;loop for whole table ora a ;tests parity (should be 0 for valid) jnz mfsft ;assume single side if bad table ora e ;test 0-check (should not be all 0) jz mfsft ;assume single side in all 0 table lda buffer+81h ;get Morrow soft sector config byte ani 4 ;0 call retdph ret ;DJDM 8 driv selec 2 ;----------------------- ; 1) Figur numbe o sector_pe_trac믲 fo SECTRAN. ; ; dmldr2: call dmsel2 ;Perform logical drive select call dmgdph ;Load the DPH pointer lxi d,10 ;Offset to the DPB pointer dad d mov a,m ;Load the DPB pointer inx h mov h,m mov l,a mov a,m ;Load the number of CP/M sectors/track rrc ;Divide by two sta dmcspt ;Save CPM SPT ret ;Set the drive's step rate to 3ms ;-------------------------------- ; 1) Th curren driv i doubl sided Thu i i saf t se th ; steppin rat t m wit 1 m settling. ; dmfstp: call dmdpar ;Get the parameter table pointer inx h ;Bump to the drive initialized flag mvi m,0 ;Force reparamitization of this drive inx h ;Offset to the Stepping rate constant mvi m,(low dmfste) ;Fast stepping rate constant inx h mvi m,(high dmfste) lxi d,5 ;Skip over the reserved fields dad d mvi m,(low dmfset) ;Fast settling rate condrive A (i.e. mforder not equal 1) then ; it is not possible to warm boot from 5.25". So routine not needed. ; mfwarm: ret ;return if called else ;DJDM 5.25 war boo loader ;---------------------------- ; 1) Loa fro th star o th CC (trac secto 1 t th en ; o th BDO (trac secto 1). mftrck equ 9*512 ;Amount of code on track 0 mfwarm: call mfsel2 ;Select drive 0 mfwbad: lxi h,mfwchn ;Warm boot command channel lxi d,mfwlen call dmcmd jnz mfwbad ;Loop on 'bad' errors lda mfwst0 cpi 40h jnz mfwbad xra a ;Return no error ret mfwchn: db dmsdma ;Set track 0 DMA address dw ccp-512 ;First track DMA address - boot loader db 0 db rdtrck ;Read track command db 0 ;Track 0 db 0 ;Side 0 db 4 ;mini Drive 0 dw mfwsec ;Sector load/status map db 0 mfwst0: db 0 ;Track read status db dmsdma dw ccp+mftrck ;DMA address for track 1 db 0 db rdtrck db 1 ;Track 1 db 0 ;Side 0 db 4 ;mini Drive 0 dw mfwsecheck double sided indicator mvi a,0a9h ;double sided config byte jnz mfld1 ;skip if double sided mfsft: mvi a,0a1h ;Morrow Soft sectored floppy jmp mfld1 mfld0: call mfrds1 ;get sector 1 of track 0 lda buffer+5Ch ;Get the North Star configuration byte mfld1: ora a ;Old CP/M 1.4 systems did not have a cz mflcl ; configuration byte. This routine cpi 0E5h ; will make a configuration byte for cz mflcl ; these systems. mov c,a lxi h,mfs ;Pointer to configuration table mfld2: mov a,m ;Get an entry ora a ;Check for end of the table jz zret ;Yes, select error cmp c ;Check if entry matches selected drive jz mfld3 ;Match, get entry inx h ;Skip to the next entry inx h inx h inx h jmp mfld2 mfld3: inx h ;Bump to the true configuration byte lda dmpsta ;Get the physical status ora m ;Fill in the fields the hardware can't sta dmpsta ; figure out push h call dmsptr ;Load the status byte into the table mov m,a ingl side floppy Track 3 t 6 ar o sid i reverse ; (e.g Trac 3 i o trac 3 sid 1 and trac 6 i o trac ; sid 1). ; mfseek: xra a ;Clear double sided select flag sta mfsid1 lxi h,dmpsta ;Get the drive status mov a,m ani dms$hs ;Test for hard sectored drives jz dmsoft ;Skip if soft sectored mov a,m ;Test for double sided drives ani dms$ds jz dmseek ;Skip if single sided mov a,m ;Test for track wrap mode ani dms$wr jz dmseek ;Skip if not wrapping mov a,c ;Test for tracks 35-69 cpi 35 jc dmseek ;Skip if less than track 35 mvi a,69 ;Adjust tracks 35 -> 69 to 34 -> 0 sub c mov c,a mvi a,080h ;Set side one flag sta mfsid1 jmp dmseek dmsoft: mov a,m ;get drive status again ani dms$ds ;check for double sided (cy = 0) jz dmseek ;skip if not double sided mov a,c ;get track number rar ;divide by 2 for Morrow soft sectored mov c,a jnc dmseek ;skip if on side 1 mvi a,80h sta mfsid1 ded dw dpbmf4 db 0a9h ;Morrow Designs CP/M 2.x Soft sectored db dms$ds ;Double density, 40 tracks, 2-sided dw dpbmf5 db 0 ;End of configuration table ; Hard sectored single sided sector translation table ; mfxlts: db 1, 2 db 3, 4 db 5, 6 db 7, 8 db 9, 10 db 11, 12 db 13, 14 db 15, 16 db 17, 18 db 19, 20 ; Hard sectored double sided sector translation table ; mfxltd: db 1, 2, 3, 4 db 21, 22, 23, 24 db 5, 6, 7, 8 db 25, 26, 27, 28 db 9, 10, 11, 12 db 29, 30, 31, 32 db 13, 14, 15, 16 db 33, 34, 35, 36 db 17, 18, 19, 20 db 37, 38, 39, 40 ; Soft sectored single sided translation table ; mfxlt1: db 1, 2, 3, 4, 5, 6, 7, 8 db 25, 26, 27, 28, 29, 30, 31, 32 db 9, 10, 11, 12, 13, 14, 15, 16 db 33, 34, 35, 36, 37, 38, 39, 40 db 17, 18, 19, 20, 21, 22, 23, 24 mfsid1: db 0 ;On side one flag ;disk parameter headers ;---------------------- ; dphmf0: dw 0 ;translation table address dw 0 dw 0 dw 0 dw di pop h inx h ;Bump to the DPB pointer mov a,m ;Load the DPB pointer inx h mov h,m mov l,a push h ;Save DPB address call mfgdph ;Get a DPH pointer lxi d,10 ;Offset to DPB address in DPH dad d pop d mov m,e ;Store DPB address in DPH inx h mov m,d call mfgdph ;Get the DPH pointer lda dmpsta ;Get physical status ani dms$ss ;Mask sector size field inr a ;Make CBIOS sector size code mov c,a ret ; ; routine called by first time select to read sector 1 track 0 ; for disk configuration byte checks for hard/soft sectored ; minifloppies. ; mfrds1: lxi h,1 ;Select sector 1 of track 0 shld truesec dcx h shld cpmtrk xra a ;Make sure we are doing a read sta rdwr call fill ;Flush buffer and refill rnc ;return if no error pop h ;flush return address jmp zret ;do error return ; Get the configuration byte for a North Star Disk ;------------------------------------------------- ; 1) This routine is only used by MFLDR1: (mini-f;else indicate side 2 jmp dmseek ;DJDMA 5.25" set sector ;---------------------- ; mfssec: lda dmpsta ;if (drive .eq. soft_sectored) ani dms$hs ; goto sector save routine jz dmsec ;else dcr c ; adjust for first sect = zero jmp dmsec ;DJDMA 5.25" read/write sector ;----------------------------- ; mfread: call mfset ;Set up side flag jmp dmread mfwrit: call mfset ;Set up side flag jmp dmwrit mfset: lda mfsid1 ;Get the side flag lxi h,dmsctr ;Merge with the sector number ora m mov m,a ret ;DJDMA 5.25" driver variables ;---------------------------- ; ;Mini-Floppy Configuration/DPB_Lookup table ; 1) This table is used by the mini-floppy first time select routine ; (mfsldr1) and is used to: ; a) validate the drive configuration byte. ; b) fill in the parameters that can't be determined by doing ; sense drive status (like sensing double sided drives). ; c) returning a pointer to the proper DPB for the media. ; 2) There are four fields per rbuf ;directory buffer dw dpbmf0 ;pointer to disk parameter block dw csvmf0 ;scratch pad area for checking changed disks dw alvmf0 ;scratch pad for allocation information ; dphmf1: dw 0 ;translation table address dw 0 dw 0 dw 0 dw dirbuf ;directory buffer dw dpbmf1 ;pointer to disk parameter block dw csvmf1 ;scratch pad area for checking changed disks dw alvmf1 ;scratch pad for allocation information ; dphmf2: dw 0 ;translation table address dw 0 dw 0 dw 0 dw dirbuf ;directory buffer dw dpbmf2 ;pointer to disk parameter block dw csvmf2 ;scratch pad area for checking changed disks dw alvmf2 ;scratch pad for allocation information ; dphmf3: dw 0 ;translation table address dw 0 dw 0 dw 0 dw dirbuf ;directory buffer dw dpbmf3 ;pointer to disk parameter block dw csvmf3 ;scratch pad area for checking changed disks dw alvmf3 ;scratch pad for allocation information ;disk parameter buffers ;---------------------- ; dpbmf0: dw 20 ;SPT db 3loppy first time ; select ; 2) Nort Sta configuratio byt valu i o a E5 Chec ; physica dis densit an generat correc configuratio byt ; value. ; mflcl: lda dmpsta ;Get physical status ani dms$dd ;Test the double density bit mvi a,10h ;CP/M 1.4 single density configuration rz mvi a,90h ;CP/M 1.4 double density configuration ret ; Return a pointer to the current drives DPH ;------------------------------------------- ; ; 1) This routine is only used by MFLDR1: (mini-floppy first time ; select ; mfgdph: lda dmdriv ;Get the current drive sui 4 ;5.25 drives start at drive 4 lxi d,dphmf0 call retdph ret ;Selec driv # ;--------------- ; 1) Thi drive configure th 1/" drive a drive t 7. ; ; mfsel2: adi 4 ;5.25" drives are drives 4-7 jmp dmsel2 ;Se track ;--------- ; 1) Nort Sta implement doubl side drive b doublin ; th numbe o track t 70 Track t 3 ar o sid lik ; sentry. ; Field_1: Drive configuration byte. ; Field_2: Additional drive parameters that can't be determined ; by doing a sense drive status (i.e. double_sided and ; track_wrap). ; Field_3: Pointer to the appropriate DPB ; mfs: db 10h ;North Star CP/M 1.4 db 0 ;Single density, 35 tracks, 1-sided dw dpbmf0 ;1K groups db 90h ;North Star CP/M 1.4 db 0 ;Double density, 35 tracks, 1-sided dw dpbmf1 ;1K groups db 0b0h ;North Star CP/M 2.x db 0 ;Double density, 35 tracks, 1-sided dw dpbmf2 ;2K groups db 0f0h ;North Star CP/M 2.x db (dms$ds or dms$wr) ;Double density, 35 tracks, 2-sided dw dpbmf3 ;2K groups db 0a0h ;North Star CP/M 2.x (fake 40 track) db 0 ;Double density, 35 tracks, 1-sided dw dpbmf2 ;2K groups db 0d0h ;North Star CP/M 2.x (fake 40 track) db (dms$ds or dms$wr) ;Double density, 35 tracks, 2-sided dw dpbmf3 ;2K groups db 0a1h ;Morrow Designs CP/M 2.x Soft sectored db 0 ;Double density, 40 tracks, 1-si  ;BSH db 7 ;BLM db 0 ;EXM dw 79 ;DSM dw 63 ;DRM db 0C0h ;AL0 db 0 ;AL1 dw 16 ;CKS dw 3 ;OFF db 2 ;SECSIZ ; dpbmf1: dw 40 ;SPT db 3 ;BSH db 7 ;BLM db 0 ;EXM dw 164 ;DSM dw 63 ;DRM db 0C0h ;AL0 db 0 ;AL1 dw 16 ;CKS dw 2 ;OFF db 3 ;SECSIZ ; dpbmf2: dw 40 ;SPT db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 81 ;DSM dw 63 ;DRM db 080h ;AL0 db 0 ;AL1 dw 16 ;CKS dw 2 ;OFF db 3 ;SECSIZ ; dpbmf3: dw 40 ;SPT db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 169 ;DSM dw 63 ;DRM db 080h ;AL0 db 0 ;AL1 dw 16 ;CKS dw 2 ;OFF db 3 ;SECSIZ ; dpbmf4: dw 40 ;SPT db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 94 ;DSM dw 127 ;DRM db 0C0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 4 ;SECSIZ dpbmf5: dw 40 ;SPT db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 194 ;DSM dw 191 ;DRM db 0E0h ;AL0 db 0 ;AL1 dw 48 ;CKS dw 2 ;OFF db 4 ;SECSIZ page endif ;End of 5" drive's unique code section ;===================================================================== ;CSe flopp driv parameters ;---------------------------- ; 1) Thi routin inspect th DPARA tabl an i th driv ; ha no bee calibrate previousl then tha drive trac ; count steppin rate an hea settl tim are loaded. ; dmparm: mvi a,8 ;Eight drives lxi d,1340h ;Controllers drive parameter address lxi h,dparam+1 ;CBIOS's drive parameter table dmstr0: push psw ;Save the drive count mov a,m ;Load flags ora a ;Does the drive need to be calibrated? jnz dmstr1 ;No, do not fiddle around push h ;Save the parameter table pointer push d ;Save the controllers table pointer dcr m ;Set to calibrated mode (0ffh) dcx h ;Back up to the track size byte shld dmntrk ;Set the number of tracks pointer inx h inx h shld dmspar ;Set the stepping constants pointer xchg ;Set the local parameter table pointer shld dmloc0 inx h ;Offset to the stepping parameters inx h inx h inx h shld dmloc1 lxi h,dmwcon ;Write the drive constans routine with: ; DE = offset to the halt status ; HL = pointer to the start of the command ; 2) This routine returns: ; A = command status ; ZF = set on 40 command status value ; dmcmd: call dmdoit ;Do the desired command dcx h ;Back up to the command status byte dcx h mov a,m ;Load the command status byte cpi 40h ;Set flags ret ;Execute a DJDMA command, no command status is returned ;------------------------------------------------------ ; 1) Enter this routine with: ; DE = offset to the halt status ; HL = pointer to the start of the command ; 2) This routine returns no status ; dmdoit: mvi a,bracha ;Branch channel command sta dmchan shld dmchan+1 ;Load command vector xra a ;Clear extended address sta dmchan+3 dad d ;Offset to the halt status mov m,a ;Clear the halt status indicator out dmkick ;Start the controller dmwait: ora m ;Wait for the operation complete status jz dmwait ret ;DJDMA commmand channel routines ;================ommon routines for the DJDMA with 8 and 5.25" drives ;===================================================== ; ;Set up the disk controller ;-------------------------- ; dminit: lxi h,dmchan ;See if the controller will halt mvi m,dmhalt inx h mvi m,0 out dmkick ;Start controller lxi d,0 ;Set up timeout counter dminwt: mov a,m ;Test for status returned ora a jnz dmiok ;Controller has responded dcx d ;Bump timeout counter mov a,d ora e jnz dminwt stc ;Set error flag ret dmiok: call dmparm ;Set the drive parameters lxi h,dmsetu ;Set more parameters lxi d,6 call dmdoit ret ;Return no error (C reset) ;Driv selec two ;----------------- ; 1) 8 drive ar drive 0-3 5.25 drive ar drive 4-7. ; dmsel2: sta dmdriv ;Save the drive name sta dmgsta+1 ;(for sense status command) call dmsptr ;Get status pointer mov a,m sta dmpsta ;Save current status ret ;Seek to track 0 ;--------------- ; dmhome: call dmdpar ;Get the drivets out lxi d,17 ;Halt status offset call dmdoit pop d ;Retrieve the table pointers pop h dmstr1: lxi b,10 ;Bump parameter table pointer dad b xchg lxi b,16 ;Bump controller tables pointer dad b xchg pop psw ;Retrieve drive count dcr a ;Bump count jnz dmstr0 ;Set up next drive ret ;Return the selected drive's status ;---------------------------------- ; 1) The status is returned in the (a) register in the following form: ; ; bit=1 if 7 6 5 4 3 2 1 0 ; -------- ^ ^ ^ ^ ^ ^ ^ ^ ; Reserved ---------------+ | | | | | | | ; on track 0 Track zero ----------------+ | | | | | | ; dbl dens Double density ---------------+ | | | | | ; wrap trk Track wrap flag -----------------+ | | | | ; 2-sided Double sided media -----------------+ | | | ; hard sect Hard sectored media -------------------+ | | ; Sector size MSB --------------------------+ | ; Sector size LSB -----------------------------+ ; 00 = =============== ; ;Set the logical drive assignments and the retry count ;----------------------------------------------------- ; dmsetu: db dmsetl ;Set the logical drive assignments db 0 ;Drives 0-3 are 8", 4-7 are 5.25" db 0 ;Old status db dmserr ;Set the error retry count to 0 db 1 ;One retry (the CBIOS does ten) db dmhalt db 0 ;Get a drive's status ;--------------------- ; dmgsta: db dmstac ;Controller/drive status command db 0 ;Drive to be sensed dmsta1: db 0 ;Status byte 1 dmsta2: db 0 ;Status byte 2 dmsta3: db 0 ;Status byte 3 db 0 ;Return status db dmhalt db 0 ;Set the dma address and then do a read or a write ;------------------------------------------------- ; dmrdwr: db dmsdma ;Set DMA address command dmcdma: dw 0 ;DMA address db 0 ;X-addr dmrwcm: db 0 ;Read/write command filled in dmtrck: db 0 ;Track dmsctr: db 0 ;Sector dmdriv: db 0 ;Drive db 0 ;Status db dmhalt ;Controller halt command db 0 ;Status  parameter address inx h mvi m,0 ;Decalibrate the drive call dmparm ret ;Set track ;--------- ; dmseek: mov a,c ;Set up DJDMA track sta dmtrck ret ;Set sector ;---------- ; dmsec: mov a,c ;Set the sector number + side bit ora b sta dmsctr ret ;Set the DMA pointer ;------------------- ; dmdma: mov h,b ;Set the DMA address mov l,c shld dmcdma ret ;Read/write a sector. ;-------------------- ; 1) Notice that the carry is returned set if there were any ; errors otherwise it is returned cleared. Also notice that ; the accm is equal to the djdma returned status (e.g. 40=no_error) ; dmread: mvi a,dmrsec ;Read sector command jmp dmsrw dmwrit: mvi a,dmwsec ;Write sector command dmsrw: sta dmrwcm ;Set the disk command byte lxi h,dmrdwr ;Read/write command channel address lxi d,10 call dmcmd ;Do the read/write stc ;if (error eq true) rnz ; return (carry_set=ERROR) cmc ;else ret ; return (carry_cleared=NO_ERROR) ;128, 01 = 256, 10 = 512, 11 = 1024 bytes. ; ; 2) 5" drives are always reported as being single sided (because the ; hardware double sided line is not implemented). ; dmstat: lxi h,dmgsta ;Get controller status command lxi d,7 call dmcmd stc ;Set the error flag just in case rnz ;Return on error ;76543210 (STATUS REGISTER BITS) lda dmsta1 ;?????H?? Double density, hard Sectored ani 00010010b ;---D--H- mov l,a ;---D--H- lda dmsta3 ;??0??D?? Track 0, Double sided bits ani 00100100b ;--0--S-- ora l ;--0D-SH- rlc ;-0D-SH-- lxi h,dmsta2 ;-0D-SH-- ora m ;-0D-SHXX Sector size code ret ;Return no error (C reset) ;Return a pointer to the current drives status byte ;-------------------------------------------------- ; dmsptr: lxi d,dmstbl ;Status byte table lhld dmdriv ;Current drive into L mvi h,0 dad d ret ;Execute a DJDMA command, return command status results ;------------------------------------------------------ ; 1) Enter thi!;Write a drive's constants into the controller's memory ;------------------------------------------------------ ; dmwcon: db writem ;Write track size dmntrk: dw 0 ;Number of tracks + desync db 0 ;X-address dw 2 ;Two bytes dmloc0: dw 0 ;Local controller address db writem ;Write stepping rate data dmspar: dw 0 ;Pointer to the stepping parameters db 0 dw 8 dmloc1: dw 0 db dmhalt ;Controller halt db 0 ;Status ;Driver variables ;---------------- ; dmpsta: db 0 ;Physical status for the current drive dmstbl: db 0,0,0,0,0,0,0,0 ;Physical status bytes for each drive endif ;End of djdma routines page if maxfd ne 0 ;Include Discus 2D ? ;*********************************************************** ; Begin the DJ2DB Driver (DDRV2) ;******************************* ; ;DJ2DB equates ;------------- ; 1) The following equates relate the Morrow Designs 2D/B ; controller. If the controller is non standard (0F800H) ; only the FDORIG equate need be changed. ;  boot loader ;------------------------------------ ; fdwarm: mov c,a call fdsel ;Select drive A mvi c,0 ;Select side 0 call fdside wrmfail:call fdhome ;Track 0, single density jc wrmfail ;Loop if error ;The next block of code re-initializes ; the warm boot loader for track 0 mvi a,5-2 ;Initialize the sector to read - 2 sta newsec lxi h,ccp-100h ;First revolution DMA - 100h shld newdma ;Load all of track 0 t0boot: mvi a,5-2 ;First sector - 2 newsec equ $-1 inr a ;Update sector # inr a cpi 27 ;Size of track in sectors + 1 jc nowrap ;Skip if not at end of track jnz t1boot ;Done with this track sui 27-6 ;Back up to sector 6 lxi h,ccp-80h ;Memory address of sector - 100h shld newdma nowrap: sta newsec ;Save the updated sector # mov c,a call fdsec ;Set up the sector lxi h,ccp-100h ;Memory address of sector - 100h newdma equ $-2 lxi d,100h ;Update DMA address dad d nowrp: shld newdma ;Save the updated DMA address mov b,h mov core sector requested pop d ;Restore address of xlt table sideone:xchg ;hl <- &(translation table) dad b ;bc = offset into table mov l,m ;hl <- physical sector mvi h,0 ret sidetwo:call fdgsid ;Check out number of sides jz sidea ;Single sided pop psw ;Retrieve adjusted sector pop b cma ;Make sector request positive inr a mov c,a ;Make new sector the requested sector pop d call sideone mvi a,80h ;Side two bit ora h ; and sector mov h,a ret ;DJ2D/B First Time Drive Select Routine ;-------------------------------------- ; fdldrv: sta fdlog ;Save logical drive mov c,a ;Save drive # mvi a,0 ;Have the floppies been accessed yet ? flopflg equ $-1 ana a jnz flopok mvi b,17 ;Floppies havn't been accessed lxi h,fdboot ;Check if 2D controller is installed mvi a,(jmp) clopp: cmp m ;Must have 17 jumps jnz zret inx h inx h inx h dcr b jnz clopp lxi d,fdinit ;Initialization sequence lxi h,fdorig+7e2h ;Load address lxi b,30 ;Byte ; --NOTE-- 'fdorig' equate moved to top of source module ;fdorig equ 0xxxxh ;Origin of Disk Jockey PROM fdboot equ fdorig+00h ;Disk Jockey 2D initialization fdcin equ fdorig+03h ;Disk Jockey 2D character input routine fdcout equ fdorig+06h ;Disk Jockey 2D character output routine fdhome equ fdorig+09h ;Disk Jockey 2D track zero seek fdseek equ fdorig+0ch ;Disk Jockey 2D track seek routine fdsec equ fdorig+0fh ;Disk Jockey 2D set sector routine fddma equ fdorig+12h ;Disk Jockey 2D set DMA address fdread equ fdorig+15h ;Disk Jockey 2D read routine fdwrite equ fdorig+18h ;Disk Jockey 2D write routine fdsel equ fdorig+1bh ;Disk Jockey 2D select drive routine fdtstat equ fdorig+21h ;Disk Jockey 2D terminal status routine fdstat equ fdorig+27h ;Disk Jockey 2D status routine fderr equ fdorig+2ah ;Disk Jockey 2D error, flash led fdden equ fdorig+2dh ;Disk Jockey 2D set density routine fdside equ fdorig+30h ;Disk Jockey 2D set side routine fdram equ fdorig+400h ;Disk Jockey 2D RAM address dblsid eq,l call fddma ;Set up the new DMA address lxi b,retries*100h+0;Maximum # of errors, track # wrmfred:push b call fdseek ;Set up the proper track call fdread ;Read the sector pop b jnc t0boot ;Continue if no error dcr b jnz wrmfred ;Keep trying if error jmp fderr ;Too many errors, flash the light ;Load track 1, sector 1, sector 3 (partial), sector 2 (1024 byte sectors) t1boot: mvi c,1 ;Track 1 call fdseek lxi b,ccp+0b00h ;Address for sector 1 lxi d,10*100h+1 ;Retry count + sector 1 call wrmread lxi b,ccp+0f00h ;Address for sector 2 lxi d,10*100h+3 ;Retry count + sector 3 call wrmread lxi b,0300h ;Size of partial sector lxi d,ccp+1300h ;Address for sector 3 lxi h,ccp+0f00h ;Address of sector 3 wrmcpy: mov a,m ;Get a byte and stax d ; save it inx d ;Bump pointers inx h dcx b ;Bump counter mov a,b ;Check if done ora c jnz wrmcpy ; if not, loop lxi b,ccp+0f00h ;Address for sector 2 lxi d,10*100h+2 ;Retry count + sector 2 call  count call movbyt ;Load controller RAM mvi a,0ffh ;Start 1791 sta dreg mvi a,clrcmd ;1791 reset sta cmdreg mvi a,1 ;Set 2D initialized flag sta flopflg flopok: call flush ;Flush buffer since we are using it lda fdlog ;Select new drive mov c,a call fdsel call fdlhome ;Recalibrate the drive lxi h,1 ;Select sector 1 of track 2 shld truesec inx h shld cpmtrk xra a ;Make sure we are doing a read sta rdwr call fill ;Fill in buffer with sector jc zret ;Test for error return call fdstat ;Get status on current drive sta fdldst ;Save drive status ani 0ch ;Mask in sector size bits push psw ;Used to select a DPB rar lxi h,xlts ;Table of XLT addresses mov e,a mvi d,0 dad d push h ;Save pointer to proper XLT call fdget ;Get pointer to proper DPH pop d lxi b,2 ;Copy XLT pointer into DPH call movbyt lxi d,8 ;Offset to DPB pointer in DPH dad d ;HL <- &DPH.DPB push h call fdgsid ;Get pointer to side flag table entry lda fdldst u 20h ;Side bit from controller io equ fdorig+3f8h ;Start of I/O registers dreg equ io+1 cmdreg equ io+4 clrcmd equ 0d0h ;***************************************************************; ; ; ; Device Specification Table for the Disk Jockey 2D/B ; ; ; ;***************************************************************; fddst: db maxfd ;Number of logical drives dw fdwarm ;Warm boot dw fdtran ;Sector translation dw fdldrv ;Select drive 1 dw fdsel2 ;Select drive 2 dw fdlhome ;Home drive dw fdseek ;Seek to specified track dw fdssec ;Set sector dw fddma ;Set DMA address dw fdread ;Read a sector dw fdwrite ;Write a sector dw nobad ;No bad sector map if fdorder ne 1 ;no warm boot possible ;DJ2D/B warm boot dummy ;--------------------------- ; 1) If DJ2D/B is not drive A (i.e. fdorder not equal 1) then ; it is not possible to warm boot from DJ2D/B. So routine not needed. ; fdwarm: ret ;return if called else ; DJ2D/B Floppy disk warmwrmread xra a ;Clear error indicator ret wrmread:push d call fddma ;Set DMA address pop b call fdsec ;Set sector wrmfrd: push b ;Save error count call fdread ;Read a sector jc wrmerr ;Do retry stuff on error call fdstat ;Sector size must be 1024 bytes ani 0ch ;Mask length bits sui 0ch ;Carry (error) will be set if < 0c0h wrmerr: pop b ;Fetch retry count rnc ;Return if no error dcr b ;Bump error count jnz wrmfrd jmp fderr ;Error, flash the light endif ;end of DJ2D/B warm boot routine ;DJ2D/B Sector Translate Routine ;------------------------------- ; fdtran: inx b push d ;Save table address push b ;Save sector # call fdget ;Get DPH for current drive lxi d,10 ;Load DPH pointer dad d mov a,m inx h mov h,m mov l,a mov a,m ;Get # of CP/M sectors/track ora a ;Clear carry rar ;Divide by two sub c ;Subtract sector number push psw ;Save adjusted sector jm sidetwo sidea: pop psw ;Discard adjusted sector pop b ;Rest" ;Get drive status ani dblsid ;Check double sided bit mov m,a ;Save sides flag lxi d,dpb128s ;Base for single sided DPB's jz sideok lxi d,dpb128d ;Base of double sided DPB's sideok: xchg pop d ;(HL) -> DPB base, (DE) -> &DPH.DPB pop psw ;Offset to correct DPB ral ral ;Make 0, 10, 20, 30 mov c,a mvi b,0 ;Make offset dad b ;(hl) is now a DPB pointer xchg ;Put proper DPB address in DPH.DPB mov m,e inx h mov m,d lxi h,15 ;Offset to DPB.SIZ dad d mov c,m ;Fetch sector size code fdget: lda fdlog ;Return proper DPH lxi d,dphfd0 jmp retdph ;DJ2D/B Non-Initial Drive Select Routine ;--------------------------------------- ; fdsel2: sta fdlog mov c,a jmp fdsel ;DJ2D/B Home Drive Routine ;------------------------- ; fdlhome:mvi c,0 ;Select side 0 call fdside jmp fdhome ;Do actual home ;DJ2D/B Set Sector Routine ;------------------------- ; fdssec: push b ;Save sector number mov a,b ;Check side select bit rlc ;Move high bit to bit the ; tables are located on track 0 sectors 6 and 8. They are ; loaded into memory in the Cbios ram by the cold boot routine. ; xlt128: db 0 db 1,7,13,19,25 db 5,11,17,23 db 3,9,15,21 db 2,8,14,20,26 db 6,12,18,24 db 4,10,16,22 ; xlt256: db 0 db 1,2,19,20,37,38 db 3,4,21,22,39,40 db 5,6,23,24,41,42 db 7,8,25,26,43,44 db 9,10,27,28,45,46 db 11,12,29,30,47,48 db 13,14,31,32,49,50 db 15,16,33,34,51,52 db 17,18,35,36 ; xlt512: db 0 db 1,2,3,4,17,18,19,20 db 33,34,35,36,49,50,51,52 db 5,6,7,8,21,22,23,24 db 37,38,39,40,53,54,55,56 db 9,10,11,12,25,26,27,28 db 41,42,43,44,57,58,59,60 db 13,14,15,16,29,30,31,32 db 45,46,47,48 ; xlt124: db 0 db 1,2,3,4,5,6,7,8 db 25,26,27,28,29,30,31,32 db 49,50,51,52,53,54,55,56 db 9,10,11,12,13,14,15,16 db 33,34,35,36,37,38,39,40 db 57,58,59,60,61,62,63,64 db 17,18,19,20,21,22,23,24 db 41,42,43,44,45,46,47,48 ;Disk Parameter Buffers ;---------------------- ; 1) Each of the following tables describes db 0 ;EXM dw 561 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 3 ;512 byte sectors ; ;1024 byte sectors, double density, and double sided. ;---------------------------------------------------- ; dp1024d:dw 128 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 599 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 4 ;1024 byte sectors endif page if maxmw ne 0 ;HDDMA controller present ? ;********************************************************** ; Begin the HDDMA Driver (DDRV3) ;******************************* ; ;HDDMA equates ;============= ; ;Specifications for a Seagate Technology 506 if st506 cyl equ 153 ;Number of cylinders heads equ 4 ;Number of heads per cylinder precomp equ 64 ;Cylinder to start write precomensation lowcurr equ 128 ;Cylinder to start low current stepdly equ 30 ;Step delay (0-12.7 milliseconds) steprcl equ 30 ;Recalibrate step delay headdly equ 0 ;Settle delay  zero ani 1 mov c,a call fdside ;Call select side 0 = side A, 1 = Side B pop b jmp fdsec fdgsid: lxi h,fdlsid ;Side flag table lda fdlog ;Drive number push d mov e,a ;Make offset mvi d,0 dad d ;Offset to proper entry pop d mov a,m ;Set up flags ora a ret fdinit: dw 0 ;Initialization bytes loaded onto 2D/B dw 1800h ;Head loaded timeout dw 0 ;DMA address db 0 ;Double sided flag db 0 ;Read header flag db 07eh ;Drive select constant db 0 ;Drive number db 8 ;Current disk db 0 ;Head loaded flag db 9 ;Drive 0 parameters db 0ffh ;Drive 0 track address db 9 ;Drive 1 parameters db 0ffh ;Drive 1 track address db 9 ;Drive 2 parameters db 0ffh ;Drive 2 track address db 9 ;Drive 3 parameters db 0ffh ;Drive 3 track address db 9 ;Current parameters db 0 ;Side desired db 1 ;Sector desired db 0 ;Track desired db 0 ;Header image, track db 0 ;Sector db 0 ;Side db 0 ;Sector dw 0 ;CRC fdlog: db 0 fdldst: db 0 ; a diskette with the ; specified characteristics. ; ;128 byte sectors, single density, and single sided. ;--------------------------------------------------- ; dpb128s:dw 26 ;CP/M sectors/track db 3 ;BSH db 7 ;BLM db 0 ;EXM dw 242 ;DSM dw 63 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 16 ;CKS dw 2 ;OFF db 1 ;128 byte sectors ; ;256 byte sectors, double density, and single sided. ;--------------------------------------------------- ; dpb256s:dw 52 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 2 ;256 byte sectors ; ;512 byte sectors, double density, and single sided. ;--------------------------------------------------- ; dpb512s:dw 60 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 280 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 3 ;512 byte sectors ; ;1024 byte sectors, double density, and single sided. ;------(0-25.5 milliseconds) endif ;Specifications for a Seagate ST412 if st412 cyl equ 306 ;Number of cylinders heads equ 4 ;Number of heads per cylinder precomp equ 128 ;Cylinder to start write precomensation lowcurr equ 128 ;Cylinder to start low current stepdly equ 0 ;Step delay (0-12.7 milliseconds) steprcl equ 30 ;Recalibrate step delay headdly equ 0 endif ;Specifications for an CMI 5619 if cm5619 cyl equ 306 ;Number of cylinders heads equ 6 ;Number of heads per cylinder precomp equ 128 ;Cylinder to start write precomensation lowcurr equ 128 ;Cylinder to start low current stepdly equ 2 ;Step delay (0-12.7 milliseconds) steprcl equ 30 ;Recalibrate step delay headdly equ 0 endif sectsiz equ 7 ;Sector size code (must be 7 for this Cbios) ; 0 = 128 byte sectors ; 1 = 256 byte sectors ; 3 = 512 byte sectors ; 7 = 1024 byte sectors (default) ; f = 2048 byte sectors ;Define controller commands dmaread equ 0 ;Read sector dmawrit equ Floppy drive status byte fdlsid: rept maxfd db 0ffh ;Double sided flag 0 = single, 1 = double endm endif page if (maxfd ne 0) or (maxdm ne 0) ;DJDMA or DJ2DB present? ;*********************************************************************** ; Begin Common Floppy Disk Translation tables and DPB's ;****************************************************** ; ;Sector translation pointer table ;-------------------------------- ; 1) Xlts is a table of address that point to each of the xlt ; tables for each sector size. ; xlts: dw xlt128 ;Xlt for 128 byte sectors dw xlt256 ;Xlt for 256 byte sectors dw xlt512 ;Xlt for 512 byte sectors dw xlt124 ;Xlt for 1024 byte sectors ;Sector translation tables ;------------------------- ; ; 1) Xlt tables (sector skew tables) for CP/M 2.0. These tables ; define the sector translation that occurs when mapping CP/M ; sectors to physical sectors on the disk. There is one skew ; table for each of the possible sector sizes. Currently---------------------------------------------- ; dp1024s:dw 64 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 299 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 4 ;1024 byte sectors ; ;128 byte sectors, single density, and double sided. ;----------------------------------------------------; ; dpb128d:dw 52 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 1 ;128 byte sectors ; ;256 byte sectors, double density, and double sided. ;--------------------------------------------------- ; dpb256d:dw 104 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 486 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 2 ;256 byte sectors ; ;512 byte sectors, double density, and double sided. ;--------------------------------------------------- ; dpb512d:dw 120 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM #1 ;Write sector dmarhed equ 2 ;Find a sector dmawhed equ 3 ;Write headers (format a track) dmalcon equ 4 ;Load disk parameters dmassta equ 5 ;Sense disk drive status dmanoop equ 6 ;Null controller operation reset equ 54h ;Reset controller attn equ 55h ;Send a controller attention chan equ 50h ;Default channel address stepout equ 10h ;Step direction out stepin equ 0 ;Step direction in band1 equ 40h ;No precomp, high current band2 equ 0c0h ;Precomp, high current band3 equ 80h ;precomp, low current track0 equ 1 ;Track zero status wflt equ 2 ;Write fault from drive dready equ 4 ;Drive ready sekcmp equ 8 ;Seek complete ;Drive Specification Table for the HD DMA hard disk controller ;------------------------------------------------------------- ; mwdst: db maxmw*mwlog ;Number of logical drives dw mwwarm ;Warm boot dw mwtran ;Sector translation dw mwldrv ;Select logical drive 1 (First time select) dw mwdrv ;Select logical drive 2 (General select) dw mwhome ;Check if drive ready jnz zret call mwhome ;Home drive lxi d,dphmw0 ;Start of hard disk DPH's lda mwcurl mov l,a mvi h,0 dad h dad h dad h dad h dad d ;(hl) = pointer to DPH mvi c,4 ;Return sector size of 1024 ret ;HDDMA Non-Initial Drive Select Routine ;-------------------------------------- ; mwdrv: sta mwcurl call mwdlog mov a,c sta mwdrive ;Save new selected drive mwsel: mvi a,dmanoop jmp mwprep ;Execute disk command mwdlog: mvi c,0 mwllx: sui mwlog rc inr c jmp mwllx mwstat: mvi a,dmassta ;Sense status operation code jmp mwprep ;Execute disk command ;HDDMA Home Drive Routine ;------------------------ ; mwhome: call mwreset ;Reset controller, do a load constants lxi h,dmarg1 ;Load arguments mvi m,steprcl ;Load step delay (slow rate) inx h mvi m,headdly ;Head settle delay call mwissue ;Do load constants again call mwptr ;Get pointer to current cylinder number mvi m,0ffh ;Fake at cylinder 65535 for max head travel inx sta 42h lhld dmarg0 ;Save the track number push h lxi h,dmasel1 ;Load arguments lda mwdrive ;Get the currently selected drive ori 03ch ;Raise *step and *dir mov m,a ;Save in drive select register lxi d,5 ;Offset to dmarg1 dad d mvi m,stepdly ;Load step delay inx h mvi m,headdly ;Head settle delay inx h mvi m,sectsiz ;Sector size code inx h mvi m,dmalcon ;Load constants command call mwissue ;Do load constants pop h ;Restore the track number shld dmarg0 push psw ;Save status lhld tempb ;Restore memory used for the channel pointer shld chan lda tempb+2 sta chan+2 pop psw ret ;HDDMA Read/Write Sector Routines ;-------------------------------- ; mwread: mvi a,dmaread ;Load disk read commnd jmp mwprep mwwrite:mvi a,dmawrit ;Load disk write command mwprep: sta dmaop ;Save command channel op code mvi c,band1 lhld dmarg0 lxi d,precomp call mwhlcde jc mwpreps mvi c,band2 lxi d,lowcurr call mwhlcde jc mwpreps mvi c,band3Home current selected drive dw mwseek ;Seek to selected track dw mwsec ;Select sector dw mwdma ;Set DMA address dw mwread ;Read a sector dw mwwrite ;Write a sector if heads gt 2 ;Test if drive is big enough for a bad spot map dw mwbad ;Return bad sector map info else dw nobad endif if mworder ne 1 ;no warm boot possible ;HDDMA warm boot dummy ;--------------------------- ; 1) If HDDMA is not drive A (i.e. mworder not equal 1) then ; it is not possible to warm boot from HDDMA. So routine not needed. ; mwwarm: ret ;return if called else ;HDDMA Warm Boot Routine ;----------------------- ; mwwarm: xra a call mwdrv ;Select drive A call mwhome ;Home and reset the drive lxi b,0 ;Make sure we are on track 0 call mwseek xra a sta mwhead ;Select head zero sta mwsectr ;Select sector 1 lxi h,buffer ;Load sector 1 into buffer shld dmadma call mwwread ;Read CCP into buffer rc ;Return if error lxi d,buffer+200h lxi h,ccp lxi b,200h ; h mvi m,0ffh lxi b,0 ;Seek to cylinder 0 call mwseek ;Recal slowly jmp mwreset ;Back to fast stepping mode ;HDDMA Return Bad Map Position Routine ;------------------------------------- ; mwbad: lxi h,mwbtab ;Return pointer to bad sector location ret mwbtab: dw 0 ;Track 0 dw 19 ;Head 2, sector 0 = (2 * SPT + 0) + 1 ;HDDMA Set Track Routine ;----------------------- ; mwseek: call mwptr ;Get track pointer mov e,m ;Get old track number inx h mov d,m dcx h mov m,c ;Store new track number inx h mov m,b mov l,c ;Build cylinder word mov h,b shld dmarg0 ;Set command channel cylinder number mov a,d inr a lxi h,0ffffh jnz mwskip0 mvi c,stepout jmp mwskip mwskip0:mov h,b ;(hl) = new track, (de) = old track mov l,c call mwhlmde mvi c,stepout mov a,h ani 80h ;Check hit bit for negitive direction jnz mwsout ;Step in mvi c,0 jmp mwskip mwsout: call mwneghl mwskip: shld dmastep lda mwdrive ora c sta dmasel0 mvi a,dmanoop ; ;cylinder > low_current mwpreps:lda mwhead ;Load head address sta dmarg2 cma ;Negative logic for the controller ani 7 ;3 bits of head select rlc ;Shove over to bits 2 - 4 rlc ora c ;Add on low current and precomp bits mov c,a lda mwdrive ;Load drive address ora c ;Slap in drive bits sta dmasel1 ;Save in command channel head select lda mwsectr ;Load sector address sta dmarg3 if 0 ;Set to 1 for MW error reporter mwissue:call mwdoit ;Do desired operation rnc ;Do nothing if no error push psw ;Save error info call hexout ;Print status call dspout ; and a space lxi h,dmachan mvi c,16 ;16 bytes of status mwerr: push b push h mov a,m call hexout ;Print a byte of the status line call spout pop h pop b inx h ;Bump command channel pointer dcr c jnz mwerr mvi c,0ah ;Terminate with a CRLF call pout mvi c,0dh call pout pop psw ;Restore error status ret dspout: call spout ;Print two spaces spout: mvi c,' ' ;Print a spacMove 200h bytes call movbyt lxi h,ccp-200h ;Initial DMA address push h xra a push psw ;Save first sector -1 mwwlod: pop psw ;Restore sector pop h ;Restore DMA address inr a sta mwsectr cpi 6 ;Past BDOS ? rz ;Yes, all done inr h ;Update DMA address by 1024 bytes inr h inr h inr h shld dmadma push h push psw call mwwread ;Read in a sector jnc mwwlod ret ;Return with error mwwread:mvi c,retries ;Retry counter mwwerr: push b ;Save the retry count call mwread ;Read the sector pop b rnc dcr c ;Update the error count jnz mwwerr ;Keep trying if not too many errors stc ;Set error flag ret endif ;of HDDMA warm boot routine ;HDDMA First Time Drive Select Routine ;------------------------------------- ; mwldrv: sta mwcurl ;Save current logical drive call mwreset ;Reset controller card jc zret ;Controller failure lda mwcurl call mwdrv ;Select drive jc zret ;Select error call mwstat ;Get drive status ani dready ;No-operation command for the channel call mwprep ;Step to proper track lxi h,0 ;Clear step counter shld dmastep ret ;HDDMA Set DMA Address Routine ;----------------------------- ; mwdma: mov h,b ;Set DMA address mov l,c shld dmadma ret ;HDDMA Set Sector Routine ;------------------------ ; mwsec: mov a,c ;Load sector number dcr a ;Range is actaully 0-16 call mwdspt ;Figure out head number -> (c) adi mwspt ;Make sector number sta mwsectr mov a,c sta mwhead ;Save head number ret mwdspt: mvi c,0 ;Clear head counter mwdsptx:sui mwspt ;Subtract a tracks worth of sectors rc ;Return if all done inr c ;Bump to next head jmp mwdsptx mwreset:lhld chan ;Save the command channel for a while shld tempb lda chan+2 sta tempb+2 out reset ;Send reset pulse to controller lxi h,dmachan ;Address of command channel shld chan ;Default channel address xra a sta chan+2 ;Clear extended address byte shld 40h ;Set up a pointer to the command channel$e jmp pout hexout: push psw ;Poor persons number printer rrc rrc rrc rrc call nibout pop psw nibout: ani 0fh adi '0' cpi '9'+1 jc nibok adi 27h nibok: mov c,a jmp pout mwdoit equ $ else mwissue equ $ ;Do a disk command, handle timeouts + errors endif lxi h,dmastat ;Clear status byte mvi m,0 out attn ;Start the controller lxi d,0 ;Time out counter (65536 retries) mwiloop:mov a,m ;Get status ora a ;Set up CPU flags rm ;Return no error (carry reset) stc rnz ;Return error status xthl ;Waste some time xthl xthl xthl dcx d ;Bump timeout counter mov a,d ora e jnz mwiloop ;Loop if still busy stc ;Set error flag ret mwptr: lda mwdrive ;Get currently select drives track address rlc mov e,a mvi d,0 lxi h,mwtab dad d ;Offset into track table ret mwtran: mov h,b mov l,c inx h ret mwneghl:mov a,h cma mov h,a mov a,l cma mov l,a inx h ret mwhlmde:xchg call mwneghl xchg dad d ct equ 1 ;Read sector wsect equ 5 ;Write sector isbuff equ 8 ;Initialize header buffer pointer ; Function port (52) pstep equ 04h ;Step bit nstep equ 0ffh-pstep ;Step bit mask null equ 0fch ;Null command ; Misc constants hdrlen equ 4 ;Sector header length seclen equ 512 ;Sector data length ; ;Device Specification Table for HDCA controller driver ;----------------------------------------------------- ; hddst: db maxhd*hdlog ;Number of logical drives dw hdwarm ;Warm boot dw hdtran ;Sector translation dw hdldrv ;First time select dw hddrv ;General select dw hdhome ;Home current selected drive dw hdseek ;Seek to selected track dw hdsec ;Select sector dw hddma ;Set DMA address dw hdread ;Read a sector dw hdwrite ;Write a sector dw nobad ;No bad sector map if hdorder ne 1 ;no warm boot possible ;HDCA warm boot dummy ;--------------------------- ; 1) If HDCA is not drive A (i.e. hdorder not equal 1) then ; it is not posana c ; previous state cmp b jnz hdindx2 if m10 ;Memorex M10's have 40 ms head settle dad h ;HL*2 endif if m26 ;Shugart M26's have 30 ms head settle xra a ;HL/2 + HL (same as HL*1.5) mov a,h rar mov d,a mov a,l rar mov e,a dad d endif shld settle ;Save the count for timeout delay endif call hdhome hdl2: lda hdcur ;Load logical drive lxi d,dphhd0 ;Start of hard disk DPH's mvi c,3 ;Hard disk sector size equals 512 bytes jmp retdph dcrc: dcr c ;Conditional decrement C routine ret divlog: mvi c,0 divlx: sui hdlog rc inr c jmp divlx ;HDCA Non-Initial Drive Select Routine ;------------------------------------- ; hddrv: sta hdcur call divlog ;Get the physical drive # hdd2: mov a,c sta hddisk ;Select the drive ori null out hdfunc mvi a,hdfren+hdrun+hdclok+hdwprt ;Write protect out hdcntl ret ;HDCA Home Disk Routine ;---------------------- ; hdhome: call hdptr ;Get track pointer mvi m,0 ;Set trac ret mwhlcde:mov a,h cmp d rnz mov a,l cmp e ret mwtab equ $ ;Collection of track addresses rept maxmw db 0ffh ;Initialize to (way out on the end of the disk) db 0ffh endm db 0ffh mwcurl: db 0 ;Current logical drive mwdrive:db 0ffh ;Currently selected drive mwhead: db 0 ;Currently selected head mwsectr:db 0 ;Currently selected sector dmachan equ $ ;Command channel area dmasel0:db 0 ;Drive select dmastep:dw 0 ;Relative step counter dmasel1:db 0 ;Head select dmadma: dw 0 ;DMA address db 0 ;Extended address dmarg0: db 0 ;First argument dmarg1: db 0 ;Second argument dmarg2: db 0 ;Third argument dmarg3: db 0 ;Fourth argument dmaop: db 0 ;Operation code dmastat:db 0 ;Controller status byte dmalnk: dw dmachan ;Link address to next command channel db 0 ;extended address tempb: ds 4 ;Command Channel Pointer Buffer endif page if maxhd ne 0 ;Want HDC3 or 4 controller included ? ;************************************************************sible to warm boot from HDCA. So routine not needed. ; hdwarm: ret ;return if called else ;HDCA Warm Boot Routine ;---------------------- ; hdwarm: call divlog ;Get physical drive number in (c) xra a lxi h,ccp-200h ;Initial DMA address push h sta head ;Select head zero inr a ; 1 -> (a) push psw ;Save first sector - 1 call hdd2 ;Select drive mvi c,0 call hdhome ;Home the drive hdwrld: pop psw ;Restore sector pop h ;Restore DMA address inr a sta hdsect cpi 13 ;Past BDOS ? rz ;Yes, all done inr h ;Update DMA address inr h shld hdadd push h push psw hdwrrd: lxi b,retries*100h+0 ;Retry counter hdwr: push b ;Save the retry count call hdread ;Read the sector pop b jnc hdwrld ;Test for error dcr b ;Update the error count jnz hdwr ;Keep trying if not too many errors stc ;Error flag ret endif ;HDCA warm boot routine ;HDCA Sector Translate Routine ;----------------------------- ; hdtran: mov h,b ;Seck to zero in hdstat ;Test status ani tkzero ;At track zero ? rz ;Yes if not fujitsu hdstepo:in hdstat ;Test status ani tkzero ;At track zero ? jz hddelay mvi a,1 stc call accok ;Take one step out jmp hdstepo else xra a jmp accok endif if not fujitsu hddelay:lhld settle ;Get hddelay deloop: dcx h ;Wait 20ms mov a,h ora l inx h dcx h jnz deloop ret endif ;HDCA Set Track Routine ;---------------------- ; hdseek: call hdptr ;Get pointer to current track mov e,m ;Get current track mov m,c ;Update the track mov a,e ;Need to seek at all ? sub c rz cmc ;Get carry into direction jc hdtrk2 cma inr a if fujitsu hdtrk2: jmp accok else hdtrk2: call accok jmp hddelay endif accok: mov b,a ;Prep for build call build sloop: ani nstep ;Get step pulse low out hdfunc ;Output low step line ori pstep ;Set step line high out hdfunc ;Output high step line dcr b ;Update repeat count jnz sloo**************** ; Begin the HDCA Driver (DDRV4) ;****************************** ; ;HDCA equates ;------------ ; hdorg equ 50h ;Hard Disk Controller origin hdstat equ hdorg ;Disk Status hdcntl equ hdorg ;Disk Control hdreslt equ hdorg+1 ;Disk Results hdcmnd equ hdorg+1 ;Disk Commands hdskomp equ hdorg+2 ;Seek complete clear port (on HDC4) hdfunc equ hdorg+2 ;Function port hddata equ hdorg+3 ;Data port ; Status port (50) tkzero equ 01h ;Track zero opdone equ 02h ;Operation done complt equ 04h ;Seek complete tmout equ 08h ;Time out wfault equ 10h ;Write fault drvrdy equ 20h ;Drive ready index equ 40h ;Delta index ; Control port (50) hdfren equ 01h ;Enable external drivers hdrun equ 02h ;Enable controllers state machine hdclok equ 04h ;Clock source control bit, high = disk hdwprt equ 08h ;Write protect a drive ; Result port (51) retry equ 02h ;Retry flag ; Command port (51) idbuff equ 0 ;Initialize data buffer pointer rsetor translation is handled via mov l,c ; physical sector header skewwing inx h ret ;HDCA First Time Drive Select Routine ;------------------------------------ ; hdldrv: sta hdcur ;Save logical disk call divlog ;Divide by logical disks per drive mov a,c sta hddisk ;Save new physical drive call hdptr ;Get track pointers mov a,m ;Get current track inr a ;Check if -1 jnz hdl2 ;Nope, allready accessed ori null ;Select drive out hdfunc mvi a,hdfren+hdclok ;Enable drivers out hdcntl mvi c,239 ;Wait 2 minutes for disk ready lxi h,0 hdtdel: dcx h mov a,h ora l cz dcrc jz zret ;Drive not ready error in hdstat ;Test if ready yet ani drvrdy jnz hdtdel if not fujitsu lxi h,0 ;Time one revolution of the drive mvi c,index in hdstat ana c mov b,a ;Save current index level in B hdinxd1:in hdstat ana c cmp b ;Loop untill index level changes jz hdinxd1 hdindx2:inx h in hdstat ;Start counting untill index returns to %p ;Keep going the required # of tracks jmp wsdone ;HDCA Set DMA Address Routine ;---------------------------- ; hddma: mov h,b ;Save the DMA address mov l,c shld hdadd ret wsdone: in hdstat ;Wait for seek complete to finish ani complt jz wsdone in hdskomp ;Clear sdone bit on an HDCA4 ret ;HDCA Set Sector Routine for M26 Disk ;------------------------------------ ; if m26 hdsec: mvi a,01fh ;For compatibility with Cbios revs. ; 2.3 and 2.4 ana c ;Mask in sector number (0-31) cz getspt ;Translate sector 0 to sector 32 sta hdsect ;Save translated sector number (1-32) mvi a,0e0h ;Get the head number ana c rlc rlc rlc sta head ;Save the head number getspt: mvi a,hdspt ret else ;HDCA Set Sector Routine for M10 and M20 Disks ;--------------------------------------------- ; hdsec: mov a,c call divspt adi hdspt ana a cz getspt sta hdsect mov a,c sta head getspt: mvi a,hdspt dcr c ret divspt: mvi c,0 divsxdb 0 ;Current physical disk number head: db 0 ;Current physical head number hdsect: db 0 ;Current physical sector number hdtrak: db 0ffh ;Track pointer for each drive db 0ffh ;All drive default to an uncalibrated db 0ffh ; state (ff) db 0ffh settle: dw 0 ;Time delay constant for head settle endif page ;******************** ; End of Disk Drivers ;******************** ; ; Cbios ram locations that don't need initialization. ;==================================================== ; if nostand ne 0 ;Unallocated writting variables unaloc: db 0 ;Unallocated write in progress flag oblock: dw 0 ;Last unallocated block number written unadrv: db 0 ;Drive that the block belongs to endif cpmsec: dw 0 ;CP/M sector # cpmdrv: db 0 ;CP/M drive # cpmtrk: dw 0 ;CP/M track # truesec:dw 0 ;Physical sector that contains CP/M sector error: db 0 ;Buffer's error status flag bufdrv: db 0 ;Drive that buffer belongs to buftrk: dw 0 ;Track that buffer belongs to bufs ;OFF db 3 ;SECSIZ endif endif ;End of HD DPH's and DPB's ; DPH's for DJ2DB ;---------------- ; if maxfd ne 0 dn set 0 rept maxfd dphgen fd,%dn,0,0 dn set dn+1 endm endif if maxmw ne 0 ;***************************************************************; ; ; ; mwsectp is the number of 128 byte sectors per cylinder. ; ; mwsectp = 72 * heads ; ; ; ; mwtrks is the total number of data cylinders. ; ; mwtrks = tracks - 1 ; ; ; ;***************************************************************; if st506 ne 0 mwsecpt equ 288 ;Sectors per track mwtrks equ 152 ;Total data tracks endif if st412 ne 0 mwsecpt set 288 mwtrks set 305 endif if cm5619 ne 0 mwsecpt set 432 mwtrks set 305 endif dphdsk set 0 ;Generate DPH's for the HDDMA hard disks rept maxmw ldsk set 0 rept mwlog dphgen mw,%dphdsk,dpbmw,%ldsk dphdsk set dphdsk+1 ldsk set ldsk+1 endm endm off set 1 ;Initial system track offset trkoff set 81: sui hdspt rc inr c jmp divsx endif ;HDCA Read Sector Routine ;------------------------ ; hdread: call hdprep rc xra a out hdcmnd cma out hddata out hddata mvi a,rsect ;Read sector command out hdcmnd call process rc xra a out hdcmnd mvi b,seclen/4 lhld hdadd in hddata in hddata rtloop: in hddata ;Move four bytes mov m,a inx h in hddata mov m,a inx h in hddata mov m,a inx h in hddata mov m,a inx h dcr b jnz rtloop ret ;HDCA Write Sector Routine ;------------------------- ; hdwrite:call hdprep ;Prepare header rc xra a out hdcmnd lhld hdadd mvi b,seclen/4 wtloop: mov a,m ;Move 4 bytes out hddata inx h mov a,m out hddata inx h mov a,m out hddata inx h mov a,m out hddata inx h dcr b jnz wtloop mvi a,wsect ;Issue write sector command out hdcmnd call process rc mvi a,wfault ana b stc rz xra a ret process:in hdstat ;Wait for command to finish mov b,a ani opdone ec: dw 0 ;Sector that buffer belongs to alttrk: dw 0 ;Alternate track altsec: dw 0 ;Alterante sector lastdrv:db 0 ;Last selected drive ;***************************************************************; ; ; ; DPB and DPH area. ; ; ; ;***************************************************************; if maxhd ne 0 dphdsk set 0 ;Generate DPH's for the HDCA hard disks rept maxhd ldsk set 0 rept hdlog dphgen hd,%dphdsk,dpbhd,%ldsk ldsk set ldsk+1 dphdsk set dphdsk+1 endm endm if m26 ne 0 dpbhd0: dw 1024 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2015 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 3 ;SECSIZ dpbhd1: dw 1024 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2015 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 64 ;OFF db 3 ;SECSIZ dpbhd2: dw 1024 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2047 ;DSM dw 511 ;DRM92/(mwsecpt/8)+1 ;The number of tracks in a partition blocks set mwsecpt/8*mwtrks ;The number of blocks on the drive psize set trkoff*(mwsecpt/8) ;The number of blocks in a partition ldsk set 0 rept blocks/8192 ;Generate some 8 megabyte DPB's dpbgen mw,%ldsk,%mwsecpt,5,31,1,2047,1023,0ffh,0ffh,0,%off,4 off set off+trkoff blocks set blocks-psize ldsk set ldsk+1 endm blocks set blocks/4 if blocks gt 256 ;If there is any stuff left, then use it blocks set blocks-1 dpbgen mw,%ldsk,%mwsecpt,5,31,1,%blocks,1023,0ffh,0ffh,0,%off,4 endif endif ;********************************************************* ;Begin Definitions for the Console and List Device Drivers ;********************************************************* ; ;Define Printer Character Constants ;---------------------------------- acr equ 0Dh ;Carriage return alf equ 0Ah ;Line Feed clear equ 1Ah ;Clear screen on an ADM 3 xoff equ 13h ;Xoff character xon equ 11h ;Xon character if (contyp eq 2) or (lsttyp ge 2) ;Mu jz process mvi a,hdfren+hdrun+hdclok ;Write protect out hdcntl in hdstat ani tmout ;Timed out ? stc rnz in hdreslt ani retry ;Any retries ? stc rnz xra a ret hdprep: in hdstat ani drvrdy stc rnz mvi a,isbuff ;Initialize pointer out hdcmnd call build ori 0ch out hdfunc lda head out hddata ;Form head byte call hdptr ;Get pointer to current drives track mov a,m ;Form track byte out hddata ana a mvi b,80h jz zkey mvi b,0 zkey: lda hdsect ;Form sector byte out hddata mov a,b out hddata mvi a,hdfren+hdrun+hdclok ;Write protect out hdcntl mvi a,hdfren+hdrun+hdclok+hdwprt ;Write protect out hdcntl xra a ret hdptr: lhld hddisk ;Get a pointer to the current drives mvi h,0 ; track position xchg lxi h,hdtrak dad d ret build: lda head ;Build a controller command byte ral ral ral ral lxi h,hddisk ora m xri 0f0h ret hdcur: db 0 ;Current logical disk hdadd: dw 0 ;DMA address hddisk:  db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 127 ;OFF db 3 ;SECSIZ endif if m10 ne 0 dpbhd0: dw 336 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1269 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 3 ;SECSIZ dpbhd1: dw 336 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1280 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 122 ;OFF db 3 ;SECSIZ endif if m20 ne 0 dpbhd0: dw 672 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2036 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 3 ;SECSIZ dpbhd1: dw 672 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2036 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 98 ;OFF db 3 ;SECSIZ dpbhd2: dw 672 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1028 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 195 &ltio or Wunderbuss ;Multio/Wunderbuss Equates ;------------------------- ; The following equates will define the Decision I mother ; board I/O or the Multi I/O environments if needed. ; ;Location Definitions ;-------------------- mbase equ 48h ;Base address of Multi I/O or Decision I rbr equ mbase ;Read data buffer thr equ mbase ;Tranmitter data buffer dll equ mbase ;Divisor (lsb) strobe equ mbase ;parallel port strobe out status equ mbase ;parallel port status in dlm equ mbase+1 ;Divisor (msb) ier equ mbase+1 ;Interupt enable register sensesw equ mbase+1 ;Sense switches, only in gp 06 data equ mbase+1 ;parallel port data buffer clk equ mbase+2 ;WB14 printer select port lcr equ mbase+3 ;Line control register mcr equ mbase+4 lsr equ mbase+5 ;Line status register msr equ mbase+6 grpsel equ mbase+7 ;Group select port ; ;Define Transmitter/Reciever Mask Bytes ;-------------------------------------- dr equ 01h ;Line status DR bit cts equ 10h ;Clear to send dsr equ 20houtines and the parameter passing conventions. ; ; The console initialization routine (conint) is usually placed ; just after the cold boot loader. ; conin: jmp $ ;Console input conout: jmp $ ;Console output const: jmp $ ;Console input status conint: jmp $ ;Console initialization ds 116 ;(reserve the remaining space) endif ;End of Patch Area Console Routines if contyp eq 2 ;**************************************************** ;Begin Multi I/O or Decision I Console Driver (CDRV2) ;**************************************************** ; 1) This driver on cold boot will inspect bits 1-3 of the sense ; switches. If the value found is in the range 0-6 then the ; console baud rate will be taken from the rate table. Otherwise ; the baud rate will be set from the DEFCON word which is found ; just below the regular Cbios jump table. The standard divisor ; table is given below. ; ; Sense switch: 123 (0 = off, 1 = on) ; 000 = 110 ; 001 = 300 ; 010 = 1 mvi a,7Fh ;For masking out parity ana m ret ;Console Output ;-------------- ; conout: lxi h,dmchot+1 ;Character output location mov a,c ani 7fh mov m,a ;store character in command dcx h ;Back up to start of command lxi d,4 ;offset to returned status call dmdoit ;Write a character ret ;Console Status ;-------------- ; const: lda serin+1 ;Pick up serial input status ora a rz ;If zero then no character ready mvi a,0FFh ;Set character ready ret ;DJDMA Command Strings For Console I/O ;------------------------------------- ; dmchot: db serout ;Serial output command db 0 ;The character to be output db 0 ;dummy status db dmhalt ;Halt Command db 0 ;returned status endif ;End of DJDMA Console Driver if contyp eq 5 ;**************************************** ;Begin Switchboard Console Driver (CDRV5) ;**************************************** ; ;Swithboard Equates ;------------------ ; swbase equ 0 ;Base of the SWITCHBOARD ;Console Inp ;Data set ready thre equ 20h ;Status line THRE bit dlab equ 80h ;Divisor latch access bit ; wls0 equ 1 ;Word length select bit 0 wls1 equ 2 ;Word length select bit 1 for 8 bit word stb equ 4 ;Stop bit count - 2 stop bits ; ; Define Modem Control Register bits ;----------------------------------- dtrenb equ 1 ;DTR enable rtsenb equ 2 ;RTS enable ; ;Define group select Masks ;------------------------- spp equ 0 ;select parallel port s0 equ 01h ;Group number (0-3) s1 equ 02h smask equ 03h bank equ 04h enint equ 08h restor equ 10h ;Printer restore on Multi I/O busy equ 20h ;parallel printer busy mask denable equ 20h ;Driver enable on Multi I/O ; ;Group Port Assignments ;---------------------- congr eq ;Consol por (1=p1 2=p2 3=p3) lstgrp equ 3 ;Printer port (1=p1, 2=p2, 3=p3) endif ;For Multio/Wunderbuss Definitions page ;**************************** ;Begin Console Device Drivers ;**************************** if contyp eq 0 ;********************200 ; 011 = 2400 ; 100 = 4800 ; 101 = 9600 ; 110 = 19200 ; defcon = 9600 ; ; 2) If you are using a Multio then the switches will not be ; available so the baud rate will be taken from DEFCON. ; ;Console input ;------------- ; db 0 ;used by swap.com conin: call const ;select console and test for char jz conin in rbr ;Read character ani 7fh ;Strip parity ret ;Console Output ;-------------- ; db 1 ;used by swap.com conout: call conost ;Select console and test status jz conout mov a,c ;Character is in (c) ani 7fh out thr ;Output to transmitter buffer ret ;Console Status ;-------------- ; 1) Returns zero if character is not ready to be read; Otherwise, ; this routine returns 255 indicating a ready condition. ; const: call selcon ;Select console in lsr ;Read status register ani dr rz ;No charactter ready mvi a,0ffh ;Character ready ret ;Console Output Status Routine ;----------------------------- ; conost: call selcout ;------------- ; conin: in swbase+2 ;Get switchboard status ani 4 ;Test for data ready jz conin in swbase ;Get a character ani 7Fh ;Strip off parity ret ;Console Output ;-------------- ; conout: in swbase+2 ;Check status ani 8 ;Wait till output buffer empty jz conout mov a,c ;Write a character ani 7fh out swbase ret ;Console Status ;-------------- ; const: in swbase+2 ;Get the first ports status ani 4 ;Mask the data ready bits rz ;Return console not ready mvi a,0ffh conint: ret ;NULL terminal initialization endif ;End of Switchboard Console Driver if contyp eq 6 ;*************************************** ;Begin North Star Console Driver (CDRV6) ;*************************************** ; ;General Information ;=================== ; The following code implements the North Star console I/O system. ; This system is for users who purchase a Morrow Designs disk ; system to replace their North Star disk system. The Mapping of ; the logical to**** ;Begin Prom Patch (CDRV0) ;************************ ; This driver simply defines the four jumps normally needed to get to ; your actual console drivers. The assumption is that you already have ; these drivers in a ROM; And, furthermore, that the ROM'ed drivers ; exactly match the specs given in the CPM alteration guide for CONIN, ; CONOUT and CONST. Conint is involked during the cold boot process. ; conin: jmp $ ;Console input conout: jmp $ ;Console output const: jmp $ ;Console input status conint: jmp $ ;Console initialization endif ;End of Prom Patch Console Routines if contyp eq 1 ;*********************************** ;Begin Patch Area (128 byte) (CDRV1) ;*********************************** ; This driver provides you with a 128 byte area for patching in your ; own i/o routines. This first 12 bytes are taken up by jumps to the ; appropriate routines (CONIN, CONOUT and CONST). See the CPM user ; reference manual section on system alteration for a description of ; these rn in lsr ani thre rz mvi a,0ffh ret ;Console Select Routine ;---------------------- ; selcon: lxi d,group ;pass to application ldax d ori congrp out grpsel ret endif ;End of Multio/Wunderbuss Console Driver if contyp eq 3 ;********************************** ;Begin DJ2DB Console Driver (CDRV3) ;********************************** ; ;Console Input ;------------- ; conin: jmp fdcin ;Console input ;Console Output ;-------------- ; conout: mov a,c ani 7fh mov c,a jmp fdcout ;Console output ;Console Status ;-------------- ; const: call fdtstat ;Console status mvi a,0ffh rz inr a ret endif ;End of DJ2DB Console Driver if contyp eq 4 ;********************************** ;Begin DJDMA Console Driver (CDRV4) ;********************************** ; ;Console Input ;------------- ; conin: lxi h,serin+1 ;Serial input status xra a ci2: cmp m ;Wait till 40h deposited at 3fH jz ci2 mov m,a ;Clear status dcx h ;Point to input data ' physical entry points is performed as follows: ; ; Device name Left Right Parallel ; serial serial port ; ; Console CON: = TTY: CRT: UC1: ; Reader RDR: = TTY: PTR: UR1: ; Punch PUN: = TTY: PTP: UP1: ; List LST: = TTY: CRT: UL1: ; ; For example, to use a printer connected to the right serial port, ; use the CP/M command: ; ; STAT LST:=CRT: ; ; Likewise, the CP/M command "STAT LST:=UL1:" is used if you have a ; printer connected to the parallel port. ; ;North Star Equates ;================== ; nsldat equ 2 ;Left serial port data port nslsta equ 3 ;Left serial port status port nsrdat equ 4 ;Right serial port data port nsrsta equ 5 ;Right serial port status port nsstbe equ 1 ;Transmitter buffer empty status bit nssrbr equ 2 ;Reciever buffer ready status bit ;See the 8251 data sheets for more ; configuration information. nslin1 equ 0ceh ;Left serial port initialization # 1 nsrin1 equ 0ceh ;Right serial port initialization # 1 ;76543210 Bit defition on the STAT ; command and in the "CP/M Interface Guide" in the IOBYTE section. ; The device function postfixes are as follows. ; ; devSET Initial device setup and initialzation ; devIN Read one character from the device ; devOUT Write one character to the device ; devIST Return the device character input ready status ; devOST Return the device character output ready status ; ; The setup routine initializes the device and returns. The input ; routine returns one character in the A register (parity reset). ; The output routine write one character from the C register. The ; input status routine returns in the A register a 0 if the device ; does not have a character ready for input for 0ffh if a character ; is ready for input. The output status routine returns in the A ; register a 0 if the device is not ready accept a character and a ; 0ffh if the device is ready. The input and output routines ; should wait untill the device is ready for the desired operation ; before the doing t ; IOBYTE: 76543210 dw ttyist ;RDR: = TTY: xxxx00xx dw ptrist ;RDR: = PTR: xxxx01xx dw ur1ist ;RDR: = UR1: xxxx10xx dw ur2ist ;RDR: = UR2: xxxx11xx ;Punch Output ;----------- ; punout mv e, ;Punc output call redir ; IOBYTE: 76543210 dw ttyout ;PUN: = TTY: xx00xxxx dw ptpout ;PUN: = PTP: xx01xxxx dw up1out ;PUN: = UP1: xx10xxxx dw up2out ;PUN: = UP2: xx11xxxx ;List Output ;----------- ; lstout: mvi e,3 ;List output call redir ; IOBYTE: 76543210 dw ttyout ;LST: = TTY: 00xxxxxx dw crtout ;LST: = CRT: 01xxxxxx dw lptout ;LST: = LPT: 10xxxxxx dw ul1out ;LST: = UL1: 11xxxxxx ;List Status ;----------- ; lstost mv e, ;Lis outpu status call redir ; IOBYTE: 76543210 dw ttyost ;LST: = TTY: 00xxxxxx dw crtost ;LST: = CRT: 01xxxxxx dw lptost ;LST: = LPT: 10xxxxxx dw ul1ost ;LST: = UL1: 11xxxxxx ;Redirect the I/O ;---------------- ; redir: lda iobyte ;Get the INTEL standard iobyte redir0: rlc ;Shift the nations ;11001110 Default configuration ;xxxxxx00 Synchronous mode ;xxxxxx01 1X clock rate ;xxxxxx10 16X clock rate ;xxxxxx11 64X clock rate ;xxxx00xx 5 bit characters ;xxxx01xx 6 bit characters ;xxxx10xx 7 bit characters ;xxxx11xx 8 bit characters ;xxx0xxxx Parity disbable ;xxx1xxxx Parity enable ;xx0xxxxx Odd parity generation/check ;xx1xxxxx Even parity generation/check ;00xxxxxx Invalid ;01xxxxxx 1 stop bit ;10xxxxxx 1.5 stop bits ;11xxxxxx 2 stop bits nslin2 equ 37h ;Left serial port initialization # 2 nsrin2 equ 37h ;Right serial port initialization # 2 ;76543210 Bit definations ;00110111 Default configuration ;xxxxxxx1 Enable transmitter ;xxxxxx1x Assert DTR; ;xxxxx1xx Enable reciever ;xxxx1xxx Send break character, TxD low ;xxx1xxxx Reset PE, OE, FE error flags ;xx1xxxxx Assert RTS; ;x1xxxxxx Internal reset ;1xxxxxxx Enter hunt mode (for sync) nspdat equ 0 ;Phe operation and returning. ; ; Not all of these functions need to be implemented for all the ; devices. The following is a table of the entry points needed for ; each device handler. ; ; device setup input output input output ; name status status ; ; CON: CONIN CONOUT CONIST ; RDR: RDRIN RDRIST ; PUN: PUNOUT ; LST: LSTOUT LSTOST ; ; TTY: TTYSET TTYIN TTYOUT TTYIST TTYOST ; CRT: CRTSET CRTIN CRTOUT CRTIST CRTOST ; UC1: UC1SET UC1IN UC1OUT UC1IST ; ; PTR: PTRSET PTRIN PTRIST ; UR1: UR1SET UR1IN UR1IST ; UR2: UR2SET UR2IN UR2IST ; ; PTP: PTPSET PTPOUT ; UP1: UP1SET UP1OUT ; UP2: UP2SET UP2OUT ; ; LPT: LPTSET LPTOUT LPTOST ; UL1: UL1SET UL1OUT UL1OST ; ; The CONIN, CONOUT, CONIST, RDRIN, RDRIST, PUNOUT, LSTOUT, and ; LSTOST routines are the logical device driver entry points ; provided by this device mapper. The other entry names must be ; provided by the physical device drivers. ; ;Console Input ;------------- ; conin: mvi e,1 ;Consonext field in dcr e ;Bump the shift count jnz redir0 redir1: ani 110b ;Mask the redirection field mov e,a ;Make the word table offset mvi d,0 pop h ;Get the table base dad d ;Offset into our table mov a,m ;Load the low level i/o routine pointer inx h mov h,m mov l,a pchl ;Execute the low level i/o driver ;Left serial port routines. Use TTY: device. ;-------------------------------------------- ; ttyin: in nslsta ;Read a character ani nssrbr jz ttyin ;Wait till a character is ready in nsldat ;Get the character ani 7fh ;Strip parity ret ttyout: in nslsta ;Write a character ani nsstbe jz ttyout ;Wait till the buffer is empty mov a,c ;Write the character ani 7fh out nsldat ret ttyist: in nslsta ;Return input buffer status ani nssrbr rz ;Return not ready mvi a,0ffh ret ;There is a character ready ttyost: in nslsta ;Return output buffer status ani nsstbe rz ;Return not ready mvi a,0ffh ret ;Rearallel data port nspsta equ 6 ;Parallel status port nsprbr equ 1 ;Reciever buffer ready status bit nsptbe equ 2 ;Transmitter buffer empty status bit nsram equ 0c0h ;North Star memory parity port, ; set to 0 for no North Star RAM ;North Star IOBYTE Implementation ;================================ ; The following code performs the mapping of logical to physical ; serial I/O devices. The physical entry points are CONIN, CONOUT, ; CONIST, RDRIN, PUNOUT, LSTOUT, and LSTOST. These entry points ; are mapped via the Intel standard I/O byte (IOBYTE) at location 3 ; in the base page to the low level device drivers. ; ; Note: A naming convention has been chosen to reduce label ; colisions. The first three characters of a name indicate the ; device drivers name, the following three characters indicated the ; function performed by that particular device routine. The device ; names are defined and described in the "An Introduction to CP/M ; Features and Facilities" manual in the secle input call redir ; IOBYTE: 76543210 dw ttyin ;CON: = TTY: xxxxxx00 dw crtin ;CON: = CRT: xxxxxx01 dw rdrin ;CON: = BAT: xxxxxx10 dw uc1in ;CON: = UC1: xxxxxx11 ;Console Output ;-------------- ; conout: mvi e,1 ;Console output call redir ; IOBYTE: 76543210 dw ttyout ;CON: = TTY: xxxxxx00 dw crtout ;CON: = CRT: xxxxxx01 dw lstout ;CON: = BAT: xxxxxx10 dw uc1out ;CON: = UC1: xxxxxx11 ;Console Status ;-------------- ; const: mvi e,1 ;Console input status call redir ; IOBYTE: 76543210 dw ttyist ;CON: = TTY: xxxxxx00 dw crtist ;CON: = CRT: xxxxxx01 dw rdrist ;CON: = BAT: xxxxxx10 dw uc1ist ;CON: = UC1: xxxxxx11 ;Reader Input ;------------ ; rdrin: mvi e,7 ;Reader input call redir ; IOBYTE: 76543210 dw ttyin ;RDR: = TTY: xxxx00xx dw ptrin ;RDR: = PTR: xxxx01xx dw ur1in ;RDR: = UR1: xxxx10xx dw ur2in ;RDR: = UR2: xxxx11xx ;Reader Status ;------------- ; rdrist: mvi e,7 ;Reader input status call redir (turn ready ;Right serial port routines. Use CRT:, PTR:, and PTP: devices. ;-------------------------------------------------------------- ; crtin: ptrin: in nsrsta ;Read a character ani nssrbr jz crtin ;Wait till a character is ready in nsrdat ;Get the character ani 7fh ;Strip parity ret crtout: ptpout: in nsrsta ;Write a character ani nsstbe jz crtout ;Wait till the buffer is empty mov a,c ;Write the character ani 7fh out nsrdat ret crtist: ptrist: in nsrsta ;Return input buffer status ani nssrbr rz ;Return not ready mvi a,0ffh ret ;There is a character ready crtost: in nsrsta ;Return output buffer status ani nsstbe rz ;Return not ready mvi a,0ffh ret ;Return ready ;Parallel Port Routines ;---------------------- ; Use UC1: UR1: UP1: UP2: LPT: and UL1: devices. ; uc1in: ur1in: ur2in: in nspsta ;Read a character ani nsprbr jz uc1in ;Wait till a character is ready in nspdat ;Get the character push psw A). The LSTSET routine is used ; for initialization code. It should execute a RET when complete. ; ; The LSTSET routine could be placed just below the CBOOT routine. ; This space (below CBOOT) is recyled for use as a disk buffer ; after CBOOT is done. ; ; These routines all point to lstskp initially so that the system ; won't hang up, waiting for a non-existant list device to become ; ready. ; lstout: jmp lstskp ;Printer output lstost: jmp lstskp ;Printer output status lstset: jmp lstskp ;Printer initialization lstskp: ret ds 118 ;(reserve the remaining space) endif ;End of Patch Area for List Drivers if (lsttyp ge 2) and (lsttyp le 5) ;***************************************************** ;Begin Other List Devices (LDRV2, LDRV3, LDRV4, LDRV5) ;***************************************************** ; All other list devices are Multio/Wunderbuss Serial I/O With ; different types of i/o protocols. ; Altered rev E4, lsttyp 2 thru 5 always include centronics punch ; NOTE: firstnactive) ret pmult: mov a,c ;Print the character out strobe ;really 'data' mvi a,0BFh out data ;strobe low (asserted) (really strobe) xthl xthl ;stall 10 us mvi a,0FFH out data ;strobe high (inactive) (really strobe) ret ;Punch Status ;----------- ; punost: lxi d,group ;pass to application ldax d out grpsel ;select parallel printer group in status ani busy rz ;Return busy if buffer is not empty mvi a,0FFh ret ;return not busy endif ;Multio Wbio Serial Drivers page ;************************ ;Start of the Disk Buffer ;************************ ; All of the Routines following this equate will be overwritten ; by disk accesses. ; buffer equ $ page ;*********************************************** ;Console and list device initialization routines ;*********************************************** ; if contyp eq 2 ;********************************************************************* ;Begin Multio I/O or Wunderbus Console Initialization Rout mvi a,30h ;Reset the parallel input flag out nspsta pop psw ani 7fh ;Strip parity ret uc1out: up1out: up2out: lptout: ul1out: in nspsta ;Write a character ani nsptbe jz uc1out ;Wait till the buffer is empty mvi a,20h ;Reset the parallel output flag out nspsta mov a,c ;Write the character, strobe bit 7 nspout: ori 80h out nspdat ani 7fh out nspdat ori 80H out nspdat ret uc1ist: ur1ist: ur2ist: in nspsta ;Return input buffer status ani nsprbr rz ;Return not ready mvi a,0ffh ret ;Return ready lptost: ul1ost: in nspsta ;Return output buffer status ani nsptbe rz ;Return not ready mvi a,0ffh ret ;Return ready endif ;North Star I/O configuration page ;************************* ;Begin List Device Drivers ;************************* ; if lsttyp eq 0 ;******************************* ;Begin Prom Patch Driver (LDRV0) ;******************************* ; The driver entries LSTOUT and LSTOST are defined in the CP instruction in output routine must be call to status ; so swap program can re-assign list status routine. ; Also, the pointer to the device name string must be just ahead of ; the entry point ; ;List Output ;----------- db 2 ;used by swap.com ; lstout: call lstost ;Check printer status ora a jz lstout ;Loop if not ready mov a,c ;Print the character out thr ret ;List Status ;----------- ; lstost: call sellst ;Printer status routine in lsr ;Check if transmitter buffer empty ani thre rz ;Return busy if buffer is not empty lhld lstand ;Fetch handshake mask bits in msr ;Get MODEM Status Register ana l ;Strip out hand-shake lines xra h ;Invert status rz ;Return busy if printer is busy lda lastch ;Get last character recieved from the printer mov b,a in lsr ;Check for a character from the printer ani dr jz xskip ;Skip if no character present in rbr ;Get the character ani 7fh ;Strip parity sta lastch ;Save last character recieved moine (CIDRV2) ;********************************************************************* ; This routine reads the sense switch on the WB-14 and sets ; the speed accordingly. ; conint: call selg0 ;Select group 0 in sensesw ;Get sense switch (ff on a Multio) push psw call selcon ;Select console pop psw push psw call tini0 ;Initialize the console pop psw push psw call selrdr ;Select the reader/punch pop psw call tini0 ;Initialize the reader/punch ret tini0: ani 0e0h ;Mask in upper three bits rlc ;Move into lower 3 bits rlc rlc cpi 7 ;check for sense = 7 (Default setting) jz dfbaud ;Use default baud rate lxi h,btab ;Pointer to baud rate table add a ;Table of words so double 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 byte of word inx h ;Bump to high byte of word mov d,m ;Get upper byte. (de) now has divisor jmp setit ;Set baud rate dfbaud: lhld defcon ;Use default baud r/M ; alternation guide (e.g. Input parameters are in register C and ; results are returned in register A). The LSTSET routine is used ; for initialization code. It should execute a RET when complete. ; ; The LSTSET routine could be placed just below the CBOOT routine. ; This space (below CBOOT) is recyled for use as a disk buffer ; after CBOOT is done. ; ; These routines all point to lstskp initially so that the system ; won't hang up, waiting for a non-existant list device to become ; ready. ; lstout: jmp lstskp ;Printer output lstost: jmp lstskp ;Printer output status lstset: jmp lstskp ;Printer initialization lstskp: ret endif ;End of Patch Area for List Drivers if lsttyp eq 1 ;******************************************* ;Begin Patch Area Driver (128 bytes) (LDRV1) ;******************************************* ; The driver entries LSTOUT and LSTOST are defined in the CP/M ; alternation guide (e.g. Input parameters are in register C and ; results are returned in register v b,a xskip: mov a,b sui xoff ;Check for Xoff char (control S) jnz xsdone ;Printer ready ret ;Printer not ready (return zero) ;Group select routines ;--------------------- ; sellst: lxi d,group ;pass to application ldax d ;Select printer group ori lstgrp out grpsel ret xsdone: mvi a,0ffh ;Printer ready for data ret ;Reader Input ;----------- ; db 4 ;used by swap.com rdrin: call rdrist jz rdrin ;wait for char avail in rbr ;get data ani 7fh ret rdrist: call sellst ;it's the list device kiddies in lsr ;check for char ani dr ;data ready? rz ;exit false mvi a,0ffh ;true ret ;Punch Output ;----------- db 3 ;used by swap.com ; punout: call punost ;select group zero, sensesw jz punout in sensesw ;read motherboard switches cpi 0FFh ;FF means Multio jz pmult mov a,c ;Print the character out data mvi a,0BFh out strobe ;strobe low (asserted) xthl xthl ;stall 10 us mvi a,0FFH out strobe ;strobe high (i)ate xchg ;Enable divisor access latch setit: mvi a,dlab+wls1+wls0+stb out lcr ;Set the baud rate in (de) mov a,d out dlm ;Set upper divisor mov a,e out dll ;Set lower divisor ;Clear Divisor latch mvi a,wls1+wls0+stb out lcr xra a out ier ;Set no interrupts out lsr ;Clear status mvi a,dtrenb+rtsenb ;Enable DTR and RTS outputs to terminal out mcr in msr ;Clear MODEM Status Register in lsr ;Clear Line Status Register in rbr ;Clear reciever buffers in rbr ret selg0: lda group ;Select group zero out grpsel ret selrdr: lda group ;Select reader/punch group ori 5-lstgrp ;Use 'other' serial port out grpsel ret 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 101 dw 6 ;19200 110 ;DEFCON 111 endif ;End Multi I/O, Decision I Con Init if contyp eq 3 ;*************************************************** ;Begin DJ2DB Console Initialization Routine (CIDRV3)s pointer jnz nset0 nset1: inr h ;Skip to the next memory page jz nset2 ;Skip if all done lxi d,$ + 100h ;fix for assem with rmac mov a,d ; mvi a,(high $) + 1 ;Is the pointer above us? cmp h ;Set carry if pointer is <= our page+1 jc nset0 ;Reset the next pages parity mov a,m ;Test for a PROM or no memory mov b,a ;Save the original byte cma ;See if this location will change mov m,a cmp m ;Test for a change mov m,b ;Restore the original value jz nset0 ;Value complemented, must be RAM ora a ;Test for no memory present jz nset1 ;Skip to the next page if no memory lxi d,700h ;Skip 2K bytes of 'PROM' dad d jnc nset1 ;Do a page check if no overflow nset2: mvi a,41h ;Re-enable parity on the memory boards out nsram endif crtset: ;Null routines ptrset: ptpset: uc1set: ur1set: ur2set: up1set: up2set: lptset: ul1set: ret endif ;End North Star Initialization page if (lsttyp ge 2) and (lsttyp le 5) ;************************************entries call movbyt mvi m,0ffh ;End marker if contyp ne 6 ;Non IOBYTE inits call conint ;Initialize the terminal call lstset ;Initialize the list device else ;Do IOBYTE inits lxi h,devset ;Device setup routine pointer table cboot0: mov e,m ;Load a routine address inx h mov d,m inx h mov a,d ;Test for the end of the table ora e jz cboot2 push h ;Save the table pointer lxi h,cboot1 ;Return address push h xchg pchl ;'CALL' a device setup routine cboot1: pop h ;Restore the table pointer jmp cboot0 ;Device setup routine pointers ;----------------------------- devset: dw conint, crtset, uc1set dw ptrset, ur1set, ur2set dw ptpset, up1set, up2set dw lptset, ul1set, 0 cboot2 equ $ endif lxi h,prompt ;Prep for sending signon message call message ;Send the prompt jmp gocpm ;Signon message output during cold boot ;-------------------------------------- ; Print a message like: ; ; Morrow Designs 48K CP/M 2.2 E4 ; AB: DJ/D ;*************************************************** ; conint: call fdtstat ;Clean input buffer rnz ;All empty call fdcin jmp conint endif ;End 2D/B console Initialization if contyp eq 4 ;*************************************************** ;Begin DJDMA Console Initialization Routine (CIDRV4) ;*************************************************** ; conint: call dminit ;See if controller present rc ;No controller, return lxi h,0 ;clear shld serin ;initialize no char present lxi h,dmaci ;Console initialization sequence lxi d,3 ;Halt offset call dmdoit ret ;DJDMA Initialization Command String ;----------------------------------- ; dmaci: db senabl ;Enable serial input db 1 db dmhalt db 0 endif ;End DJDMA Console intialization if contyp eq 6 ;******************************************************** ;Begin North Star Console Initialization Routine (CIDRV6) ;******************************************************** ; Initialize the North Star ******************************* ;Begi Multi I/ o Wunderbus Lis an Punc Initializatio ;Routine ;******************************************************************* ; lstset: call sellst ;Select printer group mvi a,dlab ;Access divisor latch out lcr lhld deflst ;Get LST: baud rate divisor mov a,h out dlm ;Set upper baud rate mov a,l out dll mvi a,stb+wls0+wls1 ;2 stop bits + 8 bit word out lcr mvi a,dtrenb+rtsenb ;DTR + RTS enabled out mcr in rbr ;Clear input buffer xra a out ier ;No interrupts ;fall thru to centronics init ;******************************************************************* ;Begin Multio I/O or Wunderbuss Parallel List Initialization Routine ;******************************************************************* ; punset: lda group out grpsel ;select parallel port in sensesw ;read motherboard switches cpi 0FFh ;FF is Multio jz imult mvi a,0FFh out strobe ;turn strobes off mvi a,0C0h out clk ;turn on drivers mvi a,07FMA 8", CD: DJ/DMA 5 1/4", E: HDC/DMA M5 ; ;Print String for the first line of the Sign-on message ;------------------------------------------------------ prompt: db 80h, clear ;Clean buffer and screen db acr, alf, alf db 'Morrow Designs ' db '0'+msize/10 ;CP/M memory size db '0'+(msize mod 10) db 'K CP/M ' ;CP/M version number db cpmrev/10+'0' db '.' db (cpmrev mod 10)+'0' db ' ' db (revnum/10)+'A'-1 db (revnum mod 10)+'0' db acr, alf ;Macros To generate the second line of the sign-on message ;--------------------------------------------------------- msdrv set 0 ;Start with drive A: msbump macro ndrives ;Print a drive name if dn gt 1 db ', ' endif rept ndrives db msdrv+'A' msdrv set msdrv+1 endm db ': ' endm prhex macro digit ;Write a byte in hex prnib digit/10h prnib digit endm prnib macro digit ;Write a digit in hex temp set digit and 0fh if temp lt 10 db temp + '0' else db temp - 10 + 'A' endif endm dn set 1 ;GeMother board, left serial port, right ; serial port, and North Star RAM parity. ; ;Initialize mother board conint: xra a ;Set up the parallel port + motherboard out 6 out 6 out 6 out 6 mvi a,30h ;Reset the parallel port input flag out nspsta mvi a,60h ;Set the parallel port output flag out nspsta mvi a,acr ;Force a CR out the parallel port call nspout ;Initialize the left serial port mvi a,nslin1 ;See the equates for bit definations out nslsta mvi a,nslin2 out nslsta xra a ;Clear the input/output buffers out nsldat in nsldat in nsldat ;Initialize the right serial port mvi a,nsrin1 ;See the equates for bit definations out nsrsta mvi a,nsrin2 out nsrsta xra a ;Clear the input/output buffers out nsrdat in nsrdat in nsrdat if nsram ne 0 ;Reset parity on North Star RAMs mvi a,40h ;Disable parity logic out nsram lxi h,0 ;Starting address nset0: mov a,m ;Get a byte mov m,a ;Rewrite, set proper parity inr l ;Bump the addresh out strobe ;assert restore (low true) mvi a,0FFh out strobe ;inactivate restore ret imult: lda group ori denable sta group ;turn parallel port drivers on out grpsel ;select parallel port mvi a,0C0h out strobe ;turn data strobe off lda group ori restor out grpsel ;assert restore lda group out grpsel ;de-assert restore ret endif ;End Multio/Wbio punch / list init page ;********************** ;Begin Cold Boot Loader ;********************** ; Cboot is the cold boot loader. All of CP/M has been loaded in ; when control is passed here. ; cboot: lxi sp,tpa ;Set up stack xra a ;Clear cold boot flag sta cwflg sta group ;Clear group select byte sta cpmdrv ;Select disk A: sta cdisk lxi h,cbios+3 ;Patch cold boot to warm code mov a,h sta bpage ;set CBIOS base page number shld cbios+1 lda iobyt ;Initialize the IOBYTE sta iobyte xra a lxi d,badmap ;Clear out bad map stax d lxi h,badmap+1 lxi b,9*badsiz ;32 map *nerate the drive messages rept 16 ;Run off at least 16 drives if dn eq hdorder ;Generate the HDCA's message msbump maxhd*hdlog db 'HDCA ' if maxhd gt 1 db '(', maxhd+'0', ')' endif if m10 ne 0 if m10m ne 0 db 'Memorex' else db 'Fujitsu' endif db ' M10' endif if m20 ne 0 db 'Fujitsu M20' endif if m26 ne 0 db 'Shugart M26' endif endif if dn eq mworder ;Generate the HDDMA's message msbump maxmw*mwlog db 'HDC/DMA' if mwquiet eq 0 db ' ' if maxmw gt 1 db '(', maxmw+'0', ')' endif if st506 ne 0 db 'M5' endif if st412 ne 0 db 'M10' endif if cm5619 ne 0 db 'M16' endif endif endif if dn eq fdorder ;Generate the 2D/B message msbump maxfd db 'DJ2D/B @' prhex fdorig/100h prhex fdorig endif if dn eq dmorder ;Generate the DJDMA 8 message msbump maxdm db 'DJ/DMA 8"' endif if dn eq mforder ;Generate the DJDMA 5 1/4 message msbump maxmf db 'DJ/DMA 5 1/4"' endif dn set dn+1 endm db acr,alf  ;------------ ; if maxmw ne 0 dn set 0 trkoff set 8192/(mwsecpt/8)+1 psize set trkoff*(mwsecpt/8) rept maxmw blocks set mwsecpt/8*mwtrks rept blocks/8192 ;Generate some 8 megabyte ALV's alloc mw,%dn,256,0 blocks set blocks-psize dn set dn+1 endm blocks set blocks/4 if blocks gt 256 ;Use the remainder blocks set blocks-1 alv set (blocks/8)+1 alloc mw,%dn,%alv,0 dn set dn+1 endif endm endif ;HDCA Drives ;----------- ; if maxhd ne 0 dn set 0 rept maxhd if m26 ne 0 alloc hd,%dn,252,0 dn set dn+1 alloc hd,%dn,252,0 dn set dn+1 alloc hd,%dn,256,0 dn set dn+1 endif if m10 ne 0 alloc hd,%dn,159,0 dn set dn+1 alloc hd,%dn,161,0 dn set dn+1 endif if m20 ne 0 alloc hd,%dn,255,0 dn set dn+1 alloc hd,%dn,255,0 dn set dn+1 alloc hd,%dn,129,0 dn set dn+1 endif endm endif page ;Debugging Aids ;-------------- ; bioslen equ (high ($ - cbios)) + 1 ;BIOS length in pages if bioslen gt biosln ;Test for overflow 'FATAL ***************************************************************** * * * Boot program for HDC/DMA controller. * * * * REVISED: 9/9/83 - bjg * * Changed equate "dmasel1" to de-activate * * step and direction on "Load Constants" * * command. * * * ***************************************************************** ; ; Define normal Cbios stuff ; alf equ 'J'-64 ;A line feed acr equ 'M'-64 ;A carraige return mwspt equ 9 ;Number of sectors per track retries equ 10 ;Number of disk retries before error bdos equ 5 ;Bdos entry point wmess equ 9 ;Write a message org 0100h buffer: jmp start ds 1021 ;Space for boot loader start: mvi c,retries ;Set up retry count again: push b xra a ;Drive 0 call mwldrv ;Test controller and login drive pop b ora a jnz ready ;The controller has responded dcr c ;Bump retry count jnz again lxi d,bfail ;Missing controller message jmp errpr ready: call mwhome db 0 ;End of message page ;Debugging checks ;---------------- codend equ $ savln equ codend+300h ;for movcpm codelen equ ($ - cbios) ;Length of Cbios code if codelen gt 1000h ;Test for SYSGEN problems 'FATAL ERROR, system is too big for SYSGEN rev. 4.X' dbgtmp set codelen ;Cbios code length ! endif if debug dbgtmp set codelen ;Cbios code length ! endif ;Reserve the space for the disk buffer ;------------------------------------- ds 512-($-buffer) ;Buffer for 512 byte sectors if (maxfd ne 0) or (maxdm ne 0) or (maxmw ne 0) or (maxmf ne 0) ds 512 ;Additional space for 1k sector devices endif page ;****************************** ;Begin Uninitialized Data Areas ;****************************** ; ;Bad Map Space ;============= ; Each bad map entry consists of 9 bytes: ; Logical drive number (1 byte) ; Track number of bad sector (2 bytes) ; Sector number of bad sector (2 bytes) ; Track number of alternate sector (2 bytes) ; ERROR, system overflow. BIOSLN must be at least' dbgtmp set bioslen ;BIOSLN! endif if debug dbgtmp set biosln ;Current BIOSLN! if biosln gt bioslen dbgtmp set bioslen ;Optimal BIOSLN! endif endif page ;Revision History ;================ ; ; ; Date Programmer Description ; ; 9 17 83 west * Public release of E.4 for dj/dma and hdc/dma. ; 9 13 83 west repaired dj console init/drivers ; 9 12 83 west multio initialization selects switches correctly ; 8 23 83 west all multio/wbio devices have names for swap.com ; 8 22 83 west PREP: now allows normal seeks to track zero ; 8 21 83 west all multio/wbio character devices return pointer ; to 'group' in [de] to TPA program ; 8 15 83 west all multio/wbio serial list have centronics punch ; and rdr: implemented as list input ; 5 5 83 F.R.K. add parallel centronics printer thru Mulito/Wbio ; 3 28 83 F.R.K. add dbl-sided soft sector, fix for rmac ; 1 18 83 JZ Did a cosmetic res ;Track 0 mvi c,1 ;Sector 1 call mwsec lxi b,buffer ;DMA address call mwdma mvi c,retries ;Number of read retries retry: push b call mwread ;Read the sector pop b jnc buffer ;Jump to boot loader if no error dcr c ;Bump retry count jnz retry lxi d,nosec ;Return sad news errpr mvi c,wmess ;Print string command call bdos jmp 0 ;Return to CP/M bfail: db acr, alf, 'HDDMA controller or drive failure.', acr, alf, '$' nosec db acr, alf, 'Read error, track 0 sector 0.', acr, alf, '$' ***************************************************************** * * * The follwing equates are for the HDDMA hard disk controller * * * ***************************************************************** ;Specifications for a hard disk cyl equ 1 ;Number of cylinders heads equ 1 ;Number of heads per cylinder precomp equ 1 ;Cylinder to start write precomensation lowcurr equ 1 ;Cylinder to start low current stepdly equ 30 ;Step delay (0-12.7 milliseconds) steprc Sector number of alternate sector (2 bytes) ; badmap: ds badsiz*9+1 ;32 entries + end marker ;Directory Buffer ;================ ; dirbuf: ds 128 ;Directory buffer ;Allocation and checked directory table area ;============================================ ; ;DJDMA 8" Drives ;--------------- ; if maxdm ne 0 ;Drive_0 csvdm0: ds 64 alvdm0: ds 75 ;Drive_1 csvdm1: ds 64 alvdm1: ds 75 ;Drive_2 csvdm2: ds 64 alvdm2: ds 75 ;Drive_3 csvdm3: ds 64 alvdm3: ds 75 ;dn set 0 ; rept maxdm ; alloc dm,%dn,75,64 ;dn set dn+1 ; endm endif ;DJDMA 5" Drives ;--------------- ; if maxmf ne 0 ;Drive_4 csvmf0: ds 48 alvmf0: ds 25 ;Drive_5 csvmf1: ds 48 alvmf1: ds 25 ;Drive_6 csvmf2: ds 48 alvmf2: ds 25 ;Drive_7 csvmf3: ds 48 alvmf3: ds 25 ;dn set 0 ; rept maxmf ; alloc mf,%dn,25,48 ;dn set dn+1 ; endm endif ;DJ2DB Drives ;------------ ; if maxfd ne 0 dn set 0 rept maxfd alloc fd,%dn,75,64 dn set dn+1 endm endif ;HDDMA Drivestructuring of the code Dealing ; with the disks at both the hi and lo levels. ; 1 17 83 JZ Now reads 5" soft sectored single density disks ; 1 16 83 JZ Patched up various holes in the disk error handeling ; routines in the Hi-Level routines SETDRV, READ, and ; WRITE and in the DJDMA Drivers ;*11 20 82 Marc Public release of revision E.31 end +l equ 30 ;Recalibrate step delay headdly equ 0 ;Settle delay (0-25.5 milliseconds) sectsiz equ 7 ;Sector size code (must be 7 for this Cbios) ; 0 = 128 byte sectors ; 1 = 256 byte sectors ; 3 = 512 byte sectors (default) ; 7 = 1024 byte sectors ; f = 2048 byte sectors ;Define controller commands dmaread equ 0 ;Read sector dmawrit equ 1 ;Write sector dmarhed equ 2 ;Find a sector dmawhed equ 3 ;Write headers (format a track) dmalcon equ 4 ;Load disk parameters dmassta equ 5 ;Sense disk drive status dmanoop equ 6 ;Null controller operation reset equ 54h ;Reset controller attn equ 55h ;Send a controller attention chan equ 50h ;Default channel address stepout equ 10h ;Step direction out stepin equ 0 ;Step direction in band1 equ 40h ;No precomp, high current band2 equ 0c0h ;Precomp, high current band3 equ 80h ;precomp, low current track0 equ 1 ;Track zero status wflt equ 2 ;Write fault from drive dready equ 4 ;Drive ready sekcmp equ  mov l,c shld dmadma ret mwsec mov a,c ;Load sector number dcr a ;Range is actaully 0-16 call mwdspt ;Figure out head number -> (c) adi mwspt ;Make sector number sta mwsectr mov a,c sta mwhead ;Save head number ret mwdspt mvi c,0 ;Clear head counter mwdsptx sui mwspt ;Subtract a tracks worth of sectors rc ;Return if all done inr c ;Bump to next head jmp mwdsptx mwreset out reset ;Send reset pulse to controller lxi h,dmachan ;Address of command channel shld chan ;Default channel address xra a sta chan+2 ;Clear extended address byte lhld dmarg0 ;Save the track number push h lxi h,dmarg1 ;Load arguments mvi m,stepdly ;Load step delay inx h mvi m,headdly ;Head settle delay inx h mvi m,sectsiz ;Sector size code inx h mvi m,dmalcon ;Load constants command call mwissue ;Do load constants pop h ;Restore the track number shld dmarg0 ret mwread mvi a,dmaread ;Load disk read command mwprep: sta dmaop ;Save command channel op c db 0 ;extended address end 8 ;Seek complete ***************************************************************** * * * The following are the lowest level drivers for the Morrow * * Designs Hard Disk DMA controller. * * * ***************************************************************** mwldrv: sta mwcurl ;Save current logical drive call mwreset ;Reset controller card jc zret ;Controller failure lda mwcurl call mwdrv ;Select drive jc zret ;Select error call mwstat ;Get drive status ani dready ;Check if drive ready jnz zret call mwhome ;Home drive ret zret: xra a ;Return error status ret mwdrv: sta mwdrive ;Save new selected drive mwsel: mvi a,dmanoop jmp mwprep ;Execute disk command mwstat: mvi a,dmassta ;Sense status operation code jmp mwprep ;Execute disk command mwhome: call mwreset ;Reset controller lxi h,dmarg1 ;Load arguments mvi m,steprcl ;Load step delay (slow) inx h mvi m,headdly ;Head settle delay call mwissue ;Do load constants agaiode mvi c,band1 lhld dmarg0 lxi d,precomp call mwhlcde jc mwpreps mvi c,band2 lxi d,lowcurr call mwhlcde jc mwpreps mvi c,band3 ;cylinder > low_current mwpreps lda mwhead ;Load head address sta dmarg2 cma ;Negative logic for the controller ani 7 ;3 bits of head select rlc ;Shove over to bits 2 - 4 rlc ora c ;Add on low current and precomp bits mov c,a lda mwdrive ;Load drive address ora c ;Slap in drive bits sta dmasel1 ;Save in command channel head select lda mwsectr ;Load sector address sta dmarg3 mwissue lxi h,dmastat ;Clear status byte mvi m,0 out attn ;Start the controller lxi d,0 ;Time out counter (65536 retries) mwiloop mov a,m ;Get status ora a ;Set up CPU flags rm ;Return no error (carry reset) stc rnz ;Return error status xthl ;Waste some time xthl xthl xthl dcx d ;Bump timeout counter mov a,d ora e jnz mwiloop ;Loop if still busy stc ;Set error flag ret mwptr lda mwdrive ;Get curren call mwptr ;Get pointer to current cylinder number mvi m,0ffh ;Fake at cyl 65535 for max head travel inx h mvi m,0ffh lxi b,0 ;Seek to cylinder 0 call mwseek ;Recal slowly call mwreset ;Back to fast stepping mode ret mwseek call mwptr ;Get track pointer mov e,m ;Get old track number inx h mov d,m dcx h mov m,c ;Store new track number inx h mov m,b mov l,c ;Build cylinder word mov h,b shld dmarg0 ;Set command channel cylinder number mov a,d inr a lxi h,0ffffh jnz mwskip0 mvi c,stepout jmp mwskip mwskip0:mov h,b ;(hl) = new track, (de) = old track mov l,c call mwhlmde mvi c,stepout mov a,h ani 80h ;Check hit bit for negitive direction jnz mwsout ;Step in mvi c,0 jmp mwskip mwsout: call mwneghl mwskip: shld dmastep lda mwdrive ora c sta dmasel0 mvi a,dmanoop ;No-operation command for the channel call mwprep ;Step to proper track lxi h,0 ;Clear step counter shld dmastep ret mwdma mov h,b ;Set DMA addressntly select drives track address rlc mov e,a mvi d,0 lxi h,mwtab dad d ;Offset into track table ret mwneghl:mov a,h cma mov h,a mov a,l cma mov l,a inx h ret mwhlmde:xchg call mwneghl xchg dad d ret mwhlcde:mov a,h cmp d rnz mov a,l cmp e ret mwtab: dw -1 ;Collection of track addresses dw -1 ;Initialize to (way out on the end of the disk) dw -1 dw -1 mwcurl db 0 ;Current logical drive mwdrive db 0ffh ;Currently selected drive mwhead db 0 ;Currently selected head mwsectr db 0 ;Currently selected sector dmachan equ $ ;Command channel area dmasel0 db 0 ;Drive select dmastep dw 0 ;Relative step counter dmasel1 db 03ch ;Head select dmadma dw 0 ;DMA address db 0 ;Extended address dmarg0 db 0 ;First argument dmarg1 db 0 ;Second argument dmarg2 db 0 ;Third argument dmarg3 db 0 ;Fourth argument dmaop db 0 ;Operation code dmastat db 0 ;Controller status byte dmalnk dw dmachan ;Link address to next command channel,!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :7!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :7!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :7!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :7~w#~wÔ!N#F!~w#~w}ʮ!T!~#foN#F*y!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#F$yV:eV!e>>#^V !e~#? ͗ ? !?!~#foN#F*yn!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#F$y:e*e##~#fo !eyx# !E !~w#~w !(!~#foN#F*y!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#F$yʢ:e*e####~OG! !eyx#â!- !~w#~w !!~#foN#F*yʺ!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#F$y/:e/!e>@>#7/! !~w#~w !!~#foN#F*yG!~# !~w#~w!~w#~w! !e!~#foN#Fͮ@!~#foN#F$*eMD!tR! !~w#~w !!~#foN#F*y!~w#~w>2e2e 2e2e!~w#~w >2e2eÂ>2e2eÂ>2e2eÂ>2e2eÂ! Â!!~#foN#F*y !~w#~w>2e2o}2/W>23W*e ~24W*e ~25W*e!KM }26W>27WͫyL!(2D!"-W>27Wͫyj!(2D2-W2.W*e ~24W>27Wͫy”!(2D2LW2MWÇSSeek timeout ͋S>P2ti2ui:LW:MW!:LW:MW#áS:e2/W>27W!!LW  #"*e}o}2,W*LW!yOx#Gi`"-WA:e2,W!~#fo!LWyOx#Gi`"-W>28WͫyY!(2D!~#fo"LWáS sector: head: Verify timeout: track: ͋S:e2,W2-W2.W!~#fo}/o|/g}og))!eyOx#Gy2/W!~#fo}og}23W!N#F!2N}og}24W!~25W>27W!6W"ti*ti6*ti~OG!eyx#>2 f> 2ri2si:ri2ri:si2si!ri~#ʙͫy®!{!N#FP!s!N#FP!i*ti~OGP!gáSáS: fOGy¨xu:8WOGy½xʙ:8W2 f.: f:!ri~#:!]"pi!]*e :pi:qiu*pi~OG!yx#|*pi]}o|g*ti~OG!N#F!N#F|! !riyOx#G! *ti~OG!N#F!N#F: fOG! 9*ti4 *pi#"pi FATAL! Count: Sector: Head: error. Track: Verify: ̀S!!~#fo)xW N#F!!N#FP! ů͆ =5ͳ  ^ &d  HDDMA controller or drive failure. $ Read error, track 0 sector 0. $28ڤ:ͦڤͮ¤ͳɯ2>`>`8!6#6͘ͳ6#68ͳ^#V+q#pi`"z`!"`i"y=/ 2y2 1T!"P2R*!6#6#6#6͘">2@*~~:2/O:2:2!6U~7z¢7:_!|/g}/o#Ϳ|}<e !!~#foN#F*y9 !~w#~w>2e2e ͪ ͑"ÇSUsage: formatmw drive-type [arguments] Morrow Designs HDDMA format/test program. Version 1.7 ̀S!p !H 2DÇS ̀S!N#F! !2DÇSChecking format. Formatting. ̀S=*e ~#fo *e( !W*e ~OG KM"eV:eM :ej 2f2f*e##~#fo "fv *e"f*e"f:eƒ :e¥ 2e2e*e####~OGi` "eñ *e"e*e"eͭ !["0W! *f"f!f:f:f## *fͬ*fͪ *e"f!f:e:e#2 *f !*f*fe *f#"f !e~#< ÇS*f#"f ! !]"0W>22W*f"f!f:f:f# *fͬ*e"f!f:e:e# !*f*f͓*f#"fr ÇS*f#"fU ̀S!9!w#w!!e  # !~#fo))[ *e#}!~w#~wý !!w#w~#~!!e  #Y !~#fo))[ ~OG:e:e\ !!~#fo#*e͒M}| ÇS!~#fo))[ !N#F!~w#~w}!!~#fo*e *e͒M}| ͋S!~#fo"ti!["pi!]:pi:qi *pi*ti}og}*pi *ti!2N}og}*pi####!N#FP!! N#FP! ~ .#~k!! N#FP!! N#F!N#F!N#F&â!!N#FE!! N#F!N#F!N#F&!ÇS Byte: Sector: Head: Data compare: Track: ̀S!!N#FP!!N#FP!!N#FP!! N#FP!!!N#F!N#F!N#F&ÇS sector: head: Verify timeout: track: ͋S:e2,W2-W2.W!~#fo}/o|/g}og))!eyOx#Gy2/W!~#fo}og}23W!N#F!2N}og}24W!~25W>27W!6W"ti*ti6*ti~OG!eyx#>2f> 2ri2si:ri2ri:si2si!ri~#ʙͫy!t!N#FP!l!N#FP!b*ti~OGP!`áSáS*ti4:fOGy¨xʒ! !riyOx#G! *ti~OG!N#F!N#F:fOGA! 9Ò:8WOGyxʙ:8W2f' FATAL! Count: Sector: Head: error. Track: Write: ̀S!9!~#fo)xW N#F!)!N#FP!!!N#FP!! N#FP! ~ «#~!! N#FP!! N#F!N#F!N#F&!!N#FE!*͓2D!9N#F#^#V#~#fo"jUkb"hUi`"fUOGtm603tm602tandonm10st412st506m5seagateq2040quantumhd561/2hd561/1olivettims4020ms4010ms2012ms2006ms1012ms1006miniscribecm5640cm5619cm5616m16cmipyxis27pyxis20pyxis13pyxis7df516ampexHeader CRCWrite faultData CRCData overrunData header not foundHeader not foundWrong headWrong cylinderDrive not readyController BusỳS!"e!"e*e~2e:e*e*e#"e*e~A*e>Z*e~OG! MD*e~OGyw*e#"e:e2eé*e6!e"e*e*e##"eywx#w!"e*e~F*e~r*e> ғ*e~rÓ*ew#w!e*ee}o|g!MZ2DÇS*e~ʤ*e*e##"e:ew:e#wä*e*e#"e6)*e> !*e~!*e#"eä{nosofttestverifyBad sector size.sizeBad skew factor.skewBad head number.headBad track number.trackBad drive arg.drivèS!~w#~w!~w#~w!~#ˆͪ !lUywx#w!~#fo~#!~#foN#F!~#foN#F*y!~#fo"e!~w#~w!~w#~w!~#fo~# ͪ !"piþ áS͋S!["ti!]:ti:ui8 *ti!~*ti####"ti áS Head: error. Track: Format timeout.͋S!~#fo"ti!~#fo"pi!~#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 ~OG! }/o|/g}23W*e}/o|/g}24W*e!KM }/o|/g}25W:ri26W>27WͫyP!U :8WOGy_xháS:8WOGi`)xW N#F!E *tiP!= *piP!; áS̀S!"f> 2 f2 f>28W*! f~#:8WÇSÇS*f:f2f: f2 f}: f2 f: f2 fDrive not ready.Can't read drive status.Controller does not respond.͋S>P2ti2ui*ti*ti#"ti,WyOGyw*ti*ti#"ti!,W!]N}og}*ti*ti#"ti6:e2,W2-W2.W>22W*e}23W*e ~24W*e ~25W*e!KM }26W>27W!,W"9W>2;Wͫy!9 >27Wͫy+!  :8WOGy?! áS̀S!!,W!22W*e}<-! N#F!N#F!N#F&!ÇS̀S!!UHÇS̀S!!THÇS̀S!9! !N#F!'i`! 6!ÇS̀S!9!!~#fo|g!'i`! 6!ÇS̀S!9!~#fo~ ! y !!! yw!~+2D+ÇS!~#fo~ a! ! a!~ ! y5!! yXx 2D !~#fo~OG! !~w#~wTesting disc. ̀S!!w#w!~#fo)NW #~!N#F!~#fo)NW N#F !~w#~wîÇS Reading - pass: data: Writing - pass: ͋S=*e ~#fo *e( !W*e ~OG KM"eV:eg:e„2f2f*e##~#fo "fÐ*e"f*e"f:e:e¿2f2f*e####~OGi` "f*e"f*e"f!!N#FP!!N#F͇!!]"0W>22W!]"ti!]*e :ti:ui;*ti*ti#"ti!~*f"f!f:f:f#*fͬ*f"f!f:f:f#*f*f͌*f#"f^!e~#áS*f#"fA!!N#FP!!]"0W>22W*f"f!f:f:f#*fͬ*f"f!f:f:f#!N#F*!~#fo"ti!~#fo"pi!~#fo"ri!w#w!:tiw:ui#w!w#w!pi~#[%*ti> Ғ%*ti~Ғ%!pi~#ʬ%*ti~-3&!>w#w*ti#"ti:pi2pi:qi2qiì%:pi2pi:qi2qi*ti#"ti@%! ~º%#~V&:pi:qiV&*ti~0V&*ti ~A&*ti >Z&*ti ~OG! MD &*ti ~OGyx&xV&*ti##"ti:pi2pi:qi2qiV&*ti~+¬%*ti#"ti:pi2pi:qi2qiì%!pi~#ʊ&*ti~0&*ti>9&!*ti~OG! }|'*ri!~#ʪ&!N#F>O>Gñ&!N#Fywx#w!pi~#ʹ'*ti~A&*ti>Z&*ti~OG! MD&*ti~OGyl&x¹'*ti#"tiù'*ti~aY'*ti>zk'Y'!!N#F! N#F͐N!~#fo }|:pi2pi:qi2qi*ti#"tiV&*ti~Aڊ&*ti>Zڊ&!*ti~Aڒ'*ti>Zڒ'*ti~OG! MDÙ'*ti~OG! }|!!   #'Ê&*ti!yOx#GáS͋S!~#fo"ti*ti"ri!#~(!>#(!~#fo>o>g"pi*ri*ri#"ri6-&(!~#fo"pi!~#>(!> w#wc(!#~c(!!~#fo>o>g}|!:pi:qi#ڛ(!N#F*pi!N#FM*ri'*ri "ri*ri*pi!N#FM0 }*ri>9(*ri~'w*ri!tiyOx#GáS̀S!!N#F!&f!i:,ÇS͋S!9ywx#w! ! ~#fo }|\.*ri~cG1*ri~sG1*ri~iG1!~ʥ1!!}|!! N#F! ~w#~w~#~!~a1*ri~c1!!~!>w#wB2!:riw:si#w!>w#w\.:qi1 2!!N#F!2N}!!~!>w#wB2*ri~c2!~w#w 2!~w#~w!*pi!N#F!%#2!N#F!N#F!N#F!~#fo͆S!~#5,!!  #5,!!!N#F!~#fo͆S!~w#~wí2͋S!~#fo"ti!~#fo"pi!~#fo"ri!ri~#K3*ti*ti#"ti*pi*pi#"pi~:ri2ri:si2si3!~#foMDáS͋S!9!~#fo"ti!#~3!!`i,O!`iKAL*ti*ti#"ti6-!!~#fo!~#fo }|!>>#3!>w#w!!~#fo#! >+F+N=3!?=! 9ywx#w!!N#F!~#fo#!?~w#~w2pi2qi!:pi:qi#4!:pi:qi#ҏ4*ti*ti#"ti!*pi ~*pi#"pi!~w#~w=4!:pi:qi#4*ti*ti#"ti60*pi#"pi!~w#~wÏ4!~#/5*ti*ti#"ti6.2ri2si!:ri:si#R5!:pi:qi#f*f͓*f#"fáS*f#"f̀S! ~7#~F!e~#FÇS2f2f![:f:f#*f)))W ! u #D*f)))W ! ‘ #D*f)))W ! ­ #D*f)))W !   #N*f)))W ! ~#~N*f)))W !~#~*f)))W !~#~*f)))W !~#~*f)))W ! ~#~*[#"[ÇS*f#"fMÇS HardSoft%+ 5i %+ 4i %+ 6i %p Track Head Sector Type No bad sectors detected. Bad sector report: ̀S!(![~#!(ÇS!k !*[*!v(!w#w!![  #!~#fo)))W ~1#~<!XMDA!SMD!~#fo)))W N#F!~#fo)))W N#F!~#fo)))W N#F!](! 9!~w#~w!Q(ÇS̀S!!~#fo)))W ~#fo!~#fo)))W yOx#Gywx#w+~#!~#foMDÇS!!~#fo)))W ~#fo!~#fo)))W yOx#Gywx#w+~#= !~#foMDÇS!~#fo)))W ~#fo!~#fo)))W yOx#GÇS̀S!9!!~#fo)))W ~#~!!~#fo)))W ~#~!!~#fo)))W ~#~!!~#fo)))W ~#~!~#fo)))W !~#fo)))W ~~#fo"ti!!  #)áS!~#fo "pi!~#fo"ri!ri:pi:qi#)*pi#"pi!ri:pi:qi#)*ti !N#F*pi*ti~#fo͆S>H))!:piš):qi#=**ti !N#F*pi*ti ~#fo͆S=*:ri2ri:si2si!ri:pi:qi# **ti !N#F*ri*ti~#fo͆Sx)!ri:pi:qi#9)*ti *ri*pi*ti ~#fo͆S9)*pi!yOx#G!~#fo!piyOx#G}|**ti*pi !N#F(*ti!N#F*pi (**ti!N#F*pi (*ti*pi !N#F(áS̀S!!~#fo !(Ç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ʈ+*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+͋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*ri#"ri~,áS!>w#w!6 *ri~-,!w#w!*ri#"ri*ri~*ri#"ri,*ri~+,!*ri#"ri*ri~*ri#"ri! !*riR+R5*ti*ti#"ti!*pi ~*pi#"pi*ri#"ri4*ti*ti#"ti6e!~#z5!w#wz5!:ri:si#/5*ti*ti#"ti60*ri#"riR5!#~5*ti*ti#"ti6-!!~#fo>o>g}|þ5*ti*ti#"ti6+!^i>># 6*ti*ti#"ti!N#F!dKM0 }!N#F!d͒Mywx#w+*ti*ti#"ti!N#F! KM0 }*ti*ti#"ti!N#F! ͒M0 }*ti!yOx#GáS͋S!9!~#fo"ti!~#fo"ri!#~6*ri*ri#"ri6-!!`i,O!`iKAL!"pi!!! >+F+N=6*pi?=! 9ywx#w!!~#fo*ti }|!>>#7!>w#w!!N#F!!?~w#~w!!  #7!~#fo!yOx#G*pi "pi!!~#~!>#7*ri*ri#"ri60!ti>#8*ri*ri#"ri6.8!>#7*ri*ri#"ri*pi!yOxGyx7*pi*pi#"pi~OG80yw!~w#~wù7!#~X8!ti>#X8*ri*ri#"ri60!~w#~w:ti2ti:ui2ui8!ti>#8*ri*ri#"ri*pi!yOxGyxҜ8*pi*pi#"pi~OGß80yw:ti2ti:ui2uiX8*ri!yOx#GáS͋S!~#fo"ti*ti"pi!#~+9! >#+9!!#~!~#fo)))W !~#fo)))W ~#~!~#fo)))W !~#fo)))W ~#~!~#fo)))W !~#fo)))W ~#~!~#fo)))W !~#~!~#fo)))W !~#~!~#fo)))W !~#~!~#fo)))W !~#~ÇSCan't write bad sector map.Timeout on writing bad sector map.Too many bad sectors. Assigning alternates for the first %i sectors. No room for a bad map on this drive.̀S*e##>#"*e####>"!l" !]"f!e:f:f"*f*f#"f6ý"*e####~OG*e͐N*e)yOxGi` "$f![:$f:%f#(#*$f"[*[!%"(2 f2!f![: f:!f#V$* f)))] * f)))W ~#fo}og}* f)))] * f)))W N#F!]N}og}* f)))W N#F*e͐N* f)))W ~#fo #""f* f)))] *"f}og}* f)))] *"f!2N}og}* f)))] 6* f)))] 6*e)#* f #""f* f)))] *"f}og}* f)))] *"f!2N}og}* f#" f/#!ͬ:e2,W2-W2.W*e}o}@o}2/W*e >#$:/W2/W*e >#$:/W2/W!]"0W>22W>23W>24W>25W>26W>27Wͫy$!" :8WOGy$x$!! ÇS͋Si`"ri!w#w*ri~.6-! !*ri R+i`"ri*ri~aZ-*ri~hZ-*ri~oZ-*ri~u…-!*ri*ri#"ri~!~hŽ->2pi2qi-!6n-!~o¥->2pi2qi-!~u¼-> 2pi2qi-!"pi*ri~x-!w#w\.*ri~b¨.!! N#F! ~w#~w~#~!! N#F! ~w#~w~#~!~#\.!!!  #O.!N#FV.!N#Fywx#w!~#p2!!  #p2!!!N#F!~#fo͆S!~w#~wf.*ri~p&/!! N#F! ~w#~w~#~!!N#Fͮ@ywx#w!~#\.!!!  #/!N#F/!N#Fywx#w\.*ri~l›/!~a0!! ~#fo~#~#~#~!>w#w!~w#~w+n0!!~#fo !##~!!=Q`/*ri~f¢0!!}|!!N#F!!yOx#G! ~#fo >+F+N=/!d6!9ywx#w! ! ~#fo }|\.!!}|!*pi! ~#fo##N#F+++N#F!8ywx#w! ! ~#fo####}|\.!!}|!>w#w! ! ~#fo####}|\.*ri~d#1!!}|!!>>#00!N#F!! ~#fo >+F+N=0!X3!.`i w#wh9! #~h9! ! ~#fo>o>g}|!! #~~+~ !#~9!!O9! N#F!`i02ji2ki2ii2hi!hiN##~*pi>9 :*pi~'w*pi!tiyOx#GáSwrite error in putlwrite error in putlbad putl call͋S!~#fo"ti!~#fo"pi!ti~#œ:!![: áS!~#fo"ri!ri>#:;!*ti *ti ~#fo }|!ri>#;*ti ~#~;!N#F!~w#~w*pi*pi#"pi~:ri2ri:si2si*ti ~w#~w:*ti ~K;#~ <*ti ~# <*ti ~#fo*ti ~ <*ti N#F*ti *tiN#F͹B*ti y¨;x##:!*ti *tiN#F͹By;x;!!G: ç:*ti w#wç:!~#foMDáS*ti w#w <͋S!~#fo"ti*ti"ri!#~y#yo>g}|*ri*ri#"ri6-!~#fo}o|g"pi!~#¤ w#wo>g}|!:pi:qi#=!N#F*pi!N#FM*ri%<*ri "rGyw*pi" *pi* *ri }|!~#JE!*pi( AE #JEáS!*ti{Fx{E!N#F!N#F*tíGxEáS*pi ~OG*pi ~OGyOG}|EñEi`"ri!*pi( E #E*riMDáS*pi( !~#~!ri~# F!*pi* ͇HáS*ti ~OG! *pi* ! *pi! i`"ri!! *riMD!DtRáS!*pi* ͇HáSáS͋S!~#fo"ti*ti ~#fo"pi*ti~OGyF!*pi( N#F*tíGyFxGáS!~#{G*ti~OGy{G*ti ~OG! *pi! *ti~w{G*ti ~OG! *pi* ! *pi! i`"ri!! !ri~#jGáS*ti~w*ti~wFáS͋S!~#fo"ti*ti ~#fo"ri!N#F!2N"pi*ri ~OG:piG:qiG*ti~OGy hH*ti ~OG! *ti~OGyH*ri! xHáS*ti~w*ri :piw*ri! xaH!~#aH*ri! xaH*ti~wáS*ti~ w*ri !~#fo}og}áS͋S!~#fo"ti!~#fo"pi:pi2pi:qi2qiH*ti6*ti#"tiàHáS&}!!9͆S! 9~#foN#FxHO>G!9~#fo^#VzOP!9~Q/#w>+++w>#wMD!9!9!N#F!>w#w#w##w#w!!ʹS! N#F !#~R*UQq#px#w#wQQq#p#w#wQQ w #w #w #wQQ w #w #w #wQ~#€R#~#foy#”Rx#•R+++~#fo##tR!9!9!N#F!ͤTyzS!q#p! N#F!ͤTyR!N#FdS!yOx#GSy4S+~w#~w!SO>G! ~#+~wS&Sw y3SS!MD!  #wBS!N#F!ʹS!MD ! ~#fo+ #wqS*U!9!9*ti*ri*pii`!"pi"ri"ti!9N#F! ~Si`+ >#wSS+SSâT! ~ T# +~wS!9~w#~wS! ~4Ti`+ #~wT!9~w#~w T LTi`7#~w@TS!9~dTi`+#w[TâTwTi`>#wmT>w! !9~UTz~w+~ w++~ w–T!!9N#F!9^#V! #~#~ T! ~#~WT+TT U>w+~w} Ui`i*ri*pi!N#FM0 }*ri>9,=*ri~'w*ri!tiyOx#GáS͋S!9!~#fo"ti2pi2qi!#~=!!`i,O!`iKAL!~#>!!iH>*^i "ri!ri>#>?!*ri)))i Hw?!!`i,O!`i*ri)))i cIAL*pi!*ri N "piw?2ri2si!:ri:si#ҝ?!~#ʝ?!!`i,O!`i!&iJAL!!L!!`i,O!`i!hi!N#F#RKAL*ti*ti#"ti!~#fo0 }*ri#"ri>!`i,O!`i!&iJ!iH>*^i "ri!ri>#>!*ri)))i `i,O!`i!JAL!iH?!!AL!*ri N:pi2pi:qi2qiÊ?!!iH>!!`i,O!`i!&icIAL*pi#"pi>:ri2ri:si2siâ=:ri2ri:si2si>!:ri:si#?*ti*ti#"ti60*ri#"riÝ?*piMDáS͋S!~#fo"ti!#~R@!!  #R@*ti!~#fo ~5R@!~#fo "pi:qiX@*ti*pi ~9š@*ti*pi 60:pi2pi:qi2qi@áS:qiR@*ti61!~#fo"pi!pi>#@*ti*pi 60:pi2pi:qi2qio@*ti*pi 4X@áS͋S!~#fo"ti*ti"pi*pi~@*pi#"pi@*pi!tiyOx#GáSAAAA͋S!~#f I_>WxƀGzƀWyox"I'I>XI>XI! 9N#F!9~#fo# AI ##]I +]ICIчU"II!9!9!6!N#F!ͤTy­I! N#F > J!~I!>#w¾I!4!q#p! N#F I!4 !ͤTyJy!Ox#Gyƀ+wx#w !#w J!69!#~w )J!MD! +IJ>JjJ!MD!  #[J!4! +~w qJ!5"J!N#F!ʹS!~ʫJ!~#ʫJ~w! N#F !#~ºJ*U!9!9! N#F!6 Jƀ4 !ͤTyK!q#p!N#F!ͤTy0K! N#F &%'KK!~O#~Gyր+wx#w! #w LK>8!w! ~#+~w bK!~K!MD!  #K!#~w ’K!5YK!N#F!ʹS!~K!~#K~w! N#F !#~K*U!9~#fo~#K~ƀw!9!9!N#F ! #wL!~ƀw! N#F!͙R*U!9N#F!9~#fo~#~WL*UMD!9!9!N#F!ͤTyLy֨OxGL!~#+~wŸLy•LLyL!#~w¾L ñL! cLN#F!~#~*UcLN#F!~+~ +~+~ >#wUJ!9N#F###q#p+++q!9N#F#q#pV2.1: copyright (c) 1979 by Whitesmiths, Ltd.` (` (@(@(@(@(2(2((2((2(2(2(2(2(((~@(v@(n@(f(`(X@(U@(O@(I2(E2(>(8(2(U @rcXG1$ +@o"ti!~#fo"ri!>#IA! y\A! y;Ax\A!2D\A*ri!yOx#GáS*ti ~zA*ti ~OG!@tR*ti ~#fo"pi!*ti͎DyžAxBáS*ri~OG! !~w#~w*ri#"riA*ri~OG! øA*ri~OG! øA!~#foMDáS!>#B*pi! ~ʅB*pi" N#F*pi" ~w#~w*ri*ri#"ri~*pi$ >2`i2ai>2ci>2bi!`iN!~w#~w*pi! 5B*ti~OGyʬB*pi! ~ʬB*pi" ~#fo6*ti~wA ͋S!N#FCi`"ri!ri~#BáS*ri~OGyC!N#F!N#F*ri@áS!~#fo"ti!>#RC*ti"pi!>#eC*ti~ eC*ti#"ti!~w#~w%C*ti!yOx#GáS*ti!piyOx#G*pi*ri@*ti!piyOx#G}›C|ʤCáS!>#C!!B*ri@yCxCáS*ti#"ti!~w#~wC͋S!~#fo"ti:uiD!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*tiMDáSaF[FrF͋S!~#fo"ti*ti ~#fo"pi!*pi$ `i#w! 9N#FxwMO>GM҇MO>G! 9q#p*U! 9~M+w>#w! 9N#FxMO>GMMO>G! 9q#p*U! 9N#FM! 9q#p*U! 9N#FM! 9q#p*U!9~N/#>+++>#~#~#~ #~{P>#># >#O!9MD!9~#foO! 9MD!9~#foOKO!9N#F!9-POO!9MD!9~#foO! 9MD!9~#foOKO!9N#F!9-POO! 9MD!9~#fo#O!9MD!9~#fo#OKO!9N#Fkb9PO/lUfD 4h  FORMATMW Program Th FORMATM progra formats verifie an test har dis drive tha ar connecte t Morro Design Har Dis DM controller. Usage: formatmw drive-type [arguments] wher drive-typ i require nam tha describe th driv bein formatted Possibl drive-type an argument follow: DRIVE-TYPE COMPANY 1K SECTORS  "cmi", "m16", "cm5619" Computer Memories Inc. 16,524 "seagate", "m5", "st506" Seagate Technology. 5,508 "st412", "m10" 11,016 Optional arguments: drive # Specif ᠠ physica driv (0-3 t b formatted Defaul i driv 0. head # Specif physica hea t b formatted B default al th head ar formatte an tested I yo wan t chec ou on hea only includ thi argument Consul th manufacturer' manua fo th allowabl hea @ BCG@M [u+pnumbers. nosoft Whe thi fla i specifie the sof error tha occur durin formattin o testin wil b reporte bu no adde t th ba spo ma bein built Thi fla i use primarill durin driv evaluatio an allow CP/͠ tes program t ge sho a margina sectors Thi fla ma als b use whe th th drive ba spo ma overflows Eg Entrie wil no be "wasted" on soft errors. size # Specif th secto size Lega value ar 128 256 512 1024 an 204 bytes Defaul i 102 bytes Note User o th Morro Design multi-use operatin system Micronix ar require t forma thei disk wit 51 byt sectors. skew #Specif th skewi0n facto t b堠 used Defaul i 3 ske facto o i suggeste for Micronix. test Invok dis tes routine Thi routin write variou pattern o th dis an the verifie them. track # Specif particula cylinde t b formatte an tested Consul wit th manufacturer' specification fo lega cylinde values. An combinatio o optiona argument ca b combine fo variou affects Commo comman usage includes: A>formatmw m5 formats drive 0 for a CP/M environment. A>formatmw m16 drive 2 size 512 skew 6 formats drive 2 for a UNIX environment. z8O!B N#N ¾SP.* |} !9":q!"w>w>w >w !>w >w ~wWŒw#<iÕ>wÁ!>w >w >ww~www ~w!2"#PʠU!~ +|  ͨ!~#ʶ!***Ϳö:: :H ! X *2! !9!"u{! y2:“ $ :A !>Z :OG! MDû :OGy2:OG !~#fo"c#*c#~ *c#~ ! *c#~OG *c##"c# !N#F! !N#F*i`"' *"!~#fo"*MD !~#fo"c#!~#fo"_#!~#fo"a#:`# *_#>o>g"_#:d# *c#>o>g"c#*a#*a##"a#6-*c#*_#" ! ~# *_#* *a#Z *a# "a#*c#*_#20 }2 ! >9 : '2 *a#*a##"a#: w*a#!yOx#G: can't write : can't read !"R !"T :2X 2Y *X *T ̓!X ~#ʫ *R *R #"R *T *T #"T ~:X 2X :Y 2Y s *R *R #"R 6! "L *L *L ##"L L ywx#w!"R *R ~ *R ~k *R > *R ~k È *L w#w!N ~# !Ͱ!!*N Hi`"V !V ~# *N *N ! ! !> ! ! *R ~ *R ~<ʙ *R ~>½ Ù *R *R #"R 6 *R #"T *T ~ *T > *T ~ *L *L ##"L :R w:S #w *R ~> *T "P *T #"T à *T "N *T "R *R*M $ !9N#F#^#V#~#fo"kb"i`"OG!N#FI ! !N#F!Z i` 6!MDIllegal commandSector header CRC errorWrite faultData CRC errorData overrun (channel error)Data not found (no data preamble)Sector header not foundStatus code 3Status code 2Drive not readyTimeout!!T;>P22**##"ywx#w*w#w!">2*">2 sector , head , cylinder : Soft error: ! ~#! !> :OGi`) N#F ! ! !N#F2! ! !N#F2! ! !N#F2! *#"!9!>w#w>##w>@+w!~###ʌ:ʏ!>2O#2P#>2R#>2Q#!O#ͫwDrive not ready Controller does not respond 22:2*}0o}2>2:2>2X:$! :OGy>! *}0o}2>2:02>2X!":2>222X*####~2:02>2Xy¹D͇:2!::#!~#fo!yOx#Gi`"*! > *R ~ *R #"R !P ~#ʃ !Ͱ!!*P 6i`"V :V O :W ʃ *P *P ! !!/ ! !! *L  }o|g![ $ (TLPKC.D 4c!~#!N#Fi`"a !a ~#*a ~OG! *a  ~OG! !N#F!N#F*a j>2` !~#fo"Z !~#fo!~#fo "\ *a  ~#!\ :Z :[ #*Z *Z #"Z ~OG:` OG >2` P>2` P!~#foMD!\ :Z :[ #*Z ~OG! *Z !yOx#G!:Z :[ ##*Z  ~ 4! :` OG *Z *Z #"Z ~OG:` OG ~ ccc !9!~#fo"e !~#fo"k !~#fo "o !~#fo#O#!O#>2Y#2Z#2X#2W#!W#Ϳ##~2j !~#fo ~#0!k ~# !N#F:k ր:l |:j |!"m *e ! *o !" yʲ!y:j OG "g !"c *k :k 2k :l 2l } *e *e #"e ~2i :i OG!V!z! *o !! y!!!zK*e *m "e !m :k 2k :l #2l !~#fo#2O#2P#:m 2Q#:n 2R#!O#͑>2j !1 !"P"2R2T !wwwww >w>w>w >w !>w >w ~wWŒw#<iÕ>wÁ!>w >w >ww~www ~w!2"#PʠU!~ +|     !~8 Q<#%- >0_xVfY<!">wwUÄ Decision 1 Shutdown Program $ Now parking winchester heads in safe landing zones... $ Your system is now ready to be turned off. $ HDC/DMA controller not responding! $ drives are now ready to be turned off. $ drive is now ready to be turned off. $ Remember to backup on floppy and run CHECK.COM periodically!! $ to be turned off. $ drive is now ready to bedy to be turned off. $ HDC/DMA controller not responding! $ drives are now ready to be turned off. $ drive is now ready to be turned off. $ Remember to backup on floppy and run CHECK.COM periodically!! $ to be turned off. $ drive is now ready to beyOx#Gi`":2!~#fo"!~#fo}/o|/g}og))!yOx#Gy@Oy2!*  #j:2!*  #ڈ:2!~#fo"!~2!~2>2X:¸@ͨ:OGyx>2!!U;d3c2b1  a0 A) Drive 0. (if you have only one drive) B) Drive 1. C) Drive 2. D) Drive 3. Drive: ! y !22*MD>22*MD>22*MD>22*MDx7c)baE A) m5 B) m10 C) m16 Selection: ! y !!"*MD!"*MD!"*MD ba A) CP/M B) Micronix Selection: !9!W !y yw!T !~OG!H>22*###6 ~OG>22*###6~OGà errors. 1 error. No errors. @ͨy22*::#Ҏ22*##~OG::22*###~OG::22: :***y!~#- ! X *#"*#"0*#"K: : !***Ϳö*#"g: :1:j OG}o|g"m !k :m :n #'*m MD,*k MDi`"m *m *e !z:j OG ͍*o !" yʲ!k ~#ʮ!c :g :h #ڟî*g *g #"g 6 *g *g #"g :i wc!c :g :h #E!g :c :d #i`"q !q ~#*c "g *g !y:j OG yOxGi`"m !N#F:m ր:n D!! *o !! yp!!!Kp!"m !y! *o !" yʸ*m !y:j OG !:j OG ͍!! *o !" yʸ!y"g >2j !~#fo#2O#2P#:m 2Q#:n 2R#!O#͑!q ~#ʟ*g *g #"g 6 !k ~#Ÿî*e !yOx#G!w#w!~#~X!N#FͰ!~w#~w.! ! y}2s 2t *s #"s :s :t ! y¢x­! !N#Fi`"u !u ~#*u  ~D*u ~*u  ! i`"w :x (!w >>#(*u  6!~#foMD!>w>#w!~#_!~Q#~_!>w#w͖i`"y !y ~#v*y !N#Fy’*y  ~D*y  ! *y  ! x*y  6!N#F!N#F!N#FH!#~ O>G! 9q#pJ! 9N#FN! 9q#pJ! 9N#FN! 9q#pJ!! 9~+ʆ~l! 9N#F ! 9~w#~w! 9~w+~wS!9q#pJ!9N#F!9~#fo ## # +++ #J!9N#F!9~#fo  # # #J~#~#~#~#~#~#~#~!9~/w>#w!>w>#w!:w#w!N#F!N#F_ !~#ʻ!N#F!~w#~w!N#F!~w#~w~!~w#~wq!N#F!~w#~w6!!}|!N#F!~w#~w2ywx#w!>w>#w!~#fo~D!~#fo~|!~#fo> !~#fo~|î!~#fo>w#w!!~#fo!yOxG! !~#fo~!N#F!~w#~w!~#~!N#F!~w#~w6!~#fo> !~#fo~ !~w#~w baud. set to H, Serial port Multi I/O @ Can't find multi I/OBase must be on an 8 byte boundryDevice # out of range.Baud rate must be between 75-38400Usage: baud rate [device #] [base] .BAUD Version !~w#~w! *͜! *͜! !~#~!F!>>#! !!!N#F!~w#~wN#Fhy:K:! 2021:22:23!0+!>>#! !!!N#F!~w#~wN#Fh::)!>>#)!sFÈ!>>#4!!!~#~!N#F!,M "{ *{  ~@*{ MD!~#q!~c#~q!>w#w͖i`"} !} ~#ˆ*} !N#Fy¤*}  ~D*}  ! x*}  6*} !~*} #w#w#w#w*}  !~#~*}  }o|g!,MD!~#fo#~2 #~2 #~2 #~2 !~#fo " * ! ! !s##~* " ! !s##~* # ! !s##~! ywx#w!O#~#~!~#fo ~!O#~#~!~,w#~wé!~#foMDRDR:PTP:CON:LST:!9!~#8!~#fo~8!~#>!N#Fi`" : : b!" !~#fo" * ~* ~w* * ~a* >z* ~OG! MDò* ~OGyw* #" * #" t* 6!!}|: : !~#fo###~:! !N#Fy}>L2 2 !~#fo 6D!~#fo " * 6!~#fo#~: !~#fo~2 2 : A: F! >P>#LF!!N#Fyʠ>C2 2 !!N#Fy>P2 2 !!N#Fy>T2 2 !~#fo : w!~#f!!N#F!~w#~wN#Fh4!\F*}o|g!yLx#W!:F** ͳ* y2:OGyˆxʢ*##yOxGyʪ!%F** ͳ!*###ͳ!$0~#~#~#~!02829:2::2;!8!(W##~2#~2*}o|g*ͳ*!s }o|g*#ͳ!*###ͳ! *! *͜! *͜! !  !9! !N#F!R i`! 6! !!N#F!R i`! 6! !~#fo~@!~#fo~OG! !~w#~w  !N#F !C ! ' !~#fo"D!~#fo"@!~#fo"B!>w#w!:Dw:E#w!>w#w!@>#*D> *D~ !@>#%*D~-®!>w#w*D#"D:@2@:A2A%:@2@:A2A*D#"Dó! ~3#~:@:A*D~0*D ~A{*D >Z{*D ~OG! MDÇ*D ~OGyxx*D##"D:@2@:A2A*D~+%*D#"D:@2@:A2A%!@># *D~0 *D>9 !*D~OG! o 6* #" 2 2 : : !~#fo~j!~#fo~.‚j* *  }!~w#~w * * #" 6 * #" * * #" !N#F!~w#~w~x!~#fo~!~#fo~.!~w#~wë!~#fo~.!~w#~w2 2 : : #!~#fo~S* * #" 6 y*  *  *  *  6~ w~* * #" !N#F!~w#~w~* #" !N#F!~w#~w}!~#fo!~#fo~A!~#fo>Z!~#fo~OG! MD!~#fo~OGyw!~w#~wÆ!!~#~!~#fo~3!~w#~w!~#fo!yOx#G!N#F!~w#~w}ʊ!N#F!~w#~w!~N!N#F!~w#~w}!N#F!~w#~w!N#F!~w#~w~Ð!~#foMD!~#fo!~#fo (!~w#~w!~w#~w!~#fo~ &}!!9!9~w#~w#~w#~w+MD!9 _ #X{ !94X! 9~+w>#w! 9N#FxO>GNO>G! 9q#pJ! 9~+w>#w! 9N#FxO>GN2}|Ø *B!~#) !N#F>O>G0 !N#Fywx#w!@>#? *D~Ae *D>Ze *D~OG! MDm *D~OGylv x? *D#"D? *D~a *D>z !!N#F! N#F !~#fo }|:@2@:A2A*D#"D*D~A *D>Z !*D~A *D>Z *D~OG! MD *D~OG! }|!!   # *D!yOx#G= ' !~#fo"D*D"B!#~ !># !~#fo>o>g"@*B*B#"B6-ì !~#fo"@!~# !> w#w !#~ !!~#fo>o>g}|!:@:A#! !N#F*@!N#F *BR *B "B*B*@!N#F4 0 }*B>9L *B~'w*B!DyOx#G= ' !~#fo"D>2@2A!:@:A# *D*D~A *D>Z *D~OG! MDö *D~OGyw*@#"@*D#"Dw !~#foMD= !,~# ! :, :- *,i`", *. ' *,"D!~#fo",*DMD= !9*D*B*@i`!"@"B"D!9~w#~w#~w#~w+MD!9 _ #Z { !94Z ! 9~ +w>#w! 9N#Fx O>GP O>G! 9q#p! 9~ +w>#w! 9N#Fx O>GPDESCRIPTION Thi i th Diabl HyTyp I instal package I contain on integrate drive fo th Mult/I revisio interface car o th Wunderbus I/ motherboard Thi drive i designe t ru unde fou configurations Thes configuration are: WB14Thi configuratio i use o th Wunderbus I/O board o th Morro Design Decisio ɠ desk-to system. MULTIOThi configuratio i use o th Mult/I board o th Morro Design Decisio rac moun systems. WB14-Thi configuratio i lik WB1 excep th CP/ consol i devic othe tha por o th Wunderbuss. MULTIO-Thi configuratio i lik MULTI excep th CP/ consol i devic othe tha por o th Mult/IO. Th INSTAL̠ comman line neede fo eac o thes system are:   O>G! 9q#p! 9N#FP ! 9q#p! 9N#FP ! 9q#p!9~_ /<à O!9~#fo) k !9~ /<_ O!9~#fo||g}o  !9~ /<_ O!9~#fo|g}o º MD!9q#p!! 9~+ ~ ! 9N#F ! 9~w#~w! 9~w+~w !9q#p&!!9OG!9N#F!9~#fo ## # +++ #!9MD!9~#~#~#~ !9~w#~w#~w#~w#~w#~w#~w#~w!9MD! 9  # # #x!9MD! 9  # # #!94x!9!9#~#~+++~#~#~#>#>+++>#~#~#~ #~{$>#># >#!9MD!9~#fo! 9MD!9~#foU!9N#F!97!9MD!9~#fo! 9MD!9~#foU!9N#F!97! 9MD!9~#fo#!9MD!9~#fo#U!9N#Fkb9$!9~#foN#F#N#F! 9~#foN#F#N#F!!9~+++ʓ~i!9MD!9  # # #!9~w#~w#~w#~w!9~w+~w+~w+~w:!9N#F!9~#~}|! 9&}!!9!9!9N#F###q#p+++q!9N#F#q#pMo NAME BAU - chang seria bau rat o MULT/IO SYNOPSIS BAU baud-rat [devic # [MULT/IO base] DESCRIPTION BAUĠ i use t chang th bau rat o MULT/IϠ o Wunderbus I/ motherboard Devic i th por numbe o th MULT/IϠ o motherboar i th rang o on t three MULT/IϠ bas i th bas addres o th MULT/IO Th de faul devic i on i no specified Th MULT/I bas i assume t b 48h. EXAMPLES T chang seria por o MULT/I wit bas o 48 t 960 bau yo woul type: baud 9600 1 48 or baud 9600 T chang th bau rat o th thir seria por o MULT/I wit bas o zer t 11 baud: baud 110 3 0 baud.doc 3/17/81 ldk  INSTALL HYTYPE.PRL C000 fo WB1 an MULTI system and INSTALL - HYTYPE.PRL C000 fo th WB14- an MULTIO- systems. DESCRIPTION Thi progra automaticall determine th hardwar (Wunder bus o Mult/I controller bein used Th "- fla force th remova o th consol driver User wh hav purchase th Mult/IϠ o Wunderbus board fo us a paralle printe boar shoul us thi "- fla option Th "C000 argumen give i dependen o th user' system Consul th INSTALL.DOà fil o you installatio manua fo de scriptio o thi parameter. FILES Th followin i lis o th file foun i th printe instal packag diskette. hytype.as Instal drive sourc code install.co Relocatabl BIO modul installer install.do Documentatio fo INSTALL.COM makeprl.co Relocatabl modul generator makeprl.do Documentatiorrow Designs Inc.H  3 fil fo MAKEPRL.COM makeprl.su SUBMIԠ fil堠 fo creatin砠 variou󠠠 pr configurations prl.do Documentatio abou PR files These install drivers are provided: length hytype.pr 60 HyTyp I paralle printe driver 6/21/82 MK. **5(*"|/g}/o# |}z/G{/O>=))L# X#AAMD!xxGyOu)b*|**|* "**0/ڱ*!0("**"*| !"}yOL|g <*|| |g**!n0] 55"!"<w@ H?}/o|/:9cg}I|HH|Hg}H|II|I:8 @ H>/M ʟyH>LHHMII29!_^#VA`0  Y`@:0  >KH_IW>K!{7#zO+## +*6>KzI{H>KMI29‡:8280O nOH:8 O>Iä>J>H>H> =•>HI>J! "!"!"""""222:8O:8O:8O$I$I$ RRHI!$B I$I$I$I$IID$$ $ "BH@I$$DI!" " !  AI$@@$ @!@ @  !@AH inter ready ; Define daisy 0 status input bits for Diablo HyType II driver crstrd equ 1020h ;Carriage ready pfstrd equ 810h ;Paper feed ready pwstrd equ 2040h ;Print wheel ready ; Define daisy 0 output bits d9 equ 01h ;Data bit 9 d10 equ 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 ;Carriage strobe pwstb equ 40h ;Print wheel strobe rest equ 80h ;Printer restore (Ribbon lift on Multi I/O) ; Define clock select bits rlift equ 40h ;Ribbon lift pselect equ 80h ;Select (Not used by Diablo) ; Define Modem Control Register bits dtrenb equ 1 ;DTR enable rtsenb equ 2 ;RTS enable ; Define group select bits (base + 7) s0 equ 01h ;Group number (0-3) s1 equ 02h smask equ 03h bank equ 04h enint equ 08h ;Enable interrupts restor equ 10h ;Printer restore on Multi I/O denable equ 20h ;Driver enable on Multi I/O ; Define special constants for the HyTyp II driver cperi equ 10 ;Default ***************************************************************** * * * Installable printer and console drivers. * * * * Date Author Description * * * * 6 21 82 Marc Reversed the sense of the console flag * * 4 2 82 Marc Console install flag * * 4 2 82 Marc Automatic determination of hardware * * 3 31 82 Marc Initial coding * * * ***************************************************************** congrp equ 1 ;Serial console port (1 = p1, 2 = p2, 3 = p3) lstgrp equ 3 ;Serial printer port (1 = p1, 2 = p2, 3 = p3) ***************************************************************** * * * The folowing equates will define the Decision I mother * * board I/O or the Multi I/O environments. * * * ***************************************************************** mbase equ 48h ;Base address of Multi I/O or Decision I grpsel equ mbase+7 ;Group select port dll equ mbase ;Divisor (lsb) dlm equ mbase+1 ;Divisor (msb) ier eto 10 characters per inch lperi equ 6 ;Default lines per inch hinc equ 120 ;Horizontal increments per inch vinc equ 48 ;Vertical increments per inch numtabs equ 160 ;Number of horizontal tabs maxchrs equ 1024 ;Maximum number of printer characters to queue maxrgt equ 1584 ;Maximum carriage position dfrmln equ 110 ;Forms length times 10 autolf equ 0 ;Default to no Auto line feed. ***************************************************************** * * * The following are internal driver equates. Most are misc. * * constants. * * * ***************************************************************** cpmbuf equ 80h ;CPM buffer (command flag buffer) anul equ 0 ;Null aetx equ 'C'-64 ;ETX character aack equ 'F'-64 ;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 avt equ 'K'-64 ;Vertical tab aff equ 'L'-64 ;Form Feed acr equ 'M'-64 ;Carriage return xon equ 'Q'-64 ;Xon character xo:OTY?!$'*D03 _-tÌ !:x:!JxJS~#T]w#w###xMʐHM ʟyHM>:8 28yO:!y:!y!Q:54####~#fo` e  f  123456 890ABabD=U4 ~ ` ``` T p *y2r*":!*r i͝: *":!*͝ Í22**(">fi&1:!*Í!6#2>222>2**"i&+"i&+"IiI i*|g}oY^*]*("Y*]*("͐w***55K 7 ®͐/w***5#/͠^*!0("!n0] 5qu mbase+1 ;Interupt enable register clk equ mbase+2 ;WB14 printer select port lcr equ mbase+3 ;Line control register mcr equ mbase+4 lsr equ mbase+5 ;Line status register msr equ mbase+6 rbr equ mbase ;Read data buffer thr equ mbase ;Tranmitter data buffer dlab equ 80h ;Divisor latch access bit thre equ 20h ;Status line THRE bit cts equ 10h ;Clear to send dsr equ 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 bit 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 0 daisy0 equ mbase ;Daisy input ports daisy1 equ mbase+1 sensesw equ mbase+1 ;Sense switches ; Define daisy 0 status input bits ribbon equ 01h ;End of ribbon paper equ 02h ;Paper out cover equ 04h ;Cover open pfrdy equ 08h ;Paper feed ready crrdy equ 10h ;Carriage ready pwrdy equ 20h ;Print wheel ready check equ 40h ;Printer check (error) ready equ 80h ;Pr4ff equ 'S'-64 ;Xoff character aesc equ 1bh ;Escape character ars equ 1eh ;RS character aus equ 1fh ;US character asp equ ' ' ;Space adel equ 7fh ;Delete ***************************************************************** * * * The jump table below must remain in the same order, the * * routines may be changed, but the function executed must be * * the same. * * * ***************************************************************** jmp $ ;Cold boot entry point owboot: jmp wboot ;Warm boot entry point oconst: jmp const ;Console status routine oconin: jmp conin ;Console input oconout:jmp conout ;Console output olist: jmp list ;List device output jmp $ ;Punch device output jmp $ ;Reader device input jmp $ ;Home drive jmp $ ;Select disk jmp $ ;Set track jmp $ ;Set sector jmp $ ;Set DMA address jmp $ ;Read the disk jmp $ ;Write the disk olistst:jmp listst ;List device status jmp $ ;Sector translation jmp $ ;SINGLE.COM hookup ***his flag is used primarily by the parallel * * drivers since the parallel port assignments differ for * * the two boards. * * * ***************************************************************** mother: db 0 wboot: jmp start ;Warm boot write through dw owboot ;Warm boot after initialization list: jmp olist ;List output dw otlst listst: jmp olistst ;List status dw stlst db 0 ;End of table marker cninit: jmp noop ;Console initialization dw cinit const: jmp oconst ;Console status dw cstty conin: jmp oconin ;Console input dw citty conout: jmp oconout ;Console output dw cotty db 0 ;End of table marker ***************************************************************** * * * This is a one-time-only warm boot routine. It checks * * for the presence of a flag characters and, if present, * * installs the console driver. Users who do not intend to * * use a Multio as console should type a flag argument '-'. * * * ************************** ***************************************************************** * * * Read a character from the serial port. * * * ***************************************************************** citty: call selcon ;Select console group conin1: in lsr ;Read status register ani dr ;Wait till character ready jz conin1 in rbr ;Read character ani 7fh ;Strip parity ret ***************************************************************** * * * Output a character to serial port. * * * ***************************************************************** cotty: call selcon ;Select console conout1:in lsr ;Read status ani thre ;Wait till transmitter buffer empty jz conout1 mov a,c ;Character is in (c) out thr ;Output to transmitter buffer ret ***************************************************************** * * * Return serial port status. Returns zero if character is not * * ready to be read. Else returns 255 if rea************************************************************** * * * The following word defines the default baud rate for the * * console device. * * * * The following is a list of possible baud rates and the * * value needed for the defcon word. * * * * Baud rate defcon Baud rate defcon * * 50 2304 2000 58 * * 75 1536 2400 48 * * 110 1047 3600 32 * * 134.5 857 4800 24 * * 150 768 7200 16 * * 300 384 9600 12 * * 600 192 19200 6 * * 1200 96 38400 3 * * 1800 64 56000 2 * * * ***************************************************************** defcon: dw 12 ;Default console baud rate ***************************************************************** * * * The next byte is to make sure that the group select byte * * on the Mult I/O or Decsion I stays consistant throughout * * the driver. Only the group bits themselves (bits 0 and 1) * * should be ********************************************************** start: lxi h,wboot ;Set up list device pointers call setup lda cpmbuf ;Test for flag ora a lxi h,cninit cz setup ;If the flag is reset then set up more routines call cninit ;Initialize console and list devices call linit jmp owboot ;Do regular warm boot setup: mov a,m ;Test for end of table ora 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 of 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 inx h jmp setup noop: ret ***************************************************************** * * * Multi I/O or Decision I console driver * * * ***************************************************************** ***************************************************************** * * * This driver on cold boot will inspect bits 1-3 of the sense * *dy. * * * ***************************************************************** cstty: call selcon ;Select console in lsr ;Read status register ani dr rz ;No charactter ready mvi a,0ffh ;Character ready ret ***************************************************************** * * * Diablo 1620 simulator for the Diablo Hytype II. * * * ***************************************************************** ***************************************************************** * * * This routine does all of the character decoding, escape * * sequences forward, backward, etc. The list of escape * * sequences, and special characters recognized is: * * * * adel ignored * * anul ignored * * aack ignored (when received) * * abel ignored * * aff form feed * * aetx etx/ack handshake * * aht horizontal tab * * alf line feed * * asp space * * abs backspace * * acr carriage return * * aesc 0 ignored * changed as you output to the group port. If * * you modify one of the other bits (such a driver-enable) * * then you should modify the same bit in the group byte * * provided. Example: * * * * ;Select console group * * lda group ;Get group byte * * ori congrp ;Select the console port * * out grpsel ;Select the group * * * * ;Modify a bit in the group byte * * lda group ;Get group byte * * ori bank ;Set the bank bit * * sta group ;Save new group setting * * ori group2 ;Select second serial port * * out grpsel ;Select the desired group * * * * Note: You should not set the group bits themselves in * * the group byte. * * * ***************************************************************** group: db 0 ;Group byte ***************************************************************** * * * The next 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 switches. If the value found is in the range 0-6 then the * * console baud rate will be taken from the rate table. * * Otherwise the current divisor latch value will be checked. * * If the divisor seems to be ok then no action will be taken * * as far as the baud rate setting goes. If the divisor is not * * ok then the baud rate will be set from the DEFCON word * * which is found just below the regular Cbios jump table. The * * standard divisor table is given below. * * * * Sense switch: 123 (0 = off, 1 = on) * * 000 = 110 * * 001 = 300 * * 010 = 1200 * * 011 = 2400 * * 100 = 4800 * * 101 = 9600 * * 110 = 19200 * * defcon = 9600 * * * ***************************************************************** ***************************************************************** * * * Due to its length, the tinit routine driver is below the * * cboot routine. * * * **********************************************5 * aesc 1 set tab stop at current print position * * aesc 2 clear all tab stops * * aesc 3 graphics mode on * * aesc 4 graphics mode off * * aesc 5 forward print * * aesc 6 backward print * * aesc 8 clear tab stop * * aesc 9 set left margin * * aesc A ignored * * aesc B ignored * * aesc D negative half line feed * * aesc U half line feed * * aesc alf negative line feed * * aesc aht c absolute horizontal tab * * aesc avt c absolute vertical tab * * aesc ars c set vmi * * aesc aus c set hmi * * * ***************************************************************** otlst: lda group ;Set printer initialized flag ori denable sta group mov a,c ;Get the character to print ani 7fh ;Strip off parity rz cpi adel ;Ignore delete rz mov c,a ;Save character lda escflg lxi h,level0 ;Level zero characters ana a mov a,c ;Scan for char in A jz lookup ;Look up activity for this character lda escflg lxi h,level1ine feed db 'U' dw poshlf ;Half line feed db alf dw neglf ;Negative line feed db aht dw settwo ;Two character escape sequence db avt dw settwo db ars dw settwo db aus dw settwo db 0 dw func1 level2: db aht dw abshtab ;Absolute horizontal tab db avt dw absvtab ;Absolute vertical tab db ars dw setvmi db aus dw sethmi db 0 dw func2 ***************************************************************** * * * The following routines execute escape sequences, etc. * * * ***************************************************************** settwo: doaesc: mov a,c ;Get the escape character sta escflg func0: ret doaetx: ret doalf: call lfvmi ;Get line feed vmi adjvp: xchg lhld dlvpos ;Get vertical motion displacement dad d shld dlvpos ret lfvmi: lda grhflg ana a lxi h,1 ;Only 1/48 if in graphics mode rnz lhld vmi ;Get vertical motion index ret neglf: call lfvmi ;Get line feed vmi call neghl call adjvp jmGet 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 ret abshtab:mov e,c ;Absolute horizontal tab mvi d,0 dcx d ;Form 16 bit tab column call newdlh jmp func2 newdlh: lhld hmi call hltde ;Multiply by hmi xchg lhld hpos ;And subtract current horizontal position xchg call hlmde shld dlhpos ret absvtab:mov e,c ;Absolute vertical tab mvi d,0 dcx d lhld vmi call hltde ;Multiply by vmi xchg lhld vpos ;And subtract the current vertical position xchg call hlmde shld dlvpos jmp func2 sethtab:call tabcol ;Set horizontal tab ora m ;OR in tab stop mov m,a ; and save jmp func1 tabcol: lhld hpos ;Compute address of current character col xchg lhld dlhpos dad d ;Get logical position xchg lhld hmi ;And divide by hmi to get character column xchg call hldde mtabp: ;Make a tab pointer ;HL -> Tab column desired (1-160) ;HL <- address of tab stop ; A <- bit mas ;Single character escape sequences cpi aesc mov a,c ;Scan for char in A jz lookup ;Execute single level escape sequence lxi h,level2 ;Two character escape sequence lda escflg ***************************************************************** * * * Lookup scans the table pointed at by HL looking for a match * * of the character in register A. * * * ***************************************************************** lookup: dcr m ;Test if end of table inr m jz gother ;Execute the default function cmp m ;Otherwise test for a match jz gother inx h ;Bump over character inx h ;Bump over function address inx h jmp lookup gother: inx h ;Bump over character mov a,m ;Get low byte of function address inx h mov h,m ;Get high byte of function address mov l,a ;Form Address of function pchl ;Execute it ***************************************************************** * * * Each of the following tables contains entries of the form: * * 1p func1 doasp: call sphmi ;Get space horizontal motion spdir: lda dirflg ;Forward or backwards ? ana a cnz neghl ;Negate HL adjhp: xchg ;Adjust Horizontal position lhld dlhpos ;Get current adjustment dad d ;Update it shld dlhpos ;And save ret sphmi: lda grhflg ;In graphics mode ? ana a lxi h,2 ;Only 1/60 if in graphics mode rnz lhld hmi ret doabs: call sphmi ;Space increment call neghl ;Negative to start with jmp spdir ;Adjust backwards doacr: xra a sta dirflg ;Forward printing sta grhflg ;No graphics mode lhld hpos ;Get current offset xchg lhld lmar ;Get left margin call hlmde shld dlhpos ;Don't move yet though mvi a,autolf ;In Auto line feed mode ? ana a jnz doalf ;Do line feed 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 move if in graphics mode jnz spdir lhld hmi jmp spdir clrall equ $ ;Clear all horizontal tabs lxi h,tabstp ;Beginnink 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 range (1-8) lxi d,tabstp ;Tab array dad d ;Make array pointer xra a stc mtab0: rar dcr c ;Bump bit counter jnz mtab0 ret clrhtab:call tabcol ;Clear horizontal tab cma ana m ;Mask out tab stop mov m,a jmp func1 doaht: lhld hpos ;Compute address of current character col xchg lhld dlhpos dad d ;Get logical position xchg lhld hmi ;And divide by hmi to get character column xchg call hldde tablop: lxi d,numtabs inx h ;Start with next position call hlcde ;Compare position with number of tabs jnc tofar ;Past last tab push h ;Save col pointer call mtabp ;Generate tab pointer ana m ;Check out tab stop pop h ;Restore col pointer jz tablop ;Loop if stop not set xchg jmp newdlh ;Set new col position and return tofar: lhld hpos ;Go all the way to the right xchg lxi h,maxrgt call hlmde shld dlhpos ret doa byte character to match * * 2 bytes of address to execute * * terminated by a first byte of 0. * * * ***************************************************************** level0: db aesc dw doaesc ;Beginning of an escape sequence db aff dw doaff ;Form feed db aetx dw doaetx db aht dw doaht ;horizontal tab db alf dw doalf ;Line feed db asp dw doasp ;Space db abs dw doabs ;Back space db acr dw doacr ;Carriage return db 0 dw dochar ;Any other character level1: db '1' dw sethtab ;Set horizontal tab db '2' dw clrall ;Clear all horizontal tabs db '3' dw setgrp ;Graphics mode db '4' dw clrgrp ;Clear graphics mode db '5' dw clrdir ;Forward printing db '6' dw setdir ;Backward printing db '8' dw clrhtab ;Clear horizontal tab db '9' dw setlmar ;Set left margin db '0' dw func1 ;No operation level 1 db 'A' dw func1 db 'B' dw func1 db 'a' dw func1 db 'b' dw func1 db 'D' dw neghlf ;Negative half lg 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 ;Used on first reset (warmboot) inx h ;Next tab stop dcr d ;Update repeat count jnz notblp ;Continue zeroing func2 equ $ func1: xra a ;Clear escape sequence flag sta escflg ret setgrp: mvi a,1 ;Set graphics mode on sta grhflg jmp func1 clrgrp: xra a ;Turn graphics mode off sta grhflg jmp func1 clrdir: xra a ;Forward print mode sta dirflg jmp func1 setdir: mvi a,a ;Set backward printing mode sta dirflg jmp func1 setlmar:lhld hpos ;Get current position xchg lhld dlhpos ;Get offset dad d shld lmar jmp func1 setvmi: mov l,c ;Set the motion index mvi h,0 dcx h shld vmi jmp func2 sethmi: mov l,c mvi h,0 dcx h shld hmi jmp func2 poshlf: call hlfvmi ;Half line feed vmi call adjvp jmp func1 neghlf: call hlfvmi ;Negative half line feed call neghl call adjvp jmp func1 hlfvmi: lhld vmi ;6ff: 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 ;Save this result lhld vpos ;Get logical vertical position xchg lhld dlvpos dad d pop d push d ;Get copy of forms length call hldde ;HL mod DE xchg pop d xchg call hlmde xchg lhld dlvpos dad d shld dlvpos jmp papr ***************************************************************** * * * Neghl forms the twos complement of HL. * * * ***************************************************************** neghl: mov a,h cma mov h,a mov a,l cma mov l,a inx h ret ***************************************************************** * * * Hlmde subtracts DE from HL and returns. * * * ***************************************************************** hlmde: xchg call neghl xchg dad d ret ***************************************************************** * * * Hlcde compares HL with DE. Ont xchg lxi h,maxrgt call hlmde shld dlhpos rgtok: lhld hpos ;Update the horizontal position xchg lhld dlhpos dad 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 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,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: 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 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 logical position dad d push h ;Save for now lxi h,dfrmln ;Get default form length lxi d,48 call hltde ;Multiply by 48 lxi d,10 call hldde ;Divide by 10 pop d xchg call hldde ;Compute HL mod DE xchg shld vpos ;Save new vertical poflg: db 0 ;Direction flag grhflg: db 0 ;Graphics mode flag escflg: db 0 ;Escape sequence in progress flag tabstp: ds numtabs/8+1 ;Tab stops bit array tablen equ numtabs/8+1 ;Length of tabs array ***************************************************************** * * * Console and list device initialization routines follow. * * * ***************************************************************** ***************************************************************** * * * Terminal initilization routine. This routine reads the sense * * switch on the WB-14 and sets the speed accordingly. * * * ***************************************************************** cinit: call selcon ;Select console mvi a,dtrenb+rtsenb ;Enable DTR and RTS outputs to terminal out mcr in rbr ;Clear reciever buffers in rbr xra a out lsr ;Clear status out ier ;Set no interrupts call selg0 ;Select group 0 in sensesw ;Get sense switches xri 0ffh ;Test for multio  return the Z flag is set if * * they are equal, the Carry flag is set if HL is less than DE. * * * ***************************************************************** hlcde: mov a,h cmp d rnz mov a,l cmp e ret ***************************************************************** * * * Divide the number in HL by the number in DE. Return the * * quotient in HL and the remainder in DE. * * * ***************************************************************** hldde: mov 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,16 ;Repeat count in reg A lxi d,0 ;Initial remainder is zero div3: dcr a ;Test if done rm ;All done ? dad h ;Shift right operand to the left xchg push psw ;Save carry dad h ;Shift left operand to the left pop psw jnc div1 ;Does it fit ? inx h div1: push h dad b jnc div2 xchg inx h xthl pop h jmp div3 div2: pop h xchg jmp div3 *******sition lxi h,0 shld dlvpos ;Reset vertical motion pop h lxi d,pfstrd ;Paper feed strobe jmp cmnd wheel: push h call carrg ;Position the carriage first call papr pop h lxi d,pwstrd cmnd: call selg0 ;Select group 0 cmnd0: in daisy0 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 cma push psw lda mother ora a jz cmndmt pop psw ;Toggle lines on a motherboard mov h,a mov a,l out daisy1 ;Output low bits mov a,h out daisy0 ;Output high bits xra e ;Slap strobe bits in out daisy0 mov a,h ;And drop strobes back down out daisy0 ret cmndmt: pop psw ;Toggle lines on a Multio ani 0ffh-rest ;Keep ribbon up on a Multio mov h,a mov a,l out daisy0 ;Output low bits mov a,h out daisy1 ;Output high bits xra e ;Slap strobe bits in out daisy1 mov a,h ;And drop strobes back down out daisy1 ret ***************************************************************** *board sta mother ;Save motherboard flag jz valid ;Skip switch checkout for multio's xri 0ffh ani 0e0h ;Mask in upper three bits rlc rlc rlc ;Move into lower 3 bits cpi 7 ;check for sense = 7 push psw ;Save value call selcon ;Re-select console pop psw jz valid ;Do default rate lxi h,btab ;Pointer to baud rate table add a ;Table of words so double 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 byte 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. 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 101 dw 6 ;19200 110 ***************************************************************** * * * The following is a list of valid baud rates. The current * * baud rate is checked on cold boot. If it is not in the * * vtab table then the baud ********************************************************** * * * Multiply the contents of HL by the contents of DE. * * * ***************************************************************** hltde: mov c,l mov b,h lxi h,0 mult: mov a,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: dad d ret ***************************************************************** * * * The routines below actually interface to the printer, * * causing paper feed, carriage, and print wheel motion. * * * ***************************************************************** carrg: lhld dlhpos ;Check for any accumulated motion mov a,h ora l rz lhld hpos ;Check for too much motion xchg lhld dlhpos dad d mov a,h ana a jp lftok lhld hpos call neghl shld dlhpos lftok: lhld hpos xchg lhld dlhpos dad d lxi d,maxrgt call hlcde jc rgtok lhld hpos ;Otherwise move only to maxrigh * * New list device status routine. Returns 0ffh if the printer * * can except another character, otherwise it returns 0. * * * ***************************************************************** stlst: lda group ;Check printer initialized flag ani denable rz ;0 = printer not initialized call selg0 ;Select group 0 lxi d,pwstrd in daisy0 ana d mvi a,0 rz cma ret ***************************************************************** * * * Dynamic data locations used by the simulator. * * * ***************************************************************** hmi: dw 0 ;Horizontal motion index. Set by linit ; and escape sequences. vmi: dw 0 ;Vertical motion index. Set by linit ; and escape sequences. vpos: dw 0 ;Vertical position. Set by platen motion dlvpos: dw 0 ;Delta vpos. Set by platen motion hpos: dw 0 ;Horizontal position. Set by carriage motion dlhpos: dw 0 ;Delta hpos. Set by carriage motion lmar: dw 0 ;Left margin dir7rate will be set from the defcon * * word found below the Cbios jump table. If the user * * happens to have a weird baud rate that is not in this * * table or is looking for a way to save space then entries * * can be added or deleted from the table. * * * ***************************************************************** vtab: dw 2304 ;50 baud dw 1536 ;75 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 48 ;2400 dw 32 ;3600 dw 24 ;4800 dw 16 ;7200 dw 12 ;9600 dw 6 ;19200 svtab equ ($-vtab)/2 ;Length of the vtab table ***************************************************************** * * * Valid checks if the divisor latch is a reasonable value. * * If the value seems off then it will get the default baud * * rate from defcon and jump to setit. * * * ***************************************************************** valid: mvi a,dlab+wls0+wls1+stb out lcr ;Acck hydone: lxi h,hinc/cperi shld hmi ;Save hmi = 120/(characters per inch) lxi h,vinc/lperi shld vmi ;Save vmi = 48/(lines per inch) lxi h,0 ;Other variables default to zero shld vpos shld dlvpos shld hpos shld dlhpos shld lmar call clrall ;Clear the TAB array xra a sta kludge ;Reset TAB clear byte sta dirflg sta grhflg ret selg0: lda group ;Select group zero out grpsel ret selcon: lda group ;Select console group ori congrp out grpsel ret sellst: lda group ;Select printer group ori lstgrp out grpsel ret db 0 ;Ensure generation of a complete hex file end ;head file for sw902, movcpm.com absasm equ 0 ;set 0 for rmac, set 1 for mac msize equ 48 ;Memory size of target CP/M nostand equ 1 ;Set to 1 for non-standard mode contyp equ 2 ;Console type cbaud equ 12 ;Console Baud Rate lsttyp equ 3 ;List Device type lbaud equ 96 ;List Device Baud Rate dmorder equ 1 ;DJDMA floppies (8") mforder equ 2 ;DJDMA floppies (5 1/4") fdorder equ 0 ;DJ2D/B floppies (8" only) mworder equ 3 ;HDDMA hard disks hdorder equ 0 ;HDCA hard disk drives maxdm equ 2 ;DJDMA floppies (8") maxmf equ 2 ;DJDMA floppies (5 1/4") maxfd equ 0 ;DJ2D/B floppies (8" only) maxmw equ 1 ;HDDMA hard disks maxhd equ 0 ;HDCA hard disk drive st506 equ 1 ;Seagate ST-506 st412 equ 0 ;Seagate ST-412 cm5619 equ 0 ;CMI CM-5619 m10f equ 0 ;Fujitsu M2301B m10m equ 0 ;Memorex m20 equ 0 ;Fujitsu M2302B m26 equ 0 ;Shugart SA4000 mfslow equ 0 ;1 = sa200 slow stepping fdorig equ 0f800h ;Origin of DJ2D/B Disk Jockey PROM wmdrive equ 0 ;CP/M logical drive for waress divisor latch in dll ;Get lower divisor value mov e,a in dlm ;Get upper divisor value mov d,a mvi a,wls1+wls0+stb 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 low 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 dcx h vskip: inx h ;Skip to next entry inx h dcr c ;Bump entry counter jnz vloop nvalid: lhld defcon ;Get default baud rate xchg setit: mvi a,dlab+wls1+wls0+stb ;Enable divisor access latch out lcr ;Set the baud rate in (de) mov a,d out dlm ;Set upper divisor mov a,e out dll ;Set lower divisor mvi a,wls1+wls0+stb out lcr done: xra a ;Clear status register out lsr ret ***************************************************************** * * * Initialize Diablo HyType printer. * * * ***************************************************************** linit: call selg0 ;SÙ Copyright (c) 1983, Morrow Designs, Inc. This program swaps physical character devices and is intended for Morrow Multio and Wunderbuss I/O only.*.$~<#~6.n%~###~:] o> > >>>*o#~#fo+~_!^#V a!_K,͌XL7ͳXCBXPMrXM͌r!m~ f6 *6*. ^#V.^#V. s#r.s#r*.^#V#^#V*.s#r. ^#V.s#r. s#r*.^#V#^#V*..s#r.^#V.s#r.s#r*. ^#V#^#V*..s#r.^#V. s#r.s#r ZA-Console Keyboard$Console Screen$Serial Port 3 Input$Centronics Parallel Port$Serial Port 3 Output$ Current KBD: is $ Current CRT: is $ Current RDR: is $ Current PUN: is $ Current LST: is $ The SWAP program will re-assign devices as follows: "K" swaps the current KBD: and RDR: input devices, "C" swaps the current CRT: and LST: output devices, "L" swaps the current LST: and PUN: output devices, "P" swaps the current PUN: and CRT: output devices "M" swaps both the cm boot from. mwquiet equ 0 ;1=no m-type for hddma banner if maxmw ne 0 badsiz equ 32 ;Number of badmap entries for HDDMA else ;(Only HDDMA drives use the bad map) badsiz equ 1 ;Leave one entry as filler endif true equ 1 false equ 0 micron equ 0 page elect group 0 in sensesw ;Get sense switches xri 0ffh ;Test for multio board sta mother ;Save motherboard flag jnz mthrin ;Initialize a Multio lda group ;Get group byte ani 0ffh-(denable+restor) ;Clear driver enable + restore sta group ori denable+restor ;Enable output drivers and pull restore down out grpsel mvi c,10 ;Hold restore line down for 50uS delop: dcr c jnz delop ani 0ffh-(denable+restor) ;Clear driver enable + restore out grpsel xra a out daisy0 ;Clear data buffers lda group ori denable out grpsel ;Re-enable the drivers mvi a,0ffh-rest ;Lift ribbon out daisy1 jmp hydone ;Mother board initialization mthrin: mvi a,pselect+rlift ;Set select line active, rlift not active out clk mvi a,0ffh out daisy0 mvi a,0ffh-rest ;Strobe restore bit low out daisy0 mvi a,10 ;Wait about 50uS dloop: dcr a jnz dloop mvi a,0ffh ;Raise restore back up out daisy0 xra a out daisy1 ;Clear data buffers mvi a,pselect ;Lift ribbon out clurrent KBD/CRT: and RDR/PUN: pairs. SWAP will accept one or two choices at a time. Following cold boot, "SWAP L M" will transfer the console to Serial Port 3, (for a modem), and places the LST: device on the Centronics Port Here is the current status:$8;head file for sw902, movcpm10.com absasm equ 0 ;set 0 for rmac, set 1 for mac msize equ 48 ;Memory size of target CP/M nostand equ 1 ;Set to 1 for non-standard mode contyp equ 2 ;Console type cbaud equ 12 ;Console Baud Rate lsttyp equ 3 ;List Device type lbaud equ 96 ;List Device Baud Rate dmorder equ 2 ;DJDMA floppies (8") mforder equ 3 ;DJDMA floppies (5 1/4") fdorder equ 0 ;DJ2D/B floppies (8" only) mworder equ 1 ;HDDMA hard disks hdorder equ 0 ;HDCA hard disk drives maxdm equ 2 ;DJDMA floppies (8") maxmf equ 2 ;DJDMA floppies (5 1/4") maxfd equ 0 ;DJ2D/B floppies (8" only) maxmw equ 1 ;HDDMA hard disks maxhd equ 0 ;HDCA hard disk drive st506 equ 0 ;Seagate ST-506 st412 equ 1 ;Seagate ST-412 cm5619 equ 0 ;CMI CM-5619 m10f equ 0 ;Fujitsu M2301B m10m equ 0 ;Memorex m20 equ 0 ;Fujitsu M2302B m26 equ 0 ;Shugart SA4000 mfslow equ 0 ;1 = sa200 slow stepping fdorig equ 0f800h ;Origin of DJ2D/B Disk Jockey PROM wmdrive equ 0 ;CP/M logical drive for warm boot from. mwquiet equ 0 ;1=no m-type for hddma banner if maxmw ne 0 badsiz equ 32 ;Number of badmap entries for HDDMA else ;(Only HDDMA drives use the bad map) badsiz equ 1 ;Leave one entry as filler endif true equ 1 false equ 0 micron equ 0 page ;********************************************************************** Title 'CBIOS-CP/M_2.2 Rev_E.4 07_Sep_83 Copyright 1983 Morrow Designs' ;********************************************************************** ; ;The following drivers are included in this CBIOS. ;------------------------------------------------- ; ; Console Devices: ; CDRV0 Prom Patch (4 Jumps: conin, conout, const & conint) ; CDRV1 Patch Area (128 bytes) ; CDRV2 Multi I/O or Decision I driver ; CDRV3 2D/B driver ; CDRV4 DJDMA serial port ; CDRV5 Switchboard serial port ; CDRV6 North Star motherboard (2 serial + 1 parallel) ; ; List Devices: ; LDRV0 Prom Patch (3 Jumps: lstout, lstost & lstset) ; LDRV1 Patch Area (128 bytes) ; LDRV2 Multio_Rev3-4 or Wunderbuss i/o Serial, no protocol ; LDRV3 Multio_Rev3-4 or Wunderbuss i/o Serial, Clear To Send protocol ; LDRV4 Multio_Rev3-4 or Wunderbuss i/o Serial, Data Set Ready protocol ; LDRV5 Multio_Rev3-4 or Wunderbuss i/o Serial, Xon/Xoff protocol ; ; Disk systems: ; DDRarm boot from. mwquiet equ 0 ;1=no m-type for hddma banner if maxmw ne 0 badsiz equ 32 ;Number of badmap entries for HDDMA else ;(Only HDDMA drives use the bad map) badsiz equ 1 ;Leave one entry as filler endif true equ 1 false equ 0 micron equ 0 page ;head file for sw902, movcpm5.com absasm equ 0 ;set 0 for rmac, set 1 for mac msize equ 48 ;Memory size of target CP/M nostand equ 1 ;Set to 1 for non-standard mode contyp equ 2 ;Console type cbaud equ 12 ;Console Baud Rate lsttyp equ 3 ;List Device type lbaud equ 96 ;List Device Baud Rate dmorder equ 2 ;DJDMA floppies (8") mforder equ 3 ;DJDMA floppies (5 1/4") fdorder equ 0 ;DJ2D/B floppies (8" only) mworder equ 1 ;HDDMA hard disks hdorder equ 0 ;HDCA hard disk drives maxdm equ 2 ;DJDMA floppies (8") maxmf equ 2 ;DJDMA floppies (5 1/4") maxfd equ 0 ;DJ2D/B floppies (8" only) maxmw equ 1 ;HDDMA hard disks maxhd equ 0 ;HDCA hard disk drive st506 equ 1 ;Seagate ST-506 st412 equ 0 ;Seagate ST-412 cm5619 equ 0 ;CMI CM-5619 m10f equ 0 ;Fujitsu M2301B m10m equ 0 ;Memorex m20 equ 0 ;Fujitsu M2302B m26 equ 0 ;Shugart SA4000 mfslow equ 0 ;1 = sa200 slow stepping fdorig equ 0f800h ;Origin of DJ2D/B Disk Jockey PROM wmdrive equ 0 ;CP/M logical drive for waV1 DJDMA floppy disk controller with 8 and 5 1/4 inch disks. ; DDRV2 DJ 2D/B floppy disk controller with 8 inch disks. ; DDRV3 HDDMA 5, 10, 16, megabyte hard disk systems. ; DDRV3 HDCA 10, 20 and 26 megabyte hard disks. ; ; Note: Floppy systems diskette (drive A:) has to have 1024 byte ; sectors in order for the cold and warm boot loaders to ; work. Be sure to format all new system diskettes with ; 1024 byte sectors. The system diskette can be either ; single or double sided. The sector size on normal (non ; A: drive) diskettes is not restricted. Thus if you have ; a diskette with software that is supposed to run on the ; A: drive then you should mount the diskette in the B: ; drive and then PIP it over to a 1024 byte sector ; system diskette. page ;***************************** ;Begin User Configuration Area ;***************************** absasm equ 1 ;set 0 for rmac, set 1 for mac ; ;General System Considerations ;============================= ;Memory Size ;----------- ; 1;head file for sw902, movcpm16.com absasm equ 0 ;set 0 for rmac, set 1 for mac msize equ 48 ;Memory size of target CP/M nostand equ 1 ;Set to 1 for non-standard mode contyp equ 2 ;Console type cbaud equ 12 ;Console Baud Rate lsttyp equ 3 ;List Device type lbaud equ 96 ;List Device Baud Rate dmorder equ 2 ;DJDMA floppies (8") mforder equ 3 ;DJDMA floppies (5 1/4") fdorder equ 0 ;DJ2D/B floppies (8" only) mworder equ 1 ;HDDMA hard disks hdorder equ 0 ;HDCA hard disk drives maxdm equ 2 ;DJDMA floppies (8") maxmf equ 2 ;DJDMA floppies (5 1/4") maxfd equ 0 ;DJ2D/B floppies (8" only) maxmw equ 1 ;HDDMA hard disks maxhd equ 0 ;HDCA hard disk drive st506 equ 0 ;Seagate ST-506 st412 equ 0 ;Seagate ST-412 cm5619 equ 1 ;CMI CM-5619 m10f equ 0 ;Fujitsu M2301B m10m equ 0 ;Memorex m20 equ 0 ;Fujitsu M2302B m26 equ 0 ;Shugart SA4000 mfslow equ 0 ;1 = sa200 slow stepping fdorig equ 0f800h ;Origin of DJ2D/B Disk Jockey PROM wmdrive equ 0 ;CP/M logical drive for wrm boot from. mwquiet equ 0 ;1=no m-type for hddma banner if maxmw ne 0 badsiz equ 32 ;Number of badmap entries for HDDMA else ;(Only HDDMA drives use the bad map) badsiz equ 1 ;Leave one entry as filler endif true equ 1 false equ 0 micron equ 0 page 9) The following equate sets the memory size in kilobytes. For ; example, 48 denotes a 48k system while 64 equals a 64k system. ; msize equ 48 ;Memory size of target CP/M biosln equ 13h ;BIOS length. Also in ABOOT&.ASM ;Non-Standard Flag ;----------------- ; If this CBIOS is used with the CP/M 2.2 system that is shipped on ; a Morrow Designs diskette then NOSTAND can be set to 1. This ; will allow the CBIOS to use various data areas found inside of ; the CP/M 2.2 BDOS. If the CBIOS is used with a different ; operating system then NOSTAND should be set to 0. ; nostand equ 0 ;Set to 1 for non-standard mode ;Define the console and printer environments ;=========================================== ; The following is a list of possible baud rates and the decimal ; value needed for the cbaud and lbaud definitions ; ; Baud Rate cbaud/lbaud Baud Rate cbaud/lbaud ; 50 2304 2000 58 ; 75 1536 2400 48 ; 110 1047 3600 32 ; 134.5 857 4800 24 ; 150 768 e set to zero in this set. ; 2) Numbering must start with 1 and be continious. ; 3) An example: Suppose that your system consists of two DJDMA_8" ; drives and four DJDMA_1/4" drives along with one drive attached to ; an HDDMA controller; Furthermore, suppose that you set dmorder to ; 3, mforder to 2 and mworder to 1. The HDDMA would be your A: drive. ; The 8" drives would be the B: and C: drives; And, finally, the D:, ; E:, F:, and G: drives would be assigned to the 5_1/4" DJDMA drives. ; dmorder equ 1 ;DJDMA floppies (8") mforder equ 2 ;DJDMA floppies (5 1/4") fdorder equ 0 ;DJ2D/B floppies (8" only) mworder equ 0 ;HDDMA hard disks hdorder equ 0 ;HDCA hard disk drives ;HDDMA controller disk drives ;---------------------------- ; 1) If the HDDMA controller has been selected then you must choose one ; (and only one) of the following drive types. ; st506 equ 0 ;Seagate ST-506 st412 equ 0 ;Seagate ST-412 cm5619 equ 0 ;CMI CM-5619 ;HDCA controller disk drives ;*U?8!9N#F#^#V#~#fo"Qkb"Qi`"QOG(Q!N#F!N#F`* ͎1:QPnP(Q,͔!~w#~}/Q>2Q>2S2S!:S:S#*S)!~#fo N#F͋*S#"SÌ:Q:QOG}o|g}*S####"S/Q(Q!~#fo~/Q!~#fo~2!~#fo~0H!~#fo>98H/Q!~w#~w/Qpn_htbqsHdi&: Missing numeric value (Q!~#fo~-¬!~w#~wÎ!~#fo~!~#fo#y!!r!N#F!ͼ= n!~#fo#B:i`"S!~#fo~OG!NQ:S :S?:S0:S?!N#FE:S2Q/Q:S\!S>>#h!N#FE*S"SE:S~:SʇÊ:S˜:Sʡä}o|g}ʼ!N#FE*S"SE:S:S:S:S:S:S:S:S!N#FE*S"SE:S#':SV:S(7:SV:SMG:SV!N#FE*S"SE:Sl:Sy2S2SE:S †:Sʙ:S –:S¦>2S2SE!N#FEE:S:S>s2QE:S:S>d2QE!N#FEE:S:S 7200 16 ; 300 384 9600 12 ; 600 192 19200 6 ; 1200 96 38400 3 ; 1800 64 56000 2 ; ;Define the console driver to be used. ;------------------------------------- ; CONTYP is: 0 Nothing, used for patching to PROM's. ; 1 Provide for 128 bytes of patch space. ; 2 Multi I/O or Decision I driver. ; 3 2D/B driver. ; 4 DJDMA serial port ; 5 Switchboard serial port ; 6 North Star motherboard (2 serial + 1 parallel) ; contyp equ 2 ;Console type cbaud equ 12 ;Console Baud Rate ;Define the list driver to be used ;--------------------------------- ; LSTTYP is: 0 Nothing, used for patching to PROM's. ; 1 Provide for 128 bytes of patch space. ; 2 Multio/Wbio serial, no protocol. ; 3 Multio/Wbio serial, Clear To Send protocol. ; 4 Multio/Wbio serial, Data Set Ready protocol. ; 5 Multio/Wbio serial, Xon/Xoff protocol. ; ; Note: The Wunderbuss i/o board (Wbio) used in the Decision 1 is ; functionally identical to the Multio.--------------------------- ; 1) If the HDCA controller has been selected then you must choose one ; (and only one) of the following drive types. ; m10f equ 0 ;Fujitsu M2301B m10m equ 0 ;Memorex m20 equ 0 ;Fujitsu M2302B m26 equ 0 ;Shugart SA4000 ;DJDMA controller equates ;------------------------ ; mfslow equ 0 ;set true if slow stepping 5-1/4" floppy ;DJ2D/B controller equates ;------------------------- ; fdorig equ 0f800h ;Origin of DJ2D/B Disk Jockey PROM ;Misc Considerations ;------------------- wmdrive equ 0 ;CP/M logical drive number to warm boot from. mwquiet equ 0 ;Set for no names printed on login (HDDMA only) if maxmw ne 0 badsiz equ 32 ;Number of badmap entries for HDDMA else ;(Only HDDMA drives use the bad map) badsiz equ 1 ;Leave one entry as filler endif page !S>>#*S"SE!N#FEE nE: Value out of range (Q!!/!N#F!ͼ= n/Q (Q!!͘2!l͡0!8/Q(Q!S!,*S"S:S 2S:S2S:S2S!!!͘2ywx#w!S!,!~#!n!͘2/Q(Q!S!,*S"S:S(:S8!S!,/Q Do it yourself I) Other Selection: 8 inch formats F) CP/M standard single density G) Morrow CP/M double density H) Morrow Micronix 5 inch hard sectored formats C) Single sided D) Double sided E) Morrow Micronix 5 inch soft sectored formats A) Morrow single sided B) Morrow double sided (Q!9!*͡0!͡0!h͡0!?͡0!/yw!~a\!>h\!~OGl0!~OG!&MM "vT*vT~2Q*vT##~#fo"S*vT####~#fo"S*vT ~#fo"S*vT ~2Q*vT ~#fo"S*vT ~#fo"S*vT ~#fo"S!=͡0͸ /Q!~i¤yn y<yv y͢yyͳyQy͸ y!;͡0>/Q(Q:Q:Q|y/Qy R3 3yn ; lsttyp equ 3 ;List Device type lbaud equ 96 ;List Device Baud Rate page ;Setup Disk System ;================= ; ;Select the Number of each type of disk drive ;-------------------------------------------- ; 1) This following table tells the system the types and numbers of drives ; that are active. ; 2) Drives that are not present should be set to zero. ; 3) An example: If you have 2-8" drives using a DJDMA and one disk ; attached to an HDDMA controller you would set maxdm = 2 and ; maxmw = 1, with all other selections set to zero. ; maxdm equ 2 ;DJDMA floppies (8") maxmf equ 2 ;DJDMA floppies (5 1/4") maxfd equ 0 ;DJ2D/B floppies (8" only) maxmw equ 0 ;HDDMA hard disks maxhd equ 0 ;HDCA hard disk drives ;Set the Logical Ordering of the drives ;-------------------------------------- ; 1) You must assign an 'order number' for each drive type selected ; in the previous set of equates. Drive types that WERE NOT selected ; in the previous set of equates must b:^ /Q Morrow DJDMA Formatter revision 2 (Q:Q< ! ͡0/QR ? d? c? b? a, 3, 2, 1, 0 . Drive A) drive 0 B) drive 1 C) drive 2 D) drive 3 Selection: (Q!z ͡0/y2Q:QOG!? Q2S2S!r ͡0*S0 l0!o ͡0:Q  :QOG}o|g}X *S####"SX :QOGi` "S :QOGi` "S /Q/Q(Q>2Q:QOG/Q Example: fdj -b512 -h10 -i5 -d0 -n2 -p10 -s2 -t40 b means bytes per sector. (128, 256, 512, 1024) d means drive number. (0, 1, 2, 3) h means holes. (1, 10) i means inches. (5, 8) n means density. (1, 2) p means sectors. (1 - 26) s means sides. (1, 2) t means tracks. (35, 40) Valid argments are b, h, i, d, n, p, s, and t. Here are meanings and legal values: (Q!!p ! ! !ͼ=! 9/Q  d c b a bytes per sector A) 128 B) 256 C) 512 D) 1024 Sector size: (Q!> ͡0/y2Q:QOG! Q!"S!< ͡0*S]!) ͡0/Q2S>2SÛ 2S>2SÛ 2S>2SÛ /Q c b a  77 trackssectored Selection: (Q!͡0/!Q2S2S!͡0/Q>2S2S1/Qba A) 0 origin sector numbers B) 1 origin sector numbers Sectors per track: (Q!d͡0/!RQ2S2S!b͡0/Q>2S2S/Q(Q!~#fo:Sw!~#fo#:Sw!~#fo *S }!~#fo##6!~#fo###6!~#fo :Sw:Qd!~#fo 6r!~#fo 6C!~#fo !~#fo ~OGi`*S }:S©:Sº!~#fo####6:S:S!~#fo####6:S:S!~#fo####6/Q:S :S!~#fo####6 Single sided Double sided Soft sectored diskette required (1 hole) Hard sectored diskette required (10 hole) Wrong type of diskette Read only diskette Drive not ready (Q2T2T*S*S&M"S*S)i`"T:Q8*T ~OGyx8*T ~OG!͡0>2Q/Q*T####~OGy@]!͡0>2Q/Q*T##~OGysv:S„:SÐ}˜|ʾ!͡0:S°:S!e͡0:Q!S~#:Qd,!z!"TP!;͡0/Q!"T*T####~OG @:~<2~6( 6`6:@(6>2@>@ x :8G:z<:v<2v>2z:z=0:v=2vM P6oÎ&E]^b\b_bbbs`1O0w{`>@:_!d~2>ͦ~V 2@2 2@6 ͠!@n(n ~>v>6 :^2:ģ~ :]M>+(?G>8>V(2WG:' !@V(+w!@@:@ :@(>>2@P6N>(  6>6R6$6R6$6R>6$626N 6>6D66D66D>666666>ww>6N 6>6D66D66D>66>@wwww>ww>:<26N ( 66NÆ6N:@(6N6N6N>2@>@ x :_G:<>>:<2>2:=V:=2:_2M @6N ( 66NÆ6N:@(6N6N6N>2@>@ x :_G:(oÎÿR]zyzzzz zzzzzzzzs{1O0w{{>@>ͦ~2@h6 ͩ>͠n(:@@>6 :yģ:y:  :}2 6 ͩ(ɯݾ >2@!@q >d2@66\  sQr{2 sssw selected. 40 tracks selected. 35 tracks selected. A) 35 tracks B) 40 tracks C) 77 tracks Selection: (Q!6 ͡0/! Q/Q>#2S2S!! ͡0/Q>(2S2S! ͡0/Q>M2S2S! ͡0/Qy v2vb^a^1 Double sided. Single sided. A) Single sided. B) Double sided. Selection:(Q:QM/Q! ͡0/! Q! ͡0>2S2S/Q! ͡0>2S2S/Q/QU Press to format, anything else to quit Insert a write enabled diskette in 8 inch drive Insert a write enabled diskette in 5 1/4 inch drive (Q!9!1͡0:QV!͡0^!͡0!*S}og0 }!~OGl0!͡0!/yw!͡0!~~¯r3/Q!~ !~ /Q drive sectors per track origin hard sectored soft sectored single density double density bytes per sector double sided single sided tracks inch (Q:QOG]!k͡0*S]!b͡0:Q¹:S®:S!T͡0*S]!3͡0:Qd!#͡0!F͡0ù!͡0!S~#!͡0y>>2S2S!,͡0P:Qs5!#"TP!"TP!t%"TP>2S2S!͡0*T:Qz:Qdz*T 6*T####6*T*T#"T-!P*T!0y*!@{+!C{+i`"T:T@½:T*T͠/Q:Q:Qd!z!"T*T:S:Sf*T##6*T###6u*S*S&M"T!T:T:T#*T*T#"T-!I{+i`"T:T@U:T*T͠/Q*T##6*T###6*T*T#"T-!P*T!0y*!@{+!C{+i`"T:T@¸:T*T͠/Q0/Q(Q!N#F͡08/Q(Q!!N#F!T͈;i`T 6!TMD/Q(Q!N#F͡0/Q.(Q:QP!~#fo}P!+͡0N2/QxmbWLA6+ @ Unknown error, returned code was Heads failed to move to the home positionTimeout waiting for data ID markLost command - channel did not respondLost data - DMA channel did not respondMedia write protectedImproper sector valueCRC error in data fieldCompare error in sector header scanSeek errorCRC error in sector header ss:@( > >2@q>@:y<2yͿ:y=2yͿq x 66\  sQr{2 ss(oÎã[s1O0w{>@>ͦ~2@6 ͩ>͠n(!:(#>:#_!~2:@@>6 :ģ~ G:'2@:G::[ :2]6 ͩ(ݾ >2@q ~ >G~>$82@!@ 666\  sr{2]sssws:@( > J>2@>@:G:<ʻ:<2>2:=:=2:2 x (#(Psws:@( > J>2@>@:G:<>2!9^#V!1 Not a SYSTEM Diskette. (^ >2!9^#V!1 Not a SYSTEM Diskette. >2!9 !͡0*S]!͡0*S]!͡0!͡0*S]!͡0/Q(Q!N#F͡0/Q(Q!N#FF/Q(Q!9!w#w!w#w!!S  #!w#w!!S  #!N#F!~w#~w-!N#F!N#F-y/Q/Q!~w#~wÇ!~w#~wáProbable bad diskette Sector verification failure (Q!)͡0!͡0/Q8b5  a 8 inch format selected 5 inch format selected A) 5 B) 8 Selection: (Q!͡0/!`Q!͡0>2Q/Q!͡0>2Q/Q/Q(Q! !N#F!T͈;i`T 6!TMD/Q(Q/Q(Q!8/QbaDouble Single A) single density B) double density Selection: (Q!n͡0/!NQ>s2Q!f͡0/Q>d2Q!^͡0/Q/Qígfedc}beao A) 5 B) 8 C) 9 D) 10 E) 15 F) 18 G) 26 Sectors per track: (Q! ͡0/!Q>2S2S! ͡0/Q>2S2So> 2S2So> 2S2So>2S2So>2S2So>2S2So/QL?b*a1 A) Soft sectored B) Hard canImproper sector header - No sync byte(s)Unreadable mediaImproper track valueDisk drive not readyImproper disk drive valueImproper command codeTimeout(Q!~w#w!~@¼#~/Q:T2T:T2T*T*T#"T6 !T! [3*T}@o|g}!T![3!~#foMD!SQ!͡0/Q!͡0 !͡0 !h͡0 !S͡0 !>͡0 !-͡0 !͡0 !͡0 !͡0 !͡0 !͡0 !͡0 !q͡0 !I͡0 !"͡0 !͡0 !͡0 !͡0!N#F M(oÎ9vz79?E8999s:1O0w{:>@:_!<~2>ͦ~V 2@2 2@6 ͠!@n(n ~>v>6 :72~:vģ>DV( 2:~ G:z'!@V #w!@@:@ :@(>>D2@(6>`> 66>6z6> 6>6>6~6666>ww> 6> 6>6>6o >wwww>ww>:~<2~6( 6`6:@(6>2@>@ x :8G:z<:v<2v>2z:z=0:v=2v:82z;^#V!1 Not a SYSTEM Diskette. (0(Q>P2Q2Q*Q*Q#"Q6"*Q*Q#"Q!~*Q*Q#"Q6*Q*Q#"Q6*Q*Q#"Q6*Q*Q#"Q6*Q*Q#"Q6%*Q6*Q(/P/Q(Q>P2Q2Q*Q*Q#"Q6*Q*Q#"Q!~*Q*Q#"Q!N#F!L}*Q*Q#"Q6*Q*Q#"Q!~*Q*Q#"Q!N#F!L}*Q*Q#"Q!~*Q*Q#"Q!N#F!L}*Q*Q#"Q6%*Q6*Q(/*Q~OG͠*Q~@u+x+/Q(Q>P2Q2Q*Q*Q#"Q6*Q*Q#"Q!~*Q*Q#"Q!N#F!L}*Q"Q*Q*Q#"Q6*Q*Q#"Q6%*Q6*Q(/*Q~OG/Q(Q/Q(Q/Q(Q/Q(Q/Q(Q/Q(Q>P2T2T*T*T#"T6#*T*T#"T!~*T*T#"T!N#F!L}*T*T#"T6*T*T#"T6%*T6*T(//Q(Q! N#F%,>P2T2T*T*T#"T6)*T*T#"T!~*T*T#"T!~#,,yw*~#fo }| w #w4!*=Y N#F,x5*=Y #~wÒ5*=Y*=Y !!5ywx#w+~#~ i`~#5*=Y ~w4*=Y ~w#~w4!!T##N#F+++N#F*=Y N#FA>x5*=Y ~@wIQ3Q!~#fo"=Y!~#fo"9Y*=Y*9Y&Mi`"=Y*=Y͕6i`"9Y*9Y";Y!;Y~#6IQ*=Y:=Y2=Y:>Y2>Y}B6*;Y*;Y#";Y66*9YMDIQ(Q!T~#i6!T"T*T"T2T2T*TMD/Q3Q!~#fo"=Y*=Y !nL#MDIQ3Q!~#fo"=Y*=Yq6i`"TJ6i`"T*T##~#fo"T*T!T  #7*T!T 6 #A7*T##*T##~#~p7*T"T*T##~#fo"T6!T:T"7:T#6!ͰAi`"T!T~#‚7IQ*T!T  #*T*T~#fo)) "T*T:Tw:T#w*T"T*T####MDIQ*T> w>#w*T####͡7*T"T63Q!~#fo"=Y!=Y~#»7IQ:=Y2=Y:>Y2>YJ6i`"T!=Y:T:T#H8*T##:=Y:>Y#H8*=Y~#fo))*=Y *T##y8x#ˆ8*=Y*T##~#fo  #*=Y *T##~#fo##~#~Ü8*T##:T:T#y8!=Y:T:T#7*T##:=Y:>Y#7*T##~#fo"T7*=Y *T##~#~*T~#fo))*T !=Yy¹8x#8*T*=Y  #*T##*=Y ~#~8*T##:=Yw:>Y#w*T"TIQ3Q!*IV"GV*GV> ?*GV~?*GV#"GVA!EV~#ʋA!B!!*EVGCi`"KV:KVWA:LVʋA*EVVJ*EV!T2!!7?!T2!}B!U*AVU}o|g!nL28/Q(Q!9!:OVw:PV#w!*OV!~#fo }|!:w:#w!!}|!w>#w!!OVyOx#G!yx#&B/Q!!  #wB!!  #wB!!  #wB!~#fo"OV!~#foMD/Q/Q(Q!w#w!~#~B!N#FB!~w#~wÌB! /Q(Q!N#FDi`"QV!QV~#B/Q*QV ~D#C*QV~#C*QV ! i`"SV:TV9C!SV>>#9C*QV 6!~#foMD/Q!>w>#w#C(Q!~#pC!~bC#~pC!>w#wEi`"UV!UV~#‡C/Q*UV!N#FfFy£C/Q*UV ~DC*UV ! *UV ! xC/Q*UV 6!N#F!N#F!N#FE/Q(Q!N#F!# y$Dx3D!WV)YͨM/Q!~#fo! MD 2+Y2,Y2*Y2)Y!)Y!~#fo" MD 23Y24Y22Y21Y!1Y!sOP!~#fo# MD 23Y24Y22Y21Y!1Y!sOP>21Y22Y>24Y>23Y!1YP/Q(Q!#~D!~#~D/Q!N#F!,&MiV "[T*T#"T!~*T*T#"T! ~*T*T#"T! N#F!L}*T*T#"T6*T"Q*T*T#"T6*T*T#"T6%*T6*T(/*Q~OG͠*Q~@Ÿ-â-/QProbable bad diskette , head , cylinder 3Q!9!~#fo"=Y!~#fo"9Y:Q.!=Y~#.!9Y~#.>2T2T> 2T3.:S2T:TOG*S&M"T!!!T92T2T!T> >#.!!T*S*9Y*=Y͠,! 9y.2T2T:TOG:T:T/!T*T ~@ /!-͡0*=Y]!-͡0!-͡0*9Y]!-͡0!T*T ~OG͠!-͡0IQIQ*T#"TL.IQ*T#"TÂ.(Q!!͒K/Q(Q!~#fo6/!>w>#w!~#x/!~#fo~ʴ/!~#fo~@r/u//Q!>w>#w!~#/!~#fo~/!~#fo~@®/ñ//Q!~w#~wG//Q!~w#~wÃ/(Q!! y2T:T/8:T/:TA)0!T>Z)0:TOG!a MD! MD/0:TOGy2T:TOG/Q3Q!~#fo"=Y*=Y~i0*=Y~OGl0*=Y#"=YJ0IQ(Q!~ }0#~0! ! !N#F! /Q(Q!N#F=!N#F!T2/Q(Q!9:Q0:S0:S0/Q!!!9:S~#fo"=Y>2U:U9:UOG!&MT ~#fo:UOG!&MT yOx#Gi`"U!U~#9:UOG!&MT ~#fo}9:UOG!&MT ~#9*U:UOG!&MT N#F:UOG!&MT N#FT29*=Y}BIQ:U2U 93Q!~#fo"=Y!~#fo!~#fo ";Y!~#fo"9Y!;Y:=Y:>Y#5:*=Y*=Y#"=Y:9Yw:!~#foMDIQ3Q!~#fo"=Y*=Y~j:*=Y> :*=Y~:2U2U*=Y~0:*=Y>9:*UMD)) )"U*U*=Y~OG! "U*=Y#"=Yq:*=Y#"=YP:*UMDIQ3Q!~#fo"=Y!~#fo"9Y!~#fo";Y*;Y:;Y2;Y:o>g"9Y:>Y;*=Y>o>g"=Y*;Y*;Y#";Y6-*=Y*9YnL"U!U~#<*9Y*U*;Y͈;*;Y ";Y*=Y*9Y͉L0 }2U!U>9:<:U'2U*;Y*;Y#";Y:Uw*;Y!yOx#GIQ3Q! ~#fo"=Y!~#fo"9Y:>Y<*=Y>o>g"=Y!#~Y21Y22Y:>Y24Y:=Y23Y!1Y-O~2U#~2V*[V ~E/Q*[VMD/Q(Q!~#DE!~6E#~DE!>w#wEi`"]V!]V~#[E/Q*]V!N#FfFywE/Q*]V ~D©E*]V ! xE*]V 6/Q*]V!~*]V#w#w#w#w*]V !~#~*]ViV}o|g!,nLMD/Q(Q!iVywx#w!)Y~#~ F!~#fo ~5F!)Y~#~EF/Q!~,w#~wF!~#foMD/QRDR:PTP:CON:LST:(Q!9!~#ʏF!~#fo~ʏF!~#•F/Q!N#FVJi`"eV:eV :fVF/Q!"_V!~#fo"aV*aV~G*_V~w*_V*aV~aG*aV>zG*aV~OG! MD G*aV~OGyw*_V#"_V*aV#"aVF*_V6!!}|:eV>G:fVuG!~#fo###~:uG!aF!N#FBKyG>L2eV2fV:H!~#fo 6D!~#fo "gV*gV6!~#fo#~:dH!~#fo~2eV2fV:eVA:fVH!eV>P>#HÝH!\F!N#FBKyG>C2eV2fV:H!WF!N#FBKyH>P2eV2fV:H!RF!N#FBKyPH>T2eV2fV!~#fo :eVw/Q!~#fo 6/Q*gV#"_V2eV2fV:eV:fVI!~#fo~H!~#fo~.HH/Q*gV*eV }!~w#~wdH*_V*_V#"_V6 *eV#"eVrH*_V*_V#"_V!N#F!~w#~w~ 1:S"1!!q'!:51!!(!:!!!*S͞2!!!9!!q(!:!!!*S͞2/Q(Q!9>P2Q2Q*Q*Q#"Q6.!*Q*Q#"Q}| i`~#fo6!*Q*Q#"Q}| i`~#fo6*Q*Q#"Q6%*Q6*Q(/!~#fo~w!~#fo~(2+2y2Q!~#fo!~#fo~*Q(//Q(Q/Q(Q!N#F!~w#~w}ʕ2!N#F!~w#~w~OGl0W2/Q(Q/Q(Q! N#F%,>P2T2T*T*T#"T6!*T*T#"T!~*T*T#"T!~*T*T#"T!~*T"T*T*T#"T6*T*T#"T6%*T6*T(/*T~OG͠*T~@L3O3/Q(Qo/Q3Q!~#fo"=Y!~#fo"9Y*9Y ~#fo}ʖ3*9Y ~#fo} ʞ3*=YMDIQ*9Y ~#³3*9Y͸4*9Y~#fo*9Y yOx#Gi`"T!T~#4*T*9Y N#F*9Y N#FT2!Ty4x#4*9Y ~ wIQ*9Y :T2)Y2*Y:T2,Y:T2+Y!)YjM*9Y*9Y ~#~*9Y *9Y ~#fo}o4r4ywx#w:=Y…4:>Yʰ4*9YN#F*9Y~w#~w:=Yw*9Y ~w#~w*=YMDIQ3Q!9!~#fo"=Y*=Y ~#5*=Y ~#fo}A5*=Y*=Y !T*=Y U#~2U#~2U!U~###>=*=Y!U##N#F+++N#F*9Y]<*9Y "9Y!)YͨM!)Y:>Y21Y22Y:>Y24Y:=Y23Y!1YkO>023Y24Y22Y21Y!1YjM##~2U!U>9ҙ=:U'2U*9Y*9Y#"9Y:Uw*9Y!yOx#GIQ3Q!"=Y*=Y~#=*=YN#F=*=YN#F!N#FT2*=Y##"=Y=IQ3Q!~#fo"=Y*=Y~>*=Y#"=Y >*=Y!yOx#GIQ>>>1?(Q!N#FDi`"U!U~#d>/Q*U ~Dw>/Q! ~#foMD!1>Q!~2U#~2U#~2U#~2U*U#:Uw:U#w:U#w:U#w!~#foMD/Q*U#)YͨM!)Y!jM~2U#~2U#~2U#~2UÞ>*U Dx2)Y2*Yx2,Yy2+Y!)Y!jM~2U#~2U#~2U#~2UÞ>/Q: can't write : can't read (Q!"GV!"IV:2MV2NV*MV*IVI!MV~#ʳ?*GV*GV#"GV*IV*IV#"IV~:MV2MV:NV2NV{?*GV*GV#"GV6!U"AV*AV*AV##"AVT?ywx#w!"GV*GV~@*GV~s@*GV> @*GV~s@Ð@*AVw#w!CV~#"A!B!!*CVEi`"KV!KV~#"A*CVVJ*CV!T2! !F?!T2!}B"A*GV~A*GV~<ʡ@*GV~>@á@*GV*GV#"GV6?*GV#"IV*IV~@*IV> @*IV~@@*AV*AV##"AV:GVw:HV#wA*GV~>@*IV"EVA*IV#"IVè@*IV"CV<H!~#fo~-I!~#fo~.-I!~w#~wI!~#fo~.HI!~w#~w2eV2fV:eV:fVzI!~#fo~ªI*_V*_V#"_V6 I*gV *gV *gV *gV 6~ w~/Q*_V*_V#"_V!N#F!~w#~w~*eV#"eVOI(Q!N#F!~w#~w}SJ!~#fo!~#fo~A3J!~#fo>Z3J!~#fo~OG! MD@J!~#fo~OGyw!~w#~wI/Q(Q!!~#~!~#fo~ʊJ!~w#~wmJ!~#fo!yOx#G/Q(Q!N#F!~w#~w}J!N#F!~w#~w!~åJ/Q(Q!N#F!~w#~w}5K!N#F!~w#~w!N#F!~w#~w~J!~#foMD/Q(Q!~#fo!~#fo K/Q!~w#~w!~w#~wEK!~#fo~bK/Q&}!!9.Q!9~w#~w#~w#~w+MD!9 _ #گK{ !94ïK! 9~K+w>#w! 9N#Fx LO>GͥKLO>G! 9q#ptQ! 9~?L+w>#w! 9N#FxSLO>GͥKcLO>G! 9q#ptQ! 9N#FͥK! 9q#ptQ! 9N#FͥK! 9q#ptQ!9~L/#>+++>#~#~#~ #~{ʆN>#># >#>N!9MD!9~#fofN! 9MD!9~#fofNͷM!9N#F!9͙NKN>N!9MD!9~#fofN! 9MD!9~#fofNͷM!9N#F!9͙NKN>N! 9MD!9~#fo#TN!9MD!9~#fo#TNͷM!9N#Fkb9͆NKN>N2O!9~O/<ùOtQO!9~#fo##~w#~w+++~w#~w OtQ!9~O/<ÃOtQO!9~#fo##+~~w+~w###~w+~w OtQ!9~O/<ÃOtQO!9~#fo##+~w+~w###~w+~w PtQ!9~#foN#F#N#F! 9~#foN#F#N#F!!9~+++ʜP~rP!9MD!9  # # #!9~w#~w#~w#~w!9~w+~w+~w+~wCP!9N#F!9~#~}|! 9tQ!9~#fo##w>#w>+++w>#w!9N#F!9~#fo  # # # of space available ; on the system tracks. ; 3) Our most restrictive (smallest) drive is the 5 1/4 inch ; 'minnie floppy'. This drive has 20 512 byte sectors for ; a total of 10k bytes on the system tracks. The 8 inch ; floppy disk drive is also very close to being filled up. ; 4) Since 512 bytes are reserved for the cold boot loader we ; have a total of 9.5k bytes for the operating system. Out ; of this 5.5k bytes are used by the (CCP + BDOS) leaving ; us with a total of 4k bytes of loaded code and data space ; to play with. Right now we are using all of this space ; so any major additions will have to result in a little ; (lot?) of code shuffeling or in the creation of a Cbios ; that simply will not fit on a small disk drive. ; 5) The BIOS can take up as much as 6.4k bytes of space; However, ; only 4k bytes are actually on the disk. The remaining space is ; used for uninitialized storage. ; ; sysgen 48k 56k 60k 62k 64k ; image CP/M CP/M CP/M CtQ~#Q#~#foy##Qx#$Q+++~#fo##Q!9!9*=Y*;Y*9Yi`!"9Y";Y"=Y!9N#F###q#p+++q!9N#F#q#pV2.1: copyright (c) 1979 by Whitesmiths, Ltd.s#(d(d( d( d( dMsMdMd=P/M CP/M ; ; 900 ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ Loader ; B00 9100 B100 C100 C900 D100 CCP ; 1300 9900 B900 C900 D100 D900 BDOS ; 2100 A700 C700 D700 EF00 E700 Cbios ; 3100 B700 D700 E700 FF00 F700 Tables (approx.) ; 35FF BFFF DFFF EFFF F7FF FFFF End of Memory ; ; ~~~~ 8900 A900 B900 C100 C900 DDT page ;***************************** ;Begin User Configuration Area ;***************************** ; ;Define TRUE and FALSE ;--------------------- ; TRUE equ 1 FALSE equ 0 ;Set the Memory Size ;------------------- ; msize equ 48 ;Memory size of target CP/M ;Boot Controller Selection ;------------------------- ; Only one of the following equates should be set to TRUE. The ; others sould be set to FALSE. These equates define the boot loader ; that is to be used. ; dmorder equ FALSE ;Set to boot a DJDMA controller 8" Drives) mforder equ TRUE ;Set to boot a DJDMA controller (5 1/4" Drives) fdorder equ FALSE ;Set to boot a DJ2D/B controller mworder equ FALSE ;Set to boot a HDDMA c that the loader itself is loaded at 80h ; 2) This program makes use of the fact that the DJDMA has a load track ; command. ; 3) Track 1 is recorded in double density format. There are ; 1024 bytes per sector. ; 4) The warm boot starts from track 0 sector 1 and continues ; through to track 1 sector 1. ; 5) The load address assumes that you're using a 48k system ; ; track sector sysgen load Name ; ; 0 1 900 ff00 Boot loader ; 0 2 980 Unused ; 0 3 a00 ; 0 4 a80 ; 0 5 b00 9100 CCP ; 0 6 b80 9180 ; 0 7 c00 9200 ; 0 8 c80 9280 ; 0 9 d00 9300 ; 0 10 d80 9380 ; 0 11 e00 9400 ; 0 12 e80 9480 ; 0 13 f00 9500 ; 0 14 f80 9580 ; 0 15 1000 9600 ; 0 16 1080 9680 ; 0 17 1100 9700 ; 0 18 1180 9780 ; 0 19 1200 9800 ; 0 20 1280 9880 ; 0 21 1300 9900 BDOS ; 0 22 1380 9980 ; 0 23 1400 9a00 ; 0 24 1480 9a80 ; 0 25 1500 9b00 ; 0 26 1580 9b80 ; ; 1 1 1600 9c00 ; 1 2 1a00 a000 ; 1 3 1e00 a400 CBIOS (@ a700h) ; 1 4 2200 a800 ; 1 5 2600 ac00 ; 1  ;Extended address ;Read a Track db redtrk db 1 ;Track 1 db 0 ;Side 0 db 0 ;Drive 0 dw sectb1 ;Sector table 1 db 0 ;Extended address db 0 ;Returned status ;Halt Command db djhalt djdone: db 0 ;Returned status ;Sector Tables for read track command ;------------------------------------ ; 1) Boot + 5ch contains 'configuration byte' for 5" systems ; org boot+5dh sectb0: dw 0ffffh, 0ffffh ;Do not load boot loader dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;22 sectors to be loaded sectb1: dw 0, 0, 0, 0ff00h ;First seven sectors ;Other Storage ;------------- ; db retries ;Retry counter endtbl equ $-1 ;end of table marker endif ;End of 8" DJDMA Cold Boot Loader page if (mforder eq 1) ;********************************************************************** ;Cold boot loader for the Disk Jockey DMA controller using 5 1/4" Disks ;********************************************************************** ; ;DJDMA Disk Controller (5 1/4" Disks) ;=============ontroller hdorder equ FALSE ;Set to boot an HDC3 controller ;Misc Equates ;------------ ; micron equ FALSE ;Set for Micronix boot loader (only DJDMA) absasm equ false ;set for MAC retries equ 10 ;Maximum # of disk retries page ;***************************** ;Begin Internal System Equates ;***************************** ; ;Sizes ;----- ; biosln equ 13h ;BIOS length in pages ccpln equ 800h ;Length of the CCP bdosln equ 0e00h ;Length of the BDOS size equ (msize*1024) ;Memory size in Kilo-bytes ;Starting addresses ;------------------ ; ccp equ size-(biosln*100h+ccpln+bdosln) bdos equ ccp+ccpln bios equ ccp+ccpln+bdosln 6 2a00 b000 ; 1 7 2e00 b400 ; 1 8 3200 b800 Unused page ;8" DJDMA Equates ;================ ; ;Define Boot Address for DJDMA boot equ 80h org boot djkick equ 0EFh ;I/O port to start DJDMA controller activity channl equ 50h ;Default Channel Address trkoff equ 22*128 ;Number of bytes loaded from track 0 setdma equ 23h ;Set DMA address djhalt equ 25h ;Halt controller djbran equ 26h ;Branch controller command redtrk equ 29h ;Read track command load2 equ 100h ;read offset#2 for movcpm offset equ 900h-boot ;read offset for DDT page ;Begin 8" DJDMA Executable Code ;============================== ; mvi a,djbran ;Load branch channel command sta channl lxi h,commnd ;Load new command channel address shld channl+1 xra a sta channl+3 djstrt: out djkick ;Start controller djwait: lda djdone ;Get final status ora a ;0 = still busy jz djwait ;Loop if busy lxi h,sectb0 ;Check for bad load lxi b,40ffh ;b = ok, c = loaded lxi d,endtbl-sectb0 ;Error co======================= ; 1) The warm boot starts from track 0 sector 1 and continues ; through to track 1 sector 1. ; 2) The cold boot loader (track 0, sector 0) is loaded into ; RAM at 80h. This loader will start loading from track 0, ; sector 1 and stops at track 1, sector 9. The load ; sequence is as follows: ; ; track sector sysgen load order Name ; 0 0 900 80 0 Cold boot ; 0 1 b00 9500 1 CCP ; 0 2 d00 9700 2 ; 0 3 f00 9900 3 ; 0 4 1100 9b00 4 ; 0 5 1300 9d00 5 BDOS ; 0 6 1500 9f00 6 ; 0 7 1700 a100 7 ; 0 8 1900 a300 8 ; 0 9 1b00 a500 9 ; ; 1 0 1d00 a700 10 ; 1 1 1f00 a900 11 ; 1 2 2100 ab00 12 CBIOS ; 1 3 2300 ad00 13 ; 1 4 2500 af00 14 ; 1 5 2700 b100 15 ; 1 6 2900 b300 16 ; 1 7 2b00 b500 17 ; 1 8 2d00 b700 18 ; 1 9 2f00 b900 19 page ;5 1/4" DJDMA Equates ;==================== ; ;Define Boot Address for DJDMA boot equ 80h org boot djkick equ 0EFh ;I/O port to start DJDMA controller activity channl equ  if not absasm aseg endif ccpln equ 800h bdosln equ 0e00h bios equ ccp+ccpln+bdosln size equ msize*1024 retries equ 10 load1 equ 100h ;read offset#1 for movcpm ;Load and execution addresses ;---------------------------- ; 1) If this program is being used to boot Micronix, and the load ; address is moved forward from 0100h, then the starting extended ; address for the djdma boot loader should be adjusted. ; if micron eq FALSE loaddr equ ccp ;Load address for floppy cboot equ bios ;Cold boot address for CP/M else ;Micronix boot loader loaddr equ 0100h cboot equ 0100h ;Cold boot address for the loader endif page if (dmorder eq 1) ;****************************************************************** ;Cold boot loader for the Disk Jockey DMA controller using 8" Disks ;****************************************************************** ; ;Disk Map of the Boot Sectors ;============================ ; 1) The loading is identical to that of of the DJ2DB except ; unt + # of sectors djloop: mov a,m ;Load sector code cmp c ;Check for 0ffh (already loaded) jz djcont ;Skip if load was 'ok' mov m,c ;Load 'loaded' flag cmp b ;Check for 'ok' status jz djcont ;Skip if load ok inr m ;Make flag = 0 inr d ;Bump error counter djcont: dcr e ;Bump sector count inx h ;Bump table pointer jnz djloop mov a,d ;Check out error counter ora a jz cboot ;Start CP/M if no errors dcr m ;Drop retry counter jnz djstrt ;Retry load operation jmp $ ;Dynamic error halt ;DJDMA Command Strings ;--------------------- ; ;Set the DMA Address commnd: db setdma dw loaddr-512 ;Start at CCP if micron eq FALSE db 0 ;Extended address for CP/M else db 0ffh ;Wrap around from ffff00 to 000100 endif ;Read a Track db redtrk db 0 ;Track 0 db 0 ;Side 0 db 0 ;Drive 0 dw sectb0 ;Sector table 0 db 0 ;Extended address db 0 ;Returned status ;Set the DMA Address db setdma dw loaddr+trkoff ;Load address for track 1 db 0 >50h ;Default Channel Address trkoff equ 9*512 ;Number of bytes loaded from track 0 setdma equ 23h ;Set DMA address djhalt equ 25h ;Halt controller djbran equ 26h ;Branch controller command redtrk equ 29h ;Read track command load2 equ 100h ;read offset#2 for movcpm offset equ 900h-boot ;read offset for DDT page ;Begin 5 1/4" DJDMA Executable Code ;================================== ; mvi a,djbran ;Load branch channel command sta channl lxi h,commnd ;Load new command channel address shld channl+1 xra a sta channl+3 djstrt: out djkick ;Start controller djwait: lda djdone ;Get final status ora a ;0 = still busy jz djwait ;Loop if busy lxi h,sectb0 ;Check for bad load lxi b,40ffh ;b = ok, c = loaded lxi d,endtbl-sectb0 ;Error count + # of sectors djloop: mov a,m ;Load sector code cmp c ;Check for 0ffh (already loaded) jz djcont ;Skip if load was 'ok' mov m,c ;Load 'loaded' flag cmp b ;Check for 'ok' status jz djcont ;Skip if load ok inr to track 1 sector 3. Only the first ; 3/4 K bytes of track 1, sector 3 is loaded since CP/M ; requires that the warm boot loader load up to the start ; of (but not past) the Cbios jump table. ; ; track sector sysgen load order Name ; ; 0 1 900 ff00 0 Boot loader ; 0 2 980 Unused ; 0 3 a00 ; 0 4 a80 ; 0 5 b00 9100 1 CCP ; 0 6 b80 9180 12 ; 0 7 c00 9200 2 ; 0 8 c80 9280 13 ; 0 9 d00 9300 3 ; 0 10 d80 9380 14 ; 0 11 e00 9400 4 ; 0 12 e80 9480 15 ; 0 13 f00 9500 5 ; 0 14 f80 9580 16 ; 0 15 1000 9600 6 ; 0 16 1080 9680 17 ; 0 17 1100 9700 7 ; 0 18 1180 9780 18 ; 0 19 1200 9800 8 ; 0 20 1280 9880 19 ; 0 21 1300 9900 9 BDOS ; 0 22 1380 9980 20 ; 0 23 1400 9a00 10 ; 0 24 1480 9a80 21 ; 0 25 1500 9b00 11 ; 0 26 1580 9b80 22 ; ;Track 1 is recorded in double density format. There are ;1024 bytes per sector. ; ; 1 1 1600 9c00 4 ; 1 2 1a00 a000 1 ; 1 3 1e00 a400 5 CBIOS (@ a700h) ; 1 4 2200 a800 2 ; 1 5 2600 ac00 6 ; 1 s to back up sta backup lxi h,loaddr+0700h ;DMA start address for first revolution - 2048 shld newdma lxi h,loaddr+0300h ;DMA start address for second revolution - 2048 shld nxtdma lxi h,2048 ;Difference between DMA addresses shld secsiz lxi h,retries*100h+1;Maximum # of errors, track # shld nxtrty jmp t0boot ;Go load in track 1 endif ;End of DJ2DB Cold Boot Loader page if (mworder eq 1) ;***************************************** ;Cold Boot loader for the HDDMA Controller ;***************************************** ; ;Disk Map of the Boot Sectors (Shugart SA1000 disk interface) ;============================================================ ; 1) Since 1k byte sectors were implemented on this disk ; track 0, sector 1 contains both the cold boot loader and ; part of the CCP. The cold boot loader relocates this ; piece of the CCP to it proper resting place as part of ; the boot process. ; ; track sector sysgen load order Name ; 0 1 900 100 0 Cold boot + CCPm ;Make flag = 0 inr d ;Bump error counter djcont: dcr e ;Bump sector count inx h ;Bump table pointer jnz djloop mov a,d ;Check out error counter ora a jz cboot ;Start CP/M if no errors dcr m ;Drop retry counter jnz djstrt ;Retry load operation jmp $ ;Dynamic error halt ;DJDMA Command Strings ;--------------------- ; ;Set the DMA Address commnd: db setdma dw loaddr-512 ;Start at CCP if micron eq 0 db 0 ;Extended address for CP/M else db 0ffh ;Wrap around from ffff00 to 000100 endif ;Read a Track db redtrk db 0 ;Track 0 db 0 ;Side 0 db 0 ;Drive 0 dw sectb0 ;Sector table 0 db 0 ;Extended address db 0 ;Returned status ;Set the DMA Address db setdma dw loaddr+trkoff ;Load address for track 1 db 0 ;Extended address ;Read a Track db redtrk db 1 ;Track 1 db 0 ;Side 0 db 0 ;Drive 0 dw sectb1 ;Sector table 1 db 0 ;Extended address db 0 ;Returned status ;Halt Command db djhalt ;Halt controller djdone:  6 2a00 b000 3 ; 1 7 2e00 b400 7 ; 1 8 3200 b800 Unused page ;DJ2DB Equates ;============= ; ;Define Boot Address for DJ2DB boot equ djram+300h ;Upper 3/4 of on board floppy RAM org boot origin equ 0f800h ;Orgin of DJ 2D Mod B PROM djram equ origin+400h ;Disk Jockey 2D Mod B routines tkzero equ origin+9h ;Track 0 seek trkset equ origin+0ch ;Set track setsec equ origin+0fH ;Set sector setdma equ origin+12h ;Set DMA address dread equ origin+15h ;Read sector dmast equ origin+24h ;Get DMA address status equ origin+27h ;Disk status dskerr equ origin+2ah ;Flash error light setden equ origin+2dh ;Set density load2 equ 100h ;read offset#2 for movcpm offset equ 900h-boot ;read offset for DDT page ;Begin DJ2DB Executable Code ;=========================== t0boot: mvi a,5-2 ;First sector - 2 newsec equ $-1 inr a ;Update sector # inr a cpi 27 ;Size of track in sectors + 1 trksiz equ $-1 jc nowrap ;Skip if not at end of track jnz t1boot ;Done with ; 0 2 d00 9300 1 ; 0 3 1100 9700 2 ; 0 4 1500 9b00 3 Bdos (@ 9d00) ; 0 5 1900 9f00 4 ; 0 6 1d00 a300 5 ; 0 7 2100 a700 6 Cbios ; 0 8 2500 ab00 7 ; 0 9 2900 af00 8 ; ; 1 10 2d00 b300 9 page ;HDDMA Equates ;============= ; ;Define Boot Address for HDDMA boot equ 100h org boot cyl equ 153 ;Specifications for a Seagate Technology 506 heads equ 4 ;Number of heads per cylinder spt equ 9 ;Sectors per track precomp equ 64 ;Cylinder to start write precomensation lowcurr equ 128 ;Cylinder to start low current stepdly equ 30 ;Step delay (0-12.7 milliseconds) headdly equ 20 ;Settle delay (0-255 milliseconds) sectsiz equ 7 ;Sector size code (must be 7 for this Cbios) ;0 = 128 byte sectors ;1 = 256 byte sectors ;3 = 512 byte sectors (default for Micronix) ;7 = 1024 byte sectors (default for CP/M) ;f = 2048 byte sectors ;Define controller commands dmaread equ 0 ;Read sector dmawrit equ 1 ;Write sector dmarhed equ 2 ;Find a sedb 0 ;Returned status ;Sector tables for read track command ;------------------------------------ ; 1) Boot + 5ch contains 'configuration byte' for 5" drives org boot+5dh sectb0: dw 0ffh, 0, 0, 0, 0 ;Do not load boot loader sectb1: dw 0, 0, 0, 0, 0 ;Load ten sectors ;Other storage ;------------- ; db retries ;Retry counter endtbl equ $-1 ;end of table marker endif ;End of 5 1/4" DJDMA Cold Boot Loader page if (fdorder eq 1) ;************************************************************* ;Cold boot loader for the Disk Jockey 2D Revision B controller ;************************************************************* ; ;Disk Map of the Boot Sectors ;============================ ; 1) The 'order' column is the interleave sequence used by the ; loader during the load. ; 2) Three spare sectors (track 0, sectors 2 to 4) have been ; provided for a more advanced boot loader at a later date. ; 3) The warm boot loader starts on track 0, sector 5 and ; continues through  this track exit equ $-2 sui 27-6 ;Back up to sector 6 backup equ $-1 lxi h,loaddr-80h ;Memory address of sector - 100h nxtdma equ $-2 shld newdma nowrap: sta newsec ;Save the updated sector # mov c,a call setsec ;Set up the sector lxi h,loaddr-100h ;Memory address of sector - 100h newdma equ $-2 lxi d,100h ;Update DMA address secsiz equ $-2 dad d nowrp: shld newdma ;Save the updated DMA address mov b,h mov c,l call setdma ;Set up the new DMA address lxi b,retries*100h+0;Maximum # of errors, track # nxtrty equ $-2 fread: push b call trkset ;Set up the proper track call dread ;Read the sector pop b jnc t0boot ;Continue if no error dcr b jnz fread ;Keep trying if error jmp dskerr ;Too many errors, flash the light t1boot: lxi h,cboot ;We jump to cboot next time shld exit mvi c,1 ;Select double density call setden xra a ;First sector - 2 sta newsec mvi a,8 ;Size of (logical) track + 1 sta trksiz dcr a ;Number of sector?ctor dmawhed equ 3 ;Write headers (format a track) dmalcon equ 4 ;Load disk parameters dmassta equ 5 ;Sense disk drive status dmanoop equ 6 ;Null controller operation reset equ 54h ;Reset controller attn equ 55h ;Send a controller attention chan equ 50h ;Default channel address stepout equ 10h ;Step direction out stepin equ 0 ;Step direction in band1 equ 40h ;No precomp, high current band2 equ 0c0h ;Precomp, high current band3 equ 80h ;precomp, low current track0 equ 1 ;Track zero status wfault equ 2 ;Write fault from drive dready equ 4 ;Drive ready load2 equ 100h ;read offset#2 for movcpm offset equ 900h-boot ;read offset for DDT page ;Begin HDDMA Executable Code ;=========================== ; lxi sp,cstkhd ;Set up stack at end of this sector lxi h,boot+200h ;Copy part of CCP up lxi d,loaddr lxi b,200h movlop: mov a,m ;Get a byte stax d ;Save it inx h ;Bump pointers inx d dcx b ;Bump counter mov a,b ;Test for end ora c jnz movlop l present mvi a,dmassta ;Sense status command sta dmaop rdychek:call hdissue ani dready ;Check for drive ready jnz rdychek ;Loop if not ready lxi h,0ffffh shld dmastep ;Do recalibrate call hdissue lxi h,0 shld dmastep ;Clear step counter shld dmarg0 ;Clear cylinder # shld dmarg3 ;Clear sector # + read disk command ret hdissue:lxi h,dmastat ;Status byte mvi m,0 out attn ;Start controller lxi d,0 ;Time out counter mov b,e ;Controller busy status hdiloop:mov a,m ;Get status ora a ;Set up CPU flags rm ;Return no error (carry reset) stc rnz ;Return error status xthl ;Waste some time xthl xthl xthl dcx d ;Bump timeout counter mov a,d ora e jnz hdiloop ;Loop if still busy stc ;Set error flag ret hdsec: db 0 ;Currently selected sector dmachan equ $ ;Command channel area dmasel0:db 10h ;Drive select (step out, drive 0) dmastep:dw 0 ;Relative step counter dmasel1:db 0 ;Head select dmadma: dw 0 ;DMA address db 0 ;Exteh ;Hard Disk Controller hdstat equ hdorg ;Hard Disk Status hdcntl equ hdorg ;Hard Disk Control hddata equ hdorg+3 ;Hard Disk Data hdfunc equ hdorg+2 ;Hard Disk Function hdcmnd equ hdorg+1 ;Hard Disk Command hdreslt equ hdorg+1 ;Hard Disk Result retry equ 2 ;Retry bit of result tkz equ 1 ;Track zero bit of status opdone equ 2 ;Operaction done bit of status complt equ 4 ;Complete bit of status tmout equ 8 ;Time out bit of status wfault equ 10h ;Write fault bit of status drvrdy equ 20h ;Drive ready bit of status indx equ 40h ;Index bit of status pstep equ 4 ;Step bit of function nstep equ 0fbh ;Step bit mask of function hdrlen equ 4 ;Sector header length secln equ 512 ;Sector data length wenabl equ 0fh ;Write enable wreset equ 0bh ;Write reset of function scenbl equ 5 ;Controller control dskclk equ 7 ;Disk clock for control mdir equ 0f7h ;Direction mask for function null equ 0fch ;Null command idbuff equ 0 ;Initialize data command isbuff equ 8 ;Initialize headxi b,10*100h+2 ;B = sector count, C = sector # call clodhd jmp cboot ;Go to CP/M clodhd: push b ;Save sector and count mov a,c ;Load sector sta hdsec lxi h,loaddr-200h ;Get DMA address (self modifying) cdmahd equ $-2 ;Storage for previous DMA address lxi d,400h dad d ;Add in offset, HL = new DMA address shld cdmahd ;Save new DMA address call crdhd ;Attempt a read pop b ;Recover sector number and count ; B = count, C = number dcr b ;Update sector count rz ;All done ? inr c ;Bump sector number jmp clodhd ;Continue reading page ;Low level HDDMA drivers ;------------------------ ; crdhd does the actual read from the controller, the DMA ; address and sector # have already been set up. ; crdhd: call hdsetup ;Set up parameters lxi b,retries*100h+1 ;Maximum # of attempts crhd: push b ;Save error count call hdissue ;Attempt the read pop b ;Restore the error count rnc ;Return if no error dcr b ;Update error count jnz crhd ;Try again ifnded address dmarg0: db 0 ;First argument dmarg1: db stepdly ;Second argument (stepping time) dmarg2: db headdly ;Third argument (Settle time) dmarg3: db sectsiz ;Fourth argument (Sector size) dmaop: db dmalcon ;Operation code dmastat:db 0 ;Controller status byte dmalnk: dw dmachan ;Link address to next command channel db 0 ;extended address org boot+200h cstkhd equ $ ;Stack area at end of sector endif ;End of HDDMA Cold Boot Loader page if (hdorder eq 1) ;************************************ ;Cold Boot loader for HDC3 Controller ;************************************ ; ;Disk Map of the Boot Sectors (Shugart SA4000 disk interface) ;============================================================ ; 1) The cold boot loader (track 0, sector 1) is loaded into ; RAM in the very last part of the Cbios. This area is ; used for uninitialized tables and thus is a safe place ; for the loader. This cold boot loader will start loading ; the CCP from track 0, sector 2er command rsect equ 1 ;Read sector command wsect equ 5 ;Write sector command load2 equ 0h ;read offset#2 for movcpm offset equ 900h-boot ;read offset for DDT page ;Begin HDC3 Executable Code ;========================== ; lxi sp,cstkhd ;Set up stack at end of this sector lxi b,19*100h+2 ;B = sector count, C = sector # call clodhd jmp cboot ;Go to CP/M clodhd: push b ;Save sector and count mov a,c ;Load sector sta hdsec lxi h,loaddr-200h ;Get DMA address (self modifying) cdmahd equ $-2 ;Storage for previous DMA address lxi d,200h ;Offset to new DMA address dad d ;Add in offset, HL = new DMA address shld cdmahd ;Save new DMA address call crdhd ;Attempt a read pop b ;Recover sector number and count ; B = count, C = number dcr b ;Update sector count rz ;All done ? inr c ;Bump sector number jmp clodhd ;Continue reading page ;Low level HDC3 drivers ;---------------------- ; crdhd does the actual read from the controller, the DMA ;  not too many errors error: jmp $ ;Dynamic error halt hdsetup:shld dmadma ;Set up DMA address call hdreset ;Reset controller lda hdsec ;Set logical sector number dcr a ;Range is actaully 0-16 call divspt ;Figure out head number -> (c) adi spt ;Make real sector number sta dmarg3 mov a,c sta dmarg2 ;Save head number cma ;Negative logic for the controller ani 7 ;3 bits of head select rlc ;Shove over to bits 2 - 4 rlc sta dmasel1 ;Save in command channel head select ret divspt: mvi c,0 ;Clear head counter divsptx:sui spt ;Subtract a tracks worth of sectors rc ;Return if all done inr c ;Bump to next head jmp divsptx hdreset:mvi a,(ret) ;One time code sta hdreset out reset ;Send reset pulse to controller lxi h,dmachan ;Address of command channel shld chan ;Default channel address xra a sta chan+2 ;Clear extended address byte xthl ;Wait for reset (around 10 uSEC's) xthl call hdissue ;Do load constants jc error ;Controller not and will finish up with ; the last part of the Cbios on track 0, sector 20. ; 2) The warm boot load sequence starts at track 0, sector 2 ; and goes straight through to sector 12. There is still ; plenty of room left in this loader for more advanced ; things like sector interleaving although this is hardly ; necessary on a hard disk. ; ; track sector sysgen load order Name ; 0 1 900 fc00 1 Cold boot ; 0 2 b00 9500 2 CCP ; 0 3 d00 9700 3 ; 0 4 f00 9900 4 ; 0 5 1100 9b00 5 ; 0 6 1300 9d00 6 BDOS ; 0 7 1500 9f00 7 ; 0 8 1700 a100 8 ; 0 9 1900 a300 9 ; 0 10 1b00 a500 10 ; 0 11 1d00 a700 11 ; 0 12 1f00 a900 12 ; 0 13 2100 ab00 13 CBIOS ; 0 14 2300 ad00 14 ; 0 15 2500 af00 15 ; 0 16 2700 b100 16 ; 0 17 2900 b300 17 ; 0 18 2b00 b500 18 ; 0 19 2d00 b700 19 ; 0 20 2f00 b900 20 ; 0 21 3100 Unused page ;HDC3 Equates ;============ ; ;Define Boot Address for HDC3 boot equ size-512 ;very last part of CP/M system org boot hdorg equ 50@address and sector # have already been set up. ; crdhd: lxi b,retries*100h+1 ;Maximum # of attempts crhd: push b ;Save error count call hdread ;Attempt the read pop b ;Restore the error count rnc ;Return if no error dcr b ;Update error count jnz crhd ;Try again if not too many errors jmp $ ;Dynamic error halt hdread: call hdprep ;Prepare the sector header image rc ;Error exit mvi a,rsect ;Read sector command out hdcmnd call process ;Process the read rc ;Error exit xra a ;Pointer to data buffer out hdcmnd mvi b,secln/4 ;Number of bytes to read lhld cdmahd ;Get destination of data in hddata ;Two dummy data bytes in hddata rtloop: in hddata ;Move four bytes mov m,a ;Byte one inx h in hddata ;Byte two mov m,a inx h in hddata ;Byte three mov m,a inx h in hddata ;Byte four mov m,a inx h dcr b ;Update byte count jnz rtloop ret process:in hdstat ;Wait for command to finish mov b,a ani opdone jz process mvi a,dskcl~w!~w#~wu!!~#fo##N#F! Hywx#w!:w:#w!*3  Ҟ!~#fo~OGyOxGyvx !~#fo##N#F!h<! <͢ !:w:#w!!~#fo~#fo }|!*3  !N#F!N#F1!~w#~w!~w#~w!~w#~wC!N#F!O<!9!!~#fo~!~#fo!~#fo~!~#fo!~!>w#w!~#fo~!~#fo~0!~#fo>9!!~#fo~OG!~#fo))))  }|!~#foMD!~#fo~A!~#fo>Z!~#fo~OG! MD#!~#fo~OGyax!~#fo~A^!~#fo>Z^!~#fo~OG! MDk!~#fo~OG>f>!!~#fo~A!~#fo>Z!~#fo~OG! MDø!~#fo~OG!~#fo))))  }|!~w#~wÂCan not write in location %h. Insufficient memory to read %s. Invalid PRL file format in %s. !9!!!~#foN#Fͬytxʓ!N#F!;<! <͢!~OGyOxGy­x!N#F!'<! <͢!!~#~!!~#~!~#fo##~#fo!~w!>w>#wÛ!N#F!N#F!~#fo& !!yOx#G ͤ!!  #!!  #!>w#w!9!>w#w!|ywx#w!~#~!~#fo#~ !~#fo~ !~w#~wö!~w#~w!~Ʀw#~wÙ!~#fo~ !~#fo#~:y!~#fo!~#fo~aT!~#fo>zT!~#fo~OG! MDa!~#fo~OG! }!~w#~wÃ!~#fo6!!~#~!!~#fo#}|!!~#fo  !~#fo~ʫ!~#fo~.!~w#~w!!~#fo  ҧ!N#F!~w#~w6 !~#fo !~#fo 6~!~#fo! !~#fo" !~#fo# 6~ w!~#fo$ >w#w!N#F!~y—x/!~#fo#6 !N#F!~w#~w6 ç!N#F!~w#~w!~#fo~a!~#fo>z!~#fo~OG! MD!~#fo~OGyw!~w#~wç!~#foMD!9!!}|!!N#F!~w#~w~ ʖ!~%ʙ!~OG!~S!!N#F!~w#~w~ OG!ï!~#fo#~!-!~!~#fo!~#fo~#fo>o>g}|k ;Turn on Disk Clock out hdcntl in hdstat ani tmout ;Timed out ? stc rnz in hdreslt ani retry ;Any retries ? stc rnz xra a ;No error exit ret hdprep: in hdstat ;Is Drive ready ? ani drvrdy stc rnz mvi a,isbuff ;Initialize pointer to header buffer out hdcmnd mvi a,null out hdfunc ;Select drive A xra a out hddata ;Form head byte out hddata ;Form track byte mvi a,0 ;Form sector byte hdsec equ $-1 out hddata mvi a,80h ;Form Key out hddata mvi a,dskclk ;Turn on Disk clock out hdcntl mvi a,wenabl ;Write enable on out hdcntl ret org boot+200h-2 ;Last word on sector is load address cstkhd equ $ dw boot endif ;End of HDC3 Cold Boot Loader end #fo !~#fo !~#fo##yx#B !N#F!<! <͢!>w#w!!~#fo!~#fo   !~#fo##~#fo!~#fo !~#fo}o|g}!~#fo##~#fo!~#fo ~OGyOxG!~#fo}o|gy xf !~#fo##~#fo!~#fo !<! <͢f !N#F!~#fo##N#F!~#foN#Fͬ!yD x#v !N#F!;<! <͢v !~w#~wM !>w#w!!  # !!~#fo!yOx#G>>  !N#F!yOx#Gywx#w!!N#F!}|!~#fo}o|g} !~w#~w !~#fo##~#fo!~#fo !~#fo }o|g} !~#fo##~#fo!~#fo !~#fo  }o|gMD!N#F!!~#foN#Fͬ!yª x# !N#F!;<! <͢!!N#F!~#fo##~#fo!~#fo !~#fo##N#FA !~w#~wÁ !~#fo##~#fo!~#fo !~#fo MD!9!!N#F!}!~#ʻ !>w>#w!~#ʾ !~#ʾ ! ~#fo~OG!yOx#Gy !~#fo!  ! ~w#~wa !#~~w+~w!~w#~w!~w#~wv !9! !N#F!~w#~wN#FSS!!N#F!~w#~wN#FS!!N#F!~w#~wN#FS!N#F!~w#~wN#FͯS!~OG!~S!~#fo~!~#fo~ ! !~!N#F!~w#~w~OG!~ò!!  #B!N#F!N#F!N#F!!N#F!N#F}|  ډ!~#foA  !~ß!~#fo0 !~*#~##~#®~®+++~#fo!9N#F#^#V!xxGyO)MD!9q#po!9~o3||g}o'/<3)"MD!9q#poG! 9~#fo!9~o/< !9~o3|g}oa'!9N#F#q#p!9N#F#^#V"""O>/G!9N#F#^#V#~#foͻz w#û!9TT|xTDxTDLL|7xLTD(D|/g}/o#x/Gy/Ox/Gy/O>=))k# w#`` * â Memory may be corrupted. Error reading %s. Next Load address: %h. Invalid CBIOS format in %s. Invalid load address %s. Can not open %s. Odd number of arguments. Usage: install [-string] file1.prl address1 [ file2.prl address2 ...] Install Revision %i.%i !9!>w#w!>w#w* ! * ! !<!~#fo##~#fo~-!~#fo##~w#~w!>w>#w!~#fo##~#fo~!!N#F!~w#~w!~#fo##N#F!~#fo##~w#~w~!~#fo6á>2!~#~>!<͢>!~w#~w!~w#~w!~#fo}o|g}^!<͢! ywx#w!>w#w!!  #!~#fo!!!~#fo)!~#fo N#Fzywx#w+#~Z!~#fo)!~#fo N#F!<͢Z!ywx#w!>w#w!!  #!~#fo)!~#fo N#F!N#FH!~w#~w!~w#~w!~#fo##!~#fo)##!~#fo N#Fpywx#w+~#!~#fo##!~#fo~#fo  !~#fo##~#fo}o|g}!~#fo)##!~#fo N#F!<͢!~w#!>w>#w!!}|!~w#~wͩ!N#F!~w#~w6!!N#F!~w#~w~OGyOxGywx#w!># !>#J!~#fo~ J!~w#~w!~w#~w~ !!}|!~w#~w!!~#fo#}|!!  #!!~#fo~!~#fo!~#fo~!~#fo!~!~w#~w!~w#~w !>#!~#fo~ ʦͩ!~#fo!~#fo~!~w#~w!~w#~w!~w#~wJͩ!N#F!~w#~w6q !!~#~!!}|!~w#~w!>w#w!!  #V!~#fo~™ͩͩ!~#fo!~#fo#}|!~w#~w!~w#~wÙͩͩ!~#fo!~#fo#}|!~w#~w!N#F!N#F1!~w#~w;!9!!~#~!N#F!} ~ !!N#F!| }|!!~#fo$ ~#~!>#v!~#›!~#fo& !~!N#F!~y!~#fo!yOx#G!~#fo$ !~#~!~#foMD!!  #!N#F!N#F!~#fo& !!yOx#G ͤ!!  #!>w#A ly installed "Newbios", or a NULL if no flagged argument is present. The BIOS modules provided here use this as an initial drive specification, i.e., -c specifies that the newly installed BIOS should respond to drives C. The CP/M system must be standard: its BIOS must begin with the jump table as defined in the "CP/M 2.0 Alteration Guide", and it must store the address of this table at location 1 in memory. A "skeletal" BIOS module begins with the same jump table, but may leave some of the required functions unimplemented. The corresponding jump vectors are left as jump-to-selfs. EXAMPLES To install the 14 inch hard disk (M26) as drives C, D, and E in a 48K CP/M (assuming that you have memory above 48K), execute INSTALL -C M26.prl C000 Here, M26.prl is the "skeletal BIOS" (provided with INSTALL) containing the 14 inch hard disk drivers, and C000 (hex for 48K) is*0F!9N#F#^#V#~#fo"Xkb"Xi`"XOGposLoad size is %h hex bytes longOutput file is %p Addresses don't matchSizes don't matchUnexpected last line in %pCan't make room for headerCan't create '%p'prlhx1hx1hx0Bad option -%acprlMAKEPRL Version %i.%i gV!9!>w#w!>w#w!>w#w! >w#w!>w#w!>w#w!>w#w!~w#~w!~w#~w!N#F!N#F!!~#±@ !~#fo~#fo~-!!~#fo~#~!~w#~w+~#fo~OG!2[U!~#~ʽ!~#~ʽ@ ý!!!!~w#~w+~#foN#F(!~w#~w!~w#~w!~w#~wñ!!$!~w#~w+~#foN#F !>w#wF!~#fo~OG!; F!!!D!~#foN#F !~#~!!!4!~#foN#F 3!!!4!~#fo##N#F !~A#~ʄ!!~#fo~#fo~!~#fo~!~#fo~.!~#fo6\!"!Dywx#w! !4ywx#w!!!!$$ywx#w+~#~!$!; !!$!~#foN#F usOh)odi the top of CP/M. If you only have 48K of memory in .pa your system, you will first have to move your CP/M downward to make room. At this writing, the 14 inch hard disk drivers required approximately 3.5K bytes, (see FILES below), so you should construct a 44K CP/M, and type INSTALL -C M26.prl B000 (B000 is 44K in hex.) If you don't know how to move your CP/M downward, see your system manual. The required program is usually called "MOVCPM". To install the Disk Jockey as drives L and M in a 44K CP/M (with at least 48K of memory), type INSTALL dj.prl B000 djram.prl E400 Here, "dj.prl" contains the Disk Jockey 2D drivers, B000 is the top of the 44K CP/M (the drivers require 3.25K), "djram.prl" is updated controller firmware to be loaded into the controller RAM, and E400 is the address of the controller RAM. (If you have a non-standard controller, use the control- ler addr Ä!~w#~w\!D!!"N#FD !4!! N#FD !>w#w!~#~ !!~#fo 6!~w#~wP!!!N#FzEy x«!; !!!!"N#F]yx!T!!! N#F]yx!4!; ! ~w#~w!~w#~w!#X##N#F+++N#F!N#Fr! N#F!!N#F!N#F!N#F!N#Fͣ! 9!"N#F=! N#F=!N#F=!$!]!~#fo!yOx#G!>!!FnV!!  #!; !~#fo!yOx#Gyx(!p; !>w#w!!  #!!~#fo!~#fo }o|g}|!>w>#w!N#F!~w#~wᗕ>!!~#fo||g}o}|x!!~#fo!~#fo !8Q}|!~#fo)!T ~#fo!~#fo)! yOx#Gyx3!!~#fo ! V!!~#fo !~#fo}/o|/g ! !  #y! !~#~!!~#fo!~#fo  !!~#fo!~#fo }|!X##N#F+++N#F!N#F!~#fo)! N#F!~#fo!~#fo !NAME INSTALL - integrate new device drivers into CP/M, Revision 1.3. SYNOPSIS INSTALL - string newbios address [ prlfile2 address2 ... ] DESCRIPTION INSTALL integrates new device drivers into an existing CP/M 2.x system. "Newbios" is a skeletal CP/M BIOS module in .PRL format (see the PRL.DOC file) containing the new drivers. INSTALL first loads "newbios" at the given address (usually the top of CP/M), then patches it into the existing BIOS by exchanging the addresses of the 17 jump vectors that begin each BIOS. If additional .PRL files are given, they are loaded at the requested addresses with no patching. Finally, INSTALL prints (top of newbios) + (newbios buffer size, if any) + 1 as the "new load address". Additional drivers can now be installed at this address. The flagged argument (-string) is copied to 80H and left there for examination by the newess +400 hex.) To install both the 14 inch hard disk and the Disk Jockey drives, you could first install one, then the other on top of it (at the printed "new load address"). This would require 6.75K of memory above CP/M. As a better alternative, there is a combined driver package that requires only 5K of memory. To use it, configure a 43K CP/M (assuming 48K of memory, or use available memory minus 5K), and type INSTALL M26+dj.prl AC00 djram.prl E400 BUGS Addresses must be specified in 4-digit hex (with no leading 0 and no trailing H). INSTALL should also accept octal and X- notation. When the Disk Jockey drivers are first accessed, they locate the controller by searching memory for a certain pattern in the controller ROM. The search is done carefully, but never- theless, might clobber someone's memory-mapped I/O. B 9!~w#~w3gV!~#fo~ʃ !~#fo~. ! ~@ #~ !~#fo~ !N#F!~w#~w!N#F!~w#~w~C !N#F!~w#~w6.!~#fo~, !N#F!~w#~w!N#F!~w#~w~Û !N#F!~w#~w!N#F!~w#~w~ !~#fo6! ~& #~ʃ nV!~#fo6nVgV!!N#F!~w#~w!N#F80yʎ !~#fo ~ ” !~#fo 6nVnV!~#fo ~ < !~w#~w< Error: gV! ! N#F!N#F!N#F!N#F!!FnVUsage: makeprl [-s hex-no] [-o output] hex-file1 [hex-file2]gV! !!FnVgV!~#fo~:y nV!~#fo ~0 !~#fo ~0ʣ nV!!N#F!!~#fo#(y x nV!!N#F!!~#fo###(y x nV!>w#w!!~#fo  #~ !!~#fo)! ~#fo !!~#fo) !~#fo (yu xʣ nV!~#fo#~0³ !~#fo##~0³ nV!~w#~w nVCan't rewind '%p'file '%p' not at correct start addressUnexpected lasnV! >w#w+~#1!!/X!N#FzEnV!!/X!N#F80nVCan't write out memoryFlush can't seekgV!9!*/\!͖Qx2P`2Q`x2S`y2R`!P`!Q~#~#~#~*\#"\!!##N#F+++N#F!N#F̈́)x!a; *\}o|g!/X!N#FzEyx"!J; nVO!~#fo"d`!~#fo"``!~#fo"b`!>w#w!:d`w:e`#w!>w#w!``>#ґ*d`> *d`~!``>#*d`~-n!>w#w*d`#"d`:``2``:a`2a`:``2``:a`2a`*d`#"d`s! ~#~‘:``:a`ڑ*d`~0‘*d` ~A;*d` >Z;*d` ~OG! MDG*d` ~OGyxPx‘*d`##"d`:``2``:a`2a`Ñ*d`~+*d`#"d`:``2``:a`2a`!``>#*d`~0C*d`>9C!*d`~OG! }|X*b`!~#!N#F>O>G!N#Fywx#w!``>#*d`~A%*d`>Z%*d`~OG! MD-*d`~OGyl6x*d`#"d`*d`~a*d`>zÝ!!N#F! N#F͖Q!~#fo }|:``2``:a`2a`*d`#"d`Ñ*d`~A*d`>Z!*d`~A*d`>Z*d`~OG! MD*d`~OG! }|!!   #X*! ~#fo }|U!!}|!*``! ~#fo##N#F+++N#F!ͮ*ywx#w! ! ~#fo####}|U!!}|!>w#w! ! ~#fo####}|U*b`~d#"!!}|!!>>#!!!N#F!! ~#fo >+F+N=!!>$!9ywx#w! ! ~#fo }|U*b`~cG"*b`~sG"*b`~iG"!~ʉ"!~a¤"!! N#F! ~w#~w}|*b`~c"!>w#wq#!:b`w:c`#w!>w#wU!! N#F! ~w#~w~#~*b`~c@#!``>#@#!~w#~w@#!!~#fo~#~!!N#F!8Q}!!~!!}|!>w#wq#!!}|!*``!N#F!3ywx#w*b`~cU*b`~sU*b`~iU:b`2b`:c`2c`U!>##!N#F!N#F!N#F!~#fomV!~#"!!  #"!!!N#F!~#fomV!~w#~w#gV!N#F!!N#F͛9nVO!9!~#fo"d`!!F`;K$!!P`~#~s$!P`NO*d`*d`#"d`6-!!~#fo!~#fo }|!>>#$!>w#w!!~#fo#! >+F+N=$!94! 9ywxt line in hex file '%p'File '%p' not in hex formatCan't read '%p'gV!9!!N#F9 yg x{ !N#F!4 ; !!!!!^ ywx#w+~¬ #~ !N#F! ; !~ #~ !N#F! ; !!  # !N#F! ; !!'X##N#F+++N#F!N#F̈́)xB!N#F! ; nVBad line in hex filegV!9!!N#F9 y€x‰nV!! N#F!N#F!N#F!^ ywx#w+~#~!H; !~#~nVnVCan't open '%p'gV!!!!N#F͐ywx#w+~.#~E!N#F!; nV!~#foMDnVCan't write out bitmapSeek error in wrheadCan't write headerCan't rewind filegV!9!>w#w!~#~!!~#fo 6!~w#~wö!!}|!N#F!~w#~w6!N#F!~w#~w!~#fo!yOx#GyOxGyw!N#F!~w#~w!~#fo!yOx#G!8Q}o|g}!N#F!~w#~w6!N#F!~w#~w! ~#fo}o|g}!N#F!~w#~w! N#F!8Q}o|g}!!d`!yOx#GP can't write can't read O!9!t!}|!"``!*``*``#"``~!>#!>#*``> ,*``~,!>w#w!v/ywx#w!"b`!t:b`:c`#*b`~<!=!!*b` ͐y~!!!*b` !#!! 9!F~!>#CÔ!~w#~w*``#"``r!>#*``> *``~!tN#F!t~w#~w*``~A*``>Z*``~OG! MDä*``~OGyw!~w#~w*``#"``C!tN#F!t~w#~w6e!v!N#FP*b`#"b`ò*b`~>V!=!!*b` $y(x~!!*b` !!! 9!F~!N#F!~w#~w)!v :b`w:c`#w*b`~*b`#"b`~gV!N#F!~#ʫî!N#F͛9nVgV!N#F!\c,nVgV!!N#F!\!#.nVO!"d`*d`~#8*d`N#FL)*d`N#F!N#FzE*d`##"d`PO!~#fo"d`!~#fo"``!~#fo"b`*d`~nq*d`~N¢*d`#"d`*``*b`N#F*b`~w#~w~#fo}|*d`MDP*``>w#w*d`~0*d`>9*``*d`~OG*``~#foMD)) )  }|*d`#"d`ìO!9!~#fo"d#w!!N#F!~#fo#!<~w#~w>2``2a`!:``:a`#%!:``:a`#҈%*d`*d`#"d`!*`` ~*``#"``!~w#~w6%!>#&*d`*d`#"d`6.>2b`2c`!:b`:c`#E&*``*b` !yx#E&*d`*d`#"d`!*`` ~*``#"``*b`#"b`í%*d`*d`#"d`6e!#~m&*d`*d`#"d`6-!!~#fo>o>g}|{&!:b`:c`#&*d`*d`#"d`60*b`#"b`E&*d`*d`#"d`6+*d`*d`#"d`!N#F! QP0 }*d`*d`#"d`!N#F! ͘P0 }*d`!yOx#GPO!9!~#fo"d`!~#fo"b`!!F`;K8'*b`*b`#"b`6-!!P`~#~$'!P`NO!"``!!! >+F+N=R'*``94! 9ywx#w!!~#fo*d` }|!>>#'!>w#w!!N#F!!<~w#~w!!  #(!~#fo!yOx#G*`` "``!!~#~!>#;(*b`*b`#"b`60!d`>#(*b`*b`#"b`6.×(!>#(*b`*b`#"b`*``!yOxGyxҁ(*``*``#"``~OGÄ(0yw!~w#~w;(!#~(!d`>#(*b`*b`#"b`60!~w#~w:d`2d`:e`2e`×(!d`>#9)*b`*b`#"b`*``!yO~#fo!yOx#G! ||} !!+X##N#F+++N#F!N#F̈́)xT!; !!!N#FzEytx!~; !!##N#F+++N#F!N#F̈́)x!i; !N#F! N#F!N#FzEyx!R; nVCan't read in seg %iCan't write out seg %igV!9!\~#_!>w#w!~#~!/X!~#fo 6!~w#~w0!!~#fo}o|g!QP}|!!~#fo}o|g}|!!/\ ° #=*/\! ##N#F+++N#F!N#FZyxr*/\!; r!>w#w!~ր#~0!~#fo)1\ >w#w!~w#~w>2\2\_!/X!~#fo !~!:\:\#!!~#fo"\!!~#fo)1\ ~#!N#F! ##N#F+++N#F!N#F'y¶x!N#F!; !~#fo"/\*/\)1\ >w#w=!>w#w!~#~!/X!~#fo 6!~w#~wnVgV!!##N#F+++N#F! N#F!N#F͍! 9nVgV!!##N#F+++N#F! N#F!N#F͍! 9nVgV!9!!N#F!͖Qx2P`2Q`x2S`y2R`!P`!Q~#~#~#~!!##N#F+++N#F!N#F̈́)x`*d`"b`*b`~/*b`~%/*b`#"b`*b` "d`!b`:d`:e`#h*b`!d`yOx#G*d`!N#F!~#fomV*b`*b`#"b`~|P!>w#w!6 *b`~-½!>w#w!*b`#"b`*b`~*b`#"b`*b`~+!*b`#"b`*b`~*b`#"b`! !*b`;i`"b`!>w#w*b`~.)! !*b` ;i`"b`*b`~aM*b`~hM*b`~oM*b`~ux!*b`*b`#"b`~!~h>2``2a`õ!6a!~o˜>2``2a`õ!~u¯> 2``2a`õ!"``*b`~x!>w#wU*b`~b¡!! N#F! ~w#~w~#~!! N#F! ~w#~w~#fo}|!~#U!!!  #H!N#FO!N#Fywx#w!~#ʟ#!!  ##!!!N#F!~#fomV!~w#~w_*b`~p# !! ~#fo~#~!! N#F! ~w#~wN#FL)ywx#w!~#U!!!  # !N#F !N#Fywx#wU*b`~l› !~a!!! ~#fo~#~#~#~!>w#w!~w#~w+#~n!!!~#fo !##~!!$T] *b`~f¢!!!}|!!N#F!!yOx#G! ~#fo >+F+N= !&!9ywx#w! CxGyx )*``*``#"``~OG#)0yw:d`2d`:e`2e`(*b`!yOx#GPO!~#fo"d`*d`"``*``~r)*``#"```)*``!d`yOx#GPO!N#FʹFi`"b`!b`~#ʮ)*b` ~)P*b` ~#fo"``! ~#)*``$ !~#~#~#~á*! ~)#~**``$ !Qá*>2d`2e`!*d`*b`fJxT*!*`` ~*d`}ƀo|g"d`**``$ *d`!~#fo MDx2P`2Q`x2S`y2R`!P`!S!Q~#~#~#~!~#foMDPO!~#fo"d`*d`"``!#~+! >#+!!P`~#~#~#~!P`͕T~#~#~#~*``*``#"``6-! ~#4+! > w#wY+! #~Y+! ! ~#fo>o>g}|!! #~~+~ !#~+!!R+! N#F!P`~#~#~#~!P`!ͨS##N#F+++N#F*``ͮ**`` "``*``!P`~#~#~#~!P`!S>02Z`2[`2Y`2X`!X`Q##~*``>9',*``~'w*``!d`yOx#GPwrite error write error bad putc call O!~#fo"d`!~#fo"``!d`~#Ÿ,!!T,!zE!F:a`,*d` ~#~,*d` N#F*d` ~w#~w*d` :``wg-*d` >#-*``MDP*d` Q "``6>2b`2c`!:b`:c`#6!~#6!!P`~#~H5!P`!`ͦMO!!ͭO!!P`~#~5!P`!X`!N#F UNO*d`*d`#"d`!~#fo0 }*b`#"b`5!!`;K!6!!P`~#~5!P`!`@LO*``#"``5:b`2b`:c`2c`à4!P`~#~/6!P`!`ͦM!`;K5*N` "b`!b`>#5!*b`)))` P`~#~|6!P`!ͦMO!`;K6!!O!*b` Q:``2``:a`2a`:b`2b`:c`2c`W6!:b`:c`#7*d`*d`#"d`60*b`#"b`6*``MDPPONMLKJIHGFEDCBACONRDRPUNLSTO>2d`2e`!"_:d`:e`#k7*d`=*d`#"d`J7:^OG! *^MDPO!~#fo"d`!^ywx#w!~#fo~#7*d`"b`!~#fo~#fo"``*b`*`` 7*``~7*b`#"b`*``#"``7P!~w#~wß7*b`*`` 7!~#fo##~OGPO!~#fo"d`!~#fo"``>2b`2c`*``~.ʮ8*``~ʮ8:b`:c`8*b`*b`#"b`*d` *``~a8*``>z8*``~OG! MDá8*``~OGyw*``#"``@8:b`:c`8*b`*b`#"b`*d` 6 î8*``~.8*``#"``8*``~8P>2b`25Cywx#w+~#$A:_2_:_2_@!~#OA!!:d`w:e`#w+N#F5Cywx#w!~#_AP!~#fo!~#fo }|!_~#ŽA!~#fo"_!~#fo!~#fo :_:_A!~#fo!~#fo "_!!~#fo##A@bad free call O!~#fo "d`!~#>B!_:d`:e`#$B!_:d`:e`#KB!!A!zE!F!~#foMDP!_~#kB*d` >w#w*d`"_>B!_:d`:e`#қB*d` :_w:_#w*d`"_*d`?>B*_"``*`` ~#fo"b`!b`~#B!d`:b`:c`#B*b`"``áB!b`~# C*d` :b`w:c`#w*`` :d`w:e`#w*d`?*``?>B*d` >w#w*`` :d`w:e`#w*``?>BgV!:_w:_#w*_!~#fo "_!:_:_xC!f`:_:_҉C!~#fo"_nV!~#foMDnVDD^DDO!~#fo"d`!~#fo"b`!>#D! yOxGyD! yCxD!FD*b`!yOx#GP*d` ~1D*d` ~OG!C[U*d` ~#fo"``!*d`VGyUDx¾DP*b`~OG! !~w#~w*b`#"b`ÿC*b`~OG! pD*b`~OG! pD!~#foMDP!>#?E*``! ~?E*``" N#F*``" ~w#~w*b`*b`#"b` N#F*d` *d`N#FzE*d` y.-x#N-! !G,!zE!Fg-*d` >w#w*d` :``w:`` t-:a`‹-*d` ~ˆ-#~,*``MDP*d` N#F*d` *d`N#FzE*d` y-x#-! !:,!zE!FP*d` >w#w*``MDPwrite error write error bad putl call O!~#fo"d`!~#fo"``!d`~#c.!!.!zE!FP!~#fo"b`!b`>#/!*d` *d` ~#fo }|!b`>#/*d` ~#~/!N#F!~w#~w*``*``#"``~:b`2b`:c`2c`*d` ~w#~wÛ.*d` ~/#~/*d` ~#/*d` ~#fo*d` ~ /*d` N#F*d` *d`N#FzE*d` yo/x#/! !-!zE!F/!b`>#n.!*d` *d`N#FzEy½/x/! !.!zE!Fn.*d` >w#wn.!~#foMDP*d` >w#w/10122+222 223O!N#FʹFi`"b`!b`~#[0P*b` ~#fo"d`!~#fo"``!>#0*b` ~0*b` ~OG! 0[U*``!yOx#GP!*b`VG!0[U!d`~#0P*d`! ~P1*d`* 6}*d`* ! ! !c`*``~g9:b`:c`g9*b`*b`#"b`*d` *``~aR9*``>zR9*``~OG! MDZ9*``~OGyw*``#"``9:b`:c`9*b`*b`#"b`*d` 6 g9*``~OGPO!9!~#fo"d`:^9!! y2^!>w#w!!"_  #9!~#fo))_ ~:!!"_  #:P!~w#~w9!!~#fo))_ }|!~#fo6!!~#X:!~#fo~w!~#fo##>w#w!:d`w:e`#w>2``2a`*d`~::*d`~::``:a`;*``*``#"``! *d`~a:*d`>z:*d`~OG! MD:*d`~OGyw;!*`` 6*d`~:;!~#fo"d`!~#fo#:^wT;*d`#"d`À:!~#fo#!̈́7yw~M;!N#F=P*d`#"d`!~#fo#~;!~#fo#~OGyy;x;!~Š;#~;!!͑?i`"b`!~#fo##:b`w:c`#w!*b`|K*b`( >w>#w!~#fo#~;!~#foMDP!~#foMDP*d`*b`8y2P`2Q`>2S`>2R`!P`Q!~w#~w*``! 5þD*d`~OGyOxGymE*``! ~mE*``" ~#fo6*d`~wÿC O!N#FʹFi`"b`!b`~#EP*b`~OGyOxGyE!N#F!N#F*b`ͦCP!~#fo"d`!>#F*d`"``!>#-F*d`~ -F*d`#"d`!~w#~wE*d`!yOx#GP*d`!``yOx#G*``*b`ͦC*d`!``yOx#G}cF|lFP!>#E!!wE*b`ͦCy”FxʝFP*d`#"d`!~w#~wEO!~#fo"d`:e`F!"_:d`:e`#F*d`))_ ~FP*d`))_ MDPgV!_~#%G!.G:_G:_%G*_mVi`"_F* _mV%GO*_"d`!~#fo"_*d`MDP8I2IIIO!~#fo"d`*d` ~#fo"``!*``$ P`~#~#~#~!P`!$T##~#~*``$ ##N#Fi`}o|g"b`*``! !!b`yOx#Gyw*``" *``* *b` }|!~#H!*``( H #HP!*d`RIxPH!N#F!N#F*d`fJxVHP*`` ~OG*`` ~OGyOxG}|HÈHi`"b`!*``( £H #®H*b`MDP*``( !~#~!b`~#H!*``* |KP*d` ~OG! *``* ! *d`! *d`+ ~OGyw*d`" *d`, }|*d`" ~#fo*d`+ ~OG 6 *``*d`" N#F*d`" ~w#~w~*d`! 5*b`~OGyOxGy1*``#"``!~w#~wt0*``!! yw{1P*``~ t0*``~t0*``~ʟ0*``~ 1*``!yOx#GP*``#"``!~w#~wt0P*``!yOx#GP!>#t0*d`! ~t0*``*d`" ~#fo~*b`~OGyOxGy¾2*``#"``!~w#~w*d`! 5*d`" ~w#~w*d`$ >2P`2Q`>2S`>2R`!P`Q+2*``~OG!$0[U*``!yOx#GP222*b` ~OGy2x3!F*``#"``!~w#~w2O!~#fo"d`*d`"b`!#~s3!>#s3!!~#fo>o>g}|*b`*b`#"b`6-!~#fo}o|g"``!~#ž3!> w#w3!#~3!!~#fo>o>g}|!:``:a`#3!N#F*``!N#FP*b`3*b` "b`*b`*``!N#FP0 }*b`>9&4*b`~'w*b`!d`yOx#GPO!9!~#fo"d`>2``2a`!#~4!!P`~#~s4!P`NO!!`;K5*N` "b`!b`>#5!*b`)))` ;K6!!P`~#~4!P`*b`)))` @LO*``!*b`~#fo"d`!#~=!!  #=*d`!~#fo ~5=!~#fo "``:a`=*d`*`` ~9=*d`*`` 60:``2``:a`2a`J=P:a`=*d`61!~#fo"``!``>#=*d`*`` 60:``2``:a`2a`Ý=*d`*`` 4Æ=PO!N#FʹFi`"d`!d`~#=P*d` ~#ʌ>*d`~OGyOxGyŒ>!*d`RI*d`~OGy OxGyj>*d` ~#fo ~w*d` N#F! *d` !*d` N#FAywx#w*d`6!~#foMDPO!~#fo"d`!~#fo"``*d`*`` "b`*b`*d`~#fo!``yOx#Gywx#w*b` *d` ~#~*d`*`` }|*b`MDPO!~#fo"d`*d` ~#fo"``*d`*d`~#fo ####!``yK?x#{?*d`*``~#fo####  *d` *`` ~#~Pout of heap space O!N#F!N#F?i`"d`!d`~#ʿ?*d`MDP!!~?!zE!FPO!~#fo"d`:d`:e`?@*d`MDi`#}o|g##"d`!_"``*``~#fo"b`!b`~#k@*b`~#fo####!d`yx#ڍ@*b`!d`  #Қ@*``*b` ~#~ñ@:_x@:_@:_2_:_2_@*b` "``@*``*d`*b`͞>ywx#w*b` !~#~*b` MDP!>w#w!d`:_:_#$A!!:_w:_#w+N#FD *``! i`"b`!! *b`MD!JG[UP!*``* |KPPO!~#fo"d`*d` ~#fo"``*d`~OGyOxGyʮI!*``( N#F*d`fJy¥IxIP!~#`J*d`~OGyOxGy`J*d` ~OG! *``! *d`~w`J*d` ~OG! *``* ! *``! i`"b`!! !b`~#OJP*d`~w*d`~wîIPO!~#fo"d`*d` ~#fo"b`!N#F!8Q"``*b` ~OG:``¬J:a`J*d`~OGy OxGy[K*d` ~OG! *d`~OGyOxGyK*b`! xKP*d`~w*b` :``w*b`! xTK!~#TK*b`! xTK*d`~wP*d`~ w*b` !~#fo}o|g}PO!~#fo"d`!~#fo"``:``2``:a`2a`:a`K*d`6*d`#"d`ÕKP! 9~#foN#FxKO>G!9~#fo^#VzK_>WxƀGzƀWyoxL L>5L>5L! 9N#F!9~#fo# ##:L +:L LчWLL!9!9!6!N#F!]WyŠL! N#F > àM!~L!>#w›L!4!q#p! N#F L!4 !]WyʠMy!Ox#Gyƀ+wx#w !#w L!69!TWͶTq#px#w#wTͶTq#p#w#wTͶT w #w #w #wTͶT w #w #w #wT~#gU#~#foy#{Ux#|U+++~#fo##[U!9!9!N#F!]WyaV!q#p! N#F!]WyU!N#FKV!yOx#GUyV+~w#~w!UO>G! ~#+~wU Vw yVU!MD!  #w)V!N#F!rV!MD ! ~#fo+ #wXVW!9!9N#F! ~Vi`+ >#w‹VæV+¦VšV[W! ~V# +~w³V!9~w#~wæV! ~Vi`+ #~wV!9~w#~wV Wi`7#~wVæV!9~"Wi`+#wW[W5Wi`>#w+W>w! !9z~w+~ w++~ wOW!!9N#F!9^#V! #~#~ yW! ~#~WҚW+©W WW>w+~w}Wi`>#w¼WJ!9N#F###q#p+++q!9N#F#q#pcopyright (c) 1979 by Whitesmiths, Ltd. NAME MAKEPRL - mak .PRL fil fro absolut he files SYNOPSIS MAKEPRL [- he number [- outpu file hex hex2 DESCRIPTION MAKEPR̠ i use t creat .PR̠ file suitabl fo loadin b th INSTAL progra (se INSTALL.DOC) Th for ma fo .PR file ca b foun i PRL.DOC Th - optio i use fo enterin th reserve buffe space (Th reserve buffe spac i entere a 16-bi numbe i addresse an o th header se PRL.DOC) Th - optio i th outpu fil specifier I n outpu fil i specified th nam fro hex i take wit .PR typ extensio added I th outpu fil doe no hav typ extension th defaul .PR i added Th nex tw argument mus b specified Th firs argumen i th he fil inpu wit a origi a 0 Th secon i th secon he fil inpu wit a origi a 10#~w M!MD! +&MMGM!MD!  #8M!4! +~w NM!5L!N#F!rV!~ʈM!~#ʈM~w! N#F !#~—MW!9!9! N#F!6 Mƀ4 !]WyN!q#p!N#F!]Wy N! N#F &%NN!~O#~Gyր+wx#w! #w )N>8!w! ~#+~w ?N!~hN!MD!  #^N!#~w oN!56N!N#F!rV!~ʨN!~#ʨN~w! N#F !#~·NW!9~#fo~#N~ƀw!9!9!N#F ! #wN!~ƀw! N#F!̀UW!9N#F!9~#fo~#~4OWMD!9!9!N#F!]WyʨOy֨OxGO!~#+~w|OyrOèOyʨO!#~w›O ÎO! @ON#F!~#~W@ON#F!~+~ +~+~ W@OMDóO!9*d`*b`*``i`!"``"b`"d`!9~w#~w#~w#~w+MD!9 _ #P{ !94P! 9~iP+w>#w! 9N#Fx}PO>GPҍPO>G! 9q#pW! 9~P+w>#w! 9N#FxPO>GPPO>G! 9q#pW! 9N#FP! 9q#pW! 9 hex I th he file d no hav typ extension '.hx0 an '.hx1 ar adde respectively. EXAMPLES T creat .PR fil o th har dis I/ drivers begi wit th assembl languag source Assembl i a ori gi an renam th he outpu (wit .'hx0 extension. The assembl i agai wit a origi o 10 hex (Con sul you assemble manua o ho t d this Wit som as semblers yo mus re-edi th sourc fil an chang th 'org statement) Afte yo hav assemble th sourc wit a origi o 10 hex renam i wit '.hx1 extension No yo ar read t us th MAKEPR program Thi i a exampl o typica wa t d th procedur describe above Th exampl assume tha th sourc i configure correctly. mac hd+dj ren hd+dj.hx0=hd+dj.hex mac hd+dj $+r ren hd+dj.hxN#FP! 9q#pW!9~$Q/#>+++>#~#~#~ #~{S>#># >#͹R!9MD!9~#foR! 9MD!9~#foR2R!9N#F!9SR͹R!9MD!9~#foR! 9MD!9~#foR2R!9N#F!9SR͹R! 9MD!9~#fo#R!9MD!9~#fo#R2R!9N#Fkb9SR͹RíS!9~S/<4TWO!9~#fo##~w#~w+++~w#~w TW!9~4T/#w>+++w>#wMD!9!9!N#F!>w#w#w##w#w!!rV! N#F !#~975717-7+7)7'7%7#7!77777 7 7 7 7 7 7f`.G $_ @ BCG@M [u+pE1=hd+dj.hex makeprl -o hd+dj.prl hd+dj.hx0 hd+dj.hx1 In the MAKEPRL line it is not required that you specify the output or add type extensions because the program uses defaults. The MAKEPRL line could be written: makeprl hd+dj hd+dj Thi for doe th sam a th firs bu i quicke t type. Th specificatio fo th - optio mus b fou digi he number. FILES MAKEPRL.COM MAKEPRL program MAKEPRL.DOC This document. makeprl.doc 3/17/81 ldk g the bytes one-for-one, setting the corresponding bit to the difference. If two bytes differ by more than 1, then some non-relocatable construct has been used. BUGS The load address must be on a page boundry (multiple of 256). prl.doc 8/5/80 gf ruct has been used. BUGS The load address must be on a page boundry (multiple of 256). ͳ*sú*sͳ!*sͶ !~ʺ!ú!Qk:KkH :LkV !͛?ú:Kk2Kk:Lk2Lk*Kk~2Mk#~2Nk#~2Ok#~2Pk!!Mk##N#F+++N#F*Qs͑0ú!*sͶ !Ai!sú*sͻ#*sͳ*s͋ ú*sͳ*súú*s,*s͋ !>͋ !͛?úͶh!~#fo"Xy*Xy~ : *Xy~ : *Xy~ D *Xy#"Xy *XyMDhͶh!~#fo"Xy*Xy i`"Xy*Xy> *Xy~ *Xy#"Xyg *XyMDhͶh!~#fo"Xy*Xy~ *Xy~2s:s{ ! ͟ !͟ !(͟ Õ h:s} ! ͟ !͟ !)͟ Õ :s ! ͟ ! ͟ Õ :s^‰ *Xy ~^‰ *Xy ~OG "yʉ *Xy ~OG "yʉ *Xy ~2s*Xy 6*Xy ͟ *Xy :sw*Xy###"XyÕ :sOG͟ *Xy#"XyÙ ͫh!N#F! òhͶh!~#fo"Xy!~#fo"Ty*Xy i`"Xy*Xy~@ *Xy~$ *Xy~* *Xy~#1 *Ty*Ty#"Ty*Xy*Xy#"Xy~*Xy~A *Xy>Z *Xy~0t *Xy>9t *Xy~0 *Xy>9 *Ty*Ty#"Ty*Xy*Xy#"Xy~C *Xy~A *Xy>Z *Xy~a *Xy>z *Xy~_ *Xy~ *Ty*Ty#"Ty*Xy*Xy#"Xy~ *Xy~a *Xy>z *Xy~0 *Xy>9 *Xy~_ *Ty*Ty#"Ty*ͻK͛?!9N#F#^#V#~#fo"7ikb"5ii`"3iOGPilot - Len Edmondson - Morrow Designs - 1982CASEDIEIEXISTINSTALLOUTCPMCHCALLLOADLFCURCLRSCOMPILEHOLDSAVEWAITESCDEFERASTRBELLRCENDEUJMCMINMAXAPRTNRTͫhòhͫh!>>#['y)!͛?))!~#fo##N#F2òhͶh!9!~#fo"Xy*Qs!!.3*Qs ~#fo}0lh!̀#!-Ji`"Ck!Mk:Dk2Dy2Ey:Dk2Gy:Ck2Fy!Dy͙d!\EStack overflow    :  xE = 7#1!" yn+  t$ : Unrecognized instruction Ͷh!9!~#fo"Xy*Xy i`"s*s~* *s#L i`"s*s i`"s2s2s*Xy"s*s~*s~:*s~(!s~#*s#"s*s~ h*s#"sí*s~)!s~#*s6*s#"s>2s*s"s*s~J*s~:J*s~(J*s~A*s>ZØ:saq!s>zq:sOG!A MD! MDx:sOGy2s:sY´:@i´h*s#"s*s~a*s>z*s~2sÎ:sN:@ih!s~#*s>h*s"s*s~A*s>Z *s~a*Xy*Xy#"Xy~ *Ty6*XyMDhͶh!~#fo"Xy*Xy~*@ *Xy#"Xy*Ak#"Ak*AkMD) )*Ss:i`"Ss!*AkMD) )*Ss  }|!~#fo*Xyhywx#w!~#fo##!~#~#~#~hͫh2s2s!Ak:s:s# *sMD) )*Ss N#FB>*s#"s 2Ak2Bkòhͫh!9͸ !w#w#w#w*Qs 2*Qs!!.3*Qs ~#fo}0v*Qs 2òh!!-Jx2Dy2Eyx2Gyy2Fy!Dy͙d! i`"s*s~*L!*sͶ !~L!##N#F+++N#F!! Lread.pilͶh!9!~#fo"Xy*Xy!.ͭGy!!*Xy!HG!"Xy!Qs~#"*Qs/!!!*XyP\yw!~U*Xy!͛?!!~OG .i`"Qs*>iB>*Xyhi`">i!Qk"Kk2Mk2Nk2Ok2Pk*2z*s#"s!s:s%:s#+h:s2s:s2s*s*s~ah*s>zh*s~OG!A MD! MDp*s~OGyw*s~Yʌ*s~Nʌ*s#"s*s6*s9!Æh!s~#ʺ*s*s "h>2s!!!ss:sa!s>z:sOG!A MD! MD:sOGy2s:sRº*sú!*Ik!Ais!*sͶ !~$T!Ai!sú!~#º!AiC!͗ú>2s2s*s"s!*sͶ i`"s!~!͗yʄ!Ci`"s!s~#ʄ*s*Ik!Ais!*sͶ !~$!Ai!sú!~#º!AiC!͗ú!͟ ú!Ms:Kk9:LkL!͋ !͛?*Kk*Kk####"Kk:Mkw:Nk#w:Ok#w:Pk#w*sú!͟ ú*saú*sú!*sͶ i`"s*s~ʼ*s#"s*sͻ#*sͳ*s!sú>2;iú>2;iú*>2;i!*sͶ !Dy 2P2Ik2Jkú*si`"Ikú*si`"s*s:s2s:s2s}ʺ!Z͋ ï!,*s ú!^*s ú*sͻ#*sF*Xy͋yʊ*s##N#FB>*s##*Tyhywx#wh*Gk#"Gk*Gk))*Ws:i`"Ws*Gk))*Ws  "s*s*Xyhywx#w*s##*Tyhywx#wh*s####"sͶh!~#fo"Xy*Xy~#¿*Xy  i`"Xy*Xy~h*Us"s*Ek))*Us :s:s*sN#F*Xy͋yd*s##!~#~h*Ek#"Ek*Ek))*Us:i`"Us*Ek))*Us  "s*s*Xyhywx#w*s##!~#~h*s####"sͶh!~#fo"Xy*Xy~$*Xy#"Xy*Xy~(*Xy#"Xy*Xy-Ji`*Xy  "s*s~)*s6*Ws"s*Gk))*Ws :s:s*sN#F*Xy͋y *s##~#foMDh*XyMDh*s####"sͶh!~#fo"Xy*Xy~#8*Xy#"Xy*Us"s*Ek))*Us :s:sx*sN#F*Xy͋y~*s##~#foMDhh*s####"s>Ͷh!~#fo"Xy!~#fo"Ty*Xy~2s*Ty~2s:sA!s>Z:sOG!a MD! MD:sOGy2s:sA !s>Z :sOG!a MD! MD:sOGy2s!s:s7h*Xy#"Xy*Ty#"Tyä:s&hͶh!~#fo"Xy*Xy~r*Xy> x*Xy~xhh*Xy#"XyRͶh!~#fo"Xy!~#fo"Ty*Xy~©h*Ty~*Xy"s*Ty"s*s~hh*s#"s*s#"sý*s~2s*s~2s:sA!s>ZXy-J*XyD*tMDhͶh!9!~#fo"Xy!*XyͶ !"Xy*Xy~0`*Xy>9`*XyCh*XyhTIMEOUTͶh!~#fo"Xy!~#fo"Ty!~#>2t!!#~~+~ !>2Dy2Ey>2Gy>2Fy!Dyog>2t*Xy"ty:t!~###7*Ty!k*XyFh>2ty2t:t[*Xy"to!>2Dy2Ey>2Gy>2Fy!DyXh:t|*Xy"t! ͟ ! ͟ :t©!Xy:t“:t#:t2t:t2t:t ʹ:t ! ͟ *t6h*t*t#"t:tw*t!XyyOx#G!Tyyx#ͫh! òhͫh! òhͫh!9!!N#FͶ !:Dy2Mk:Ey2Nk:Fy2Ok:Gy2Pk!!Mk##N#F+++N#F*Qs͑0òhͫh:;i|òh!2@i!"t*Xyͳ*Xyͻ#*Xy"!t*!t~ʞ *t*t##"t:!tw:"t#w*!t~ *!t~OG!Tyy‘ x# *!t#"!tv *tw#w!"t*t~#!!Ai*tN#F!y!>2@i!*!t~ʞ *!t~OG!Tyy x#X *!t*!t#"!t6X:Dyw:Ey#w:Fy#w:Gy#w(!!*>iP\y25t:5tA)*>iòh!Qs~#R)*Qs/!C':5tOG .i`"Qs!Qs~#w)òh!!Mk##N#F+++N#F*Qs͑0*6t/!5'Ròhͫh! !##N#F+++N#F!8tHi`8t 6!8tMDòhMorrow Designs Pilot (c) 1982 ͫh!)͋ òhͶh!~#fo"Xy!~#fo"Ty*Xy i`"Xy*Xy> d**Xy~d**Ty*Ty#"Ty*Xy*Xy#"Xy~3**Ty6*XyMDhͫh>2Tt2Ut*Tt~#foC "Tt*Tt~#fo"Zt!Tt:Zt:[t#ҫ*òh*Zt"Vt*Vt~ʿ*òh>2Nt>2Ot:Ot**Vt~OGy*x+>2Nt+:Ot@+òh:Ot2Ot**Vt~OGy+x**Vt*Vt#~#fo ###"Vt!Zt:Vt:Wt#*òh:NtM+òh*Vt#~#fo"Pt*Vt*Vt#~#fo ###"Xt*Xt~OGy}+x¼+*Pt*Xt#~#fo "Pt!N#F-Ji` "Rt!Rt:Pt:Qt#+òhòh!Rt:Pt2Pt:Qt#2Qt*Vt#:Ptw:Qt#w*Vt###*Pt "Xt*Xt6*Xt#:Rtw:St#w*Xt###!N#FR,>2Tt2Ut*Tt~#fo? "Tt*Tt~#fo "Lt*Lt~wòhpilot Ͷh!~#fo"Xy!~#fo"Ty*Xy~ʄ,*Xy~;™,*Ty6 ô,!!J,*TyFh*Xy~|ª,*Ty6ô,*Ty*Xy~*Xy#"Xy*Ty#"Tyk,Ͷh!~#fo"Xy*Xy~-*Xy*Xy~A-*Xy>Z-*Xy~OG!a MD!:sOG!a MD! MD:sOGy2s:sAI!s>ZI:sOG!a MD! MDP:sOGy2s!s:s*Ty#"Tyéͫh!!N#F-J6=ywx#w!!N#F!N#FHG!~#foMDòhͶh!9!~#fo"Xy*Xy"s*s~*s~$*s~#*s~`*s~h*s#"s!"s*Xy"s2s2s*s~;*s6!!*XyHGh*s~$g*s#~$“*s*s#"s6$*s##"s*s~#*s#~#*s*s#"s6#*s##"s!*sͶ i`"s!!q*sHGi`"s*s~`**s#~`X*s*s#"s6`*s##"s!*sͶ i`"s!!*sHGi`"s*s~.x*s"s*s*s#"s*s*s#"s~!s~#g*s"s*s#"s2s2s*s*s#"s*s*s#"s~Ͷh!~#fo"Xy*Xy~³h*Xy~*Xy~0*Xy>9h*Xy#"Xyóhͫh!!N#F!sGi`s 6!sMDòh: can't access ͫh!N#F͋ !͋ òhͫh!Ysywx#w!~#fo#~#ʊ!~#fo#N#F!N#F͋yʐ!~#fo~OGòhòh!~w#~wLͫh!9!!!!N#FP\yw!~òh!~OGYòhͫh!N#Fq*y ! h*t##"tì Ͷh!9!~#fo"Xy!~#fo"Ty!!!*Ty!!!HG! 9!"Ty*Xy͍!*Ty͍!*XyDy}!*TyDh*Ty*Xy͂hͫh!~#fo"#t!~#fo"%t*#t~!*#t~ !*#t#~ !*#t#"#tæ!*%t6òh*%t*%t#"%t*#t*#t#"#t~æ!0123456789abcdefABCDEFͫh!!!N#FͭGòhͶh!~#fo"Xy!>#>"h*Xy"'t!~w#~w!~#v"*'t~ʃ"*'t~,ʃ"*'t#"'t["!~#ʢ"h*'t~v"*'t#"'t!~w#~wQ"*Xy~ʻ"*Xy~,"*Xy6"*'th*Xy#"Xyâ"ͫh!~A#~"!>Z>##!~a#~ #!>z>##!~-##~"#%#òhͫh!~A#~G#!>Z>#t#!~a#~c#!>z>#t#!~_q##~z#}#òhͶh!~#fo"Xy*Xy~ʮ#*Xy~w*Xy~±#*Xy6ñ#h*Xy#"XyÎ#Ͷh!~#fo"Xy*Xy~#*Xy~ #*Xy~ ##h*Xy#"Xy#*Xy6# >- + : . ^ * # $a:xstatex.pilwritea:xstatex.pilͫh!3$!9$)-i`"1t!1t~#p$!%$òh*Ws")t*Gk))*Ws :)t:*t$*1t!#$͢4*1t*)tN#F͢4*1t!!$͢4*1t*)t##N#F͢4*1t!$͢4*)t####")tv$*Us"+t*Ek))*Us :+t:,t[% MD-*Xy~OGyw*Xy#"Xy,hͫhòhͶh!~#fo"Xy!~#fo"TyE.i`"^t!^t~#Y-h*Ty*Xyͷ.i`"\t:\tx-:]t-h*Ty*\t*^t̀/*^tMDhͶh!~#fo"Xy!~#fo"Ty!~#fo"Vy*Ty*Xyͷ.i`"`t:`t-:at-h*Vy/*Ty*`t*Vỳ/*VyMDhͫhE.i`"bt!bt~##.òh!N#F!N#F*bt̀/*btMDòhͫh2et2ft>2dt:dt.:dtOG!Udt ~#fo}œ.:dtOG!Udt "etÜ.*etMDòh:dt2dtT.]/r.a.ww/Ͷh!~#fo"Xy!~#fo"Ty*Ty~OG!.Æh!!*Xy|Zi`"gt*gtMDh!!*XyP\i`"gt:gt!/:ht;/!!*Xy|Zi`"gt!!it##N#F+++N#F*gtͧJ.!!*XyP\i`"gt.!"gt.Ͷh!9!~#fo"Xy!~#fo"Ty!~#fo"Vy*Xy :Tyw:Uy#w*Xy w#w*Xy w#w*Xy *Vy~r//ywx#whͶh!~#fo"Xy*Xy!7*Xy N#FY*Xy ~w#~w*Xy ~#fo}p0*Xy ~#fo|s0*Xy N#F9*Xy ~w#~ws0h*Xy w#w*Xy ~w#~wp0Ͷh!9!~#fo"Xy! ~#fo"Ty*Xy ~#fo}@0h*Xy!7*Xy w#w*Xy*Xy ~#~*Ty!##N#F++N#FG$!͛?òha:pilotͫh!N#FDy6òh!!N#F-Ji`!~#fo " t!: t: t#ڐ* t~;ʐ* t~|ʐ: t2 t: t2 t[* t#!: t: t#Ҭòh* t: t2 t: t2 t6[a:$$$.suba:$$$.subͫh!z9: t!!!|Zy2 t: t!!͛?!z!N#F-Jyw!!N#F!{F!!z: tOGTòh-+=Ͷh!9!~#fo"Xy!*XyͶ i`"Xy!6+2 t2t!*XyͶ i`"Xy!~* t!͗h!_!͝Fy”!]!͝Fy!6+Ô![!͝Fy !6-Ô!͗y+!Ci`"tx!~$K!qCi`"tx!~@j!C 2t2tx!i`"t!~+’* t*t " tÔ!t: t2 t:t#2tÔͫh*Ws"t*Gk))*Ws :t:t*tN#FB>*t##N#FB>*t####"tð2Gk2HkòhͶh!~#fo"Xy*Xyy2t*Xy~+*Xy~,+*Xy#"Xy*Xy~:*Xy#"Xy*Xyy2t!͟ !=͟ :t 2t:t 2t:tOG͟ :tOG͟ hͶh!~#fo"Xy*Xyy2t*Xy~ʶ*Xy~,ʶ*Xy#"XyÛ*Xy~*Xy#"Xy*Xyy2t:tOG:tOGCchͶh!~#fo"Xy!!t**1t!$͢4*1t*+tN#F͢4*1t!$͢4*1t*+t##N#F͢4*1t!$͢4*+t####"+t$*Ss"-t*AkMD) )*Ss :-t:.t%*1t!$͢4*1t*-tN#F͢4*1t!$͢4*1t*-t####N#F+++N#Fͬ)͢4*1t!$͢4*-t}o|g"-ta%*1t!$͢4!Qk"/t!Kk:/t:0t#A&*1t*/t##N#F+++N#Fͬ)͢4*1t!$͢4*/t####"/t%*1t! $͢4*1t! $͢4*1t!Mk##N#F+++N#Fͬ)͢4*1t! $͢4!i͢4*1t!#͢4*1t/òh(^(-(+(:(>_(.6(#($'*(a:xstatex.pilreadreada:xstatex.pilͫh!9!H'!M')-i`"6t!6t~#„'òh*6t!!.3*6t ~#fo}0ʷ'!>i~#)òh!ͻ#!"3t*3t~OG! 'Æh!*3tͶ i`"3t*3ẗ́@!Dy##N#F+++N#F!! Ä'Ä'!*3tͶ i`"3t*3t#!sÄ'!*3tͶ i`"3t*3tC!͗Ä'*3t#̈́@:Dy2Mk:Ey2Nk:Fy2Ok:Gy2PkÄ'*>iB>*3t#hi`">iÄ'*3t#hi`"2@iÄ'>2@iÄ'*3t#"3t!Qk"Kk!*3tͶ i`"3t!~ʄ'*Kk*Kk####"Kk!̈́@G+N#F*Xy N#FͧJx"1h!Ty~#I1*Xy !~#~#~#~2:TyV1:Uym1*Xy !͙d22mt2nt2ot2pt!*Xy N#F -x1!2mt2nt~2ot2pt!mt!f!mt!2Dy2Ey~2Fy#~2Gy!Dy2h*Xy !mtDyd!Dy!͙d~#~#~#~*XyMDhͶh!~#fo"Xy*Xy ~w#~w*Xy ~w#~w!!qt##N#F+++N#F*Xy͑0hͶh!~#fo"Xy*Xy DydhͶh!~#fo"Xy*Xy"Vy:t2t:t2t2*t*t#"t~OGyOG2!tV5i`"Ty:Ty2:Uy2:Ty 2:Uy2*Vy*Vy#"Vy:TywÌ2*Vy6:Ty 3:Uy&3!Xy:Vy3:Wy#&3+3*XyMDhͶh!~#fo"Xy!~#fo"Ty!~#fo"Vy!:Xyw:Yy#w:Ty2Ty:Uy2Uy!Ty>#3!*Vy ~w#~w+3*VyN#F*Vy~w#~w~OGyOG3*VyV5ywx#w+~3#~3!N#F!~w#~w!~ a3!~#fo6!~4#~.4!!Xy %4 #.434*XyMDhͶh!~#fo"Xy!t*Xy͢4:t2t:t2tu4*t*t#"t6 Â4!t! 7*t}@o|g}ʟ4!t!7hͶh!~#fo"Xy!~#fo"Ty*Xy*Xy#"Xy~2Vy2Wy!Vy~#5*Ty ~w#~w+ 5*TyN#F*Ty~w#~w"t2t2t*tMDòhͶh!~#fo"Xy*Xy !d#MDhͶh!~#fo"Xy*Xy=i`"t*t"t*t##~#fo"te=!t:t=:t#Ÿ=!!Si`"t!t~##>h*t!t  #*t*t~#fo)) "t*t:tw:t#w*t"t*t####MDh*t> w>#w*t####B>*t"tß=Ͷh!~#fo"Xy!Xy~#\>h:Xy2Xy:Yy2Yy*t##:Xy:Yy#>*Xy~#fo))*Xy *t##y³>x#)?*Xy*t##~#fo  #*Xy *t##~#fo##~#~=?*t##:t:t#?!Xy:t:t#ڔ>*t##:Xy:Yy#ڔ>*t##~#fo"tt>*Xy *t##~#~*t~#fo))*t !XyyZ?x#„?*t*Xy  #*t##*Xy ~#~Ò?*t##:Xyw:Yy#w*t"thͶh!~#fo"Xy>2u:un@:uOG!Udt ~#fo:uOG!Udt yOx#Gi`"u!u~#y@:uOG!Udt ~#fo}y@:uOG!Udt ~#y@*u:uOG!Udt N#F:uOG!Udt N#FTy@*XyeYh:u2uî?ͫh! !u!!N#Fͮ@!uDydòhͫh2u2u!~#fow#w#w#w! ~#~@! >$>#@òh! > ># A! ~#fo#~02Ny2Oy2My2Ly!Ly͙d##~2u!u>9 J:u'2u*Ty*Ty#"Ty:uw*Ty!yOx#GhͶh!~#fo"Xy*Xy~MJ*Xy#"Xy;J*Xy!yOx#Ghͫh!!u##N#F+++N#F!N#FͧJxJòhòhWK(KJKͫh!N#F[i`"u!u~#Jòh*u ~DJòh! ~#foMD!JÆh!~2u#~2u#~2u#~2u*u#:uw:u#w:u#w:u#w!~#foMDòh*u#Dyd!Dy!͙d~2u#~2u#~2u#~2uK*u <[x2Dy2Eyx2Gyy2Fy!Dy!͙d~2u#~2u#~2u#~2uKòh: can't write : can't read ͫh!"%v!"'v:2+v2,v*+v*'v͋a!+v~#L*%v*%v#"%v*'v*'v#"'v~:+v2+v:,v2,vK*%v*%v#"%v6!u"v*v*v##"vKywx#w!"%v*%v~mL*%v~L*%v> L*%v~LL*vw#w!!v~#ʈM!Y!!*!vP\i`")v!)v~#ʈM*!vb*!v!T! !K!T!eYÈM*%v~lM*%v~<M*%v~>+MM*%v*%v#"%:Vyw5h*Ty*Vy}og7:Vy +5:Wy»4*Ty ~#fo}@o|g}ʻ4*Ty!7û4Ͷh!~#fo"Xy*Xy ~#fo}ʆ5*Xy ~#fo}0ʌ5h*Xy ~#¡5*Xyl8*Xy ~#fo}@o|g} 62ut2vt:ut:vt 6*ut!Udt ~#fo}@o|g}ʘ6*ut!Udt !7Ø6*Xy *Xy ~#fo}*6-6*Xy N#F*Xy N#F:Nywx#w*Xy*Xy ~#~*Xy ~w#~w+6*Xy ~‡6#~6*Xy ~w6*ut#"ut5*Xy *Xy ~#fo#MDx2Dy2Eyx2Gyy2Fy!Dy͙d*XyN#F*Xy~w#~w~OGyOGh*Xy ~ w*Xy w#whͶh!~#fo"Xy!~#fo"Ty*Ty ~#fo}J7*Ty ~#fo} R7*XyMDh*Ty ~#g7*Tyl8*Ty~#fo*Ty yOx#Gi`"wt!wt~#7*wt*Ty N#F*Ty N#FT!wty·7x#7*Ty ~ wh*Ty :xt2Dy2Ey:xt2Gy:wt2Fy!Dy͙d*Ty*Ty ~#~*Ty *Ty ~#fo}#8&8ywx#w:Xy98:Yyd8*TyN#F*Ty~w#~w:Xyw*Ty ~w#~w*XyMDhͶh!9!~#fo"Xy*Xy ~#8*Xy ~#fo}8*Xy*Xy !yt*Xy ~#fo }| w #w8!*Xy N#F`JxF9*Xy #~wF9*Xy*Xy / }2uA! ~#fo6 }2u!~#fo"u!~#fo!~#fo "u*u~ OA*u~ YA*u#"u=A*u~-lA>2u2u*u~-~A*u~+…A*u#"u! ~“A#~A*u~0A*u#~aA*u#>zA*u#~OG! MDA*u#~OGyXAxA*u##"u!u:u:u#&B*u~aB*u>zB*u~OG! MDB*u~OGy2u!u:u8B:uLlC*u#"ulC:u0B!u>9B!~#fo!~#foDyd!Dy! #~2Ly2My~2Oy+~2Ny!Lyog2Ly2My:u2Ny2Oy!Ly͙d>2Ny2Oy2My2Ly!Ly͙d~#~#~#~bC:uaB!u>zB:uA&B!u>Z&B!~#fo!~#foDyd!Dy! #~2Ly2My~2Oy+~2Ny!Lyog2Ly2My:u2Ny2Oy!Ly͙d>2Ny2Oy2My2Ly!Ly͙d~#~#~#~*u#"uA!u~#ʥC!~#fo!~#foDyd!Dyh~#~#~#~*u!yOx#G!~#~C!N#FC*u!yOx#Gòhͫh! !!!N#FD!~#foMDòhͫh2u2u!~#fow#w! ~#~@D! >$>#FDòh! > >#gD! ~#fo/ }2uwD! ~#fo6 }2u!~#fo"u!~#fo!~#fo "u*u~ ʫD*u~ µD*u#"uÙD*u~-D>2u2u*u~-D*u~+D*u#"u! ~D#~ VM*'v~DMVM*v*v##"v:%vw:&v#wlM*%v~>`M*'v"#vfM*'v#"'vM*'v"!v*'v"%v*%v> HL*%v~HL*%v#"%vlM!#v~#M!Y!!*#v|Zi`")v:)v½M:*vM*#vb*#v!T!!K!T!eY!u*vu}o|g!d͛?òhzNzNN\OCNTNLNPNDPͫh!9!N#F[i`"7v!~#fN!7v~#lNòh*7v~OG!NÆh!~#fo"-v!~#fo!~#fo "1v*7v ~#¯NòNy23v*7v ~OG!"NÆhòh!N#F!N#F*7v"Pòhòh!1v:-v:.v#FO! y24v:3v(O:4vOGy"Ox;OFO*-v*-v#"-v:4vwN:4v (ON*-v!yOx#GòhFO!6!! ! ! !"/v!~OG!yx#ңO!~OGêO!N#Fy24v:4vO*/v~OGyOxO>24v!1v:-v:.v#FO:4vFO*-v*-v#"-v6 FO*-v*-v#"-v*/v*/v#"/v~:4v24vîOòhͫh!z9ͩY!~#fo";v!~#fo"Av!~#fo "Gv!~#fo#Dyd!Dy>2Ny2Oy2My2Ly!Lyd##~2@v!~#fo ~#P!Av~#PR!N#F"]:Avր:BvrQ:@vrQ!"Ev*;v! *Gv!! yQPR2Cv2Dv!"9v*9v"=v!Av~!!͑9ywx#w+~#~ i`~#39*Xy ~w8*Xy ~w#~w8!!t##N#F+++N#F*Xy N#FͧJx|9*Xy ~@whͫh!N#FB>òhͶh!~#fo"Xy!~#fo"Ty*Xy*TyUdi`"Xy*Xy6=i`"Ty*Ty"Vy!Vy~#9h*Xy:Xy2Xy:Yy2Yy}:*Vy*Vy#"Vy69*TyMDhͶh!~#fo"Xy!~#fo"Ty!Xy~#=:*Ty6=h:Xy2Xy:Yy2Yy*Ty=i`"t*Xy:ti::t#x:*Xy MDh*Xy:t:t#ڃ<>#;*Xy~#fo)) *Xy *tF*Xy B>*tMDh!t~#t<*Xy!t  #t<*t##*t##~#~ i`~#fo"t*t*Xy  #*Xy>>#<*Xy~#fo)) *Xy *t####F<*Xy:t:t#<*t))*Xy *Xy~#fo!tyOx#Gywx#w*Xy:tw:t#w*t))*Xy B>*Xy MDh*t"Xyt<*Xy MDhͫh!t~# =!t"t*ta E*u#>z E*u#~OG! MD(E*u#~OGyX1ExzmE*u~OG! MDtE*u~OGy2u!u:uҔE:uL8F*u#"u8F:u0E!u>9E!~#fo!~#foN#F! N#FUd:uOG  }|.F:uaE!u>zE:uAڂE!u>ZڂE!~#fo!~#foN#F! N#FUd:uOG  }|*u#"uo>g}|*u!yOx#G!~#~ҊF!N#FÚF*u!yOx#GòhͶh!~#fo"Xy!~#fo"Ty*Xy*Ty Fh*Xy#"Xy*Ty#"TyöF*Xy~FhͶh!~#fo"Xy!~#fo"Ty!~#fo"Vy*Vy:Vy2Vy:Wy2Wy}EG*Xy*Xy#"Xy*Ty*Ty#"Ty~ GhͶh!~#fo"Ty!"Xy*Xy~#ʕG*Xy~#fo"Vy*Vy~ʢG*Ty*Ty#"Ty*Vy~*Vy#"VypG*Ty6*TyMDh*Xy##"Xy]GͶh!~#fo"Xy!~#fo"Ty*Ty~G*Ty~OG:XyG:YyGhh*Ty#"TyGͶh!~#fo"Xy!~#fo"Ty!~#fo"Vy:UyUH*Ty>o>g"Ty:YyUH*Xy>o>g"Xy*Vy*Vy#"Vy6-*Xy*Tyd"u!u~#ʆH*Ty*u*VyG*Vy "Vy*Xy*Ty:d0 }2u!u>9ҫH:u'2u*Vy*Vy#"Vy:uw*Vy!yOx#GhͶh! ~#fo"Xy!~#fo"Ty:Yyo>g"Xy!H#+R!9v:=vQ:>v#cR!~#fo#2Dy2Ey:Cv2Fy:Dv2Gy!Dy͙d2Cv2Dv!N#F"]!z! *Gv!! yʀR+R!z! *Gv!! yPR!:@vOG}o|g"Ev!Av:Ev:Fv#һQ*EvMDQ*AvMDi`"Ev*Ev!z:@vOG *;v͕b*;v*Ev ";v!Ev:Av2Av:Bv#2Bv!~#fo#2Dy2Ey:Ev2Fy:Fv2Gy!Dy͙d>2@v×P!~#fo#2Dy2Ey:Cv2Fy:Dv2Gy!Dy͙d*;v!yOx#Gòh*=v~2?v:?vOGyzRx–R+R!z:@vOG "=v>2@vcR*=v#"=v*Cv#"Cv:?v P:?vP*;v*;v#";v:?vw:Av2Av:Bv2BvPͫh!9!!N#F^yRòh!! ySxSòhòhͫh!9!:Ivw:Jv#w!*Iv!~#fo }|!:w:#w!!}|!w>#w!!IvyOx#G!yx#җSòh!!  #S!!  #S!!  #S!~#fo"Iv!~#foMDòhòh\T\TnTUTTLTPTCtTDUIU 6UzUͫhͩY!~#HT!N#F[i`"Rv!Rv~#NTòh*Rv~OG!SÆh*Rv ~OG!SÆhòh!N#F!N#F*RvͰUòh>2Qv!~#fo"Kv!~#fo!~#fo "Mv*Rv ~#U!Mv:Kv:Lv#6U*Kv*Kv#"Kv~OG:QvOG T>2QvÖT>~#~*rvv}o|g!,dMDòhͫh!~#fo#~2tv#~2uv#~2vv#~2wv!~#fo "xv*xv! !tv!7g##~*xv" !tv!7g##~*xv# !tv!7g##~òhͫh!vywx#w!Dy~#~]!~#fo ~]!Dy~#~]òh!~,w#~wñ]!~#foMDòhRDR:PTP:CON:LST:ͫh!9!~#@^!~#fo~@^!~#F^òh!N#Fbi`"v:v :vj^òh!"zv!~#fo"|v*|v~^*zv~w*zv*|v~a^*|v>z^*|v~OG! MDú^*|v~OGyw*zv#"zv*|v#"|v|^*zv6!!}|:v^:v&_!~#fo###~:&_!^!N#Fbyʅ_>L2v2v_!~#fo 6D!~#fo "v*v6!~#fo#~:`!~#fo~2v2v:vA:vN`!v>P>#T`N`! ^!N#Fbyʨ_>C2v2v_!^!N#Fby_>P2v2v_!^!N#Fby`>T2v2v!~#fo :vwòh!~#fo 6òh*v#"zv2v2v:v:v`!~#fo~r`!~#fo~.Š`r`òh*v*v }!~w#~w`*zv*zv#"zv6 *v#"v#`*zv*zv#"zv!N#F!~w#~w~À`!~#fo~`!~#fo~.`!~w#~wó`!~#fo~.`!~w#~w2v2v#pV2.1: copyright (c) 1979 by Whitesmiths, Ltd.2P2QvÖT!~#foMDòhòh!Mv:Kv:Lv#6U*Kv~OG!TÆh*Kv!yOx#Gòh!:KvYU:Lv#iU*Kv ~ zU! :QvOG *Kv*Kv#"Kv~OG:QvOG UW WWW Wͫh!9!~#fo"Vv!~#fo"\v!~#fo "`v!~#fo#Dyd!Dy>2Ny2Oy2My2Ly!Lyd##~2[v!~#fo ~#vV!\v~#RY!N#F"]:\vր:]vV:[vV!"^v*Vv! *`v!" yVòh!y:[vOG "Xv!"Tv*\v:\v2\v:]v2]v}RY*Vv*Vv#"Vv~2Zv:ZvOG!UÆh!z! *`v!! yDW!!!zSbDW*Vv*^v "Vv!^v:\v2\v:]v#2]v!~#fo#2Dy2Ey:^v2Fy:_v2Gy!Dy͙d>2[v"V!:[vOG}o|g"^v!\v:^v:_v#mW*^vMDrW*\vMDi`"^v*^v*Vv!z:[vOG ͕b*`v!" yVòh!\v~#W!Tv:Xv:Yv#WW*Xv*Xv#"Xv6 *Xv*Xv#"Xv:ZvwéW!Tv:Xv:Yv#ڋV!Xv:Tv:Uv# X Xi`"bv!bv~# X*Tv"Xv*Xv!y:[vOG yOxGi`"^v!N#F"]:^vր:_vҊX!! *`v!! yʶX!!!SböX!"^v!y! *`v!" yXòh*^v!y:[vOG !:[vOG ͕b!! *`v!" yXòh!y:v:v+a!~#fo~[a*zv*zv#"zv6 Áa*v *v *v *v 6~ w~òh*zv*zv#"zv!N#F!~w#~w~*v#"vaͫh!N#F!~w#~w}b!~#fo!~#fo~Aa!~#fo>Za!~#fo~OG! MDa!~#fo~OGyw!~w#~wÎaòhͫh!!~#~!~#fo~;b!~w#~wb!~#fo!yOx#Gòhͫh!N#F!~w#~w}ʒb!N#F!~w#~w!~Vbòhͫh!N#F!~w#~w}b!N#F!~w#~w!N#F!~w#~w~Øb!~#foMDòhͫh!~#fo!~#fo 0còh!~w#~w!~w#~wb!~#fo~còh&}!!9ͱh!9~w#~w#~w#~w+MD!9 _ #`c{ !94`c! 9~c+w>#w! 9N#FxcO>GVccO>G! 9q#ph! 9~c+w>#w! 9N#FxdO>GVcdO>G! 9q#ph! 9N#FVc! 9q#ph! 9N#FVc! 9q#ph!! 9~+ʎd~td! 9N#F ! 9~w#~w! 9~w+~w[d!9q#ph!9N#F!9~#fo ## # +++ #h!9N#F!9~#fo  # # #h~#~#~#~#~#"Xv>2[v!~#fo#2Dy2Ey:^v2Fy:_v2Gy!Dy͙d!bv~#W*Xv*Xv#"Xv6 !\v~#WW*Vv!yOx#Gòhͫh!w#w!~#~Y!N#FY!~w#~wtY! òhͫh! yY2dv2evòh*dv#"dv:dv:evY! yYxY! òhͫh!N#F[i`"fv!fv~#Zòh*fv ~DXZ*fv~XZ*fv ! i`"hv:ivnZ!hv>>#nZ*fv 6!~#foMDòh!>w>#wXZͫh!~#ʥZ!~—Z#~ʥZ!>w#w͞]i`"jv!jv~#¼Zòh*jv!N#F^yZòh*jv ~D[*jv ! *jv ! x[òh*jv 6!N#F!N#F!N#FP\òhͫh!N#F!# yY[xh[!lvDydòh!~#fo! MD 2Fy2Gy2Ey2Dy!Dy!~#fo" MD 2Ny2Oy2My2Ly!Ly!f2h!~#fo# MD 2Ny2Oy2My2Ly!Ly!f2h>2Ly2My>2Oy>2Ny!Lyogòhͫh!#~\!~#~\òh!N#F!,Udv "pv*pv ~H\òh*pvMDòhͫh!~#y\!~k\#~y\!>w#w͞]i`"rv!rv~#\òh*rv!N#F^y¬\òh*rv ~D\*rv ! x\*rv 6òh*rv!~*rv#w#w#w#w*rv !~#~#~!9MD!9~#~#~#~ !9~w#~w#~w#~w#~w#~w#~w#~w!9MD! 9  # # #/e!9MD! 9  # # #!94/e!9!9h#~#~+++~#~#~e#>#>+++>#~#~#~ #~{e>#># >#͓e!9MD!9~#foͻe! 9MD!9~#foͻe e!9N#F!9eàe͓e!9MD!9~#foͻe! 9MD!9~#foͻe e!9N#F!9eàe͓e! 9MD!9~#fo#ͩe!9MD!9~#fo#ͩe e!9N#Fkb9eàe͓eÇf!9~f/<ghO!9~#fo##~w#~w+++~w#~w fh!9~g/#w>+++w>#w!9N#F!9~#fo  # # #h!9N#F!9~#fo ## # +++ #h~#’h#~#foy#¦hx#§h+++~#fo##Æh!9!9*Xy*Vy*Tyi`!"Ty"Vy"Xy!9N#F###q#p+++q!9N#F#qI    #}yq k!h"e$`ZyCCCAOG!T!>Aw!q>U#w t/w o#Z(l( 7!qx(#w ?#Z(l *!x( !#Z(l( (e7!>?~G(?(>-\( (>xT'!xT->G~-( ?(w!#p{ !!! v~O͌#%n-hz !~OM (yH1! AOG!T!>Aw!q>U#w t/w o#Z(l( 7!qx(#w ?#Z(l *!x( !#Z(l( (e7!>?~G(?(>-\( (>xT'!xT->G~-( ?(w!J#p{ !!! v~O͌#%n-hz !~OM (yHvvm SWAP.CO͠ i provide t swa th LST an PUN driver t allo th Centronic Por t b use a th LST device Othe assignment ma als b made Th progra ha hel message invok as: SWAP Not tha SWA wil refus t functio i you CBIOS doe not have Multio drivers. 3. Multi an WBI Characte Device ar ban switche unde contro o por a base+ whic contai bit othe tha thos require t selec th ban desired Thes othe bit ar mean fo syste control an changin the wil caus th syste t crash Thus i yo wan t selec devic othe tha th on i us b th system yo ma d so bu yo mus no alte th stat o th grou selec port Sinc thi por i writ only yo ca onl obtai th content o th syste bit b accessin th system' cop o it las writ t tha port Locatin thi singl fo th M drives Thi releas identifie i a such 5. You distributio diskette contai severa file dealin wit th CBIOS fo you system I yo nee t chang th characteristic o you system yo wil nee t know about the following items: First you diskette ar marke wit numbe i th uppe right-han corner somethin lik #90 o #901 Thi identifie th collectio o device supporte i you CBIOS an i reall jus factor par number Somewher o m desk ther i maste lis o SoftWar (SW par numbers alon wit th device supporte b eac one M des ha permanen OUT-OF-SPAC ERROR s kee th rea lis o m disk You dis ha cop o th pertinan par o thi maste lis i grou o file beginnin wit th letter 'SW'. Second you dis contain severa variation o th M byt withi th bio require knowledg o severa 'Magi Numbers i earlie release o th bios Th ne characte driver i revisio E. wil retur pointe t th grou byt i registe [DE followin an singl characte servic reques fro BDOS Tha is you applicatio progra runnin i th TP ca fin th grou byt a follows: mvi c,0BH ;check console status, real safe, no one will notice call 5 ;have BDOS do it. xchg ;pointer to group was in [DE], now in [HL] shld savegp ;save the group address. Later, the same program may select a device as follows (for serial port 2) lhld savegp mov a,m ;read group bits ori 2 ;0=parallel, 1=console, 2=unused serial, 3=list serial out 4fh ;this is the address of the group select port ;note fro th application' point-of-view th grou byt i read-only. ;also, you must re-select the port each time you wish to use the device since ;the CBIOS will switch to another port OVCPM.CO͠ program Tr 'DI MOVCPM*.COM' Not tha th number i th nam ar relate t th fil extension i th 'SW files Example o th disk fo Factor Par Numbe #904 ther ar files: MOVCPM.COM SW904.000 MOVCPM5.COM SW904.005 MOVCPM10.COM SW904.010 MOVCPM16.COM SW904.016 Th 'SW file ar th actua equat file use i th Masterin La a Morro Design t creat th MOVCPM*.CO files. Third ther ar file wit names: ABOOT.A ABOOT.B CBIOS.A CBIOS.B Thes piece o progra ar lik epoxy Par A an Par B Yo ca combin the wit th followin commands: PIP ABOOT.ASM=ABOOT.A,ABOOT.B PIP CBIOS.ASM=CBIOS.A,CBIOS.B Combine thi way yo hav CBIOS whic bear n similarit t th on yo nee fo you system Th Par piece contai al o th comment relatin t th EQUate require t mak th assembl tim conditiMorro Design Decisio CBIOS Revisio E. This Revision differs from previous revisions as follows: 1. Th CBIO i large b abou 0.5k leavin TP o abou 54k Suppor ha bee adde fo 5.2 inc soft- sectore diskettes bot singl an doubl side wit Morro Design Micro-Decisio format Thi i availabl onl fo th DJ/DM diskett controller shippe wit EPROMӠ lable 2. o higher Earlie controller requir firmwar changes Th堠 FORMATDJ.CO͠ progra ha bee rename FDJ.CO͠ t distinguis i fro erarlie versions I accomodate th ne formats. 2. Multi an WBI Characte Devic Driver ar supplie wit suppor fo th Centronic Port whic share hardwar wit th existin Diabl Hytyp Port specia cabl i require䠠 fo interfac t Centronic Devices Th Centronic Por i assigne t th PUN devic driver ne prograto select its devices. 4. Th MOVCPM.CO progra supplie wit earlie release containe drive fo th selecte hard-dis a th las driv i th system an th signo banne ofte di no identif th driv type Th inten ha bee t provid flopp dis whic wa bootable an whic coul b use t sysge th hard-dis wit on o th othe MOVCP͠ programs on whic woul mak th hard-dis th primar driv o th system Unfortunately som users an man technician here go int troubl whe the trie t boo thes disk an immediatel PI program t th hard-disk Hard-disk var i storag placemen o al bu th outer-mos tracks I you syste ha HDC/DM controlle wit a M1 o M1 drive yo ma onl us th bootabl diskett t SYSGE th hard-disk yo ma no transfe dat o ru program becaus th bootabl diskett contain driver Kon generat th cod require fo collectio o hardware I general a EQUat i Par wil caus sectio o cod t b assemble i Par B Fo instance th EQUat 'mforder tell Par t mak th mini-floppy show-u a drive A thr whateve i i 'maxmf' an t assembl th warm-boo cod fo th mini-floppy S t generat CBIOS wit specia configuration al ɠ hav t d her i th Masterin Lab i t fiddl aroun wit th equate i Par A the ad part an B an voila ne CBIOS i created Becaus hav al sort o configurations hav remove th comment fro Par A fiddle wit th equates an assigne meaningfu name t them 'SW9xx.0yy wher x i a arbitrar par number an y i relate t th warm- boo driv size Yo hav cop o th S file use t mak you MOVCP͠ files I yo eve nee t memor siz o th reconfigure CP/M Th followin lis o equate wer pulle ou o th CBIOS t giv yo a ide o th option availabl i th CBIOS.AS file Refe t th CBIOS.AS͠ fil i yo wan t se ful explanatio fo som o thes equates. List of Equates - CBIOS.ASM maxhd equ 0 ;Set to number of HDCA3 hard disk drives maxmw equ 1 ;Set 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" maxmf 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 ; if not included fdorder equ 0 dmorder equ 2 mforder equ 3 ;HDC3 controller disk drives. Set only 1 M26 equ 0 ;Shugart SA4000 M20 equ 0 ;Fujitsu M2302B M10F equ 0 ;Fujitsu M2301B M10M equ 0 ;Memorex ;HDDMA controller disk drives. Set only 1 cm5619 equ 0 ;CMI CM-5619 st412 equ 1 ;Seagate ST-412FSET note abov fro th listing and: -IABOOT.HEX -Rmmmm Wher mmm i th OFFSE valu obtaine from the listing. Now exit from DDT as before: G0 and enter: A>SAV 4 CPMxx.COM wit x a above an then A>SYSGEN SYSGEN returns Morrow Designs SYSGEN version 4.x Source drive name (or if in memory) Answe b pressin th RETUR key (A thi poin th sourc fo th ne syste i i RA memory no o th dis wher yo wan it) Th return: Destination drive name (or to warm boot) Ente th destinatio driv - throug P B carefu abou whic drive (har dis o floppy ar drive A B etc a thi ste destroy th origina CP/ o th destinatio drive. T complet thi process pres th RETUR ke twice: Destination on (dr mak an change t you CBIOS o i yo simpl wis t mak nic listin fo reference yo shoul edi th CBIOS. an ABOOT. files an mak th EQUate ther matc th equate i th S files The chang th firs equate 'ABSASM t matc th assemble yo wil b using a indicate i th sourc file Yo hav you choic o eithe MAC o RMAC W d no us th AS assemble supplie wit CP/͠ becaus i ha a insufficien conditiona assembl capability These assemblers are available from most dealers. I yo ar usin th MA assembler yo wil nee t declar th lengt o th CBIOS .. I th lengt o you CBIOS i likel t chang s muc tha yo ca no estimat it lengt accuratel i advance yo ma se BIOSL t som arbitraril larg value an assembl it Loo i th symbo fi st506 equ 0 ;Seagate ST-506 Mak cop o th .AS files the edi th CBIOS.AS fil fo you desire syste configuration Thi involve changin th number followin th eq portio o th fil t reflec th numbe o drives thei orde withi th system th driv type etc Us th followin a guidelin fo assemblin th files: A>MAC CBIOS A>MAC ABOOT Onc th CBIOS.AS an ABOOT.AS file hav bee edite an re-assembled th followin procedur ma b use t incorporat th ne driver int CP/M, enter the command: A>TYP ABOOT.PRN watc fo th labe "OFFSET i th listing an recor it value. Next, the command: A>TYP CBIOS.PRN watc fo th labe "OFFSETC i th listing an recor it value. I yo modifie th BIOSLN the yo mus modif th MOVCPM.CO progra tive):, type to warm boot) Function complete Destination drive name (or to warm boot) Rese th syste an d "col boot. Th syste heade display you ne syste siz now. MOVCPM I you syste doe no nee an re-configuration yo ma us th MOVCP progra a i is A mentione above mos system ar supplie wit mor tha on cop o MOVCPM on fo eac o severa possibl configurations Usually use wil b intereste i onl tw o th MOVCP͠ program supplied MOVCPM.COM whic wil boot-u fro diskettes an MOVCPMn.CO͠ wher i th har dis typ whic wil boot-u o th har disk Althoug th factor ha alread don th following yo wil b intereste i cas you syste eve require service You origina cop o CP/ cam fro diskett i i you CP/ Maste Dis ) an was placed ol fo th valu 'BIOSLEN' an assembl secon tim usin thi value Th actua lengt o th CBIOS containe i MOVCPM.CO fil ca b foun unde DD o SI a follows: SID MOVCPM.COM S103 ;the value displayed is the BIOSLN. Yo shoul ente thi valu i th sourc fil befor assembly Fo you reference whil unde DD o SID LOCATEĠ cop o FDOӠ ha th堠 followin砠 interestin addresses: ABOOT 0900H CCP 0B00H BDOS 1300H BIOS 2100H END: SIGNON MESSAGE TEXT Reconfiguring a System T reconfigur th CP/ syste fo you particula hardware yo nee th MAà assemble (no include wit syste software t assembl th CBIOS.AS an ABOOT.AS files. Man parameter o th CBIOS ca b modifie b changin th valu o certai ke variable whic ar use durin th assembly Fo example th labe MSIZ i use t adjus th  creat CP/ syste tha matche th ne CBIOS' length Th followin procedur wil perfor thi modification. A>DD MOVCPM.COM -S103 Locatio 10 contain th BIOSL valu fo th MOVCP program Now type: 0103 15 xx 0104 43 . wher x i th firs tw digit o BIOSL an pres RETURN Fo instance fo BIOSL o 1800 typ i 18 an exit: -G0 Nex enter: A>SAV 5 MOVCPM.COM t sav th reconfigure MOVCP program and A>MOVCP x * wher堠 x i th MSIZŠ valu tha yo assemble th CBIOS.AS fil with then A>SAV 4 CPMxx.COM wit x a above. Agai ente DDT thi tim wit th ne CP/ syste file: A>DD CPMxx.COM -ICBIOS.HEX -Rnnnn Wher nnn i th valu o OFLnto the hard disk as follows: MOVCPM * * ( movcpm prints some stuff ) SYSGEN ( see paragraph above for sysgen operation ) I i importan t not tha th CP boar ha som switche whic selec whic driv wil b use fo cold-boot A shippe fro th factory th diskett drive wil b used On ma alte th setting o thes switche t mak th har dis th primar drive o on ma us th progra BOOTMW for this purpose. Try the following: ( reset the system and re-boot ) BOOTMW No rea th signo banner I indicate tha th primar driv driv A i har disk an i indicate it size Als not tha th diskette hav bee re-assigne an hav differen driv names Typ DIR an hav loo a th content o thi drive Th sam file foun o th distributio dis shoul b o th har drive supplie wit th system Bot ar double-densit wit 7 cylinders an fou 1024-byt sector pe surfac (selectio "G") Tw othe double-densit format ma als b rea an written The are 256-byt an 512-byt singl an doubl side format wit 2 an 1 sector pe surfac respectively ( part of selection "I" ). Morro als support th commo "CP/͠ Single-Densit Exchang Format whic i single-sided single-densit wit 7 tracks eac wit twenty-si 128-byt sector (selectio "F"). FORMATHD and FORMATMW I i i desire t forma th har disk th progra FORMATHD.CO͠ ( an 1 inc har disks o FORMATMW.CO͠ ( 1/ inc har disks shoul b used. CAUTION! Us cautio wit th har dis forma programs The eras th dat o th har dis an i ca no b recovered I yo hav t forma th disk thin abou wha i o t disk No tr usin th MOVCP progra t mak th diskette th primar drive again: MOVCPM 48 thi make 48 syste lik th on o thdiskett) -- or -- MOVCPM whic make 64 syste which will not re-boot ) Th relocate CP/͠ wil begi executing, however th relocate CP/ i highl unstable I particular i war boo occurs th syste ma no re-boo properly Thi i no bu i th MOVCPM.CO program bu rathe differenc i th lengt o th origina an relocate CP/M's W recommen tha yo us th FD progra explaine nex t initializ ne diskette the practic usin MOVCP͠ an SYSGEΠ t creat ne "syste disks, an verif tha the will boot correctly. FDJ.COM Th comman fil FDJ.CO format an initialize bot 1/ an inc diskette fo th DJDM flopp dis controlh har dis befor proceeding. BOOTHD Th progra BOOTHD.CO contain boo stra loade fo th HDC har dis controller BOOTHD.CO coul b programme int PRO s tha yo coul boo directl ont th har disk withou havin t bothe wit th floppies. BOOTMW Th progra BOOTMW.CO contain boo stra loade fo th HDC/DM har dis controller. Th Morro Design MPZ8 CP car ha bot BOOTH an BOOTM encode i it PROM Refe t th MPZ8 manua fo th prope switc settings. ler. Thi progra i menu-drive an i therefor堠 sel explanatory Simpl enter A>FDJ an follo th instructions. Morro hard-sectore 5.2 inc end-use diskette ar double-sided double-densit wit 3 cylinder 7 track eac havin te 512-byt sector selectio "D ) Yo ca read/writ th single-side variatio o th abov 3 track ) a wel a th single-densit 256-byt sector variant o th above Hard-sectore inc diskette ar not supported. Morro soft-sectore 5.2 inc end-use diskette ar double-sided double-densit wit 4 cylinder eac havin fiv 1024-byt sector pe surfac selectio "B ) Th single-side varian i als supported whil single-densit i not. Morro soft-sectore inc end-use diskette ar eithe single-side o double-side dependin upo th typ o