TD@bL^  MIC504 boot disk. BIOS v1.3 with utils and source *.mac filesfor selected programs. The v1.3 BIOS and sysgen source is inluded!hF1@>y>y!ia>y>>s@ .{%8,}>s@ }{8y>s@ >>>>= G = -"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6\X ©RIGHT (C) 1979, DIGITAL RESEARCH %x_͌> ͒> Ò> Ò͘~#͌ì _2<ܯ2 ( O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN#  ݇!2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!  x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD##͘*~ "޷"͌#>?͌͘ =_.:;<> Oޅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6"  2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*#~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3߯21y_͸2y2ͽ:ܷ˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^:ryx#*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*#  ! ~ 3#0 Wx x ހ ނ G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A#~$=2Ek͌qÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !  $$$ SUB$D *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwyxʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# # v vv vv vv vvvvvvvvv vvu w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ> yͺ!60> !6: !5 > !5( "> k@!"f @!"f:@2ͮ2:2!E"h `!Mvz ӝv~$OD#!+} ۜg{!+ۜ!GO ~28y(>G27>27!5!9!>>ӌ!BN#F#>2 2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26 "!4~8!6#6#6(++`!6#:w!6ͮ#w:g:(2!~F >ә6N͔`vZۀ !ۀ08 >2!ۀ08>Ӂ!ۀ00 ہw!4#:M:!>2:!O:8!4!F <2:n O2y!8 !4!2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{ )2!:_^#Vp!:_^#V *f"*h"*"f*"h^!|G!{"&o<:A2(;>.2:02#:!-(%>.2/:!9!͉:ɯ22/w#w 007!P͉:G!~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* R D# D D 007ODɊLG@   Multitech   BIOS Ver 1.3  2 63K CP/M Ver 2.2 $ BOOT ERROR ... AND DIE:):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2'n$ ERROR : DRIVE# , SIDE# , TRACK# , SECTOR# $HOME SEEK WRITEREAD * FDC STATUS $submit init  ,C,(H^  P`HH^  P`HF 3TDÿôwÅÙÞãôè^ͣ>Ә1>2ͭ!O͉2W^1> 22ͅ!,MDͣJ͙K͞ʹ(!5 !͉{$8 ͣ>2!"2!"222:O:gOuۋG>/:pOr:n(02  x >ә>F2>Ӗۉ>Ӗ*m~ (#"mɯ2n> :ʄOr>ӖۋW(yӉ>ӖۊG>/g(>ӕۈ>ӕ>ӕg ۊW(yӈ>ӕۈ g(ۈ : pr:0ʄr:ʄw(Q:gaw(ی>/>ӗ[VTN#F#>2"!4~8!6#6#6(++`!6#:w!6ͮ#w:g:(25 yӍیˇӌیӌ>ӗ>G_!4ۊG(ۈ(*{ ۊW(>ӈx(8>ӕۊW(yӈ>ӕ~(8w:>ۊG>>ɯ: 22!y2o))))oy2y2C`i{ ~o&$2>22>26$2y2 :2:2:2:2:(4=2:"!~F >ә6N͔`vZۀ !ۀ08 >2!ۀ08>Ӂ!ۀ00 ہw!4#:M:!>2:!O:8!4!F <2:n O2y!8 !4!2!:_^#Vp!:_^#V *f" ! ':! :! 4~!82!422<2!:F02!~6(%:! :! :!(*:(:2:2:2:(2!:g.<[: >2:(ɯ2ͺ!60> !6G !5 >!5(="> N*h"*"f*"h^!|G!{"&o<:A2(;>.2:02#:!-(%>.2/:!9!͉:ɯ22/w#w 007!P͉:G!~ D# D D 007ODɊLGvv vv vv vv vvvvvvvvv vvzED COM4ASM COM@ LOAD COM DDT COM& DUMP COMSUBMIT COM STAT COM)SDIR COMy vSYSGEN COMPIP COM:BAUDSET COM FORMAT4 COM!+DCOPY4 COMU"%&'()INIT SUB ASSIGN4 COM #$BIOSDE MAC*+,-./01 vQBIOSDE MAC23456789BIOSDE MACn:;<=>?@XSUB COMADCOPY4 MACLBCDEFEXERCISEMAC4GHIJFORMAT4 MACFKLMNOSYSGEN MACPQASSIGN4 MACRSTUVWXY vlG@ASSIGN4 MACZ[\]^_`aASSIGN4 MAC`bcdefg` vvvvvvvv 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!f6Z *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2dû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F *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*H)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+" :7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x !e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : !!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t  K=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*`#"`0-? >!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎ :*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- W! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :!: ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!! (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F”͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:"a6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: ڦ> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O"&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2"* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O! N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{.H+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ - ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq*22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~ :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 *#"*&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͢:!  vVe2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6 vR$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B!  v6F: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 I11*" COPYRIGHT(C) 1978, DIGITAL RESEARCH M b*FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "PҘ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&oM! á 4êü /L9ASMPRNHEX 1Ig_{_z#W H =+ LIB X$$$$$$$LIB.vv vd  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! ~*!) "  c8:  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖRU.![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*agP`!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ G{zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~͎*_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMI!)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1  :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 wCCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/#  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6y?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s! #:! 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 SOURCEl#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8n!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fkLTz'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂÃ)sn55)=â|g}o=î--#zg{ozg{ozg{ T OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A OcoÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#=ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅ R: 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!Ͱ>2lyPLnR>UX:l̅2l͓*>E a2C!" """ :ʼ:*1 |R|ͦ0FIL: R >( 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 "= !   R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2  P6Y: !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!? :|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ixq=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2gH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8OA 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#WVĽ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>SR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"v!* "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 @ 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 $HEXCANNOÃ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!ͷ  `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#   ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 z8O!B N#N ¾SP.* |} !9":q!" >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  O=!9 Ÿ!6q!2qC J R q!z z=naO $q$,!;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qy ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET 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 ANTx (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*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!Eâê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1*)*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI ͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"ceD$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I u$I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"Oa. ~ #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.V$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ /  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 {vv vv vv vv W 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*!9"1W͜Q>2!͢QG}DrYQ|͏}͏#> ex͏#r* _> e> e ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FI ͊!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\:=ʝLE PRESENT ON DISK$6 ҉0Ë7e}} :³ʳ7_<2!~ɯ2|\\FILE DUMP VERSION 1.4$ NO INPUT FIͧ!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!zv!6ͭ:}"!}5́ͭ́3*yM"h:}^a a2}O>Vͧ^:}>*z& ~ !z4í!{q*v#"v͙dͧ*vv :{w:x<2xO>}|ͧv\-!6]:ͧz2~e:~2O! 6*~& 6$>!~_z*~& w!~5Bx:yͧ*v+"vv ~_{ozg 001 $$$$ SUB vvRv *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*͠"v >!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M%*3 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 Characteristics6 k!+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 :25536: 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 S :2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM9tatus : 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 =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐ 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*(&͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!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Ͳ!_Aj6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r!<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)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)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*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqosr)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V"^K)*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*) on default and d: drive) sdir [rw] (find files that are read/write) sdir [ro dir sys] (same for read/only, directory, system) sdir [xfcb] (find files with XFCB's) sdir [nonxfcb] (find files without XFCB's) sdir [exclude] *.com (find files that!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*)  don't end in 'com') sdir [nosort] (don't sort the files) sdir [full] (show all file information) sdir [size] (show name and size in kilobytes) sdir [short] (show just the file names) sdir [drive = all] (search all logged in drives) sdir [dr w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2) ive = (a,b,p)] (search specified drives, 'disk' is synonym) sdir [user = all] (find files with any user number) sdir [user = (0,1,15)] (find files with specified user number) sdir [length = n] (print headers every n lines) sdir [ff] (print form f99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W peeds between headers) sdir [message user=all] (show user/drive areas with no files) sdir [help] (show this message) sdir [dir sys rw ro sort xfcb nonxfcb full] d:*.* (defaults)$ In User option$Illegal Option or Modifier$File Spec Limit is $Illegal GM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#WM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#Wlobal/Local Drive Spec Mixing$Only One Set of Options Allowed$Illegal File Spec$ in user loop $File Not Found.$1:|2:}2:.2:;P;\ P;G!Z;6R;.::V;:Z;½$ 44I:V;@V>44IØF!=";1;u 2:;*:;Mv*-;"];!"/;-;u 29;!+;6>-;6:t!\6?\ͷ 2a;!"_;:a;U*_;#"_; 2a;=*_;#DM͑&*_;) !D:t!+;6!,;6!"/;:9;::ҔP44*9;_;*/;_;ͨ9>::3;:+;/!,;H͞%!,;6!;6:8;,)m2-;u 29;*];"-;:9!<;/H!A;r+s+q+p+q*@;>w#6!"B;}2D;:?;!D;!D;:?;O*=; Ne>*@;!D;:?;O*=; ~0_*B;9͛9+s#r!B;9+s#r#4Ÿ>!G;sv]+p+q:G; *E;>9+s#r3 *E;*G;M! :9+s#r!I;p+q!J;6:J;!H;ͧ9>:Hq !H;:+s#r#4? :J;!L;p+q::җ R44*K;N#F'ͷ4*K;N#F4 2M;O>ҭ >!"N;>!M; *M;M!N;:+s#r*K;N;O:s#r:: f44*K;N#F'ͷ4N4*M;& p SDIR V1.0 Copyright(c) 1981 Digital Research Box 579 Pacific Grove, CA 93950 getnxt: vector = $ getnxt: vector, i, mask $ SDIR EXAMPLES sdir file.one (find a file on current user and default drive) sdir *.com d:*.pli (find matching files 9'ͷ4N4*N;'ͷ4:M;44IR;.::V;HF:Y;* *T;#~D*T;##~IHx >:9+s#r! *T;#~E’ >:9+s#r! *T;#~F *T;##~F¯ !7;6 *T;##~U !3;6 L! *T;#~H  ! *T;#~M !6;6! *T;#~N, *T; ~X >@:9+s#r) *T; ~S& !8;6) L! *T;#~PF >:9+s#r! *T;#~Sª *T;##~Yk >:9+s#rç *T;##~H~ !3;6ç *T;##~I‘ !3;6ç *T;##~O¤ !8;6ç L! *T;#~R*T;##~OH >:9+s#r! *T;#~R*T;##~WH >:9+s# !v;z*t;&*p;~"p*t;& *p;~"_*p;~!t;7*t;&*p;6 *t;& *p;"r;>!t;:t;=O*p; N:u;!t;O*p; NH*r;+"r;*p;~<:u;!t;=Oo:u;!Gr! *T;#~X > :9+s#r! LP;GC*T;#~Lz P;G:V; t *T;#*W;M4;}n >4;6:e LP;Gq Lw LC*T;#~U} ::ґ 44P;G:V;:: HҲ L:V;R;.:Hz *T;#~A*T;##~LH !"-;q :V;  @t;O*p; DM*r; -*t;&*p;~"0!v;q:t;<2t;}:t;=O*p; ~ X:t;=O*p; 6:c;bX!x;p+q!y;6*y;&*w;~*y;&*w;~a/*y;&*w;>z/HҼ*y;&*w;~ *y;&*w;w:y;<2y;n!;q:;0/>9!;/H!;q:;A/>Z!;/H:~;<2~;O8:W;Hn :W;$ *T;#~02[;D *T;#~0o&9*T;##~0_![;s:[;/>![;/Hh *[;-;k Lq LP;Gò C*T;#~D*T;##~R~IHH@P;G:V;· L:V;R;.:H=*T;#~A*T;##~LH !"1;71; *|; ~2;*~;& *|;~2;!;q*z; D:C:;<2;O*; :;w!;q!;6*;M/:;$Hi:;*;M*;MH:;_H:;$H:;!;/HҸ*;M:;<2;i*;M*;MH:;_H:;$H:;<2;ø*z; 6*z;9+s#r4*T;#~A/>P/H1*T;#~A_1;4LP;G÷ CL$ !Z;644I:: *. *T;# *:&9: -x *:&9: ~  o& 9:  ~ H *:&9:  6 *:&9:  6*T;~ *:&9:  6  :;w:;!;q*;M*;MH:;*H:;?H:;_H:;$H!;q:;!;w*;M !;:;H:;*:;2;*~;&";*;M Ҥ:;<2;Ì!;:;ڹ*;!~;s>!;6!;:;+?:;<2;¾*;!~;s*;M\y!;6> !; *T;~= *:&9:  Hq::<2:?44 dͷ4T4P;G>:ͣ9>:>:ͣ9>:HҀ>:9>9":>:ͣ9>:>:ͣ9>:HҺ>:9>9":> :ͣ9>:>@:ͣ9>:H:3;!3;6>@:9> *;&*;6 :;<2;:;:R:;A/>P!;/HL:;AW*;M:;$H:;_H:;*H:;?H/ҟ*;~Ÿ>P/Ҭ>:;.*;M !;6P/>*z; 6 *z; 6@y!;q*;M/>*;M9":::; *:&9:  6 *:&9:  6!:6>1;6:®!a;6::=!a;ګ *a;&9:  ~‡ *a;&9:  ::;w *a;&9:  ^1;:a;<2a;L !a;6::=!a;  *a;&9:  ~ *a;&9:  ::;H44*z; :;/H:;H?*;M*z; ~<*z; w:;H:;DH:;BHҐ*z; ~!;ҍ*;M*z; ~<*z; wÐ>*z; 6 y!;q:;\ʭ>:;\:;H*z; ~ H*;M*z; ~<*z; wð:;\:;}I:a;<2a;³>-;6:"@_-;buff = $ state8, char = $ state7, char = $ state6, char = $ state5, nxtchar = $ state4, char = $ state3, char = $ state2, char = $ state1, char = $!d;q*d;& ; ; ;!i;s+p+q+p+q!i;q>g;6:WlH:;\>*z; 6y:~;2;>y:;=2~;!;6 Ds ͞/s /s>y:;,:;)H:;HҪ*z; 6y,*z; >*z; wy> DO>*z; >*z; w*z; > *z; 6 y0*e;*g;Ͱ9!j;s*e;Ͳ9"e;PY! Ͱ9"g;>:!i;#~HFT!i;6:j;0O;!k;6# *k;& ~~!k;4h*k;& 6$ *k;& 6!m;p+q!n;6*n;&*l;~ ~ H!n;4è:n;!o;q:o;[:o;]H:o;(H:o;)H>:;,:;)H:;H6*z; 6y,Q*z; >*z; wy>:;i*z;Tq#py*z; 6*z;##q#py:c;ҕ+ *;M;:;¡T:;]:;,:;(H:;)H:;T͋:; :;,H :o;=H:o;,H:o;H.y>!q;p+q!v;6*p;#DM͝2u;O>x*p;~!u;:c;vO *;M;:;Ҕ*z;`q#p *z; 6yx2;Ң >:c;һa *;M;:;(`:;*z;q#p *z; 6yx2;>;:c;v *;M;:;T3:;!9w!9~,~ HE͝3!9~]Š:;(:;,H:;)Hx3:;…T3͋3!9~=™ͥ3>3:c;ҳ *;M;:;*z;q#p *z; 6y*z; :;wO>>2;>:c;  o&";*;~J&*;#";*;~ 4& *; ~2;J&ͽ!J&Ͷ#/J& 44 2;% Sort Stack Overflow $ Not enough memory for sort $!;p+q*;))))*;)) *;) *; *; !;r+s+p+q!;6> !; '*;&*;>2;*;&*;>2;H'!;5 *;M;:;):;H>:;1T:;=2; :;[M͝:; :;,H:;(H҇:;(€:;<2;͋͋:c;ҡ *;M;:;ҿ *z; 6*z;q#py:;(:;<2;ÿ*z; :;wO>>2;>:;  :;!;4&>!;r+s+p+q!<6*;";*;";:< )*<&)); ^#V";  ^#V";!<5;;):)*;";*;";*;*;:)*;N#F͑&";;;):x(*;)*;N#F͑&";*;DM*;;&'*;#";*;)*;N#F͑&";é'*;)*;N#F͑&";*;DM*;;&(*;+";*T:;)>:;(':;<2;͋:;[6͝2;D>!;p+q*;"z;*z;##^#V"|;*z; ^#V";!~;6!;6!;6 *z; 6*z; 6*z; ~*z;D:³2;& *z;D:͋2;& *z;D:͝2;& *z;D:ͥ2;& *z;`D:  ;)*;N#F͑&";';;):u(*;)*;^#V";*;)*;*;)*;N#Fq#p*;)*;*;s#r*;#";>!;A:u(*;+";Ë';;):;;):":(;;):(!<4n&)); *;s#r*<&))  *;s#r*;";);;): )!<4n&)); *;s#r*<&))   `2;& *z;TD:! T2;& !;6:;/7 *z; 6*z;##D:[ *z;##:~;͗9*z;##q#p!;p+q*;"z;*z;##N#F1*z;##N#F*z;##q#pc*z;q#p Out of Memory $ !;p+q*; ";*;##N! :9";ͮ !ͥ 2 v*;s#r*;";W'+':<&)W&44+)!;6*;";>;6:B);;)::!;D:a)p&44!"<*;+!9!;/H!;r+s+p+q*;;͋9s#r*;.:a!*;.:+s#r*;N#F+q#p7!!;r+s+p+q+q!;6:;=!;ں!*;&*;>*;&*;>H~?Hҳ!>!;4v!>*;>2;!9;!:+;!>!";*;;*-;;ͨ9>:!>>- Update $ ------ -- --M$ Access $ Create $Sys$Dir$RO$RW$Read $Write $Delete$None $ s$Directory For Drive $ User $: $k$Illegal Format Value$Total Bytes = $ Total Records = $ Files Found = $ Toy;6:2":;!,;>-;6:H2"*;/;!;6::=!;" *;&9:  ~::;H" *;&9:  ~•">:ͣ9>: *;# *;&9: b!">:ͣ9>:!;47">:ͣ9>:!;6!;6> !;##:;2;tal 1k Blocks = $ Used/Max Dir Entries For Drive $File Not Found. $ $*; ^#V <͗5 *; >A:q+ <͗5*; #<5*; ^#V")<*; ~2+<)<5)<&<5*; >ͤ9>:+&<͗5*;#DM_4N4*; N#F'ͷ4k$4N4*; DM)5N4,"#*;&*;>!;w":9;!;wwO!< ";O!< ^#V";!;6>;6::;/Hң#*;*;> *;#*;#b!Hҋ#!;6à#*; ";*; ^#V";C#>;6:²#>>"R$.*;;9:#>*;";";*;#";. *;#*;# -#*;>  *; ~,U*44,Y*44N4 *; ~4,]*44:,`*44N4 *; ~R,A$4U,N4*;#~g,1$4j,N4*;##~},2$4À,N4*; ~ҕ,3$4Ø,N4*; ~ҭ,4$4ð,N4*; >A:~-N4*; ^#V"; >,c*44-*; >@,j*44-*;w *; >w#6*; w#6*; w#6*; w*; w#6*; w#6*;*;s#r*;>$*; ;.:":y$> ;.:+s#r.*; *; -˜$ *; *; w*; *;s#rÛ%*; *;  *; *; ~O`i :n&͗5 *;*; > -q*44-x*44N4*; ~*; ~HO-*; DM:9U-*44N4N4*;~*;#~H~-*;DM:9:7;Ҏ- $4Ø-:/<ژ-T4*44::;AO$4:$4:: -*44*9;& ͷ4T4!"-:'.*-<*4;Ͱ9>  *; ~*; w!;6*; >A:'%!;6!;6>!;ڛ%F%:;!;w,%Û%*;&*;n&";:;x%*;& *;~;9+s#r>;6:ʘ%*;  *; !8%>*;";!;6>!;%*;&<) >w#6:;<2;©%*"; !;6!";";!\6?\ͷ 2;:;V&:;:.T4-T4.T4*-<#"-<::;AO$4*.N4*44*0:Hu.>:2<ր::4<ͣ9>:HҜ.>>!6@ *; *; ~`i/H?/ͽ!?/*;#DM͟.?/*;#DM- 27<.!:<6:;Ң/::<ڟ/;8<):ґ/*8<)*;N#F͑&";*8<#"8<*;:9;2:<Ü/*;";!:<6U//::;!iA:> :ͣ9>:H+D:>@:ͣ9>:HH*;#DM͟.Hz0I+*;#DM-*; N#F'ͷ4*44I//!,<6;;):ʅ1*;#DM͟.1*<*,<&Ͱ9>:l1*-<*4;Ͱ9>:_1T4-T4)44:;/*;;9:H;8<):!; "~<*|<"Y< "[<*Y<~~H69"8!]<6͠899I! !<ڈ9*<& < N$4:<<2))덑o|g9 =·9^#V))) DM!>))9 =9_{ozg_oH1N4)44T4)44:;/*;;9:H;8<):!;HP1N4)44T4*-<###"-A:> :ͣ9>:H+D:>@:ͣ9>:HH*;#DM͟.Hf2*<#"<*-<*4; `g^#V) :^#V|g}o :_{ozgi`N#Fogo&og_{_z#Wi`N#Fog9B3D444D11813DE6 :103A5000E10A1203132DC2513A01803CD921FC :103A60009D3D36003E0D219D3DBEDA883A2A9D3DA2 :103A700026000106000901803D094ECD24353A9DFE :103A80003D3C9>:P2T4-T4)44)44:;@323*4492D*44T4)44 *44*-<##"-!3;Ҵ2*44I*3;M!3 ^#V.3/3:;> :ͣ9>:>@:ͣ9>:H 329D3DC2643AC969604E23461A816D :103A90006F13881600EB1A856F131A4C :10\C9EB5F16EB1AA56F131AA467C9E0 :103AB000444D2100003E10F52EB9729EB8D916FC5 :103AC0007C986713D2C93A091BF13DC2B73AC95E67 :103AD0002356EB29E52929C109C9444D2100003E9F GH3́03͆13222>!4;6:*-<4;9:H!7;f3 $4 $4l3T4T4*44 <)5k$4*44 #<)5*44*<ͷ4*44&<)5+44::;AO$4:$4N4*;ͷ4/$4*; N#Fͷ4><6:4:6; 4 :103AE0001029EB29EBD2E93A03DC2E13AC95F1648 :03AF000007BB56F7AB467C9EB5F1600EB1AB56F40 :103B0000131AB467C95E2356EB290DC2093BC95E7F :103B10002356EB7CB71F6 0T4-4+44 #4!<6:7;#4F+44!;!@<ڋ4*@<&*><>O$4!@<4j4 $4!@<6> !@<ڶ4*@<&*><>O$4!@<4•4!EC<6:(5*A<*C<Ͱ9!F:!+@ C95E7F :103B10002356EB7CB71F6 0E<#~H5N4%5!E<6:F<0O$44!J;6:HO7:h<=:h<*i!mJìA8E8J2JO C> 2p ^#Vkw:AO! IMD$JK!'(!p5 AJÑ{$8 JJO CA8E8J2JO C> 2p ^#Vkw:AO!  : 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$IMD$JK!>O*(!p5 XJ+{$8 æ{  SYSGEN VER 2.0$ SOURCE DRIVE NAME (OR RETURN TO SKIP)$ SOURCE ON THEN TYPE RETURN$ FUNCTION COMPLETE$ DESTINATION DRIVE NAME (OR RETURN TO REBOOT)$ DESTINATION O 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^N THEN TYPE RETURN$ INVALID DRIVE NAME (USE A, B, C, OR D)$ $ ****READ ERROR****$ ****WRITE ERROR****$OĒ7 #~@w ~Īwy,'(J;LID DRIVE NAME (USE A, B, C, OR D)$ $ ****READ ERROR****$ ****WRITE ERROR****$OĒ7 #~@w $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 v  221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! v-:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>vNHHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >vRͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*vz!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: (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)͔: :ͳ.!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 :[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ A! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q   w÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 ! :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ͣ :] r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\\:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z! {-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!/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:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6ͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ 2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'c*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!t!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H> *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>:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_! *M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇gb' !'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 ©=¨' v v v v v v s10d!>w#-^>28>29!":@j2@A-A-2;jjY(x<{>ә >2=Ͱ.!=>' 4~!ݾ8>2<>2<>2>!"f!E"h̀Kaͦ !7v :>( !~     21*>252>2Y 15952 :=sg = >†=‚:±:¨>Ӆ>Ӆ>ӆ>ӆ:>GӅ>Gӆ:_!:~Ӆ~ӆ *** Baud Rate Setting Program 829ӝv*f"*h"*"f*"h*8"*:"*"8*":!7:=w#:<w#:w#>w!1>Mw#w#>w#>w#> w#>w!1!>ww:=w!ͦ!v;ۀ ۀ08 >G!8"! ۀ08 >Ӂۀ00ہw#: M:<!;  zVer. 1.2 ***$ Select a PORT... <1> RS232 <2> Console ( 1 or 2. ESC to exit )$ Baud rate...... <1>110 <2>300 <3>600 <4>1200 <5>2400 <6>4800 <7>9600 <8>19200 ( Select a NUMBER or ESC to restart )$@   ==> Baud rate of port P! x+} MIC-504 system format vers 3.0 $ Drive name ? (A or B. ESC to abort.)$ Press Y for starting format. (ESC to abort.)$ end of MIC-500 formatted $ 40 tracks formatted $ 80 tracks formatted $ $P     A have been set to $ 110$ 300$ 600$1200$2400$4800$9600$19200$ $ <3>600 <4>1200 <5>2400 <6>4800 <7>9600 <8>19200 ( Select a NUMBER or ESC to restart )$@   ==> Baud rate of port m >2\:? >2]:? 2]:? >2]:? (>(:=/o::? }2=2Y:? >2s formatted $ 80 tracks formatted $ $P    ing format. (ESC to abort.)$ end of MIC-500 formatted $ 40 tracks formatted $ 80 tracks formatted $ $P     v v v v > v  Hk+-!,-,REPT/IRP/IRPC/MACROUnterminated -!&--> > :7=<> NG> NG!,w:7=12E2j*+ͷx2E*Fͷx2jͫKͫͱʓ2A8(02ͫͱʓ20(8 8 2:(! >2:!s=( :O ^#V^#V{ʜ:!T(( = (:Os#r*+}^Š|ʊ*F}^Š|ʊ!"&22 e1N^>28>29!;":kkpʍA!!2 kpʍA802!kp(+Y :!2k͖DdkEk>әz>2[2:!2Y2![4~8.u![~2! ݾ8k>2!5 k>2Z>2Z5 >  >!w *&"&:<8:<8:S(; ^#V>!= !>!= ͫ22ۜ_( ^#V!g>w#w#w#wͫͫ:O6#6 1}^ |9TR-A!v!v!"f!E 82\!"f!E"hC!Uv :\( !~2Wӝv>2[:!2: 22Y>2b+: 2Y͏(:b+= k:!2Y͜ !![4~8.u![~! ݾ8k:!2Ì*f"2*h"4*2"f*4"h*8"6*:"8*6"8*8":  "h!  *&v ӝvdۀ ۀ08 >2%!ۀ08>Ӂ!ۀ00 ہw!%4#:M^>G!1"H^  P`H$T? (p$R(0"? (p"-? (0 !U:[w#:Zw#:w#>w!O>Mw#_w#>w#>w#> w#>w!O>2<2:2u:<28>22:2u:<28!"f! !v ӝv!"f>2 !"f>2:[2:Y2 !!b$v{ ӝv!v[F Ē? >2^:? 2^:? 2\: F(?P(p(H? (pH(? (q((^ P(p(@  (p@         !"#$%&'H^ O  MIC-5 ? >2\:? >2]:? 2]:? >2]:? (>(:=/o::? }2=2Y:? >2:? 2:? >2!:b&2!:z’:*; {=ʒҒ<2 :gkb&z’::{X) ܒ:*; X){2a:4T ’:;u)>!;w::"n:H,a):[:¶ *u:+Jʧ)ƔK !">w_w s04 system assign utility ver 3.0 Drive A is currently set to TYPE . Drive B is currently set to TYPE . TYPE COMPUTER MODEL SIDES DENSITY <1> MIC-504  2 DOUBLE <2> MIC-501  1 DOUBLE <3> XEROX 4:[w!"!v.ۀ ۀ08 >G!8"!+ۀ08 >Ӂۀ00ہw#:+M:Z!Y ! x+} MIC-504 system copy vers 2.0 $ Source drive name ? (A or B. ESC to abort.)$ Destination drive name ? (A [820-I $ 1 SINGLE <4> XEROX 820-II 1 DOUBLE <5> OSBORNE I " 1 SINGLE <6> OSBORNE II K1 DOUBLE <7> TELEVIDEO 801 2 DOUBLE <8> KAYPRO II  1 DOUBLE <9> MORR ,or B. ESC to abort.)$ Press Y for starting copy. (ESC to abort.)$ DISK COPY IS ABORTED !!! $ end of MIC-500 copying $ 40 tracks copyed $ 80 tracks copyed $ $ *** A FAULT IN THE SOURCE DISKETTE *** $ *** A FAULT IN THE DESTIATION DI OW DESIGNS 1 DOUBLE NEC PC-8001BMK II 2 DOUBLE $ Which drive will be assigned ?(Press B, C or D. ESC to abort)$ Select type ? (Press 1,2,3,4,5,6,7,8,9, or A. ESC to abort)$  Drive is now set to TYPE . $ ASSIGN WAS AB  SKETTE *** $P     !b:44!2-w!=<>8,*:|,́:7=<2;ā2;,!,-!,-*:|N,>,H:7=<>,NǴ:7=<2;ā2;!,-,\,"H*;|t,d,Hͮ:=ʋ,>H;H{HNo Fatal error(s) Warning(s):;G lORTTED!!! $F & 3:ük`U*/4E\9>Ә^1> 224!,MD4J*K/E(!5 !d 2 {$8 4>2!"2!"222:O:OۋG>=:#O0  x >ә>F2ۉ:-OۋW(yӉۊG>=(ۈ ۊW(yӈۈ (ۈ : #:0-:-w(  .5 "u: . .5 ...Ͱ ´..Ͱ ... ;//8. 7 /88 / /+8"<7 7> y77:.!1!1?*G_!4ۊG(ۈ("{ ۊW(>ӈx(8ۊW(yӈ~(8w:w(ی>/:>ۊG>>ɯ: 22!y2o))))y2y2C`i{ ~o&_2>22>2_2y2 :2:2:2: ;0%0,0 0 0;0!( 1w+ /"00b&:*; 0: :w0W0PX D0|B0>:ï0)0͛0>)d00͛0=`00D͇0E͇0 >0ï0x͐0x0:ڛ0 ¯00O:گ0>0ͯ0y*0w+"0 2:(4=2:! ':! :! 4~!82!422<2!:F02!~6(%:! :! :!(*:(͓:2:2:2:(_2!:g.<[: >2:(ɯ2͓?!6j> !6 !5 5 *00Ow+ 0 10w+ 0/0w+00000{=*u:+~ 5 5 00!:͂ 41#6 +͇.&̇.:ʇ.! Y1iÇ.!c1h ?Stack overflow, try more P switches b&:*; ʘ1" Q1T :T  >!5(=\> ?!6j> !6 !5 > !5( \> ͤ{!"f {!"f:@22:2!E"h ͛!͈vz ӝv~O#! x+} I>2\!4~8!6#6#62++͛!6#:w!6#w#:g:( -1w:y7 1ɯy77!*<*ә6N$͛v͕ۀ !ۀ08 >2!ۀ08>Ӂ!ۀ00 ہw!4#:M:!>2:!O:8!4!F <2:n O2y!8 !4!2!:_^#V!:_^#V *f" :":È&:<#~>&!ɷG-"<Ͳ/O:*; 2*<-y6+,Ē53( <Ēw+:*; 3GC3/ ʍ3>ʐ3$3" <2< 3 ʆ3:€3ʐ3À3À3 w+C3:<36+w-xĒ"<&i"<3å1>21 *h"*"f*"h^>G!"&o:A2(;>,2:02:! (%>,2:! !&:ɯ22w#w 007!:G!~SS #   007O BOOT ERROR ... AND DIE: *<>2<91͑-3 .;.'3"3͇.3G- .33"2<"<͂ V4: NG> NG:*; ? ʒ ^ ERROR : DRIVE# , SIDE# , TRACK# , SECTOR# HOME SEEK WRITEREAD * FDC STATUS N&DAp\4jwT5PkH^  P`HH^  P`HH^  P`HH^ 2+)x-8_ <:&2<Ç.&.:<.>&y72<*<~T.;I.O+I. 9.x+~I.+.:<*<~ʅ.;z.O+z. l.x+~z.^.<*u:T &..G~# ʥ. ­..Ù.x.G .& n;͞6";:;2;? !w#w6c7s#rh7"<*<6s#r{_*<{6*<w{ʕ7̟7"<{_6z6*<}  77}o~Ͱ7{7̟7{_6{ȯw#w*<s#r6*<6q#p*<{8*<"<~{_6{_{78̟7*<*{<:} H>*>M>C>U  EFS 4 T_INT: DEFS 4 TEMP: DEFS 20 T_SP: DEFS 1 FO_CMBF: DEFS 6 FO_DABF: DEFS 4 HSTDSK: DEFS 1 HSTHEAD: DEFS 1 HSTTRK: DEFS 1 FORM_SC: DEFS 1 MT_MFM_SK: DEFS 1 CON_BUF: DEFS 4 HSTDMA: DEFS 2400H TRYNO: DEFS 1 ; ; END  gHÃ9*n:#{G#^#V#^#V" ;""n:#~ H>IH!*;"(;k*(;6!*;w~G#^#VHE !<*tL]U|: END DEFS 1 00H  *** TE ***' ' rt.)'   P=DT4/Z $YB?Command error?File not found?Can't enter file~NG#OC!CiC!-CiC!=COCCCOMSCN -uC"=uCʿC:CG:CO*.µC# §CÿC µC =#c*c*   .;029C3'  8  5ÞC2uC*+++"=*=:=2=*=F:B C2=2 =2=2=2=2=2=2=<2 =2 =ZCů2=dE=GE= *D>2=!=;E> 2=2=2=y,2=TD:=2=dE=:=aD=GE=:=2 = 2 =~D:=@2=!7=;Ey=7dE 7GE=D 7!X=;E:=!=E!   DT4<":KKKKKMKLNKKdLnMKLK3M}ORpL ]UݗQAQBQCQD 7=:=D@==> =DE: =D: =D: =2 = _2GͅG͛G*=##: =2=G= ~5E5Ew# +E #+E w#>E:=!=~ bEw#XEͭF:7>ˆExdE7GOx=y©E[A@2=ԭFx ږE =E7GÝETE7GT77GY mQEQHQLQMbSPcPSWQIQR bBCbDEbHLbAFjIXDjIYdrNZqZrNCqPrPOrPEZDT4 REL p DT4 PRN DT4 MACLL T4 MA 7ÈELE7GS77GT7>ÈER77GD7R7>ÈE> F6 #=Ey.2=̭F=xF(F7GFy/y7GLAF2 =7GO)FNLF2=:FOWF2=:FRbF2=:FCpF2=2 =:FM{F2=:FI†F2 =:FX“F>2=:FZŸF2 =:FP7: =<2 =:F7G[F0 CRELCRFPRN-t -NKUA ՠij4pZ -^KXeSo8M&8 Ar0g1p*NG B> NG:B!B"Co>g6 #> w~# 7G 7G uG#"C_*C+~ #F#"C+~7ȷ> NG> NG>!">!7=: =îG=!"=!=:=G~  @Ұii4Zz 6GH H> H>H*>>7=ͮH>7=/H:=3E:=8H>=I*===ͮH==/H|}ʹHƀ   7)`i I> H> H> H: =3E:7=|I#">>w>!7=>J = I!=>!= I:=3E:=MG*=|=2I#"==w:X=<`GI*@|̅I#"@@sG@>X==ʮI!=ŠI!>êI zyr_!= I I H~II7ȷ!!JOC@@J> NG!'JOC{GDISK FULLG v - !-J:>J@PKw#2=.K!Kw#J2=.K!KK6 #K:=.+Kw#+KpQJ-JPK2MJ2NJ:NJ={KQJ-JڐK!QJ"OJ>2NJ*OJ~‹K7ÐK#"OJQ AQ BQ C v Q DQ EQ HQ LQ MMb SPLc PSWQ IQ Rb BCTb DEMb HLPb AFLj DIXj dIY{Lr NZq Zr 5NCq 5PLr ZPOr ZPEOD BOOT v E SPEED~MF INT_2_D 8I_1PLF CTC0INOF CTC0HIMF FO_COUnSE HEAD0E HEAD1JND TRK0PME OTRK96E 'TRK48E fNMI_PF OUTI_OF INI_OPNF ERETN_OQF SEKCMDF SE ; **^ ;* Filename: CBIOS.MAC Rev: 1.3 Mod Date: 861020.1235 * ;* Written By: D. English  * ;* Date: 9/86  * ;* Function: B #NINTOF MMFM_FOME MFM_NF MFM_GPF MFM_SCYNF FM_FO_ND FM_NF FM_GPLE FM_SCePF FORM_DE TCRESTF FDCBUS(RF FDCDATF FDCSTSNE SIOBDTE SIOBCF RCVRDYLQ Uasic I/O System for CP/M * ; ** ; ** ;* REVISION HISTORY: * 2F TRXRDYF POP_HLB JPF MOTOROOF PRTSTRD BDOS!OF CON_OUOF CON_INTE!STARTRD!NT_SP^OF!PUSH_NF!PUSH_ITE!;STSRDF!VERMSGPF!kPRTMSGD!!MAINOF!SORMS Q ;* Revision Change * ;* Old New Date By !Description of Change * ;*--9* ;* 1.0 1.0 082886 DE Added title and revisi GE!pCONINOE!MAIN5TF! SORDSKE!<MAIN1PF!DESMSGPF!!DESDSKED!!MAINOF!SORMSSTARTRD!NT_SP^OF!PUSH_NF!PUSH_ITE!;STSRDF!VERMSGPF!kPRTMSGD!!MAINOF!SORMS Ron block * ;* 1.0 1.1 090386 DE Changed signon msg and moved * ;* some routines. H* ;* 1.1 1.2 101786 DE Added IF statement for different* ;* TPI drives v /. I * ;* 1.2 1.3 102086 DE Moved directory and disk R/W * ;* buffers to end of BIOS.  * ; ** ; false equ 0 true equ -1 v  biosbas equ 0f200h ; BIOS entry addres bdosln equ 1600h ; length of CCP and BDOS ccplen equ 800h ; length of CCP cpmbuf equ 80h ; default address of disk buffer cpmbas equ biosbas-bdosln ; CCP entry address bdos equ cpmbas+ccplen+6 ; system ca , ll entry logdrv equ 4 ; addrress of currently logged drive reclen equ 128 ; CP/M record length romact equ 98h ; EPROM enable/disable address motoron equ 99h ; motor control address ; ; IOBYTE definitions ; iobyte equ 3 ; iobyte address iolist  3 = 96 TPI false = 48 TPI fdcbusy equ 10h ; FDC status byte constant trytrkno equ 4 trysecno equ 5 intreq equ 4 notrys equ 10 ; number of retrys for R/W sector maxdsk equ 2 ; maximum number of drives srthut equ 0d1h ; setp rate = 3ms head unlo  equ 0c0h ; bits 7,6 of iobyte for LST iopunch equ 30h ; bits 5,4 of iobyte for PUN ioreader equ 0ch ; bits 3,2 of iobyte for RDR ioconsl equ 3 ; bits 1,0 of iobyte for CON conport equ 1 ; console port constant ptrport equ 80h ; printer port cons  ad time = 16ms hltnd equ 28h ; head load time = 50ms Non DMA mode m_n equ 1 ; 1 = double density 0 = single density eot equ 18 ; last sector number m_gpl equ 0ah ; gap 3 length m_dtl equ 0ffh ; data length if N = 0 trk equ 80 ; total number o 1tant modport equ 0 ; modem port constant ; ; disk write type ; wrall equ 0 ; normal sector write wrdir equ 1 ; write to directory sector wrual equ 2 ; write to first sector of new data block ; ; LED address definitions ; modled equ 95h ; mo  f tracks/disk dogr equ 60h smsk equ 1 block equ 10H spt equ 72 ; total sectors/track rtrk equ 0 bytes equ 100h ; number of bytes/sector defspt equ 72 ; logical number of sectors/track defbsh equ 4 ; data allocation size (2048) defblm equ dem port LED conled equ 96h ; console port LED ptrled equ 97h ; printer port LED ; ; SIO address definitions ; siobd equ 89h ; console data port siobc equ 8bh ; console status port sioad equ 88h ; modem data port sioac equ 8ah ; modem statu  (0fh defexm equ 0 ; extent mask defdsm equ 350 ; total blocks disk can store defdrm equ 127 ; number of directory entries -1 defall equ 192 ; directory space need defalh equ 0 defcks equ (defdrm+1)/4 ; directory check sum defoff equ 2 ; num s port ; ; CTC address definitions ; ctc0 equ 84h ; FDC interrupt port ctc1 equ 85h ; comsole port baud rate generator ctc2 equ 86h ; modem port baud rate generator ; ; PIO address definitions ; pioad equ 8ch ; PIO data port A pioac equ 8eh ber of tracks reserved for CP/M ; ;machine code instructions ; outi_op equ 0a3edh ini_op equ 0a2edh retn_op equ 45edh nmi_p equ 66h jp_op equ 0c3h ; ; FDC command codes ; specmd equ 3 homcmd equ 7 senint equ 8 sekcmd equ 0fh wrcmd # ; PIO stauts port A piobd equ 8dh ; PIO data port B piobc equ 8fh ; PIO status port B ; ; interrupt vectors ; intvtab equ 0ff00h ; address of interrupt vector table ctc0int equ 0f0h ; lower byte of CTC0 int vector table ; ; FDC address defini k equ 5 rdcmd equ 6 sdscmd equ 4 ; fdwrng equ 10 fdrdng equ 15 fdskng equ 5 fdhong equ 0 ; ; *** ;* BIOS entry points * ; **Q* ; bios: jp boot jp wboot jp const jp conin jp conout jp list jp ations ; fdcsts equ 80h ; status port address fdcdat equ 81h ; data port address tcres equ 9dh ; terminate count address fdcint equ 9ch ; interrupt status port address ; ; miscellance equates ; etx equ 3 ; ASCII ETX ack equ 6 ; ASCII ACK xo  punch jp reader jp home jp seldsk jp settrk jp setsec jp setdma jp read jp write jp listst jp sectrn ; ;*** ;* Cold Boot * ;**U* ; ; enter here whenever the reset button is pushed ; Entry: none ; Exit: none n equ 11h ; ASCII DC1 xoff equ 13h ; ASCII DC3 cr equ 0dh ; ASCII CR lf equ 0ah ; ASCII LF esc equ 1bh ; ASCII ESC sub equ 1ah ; ASCII SUB space equ 20h ; ASCII SPACE vend equ '$' ; message terminating character mtroff equ 46h ; motor off z; boot: di ; disable interrupts im 2 ; set cpu to interrupt mode 2 call clrint ; clear FDC interrupts ld a,1 out (romact),a ; disable EPROM ld sp,cpmbuf+80h ; set stack ld a,conport+modport ld (iobyte),a ; set iobyte for CRT and LS  flag status byte mtron equ 4eh ; motor on flag status byte atobot equ -1 ; auto boot status flag byte pbufsiz equ 80h ; printer buffer size trxrdy equ 2 rcvrdy equ 0 strobe equ 0 ptrbsy equ 7 ; ; disk parameters ; dsk96tpi equ true ; true T devices call hdwini ; initalize the hardware ld hl,micmsg call prtmsg ; display signon msg xor a ld (logdrv),a ; set logged drive to 0 jr gocpm ; jump to CPM ; ;*** ;* warm boot * ;*** ; ; reinitalize stack and   FDC ; Entry: none ; Exit: none ; wboot: di ; disable interrupts im 2 ; set cpu interrutp mode ld sp,cpmbuf+80h ; initalize stack ld a,notrys ; get retry count ld (bootry),a ; set up retry count xor a ld (phyact),a call fdcinit ; qbc) bit rcvrdy,a B ; check if input character ready ld a,0 ; indicate no ret z O ; return if no character ready cpl ; else, indicate character ready ret  ; ;*** ;* Console input * ;***** initalize FDC wboo10: ld c,0 call seldsk ; initalize disk parameters ld hl,cpmbas ld de,2 ld b,bdosln/reclen ; set length off CCP and BDOS wboo20: push bc ; save parameters push hl push de ld c,l ; move transfer addres to BC l _** ; ; read console input data and clear parity bit ; Entry: none ; Exit: A = input character ; conin: ld a,(iobyte) ; get iobyte assignment and ioconsl ; mask all but console bits jp z,ttyin  ; TTY? bit 1,a ; check d b,h call setdma ; set data transfer address ld c,d call settrk ; set track number in D ld c,e call setsec ; set sector number in E call read ; read selected sector jr z,wboo30 ; if read successful, then jump pop de ; else, restore  if CRT or BAT jp nz,batin ; BAT? crtin: ld a,(atoflg) ; get auto boot flag cp atobot ; check if auto boot set jr z,crtin3 ; yes, go get auto boot program push bc push de ld bc,0 + ; set hundreds constant of motor on timer registers pop hl pop bc ld hl,bootry ; get retry count dec (hl) ; adjust it jr nz,wboo10 ; try again if count not 0 ld hl,boomsg ; else, point to boot error message call prtmsg ; display it jr $ ; halt wboo30: pop de ; adjust t [T crtin4: ld e,50 ; set tenths constant of motor on timer crtin1: call crtst ; check if input character ready jr nz,crtin2 ; no, loop until one is ready dec e ; decrement motor timer tenths jr nz,crtin1 ; loop until chara rack and sctor inc e ; adjust sector number ld a,e ; get sector number cp 24h ; check if last sector jr c,wboo40 ; no, more to read ld e,0 ; clear sector number inc d ; adjust track number wboo40: pop hl ; restore data transfer cter ready or tenths = 0 dec bc ; adjust motor timer hundreds ld a,b or c ; check if motor timer expired jr nz,crtin4 ; no, keep looping ld a,0 V out (motoron),a ; turn motor off ld a,mtroff ; get motor off flag byte ld (  address ld bc,reclen add hl,bc ; add record length pop bc ; restore sector count djnz wboo20 ; go read next sector ; ; shared by warm and cold boot ; gocpm: ld bc,cpmbuf ; get initial DMA address call setdma ; set it ld a,jp_op mtrflg),a ; indicate motor is off jr crtin1 crtin2: ld a,0 out (conled),a ; turn om console LED in a,(siobd) ; get input character and 7fh ; strip parity pop de pop bc push af ; save input character ld a,1 out (conled),a  ; set up reentry address's ld (0),a ld hl,bios+3 ld (1),hl ld (5),a ld hl,bdos ld (6),hl xor a ld (ul1cnt),a ; clear serial printer buffer count ld (unacnt),a ; and unallocated sector count ld (phyact),a ; and inactive flag ld a  ; turn off console LED pop af ; restore input character ret crtin3: ld hl,(atopnt) ; point to auto boot program name ld a,(hl) ; get first character cp cr ; check if cr jr z,crtin5 ; yes, finish up inc hl ; adjust pointer ld (ato K,(logdrv) ; get logged disk number ld c,a jp cpmbas ; go to CCP ; ;*** ; console status * ;**}* ; ; get status of console device ; Entry: none ; Exit: A = 0 no input character ready ; A = FF input charact pnt),hl ; save new auto boot address ret crtin5: xor a ld (atoflg),a ; clear auto boot flag ld a,cr ; set cr for CCP ret ; ;** ; Console ouput * ;**= ; ; send character to console after clearing parity bit ; (er ready ; const: ld a,(iobyte) ; get iobyte assignment and ioconsl ; strip all but console bits jp z,ttyst ; 0 = TTY bit 1,a ; check if CRT device jp nz,batst " ; no, must be BAT device crtst: in a,(sio b Entry: C = output character ; Exit: none ; conout: ld a,(iobyte) ; get iobyte assignment and ioconsl ; mask off all but console bits jp z,ttyout 8 ; TTY? bit 1,a ; check if CRT or BAT jp nz,batout  ; BAT crtout: push   af ld a,0 out (conled),a ; turn on console LED loop aset $ in a,(siobc) ; get serial port status bit trxrdy,a ; check if xmit buff is empty jr z,loop ; no, loop until empty ld a,c  and 7fh ; strip pari  Q, get modem port status jr z,loop ; loop until input character ready in a,(sioad) ; now get input character and 7fh ; strip parity cp XON H ; looking for XON jr nz,loop ; loop until XON received jr ttyou1  ; mty out (siobd),a ; send data to CRT ld a,1 out (conled),a ; turn off console LED pop af ret ; ; **"* ;* Modem port status (TTY) * ; **=* ; ; read modem port status and indicate if input characte  e% XON received, output character ; ;** ;* Reader input * ;** ; ; read character from assigned reader port ; Entry: none ; Exit: A = input character ; reader: ld a,(iobyte) ; get iobyte assignment and ioreader 9r is ready ; Entry: none ; Exit: A = 0 no input character ; A = FF iput character ready ; ttyst: in a,(sioac) ; get modem port status bit rcvrdy,a ld a,0 ; indicate no input character ready ret z  ; return if not re  + ; mask all except reader bits jp z,ttyin  ; TTY? jp ptrrdr ; RDR ; ;** ;* Punch output * ;**m ; ; send character to assigned punch port ; Entry: C = output character ; Exit: none ; punch: ld a,( Aady cpl ; else, indicate input character ready ret ; ; ** ;* Modem port input (TTY) * ; **k ; ; read input character from modem port and strip parity ; Entry: none ; Exit: A = input character ;  \iobyte) ; get iobyte assignment and iopunch ; mask all but punch bits jp z,ttyout  ; TTY? jp ptppun ; PUN ; ;*** ;* List output * ;**A* ; ; send character to assigned list port ; Entry: C = output  ttyin: call ttyst & ; get modem port status jr z,ttyin ; loop if no input character ready ld a,0 out (modled),a ; turn on modem port LED in a,(sioad) ; else, get characrter and 7fh ; strip parity push af ; save  character ; Exit: none ; list: ld a,(iobyte) ; get iobyte assignment and iolist ; mask off all bits except bits jp z,ttyout D ; TTY? and a jp pe,ul1lst ; UL1? bit 6,a jr z,lptlst  ; LST jp crtout  ; C v input character ld a,1 out (modled),a ; turn off modem port led pop af ; restore input character ret ; ; *** ;* Modem port output * ; **F* ; ; ouput character to modem port after clearing parity bit ; thi RT ; ;*** ;* List status * ;*** ; ; get list status and return results ; Entry: none ; Exit: A = 0 printer not ready ; A = FF printer ready ; listst: ld a,(iobyte) ; get iobyte assignment and iolist ; mas s driver uses XON/XOFF protocol ; Entry: C = ouput character ; Exit: none ; ttyout: ld a,0 out (modled),a ; turn on modem port LED call ttyst ^ ; check if input character ready jr nz,ttyou2 ; yes, go process it ttyou1: in a,  k all but list bits jp z,ttyst E ; TTY? and a jp pe,ul1lSS ; UL1? bit 6,a jr z,lptlss  ; LPT? jp crtst K ; CRT? lptlss: in a,(pioad) ; get printer status bit ptrbsy,a  ; check if printer is busy fe(sioac) ; else, get modem port status bit trxrdy,a ; check if xmit buff empty jr z,ttyou1 ; no, loop until empty ld a,c g and 7fh ; strip parity out (sioad),a ; send data to modem port ld a,1 out (modled),a ; t ' ld a,0 ; indicate not busy ret nz 1 ; not busy, return cpl ; indicate busy ret  ; ;*** ;* List output * ;**M* ; ; send data to parallel printer port ; Entry: C = output data ; Exit:  vurn off modem port LED ret ttyou2: in a,(sioad) ; get input character and 7fh ; strip parity cp XOFF l ; check if character XOFF jr nz,ttyou1 ; no, send output character loop aset $ call ttyst  ; else h none ; lptlst: ld a,0 out (ptrled),a ; turn on prtiner port LED loop aset $ call lptlss ; get printer status jr nz,loop ; loop unitl not busy ld a,c out (piobd),a ; send data to printer latch in a,(pioad) ;  turn on strobe res strobe,a out (pioad),a in a,(pioad) set strobe,a out (pioad),a ; turn off strobe ld a,1 out (ptrled),a ; turn off printer port LED ret ; ;**$* ;* Serial printer driver UL1 * ;** ot full ; A = 0 input character not ready or buffer full ul1lss: ld a,(ul1cnt) ; get printer buffer count cp pbufsiz % ; check if more room left ld a,-1  ; indicate yes ret nz ; return if buffer not full i **y* ; ; UL1 driver ; Entry: none ; Exit: none ; ul1lst: ld a,pbufsiz ; get printer buffer size ld b,a or a  rra M ; divide by 2 ld e,a ld hl,ul1cnt ; get current buffer count in :n a,(sioac) ; get serial port status bit rcvrdy,a + ; check if input character ready ld a,-1 % ; indicate character ready ret nz $ ; return if character ready xor a ( ; else, indicate no character ready @]c (hl) ; adjust count ul1l10: in a,(sioac) ; get serial port status bit rcvrdy,a / ; check if input character ready jr z,ul1l20 d ; no, send character in a,(sioad) ; else, get input character and 7fh ; strip parity  ret ; ;**2 ;* Reader, Punch and Console dummy routines * ;**m ; ; dummy rotuines ; Entry: none ; Exit: A = SUB ; batin: uc1in: batout: uc1out: ptrrdr: ur1rdr:  cp ack # ; check if input ACK jr z,ul1l60 ; yes, go process it ul1l20:  ld a,e % ; get printer buffer size cp (hl) Y ; is buffer half full jr nz,ul1l40 ; no, no need for ETX ul1l30: in a,(sioac I. ur2rdr: ptppun: up1pun: up2pun: ld a,sub ' ; get ASCII SUB character ret ; ;**& ;* Console status dummy rotuine * ;**; ; ; Entry: none ; Exit: A = 0 ; batst: uc1st: xor a0) ; get serial port status bit trxrdy,a ) ; check if xmit buff empty jr z,ul1l30  ; loop unitl empty ld a,etx K ; get ETX cahracter out (sioad),a ; send ETX to serial port jr ul1l50  ; now output character ul1 a  ; always busy ret ; ;** ;* home * ;** ; ; send heads to track 0 ; Entry: none ; Esit: none ; home: ld a,(phywrt) ; get write pending flag or a ; check if set jr nz,homed  ; yes, write pending, skip  l40: ld a,b  ; get buffer size cp (hl) 1 ; check if buffer full or overfolw jr z,ul1l30  ; full, send ETX jr c,ul1l10 ^ ; overflow, wait for ACK ul1l50: ld a,0 out (modled),a ; turn on serial port LED in a 3p ld (phyact),a ; clear activity flag homed: xor a ld (sektrk),a ; reset seek track to 0 ret ; ;*** ;* select disk * ;**^* ; ; select disk parameter ; Entry: C = disk number ; Exit: HL = 0 if disk number out of 47,(sioac) ; get serial port status bit trxrdy,a ) ; check if xmit buff empty jr z,ul1l50 ! ; no, wait until it is ld a,c c ; get output character and 7fh ; strip parity out (sioad),a ; send it to serial port Xrange ; HL = disk parameter address if disk number in range ; seldsk: ld hl,0 f ; set HL = error for return ld a,c ; get drive number ld (sekdsk),a ; save it cp maxdsk ; check if valid drive ret nc sQ ld a,1 out (modled),a ; turn off serial port LED ret ul1l60: ld a,(hl)  ; get buffer character sub e ( ; is buffer => half full jr z,ul1l70  ; yes jr c,ul1l50 , ; no, spurious ACK ul1l70: ld (hl),a _ ; dirve number out of range, return ld l,a add hl,hl add hl,hl add hl,hl add hl,hl W ; multiply by 16 ld de,dpbase ; point to base of parameter block add hl,de 6 ; set HL to drive parameter vector ret ; ;****** ( ; adjust buffer count jr ul1l50  ; send character ; ; ** ;* Serial port status UL1 * ; **c ; ; get UL1 serial port status ; Entry: none ; Exit: A = FF input character ready or buffer n l******* ;* set track * ;*** ; ; set read/write track number ; Entry: C = track number ; Exit: none ; settrk: ld a,c ; get track number ld (sektrk),a ; save it ret ; ;** ;* set sector * ;** ; ; set re  ad/write sector number ; Entry: C = sector number ; Exit: none ; setsec: ld a,c ; get sector number ld (seksec),a ; save it ret ; ; ;*** ;* set DMA * ;**E* ; ; set read/write DMA address ; Entry: BC = DMA address ; Exit  8Cumber ld hl,unatrk ; point to unallocated track number cp (hl) ; check if selected track number = unalloc trk jr nz,writ30 ; no, continue ld a,(seksec) ; get selected sector number ld hl,unasec ; point to unallocated sector number  C: none ; setdma: ld (dmaadr),bc ; save DMA address ret ; ; ** ;* Secotr translate * ; **{ ; ; translate logical sector to physical ; Entry: BC = logical sector ; DE = translate table address ; Exit: HL = p   cp (hl) ; check if selected sector number = unalloc sec jr nz,writ30 ; no, continue ; ; match same disk, track and sector ; inc (hl) S ; adjust unallocated sector number ld a,(hl) ld hl,wspt sub (hl) jr c,wr Fhysical sector ; sectrn: ld h,b ld l,c ld a,e or d ret z ex de,hl add hl,bc ld a,(hl) ld l,a ld h,0 ret ; ;*** ;* BIOS read * ;**O* ; ; read the selected sector (128 bytes) into the selected DMA buffer addre  it20 G ; skip if no overflow ; ; over flow to next track ; ld (unasec),a ; set unallocated sector to 0 ld hl,unatrk ; point to unallocated track number inc (hl) ; adjust it for next track ; ; match found, mark as unnecessary re 1ss ; Entry: none ; Exit: none ; read: call setlwd xor a ld (unacnt),a ; set to pre-read ld a,1 ld (readop),a ; set read operation ld (rsflag),a ; must read data ld a,wrual ld (wrtype),a ; treadt as unalloc jp rdwtcm  ad ; writ20: xor a ld (rsflag),a ; reset pre-read flag jr rdwtcm ; go do write sector ; ; requires pre-read ; writ30: xor a ld (unacnt),a ; reset unallocated count inc a ld (rsflag),a ; set pre-read flag ; ; common I! ; go perform the read ; ;** ;* BIOS write * ;** ; ; write the selected sector (128 bytes) from the slected DMA buffer address ; Entry: none ; Exit: none ; write: push bc call setlwd xor a ld (readop),a pop z routine for read and write ; rdwtcm: ld hl,wsmsk ld a,(seksec) ; get selected sector number ld b,(hl) rdwtc2: rr b jr nc,rdwtc1 or a rra jr rdwtc2 rdwtc1: ld (sekphy),a ; save sector number ; ; active physical sector ; bc ld a,c ld (wrtype),a cp wrual jr nz,writ10 ; ; writing to an unallocated block ; ld a,(wblock) ; get block size ld (unacnt),a ; set unallocated setocrs remaining ld a,(sekdsk) ; get selected disk number ld (unadsk) <) ld hl,phyact ld a,(hl) ld (hl),1 " ; set to a 1 or a jr z,rdwt20 f ; ; physical buffer active ; ld a,(sekdsk) ; get selected disk number ld hl,phydsk cp (hl) 1 ; check if selected disk = physical disk jr nz $,a ; set to unallocated disk  ]ld a,(sektrk) ; get selected track number ld (unatrk),a ; set to unallocated track  old a,(seksec) ; get selected sector number ld (unasec),a ; set to unallocated sector ; ; check for w @,rdwt10 ; no, continue ld a,(sektrk) ld hl,phytrk cp (hl) i ; check if selected track = physical track jr nz,rdwt10 ; no ld a,(sekphy) ld hl,physec cp (hl) ? ; check if selected sector = physical sector jr z,rdwt40 ; rite to unallocated sector ; writ10: ld a,(unacnt) ; get unallocated flag or a ; check if any unallocated sectors left jr z,writ30 F ; skip if not ; ; more unallocated sectors in this block ; dec a  ; set unallocate eno rdwt10: ld a,(phywrt) ; get write data pending flag or a ; check if set jr z,rdwt20 " ; no, flush buffer call fdwrite % ; else, write data to disk ret nz 6 ; return if error in writing to disk rdwt20: ld a,  hd flag ld (unacnt),a ld a,(sekdsk) ; get selected disk number ld hl,unadsk ; point to unallocated disk number cp (hl) o ; check if selected disk = unalloc disk jr nz,writ30 ; no, continue ld a,(sektrk) ; get selected track n (sekdsk) ; get selected disk number ld (phydsk),a ; set to physical disk ld a,(sektrk) ; get selected track number ld (phytrk),a ; set to physical track ld a,(sekphy) ld (physec),a ld a,(rsflag) ; get pre-read flag or a ; check if set jr z,rdwt30 & ; no, pre-read required call fdread % ; else, read data from disk ret nz ; return if error in reading from disk rdwt30: xor a ld (phywrt),a ; reset write pending flag ; ; copy data between  track ld a,fdskng jr nz,fwr4 ; jump if error ld hl,tryct1 ; point to R/W retry counter ld (hl),trysecno ; set retry count fwr2: call fwr ; write a sector jr nz,fwr3 ; jump if error ret fwr3: ld hl,tryct1 dec (hl) jr nz,fwr2 ; j dskrwbuf and (DMAADR) ; rdwt40: ld hl,wsmsk ld a,(seksec) ; get selected sector number and (hl) ld h,a ld l,0 srl h rr l c ; HL = ((SEKSEC) & SECMSK) * 128 ld de,dskrwbuf ; get starting address of disk R/W buffer ad ump if retry count = 0 ld a,fdwrng fwr4: ld hl,tryct0 dec (hl) jr z,fw5 ; jump if retry count = 0 call fdhome ld a,fdhong jr nz,fwr4 ; jump if error jr fwr1 ; else, retry fw5: call errprt ; print error message ret ; ;********>d hl,de ld de,(dmaadr) ; get DMA buffer pointer ld bc,128 ; set length to move ld a,(readop) ; get read opeation flag or a ; check if set jr nz,rdwt50 ; yes, read operation ld a,1 ld (phywrt),a ; set write pend *** ;* Frd/Fwr * ;*** ; ; Entry: none ; Exit: none ; fwr: call push_nmi ; save old NMI routine ld hl,outi_op ; get OUTI instruction ld (nmi_p),hl ; set in NMI routine ld b,wrcmd ; get write command jr rd_wr ; common read/write ing flag ex de,hl ; swap source/destination pointers rdwt50: ldir ld a,(wrtype) ; get write flag cp wrdir ; check if write directory operation jr z,rdwt60 $ ; no, not a dir write, exit xor a  ; else, error message i E routine ; frd: call push_nmi ; save old NMI routine ld hl,ini_op ; get INI instruction ld (nmi_p),hl ; set in NMI routine ld b,rdcmd ; get read command ; rd_wr: ld a,(wdogr) ; get density/side parameter and 40h ; mask off all but deI^n A & Z ret rdwt60: xor a ld (phywrt),a ; reset write pending flag call fdwrite ; write the sector ret ; ; ** ;* Floppy disk read * ; **8 ; ; read sector ; Entry: none ; Exit: none ; fdre$nsity bits or b ; add to rd/wr command ld (rw_cmbf),a ; set command and denisty in command buffer call hds_ds ld (h_phydsk),a ; make selected disk = physical disk ld a,(h_phytrk) ld (p_phytrk),a ld hl,retn_op ld (nmi_p+2),hl ; set ad: call set_wd call selhead ; select head ld hl,tryct0 ; point to seek retry counter ld (hl),trytrkno ; set retry count fdr1: call seek ; move heads to selected track ld a,fdskng jr nz,fdr4 ; check for seek error ld hl,tryct1 ; po:RETN instruction in NMI routine ld b,9 ; set command length wbytes: ld de,256 ; set sector count call fdccmd ld hl,dskrwbuf ; point to disk r/w buffer call rd_wr_sub ; go do command call pop_nmi ; restore old NMI routine ret rd_wr_subint to R/W retry counter ld (hl),trysecno ; set retry count fdr2: call frd ; go read jr nz,fdr3 ; check for read error ret fdr3: ld hl,tryct1 ; point to R/W retry counter dec (hl) ; adjust couter jr nz,fdr2 ; if retry count = 0 quitn: ei halt ; wait for FDC R/W interrupt dec de ; adjust sector count ld a,d or e ; check if all done jr nz,rd_wr_sub ; no, more to read/write out (tcres),a ; yes, terminate command halt ; wait for FDC to acknowledge ; ;** ld a,fdrdng fdr4: ld hl,tryct0 dec (hl) jr z,fw5 ; seek retry end? call fdhome ; send heads home ld a,fdhong jr nz,fdr4 ; check for home error jr fdr1 ; do it again ; ; *** ;* Floppy disk write * ;********* ;* Print message * ;*** ; ; send character string to console until terminate character found ; Entry: HL = starting address of string ; Exit: none ; prtmsg: ld a,(hl) ; get character from buffer cp vend ; check if termi ******* ; ; write data to floppy disk ; Entry: none ; Exit: none ; fdwrite: call set_wd call selhead ; selecte head ld hl,tryct0 ; point to seek retry counter ld (hl),trytrkno ; set retry count fwr1: call seek ; move heads to selected nating character ret z ; yes, return ld c,a ; else, save character call conout ; send character to console inc hl ; adjust buffer pointer jr prtmsg ; loop until all sent ; ; ;*** ;* motor delay * ;** * ; ; delay 500ms ; Entry: none ; Exit: none ; delay: push bc ld hl,1000 ; set motor dealy hundreds constant loop aset $ ld b,142 ; set motor delay tenths constant djnz $ dec hl ld a,l or h jr nz,loop ; loop until timer expires pop   increment it ld a,(hl) ; save it cp maxdsk ; check if all drives done jr c,loop ; no, loop until all done ret ; ;*** ;* Specify * ;**[* ; ; Program the FDC with head load, unload time and step rate ; Entry: none ; Exit: nbc ret ; ; ** ;* Clear FDC interrupts * ; ** ; ; clear FDC interrupts ; Entry: none ; Exit: none ; clrint: in a,(fdcint) ; get FDC interrupt status bit intreq,a ; check if interrupt pending ret  ?one ; specify: ld hl,rw_cmbf ; point to FDC command buffer ld (hl),specmd ; set specify command in buffer inc hl ld (hl),srthut ; set step rate and head unload constant inc hl ld (hl),hltnd ; set head load time constant dec hl ; point:Xnz ; no, return call stsrd ; else, wait until interrupt goes away jr clrint ; ; ** ;* Hardware Initalization * ; **T ; ; initalize CTC, SIO, PIO and FDC ; Entry: none ; Exit: none ; hdwini: ld  to start of command buffer dec hl ld b,3 ; set length of command call fdccmd ; send command to FDC ret ; ;******** ;* Home * ;******* ; ; move heads of selected disk to track 0 ; Entry: none ; Exit: none ; fdhome: ld hl,rw_cmbf ; p hl,siotba ; point to SIO programming table call blkio ; send data to SIO in a,(fdcint) ; read baud rate switch and 7 ; mask lower 3 bits hdwin1: ld hl,baudtb ; point to baud rate table ld b,0 ld c,a add hl,bc ld a,(hl) ld (baud), goint to command buffer ld (hl),homcmd ; set home command in buffer inc hl ld a,(phydsk) ; get selected disk number ld (hl),a ; set it in command buffer ld b,2 ; set length of command jr se0 ; send command to FDC ; ;******** ;* Seek * 7a ; set baud rate constant ld a,c cp 0 jr z,hdwin3 ld a,47h ld (ctcta1),a ; issue counter mode jr hdwin4 hdwin3: ld a,7 ld (ctcta1),a ; issue timer mode, prescaler 16 hdwin4: ld hl,ctctb1 call blkio ld hl,piotba ; point : ;******** ; ; move heads of selected drive to selected track ; seek: ld hl,rw_cmbf ld (hl),sekcmd call hds_ds inc hl ld (hl),a IF DSK96TPI ld a,(wdogr) ; get density pointer bit 4,a ; check if 48 TPI drive ENDIF ld a,(h_phytrk) to PIO A programming table call blkio ; send data to PIO ld hl,piotbb ; point to PIO B programming table call blkio ; send data to PIO ld a,13h out (pioad),a ; set initial printer port state ld hl,ctctb0 ; point to CTC channel dtat table o IF DSK96TPI jr z,moveheads ; no, 96 TPI, step once add a,a ; else, double sector number ENDIF moveheads: ld (p_phytrk),a ld b,3 se0: ld hl,mtrflg ; get motor on/off flag ld a,(hl) cp mtroff ; check if motor is off jr nz,se1 ; noN call blkio ; send data to ctc call fdcinit ; go initalize FDC ret ; ;*** ;* Block I/O * ;*** ; ; send data string to I/O port using block I/O ; Entry: HL = address of data string ; Exit: none ; blkio: ld c,(hl) ; getg, continue ld a,1 out (motoron),a ; else, turn motor on ld (hl),mtron ; indicate motor is now on call delay ; wait 336ms for motor to come up to speed se1: call fdccmd ; issue seek command to FDC ei halt ; wait for completion of execut first byte of data string (I/O adr) inc hl ; adjust pointer ld b,(hl) ; get byte count from string inc hl ; adjust pointer otir ; output until byte count = 0 ret ; ; ** ;* FDC intialixze * ; ** ; ; inition phase ; ; *** ;* FDC command routine * ; *** ; ; send commands to the FDC ; Entry: none ; Exit: none ; fdccmd: call setvect ; set up interrupt vector fcmd1: in a,(fdcsts) ; read FDC main status re talize FDC ; Entry: none ; Exit: none ; fdcinit: call specify ; set up FDC ld a,0 loop aset $ ld (phydsk),a ; set physical disk to 0 call fdhome ; send heads home of physical disk ld hl,phydsk ; get physical disk number inc (hl) ;g and fdcbusy ; check if busy jr nz,fcmd1 ; yes, loop until not busy ld c,fdcdat ; set up data port address ld hl,rw_cmbf ; point to command buffer fc0: in a,(fdcsts) ; read main status reg again rlca ; check if data reg is ready jr nc,fc0 ; no, loop until ready rlca ; check which dirction jr c,stsrd ; in, then read status reg outi ; else, send command jr nz,fc0 ; loop until all sent ret ; ; **"* ;* FDC status read routine * ;** ** ;* set working parameter * ; *** ; ; set physical parameter for working drive ; Entry: none ; Exit: none ; set_wd: ld hl,drvtbl ; point to drive parameter table ld a,(phydsk) ; get physical disk number add a,*** ; ; read FDC status and loop until done. ; Entry: none ; Exit: none ; stsrd: ld a,0 ld (stslng),a ; clear status buffer length ld hl,stsbuf ; point to status buffer sr0: in a,(fdcsts) ; read main status reg rlca ; check Ta ld e,a ld d,0 add hl,de ld e,(hl) inc hl ld d,(hl) ; set DE to parameter entry of selected disk ex de,hl ld de,wdrv ; set entry of working buffer ld bc,7 ; set buffer count ldir ld de,wbytes+1 ld bc,2 ldir ret ; setlwd:  if data reag is ready jr nc,sr0 ; no, loop until ready rlca ; check which direction jr c,sr2 ; out, jump ld a,senint ; else, get sense interrupt command out (fdcdat),a ; send it to FDC ld hl,stsbuf ; point to start of status buffer sr1  ld hl,drvtbl ; point to drive parameter table ld a,(sekdsk) add a,a ld e,a ld d,0 add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl ld de,9 add hl,de ld de,wsmsk ld bc,3 ldir ret ; ;** ;* push NMI * ;**  : in a,(fdcsts) ; read main status reg rlca ; check if data reg ready jr nc,sr1 ; no, loop until ready rlca ; check which direction jr nc,sr3 ; out, jump sr2: in a,(fdcdat) ; read FDC status ld (hl),a ; save results in status buff   ; ; save old NMI routine ; Entry: none ; Exit: none ; push_nmi: ld hl,(nmi_p) ; get current NMI instruction ld (t_nmi),hl ; save it ld hl,(nmi_p+2) ; get next instruction ld (t_nmi+2),hl ; save it ret ; ;*** ;* pop NMI * ;**8er push hl ; save status buffer pointer ld hl,stslng inc (hl) ; increment length of status buffer pop hl ; restore status buffer pointer inc hl jr sr1 sr3: ld a,(stsbuf) ; get byte from status buffer and 11000000b ; check if FDC erL*** ; ; restore old NMI routine ; Entry: none ; Exit: none ; pop_nmi: ld hl,(t_nmi) ; get old NMI struction ld (nmi_p),hl ; restore it ld hl,(t_nmi+2) ; get next instruction ld (nmi_p+2),hl ; restore it ret ; ; **}ror pop hl reti ; ;** ;* HDS_DS * ;** ; ; routine for FDC read/write command ; Entry: none ; Exit: none ; hds_ds: ld a,(phyhead) add a,a add a,a push hl ld hl,phydsk or (hl) pop hl ret ; ;*** ;*$****** ;* set interrupt vector * ; ** ; ;SET INTERRUPT VECTOR ; Entry: none ; Exit: none ; setvect: push hl ; save the HL reg im 2 ld hl,intvtab ; get interrupt vector table address ld a,h ; get upper address byte q Select head * ;*** ; ; convert logical sector & track to physical head, sector & track ; Entry: none ; Exit: none ; selhead: ld a,0 ld (phyhead),a ; set physical head to 0 ld a,(wdogr) ; get side/density parameter and 1 ; maof vect table ld i,a ; set it in I reg ld hl,stsrd ld (intvtab+ctc0int),hl ; set status read routine in CTC 0 int vect pop hl ret ; ;** ;* error report * ;**7 ; ; display error message and status on CRT ; Entrysk off all but side bits ld hl,weot ;END OF TRACK add a,(hl) ld c,a ld a,(physec) cp c jr c,sel_ret sub c ld hl,phyhead inc (hl) sel_ret: ld hl,wdogr bit 0,(hl) jr nz,sel_r1 inc a sel_r1: ld (h_physec),a ld a,(phytrk) bi%: none ; Exit: none ; errprt: push af ld h,0 ld l,a ld de,errho add hl,de ld bc,5 ld de,errcmd ldir ld a,(h_phydsk) ; get bad disk number and 3 add a,'A' ; make it ASCII ld (errdrv),a ; save it pop af cp fdhong ; check if t 5,(hl) jr nz,sel_r2 ld c,a and 1 ld (phyhead),a ld a,c or a rra jr sel_r3 sel_r2: ld hl,wtrk cp (hl) jr c,sel_r3 sub (hl) ld hl,phyhead inc (hl) ld hl,wrtrk add a,(hl) sel_r3: ld (h_phytrk),a ret ; ;***  error while homing heads jr z,homety ; yes, set up to report it push af ld a,'.' ld (errdrv+1),a ld a,(phyhead) ; get bad head number add a,'0' ; make it ASCII ld (errsid),a ; save it ld a,(h_phytrk) ; get bad track number ld hl,errtrk call ftab pop af cp fdskng ; check if error while seeking jr z,seekty ; yes, set up to repor it push af ld a,'.' ld (errtrk+2),a pop af ld a,(rw_cmbf+4) ld hl,errsec call ftab errcom: ld hl,errmsg ; point to error message  6**}* ; piotba: defb pioac defb 3 defb 7 defb 0CFh defb 0F0h piotbb: defb piobc defb 2 defb 0Fh defb 7 ; ;**& ;* CTC FDC interrupt parameters * ;*** call prtmsg ; display it call show ; display status bytes ld a,(stsbuf) and 11000000b ret ; homety: xor a ld (errdrv+1),a jr errcom ; seekty: xor a ld (errtrk+2),a jr errcom ; ftab: push af rrca rrca rrca rrca c _**O* ; ctctb0: defb ctc0 defb 3 defb ctc0int defb 11000111B defb 1 ; ;**0* ;* baud rate table for CTC time constant * ;**!* ; baudtb: defb 8EH ; 110 all ghex ld (hl),a inc hl pop af call ghex ld (hl),a ret ghex: and 0fh cp 10 jr nc,g100 add a,'0' ret g100: add a,'A'-10 ret ; ; ** * ;* display error message * ; *** ; ; display  defb 80H ; 300 defb 40H ; 600 defb 20H ; 1200 defb 10H ; 2400 defb 8 ; 4800 defb 4 ; 9600 defb 2 ; 19200 ; ;** ;* messages * ;**2 ; micmsg: defb 1ah defb lf,lf defm ' '  error mseesage on console ; Entry: none ; Exit: none ; show: ld hl,status ; point to status message call prtmsg ; display it ld a,(stslng) ; get FDC status byte ld b,a ; save it ld hl,stsbuf ; point to FDC status buffer shw1: ld a, 70 defm ' Multitech' defb cr,lf defb ' 7' defb ' BIOS Ver 1.3' defb cr,lf defm ' a' defm ' 63K CP/M Ver 2.2' defb cr,lf defb lf,lf defb vend boomsg: defw cr,lV(hl) push af ; save character rrca ; adjust it rrca rrca rrca call ghexout ; convert and display upper nibble pop af call ghexout ; convert and display lower nibble ld c,space call conout ; move coursor inc hl ; point to n!f defm 'BOOT ERROR ... AND DIE:' defb vend errmsg: defw cr,lf errcmd: defs 5 defm ' ERROR : DRIVE# ' errdrv: defs 1 defm ', SIDE# ' errsid: defs 1 defm ', TRACK# ' errtrk: defs 2 defm ', SECTOR# ' errsec: defs 2 defb vext status byte djnz shw1 ; loop until all bytes displayed ld c,cr call conout ; return cursor ld c,lf call conout ; cursor down ret ; ghexout: and 0fh ; strip off upper nibble cp 10 jr nc,g10 add a,'0' jr g20 g10: add a,end errho: defm 'HOME ' errse: defm 'SEEK ' errwr: defm 'WRITE' errrd: defm 'READ ' status: defw cr,lf defm '*' defm ' FDC STATUS ' defb vend ; ;*** ;* auto boot parameters and storage * ;** 0'A'-10 g20: ld c,a call conout ret ; ;*** ;* table for modem port programming * ;**^ ; siotba: defb sioac defb 8 defb 18h defb 18h defb 14h ; reset external status, _ **s ; atomsg: defm 'submit init' atopnt: defb cr atoflg: defb 0 ; 0 = no auto boot FF = auto boot atomsg ; ; *** ;* Disk paramaters * ; **5* ; dpbase: ; adpb: defw 0 ; sector translation v8^register 4 defb 4ch ; 16* clock, 2 stop bits, no parity defb 3 ; register 3 defb 0c1h  q; rcv 8 bits/char, rcv enable defb 5 ; register 5 defb 0eah ; dtr, xmit 8 bits/char, xmit enable, rts ; ;** ;ector defw 0 defw 0 defw 0 ; BDOS scratch pad area defw dirbuf ; directory buffer defw adpbv ; drive A parameter vector defw achksv ; drvie A directory check sum vector defw aalocv ; drive A allocate vector ; bdpb: defw 0 defw 0 defw 0  1)* CTC baud rate generator parameters * ;**M ; ctctb1: defb ctc1 defb 2 ctcta1: defb 47h baud: defb 4 ; ;**6* ;* table for parallel printer port programming * ; defw 0 defw dirbuf defw bdpbv ; drive B parameter vector defw bchksv ; drive B directory check sum vector defw balocv ; drive B allocate vector ; ;cdpb: defw 0 ; sector translation vector ; defw 0 ; defw 0 ; defw 0 ; BDOS scratch pad area ;o, defw dirbuf ; directory buffer ; defw cdpbv ; drive C parameter vector ; defw cchksv ; drvie C directory check sum vector ; defw calocv ; drive C allocate vector ; ;ddpb: defw 0 ; defw 0 ; defw 0 ; defw 0 ; defw dirbuf ; defw ddpbv ; drive D par Vd h_physec: defs 1 ; ; working drive parameters ; wdrv: mn: defs 1 weot: defs 1 wgpl: defs 1 wdtl: defs 1 wtrk: defs 1 wdogr: defs 1 wrtrk: defs 1 wsmsk: defs 1 wblock: defs 1 wspt: defs 1 ; ; miscellaneous storage ; phyact: dLameter vector ; defw dchksv ; drive D directory check sum vector ; defw dalocv ; drive D allocate vector ; ; ; drive parameter vector table ; drvtbl: defw adrv defw bdrv ; defw cdrv ; defw ddrv ; adpbv: defw defspt ; density and side defb  efs 1 ; physical active flag wrtype: defs 1 ; write operation type h_phytrk: defs 1 tryct0: defs 1 ; retry count for home or seek tryct1: defs 1 ; retry count for read or write t_nmi: defs 4 phydsk: defs 1 ; physical disk number phytrk: defs 1defbsh ; block size (2048) defb defblm ; block size (2048) defb defexm ; extent mask defw defdsm ; number of blocks drive can hold defw defdrm ; number of directory entries defb defall ; directory space defb defalh defw defcks ; directory che  ; physical track number physec: defs 1 ; physical sector number stslng: defs 1 ; length of FDC status buffer stsbuf: defs 7 ; FDC status buffer bootry: defs 1 ; boot retry count unacnt: defs 1 ; unallocated sector count unadsk: defs 1 ; unallck sum defw defoff ; number of reserved tracks for CP/M ; adrv: defb m_n ; density defb eot ; sector number/track defb m_gpl ; gap 3 length defb m_dtl ; data length if N = 0 defb trk ; maximum tracks /disk defb dogr defb rtrk ; reserve tr ocated disk number unatrk: defs 1 ; unallocated track number unasec: defs 1 ; unallocated sector number dmaadr: defs 2 ; last DMA address sekdsk: defs 1 ; seek disk number sektrk: defs 1 ; seek track number seksec: defs 1 ; seek sector number ack for flat defw bytes ; bytes/physec defb smsk ; sector mask defb block ; data block size defb spt ; logical sectors/track ; bdpbv: defw defspt defb defbsh defb defblm defb defexm defw defdsm defw defdrm defb defall defbsekphy: defs 1 ; seek physical sector number phywrt: defs 1 ; physical buffer write pending flag rsflag: defs 1 ; pre-read sector flag readop: defs 1 ; 1 = read operation 0 = write operation ul1cnt: defs 1 ; serial printer buffer count aalocv:  defalh defw defcks defw defoff ; bdrv: defb m_n defb eot defb m_gpl defb m_dtl defb trk defb dogr defb rtrk defw bytes defb smsk defb block defb spt ; ;cdpbv: defw defspt ; defb defbsh ; defb defblm ; defb defexm ; defw defs 44 balocv: defs 44 calocv: defs 44 dalocv: defs 44 achksv: defs 32 bchksv: defs 32 cchksv: defs 32 dchksv: defs 32 dirbuf: defs 128 ; directory buffer dskrwbuf: defs 1 ; start of disk R/W buffer ; end defdsm ; defw defdrm ; defb defall ; defb defalh ; defw defcks ; defw defoff ; ;cdrv: ; defb m_n ; defb eot ; defb m_gpl ; defb m_dtl ; defb trk ; defb dogr ; defb rtrk ; defw bytes ; defb smsk ; defb block ; defb spt ; ;ddpbv: defw defvspt ; defb defbsh ; defb defblm ; defb defexm ; defw defdsm ; defw defdrm ; defb defall ; defb defalh ; defw defcks ; defw defoff ; ;ddrv: ; defb m_n ; defb eot ; defb m_gpl ; defb m_dtl ; defb trk ; defb dogr ; defb rtrk ; defw 'W 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 2bytes ; defb smsk ; defb block ; defb spt ; ;*** ;* storage * ;*** mtrflg: defb mtroff ; set initial flag to motor off rw_cmbf: defs 1 ; read/write command buffer h_phydsk: defs 1 p_phytrk: defs 1 phyhead: defs 1 ; physical hea ]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 "!$"" 4 ; START: LD SP,T_SP CALL PUSH_NMI CALL PUSH_INT IM INT_2_MODE LD A,POP_HL LD (I_1P),A LD A,JP LD (I_1P+1),A LD HL,STSRD LD (I_1P+2),HL ; ; MAIN PROGRAM START ; LD DE,VERMSG CALL PRTMSG MAIN: LD DE,SORMSG CALL PRTMSG CAL|FACE PRINTER JP WARM RS232: LD E,01H LD C,08H CALL 05H ;SET IOBYTE FOR RS232 INTERFACE PRINTER WARM: LD C,0H CALL 05H ;WARM BOOT MSG1: DEFB 0AH DEFB 0DH DEFM ' WHAT KIND OF PRINTER DO YOU USE ?' DEFB 0AH DEFB 0AH DEFB  L CONIN CP 1BH JP Z,MAIN5 SUB 41H JP C,MAIN CP 04H JP NC,MAIN LD (SORDSK),A MAIN1: LD DE,DESMSG CALL PRTMSG CALL CONIN CP 1BH JP Z,MAIN5 SUB 41H JR C,MAIN1 CP 04H JR NC,MAIN1 LD (DESDSK),A MAIN2: LD DE,RDYMSG CALL PR0DH DEFM ' 1.CENTRONICS INTERFACE PRINTER ' DEFB 0AH DEFB 0AH DEFB 0DH DEFM ' 2.RS232 INTERFACE PRINTER. ' DEFB 0AH DEFB 0AH DEFB 0DH DEFM ' WHICH ONE ?' DEFB 0AH DEFB 0DH DEFB 24H MSG2: DEFB 0AH DEFB 0DH DEFM  YTMSG CALL CONIN CP 1BH JR Z,MAIN5 CP 59H JR NZ,MAIN2 LD A,(DESDSK) LD (HOMDSK),A CALL HOME CALL HOME LD DE,LINEFD CALL PRTMSG CALL FORM CALL COPY LD DE,ENDMSG CALL PRTMSG CALL POP_NMI CALL POP_INT JP 0000 MAIN5: LD DE0Q ' INVALID INPUT, PLEASE TRY AGAIN.' DEFB 0AH DEFB 0DH DEFB 24H END FB 0AH DEFB 0AH DEFB 0DH DEFM ' WHICH ONE ?' DEFB 0AH DEFB 0DH DEFB 24H MSG2: DEFB 0AH DEFB 0DH DEFM  ,ABTMSG CALL PRTMSG JP 0000H ; ; ; ; FORM: LD A,1 OUT (MOTORON),A CALL DELAY LD A,TRK0 LD (HSTTRK),A LD (RDTRK),A LD A,(DESDSK) LD (HSTDSK),A LD (RDDSK),A FORM1: CALL FORMTRK LD HL,HSTTRK INC (HL) LD A,(HL) RRCA JR C,vFORM2 LD E,2EH CALL CONOUT LD HL,HSTTRK FORM2: LD A,(HL) LD (RDTRK),A LD IX,TRKLST CP (IX) JR C,FORM1 LD DE,FINISH CALL PRTMSG RET FORMTRK: LD A,4 LD (RETRY),A REFORM: LD HL,RETRY DEC (HL) JR NZ,FORMT3 LD DE,DESERR CAvLL PRTMSG JP BOOT ; FORMT3: LD A,HEAD0 LD (HSTHEAD),A CALL FORM_H_TRK FORMT2: LD A,HEAD1 LD (HSTHEAD),A CALL FORM_H_TRK CALL RDSUB JR NZ,REFORM RET FORM_H_TRK: LD A,MFM_SC LD (FORM_SC),A LD HL,OUTI_OP LD (NMI_P),HL LD HL,R]; ; EQUATES PARAMETER DEFINE ; BOOT EQU 0000H SPEED EQU 9CH INT_2_MODE EQU 2 I_1P EQU 0038H CTC0INT EQU 0FFF0H CTC0HINT EQU 0FFH FO_COUNT EQU 4 HEAD0 EQU 0 HEAD1 EQU 1 TRK0 EQU 0 TRK96 EQU 79 TRK48 EQU 39 NMI_P EQU 0066H OUTI_OP "ETN_OP LD (NMI_P+2),HL CALL SEEK CALL S_F_DABF CALL S_F_CMBF LD B,6 CALL FDCCMD JP NZ,FO_TK5 LD C,FDCDAT LD DE,0 FO_TK2: LD HL,FO_DABF LD B,FO_COUNT EI FO_TK3: HALT JR NZ,FO_TK3 LD A,(FORM_SC) INC E CP E JR Z,FO_TK4 LD HEQU 0A3EDH INI_OP EQU 0A2EDH RETN_OP EQU 045EDH SEKCMD EQU 0FH SENINT EQU 08H MFM_FO_CMD EQU 4DH MFM_N EQU 1 MFM_GPL EQU 0CH MFM_SC EQU 18 FM_FO_CMD EQU 0DH FM_N EQU 0 FM_GPL EQU 09H FM_SC EQU 18 FORM_DATA EQU 0E5H TCRES EQU 9DH FL,FO_SEC_TBL ADD HL,DE LD A,(HL) LD (FO_DABF+2),A JR FO_TK2 FO_TK4: OUT (TCRES),A HALT FO_TK5: RET ; COPY: LD A,0 LD (HSTTRK),A LD A,(DESDSK) LD (HOMDSK),A CALL HOME CALL HOME LD A,(SORDSK) LD (HOMDSK),A LD (HSTDSK),A  QDCBUSY EQU 00010000B FDCDAT EQU 81H FDCSTS EQU 80H SIOBD EQU 89H SIOBC EQU 8BH RCVRDY EQU 0 TRXRDY EQU 2 POP_HL EQU 0E1H JP EQU 0C3H ; MOTORON EQU 99H PRTSTR EQU 09H BDOS EQU 05H CON_OUT EQU 02H CON_IN EQU 01H ; ; STORE VECTORlCALL HOME CALL HOME LD A,5 COPY1: LD (TRYNO),A LD A,(SORDSK) LD (HSTDSK),A CALL SEEK CALL DREAD JR Z,COPY2 LD A,(TRYNO) DEC A JR NZ,COPY1 LD DE,SORERR CALL PRTMSG JP BOOT COPY2: LD A,(DESDSK) LD (HSTDSK),A COPY3: CALL SEEK CALL WRITE JR NZ,COPY5 LD HL,HSTTRK INC (HL) LD A,(HL) RRCA JR C,COPY4 LD E,2EH CALL CONOUT LD HL,HSTTRK COPY4: LD A,(HL) LD IX,TRKLST CP (IX) JR C,COPY1 LD DE,FINIST CALL PRTMSG RET COPY5: LD A,(DESDSK) LD (HOMD DEFB 12H DEFB 0AH DEFB 0FFH ; RETRY: DEFS 1 FDDBUF: DEFS 256 RWBUF: DEFB 0C6H RWDSK: DEFS 1 RWTRK: DEFS 1 DEFB 0 DEFB 1 DEFB 1 DEFB 12H DEFB 0AH DEFB 0FFH ; ; ;** ;*  aSK),A CALL HOME CALL HOME JP COPY3 PUSH_NMI: PUSH HL LD HL,(NMI_P) LD (T_NMI),HL LD HL,(NMI_P+2) LD (T_NMI+2),HL POP HL RET ; POP_NMI: PUSH HL LD HL,(T_NMI) LD (NMI_P),HL LD HL,(T_NMI+2) LD (NMI_P+2),HL POP HL RET ; P   * ;* FDHOME  * ;* RECALIBRTA DISK  * ;*  (HSTDSK).....DISK * ;* SEEK  * ;* !SEARCH TRACK <--- (HSTTRK) * ;*  BUSH_INT: PUSH HL LD HL,(I_1P) LD (T_INT),HL LD HL,(I_1P+2) LD (T_INT+2),HL POP HL RET ; POP_INT: PUSH HL LD HL,(T_INT) LD (I_1P),HL LD HL,(T_INT+2) LD (I_1P+2),HL POP HL RET ; ; ; S_F_DABF: LD HL,FO_DABF LD A,(HSTTRK)  -  * ;* * ;** ; ; SEEK: PUSH BC LD IX,SK_CMBF LD A,SEKCMD LD (IX),A CALL HDS_DS LD (IX+1),A ;HDS DS1 DS0 LD A,(HSTTRK) DBLTRK: LD (IX+2),A l LD (HL),A INC HL LD A,(HSTHEAD) LD (HL),A INC HL LD A,(FO_SEC_TBL) LD (HL),A INC HL LD A,MFM_N LD (HL),A RET ; S_F_CMBF: LD HL,FO_CMBF S_FO_MFM: LD A,MFM_FO_CMD LD (HL),A INC HL CALL HDS_DS LD (HL),A INC HL LD A,MFM_N iLD B,3 SE0: LD HL,SK_CMBF CALL FDCCMD LD HL,SE_RET PUSH HL EI HALT SE_RET: POP BC RET ; ;** ;* * ;* FDCCMD  * ;* HL.....C LD (HL),A INC HL LD A,MFM_SC LD (HL),A INC HL LD A,MFM_GPL LD (HL),A S_FO_RET: INC HL LD A,FORM_DATA LD (HL),A LD HL,FO_CMBF RET RDSUB: LD A,0 LD (RDHEAD),A INC A LD (RDSEC),A LD A,(RDDSK) AND 03H LD (RDDSK),A RDSUB1MD POINTER * ;* B.....CMD LENGTH * ;* * ;**m ; FDCCMD: CALL S_INTV IN A,(FDCSTS) AND FDCBUSY JR NZ,FDCCMD LD C,FDCDAT FC0: IN A,(FDCSTS) o: CALL READ RET NZ LD A,(RDSEC) INC A CP 13H LD (RDSEC),A JR C,RDSUB1 LD A,1 LD (RDHEAD),A LD (RDSEC),A LD A,(RDDSK) OR 04H LD (RDDSK),A RDSUB3: CALL READ RET NZ LD A,(RDSEC) INC A LD (RDSEC),A CP 13H JR C,RDSUB3  RLCA JR NC,FC0 RLCA JR C,STSRD OUTI JR NZ,FC0 RET ; S_INTV: PUSH HL LD A,CTC0HINT LD I,A LD HL,I_1P LD (CTC0INT),HL POP HL RET ;FDC STATUS READ ; STSRD: LD HL,STSBUF SR0: IN A,(FDCSTS) RLCA JR NC,SR0 RLCA JR CRET ; READ: LD HL,INI_OP LD (NMI_P),HL LD HL,RDBUF LD B,9 CALL FDCCMD LD B,0 LD HL,FDDBUF READ1: EI HALT JR NZ,READ1 OUT (TCRES),A HALT DREAD: LD HL,INI_OP LD (NMI_P),HL LD A,0C6H LD (RWBUF),A JR RWCOM WRITE: LD HL,,SR2 LD A,SENINT OUT (FDCDAT),A SR1: IN A,(FDCSTS) RLCA JR NC,SR1 RLCA JR NC,SR3 SR2: IN A,(FDCDAT) LD (HL),A INC HL JR SR1 SR3: LD A,(STSBUF) AND 11000000B RETI ;** ;*  OUTI_OP LD (NMI_P),HL LD A,0C5H LD (RWBUF),A RWCOM: LD A,(HSTTRK) LD (RWTRK),A LD A,(HSTDSK) LD (RWDSK),A LD B,9 LD HL,RWBUF CALL FDCCMD LD HL,HSTDMA LD C,FDCDAT LD DE,2400H CALL RWSUB RET RWSUB: EI R_W: HALT DEC DE 3  * ;* HDS_DS * ;*  .....HDS DS1 DS0  * ;* INPUT (HSTHEAD)  * ;* (HSTDSK) * ;* OUTPUT * ;*   z LD A,E OR D JR NZ,R_W OUT (TCRES),A HALT ; ; HOME: LD HL,HOMBUF LD B,2 CALL FDCCMD EI HALT ; HOMBUF: DEFB 07H HOMDSK: DEFS 1 ; RDBUF: DEFB 46H RDDSK: DEFS 1 RDTRK: DEFB 0 RDHEAD: DEFB 0 RDSEC: DEFB 1 DEFB 1  A * ;* * ;** ; HDS_DS: LD A,(HSTHEAD) ADD A,A ADD A,A PUSH HL LD HL,HSTDSK OR (HL) POP HL RET ; ; ; PRTMSG: LD C,PRTSTR JP BDOS ; qt; CONIN: LD C,CON_IN JP BDOS ; ; CONOUT: LD C,CON_OUT JP BDOS ; ; DELAY: PUSH AF PUSH HL PUSH BC LD HL,800 DELAY1: LD B,120 DJNZ $ DEC HL LD A,L OR H JR NZ,DELAY1 POP BC POP HL POP AF RET ;; ; VERMSG: DEFW  v=0D0AH DEFM 'MIC-504 system copy vers 2.0' DEFW 0D0AH DEFM '$' SORMSG: DEFW 0D0AH DEFM ' Source drive name ? (A or B. ESC to abort.)' DEFM '$' ; DESMSG: DEFW 0D0AH DEFM ' Destination drive name ? (A or B. ESC to abort.)' D WBOOT EQU 0000H FDCBUSY EQU 10H FDCSTS EQU 80H FDCDAT EQU 81H CTC0HINT EQU 0FFH CTC0INT EQU 0FFF0H SENINT EQU 08H START: LD DE,TYPMSG CALL PRTMSG START1: CALL CONIN PUSH AF LD E,A CALL CONOUT POP AF CP 41H JR Z,TPI96 CP 42H EFM '$' ; RDYMSG: DEFW 0D0AH DEFM ' Press Y for starting copy. (ESC to abort.)' DEFM '$' ; ; ABTMSG: DEFW 0D0AH DEFW 0D0AH DEFM 'DISK COPY IS ABORTED !!!' DEFW 0D0AH DEFM '$' ENDMSG: DEFB 0DH DEFB 0AH DEFM 'end of MIC-5 fJR Z,T4818 CP 43H JR Z,T4836 CALL BAKSUB JR START1 TPI96: LD DE,WOFFTRK LD HL,T96TAB LD BC,04 LDIR LD A,0 LD (STPTRK),A LD (TPIBUF),A JP FUNSEL ; T4818: LD DE,WOFFTRK LD HL,T18TAB LD BC,04 LDIR LD A,1 LD (STPTRK),A 00 copying' DEFB 07H DEFB 0DH DEFB 0AH DEFM '$' ; FINISH: DEFM ' 40 tracks copyed' DEFW 0D0AH DEFM '$' ; FINIST: DEFM ' 80 tracks copyed' DEFW 0D0AH DEFM '$' ; LINEFD: DEFW 0D0AH DEFW 0D0AH DEFM '$' SORERR: DEFW  LD (TPIBUF),A JP FUNSEL ; T4836: LD DE,WOFFTRK LD HL,T36TAB LD BC,04H LDIR LD A,0 LD (STPTRK),A INC A INC A LD (TPIBUF),A ; FUNSEL: LD A,0 LD (SEKTRK),A CALL HOMSUB LD DE,FUNMSG CALL PRTMSG LD DE,CRLFMSG CALL PRTMSG 0D0AH DEFW 0D0AH DEFM '*** A FAULT IN THE SOURCE DISKETTE ***' DEFW 0D0AH DEFM '$' ; DESERR: DEFW 0D0AH DEFW 0D0AH DEFM '*** A FAULT IN THE DESTIATION DISKETTE ***' DEFW 0D0AH DEFM '$' ; ; ; ;**LD A,20H LD (CURITM),A LD DE,CURMSG CALL PRTMSG CALL DISPLAY FUNSE1: CALL CONIN LD (CURITM),A CP 41H JP Z,ROTSPD CP 61H JP Z,ROTSPD CP 42H JP Z,OFFTRK CP 62H JP Z,OFFTRK CP 43H JP Z,TRK0DT CP 63H JP Z,TRK0DT CP 44H З ;* * ;* SCRATCH_PAD AREA  * ;* * ;**T ; TRKLST: DEFB 80 ; ; FO_SEC_TBL: DEFB 1 DEFB 0AH DEFB 2H DEFB 0BJP Z,REALIB CP 64H JP Z,REALIB CP 45H JP Z,AZIMUTH CP 65H JP Z,AZIMUTH CP 46H JP Z,STEPIN CP 66H JP Z,STEPIN CP 47H JP Z,STEPOUT CP 67H JP Z,STEPOUT CP 48H JP Z,START CP 68H JP Z,START CP 49H JP Z,WBOOT CP 69H JPvH DEFB 3 DEFB 0CH DEFB 4 DEFB 0DH DEFB 5 DEFB 0EH DEFB 6H DEFB 0FH DEFB 7 DEFB 10H DEFB 8H DEFB 11H DEFB 9H DEFB 12H ; SORDSK: DEFS 1 DESDSK: DEFS 1 SK_CMBF: DEFS 9 STSBUF: DEFS 7 T_NMI: DEFS 4 T_INT: D Z,WBOOT LD E,07H CALL CONOUT JP FUNSE1 ; OFFTRK: CP 42H JR Z,OFF1 LD A,(SEKSID) OR 04H LD (SEKSID),A JR OFF2 OFF1: LD A,(SEKSID) AND 03H LD (SEKSID),A OFF2: CALL HOMSUB LD A,(WOFFTRK) LD (SEKTRK),A CALL SEESUB CALL DIEFS 4 TEMP: DEFS 20 T_SP: DEFS 1 FO_CMBF: DEFS 6 FO_DABF: DEFS 4 HSTDSK: DEFS 1 HSTHEAD: DEFS 1 HSTTRK: DEFS 1 FORM_SC: DEFS 1 MT_MFM_SK: DEFS 1 CON_BUF: DEFS 4 HSTDMA: DEFS 2400H TRYNO: DEFS 1 ; ; END SPLAY JP FUNSE1 ; TRK0DT: CALL HOMSUB LD A,(SEKSID) AND 03H LD (SEKSID),A LD A,(WTRK0D) LD HL,SEKTRK LD (HL),A TRK0D1: CALL SEESUB CALL DISPLAY LD A,(TPIBUF) CP 0 JR Z,TRK0D2 CP 1 JR Z,TRK0D3 LD HL,SEKTRK INC (HL) INC v (HL) INC (HL) CALL SEESUB CALL DISPLAY LD HL,SEKTRK DEC (HL) DEC (HL) DEC (HL) JR TRK0D6 TRK0D3: LD HL,SEKTRK LD B,6 TRK0D4: INC (HL) DJNZ TRK0D4 CALL SEESUB CALL DISPLAY LD HL,SEKTRK LD B,6 TRK0D5: DEC (HL) DJNZ TRK}0D5 JR TRK0D6 TRK0D2: LD HL,SEKTRK INC (HL) CALL SEESUB CALL DISPLAY LD HL,SEKTRK DEC (HL) TRK0D6: CALL CONST JR Z,TRK0D1 CALL CONIN CP 1BH JR NZ,TRK0D1 JP FUNSE1 ; REALIB: CALL HOMSUB LD A,0 LD (SEKTRK),A CALL DISPLAY ISLNG INC (HL) POP HL INC HL JR SR1 SR3: LD A,(STSBUF) AND 0C0H POP HL RETI ; WRT38H: IM 2 LD A,CTC0HINT LD I,A PUSH HL LD HL,STSRD LD (CTC0INT),HL POP HL RET ; CONIN: CALL CONST JR Z,CONIN IN A,(89H) AND 07FH   JP FUNSE1 ; AZIMUTH: CP 45H JR Z,AZ1 LD A,(SEKSID) OR 04H LD (SEKSID),A JR AZ2 AZ1: LD A,(SEKSID) AND 03H LD (SEKSID),A AZ2: CALL HOMSUB LD A,(WAZIM) LD (SEKTRK),A CALL SEESUB CALL DISPLAY JP FUNSE1 ; ; STEPIN: CP  eRET ; CONST: IN A,(8BH) BIT 0,A LD A,0 RET Z DEC A RET ; BAKSUB: LD E,08H CALL CONOUT LD E,07H CALL CONOUT RET DISPLAY: LD A,(STPTRK) CP 0 LD A,(SEKTRK) JR Z,DISP1 SRL A DISP1: CALL HEXDEC CALL PRINT LD (CURTRK),46H JR Z,IN1 LD A,(SEKSID) OR 04H LD (SEKSID),A JR IN2 IN1: LD A,(SEKSID) AND 03H LD (SEKSID),A IN2: LD HL,SEKTRK LD A,(TPIBUF) CP 0 JR Z,IN96 CP 1 JR Z,IN18 LD A,(HL) CP 39 JR Z,OVERMAX JR IN3 IN18: LD A,(HL) CP  HL LD D,36 LD E,08H DISP2: PUSH DE CALL CONOUT POP DE DEC D JR NZ,DISP2 LD DE,CURTRK CALL PRTMSG RET PRTMSG: LD C,09H JP 0005H CONOUT: LD C,2H JP 0005H ; T96TAB: DEFB 32 DEFB 2 DEFB 68 DEFB 2 ; T18TAB: DEFB 32 DEF78 JR Z,OVERMAX JR IN4 IN96: LD A,(HL) CP 79 JR Z,OVERMAX JR IN3 IN4: INC (HL) IN3: INC (HL) CALL SEESUB CALL DISPLAY JP FUNSE1 OVERMAX: LD E,07H CALL CONOUT JP FUNSE1 ; STEPOUT: CP 47H JR Z,OUT1 LD A,(SEKSID) OR 0 kB 2 DEFB 68 DEFB 2 ; T36TAB: DEFB 16 DEFB 1 DEFB 34 DEFB 1 ; WOFFTRK: DEFS 1 WTRK0D: DEFS 1 WAZIM: DEFS 1 WINDEX: DEFS 1 ; SEEBUF: DEFB 0FH SEKSID: DEFB 1H SEKTRK: DEFS 1 HOMBUF: DEFB 07H DEFB 1H STPTRK: DEFS 1 ; 4H LD (SEKSID),A JR OUT2 OUT1: LD A,(SEKSID) AND 03H LD (SEKSID),A OUT2: LD HL,SEKTRK LD A,(HL) CP 0 JR Z,STEPO1 LD A,(TPIBUF) CP 1 JR NZ,OUT3 DEC (HL) OUT3: DEC (HL) CALL SEESUB CALL DISPLAY JP FUNSE1 STEPO1: LD E,0DTPIBUF: DEFS 1 STSBUF: DEFS 7 STSLNG: DEFS 1 ; ; ; TYPMSG: DEFW 0D0AH DEFW 0D0AH DEFM ' *** FDD Alignment Test ver. 1.2 ***' DEFW 0D0AH DEFW 0D0AH DEFM 'Select the FDD type under test :' DEFW 0D0AH DEFW 0D0AH DEFM ' A) 9m7H CALL CONOUT JP FUNSE1 ROTSPD: ; CALL DISPLAY JP FUNSE1 PRINT: LD C,A RRA RRA RRA RRA AND 0FH PRINT1: ADD A,30H LD L,A LD A,C AND 0FH PRINT3: ADD A,30H LD H,A RET ; HEXDEC: LD C,A SRL A SRL A SRL A SRL A A|6 TPI' DEFW 0D0AH DEFM ' B) 48 TPI , 1.8 degree Stepper motor angle' DEFW 0D0Ah DEFM ' C) 48 TPI , 3.6 degree Stepper motor angle' DEFW 0D0AH DEFW 0D0AH DEFM 'Press A , B or C ? $' ; FUNMSG: DEFW 0D0AH DEFW 0D0AH DEFM 'Alignment tND 0FH CP 0 LD B,A LD A,0 LD E,16H JR Z,HEXD1 HEXD2: ADD A,E DAA DEC B JR NZ,HEXD2 LD B,A HEXD1: LD A,C AND 0FH CP 0AH JR C,HEXD3 ADD A,06 HEXD3: ADD A,B DAA RET ; SEESUB: LD HL,SEEBUF LD B,3 CALL FDCCMD EI aest item : ( Press Upper case for head 0; Lower case for head 1 )' DEFW 0D0AH DEFW 0D0AH DEFM ' A) Rotation speed' DEFW 0D0AH DEFM ' B) Offtrack' DEFW 0D0AH DEFM ' C) Track 00 detector (ESC to abort)' DEFW 0D0AH DEFM ' D) RecalibrHALT ; HOMSUB: LD HL,HOMBUF LD B,2 CALL FDCCMD EI HALT ; FDCCMD: CALL WRT38H FCMD1: IN A,(FDCSTS) AND FDCBUSY JR NZ,FCMD1 LD C,FDCDAT FC0: IN A,(FDCSTS) RLCA JR NC,FC0 RLCA JR C,STSRD OUTI JR NZ,FC0 RET ; STSRD: Late' DEFW 0D0AH DEFM ' E) Azimuth' DEFW 0D0AH DEFM ' F) Step in' DEFW 0D0AH DEFM ' G) Step out' DEFW 0D0AH DEFM ' H) Reselect FDD type' DEFW 0D0AH DEFM ' I) QUIT$' ; CRLFMSG: DEFW 0D0AH DEFW 0D0AH DEFM '$' CURMSG: D 'D A,0 LD (STSLNG),A LD HL,STSBUF SR0: IN A,(FDCSTS) RLCA JR NC,SR0 RLCA JR C,SR2 LD A,SENINT OUT (FDCDAT),A LD HL,STSBUF SR1: IN A,(FDCSTS) RLCA JR NC,SR1 RLCA JR NC,SR3 SR2: IN A,(FDCDAT) LD (HL),A PUSH HL LD HL,STYEFM 'Current Track # ' CURTRK: DEFB 30H DEFB 30H DEFM ' Current item : ' CURITM: DEFB 20H DEFM ' Select item : $' END <v STS EQU 80H SIOBD EQU 89H SIOBC EQU 8BH RCVRDY EQU 0 TRXRDY EQU 2 POP_HL EQU 0E1H JP EQU 0C3H ; MOTORON EQU 99H PRTSTR EQU 09H BDOS EQU 05H CON_OUT EQU 02H CON_IN EQU 01H ; ;** ;* v  * ;* INTERRUPT SERVICE ! * ;* NMI FOR DATA TRANSFER  * ;* * ;**9 ; FORMAT: START: LD (SP_BUF),SP LD SP,T_SP LD Bv 0,100 LD HL,SK_CMBF LD A,0 START1: LD (HL),A INC HL DJNZ START1 CALL PUSH_INT IM INT_2_MODE LD A,POP_HL LD (I_1P),A LD A,JP LD (I_1P+1),A LD HL,STSRD LD (I_1P+2),HL ;** ;*  v $ * ;* FORM  * ;* FORMH...FORM SIDE * ;* FORMTRK...FORM TRACK  * ;* * ;** ; LD DE,DSK_MSG v CALL PRTMSG FOR1: LD DE,RUN1_MSG CALL PRTMSG FOR2: CALL CONIN CP 1BH JP Z,FOR70 LD (CON_BUF),A CP 41H JP C,FOR1 SUB 41H CP 04H JP NC,FOR1 LD (HSTDSK),A LD (RDDSK),A LD (HOMDSK),A FOR50: LD DE,RUN_MSG CALL PRTMSG CALL Cv ONIN CP 1BH JP Z,FOR70 CP 59H JR Z,FOR30 JR FOR50 FOR30: CALL HOME CALL HOME LD DE,LINEFD CALL PRTMSG CALL FORM FOR70: LD DE,END_MSG CALL PRTMSG FOR80: CALL POP_INT LD SP,(SP_BUF) JP 0000 ; ; ; ; ; ; FORM: CALL PUS,g; ;** ;* * ;* EQUATES  * ;* PARAMETER DEFINE * ;* * ;***xH_NMI LD A,1 OUT (MOTORON),A CALL DELAY LD A,TRK0 LD (HSTTRK),A LD (RDTRK),A FORM1: CALL FORMTRK PUSH BC LD A,(REFLG) CP 0AAH JR NZ,FORM3 LD E,45H JR FORM4 FORM3: LD E,2EH FORM4: CALL CONOUT POP BC LD HL,HSTTRK LD A,27Hk*** ; SPEED EQU 9CH INT_2_MODE EQU 2 I_1P EQU 0038H CTC0INT EQU 0FFF0H CTC0HINT EQU 0FFH FO_COUNT EQU 4 HEAD0 EQU 0 HEAD1 EQU 1 TRK0 EQU 0 TRK96 EQU 79 TRK48 EQU 39 NMI_P EQU 0066H OUTI_OP EQU 0A3EDH INI_OP EQU 0A2EDH RETN_OP EQ CP (HL) JR NZ,FORM2 PUSH HL LD DE,FINISH CALL PRTMSG POP HL FORM2: INC (HL) LD A,(HL) LD (RDTRK),A LD IX,TRKLST CP (IX) JR C,FORM1 LD DE,FINIST CALL PRTMSG CALL POP_NMI RET FORMTRK: LD A,4 LD (RETRY),A REFORM: LD H aU 045EDH SEKCMD EQU 0FH SENINT EQU 08H MFM_FO_CMD EQU 4DH MFM_N EQU 1 MFM_GPL EQU 0CH MFM_SC EQU 18 FM_FO_CMD EQU 0DH FM_N EQU 0 FM_GPL EQU 09H FM_SC EQU 18 FORM_DATA EQU 0E5H TCRES EQU 9DH FDCBUSY EQU 00010000B FDCDAT EQU 81H FDCL,RETRY DEC (HL) RET Z LD A,HEAD0 LD (HSTHEAD),A CALL FORM_H_TRK FORMT2: LD A,HEAD1 LD (HSTHEAD),A CALL FORM_H_TRK CALL RDSUB LD A,(REFLG) CP 0AAH JR Z,REFORM RET FORM_H_TRK: LD A,MFM_SC LD (FORM_SC),A LD HL,OUTI_OP LD ('NMI_P),HL LD HL,RETN_OP LD (NMI_P+2),HL CALL SEEK CALL S_F_DABF CALL S_F_CMBF LD B,6 CALL FDCCMD JP NZ,FO_TK5 LD C,FDCDAT LD DE,0 FO_TK2: LD HL,FO_DABF LD B,FO_COUNT EI FO_TK3: HALT JR NZ,FO_TK3 LD A,(FORM_SC) INC E CP E  ޗ  RECALIBRTA DISK  * ;*  (HSTDSK).....DISK * ;* SEEK  * ;* !SEARCH TRACK <--- (HSTTRK) * ;* * ;* * ;J JR Z,FO_TK4 LD HL,FO_SEC_TBL ADD HL,DE LD A,(HL) LD (FO_DABF+2),A JR FO_TK2 FO_TK4: OUT (TCRES),A HALT FO_TK5: RET ; PUSH_NMI: PUSH HL LD HL,(NMI_P) LD (T_NMI),HL LD HL,(NMI_P+2) LD (T_NMI+2),HL POP HL RET ; POP_NMI:  5** ; ; SEEK: PUSH BC LD IX,SK_CMBF LD A,SEKCMD LD (IX),A CALL HDS_DS LD (IX+1),A ;HDS DS1 DS0 LD A,(HSTTRK) DBLTRK: LD (IX+2),A LD B,3 SE0: LD HL,SK_CMBF CALL FDCCMD LD HL,SE_RET PUSH HL EI3PUSH HL LD HL,(T_NMI) LD (NMI_P),HL LD HL,(T_NMI+2) LD (NMI_P+2),HL POP HL RET ; PUSH_INT: PUSH HL LD HL,(I_1P) LD (T_INT),HL LD HL,(I_1P+2) LD (T_INT+2),HL POP HL RET ; POP_INT: PUSH HL LD HL,(T_INT) LD (I_1P),HL LD H # HALT SE_RET: POP BC RET ; ;** ;* * ;* FDCCMD  * ;*  HL.....CMD POINTER * ;* B.....CMD LENGTH * ;* /L,(T_INT+2) LD (I_1P+2),HL POP HL RET ; ; ; S_F_DABF: LD HL,FO_DABF LD A,(HSTTRK) LD (HL),A INC HL LD A,(HSTHEAD) LD (HL),A INC HL LD A,(FO_SEC_TBL) LD (HL),A INC HL LD A,MFM_N LD (HL),A RET ; S_F_CMBF: LD HL,FO_CMBF   * ;** ; FDCCMD: CALL S_INTV IN A,(FDCSTS) AND FDCBUSY JR NZ,FDCCMD LD C,FDCDAT FC0: IN A,(FDCSTS) RLCA JR NC,FC0 RLCA JR C,STSRD OUTI JR NZ,FC0 RET ; S_I S_FO_MFM: LD A,MFM_FO_CMD LD (HL),A INC HL CALL HDS_DS LD (HL),A INC HL LD A,MFM_N LD (HL),A INC HL LD A,MFM_SC LD (HL),A INC HL LD A,MFM_GPL LD (HL),A S_FO_RET: INC HL LD A,FORM_DATA LD (HL),A LD HL,FO_CMBF RET RDSUB:NTV: PUSH HL LD A,CTC0HINT LD I,A LD HL,I_1P LD (CTC0INT),HL POP HL RET ;FDC STATUS READ ; STSRD: LD HL,STSBUF SR0: IN A,(FDCSTS) RLCA JR NC,SR0 RLCA JR C,SR2 LD A,SENINT OUT (FDCDAT),A SR1: IN A,(FDCSTS) RLCA JR x LD A,1 LD (REFLG),A LD A,0 LD (RDHEAD),A INC A LD (RDSEC),A LD A,(RDDSK) AND 03H LD (RDDSK),A RDSUB1: CALL READ JR NZ,RDSUB2 LD A,(RDSEC) INC A CP 13H LD (RDSEC),A JR C,RDSUB1 LD A,1 LD (RDHEAD),A LD (RDSEC),A LD A}NC,SR1 RLCA JR NC,SR3 SR2: IN A,(FDCDAT) LD (HL),A INC HL JR SR1 SR3: LD A,(STSBUF) AND 11000000B RETI ;** ;* * ;* HDS_DS * ;* ,(RDDSK) OR 04H LD (RDDSK),A RDSUB3: CALL READ JR NZ,RDSUB2 LD A,(RDSEC) INC A LD (RDSEC),A CP 13H JR C,RDSUB3 RET RDSUB2: LD A,0AAH LD (REFLG),A RET ; READ: LD HL,INI_OP LD (NMI_P),HL LD HL,RDBUF LD B,9 CALL FDCCMD ʕ .....HDS DS1 DS0  * ;* INPUT (HSTHEAD)  * ;* (HSTDSK) * ;* OUTPUT * ;*  A * ;* * ; LD B,0 LD HL,FDDBUF READ1: EI HALT JR NZ,READ1 OUT (TCRES),A HALT ; HOME: LD HL,HOMBUF LD B,2 CALL FDCCMD EI HALT ; HOMBUF: DEFB 07H HOMDSK: DEFS 1 ; RDBUF: DEFB 46H RDDSK: DEFS 1 RDTRK: DEFB 0 RDHEAD: DEFB 0 E** ; HDS_DS: LD A,(HSTHEAD) ADD A,A ADD A,A PUSH HL LD HL,HSTDSK OR (HL) POP HL RET ; ; ; PRTMSG: LD C,PRTSTR JP BDOS ; ; CONIN: LD C,CON_IN JP BDOS ; ; CONOUT: LD C,CON_OUT JP B ӭ} RDSEC: DEFB 1 DEFB 1 DEFB 12H DEFB 0AH DEFB 0FFH ; REFLG: DEFB 0 RETRY: DEFS 1 FDDBUF: DEFS 256 ; ; ;** ;* * ;* FDHOME  * ;* DOS ; ; DELAY: PUSH AF PUSH HL PUSH BC LD HL,800 DELAY1: LD B,120 DJNZ $ DEC HL LD A,L OR H JR NZ,DELAY1 POP BC POP HL POP AF RET ;; ; DSK_MSG: DEFW 0D0AH DEFM 'MIC-504 system format vers 3.2' DEFW 0D0AH DEFM '$c' RUN1_MSG: DEFW 0D0AH DEFM ' Drive name ? (A or B. ESC to abort.)' DEFM '$' ; ; RUN_MSG: DEFW 0D0AH DEFM ' Press Y for starting format. (ESC to abort.)' DEFM '$' ; ; END_MSG: DEFB 0DH DEFB 0AH DEFM 'end of MIC-500 formatt vXed' DEFB 07H DEFB 0DH DEFB 0AH DEFM '$' ; FINISH: DEFM ' 40 tracks formatted' DEFW 0D0AH DEFM '$' ; FINIST: DEFM ' 80 tracks formatted' DEFW 0D0AH DEFM '$' ; LINEFD: DEFW 0D0AH DEFW 0D0AH DEFM '$' ; ; ; ;******* a .Z80 BDOS EQU 0005H WBOOT EQU 0000H WRITE EQU 0F22AH READ EQU 0F227H SETDMA EQU 0F224H SELDSK EQU 0F21BH SETTRK EQU 0F21EH SETSEC EQU 0F221H CPM_LN EQU 2480H RECLEN EQU 80H CPMBAS EQU 0900H PRTSTR EQU 09H CONSTS EQU 01H WRUAL {*** ;* * ;* SCRATCH_PAD AREA  * ;* * ;**3 ; TRKLST: DEFB 80 ; ; FO_SEC_TBL: DEFB 1  ~ EQU 02H TRYNO EQU 0AH LD (RT_BUF),SP LD SP,SP_BUF ; LD DE,VERMSG CALL STRPRT SOUASK: LD DE,SOUREA CALL STRPRT CALL CSTSRD CP 0DH JR NZ,SOUAS1 LD DE,SPALIN CALL STRPRT JP PASS SOUAS1: CP 41H JR C,SOUAS2 CP 45H JR C,SOUAS7 DEFB 0AH DEFB 2H DEFB 0BH DEFB 3 DEFB 0CH DEFB 4 DEFB 0DH DEFB 5 DEFB 0EH DEFB 6H DEFB 0FH DEFB 7 DEFB 10H DEFB 8H DEFB 11H DEFB 9H DEFB 12H ; SP_BUF: DEFS 2 SK_CMBF: DEFS 9 STSBUF: DEFS 7 T_NMI: D 3 SOUAS2: LD DE,INNAME CALL STRPRT JR SOUASK SOUAS3: LD (SOUREN),A LD DE,SOUREV CALL STRPRT CALL CSTSRD CP 0DH JP NZ,FINISH LD A,TRYNO LD (RW_TRY),A READ1: LD C,0 CALL SELDSK LD DE,0AH ADD HL,DE LD E,(HL) INC HL LD D,(HL)EFS 4 T_INT: DEFS 4 TEMP: DEFS 20 T_SP: DEFS 1 FO_CMBF: DEFS 6 FO_DABF: DEFS 4 HSTDSK: DEFS 1 HSTHEAD: DEFS 1 HSTTRK: DEFS 1 FORM_SC: DEFS 1 MT_MFM_SK: DEFS 1 CON_BUF: DEFS 4 ; ; END + EX DE,HL LD DE,6BH ADD HL,DE XOR A LD (HL),A LD A,(SOUREN) SUB 41H LD C,A CALL SELDSK LD HL,CPMBAS LD DE,0000H LD B,CPM_LN/RECLEN READ2: PUSH BC PUSH HL PUSH DE LD C,L LD B,H CALL SETDMA LD C,D CALL SETTRK LD C,Ev- CALL SETSEC CALL READ JR Z,NERRO1 POP DE POP HL POP BC LD HL,RW_TRY DEC (HL) JR NZ,READ1 LD DE,RDERO CALL STRPRT JP $ NERRO1: POP DE INC E LD A,E CP 24H JR C,READ3 LD E,0 INC D READ3: POP HL LD BC,RECLEN ADD HL,vXBC POP BC DJNZ READ2 NEXTRA: LD DE,COMPLE CALL STRPRT PASS: LD DE,DESTIA CALL STRPRT CALL CSTSRD CP 0DH JP Z,FINISH CP 41H JR C,DESAS1 CP 45H JR C,DESAS2 DESAS1: LD DE,INNAME CALL STRPRT JR PASS DESAS2: LD (DESTIN),A LD DvE,DESTIV CALL STRPRT CALL CSTSRD CP 0DH JP NZ,FINISH LD A,TRYNO LD (RW_TRY),A WRITE1: LD C,0 CALL SELDSK LD DE,0AH ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD DE,6BH ADD HL,DE XOR A LD (HL),A LD A,(DESTIN) SUB  v'41H LD C,A CALL SELDSK LD HL,CPMBAS LD DE,0000H LD B,CPM_LN/RECLEN WRITE2: PUSH BC PUSH HL PUSH DE LD C,L LD B,H CALL SETDMA LD C,D CALL SETTRK LD C,E CALL SETSEC LD A,WRUAL LD C,A CALL WRITE JR Z,NERRO2 POP DE POP K*HL POP BC LD HL,RW_TRY DEC (HL) JR NZ,WRITE1 LD DE,WRERO CALL STRPRT JP $ NERRO2: POP DE INC E LD A,E CP 24H JR C,WRITE3 LD E,0 INC D WRITE3: POP HL LD BC,RECLEN ADD HL,BC POP BC DJNZ WRITE2 JP NEXTRA FINISH: LD SP,(R JR START SET_CUR: LD HL,(ACAPA) CALL CURSUB LD A,B LD (ACURTY),A LD HL,(BCAPA) CALL CURSUB LD A,B LD (BCURTY),A START: LD DE,VERMSG CALL PRNMSG ASKDSK: LD DE,DSKMSG CALL PRNMSG ; ; CHECK INVALID DRIVE# ; CALL CONIN1 CP 1BHT_BUF) JP WBOOT STRPRT: LD C,PRTSTR JP BDOS CSTSRD: LD C,CONSTS JP BDOS VERMSG: DEFW 0D0AH DEFM 'SYSGEN VER 2.0$' SOUREA: DEFW 0D0AH DEFM 'SOURCE DRIVE NAME (OR RETURN TO SKIP)$' SOUREV: DEFW 0D0AH DEFM 'SOURCE ON ' SOUREN: DEFS 1 DEF  JP Z,ABORT LD (ENDDSK),A SUB 41H JR C,ASKDSK JR Z,ASKDSK CP 03H JR NC,ASKDSK LD (DSKBUF),A ; ; SELECT TYPE ; ASKTYP: LD DE,TYPMSG CALL PRNMSG CALL CONIN1 CP 1BH JP Z,ABORT LD (ENDTYP),A SUB 30H JR Z,ASKTYP JR C,ASKTYPM ' THEN TYPE RETURN$' COMPLE: DEFW 0D0AH DEFW 0D0AH DEFM 'FUNCTION COMPLETE$' DESTIA: DEFW 0D0AH DEFM 'DESTINATION DRIVE NAME (OR RETURN TO REBOOT)$' DESTIV: DEFW 0D0AH DEFM 'DESTINATION ON ' DESTIN: DEFS 1 DEFM ' THEN TYPE RETURN$' INNAME: U CP 0AH JR C,ASKTY1 SUB 7H CP 0AH JR NZ,ASKTYP ASKTY1: LD (TYPBUF),A LD A,(CK_BUF) CP 0AAH JR Z,FENTRY ; ; REPLACE BIOS ; LD HL,BIOS LD DE,0F200H LD BC,0DF0H LDIR LD A,0AAH LD (CK_BUF),A ; ; FIND PARAMETER ENTRY OF REPLA DEFW 0D0AH DEFM 'INVALID DRIVE NAME (USE A, B, C, OR D)$' SPALIN: DEFW 0D0AH DEFM '$' RDERO: DEFW 0D0AH DEFW 0D0AH DEFM '****READ ERROR****$' WRERO: DEFW 0D0AH DEFW 0D0AH DEFM '****WRITE ERROR****$' RW_TRY: DEFS 1 DEFS 40 SP_BUF: RT_ rCING ; FENTRY: LD A,(TYPBUF) LD BC,29 LD HL,P_TBL NEXTDK: DEC A JR Z,CUR_DK ADD HL,BC JR NEXTDK ; ; FIND PARAMETER ENTRY OF REPLACED ; CUR_DK: PUSH HL LD A,(DSKBUF) LD C,A CALL SELDSK LD DE,0AH ADD HL,DE LD E,(HL) INC HNBUF: DEFS 2 END 6EFM '****READ ERROR****$' WRERO: DEFW 0D0AH DEFW 0D0AH DEFM '****WRITE ERROR****$' RW_TRY: DEFS 1 DEFS 40 SP_BUF: RT_L LD D,(HL) POP HL LD BC,27 LDIR ; ; CHECK XTL TABLE NEEDED ; LD E,(HL) INC HL LD D,(HL) LD A,E OR D JP Z,CR_XTL ; ; FIND XTL ENTRY OF REPLACED ; LD A,(DSKBUF) LD HL,XTL LD BC,40 OR A JR Z,S_XTL NEXTL: ADD HL,BC DECv A JR NZ,NEXTL S_XTL: EX DE,HL PUSH DE LD BC,40 LDIR LD A,(DSKBUF) LD C,A CALL SELDSK POP DE LD (HL),E INC HL LD (HL),D ; ; REBOOT BIOS ? ; FINIST: LD HL,(ACAPA) LD A,L CP 5EH JP NZ,FINISH LD A,H OR A JP Z,FINISHv LD HL,(BCAPA) LD A,L CP 5EH JP NZ,FINISH LD A,H OR A JP Z,FINISH ; ; REBOOT BIOS !!! ; LOAD: CALL BHOME LD HL,0DB00H LD (BDMA),HL XOR A LOAD2: LD (BTRK),A LD (SKTRK),A CALL BSEEK LD A,1 LOAD1: LD HL,BSEC LD (HL),A vREREAD: CALL BREAD JR NZ,REREAD LD HL,(BDMA) LD DE,0100H ADD HL,DE LD (BDMA),HL LD A,(BSEC) INC A CP 13H JR C,LOAD1 LD A,(BTRK) INC A CP 2 JR C,LOAD2 LD A,(BADDRS) CP 53H JR Z,BOOT5 LD C,0 CALL PMTENT LD BC,0AH ADD  ORG 100H CK_BUF EQU 0FFE0H PMTENT EQU 0F21BH BADDRS EQU 0DB00H WBOOT1 EQU 0F203H XTL EQU 0FF54H BOOT1 EQU 0000H BDOS1 EQU 0005H ATOFLG EQU 0FBD5H LD SP,STKPOT LD A,(CK_BUF) CP 0AAH JR Z,SET_CUR LD A,31H LD (ACURTY),A LD (BCURTY),A  HL,BC LD E,(HL) INC HL LD D,(HL) LD A,4 BOOT6: LD HL,BADPBV LD BC,15 LDIR DEC A JR NZ,BOOT6 LD HL,08H ADD HL,DE EX DE,HL LD A,5 BOOT7: LD HL,BADRV LD BC,07H LDIR DEC A JR NZ,BOOT7 BOOT8: LD DE,ENDMSG CALL PRNMSG p XOR A LD (CK_BUF),A LD (ATOFLG),A JP WBOOT1 BOOT5: IN A,(FDCINT) BIT 3,A JR Z,BOOT8 CALL PMTENT LD BC,0AH ADD HL,BC LD E,(HL) INC HL LD D,(HL) LD HL,67H ADD HL,DE LD A,1 LD (HL),A INC HL LD (HL),A INC HL LD (HL),A ;SPT ; DEFW 0000H ; MIC501: DEFW 0024H DEFB 04H DEFB 0FH DEFB 00H DEFW 0054H DEFW 003FH DEFB 80H DEFB 00H DEFW 0010H DEFW 0002H ; DEFB 01H ;M_N DEFB 12H ;EOT DEFB 0AH ;GPL DEFB 0FFH ;DTL DEFB 28H ;TRK# DEFB 70H ;OGR L INC HL LD (HL),A JR BOOT8 FINISH: LD DE,ENDMSG CALL PRNMSG JP BOOT1 ; ; ABORT ; ABORT: LD DE,ABTMSG CALL PRNMSG JP BOOT1 CR_XTL: LD A,(DSKBUF) LD C,A CALL SELDSK LD (HL),0 INC HL LD (HL),0 JP FINIST ; PRNMSG: LD aDEFB 00H ;RTRK DEFW 0100H ;BYTES/SECTOR DEFB 01H ;SMSK DEFB 10H ;BLOCK DEFB 24H ;SPT ; DEFW 0000H ; XEROX1: DEFW 0012H DEFB 03H DEFB 07H DEFB 00H DEFW 0052H DEFW 001FH DEFB 80H DEFB 00H DEFW 0010H DEFW 0003H ; DEFB 00H  C,09H CALL BDOS1 RET ; CONIN1: LD C,01H CALL BDOS1 RET ; CURSUB: LD B,31H LD A,L CP 5EH JR NZ,CURSU1 LD A,H OR A RET NZ LD B,39H RET CURSU1: INC B CP 54H RET Z INC B CP 52H RET Z INC B CP 9CH RET Z INC  8 DEFB 12H DEFB 07H DEFB 0FFH DEFB 28H ;TRK# DEFB 30H ;OGR DEFB 00H ;RTRK DEFW 0080H ;BYTES/SECTOR DEFB 00H ;SMSK DEFB 08H ;BLOCK DEFB 12H ;SPT ; DEFW XER1XTL ;XTL TABLE ENTRY ; XEROX2: DEFW 0022H DEFB 03H DEFB 07H DEFB 00H lB CP 2DH RET Z INC B CP 0B8H RET Z INC B CP 0AAH RET Z INC B CP 0C2H RET Z LD B,41H RET ; BHOME: LD HL,HM_CMBF LD B,2 CALL BFDCCMD EI HALT ; ; SEEK FOR BOOT ; BSEEK: LD HL,SK_CMBF LD B,3 CALL BFDCCMD EI H DEFW 009CH DEFW 003FH DEFB 0C0H DEFB 00H DEFW 0010H DEFW 0003H ; DEFB 01H ;M_N DEFB 11H ;EOT DEFB 0AH ;GPL DEFB 0FFH ;DTL DEFB 28H ;TRK# DEFB 70H ;OGR DEFB 00H ;RTRK DEFW 100H ;BYTES/SECTOR DEFB 01H ;SMSK DEFB 08H ;BLOCK DEEALT ; ; READ FOR BOOT ; BREAD: LD HL,INI_OP LD (NMI_P),HL LD HL,RETN_OP LD (NMI_P+2),HL LD HL,RD_CMBF LD B,9 CALL BFDCCMD LD HL,(BDMA) LD B,0 LD C,FDCDAT BREAD1: HALT JR NZ,BREAD1 EI OUT (TCRES),A HALT ; ;FDCCMD FOR BOOFB 22H ;SPT ; DEFW 0000H ; OSBOR1: DEFW 0014H DEFB 04H DEFB 0FH DEFB 01H DEFW 002DH DEFW 003FH DEFB 80H DEFB 00H DEFW 0010H DEFW 0003H ; DEFB 01H DEFB 0AH ;EOT DEFB 14H ;GPL ? (18H/8. 14H/10H) DEFB 0FFH ;DTL DEFB 28H ;TRT ; BFDCCMD: CALL BWRT38H BFC0: IN A,(FDCSTS) AND FDCBUSY JR NZ,BFC0 LD C,FDCDAT BFC1: IN A,(FDCSTS) RLCA JR NC,BFC1 RLCA JR C,BSTSRD OUTI JR NZ,BFC1 RET ; ; STSRD FOR BOOT ; BSTSRD: LD A,0 LD (BSTSLNG),A LD HL,BSTSB1K# DEFB 30H ;OGR DEFB 00H ;RTRK DEFW 100H DEFB 01H ;SMSK DEFB 10H ;BLOCK DEFB 14H ;SPT ; DEFW OSB1XTL ; OSBOR2: DEFW 0028H DEFB 03H DEFB 07H DEFB 00H DEFW 00B8H DEFW 003FH DEFB 0C0H DEFB 00H DEFW 0010H DEFW 0003H ; DUF BSR0: IN A,(FDCSTS) RLCA JR NC,BSR0 RLCA JR C,BSR2 LD A,SENINT OUT (FDCDAT),A LD HL,BSTSBUF BSR1: IN A,(FDCSTS) RLCA JR NC,BSR1 RLCA JR NC,BSR3 BSR2: IN A,(FDCDAT) LD (HL),A PUSH HL LD HL,BSTSLNG INC (HL) POP HL EFB 03H ;M_N DEFB 05H ;EOT DEFB 50H ;GPL ? (80H/4, 50H/5) DEFB 0FFH ;DTL DEFB 28H DEFB 70H ;OGR DEFB 00H ;RTRK DEFW 400H ;BYTES DEFB 07H ;SMSK DEFB 08H ;BLOCK DEFB 28H ;SPT ; DEFW 0000H ; TELEVIDEO: DEFW 0048H DEFB 04H DEFB 0 INC HL JR BSR1 BSR3: LD A,(BSTSBUF) AND 11000000B POP HL RETI ; BWRT38H: IM 2 LD A,CTC0HINT LD I,A PUSH HL LD HL,BSTSRD LD (CTC0INT),HL POP HL RET ; P_TBL: MIC504: DEFW 0048H DEFB 04H DEFB 0FH DEFB 00H DEFW 015EHFH DEFB 00H DEFW 00AAH DEFW 003FH DEFB 80H DEFB 00H DEFW 0010H DEFW 0002H ; DEFB 01H DEFB 12H DEFB 0AH DEFB 0FFH ;DTL DEFB 28H ;TRK# DEFB 70H ;OGR DEFB 00H ;RTRK DEFW 100H ;BYTES DEFB 01H ;SMSK DEFB 10H ;BLOCK DEFB 48H   DEFW 007FH DEFB 00C0H DEFB 00H DEFW 0020H DEFW 0002H ; DEFB 01H ;M_N DEFB 12H DEFB 0AH ;M_GPL DEFB 0FFH ;M_DTL DEFB 50H ;TRK# DEFB 60H ;OGR DEFB 00H DEFW 100H ;BYTES/FDDSEC DEFB 01H ;SMSK DEFB 10H ;BLOCK SIZE/128 DEFB 48H ;SPT ; DEFW 0000H ; KAYPRO: DEFW 0028H DEFB 03H DEFB 07H DEFB 00H DEFW 00C2H DEFW 003FH DEFB 0C0H DEFB 00H DEFW 0010H DEFW 0001H ; DEFB 02H DEFB 09H ;EOT DEFB 15H ;GPL ? (8H/2AH, 0AH/15H) DEFB 0FFH ;DTL DEFB 28H ;TRK# DEFB 71H ;OGR DEFB 00H ;RTRK DEFW 200H ;BYTES DEFB 03H ;SMSK DEFB 08H ;BOCK DEFB 28H ;SPT ; DEFW 0000H ; MARROW: DEFW 0028H DEFB 04H DEFB 0FH DEFB 01H DEFW 005EH DEFW 007FH DEFB 0C0H DEFB 00H DEFW 0020H DEFW 0002H ; DE OX 820-I 9 1 SINGLE' DEFW 0D0AH DEFM '<4> XEROX 820-II 51 DOUBLE' DEFW 0D0AH DEFM '<5> OSBORNE I 7 1 SINGLE' DEFW 0D0AH DEFM '<6> OSBORNE II /1 DOUBLE' DEFW 0D0AH DEFM '<7> TELFB 03H DEFB 05H DEFB 50H DEFB 0FFH DEFB 28H DEFB 70H DEFB 00H DEFW 400H DEFB 07H DEFB 10H DEFB 28H ; DEFW MARXTL ; PC8001: DEFW 0040H DEFB 04H DEFB 0FH DEFB 01H DEFW 0097H DEFW 007FH DEFB 0C0H DEFB 00H DEFW 0020H  FEVIDEO 801 2 DOUBLE' DEFW 0D0AH DEFM '<8> KAYPRO II 1 DOUBLE' DEFW 0D0AH DEFM '<9> MARROW DECISION 1 DOUBLE' DEFW 0D0AH DEFM ' NEC PC-8001BMK II 2 DOUBLE' DEFW 0D0AH DEFM '$' DSKMSG: DEFW 0002H ; DEFB 01H DEFB 10H DEFB 0AH DEFB 0FFH DEFB 28H DEFB 70H DEFB 00H DEFW 100H DEFB 01H DEFB 10H DEFB 40H ; DEFW 0000H ; XER1XTL: DEFB 00H DEFB 05H DEFB 0AH DEFB 0FH DEFB 02H DEFB 07H DEFB 0CH DEFB 11H   DEFW 0D0AH DEFM 'Which drive will be assigned ?(Press B, C or D. ESC to abort)$' TYPMSG: DEFW 0D0AH DEFM 'Select type ? (Press 1,2,3,4,5,6,7,8,9, or A. ESC to abort)$' ENDMSG: DEFW 0D0AH DEFB 07H DEFW 0D0AH DEFM 'Drive ' ENDDSK: DEFS 1  DEFB 04H DEFB 09H DEFB 0EH DEFB 01H DEFB 06H DEFB 0BH DEFB 10H DEFB 03H DEFB 08H DEFB 0DH ; OSB1XTL: DEFB 00H DEFB 01H DEFB 04H DEFB 05H DEFB 08H DEFB 09H DEFB 0CH DEFB 0DH DEFB 10H DEFB 11H DEFB 02H DEFB 03H   DEFM ' is now set to TYPE ' ENDTYP: DEFS 1 DEFM '.' DEFW 0D0AH DEFM '$' ABTMSG: DEFW 0D0AH DEFW 0D0AH DEFB 07H DEFM 'ASSIGN WAS ABORTTED!!!' DEFW 0D0AH DEFM '$' ; RD_CMBF: DEFB 46H DEFB 00H BTRK: DEFS 01H DEFB 00H BSEC: DEFS DEFB 06H DEFB 07H DEFB 0AH DEFB 0BH DEFB 0EH DEFB 0FH DEFB 12H DEFB 13H ; MARXTL: DEFB 00 DEFB 01 DEFB 02 DEFB 03 DEFB 04 DEFB 05 DEFB 06 DEFB 07 DEFB 18H DEFB 19H DEFB 1AH DEFB 1BH DEFB 1CH DEFB 1DH DEFB 1EH  01H DEFB 01H DEFB 12H DEFB 0AH DEFB 0FFH ; HM_CMBF: DEFB 07H DEFB 00H ; SK_CMBF: DEFB 0FH DEFB 00H SKTRK: DEFS 01H ; DSKBUF: DEFS 1 TYPBUF: DEFS 1 BSTSBUF: DEFS 9 BSTSLNG: DEFS 1 BDMA: DEFS 2 STKPT: DEFS 60 STKPOT: DEFS 1  DEFB 1FH DEFB 08 DEFB 09 DEFB 0AH DEFB 0BH DEFB 0CH DEFB 0DH DEFB 0EH DEFB 0FH DEFB 20H DEFB 21H DEFB 22H DEFB 23H DEFB 24H DEFB 25H DEFB 26H DEFB 27H DEFB 10H DEFB 11H DEFB 12H DEFB 13H DEFB 14H DEFB 15H DEF JP 0005H ; ; ; **& ;* * ;* BIOS ROUTINE * ;* * ; ** ; BIOSBAS EQU 0F200H ;MIC-500 BIOS ENTRY BDOSLN EQU 1600H ;THE LENGTH OF CCP AND BDOS CCPLEN EQU 800H ;THE LENGTH OF CCP CPMBUF EQU 080H ;THEB 16H DEFB 17H BADPBV: DEFB 48H DEFB 00H DEFB 04H DEFB 0FH DEFB 00H DEFB 5EH DEFB 01H DEFB 7FH DEFB 00H DEFB 0C0H DEFB 00H DEFB 20H DEFB 00H DEFB 02H DEFB 00H ; BADRV: DEFB 4FH DEFB 0C0H DEFB 01H DEFB 12H DEFB 0 ADDRESS OF DEFAULT DISK BUFFER ; ; ORG BIOSBAS CPMBAS EQU $-BDOSLN ;CCP ENTRY BDOS EQU CPMBAS+CCPLEN+6 ;SYSTEM CALL ENTRY ; ROMACT EQU 98H ;THE PORT OF BANK SWITCH MOTORON EQU 99H ;THE CONTROL PORT OF DC MOTOR OF DRIVES ; ; ;IOBYTE INFORMA\AH DEFB 0FFH DEFB 12H VERMSG: DEFW 0D0AH DEFM 'MIC-504 system assign utility ver 3.0' DEFW 0D0AH DEFW 0D0AH DEFM 'Drive A is currently set to TYPE ' ACURTY: DEFS 1 DEFM '.' DEFW 0D0AH DEFM 'Drive B is currently set to TYPE ' BCURTY: GTIION ; IOBYTE EQU 0003H ;IOBYTE IOLIST EQU 0C0H ;BIT 7,6 OF IOBYTE IS FOR LST: IOPUNCH EQU 30H ;BIT 5,4 OF IOBYTE IS FOR PUN: IOREADR EQU 0CH ;BIT 3,2 OF IOBYTE IS FOR RDR: IOCONSL EQU 03H ;BIT 1,0 OF IOBYTE IS FOR CON: ; LOGDRV EQU 0004H ;T DDEFS 1 DEFM '.' DEFW 0D0AH DEFW 0D0AH DEFM 'TYPE COMPUTER MODEL SIDES DENSITY' DEFW 0D0AH DEFM '<1> MIC-504 4 2 DOUBLE' DEFW 0D0AH DEFM '<2> MIC-501 0 1 DOUBLE' DEFW 0D0AH DEFM '<3> XERHE ADDRESS OF CURRENTLY LOGGED DRIVE NOTRYS EQU 0AH ;THE RETRY NUMBER OF R/W/SECTOR RECLEN EQU 128 ; ;WRITE TYPE ; WRALL EQU 0 ;NORMAL SECTOR WRITE WRDIR EQU 1 ;WRITE TO DIRECTORY SECTOR WRUAL EQU 2 ;WRITE TO THE FIRST SECTOR OF A NEW DATA BLOU<CK ; ; MAXDRV EQU 3 ;FOR A,B,C,D 4 DRIVERS INIDRV EQU 3 TCRES EQU 09DH ;FDC TERMINATE COUNT PORT ; ;SIO ADDRESS ; SIOBD EQU 089H ;CONSOLE DATA PORT SIOBC EQU 08BH ;CONSOLE STATUS PORT SIOAD EQU 88H ;RS232 DATA PORT SIOAC EQU 8AH ;RS232 S ^ LD C,E CALL SETSEC ;SET SECTOR NUMBER TO E CALL READ ;READ SELECTED SECTOR JR Z,WBOO30 ;IF READ SUCCESSFUL THEN JUMP POP DE ;ELSE RETORE REG. POP HL POP BC LD HL,BOOTRY ;CHECK BOOT RETRY BUFFER DEC (HL) JR NZ,WBOO10 ;FINISH ? LTATUS PORT ; ;CTC PORT ADDRESS ; CTC0 EQU 84H CTC1 EQU 85H ;RS232 BAUD CTC2 EQU 0086H ; CONSOLE BAUD ; ;PIO ADDRESS ; PIOAD EQU 8CH ;PIO DATA PORT A FOR PARALLEL PRINTER PIOAC EQU 8EH ;PIO STATUS PORT A PIOBD EQU 8DH ;PIO DATA PORT B FOR  D HL,BOOMSG ;PRINT ERROR MESSAGE CALL PRTMSG JR $ ;SYSTEM DIE WBOO30: POP DE ;ADJUST TRACK AND SECTOR INC E ;NEXT SECTOR WILL BE READ LD A,E CP 24H ;END OF CURRENT TRACK? JR C,WBOO40 ;NOT END THEN JUMP LD E,0 ;CYCLE THE SECTOR NO. INCUPARALLEL PRINTER PIOBC EQU 8FH ;PIO STATUS PORT B ; ;INTERRUPT VECTOR ; CTC0INT EQU 0FFF0H CTC0HINT EQU 0FFH CTC0LINT EQU 0F0H FDCINT EQU 09CH INTREQ EQU 4 STROBE EQU 0 PRTBSY EQU 7 ASCETX EQU 3 ASCACK EQU 6 FDCSTS EQU 080H FDCDAT  C D ;INCREMENT TRACK NO. WBOO40: POP HL ;RECALL THE TRANSFER ADDRESS LD BC,RECLEN ;ADD IN A SECTOR ADD HL,BC POP BC ;RESTORE SECTOR COUNT DJNZ WBOO20 ;READ NEXT SECTOR ; ;SHARED BY WARM &COLD START ; GOCPM: LD BC,CPMBUF ;INITIAL DMA ADDREx EQU 081H FDCBUSY EQU 10H ; TRXRDY EQU 2 RCVRDY EQU 0 ; TRYTRKNO EQU 4 TRYSECNO EQU 5 ; ;MACHINE CODE OF INSTRUCTION ; OUTI_OP EQU 0A3EDH INI_OP EQU 0A2EDH RETN_OP EQU 045EDH NMI_P EQU 00066H JP EQU 0C3H ; ;FDC COMMAND CODE ; SPE SS CALL SETDMA LD A,JP ;INITIAL SYSTEM REG. LD (0000),A ;WARM BOOT ENTRY LD HL,BIOS+3 LD (0001),HL LD (0005),A ;SYSTEM CALL ENTRY LD HL,BDOS LD (0006),HL XOR A LD (UL1CNT),A ;CLEAR SERIAL PRINTER BUFFER COUNT LD (UNACNT),A ;UNALLOCATRCMD EQU 03H HOMCMD EQU 07H SENINT EQU 08H SEKCMD EQU 0FH WRCMD EQU 05H RDCMD EQU 06H SDSCMD EQU 04H ; ; FDWRNG EQU 10 FDRDNG EQU 15 FDSKNG EQU 5 FDHONG EQU 0 ; ; *** ;*  * ;* THE BIOS ENTED SECTOR COUNT LD (PHYACT),A ;BUFFER INACTIVE LD A,(LOGDRV) ;PASS LOGGED DRIVE NO. TO CCP LD C,A JP CPMBAS ;TO CCP ; ;SAMPLE THE STATUS OF THE CURRENTLY ASSIGNED CONSOLE DEVICE. ;A CHARACTER READY => A=00, NO CHARACTER READY => A=0FFH ; CONSRY POINTS * ;*  * ; *** ; BIOS: JP BOOT JP WBOOT JP CONST JP CONIN JP CONOUT JP LIST JP PUNCH JP READER JP HOME JP SELDSK JP SETTRK JP SETSEC JP SETDMA JP READ JP WRITE JP LISTST~T: LD A,(IOBYTE) ;CHECK ASSIGNED CONSOLE DEVICE AND IOCONSL JP Z,TTYST ;DEFINED TO TTY DEVICE? BIT 1,A JP NZ,BATST ;DEFINED TO BAT DEVICE? CRTST: 5;DEFINED TO CRT DEVICE! IN A,(SIOBC) BIT RCVRDY,A ;CHC JP SECTRN ; ** ;* * ;* BOOT * ;* * ; ** ; BOOT: LD A,0 OUT (ROMACT),A JP 0000H ; ;JUMP TO HERE WHENEVER THE USER WANTS TO RESTART THE SYSTEM. ;REREAD CCP & BDOS WITHOUT MODIFYING THE BIOS ;='ECK A CHARACTER READY? LD A,0 RET Z  ;NO! A=00 DEC A RET ;YES! A=0FFH ; ;READ NEXT THE CONSOLE CHARACTER INTO REG. A ;SET PARITY BIT TO ZERO? ;IF NO CHARACTER IS READY, WAIT UNTIL A CHARACTER IS TYPED ; CONINM WBOOT: DI ;DISABLE INTERRUPT IM 2 ;SET CPU INTERRUPT MODE LD SP,CPMBUF+80H ;INITIALIZE STACK POINTER LD A,NOTRYS ;SET RETRY BUFFER FOR BOOT LD (BOOTRY),A XOR A LD (PHYACT),A CALL FDCINIT WBOO10: LD C,0 CALL SELDSK LD HL,CPMBAS 8I: LD A,(IOBYTE) ;CHECK ASSIGNED DEVICE? AND IOCONSL JP Z,TTYIN  ;TTY? BIT 1,A JP NZ,BATIN  ;BAT? CRTIN: ;CRT IS DEFINED. LD BC,0000H ;;SET TIMER (60 SECOND) FOR MOTOR OFF CRTIN4: LD E,30H CRT 6 LD DE,0002H LD B,BDOSLN/RECLEN ;LENGTH OF CCP & BDOS FOR WBOOT WBOO20: PUSH BC ;SAVE PARAMETER PUSH HL PUSH DE LD C,L ;MOVE TRANSFER ADDRESS TO BC LD B,H CALL SETDMA ;SET DATA TRANSFER ADDRESS LD C,D CALL SETTRK ;SET TRACK NUMBER TO DIN1: CALL CRTST ;CHECK A CHARACTER READY? JR NZ,CRTIN2 ;IF READY THEN JUMP DEC E JR NZ,CRTIN1 DEC BC LD A,B OR C JR NZ,CRTIN4 LD A,0 N ;MOTOR OFF OUT (MOTORON),A LD A,46H ;MOTOR OFF BUFFER FOR R/W ROUTINE YC LD (MTRFLG),A JR CRTIN1 CRTIN2: IN A,(SIOBD) ;READ CHARACTER AND 07FH RET ; ;SEND THE CHARACTER FROM REG. C TO THE CONSOLE OUTPUT DEVICE. ; CONOUT: LD A,(IOBYTE) ;CHECK ASSIGNED DEVICE! AND IOCONSL JP Z,TTYOUT ;TTY?    ;UL1? BIT 6,A JR Z,LPTLST ;LST; JP CRTOUT N;CRT! ; ;THIS DRIVER FOR PARALLEL PRINTER ; LPTLST: LPTLS1: CALL LPTLSS G;CHECK PRINTER BUSY? JR NZ,LPTLS1 ;BUSY THEN JUMP BACK LD A,C  ;THE CONTENT OF COBIT 1,A JP NZ,BATOUT ;BAT? CRTOUT: d ;ASSIGNED TO CRT CONO1: IN A,(SIOBC) ;CHECK S10 TRANSFER READY BIT TRXRDY,A JR Z,CONO1 " ;NO READY THEN JUMP BACK LD A,C " ;DATA OF C REG. IS TRANSFERED A  REG. 1S SEND TO PRINTER OUT (PIOBD),A IN A,(PIOAD) ;SEND STROBE TO PRINTER RES STROBE,A OUT (PIOAD),A IN A,(PIOAD) SET STROBE,A OUT (PIOAD),A RET UL1LST: LD A,UL1SIZ ;SIZE OF PRINTER BUFFER LD B,A OR A  ;CLEAND 07FH OUT (SIOBD),A RET ; TTYST: IN A,(SIOAC) ;A CHARACTER READY FROM RS232 PORT? BIT RCVRDY,A LD A,0 RET Z  ;NOT READY DEC A RET  ;YES ; TTYIN: CALL TTYST  ;A CHARACTER READY FOR RS232  R CARRY RRA ;DIVIDE BY 2 LD E,A LD HL,UL1CNT ;CURRENT BUFFER COUNT INC (HL) UL1L10: IN A,(SIOAC) ;READ STATUS BIT RCVRDY,A ';HAVE AN INPUT CHARACTER? JR Z,UL1L20 ";NO. SEND CHARACTER IN A,(SIOAD)o PORT? JR Z,TTYIN ;IF NO READY THEN JUMP IN A,(SIOAD) ;RECIEVE DATA FROM RS232 PORT AND 07FH RET ; ;THIS DRIVER FOR SERIAL PRINTER ;PROTOCAL IS XON/XOFF ; TTYOUT: TTYOU1: CALL TTYST # ;CHECK A CHARACTER READY FROM RS23 0 ;GRAB THE CHARACTER AND 7FH CP ASCACK ;IS IT ACK? JR Z,UL1L60 ;YES, PROCESS IT UL1L20:  LD A,E  ;GET UL1SIZ/2 CP (HL) G;IS BUFFER HALF-FULL? JR NZ,UL1L40 ;NO. NO NEED FOR ETX UL1L30Q2 PORT? JR NZ,TTYOU2 ;IF READY THEN JUMP TTYOU4: IN A,(SIOAC) ;CHECK TRANSFER READY? BIT TRXRDY,A JR Z,TTYOU4 ;NO READY THEN JUMP LD A,C N ;SEND THE CONTENT OF C REG. TO RS232 PORT AND 7FH OUT (SIOAD),A RET TT9: IN A,(SIOAC) ;PERPARE FOR OUTPUT BIT TRXRDY,A ;CAN WE OUTPUT? JR Z,UL1L30 ;NOT YET LD A,ASCETX @;SEND OFF THE END-OF-BLOCK CHARACTER OUT (SIOAD),A JR UL1L50 2;NOW OUTPUT THE CHARACTER UL1L40: LD A,B @YOU2: IN A,(SIOAD) ;RECIEVE CHARACTER AND 7FH CP 13H X ;EQUAL TO CONTROL-S? JR NZ,TTYOU4 ;IF NOT EQUAL THEN JUMP TTYOU3: CALL TTYST 8 ;CHECK A CHARACTER READY FROM RS232 PORT? JR Z,TTYOU3 ;NO READY THEN JUMP% ;ORIGINAL BUFFER SIZE CP (HL) *;CHECK FOR FULL AND OVERFLOW JR Z,UL1L30 (;FULL, SO SEND ANOTHER ETX JR C,UL1L10 ];OVERFLOW, WAIT FOR ACK UL1L50: IN A,(SIOAC) ;THIS IS THE REAL OUTPUT BIT TRXRDY,A ;ROUTINEIP IN A,(SIOAD) ;RECIEVE A DATA FROM RS232 PORT AND 7FH CP 11H 0 ;EQUAL TQ CONTROL-Q? JR NZ,TTYOU3 JR TTYOU4 q;YES, THEN SEND DATA TO RS232 PORT SUCESSFUL ; ;READ THE NEXT CHARACTER FROM THE ASSIGNED READER ;DEVICE INTO  AND EXIT JR Z,UL1L50 &;LOOP UNTIL TRANSHITTER READY LD A,C b ;CHARACTER HAS BEEN IN REG. C AND 7FH OUT (SIOAD),A ;CHIP IT RET UL1L60: LD A,(HL) !;DID WE EVER SEND AN ETX? SUB E  ;IS BUFFER >= HALF [REG. A. ; READER: LD A,(IOBYTE) ;CHECK ASSIGNED DEVICE? AND IOREADR JP Z,TTYIN  ;TTY? JP PTRRDR ;RDR! ; ;SEND THE CHARACTER FROM REG. C TO THE ASSIGNED PUNCH DEVICE. ; PUNCH: LD A,(IOBYTE) ;CHECK ASSIGNED DEVICE? 8FULL? JR Z,UL1L70 ;YES JR C,UL1L50 &;NO, SPURIOUS ACK UL1L70: LD (HL),A $;ADJUST THE BUFFER COUNT JR UL1L50 m;AND SEND THE CHARACTER ; ;TEST THE STATUS OF THE PRINTER ;THEN RETURN NOT READY FLAG. ;EXIT : A=0 --> PR # AND IOPUNCH JP Z,TTYOUT ;TTY? JP PTPPUN ;PUN! ; ;SEND THE CHARACTER FROM REG. C TO THE ASSIGNED LISTING DEVICE. ; LIST: LD A,(IOBYTE) ;CHECK ASSIGNED DEVICE? AND IOLIST JP Z,TTYOUT ;TTY? AND A JP PE,UL1LST INTER IS NOT READY ; A=0FFH --> PRINTER IS READY ; LISTST: LD A,(IOBYTE) ;CHECK ASSIGNED DEVICE AND IOLIST JP Z,TTYST A ;TTY? AND A JP PE,UL1LSS ;UL1? BIT 6,A JR Z,LPTLSS ;LPT? JP CRTST ;CRT? LPTL] FDC EI HALT ;EXECUTION PHASE OF HOME OR SEEK ; ; ; **. ;* * ;* FDCCMD * ;* STSRD * ;* * ; **] ; ;FDCCMD : SEND FDC COMMAND TO FDC ; STSRD : READ FDC STATUS REG. IN RESULT PHASE ; FD7RINT CHARACTER STRING ;HL IS STARTING ADDRESS ;PRINTING STOPS IF NULL CODE IS MET ; PRTMSG: LD A,(HL) OR A RET Z LD C,A CALL CONOUT INC HL JR PRTMSG ; ; ; ** ;* * ;* DELAY 1 SECOND * ; CCMD: CALL WRT38H ;SET INTERRUPT VECTOR FCMD1: IN A,(FDCSTS) ;READ FDC MAIN STATUS REG. AND FDCBUSY ;CHECK FOR FDC BUSY ? JR NZ,FCMD1 ;BUSY THEN JUMP LD C,FDCDAT ;FDC DATA PORT LD HL,RW_CMBF FC0: IN A,(FDCSTS) ;READ FDC MAIN STATUS REG. RLC* * ; ** ; ; ;DELAY 250 ms ; DLAY1S: PUSH BC LD HL,800 DLOP1: LD B,120 DJNZ $ DEC HL LD A,L OR H JR NZ,DLOP1 POP BC RET RET ; ; ; ** ;* * ;* FDCINIT * ;* * A ;CHECK FOR FDC DATA REG. READY ? JR NC,FC0 ;NOT READY THEN JUMP RLCA ;CHECK FOR FDC IN OR OUT ? JR C,STSRD ;IN THEN JUMP TO READ FDC STATUS REG. OUTI ;SEND COMMAND TO FDC JR NZ,FC0 ;IS IT FINISHED TO SEND COMMAND TO FDC ? RET ; STS ; ** ; ;INITIAL FDC AND FDD ; FDCINIT: CALL SPECIFY ;PROGRAMMING FDC LD A,0 FDCI1: LD (PHYDSK),A CALL FDHOME ;THE HEAD OF DRIVE A,B,C AND D HOME LD HL,PHYDSK INC (HL) LD A,(HL) CP INIDRV+1 JR C,FDCI1 RET ; RD: LD A,0 LD (STSLNG),A ;RESET THE LENGTH BUFFER OF FDC STATUS ; FOR RESULT PHASE LD HL,STSBUF ;FDC STATUS BUFFER ENTRY SR0: IN A,(FDCSTS) ;READ FDC MAIN STATUS RLCA ;DATA REG. READY ? JR NC,SR0 ;NOT READY THEN JUMP RLCA ;IN OY; **G ;* * ;* SPECIFY * ;* (P_SRTHUL) * ;* (P_HLTND) * ;* * ; ** ; ;PROGRAMMING FDC ;HEAD LOAD TIME : 100ms. STEP RATE : 6ms. ;HEAD UNLOAD TIME : 480ms. DMA MODE ; SPECIFY: LD HL,RW_CMBF ;FR OUT ? JR C,SR2 ;OUT THEN JUMP LD A,SENINT ;SENSE INTERRUPT COMMAND OUT (FDCDAT),A ;SEND TO FDC LD HL,STSBUF ; MUST INSERT THIS VALUE SR1: IN A,(FDCSTS) ;READ FDC MAIN STATUS RLCA ;DATA REG. READY ? JR NC,SR1 ;NOT READY RLCA ;IN OR OUDC COMMAND BUFFER LD (HL),SPECMD ;SPECIFY COMMAND --> COMMAND BUFFER INC HL LD (HL),P_SRTHUT INC HL LD (HL),P_HLTND DEC HL DEC HL LD B,3 ;LENGTH OF SPECIFY COMMAND CALL FDCCMD ;SEND SPECIFY COMMAND TO FDC RET ; ; ***jT ? JR NC,SR3 ;OUT THEN JUMP SR2: IN A,(FDCDAT) ;READ FDC STATUS LD (HL),A ;SAVE IT INTO STATUS BUFFER PUSH HL LD HL,STSLNG INC (HL) ;INCREMENT THE LENGTH OF STATUS BUFFER POP HL INC HL JR SR1 SR3: LD A,(STSBUF) AND 11000000B ;CHECK 3***** ;* * ;* FDHOME * ;* SEEK * ;* * ; ** ; ;HOME : MOVE THE HEAD OF DISK DRIVE TO TRACK 0 ;SEEK : MOVE THE HEAD OF DISK DRIVE TO THE SELECTED TRACK ; FDHOME: LD HL,RW_CMBF ;FDC COMMAND BUFFER ENTRY LD (HL),HOMCMD#FOR FDC ERROR POP HL RETI ; ; ** ;* * ;* HDS_DS * ;* * ; **y ; ;THIS ROUTINE FOR FDC READ/WRITE COMMAND ; HDS_DS: LD A,(PHYHEAD) ADD A,A ADD A,A PUSH HL LD HL,PHYDSK  t ;HOME COMMAND --> FDC COMMAND BUFFER INC HL LD A,(PHYDSK) ;DRIVE WHICH HEAD WILL MOVE TO TRACK 0 LD (HL),A ;SAVE IT INTO COMMAND BUFFER LD B,2 ;LENGTH OF HOME COMMAND JR SE0 ; SEEK: LD HL,RW_CMBF LD (HL),SEKCMD CALL HDS_DS INC HL  OR (HL) POP HL RET ; ; **" ;* * ;* SELHEAD * ;* * ; ** ; ;CONVERT LOGIC SECTOR & LOGIC TRACK REQUESTED BY BDOS TO ;PHYSICAL HEAD, SECTOR & TRACK ; SELHEAD: LD A,0 LD (PHYHEAD),A ;CLEAR HEAD' BUFFER LD A,(WDOGR) AND 01H ;PHYSEC START PARAMETER ;BIT 0 = 1---> PHYSEC# START 0 ;BIT 0 = 0---> PHYSEC# START 1 LD HL,WEOT ;END OF TRACK ADD A,(HL) LD C,A LD A,(PHYSEC) CP C JR C,SEL_RET SUB C LD HL,PHYHEAD INC (HL) /PRTMSG CALL SHOW LD A,(STSBUF) AND 11000000B RET ; ; HOMETY: XOR A LD (ERRDRV+1),A JR ERRCOM ; ; SEEKTY: XOR A LD (ERRTRK+2),A JR ERRCOM ; ; FTAB: PUSH AF RRCA RRCA RRCA RRCA CALL GHEX LD (HL),A INC HL POP AF CALL SEL_RET: LD HL,WDOGR BIT 0,(HL) JR NZ,SEL_R1 INC A SEL_R1: LD (H_PHYSEC),A LD A,(PHYTRK) BIT 5,(HL) JR NZ,SEL_R2 LD C,A AND 01H LD (PHYHEAD),A LD A,C OR A RRA JR SEL_R3 SEL_R2: LD HL,WTRK CP (HL) JR C,SEL_R3 SUB (H s GHEX LD (HL),A RET GHEX: AND 0FH CP 10 JR NC,G100 ADD A,'0' RET G100: ADD A,'A'-10 RET ; ; ; ; ** ;* * ;* SHOW * ;* * ; **> ; ;PRINT FDC ERROR MESSAGE ON CONSOLE ; ; SHOW: LD HL,_L) LD HL,PHYHEAD INC (HL) LD HL,WRTRK ADD A,(HL) SEL_R3: LD (H_PHYTRK),A RET ; ; **= ;* * ;* WORK_DRIVER * ;* PARAMETER SET * ;* * ; **4 ; ;SET PHYSICAL PARAMETER TO WORKING BUFFER ; S STATUS CALL PRTMSG LD A,(STSLNG) LD B,A LD HL,STSBUF SHW1: LD A,(HL) PUSH AF RRCA RRCA RRCA RRCA CALL GHEXOUT POP AF CALL GHEXOUT LD C,20H CALL CONOUT INC HL DJNZ SHW1 LD C,0DH CALL CONOUT LD C,0AH CALL CONOUT RETET_WD: LD HL,DRVTBL LD A,(PHYDSK) ;SELECTED DRIVE ADD A,A LD E,A LD D,0 ADD HL,DE LD E,(HL) INC HL LD D,(HL) ;DE --> THE PARAMETER ENTRY OF SELECTED DISK EX DE,HL LD DE,WDRV ;THE ENTRY OF WORKING BUFFER LD BC,0007H LDIR LD DE, a ; GHEXOUT: AND 0FH CP 10 JR NC,G10 ADD A,'0' JR G20 G10: ADD A,'A'-10 G20: LD C,A CALL CONOUT RET ; ; ; ; **( ;* * ;* DEFINE STORAGE * ;* * ; **( ; BOOMSG: DEFW 0D0AH DEFM 'BOOT EWBYTES+1 LD BC,2 LDIR RET ; ; SETLWD: LD HL,DRVTBL LD A,(SEKDSK) ADD A,A LD E,A LD D,0 ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD DE,09H ADD HL,DE LD DE,WSMSK LD BC,03H LDIR RET ; ; ** RROR ... AND DIE:' DEFB 07H DEFB 0 ERRMSG: DEFW 0D0AH ERRCMD: DEFS 5 DEFM ' ERROR : DRIVE# ' ERRDRV: DEFS 1 DEFM ', SIDE# ' ERRSID: DEFS 1 DEFM ', TRACK# ' ERRTRK: DEFS 2 DEFM ', SECTOR# ' ERRSEC: DEFS 2 DEFB 0 ERRHO: DEF0;* * ;* PUSH_NMI * ;* POP_NMI * ;* * ; ** ; PUSH_NMI: LD HL,(NMI_P) LD (T_NMI),HL LD HL,(NMI_P+2) LD (T_NMI+2),HL RET ; POP_NMI: LD HL,(T_NMI) LD (NMI_P),HL LD HL,(T_NMI+2) LD (NMI_P+2),HL RET ; ;SETM 'HOME ' ERRSE: DEFM 'SEEK ' ERRWR: DEFM 'WRITE' ERRRD: DEFM 'READ ' STATUS: DEFW 0D0AH DEFM '*' DEFB 07H DEFM ' FDC STATUS ' DEFB 0 ; UL1SIZ EQU 80H ; ;THE DC MOTOR ON/OFF BUFFER OF DISK DRIVE ; MTRFLG: DEFB 04EH ; ;******n INTERRUPT VECTOR ; WRT38H: IM 2 LD A,CTC0HINT LD I,A PUSH HL LD HL,STSRD LD (CTC0INT),HL POP HL RET ; ; ; ** ;* * ;* ERROR REPORT * ;* * ; ***g **. ;* * ;* DISK PARAMETER DEFINE* ;* * ; ** ; DPBASE: ; ADPB: DEFW 0 ;SECTOR TRANSLATION VECTOR DEFW 0 DEFW 0 DEFW 0 ; BDOS SCRATCH PAD AREA DEFW DIRBUF ; DIRECTORY BUFFER DEFW ADPBV ; A DRIVER DIS*** ; ;PRINT FDC ERROR MESSAGE ; ; ERRPRT: PUSH AF LD H,0 LD L,A LD DE,ERRHO ADD HL,DE LD BC,5 LD DE,ERRCMD LDIR LD A,(H_PHYDSK) AND 03H ADD A,'A' LD (ERRDRV),A POP AF CP FDHONG JR Z,HOMETY PUSH AF LD A,2CH LD (ERRDoK PARAMETER VECTOR DEFW ACHKSV ; A DRIVER DIRECTORY CHECK SUM VECTOR DEFW AALOCV ; A BLOCK ALLOCATE VECTOR ; BDPB: DEFW 0 DEFW 0 DEFW 0 DEFW 0 DEFW DIRBUF DEFW BDPBV DEFW BCHKSV DEFW BALOCV ; CDPB: DEFW 0 DEFW 0 DEFW 0 DEFW 0  RV+1),A LD A,(PHYHEAD) ADD A,'0' LD (ERRSID),A LD A,(H_PHYTRK) LD HL,ERRTRK CALL FTAB POP AF CP FDSKNG JR Z,SEEKTY PUSH AF LD A,2CH LD (ERRTRK+2),A POP AF LD A,(RW_CMBF+4) LD HL,ERRSEC CALL FTAB ERRCOM: LD HL,ERRMSG CALL DEFW DIRBUF DEFW CDPBV DEFW CCHKSV DEFW CALOCV ; DDPB: DEFW 0 DEFW 0 DEFW 0 DEFW 0 DEFW DIRBUF DEFW DDPBV DEFW DCHKSV DEFW DALOCV ; DRVTBL: DEFW ADRV DEFW BDRV DEFW CDRV DEFW DDRV ; ; ** ;*     * ;* 4 DRIVER DPBV * ;* * ; ** ; ADPBV: DEFW DEFSPT ; SPT FOR DD (DOUBLE SIDE DOUBLE DENSITY DEFB DEFBSH ; BSH FOR BLOCK SIZE 2K DEFB DEFBLM ; BLM FOR : : : DEFB DEFEXM ; EXM ? ACAP OS ; DDRV: DEFB M_N ;DEFINE BYTE#/SECTOR DEFB EOT ;END OF TRACK DEFB M_GPL ;GAP LENGTH DEFB M_DTL DEFB TRK ;TRACK# DEFB DOGR DEFB RTRK DEFW BYTES DEFB SMSK ;SECTOR MASK DEFB BLOCK ;BLOCK SIZE/128 DEFB SPT ;LOGICIAL SECTOR# OF A TRACNA: DEFW DEFDSM ; DSM FOR 170 [(40-2)*36]/16=85 , 0055H-1 DEFW DEFDRMH ; DRM FOR 64 DIRECTORY ENTRY DEFB DEFALL ; ALL TOTAL DIRECTORY SPACE NEED 1 BLOCK DEFB DEFALH ; ALH DEFW DEFCKS ; CKS FOR DIRECTORY CHECK SUM DEFW DEFOFF ; OFF ... RESERVE 2  2K ; ; RW_CMBF: DEFS 1 H_PHYDSK: DEFS 1 P_PHYTRK: DEFS 1 PHYHEAD: DEFS 1 H_PHYSEC: DEFS 1 WDRV: MN: DEFS 1 WEOT: DEFS 1 WGPL: DEFS 1 WDTL: DEFS 1 WTRK: DEFS 1 WDOGR: DEFS 1 WRTRK: DEFS 1 WSMSK: DEFS 1 WBLOCK: DEFS 1 WSPT: DEFS TARCK FOR CPM OS ; ADRV: DEFB M_N ;DEFINE BYTES/SECTOR DEFB EOT ;END OF TRACK DEFB M_GPL ;GAP LENGTH DEFB M_DTL ; DEFB TRK ;TRACK#/DISK DEFB DOGR DEFB RTRK ;RESERVE TRACK FOR FLAT DEFW BYTES ;BYTE# OF PHYSEC DEFB SMSK ;SECTOR MASK DEF o1 ; ; PHYACT: DEFS 1 ; PHYSICIAL ACTIVE FLAG WRTYPE: DEFS 1 ;WRITE OPERATION TYPE H_PHYTRK: DEFS 1 ; ;** ;* * ;* IF YOU WANT TO hB BLOCK ;BLOCK SIZE/128 DEFB SPT ;LOGICIAL SECTOR#/TRACK BDPBV: DEFW DEFSPT ; SPT FOR DD (DOUBLE SIDE DOUBLE DENSITY DEFB DEFBSH ; BSH FOR BLOCK SIZE 2K DEFB DEFBLM ; BLM FOR : : : DEFB DEFEXM ; EXM ? BCAPA: DEFW DEFDSM ; DSM FOR 170   `* ;* (1) CHANGE TO OTHER TYPE DISK DRIVE, OR * ;* (2) READ OTHER FORMATTED DISK. * ;* :* ;* PLEASE UPDATE THE FOLLOWING PARAMETERS. * ;*  o[(40-2)*36]/16=85 , 0055H-1 DEFW DEFDRM ; DRM FOR 64 DIRECTORY ENTRY DEFB DEFALL ; ALL TOTAL DIRECTORY SPACE NEED 1 BLOCK DEFB DEFALH ; ALH DEFW DEFCKS DEFW DEFOFF ; OFF ... RESERVE 2 TARCK FOR CPM OS ; BDRV: DEFB M_N DEFB EOT DEFB M_GPL   * ;** ; P_SRTHUT EQU 0DFH ;STEP RATE TIME---6ms ;HEAD UNLOAD TIME---480ms P_HLTND EQU 32H ;HEAD LOAD TIME---100ms ;NON-DMA M_N EQU 01 EOT EQU 12H M_GPL EQU 0AH M_DTL DEFB M_DTL DEFB TRK DEFB DOGR DEFB RTRK DEFW BYTES DEFB SMSK DEFB BLOCK DEFB SPT ; CDPBV: DEFW DEFSPT ; SPT FOR SD (SINGLE SIDE DOUBLE DENSITY) DEFB DEFBSH ; BSH FOR BLOCK SIZE 2K DEFB DEFBLM ; BLM FOR : : : DEFB DEFEXM ; EXM  EQU 0FFH TRK EQU 50H DOGR EQU 60H SMSK EQU 01H BLOCK EQU 10H SPT EQU 48H RTRK EQU 0H BYTES EQU 100H DEFSPT EQU 48H ;LOGICAL NUMBER OF SECTOR PER TRACK DEFBSH EQU 4H ;THE DATA ALLOCATION SIZE (2K) DEFBLM EQU 0FH DEFEXM EQU 00H ;EXTEN( ? DEFW DEFDSM ; DSM FOR [(40-2)*36]/16=85, 84=85-1 DEFW DEFDRM ; DRM FOR 64 DIRECTORY ENTRY DEFB DEFALL ; ALL TOTAL DIRECTORY SPACE NEED 1 BLOCK DEFB DEFALH ; ALH DEFW DEFCKS ;CKS DEFW DEFOFF ; OFF ... RESERVE 3 TARCK FOR CPM OS ; CDRV: T MASK. BLS--2K, DSM > 255. DEFDSM EQU 15EH ;THE TOTAL STORAGE CAPACITY OF THE DRIVE ;BLOCK NUMBER PER DISKETTE--->154 DEFDRM EQU 007FH ;64 DIRECTORY ENTRY DEFALL EQU 0C0H ;TOTAL DIRECTORY ENTRY SPACE NEED 1 BLOCK DEFALH EQU 00H DEFCKS EQU  DEFB M_N DEFB EOT DEFB M_GPL DEFB M_DTL DEFB TRK DEFB DOGR DEFB RTRK DEFW BYTES DEFB SMSK DEFB BLOCK DEFB SPT ; DDPBV: DEFW DEFSPT ; SPT FOR SS (SINGLE SIDE SINGLE DENSITY) DEFB DEFBSH ; BSH FOR BLOCK SIZE 2K DEFB DEFBLM ; BLM FOBL0020H ;DIRECTORY CHECK SUM DEFOFF EQU 0002H ;RESERVE 2 TRACK FOR CPM OS ;**x* ; ; TRYCT0: DEFS 1 ;THE TRACK RETRY BUFFER OF FDC HOME OR ; SEEK TRYCT1: DEFS 1 ;THE SECTOR RETRY BUFFER R : : : DEFB DEFEXM ; EXM ? DEFW DEFDSM ; DSM FOR [(40-2)*36]/16=85, 84=85-1 DEFW DEFDRMH ; DRM FOR 64 DIRECTORY ENTRY DEFB DEFALL ; ALL NEED 2 BLOCKS DEFB DEFALH ; ALH DEFW DEFCKS ;CKS DEFW DEFOFF ; OFF ... RESERVE 5 TARCK FOR CPM  OF FDC READ OR ; WRITE T_NMI: DEFS 4 ; PHYDSK: DEFS 1 ;PHYSICAL DISK NUMBER PHYTRK: DEFS 1 PHYSEC: DEFS 1 ; ; STSLNG: DEFS 1 ;THE LENGTH OF FDC STATUS BUFFER STSBUF: DEFS 7 ;FDC STATUS BUFFER ; ; ** ;* * ;9* DIRECTORY CHECK SUM * ;* BLOCK ALLOCATE * ;* * ; ** ; BOOTRY: DEFS 1 ;BOOT RETRY COUNT ; UNACNT: DEFS 1 ;UNALLOCATED SECTOR COUNT UNADSK: DEFS 1 ;UNALLOCATED DISK UNATRK: DEFS 1 ;UNALLOCATED TRACK UNASEC: DEFS 1 ;U vyNALLOCATED SECTOR DMAADR: DEFS 2 ;LAST DMA ADDRESS ; SEKDSK: DEFS 1 ;SEEK DISK NUMBER SEKTRK: DEFS 1 ;SEEK TRACK NUMBER SEKSEC: DEFS 1 ;SEEK SECTOR NUMBER SEKPHY: DEFS 1 ;SEEK PHYSICIAL SECTOR NUMBER ; ; PHYWRT: DEFS 1 ;PHYSICIAL BUFFER WRIT vE PENDING FLAG ; RSFLAG: DEFS 1 ;PRE-READ SECTOR FLAG READOP: DEFS 1 ;1 : IF READ OPERATION. 0 : IF WRITE OPERATION ; PHYBUF: DEFS 1024 UL1CNT: DEFS 1 ;SERIAL PRINTER BUFFER COUNT ; DIRBUF: DEFS 128 AALOCV: DEFS 44 ; (171-1)/8+1 BALOCV: DEFS v 44 ; CALOCV: DEFS 44 ; DALOCV: DEFS 44 ; ; ACHKSV: DEFS 32 ; 64/4 BCHKSV: DEFS 32 ; CCHKSV: DEFS 32 ; DCHKSV: DEFS 32 ; ; END 9 vvvvvvvvv vv9v vv vv vv vvvvvvvvv vv5v vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vv+v vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vvv vv vv vv vvvvvvvvv vv v v v v v v v v v v v v v v v v v v f v  v v  v v  v v  v v v v v v v v v  v v!x!v! v!v! v!v! v!v! v!v!v!v!v!v!v!v!v! v!v!!v! v!v! v!v! v!v! v!v!v!v!v!v!v!v!v! v!v""v" v"v" v"v" v"v" v"v"v"v"v"v"v"v"v" v"v"t"v" v"v" v"v" v"v" v"v"v"v"v"v"v"v"v" v"v#j#v# v#v# v#v# v#v# v#v#v#v#v#v#v#v#v# v#v##v# v#v# v#v# v#v# v#v#v#v#v#v#v#v#v# v#v$$v$ v$v$ v$v$ v$v$ v$v$v$v$v$v$v$v$v$ v$v$B$v$ v$v$ v$v$ v$v$ v$v$v$v$v$v$v$v$v$ v$v%\%v% v%v% v%v% v%v% v%v%v%v%v%v%v%v%v% v%v%%v% v%v% v%v% v%v% v%v%v%v%v%v%v%v%v% v%v&&v& v&v& v&v& v&v& v&v&v&v&v&v&v&v&v& v&v&P&v& v&v& v&v& v&v& v&v&v&v&v&v&v&v&v& v&v'N'v' v'v' v'v' v'v' v'v'v'v'v'v'v'v'v' v'v''v' v'v' v'v' v'v' v'v'v'v'v'v'v'v'v' v'v((v( v(v( v(v( v(v( v(v(v(v(v(v(v(v(v( v(v(.(v( v(v( v(v( v(v( v(v(v(v(v(v(v(v(v( v(v)0)v) v)v) v)v) v)v) v)v)v)v)v)v)v)v)v) v)v))v) v)v) v)v) v)v) v)v)v)v)v)v)v)v)v) v)v**v* v*v* v*v* v*v* v*v*v*v*v*v*v*v*v* v*v*<*v* v*v* v*v* v*v* v*v*v*v*v*v*v*v*v* v*v+"+v+ v+v+ v+v+ v+v+ v+v+v+v+v+v+v+v+v+ v+v++v+ v+v+ v+v+ v+v+ v+v+v+v+v+v+v+v+v+ v+v,,v, v,v, v,v, v,v, v,v,v,v,v,v,v,v,v, v,v, ,v, v,v, v,v, v,v, v,v,v,v,v,v,v,v,v, v,v--v- v-v- v-v- v-v- v-v-v-v-v-v-v-v-v- v-v--v- v-v- v-v- v-v- v-v-v-v-v-v-v-v-v- v-v..v. v.v. v.v. v.v. v.v.v.v.v.v.v.v.v. v.v..v. v.v. v.v. v.v. v.v.v.v.v.v.v.v.v. v.v//v/ v/v/ v/v/ v/v/ v/v/v/v/v/v/v/v/v/ v/v//v/ v/v/ v/v/ v/v/ v/v/v/v/v/v/v/v/v/ v/v00v0 v0v0 v0v0 v0v0 v0v0v0v0v0v0v0v0v0 v0v0a0v0 v0v0 v0v0 v0v0 v0v0v0v0v0v0v0v0v0 v0v11v1 v1v1 v1v1 v1v1 v1v1v1v1v1v1v1v1v1 v1v11v1 v1v1 v1v1 v1v1 v1v1v1v1v1v1v1v1v1 v1v22v2 v2v2 v2v2 v2v2 v2v2v2v2v2v2v2v2v2 v2v2s2v2 v2v2 v2v2 v2v2 v2v2v2v2v2v2v2v2v2 v2v3m3v3 v3v3 v3v3 v3v3 v3v3v3v3v3v3v3v3v3 v3v33v3 v3v3 v3v3 v3v3 v3v3v3v3v3v3v3v3v3 v3v44v4 v4v4 v4v4 v4v4 v4v4v4v4v4v4v4v4v4 v4v4E4v4 v4v4 v4v4 v4v4 v4v4v4v4v4v4v4v4v4 v4v5[5v5 v5v5 v5v5 v5v5 v5v5v5v5v5v5v5v5v5 v5v55v5 v5v5 v5v5 v5v5 v5v5v5v5v5v5v5v5v5 v5v66v6 v6v6 v6v6 v6v6 v6v6v6v6v6v6v6v6v6 v6v6W6v6 v6v6 v6v6 v6v6 v6v6v6v6v6v6v6v6v6 v6v7I7v7 v7v7 v7v7 v7v7 v7v7v7v7v7v7v7v7v7 v7v77v7 v7v7 v7v7 v7v7 v7v7v7v7v7v7v7v7v7 v7v88v8 v8v8 v8v8 v8v8 v8v8v8v8v8v8v8v8v8 v8v8)8v8 v8v8 v8v8 v8v8 v8v8v8v8v8v8v8v8v8 v8v979v9 v9v9 v9v9 v9v9 v9v9v9v9v9v9v9v9v9 v9v99v9 v9v9 v9v9 v9v9 v9v9v9v9v9v9v9v9v9 v9v::v: v:v: v:v: v:v: v:v:v:v:v:v:v:v:v: v:v:;:v: v:v: v:v: v:v: v:v:v:v:v:v:v:v:v: v:v;%;v; v;v; v;v; v;v; v;v;v;v;v;v;v;v;v; v;v;;v; v;v; v;v; v;v; v;v;v;v;v;v;v;v;v; v;v<<v< v<v< v<v< v<v< v<v<v<v<v<v<v<v<v< v<v< <v< v<v< v<v< v<v< v<v<v<v<v<v<v<v<v< v<v==v= v=v= v=v= v=v= v=v=v=v=v=v=v=v=v= v=v==v= v=v= v=v= v=v= v=v=v=v=v=v=v=v=v= v=v>>v> v>v> v>v> v>v> v>v>v>v>v>v>v>v>v> v>v>>v> v>v> v>v> v>v> v>v>v>v>v>v>v>v>v> v>v??v? v?v? v?v? v?v? v?v?v?v?v?v?v?v?v? v?v??v? v?v? v?v? v?v? v?v?v?v?v?v?v?v?v? v?v@@v@ v@v@ v@v@ v@v@ v@v@v@v@v@v@v@v@v@ v@v@Z@v@ v@v@ v@v@ v@v@ v@v@v@v@v@v@v@v@v@ v@vADAvA vAvA vAvA vAvA vAvAvAvAvAvAvAvAvA vAvAAvA vAvA vAvA vAvA vAvAvAvAvAvAvAvAvA vAvBBvB vBvB vBvB vBvB vBvBvBvBvBvBvBvBvB vBvBHBvB vBvB vBvB vBvB vBvBvBvBvBvBvBvBvB vBvCVCvC vCvC vCvC vCvC vCvCvCvCvCvCvCvCvC vCvCCvC vCvC vCvC vCvC vCvCvCvCvCvCvCvCvC vCvDDvD vDvD vDvD vDvD vDvDvDvDvDvDvDvDvD vDvD~DvD vDvD vDvD vDvD vDvDvDvDvDvDvDvDvD vDvE`EvE vEvE vEvE vEvE vEvEvEvEvEvEvEvEvE vEvEEvE vEvE vEvE vEvE vEvEvEvEvEvEvEvEvE vEvFFvF vFvF vFvF vFvF vFvFvFvFvFvFvFvFvF vFvFlFvF vFvF vFvF vFvF vFvFvFvFvFvFvFvFvF vFvGrGvG vGvG vGvG vGvG vGvGvGvGvGvGvGvGvG vGvGGvG vGvG vGvG vGvG vGvGvGvGvGvGvGvGvG vGvHHvH vHvH vHvH vHvH vHvHvHvHvHvHvHvHvH vHvHHvH vHvH vHvH vHvH vHvHvHvHvHvHvHvHvH vHvI IvI vIvI vIvI vIvI vIvIvIvIvIvIvIvIvI vIvIIvI vIvI vIvI vIvI vIvIvIvIvIvIvIvIvI vIvJJvJ vJvJ vJvJ vJvJ vJvJvJvJvJvJvJvJvJ vJvJJvJ vJvJ vJvJ vJvJ vJvJvJvJvJvJvJvJvJ vJvKKvK vKvK vKvK vKvK vKvKvKvKvKvKvKvKvK vKvKKvK vKvK vKvK vKvK vKvKvKvKvKvKvKvKvK vKvLLvL vLvL vLvL vLvL vLvLvLvLvLvLvLvLvL vLvL6LvL vLvL vLvL vLvL vLvLvLvLvLvLvLvLvL vLvM(MvM vMvM vMvM vMvM vMvMvMvMvMvMvMvMvM vMvMMvM vMvM vMvM vMvM vMvMvMvMvMvMvMvMvM vMvNNvN vNvN vNvN vNvN vNvNvNvNvNvNvNvNvN vNvN$NvN vNvN vNvN vNvN vNvNvNvNvNvNvNvNvN vNvO:OvO vOvO vOvO vOvO vOvOvOvOvOvOvOvOvO vOvOOvO vOvO vOvO vOvO vOvOvOvOvOvOvOvOvO vOvO