IMD 1.17: 2/06/2011 14:52:37 digital research cp/m 2.2 r for adc  >o:~W!{> " OC > S>O:380O,z8UO! N#Ny ,!}ä(1|3N#Fx2CN#FC$#^#V^#VS#~2{#~2|<2~###~2}#^#VSN#FCC*KB0KC:( [0!'3#"* (,*#"+))[R3!\ j!k!cyqpu[~+:=8uc7?R#|() w G}wwNFqp:~Fo:=8u^:}(#~W#:{G)[7?K R0! *N#Fx(@#N #F#"DM$x 8[0MD!' Tӻ!!F~O<_>,( 0W}WywRDM!76! [36:jG6F#N!N !\P>O3F#N CPM SYSSelectReadFile not found error: file  . a  !g  !! 0͟2!b  F>!  ®Wc͡Oi W*##yOx€y Ê y AzÙKByxy͡Ù! {/O! .{/O9OV >G>ͽÙ38=ÀB>V>a>ozi` n&VaoGVx(OxAG:G:~ > 2:O y~ 8 q*~($b8͂Dʹ2:2::2>2>27S> 2> :G /_~(!s*:{  _S(  := >2 ~ ( w:2F8 <2y2:W::G:(7:Gz?G![G!y> z͕02w<2!s"ͮ:(w(>>w}ï÷ZhÐyg Æ}!"Q!*"!"!""!2V!2M!2#!2S!!" "d!"!"!!1!!++"!"O!>28!"9:] !÷1!į>#yh͐ !J!6-B5͐A]]_!Y^#V]8]03]]]]]!]]j]]ů2[\ͯ>2M!!""!]:J!͠=]g" ]g" =g"=]> 2]]g=!1g=-1g!WgG"d!=Wg=]b*d!}o"f!*d!"h!#>:y:K!ʞw^#V##:ڲ …òw~#:ڲ}ž"d!:J!*h!w+:K!!L!~/w*d!}|*d!:e]ggg{z|]}$2D!2E!gg"F!g"H!DM\!D!6xf"!=x=xYP!$!~ʲ#^#V:D!ʫ*!{«z«"!!~62 !ò#w6 }1!1!*!*!!V!~4#~#F#x~#s#r#w>ʿg===]g#wᯕo>g#'d w>#y!3^#V#0}o|gg Zx~y0ʅyGÑyyÑ‘G~Sz{ <w>'y{y>'y*!##V+^+N+y#w ~+yxÐ. *  w#  *,?r# ,:J!]m!!Ow #w Eq!\ S:o@w#tG6#.  MOVCPM COML PIP COM: SUBMIT COM XSUB COMZ80 LIBNCPM62 COMDFORMAT DOC PRNLDRGEN COMtTRK0 LDRuvwMODEM COM;RAMDISK MAC=!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m ED COM4ASM COM@ !"#$%DDT COM&&'()*LOAD COM+, HEXFMTHD COMxyFORMAT COM TRK02010LDRz{|READFRSTDOC xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  wSTAT COM)-./012SYSGEN COM3DUMP COM4DUMP ASM!56789UPDATES DOC MODEM DOC`NEWSIZE DOCLOADER DOC#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|  CPM SYSH:;<=>?@ABCPM60 COMDCDEFGHIJKDEBLOCK ASMPLMNOPQRSTUDISKDEF LIB1VWXYZ[\,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVUSER DOCINTRFACEDOC,SUPRBIOSMACSUPRBIOSMACiCONSTRUCTING 00k CP/M vers 2.2$CPM SYSL]^_`abcdefFORMAT ASMAghijklmnoNEWSIZE DOCpqCPMINSTADOC rsALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, #  G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" _͌> ͒> Ò> Ò͘~#͌ì _2<2=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ#~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 321y_͸2y2ͽ: !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:ADCOMf^: ! Â$$$ SUB w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!g"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E ,1y{0!B0}y|zx0y0{00 ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧ ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@ &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6\X COPYRIGHT (C) 1979, DIGITAL RESEARCH FILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q>ͦ!q:_  !p+q.*   !q*&!p+q*2~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x    O͐  : E  B 2 >: b # : y! 4 5~yy 5 6yS:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK52*C ~=2u:B 2~2wE:A *C w>"O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ *2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==» Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  *C ^ O T  *C ~w D  -'   -@ ͦ ~^ *C  O x ! N!Fwy"**#"͕  : 2 Þ y<_WyOxOxG* ~V5dw^  :ʈ !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q* yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #Nxʋ>ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# # NÎ N#Fyʝ*}|\#u* #DM*6# x±**s#r͡ *6#6  ^ >:A #~$=2E k͌ ):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6"*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *#  2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎ: :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# :ʑw:2E* *E }DQ>2 ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w* i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{ 2E > ! ^#V w#P :B O|^#V#"##"##"##"!ì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  > óadjmrux}çìûpñns ns<nskLns{?15D715E0AB :100A700015E615EC15F515FE1504160A1611162CBB :100A80000E17161D1626162D16411647164D160E54 :100A9000155316040C040C9B1@@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE R(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)      00k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j< HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HDETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE@$@B B HH II$@DI ABI$"$H$H(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)Oͧ>~ͻ>2!"2!"28!"9:O R![?boot  ç!" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I(  $DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNI@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$ COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUy2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>gBIB@!  ! !! D ZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H NTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈ 221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$ :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:ͯ m!62m!62m!62m!62m'2:2:TҒ:2 ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! ! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ !6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<26à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 **M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!EŠ ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/> :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{&`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mHHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :] > *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>! :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&69Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{o!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ :H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=zgO{ozgi`N#Fogo&og H ©=¨÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K: !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H v ~_{ozg001 $$$$ SUBʉSͧ!v6!"v!|6:|Ҁ!x6 2}:} Hk:} h:}$6 2}$*}M3:}02}O> ͧ3!z ]xsub*"-!/"*"+!""1 M*!"́!"* (xsub active)$|*y ʥ*"*7*and Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"!͇͊!p+q*6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ2% ͋*-"*$$$ SUBq:(=2(N *$*& w*$#"$*&#"&' !"N*M^7 !)6:!)ھ *N*DM͆ =2ʦ** w*#"*#"!p+q(+*DM*p*& 6:ep\:=W Extended Submit Vers 2.0Xsub Already Present$Requires CP/M Version 2.0 or later$:y*###ƒ# yk -!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"v2*ʭ :*ʗ ͯ *N"P*6:2)÷ *N"N!) $@BA$! A "!$""ͧ!t6>!t%\= >!t6:t<2t=O! ~2u b:<2O>9b!60+~9b!60+4:uat:u_2u:uM  җ 4!~=ŐW!xʵ ~#èbx {~#o}où.xsubb!np+q*m2_!pp+q*o copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Comm  _ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+":f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o2d‘ 2dÝ:d=2d!\6:l2e±:d2eø:e=2eEU !M6 !""*o"$!h61m!6#1m!6?1m!6>1m!f6"&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6!!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2dN ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2" COPYRIGHT (C) 1979, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE IT$NEW FILE$** FILE IS READ/ONLY **$"SYSTEM" F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :!LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t *r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q*û :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mM"m +!8s~!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q*)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"- ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq9m++s#r!9+s#r9";9;"^*mM 6*m+"o!o#s#r!6!f6!6:] :m H}- :\͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:"  :7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- e2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6!e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w :  *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O!ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq: ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6=e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!"&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6  N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{.*FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "PMaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :h*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`!7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"&*22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&o6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: Hҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! :*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ*$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:!   g_{_z#W H = LIBHEXX$$$$$$$LIB1*" COPYRIGHT(C) 1978, DIGITAL RESEARCH   á 4êü /L9ASMPRN  : A: A͋q: a{_2  2 - !ɯ2I:  ;*:  ͭͷ ͭ͋Y :7ʗ8 z !<ͼ CP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCECCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAX :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 w![w#w#b!"!F#v2[>9q>9: '!2 >9 7:! 6 >2>2: 2 Qͭ:Ğ! :lj<͖<j<|<:  FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY G:7xʘ!#~ʄl͸Ä**!O {zʊRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/#  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*OʊQ>ÖH >2 2 û: B­>ôD> ¸!52 !"!N#~#A07O! ~*!) " ͸*"!!#^4!$wͯͯWƐ'@'ê>:ͪ!#^Ww*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪ?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6y{zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ :  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ@2 0 0:x0_<2! wI2 2> 2 >2ɯ22 !~@_6^4#: w~$w: 0 q M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!:! G~#x=2> > ! >x6 #='G! ~ p( O*}O>4?:7w:#ĸ*"!͸* }w>ͪg( ʆ1 *_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACM!)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1   #  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8îîĽ y0îîH ñG 1: :,; c*| } 8O vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2  y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P =ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅ=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fkĽ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>S:|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSx!ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷͰ>2lyPLnR>UX:l̅2l͓i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oz'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"S 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ix͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEË*>E2C!" """ :ʼ:*1 |R|ͦ0FIL: RÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘)sn55)=â|g}o=î--#zg{ozg{ozg{* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0H ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#   R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷoÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >N z8O!B N#N ¾SP.* |} !9":q!" 2͐ f "]=f =« *]}o"_  *]"x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtT HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB AN7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P @* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z z `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =«a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f fZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_A XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= M!Eq s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  O=!9 Ÿ!6q!2qC J R q!z z=naO $q$,! f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.)*)þ))>+><7"9.Yͯ * M^2Uâê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qy ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ  2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI ͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRE_!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0  D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I ×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! de"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTPA 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_$I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B*:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics6@ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR{ozg^#V) _{ozgi`N#Fogo&og_{_z#W$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!?  DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!5536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNO$I$I$UUU$$A$ q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? w( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸ecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk ST OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2 tatus : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On DM oͱ*DM ͱ*N#F ͱ * N#F ͱ͠!p+q͠*DM':͐ͫZ"!6> *} *MTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqosj6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) R" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_ =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐ Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠")6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%)!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͇͐ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2>!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~!)6!)6>!)=:)!)w=*)&*)~2):!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!L!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\Lk ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM )*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!"M!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W͚u c͊2!?͚!͕u cA7nA2Aͦ!͕u c͊!6!?͚>ͦ͊!Q͕SYSGEN VER ͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*)xCOPYRIGHT (C) 1978, DIGITAL RESEARCH  o&)))))))a{)!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V"2.0SOURCE DRIVE NAME (OR RETURN TO SKIP)SOURCE ON , THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT)DESTINATION w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn __> ̓> ̓͊~̓#ÚO****!*$*'! ">2!4:(wNͯ>2)*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ! ON , THEN TYPE RETURNPERMANENT ERROR, TYPE RETURN TO IGNOREFUNCTION COMPLETEINVALID DRIVE NAME (USE A, B, C, OR D)NO SOURC-:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2):)!4f!^!*FNͷyj*DMͿ2: K!͚u c͊<2:\_/:)j*"1!u͚"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)E FILE ON DISKSOURCE FILE INCOMPLETE99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogD:] \<œ!x͕c2|\ ¢! DMͿ\õ!͕c!͕u AnA2Aͦ͊!!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃) !9"1W͜Q>2!͢QG}DrYQ|͏}͏#> ex͏#r* _> e> eME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FC 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;CTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;TJMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ; ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FIBRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ;FCBTYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN O NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE  HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALLLE PRESENT ON DISK$!Y , <    *$A!6 # T!w $r# *`: 0  LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK ARREADF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHTHAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP  LINE POSITION JC FINIS ;CARRY SET BY GNB IF END FILE MOV B,A ; PRINT HEX VALUES ; CHECK FOR LINE FOLD MOV A,L ANI 0FH*A*! ~ ʰxkb))))_y‘BK{ͅ*!66!"80*{#z+++ #EA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FIIC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NA; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,B; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOX ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARALE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR  RKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; \X COPYRIGHT (C) 1979, DIGITAL RESEARCH ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0  MVI C,TYPEF MOV E,A CALL BDOS POP B! POP D! POP H; RESTORED RET ; CRLF: MVI A,CR CALL PCHAR MVI A,LF CALL PC ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C,_͌> ͒> Ò> Ò͘~#͌ì _2<د2 ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH CHAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMOPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB M ه!߶2:2a{_:߷ʖ:߷>Ľʖ:=2–!B!6#5ʖ:ARRY SET FOR EOF STC RET ; G0: ;READ THE BYTE AT BUFF+REG A MOV E,A ;LS BYTE OF BUFFER INDEX MVI D,0 ;DOUBLE PRECISIONP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRCVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(! INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE  #͘*~ "ڷ"͌#>?͌͘ =_.:;<> Oڅo$>!Y2*O"ʉ@&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6FILE EXISTS _: É: :߷ʉ=2)ͽÉ T!@k!}|q ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x 2E>! ^#V w#P:BO|^#V#"##"##"##"!G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6"  O͐  :E B 2>: b# : y! 4 5~yy5 6y=qf^!~2>`~2߯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO*{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*#~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 3ۯ21y_͸2y2ͽ:طҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# ADCOMf^: !߶ Â$$$ SUB"**#"͕: 2Þy<_WyOxOxG* ~V5dw^ :ʈ ݯw4!Y~ʆ͌†t=ʆf ^ T ݯ2o&)|+!<ͧyx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^1͘A͌>>͌92^ :߷¥.!_~#fow]ݭގޥ!v"!çREAD ERRORçNO FILE^:߷x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Ng"C{2!"E9"1A22!ty)K!G_^#V*C~E ,NÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A#~$=2Ek͌ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Y޸psp2mÆÆf ͧ"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*#  ! ~ 3#0 Wx x ڀ ڂ G ~ # 3x~#B!Y~ɯ2:߷=!߾ý:߷=!߾:ý^T!x: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD# ::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# :ʑw:2E**E}DQ>2i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{G:~ >2> !5 Um-͚ >> 2 :O :G:y~ :28 qì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>-ÌÚëSBCIO ( *|>Gx((Ox& }<2~sT1T*$} ͌[! w}<2S:2E!~Яw>T D^6k-äPYy 5*{zBK52*C~=2u:B2~2wE:A*Cw>"*~(P>(=(!& :22ͺ>2 /E͙0zW: #͢8 /2:2 >2>2v /22>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»{TMAyx >/:(>>2>(y> *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwy:!_zV#_~  :!):!!!1: !9:!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*{l: >2 /*>2>2**":̓v"2 *~(͙8ͺ {l:2 >2>2E> 2 y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26ÌÝÎÓBÊ FLOPPY rErE8?@/ _    xʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# # 1d͘|^#VS*3!1NFx(BtNF C͘):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6> :G /_~(!*: { _{: # U-͚ >WJ(  2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄ  y2y2CG 8"~G: w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎ7?KnfB8C[MDx| #*5"!">22*3:OvWarm boot error-reset system $ : =2 W{((y~:: :U>: ~ ( w: Quad CP/M v X2.0 Typeahead installed $K CP/M 2.2 installed Default console is serial port $ Default printer is $parallelite$Seek$ error on track $ sector $ side $ drive $ The diskette in$ is write-protected. Remove the diskette and put on the=!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m 2F8 <2 y2:W: *KB(7:Gz?"*":G2xG![2 G!zi` n& ! ~ 3#0 Wx x ހ ނ G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T! printer driver$serial port $ $ 00O>0GD`D write protect tab, then type any character.$ Type a control-C if you wish to abort the operation instead $ is not ready. Ins xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  wy P:ʋ>2*PY}(|˘A8g ѷ> :2z2g22w<2*!"f":(8 VU>w(~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x ert diskette, close drive door, and type any character to continue.$#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 34 CPM60.COM"$*|  >>wz2~: Â_Gy_()gD͂ <`G.͓|y2!$O͞Ɛ'@'O,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVï!1 !; !`|G^22y:??!H͞͞:"1O͞:*81O͞ SuperCONSTRUCTING 60k CP/M vers 2.2$Can't recognize density of disk in$Read$WrALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, #  #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3ׯ21y_͸2y2ͽ:Է Շ!۶2:2a{_:۷ʖ:۷>Ľʖ:=2–!B!6#5ʖ:ADCOMf^: !۶ Â$$$ SUB!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* ٯw4!Y~ʆ͌†t=ʆf ^ T ٯ2o&)|+!<ͧ1͘A͌>>͌92^ :۷¥.!_~#fow]٭ڎڥ!v"!çREAD ERRORçNO FILE^:۷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!ܙܥܫܱ"C{2!"E9"1A߯22!ty)K!G_^#V*Cސ~E ,1y{0!B0}y|zx0y0{00ԀÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yڸpsp2mÆÆf ͧ ! ~ 3#0 Wx x ր ւ G ~ # 3x~#B!Y~ɯ2:۷=!۾ý:۷=!۾:ý^T!#͘*~ "ַ"͌#>?͌͘ =_.:;<> Oօo$>!Y2*O"ʉ@&-AGMSߛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6\X COPYRIGHT (C) 1979, DIGITAL RESEARCH FILE EXISTS _: É: :۷ʉ=2)ͽÉ T!@k!}|q ^=~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6"  O͐  :߷E B 2>: ߷b# : ߷y! 4 5~yy5 6y_͌> ͒> Ò> Ò͘~#͌ì _2<ԯ2=qf^!~2>`~2ۯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO>ͦ!q:_  !p+q.*   !q*&!p+q*2 ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ Ґ^H@Oy H H: –ͬ  #H: ! ߾ Hù H H $O͐: 2 *CN#  *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwy"**#"͕: 2Þy<_WyOxOxG* ~V5dw^ :ʈ!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26x: 2 p&x~+é7ݯ2 H! >w_: ! ߾5ͤNkͱ¦ͱxʊ#Nxʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# # NÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A߾#~$=2Ek͌):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6"*}:*)=":O:页o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*鯆# 2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄx: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD# w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎ::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# :ʑw:2E**E}DQ>2 ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{2E>! ^#V w#P:BO|^#V#"##"##"##"!ì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:E߷ẅ́͊Ͳ>S:2E!~Яw>T D^6k-äPYy 5*{zBK52*C~=2u:B2~2wE:A*C߶w>"O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E߷͊:==»       60k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j< ;; (2 ** @x = hblk on return) @y set hblk @x set 0 ;; count right shifts of @y until = 1 rept 8 if @y = 1 exitm endiHLD ?ADDR ENDIF CALL @DECOUT ;;CALL THE SUBROUTINE ENDM DECOUT ADDR ENDM ; ; ; ; . . . . . . . . . . . . . . . . to directory wrual equ 2 ;write to unallocated ; ;***************************************************** ;* 28 ;CP/M sects/host buff cpmspt equ hstblk * hstspt ;CP/M sectors/track secmsk equ hstblk-1 ;sector mask smask hstblk ;compOͧ>~ͻ>2!"2!"28!"9:O R![?boot  ç!f ;; @y is not 1, shift right one position @y set @y shr 1 @x set @x + 1 endm endm ; ;*********************************;***************************************************** ;* * ;* Sector D * ;* The BDOS entry points given below show the * ;* code which is relevant to debloc1 ;;THIS BECOMES NO DIVIDED BY RADIX DX DAD B ;;SUBTRACT 10 INX D JC DX LXI B,10 DAD B ;;ADD RADIX BACK IN ONCE XCute sector mask secshf equ @x ;log2(hstblk) ; ;***************************************************** ;* y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>g******************** ;* * ;* CP/M to host disk constants eblocking Algorithms for CP/M 2.0 * ;* * ;*******************************king only. * ;* * ;***************************************************** HG MOV A,H ORA L ;;TEST FOR ZERO CNZ @DECOUT ;;RECURSIVE CALL MOV A,E ADI '0' ;;CONVERT FROM BCD TO HEX MOV E,A  * ;* BDOS constants on entry to write * ;*  yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈ * ;* * ;***************************************************** blksiz equ********************** ; ; utility macro to compute sector mask smask macro hblk ;; compute log2(hblk), return @x as result ; ; DISKDEF macro, or hand coded tables go here dpbase equ $ ;disk param block base ; boot: wboot: ;enter here on system;;TO E FOR OUTPUT CHAROUT ;;CONSOLE OUTPUT RESTORE ;;POP STACK RET ENDDEC: DECOUT MACRO ?ADDR IF NOT NUL ?ADDR L * ;***************************************************** wrall equ 0 ;write to allocated wrdir equ 1 ;write  2048 ;CP/M allocation size hstsiz equ 512 ;host disk sector size hstspt equ 20 ;host disk sectors/trk hstblk equ hstsiz/1  boot to initialize xra a ;0 to accumulator sta hstact ;host buffer inactive sta unacnt ;clear unalloc count ret ;  * ;***************************************************** write: ;write the selected CP/M sector xra a ;0 to a**************************************** read: ;read the selected CP/M sector xra a sta unacnt mvi a,1 sta readop ;rmspt ;count CP/M sectors jc noovf ;skip if no overflow ; ; overflow to next track mvi m,0 ;unasec = 0 lhld unatrk ictor given by register c mov a,c sta seksec ;sector to seek ret ; setdma: ;set dma address given by BC mov h,b mf not ; ; more unallocated records remain dcr a ;unacnt = unacnt-1 sta unacnt lda sekdsk ;same disk? lxi h,unadsk home: ;home the selected disk home: lda hstwrt ;check for pending write ora a jnz homed sta hstact ;clear host activeccumulator sta readop ;not a read operation mov a,c ;write type in c sta wrtype cpi wrual ;write unallocated? jnz cead operation sta rsflag ;must read data mvi a,wrual sta wrtype ;treat as unalloc jmp rwoper ;to perform the read ; nx h shld unatrk ;unatrk = unatrk+1 ; noovf: ;match found, mark as unnecessary read xra a ;0 to accumulator sta rsflov l,c shld dmaadr ret ; sectran: ;translate sector number BC mov h,b mov l,c ret ; ;***************************cmp m ;sekdsk = unadsk? jnz alloc ;skip if not ; ; disks are the same lxi h,unatrk call sektrkcmp ;sektrk = unatrk?  flag homed: ret ; seldsk: ;select disk mov a,c ;selected disk number sta sekdsk ;seek disk number mov l,a ;diskhkuna ;check for unalloc ; ; write to unallocated, set parameters mvi a,blksiz/128 ;next unalloc recs sta unacnt lda se ;***************************************************** ;* * ;* The WRITE enag ;rsflag = 0 jmp rwoper ;to perform the write ; alloc: ;not an unallocated record, requires pre-read xra a ;0 to ac************************** ;* * ;* The READ entry point takes the place of jnz alloc ;skip if not ; ; tracks are the same lda seksec ;same sector? lxi h,unasec cmp m ;seksec = unasec? jnz al number to HL mvi h,0 rept 4 ;multiply by 16 dad h endm lxi d,dpbase ;base of parm block dad d ;hl=.dpb(curdsk) kdsk ;disk to seek sta unadsk ;unadsk = sekdsk lhld sektrk shld unatrk ;unatrk = sectrk lda seksec sta unasec ;unatry point takes the place of * ;* the previous BIOS defintion for WRITE. * ;* cum sta unacnt ;unacnt = 0 inr a ;1 to accum sta rsflag ;rsflag = 1 ; ;********************************************** * ;* the previous BIOS defintion for READ. * ;* * ;*************loc ;skip if not ; ; match, move to next sector for future ref inr m ;unasec = unasec+1 mov a,m ;end of track? cpi cpret ; settrk: ;set track given by registers BC mov h,b mov l,c shld sektrk ;track to seek ret ; setsec: ;set sesec = seksec ; chkuna: ;check for write to unallocated sector lda unacnt ;any unalloc remain? ora a jz alloc ;skip i ******* ;* * ;* Common code for READ and WRITE follows * ;*  mvi c,128 ;length of move lda readop ;which way? ora a jnz rwmove ;skip if read ; ; write operation, mark and switchtdsk lhld sektrk shld hsttrk lda sekhst sta hstsec lda rsflag ;need to read? ora a cnz readhst ;yes, if 1 xra  inx d inx h ldax d cmp m ;sets flags ret ; ;***************************************************** ;* ve, same as seek buffer? lda sekdsk lxi h,hstdsk ;same disk? cmp m ;sekdsk = hstdsk? jnz nomatch ; ; same disk, same  ;buffer written call writehst lda erflag ret ; ;***************************************************** ;*  * ;***************************************************** rwoper: ;enter here to per direction mvi a,1 sta hstwrt ;hstwrt = 1 xchg ;source/dest swap ; rwmove: ;C initially 128, DE is source, HL is dea ;0 to accum sta hstwrt ;no pending write ; match: ;copy data to or from buffer lda seksec ;mask buffer number ani * ;* WRITEHST performs the physical write to * ;* the host disk, READHST reads the ptrack? lxi h,hsttrk call sektrkcmp ;sektrk = hsttrk? jnz nomatch ; ; same disk, same track, same buffer? lda sekhst  * ;* Utility subroutine for 16-bit compare * ;* form the read/write xra a ;zero to accum sta erflag ;no errors (yet) lda seksec ;compute host sector rept secshf orst ldax d ;source character inx d mov m,a ;to dest inx h dcr c ;loop 128 times jnz rwmove ; ; data has been mov secmsk ;least signif bits mov l,a ;ready to shift mvi h,0 ;double count rept 7 ;shift left 7 dad h endm ; hl hashysical * ;* disk. * ;* * ;************************************lxi h,hstsec ;sekhst = hstsec? cmp m jz match ;skip if match ; nomatch: ;proper disk, but not correct sector lda hstw * ;***************************************************** sektrkcmp: ;HL = .unatrk or .hsttrk, compare with a a ;carry = 0 rar ;shift right endm sta sekhst ;host sector to seek ; ; active host sector? lxi h,hstact ;host aced to/from host buffer lda wrtype ;write type cpi wrdir ;to directory? lda erflag ;in case of errors rnz ;no furthe relative host buffer address lxi d,hstbuf dad d ;hl = host address xchg ;now in DE lhld dmaadr ;get/put CP/M data ***************** writehst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. write "hstsiz" bytes ;frrt ;host written? ora a cnz writehst ;clear host buff ; filhst: ;may have to fill the host buffer lda sekdsk sta hssektrk xchg lxi h,sektrk ldax d ;low byte compare cmp m ;same? rnz ;return if not ; low bytes equal, test high 1stive flag mov a,m mvi m,1 ;always becomes 1 ora a ;was it already? jz filhst ;fill host if not ; ; host buffer actir processing ; ; clear host buffer for directory write ora a ;errors? rnz ;skip if so xra a ;0 to accum sta hstwrt om hstbuf and return error flag in erflag. ;return erflag non-zero if error ret ; readhst: ;hstdsk = host disk #, hsttrk; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; diskiz ;host buffer ; ;***************************************************** ;* fined by ; disks 4 ; diskdef 0,1,26,6,1024,243,64,64,2 ; dsk set 0 ; rept 3 ; dsk set dsk+1 ; diskdef %dsk,0 ; endm isk number hsttrk: ds 2 ;host track number hstsec: ds 1 ;host sector number ; sekhst: ds 1 ;seek shr secshf hstact: ds 1ew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (w = host track #, ;hstsec = host sect #. read "hstsiz" bytes ;into hstbuf and return error flag in erflag. ret ; ;*******def parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logi * ;* The ENDEF macro invocation goes here * ;* * ;****************** ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the bio ;host active flag hstwrt: ds 1 ;host written flag ; unacnt: ds 1 ;unalloc rec cnt unadsk: ds 1 ;last unalloc disk unatord) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of ********************************************** ;* * ;* Unitialized RAM data cal disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,...,*********************************** end s, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is rk: ds 2 ;last unalloc track unasec: ds 1 ;last unalloc sector ; erflag: ds 1 ;error reporting rsflag: ds 1 ;read sectortracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defiareas * ;* * ;***************************************************** ;n-1) ; ; each parameter-list-i takes the form ; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] ; where ; dn is the disk number 0; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a large flag readop: ds 1 ;1 if read operation wrtype: ds 1 ;write operation type dmaadr: ds 2 ;last dma address hstbuf: ds hstsnes disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is de sekdsk: ds 1 ;seek disk number sektrk: ds 2 ;seek track number seksec: ds 1 ;seek sector number ; hstdsk: ds 1 ;host d,1,...,n-1 ; fsc is the first sector number (usually 0 or 1) ; lsc is the last sector number on a track ; skf is optional "sk  disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,00he block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fints for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn eqse dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb macro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;;  > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; 00h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc veclls with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not fouu als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table %blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shproduces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variablnow generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries petors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter blnd yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkva else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocatr 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate table for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif r block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again ocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro dl set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; ion vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate te, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; generagcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set stateme ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks eln dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks) te the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn nd yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkva else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocat#~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3ۯ21y_͸2y2ͽ:ط fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds l ه!߶2:2a{_:߷ʖ:߷>Ľʖ:=2–!B!6#5ʖ:= gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elementl set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; ion vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate t1͘A͌>>͌92^ :߷¥.!_~#fow]ݭގޥ!v"!çREAD ERRORçNO FILE^:߷b&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!s nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxotherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks)he block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fi ! ~ 3#0 Wx x ڀ ڂ G ~ # 3x~#B!Y~ɯ2:߷=!߾ý:߷=!߾:ý^T!ffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm e#͘*~ "ڷ"͌#>?͌͘ =_.:;<> Oڅo$>!Y2*O"ʉ@tsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif\X COPYRIGHT (C) 1979, DIGITAL RESEARCH lls with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not fou~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x nddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6"  nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul_͌> ͒> Ò> Ò͘~#͌ì _2<د2  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇO*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*Ґ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN#  *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!FwyADCOMf^: !߶ Â$$$ SUB"**#"͕: 2Þy<_WyOxOxG* ~V5dw^ :ʈ ݯw4!Y~ʆ͌†t=ʆf ^ T ݯ2o&)|+!<ͧyx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nxʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# # "C{2!"E9"1A22!ty)K!G_^#V*C~E ,NÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A#~$=2Ek͌ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Y޸psp2mÆÆf ͧ"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# x: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD# w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎ&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# FILE EXISTS _: É: :߷ʉ=2)ͽÉ T!@k!}|q ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*2E>! ^#V w#P:BO|^#V#"##"##"##"!ì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ> O͐  :E B 2>: b# : y! 4 5~yy5 6yS:2E!~Яw>T D^6k-äPYy 5*{zBK5`~2߯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO*{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»{TMAyx >/:(>>2>(y>:!_zV#_~  :!):!!!1: !9:PY}(|˘A8gѷ> :2z2S22w<2*!"R":(8 VA>w(>>wz2~!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q**>2>2**":ob"2*~(ͅ8ͦgX:2>2>21> 2> :G y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26xÉz.vFLOPPY ^1?@/ _      y2y1d̈́|^#VS*3!1NFx(BtNF C̈́: Â_Gy_()gʳD͂ <`G.͓|y2!$O͞Ɛ'@'OÞ):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6/_~(!*:{ _{: # A-͚ >W6(  :=2 W{((2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄ2CG 8"~G:G:~ >2>7?KnfB8C[MDx| #*5"!">22*3:OvWarm boot error-reset system $Can't recognize density of disk in$Read$Wr:ʑw:2E**E}DQ>2y~:::A>: ~ ( w:2F8 <2i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{ !5 Am-͚ >> 2:O :G:uy~ :2u8 q*~(P-ÌÚëSBCIO ( *|>Gx((Ox& }<2~sT1T*$} ͌[! w}<2ite$Seek$ error on track $ sector $ side $ drive $ The diskette in$ is write-protected. Remove the diskette and put on theAÖÚÞâüpÄtxÄ|ÀæN   y2:W:*KB(7:Gz?"*":G2xG![2G!zi` n&y P:w>2*s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>">(=(!&:22ͦ>2/ͱEͅ0zW: #͎8/2:2>2>2b/2gX:>2/!  write protect tab, then type any character.$ Type a control-C if you wish to abort the operation instead $ is not ready. Ins  ! @AA@H@HBD@@BI@$ $HBD!B HI$$$"$ D$"HIHBI$I$DH@" 0 ;SECTOR 1 FOR DOUBLE DENSITY DISKS ; CODE1 EQU 0e6H ;single sided CODEQ EQU 0e7H ;double sided ;**********************; ; ; ; MACLIB MACRO ; ;FORMAT PROGRAM FOR THE WD1791 FDISK CONTROLLER ; INTERLEAVED SECTOR VERSION ; ; *************ert diskette, close drive door, and type any character to continue.$ IF MINI MVI A,CODE1 STA CODE2 ; set allways double density XRA A ELSE ; 8 inch drives MVI A,0E5H ;INIZ C*********************** ; BDOS EQU 5 WBOOT EQU 0 CMD EQU 00CH DAL EQU CMD+3 WAIT EQU 014H WTRACK EQU 0F4H SEEK EQU 19H * DD DISK CONTROLLER **************** ; TRUE EQU 0FFFFH FALSE EQU NOT TRUE ; ; ;*****************************************ï!1 !; !`|G^22y:??!H͞͞:"1O͞:*81O͞ SuperODE2 TO ISNT CODEQ STA CODE2 PRINT CALL IMPC ;GET CHAR CPI 'D' DSEL EQU 014H TRACK EQU CMD+1 SECT EQU CMD+2 ; IF NOT MINI SECNT EQU 8 SSECT EQU 26 MTK EQU 76 ;77 TRACKS (0-76) GA*********** ; ; ;DISK DRIVE TYPE MINI EQU false ;FALSE FOR 8 INCH DRIVES ; ;********************************************* Quad CP/M v X2.0 Typeahead installed $K CP/M 2.2 installed Default console is serial port $ Default printer is $parallel ;IS DOUBLE ? JNZ CKSINGL ;IF NOT SEE IF SINGLE ; ; XRA A ;SET DENS TO 0 FOR DOUBLE DENSITY JMP SETUP1 CKSINGL: $ @ $!$I!"@! $AI$$! "B $ "H@"! $ HD@DH"$@!$$ HP1 EQU 80 GAP3 EQU 80 PRE0 EQU 12 SGAP4F EQU 40 SGAP2F EQU 26 SGAP20 EQU 6 SGAP1F EQU 27 ENDIF ; ; IF MINI S****** ; ; ; ; ; ;**************************************** ; ;DOUBLE DENSITY CODE FLAG ; ;THIS FLAG IS PLACED ON TRACK printer driver$serial port $ $ 00O>0GD`D CPI 'S' JNZ QUIT ;NOT SINGLE THEN QUIT MVI A,MTK+2 ;DO ALL TRACKS SINGLE DENSITY ENDIF SETUP1: STA DENS ; ; PRIN" ECNT EQU 4 ;1024 byte sectors SSECT EQU 18 ;DOUBLE DENSITY GAPS GAP1 EQU 255 GAP3 EQU 255 PRE0 EQU 12 ;SINGLE DENSITY STA DBLFL DOIT1: PRINT LDA DISKNO ADI 41H CHAROUT PRINT <': and press the ReMPC ;GET ANSWER SUI 'A' JC QUIT CPI 4 JNC QUIT ; START1: MOV C,A STA DISKNO ;SAVE DRIVE NUMBER SYSTK: PRINT <D: NO1: MVI M,0F7H INX H MVI A,0FFH MVI B,SGAP1F CALL PUT IF MINI MVI A,0F6H MVI B,SGA1F6 CALL PUT ENDIF ODE2 TO ISNT CODEQ STA CODE2 PRINT CALL IMPC ;GET CHAR CPI 'D' ,0F6H CALL PUT ENDIF SLOOP: XRA A MVI B,SGAP20 CALL PUT MVI M,0FEH INX H MOV M,D ;TRACK INX H LDA SIDE MGAPS SGAP4F EQU 11 SGAP1F EQU 7 SGA1F6 EQU 3 SGAP20 EQU 6 MTK EQU 39 ;40 TRACKS (0-39) ENDIF ; INTRP EQU 0D0H RESturn key '> CHARIN CPI 0DH JNZ 0 ; exit if not return PRINT LDA DISKNO OUT WAIT ;SELECT DISK & SET SINGLE DCR,LF,'Format System Tracks only ? (Y,N) :'> CALL IMPC CPI 'N' JZ DOIT CPI 'Y' JNZ SYSTK XRA A STA FLAG DOITINR E MOV A,E CPI SSECT+1 ;MAX SINGLE DENSITY SECTORS PER TRACK JNZ SLOOP MVI C,3 SLOOP3: MVI B,0 MVI A,0FFH CALL ;IS DOUBLE ? JNZ CKSINGL ;IF NOT SEE IF SINGLE ; ; XRA A ;SET DENS TO 0 FOR DOUBLE DENSITY JMP SETUP1 CKSINGL: OV M,A ;SET SIDE INX H MOV M,E INX H MVI M,0 INX H MVI M,0F7H INX H MVI A,0FFH MVI B,11 CALL PUT MVI B,6 TO EQU 1 ;6MS STEP ORG 100H ; START: LXI SP,START PRINT PRINT IF MINI PRINT ENDIF COMPLT: E ZERO SLOOP2: MVI E,1 ;SECTOR LXI H,BUFF ;DMA BUFFER ; IF NOT MINI MVI A,0FFH MVI B,SGAP4F CALL PUT XRA A MVSingle or Double Sided (S,D) :'> CALL IMPC CPI 'S' JZ DOIT1 CPI 'D' JNZ DOIT MVI A,CODEQ STA CODE2 MVI A,1  ei POP D IN CMD ;GET STATUS ORA A ;TEST JNZ ERROR LDA DENS ORA A JZ START2 INR D MOV A,D OUT DAL ;T MVI A,0FFH ;INIZ SYSTEM FLAG TO NOT STA FLAG ;SYSTEM CALL I ORA D ;MAKE SURE TRACK 0 JNZ NO1 LDA DENS ORA A JNZ NOTDD DCX H LDA CODE2 ;DENSITY CODE MOV M,A INX H NOTD IF MINI MVI A,CODE1 STA CODE2 ; set allways double density XRA A ELSE ; 8 inch drives MVI A,0E5H ;INIZ CI B,6 CALL PUT MVI M,0FCH INX H ; ENDIF ; MVI B,SGAP1F ;GAP 1 MVI A,0FFH CALL PUT IF MINI MVI B,SGA1F6 MVI A# TELL 1791 LDA DENS CMP D ;DENS IS 77+1 OR 0 JZ COMPLT ;IF D=78 AND DENS = 78 THEN DONE MVI A,SEEK di OUT CMD IN24 BYTES CALL PUT CALL PUT CALL PUT IF MINI MOV A,E ; GET SECTOR DCR A ORA D JNZ MN0S1 push H push D l; TABLE LOOK UP ; INTERL: PUSH H LHLD PTR MOV E,M MOV A,E INX H SHLD PTR ;POINT NEXT AND SAVE POP H ORA A ;SErive Status : '> POP PSW PUSH PSW HEXOUT ;PRINT ERROR STATUS POP PSW PUSH PSW ANI 80H JZ ERROR1 POP PSW PRINTWAIT ; SELECT DRIVE, DENSITY & HEAD MVI E,0 ;RESET SECTOR COUNTER LXI H,TABLE ;RESET POINTER SHLD PTR ;RESET TABLE PO;GET SIDE NUMBER DCR A ;TEST SIDE JZ WAS12 MVI A,1 ;DO SIDE 1 STA SIDE ;DO OTHER SIDE JMP LOOP2 WAS12: ;DO NEX WAIT ;WAIT FOR END OF SEEK ei ; ;SEE IF LAST TRACK ; LDA FLAG MOV B,A MOV A,D ;GET TRACK SUI 2 ORA B ;IF D=2xi D,0fc7fh dad D ;put code byte at end of 1st 128 bytes LDA CODE2 MOV M,A pop D pop H MN0S1: ENDIF MVI M,0F7H T FLAGS NEXTSE: JZ NEXTTK CALL PUTZERO MVI A,0F5H MVI B,3 CALL PUT MVI M,0FEH INX H MOV M,D ;TRACK INX H L JMP COMPLT ERROR1: POP PSW ANI 40H ;SEE IF WRITE PROTECT JZ COMPLT PRINT JMP COMPLT QUIT: LDA 4 ;SELECT DRIVE 0 HEAD 0 ANI 03H OUT WAIT ;DO IT JMP WBOOT ;GO BACK TO CPM  0 JNZ INTERL JMP INTER2 INTER1: MOV A,D ;SEE IF TRACK 1 CPI 0 JNZ INTERL ;IF NOT TK 0 THEN DO INTERLEAVE ; ; ; i OUT CMD IN WAIT ei LDA FLAG ;TEST ALL DISK? ORA A JZ COMPLT JMP LOOP2 PUT: MOV M,A INX H DCR B JNZ PUT  START2: XRA A STA SIDE if mini mvi d,0ffh ;fake so double density starts at track 0 jp was12 endif LDA DBLFL ORLOOP3 PUSH D LXI H,BUFF XCHG ;PUT IN D,E LXI H,WLOOP MVI A,WTRACK di OUT CMD ; CALL WLOOP POP D IN CMD ;G MVI B,12 XRA A CALL PUT MVI A,0F5H MVI B,3 CALL PUT MVI M,0FBH INX H MVI A,0E5H MVI B,0 CALL PUT ;DATA 10 IMPC: ;INPUT A CHAR. FROM THE CONSOLE XRA A STA IBUFF+2 INPUT IBUFF,80 LDA IBUFF+2 RET ; ; WLOOP: IN WAIT ORANON INTERLEAVE SECTOR CALCULATION ; INTER2: INR E MOV A,E CPI SECNT+1 JMP NEXTSE ; ; INTERLEAVE SECTOR CALCULATION  RET PUTZERO: MVI B,PRE0 XRA A CALL PUT RET ERROR: PUSH PSW PRINT ERA CPM.SYS A>SAV 34 CPM.SY (I yo ;count of sectors in table so far nxtitem: ld DE,4 add IX,DE ld B,(IX+2) ld A,(IX+3) ld C,A sub B inc A ld E,A ote. MOVCPM 59 * SAVE 34 CPM59.COM 5) Integrate the new BIOS and CP/M into the CPM.SYS file. DDT CPM59.COM NEXT48,6,23,40,15,32,49,7 ; DB 24,41,16,33,50,8,25,42,17,34,51 ; DB 9,26,43 db 1,4,7,2,5,8,3,6 ENDIF ; IF MINI db 1,3,2 th lin address Example syste ha 2 memory-mappe vide boar residing at F800H-FFFFH. F800h-1200H = E600H fo Regenerating the SUPERBIOS for a different memory size Th SUPERBIO normall reside i 61 CP/ syste wit 6hav modifie th BIO yo mus sav howeve man page ar necessar t includ th BIO i th .SY file Ther ar 22 p;sectors in this track add HL,DE ld A,bdossecs ;number of sectors for wboot cp L jr z,movtbl ;this track ends exactly  PC 2300 0100 -M980,1F7F,10 (Mov th CC an BDOӠ t 100Ƞ) if using an offset .COM file (bet,4 ENDIF DB 00 BUFF: IBUFF: END START r the SUPERBIOS. 3 Us Microsoft-compatibl linke (LINK L80 LINKMT etc t lin SUPRBIOS.REL LIN wil gener% ages to the CCP and BDOS portions of CPM.SYS) Th ne dis shoul b bootabl i i ha ha th loade SYSGEN' on it. Exit and save ) B>ERA CPM.SYS B>SAVE 34 CPM.SYS 5 Yo no hav bootabl syste dis equivalen t thos seV2.2 READY FOR "SYSGEN" OR "SAVE 34 CPM61.COM" A>SAVE 34 B:CPM61.COM A>B: B>A:DDԠ CPM61.CO Us>2͵!VÿF!QADVANCED MICRO DIGITAL LDRGEN VER 2.1 for the Super Quad Z80 SBC with eight inch drives Enter  flus dis buffer afte fil closing. 2) Make a copy of your SUPERBIOS distribution disk to work on. Do PIP B:=*.*[(COPYRIGHT (C) 1982, ADVANCED MICRO DIGITAL o&)__> ?> ?F~?#VOͦ|{ 22=2~ ld DE,128 add HL,DE ;update DMA push BC push HL ld B,0 ;C=sector to read (<256) ld DE,(xlt) call sectran ld Cn to customers who have purchased CP/M from Advanced Micro Digital.  you DD t brin iCP/M ) NEXT PC 2300 0100 -M980,1F7F,100 ( Move the CCP and BDOS to 10source drive (A-P) or type if in memoryPlace source disk in drive and type Enter destination drive (A-P) or type vo] then use SYSGEN to transfer the loader. 3 Pu th cop o o th SUPERBIO distributio dis i you secon flopp2w2=2! $'**j! "͒>!4(QN͖:( y.[DM͚2: 8!AV7 F Creatin bootabl SUPERBIO dis fo customer wh alread ow CP/M 1 Patc you copret dw 0 jp fhome jp fseldsk jp fsettrk jp fsetsec jp fsetdma jp fread ; jp fwrite ret nop nop ; jp listst0H ) -ICPM.SYS -R1600 ( The CPM.SYS file has the BIOS image ) -M2D00,3700,1700 ( Move the  to rebootPlace destination disk on drive and type Physical error in disk operation - type to continue, anyt driv (B:) an you curren CP/ syste dis (wit th patche MOVCPM.COM i th firs flopp driv (A:). 4) Run MOVCP<2:(͢͞(:(:w1!V:] (J\Ͱ< !Qw2|! DM͚\ͫ [T!Qw2i!]V o MOVCPM.CO a describe i th attache Digita Researc Note Thi i necessar becaus th SUPERBIO use sect ret dw 0 jp sectran page ; console vectors for later use const: ld A,bootcon jp pserin conin: ld A,bootcon new BIOS to 1700H ) -l1700,1702 ( Make sure move went OK ) 1700 JMP FA00 -G0 ( hing else to quitLDRGEN successfulBad drive specification (A-P)Can'nt open file: Error in reading file: M and DDT to create a system file. A>MOVCP 61 61 i th norma syste siz ) CONTSTRUCTING 61K CP/M !zQ7 (02Ab F!V7 F2͵!V!Q7 (E20Ab !Q7 )F:2 :] (:k2~ o blocking/deblockin algorith (differen tha th Digita Researc algorithm tha use th director writ cod i tjp serin conout: ld A,bootcon jp serout ; ; Sectran input: Logical sector in BC, translate table in DE ; no transla& >o:~W!{> " OC > S>O:3 _!c(  :v= L{((ZZ:nhZ:thZ:xhZZ>2v ~ 3>L ~ÒÃG3x(OxA,(0W}_nfRut;RDM!A76! [36:G6!w0 ͖:s;.¨ ͭ͂ڨ :y; ڟ !Ͱ ͭÌ ! :y;<2y;O!\ :s;w:s;0O> :s;02s;> :s;AO> :s;A 2s;>>!"z;1!2|}N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*K ( w:q2rF8 <2ty2x:qW:j*mKoB(7:rGz?"|*m"o:qG2rxG![k2jG!kzi` n&?@/ _      yes the correct byte and outputs to wait ; and updates the track register with the most recent information seldrv: ld A,(IX!2͖ !͗>O3F#Nů  SYS: Which .SYS file to load 0 = CPM :s;<:s;]:s; HҀ :s;S¸ !96ͭ} :s;P !96 "9} :s;D !96 "9} :s;L "8} :s;M B0KC:( [0!'}#"* (,*#"+))[R#}! > z{2n2xw<2q*k!` "kͱ"k: (8 ~Zd>w(>>w~Ca2ny2qY  5"z~G:xG~ > 2v:nO y~ 8 q :r(8 C s!0:0DM)) )oN$=3))g 08  2e 1 = OSLOAD ? SelectReadFile not found error: file te table ld (HL),E inc HL ld (HL),D putdpb: ld DE,9 ;offset of DPB in DPH add HL,DE ld (HL),C inc HL ld (HL),B !!Ax͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(n't recognize density of disk in$Read$Write$Seek$ error on track $ sector $ side $ drive $ $ q!*z~(ͭ8͏ͷ:q2t>2>2yKc> 2v> :yG /_~(!` *k:t{ 8 :eYi  ʬP Ó @!s6#¹*f&"k:gG_!s}/o|/g#"ox/o&#"ms*o*m*+":*+"/:*+"^:*+":!":"5:"d:":!":"7:"f:"::8*9:8=o&))8  ^#V!q;p+q!r;6>!r;2*r;&;) p; dec HL dec HL sbc HL,DE ;restore DPH (carry reset by or A) ret fbadsel: ld HL,0 ret ;return error page ; #~W#:G)[7?K R0! !;NFx(ENF C$7?KnfB8C[0MD!'!\6͂ !!y;6͂6 :y;- !Ͱ ͭ :s;:| :\:y;HZ !:]A<2\O>n !*y;&\ 6 ì !y;6' x*k:g> > G>G:e2e*hh:jWzY:g}|:e>P!s>Oy nڋ79led on the correct track ; (and that the head has been selected on the correct side!) ; and that the bytes in rdwrite for R/W ue or ^C to abort.$ Formatting. CYLINDER HEAD $$ Verifying. CYLINDER HEAD $ HDC1001 Error $ on Head $, Cy*+":*+"/:*+"^:*+":!":"5:"d:":!":"7:"f:"::8*9:8=o&))8  ^#V!q;p+q!r;6>!r;2*r;&;) p;gate Technology ST503 1 = ST506 2 = TM601S ; Tandon Magnetics TM601S 3 = TM602S 4 = TM603S 5 = TM603SE 6 = TM501 #~W#:G)[7?K R0! !;NFx(ENF C$7?KnfB8C[0MD!'+|2 *h:j_:g=WhKyYBx}|:e>  P Y PP>o! z> 8  >O0linder $, Sector $ Format completed.$Sorry, unrecoverable error during format.$ Operation aborted.$@3>Lûþ~ÃG3x(OxA,(0W}_nfRut;RDM!A76! [36:G6!w0 ͖ P h7 +| Ó ( ʡYƐ'@'_ |P}P1!2|}N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*Kzi` n&<CC!: :::>͓8Ϳmates SA1002 11 = SA1004 12 = Q2010 ; Quantum Q2010 13 = Q2020 14 = Q2030 15 = Q2040 ? $ Invalid input try again. $ !2͖ !͗>O3F#Nů  SYS: Which .SYS file to load 0 = CPM & 1ADVANCED DIGITAL CORPORATION HDC1001 HardB0KC:( [0!'}#"* (,*#"+))[R#}! ;step to correct track ; ; diskio actually reads or writes the necessary sector ; it assumes that the head has already sett!> ZhZqZhh)Zh3Zq>8*]}o"k@ Which physical hard disk do you want to format. (0-3)? $ This operation will destroy all data on drive $. Hit return to contin 1 = OSLOAD ? SelectReadFile not found error: file  Disk Controller Formatter Select disk type from following menu *** Hard Disk selection choices *** 0 = ST503 ; Sea!!Ax͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(( R}??2y2::G:(7*KB7?[*R}?:2*"*E}o"xG!<[2nt-1) in A ; inbuf: ld A,(iosec) ld D,A ld A,(bufvalid) ;0 if contains valid data, else 255 rra ret c ld A,(iotrk)  first CP/M sector in block ld (blksec),A sideflsh: ;called to set up for a flush rept hstshft rrca endm ;A=pharamter table ; If E (logical disk) is zero, then getden assumes the density hasn't ; changed (if it has, then we can't do a w!\6͂ !!y;6͂6 :y;- !Ͱ ͭ :s;:| :\:y;HZ !:]A<2\O>n !*y;&\ 6 ì !y;6,(iodma) ret ; ; returns IX=start of DHPB (disk hardware parameter block) for ; the drive in A (0-3) ; uses B,DE al HD1001 Error $ on Head $, Cylinder $, Sector $, Drive $ ld B,A ld A,(blktrk) cp B jr z,rttrk ;on right track, at least scf ret ;not a match rttrk: ld A,(blksec) ld ysical sector number, but it may ;be on the second side ld B,(IX+pspt) cp B ld C,0 jr c,side0 sub B inc Carm boot-table is wrong getden: ld A,0d0h ;reset FDC out (cmd),A ld A,D call getparm if mini if not special se:s;.¨ ͭ͂ڨ :y; ڟ !Ͱ ͭÌ ! :y;<2y;O!\ :s;w:s;0O> :s;02s;> :s;AO> :s;A 2s;>>!"z;so, returns D=0 getparm: ld B,A inc B ld IX,dskparm-parmlen ;hardware parameter block ld DE,parmlen shft1: add IX,DE ( w:q2rF8 <2ty2x:qW:j*mKoB(7:rGz?"|*m"o:qG2rxG![k2jG!B,A ld A,D sub B ret C ;sector lower # than buffer cp hstcnt ;carry set if in buffer ccf ret ; mkbufad receiv side0: inc A ld (psec),A ;physical sector on one side ld A,C ld (head),A ;set head control byte ret page ; ; inbut 3,A ;set double density for minifloppy endif endif out (wait),A ;select new drive, head 0, single D call resto1 ;ba :s;<:s;]:s; HҀ :s;S¸ !96ͭ} :s;P !96 "9} :s;D !96 "9} :s;L "8} :s;M  djnz shft1 ret page ; ; Getden attempts to find the density of the disk in drive (D) ; by trying to read the current t> z{2n2xw<2q*k!` "kͱ"k: (8 ~Zd>w(>>w~Caes A=relative sector in host buffer ; returns HL=start of CP/M sector ; uses B,HL,DE mkbufad: ld B,A ;B=relative sector if returns carry flag set if sector no in buffer ; also returns (iosec) in D ; if sector is in buffer, returns offset (0 - hstcck to track zero xor A ld (iotrk),A if not mini ld (IX+density),A ;track zero always single density endif inc A uble density ; sidesec computes the correct physical sector and side ; sidesec: ld A,(iosec) and not(hstcnt-1) ;computerrack address in both densities ; If the attempt is successful, Getden will update the ; dens, pspt, and drvtrk fields of the pn't recognize density of disk in$Read$Write$Seek$ error on track $ sector $ side $ drive $ $n buffer inc B ld HL,hstbuf-128 ld DE,128 shft2: add HL,DE djnz shft2 ld BC,128 ;make ready for sector LDIR ld DE)  if mini ld (IX+density),A ;double density for minifloppies endif ld (iosec),A ;read sector 1 ld HL,hstbuf ;buffer u dirbuf+128d ;host sector deblocking buffer ;no allocation vectors needed end  0 ;number of retries left curfpy: db 0 ;current selected physical floppy drive head: db 0 ;head control = 0 or 1 oper: dbvo] then use SYSGEN to transfer the loader. 3 Pu th cop o o th SUPERBIO distributio dis i you secon floppge ; ; Floppy disk driver storage ; iotrk: ds 1 ;current track for current disk iosec: ds 1 ;current logical sector for D Creatin bootabl SUPERBIO dis fo customer wh alread ow CP/M 1 Patc you cophas already been flushed ld (iodma),HL call rdsngl or A ret nz ;can't read sector ld A,(hstbuf+7fh) ;code byte for es A=relative sector in host buffer ; returns HL=start of CP/M sector ; uses B,HL,DE mkbufad: ld B,A ;B=relative sector i 0 ;operation (read/write) to be performed next trkstor: db 0 ;storage for iotrk during a flush hwptr: dw dskparm ;storage  driv (B:) an you curren CP/ syste dis (wit th patche MOVCPM.COM i th firs flopp driv (A:). 4) Run MOVCPD, physical for SD blksec: ds 1 ;first logical sector in current host blk2sec: ds 1 ;8th CP/M sector in an unallocated 2K bl o MOVCPM.CO a describe i th attache Digita Researc Note Thi i necessar becaus th SUPERBIO use sectdisk type OR A jr z,codeok ;some SD disks have old loaders here sub 0e5h ;code for a normal single density disk cp 3 n buffer inc B ld HL,hstbuf-128 ld DE,128 shft2: add HL,DE djnz shft2 ld BC,128 ;make ready for sector LDIR ld DEfor pointer to current hw parameters page ; ; disk buffers ; These are not part of the floppy driver module as such and ; sM and DDT to create a system file. A>MOVCP 6 62 i th norma syste siz ) CONTSTRUCTING 62K CP/M ock blktrk: ds 1 ;track the buffer is from psec: ds 1 ;current physical sector bufvalid: db 0ffh ;buffer contains valid dao blocking/deblockin algorith (differen tha th Digita Researc algorithm tha use th director writ cod i t ret nc ;not our code byte codeok: ld (IX+density),A or A jr z,snglspt ld A,ddpspt ;physical sectors on one side of D,(iodma) ret ; ; returns IX=start of DHPB (disk hardware parameter block) for ; the drive in A (0-3) ; uses B,DE alhould be shared by all disk modules as much as possible dirbuf: ;coldboot code lives in the directory buffer ; hstbuf eqV2.2 READY FOR "SYSGEN" OR "SAVE 34 CPM62.COM" A>SAVE 34 B:CPM62.COM A>B: B>A:DDԠ CPM62.CO Usta for (blksec) ;0 = valid data wrtpend: db 0 ;write pending from buffer iodma: dw 80h ;current dma address retryc: db flus dis buffer afte fil closing. 2) Make a copy of your SUPERBIOS distribution disk to work on. Do PIP B:=*.*[D jr putpspt snglspt: ld A,26d ;single density physical sectors putpspt: ld (IX+pspt),A xor A ret ;no errors paso, returns D=0 getparm: ld B,A inc B ld IX,dskparm-parmlen ;hardware parameter block ld DE,parmlen shft1: add IX,DE*  you DD t brin iCP/M ) NEXT PC 2300 0100 -M980,1F7F,100 ( Move the CCP and BDOS to 10FILE DOES NOT EXIST++ 0TYPE "R" TO RETURN TO MODEM TYPE "A" TO RE-ENTER NAME: s}[NAcRʊØ/2:X˜>2c:G cMʉ>2:ETTS}RD c::] >2/2A:Nya?!\͑:60CHECKSUM ERROR A6ä>a͋7>2(2ͮ!F^" !\7ͻ ڕ:fp*ock blktrk: ds 1 ;track the buffer is from psec: ds 1 ;current physical sector bufvalid: db 0ffh ;buffer contains valid da>B2=:] 4) ͩ Q:N:N0FILE OPEN, READY TO RECEIVE :>Y>Ca:y0CRC in effect Ñ0Chec0H ) -ICPM.SYS -R1600 ( The CPM.SYS file has the BIOS image ) -M2D00,3700,1700 ( Move the ;f0 ++FILE TRANSFER COMPLETED++ Ê0 ++FILE TRANSFER UNSUCCESSFUL++ Ê0 ++ TRANSFER CANCELL!">2h`sG:>2x^c VS^:`:/2`>2`[:ʙw\ i"!4p!5d!F^":A>@2!6!+N!, 6 !+F# ~ # ~ "+# ~ :<2# ~ ta for (blksec) ;0 = valid data wrtpend: db 0 ;write pending from buffer iodma: dw 80h ;current dma address retryc: dbksum in effect ͒ ڣ͈͡ Ñ͹͈ =:0AWAITING NAME NAK P͸>a!5*\ i">a7 !]new BIOS to 1700H ) -l1700,1702 ( Make sure move went OK ) 1700 JMP FA00 -G0 ( ED ++ 6# 6 #”6#0 ENTER FILE NAME TO BE TRANSFERRED - C/R TO QUIT: *͜N*!333#" Ž>:[:=̠>22 !:w#[:w#[>  x6#}6 *9~  # #~  "!8p \ȇ!o ~] #~+] i!e~w#~w\!\ 0 ;number of retries left curfpy: db 0 ;current selected physical floppy drive head: db 0 ;head control = 0 or 1 oper: db~a:~[8#>a:NQe>ua:X0CHECKSUM ERROR P͸>a>a!\͑:ʑ0AWAIExit and save ) B>ERA CPM.SYS B>SAVE 32 CPM.SYS 5 Yo no hav bootabl syste dis equivalen t thos se!~"hs##[shTsc[T[T:l&)>o55+|!͏!\ i!3͏!l͏ͥ:, ʘ0 ++l i!u6B#6A#6Kl!l6\:\<} 2h:n  >2n !\o  ͇ :\2{ !o \ ͇ \!9"1s MODEM TRANSFER PROGRAM as of 05/14/82 FOR SUPER QUAD Z80 SBC by ADVANCED MICRO DIGITAL $ >2TING FILE NAME Aڑͣʡ7!]:0TIME OUT RECEIVING FILENAME ?w:~[>a#}én to customers who have purchased CP/M from Advanced Micro Digital. £>2:(Sͯҫ>B2>a=:] 4͐ͥP͐#2͎ : ö>a =2:>2l+ < !{ \ ͇ \!o \ ͇ \<7E 2n =Ɓo&|  ͇ ] ͇ 2h2|>ʍF>2y2 !F"#*!g": <2 : OF\! 2 !F"aDERROR WRITIN ACK )hs1Ҙ>aҥ> a0 ROUTINE CANCELLED >B2*#"}:+\<0FILES EXISTS >2>2/>2!"aO*ayO}o|g:|g}!o&"a*aT]*a|>!i!i>2n /2 W / :ʫ :_ 0 ++ BAD SECTOR # IN HDR _ z2>2! w, : Q2Dh!l\i2|2h A A A 2A>(Aͷ>)A_> [> [Oa~# x‡ ɯ22: 0 AWAITING # *#͆0 (ͪ0H)}:) 2):  0 ++Switching to CHECKSUMNG FILE $xGP͋07>02O:Y:^:^:w:|:|-- TYPE 'Y' TO ERASE: s[}YcN\0 No file specified c\C2>aÒ  { 7G:A :_ 0 xͷ0H RCD, NOT SOH _ >a:<2 ږ :ʆ :Oƒ:ʞ:ʸ0AWAITING INITIAL NAK ͋Cʕø0CRC request received 2*"l"w"a MUST BE FULL $#\*}" !"}\<DCAN'T OPEN FILE$::0FILE OPEN, SIZE: * ͆0 (ͪ0H) SECTORT - Return to terminal mode with no loss of data 0XPR - Toggle expert mode (Menu on/off) DIR - List directory (may specify  ͈ Ò >a:ʹ 0 SEND # *͆0 (ͪ0H)>a:a:/a>2!~a, 2yaEza{a k Q TO QUIT, R TO RETRY: sN}RQ~=A#1 ?0:>Q2Õ~#i*!\:]ʌ ʒ D ++ UNABLE TO RECEIVE BLOCK -- ABORTING ++ $: :_ 0 ++ TIMEOUT ++ :ͷN_ : 7:]2 %!6#:4:R:2:¤:}!]_ii0 TRANSFERRED :\S \2(2/2:ʾ:0 ALL TRANSFERS COMPLETED >C2>2):cN!,  { ^E - Exit to menu T - Terminal mode (optional file name) { ^T - File transfer mode E - Terminal mode with ech ++BAD LIBRARY NUMBER CALLED++ $_@w# . w#Ê~*ʮ# ñ~*ʿ#ó6?#*!\!͏:l2:m sā͜2 memory equ 16h ;SBC memory control port bnkslct equ 40h ;bank select for memory disk rambase equ 4000h ;bank address - 4000h~ʘ#Á>#’7#wկ͇ h,[ ڪG#4+~#Qpx;#ê#G~w+xF6  x Q TO QUIT, R TO RETRY: sN}RQ~=A#1 ?0:>Q2Õ~#i*!\:]o { ^X - Cancel file transfer SECONDARY OPTIONS: B - Batch mode Multi File transfers T - Terminal mode after LED++ $b͍~R~R#5ii0 | :<2No 0NOT FOUNDN>? !w#z recommended dirbuf equ 0F900h ;for standard system secbuf equ 0F980h ;use floppy deblocking buffer for two-stage transfer ê4ê;> ;>;ê>#;> ;> ;àG>#;> ;> ;xʪ;Eê>;5ê> ;> ;ê> ;> ;F##> EMGTSʸRŸ:ø0 ++Bad Option++ þ:m 0 Re-enter PRIMARY option and file name only: *͜r:m file transfer (memory save off) R - View what is received in file transfer S - View what is sent in file transfer 0 D2!\͏:2\!i:}>2(2/2:ʾ:0 ALL TRANSFERS COMPLETED >C2>2):cN!!m i_!:ʨ@ïA20 DRIVE oDQRSVTDQRSVTBCF.z80 ; org at 0 code relative, control location at link time jp ramhome jp ramsel jp rsettrk jp rsetsec jp rsetdma jpw#€ͬʊͤaڠ{Ҡ_*Ͷ** OM#^#6 x͊ 9  ;--------------------------------------------------------------------------- ; ; SUPERBIOS implementation example - Memory disEFAULT DRIVE: A[0 Command: *͜N,CPM\DIRRET*WRT7XPReDEL:,!yoDh!l\i2|2h A A A 2A>(Aͷ>)A_> [> [OaF0INVALID OPTION c: ramread jp ramwrite ret nop nop ;no flush needed db 'RAMDISK ' ;module name for display in more advanced loader ram ͊ 9   9 x͊ 9 ͊#͞ ͞6# > q>q > q>qw#q:ˆk ; ;-------------------------------------------------------------------------- nbanks equ 4 ;number of 16K banks availableڂrØÂz: ʂ5>2/2!͏Â:ʂ: ʂ* ,>2/2!͏Â:/2ÂF#p7SRTEM{_ ڐ |Ć{0A|ͷ}ͷ 0[:<ɯ20MULTIPLE ERRORS ENCOUNTERED. TYPE- home: ld C,0 rsettrk: ld A,C ld (ramtrk),A ret rsetsec: ld A,C ld (ramsec),A ret rsetdma: ld (ramdma),BC ret jr onetran dblread: ld HL,secbuf call onetran ;read from bank to secondary buffer ld DE,(ramdma) ld HL,secbuf ld----------- ramread: ld C,0 ;read/write flag jr ramio ramwrite: ld C,0ffh ramio: ld HL,(ramdma) ld B,H ld A, 1. Communication 2. Program transfer COMMUNICATIONS Th progra ma emul ;two directory blocks db 0 dw 0 ;no directory check dw 0 ;no system tracks ramalv: 2*nbanks-1 ;for 1K blocks ram ;turn on 16K bank at 4000h ;can use A,B,DE ld A,00101101b ;turn off 4000h bank on SBC out (memory),A ld A,(ramtrk)  ramsel: ld HL,ramdph ret page 60 ; Disk tables for memory disk - see CP/M 2 Alteration Guide for details ramdph: dw  BC,128 ldir ;move from secondary buffer to user DMA ret ;A set to 0 in onetran page onetran: call bankon ;turn on 11000000b and B ;get two high order bits of address dec A ;if bank addressed at 4000h jr nz,onetran ;DMA address isat termina o ech dat bac t sende (ac a computer). Terminal Mode - 'T' Option trk: ds 1 ramsec: ds 1 ramdma: ds 2 page ;------------------------------------------------------------------------- ; ; Th;each track is one 16K bank dec A ld B,A ld A,1 jr z,setbnk ;bank 0 shift: add A,A djnz shift ;A now has one bit0,0,0,0 ;no sector translate dw dirbuf ;use dirbuf in floppy module dw ramdpb dw 0 ;no directory check dw ramalv ;almemory bank ld A,(ramsec) srl A ld DE,rambase rr E ;put low order bit of A (odd number of sectors) add A,D ;in E and masked by memory bank ld A,C or A jr z,dblread ;must do write through secondary buffer ld DE,secbuf ld BC,128 Th termina mod ma b calle wit o withou fil name I fil i specifie (i shoul b ne fe only actual i/o involved is blockmoves between the memory bank ; and the user's DMA area. If the DMA area is masked by the b set at position (ramtrk) setbnk: out (bnkslct),A ;for boards with one bit per bank ret bankoff: xor A out (bnkslct)location vector ramdpb: dw 128 ;128 sectors per track - each 16K bank is a one ;track db 3 ;BSH - use 1K blocks if base + sectors/2 in D ld D,A ld A,C ;readwrite flag ld BC,128 or A jr nz,dowrite ;write operation ex DE,HL ;set tldir ;move from DMA to secondary buffer ld HL,secbuf ;make onetran think this is DMA address ld C,A ;read/write flag ile) the anythin receive b th mode ma b save i memor an late writte o disk Thank ; address, we must transfer through a secondary buffer. ; ;--------------------------------------------------------------,A ;turn of memory board ld A,00101111b ;turn on 4000h bank of SBC memory ret end  <257K memory db 7 ;BLM db 0 ;EXM dw 16*banks-1 ;if using 1K blocks dw 63 ;64 directories should be enough db 0c0h o read to user DMA dowrite: ldir call bankoff ;restore SBC memory xor A ret ;return with no errors bankon: .  MACLIB Z80 ; ; ;COLD BOOT LOADER FOR CP/M 2.2 ; FOR THE Z80 SBC ;LAST UPDATE 5/15/82 ; mini equ 0 ;set to 0ff  ldir jp 100h endif ORG 07eH nsects: if mini db 4 else db 24 endif dens: db 0e5h ;density flag patched by sysor drq or intrq ORA A ; was it intrq ? JP IODONE INI JR READLOOP IODONE: IN CMD MOV C,A SBCD CMDSTATUS ORA >2:G:!"!P>N:5zB;zB{ N*^{#"ʡ>6#r#:w#s#6#6#>N >dc data port WAIT EQU 014H ; hardware wait for fdc intrq + drq ; & drive select - restore latch ; ; BUFF EQU 80H AڹҹO2< Format System Tracks only ? (Y,N) :$ NUY22:²>2Ó Format Single or Doublfor mini ; RTYN EQU 10 ; disk io retries SEEKRT EQU 1 ; rate 0=3ms, 1=6ms, 2=10ms, 3=20ms CDISK EQU 4 ; last disk segen END B ; JRNZ BOOTERROR DCR D ; one less blockr if mini JZ goloader ; exit when zero else jz loader endif INR E6#>6#>NP%>N £!!>  ::=>22zMl> :lw# ; default dma buffer ORG 0 ; ; WBOOT: MVI A,01101111B OUT 16H lda nsects mov d,a lxi h,100h if mini mvie Sided (S,D) :$h SʲDU>2>2 Insert diskette into drive $ :A_: and press the Return lected by the ccp BELL EQU 07 ; ding MAXDSK EQU 1 ; largest disk number MONIT EQU 0F033H ; monitor boot error entry poi progra an th receivin compute othe tha tha i shoul b read t receiv dat vi th mo mvi a,26+1 CMP E JRNZ RBLK1 BOOTERROR: SDED SECTORS MVI A,01001111B OUT 16H LDA CMDSTATUS JMP MONIT if  < Disk Formatting Error Disk drive Status : $  `RƐ'@'_IʋÀ Drive not ready$ e,1 ;start with sector 1 for mini else mvi e,2 endif RBLK1: if mini lxi b,dal else LXI B,8000H+DAL ; endif MOkey $   $ :> W2!>(6#>6#r#:w#s#6#6#> 6#>nt if mini loader equ 180h else loader equ 100h endif cmdstatus equ 100h-4 sectors equ 100h-2 ; CMD EQU 0CH ; fdc c12 SBC Z80 SUPER QUAD DOUBLE / SINGLE $ d DENSITY FORMAT PROGRAM vs 2.0$= >2à Enter Denmini goloader: lxi H,loader lxi D,100h ;move loader from 180h to 100h for mini lxi B,1000h ;largest loader could be n l@lî Disk is write protected$ l:2 >P:V A,E ; get sector OUT SECMD ; set sector MVI A,088H ; get operation OUT CMD NOP READLOOP: IN WAIT ; wait f{=•:•+:w#6#>{S> ¨!!>  :z:l> :Gzl72:ommand & fdc status register TK EQU CMD+1 ; fdc track register SECMD EQU CMD+2 ; fdc sector register DAL EQU CMD+3 ; fsity, Single or Double (S,D) :$t D´ûS¹>N2 Enter Disk Drive to be Formatted (A,B,C,D) :$ >2/ TO EQU 1 ;6MS STEP ORG 100H ; START: LXI SP,START PRINT PRINT IF MINI PRINT ENDIF COMPLT: E ZERO SLOOP2: MVI E,1 ;SECTOR LXI H,BUFF ;DMA BUFFER ; IF NOT MINI MVI A,0FFH MVI B,SGAP4F CALL PUT XRA A MVSingle or Double Sided (S,D) :'> CALL IMPC CPI 'S' JZ DOIT1 CPI 'D' JNZ DOIT MVI A,CODEQ STA CODE2 MVI A,1  ei POP D IN CMD ;GET STATUS ORA A ;TEST JNZ ERROR LDA DENS ORA A JZ START2 INR D MOV A,D OUT DAL ;T MVI A,0FFH ;INIZ SYSTEM FLAG TO NOT STA FLAG ;SYSTEM CALL I ORA D ;MAKE SURE TRACK 0 JNZ NO1 LDA DENS ORA A JNZ NOTDD DCX H LDA CODE2 ;DENSITY CODE MOV M,A INX H NOTD IF MINI MVI A,CODE1 STA CODE2 ; set allways double density XRA A ELSE ; 8 inch drives MVI A,0E5H ;INIZ CI B,6 CALL PUT MVI M,0FCH INX H ; ENDIF ; MVI B,SGAP1F ;GAP 1 MVI A,0FFH CALL PUT IF MINI MVI B,SGA1F6 MVI ASTA DBLFL DOIT1: PRINT LDA DISKNO ADI 41H CHAROUT PRINT <': and press the ReTELL 1791 LDA DENS CMP D ;DENS IS 77+1 OR 0 JZ COMPLT ;IF D=78 AND DENS = 78 THEN DONE MVI A,SEEK di OUT CMD INMPC ;GET ANSWER SUI 'A' JC QUIT CPI 4 JNC QUIT ; START1: MOV C,A STA DISKNO ;SAVE DRIVE NUMBER SYSTK: PRINT <D: NO1: MVI M,0F7H INX H MVI A,0FFH MVI B,SGAP1F CALL PUT IF MINI MVI A,0F6H MVI B,SGA1F6 CALL PUT ENDIF ODE2 TO ISNT CODEQ STA CODE2 PRINT CALL IMPC ;GET CHAR CPI 'D' ,0F6H CALL PUT ENDIF SLOOP: XRA A MVI B,SGAP20 CALL PUT MVI M,0FEH INX H MOV M,D ;TRACK INX H LDA SIDE Mturn key '> CHARIN CPI 0DH JNZ 0 ; exit if not return PRINT LDA DISKNO OUT WAIT ;SELECT DISK & SET SINGLE D WAIT ;WAIT FOR END OF SEEK ei ; ;SEE IF LAST TRACK ; LDA FLAG MOV B,A MOV A,D ;GET TRACK SUI 2 ORA B ;IF D=2CR,LF,'Format System Tracks only ? (Y,N) :'> CALL IMPC CPI 'N' JZ DOIT CPI 'Y' JNZ SYSTK XRA A STA FLAG DOITINR E MOV A,E CPI SSECT+1 ;MAX SINGLE DENSITY SECTORS PER TRACK JNZ SLOOP MVI C,3 SLOOP3: MVI B,0 MVI A,0FFH CALL ;IS DOUBLE ? JNZ CKSINGL ;IF NOT SEE IF SINGLE ; ; XRA A ;SET DENS TO 0 FOR DOUBLE DENSITY JMP SETUP1 CKSINGL: OV M,A ;SET SIDE INX H MOV M,E INX H MVI M,0 INX H MVI M,0F7H INX H MVI A,0FFH MVI B,11 CALL PUT MVI B,6 0  AND FLAG = 0 THEN ;DONE WITH SD SYSTEM JZ COMPLT JMP SLOOP2 ENDIF ; NOT MINI ; ; DOUBLE DENSITY FORMAT ROUTINE ;  INX H MVI A,4EH MVI B,GAP3 CALL PUT JMP LOOP NEXTTK: MVI C,3 LOOP3: MVI B,0 MVI A,4EH CALL PUT DCR C JNZ DA SIDE MOV M,A ;SET SIDE INX H MOV M,E INX H MVI M,3 INX H MVI M,0F7H INX H MVI A,4EH MVI B,22 CALL PUT write protected'> JMP COMPLT QUIT: LDA 4 ;SELECT DRIVE 0 HEAD 0 ANI 03H OUT WAIT ;DO IT JMP WBOOT ;GO BACK TO CPM  0 JNZ INTERL JMP INTER2 INTER1: MOV A,D ;SEE IF TRACK 1 CPI 0 JNZ INTERL ;IF NOT TK 0 THEN DO INTERLEAVE ; ; ; i OUT CMD IN WAIT ei LDA FLAG ;TEST ALL DISK? ORA A JZ COMPLT JMP LOOP2 PUT: MOV M,A INX H DCR B JNZ PUT  START2: XRA A STA SIDE if mini mvi d,0ffh ;fake so double density starts at track 0 jp was12 endif LDA DBLFL ORLOOP3 PUSH D LXI H,BUFF XCHG ;PUT IN D,E LXI H,WLOOP MVI A,WTRACK di OUT CMD ; CALL WLOOP POP D IN CMD ;G MVI B,12 XRA A CALL PUT MVI A,0F5H MVI B,3 CALL PUT MVI M,0FBH INX H MVI A,0E5H MVI B,0 CALL PUT ;DATA 10 IMPC: ;INPUT A CHAR. FROM THE CONSOLE XRA A STA IBUFF+2 INPUT IBUFF,80 LDA IBUFF+2 RET ; ; WLOOP: IN WAIT ORANON INTERLEAVE SECTOR CALCULATION ; INTER2: INR E MOV A,E CPI SECNT+1 JMP NEXTSE ; ; INTERLEAVE SECTOR CALCULATION  RET PUTZERO: MVI B,PRE0 XRA A CALL PUT RET ERROR: PUSH PSW PRINT POP PSW PUSH PSW HEXOUT ;PRINT ERROR STATUS POP PSW PUSH PSW ANI 80H JZ ERROR1 POP PSW PRINTWAIT ; SELECT DRIVE, DENSITY & HEAD MVI E,0 ;RESET SECTOR COUNTER LXI H,TABLE ;RESET POINTER SHLD PTR ;RESET TABLE PO;GET SIDE NUMBER DCR A ;TEST SIDE JZ WAS12 MVI A,1 ;DO SIDE 1 STA SIDE ;DO OTHER SIDE JMP LOOP2 WAS12: ;DO NEXxi D,0fc7fh dad D ;put code byte at end of 1st 128 bytes LDA CODE2 MOV M,A pop D pop H MN0S1: ENDIF MVI M,0F7H BLFL: DB 0 DISKNO: DB 0 ;DISK NUMBER SIDE: DB 0 ;SIDE OF DISK SIDENO: DB 0 ;SET TO 1 IFF B COMMAND IS ENTERED CODE2: DB 0ET FLAGS NEXTSE: JZ NEXTTK CALL PUTZERO MVI A,0F5H MVI B,3 CALL PUT MVI M,0FEH INX H MOV M,D ;TRACK INX H L JMP COMPLT ERROR1: POP PSW ANI 40H ;SEE IF WRITE PROTECT JZ COMPLT PRINT MO fro th drive. Multifil transfer ma onl b don fro th menu I ma no b sp Failur t us th 'WRT comman result i los o al dat an fil o lengt zero. DTh sende enter SB B:*.CO t sen al th CO file o dis B Als specifie wa retur t termina n dat wil b save sinc fil ma no b name wit 'RET' Us th 'RET comman t RE-ENTE Termina mod  Th Termina mod ha bee greatl expande a describe above Th "R an "S command mus bDE ). DIҠ - Th 'DIR comman list th director o CP/͠ disk driv ma b specifie (ieecifie whe th MODE progra i called I othe word A>MODE͠ SA *.CO wil resul i a INVALIĠ OPTIO E̠ - Th 'DEL comman erase th mos recen fil accesse i Termina mode Usefu i yo decid afte co mod whe done. Th receive enter R t receiv al th file bein sen oafte i ha firs bee entere wit th 'T option I thi i done yo wil stil b abl  calle wit filenam o yo wil b require t ente th primar comman ( o R an th  DI B: o th defaul driv wil b listed Afte th director i listed th men wil no erro message. Return to Menu - 'M' option When asked to select an option, 'M' returmmunication tha yo don' wan t sav informatio jus gathered. CPM - The 'CPM' command reboots an th defaul drive. Th sende enter th comman S ASM.CO *.HE B:M*. whic wil sen ASM.Ct sav th communication i yo wer doin s befor yo exitte th termina mode. WR - Th 'WRT 6  b printe whethe XP mod i o o off I XP mod i o an yo wis t se th menu hi return.  RB A: Termina mode sav communicatio i file (i termina mus  S fn.ft Receiv fil o drive vie wha i bein received retur  | | | |7____________________________________7| | \----------/  B - multi-file mode for sending and receiving files T - return to terminal mode after transfer (memory saus b connecte t th other receiv dat line. EXAMPLE: pins  LISTING OF COMMANDS AND OPTIONS Primary options S - send a CP/M file (must specify file/s)  typ CTRL- t star save i men mus typ "WRT t clos file.) t termina mod RRT B:fn.ft Sen al CO files n message o  \----------/ ve off) R - view what is received in file transfer S - view what is being sent in file transfe pins /----------\ RS-232 CABLE /----------\ | |2_________ R - receive a CP/M file (must name file unless B sec opt used) T - terminal mode (specify fil T fn.ft COMPUTER TO COMPUTER TRANSFERS T us thi progra fo transfe o file betwee twconsole SBQ *.COM Send two files from two different drives  Regenerating the SUPERBIOS for a different memory size Th SUPERBIO normall reside i 62 CP/ syste wit 6r V - view what is being sent or received in file transfer T - Terminal mode (used with remote___________________________3| | | Computer | | Computer | e if memory save wanted) E - terminal mode with echo M - return to menu X - u compu- ter tha eac ar runnin thi progra an ar directl connecte togethe b a RS-2 SB A:fn1.ft1 B:fn2.ft2 Receive files being sent by above on drive A  ˠ o RAM Th extr 2 come fro th fac tha th BIOӠ i relatively large and includes a 1Kbyte deblocking buffer.ly controlled computer) EXAMPLES (fn = filename, ft = filetype) Send another file  | # 1 |3____________________________________2| # 2 | | | sed only when program is called to initially toggle menu off Secondary options 3 seria lin i i necessar t b careful i connectin them Eac computer' sen dat lin m7  1) Assemble SUPRBIOS.MAC with M80 (Microsoft Macro-80). 2 Determin th lin addres fo th BIOS Th standaN WAIT ei LDA FLAG ;TEST ALL DISK? ORA A JZ COMPLT JMP LOOP2 PUT: MOV M,A INX H DCR B JNZ PUT RET PUTZERO: load at 1700. Load address = EA00H, offset =1700H-EA00H = 2E00H -ISUPRBIOS.HEX -R2E00 .pa Mak sur yo rea floppy sinc disk o differen densit hav th CPM.SY fil i differen places an changin dis density makes  L8 SUPRBIOS[P:EA00],SUPRBIOS/N/X/E 4 Creat relocate CP/ usin patche MOVCP͠ a pe Digital Research n loa th syste fil int memor startin a som buffe locatio (normall 2000H) Th loade the determine r SUPERBIO i org' a F200H Calculat you highes RA addres availabl t th SUPERBIO an subtrac E00 t ge SUPRBIOS loader operation Th SUPERBIO make us o syste fil loade t brin th syste int th BIO i correctl - 1700 shoul b th BIO jum table. -G0 A>ERA CPM.SYS A>SAV 3 CPM.SY (I yo a warm boot impossible. Th LDRGE progra i th equivalen t SYSGE i standar system I transfer th oute ote. MOVCPM 60 * SAVE 34 CPM60.COM 5) Integrate the new BIOS and CP/M into the CPM.SYS file. DDT CPM60.COM NEXTth loa addres o th CP/ syste an blockmove i t tha address Th loade als fill i tabl i th SUPERBIO th lin address Example syste ha 2 memory-mappe vide boar residing at F800H-FFFFH. F800h-E00H = EA00H fo memor o col boot Th loade i allowe t b maximu o C80 byte long I th standar implementation th loahav modifie th BIO yo mus sav howeve man page ar necessar t includ th BIO i th .SY file Ther ar 2 ptrac onl fro th sourc dis t th destination Afte runnin LDRGEN yo mus transfe valid CPM.SYS file to the PC 2300 0100 -M980,1F7F,10 (Mov th CC an BDOӠ t 100Ƞ) if using an offset .COM file (bet whic contain ma o wher o th dis th fil CPM.SY i located Thi informatio i necessar s tha th SUPERr the SUPERBIOS. 3 Us Microsoft-compatibl linke (LINK L80 LINKMT etc t lin SUPRBIOS.REL LIN wil generde look fo th fil CPM.SY o flopp driv (tha is tha driv whic repond t th physica lin Driv Selec ages to the CCP and BDOS portions of CPM.SYS) Th ne dis shoul b bootabl i i ha ha th loade SYSGEN' on it.  disk for it to be bootable. Customizing the loader: Th loade i .CO fil whic execute a 100H I yo ter alternative!) -ISUPRBIOS.COM -R1600 i usin .HE fil (bes t avoid calculat th offse t mak the .HEX fileBIO ca reloa th CC an BDO o war boot Tha i wh yo mus no chang densit o th syste dis i i i at a offse .CO͠ file while with L80 you get a .HEX file. LINK: L80: LIN SUPRBIOS[LEA00 ) I th fil i no present th loade wil respon wit a erro messag t th terminal Otherwise th loade wil8  wis t boo of dis othe tha flopp drive yo mus integrat customize BIO fo th loader Th BIO i ornformation: FORMAT.DOC for detailed information on the disk format. CPMINSTA.DOà fo installatio o th syste .pa Operation of the SUPERBIOS: Th SUPERBIO behave i genera a an norma CP/ system However yo mus  loagica functio o th loade i findin fil o th defaul dis ca b use t suppor loadin o syste file fronee refomatting) Plac you syste dis i A an th destinatio disk in B:. Run LDRGEN from A to B. Ug' a 500Ƞ wit standar BIO jum table an mus suppor consol outpu an al dis function excep writ (fo th fo user wh already own CP/M. NEWSIZE.DOà t regenerat th syste fo differen memor size. INTRFAno chang densit o disk withou doin control-C Thi i becaus th SUPERBIO check onl onc afte each warm bo boo volum t volatil syste volum (e.g memor disk) Modif th loade s tha afte th syste i loade an bs PIР t transfe th fil CPM.SY fro t B Fo optimu performance CPM.SY shoul b th firs fil yo writ  singl boo disk). Sinc th loade i .CO file yo ca debu i b runnin th loade a norma transienCE.DOC for information on modifying the BIOS. Generating a new system disk: Assumin yo alread hav bootabl syot to see what density each disk is. I general yo ma chang syste disk a an tim provided: 1) Thlockmoved th coldboo routin return t th loader The rea th syste fil fro th boo volum an writ the t an syste disk Thi i becaus th syste mus acces thi fil o eac war boo (control-C) an th acces i muc progra unde you debugger Whe th custo loade i debugged i ca b LDRGEN' ont dis b passing the fileste disk eithe b purchas o CP/ fro Advance Micr Digita o b followin th steps outlined in CPMINSTA.DOC-  Welcome to the SUPERBIOS Thi i onl a introduction Se th followin file fo additional ie system disks are the same density. 2) CPM.SYS is the first file on each disk. I yo wis t chang densit o t th syste dis usin BDO calls.  faste i th fil i o th outermos track o th dis (file ar writen to a new disk from the outer tracks in). name as a command parameter to LDRGEN: LDRGEN B:CUSTMLDR.COM Th loade sourc i include fo you use Th Us FORMAT.CO t forma blan dis i th desire forma (Standar eigh inc singl densit disk generall don' 9  syste disk yo mus reboot the system (push the reset button and type control-C). Printer Selection: Th S disk fro othe system ma no b readabl a firs wit th SUPERBIOS Thi i becaus the hav od byte locath fac tha ther i n roo i th BIOӠ fo th allocatio vecto necessar fo fou doubl side disks I yo neentries fou lis entries on reader an on punch tabl entr consist o tw bytes Th firs byt i th hig ord LST:=CRT wil selec th alternate printer, STAT LST:=TTY: restores the default. NOTICE: A shipped th SUPRERBIOS internal interface specifications Th SUPERBIO i modular tabl drive progra designe UPERBIOӠ contain cod t driv bot th paralle printe interfac an th seria interfac a th CP/͠ lis deve wher th doubl densit cod i suppose t be Th SUPERBIO interpret eithe 0 o E t b singl density an t ru fou drives o whic mor ths tw ar doubl sided yo wil hav t chang th SUPERBIO Allocatio Vectoe byt o th addres o th devic handler Th handle module alway star o pag boundary s thi byt i suffici SUPERBIO ca suppor eigh inc doubl side doubl densit drive o th firs tw drive an ) I th thirfor easy expansion and modification. Th firs tw memor page o th SUPERBIOӠ perfor mappin fro logicaice Th distributio versio ha th paralle printe a th default Th defaul printe ca b change b patchin th byythin els (othe tha th SUPERBIOӠ doubl densit codes causin a error I yo ar unabl t rea supposedl t th sam siz a vecto 0 an generat 61K CP/M by the procedure outlined in NEWSIZE.DOC. en t specif th addres o al th routine i th handler Th secon byt i devic numbe withi th handler  driv driv i als doubl side doubl density the yo canno ru fourt drive I th thir driv i si unit t physica drivers Thi par o th program will not normally need to be changed. Th logica t physica dt i CPM.SY wit DDT (byt 1829 - se t fo parallel fo serial). Th syste display th defaul print standar singl densit disk tr runnin th SUPERBIOӠ forma progra wit th FORMAԠ SYSTE͠ TRACKӠ ONL optiita forma progra fill al sector wit E5' i accordanc with standard practice. Som eigh inc singl densit Fo example har dis formatte a tw logica drive woul b addresse b tw tabl entries bot wit th sam addrengl side doubl density the yo ca ru fourt driv if it is also single sided. Thi limitatio come fro tevic assignmen tabl i a 100 relativ t th star o th BIOS I contain sixtee dis entries fou consol ee o col boot Th printe ma b change a an tim t th alternat b changin th iobyt a locatio 3 STAon Thi wil fil th oute tw track wit E an no hur any of the data. Th SUPERBIO doubl densit forma fo: s bu with two device numbers (0 and 1, usually). Thi mappin syste make i possibl t reconfigur th sysfirs cal t selec give dis afte war boot bi o wil b set I th selec i successfu (know b th sesector table+0F jp write sector table+12H jp flush buffers Eac routin excep flus receive th nore th valu a fixe locatio (F an F relativ t th star o th BIOS) You rea an writ routine wil hav t 0F eight character ASCII name for module Th routine receiv exactl th sam paramter a describe i th Cis wheneve dis i differen modul i selected Thi i sig tha an share buffer mus b flushed Flus tem without having to reassemble the BIOS. Drive module com i tw flavors characte i/ handler (console anlec routin returnin nonzer valu i HL) th bi wil b reset an bi 7 of A will be reset until the next warm boorma parameter passe accordin t th CP/ Alteratio guide Th writ routin wil receiv th deblockin inforge th DM address from this location before each operation. .pa Interrupt handlers: A th moment th SUPERBIOP/͠ Alteratio Guide I addition eac routin receive th devic numbe i A Th routine wil retur t thshoul retur i i th flus wa successful nonzer i a erro occured I flush returns an error code, the new  lis devices an dis handlers Eac handle module starts on a page boundary with a jump table. Character handlert. Selec als receive paramete i B i zer o entr t selec i th las dis succesfull selecte wa imatio i describe i th appendi o secto blocking/deblocking (Se als th cod fo rea an writ i th flopp doe no hav an interrupt- drive code However futur release wil us interrupt fo typeahead har dis controleir caller whatever the normal code for CP/M 2 would be. .pa Disk Handlers: The jump table is : table+0 jp disk select will be denied. DMA address handling: Unde certai conditions th BDO wil issu selec dis cas: The jump table is : table+0 jp poll console character in table+3 jp console character input ta th sam modul a th ne dis bein selected Thi informatio ma b useful in determining buffer flushing strategi modul o th SUPERBIOS) Th device number is passed in A. Selec dis receive tw addtiona paramters O th ler an possibl othe use a well Th us o th Z8 alternat registe se i reserve fo syste us ONLY Thi wil home table+3 jp select disk table+6 jp set track table+9 jp set sector table+0C jp read l t ne disk an expec th previou DM addres t remai i force Therefore th Se DM addres BIO cal simpl stoble+6 jp console character output table+9 jp list character output table+0C jp list status table+es. Th flus entr poin i use b th logica dis selec handler Flus i calle o th currentl selecte d;  enabl improve performanc i a interrupt- drive enviromen sinc contex switchin wil b堠 fast ThereforeBIO ca reloa th CC an BDO o war boot Tha i wh yo mus no chang densit o th syste dis i i i  as is. ffsets density equ 0 ;0=single, 1=single side double D, 2= 2S2D seekrt equ 1 ;seek rate 0=3ms, 1=6ms, 2=10ms, 3=15ms ;t th FDC durin see an secto read/write Interrupt canno b enable durin th secto read/write bu th see  piobd equ 5 ; " " B data piobc equ 7 ; " " " control memry equ 16h ;memory control port ; sector deblocki w recommen tha an modification yo mak t th cod d no us th alternat registers excep i you interrup han.z80 true equ 0ffffh false equ 0 mini equ false ;true for minifloppy BIOS special equ false ;true for 8"-5" special boar loa th syste fil int memor startin a som buffe locatio (normall 2000H) Th loade the determine hese times double for minifloppies pspt equ 2 ;physical sectors per track (one side) drvtrk equ 3 ;track a floppy is at parca b rewritte t b polle i yo nee th CPՠ t sampl interrupt durin th see period realtim cloc usin ng equates hstcnt equ 8 ;number of sectors in buffer hstshft equ 3 ;shift factor for # of sectors in buffer if mini ddpdlers. Ver fe CP/ program us th alternat registe set I yo us on o thos tha does w sugges yo d m48tpi equ false ;true for 48tpi mini drives m96tpi equ false ;true for 96tpi mini drives ; board hardware equates cmdth loa addres o th CP/ syste an blockmove i t tha address Th loade als fill i tabl i th SUPERBIOmlen equ 4 ;length of the parameter block ; miscellaneous equates iobyte equ 3 ;used to select various consoles and printers6 H interrup wi los tim durin dis access bu H clock should be OK. Example SUPERBIOS module: Thspt equ 4 ;double density physical sectors per track if m48tpi tracks equ 39 ;minifloppies else tracks equ 76 ;96tpi drivinclud fla byt t indicat t you interrup handler tha they mus sav registers Thi wil b include i th equ 0ch ;fdc command register trk equ cmd+1 ;track register sec equ cmd+2 ;sector register data equ cmd+3 ;data register whic contain ma o wher o th dis th fil CPM.SY i located Thi informatio i necessar s tha th SUPER cdisk equ 4 ;default disk user number retries equ 10 ;retry count for disk operations page 60 ;-------------------------- fil RAMDISK.MA i include a a exampl o modula dis driver I show th us o th dis calls an ca b use es endif else ddpspt equ 8 ;eight inch tracks equ 76 endif dpblen equ 15 ;length of a DPB ; disk hardware parameter o nex releas o th SUPERBIOS. Th SUPERBIO disable interrupt whe th CP i waitin o a INTR o DR fro wait equ 14h ;INTRQ and DRQ synch port (see manual) pioad equ 4 ;PIO channel A data pioac equ 6 ; " " " control < ---------------------------------------------- ; This is the seek rate constant!! seekrt, above, is an offset! seekrate equ lush vector call dskjmp ;flush current drive pop DE pop BC or A jr nz,badsel ;error in flushing disk inc A ;make ner modules have been selected frstime:: ld D,3 jr dskjmp ;if same disk then do normal select for DPH chgdsk:: ld DE,drvtb,(curdsk) ;current logical drive getvec:: ld HL,drvtbl dskcon:: add A,A ld E,A ld A,D ;low order byte of vector supplied CP and BDOS reside on disk ccpstart:: dw start-1600h ;CP/M boot address bdosjmp:: dw start-0dfah ;BDOS jump bootbl:: dranslate table in DE ; no translation if DE=0 ; ; Returns physical sector in HL ; Note:: only used in single density 1 ;6ms for 8", 12ms for 5" ;seek rate 0=3ms, 1=6ms, 2=10ms, 3=15ms ;these times double for minifloppies ; ; BIOS on-zero to indicate a new disk module ld H,B ;module address page samemod:: ld B,A ;B=0 if last disk in same module ld l ;drvtbl is always on 256 byte boundary add A,A ld E,A ld A,(DE) ;driver module for current disk ld B,A ld A,C add ld D,0 add HL,DE ld D,(HL) ;high order byte of jump vector inc HL ld E,A ;vector lsb ld A,(HL) ;driver number es 16 ;space for four entries page ; ; Seldsk selects the logical disk in C (0-15) ; Seldsk will flush the previous disk if  sectran:: ld A,D or E ld L,C ld H,B ret z ;no sector translation ex DE,HL add HL,BC ld L,(HL) ld H,0 retjump table start:: jp coldboot wboota:: jp wboot jp const jp conin jp conout jp list jp punch jp reader jp home L,3 ;seldsk offset push BC inc DE ;(DE) = driver number ld A,(DE) push DE call jphl ;do select pop DE pop BC  A,A ld E,A ;address of new disk driver page ld A,(DE) ;driver module for new disk or A jr Z,badsel ;new disk not instx DE,HL jphl:: jp (HL) ;go to driver curdsk:: db 0 ;currently selcted logical drive page ; Console/list vectors const::it is in a different driver ; module than the new disk. Seldsk also returns an error if the ; selected disk has not had a dri setdma:: ld (iodma),BC ;shared among all drivers ret page home:: ld D,0 jr dskjmp settrk:: ld D,6 jr dskjmp  jp seldsk jp settrk jp setsec jp setdma jp read jp write jp listst jp sectran ; ; warm boot table ; filled ld A,H or L ret z ;bad select from driver ld A,(DE) ;driver number and 7fh ;reset first time flag ld (DE),A ld A,alled ld H,A sub B jr z,samemod ;different disk but same module, don't flush ld B,H push BC push DE ld D,12h ;f ld D,0 jr conjmp conin:: ld D,3 jr conjmp conout:: ld D,6 jr conjmp list:: ld D,9 jr lstjmp listst:: ld D,0ver installed seldsk:: ld A,(curdsk) cp C jr nz,chgdsk ;selecting a disk different from the current ld B,0 ;no othsetsec:: ld D,9 jr dskjmp read:: ld D,0ch jr dskjmp write:: ld D,0fh dskjmp:: ;go to correct disk routine ld Ain by CPMLDR ; ; contains entries of form dw track, db first sector, db last sector ; it is a map of where the image of the CC ;succesfully selected disk ld (curdsk),A ret badsel:: ld HL,0 ret ; ; Sectran input:: Logical sector in BC, t= ch lstjmp:: ld A,(iobyte) and 11000000b ;get list field rlca rlca ;make 0-3 ld HL,lsttbl jr dskcon conjmp::  ld C,(HL) inc HL ld B,(HL) ;BC=track inc HL push HL ld A,B or C jr z,bootdone ;last track done call settrkotbl to be a list of items of ; ; track (dw), first sector(db), last sector(db) ; wboot:: ld SP,100 ;use default buffer  ;reset all drives but A:: to not logged unlog:: set 7,(HL) inc HL inc HL djnz unlog ld HL,(ccpstart) ld A,(cdisk) oppy page dw fpy ;default floppies 0-3 dw fpy+81h dw fpy+82h db 83h ds 23d ;space for drives E::-P:: contbl equadd HL,DE ;update DMA push BC push HL ld B,0 ;C=sector to read (<256) ld DE,(bootxlt) call sectran ld C,L ld B ;get jump for console drivers ld A,(iobyte) and 00000011b ;get console field ld HL,contbl jr dskcon reader:: ld  pop HL ;boottbl pointer ld C,(HL) ;first sector dec C ;will be incremented before setsec inc HL ld B,(HL) ;lald C,0 ;drive A:: call seldsk ;select drive A:: ld A,H or L jp z,booterr ;bad select ld E,(HL) inc HL ld D ld C,A jp (HL) ;go to CP/M bootptr:: dw bootbl ;initial track value bootxlt:: dw 0 ;boot disk sector translate t $+1 dw cpu dw cpu ;default=serial 0 db 1 ;alternate=serial 1 ds 3 ;space for two more console drivers lsttbl,H call setsec call read or A jr nz,booterr ;physical read error jr nxtsec bootdone:: ;CP/M read from disk, seA,(rdrtbl) ;reader driver jr gordr punch:: ld A,(puntbl) gordr:: or A ret z ld H,A ld L,0 jp (HL) page ;----st sector inc HL ld (bootptr),HL ;save pointer pop HL ;DMA pop DE ;old sectors push BC ;new sectors push HL ,(HL) ;DE=sector translate from DPH ld (bootxlt),DE ld HL,(ccpstart) ;start of CCP-starting DMA nxttrk:: push HL ;unable page booterr:: ld DE,badbootmsg call pmsg halt ;must reset system badbootmsg:: db 'Warm boot error-reset syst equ $+1 dw cpu dw cpu+2 ;default=parallel db 1 ;alternate=serial 1 ds 4 rdrtbl:: db 0 ;no reader installed put low memory ld HL,(bdosjmp) ld (6),HL ;normal BDOS jump ld HL,wboota ld (1),HL ;warm boot jump ld A,0c3h ;'JP' ------------------------------------------------------------------- ; ; Hardware configuration table ; org 100h-2 iodma:: d ;DMA page nxtsec:: pop HL ;DMA push HL ld B,H ld C,L ;move to BC call setdma pop HL ;last DMA pop BC ;secitialized data-sector count push HL ;current DMA ;read sectors of next track ld HL,(bootptr) ;point to bootbl entryem' crlf:: db 0dh,0ah,'$' page cpuio equ (($-start-1)/256)+1 ; ; Console/list drivers ; All have entry A=driver numbntbl:: db 0 ;no punch installed page ; ; Wboot reads in the CCP and BDOS from the CPM.SYS file ; CPMLDR initializes the bointruction ld (0),A ld (5),A ld HL,bootbl ld (bootptr),HL ;reset pointer for next warm boot ld HL,drvtbl+3 ld b,15db 80h ;this is the low order byte ;of the 80h default drvtbl equ $+1 ;logical drive assignment dw fpy ;fltor data ld A,B ;last sector to read inc C ;read next sector cp C jr c,nxttrk ;done with last sector ld DE,128 > er, other parameters per CP/M ; A=0 serial port 0; A=1 serial port 1; A=2 parallel (list only) org cpuio*256 cpu:: ;stand;test busy bit ret z ;printer busy ld A,0ffh ret ;printer not busy plist:: ;parallel printer driver call polplich to get current value of BUSY out (C),A in A,(C) and 0ch cp 0ch ld A,0ffh ret z cpl ret page polplist:: ngle sided double density else db 0 ;density - 0=single D; 1=1 side, Double D; 2= 2S 2D endif db seekrate ;seek rate - 0=3bit ret serout:: ld B,C ;character to output add A,A inc A ld C,A serst:: in A,(C) and 4 jr z,serst dec C rra rra rra call hex1 pop AF hex1:: and 0fh add A,90h daa adc A,40h daa ld C,A jp conout fpyio equ (($-sard console/list routines for CPU serial ports jp pserin ; jp serin ;these three go direct to serial jp serout ; jp lst or A jr z,plist ld A,C out (pioad),A ;character on PIO A channel ld A,80h out (piobd),A ;strobe printer xor A ;parallel printer driver poll ld A,(frstpar) ;first time parallel called? or A jr z,noinit ;no, interface already initialims, 1=6ms, 2=10ms, 3=15ms if (mini and not special) db ddpspt else db 26 ;physical sectors per track - 26 in SD, ddpspt inout (C),B ret page ; these are the drivers modified for use with the printer lstout:: cp 2 ;parallel? jr z,plist ld Btart-1)/256)+1 ;make line up on page boundary ; ; Floppy disk drive driver module ; org fpyio*256 fpy:: ; floppy driver justout jp pollst db 'SBCIO ' ;module name for display pserin:: ;poll serial in-return A=0ff if char ready, else 0  out (piobd),A ;reset strobe ret frstpar:: db 0fh ;first initialization code for parallel ;printer-flag that PIO has zed out (pioac),A ;set channel A to output ld A,0cfh out (piobc),A ;set channel B to bit mode ld A,00011111b ;bit 7-5 ou DD endif db 0 ;track drive currently set at endm page ; ; CP/M disk tables fDPHbase:: dw trans,0,0,0 dw dirbuf,fd,A ;must be serial ld E,C lstout1:: call plserout or A ld A,B jr z,lstout1 dec C out (C),E ret pollst:: cp 2mp table jp fhome jp fseldsk jp fsettrk jp fsetsec jp fread jp fwrite jp fflush db 'FLOPPY ' ;module name for displayadd A,A inc A ;A=command port ld C,A in A,(C) and 1 ret z ;no character waiting ld A,0ffh ret serin:: ld not been initialized page ; miscellaneous character i/o routines pmsg:: ;equivalent to BDOS function 9 (print) ld A,(DEtput, 4-0 input out (piobc),A xor A out (piobd),A ld (frstpar),A ;reset first time flag noinit:: in A,(piobd) and 1 pbase dw chk00,all00 dw trans,0,0,0 dw dirbuf,fdpbase dw chk01,all01 dw trans,0,0,0 dw dirbuf,fdpbase dw chk02 jr z,polplist plserout:: add A,A ;serial out poll for printer-check busy line inc A ld C,A ld A,10h ;reset DART lat purposes dskparm:: ;disk hardware parameter block ;one block for each drive rept 4 if (mini and not special) db 1 ;siB,A call pserin ld A,B jr z,serin ;loop until character received add A,A ld C,A in A,(C) and 7fh ;mask high order ) cp '$' ret z ld C,A inc DE push DE call conout pop DE jr pmsg phex:: ;print A in hex push AF rra ? ,all02 dw trans,0,0,0 dw dirbuf,fdpbase dw chk03,all03 ; ; DPB's for the three formats of disk:: ; ; 8" Single sid ld A,B ;zero if last selected was floppy cp 128 ;first select after cold boot? jr nz,notfirst ld C,B ;make density  0c0h else db 0f0h endif db 0 dw 32 dw 1 page trans:: ;single density translate table db 1,7,13,19,25,5,11,17,2page ; ; Seldrv selects the drive from (curfpy), head from (head) ; (bit 0 set for head1), and density from (IX+density) ; idpb:: ;single sided double density dw 8*ddpspt ;128 byte sectors per track db 4 db 0fh db 0 dw (tracks*ddpspt/2)-1 or A ld (HL),A inc HL ld (HL),A jr putdpb setran:: ld DE,trans ;single density translate table ld (HL),E inc HL ed, single density ; 5" Single sided, double density ; 5" Double sided, double density ; fdpbase:: sssddpb:: ;single denscheck on drive A:: notfirst:: ld E,C ;save logical disk call getden ;will set density byte if successful or A jr nz,f3,3,9,15,21 ;sectors 1-13 db 2,8,14,20,26,6,12,18,24,4,10,16,22 ;secotrs 14-16 fhome:: ld C,0 fsettrk:: ld A,C ld t assembles the correct byte and outputs to wait ; and updates the track register with the most recent information seldrv::  ;each of 76 tracks has ddpspt/2 2K blocks if mini dw 63 else dw 127 endif if mini db 80h else db 0c0h endifld (HL),D putdpb:: ld DE,9 ;offset of DPB in DPH add HL,DE ld (HL),C inc HL ld (HL),B dec HL dec HL sbc HL,DE ity (1K block) dw 26 ;sectors per track db 3 ;block shift (log2[block size/128]) db 7 ;block mask ([block size/128]-1)badsel ;couldn't get density ;all physical operations OK here ld (hwptr),IX ;store for later use ld A,(IX+density)(iotrk),A ret fsetsec:: ld A,C ld (iosec),A ret page ; ; Fseldsk selects the physical floppy in A (0-3) ; B=0 if  ld A,(IX+density) or A jr z,setdens ld A,00001000b ;set double density bit ld B,A ld A,(head) rlca rlca ;move  db 0 dw 32 dw 1 dsdddpb:: ;double sided double density dw 16*ddpspt ;one track consists of both sides db 4 db  ;restore DPH (carry reset by or A) ret fbadsel:: ld A,(tempfpy) ld (curfpy),A ;restore changes made by getden ld HL,0 db 0 ;extent mask dw 242 ;highest block on disk (numbered from 0) dw 63 ;directory entries-1 db 0c0h ;alloc0 -first inc A ;make 1-3 ld B,A ld HL,fdpbase-dpblen ld DE,dpblen fgetdpb:: add HL,DE djnz fgetdpb ;HL=DPB address last disk selected was a different floppy ; C=logical disk the floppy corresponds to fseldsk:: ld D,A ;physcial floppy head bit to bit 2 or B setdens:: ld B,A ld A,(curfpy) or B out (wait),A ld A,(IX+drvtrk) ;get track from parameter ta0fh db 0 dw (tracks*ddpspt)-1 ;each of 76 tracks has ddpspt 2K blocks if mini dw 127 else dw 255 endif if mini db ret ;return error seldph:: add A,A add A,A add A,A add A,A ld L,A ld H,0 ld DE,fdphbase add HL,DE ret  two bits for two blocks for Dir db 0 ;alloc1 dw 16 ;checked directories dw 2 ;track offset (system tracks) page ssddld C,L ld B,H ld A,(curfpy) call seldph ld A,(IX+density) or A jr z,setran ;single density,set translate vector x@ ble ;this may be first physical i/o out (trk),A ret page ; ; Seek attempts to step the R/W head to the track in (iotflush ;and flush this sector wrtnorm:: ;a block that has been written before call inbuf ;returns C flag set if not ihysical sectors (2K) were ;unallocated ;here we have a sector to write that ;is currently in the host buffe ;save pointer (drive may have changed) ld IX,(blkptr) ;for most recently selected drive ;which is the one to flush l ; write writes the sector to the selected disk fwrite:: ld IX,(hwptr) ;restore IX to parameter block ld A,(IX+density) n+1),A ld A,0ACh ;sector write ld (oper),A jp strtsel ;and do i/o wrtdbl:: call fflush ;flush buffer or A retrk) ; seek:: ld A,retries ld (retryc),A seek2:: ld A,(iotrk) ld C,A ;track stays in C in A,(trk) sub C ret z ;an buffer jr nc,movwrt ;and A to relative sector if in buffer ;not in buffer but might be 2nd 1K of ;an unallocr movwrt:: call mkbufad ;get correct address in buffer ex DE,HL ldir ld A,0ffh ld (wrtpend),A ;write pending cpl d A,0A3h ;second byte of OUTI instruction ld (iotran+1),A ld A,0ACh ;FDC write sector command ld (oper),A ld HL,(iod or A jr z,wrtsngl ld A,2 cp C jr z,unalloc dec A cp C jr z,directry ;directory sector jr wrtnorm unall nz ;return bad sector if hard flush error call sidesec ;set up for new i/o call readprep ;do read to buffer or A rlready there ld A,C out (data),A ld A,(IX+seekrt) ;seek rate mask or 1ch ;seek with verify di out (cmd),A in A,ated 2K data block ld A,(blk2sec) cp D ;iosec jr nz,wrtdbl ;unless first sector of 2nd 1K in ;unallocated data b ;return with no errors ret directry:: ;write to a directory sector ;the disk may be removed after this ;sorvtrk) push HL ld HL,(blkdrvtrk) ld (iodrvtrk),HL ;set drive to select and track ld A,(blksec) call sideflsh ;set upoc:: ;unallocated sector write (no preread) call fflush or A ret nz ;flush error ld A,(iosec) and not(hstcnt-1)et nz ;physical error jr movwrt ;and move new sector from DMA page fflush:: ;flush deblocking buffer to disk ld A,(wait) ei rla jr c,seekerr ;no INTRQ from FDC in A,(cmd) and 10011001b ;seek error, CRC error, or incomplete jr nzlock call inbuf2 ;checks iotrk=blktrk jr c,wrtdbl call fflush ;previously unallocated data or A ret nz jr movw we will make this write immediate call wrtnorm ;do a normal write or A ret nz ;error in previous flush or read jr f head bit and sector for flush call strtsel ;do physical flush pop HL ld (iodrvtrk),HL ;restore selected drive and trac ;get first sector in block ld (blksec),A add A,hstcnt ld (blk2sec),A ;if this is an unallocated block ;then two p(wrtpend) ;do we have a write pending? or A ld A,0ffh ld (bufvalid),A ;buffer data not valid cpl ret z push IX ,seekerr ;seek successful ld (IX+drvtrk),C ret seekerr:: ld E,1ch ;seek command call diskerror jr seek2 pagert ;and write this sector wrtsngl:: ld A,(iosec) ld (psec),A ld A,0A3h ;second byte of OUTI instruction ld (iotraA k pop IX ld (wrtpend),A ;clear flag if no errors ret page ; ; Read reads the sector from the selected disk ; In doub ; the purpose of these manipulations has been ; to set bit 2 of the FDC command if the head ; isn't settled. Bit 2ed on the correct side!) ; and that the bytes in rdwrite for R/W and sector size have been filled diskio:: ld A,retries t p ;no more DRQ iotran:: ini ;start with read ;the second byte of this instruction is patched to ;be either INI o: ld A,(iosec) ld (psec),A ;physical sector same as CP/M sector ;in single density readprep:: ld A,0A2h ;second t-status is saved ld E,A ;save status or B ;B returned from rdwrite is lost bytes count ret z ;if status OK and no lostle density, the sector may already be in the host buffer ; fread:: ld IX,(hwptr) ;restore parameter pointer ld A,(IX+dens will give a 15 ms delay ld E,A ld A,(IX+density) or A ld D,1 ;one sector i/o transfer for single denisty jr z,dmasinld (retryc),A iotry:: ld A,0d0h ;force interrupt no conditions out (cmd),A ld A,(oper) ld B,A ld C,data ;preparer OUTI depending on need jr nz,loop dec D jr nz,rdwrite jr loop ;sector done, wait for INTRQ from fdc ; disk error byte of INI instruction ld (iotran+1),A ;patch rdwrite routine ld A,08ch ;sector read command ld (oper),A page strtse bytes call diskerror call seek or A jr z,iotry ;if nonzero then hopeless seek error ret ; ; rdwrite does the acity) ;density byte or A jr z,rdsngl ;singl density call inbuf jr c,rddbl ;sector not in buffer ; sector is ingl ;use the CP/M DMA buffer in single density ld HL,hstbuf ;use host buffer for double density operations ld D,hstcnt ;numbe for indirect I/O intruction ex (SP),HL ;waste some time ex (SP),HL ex (SP),HL ex (SP),HL di ;no interrupts from hwill eventually have all kinds of nice messages ; diskerror:: ld A,(retryc) dec A jr nz,restore ;more retries to attempl:: call seldrv ;physically select drive and head call seek ;step to correct track ; ; diskio actually reads or writestual transfer to/from the FDC ; HL set to DMA address on entry, D=number of 128 byte units to transfer ; transfer direction ha buffer movrd:: call mkbufad ;HL=start of sector in buffer ldir ret ;transfer done rddbl:: call fflush ;flush prer of 128 byte units to transfer jr strtio dmasingl:: ld HL,(iodma) strtio:: ld A,(psec) out (sec),A ;set physical sectoere to end of transfer in A,(cmd) and 20h ;bit 5=head loaded rrca rrca rrca ;move bit 5 to bit 2 cpl and B t ld A,E cp 1ch ;was it a seek error? jr z,pseekerr cp 0ach ;writing? jr z,pwriterr ld DE,rderr jr perrtyp pw the necessary sector ; it assumes that the head has already settled on the correct track ; (and that the head has been selects been set by poking INI or OUTI instruction rdwrite:: ld B,128 ;bytes in one CP/M sector loop:: in A,(wait) or A revious buffer or A ret nz ;physical error in flush call sidesec call readprep or A ret nz jr movrd rdsngl:r ld A,E out (cmd),A ;start read/write operation call rdwrite ;do the actual i/o in A,(cmd) ei ;now ok to interrupB riterr:: ld DE,wrterr jr perrtyp pseekerr:: ld DE,skerr perrtyp:: call pmsg ld DE,trkerr call pmsg ld A,(iotrk) callvalid data, else 255 rra ret c inbuf2:: ld HL,(iodrvtrk) ;check for 2nd sector ;of unallocated block ld BC,(blkd flush rept hstshft rrca endm ;A=physical sector number, but it may ;be on the second side ld B,(IX+pspt)  shft1 ret page ; ; Getden attempts to find the density of the disk in drive (D) ; by trying to read the current track adget seek rate mask or 00001100b ;head load, restore, verify track 0 out (cmd),A tk0wait:: in A,(cmd) and 00000100b  and not(hstcnt-1) ld (blksec),A ld A,B and hstcnt-1 ld B,A ;B=relative sector in buffer inc B ld HL,hstbuf-128  phex ld DE,secerr call pmsg ld A,(psec) call phex ld DE,siderr call pmsg ld A,(head) call phex pdrv:: ld DE,drvtrk) sbc HL,BC ;same drive and track jr z,rttrk scf ret ;not a match rttrk:: ld A,(blksec) ld B,A ld A,D  cp B ld C,0 jr c,side0 sub B inc C side0:: inc A ld (psec),A ;physical sector on one side ld A,C ld (head),dress in both densities ; If the attempt is successful, Getden will update the ; dens, pspt, and drvtrk fields of the paramter ;at track 0 jr z,tk0wait xor A out (trk),A ;back at track 0 ld (IX+drvtrk),A ;update track table ret page ; ; s ld DE,128 shft2:: add HL,DE djnz shft2 ld BC,128 ;make ready for sector LDIR ld DE,(iodma) xor A ld (bufvalid),A rverr call pmsg ld A,(curfpy) call phex ld DE,crlf call pmsg ld A,255 ret ; ; Restore is called from a disk opersub B ret C ;sector lower # than buffer cp hstcnt ;carry set if in buffer ccf ret ; stores drive, track, sector oA ;set head control byte ret page ; ; inbuf returns carry flag set if sector not in buffer ; also returns (iosec) in D ; table ; If E (logical disk) is zero, then getden assumes the density hasn't ; changed (if it has, then we can't do a warm booidesec is the read/write preparation for double density ; sidesec computes the correct physical sector and side ; sidesec::  ret ; ; returns IX=start of DHPB (disk hardware parameter block) for ; the drive in A (0-3) ; uses B,DE also, returation with A=retries left ; restore:: ld (retryc),A in A,(cmd) and 00010000b ;bit 4=record not found ret z ;try agaf contents of buffer for use by flush ; also saves hardware pointer and sets buffer valid flag ; returns HL=start of sector in if sector is in buffer, returns offset (0 - hstcnt-1) in A ; inbuf:: ld A,(iosec) ld D,A ld A,(bufvalid) ;0 if contains t-table is wrong getden:: ld A,E or A jr z,logdin ;logical drive A:: bit 7,D jr z,logdin ;drive already logged in ld A,(iosec) and not(hstcnt-1) ;computer first CP/M sector in block ld (blksec),A sideflsh:: ;called to set up for ans D=0 getparm:: ld B,A inc B ld IX,dskparm-parmlen ;hardware parameter block ld DE,parmlen shft1:: add IX,DE djnzin if record was found but ;read/written with error resto1:: ;restore to track 0 and seek again ld A,(IX+seekrt) ; buffer, DE=DMA address, BC=128, A=0 mkbufad:: ld (blkptr),IX ld HL,(iodrvtrk) ld (blkdrvtrk),HL ld A,(iosec) ld B,A C  call fflush ;getden uses buffer or A ret nz ld A,0d0h ;reset FDC out (cmd),A ld A,(curfpy) ld (tempfpy),A  sector for DD, physical for SD blksec:: ds 1 ;first logical sector in current host blk2sec:: ds 1 ;8th CP/M sector in an un jr putpspt snglspt:: ld A,26d ;single density physical sectors putpspt:: ld (IX+pspt),A xor A ret ;no errors lves in the directory buffer xor A ld (iobyte),A ;back to default routing ld (cdisk),A ;user 0, drive A:: ld DE,signon L ld HL,hstbuf ;buffer has already been flushed ld (iodma),HL call rdsngl pop HL ld (iodma),HL ;restore dma or A ers blkptr:: dw dskparm ;pointer to paramters for block drive ; error messages badcode:: db 'Can''t recognize density of d;save most recent floppy ld A,D and 7fh ld (curfpy),A call getparm if mini if not special set 3,A ;set double denallocated 2K block psec:: ds 1 ;current physical sector bufvalid:: db 0ffh ;buffer contains valid data for (blksec) ;0 ogdin:: ld A,D ;drive already logged in ld (curfpy),A call getparm ld A,(IX+density) jr codeok ; drive can't change  call pmsg ld A,(wboota+2) ;warm boot vector add A,6 srl a srl A ;A=memory size in K call twodec ;get ASCII digits ret nz ;can't read sector ld A,(hstbuf+7fh) ;code byte for disk type OR A jr z,codeok ;some SD disks have old loadersisk in$' rderr:: db 'Read$' wrterr:: db 'Write$' skerr:: db 'Seek$' trkerr:: db ' error on track $' secerr:: db ' sector $sity for minifloppy endif endif out (wait),A ;select new drive, head 0, single D call resto1 ;back to track zero xor = valid data wrtpend:: db 0 ;write pending from buffer retryc:: db 0 ;number of retries left newfpy:: db 0 ;new floppy to density page ; ; Floppy disk driver storage ; iodrvtrk:: curfpy:: db 0 ;current selected physical floppy drive iotrk:: d for memory size push BC ld C,B call conout pop BC call conout ld DE,sign2 call pmsg ld A,(contbl+1) ;default co here sub 0e5h ;code for a normal single density disk cp 3 jr c,codeok ld DE,badcode ;not our code byte call pmsg ' siderr:: db ' side $' drverr:: db ' drive $' page ; ; disk buffers ; These are not part of the floppy driver module asA ld (iotrk),A if not mini ld (IX+density),A ;track zero always single density endif inc A if mini ld (IX+densbe selected tempfpy:: db 0 ;storage for current floppy while checking ;density of new one head:: db 0 ;head control = 0s 1 ;current track for current disk blkdrvtrk:: ds 2 ;drive and track for deblocking buffer iosec:: ds 1 ;current logicalnsole add A,31h ;make 1-2 ld C,A call conout ld DE,prnmsg call pmsg ld A,(lsttbl+1) cp 2 jr c,serprn ld DE,pa call pdrv ld A,255 ret codeok:: ld (IX+density),A or A jr z,snglspt ld A,ddpspt ;physical sectors on one side of DD such and ; should be shared by all disk modules as much as possible org fpy+500h coldboot:: dirbuf:: ;coldboot code liity),A ;double density for minifloppies endif ld (iosec),A ;read sector 1 ld HL,(iodma) ;save old DMA address push H or 1 oper:: db 0 ;operation (read/write) to be performed next hwptr:: dw dskparm ;storage for pointer to current hw parametD rprn call pmsg jr lastmsg serprn:: push AF ld DE,serpmsg call pmsg pop AF add A,31h ld C,A call conout lastmsgASSEMBLER. ; ; INVOKE WITH "MACLIB Z80" ; ; ; ; MACRO FORMATS ; ----- ------- ; ; ; MACRO ZILOG TDL ; ----- dirbuf+128 ;sector deblocking buffer ds 1024+128-($-dirbuf) chk00:: ds 32 ;the check an allocation vectors are assignedY XTIY ; LDI LDI LDI ; LDIR LDIR LDIR ; LDD LDD LDD ; LDDR LDDR LDDR ; CCI CPI CCI ; CCIR CPIR CCelse db '96' endif ' tpi minifloppies',0dh,0ah endif db 0dh,0ah,'$' sign2:: db 'K CP/M 2.2 installed',0dh,0ah,0ah dN ; LIXD NNNN LD IX,(NNNN) LIXD NNNN ; LIYD NNNN LD IY,(NNNN) LIYD NNNN ; SBCD NNNN LD (NNNN),BC SBCD NNNN ; SDED NNNN L:: ld DE,sign3 call pmsg page ld E,0 if not special ld BC,8000h ;get density of boot floppy ld A,(drvtbl) ld H,A l ----- --- ; ; LDX R,D LD R,(IX+D) MOV R,D(IX) ; LDY R,D LD R,(IY+D) MOV R,D(IY) ; STX R,D LD (IX+D),R MOV D(IX),R ;  all00:: ds 86 ;to physical floppies 0-3 ;if fewer than four drives are connected, or if ;some drives are single sidIR ; CCD CPD CCD ; CCDR CPDR CCDR ; ADDX D ADD (IX+D) ADD D(IX) ; ADDY D ADD (IY+D) ADD D(IY) ; ADCX D ADC (IXb 'Default console is serial port $' prnmsg:: db 0dh,0ah,'Default printer is $' parprn:: db 'parallel printer driver$' D (NNNN),DE SDED NNNN ; SSPD NNNN LD (NNNN),SP SSPD NNNN ; SIXD NNNN LD (NNNN),IX SIXD NNNN ; SIYD NNNN LD (NNNN),IY SIYD d L,3 ;select vector ld A,(drvtbl+1) or 80h ;set flag for first logon call jphl ;select boot drive in BIOS ld A,H oSTY R,D LD (IY+D),R MOV D(IY),R ; MVIX NN,D LD (IX+D),NN MVI D(IX) ; MVIY NN,D LD (IY+D),NN MVI D(IY) ; LDAI LD A,I LDAed, these areas can ;be reduced chk01:: ds 32 all01:: ds 86 chk02:: ds 32 all02:: ds 86 chk03:: ds 32 all03:: ds +D) ADC D(IX) ; ADCY D ADC (IY+D) ADC D(IY) ; SUBX D SUB (IX+D) SUB D(IX) ; SUBY D SUB (IY+D) SUB D(IY) ; SBCX D SBCserpmsg:: db 'serial port $' sign3:: db 0dh,0ah,0ah,'$' page twodec:: ;convert A < 100 to two ASCII digits in BC ld BCNNNN ; SPIX LD SP,IX SPIX ; SPIY LD SP,IY SPIY ; PUSHIX PUSH IX PUSH IX ; PUSHIY PUSH IY PUSH IY ; POPIX POP r L jp z,booterr ;can`t select system drive endif jp bootdone ;set up low memory and go to CCP page signon:: db 0dh,0ah,'I ; LDAR LD A,R LDAR ; STAI LD I,A STAI ; STAR LD R,A STAR ; LXIX NNNN LD IX,NNNN LXI IX,NNNN ; LXIY NNNN LD IY; ; Z-80 MACRO LIBRARY ; ; THE FOLLOWING MACROS ENABLE ASSEMBLING Z-80 INSTRUCTIONS ; WITH THE DIGITAL RESEARCH MACRO  (IX+D) SBB D(IX) ; SBCY D SBC (IY+D) SBB D(IY) ; ANDX D AND (IX+D) ANA D(IX) ; ANDY D AND (IY+D) ANA D(IY) ; XORX D ,0ff0ah nxtten:: inc B sub C jr nc,nxtten add A,C add A,30h ld C,A ld A,30h add A,B ld B,A ret hstbuf equ IX POP IX ; POPIY POP IY POP IY ; EXAF EX AF,AF' EXAF ; EXX EXX EXX ; XTIX EX (SP),IX XTIX ; XTIY EX (SP),ISuper Quad CP/M v X2.0',0dh,0ah if special db 'Special 8"-5" BIOS',0dh,0ah endif if mini db 'for ' if m48tpi db '48' ,NNNN LXI IY,NNNN ; LBCD NNNN LD BC,(NNNN) LBCD NNNN ; LDED NNNN LD DE,(NNNN) LDED NNNN ; LSPD NNNN LD SP,(NNNN) LSPD NNNE  XOR (IX+D) XRA D(IX) ; XORY D XOR (IY+D) XRA D(IY) ; ORX D OR (IX+D) ORA D(IX) ; ORY D OR (IY+D) ORA D(IY) ; CMPX D  R RRCR R ; RRCX D RRC (IX+D) RRCR D(IX) ; RRCY D RRC (IY+D) RRCR D(IY) ; RARR R RR R RARR R ; RARX D RR (IX+D) RARX JMP (IX) PCIX ; PCIY JMP (IY) PCIY ; RETI RETI RETI ; RETN RETN RETN ; INP R IN R,(C) INP R ; OUTP R OUT DB 0EDH,4FH ENDM LXIX MACRO ?NNNN DB 0DDH,21H DW ?NNNN ENDM LXIY MACRO ?NNNN DB 0FDH,21H DW ?NNNN ENDM IT B,R ; SETB B,R SET B,R SET B,R ; RES B,R RES B,R RES B,R ; BITX B,D BIT B,(IX+D) BIT B,D(IX) ; BITY B,D BIT B,(IY+D80H) 'DISPLACEMENT RANGE ERROR - Z80 LIB' ENDIF ENDM LDX MACRO ?R,?D @CHK ?D DB 0DDH,?R*8+46H,?D ENDM LDY MACRO ? CP (IX+D) CMP D(IX) ; CMPY D CP (IY+D) CMP D(IY) ; INRX D INC (IX+D) INR D(IX) ; INRY D INC (IY+D) INR D(IY) ; DCRX R D(IX) ; RARY D RR (IY+D) RARR D(IY) ; SLAR R SLA R SLAR R ; SLAX D SLA (IX+D) SLAR D(IX) ; SLAY D SLA (IY+D) SLAR  (C),R OUTP R ; INI INI INI ; INIR INIR INIR ; OUTI OTI OUTI ; OUTIR OTIR OUTIR ; IND IND IND ; INDR LDED MACRO ?NNNN DB 0EDH,5BH DW ?NNNN ENDM LBCD MACRO ?NNNN DB 0EDH,4BH DW ?NNNN ENDM LSPD MACRO ?NNNN DB 0ED) BIT B,D(IY) ; SETX B,D SET B,(IX+D) SET B,D(IX) ; SETY B,D SET B,(IY+D) SET B,D(IY) ; RESX B,D RES B,(IX+D) RES B,D(IX) R,?D @CHK ?D DB 0FDH,?R*8+46H,?D ENDM STX MACRO ?R,?D @CHK ?D DB 0DDH,70H+?R,?D ENDM STY MACRO ?R,?D @CHK ?D D INC (IX+D) INR D(IX) ; DCRY D DEC (IY+D) DCR D(IY) ; NEG NEG NEG ; IM0 IM0 IM0 ; IM1 IM1 IM1 ; IM2 IM2 D(IY) ; SRAR R SRA R SRAR R ; SRAX D SRA (IX+D) SRAR D(IX) ; SRAY D SRA (IY+D) SRAR D(IY) ; SRLR R SRL R SRLR R ; S INDR INDR ; OUTD OTD OUTD ; OUTDR OTDR OUTDR ; RLCR R RLC R RLCR R ; RLCX D RLC (IX+D) RLCR D(IX) ; RLCY D H,07BH DW ?NNNN ENDM LIXD MACRO ?NNNN DB 0DDH,2AH DW ?NNNN ENDM LIYD MACRO ?NNNN DB 0FDH,2AH DW ?NNNN ENDM  ; RESY B,D RES B,(IY+D) RES B,D(IY) ; JR ADDR JR ADDR-$ JMPR ADDR ; JRC ADDR JR C,ADDR-$ JRC ADDR ; JRNC ADDR JR NC,ADD DB 0FDH,70H+?R,?D ENDM MVIX MACRO ?N,?D @CHK ?D DB 0DDH,36H,?D,?N ENDM MVIY MACRO ?N,?D @CHK ?D DB 0FDH,36H,?D IM2 ; DADC RR ADC HL,RR DADC RR ; DSBC RR SBC HL,RR DSBC RR ; DADX RR ADD IX,RR DADX RR ; DADY RR ADD IY,RR DADY RRLX D SRL (IX+D) SRLR D(IX) ; SRLY D SRL (IY+D) SRLR D(IY) ; RLD RLD RLD ; RRD RRD RRD ; ; ; ; @CHK MACRO USE RLC (IY+D) RLCR D(IY) ; RALR R RL R RALR R ; RALX D RL (IX+D) RALR D(IX) ; RALY D RL (IY+D) RALR D(IY) ; RRCR R RRCSBCD MACRO ?NNNN DB 0EDH,43H DW ?NNNN ENDM SDED MACRO ?NNNN DB 0EDH,53H DW ?NNNN ENDM SSPD MACRO ?NNNN DB 0EDR-$ JRNC ADDR ; JRZ ADDR JR Z,ADDR-$ JRC ADDR ; JRNZ ADDR JR NZ,ADDR-$ JRNZ ADDR ; DJNZ ADDR DJNZ ADDR-$ DJNZ ADDR ; PCI,?N ENDM LDAI MACRO DB 0EDH,57H ENDM LDAR MACRO DB 0EDH,5FH ENDM STAI MACRO DB 0EDH,47H ENDM STAR MACRO R ; INXIX INC IX INX IX ; INXIY INC IY INX IY ; DCXIX DEC IX DCX IX ; DCXIY DEC IY DCX IY ; BIT B,R BIT B,R BD FOR CHECKING 8 BIT DISPLACMENTS ; @CHK MACRO ?DD ; USED FOR CHECKING RANGE OF 8-BIT DISP.S IF (?DD GT 7FH) AND (?DD LT 0FFF H,73H DW ?NNNN ENDM SIXD MACRO ?NNNN DB 0DDH,22H DW ?NNNN ENDM SIYD MACRO ?NNNN DB 0FDH,22H DW ?NNNN ENDM S?D ENDM DCRX MACRO ?D @CHK ?D DB 0DDH,035H,?D ENDM DCRY MACRO ?D @CHK ?D DB 0FDH,35H,?D ENDM NEG MACRO H,9EH,?D ENDM ANDX MACRO ?D @CHK ?D DB 0DDH,0A6H,?D ENDM ANDY MACRO ?D @CHK ?D DB 0FDH,0A6H,?D ENDM XORX MACRO ?N DB 18H,?N-$-1 ENDM JRC MACRO ?N DB 38H,?N-$-1 ENDM JRNC MACRO ?N DB 30H,?N-$-1 ENDM JRZ MACRO ?N DB 28H,?NB 0EDH,0A1H ENDM CCIR MACRO DB 0EDH,0B1H ENDM CCD MACRO DB 0EDH,0A9H ENDM CCDR MACRO DB 0EDH,0B9H ENDM B 0CBH,?N*8+?R+40H ENDM SETB MACRO ?N,?R DB 0CBH,?N*8+?R+0C0H ENDM RES MACRO ?N,?R DB 0CBH,?N*8+?R+80H ENDM BITX PIX MACRO DB 0DDH,0F9H ENDM SPIY MACRO DB 0FDH,0F9H ENDM PUSHIX MACRO DB 0DDH,0E5H ENDM PUSHIY MACRO DBDB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,5EH ENDM BCO ?D @CHK ?D DB 0DDH,0AEH,?D ENDM XORY MACRO ?D @CHK ?D DB 0FDH,0AEH,?D ENDM ORX MACRO ?D @CHK ?D DB 0DDH,0-$-1 ENDM JRNZ MACRO ?N DB 20H,?N-$-1 ENDM DJNZ MACRO ?N DB 10H,?N-$-1 ENDM PCIX MACRO DB 0DDH,0E9H ENDM P ADDX MACRO ?D @CHK ?D DB 0DDH,86H,?D ENDM ADDY MACRO ?D @CHK ?D DB 0FDH,86H,?D ENDM ADCX MACRO ?D @CHK ?D MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+46H ENDM BITY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+46H ENDM SETX MA 0FDH,0E5H ENDM POPIX MACRO DB 0DDH,0E1H ENDM POPIY MACRO DB 0FDH,0E1H ENDM EXAF MACRO DB 08H ENDM EXX M EQU 0 DE EQU 2 HL EQU 4 IX EQU 4 IY EQU 4 DADC MACRO ?R DB 0EDH,?R*8+4AH ENDM DSBC MACRO ?R DB 0EDH,?R*8+42H B6H,?D ENDM ORY MACRO ?D @CHK ?D DB 0FDH,0B6H,?D ENDM CMPX MACRO ?D @CHK ?D DB 0DDH,0BEH,?D ENDM CMPY MACRO ?CIY MACRO DB 0FDH,0E9H ENDM RETI MACRO DB 0EDH,4DH ENDM RETN MACRO DB 0EDH,45H ENDM INP MACRO ?R DB DB 0DDH,8EH,?D ENDM ADCY MACRO ?D @CHK ?D DB 0FDH,8EH,?D ENDM SUBX MACRO ?D @CHK ?D DB 0DDH,96H,?D ENDM SUBY CRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+0C6H ENDM SETY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+0C6H ENDM RESX MAACRO DB 0D9H ENDM XTIX MACRO DB 0DDH,0E3H ENDM XTIY MACRO DB 0FDH,0E3H ENDM LDI MACRO DB 0EDH,0A0H ENDM DADX MACRO ?R DB 0DDH,?R*8+09H ENDM DADY MACRO ?R DB 0FDH,?R*8+09H ENDM INXIX MACRO DB 0DDH,23H ENDM IND @CHK ?D DB 0FDH,0BEH,?D ENDM INRX MACRO ?D @CHK ?D DB 0DDH,34H,?D ENDM INRY MACRO ?D @CHK ?D DB 0FDH,34H,0EDH,?R*8+40H ENDM OUTP MACRO ?R DB 0EDH,?R*8+41H ENDM INI MACRO DB 0EDH,0A2H ENDM INIR MACRO DB 0EDH,0B2H MACRO ?D @CHK ?D DB 0FDH,96H,?D ENDM SBCX MACRO ?D @CHK ?D DB 0DDH,9EH,?D ENDM SBCY MACRO ?D @CHK ?D DB 0FDCRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+86H ENDM RESY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+86H ENDM JR MACRENDM LDIR MACRO DB 0EDH,0B0H ENDM LDD MACRO DB 0EDH,0A8H ENDM LDDR MACRO DB 0EDH,0B8H ENDM CCI MACRO DXIY MACRO DB 0FDH,23H ENDM DCXIX MACRO DB 0DDH,2BH ENDM DCXIY MACRO DB 0FDH,2BH ENDM BIT MACRO ?N,?R DG  ENDM IND MACRO DB 0EDH,0AAH ENDM INDR MACRO DB 0EDH,0BAH ENDM OUTI MACRO DB 0EDH,0A3H ENDM OUTIR MACRO  EQU 0 DE EQU 2 HL EQU 4 IX EQU 4 IY EQU 4 DADC MACRO ?R DB 0EDH,?R*8+4AH ENDM DSBC MACRO ?R DB 0EDH,?R*8+42H DH, 0CBH, ?D, 2EH ENDM SRLR MACRO ?R DB 0CBH, 38H + ?R ENDM SRLX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 3EH ENDM SNDM RRCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 0EH ENDM RARR MACRO ?R DB 0CBH, 18H + ?R ENDM RARX MACRO ?D @CHK #!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 34 CPM62.COM"$*|   DB 0EDH,0B3H ENDM OUTD MACRO DB 0EDH,0ABH ENDM OUTDR MACRO DB 0EDH,0BBH ENDM RLCR MACRO ?R DB 0CBH, 00,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVRLY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 3EH ENDM RLD MACRO DB 0EDH, 6FH ENDM RRD MACRO DB 0EDH, 67H ENDM ?D DB 0DDH, 0CBH, ?D, 1EH ENDM RARY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 1EH ENDM SLAR MACRO ?R DB 0CBH, 20H + ?RCONSTRUCTING 62k CP/M vers 2.2$H + ?R ENDM RLCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 06H ENDM RLCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 06H ENDALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, #  ENDM SLAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 26H ENDM SRAM RALR MACRO ?R DB 0CBH, 10H+?R ENDM RALX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 16H ENDM RALY MACRO ?D @CHK ?D =!v"z!w6!u#+w+wz >xG}o|g"|! :m c p!"xp ~#c*|!:m DB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,5EH ENDM BCR MACRO ?R DB 0CBH, 28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 2EH ENDM SRAY MACRO ?D @CHK ?D DB 0F DB 0FDH, 0CBH, ?D, 16H ENDM RRCR MACRO ?R DB 0CBH, 08H + ?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 0EH E xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ:m m! ~ #* DM! x  wH  ! ~ 3#0 Wx x ހ ނ G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!#͘*~ "޷"͌#>?͌͘ =_.:;<> Oޅo$>!Y2*O"ʉ@&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6\X COPYRIGHT (C) 1979, DIGITAL RESEARCH FILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q ^=~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6"  O͐  :E B 2>: b# : y! 4 5~yy5 6y_͌> ͒> Ò> Ò͘~#͌ì _2<ܯ2=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LO>ͦ!q:_  !p+q.*   !q*&!p+q*2 ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ#~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3߯21y_͸2y2ͽ:ܷҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN#  ݇!2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:ADCOMf^: ! Â$$$ SUB!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^:x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#NĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!"C{2!"E9"1A22!ty)K!G_^#V*C~E ,1y{0!B0}y|zx0y0{00܀ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧI x: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD# w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎ::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# :ʑw:2E**E}DQ>2 ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*i6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{2E>! ^#V w#P:BO|^#V#"##"##"##"!ì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>S:2E!~Яw>T D^6k-äPYy 5*{zBK52*C~=2u:B2~2wE:A*Cw>"O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==» *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwy      62k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j<"**#"͕: 2Þy<_WyOxOxG* ~V5dw^ :ʈ!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26xʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# # Oͧ>~ͻ>2!"2!"28!"9:O R![?boot  ç!NÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A#~$=2Ek͌):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# 2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄJ y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>gythin els (othe tha th SUPERBIOӠ doubl densit codes causin a error I yo ar unabl t rea supposedlr 3740 Th disk shoul b readabl b an CP/ standar singl densit system Not tha th Advance Micr Dig chose t optimiz sequentia secto operation suc a progra loads sinc thes operation ar th mos sensityiv to t; FILFCB MACRO FILL IN THE ID FIELDS OF FCB ; ; FILFCB FCB,IDSTRING ; ; IDSTRING CONTAINS FILE NAME AND TYPE (FILNAM.TYP)  code ar E fo singl density E fo singl side doubl density an E fo doubl side doubl density Ther i yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈ standar singl densit disk tr runnin th SUPERBIOӠ forma progra wit th FORMAԠ SYSTE͠ TRACKӠ ONL optiita forma progra fill al sector wit E5' i accordanc with standard practice. Som eigh inc singl densithe skew factor.  ; CARRY SET IF ERROR (NAME TOO LONG) ; FILFCB MACRO FCB,IDSTRING LOCAL OVERSUB,F1,F2,F3,F4,F5,F6 JMP OVERSUB @FLFCB: M n doubl side singl densit format a ther ar n standard availabl fo suc disks. Doubl densit disk on Thi wil fil th oute tw track wit E an no hur any of the data. Th SUPERBIO doubl densit forma fo disk fro othe system ma no b readabl a firs wit th SUPERBIOS Thi i becaus the hav od byte locat86 ; ; end VI M,0 ;;CLEAR FIRST BYTE OF FCB INX H PUSH H ;;SAVE POINTER TO NAME MVI C,11 ;;SIZE OF ID FIELD MVI A,' ' ;;SPACE Thav onl on reserve track Th sector ar 102 byte i length Eigh inc disk hav eigh sector pe track  eigh inc disk ha th firs trac o eac dis b singl density i accordanc wit IB͠ practice Al track e wher th doubl densit cod i suppose t be Th SUPERBIO interpret eithe 0 o E t b singl density anITH INCREMENTED VALUE ; INXM MACRO ADDR LHLD ADDR INX H SHLD ADDR ENDM  SUPERBIOS disk formats Th SUPERBIO singl densit eigh inc forma i completel IB͠ standafiv inc disk hav four Th physica ske o th dis i thre fo eigh inch tw fo fiv inch Thes number werOINTER LXI D,INCR DAD D ;;DOUBLE ADD SHLD POINTER ENDM ; ; . . . . . . . . . . . . . . . . . . . . . . . . . . . ; o minifloppie ar doubl density Byt 7 o trac zero secto i cod byt (thi i th standar location) OuK SE MVI C,BLKLEN ENDIF IF NOT NUL CONST MVI E,CONST ;;LOAD CONST IF NOT NULL ELSE MVI E,0 ENDIF @FILL: MOV M,E ;P ENDLIT LITSTR: DB ?STR2 ;;LITERAL STRING ENDLIT: ;;END OF STRING ELSE IF NOT NUL ?STR2 LXI H,?STR2 ;;LOAD POINTER;DECR LENGTH COUNT RZ ;;RETURN IF MATCH FOUND LDAX D ;;GET A BYTE FROM ONE STRING SUB M ;;COMPARE WITH OTHER RNZ ;LITSTR,ENDLIT IF NOT NUL ?STR LXI H,?STR ENDIF MVI B,?LEN MVI C,ENDLIT-LITSTR LXI D,LITSTR CALL @INSTR JMP ENDLI STR1 MACRO WILL LOAD REG IF ARG ; HL POINTS TO STR2 PRESENT ; C CONTAINS LENGTH ; ; SUBTRACT STR2 FROM STR1 AND SET FLAGBSTR LOCAL OVERSUB,S1,SSX JMP OVERSUB @INSTR: MOV A,B ;;STRING LENGTH SUB C ;;SUBTRACT SUBSTR LENGTH CMC ;;COMP CAR;STORE A BYTE INX H ;;INCR MEMORY POINTER IF BLKLEN > 255 DCX B ;;DECR COUNT MOV A,C ;;TEST LIMIT ORA B JNZ @FILL TO STRING2 ENDIF MVI C,?LEN ;;LOAD STRING LENGTH CALL @MATCH ;;CALL MATCH SUBROUTINE ENDIF ENDIF ENDM MATCH STR;RETURN INX H INX D ;;INCR STRING POINTERS JMP M1 ;;TRY SOME MORE OVERSUB: MATCH MACRO ?STR1,?STR2,?LEN LOCAL LITSTRT LITSTR: DB ?SUBSTR ENDLIT: ENDM INSTR STRING,LENGTH,SUBSTR ENDM ; ; . . . . . . . . . . . . . . . . . . . . . . . . S, ZERO INDICATES MATCH. ; NORMALLY THE SECOND ARG IS A LITERAL STRING AND THE LENGTH ; IS OMITTED. IF THE LEN ARG IS PRESENRY RNC ;;ERROR RETURN SUBSTR > STRING MOV B,A ;;NEW STRING LIMIT TO B S1: SAVE MATCH RESTORE JZ SSX ;;MATCH IF ZE ;;CONTINUE ELSE DCR C JNZ @FILL ENDIF ELSE IF NUL CONST MVI M,0 ;;STORE A ZERO ELSE MVI M,CONST ;;STORE SI1,STR2,LEN ENDM ; ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; ; INSTR MACRO SEARCH STRING FOR SUBSTRING AN,ENDLIT IF NUL ?STR1&?STR2&?LEN CALL @MATCH ELSE IF NOT NUL ?STR1 LXI D,?STR1 ;;LOAD STRING1 POINTER ENDIF IF NUL. . . . ; ; SCAN MACRO SCAN A STRING UNTIL A CHAR IS FOUND, SKIP BLANKS ; AND CONTROL CHARACTERS ; ; CARRY SET IF NUMERT THE SECOND STRING ; ARG IS ASSUMED TO BE A MEMORY ADDR. IF ALL ARGUMENTS OMITTED ; REGISTERS ASSUMED ALREADY LOADED. ; MRO ON RET ANA A ;;RESET CARRY DCR B ;;BYTES LEFT RM ;;FINISHED IF MINUS, NO MATCH INX H ;;INCR STRING POINTER JMPNGLE BYTE ENDIF ENDIF ENDM ; ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; ; ; MATCH MACRO COMPARE 2 STD SET CARRY IF FOUND ; ; INSTR STRING,LENGTH,SUBSTR ; ; HL POINTS TO STRING ; DE POINTS TO SUBSTRING ; B CONTAINS STRIN ?LEN ;;TEST FOR LITERAL MVI C,ENDLIT-LITSTR ;;LENGTH OF LITERAL STRING LXI H,LITSTR ;;POINTER TO LITERAL CALL @MATCH JMIC, CARRY OFF IF ALPHABETIC ; ; SCAN MACRO ADDR LOCAL OVERSUB JMP OVERSUB @SCAN: MOV A,M ;;GET A BYTE CPI 21H ;;SPACATCH MACRO STR1,STR2,LEN LOCAL OVERSUB,M1 JMP OVERSUB @MATCH: INR C ;;PRE INCREMENT COUNT (IT MIGHT BE ZERO) M1: DCR C ; S1 ;;TRY AGAIN SSX: MVI B,0 ;;SET D TO 0 DAD B STC ;;SET CARRY RET OVERSUB: INSTR MACRO ?STR,?LEN,?SUBSTR LOCAL RINGS OF SAME LENGTH SET CARRY IF EQUAL ; ; MATCH STR1,'LITERAL STRING' ; MATCH STR1,STR2,LENGTH ; MATCH ; ; DE POINTS TOG LENGTH ; C CONTAINS SUBSTRING LENGTH ; ; MACRO RETURNS POINTER TO END OF SUBSTRING IN HL ; INSTR MACRO STRING,LENGTH,SUL E OR LESS? RP INX H ;;INCR POINTER JMP @SCAN ;;KEEP SEARCHING OVERSUB: SCAN MACRO ?ADDR IF NOT NUL ?ADDR LXI H,?AD ;;DMA ADDR IN BC DREAD SET 27H DWRITE SET 2AH ; ?F SET FUNCT IF NOT NUL PARAM MVI C,PARAM ENDIF LHLD 1 ;;ADDR OF BR LXI D,PARAMETER ENDIF MVI C,?C CALL 5 ;;BDOS ENTRY ENDM ; ; . . . . . . . . . . . . . . . . . . . . . . . . . . .OGIN ; 25 ?DRIVE ; 26 SETDMA BUFFER ; 27 ?ALLOC ; SEE CP/M INTERFACE GUIDE FOR DETAILED INFORMATION ON THE ; DISK ACC MOV A,H CMP D ;;COMPARE HIGH BYTES JNZ @END MOV A,L CMP E ;;COMPARE LOW BYTES @END: ENDM ; ; . . . . . . . . . . DR ENDIF CALL @SCAN ;;CALL SUBROUTINE CPI 3AH ;;NUMBER OR ALPHA ENDM SCAN ADDR ENDM ; ; . . . . . . . . . . . . IOS MVI L,?F ;;JUMP OFFSET SHLD @CALL+1 ;;MODIFY CALL ADDR @CALL: CALL 0 ENDM ; ; . . . . . . . . . . . . . . . . . . . ; ; CALLBIOS MACRO CALL BIOS ROUTINES DIRECTLY ; ; CALLBIOS FUNCTION,PARAM ; CALLBIOS MACRO FUNCT,PARAM LOCAL @CALL ESS PRIMITIVES ; ; DISKIO READ,FCB (TYPICAL MACRO CALL) ; DISKIO MACRO FUNCTION,PARAMETER LIFTHEAD SET 12 INITIAL SET 13 . . . . . . . . . . . . . . . . . . ; ; DJZ MACRO DOUBLE PRECISION TEST HL AND JUMP ON ZERO ; DJZ MACRO ADDR MOV A,H ORA. . . . . . . . . . . . . . . . ; ; DISKIO MACRO EXECUTE BDOS DISK ACCESS PRIMITIVES ; ; DISKIO FUNCTION,PARAMETER ; ; NO . . . . . . . . . . ; ; DLOAD MACRO DOUBLE PRECISION INDEXED LOAD HL ; ; LOAD (ADDR + INDX) TO HL ; DLOAD MACRO ADDR,IND; DCOLD SET 00H DWBOOT SET 03H DSTAT SET 06H DCONIN SET 09H DCONOUT SET 0CH ;;CHAR IN C DLIST SET 0FH ;;CHAR IN C DPUNC LOGIN SET 14 OPEN SET 15 CLOSE SET 16 SEARCH SET 17 SERNXT SET 18 DELETE SET 19 READ SET 20 WRITE SET 21 MAKE  FUNCTION ENTRY PARAM ; ; 12 LIFTHEAD ; 13 INITIAL ; 14 LOGIN DISK NO 0 - 1 ; 15 OPEN FCB ; 16 CLOSE FCB ; 17 SEX IF NUL INDX LHLD ADDR ELSE LHLD INDX LXI D,ADDR DAD D MOV E,M INX H MOV D,M XCHG ENDIF ENDM ; . . . .H SET 12H DREADER SET 15H DHOME SET 18H DSELDSK SET 1BH DSETTRK SET 1EH DSETSEC SET 21H ;;SECTOR NO IN C DSETDMA SET 24H SET 22 RENAME SET 23 ?LOGIN SET 24 ?DRIVE SET 25 SETDMA SET 26 ?ALLOC SET 27 ; ?C SET FUNCTION IF NOT NUL PARAMETEARCH FCB ; 18 SERNXT FCB ; 19 DELETE FCB ; 20 READ FCB ; 21 WRITE FCB ; 22 MAKE FCB ; 23 RENAME FCB ; 24 ?L . . . . . . . . . . . . . . . . . . . . . . . . ; ; CPHL MACRO SUBTRACT DE FROM HL AND SET FLAGS ; CPHL MACRO LOCAL @END