IMD 1.17: 24/12/2010 11:57:25 v bios 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 VBIOS0 ASMVBIOS1 ASMVBIOS ASM !"VBIOS ASM#$%&'()*+,-./012VBIOS ASM>3456789:VBIOSG DOC;ACT 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  CCP: = 0H LINK VBIOS.ASM  CCP: = 100H LINK VBIOS.ASM ;.Date: 4/4/83 ;.Author: DEB & RWC ;.Title: ENCORE CP/M 2.2 CBIOS Rev X3.094 ;.Comments: ALPHA ; +---------------+ ; | | ; | ENCORE CBIOS | ; | | ; +---------------+ ;X.0 FIXED BUG IN "FILL" BY ADDING CPMSEC TO HOLD THE CPM LOGICAL SECTOR PRIOR TO A READ OF WRITE ;X.1 ADDED SERIAL I/O (NON INTERRUPT) : deb ;X.2 ADDED CENTRONICS PRINTER : deb ;X.3 REMOVED IEEE : deb ; Changed location of buffer area for SETUP : deb ;X.4 REleaved stack usage in CHKSEL : deb ; Made SERIAL MODE byte soft : deb ;X.5 Changed CNST to call the rom : deb ; Removed LKEY : deb ;X.6 Added SISTAT (serial input status) to jump table : deb ; ROMJMP dosent setup the stack anymore : deb ; Made CRTOUT (console output) a direct rom call, COUT : deb ; Added CI & SKEY as direct rom calls : deb ; Made RWBOOT a direct rom call : deb ; Made SENDEN a direct rom call : deb ; Made RSEC & WSEC direct rom calls : deb ; Bios no longer uses ROMJMP :deb ; Fixed bad comment on DDXLTS : deb ;X.7 Made IMSG message ALWAYS come on : deb ; Shortened IMSG : deb ; Changed name to EXPRESS : deb ; Took out ESCH : deb ; Changed function key DEFINITIONS : deb ;X.8 Changed interface to rom : deb ; Made MOVCPM : DEB 3/24/83 ;X.9 Changed KEYINP to screen any key above 8Dh : deb ; Made CNST faster : deb ; Reorganized the disk section a little : deb ; Made CHKSEL a little faster : deb ; Added COPYRIGHT message : deb ; Made CONST go a little faster : deb ; Took out FINAL routine : deb ; Took the call to FLUSH out of the home routine : deb ; WBOOT calls FLUSH : deb ; Fixed bug if FILL : deb ; Changed error return in WRITE to return with HSTWRT reset : deb ; Made CONST go a little faster : deb ; Made CONOUT go a little faster : deb ; Made SELDSK go a little faster : deb ; Added SEC_TRK to SELDSK & WRITE to hold the number of sectors per track : deb ; Put the call to FLUSH back in the HOME routine : deb ; Final before ALPHA : deb ; Fixed IMSG for MOVCPM program : deb ; Made MOVCPM : DEB 4/1/83 ;X3.094 ALPHA : DEB MSIZE: = 56 ;CPM MEMORY SIZE ;THESE ARE NOT USED IN FINAL VERSION ;CCP: = 0BF00H ;location of ccp ;CCP = 100H ;CCP = 0H BIOS: = ccp+1600h ;LOCATION OF BIOS BDOS: = ccp+806h ;LOCATION OF BDOS MSG 'CCP = ',CCP MSG 'BDOS = ',BDOS-6 MSG 'BIOS = ',BIOS MSG 'DDT R = ',1F80H-BIOS LF = 0Ah ;^J = Line Feed CR = 0Dh ;^M = Carriage Return IOBYTE = 3 ;ADDRESS OF IOBYTE CDISK = 4 ;Current logged-in CPM disk DBUF = 80h ;Default disk buffer ;CP/M to host disk constants FPYSIB: = 2048/128 ;Sectors in floppy disk block (OCC single density block size = 2K) FPYDIB: = 1024/128 ;Sectors in floppy disk block (OCC double density block size = 1K) ;CP/M disk control block equates which define the disk types and maximum storage capability of each disk type. DSKS1: = 5 ;Single density ( 256), single sided. DSKD1: = 0Ch ;Double density (1024), single sided. XEROX: = 1 ;Single density ( 128), single sided. IBM: = 8 ;Double density ( 512), single sided. DEC: = 8 S1DSM: = ((40-3)*2*10)/FPYSIB D1DSM: = ((40-3)*8*5 )/FPYDIB XXDSM: = ((40-3)*1*18)/FPYDIB IBMDSM: = ((40-1)*4*8 )/FPYDIB DECDSM: = ((40-2)*4*9 )/FPYDIB ;BDOS constants on entry to write :WRALL: = 0 ;write to allocated WRDIR: = 1 ;write to directory WRUAL: = 2 ;write to unallocated PAGE ;TRANSFER RAM MEMORY LOCATIONS SEQ: = 0EFF4H ;(2) COUNTER (USED BY BIOS) 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 VIDBUF: = 0FE00H ;FBA OF BUFFER IN VIDEO MEMORY ;ROM JUMP VECTORS ROMVEC = 0F100h ;Start of rom vector RWBOOT: = 0F100H ;WARM BOOT SKEY: = 0F103H ;KEYBOARD STATUS CI: = 0F106H ;CONSOLE INPUT COUT: = 0F109H ;CONSOLE OUTPUT RSEC: = 0F10FH ;READ A SECTOR WSEC: = 0F112H ;WRITE A SECTOR SENDEN: = 0F115H ;sense DENSITY ROUTINE PAGE ;8251 CONSTANCES SI.MRST = 0100_0000B ;Master reset in command mode SI.MOD = 11_10_11_10B ;MODE BYTE : 2 STOP BITS_PAR. EVEN/DISABLED_8 DATA BITS_16x SI.COM = 0010_0111B ;COMMAND BYTE SI.RRDY = 0000_0010B ;Receiver ready SI.TRDY = 0000_0001B ;Transmit ready ;8155 CONSTANCES ;CENTRONICS PP.ORDY = 0000_0100B ;1=BUSY, 0=READY FOR OUTPUT PP.SSTRB = 1111_1101B ;SET STROBE PP.CSTRB = 1111_1111B ;CLEAR STROBE ;I/O 8251 PORTS (registerS) SSTAT: = 31H ;STATUS & COMMAND register SDATA: = 30H ;DATA R/W register ;I/O 8155 PORTS PREGS: = 21H ;8155 register SELECTION PORT PDATA: = 28H ;8155 DATA TRANSFER PORT (OUTPUT) ;PADATA = 10H ;INPUT DATA FROM 8155 PORT A (DATA PORT) PBDATA: = 18H ;INPUT DATA FROM 8155 PORT B (STATUS PORT) PAGE ;Macro for generating Control Blocks for disk drives ;The format of these disk control blocks are as follows: ; 16 bits = -> translation table. ; 48 bits = Work area for CP/M. ; 16 bits = -> DIRBUF. ; 16 bits = -> Parameter block. ; 16 bits = -> check vector. ; 16 bits = -> allocation vector. NDSK: SET 0 ;Number of disk drives NOFDD: SET 0 ;Number of floppy disk drives ALVSZ: SET 0 ;Allocation vector size CSVSZ: SET 0 ;Check vector size DPHGEN MACRO TYPE,XLATE,DIRBUF,DPBADR NDSK: SET NDSK+1 DW %2 DW 0,0,0 DW %3 DW %4 DW CSV+CSVSZ DW ALV+ALVSZ NOFDD: SET NOFDD+1 CSVSZ: SET CSVSZ+(64/4) ALVSZ: SET ALVSZ+((D1DSM+7)/8) ENDM ;Macro for generating the Disk Parameter Blocks. ;Disk type definition blocks for each particular mode. ;The format of these areas is as follow: ; 8 bit = disk type code ; 16 bit = Sectors per track ; 8 bit = Block shift ; 8 bit = BS mask ; 8 bit = Extent mask ; 16 bit = Disk size/1024 - 1. ; 16 bit = Directory size. ; 16 bit = Allocation for directory. ; 16 bit = check area size. ; 16 bit = offset to first track. DPBGEN MACRO TYPE,SPT,BSH,BSM,EXM,DSM,DIRSIZ,ALVMSK,OFFSET DB %1 DW %2 DB %3,%4,%5 DW %6-1,%7-1,REV (%8) DW (%7+3)/4 DW %9 ENDM PAGE ;The following jump table defines the entry points into the CBIOS for use by CP/M and other external ; routines, therfore the order of these jump cannot be modified. The location of these jumps can only ; be modified by 400h locations, which is a restriction of MOVCPM. ORG BIOS JMP CBOOT ;Cold boot JMP WBOOT ;Warm boot JMP CONST ;Console status (input) JMP CONIN ;Console input JMP CONOUT ;Console output JMP LIST ;List output JMP PUNCH ;Punch output JMP READER ;Reader input JMP HOME ;Set track to zero JMP SELDSK ;Select disk unit JMP SETTRK ;Set track JMP SETSEC ;Set sector JMP SETDMA ;Set Disk Memory Address JMP READ ;Read from disk JMP WRITE ;Write onto disk JMP LISTST ;Return LST: device status JMP SECTRN ;Sector translation routine ;Extensions JMP SISTAT ;SERIAL IMPUT STATUS JMP ROMJMP ;JMP TO ROM PAGE ;This area is reserved data storage area for the set-up program to install printer drivers, function ; keys, auto boot command, iobyte value, and auto horizontal scroll flag IOBITE: DB 0 ;default to serial printer=40h ; parallel printer=80h PRNTER: DB 00h ;default to standard serial=0 ;Qume ETX/ACK =1 ;Diablo XON/XOFF =2 MODE: DB SI.MOD ;SERIAL PORT MODE BYTE (8251) BRATE: DB 16 ;default baud rate IS 19200 DB 0 ;UNUSED XLTBL: DW CNTRL0 ;Fixed length table DW CNTRL1 ;contains pointers DW CNTRL2 ;to strings DW CNTRL3 ;to decode DW CNTRL4 ;function keys DW CNTRL5 DW CNTRL6 DW CNTRL7 DW CNTRL8 DW CNTRL9 DW UP DW RIGHT DW DOWN DW LEFT DW EOTBL ;end of table address DB 0 ;UNUSED PINTFG: DB 0 ;Flag indicates if printer has been initialized DB 0 ;Length of string DS 16 ;Printer initialization string ACMD: DB 1 ;auto command = 0 ignore auto boot ; = 1 auto on cold boot ; = 2 auto on warm boot ; = 3 auto on both CAUTO: DB CAUTOL ;length of auto command here DB 'AUTOST ' ;auto command goes here CAUTOL: = *-CAUTO-1 CNTRL0: DB '0' ;Variable length table is placed here by set-up program, with xlttbl CNTRL1: DB '1' ;pointing to the entries CNTRL2: DB '2' CNTRL3: DB '3' CNTRL4: DB '4' CNTRL5: DB '5' CNTRL6: DB '6' CNTRL7: DB '7' CNTRL8: DB '8' CNTRL9: DB '9' UP: DB 'K'-40h ;Default values RIGHT: DB 'L'-40h ;for the cursor DOWN: DB 'J'-40h ;keys are standard LEFT: DB 'H'-40h ;values for CP/M EOTBL: = * ORG BIOS+256 ;space reseverd for function key decoding PAGE ;Control Blocks for disk drives DPBASE: DPHGEN DSKD1,DDXLTS,DIRBUF,DPBD1+1 ;Drive A: DPHGEN DSKD1,DDXLTS,DIRBUF,DPBD1+1 ;Drive B: PAGE XTAB: ;Translation table addresses DW DDXLTS ;Double density Osborne translation table address DW XLTS ;Single density Osborne DW XXXLTS ;Xerox translation table address DW IBMXLT ;IBM translation table address DW DECXLT ;DEC translation table address DW XTRXLT ;User defined translation table address DDXLTS: = 0 ;Translation table for DOUBLE DENSITY OSBORNE 1 to 1 XLTS: ;Translation table 2 to 1 DB 0, 1, 4, 5, 8, 9, 12,13, 16,17 DB 2, 3, 6, 7, 10,11, 14,15, 18,19 XXXLTS: ;XEROX TRANSLATION TABLE 5 to 1 DB 0, 5, 10, 15 DB 2, 7, 12, 17 DB 4, 9, 14 DB 1, 6, 11, 16 DB 3, 8, 13 IBMXLT: = 0 ;IBM TRANSLATION TABLE, No translation 1 to 1 DECXLT: ;DEC TRANSLATION TABLE 2 to 1 DB 0, 1, 2, 3, 8, 9,10,11, 16,17,18,19, 24,25,26,27, 32,33,34,35 DB 4, 5, 6, 7, 12,13,14,15, 20,21,22,23, 28,29,30,31 XTRXLT: DS 40 ;Space for user defined expansion PAGE PROC ;Disk type definition blocks for each particular mode. DPBSTART: ;Start of Disk parameter blocks, used by select disk routine DPBD1: ;Osborne Double density, single sided DPBGEN DSKD1,8*5 ,3, 7,0,D1DSM ,64,1100000000000000B,3 :DPBS1: ;Osborne Single density, single sided. DPBGEN DSKS1,2*10,4,15,1,S1DSM ,64,1000000000000000B,3 :DPBX0: DPBGEN XEROX,1*18,3, 7,0,XXDSM ,32,1000000000000000B,3 :DPBIBM: DPBGEN IBM ,4*8 ,3, 7,0,IBMDSM,64,1100000000000000B,1 :DPBDEC: DPBGEN DEC ,4*9 ,3, 7,0,DECDSM,64,1100000000000000B,2 :DPBXTR: DS 16 NUMDPB: = (*-DPBSTART)/10H PAGE ROMJMP: ;JMP TO ROM ;ENTRY ;E = LOW ORDER BYTE OF ROM JUMP ADDRESS PROC LDK D,high (ROMVEC) ;SET HIGH ORDER BYTE OF ROM JMP TABLE PUSH IY ;Save user IY ;CALL ROM CALL GOROM ;Go to ROM address (DE) and return to next instruction POP IY ;Restore user IY RET PAGE GOROM: ;This routine is used to simulate a CALL (DE) instruction ;ENTRY ;DE = ADDRESS TO CALL IN ROM ;NOTE ;USES IY PROC PUSH DE ;ROM jump address to IY POP IY JMP [IY] ;Go to ROM, ROM will RET to next instruction PAGE ;The CBOOT entry point gets control from the cold start loader and is responsible for the basic system ; initialization. This includes outputting a sign-on message and initializing the following page zero locations: ; 0,1,2: Set to the warmstart jump vector. ; 3: Set to the initial  IOBYTE value. ; 4: Default and logged on drive. ; 5,6,7: Set to a jump to BDOS. CBOOT: ;COLD BOOT FOR CPM LDK SP,CCP LD A,IOBITE ;get iobyte value STO A,IOBYTE ;Set I/O byte to default XRA A STO A,CDISK ;Set current drive to A INC A JR BCCP ;Do CP/M PAGE ;The WBOOT entry point gets control when a warm start occurs, a ^C from the console, a jump to BDOS ; (function 0), or a jump to location zero. The WBOOT routine reads the CCP and BDOS from the appropriate ; disk sectors. WBOOT must also re-initialize locations 0,1,2 and 5,6,7. The WBOOT routines exits with the ; C register set to the appropriate drive selection value. The exit address is to the CCP routine. WBOOT: ;WARM BOOT FOR CPM LDK SP,CCP CALL FLUSH ;CLEAN BUFFER CALL RWBOOT ;WARM BOOT IN ROM MVI A,2 ;indicate warm boot ; JMP BCCP ;FALL THROUGH TO BCCP PAGE BCCP: ;PERFORM BOOT FOR CPM ;ENTRY ;A = 01, if cold boot ;A = 02, if warm boot PROC PUSH AF ;Save entry ;RESET I/O CALL SIRST ;SETUP SERIAL I/O ;CLEAR BUFFERS LDK HL,CLRSTR STO 0,[HL] ;CLEAR 1ST BYTE LDK BC,CLRLNT ;length LDK DE,CLRSTR+1 LDIR ;OVER LAPPING MOVE(FILL) LDK A,0FFH STO A,UNASEC ;Set default data transfer address LDK BC,DBUF CALL SETDMA LDK HL,HSTBUF STO HL,DMADR ;set ROM DMA address ;Set-up low core pointer cells LDK A,0C3h ;Store jumps in low memory STO A,0 ;LOC 0 STO A,5 ;LOC 5 LDK HL,BIOS+3 ;LOC 0+1 STO HL,1 LDK HL,BDOS ;LOC 5+1 STO HL,6 ;PROCESS AUTOST LDK HL,CAUTO POP BC ;cold/warm indicator in b LDK DE,3 ;SET JMP IN CCP FOR NON COMMAND LINE LD A,ACMD AND B JRZ :1 ;CONT IF NO AUTOST REQUESTED LD A,[HL] ORA A JRZ :1 ;CONT IF AUTOST LENGTH IS 0 ;MOVE AUTOST COMMAND TO COMMAND LINE IN CCP PUSH BC ;HL = SOURCE (FIRST BYTE IS LENGTH) LDK DE,CCP+7 ;DE = DESTINATION LDK B,0 MOV C,A ;BC = LENGTH LDIR POP BC LDK DE,0 ;SET JMP IN CCP FOR COMMAND LINE ;CHECK FOR COLD BOOT :1: LDK A,2 CMP B JRZ :2 ;DON'T PRINT MESSAGE IF WBOOT ;PRINT SIGN-ON MESSAGE IF COLD BOOT PUSH DE LDK DE,IMSG CALL PRINT POP DE ;JMP TO CCP ;DE = OFFSET TO JMP :2: LDK HL,CCP ADD HL,DE LD A,CDISK MOV C,A JMP [HL] PAGE ;SIGN ON MESSAGE IMSG: DB IMSGL ;Length of signon message DB 'Z'-40h DB 'ENCORE' DB CR,LF DB MSIZE/10+'0',MSIZE mod 10 + '0' DB 'k CP/M vers 2.2' ;FOR MOVCPM (DON'T CHANGE!) DB ' Rev X3.094',CR,LF DB 1BH,'g' ;ON GRAPHIC MODE DB 'S'-40H ;COPYWRITE SYMBOL DB 1BH,'G' ;OFF GRAPHIC MODE DB ' 1983 OSBORNE SOFTWARE TEST ONLY' DB CR,LF IMSGL: = *-IMSG-1 PAGE HOME: ;This routine sets the track number to zero. CALL FLUSH ;FLUSH BUFFER XRA A STO A,HSTACT ;MAKE BUFFER INACTIVE STO A,UNACNT ;Clear sector count STO A,SEKTRK ;CLEAR TRACK TO 0 RET PAGE SELDSK: ;Selects disk drive for next transfer. ;ENTRY ;C = disk selection value (0..15). ;E and 1 = 0, first call for this disk. ;EXIT ;HL = 0, if drive not selectable. ;HL = DPH address if drive is selected. PROC PUSH IX ;Save user IX MOV A,C CPI NDSK JNC :2 ;If invalid drive number ;SETUP THE DPBASE INTO SAVDPH ;THIS ASSUMES A TWO DRIVE SYSTEM STO A,SEKDSK ;SAVE DRIVE NUMBER (0-1) LDK HL,DPBASE ;DRIVE A DPH ORA A JZ :4 ;IF THIS IS DRIVE A LDK HL,DPBASE + 16 ;DRIVE B DPH :4: STO HL,SAVDPH CALL CHKSEL ;Check to see if density needs to be determined JNZ :3 ;Unable to determine density, error return ;GET DISK PERM. BLOCK LD HL,SAVDPH PUSH HL ;HL=DPH LDK DE,10 ;form dpb address ADD HL,DE ;to get type LD E,[HL] INC HL LD D,[HL] ;dpb address in DE ;SET SEC_TRK LD A,[DE] ;GET STO A,SEC_TRK ;SET ;SET SEKTRP DEC DE LD A,[DE] ;get disk type STO A,SEKTYP ;and store value LD HL,SEQ ;Get current sequence count STO L,[IX+0] STO H,[IX+1] ;Store seq # in LASTA or LASTB POP HL ;HL=DPH POP IX  ;Restore user IX RET ;RETURN ;Select disk error handling :3: LDK DE,FORERR ANI 1 ;Is diskette unformatted? JRNZ :1 ;Yes LDK DE,DENERR ;No, get density error message :1: LD A,SEKDSK ADD A,'A' STO A,DRV ;Indicate drive in message STO A,DRV1 CALL PRINT ;Print appropriate message on console ;SELECT ERROR :2: POP IX ;Restore user IX ;IF DEFAULT DRIVE NOT IN ERROR RETURN TO DEFAULT LDK HL,0 LD A,CDISK ANI 0000_1111B ;STRIP USER NUMBER SUB C RNZ ;If default drive not in error ;IF DEFAULT DRIVE 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 dri ve sequence number ;Z status bit set, good return ;Z status bit clear, error return PROC PUSH BC LDK IX,LASTA ;Get last count for selected drive MOV A,C ;Current drive to A - reg ORA A ;Is this drive A? JRZ :1 ;Yes, check sequence number INC IX ;No, form address for B INC IX :1: LD C,[IX+0] ;Get last sequence number for this drive LD B,[IX+1] LD HL,SEQ ;Get current sequence number SBC HL,BC ;Compare seq #'s POP BC BIT 0,E ;First call for this disk? JRZ GDEN ;Yes, fill in DPB MOV A,H ;No, check elapsed time ORA A ;elapsed time < 4 sec RZ ;Yes, good return CPI 02 JRNC GDEN ;IF 2 OR GREATER MOV A,L CPI 0A0H ;elapsed time > 6 sec JRNC GDEN ;YES XRA A RET PAGE GDEN: ;Fills in DPH with appropriate values after determining type and # of sectors ;ENTRY SEKDSK = DISK TO SELECT ;EXIT A = 0, ZERO FLAG SET .... GOOD RETURN ; A = -1, ZERO FLAG CLEAR .. ERROR RETURN ;USES ALL REGISTERS PROC CALL GETDEN JRNZ :5 ;Error, unformatted disk MOV A,B ;# of physical sectors into A BIT 2,C ;bits 2 & 3 of reg C indicate sector size JRZ :1 ;convert # psectors into # 128 byte sectors SLA A ;A=A*2 :1: BIT 3,C JRZ :2 SLA A SLA A ;A=A*4 or A=A*8 :2: PUSH IX ;SAVE IX LDK B,NUMDPB ;Number of DPB's to check for LDK HL,DPBSTART+1 ;get dpb address of # logical sectors LDK DE,16 ;next address LDK IX,XTAB ;first translation table address :LOOP: CMP [HL] ;compare # of logical sectors JRZ :3 ;match check for same type :LP1: INC IX ;no match increment translation table address INC IX ADD HL,DE ;also get next dpb DJNZ :LOOP ;have we checked all dbp's no go to loop JR :6 ;Yes, no match error return :3: PUSH AF ;here on match of # of logical sectors SHLD DPB ;save current dpb address DEC HL ;now check type MOV A,C ;value of type returned from getden CMP [HL] ;compare to dpb type JRZ :4 ;type is ok POP AF ;number of physical sectors into A reg INC HL ;type does not match JR :LP1 ;check next dpb :4: POP AF ;Restore stack LD HL,SAVDPH ;Get header address LD A,[IX+0] ;Get translation table address STO A,[HL] ;Store address in header INC HL LD A,[IX+1] STO A,[HL] LDK DE,9 ;Form address in header for DPB ADD HL,DE LDK IX,DPB ;Store DPB address in header LD A,[IX+0] STO A,[HL] INX HL LD A,[IX+1] STO A,[HL] XRA A ;Indicate good return :RET: POP IX RET ;Error return section :5: MVI A,1 ;Indicate unformatted disk Z-flag = clear, A = 1 RET :6: ORI 02 ;Indicate unrecognizable disk Z-flag = clear, A = 2 JR :RET PAGE GETDEN: ;Gets density of selected disk ;ENTRY ;SEKDSK = Current drive ;EXIT ;C = TYPE ; 7 6 5 4 3 2 1 0 ; | | | | | | | | ; Undef = 0 <---------+---+---+---+ | | | | ; Bytes/sector <----------------------+---+ | | ; Sides <-------------------------------------+ | ; Density <---------------------------------------+ ;B = # of physical sectors per track ;Z-bit = set IF good return ;Z-bit = RESET IF error return PROC ;SAVE VALUES IN "SDISK" & "SAVTYP" LD BC,SAVTYP ;C = SAVTYP LD A,SDISK MOV B,A ;B = SDISK PUSH BC ;SAVE ;SET DISK LD A,SEKDSK ;Disk to be select STO A,SDISK ;in SDISK (parameter to SENDEN) CALL SENDEN ;PUT "SAVTYP" IN REG C LD A,SAVTYP ;Exit TYPE parameter MOV C,A ;into C - Reg ;Restore caller's SAVTYP & SDISK POP DE ;RESTORE MOV A,D STO A,SDISK MOV A,E STO A,SAVTYP RET ;RETURN, flagS set by SENDEN PAGE SETTRK: ;Sets track number. The track number is saved for later use during a disk transfer operation. ;ENTRY ;BC = track number. ;TRACKS ARE < 255 SO USE ONLY C ;EXIT ;NONE MOV A,C STO A,SEKTRK ;Set track LD A,UNATRK ;GET ALLOCATED TRACK ORA C RZ ;RETURN If same track ;Clear unallocated block count XRA A ;A = 0 STO A,UNACNT ;Clear unallocated block count RET SETSEC: ;Set the sector for later use in the disk transfer. No actual disk operations are performed. ;ENTRY ;BC = sector number. MOV A,C STO A,CPMSEC ;SET CPM LOGICAL SECTOR # RET SETDMA: ;Sets Disk memory address for subsequent disk read or write routines. This address is saved in DMAADR ; until the disk transfer is performed. ;ENTRY ;BC = Disk memory address. ;EXIT ;NONE STO BC,DMAADR RET PAGE READ: ;READ a CP/M 128 byte sector. ;ENTRY ;NONE ;EXIT ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC XRA A ;Set flag to force a read STO A,UNACNT ;Clear sector counter ;FILL BUFFER WITH DATA CALL FILL ;Fill buffer with data ;MOVE DATA FROM BUFFER TO DMA ADDRESS EX DE,HL ;HL = OFFSET IN BUFFER LD DE,DMAADR ;DESTINATION LDK BC,128 ;Move 128 bytes LDIR RZ ;RETURN If no errorS ;IF ERROR CLEAR HOST ACTIVE FLAG XRA A STO A,H STACT ;Clear host active (A = 0) ORI 1 ;Indicate error RET PAGE WRITE: ;WRITE the selected 128 byte CP/M sector. ;ENTRY ;C = 0, write to a previously allocated block. ;C = 1, write to the directory. ;C = 2, write to the first sector of unallocated data block. ;EXIT ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC PUSH BC ;SAVE Write type ;CHECK WRITE TYPE MOV A,C CPI WRUAL JNZ :2 ;JMP IF NOT FIRST SECTOR OF UNALLOCATED BLOCK ;IF write to allocated LD A,SEKTYP CPI 5 ;Check for 2K block size LDK A,2048/128 JRZ :1 ;Type = Osborne single density (2K block size) LDK A,1024/128 ;Otherwise 1K block size :1: STO A,UNACNT LD A,SEKTRK STO A,UNATRK ;UNATRK = SEKTRK LD A,LOGSEC INC A JR :4 :2: LDK HL,UNACNT LD A,[hl] ORA A JZ :5 ;If no unallocated records DEC [hl] ;dec unalloc record count ;Get number of sectors per track LD A,SEC_TRK ;GET MOV B,A ;B=Number of sectors per track LD A,UNASEC ;Increment logical sector INC A CMP B JNZ :4 ;If not end of track LDK HL,UNATRK ;INCREMENT TRACK INC [HL] XRA A :4: STO A,UNASEC ORI 0FFH ;SET FLAG FOR READ NOT REQUIRED :5: CALL FILL ;FILL BUFFER WITH DATA ;MOVE DATA TO BUFFER FROM DMA ADDRESS ;DE = DESTINATION IN BUFFER LD HL,DMAADR ;HL = SOURCE OF INFO LDK BC,128 LDIR POP BC ;RESTORE Write type RNZ ;RETURN If any errors occurred IN FILL ;INDICATE BUFFER HAS DATA TO BE WRITTEN IN IT INC A ;A=1 STO A,HSTWRT ;HSTWRT = 1 ;CHECK WRITE TYPE MOV A,C ;GET WRITE TYPE CPI WRDIR ;WRITE to directory? JRZ FLUSH ;Force write of directory XRA A RET ;RETURN WITHOUT WRITE PAGE FLUSH: ;Writes buffer to disk. ;ENTRY ;NONE ;EXIT ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC ;IS HOST ACTIVE FOR WRITE LD A,HSTWRT ORA A RZ ;RETURN If WRITE IS NOT REQUIRED ;SET PARM. XRA A STO A,HSTWRT ;MAKE WRITE INACTIVE LD A,HSTDSK ;Move disk STO A,SDISK LD A,HSTTRK STO A,SAVTRK LD A,HSTSEC STO A,SAVSEC LD A,HSTTYP STO A,SAVTYP ;WRITE LDK HL,SAVSEC INC [hl] ;ADD 1 TO SECTOR (FOR physical) LDK B,1 ;SET TO ONE SECTOR JMP WSEC ;WRITE IN ROM AND RETURN PAGE FILL: ;Fills host buffer with appropriate host sector. ;ENTRY ;A = 0, Read required ;A <> 0, READ NOT REQUIRED ;EXIT ;DE = HOST RECORD ADDRESS ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC STO A,RDFLAG ;Save read flag LD A,SEKTYP RRC RRC ANI 03 MOV B,A LDK DE,HSTBUF ;initial offset LD A,CPMSEC ;Get CPM logical sector LDK HL,128 ;128 byte records JRZ :3 ;Jump when sector size <> 128, no deblocking necessary :1: EX DE,HL RRC JRNC :2 ;If low bit not set ADD HL,DE ;Add bias to offset :2: EX DE,HL ADD HL,HL ANI 07Fh ;Mask sector DJNZ :1 :3: STO A,SEKSEC ;physical sector - 1 PUSH DE ;SAVE OFFSETED ADDRESS IN BUFFER ;CHECK HSTACT LD A,HSTACT ;host active flag ORA A JRZ :6 ;If host buffer inactive ;CHECK IF DRIVE PARM. ARE THE SAME LDK HL,HSTSEC LDK DE,SEKSEC LDK B,SEKTYP-SEKSEC+1 :4: LD A,[DE] CMP [HL] JRNZ :5 ;If mis-match INC HL INC DE DJNZ :4 ;If all bytes not checked ;RETURN IF THEY ARE THE SAME POP DE ;RESTORE OFFSETED ADDRESS IN BUFFER XRA A ;INDICATE GOOD RET ;GOOD RETURN ;WRITE BUFFER IF MISMATCH :5: CALL FLUSH ;Flush host buffer ;SETUP ROM DRIVE PARAM. :6: PUSH AF ;SAVE FLAGS ;A=0 & ZBIT=1 IF FROM JMP LDK A,1 STO A,HSTACT ;MAKE HOST ACTIVE LD A,SEKDSK ;Move disk STO A,HSTDSK STO A,SDISK LD A,SEKTRK ;TRACK STO A,HSTTRK STO A,SAVTRK LD A,SEKSEC ;SECTOR STO A,HSTSEC STO A,SAVSEC LD A,SEKTYP ;TYPE STO A,HSTTYP STO A,SAVTYP POP AF ;RESTORE FLAGS JRNZ :RET ;IF ERROR IN FLUSH ;CHECK IF READ IS REQUIRED LD A,RDFLAG ORA A JRZ :7 ;If read required ;RETURN WITHOUT READ POP DE ;RESTORE OFFSETED ADDRESS IN BUFFER XRA A ;INDICATE GOOD RET ;GOOD RETURN ;READ THEN RETURN ;ADD 1 TO SECTOR (FOR physical) :7: LDK HL,SAVSEC INC [hl] ;update sector+1 LDK B,1 ;SET TO ONE SECTOR CALL RSEC ;READ IN ROM :RET: POP DE ;RESTORE OFFSETED ADDRESS IN BUFFER RET PAGE SECTRN: ;Translates sector number from logical to physical. ;ENTRY ;DE = 0, no translation required. ;DE = translation table address. ;BC = sector number to translate. ;EXIT ;HL = translated sector. PROC LDA UNASEC CMP C JRZ :1 ;IF SECTORS MATCH ;If sectors do not match Clear unallocated block count XRA A ;A = 0 STO A,UNACNT ;Clear unallocated block count ;SET SECTOR :1: MOV A,C STO A,LOGSEC MOV L,C MOV H,B MOV A,E ;Check if translation is required ORA D RZ ;None required, return ADD HL,DE ;Translation required MOV L,M MVI H,0 RET PAGE PRINT: ;Print message string to CONSOLE devic e ;ENTRY ;DE = ADDRESS TO PRINT ;EXIT ;DE = ADDRESS TO PRINT ;HL = ADDRESS OF CONOUT LDK HL,CONOUT JR STROUT ;PRINT STRING PSTR: ;Print message string to LIST device ;ENTRY ;DE = ADDRESS TO PRINT ;EXIT ;DE = ADDRESS TO PRINT ;HL = ADDRESS OF LIST LDK HL,LIST ; JR STROUT ;FALLS THROUGH TO STROUT PAGE STROUT: ;Print message FIST BYTE IS length ;ENTRY ;DE = ADDRESS TO PRINT (FIST BYTE IS length) ;HL = ADDRESS OF ROUTINE TO CALL ;EXIT ;DE = DE + length ;CHANGED ;ALL PROC ;GET length LD A,[DE] ;Get a length of print string ORA A RZ ;If zero then terminate MOV B,A ;Length to B reg ;PRINT CHARACTER LOOP :LOOP: INC DE LD A,[DE] ;Get character MOV C,A PUSH DE ;Save print string address PUSH BC ;Save loop counter PUSH HL ;Save output routine address ;CALL ROUTINE LDK DE,:1 PUSH DE ;Return address to stack JMP [HL] ;JMP TO ROUTINE :1: POP HL POP BC POP DE DJNZ :LOOP ;Print next character if not done RET PAGE ;The following routines will use the IOBYTE to transfer control to the appropriate device driver ;CONST NEED TO GO AS FAST AS POSSIBLE CONIN: ;Reads input character from device PROC LDK HL,PTR_CINP ;Table of input rtns LDK B,1 ;number of shifts required to align CONSOLE field JMP DISPCH ;Call appropriate rtn PAGE CONOUT: ;Puts output character to device ;C contains output character PROC ;SPECIAL CASE IF CONSOL OUTPUT IS TTY ;THIS IS FOR SPEED ONLY LD A,IOBYTE ANI 0000_0011B ;CHECK FOR TTY JZ COUT ;OUTPUT CHAR IN ROM AND RETURN ;ALL OTHER DEVICE OUTPUT (NOT TTY) LDK HL,PTR_COUT ;Table of output rtns LDK B,1 ;number of shifts required to align CONSOLE field JMP DISPCH ;Call appropriate rtn PAGE CONST: ;Returns console status PROC ;SPECIAL CASE IF CONSOL STATUS IS TTY ;THIS IS FOR SPEED ONLY LD A,IOBYTE ANI 0000_0011B ;CHECK FOR TTY JRNZ :1 ;IF NOT TTY STATUS ;IF TTY STATUS ;check if any translated keys are pending LD A,COUNT ORA A JZ SKEY ;JUMP TO ROM AND CHECK STATUS ;IF ANY ARE PENDING : RETURN FF ORI 0FFh RET ;ALL OTHER DEVICE STATUS :1: LDK HL,PTR_CSTAT ;Status table LDK B,1 ;number of shifts required to align CONSOLE field ;FALL THROUGH TO DISPCH PAGE DISPCH: ;On entry here reg B contains the left shift count required to align the iobyte field to bit 1 position. ; Reg HL contains address of select table. ;ENTRY ;B = LEFT SHIFT COUNT ;HL = ADDRESS OF SELECT TABLE PROC LD A,IOBYTE ;SHIFT IOBYTE FIELD :1: RAL DJNZ :1 ;GET OFFSET ANI 6 ;get select field*2 MOV E,A LDK D,0 ;DE = iobyte field * 2 ;ADD OFFSET TO HL DAD DE ;GET ADDRESS IN HL MOV E,[HL] INC HL MOV H,[HL] ;get the routine address MOV L,E ;into hl ;JMP TO ROUTINE JMP [HL] ;RETURN TO CALLING PROGRAM PAGE LIST: ;List device character output PROC LDK HL,PINTFG ;Get printer initialization flag LD A,[HL] ORA A JRNZ :1 ;Printer previously initialized DEC [HL] ;Non-zero value to PINTFG PUSH BC ;Save character INC HL EX HL,DE ;Get initialization string CALL PSTR ;and print it POP BC ;Restore character :1: LDK B,4 LDK HL,PTR_LIST ;table of list routines JR DISPCH PUNCH: ;Output to punch PROC LDK B,6 LDK HL,PTR_COUT ;Punch routines JR DISPCH READER: ;Reader input PROC LDK B,8 LDK HL,PTR_CINP ; reader routines JR DISPCH LISTST: ;Return the ready status for the list device. ;EXIT A = 0 (zero), list device is not ready to ; accept another character. ; A = FFh (255), list device is ready to accept ; a character. PROC LDK B,4 ;number of left shifts thru carry ;to align LIST field of IOBYTE LDK HL,PTR_LST ;list status routines JR DISPCH ;DO ROUTINE PAGE ;Dispatch Table PTR_CSTAT: ;INPUT STATUS DW CNST ; keyboard status DW SISTAT ; serial port input status DW PISTAT ; parallel input status DW CNST ; keyboard status PTR_CINP: ;INPUT CHARACTER DW KEYINP ; get input from keyboard DW SPINP ; serial port input DW PARINP ; parallel input DW KEYINP ; get input from keyboard PTR_COUT: ;OUTPUT CHARACTER DW COUT ; output character to crt DW SPOUT ; serial port output DW PAROUT ; parallel output DW COUT ; output character to crt PTR_LST: ;OUTPUT STATUS DW CRSTAT ; consol outut status DW SOSTAT ; serial output status DW POSTAT ; parallel output status DW CRSTAT ; consol outut status PTR_LIST: ;OUTPUT TO THE LIST DEVICE DW COUT DW PRTOUT DW PAROUT DW COUT PAGE CNST: ;This routine samples the Console INPUT status ;ENTRY ;NONE ;EXIT ;A = 0 (zero), means no character currently ready to read. ;A = FFh (255), means characteR currently ready to read. PROC ;check if any translated keys are pending LD A,COUNT ORA A JZ SKEY ;JUMP TO ROM AND CHECK STATUS ;IF ANY ARE PENDING : RETU RN FF ORI 0FFh RET PAGE KEYINP: ;Gets keystroke from ROM keyboard driver. Translates the codes 80h to 8fh as per table. ;EXIT ;A = CHARACTER ;This is self modify code do not change. See Roger Chapmen if any questions PROC PUSH IX ;Save user IX :1: LDK HL,COUNT LD A,[HL] ;get number of xlated keys ORA A JRZ :3 ;CONT. IF NO KEYS PENDING ;if keys pending then LD IX,XLTKEY ;get base address in IX reg LD A,[IX+0] ;simulate LD A,(IX+COUNT) COUNT: = *-1 ;to get next key from table INC [HL] ;increment count ;RETURN IS HERE :2: POP IX ;Restore user IX RET ;RETURN ;READ KEY FROM KEYBOARD (DONE BY ROM) :3: CALL CI ;When console has returned this code will check for function key and perform some translation CPI 80h ;function keys have value 80h-8dh JRC :2 ;RETURN IF LESS THAN 80H CPI 8Eh JRNC :4 ;JMP IF ABOVE 8DH SLA A ;do a shift to make pointer into table MOV E,A LDK D,0 LDK IX,XLTBL ADD IX,DE  LD L,[IX+0] LD H,[IX+1] LD E,[IX+2] LD D,[IX+3] STO DE,XLTKEY SBC HL,DE MOV A,L STO A,COUNT JR :1 ;LOOP ;PROCESS KEYS FROM 8E AND ABOVE :4: XRA A ;MAKE KEY A ZERO JR :2 ;RETURN PAGE CRSTAT: ;Returns status of crt. PROC ORI 0FFh ;crt is always ready RET PAGE ; +----------------+ ; | SERIAL SECTION | ; +----------------+ SIRST: ;Master reset 8251 ;ENTRY ;NONE ;EXIT ;NONE PROC DI ;SET BAUD RATE BY SETTING UP THE 8155'S TIMER ;GET RATE FROM TABLE LD A,BRATE ;GET BAUD RATE ADD A ;*2 MOV E,A LDK D,0 ;DE=OFFSET INTO TABLE LDK HL,BRATET ;FWA OF TABLE ADD HL,DE ;HL=OFFSETTED ADDRESS IN TABLE LD E,[HL] ;LSB INC HL LD A,[HL] ;MSB ;MAKE OUTPUT A SQUARE WAVE ORI 0100_0000B ;CONTINUOUS SQUARE WAVE MOV D,A ;SET BAUD RATE ;LSB LDK A,4 OUT PREGS ;SELECT REG MOV A,E OUT PDATA ;OUTPUT LOW BYTE ;MSB LDK A,5 OUT PREGS ;SELECT REG MOV A,D OUT PDATA ;OUTPUT HIGH BYTE ;START 8155'S TIMER XRA A OUT PREGS ;SELECT COMMAND REG LDK A,1100_1111B OUT PDATA ;DISABLE INTERRUPTS ON 8251 & ENABLE INTERNAL CLOCKS LDK A,3 OUT PREGS ;SELECT PORT 3 LDK A,1111_1111B OUT PDATA EI ;RESET 8251 XRA A OUT SSTAT OUT SSTAT OUT SSTAT OUT SSTAT LDK A,SI.MRST OUT SSTAT ;RESET CHIP ;SET MODE LD A,MODE OUT SSTAT ;SET COMMAND LDK A,SI.COM OUT SSTAT RET PAGE BRATET: ;BAUD RATE TRANSLATION TABLE DW 5000 ;50 0 DW 3333 ;75 1 DW 2273 ;110 2 DW 1859 ;134.5 3 DW 1667 ;150 4 DW 1250 ;200 5 DW 833 ;300 6 DW 416 ;600 7 DW 208 ;1200 8 DW 139 ;1800 9 DW 125 ;2000 10 DW 104 ;2400 11 DW 69 ;3600 12 DW 52 ;4800 13 DW 35 ;7200 14 DW 26 ;9600 15 DW 13 ;19200 16 PAGE SOSTAT: ;Gets status of output device attached to serial port ;ENTRY ;NONE ;EXIT ;A = 0, IF NOT READY ;A = 0FFh IF READY ;ZBIT = SET IF NOT READY FOR OUTPUT PROC  IN SSTAT ;GET SERIAL STATUS register ANI SI.TRDY RZ ;RETURN ORI 0FFH RET PAGE SISTAT: ;Gets status of input device attached to serial port ;EXIT ;ZBIT = SET IF NOT READY ;ZBIT = RESET IF READY PROC IN SSTAT ;GET SERIAL STATUS register ANI SI.RRDY RZ ;RETURN IF NOT READY ORI 0FFH ;MAKE READY RET PAGE SPINP: ;Inputs a character from the serial port ;ENTRY ;None ;EXIT ;A = character read PROC ;CHECK FOR CHARACTER CALL SISTAT ;GET INPUT STATUS JRZ SPINP ;LOOP IF NO CHARACTER ;READ CHARACTER IN SDATA ;get data RET PAGE SPOUT: ;Outputs character in reg c to the serial port ;ENTRY ;C = character to output ;EXIT ;NONE PROC CALL SOSTAT ;GET STATUS JRZ SPOUT ;LOOP MOV A,C OUT SDATA ;SEND CHARACTER RET PAGE PRTOUT: ;routine does printer protocols for serial (LST) output ;ENTRY ;C = CHARACTER TO PRINT ;EXIT ;NONE XON: = 11h XOFF: = 13h ETX: = 3 ACK: = 6 PROC  ;PRINT CHARACTER CALL SPOUT LD A,PRNTER ;CHECK FOR PROTOCOL ORA A RZ ;RETURN IF NO PROTOCOL ;CHECK FOR XON XOF ANI 2 JRNZ XONXOF ;IF XONXOF ;ETX ACK ;CHECK FOR END OF LINE LDK A,0Dh CMP C RNZ ;RETURN IN NOT END OF LINE ;SEND ETX LDK C,ETX CALL SPOUT ;WAIT FOR ACK :1: CALL SPINP ;GET CHARACTER ANI 7Fh ;mask out parity bit CPI ACK JRNZ :1 RET ;RETURN PAGE XONXOF: ;PERFORM XONXOF protocol ;ENTRY ;NONE ;EXIT ;NONE PROC ;CHECK IF CHARACTER THERE CALL SISTAT ORA A RZ ;RETURN IF NO CHARACTER RECEIVED ;CHECK FOR XOFF CALL SPINP ;GET CHARACTER ANI 7Fh ;mask out parity bit CPI XOFF RNZ ;RETURN IF NOT XOFF ;WAIT FOR XON :1: CALL SPINP ;GET CHARACTER ANI 7Fh ;mask out parity bit CPI XON JRNZ :1 RET ;RETURN AFTER XON PAGE *[ ] ; +---------------------------+ ; | CENTRONIX PRINTER SECTION | ; +---------------------------+ ;The Parallel port is actually the IEEE port driven with the centronix protocol. The bit assignements ; are as follows: ;A0-7 <=> data bus ;B0-4 = UNUSED (MUST BE 1) ;B5 <= 1, printer busy. 0, printer is ready. ;B6 => output strobe. Active = 0. ;B7 = UNUSED (MUST BE 1) ;This chip (the 8155) will be setup correctly by the "SIRST" routine which is called in the cpm boot section. ;In this section we are using two port of the 8155 on the I/O card. Both ports are bidirectional ports. ;This chip was designed for use with an 8085 so we do some wierd addressing. The chip has 6 registers ; (0-5) which are addressed through outputing the register number to port 21h. After the register has ; been so addressed we can read and write to it by outputing or inputing port 28h. Since the INTERRUPT ; routines may also address in this manner we must disable INTERRUPTs while we are doing this. ;ALWAYS disable INTERRUPTs while using the 8155 because the INTERRUPT routines may be changing the register ; assignments. PAGE POSTAT: ;CHECK IF the parallel (centronix) printer attached to the IEEE port IS READY TO RECEIVE A CHAR. ;NOTE ;AFTER RESET OUTPUTS OF ALL PORTS ARE HIGH ;ENTRY ;NONE ;EXIT ;A = 0 IF PRINTER NOT READY TO RECEIVE A CHARACTER ;A = FF IF PRINTER IS READY TO RECEIVE A CHARACTER ;MUST SAVE REG C PROC ;SETUP PORT 2 LDK A,2 OUT PREGS ;SELECT PORT 2 LDK A,PP.CSTRB ;SET TO INPUT OUT PDATA ;GET STATUS IN PBDATA CMA ;INVERT REG A ANI PP.ORDY RZ ;RETURN IF PRINTER NOT READY FOR OUTPUT ORI 0FFH RET PAGE PISTAT: ;gets status of the input device attached to the parallel port ;This routine is not used since there is no input device suported on the parallel port ;ENTRY ;NONE ;EXIT ;A = 0 IF NO DATA RECEIVED ;A = FF IF DATA WAS RECEIVED PROC ORI 0FFH ;ALWAYS GOOD RET PAGE PARINP: ;inputs a character from PArallel port. ;This routine is not used since there is no input device suported on the parallel port ;ENTRY ;NONE ;EXIT ;A = DATA (ALWAYS 0) PROC XRA A RET PAGE PAROUT: ;outputs the character in c to the IEEE port treating the port as a parallel port. ;ENTRY ;C = CHARACTER TO OUTPUT PROC ;CHECK OUTPUT STATUS CALL POSTAT ;MUST SAVE C JRZ PAROUT ;LOOP TILL OK TO OUTPUT ;OUTPUT DATA DI LDK A,1 OUT PREGS ;SELECT DATA PORT MOV A,C OUT PDATA ;SEND DATA ;SEND STROBE LDK A,2 OUT PREGS ;SELECT STATUS PORT LDK A,PP.SSTRB OUT PDATA ;set strobe LDK A,PP.CSTRB OUT PDATA ;clear strobe EI RET PAGE PROC :1: = * IF :1 > CCP + 1E00H .9 ERROR SYSTEM SIZE TOO LARGE ENDIF MSG 'SYSTEM SPACE AVAILABLE = ',1E00H - (:1 - CCP) HSTBUF: DS 1024 ;Host disk xfer buffer (MUST BE UNDER 0F000H) PAGE *NOTE* ;THIS AREA IS IN VIDEO MEMORY ORG VIDBUF ;FBA OF BUFFER LASTA: DS 4 ;# drives * 2 DPB: DS 2 SAVDPH: DS 2 SEC_TRK DS 1 ;SECTORS PER TRACK USED IN SELDSK & WRITE ALV: DS ALVSZ ;BUFFERS FOR BDOS CSV: DS CSVSZ XLTKEY: DS 2 DIRBUF: DS 128 ;Directory Buffer DMAADR: DS 2 ;CBIOS dma address RDFLAG: DS 1 ;Read flag CPMSEC: DS 1 ;TRANSLATED CPM Logical sector LOGSEC: DS 1 ;UNTRANSLATED CPM Logical sector SEKSEC: DS 1 ;THESE SEKTRK: DS 1 ;MUST SEKDSK: DS 1 ;BE SEKTYP: DS 1 ;IN ORDER HSTSEC: DS 1 ;THESE HSTTRK: DS 1 ;MUST HSTDSK: DS 1 ;BE HSTTYP: DS 1 ;IN ORDER *NOTE* ;THIS AREA IS ZEROED BY WARM BOOT CLRSTR: = * ;FIST ADDRESS TO CLEAR HSTACT: DS 1 ;host active flag HSTWRT: DS 1 ;Host written flag UNACNT: DS 1 ;Unalloc rec count UNATRK: DS 1 ;Track UNASEC: DS 1 ;Sector CLRLNT: = *-CLRSTR+1 ;length OF AREA TO CLEAR ; END *NOTE* ;THIS AREA IS IN VIDEO MEMORY ORG VIDBUF ;FBA OF BUFFER LASTA: DS 4 ;# drives * 2 DPB: DS 2 SAVDPH: DS 2 SEC_TRK DS 1 ;SECTORS PER TRACK USED IN SELDSK & WRITE ALV: DS ALVSZ ;BUFFERS FOR BDOS CSV: DS CSVSZ XLTKEY: DS 2 D Generation Procedure for ENCORE Basic I/O System(VBIOS) --------------------------------------------------------- 4/4/83 A. The following four files are needed on the current drive: 1. ACT.COM - Assembler file 2. VBIOS.ASM - Main source file 3. VBIOS0.ASM - Source file 0 4. VBIOS1.ASM - Source file 1 NOTEAlsneedewil bVMOVCP͠generatio procedures/files B. Type "ACT VBIOS0 ". This command will generate following file: VBIOS0.HEX - Hex format file C. Type "ACT VBIOS1 ". This command will generate following file: VBIOS1.HEX - Hex format file D Transfe bot o th abov HEؠ file t you MOVCP generation drive. No follo th MOVCP generation procedures, VMOVCPMG.DOC, t complet VBIOS generation.  !"#$%&'