IMD 1.17: 24/12/2010 12:02:56 v copy x3.094 4/4/83 \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<˯2 ̇!Ҷ2:2a{_:ҷʖ:ҷ>Ľʖ:=2–!B!6#5ʖ:ҷĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ͷ"͌#>?͌͘ =_.:;<> Oͅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 3ί21y_͸2y2ͽ:˷˜1͘A͌>>͌92^ :ҷ¥.!_~#fow]Эюѥ!v"!çREAD ERRORçNO FILE^:ҷ ! ~ 3#0 Wx x ̀ ͂ G ~ # 3x~#B!Y~ɯ2:ҷ=!Ҿý:ҷ=!Ҿ:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ Яw4!Y~ʆ͌†t=ʆf ^ T Я2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~YѸpsp2mÆÆf ͧÆFILE EXISTS _: É: :ҷʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ү2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !Ҷ Â$$$ SUBәӥӫӱ"C{2!"E9"1A֯22!ty)K!G_^#V*CՐ~߃Eߜߥ߫ ,&-AGMS֛!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :ַE B 2>: ַb# : ַy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ־ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ԯ2 H! >w_: ! ־5ͤNkͱ¦ͱxʊ#Nx: ַ! ֖2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \׷S׀*C :qn& ^#V>O^"*}:*)=":O:ࡵo"*C *C!ͮ~2~2ͦ:2ͮ:ׯO:w:w |g}o*ெ# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ؾ,w͜͸Ͳ!!N#F$**O!~#:A־#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | sږ-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌xد2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻׯx>2>2ͻ:!Zܯ2:Eַẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:Eַ͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=26ׯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!B־w!>2*C~=2:B2~2wE:A*Cֶw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2!u ÷ÿ M[`e~ xyz{|}~AUTOST 0123456789 [9 [I!,@Rv         !"#  (?-?R ?$?1:922< 1>͛!6>2`!">22!"!"!p:o(~( O>(͚!:ONENCORE 59k CP/M vers 2.2 Rev X3.094 gG 1983 OSBORNE SOFTWARE TEST ONLY 222yF2!!"͞.* ^#V22*ut| V:A2{2͚!:2% Can't recognize diskette on drive ! Unformatted diskette on drive !y(##NF*BC(|0}0- XxQ('Y(''!! ( ##2"+y(#*~w#~w !~w#~w>K:G:2:Oz2{2y2:ȯ2y2Cɯ2[ȯ2yŸ:>(>2:2:<!~ʾ5:G:<¹!42*<2y(:ȯ2:2:2:2:2!42:G:!( 0)2:(! #ѯ>2:22:22:22:22 :(ѯ!4:(2y2i`{n&!!GO!): !1: :b!!:_^#fk!]~ 5#͟!A!1!)!9I lISoS q [ %q :b!b~( *Y~480#'_!>nf^VSYR}2b:<_!^#~@W>!{(>!z(!>(>!>(1111>@1:;1>'1Ɉ CA}hE4# 11 (0(y0:: >   >!>(/ɯ[(>!y(>!>(>( IS IN ERROR RESET DEFAULT TO DRV A STO A,CDISK ;SET DEFAULT TO A RET DENERR: DB DENL DB CR,LF,'Can''t recognize diskette on drive ' DRV: DS 1 DENL: = *-DENERR-1 FORERR: DB FORL DB CR,LF,'Unformatted diskette on drive ' DRV1: DS 1 FORL: = *-FORERR-1 PAGE CHKSEL: ;Determines if new DPB should be established ;ENTRY ;C = disk selection value (0..15) ;E = BIT0 = 0 IF first call for this disk ;EXIT ;IX = address of drive sequence number ;Z status bit set, good return ;ZACT COMt LOAD COMVCOPY ASM !"VCOPY ASM]#$%&'()*+,-.VCOPY COM"/1234VCOPYG DOC0ACT I 808x Copyright SORCIM Corp. 1981 S/N- 007,Version 3.5EEV SorcALL ASMFilenameHEXFilenamePRNτ?1;͟4199!42 ͣ'6 #6 #6͎ 4!:f'*:;'*:;'F<*99>T29>2a$o*9|LH&*9*9*9(%b;'*9*9(%! ͩ"e:U&*:;'!HHF*|ʧ&!"F*e:|:9!B6 29!l$ Last error occurred on Page 123 Total LOST references were !?="9*9"929go"9*9&"9>s2K2:2:͎ 2929292929292929292Q:go"9!e:"^:"9*9":"9:92:5:9=29>2929>T29> 2K*9196:94H*:"9*9"9*9X!.X:9͓*9 "9:9:9*9}eG:9=__ͻ$#D> 24d"`:~G&vG!.#%fh"c:2e:*9"nx(:9¶ x= :9:9x(=:c:G 6)!K="9! B629>22>22J! :9ĭ!$:9ĭFUnterminated IF nest. IUnterminated MACRO definition. !.~O#%~wy<#%J*9*9 ~w# œ~?ʜp ^#V#N#F r+s 9'n!ͭ~24#W$OToo many PROCs in program. *9?9' "9*9 "9yx  !e: f':d:_ :9¶!"f:":>(=*9"n!%4:c:#%^#V>SE>E24\*^:}!e:"^:2d::9 e::d: !9>wd:G::ʁ!4 W † :9 ͓!9~wÁn>-24>O>Y>S>E>A24*n|c~c=ͅ"::s2:ͨ :9ʽ:9>Y:9>F24292929͗!T.:9>P?*9~24 ͒ | >P24 R::9pͬ% ͬ/ƒͺ:9Ҿp %ҭ!f'!9~G?2:>N*nͻ,#!94:9ʤ>Ov ͼ ðv":"9:s2:2:> 2:Dv"9:s2:G::’*:9'> ʔ>#2:!4wðv:rG:e:N:9*:°>L24ð!e:~"^:*92~c!e:~"^:2*92ͬc!e:"^:v | } >W24>2[:\> ͒"\:, ::*^:w\>S24\*9e:':9 b *9?9'>O "9 *n~*!99ʽ f'ͬ-™ ͬ+ ͭ>UN!9{_~wͬ,ʋ N'*n#~T L@ C D F G M R͒:9@S ͒U͍f:9@͍^!9F6:96 I :9@I ͍!9~w*9~>S## C>E>S~29*9#N# f'! f'! W$Unknown CPU: '' ͓!46'#*9ͩ Of' ;' !) ͍'!4>!O$͓' 2929v}29| :9ͤ=D !94:e:- *9?>L͇ "9< ####>*9##"9'!:͡':92:*9:*9 f'"9x #"95%*9~w##s#r*9##h'%0+  3 Ƃ~ G >@w!:͆>w :9ē*9#"9 *c3 ~ ʪ(~w##^#V*9ʠ w#Ò ͤO:9= y*9#%N#Fx w# Ò *9"9|~ : # !"96!"9*9"9!9"9*9;'*9!9f'*9zV  6 s#r#Z ,;  >P ) s#r#"9x29O:9Gʃ ˆ =29} :9¶29>F:9ʴ ¶} :e:b !94:9¶vz°n:9ē:929*9"9*:":Y*9"9*9"9>L >S24!::9w:9 {: :9Ox~ :92*:*:":":͙ x (::2:>*9G:92:":!"9*9|? *n~}:} 1"9F::O@°yw*:#::w#s#rx ʴx@´>w:9x>D :9>:9:[:O::G!d:yO4Q Jx2::[:*\: lMW͛%O::_G͆%!:w{=@~6*^:w#"^:!d:4 ::W{2:[: !46^#þ':9M*9##(%"f:!46=##þ' ͩʝV=ʝ#^=ʝ>V24*^:s#r+y *^:>A+w¬ͩOGx!46V*n+6:d:2d:*^::9y#% Aw# "^:*n+~#:9(=*9"n*94;'::;>~;7ʧ*7ʧ 7ʧ:9¡ ڧ'.!_ʚ;Œ:9¯> #„òaژ{Ҙ #V#Ҟ#:9ʲ*9"9 ʵ>!;?~   7ȷy#:9ʲ*9ͤõ#N f'V>#"'#~'"# x)+pV9 B#0+> !"9"9"9!9!;~ p ~# f}| fO!~ʌ#7y,+-*/()><=^&[] : \(%*9*99'+~ y¹*99'"929*9.:9g"9"9:9 *9*99' "9>a*<<4:9W~#29  F  Rf> z > : "<<> `i"9!429z29 >=9'ҁͪ> !\#!7\\\ END Statement Missing !><\#6y  !W$ACT stopped by user. *99'"9"9\ f'ͻ#$!Ve%!VC f'>2a$!C͂$f$!>="<<6 Pass 1 - Reading D:FILENAME.EXT ;}; ͒:r >Uá*9"n|’7*nͩڤ?>E247go!"t."r!9"jz>Sͼ2l K*h};9'+~ffbMb*h};9' *f;9';A:@2s"tb*h9'+~H"h> 2l!z#%9'F#N   de~# ʼ+"n>2l!;"f!};"h6>2q>E*j24!"tt>2s7ͬ0 :Q:zzB~G#4V#^6Z6T]#%>2rxß*n+ͭ"n#~G:l x+~!9Oʃ!:Pʃ!9Lʃ>2r^#V#F>ßG> x,\]/*$+^^^&()=<> <= >= < > ~-ANDDEFEQGT GE HIGHLE LOWLT MODNE NOTORREVSHLSHRXOR+%>N>2r>#ß:px2p%x2pU+ͭڒ{ڒ#~"n*n+:s*n2s"n,> *n|ͻ#"n#~ ʺ*n+~ȷ+"n*f;9'>O+~2r+~+^+V"f:r2r2s=#%~+fo>>2s&:s*f<;9'>Sr#s#w#:rw#"fG*h;9'>Sp#"h>2q*h};9'+"h~!#%9nu d)0<D {ozg) {oz {oz#!)#!)##?##? 9'l3>2q}l:rG>2rx x> 24 ) ) 5%)5%) ͭ%) E=%) ͩ)z|5%ڻ PY ͩ)):*9 f':9="9$"9 !W$  Memory OVERFLOW Stopped ACT!/q#p# *9(%:9"9:~%"n::::`:97͆`i?ځ'ځ!d3r+s+7!`3Fx!.H!d0R!2Ͱ2b:!?GN#xy_y_ѯ°#7# y÷y?>E2:2:1>w##^#VO:9#y2r>U724*9*98*9*9:9'b! =# cSh= :|:9 ^= :~ w “9'ʺ# µ¥þÐ7!6> oD# 9'7ȷ0 :?[$b#b.b~J%# ~#,4J%~#o$4f'HO$:9@Õ!9~w*9z^:4 |.> 24.5:9 :4!?怰G:9W:9O@:9ʺyzz>@GzGG&z>+24*94~# !4> #6 #6#2*9#"9!4O$H> 245!4:G~=> w# 56 #6:9@!4\!94:9l$*9:9Gʅw#xl͜lx29"9*9:9q<•!z8$Ҹ:9@29!W$G29!"9List file write error. *9}J%: !f'*&*9"2<29*9#"9&!\! \4>2$:9>B>20:0294:OJ%>$!4".%~*.>  ʄ>sw#UҚDښڛnpf'*99'ڼA6m#6a#6c#6 ###".6:9o:9=29bH:9!0*.6 #C*9!?~: ~ ~w 9'*9DM !?~Ex1}1Fd] d#KT]f 6 ^#VogʉNs#FrYP+y>!4".29|^#V#~/#oy&&".:9=29•5>Ë:9H#^*.&O:9:9:9:::?:92@/7N#F:@+w:9+w+p+qr+s*9#"9~#foþ' no ERRORs, 1234 Labels, h bytes not used. Program LWA = h. *Error page 999SYMBOL TABLE *Error page 999 SORCIM 808x Assembler ver 3.5E mm/dd/yy hh:mm Page 999 ~':9*:9'":Oi`) ))6 2:2:͎ *:"9p : f'::p : f'*:^ ͙ ~ *: ^ "::9:9w"*O::Q:#%9'!!*:"O:G_ :9:9<"#"" >!y2Q:&!!y2Q::Q: Q:G!!:"""#"z P!:N:'6 #6  :r!*O::Q:#%"O:2Q:2N:!):*@5w#}B!|6!!!B5u!"@5:9:9·"!!>12':*:"O: (!*@5B5!!B5V$!:929!!W$Hex file write error.  9'!p#9' "O:N:2N:yW :Q:O!):#%:9:9—"*O:x#%"O:!:~#f" #Oog5#o"_j#I"::O*O:9'Š":M:y2M:> "O:">\#!]#> *6"> *6"::O>*:":Y:"X:r!*@5B5!!"\#5#>>?:Z:y2Z:>\#yp ~ ###t#^#r# &#y?H#"N#_Pt#r#\r#@_t#\j#t#zK͛%O:Y:_G͆%!X:w{=#r!2X::Y:W{2Y:bzWu# Y w# ##7! wD$ѷ$ #7D$ѷ$ $D$7:k$`$l$f$>2k$>b$:k$O$2a$2k$O ͻ$~# ¡$Ù$ ͻ$x“$> _xUү$ͻ$Ä$|ͻ$ ͻ$ ~Oʹ#!$`$$ ?? OPEN error - l$!;6#e%!;l$:9%V:9͍zɅo$MDy_xW{z/W{/_xzW{_=%>  L%~ J%J%# S% As%@O:q#p#f'>.f'xy%%ɷ”%!%#%~?BK!xʾ% ô%BJ~0%:%A%[% #%+FyR&:p &x &Bʯ&N&Ql&Hʆ& :pBʯ&Ql&Hʆ&yG&A&;&5&'V&V&dV& V&V&7N&~0Q& Q&# =e&~0R&R&_ #M&)))l&~0R&:&AR&GR&_# M&))))Æ&~0R&R&)o# ²&M&&'&'&'&'}0>02'>0]T< &=kbG:''> x>2'0~0~0#y'z{x7# A'9'h' +~ x['x~# h'x~aڅ'{҅'# u'~#Í'7#Ö'zq#ã'O:'=@I±' ®'V|'}'Ɛ'@'ɯ2(#~:+:\'~@8(##(ͬ#<~>:7:(.$(~.#$(y^(!S:( ^(:(7x7~i(#.^(*V(>?a(~# :(G>  a(x!8(|8(;8(=8(:8(@ʖ(#ʖ(*ʖ(?›(2(a({ w!d:6͹-2e:>I24\..(>.c3]-Cͥ-M..c-3͓-c>d.cle3͓-cm( (me3͓-(-3͓-͒"f:cme3͓-g-à,..͒Xx.c>I*͹-..e3M-M.>!.c3-ڰ)ͥ-*-3>)O- M."-.c3-ڰ)͹-3-- M.>!.cs-e3l- *n+~)͹-M.cs-3@-C*n"9e3\-)ͥ-M..cs-͹-g-3-*ͥ-3-(s-e3\-)ͥ-M..J,3-j*:-ʉ**3 *--"-ڰ*ͥ-.cs-3 -*3-a* \s-s-3-ڃ*:-ƒ*3-a*Ã*s-s-3-ڃ*3-ڃ*:-ƒ*a*s-s-3@-ڃ*͹-..c>H2+3@-++3 *n-+͹-M.cs-~[.+"nÝ,s-s-3-M+3-M+͹-(s-3-^+,s-3)-ڀ+͹-M.>!.͒"g:cs-e3:+O-ڧ+M.e3-Cͥ-.c:+>s-͒"f:́.Ó+H͹->!.c3-+:- ͹-(s-+>d.,Ce3\-Cͥ-M.>!..c3=-*,ͥ-M.͒"f:G,s-e3I-Cͥ-M.͒"f:́..>c3=-l,ͥ-M..cs-e3]-Cͥ-M..c3-ښ,ͥ-.cs-͹-͒"f:c3@-,3-,͹-M.>!.cs-3-,͹-M.>!.3@-Ccs-3 --3-Cͥ-.cs-e3m-;-M.e3l-;-͹-M.cs-3->:->3%->͹-M.>.8,͒"f:́.c!b:55>*9"n*`:##"`:~2d:#~2e:-CM.ͥ-.-ʹ-!d:4-4:9 *nͭ"ny_b#V"-|-͒x.}2-]Cͬ,=-@!.!g:Fw#p*f:"g:*d:o"e::9>C >$24:9>C >#:.*-}o|-^.!e:w͒د†.z†.[.}|†.|<:4 >V24ASMHEX080808085Z80 =+CADD ADICADCJACIANA#ANDANIASEG.ASSERT6BIT@CALLCBITCCCLCCMA/CMC?#CMPCMCNZCNCCPECPOCPDRCPDCPIRCPI#CPICPU3CPCSEG.CZDAA'DAD DA&DBE%DB%DCE%DCRDCX DC%@#DEC DIDJNZDSEG.DS!DW&ECHO5EIEJECT:ELSE=ENDM<endm<ENDIF=END(ENTRY,EQU+ERR;EXT-EXXBEXHLTvIDENT0IF=IM0FIM1VIM2^#INCINDRINDINIRINIINRINXIN,C@IN#JMPJNZJMJCJNCJPEJPOJPJZJRC8JRNC0JRNZ JRZ(JRLDAX LDA:LDDRLDDLDIRLDI#LDKrLD :*KFLHLD*LINK2LIST8"LKLOC#LXIMACRO5MVISMOVWG@(MSG9NEGDNOPORG"ORAORI"OROTDROTIROT,CAOUTDOUTIOUTPAGE:PCHLPOPPROC$PUSHRALRARRCREPT5RETIMRETNERETRIM RLC#RLCRLDo"RLRMRNCRNZRPERPORPRRC#RRCRRDgRRRSTRZSBBCSBCBSBITSBISET+@SHLD"SIM0SLA SPACE7SPHLSRA(SRL8STAXSTA2STC7sSTO2"Cp63SUBSUITITLE1USE/VFD)XCHG#XORXRAXRIXTHL'*M%6[HL]6[IX[IYB C D E H $L -AA?IR AFA6PSWA6SP!6IX$IYdBC B DE D HL$H$AFA6SP!6IX$IYdBC DE HL$[SP]!6[IX]$[IY]d[BC] [DE] [HL]$(((() )%)-))0)3)+G)(((+++*B),U,(,`))*!*8*,6Kl#([ uX" F a T E w  2ͮ8>2k$!"R:ͬ#<@27a5:2$:29͈8*9!\ f'"9"9:94!Vͪ5:95!zͪ5!Af'!~6!l$2!T l$!.7:9f$6!=5$h'*ABS *CODE *DATA !"5!~ 8#O 65͹8!?="9l9 8}6:929l96ͭ8^#VPY##$!\ ?'\!5$ ?? Hex or Prn file name same as Input = 5@R6H=06H=6LO7L=06L=CON:6L=LP:6L=6L6O7PS(7SLA7S=_7S\7R=07R=S7R=F7R7!.7\'8\V!.7z! 77:929Ô5!.V7Ô5>29!RE".>L2.P!:͡'Ô5Í5:9ï6>`2i$:9ï6! 7z7:9ï6PRN;729Ô5;7"9Ô5:;7d!x8872Ô5P;72`i+~=7#%8{7':!d8$YPf'7Sf'!8l$!288!R88!d88Command input errorNO source file specified, ABORTMal-formed numberIll-formed filenamePS > 99SL < 60/!'> :!'!8f' Page *%"9"9OD9T9 .9}|:k99~ 9 9, 9; 9|.9 .9.9a 9{ 9 w#86#8:k9(9~ .9.9#96#86go~<9ѯx~ O9 S9#D9~'d9"d92k96#2k95~#ʇ9<+w#_^#Vѯ7TTTTTTTTTTTTTTTTT=99hhhh?=???99?=?9 :9999990099 ?\:e:`: prompt/command response JMP X30D2 ; end  ',*7:9ï6PRN;729Ô5;7"9Ô5:;7d!x8872Ô5P;72`i+~=7#%8{7':!d8$YPf'7Sf'!8l$!288!R88!d88Command input errorNO source file specified, ABORTMal-formed numberIll-formed filenamePS > 99SL < 60/!'> :!'!8f' Page *%"9"9OD9T9 .9}|:k99~ 9 9, 9; 9|.9 .9.9a @ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! 6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝҉* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!? q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#WA 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;.Date : 4/4/83 ;.Author : DEB & YMK ;.Title : ENCORE DISK UTILITY : REV X3.094 ;.Comments: ALPHA ; +---------------+ ; | | ; | ENCORE | ; | DISK UTILITY | ; | | ; +---------------+ ;X.1 Added only to start a copy or format : deb ;X.2 Changed menu's : deb ;X.3 Changed name : deb ; Changed RFORMAT to do work that used to be done in the rom : deb ; Format uses SEEK instead of STEP : deb ; No retrys in format instruction : deb ; Took out PUSHAL & POPALL : deb ; Cleaned code : deb ; Took out all relative jumps : deb ;X.4 Changed IMSG from EXSPRESS to EXPRESS : deb ; Changed all referance to VIXEN to EXPRESS : ymk ; Add RETURN option to select density display : ymk ; Add Reading or Writing display on copy message : ymk ; Add format header message(ex. Formatting diskette a with d.d.) : ymk ; Add Copy Header message(ex. copying a to b) : ymk ; Add format drive selection display : ymk ; Add copy diskette slection display : ymk ; When there is disk write error, read fdc status(DSK_STS) and ; check for write protected. If write protected, then ; display write protected error message and stop processing. : ymk ;X.5 Cleaned code : deb ;X.6 Changed interface to rom : deb ; Took out GOROM : deb ; Remove single density format selection : ymk ; Display copywrite message : ymk ; Change ESC sequence for reverse video ; ESC ) -> ESC j, ESC ( -> ESC k : ymk ; (1)Change message "Press ESC to exit..." to "Press ESC to exit to CP/M..." : ymk ; (2)Change message "...Return to exit." to "... Return for Previous menu" : ymk ; (3)Beep on error message : ymk ; (4)Reverse video for error message ( read, write) : ymk ; (5)Change message "try again." to "retry" : ymk ; (7)Change message "Format diskette A/B" to "Format diskette in drive A/B" : ymk ; Final version : deb DSK_STS = 00H ;Floppy disk status register ;TRANSFER RAM MEMORY LOCATIONS DMADR: = 0EFF7H ;(2) DISK DMA ADDRESS SAVTYP = 0EFF9H ;(1) DISK TYPE SDISK: = 0EFFAH ;(1) DISK IN USE SAVTRK: = 0EFFBH ;(2) TRACK SAVSEC: = 0EFFDH ;(1) SECTOR ;ROM JUMP VECTORS RDRV: = 0F10CH ;HOME RSEC: = 0F10FH ;READ A SECTOR WSEC: = 0F112H ;WRITE A SECTOR SENDEN: = 0F115H ;SENCE DENSITY ROUTINE SEEK: = 0F11BH ;SEEK FMTTRK: = 0F133H ;FORMAT TRACK SELDRV: = 0F139H ;SELECT DRIVE MTRK: = 40 ;NUMBER OF TRACKS CR = 0Dh ;^M, CR = Carriage Return FMTCHR = 0E5h ;Data format char BDOS = 5 SYS = 5 ;CPM Monitor call address SDTYP = 0000_0101B ;SINGLE DENSITY SAVTYP DDTYP = 0000_1100B ;DOUBLE DENSITY SAVTYP DSEC = 5 ;DOUBLE DENSITY SECTORS/TRACK SSEC = 10 ;SINGLE DENSITY SECTORS/TRACK BOOT = 0000H ESC: = 1BH BEL = 07H ;PROGRAM START ORG 100H LDK SP,STACK LDK HL,IMSG CALL PRINT ;PRINT HEADER MESSAGE CALL MENU JMP RESYSR PAGE PROC MENU: LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,MSCR CALL PRINT :1: CALL GETFUN CPI CR RZ ANI 5FH CPI 'C' JZ KOPY ;JUMP TO COPY MENU CPI 'F' JZ FMAT ;JUMP TO FORMAT MENU JMP :1 ;LOOP IF NEITHER PAGE FMAT: ;FORMAT MENU ;ENTRY ;NONE ;EXIT ;NONE PROC :LOOP1: LDK HL,IMSG1 CALL PRINT :LOOP: LDK HL,FMTSCR ;SELECT DRIVE CALL PRINT CALL GETDSK CPI CR JZ MENU ;JMP TO MENU IF CR STO A,FDISK SUI 'A' STO A,SDISK :1: LDK HL,FMES ;press RETURN when ready CALL PRINT CALL CIN ;GET CHARACTER CMP CR JNZ :1 ;IF NOT CR LOOP :2: CALL STSAVTYP ;SET DENSITY CALL SETPARM ;SET PARAMITERS CALL FORMAT ;FORMAT DISKETTES JNZ :5 ;IF ERROR LDK HL,CLESCR ;CLEAR SCREEN CALL PRINT LDK HL,GDFMT ;FORMAT completed successfully CALL PRINT JMP :LOOP :5: LDK HL,BDFMT ;ERROR IN FORMAT LD A,FMTERR ;IS WRITE PROTECTED ? CPI 'W' JNZ :6 ;NO- LDK HL,BDFMT1 ;WRITE PROTECTED MESSAGE :6: CALL CKQUIT JZ RESYSR ;YES-QUIT LDK B,3 LDK C,1 CALL SETCUR LDK HL,CEOPAG CALL PRINT LDK HL,MSCR CALL PRINT JMP :LOOP PAGE KOPY: ;COPY MENU ;ENTRY ;NONE ;EXIT ;NONE PROC :LOOP: LDK HL,KPYSCR CALL PRINT CALL GETDSK CPI CR JZ MENU STO A,SDSK XRI 03H STO A,DDSK XRI 03H SUI 'A' STO A,SOURCE ;SET SOURCE STO A,SDISK ;SET DISK :1: LDK HL,KMESS ;PUT SOURCE DISKETTE IN DRIVE CALL PRINT CALL CIN ;GET CHARACTER CMP CR JNZ :1 ;IF NOT CR LOOP LDK HL,KPYMS1 ;COPYING MESSAGE LD A,SDSK CPI 'A' JZ :3 LDK HL,KPYMS2 :3: CALL PRINT CALL SENDEN ;GET DENSITY JNZ :2 ;IF ERROR CALL SETPARM ;SET PARAMETERS CALL MATCHFMT ;MAKE SURE SOURCE AND DESTINATION ;IF NOT OSBORNE FORMAT LDK HL,BADDEN JNZ :4 ;IF FORMATS DON'T MATCH CALL COPY ;COPY A DISKETTE JNZ :2 ;ERROR IN COPY LDK HL,CLESCR ;CLEAR SCREEN CALL PRINT LDK HL,GMES ;COPY completed successfully CALL PRINT JMP :LOOP :2: LDK HL,BMES ;ERROR IN COPY LD A,CPYERR ;IS WRITE PROTECTED ? CPI 'W' JNZ :4 ;NO- LDK HL,BDFMT1 ;WRITE PROTECTED MESSAGE :4: CALL CKQUIT JZ RESYSR ;YES-QUIT LDK B,3 LDK C,1 CALL SETCUR LDK HL,CEOPAG CALL PRINT LDK HL,MSCR CALL PRINT JMP :LOOP PAGE GETDSK: ;GET DISK ;ENTRY ;NONE ;EXIT ;NONE PROC CALL CIN CPI CR RZ ANI 5FH CPI 'A' RZ CPI 'B' RZ JMP GETDSK PAGE GETFUN: CALL CIN ORA A JZ GETFUN RET PAGE STSAVTYP: ;SET SAVTYP FOR FORMAT ;ENTRY ;NONE ;EXIT ;B = # OF SECTORS/TRACK PROC ;DOUBLE DENSITY LDK A,DDTYP STO A,SAVTYP LDK B,5 ;SECTORS/TRACK RET PAGE SETPARM: ;SET UP PARAMETERS THAT DEPEND ON DENSITY ;ENTRY ;B = # OF SECTORS/TRACK ;SAVTYP = SET ;EXIT ;PARAMETERS SET PROC MOV A,B STO A,NUMSEC ;SECTORS/TRACK ORI 0FFH STO A,OSBFMT ;INITIALIZE TO NON-OSBORNE FORMAT ;CHECK FOR STANDARD OSBORNE DENSITIES LD A,SAVTYP CPI SDTYP JZ :SING ;IF SINGLE DENSITY SAVTYP ;DOUBLE DENSITY CPI DDTYP JNZ :2 ;IF NOT DOUBLE DENSITY SAVTYP MOV A,B ;VERIFY # OF SECTORS CPI DSEC JNZ :2 ;IF WRONG # OF SECTORS LDK HL,DDPARM ;DOUBLE DENSITY PARAMETERS JMP :1 ;SINGLE DENSITY :SING: MOV A,B ;VERIFY SECTORS/TRACK CPI SSEC JNZ :2 ;IF NOT STANDARD SINGLE DENSITY LDK HL,SDPARM ;SINGLE DENSITY PARAMETERS ;MOVE OSBORNE PARAMETERS TO PARM :1: LDK DE,PARM LDK BC,7 LDIR ;SET UP REMAINING PARAMETERS :2: CALL STRKLEN ;SET NUMBER OF BYTES PER TRACK CALL SNUMTRK ;SET NUMBER OF TRACKS PER BLOCK CALL SNUMBLK ;SET NUMBER OF BLOCKS PER DRIVE RET PAGE STRKLEN: ;SET NUMBER OF BYTES PER TRACK ;ENTRY ;NUMSEC = SECTORS/TRACK ;SAVTYP SET ;EXIT ;TRKLEN = BYTES/TRACK PROC ;SET HL = SECTORS/TRACK * 128 LD A,NUMSEC MOV H,A LDK L,0 ;HL = NUMSEC * 256 SRA H RR L ;HL = NUMSEC * 128 ;GET BYTES/SECTOR LD A,SAVTYP SRL A SRL A ANI 0000_0011B ;GET SECTOR LENGTH ;(00 = 128, 01 = 256, 10 = 512, 11 = 1024) MOV B,A JZ :2 ;DONE IF 128-BYTE SECTORS ;CALCULATE BYTES/TRACK ;HL = HL * (2**B) :1: DAD HL,HL ;HL * 2 DJNZ :1 :2: STO HL,TRKLEN RET PAGE SNUMTRK: ;SET NUMBER OF TRACKS PER BLOCK ;ENTRY ;NONE ;EXIT ;NONE PROC ;GET TOTAL BUFFER LENTH XRA A ;RESET CARRY FLAG LD HL,SYS+1 ;GET TOP OF TPA LDK DE,BUFF1 ;FBA OF BUFF1 SBC HL,DE ;HL = TOTAL SPACE AVALIBLE ;GET NUMBER OF TRACKS PER BUFFER LD DE,TRKLEN ;GET TRACK LENTH LDK B,0 ;SET COUNT TO ZERO XRA A ;RESET CARRY FLAG :LOOP: SBC HL,DE ; - ONE TRACK INC B ;B=B+1 JNC :LOOP ;LOOP UNTIL HL < DE ;SET NUMTRK DEC B ;B = NUMBER OF TRACKS IN ONE BLOCK MOV A,B STO A,NUMTRK ;SET NUMTRK RET PAGE SNUMBLK: ;SET NUMBER OF BLOCKS PER DRIVE ;ENTRY ;NUMTRK = NUMBER OF TRACKS PER BLOCK ;EXIT ;NONE PROC LD A,NUMTRK ;GET NUMBER OF TRACKS PER BLOCK MOV B,A ;SAVE LDK A,MTRK ;GET NUMBER OF TRACKS PER DRIVE LDK C,0 ;ZERO COUNTER :LOOP: SUB B ; - ONE BLOCK PUSH AF INC C ;C=C+1 POP AF JZ :1 ;IF EVEN DON'T INC JNC :LOOP ;LOOP TILL A 0 IF FORMATS DON'T MATCH ;ZBIT = RESET IF FORMATS DON'T MATCH PROC ;CHECK FOR OSBORNE FORMAT LD A,OSBFMT ORA A RZ ;RETURN OK IF OSBORNE ;PRINT NOT OSBORNE MESSAGE LDK HL,IMSG1 CALL PRINT LDK HL,NOTOSB CALL PRINT CALL BEEP ;CHECK DESTINATION DISK LD A,SAVTYP MOV D,A PUSH DE ;SAVE SOURCE SAVTYP LD A,SOURCE ;SOURCE DISK XRI 0000_0001B ;OTHER DISK STO A,SDISK CALL SENDEN ;SENSE DESTINATION DENSITY POP DE ;RESTORE D = SOURCE SAVTYP LD A,NUMSEC ;SOURCE SECTORS/TRACK CMP B ;DESTINATION SECTORS/TRACK RNZ ;RETURN ERROR IF SECTORS/TRACK DON'T MATCH LD A,SAVTYP ;DESTINATION SAVTYP CMP D ;SOURCE SAVTYP RNZ ;RETURN ERROR IF SAVTYPs DON'T MATCH ;RESTORE SAVTYP AND SDISK TO SOURCE MOV A,D STO A,SAVTYP ;RESTORE SOURCE SAVTYP LD A,SOURCE STO A,SDISK ;RESTORE SOURCE SDISK XRA A RET ;GOOD RETURN PAGE FORMAT: ;FORMAT ONE DISK ;ENTRY ;NONE ;EXIT ;ZBIT = RESET IF ERROR PROC LDK HL,IMSG1 ;CLEAR THE SCREEN CALL PRINT CALL DISFMT ;DISPLAY FORMAT MESSAGE LDK HL,PFORMAT ;FORMAT MESSAGE CALL PRINT LDK A,1 STO A,SAVSEC ;SET SECTOR CALL RDRV ;HOME DRIVE RNZ ;ERROR RETURN ;FORMAT AND VERIFY ENTIRE DISK LDK HL,CRLF5S CALL PRINT XRA A ;START WITH TRACK 0 STO A,FMTERR ;NO ERRORS YET ;TRACK LOOP :TLOOP: STO A,SAVTRK ;UPDATE TRACK NUMBER CALL FMTINT ;INITIALIZE FORMAT BUFFER(BUFF) CALL STRK ;SET NEW TRACK INTO DATA LDK BC,BUFF ;POINT TO FWA OF BUFFER CALL RFORMAT ;FORMAT ONE TRACK JC :1 ;IF ERROR CALL VERIFY LDK A,'*' JZ :4 ;IF GOOD ;CHECK FOR WRITE PROTECT :1: IN DSK_STS ;READ FDC STATUS ANI 40H ;IS WRITE PROTECTED ? JZ :2 ;IF NOT A WRITE PROTECT ERROR LDK A,'W' ;WRITE PROTECTED ERROR STO A,FMTERR ORA A RET ;STOP ON WRITE PROTECT ERROR :2: LDK A,'E' STO A,FMTERR ;SET ERROR FLAG :4: CALL CONOUT ;OUTPUT INDICATOR LD A,SAVTRK INC A CMP MTRK JNZ :TLOOP ;CONTINUE TILL ALL TRACKS ;FINAL CHECK LD A,FMTERR ORA A RET ;RETURN FMTERR: DB 0 PAGE DISFMT: ;DISPLAY FORMAT MESSAGE ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,FDISK ;GET DRIVE CPI 'A' LDK HL,FMTMS1 ;DRIVE A, D.D. JZ :1 LDK HL,FMTMS2 ;DRIVE B, D.D. :1: CALL PRINT RET PAGE VERIFY: ;VERIFY 0E5H ON ONE TRACK ;USES BUFF FOR VERIFICATION ;ENTRY ;SDISK = DRIVE TO VERIFY ;SAVTRK = TRACK TO VERIFY ;EXIT ;ZBIT = RESET IF ERROR PROC LDK BC,BUFF STO BC,DMADR ;SET DMA STO BC,LBUFF1 ;SET DMA FOR CNDATA ;READ ONE TRACK LD A,NUMSEC ;SECTORS/TRACK MOV B,A CALL RSEC ;READ ONE TRACK RNZ CALL CNDATA ;CHECK FOR ALL E5H'S RET PAGE COPY: ;COPY DISKETTE ;ENTRY ;SOURCE = DRIVE TO COP Y FROM ;EXIT ;ZBIT = RESET IF ERROR ;B IS DESTROYED PROC LDK A,1 STO A,SAVSEC ;SET SECTOR *BLOCK LOOP (0-3 SINGLE DENSITY) (0-7 DOUBLE DENSITY) XRA A STO A,CPYERR ;RESET COPY ERROR FLAG :BLOOP: STO A,BLOCK CALL RDMBLK ;READ MASTER RNZ ;RETURN IF ERROR CALL WRTBLK ;WRITE BLOCK TO OBJECT RNZ ;RETURN IF ERROR ;CHECK FOR END OF BLOCK LD A,NUMBLK ;GET NUMBER OF BLOCKS MOV B,A LD A,BLOCK ;CURRENT BLOCK INC A CMP B JNZ :BLOOP ;LOOP RET ;FINISHED DUPLICATION CPYERR: DB 0 ;COPY ERROR FLAG PAGE RDMBLK: ;READ ONE BLOCK FROM THE MASTER ;ENTRY ;EXIT ;ZBIT = RESET IF ERROR PROC LD A,SOURCE STO A,SDISK ;SET DRIVE ;FIND HEAD POSITION AND SET D.TRKR CALL SENDEN ;SENCE DENSITY RNZ XRA A ;ZERO A :TLOOP: STO A,TRACK CALL SETSAVTRK ;SET SAVTRK LD A,SAVTRK ;GET SAVTRK CMP MTRK RZ ;IF SAVTRK = 40 STOP CALL SETLBUFF1 ;SET LBUFF1 CALL RDMTRK ;READ MASTER RNZ LDK HL,NUMTRK ;# OF TRACKS/BLOCK LD A,TRACK INC A CMP [HL] ;DONE? JNZ :TLOOP ;LOOP IF NOT DONE RET ;RETURN GOOD PAGE RDMTRK: ;READ ONE TRACK OFF MASTER ;ENTRY ;LBUFF1 = DMA ADDRESS ;EXIT ;ZBIT = RESET IF ERROR PROC LDK HL,TKMSG2 ;READING CALL PRINT LDK HL,TKMSG CALL PRINT ;OUTPUT MESSAGE LD HL,LBUFF1 STO HL,DMADR ;SET DMA TO "LBUFF1" LD A,NUMSEC MOV B,A CALL RSEC ;READ RET PAGE WRTBLK: ;WRITE ONE BLOCK ON OBJECT DRIVE ;ENTRY ;EXIT ;ZBIT = RESET IF ERROR PROC ;SELECT DRIVE LD A,SOURCE XRI 0000_0001B ;OTHER DRIVE STO A,SDISK ;SET DRIVE ;FIND HEAD POSITION AND SET D.TRKR LD A,BLOCK ORA A JNZ :1 ;If "BLOCK" is not zero skip home ;HOME DRIVE IF ON TRACK ZERO CALL RDRV ;HOME DRIVE RNZ ;RETURN IF ERROR JMP :2 ;IF GOOD SKIP SENDEN :1: CALL SENDEN RNZ ;RETURN IF ERROR :2: XRA A ;TRACK LOOP :TLOOP: STO A,TRACK CALL SETSAVTRK ;SET SAVTRK LD A,SAVTRK ;GET SAVTRK CMP MTRK  RZ ;IF SAVTRK = 40 STOP CALL SETLBUFF1 ;SET LBUFF1 CALL WRTTRK ;WRITE TRACK RNZ LDK HL,NUMTRK ;# OF TRACKS/BLOCK LD A,TRACK INC A CMP [HL] ;DONE? JNZ :TLOOP ;LOOP IF NOT DONE RET PAGE WRTTRK: ;WRITE FORMAT AND DATA ON TRACK ;ENTRY ;SAVTRK = TRACK TO COPY ;BUFF = FORMAT INFO ;LBUFF1 = INFO TO COPY ;"LBUFF1" holds the fba address of the buffer ;EXIT ;ZBIT = RESET IF ERROR PROC LDK HL,TKMSG3 ;WRITING TRACK CALL PRINT LDK HL,TKMSG ;TRACK NUMBER CALL PRINT ;FORMAT CALL WRTFMT RNZ ;IF ERROR MOV A,B ORA A ;SET FLAGS RZ ;IF ALL E5's, NO NEED TO WRITE ;WRITE A TRACK LDK A,2 STO A,ERCOUNT ;RETRY ONCE FOR WRITE COMPARE ERRORS :1: LD HL,LBUFF1 STO HL,DMADR ;SET DMA LD A,NUMSEC ;SECTORS/TRACK MOV B,A CALL WSEC RNZ ;READ A TRACK LDK HL,BUFF STO HL,DMADR ;SET DMA LD A,NUMSEC MOV B,A CALL RSEC ;READ RNZ ;COMPARE BUFFERS LD BC,TRKLEN LDK DE,BUFF LD HL,LBUFF1 CALL COMPSEG  ;VERIFY THE "TRACK" RZ ;RETURN IF OK LD A,ERCOUNT DEC A JNZ :1 ;IF MORE RETRIES ORI 0FFH ;INDICATE PERMANENT ERROR RET PAGE WRTFMT: ;WRITES FORMAT ON TRACK IF OSBORNE FORMAT ;ENTRY ;NONE ;EXIT ;B = 0 IF ALL E5'S ON OSBORNE FORMAT ;A = 0 IF NO ERRORS ;ZBIT SET PROC LD A,OSBFMT ORA A JNZ :1 ;SKIP FORMAT IF NOT OSBORNE ;FORMAT OSBORNE DISKS ;SET UP FORMAT BUFFER CALL SAVBUFF ;SAVE THE INFO ABOVE BUFF CALL FMTINT ;INITIALIZE FORMAT BUFFER(BUFF) CALL STRK ;SET TRACK NUMBER IN BUFF ;FORMAT TRACK LDK BC,BUFF ;WBA OF BUFFER CALL RFORMAT ;FORMAT THIS TRACK JNC :CONT ;CONTINUE IF NO ERROR ;CHECK FOR WRITE PROTECT ERROR IN DSK_STS ;GET FDC STATUS ANI 40H ;IS WRITE PROTECTED ? LDK A,'E' JZ :2 ;IF NOT WRITE PROTECT ERROR LDK A,'W' ;YES- W. P. ERROR :2: STO A,CPYERR RET ;RETURN TO STOP IF ERROR ;CHECK TRACK FOR NO INFORMATION(ALL 0E5H'S) :CONT: CALL RSTBUFF ;RESTORE THE INFO ABOVE BUFF  CALL CNDATA JNZ :1 ;IF NOT ALL E5H'S ;VERIFY E5'S ON THIS TRACK CALL SAVBUFF ;SAVE THE INFO ABOVE BUFF CALL VERIFY ;VERIFY ALL E5H'S ON DESTINATION DRIVE PUSH AF ;SAVE FLAGS CALL RSTBUFF ;RESTORE THE INFO ABOVE BUFF POP AF RNZ ;IF ERROR XRA A MOV B,A ;ALL E5's RET ;GOOD RETURN :1: LDK B,0FFH ;NOT ALL E5's XRA A RET ;GOOD RETURN PAGE SETSAVTRK: ;COMPUTE & SET THE VALUE OF "SAVTRK" ;Value = ("BLOCK" * #TRACKS/BLOCK)+ "TRACK" ;ENTRY ;NONE ;EXIT ;NONE PROC ;"BLOCK" TIMES TRACKS/BLOCK LD A,NUMTRKS DEC A MOV B,A ;B = TRACKS/BLOCK - 1 LD A,BLOCK MOV C,A ;A = "BLOCK" :LOOP: ADD C ; + "BLOCK" * (TRACKS/BLOCK - 1) DJNZ :LOOP ;ADD "TRACK" MOV B,A LD A,TRACK ADD B STO A,SAVTRK LD HL,SAVTRK LDK DE,TKMSG1 CALL CBD2 ;PUT DECIMAL TRACK NUMBER IN MESSAGE RET PAGE SETLBUFF1: ;COMPUTE & SET THE VALUE OF "LBUFF1" ;"LBUFF1" MUST BE ABOVE 4000H ;Value = ("BYTES/TRACK" * "TRACK") + "BUFF1"   ;ENTRY ;NONE ;EXIT ;NONE PROC ;"BYTES/TRACK" TIMES "TRACK" LDK HL,0 LD DE,TRKLEN LD A,TRACK ORA A JZ :2 ;IF TRACK = 0 MOV B,A :1: ADD HL,DE DJNZ :1 ;+ "BUFF1" :2: LDK DE,BUFF1 ADD HL,DE STO HL,LBUFF1 RET PAGE CNDATA: ;CHECK "LBUFF1" FOR ALL 0E5H'S. IF ALL 0E5'S SET ZBIT AND RETURN ;ENTRY ;NONE ;EXIT ;ZBIT = SET IF ALL E5H'S PROC LD BC,TRKLEN ;NUMBER OF BYTES IN ONE TRACK LD HL,LBUFF1 ;FBA OF BUFFER LDK A,FMTCHR :LOOP: ; CPI ;DEC BC : INC HL : CMP [HL] : Z if good compare : P if BC=0 DB 0EDH,0A1H JPO :1 ;IF BC=0 JZ :LOOP ;IF GOOD CMP CONTINUE RET ;ALL VALUES NOT 0E5H'S :1: XRA A ;ALL VALUES WERE E5H'S RET PAGE FMTINT: ;MOVE FORMAT DATA TO HIGH RAM BUFFER ;SET BUFFER TO BE: ;0,1 = LENTH OF BUFFER ;2->END = BUFFER ;ENTRY ;NONE ;EXIT ;NONE PROC ;COPY 1ST SECTOR LDK DE,BUFF+2 ;FWA FOR DATA LD HL,FORDAT ;FWA OF DATA LD BC,LIFMT ;NUMBER OF BYTES LDIR ;MOVE LDK A,1 STO A,SECTOR ;SET SECTOR LD A,NUMSEC ;SECTORS/TRACK DEC A MOV B,A ;COPY REMAINING SECTORS :LOOP: PUSH BC PUSH DE POP IY ;IY = FWA OF THIS SECTOR ;MAKE ONE SECTOR LD HL,FORDAT LD BC,LIFMT LDIR ;MOVE ;SET SECTOR NUMBER LDK HL,SECTOR ;INC SECTOR INC [HL] ;CHECK FOR DENSITY LD A,SAVTYP CMP SDTYP ;SINGLE DENSITY? LD A,[HL] ;A = SECTOR JZ :S ;IF SINGLE STO A,[IY+(DFSECN-DFMTSD)] ;DOUBLE JMP :1 :S: STO A,[IY+(SFSECN-SFMTSD)] ;SINGLE :1: POP BC DJNZ :LOOP ;IF MORE SECTORS ;SET LENTH OF BUFFER IN BUFFER EX DE,HL LDK BC,BUFF+2 SBC HL,BC ;GET LENGTH STO HL,BUFF ;SET LENGTH INTO BUFFER RET PAGE STRK: ;SET TRACK NUMBERS INTO DATA ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,BUFF+1 LD DE,TRKOFS ADD HL,DE LD A,NUMSEC MOV B,A ;B = # OF SECTORS LD DE,LIFMT LD A,SAVTRK :2: STO A,[HL] ;UPDATE TRACK CELL ADD HL,DE ;POINT TO NEXT DJNZ :2 ;IF NOT DONE RET PAGE RFORMAT: ;FORMAT TRACK ;This proc will format the track pointed to by SAVTRK in IBM 3740 format *NOTE* ;THE TRACK REGESTER IN THE FDC MUST BE SET TO THE TRACK THAT THE HEAD IS OVER ;IF THE TRACK DESIRED IS THE SAME AS THAT IN THE FDC TRACK REGESTER NO STEP WILL BE PERFORMED ;IF THE FDC TRK REG IS 5 AND SAVTRK IS 10, FIVE STEPS WILL BE MADE ;ENTRY ;BC = FWA of buffer ;BUF+0 = DW length ;BUF+2 = beginning of data ;SAVTRK = THE TRACK TO BE FORMATED ;EXIT ;CBIT = SET IF ERROR ;CBIT = RESET IF OK PROC PUSH BC ;SAVE BC ;SELECT DRIVE CALL SELDRV ;NO ERRORS ARE RETURNED ;SEEK TO DESIRED TRACK ;NOTE IF THE TRACK IS THE SAME AS THE FDC TRACK REG NO SEEK WILL BE DONE CALL SEEK ;NO ERRORS ARE RETURNED ;SET "DMADR" :1: POP HL ;GET ADDRESS LD C,[HL] INC HL LD B,[HL] ;BC = LENGTH OF FORMAT DATA INC HL STO HL,DMADR ;SET DMA CALL FMTTRK ;FORMAT TRACK RET PAGE SAVBUFF: ;SAVE THE VALUE OF 7000 BYTES FROM BUFF IN BUFFS ;ENTRY ;NONE ;EXIT ;NONE PROC LDK BC,7000 LDK DE,BUFFS ;DESTINATION LDK HL,BUFF ;SOURCE LDIR ;MOVE RET PAGE RSTBUFF: ;RESTORE THE VALUE OF 7000 BYTES FROM BUFFS IN BUFF ;ENTRY ;NONE ;EXIT ;NONE PROC LDK BC,7000 LDK DE,BUFF ;DESTINATION LDK HL,BUFFS ;SOURCE LDIR ;MOVE RET PAGE COMPSEG: ;COMPARE THE DATA IN THE TWO BUFFERS. ;ENTRY ;BC = NUMBER OF BYTES ;DE = FIRST BUFFER ;HL = SECOND BUFFER ;EXIT ;A = 0 IF NO ERRORS ;ZBIT RESET IF ERROR PROC PUSH BC PUSH DE PUSH HL :1: MOV A,B ;CHECK BC FOR ZERO ORA C JZ :2 ;GOOD RETURN LD A,[DE] CMP [HL] PUSH AF INC DE INC HL DEC BC POP AF JZ :1 ORI 0FFH ;INDICATE ERROR :2: POP HL POP DE POP BC RET PAGE CONOUT: ;OUTPUT CHARACTER TO CONSOLE ;ENTRY ;A = CHARACTER PROC PUSH BC PUSH DE PUSH HL MOV E,A MVI C,2 CALL SYS POP HL POP DE POP BC RET PAGE CBD2: ;CONVERT BINARY NUMBER TO ASCII DECIMAL ;WITH LEADING ZERO SUPRESSION. ;ENTRY ;HL = VALUE TO CONVERT ;DE = FWA TO STORE CONVERSION ;EXIT ;NONE ;CHANGES ALL REGESTERS PROC LDK BC,-10 CALL CBO CALL CLZ MOV A,L ADI '0' STAX D LDK A,'0' STO A,CLZA ;RESET TO IGNORE LEADING ZEROS! RET CBO: ;CONVERT ONE DIGIT TO DECIMAL HEX ;ENTRY ;A = NUMBER ;EXIT ;NONE PROC LDK A,'0' PUSH DE :LOOP: MOV E,L MOV D,H INR A ADD HL,BC JC :LOOP ;IF NOT DONE DCR A MOV L,E MOV H,D POP DE RET PAGE CLZ: ;CHECK FOR LEADING ZEROS AND IF FOUND CHANGE TO LEADING SPACES. ;ENTRY ;A = NUMBER ;EXIT ;NONE PROC MOV B,A LDA CLZA CMP B JNZ :1 ;IF 1ST LEADING DIGIT FOUND LDK A,' ' STAX D INC DE ;PLUG WITH RET IF NO LEADING SPACES RET :1: MOV A,B STAX D INC DE LDK A,0FFH STO A,CLZA ;SET TO IGNORE LEADING ZERO RET CLZA: DB '0' RESYSR: LDK A,'Z'-40H CALL COUT JMP BOOT PAGE PRINT: ;PRINT A MESSAGE ;ENTRY ;EXIT ;NONE PROC ;CHECK FO R END LD A,[HL] ;CHECK FOR END ORA A RZ ;RETURN IF DONE ;PRINT CHARACTER CALL COUT INC HL JMP PRINT PAGE COUT: ;OUTPUT ONE CHARACTER ;ENTRY ;A = CHARACTER ;EXIT ;NONE PROC PUSH BC PUSH DE PUSH HL MOV E,A LDK C,06H CALL BDOS POP HL POP DE POP BC RET PAGE CIN: ;CHECK FOR A CHARACTER AND GET IT IF IT IS THERE ;ENTRY ;NONE ;EXIT ;A = CHARACTER PROC PUSH BC PUSH DE PUSH HL :1: LDK E,0FFH LDK C,06H CALL BDOS OR A JZ :1 ;LOOP IF NO CHARACTER POP HL POP DE POP BC RET PAGE SETCUR: ;SET CURSOR POSITION ;ENTRY ;B = DECIMAL LINE NUMBER ;C = DECIMAL COLUMM NUMBER ;EXIT ;NONE PROC LDK A,ESC CALL COUT LDK A,'=' CALL COUT MOV A,B ;GET DECIAML LINE NUMBER ADI 32 CALL COUT MOV A,C ;GET DECIMAL COLUMM NUMBER ADI 32 CALL COUT RET PAGE BEEP: ;OUTPUT BEEP ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,BEL CALL COUT RET PAGE CKQUIT: ;FIND OUT IF USER WANTS TO QUIT ;ENTRY ;HL = ERROR MESSAGE ADDRESS ;EXIT ;NONE PROC CALL PRINT ;PRINT ERROR MESSAGE CALL BEEP LDK B,23 ;LINE 23 LDK C,1 CALL SETCUR LDK HL,CEOLIN ;CLEAR LINE CALL PRINT LDK HL,EROP1 ;RETRY MESSAGE CALL PRINT CALL CIN CMP ESC RET PAGE ;DOUBLE DENSITY PARAMETERS DDPARM: DW DLIFMT ;LIFMT FOR DOUBLE DENSITY DW DOUBTO ;TRKOFS FOR DD DW DFORDAT ;FORDAT FOR DD DB 0 ;OSBORNE FORMAT ;SINGLE DENSITY PARAMETERS SDPARM: DW SLIFMT ;LIFMT FOR SINGLE DENSITY DW SINGTO ;TRKOFS FOR SD DW SFORDAT ;FORDAT FOR SD DB 0 ;OSBORNE FORMAT ;PARAMETERS STORED HERE PARM: LIFMT: DS 2 TRKOFS: DS 2 FORDAT: DS 2 OSBFMT: DS 1 ;OSBFMT = 0 IF OSBORNE FORMAT, OTHERWISE 0FFH NUMSEC: DS 1 ;# OF SECTORS/TRACK TRKLEN: DS 2 ;# OF BYTES/TRACK NUMTRK: DS 1 ;# OF TRACKS/BLOCK NUMBLK: DS 1 ;# OF BLOCKS/DISK SECTOR: DB 0 ;FOR FORMAT SOURCE: DB 0 ;SOURCE DRIVE FOR COPY TRACK: DB 0 ;ACTIVE LOGICAL TRACK BLOCK: DB 0 ;ACTIVE BLOCK NUMBER CEOLIN: DB ESC,'T',0 ;CLEAR TO END OF LINE CEOPAG: DB ESC,'Y',0 ;CLEAR TO END OF PAGE CLESCR: DB ESC,'=',8+32,1+32,ESC,'Y',0 ;CLEAR SCREEN IMSG: DB 'Z'-40H DB ESC,'=',0+32,27+32,ESC,'j ENCORE Disk Utility ',ESC,'k' DB ESC,'=',1+32,16+32,'Rev X3.094 ' DB ESC,'g' ;ON GRAPHIC MODE DB 'S'-40H ;COPYWRITE SYMBOL DB ESC,'G' ;OFF GRAPHIC MODE DB ' 1983 OSBORNE SOFTWARE TEST ONLY' DB 0 IMSG1: DB ESC,'=',4+32,1+32,ESC,'Y',0 MSCR: DB ESC,'=',8+32,4+32,'C ',ESC,'j COPY DISKETTES ',ESC,'k' DB ESC,'=',10+32,4+32,'F ',ESC,'j FORMAT DISKETTES ',ESC,'k' DB ESC,'=',23+32,4+32,ESC,'T','Press C, F, or RETURN to exit to CP/M.' DB 0 KPYSCR: DB ESC,'=',8+32,4+32,'A ',ESC,'j COPY DISKETTES FROM A TO B ',ESC,'k' DB ESC,'=',10+32,4+32,'B ',ESC,'j COPY DISKETTES FROM B TO A ',ESC,'k' DB ESC,'=',23+32,4+32,'Press A, B, or RETURN for previous menu.' DB 0 KPYMS1: DB ESC,'=',8+32,4+32,ESC,'Y',ESC,'j' DB ' COPYING DISKETTE FROM A TO B ',ESC,'k' DB 0 KPYMS2: DB ESC,'=',8+32,4+32,ESC,'Y',ESC,'j' DB ' COPYING DISKETTE FROM B TO A ',ESC,'k' DB 0 FMTSCR: DB ESC,'=',8+32,4+32 DB 'A ',ESC,'j FORMAT DISKETTE IN DRIVE A ',ESC,'k' DB ESC,'=',10+32,4+32 DB 'B ',ESC,'j FORMAT DISKETTE IN DRIVE B ',ESC,'k' DB ESC,'=',23+32,4+32,'Press A, B, or RETURN for previous menu.' DB 0 FMTMS1: DB ESC,'=',8+32,4+32,ESC,'j FORMATTING DISKETTE IN DRIVE A WITH DOUBLE DENSITY.',ESC,'k' DB 0 FMTMS2: DB ESC,'=',8+32,4+32,ESC,'j FORMATTING DISKETTE IN DRIVE B WITH DOUBLE DENSITY.',ESC,'k' DB 0 FMES: DB ESC,'=',20+32,4+32,ESC,'Y' DB ESC,'=',23+32,4+32 DB 'Place diskette to be formatted in drive ' DB ESC,'j ' FDISK: DB ' ' DB ESC,'k' DB ' then press RETURN when ready.' DB 0 PFORMAT: DB ESC,'=',10+32,4+32,'Tracks:' DB ESC,'=',12+32,4+32,'0 1 2 3 ' DB ESC,'=',13+32,4+32,'0123456789012345678901234567890123456789' DB 0 CRLF5S: DB ESC,'=',14+32,4+32 DB 0 GDFMT: DB ESC,'=',20+32,4+32,'FORMAT completed successfully.' DB 0 BDFMT: DB ESC,'=',20+32,4+32,ESC,'j FORMAT ERROR ',ESC,'k' DB 0 BDFMT1: DB ESC,'=',20+32,4+32,ESC,'j WRITE PROTECTED ',ESC,'k' DB 0 KMESS: DB ESC,'=',20+32,1+32,ESC,'Y' DB ESC,'=',21+32,4+32 DB 'Place SOURCE diskette in drive ' DB ESC,'j ' SDSK: DB ' ' DB ESC,'k' DB ESC,'=',22+32,4+32,'DESTINATION diskette in drive ' DB ESC,'j ' DDSK: DB ' ' DB ESC,'k' DB ESC,'=',23+32,4+32,'then press RETURN.' DB 0 TKMSG: DB 'Track ' TKMSG1: DB ' ' DB 0 TKMSG2: DB ESC,'=',14+32,14+32,'Reading ',0 TKMSG3: DB ESC,'=',14+32,14+32,'Writing ',0 GMES: DB ESC,'=',20+32,4+32,'COPY completed successfully.' DB 0 BMES: DB ESC,'=',20+32,4+32,ESC,'Y' DB ESC,'j COPY ERROR ',ESC,'k' DB 0 EROP1: DB ESC,'=',23+32,4+32,'Press ESC to exit to CP/M or any other key to retry.',0 NOTOSB: DB ESC,'=',20+32,4+32 DB 'Source diskette is not formatted with a standard Osborne format.' DB 0 BADDEN: DB ESC,'=',20+32,4+32 DB 'Source and  destination diskettes don''t have matching formats.' DB 0 PAGE SFORDAT: ;FORMAT DATA FOR IBM 3740. *NOTE* ;NO INDEX MARK IS USED ; **** GAP 1 **** SFMTSD: ECHO 17 ! DB 0FFH ENDM ECHO 6 ! DB 0 ENDM DB 0FEH ;ID ADDRESS MARK DB 0 ;TRACK SINGTO = *-SFORDAT DB 0 ;SIDE SFSECN: DB 1 ;SECTOR DB 1 DB 0F7H ;CRC ; **** GAP 2 **** ECHO 11 ! DB 0FFH ENDM ECHO 6 ! DB 0 ENDM DB 0FBH ;DATA ADDRESS MARK ; **** DATA **** ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM DB 0F7H ;CRC SLIFMT = *-SFORDAT PAGE DFORDAT: ;DOUBLE DENSITY FORMAT DATA FOR IBM 3740. *NOTE* ;NO INDEX MARK IS USED ; **** GAP 1 **** DFMTSD: ECHO 100 ! DB 04EH ENDM ECHO 12 ! DB 0 ENDM DB 0F5H,0F5H,0F5H DB 0FEH ;ID ADDRESS MARK DB 0 ;TRACK DOUBTO = *-DFORDAT DB 0 ;SIDE DFSECN: DB 1 ;SECTOR DB 3 ;SECTOR LENTH DB 0F7H ;CRC ; **** GAP 2 **** ECHO 22 ! DB 04EH ENDM ECHO 12 ! DB 0 ENDM DB 0F5H,0F5H,0F5H DB 0FBH ;DATA ADDRESS MARK ; **** DATA **** ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM ECHO 128 DB FMTCHR ENDM DB 0F7H ;CRC DLIFMT = *-DFORDAT ERCOUNT: DB 0 ;ERROR COUNTER LBUFF1: DW 0 ;HOLD FBA IN BUFF1 DS 50*2 STACK: DS 0 ;STACK HERE BUFFS: DS 7000 ;SAVE BUFFER (MUST BE 7000 PER CODE) BUFF: DS 7000 ;VERIFY BUFFER(AT LEAST 5120 BYTES) BUFF1: = * ;COPY BUFFER TO TOP OF TPA ; ENDX FOR IBM 3740. *NOTE* ;NO INDEX MARK IS USED ; **** GAP 1 **** DFMTSD: ECHO 100 ! DB 04EH ENDM ECHO 12 ! DB 0 ENDM DB 0F5H,0F5H,0F5H DB 0FEH ;ID ADDRESS MARK DB 0 ;TRACK DOUBTO = *-DFORDAT DB 0 ;SIDE DFSECN: DB 1 ;SECTOR DB 3 ;SECTOR LENTH DB 0F7H ;CRC ; **** GAP 2 **** ECHO 22 ! DB 04EH ENDM ECHO 12 ! DB 0 ENDM DB1!!!@ _CʟF0!!&/ 2N A2! % LHPu!! 6! :yWƒ! T7!!6![/ 2Z 2 A22!. % ¿!:Z A!P!x ͣ!! ß! :W! T7!!ß% _AB/%@> 2x22:r ƒxƒ!s{x ƒ!z͍ͫ:g.,:??Gʧ)"ɯ*HR[Rһx2:G>( y2:!!3 N:W:2::z2:2!z!q >2 ! 2y2eI-}U͌>*h@c>W2y>E2y:<(;:y:N A!ʈ!I-CC:G >222 :G:<¬:22:(!:<! ! *":G:2: #2:(C!:<$! ! ͏x>2*":G!I-":GKI-*ͨ:=[:͐eI-}ҷ@>Eʳ>W2͜ ͐͌͜G:=G:OG:2* ![:G Generation Procedure for ENCORE Disk Utility(VCOPY) ----------------------------------------------------- 4/4/83 A. The following three files are needed on the current drive: 1. ACT.COM - Assembler file 2. LOAD.COM - Link file 3. VCOPY.ASM - Source file B. Type "ACT VCOPY ". This command will generate following file: VCOPY.HEX - Hex format file C. Type "LOAD VCOPY". This command will generate following file: VCOPY.COM - CP/M executable file H"K*>ɯK-*K>2:=G*K!4:~UwvXwK-B"I-!J-[:G[:w9N#F#"3X!I-XI-!xʼ# ʫ_}0>02>0]T< =kbG:> x>20>~#_(>>=x y >N7!! %ɠu 0 N#F#"TY=(!Y= ;j ENCORE Disk Utility k=!0Rev X3.094 gG 1983 OSBORNE SOFTWARE TEST ONLY=$!Y=($C j COPY DISKETTES k=*$F j FORMAT DISKETTES k=7$TPress C, F, or RETURN to exit to CP/M.=($A j COPY DISKETTES FROM A TO B k=*$B j COPY DISKETTES FROM B TO A k=7$Press A, B, or RETURN for previous menu.=($Yj COPYING DISKETTE FROM A TO B k=($Yj COPYING DISKETTE FROM B TO A k=($A j FORMAT DISKETTE IN DRIVE A k=*$B j FORMAT DISKETTE IN DRIVE B k=7$Press A, B, or RETURN for previous menu.=($j FORMATTING DISKETTE IN DRIVE A WITH DOUBLE DENSITY.k=($j FORMATTING DISKETTE IN DRIVE  B WITH DOUBLE DENSITY.k=4$Y=7$Place diskette to be formatted in drive j k then press RETURN when ready.=*$Tracks:=,$0 1 2 3 =-$0123456789012345678901234567890123456789=.$=4$FORMAT completed successfully.=4$j FORMAT ERROR k=4$j WRITE PROTECTED k=4!Y=5$Place SOURCE diskette in drive j k=6$DESTINATION diskette in drive j k=7$then press RETURN.Track =..Reading =..Writing =4$COPY completed successfully.=4$Yj COPY ERROR k=7$Press ESC to exit to CP/M or any other key to retry.=4$Source diskette is not formatted with a standard Osborne format.=4$Source and destination diskettes don't have matching formats.NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !"#$%&'