IMD 1.17: 2/06/2011 14:59:46 advanced digital cpm 2.2 ser# 615-00127 dsdd  >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 COMLPIP COM: SUBMIT COM XSUB COMED COM4ASM COM@DDT COM&LOAD COMSTAT COM)SYSGEN COMDUMP COMDUMP ASM! !"CPM SYSH#$%&'DEBLOCK ASMP()*+,DISKDEF LIB1-./0FORMAT ASMA12345NEWSIZE DOC6CPMINSTADOC 7LDRGEN COM8TRK0 LDR9:MODEM COM;;<=>RAMDISK MAC?@FMTHD COMAFORMAT COM BREADFRSTDOCCDMODEM DOC`EFGHIJLOADER DOCKLUSER DOCMNINTRFACEDOC,OPQZ80 LIBNRSTUVFORMAT DOCWCPM60,CO DXYZ[\,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # =!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m ʅ xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|  CONSTRUCTING 00k CP/M vers 2.2$>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*1y{0!B0}y|zx0y0{00 \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUBg"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2óadjmrux}çìûpñns ns<nskLns{?      00k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j<Oͧ>~ͻ>2!"2!"28!"9:O R![?boot  ç!y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>g yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈ@$@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I(  BIB@!  ! !! D 15D715E0AB :100A700015E615EC15F515FE1504160A1611162CBB :100A80000E17161D1626162D16411647164D160E54 :100A9000155316040C040C9B1(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>HHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ 2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 * "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q   :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!E ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ *M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>*M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ ÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&62*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨ copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Command Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"!͇͊!p+q* ͊!p+q*͍2!p+q*͍2!p+q*͊!p+q*͍!p+q*͍!p+q*͍2!s+p+q+p+q:=2ʦ** w*#"*#"!p+q(+*DM*p*& 6:ep\:=ͧ!t6>!t%\= >!t6:t<2t=O! ~2u b:<2O>9b!60+~9b!60+4:uat:u_2u:uMʉSͧ!v6!"v!|6:|Ҁ!x6 2}:} Hk:} h:}$6 2}$*}M3:}02}O> ͧ3!z6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧ-!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"vv ~_{ozg001 $$$$ SUBW Extended Submit Vers 2.0Xsub Already Present$Requires CP/M Version 2.0 or later$:y*###ƒ# yk   җ 4!~=ŐW!xʵ ~#èbx {~#o}où.xsubb!np+q*m2_!pp+q*o ]xsub*"-!/"*"+!""1 M*!"́!"* (xsub active)$|*y ʥ*"*7***x*́͋<͛ :%*=26͋!7^#6 #6 #6$ 8*7~O #w# !6:6=2% ͋*-"*$$$ SUBq:(=2(N *$*& w*$#"$*&#"&' !"N*M^7 !)6:!)ھ *N*DM͆ 2*ʭ :*ʗ ͯ *N"P*6:2)÷ *N"N!) $@BA$! A "!$"" COPYRIGHT (C) 1979, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE IT$NEW FILE$** FILE IS READ/ONLY **$"SYSTEM" FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mM"m +!8s~1m!f6 *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2dû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+"!!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t -? >!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :! (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F”͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:""&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2"+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ - ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq:f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q*r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q*!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q*:7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x !e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : =e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`:*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- : ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: ڦ> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O! N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{.*22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~ *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!"&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6 !7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"&*$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:! e2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! 6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq*FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "PҘ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&og_{_z#W H = LIBX$$$$$$$LIB$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! 6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq1*" COPYRIGHT(C) 1978, DIGITAL RESEARCH á 4êü /L9ASMPRNHEX!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ !)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1  :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 w#  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6y:! G~#x=2> > ! >x6 #='G! ~ p( O*}O>4?:7w:#ĸ*"!͸* }w>ͪg( ʆ1 Y :7ʗ8 z !<ͼ CP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY G:7xʘ!#~ʄl͸Ä**!O {zʊ͸*"!!#^4!$wͯͯWƐ'@'ê>:ͪ!#^Ww*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪ@2 0 0:x0_<2! wI2 2> 2 >2ɯ22 !~@_6^4#: w~$w: 0 q: A: A͋q: a{_2  2 - !ɯ2I:  ;*:  ͭͷ ͭ͋>9q>9: '!2 >9 7:! 6 >2>2: 2 Qͭ:Ğ! :lj<͖<j<|<: OʊQ>ÖH >2 2 û: B­>ôD> ¸!52 !"!N#~#A07O! ~*!) " :  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*{zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~͎*_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fkz'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂÃ)sn55)=â|g}o=î--#zg{ozg{ozg{oÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#=ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅͰ>2lyPLnR>UX:l̅2l͓*>E2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 :|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ixH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8OĽ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>SR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >N=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"28!"9:] !í 1͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_)*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_@ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! 6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝҉* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!? q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#W3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk Status : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&L!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\LR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠">!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2:2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V")*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*) w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#WxCOPYRIGHT (C) 1978, DIGITAL RESEARCH  o&)))))))a{__> ̓> ̓͊~̓#ÚO****!*$*'! ">2!4:(wNͯ>2:)!4f!^!*FNͷyj*DMͿ2: K!͚u c͊<2:\_/:)j*"1!u͚:] \<œ!x͕c2|\ ¢! DMͿ\õ!͕c!͕u AnA2Aͦ͊!͚u c͊2!?͚!͕u cA7nA2Aͦ!͕u c͊!6!?͚>ͦ͊!Q͕SYSGEN VER 2.0SOURCE DRIVE NAME (OR RETURN TO SKIP)SOURCE ON , THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT)DESTINATION ON , THEN TYPE RETURNPERMANENT ERROR, TYPE RETURN TO IGNOREFUNCTION COMPLETEINVALID DRIVE NAME (USE A, B, C, OR D)NO SOURCE FILE ON DISKSOURCE FILE INCOMPLETE!9"1W͜Q>2!͢QG}DrYQ|͏}͏#> ex͏#r* _> e> e ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FILE PRESENT ON DISK$!Y , <    *$A!6 # T!w $r# *`: 0 *A*! ~ ʰxkb))))_y‘BK{ͅ*!66!"80*{#z+++ #; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOX 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;TYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN READF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHIC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NAME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FCBRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ;FCB LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK AREA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FILE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR JMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ; HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALL 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 ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARACTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;TO NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE THAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP ; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,BRKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED 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 PCHAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRC RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0  ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH CARRY 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 PRECISION INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C,OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ; ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END 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 PRECISION INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C,OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<د2 ه!߶2:2a{_:߷ʖ:߷>Ľʖ:=2–!B!6#5ʖ:߷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ڷ"͌#>?͌͘ =_.:;<> Oڅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 3ۯ21y_͸2y2ͽ:ط˜1͘A͌>>͌92^ :߷¥.!_~#fow]ݭގޥ!v"!çREAD ERRORçNO FILE^:߷ ! ~ 3#0 Wx x ڀ ڂ G ~ # 3x~#B!Y~ɯ2:߷=!߾ý:߷=!߾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ݯw4!Y~ʆ͌†t=ʆf ^ T ݯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Y޸psp2mÆÆf ͧÆFILE EXISTS _: É: :߷ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2߯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !߶ Â$$$ SUBg"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2AÖÚÞâüpØtxØ|ÀæN   :!_zV#_~  :!):!!!1: !9:1d͘|^#VS*3!1NFx(BtNF C͘7?KnfB8C[MDx| #*5"!">22*3:OvWarm boot error-reset system $-ÌÚëSBCIO ( *|>Gx((Ox& }<2~sT1T*$} ͌[! w}<2{TMAyx >/:(>>2>(y>ÌÝÎÓBÊ FLOPPY rErE8?@/ _      y2y2CG 8"~G:G:~ >2> !5 Um-͚ >> 2 :O :G:y~ :28 q*~(P>(=(!& :22ͺ>2 /E͙0zW: #͢8 /2:2 >2>2v /2{l: >2 /*>2>2**":̓v"2 *~(͙8ͺ {l:2 >2>2E> 2 > :G /_~(!*: { _{: # U-͚ >WJ(  : =2 W{((y~:: :U>: ~ ( w:2F8 <2 y2:W: *KB(7:Gz?"*":G2xG![2 G!zi` n&y P:ʋ>2*PY}(|˘A8g ѷ> :2z2g22w<2*!"f":(8 VU>w(>>wz2~: Â_Gy_()gD͂ <`G.͓|y2!$O͞Ɛ'@'OÞCan't recognize density of disk in$Read$Write$Seek$ error on track $ sector $ side $ drive $ The diskette in$ is write-protected. Remove the diskette and put on the write protect tab, then type any character.$ Type a control-C if you wish to abort the operation instead $ is not ready. Insert diskette, close drive door, and type any character to continue.$ï!1 !; !`|G^22y:??!H͞͞:"1O͞:*81O͞ Super Quad CP/M v X2.0 Typeahead installed $K CP/M 2.2 installed Default console is serial port $ Default printer is $parallel printer driver$serial port $ $ 00O>0GD`D ! ~ 3#0 Wx x ހ ނ G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x ;***************************************************** ;* * ;* Sector Deblocking Algorithms for CP/M 2.0 * ;* * ;***************************************************** ; ; utility macro to compute sector mask smask macro hblk ;; compute log2(hblk), return @x as result ;; (2 ** @x = hblk on return) @y set hblk @x set 0 ;; count right shifts of @y until = 1 rept 8 if @y = 1 exitm endif ;; @y is not 1, shift right one position @y set @y shr 1 @x set @x + 1 endm endm ; ;***************************************************** ;* * ;* CP/M to host disk constants * ;* * ;***************************************************** blksiz equ 2048 ;CP/M allocation size hstsiz equ 512 ;host disk sector size hstspt equ 20 ;host disk sectors/trk hstblk equ hstsiz/128 ;CP/M sects/host buff cpmspt equ hstblk * hstspt ;CP/M sectors/track secmsk equ hstblk-1 ;sector mask smask hstblk ;compute sector mask secshf equ @x ;log2(hstblk) ; ;***************************************************** ;* * ;* BDOS constants on entry to write * ;* * ;***************************************************** wrall equ 0 ;write to allocated wrdir equ 1 ;write to directory wrual equ 2 ;write to unallocated ; ;***************************************************** ;* * ;* The BDOS entry points given below show the * ;* code which is relevant to deblocking only. * ;* * ;***************************************************** ; ; DISKDEF macro, or hand coded tables go here dpbase equ $ ;disk param block base ; boot: wboot: ;enter here on system boot to initialize xra a ;0 to accumulator sta hstact ;host buffer inactive sta unacnt ;clear unalloc count ret ; home: ;home the selected disk home: lda hstwrt ;check for pending write ora a jnz homed sta hstact ;clear host active flag homed: ret ; seldsk: ;select disk mov a,c ;selected disk number sta sekdsk ;seek disk number mov l,a ;disk 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) ret ; settrk: ;set track given by registers BC mov h,b mov l,c shld sektrk ;track to seek ret ; setsec: ;set sector given by register c mov a,c sta seksec ;sector to seek ret ; setdma: ;set dma address given by BC mov h,b mov l,c shld dmaadr ret ; sectran: ;translate sector number BC mov h,b mov l,c ret ; ;***************************************************** ;* * ;* The READ entry point takes the place of  * ;* the previous BIOS defintion for READ. * ;* * ;***************************************************** read: ;read the selected CP/M sector xra a sta unacnt mvi a,1 sta readop ;read operation sta rsflag ;must read data mvi a,wrual sta wrtype ;treat as unalloc jmp rwoper ;to perform the read ; ;***************************************************** ;* * ;* The WRITE entry point takes the place of * ;* the previous BIOS defintion for WRITE. * ;* * ;***************************************************** write: ;write the selected CP/M sector xra a ;0 to accumulator sta readop ;not a read operation mov a,c ;write type in c sta wrtype cpi wrual ;write unallocated? jnz chkuna ;check for unalloc ; ; write to unallocated, set parameters mvi a,blksiz/128 ;next unalloc recs sta unacnt lda sekdsk ;disk to seek sta unadsk ;unadsk = sekdsk lhld sektrk shld unatrk ;unatrk = sectrk lda seksec sta unasec ;unasec = seksec ; chkuna: ;check for write to unallocated sector lda unacnt ;any unalloc remain? ora a jz alloc ;skip if not ; ; more unallocated records remain dcr a ;unacnt = unacnt-1 sta unacnt lda sekdsk ;same disk? lxi h,unadsk cmp m ;sekdsk = unadsk? jnz alloc ;skip if not ; ; disks are the same lxi h,unatrk call sektrkcmp ;sektrk = unatrk? jnz alloc ;skip if not ; ; tracks are the same lda seksec ;same sector? lxi h,unasec cmp m ;seksec = unasec? jnz alloc ;skip if not ; ; match, move to next sector for future ref inr m ;unasec = unasec+1 mov a,m ;end of track? cpi cpmspt ;count CP/M sectors jc noovf ;skip if no overflow ; ; overflow to next track mvi m,0 ;unasec = 0 lhld unatrk inx h shld unatrk ;unatrk = unatrk+1 ; noovf: ;match found, mark as unnecessary read xra a ;0 to accumulator sta rsflag ;rsflag = 0 jmp rwoper ;to perform the write ; alloc: ;not an unallocated record, requires pre-read xra a ;0 to accum sta unacnt ;unacnt = 0 inr a ;1 to accum sta rsflag ;rsflag = 1 ; ;***************************************************** ;* * ;* Common code for READ and WRITE follows * ;* * ;***************************************************** rwoper: ;enter here to perform the read/write xra a ;zero to accum sta erflag ;no errors (yet) lda seksec ;compute host sector rept secshf ora a ;carry = 0 rar ;shift right endm sta sekhst ;host sector to seek ; ; active host sector? lxi h,hstact ;host active flag mov a,m mvi m,1 ;always becomes 1 ora a ;was it already? jz filhst ;fill host if not ; ; host buffer active, same as seek buffer? lda sekdsk lxi h,hstdsk ;same disk? cmp m ;sekdsk = hstdsk? jnz nomatch ; ; same disk, same track? lxi h,hsttrk call sektrkcmp ;sektrk = hsttrk? jnz nomatch ; ; same disk, same track, same buffer? lda sekhst lxi h,hstsec ;sekhst = hstsec? cmp m jz match ;skip if match ; nomatch: ;proper disk, but not correct sector lda hstwrt ;host written? ora a cnz writehst ;clear host buff ; filhst: ;may have to fill the host buffer lda sekdsk sta hstdsk lhld sektrk shld hsttrk lda sekhst sta hstsec lda rsflag ;need to read? ora a cnz readhst ;yes, if 1 xra a ;0 to accum sta hstwrt ;no pending write ; match: ;copy data to or from buffer lda seksec ;mask buffer number ani secmsk ;least signif bits mov l,a ;ready to shift mvi h,0 ;double count rept 7 ;shift left 7 dad h endm ; hl has relative host buffer address lxi d,hstbuf dad d ;hl = host address xchg ;now in DE lhld dmaadr ;get/put CP/M data mvi c,128 ;length of move lda readop ;which way? ora a jnz rwmove ;skip if read ; ; write operation, mark and switch direction mvi a,1 sta hstwrt ;hstwrt = 1 xchg ;source/dest swap ; rwmove: ;C initially 128, DE is source, HL is dest ldax d ;source character inx d mov m,a ;to dest inx h dcr c ;loop 128 times jnz rwmove ; ; data has been moved to/from host buffer lda wrtype ;write type cpi wrdir ;to directory? lda erflag ;in case of errors rnz ;no further processing ; ; clear host buffer for directory write ora a ;errors? rnz ;skip if so xra a ;0 to accum sta hstwrt ;buffer written call writehst lda erflag ret ; ;***************************************************** ;* * ;* Utility subroutine for 16-bit compare * ;* * ;***************************************************** sektrkcmp: ;HL = .unatrk or .hsttrk, compare with sektrk xchg lxi h,sektrk ldax d ;low byte compare cmp m ;same? rnz ;return if not ; low bytes equal, test high 1s inx d inx h ldax d cmp m ;sets flags ret ; ;***************************************************** ;* * ;* WRITEHST performs the physical write to * ;* the host disk, READHST reads the physical * ;* disk. * ;* * ;***************************************************** writehst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. write "hstsiz" bytes ;from hstbuf and return error flag in erflag. ;return erflag non-zero if error ret ; readhst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. read "hstsiz" bytes ;into hstbuf and return error flag in erflag. ret ; ;***************************************************** ;* * ;* Unitialized RAM data areas * ;* * ;***************************************************** ; sekdsk: ds 1 ;seek disk number sektrk: ds 2 ;seek track number seksec: ds 1 ;seek sector number ; hstdsk: ds 1 ;host disk number hsttrk: ds 2 ;host track number hstsec: ds 1 ;host sector number ; sekhst: ds 1 ;seek shr secshf hstact: ds 1 ;host active flag hstwrt: ds 1 ;host written flag ; unacnt: ds 1 ;unalloc rec cnt unadsk: ds 1 ;last unalloc disk unatrk: ds 2 ;last unalloc track unasec: ds 1 ;last unalloc sector ; erflag: ds 1 ;error reporting rsflag: ds 1 ;read sector flag readop: ds 1 ;1 if read operation wrtype: ds 1 ;write operation type dmaadr: ds 2 ;last dma address hstbuf: ds hstsiz ;host buffer ; ;***************************************************** ;* * ;* The ENDEF macro invocation goes here * ;* * ;***************************************************** end ; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; ; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; diskdef parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logical disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,...,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,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 "skew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (word) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of tracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defines disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is defined 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 ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the bios, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a large disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,0000h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc vectors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter blocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro dn dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw macro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;; produces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variable for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif gcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set statements for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn equ als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocation vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate the block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fills with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not found yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkval set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks) > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; now generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries per block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks else dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb %blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shr 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate table, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; generate the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm enddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm e; ; ; ; MACLIB MACRO ; ;FORMAT PROGRAM FOR THE WD1791 FDISK CONTROLLER ; INTERLEAVED SECTOR VERSION ; ; ************** DD DISK CONTROLLER **************** ; TRUE EQU 0FFFFH FALSE EQU NOT TRUE ; ; ;**************************************************** ; ; ;DISK DRIVE TYPE MINI EQU false ;FALSE FOR 8 INCH DRIVES ; ;*************************************************** ; ; ; ; ; ;**************************************** ; ;DOUBLE DENSITY CODE FLAG ; ;THIS FLAG IS PLACED ON TRACK 0 ;SECTOR 1 FOR DOUBLE DENSITY DISKS ; CODE1 EQU 0e6H ;single sided CODEQ EQU 0e7H ;double sided ;********************************************* ; BDOS EQU 5 WBOOT EQU 0 CMD EQU 00CH DAL EQU CMD+3 WAIT EQU 014H WTRACK EQU 0F4H SEEK EQU 19H 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) GAP1 EQU 80 GAP3 EQU 80 PRE0 EQU 12 SGAP4F EQU 40 SGAP2F EQU 26 SGAP20 EQU 6 SGAP1F EQU 27 ENDIF ; ; IF MINI SECNT EQU 4 ;1024 byte sectors SSECT EQU 18 ;DOUBLE DENSITY GAPS GAP1 EQU 255 GAP3 EQU 255 PRE0 EQU 12 ;SINGLE DENSITY GAPS SGAP4F EQU 11 SGAP1F EQU 7 SGA1F6 EQU 3 SGAP20 EQU 6 MTK EQU 39 ;40 TRACKS (0-39) ENDIF ; INTRP EQU 0D0H RESTO EQU 1 ;6MS STEP ORG 100H ; START: LXI SP,START PRINT PRINT IF MINI PRINT ENDIF COMPLT: IF MINI MVI A,CODE1 STA CODE2 ; set allways double density XRA A ELSE ; 8 inch drives MVI A,0E5H ;INIZ CODE2 TO ISNT CODEQ STA CODE2 PRINT CALL IMPC ;GET CHAR CPI 'D' ;IS DOUBLE ? JNZ CKSINGL ;IF NOT SEE IF SINGLE ; ; XRA A ;SET DENS TO 0 FOR DOUBLE DENSITY JMP SETUP1 CKSINGL: CPI 'S' JNZ QUIT ;NOT SINGLE THEN QUIT MVI A,MTK+2 ;DO ALL TRACKS SINGLE DENSITY ENDIF SETUP1: STA DENS ; ; PRINT MVI A,0FFH ;INIZ SYSTEM FLAG TO NOT STA FLAG ;SYSTEM CALL IMPC ;GET ANSWER SUI 'A' JC QUIT CPI 4 JNC QUIT ; START1: MOV C,A STA DISKNO ;SAVE DRIVE NUMBER SYSTK: PRINT CALL IMPC CPI 'N' JZ DOIT CPI 'Y' JNZ SYSTK XRA A STA FLAG DOIT: XRA A STA DBLFL LDA DENS ORA A JNZ DOIT1 MVI A,CODE1 ; assume single sided STA CODE2 PRINT CALL IMPC CPI 'S' JZ DOIT1 CPI 'D' JNZ DOIT MVI A,CODEQ STA CODE2 MVI A,1 STA DBLFL DOIT1: PRINT LDA DISKNO ADI 41H CHAROUT PRINT <': and press the Return key '> CHARIN CPI 0DH JNZ 0 ; exit if not return PRINT LDA DISKNO OUT WAIT ;SELECT DISK & SET SINGLE DENSITY MVI A,RESTO di OUT CMD IN WAIT ;WAIT FOR DONE ei ; XRA A MOV D,A ;START WITH TRACK 0 STA SIDE ;SET SIDE ZERO SLOOP2: MVI E,1 ;SECTOR LXI H,BUFF ;DMA BUFFER ; IF NOT MINI MVI A,0FFH MVI B,SGAP4F CALL PUT XRA A MVI 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,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 MOV 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 XRA A CALL PUT MVI M,0FBH INX H MVI A,0E5H MVI B,128 CALL PUT ;DATA 128 BYTES MOV A,E DCR A ;SEE IF SECTOR 1 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 NOTDD: 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 INR 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 PUT DCR C JNZ SLOOP3 PUSH D LXI H,BUFF XCHG ;PUT IN D,E LXI H,WLOOP MVI A,WTRACK di OUT CMD ; CALL WLOOP 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 ;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 IN 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=2 AND FLAG = 0 THEN ;DONE WITH SD SYSTEM JZ COMPLT JMP SLOOP2 ENDIF ; NOT MINI ; ; DOUBLE DENSITY FORMAT ROUTINE ; START2: XRA A STA SIDE if mini mvi d,0ffh ;fake so double density starts at track 0 jp was12 endif LDA DBLFL ORA A MVI D,0 JZ WAS12 MVI A,1 STA SIDE LOOP2: LDA SIDE ADD A ADD A MOV B,A LDA DISKNO ORA B ORI 8 OUT WAIT ; SELECT DRIVE, DENSITY & HEAD MVI E,0 ;RESET SECTOR COUNTER LXI H,TABLE ;RESET POINTER SHLD PTR ;RESET TABLE POINTER LXI H,BUFF ;DMA BUFFER MVI B,GAP1 ;GAP 1 MVI A,4EH CALL PUT LOOP: LDA DBLFL ORA A JZ INTER1 MOV A,D CPI 0 JNZ INTERL JMP INTER2 INTER1: MOV A,D ;SEE IF TRACK 1 CPI 0 JNZ INTERL ;IF NOT TK 0 THEN DO INTERLEAVE ; ; ; NON INTERLEAVE SECTOR CALCULATION ; INTER2: INR E MOV A,E CPI SECNT+1 JMP NEXTSE ; ; INTERLEAVE SECTOR CALCULATION ; 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 ;SET 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 LDA 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 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 1024 BYTES CALL PUT CALL PUT CALL PUT IF MINI MOV A,E ; GET SECTOR DCR A ORA D JNZ MN0S1 push H push D lxi 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 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 LOOP3 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 ;GET STATUS ei ORA A ;TEST JNZ ERROR LDA DBLFL ;SEE IF DOUBLE SIDED ORA A JZ ONES2 ;DO ONLY ONLY ONE SIDE LDA SIDE ;GET SIDE NUMBER DCR A ;TEST SIDE JZ WAS12 MVI A,1 ;DO SIDE 1 STA SIDE ;DO OTHER SIDE JMP LOOP2 WAS12: ;DO NEXT TRACK XRA A STA SIDE ;SET SIDE 0 ONES2: INR D MOV A,D CPI MTK+1 ;LAST TRACK? JZ COMPLT OUT DAL MVI A,SEEK di 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 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 PRINT 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 IMPC: ;INPUT A CHAR. FROM THE CONSOLE XRA A STA IBUFF+2 INPUT IBUFF,80 LDA IBUFF+2 RET ; ; WLOOP: IN WAIT ORA A RP ; LDAX D ;GET DATA OUT DAL ;PUT DATA IN 1791 INX D PCHL ;JMP WLOOP FLAG: DB 0 DENS: DB 0 PTR: DW TABLE DBLFL: 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 0E5H TABLE: ; IF NOT MINI ; DB 1,18,35,10,27,44,2,19,36,11,28,45,3 ; DB 20,37,12,29,46,4,21,38,13,30,47,5 ; DB 22,39,14,31,48,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,4 ENDIF DB 00 BUFF: IBUFF: END START  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 IMPC: ;INPUT A CHAR. FROM THE CONSOLE XRA A STA IBUFF+2 INPUT IBUFF,80 LDA IBUFF+2 RET ; ; WLOOP: IN WAIT ORA A RP ; LDAX D ;GET DATA OUT DAL ;PUT DATA IN 1791 INX D PCHL ;JMP WLOOP FLAG: DB 0 DENS: DB 0 PTR: DW TABLE DBLFL: 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 0E5H TABLE: ; IF NOT MINI ; DB 1,18,35,10,27,44,2,19,36,11,28,45,3 ; DB 20,37,12,29,46,4,21,38,13,30,47,5 ; DB 22,39,14,31,48,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 Regenerating the SUPERBIOS for a different memory size Th SUPERBIO normall reside i 61 CP/ syste wit 6 ˠ o RAM Th extr 3 come fro th fac tha th BIOӠ i relatively large and includes a 1Kbyte deblocking buffer. 1) Assemble SUPRBIOS.MAC with M80 (Microsoft Macro-80). 2 Determin th lin addres fo th BIOS Th standar SUPERBIO i org' a EE00H Calculat you highes RA addres availabl t th SUPERBIO an subtrac 1200 tge th lin address Example syste ha 2 memory-mappe vide boar residing at F800H-FFFFH. F800h-1200H = E600H for the SUPERBIOS. 3 Us Microsoft-compatibl linke (LINK L80 LINKMT etc t lin SUPRBIOS.REL LIN wil generat a offse .CO͠ file while with L80 you get a .HEX file. LINK: L80: LIN SUPRBIOS[LEA00 L8 /P:EA00,SUPRBIOS,SUPRBIOS/N/X/E 4 Creat relocate CP/ usin patche MOVCP͠ a pe Digital Research note. MOVCPM 59 * SAVE 34 CPM59.COM 5) Integrate the new BIOS and CP/M into the CPM.SYS file. DDT CPM59.COM NEXT PC 2300 0100 -M980,1F7F,10 (Mov th CC an BDOӠ t 100Ƞ) if using an offset .COM file (better alternative!) -ISUPRBIOS.COM -R1600 i usin .HE fil (bes t avoid calculat th offse t mak the .HEX file load at 1700. Load address = E600H, offset =1700H-EA00H = 3100H -ISUPRBIOS.HEX -R2E00 .pa Mak sur yo rea th BIO i correctl - 1700 shoul b th BIO jum table. -G0 A>ERA CPM.SYS A>SAV 34 CPM.SY (I yo hav modifie th BIO yo mus sav howeve man page ar necessar t includ th BIO i th .SY file Ther ar 22 pages to the CCP and BDOS portions of CPM.SYS) Th ne dis shoul b bootabl i i ha ha th loade SYSGEN' on it.  Creatin bootabl SUPERBIO dis fo customer wh alread ow CP/M 1 Patc you cop o MOVCPM.CO a describe i th attache Digita Researc Note Thi i necessar becaus th SUPERBIO use secto blocking/deblockin algorith (differen tha th Digita Researc algorithm tha use th director writ cod i t flus dis buffer afte fil closing. 2) Make a copy of your SUPERBIOS distribution disk to work on. Do PIP B:=*.*[vo] then use SYSGEN to transfer the loader. 3 Pu th cop o o th SUPERBIO distributio dis i you secon flopp driv (B:) an you curren CP/ syste dis (wit th patche MOVCPM.COM i th firs flopp driv (A:). 4) Run MOVCPM and DDT to create a system file. A>MOVCP 61 61 i th norma syste siz ) CONTSTRUCTING 61K CP/M V2.2 READY FOR "SYSGEN" OR "SAVE 34 CPM61.COM" A>SAVE 34 B:CPM61.COM A>B: B>A:DDԠ CPM61.CO Us you DD t brin iCP/M ) NEXT PC 2300 0100 -M980,1F7F,100 ( Move the CCP and BDOS to 100H ) -ICPM.SYS -R1600 ( The CPM.SYS file has the BIOS image ) -M2D00,3700,1700 ( Move the new BIOS to 1700H ) -l1700,1702 ( Make sure move went OK ) 1700 JMP FA00 -G0 ( Exit and save ) B>ERA CPM.SYS B>SAVE 34 CPM.SYS 5 Yo no hav bootabl syste dis equivalen t thos sen to customers who have purchased CP/M from Advanced Micro Digital. (COPYRIGHT (C) 1982, ADVANCED MICRO DIGITAL o&)__> ?> ?F~?#VOͦ|{ 22=2~2w2=2! $'**j! "͒>!4(QN͖:( y.[DM͚2: 8!AV7 F<2:(͢͞(:(:w1!V:] (J\Ͱ< !Qw2|! DM͚\ͫ [T!Qw2i!]V!zQ7 (02Ab F!V7 F2͵!V!Q7 (E20Ab !Q7 )F:2 :] (:k2~ >2͵!VÿF!QADVANCED MICRO DIGITAL LDRGEN VER 2.1 for the Super Quad Z80 SBC with eight inch drives Enter source drive (A-P) or type if in memoryPlace source disk in drive and type Enter destination drive (A-P) or type to rebootPlace destination disk on drive and type Physical error in disk operation - type to continue, anything else to quitLDRGEN successfulBad drive specification (A-P)Can'nt open file: Error in reading file: >o:~W!{> " OC > S>O:31!2|}N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*KB0KC:( [0!'}#"* (,*#"+))[R#}! !!Ax͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(#~W#:G)[7?K R0! !;NFx(ENF C$7?KnfB8C[0MD!' {:m!;!NFnfB#>,(0W}_nfRut;RDM!A76! [36:G6!w0 ͖!2͖ !͗>O3F#Nů  SYS: Which .SYS file to load 0 = CPM 1 = OSLOAD ? SelectReadFile not found error: file *+":*+"/:*+"^:*+":!":"5:"d:":!":"7:"f:"::8*9:8=o&))8  ^#V!q;p+q!r;6>!r;2*r;&;) p;3>L ~ÒÃG3x(OxAG:xG~ > 2v:nO y~ 8 q!*z~(ͭ8͏ͷ:q2t>2>2yKc> 2v> :yG /_~(!` *k:t{  _!c(  :v= L{((ZZ:nhZ:thZ:xhZZ>2v ~ ( w:q2rF8 <2ty2x:qW:j*mKoB(7:rGz?"|*m"o:qG2rxG![k2jG!> z{2n2xw<2q*k!` "kͱ"k: (8 ~Zd>w(>>w~Can't recognize density of disk in$Read$Write$Seek$ error on track $ sector $ side $ drive $ $!\6͂ !!y;6͂6 :y;- !Ͱ ͭ :s;:| :\:y;HZ !:]A<2\O>n !*y;&\ 6 ì !y;6:s;.¨ ͭ͂ڨ :y; ڟ !Ͱ ͭÌ ! :y;<2y;O!\ :s;w:s;0O> :s;02s;> :s;AO> :s;A 2s;>>!"z;͆ :s;<:s;]:s; HҀ :s;S¸ !96ͭ} :s;P !96 "9} :s;D !96 "9} :s;L "8} :s;M q!*z~(ͭ8͏ͷ:q2t>2>2yKc> 2v> :yG /_~(!` *k:t{  _!c(  :v= L{((ZZ:nhZ:thZ:xhZZ>2v ~ ( w:q2rF8 <2ty2x:qW:j*mKoB(7:rGz?"|*m"o:qG2rxG![k2jG!> z{2n2xw<2q*k!` "kͱ"k: (8 ~Zd>w(>>w~Ca!9"1s MODEM TRANSFER PROGRAM as of 05/14/82 FOR SUPER QUAD Z80 SBC by ADVANCED MICRO DIGITAL $ >2/2:X˜>2c:G cMʉ>2:ETTS}RD c::] >2/2A!">2h`sG:>2x^c VS^:`:/2`>2`[:ʙw#" Ž>:[:=̠>22 !:w#[:w#[>  x6#}l&)>o55+|!͏!\ i!3͏!l͏ͥ:, ʘ0 ++FILE DOES NOT EXIST++ 0TYPE "R" TO RETURN TO MODEM TYPE "A" TO RE-ENTER NAME: s}[NAcRʊØ;f0 ++FILE TRANSFER COMPLETED++ Ê0 ++FILE TRANSFER UNSUCCESSFUL++ Ê0 ++ TRANSFER CANCELLED ++ 6# 6 #”6#0 ENTER FILE NAME TO BE TRANSFERRED - C/R TO QUIT: *͜N*!333!~"hs##[shTsc[T[T:£>2:(Sͯҫ>B2>a=:] 4͐ͥP͐#2͎ : ö>a =2:>2l>B2=:] 4) ͩ Q:N:N0FILE OPEN, READY TO RECEIVE :>Y>Ca:y0CRC in effect Ñ0Checksum in effect ͒ ڣ͈͡ Ñ͹͈ =:0AWAITING NAME NAK P͸>a!5*\ i">a7 !]~a:~[8#>a:NQe>ua:X0CHECKSUM ERROR P͸>a>a!\͑:ʑ0AWAITING FILE NAME Aڑͣʡ7!]:0TIME OUT RECEIVING FILENAME ?w:~[>a#}é:Nya?!\͑:60CHECKSUM ERROR A6ä>a͋7>2(2ͮ!F^" !\7ͻ ڕ:fp*\ i"!4p!5d!F^":A>@2!6!+N!, 6 !+F# ~ # ~ "+# ~ :<2# ~ 6 *9~  # #~  "!8p \ȇ!o ~] #~+] i!e~w#~w\!\l i!u6B#6A#6Kl!l6\:\<} 2h:n  >2n !\o  ͇ :\2{ !o \ ͇ \< !{ \ ͇ \!o \ ͇ \<7E 2n =Ɓo&|  ͇ ] ͇ 2h2|>~# x‡ ɯ22: 0 AWAITING # *#͆0 (ͪ0H)}:) 2):  0 ++Switching to CHECKSUM MODE++ >C2>aÒ  { 7G:A :_ 0 xͷ0H RCD, NOT SOH _ >a:<2 ږ :ʆ :ʌ ʒ D ++ UNABLE TO RECEIVE BLOCK -- ABORTING ++ $: :_ 0 ++ TIMEOUT ++ :ͷN_ : 7: :_ 0 : 1 0++FRAMING ERR++ q :P 0++OVERRUN ERR++ q :n 0++PARITY ERR++ q _ :ͷN W / :ʫ :_ 0 ++ BAD SECTOR # IN HDR _ z2>2! w, : Q2 ^ :G:ʂ <• " V :I :_ 0 ++CRC err++ :l :_ 0 ++ CKSUM ++ ͈ Ò >a:ʹ 0 SEND # *͆0 (ͪ0H)>a:a:/a>2!~a, 2yaEza{a kG:)0 xͷ0H RCD, NOT ACK :<2 :A:F7D CAN'T SEND SECTOR -- ABORTING $:)0 TIMEOUT ON ACK )hs1Ҙ>aҥ> a0 ROUTINE CANCELLED >B2*#"}:+\<0FILES EXISTS -- TYPE 'Y' TO ERASE: s[}YcN\0 No file specified c\2y2 !F"#*!g": <2 : OF\! 2 !F"aDERROR WRITING FILE $xGP͋07>02O:Y:^:^:w:|:|Oƒ:ʞ:ʸ0AWAITING INITIAL NAK ͋Cʕø0CRC request received 2*"l"w"a]2 %!6#:4:R:2:¤:}!]_ii0 TRANSFERRED :\2!\͏:2\!i:}>2(2/2:ʾ:0 ALL TRANSFERS COMPLETED >C2>2):cN!Dh!l\i2|2h A A A 2A>(Aͷ>)A_> [> [Oa{_ ڐ |Ć{0A|ͷ}ͷ 0[:<ɯ20MULTIPLE ERRORS ENCOUNTERED. TYPE Q TO QUIT, R TO RETRY: sN}RQ~=A#1 ?0:>Q2Õ~#i*!\:]EMGTSʸRŸ:ø0 ++Bad Option++ þ:m 0 Re-enter PRIMARY option and file name only: *͜r:m >2>2/>2!"aO*ayO}o|g:|g}!o&"a*aT]*a|>!i!i>2n /2(:z0 PRIMARY OPTIONS: WRT - Write file to disk (from terminal mode) DEL - Erase present file (from terminal mode) RET - Return to terminal mode with no loss of data 0XPR - Toggle expert mode (Menu on/off) DIR - List directory (may specify drive) CPM - Exit to CP/M S - Send CP/M file {^Y - Toggle save on/of R - Receive CP/M file { ^E - Exit to menu T - Terminal mode (optional file name) { ^T - File transfer mode E - Terminal mode with echo { ^X - Cancel file transfer SECONDARY OPTIONS: B - Batch mode Multi File transfers T - Terminal mode after file transfer (memory save off) R - View what is received in file transfer S - View what is sent in file transfer 0 DEFAULT DRIVE: A[0 Command: *͜N,CPM\DIRRET*WRT7XPReDEL:,!yoڂrØÂz: ʂ5>2/2!͏Â:ʂ: ʂ* ,>2/2!͏Â:/2ÂF#p7SRTEM~ʘ#Á>#’7#wկ͇ h,[ ڪG#4+~#Qpx;#ê#G~w+xF6  x;ê4ê;> ;>;ê>#;> ;> ;àG>#;> ;> ;xʪ;Eê>;5ê> ;> ;ê> ;> ;F##> w#€ͬʊͤaڠ{Ҡ_*Ͷ** OM#^#6 x͊ 9  ͊ 9   9 x͊ 9 ͊#͞ ͞6# > q>q > q>qw#q:ˆ_@w# . w#Ê~*ʮ# ñ~*ʿ#ó6?#*!\!͏:l2:m sā͜2b͍~R~R#5ii0 | :<2No 0NOT FOUNDN>? !w#z!m i_!:ʨ@ïA20 DRIVE oDQRSVTDQRSVTBCFF0INVALID OPTION c: ++BAD LIBRARY NUMBER CALLED++ $LED++ $;--------------------------------------------------------------------------- ; ; SUPERBIOS implementation example - Memory disk ; ;-------------------------------------------------------------------------- nbanks equ 4 ;number of 16K banks available memory equ 16h ;SBC memory control port bnkslct equ 40h ;bank select for memory disk rambase equ 4000h ;bank address - 4000h recommended dirbuf equ 0F900h ;for standard system secbuf equ 0F980h ;use floppy deblocking buffer for two-stage transfer .z80 ; org at 0 code relative, control location at link time jp ramhome jp ramsel jp rsettrk jp rsetsec jp rsetdma jp ramread jp ramwrite ret nop nop ;no flush needed db 'RAMDISK ' ;module name for display in more advanced loader ramhome: ld C,0 rsettrk: ld A,C ld (ramtrk),A ret rsetsec: ld A,C ld (ramsec),A ret rsetdma: ld (ramdma),BC ret ramsel: ld HL,ramdph ret page 60 ; Disk tables for memory disk - see CP/M 2 Alteration Guide for details ramdph: dw 0,0,0,0 ;no sector translate dw dirbuf ;use dirbuf in floppy module dw ramdpb dw 0 ;no directory check dw ramalv ;allocation vector ramdpb: dw 128 ;128 sectors per track - each 16K bank is a one ;track db 3 ;BSH - use 1K blocks if <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 ;two directory blocks db 0 dw 0 ;no directory check dw 0 ;no system tracks ramalv: 2*nbanks-1 ;for 1K blocks ramtrk: ds 1 ramsec: ds 1 ramdma: ds 2 page ;------------------------------------------------------------------------- ; ; The 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 bank ; address, we must transfer through a secondary buffer. ; ;------------------------------------------------------------------------- ramread: ld C,0 ;read/write flag jr ramio ramwrite: ld C,0ffh ramio: ld HL,(ramdma) ld B,H ld A, 11000000b and B ;get two high order bits of address dec A ;if bank addressed at 4000h jr nz,onetran ;DMA address is masked by memory bank ld A,C or A jr z,dblread ;must do write through secondary buffer ld DE,secbuf ld BC,128 ldir ;move from DMA to secondary buffer ld HL,secbuf ;make onetran think this is DMA address ld C,A ;read/write flag jr onetran dblread: ld HL,secbuf call onetran ;read from bank to secondary buffer ld DE,(ramdma) ld HL,secbuf ld BC,128 ldir ;move from secondary buffer to user DMA ret ;A set to 0 in onetran page onetran: call bankon ;turn on memory 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 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 to read to user DMA dowrite: ldir call bankoff ;restore SBC memory xor A ret ;return with no errors bankon:  ;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) ;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 bit set at position (ramtrk) setbnk: out (bnkslct),A ;for boards with one bit per bank ret bankoff: xor A out (bnkslct),A ;turn of memory board ld A,00101111b ;turn on 4000h bank of SBC memory ret end  q :r(8 C s!0:0DM)) )oN$=3))g 08  2e8 :eYi  ʬP Ó @!s6#¹*f&"k:gG_!s}/o|/g#"ox/o&#"ms*o*mx*k:g> > G>G:e2e*hh:jWzY:g}|:e>P!s>Oy nڋ79+|2 *h:j_:g=WhKyYBx}|:e>  P Y PP P h7 +| Ó ( ʡYƐ'@'_ |P}P & 1ADVANCED DIGITAL CORPORATION HDC1001 Hard Disk Controller Formatter Select disk type from following menu *** Hard Disk selection choices *** 0 = ST503 ; Seagate Technology ST503 1 = ST506 2 = TM601S ; Tandon Magnetics TM601S 3 = TM602S 4 = TM603S 5 = TM603SE 6 = TM501  ; Tandon Magnetics TM501 7 = SA602 ; Shugart Associates SA602 8 = SA604 9 = SA606 10 = SA1002 ; Shugart Associates SA1002 11 = SA1004 12 = Q2010 ; Quantum Q2010 13 = Q2020 14 = Q2030 15 = Q2040 ? $ Invalid input try again. $ Which physical hard disk do you want to format. (0-3)? $ This operation will destroy all data on drive $. Hit return to continue or ^C to abort.$ Formatting. CYLINDER HEAD $$ Verifying. CYLINDER HEAD $ HDC1001 Error $ on Head $, Cylinder $, Sector $ Format completed.$Sorry, unrecoverable error during format.$ Operation aborted.$@12 SBC Z80 SUPER QUAD DOUBLE / SINGLE $ d DENSITY FORMAT PROGRAM vs 2.0$= >2à Enter Density, Single or Double (S,D) :$t D´ûS¹>N2 Enter Disk Drive to be Formatted (A,B,C,D) :$ >2AڹҹO2< Format System Tracks only ? (Y,N) :$ NUY22:²>2Ó Format Single or Double Sided (S,D) :$h SʲDU>2>2 Insert diskette into drive $ :A_: and press the Return key $   $ :> W2!>(6#>6#r#:w#s#6#6#> 6#>{=•:•+:w#6#>{S> ¨!!>  :z:l> :Gzl72:>2:G:!"!P>N:5zB;zB{ N*^{#"ʡ>6#r#:w#s#6#6#>N >6#>6#>NP%>N £!!>  ::=>22zMl> :lw# < Disk Formatting Error Disk drive Status : $  `RƐ'@'_IʋÀ Drive not ready$n l@lî Disk is write protected$ l:2 >P: SUPERBIOS distribution diskette contents: CPM.SYS i memor imag o CP/͠ wit th SUPERBIOS Customer wh hav no purchase CP/ fro Advance Micr Digita wil receiv CPM.SY wit th CC an䠠 BDOӠ zeroe out Se堠 CPMINSTA.DOà fo installatio procedure. USER.DOC give basi informatio necessar fo th operatio o CP/ wit th SUPERBIOS a wel a descriptio o th content o al th .DO files- CPMINSTA.DOC NEWSIZE.DOC FORMAT.DOC INTRFACE.DOC SUPRBIOS.MAC i th sourc fil fo th SUPERBIOS I ca b edite䠠 an reassemble i modificatio o th SUPERBIOӠ i desired Th堠 procedur堠 fo incorporatin砠 ᠠ ne BIOӠ i describe䠠 i NEWSIZE.DOC. FORMAT.COM i th SUPERBIO flopp dis forma program I wil onl ru o th SUPE QUA SBC bu wil ru unde th previou BIOS Interna detail o th disk formats are described in FORMAT.DOC. LDRGEN.COM i th equivalen o SYSGEN.CO i norma CP/ system LDRGEN.CO͠ transfer th SUPERBIOӠ col star loade fro sourc (usuall disk t destination Detail o th loade operatio ar i LOADER.DOC. FORMAT.ASM is the source file for FORMAT.COM. SBCBOOT.ASM i th sourc fil fo th col loade o trac zer sector one, which is brought in by the monitor PROM. SBCBOOT.HEX i th assemble SBCBOOT.ASM fo installatio i customized loaders. LDRBDOS.MAC i th sourc fil fo th logica (non-hardwar dependent) portion of the loader. LDRBIOS.MAC i th sourc fil fo th hardwar driver t mak th loade wor wit th SUPE QUAĠ flopp dis  controller. rmats are described in FORMAT.DOC. LDRGEN.COM i th equivalen o SYSGEN.CO i norma CP/ system LDRGEN.CO͠ transfer th SUPERBIOӠ col star loade fro sourc (usuall disk t destination Detail o th loade operatio ar i LOADER.DOC. FORMAT.ASM is the source file for FORMAT.COM. SBCBOOT.ASM i th sourc fil fo th col loade o trac zer sector one, which is brought in by the monitor PROM. SBCBOOT.HEX i th assemble SBCBOOT.ASM fo installatio i customized loaders. LDRBDOS.MAC i th sourc fil fo th logica (non-hardwar dependent) portion of the loader. LDRBIOS.MAC i th sourc fil fo th hardwar driver t mak th loade wor wit th SUPE QUAĠ flopp dis  CP/M MODEM PROGRAM DOCUMENTATION 05/18/82 Thi progra use th fil transfe routine writte b War Christense i hi CP/ fil transfe progra (V2. a o 8/6/79 an i compatabl wit hi progra i singl fil transfe mode Multi-fil transfer ar onl possibl betwee tw system runnin th progra describe below. This program has two functions: 1. Communication 2. Program transfer COMMUNICATIONS Th progra ma emulat termina o ech dat bac t sende (ac a computer). Terminal Mode - 'T' Option Th termina mod ma b calle wit o withou fil name I fil i specifie (i shoul b ne file) the anythin receive b th mode ma b save i memor an late writte o disk Th sav featur i toggle ON/OF b Control-Y colo (: wil b printe a th beginnin o eac lin whe memor sav i active Th colo wil no b transmitte ove th mode no wil i b save i memory. I fil i no specified the memor sav ca no b activated. I th memor buffe i ful (th buffe i fro th to o th progra t th botto o BDOS) th content ar automa- ticall writte t dis (bu th fil i no ye closed) Communication ma the continu wit th buffe reinitial- ized Th compute wit whic yo ar communicatin mus accep th X-O an X-OF (Control- an Control-S conven- tion o dat wil b lost. Whe communication ar over us Control- t exi fro th Termina mod an ente th Menu Th fil t whic yo ar  writin mus the b close b usin th 'WRT command I thi i no done al dat wil b lost decide no t clos th fil automaticall sinc ther wil b time whe yo leav termina mod an the decid t re-enter Thi ma b don whil i th Men b usin th 'RET command Yo ma re-ente Termina mod an sav i th sam fil a man time a yo wis a lon a yo hav no close th fil wit th 'WRT command. Whil i Termina mode Control- wil pu yo i Fil Transfe mode Thi wil allo yo t sen th content o a ASCIɠ fil ove th modem Thi routin doe n erro checkin an ther ar n protocol specifie betwee thi progra an th receivin compute othe tha tha i shoul b read t receiv dat vi th modem Control-ؠ wil cance th transfer. Computer mode - 'E' Option Thi mod echo dat receive b othe computer Onl on compute ma b i thi mod a on time Ther i n sav featur i thi mode Usefu i yo wis t communicat wit somebod runnin th termina portio o th program. File transfer - 'S' and 'R' Options Thes feature ar th sam a i th CP/͠ Mode progra writte b War Christense excep tha upo completio o th transfer contro return t th Men unles th secon- dar 'T optio ha bee selected I th latte case contro return t Termina mode Remembe tha i yo ar operatin remot compute usin timesharin progra (suc a War Christensen' "BYE") th remot shoul b instructe t sen o receiv i th quie (Q mod a secondar option Example o command fo sendin an re- ceivin ar liste below. Multi-file transfers Usin th (batch secondar option mor tha on fil an ambiguou filename ma b transferred T sen files us th primar optio "S an th secondar optio "B (alon wit an othe secondar options) T receiv th file bein sent us th "R primar optio an th "B secondar option File ma no b name sinc filename ar sen b th sendin program bu dis driv ma b specifie (o els th file ar writte t th defaul drive). Backup option Ther i byt a th beginnin o th progra (106H tha wil creat backu fil i fil o th dis ha th sam nam a th fil bein receive i multi-fil transfe (se MODEM.SET) I thi byt i se t 0FFH backu fil wil b created I i i zer th fil o th dis wil b delete befor th ne fil i received I yo ar runnin CP/͠ an fil o th dis i designate R/ o SYS backu wil b create whethe th byt a 106 i se o not. B carefu - i yo ar runnin CP/ an th driv o whic yo ar receivin ha a R/ fil wit th sam nam create b CP/ 2 th R/ fil ca no b accesse (found changed erased etc. b CP/ 1 Yo wil therefor hav tw file wit th sam nam whe yo ar runnin CP/ 2 T fi thi problem us CP/ t chang th nam o th fil tha i no R/O The us CP/ t d wha yo wan wit th R/ file. Examples:  Th sende enter SB B:*.CO t sen al th CO file o dis B Als specifie wa retur t termina mod whe done. Th receive enter R t receiv al th file bein sen o th defaul drive. Th sende enter th comman S ASM.CO *.HE B:M*. whic wil sen ASM.CO fro th defaul drive al th HE file fro th defaul drive an al th file startin wit "M fro th drive. Multifil transfer ma onl b don fro th menu I ma no b specifie whe th MODE progra i called I othe word A>MODE͠ SA *.CO wil resul i a INVALIĠ OPTIO erro message. Return to Menu - 'M' option When asked to select an option, 'M' returns to Menu. The MENU I th Mode progra i entere wit n option th Men i called Th Men give th choic o selectin th standar option a define b War Christense (T E R an S) Th Termina mod ha bee greatl expande a describe above Th "R an "S command mus b calle wit filenam o yo wil b require t ente th primar comman ( o R an th filenam agai (bu NO th secondar options) I yo wan multi-fil transfers the th "R optio doe no nee filename. REԠ - Yo ma als ente termina mod usin th 'RET command bu n dat wil b save sinc fil ma no b name wit 'RET' Us th 'RET comman t RE-ENTE Termina mod afte i ha firs bee entere wit th 'T option I thi i done yo wil stil b abl t sav th communication i yo wer doin s befor yo exitte th termina mode. WR - Th 'WRT comman mus b use afte leavin Termina mode Thi write th las buffe t dis an close th file Failur t us th 'WRT comman result i los o al dat an fil o lengt zero. DE̠ - Th 'DEL comman erase th mos recen fil accesse i Termina mode Usefu i yo decid afte communication tha yo don' wan t sav informatio jus gathered. CPM - The 'CPM' command reboots and returns to CP/M. XPҠ - Th 'XPR comman i toggl whic cause th men t b printe o no printed Initiall th men i o unles th progra i calle wit th "X optio (ie A>MODE ). DIҠ - Th 'DIR comman list th director o CP/͠ disk driv ma b specifie (ie DI B: o th defaul driv wil b listed Afte th director i listed th men wil no b printe whethe XP mod i o o off I XP mod i o an yo wis t se th menu hi return. LISTING OF COMMANDS AND OPTIONS Primary options S - send a CP/M file (must specify file/s) R - receive a CP/M file (must name file unless B sec opt used) T - terminal mode (specify file if memory save wanted) E - terminal mode with echo M - return to menu X - used only when program is called to initially toggle menu off Secondary options B - multi-file mode for sending and receiving files T - return to terminal mode after transfer (memory save off) R - view what is received in file transfer S - view what is being sent in file transfer V - view what is being sent or received in file transfer T - Terminal mode (used with remotely controlled computer) EXAMPLES (fn = filename, ft = filetype) Send another file S fn.ft Receiv fil o drive vie wha i bein received retur t termina mod RRT B:fn.ft Sen al CO files n message o console SBQ *.COM Send two files from two different drives SB A:fn1.ft1 B:fn2.ft2 Receive files being sent by above on drive A RB A: Termina mode sav communicatio i file (i termina mus typ CTRL- t star save i men mus typ "WRT t clos file.) T fn.ft COMPUTER TO COMPUTER TRANSFERS T us thi progra fo transfe o file betwee tw compu- ter tha eac ar runnin thi progra an ar directl connecte togethe b a RS-23 seria lin i i necessar t b careful i connectin them Eac computer' sen dat lin mus b connecte t th other receiv dat line. EXAMPLE: pins pins /----------\ RS-232 CABLE /----------\ | |2____________________________________3| | | Computer | | Computer | | # 1 |3____________________________________2| # 2 | | | | | | |7____________________________________7| | \----------/ \----------/  SUPRBIOS loader operation Th SUPERBIO make us o syste fil loade t brin th syste int memor o col boot Th loade i allowe t b maximu o C80 byte long I th standar implementation th loade look fo th fil CPM.SY o flopp driv (tha is tha driv whic repond t th physica lin Driv Selec ) I th fil i no present th loade wil respon wit a erro messag t th terminal Otherwise th loade wil loa th syste fil int memor startin a som buffe locatio (normall 2000H) Th loade the determine th loa addres o th CP/ syste an blockmove i t tha address Th loade als fill i tabl i th SUPERBIO whic contain ma o wher o th dis th fil CPM.SY i located Thi informatio i necessar s tha th SUPERBIO ca reloa th CC an BDO o war boot Tha i wh yo mus no chang densit o th syste dis i i i  floppy sinc disk o differen densit hav th CPM.SY fil i differen places an changin dis density makes a warm boot impossible. Th LDRGE progra i th equivalen t SYSGE i standar system I transfer th oute trac onl fro th sourc dis t th destination Afte runnin LDRGEN yo mus transfe valid CPM.SYS file to the disk for it to be bootable. Customizing the loader: Th loade i .CO fil whic execute a 100H I yo wis t boo of dis othe tha flopp drive yo mus integrat customize BIO fo th loader Th BIO i org' a 500Ƞ wit standar BIO jum table an mus suppor consol outpu an al dis function excep writ (fo th singl boo disk). Sinc th loade i .CO file yo ca debu i b runnin th loade a norma transien progra unde you debugger Whe th custo loade i debugged i ca b LDRGEN' ont dis b passing the file name as a command parameter to LDRGEN: LDRGEN B:CUSTMLDR.COM Th loade sourc i include fo you use Th loagica functio o th loade i findin fil o th defaul dis ca b use t suppor loadin o syste file fro boo volum t volatil syste volum (e.g memor disk) Modif th loade s tha afte th syste i loade an blockmoved th coldboo routin return t th loader The rea th syste fil fro th boo volum an writ the t th syste dis usin BDO calls. g' a 500Ƞ wit standar BIO jum table an mus suppor consol outpu an al dis function excep writ (fo th singl boo disk). Sinc th loade i .CO file yo ca debu i b runnin th loade a norma transien progra unde you debugger Whe th custo loade i debugged i ca b LDRGEN' ont dis b passing the file Welcome to the SUPERBIOS Thi i onl a introduction Se th followin file fo additional information: FORMAT.DOC for detailed information on the disk format. CPMINSTA.DOà fo installatio o th syste fo user wh already own CP/M. NEWSIZE.DOà t regenerat th syste fo differen memor size. INTRFACE.DOC for information on modifying the BIOS. Generating a new system disk: Assumin yo alread hav bootabl syste disk eithe b purchas o CP/ fro Advance Micr Digita o b followin th steps outlined in CPMINSTA.DOC- Us FORMAT.CO t forma blan dis i th desire forma (Standar eigh inc singl densit disk generall don' nee refomatting) Plac you syste dis i A an th destinatio disk in B:. Run LDRGEN from A to B. Us PIР t transfe th fil CPM.SY fro t B Fo optimu performance CPM.SY shoul b th firs fil yo writ  t an syste disk Thi i becaus th syste mus acces thi fil o eac war boo (control-C) an th acces i muc faste i th fil i o th outermos track o th dis (file ar writen to a new disk from the outer tracks in). .pa Operation of the SUPERBIOS: Th SUPERBIO behave i genera a an norma CP/ system However yo mus no chang densit o disk withou doin control-C Thi i becaus th SUPERBIO check onl onc afte each warm boot to see what density each disk is. I general yo ma chang syste disk a an tim provided: 1) The system disks are the same density. 2) CPM.SYS is the first file on each disk. I yo wis t chang densit o syste disk yo mus reboot the system (push the reset button and type control-C). Printer Selection: Th SUPERBIOӠ contain cod t driv bot th paralle printe interfac an th seria interfac a th CP/͠ lis device Th distributio versio ha th paralle printe a th default Th defaul printe ca b change b patchin th byt i CPM.SY wit DDT (byt 1829 - se t fo parallel fo serial). Th syste display th defaul printe o col boot Th printe ma b change a an tim t th alternat b changin th iobyt a locatio 3 STAԠ LST:=CRT wil selec th alternate printer, STAT LST:=TTY: restores the default. NOTICE: A shipped th SUPERBIO ca suppor eigh inc doubl side doubl densit drive o th firs tw drive an ) I th thir driv driv i als doubl side doubl density the yo canno ru fourt drive I th thir driv i singl side doubl density the yo ca ru fourt driv if it is also single sided. Thi limitatio come fro th fac tha ther i n roo i th BIOӠ fo th allocatio vecto necessar fo fou doubl side disks I yo nee t ru fou drives o whic mor ths tw ar doubl sided yo wil hav t chang th SUPERBIO Allocatio Vecto t th sam siz a vecto 0 an generat 61K CP/M by the procedure outlined in NEWSIZE.DOC.  SUPRERBIOS internal interface specifications Th SUPERBIO i modular tabl drive progra designe for easy expansion and modification. Th firs tw memor page o th SUPERBIOӠ perfor mappin fro logica unit t physica drivers Thi par o th program will not normally need to be changed. Th logica t physica devic assignmen tabl i a 100 relativ t th star o th BIOS I contain sixtee dis entries fou consol entries fou lis entries on reader an on punch tabl entr consist o tw bytes Th firs byt i th hig orde byt o th addres o th devic handler Th handle module alway star o pag boundary s thi byt i sufficien t specif th addres o al th routine i th handler Th secon byt i devic numbe withi th handler Fo example har dis formatte a tw logica drive woul b addresse b tw tabl entries bot wit th sam addres bu with two device numbers (0 and 1, usually). Thi mappin syste make i possibl t reconfigur th system without having to reassemble the BIOS. Drive module com i tw flavors characte i/ handler (console an lis devices an dis handlers Eac handle module starts on a page boundary with a jump table. Character handlers: The jump table is : table+0 jp poll console character in table+3 jp console character input table+6 jp console character output table+9 jp list character output table+0C jp list status table+0F eight character ASCII name for module Th routine receiv exactl th sam paramter a describe i th CP/͠ Alteratio Guide I addition eac routin receive th devic numbe i A Th routine wil retur t their caller whatever the normal code for CP/M 2 would be. .pa Disk Handlers: The jump table is : table+0 jp   home table+3 jp select disk table+6 jp set track table+9 jp set sector table+0C jp read sector table+0F jp write sector table+12H jp flush buffers Eac routin excep flus receive th norma parameter passe accordin t th CP/ Alteratio guide Th writ routin wil receiv th deblockin informatio i describe i th appendi o secto blocking/deblocking (Se als th cod fo rea an writ i th flopp modul o th SUPERBIOS) Th device number is passed in A. Selec dis receive tw addtiona paramters O th firs cal t selec give dis afte war boot bi o wil b set I th selec i successfu (know b th selec routin returnin nonzer valu i HL) th bi wil b reset an bi 7 of A will be reset until the next warm boot. Selec als receive paramete i B i zer o entr t selec i th las dis succesfull selecte wa i th sam modul a th ne dis bein selected Thi informatio ma b useful in determining buffer flushing strategies. Th flus entr poin i use b th logica dis selec handler Flus i calle o th currentl selecte dis wheneve dis i differen modul i selected Thi i sig tha an share buffer mus b flushed Flus shoul retur i i th flus wa successful nonzer i a erro occured I flush returns an error code, the new disk select will be denied. DMA address handling: Unde certai conditions th BDO wil issu selec dis cal t ne disk an expec th previou DM addres t remai i force Therefore th Se DM addres BIO cal simpl store th valu a fixe locatio (F an F relativ t th star o th BIOS) You rea an writ routine wil hav t ge th DM address from this location before each operation. .pa Interrupt handlers: A th moment th SUPERBIO doe no hav an interrupt- drive code However futur release wil us interrupt fo typeahead har dis controller an possibl othe use a well Th us o th Z8 alternat registe se i reserve fo syste us ONLY Thi wil enabl improve performanc i a interrupt- drive enviromen sinc contex switchin wil b堠 fast Therefore w recommen tha an modification yo mak t th cod d no us th alternat registers excep i you interrup handlers. Ver fe CP/ program us th alternat registe set I yo us on o thos tha does w sugges yo includ fla byt t indicat t you interrup handler tha they mus sav registers Thi wil b include i th nex releas o th SUPERBIOS. Th SUPERBIO disable interrupt whe th CP i waitin o a INTR o DR fro th FDC durin see an secto read/write Interrupt canno b enable durin th secto read/write bu th see ca b rewritte t b polle i yo nee th CPՠ t sampl interrupt durin th see period realtim cloc usin 6 H interrup wi los tim durin dis access bu H clock should be OK. Example SUPERBIOS module: Th fil RAMDISK.MA i include a a exampl o modula dis driver I show th us o th dis calls an ca b use as is. ; ; Z-80 MACRO LIBRARY ; ; THE FOLLOWING MACROS ENABLE ASSEMBLING Z-80 INSTRUCTIONS ; WITH THE DIGITAL RESEARCH MACRO ASSEMBLER. ; ; INVOKE WITH "MACLIB Z80" ; ; ; ; MACRO FORMATS ; ----- ------- ; ; ; MACRO ZILOG TDL ; ----- ----- --- ; ; 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 ; STY 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 LDAI ; 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,NNNN LXI IY,NNNN ; LBCD NNNN LD BC,(NNNN) LBCD NNNN ; LDED NNNN LD DE,(NNNN) LDED NNNN ; LSPD NNNN LD SP,(NNNN) LSPD NNNN ; LIXD NNNN LD IX,(NNNN) LIXD NNNN ; LIYD NNNN LD IY,(NNNN) LIYD NNNN ; SBCD NNNN LD (NNNN),BC SBCD NNNN ; SDED NNNN LD (NNNN),DE SDED NNNN ; SSPD NNNN LD (NNNN),SP SSPD NNNN ; SIXD NNNN LD (NNNN),IX SIXD NNNN ; SIYD NNNN LD (NNNN),IY SIYD NNNN ; SPIX LD SP,IX SPIX ; SPIY LD SP,IY SPIY ; PUSHIX PUSH IX PUSH IX ; PUSHIY PUSH IY PUSH IY ; POPIX POP IX POP IX ; POPIY POP IY POP IY ; EXAF EX AF,AF' EXAF ; EXX EXX EXX ; XTIX EX (SP),IX XTIX ; XTIY EX (SP),IY XTIY ; LDI LDI LDI ; LDIR LDIR LDIR ; LDD LDD LDD ; LDDR LDDR LDDR ; CCI CPI CCI ; CCIR CPIR CCIR ; 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 (IX+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 SBC (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 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 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 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 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 RR ; 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 BIT 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+D) 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) ; 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,ADDR-$ JRNC ADDR ; JRZ ADDR JR Z,ADDR-$ JRC ADDR ; JRNZ ADDR JR NZ,ADDR-$ JRNZ ADDR ; DJNZ ADDR DJNZ ADDR-$ DJNZ ADDR ; PCIX JMP (IX) PCIX ; PCIY JMP (IY) PCIY ; RETI RETI RETI ; RETN RETN RETN ; INP R IN R,(C) INP R ; OUTP R OUT (C),R OUTP R ; INI INI INI ; INIR INIR INIR ; OUTI OTI OUTI ; OUTIR OTIR OUTIR ; IND IND IND ; INDR INDR INDR ; OUTD OTD OUTD ; OUTDR OTDR OUTDR ; RLCR R RLC R RLCR R ; RLCX D RLC (IX+D) RLCR D(IX) ; RLCY D 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 RRC 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) RARR 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 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 ; SRLX D SRL (IX+D) SRLR D(IX) ; SRLY D SRL (IY+D) SRLR D(IY) ; RLD RLD RLD ; RRD RRD RRD ; ; ; ; @CHK MACRO USED FOR CHECKING 8 BIT DISPLACMENTS ; @CHK MACRO ?DD ; USED FOR CHECKING RANGE OF 8-BIT DISP.S IF (?DD GT 7FH) AND (?DD LT 0FF 80H) 'DISPLACEMENT RANGE ERROR - Z80 LIB' ENDIF ENDM LDX MACRO ?R,?D @CHK ?D DB 0DDH,?R*8+46H,?D ENDM LDY MACRO ?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 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,?N ENDM LDAI MACRO DB 0EDH,57H ENDM LDAR MACRO DB 0EDH,5FH ENDM STAI MACRO DB 0EDH,47H ENDM STAR MACRO DB 0EDH,4FH ENDM LXIX MACRO ?NNNN DB 0DDH,21H DW ?NNNN ENDM LXIY MACRO ?NNNN DB 0FDH,21H DW ?NNNN ENDM LDED MACRO ?NNNN DB 0EDH,5BH DW ?NNNN ENDM LBCD MACRO ?NNNN DB 0EDH,4BH DW ?NNNN ENDM LSPD MACRO ?NNNN DB 0EDH,07BH DW ?NNNN ENDM LIXD MACRO ?NNNN DB 0DDH,2AH DW ?NNNN ENDM LIYD MACRO ?NNNN DB 0FDH,2AH DW ?NNNN ENDM SBCD MACRO ?NNNN DB 0EDH,43H DW ?NNNN ENDM SDED MACRO ?NNNN DB 0EDH,53H DW ?NNNN ENDM SSPD MACRO ?NNNN DB 0EDH,73H DW ?NNNN ENDM SIXD MACRO ?NNNN DB 0DDH,22H DW ?NNNN ENDM SIYD MACRO ?NNNN DB 0FDH,22H DW ?NNNN ENDM SPIX MACRO DB 0DDH,0F9H ENDM SPIY MACRO DB 0FDH,0F9H ENDM PUSHIX MACRO DB 0DDH,0E5H ENDM PUSHIY MACRO DB 0FDH,0E5H ENDM POPIX MACRO DB 0DDH,0E1H ENDM POPIY MACRO DB 0FDH,0E1H ENDM EXAF MACRO DB 08H ENDM EXX MACRO DB 0D9H ENDM XTIX MACRO DB 0DDH,0E3H ENDM XTIY MACRO DB 0FDH,0E3H ENDM LDI MACRO DB 0EDH,0A0H ENDM LDIR MACRO DB 0EDH,0B0H ENDM LDD MACRO DB 0EDH,0A8H ENDM LDDR MACRO DB 0EDH,0B8H ENDM CCI MACRO DB 0EDH,0A1H ENDM CCIR MACRO DB 0EDH,0B1H ENDM CCD MACRO DB 0EDH,0A9H ENDM CCDR MACRO DB 0EDH,0B9H ENDM 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 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 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 0FDH,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 ?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,0B6H,?D ENDM ORY MACRO ?D @CHK ?D DB 0FDH,0B6H,?D ENDM CMPX MACRO ?D @CHK ?D DB 0DDH,0BEH,?D ENDM CMPY MACRO ?D @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,?D ENDM DCRX MACRO ?D @CHK ?D DB 0DDH,035H,?D ENDM DCRY MACRO ?D @CHK ?D DB 0FDH,35H,?D ENDM NEG MACRO DB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,5EH ENDM BC 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 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 INXIY MACRO DB 0FDH,23H ENDM DCXIX MACRO DB 0DDH,2BH ENDM DCXIY MACRO DB 0FDH,2BH ENDM BIT MACRO ?N,?R DB 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 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 MACRO ?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 MACRO ?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 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,?N-$-1 ENDM JRNZ MACRO ?N DB 20H,?N-$-1 ENDM DJNZ MACRO ?N DB 10H,?N-$-1 ENDM PCIX MACRO DB 0DDH,0E9H ENDM PCIY MACRO DB 0FDH,0E9H ENDM RETI MACRO DB 0EDH,4DH ENDM RETN MACRO DB 0EDH,45H ENDM INP MACRO ?R DB 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 ENDM IND MACRO DB 0EDH,0AAH ENDM INDR MACRO DB 0EDH,0BAH ENDM OUTI MACRO DB 0EDH,0A3H ENDM OUTIR MACRO DB 0EDH,0B3H ENDM OUTD MACRO DB 0EDH,0ABH ENDM OUTDR MACRO DB 0EDH,0BBH ENDM RLCR MACRO ?R DB 0CBH, 00H + ?R ENDM RLCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 06H ENDM RLCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 06H ENDM RALR MACRO ?R DB 0CBH, 10H+?R ENDM RALX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 16H ENDM RALY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 16H ENDM RRCR MACRO ?R DB 0CBH, 08H + ?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 0EH ENDM RRCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 0EH ENDM RARR MACRO ?R DB 0CBH, 18H + ?R ENDM RARX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 1EH ENDM RARY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 1EH ENDM SLAR MACRO ?R DB 0CBH, 20H + ?R ENDM SLAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 26H ENDM SRAR MACRO ?R DB 0CBH, 28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 2EH ENDM SRAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 2EH ENDM SRLR MACRO ?R DB 0CBH, 38H + ?R ENDM SRLX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 3EH ENDM SRLY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 3EH ENDM RLD MACRO DB 0EDH, 6FH ENDM RRD MACRO DB 0EDH, 67H ENDM  SUPERBIOS disk formats Th SUPERBIO singl densit eigh inc forma i completel IB͠ standar 3740 Th disk shoul b readabl b an CP/ standar singl densit system Not tha th Advance Micr Digita forma progra fill al sector wit E5' i accordanc with standard practice. Som eigh inc singl densit disk fro othe system ma no b readabl a firs wit th SUPERBIOS Thi i becaus the hav od byte locate wher th doubl densit cod i suppose t be Th SUPERBIO interpret eithe 0 o E t b singl density anythin els (othe tha th SUPERBIOӠ doubl densit codes causin a error I yo ar unabl t rea supposedl standar singl densit disk tr runnin th SUPERBIOӠ forma progra wit th FORMAԠ SYSTE͠ TRACKӠ ONL option Thi wil fil th oute tw track wit E an no hur any of the data. Th SUPERBIO doubl densit forma fo eigh inc disk ha th firs trac o eac dis b singl density i accordanc wit IB͠ practice Al track o minifloppie ar doubl density Byt 7 o trac zero secto i cod byt (thi i th standar location) Ou code ar E fo singl density E fo singl side doubl density an E fo doubl side doubl density Ther i n doubl side singl densit format a ther ar n standard availabl fo suc disks. Doubl densit disk hav onl on reserve track Th sector ar 102 byte i length Eigh inc disk hav eigh sector pe track fiv inc disk hav four Th physica ske o th dis i thre fo eigh inch tw fo fiv inch Thes number wer chose t optimiz sequentia secto operation suc a progra loads sinc thes operation ar th mos sensityiv to the skew factor.  ,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # =!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m ʅ xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 34 CPM60.COM"$*|  CONSTRUCTING 60k CP/M vers 2.2$ ^=>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*1y{0!B0}y|zx0y0{00Ԁ\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ԯ2 Շ!۶2:2a{_:۷ʖ:۷>Ľʖ:=2–!B!6#5ʖ:۷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ַ"͌#>?͌͘ =_.:;<> Oօo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 3ׯ21y_͸2y2ͽ:Է1͘A͌>>͌92^ :۷¥.!_~#fow]٭ڎڥ!v"!çREAD ERRORçNO FILE^:۷ ! ~ 3#0 Wx x ր ւ G ~ # 3x~#B!Y~ɯ2:۷=!۾ý:۷=!۾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ٯw4!Y~ʆ͌†t=ʆf ^ T ٯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yڸpsp2mÆÆf ͧÆFILE EXISTS _: É: :۷ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ۯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !۶ Â$$$ SUBgܙܥܫܱ"C{2!"E9"1A߯22!ty)K!G_^#V*Cސ~E ,&-AGMSߛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :߷E B 2>: ߷b# : ߷y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ߾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ݯ2 H! >w_: ! ߾5ͤNkͱ¦ͱxʊ#Nx: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:页o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*鯆# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A߾#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:E߷ẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E߷͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!B߾w!>2*C~=2u:B2~2wE:A*C߶w>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2óadjmrux}çìûpñns ns<nskLns{?      60k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j>~ͻ>2!"2!"28!"9:O R![?boot  ç! y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>g yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈ:ʑw:2E**E}DQ>2óadjmrux}çìûpñns ns<nskLns{?      60k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j>~ͻ>2!"2!"28!"9:O R![?boot  ç!    !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLL