IMD 1.17: 24/12/2010 12:00:33 v setup 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 COMVSETUP ASM !"VSETUP ASM#$%&'()*+,-./012VSETUP ASM3456789:;<=>?@ABVSETUP ASM5CDEFGHIVSETUP COM2JLMNOPQVSETUPG DOCKACT 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 & WSJ ;.Title : ENCORE SETUP : REV X3.094 ;.Comments: ALPHA ; +---------------+ ; | | ; | ENCORE SETUP | ; | | ; +---------------+ ;X.1 Added baud rate selection menu : deb ; Removed the horizontal scrol : deb ; Removed the logical screen size :deb ;X.2 Changed main menu to have only four options : deb ;X.3 Changed location of buffer area in CBIOS : deb ; Changed menu's in terms of reverse video : deb ; Removed the IEEE : deb ;X.4 Add character length selection option : ymk ; Add parity check selection option : ymk ; Add number of stop bits selection option : ymk ; Seperate printer initialization option : ymk ; Remove screen flashing for option : ymk ; Change name from vixen to express : ymk ; Add R(Return to Main menu) option into putsys routine : ymk ; In display routine, function key table is displayed up to 20 char. per line : ymk ; In Printer initialization routine, use Return key to exit : ymk ; Remove ^c key to exit : ymk ; Save get or save message when writting or reading system : ymk ;X.5 Cleaned up code : deb ; Removed relative jumps : deb ;X.6 Added clear line to FPMT1 message (responce to bug report) : deb ;X.7 Change function key display : ymk ; Reduce the time delay for memory write : ymk ; Change CONFLEN 9AH to C7H : ymk ; Add write protected error detect feature : ymk ;X.8 Changed interface to rom : deb ; Display copywrite message : ymk ; Change ESC sequence for reverse video ; ESC ) -> ESC j, ESC ( -> ESC k : ymk ; Change ESC sequence for define window ; ESC w -> ESC z : ymk ; Remove message for printer initialization selection : ymk ; Remove Slection message when display Reading(Writing) system : 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 ; (8)Change "WORD STAR" to "WORDSTAR" : ymk ; (9)Change "disable" to "none" in parity selection : ymk ; (10)Change printer message "QUME (ETX/ACK)" to "ETX/ACK (QUME)" : ymk ; (11)Add "(ie. 08) in Printer initialization message : ymk ; (12)Change "Return to main menu" to "Return for main menu" : ymk ; Final before ALPHA : deb PAGE ;EQUATES DSK_STS = 00H ;FDC STATUS N128BS = 60 ;Number of 128 byte blocks in the system IOBYTE = 03H PIMAX = 10H ;NUMBER OF CHARACTERS IN PRINTER INITIALIZATION ;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 RSEC: = 0F10FH ;READ A SECTOR WSEC: = 0F112H ;WRITE A SECTOR SENDEN: = 0F115H ;SENCE DENSITY ROUTINE SINGTYP = 5 ;SAVTYP for single density DOUBTYP = 0CH ;SAVTYP for double density SINGSEC = 10 ;# of sectors/track for single density DOUBSEC = 5 ;# of sectors/track for double density LDBUF = 4000h ;Disk xfer buffer TEMPBUF = 3500H ;TEMPORARY BUFFER FOR HOLDING SETUP EDBUFR = 3000H ;START OF FUNKEY EDIT BUFFER WBOOT = 1 ;POINTER TO WBOOT JUMP IN LOW MEMORY CR = 0DH LF = 0AH ESC = 1BH BEL = 07H ;BELL BDOS: = 0005 ;BDOS Entry point LOWF0 = 078H ;LOW BYTE OF FUNCTION 0 ADDRESS (USED FOR VERSION CHECK) USRTBL: = LDBUF+1639H ;Beginning of configuration table IOBITE: = USRTBL ;IOBYTE PRNTER: = USRTBL+1 ;PRINTER SBYTE: = USRTBL+2 ;SERIAL BYTE (PARITY, ECT.) BRATE: = USRTBL+3 ;BAUD RATE :U1: = USRTBL+4 ;UNUSED BYTE XLTBL: = USRTBL+5 ;FUNCTION KEY TRANSLATION TABLE ADDRESS ARADDR: = XLTBL + 20 ;ARROW KEY FWA IN TABLE :U2: = USRTBL+23H ;UNUSED BYTE PIFLG: = USRTBL+24H ;PRINTER INITIALIZATION FLAG PINIT: = USRTBL+25H ;PRINTER INITIALIZATION STRING START FUNK0: = USRTBL+3FH ;FUNCTION KEY FBA TBLEND: = LDBUF+255 CONFLEN = 0C7H ;In BIOS, (BIOS+0ffh) - IOBYTE BOOT = 0000h ;Warm start address STACK: = 3FFDH ;Start of stack PAGE ORG 100h PROC LDK SP,STACK ;Stack start address LDK HL,IMSG CALL PRINT ;SETUP BUFFER CALL SETTABOFF ;Set up offset between LDBUF and actual CCP ;GET AND CHECK SYSTEM :1: CALL GETSYS ;Load system tracks from disk CALL CKVER ;Make sure it's the correct version JNZ :1 ;If version is wrong ;SET ARROW KEYS CALL SETTEMPAR ;Set up temporary arrow keys & Move data to assembled area ;FILL IN ASCI BAUD RATE VALUE LD A,BRATE CALL GASCBAUD ;DO SETUP RSTRT: CALL SETUP CALL DOIT ;DISPLAY MAIN MEMU ;RESTORE ARROW KEYS CALL RESTOREAR ;Restore arrow keys to old value XRA A STO A,PIFLG ;Indicate printer needs to be initialized before next char out ;SAVE SYSTEM CALL PUTSYS :2: LDK B,20 ;LINE 20 LDK C,1 ;COLUMM 1 CALL SETCUR ;CURSOR POSITION LDK HL,CLEEPG ;CLEAR TO END OF PAGE CALL PRINT LDK HL,ASKPU1 ;DISPLAY SELECTION MESSAGE CALL PRINT CALL PUTSY1 ;SAVE PUTSYS MESSAGE JMP :2 ;BACK TO PUTSYS DISPLAY PAGE RESYSR: ;RETURN TO SYSTEM PROC LDK A,'Z'-40H CALL COUT ;CLEAR SCREEN JMP BOOT PAGE CKVER: ;MAKE SURE SOURCE IS THE RIGHT BIOS VERSION FOR THIS SETUP ;ENTRY ;SOURCE READ INTO BUFF ;EXIT ;Z RESET IF ERROR PROC LD A,XLTBL ;GET LOW BYTE OF FUNCTION 0 ADDRESS CPI LOWF0 RZ ;RETURN Z IF OK LDK HL,BADVER CALL CKQUIT ;PRINT MESSAGE AND CHECK IF USER WANTS TO QUIT JZ RESYSR RET ;RETURN NZ IF ERROR PAGE SETTEMPAR: ;SET UP TEMPORARY ARROW KEYS ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,ARADDR ;ADDRESS OF ARROW KEYS IN LDBUFF LD DE,TABOFF ;OFFSET TO BIOS DAD DE,HL ;HL = BIOS ADDRESS OF ARROW KEY POINTER LD E,[HL] INC HL LD D,[HL] ;DE = ADDRESS OF ARROW KEYS PUSH DE LDK HL,TEMPAR ;SAVE ORIGINAL ARROW KEYS IN TEMPAR EX DE,HL LDK BC,4 LDIR POP DE LDK HL,CPMCUR LDK BC,4 ;SET UP WITH CP/M ARROW KEYS LDIR RET PAGE  RESTOREAR: ;RESTORE ARROW KEYS TO OLD VALUE ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,ARADDR ;ADDRESS OF ARROW KEYS IN LDBUFF LD DE,TABOFF ;OFFSET TO BIOS DAD DE,HL ;HL = BIOS ADDRESS OF ARROW KEY POINTER LD E,[HL] INC HL LD D,[HL] ;DE = ADDRESS OF ARROW KEYS LDK HL,TEMPAR ;OLD VALUE LDK BC,4 LDIR RET PAGE CHTOASC: ;Convert to ASCII decimal ;ENTRY ;HL = address to store ASCII number in ;A = number to convert PROC LDK BC,0 ;init dec number :2 SUI 10h ;high nibble JC :4 ;If yes, CARRY is set, output low only MOV D,A ;save HEX number MOV A,C ;Get 2 least SIGNIF. BCD digits ADI 16H ;ADD 16 DAA ;DECIMAL ADJUST MOV C,A ;STORE THEM MOV A,B ;Get OVERFLOW digit ACI 0 ;ADD CARRY (OVERFLOW) MOV B,A ;STORE OVERFLOW digit MOV A,D ;RESTORE HEX number JMP :2 :4 ADI 10H ;RESTORE HEX number to RANGE of 0-0FH ORA A DAA ;MAKE it DECIMAL ADD C ;ADD BCD digits to LOW NIBBLE DAA ;DECIMAL ADJUST MOV C,A ;STORE BACK in C MOV A,B ;Get OVERFLOW digit ACI 0 ;ADD in CARRY (OVERFLOW) JZ :6 ;DON'T PRINT LEADING 0 from OVERFLOW ADI '0' ;MAKE OVERFLOW digit into ASCII MOV M,A INC HL ;Store 1st number :6: MOV A,C ;MOVE BCD digits into A RRC ;Get high nibble RRC RRC RRC ANI 0FH ;Mask for nibble ADI '0' MOV M,A INC HL MOV A,C ANI 0FH ;Mask for nibble ADI '0' MOV M,A INC HL MVI M,0 ;Mark end of ASCII string RET PAGE SETTABOFF: ;SET UP TABOFF -- table offset from LDBUF to actual CCP ;ENTRY ;NONE ;EXIT ;NONE LD A,WBOOT+1 ;Get high byte of BIOS SUB 16H ;high byte of CCP = high byte of BIOS - 16 MOV H,A LDK L,0 ;Form CCP address in HL LDK DE,LDBUF SBC HL,DE ;HL = OFFSET STO HL,TABOFF RET PAGE GETSYS: ;GET SYSTEM FROM DISK DRIVE OR MEMORY PROC LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,ASKGET ;GET SYSTEM? CALL PRINT :loop: CALL CIN CMP CR JZ RESYSR ;if request to quit ANI 5FH ;MAKE UPPER CASE CPI 'M' JZ GMRD ;IF FROM MEMORY CPI 'A' JZ :disk ;IF DISK A SELECTED CPI 'B' JNZ :loop ;IF INVALID SELECTION ;GET SYSTEM FROM DISK :disk: STO A,GDISK ;TO SET MESSAGE SUI 'A' STO A,SDISK ;SET Drive ;OUTPUT MESSAGE LDK HL,GETMSG ;PUT SOURCE DISK IN DRIVE CALL PRINT :1: CALL CIN CMP CR JNZ :1 ;LOOP TILL ;OUTPUT MESSAGE LDK HL,RDSYS ;READING SYSTEM MESSAGE CALL PRINT ;SET RW TO READ AND GET THE SYSTEM XRA A STO A,RW ;set flag for READ CALL GETPUT ;Get system into memory JZ :2 ;CONTINUE IF NO ERROR ;IF ERROR IN READ LDK HL,READERR CALL CKQUIT ;check if user wants to quit JZ RESYSR JMP GETSYS ;TRY AGAIN ;CHECK FOR CPM :2: LD A,LDBUF CMP 0C3h RZ ;RETURN if GOOD (1st byte is JMP) LDK HL,BSYSD ;INDICATE NO SYSTEM CALL CKQUIT JZ RESYSR JMP GETSYS ;try again ;GET SYSTEM FROM MEMORY GMRD: CALL COUT LD HL,TABOFF ;OFFSET FROM LDBUF TO CCP LDK DE,LDBUF ADD HL,DE ;HL = CCP ADDRESS LDK BC,128*N128BS ;LENGTH OF SYSTEM LDIR ;MOVE SYSTEM FROM MEMORY TO LDBUF RET PAGE PUTSYS: ;Now put the system on user requested disk OR MEMORY PROC ;OUTPUT MESSAGE LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,ASKPUT CALL PRINT ;GET RESPONCE PUTSY1: CALL CIN CMP CR JZ RESYSR ;if request to quit ANI 5FH ;MAKE UPPER CASE CPI 'M' JZ :mem ;IF MEMORY CPI 'R' JNZ :4 POP HL ;DESTROY RETURN ADDRESS JMP RSTRT ;RETURN TO SETUP :4: CPI 'A' JZ :disk ;IF DISK A SELECTED CPI 'B' JNZ PUTSY1 ;IF NOT A VALID SELECTION ;PUT SYSTEM ON DISKETTE :disk: STO A,PDISK ;MESSAGE SET SUI 'A' STO A,SDISK ;SET DRIVE ;OUTPUT MESSAGE LDK HL,PUTMSG ;PUT DESTINATION DISK IN DRIVE CALL PRINT ;GET RESPONEC :1: CALL CIN CMP CR JNZ :1 ;LOOP TILL CR ;OUTPUT MESSAGE LDK HL,WRTSYS ;WRITING SYSTEM MESSAGE CALL PRINT ;SAVE SETUP CALL MV2TEMP ;SAVE SETUP IN TEMP BUFF ;READ IN SYSTEM FROM DISK XRA A STO A,RW ;READ SYSTEM CALL GETPUT JNZ :2 ;IF ERROR ;RESTORE NEW SETUP CALL TEMP2LD ;MOVE SETUP BACK TO LDBUFF ;SET RW TO WRITE LDK HL,RW STO 1,[HL] CALL GETPUT ;TO PUT SYSTEM BACK ON DISKETTE RZ ;RETURN IF NO ERROR ;IF ERROR IN WRITING :2: IN DSK_STS ;GET FDC STATUS ANI 40H ;IS WRITE PROTECTED ? LK HL,WRERR JZ :3 ;NO- HARD ERROR LDK HL,WRERR1 ;WRITE PROTECTED :3: CALL CKQUIT JZ RESYSR JMP PUTSYS PAGE ;PUT SYSTEM IN MEMORY :mem: LDK HL,WRTSYS ;WRITING SYSTEM MESSAGE CALL PRINT ;MOVE CONFIGURATION TABLE TO BIOS CALL MV2BIOS ;SET UP IOBYTE LD A,IOBYTE ANI 3FH ;CLEAR LST LDK HL,IOBITE ORA [HL] ;ADD IN NEW LST STO A,IOBYTE LDK B,2 :DELA1: PUSH BC LDK A,00H CALL DELAY ;WAIT TO LET USER SEE THE MESSAGE POP BC DJNZ :DELA1 CALL SETUP RET PAGE DELAY: ;'N' MILLISECONDS ;ENTRY ;A = number of millisecond ;EXIT ;none   PROC MOV C,A :1: LDK A,0B5H :LOOP: DEC A ;4 MOV B,B ;4 MOV C,C ;4 JNZ :LOOP ;10 DEC C JNZ :1 RET PAGE GETPUT: ;Get or PUT cpm onto disk requested ;ENTRY ;RW = 0 if read, 1 if WRITE ;EXIT ;ZBIT = RESET IF ERROR PROC :1: LDK HL,LDBUF STO HL,DMADR ;SET DMA ADDR ;Main loop for reading or writing next Track LDK A,1 STO A,SAVSEC ;set sector *SET "SAVTYP" AND GET NUMBER OF SECTORS PER TRACK CALL SENDEN ;SENSE DENSITY AND SET SAVTYP RNZ ;IF ERROR CALL CKTYP JZ :D1 ;IF OSBORNE FORMAT LDK HL,NONOSB CALL PRINT CALL BEEP ORI 0FFH ;RESET Z RET ;IF NOT OSBORNE FORMAT :D1: PUSH BC ;SAVE NUMBER OF SECTORS IN ONE TRACK LDK D,N128BS ;SET NUMBER OF 128 BYTE BLOCKS IN SYSTEM *SET NUMBER OF SECTORS TO READ LD A,SAVTYP SRL A SRL A ANI 0000_0011B ;A=NUMBER OF BYTES IN ONE SECTOR(0-3) JZ :2 ;IF 128 BYTES SECTORS ;GET NUMBER TO DIVIDE BY MOV B,A ;B=NUMBER OF BYTES IN ONE SECTOR(1-3) LDK A,1 :1LOOP: SLA A ;TIMES TWO DJNZ :1LOOP MOV B,A ;NUMBER TO DIVIDE BY MOV A,D ;A=NUMBER OF 128 BYTE BLOCKS LDK D,0 :2LOOP: SUB B ;SUBTRACK WITH DIVISOR EX AF ;SAVE FLAGS INC D ;COUNT EX AF ;RESTORE FLAGS JZ :2 ;IF REZULT IS ZERO (NO PARTIAL SECTORS) JNC :2LOOP ;LOOP :2: POP BC ;B=NUMBER OF SECTORS IN ONE TRACK MOV C,D ;C=NUMBER OF SECTORS TO READ *READ SYSTEM XRA A ;A=0 :TLOOP: STO A,SAVTRK ;SET TRACK ;CHECK FOR ALL SECTORS READ MOV A,C ;SECTORS TO READ ORA A RZ ;IF C IS ZERO YOUR DONE ;UPDATE NUMBER OF SECTORS LEFT TO READ SUB B ;SUBTRACK SECTORS IN ONE TRACK JNC :3 ;A>B MORE THAN ONE TRACK LEFT TO READ ;IF THIS IS LAST TRACK ZERO NUMBER OF SECTORS LEFT TO READ MOV B,C ;READ ALL THE REMAINING SECTORS XRA A ;STOP AFTER THIS READ ;R/W ONE TRACK :3: MOV C,A ;SAVE REMAINING SECTORS TO READ LD A,RW ORA A JZ :4 ;IF READ CALL WSEC ;WRITE RNZ ;IF ERROR JMP :5 ;SKIP READ IF WRITE :4: CALL RSEC ;READ RNZ ;IF ERROR ;UPDATE DMA :5: STO HL,DMADR ;SET DMA ;UPDATE TRACK LD A,SAVTRK INC A JMP :TLOOP ;TRACK LOOP PAGE CKTYP: ;CHECK IF TYPE IS OSBORNE ;ENTRY ;SAVTYP SET ;B = # OF SECTORS/TRACK ;EXIT ;Z = RESET IF NOT OSBORNE PROC ;CHECK FOR OSBORNE SINGLE DENSITY LD A,SAVTYP CPI SINGTYP JNZ :1 MOV A,B CPI SINGSEC RET ;Z SET IFF OSBORNE ;CHECK FOR OSBORNE DOUBLE DENSITY :1: CPI DOUBTYP RNZ ;IF NOT OSBORNE MOV A,B CPI DOUBSEC RET ;Z SET IFF OSBORNE PAGE MV2TEMP: ;MOVE CONFIGURATION (SETUP) FROM LDBUF TO TEMPBUF ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,USRTBL LDK DE,TEMPBUF LDK BC,CONFLEN LDIR RET PAGE TEMP2LD: ;MOVE CONFIGURATION (SETUP) FROM TEMPBUF TO LDBUF ;ENTRY ;NONE ;EXIT ;NONE PROC ;FIRST CHANGE FUNCTION KEY POINTERS IF DESTINATION SYSTEM SIZE IS DIFFERENT FROM SOURCE LD HL,XLTBL ;GET DESTINATION POINTER TO FUNCTION 0 LD DE,TEMPBUF+5 ;GET SOURCE POINTER TO FUNCTION 0 SBC HL,DE JZ :1 ;IF POINTERS THE SAME ;IF POINTERS DIFFERENT, ADD OFFSET TO SOURCE EX DE,HL ;DE = OFFSET FROM SOURCE TO DESTINATION VALUE LDK C,15 ;NUMBER OF POINTERS LDK IY,TEMPBUF+5 ;FIRST ADDRESS TO CHANGE :LOOP: LD L,[IY+0] LD H,[IY+1] ;HL = SOURCE POINTER DAD DE,HL ;ADD OFFSET STO L,[IY+0] STO H,[IY+1] ;HL = POINTER + OFFSET INC IY INC IY ;NEXT POINTER DEC C JNZ :LOOP ;MOVE TEMPBU TO LDBUF :1: LDK HL,TEMPBUF LDK DE,USRTBL LDK BC,CONFLEN LDIR RET PAGE MV2BIOS: ;MOVE CONFIGURATION TABLE TO MEMORY ;ENTRY ;NONE ;EXIT ;NONE PROC CALL ADDOFF ;ADD TABOFF TO VALUES IN INXTBL ;MOVE INXTBL INTO XLTBL LDK HL,INXTBL LDK DE,XLTBL LDK BC,30 LDIR ;MOVE CONFIGURATION TABLE INTO BIOS LD HL,TABOFF ;OFFSET FROM LDBUF TO CCP LDK DE,USRTBL DAD DE,HL EX DE,HL ;HL = USRTBL ;DE = BIOS USRTBL LDK BC,CONFLEN ;LENGTH OF CONFIGURATION TABLE LDIR ;MOVE USRTBL TO BIOS RET PAGE ADDOFF: ;ADD TABOFF TO VALUES IN INXTBL ;ENTRY ;NONE ;EXIT ;NONE PROC LDK IX,INXTBL ;IX = INXTBL ADDRESS LD DE,TABOFF ;DE = TABOFF LDK B,15 ;B = NUMBER OF WORDS ;ADD TABOFF TO EACH WORD IN INXTBL :LOOP: LD L,[IX + 0] LD H,[IX + 1] ;HL = WORD IN INXTBL DAD DE,HL ;ADD TABOFF STO L,[IX + 0] STO H,[IX + 1] ;SAVE WORD + OFFSET INC IX INC IX ;NEXT WORD DJNZ :LOOP RET PAGE SETUP: ;MOVE FUNCTION KEYS TO BUFFER AND DEFINE VARIABLES PROC LD A,IOBITE ;First figure out what printer is installed CMP 80H JZ :10 ;Jump if centronics LD A,PRNTER ;Serial printer JMP :30 ;Protocol in a reg :10: LDK A,3 :30: STO A,PRIN ;PRIN = 0 standard serial ; 1 ETX/ACK ; 2 XON/XOFF ; 3 Centronics ;Define internal function key translation table CALL MOVXLT ;Get translation table made LD HL,INXTBL+20 LD A,[HL] SUB 'K'-40H JZ :40 LDK A,-1 :40: STO A,ARKEY RET PAGE DOIT: PROC   LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,MENUSCR ;PRINT MAIN MENU CALL PRINT CALL DISPLAY ;Display current settings INP1: LDK HL,MNPMT CALL PRINT ;PRINT RESPONCE QUESTION ;GET RESPONCE LDK B,'H'+1 ; CALL GETCHR CPI CR RZ ;RETURN ;JMP TO ROUTINE SUB 'A' LDK HL,JTABL CALL OFFSET JMP [HL] ;JUMP JTABL: DW SELPRT ;A DW CRSCTL ;B DW FUNKEY ;C DW BAUDRT ;D DW CHRLEN ;E DW PARITY ;F DW STOPBT ;G DW PRINIT ;H PAGE CHRLEN: ; GET CHARACTER LENGTH FOR SERIAL PORT ;ENTRY ;NONE ;EXIT ;NONE PROC CALL CHRLN1 ;DISPLAY CHARACTER LENGTH DISPLAY :1: LDK B,'D'+1 ;GET OPTION CALL GETCHR CPI CR ;DONE IF CR ENTERED JZ DOIT SUI 'A' RLC RLC MOV B,A LD A,SBYTE ;UPDATE NEW SBYTE ANI 0F3H OR B STO A,SBYTE CALL CHRLN2 ;DISPLAY CURRENT OPTION JMP :1 PAGE CHRLN1: ;DISPLAY CHARACTER LENGTH OPTIONS ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,CHRLSCR ;DISPLAY OPTION CALL PRINT CHRLN2: LDK HL,BAUDPOS ;POSITION CURSOR CALL CCHRLN ;DISPLAY CURRENT CHAR. LENGTH LDK B,24 ;DECIMAL LINE NUMBER LDK C,67 ;DECIMAL COLUMM NUMBER CALL SETCUR RET PAGE CCHRLN: ;DISPLAY CURRENT CHARACTER LENGTH CALL PRINT ;OUTPUT CURSOR POSITION LD A,SBYTE ;DISPLAY CURRENT CHAR. LENGTH ANI 0CH ;MASK OUT CHARACTER LENGTH BITS RRC RRC ADI '5' CALL COUT RET PAGE PARITY: ;GET PARITY CHECK FOR SERIAL PORT ;ENTRY ;NONE ;EXIT ;NONE PROC CALL PARIT1 ;DISPLAY PARITY CHECK :1: LDK B,'C'+1 ;GET OPTION CALL GETCHR CPI CR ;DONE IF CR ENTERED JZ DOIT ;YES LDK HL,SBYTE SUB 'A' JZ :2 SBIT 4,[HL] ;PARITY ENABLED CPI 1 ;IS ODD ? JZ :3 ;YES- SBIT 5,[HL] ;EVEN PARITY JMP :4 :2: CBIT 4,[HL] ;DISABLE PARITY JMP :4 :3: CBIT 5,[HL] ;ODD PARITY :4: CALL PARIT2 ;DISPLAY CURRENT OPTION JMP :1 PAGE PARIT1: ;DISPLAY PARITY CHECK OPTION ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,PARISCR ;DISPLAY PARITY OPTION CALL PRINT PARIT2: LDK HL,BAUDPOS ;POSITION CURSOR CALL CPARIT ;DISPLAY CURRENT PARITY CHECK LDK B,24 ;DECIMAL LINE NUMBER LDK C,63 ;DECIMAL COLUMM NUMBER CALL SETCUR RET CPARIT: ;DISPLAY CURRENT PARITY CHECK ;ENTRY ;HL = CURSOR POSITION ;EXIT ;NONE CALL PRINT ;OUTPUT CURSOR POSITION LD A,SBYTE ;DISPLAY CURRENT CHAR. LENGTH LDK HL,NOPARI BIT 4,A JZ :1 ;NO PARITY LDK HL,ODPARI ;DISPLAY ODD PARITY BIT 5,A JZ :1 ;ODD PARITY LDK HL,EVPARI :1: CALL PRINT RET NOPARI: DB 'NONE',0 ODPARI: DB 'ODD ',0 EVPARI: DB 'EVEN',0 PAGE STOPBT: ;GET STOP BIT FOR SERIAL PORT ;ENTRY ;NONE ;EXIT ;NONE PROC CALL STOPB1 ;DISPLAY STOP BIT :1: LDK B,'C'+1 ;GET OPTION(A TO C) CALL GETCHR CPI CR ;DONE IF CR ENTERED JZ DOIT SUB 40H RRC A RRC A MOV B,A LD A,SBYTE ;UPDATE SBYTE ANI 3FH OR B STO A,SBYTE CALL STOPB2 ;DISPLAY CURRENT OPTION JMP :1 PAGE STOPB1: ;DISPLAY STOP BIT OPTIONS ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,STPBSCR ;DISPLAY PARITY OPTION CALL PRINT STOPB2: LDK HL,BAUDPOS ;POSITION CURSOR CALL CSTPBT ;DISPLAY CURRENT STOP BITS LDK B,24 ;DECIMAL LINE NUMBER LDK C,60 ;DECIMAL COLUMM NUMBER CALL SETCUR RET PAGE CSTPBT: ;DISPLAY CURRENT STOP BITS ;ENTRY ;HL = CURSOR POSITION ADDRESS ;EXIT ;NONE CALL PRINT LD A,SBYTE ;DISPLAY CURRENT STOP BITS ANI 0C0H LDK HL,ONEBIT ;DISPLAY PARITY OPTION CPI 40H ;IS 1 BIT ? JZ :1 ;YES- LDK HL,ONEHBT ;IS 1.5 BIT ? CPI 80H JZ :1 LDK HL,TWOBIT ;IS TWO BIT ? CPI 0C0H JZ :1 ;YES- LDK HL,INVAID ;INVAILD :1: CALL PRINT RET ONEBIT: DB '1 ',0 ONEHBT: DB '1.5 ',0 TWOBIT: DB '2 ',0 INVAID: DB 'INVALID',0 SETCUR: ; SET CURSOR POSITION ;ENTRY ;B = DECIMAL LINE NUMBER ;C = DECIMAL COLUMM NUMBER ;EXIT ;NONE LDK A,ESC CALL COUT LDK A,'=' CALL COUT MOV A,B ;GET DECIMAL LINE NUMBER ADI 32 CALL COUT MOV A,C ;GET DECIMAL COLUMM NUMBER ADI 32 CALL COUT RET PAGE BAUDRT: ;GET BAUD RATE FOR SERIAL PORT ;ENTRY ;NONE ;EXIT ;NONE PROC CALL BAUD1 ;DISPLAY CURRENT OPTION :1: LDK B,'Q'+1 CALL GETCHR ;GET RESPONCE BETWEEN A AND P CPI CR JZ DOIT ;DONE IF CR ENTERED SUI 'A' ;GET BAUD RATE CODE STO A,BRATE ;SAVE BAUD RATE CODE CALL BAUD2 ;DISPLAY CURRENT OPTION JMP :1 PAGE BAUD1: ;GET BAUD RATE SELECTION ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,BAUDSCR ;FILL IN SCREEN DISPLAY CALL PRINT BAUD2: LD A,BRATE CALL GASCBAUD ;STORE ASCII NUMBER IN ASCBAUD LDK HL,BAUDPOS ;POSITION CURSOR CALL PRINT LDK HL,ASCBAUD ;DISPLAY CURRENT BAUD RATE SETTIN G CALL PRINT LDK B,24 ;set new cursor position LDK C,60 CALL SETCUR RET PAGE GASCBAUD: ;GET ASCII VALUE FOR GIVEN BAUD CODE ;ENTRY ;A = BAUD CODE ;EXIT ;ASCBAUD = ASCII VALUE (5 BYTES TOTAL) PROC ;GET BC = 5 * BAUDCODE (TABLE OFFSET) MOV B,A ;SAVE A ADD A,A ;* 2 ADD A,A ;* 4 ADD A,B ;* 5 MOV C,A LDK B,0 ;BC = 5 * BAUD CODE ;FIND TABLE ENTRY LDK HL,BAUDTBL ADD HL,BC ;MOVE TO ASCBAUD LDK DE,ASCBAUD LDK BC,5 LDIR RET PAGE CRSCTL: ;ARROW KEYS PROC LD A,ARKEY ;GET CURSOR CONTROL VALUE 0=CPM FFH=WS CMA STO A,ARKEY LDK BC,4 LDK DE,CPMCUR LD HL,INXTBL+20 OR A JZ :10 LDK DE,WSCUR :10: EX HL,DE LDIR CALL CAROWK ;DISPLAY CURRENT ARROW KEY JMP INP1 PAGE FUNKEY: PROC LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT CALL BITES ;PRINT bytes remaining :INP: LDK HL,FMENU CALL PRINT ;Print function key menu LDK HL,FPMT2 CALL PRINT CALL FKYTBL LDK HL,FPMT CALL PRINT GETNO: LDK HL,EDBUFR ;Initialize first edit char to 00h XRA A ;for printing delimiter STO A,[HL] CALL CIN CPI CR JZ DOIT CMP '0' JC GETNO CMP '9'+1 JNC GETNO STO A,FUN_NO SUI '0' MOV C,A ;Save FUNKEY# in C PUSH BC MOV B,A PUSH HL CALL GETADD POP HL ;Throw away address just need length CALL BITEIT PUSH HL LDK HL,FPMT3 CALL PRINT LDK HL,FUNSTR CALL PRINT POP HL ;4000H in HL (edit buffer start) :LOOP: CALL CIN CMP ESC JZ :DONCHK CMP 'H'-40H JNZ :10 MOV A,L ;Test if at beginning of edit buffer CMP 0 JZ :LOOP LDK C,1 ;Incremnt bytes remaining CALL BITEIT DEC HL LD A,[HL] PUSH HL CALL ERACHK POP HL JMP :LOOP :DONCHK: DEC HL CMP [HL] INC HL JZ :20 MOV B,A ;Save char LD A,REMAIN ;Check for last possible char CMP 1 MOV A,B JZ :30 ;Not last char :10: STO A,[HL] INC HL LDK C,-1 CALL BITEIT LD A,REMAIN OR A JNZ :LOOP POP BC JMP :DONE :20: PUSH HL CALL ERACHK  POP HL DEC HL :30: XRA A CMP L ;Check for no character input POP BC JZ FUNKEY :DONE: MOV H,C PUSH HL ;Save edited length in L PUSH HL ;and funkey # in H PUSH HL MOV B,C CALL GETADD ;Get address and length of current key POP DE ;recover edited length PUSH HL ;Save current key start address MOV A,E ;New length in A SUB C ;Old length in C JZ MOVEIT ;Three pushes on stack LD HL,INXTBL+28 ;Get end of table pointer POP DE ;Get current key start address PUSH HL ;Save old end of table JC LESS SBC HL,DE ;Bytes to transfer in HL PUSH HL POP BC ;Bytes to transfer in BC POP DE ;get end of table LDK H,0 MOV L,A ADD HL,DE ;HL = new end of table EX HL,DE ;DE = New end of table LDDR ;do transfer JMP TBLMOV LESS: ;DE has current key address POP HL ;BC has byte transfer count LDK B,0 EX HL,DE ADD HL,BC ;END OF TABLE IN DE, SOURCE ADDRESS FOR LDIR IN HL PUSH HL EX HL,DE SBC HL,DE PUSH HL POP BC LDK D,0FFH MOV E,A POP HL PUSH HL ADD HL,DE EX HL,DE POP HL LDIR LDK B,0FFH TBLMOV: ;stack has top=funkey# & new key length POP DE ;bottom=funkey# & new key length MOV C,A ;Length difference in C reg LDK IX,XLTBL MOV A,D ;Get address to modify INC A ;Funkey+1 PUSH AF ;Save A for counter ADD A LDK D,0 MOV E,A POP AF ;Restore couter ADD IX,DE ;Form pointer into table :LOOP1: LD L,[IX+0] LD H,[IX+1] ADD HL,BC ;Adjust pointers for different STO L,[IX+0] ;length key STO H,[IX+1] INC IX ;Change DE to get INC IX ;next key address INC A ;Increment loop counter CMP 15 ;Are we done? JNZ :LOOP1 ;No do it again JMP MOVE MOVEIT: POP BC POP BC ;Throw away top two stack elements MOVE: CALL MOVXLT ;Make memory image table POP BC ;Entry with one element on stack LDK IX,INXTBL ;top=funkey# & new key length MOV A,B ADD A LDK D,0 MOV E,A ADD IX,DE LD E,[IX+0] LD D,[IX+1] LDK HL,EDBUFR ;source in HL destination in DE LDK B,0 ;Byte count in BC LDIR JMP FUNKEY ERACHK: PROC CMP ' ' JNC :ERA1 CMP CR JZ ERA4 CMP ESC JNZ ERA2 CALL ERA1 ERA4: CALL ERA1 CALL ERA1 ERA2: CALL ERA1 :ERA1 CALL ERA1 RET PAGE BITES: PROC PUSH HL ;Save edit buffer address LD DE,INXTBL+28 LDK HL,TBLEND SBC HL,DE MOV A,L STO A,REMAIN LDK C,0 POP HL BITEIT: PUSH HL PUSH BC ;If call was from BITES (C=0) early exit LD A,REMAIN ADD C STO A,REMAIN LDK HL,BYTCNT CALL CHTOASC STO ' ',[HL] ;Change last string char LDK HL,FNOB CALL PRINT POP BC XRA A CMP C JZ :ENDF LDK HL,FINPOS CALL PRINT LDK HL,FUNSTR CALL PRINT XRA A ;Print delimiter in edit buffer POP HL STO A,[HL] PUSH HL LDK HL,EDBUFR AGAIN: LD A,[HL] OR A JZ :ENDF CALL FOUT INC HL JMP AGAIN :ENDF: POP HL RET PAGE SELPRT: ;SELECT PRINTER PROC ;PRINT SCREEN CALL SELPR1 ;DISPLAY CURRENT OPTIOPN :1: LDK B,'D'+1 CALL GETCHR ;GET A CH ARACTER CPI CR JZ DOIT ;Return to printer menu SUI 'A' ;FORM OFFSET STO A,PRIN LDK HL,:PTBL CALL OFFSET ;HL = TABLE ADDRESS + OFFSET XRA A ;INITIAL VALUE FOR PROTOCOL JMP [HL] :PTBL: DW STNSER ;JUMP TABLE DW ETX DW XON DW CENTR :2: CALL SELPR2 JMP :1 PAGE SELPR1: ;DISPLAY CURRENT OPTION ;ENTRY ;NONE ;EXIT ;NONE LDK HL,IMSG1 ;CLEAR SCREEN EXCPET HEADER CALL PRINT LDK HL,PSCRN ;DISPLAY OPTION CALL PRINT SELPR2: LDK HL,SSPOS ;Position cursor CALL PRINT LD A,PRIN ;CALCULATE OFFSET LDK HL,PMESS ;DISPLAY CURRENT OPTION CALL PRTBL LDK B,24 ;LINE 24 LDK C,58 ;COLUMM 67 CALL SETCUR RET ;SET IOBITE AND PRNTER CENTR: LDK C,80H JMP STORP XON: INC A ETX: INC A STNSER: LDK C,40H ;STORE IOBITE AND PRNTER STORP: STO A,PRNTER MOV A,C STO A,IOBITE JMP :2 PAGE PRINIT: ;CONFIGURE UP TO PIMAX BYTES FOR PRINTER INITIALIZATION ;ENTRY ;NONE ;EXIT ;NONE PROC ;PRINT PROMPT CALL PRSCR ;PRINT SCREEN LDK HL,IPMT CALL PRINT ;PRINT PROMPT CALL EDITPI ;EDIT JMP DOIT ;RETURN TO PRINTER MENU PAGE ITABLE: ;OUTPUT PRINTER INITIALIZATION TABLE ;ENTRY ;HL = ADDRESS OF CURSOR POSITONING STRING ;EXIT ;NONE PROC ;POSITION CURSOR PUSH HL ;SAVE CURSOR POSITION CALL PRINT ;POSITION CURSOR LDK HL,CLELIN CALL PRINT ;CLEAR FIRST LINE POP HL PUSH HL CALL PRINT ;POSITION CURSOR LDK HL,LINEF CALL PRINT LDK HL,CLELIN CALL PRINT ;CLEAR SECOND LINE POP HL PUSH HL CALL PRINT ;POSITION CURSOR POP DE ;RESTORE CURSOR POSITION TO DE ;CHECK FOR EMPTY STRING LDK HL,PINIT LD A,[HL] ORA A RZ INC HL ;HL = ADDRESS OF FIRST BYTE MOV B,A ;B = # OF BYTES TO PRINT LDK C,0 ;C = # OF BYTES PRINTED SO FAR ;PRINT CHARACTERS :LOOP: PUSH HL ;SAVE BYTE ADDRESS LD A,[HL] CALL IOUT POP HL ;RESTORE BYTE ADDRESS INC HL ;NEXT BYTE ;CHECK IF DONE DEC B ;B = # OF BYTES TO PRINT JZ :DONE ;CHECK IF IT'S TIME TO GO DOWN TO NEXT LINE INC C ;C = # OF BYTES PRINTED SO FAR MOV A,C CPI PIMAX / 2 CZ NEXTLINE ;GO DOWN TO NEXT LINE AFTER HALF OF MAX BYTES PRINTED JMP :LOOP ;WHEN DONE, ERASE LAST COMMA :DONE: LDK HL,ERACOM CALL PRINT RET PAGE NEXTLINE: ;POSITION CURSOR ON NEXT LINE ;ENTRY ;DE = ORIGINAL CURSOR POSITION ;EXIT ;HL,DE PRESERVED PUSH DE EX DE,HL CALL PRINT ;POSITION IN ORIGINAL SPOT LDK HL,LINEF CALL PRINT EX DE,HL POP DE RET PAGE IOUT: ;OUTPUT A PRINTER INITIALIZATION BYTE ;ENTRY ;A = BYTE ;EXIT ;NONE PROC CALL HEX2ASC ;PRINT BYTE LDK HL,PISTR CALL PRINT ;PRINT "H, " RET PAGE HEX2ASC: ;CONVERT HEX BYTE TO TWO ASCII BYTES ;ENTRY ;A = BYTE ;EXIT ;ASCII BYTE PRINTED PROC PUSH AF SRL A SRL A SRL A SRL A CALL ONEASC ;GET ONE ASCII CHAR CALL COUT ;PRINT IT POP AF CALL ONEASC ;GET OTHER ASCII CHAR CALL COUT RET PAGE ONEASC: ;CONVERT NIBBLE TO ONE ASCII BYTE ;ENTRY ;A = BYTE TO CONVERT ;EXIT ;A = CONVERTED BYTE PROC ANI 0FH ;GET LOWER NIBBLE CPI 0AH JC :DIGIT ADI 'A' - 0AH ;CONVERT TO LETTER RET :DIGIT: ADI '0' ;CONVERT TO DIGIT RET PAGE EDITPI: ;EDIT PRINTER INITIALIZATION STRING ;ENTRY ;NONE ;EXIT ;NONE PROC ;POSITION CURSOR LDK HL,PIPOS CALL PRINT ;INITIALIZE VERTPOS AND HORPOS XRA A STO A,VERTPOS STO A,HORPOS ;EDIT :NEXT: CALL GETCHAR ;GET A CHARACTER CPI CR RZ ;RETURN IF ESC ENTERED ;CHECK FOR DELETE CPI 'X' JZ :DEL ;CHECK FOR ARROW KEYS CPI 'H'-40H JZ :BACKSP CPI 'L'-40H JZ :FORWARD CPI ' ' JZ :FORWARD CPI 'J'-40H JZ :DOWN CPI 'K'-40H JZ :UP ;HANDLE NUMBER KEY CALL CHROUT ;PRINT CHAR CALL SAVECH ;STORE CHANGE IN PRINTER INIT STRING CALL CKCOUNT ;CHECK AND UPDATE BYTE COUNT CALL UPDATECUR ;POSITION CURSOR FOR NEXT BYTE JMP :NEXT ;GET NEXT BYTE PAGE :BACKSP: LDK HL,HORPOS MOV A,M ORA A JZ :B1 ;DON'T BACKSPACE IF AT BEGINNING OF LINE DEC [HL] ;DECREASE HORIZONTAL POSITION COUNTER LDK HL,BACK4 ANI 1 JZ :PR ;IF HIGH NIBBLE, BACKSPACE 4 SPACES LDK HL,BACK1 ;IF LOW NIBBLE, BACKSPACE 1 SPACE JMP :PR :B1: LDK HL,VERTPOS MOV A,M ORA A JZ :NEXT ;IF IN FIRST POSITION, DON'T BACKSPACE DEC [HL] ;IF IN 1ST SPOT IN LAST LINE, GO TO END OF 2ND LINE LDK A,PIMAX-1 STO A,HORPOS CALL SPACEOVER JMP :NEXT :FORWARD: CALL UPDATECUR JMP :NEXT :DOWN: LDK HL,VERTPOS MOV A,M ORA A JNZ :NEXT ;DON'T GO DOWN IF ON BOTTOM LINE INC [HL] ;NEXT LINE CALL VALBYT ;CHECK IF OK TO MOVE HERE JNC :1 ;IF OK DEC [HL] JMP :NEXT ;RESTORE VERTPOS, DON'T MOVE :1: LDK HL,LINEF ;IF OK, GO DOWN JMP :PR :UP: LDK HL,VERTPOS MOV A,M ORA A JZ :NEXT ;DON'T GO UP IF ON TOP LINE DEC [HL] ;UP A LINE LDK HL,LINEUP JMP :PR PAGE :DEL: CALL BYTNUM ;GET BYTE NUMBER MOV C,A LD A,PINIT CMP C JC :NEXT ;IF NOTHING TO DELETE M OV A,C PUSH AF CALL MOVEUP ;DELETE IN PRINT STRING POP AF CALL DISPDEL ;DELETE ON SCREEN JMP :NEXT :PR: CALL PRINT JMP :NEXT ;GET NEXT CHARACTER PAGE UPDATECUR: ;MOVE CURSOR TO NEXT EDITING POSITION ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,HORPOS MOV A,M ;A = HORIZONTAL POSITION CPI PIMAX-1 JZ :EOLN ;IF AT END OF LINE INC [HL] MOV B,A ;SAVE OLD HORIZONTAL POSITION CALL VALBYT ;CHECK IF OK TO MAKE MOVE JNC :1 ;IF OK DEC [HL] RET :1: MOV A,B ;A = OLD HORIZONTAL POSITION LDK HL,FOR1 ANI 1 JZ :PR ;IF HIGH NIBBLE, GO FORWARD ONE SPACE LDK HL,FOR4 ;IF LOW NIBBLE, GO FORWARD FOUR SPACES JMP :PR :EOLN: LDK HL,VERTPOS LD A,[HL] ORA A JZ :2 ;IF ON TOP LINE LDK HL,PRINH CALL PRINT RET :2: INC [HL] ;GO TO NEXT LINE XRA A STO A,HORPOS ;FIRST SPOT IN LINE CALL VALBYT ;CHECK IF OK TO GO TO NEW POSITION JNC :3 ;IF OK DEC [HL] ;RESTORE VERTICAL POSITION LDK A,PIMAX-1 STO A,HORPOS ;RESTORE HORIZONTAL POSITION RET :3: LDK HL,FOR4 ;PRINT "H, " FOR LAST CHAR ON TOP LINE CALL PRINT LDK HL,PIPOS CALL PRINT LDK HL,LINEF :PR: CALL PRINT RET PAGE SAVECH: ;SAVE CHARACTER IN PRINTER INITIALIZATION STRING ;ENTRY ;A = CHARACTER ;EXIT ;NONE PROC ;CONVERT CHARACTER TO HEX CALL ASC2HEX ;CONVERT TO HEX PUSH AF ;SAVE CHAR ;CALCULATE BYTE NUMBER CALL BYTNUM ;DECIDE WHICH NIBBLE TO CHANGE CALL CALADDR ;HL = BYTE ADDRESS LD B,[HL] ;B = OLD BYTE VALUE LD A,HORPOS ANI 1 ;SET FLAGS MOV A,B ;A = OLD BYTE VALUE JZ :HIGH ;CHANGE HIGH NIBBLE ;CHANGE LOW NIBBLE ANI 0F0H ;GET RID OF LOW NIBBLE MOV B,A POP AF JMP :EX ;SAVE AND EXIT ;CHANGE HIGH NIBBLE :HIGH: ANI 0FH ;GET RID OF HIGH NIBBLE MOV B,A POP AF SLA A SLA A SLA A SLA A ;MOVE NEW CHAR TO HIGH NIBBLE :EX: ORA B ;NEW BYTE STO A,[HL] ;SAVE IN PRINTER INITIALIZATION STRING RET PAGE CKCOUNT: ;CHECK AND UPDATE BYTE COUNT ;ENTRY none ;EXIT none PROC CALL BYTNUM ;A = BYTE NUMBER LDK HL,PINIT CMP [HL] RZ RC ;UPDATE BYTE COUNT INC [HL] LD A,HORPOS ANI 1 RNZ ;IF NOT ON HIGH NIBBLE LDK HL,PRZERO CALL PRINT ;PRINT ZERO IN LOW NIBBLE POSITION RET PAGE VALBYT: ;VALIDATE BYTE -- CHECK IF NEW BYTE EDITING POSITION IS VALID ;ENTRY ;VERTPOS AND HORPOS SET TO NEW BYTE POSITION ;EXIT ;C FLAG SET IF INVALID POSITION PROC PUSH BC PUSH HL CALL BYTNUM MOV B,A ;B = BYTE NUMBER LD A,PINIT INC A ;A = LAST SET BYTE + 1 CMP B JNZ :EX ;RETURN CARRY SET IFF POSITION TOO FAR ;ZERO OUT NEXT BYTE IF BYTE = LAST SET + 1 CALL CALADDR ;GET BYTE'S ADDRESS XRA A STO A,[HL] ORA A ;RESET :EX: POP HL POP BC RET PAGE DISPDEL: ;DISPLAY NEW SCREEN AFTER BYTE DELETED ;ENTRY ;A = BYTE NUMBER ;EXIT ;NONE PROC MOV B,A PUSH BC ;B = BYTE DELETED ;PRINT OUT NEW DISPLAY LDK HL,PIPOS CALL ITABLE POP BC ;B = BYTE DELETED  LDK HL,PIPOS CALL PRINT ;REPOSITION CURSOR LD A,PINIT ORA A JNZ :1 ;IF > 0 BYTES STO A,HORPOS ;MAKE SURE HORPOS IS 0 RET ;NO REPOSITIONING IF 0 BYTES :1: CMP B ;IF SAME SPOT IS STILL OK JNC :OK ;REPOSITION TO SAME SPOT ;IF NOT, MOV B,A ;REPOSITION TO LAST BYTE'S SPOT LDK HL,VERTPOS LDK C,0 MOV M,C ;INITIALIZE VERTPOS TO 0 CPI PIMAX / 2 + 1 JC :HOR ;IF ON 1ST LINE SUI PIMAX / 2 LDK C,1 ;SECOND LINE MOV M,C :HOR: SLA A DEC A STO A,HORPOS ;HORPOS = BYTE NUMBER * 2 - 1 :OK: CALL SPACEOVER ;MOVE TO HORPOS,VERTPOS XRA A RET PAGE SPACEOVER: ;MOVE OVER TO HORPOS AND VERTPOS ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,PIPOS CALL PRINT LD A,VERTPOS ORA A JZ :1 ;IF NOT DOWN LDK HL,LINEF CALL PRINT :1: LD A,HORPOS ORA A RZ ;IF NO NEED TO MOVE OVER ;MOVE OVER TO HORIZONTAL POSITION MOV B,A :2: LDK HL,FOR1 ;MOVE OVER TO NEXT SPOT CALL PRINT DEC B RZ LDK HL,FOR4 CALL PRINT  DJNZ :2 RET PAGE MOVEUP: ;AFTER A DELETION, MOVE UP REMAINING BYTES IN PRINTER INITIALIZATION STRING ;ENTRY ;C = BYTE NUMBER DELETED ;EXIT ;NONE PROC LDK HL,PINIT ;A = TOTAL NUMBER OF BYTES LD A,[HL] DEC [HL] ;ONE LESS BYTE NOW SUB C ;A - C = # OF BYTES TO MOVE UP RZ PUSH AF MOV A,C CALL CALADDR ;HL = ADDRESS OF DELETED BYTE POP AF MOV C,A ;BC = # OF BYTES TO BE MOVED LDK B,0 PUSH HL POP DE ;DE = ADDRESS OF DELETED BYTE INC HL ;HL = NEXT SPOT LDIR ;MOVE UP RET PAGE BYTNUM: ;CALCULATE BYTE NUMBER FOR CURRENT EDITING POSITION ;ENTRY ;NONE ;EXIT ;A = BYTE NUMBER PROC PUSH BC LD A,VERTPOS ORA A JZ :1 ;IF FIRST LINE, A = 0 LDK A,PIMAX / 2 ;IF SECOND LINE, A= # OF BYTES IN FIRST LINE :1: MOV B,A ;SAVE BYTE NUMBER SO FAR LD A,HORPOS SRL A INC A ;# OF BYTES ON THIS LINE = HORPOS/2 + 1 ADD B ;A = NUMBER OF BYTES POP BC RET PAGE CALADDR: ;CALCULATE ADDRESS OF BYTE IN PRINTER INITIALIZATION TABLE ;ENTRY ;A = BYTE NUMBER ;EXIT ;HL = BYTE ADDRESS PROC LDK HL,PINIT MOV E,A ;A = OFFSET LDK D,0 ADD HL,DE ;HL = ADDRESS RET PAGE CHROUT: ;OUTPUT CHARACTER WITHOUT CHANGING CURSOR POSITION ;ENTRY ;A = CHARACTER ;EXIT ;A = CHARACTER PROC PUSH AF PUSH HL CALL COUT LDK HL,BACK1 CALL PRINT POP HL POP AF RET PAGE GETCHAR: ;GET A VALID HEX CHARACTER ;ENTRY ;NONE ;EXIT ;A = '0'-'9', 'A'-'F', CR, ' ', ^H, ^J, ^K, ^L, OR 'X' PROC :1: CALL CIN CPI CR RZ CPI ' ' RZ CPI 'H'-40H JC :1 ;IF NOT A VALID CHARACTER CPI 'I'-40H JZ :1 ;NOT VALID CPI 'L'-40H + 1 RC ;RETURN ^H,^J,^K,^L CPI '0' JC :1 ;IF NOT A HEX CHAR CPI '9' + 1 RC ;RETURN IF DIGIT ANI 5FH ;MAKE UPPER CASE CPI 'X' RZ CPI 'A' JC :1 ;IF NOT A HEX CHAR CPI 'F' + 1 JNC :1 ;IF NOT A HEX CHAR RET ;RETURN IF HEX CHAR PAGE ASC2HEX: ;CONVERT ASCII CHAR 0-9, A-F TO HEX VALUE ;-- NO ERROR CHECKING DONE HERE ;ENTRY ;A = ASCII CHAR ;EXIT ;A = HEX VALUE PROC CPI 'A' JC :1 SUI 'A'-0AH RET ;RETURN HEX VALUE :1: SUI '0' RET ;RETURN HEX DIGIT PAGE PRSCR: ;PRINT PRINTER MENU SCREEN WITHOUT PROMPT ;ENTRY NONE ;EXIT NONE PROC LDK HL,IMSG1 ;CLEAR SCREEN EXCEPT HEADER CALL PRINT LDK HL,PMENUSCR ;PRINT SCREEN CALL PRINT CALL PDISPLAY ;PRINT CURRENT VALUE RET PAGE DISPLAY: ;This routine will display current settings PROC ;Print current printer LDK HL,PRPOS CALL PRINT ;POSITION CURSOR LD A,PRIN LDK HL,PMESS CALL PRTBL ;PRINT CURRENT PRINTER ;Print current baud rate LDK HL,BRPOS ;Position cursor at current baud rate CALL PRINT LDK HL,ASCBAUD CALL PRINT ;Print current cursor keys CALL CAROWK ;DISPLAY CURRENT ARROW KEY ;Print function keys LDK HL,FKPOS CALL PRINT ;POSITION CURSOR CALL FKYTB1 ;PRINT TABLE UP TO 20 CHAR / LINE LDK HL,CLPOS CALL PRINT ;SET CURSOR POSITION CALL CCHRLN ;CURRENT CHAR. LENGTH LDK HL,PCPOS CALL PRINT CALL CPARIT ;CURRENT PARITY CHECK LDK HL,SBPOS CALL PRINT CALL CSTPBT LDK HL,PIMPOS CALL ITABLE RET CAROWK: ;DISPLAY CURRENT ARROW KEYS LDK HL,AKPOS CALL PRINT LD A,ARKEY OR A LDK HL,CPMKEY JZ :40 LDK HL,WSKEY :40: CALL PRINT RET PAGE PDISPLAY: ;PRINT PRINTER DISPLAY OF CURRENT PRINTER SETTINGS ;ENTRY ;NONE ;EXIT ;NONE PROC ;PRINT CURRENT PRINTER INITIALIZATION LDK HL,PIPOS ;CURSOR POSITION CALL ITABLE ;PRINT TABLE RET PAGE FKYTBL: ;PRINT FUNCTION KEY TABLE PROC LDK HL,SWINDO CALL PRINT ;SET WINDOW LDK C,10 LDK B,0 :LOOP: CALL FPRINT DEC C JZ :DONE INC B JMP :LOOP :DONE: LDK HL,RWINDO CALL PRINT ;RESET WINDOW RET PAGE FPRINT: ;DISPLAY CUURRENT FUNCTION KEY TABLE ;ENTRY ;B = function key number to print XRA A STO A,CHRNU1 ;RESET CHRACTER IN LINE COUNTER PUSH BC ;Preserve outside enviorment MOV A,B ;get key number ADD A,'0' ;and convert to ascii char STO A,FUN_NO LD A,FUNLEN ;Previous function key display was CPI 73 ; up to end of line ? JZ :1 ;yes- don't display crlf LDK HL,PCRLF ;OUTPUT CR, LF CALL PRINT ;Print funkey prompt :1: LDK HL,FUN_NO CALL PRINT CALL GETADD ;Get address and length of FUNKEY MOV A,C STO A,FUNLEN ;Save length of funkey PRTIT: LD A,[HL] CALL FOUT2 INC HL DEC C JNZ PRTIT POP BC RET FUNLEN: DB 0 ;FUNKEY LENGTH PAGE FKYTB1: ;PRINT FUNCTION KEY TABLE UP TO 20 CHARACTER PER LINE PROC LDK C,10 LDK B,0 :LOOP: CALL FPRIN1 DEC C RZ INC B JMP :LOOP FPRIN1: ;ENTRY ;B = function key number to print PUSH BC ;Preserve outside enviorment MOV A,B ;get key number ADD A,'0' ;and convert to ascii char STO A,FUN_NO LDK HL,FUNSTR CALL PRINT ;Print funkey prompt CALL GETADD ;Get address and length of FUNKEY MOV A,C ;IS (C) > 20 ? LDK C,00H ;RESET COUNTER STO A,NUMCHR CPI 21 JC PRTI1 LDK A,20 ;YES- (C)=20 STO A,NUMCHR PRTI1: LD A,[HL] CALL FOUT1 INC HL LDK A,19 ;OUTPUT 20 CHARACTER ? CMP C JC PRTI2 ;YES- LD A,NUMCHR DEC A STO A,NUMCHR JNZ PRTI1 PRTI2: POP BC RET PAGE FOUT1: ; PROC CMP 20H JNC OUTP CMP CR JZ CRET CMP ESC JZ PESC PUSH AF LDK A,'^' CALL COUT INC C LD A,NUMCHR CMP C JNZ OUTP1 POP AF RET OUTP1: POP AF ADD A,40H OUTP: CALL COUT INC C RET ;RETURN CRET: PUSH HL ;SAVE HL LDK D,4 ;4 CHARACTER FOR LDK HL,FREVE ;OUT FIRST REVERSE VIDEO ESC CALL PRINT LD HL,RMESS CRET1: L A,[HL] CALL COUT INC HL INC C LDK A,20 CMP C ;IS OUTPUT 20 CHARACTER ? JZ CRET2 ;YES- DEC D JNZ CRET1 CRET2: LDK HL,SREVE ;OUT REVERSE VIDEO ESC CALL PRINT POP HL ;RESTORE HL RET PESC: PUSH HL LDK D,5 ;5 CHARACTER FOR LDK HL,FREVE ;OUT FIRST REVERSE VIDEO ESC CALL PRINT  LD HL,EMESS PESC1: L A,[HL] CALL COUT INC HL INC C LDK A,20 CMP C ;IS OUTPUT 20 CHARACTER ? JZ CRET2 ;YES- DEC D JNZ PESC1 JMP CRET2 PAGE FOUT2: ; PROC CMP 20H JNC OUTP3 CMP CR JZ CRET4 CMP ESC JZ PESC2 PUSH AF CALL CLINFU LDK A,'^' CALL COUT POP AF ADD A,40H OUTP3: CALL CLINFU CALL COUT RET ;RETURN CRET4: PUSH HL ;SAVE HL LDK D,4 ;4 CHARACTER FOR LDK HL,FREVE ;OUT FIRST REVERSE VIDEO ESC CALL PRINT LDK A,0FFH STO A,REVFLG ;IN REVERSE VIDEO FLAG LD HL,RMESS CRET5: L A,[HL] CALL CLINFU CALL COUT INC HL DEC D JNZ CRET5 CRET6: LDK HL,SREVE ;OUT REVERSE VIDEO ESC CALL PRINT XRA A STO A,REVFLG ;RESET IN REVERSE VIDEO FLAG POP HL ;RESTORE HL RET PESC2: PUSH HL LDK D,5 ;5 CHARACTER FOR LDK HL,FREVE ;OUT FIRST REVERSE VIDEO ESC CALL PRINT LDK A,0FFH STO A,REVFLG ;IN REVERSE VIDEO FLAG LD HL,EMESS PESC3: L A,[HL] CALL CLINFU CALL COUT INC HL DEC D JNZ PESC3 JMP CRET6 PAGE CLINFU: ;CHECK FOR LINE IS FULL PROC PUSH AF LD A,CHRNU1 ;ACTUAL OUTPUT CHARACTER NUMBER INC A STO A,CHRNU1 CPI 74 ;IS END OF LINE ? JNZ :1 ;NO- LDK A,01 ;RESET COUNTER STO A,CHRNU1 PUSH HL LD A,REVFLG ;IS IN REVERSE VIDEO ORA A PUSH AF ;SAVE FLAG JZ :2 ;NO- LDK HL,SREVE ;OUT RESET REVERSE VIDEO ESC CALL PRINT :2: LXI HL,SPACE3 ;OUTPUT 3 SPACE CALL PRINT POP AF ;IS IN REVERSE VIDEO ? JZ :3 ;NO- LDK HL,FREVE ;OUT SET REVERSE VIDEO ESC CALL PRINT :3: POP HL :1: POP AF RET PAGE FOUT: ; PROC CMP 20H JNC OUTPA CMP CR JZ CRETA CMP ESC JZ PESCA PUSH AF LDK A,'^' CALL COUT POP AF ADD A,40H OUTPA: CALL COUT RET ;RETURN CRETA: LD DE,RMESSA JMP F1A PESCA: LD DE,EMESSA F1A: EX HL,DE CALL PRINT EX HL,DE RET PAGE GETADD: ;This routine gets start address of function key and length of translation  ;ENTRY ;B = FUNKEY number ;EXIT ;C = length of translation ;HL = address of FUNKEY PROC LDK IX,INXTBL ;get table address LDK D,0 ;and form pointer MOV A,B ADD A ;to correct entry MOV E,A ADD IX,DE LD E,[IX+0] ;Get funkey address LD D,[IX+1] ;in DE LD L,[IX+2] ;and funkey+1 address LD H,[IX+3] ;in HL PUSH DE ;save address SBC HL,DE ;get length MOV C,L ;in C reg POP HL ;get start address RET PAGE MOVXLT: PROC XRA A ;CLEAR CARRY FLAG LD HL,XLTBL ;FUNCTION KEY 0 ADDRESS IN SOURCE LDK DE,FUNK0 ;FUNCTION KEY 0 ADDRESS IN LDBUFF SBC HL,DE ;OFFSET FROM LDBUFF TO SOURCE EX HL,DE ;DE = OFFSET LDK IY,XLTBL LDK IX,INXTBL LDK C,15 :35: LD L,[IY+0] LD H,[IY+1] SBC HL,DE STO L,[IX+0] STO H,[IX+1] INC IY INC IY INC IX INC IX DEC C JNZ :35 RET PAGE PRTBL: ;POINT TO PRINT MESSAGE FROM TABLE ;ENTRY ;A = INDEX TO TABLE HL=TABLE ADDRESS CALL OFFSET PRINT: LD A,[HL] OR A RZ ;RETURN IF FINISHED CALL COUT INC HL JMP PRINT PAGE GETCHR: ;GET A CHARACTER BETWEEN A AND THE VALUE IN THE B REGESTER ;ENTRY ;B = LAST CHARACTER ACCEPTABLE + 1 ;EXIT ;A = CHARACTER IN RANGE OR PROC ;GET RESPONCE PUSH BC CALL CIN POP BC CPI CR RZ ;RETURN IF ;CHECK FOR LESS THAN "A" AND 5FH ;CONVERT TO UPPER CASE CMP 'A' JC GETCHR ;LOOP IF LESS THAN "A" ;CHECK FOR >= TO B CMP B ;COMPARE WITH RANGE VALUE JNC GETCHR ;LOOP IF >= B RET PAGE OFFSET: ;CALCULATE OFFSET FROM TABLE ADDRESS ;ENTRY ;A = OFFSET IN WORDS ;HL = TABLE ADDRESS ;EXIT ;HL = CONTENTS OF (TABLE ADDRESS + OFFSET) PROC ADD A,A ;OFFSET IN BYTES MOV E,A LDK D,0 ;DE = OFFSET ADD HL,DE ;HL = OFFSET + TABLE ADDRESS LD E,M INC HL LD D,M ;DE = CONTENTS OF (TABLE ADDRESS + OFFSET) EX HL,DE RET PAGE CKQUIT: ;FIND OUT IF USER WANTS TO QUIT ;ENTRY ;HL = MESSAGE ADDRESS ;EXIT ;Z = SET IF QUIT REQUESTED PROC CALL PRINT ;PRINT MESSAGE CALL BEEP LDK B,24 ;LINE 24 LDK C,1 ;COLUMM 1 CALL SETCUR ;SET CURSOR POSITION LDK HL,CLELIN ;CLEAR LINE CALL PRINT LDK HL,QUITMES CALL PRINT ;ASK CONTINUE OR QUIT CALL CIN CMP ESC RET ;RETURN PAGE BEEP: ;BEEP FOR ERROR MESSAGE ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,BEL ;BELL CALL COUT RET PAGE COUT: ;PRINT A CHARACTER ;ENTRY ;A = CHARACTER ;EXIT ;ALL REGESTERS SAVED PROC PUSH AF ;SAVE CHARACTER PUSH BC PUSH DE PUSH HL MOV E,A ;CHARACTER IN E REG LDK C,6 ;DIRECT CONSOLE I/O CALL BDOS POP HL POP DE POP BC POP AF RET PAGE CIN: ;GET CHARACTER ;ENTRY ;NONE ;EXIT ;A = CHARACTER PROC PUSH BC PUSH DE PUSH HL :1: LDK E,0FFH ;INDICATE INPUT LDK C,6 CALL BDOS OR A JZ :1 ;LOOP IF NO CHARACTER POP HL POP DE POP BC RET PAGE ERA1: ;BACKUP AND CLEAR ONE SPACE LDK HL,ERASTR CALL PRINT RET PAGE ;Print tables PMESS: DW STANS DW ETXA DW XONX DW CENTRO CHRLSCR: ;BAUD RATE SCREEN DISPLAY DB ESC,'=',5+32,4+32,ESC,'j CURRENT CHARACTER LENGTH ',ESC,'k' DB ESC,'=', 5+32,33+32,'A ',ESC,'j 5 BITS ',ESC,'k' DB ESC,'=', 7+32,33+32,'B ',ESC,'j 6 BITS ',ESC,'k' DB ESC,'=', 9+32,33+32,'C ',ESC,'j 7 BITS ',ESC,'k' DB ESC,'=',11+32,33+32,'D ',ESC,'j 8 BITS ',ESC,'k' DB ESC,'=',23+32,4+32,'Press "A-D" to select character length or RETURN for main menu.',0 PARISCR: ;PARITY CHECK DISPLAY DB ESC,'=',5+32,4+32,ESC,'j CURRENT PARITY CHECK ',ESC,'k' DB ESC,'=', 5+32,33+32,'A ',ESC,'j NONE ',ESC,'k' DB ESC,'=', 7+32,33+32,'B ',ESC,'j ODD ',ESC,'k' DB ESC,'=', 9+32,33+32,'C ',ESC,'j EVEN ',ESC,'k' DB ESC,'=',23+32,4+32,'Press "A-C" to select parity check or RETURN for main menu.',0 STPBSCR: ;STOP BITS DISPLAY DB ESC,'=',5+32,4+32,ESC,'j CURRENT STOP BITS ',ESC,'k' DB ESC,'=', 5+32,33+32,'A ',ESC,'j 1 BIT ',ESC,'k' DB ESC,'=', 7+32,33+32,'B ',ESC,'j 1.5 BIT ',ESC,'k' DB ESC,'=', 9+32,33+32,'C ',ESC,'j 2 BIT ',ESC,'k' DB ESC,'=',23+32,4+32,'Press "A-C" to select stop bits or RETURN for main menu.',0 CLPOS: ;CHAR. LENGTH DB ESC,'=', 7+32,35+32,0 PCPOS: ;PARITY CHECK DB ESC,'=',10+32,35+32,0 SBPOS: ;STOP BITS DB ESC,'=',13+32,35+32,0 PIMPOS: DB ESC,'=',16+32,35+32,0 IMSG: DB 'Z'-40H DB ESC,'=',0+32,24+32,ESC,'j ENCORE Configuration Program ',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,'=',3+32,1+32,ESC,'Y',0 MENUSCR: ;MAIN MENU DB ESC,'=',3+32,2+32 ,'A ',ESC,'j PRINTER ',ESC,'k' DB ESC,'=',3+32,33+32,'D ',ESC,'j BAUD RATE ',ESC,'k' ; DB ESC,'=',6+32,2+32 ,'B ',ESC,'j ARROW KEYS ',ESC,'k' ; DB ESC,'=',6+32,33+32,'E ',ESC,'j CHARACTER LENGTH ',ESC,'k' ; DB ESC,'=',9+32,2+32 ,'C ',ESC,'j FUNCTION KEYS ',ESC,'k' ; DB ESC,'=',9+32,33+32,'F ',ESC,'j PARITY CHECK ',ESC,'k' ; DB ESC,'=',12+32,33+32,'G ',ESC,'j STOP BITS ',ESC,'k' ; DB ESC,'=',15+32,33+32,'H ',ESC,'j PRINTER INITIALIZATION ',ESC,'k' MNPMT: DB ESC,'=',23+32,4+32,'Press "A - H" to change values or RETURN for previous menu.',0 ;Current values display positions for main menu PRPOS: ;printer DB ESC,'=', 4+32,4+32,0 BRPOS: ;BAUD RATE DB ESC,'=', 4+32,35+32,0 ; AKPOS: ;ARROW KEYS DB ESC,'=',7+32,4+32,0 FKPOS: ;FUNCTION KEYS DB ESC,'=',9+32,4+32,0 PAGE PMENUSCR: ;PRINTER MENU DB ESC,'=',6+32,2+32,' ',ESC,'j CURRENT PRINTER INITIALIZATION ',ESC,'k',0 PSCRN: DB ESC,'=',6+32,4+32,ESC,'j CURRENT PRINTER ',ESC,'k' DB ESC,'=',6+32,31+32,'A ',ESC,'j STANDARD SERIAL ',ESC,'k' DB ESC,'=',8+32,31+32,'B ',ESC,'j ETX/ACK (QUME) ',ESC,'k' DB ESC,'=',10+32,31+32,'C ',ESC,'j XON/XOFF (DIABLO) ',ESC,'k' DB ESC,'=',12+32,31+32,'D ',ESC,'j CENTRONICS ',ESC, 'k' DB ESC,'=',23+32,4+32,'Press "A-D" to select printer or RETURN for main menu.',0 IPMT: DB ESC,'=',20+32,4+32,'Enter hexadecimal values (ie. 08)' DB ESC,'=',21+32,4+32,'Use arrow keys to position cursor' DB ESC,'=',23+32,4+32,'Press "X" to delete a byte or RETURN for main menu.',0 SSPOS: ;PRINTER POSSION DB ESC,'=',7+32,4+32,' ' DB ESC,'=',7+32,4+32,0 PIPOS: ;PRINTER INITIALIZATION STRING POSSION DB ESC,'=',7+32,4+32,0 PAGE BAUDSCR: ;BAUD RATE SCREEN DISPLAY DB ESC,'=',5+32,4+32,ESC,'j CURRENT BAUD RATE ',ESC,'k' DB ESC,'=', 5+32,33+32,'A ',ESC,'j 50 ',ESC,'k' DB ESC,'=', 6+32,33+32,'B ',ESC,'j 75 ',ESC,'k' DB ESC,'=', 7+32,33+32,'C ',ESC,'j 110 ',ESC,'k' DB ESC,'=', 8+32,33+32,'D ',ESC,'j 134.5 ',ESC,'k' DB ESC,'=', 9+32,33+32,'E ',ESC,'j 150 ',ESC,'k' DB ESC,'=',10+32,33+32,'F ',ESC,'j 200 ',ESC,'k' DB ESC,'=',11+32,33+32,'G ',ESC,'j 300 ',ESC,'k' DB ESC,'=',12+32,33+32,'H ',ESC,'j 600 ',ESC,'k' DB ESC,'=',13+32,33+32,'I ',ESC,'j 1200 ',ESC,'k' DB ESC,'=',14+32,33+32,'J ',ESC,'j 1800 ',ESC,'k' DB ESC,'=',15+32,33+32,'K ',ESC,'j 2000 ',ESC,'k' DB ESC,'=',16+32,33+32,'L ',ESC,'j 2400 ',ESC,'k' DB ESC,'=',17+32,33+32,'M ',ESC,'j 3600 ',ESC,'k' DB ESC,'=',18+32,33+32,'N ',ESC,'j 4800 ',ESC,'k' DB ESC,'=',19+32,33+32,'O ',ESC,'j 7200 ',ESC,'k' DB ESC,'=',20+32,33+32,'P ',ESC,'j 9600 ',ESC,'k' DB ESC,'=',21+32,33+32,'Q ',ESC,'j 19200 ',ESC,'k' DB ESC,'=',23+32,4+32,'Press "A-Q" to select baud rate or RETURN for main menu.',0 BAUDPOS DB ESC,'=',6+32,4+32,0 ;BAUD RATE DISPLAY POSITION FOR CURRENT VALUE PAGE FMENU: ;FUNCTION KEYS MENU DB ESC,'=',3+32,4+32,ESC,'j CURRENT FUNCTION KEYS ',ESC,'k',0 FPMT: DB ESC,'=',23+32,4+32,'Press "0-9" to program keys or RETURN for main menu.',0 DB ESC,'=',23+32,4+32,ESC,'T','Press the escape key twice to terminate input.' FINPOS: DB ESC,'=',15+32,6+32,0 FPMT2: DB ESC,'=',3+32,32+32,0 FPMT3: DB ESC,'=',15+32,0+32,ESC,'Y' DB ESC,'=',23+32,4+32,'Press the escape key twice to terminate input.' DB ESC,'=',15+32,6+32,0 FNOB: DB ESC,'=',3+32,35+32 BYTCNT: DS 3 DB ' character places remaining',0 STANS: DB 'STANDARD SERIAL ',0 ETXA: DB 'ETX/ACK (QUME) ',0 XONX: DB 'XON/XOFF (DIABLO)',0 CENTRO: DB 'CENTRONICS ',0 WSKEY: DB 'WORDSTAR',0 CPMKEY: DB 'CP/M ',0 FUNSTR: DB CR,LF,' ' FUN_NO: DS 1 DB ': ',0 PCRLF: DB CR,LF,0 FOR4: DB 'L'-40H PISTR D 'H ',0 RMESS: DB '',0 EMESS: DB '',0 RMESSA: DB ESC,'j',ESC,'k',0 EMESSA: DB ESC,'j',ESC,'k',0 FREVE: DB ESC,'j',0 SREVE: DB ESC,'k',0 CPMCUR: DB 'K'-40H,'L'-40H,'J'-40H,'H'-40H WSCUR: DB 'E'-40H,'D'-40H,'X'-40H,'S'-40H ASKGET: DB ESC,'=',8+32,4+32 ,'A ',ESC,'j GET SYSTEM FROM DRIVE A ',ESC,'k' DB ESC,'=',10+32,4+32,'B ',ESC,'j GET SYSTEM FROM DRIVE B ',ESC,'k' DB ESC,'=',12+32,4+32,'M ',ESC,'j GET SYSTEM FROM MEMORY ',ESC,'k' DB ESC,'=',23+32,4+32,ESC,'T','Press A, B, M, or RETURN to exit to CP/M.',0 ASKPUT: DB ESC,'=',8+32,4+32 ,'A ',ESC,'j SAVE SYSTEM ON DRIVE A ',ESC,'k' DB ESC,'=',10+32,4+32,'B ',ESC,'j SAVE SYSTEM ON DRIVE B ',ESC,'k' DB ESC,'=',12+32,4+32,'M ',ESC,'j SAVE SYSTEM IN MEMORY ',ESC,'k' DB ESC,'=',14+32,4+32,'R ',ESC,'j RETURN TO MAIN MENU ',ESC,'k' ASKPU1: DB ESC,'=',23+32,4+32,'Press A, B, M, R, or RETURN to exit to CP/M.',0 GETMSG: DB ESC,'=',23+32,4+32,'Put SOURCE diskette in drive ' DB ESC,'j ' GDISK: DB ' ' DB ESC,'k' DB ' then press RETURN.',0 PUTMSG: DB ESC,'=',23+32,4+32,'Put DESTINATION diskette in drive ' DB ESC,'j ' PDISK: DB ' ' DB ESC,'k' DB ' then press RETURN.',0 RDSYS: DB ESC,'=',20+32,4+32,'READING SYSTEM',ESC,'Y',0 WRTSYS: DB ESC,'=',20+32,4+32,'WRITING SYSTEM',ESC,'Y',0 NONOSB: DB ESC,'=',20+32,4+32,'Can only set up OSBORNE disks' DB ESC,'=',20+32,4+32,'Insert an Osborne disk and retry.',0 READERR: DB ESC,'=',20+32,4+32,ESC,'j READ ERROR ',ESC,'k on source diskette.',0 WRERR: DB ESC,'=',20+32,4+32,ESC,'j WRITE ERROR ',ESC,'k on destination diskette.',0 WRERR1: DB ESC,'=',20+32,4+32,ESC,'j WRITE PROTECTED ',ESC,'k on destination diskette.',0  BSYSD: DB ESC,'=',20+32,4+32,'No SYSTEM in the diskette.',0 BADVER: DB ESC,'=',20+32,4+32,'INCORRECT SOURCE version.',0 QUITMES: DB ESC,'=',23+32,4+32,'Press ESC to exit to CP/M or any other key to retry.',0 CLEEPG: DB ESC,'Y',0 ;CLEAR TO END OF PAGE CLELIN: DB ESC,'T',0 ;CLEAR TO END OF LINE ERACOM: DB 'H'-40H ERASTR: DB 'H'-40H,' ','H'-40H,0 PRINH: DB 'L'-40H,'H','H'-40H,'H'-40H,0 BACK4: DB 'H'-40H,'H'-40H,'H'-40H BACK1: DB 'H'-40H,0 FOR1: DB 'L'-40H,0 LINEF: DB LF,0 LINEUP: DB 'K'-40H,0 PRZERO: DB 'L'-40H,'0','H'-40H,'H'-40H,0 PAGE SWINDO: DB ESC,'z',1,4+32,4+32,22+32,79+32,0 RWINDO: DB ESC,'z',1,0+32,0+32,23+32,79+32,0 SPACE3: DB ' ',0 BAUDTBL: ;TABLE OF ASCII VALUES FOR BAUD RATE CODE DB '50 ' ;CODE 0 = 50 BAUD DB '75 ' ;CODE 1 DB '110 ' ; 2 DB '134.5' ; 3 DB '150 ' ; 4 DB '200 ' ; 5 DB '300 ' ; 6 DB '600 ' ; 7 DB '1200 ' ; 8 DB '1800 ' ; 9 DB '2000 ' ; 10 DB '2400 ' ; 11 DB '3600 ' ; 12 DB '4800 ' ; 13 DB '7200 ' ; 14 DB '9600 ' ; 15 DB '19200' ; 16 ASCBAUD DB ' ',0 ;5 CHARACTER ASCII BAUD RATE + 0 TO MARK END OF STRING ;Variables NUMCHR: DS 1 ;# OF CHARACTER FOR EACH FUNC. KEY CHRNU1: DS 1 ;# OF CHARACTER OUTPUT FOR EACH LINE REVFLG: DS 1 ;REVERSE VIDEO FLAG RW: DS 1 ;READ IF 0, WRITE IF 1 PRIN: DS 1 ARKEY: DS 1 HORPOS: DS 1 ;HORIZONTAL POSITION IN PRINT INITIALIZATION VERTPOS DS 1 ;VERTICAL POSITION IN PRINT INITIALIZATION TABOFF: DS 2 REMAIN: DS 1 TEMPAR: DS 4 ;TEMPORARY ARROW KEYS INXTBL: DS 30 ; END 1,0+32,0+32,23+32,79+32,0 SPACE3: DB ' ',0 BAUDTBL: ;TABLE OF ASCII VALUES FOR BAUD RATE CODE DB '50 ' ;CODE 0 = 50 BAUD DB '75 ' ;CODE 1 DB '110 ' ; 2 DB '134.5' ; 3 DB '150 ' ; 4 DB '200 ' ; 5 DB '300 ' ; 6 DB '600 ' ; 7 DB '1200 ' ; 8 DB '1800 ' ; 9 DB '2000 ' ; 10 DB '2400 ' ; 11 DB '3600 ' ; 12 DB '4800 1?!| O _: :>Vx!ͤ G!RV[^#V!!!RV[^#V!ڨWy'OxGzÕ''Oxʹ0w#y0w#y0w#6:g.@R"!2| !| G_MHAB2HA2!$| !| 26!ͤ G:@!ͤ G *@!2| !o| G_MR|AʆBd2A2!`| ”!| ͇2»͓!6@!;!jͤ GX!| :?!9V2>O>=@I !@">2t$!| <:??HG>'GzH>J2yȐWAO:fj":V[5Rʻ!5nfut## ¦!59V!>V*9V![nfut##:9V::V>2J *~ ">2!2| !9| !| I͆ A!L͚ &\}E͆ &AG:;V2;V͉_!2| ! | !B͗C͝| :;V 5 D͆ &!;VA˦ˮê!2| !| !B?͝| :;V! g! GeneratioProcedure foENCORE Configuration(VSETUP) ------------------------------------------------------- 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. VSETUP.ASM - Source file B. Type "ACT VSETUP ". This command will generate following file: VSETUP.HEX - Hex format file C. Type "LOAD VSETUP". This command will generate following file: VSETUP.COM - CP/M executable file o!| NONEODD EVEN<D͆ &@G:;V?2;VH!2| !5| !BV<͝| :;V!}@y!y!y!| 1 1.5 2 INVALID> >= x y R͆ &A2Vz<_nf ut##<2J !x_^V!0& l ci [!@R}2:2!͒6 !| ʽ!| !| w!0~ʽ #ñE͆ &A2!͚  !2| !z| !| :! y :͝<<@2:Vy29V !6| ͯ&| !| | !*| !| | !^V~#G~́#l ysW!| | !*| ͋!| ????͢ ͢  ڬ70!| 22ͷ XH    9 ͩ ͻ e ü!~ 5!#_ !&_ !~ʼ5>2M üe ü!~¼4 3 5ü!*_ !~ʼ5!,_ ͍ O:^Vڼyw  ü| ü!~ʇ 4G x 5x!(ʷ !÷ !~ʖ !| 42 Ҩ 5>2!| !| !*| ͍ ͡ F:x G G''''w͍ !^V4:!.| ͍ G:^V< ͡ wG!,!| :^V- 2ɸH G!q B q'=2M !| :` !*| :G!(| !| !^V~5y͡ O#:ʗ >G:?2~ #> :=2  D >^ : @ !| !~ # >< , !| !| !~ # >< P < ~ ʅ ʮ >^ @ !| >2!~ #– !| 2!| >2!~ #¿ â :<2J >2: !| !C| !|    $ >^ @ ' | !x_^VnfRMɯ*>VxVR!>V!nfRut#### ^ ͚ ~ #| _Aچ ҆ ɇ_^#V| ͝!| !| > _ !| >Pbt=%$j CURRENT CHARACTER LENGTH k=%AA j 5 BITS k='AB j 6 BITS k=)AC j 7 BITS k=+AD j 8 BITS k=7$Press "A-D" to select character length or RETURN for main menu.=%$j CURRENT PARITY CHECK k=%AA j NONE k='AB j ODD k=)AC j EVEN k=7$Press "A-C" to select parity check or RETURN for main menu.=%$j CURRENT STOP BITS k=%AA j 1 BIT k='AB j 1.5 BIT k=)AC j 2 BIT k=7$Press "A-C" to select stop bits or RETURN for main menu.='C=*C=-C=0C= 8j ENCORE Configuration Program k=!0Rev X3.094 gG 1983 OSBORNE SOFTWARE TEST ONLY=#!Y=#"A j PRINTER k=#AD j BAUD RATE k=&"B j ARROW KEYS k=&AE j CHARACTER LENGTH k=)"C j FUNCTION KEYS k=)AF j PARITY CHECK k=,AG j STOP BITS k=/AH j PRINTER INITIALIZATION k=7$Press "A - H" to change values or RETURN for previous menu.=$$=$C='$=)$=&" j CURRENT PRINTER INITIALIZATION k=&$j CURRENT PRINTER k=&?A j STANDARD SERIAL k=(?B j ETX/ACK (QUME) k=*?C j XON/XOFF (DIABLO) k=,?D j CENTRONICS k=7$Press "A-D" to select printer or RETURN for main menu.=4$Enter hexadecimal values (ie. 08)=5$Use arrow keys to position cursor=7$Press "X" to delete a byte or RETURN for main menu.='$ ='$='$=%$j CURRENT BAUD RATE k=%AA j 50 k=&AB j 75 k='AC j 110 k=(AD j 134.5 k=)AE j 150 k=*AF j 200 k=+AG j 300 k=,AH j 600 k=-AI j 1200 k=.AJ j 1800 k=/AK j 2000 k=0AL j 2400 k=1AM j 3600 k=2AN j 4800 k=3AO j 7200 k=4AP j 9600 k=5AQ j 19200 k=7$Press "A-Q" to select baud rate or RETURN for main menu.=&$=#$j CURRENT FUNCTION KEYS k=7$Press "0-9" to program keys or RETURN for main menu.=7$TPress the escape key twice to terminate input.=/&=#@=/ Y=7$Press the escape key twice to terminate input.=/&=#Cbau character places remainingSTANDARD SERIAL ETX/ACK (QUME) XON/XOFF (DIABLO)CENTRONICS WORDSTARCP/M : H, jkjkjk =($A j GET SYSTEM FROM DRIVE A k=*$B j GET SYSTEM FROM DRIVE B k=,$M j GET SYSTEM FROM MEMORY k=7$TPress A, B, M, or RETURN to exit to CP/M.=($A j SAVE SYSTEM ON DRIVE A k=*$B j SAVE SYSTEM ON DRIVE B k=,$M j SAVE SYSTEM IN MEMORY k=.$R j RETURN TO MAIN MENU k=7$Press A, B, M, R, or RETURN to exit to CP/M.=7$Put SOURCE diskette in drive j k then press RETURN.=7$Put DESTINATION diskette in drive j k then press RETURN.=4$READING SYSTEMY=4$WRITING SYSTEMY=4$Can only set up OSBORNE disks=4$Insert an Osborne disk and retry.=4$j READ ERROR k on source diskette.=4$j WRITE ERROR k on destination diskette.=4$j WRITE PROTECTED k on destination diskette.=4$No SYSTEM in the diskette.=4$INCORRECT SOURCE version.=7$Press ESC to exit to CP/M or any other key to retry.YT  H 0z$$6oz 7o 50 75 110 134.5150 200 300 600 1200 1800 2000 2400 3600 4800 7200 9600 19200 j GET SYSTEM FROM DRIVE B k=,$M j GET SYSTEM FROM MEMORY k=7$TPress A, B, M, or RETURN to exit to CP/M.=($A j SAVE SYSTEM ON DRIVE A k=*$B j SAVE SYSTEM ON DRIVE B k=,$M j SAVE SYSTEM IN MEMORY k=.$R j RETURN TO MAIN MENU k=7$Press A, B, M, R, or RETURN to exit to CP/M.=7$Put SOURCE diskette in drive j k then press RETURN.=7$Put DESTINATION diskette in drive j k then press RETURN.=4$READING SYSTEMY=4$WRITING SYSTEMY=4$Can only set up OSBORNE disks=4$Insert an Osborne disk and retry.=4$j READ ERROR k on source diskette.=4$j WRITE ERROR k on destination diskette.=4$j WRITE PROTECTED k on destination diskette.=4$No SYSTEM in the diskette.=4$INCORRECT SOURCE version.=7$Press ESC to exit to CP/M or any o !"#$%&'